@dsh-workbench/core 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/client.js +1429 -607
  2. package/dist/client/client.body.js +1429 -607
  3. package/dist/client/index.js +1430 -608
  4. package/dist/host/index.js +712 -158
  5. package/dist/types/app/client.d.ts +168 -81
  6. package/dist/types/app/layouts/__tests__/async-feedback.test.d.ts +1 -0
  7. package/dist/types/app/layouts/market/use-add-module.d.ts +1 -0
  8. package/dist/types/app/layouts/rightbar/MarketView.d.ts +3 -1
  9. package/dist/types/app/layouts/rightbar/{PanelPluginRows.d.ts → PanelGroupRows.d.ts} +3 -2
  10. package/dist/types/app/layouts/rightbar/PanelRowControls.d.ts +0 -1
  11. package/dist/types/app/layouts/rightbar/__tests__/market-catalog.test.d.ts +1 -0
  12. package/dist/types/app/layouts/rightbar/__tests__/market-dots.test.d.ts +1 -0
  13. package/dist/types/app/layouts/rightbar/__tests__/market-state-rules.test.d.ts +1 -0
  14. package/dist/types/app/layouts/rightbar/__tests__/panel-dismiss.test.d.ts +1 -0
  15. package/dist/types/app/layouts/rightbar/__tests__/panel-drag-target.test.d.ts +1 -0
  16. package/dist/types/app/layouts/rightbar/__tests__/panel-write.test.d.ts +1 -0
  17. package/dist/types/app/layouts/rightbar/board-selection.d.ts +9 -0
  18. package/dist/types/app/layouts/rightbar/dsh-borrow.d.ts +15 -0
  19. package/dist/types/app/layouts/rightbar/dsh-borrow.test.d.ts +1 -0
  20. package/dist/types/app/layouts/rightbar/dsh-surface.d.ts +11 -0
  21. package/dist/types/app/layouts/rightbar/dsh-surface.test.d.ts +1 -0
  22. package/dist/types/app/layouts/rightbar/market-installed-mock.d.ts +9 -0
  23. package/dist/types/app/layouts/rightbar/market-mock-types.d.ts +58 -0
  24. package/dist/types/app/layouts/rightbar/market-mock.d.ts +2 -48
  25. package/dist/types/app/layouts/rightbar/market-row-types.d.ts +4 -2
  26. package/dist/types/app/layouts/rightbar/market-rows.d.ts +9 -22
  27. package/dist/types/app/layouts/rightbar/market-section-icon.d.ts +1 -1
  28. package/dist/types/app/layouts/rightbar/market-shared-rows.d.ts +21 -0
  29. package/dist/types/app/layouts/rightbar/panel-dismiss.d.ts +2 -0
  30. package/dist/types/app/layouts/rightbar/panel-mock.d.ts +1 -1
  31. package/dist/types/app/layouts/rightbar/panel-write.d.ts +15 -0
  32. package/dist/types/app/layouts/rightbar/use-drag-listeners.d.ts +6 -0
  33. package/dist/types/app/layouts/sidebar/__tests__/session-row-ui.test.d.ts +1 -0
  34. package/dist/types/app/units/registry.d.ts +4 -1
  35. package/dist/types/modules/panels/__tests__/diy-harness.d.ts +19 -0
  36. package/dist/types/modules/panels/__tests__/diy-report.test.d.ts +1 -0
  37. package/dist/types/modules/panels/__tests__/diy-tools-health.test.d.ts +1 -0
  38. package/dist/types/modules/panels/__tests__/diy-tools-panel.test.d.ts +1 -0
  39. package/dist/types/modules/panels/__tests__/market-tools-harness.d.ts +42 -0
  40. package/dist/types/modules/panels/__tests__/market-workbench-update.test.d.ts +1 -0
  41. package/dist/types/modules/panels/model/config.d.ts +4 -3
  42. package/dist/types/modules/panels/model/diy-report.d.ts +63 -0
  43. package/dist/types/shared/api/host/__tests__/approval-note-injection.test.d.ts +1 -0
  44. package/dist/types/shared/api/host/__tests__/panel-state-route.test.d.ts +1 -0
  45. package/dist/types/shared/api/host/bundle-routes.d.ts +1 -0
  46. package/dist/types/shared/api/host/installed-module.d.ts +2 -0
  47. package/dist/types/shared/api/host/mount-units.d.ts +1 -0
  48. package/dist/types/shared/api/host/release.d.ts +6 -0
  49. package/dist/types/shared/api/host/unit-registry.d.ts +6 -0
  50. package/dist/types/shared/api/unit-manifests.d.ts +1 -0
  51. package/dist/types/shared/components/PanelFoot.d.ts +1 -1
  52. package/dist/types/shared/hooks/panel-state-report.d.ts +13 -0
  53. package/dist/types/shared/hooks/panel-state-report.test.d.ts +1 -0
  54. package/docs/HANDOFF.md +11 -0
  55. package/package.json +2 -2
  56. package/preset/diy.patch.yml +5 -26
  57. package/skills/workbench-module-diy/REVIEW.md +22 -0
  58. package/skills/workbench-module-diy/SKILL.md +3 -1
  59. package/skills/workbench-module-diy/TOOLING.md +2 -0
@@ -419,6 +419,11 @@ function probeKeyOf(error) {
419
419
  if (error === void 0) return null;
420
420
  return error.code === "" ? "unknown" : error.code;
421
421
  }
422
+ //#endregion
423
+ //#region ../shared/dist/api/unit.js
424
+ function hasEnvSupply(manifest) {
425
+ return (manifest.env?.plugins ?? []).length > 0 || (manifest.env?.libs ?? []).length > 0;
426
+ }
422
427
  var SUPPORTED_API_VERSIONS = [1];
423
428
  var DECLARATION_KEYS = [
424
429
  "apiVersion",
@@ -549,15 +554,19 @@ function readDeclaration(subject, raw) {
549
554
  //#endregion
550
555
  //#region ../shared/dist/config/constants.js
551
556
  var PLUGIN_ID = "@dsh-workbench/core";
557
+ var RELEASE_SIBLINGS = ["@dsh-workbench/shared", "@dsh-workbench/module-tools"];
552
558
  var API_PREFIX = "/workbench/api";
553
559
  var PREFS_PREFIX = `${API_PREFIX}/prefs`;
554
560
  var EVENTS_PATH = "/workbench/events";
555
561
  var ACTIONS_PREFIX = `${API_PREFIX}/actions`;
556
562
  var PROVISION_PREFIX = `${API_PREFIX}/provision`;
563
+ var PANEL_STATE_PATH = "panel-state";
564
+ var PANEL_STATE_PREFIX = `${API_PREFIX}/${PANEL_STATE_PATH}`;
557
565
  var OPENCLI_PIN = "1.8.8";
558
566
  var CODING_ISSUES_SERVICE = "workbenchCodingIssues";
559
567
  var PANELS_SERVICE = "workbenchPanels";
560
568
  var UNITS_SERVICE = "workbenchUnits";
569
+ var PANEL_STATE_SERVICE = "workbenchPanelState";
561
570
  var OPENCLI_TIMEOUT_MS = 12e4;
562
571
  var WARM_TIMEOUT_MS = 2e4;
563
572
  var INSTALL_TIMEOUT_MS = 3e5;
@@ -677,7 +686,9 @@ var CardBoundary = class extends Component {
677
686
  return { reason: errorReasonOf(error) };
678
687
  }
679
688
  componentDidCatch(error) {
680
- console.error(`[dsh-workbench] 模块 ${this.props.unit} 渲染失败:${errorReasonOf(error)}`, error);
689
+ const reason = errorReasonOf(error);
690
+ console.error(`[dsh-workbench] 模块 ${this.props.unit} 渲染失败:${reason}`, error);
691
+ this.props.onFailure?.(reason);
681
692
  }
682
693
  componentDidUpdate(previous) {
683
694
  if (previous.resetKey !== this.props.resetKey && this.state.reason !== null) this.setState({ reason: null });
@@ -1220,6 +1231,8 @@ var en = {
1220
1231
  "project.none": "No project",
1221
1232
  "project.empty": "No projects yet. Use “Add project” below.",
1222
1233
  "project.add": "Add project…",
1234
+ "project.add.busy": "Creating the workspace…",
1235
+ "project.add.failed": "Creating the workspace failed",
1223
1236
  "project.search.label": "Search workspaces",
1224
1237
  "project.search.placeholder": "Search workspaces (folder / name / path)",
1225
1238
  "project.search.empty": "No workspace matches “{query}”.",
@@ -1253,18 +1266,22 @@ var en = {
1253
1266
  "time.hours": "{n} h ago",
1254
1267
  "time.days": "{n} d ago",
1255
1268
  "panels.title": "Panel modules",
1256
- "panels.market.defaultNote": "This default covers every workspace that has not changed this row; ones that have keep their own choice.",
1257
- "panels.market.changedBy": "{count} workspaces have already changed this row",
1258
- "panels.market.defaultLabel": "On by default in all workspaces",
1259
- "panels.followGlobal": "Default",
1260
- "panels.followGlobalHint": "This row follows the default board (the switch shows that state). Clicking the switch makes it this project's own choice.",
1269
+ "panels.groupBoardless": "No-board modules",
1270
+ "panels.groupPlugins": "opencli plugins",
1271
+ "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.",
1272
+ "panels.market.defaultLabel": "On by default everywhere",
1273
+ "panels.market.defaultLocked": "Unusable right now — update or uninstall it first",
1261
1274
  "panels.followAll": "Restore the default everywhere",
1275
+ "panels.followAllConfirmTitle": "Restore the default everywhere?",
1276
+ "panels.followAllConfirmDetail": "Every row changed in this workspace goes back to following the global default.",
1277
+ "panels.followAllConfirmAck": "I understand: to set them up for this workspace again, I will have to change them row by row.",
1278
+ "panels.followAllConfirmYes": "Restore",
1279
+ "panels.followAllConfirmNo": "Cancel",
1262
1280
  "panels.enabled": "enabled in this project",
1263
1281
  "panels.disabled": "not enabled in this project",
1264
1282
  "panels.choose": "Choose modules",
1265
1283
  "panels.buildModule": "Build a module",
1266
1284
  "panels.failed": "Could not save the change. Try again.",
1267
- "panels.hintEffect": "Disabling = the agent cannot reach that data",
1268
1285
  "panels.dragHint": "Drag to reorder",
1269
1286
  "panels.unknownStep": "No suite provides this view",
1270
1287
  "panels.labelWithHint": "{label} ({hint})",
@@ -1277,9 +1294,10 @@ var en = {
1277
1294
  "panels.browseMarket": "Browse the module market",
1278
1295
  "panels.noneInstalled": "None of these modules has its plugin installed yet",
1279
1296
  "panels.noneInstalledHint": "Once installed they come back here, and you pick which go on the panel.",
1280
- "panels.rowPlugin": "Plugin",
1281
1297
  "panels.market.installed": "installed",
1282
- "panels.market.outdated": "needs update",
1298
+ "panels.market.notActive": "not active",
1299
+ "panels.market.notUsable": "unusable",
1300
+ "panels.market.broken": "broken",
1283
1301
  "panels.market.hasNew": "New version",
1284
1302
  "panels.market.missing": "not installed",
1285
1303
  "panels.market.unchecked": "unknown",
@@ -1309,16 +1327,17 @@ var en = {
1309
1327
  "panels.market.confirmNo": "Cancel",
1310
1328
  "panels.market.failed": "Failed: {reason}",
1311
1329
  "panels.market.needEnv": "Set {env} in the terminal that started the workbench first",
1330
+ "panels.market.needCommands": "Missing commands: {commands}",
1331
+ "panels.market.localMark": "local",
1332
+ "panels.market.localHint": "This is your machine’s own copy (not taken from the registry).",
1312
1333
  "panels.market.noSource": "This module declares no install method — install it yourself",
1313
1334
  "panels.market.badSource": "The install method is incomplete — install it yourself",
1314
1335
  "panels.market.empty": "No modules available",
1315
- "panels.market.sectionLocal": "Local modules",
1316
- "panels.market.sectionUnlisted": "Not from the market",
1317
1336
  "panels.market.sectionPlugins": "Installed opencli plugins",
1318
1337
  "panels.market.moduleOutdated": "update available",
1319
- "panels.market.moduleRefused": "This module was built for an older version of the workbench, so it does not work here. Update it, or uninstall.",
1338
+ "panels.market.moduleRefused": "This module does not match this workbench, so it cannot be used for now.",
1320
1339
  "panels.market.moduleRefusedDetail": "Why it cannot be used: {reason}",
1321
- "panels.market.moduleRestartHint": "installed but not active — restart dsh once to bring it up",
1340
+ "panels.market.moduleRestartHint": "restart dsh once to bring it up",
1322
1341
  "panels.market.workbenchName": "Workbench",
1323
1342
  "panels.market.workbenchLocal": "This is the copy from your working repository; it does not come from the registry.",
1324
1343
  "panels.market.pluginKeptInUse": "Files kept for now: {names} still uses it.",
@@ -1410,7 +1429,7 @@ var en = {
1410
1429
  "panels.market.add.registryPnpm": "pnpm's own registry",
1411
1430
  "panels.market.add.check": "Check",
1412
1431
  "panels.market.add.checking": "Checking…",
1413
- "panels.market.add.classifying": "Working out what it is…",
1432
+ "panels.market.add.classifying": "Checking…",
1414
1433
  "panels.market.add.change": "Edit",
1415
1434
  "panels.market.add.previewTitle": "About to install",
1416
1435
  "panels.market.add.fieldName": "Package",
@@ -1557,6 +1576,8 @@ var zh = {
1557
1576
  "project.none": "未选择项目",
1558
1577
  "project.empty": "还没有项目。用下面的「添加项目」选一个目录。",
1559
1578
  "project.add": "添加项目…",
1579
+ "project.add.busy": "正在新建工作区…",
1580
+ "project.add.failed": "新建工作区没成功",
1560
1581
  "project.search.label": "搜索工作区",
1561
1582
  "project.search.placeholder": "搜索工作区(目录名 / 中文名 / 路径)",
1562
1583
  "project.search.empty": "没有匹配「{query}」的工作区。",
@@ -1590,18 +1611,22 @@ var zh = {
1590
1611
  "time.hours": "{n} 小时前",
1591
1612
  "time.days": "{n} 天前",
1592
1613
  "panels.title": "面板模块",
1593
- "panels.market.defaultNote": "这份默认给所有没在这一行改过的工作区;改过的保持自己的选择。",
1594
- "panels.market.changedBy": "{count} 个工作区已在这一行改过",
1595
- "panels.market.defaultLabel": "开启后所有工作区默认启用",
1596
- "panels.followGlobal": "默认",
1597
- "panels.followGlobalHint": "这一行跟着默认板走(右边那颗开关显示的就是默认的状态)。点一下开关 = 改成这个项目自己定。",
1614
+ "panels.groupBoardless": "无看板模块",
1615
+ "panels.groupPlugins": "opencli 插件",
1616
+ "panels.market.defaultHint": "打开后所有工作区默认开启,也可在工作区面板配置中单独关闭",
1617
+ "panels.market.defaultLabel": "全局默认开启",
1618
+ "panels.market.defaultLocked": "这份现在用不了,先更新或卸载",
1598
1619
  "panels.followAll": "全部恢复默认",
1620
+ "panels.followAllConfirmTitle": "全部恢复默认?",
1621
+ "panels.followAllConfirmDetail": "这个工作区里改过的每一行都会清掉,之后都跟随全局。",
1622
+ "panels.followAllConfirmAck": "我明白:清掉之后,想再按这个工作区配,得一行一行重新改。",
1623
+ "panels.followAllConfirmYes": "恢复默认",
1624
+ "panels.followAllConfirmNo": "取消",
1599
1625
  "panels.enabled": "这个项目已启用",
1600
1626
  "panels.disabled": "这个项目未启用",
1601
1627
  "panels.choose": "选择模块",
1602
1628
  "panels.buildModule": "造一个模块",
1603
1629
  "panels.failed": "改配置失败了,再试一次。",
1604
- "panels.hintEffect": "停用 = agent 拿不到相关数据",
1605
1630
  "panels.dragHint": "拖动调整顺序",
1606
1631
  "panels.unknownStep": "这一层没有套件提供",
1607
1632
  "panels.labelWithHint": "{label}({hint})",
@@ -1614,9 +1639,10 @@ var zh = {
1614
1639
  "panels.browseMarket": "浏览模块市场",
1615
1640
  "panels.noneInstalled": "这些模块要的插件都还没装",
1616
1641
  "panels.noneInstalledHint": "装好之后它们会回到这里,再由你决定放哪几个上板。",
1617
- "panels.rowPlugin": "插件",
1618
1642
  "panels.market.installed": "已安装",
1619
- "panels.market.outdated": "要更新",
1643
+ "panels.market.notActive": "未生效",
1644
+ "panels.market.notUsable": "不可用",
1645
+ "panels.market.broken": "装坏了",
1620
1646
  "panels.market.hasNew": "有新版本",
1621
1647
  "panels.market.missing": "未装",
1622
1648
  "panels.market.unchecked": "状态未知",
@@ -1646,16 +1672,17 @@ var zh = {
1646
1672
  "panels.market.confirmNo": "取消",
1647
1673
  "panels.market.failed": "没成功:{reason}",
1648
1674
  "panels.market.needEnv": "先在启动工作台的终端里设 {env}",
1675
+ "panels.market.needCommands": "缺这几条命令:{commands}",
1676
+ "panels.market.localMark": "本地",
1677
+ "panels.market.localHint": "本机那份(不从源上取)。",
1649
1678
  "panels.market.noSource": "这个模块没声明怎么装,只能自己动手",
1650
1679
  "panels.market.badSource": "安装方式没写全,只能自己动手",
1651
1680
  "panels.market.empty": "暂无可用模块",
1652
- "panels.market.sectionLocal": "本地模块",
1653
- "panels.market.sectionUnlisted": "不是从市场装的",
1654
1681
  "panels.market.sectionPlugins": "已安装 opencli 插件",
1655
1682
  "panels.market.moduleOutdated": "有新版",
1656
- "panels.market.moduleRefused": "这个模块是给旧版本的工作台写的,现在用不了。更新它,或者卸载。",
1683
+ "panels.market.moduleRefused": "模块版本与工作台不匹配,暂时无法使用",
1657
1684
  "panels.market.moduleRefusedDetail": "装不上的原因:{reason}",
1658
- "panels.market.moduleRestartHint": "装好了但还没生效 —— 重启一次 dsh 就会出来",
1685
+ "panels.market.moduleRestartHint": "重启后生效",
1659
1686
  "panels.market.workbenchName": "工作台",
1660
1687
  "panels.market.workbenchLocal": "这份是本仓正在开发的那一份,不从源上取。",
1661
1688
  "panels.market.pluginKeptInUse": "文件先留着:{names} 还要用它。",
@@ -1747,7 +1774,7 @@ var zh = {
1747
1774
  "panels.market.add.registryPnpm": "pnpm 自己配的源",
1748
1775
  "panels.market.add.check": "预检",
1749
1776
  "panels.market.add.checking": "正在预检…",
1750
- "panels.market.add.classifying": "判定中…",
1777
+ "panels.market.add.classifying": "检测中…",
1751
1778
  "panels.market.add.change": "改一下",
1752
1779
  "panels.market.add.previewTitle": "将要安装",
1753
1780
  "panels.market.add.fieldName": "包名",
@@ -1971,6 +1998,203 @@ function holdBusy(since, now, floorMs) {
1971
1998
  releaseInMs: left
1972
1999
  };
1973
2000
  }
2001
+ var PANEL_STATE_CRASH_WINDOW_MS = 6e5;
2002
+ var PANEL_STATE_MAX_TEXT = 2e3;
2003
+ var PHASES = [
2004
+ "idle",
2005
+ "loading",
2006
+ "ready",
2007
+ "error"
2008
+ ];
2009
+ function asRecord(value) {
2010
+ return typeof value === "object" && value !== null ? value : void 0;
2011
+ }
2012
+ function textOf(value, max) {
2013
+ if (typeof value !== "string") return "";
2014
+ const trimmed = value.trim();
2015
+ return trimmed.length > max ? trimmed.slice(0, max) : trimmed;
2016
+ }
2017
+ function atOf(value) {
2018
+ if (typeof value !== "number" || !Number.isFinite(value)) return null;
2019
+ if (value < 0) return null;
2020
+ return Math.trunc(value);
2021
+ }
2022
+ function errorOf(raw) {
2023
+ const record = asRecord(raw);
2024
+ if (record === void 0) return void 0;
2025
+ const code = textOf(record["code"], 120);
2026
+ const message = textOf(record["message"], PANEL_STATE_MAX_TEXT);
2027
+ if (code === "" && message === "") return void 0;
2028
+ return {
2029
+ code: code === "" ? "unknown" : code,
2030
+ message
2031
+ };
2032
+ }
2033
+ function parseCardsReport(payload) {
2034
+ const record = asRecord(payload);
2035
+ if (record === void 0) return {
2036
+ ok: false,
2037
+ message: "请求体要是一个对象"
2038
+ };
2039
+ const workspace = textOf(record["workspace"], PANEL_STATE_MAX_TEXT);
2040
+ if (workspace === "") return {
2041
+ ok: false,
2042
+ message: "workspace 不能是空的 —— 面板按工作区存"
2043
+ };
2044
+ const raw = record["cards"];
2045
+ if (!Array.isArray(raw)) return {
2046
+ ok: false,
2047
+ message: "cards 要是一个数组"
2048
+ };
2049
+ const cards = [];
2050
+ for (const item of raw.slice(0, 32)) {
2051
+ const card = asRecord(item);
2052
+ if (card === void 0) continue;
2053
+ const unit = textOf(card["unit"], 200);
2054
+ const route = textOf(card["route"], 400);
2055
+ const phase = textOf(card["phase"], 20);
2056
+ const at = atOf(card["at"]);
2057
+ if (unit === "" || route === "" || at === null || !PHASES.includes(phase)) continue;
2058
+ const error = errorOf(card["error"]);
2059
+ cards.push({
2060
+ unit,
2061
+ route,
2062
+ phase,
2063
+ at,
2064
+ ...error === void 0 ? {} : { error }
2065
+ });
2066
+ }
2067
+ if (cards.length === 0) return {
2068
+ ok: false,
2069
+ message: "cards 里没有一条能认的(unit / route / phase / at 都要有)"
2070
+ };
2071
+ return {
2072
+ ok: true,
2073
+ value: {
2074
+ workspace,
2075
+ cards
2076
+ }
2077
+ };
2078
+ }
2079
+ function parseCrashReport(payload) {
2080
+ const record = asRecord(payload);
2081
+ if (record === void 0) return {
2082
+ ok: false,
2083
+ message: "请求体要是一个对象"
2084
+ };
2085
+ const workspace = textOf(record["workspace"], PANEL_STATE_MAX_TEXT);
2086
+ const unit = textOf(record["unit"], 200);
2087
+ const reason = textOf(record["reason"], PANEL_STATE_MAX_TEXT);
2088
+ if (workspace === "") return {
2089
+ ok: false,
2090
+ message: "workspace 不能是空的"
2091
+ };
2092
+ if (unit === "") return {
2093
+ ok: false,
2094
+ message: "unit 不能是空的"
2095
+ };
2096
+ if (reason === "") return {
2097
+ ok: false,
2098
+ message: "reason 不能是空的(没有原因的崩溃没法查)"
2099
+ };
2100
+ return {
2101
+ ok: true,
2102
+ value: {
2103
+ workspace,
2104
+ unit,
2105
+ reason,
2106
+ at: atOf(record["at"]) ?? Date.now()
2107
+ }
2108
+ };
2109
+ }
2110
+ function createPanelStateStore() {
2111
+ const workspaces = /* @__PURE__ */ new Map();
2112
+ function trim(entry, max) {
2113
+ while (entry.size > max) {
2114
+ const oldest = entry.keys().next();
2115
+ if (oldest.done === true) return;
2116
+ entry.delete(oldest.value);
2117
+ }
2118
+ }
2119
+ function workspaceEntryOf(workspace) {
2120
+ const existing = workspaces.get(workspace);
2121
+ if (existing !== void 0) return existing;
2122
+ const created = {
2123
+ at: 0,
2124
+ units: /* @__PURE__ */ new Map()
2125
+ };
2126
+ workspaces.set(workspace, created);
2127
+ trim(workspaces, 64);
2128
+ return created;
2129
+ }
2130
+ function unitEntryOf(entry, unit) {
2131
+ const existing = entry.units.get(unit);
2132
+ if (existing !== void 0) return existing;
2133
+ const created = {
2134
+ at: 0,
2135
+ cards: /* @__PURE__ */ new Map()
2136
+ };
2137
+ entry.units.set(unit, created);
2138
+ return created;
2139
+ }
2140
+ return {
2141
+ cards(report) {
2142
+ const entry = workspaceEntryOf(report.workspace);
2143
+ for (const card of report.cards) {
2144
+ const unit = unitEntryOf(entry, card.unit);
2145
+ unit.cards.delete(card.route);
2146
+ unit.cards.set(card.route, card);
2147
+ trim(unit.cards, 12);
2148
+ if (card.at > unit.at) unit.at = card.at;
2149
+ if (card.at > entry.at) entry.at = card.at;
2150
+ }
2151
+ },
2152
+ crash(report) {
2153
+ const entry = workspaceEntryOf(report.workspace);
2154
+ const unit = unitEntryOf(entry, report.unit);
2155
+ const previous = unit.crash;
2156
+ const counted = previous !== void 0 && previous.reason === report.reason && report.at >= previous.at && report.at - previous.at <= 6e5;
2157
+ unit.crash = {
2158
+ unit: report.unit,
2159
+ reason: report.reason,
2160
+ at: report.at,
2161
+ count: counted ? previous.count + 1 : 1
2162
+ };
2163
+ if (report.at > unit.at) unit.at = report.at;
2164
+ if (report.at > entry.at) entry.at = report.at;
2165
+ },
2166
+ snapshot(workspace) {
2167
+ if (workspace === null) return {
2168
+ workspace: null,
2169
+ at: 0,
2170
+ units: []
2171
+ };
2172
+ const entry = workspaces.get(workspace);
2173
+ if (entry === void 0) return {
2174
+ workspace,
2175
+ at: 0,
2176
+ units: []
2177
+ };
2178
+ const units = [...entry.units.entries()].map(([unit, one]) => {
2179
+ const cards = [...one.cards.values()].sort((a, b) => a.route.localeCompare(b.route));
2180
+ const okAt = cards.reduce((best, card) => card.phase === "ready" && (best === null || card.at > best) ? card.at : best, null);
2181
+ return {
2182
+ unit,
2183
+ at: one.at,
2184
+ okAt,
2185
+ cards,
2186
+ ...one.crash === void 0 ? {} : { crash: one.crash }
2187
+ };
2188
+ });
2189
+ units.sort((a, b) => b.at - a.at || a.unit.localeCompare(b.unit));
2190
+ return {
2191
+ workspace,
2192
+ at: entry.at,
2193
+ units
2194
+ };
2195
+ }
2196
+ };
2197
+ }
1974
2198
  //#endregion
1975
2199
  //#region ../shared/dist/lib/text.js
1976
2200
  function quoteShellArg(value) {
@@ -2056,10 +2280,19 @@ var dist_exports = /* @__PURE__ */ __exportAll({
2056
2280
  PANELS_SERVICE: () => PANELS_SERVICE,
2057
2281
  PANEL_LIST_LIMIT: () => 50,
2058
2282
  PANEL_POLL_MS: () => PANEL_POLL_MS,
2283
+ PANEL_STATE_CRASH_WINDOW_MS: () => PANEL_STATE_CRASH_WINDOW_MS,
2284
+ PANEL_STATE_MAX_CARDS: () => 12,
2285
+ PANEL_STATE_MAX_REPORTS: () => 32,
2286
+ PANEL_STATE_MAX_TEXT: () => PANEL_STATE_MAX_TEXT,
2287
+ PANEL_STATE_MAX_UNITS: () => 64,
2288
+ PANEL_STATE_PATH: () => PANEL_STATE_PATH,
2289
+ PANEL_STATE_PREFIX: () => PANEL_STATE_PREFIX,
2290
+ PANEL_STATE_SERVICE: () => PANEL_STATE_SERVICE,
2059
2291
  PLUGIN_ID: () => PLUGIN_ID,
2060
2292
  PREFS_PREFIX: () => PREFS_PREFIX,
2061
2293
  PROBE_TTL_MS: () => PROBE_TTL_MS,
2062
2294
  PROVISION_PREFIX: () => PROVISION_PREFIX,
2295
+ RELEASE_SIBLINGS: () => RELEASE_SIBLINGS,
2063
2296
  RIGHTBAR_FULLSCREEN_WIDTH: () => 768,
2064
2297
  Row: () => Row,
2065
2298
  Rows: () => Rows,
@@ -2086,6 +2319,7 @@ var dist_exports = /* @__PURE__ */ __exportAll({
2086
2319
  blockerPending: () => blockerPending,
2087
2320
  buildMarker: () => buildMarker,
2088
2321
  createFactChannel: () => createFactChannel,
2322
+ createPanelStateStore: () => createPanelStateStore,
2089
2323
  cx: () => cx,
2090
2324
  declarationProblemsOf: () => declarationProblemsOf,
2091
2325
  decodeRef: () => decodeRef,
@@ -2097,6 +2331,7 @@ var dist_exports = /* @__PURE__ */ __exportAll({
2097
2331
  factOfRoute: () => factOfRoute,
2098
2332
  gateOf: () => gateOf,
2099
2333
  h: () => h,
2334
+ hasEnvSupply: () => hasEnvSupply,
2100
2335
  holdBusy: () => holdBusy,
2101
2336
  isFactScope: () => isFactScope,
2102
2337
  longTaskDot: () => longTaskDot,
@@ -2105,6 +2340,8 @@ var dist_exports = /* @__PURE__ */ __exportAll({
2105
2340
  markerBody: () => markerBody,
2106
2341
  mergeMessages: () => mergeMessages,
2107
2342
  mergeMessagesSkipping: () => mergeMessagesSkipping,
2343
+ parseCardsReport: () => parseCardsReport,
2344
+ parseCrashReport: () => parseCrashReport,
2108
2345
  parseFactFrame: () => parseFactFrame,
2109
2346
  parseJsonLoose: () => parseJsonLoose,
2110
2347
  parseLocalTimestamp: () => parseLocalTimestamp,
@@ -2478,6 +2715,197 @@ function holdBack(installed, roster, active, previous) {
2478
2715
  return pending.filter((unit) => active.has(unit) || fresh.includes(unit));
2479
2716
  }
2480
2717
  //#endregion
2718
+ //#region src/app/layouts/rightbar/market-installed-mock.ts
2719
+ function installedMocks(input) {
2720
+ const { id, found, mine, probe } = input;
2721
+ return [
2722
+ {
2723
+ id: "no-supply",
2724
+ label: "没有环境依赖的模块(供给是基座命令那种):市场里有它这一行",
2725
+ manifests: [found],
2726
+ capabilities: probe(id, "ok"),
2727
+ installed: [{
2728
+ unit: id,
2729
+ pkg: "@dsh-workbench/module-one",
2730
+ installed: "0.1.2"
2731
+ }],
2732
+ expect: {
2733
+ rows: 1,
2734
+ state: "installed",
2735
+ actions: ["uninstall"],
2736
+ installed: 0,
2737
+ shared: 0
2738
+ }
2739
+ },
2740
+ {
2741
+ id: "no-card",
2742
+ label: "没有卡片的模块(只有基座命令那种):市场里有它这一行,有版本、有「更新」",
2743
+ manifests: [{
2744
+ ...found,
2745
+ card: null
2746
+ }],
2747
+ capabilities: probe(id, "ok"),
2748
+ updates: { [id]: {
2749
+ installed: "0.1.2",
2750
+ latest: "0.2.0"
2751
+ } },
2752
+ installed: [{
2753
+ unit: id,
2754
+ pkg: "@dsh-workbench/module-one",
2755
+ installed: "0.1.2"
2756
+ }],
2757
+ expect: {
2758
+ rows: 1,
2759
+ state: "outdated",
2760
+ actions: ["update-bundle", "uninstall"],
2761
+ version: {
2762
+ installed: "0.1.2",
2763
+ latest: "0.2.0"
2764
+ },
2765
+ installed: 0,
2766
+ shared: 0
2767
+ }
2768
+ },
2769
+ {
2770
+ id: "no-env-installed",
2771
+ label: "本机装着、又没有依赖要探(DIY 本地那份那种):写「已安装」,不是「状态未知」",
2772
+ manifests: [{
2773
+ ...found,
2774
+ env: void 0
2775
+ }],
2776
+ capabilities: {},
2777
+ updates: { [id]: { installed: "0.1.2" } },
2778
+ installed: [{
2779
+ unit: id,
2780
+ pkg: "@dsh-workbench/module-one",
2781
+ installed: "0.1.2"
2782
+ }],
2783
+ expect: {
2784
+ rows: 1,
2785
+ state: "installed",
2786
+ actions: ["uninstall"],
2787
+ version: { installed: "0.1.2" },
2788
+ installed: 0
2789
+ }
2790
+ },
2791
+ {
2792
+ id: "local-no-update",
2793
+ label: "本机那份(link: 装的):有「本地」标记、不给「更新」",
2794
+ manifests: [mine],
2795
+ capabilities: probe(id, "ok", { plugins: [{
2796
+ name: "fixture",
2797
+ status: "ok",
2798
+ missing: []
2799
+ }] }),
2800
+ updates: { [id]: {
2801
+ installed: "0.1.0",
2802
+ local: true
2803
+ } },
2804
+ installed: [{
2805
+ unit: id,
2806
+ pkg: "@dsh-workbench/module-one",
2807
+ installed: "0.1.0",
2808
+ local: true
2809
+ }],
2810
+ expect: {
2811
+ rows: 1,
2812
+ state: "installed",
2813
+ actions: ["uninstall"],
2814
+ local: true,
2815
+ version: { installed: "0.1.0" },
2816
+ installed: 0
2817
+ }
2818
+ },
2819
+ {
2820
+ id: "installed-refused",
2821
+ label: "本机装了,但宿主不认它的声明(行上说得出理由)",
2822
+ manifests: [],
2823
+ capabilities: {},
2824
+ installed: [{
2825
+ unit: id,
2826
+ pkg: "@dsh-workbench/module-one",
2827
+ installed: "0.1.2",
2828
+ refused: ["dsh.workbench 缺 apiVersion —— 协议从 v1 起,写 \"apiVersion\": 1"]
2829
+ }],
2830
+ expect: {
2831
+ rows: 0,
2832
+ installed: 1,
2833
+ installedState: "unusable",
2834
+ installedActions: ["remove-bundle"],
2835
+ installedNote: true
2836
+ }
2837
+ },
2838
+ {
2839
+ id: "installed-pending",
2840
+ label: "本机装了、宿主还没加载它(重启一次就会出来)",
2841
+ manifests: [],
2842
+ capabilities: {},
2843
+ installed: [{
2844
+ unit: id,
2845
+ pkg: "@dsh-workbench/module-one",
2846
+ installed: "0.1.2"
2847
+ }],
2848
+ expect: {
2849
+ rows: 0,
2850
+ installed: 1,
2851
+ installedState: "inactive",
2852
+ installedActions: ["remove-bundle"],
2853
+ installedHint: "panels.market.moduleRestartHint"
2854
+ }
2855
+ },
2856
+ {
2857
+ id: "installed-pending-update",
2858
+ label: "本机装了、还没加载 + 源上有新版(给「更新」,也说明要重启)",
2859
+ manifests: [],
2860
+ capabilities: {},
2861
+ installed: [{
2862
+ unit: id,
2863
+ pkg: "@dsh-workbench/module-one",
2864
+ installed: "0.1.0",
2865
+ latest: "0.1.2"
2866
+ }],
2867
+ expect: {
2868
+ rows: 0,
2869
+ installed: 1,
2870
+ installedState: "outdated",
2871
+ installedActions: ["update-bundle", "remove-bundle"],
2872
+ installedHint: "panels.market.moduleRestartHint"
2873
+ }
2874
+ },
2875
+ {
2876
+ id: "installed-confirm",
2877
+ label: "卸载本机模块(还没加载的那种:Modal 确认,标题是包名)",
2878
+ manifests: [],
2879
+ capabilities: {},
2880
+ installed: [{
2881
+ unit: id,
2882
+ pkg: "@dsh-workbench/module-one",
2883
+ installed: "0.1.2"
2884
+ }],
2885
+ confirming: id,
2886
+ expect: {
2887
+ rows: 0,
2888
+ installed: 1,
2889
+ installedState: "inactive",
2890
+ installedActions: ["remove-bundle"]
2891
+ }
2892
+ },
2893
+ {
2894
+ id: "first-paint",
2895
+ label: "刚进页面(检测中:能力与本机清单都还没结论)",
2896
+ manifests: [mine],
2897
+ capabilities: null,
2898
+ installedRead: false,
2899
+ loaded: false,
2900
+ expect: {
2901
+ rows: 1,
2902
+ state: "checking",
2903
+ actions: []
2904
+ }
2905
+ }
2906
+ ];
2907
+ }
2908
+ //#endregion
2481
2909
  //#region src/app/layouts/rightbar/market-mock.ts
2482
2910
  function installable(manifest) {
2483
2911
  return {
@@ -2588,7 +3016,8 @@ function buildMarketMocks(roster) {
2588
3016
  expect: {
2589
3017
  rows: 1,
2590
3018
  state: "outdated",
2591
- actions: ["update", "uninstall"]
3019
+ actions: ["update", "uninstall"],
3020
+ noteKey: "panels.market.needCommands"
2592
3021
  }
2593
3022
  },
2594
3023
  {
@@ -2833,120 +3262,49 @@ function buildMarketMocks(roster) {
2833
3262
  actions: ["uninstall"]
2834
3263
  }
2835
3264
  },
3265
+ ...installedMocks({
3266
+ id,
3267
+ found,
3268
+ mine,
3269
+ probe: probe$1
3270
+ }),
2836
3271
  {
2837
- id: "installed-half",
2838
- label: "本机装了模块,但它没有环境依赖(供给那半没有它)",
2839
- manifests: [found],
3272
+ id: "shared-many",
3273
+ label: "三个模块(同一份安装)",
3274
+ manifests: [
3275
+ mine,
3276
+ twin(mine),
3277
+ {
3278
+ ...twin(mine),
3279
+ id: `${mine.id}-c`
3280
+ }
3281
+ ],
3282
+ capabilities: {
3283
+ ...probe$1(id, "ok"),
3284
+ ...probe$1(secondId, "ok"),
3285
+ ...probe$1(`${mine.id}-c`, "ok")
3286
+ },
3287
+ expect: {
3288
+ rows: 3,
3289
+ state: "installed",
3290
+ actions: ["uninstall"]
3291
+ }
3292
+ },
3293
+ {
3294
+ id: "plugin-outdated",
3295
+ label: "用户装的 opencli 插件:有新版(给更新 / 卸载)",
3296
+ manifests: [],
2840
3297
  capabilities: {},
2841
- installed: [{
2842
- unit: id,
2843
- pkg: "@dsh-workbench/module-one",
2844
- installed: "0.1.2"
3298
+ plugins: [{
3299
+ pkg: "opencli-plugin-cmdb",
3300
+ name: "cmdb",
3301
+ installed: "1.0.24",
3302
+ latest: "1.0.25"
2845
3303
  }],
2846
3304
  expect: {
2847
3305
  rows: 0,
2848
- installed: 1,
2849
- installedActions: ["remove-bundle"]
2850
- }
2851
- },
2852
- {
2853
- id: "installed-half-update",
2854
- label: "本机装了模块 + 源上有新版(给「更新」,装完要重启)",
2855
- manifests: [found],
2856
- capabilities: {},
2857
- installed: [{
2858
- unit: id,
2859
- pkg: "@dsh-workbench/module-one",
2860
- installed: "0.1.0",
2861
- latest: "0.1.2"
2862
- }],
2863
- expect: {
2864
- rows: 0,
2865
- installed: 1,
2866
- installedActions: ["update-bundle", "remove-bundle"]
2867
- }
2868
- },
2869
- {
2870
- id: "installed-client-refused",
2871
- label: "本机装了,但浏览器这半没挂上(拒因由客户端报告)",
2872
- manifests: [found],
2873
- capabilities: {},
2874
- installed: [{
2875
- unit: id,
2876
- pkg: "@dsh-workbench/module-one",
2877
- installed: "0.1.2",
2878
- clientRefused: [`宿主没有担保 unit「${id}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]
2879
- }],
2880
- expect: {
2881
- rows: 0,
2882
- installed: 1,
2883
- installedActions: ["remove-bundle"],
2884
- installedNote: true
2885
- }
2886
- },
2887
- {
2888
- id: "installed-confirm",
2889
- label: "卸载本机模块(Modal 确认,标题带模块名)",
2890
- manifests: [found],
2891
- capabilities: {},
2892
- installed: [{
2893
- unit: id,
2894
- pkg: "@dsh-workbench/module-one",
2895
- installed: "0.1.2"
2896
- }],
2897
- confirming: id,
2898
- expect: {
2899
- rows: 0,
2900
- installed: 1,
2901
- installedActions: ["remove-bundle"]
2902
- }
2903
- },
2904
- {
2905
- id: "first-paint",
2906
- label: "刚进页面(检测中:能力与本机清单都还没结论)",
2907
- manifests: [found],
2908
- capabilities: null,
2909
- installedRead: false,
2910
- loaded: false,
2911
- expect: { rows: 0 }
2912
- },
2913
- {
2914
- id: "shared-many",
2915
- label: "三个模块(同一份安装)",
2916
- manifests: [
2917
- mine,
2918
- twin(mine),
2919
- {
2920
- ...twin(mine),
2921
- id: `${mine.id}-c`
2922
- }
2923
- ],
2924
- capabilities: {
2925
- ...probe$1(id, "ok"),
2926
- ...probe$1(secondId, "ok"),
2927
- ...probe$1(`${mine.id}-c`, "ok")
2928
- },
2929
- expect: {
2930
- rows: 3,
2931
- state: "installed",
2932
- actions: ["uninstall"]
2933
- }
2934
- },
2935
- {
2936
- id: "plugin-outdated",
2937
- label: "用户装的 opencli 插件:有新版(给更新 / 卸载)",
2938
- manifests: [],
2939
- capabilities: {},
2940
- plugins: [{
2941
- pkg: "opencli-plugin-cmdb",
2942
- name: "cmdb",
2943
- installed: "1.0.24",
2944
- latest: "1.0.25"
2945
- }],
2946
- expect: {
2947
- rows: 0,
2948
- plugins: 1,
2949
- pluginActions: ["update-plugin", "uninstall-plugin"]
3306
+ plugins: 1,
3307
+ pluginActions: ["update-plugin", "uninstall-plugin"]
2950
3308
  }
2951
3309
  },
2952
3310
  {
@@ -2997,6 +3355,7 @@ function buildMarketMocks(roster) {
2997
3355
  expect: {
2998
3356
  rows: 0,
2999
3357
  plugins: 1,
3358
+ pluginState: "broken",
3000
3359
  pluginActions: ["uninstall-plugin"],
3001
3360
  pluginNoteKey: "panels.market.pluginBroken"
3002
3361
  }
@@ -3168,6 +3527,7 @@ function createClientUnitRegistry(options = {}) {
3168
3527
  const listeners = /* @__PURE__ */ new Set();
3169
3528
  const board = createBoardRegistry();
3170
3529
  let known = /* @__PURE__ */ new Map();
3530
+ let installableIds = null;
3171
3531
  let revision = 0;
3172
3532
  let manifestsCache;
3173
3533
  function notify() {
@@ -3178,9 +3538,10 @@ function createClientUnitRegistry(options = {}) {
3178
3538
  console.warn(`[dsh-workbench] 套件注册的订阅者报错(不影响其它订阅者与这次注册):${String(error)}`);
3179
3539
  }
3180
3540
  }
3181
- function warnRefusal(unit, reasons) {
3541
+ function warnRefusal(unit, kind, reasons) {
3182
3542
  refusals.push({
3183
3543
  unit,
3544
+ kind,
3184
3545
  reasons
3185
3546
  });
3186
3547
  console.warn(`[dsh-workbench] ${unit === "" ? "这个模块" : unit} 的卡片没挂上:${reasons.join(";")}`);
@@ -3207,7 +3568,7 @@ function createClientUnitRegistry(options = {}) {
3207
3568
  register(face) {
3208
3569
  const unit = typeof face?.unit === "string" ? face.unit.trim() : "";
3209
3570
  if (unit === "") {
3210
- warnRefusal("", ["registerUnit({ unit, card }) 里的 unit 是空的 —— U1b 之前的旧形状是 registerUnit({ manifest, card });现在清单由外壳从**已装清单**读出来、按 unit 交给浏览器(ADR-0038 §2.2)"]);
3571
+ warnRefusal("", "old-shape", ["registerUnit({ unit, card }) 里的 unit 是空的 —— U1b 之前的旧形状是 registerUnit({ manifest, card });现在清单由外壳从**已装清单**读出来、按 unit 交给浏览器(ADR-0038 §2.2)"]);
3211
3572
  notify();
3212
3573
  return () => {};
3213
3574
  }
@@ -3220,7 +3581,7 @@ function createClientUnitRegistry(options = {}) {
3220
3581
  registrations.push(entry);
3221
3582
  manifestsCache = void 0;
3222
3583
  if (!attach(entry)) {
3223
- warnRefusal(unit, [`宿主没有担保 unit「${unit}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]);
3584
+ warnRefusal(unit, "no-manifest", [`宿主没有担保 unit「${unit}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]);
3224
3585
  options.onUnknownUnit?.(unit);
3225
3586
  }
3226
3587
  notify();
@@ -3240,8 +3601,10 @@ function createClientUnitRegistry(options = {}) {
3240
3601
  return manifestsCache;
3241
3602
  },
3242
3603
  refusals: () => refusals,
3243
- setManifests(manifests) {
3604
+ installable: () => installableIds,
3605
+ setManifests(manifests, installable) {
3244
3606
  known = new Map(manifests.map((manifest) => [manifest.id, manifest]));
3607
+ installableIds = installable === void 0 ? null : new Set(installable);
3245
3608
  let changed = false;
3246
3609
  for (const entry of registrations) {
3247
3610
  const next = known.get(entry.unit);
@@ -3251,7 +3614,7 @@ function createClientUnitRegistry(options = {}) {
3251
3614
  }
3252
3615
  if (next === void 0) {
3253
3616
  detach(entry);
3254
- warnRefusal(entry.unit, [`宿主不再担保 unit「${entry.unit}」的清单(模块被卸了?)—— 这张卡片先摘下来`]);
3617
+ warnRefusal(entry.unit, "withdrawn", [`宿主不再担保 unit「${entry.unit}」的清单(模块被卸了?)—— 这张卡片先摘下来`]);
3255
3618
  changed = true;
3256
3619
  }
3257
3620
  }
@@ -3371,6 +3734,103 @@ function fixtureSeed(roster, all, crash = false) {
3371
3734
  return crash ? [...boardModuleOf(CRASH_FACE), ...base] : base;
3372
3735
  }
3373
3736
  //#endregion
3737
+ //#region src/app/layouts/rightbar/market-shared-rows.ts
3738
+ var SHARED_STATE_KEY = {
3739
+ checking: "panels.market.checking",
3740
+ installed: "panels.market.sharedOk",
3741
+ outdated: "panels.market.sharedOutdated",
3742
+ unsatisfied: "panels.market.sharedUnsatisfied",
3743
+ missing: "panels.market.sharedMissing",
3744
+ unchecked: "panels.market.unchecked"
3745
+ };
3746
+ var SHARED_DOT = {
3747
+ checking: "ongoing",
3748
+ installed: "done",
3749
+ outdated: "warning",
3750
+ unsatisfied: "warning",
3751
+ missing: "idle",
3752
+ unchecked: "idle"
3753
+ };
3754
+ function sharedActions(row) {
3755
+ return [...row.canUpdate ? ["update-dependency"] : []];
3756
+ }
3757
+ var SHARED_RANK = {
3758
+ checking: -1,
3759
+ unchecked: 0,
3760
+ installed: 1,
3761
+ outdated: 2,
3762
+ unsatisfied: 3,
3763
+ missing: 4
3764
+ };
3765
+ function sharedRows(manifests, capabilities) {
3766
+ const catalog = manifests.filter((manifest) => (manifest.env?.plugins ?? []).length > 0 || (manifest.env?.libs ?? []).length > 0);
3767
+ const byId = new Map(catalog.map((manifest) => [manifest.id, manifest]));
3768
+ const buckets = /* @__PURE__ */ new Map();
3769
+ const bucketOf = (kind, name, label, purpose) => {
3770
+ const id = `${kind}:${name}`;
3771
+ const found = buckets.get(id);
3772
+ if (found !== void 0) return found;
3773
+ const created = {
3774
+ kind,
3775
+ name,
3776
+ label,
3777
+ users: [],
3778
+ states: [],
3779
+ ...purpose === void 0 ? {} : { purpose }
3780
+ };
3781
+ buckets.set(id, created);
3782
+ return created;
3783
+ };
3784
+ for (const manifest of catalog) {
3785
+ const capability = capabilities?.[manifest.id];
3786
+ const released = capability?.released === true;
3787
+ for (const need of manifest.env?.plugins ?? []) {
3788
+ const source = need.installSource;
3789
+ const bucket = bucketOf("plugin", need.name, source?.kind === "npm" ? source.package : need.name);
3790
+ if (released) continue;
3791
+ bucket.users.push(manifest.id);
3792
+ const state = capability?.plugins?.find((item) => item.name === need.name);
3793
+ bucket.states.push(state === void 0 ? "unchecked" : state.status === "ok" ? "installed" : state.status);
3794
+ if (state?.release !== void 0) {
3795
+ bucket.installed ??= state.release.installed;
3796
+ bucket.latest ??= state.release.latest;
3797
+ }
3798
+ bucket.command ??= state?.command;
3799
+ }
3800
+ for (const need of manifest.env?.libs ?? []) {
3801
+ const bucket = bucketOf("lib", need.name, need.name, need.purpose);
3802
+ if (released) continue;
3803
+ bucket.users.push(manifest.id);
3804
+ const state = capability?.libs?.find((item) => item.name === need.name);
3805
+ bucket.states.push(state === void 0 ? "unchecked" : state.status === "ok" ? "installed" : state.status);
3806
+ bucket.installed ??= state?.installed;
3807
+ bucket.latest ??= state?.latest;
3808
+ bucket.command ??= state?.command;
3809
+ }
3810
+ }
3811
+ const rows = [];
3812
+ for (const bucket of buckets.values()) {
3813
+ if (bucket.users.length === 0) continue;
3814
+ const state = capabilities === null ? "checking" : bucket.states.reduce((soFar, item) => SHARED_RANK[item] > SHARED_RANK[soFar] ? item : soFar, "unchecked");
3815
+ const version = bucket.installed === void 0 && bucket.latest === void 0 ? void 0 : {
3816
+ ...bucket.installed === void 0 ? {} : { installed: bucket.installed },
3817
+ ...bucket.latest === void 0 ? {} : { latest: bucket.latest }
3818
+ };
3819
+ const detail = bucket.purpose === void 0 ? void 0 : `${bucket.label} —— ${bucket.purpose}`;
3820
+ rows.push({
3821
+ id: `${bucket.kind}:${bucket.name}`,
3822
+ kind: bucket.kind,
3823
+ label: bucket.label,
3824
+ usedByKeys: bucket.users.map((unit) => byId.get(unit)?.card?.titleKey ?? unit),
3825
+ state,
3826
+ canUpdate: state === "outdated" || state === "unsatisfied",
3827
+ ...version === void 0 ? {} : { version },
3828
+ ...detail === void 0 ? {} : { detail }
3829
+ });
3830
+ }
3831
+ return rows;
3832
+ }
3833
+ //#endregion
3374
3834
  //#region src/app/layouts/rightbar/market-workbench-row.ts
3375
3835
  var WORKBENCH_ROW_ID = "workbench:self";
3376
3836
  var WORKBENCH_TITLE_KEY = "panels.market.workbenchName";
@@ -3408,7 +3868,10 @@ function workbenchRow(version) {
3408
3868
  var MARKET_STATE_KEY = {
3409
3869
  checking: "panels.market.checking",
3410
3870
  installed: "panels.market.installed",
3411
- outdated: "panels.market.outdated",
3871
+ inactive: "panels.market.notActive",
3872
+ unusable: "panels.market.notUsable",
3873
+ broken: "panels.market.broken",
3874
+ outdated: "panels.market.moduleOutdated",
3412
3875
  missing: "panels.market.missing",
3413
3876
  unchecked: "panels.market.unchecked",
3414
3877
  unknown: "panels.market.unchecked"
@@ -3416,6 +3879,9 @@ var MARKET_STATE_KEY = {
3416
3879
  var MARKET_DOT = {
3417
3880
  checking: "ongoing",
3418
3881
  installed: "done",
3882
+ inactive: "error",
3883
+ unusable: "error",
3884
+ broken: "error",
3419
3885
  outdated: "warning",
3420
3886
  missing: "idle",
3421
3887
  unchecked: "idle",
@@ -3425,8 +3891,9 @@ function marketRowTitle(row, t) {
3425
3891
  return row.label ?? t(row.titleKey);
3426
3892
  }
3427
3893
  function withClientRefusals(modules, refusals) {
3428
- if (refusals.length === 0) return modules;
3429
- const byUnit = new Map(refusals.map((one) => [one.unit, one.reasons]));
3894
+ const refused = refusals.filter((one) => one.kind !== "no-manifest");
3895
+ if (refused.length === 0) return modules;
3896
+ const byUnit = new Map(refused.map((one) => [one.unit, one.reasons]));
3430
3897
  return modules.map((module) => {
3431
3898
  const reasons = byUnit.get(module.unit);
3432
3899
  return reasons === void 0 ? module : {
@@ -3455,15 +3922,16 @@ function installedRows(modules, manifests, listed, known, defaults = /* @__PURE_
3455
3922
  const rows = [];
3456
3923
  for (const module of modules) {
3457
3924
  if (listed.has(module.unit)) continue;
3458
- const latest = module.latest;
3925
+ const latest = module.local === true ? void 0 : module.latest;
3459
3926
  const outdated = latest !== void 0 && latest !== module.installed;
3460
3927
  const loaded = titles.has(module.unit);
3461
3928
  const refused = refusalReasons(module.refused, module.clientRefused);
3929
+ const pending = !loaded && refused.length === 0;
3462
3930
  rows.push({
3463
3931
  id: module.unit,
3464
3932
  titleKey: titles.get(module.unit) ?? known?.get(module.unit) ?? module.pkg,
3465
- state: outdated ? "outdated" : "installed",
3466
- ...loaded || refused.length > 0 ? {} : { hint: "panels.market.moduleRestartHint" },
3933
+ state: outdated ? "outdated" : refused.length > 0 ? "unusable" : pending ? "inactive" : "installed",
3934
+ ...pending ? { hint: "panels.market.moduleRestartHint" } : {},
3467
3935
  ...refused.length === 0 ? {} : { note: {
3468
3936
  key: "panels.market.moduleRefused",
3469
3937
  params: { reason: refused.join(";") }
@@ -3487,6 +3955,10 @@ function installedRows(modules, manifests, listed, known, defaults = /* @__PURE_
3487
3955
  }
3488
3956
  return rows;
3489
3957
  }
3958
+ var SWITCH_LOCKED = /* @__PURE__ */ new Set(["unusable", "broken"]);
3959
+ function marketSwitchLocked(row) {
3960
+ return SWITCH_LOCKED.has(row.state);
3961
+ }
3490
3962
  function marketActions$1(row) {
3491
3963
  if (row.workbench === true) return row.canUpdate ? ["update-workbench"] : [];
3492
3964
  if (row.plugin === true) return [...row.canUpdate ? ["update-plugin"] : [], ...row.canUninstall ? ["uninstall-plugin"] : []];
@@ -3496,8 +3968,8 @@ function marketActions$1(row) {
3496
3968
  ...row.canUninstall ? [row.pkg === void 0 ? "uninstall" : "remove-bundle"] : []
3497
3969
  ];
3498
3970
  }
3499
- function stateOf(capability) {
3500
- if (capability === void 0) return "unknown";
3971
+ function stateOf(capability, manifest, installed) {
3972
+ if (capability === void 0) return installed && !hasEnvSupply(manifest) ? "installed" : "unknown";
3501
3973
  if (capability.released === true) return "missing";
3502
3974
  if (capability.status === "missing-plugin") return "missing";
3503
3975
  if (capability.status === "unchecked") return "unchecked";
@@ -3513,8 +3985,9 @@ function envNameOf(source) {
3513
3985
  if (source.kind === "npm") return source.registryEnv;
3514
3986
  return "";
3515
3987
  }
3516
- function noteOf$1(state, install, manifest) {
3988
+ function noteOf$1(state, capability, manifest) {
3517
3989
  if (state === "installed") return void 0;
3990
+ const install = capability?.install;
3518
3991
  if (install === "env-missing") return {
3519
3992
  key: "panels.market.needEnv",
3520
3993
  params: { env: envNameOf((manifest.env?.plugins ?? []).find((need) => envNameOf(need.installSource) !== "")?.installSource) }
@@ -3527,9 +4000,19 @@ function noteOf$1(state, install, manifest) {
3527
4000
  key: "panels.market.badSource",
3528
4001
  params: {}
3529
4002
  };
4003
+ const missing = capability?.missing ?? [];
4004
+ if (state === "outdated" && missing.length > 0) return {
4005
+ key: "panels.market.needCommands",
4006
+ params: { commands: missing.join("、") },
4007
+ tone: "plain"
4008
+ };
3530
4009
  }
3531
4010
  function isOnMachine(state) {
3532
- return state === "installed" || state === "outdated";
4011
+ return state === "installed" || state === "outdated" || state === "inactive" || state === "unusable" || state === "broken";
4012
+ }
4013
+ function marketCatalog(manifests, installable) {
4014
+ if (installable === void 0 || installable === null) return manifests.filter(hasEnvSupply);
4015
+ return manifests.filter((manifest) => installable.has(manifest.id));
3533
4016
  }
3534
4017
  function liveManifests(manifests, capabilities, installed) {
3535
4018
  if (capabilities === null || installed === null) return manifests;
@@ -3543,10 +4026,14 @@ function marketHasUpdates(rows, shared = []) {
3543
4026
  function marketUpdatesOf(modules) {
3544
4027
  if (modules === null) return {};
3545
4028
  const next = {};
3546
- for (const module of modules) next[module.unit] = {
3547
- installed: module.installed,
3548
- ...module.latest === void 0 ? {} : { latest: module.latest }
3549
- };
4029
+ for (const module of modules) {
4030
+ const local = module.local === true;
4031
+ next[module.unit] = {
4032
+ installed: module.installed,
4033
+ ...local || module.latest === void 0 ? {} : { latest: module.latest },
4034
+ ...local ? { local: true } : {}
4035
+ };
4036
+ }
3550
4037
  return next;
3551
4038
  }
3552
4039
  function marketHintVisible(manifests, capabilities, modules, workbench) {
@@ -3567,16 +4054,16 @@ function marketSections(rows) {
3567
4054
  }]];
3568
4055
  }
3569
4056
  function marketRows(manifests, capabilities, updates = {}, defaults = /* @__PURE__ */ new Set(), changed = {}) {
3570
- const catalog = manifests.filter((manifest) => (manifest.env?.plugins ?? []).length > 0 || (manifest.env?.libs ?? []).length > 0);
3571
4057
  const rows = [];
3572
- for (const manifest of catalog) {
4058
+ for (const manifest of manifests) {
3573
4059
  const capability = capabilities?.[manifest.id];
3574
4060
  const install = capability?.install;
3575
- const state = capabilities === null ? "checking" : stateOf(capability);
3576
- const note = noteOf$1(state, install, manifest);
4061
+ const entry = updates[manifest.id];
4062
+ const local = entry?.local === true;
4063
+ const state = capabilities === null ? "checking" : stateOf(capability, manifest, entry !== void 0);
4064
+ const note = noteOf$1(state, capability, manifest);
3577
4065
  const onMachine = isOnMachine(state);
3578
4066
  const reAdopt = capability?.released === true && install === void 0;
3579
- const entry = updates[manifest.id];
3580
4067
  const moduleUpdate = entry === void 0 || entry.latest === void 0 || entry.latest === entry.installed ? void 0 : {
3581
4068
  installed: entry.installed,
3582
4069
  latest: entry.latest
@@ -3594,107 +4081,13 @@ function marketRows(manifests, capabilities, updates = {}, defaults = /* @__PURE
3594
4081
  } },
3595
4082
  ...moduleUpdate === void 0 ? {} : { moduleUpdate },
3596
4083
  ...moduleUpdate === void 0 ? note === void 0 ? {} : { note } : {},
4084
+ ...local ? { local: true } : {},
3597
4085
  defaultShown: defaults.has(manifest.id),
3598
4086
  defaultChanged: changed[manifest.id] ?? 0
3599
4087
  });
3600
4088
  }
3601
4089
  return rows;
3602
4090
  }
3603
- var SHARED_STATE_KEY = {
3604
- checking: "panels.market.checking",
3605
- installed: "panels.market.sharedOk",
3606
- outdated: "panels.market.sharedOutdated",
3607
- unsatisfied: "panels.market.sharedUnsatisfied",
3608
- missing: "panels.market.sharedMissing",
3609
- unchecked: "panels.market.unchecked"
3610
- };
3611
- var SHARED_DOT = {
3612
- checking: "ongoing",
3613
- installed: "done",
3614
- outdated: "warning",
3615
- unsatisfied: "warning",
3616
- missing: "idle",
3617
- unchecked: "idle"
3618
- };
3619
- function sharedActions(row) {
3620
- return [...row.canUpdate ? ["update-dependency"] : []];
3621
- }
3622
- var SHARED_RANK = {
3623
- checking: -1,
3624
- unchecked: 0,
3625
- installed: 1,
3626
- outdated: 2,
3627
- unsatisfied: 3,
3628
- missing: 4
3629
- };
3630
- function sharedRows(manifests, capabilities) {
3631
- const catalog = manifests.filter((manifest) => (manifest.env?.plugins ?? []).length > 0 || (manifest.env?.libs ?? []).length > 0);
3632
- const byId = new Map(catalog.map((manifest) => [manifest.id, manifest]));
3633
- const buckets = /* @__PURE__ */ new Map();
3634
- const bucketOf = (kind, name, label, purpose) => {
3635
- const id = `${kind}:${name}`;
3636
- const found = buckets.get(id);
3637
- if (found !== void 0) return found;
3638
- const created = {
3639
- kind,
3640
- name,
3641
- label,
3642
- users: [],
3643
- states: [],
3644
- ...purpose === void 0 ? {} : { purpose }
3645
- };
3646
- buckets.set(id, created);
3647
- return created;
3648
- };
3649
- for (const manifest of catalog) {
3650
- const capability = capabilities?.[manifest.id];
3651
- const released = capability?.released === true;
3652
- for (const need of manifest.env?.plugins ?? []) {
3653
- const source = need.installSource;
3654
- const bucket = bucketOf("plugin", need.name, source?.kind === "npm" ? source.package : need.name);
3655
- if (released) continue;
3656
- bucket.users.push(manifest.id);
3657
- const state = capability?.plugins?.find((item) => item.name === need.name);
3658
- bucket.states.push(state === void 0 ? "unchecked" : state.status === "ok" ? "installed" : state.status);
3659
- if (state?.release !== void 0) {
3660
- bucket.installed ??= state.release.installed;
3661
- bucket.latest ??= state.release.latest;
3662
- }
3663
- bucket.command ??= state?.command;
3664
- }
3665
- for (const need of manifest.env?.libs ?? []) {
3666
- const bucket = bucketOf("lib", need.name, need.name, need.purpose);
3667
- if (released) continue;
3668
- bucket.users.push(manifest.id);
3669
- const state = capability?.libs?.find((item) => item.name === need.name);
3670
- bucket.states.push(state === void 0 ? "unchecked" : state.status === "ok" ? "installed" : state.status);
3671
- bucket.installed ??= state?.installed;
3672
- bucket.latest ??= state?.latest;
3673
- bucket.command ??= state?.command;
3674
- }
3675
- }
3676
- const rows = [];
3677
- for (const bucket of buckets.values()) {
3678
- if (bucket.users.length === 0) continue;
3679
- const state = capabilities === null ? "checking" : bucket.states.reduce((soFar, item) => SHARED_RANK[item] > SHARED_RANK[soFar] ? item : soFar, "unchecked");
3680
- const version = bucket.installed === void 0 && bucket.latest === void 0 ? void 0 : {
3681
- ...bucket.installed === void 0 ? {} : { installed: bucket.installed },
3682
- ...bucket.latest === void 0 ? {} : { latest: bucket.latest }
3683
- };
3684
- const detail = bucket.purpose === void 0 ? void 0 : `${bucket.label} —— ${bucket.purpose}`;
3685
- rows.push({
3686
- id: `${bucket.kind}:${bucket.name}`,
3687
- kind: bucket.kind,
3688
- label: bucket.label,
3689
- usedByKeys: bucket.users.map((unit) => byId.get(unit)?.card?.titleKey ?? unit),
3690
- state,
3691
- canUpdate: state === "outdated" || state === "unsatisfied",
3692
- ...version === void 0 ? {} : { version },
3693
- ...detail === void 0 ? {} : { detail }
3694
- });
3695
- }
3696
- return rows;
3697
- }
3698
4091
  //#endregion
3699
4092
  //#region src/shared/hooks/use-host-write.ts
3700
4093
  var use_host_write_exports = /* @__PURE__ */ __exportAll({ useHostWrite: () => useHostWrite });
@@ -3748,6 +4141,42 @@ function useHostWrite(options) {
3748
4141
  };
3749
4142
  }
3750
4143
  //#endregion
4144
+ //#region src/shared/hooks/use-visible-busy.ts
4145
+ var use_visible_busy_exports = /* @__PURE__ */ __exportAll({
4146
+ busyView: () => busyView,
4147
+ heldPhase: () => heldPhase,
4148
+ useVisibleBusy: () => useVisibleBusy
4149
+ });
4150
+ function heldPhase(phase, refreshing) {
4151
+ return refreshing && phase === "ready" ? "loading" : phase;
4152
+ }
4153
+ function busyView(active, visible) {
4154
+ return {
4155
+ busy: visible,
4156
+ settling: visible && !active
4157
+ };
4158
+ }
4159
+ function useVisibleBusy(active, floorMs) {
4160
+ const [visible, setVisible] = useState(active);
4161
+ const since = useRef(null);
4162
+ useEffect(() => {
4163
+ if (active) {
4164
+ if (since.current === null) since.current = Date.now();
4165
+ setVisible(true);
4166
+ return;
4167
+ }
4168
+ const held = holdBusy(since.current, Date.now(), floorMs);
4169
+ since.current = null;
4170
+ if (!held.visible) {
4171
+ setVisible(false);
4172
+ return;
4173
+ }
4174
+ const timer = setTimeout(() => setVisible(false), held.releaseInMs);
4175
+ return () => clearTimeout(timer);
4176
+ }, [active, floorMs]);
4177
+ return busyView(active, visible);
4178
+ }
4179
+ //#endregion
3751
4180
  //#region src/app/layouts/rightbar/market-plugin-rows.ts
3752
4181
  function installedPluginKept(value) {
3753
4182
  if (typeof value !== "object" || value === null) return void 0;
@@ -3789,16 +4218,14 @@ function installedPluginRows(plugins, defaults = /* @__PURE__ */ new Set(), chan
3789
4218
  titleKey: plugin.pkg,
3790
4219
  label: name,
3791
4220
  plugin: true,
3792
- state: outdated ? "outdated" : "installed",
4221
+ state: outdated ? "outdated" : plugin.broken === true ? "broken" : "installed",
3793
4222
  canInstall: false,
3794
4223
  canUpdate: outdated,
3795
4224
  canUninstall: true,
3796
4225
  ...plugin.local === true ? { local: true } : {},
3797
4226
  ...plugin.broken === true ? { broken: true } : {},
3798
- ...plugin.broken === true ? {} : {
3799
- defaultShown: defaults.has(id),
3800
- defaultChanged: changed[id] ?? 0
3801
- },
4227
+ defaultShown: defaults.has(id),
4228
+ defaultChanged: changed[id] ?? 0,
3802
4229
  ...note === void 0 ? {} : { note },
3803
4230
  ...plugin.installed === void 0 ? {} : { versionLabel: `${plugin.pkg}@${plugin.installed}` },
3804
4231
  pkg: plugin.pkg,
@@ -3810,42 +4237,42 @@ function installedPluginRows(plugins, defaults = /* @__PURE__ */ new Set(), chan
3810
4237
  });
3811
4238
  }
3812
4239
  var MarketPage_module_default = {
3813
- marketList: "_marketList_1v8dy_1",
3814
- marketRow: "_marketRow_1v8dy_10",
3815
- marketIcon: "_marketIcon_1v8dy_20",
3816
- marketMain: "_marketMain_1v8dy_32",
3817
- marketName: "_marketName_1v8dy_39",
3818
- marketDesc: "_marketDesc_1v8dy_48",
3819
- marketUsedBy: "_marketUsedBy_1v8dy_59",
3820
- marketVersion: "_marketVersion_1v8dy_73",
3821
- marketEnd: "_marketEnd_1v8dy_95",
3822
- marketSwitchSeat: "_marketSwitchSeat_1v8dy_103",
3823
- marketIconAction: "_marketIconAction_1v8dy_108",
3824
- marketActions: "_marketActions_1v8dy_113",
3825
- marketDefaultNote: "_marketDefaultNote_1v8dy_119",
3826
- marketSelfDivider: "_marketSelfDivider_1v8dy_126",
3827
- marketSection: "_marketSection_1v8dy_131",
3828
- marketSectionHead: "_marketSectionHead_1v8dy_138",
3829
- marketSectionIcon: "_marketSectionIcon_1v8dy_144",
3830
- marketSectionTitle: "_marketSectionTitle_1v8dy_151",
3831
- marketSectionCount: "_marketSectionCount_1v8dy_157",
3832
- marketProgress: "_marketProgress_1v8dy_164",
3833
- marketNote: "_marketNote_1v8dy_174",
3834
- marketNotePlain: "_marketNotePlain_1v8dy_181",
3835
- marketFailure: "_marketFailure_1v8dy_189",
3836
- marketEmpty: "_marketEmpty_1v8dy_196",
3837
- marketPage: "_marketPage_1v8dy_201",
3838
- marketPageHead: "_marketPageHead_1v8dy_219",
3839
- marketPageTitle: "_marketPageTitle_1v8dy_227",
3840
- marketPageIntro: "_marketPageIntro_1v8dy_232",
3841
- marketPageTools: "_marketPageTools_1v8dy_238",
3842
- marketIconButton: "_marketIconButton_1v8dy_247",
3843
- marketIconWrap: "_marketIconWrap_1v8dy_272",
3844
- marketIconButtonSpinning: "_marketIconButtonSpinning_1v8dy_276",
3845
- "wb-spin": "_wb-spin_1v8dy_1",
3846
- marketAddButton: "_marketAddButton_1v8dy_280",
3847
- marketChecking: "_marketChecking_1v8dy_297",
3848
- marketEmptyTitle: "_marketEmptyTitle_1v8dy_305"
4240
+ marketList: "_marketList_csyus_1",
4241
+ marketRow: "_marketRow_csyus_10",
4242
+ marketIcon: "_marketIcon_csyus_20",
4243
+ marketMain: "_marketMain_csyus_32",
4244
+ marketName: "_marketName_csyus_39",
4245
+ marketDesc: "_marketDesc_csyus_48",
4246
+ marketUsedBy: "_marketUsedBy_csyus_59",
4247
+ marketVersion: "_marketVersion_csyus_73",
4248
+ marketLocalTag: "_marketLocalTag_csyus_95",
4249
+ marketEnd: "_marketEnd_csyus_106",
4250
+ marketSwitchSeat: "_marketSwitchSeat_csyus_113",
4251
+ marketActions: "_marketActions_csyus_126",
4252
+ marketUpdateAction: "_marketUpdateAction_csyus_132",
4253
+ marketSelfDivider: "_marketSelfDivider_csyus_138",
4254
+ marketSection: "_marketSection_csyus_143",
4255
+ marketSectionHead: "_marketSectionHead_csyus_150",
4256
+ marketSectionIcon: "_marketSectionIcon_csyus_156",
4257
+ marketSectionTitle: "_marketSectionTitle_csyus_163",
4258
+ marketSectionCount: "_marketSectionCount_csyus_169",
4259
+ marketProgress: "_marketProgress_csyus_176",
4260
+ marketNote: "_marketNote_csyus_186",
4261
+ marketNotePlain: "_marketNotePlain_csyus_193",
4262
+ marketFailure: "_marketFailure_csyus_201",
4263
+ marketEmpty: "_marketEmpty_csyus_208",
4264
+ marketPage: "_marketPage_csyus_213",
4265
+ marketPageHead: "_marketPageHead_csyus_231",
4266
+ marketPageTitle: "_marketPageTitle_csyus_239",
4267
+ marketPageIntro: "_marketPageIntro_csyus_244",
4268
+ marketPageTools: "_marketPageTools_csyus_250",
4269
+ marketIconButton: "_marketIconButton_csyus_259",
4270
+ marketIconWrap: "_marketIconWrap_csyus_284",
4271
+ marketIconButtonSpinning: "_marketIconButtonSpinning_csyus_288",
4272
+ "wb-spin": "_wb-spin_csyus_1",
4273
+ marketAddButton: "_marketAddButton_csyus_292",
4274
+ marketChecking: "_marketChecking_csyus_309",
4275
+ marketEmptyTitle: "_marketEmptyTitle_csyus_317"
3849
4276
  };
3850
4277
  //#endregion
3851
4278
  //#region src/app/layouts/rightbar/MarketStates.tsx
@@ -3866,7 +4293,6 @@ function marketSectionIcon(kind) {
3866
4293
  case "installed": return h(IconModules, { size: SIZE$1 });
3867
4294
  case "pending": return h(_deepseek_ai_dsh_client_ui_primitives.IconDownloadOutlineRegular, { size: SIZE$1 });
3868
4295
  case "plugins": return h(_deepseek_ai_dsh_client_ui_primitives.IconCordisPluginOutlineRegular, { size: SIZE$1 });
3869
- case "local": return h(_deepseek_ai_dsh_client_ui_primitives.IconFolderOpenOutlineRegular, { size: SIZE$1 });
3870
4296
  case "shared": return h(_deepseek_ai_dsh_client_ui_primitives.IconLinkOutlineRegular, { size: SIZE$1 });
3871
4297
  }
3872
4298
  }
@@ -3980,20 +4406,67 @@ function SharedSection({ t, rows, pending, failureOf, act }) {
3980
4406
  }))));
3981
4407
  }
3982
4408
  //#endregion
4409
+ //#region src/app/layouts/rightbar/panel-write.ts
4410
+ var PANEL_SETTLE_MS = 4e3;
4411
+ function rowKey(row) {
4412
+ return `${row.id}:${row.shown ? "1" : "0"}:${row.source}`;
4413
+ }
4414
+ function rowKeys(rows) {
4415
+ return rows.map(rowKey).join(",");
4416
+ }
4417
+ function panelBoardSignature(units, plugins, own) {
4418
+ return `${rowKeys(units)}|${rowKeys(plugins)}|${own ? "1" : "0"}`;
4419
+ }
4420
+ function machineBoardSignature(defaults, changed) {
4421
+ const counts = Object.entries(changed).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0).map(([id, count]) => `${id}:${String(count)}`);
4422
+ return `${[...defaults].sort().join(",")}|${counts.join(",")}`;
4423
+ }
4424
+ function nextPending(pending, signature) {
4425
+ return pending !== null && pending !== signature ? null : pending;
4426
+ }
4427
+ function useBoardSettle(signature) {
4428
+ const [held, setHeld] = useState(null);
4429
+ useEffect(() => {
4430
+ setHeld((current) => nextPending(current, signature));
4431
+ }, [signature]);
4432
+ useEffect(() => {
4433
+ if (held === null) return void 0;
4434
+ const timer = setTimeout(() => setHeld(null), PANEL_SETTLE_MS);
4435
+ return () => clearTimeout(timer);
4436
+ }, [held]);
4437
+ return {
4438
+ pending: held !== null,
4439
+ begin: () => setHeld(signature),
4440
+ clear: () => setHeld(null)
4441
+ };
4442
+ }
4443
+ //#endregion
3983
4444
  //#region src/app/layouts/rightbar/market-section.tsx
4445
+ var dangerActions = [
4446
+ "uninstall",
4447
+ "remove-bundle",
4448
+ "uninstall-plugin"
4449
+ ];
4450
+ var updateActions = [
4451
+ "update",
4452
+ "update-bundle",
4453
+ "update-plugin",
4454
+ "update-workbench"
4455
+ ];
3984
4456
  function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
3985
4457
  const running = pending !== null && pending.id === row.id ? pending : null;
3986
4458
  const locked = pending !== null;
3987
4459
  const quiet = row.workbench === true && row.state === "installed" && row.hint === void 0;
3988
4460
  const actions = marketActions$1(row);
3989
- const stateText = t(row.moduleUpdate === void 0 ? MARKET_STATE_KEY[row.state] : "panels.market.moduleOutdated");
4461
+ const switchLocked = marketSwitchLocked(row);
4462
+ const stateText = t(MARKET_STATE_KEY[row.state]);
3990
4463
  return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
3991
4464
  className: MarketPage_module_default.marketIcon,
3992
4465
  "aria-hidden": "true"
3993
4466
  }, 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", {
3994
4467
  from: row.version.installed,
3995
4468
  to: row.version.latest
3996
- }) : row.version.installed ?? row.version.latest ?? "")), quiet ? null : /* @__PURE__ */ h("span", {
4469
+ }) : 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", {
3997
4470
  className: MarketPage_module_default.marketDesc,
3998
4471
  role: "img",
3999
4472
  "aria-label": stateText
@@ -4003,39 +4476,29 @@ function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
4003
4476
  }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4004
4477
  state: MARKET_DOT[row.state],
4005
4478
  size: 9
4006
- }), 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, {
4007
- checked: row.defaultShown,
4008
- disabled: boardBusy === true || locked,
4009
- label: `${marketRowTitle(row, t)} · ${t("panels.market.defaultLabel")}`,
4010
- onChange: (next) => onDefault?.(next)
4011
- }))), running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4479
+ }), 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, {
4012
4480
  state: "ongoing",
4013
4481
  size: 14
4014
4482
  }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => {
4015
- const danger = action === "uninstall" || action === "remove-bundle" || action === "uninstall-plugin";
4016
- const label = t(ACTION_LABEL_KEY[action]);
4017
- if (!danger) return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
4483
+ const danger = dangerActions.includes(action);
4484
+ const update = updateActions.includes(action);
4485
+ return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
4018
4486
  key: action,
4019
4487
  type: "button",
4020
4488
  size: "sm",
4021
4489
  variant: action === "install" ? "primary" : "outline",
4490
+ className: danger ? "wb-dangerAction" : update ? MarketPage_module_default.marketUpdateAction : void 0,
4491
+ icon: danger ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutlineRegular, { size: 13 }) : void 0,
4492
+ "aria-label": danger ? t("panels.market.uninstallLabel", { name: marketRowTitle(row, t) }) : void 0,
4022
4493
  disabled: locked,
4023
4494
  onClick: () => onAct(action)
4024
- }, label);
4025
- return /* @__PURE__ */ h(Tip, {
4026
- key: action,
4027
- label
4028
- }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
4029
- type: "button",
4030
- size: "sm",
4031
- variant: "ghost",
4032
- className: `wb-dangerAction ${MarketPage_module_default.marketIconAction}`,
4033
- icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconTrashOutlineRegular, { size: 14 }),
4034
- "aria-label": t("panels.market.uninstallLabel", { name: marketRowTitle(row, t) }),
4035
- disabled: locked,
4036
- onClick: () => onAct(action)
4037
- }));
4038
- }))), row.note === void 0 ? null : /* @__PURE__ */ h("div", {
4495
+ }, t(ACTION_LABEL_KEY[action]));
4496
+ })), 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, {
4497
+ checked: row.defaultShown,
4498
+ disabled: boardBusy === true || locked || switchLocked,
4499
+ label: `${marketRowTitle(row, t)} · ${t("panels.market.defaultLabel")}`,
4500
+ onChange: (next) => onDefault?.(next)
4501
+ })))), row.note === void 0 ? null : /* @__PURE__ */ h("div", {
4039
4502
  className: row.note.tone === "plain" ? MarketPage_module_default.marketNotePlain : MarketPage_module_default.marketNote,
4040
4503
  title: row.note.params.reason === void 0 ? void 0 : t("panels.market.moduleRefusedDetail", row.note.params)
4041
4504
  }, t(row.note.key, row.note.params)), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
@@ -4315,14 +4778,14 @@ function marketActOf(options) {
4315
4778
  };
4316
4779
  }
4317
4780
  var PanelFoot_module_default = {
4318
- foot: "_foot_1us83_1",
4319
- footText: "_footText_1us83_12",
4320
- footTextMd: "_footTextMd_1us83_17"
4781
+ foot: "_foot_1ud1j_1",
4782
+ footText: "_footText_1ud1j_13",
4783
+ footTextMd: "_footTextMd_1ud1j_18"
4321
4784
  };
4322
4785
  //#endregion
4323
4786
  //#region src/shared/components/PanelFoot.tsx
4324
4787
  function PanelFoot({ text, size = "sm", children }) {
4325
- 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);
4788
+ 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);
4326
4789
  }
4327
4790
  //#endregion
4328
4791
  //#region src/app/layouts/rightbar/MarketView.tsx
@@ -4331,7 +4794,6 @@ var CONFIRM_UNINSTALL = [
4331
4794
  "remove-bundle",
4332
4795
  "uninstall-plugin"
4333
4796
  ];
4334
- var CONFIRM_REMOVE = ["remove-bundle"];
4335
4797
  function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
4336
4798
  const [acknowledged, setAcknowledged] = useState(false);
4337
4799
  return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.RiskConfirmation, {
@@ -4363,11 +4825,7 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
4363
4825
  }), self === void 0 ? null : /* @__PURE__ */ h("div", {
4364
4826
  className: MarketPage_module_default.marketSelfDivider,
4365
4827
  "aria-hidden": "true"
4366
- }), [
4367
- ...shown,
4368
- ...installedList,
4369
- ...pluginList
4370
- ].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, {
4828
+ }), marketSections([...shown, ...installedList]).map((section) => /* @__PURE__ */ h(MarketSection, {
4371
4829
  key: section.id,
4372
4830
  t,
4373
4831
  titleKey: section.titleKey,
@@ -4392,18 +4850,6 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
4392
4850
  act,
4393
4851
  confirmActions: CONFIRM_UNINSTALL,
4394
4852
  onConfirming
4395
- }), /* @__PURE__ */ h(MarketSection, {
4396
- t,
4397
- titleKey: installedList.length > 0 && installedList.every((row) => row.local === true) ? "panels.market.sectionLocal" : "panels.market.sectionUnlisted",
4398
- icon: marketSectionIcon("local"),
4399
- rows: installedList,
4400
- onDefault: setDefault,
4401
- boardBusy,
4402
- pending,
4403
- failureOf,
4404
- act,
4405
- confirmActions: CONFIRM_REMOVE,
4406
- onConfirming
4407
4853
  }), /* @__PURE__ */ h(PanelFoot, {
4408
4854
  size: "md",
4409
4855
  text: t("panels.market.foot")
@@ -4415,18 +4861,23 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
4415
4861
  act
4416
4862
  }));
4417
4863
  }
4418
- function MarketView({ t, manifests, capabilities, freshness, onChanged, updates, installed, installedRead, workbench, plugins, settling, mock, defaults = [], changed = {} }) {
4864
+ function MarketView({ t, manifests, installable, capabilities, freshness, onChanged, onPending, updates, installed, installedRead, workbench, plugins, settling, mock, defaults = [], changed = {} }) {
4419
4865
  const [titles, setTitles] = useState(/* @__PURE__ */ new Map());
4420
4866
  useEffect(() => {
4421
4867
  if (mock === void 0) setTitles((known) => mergeTitles(known, manifests));
4422
4868
  }, [manifests, mock]);
4423
4869
  const catalog = mock?.manifests ?? manifests;
4870
+ const marketable = mock === void 0 ? marketCatalog(manifests, installable) : catalog;
4424
4871
  const effective = mock === void 0 ? capabilities : mock.capabilities;
4425
- const source = liveManifests(catalog, effective, mock === void 0 && installed !== void 0 ? new Set(installed.map((item) => item.unit)) : null);
4872
+ const source = liveManifests(marketable, effective, mock === void 0 && installed !== void 0 ? new Set(installed.map((item) => item.unit)) : null);
4426
4873
  const byDefault = new Set(defaults);
4427
4874
  const rows = marketRows(source, effective, mock?.updates ?? updates ?? {}, byDefault, changed);
4428
4875
  const shared = sharedRows(source, effective);
4429
4876
  const [pending, setPending] = useState(mock?.pending ?? null);
4877
+ useEffect(() => {
4878
+ onPending?.(pending !== null);
4879
+ return () => onPending?.(false);
4880
+ }, [pending, onPending]);
4430
4881
  const provision = useHostWrite({
4431
4882
  channel: "provision",
4432
4883
  networkText: t("panels.failed")
@@ -4436,17 +4887,23 @@ function MarketView({ t, manifests, capabilities, freshness, onChanged, updates,
4436
4887
  resource: "panels",
4437
4888
  networkText: t("panels.failed")
4438
4889
  });
4439
- const [boardBusy, setBoardBusy] = useState(false);
4890
+ const [writingDefault, setWritingDefault] = useState(false);
4891
+ const settleDefault = useBoardSettle(machineBoardSignature(defaults, changed));
4892
+ const { busy: boardBusy } = useVisibleBusy(writingDefault || settleDefault.pending, 500);
4440
4893
  const setDefault = async (id, next) => {
4441
4894
  if (mock !== void 0) return;
4442
- setBoardBusy(true);
4895
+ setWritingDefault(true);
4896
+ settleDefault.begin();
4443
4897
  const outcome = await boardWrite.send({
4444
4898
  action: next ? "show" : "hide",
4445
4899
  id,
4446
4900
  scope: "machine"
4447
4901
  });
4448
- setBoardBusy(false);
4449
- if (!outcome.ok) setNotice(t("panels.failed"));
4902
+ setWritingDefault(false);
4903
+ if (!outcome.ok) {
4904
+ settleDefault.clear();
4905
+ setNotice(t("panels.failed"));
4906
+ }
4450
4907
  };
4451
4908
  const [confirming, setConfirming] = useState(mock?.confirming ?? null);
4452
4909
  const [failed, setFailed] = useState(mock?.failure ?? null);
@@ -5319,42 +5776,6 @@ function stateOfMock(base, mock) {
5319
5776
  };
5320
5777
  }
5321
5778
  //#endregion
5322
- //#region src/shared/hooks/use-visible-busy.ts
5323
- var use_visible_busy_exports = /* @__PURE__ */ __exportAll({
5324
- busyView: () => busyView,
5325
- heldPhase: () => heldPhase,
5326
- useVisibleBusy: () => useVisibleBusy
5327
- });
5328
- function heldPhase(phase, refreshing) {
5329
- return refreshing && phase === "ready" ? "loading" : phase;
5330
- }
5331
- function busyView(active, visible) {
5332
- return {
5333
- busy: visible,
5334
- settling: visible && !active
5335
- };
5336
- }
5337
- function useVisibleBusy(active, floorMs) {
5338
- const [visible, setVisible] = useState(active);
5339
- const since = useRef(null);
5340
- useEffect(() => {
5341
- if (active) {
5342
- if (since.current === null) since.current = Date.now();
5343
- setVisible(true);
5344
- return;
5345
- }
5346
- const held = holdBusy(since.current, Date.now(), floorMs);
5347
- since.current = null;
5348
- if (!held.visible) {
5349
- setVisible(false);
5350
- return;
5351
- }
5352
- const timer = setTimeout(() => setVisible(false), held.releaseInMs);
5353
- return () => clearTimeout(timer);
5354
- }, [active, floorMs]);
5355
- return busyView(active, visible);
5356
- }
5357
- //#endregion
5358
5779
  //#region src/app/layouts/market/use-add-module.ts
5359
5780
  function newRequestId() {
5360
5781
  return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
@@ -5488,14 +5909,21 @@ function useAddModule(options) {
5488
5909
  requestId: requestIdRef.current
5489
5910
  });
5490
5911
  }, [cancel]);
5912
+ const [removing, setRemoving] = useState(false);
5491
5913
  const removeIt = useCallback(() => {
5492
5914
  const pkg = outcome?.module.pkg;
5493
5915
  if (pkg === void 0) return;
5916
+ setRemoving(true);
5917
+ setFailure(null);
5494
5918
  remove.send({
5495
5919
  action: "remove-bundle",
5496
5920
  name: pkg
5497
5921
  }).then((result) => {
5498
- if (!result.ok) return;
5922
+ setRemoving(false);
5923
+ if (!result.ok) {
5924
+ setFailure(result.message);
5925
+ return;
5926
+ }
5499
5927
  onInstalled();
5500
5928
  });
5501
5929
  }, [
@@ -5522,6 +5950,7 @@ function useAddModule(options) {
5522
5950
  preview,
5523
5951
  outcome,
5524
5952
  failure,
5953
+ removing,
5525
5954
  builds: outcome?.change.pendingBuilds ?? [],
5526
5955
  setSpec,
5527
5956
  setChoice: useCallback((next) => {
@@ -5595,8 +6024,13 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
5595
6024
  variant: "outline",
5596
6025
  size: "md",
5597
6026
  className: "wb-dangerAction",
6027
+ disabled: state.removing,
6028
+ "aria-busy": state.removing,
5598
6029
  onClick: state.removeIt
5599
- }, t("panels.market.add.remove")) : null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
6030
+ }, state.removing ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
6031
+ state: "ongoing",
6032
+ size: 12
6033
+ }) : null, t(state.removing ? "panels.market.uninstalling" : "panels.market.add.remove")) : null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
5600
6034
  type: "button",
5601
6035
  variant: "outline",
5602
6036
  size: "md",
@@ -5656,14 +6090,19 @@ var MOCK_FRESHNESS = {
5656
6090
  var NO_UNITS = /* @__PURE__ */ new Set();
5657
6091
  function useLiveManifests(units) {
5658
6092
  useSyncExternalStore(useCallback((listener) => units.subscribe(listener), [units]), useCallback(() => units.version(), [units]));
5659
- return units.manifests();
6093
+ return units.manifests();
6094
+ }
6095
+ function useInstallableUnits(units) {
6096
+ useSyncExternalStore(useCallback((listener) => units.subscribe(listener), [units]), useCallback(() => units.version(), [units]));
6097
+ return units.installable();
5660
6098
  }
5661
6099
  function makeMarketEntryIcon(units) {
5662
6100
  return function MarketEntryIcon({ size = 16 }) {
5663
6101
  const manifests = useLiveManifests(units);
6102
+ const installable = useInstallableUnits(units);
5664
6103
  const { capabilities } = useCapabilityMap(0);
5665
6104
  const { modules, workbench } = useModuleVersions();
5666
- const hasUpdates = marketHintVisible(manifests, capabilities, modules, workbench);
6105
+ const hasUpdates = marketHintVisible(marketCatalog(manifests, installable), capabilities, modules, workbench);
5667
6106
  useEffect(() => {
5668
6107
  publishPanelHint(MARKET_PANEL_ID, hasUpdates ? { labelKey: "panels.market.hasNew" } : null);
5669
6108
  return () => publishPanelHint(MARKET_PANEL_ID, null);
@@ -5673,10 +6112,12 @@ function makeMarketEntryIcon(units) {
5673
6112
  }
5674
6113
  function MarketPanel({ t, units }) {
5675
6114
  const manifests = useLiveManifests(units);
6115
+ const installable = useInstallableUnits(units);
5676
6116
  const { capabilities, checkedAt, checking, forceProbe, reload: reloadCapability } = useCapabilityMap(0);
5677
6117
  const { modules, plugins, workbench, read: installedRead, reload: reloadVersions } = useModuleVersions();
5678
6118
  const machineBoard = useEnabledUnits(0, null);
5679
6119
  const [adding, setAdding] = useState(false);
6120
+ const [acting, setActing] = useState(false);
5680
6121
  const openAddModule = useCallback(() => setAdding(true), []);
5681
6122
  const updates = useMemo(() => marketUpdatesOf(modules), [modules]);
5682
6123
  const installed = modules === null ? void 0 : withClientRefusals(modules, units.refusals());
@@ -5738,7 +6179,7 @@ function MarketPanel({ t, units }) {
5738
6179
  const mockNonce = fixturePick.nonce;
5739
6180
  const shownFreshness = mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS;
5740
6181
  const shownRead = mock === void 0 ? installedRead : mock.installedRead ?? true;
5741
- const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking;
6182
+ const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking || acting;
5742
6183
  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", {
5743
6184
  type: "button",
5744
6185
  className: `${MarketPage_module_default.marketIconButton}${shownFreshness.checking ? ` ${MarketPage_module_default.marketIconButtonSpinning}` : ""}`,
@@ -5766,9 +6207,11 @@ function MarketPanel({ t, units }) {
5766
6207
  key: `${mock?.id ?? "real-market"}-${mockNonce}`,
5767
6208
  t,
5768
6209
  manifests,
6210
+ installable,
5769
6211
  capabilities,
5770
6212
  freshness: shownFreshness,
5771
6213
  onChanged: reload,
6214
+ onPending: setActing,
5772
6215
  updates,
5773
6216
  installed,
5774
6217
  installedRead: shownRead,
@@ -5830,7 +6273,7 @@ function createUnitManifestLoader(options = {}) {
5830
6273
  inFlight = true;
5831
6274
  try {
5832
6275
  const response = await apiGet(UNIT_MANIFESTS_ROUTE).catch(() => null);
5833
- if (response?.ok === true && Array.isArray(response.manifests)) registry.setManifests(response.manifests);
6276
+ if (response?.ok === true && Array.isArray(response.manifests)) registry.setManifests(response.manifests, Array.isArray(response.installable) ? response.installable : void 0);
5834
6277
  } finally {
5835
6278
  inFlight = false;
5836
6279
  if (queued) {
@@ -6667,6 +7110,131 @@ function createDshColumnSource(read, intervalMs) {
6667
7110
  }
6668
7111
  };
6669
7112
  }
7113
+ //#endregion
7114
+ //#region src/app/layouts/rightbar/dsh-surface.ts
7115
+ var DSH_SEAT_ATTRIBUTE = "data-sidebar-right-session";
7116
+ function dshSeatOnScreen(host) {
7117
+ if (host === void 0) return false;
7118
+ return host.querySelector(`[${DSH_SEAT_ATTRIBUTE}]`) !== null;
7119
+ }
7120
+ function createDshSurfaceWatch(read, onReady, intervalMs) {
7121
+ let timer;
7122
+ const disarm = () => {
7123
+ if (timer === void 0) return;
7124
+ clearInterval(timer);
7125
+ timer = void 0;
7126
+ };
7127
+ const tick = () => {
7128
+ if (!read()) return;
7129
+ disarm();
7130
+ onReady();
7131
+ };
7132
+ return {
7133
+ arm() {
7134
+ if (timer !== void 0) return;
7135
+ timer = setInterval(tick, intervalMs);
7136
+ },
7137
+ disarm
7138
+ };
7139
+ }
7140
+ //#endregion
7141
+ //#region src/app/layouts/rightbar/dsh-borrow.ts
7142
+ function createDshBorrow(host) {
7143
+ let pendingOpen = false;
7144
+ let pendingCall;
7145
+ let unsubscribe;
7146
+ let restore;
7147
+ let shimmed = false;
7148
+ const flush = () => {
7149
+ const official = host.official();
7150
+ if (official === void 0 || !dshSeatOnScreen(document)) return;
7151
+ if (pendingOpen) {
7152
+ pendingOpen = false;
7153
+ if (!official.isExpanded()) official.toggleExpanded();
7154
+ }
7155
+ const call = pendingCall;
7156
+ pendingCall = void 0;
7157
+ call?.();
7158
+ };
7159
+ const watch = createDshSurfaceWatch(() => dshSeatOnScreen(document), flush, 60);
7160
+ const subscribe = () => {
7161
+ const official = host.official();
7162
+ if (official === void 0 || unsubscribe !== void 0) return;
7163
+ unsubscribe = official.mounted.subscribe(() => {
7164
+ watch.arm();
7165
+ flush();
7166
+ });
7167
+ };
7168
+ const enter = (call) => {
7169
+ const official = host.official();
7170
+ if (official === void 0) return false;
7171
+ if (dshSeatOnScreen(document)) {
7172
+ if (!official.isExpanded()) official.toggleExpanded();
7173
+ call?.();
7174
+ return true;
7175
+ }
7176
+ subscribe();
7177
+ watch.arm();
7178
+ host.yieldColumn();
7179
+ pendingOpen = true;
7180
+ if (call !== void 0) pendingCall = call;
7181
+ return false;
7182
+ };
7183
+ const takeSeat = (call) => {
7184
+ shim();
7185
+ if (host.official() === void 0) return;
7186
+ enter(call);
7187
+ };
7188
+ const shim = () => {
7189
+ const official = host.official();
7190
+ if (official === void 0 || shimmed) return;
7191
+ const { openResource, openTab } = official;
7192
+ if (typeof openResource !== "function" || typeof openTab !== "function") return;
7193
+ shimmed = true;
7194
+ official.openResource = (address, options) => takeSeat(() => openResource.call(official, address, options));
7195
+ official.openTab = (kind, options) => takeSeat(() => openTab.call(official, kind, options));
7196
+ restore = () => {
7197
+ official.openResource = openResource;
7198
+ official.openTab = openTab;
7199
+ shimmed = false;
7200
+ };
7201
+ };
7202
+ return {
7203
+ open() {
7204
+ const official = host.official();
7205
+ if (official === void 0) return false;
7206
+ return official.mounted.getSnapshot() === void 0 || official.isExpanded();
7207
+ },
7208
+ use: takeSeat,
7209
+ toggle() {
7210
+ const official = host.official();
7211
+ if (official === void 0) return;
7212
+ if (!dshSeatOnScreen(document)) {
7213
+ pendingOpen = true;
7214
+ watch.arm();
7215
+ return;
7216
+ }
7217
+ official.toggleExpanded();
7218
+ },
7219
+ back() {
7220
+ pendingOpen = false;
7221
+ pendingCall = void 0;
7222
+ watch.disarm();
7223
+ host.reclaimColumn();
7224
+ },
7225
+ start() {
7226
+ shim();
7227
+ subscribe();
7228
+ },
7229
+ dispose() {
7230
+ unsubscribe?.();
7231
+ unsubscribe = void 0;
7232
+ watch.disarm();
7233
+ restore?.();
7234
+ restore = void 0;
7235
+ }
7236
+ };
7237
+ }
6670
7238
  var Breadcrumbs_module_default = {
6671
7239
  stripTabs: "_stripTabs_1dqp4_1",
6672
7240
  tab: "_tab_1dqp4_9",
@@ -6739,26 +7307,29 @@ function BoardMockStrip({ fixtures, show }) {
6739
7307
  });
6740
7308
  }
6741
7309
  var ModulesPage_module_default = {
6742
- trigger: "_trigger_1yptb_1",
6743
- pop: "_pop_1yptb_6",
6744
- head: "_head_1yptb_20",
6745
- title: "_title_1yptb_28",
6746
- rowControls: "_rowControls_1yptb_36",
6747
- followBox: "_followBox_1yptb_43",
6748
- switchFollowing: "_switchFollowing_1yptb_49",
6749
- reset: "_reset_1yptb_53",
6750
- list: "_list_1yptb_75",
6751
- row: "_row_1yptb_36",
6752
- rowOver: "_rowOver_1yptb_99",
6753
- ghost: "_ghost_1yptb_109",
6754
- grip: "_grip_1yptb_124",
6755
- label: "_label_1yptb_132",
6756
- name: "_name_1yptb_139",
6757
- error: "_error_1yptb_150",
6758
- dep: "_dep_1yptb_158",
6759
- pluginList: "_pluginList_1yptb_166",
6760
- pluginRow: "_pluginRow_1yptb_171",
6761
- plugin: "_plugin_1yptb_166"
7310
+ trigger: "_trigger_15ptp_1",
7311
+ pop: "_pop_15ptp_6",
7312
+ head: "_head_15ptp_20",
7313
+ title: "_title_15ptp_28",
7314
+ rowControls: "_rowControls_15ptp_36",
7315
+ reset: "_reset_15ptp_43",
7316
+ list: "_list_15ptp_65",
7317
+ row: "_row_15ptp_36",
7318
+ rowDragging: "_rowDragging_15ptp_85",
7319
+ rowBlocked: "_rowBlocked_15ptp_89",
7320
+ listDragging: "_listDragging_15ptp_93",
7321
+ rowOff: "_rowOff_15ptp_101",
7322
+ rowOver: "_rowOver_15ptp_109",
7323
+ ghost: "_ghost_15ptp_119",
7324
+ grip: "_grip_15ptp_134",
7325
+ gripDragging: "_gripDragging_15ptp_144",
7326
+ gripBlocked: "_gripBlocked_15ptp_148",
7327
+ label: "_label_15ptp_152",
7328
+ name: "_name_15ptp_159",
7329
+ error: "_error_15ptp_170",
7330
+ dep: "_dep_15ptp_178",
7331
+ group: "_group_15ptp_186",
7332
+ groupTitle: "_groupTitle_15ptp_191"
6762
7333
  };
6763
7334
  //#endregion
6764
7335
  //#region src/app/layouts/rightbar/panel-mock.ts
@@ -6771,6 +7342,15 @@ function row$1(id, titleKey, shown) {
6771
7342
  hasCard: true
6772
7343
  };
6773
7344
  }
7345
+ function noCardRow(id, titleKey) {
7346
+ return {
7347
+ id,
7348
+ titleKey,
7349
+ shown: false,
7350
+ source: "user",
7351
+ hasCard: false
7352
+ };
7353
+ }
6774
7354
  function plugin(id, pkg, title, shown) {
6775
7355
  return {
6776
7356
  id,
@@ -6890,6 +7470,20 @@ function buildPanelMocks(roster) {
6890
7470
  on: true
6891
7471
  }
6892
7472
  },
7473
+ {
7474
+ id: "no-card",
7475
+ label: "没看板的模块(只有基座命令那种):也列出来、带「无看板」标签,开关照常能用,只是不参与排序",
7476
+ units: [on, noCardRow(`${id}-c`, `${titleKey}(无看板)`)],
7477
+ capabilities: {
7478
+ ...probe(id, "ok"),
7479
+ ...probe(`${id}-c`, "ok")
7480
+ },
7481
+ expect: {
7482
+ rows: 2,
7483
+ badge: null,
7484
+ on: true
7485
+ }
7486
+ },
6893
7487
  {
6894
7488
  id: "long",
6895
7489
  label: "超长模块名",
@@ -6940,7 +7534,7 @@ function buildPanelMocks(roster) {
6940
7534
  ...probe(`${id}-c`, "ok")
6941
7535
  },
6942
7536
  drag: {
6943
- from: 2,
7537
+ from: 1,
6944
7538
  over: 0,
6945
7539
  at: {
6946
7540
  x: 1230,
@@ -6952,6 +7546,32 @@ function buildPanelMocks(roster) {
6952
7546
  on: true
6953
7547
  }
6954
7548
  },
7549
+ {
7550
+ id: "drag-off",
7551
+ label: "拖到未开启的那一行上:落点不亮(松手也不动)",
7552
+ units: [
7553
+ on,
7554
+ twin,
7555
+ third
7556
+ ],
7557
+ capabilities: {
7558
+ ...probe(id, "ok"),
7559
+ ...probe(`${id}-b`, "ok"),
7560
+ ...probe(`${id}-c`, "ok")
7561
+ },
7562
+ drag: {
7563
+ from: 0,
7564
+ over: null,
7565
+ at: {
7566
+ x: 1230,
7567
+ y: 300
7568
+ }
7569
+ },
7570
+ expect: {
7571
+ rows: 3,
7572
+ on: true
7573
+ }
7574
+ },
6955
7575
  PLUGIN_MOCK
6956
7576
  ];
6957
7577
  }
@@ -6965,6 +7585,22 @@ function available(capability) {
6965
7585
  function selectPanelUnits(units, capabilities) {
6966
7586
  return units.filter((unit) => available(capabilities?.[unit.id]));
6967
7587
  }
7588
+ function panelDropTarget(rows, index) {
7589
+ if (index === null) return null;
7590
+ const row = rows[index];
7591
+ return row?.shown === true && row.hasCard !== false ? index : null;
7592
+ }
7593
+ function rowAtPoint(boxes, y) {
7594
+ const last = boxes.length - 1;
7595
+ for (let at = 0; at <= last; at += 1) {
7596
+ const box = boxes[at];
7597
+ const next = boxes[at + 1];
7598
+ if (box === void 0) continue;
7599
+ const end = next === void 0 ? box.bottom : next.top;
7600
+ if (y >= box.top && (next === void 0 ? y <= end : y < end)) return at;
7601
+ }
7602
+ return null;
7603
+ }
6968
7604
  function panelBadgeKey(capability) {
6969
7605
  if (capability === void 0 || capability.status === "ok") return void 0;
6970
7606
  if (capability.status === "failed") return "panels.dep.failed";
@@ -6978,6 +7614,7 @@ function moduleRow(unit, capability) {
6978
7614
  id: unit.id,
6979
7615
  titleKey: unit.titleKey,
6980
7616
  plugin: false,
7617
+ hasCard: unit.hasCard,
6981
7618
  ...badge === void 0 ? {} : { badgeKey: badge },
6982
7619
  shown: unit.shown,
6983
7620
  source: unit.source
@@ -6993,7 +7630,8 @@ function pluginRow(plugin) {
6993
7630
  };
6994
7631
  }
6995
7632
  function selectPanelRows(units, plugins, capabilities) {
6996
- return [...selectPanelUnits(units, capabilities).map((unit) => moduleRow(unit, capabilities?.[unit.id])), ...plugins.map(pluginRow)];
7633
+ const listed = new Set(plugins.map((plugin) => plugin.id));
7634
+ return [...selectPanelUnits(units, capabilities).filter((unit) => !listed.has(unit.id)).map((unit) => moduleRow(unit, capabilities?.[unit.id])), ...plugins.map(pluginRow)];
6997
7635
  }
6998
7636
  function selectBoardModules(units, byId, capabilities) {
6999
7637
  if (units === null) return [];
@@ -7010,20 +7648,7 @@ function aggregateSummaries(summaries) {
7010
7648
  //#endregion
7011
7649
  //#region src/app/layouts/rightbar/PanelRowControls.tsx
7012
7650
  function PanelRowControls({ t, unit, label, busy, onWrite }) {
7013
- return /* @__PURE__ */ h("span", { className: ModulesPage_module_default.rowControls }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Checkbox, {
7014
- checked: unit.source !== "user",
7015
- disabled: busy,
7016
- label: t("panels.followGlobal"),
7017
- title: t("panels.followGlobalHint"),
7018
- className: ModulesPage_module_default.followBox,
7019
- onChange: (next) => onWrite(next ? {
7020
- action: "follow",
7021
- id: unit.id
7022
- } : {
7023
- action: unit.shown ? "show" : "hide",
7024
- id: unit.id
7025
- })
7026
- }), /* @__PURE__ */ h("span", { className: unit.source === "user" ? void 0 : ModulesPage_module_default.switchFollowing }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Switch, {
7651
+ return /* @__PURE__ */ h("span", { className: ModulesPage_module_default.rowControls }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Switch, {
7027
7652
  checked: unit.shown,
7028
7653
  label: `${label} · ${unit.shown ? t("panels.enabled") : t("panels.disabled")}`,
7029
7654
  disabled: busy,
@@ -7031,34 +7656,153 @@ function PanelRowControls({ t, unit, label, busy, onWrite }) {
7031
7656
  action: next ? "show" : "hide",
7032
7657
  id: unit.id
7033
7658
  })
7034
- })));
7659
+ }));
7035
7660
  }
7036
7661
  //#endregion
7037
- //#region src/app/layouts/rightbar/PanelPluginRows.tsx
7038
- function PanelPluginRows({ t, rows, busy, onWrite }) {
7662
+ //#region src/app/layouts/rightbar/PanelGroupRows.tsx
7663
+ function PanelGroupRows({ t, rows, titleKey, busy, onWrite }) {
7039
7664
  if (rows.length === 0) return null;
7040
- return /* @__PURE__ */ h("ul", { className: `${ModulesPage_module_default.list} ${ModulesPage_module_default.pluginList}` }, rows.map((row) => /* @__PURE__ */ h("li", {
7041
- className: `${ModulesPage_module_default.row} ${ModulesPage_module_default.pluginRow}`,
7042
- key: row.id
7043
- }, /* @__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, {
7665
+ 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) => {
7666
+ const title = row.title ?? t(row.titleKey ?? row.id);
7667
+ return /* @__PURE__ */ h("li", {
7668
+ key: row.id,
7669
+ className: `${ModulesPage_module_default.row} ${row.shown ? "" : ModulesPage_module_default.rowOff}`
7670
+ }, /* @__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, {
7671
+ t,
7672
+ unit: row,
7673
+ label: title,
7674
+ busy,
7675
+ onWrite
7676
+ }));
7677
+ })));
7678
+ }
7679
+ //#endregion
7680
+ //#region src/app/layouts/rightbar/use-drag-listeners.ts
7681
+ function useDragListeners(active, handlers) {
7682
+ const latestRef = useRef(handlers);
7683
+ useEffect(() => {
7684
+ latestRef.current = handlers;
7685
+ });
7686
+ useEffect(() => {
7687
+ if (!active) return;
7688
+ const onMove = (event) => latestRef.current.move(event.clientX, event.clientY);
7689
+ const onUp = (event) => latestRef.current.drop(event.clientY);
7690
+ const onCancel = () => latestRef.current.cancel();
7691
+ window.addEventListener("pointermove", onMove);
7692
+ window.addEventListener("pointerup", onUp);
7693
+ window.addEventListener("pointercancel", onCancel);
7694
+ window.addEventListener("blur", onCancel);
7695
+ return () => {
7696
+ window.removeEventListener("pointermove", onMove);
7697
+ window.removeEventListener("pointerup", onUp);
7698
+ window.removeEventListener("pointercancel", onCancel);
7699
+ window.removeEventListener("blur", onCancel);
7700
+ };
7701
+ }, [active]);
7702
+ }
7703
+ //#endregion
7704
+ //#region src/app/layouts/rightbar/ModulesPage.tsx
7705
+ function rowBoxes(list) {
7706
+ return list === null ? [] : Array.from(list.children).map((item) => item.getBoundingClientRect());
7707
+ }
7708
+ function rowClass(row, index, drag) {
7709
+ const parts = [ModulesPage_module_default.row];
7710
+ if (!row.shown) parts.push(ModulesPage_module_default.rowOff);
7711
+ if (drag !== null) parts.push(row.shown ? ModulesPage_module_default.rowDragging : ModulesPage_module_default.rowBlocked);
7712
+ if (drag?.over === index) parts.push(ModulesPage_module_default.rowOver);
7713
+ return parts.join(" ");
7714
+ }
7715
+ function gripClass(drag) {
7716
+ if (drag === null) return ModulesPage_module_default.grip;
7717
+ return `${ModulesPage_module_default.grip} ${drag.over === null ? ModulesPage_module_default.gripBlocked : ModulesPage_module_default.gripDragging}`;
7718
+ }
7719
+ function RowLabel({ t, row }) {
7720
+ 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)));
7721
+ }
7722
+ function PanelRowItem({ t, row, index, drag, handlers, tipEpoch, busy, onWrite }) {
7723
+ return /* @__PURE__ */ h("li", { className: rowClass(row, index, drag) }, row.shown && row.hasCard !== false ? /* @__PURE__ */ h(Tip, {
7724
+ key: tipEpoch,
7725
+ label: t("panels.dragHint"),
7726
+ disabled: drag !== null
7727
+ }, /* @__PURE__ */ h("span", {
7728
+ className: gripClass(drag),
7729
+ "aria-hidden": "true",
7730
+ onPointerDown: (event) => {
7731
+ if (event.button !== 0) return;
7732
+ event.preventDefault();
7733
+ event.currentTarget.setPointerCapture(event.pointerId);
7734
+ handlers.begin(index, event.clientX, event.clientY);
7735
+ }
7736
+ }, "⠿")) : /* @__PURE__ */ h("span", { "aria-hidden": "true" }), /* @__PURE__ */ h(RowLabel, {
7737
+ t,
7738
+ row
7739
+ }), /* @__PURE__ */ h(PanelRowControls, {
7044
7740
  t,
7045
7741
  unit: row,
7046
- label: row.title ?? row.id,
7742
+ label: t(row.titleKey ?? row.id),
7047
7743
  busy,
7048
7744
  onWrite
7049
- }))));
7745
+ }));
7746
+ }
7747
+ function PanelEmpty({ t, onOpenMarket }) {
7748
+ return /* @__PURE__ */ h(CenteredState, {
7749
+ compact: true,
7750
+ icon: null,
7751
+ title: t("panels.noneInstalled"),
7752
+ hint: t("panels.noneInstalledHint"),
7753
+ action: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
7754
+ type: "button",
7755
+ size: "sm",
7756
+ variant: "outline",
7757
+ onClick: onOpenMarket
7758
+ }, t("panels.browseMarket"))
7759
+ });
7760
+ }
7761
+ function DragGhost({ label, at }) {
7762
+ return /* @__PURE__ */ h("div", {
7763
+ className: ModulesPage_module_default.ghost,
7764
+ style: {
7765
+ left: `${at.x + 12}px`,
7766
+ top: `${at.y - 12}px`
7767
+ }
7768
+ }, label);
7769
+ }
7770
+ function ResetConfirmation({ t, open, busy, onCancel, onConfirm }) {
7771
+ const [acknowledged, setAcknowledged] = useState(false);
7772
+ const close = (next) => {
7773
+ setAcknowledged(false);
7774
+ next();
7775
+ };
7776
+ return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.RiskConfirmation, {
7777
+ open,
7778
+ title: t("panels.followAllConfirmTitle"),
7779
+ description: t("panels.followAllConfirmDetail"),
7780
+ acknowledgeLabel: t("panels.followAllConfirmAck"),
7781
+ cancelLabel: t("panels.followAllConfirmNo"),
7782
+ closeLabel: t("panels.followAllConfirmNo"),
7783
+ confirmLabel: t("panels.followAllConfirmYes"),
7784
+ acknowledged,
7785
+ disabled: busy,
7786
+ onAcknowledgedChange: setAcknowledged,
7787
+ onCancel: () => close(onCancel),
7788
+ onConfirm: () => close(onConfirm)
7789
+ });
7050
7790
  }
7051
- //#endregion
7052
- //#region src/app/layouts/rightbar/ModulesPage.tsx
7053
- var BLANK_DRAG_IMAGE = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
7054
7791
  function ModulesPage({ t, units, plugins = [], workspace, capabilities, loading = false, onOpenMarket, mocked = false, mock, own = false }) {
7055
7792
  const [drag, setDrag] = useState(mock?.drag ?? null);
7056
- const [busy, setBusy] = useState(mock?.busy ?? false);
7793
+ const [tipEpoch, setTipEpoch] = useState(0);
7794
+ const [writing, setWriting] = useState(mock?.busy ?? false);
7057
7795
  const [failed, setFailed] = useState(mock?.failed ?? false);
7796
+ const [confirmingReset, setConfirmingReset] = useState(false);
7797
+ const listRef = useRef(null);
7058
7798
  const rows = selectPanelRows(units, plugins, capabilities);
7059
7799
  const modules = rows.filter((row) => !row.plugin);
7800
+ const carded = modules.filter((row) => row.hasCard !== false);
7801
+ const boardless = modules.filter((row) => row.hasCard === false);
7060
7802
  const pluginRows = rows.filter((row) => row.plugin);
7061
7803
  const empty = !loading && rows.length === 0;
7804
+ const settle = useBoardSettle(panelBoardSignature(units, plugins, own));
7805
+ const { busy } = useVisibleBusy(writing || settle.pending, 500);
7062
7806
  const prefWrite = useHostWrite({
7063
7807
  channel: "prefs",
7064
7808
  resource: "panels",
@@ -7066,98 +7810,124 @@ function ModulesPage({ t, units, plugins = [], workspace, capabilities, loading
7066
7810
  });
7067
7811
  const write = async (body) => {
7068
7812
  if (mocked) return;
7069
- setBusy(true);
7813
+ setWriting(true);
7070
7814
  setFailed(false);
7815
+ settle.begin();
7071
7816
  const outcome = await prefWrite.send({
7072
7817
  ...body,
7073
7818
  ...workspace === null ? {} : { path: workspace }
7074
7819
  });
7075
- setBusy(false);
7076
- if (!outcome.ok) setFailed(true);
7820
+ setWriting(false);
7821
+ if (!outcome.ok) {
7822
+ settle.clear();
7823
+ setFailed(true);
7824
+ }
7077
7825
  };
7078
7826
  const writeRow = (body) => void write(body);
7079
- const drop = () => {
7827
+ const dropTargetAt = (y) => panelDropTarget(carded, rowAtPoint(rowBoxes(listRef.current), y));
7828
+ const beginDrag = (index, x, y) => {
7829
+ if (carded[index]?.shown !== true) return;
7830
+ setDrag({
7831
+ from: index,
7832
+ over: index,
7833
+ at: {
7834
+ x,
7835
+ y
7836
+ }
7837
+ });
7838
+ };
7839
+ const trackDrag = (x, y) => {
7080
7840
  if (drag === null) return;
7081
- const moved = modules[drag.from];
7841
+ setDrag({
7842
+ from: drag.from,
7843
+ over: dropTargetAt(y),
7844
+ at: {
7845
+ x,
7846
+ y
7847
+ }
7848
+ });
7849
+ };
7850
+ const settleDrag = (y) => {
7851
+ const from = drag?.from;
7082
7852
  setDrag(null);
7083
- if (moved === void 0 || drag.from === drag.over) return;
7853
+ setTipEpoch((epoch) => epoch + 1);
7854
+ if (from === void 0) return;
7855
+ const moved = carded[from];
7856
+ const over = dropTargetAt(y);
7857
+ if (moved === void 0 || over === null || over === from) return;
7084
7858
  write({
7085
7859
  action: "move",
7086
7860
  id: moved.id,
7087
- index: drag.over
7861
+ index: over
7088
7862
  });
7089
7863
  };
7090
- const dragging = drag === null ? void 0 : modules[drag.from];
7091
- return /* @__PURE__ */ h(Fragment, null, drag?.at === void 0 || dragging === void 0 ? null : /* @__PURE__ */ h("div", {
7092
- className: ModulesPage_module_default.ghost,
7093
- style: {
7094
- left: `${drag.at.x + 12}px`,
7095
- top: `${drag.at.y - 12}px`
7096
- }
7097
- }, t(dragging.titleKey ?? dragging.id)), empty ? /* @__PURE__ */ h(CenteredState, {
7098
- compact: true,
7099
- icon: null,
7100
- title: t("panels.noneInstalled"),
7101
- hint: t("panels.noneInstalledHint"),
7102
- action: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
7103
- type: "button",
7104
- size: "sm",
7105
- variant: "outline",
7106
- onClick: onOpenMarket
7107
- }, t("panels.browseMarket"))
7108
- }) : null, modules.length === 0 ? null : /* @__PURE__ */ h("ul", { className: ModulesPage_module_default.list }, modules.map((row, index) => /* @__PURE__ */ h("li", {
7109
- className: `${ModulesPage_module_default.row}${drag?.over === index ? ` ${ModulesPage_module_default.rowOver}` : ""}`,
7864
+ const cancelDrag = () => {
7865
+ setDrag(null);
7866
+ setTipEpoch((epoch) => epoch + 1);
7867
+ };
7868
+ const handlers = {
7869
+ begin: beginDrag,
7870
+ move: trackDrag,
7871
+ drop: settleDrag,
7872
+ cancel: cancelDrag
7873
+ };
7874
+ useDragListeners(drag !== null, handlers);
7875
+ const dragged = drag === null ? void 0 : carded[drag.from];
7876
+ return /* @__PURE__ */ h(Fragment, null, drag?.at === void 0 || dragged === void 0 ? null : /* @__PURE__ */ h(DragGhost, {
7877
+ label: t(dragged.titleKey ?? dragged.id),
7878
+ at: drag.at
7879
+ }), empty ? /* @__PURE__ */ h(PanelEmpty, {
7880
+ t,
7881
+ onOpenMarket
7882
+ }) : null, carded.length === 0 ? null : /* @__PURE__ */ h("ul", {
7883
+ ref: listRef,
7884
+ className: `${ModulesPage_module_default.list}${drag === null ? "" : ` ${ModulesPage_module_default.listDragging}`}`
7885
+ }, carded.map((row, index) => /* @__PURE__ */ h(PanelRowItem, {
7110
7886
  key: row.id,
7111
- draggable: true,
7112
- onDragStart: (event) => {
7113
- const blank = new Image();
7114
- blank.src = BLANK_DRAG_IMAGE;
7115
- event.dataTransfer.setDragImage(blank, 0, 0);
7116
- setDrag({
7117
- from: index,
7118
- over: index,
7119
- at: {
7120
- x: event.clientX,
7121
- y: event.clientY
7122
- }
7123
- });
7124
- },
7125
- onDragOver: (event) => {
7126
- event.preventDefault();
7127
- if (drag !== null) setDrag({
7128
- from: drag.from,
7129
- over: index,
7130
- at: {
7131
- x: event.clientX,
7132
- y: event.clientY
7133
- }
7134
- });
7135
- },
7136
- onDragEnd: drop,
7137
- onDrop: (event) => {
7138
- event.preventDefault();
7139
- drop();
7140
- }
7141
- }, /* @__PURE__ */ h(Tip, { label: t("panels.dragHint") }, /* @__PURE__ */ h("span", {
7142
- className: ModulesPage_module_default.grip,
7143
- "aria-hidden": "true"
7144
- }, "⠿")), /* @__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, {
7145
7887
  t,
7146
- unit: row,
7147
- label: t(row.titleKey ?? row.id),
7888
+ row,
7889
+ index,
7890
+ drag,
7891
+ handlers,
7892
+ tipEpoch,
7893
+ busy,
7894
+ onWrite: writeRow
7895
+ }))), /* @__PURE__ */ h(PanelGroupRows, {
7896
+ t,
7897
+ rows: boardless,
7898
+ titleKey: "panels.groupBoardless",
7148
7899
  busy,
7149
7900
  onWrite: writeRow
7150
- })))), /* @__PURE__ */ h(PanelPluginRows, {
7901
+ }), /* @__PURE__ */ h(PanelGroupRows, {
7151
7902
  t,
7152
7903
  rows: pluginRows,
7904
+ titleKey: "panels.groupPlugins",
7153
7905
  busy,
7154
7906
  onWrite: writeRow
7155
- }), /* @__PURE__ */ h(PanelFoot, { text: t("panels.hintEffect") }, own ? /* @__PURE__ */ h("button", {
7907
+ }), own ? /* @__PURE__ */ h(PanelFoot, null, /* @__PURE__ */ h("button", {
7156
7908
  type: "button",
7157
7909
  className: ModulesPage_module_default.reset,
7158
7910
  disabled: busy,
7159
- onClick: () => void write({ action: "reset" })
7160
- }, t("panels.followAll")) : null), failed ? /* @__PURE__ */ h("p", { className: ModulesPage_module_default.error }, t("panels.failed")) : null);
7911
+ onClick: () => setConfirmingReset(true)
7912
+ }, t("panels.followAll"))) : null, /* @__PURE__ */ h(ResetConfirmation, {
7913
+ t,
7914
+ open: confirmingReset,
7915
+ busy,
7916
+ onCancel: () => setConfirmingReset(false),
7917
+ onConfirm: () => {
7918
+ setConfirmingReset(false);
7919
+ write({ action: "reset" });
7920
+ }
7921
+ }), failed ? /* @__PURE__ */ h("p", { className: ModulesPage_module_default.error }, t("panels.failed")) : null);
7922
+ }
7923
+ //#endregion
7924
+ //#region src/app/layouts/rightbar/panel-dismiss.ts
7925
+ function hasOpenModal(scope) {
7926
+ return scope.querySelector("[aria-modal=\"true\"]") !== null;
7927
+ }
7928
+ function dismissPanelByPointer(next, scope, onOpenChange) {
7929
+ if (!next && hasOpenModal(scope)) return;
7930
+ onOpenChange(next);
7161
7931
  }
7162
7932
  //#endregion
7163
7933
  //#region src/app/layouts/rightbar/PanelModules.tsx
@@ -7188,7 +7958,7 @@ function PanelModules({ t, open, onOpenChange, enabledUnits, workspace, refreshT
7188
7958
  });
7189
7959
  const panelMock = fixturePick.enabled ? fixturePick.current : void 0;
7190
7960
  const mockNonce = fixturePick.nonce;
7191
- (0, _deepseek_ai_dsh_client_ui_primitives.useDismissOnOutsidePointer)(root, open, onOpenChange);
7961
+ (0, _deepseek_ai_dsh_client_ui_primitives.useDismissOnOutsidePointer)(root, open, (next) => dismissPanelByPointer(next, document, onOpenChange));
7192
7962
  const units = enabledUnits?.units ?? [];
7193
7963
  return /* @__PURE__ */ h("div", {
7194
7964
  className: ModulesPage_module_default.trigger,
@@ -7409,6 +8179,54 @@ function createSuiteWorld(input) {
7409
8179
  }
7410
8180
  };
7411
8181
  }
8182
+ //#endregion
8183
+ //#region src/shared/hooks/panel-state-report.ts
8184
+ var FLUSH_MS = 400;
8185
+ var workspace = null;
8186
+ var timer = null;
8187
+ var pending = /* @__PURE__ */ new Map();
8188
+ function unitOfRoute(route) {
8189
+ const cut = route.indexOf("/");
8190
+ return cut <= 0 ? null : route.slice(0, cut);
8191
+ }
8192
+ function setPanelWorkspace(path) {
8193
+ if (path === workspace) return;
8194
+ const previous = workspace;
8195
+ workspace = path;
8196
+ if (previous !== null) pending.clear();
8197
+ }
8198
+ function reportPanelRead(input) {
8199
+ pending.set(`${input.unit}\u0000${input.route}`, {
8200
+ unit: input.unit,
8201
+ route: input.route,
8202
+ phase: input.phase,
8203
+ at: Date.now(),
8204
+ ...input.error === void 0 ? {} : { error: input.error }
8205
+ });
8206
+ if (timer !== null) return;
8207
+ timer = setTimeout(flush, FLUSH_MS);
8208
+ }
8209
+ function reportPanelCrash(input) {
8210
+ const target = workspace;
8211
+ if (target === null) return;
8212
+ apiPost(`${PANEL_STATE_PATH}/crash`, {
8213
+ workspace: target,
8214
+ unit: input.unit,
8215
+ reason: input.reason,
8216
+ at: Date.now()
8217
+ }).catch(() => void 0);
8218
+ }
8219
+ function flush() {
8220
+ timer = null;
8221
+ const target = workspace;
8222
+ const cards = [...pending.values()];
8223
+ pending.clear();
8224
+ if (target === null || cards.length === 0) return;
8225
+ apiPost(`${PANEL_STATE_PATH}/cards`, {
8226
+ workspace: target,
8227
+ cards
8228
+ }).catch(() => void 0);
8229
+ }
7412
8230
  var Rightbar_module_default = {
7413
8231
  panel: "_panel_135e7_1",
7414
8232
  columns: "_columns_135e7_18",
@@ -7462,7 +8280,7 @@ function PanelHeader({ t, trail, onGoTo, titleKeyOf, refreshing, at, refreshEnab
7462
8280
  onClick: onCollapse
7463
8281
  })))));
7464
8282
  }
7465
- function BoardContent({ top, plan, world, board, twoColumns, panelToken, onPanelRefresh, onNavigate, onOpenMarket, onSummary, onOpenModules, buildModule, t }) {
8283
+ function BoardContent({ top, plan, world, board, twoColumns, panelToken, onPanelRefresh, onNavigate, onOpenMarket, onSummary, onOpenModules, onCardFailure, buildModule, t }) {
7466
8284
  if (top.kind !== "board") {
7467
8285
  const owner = board.stepOwner(top.kind);
7468
8286
  if (owner === void 0) return /* @__PURE__ */ h(CenteredState, {
@@ -7474,7 +8292,8 @@ function BoardContent({ top, plan, world, board, twoColumns, panelToken, onPanel
7474
8292
  key,
7475
8293
  unit: owner.id,
7476
8294
  resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
7477
- t
8295
+ t,
8296
+ onFailure: (reason) => onCardFailure(owner.id, reason)
7478
8297
  }, /* @__PURE__ */ h(ModuleHost, {
7479
8298
  module: owner,
7480
8299
  step: top.kind,
@@ -7507,7 +8326,8 @@ function BoardContent({ top, plan, world, board, twoColumns, panelToken, onPanel
7507
8326
  key,
7508
8327
  unit: module.id,
7509
8328
  resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
7510
- t
8329
+ t,
8330
+ onFailure: (reason) => onCardFailure(module.id, reason)
7511
8331
  }, /* @__PURE__ */ h(ModuleHost, {
7512
8332
  module,
7513
8333
  world,
@@ -7557,6 +8377,16 @@ function Rightbar(props) {
7557
8377
  [id]: next
7558
8378
  }));
7559
8379
  }, []);
8380
+ const onCardFailure = useCallback((unit, reason) => {
8381
+ reportPanelCrash({
8382
+ unit,
8383
+ reason
8384
+ });
8385
+ }, []);
8386
+ const fixtureMode = mockModeOn(window.location.search) || crashModeOn(window.location.search);
8387
+ useEffect(() => {
8388
+ setPanelWorkspace(fixtureMode ? null : boardWorkspace);
8389
+ }, [boardWorkspace, fixtureMode]);
7560
8390
  const summary = aggregateSummaries(plan.modules.map((entry) => summaries[entry.module.id]).filter((item) => item !== void 0));
7561
8391
  const feedEnabled = plan.modules.length > 0 || plan.reading;
7562
8392
  const shown = state.expanded;
@@ -7622,6 +8452,7 @@ function Rightbar(props) {
7622
8452
  onOpenMarket: openMarket,
7623
8453
  onSummary,
7624
8454
  onOpenModules: () => setModulesOpen(true),
8455
+ onCardFailure,
7625
8456
  buildModule: props.buildModule,
7626
8457
  t: props.t
7627
8458
  })));
@@ -8122,10 +8953,7 @@ function SessionLeading({ node, statuses, renderSlot }) {
8122
8953
  if (node.blank) return null;
8123
8954
  const primary = statuses[0];
8124
8955
  if (primary === void 0 || primary.state === "idle") return /* @__PURE__ */ h(Fragment, null, renderSlot("sidebar.session.row.leading", { sessionId: node.id }));
8125
- return /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
8126
- state: primary.state,
8127
- size: 10
8128
- }), statuses.map((status) => /* @__PURE__ */ h("span", {
8956
+ return /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: primary.state }), statuses.map((status) => /* @__PURE__ */ h("span", {
8129
8957
  className: "wb-visuallyHidden",
8130
8958
  key: status.label
8131
8959
  }, status.label)));
@@ -8200,6 +9028,21 @@ function SessionList({ workspace, pinnedIds, archived, panelActive, useSessions,
8200
9028
  function panelLabel(entry) {
8201
9029
  return typeof entry.label === "function" ? entry.label() : entry.label;
8202
9030
  }
9031
+ function addWorkspace(input) {
9032
+ input.add().catch(() => null).then((path) => {
9033
+ if (path === null || path === "") return;
9034
+ input.onBusy(true);
9035
+ input.onFailed(false);
9036
+ input.create(path).catch(() => void 0).then((view) => {
9037
+ input.onBusy(false);
9038
+ if (view?.workspaceId === void 0) {
9039
+ input.onFailed(true);
9040
+ return;
9041
+ }
9042
+ input.onCreated(view.workspaceId);
9043
+ });
9044
+ });
9045
+ }
8203
9046
  function Sidebar(props) {
8204
9047
  const { collapsed, renderSlot, t, useWorkspaces, usePanelInfo } = props;
8205
9048
  const items = useWorkspaces((state) => state.items);
@@ -8209,6 +9052,8 @@ function Sidebar(props) {
8209
9052
  const sessions = props.useSessions((state) => state);
8210
9053
  const [storedId, setStoredId] = useState(() => selectedProjectId());
8211
9054
  const [panelEntries, setPanelEntries] = useState(() => props.listPanels());
9055
+ const [creating, setCreating] = useState(false);
9056
+ const [createFailed, setCreateFailed] = useState(false);
8212
9057
  useEffect(() => props.subscribePanels(() => setPanelEntries(props.listPanels())), [props]);
8213
9058
  useEffect(() => subscribeProject(() => setStoredId(selectedProjectId())), []);
8214
9059
  const current = items.find((workspace) => workspace.workspaceId === storedId) ?? items[0] ?? null;
@@ -8226,11 +9071,12 @@ function Sidebar(props) {
8226
9071
  });
8227
9072
  };
8228
9073
  const addProject = () => {
8229
- props.pickDirectory().then((path) => {
8230
- if (path === null || path === "") return;
8231
- props.createWorkspace(path).then((view) => {
8232
- if (view?.workspaceId !== void 0) pickProject(view.workspaceId);
8233
- });
9074
+ addWorkspace({
9075
+ add: props.pickDirectory,
9076
+ create: props.createWorkspace,
9077
+ onBusy: setCreating,
9078
+ onFailed: setCreateFailed,
9079
+ onCreated: pickProject
8234
9080
  });
8235
9081
  };
8236
9082
  const wide = !collapsed;
@@ -8261,14 +9107,20 @@ function Sidebar(props) {
8261
9107
  size: isWide ? 16 : 18,
8262
9108
  active
8263
9109
  }, { only: id })
8264
- }))), wide ? /* @__PURE__ */ h(ProjectSwitcher, {
9110
+ }))), wide ? /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(ProjectSwitcher, {
8265
9111
  items,
8266
9112
  current,
8267
9113
  onPick: pickProject,
8268
9114
  onAdd: addProject,
8269
9115
  onRename: props.renameWorkspace,
8270
9116
  t
8271
- }) : null, /* @__PURE__ */ h(WorkspaceSection, {
9117
+ }), creating ? /* @__PURE__ */ h("p", {
9118
+ className: "wb-workspaceBusy",
9119
+ role: "status"
9120
+ }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
9121
+ state: "ongoing",
9122
+ size: 12
9123
+ }), t("project.add.busy")) : null, createFailed ? /* @__PURE__ */ h("p", { className: "wb-workspaceError" }, t("project.add.failed")) : null) : null, /* @__PURE__ */ h(WorkspaceSection, {
8272
9124
  t,
8273
9125
  wide,
8274
9126
  onNewSession: () => {
@@ -8307,7 +9159,7 @@ var palette_default = ":root {\n --wb-static-titlebar-fill: #ffffff8c;\n --wb-
8307
9159
  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";
8308
9160
  //#endregion
8309
9161
  //#region src/shared/styles/sidebar-app.css?raw
8310
- 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}";
9162
+ 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}";
8311
9163
  //#endregion
8312
9164
  //#region src/shared/styles/sidebar.css?raw
8313
9165
  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";
@@ -8394,6 +9246,12 @@ function useApiResource(route, query, refreshToken, options = {}) {
8394
9246
  ...prev.at === void 0 ? {} : { at: prev.at }
8395
9247
  } : { phase: "loading" });
8396
9248
  const flight = requestResource(route, queryRef.current, key);
9249
+ const owner = unitOfRoute(route);
9250
+ if (owner !== null) reportPanelRead({
9251
+ unit: owner,
9252
+ route,
9253
+ phase: "loading"
9254
+ });
8397
9255
  flight.task.then((response) => {
8398
9256
  if (cancelled) return;
8399
9257
  if (response.ok) {
@@ -8402,19 +9260,43 @@ function useApiResource(route, query, refreshToken, options = {}) {
8402
9260
  value: response,
8403
9261
  at: Date.now()
8404
9262
  });
9263
+ if (owner !== null) reportPanelRead({
9264
+ unit: owner,
9265
+ route,
9266
+ phase: "ready"
9267
+ });
8405
9268
  return;
8406
9269
  }
8407
9270
  setState({
8408
9271
  phase: "error",
8409
9272
  error: response.error
8410
9273
  });
9274
+ if (owner !== null) reportPanelRead({
9275
+ unit: owner,
9276
+ route,
9277
+ phase: "error",
9278
+ error: {
9279
+ code: response.error.code,
9280
+ message: response.error.message
9281
+ }
9282
+ });
8411
9283
  }).catch((reason) => {
8412
9284
  if (cancelled) return;
9285
+ const message = reason instanceof Error ? reason.message : String(reason);
8413
9286
  setState({
8414
9287
  phase: "error",
8415
9288
  error: {
8416
9289
  code: "network",
8417
- message: reason instanceof Error ? reason.message : String(reason)
9290
+ message
9291
+ }
9292
+ });
9293
+ if (owner !== null) reportPanelRead({
9294
+ unit: owner,
9295
+ route,
9296
+ phase: "error",
9297
+ error: {
9298
+ code: "network",
9299
+ message
8418
9300
  }
8419
9301
  });
8420
9302
  });
@@ -8683,7 +9565,7 @@ function messagesOf(units) {
8683
9565
  ...face.messages === void 0 ? {} : { messages: face.messages }
8684
9566
  }));
8685
9567
  }
8686
- 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*/";
9568
+ 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*/";
8687
9569
  function workbenchCss() {
8688
9570
  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}`;
8689
9571
  }
@@ -8817,16 +9699,6 @@ function mount(ctx) {
8817
9699
  };
8818
9700
  const rightbarHooks = { hooks: { rightbar: observable } };
8819
9701
  const sidebarRight = () => ctx.get("sidebarRight");
8820
- const dshColumn = createDshColumnSource(() => {
8821
- const official = sidebarRight();
8822
- if (official === void 0) return false;
8823
- return official.mounted.getSnapshot() === void 0 || official.isExpanded();
8824
- }, 400);
8825
- let pendingDshOpen = false;
8826
- let pendingOfficialCall;
8827
- let unsubscribeOfficial;
8828
- let restoreOfficial;
8829
- let officialShimmed = false;
8830
9702
  let workbenchColumnArmed = false;
8831
9703
  let disposeWorkbenchColumn;
8832
9704
  const armWorkbenchColumn = () => {
@@ -8848,87 +9720,37 @@ function mount(ctx) {
8848
9720
  disposeWorkbenchColumn?.();
8849
9721
  disposeWorkbenchColumn = void 0;
8850
9722
  };
8851
- const flushOfficialCall = () => {
8852
- const official = sidebarRight();
8853
- if (official === void 0 || official.mounted.getSnapshot() === void 0) return;
8854
- if (pendingDshOpen) {
8855
- pendingDshOpen = false;
8856
- if (!official.isExpanded()) official.toggleExpanded();
8857
- }
8858
- const call = pendingOfficialCall;
8859
- pendingOfficialCall = void 0;
8860
- call?.();
8861
- };
8862
- const watchOfficial = () => {
8863
- const official = sidebarRight();
8864
- if (official === void 0 || unsubscribeOfficial !== void 0) return;
8865
- unsubscribeOfficial = official.mounted.subscribe(flushOfficialCall);
8866
- };
8867
- const armDshColumn = () => {
8868
- const official = sidebarRight();
8869
- if (official === void 0) return false;
8870
- if (official.mounted.getSnapshot() !== void 0) {
8871
- if (!official.isExpanded()) official.toggleExpanded();
8872
- return true;
8873
- }
8874
- watchOfficial();
8875
- store.setColumn("dsh");
8876
- ctx.layout.closeRightbar();
8877
- releaseWorkbenchColumn();
8878
- pendingDshOpen = true;
8879
- return false;
8880
- };
8881
- const openInDshColumn = (call) => {
8882
- shimOfficialNavigation();
8883
- if (sidebarRight() === void 0) return;
8884
- if (armDshColumn()) {
8885
- call();
8886
- return;
9723
+ const borrow = createDshBorrow({
9724
+ official: sidebarRight,
9725
+ yieldColumn: () => {
9726
+ store.setColumn("dsh");
9727
+ ctx.layout.closeRightbar();
9728
+ releaseWorkbenchColumn();
9729
+ },
9730
+ reclaimColumn: () => {
9731
+ store.setColumn("workbench");
9732
+ armWorkbenchColumn();
9733
+ store.setExpanded(true);
8887
9734
  }
8888
- pendingOfficialCall = call;
8889
- };
8890
- const shimOfficialNavigation = () => {
8891
- const official = sidebarRight();
8892
- if (official === void 0 || officialShimmed) return;
8893
- const { openResource, openTab } = official;
8894
- if (typeof openResource !== "function" || typeof openTab !== "function") return;
8895
- officialShimmed = true;
8896
- official.openResource = (address, options) => openInDshColumn(() => openResource.call(official, address, options));
8897
- official.openTab = (kind, options) => openInDshColumn(() => openTab.call(official, kind, options));
8898
- restoreOfficial = () => {
8899
- official.openResource = openResource;
8900
- official.openTab = openTab;
8901
- officialShimmed = false;
8902
- };
8903
- };
9735
+ });
9736
+ const dshColumn = createDshColumnSource(() => borrow.open(), 400);
8904
9737
  const selectColumn = (column) => {
8905
9738
  if (store.getSnapshot().column === column) {
8906
9739
  if (column === "workbench") {
8907
9740
  rightbarActions.toggleRightbar();
8908
9741
  return;
8909
9742
  }
8910
- const current = sidebarRight();
8911
- if (current === void 0 || current.mounted.getSnapshot() === void 0) return;
8912
- current.toggleExpanded();
9743
+ borrow.toggle();
8913
9744
  return;
8914
9745
  }
8915
9746
  if (column === "workbench") {
8916
- store.setColumn("workbench");
8917
- pendingDshOpen = false;
8918
- armWorkbenchColumn();
8919
- store.setExpanded(true);
9747
+ borrow.back();
8920
9748
  return;
8921
9749
  }
8922
- openInDshColumn(() => {});
8923
- };
8924
- ctx.effect(() => () => {
8925
- unsubscribeOfficial?.();
8926
- unsubscribeOfficial = void 0;
8927
- restoreOfficial?.();
8928
- restoreOfficial = void 0;
8929
- }, "dsh-workbench: 官方椅面订阅与借道");
8930
- shimOfficialNavigation();
8931
- watchOfficial();
9750
+ borrow.use();
9751
+ };
9752
+ ctx.effect(() => () => borrow.dispose(), "dsh-workbench: 官方椅面订阅与借道");
9753
+ borrow.start();
8932
9754
  if (store.getSnapshot().column === "workbench") armWorkbenchColumn();
8933
9755
  ctx.slots.inject("sidebar", () => ctx.slots.register({
8934
9756
  name: "sidebar",