@dsh-workbench/core 0.2.0 → 0.2.1

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