@dsh-workbench/core 0.2.0 → 0.2.1

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