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