@dsh-workbench/core 0.2.0 → 0.2.2

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