@dsh-workbench/core 0.1.8 → 0.1.10

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 (37) hide show
  1. package/client.js +983 -391
  2. package/dist/client/client.body.js +983 -391
  3. package/dist/client/index.js +984 -392
  4. package/dist/host/index.js +366 -106
  5. package/dist/types/app/client.d.ts +140 -12
  6. package/dist/types/app/layouts/env-gate/__tests__/gate-deadline.test.d.ts +1 -0
  7. package/dist/types/app/layouts/env-gate/gate-deadline.d.ts +4 -0
  8. package/dist/types/app/layouts/rightbar/MarketStates.d.ts +7 -0
  9. package/dist/types/app/layouts/rightbar/MarketView.d.ts +2 -1
  10. package/dist/types/app/layouts/rightbar/SharedSection.d.ts +11 -0
  11. package/dist/types/app/layouts/rightbar/__tests__/market-change.test.d.ts +1 -0
  12. package/dist/types/app/layouts/rightbar/__tests__/market-live.test.d.ts +1 -0
  13. package/dist/types/app/layouts/rightbar/__tests__/market-settle.test.d.ts +1 -0
  14. package/dist/types/app/layouts/rightbar/board-plan.d.ts +2 -0
  15. package/dist/types/app/layouts/rightbar/market-change.d.ts +4 -0
  16. package/dist/types/app/layouts/rightbar/market-rows.d.ts +3 -1
  17. package/dist/types/app/layouts/rightbar/market-settle.d.ts +2 -0
  18. package/dist/types/app/layouts/rightbar/market-view-text.d.ts +10 -0
  19. package/dist/types/app/layouts/sidebar/ProjectSwitcher.d.ts +2 -2
  20. package/dist/types/app/layouts/sidebar/Sidebar.d.ts +1 -1
  21. package/dist/types/app/layouts/sidebar/WorkspaceRenameDialog.d.ts +8 -0
  22. package/dist/types/app/layouts/sidebar/WorkspaceRowAction.d.ts +7 -0
  23. package/dist/types/app/layouts/sidebar/WorkspaceRowLabel.d.ts +8 -0
  24. package/dist/types/app/layouts/sidebar/WorkspaceSearchField.d.ts +9 -0
  25. package/dist/types/app/layouts/sidebar/__tests__/workspace-name.test.d.ts +1 -0
  26. package/dist/types/app/layouts/sidebar/workspace-items.d.ts +11 -0
  27. package/dist/types/app/layouts/sidebar/workspace-name.d.ts +16 -0
  28. package/dist/types/app/units/__tests__/registry.test.d.ts +1 -0
  29. package/dist/types/app/units/fixture-unit-mock.d.ts +3 -1
  30. package/dist/types/modules/panels/__tests__/market-registries.test.d.ts +1 -0
  31. package/dist/types/modules/panels/model/market.d.ts +2 -0
  32. package/dist/types/shared/api/host/__tests__/profile-registries.test.d.ts +1 -0
  33. package/dist/types/shared/api/host/mount-units.d.ts +13 -6
  34. package/dist/types/shared/api/host/profile-registries.d.ts +21 -0
  35. package/dist/types/shared/hooks/mock-mode.d.ts +1 -0
  36. package/docs/OPERATIONS.md +2 -0
  37. package/package.json +2 -2
@@ -139,6 +139,14 @@ function blockerOfCapability(capability, t) {
139
139
  }] : [],
140
140
  ...capability.command === void 0 || sourceUnknown ? [] : [copyAction(t, capability.command)]
141
141
  ];
142
+ if (capability.status === "failed") return {
143
+ id: "unit-mount-failed",
144
+ severity: "block",
145
+ title: t("env.unit.failed"),
146
+ hint: t("env.unit.failedHint"),
147
+ ...capability.detail === void 0 ? {} : { detail: capability.detail },
148
+ actions: [retryAction(t)]
149
+ };
142
150
  if (capability.status === "missing-plugin") return {
143
151
  id: "unit-missing-plugin",
144
152
  severity: "block",
@@ -475,6 +483,7 @@ async function apiPost(route, body) {
475
483
  var react = require("react");
476
484
  var h = react.createElement;
477
485
  var Fragment = react.Fragment;
486
+ var Component = react.Component;
478
487
  var useState = react.useState;
479
488
  var useEffect = react.useEffect;
480
489
  var useLayoutEffect = react.useLayoutEffect;
@@ -517,6 +526,46 @@ function ActivityAction({ label, hint, icon, href, onClick, failed }) {
517
526
  }));
518
527
  }
519
528
  //#endregion
529
+ //#region ../shared/dist/components/Note.js
530
+ function Note({ tone = "muted", as, children }) {
531
+ const className = tone === "problem" ? "wb-problem" : "wb-note";
532
+ return as === "span" ? h("span", { className }, children) : h("p", { className }, children);
533
+ }
534
+ //#endregion
535
+ //#region ../shared/dist/components/CardBoundary.js
536
+ function errorReasonOf(error) {
537
+ if (error instanceof Error) return error.message;
538
+ return typeof error === "string" ? error : JSON.stringify(error) ?? String(error);
539
+ }
540
+ var CardBoundary = class extends Component {
541
+ state = { reason: null };
542
+ static getDerivedStateFromError(error) {
543
+ return { reason: errorReasonOf(error) };
544
+ }
545
+ componentDidCatch(error) {
546
+ console.error(`[dsh-workbench] 模块 ${this.props.unit} 渲染失败:${errorReasonOf(error)}`, error);
547
+ }
548
+ componentDidUpdate(previous) {
549
+ if (previous.resetKey !== this.props.resetKey && this.state.reason !== null) this.setState({ reason: null });
550
+ }
551
+ retry = () => {
552
+ this.setState({ reason: null });
553
+ };
554
+ render() {
555
+ const { reason } = this.state;
556
+ if (reason === null) return this.props.children;
557
+ return h(Note, { tone: "problem" }, h("span", null, this.props.t("panels.cardBroken", {
558
+ unit: this.props.unit,
559
+ reason
560
+ })), " ", h(_deepseek_ai_dsh_client_ui_primitives.Button, {
561
+ type: "button",
562
+ variant: "outline",
563
+ size: "sm",
564
+ onClick: this.retry
565
+ }, this.props.t("panels.cardRetry")));
566
+ }
567
+ };
568
+ //#endregion
520
569
  //#region ../shared/dist/components/ApprovalDetail.js
521
570
  function callOf(snapshot, callId) {
522
571
  if (callId === void 0) return void 0;
@@ -547,10 +596,17 @@ function ApprovalDetail(props) {
547
596
  };
548
597
  const command = typeof args.command === "string" ? args.command : "";
549
598
  const owner = (props.units ?? []).find((face) => face.approval?.tools.includes(input.tool) === true);
550
- if (owner?.approval !== void 0) return h(owner.approval.render, {
551
- input,
552
- t
553
- });
599
+ if (owner?.approval !== void 0) {
600
+ const Render = owner.approval.render;
601
+ return h(CardBoundary, {
602
+ unit: owner.manifest.id,
603
+ resetKey: props.callId ?? "",
604
+ t
605
+ }, h(Render, {
606
+ input,
607
+ t
608
+ }));
609
+ }
554
610
  if (command === "") return null;
555
611
  return h(_deepseek_ai_dsh_client_ui_primitives.CodeBlock, {
556
612
  code: command,
@@ -713,12 +769,6 @@ function MockStrip({ mocks, index, onPick, note, real }) {
713
769
  }, mock.label)));
714
770
  }
715
771
  //#endregion
716
- //#region ../shared/dist/components/Note.js
717
- function Note({ tone = "muted", as, children }) {
718
- const className = tone === "problem" ? "wb-problem" : "wb-note";
719
- return as === "span" ? h("span", { className }, children) : h("p", { className }, children);
720
- }
721
- //#endregion
722
772
  //#region ../shared/dist/components/ResourceStates.js
723
773
  function SkeletonRows({ rows = 4 }) {
724
774
  return h("div", {
@@ -929,6 +979,20 @@ var en = {
929
979
  "project.none": "No project",
930
980
  "project.empty": "No projects yet. Use “Add project” below.",
931
981
  "project.add": "Add project…",
982
+ "project.search.label": "Search workspaces",
983
+ "project.search.placeholder": "Search workspaces (folder / name / path)",
984
+ "project.search.empty": "No workspace matches “{query}”.",
985
+ "project.rename.row": "Rename “{name}”",
986
+ "project.rename.current": "Give this workspace a display name…",
987
+ "project.rename.title": "Give “{name}” a display name",
988
+ "project.rename.description": "Shown after the folder name. It renames the workspace itself.",
989
+ "project.rename.field": "Display name",
990
+ "project.rename.placeholder": "e.g. Workbench shell",
991
+ "project.rename.hint": "Empty = folder name only",
992
+ "project.rename.save": "Save",
993
+ "project.rename.saving": "Saving…",
994
+ "project.rename.cancel": "Cancel",
995
+ "project.rename.failed": "Rename failed. Try again.",
932
996
  "session.new": "New session",
933
997
  "session.new.label": "Start a session in the current project",
934
998
  "session.empty": "No sessions in this project yet.",
@@ -957,6 +1021,7 @@ var en = {
957
1021
  "panels.dragHint": "Drag to reorder",
958
1022
  "panels.unknownStep": "No suite provides this view",
959
1023
  "panels.labelWithHint": "{label} ({hint})",
1024
+ "panels.dep.failed": "⚠ failed to start",
960
1025
  "panels.dep.missingPlugin": "⚠ not ready yet",
961
1026
  "panels.dep.missingCommands": "⚠ needs an update",
962
1027
  "panels.dep.unchecked": "⚠ cannot check",
@@ -1001,7 +1066,7 @@ var en = {
1001
1066
  "panels.market.empty": "No modules available",
1002
1067
  "panels.market.installedSection": "Installed",
1003
1068
  "panels.market.moduleOutdated": "update available",
1004
- "panels.market.moduleRestartHint": "it may need a restart after installing",
1069
+ "panels.market.moduleRestartHint": "installed but not active — restart dsh once to bring it up",
1005
1070
  "panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
1006
1071
  "panels.market.foot": "After installing, enable it in the panel page of that project.",
1007
1072
  "panels.market.recheck": "Check for updates",
@@ -1150,6 +1215,8 @@ var en = {
1150
1215
  "blocker.exec.hint": "Make sure opencli is installed and on PATH (which opencli).",
1151
1216
  "blocker.unknown.title": "Something went wrong",
1152
1217
  "panels.reading": "Reading the panel setup…",
1218
+ "panels.cardBroken": "This module will not render: {unit} ({reason})",
1219
+ "panels.cardRetry": "Retry",
1153
1220
  "panels.empty": "No modules on the panel yet",
1154
1221
  "panels.emptyHint": "You can also just tell the agent: “add a module to the panel”.",
1155
1222
  "env.title": "Preparing the workbench",
@@ -1188,6 +1255,8 @@ var en = {
1188
1255
  "env.step.warm": "Warming up site sessions",
1189
1256
  "env.warm.done": "{n} site(s) warmed up",
1190
1257
  "env.warm.short": "Not warmed this time — harmless; the panel heals on first read",
1258
+ "env.unit.failed": "This module cannot start",
1259
+ "env.unit.failedHint": "It failed while assembling itself; other modules are unaffected.",
1191
1260
  "env.unit.missingPlugin": "This module is not ready yet",
1192
1261
  "env.unit.missingCommandsHint": "Updating it should fix this.",
1193
1262
  "env.unit.unchecked": "Cannot check: no shell channel",
@@ -1221,6 +1290,20 @@ var zh = {
1221
1290
  "project.none": "未选择项目",
1222
1291
  "project.empty": "还没有项目。用下面的「添加项目」选一个目录。",
1223
1292
  "project.add": "添加项目…",
1293
+ "project.search.label": "搜索工作区",
1294
+ "project.search.placeholder": "搜索工作区(目录名 / 中文名 / 路径)",
1295
+ "project.search.empty": "没有匹配「{query}」的工作区。",
1296
+ "project.rename.row": "改「{name}」的中文名",
1297
+ "project.rename.current": "改当前工作区的中文名…",
1298
+ "project.rename.title": "给「{name}」配一个中文名",
1299
+ "project.rename.description": "显示在目录名后面。改的是工作区本身的名字。",
1300
+ "project.rename.field": "中文名",
1301
+ "project.rename.placeholder": "例如:工作台外壳",
1302
+ "project.rename.hint": "留空 = 只显示目录名",
1303
+ "project.rename.save": "保存",
1304
+ "project.rename.saving": "保存中…",
1305
+ "project.rename.cancel": "取消",
1306
+ "project.rename.failed": "改名失败了,再试一次。",
1224
1307
  "session.new": "新会话",
1225
1308
  "session.new.label": "在当前项目新建会话",
1226
1309
  "session.empty": "这个项目还没有会话。",
@@ -1249,6 +1332,7 @@ var zh = {
1249
1332
  "panels.dragHint": "拖动调整顺序",
1250
1333
  "panels.unknownStep": "这一层没有套件提供",
1251
1334
  "panels.labelWithHint": "{label}({hint})",
1335
+ "panels.dep.failed": "⚠ 起不来",
1252
1336
  "panels.dep.missingPlugin": "⚠ 还没装好",
1253
1337
  "panels.dep.missingCommands": "⚠ 需要更新",
1254
1338
  "panels.dep.unchecked": "⚠ 检测不了",
@@ -1293,7 +1377,7 @@ var zh = {
1293
1377
  "panels.market.empty": "暂无可用模块",
1294
1378
  "panels.market.installedSection": "已装",
1295
1379
  "panels.market.moduleOutdated": "有新版",
1296
- "panels.market.moduleRestartHint": "安装完成后可能需要重启才生效",
1380
+ "panels.market.moduleRestartHint": "装好了但还没生效 —— 重启一次 dsh 就会出来",
1297
1381
  "panels.market.restartNeeded": "新版装好了,重启一次才生效。",
1298
1382
  "panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
1299
1383
  "panels.market.recheck": "重新检查更新",
@@ -1442,6 +1526,8 @@ var zh = {
1442
1526
  "blocker.exec.hint": "确认 opencli 已安装且在 PATH 里(which opencli)。",
1443
1527
  "blocker.unknown.title": "出了点问题",
1444
1528
  "panels.reading": "正在读取面板配置…",
1529
+ "panels.cardBroken": "这个模块起不来:{unit}({reason})",
1530
+ "panels.cardRetry": "重试",
1445
1531
  "panels.empty": "面板里还没有模块",
1446
1532
  "panels.emptyHint": "也可以直接跟 agent 说:「把某个模块加到面板」。",
1447
1533
  "env.title": "准备工作台",
@@ -1480,6 +1566,8 @@ var zh = {
1480
1566
  "env.step.warm": "预热站点登录态",
1481
1567
  "env.warm.done": "已预热 {n} 个站点",
1482
1568
  "env.warm.short": "这次没热上 —— 不影响用,面板第一次读取会自己补",
1569
+ "env.unit.failed": "这个模块起不来",
1570
+ "env.unit.failedHint": "它自己装配时报了错,别的模块不受影响。",
1483
1571
  "env.unit.missingPlugin": "这个模块还没装好",
1484
1572
  "env.unit.missingCommandsHint": "更新之后就能用了。",
1485
1573
  "env.unit.unchecked": "检测不了:拿不到执行通道",
@@ -1538,6 +1626,31 @@ function mergeMessages(base, contributions) {
1538
1626
  en
1539
1627
  };
1540
1628
  }
1629
+ function reasonOf(error) {
1630
+ if (error instanceof Error) return error.message;
1631
+ return typeof error === "string" ? error : String(error);
1632
+ }
1633
+ function mergeMessagesSkipping(base, contributions) {
1634
+ let dictionaries = base;
1635
+ const accepted = [];
1636
+ const problems = [];
1637
+ for (const item of contributions) {
1638
+ if (item.messages === void 0) continue;
1639
+ try {
1640
+ dictionaries = mergeMessages(base, [...accepted, item]);
1641
+ accepted.push(item);
1642
+ } catch (error) {
1643
+ problems.push({
1644
+ unit: item.unit,
1645
+ reason: reasonOf(error)
1646
+ });
1647
+ }
1648
+ }
1649
+ return {
1650
+ dictionaries,
1651
+ problems
1652
+ };
1653
+ }
1541
1654
  //#endregion
1542
1655
  //#region ../shared/dist/lib/blocker-action.js
1543
1656
  function blockerPending(busy, running) {
@@ -1613,9 +1726,11 @@ var dist_exports = /* @__PURE__ */ __exportAll({
1613
1726
  CODING_ISSUES_SERVICE: () => CODING_ISSUES_SERVICE,
1614
1727
  CONTEXT_MARKER_NAME: () => CONTEXT_MARKER_NAME,
1615
1728
  Card: () => Card,
1729
+ CardBoundary: () => CardBoundary,
1616
1730
  CardHead: () => CardHead,
1617
1731
  CenteredState: () => CenteredState,
1618
1732
  ChoiceGroup: () => ChoiceGroup,
1733
+ Component: () => Component,
1619
1734
  DEFAULT_WORKSPACE_TITLE: () => DEFAULT_WORKSPACE_TITLE,
1620
1735
  EVENTS_PATH: () => EVENTS_PATH,
1621
1736
  EmptyState: () => EmptyState,
@@ -1675,6 +1790,7 @@ var dist_exports = /* @__PURE__ */ __exportAll({
1675
1790
  dictionaries: () => dictionaries,
1676
1791
  en: () => en,
1677
1792
  encodeRef: () => encodeRef,
1793
+ errorReasonOf: () => errorReasonOf,
1678
1794
  excerpt: () => excerpt,
1679
1795
  factOfRoute: () => factOfRoute,
1680
1796
  gateOf: () => gateOf,
@@ -1686,6 +1802,7 @@ var dist_exports = /* @__PURE__ */ __exportAll({
1686
1802
  longTaskRunsOf: () => longTaskRunsOf,
1687
1803
  markerBody: () => markerBody,
1688
1804
  mergeMessages: () => mergeMessages,
1805
+ mergeMessagesSkipping: () => mergeMessagesSkipping,
1689
1806
  parseFactFrame: () => parseFactFrame,
1690
1807
  parseJsonLoose: () => parseJsonLoose,
1691
1808
  parseLocalTimestamp: () => parseLocalTimestamp,
@@ -1845,10 +1962,10 @@ function setProbe(next) {
1845
1962
  }
1846
1963
  var CAPABILITY_FACT = "capability";
1847
1964
  var shared = null;
1848
- var current = null;
1965
+ var current$1 = null;
1849
1966
  var listeners$2 = /* @__PURE__ */ new Set();
1850
1967
  function capabilityValue() {
1851
- return current;
1968
+ return current$1;
1852
1969
  }
1853
1970
  function subscribeCapabilities(listener) {
1854
1971
  listeners$2.add(listener);
@@ -1862,8 +1979,8 @@ function setCapabilities(next, rechecked = false) {
1862
1979
  ...probe$2,
1863
1980
  checkedAt: Date.now()
1864
1981
  });
1865
- if (next === current) return;
1866
- current = next;
1982
+ if (next === current$1) return;
1983
+ current$1 = next;
1867
1984
  for (const listener of [...listeners$2]) listener();
1868
1985
  }
1869
1986
  function beginProbe() {
@@ -1972,10 +2089,16 @@ function useCapabilityMap(refreshToken) {
1972
2089
  }
1973
2090
  //#endregion
1974
2091
  //#region src/shared/hooks/mock-mode.ts
1975
- var mock_mode_exports = /* @__PURE__ */ __exportAll({ mockModeOn: () => mockModeOn });
2092
+ var mock_mode_exports = /* @__PURE__ */ __exportAll({
2093
+ crashModeOn: () => crashModeOn,
2094
+ mockModeOn: () => mockModeOn
2095
+ });
1976
2096
  function mockModeOn(search) {
1977
2097
  return /(?:^|[?&])(?:wbMock|wbMarketMock)=1(?:&|$)/.test(search);
1978
2098
  }
2099
+ function crashModeOn(search) {
2100
+ return /(?:^|[?&])wbCrash=1(?:&|$)/.test(search);
2101
+ }
1979
2102
  //#endregion
1980
2103
  //#region src/shared/hooks/use-fixture-pick.ts
1981
2104
  var use_fixture_pick_exports = /* @__PURE__ */ __exportAll({ useFixturePick: () => useFixturePick });
@@ -2037,6 +2160,14 @@ function shouldProbeOnEnter(input) {
2037
2160
  return input.now - input.checkedAt >= input.staleMs;
2038
2161
  }
2039
2162
  //#endregion
2163
+ //#region src/app/layouts/rightbar/market-settle.ts
2164
+ var MODULE_SETTLE_MS = 15e3;
2165
+ function holdBack(installed, roster, active, previous) {
2166
+ const pending = installed.filter((unit) => !roster.has(unit));
2167
+ const fresh = previous === null ? [] : pending.filter((unit) => !previous.has(unit));
2168
+ return pending.filter((unit) => active.has(unit) || fresh.includes(unit));
2169
+ }
2170
+ //#endregion
2040
2171
  //#region src/app/layouts/rightbar/market-mock.ts
2041
2172
  function installable(manifest) {
2042
2173
  return {
@@ -2561,7 +2692,11 @@ function createClientUnitRegistry() {
2561
2692
  let manifestsCache;
2562
2693
  function notify() {
2563
2694
  revision += 1;
2564
- for (const listener of listeners) listener();
2695
+ for (const listener of [...listeners]) try {
2696
+ listener();
2697
+ } catch (error) {
2698
+ console.warn(`[dsh-workbench] 套件注册的订阅者报错(不影响其它订阅者与这次注册):${String(error)}`);
2699
+ }
2565
2700
  }
2566
2701
  return {
2567
2702
  register(face) {
@@ -2596,6 +2731,7 @@ function createClientUnitRegistry() {
2596
2731
  //#endregion
2597
2732
  //#region src/app/units/fixture-unit-mock.tsx
2598
2733
  var FIXTURE_UNIT_ID = "wb-fixture";
2734
+ var CRASH_UNIT_ID = "wb-fixture-crash";
2599
2735
  var KEY = {
2600
2736
  cardTitle: `${FIXTURE_UNIT_ID}.cardTitle`,
2601
2737
  cardMeta: `${FIXTURE_UNIT_ID}.cardMeta`,
@@ -2649,6 +2785,39 @@ var FIXTURE_FACE = {
2649
2785
  messages,
2650
2786
  card: FixtureCard
2651
2787
  };
2788
+ var CRASH_KEY = {
2789
+ cardTitle: `${CRASH_UNIT_ID}.cardTitle`,
2790
+ cardMeta: `${CRASH_UNIT_ID}.cardMeta`
2791
+ };
2792
+ var crashMessages = {
2793
+ zh: {
2794
+ [CRASH_KEY.cardTitle]: "崩溃的卡片",
2795
+ [CRASH_KEY.cardMeta]: "夹具:渲染时抛错"
2796
+ },
2797
+ en: {
2798
+ [CRASH_KEY.cardTitle]: "Crashing card",
2799
+ [CRASH_KEY.cardMeta]: "Fixture: throws while rendering"
2800
+ }
2801
+ };
2802
+ var crashManifest = {
2803
+ id: CRASH_UNIT_ID,
2804
+ kind: "board",
2805
+ card: {
2806
+ titleKey: CRASH_KEY.cardTitle,
2807
+ order: 899,
2808
+ enabledByDefault: true
2809
+ },
2810
+ tools: [],
2811
+ host: { inject: [] }
2812
+ };
2813
+ function CrashingCard() {
2814
+ throw new Error("夹具:这张卡片按 wbCrash=1 故意渲染失败(守「一张卡片崩溃不带走面板」)");
2815
+ }
2816
+ var CRASH_FACE = {
2817
+ manifest: crashManifest,
2818
+ messages: crashMessages,
2819
+ card: CrashingCard
2820
+ };
2652
2821
  var SAMPLE_ROSTER = [manifest];
2653
2822
  function hasCard(roster) {
2654
2823
  return roster.some((item) => item.card !== null);
@@ -2656,8 +2825,9 @@ function hasCard(roster) {
2656
2825
  function fixtureRoster(roster) {
2657
2826
  return hasCard(roster) ? roster : SAMPLE_ROSTER;
2658
2827
  }
2659
- function fixtureSeed(roster, all) {
2660
- return hasCard(roster) ? all : [toBoardModule(FIXTURE_FACE)];
2828
+ function fixtureSeed(roster, all, crash = false) {
2829
+ const base = hasCard(roster) ? all : [toBoardModule(FIXTURE_FACE)];
2830
+ return crash ? [toBoardModule(CRASH_FACE), ...base] : base;
2661
2831
  }
2662
2832
  //#endregion
2663
2833
  //#region src/app/layouts/rightbar/market-rows.ts
@@ -2677,7 +2847,17 @@ var MARKET_DOT = {
2677
2847
  unchecked: "idle",
2678
2848
  unknown: "idle"
2679
2849
  };
2680
- function installedRows(modules, manifests, listed) {
2850
+ function mergeTitles(known, manifests) {
2851
+ let next = null;
2852
+ for (const manifest of manifests) {
2853
+ const titleKey = manifest.card?.titleKey;
2854
+ if (titleKey === void 0 || known.has(manifest.id)) continue;
2855
+ next ??= new Map(known);
2856
+ next.set(manifest.id, titleKey);
2857
+ }
2858
+ return next ?? known;
2859
+ }
2860
+ function installedRows(modules, manifests, listed, known) {
2681
2861
  const titles = new Map(manifests.map((manifest) => [manifest.id, manifest.card?.titleKey]));
2682
2862
  const rows = [];
2683
2863
  for (const module of modules) {
@@ -2686,8 +2866,9 @@ function installedRows(modules, manifests, listed) {
2686
2866
  const outdated = latest !== void 0 && latest !== module.installed;
2687
2867
  rows.push({
2688
2868
  id: module.unit,
2689
- titleKey: titles.get(module.unit) ?? module.pkg,
2869
+ titleKey: titles.get(module.unit) ?? known?.get(module.unit) ?? module.pkg,
2690
2870
  state: outdated ? "outdated" : "installed",
2871
+ hint: "panels.market.moduleRestartHint",
2691
2872
  pkg: module.pkg,
2692
2873
  canInstall: false,
2693
2874
  canUpdate: outdated,
@@ -2746,6 +2927,12 @@ function noteOf(state, install, manifest) {
2746
2927
  function isOnMachine(state) {
2747
2928
  return state === "installed" || state === "outdated";
2748
2929
  }
2930
+ function liveManifests(manifests, capabilities, installed) {
2931
+ if (capabilities === null || installed === null) return manifests;
2932
+ const gone = new Set(marketRows(manifests, capabilities).filter((row) => !installed.has(row.id) && marketActions$1(row).length === 0 && (row.state === "unknown" || row.state === "unchecked")).map((row) => row.id));
2933
+ if (gone.size === 0) return manifests;
2934
+ return manifests.filter((manifest) => !gone.has(manifest.id));
2935
+ }
2749
2936
  function marketHasUpdates(rows, shared = []) {
2750
2937
  return rows.some((row) => row.state === "outdated" || row.moduleUpdate !== void 0) || shared.some((row) => row.state === "outdated" || row.state === "unsatisfied");
2751
2938
  }
@@ -2875,6 +3062,7 @@ function sharedRows(manifests, capabilities) {
2875
3062
  ...bucket.installed === void 0 ? {} : { installed: bucket.installed },
2876
3063
  ...bucket.latest === void 0 ? {} : { latest: bucket.latest }
2877
3064
  };
3065
+ const detail = bucket.purpose === void 0 && bucket.command === void 0 ? void 0 : `${bucket.label}${bucket.purpose === void 0 ? "" : ` —— ${bucket.purpose}`}${bucket.command === void 0 ? "" : ` · ${bucket.command}`}`;
2878
3066
  rows.push({
2879
3067
  id: `${bucket.kind}:${bucket.name}`,
2880
3068
  label: bucket.label,
@@ -2882,7 +3070,7 @@ function sharedRows(manifests, capabilities) {
2882
3070
  state,
2883
3071
  canUpdate: state === "outdated" || state === "unsatisfied",
2884
3072
  ...version === void 0 ? {} : { version },
2885
- detail: `${bucket.label}${bucket.purpose === void 0 ? "" : ` —— ${bucket.purpose}`}${bucket.command === void 0 ? "" : ` · ${bucket.command}`}`
3073
+ ...detail === void 0 ? {} : { detail }
2886
3074
  });
2887
3075
  }
2888
3076
  return rows;
@@ -2939,15 +3127,188 @@ function useHostWrite(options) {
2939
3127
  clear
2940
3128
  };
2941
3129
  }
2942
- var PanelFoot_module_default = {
2943
- foot: "_foot_1us83_1",
2944
- footText: "_footText_1us83_12",
2945
- footTextMd: "_footTextMd_1us83_17"
3130
+ //#endregion
3131
+ //#region src/app/layouts/market/add-module-text.ts
3132
+ var GUIDE_ITEMS = [
3133
+ {
3134
+ titleKey: "panels.market.add.guideIdTitle",
3135
+ exampleKey: "panels.market.add.guideIdExample",
3136
+ hintKey: "panels.market.add.guideIdHint"
3137
+ },
3138
+ {
3139
+ titleKey: "panels.market.add.guideGitTitle",
3140
+ exampleKey: "panels.market.add.guideGitExample",
3141
+ hintKey: "panels.market.add.guideGitHint"
3142
+ },
3143
+ {
3144
+ titleKey: "panels.market.add.guidePathTitle",
3145
+ exampleKey: "panels.market.add.guidePathExample",
3146
+ hintKey: "panels.market.add.guidePathHint"
3147
+ }
3148
+ ];
3149
+ function hostOf(url) {
3150
+ try {
3151
+ return new URL(url).host;
3152
+ } catch {
3153
+ return url;
3154
+ }
3155
+ }
3156
+ var OFFICIAL_NPM_HOST = "registry.npmjs.org";
3157
+ var KNOWN_HOSTS = {
3158
+ [OFFICIAL_NPM_HOST]: "panels.market.add.registryOfficial",
3159
+ "registry.npmmirror.com": "panels.market.add.registryMirror"
3160
+ };
3161
+ function registryNameKey(host) {
3162
+ return KNOWN_HOSTS[host];
3163
+ }
3164
+ function normalizeRegistry(url) {
3165
+ const parsed = new URL(url);
3166
+ if (!parsed.pathname.endsWith("/")) parsed.pathname += "/";
3167
+ return parsed.href;
3168
+ }
3169
+ function registryKey(url, resolved) {
3170
+ const target = url ?? resolved;
3171
+ if (target === null) return "";
3172
+ try {
3173
+ return normalizeRegistry(target);
3174
+ } catch {
3175
+ return target;
3176
+ }
3177
+ }
3178
+ function registryOptions(registries) {
3179
+ const resolved = registries === null ? null : registries.resolved;
3180
+ const entries = [
3181
+ registries === null ? null : registries.registry,
3182
+ ...registries === null ? [] : registries.fallbackRegistries,
3183
+ null
3184
+ ];
3185
+ const offered = [];
3186
+ const keys = /* @__PURE__ */ new Set();
3187
+ for (const entry of entries) {
3188
+ const key = registryKey(entry, resolved);
3189
+ if (keys.has(key)) continue;
3190
+ keys.add(key);
3191
+ const url = entry ?? resolved;
3192
+ if (url === null) {
3193
+ offered.push({
3194
+ choice: {
3195
+ kind: "default",
3196
+ value: ""
3197
+ },
3198
+ host: OFFICIAL_NPM_HOST,
3199
+ nameKey: "panels.market.add.registryDefault"
3200
+ });
3201
+ continue;
3202
+ }
3203
+ const host = hostOf(url);
3204
+ const nameKey = registryNameKey(host);
3205
+ offered.push({
3206
+ choice: entry === null ? {
3207
+ kind: "default",
3208
+ value: ""
3209
+ } : {
3210
+ kind: "url",
3211
+ value: entry
3212
+ },
3213
+ host,
3214
+ ...nameKey === void 0 ? {} : { nameKey }
3215
+ });
3216
+ }
3217
+ offered.push({ choice: {
3218
+ kind: "custom",
3219
+ value: ""
3220
+ } });
3221
+ return offered;
3222
+ }
3223
+ function customRegistryAllowed(value) {
3224
+ return /^https?:\/\//.test(value.trim());
3225
+ }
3226
+ function registryOf(choice, custom) {
3227
+ if (choice.kind === "custom") return customRegistryAllowed(custom) ? custom.trim() : void 0;
3228
+ return choice.value === "" ? void 0 : choice.value;
3229
+ }
3230
+ function registryName(option, t) {
3231
+ if (option.choice.kind === "custom") return t("panels.market.add.registryCustom");
3232
+ if (option.nameKey !== void 0) return t(option.nameKey);
3233
+ return option.host ?? t("panels.market.add.registryDefault");
3234
+ }
3235
+ function optionLabel(option, t) {
3236
+ if (option.choice.kind === "custom") return t("panels.market.add.registryCustom");
3237
+ if (option.host === void 0) return t("panels.market.add.registryDefault");
3238
+ return option.nameKey === void 0 ? option.host : t("panels.market.add.registryWithHost", {
3239
+ name: t(option.nameKey),
3240
+ host: option.host
3241
+ });
3242
+ }
3243
+ var PROBLEM_KEYS = {
3244
+ "invalid-spec": "panels.market.add.problemInvalid",
3245
+ "already-installed": "panels.market.add.problemInstalled",
3246
+ "not-found": "panels.market.add.problemNotFound",
3247
+ "not-a-package": "panels.market.add.problemNotPackage",
3248
+ "not-a-bundle": "panels.market.add.problemNotBundle",
3249
+ network: "panels.market.add.problemNetwork",
3250
+ unknown: "panels.market.add.problemUnknown"
3251
+ };
3252
+ function problemKey(problem) {
3253
+ return PROBLEM_KEYS[problem] ?? PROBLEM_KEYS.unknown;
3254
+ }
3255
+ var FAILURE_KEYS = {
3256
+ network: "panels.market.add.failureNetwork",
3257
+ "spec-host": "panels.market.add.failureNetworkHost",
3258
+ "not-found": "panels.market.add.failureNotFound",
3259
+ "no-matching-version": "panels.market.add.failureNoMatchingVersion",
3260
+ "disk-full": "panels.market.add.failureDiskFull",
3261
+ permission: "panels.market.add.failurePermission",
3262
+ "build-blocked": "panels.market.add.failureBuildBlocked",
3263
+ integrity: "panels.market.add.failureIntegrity",
3264
+ timeout: "panels.market.add.failureTimeout",
3265
+ "pnpm-missing": "panels.market.add.failurePnpmMissing",
3266
+ "operation-error": "panels.market.add.failureGeneric",
3267
+ "incompatible-version": "panels.market.add.failureGeneric",
3268
+ "not-bundle": "panels.market.add.failureGeneric",
3269
+ "invalid-spec": "panels.market.add.failureGeneric",
3270
+ "bundle-in-use": "panels.market.add.failureGeneric",
3271
+ "not-removable": "panels.market.add.failureGeneric",
3272
+ "stop-profile": "panels.market.add.failureGeneric",
3273
+ "stale-approval": "panels.market.add.failureGeneric"
3274
+ };
3275
+ function failureCode(change) {
3276
+ if (change.failedAt === "spec-host") return "spec-host";
3277
+ return change.errorCode ?? change.packageResult?.kind ?? change.application;
3278
+ }
3279
+ function failureReasonKey(code) {
3280
+ return FAILURE_KEYS[code];
3281
+ }
3282
+ function failureReason(code, application, t) {
3283
+ const key = failureReasonKey(code);
3284
+ if (key !== void 0) return t(key);
3285
+ if (code === application) return t("panels.market.add.reason.unknown");
3286
+ return code;
3287
+ }
3288
+ var SUPPLY_KEYS = {
3289
+ "pending-restart": "panels.market.add.supplyPending",
3290
+ failed: "panels.market.add.supplyFailed",
3291
+ "not-a-module": "panels.market.add.notModule",
3292
+ "no-needs": void 0
2946
3293
  };
3294
+ function supplyKey(state) {
3295
+ return SUPPLY_KEYS[state];
3296
+ }
2947
3297
  //#endregion
2948
- //#region src/shared/components/PanelFoot.tsx
2949
- function PanelFoot({ text, size = "sm", children }) {
2950
- 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);
3298
+ //#region src/app/layouts/rightbar/market-change.ts
3299
+ var SHIPPED = [
3300
+ "applied",
3301
+ "restart-required",
3302
+ "overridden"
3303
+ ];
3304
+ function changeOf(value) {
3305
+ const change = value?.change;
3306
+ if (typeof change !== "object" || change === null) return void 0;
3307
+ return typeof change.application === "string" ? change : void 0;
3308
+ }
3309
+ function changeFailure(change, t) {
3310
+ if (change === void 0 || SHIPPED.includes(change.application)) return void 0;
3311
+ return failureReason(failureCode(change), change.application, t);
2951
3312
  }
2952
3313
  var MarketPage_module_default = {
2953
3314
  marketList: "_marketList_7yq35_1",
@@ -2982,7 +3343,18 @@ var MarketPage_module_default = {
2982
3343
  marketEmptyTitle: "_marketEmptyTitle_7yq35_267"
2983
3344
  };
2984
3345
  //#endregion
2985
- //#region src/app/layouts/rightbar/MarketView.tsx
3346
+ //#region src/app/layouts/rightbar/MarketStates.tsx
3347
+ function MarketChecking({ t }) {
3348
+ return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketChecking }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3349
+ state: "ongoing",
3350
+ size: 14
3351
+ }), t("panels.market.checking")));
3352
+ }
3353
+ function MarketEmpty({ t }) {
3354
+ return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
3355
+ }
3356
+ //#endregion
3357
+ //#region src/app/layouts/rightbar/market-view-text.ts
2986
3358
  var PROGRESS_KEY = {
2987
3359
  install: "panels.market.installing",
2988
3360
  update: "panels.market.updating",
@@ -2999,18 +3371,80 @@ var ACTION_LABEL_KEY = {
2999
3371
  uninstall: "panels.market.uninstall",
3000
3372
  "update-dependency": "panels.market.update"
3001
3373
  };
3002
- function MarketLine({ t, row, pending, failure, onAct }) {
3374
+ //#endregion
3375
+ //#region src/app/layouts/rightbar/SharedSection.tsx
3376
+ function SharedLine({ t, row, pending, failure, onAct }) {
3003
3377
  const running = pending !== null && pending.id === row.id ? pending : null;
3004
3378
  const locked = pending !== null;
3005
- const actions = marketActions$1(row);
3006
- const stateText = t(row.moduleUpdate === void 0 ? MARKET_STATE_KEY[row.state] : "panels.market.moduleOutdated");
3379
+ const actions = sharedActions(row);
3380
+ const stateText = t(SHARED_STATE_KEY[row.state]);
3381
+ const version = row.version;
3382
+ const name = /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketName }, row.label, version === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketVersion }, version.installed !== void 0 && version.latest !== void 0 && version.installed !== version.latest ? t("panels.market.versionArrow", {
3383
+ from: version.installed,
3384
+ to: version.latest
3385
+ }) : version.installed ?? version.latest ?? ""));
3386
+ return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
3387
+ className: MarketPage_module_default.marketIcon,
3388
+ "aria-hidden": "true"
3389
+ }, /* @__PURE__ */ h(IconModules, { size: 18 })), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketMain }, row.detail === void 0 ? name : /* @__PURE__ */ h(Tip, { label: row.detail }, name), /* @__PURE__ */ h("span", {
3390
+ className: MarketPage_module_default.marketDesc,
3391
+ role: "img",
3392
+ "aria-label": stateText
3393
+ }, row.state === "checking" ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3394
+ state: "ongoing",
3395
+ size: 14
3396
+ }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3397
+ state: SHARED_DOT[row.state],
3398
+ size: 9
3399
+ }), stateText, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketUsedBy }, t("panels.market.sharedUsedBy", { modules: row.usedByKeys.map((key) => t(key)).join(t("panels.market.listSeparator")) })))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3400
+ state: "ongoing",
3401
+ size: 14
3402
+ }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3403
+ key: action,
3404
+ type: "button",
3405
+ size: "sm",
3406
+ variant: "outline",
3407
+ disabled: locked,
3408
+ onClick: () => onAct(action)
3409
+ }, t(ACTION_LABEL_KEY[action]))))), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
3410
+ }
3411
+ function SharedSection({ t, rows, pending, failureOf, act }) {
3412
+ if (rows.length === 0) return null;
3413
+ return /* @__PURE__ */ h("section", { className: MarketPage_module_default.marketSection }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ h("h2", { className: MarketPage_module_default.marketSectionTitle }, t("panels.market.sectionShared")), /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), /* @__PURE__ */ h("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ h(SharedLine, {
3414
+ key: row.id,
3415
+ t,
3416
+ row,
3417
+ pending,
3418
+ failure: failureOf(row.id),
3419
+ onAct: (action) => void act(row.id, action)
3420
+ }))));
3421
+ }
3422
+ var PanelFoot_module_default = {
3423
+ foot: "_foot_1us83_1",
3424
+ footText: "_footText_1us83_12",
3425
+ footTextMd: "_footTextMd_1us83_17"
3426
+ };
3427
+ //#endregion
3428
+ //#region src/shared/components/PanelFoot.tsx
3429
+ function PanelFoot({ text, size = "sm", children }) {
3430
+ 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);
3431
+ }
3432
+ //#endregion
3433
+ //#region src/app/layouts/rightbar/MarketView.tsx
3434
+ var CONFIRM_UNINSTALL = ["uninstall", "remove-bundle"];
3435
+ var CONFIRM_REMOVE = ["remove-bundle"];
3436
+ function MarketLine({ t, row, pending, failure, onAct }) {
3437
+ const running = pending !== null && pending.id === row.id ? pending : null;
3438
+ const locked = pending !== null;
3439
+ const actions = marketActions$1(row);
3440
+ const stateText = t(row.moduleUpdate === void 0 ? MARKET_STATE_KEY[row.state] : "panels.market.moduleOutdated");
3007
3441
  return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
3008
3442
  className: MarketPage_module_default.marketIcon,
3009
3443
  "aria-hidden": "true"
3010
3444
  }, /* @__PURE__ */ h(IconModules, { size: 18 })), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketMain }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketName }, t(row.titleKey), row.version === 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", {
3011
3445
  from: row.version.installed,
3012
3446
  to: row.version.latest
3013
- }) : row.version.installed ?? row.version.latest ?? "")), /* @__PURE__ */ h(Tip, { label: stateText }, /* @__PURE__ */ h("span", {
3447
+ }) : row.version.installed ?? row.version.latest ?? "")), /* @__PURE__ */ h("span", {
3014
3448
  className: MarketPage_module_default.marketDesc,
3015
3449
  role: "img",
3016
3450
  "aria-label": stateText
@@ -3020,7 +3454,7 @@ function MarketLine({ t, row, pending, failure, onAct }) {
3020
3454
  }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3021
3455
  state: MARKET_DOT[row.state],
3022
3456
  size: 9
3023
- }), stateText, row.hint === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketUsedBy }, t(row.hint))))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3457
+ }), stateText, row.hint === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketUsedBy }, t(row.hint)))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3024
3458
  state: "ongoing",
3025
3459
  size: 14
3026
3460
  }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => {
@@ -3038,40 +3472,6 @@ function MarketLine({ t, row, pending, failure, onAct }) {
3038
3472
  }, t(ACTION_LABEL_KEY[action]));
3039
3473
  }))), row.note === void 0 ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketNote }, t(row.note.key, row.note.params)), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
3040
3474
  }
3041
- function SharedLine({ t, row, pending, failure, onAct }) {
3042
- const running = pending !== null && pending.id === row.id ? pending : null;
3043
- const locked = pending !== null;
3044
- const actions = sharedActions(row);
3045
- const stateText = t(SHARED_STATE_KEY[row.state]);
3046
- const version = row.version;
3047
- return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
3048
- className: MarketPage_module_default.marketIcon,
3049
- "aria-hidden": "true"
3050
- }, /* @__PURE__ */ h(IconModules, { size: 18 })), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketMain }, /* @__PURE__ */ h(Tip, { label: row.detail ?? "" }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketName }, row.label, version === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketVersion }, version.installed !== void 0 && version.latest !== void 0 && version.installed !== version.latest ? t("panels.market.versionArrow", {
3051
- from: version.installed,
3052
- to: version.latest
3053
- }) : version.installed ?? version.latest ?? ""))), /* @__PURE__ */ h(Tip, { label: stateText }, /* @__PURE__ */ h("span", {
3054
- className: MarketPage_module_default.marketDesc,
3055
- role: "img",
3056
- "aria-label": stateText
3057
- }, row.state === "checking" ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3058
- state: "ongoing",
3059
- size: 14
3060
- }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3061
- state: SHARED_DOT[row.state],
3062
- size: 9
3063
- }), stateText, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketUsedBy }, t("panels.market.sharedUsedBy", { modules: row.usedByKeys.map((key) => t(key)).join(t("panels.market.listSeparator")) }))))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3064
- state: "ongoing",
3065
- size: 14
3066
- }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
3067
- key: action,
3068
- type: "button",
3069
- size: "sm",
3070
- variant: "outline",
3071
- disabled: locked,
3072
- onClick: () => onAct(action)
3073
- }, t(ACTION_LABEL_KEY[action]))))), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
3074
- }
3075
3475
  function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
3076
3476
  const [acknowledged, setAcknowledged] = useState(false);
3077
3477
  return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.RiskConfirmation, {
@@ -3088,7 +3488,7 @@ function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
3088
3488
  onConfirm
3089
3489
  });
3090
3490
  }
3091
- function MarketSection({ t, titleKey, rows, pending, failureOf, act, confirmAction, onConfirming }) {
3491
+ function MarketSection({ t, titleKey, rows, pending, failureOf, act, confirmActions, onConfirming }) {
3092
3492
  if (rows.length === 0) return null;
3093
3493
  return /* @__PURE__ */ h("section", { className: MarketPage_module_default.marketSection }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ h("h2", { className: MarketPage_module_default.marketSectionTitle }, t(titleKey)), /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), /* @__PURE__ */ h("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ h(MarketLine, {
3094
3494
  key: row.id,
@@ -3096,29 +3496,50 @@ function MarketSection({ t, titleKey, rows, pending, failureOf, act, confirmActi
3096
3496
  row,
3097
3497
  pending,
3098
3498
  failure: failureOf(row.id),
3099
- onAct: (action) => action === confirmAction ? onConfirming(row.id) : void act(row.id, action)
3499
+ onAct: (action) => confirmActions.includes(action) ? onConfirming(row.id) : void act(row.id, action)
3100
3500
  }))));
3101
3501
  }
3102
- function MarketView({ t, manifests, capabilities, freshness, onChanged, updates, installed, installedRead, mock }) {
3103
- const source = mock?.manifests ?? manifests;
3502
+ function MarketView({ t, manifests, capabilities, freshness, onChanged, updates, installed, installedRead, settling, mock }) {
3503
+ const [titles, setTitles] = useState(/* @__PURE__ */ new Map());
3504
+ useEffect(() => {
3505
+ if (mock === void 0) setTitles((known) => mergeTitles(known, manifests));
3506
+ }, [manifests, mock]);
3507
+ const catalog = mock?.manifests ?? manifests;
3104
3508
  const effective = mock === void 0 ? capabilities : mock.capabilities;
3509
+ const source = liveManifests(catalog, effective, mock === void 0 && installed !== void 0 ? new Set(installed.map((item) => item.unit)) : null);
3105
3510
  const rows = marketRows(source, effective, mock?.updates ?? updates ?? {});
3106
3511
  const shared = sharedRows(source, effective);
3107
- const installedList = installedRows(mock?.installed ?? installed ?? [], source, new Set(rows.map((row) => row.id)));
3108
- const rowById = new Map([...rows, ...installedList].map((row) => [row.id, row]));
3109
3512
  const [pending, setPending] = useState(mock?.pending ?? null);
3110
3513
  const provision = useHostWrite({
3111
3514
  channel: "provision",
3112
3515
  networkText: t("panels.failed")
3113
3516
  });
3114
3517
  const [confirming, setConfirming] = useState(mock?.confirming ?? null);
3115
- const confirmingRow = confirming === null ? void 0 : rowById.get(confirming);
3116
3518
  const [failed, setFailed] = useState(mock?.failure ?? null);
3519
+ const removing = pending !== null && pending.action === "remove-bundle" && failed?.id !== pending.id ? pending.id : null;
3520
+ const installedList = installedRows((mock?.installed ?? installed ?? []).filter((module) => !(settling?.has(module.unit) ?? false) && module.unit !== removing), source, new Set(rows.map((row) => row.id)), titles);
3521
+ const pendingRow = removing === null || pending === null || rows.some((row) => row.id === removing) ? void 0 : {
3522
+ id: removing,
3523
+ titleKey: pending.titleKey ?? titles.get(removing) ?? removing,
3524
+ state: "installed",
3525
+ canInstall: false,
3526
+ canUpdate: false,
3527
+ canUninstall: true,
3528
+ ...pending.pkg === void 0 ? {} : { pkg: pending.pkg },
3529
+ ...pending.version === void 0 ? {} : { version: { installed: pending.version } }
3530
+ };
3531
+ const shown = pendingRow === void 0 ? rows : [...rows, pendingRow];
3532
+ const rowById = new Map([...shown, ...installedList].map((row) => [row.id, row]));
3533
+ const confirmingRow = confirming === null ? void 0 : rowById.get(confirming);
3117
3534
  const act = async (id, action) => {
3118
3535
  if (mock !== void 0) return;
3536
+ const row = rowById.get(id);
3119
3537
  setPending({
3120
3538
  id,
3121
- action
3539
+ action,
3540
+ ...row?.titleKey === void 0 ? {} : { titleKey: row.titleKey },
3541
+ ...row?.pkg === void 0 ? {} : { pkg: row.pkg },
3542
+ ...row?.version?.installed === void 0 ? {} : { version: row.version.installed }
3122
3543
  });
3123
3544
  setConfirming(null);
3124
3545
  setFailed(null);
@@ -3135,20 +3556,23 @@ function MarketView({ t, manifests, capabilities, freshness, onChanged, updates,
3135
3556
  });
3136
3557
  setPending(null);
3137
3558
  if (!outcome.ok) {
3559
+ onChanged();
3138
3560
  setFailed({
3139
3561
  id,
3140
3562
  message: t("panels.market.failed", { reason: outcome.message })
3141
3563
  });
3142
3564
  return;
3143
3565
  }
3566
+ const reason = changeFailure(changeOf(outcome.value), t);
3144
3567
  onChanged();
3568
+ if (reason !== void 0) setFailed({
3569
+ id,
3570
+ message: t("panels.market.failed", { reason })
3571
+ });
3145
3572
  };
3146
- if (!(freshness.loaded && installedRead !== false)) return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketChecking }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
3147
- state: "ongoing",
3148
- size: 14
3149
- }), t("panels.market.checking")));
3150
- if (rows.length === 0 && installedList.length === 0) return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
3151
- return /* @__PURE__ */ h(Fragment, null, marketSections(rows).map((section) => /* @__PURE__ */ h(MarketSection, {
3573
+ if (!(freshness.loaded && installedRead !== false) || (settling?.size ?? 0) > 0 && shown.length === 0 && installedList.length === 0) return /* @__PURE__ */ h(MarketChecking, { t });
3574
+ if (shown.length === 0 && installedList.length === 0) return /* @__PURE__ */ h(MarketEmpty, { t });
3575
+ return /* @__PURE__ */ h(Fragment, null, marketSections(shown).map((section) => /* @__PURE__ */ h(MarketSection, {
3152
3576
  key: section.id,
3153
3577
  t,
3154
3578
  titleKey: section.titleKey,
@@ -3156,7 +3580,7 @@ function MarketView({ t, manifests, capabilities, freshness, onChanged, updates,
3156
3580
  pending,
3157
3581
  failureOf: (id) => failed?.id === id ? failed.message : null,
3158
3582
  act,
3159
- confirmAction: "uninstall",
3583
+ confirmActions: CONFIRM_UNINSTALL,
3160
3584
  onConfirming: setConfirming
3161
3585
  })), /* @__PURE__ */ h(MarketSection, {
3162
3586
  t,
@@ -3165,268 +3589,100 @@ function MarketView({ t, manifests, capabilities, freshness, onChanged, updates,
3165
3589
  pending,
3166
3590
  failureOf: (id) => failed?.id === id ? failed.message : null,
3167
3591
  act,
3168
- confirmAction: "remove-bundle",
3592
+ confirmActions: CONFIRM_REMOVE,
3169
3593
  onConfirming: setConfirming
3170
3594
  }), /* @__PURE__ */ h(PanelFoot, {
3171
- size: "md",
3172
- text: t("panels.market.foot")
3173
- }), shared.length === 0 ? null : /* @__PURE__ */ h("section", { className: MarketPage_module_default.marketSection }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ h("h2", { className: MarketPage_module_default.marketSectionTitle }, t("panels.market.sectionShared")), /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSectionCount }, shared.length)), /* @__PURE__ */ h("ul", { className: MarketPage_module_default.marketList }, shared.map((row) => /* @__PURE__ */ h(SharedLine, {
3174
- key: row.id,
3175
- t,
3176
- row,
3177
- pending,
3178
- failure: failed?.id === row.id ? failed.message : null,
3179
- onAct: (action) => void act(row.id, action)
3180
- })))), /* @__PURE__ */ h(ConfirmUninstall, {
3181
- key: confirming ?? "",
3182
- t,
3183
- name: confirmingRow === void 0 ? null : t(confirmingRow.titleKey),
3184
- onCancel: () => setConfirming(null),
3185
- onConfirm: () => {
3186
- const id = confirming;
3187
- setConfirming(null);
3188
- if (id === null) return;
3189
- act(id, rowById.get(id)?.pkg === void 0 ? "uninstall" : "remove-bundle");
3190
- }
3191
- }));
3192
- }
3193
- //#endregion
3194
- //#region src/shared/api/bundle-install.ts
3195
- var BUNDLE_REGISTRIES_ROUTE = "bundle-registries";
3196
- var BUNDLE_INSPECT_ROUTE = "bundle-inspect";
3197
- var MODULE_VERSIONS_ROUTE = "module-versions";
3198
- //#endregion
3199
- //#region src/shared/hooks/bundle-queries.ts
3200
- function readBundleRegistries() {
3201
- return apiGet(BUNDLE_REGISTRIES_ROUTE);
3202
- }
3203
- function readBundleInspection(spec, registry) {
3204
- return apiGet(BUNDLE_INSPECT_ROUTE, {
3205
- spec,
3206
- ...registry === void 0 || registry === "" ? {} : { registry }
3207
- });
3208
- }
3209
- function readModuleVersions(force = false) {
3210
- return apiGet(MODULE_VERSIONS_ROUTE, force ? { force: "1" } : void 0);
3211
- }
3212
- var AddModule_module_default = {
3213
- wide: "_wide_1coeb_1",
3214
- dialog: "_dialog_1coeb_8",
3215
- content: "_content_1coeb_13",
3216
- stack: "_stack_1coeb_18",
3217
- body: "_body_1coeb_25",
3218
- field: "_field_1coeb_32",
3219
- input: "_input_1coeb_39",
3220
- registryField: "_registryField_1coeb_45",
3221
- options: "_options_1coeb_51",
3222
- guideToggle: "_guideToggle_1coeb_59",
3223
- registryToggle: "_registryToggle_1coeb_78",
3224
- registryWrap: "_registryWrap_1coeb_87",
3225
- registryChosen: "_registryChosen_1coeb_121",
3226
- registry: "_registry_1coeb_45",
3227
- registryOption: "_registryOption_1coeb_143",
3228
- registryPick: "_registryPick_1coeb_159",
3229
- registryTitle: "_registryTitle_1coeb_179",
3230
- registryHint: "_registryHint_1coeb_189",
3231
- inputError: "_inputError_1coeb_197",
3232
- guide: "_guide_1coeb_59",
3233
- guideList: "_guideList_1coeb_214",
3234
- guideItem: "_guideItem_1coeb_223",
3235
- guideIndex: "_guideIndex_1coeb_230",
3236
- guideMain: "_guideMain_1coeb_244",
3237
- guideTitle: "_guideTitle_1coeb_252",
3238
- guideHint: "_guideHint_1coeb_258",
3239
- guideExample: "_guideExample_1coeb_264",
3240
- guideExampleLabel: "_guideExampleLabel_1coeb_274",
3241
- footer: "_footer_1coeb_278",
3242
- hero: "_hero_1coeb_285",
3243
- heroIcon: "_heroIcon_1coeb_294",
3244
- pendingTitle: "_pendingTitle_1coeb_311",
3245
- wizardTitle: "_wizardTitle_1coeb_319",
3246
- subject: "_subject_1coeb_326",
3247
- subjectName: "_subjectName_1coeb_337",
3248
- subjectMeta: "_subjectMeta_1coeb_343",
3249
- subjectDesc: "_subjectDesc_1coeb_344",
3250
- result: "_result_1coeb_351",
3251
- resultWarn: "_resultWarn_1coeb_352",
3252
- approval: "_approval_1coeb_365",
3253
- approvalTitle: "_approvalTitle_1coeb_375",
3254
- approvalText: "_approvalText_1coeb_382",
3255
- approvalCaution: "_approvalCaution_1coeb_388",
3256
- note: "_note_1coeb_395",
3257
- noteWarn: "_noteWarn_1coeb_402",
3258
- noteError: "_noteError_1coeb_406",
3259
- problem: "_problem_1coeb_410",
3260
- detailLabel: "_detailLabel_1coeb_417",
3261
- detail: "_detail_1coeb_417"
3262
- };
3263
- //#endregion
3264
- //#region src/app/layouts/market/add-module-text.ts
3265
- var GUIDE_ITEMS = [
3266
- {
3267
- titleKey: "panels.market.add.guideIdTitle",
3268
- exampleKey: "panels.market.add.guideIdExample",
3269
- hintKey: "panels.market.add.guideIdHint"
3270
- },
3271
- {
3272
- titleKey: "panels.market.add.guideGitTitle",
3273
- exampleKey: "panels.market.add.guideGitExample",
3274
- hintKey: "panels.market.add.guideGitHint"
3275
- },
3276
- {
3277
- titleKey: "panels.market.add.guidePathTitle",
3278
- exampleKey: "panels.market.add.guidePathExample",
3279
- hintKey: "panels.market.add.guidePathHint"
3280
- }
3281
- ];
3282
- function hostOf(url) {
3283
- try {
3284
- return new URL(url).host;
3285
- } catch {
3286
- return url;
3287
- }
3288
- }
3289
- var OFFICIAL_NPM_HOST = "registry.npmjs.org";
3290
- var KNOWN_HOSTS = {
3291
- [OFFICIAL_NPM_HOST]: "panels.market.add.registryOfficial",
3292
- "registry.npmmirror.com": "panels.market.add.registryMirror"
3293
- };
3294
- function registryNameKey(host) {
3295
- return KNOWN_HOSTS[host];
3296
- }
3297
- function normalizeRegistry(url) {
3298
- const parsed = new URL(url);
3299
- if (!parsed.pathname.endsWith("/")) parsed.pathname += "/";
3300
- return parsed.href;
3301
- }
3302
- function registryKey(url, resolved) {
3303
- const target = url ?? resolved;
3304
- if (target === null) return "";
3305
- try {
3306
- return normalizeRegistry(target);
3307
- } catch {
3308
- return target;
3309
- }
3310
- }
3311
- function registryOptions(registries) {
3312
- const resolved = registries === null ? null : registries.resolved;
3313
- const entries = [
3314
- registries === null ? null : registries.registry,
3315
- ...registries === null ? [] : registries.fallbackRegistries,
3316
- null
3317
- ];
3318
- const offered = [];
3319
- const keys = /* @__PURE__ */ new Set();
3320
- for (const entry of entries) {
3321
- const key = registryKey(entry, resolved);
3322
- if (keys.has(key)) continue;
3323
- keys.add(key);
3324
- const url = entry ?? resolved;
3325
- if (url === null) {
3326
- offered.push({
3327
- choice: {
3328
- kind: "default",
3329
- value: ""
3330
- },
3331
- host: OFFICIAL_NPM_HOST,
3332
- nameKey: "panels.market.add.registryDefault"
3333
- });
3334
- continue;
3335
- }
3336
- const host = hostOf(url);
3337
- const nameKey = registryNameKey(host);
3338
- offered.push({
3339
- choice: entry === null ? {
3340
- kind: "default",
3341
- value: ""
3342
- } : {
3343
- kind: "url",
3344
- value: entry
3345
- },
3346
- host,
3347
- ...nameKey === void 0 ? {} : { nameKey }
3348
- });
3349
- }
3350
- offered.push({ choice: {
3351
- kind: "custom",
3352
- value: ""
3353
- } });
3354
- return offered;
3355
- }
3356
- function customRegistryAllowed(value) {
3357
- return /^https?:\/\//.test(value.trim());
3358
- }
3359
- function registryOf(choice, custom) {
3360
- if (choice.kind === "custom") return customRegistryAllowed(custom) ? custom.trim() : void 0;
3361
- return choice.value === "" ? void 0 : choice.value;
3595
+ size: "md",
3596
+ text: t("panels.market.foot")
3597
+ }), /* @__PURE__ */ h(SharedSection, {
3598
+ t,
3599
+ rows: shared,
3600
+ pending,
3601
+ failureOf: (id) => failed?.id === id ? failed.message : null,
3602
+ act
3603
+ }), /* @__PURE__ */ h(ConfirmUninstall, {
3604
+ key: confirming ?? "",
3605
+ t,
3606
+ name: confirmingRow === void 0 ? null : t(confirmingRow.titleKey),
3607
+ onCancel: () => setConfirming(null),
3608
+ onConfirm: () => {
3609
+ const id = confirming;
3610
+ setConfirming(null);
3611
+ if (id === null) return;
3612
+ act(id, rowById.get(id)?.pkg === void 0 ? "uninstall" : "remove-bundle");
3613
+ }
3614
+ }));
3362
3615
  }
3363
- function registryName(option, t) {
3364
- if (option.choice.kind === "custom") return t("panels.market.add.registryCustom");
3365
- if (option.nameKey !== void 0) return t(option.nameKey);
3366
- return option.host ?? t("panels.market.add.registryDefault");
3616
+ //#endregion
3617
+ //#region src/shared/api/bundle-install.ts
3618
+ var BUNDLE_REGISTRIES_ROUTE = "bundle-registries";
3619
+ var BUNDLE_INSPECT_ROUTE = "bundle-inspect";
3620
+ var MODULE_VERSIONS_ROUTE = "module-versions";
3621
+ //#endregion
3622
+ //#region src/shared/hooks/bundle-queries.ts
3623
+ function readBundleRegistries() {
3624
+ return apiGet(BUNDLE_REGISTRIES_ROUTE);
3367
3625
  }
3368
- function optionLabel(option, t) {
3369
- if (option.choice.kind === "custom") return t("panels.market.add.registryCustom");
3370
- if (option.host === void 0) return t("panels.market.add.registryDefault");
3371
- return option.nameKey === void 0 ? option.host : t("panels.market.add.registryWithHost", {
3372
- name: t(option.nameKey),
3373
- host: option.host
3626
+ function readBundleInspection(spec, registry) {
3627
+ return apiGet(BUNDLE_INSPECT_ROUTE, {
3628
+ spec,
3629
+ ...registry === void 0 || registry === "" ? {} : { registry }
3374
3630
  });
3375
3631
  }
3376
- var PROBLEM_KEYS = {
3377
- "invalid-spec": "panels.market.add.problemInvalid",
3378
- "already-installed": "panels.market.add.problemInstalled",
3379
- "not-found": "panels.market.add.problemNotFound",
3380
- "not-a-package": "panels.market.add.problemNotPackage",
3381
- "not-a-bundle": "panels.market.add.problemNotBundle",
3382
- network: "panels.market.add.problemNetwork",
3383
- unknown: "panels.market.add.problemUnknown"
3384
- };
3385
- function problemKey(problem) {
3386
- return PROBLEM_KEYS[problem] ?? PROBLEM_KEYS.unknown;
3387
- }
3388
- var FAILURE_KEYS = {
3389
- network: "panels.market.add.failureNetwork",
3390
- "spec-host": "panels.market.add.failureNetworkHost",
3391
- "not-found": "panels.market.add.failureNotFound",
3392
- "no-matching-version": "panels.market.add.failureNoMatchingVersion",
3393
- "disk-full": "panels.market.add.failureDiskFull",
3394
- permission: "panels.market.add.failurePermission",
3395
- "build-blocked": "panels.market.add.failureBuildBlocked",
3396
- integrity: "panels.market.add.failureIntegrity",
3397
- timeout: "panels.market.add.failureTimeout",
3398
- "pnpm-missing": "panels.market.add.failurePnpmMissing",
3399
- "operation-error": "panels.market.add.failureGeneric",
3400
- "incompatible-version": "panels.market.add.failureGeneric",
3401
- "not-bundle": "panels.market.add.failureGeneric",
3402
- "invalid-spec": "panels.market.add.failureGeneric",
3403
- "bundle-in-use": "panels.market.add.failureGeneric",
3404
- "not-removable": "panels.market.add.failureGeneric",
3405
- "stop-profile": "panels.market.add.failureGeneric",
3406
- "stale-approval": "panels.market.add.failureGeneric"
3407
- };
3408
- function failureCode(change) {
3409
- if (change.failedAt === "spec-host") return "spec-host";
3410
- return change.errorCode ?? change.packageResult?.kind ?? change.application;
3411
- }
3412
- function failureReasonKey(code) {
3413
- return FAILURE_KEYS[code];
3414
- }
3415
- function failureReason(code, application, t) {
3416
- const key = failureReasonKey(code);
3417
- if (key !== void 0) return t(key);
3418
- if (code === application) return t("panels.market.add.reason.unknown");
3419
- return code;
3632
+ function readModuleVersions(force = false) {
3633
+ return apiGet(MODULE_VERSIONS_ROUTE, force ? { force: "1" } : void 0);
3420
3634
  }
3421
- var SUPPLY_KEYS = {
3422
- "pending-restart": "panels.market.add.supplyPending",
3423
- failed: "panels.market.add.supplyFailed",
3424
- "not-a-module": "panels.market.add.notModule",
3425
- "no-needs": void 0
3635
+ var AddModule_module_default = {
3636
+ wide: "_wide_1coeb_1",
3637
+ dialog: "_dialog_1coeb_8",
3638
+ content: "_content_1coeb_13",
3639
+ stack: "_stack_1coeb_18",
3640
+ body: "_body_1coeb_25",
3641
+ field: "_field_1coeb_32",
3642
+ input: "_input_1coeb_39",
3643
+ registryField: "_registryField_1coeb_45",
3644
+ options: "_options_1coeb_51",
3645
+ guideToggle: "_guideToggle_1coeb_59",
3646
+ registryToggle: "_registryToggle_1coeb_78",
3647
+ registryWrap: "_registryWrap_1coeb_87",
3648
+ registryChosen: "_registryChosen_1coeb_121",
3649
+ registry: "_registry_1coeb_45",
3650
+ registryOption: "_registryOption_1coeb_143",
3651
+ registryPick: "_registryPick_1coeb_159",
3652
+ registryTitle: "_registryTitle_1coeb_179",
3653
+ registryHint: "_registryHint_1coeb_189",
3654
+ inputError: "_inputError_1coeb_197",
3655
+ guide: "_guide_1coeb_59",
3656
+ guideList: "_guideList_1coeb_214",
3657
+ guideItem: "_guideItem_1coeb_223",
3658
+ guideIndex: "_guideIndex_1coeb_230",
3659
+ guideMain: "_guideMain_1coeb_244",
3660
+ guideTitle: "_guideTitle_1coeb_252",
3661
+ guideHint: "_guideHint_1coeb_258",
3662
+ guideExample: "_guideExample_1coeb_264",
3663
+ guideExampleLabel: "_guideExampleLabel_1coeb_274",
3664
+ footer: "_footer_1coeb_278",
3665
+ hero: "_hero_1coeb_285",
3666
+ heroIcon: "_heroIcon_1coeb_294",
3667
+ pendingTitle: "_pendingTitle_1coeb_311",
3668
+ wizardTitle: "_wizardTitle_1coeb_319",
3669
+ subject: "_subject_1coeb_326",
3670
+ subjectName: "_subjectName_1coeb_337",
3671
+ subjectMeta: "_subjectMeta_1coeb_343",
3672
+ subjectDesc: "_subjectDesc_1coeb_344",
3673
+ result: "_result_1coeb_351",
3674
+ resultWarn: "_resultWarn_1coeb_352",
3675
+ approval: "_approval_1coeb_365",
3676
+ approvalTitle: "_approvalTitle_1coeb_375",
3677
+ approvalText: "_approvalText_1coeb_382",
3678
+ approvalCaution: "_approvalCaution_1coeb_388",
3679
+ note: "_note_1coeb_395",
3680
+ noteWarn: "_noteWarn_1coeb_402",
3681
+ noteError: "_noteError_1coeb_406",
3682
+ problem: "_problem_1coeb_410",
3683
+ detailLabel: "_detailLabel_1coeb_417",
3684
+ detail: "_detail_1coeb_417"
3426
3685
  };
3427
- function supplyKey(state) {
3428
- return SUPPLY_KEYS[state];
3429
- }
3430
3686
  //#endregion
3431
3687
  //#region src/app/layouts/market/AddModuleRegistry.tsx
3432
3688
  var REGISTRY_ID = "wb-add-module-registry";
@@ -3486,7 +3742,13 @@ function AddModuleRegistry({ t, state }) {
3486
3742
  return /* @__PURE__ */ h("div", {
3487
3743
  key: `${option.choice.kind}|${option.choice.value}`,
3488
3744
  className: AddModule_module_default.registryOption,
3489
- "data-checked": active
3745
+ "data-checked": active,
3746
+ onPointerDown: () => {
3747
+ if (!active) state.setChoice(option.choice);
3748
+ },
3749
+ onFocusCapture: () => {
3750
+ if (!active) state.setChoice(option.choice);
3751
+ }
3490
3752
  }, /* @__PURE__ */ h("label", { className: AddModule_module_default.registryPick }, /* @__PURE__ */ h("input", {
3491
3753
  type: "radio",
3492
3754
  name: REGISTRY_ID,
@@ -3498,7 +3760,6 @@ function AddModuleRegistry({ t, state }) {
3498
3760
  "aria-label": t("panels.market.add.registryCustom"),
3499
3761
  placeholder: t("panels.market.add.registryCustomPlaceholder"),
3500
3762
  value: state.custom,
3501
- disabled: !active,
3502
3763
  invalid: customBad,
3503
3764
  onChange: (event) => state.setCustom(event.target.value)
3504
3765
  }), customBad ? /* @__PURE__ */ h("span", {
@@ -4090,7 +4351,7 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
4090
4351
  }, t("panels.market.add.run"))) : null, installing ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
4091
4352
  type: "button",
4092
4353
  variant: "outline",
4093
- size: "sm",
4354
+ size: "md",
4094
4355
  onClick: state.cancelInstall
4095
4356
  }, t("panels.market.add.cancel")) : null, state.phase === "result" ? /* @__PURE__ */ h(Fragment, null, failed && builds.length === 0 ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
4096
4357
  type: "button",
@@ -4160,6 +4421,7 @@ var MOCK_FRESHNESS = {
4160
4421
  checking: false,
4161
4422
  checkedAt: null
4162
4423
  };
4424
+ var NO_UNITS = /* @__PURE__ */ new Set();
4163
4425
  function useLiveManifests(units) {
4164
4426
  useSyncExternalStore(useCallback((listener) => units.subscribe(listener), [units]), useCallback(() => units.version(), [units]));
4165
4427
  return units.manifests();
@@ -4182,7 +4444,7 @@ function MarketPanel({ t, units }) {
4182
4444
  const [decided, setDecided] = useState(false);
4183
4445
  const [adding, setAdding] = useState(false);
4184
4446
  const [updates, setUpdates] = useState({});
4185
- const [installed, setInstalled] = useState([]);
4447
+ const [installed, setInstalled] = useState(void 0);
4186
4448
  const [installedRead, setInstalledRead] = useState(false);
4187
4449
  const loadUpdates = useCallback((force = false) => {
4188
4450
  readModuleVersions(force).then((response) => {
@@ -4218,6 +4480,24 @@ function MarketPanel({ t, units }) {
4218
4480
  forceProbe,
4219
4481
  loadUpdates
4220
4482
  ]);
4483
+ const installedKey = (installed ?? []).map((module) => module.unit).join("|");
4484
+ const rosterKey = manifests.map((manifest) => manifest.id).join("|");
4485
+ const activeKey = Object.keys(capabilities ?? {}).join("|");
4486
+ const seenRef = useRef(null);
4487
+ const [settling, setSettling] = useState(NO_UNITS);
4488
+ useEffect(() => {
4489
+ const units = installedKey === "" ? [] : installedKey.split("|");
4490
+ const held = holdBack(units, new Set(rosterKey === "" ? [] : rosterKey.split("|")), new Set(activeKey === "" ? [] : activeKey.split("|")), seenRef.current);
4491
+ seenRef.current = new Set(units);
4492
+ setSettling(held.length === 0 ? NO_UNITS : new Set(held));
4493
+ if (held.length === 0) return;
4494
+ const timer = setTimeout(() => setSettling(NO_UNITS), MODULE_SETTLE_MS);
4495
+ return () => clearTimeout(timer);
4496
+ }, [
4497
+ installedKey,
4498
+ rosterKey,
4499
+ activeKey
4500
+ ]);
4221
4501
  const freshness = {
4222
4502
  loaded: capabilities !== null,
4223
4503
  checking,
@@ -4267,6 +4547,7 @@ function MarketPanel({ t, units }) {
4267
4547
  updates,
4268
4548
  installed,
4269
4549
  installedRead: mock === void 0 ? installedRead : mock.installedRead ?? true,
4550
+ settling: mock === void 0 ? settling : void 0,
4270
4551
  mock
4271
4552
  }), /* @__PURE__ */ h(AddModuleDialog, {
4272
4553
  t,
@@ -4365,6 +4646,14 @@ function bridgeAdvice(issue) {
4365
4646
  return { textKey: "env.bridge.unknown" };
4366
4647
  }
4367
4648
  //#endregion
4649
+ //#region src/app/layouts/env-gate/gate-deadline.ts
4650
+ function createGateDeadline(giveUpMs, expire) {
4651
+ const timer = setTimeout(expire, giveUpMs);
4652
+ return { disarm() {
4653
+ clearTimeout(timer);
4654
+ } };
4655
+ }
4656
+ //#endregion
4368
4657
  //#region src/app/layouts/env-gate/gate-dom.ts
4369
4658
  var SVG_NS = "http://www.w3.org/2000/svg";
4370
4659
  function svgIcon(kind) {
@@ -4827,7 +5116,6 @@ function createBootGate(ctx, options = {}) {
4827
5116
  }
4828
5117
  let cancelled = false;
4829
5118
  const forcePlan = createForcePlan();
4830
- const startedAt = Date.now();
4831
5119
  let pinned = null;
4832
5120
  function close() {
4833
5121
  if (closed) return;
@@ -4835,9 +5123,11 @@ function createBootGate(ctx, options = {}) {
4835
5123
  cancelled = true;
4836
5124
  if (timer !== void 0) clearTimeout(timer);
4837
5125
  if (ticker !== void 0) clearInterval(ticker);
5126
+ deadline.disarm();
4838
5127
  overlay.remove();
4839
5128
  if (root !== null) root.inert = previousInert;
4840
5129
  }
5130
+ const deadline = createGateDeadline(GIVE_UP_MS, close);
4841
5131
  const rows = /* @__PURE__ */ new Map();
4842
5132
  let renderedOrder = "";
4843
5133
  function ensureRow(step) {
@@ -4931,10 +5221,6 @@ function createBootGate(ctx, options = {}) {
4931
5221
  return;
4932
5222
  }
4933
5223
  if (response.phase === "failed") return;
4934
- if (Date.now() - startedAt > GIVE_UP_MS) {
4935
- close();
4936
- return;
4937
- }
4938
5224
  timer = setTimeout(() => void poll(), POLL_MS);
4939
5225
  }
4940
5226
  function retryNow() {
@@ -5196,7 +5482,7 @@ var ModulesPage_module_default = {
5196
5482
  };
5197
5483
  //#endregion
5198
5484
  //#region src/app/layouts/rightbar/panel-mock.ts
5199
- function row(id, titleKey, shown) {
5485
+ function row$1(id, titleKey, shown) {
5200
5486
  return {
5201
5487
  id,
5202
5488
  titleKey,
@@ -5225,10 +5511,10 @@ function buildPanelMocks(roster) {
5225
5511
  }];
5226
5512
  const titleKey = found.card?.titleKey ?? found.id;
5227
5513
  const id = found.id;
5228
- const on = row(id, titleKey, true);
5229
- const off = row(id, titleKey, false);
5230
- const twin = row(`${id}-b`, titleKey, true);
5231
- const third = row(`${id}-c`, titleKey, false);
5514
+ const on = row$1(id, titleKey, true);
5515
+ const off = row$1(id, titleKey, false);
5516
+ const twin = row$1(`${id}-b`, titleKey, true);
5517
+ const third = row$1(`${id}-c`, titleKey, false);
5232
5518
  return [
5233
5519
  {
5234
5520
  id: "one",
@@ -5310,7 +5596,7 @@ function buildPanelMocks(roster) {
5310
5596
  {
5311
5597
  id: "long",
5312
5598
  label: "超长模块名",
5313
- units: [row(id, "一个名字特别特别长的模块用来验证省略号会不会把开关挤下去", true)],
5599
+ units: [row$1(id, "一个名字特别特别长的模块用来验证省略号会不会把开关挤下去", true)],
5314
5600
  capabilities: probe(id, "ok"),
5315
5601
  expect: {
5316
5602
  rows: 1,
@@ -5376,13 +5662,14 @@ function buildPanelMocks(roster) {
5376
5662
  function available(capability) {
5377
5663
  if (capability === void 0) return true;
5378
5664
  if (capability.released === true) return false;
5379
- return capability.status === "ok" || capability.status === "unchecked";
5665
+ return capability.status === "ok" || capability.status === "unchecked" || capability.status === "failed";
5380
5666
  }
5381
5667
  function selectPanelUnits(units, capabilities) {
5382
5668
  return units.filter((unit) => available(capabilities?.[unit.id]));
5383
5669
  }
5384
5670
  function panelBadgeKey(capability) {
5385
5671
  if (capability === void 0 || capability.status === "ok") return void 0;
5672
+ if (capability.status === "failed") return "panels.dep.failed";
5386
5673
  if (capability.status === "missing-plugin") return "panels.dep.missingPlugin";
5387
5674
  if (capability.status === "missing-commands") return "panels.dep.missingCommands";
5388
5675
  return "panels.dep.unchecked";
@@ -5641,6 +5928,16 @@ function buildBoardMocks(roster) {
5641
5928
  cards: 8,
5642
5929
  empty: false
5643
5930
  }
5931
+ },
5932
+ {
5933
+ id: "crash",
5934
+ label: "坏卡 + 好卡",
5935
+ note: "一张渲染必炸的卡 + 你装的模块(配 ?wbCrash=1 才摆得出来):要看到坏的那张只剩一句\"这个模块起不来\",别的卡与面板壳都还在。",
5936
+ shape: { kind: "all" },
5937
+ expect: {
5938
+ cards: 1,
5939
+ empty: false
5940
+ }
5644
5941
  }
5645
5942
  ],
5646
5943
  EMPTY,
@@ -5685,6 +5982,15 @@ function planBoard(shape, real, all) {
5685
5982
  reading: true,
5686
5983
  repeated: false
5687
5984
  };
5985
+ if (shape.kind === "all") return {
5986
+ modules: all.map((module) => ({
5987
+ key: module.id,
5988
+ module
5989
+ })),
5990
+ empty: false,
5991
+ reading: false,
5992
+ repeated: all.length > 1
5993
+ };
5688
5994
  const seed = all[0];
5689
5995
  const modules = seed === void 0 ? [] : Array.from({ length: Math.max(0, shape.count) }, (_unused, at) => ({
5690
5996
  key: `${seed.id}#${at}`,
@@ -5895,6 +6201,9 @@ function useBoardWorkspace(workspaces, sessions) {
5895
6201
  var Rightbar_module_default = { panel: "_panel_1oyh4_1" };
5896
6202
  //#endregion
5897
6203
  //#region src/app/layouts/rightbar/Rightbar.tsx
6204
+ function workspacePathOf(world) {
6205
+ return world.current.workspace?.path ?? "";
6206
+ }
5898
6207
  function ModuleHost({ module, step, panelToken, onPanelRefresh, onSummary, ...rest }) {
5899
6208
  const [ownToken, setOwnToken] = useState(0);
5900
6209
  return /* @__PURE__ */ h(step === void 0 ? module.View : module.steps?.[step]?.View ?? module.View, {
@@ -5945,8 +6254,13 @@ function BoardContent({ top, plan, world, board, panelToken, onPanelRefresh, onN
5945
6254
  icon: /* @__PURE__ */ h(IconBrandMark, { size: 32 }),
5946
6255
  title: t("panels.unknownStep")
5947
6256
  });
5948
- return /* @__PURE__ */ h(ModuleHost, {
5949
- key: `${owner.id}:${top.kind}`,
6257
+ const key = `${owner.id}:${top.kind}`;
6258
+ return /* @__PURE__ */ h(CardBoundary, {
6259
+ key,
6260
+ unit: owner.id,
6261
+ resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
6262
+ t
6263
+ }, /* @__PURE__ */ h(ModuleHost, {
5950
6264
  module: owner,
5951
6265
  step: top.kind,
5952
6266
  world,
@@ -5956,7 +6270,7 @@ function BoardContent({ top, plan, world, board, panelToken, onPanelRefresh, onN
5956
6270
  onOpenMarket,
5957
6271
  onSummary,
5958
6272
  t
5959
- });
6273
+ }));
5960
6274
  }
5961
6275
  return /* @__PURE__ */ h(Fragment, null, plan.reading ? /* @__PURE__ */ h(CenteredState, {
5962
6276
  icon: null,
@@ -5965,8 +6279,12 @@ function BoardContent({ top, plan, world, board, panelToken, onPanelRefresh, onN
5965
6279
  t,
5966
6280
  onOpenModules,
5967
6281
  onOpenMarket
5968
- }) : null, plan.modules.map(({ key, module }) => /* @__PURE__ */ h(ModuleHost, {
6282
+ }) : null, plan.modules.map(({ key, module }) => /* @__PURE__ */ h(CardBoundary, {
5969
6283
  key,
6284
+ unit: module.id,
6285
+ resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
6286
+ t
6287
+ }, /* @__PURE__ */ h(ModuleHost, {
5970
6288
  module,
5971
6289
  world,
5972
6290
  panelToken,
@@ -5975,7 +6293,7 @@ function BoardContent({ top, plan, world, board, panelToken, onPanelRefresh, onN
5975
6293
  onOpenMarket,
5976
6294
  onSummary,
5977
6295
  t
5978
- })));
6296
+ }))));
5979
6297
  }
5980
6298
  function Rightbar(props) {
5981
6299
  const units = props.units;
@@ -5998,7 +6316,7 @@ function Rightbar(props) {
5998
6316
  const plan = planBoard(fixtures.shape, {
5999
6317
  modules: visibleModules,
6000
6318
  configRead: enabledUnits !== null
6001
- }, fixtureSeed(manifests, modules.all()));
6319
+ }, fixtureSeed(manifests, modules.all(), crashModeOn(window.location.search)));
6002
6320
  const world = createSuiteWorld({
6003
6321
  workspaces,
6004
6322
  sessions,
@@ -6238,59 +6556,324 @@ function PanelRow({ id, label, active, wide, onSelect, fallbackGlyph, renderEntr
6238
6556
  className: "wb-panelTag"
6239
6557
  }, t(hint.labelKey))));
6240
6558
  }
6559
+ var ProjectSwitcher_module_default = {
6560
+ root: "_root_1vd78_1",
6561
+ anchor: "_anchor_1vd78_7",
6562
+ menu: "_menu_1vd78_12",
6563
+ trigger: "_trigger_1vd78_17",
6564
+ glyph: "_glyph_1vd78_44",
6565
+ glyphActive: "_glyphActive_1vd78_54",
6566
+ triggerName: "_triggerName_1vd78_58",
6567
+ dir: "_dir_1vd78_69",
6568
+ name: "_name_1vd78_77",
6569
+ chevron: "_chevron_1vd78_90",
6570
+ row: "_row_1vd78_96",
6571
+ trailing: "_trailing_1vd78_104",
6572
+ rowAction: "_rowAction_1vd78_114",
6573
+ current: "_current_1vd78_127",
6574
+ field: "_field_1vd78_134",
6575
+ searchIcon: "_searchIcon_1vd78_151",
6576
+ search: "_search_1vd78_151"
6577
+ };
6578
+ var WorkspaceRenameDialog_module_default = {
6579
+ dialog: "_dialog_1vye5_1",
6580
+ stack: "_stack_1vye5_5",
6581
+ input: "_input_1vye5_12",
6582
+ meta: "_meta_1vye5_18"
6583
+ };
6584
+ function basenameOf(value) {
6585
+ const trimmed = value.replace(/[/\\]+$/, "");
6586
+ const at = Math.max(trimmed.lastIndexOf("/"), trimmed.lastIndexOf("\\"));
6587
+ return at === -1 ? trimmed : trimmed.slice(at + 1);
6588
+ }
6589
+ function displayNameOf(workspace) {
6590
+ const dir = basenameOf(workspace.path) || workspace.path;
6591
+ const title = workspace.title.trim();
6592
+ return {
6593
+ dir,
6594
+ name: title !== "" && title !== dir && title !== "default-workspace" ? title : ""
6595
+ };
6596
+ }
6597
+ function matchWorkspaces(items, query) {
6598
+ const needle = query.trim().toLowerCase();
6599
+ if (needle === "") return [...items];
6600
+ return items.filter((workspace) => {
6601
+ const { dir, name } = displayNameOf(workspace);
6602
+ return `${dir} ${name} ${workspace.path}`.toLowerCase().includes(needle);
6603
+ });
6604
+ }
6605
+ function titleFor(workspace, draft) {
6606
+ const trimmed = draft.trim();
6607
+ if (trimmed === "") return basenameOf(workspace.path) || workspace.path;
6608
+ return trimmed;
6609
+ }
6610
+ function nameTooLong(draft) {
6611
+ return draft.trim().length > 20;
6612
+ }
6613
+ //#endregion
6614
+ //#region src/app/layouts/sidebar/WorkspaceRenameDialog.tsx
6615
+ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
6616
+ const [draft, setDraft] = useState(() => displayNameOf(workspace).name);
6617
+ const [busy, setBusy] = useState(false);
6618
+ const [failed, setFailed] = useState(false);
6619
+ const dir = displayNameOf(workspace).dir;
6620
+ const tooLong = nameTooLong(draft);
6621
+ const save = () => {
6622
+ if (busy || tooLong) return;
6623
+ setBusy(true);
6624
+ setFailed(false);
6625
+ onSubmit(titleFor(workspace, draft)).then((ok) => {
6626
+ setBusy(false);
6627
+ if (ok) onClose();
6628
+ else setFailed(true);
6629
+ });
6630
+ };
6631
+ return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Modal, {
6632
+ open: true,
6633
+ onClose: () => {
6634
+ if (!busy) onClose();
6635
+ },
6636
+ title: t("project.rename.title", { name: dir }),
6637
+ description: t("project.rename.description"),
6638
+ closeLabel: t("project.rename.cancel"),
6639
+ className: WorkspaceRenameDialog_module_default.dialog,
6640
+ footer: /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
6641
+ type: "button",
6642
+ variant: "outline",
6643
+ size: "md",
6644
+ disabled: busy,
6645
+ onClick: onClose
6646
+ }, t("project.rename.cancel")), /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
6647
+ type: "button",
6648
+ variant: "primary",
6649
+ size: "md",
6650
+ disabled: busy || tooLong,
6651
+ "aria-busy": busy,
6652
+ onClick: save
6653
+ }, t(busy ? "project.rename.saving" : "project.rename.save")))
6654
+ }, /* @__PURE__ */ h("div", { className: WorkspaceRenameDialog_module_default.stack }, /* @__PURE__ */ h(TextField, {
6655
+ className: WorkspaceRenameDialog_module_default.input,
6656
+ "data-modal-autofocus": "",
6657
+ id: "wb-workspace-name",
6658
+ name: "wb-workspace-name",
6659
+ "aria-label": t("project.rename.field"),
6660
+ "aria-invalid": tooLong ? "true" : void 0,
6661
+ placeholder: t("project.rename.placeholder"),
6662
+ maxLength: 40,
6663
+ value: draft,
6664
+ onChange: (event) => setDraft(event.currentTarget.value),
6665
+ onKeyDown: (event) => {
6666
+ if (event.key !== "Enter" || event.nativeEvent.isComposing) return;
6667
+ event.preventDefault();
6668
+ save();
6669
+ }
6670
+ }), /* @__PURE__ */ h("div", { className: WorkspaceRenameDialog_module_default.meta }, /* @__PURE__ */ h(Note, { as: "span" }, t("project.rename.hint")), /* @__PURE__ */ h(Note, {
6671
+ as: "span",
6672
+ tone: tooLong ? "problem" : "muted"
6673
+ }, `${draft.trim().length}/20`)), failed ? /* @__PURE__ */ h(Note, { tone: "problem" }, t("project.rename.failed")) : null));
6674
+ }
6675
+ //#endregion
6676
+ //#region src/app/layouts/sidebar/WorkspaceSearchField.tsx
6677
+ function WorkspaceSearchField({ t, query, onQuery, onCursor, onSubmit }) {
6678
+ const boxRef = useRef(null);
6679
+ useEffect(() => {
6680
+ boxRef.current?.querySelector("input")?.focus();
6681
+ }, []);
6682
+ return /* @__PURE__ */ h("span", {
6683
+ ref: boxRef,
6684
+ className: ProjectSwitcher_module_default.field
6685
+ }, /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.searchIcon }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconSearchOutlineRegular, { size: 14 })), /* @__PURE__ */ h(TextField, {
6686
+ className: ProjectSwitcher_module_default.search,
6687
+ id: "wb-workspace-search",
6688
+ name: "wb-workspace-search",
6689
+ "aria-label": t("project.search.label"),
6690
+ placeholder: t("project.search.placeholder"),
6691
+ value: query,
6692
+ onChange: (event) => onQuery(event.currentTarget.value),
6693
+ onKeyDown: (event) => {
6694
+ if (event.nativeEvent.isComposing) return;
6695
+ if (event.key === "ArrowDown" || event.key === "ArrowUp") {
6696
+ event.stopPropagation();
6697
+ event.preventDefault();
6698
+ onCursor(event.key === "ArrowDown" ? 1 : -1);
6699
+ return;
6700
+ }
6701
+ if (event.key !== "Enter") return;
6702
+ event.stopPropagation();
6703
+ onSubmit();
6704
+ }
6705
+ }));
6706
+ }
6707
+ //#endregion
6708
+ //#region src/app/layouts/sidebar/WorkspaceRowAction.tsx
6709
+ function WorkspaceRowAction({ workspace, t, onEdit }) {
6710
+ return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
6711
+ type: "button",
6712
+ variant: "ghost",
6713
+ size: "sm",
6714
+ className: ProjectSwitcher_module_default.rowAction,
6715
+ icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconEditOutlineRegular, { size: 14 }),
6716
+ "aria-label": t("project.rename.row", { name: displayNameOf(workspace).dir }),
6717
+ onClick: (event) => {
6718
+ event.stopPropagation();
6719
+ onEdit();
6720
+ }
6721
+ });
6722
+ }
6723
+ //#endregion
6724
+ //#region src/app/layouts/sidebar/WorkspaceRowLabel.tsx
6725
+ function WorkspaceRowLabel({ workspace, current, action, onHover }) {
6726
+ const { dir, name } = displayNameOf(workspace);
6727
+ const hostRef = useRef(null);
6728
+ const hoverRef = useRef(onHover);
6729
+ useEffect(() => {
6730
+ hoverRef.current = onHover;
6731
+ });
6732
+ useEffect(() => {
6733
+ const row = hostRef.current?.closest("[role=\"menuitem\"]");
6734
+ if (row === null || row === void 0) return;
6735
+ const enter = () => hoverRef.current?.(true);
6736
+ const leave = () => hoverRef.current?.(false);
6737
+ row.addEventListener("mouseenter", enter);
6738
+ row.addEventListener("mouseleave", leave);
6739
+ return () => {
6740
+ row.removeEventListener("mouseenter", enter);
6741
+ row.removeEventListener("mouseleave", leave);
6742
+ };
6743
+ }, []);
6744
+ return /* @__PURE__ */ h("span", {
6745
+ ref: hostRef,
6746
+ className: ProjectSwitcher_module_default.row
6747
+ }, /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.dir }, dir), name === "" ? null : /* @__PURE__ */ h("span", {
6748
+ className: ProjectSwitcher_module_default.name,
6749
+ title: name
6750
+ }, name), /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.trailing }, action ?? (current ? /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.current }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutlineRegular, { size: 12 })) : null)));
6751
+ }
6752
+ //#endregion
6753
+ //#region src/app/layouts/sidebar/workspace-items.tsx
6754
+ function workspaceMenuItems(options) {
6755
+ const { results, currentId, hoverId, t, onHover, onEdit } = options;
6756
+ return results.map((workspace) => ({
6757
+ id: workspace.workspaceId,
6758
+ icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconFolderOpenRegular, { size: 16 }),
6759
+ label: /* @__PURE__ */ h(WorkspaceRowLabel, {
6760
+ workspace,
6761
+ current: workspace.workspaceId === currentId,
6762
+ onHover: (hovering) => onHover(hovering ? workspace.workspaceId : null),
6763
+ action: hoverId === workspace.workspaceId ? /* @__PURE__ */ h(WorkspaceRowAction, {
6764
+ workspace,
6765
+ t,
6766
+ onEdit: () => onEdit(workspace)
6767
+ }) : void 0
6768
+ })
6769
+ }));
6770
+ }
6241
6771
  //#endregion
6242
6772
  //#region src/app/layouts/sidebar/ProjectSwitcher.tsx
6243
6773
  var ADD_WORKSPACE_ID = "__wb-add-workspace__";
6244
- function ProjectSwitcher({ items, current, workspaceTitle, onPick, onAdd, t }) {
6774
+ function triggerName(current, t) {
6775
+ if (current === null) return t("project.none");
6776
+ const { dir, name } = displayNameOf(current);
6777
+ return /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.dir }, dir), name === "" ? null : /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.name }, name));
6778
+ }
6779
+ function ProjectSwitcher({ items, current, onPick, onAdd, onRename, t }) {
6245
6780
  const [open, setOpen] = useState(false);
6781
+ const [query, setQuery] = useState("");
6782
+ const [cursor, setCursor] = useState(null);
6783
+ const [hoverId, setHoverId] = useState(null);
6784
+ const [naming, setNaming] = useState(null);
6246
6785
  const triggerRef = useRef(null);
6247
- const title = current ? workspaceTitle(current.title) : t("project.none");
6786
+ const wasOpenRef = useRef(false);
6248
6787
  const currentId = current?.workspaceId ?? null;
6249
- const trigger = /* @__PURE__ */ h("button", {
6788
+ const results = useMemo(() => matchWorkspaces(items, query), [items, query]);
6789
+ const cursorId = cursor === null || results.length === 0 ? null : results[Math.min(cursor, results.length - 1)]?.workspaceId ?? null;
6790
+ useEffect(() => {
6791
+ if (open) {
6792
+ wasOpenRef.current = true;
6793
+ return;
6794
+ }
6795
+ setQuery("");
6796
+ setCursor(null);
6797
+ setHoverId(null);
6798
+ if (wasOpenRef.current && naming === null) {
6799
+ wasOpenRef.current = false;
6800
+ triggerRef.current?.focus();
6801
+ }
6802
+ }, [open, naming]);
6803
+ const close = () => setOpen(false);
6804
+ const anchor = open ? /* @__PURE__ */ h(WorkspaceSearchField, {
6805
+ t,
6806
+ query,
6807
+ onQuery: (next) => {
6808
+ setQuery(next);
6809
+ setCursor(null);
6810
+ },
6811
+ onCursor: (step) => {
6812
+ if (results.length === 0) return;
6813
+ setCursor((at) => at === null ? step === 1 ? 0 : results.length - 1 : (at + step + results.length) % results.length);
6814
+ },
6815
+ onSubmit: () => {
6816
+ const pick = results[Math.min(cursor ?? 0, results.length - 1)];
6817
+ if (pick === void 0) return;
6818
+ close();
6819
+ onPick(pick.workspaceId);
6820
+ }
6821
+ }) : /* @__PURE__ */ h("button", {
6250
6822
  type: "button",
6251
6823
  ref: triggerRef,
6252
- className: "wb-projectButton",
6824
+ className: ProjectSwitcher_module_default.trigger,
6253
6825
  "aria-haspopup": "listbox",
6254
6826
  "aria-expanded": open,
6255
6827
  "aria-label": t("project.label"),
6256
- title: current ? current.path : title,
6257
- onClick: () => {
6258
- document.documentElement.style.setProperty("--wb-project-menu-min-width", `${Math.round(triggerRef.current?.getBoundingClientRect().width ?? 0)}px`);
6259
- setOpen((value) => !value);
6260
- }
6261
- }, /* @__PURE__ */ h("span", { className: "wb-projectGlyph wb-projectGlyphActive" }, open ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconFolderOpenRegular, { size: 16 }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconFolderCloseRegular, { size: 16 })), /* @__PURE__ */ h("span", { className: "wb-projectName" }, title), /* @__PURE__ */ h("span", { className: cx("wb-projectChevron", open && "wb-projectChevronOpen") }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, { size: 14 })));
6262
- return /* @__PURE__ */ h("div", { className: "wb-project" }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Menu, {
6828
+ title: current?.path ?? void 0,
6829
+ onClick: () => setOpen(true)
6830
+ }, /* @__PURE__ */ h("span", { className: cx(ProjectSwitcher_module_default.glyph, ProjectSwitcher_module_default.glyphActive) }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconFolderCloseRegular, { size: 16 })), /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.triggerName }, triggerName(current, t)), /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.chevron }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, { size: 14 })));
6831
+ return /* @__PURE__ */ h("div", { className: ProjectSwitcher_module_default.root }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Menu, {
6263
6832
  open,
6264
6833
  portal: true,
6265
- className: "wb-projectAnchor",
6266
- anchor: trigger,
6834
+ className: ProjectSwitcher_module_default.anchor,
6835
+ listClassName: ProjectSwitcher_module_default.menu,
6836
+ anchor,
6267
6837
  align: "start",
6268
6838
  side: "bottom",
6269
- selection: "check",
6270
- selectedId: currentId ?? void 0,
6271
- items: [...items.length === 0 ? [{
6839
+ selection: "fill",
6840
+ selectedId: cursorId ?? void 0,
6841
+ items: [...results.length === 0 ? [{
6272
6842
  type: "label",
6273
6843
  id: "empty",
6274
- text: t("project.empty")
6275
- }] : [], ...items.map((workspace) => ({
6276
- id: workspace.workspaceId,
6277
- label: workspaceTitle(workspace.title),
6278
- icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconFolderCloseRegular, { size: 16 })
6279
- }))],
6844
+ text: t("project.search.empty", { query: query.trim() })
6845
+ }] : [], ...workspaceMenuItems({
6846
+ results,
6847
+ currentId,
6848
+ hoverId,
6849
+ t,
6850
+ onHover: setHoverId,
6851
+ onEdit: (workspace) => {
6852
+ close();
6853
+ setNaming(workspace);
6854
+ }
6855
+ })],
6280
6856
  footer: [{
6281
6857
  id: ADD_WORKSPACE_ID,
6282
6858
  label: t("project.add"),
6283
6859
  icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineRegular, { size: 14 })
6284
6860
  }],
6285
6861
  onSelect: (id) => {
6286
- setOpen(false);
6287
6862
  if (id === ADD_WORKSPACE_ID) {
6863
+ close();
6288
6864
  onAdd();
6289
6865
  return;
6290
6866
  }
6867
+ close();
6291
6868
  onPick(id);
6292
6869
  },
6293
- onClose: () => setOpen(false)
6870
+ onClose: close
6871
+ }), naming === null ? null : /* @__PURE__ */ h(WorkspaceRenameDialog, {
6872
+ key: naming.workspaceId,
6873
+ workspace: naming,
6874
+ t,
6875
+ onClose: () => setNaming(null),
6876
+ onSubmit: (title) => onRename(naming.workspaceId, title)
6294
6877
  }));
6295
6878
  }
6296
6879
  //#endregion
@@ -6440,9 +7023,9 @@ function Sidebar(props) {
6440
7023
  }))), wide ? /* @__PURE__ */ h(ProjectSwitcher, {
6441
7024
  items,
6442
7025
  current,
6443
- workspaceTitle: props.workspaceDisplayTitle,
6444
7026
  onPick: pickProject,
6445
7027
  onAdd: addProject,
7028
+ onRename: props.renameWorkspace,
6446
7029
  t
6447
7030
  }) : null, /* @__PURE__ */ h(WorkspaceSection, {
6448
7031
  t,
@@ -6891,12 +7474,12 @@ var kit = {
6891
7474
  }
6892
7475
  };
6893
7476
  function messagesOf(units) {
6894
- return mergeMessages(dictionaries, units.map((face) => ({
7477
+ return units.map((face) => ({
6895
7478
  unit: face.manifest.id,
6896
7479
  ...face.messages === void 0 ? {} : { messages: face.messages }
6897
- })));
7480
+ }));
6898
7481
  }
6899
- 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-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 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-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}\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 display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n color: var(--dsw-alias-label-secondary);\n text-decoration: none;\n white-space: nowrap;\n}\n.wb-longTaskLink:hover,\n.wb-longTaskLink:focus-visible {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n.wb-longTaskLink: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-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-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-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._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._marketList_7yq35_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 max-height: var(--wb-len-320);\n overflow-y: auto;\n}\n\n._marketRow_7yq35_12 {\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_7yq35_22 {\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_7yq35_34 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_7yq35_41 {\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_7yq35_50 {\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_7yq35_61 {\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_7yq35_61::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_7yq35_41 ._marketVersion_7yq35_75 {\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_7yq35_75 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_7yq35_75::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_7yq35_97 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._marketActions_7yq35_104 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketSection_7yq35_110 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_7yq35_117 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionTitle_7yq35_123 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_7yq35_129 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketProgress_7yq35_135 {\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_7yq35_145 {\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._marketFailure_7yq35_152 {\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_7yq35_159 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_7yq35_164 {\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: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_7yq35_164 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_7yq35_181 {\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_7yq35_189 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_7yq35_194 {\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_7yq35_200 {\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_7yq35_209 {\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_7yq35_209:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_7yq35_209:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_7yq35_234 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_7yq35_238 svg {\n animation: _wb-spin_7yq35_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_7yq35_242 {\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_7yq35_159 {\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_7yq35_259 {\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_7yq35_267 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_7yq35_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\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_1weg4_1 {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n._pop_1weg4_7 {\n position: absolute;\n top: calc(100% + var(--wb-len-8));\n right: 0;\n z-index: var(--wb-z-30);\n width: var(--wb-len-360);\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_1weg4_21 {\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_1weg4_29 {\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._reset_1weg4_37 {\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_1weg4_37:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_1weg4_37:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_1weg4_59 {\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_1weg4_68 {\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_1weg4_68:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOver_1weg4_83::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_1weg4_93 {\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_1weg4_108 {\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_1weg4_116 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_1weg4_123 {\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_1weg4_134 {\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_1weg4_142 {\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._panel_1oyh4_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_1oyh4_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_1oyh4_1[data-open] {\n visibility: visible;\n}\n._blocker_cfaak_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_cfaak_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_cfaak_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_cfaak_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_cfaak_1._blockerInline_cfaak_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_cfaak_1._blockerInline_cfaak_32 ._title_cfaak_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_cfaak_1._blockerInline_cfaak_32 ._hint_cfaak_23 {\n max-width: 100%;\n}\n\n._blocker_cfaak_1._blockerInline_cfaak_32 ._actions_cfaak_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_cfaak_1._blockerInline_cfaak_32 ._raw_cfaak_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_cfaak_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_cfaak_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_cfaak_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_cfaak_71._noticeFlat_cfaak_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_cfaak_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_cfaak_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_cfaak_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_cfaak_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_cfaak_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_cfaak_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._inlineLink_cfaak_134 {\n margin-left: var(--wb-len-2);\n padding: 0;\n border: none;\n background: transparent;\n font: inherit;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n vertical-align: baseline;\n}\n\n._inlineLink_cfaak_134:hover {\n text-decoration: underline;\n}\n\n._inlineLink_cfaak_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n._rawText_cfaak_156 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
7482
+ 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 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-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}\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 display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n color: var(--dsw-alias-label-secondary);\n text-decoration: none;\n white-space: nowrap;\n}\n.wb-longTaskLink:hover,\n.wb-longTaskLink:focus-visible {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n.wb-longTaskLink: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-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._marketList_7yq35_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 max-height: var(--wb-len-320);\n overflow-y: auto;\n}\n\n._marketRow_7yq35_12 {\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_7yq35_22 {\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_7yq35_34 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_7yq35_41 {\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_7yq35_50 {\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_7yq35_61 {\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_7yq35_61::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_7yq35_41 ._marketVersion_7yq35_75 {\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_7yq35_75 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_7yq35_75::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_7yq35_97 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._marketActions_7yq35_104 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketSection_7yq35_110 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_7yq35_117 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionTitle_7yq35_123 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_7yq35_129 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketProgress_7yq35_135 {\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_7yq35_145 {\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._marketFailure_7yq35_152 {\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_7yq35_159 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_7yq35_164 {\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: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_7yq35_164 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_7yq35_181 {\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_7yq35_189 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_7yq35_194 {\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_7yq35_200 {\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_7yq35_209 {\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_7yq35_209:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_7yq35_209:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_7yq35_234 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_7yq35_238 svg {\n animation: _wb-spin_7yq35_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_7yq35_242 {\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_7yq35_159 {\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_7yq35_259 {\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_7yq35_267 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_7yq35_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_1weg4_1 {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n._pop_1weg4_7 {\n position: absolute;\n top: calc(100% + var(--wb-len-8));\n right: 0;\n z-index: var(--wb-z-30);\n width: var(--wb-len-360);\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_1weg4_21 {\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_1weg4_29 {\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._reset_1weg4_37 {\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_1weg4_37:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_1weg4_37:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_1weg4_59 {\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_1weg4_68 {\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_1weg4_68:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOver_1weg4_83::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_1weg4_93 {\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_1weg4_108 {\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_1weg4_116 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_1weg4_123 {\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_1weg4_134 {\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_1weg4_142 {\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._panel_1oyh4_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_1oyh4_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_1oyh4_1[data-open] {\n visibility: visible;\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_cfaak_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_cfaak_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_cfaak_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_cfaak_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_cfaak_1._blockerInline_cfaak_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_cfaak_1._blockerInline_cfaak_32 ._title_cfaak_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_cfaak_1._blockerInline_cfaak_32 ._hint_cfaak_23 {\n max-width: 100%;\n}\n\n._blocker_cfaak_1._blockerInline_cfaak_32 ._actions_cfaak_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_cfaak_1._blockerInline_cfaak_32 ._raw_cfaak_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_cfaak_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_cfaak_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_cfaak_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_cfaak_71._noticeFlat_cfaak_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_cfaak_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_cfaak_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_cfaak_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_cfaak_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_cfaak_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_cfaak_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._inlineLink_cfaak_134 {\n margin-left: var(--wb-len-2);\n padding: 0;\n border: none;\n background: transparent;\n font: inherit;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n vertical-align: baseline;\n}\n\n._inlineLink_cfaak_134:hover {\n text-decoration: underline;\n}\n\n._inlineLink_cfaak_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n._rawText_cfaak_156 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
6900
7483
  function installStyles() {
6901
7484
  const style = document.createElement("style");
6902
7485
  style.setAttribute(STYLE_MARKER, "");
@@ -6956,7 +7539,9 @@ function mount(ctx) {
6956
7539
  let disposeDictionary;
6957
7540
  const publish = () => {
6958
7541
  disposeDictionary?.();
6959
- disposeDictionary = ctx.locale.register(LOCALE_NS, messagesOf(units.all()));
7542
+ const { dictionaries: merged, problems } = mergeMessagesSkipping(dictionaries, messagesOf(units.all()));
7543
+ for (const problem of problems) console.warn(`[dsh-workbench] 套件 ${problem.unit} 的文案没并进来(只有它少了这几句):${problem.reason}`);
7544
+ disposeDictionary = ctx.locale.register(LOCALE_NS, merged);
6960
7545
  };
6961
7546
  publish();
6962
7547
  const unsubscribe = units.subscribe(publish);
@@ -7108,7 +7693,14 @@ function mount(ctx) {
7108
7693
  inject: () => ({
7109
7694
  listPanels: () => readPanels(ctx),
7110
7695
  subscribePanels: (callback) => ctx.slots.subscribe("sidebar.panellist", callback),
7111
- workspaceDisplayTitle: (title) => title === "default-workspace" ? ctx.locale.bind("common")("workspace.defaultName") : title,
7696
+ renameWorkspace: async (workspaceId, title) => {
7697
+ try {
7698
+ await ctx.workspaces.rename(workspaceId, title);
7699
+ return true;
7700
+ } catch {
7701
+ return false;
7702
+ }
7703
+ },
7112
7704
  openWorkspace: (workspaceId) => {
7113
7705
  ctx.uiWorkspace.openWorkspace(workspaceId);
7114
7706
  },