@dsh-workbench/core 0.2.0 → 0.2.2

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 (59) hide show
  1. package/client.js +1429 -607
  2. package/dist/client/client.body.js +1429 -607
  3. package/dist/client/index.js +1430 -608
  4. package/dist/host/index.js +712 -158
  5. package/dist/types/app/client.d.ts +168 -81
  6. package/dist/types/app/layouts/__tests__/async-feedback.test.d.ts +1 -0
  7. package/dist/types/app/layouts/market/use-add-module.d.ts +1 -0
  8. package/dist/types/app/layouts/rightbar/MarketView.d.ts +3 -1
  9. package/dist/types/app/layouts/rightbar/{PanelPluginRows.d.ts → PanelGroupRows.d.ts} +3 -2
  10. package/dist/types/app/layouts/rightbar/PanelRowControls.d.ts +0 -1
  11. package/dist/types/app/layouts/rightbar/__tests__/market-catalog.test.d.ts +1 -0
  12. package/dist/types/app/layouts/rightbar/__tests__/market-dots.test.d.ts +1 -0
  13. package/dist/types/app/layouts/rightbar/__tests__/market-state-rules.test.d.ts +1 -0
  14. package/dist/types/app/layouts/rightbar/__tests__/panel-dismiss.test.d.ts +1 -0
  15. package/dist/types/app/layouts/rightbar/__tests__/panel-drag-target.test.d.ts +1 -0
  16. package/dist/types/app/layouts/rightbar/__tests__/panel-write.test.d.ts +1 -0
  17. package/dist/types/app/layouts/rightbar/board-selection.d.ts +9 -0
  18. package/dist/types/app/layouts/rightbar/dsh-borrow.d.ts +15 -0
  19. package/dist/types/app/layouts/rightbar/dsh-borrow.test.d.ts +1 -0
  20. package/dist/types/app/layouts/rightbar/dsh-surface.d.ts +11 -0
  21. package/dist/types/app/layouts/rightbar/dsh-surface.test.d.ts +1 -0
  22. package/dist/types/app/layouts/rightbar/market-installed-mock.d.ts +9 -0
  23. package/dist/types/app/layouts/rightbar/market-mock-types.d.ts +58 -0
  24. package/dist/types/app/layouts/rightbar/market-mock.d.ts +2 -48
  25. package/dist/types/app/layouts/rightbar/market-row-types.d.ts +4 -2
  26. package/dist/types/app/layouts/rightbar/market-rows.d.ts +9 -22
  27. package/dist/types/app/layouts/rightbar/market-section-icon.d.ts +1 -1
  28. package/dist/types/app/layouts/rightbar/market-shared-rows.d.ts +21 -0
  29. package/dist/types/app/layouts/rightbar/panel-dismiss.d.ts +2 -0
  30. package/dist/types/app/layouts/rightbar/panel-mock.d.ts +1 -1
  31. package/dist/types/app/layouts/rightbar/panel-write.d.ts +15 -0
  32. package/dist/types/app/layouts/rightbar/use-drag-listeners.d.ts +6 -0
  33. package/dist/types/app/layouts/sidebar/__tests__/session-row-ui.test.d.ts +1 -0
  34. package/dist/types/app/units/registry.d.ts +4 -1
  35. package/dist/types/modules/panels/__tests__/diy-harness.d.ts +19 -0
  36. package/dist/types/modules/panels/__tests__/diy-report.test.d.ts +1 -0
  37. package/dist/types/modules/panels/__tests__/diy-tools-health.test.d.ts +1 -0
  38. package/dist/types/modules/panels/__tests__/diy-tools-panel.test.d.ts +1 -0
  39. package/dist/types/modules/panels/__tests__/market-tools-harness.d.ts +42 -0
  40. package/dist/types/modules/panels/__tests__/market-workbench-update.test.d.ts +1 -0
  41. package/dist/types/modules/panels/model/config.d.ts +4 -3
  42. package/dist/types/modules/panels/model/diy-report.d.ts +63 -0
  43. package/dist/types/shared/api/host/__tests__/approval-note-injection.test.d.ts +1 -0
  44. package/dist/types/shared/api/host/__tests__/panel-state-route.test.d.ts +1 -0
  45. package/dist/types/shared/api/host/bundle-routes.d.ts +1 -0
  46. package/dist/types/shared/api/host/installed-module.d.ts +2 -0
  47. package/dist/types/shared/api/host/mount-units.d.ts +1 -0
  48. package/dist/types/shared/api/host/release.d.ts +6 -0
  49. package/dist/types/shared/api/host/unit-registry.d.ts +6 -0
  50. package/dist/types/shared/api/unit-manifests.d.ts +1 -0
  51. package/dist/types/shared/components/PanelFoot.d.ts +1 -1
  52. package/dist/types/shared/hooks/panel-state-report.d.ts +13 -0
  53. package/dist/types/shared/hooks/panel-state-report.test.d.ts +1 -0
  54. package/docs/HANDOFF.md +11 -0
  55. package/package.json +2 -2
  56. package/preset/diy.patch.yml +5 -26
  57. package/skills/workbench-module-diy/REVIEW.md +22 -0
  58. package/skills/workbench-module-diy/SKILL.md +3 -1
  59. 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",
@@ -556,15 +561,19 @@ window.__ModuleLoader__.load({
556
561
  //#endregion
557
562
  //#region ../shared/dist/config/constants.js
558
563
  var PLUGIN_ID = "@dsh-workbench/core";
564
+ var RELEASE_SIBLINGS = ["@dsh-workbench/shared", "@dsh-workbench/module-tools"];
559
565
  var API_PREFIX = "/workbench/api";
560
566
  var PREFS_PREFIX = `${API_PREFIX}/prefs`;
561
567
  var EVENTS_PATH = "/workbench/events";
562
568
  var ACTIONS_PREFIX = `${API_PREFIX}/actions`;
563
569
  var PROVISION_PREFIX = `${API_PREFIX}/provision`;
570
+ var PANEL_STATE_PATH = "panel-state";
571
+ var PANEL_STATE_PREFIX = `${API_PREFIX}/${PANEL_STATE_PATH}`;
564
572
  var OPENCLI_PIN = "1.8.8";
565
573
  var CODING_ISSUES_SERVICE = "workbenchCodingIssues";
566
574
  var PANELS_SERVICE = "workbenchPanels";
567
575
  var UNITS_SERVICE = "workbenchUnits";
576
+ var PANEL_STATE_SERVICE = "workbenchPanelState";
568
577
  var OPENCLI_TIMEOUT_MS = 12e4;
569
578
  var WARM_TIMEOUT_MS = 2e4;
570
579
  var INSTALL_TIMEOUT_MS = 3e5;
@@ -684,7 +693,9 @@ window.__ModuleLoader__.load({
684
693
  return { reason: errorReasonOf(error) };
685
694
  }
686
695
  componentDidCatch(error) {
687
- console.error(`[dsh-workbench] 模块 ${this.props.unit} 渲染失败:${errorReasonOf(error)}`, error);
696
+ const reason = errorReasonOf(error);
697
+ console.error(`[dsh-workbench] 模块 ${this.props.unit} 渲染失败:${reason}`, error);
698
+ this.props.onFailure?.(reason);
688
699
  }
689
700
  componentDidUpdate(previous) {
690
701
  if (previous.resetKey !== this.props.resetKey && this.state.reason !== null) this.setState({ reason: null });
@@ -1227,6 +1238,8 @@ window.__ModuleLoader__.load({
1227
1238
  "project.none": "No project",
1228
1239
  "project.empty": "No projects yet. Use “Add project” below.",
1229
1240
  "project.add": "Add project…",
1241
+ "project.add.busy": "Creating the workspace…",
1242
+ "project.add.failed": "Creating the workspace failed",
1230
1243
  "project.search.label": "Search workspaces",
1231
1244
  "project.search.placeholder": "Search workspaces (folder / name / path)",
1232
1245
  "project.search.empty": "No workspace matches “{query}”.",
@@ -1260,18 +1273,22 @@ window.__ModuleLoader__.load({
1260
1273
  "time.hours": "{n} h ago",
1261
1274
  "time.days": "{n} d ago",
1262
1275
  "panels.title": "Panel modules",
1263
- "panels.market.defaultNote": "This default covers every workspace that has not changed this row; ones that have keep their own choice.",
1264
- "panels.market.changedBy": "{count} workspaces have already changed this row",
1265
- "panels.market.defaultLabel": "On by default in all workspaces",
1266
- "panels.followGlobal": "Default",
1267
- "panels.followGlobalHint": "This row follows the default board (the switch shows that state). Clicking the switch makes it this project's own choice.",
1276
+ "panels.groupBoardless": "No-board modules",
1277
+ "panels.groupPlugins": "opencli plugins",
1278
+ "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.",
1279
+ "panels.market.defaultLabel": "On by default everywhere",
1280
+ "panels.market.defaultLocked": "Unusable right now — update or uninstall it first",
1268
1281
  "panels.followAll": "Restore the default everywhere",
1282
+ "panels.followAllConfirmTitle": "Restore the default everywhere?",
1283
+ "panels.followAllConfirmDetail": "Every row changed in this workspace goes back to following the global default.",
1284
+ "panels.followAllConfirmAck": "I understand: to set them up for this workspace again, I will have to change them row by row.",
1285
+ "panels.followAllConfirmYes": "Restore",
1286
+ "panels.followAllConfirmNo": "Cancel",
1269
1287
  "panels.enabled": "enabled in this project",
1270
1288
  "panels.disabled": "not enabled in this project",
1271
1289
  "panels.choose": "Choose modules",
1272
1290
  "panels.buildModule": "Build a module",
1273
1291
  "panels.failed": "Could not save the change. Try again.",
1274
- "panels.hintEffect": "Disabling = the agent cannot reach that data",
1275
1292
  "panels.dragHint": "Drag to reorder",
1276
1293
  "panels.unknownStep": "No suite provides this view",
1277
1294
  "panels.labelWithHint": "{label} ({hint})",
@@ -1284,9 +1301,10 @@ window.__ModuleLoader__.load({
1284
1301
  "panels.browseMarket": "Browse the module market",
1285
1302
  "panels.noneInstalled": "None of these modules has its plugin installed yet",
1286
1303
  "panels.noneInstalledHint": "Once installed they come back here, and you pick which go on the panel.",
1287
- "panels.rowPlugin": "Plugin",
1288
1304
  "panels.market.installed": "installed",
1289
- "panels.market.outdated": "needs update",
1305
+ "panels.market.notActive": "not active",
1306
+ "panels.market.notUsable": "unusable",
1307
+ "panels.market.broken": "broken",
1290
1308
  "panels.market.hasNew": "New version",
1291
1309
  "panels.market.missing": "not installed",
1292
1310
  "panels.market.unchecked": "unknown",
@@ -1316,16 +1334,17 @@ window.__ModuleLoader__.load({
1316
1334
  "panels.market.confirmNo": "Cancel",
1317
1335
  "panels.market.failed": "Failed: {reason}",
1318
1336
  "panels.market.needEnv": "Set {env} in the terminal that started the workbench first",
1337
+ "panels.market.needCommands": "Missing commands: {commands}",
1338
+ "panels.market.localMark": "local",
1339
+ "panels.market.localHint": "This is your machine’s own copy (not taken from the registry).",
1319
1340
  "panels.market.noSource": "This module declares no install method — install it yourself",
1320
1341
  "panels.market.badSource": "The install method is incomplete — install it yourself",
1321
1342
  "panels.market.empty": "No modules available",
1322
- "panels.market.sectionLocal": "Local modules",
1323
- "panels.market.sectionUnlisted": "Not from the market",
1324
1343
  "panels.market.sectionPlugins": "Installed opencli plugins",
1325
1344
  "panels.market.moduleOutdated": "update available",
1326
- "panels.market.moduleRefused": "This module was built for an older version of the workbench, so it does not work here. Update it, or uninstall.",
1345
+ "panels.market.moduleRefused": "This module does not match this workbench, so it cannot be used for now.",
1327
1346
  "panels.market.moduleRefusedDetail": "Why it cannot be used: {reason}",
1328
- "panels.market.moduleRestartHint": "installed but not active — restart dsh once to bring it up",
1347
+ "panels.market.moduleRestartHint": "restart dsh once to bring it up",
1329
1348
  "panels.market.workbenchName": "Workbench",
1330
1349
  "panels.market.workbenchLocal": "This is the copy from your working repository; it does not come from the registry.",
1331
1350
  "panels.market.pluginKeptInUse": "Files kept for now: {names} still uses it.",
@@ -1417,7 +1436,7 @@ window.__ModuleLoader__.load({
1417
1436
  "panels.market.add.registryPnpm": "pnpm's own registry",
1418
1437
  "panels.market.add.check": "Check",
1419
1438
  "panels.market.add.checking": "Checking…",
1420
- "panels.market.add.classifying": "Working out what it is…",
1439
+ "panels.market.add.classifying": "Checking…",
1421
1440
  "panels.market.add.change": "Edit",
1422
1441
  "panels.market.add.previewTitle": "About to install",
1423
1442
  "panels.market.add.fieldName": "Package",
@@ -1564,6 +1583,8 @@ window.__ModuleLoader__.load({
1564
1583
  "project.none": "未选择项目",
1565
1584
  "project.empty": "还没有项目。用下面的「添加项目」选一个目录。",
1566
1585
  "project.add": "添加项目…",
1586
+ "project.add.busy": "正在新建工作区…",
1587
+ "project.add.failed": "新建工作区没成功",
1567
1588
  "project.search.label": "搜索工作区",
1568
1589
  "project.search.placeholder": "搜索工作区(目录名 / 中文名 / 路径)",
1569
1590
  "project.search.empty": "没有匹配「{query}」的工作区。",
@@ -1597,18 +1618,22 @@ window.__ModuleLoader__.load({
1597
1618
  "time.hours": "{n} 小时前",
1598
1619
  "time.days": "{n} 天前",
1599
1620
  "panels.title": "面板模块",
1600
- "panels.market.defaultNote": "这份默认给所有没在这一行改过的工作区;改过的保持自己的选择。",
1601
- "panels.market.changedBy": "{count} 个工作区已在这一行改过",
1602
- "panels.market.defaultLabel": "开启后所有工作区默认启用",
1603
- "panels.followGlobal": "默认",
1604
- "panels.followGlobalHint": "这一行跟着默认板走(右边那颗开关显示的就是默认的状态)。点一下开关 = 改成这个项目自己定。",
1621
+ "panels.groupBoardless": "无看板模块",
1622
+ "panels.groupPlugins": "opencli 插件",
1623
+ "panels.market.defaultHint": "打开后所有工作区默认开启,也可在工作区面板配置中单独关闭",
1624
+ "panels.market.defaultLabel": "全局默认开启",
1625
+ "panels.market.defaultLocked": "这份现在用不了,先更新或卸载",
1605
1626
  "panels.followAll": "全部恢复默认",
1627
+ "panels.followAllConfirmTitle": "全部恢复默认?",
1628
+ "panels.followAllConfirmDetail": "这个工作区里改过的每一行都会清掉,之后都跟随全局。",
1629
+ "panels.followAllConfirmAck": "我明白:清掉之后,想再按这个工作区配,得一行一行重新改。",
1630
+ "panels.followAllConfirmYes": "恢复默认",
1631
+ "panels.followAllConfirmNo": "取消",
1606
1632
  "panels.enabled": "这个项目已启用",
1607
1633
  "panels.disabled": "这个项目未启用",
1608
1634
  "panels.choose": "选择模块",
1609
1635
  "panels.buildModule": "造一个模块",
1610
1636
  "panels.failed": "改配置失败了,再试一次。",
1611
- "panels.hintEffect": "停用 = agent 拿不到相关数据",
1612
1637
  "panels.dragHint": "拖动调整顺序",
1613
1638
  "panels.unknownStep": "这一层没有套件提供",
1614
1639
  "panels.labelWithHint": "{label}({hint})",
@@ -1621,9 +1646,10 @@ window.__ModuleLoader__.load({
1621
1646
  "panels.browseMarket": "浏览模块市场",
1622
1647
  "panels.noneInstalled": "这些模块要的插件都还没装",
1623
1648
  "panels.noneInstalledHint": "装好之后它们会回到这里,再由你决定放哪几个上板。",
1624
- "panels.rowPlugin": "插件",
1625
1649
  "panels.market.installed": "已安装",
1626
- "panels.market.outdated": "要更新",
1650
+ "panels.market.notActive": "未生效",
1651
+ "panels.market.notUsable": "不可用",
1652
+ "panels.market.broken": "装坏了",
1627
1653
  "panels.market.hasNew": "有新版本",
1628
1654
  "panels.market.missing": "未装",
1629
1655
  "panels.market.unchecked": "状态未知",
@@ -1653,16 +1679,17 @@ window.__ModuleLoader__.load({
1653
1679
  "panels.market.confirmNo": "取消",
1654
1680
  "panels.market.failed": "没成功:{reason}",
1655
1681
  "panels.market.needEnv": "先在启动工作台的终端里设 {env}",
1682
+ "panels.market.needCommands": "缺这几条命令:{commands}",
1683
+ "panels.market.localMark": "本地",
1684
+ "panels.market.localHint": "本机那份(不从源上取)。",
1656
1685
  "panels.market.noSource": "这个模块没声明怎么装,只能自己动手",
1657
1686
  "panels.market.badSource": "安装方式没写全,只能自己动手",
1658
1687
  "panels.market.empty": "暂无可用模块",
1659
- "panels.market.sectionLocal": "本地模块",
1660
- "panels.market.sectionUnlisted": "不是从市场装的",
1661
1688
  "panels.market.sectionPlugins": "已安装 opencli 插件",
1662
1689
  "panels.market.moduleOutdated": "有新版",
1663
- "panels.market.moduleRefused": "这个模块是给旧版本的工作台写的,现在用不了。更新它,或者卸载。",
1690
+ "panels.market.moduleRefused": "模块版本与工作台不匹配,暂时无法使用",
1664
1691
  "panels.market.moduleRefusedDetail": "装不上的原因:{reason}",
1665
- "panels.market.moduleRestartHint": "装好了但还没生效 —— 重启一次 dsh 就会出来",
1692
+ "panels.market.moduleRestartHint": "重启后生效",
1666
1693
  "panels.market.workbenchName": "工作台",
1667
1694
  "panels.market.workbenchLocal": "这份是本仓正在开发的那一份,不从源上取。",
1668
1695
  "panels.market.pluginKeptInUse": "文件先留着:{names} 还要用它。",
@@ -1754,7 +1781,7 @@ window.__ModuleLoader__.load({
1754
1781
  "panels.market.add.registryPnpm": "pnpm 自己配的源",
1755
1782
  "panels.market.add.check": "预检",
1756
1783
  "panels.market.add.checking": "正在预检…",
1757
- "panels.market.add.classifying": "判定中…",
1784
+ "panels.market.add.classifying": "检测中…",
1758
1785
  "panels.market.add.change": "改一下",
1759
1786
  "panels.market.add.previewTitle": "将要安装",
1760
1787
  "panels.market.add.fieldName": "包名",
@@ -1978,6 +2005,203 @@ window.__ModuleLoader__.load({
1978
2005
  releaseInMs: left
1979
2006
  };
1980
2007
  }
2008
+ var PANEL_STATE_CRASH_WINDOW_MS = 6e5;
2009
+ var PANEL_STATE_MAX_TEXT = 2e3;
2010
+ var PHASES = [
2011
+ "idle",
2012
+ "loading",
2013
+ "ready",
2014
+ "error"
2015
+ ];
2016
+ function asRecord(value) {
2017
+ return typeof value === "object" && value !== null ? value : void 0;
2018
+ }
2019
+ function textOf(value, max) {
2020
+ if (typeof value !== "string") return "";
2021
+ const trimmed = value.trim();
2022
+ return trimmed.length > max ? trimmed.slice(0, max) : trimmed;
2023
+ }
2024
+ function atOf(value) {
2025
+ if (typeof value !== "number" || !Number.isFinite(value)) return null;
2026
+ if (value < 0) return null;
2027
+ return Math.trunc(value);
2028
+ }
2029
+ function errorOf(raw) {
2030
+ const record = asRecord(raw);
2031
+ if (record === void 0) return void 0;
2032
+ const code = textOf(record["code"], 120);
2033
+ const message = textOf(record["message"], PANEL_STATE_MAX_TEXT);
2034
+ if (code === "" && message === "") return void 0;
2035
+ return {
2036
+ code: code === "" ? "unknown" : code,
2037
+ message
2038
+ };
2039
+ }
2040
+ function parseCardsReport(payload) {
2041
+ const record = asRecord(payload);
2042
+ if (record === void 0) return {
2043
+ ok: false,
2044
+ message: "请求体要是一个对象"
2045
+ };
2046
+ const workspace = textOf(record["workspace"], PANEL_STATE_MAX_TEXT);
2047
+ if (workspace === "") return {
2048
+ ok: false,
2049
+ message: "workspace 不能是空的 —— 面板按工作区存"
2050
+ };
2051
+ const raw = record["cards"];
2052
+ if (!Array.isArray(raw)) return {
2053
+ ok: false,
2054
+ message: "cards 要是一个数组"
2055
+ };
2056
+ const cards = [];
2057
+ for (const item of raw.slice(0, 32)) {
2058
+ const card = asRecord(item);
2059
+ if (card === void 0) continue;
2060
+ const unit = textOf(card["unit"], 200);
2061
+ const route = textOf(card["route"], 400);
2062
+ const phase = textOf(card["phase"], 20);
2063
+ const at = atOf(card["at"]);
2064
+ if (unit === "" || route === "" || at === null || !PHASES.includes(phase)) continue;
2065
+ const error = errorOf(card["error"]);
2066
+ cards.push({
2067
+ unit,
2068
+ route,
2069
+ phase,
2070
+ at,
2071
+ ...error === void 0 ? {} : { error }
2072
+ });
2073
+ }
2074
+ if (cards.length === 0) return {
2075
+ ok: false,
2076
+ message: "cards 里没有一条能认的(unit / route / phase / at 都要有)"
2077
+ };
2078
+ return {
2079
+ ok: true,
2080
+ value: {
2081
+ workspace,
2082
+ cards
2083
+ }
2084
+ };
2085
+ }
2086
+ function parseCrashReport(payload) {
2087
+ const record = asRecord(payload);
2088
+ if (record === void 0) return {
2089
+ ok: false,
2090
+ message: "请求体要是一个对象"
2091
+ };
2092
+ const workspace = textOf(record["workspace"], PANEL_STATE_MAX_TEXT);
2093
+ const unit = textOf(record["unit"], 200);
2094
+ const reason = textOf(record["reason"], PANEL_STATE_MAX_TEXT);
2095
+ if (workspace === "") return {
2096
+ ok: false,
2097
+ message: "workspace 不能是空的"
2098
+ };
2099
+ if (unit === "") return {
2100
+ ok: false,
2101
+ message: "unit 不能是空的"
2102
+ };
2103
+ if (reason === "") return {
2104
+ ok: false,
2105
+ message: "reason 不能是空的(没有原因的崩溃没法查)"
2106
+ };
2107
+ return {
2108
+ ok: true,
2109
+ value: {
2110
+ workspace,
2111
+ unit,
2112
+ reason,
2113
+ at: atOf(record["at"]) ?? Date.now()
2114
+ }
2115
+ };
2116
+ }
2117
+ function createPanelStateStore() {
2118
+ const workspaces = /* @__PURE__ */ new Map();
2119
+ function trim(entry, max) {
2120
+ while (entry.size > max) {
2121
+ const oldest = entry.keys().next();
2122
+ if (oldest.done === true) return;
2123
+ entry.delete(oldest.value);
2124
+ }
2125
+ }
2126
+ function workspaceEntryOf(workspace) {
2127
+ const existing = workspaces.get(workspace);
2128
+ if (existing !== void 0) return existing;
2129
+ const created = {
2130
+ at: 0,
2131
+ units: /* @__PURE__ */ new Map()
2132
+ };
2133
+ workspaces.set(workspace, created);
2134
+ trim(workspaces, 64);
2135
+ return created;
2136
+ }
2137
+ function unitEntryOf(entry, unit) {
2138
+ const existing = entry.units.get(unit);
2139
+ if (existing !== void 0) return existing;
2140
+ const created = {
2141
+ at: 0,
2142
+ cards: /* @__PURE__ */ new Map()
2143
+ };
2144
+ entry.units.set(unit, created);
2145
+ return created;
2146
+ }
2147
+ return {
2148
+ cards(report) {
2149
+ const entry = workspaceEntryOf(report.workspace);
2150
+ for (const card of report.cards) {
2151
+ const unit = unitEntryOf(entry, card.unit);
2152
+ unit.cards.delete(card.route);
2153
+ unit.cards.set(card.route, card);
2154
+ trim(unit.cards, 12);
2155
+ if (card.at > unit.at) unit.at = card.at;
2156
+ if (card.at > entry.at) entry.at = card.at;
2157
+ }
2158
+ },
2159
+ crash(report) {
2160
+ const entry = workspaceEntryOf(report.workspace);
2161
+ const unit = unitEntryOf(entry, report.unit);
2162
+ const previous = unit.crash;
2163
+ const counted = previous !== void 0 && previous.reason === report.reason && report.at >= previous.at && report.at - previous.at <= 6e5;
2164
+ unit.crash = {
2165
+ unit: report.unit,
2166
+ reason: report.reason,
2167
+ at: report.at,
2168
+ count: counted ? previous.count + 1 : 1
2169
+ };
2170
+ if (report.at > unit.at) unit.at = report.at;
2171
+ if (report.at > entry.at) entry.at = report.at;
2172
+ },
2173
+ snapshot(workspace) {
2174
+ if (workspace === null) return {
2175
+ workspace: null,
2176
+ at: 0,
2177
+ units: []
2178
+ };
2179
+ const entry = workspaces.get(workspace);
2180
+ if (entry === void 0) return {
2181
+ workspace,
2182
+ at: 0,
2183
+ units: []
2184
+ };
2185
+ const units = [...entry.units.entries()].map(([unit, one]) => {
2186
+ const cards = [...one.cards.values()].sort((a, b) => a.route.localeCompare(b.route));
2187
+ const okAt = cards.reduce((best, card) => card.phase === "ready" && (best === null || card.at > best) ? card.at : best, null);
2188
+ return {
2189
+ unit,
2190
+ at: one.at,
2191
+ okAt,
2192
+ cards,
2193
+ ...one.crash === void 0 ? {} : { crash: one.crash }
2194
+ };
2195
+ });
2196
+ units.sort((a, b) => b.at - a.at || a.unit.localeCompare(b.unit));
2197
+ return {
2198
+ workspace,
2199
+ at: entry.at,
2200
+ units
2201
+ };
2202
+ }
2203
+ };
2204
+ }
1981
2205
  //#endregion
1982
2206
  //#region ../shared/dist/lib/text.js
1983
2207
  function quoteShellArg(value) {
@@ -2063,10 +2287,19 @@ window.__ModuleLoader__.load({
2063
2287
  PANELS_SERVICE: () => PANELS_SERVICE,
2064
2288
  PANEL_LIST_LIMIT: () => 50,
2065
2289
  PANEL_POLL_MS: () => PANEL_POLL_MS,
2290
+ PANEL_STATE_CRASH_WINDOW_MS: () => PANEL_STATE_CRASH_WINDOW_MS,
2291
+ PANEL_STATE_MAX_CARDS: () => 12,
2292
+ PANEL_STATE_MAX_REPORTS: () => 32,
2293
+ PANEL_STATE_MAX_TEXT: () => PANEL_STATE_MAX_TEXT,
2294
+ PANEL_STATE_MAX_UNITS: () => 64,
2295
+ PANEL_STATE_PATH: () => PANEL_STATE_PATH,
2296
+ PANEL_STATE_PREFIX: () => PANEL_STATE_PREFIX,
2297
+ PANEL_STATE_SERVICE: () => PANEL_STATE_SERVICE,
2066
2298
  PLUGIN_ID: () => PLUGIN_ID,
2067
2299
  PREFS_PREFIX: () => PREFS_PREFIX,
2068
2300
  PROBE_TTL_MS: () => PROBE_TTL_MS,
2069
2301
  PROVISION_PREFIX: () => PROVISION_PREFIX,
2302
+ RELEASE_SIBLINGS: () => RELEASE_SIBLINGS,
2070
2303
  RIGHTBAR_FULLSCREEN_WIDTH: () => 768,
2071
2304
  Row: () => Row,
2072
2305
  Rows: () => Rows,
@@ -2093,6 +2326,7 @@ window.__ModuleLoader__.load({
2093
2326
  blockerPending: () => blockerPending,
2094
2327
  buildMarker: () => buildMarker,
2095
2328
  createFactChannel: () => createFactChannel,
2329
+ createPanelStateStore: () => createPanelStateStore,
2096
2330
  cx: () => cx,
2097
2331
  declarationProblemsOf: () => declarationProblemsOf,
2098
2332
  decodeRef: () => decodeRef,
@@ -2104,6 +2338,7 @@ window.__ModuleLoader__.load({
2104
2338
  factOfRoute: () => factOfRoute,
2105
2339
  gateOf: () => gateOf,
2106
2340
  h: () => h,
2341
+ hasEnvSupply: () => hasEnvSupply,
2107
2342
  holdBusy: () => holdBusy,
2108
2343
  isFactScope: () => isFactScope,
2109
2344
  longTaskDot: () => longTaskDot,
@@ -2112,6 +2347,8 @@ window.__ModuleLoader__.load({
2112
2347
  markerBody: () => markerBody,
2113
2348
  mergeMessages: () => mergeMessages,
2114
2349
  mergeMessagesSkipping: () => mergeMessagesSkipping,
2350
+ parseCardsReport: () => parseCardsReport,
2351
+ parseCrashReport: () => parseCrashReport,
2115
2352
  parseFactFrame: () => parseFactFrame,
2116
2353
  parseJsonLoose: () => parseJsonLoose,
2117
2354
  parseLocalTimestamp: () => parseLocalTimestamp,
@@ -2485,6 +2722,197 @@ window.__ModuleLoader__.load({
2485
2722
  return pending.filter((unit) => active.has(unit) || fresh.includes(unit));
2486
2723
  }
2487
2724
  //#endregion
2725
+ //#region src/app/layouts/rightbar/market-installed-mock.ts
2726
+ function installedMocks(input) {
2727
+ const { id, found, mine, probe } = input;
2728
+ return [
2729
+ {
2730
+ id: "no-supply",
2731
+ label: "没有环境依赖的模块(供给是基座命令那种):市场里有它这一行",
2732
+ manifests: [found],
2733
+ capabilities: probe(id, "ok"),
2734
+ installed: [{
2735
+ unit: id,
2736
+ pkg: "@dsh-workbench/module-one",
2737
+ installed: "0.1.2"
2738
+ }],
2739
+ expect: {
2740
+ rows: 1,
2741
+ state: "installed",
2742
+ actions: ["uninstall"],
2743
+ installed: 0,
2744
+ shared: 0
2745
+ }
2746
+ },
2747
+ {
2748
+ id: "no-card",
2749
+ label: "没有卡片的模块(只有基座命令那种):市场里有它这一行,有版本、有「更新」",
2750
+ manifests: [{
2751
+ ...found,
2752
+ card: null
2753
+ }],
2754
+ capabilities: probe(id, "ok"),
2755
+ updates: { [id]: {
2756
+ installed: "0.1.2",
2757
+ latest: "0.2.0"
2758
+ } },
2759
+ installed: [{
2760
+ unit: id,
2761
+ pkg: "@dsh-workbench/module-one",
2762
+ installed: "0.1.2"
2763
+ }],
2764
+ expect: {
2765
+ rows: 1,
2766
+ state: "outdated",
2767
+ actions: ["update-bundle", "uninstall"],
2768
+ version: {
2769
+ installed: "0.1.2",
2770
+ latest: "0.2.0"
2771
+ },
2772
+ installed: 0,
2773
+ shared: 0
2774
+ }
2775
+ },
2776
+ {
2777
+ id: "no-env-installed",
2778
+ label: "本机装着、又没有依赖要探(DIY 本地那份那种):写「已安装」,不是「状态未知」",
2779
+ manifests: [{
2780
+ ...found,
2781
+ env: void 0
2782
+ }],
2783
+ capabilities: {},
2784
+ updates: { [id]: { installed: "0.1.2" } },
2785
+ installed: [{
2786
+ unit: id,
2787
+ pkg: "@dsh-workbench/module-one",
2788
+ installed: "0.1.2"
2789
+ }],
2790
+ expect: {
2791
+ rows: 1,
2792
+ state: "installed",
2793
+ actions: ["uninstall"],
2794
+ version: { installed: "0.1.2" },
2795
+ installed: 0
2796
+ }
2797
+ },
2798
+ {
2799
+ id: "local-no-update",
2800
+ label: "本机那份(link: 装的):有「本地」标记、不给「更新」",
2801
+ manifests: [mine],
2802
+ capabilities: probe(id, "ok", { plugins: [{
2803
+ name: "fixture",
2804
+ status: "ok",
2805
+ missing: []
2806
+ }] }),
2807
+ updates: { [id]: {
2808
+ installed: "0.1.0",
2809
+ local: true
2810
+ } },
2811
+ installed: [{
2812
+ unit: id,
2813
+ pkg: "@dsh-workbench/module-one",
2814
+ installed: "0.1.0",
2815
+ local: true
2816
+ }],
2817
+ expect: {
2818
+ rows: 1,
2819
+ state: "installed",
2820
+ actions: ["uninstall"],
2821
+ local: true,
2822
+ version: { installed: "0.1.0" },
2823
+ installed: 0
2824
+ }
2825
+ },
2826
+ {
2827
+ id: "installed-refused",
2828
+ label: "本机装了,但宿主不认它的声明(行上说得出理由)",
2829
+ manifests: [],
2830
+ capabilities: {},
2831
+ installed: [{
2832
+ unit: id,
2833
+ pkg: "@dsh-workbench/module-one",
2834
+ installed: "0.1.2",
2835
+ refused: ["dsh.workbench 缺 apiVersion —— 协议从 v1 起,写 \"apiVersion\": 1"]
2836
+ }],
2837
+ expect: {
2838
+ rows: 0,
2839
+ installed: 1,
2840
+ installedState: "unusable",
2841
+ installedActions: ["remove-bundle"],
2842
+ installedNote: true
2843
+ }
2844
+ },
2845
+ {
2846
+ id: "installed-pending",
2847
+ label: "本机装了、宿主还没加载它(重启一次就会出来)",
2848
+ manifests: [],
2849
+ capabilities: {},
2850
+ installed: [{
2851
+ unit: id,
2852
+ pkg: "@dsh-workbench/module-one",
2853
+ installed: "0.1.2"
2854
+ }],
2855
+ expect: {
2856
+ rows: 0,
2857
+ installed: 1,
2858
+ installedState: "inactive",
2859
+ installedActions: ["remove-bundle"],
2860
+ installedHint: "panels.market.moduleRestartHint"
2861
+ }
2862
+ },
2863
+ {
2864
+ id: "installed-pending-update",
2865
+ label: "本机装了、还没加载 + 源上有新版(给「更新」,也说明要重启)",
2866
+ manifests: [],
2867
+ capabilities: {},
2868
+ installed: [{
2869
+ unit: id,
2870
+ pkg: "@dsh-workbench/module-one",
2871
+ installed: "0.1.0",
2872
+ latest: "0.1.2"
2873
+ }],
2874
+ expect: {
2875
+ rows: 0,
2876
+ installed: 1,
2877
+ installedState: "outdated",
2878
+ installedActions: ["update-bundle", "remove-bundle"],
2879
+ installedHint: "panels.market.moduleRestartHint"
2880
+ }
2881
+ },
2882
+ {
2883
+ id: "installed-confirm",
2884
+ label: "卸载本机模块(还没加载的那种:Modal 确认,标题是包名)",
2885
+ manifests: [],
2886
+ capabilities: {},
2887
+ installed: [{
2888
+ unit: id,
2889
+ pkg: "@dsh-workbench/module-one",
2890
+ installed: "0.1.2"
2891
+ }],
2892
+ confirming: id,
2893
+ expect: {
2894
+ rows: 0,
2895
+ installed: 1,
2896
+ installedState: "inactive",
2897
+ installedActions: ["remove-bundle"]
2898
+ }
2899
+ },
2900
+ {
2901
+ id: "first-paint",
2902
+ label: "刚进页面(检测中:能力与本机清单都还没结论)",
2903
+ manifests: [mine],
2904
+ capabilities: null,
2905
+ installedRead: false,
2906
+ loaded: false,
2907
+ expect: {
2908
+ rows: 1,
2909
+ state: "checking",
2910
+ actions: []
2911
+ }
2912
+ }
2913
+ ];
2914
+ }
2915
+ //#endregion
2488
2916
  //#region src/app/layouts/rightbar/market-mock.ts
2489
2917
  function installable(manifest) {
2490
2918
  return {
@@ -2595,7 +3023,8 @@ window.__ModuleLoader__.load({
2595
3023
  expect: {
2596
3024
  rows: 1,
2597
3025
  state: "outdated",
2598
- actions: ["update", "uninstall"]
3026
+ actions: ["update", "uninstall"],
3027
+ noteKey: "panels.market.needCommands"
2599
3028
  }
2600
3029
  },
2601
3030
  {
@@ -2840,120 +3269,49 @@ window.__ModuleLoader__.load({
2840
3269
  actions: ["uninstall"]
2841
3270
  }
2842
3271
  },
3272
+ ...installedMocks({
3273
+ id,
3274
+ found,
3275
+ mine,
3276
+ probe: probe$1
3277
+ }),
2843
3278
  {
2844
- id: "installed-half",
2845
- label: "本机装了模块,但它没有环境依赖(供给那半没有它)",
2846
- manifests: [found],
3279
+ id: "shared-many",
3280
+ label: "三个模块(同一份安装)",
3281
+ manifests: [
3282
+ mine,
3283
+ twin(mine),
3284
+ {
3285
+ ...twin(mine),
3286
+ id: `${mine.id}-c`
3287
+ }
3288
+ ],
3289
+ capabilities: {
3290
+ ...probe$1(id, "ok"),
3291
+ ...probe$1(secondId, "ok"),
3292
+ ...probe$1(`${mine.id}-c`, "ok")
3293
+ },
3294
+ expect: {
3295
+ rows: 3,
3296
+ state: "installed",
3297
+ actions: ["uninstall"]
3298
+ }
3299
+ },
3300
+ {
3301
+ id: "plugin-outdated",
3302
+ label: "用户装的 opencli 插件:有新版(给更新 / 卸载)",
3303
+ manifests: [],
2847
3304
  capabilities: {},
2848
- installed: [{
2849
- unit: id,
2850
- pkg: "@dsh-workbench/module-one",
2851
- installed: "0.1.2"
3305
+ plugins: [{
3306
+ pkg: "opencli-plugin-cmdb",
3307
+ name: "cmdb",
3308
+ installed: "1.0.24",
3309
+ latest: "1.0.25"
2852
3310
  }],
2853
3311
  expect: {
2854
3312
  rows: 0,
2855
- installed: 1,
2856
- installedActions: ["remove-bundle"]
2857
- }
2858
- },
2859
- {
2860
- id: "installed-half-update",
2861
- label: "本机装了模块 + 源上有新版(给「更新」,装完要重启)",
2862
- manifests: [found],
2863
- capabilities: {},
2864
- installed: [{
2865
- unit: id,
2866
- pkg: "@dsh-workbench/module-one",
2867
- installed: "0.1.0",
2868
- latest: "0.1.2"
2869
- }],
2870
- expect: {
2871
- rows: 0,
2872
- installed: 1,
2873
- installedActions: ["update-bundle", "remove-bundle"]
2874
- }
2875
- },
2876
- {
2877
- id: "installed-client-refused",
2878
- label: "本机装了,但浏览器这半没挂上(拒因由客户端报告)",
2879
- manifests: [found],
2880
- capabilities: {},
2881
- installed: [{
2882
- unit: id,
2883
- pkg: "@dsh-workbench/module-one",
2884
- installed: "0.1.2",
2885
- clientRefused: [`宿主没有担保 unit「${id}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]
2886
- }],
2887
- expect: {
2888
- rows: 0,
2889
- installed: 1,
2890
- installedActions: ["remove-bundle"],
2891
- installedNote: true
2892
- }
2893
- },
2894
- {
2895
- id: "installed-confirm",
2896
- label: "卸载本机模块(Modal 确认,标题带模块名)",
2897
- manifests: [found],
2898
- capabilities: {},
2899
- installed: [{
2900
- unit: id,
2901
- pkg: "@dsh-workbench/module-one",
2902
- installed: "0.1.2"
2903
- }],
2904
- confirming: id,
2905
- expect: {
2906
- rows: 0,
2907
- installed: 1,
2908
- installedActions: ["remove-bundle"]
2909
- }
2910
- },
2911
- {
2912
- id: "first-paint",
2913
- label: "刚进页面(检测中:能力与本机清单都还没结论)",
2914
- manifests: [found],
2915
- capabilities: null,
2916
- installedRead: false,
2917
- loaded: false,
2918
- expect: { rows: 0 }
2919
- },
2920
- {
2921
- id: "shared-many",
2922
- label: "三个模块(同一份安装)",
2923
- manifests: [
2924
- mine,
2925
- twin(mine),
2926
- {
2927
- ...twin(mine),
2928
- id: `${mine.id}-c`
2929
- }
2930
- ],
2931
- capabilities: {
2932
- ...probe$1(id, "ok"),
2933
- ...probe$1(secondId, "ok"),
2934
- ...probe$1(`${mine.id}-c`, "ok")
2935
- },
2936
- expect: {
2937
- rows: 3,
2938
- state: "installed",
2939
- actions: ["uninstall"]
2940
- }
2941
- },
2942
- {
2943
- id: "plugin-outdated",
2944
- label: "用户装的 opencli 插件:有新版(给更新 / 卸载)",
2945
- manifests: [],
2946
- capabilities: {},
2947
- plugins: [{
2948
- pkg: "opencli-plugin-cmdb",
2949
- name: "cmdb",
2950
- installed: "1.0.24",
2951
- latest: "1.0.25"
2952
- }],
2953
- expect: {
2954
- rows: 0,
2955
- plugins: 1,
2956
- pluginActions: ["update-plugin", "uninstall-plugin"]
3313
+ plugins: 1,
3314
+ pluginActions: ["update-plugin", "uninstall-plugin"]
2957
3315
  }
2958
3316
  },
2959
3317
  {
@@ -3004,6 +3362,7 @@ window.__ModuleLoader__.load({
3004
3362
  expect: {
3005
3363
  rows: 0,
3006
3364
  plugins: 1,
3365
+ pluginState: "broken",
3007
3366
  pluginActions: ["uninstall-plugin"],
3008
3367
  pluginNoteKey: "panels.market.pluginBroken"
3009
3368
  }
@@ -3175,6 +3534,7 @@ window.__ModuleLoader__.load({
3175
3534
  const listeners = /* @__PURE__ */ new Set();
3176
3535
  const board = createBoardRegistry();
3177
3536
  let known = /* @__PURE__ */ new Map();
3537
+ let installableIds = null;
3178
3538
  let revision = 0;
3179
3539
  let manifestsCache;
3180
3540
  function notify() {
@@ -3185,9 +3545,10 @@ window.__ModuleLoader__.load({
3185
3545
  console.warn(`[dsh-workbench] 套件注册的订阅者报错(不影响其它订阅者与这次注册):${String(error)}`);
3186
3546
  }
3187
3547
  }
3188
- function warnRefusal(unit, reasons) {
3548
+ function warnRefusal(unit, kind, reasons) {
3189
3549
  refusals.push({
3190
3550
  unit,
3551
+ kind,
3191
3552
  reasons
3192
3553
  });
3193
3554
  console.warn(`[dsh-workbench] ${unit === "" ? "这个模块" : unit} 的卡片没挂上:${reasons.join(";")}`);
@@ -3214,7 +3575,7 @@ window.__ModuleLoader__.load({
3214
3575
  register(face) {
3215
3576
  const unit = typeof face?.unit === "string" ? face.unit.trim() : "";
3216
3577
  if (unit === "") {
3217
- warnRefusal("", ["registerUnit({ unit, card }) 里的 unit 是空的 —— U1b 之前的旧形状是 registerUnit({ manifest, card });现在清单由外壳从**已装清单**读出来、按 unit 交给浏览器(ADR-0038 §2.2)"]);
3578
+ warnRefusal("", "old-shape", ["registerUnit({ unit, card }) 里的 unit 是空的 —— U1b 之前的旧形状是 registerUnit({ manifest, card });现在清单由外壳从**已装清单**读出来、按 unit 交给浏览器(ADR-0038 §2.2)"]);
3218
3579
  notify();
3219
3580
  return () => {};
3220
3581
  }
@@ -3227,7 +3588,7 @@ window.__ModuleLoader__.load({
3227
3588
  registrations.push(entry);
3228
3589
  manifestsCache = void 0;
3229
3590
  if (!attach(entry)) {
3230
- warnRefusal(unit, [`宿主没有担保 unit「${unit}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]);
3591
+ warnRefusal(unit, "no-manifest", [`宿主没有担保 unit「${unit}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]);
3231
3592
  options.onUnknownUnit?.(unit);
3232
3593
  }
3233
3594
  notify();
@@ -3247,8 +3608,10 @@ window.__ModuleLoader__.load({
3247
3608
  return manifestsCache;
3248
3609
  },
3249
3610
  refusals: () => refusals,
3250
- setManifests(manifests) {
3611
+ installable: () => installableIds,
3612
+ setManifests(manifests, installable) {
3251
3613
  known = new Map(manifests.map((manifest) => [manifest.id, manifest]));
3614
+ installableIds = installable === void 0 ? null : new Set(installable);
3252
3615
  let changed = false;
3253
3616
  for (const entry of registrations) {
3254
3617
  const next = known.get(entry.unit);
@@ -3258,7 +3621,7 @@ window.__ModuleLoader__.load({
3258
3621
  }
3259
3622
  if (next === void 0) {
3260
3623
  detach(entry);
3261
- warnRefusal(entry.unit, [`宿主不再担保 unit「${entry.unit}」的清单(模块被卸了?)—— 这张卡片先摘下来`]);
3624
+ warnRefusal(entry.unit, "withdrawn", [`宿主不再担保 unit「${entry.unit}」的清单(模块被卸了?)—— 这张卡片先摘下来`]);
3262
3625
  changed = true;
3263
3626
  }
3264
3627
  }
@@ -3378,6 +3741,103 @@ window.__ModuleLoader__.load({
3378
3741
  return crash ? [...boardModuleOf(CRASH_FACE), ...base] : base;
3379
3742
  }
3380
3743
  //#endregion
3744
+ //#region src/app/layouts/rightbar/market-shared-rows.ts
3745
+ var SHARED_STATE_KEY = {
3746
+ checking: "panels.market.checking",
3747
+ installed: "panels.market.sharedOk",
3748
+ outdated: "panels.market.sharedOutdated",
3749
+ unsatisfied: "panels.market.sharedUnsatisfied",
3750
+ missing: "panels.market.sharedMissing",
3751
+ unchecked: "panels.market.unchecked"
3752
+ };
3753
+ var SHARED_DOT = {
3754
+ checking: "ongoing",
3755
+ installed: "done",
3756
+ outdated: "warning",
3757
+ unsatisfied: "warning",
3758
+ missing: "idle",
3759
+ unchecked: "idle"
3760
+ };
3761
+ function sharedActions(row) {
3762
+ return [...row.canUpdate ? ["update-dependency"] : []];
3763
+ }
3764
+ var SHARED_RANK = {
3765
+ checking: -1,
3766
+ unchecked: 0,
3767
+ installed: 1,
3768
+ outdated: 2,
3769
+ unsatisfied: 3,
3770
+ missing: 4
3771
+ };
3772
+ function sharedRows(manifests, capabilities) {
3773
+ const catalog = manifests.filter((manifest) => (manifest.env?.plugins ?? []).length > 0 || (manifest.env?.libs ?? []).length > 0);
3774
+ const byId = new Map(catalog.map((manifest) => [manifest.id, manifest]));
3775
+ const buckets = /* @__PURE__ */ new Map();
3776
+ const bucketOf = (kind, name, label, purpose) => {
3777
+ const id = `${kind}:${name}`;
3778
+ const found = buckets.get(id);
3779
+ if (found !== void 0) return found;
3780
+ const created = {
3781
+ kind,
3782
+ name,
3783
+ label,
3784
+ users: [],
3785
+ states: [],
3786
+ ...purpose === void 0 ? {} : { purpose }
3787
+ };
3788
+ buckets.set(id, created);
3789
+ return created;
3790
+ };
3791
+ for (const manifest of catalog) {
3792
+ const capability = capabilities?.[manifest.id];
3793
+ const released = capability?.released === true;
3794
+ for (const need of manifest.env?.plugins ?? []) {
3795
+ const source = need.installSource;
3796
+ const bucket = bucketOf("plugin", need.name, source?.kind === "npm" ? source.package : need.name);
3797
+ if (released) continue;
3798
+ bucket.users.push(manifest.id);
3799
+ const state = capability?.plugins?.find((item) => item.name === need.name);
3800
+ bucket.states.push(state === void 0 ? "unchecked" : state.status === "ok" ? "installed" : state.status);
3801
+ if (state?.release !== void 0) {
3802
+ bucket.installed ??= state.release.installed;
3803
+ bucket.latest ??= state.release.latest;
3804
+ }
3805
+ bucket.command ??= state?.command;
3806
+ }
3807
+ for (const need of manifest.env?.libs ?? []) {
3808
+ const bucket = bucketOf("lib", need.name, need.name, need.purpose);
3809
+ if (released) continue;
3810
+ bucket.users.push(manifest.id);
3811
+ const state = capability?.libs?.find((item) => item.name === need.name);
3812
+ bucket.states.push(state === void 0 ? "unchecked" : state.status === "ok" ? "installed" : state.status);
3813
+ bucket.installed ??= state?.installed;
3814
+ bucket.latest ??= state?.latest;
3815
+ bucket.command ??= state?.command;
3816
+ }
3817
+ }
3818
+ const rows = [];
3819
+ for (const bucket of buckets.values()) {
3820
+ if (bucket.users.length === 0) continue;
3821
+ const state = capabilities === null ? "checking" : bucket.states.reduce((soFar, item) => SHARED_RANK[item] > SHARED_RANK[soFar] ? item : soFar, "unchecked");
3822
+ const version = bucket.installed === void 0 && bucket.latest === void 0 ? void 0 : {
3823
+ ...bucket.installed === void 0 ? {} : { installed: bucket.installed },
3824
+ ...bucket.latest === void 0 ? {} : { latest: bucket.latest }
3825
+ };
3826
+ const detail = bucket.purpose === void 0 ? void 0 : `${bucket.label} —— ${bucket.purpose}`;
3827
+ rows.push({
3828
+ id: `${bucket.kind}:${bucket.name}`,
3829
+ kind: bucket.kind,
3830
+ label: bucket.label,
3831
+ usedByKeys: bucket.users.map((unit) => byId.get(unit)?.card?.titleKey ?? unit),
3832
+ state,
3833
+ canUpdate: state === "outdated" || state === "unsatisfied",
3834
+ ...version === void 0 ? {} : { version },
3835
+ ...detail === void 0 ? {} : { detail }
3836
+ });
3837
+ }
3838
+ return rows;
3839
+ }
3840
+ //#endregion
3381
3841
  //#region src/app/layouts/rightbar/market-workbench-row.ts
3382
3842
  var WORKBENCH_ROW_ID = "workbench:self";
3383
3843
  var WORKBENCH_TITLE_KEY = "panels.market.workbenchName";
@@ -3415,7 +3875,10 @@ window.__ModuleLoader__.load({
3415
3875
  var MARKET_STATE_KEY = {
3416
3876
  checking: "panels.market.checking",
3417
3877
  installed: "panels.market.installed",
3418
- outdated: "panels.market.outdated",
3878
+ inactive: "panels.market.notActive",
3879
+ unusable: "panels.market.notUsable",
3880
+ broken: "panels.market.broken",
3881
+ outdated: "panels.market.moduleOutdated",
3419
3882
  missing: "panels.market.missing",
3420
3883
  unchecked: "panels.market.unchecked",
3421
3884
  unknown: "panels.market.unchecked"
@@ -3423,6 +3886,9 @@ window.__ModuleLoader__.load({
3423
3886
  var MARKET_DOT = {
3424
3887
  checking: "ongoing",
3425
3888
  installed: "done",
3889
+ inactive: "error",
3890
+ unusable: "error",
3891
+ broken: "error",
3426
3892
  outdated: "warning",
3427
3893
  missing: "idle",
3428
3894
  unchecked: "idle",
@@ -3432,8 +3898,9 @@ window.__ModuleLoader__.load({
3432
3898
  return row.label ?? t(row.titleKey);
3433
3899
  }
3434
3900
  function withClientRefusals(modules, refusals) {
3435
- if (refusals.length === 0) return modules;
3436
- const byUnit = new Map(refusals.map((one) => [one.unit, one.reasons]));
3901
+ const refused = refusals.filter((one) => one.kind !== "no-manifest");
3902
+ if (refused.length === 0) return modules;
3903
+ const byUnit = new Map(refused.map((one) => [one.unit, one.reasons]));
3437
3904
  return modules.map((module) => {
3438
3905
  const reasons = byUnit.get(module.unit);
3439
3906
  return reasons === void 0 ? module : {
@@ -3462,15 +3929,16 @@ window.__ModuleLoader__.load({
3462
3929
  const rows = [];
3463
3930
  for (const module of modules) {
3464
3931
  if (listed.has(module.unit)) continue;
3465
- const latest = module.latest;
3932
+ const latest = module.local === true ? void 0 : module.latest;
3466
3933
  const outdated = latest !== void 0 && latest !== module.installed;
3467
3934
  const loaded = titles.has(module.unit);
3468
3935
  const refused = refusalReasons(module.refused, module.clientRefused);
3936
+ const pending = !loaded && refused.length === 0;
3469
3937
  rows.push({
3470
3938
  id: module.unit,
3471
3939
  titleKey: titles.get(module.unit) ?? known?.get(module.unit) ?? module.pkg,
3472
- state: outdated ? "outdated" : "installed",
3473
- ...loaded || refused.length > 0 ? {} : { hint: "panels.market.moduleRestartHint" },
3940
+ state: outdated ? "outdated" : refused.length > 0 ? "unusable" : pending ? "inactive" : "installed",
3941
+ ...pending ? { hint: "panels.market.moduleRestartHint" } : {},
3474
3942
  ...refused.length === 0 ? {} : { note: {
3475
3943
  key: "panels.market.moduleRefused",
3476
3944
  params: { reason: refused.join(";") }
@@ -3494,6 +3962,10 @@ window.__ModuleLoader__.load({
3494
3962
  }
3495
3963
  return rows;
3496
3964
  }
3965
+ var SWITCH_LOCKED = /* @__PURE__ */ new Set(["unusable", "broken"]);
3966
+ function marketSwitchLocked(row) {
3967
+ return SWITCH_LOCKED.has(row.state);
3968
+ }
3497
3969
  function marketActions$1(row) {
3498
3970
  if (row.workbench === true) return row.canUpdate ? ["update-workbench"] : [];
3499
3971
  if (row.plugin === true) return [...row.canUpdate ? ["update-plugin"] : [], ...row.canUninstall ? ["uninstall-plugin"] : []];
@@ -3503,8 +3975,8 @@ window.__ModuleLoader__.load({
3503
3975
  ...row.canUninstall ? [row.pkg === void 0 ? "uninstall" : "remove-bundle"] : []
3504
3976
  ];
3505
3977
  }
3506
- function stateOf(capability) {
3507
- if (capability === void 0) return "unknown";
3978
+ function stateOf(capability, manifest, installed) {
3979
+ if (capability === void 0) return installed && !hasEnvSupply(manifest) ? "installed" : "unknown";
3508
3980
  if (capability.released === true) return "missing";
3509
3981
  if (capability.status === "missing-plugin") return "missing";
3510
3982
  if (capability.status === "unchecked") return "unchecked";
@@ -3520,8 +3992,9 @@ window.__ModuleLoader__.load({
3520
3992
  if (source.kind === "npm") return source.registryEnv;
3521
3993
  return "";
3522
3994
  }
3523
- function noteOf$1(state, install, manifest) {
3995
+ function noteOf$1(state, capability, manifest) {
3524
3996
  if (state === "installed") return void 0;
3997
+ const install = capability?.install;
3525
3998
  if (install === "env-missing") return {
3526
3999
  key: "panels.market.needEnv",
3527
4000
  params: { env: envNameOf((manifest.env?.plugins ?? []).find((need) => envNameOf(need.installSource) !== "")?.installSource) }
@@ -3534,9 +4007,19 @@ window.__ModuleLoader__.load({
3534
4007
  key: "panels.market.badSource",
3535
4008
  params: {}
3536
4009
  };
4010
+ const missing = capability?.missing ?? [];
4011
+ if (state === "outdated" && missing.length > 0) return {
4012
+ key: "panels.market.needCommands",
4013
+ params: { commands: missing.join("、") },
4014
+ tone: "plain"
4015
+ };
3537
4016
  }
3538
4017
  function isOnMachine(state) {
3539
- return state === "installed" || state === "outdated";
4018
+ return state === "installed" || state === "outdated" || state === "inactive" || state === "unusable" || state === "broken";
4019
+ }
4020
+ function marketCatalog(manifests, installable) {
4021
+ if (installable === void 0 || installable === null) return manifests.filter(hasEnvSupply);
4022
+ return manifests.filter((manifest) => installable.has(manifest.id));
3540
4023
  }
3541
4024
  function liveManifests(manifests, capabilities, installed) {
3542
4025
  if (capabilities === null || installed === null) return manifests;
@@ -3550,10 +4033,14 @@ window.__ModuleLoader__.load({
3550
4033
  function marketUpdatesOf(modules) {
3551
4034
  if (modules === null) return {};
3552
4035
  const next = {};
3553
- for (const module of modules) next[module.unit] = {
3554
- installed: module.installed,
3555
- ...module.latest === void 0 ? {} : { latest: module.latest }
3556
- };
4036
+ for (const module of modules) {
4037
+ const local = module.local === true;
4038
+ next[module.unit] = {
4039
+ installed: module.installed,
4040
+ ...local || module.latest === void 0 ? {} : { latest: module.latest },
4041
+ ...local ? { local: true } : {}
4042
+ };
4043
+ }
3557
4044
  return next;
3558
4045
  }
3559
4046
  function marketHintVisible(manifests, capabilities, modules, workbench) {
@@ -3574,16 +4061,16 @@ window.__ModuleLoader__.load({
3574
4061
  }]];
3575
4062
  }
3576
4063
  function marketRows(manifests, capabilities, updates = {}, defaults = /* @__PURE__ */ new Set(), changed = {}) {
3577
- const catalog = manifests.filter((manifest) => (manifest.env?.plugins ?? []).length > 0 || (manifest.env?.libs ?? []).length > 0);
3578
4064
  const rows = [];
3579
- for (const manifest of catalog) {
4065
+ for (const manifest of manifests) {
3580
4066
  const capability = capabilities?.[manifest.id];
3581
4067
  const install = capability?.install;
3582
- const state = capabilities === null ? "checking" : stateOf(capability);
3583
- const note = noteOf$1(state, install, manifest);
4068
+ const entry = updates[manifest.id];
4069
+ const local = entry?.local === true;
4070
+ const state = capabilities === null ? "checking" : stateOf(capability, manifest, entry !== void 0);
4071
+ const note = noteOf$1(state, capability, manifest);
3584
4072
  const onMachine = isOnMachine(state);
3585
4073
  const reAdopt = capability?.released === true && install === void 0;
3586
- const entry = updates[manifest.id];
3587
4074
  const moduleUpdate = entry === void 0 || entry.latest === void 0 || entry.latest === entry.installed ? void 0 : {
3588
4075
  installed: entry.installed,
3589
4076
  latest: entry.latest
@@ -3601,107 +4088,13 @@ window.__ModuleLoader__.load({
3601
4088
  } },
3602
4089
  ...moduleUpdate === void 0 ? {} : { moduleUpdate },
3603
4090
  ...moduleUpdate === void 0 ? note === void 0 ? {} : { note } : {},
4091
+ ...local ? { local: true } : {},
3604
4092
  defaultShown: defaults.has(manifest.id),
3605
4093
  defaultChanged: changed[manifest.id] ?? 0
3606
4094
  });
3607
4095
  }
3608
4096
  return rows;
3609
4097
  }
3610
- var SHARED_STATE_KEY = {
3611
- checking: "panels.market.checking",
3612
- installed: "panels.market.sharedOk",
3613
- outdated: "panels.market.sharedOutdated",
3614
- unsatisfied: "panels.market.sharedUnsatisfied",
3615
- missing: "panels.market.sharedMissing",
3616
- unchecked: "panels.market.unchecked"
3617
- };
3618
- var SHARED_DOT = {
3619
- checking: "ongoing",
3620
- installed: "done",
3621
- outdated: "warning",
3622
- unsatisfied: "warning",
3623
- missing: "idle",
3624
- unchecked: "idle"
3625
- };
3626
- function sharedActions(row) {
3627
- return [...row.canUpdate ? ["update-dependency"] : []];
3628
- }
3629
- var SHARED_RANK = {
3630
- checking: -1,
3631
- unchecked: 0,
3632
- installed: 1,
3633
- outdated: 2,
3634
- unsatisfied: 3,
3635
- missing: 4
3636
- };
3637
- function sharedRows(manifests, capabilities) {
3638
- const catalog = manifests.filter((manifest) => (manifest.env?.plugins ?? []).length > 0 || (manifest.env?.libs ?? []).length > 0);
3639
- const byId = new Map(catalog.map((manifest) => [manifest.id, manifest]));
3640
- const buckets = /* @__PURE__ */ new Map();
3641
- const bucketOf = (kind, name, label, purpose) => {
3642
- const id = `${kind}:${name}`;
3643
- const found = buckets.get(id);
3644
- if (found !== void 0) return found;
3645
- const created = {
3646
- kind,
3647
- name,
3648
- label,
3649
- users: [],
3650
- states: [],
3651
- ...purpose === void 0 ? {} : { purpose }
3652
- };
3653
- buckets.set(id, created);
3654
- return created;
3655
- };
3656
- for (const manifest of catalog) {
3657
- const capability = capabilities?.[manifest.id];
3658
- const released = capability?.released === true;
3659
- for (const need of manifest.env?.plugins ?? []) {
3660
- const source = need.installSource;
3661
- const bucket = bucketOf("plugin", need.name, source?.kind === "npm" ? source.package : need.name);
3662
- if (released) continue;
3663
- bucket.users.push(manifest.id);
3664
- const state = capability?.plugins?.find((item) => item.name === need.name);
3665
- bucket.states.push(state === void 0 ? "unchecked" : state.status === "ok" ? "installed" : state.status);
3666
- if (state?.release !== void 0) {
3667
- bucket.installed ??= state.release.installed;
3668
- bucket.latest ??= state.release.latest;
3669
- }
3670
- bucket.command ??= state?.command;
3671
- }
3672
- for (const need of manifest.env?.libs ?? []) {
3673
- const bucket = bucketOf("lib", need.name, need.name, need.purpose);
3674
- if (released) continue;
3675
- bucket.users.push(manifest.id);
3676
- const state = capability?.libs?.find((item) => item.name === need.name);
3677
- bucket.states.push(state === void 0 ? "unchecked" : state.status === "ok" ? "installed" : state.status);
3678
- bucket.installed ??= state?.installed;
3679
- bucket.latest ??= state?.latest;
3680
- bucket.command ??= state?.command;
3681
- }
3682
- }
3683
- const rows = [];
3684
- for (const bucket of buckets.values()) {
3685
- if (bucket.users.length === 0) continue;
3686
- const state = capabilities === null ? "checking" : bucket.states.reduce((soFar, item) => SHARED_RANK[item] > SHARED_RANK[soFar] ? item : soFar, "unchecked");
3687
- const version = bucket.installed === void 0 && bucket.latest === void 0 ? void 0 : {
3688
- ...bucket.installed === void 0 ? {} : { installed: bucket.installed },
3689
- ...bucket.latest === void 0 ? {} : { latest: bucket.latest }
3690
- };
3691
- const detail = bucket.purpose === void 0 ? void 0 : `${bucket.label} —— ${bucket.purpose}`;
3692
- rows.push({
3693
- id: `${bucket.kind}:${bucket.name}`,
3694
- kind: bucket.kind,
3695
- label: bucket.label,
3696
- usedByKeys: bucket.users.map((unit) => byId.get(unit)?.card?.titleKey ?? unit),
3697
- state,
3698
- canUpdate: state === "outdated" || state === "unsatisfied",
3699
- ...version === void 0 ? {} : { version },
3700
- ...detail === void 0 ? {} : { detail }
3701
- });
3702
- }
3703
- return rows;
3704
- }
3705
4098
  //#endregion
3706
4099
  //#region src/shared/hooks/use-host-write.ts
3707
4100
  var use_host_write_exports = /* @__PURE__ */ __exportAll({ useHostWrite: () => useHostWrite });
@@ -3755,6 +4148,42 @@ window.__ModuleLoader__.load({
3755
4148
  };
3756
4149
  }
3757
4150
  //#endregion
4151
+ //#region src/shared/hooks/use-visible-busy.ts
4152
+ var use_visible_busy_exports = /* @__PURE__ */ __exportAll({
4153
+ busyView: () => busyView,
4154
+ heldPhase: () => heldPhase,
4155
+ useVisibleBusy: () => useVisibleBusy
4156
+ });
4157
+ function heldPhase(phase, refreshing) {
4158
+ return refreshing && phase === "ready" ? "loading" : phase;
4159
+ }
4160
+ function busyView(active, visible) {
4161
+ return {
4162
+ busy: visible,
4163
+ settling: visible && !active
4164
+ };
4165
+ }
4166
+ function useVisibleBusy(active, floorMs) {
4167
+ const [visible, setVisible] = useState(active);
4168
+ const since = useRef(null);
4169
+ useEffect(() => {
4170
+ if (active) {
4171
+ if (since.current === null) since.current = Date.now();
4172
+ setVisible(true);
4173
+ return;
4174
+ }
4175
+ const held = holdBusy(since.current, Date.now(), floorMs);
4176
+ since.current = null;
4177
+ if (!held.visible) {
4178
+ setVisible(false);
4179
+ return;
4180
+ }
4181
+ const timer = setTimeout(() => setVisible(false), held.releaseInMs);
4182
+ return () => clearTimeout(timer);
4183
+ }, [active, floorMs]);
4184
+ return busyView(active, visible);
4185
+ }
4186
+ //#endregion
3758
4187
  //#region src/app/layouts/rightbar/market-plugin-rows.ts
3759
4188
  function installedPluginKept(value) {
3760
4189
  if (typeof value !== "object" || value === null) return void 0;
@@ -3796,16 +4225,14 @@ window.__ModuleLoader__.load({
3796
4225
  titleKey: plugin.pkg,
3797
4226
  label: name,
3798
4227
  plugin: true,
3799
- state: outdated ? "outdated" : "installed",
4228
+ state: outdated ? "outdated" : plugin.broken === true ? "broken" : "installed",
3800
4229
  canInstall: false,
3801
4230
  canUpdate: outdated,
3802
4231
  canUninstall: true,
3803
4232
  ...plugin.local === true ? { local: true } : {},
3804
4233
  ...plugin.broken === true ? { broken: true } : {},
3805
- ...plugin.broken === true ? {} : {
3806
- defaultShown: defaults.has(id),
3807
- defaultChanged: changed[id] ?? 0
3808
- },
4234
+ defaultShown: defaults.has(id),
4235
+ defaultChanged: changed[id] ?? 0,
3809
4236
  ...note === void 0 ? {} : { note },
3810
4237
  ...plugin.installed === void 0 ? {} : { versionLabel: `${plugin.pkg}@${plugin.installed}` },
3811
4238
  pkg: plugin.pkg,
@@ -3817,42 +4244,42 @@ window.__ModuleLoader__.load({
3817
4244
  });
3818
4245
  }
3819
4246
  var MarketPage_module_default = {
3820
- marketList: "_marketList_1v8dy_1",
3821
- marketRow: "_marketRow_1v8dy_10",
3822
- marketIcon: "_marketIcon_1v8dy_20",
3823
- marketMain: "_marketMain_1v8dy_32",
3824
- marketName: "_marketName_1v8dy_39",
3825
- marketDesc: "_marketDesc_1v8dy_48",
3826
- marketUsedBy: "_marketUsedBy_1v8dy_59",
3827
- marketVersion: "_marketVersion_1v8dy_73",
3828
- marketEnd: "_marketEnd_1v8dy_95",
3829
- marketSwitchSeat: "_marketSwitchSeat_1v8dy_103",
3830
- marketIconAction: "_marketIconAction_1v8dy_108",
3831
- marketActions: "_marketActions_1v8dy_113",
3832
- marketDefaultNote: "_marketDefaultNote_1v8dy_119",
3833
- marketSelfDivider: "_marketSelfDivider_1v8dy_126",
3834
- marketSection: "_marketSection_1v8dy_131",
3835
- marketSectionHead: "_marketSectionHead_1v8dy_138",
3836
- marketSectionIcon: "_marketSectionIcon_1v8dy_144",
3837
- marketSectionTitle: "_marketSectionTitle_1v8dy_151",
3838
- marketSectionCount: "_marketSectionCount_1v8dy_157",
3839
- marketProgress: "_marketProgress_1v8dy_164",
3840
- marketNote: "_marketNote_1v8dy_174",
3841
- marketNotePlain: "_marketNotePlain_1v8dy_181",
3842
- marketFailure: "_marketFailure_1v8dy_189",
3843
- marketEmpty: "_marketEmpty_1v8dy_196",
3844
- marketPage: "_marketPage_1v8dy_201",
3845
- marketPageHead: "_marketPageHead_1v8dy_219",
3846
- marketPageTitle: "_marketPageTitle_1v8dy_227",
3847
- marketPageIntro: "_marketPageIntro_1v8dy_232",
3848
- marketPageTools: "_marketPageTools_1v8dy_238",
3849
- marketIconButton: "_marketIconButton_1v8dy_247",
3850
- marketIconWrap: "_marketIconWrap_1v8dy_272",
3851
- marketIconButtonSpinning: "_marketIconButtonSpinning_1v8dy_276",
3852
- "wb-spin": "_wb-spin_1v8dy_1",
3853
- marketAddButton: "_marketAddButton_1v8dy_280",
3854
- marketChecking: "_marketChecking_1v8dy_297",
3855
- marketEmptyTitle: "_marketEmptyTitle_1v8dy_305"
4247
+ marketList: "_marketList_csyus_1",
4248
+ marketRow: "_marketRow_csyus_10",
4249
+ marketIcon: "_marketIcon_csyus_20",
4250
+ marketMain: "_marketMain_csyus_32",
4251
+ marketName: "_marketName_csyus_39",
4252
+ marketDesc: "_marketDesc_csyus_48",
4253
+ marketUsedBy: "_marketUsedBy_csyus_59",
4254
+ marketVersion: "_marketVersion_csyus_73",
4255
+ marketLocalTag: "_marketLocalTag_csyus_95",
4256
+ marketEnd: "_marketEnd_csyus_106",
4257
+ marketSwitchSeat: "_marketSwitchSeat_csyus_113",
4258
+ marketActions: "_marketActions_csyus_126",
4259
+ marketUpdateAction: "_marketUpdateAction_csyus_132",
4260
+ marketSelfDivider: "_marketSelfDivider_csyus_138",
4261
+ marketSection: "_marketSection_csyus_143",
4262
+ marketSectionHead: "_marketSectionHead_csyus_150",
4263
+ marketSectionIcon: "_marketSectionIcon_csyus_156",
4264
+ marketSectionTitle: "_marketSectionTitle_csyus_163",
4265
+ marketSectionCount: "_marketSectionCount_csyus_169",
4266
+ marketProgress: "_marketProgress_csyus_176",
4267
+ marketNote: "_marketNote_csyus_186",
4268
+ marketNotePlain: "_marketNotePlain_csyus_193",
4269
+ marketFailure: "_marketFailure_csyus_201",
4270
+ marketEmpty: "_marketEmpty_csyus_208",
4271
+ marketPage: "_marketPage_csyus_213",
4272
+ marketPageHead: "_marketPageHead_csyus_231",
4273
+ marketPageTitle: "_marketPageTitle_csyus_239",
4274
+ marketPageIntro: "_marketPageIntro_csyus_244",
4275
+ marketPageTools: "_marketPageTools_csyus_250",
4276
+ marketIconButton: "_marketIconButton_csyus_259",
4277
+ marketIconWrap: "_marketIconWrap_csyus_284",
4278
+ marketIconButtonSpinning: "_marketIconButtonSpinning_csyus_288",
4279
+ "wb-spin": "_wb-spin_csyus_1",
4280
+ marketAddButton: "_marketAddButton_csyus_292",
4281
+ marketChecking: "_marketChecking_csyus_309",
4282
+ marketEmptyTitle: "_marketEmptyTitle_csyus_317"
3856
4283
  };
3857
4284
  //#endregion
3858
4285
  //#region src/app/layouts/rightbar/MarketStates.tsx
@@ -3873,7 +4300,6 @@ window.__ModuleLoader__.load({
3873
4300
  case "installed": return h(IconModules, { size: SIZE$1 });
3874
4301
  case "pending": return h(_deepseek_ai_dsh_client_ui_primitives.IconDownloadOutlineRegular, { size: SIZE$1 });
3875
4302
  case "plugins": return h(_deepseek_ai_dsh_client_ui_primitives.IconCordisPluginOutlineRegular, { size: SIZE$1 });
3876
- case "local": return h(_deepseek_ai_dsh_client_ui_primitives.IconFolderOpenOutlineRegular, { size: SIZE$1 });
3877
4303
  case "shared": return h(_deepseek_ai_dsh_client_ui_primitives.IconLinkOutlineRegular, { size: SIZE$1 });
3878
4304
  }
3879
4305
  }
@@ -3987,20 +4413,67 @@ window.__ModuleLoader__.load({
3987
4413
  }))));
3988
4414
  }
3989
4415
  //#endregion
4416
+ //#region src/app/layouts/rightbar/panel-write.ts
4417
+ var PANEL_SETTLE_MS = 4e3;
4418
+ function rowKey(row) {
4419
+ return `${row.id}:${row.shown ? "1" : "0"}:${row.source}`;
4420
+ }
4421
+ function rowKeys(rows) {
4422
+ return rows.map(rowKey).join(",");
4423
+ }
4424
+ function panelBoardSignature(units, plugins, own) {
4425
+ return `${rowKeys(units)}|${rowKeys(plugins)}|${own ? "1" : "0"}`;
4426
+ }
4427
+ function machineBoardSignature(defaults, changed) {
4428
+ const counts = Object.entries(changed).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0).map(([id, count]) => `${id}:${String(count)}`);
4429
+ return `${[...defaults].sort().join(",")}|${counts.join(",")}`;
4430
+ }
4431
+ function nextPending(pending, signature) {
4432
+ return pending !== null && pending !== signature ? null : pending;
4433
+ }
4434
+ function useBoardSettle(signature) {
4435
+ const [held, setHeld] = useState(null);
4436
+ useEffect(() => {
4437
+ setHeld((current) => nextPending(current, signature));
4438
+ }, [signature]);
4439
+ useEffect(() => {
4440
+ if (held === null) return void 0;
4441
+ const timer = setTimeout(() => setHeld(null), PANEL_SETTLE_MS);
4442
+ return () => clearTimeout(timer);
4443
+ }, [held]);
4444
+ return {
4445
+ pending: held !== null,
4446
+ begin: () => setHeld(signature),
4447
+ clear: () => setHeld(null)
4448
+ };
4449
+ }
4450
+ //#endregion
3990
4451
  //#region src/app/layouts/rightbar/market-section.tsx
4452
+ var dangerActions = [
4453
+ "uninstall",
4454
+ "remove-bundle",
4455
+ "uninstall-plugin"
4456
+ ];
4457
+ var updateActions = [
4458
+ "update",
4459
+ "update-bundle",
4460
+ "update-plugin",
4461
+ "update-workbench"
4462
+ ];
3991
4463
  function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
3992
4464
  const running = pending !== null && pending.id === row.id ? pending : null;
3993
4465
  const locked = pending !== null;
3994
4466
  const quiet = row.workbench === true && row.state === "installed" && row.hint === void 0;
3995
4467
  const actions = marketActions$1(row);
3996
- const stateText = t(row.moduleUpdate === void 0 ? MARKET_STATE_KEY[row.state] : "panels.market.moduleOutdated");
4468
+ const switchLocked = marketSwitchLocked(row);
4469
+ const stateText = t(MARKET_STATE_KEY[row.state]);
3997
4470
  return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
3998
4471
  className: MarketPage_module_default.marketIcon,
3999
4472
  "aria-hidden": "true"
4000
4473
  }, 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", {
4001
4474
  from: row.version.installed,
4002
4475
  to: row.version.latest
4003
- }) : row.version.installed ?? row.version.latest ?? "")), quiet ? null : /* @__PURE__ */ h("span", {
4476
+ }) : 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", {
4004
4477
  className: MarketPage_module_default.marketDesc,
4005
4478
  role: "img",
4006
4479
  "aria-label": stateText
@@ -4010,39 +4483,29 @@ window.__ModuleLoader__.load({
4010
4483
  }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4011
4484
  state: MARKET_DOT[row.state],
4012
4485
  size: 9
4013
- }), stateText, row.hint === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketUsedBy }, t(row.hint)))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEnd }, row.defaultShown === void 0 ? null : /* @__PURE__ */ h(Tip, { label: (row.defaultChanged ?? 0) === 0 ? t("panels.market.defaultLabel") : `${t("panels.market.defaultLabel")} · ${t("panels.market.changedBy", { count: row.defaultChanged ?? 0 })}` }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSwitchSeat }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Switch, {
4014
- checked: row.defaultShown,
4015
- disabled: boardBusy === true || locked,
4016
- label: `${marketRowTitle(row, t)} · ${t("panels.market.defaultLabel")}`,
4017
- onChange: (next) => onDefault?.(next)
4018
- }))), running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4486
+ }), 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, {
4019
4487
  state: "ongoing",
4020
4488
  size: 14
4021
4489
  }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => {
4022
- const danger = action === "uninstall" || action === "remove-bundle" || action === "uninstall-plugin";
4023
- const label = t(ACTION_LABEL_KEY[action]);
4024
- if (!danger) return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
4490
+ const danger = dangerActions.includes(action);
4491
+ const update = updateActions.includes(action);
4492
+ return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
4025
4493
  key: action,
4026
4494
  type: "button",
4027
4495
  size: "sm",
4028
4496
  variant: action === "install" ? "primary" : "outline",
4497
+ className: danger ? "wb-dangerAction" : update ? MarketPage_module_default.marketUpdateAction : void 0,
4498
+ icon: danger ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutlineRegular, { size: 13 }) : void 0,
4499
+ "aria-label": danger ? t("panels.market.uninstallLabel", { name: marketRowTitle(row, t) }) : void 0,
4029
4500
  disabled: locked,
4030
4501
  onClick: () => onAct(action)
4031
- }, label);
4032
- return /* @__PURE__ */ h(Tip, {
4033
- key: action,
4034
- label
4035
- }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
4036
- type: "button",
4037
- size: "sm",
4038
- variant: "ghost",
4039
- className: `wb-dangerAction ${MarketPage_module_default.marketIconAction}`,
4040
- icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutlineRegular, { size: 14 }),
4041
- "aria-label": t("panels.market.uninstallLabel", { name: marketRowTitle(row, t) }),
4042
- disabled: locked,
4043
- onClick: () => onAct(action)
4044
- }));
4045
- }))), row.note === void 0 ? null : /* @__PURE__ */ h("div", {
4502
+ }, t(ACTION_LABEL_KEY[action]));
4503
+ })), 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, {
4504
+ checked: row.defaultShown,
4505
+ disabled: boardBusy === true || locked || switchLocked,
4506
+ label: `${marketRowTitle(row, t)} · ${t("panels.market.defaultLabel")}`,
4507
+ onChange: (next) => onDefault?.(next)
4508
+ })))), row.note === void 0 ? null : /* @__PURE__ */ h("div", {
4046
4509
  className: row.note.tone === "plain" ? MarketPage_module_default.marketNotePlain : MarketPage_module_default.marketNote,
4047
4510
  title: row.note.params.reason === void 0 ? void 0 : t("panels.market.moduleRefusedDetail", row.note.params)
4048
4511
  }, t(row.note.key, row.note.params)), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
@@ -4322,14 +4785,14 @@ window.__ModuleLoader__.load({
4322
4785
  };
4323
4786
  }
4324
4787
  var PanelFoot_module_default = {
4325
- foot: "_foot_1us83_1",
4326
- footText: "_footText_1us83_12",
4327
- footTextMd: "_footTextMd_1us83_17"
4788
+ foot: "_foot_1ud1j_1",
4789
+ footText: "_footText_1ud1j_13",
4790
+ footTextMd: "_footTextMd_1ud1j_18"
4328
4791
  };
4329
4792
  //#endregion
4330
4793
  //#region src/shared/components/PanelFoot.tsx
4331
4794
  function PanelFoot({ text, size = "sm", children }) {
4332
- 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);
4795
+ 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);
4333
4796
  }
4334
4797
  //#endregion
4335
4798
  //#region src/app/layouts/rightbar/MarketView.tsx
@@ -4338,7 +4801,6 @@ window.__ModuleLoader__.load({
4338
4801
  "remove-bundle",
4339
4802
  "uninstall-plugin"
4340
4803
  ];
4341
- var CONFIRM_REMOVE = ["remove-bundle"];
4342
4804
  function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
4343
4805
  const [acknowledged, setAcknowledged] = useState(false);
4344
4806
  return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.RiskConfirmation, {
@@ -4370,11 +4832,7 @@ window.__ModuleLoader__.load({
4370
4832
  }), self === void 0 ? null : /* @__PURE__ */ h("div", {
4371
4833
  className: MarketPage_module_default.marketSelfDivider,
4372
4834
  "aria-hidden": "true"
4373
- }), [
4374
- ...shown,
4375
- ...installedList,
4376
- ...pluginList
4377
- ].some((row) => row.defaultShown !== void 0) ? /* @__PURE__ */ h("p", { className: MarketPage_module_default.marketDefaultNote }, t("panels.market.defaultNote")) : null, marketSections(shown).map((section) => /* @__PURE__ */ h(MarketSection, {
4835
+ }), marketSections([...shown, ...installedList]).map((section) => /* @__PURE__ */ h(MarketSection, {
4378
4836
  key: section.id,
4379
4837
  t,
4380
4838
  titleKey: section.titleKey,
@@ -4399,18 +4857,6 @@ window.__ModuleLoader__.load({
4399
4857
  act,
4400
4858
  confirmActions: CONFIRM_UNINSTALL,
4401
4859
  onConfirming
4402
- }), /* @__PURE__ */ h(MarketSection, {
4403
- t,
4404
- titleKey: installedList.length > 0 && installedList.every((row) => row.local === true) ? "panels.market.sectionLocal" : "panels.market.sectionUnlisted",
4405
- icon: marketSectionIcon("local"),
4406
- rows: installedList,
4407
- onDefault: setDefault,
4408
- boardBusy,
4409
- pending,
4410
- failureOf,
4411
- act,
4412
- confirmActions: CONFIRM_REMOVE,
4413
- onConfirming
4414
4860
  }), /* @__PURE__ */ h(PanelFoot, {
4415
4861
  size: "md",
4416
4862
  text: t("panels.market.foot")
@@ -4422,18 +4868,23 @@ window.__ModuleLoader__.load({
4422
4868
  act
4423
4869
  }));
4424
4870
  }
4425
- function MarketView({ t, manifests, capabilities, freshness, onChanged, updates, installed, installedRead, workbench, plugins, settling, mock, defaults = [], changed = {} }) {
4871
+ function MarketView({ t, manifests, installable, capabilities, freshness, onChanged, onPending, updates, installed, installedRead, workbench, plugins, settling, mock, defaults = [], changed = {} }) {
4426
4872
  const [titles, setTitles] = useState(/* @__PURE__ */ new Map());
4427
4873
  useEffect(() => {
4428
4874
  if (mock === void 0) setTitles((known) => mergeTitles(known, manifests));
4429
4875
  }, [manifests, mock]);
4430
4876
  const catalog = mock?.manifests ?? manifests;
4877
+ const marketable = mock === void 0 ? marketCatalog(manifests, installable) : catalog;
4431
4878
  const effective = mock === void 0 ? capabilities : mock.capabilities;
4432
- const source = liveManifests(catalog, effective, mock === void 0 && installed !== void 0 ? new Set(installed.map((item) => item.unit)) : null);
4879
+ const source = liveManifests(marketable, effective, mock === void 0 && installed !== void 0 ? new Set(installed.map((item) => item.unit)) : null);
4433
4880
  const byDefault = new Set(defaults);
4434
4881
  const rows = marketRows(source, effective, mock?.updates ?? updates ?? {}, byDefault, changed);
4435
4882
  const shared = sharedRows(source, effective);
4436
4883
  const [pending, setPending] = useState(mock?.pending ?? null);
4884
+ useEffect(() => {
4885
+ onPending?.(pending !== null);
4886
+ return () => onPending?.(false);
4887
+ }, [pending, onPending]);
4437
4888
  const provision = useHostWrite({
4438
4889
  channel: "provision",
4439
4890
  networkText: t("panels.failed")
@@ -4443,17 +4894,23 @@ window.__ModuleLoader__.load({
4443
4894
  resource: "panels",
4444
4895
  networkText: t("panels.failed")
4445
4896
  });
4446
- const [boardBusy, setBoardBusy] = useState(false);
4897
+ const [writingDefault, setWritingDefault] = useState(false);
4898
+ const settleDefault = useBoardSettle(machineBoardSignature(defaults, changed));
4899
+ const { busy: boardBusy } = useVisibleBusy(writingDefault || settleDefault.pending, 500);
4447
4900
  const setDefault = async (id, next) => {
4448
4901
  if (mock !== void 0) return;
4449
- setBoardBusy(true);
4902
+ setWritingDefault(true);
4903
+ settleDefault.begin();
4450
4904
  const outcome = await boardWrite.send({
4451
4905
  action: next ? "show" : "hide",
4452
4906
  id,
4453
4907
  scope: "machine"
4454
4908
  });
4455
- setBoardBusy(false);
4456
- if (!outcome.ok) setNotice(t("panels.failed"));
4909
+ setWritingDefault(false);
4910
+ if (!outcome.ok) {
4911
+ settleDefault.clear();
4912
+ setNotice(t("panels.failed"));
4913
+ }
4457
4914
  };
4458
4915
  const [confirming, setConfirming] = useState(mock?.confirming ?? null);
4459
4916
  const [failed, setFailed] = useState(mock?.failure ?? null);
@@ -5326,42 +5783,6 @@ window.__ModuleLoader__.load({
5326
5783
  };
5327
5784
  }
5328
5785
  //#endregion
5329
- //#region src/shared/hooks/use-visible-busy.ts
5330
- var use_visible_busy_exports = /* @__PURE__ */ __exportAll({
5331
- busyView: () => busyView,
5332
- heldPhase: () => heldPhase,
5333
- useVisibleBusy: () => useVisibleBusy
5334
- });
5335
- function heldPhase(phase, refreshing) {
5336
- return refreshing && phase === "ready" ? "loading" : phase;
5337
- }
5338
- function busyView(active, visible) {
5339
- return {
5340
- busy: visible,
5341
- settling: visible && !active
5342
- };
5343
- }
5344
- function useVisibleBusy(active, floorMs) {
5345
- const [visible, setVisible] = useState(active);
5346
- const since = useRef(null);
5347
- useEffect(() => {
5348
- if (active) {
5349
- if (since.current === null) since.current = Date.now();
5350
- setVisible(true);
5351
- return;
5352
- }
5353
- const held = holdBusy(since.current, Date.now(), floorMs);
5354
- since.current = null;
5355
- if (!held.visible) {
5356
- setVisible(false);
5357
- return;
5358
- }
5359
- const timer = setTimeout(() => setVisible(false), held.releaseInMs);
5360
- return () => clearTimeout(timer);
5361
- }, [active, floorMs]);
5362
- return busyView(active, visible);
5363
- }
5364
- //#endregion
5365
5786
  //#region src/app/layouts/market/use-add-module.ts
5366
5787
  function newRequestId() {
5367
5788
  return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
@@ -5495,14 +5916,21 @@ window.__ModuleLoader__.load({
5495
5916
  requestId: requestIdRef.current
5496
5917
  });
5497
5918
  }, [cancel]);
5919
+ const [removing, setRemoving] = useState(false);
5498
5920
  const removeIt = useCallback(() => {
5499
5921
  const pkg = outcome?.module.pkg;
5500
5922
  if (pkg === void 0) return;
5923
+ setRemoving(true);
5924
+ setFailure(null);
5501
5925
  remove.send({
5502
5926
  action: "remove-bundle",
5503
5927
  name: pkg
5504
5928
  }).then((result) => {
5505
- if (!result.ok) return;
5929
+ setRemoving(false);
5930
+ if (!result.ok) {
5931
+ setFailure(result.message);
5932
+ return;
5933
+ }
5506
5934
  onInstalled();
5507
5935
  });
5508
5936
  }, [
@@ -5529,6 +5957,7 @@ window.__ModuleLoader__.load({
5529
5957
  preview,
5530
5958
  outcome,
5531
5959
  failure,
5960
+ removing,
5532
5961
  builds: outcome?.change.pendingBuilds ?? [],
5533
5962
  setSpec,
5534
5963
  setChoice: useCallback((next) => {
@@ -5602,8 +6031,13 @@ window.__ModuleLoader__.load({
5602
6031
  variant: "outline",
5603
6032
  size: "md",
5604
6033
  className: "wb-dangerAction",
6034
+ disabled: state.removing,
6035
+ "aria-busy": state.removing,
5605
6036
  onClick: state.removeIt
5606
- }, t("panels.market.add.remove")) : null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
6037
+ }, state.removing ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
6038
+ state: "ongoing",
6039
+ size: 12
6040
+ }) : null, t(state.removing ? "panels.market.uninstalling" : "panels.market.add.remove")) : null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
5607
6041
  type: "button",
5608
6042
  variant: "outline",
5609
6043
  size: "md",
@@ -5663,14 +6097,19 @@ window.__ModuleLoader__.load({
5663
6097
  var NO_UNITS = /* @__PURE__ */ new Set();
5664
6098
  function useLiveManifests(units) {
5665
6099
  useSyncExternalStore(useCallback((listener) => units.subscribe(listener), [units]), useCallback(() => units.version(), [units]));
5666
- return units.manifests();
6100
+ return units.manifests();
6101
+ }
6102
+ function useInstallableUnits(units) {
6103
+ useSyncExternalStore(useCallback((listener) => units.subscribe(listener), [units]), useCallback(() => units.version(), [units]));
6104
+ return units.installable();
5667
6105
  }
5668
6106
  function makeMarketEntryIcon(units) {
5669
6107
  return function MarketEntryIcon({ size = 16 }) {
5670
6108
  const manifests = useLiveManifests(units);
6109
+ const installable = useInstallableUnits(units);
5671
6110
  const { capabilities } = useCapabilityMap(0);
5672
6111
  const { modules, workbench } = useModuleVersions();
5673
- const hasUpdates = marketHintVisible(manifests, capabilities, modules, workbench);
6112
+ const hasUpdates = marketHintVisible(marketCatalog(manifests, installable), capabilities, modules, workbench);
5674
6113
  useEffect(() => {
5675
6114
  publishPanelHint(MARKET_PANEL_ID, hasUpdates ? { labelKey: "panels.market.hasNew" } : null);
5676
6115
  return () => publishPanelHint(MARKET_PANEL_ID, null);
@@ -5680,10 +6119,12 @@ window.__ModuleLoader__.load({
5680
6119
  }
5681
6120
  function MarketPanel({ t, units }) {
5682
6121
  const manifests = useLiveManifests(units);
6122
+ const installable = useInstallableUnits(units);
5683
6123
  const { capabilities, checkedAt, checking, forceProbe, reload: reloadCapability } = useCapabilityMap(0);
5684
6124
  const { modules, plugins, workbench, read: installedRead, reload: reloadVersions } = useModuleVersions();
5685
6125
  const machineBoard = useEnabledUnits(0, null);
5686
6126
  const [adding, setAdding] = useState(false);
6127
+ const [acting, setActing] = useState(false);
5687
6128
  const openAddModule = useCallback(() => setAdding(true), []);
5688
6129
  const updates = useMemo(() => marketUpdatesOf(modules), [modules]);
5689
6130
  const installed = modules === null ? void 0 : withClientRefusals(modules, units.refusals());
@@ -5745,7 +6186,7 @@ window.__ModuleLoader__.load({
5745
6186
  const mockNonce = fixturePick.nonce;
5746
6187
  const shownFreshness = mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS;
5747
6188
  const shownRead = mock === void 0 ? installedRead : mock.installedRead ?? true;
5748
- const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking;
6189
+ const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking || acting;
5749
6190
  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", {
5750
6191
  type: "button",
5751
6192
  className: `${MarketPage_module_default.marketIconButton}${shownFreshness.checking ? ` ${MarketPage_module_default.marketIconButtonSpinning}` : ""}`,
@@ -5773,9 +6214,11 @@ window.__ModuleLoader__.load({
5773
6214
  key: `${mock?.id ?? "real-market"}-${mockNonce}`,
5774
6215
  t,
5775
6216
  manifests,
6217
+ installable,
5776
6218
  capabilities,
5777
6219
  freshness: shownFreshness,
5778
6220
  onChanged: reload,
6221
+ onPending: setActing,
5779
6222
  updates,
5780
6223
  installed,
5781
6224
  installedRead: shownRead,
@@ -5837,7 +6280,7 @@ window.__ModuleLoader__.load({
5837
6280
  inFlight = true;
5838
6281
  try {
5839
6282
  const response = await apiGet(UNIT_MANIFESTS_ROUTE).catch(() => null);
5840
- if (response?.ok === true && Array.isArray(response.manifests)) registry.setManifests(response.manifests);
6283
+ if (response?.ok === true && Array.isArray(response.manifests)) registry.setManifests(response.manifests, Array.isArray(response.installable) ? response.installable : void 0);
5841
6284
  } finally {
5842
6285
  inFlight = false;
5843
6286
  if (queued) {
@@ -6674,6 +7117,131 @@ window.__ModuleLoader__.load({
6674
7117
  }
6675
7118
  };
6676
7119
  }
7120
+ //#endregion
7121
+ //#region src/app/layouts/rightbar/dsh-surface.ts
7122
+ var DSH_SEAT_ATTRIBUTE = "data-sidebar-right-session";
7123
+ function dshSeatOnScreen(host) {
7124
+ if (host === void 0) return false;
7125
+ return host.querySelector(`[${DSH_SEAT_ATTRIBUTE}]`) !== null;
7126
+ }
7127
+ function createDshSurfaceWatch(read, onReady, intervalMs) {
7128
+ let timer;
7129
+ const disarm = () => {
7130
+ if (timer === void 0) return;
7131
+ clearInterval(timer);
7132
+ timer = void 0;
7133
+ };
7134
+ const tick = () => {
7135
+ if (!read()) return;
7136
+ disarm();
7137
+ onReady();
7138
+ };
7139
+ return {
7140
+ arm() {
7141
+ if (timer !== void 0) return;
7142
+ timer = setInterval(tick, intervalMs);
7143
+ },
7144
+ disarm
7145
+ };
7146
+ }
7147
+ //#endregion
7148
+ //#region src/app/layouts/rightbar/dsh-borrow.ts
7149
+ function createDshBorrow(host) {
7150
+ let pendingOpen = false;
7151
+ let pendingCall;
7152
+ let unsubscribe;
7153
+ let restore;
7154
+ let shimmed = false;
7155
+ const flush = () => {
7156
+ const official = host.official();
7157
+ if (official === void 0 || !dshSeatOnScreen(document)) return;
7158
+ if (pendingOpen) {
7159
+ pendingOpen = false;
7160
+ if (!official.isExpanded()) official.toggleExpanded();
7161
+ }
7162
+ const call = pendingCall;
7163
+ pendingCall = void 0;
7164
+ call?.();
7165
+ };
7166
+ const watch = createDshSurfaceWatch(() => dshSeatOnScreen(document), flush, 60);
7167
+ const subscribe = () => {
7168
+ const official = host.official();
7169
+ if (official === void 0 || unsubscribe !== void 0) return;
7170
+ unsubscribe = official.mounted.subscribe(() => {
7171
+ watch.arm();
7172
+ flush();
7173
+ });
7174
+ };
7175
+ const enter = (call) => {
7176
+ const official = host.official();
7177
+ if (official === void 0) return false;
7178
+ if (dshSeatOnScreen(document)) {
7179
+ if (!official.isExpanded()) official.toggleExpanded();
7180
+ call?.();
7181
+ return true;
7182
+ }
7183
+ subscribe();
7184
+ watch.arm();
7185
+ host.yieldColumn();
7186
+ pendingOpen = true;
7187
+ if (call !== void 0) pendingCall = call;
7188
+ return false;
7189
+ };
7190
+ const takeSeat = (call) => {
7191
+ shim();
7192
+ if (host.official() === void 0) return;
7193
+ enter(call);
7194
+ };
7195
+ const shim = () => {
7196
+ const official = host.official();
7197
+ if (official === void 0 || shimmed) return;
7198
+ const { openResource, openTab } = official;
7199
+ if (typeof openResource !== "function" || typeof openTab !== "function") return;
7200
+ shimmed = true;
7201
+ official.openResource = (address, options) => takeSeat(() => openResource.call(official, address, options));
7202
+ official.openTab = (kind, options) => takeSeat(() => openTab.call(official, kind, options));
7203
+ restore = () => {
7204
+ official.openResource = openResource;
7205
+ official.openTab = openTab;
7206
+ shimmed = false;
7207
+ };
7208
+ };
7209
+ return {
7210
+ open() {
7211
+ const official = host.official();
7212
+ if (official === void 0) return false;
7213
+ return official.mounted.getSnapshot() === void 0 || official.isExpanded();
7214
+ },
7215
+ use: takeSeat,
7216
+ toggle() {
7217
+ const official = host.official();
7218
+ if (official === void 0) return;
7219
+ if (!dshSeatOnScreen(document)) {
7220
+ pendingOpen = true;
7221
+ watch.arm();
7222
+ return;
7223
+ }
7224
+ official.toggleExpanded();
7225
+ },
7226
+ back() {
7227
+ pendingOpen = false;
7228
+ pendingCall = void 0;
7229
+ watch.disarm();
7230
+ host.reclaimColumn();
7231
+ },
7232
+ start() {
7233
+ shim();
7234
+ subscribe();
7235
+ },
7236
+ dispose() {
7237
+ unsubscribe?.();
7238
+ unsubscribe = void 0;
7239
+ watch.disarm();
7240
+ restore?.();
7241
+ restore = void 0;
7242
+ }
7243
+ };
7244
+ }
6677
7245
  var Breadcrumbs_module_default = {
6678
7246
  stripTabs: "_stripTabs_1dqp4_1",
6679
7247
  tab: "_tab_1dqp4_9",
@@ -6746,26 +7314,29 @@ window.__ModuleLoader__.load({
6746
7314
  });
6747
7315
  }
6748
7316
  var ModulesPage_module_default = {
6749
- trigger: "_trigger_1yptb_1",
6750
- pop: "_pop_1yptb_6",
6751
- head: "_head_1yptb_20",
6752
- title: "_title_1yptb_28",
6753
- rowControls: "_rowControls_1yptb_36",
6754
- followBox: "_followBox_1yptb_43",
6755
- switchFollowing: "_switchFollowing_1yptb_49",
6756
- reset: "_reset_1yptb_53",
6757
- list: "_list_1yptb_75",
6758
- row: "_row_1yptb_36",
6759
- rowOver: "_rowOver_1yptb_99",
6760
- ghost: "_ghost_1yptb_109",
6761
- grip: "_grip_1yptb_124",
6762
- label: "_label_1yptb_132",
6763
- name: "_name_1yptb_139",
6764
- error: "_error_1yptb_150",
6765
- dep: "_dep_1yptb_158",
6766
- pluginList: "_pluginList_1yptb_166",
6767
- pluginRow: "_pluginRow_1yptb_171",
6768
- plugin: "_plugin_1yptb_166"
7317
+ trigger: "_trigger_15ptp_1",
7318
+ pop: "_pop_15ptp_6",
7319
+ head: "_head_15ptp_20",
7320
+ title: "_title_15ptp_28",
7321
+ rowControls: "_rowControls_15ptp_36",
7322
+ reset: "_reset_15ptp_43",
7323
+ list: "_list_15ptp_65",
7324
+ row: "_row_15ptp_36",
7325
+ rowDragging: "_rowDragging_15ptp_85",
7326
+ rowBlocked: "_rowBlocked_15ptp_89",
7327
+ listDragging: "_listDragging_15ptp_93",
7328
+ rowOff: "_rowOff_15ptp_101",
7329
+ rowOver: "_rowOver_15ptp_109",
7330
+ ghost: "_ghost_15ptp_119",
7331
+ grip: "_grip_15ptp_134",
7332
+ gripDragging: "_gripDragging_15ptp_144",
7333
+ gripBlocked: "_gripBlocked_15ptp_148",
7334
+ label: "_label_15ptp_152",
7335
+ name: "_name_15ptp_159",
7336
+ error: "_error_15ptp_170",
7337
+ dep: "_dep_15ptp_178",
7338
+ group: "_group_15ptp_186",
7339
+ groupTitle: "_groupTitle_15ptp_191"
6769
7340
  };
6770
7341
  //#endregion
6771
7342
  //#region src/app/layouts/rightbar/panel-mock.ts
@@ -6778,6 +7349,15 @@ window.__ModuleLoader__.load({
6778
7349
  hasCard: true
6779
7350
  };
6780
7351
  }
7352
+ function noCardRow(id, titleKey) {
7353
+ return {
7354
+ id,
7355
+ titleKey,
7356
+ shown: false,
7357
+ source: "user",
7358
+ hasCard: false
7359
+ };
7360
+ }
6781
7361
  function plugin(id, pkg, title, shown) {
6782
7362
  return {
6783
7363
  id,
@@ -6897,6 +7477,20 @@ window.__ModuleLoader__.load({
6897
7477
  on: true
6898
7478
  }
6899
7479
  },
7480
+ {
7481
+ id: "no-card",
7482
+ label: "没看板的模块(只有基座命令那种):也列出来、带「无看板」标签,开关照常能用,只是不参与排序",
7483
+ units: [on, noCardRow(`${id}-c`, `${titleKey}(无看板)`)],
7484
+ capabilities: {
7485
+ ...probe(id, "ok"),
7486
+ ...probe(`${id}-c`, "ok")
7487
+ },
7488
+ expect: {
7489
+ rows: 2,
7490
+ badge: null,
7491
+ on: true
7492
+ }
7493
+ },
6900
7494
  {
6901
7495
  id: "long",
6902
7496
  label: "超长模块名",
@@ -6947,7 +7541,7 @@ window.__ModuleLoader__.load({
6947
7541
  ...probe(`${id}-c`, "ok")
6948
7542
  },
6949
7543
  drag: {
6950
- from: 2,
7544
+ from: 1,
6951
7545
  over: 0,
6952
7546
  at: {
6953
7547
  x: 1230,
@@ -6959,6 +7553,32 @@ window.__ModuleLoader__.load({
6959
7553
  on: true
6960
7554
  }
6961
7555
  },
7556
+ {
7557
+ id: "drag-off",
7558
+ label: "拖到未开启的那一行上:落点不亮(松手也不动)",
7559
+ units: [
7560
+ on,
7561
+ twin,
7562
+ third
7563
+ ],
7564
+ capabilities: {
7565
+ ...probe(id, "ok"),
7566
+ ...probe(`${id}-b`, "ok"),
7567
+ ...probe(`${id}-c`, "ok")
7568
+ },
7569
+ drag: {
7570
+ from: 0,
7571
+ over: null,
7572
+ at: {
7573
+ x: 1230,
7574
+ y: 300
7575
+ }
7576
+ },
7577
+ expect: {
7578
+ rows: 3,
7579
+ on: true
7580
+ }
7581
+ },
6962
7582
  PLUGIN_MOCK
6963
7583
  ];
6964
7584
  }
@@ -6972,6 +7592,22 @@ window.__ModuleLoader__.load({
6972
7592
  function selectPanelUnits(units, capabilities) {
6973
7593
  return units.filter((unit) => available(capabilities?.[unit.id]));
6974
7594
  }
7595
+ function panelDropTarget(rows, index) {
7596
+ if (index === null) return null;
7597
+ const row = rows[index];
7598
+ return row?.shown === true && row.hasCard !== false ? index : null;
7599
+ }
7600
+ function rowAtPoint(boxes, y) {
7601
+ const last = boxes.length - 1;
7602
+ for (let at = 0; at <= last; at += 1) {
7603
+ const box = boxes[at];
7604
+ const next = boxes[at + 1];
7605
+ if (box === void 0) continue;
7606
+ const end = next === void 0 ? box.bottom : next.top;
7607
+ if (y >= box.top && (next === void 0 ? y <= end : y < end)) return at;
7608
+ }
7609
+ return null;
7610
+ }
6975
7611
  function panelBadgeKey(capability) {
6976
7612
  if (capability === void 0 || capability.status === "ok") return void 0;
6977
7613
  if (capability.status === "failed") return "panels.dep.failed";
@@ -6985,6 +7621,7 @@ window.__ModuleLoader__.load({
6985
7621
  id: unit.id,
6986
7622
  titleKey: unit.titleKey,
6987
7623
  plugin: false,
7624
+ hasCard: unit.hasCard,
6988
7625
  ...badge === void 0 ? {} : { badgeKey: badge },
6989
7626
  shown: unit.shown,
6990
7627
  source: unit.source
@@ -7000,7 +7637,8 @@ window.__ModuleLoader__.load({
7000
7637
  };
7001
7638
  }
7002
7639
  function selectPanelRows(units, plugins, capabilities) {
7003
- return [...selectPanelUnits(units, capabilities).map((unit) => moduleRow(unit, capabilities?.[unit.id])), ...plugins.map(pluginRow)];
7640
+ const listed = new Set(plugins.map((plugin) => plugin.id));
7641
+ return [...selectPanelUnits(units, capabilities).filter((unit) => !listed.has(unit.id)).map((unit) => moduleRow(unit, capabilities?.[unit.id])), ...plugins.map(pluginRow)];
7004
7642
  }
7005
7643
  function selectBoardModules(units, byId, capabilities) {
7006
7644
  if (units === null) return [];
@@ -7017,20 +7655,7 @@ window.__ModuleLoader__.load({
7017
7655
  //#endregion
7018
7656
  //#region src/app/layouts/rightbar/PanelRowControls.tsx
7019
7657
  function PanelRowControls({ t, unit, label, busy, onWrite }) {
7020
- return /* @__PURE__ */ h("span", { className: ModulesPage_module_default.rowControls }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Checkbox, {
7021
- checked: unit.source !== "user",
7022
- disabled: busy,
7023
- label: t("panels.followGlobal"),
7024
- title: t("panels.followGlobalHint"),
7025
- className: ModulesPage_module_default.followBox,
7026
- onChange: (next) => onWrite(next ? {
7027
- action: "follow",
7028
- id: unit.id
7029
- } : {
7030
- action: unit.shown ? "show" : "hide",
7031
- id: unit.id
7032
- })
7033
- }), /* @__PURE__ */ h("span", { className: unit.source === "user" ? void 0 : ModulesPage_module_default.switchFollowing }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Switch, {
7658
+ return /* @__PURE__ */ h("span", { className: ModulesPage_module_default.rowControls }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Switch, {
7034
7659
  checked: unit.shown,
7035
7660
  label: `${label} · ${unit.shown ? t("panels.enabled") : t("panels.disabled")}`,
7036
7661
  disabled: busy,
@@ -7038,34 +7663,153 @@ window.__ModuleLoader__.load({
7038
7663
  action: next ? "show" : "hide",
7039
7664
  id: unit.id
7040
7665
  })
7041
- })));
7666
+ }));
7042
7667
  }
7043
7668
  //#endregion
7044
- //#region src/app/layouts/rightbar/PanelPluginRows.tsx
7045
- function PanelPluginRows({ t, rows, busy, onWrite }) {
7669
+ //#region src/app/layouts/rightbar/PanelGroupRows.tsx
7670
+ function PanelGroupRows({ t, rows, titleKey, busy, onWrite }) {
7046
7671
  if (rows.length === 0) return null;
7047
- return /* @__PURE__ */ h("ul", { className: `${ModulesPage_module_default.list} ${ModulesPage_module_default.pluginList}` }, rows.map((row) => /* @__PURE__ */ h("li", {
7048
- className: `${ModulesPage_module_default.row} ${ModulesPage_module_default.pluginRow}`,
7049
- key: row.id
7050
- }, /* @__PURE__ */ h("span", { "aria-hidden": "true" }), /* @__PURE__ */ h("span", { className: ModulesPage_module_default.label }, /* @__PURE__ */ h("span", { className: ModulesPage_module_default.name }, row.title ?? t(row.titleKey ?? row.id)), /* @__PURE__ */ h("span", { className: ModulesPage_module_default.plugin }, t("panels.rowPlugin"))), /* @__PURE__ */ h(PanelRowControls, {
7672
+ 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) => {
7673
+ const title = row.title ?? t(row.titleKey ?? row.id);
7674
+ return /* @__PURE__ */ h("li", {
7675
+ key: row.id,
7676
+ className: `${ModulesPage_module_default.row} ${row.shown ? "" : ModulesPage_module_default.rowOff}`
7677
+ }, /* @__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, {
7678
+ t,
7679
+ unit: row,
7680
+ label: title,
7681
+ busy,
7682
+ onWrite
7683
+ }));
7684
+ })));
7685
+ }
7686
+ //#endregion
7687
+ //#region src/app/layouts/rightbar/use-drag-listeners.ts
7688
+ function useDragListeners(active, handlers) {
7689
+ const latestRef = useRef(handlers);
7690
+ useEffect(() => {
7691
+ latestRef.current = handlers;
7692
+ });
7693
+ useEffect(() => {
7694
+ if (!active) return;
7695
+ const onMove = (event) => latestRef.current.move(event.clientX, event.clientY);
7696
+ const onUp = (event) => latestRef.current.drop(event.clientY);
7697
+ const onCancel = () => latestRef.current.cancel();
7698
+ window.addEventListener("pointermove", onMove);
7699
+ window.addEventListener("pointerup", onUp);
7700
+ window.addEventListener("pointercancel", onCancel);
7701
+ window.addEventListener("blur", onCancel);
7702
+ return () => {
7703
+ window.removeEventListener("pointermove", onMove);
7704
+ window.removeEventListener("pointerup", onUp);
7705
+ window.removeEventListener("pointercancel", onCancel);
7706
+ window.removeEventListener("blur", onCancel);
7707
+ };
7708
+ }, [active]);
7709
+ }
7710
+ //#endregion
7711
+ //#region src/app/layouts/rightbar/ModulesPage.tsx
7712
+ function rowBoxes(list) {
7713
+ return list === null ? [] : Array.from(list.children).map((item) => item.getBoundingClientRect());
7714
+ }
7715
+ function rowClass(row, index, drag) {
7716
+ const parts = [ModulesPage_module_default.row];
7717
+ if (!row.shown) parts.push(ModulesPage_module_default.rowOff);
7718
+ if (drag !== null) parts.push(row.shown ? ModulesPage_module_default.rowDragging : ModulesPage_module_default.rowBlocked);
7719
+ if (drag?.over === index) parts.push(ModulesPage_module_default.rowOver);
7720
+ return parts.join(" ");
7721
+ }
7722
+ function gripClass(drag) {
7723
+ if (drag === null) return ModulesPage_module_default.grip;
7724
+ return `${ModulesPage_module_default.grip} ${drag.over === null ? ModulesPage_module_default.gripBlocked : ModulesPage_module_default.gripDragging}`;
7725
+ }
7726
+ function RowLabel({ t, row }) {
7727
+ 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)));
7728
+ }
7729
+ function PanelRowItem({ t, row, index, drag, handlers, tipEpoch, busy, onWrite }) {
7730
+ return /* @__PURE__ */ h("li", { className: rowClass(row, index, drag) }, row.shown && row.hasCard !== false ? /* @__PURE__ */ h(Tip, {
7731
+ key: tipEpoch,
7732
+ label: t("panels.dragHint"),
7733
+ disabled: drag !== null
7734
+ }, /* @__PURE__ */ h("span", {
7735
+ className: gripClass(drag),
7736
+ "aria-hidden": "true",
7737
+ onPointerDown: (event) => {
7738
+ if (event.button !== 0) return;
7739
+ event.preventDefault();
7740
+ event.currentTarget.setPointerCapture(event.pointerId);
7741
+ handlers.begin(index, event.clientX, event.clientY);
7742
+ }
7743
+ }, "⠿")) : /* @__PURE__ */ h("span", { "aria-hidden": "true" }), /* @__PURE__ */ h(RowLabel, {
7744
+ t,
7745
+ row
7746
+ }), /* @__PURE__ */ h(PanelRowControls, {
7051
7747
  t,
7052
7748
  unit: row,
7053
- label: row.title ?? row.id,
7749
+ label: t(row.titleKey ?? row.id),
7054
7750
  busy,
7055
7751
  onWrite
7056
- }))));
7752
+ }));
7753
+ }
7754
+ function PanelEmpty({ t, onOpenMarket }) {
7755
+ return /* @__PURE__ */ h(CenteredState, {
7756
+ compact: true,
7757
+ icon: null,
7758
+ title: t("panels.noneInstalled"),
7759
+ hint: t("panels.noneInstalledHint"),
7760
+ action: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
7761
+ type: "button",
7762
+ size: "sm",
7763
+ variant: "outline",
7764
+ onClick: onOpenMarket
7765
+ }, t("panels.browseMarket"))
7766
+ });
7767
+ }
7768
+ function DragGhost({ label, at }) {
7769
+ return /* @__PURE__ */ h("div", {
7770
+ className: ModulesPage_module_default.ghost,
7771
+ style: {
7772
+ left: `${at.x + 12}px`,
7773
+ top: `${at.y - 12}px`
7774
+ }
7775
+ }, label);
7776
+ }
7777
+ function ResetConfirmation({ t, open, busy, onCancel, onConfirm }) {
7778
+ const [acknowledged, setAcknowledged] = useState(false);
7779
+ const close = (next) => {
7780
+ setAcknowledged(false);
7781
+ next();
7782
+ };
7783
+ return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.RiskConfirmation, {
7784
+ open,
7785
+ title: t("panels.followAllConfirmTitle"),
7786
+ description: t("panels.followAllConfirmDetail"),
7787
+ acknowledgeLabel: t("panels.followAllConfirmAck"),
7788
+ cancelLabel: t("panels.followAllConfirmNo"),
7789
+ closeLabel: t("panels.followAllConfirmNo"),
7790
+ confirmLabel: t("panels.followAllConfirmYes"),
7791
+ acknowledged,
7792
+ disabled: busy,
7793
+ onAcknowledgedChange: setAcknowledged,
7794
+ onCancel: () => close(onCancel),
7795
+ onConfirm: () => close(onConfirm)
7796
+ });
7057
7797
  }
7058
- //#endregion
7059
- //#region src/app/layouts/rightbar/ModulesPage.tsx
7060
- var BLANK_DRAG_IMAGE = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
7061
7798
  function ModulesPage({ t, units, plugins = [], workspace, capabilities, loading = false, onOpenMarket, mocked = false, mock, own = false }) {
7062
7799
  const [drag, setDrag] = useState(mock?.drag ?? null);
7063
- const [busy, setBusy] = useState(mock?.busy ?? false);
7800
+ const [tipEpoch, setTipEpoch] = useState(0);
7801
+ const [writing, setWriting] = useState(mock?.busy ?? false);
7064
7802
  const [failed, setFailed] = useState(mock?.failed ?? false);
7803
+ const [confirmingReset, setConfirmingReset] = useState(false);
7804
+ const listRef = useRef(null);
7065
7805
  const rows = selectPanelRows(units, plugins, capabilities);
7066
7806
  const modules = rows.filter((row) => !row.plugin);
7807
+ const carded = modules.filter((row) => row.hasCard !== false);
7808
+ const boardless = modules.filter((row) => row.hasCard === false);
7067
7809
  const pluginRows = rows.filter((row) => row.plugin);
7068
7810
  const empty = !loading && rows.length === 0;
7811
+ const settle = useBoardSettle(panelBoardSignature(units, plugins, own));
7812
+ const { busy } = useVisibleBusy(writing || settle.pending, 500);
7069
7813
  const prefWrite = useHostWrite({
7070
7814
  channel: "prefs",
7071
7815
  resource: "panels",
@@ -7073,98 +7817,124 @@ window.__ModuleLoader__.load({
7073
7817
  });
7074
7818
  const write = async (body) => {
7075
7819
  if (mocked) return;
7076
- setBusy(true);
7820
+ setWriting(true);
7077
7821
  setFailed(false);
7822
+ settle.begin();
7078
7823
  const outcome = await prefWrite.send({
7079
7824
  ...body,
7080
7825
  ...workspace === null ? {} : { path: workspace }
7081
7826
  });
7082
- setBusy(false);
7083
- if (!outcome.ok) setFailed(true);
7827
+ setWriting(false);
7828
+ if (!outcome.ok) {
7829
+ settle.clear();
7830
+ setFailed(true);
7831
+ }
7084
7832
  };
7085
7833
  const writeRow = (body) => void write(body);
7086
- const drop = () => {
7834
+ const dropTargetAt = (y) => panelDropTarget(carded, rowAtPoint(rowBoxes(listRef.current), y));
7835
+ const beginDrag = (index, x, y) => {
7836
+ if (carded[index]?.shown !== true) return;
7837
+ setDrag({
7838
+ from: index,
7839
+ over: index,
7840
+ at: {
7841
+ x,
7842
+ y
7843
+ }
7844
+ });
7845
+ };
7846
+ const trackDrag = (x, y) => {
7087
7847
  if (drag === null) return;
7088
- const moved = modules[drag.from];
7848
+ setDrag({
7849
+ from: drag.from,
7850
+ over: dropTargetAt(y),
7851
+ at: {
7852
+ x,
7853
+ y
7854
+ }
7855
+ });
7856
+ };
7857
+ const settleDrag = (y) => {
7858
+ const from = drag?.from;
7089
7859
  setDrag(null);
7090
- if (moved === void 0 || drag.from === drag.over) return;
7860
+ setTipEpoch((epoch) => epoch + 1);
7861
+ if (from === void 0) return;
7862
+ const moved = carded[from];
7863
+ const over = dropTargetAt(y);
7864
+ if (moved === void 0 || over === null || over === from) return;
7091
7865
  write({
7092
7866
  action: "move",
7093
7867
  id: moved.id,
7094
- index: drag.over
7868
+ index: over
7095
7869
  });
7096
7870
  };
7097
- const dragging = drag === null ? void 0 : modules[drag.from];
7098
- return /* @__PURE__ */ h(Fragment, null, drag?.at === void 0 || dragging === void 0 ? null : /* @__PURE__ */ h("div", {
7099
- className: ModulesPage_module_default.ghost,
7100
- style: {
7101
- left: `${drag.at.x + 12}px`,
7102
- top: `${drag.at.y - 12}px`
7103
- }
7104
- }, t(dragging.titleKey ?? dragging.id)), empty ? /* @__PURE__ */ h(CenteredState, {
7105
- compact: true,
7106
- icon: null,
7107
- title: t("panels.noneInstalled"),
7108
- hint: t("panels.noneInstalledHint"),
7109
- action: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
7110
- type: "button",
7111
- size: "sm",
7112
- variant: "outline",
7113
- onClick: onOpenMarket
7114
- }, t("panels.browseMarket"))
7115
- }) : null, modules.length === 0 ? null : /* @__PURE__ */ h("ul", { className: ModulesPage_module_default.list }, modules.map((row, index) => /* @__PURE__ */ h("li", {
7116
- className: `${ModulesPage_module_default.row}${drag?.over === index ? ` ${ModulesPage_module_default.rowOver}` : ""}`,
7871
+ const cancelDrag = () => {
7872
+ setDrag(null);
7873
+ setTipEpoch((epoch) => epoch + 1);
7874
+ };
7875
+ const handlers = {
7876
+ begin: beginDrag,
7877
+ move: trackDrag,
7878
+ drop: settleDrag,
7879
+ cancel: cancelDrag
7880
+ };
7881
+ useDragListeners(drag !== null, handlers);
7882
+ const dragged = drag === null ? void 0 : carded[drag.from];
7883
+ return /* @__PURE__ */ h(Fragment, null, drag?.at === void 0 || dragged === void 0 ? null : /* @__PURE__ */ h(DragGhost, {
7884
+ label: t(dragged.titleKey ?? dragged.id),
7885
+ at: drag.at
7886
+ }), empty ? /* @__PURE__ */ h(PanelEmpty, {
7887
+ t,
7888
+ onOpenMarket
7889
+ }) : null, carded.length === 0 ? null : /* @__PURE__ */ h("ul", {
7890
+ ref: listRef,
7891
+ className: `${ModulesPage_module_default.list}${drag === null ? "" : ` ${ModulesPage_module_default.listDragging}`}`
7892
+ }, carded.map((row, index) => /* @__PURE__ */ h(PanelRowItem, {
7117
7893
  key: row.id,
7118
- draggable: true,
7119
- onDragStart: (event) => {
7120
- const blank = new Image();
7121
- blank.src = BLANK_DRAG_IMAGE;
7122
- event.dataTransfer.setDragImage(blank, 0, 0);
7123
- setDrag({
7124
- from: index,
7125
- over: index,
7126
- at: {
7127
- x: event.clientX,
7128
- y: event.clientY
7129
- }
7130
- });
7131
- },
7132
- onDragOver: (event) => {
7133
- event.preventDefault();
7134
- if (drag !== null) setDrag({
7135
- from: drag.from,
7136
- over: index,
7137
- at: {
7138
- x: event.clientX,
7139
- y: event.clientY
7140
- }
7141
- });
7142
- },
7143
- onDragEnd: drop,
7144
- onDrop: (event) => {
7145
- event.preventDefault();
7146
- drop();
7147
- }
7148
- }, /* @__PURE__ */ h(Tip, { label: t("panels.dragHint") }, /* @__PURE__ */ h("span", {
7149
- className: ModulesPage_module_default.grip,
7150
- "aria-hidden": "true"
7151
- }, "⠿")), /* @__PURE__ */ h("span", { className: ModulesPage_module_default.label }, /* @__PURE__ */ h("span", { className: ModulesPage_module_default.name }, t(row.titleKey ?? row.id)), row.badgeKey === void 0 ? null : /* @__PURE__ */ h("span", { className: ModulesPage_module_default.dep }, t(row.badgeKey))), /* @__PURE__ */ h(PanelRowControls, {
7152
7894
  t,
7153
- unit: row,
7154
- label: t(row.titleKey ?? row.id),
7895
+ row,
7896
+ index,
7897
+ drag,
7898
+ handlers,
7899
+ tipEpoch,
7900
+ busy,
7901
+ onWrite: writeRow
7902
+ }))), /* @__PURE__ */ h(PanelGroupRows, {
7903
+ t,
7904
+ rows: boardless,
7905
+ titleKey: "panels.groupBoardless",
7155
7906
  busy,
7156
7907
  onWrite: writeRow
7157
- })))), /* @__PURE__ */ h(PanelPluginRows, {
7908
+ }), /* @__PURE__ */ h(PanelGroupRows, {
7158
7909
  t,
7159
7910
  rows: pluginRows,
7911
+ titleKey: "panels.groupPlugins",
7160
7912
  busy,
7161
7913
  onWrite: writeRow
7162
- }), /* @__PURE__ */ h(PanelFoot, { text: t("panels.hintEffect") }, own ? /* @__PURE__ */ h("button", {
7914
+ }), own ? /* @__PURE__ */ h(PanelFoot, null, /* @__PURE__ */ h("button", {
7163
7915
  type: "button",
7164
7916
  className: ModulesPage_module_default.reset,
7165
7917
  disabled: busy,
7166
- onClick: () => void write({ action: "reset" })
7167
- }, t("panels.followAll")) : null), failed ? /* @__PURE__ */ h("p", { className: ModulesPage_module_default.error }, t("panels.failed")) : null);
7918
+ onClick: () => setConfirmingReset(true)
7919
+ }, t("panels.followAll"))) : null, /* @__PURE__ */ h(ResetConfirmation, {
7920
+ t,
7921
+ open: confirmingReset,
7922
+ busy,
7923
+ onCancel: () => setConfirmingReset(false),
7924
+ onConfirm: () => {
7925
+ setConfirmingReset(false);
7926
+ write({ action: "reset" });
7927
+ }
7928
+ }), failed ? /* @__PURE__ */ h("p", { className: ModulesPage_module_default.error }, t("panels.failed")) : null);
7929
+ }
7930
+ //#endregion
7931
+ //#region src/app/layouts/rightbar/panel-dismiss.ts
7932
+ function hasOpenModal(scope) {
7933
+ return scope.querySelector("[aria-modal=\"true\"]") !== null;
7934
+ }
7935
+ function dismissPanelByPointer(next, scope, onOpenChange) {
7936
+ if (!next && hasOpenModal(scope)) return;
7937
+ onOpenChange(next);
7168
7938
  }
7169
7939
  //#endregion
7170
7940
  //#region src/app/layouts/rightbar/PanelModules.tsx
@@ -7195,7 +7965,7 @@ window.__ModuleLoader__.load({
7195
7965
  });
7196
7966
  const panelMock = fixturePick.enabled ? fixturePick.current : void 0;
7197
7967
  const mockNonce = fixturePick.nonce;
7198
- (0, _deepseek_ai_dsh_client_ui_primitives.useDismissOnOutsidePointer)(root, open, onOpenChange);
7968
+ (0, _deepseek_ai_dsh_client_ui_primitives.useDismissOnOutsidePointer)(root, open, (next) => dismissPanelByPointer(next, document, onOpenChange));
7199
7969
  const units = enabledUnits?.units ?? [];
7200
7970
  return /* @__PURE__ */ h("div", {
7201
7971
  className: ModulesPage_module_default.trigger,
@@ -7416,6 +8186,54 @@ window.__ModuleLoader__.load({
7416
8186
  }
7417
8187
  };
7418
8188
  }
8189
+ //#endregion
8190
+ //#region src/shared/hooks/panel-state-report.ts
8191
+ var FLUSH_MS = 400;
8192
+ var workspace = null;
8193
+ var timer = null;
8194
+ var pending = /* @__PURE__ */ new Map();
8195
+ function unitOfRoute(route) {
8196
+ const cut = route.indexOf("/");
8197
+ return cut <= 0 ? null : route.slice(0, cut);
8198
+ }
8199
+ function setPanelWorkspace(path) {
8200
+ if (path === workspace) return;
8201
+ const previous = workspace;
8202
+ workspace = path;
8203
+ if (previous !== null) pending.clear();
8204
+ }
8205
+ function reportPanelRead(input) {
8206
+ pending.set(`${input.unit}\u0000${input.route}`, {
8207
+ unit: input.unit,
8208
+ route: input.route,
8209
+ phase: input.phase,
8210
+ at: Date.now(),
8211
+ ...input.error === void 0 ? {} : { error: input.error }
8212
+ });
8213
+ if (timer !== null) return;
8214
+ timer = setTimeout(flush, FLUSH_MS);
8215
+ }
8216
+ function reportPanelCrash(input) {
8217
+ const target = workspace;
8218
+ if (target === null) return;
8219
+ apiPost(`${PANEL_STATE_PATH}/crash`, {
8220
+ workspace: target,
8221
+ unit: input.unit,
8222
+ reason: input.reason,
8223
+ at: Date.now()
8224
+ }).catch(() => void 0);
8225
+ }
8226
+ function flush() {
8227
+ timer = null;
8228
+ const target = workspace;
8229
+ const cards = [...pending.values()];
8230
+ pending.clear();
8231
+ if (target === null || cards.length === 0) return;
8232
+ apiPost(`${PANEL_STATE_PATH}/cards`, {
8233
+ workspace: target,
8234
+ cards
8235
+ }).catch(() => void 0);
8236
+ }
7419
8237
  var Rightbar_module_default = {
7420
8238
  panel: "_panel_135e7_1",
7421
8239
  columns: "_columns_135e7_18",
@@ -7469,7 +8287,7 @@ window.__ModuleLoader__.load({
7469
8287
  onClick: onCollapse
7470
8288
  })))));
7471
8289
  }
7472
- function BoardContent({ top, plan, world, board, twoColumns, panelToken, onPanelRefresh, onNavigate, onOpenMarket, onSummary, onOpenModules, buildModule, t }) {
8290
+ function BoardContent({ top, plan, world, board, twoColumns, panelToken, onPanelRefresh, onNavigate, onOpenMarket, onSummary, onOpenModules, onCardFailure, buildModule, t }) {
7473
8291
  if (top.kind !== "board") {
7474
8292
  const owner = board.stepOwner(top.kind);
7475
8293
  if (owner === void 0) return /* @__PURE__ */ h(CenteredState, {
@@ -7481,7 +8299,8 @@ window.__ModuleLoader__.load({
7481
8299
  key,
7482
8300
  unit: owner.id,
7483
8301
  resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
7484
- t
8302
+ t,
8303
+ onFailure: (reason) => onCardFailure(owner.id, reason)
7485
8304
  }, /* @__PURE__ */ h(ModuleHost, {
7486
8305
  module: owner,
7487
8306
  step: top.kind,
@@ -7514,7 +8333,8 @@ window.__ModuleLoader__.load({
7514
8333
  key,
7515
8334
  unit: module.id,
7516
8335
  resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
7517
- t
8336
+ t,
8337
+ onFailure: (reason) => onCardFailure(module.id, reason)
7518
8338
  }, /* @__PURE__ */ h(ModuleHost, {
7519
8339
  module,
7520
8340
  world,
@@ -7564,6 +8384,16 @@ window.__ModuleLoader__.load({
7564
8384
  [id]: next
7565
8385
  }));
7566
8386
  }, []);
8387
+ const onCardFailure = useCallback((unit, reason) => {
8388
+ reportPanelCrash({
8389
+ unit,
8390
+ reason
8391
+ });
8392
+ }, []);
8393
+ const fixtureMode = mockModeOn(window.location.search) || crashModeOn(window.location.search);
8394
+ useEffect(() => {
8395
+ setPanelWorkspace(fixtureMode ? null : boardWorkspace);
8396
+ }, [boardWorkspace, fixtureMode]);
7567
8397
  const summary = aggregateSummaries(plan.modules.map((entry) => summaries[entry.module.id]).filter((item) => item !== void 0));
7568
8398
  const feedEnabled = plan.modules.length > 0 || plan.reading;
7569
8399
  const shown = state.expanded;
@@ -7629,6 +8459,7 @@ window.__ModuleLoader__.load({
7629
8459
  onOpenMarket: openMarket,
7630
8460
  onSummary,
7631
8461
  onOpenModules: () => setModulesOpen(true),
8462
+ onCardFailure,
7632
8463
  buildModule: props.buildModule,
7633
8464
  t: props.t
7634
8465
  })));
@@ -8129,10 +8960,7 @@ window.__ModuleLoader__.load({
8129
8960
  if (node.blank) return null;
8130
8961
  const primary = statuses[0];
8131
8962
  if (primary === void 0 || primary.state === "idle") return /* @__PURE__ */ h(Fragment, null, renderSlot("sidebar.session.row.leading", { sessionId: node.id }));
8132
- return /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
8133
- state: primary.state,
8134
- size: 10
8135
- }), statuses.map((status) => /* @__PURE__ */ h("span", {
8963
+ return /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: primary.state }), statuses.map((status) => /* @__PURE__ */ h("span", {
8136
8964
  className: "wb-visuallyHidden",
8137
8965
  key: status.label
8138
8966
  }, status.label)));
@@ -8207,6 +9035,21 @@ window.__ModuleLoader__.load({
8207
9035
  function panelLabel(entry) {
8208
9036
  return typeof entry.label === "function" ? entry.label() : entry.label;
8209
9037
  }
9038
+ function addWorkspace(input) {
9039
+ input.add().catch(() => null).then((path) => {
9040
+ if (path === null || path === "") return;
9041
+ input.onBusy(true);
9042
+ input.onFailed(false);
9043
+ input.create(path).catch(() => void 0).then((view) => {
9044
+ input.onBusy(false);
9045
+ if (view?.workspaceId === void 0) {
9046
+ input.onFailed(true);
9047
+ return;
9048
+ }
9049
+ input.onCreated(view.workspaceId);
9050
+ });
9051
+ });
9052
+ }
8210
9053
  function Sidebar(props) {
8211
9054
  const { collapsed, renderSlot, t, useWorkspaces, usePanelInfo } = props;
8212
9055
  const items = useWorkspaces((state) => state.items);
@@ -8216,6 +9059,8 @@ window.__ModuleLoader__.load({
8216
9059
  const sessions = props.useSessions((state) => state);
8217
9060
  const [storedId, setStoredId] = useState(() => selectedProjectId());
8218
9061
  const [panelEntries, setPanelEntries] = useState(() => props.listPanels());
9062
+ const [creating, setCreating] = useState(false);
9063
+ const [createFailed, setCreateFailed] = useState(false);
8219
9064
  useEffect(() => props.subscribePanels(() => setPanelEntries(props.listPanels())), [props]);
8220
9065
  useEffect(() => subscribeProject(() => setStoredId(selectedProjectId())), []);
8221
9066
  const current = items.find((workspace) => workspace.workspaceId === storedId) ?? items[0] ?? null;
@@ -8233,11 +9078,12 @@ window.__ModuleLoader__.load({
8233
9078
  });
8234
9079
  };
8235
9080
  const addProject = () => {
8236
- props.pickDirectory().then((path) => {
8237
- if (path === null || path === "") return;
8238
- props.createWorkspace(path).then((view) => {
8239
- if (view?.workspaceId !== void 0) pickProject(view.workspaceId);
8240
- });
9081
+ addWorkspace({
9082
+ add: props.pickDirectory,
9083
+ create: props.createWorkspace,
9084
+ onBusy: setCreating,
9085
+ onFailed: setCreateFailed,
9086
+ onCreated: pickProject
8241
9087
  });
8242
9088
  };
8243
9089
  const wide = !collapsed;
@@ -8268,14 +9114,20 @@ window.__ModuleLoader__.load({
8268
9114
  size: isWide ? 16 : 18,
8269
9115
  active
8270
9116
  }, { only: id })
8271
- }))), wide ? /* @__PURE__ */ h(ProjectSwitcher, {
9117
+ }))), wide ? /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(ProjectSwitcher, {
8272
9118
  items,
8273
9119
  current,
8274
9120
  onPick: pickProject,
8275
9121
  onAdd: addProject,
8276
9122
  onRename: props.renameWorkspace,
8277
9123
  t
8278
- }) : null, /* @__PURE__ */ h(WorkspaceSection, {
9124
+ }), creating ? /* @__PURE__ */ h("p", {
9125
+ className: "wb-workspaceBusy",
9126
+ role: "status"
9127
+ }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
9128
+ state: "ongoing",
9129
+ size: 12
9130
+ }), t("project.add.busy")) : null, createFailed ? /* @__PURE__ */ h("p", { className: "wb-workspaceError" }, t("project.add.failed")) : null) : null, /* @__PURE__ */ h(WorkspaceSection, {
8279
9131
  t,
8280
9132
  wide,
8281
9133
  onNewSession: () => {
@@ -8314,7 +9166,7 @@ window.__ModuleLoader__.load({
8314
9166
  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";
8315
9167
  //#endregion
8316
9168
  //#region src/shared/styles/sidebar-app.css?raw
8317
- 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}";
9169
+ 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}";
8318
9170
  //#endregion
8319
9171
  //#region src/shared/styles/sidebar.css?raw
8320
9172
  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";
@@ -8401,6 +9253,12 @@ window.__ModuleLoader__.load({
8401
9253
  ...prev.at === void 0 ? {} : { at: prev.at }
8402
9254
  } : { phase: "loading" });
8403
9255
  const flight = requestResource(route, queryRef.current, key);
9256
+ const owner = unitOfRoute(route);
9257
+ if (owner !== null) reportPanelRead({
9258
+ unit: owner,
9259
+ route,
9260
+ phase: "loading"
9261
+ });
8404
9262
  flight.task.then((response) => {
8405
9263
  if (cancelled) return;
8406
9264
  if (response.ok) {
@@ -8409,19 +9267,43 @@ window.__ModuleLoader__.load({
8409
9267
  value: response,
8410
9268
  at: Date.now()
8411
9269
  });
9270
+ if (owner !== null) reportPanelRead({
9271
+ unit: owner,
9272
+ route,
9273
+ phase: "ready"
9274
+ });
8412
9275
  return;
8413
9276
  }
8414
9277
  setState({
8415
9278
  phase: "error",
8416
9279
  error: response.error
8417
9280
  });
9281
+ if (owner !== null) reportPanelRead({
9282
+ unit: owner,
9283
+ route,
9284
+ phase: "error",
9285
+ error: {
9286
+ code: response.error.code,
9287
+ message: response.error.message
9288
+ }
9289
+ });
8418
9290
  }).catch((reason) => {
8419
9291
  if (cancelled) return;
9292
+ const message = reason instanceof Error ? reason.message : String(reason);
8420
9293
  setState({
8421
9294
  phase: "error",
8422
9295
  error: {
8423
9296
  code: "network",
8424
- message: reason instanceof Error ? reason.message : String(reason)
9297
+ message
9298
+ }
9299
+ });
9300
+ if (owner !== null) reportPanelRead({
9301
+ unit: owner,
9302
+ route,
9303
+ phase: "error",
9304
+ error: {
9305
+ code: "network",
9306
+ message
8425
9307
  }
8426
9308
  });
8427
9309
  });
@@ -8690,7 +9572,7 @@ window.__ModuleLoader__.load({
8690
9572
  ...face.messages === void 0 ? {} : { messages: face.messages }
8691
9573
  }));
8692
9574
  }
8693
- var COMPONENT_CSS_MARKER = "\n.wb-activityBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding-top: var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-activityBlock:first-child {\n border-top: none;\n}\n\n.wb-activityBlockHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8);\n}\n\n.wb-activityLine {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-activityLineText {\n flex: none;\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n max-height: var(--wb-len-72);\n overflow-y: auto;\n}\n\n.wb-activityLineAt {\n flex: none;\n margin-left: auto;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-activityLine > .wb-activityLineAt,\n.wb-activityLine > .wb-activityLineActions {\n margin-left: auto;\n}\n\n.wb-activityLine > .wb-activityLineAt + .wb-activityLineActions {\n margin-left: 0;\n}\n\n.wb-activityLineActions {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-activityActionFailed {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-note {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-problem {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-approvalCommand {\n max-width: 100%;\n}\n.wb-approvalPlan {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-approvalHint {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n.wb-approvalRows {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n}\n.wb-approvalRow {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n.wb-approvalLabel {\n flex: none;\n width: var(--wb-len-56);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-approvalValue {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-approvalWarn {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-8) var(--wb-len-20);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-cardTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardMeta {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-cardMeta::before {\n content: '\\00b7';\n margin-right: var(--wb-len-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen ~ .wb-cardRefresh {\n margin-left: 0;\n}\n\n.wb-cardOpen:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh {\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardRefresh:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-cardGear {\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-3);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardGear:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh.wb-spinning svg {\n animation: wb-spin var(--wb-dur-0-9) linear infinite;\n}\n\n.wb-card {\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n flex: none;\n}\n.wb-cardBody {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12);\n}\n.wb-cardBody > :not([data-wb-bleed]) {\n padding-left: var(--wb-len-8);\n padding-right: var(--wb-len-8);\n}\n\n.wb-choiceMenu {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n padding: var(--wb-len-4);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: transparent;\n}\n\n.wb-choiceOption {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-30);\n padding: var(--wb-len-6) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: pointer;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-choiceOptionOn {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-checkbox {\n position: absolute;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.wb-checkboxBox {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xs);\n corner-shape: round;\n color: var(--dsw-alias-label-primary-foreground);\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-choiceOption:hover .wb-checkboxBox {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-checkbox:checked + .wb-checkboxBox {\n border-color: var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n}\n\n.wb-checkbox:disabled + .wb-checkboxBox {\n opacity: 0.5;\n}\n\n.wb-checkbox:focus-visible + .wb-checkboxBox {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}\n\n.wb-choiceOption:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-choiceLabel {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-radio {\n appearance: none;\n -webkit-appearance: none;\n flex: none;\n box-sizing: border-box;\n width: var(--wb-len-12);\n height: var(--wb-len-12);\n margin: 0;\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: 50%;\n corner-shape: round;\n background-color: transparent;\n cursor: pointer;\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-radio:not(:checked):hover {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio:checked {\n border-color: var(--dsw-alias-brand-primary);\n background-image: radial-gradient(\n circle at center,\n var(--dsw-alias-brand-primary) 0 3px,\n transparent 3px\n );\n}\n\n.wb-radio:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n.wb-radio:focus-visible {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}:where(.wb-link) {\n margin-left: var(--wb-len-2);\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n white-space: nowrap;\n vertical-align: baseline;\n}\n\n:where(.wb-link:hover) {\n text-decoration: underline;\n}\n\n:where(.wb-link:focus-visible) {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n.wb-longTask {\n padding-top: var(--wb-len-12);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n.wb-longTaskHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n}\n\n.wb-longTaskLink {\n flex: none;\n}\n\n.wb-longTaskHeadline {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-longTaskProblem {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-longTaskDump {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-longTaskDump pre {\n margin: var(--wb-len-4) 0 0;\n max-height: var(--wb-len-220);\n overflow: auto;\n}\n.wb-mockStrip {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-12);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n flex: none;\n}\n\n.wb-mockNote {\n flex: 1 0 100%;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-14);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-mockChip {\n flex: none;\n padding: var(--wb-len-2) var(--wb-len-7);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: transparent;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-14);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-mockChip:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-mockChipOn {\n border-color: transparent;\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-label-primary-foreground);\n}\n.wb-centered.wb-centeredCompact {\n flex: none;\n min-height: 0;\n gap: var(--wb-len-8);\n padding: var(--wb-len-20) var(--wb-len-16);\n}\n\n.wb-centered.wb-centeredCompact .wb-centeredHero {\n margin-bottom: var(--wb-len-4);\n}\n\n.wb-skeleton {\n display: flex;\n flex-direction: column;\n}\n\n.wb-skeletonRow {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-skeletonRow + .wb-skeletonRow::before {\n content: '';\n align-self: stretch;\n height: var(--wb-len-0-5);\n margin: 0 var(--wb-len-8) var(--wb-len-neg-0-5);\n background: var(--dsw-alias-border-l2);\n}\n\n.wb-skeletonBar {\n display: block;\n height: var(--wb-len-13);\n border-radius: var(--dsw-radius-xs);\n background: var(--dsw-alias-bg-skeleton);\n animation: wb-skeleton-pulse var(--wb-dur-1-4) var(--ds-ease-in-out) infinite;\n}\n\n.wb-skeletonBarTitle {\n width: 62%;\n}\n\n.wb-skeletonBarMeta {\n width: 32%;\n height: var(--wb-len-10);\n}\n\n.wb-skeletonRow:nth-child(2n) .wb-skeletonBarTitle {\n width: 74%;\n}\n\n.wb-skeletonRow:nth-child(3n) .wb-skeletonBarTitle {\n width: 52%;\n}\n\n@keyframes wb-skeleton-pulse {\n 50% {\n opacity: 0.45;\n }\n}\n\n.wb-centered {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: var(--wb-len-14);\n flex: 1;\n min-height: var(--wb-len-240);\n padding: 0 var(--wb-len-24) var(--wb-len-24);\n text-align: center;\n}\n\n.wb-centeredHero {\n display: flex;\n margin-bottom: var(--wb-len-16);\n color: var(--dsw-alias-label-dimmed);\n}\n\n.wb-centeredTitle {\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-centeredHint {\n max-width: var(--wb-len-300);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-centeredDetail {\n max-width: var(--wb-len-320);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-dimmed);\n word-break: break-all;\n}\n\n.wb-centeredAction {\n display: flex;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n@media (prefers-reduced-motion: reduce) {\n .wb-skeletonBar {\n animation: none;\n }}\n\n.wb-row:has(> [data-wb-dot]) {\n grid-template-columns: 84px minmax(0, 1fr);\n}\n.wb-rows {\n display: flex;\n flex-direction: column;\n}\n.wb-row {\n display: grid;\n grid-template-columns: 56px minmax(0, 1fr);\n align-items: baseline;\n gap: var(--wb-len-8);\n padding: var(--wb-len-4) 0;\n}\n.wb-row + .wb-row {\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n.wb-rowKey {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-rowValue {\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-formActions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n}\n.wb-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-1);\n}\n.wb-settingsHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n.wb-settingsTitle {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-stack {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n min-height: 0;\n}\n\n.wb-stateBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-stateBlockTitle {\n margin: 0;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n.wb-stateBlockHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-stateBlockActions {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n.wb-stateBlockResolving {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n.wb-textField {\n box-sizing: border-box;\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n outline: none;\n}\n\n.wb-textField:focus {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-textField[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-textField[aria-invalid='true']:focus {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n:where(.wb-textField) {\n min-height: var(--wb-len-32);\n padding: var(--wb-len-6) var(--wb-len-12);\n}\n.wb-field {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n.wb-fieldLabel {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-fieldHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n._marketList_1v8dy_1 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._marketRow_1v8dy_10 {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--wb-len-14);\n row-gap: var(--wb-len-4);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-lg);\n}\n\n._marketIcon_1v8dy_20 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-40);\n height: var(--wb-len-40);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketMain_1v8dy_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_1v8dy_39 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketDesc_1v8dy_48 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketUsedBy_1v8dy_59 {\n margin-left: var(--wb-len-8);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n opacity: 0.75;\n}\n\n._marketUsedBy_1v8dy_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_1v8dy_39 ._marketVersion_1v8dy_73 {\n margin-left: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n}\n\n._marketVersion_1v8dy_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_1v8dy_73::before {\n content: '';\n display: inline-block;\n width: var(--wb-len-1);\n height: var(--wb-len-10);\n margin: 0 var(--wb-len-8) 0 var(--wb-len-2);\n vertical-align: -1px;\n background: var(--dsw-alias-border-l2);\n}\n\n._marketEnd_1v8dy_95 {\n flex: none;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: var(--wb-len-4);\n}\n\n._marketSwitchSeat_1v8dy_103 {\n display: inline-flex;\n align-items: center;\n}\n\n._marketIconAction_1v8dy_108 {\n width: var(--wb-len-28);\n padding: 0;\n}\n\n._marketActions_1v8dy_113 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketDefaultNote_1v8dy_119 {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._marketSelfDivider_1v8dy_126 {\n height: 0;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_1v8dy_131 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_1v8dy_138 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_1v8dy_144 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_1v8dy_151 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_1v8dy_157 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n\n._marketProgress_1v8dy_164 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-height: var(--wb-len-32);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketNote_1v8dy_174 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-warn-primary);\n overflow-wrap: anywhere;\n}\n\n._marketNotePlain_1v8dy_181 {\n grid-column: 2 / -1;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n overflow-wrap: anywhere;\n}\n\n._marketFailure_1v8dy_189 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._marketEmpty_1v8dy_196 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_1v8dy_201 {\n box-sizing: border-box;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-32);\n padding: 0 clamp(var(--wb-len-24), 4vw, var(--wb-len-48)) var(--wb-len-48);\n overflow-x: hidden;\n overflow-y: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_1v8dy_201 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_1v8dy_219 {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-16);\n padding-top: var(--wb-len-28);\n}\n\n._marketPageTitle_1v8dy_227 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_1v8dy_232 {\n margin: var(--wb-len-4) 0 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketPageTools_1v8dy_238 {\n flex: none;\n align-self: center;\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--wb-len-16);\n}\n\n._marketIconButton_1v8dy_247 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n color: var(--dsw-alias-label-caption);\n cursor: pointer;\n}\n\n._marketIconButton_1v8dy_247:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_1v8dy_247:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_1v8dy_272 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_1v8dy_276 svg {\n animation: _wb-spin_1v8dy_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_1v8dy_280 {\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n border-radius: var(--dsw-radius-md);\n}\n\n._marketEmpty_1v8dy_196 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-64) var(--wb-len-16);\n text-align: center;\n}\n\n._marketChecking_1v8dy_297 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketEmptyTitle_1v8dy_305 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_1v8dy_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._foot_1us83_1 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._footText_1us83_12 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1us83_17 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._wide_1coeb_1 {\n justify-content: center;\n width: 100%;\n height: var(--wb-len-40);\n border-radius: var(--dsw-radius-md);\n}\n\n._dialog_1coeb_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1coeb_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1coeb_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1coeb_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1coeb_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._input_1coeb_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1coeb_45 {\n height: var(--wb-len-32);\n margin-left: var(--wb-len-26);\n padding: 0 var(--wb-len-10);\n}\n\n._options_1coeb_51 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8) var(--wb-len-12);\n}\n\n._guideToggle_1coeb_59 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-4);\n align-self: flex-start;\n margin-top: var(--wb-len-4);\n padding: 0;\n border: 0;\n background: transparent;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._guideToggle_1coeb_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1coeb_59 svg,\n._registryToggle_1coeb_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1coeb_59[aria-expanded='true'] svg,\n._registryToggle_1coeb_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1coeb_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1coeb_78 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n height: var(--wb-len-26);\n padding: 0 var(--wb-len-8) 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n font: inherit;\n font-size: var(--wb-font-12-5);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._registryToggle_1coeb_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1coeb_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1coeb_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1coeb_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1coeb_45 {\n position: fixed;\n z-index: var(--wb-z-1100);\n box-sizing: border-box;\n width: min(var(--wb-len-440), 100vw - var(--wb-len-24));\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-12);\n border: 0;\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-2);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l3);\n box-shadow: var(--dsw-elevation-prominent);\n}\n\n._registryOption_1coeb_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid transparent;\n border-radius: var(--dsw-radius-lg);\n cursor: pointer;\n}\n\nlabel._registryOption_1coeb_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1coeb_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1coeb_143[data-checked='true'] {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, transparent);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._registryOption_1coeb_143 input[type='radio'] {\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: var(--wb-len-2) 0 0;\n accent-color: var(--dsw-alias-brand-primary);\n}\n\n._registryTitle_1coeb_179 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n font: var(--dsw-font-xs-13);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n._registryHint_1coeb_189 {\n margin-left: var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._inputError_1coeb_197 {\n margin: var(--wb-len-neg-4) 0 0 var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._guide_1coeb_59 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._guideList_1coeb_214 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._guideItem_1coeb_223 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0;\n}\n\n._guideIndex_1coeb_230 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: var(--dsw-alias-bg-module-platform);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._guideMain_1coeb_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1coeb_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1coeb_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1coeb_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1coeb_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1coeb_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1coeb_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1coeb_285 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0 var(--wb-len-4);\n text-align: center;\n}\n\n._heroIcon_1coeb_294 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-44);\n height: var(--wb-len-44);\n color: var(--dsw-alias-label-secondary);\n}\n\n._heroIcon_1coeb_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1coeb_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1coeb_311 {\n margin: 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n._wizardTitle_1coeb_319 {\n margin: 0;\n font-size: var(--wb-font-18);\n line-height: var(--wb-len-26);\n font-weight: 600;\n}\n\n._subject_1coeb_326 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\n text-align: center;\n}\n\n._subjectName_1coeb_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1coeb_343,\n._subjectDesc_1coeb_344 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._result_1coeb_351,\n._resultWarn_1coeb_352 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-primary);\n}\n\n._resultWarn_1coeb_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._approval_1coeb_365 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-state-warn-primary);\n border-radius: var(--dsw-radius-lg);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._approvalTitle_1coeb_375 {\n margin: 0;\n font: var(--dsw-font-s-14);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._approvalText_1coeb_382 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1coeb_388 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._note_1coeb_395 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._noteWarn_1coeb_402 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1coeb_406 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1coeb_410 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._detailLabel_1coeb_417 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1coeb_417 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-3);\n font-family: var(--dsw-font-mono, monospace);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n._note_1enlz_1 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-8);\n margin: 0;\n padding: var(--wb-len-10) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-state-warn-tertiary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._note_1enlz_1 > svg {\n flex: none;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-state-warn-primary);\n}\n._actions_jlw8j_1[hidden],\n._progress_jlw8j_2[hidden],\n._commandRow_jlw8j_3[hidden],\n._bridge_jlw8j_4[hidden],\n._raw_jlw8j_5[hidden] {\n display: none;\n}\n\n._gate_jlw8j_9 {\n position: fixed;\n inset: 0;\n z-index: var(--wb-z-top);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--wb-len-24);\n background: var(--dsw-alias-bg-base);\n}\n\n._card_jlw8j_20 {\n width: 100%;\n max-width: var(--wb-len-420);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-16);\n text-align: center;\n}\n\n._card_jlw8j_20:has(._actions_jlw8j_1:not([hidden])),\n._card_jlw8j_20:has(._bridge_jlw8j_4:not([hidden])) {\n max-width: var(--wb-len-520);\n}\n\n._title_jlw8j_35 {\n margin: 0;\n font-size: var(--dsw-font-base-16-font-size);\n line-height: var(--wb-line-24);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._steps_jlw8j_50 {\n list-style: none;\n margin: var(--wb-len-6) 0 0;\n padding: 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n text-align: left;\n}\n\n._step_jlw8j_50 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-6) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._step_jlw8j_50[data-status='running'] {\n color: var(--dsw-alias-label-primary);\n}\n\n._mark_jlw8j_77 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-14);\n height: var(--wb-len-14);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._step_jlw8j_50[data-status='ok'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._step_jlw8j_50[data-status='warn'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._step_jlw8j_50[data-status='failed'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._label_jlw8j_102 {\n flex: none;\n}\n\n._detail_jlw8j_106 {\n margin-left: auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._progress_jlw8j_2 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._elapsed_jlw8j_124 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._error_jlw8j_132 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n max-height: var(--wb-len-120);\n overflow: auto;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n white-space: pre-wrap;\n word-break: break-all;\n text-align: left;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._commandRow_jlw8j_3 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n margin: 0 0 var(--wb-len-8);\n padding-right: var(--wb-len-4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._copy_jlw8j_158 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n padding: 0;\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._copy_jlw8j_158:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._command_jlw8j_3 {\n flex: 1;\n min-width: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-primary);\n}\n\n._buttons_jlw8j_191 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-12);\n}\n\n._mockSlot_jlw8j_198 {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n justify-content: center;\n background: var(--dsw-alias-bg-base);\n}\n\n._button_jlw8j_191 {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n._button_jlw8j_191:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._button_jlw8j_191:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n._actions_jlw8j_1,\n._bridge_jlw8j_4 {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-4);\n padding: var(--wb-len-14) var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-1);\n text-align: left;\n}\n\n._fixTitle_jlw8j_249 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._actions_jlw8j_1 ._hint_jlw8j_43,\n._bridge_jlw8j_4 ._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._actions_jlw8j_1 ._commandRow_jlw8j_3,\n._bridge_jlw8j_4 ._commandRow_jlw8j_3 {\n margin: 0;\n}\n\n._actions_jlw8j_1 ._buttons_jlw8j_191,\n._bridge_jlw8j_4 ._buttons_jlw8j_191 {\n justify-content: flex-start;\n}\n\n._raw_jlw8j_5 {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._rawSummary_jlw8j_282 {\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._actions_jlw8j_1 ._error_jlw8j_132,\n._bridge_jlw8j_4 ._error_jlw8j_132 {\n margin-top: var(--wb-len-6);\n}\n\n._bridgeLines_jlw8j_292 {\n margin: 0;\n padding-left: var(--wb-len-18);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._bridgeLine_jlw8j_292 a {\n display: block;\n margin-top: var(--wb-len-4);\n width: fit-content;\n}\n\n._link_jlw8j_309 {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n\n._link_jlw8j_309::after {\n content: '↗';\n margin-left: var(--wb-len-2);\n}\n\n._link_jlw8j_309:hover {\n text-decoration: underline;\n}\n\n._loading_jlw8j_323 {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._loading_jlw8j_323[hidden] {\n display: none;\n}\n\n._loadingMotion_jlw8j_332 {\n transform-origin: center;\n animation: _wb-spin_jlw8j_1 var(--wb-dur-1-5) linear infinite;\n}\n\n._loadingTrack_jlw8j_337,\n._loadingArc_jlw8j_338 {\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n}\n\n._loadingTrack_jlw8j_337 {\n opacity: 0.25;\n}\n\n._loadingArc_jlw8j_338 {\n stroke-dasharray: 12 150;\n animation: _wb-dash_jlw8j_1 var(--wb-dur-1-5) ease-in-out infinite;\n}\n\n@keyframes _wb-spin_jlw8j_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes _wb-dash_jlw8j_1 {\n 0% {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 24 150;\n stroke-dashoffset: -6;\n }\n to {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._loadingMotion_jlw8j_332,\n ._loadingArc_jlw8j_338 {\n animation: none;\n }\n}\n._group_1hxis_1 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n}\n\n._button_1hxis_7 {\n flex: none;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n}\n\n._button_1hxis_7:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._active_1hxis_19 {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._icon_1hxis_23 {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n._icon_1hxis_23 svg {\n display: block;\n width: var(--wb-len-15);\n height: var(--wb-len-15);\n}\n\n._mirror_1hxis_35 {\n transform: scaleX(-1);\n}\n._stripTabs_1dqp4_1 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n min-width: 0;\n overflow: hidden;\n}\n\n._tab_1dqp4_9 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: none;\n font: inherit;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-16);\n max-width: 100%;\n}\n\n._tabActive_1dqp4_25 {\n color: var(--dsw-alias-label-primary);\n}\n\n._tabQuiet_1dqp4_29 {\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._tabQuiet_1dqp4_29:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._tabTitle_1dqp4_39 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._sep_1dqp4_49 {\n flex: none;\n color: var(--dsw-alias-label-dimmed);\n}\n._trigger_1yptb_1 {\n display: flex;\n align-items: center;\n}\n\n._pop_1yptb_6 {\n position: absolute;\n top: calc(var(--wb-len-38) + var(--wb-len-8));\n right: var(--wb-len-6);\n z-index: var(--wb-z-30);\n width: min(var(--wb-len-360), calc(100% - var(--wb-len-12)));\n max-width: calc(100vw - var(--wb-len-48));\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-2);\n box-shadow: var(--dsw-shadow-lv3);\n overflow: hidden;\n}\n\n._head_1yptb_20 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10) var(--wb-len-12) var(--wb-len-9) var(--wb-len-14);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._title_1yptb_28 {\n flex: 1;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._rowControls_1yptb_36 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._followBox_1yptb_43 {\n font-size: var(--dsw-font-xxxs-11-font-size);\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n._switchFollowing_1yptb_49 {\n opacity: 0.55;\n}\n\n._reset_1yptb_53 {\n flex: none;\n padding: var(--wb-len-3) var(--wb-len-8);\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._reset_1yptb_53:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_1yptb_53:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_1yptb_75 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._row_1yptb_36 {\n position: relative;\n display: grid;\n grid-template-columns: 12px minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-sm);\n cursor: grab;\n}\n\n._row_1yptb_36:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOver_1yptb_99::before {\n content: '';\n position: absolute;\n top: var(--wb-len-neg-3);\n left: var(--wb-len-8);\n right: var(--wb-len-8);\n height: var(--wb-len-2);\n background: var(--dsw-alias-brand-primary);\n}\n\n._ghost_1yptb_109 {\n position: fixed;\n z-index: var(--wb-z-40);\n pointer-events: none;\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--wb-static-shadow-ghost);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n\n._grip_1yptb_124 {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n text-align: center;\n color: var(--dsw-alias-label-tertiary);\n user-select: none;\n}\n\n._label_1yptb_132 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_1yptb_139 {\n min-width: 0;\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n\n._error_1yptb_150 {\n margin: 0;\n padding: 0 var(--wb-len-14) var(--wb-len-10);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._dep_1yptb_158 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n._pluginList_1yptb_166 {\n padding-top: var(--wb-len-6);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._pluginRow_1yptb_171 {\n cursor: default;\n}\n\n._plugin_1yptb_166 {\n flex: none;\n padding: 0 var(--wb-len-6);\n border-radius: var(--wb-radius-6);\n background: var(--dsw-alias-interactive-bg-hover);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n._panel_135e7_1 {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: var(--wb-z-10);\n visibility: hidden;\n}\n\n._panel_135e7_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_135e7_1[data-open] {\n visibility: visible;\n}\n\n._columns_135e7_18 {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n align-items: start;\n gap: var(--wb-len-12);\n}\n\n._columns_135e7_18[data-two] {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n._column_135e7_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._root_1vd78_1 {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}\n\n._anchor_1vd78_7 {\n display: block;\n width: 100%;\n}\n\n._menu_1vd78_12 {\n min-width: var(--wb-len-240);\n max-width: var(--wb-len-360);\n}\n\n._trigger_1vd78_17 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n width: 100%;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n._trigger_1vd78_17:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._trigger_1vd78_17:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._glyph_1vd78_44 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._glyphActive_1vd78_54 {\n color: var(--dsw-alias-state-business-primary);\n}\n\n._triggerName_1vd78_58 {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n._dir_1vd78_69 {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._name_1vd78_77 {\n flex: 0 1 auto;\n max-width: 50%;\n font-size: var(--dsw-font-xxs-12-font-size);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._triggerName_1vd78_58 ._name_1vd78_77 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._chevron_1vd78_90 {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n}\n\n._row_1vd78_96 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n width: 100%;\n min-width: 0;\n}\n\n._trailing_1vd78_104 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n margin-inline-start: auto;\n}\n\n._trailing_1vd78_104 ._rowAction_1vd78_114 {\n width: var(--wb-len-20);\n min-width: var(--wb-len-20);\n height: var(--wb-len-20);\n min-height: var(--wb-len-20);\n padding: 0;\n border-radius: var(--dsw-radius-sm);\n}\n\n._row_1vd78_96 ._name_1vd78_77 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._current_1vd78_127 {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-primary);\n}\n\n._field_1vd78_134 {\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n box-sizing: border-box;\n width: 100%;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._field_1vd78_134:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n}\n\n._searchIcon_1vd78_151 {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._field_1vd78_134 ._search_1vd78_151 {\n flex: 1;\n min-width: 0;\n height: var(--wb-len-24);\n border: none;\n background: transparent;\n}\n\n._field_1vd78_134 ._search_1vd78_151:focus {\n border-color: transparent;\n box-shadow: none;\n}\n._dialog_1vye5_1 {\n width: min(var(--wb-len-420), 100%);\n}\n\n._stack_1vye5_5 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._input_1vye5_12 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-12);\n}\n\n._meta_1vye5_18 {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._blocker_1oaj0_1 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-20) var(--wb-len-16);\n text-align: center;\n}\n\n._icon_1oaj0_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_1oaj0_15 {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_1oaj0_23 {\n margin: 0;\n max-width: var(--wb-len-42em);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n text-wrap: pretty;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 {\n align-items: flex-start;\n gap: var(--wb-len-6);\n padding: var(--wb-len-4) 0 var(--wb-len-2);\n text-align: left;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._title_1oaj0_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._hint_1oaj0_23 {\n max-width: 100%;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._actions_1oaj0_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._raw_1oaj0_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_1oaj0_48 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-6);\n}\n\n._raw_1oaj0_52 {\n margin-top: var(--wb-len-10);\n width: 100%;\n max-width: var(--wb-len-360);\n text-align: left;\n}\n\n._notice_1oaj0_71 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n column-gap: var(--wb-len-10);\n margin: 0 0 var(--wb-len-10);\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-left: 2px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._notice_1oaj0_71._noticeFlat_1oaj0_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_1oaj0_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_1oaj0_98 {\n font-size: var(--wb-font-12-5);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._noticeHint_1oaj0_105 {\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._noticeActions_1oaj0_112 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin-top: var(--wb-len-neg-2);\n}\n\n._failure_1oaj0_119 {\n margin: var(--wb-len-8) 0 0;\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._failureDetail_1oaj0_127 {\n display: block;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-label-tertiary);\n white-space: pre-wrap;\n}\n\n._inlineAction_1oaj0_134 {\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n._inlineAction_1oaj0_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n._rawText_1oaj0_146 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
9575
+ 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*/";
8694
9576
  function workbenchCss() {
8695
9577
  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}`;
8696
9578
  }
@@ -8824,16 +9706,6 @@ window.__ModuleLoader__.load({
8824
9706
  };
8825
9707
  const rightbarHooks = { hooks: { rightbar: observable } };
8826
9708
  const sidebarRight = () => ctx.get("sidebarRight");
8827
- const dshColumn = createDshColumnSource(() => {
8828
- const official = sidebarRight();
8829
- if (official === void 0) return false;
8830
- return official.mounted.getSnapshot() === void 0 || official.isExpanded();
8831
- }, 400);
8832
- let pendingDshOpen = false;
8833
- let pendingOfficialCall;
8834
- let unsubscribeOfficial;
8835
- let restoreOfficial;
8836
- let officialShimmed = false;
8837
9709
  let workbenchColumnArmed = false;
8838
9710
  let disposeWorkbenchColumn;
8839
9711
  const armWorkbenchColumn = () => {
@@ -8855,87 +9727,37 @@ window.__ModuleLoader__.load({
8855
9727
  disposeWorkbenchColumn?.();
8856
9728
  disposeWorkbenchColumn = void 0;
8857
9729
  };
8858
- const flushOfficialCall = () => {
8859
- const official = sidebarRight();
8860
- if (official === void 0 || official.mounted.getSnapshot() === void 0) return;
8861
- if (pendingDshOpen) {
8862
- pendingDshOpen = false;
8863
- if (!official.isExpanded()) official.toggleExpanded();
8864
- }
8865
- const call = pendingOfficialCall;
8866
- pendingOfficialCall = void 0;
8867
- call?.();
8868
- };
8869
- const watchOfficial = () => {
8870
- const official = sidebarRight();
8871
- if (official === void 0 || unsubscribeOfficial !== void 0) return;
8872
- unsubscribeOfficial = official.mounted.subscribe(flushOfficialCall);
8873
- };
8874
- const armDshColumn = () => {
8875
- const official = sidebarRight();
8876
- if (official === void 0) return false;
8877
- if (official.mounted.getSnapshot() !== void 0) {
8878
- if (!official.isExpanded()) official.toggleExpanded();
8879
- return true;
8880
- }
8881
- watchOfficial();
8882
- store.setColumn("dsh");
8883
- ctx.layout.closeRightbar();
8884
- releaseWorkbenchColumn();
8885
- pendingDshOpen = true;
8886
- return false;
8887
- };
8888
- const openInDshColumn = (call) => {
8889
- shimOfficialNavigation();
8890
- if (sidebarRight() === void 0) return;
8891
- if (armDshColumn()) {
8892
- call();
8893
- return;
9730
+ const borrow = createDshBorrow({
9731
+ official: sidebarRight,
9732
+ yieldColumn: () => {
9733
+ store.setColumn("dsh");
9734
+ ctx.layout.closeRightbar();
9735
+ releaseWorkbenchColumn();
9736
+ },
9737
+ reclaimColumn: () => {
9738
+ store.setColumn("workbench");
9739
+ armWorkbenchColumn();
9740
+ store.setExpanded(true);
8894
9741
  }
8895
- pendingOfficialCall = call;
8896
- };
8897
- const shimOfficialNavigation = () => {
8898
- const official = sidebarRight();
8899
- if (official === void 0 || officialShimmed) return;
8900
- const { openResource, openTab } = official;
8901
- if (typeof openResource !== "function" || typeof openTab !== "function") return;
8902
- officialShimmed = true;
8903
- official.openResource = (address, options) => openInDshColumn(() => openResource.call(official, address, options));
8904
- official.openTab = (kind, options) => openInDshColumn(() => openTab.call(official, kind, options));
8905
- restoreOfficial = () => {
8906
- official.openResource = openResource;
8907
- official.openTab = openTab;
8908
- officialShimmed = false;
8909
- };
8910
- };
9742
+ });
9743
+ const dshColumn = createDshColumnSource(() => borrow.open(), 400);
8911
9744
  const selectColumn = (column) => {
8912
9745
  if (store.getSnapshot().column === column) {
8913
9746
  if (column === "workbench") {
8914
9747
  rightbarActions.toggleRightbar();
8915
9748
  return;
8916
9749
  }
8917
- const current = sidebarRight();
8918
- if (current === void 0 || current.mounted.getSnapshot() === void 0) return;
8919
- current.toggleExpanded();
9750
+ borrow.toggle();
8920
9751
  return;
8921
9752
  }
8922
9753
  if (column === "workbench") {
8923
- store.setColumn("workbench");
8924
- pendingDshOpen = false;
8925
- armWorkbenchColumn();
8926
- store.setExpanded(true);
9754
+ borrow.back();
8927
9755
  return;
8928
9756
  }
8929
- openInDshColumn(() => {});
8930
- };
8931
- ctx.effect(() => () => {
8932
- unsubscribeOfficial?.();
8933
- unsubscribeOfficial = void 0;
8934
- restoreOfficial?.();
8935
- restoreOfficial = void 0;
8936
- }, "dsh-workbench: 官方椅面订阅与借道");
8937
- shimOfficialNavigation();
8938
- watchOfficial();
9757
+ borrow.use();
9758
+ };
9759
+ ctx.effect(() => () => borrow.dispose(), "dsh-workbench: 官方椅面订阅与借道");
9760
+ borrow.start();
8939
9761
  if (store.getSnapshot().column === "workbench") armWorkbenchColumn();
8940
9762
  ctx.slots.inject("sidebar", () => ctx.slots.register({
8941
9763
  name: "sidebar",