dsh-config-manager 0.1.73 → 0.1.77

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 (96) hide show
  1. package/lib/adapters/plugin-data-declared.d.ts +12 -0
  2. package/lib/adapters/plugin-data-declared.js +57 -0
  3. package/lib/adapters/plugin-data.d.ts +4 -6
  4. package/lib/adapters/plugin-data.js +8 -36
  5. package/lib/adapters/plugins.js +92 -12
  6. package/lib/client.d.ts +112 -13
  7. package/lib/client.js +2102 -888
  8. package/lib/core/messages.d.ts +1 -0
  9. package/lib/core/messages.js +2 -0
  10. package/lib/core/rollback-attribution.d.ts +81 -0
  11. package/lib/core/rollback-attribution.js +236 -0
  12. package/lib/core/rollback-ledger.d.ts +29 -3
  13. package/lib/core/rollback-ledger.js +125 -7
  14. package/lib/core/rollback-merge.d.ts +22 -0
  15. package/lib/core/rollback-merge.js +203 -0
  16. package/lib/core/rollback-point.d.ts +335 -3
  17. package/lib/core/rollback-point.js +1323 -169
  18. package/lib/core/types.d.ts +18 -0
  19. package/lib/index.d.ts +26 -3
  20. package/lib/index.js +129 -16
  21. package/lib/routes/recovery.js +11 -0
  22. package/lib/schema/section-registry.js +5 -5
  23. package/lib/sync/messages.d.ts +1 -0
  24. package/lib/sync/messages.js +3 -0
  25. package/lib/sync/sync-engine.js +56 -7
  26. package/lib/ui/badge-tone.d.ts +16 -0
  27. package/lib/ui/badge-tone.js +20 -0
  28. package/lib/ui/i18n.d.ts +5 -5
  29. package/lib/ui/i18n.js +10 -10
  30. package/lib/ui/rollback-view.d.ts +95 -0
  31. package/lib/ui/rollback-view.js +55 -0
  32. package/lib/ui/selection-model.d.ts +140 -1
  33. package/lib/ui/selection-model.js +241 -9
  34. package/lib/utils/bundle-scan.d.ts +5 -3
  35. package/lib/utils/bundle-scan.js +5 -3
  36. package/lib/utils/line-diff.d.ts +7 -1
  37. package/lib/utils/line-diff.js +8 -2
  38. package/package.json +1 -1
  39. package/src/adapters/plugin-data-declared.ts +60 -0
  40. package/src/adapters/plugin-data.ts +7 -33
  41. package/src/adapters/plugins.ts +98 -13
  42. package/src/adapters/units.test.ts +26 -0
  43. package/src/client/chat/ChatEntryView.tsx +179 -49
  44. package/src/client/chat/RollbackFileIcon.tsx +7 -45
  45. package/src/client/chat/chat-entry-view.test.ts +440 -1
  46. package/src/client/chat/chat-entry-view.ts +222 -11
  47. package/src/client/chat/chat-node-registration.ts +111 -6
  48. package/src/client/chat/chat-slots.ts +30 -12
  49. package/src/client/common/ContentPicker.tsx +581 -175
  50. package/src/client/common/DiffTable.tsx +12 -23
  51. package/src/client/common/host-primitives.ts +141 -0
  52. package/src/client/common/ui.tsx +17 -3
  53. package/src/client/config-manager.module.css +658 -404
  54. package/src/client/css-scale-guard.test.ts +41 -3
  55. package/src/client/css-token-guard.test.ts +10 -4
  56. package/src/client/environment/maintenance/DiskUsageCard.tsx +20 -3
  57. package/src/client/export/ExportView.tsx +2 -0
  58. package/src/client/index.ts +22 -4
  59. package/src/client/library/RestorePlanView.tsx +0 -1
  60. package/src/client/locales.ts +54 -12
  61. package/src/client/recovery/RollbackCard.tsx +56 -2
  62. package/src/client/recovery/RollbackDiffPane.tsx +18 -6
  63. package/src/client/recovery/RollbackFileChanges.tsx +46 -2
  64. package/src/client/recovery/recovery-locales.ts +24 -4
  65. package/src/client/recovery/rollback-file-changes.test.ts +37 -1
  66. package/src/client/sync/PushPreviewCard.tsx +57 -0
  67. package/src/client/sync/SyncPanel.tsx +2 -37
  68. package/src/client/sync/SyncSettingsView.test.ts +3 -0
  69. package/src/client/sync/sync-push-preview.test.ts +14 -0
  70. package/src/client/sync/sync-view.ts +9 -1
  71. package/src/core/messages.ts +2 -0
  72. package/src/core/rollback-attribution.test.ts +120 -0
  73. package/src/core/rollback-attribution.ts +267 -0
  74. package/src/core/rollback-ledger.ts +123 -7
  75. package/src/core/rollback-merge.test.ts +133 -0
  76. package/src/core/rollback-merge.ts +213 -0
  77. package/src/core/rollback-point.test.ts +1004 -17
  78. package/src/core/rollback-point.ts +1421 -175
  79. package/src/core/types.ts +19 -0
  80. package/src/index.facade.test.ts +60 -0
  81. package/src/index.ts +133 -19
  82. package/src/routes/recovery.ts +11 -0
  83. package/src/schema/section-registry.ts +5 -5
  84. package/src/sync/messages.ts +3 -0
  85. package/src/sync/sync-engine.ts +55 -7
  86. package/src/sync/sync-preview-push.test.ts +158 -0
  87. package/src/ui/badge-tone.test.ts +23 -0
  88. package/src/ui/badge-tone.ts +27 -0
  89. package/src/ui/i18n.ts +10 -10
  90. package/src/ui/rollback-view.test.ts +27 -0
  91. package/src/ui/rollback-view.ts +139 -0
  92. package/src/ui/selection-model.test.ts +240 -2
  93. package/src/ui/selection-model.ts +349 -1
  94. package/src/utils/bundle-scan.ts +5 -3
  95. package/src/utils/line-diff.test.ts +12 -0
  96. package/src/utils/line-diff.ts +9 -3
package/lib/client.js CHANGED
@@ -116,7 +116,7 @@ const SECTION_REGISTRY = {
116
116
  },
117
117
  plugins: {
118
118
  id: "plugins",
119
- displayName: "Plugins",
119
+ displayName: "Plugin list",
120
120
  group: "extensions",
121
121
  payload: {
122
122
  kind: "array",
@@ -234,7 +234,7 @@ const SECTION_REGISTRY = {
234
234
  },
235
235
  pluginFiles: {
236
236
  id: "pluginFiles",
237
- displayName: "Other Plugins' Loose Files",
237
+ displayName: "Plugin config files",
238
238
  group: "extensions",
239
239
  payload: {
240
240
  kind: "files",
@@ -296,7 +296,7 @@ const SECTION_REGISTRY = {
296
296
  },
297
297
  self: {
298
298
  id: "self",
299
- displayName: "This Plugin's Own Config",
299
+ displayName: "Config Manager settings",
300
300
  group: "extensions",
301
301
  payload: {
302
302
  kind: "files",
@@ -312,7 +312,7 @@ const SECTION_REGISTRY = {
312
312
  },
313
313
  pluginData: {
314
314
  id: "pluginData",
315
- displayName: "Other Plugins' Data",
315
+ displayName: "Plugin data dirs",
316
316
  group: "extensions",
317
317
  payload: {
318
318
  kind: "files",
@@ -328,7 +328,7 @@ const SECTION_REGISTRY = {
328
328
  },
329
329
  pluginAssets: {
330
330
  id: "pluginAssets",
331
- displayName: "Other Plugins' Large Files",
331
+ displayName: "Plugin large files",
332
332
  group: "extensions",
333
333
  payload: {
334
334
  kind: "files",
@@ -793,7 +793,7 @@ const uiZh = {
793
793
  "error.downloadFailed": "下载失败:HTTP {status}",
794
794
  "error.exportTimeout": "导出超时({minutes} 分钟):导出过程未完成,请重试;若反复超时请检查 DSH 状态",
795
795
  "error.syncTimeout": "同步请求超时({minutes} 分钟):请检查网络与仓库可达性后重试",
796
- "error.recoveryTimeout": "恢复请求超时({minutes} 分钟):恢复过程未完成,请重试;若反复超时请检查 DSH 状态",
796
+ "error.recoveryTimeout": "恢复请求超时({minutes} 分钟):过程可能仍在后台进行,请先刷新预览确认;确实未完成再重试",
797
797
  "error.settingsConflict.title": "配置已被并发修改",
798
798
  "error.settingsConflict.action": "目标 DSH 的该配置在导入期间被其他进程修改,为避免覆盖请重新导出或手动核对后再试。",
799
799
  "error.notConfirmed.title": "导入未确认",
@@ -1218,10 +1218,10 @@ const uiZh = {
1218
1218
  "export.category.settings": "DSH 全局设置(namespace 分区,redacted)",
1219
1219
  "export.category.providers": "LLM Provider / Model / 默认模型 / BaseURL",
1220
1220
  "export.category.plugins": "已安装插件清单与启用状态(不含二进制)",
1221
- "export.category.pluginFiles": "其他插件放在 ~/.dsh 根下的零散配置文件(白名单 + plugin-config/ 目录,整文件复制)",
1222
- "export.category.self": "本插件自身配置(同步/自动同步/分区选择/UI 偏好/市场;sync-*.json 等,不含凭据值)",
1223
- "export.category.pluginData": "其他插件在系统主目录下的数据(如 ~/.dsh-wallpaper-engine、~/.mnemon 的配置与状态;可再生成缓存绝不收录)",
1224
- "export.category.pluginAssets": "其他插件的大体积文件(上传的壁纸、本地数据库等;默认不勾选)",
1221
+ "export.category.pluginFiles": "插件放在 ~/.dsh 根下的配置文件(白名单 + plugin-config/ 目录,整文件复制)",
1222
+ "export.category.self": "配置管理器自身的设置(同步/自动同步/分区选择/UI 偏好/市场;sync-*.json 等,不含凭据值)",
1223
+ "export.category.pluginData": "插件在系统主目录下的数据(如 ~/.dsh-wallpaper-engine、~/.mnemon 的配置与状态;可再生成缓存绝不收录)",
1224
+ "export.category.pluginAssets": "插件的大体积文件(上传的壁纸、本地数据库等;默认不勾选)",
1225
1225
  "export.category.mcp": "MCP 服务器组合配置(需重启生效)",
1226
1226
  "export.category.prompts": "System Prompt / Plan Mode 提示",
1227
1227
  "export.category.skills": "用户技能文件(~/.dsh/skills)",
@@ -1330,7 +1330,7 @@ const uiEn = {
1330
1330
  "error.downloadFailed": "Download failed: HTTP {status}",
1331
1331
  "error.exportTimeout": "Export timed out ({minutes} min): the export did not complete, please retry; if it keeps timing out, check the DSH state",
1332
1332
  "error.syncTimeout": "Sync request timed out ({minutes} min): check network and repository reachability, then retry",
1333
- "error.recoveryTimeout": "Recovery request timed out ({minutes} min): the recovery did not complete, please retry; if it keeps timing out, check the DSH state",
1333
+ "error.recoveryTimeout": "Recovery request timed out ({minutes} min): it may still be running in the background — refresh the preview to confirm, then retry if it did not finish",
1334
1334
  "error.settingsConflict.title": "Configuration changed concurrently",
1335
1335
  "error.settingsConflict.action": "This configuration on the target DSH was modified by another process during import. To avoid overwriting it, re-export or review it manually, then retry.",
1336
1336
  "error.notConfirmed.title": "Import not confirmed",
@@ -1755,10 +1755,10 @@ const uiEn = {
1755
1755
  "export.category.settings": "Global DSH settings (namespace sections, redacted)",
1756
1756
  "export.category.providers": "LLM providers / models / default model / base URL",
1757
1757
  "export.category.plugins": "Installed plugin list and enablement (binaries excluded)",
1758
- "export.category.pluginFiles": "Other plugins' loose config files at the ~/.dsh root (allowlist + plugin-config/, copied whole)",
1759
- "export.category.self": "This plugin's own config (sync / autosync / section selection / UI prefs / market; sync-*.json etc., no credential values)",
1760
- "export.category.pluginData": "Other plugins' data under the system home directory (e.g. the config/state of ~/.dsh-wallpaper-engine and ~/.mnemon; regenerable caches are never included)",
1761
- "export.category.pluginAssets": "Other plugins' large files (uploaded wallpapers, local databases, ...; not selected by default)",
1758
+ "export.category.pluginFiles": "Plugin config files at the ~/.dsh root (allowlist + plugin-config/, copied whole)",
1759
+ "export.category.self": "Config Manager's own settings (sync / autosync / section selection / UI prefs / market; sync-*.json etc., no credential values)",
1760
+ "export.category.pluginData": "Plugin data under the system home directory (e.g. the config/state of ~/.dsh-wallpaper-engine and ~/.mnemon; regenerable caches are never included)",
1761
+ "export.category.pluginAssets": "Plugins' large files (uploaded wallpapers, local databases, ...; not selected by default)",
1762
1762
  "export.category.mcp": "MCP server composition (restart required)",
1763
1763
  "export.category.prompts": "System prompt / Plan Mode prompts",
1764
1764
  "export.category.skills": "Your skill files (~/.dsh/skills)",
@@ -3641,6 +3641,256 @@ function effectiveImportPlan(plan, zipPath, state) {
3641
3641
  const selection = effectiveImportSelection(plan, zipPath, state);
3642
3642
  return plan === null || selection === null ? null : buildSelectedPlan(plan, selection);
3643
3643
  }
3644
+ /**
3645
+ * 合并进「按插件看」那棵树的分区(导出选择器里「插件与扩展」组的成员)。
3646
+ *
3647
+ * 这四项的归属键只有 npm 包名(plugin:<包名> ↔ 来源注册表的 packages);self(配置管理器设置)
3648
+ * **不在**这里 —— 它不是插件,仍按普通分区行渲染。清单顺序仍由调用方给的节点顺序决定
3649
+ * (宿主目录已按 EXPORT_GROUPS 排好,树只在第一个成员处渲染一次)。
3650
+ */
3651
+ const PLUGIN_TREE_SECTIONS = [
3652
+ "plugins",
3653
+ "pluginFiles",
3654
+ "pluginData",
3655
+ "pluginAssets"
3656
+ ];
3657
+ /** 该分区是否合并进「按插件看」的树(见 PLUGIN_TREE_SECTIONS)。 */
3658
+ function isPluginTreeSection(section) {
3659
+ return PLUGIN_TREE_SECTIONS.includes(section);
3660
+ }
3661
+ /** 插件单元 id 前缀(与 adapters/units.ts 的 `plugin:<包名>` 同一命名空间) */
3662
+ const PLUGIN_UNIT_PREFIX = "plugin:";
3663
+ /** 把一条区域引用投影成叶子(按该分区清单是否到货决定 present / unread / absent)。 */
3664
+ function areaLeaf(node, ref) {
3665
+ const unitId = ref.section + ":" + ref.relPath;
3666
+ const kind = ref.role === "assets" ? "assets" : "config";
3667
+ const unit = node?.units.find((u) => u.id === unitId);
3668
+ if (unit === void 0) return {
3669
+ kind,
3670
+ section: ref.section,
3671
+ unitId,
3672
+ label: ref.relPath,
3673
+ sizeBytes: 0,
3674
+ state: node === void 0 || node.unitsUnread === true ? "unread" : "absent"
3675
+ };
3676
+ return {
3677
+ kind,
3678
+ section: ref.section,
3679
+ unitId,
3680
+ label: ref.relPath,
3681
+ ...unit.detail !== void 0 ? { detail: unit.detail } : {},
3682
+ sizeBytes: unit.sizeBytes,
3683
+ state: "present"
3684
+ };
3685
+ }
3686
+ /** 把选择器分区模型投影成「按插件看」的树(纯函数)。 */
3687
+ function pluginTree(nodes) {
3688
+ const bySection = /* @__PURE__ */ new Map();
3689
+ for (const n of nodes) bySection.set(n.section, n);
3690
+ const pluginsNode = bySection.get("plugins");
3691
+ const entries = [];
3692
+ const extras = [];
3693
+ for (const unit of pluginsNode?.units ?? []) {
3694
+ if (!unit.id.startsWith(PLUGIN_UNIT_PREFIX)) {
3695
+ extras.push(unit);
3696
+ continue;
3697
+ }
3698
+ const name = unit.id.slice(7);
3699
+ const main = {
3700
+ kind: "plugin",
3701
+ section: "plugins",
3702
+ unitId: unit.id,
3703
+ label: unit.label,
3704
+ ...unit.detail !== void 0 ? { detail: unit.detail } : {},
3705
+ sizeBytes: unit.sizeBytes,
3706
+ state: "present"
3707
+ };
3708
+ const areas = (unit.relatedAreas ?? []).map((ref) => areaLeaf(bySection.get(ref.section), ref));
3709
+ entries.push({
3710
+ name,
3711
+ main,
3712
+ areas,
3713
+ leaves: [main, ...areas]
3714
+ });
3715
+ }
3716
+ const buckets = [];
3717
+ const pluginExtras = bySection.get("plugins");
3718
+ if (pluginExtras !== void 0) buckets.push({
3719
+ section: "plugins",
3720
+ loaded: pluginExtras.unitsUnread !== true,
3721
+ units: extras
3722
+ });
3723
+ /**
3724
+ * 只留一个桶:pluginFiles。
3725
+ *
3726
+ * 它没有任何包名信息(白名单文件 + `plugin-config/<任意目录名>/`),按目录名猜包名 = 猜错就在树里
3727
+ * 勾错东西 ⇒ 整块归「未归属」。**pluginData / pluginAssets 里没被插件声明认领的单元不再单列
3728
+ * 「遗留数据」桶**(用户 2026-10-17 明确要求:不需要看到这些)—— 它们仍会随该分区整体勾选导出,
3729
+ * 只是不在插件树里单开一行。
3730
+ */
3731
+ for (const id of ["pluginFiles"]) {
3732
+ const node = bySection.get(id);
3733
+ if (node === void 0) continue;
3734
+ buckets.push({
3735
+ section: id,
3736
+ loaded: node.unitsUnread !== true,
3737
+ units: node.units
3738
+ });
3739
+ }
3740
+ return {
3741
+ pluginsLoaded: pluginsNode !== void 0 && pluginsNode.unitsUnread !== true,
3742
+ entries,
3743
+ buckets
3744
+ };
3745
+ }
3746
+ /** 树上的搜索过滤:插件名命中 → 保留它全部叶子;否则只保留标签命中的叶子;桶按单元标签过滤。 */
3747
+ function filterPluginTree(tree, query) {
3748
+ const q = query.trim().toLowerCase();
3749
+ if (q === "") return tree;
3750
+ const hit = (text) => text.toLowerCase().includes(q);
3751
+ const entries = tree.entries.map((e) => hit(e.name) ? e : {
3752
+ ...e,
3753
+ leaves: e.leaves.filter((l) => hit(l.label) || hit(l.detail ?? ""))
3754
+ }).filter((e) => hit(e.name) || e.leaves.length > 0);
3755
+ const buckets = tree.buckets.map((b) => ({
3756
+ ...b,
3757
+ units: b.units.filter((u) => hit(u.label) || hit(u.detail ?? ""))
3758
+ })).filter((b) => b.units.length > 0);
3759
+ return {
3760
+ ...tree,
3761
+ entries,
3762
+ buckets
3763
+ };
3764
+ }
3765
+ /** 该插件节点下**真实可勾选**的叶子(unread / absent 不参与勾选)。 */
3766
+ function pluginEntryLeaves(entry) {
3767
+ return entry.leaves.filter((l) => l.state === "present");
3768
+ }
3769
+ /**
3770
+ * 该插件名下**已知**的叶子(存在 + 还没读到清单的区域声明)。
3771
+ *
3772
+ * 计数与三态用它,**不用 pluginEntryLeaves(只含 present)**:否则「已选 n/m」会随清单到货跳动 ——
3773
+ * 折叠时显示 1/1、展开(触发了读取)后变成 1/3,用户看到的是「数字自己变了」(2026-10-17 实测反馈)。
3774
+ * absent(注册表说有、盘上确实没有)不计入:它永远不可勾,算进去只会让分母虚高。
3775
+ */
3776
+ function pluginEntryKnownLeaves(entry) {
3777
+ return entry.leaves.filter((l) => l.state !== "absent");
3778
+ }
3779
+ function pluginEntryTotalCount(entry) {
3780
+ return pluginEntryKnownLeaves(entry).length;
3781
+ }
3782
+ function pluginEntrySelectedCount(sel, entry) {
3783
+ return pluginEntryLeaves(entry).reduce((n, l) => n + (unitChecked(sel, l.section, l.unitId) ? 1 : 0), 0);
3784
+ }
3785
+ /**
3786
+ * 插件节点三态(与分区/分组同一套口径,但分母用**已知**叶子)。
3787
+ *
3788
+ * 还有区域没读到(unread)时最多只能是 `partial`:那些单元此刻勾不上,
3789
+ * 报「全选」会让用户以为已经全带上(真正补齐见 ContentPicker 的待补勾队列)。
3790
+ */
3791
+ function pluginEntryPickState(sel, entry) {
3792
+ const known = pluginEntryKnownLeaves(entry);
3793
+ if (known.length === 0) return "none";
3794
+ const picked = pluginEntrySelectedCount(sel, entry);
3795
+ if (picked === 0) return "none";
3796
+ return picked === known.length ? "all" : "partial";
3797
+ }
3798
+ /**
3799
+ * 插件节点级勾选:把它名下**存在的**单元一起勾 / 取消。
3800
+ *
3801
+ * 逐个走 toggleUnit:分区未勾时「勾一个单元 = 只勾这一个」的既有语义因此自动生效,
3802
+ * 不会因为一键操作就把整个 pluginData / pluginAssets 分区静默全选。
3803
+ */
3804
+ function togglePluginEntry(sel, nodes, entry, checked) {
3805
+ let out = sel;
3806
+ for (const leaf of pluginEntryLeaves(entry)) out = toggleUnit(out, nodes, leaf.unitId, checked);
3807
+ return out;
3808
+ }
3809
+ /** 树上所有**真实可勾选**的叶子(各插件名下存在单元的合计;不含未归属 / 遗留数据桶)。 */
3810
+ function pluginTreeLeaves(tree) {
3811
+ return tree.entries.flatMap((e) => pluginEntryLeaves(e));
3812
+ }
3813
+ /** 树上**已知**的叶子(存在 + 未读取;不含 absent)—— 一级区块的计数与三态用它,口径同插件节点。 */
3814
+ function pluginTreeKnownLeaves(tree) {
3815
+ return tree.entries.flatMap((e) => pluginEntryKnownLeaves(e));
3816
+ }
3817
+ function pluginTreeTotalCount(tree) {
3818
+ return pluginTreeKnownLeaves(tree).length;
3819
+ }
3820
+ function pluginTreeSelectedCount(sel, tree) {
3821
+ return pluginTreeLeaves(tree).reduce((n, l) => n + (unitChecked(sel, l.section, l.unitId) ? 1 : 0), 0);
3822
+ }
3823
+ /**
3824
+ * 「插件」一级区块(把全部插件收在一个可折叠区块里)的三态。
3825
+ *
3826
+ * 只算**插件名下真实存在的叶子**:未归属 / 遗留数据是「无法归属的东西」,不参与这个勾选框 ——
3827
+ * 否则「全选所有插件」会顺手把没人认领的散落配置一起带上。
3828
+ */
3829
+ function pluginTreePickState(sel, tree) {
3830
+ const known = pluginTreeKnownLeaves(tree);
3831
+ if (known.length === 0) return "none";
3832
+ const picked = pluginTreeSelectedCount(sel, tree);
3833
+ if (picked === 0) return "none";
3834
+ return picked === known.length ? "all" : "partial";
3835
+ }
3836
+ /** 一级区块勾选:把所有插件名下存在的单元一起勾 / 取消(逐个走 toggleUnit;含未归属桶吗?不含)。 */
3837
+ function togglePluginTree(sel, nodes, tree, checked) {
3838
+ let out = sel;
3839
+ for (const leaf of pluginTreeLeaves(tree)) out = toggleUnit(out, nodes, leaf.unitId, checked);
3840
+ return out;
3841
+ }
3842
+ /**
3843
+ * 展开「插件」一级区块前还需要读取哪些分区的清单(惰性)。
3844
+ *
3845
+ * **插件清单自己没读到也要报**(否则一级区块展开后只有一句「先读取插件分区」却没有入口)。
3846
+ */
3847
+ function pluginTreeUnreadSections(tree) {
3848
+ const out = tree.pluginsLoaded ? [] : ["plugins"];
3849
+ for (const entry of tree.entries) for (const s of pluginEntryUnreadSections(entry)) if (!out.includes(s)) out.push(s);
3850
+ for (const bucket of tree.buckets) if (!bucket.loaded && !out.includes(bucket.section)) out.push(bucket.section);
3851
+ return out;
3852
+ }
3853
+ /**
3854
+ * 待补勾的出队判定(纯函数,node 可测)。
3855
+ *
3856
+ * 背景:清单是**惰性**读取的 —— 用户勾「插件」一级区块或某个插件时,它名下可能还有区域没读到
3857
+ * (unread),那些单元此刻勾不上。若就此结束,用户会以为「全带上了」,实际包里少了数据目录/大文件。
3858
+ * 调用方在点击时先勾已知的、把没到齐的键入队;清单到货(nodes 变化)后再调本函数补齐。
3859
+ *
3860
+ * 判据 = 该节点名下**已无 unread 叶子**(`pluginEntryUnreadSections` / `pluginsLoaded`):
3861
+ * 到齐 → 出队并补齐;没到齐 → 留在队列里继续等(绝不猜成「已勾」)。
3862
+ */
3863
+ function applyPluginPendingChecks(sel, nodes, tree, pending) {
3864
+ const remaining = [];
3865
+ let out = sel;
3866
+ for (const p of pending) {
3867
+ if (p.kind === "root") {
3868
+ if (!tree.pluginsLoaded || tree.entries.some((e) => pluginEntryUnreadSections(e).length > 0)) {
3869
+ remaining.push(p);
3870
+ continue;
3871
+ }
3872
+ out = togglePluginTree(out, nodes, tree, true);
3873
+ continue;
3874
+ }
3875
+ const entry = tree.entries.find((e) => e.name === p.key);
3876
+ if (entry === void 0) continue;
3877
+ if (pluginEntryUnreadSections(entry).length > 0) {
3878
+ remaining.push(p);
3879
+ continue;
3880
+ }
3881
+ out = togglePluginEntry(out, nodes, entry, true);
3882
+ }
3883
+ return {
3884
+ selection: out,
3885
+ remaining
3886
+ };
3887
+ }
3888
+ /** 勾上该插件前还需要读取哪些分区的清单(展开/点击时触发惰性读取)。 */
3889
+ function pluginEntryUnreadSections(entry) {
3890
+ const out = [];
3891
+ for (const leaf of entry.leaves) if (leaf.state === "unread" && !out.includes(leaf.section)) out.push(leaf.section);
3892
+ return out;
3893
+ }
3644
3894
  //#endregion
3645
3895
  //#region src/ui/session-format-disposition.ts
3646
3896
  /**
@@ -6051,6 +6301,7 @@ function pushPreviewView(preview, t) {
6051
6301
  encryptedHint: "",
6052
6302
  credentialsHint: "",
6053
6303
  previewHint: "",
6304
+ hint: "",
6054
6305
  headline: "",
6055
6306
  error: preview.message ?? t("sync.pushFailed")
6056
6307
  };
@@ -6068,6 +6319,7 @@ function pushPreviewView(preview, t) {
6068
6319
  encryptedHint: preview.encrypted ? t("sync.pushPreviewEncrypted") : "",
6069
6320
  credentialsHint: preview.credentialsIncluded ? t("sync.pushPreviewCredentials") : "",
6070
6321
  previewHint: t("sync.pushPreviewHint"),
6322
+ hint: preview.message ?? "",
6071
6323
  headline: t("sync.pushPreviewHeadline", {
6072
6324
  total: String(preview.sections.length),
6073
6325
  changed: String(changedCount)
@@ -14443,7 +14695,7 @@ function getState(open) {
14443
14695
  __name(getState, "getState");
14444
14696
  //#endregion
14445
14697
  //#region \0config-manager-css:/home/runner/work/dsh-config-manager/dsh-config-manager/src/client/config-manager.module.css.js
14446
- const css = "._367UGW_section{height:100%;min-height:0;font-family:var(--dsw-font-family);color:var(--dsw-alias-label-primary);flex-direction:column;font-size:12.5px;line-height:1.5;display:flex;position:relative;overflow:hidden}body{--cm-disk-card-h:420px;--cm-text-1:var(--dsw-alias-label-primary);--cm-text-2:var(--dsw-alias-label-secondary);--cm-text-3:var(--dsw-alias-label-tertiary);--cm-text-on-accent:var(--dsw-alias-label-primary-foreground);--cm-surface-1:var(--dsw-alias-bg-layer-1);--cm-surface-2:var(--dsw-alias-bg-layer-2);--cm-surface-hover:var(--dsw-alias-interactive-bg-hover);--cm-line-1:var(--dsw-alias-border-l1);--cm-line-2:var(--dsw-alias-border-l2);--cm-input-bg:var(--dsw-specific-input-major);--cm-accent:var(--dsw-alias-state-business-primary);--cm-accent-fill:var(--dsw-alias-button-info-fill);--cm-accent-hover:var(--dsw-alias-button-info-hover);--cm-ok:var(--dsw-alias-state-success-primary);--cm-info:var(--dsw-alias-state-info-primary);--cm-warn:var(--dsw-alias-state-warn-primary);--cm-error:var(--dsw-alias-state-error-primary);--cm-fs-meta:11px;--cm-fs-table:12px;--cm-fs-base:12.5px;--cm-fs-title:13px;--cm-sp-1:2px;--cm-sp-2:4px;--cm-sp-3:6px;--cm-sp-4:8px;--cm-sp-5:10px;--cm-sp-6:12px;--cm-sp-7:14px;--cm-sp-8:16px;--cm-sp-9:24px;--cm-r-1:4px;--cm-r-2:6px;--cm-r-3:8px;--cm-r-pill:999px;--cm-h-sm:24px;--cm-h-md:28px;--cm-h-lg:32px;--cm-shadow-1:0 10px 26px color-mix(in srgb, var(--dsw-alias-bg-base) 45%, transparent);--cm-shadow-2:0 12px 32px color-mix(in srgb, var(--dsw-alias-bg-base) 40%, transparent);--cm-ring:0 0 0 2px color-mix(in srgb, var(--cm-accent) 18%, transparent);--cm-ring-strong:0 0 0 2px color-mix(in srgb, var(--cm-accent) 55%, transparent);--cm-z-raise:1;--cm-z-sticky:2;--cm-z-task:90;--cm-z-mask:100;--cm-z-modal:101;--cm-z-pop:110;--cm-z-toast:120;--cm-motion-fast:.12s;--cm-motion-base:.18s;--cm-motion-slow:.3s;--cm-motion-ease-out:cubic-bezier(.16, 1, .3, 1);--cm-motion-ease-in-out:cubic-bezier(.4, 0, .6, 1)}._367UGW_section :is(button,a,input,select,textarea,[role=tab]){transition-property:background-color,border-color,color;transition-duration:var(--cm-motion-fast);transition-timing-function:ease}._367UGW_section :is(button,a,input,select,textarea,[role=tab]):focus-visible{outline:2px solid var(--cm-accent);outline-offset:2px}._367UGW_mono{font-variant-numeric:tabular-nums;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}._367UGW_section svg{color:inherit;flex:none}._367UGW_shellNav{flex:none;align-items:center;gap:8px;padding:8px;display:flex}._367UGW_navStrip{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;flex:auto;align-items:center;gap:2px;min-width:0;padding:2px;display:flex;overflow:hidden}._367UGW_navTab,._367UGW_navMore{height:24px;font:inherit;color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:6px;flex:none;align-items:center;gap:4px;padding:0 10px;font-size:12px;font-weight:500;display:inline-flex;position:relative}._367UGW_navTab:hover,._367UGW_navMore:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._367UGW_navTab:focus-visible,._367UGW_navMore:focus-visible{outline:2px solid var(--cm-accent);outline-offset:1px;border-radius:6px}._367UGW_navTab[data-active],._367UGW_navMore[data-active]{background:color-mix(in srgb, var(--cm-accent) 16%, transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--cm-accent) 45%, transparent);color:var(--dsw-alias-label-primary);font-weight:600}._367UGW_navDot{background:var(--cm-error);border-radius:50%;flex:none;width:6px;height:6px}._367UGW_navMoreRoot{flex:none}._367UGW_navMeasure{visibility:hidden;pointer-events:none;align-items:center;gap:2px;padding:2px;display:flex;position:absolute;top:0;left:-9999px}._367UGW_navActions{flex:none;align-items:center;gap:4px;margin-left:4px;display:flex}._367UGW_navActions ._367UGW_ghostButton[data-active]{border-color:color-mix(in srgb, var(--cm-accent) 55%, transparent);color:var(--cm-accent)}._367UGW_iconBtn{width:26px;height:26px;font:inherit;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-self:center;align-items:center;padding:0;font-size:13px;line-height:1.25;display:inline-flex}._367UGW_iconBtn:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._367UGW_iconBtn:focus-visible{outline:2px solid var(--cm-accent);outline-offset:1px}._367UGW_iconBtn:disabled{opacity:.45;cursor:default}._367UGW_iconBtn[data-size=sm]{border-radius:4px;width:18px;height:18px}._367UGW_iconBtn[data-active]{background:color-mix(in srgb, var(--cm-accent) 14%, transparent);color:var(--cm-accent)}._367UGW_iconBtn[data-danger]{color:var(--cm-error)}._367UGW_iconBtn[data-danger]:hover{background:color-mix(in srgb, var(--cm-error) 12%, transparent);border-color:var(--cm-error);color:var(--cm-error)}._367UGW_shellMain{overscroll-behavior:contain;flex-direction:column;flex:auto;min-height:0;display:flex;overflow-y:auto}._367UGW_pagePad{min-height:0;animation:_367UGW_pageEnter var(--cm-motion-base) var(--cm-motion-ease-out);flex-direction:column;flex:auto;padding:12px 16px 16px;display:flex}@keyframes _367UGW_pageEnter{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}._367UGW_snapshotList>*,._367UGW_dataTable tbody tr{animation:_367UGW_itemEnter var(--cm-motion-base) var(--cm-motion-ease-out) both}._367UGW_snapshotList>:nth-child(2),._367UGW_dataTable tbody tr:nth-child(2){animation-delay:24ms}._367UGW_snapshotList>:nth-child(3),._367UGW_dataTable tbody tr:nth-child(3){animation-delay:48ms}._367UGW_snapshotList>:nth-child(4),._367UGW_dataTable tbody tr:nth-child(4){animation-delay:72ms}._367UGW_snapshotList>:nth-child(n+5),._367UGW_dataTable tbody tr:nth-child(n+5){animation-delay:96ms}@keyframes _367UGW_itemEnter{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}._367UGW_viewEnter{animation:_367UGW_itemEnter var(--cm-motion-base) var(--cm-motion-ease-out);flex-direction:column;flex:auto;gap:10px;min-height:0;display:flex}._367UGW_collapse{visibility:hidden;transition:grid-template-rows var(--cm-motion-base) var(--cm-motion-ease-out), visibility 0s linear var(--cm-motion-base);grid-template-rows:0fr;display:grid}._367UGW_collapse[data-open]{visibility:visible;transition:grid-template-rows var(--cm-motion-base) var(--cm-motion-ease-out), visibility 0s;grid-template-rows:1fr}._367UGW_collapseInner{min-height:0;overflow:hidden}._367UGW_shellContent{flex-direction:column;flex:auto;min-height:0;display:flex;position:relative}._367UGW_taskPanel{z-index:var(--cm-z-task);background:var(--dsw-alias-bg-layer-1);min-height:0;animation:_367UGW_taskPanelIn var(--cm-motion-base) var(--cm-motion-ease-out);flex-direction:column;display:flex;position:absolute;inset:0}@keyframes _367UGW_taskPanelIn{0%{opacity:0;transform:translate(24px)}to{opacity:1;transform:translate(0)}}._367UGW_taskHead{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:8px;height:44px;padding:0 12px;display:flex}._367UGW_taskTitle{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;font-weight:700;overflow:hidden}._367UGW_taskBody{overscroll-behavior:contain;flex:auto;min-height:0;padding:12px 16px 16px;overflow-y:auto}@media (prefers-reduced-motion:reduce){._367UGW_taskPanel{animation:none}}._367UGW_statusBar{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);height:28px;color:var(--dsw-alias-label-tertiary);white-space:nowrap;border-radius:8px;flex:none;align-items:center;gap:10px;margin:0 8px 8px;padding:0 10px;font-size:11px;display:flex;overflow:hidden}._367UGW_bannerSlot{padding:8px 12px 0}._367UGW_syncChannelBody{margin-top:10px}._367UGW_syncChannelBody ._367UGW_collapseInner{flex-direction:column;gap:10px;display:flex}._367UGW_statusTask{color:var(--dsw-alias-label-secondary);font-weight:600}._367UGW_statusProgress{background:color-mix(in srgb, var(--cm-accent) 20%, transparent);border-radius:999px;flex:none;width:60px;height:4px;display:inline-block;position:relative;overflow:hidden}._367UGW_statusProgress:after{content:\"\";background:var(--cm-accent);width:40%;animation:_367UGW_statusIndeterminate 1.2s var(--cm-motion-ease-in-out) infinite;border-radius:999px;position:absolute;inset:0 auto 0 0}@keyframes _367UGW_statusIndeterminate{0%{transform:translate(-100%)}to{transform:translate(250%)}}._367UGW_statusDot{background:var(--dsw-alias-label-tertiary);width:7px;height:7px;transition:background-color var(--cm-motion-fast) ease;border-radius:50%;flex:none;display:inline-block}._367UGW_statusDot[data-kind=ok]{background:var(--cm-ok)}._367UGW_statusDot[data-kind=info]{background:var(--cm-accent)}._367UGW_statusDot[data-kind=warn]{background:var(--cm-warn)}._367UGW_statusDot[data-kind=error]{background:var(--cm-error)}._367UGW_statusDot[data-pulse]{animation:1.2s ease-in-out infinite _367UGW_statusPulse}@keyframes _367UGW_statusPulse{0%,to{opacity:1}50%{opacity:.35}}._367UGW_statusText{text-overflow:ellipsis;min-width:0;overflow:hidden}._367UGW_statusSpacer{flex:auto}._367UGW_statusMeta{color:var(--dsw-alias-label-tertiary);flex:none}._367UGW_primaryButton,._367UGW_ghostButton,._367UGW_dangerButton{height:28px;font:inherit;white-space:nowrap;cursor:pointer;user-select:none;border:1px solid #0000;border-radius:6px;justify-content:center;align-items:center;gap:6px;padding:0 12px;font-size:12.5px;font-weight:600;line-height:1.25;display:inline-flex}._367UGW_primaryButton{background:var(--cm-accent-fill);color:var(--cm-text-on-accent)}._367UGW_primaryButton:hover:not(:disabled){background:var(--cm-accent-hover)}._367UGW_ghostButton{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0}._367UGW_ghostButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}._367UGW_dangerButton{border-color:color-mix(in srgb, var(--cm-error) 45%, transparent);color:var(--cm-error);background:0 0}._367UGW_dangerButton:hover:not(:disabled){background:color-mix(in srgb, var(--cm-error) 12%, transparent);border-color:var(--cm-error)}._367UGW_primaryButton:focus-visible,._367UGW_ghostButton:focus-visible,._367UGW_dangerButton:focus-visible{outline:2px solid var(--cm-accent);outline-offset:1px}._367UGW_primaryButton:disabled,._367UGW_ghostButton:disabled,._367UGW_dangerButton:disabled{opacity:.45;cursor:default}._367UGW_primaryButton[data-size=sm],._367UGW_ghostButton[data-size=sm],._367UGW_dangerButton[data-size=sm]{border-radius:6px;height:24px;padding:0 8px;font-size:11px}._367UGW_input{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-specific-input-major);height:28px;font:inherit;color:var(--dsw-alias-label-primary);box-sizing:border-box;border-radius:6px;padding:0 8px;font-size:12.5px}._367UGW_field>._367UGW_input,._367UGW_field>._367UGW_selectRoot{width:100%;position:relative}._367UGW_input::placeholder{color:var(--dsw-alias-label-tertiary)}._367UGW_input:hover{border-color:color-mix(in srgb, var(--cm-accent) 40%, var(--dsw-alias-border-l2))}._367UGW_input:focus{border-color:var(--cm-accent);box-shadow:0 0 0 2px color-mix(in srgb, var(--cm-accent) 18%, transparent);outline:none}._367UGW_input:disabled{opacity:.5;cursor:default}._367UGW_input[type=password]{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px}._367UGW_selectRoot{vertical-align:middle;min-width:0;max-width:100%;font-size:12.5px;display:inline-block;position:relative}._367UGW_selectTrigger{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-specific-input-major);width:100%;height:28px;font:inherit;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;transition:border-color var(--cm-motion-fast) ease, box-shadow var(--cm-motion-fast) ease;border-radius:6px;align-items:center;gap:6px;padding:0 8px;font-size:12.5px;display:flex}._367UGW_selectTrigger:hover{border-color:color-mix(in srgb, var(--cm-accent) 40%, var(--dsw-alias-border-l2))}._367UGW_selectTrigger:focus-visible,._367UGW_selectRoot[data-open] ._367UGW_selectTrigger{border-color:var(--cm-accent);box-shadow:0 0 0 2px color-mix(in srgb, var(--cm-accent) 18%, transparent);outline:none}._367UGW_selectTrigger:disabled{opacity:.5;cursor:default}._367UGW_selectLabel{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}._367UGW_selectChevron{color:var(--dsw-alias-label-secondary);transition:transform var(--cm-motion-fast) var(--cm-motion-ease-out);flex:none}._367UGW_selectRoot[data-open] ._367UGW_selectChevron{transform:rotate(180deg)}._367UGW_selectMenu{z-index:var(--cm-z-pop);box-sizing:border-box;overscroll-behavior:contain;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);max-width:260px;max-height:220px;box-shadow:0 10px 26px color-mix(in srgb, var(--dsw-alias-bg-base) 45%, transparent);transform-origin:top;animation:_367UGW_selectMenuIn var(--cm-motion-fast) var(--cm-motion-ease-out);border-radius:8px;padding:4px;position:absolute;overflow-y:auto}._367UGW_selectRoot[data-align=end] ._367UGW_selectMenu{left:auto;right:0}._367UGW_selectMenuPortal{pointer-events:auto;visibility:hidden}._367UGW_selectMenuPortal[data-ready]{visibility:visible}@keyframes _367UGW_selectMenuIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}._367UGW_selectOption{color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;align-items:center;gap:8px;padding:6px 8px;font-size:12.5px;display:flex}._367UGW_selectOption[data-active]{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_selectOption[aria-selected=true],._367UGW_selectOption[aria-checked=true]{color:var(--cm-accent);background:color-mix(in srgb, var(--cm-accent) 10%, transparent);box-shadow:inset 2px 0 0 var(--cm-accent);font-weight:600}._367UGW_selectOption[data-disabled]{opacity:.45;cursor:default}._367UGW_selectOptionLabel{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}._367UGW_libraryFilters{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;flex:none;align-items:center;gap:2px;margin-top:8px;padding:2px;display:flex;overflow:hidden}._367UGW_libraryFilter{height:24px;font:inherit;color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:6px;flex:none;align-items:center;gap:4px;padding:0 8px;font-size:12px;display:inline-flex}._367UGW_libraryFilter:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_libraryFilter[data-active]{color:var(--cm-accent);background:color-mix(in srgb, var(--cm-accent) 16%, transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--cm-accent) 45%, transparent);font-weight:600}._367UGW_libraryFilterCount{color:var(--dsw-alias-label-tertiary);font-size:11px}._367UGW_libraryFilter[data-active] ._367UGW_libraryFilterCount{color:inherit}._367UGW_librarySearch{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-specific-input-major);width:100%;height:28px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:6px;flex:none;margin-top:8px;padding:0 8px;font-size:12.5px}._367UGW_librarySearch:focus-visible{border-color:var(--cm-accent);box-shadow:0 0 0 2px color-mix(in srgb, var(--cm-accent) 18%, transparent);outline:none}._367UGW_libraryFooter{border-top:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:8px;margin-top:8px;padding-top:8px;display:flex}._367UGW_libraryCount{color:var(--dsw-alias-label-secondary);font-size:12px}._367UGW_artifactList{overscroll-behavior:contain;flex:auto;min-height:0;margin:0;padding:0;list-style:none;overflow-y:auto}._367UGW_libraryListState{flex-direction:column;flex:auto;justify-content:center;min-height:0;display:flex}._367UGW_artifactRow{border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 60%, transparent)}._367UGW_artifactRow:last-child{border-bottom:none}._367UGW_artifactRow[data-expanded]{background:color-mix(in srgb, var(--cm-accent) 5%, transparent)}._367UGW_artifactRowHead{box-sizing:border-box;cursor:pointer;align-items:center;gap:8px;min-height:52px;padding:8px 10px;display:flex}._367UGW_artifactRowHead:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_artifactExpand{width:20px;height:20px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}._367UGW_artifactExpand:focus-visible{outline:2px solid var(--cm-accent);outline-offset:1px}._367UGW_artifactMain{flex:auto;min-width:0}._367UGW_artifactTitle{align-items:center;gap:6px;min-width:0;display:flex}._367UGW_artifactName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;overflow:hidden}._367UGW_artifactMeta{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;margin-top:2px;font-size:11px;overflow:hidden}._367UGW_artifactBadges,._367UGW_artifactActions{flex:none;align-items:center;gap:4px;display:flex}._367UGW_artifactDetailWrap{transition:grid-template-rows var(--cm-motion-base) var(--cm-motion-ease-out);grid-template-rows:0fr;display:grid}._367UGW_artifactRow[data-expanded] ._367UGW_artifactDetailWrap{grid-template-rows:1fr}._367UGW_artifactDetailInner{min-height:0;transition:padding var(--cm-motion-base) var(--cm-motion-ease-out);padding:0 10px 0 38px;overflow:hidden}._367UGW_artifactRow[data-expanded] ._367UGW_artifactDetailInner{padding:2px 10px 10px 38px}._367UGW_artifactDetailInner>*{opacity:0;transition:opacity var(--cm-motion-fast) var(--cm-motion-ease-out)}._367UGW_artifactRow[data-expanded] ._367UGW_artifactDetailInner>*{opacity:1;transition-delay:60ms}._367UGW_artifactRow:not([data-expanded]) ._367UGW_artifactDetailInner>*{transition-delay:0s}._367UGW_paletteInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-specific-input-major);width:100%;height:32px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:6px;padding:0 10px;font-size:13px}._367UGW_paletteInput:focus-visible{border-color:var(--cm-accent);box-shadow:0 0 0 2px color-mix(in srgb, var(--cm-accent) 18%, transparent);outline:none}._367UGW_paletteList{overscroll-behavior:contain;max-height:280px;margin-top:8px;overflow-y:auto}._367UGW_paletteGroup{letter-spacing:.02em;color:var(--dsw-alias-label-tertiary);user-select:none;padding:8px 8px 4px;font-size:11px;font-weight:500}._367UGW_paletteGroup:not([data-first]){border-top:1px solid var(--dsw-alias-border-l1);margin-top:4px}._367UGW_paletteItem{color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;align-items:center;gap:8px;padding:6px 8px;font-size:12.5px;display:flex}._367UGW_paletteItem[data-active]{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_paletteItem[data-disabled]{opacity:.45;cursor:default}._367UGW_paletteItemLabel{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}._367UGW_paletteItemGroup{color:var(--dsw-alias-label-tertiary);flex:none;font-size:11px}._367UGW_paletteEmpty{color:var(--dsw-alias-label-tertiary);padding:10px 8px;font-size:12.5px}._367UGW_paletteHint{border-top:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-tertiary);margin-top:8px;padding-top:6px;font-size:11px}._367UGW_checkboxRow,._367UGW_radioLabel{cursor:pointer;color:var(--dsw-alias-label-primary);align-items:flex-start;gap:6px;font-size:12.5px;display:flex}._367UGW_checkboxRow input,._367UGW_radioLabel input{width:14px;height:14px;accent-color:var(--cm-accent);cursor:pointer;flex:none;margin:2px 0 0}._367UGW_checkboxRow input:focus-visible,._367UGW_radioLabel input:focus-visible{outline:2px solid var(--cm-accent);outline-offset:2px}._367UGW_badge{white-space:nowrap;border:1px solid var(--dsw-alias-border-l2);height:18px;color:var(--dsw-alias-label-secondary);border-radius:8px;align-items:center;gap:4px;padding:0 6px;font-size:11px;font-weight:600;line-height:1.25;display:inline-flex}._367UGW_banner{animation:_367UGW_itemEnter var(--cm-motion-base) var(--cm-motion-ease-out);border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);box-sizing:border-box;border-radius:8px;flex-wrap:wrap;align-items:center;gap:6px 10px;width:100%;margin:0 0 10px;padding:8px 12px;font-size:12.5px;display:flex}._367UGW_banner[data-kind=ok]{border-color:color-mix(in srgb, var(--cm-ok) 35%, transparent);background:color-mix(in srgb, var(--cm-ok) 9%, transparent)}._367UGW_banner[data-kind=info]{border-color:color-mix(in srgb, var(--cm-accent) 30%, transparent);background:color-mix(in srgb, var(--cm-accent) 8%, transparent)}._367UGW_banner[data-kind=warn]{border-color:color-mix(in srgb, var(--cm-warn) 40%, transparent);background:color-mix(in srgb, var(--cm-warn) 9%, transparent)}._367UGW_banner[data-kind=error]{border-color:color-mix(in srgb, var(--cm-error) 45%, transparent);background:color-mix(in srgb, var(--cm-error) 9%, transparent)}._367UGW_spinnerWrap{vertical-align:middle;align-items:center;gap:6px;display:inline-flex}._367UGW_spinner{vertical-align:middle;transform-origin:50%;flex:none;width:13px;height:13px;animation:.7s linear infinite _367UGW_spin;display:inline-block}._367UGW_spinnerTrack{fill:none;stroke:color-mix(in srgb, currentColor 30%, transparent);stroke-width:3px}._367UGW_spinnerArc{fill:none;stroke:currentColor;stroke-width:3px;stroke-linecap:round}@keyframes _367UGW_spin{to{transform:rotate(360deg)}}._367UGW_spinnerLabel{color:inherit;opacity:.85;font-size:12px}._367UGW_skeletonRoot{flex-direction:column;gap:8px;width:100%;margin-top:8px;display:flex}._367UGW_skeletonBars,._367UGW_skeletonCards{flex-direction:column;gap:8px;display:flex}._367UGW_skeletonBar{background-color:color-mix(in srgb, var(--dsw-alias-label-tertiary) 14%, transparent);background-image:linear-gradient(90deg, transparent, color-mix(in srgb, var(--dsw-alias-label-tertiary) 26%, transparent), transparent);animation:_367UGW_skeletonShimmer 1.3s var(--cm-motion-ease-in-out) infinite;background-position:-160px 0;background-repeat:no-repeat;background-size:160px 100%;border-radius:4px;display:block}@keyframes _367UGW_skeletonShimmer{to{background-position:calc(100% + 160px) 0}}._367UGW_skeletonTitle{border-radius:6px;width:42%;height:13px}._367UGW_skeletonLine{height:11px}._367UGW_skeletonBlock{border-radius:8px;height:46px}._367UGW_skeletonRow{border-radius:6px;height:30px}._367UGW_skeletonBars>._367UGW_skeletonBar:nth-child(4n+2){width:92%}._367UGW_skeletonBars>._367UGW_skeletonBar:nth-child(4n+3){width:78%}._367UGW_skeletonBars>._367UGW_skeletonBar:nth-child(4n){width:64%}._367UGW_skeletonBars>._367UGW_skeletonBar:nth-child(2){animation-delay:60ms}._367UGW_skeletonBars>._367UGW_skeletonBar:nth-child(3){animation-delay:.12s}._367UGW_skeletonBars>._367UGW_skeletonBar:nth-child(4){animation-delay:.18s}._367UGW_skeletonBars>._367UGW_skeletonBar:nth-child(n+5){animation-delay:.24s}._367UGW_skeletonCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;flex-direction:column;gap:8px;padding:12px;display:flex}._367UGW_skeletonCard>._367UGW_skeletonBar:nth-child(2){width:84%}._367UGW_skeletonCard>._367UGW_skeletonBar:nth-child(3){width:56%}._367UGW_skeletonTable{border:1px solid var(--dsw-alias-border-l1);border-radius:8px;overflow:hidden}._367UGW_skeletonTableRow{border-bottom:1px solid var(--dsw-alias-border-l1);align-items:center;gap:10px;padding:8px 10px;display:flex}._367UGW_skeletonTableRow:last-child{border-bottom:none}._367UGW_skeletonTableCell{flex:1 1 0;height:11px}._367UGW_skeletonTableCell:first-child{flex:0 0 40%}._367UGW_skeletonTableCell:last-child{flex:0 0 20%}._367UGW_skeletonCaption{color:var(--dsw-alias-label-tertiary);font-size:11px}._367UGW_card{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;margin:0 0 10px;padding:12px}._367UGW_groupLabel{letter-spacing:.02em;color:var(--dsw-alias-label-tertiary);margin-bottom:8px;font-size:11px;font-weight:700;display:block}._367UGW_groupHeader{align-items:baseline;gap:8px;margin-bottom:10px;display:flex}._367UGW_groupHeader ._367UGW_groupLabel{white-space:nowrap;flex:none;margin-bottom:0}._367UGW_groupNote{color:var(--dsw-alias-label-tertiary);font-size:11px}._367UGW_groupItems{flex-direction:column;gap:6px;display:flex}._367UGW_sectionOptionRow{flex-direction:column;gap:4px;display:flex}._367UGW_field{flex-direction:column;gap:4px;margin:0 0 10px;display:flex}._367UGW_fieldLabel{color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:600}._367UGW_hint{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:1.5}._367UGW_formError{color:var(--cm-error);font-size:11px}._367UGW_infoHint{vertical-align:middle;align-items:center;display:inline-flex}._367UGW_infoHintBtn{width:18px;height:18px;font:inherit;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;line-height:1.25;display:inline-flex}._367UGW_infoHintBtn:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._367UGW_infoHintBtn[data-open]:focus-visible{outline:2px solid var(--cm-accent);outline-offset:1px}._367UGW_infoHintBtn[data-open]{color:var(--dsw-alias-label-primary)}._367UGW_infoHintBtn[data-pinned]{background:color-mix(in srgb, var(--cm-accent) 14%, transparent);color:var(--cm-accent)}._367UGW_infoHintBubble{z-index:var(--cm-z-pop);box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);max-width:min(260px,100vw - 24px);max-height:min(480px,100vh - 16px);box-shadow:0 10px 26px color-mix(in srgb, var(--dsw-alias-bg-base) 45%, transparent);color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;pointer-events:none;visibility:hidden;border-radius:8px;padding:8px 10px;font-size:11px;line-height:1.5;position:fixed;overflow-y:auto}._367UGW_infoHintBubble[data-ready]{visibility:visible;animation:_367UGW_infoHintIn var(--cm-motion-fast) var(--cm-motion-ease-out);transform-origin:top}._367UGW_infoHintBubble[data-ready][data-side=top]{transform-origin:bottom}@keyframes _367UGW_infoHintIn{0%{opacity:0}to{opacity:1}}._367UGW_controlRow{align-items:center;gap:8px;margin:0 0 10px;display:flex}._367UGW_sectionTitleBlock{min-width:0;margin:0 0 10px}._367UGW_sectionTitleRow{align-items:center;gap:8px;min-width:0;display:flex}._367UGW_sectionTitle{color:var(--dsw-alias-label-primary);margin:0;font-size:13px;font-weight:700;line-height:1.5}._367UGW_sectionSubtitle{color:var(--dsw-alias-label-tertiary);margin:1px 0 0;font-size:11px}._367UGW_empty{animation:_367UGW_itemEnter var(--cm-motion-base) var(--cm-motion-ease-out);border:1px dashed var(--dsw-alias-border-l2);text-align:center;color:var(--dsw-alias-label-tertiary);box-sizing:border-box;border-radius:8px;flex-direction:column;justify-content:center;align-items:center;gap:4px;width:100%;padding:24px 16px;font-size:12px;display:flex}._367UGW_emptySteps{margin:2px 0 10px}._367UGW_tableWrap{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;margin-bottom:10px;overflow:hidden}._367UGW_tableFixed th,._367UGW_tableFixed td{padding-left:12px;padding-right:12px}._367UGW_tableScroll{max-height:420px;overflow:auto}._367UGW_dataTable{border-collapse:collapse;width:100%;font-size:12px}._367UGW_dataTable th,._367UGW_dataTable td{box-sizing:border-box}._367UGW_tableFixed{table-layout:fixed}._367UGW_tableFixed td,._367UGW_tableFixed th{text-overflow:ellipsis;overflow:hidden}._367UGW_tableCompact th,._367UGW_tableCompact td{padding-left:8px;padding-right:8px}._367UGW_dataTable td._367UGW_dim{white-space:nowrap}._367UGW_dataTable th{z-index:var(--cm-z-raise);text-align:left;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);border-bottom:1px solid var(--dsw-alias-border-l1);white-space:nowrap;padding:6px 10px;font-size:11px;font-weight:600;position:sticky;top:0}._367UGW_dataTable td{border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 55%, transparent);vertical-align:middle;color:var(--dsw-alias-label-primary);padding:6px 10px}._367UGW_dataTable tbody tr:last-child td{border-bottom:none}._367UGW_dataTable tbody tr{transition:background-color .1s ease-out}._367UGW_dataTable tbody tr:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_dataTable tbody tr[data-selected]{background:color-mix(in srgb, var(--cm-accent) 9%, transparent)}._367UGW_dataTable ._367UGW_num{text-align:right;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px}._367UGW_dataTable ._367UGW_dim{color:var(--dsw-alias-label-secondary)}._367UGW_dataTable ._367UGW_cellActions{text-align:right;white-space:nowrap}._367UGW_dataTable td._367UGW_cellActions{text-overflow:clip;overflow:visible}._367UGW_rowActions{align-items:center;gap:2px;display:inline-flex}._367UGW_cellMain{flex-direction:column;justify-content:center;gap:1px;min-width:0;min-height:30px;display:flex}._367UGW_cellTitle{text-overflow:ellipsis;white-space:nowrap;font-weight:500;overflow:hidden}._367UGW_cellMeta{color:var(--dsw-alias-label-tertiary);align-items:center;gap:6px;min-width:0;font-size:11px;display:inline-flex;overflow:hidden}._367UGW_cellMetaNoteText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}._367UGW_actionRow ._367UGW_banner{flex:auto;min-width:0;margin:0}._367UGW_warnText{color:var(--cm-warn)}._367UGW_kvRow{border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 55%, transparent);align-items:baseline;gap:10px;min-width:0;padding:4px 0;font-size:12px;display:flex}._367UGW_kvRow:last-child{border-bottom:none}._367UGW_kvRow+._367UGW_actionRow{margin-top:8px}._367UGW_kvKey{width:88px;color:var(--dsw-alias-label-tertiary);flex:none;font-size:11px}._367UGW_kvValue{overflow-wrap:anywhere;flex:auto;min-width:0}._367UGW_kvValue._367UGW_mono{color:var(--dsw-alias-label-secondary);font-size:12px}._367UGW_segGroup,._367UGW_modeTabs{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);border-radius:8px;align-items:center;gap:2px;margin:0 0 10px;padding:2px;display:inline-flex}._367UGW_segItem,._367UGW_modeTab{height:22px;font:inherit;color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:6px;align-items:center;gap:4px;padding:0 8px;font-size:11px;font-weight:500;display:inline-flex}._367UGW_segItem:hover,._367UGW_modeTab:hover{color:var(--dsw-alias-label-primary)}._367UGW_segItem:focus-visible,._367UGW_modeTab:focus-visible{outline:2px solid var(--cm-accent);outline-offset:1px}._367UGW_segItem[data-active],._367UGW_modeTab[data-active]{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);box-shadow:0 0 0 1px var(--dsw-alias-border-l1);font-weight:600}._367UGW_modeHint{color:var(--dsw-alias-label-tertiary);margin:-4px 0 10px;font-size:11px}._367UGW_stepperDot,._367UGW_stepperLabel{transition:background-color var(--cm-motion-fast) ease, border-color var(--cm-motion-fast) ease, color var(--cm-motion-fast) ease}._367UGW_stepper{scrollbar-width:none;align-items:center;padding:2px 0;display:flex;overflow-x:auto}._367UGW_stepper::-webkit-scrollbar{display:none}._367UGW_stepperStep{flex:none;align-items:center;gap:4px;display:inline-flex}._367UGW_stepperDot{border:1.5px solid var(--dsw-alias-border-l2);width:17px;height:17px;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);border-radius:50%;flex:none;justify-content:center;align-items:center;font-size:11px;font-weight:700;display:inline-flex}._367UGW_stepperDot[data-state=current]{border-color:var(--cm-accent);background:var(--cm-accent);color:var(--dsw-alias-label-primary-foreground)}._367UGW_stepperDot[data-state=done]{background:color-mix(in srgb, var(--cm-ok) 16%, transparent);color:var(--cm-ok);border-color:#0000}._367UGW_stepperLabel{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:11px}._367UGW_stepperStep[data-state=current] ._367UGW_stepperLabel{color:var(--dsw-alias-label-primary);font-weight:600}._367UGW_stepperStep[data-state=done] ._367UGW_stepperLabel{color:var(--dsw-alias-label-secondary)}._367UGW_stepperConnector{background:var(--dsw-alias-border-l2);flex:none;width:14px;height:1.5px;margin:0 4px}._367UGW_stepperStep[data-state=done] ._367UGW_stepperConnector{background:color-mix(in srgb, var(--cm-ok) 45%, transparent)}._367UGW_progressBlock{margin:0 0 10px}._367UGW_progressTrack{background:color-mix(in srgb, var(--dsw-alias-border-l1) 80%, transparent);border-radius:4px;height:5px;position:relative;overflow:hidden}._367UGW_progressBar{background:var(--cm-accent);transition:width var(--cm-motion-slow) var(--cm-motion-ease-out);border-radius:4px;position:absolute;inset:0 auto 0 0}._367UGW_progressBarDone{background:var(--cm-ok)}._367UGW_progressBarFailed{background:var(--cm-error)}._367UGW_progressIndeterminate{background:var(--cm-accent);width:34%;animation:_367UGW_indet 1.15s var(--cm-motion-ease-in-out) infinite;border-radius:4px;position:absolute;top:0;bottom:0}@keyframes _367UGW_indet{0%{left:-34%}to{left:100%}}._367UGW_progressMeta{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;margin-top:4px;font-size:11px;display:flex}._367UGW_progressLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}._367UGW_progressPercent{color:var(--dsw-alias-label-tertiary);flex:none;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}._367UGW_progressBadge{color:var(--dsw-alias-label-tertiary);flex:none;align-items:center;gap:4px;font-size:11px;display:inline-flex}._367UGW_progressBadgeCount{background:color-mix(in srgb, var(--cm-info) 14%, transparent);color:var(--dsw-alias-label-secondary);border-radius:8px;padding:0 4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}._367UGW_progressBadgeSection{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}._367UGW_progressDetail{color:var(--dsw-alias-label-tertiary);margin-top:2px;font-size:11px}._367UGW_planScroll,._367UGW_reportScroll,._367UGW_confirmScroll,._367UGW_pullScroll,._367UGW_diffScroll,._367UGW_historyScroll,._367UGW_consultScroll{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);border-radius:8px;max-height:380px;overflow:auto}._367UGW_consultScroll{padding:0 6px}._367UGW_logScroll{background:var(--dsw-alias-bg-base);max-height:220px;overflow:auto}._367UGW_dialogMask{z-index:var(--cm-z-mask);background:color-mix(in srgb, var(--dsw-alias-bg-base) 55%, transparent);animation:_367UGW_maskIn var(--cm-motion-fast) var(--cm-motion-ease-out);justify-content:center;align-items:center;display:flex;position:fixed;inset:0}@keyframes _367UGW_maskIn{0%{opacity:0}to{opacity:1}}._367UGW_dialogContentCenter{z-index:var(--cm-z-modal);animation:_367UGW_dialogIn var(--cm-motion-base) var(--cm-motion-ease-out);position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}@keyframes _367UGW_dialogIn{0%{opacity:0;transform:translate(-50%,-50%)translateY(4px)}to{opacity:1;transform:translate(-50%,-50%)translateY(0)}}._367UGW_dialogMask[data-state=closed]{animation:_367UGW_maskOut var(--cm-motion-fast) var(--cm-motion-ease-out)}._367UGW_dialogContentCenter[data-state=closed]{animation:_367UGW_dialogOut var(--cm-motion-fast) var(--cm-motion-ease-out)}@keyframes _367UGW_maskOut{to{opacity:0}}@keyframes _367UGW_dialogOut{to{opacity:0;transform:translate(-50%,-50%)scale(.98)}}._367UGW_dialogCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);width:min(640px,100vw - 48px,95%);max-width:calc(100vw - 48px);max-height:min(600px,100vh - 64px,92%);box-shadow:0 12px 32px color-mix(in srgb, var(--dsw-alias-bg-base) 40%, transparent);border-radius:8px;flex-direction:column;display:flex}._367UGW_dialogHeader{color:var(--dsw-alias-label-primary);padding:12px 16px 0;font-size:13px;font-weight:700}._367UGW_dialogHeaderRow{align-items:center;gap:8px;padding:12px 14px 0;display:flex}._367UGW_dialogHeaderRow ._367UGW_dialogHeader{padding:0}._367UGW_dialogClose{margin-left:auto}._367UGW_dialogBody{min-height:0;color:var(--dsw-alias-label-secondary);flex:auto;padding:8px 16px 12px;font-size:12.5px;overflow-y:auto}._367UGW_dialogBodyScroll{max-height:460px;overflow-y:auto}._367UGW_dialogWide{width:min(720px,100vw - 48px,96%);max-height:min(620px,100vh - 64px,92%)}._367UGW_dialogFooter{border-top:1px solid var(--dsw-alias-border-l1);justify-content:flex-end;gap:8px;margin:0;padding:10px 16px 14px}._367UGW_updateVersionRow{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:10px;display:flex}._367UGW_updateVersionArrow{color:var(--dsw-alias-label-tertiary)}._367UGW_updateVersionTarget{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600}._367UGW_updateNotesLoading{justify-content:center;padding:24px 0;display:flex}._367UGW_toastViewport{z-index:var(--cm-z-toast);pointer-events:none;flex-direction:column;align-items:flex-end;gap:8px;max-width:calc(100% - 20px);display:flex;position:absolute;bottom:42px;right:10px}._367UGW_toast{pointer-events:auto;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);width:fit-content;max-width:340px;box-shadow:0 8px 24px color-mix(in srgb, var(--dsw-alias-bg-base) 45%, transparent);color:var(--dsw-alias-label-primary);animation:_367UGW_toastIn var(--cm-motion-base) var(--cm-motion-ease-out);border-radius:8px;align-items:flex-start;gap:8px;padding:8px 10px;font-size:12px;line-height:1.5;display:flex}@keyframes _367UGW_toastIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}._367UGW_toast[data-kind=ok]{border-color:color-mix(in srgb, var(--cm-ok) 40%, transparent)}._367UGW_toast[data-kind=ok] ._367UGW_toastGlyph{color:var(--cm-ok)}._367UGW_toast[data-kind=info] ._367UGW_toastGlyph{color:var(--cm-accent)}._367UGW_toast[data-kind=warn]{border-color:color-mix(in srgb, var(--cm-warn) 40%, transparent)}._367UGW_toast[data-kind=warn] ._367UGW_toastGlyph{color:var(--cm-warn)}._367UGW_toast[data-kind=error]{border-color:color-mix(in srgb, var(--cm-error) 45%, transparent)}._367UGW_toast[data-kind=error] ._367UGW_toastGlyph{color:var(--cm-error)}._367UGW_toastGlyph{flex:none;margin-top:1px;display:inline-flex}._367UGW_toastText{word-break:break-word;min-width:0}._367UGW_toast>button{flex:none;width:18px;height:18px;margin-left:2px}._367UGW_statusAction{font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;min-width:0;padding:0;display:inline-flex}._367UGW_statusAction:hover{color:var(--dsw-alias-label-primary);text-decoration:underline}._367UGW_statusAction:focus-visible{outline:2px solid var(--cm-accent);outline-offset:1px;border-radius:4px}._367UGW_runsCenter{flex-direction:column;gap:10px;display:flex}._367UGW_runsSummary{flex-wrap:wrap;align-items:center;gap:8px;display:flex}._367UGW_runsSummaryTitle{color:var(--dsw-alias-label-primary);font-size:12px;font-weight:700}._367UGW_runsCardHead{flex-wrap:wrap;align-items:center;gap:6px;margin:0 0 8px;display:flex}._367UGW_runsCardTitle{color:var(--dsw-alias-label-primary);font-size:12.5px;font-weight:600}._367UGW_runsWarnNote{border:1px solid color-mix(in srgb, var(--cm-warn) 45%, transparent);background:color-mix(in srgb, var(--cm-warn) 10%, transparent);color:var(--dsw-alias-label-secondary);border-radius:6px;margin:8px 0 0;padding:6px 8px;font-size:11px}._367UGW_runsWarnNoteDetail{color:var(--dsw-alias-label-tertiary);margin:4px 0 0}._367UGW_runsCardTime{color:var(--dsw-alias-label-tertiary);white-space:nowrap;margin-left:auto;font-size:11px}._367UGW_runsCounts{color:var(--dsw-alias-label-tertiary);margin:8px 0 0;font-size:11px}._367UGW_runsLogTail{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);max-height:108px;color:var(--dsw-alias-label-secondary);border-radius:6px;margin:8px 0 0;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:1.5;overflow-y:auto}._367UGW_runsLogLine{white-space:pre-wrap;word-break:break-all}._367UGW_runsCardActions{flex-wrap:wrap;align-items:center;gap:8px;margin:10px 0 0;display:flex}._367UGW_runsOption{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);width:100%;font:inherit;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;border-radius:8px;flex-direction:column;gap:2px;margin:0 0 8px;padding:8px 10px;display:flex}._367UGW_runsOption:hover{border-color:var(--cm-accent)}._367UGW_runsOption:focus-visible{outline:2px solid var(--cm-accent);outline-offset:1px}._367UGW_runsOption[data-active]{border-color:var(--cm-accent);background:color-mix(in srgb, var(--cm-accent) 8%, transparent)}._367UGW_runsOptionTitle{align-items:center;gap:6px;font-size:12.5px;font-weight:600;display:flex}._367UGW_runsOptionDesc{color:var(--dsw-alias-label-tertiary);font-size:11px}._367UGW_runsOptionTag{background:color-mix(in srgb, var(--cm-accent) 14%, transparent);color:var(--cm-accent);border-radius:999px;padding:0 4px;font-size:11px;font-weight:600}._367UGW_actionRow{flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 10px;display:flex}._367UGW_actionRowTop{flex-wrap:wrap;align-items:center;gap:8px;margin:10px 0;display:flex}._367UGW_snapshotPickerHint{margin-top:4px;margin-bottom:10px}._367UGW_headRow{flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 10px;display:flex}._367UGW_headRow ._367UGW_groupLabel{margin-bottom:0}._367UGW_authorRow{flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}._367UGW_authorRow ._367UGW_groupLabel{margin-bottom:0}._367UGW_marketFilterGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-bottom:8px;display:grid}._367UGW_marketFilterSearch{grid-column:1/-1}._367UGW_marketFilterMeta{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:8px;display:flex}._367UGW_statStrip{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;flex-wrap:wrap;flex:none;align-items:stretch;gap:6px 0;min-height:32px;margin-bottom:10px;display:flex}._367UGW_statStrip>:last-child{padding-right:8px}._367UGW_statStrip[data-tone=error]{border-color:color-mix(in srgb, var(--cm-error) 45%, transparent);background:color-mix(in srgb, var(--cm-error) 7%, transparent)}._367UGW_statStrip[data-tone=warn]{border-color:color-mix(in srgb, var(--cm-warn) 40%, transparent);background:color-mix(in srgb, var(--cm-warn) 6%, transparent)}._367UGW_statHealth{color:var(--dsw-alias-label-primary);white-space:nowrap;flex:none;align-items:center;gap:6px;padding:4px 8px;font-size:12px;font-weight:600;display:flex}._367UGW_statHealthAction{font:inherit;cursor:pointer;text-align:left;background:0 0;border:none;font-size:12px;font-weight:600}._367UGW_statHealthAction:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_statHealthAction:focus-visible{outline:2px solid var(--cm-accent);outline-offset:-2px;border-radius:6px}._367UGW_statSeg{border:none;border-left:1px solid var(--dsw-alias-border-l1);font:inherit;color:var(--dsw-alias-label-secondary);white-space:nowrap;cursor:pointer;background:0 0;flex:none;align-items:center;gap:6px;padding:4px 8px;font-size:11px;display:flex}._367UGW_statSeg>span:first-child{color:var(--dsw-alias-label-tertiary)}._367UGW_statSeg:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._367UGW_statSeg:hover>span:first-child{color:var(--dsw-alias-label-secondary)}._367UGW_statSeg:focus-visible{outline:2px solid var(--cm-accent);outline-offset:-2px}._367UGW_statSeg b{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-weight:700}._367UGW_statSegDim{color:var(--dsw-alias-label-tertiary)}._367UGW_toolRow{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:10px;display:flex}._367UGW_infoValue{flex:auto;align-items:center;gap:8px;min-width:0;display:inline-flex}._367UGW_infoValue ._367UGW_mono{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}._367UGW_copyBtn{width:20px;height:20px;font:inherit;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;font-size:11px;line-height:1.25;display:inline-flex}._367UGW_copyBtn:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._367UGW_copyBtn:focus-visible{outline:2px solid var(--cm-accent);outline-offset:1px}._367UGW_activityRow ._367UGW_copyBtn{opacity:0}._367UGW_activityRow:hover ._367UGW_copyBtn,._367UGW_activityRow ._367UGW_copyBtn:focus-visible{opacity:1}._367UGW_activityCard{flex-direction:column;min-height:0;margin-bottom:0;display:flex}._367UGW_diskUsageCard{height:var(--cm-disk-card-h);min-height:var(--cm-disk-card-h);max-height:var(--cm-disk-card-h)}._367UGW_diskUsageScroll{flex:auto;min-height:0;max-height:none}._367UGW_activityHeader{align-items:center;gap:8px;margin-bottom:8px;display:flex}._367UGW_activityTitle{letter-spacing:.02em;color:var(--dsw-alias-label-tertiary);flex:auto;font-size:11px;font-weight:700}._367UGW_activityRows{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);border-radius:8px;flex:auto;min-height:0;overflow-y:auto}._367UGW_activityRow{border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 55%, transparent);grid-template-columns:72px minmax(0,1fr) auto;align-items:center;gap:10px;min-width:0;padding:4px 10px;font-size:12px;line-height:1.5;display:grid}._367UGW_activityRow:last-child{border-bottom:none}._367UGW_activityTime{color:var(--dsw-alias-label-tertiary);white-space:nowrap;justify-self:end;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:1.5}._367UGW_activityKind{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;font-size:11px;line-height:1.5}._367UGW_activitySummary{min-width:0;color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:1.5;display:inline-flex}._367UGW_activitySummaryText{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._367UGW_activityBadge{flex:none;justify-content:flex-end;align-items:center;line-height:1.5;display:inline-flex}._367UGW_activityResultOk{color:var(--dsw-alias-label-tertiary);white-space:nowrap;align-items:center;gap:4px;font-size:11px;line-height:1.5;display:inline-flex}._367UGW_factGrid{grid-template-columns:repeat(4,minmax(0,1fr));gap:6px 12px;display:grid}._367UGW_factCell{flex-direction:column;gap:2px;min-width:0;display:flex}._367UGW_factLabel{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:11px}._367UGW_factValue{color:var(--dsw-alias-label-primary);white-space:nowrap;text-overflow:ellipsis;font-size:12px;font-weight:600;overflow:hidden}._367UGW_sectionGrid{grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:0 24px;display:grid}._367UGW_sectionRow{border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 55%, transparent);grid-template-columns:minmax(0,1fr) auto 56px;align-items:center;gap:10px;min-width:0;padding:4px 0;font-size:12px;display:grid}._367UGW_sectionRow:nth-last-child(-n+2){border-bottom:none}._367UGW_sectionName{min-width:0;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;overflow:hidden}._367UGW_sectionCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;justify-self:end;font-size:11px}._367UGW_sectionSize{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap;justify-self:end;font-size:11px}._367UGW_activityEmpty{color:var(--dsw-alias-label-tertiary);text-align:center;padding:16px;font-size:11px}._367UGW_snapshotList{flex-direction:column;gap:10px;margin-bottom:12px;display:flex}._367UGW_snapshotRow{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;align-items:center;gap:10px;padding:12px 14px;display:flex}._367UGW_snapshotRow[data-selected]{border-color:var(--cm-accent);background:color-mix(in srgb, var(--cm-accent) 7%, transparent)}._367UGW_snapshotRowHeader{align-items:center;gap:8px;font-size:12px;display:flex}._367UGW_snapshotRowMain{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;font-weight:500;overflow:hidden}._367UGW_snapshotRowText{flex-direction:column;flex:auto;gap:4px;min-width:0;display:flex}._367UGW_snapshotRowName{word-break:break-all;font-size:12.5px;font-weight:500;line-height:1.5}._367UGW_snapshotRowMeta{min-width:0;color:var(--dsw-alias-label-secondary);align-items:center;gap:10px;font-size:12px;display:flex}._367UGW_snapshotRowBadges{flex:none;align-items:center;gap:6px;display:inline-flex}._367UGW_snapshotRowIssues{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}._367UGW_snapshotRowFacts{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums;flex:none}._367UGW_snapshotList._367UGW_reportScroll{background:var(--dsw-alias-bg-layer-2);margin-bottom:0;padding:10px 12px 10px 10px}._367UGW_reasonList{flex-direction:column;flex-basis:100%;gap:4px;min-width:0;display:flex}._367UGW_reasonLine{align-items:baseline;gap:6px;min-width:0;display:flex}._367UGW_reasonLine>span:first-child{overflow-wrap:anywhere;min-width:0}._367UGW_viewBody{flex-direction:column;flex:auto;min-width:0;min-height:0;display:flex}._367UGW_resultScroll{flex:auto;min-height:0;overflow-y:auto}._367UGW_resultFooter{border-top:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;margin:10px 0 0;padding-top:10px}._367UGW_fillCard{flex:auto;margin-bottom:0}._367UGW_fillViewport{flex-direction:column;flex:auto;min-height:0;margin-bottom:0;display:flex}._367UGW_fillViewport ._367UGW_tableScroll{flex:auto;max-height:none}._367UGW_compositionViewport{flex:auto;min-height:0;overflow:auto}._367UGW_sparseFill{flex-direction:column;flex:auto;justify-content:flex-start;align-items:flex-start;gap:10px;min-height:280px;display:flex}._367UGW_pickerRoot{flex-direction:column;gap:8px;min-width:0;display:flex;position:relative}._367UGW_pickerOverlay{z-index:var(--cm-z-sticky);animation:_367UGW_maskIn var(--cm-motion-fast) var(--cm-motion-ease-out);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 62%, transparent);backdrop-filter:blur(1px);border-radius:8px;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}._367UGW_pickerToolbar{align-items:center;gap:8px;min-width:0;display:flex}._367UGW_pickerToolbar ._367UGW_input{flex:auto;min-width:0}._367UGW_pickerList{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;max-height:320px;padding:4px 10px;overflow:auto}._367UGW_pickerModalBody{flex-direction:column;gap:8px;height:min(420px,62vh);min-height:0;display:flex}._367UGW_pickerModalBody ._367UGW_pickerRoot{flex:auto;min-height:0}._367UGW_pickerModalBody ._367UGW_pickerList{scrollbar-gutter:stable;flex:auto;min-height:0;max-height:none}._367UGW_pickerGroup+._367UGW_pickerGroup{border-top:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 55%, transparent)}._367UGW_pickerUnit{animation:_367UGW_itemEnter var(--cm-motion-base) var(--cm-motion-ease-out);align-items:center;min-width:0;padding:2px 0 2px 16px;display:flex}._367UGW_pickerUnitName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:280px;font-size:12px;overflow:hidden}._367UGW_pickerTreeRow{align-items:center;gap:4px;min-width:0;padding:4px 0;display:flex}._367UGW_pickerTreeRow>:last-child{flex:auto;min-width:0}._367UGW_pickerChevronSpacer{flex:none;width:18px;height:18px;display:inline-block}._367UGW_pickerSubgroup{padding-left:18px}._367UGW_pickerSubgroupName{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:11px;font-weight:600;overflow:hidden}._367UGW_pickerUnitNested{gap:4px;padding-left:18px}._367UGW_pickerMore{justify-content:center;padding:4px 0 2px 16px;display:flex}._367UGW_pickerUnitDetail{max-width:220px;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}._367UGW_pickerCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:11px}._367UGW_pickerFooter{border-top:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);padding-top:6px;font-size:11px}._367UGW_optionsRow{align-items:center;gap:16px;display:flex;& ._367UGW_noticeSlot{flex-direction:column;justify-content:center;min-height:40px;display:flex}& ._367UGW_noticeSlot ._367UGW_banner{margin:0}& ._367UGW_noticeLine{white-space:nowrap;text-overflow:ellipsis;display:block;overflow:hidden}margin-bottom:4px}._367UGW_groupList{flex-direction:column;gap:8px;margin-bottom:10px;display:flex}._367UGW_groupCard{margin:0}._367UGW_categoryItem{flex-wrap:wrap;align-items:baseline;gap:8px;min-width:0;display:flex}._367UGW_categoryName{color:var(--dsw-alias-label-primary);flex:none;font-weight:500}._367UGW_categoryDesc{color:var(--dsw-alias-label-tertiary);min-width:0;font-size:11px}._367UGW_optionsCard{margin:0 0 10px}._367UGW_secretFields ._367UGW_field{margin-bottom:0}._367UGW_groupHintRow{margin-bottom:10px}._367UGW_secretFields{background:0 0;border:none;border-radius:0;grid-template-columns:1fr 1fr;gap:0 10px;margin:6px 0 10px;padding:0;display:grid}._367UGW_warnList{color:var(--dsw-alias-label-secondary);margin:4px 0 0;padding-left:18px;font-size:11px}._367UGW_wizardStepperRow{align-items:center;gap:10px;margin-bottom:10px;display:flex}._367UGW_conflictDetail{margin-top:2px}._367UGW_conflictList{flex-direction:column;gap:8px;margin-bottom:10px;display:flex}._367UGW_conflictItem{border:1px solid color-mix(in srgb, var(--cm-warn) 35%, transparent);background:var(--dsw-alias-bg-layer-2);border-radius:8px;padding:10px 12px}._367UGW_conflictHead{align-items:center;gap:8px;margin-bottom:6px;font-size:12px;display:flex}._367UGW_conflictId{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-weight:600;overflow:hidden}._367UGW_conflictOptions{flex-wrap:wrap;gap:4px 14px;margin-top:6px;display:flex}._367UGW_conflictChoices{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-top:8px;display:grid}._367UGW_choiceCard{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-secondary);cursor:pointer;border-radius:8px;align-items:center;gap:6px;padding:8px 10px;font-size:12px;font-weight:500;transition:border-color .12s ease-out,background-color .12s ease-out;display:flex}._367UGW_choiceCard:hover{border-color:color-mix(in srgb, var(--cm-accent) 40%, var(--dsw-alias-border-l2))}._367UGW_choiceCard:focus-within{outline:2px solid var(--cm-accent);outline-offset:1px}._367UGW_choiceCard[data-selected]{border-color:var(--cm-accent);background:color-mix(in srgb, var(--cm-accent) 9%, transparent);color:var(--dsw-alias-label-primary)}._367UGW_choiceCard input{width:13px;height:13px;accent-color:var(--cm-accent);flex:none;margin:0}._367UGW_choiceTitle{min-width:0}._367UGW_conflictDetail{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;white-space:normal;border-radius:6px;padding:8px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}._367UGW_conflictPrefix{color:var(--dsw-alias-label-tertiary);margin-bottom:4px}._367UGW_conflictLine{align-items:baseline;gap:8px;padding:4px 0;display:flex}._367UGW_conflictLine+._367UGW_conflictLine{border-top:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 55%, transparent)}._367UGW_conflictLineLabel{min-width:56px;color:var(--dsw-alias-label-tertiary);flex:none;font-weight:600}._367UGW_conflictLineValue{overflow-wrap:anywhere;flex:auto;min-width:0}._367UGW_pathMappingList{flex-direction:column;gap:6px;margin-bottom:10px;display:flex}._367UGW_pathRow{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;flex-direction:column;align-items:stretch;gap:8px;padding:8px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;display:flex}._367UGW_pathOld,._367UGW_pathNew{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);overflow-wrap:anywhere;border-radius:6px;flex-direction:column;flex:auto;width:100%;min-width:0;padding:4px 8px;display:flex}._367UGW_pathValue{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;margin:2px 0 0}._367UGW_pathIssueKind{flex:none}._367UGW_secretsList{flex-direction:column;display:flex}._367UGW_snapshotPickerRow{flex-wrap:nowrap;align-items:flex-end;gap:8px;margin-top:10px;margin-bottom:10px;display:flex}._367UGW_snapshotPickerRow ._367UGW_field{margin-bottom:0}._367UGW_pickerAction{flex:none;align-items:center;display:inline-flex}._367UGW_logPanel{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);border-radius:8px;margin-bottom:10px;overflow:hidden}._367UGW_logHeader{border-bottom:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);align-items:center;gap:8px;padding:6px 10px;font-size:11px;font-weight:600;display:flex}._367UGW_logLine{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;padding:1px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:1.5}._367UGW_logCounts{color:var(--dsw-alias-label-tertiary);font-weight:500}._367UGW_logFilterButton{font:inherit;color:var(--cm-accent);cursor:pointer;background:0 0;border:none;padding:0 4px;font-size:11px}._367UGW_logFilterButton[data-active]{color:var(--dsw-alias-label-primary);font-weight:700}._367UGW_logEntry+._367UGW_logEntry{border-top:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 55%, transparent)}._367UGW_logLine[data-level=fail]{color:var(--cm-error)}._367UGW_logLine[data-level=warn]{color:var(--cm-warn)}._367UGW_logLine[data-level=ok]{color:var(--cm-ok)}._367UGW_logLine[data-level=skip]{color:var(--dsw-alias-label-tertiary)}._367UGW_logLine[data-level=running]{color:var(--dsw-alias-label-primary)}._367UGW_logDetail{color:var(--dsw-alias-label-tertiary);white-space:pre-wrap;overflow-wrap:anywhere;padding:0 10px 0 22px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:1.5}._367UGW_logDetail[data-kind=command]{color:var(--dsw-alias-label-secondary)}._367UGW_logEmpty{color:var(--dsw-alias-label-tertiary);text-align:center;padding:12px;font-size:11px}._367UGW_logJumpButton{font:inherit;color:var(--cm-accent);cursor:pointer;background:0 0;border:none;margin-left:auto;padding:0 4px;font-size:11px}._367UGW_reportView{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;margin-bottom:10px;overflow:hidden}._367UGW_reportList{flex-direction:column;display:flex}._367UGW_confirmItem{border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 50%, transparent);padding:8px 10px}._367UGW_confirmItem:last-child{border-bottom:none}._367UGW_confirmItemHead{flex-wrap:wrap;align-items:center;gap:8px;display:flex}._367UGW_confirmItemDesc{min-width:0;color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;flex:200px;font-size:12.5px}._367UGW_confirmItemHead+._367UGW_conflictItem{margin-top:8px}._367UGW_reportBlock{margin-bottom:10px}._367UGW_reportProblemRow{border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 50%, transparent);padding:6px 10px}._367UGW_reportProblemRow:last-child{border-bottom:none}._367UGW_reportProblemHead{align-items:center;gap:6px;display:flex}._367UGW_reportProblemText{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px}._367UGW_reportProblemReason{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;margin-top:2px;font-size:11px;line-height:1.5}._367UGW_reportSectionRow{align-items:center;gap:6px;padding:4px 0;display:flex}._367UGW_reportWarningRow{color:var(--cm-warn);overflow-wrap:anywhere;padding:2px 10px;font-size:11px;line-height:1.5}._367UGW_reportDetails{color:var(--dsw-alias-label-tertiary);margin-top:4px;font-size:11px}._367UGW_reportDetails>summary{cursor:pointer;color:var(--dsw-alias-label-secondary);padding:2px 0}._367UGW_reportDetails ._367UGW_reportScroll{margin-top:6px}._367UGW_reportView ._367UGW_reportScroll{background:0 0;border:none;border-radius:0}._367UGW_reportBody{flex-direction:column;gap:2px;padding:8px 12px;display:flex}._367UGW_reportHeadline{color:var(--dsw-alias-label-primary);margin-bottom:2px;font-size:12.5px;font-weight:600}._367UGW_reportText{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;padding:8px 12px;font-size:12px}._367UGW_reportFooter{border-top:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);align-items:center;gap:8px;padding:8px 12px;display:flex}._367UGW_errorBanner{border:1px solid color-mix(in srgb, var(--cm-error) 45%, transparent);background:color-mix(in srgb, var(--cm-error) 8%, transparent);border-radius:8px;align-items:flex-start;gap:8px;margin:0 0 10px;padding:8px 12px;font-size:12px;display:flex}._367UGW_errorTitle{color:var(--cm-error);font-weight:600}._367UGW_errorLine{white-space:pre-wrap;overflow-wrap:anywhere;color:var(--dsw-alias-label-secondary);margin:0}._367UGW_errorList{margin:4px 0 0;padding-left:18px;font-size:11px}._367UGW_errorItem{overflow-wrap:anywhere}._367UGW_errorReason{white-space:pre-wrap;overflow-wrap:anywhere;min-width:0;color:var(--dsw-alias-label-tertiary);margin:0}._367UGW_errorFooter{margin-top:6px}._367UGW_errorAction{margin-right:8px}._367UGW_errorActionLabel{color:var(--cm-accent)}._367UGW_inspectGroup{margin-bottom:10px}._367UGW_kindTag{background:var(--dsw-alias-interactive-bg-hover);height:16px;color:var(--dsw-alias-label-secondary);white-space:nowrap;border-radius:4px;align-items:center;padding:0 6px;font-size:11px;font-weight:600;display:inline-flex}._367UGW_kindTagOk{background:color-mix(in srgb, var(--cm-ok) 13%, transparent);color:var(--cm-ok)}._367UGW_kindTagInfo{background:color-mix(in srgb, var(--cm-accent) 13%, transparent);color:var(--cm-accent)}._367UGW_kindTagWarn{background:color-mix(in srgb, var(--cm-warn) 13%, transparent);color:var(--cm-warn)}._367UGW_kindTagError{background:color-mix(in srgb, var(--cm-error) 13%, transparent);color:var(--cm-error)}._367UGW_restorePlan{animation:_367UGW_itemEnter var(--cm-motion-base) var(--cm-motion-ease-out);flex-direction:column;gap:10px;display:flex}._367UGW_restorePlanList{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}._367UGW_restorePlanRow,._367UGW_restorePlanRowStatic{border-radius:6px;align-items:center;gap:8px;width:100%;padding:4px 6px;display:flex}._367UGW_restorePlanRow{color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:none}._367UGW_restorePlanRow:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_restorePlanRow:focus-visible{box-shadow:0 0 0 2px color-mix(in srgb, var(--cm-accent) 55%, transparent);outline:none}._367UGW_restorePlanPath{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;overflow:hidden}._367UGW_restorePlanStat{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;flex:none;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}._367UGW_restorePlanChevron{color:var(--dsw-alias-label-tertiary);flex:none}._367UGW_restorePlanNote{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;padding:0 6px 4px 24px;font-size:11px}._367UGW_restorePlanGroupHead{align-items:center;gap:8px;margin:0 0 4px;display:flex}._367UGW_restorePlanGroupHead ._367UGW_groupLabel{margin-bottom:0;display:inline}._367UGW_diffGroupToggle{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;padding:0;font-size:11px;font-weight:700}._367UGW_diffGroupToggle:hover{color:var(--dsw-alias-label-primary)}._367UGW_diffGroupToggle:focus-visible{box-shadow:0 0 0 2px color-mix(in srgb, var(--cm-accent) 55%, transparent);border-radius:4px;outline:none}._367UGW_diffStatTotal{font-variant-numeric:tabular-nums;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}._367UGW_diffStatAdd{color:var(--cm-ok)}._367UGW_diffStatDel{color:var(--cm-error)}._367UGW_rollbackTabIcon{flex:none;align-items:center;margin-right:6px;display:inline-flex}._367UGW_diffFileHead{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:8px;padding:2px 6px;font-size:12px;line-height:1.5;display:flex}._367UGW_diffFilePath{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-secondary);flex:auto;overflow:hidden}._367UGW_diffFileStat{font-variant-numeric:tabular-nums;flex:none}._367UGW_diffPane{margin:2px 0 8px}._367UGW_diffPaneFill{flex-direction:column;height:100%;min-height:0;margin:0;display:flex}._367UGW_diffPaneFill ._367UGW_diffScroll{flex:auto;min-height:0;max-height:calc(100vh - 90px)}._367UGW_diffPane ._367UGW_diffScroll{max-height:min(80vh,800px)}._367UGW_dialogCard ._367UGW_diffPane ._367UGW_diffScroll{max-height:380px}._367UGW_diffTable{border-collapse:collapse;table-layout:fixed;width:100%;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.5}._367UGW_diffNoColW3{width:calc(3ch + 18px)}._367UGW_diffNoColW4{width:calc(4ch + 18px)}._367UGW_diffNoColW5{width:calc(5ch + 18px)}._367UGW_diffNoColW6{width:calc(6ch + 18px)}._367UGW_diffNoHead{border-bottom:1px solid var(--dsw-alias-border-l1);border-right:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-tertiary);text-align:left;padding:2px 6px;font-size:11px;font-weight:600;line-height:1.5}._367UGW_diffNoHead+._367UGW_diffNoHead{border-left:1px solid var(--dsw-alias-border-l1)}._367UGW_diffHunkRow td{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-tertiary);padding:2px 6px}._367UGW_diffTable tbody td:nth-child(3),._367UGW_diffHunkRow td+td{border-left:1px solid var(--dsw-alias-border-l1)}._367UGW_diffNo{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;text-align:right;vertical-align:top;user-select:none;padding:1px 4px}._367UGW_diffNoDel{background:color-mix(in srgb, var(--cm-error) 12%, transparent);color:var(--cm-error);box-shadow:inset 3px 0 0 var(--cm-error)}._367UGW_diffNoAdd{background:color-mix(in srgb, var(--cm-ok) 12%, transparent);color:var(--cm-ok);box-shadow:inset 3px 0 0 var(--cm-ok)}._367UGW_diffCell{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;vertical-align:top;padding:1px 6px}._367UGW_diffCellAdd{background:color-mix(in srgb, var(--cm-ok) 12%, transparent)}._367UGW_diffCellDel{background:color-mix(in srgb, var(--cm-error) 12%, transparent)}._367UGW_nextStepsGroup{margin-bottom:10px}._367UGW_nextStepsList{max-height:132px;overflow-y:auto}._367UGW_rollbackBox{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);border-radius:8px;margin-bottom:10px;padding:8px 10px}._367UGW_statRow{flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}._367UGW_statRow:not(:last-child){margin-bottom:10px}._367UGW_consultSection{margin-top:10px}._367UGW_consultSection:first-of-type{margin-top:8px}._367UGW_consultSection ._367UGW_statRow{margin-top:0}._367UGW_hiddenFile{display:none}._367UGW_cliName,._367UGW_cliCommand{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}._367UGW_cliCommand{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}._367UGW_historyGroup{margin-bottom:12px}._367UGW_historyRow{border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 55%, transparent);align-items:flex-start;gap:8px;padding:6px 8px;font-size:12px;display:flex}._367UGW_historyRow:last-child{border-bottom:none}._367UGW_historyRowMain{flex:auto;min-width:0}._367UGW_historyMeta{flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:2px;display:flex}._367UGW_historySummary{overflow-wrap:anywhere;color:var(--dsw-alias-label-secondary);display:block}._367UGW_historyTime{color:var(--dsw-alias-label-tertiary);flex:none;padding-top:1px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}._367UGW_historySections{color:var(--dsw-alias-label-tertiary);font-size:11px}._367UGW_profileRow{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;margin-bottom:6px;padding:8px 12px}._367UGW_profileRow[data-selected]{border-color:var(--cm-accent);background:color-mix(in srgb, var(--cm-accent) 7%, transparent)}._367UGW_profileRowHeader{align-items:center;gap:8px;font-size:12px;display:flex}._367UGW_profileRowMain{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;font-weight:500;overflow:hidden}button._367UGW_profileRowMain{font:inherit;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:none;flex-direction:column;align-items:flex-start;gap:2px;padding:0;display:flex}._367UGW_profileRowTitle{align-items:center;gap:6px;min-width:0;max-width:100%;display:flex}._367UGW_profileRowName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._367UGW_profileRowMeta{max-width:100%;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:400;display:block;overflow:hidden}._367UGW_detailLines{flex-direction:column;gap:2px;min-width:0;font-size:11px;display:flex}button._367UGW_profileRowMain:hover{color:var(--cm-accent)}._367UGW_listHeaderRow{align-items:center;gap:8px;margin:0 0 8px;display:flex}._367UGW_listHeaderRow ._367UGW_groupLabel{margin-bottom:0}._367UGW_listHeaderRow ._367UGW_cellMeta{flex:auto;min-width:0}._367UGW_badgeRow{flex:none;align-items:center;gap:4px;display:inline-flex}._367UGW_actionRow[data-inline]{flex:none;margin:0}._367UGW_aboutLinkRow{flex-wrap:wrap;align-items:center;gap:8px;display:flex}._367UGW_aboutAuthor{color:var(--cm-accent);overflow-wrap:anywhere;font-size:12.5px;font-weight:600;text-decoration:none}._367UGW_aboutAuthor:hover{text-decoration:underline}._367UGW_aboutAuthor:focus-visible{outline:2px solid var(--cm-accent);outline-offset:1px;border-radius:4px}._367UGW_consultDimension{border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 55%, transparent);padding:6px 0;font-size:12px}._367UGW_consultDimension:last-child{border-bottom:none}._367UGW_severityError{color:var(--cm-error);font-weight:600}._367UGW_viewBody{gap:10px}._367UGW_viewBody>*{margin-bottom:0}._367UGW_viewBody>._367UGW_statRow{margin-top:0;margin-bottom:0}._367UGW_viewBody:after{content:\"\";flex:none;height:8px}@media (width<=900px){._367UGW_secretFields{grid-template-columns:1fr}._367UGW_pagePad{padding:10px 12px 12px}}._367UGW_marketReviewPage{flex-direction:column;flex:1 0 auto;gap:10px;min-height:200px;display:flex}._367UGW_marketReviewPage ._367UGW_pickerRoot{flex:auto}._367UGW_marketReviewScroll,._367UGW_marketReviewPage ._367UGW_pickerList{scrollbar-gutter:stable;flex:auto;min-height:200px;max-height:800px;overflow:auto}._367UGW_marketReviewScroll{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);border-radius:8px;padding:6px 10px}@media (prefers-reduced-motion:reduce){._367UGW_toast,._367UGW_statusDot[data-pulse],._367UGW_pagePad,._367UGW_dialogMask,._367UGW_dialogContentCenter,._367UGW_snapshotList>*,._367UGW_dataTable tbody tr,._367UGW_viewEnter,._367UGW_pickerOverlay,._367UGW_pickerUnit,._367UGW_banner,._367UGW_empty{animation:none}._367UGW_statusDot,._367UGW_stepperDot,._367UGW_stepperLabel{transition:none}._367UGW_selectMenu,._367UGW_selectChevron{transition:none;animation:none}._367UGW_artifactDetailWrap,._367UGW_artifactDetailWrap>*{transition:none}._367UGW_dialogMask[data-state=closed],._367UGW_dialogContentCenter[data-state=closed],._367UGW_restorePlan,._367UGW_infoHintBubble{animation:none}._367UGW_collapse{transition:none}._367UGW_skeletonBar{background-image:none;animation:none}}._367UGW_sourceList{flex-direction:column;gap:6px;margin-bottom:10px;display:flex}._367UGW_sourceRow{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;align-items:flex-start;gap:8px;min-width:0;padding:8px 10px;display:flex}._367UGW_sourceRow[data-selected]{border-color:var(--cm-accent);background:color-mix(in srgb, var(--cm-accent) 7%, transparent)}._367UGW_sourceRow[data-disabled]{opacity:.7}._367UGW_sourceRowMain{flex:auto;min-width:0}._367UGW_sourceRowHead{align-items:center;gap:8px;min-width:0;display:flex}._367UGW_sourceRowName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12px;font-weight:600;overflow:hidden}._367UGW_sourceRowHead>:not(._367UGW_sourceRowName){flex:none}._367UGW_sourcePaths{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;margin-top:4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:1.5;display:block}._367UGW_skipList{color:var(--dsw-alias-label-secondary);flex-direction:column;gap:4px;margin:6px 0 0;padding:0;font-size:11px;display:flex}._367UGW_skipRow{flex-wrap:wrap;align-items:baseline;gap:6px;min-width:0;display:flex}._367UGW_skipCode{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 12%, transparent);color:var(--dsw-alias-label-secondary);white-space:nowrap;border-radius:4px;flex:none;padding:1px 4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}._367UGW_skipText{overflow-wrap:anywhere;flex:auto;min-width:0}._367UGW_skipMeta{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;font-size:11px}._367UGW_chatEntryScope{--cm-text-1:var(--dsw-alias-label-primary);--cm-text-3:var(--dsw-alias-label-tertiary);--cm-surface-2:var(--dsw-alias-bg-layer-2);--cm-line-1:var(--dsw-alias-border-l1);--cm-fs-meta:11px;--cm-fs-base:12.5px;--cm-sp-2:4px;--cm-sp-3:6px;--cm-sp-4:8px;--cm-sp-5:10px;--cm-sp-6:12px;--cm-sp-8:16px;--cm-r-2:6px;--cm-r-3:8px;min-width:0;color:var(--cm-text-1);font-size:var(--cm-fs-base);line-height:1.5;display:block}._367UGW_chatEntryRow{align-items:flex-end;gap:var(--cm-sp-3);flex-direction:column;display:flex}._367UGW_chatEntryStack{align-items:flex-end;gap:var(--cm-sp-4);flex-direction:column;min-width:0;max-width:min(620px,82%);display:flex}._367UGW_chatBubble{gap:var(--cm-sp-3);max-width:100%;padding:var(--cm-sp-5) var(--cm-sp-8);border-radius:var(--cm-r-3);background:var(--cm-surface-2);color:var(--cm-text-1);white-space:pre-wrap;word-break:break-word;flex-direction:column;display:flex}._367UGW_chatBubbleText{white-space:pre-wrap;word-break:break-word}._367UGW_chatFallbackBubble{border-left:2px solid var(--cm-text-1)}._367UGW_chatAttachmentRow{justify-content:flex-end;align-items:flex-end;gap:var(--cm-sp-2);flex-wrap:wrap;min-width:0;display:flex}._367UGW_chatFileCard{align-items:center;gap:var(--cm-sp-3);max-width:100%;padding:var(--cm-sp-2) var(--cm-sp-4);border:1px solid var(--cm-line-1);border-radius:var(--cm-r-2);background:var(--cm-surface-2);font-size:var(--cm-fs-meta);display:inline-flex}._367UGW_chatFileExt{padding:0 var(--cm-sp-2);border-radius:var(--cm-r-2);background:var(--cm-line-1);color:var(--cm-text-1);font-size:var(--cm-fs-meta);letter-spacing:.02em;flex:none}._367UGW_chatFileName{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}._367UGW_chatFileMeta{color:var(--cm-text-3);font-size:var(--cm-fs-meta);flex:none}._367UGW_chatRawBlock{font-size:var(--cm-fs-meta);color:var(--cm-text-3)}._367UGW_chatRawSummary{cursor:pointer}._367UGW_chatRawPre{max-height:220px;margin:var(--cm-sp-2) 0 0;padding:var(--cm-sp-3);border-radius:var(--cm-r-2);background:var(--cm-surface-2);color:var(--cm-text-3);white-space:pre-wrap;word-break:break-all;overflow:auto}._367UGW_chatEntryActions{align-items:center;gap:var(--cm-sp-2);display:flex}._367UGW_chatEntryTime{color:var(--cm-text-3);font-size:var(--cm-fs-meta)}._367UGW_chatEntryNotice{max-width:min(620px,82%);color:var(--cm-text-3);font-size:var(--cm-fs-meta)}._367UGW_chatEntryReference{color:var(--cm-text-3);font-size:var(--cm-fs-meta)}._367UGW_chatActionBtn{border-radius:var(--cm-r-2);width:24px;height:24px;color:var(--cm-text-3);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex}._367UGW_chatActionBtn:hover{background:var(--cm-line-1);color:var(--cm-text-1)}._367UGW_chatActionBtn:disabled{color:var(--cm-text-3);opacity:.5;cursor:not-allowed}._367UGW_rollbackFileList{margin-top:var(--cm-sp-2);flex-direction:column;display:flex}._367UGW_rollbackFileRow{align-items:center;gap:var(--cm-sp-3);padding:var(--cm-sp-3) 0 var(--cm-sp-3) var(--cm-sp-2);grid-template-columns:auto minmax(0,1fr) auto;display:grid;position:relative}._367UGW_rollbackFileRow:before{content:\"\";left:0;top:var(--cm-sp-2);bottom:var(--cm-sp-2);background:var(--cm-info);width:2px;position:absolute}._367UGW_rollbackFileRow[data-kind=create]:before{background:var(--cm-ok)}._367UGW_rollbackFileRow[data-kind=delete]:before{background:var(--cm-error)}._367UGW_rollbackFileRow:not([data-kind]):before{display:none}._367UGW_rollbackFileIcon{flex:none;align-items:center;display:inline-flex}._367UGW_rollbackFilePath{min-width:0;color:var(--cm-text-1);font-size:var(--cm-fs-table);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}._367UGW_rollbackFileDir{color:var(--cm-text-3);transition:color var(--cm-motion-fast) ease}._367UGW_rollbackFileStat{justify-content:flex-end;justify-self:end;align-items:baseline;gap:var(--cm-sp-2);display:inline-flex}._367UGW_rollbackAdded{color:var(--cm-ok);font-size:var(--cm-fs-table);font-variant-numeric:tabular-nums;flex:none}._367UGW_rollbackRemoved{color:var(--cm-error);font-size:var(--cm-fs-table);font-variant-numeric:tabular-nums;flex:none}._367UGW_rollbackDeleted{color:var(--cm-error);font-size:var(--cm-fs-table);flex:none}._367UGW_rollbackFilePath:is(button){font:inherit;font-size:var(--cm-fs-table);color:var(--cm-text-1);text-align:left;cursor:pointer;transition:color var(--cm-motion-fast) ease;background:0 0;border:0;padding:0}._367UGW_rollbackFilePath:is(button):hover:not(:disabled),._367UGW_rollbackFilePath:is(button):focus-visible,._367UGW_rollbackFilePath:is(button):hover:not(:disabled) ._367UGW_rollbackFileDir,._367UGW_rollbackFilePath:is(button):focus-visible ._367UGW_rollbackFileDir{color:var(--cm-accent)}._367UGW_rollbackFilePath:is(button):disabled{color:var(--cm-text-1);cursor:not-allowed;opacity:.7}._367UGW_previewChoiceRow{justify-content:space-between;align-items:baseline;gap:var(--cm-sp-4);margin:0 0 var(--cm-sp-2);display:flex}._367UGW_previewScope{align-items:baseline;gap:var(--cm-sp-3);font-size:var(--cm-fs-meta);color:var(--cm-text-2);font-variant-numeric:tabular-nums;flex:none;display:inline-flex}._367UGW_previewScopeStats{align-items:baseline;gap:var(--cm-sp-3);display:inline-flex}._367UGW_previewScope[data-off=true] ._367UGW_previewScopeStats{color:var(--cm-text-3);opacity:.75}._367UGW_previewScopeOff{color:var(--cm-text-3)}._367UGW_inlineDiffBox{gap:var(--cm-sp-2);margin-top:var(--cm-sp-2);padding:var(--cm-sp-2);border:1px solid var(--cm-line-1);border-radius:var(--cm-r-2);flex-direction:column;display:flex}._367UGW_rollbackWarnings{flex-direction:column;gap:4px;margin-bottom:10px;display:flex}._367UGW_rollbackToolbar{align-items:center;gap:8px;margin-bottom:8px;display:flex}._367UGW_rollbackSummary{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-size:12px;font-weight:600}._367UGW_rollbackScroll{padding:8px}._367UGW_rollbackGroup{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;flex-direction:column;flex:auto;gap:8px;min-height:0;padding:8px 10px;display:flex}._367UGW_rollbackGroupHead{border-bottom:1px solid var(--dsw-alias-border-l1);flex-wrap:wrap;align-items:center;gap:6px;padding-bottom:6px;display:flex}._367UGW_rollbackGroupTitle{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;font-size:12px;font-weight:600}._367UGW_rollbackGroupUnit{text-overflow:ellipsis;white-space:nowrap;text-align:right;min-width:0;color:var(--dsw-alias-label-tertiary);flex:auto;margin-left:auto;font-size:11px;overflow:hidden}._367UGW_rollbackPoints{flex-direction:column;gap:6px;display:flex}._367UGW_rollbackPoint{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);border-left-width:2px;border-radius:8px;flex-direction:column;gap:4px;padding:8px 10px;display:flex}._367UGW_rollbackPoint[data-kind=auto]{border-left-color:var(--cm-ok)}._367UGW_rollbackPoint[data-kind=guard]{border-left-color:var(--cm-info)}._367UGW_rollbackPoint[data-kind=unknown]{border-left-color:var(--cm-text-3)}._367UGW_rollbackPointTop{flex-wrap:wrap;align-items:center;gap:6px;display:flex}._367UGW_rollbackPointTurn{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:12px;font-weight:600}._367UGW_rollbackPointActions{flex:none;align-items:center;gap:6px;margin-left:auto;display:flex}._367UGW_rollbackPointMeta{color:var(--dsw-alias-label-tertiary);flex-wrap:wrap;align-items:center;gap:6px;font-size:11px;line-height:1.5;display:flex}._367UGW_rollbackMetaDot{color:var(--dsw-alias-label-tertiary);flex:none}._367UGW_rollbackLedger{align-items:stretch;gap:10px;height:340px;display:flex}._367UGW_rollbackSessions{flex-direction:column;flex:0 0 148px;gap:4px;height:100%;display:flex;overflow:auto}._367UGW_rollbackSessionItem{text-align:left;border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-2);background:var(--dsw-alias-bg-base);width:100%;color:var(--dsw-alias-label-secondary);cursor:pointer;flex-direction:column;gap:2px;padding:6px 8px;display:flex}._367UGW_rollbackSessionItem:hover{background:var(--dsw-alias-bg-layer-2)}._367UGW_rollbackSessionItem[data-active]{border-color:var(--cm-accent);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary)}._367UGW_rollbackSessionId{text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}._367UGW_rollbackSessionMeta{color:var(--dsw-alias-label-tertiary);align-items:center;gap:2px;font-size:11px;line-height:1.5;display:flex}._367UGW_rollbackLedgerMain{flex-direction:column;flex:auto;gap:8px;min-width:0;height:100%;display:flex}._367UGW_rollbackPointsScroll{flex:auto;min-height:0;padding:8px;overflow:auto}._367UGW_rollbackPointNote{text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:100%;overflow:hidden}._367UGW_shHeaderTrailing{align-items:center;gap:8px;margin-left:auto;display:inline-flex}._367UGW_shHeaderTrailing~._367UGW_dialogClose{margin-left:0}._367UGW_shSummary{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;flex-direction:column;gap:10px;margin:0 0 10px;padding:12px 14px;display:flex}._367UGW_shMetrics{flex-wrap:wrap;align-items:flex-end;gap:8px 24px;display:flex}._367UGW_shMetric{flex-direction:column;gap:2px;min-width:0;display:flex}._367UGW_shMetricValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:13px;font-weight:600;line-height:1.25}._367UGW_shMetricLabel{color:var(--dsw-alias-label-tertiary);font-size:11px}._367UGW_shMetric[data-tone=warn] ._367UGW_shMetricValue{color:var(--cm-warn)}._367UGW_shMetric[data-tone=ok] ._367UGW_shMetricValue{color:var(--cm-ok)}._367UGW_shSeverities{flex-wrap:wrap;align-items:center;gap:6px;display:flex}._367UGW_shSeverity{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-secondary);white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:2px 8px;font-size:11px;line-height:1.5;display:inline-flex}._367UGW_shSeverityCount{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-weight:600}._367UGW_shSeverity[data-severity=blocksStartup],._367UGW_shSeverity[data-severity=unloadable]{border-color:color-mix(in srgb, var(--cm-error) 45%, transparent)}._367UGW_shSeverity[data-severity=nextRequestFails],._367UGW_shSeverity[data-severity=invisible]{border-color:color-mix(in srgb, var(--cm-warn) 45%, transparent)}._367UGW_shNotes{border-top:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 60%, transparent);flex-direction:column;gap:4px;padding-top:8px;display:flex}._367UGW_shSectionHead{flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 10px;display:flex}._367UGW_shSectionHead ._367UGW_groupLabel{margin-bottom:0}._367UGW_shSectionTitle{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600;line-height:1.25}._367UGW_snapshotList._367UGW_shScroll{background:var(--dsw-alias-bg-base);padding:8px}._367UGW_shRow{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-left-width:2px;border-radius:8px;flex-direction:column;gap:4px;padding:8px 10px;display:flex}._367UGW_shRow[data-severity=blocksStartup],._367UGW_shRow[data-severity=unloadable]{border-left-color:var(--cm-error)}._367UGW_shRow[data-severity=nextRequestFails],._367UGW_shRow[data-severity=invisible]{border-left-color:var(--cm-warn)}._367UGW_shRow[data-severity=ok]{border-left-color:var(--cm-ok)}._367UGW_shRowTop{flex-wrap:wrap;align-items:center;gap:6px;display:flex}._367UGW_shRowId{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-primary);flex:auto;font-size:12px;font-weight:600;overflow:hidden}._367UGW_shRowActions{flex:none;align-items:center;gap:6px;margin-left:auto;display:flex}._367UGW_shRowMeta{color:var(--dsw-alias-label-tertiary);flex-wrap:wrap;align-items:center;gap:6px;font-size:11px;line-height:1.5;display:flex}._367UGW_shIssue{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 12%, transparent);color:var(--dsw-alias-label-secondary);border-radius:4px;align-items:center;padding:2px 6px;display:inline-flex}._367UGW_shRowFacts{white-space:nowrap;font-variant-numeric:tabular-nums;flex:none;margin-left:auto}._367UGW_shMetaDot{color:var(--dsw-alias-label-tertiary);flex:none}._367UGW_shLines{flex-direction:column;gap:4px;display:flex}._367UGW_shPanel{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);border-radius:8px;margin:0 0 10px;padding:10px 12px}._367UGW_shPanelHead{flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:6px;display:flex}._367UGW_shPanelTitle{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-primary);flex:auto;font-size:12px;font-weight:600;overflow:hidden}._367UGW_shCommands{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;margin:0 0 10px;padding:0;list-style:none;overflow:hidden}._367UGW_shCommand{border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 50%, transparent);align-items:center;gap:8px;padding:8px 10px;display:flex}._367UGW_shCommand:last-child{border-bottom:none}._367UGW_shCommand code{overflow-wrap:anywhere;min-width:0;color:var(--dsw-alias-label-secondary);flex:auto;font-size:11px}";
14698
+ const css = "._367UGW_section{height:100%;min-height:0;font-family:var(--dsw-font-family);font-size:var(--cm-fs-base);color:var(--dsw-alias-label-primary);flex-direction:column;line-height:1.5;display:flex;position:relative;overflow:hidden}body{--cm-disk-card-h:420px;--cm-text-1:var(--dsw-alias-label-primary);--cm-text-2:var(--dsw-alias-label-secondary);--cm-text-3:var(--dsw-alias-label-tertiary);--cm-text-on-accent:var(--dsw-alias-label-primary-foreground);--cm-surface-1:var(--dsw-alias-bg-layer-1);--cm-surface-2:var(--dsw-alias-bg-layer-2);--cm-surface-hover:var(--dsw-alias-interactive-bg-hover);--cm-line-1:var(--dsw-alias-border-l1);--cm-line-2:var(--dsw-alias-border-l2);--cm-input-bg:var(--dsw-specific-input-major);--cm-chat-bubble:var(--dsw-specific-bubble,color-mix(in srgb, var(--cm-text-1) 12%, transparent));--cm-accent:var(--dsw-alias-state-business-primary);--cm-accent-fill:var(--dsw-alias-button-info-fill);--cm-accent-hover:var(--dsw-alias-button-info-hover);--cm-ok:var(--dsw-alias-state-success-primary);--cm-info:var(--cm-accent);--cm-warn:var(--dsw-alias-state-warn-primary);--cm-error:var(--dsw-alias-state-error-primary);--cm-idle:var(--dsw-alias-state-idle-primary,var(--dsw-alias-label-tertiary));--cm-brand:var(--dsw-alias-brand-primary,var(--cm-accent));--cm-warn-label:var(--dsw-alias-state-warn-label,var(--cm-warn));--cm-fs-meta:var(--dsw-font-xxxs-11-font-size,11px);--cm-fs-table:var(--dsw-font-xxs-12-font-size,12px);--cm-fs-base:12.5px;--cm-fs-title:var(--dsw-font-xs-13-font-size,13px);--cm-sp-1:2px;--cm-sp-2:4px;--cm-sp-3:6px;--cm-sp-4:8px;--cm-sp-5:10px;--cm-sp-6:12px;--cm-sp-7:14px;--cm-sp-8:16px;--cm-sp-9:24px;--cm-r-1:var(--dsw-radius-xs,4px);--cm-r-2:var(--dsw-radius-sm,8px);--cm-r-3:var(--dsw-radius-md,12px);--cm-r-surface:var(--dsw-radius-lg,16px);--cm-r-pill:999px;--cm-h-sm:24px;--cm-h-md:28px;--cm-h-lg:32px;--cm-menu-surface:var(--dsw-menu-surface-fill,var(--dsw-alias-bg-layer-2));--cm-menu-backdrop:var(--dsw-menu-backdrop-filter,none);--cm-menu-icon:var(--dsw-alias-menu-icon,var(--dsw-alias-label-secondary));--cm-tooltip-bg:var(--dsw-alias-tooltip-bg,var(--dsw-alias-bg-layer-2));--cm-tooltip-fg:var(--dsw-static-neutral-bluish-00,var(--dsw-alias-label-primary));--cm-toast-bg:var(--dsw-alias-toast-bg,var(--dsw-alias-bg-layer-2));--cm-toast-fg:var(--dsw-alias-toast-label,var(--dsw-alias-label-primary));--cm-mask:var(--dsw-alias-bg-mask-1,color-mix(in srgb, var(--dsw-alias-bg-base) 55%, transparent));--cm-mask-blur:var(--dsw-mask-blur,none);--cm-skeleton:var(--dsw-alias-bg-skeleton,color-mix(in srgb, var(--dsw-alias-label-tertiary) 14%, transparent));--cm-hover:var(--dsw-alias-interactive-bg-hover);--cm-active:var(--dsw-alias-interactive-bg-active,var(--dsw-alias-interactive-bg-hover));--cm-hover-danger:var(--dsw-alias-interactive-bg-hover-danger,color-mix(in srgb, var(--cm-error) 12%, transparent));--cm-ghost-active-fill:var(--dsw-alias-button-ghost-active-fill,color-mix(in srgb, var(--cm-accent) 16%, transparent));--cm-ghost-active-border:var(--dsw-alias-button-ghost-active-border,color-mix(in srgb, var(--cm-accent) 45%, transparent));--cm-primary-fill:var(--dsw-alias-button-primary-fill,var(--cm-accent-fill));--cm-primary-hover:var(--dsw-alias-button-primary-hover,var(--cm-accent-hover));--cm-shadow-1:var(--dsw-elevation-soft,0 10px 26px color-mix(in srgb, var(--dsw-alias-bg-base) 45%, transparent));--cm-shadow-2:var(--dsw-elevation-prominent,0 12px 32px color-mix(in srgb, var(--dsw-alias-bg-base) 40%, transparent));--cm-focus-width:var(--dsw-focus-ring-width,2px);--cm-focus-color:var(--dsw-focus-ring-color,var(--cm-accent));--cm-z-raise:1;--cm-z-sticky:2;--cm-z-task:90;--cm-z-mask:100;--cm-z-modal:101;--cm-z-pop:110;--cm-z-toast:120;--cm-motion-fast:.12s;--cm-motion-base:.18s;--cm-motion-slow:.3s;--cm-motion-ease-out:cubic-bezier(.16, 1, .3, 1);--cm-motion-ease-in-out:cubic-bezier(.4, 0, .6, 1)}._367UGW_section :is(button,a,input,select,textarea,[role=tab]){transition-property:background-color,border-color,color;transition-duration:var(--cm-motion-fast);transition-timing-function:ease}._367UGW_section :is(button,a,input,select,textarea,[role=tab]):focus-visible{outline:var(--cm-focus-width) solid var(--cm-focus-color);outline-offset:2px}._367UGW_mono{font-variant-numeric:tabular-nums;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}._367UGW_section svg{color:inherit;flex:none}._367UGW_shellNav{flex:none;align-items:center;gap:8px;padding:8px;display:flex}._367UGW_navStrip{border-radius:var(--cm-r-3);background:var(--cm-hover);border:none;flex:auto;align-items:center;gap:2px;min-width:0;padding:2px;display:flex;overflow:hidden}._367UGW_navTab,._367UGW_navMore{border-radius:var(--cm-r-2);height:24px;font:inherit;font-size:var(--cm-fs-table);color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border:none;flex:none;align-items:center;gap:4px;padding:0 10px;font-weight:500;display:inline-flex;position:relative}._367UGW_navTab:hover,._367UGW_navMore:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._367UGW_navTab:focus-visible,._367UGW_navMore:focus-visible{outline:var(--cm-focus-width) solid var(--cm-focus-color);outline-offset:1px;border-radius:var(--cm-r-2)}._367UGW_navTab[data-active],._367UGW_navMore[data-active]{background:var(--cm-ghost-active-fill);box-shadow:inset 0 0 0 1px var(--cm-ghost-active-border);color:var(--dsw-alias-label-primary);font-weight:600}._367UGW_navDot{background:var(--cm-error);border-radius:50%;flex:none;width:6px;height:6px}._367UGW_navMoreRoot{flex:none}._367UGW_navMeasure{visibility:hidden;pointer-events:none;align-items:center;gap:2px;padding:2px;display:flex;position:absolute;top:0;left:-9999px}._367UGW_navActions{flex:none;align-items:center;gap:4px;margin-left:4px;display:flex}._367UGW_navActions ._367UGW_ghostButton[data-active]{border-color:color-mix(in srgb, var(--cm-accent) 55%, transparent);color:var(--cm-accent)}._367UGW_iconBtn{border-radius:var(--cm-r-2);width:28px;height:28px;font:inherit;font-size:var(--cm-fs-title);color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;justify-content:center;align-self:center;align-items:center;padding:0;line-height:1.25;display:inline-flex}._367UGW_iconBtn:hover{background:var(--cm-hover);color:var(--dsw-alias-label-primary)}._367UGW_iconBtn:focus-visible{outline:var(--cm-focus-width) solid var(--cm-focus-color);outline-offset:1px}._367UGW_iconBtn:disabled{opacity:.4;cursor:default}._367UGW_iconBtn[data-size=sm]{border-radius:var(--cm-r-1);width:18px;height:18px}._367UGW_iconBtn[data-active]{background:var(--cm-ghost-active-fill);box-shadow:inset 0 0 0 1px var(--cm-ghost-active-border);color:var(--cm-accent)}._367UGW_iconBtn[data-danger]{color:var(--cm-error)}._367UGW_iconBtn[data-danger]:hover{background:color-mix(in srgb, var(--cm-error) 12%, transparent);border-color:var(--cm-error);color:var(--cm-error)}._367UGW_shellMain{overscroll-behavior:contain;flex-direction:column;flex:auto;min-height:0;display:flex;overflow-y:auto}._367UGW_pagePad{min-height:0;animation:_367UGW_pageEnter var(--cm-motion-base) var(--cm-motion-ease-out);flex-direction:column;flex:auto;padding:12px 16px 16px;display:flex}@keyframes _367UGW_pageEnter{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}._367UGW_snapshotList>*,._367UGW_dataTable tbody tr{animation:_367UGW_itemEnter var(--cm-motion-base) var(--cm-motion-ease-out) both}._367UGW_snapshotList>:nth-child(2),._367UGW_dataTable tbody tr:nth-child(2){animation-delay:24ms}._367UGW_snapshotList>:nth-child(3),._367UGW_dataTable tbody tr:nth-child(3){animation-delay:48ms}._367UGW_snapshotList>:nth-child(4),._367UGW_dataTable tbody tr:nth-child(4){animation-delay:72ms}._367UGW_snapshotList>:nth-child(n+5),._367UGW_dataTable tbody tr:nth-child(n+5){animation-delay:96ms}@keyframes _367UGW_itemEnter{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}._367UGW_viewEnter{animation:_367UGW_itemEnter var(--cm-motion-base) var(--cm-motion-ease-out);flex-direction:column;flex:auto;gap:10px;min-height:0;display:flex}._367UGW_collapse{visibility:hidden;transition:grid-template-rows var(--cm-motion-base) var(--cm-motion-ease-out), visibility 0s linear var(--cm-motion-base);grid-template-rows:0fr;display:grid}._367UGW_collapse[data-open]{visibility:visible;transition:grid-template-rows var(--cm-motion-base) var(--cm-motion-ease-out), visibility 0s;grid-template-rows:1fr}._367UGW_collapseInner{min-height:0;overflow:hidden}._367UGW_shellContent{flex-direction:column;flex:auto;min-height:0;display:flex;position:relative}._367UGW_taskPanel{z-index:var(--cm-z-task);background:var(--dsw-alias-bg-layer-1);min-height:0;animation:_367UGW_taskPanelIn var(--cm-motion-base) var(--cm-motion-ease-out);flex-direction:column;display:flex;position:absolute;inset:0}@keyframes _367UGW_taskPanelIn{0%{opacity:0;transform:translate(24px)}to{opacity:1;transform:translate(0)}}._367UGW_taskHead{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:8px;height:44px;padding:0 12px;display:flex}._367UGW_taskTitle{font-size:var(--cm-fs-title);color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-weight:700;overflow:hidden}._367UGW_taskBody{overscroll-behavior:contain;flex:auto;min-height:0;padding:12px 16px 16px;overflow-y:auto}@media (prefers-reduced-motion:reduce){._367UGW_taskPanel{animation:none}}._367UGW_statusBar{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);height:28px;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;align-items:center;gap:10px;margin:0 8px 8px;padding:0 10px;display:flex;overflow:hidden}._367UGW_bannerSlot{padding:8px 12px 0}._367UGW_syncChannelBody{margin-top:10px}._367UGW_syncChannelBody ._367UGW_collapseInner{flex-direction:column;gap:10px;display:flex}._367UGW_statusTask{color:var(--dsw-alias-label-secondary);font-weight:600}._367UGW_statusProgress{background:color-mix(in srgb, var(--cm-accent) 20%, transparent);border-radius:999px;flex:none;width:60px;height:4px;display:inline-block;position:relative;overflow:hidden}._367UGW_statusProgress:after{content:\"\";background:var(--cm-accent);width:40%;animation:_367UGW_statusIndeterminate 1.2s var(--cm-motion-ease-in-out) infinite;border-radius:999px;position:absolute;inset:0 auto 0 0}@keyframes _367UGW_statusIndeterminate{0%{transform:translate(-100%)}to{transform:translate(250%)}}._367UGW_statusDot{width:10px;height:10px;color:var(--cm-idle);transition:color var(--cm-motion-fast) ease;border-radius:50%;flex:none;display:inline-block}._367UGW_statusDot[data-kind=ok]{color:var(--cm-ok)}._367UGW_statusDot[data-kind=info]{color:var(--cm-accent)}._367UGW_statusDot[data-kind=warn]{color:var(--cm-warn)}._367UGW_statusDot[data-kind=error]{color:var(--cm-error)}._367UGW_statusDot[data-pulse]{animation:1.2s ease-in-out infinite _367UGW_statusPulse}._367UGW_statusDot:after{content:\"\";background:currentColor;border-radius:50%;width:60%;height:60%;margin:20%;display:block}@keyframes _367UGW_statusPulse{0%,to{opacity:1}50%{opacity:.35}}._367UGW_statusText{text-overflow:ellipsis;min-width:0;overflow:hidden}._367UGW_statusSpacer{flex:auto}._367UGW_statusMeta{color:var(--dsw-alias-label-tertiary);flex:none}._367UGW_primaryButton,._367UGW_ghostButton,._367UGW_dangerButton{border-radius:var(--cm-r-2);height:28px;font:inherit;font-size:var(--cm-fs-table);white-space:nowrap;cursor:pointer;user-select:none;border:.5px solid #0000;justify-content:center;align-items:center;gap:4px;padding:0 10px;font-weight:500;line-height:1.25;display:inline-flex}._367UGW_primaryButton{background:var(--cm-primary-fill);color:var(--cm-text-on-accent)}._367UGW_primaryButton:hover:not(:disabled){background:var(--cm-primary-hover)}._367UGW_ghostButton{border-color:var(--dsw-alias-border-l3);color:var(--dsw-alias-label-primary);background:0 0}._367UGW_ghostButton:hover:not(:disabled){background:var(--cm-hover)}._367UGW_ghostButton:active:not(:disabled){background:var(--cm-active)}._367UGW_dangerButton{border-color:color-mix(in srgb, var(--cm-error) 45%, transparent);color:var(--cm-error);background:0 0}._367UGW_dangerButton:hover:not(:disabled){background:var(--cm-hover-danger);border-color:var(--cm-error)}._367UGW_primaryButton:focus-visible,._367UGW_ghostButton:focus-visible,._367UGW_dangerButton:focus-visible{outline:var(--cm-focus-width) solid var(--cm-focus-color);outline-offset:1px}._367UGW_primaryButton:disabled,._367UGW_ghostButton:disabled,._367UGW_dangerButton:disabled{opacity:.4;cursor:default}._367UGW_primaryButton[data-size=sm],._367UGW_ghostButton[data-size=sm],._367UGW_dangerButton[data-size=sm]{height:24px;font-size:var(--cm-fs-meta);border-radius:var(--cm-r-2);padding:0 8px}._367UGW_input{border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--cm-r-2);background:var(--dsw-specific-input-major);height:28px;font:inherit;font-size:var(--cm-fs-base);color:var(--dsw-alias-label-primary);box-sizing:border-box;padding:0 8px}._367UGW_field>._367UGW_input,._367UGW_field>._367UGW_selectRoot{width:100%;position:relative}._367UGW_input::placeholder{color:var(--dsw-alias-label-dimmed)}._367UGW_input:hover{border-color:color-mix(in srgb, var(--cm-accent) 40%, var(--dsw-alias-border-l2))}._367UGW_input:focus{border-color:var(--cm-accent);outline:none}._367UGW_input:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}._367UGW_input[type=password]{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--cm-fs-table)}._367UGW_selectRoot{vertical-align:middle;min-width:0;max-width:100%;font-size:var(--cm-fs-base);display:inline-block;position:relative}._367UGW_selectTrigger{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--cm-r-2);background:var(--dsw-specific-input-major);width:100%;height:28px;font:inherit;font-size:var(--cm-fs-base);color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;transition:border-color var(--cm-motion-fast) ease, box-shadow var(--cm-motion-fast) ease;align-items:center;gap:6px;padding:0 8px;display:flex}._367UGW_selectTrigger:hover{border-color:color-mix(in srgb, var(--cm-accent) 40%, var(--dsw-alias-border-l2))}._367UGW_selectTrigger:focus-visible,._367UGW_selectRoot[data-open] ._367UGW_selectTrigger{border-color:var(--cm-accent);outline:none}._367UGW_selectTrigger:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}._367UGW_selectLabel{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}._367UGW_selectChevron{color:var(--dsw-alias-label-secondary);transition:transform var(--cm-motion-fast) var(--cm-motion-ease-out);flex:none}._367UGW_selectRoot[data-open] ._367UGW_selectChevron{transform:rotate(180deg)}._367UGW_selectMenu{z-index:var(--cm-z-pop);box-sizing:border-box;overscroll-behavior:contain;border-radius:var(--cm-r-surface);background:var(--cm-menu-surface);max-width:260px;max-height:220px;backdrop-filter:var(--cm-menu-backdrop);box-shadow:var(--cm-shadow-2);transform-origin:top;animation:_367UGW_selectMenuIn var(--cm-motion-fast) var(--cm-motion-ease-out);border:0;padding:4px;position:absolute;overflow-y:auto}._367UGW_selectRoot[data-align=end] ._367UGW_selectMenu{left:auto;right:0}._367UGW_selectMenuPortal{pointer-events:auto;visibility:hidden}._367UGW_selectMenuPortal[data-ready]{visibility:visible}@keyframes _367UGW_selectMenuIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}._367UGW_selectOption{border-radius:var(--cm-r-3);font-size:var(--cm-fs-base);color:var(--dsw-alias-label-primary);cursor:pointer;align-items:center;gap:8px;padding:6px 8px;display:flex}._367UGW_selectOption[data-active]{background:var(--cm-hover)}._367UGW_selectOption[aria-selected=true],._367UGW_selectOption[aria-checked=true]{color:var(--cm-accent);background:var(--cm-ghost-active-fill);box-shadow:inset 2px 0 0 var(--cm-accent);font-weight:600}._367UGW_selectOption[data-disabled]{opacity:.4;cursor:default}._367UGW_selectOptionLabel{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}._367UGW_libraryFilters{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);flex:none;align-items:center;gap:2px;margin-top:8px;padding:2px;display:flex;overflow:hidden}._367UGW_libraryFilter{border-radius:var(--cm-r-2);height:24px;font:inherit;font-size:var(--cm-fs-table);color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border:none;flex:none;align-items:center;gap:4px;padding:0 8px;display:inline-flex}._367UGW_libraryFilter:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_libraryFilter[data-active]{color:var(--cm-accent);background:color-mix(in srgb, var(--cm-accent) 16%, transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--cm-accent) 45%, transparent);font-weight:600}._367UGW_libraryFilterCount{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary)}._367UGW_libraryFilter[data-active] ._367UGW_libraryFilterCount{color:inherit}._367UGW_librarySearch{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--cm-r-2);background:var(--dsw-specific-input-major);width:100%;height:28px;font:inherit;font-size:var(--cm-fs-base);color:var(--dsw-alias-label-primary);flex:none;margin-top:8px;padding:0 8px}._367UGW_librarySearch:focus-visible{border-color:var(--cm-accent);box-shadow:0 0 0 2px color-mix(in srgb, var(--cm-accent) 18%, transparent);outline:none}._367UGW_libraryFooter{border-top:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;gap:8px;margin-top:8px;padding-top:8px;display:flex}._367UGW_libraryCount{font-size:var(--cm-fs-table);color:var(--dsw-alias-label-secondary)}._367UGW_artifactList{overscroll-behavior:contain;flex:auto;min-height:0;margin:0;padding:0;list-style:none;overflow-y:auto}._367UGW_libraryListState{flex-direction:column;flex:auto;justify-content:center;min-height:0;display:flex}._367UGW_artifactRow{border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 60%, transparent)}._367UGW_artifactRow:last-child{border-bottom:none}._367UGW_artifactRow[data-expanded]{background:color-mix(in srgb, var(--cm-accent) 5%, transparent)}._367UGW_artifactRowHead{box-sizing:border-box;cursor:pointer;align-items:center;gap:8px;min-height:52px;padding:8px 10px;display:flex}._367UGW_artifactRowHead:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_artifactExpand{border-radius:var(--cm-r-1);width:20px;height:20px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}._367UGW_artifactExpand:focus-visible{outline:var(--cm-focus-width) solid var(--cm-focus-color);outline-offset:1px}._367UGW_artifactMain{flex:auto;min-width:0}._367UGW_artifactTitle{align-items:center;gap:6px;min-width:0;display:flex}._367UGW_artifactName{font-size:var(--cm-fs-base);color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}._367UGW_artifactMeta{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;margin-top:2px;overflow:hidden}._367UGW_artifactBadges,._367UGW_artifactActions{flex:none;align-items:center;gap:4px;display:flex}._367UGW_artifactDetailWrap{transition:grid-template-rows var(--cm-motion-base) var(--cm-motion-ease-out);grid-template-rows:0fr;display:grid}._367UGW_artifactRow[data-expanded] ._367UGW_artifactDetailWrap{grid-template-rows:1fr}._367UGW_artifactDetailInner{min-height:0;transition:padding var(--cm-motion-base) var(--cm-motion-ease-out);padding:0 10px 0 38px;overflow:hidden}._367UGW_artifactRow[data-expanded] ._367UGW_artifactDetailInner{padding:2px 10px 10px 38px}._367UGW_artifactDetailInner>*{opacity:0;transition:opacity var(--cm-motion-fast) var(--cm-motion-ease-out)}._367UGW_artifactRow[data-expanded] ._367UGW_artifactDetailInner>*{opacity:1;transition-delay:60ms}._367UGW_artifactRow:not([data-expanded]) ._367UGW_artifactDetailInner>*{transition-delay:0s}._367UGW_paletteInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--cm-r-2);background:var(--dsw-specific-input-major);width:100%;height:32px;font:inherit;font-size:var(--cm-fs-title);color:var(--dsw-alias-label-primary);padding:0 10px}._367UGW_paletteInput:focus-visible{border-color:var(--cm-accent);box-shadow:0 0 0 2px color-mix(in srgb, var(--cm-accent) 18%, transparent);outline:none}._367UGW_paletteList{overscroll-behavior:contain;max-height:280px;margin-top:8px;overflow-y:auto}._367UGW_paletteGroup{font-size:var(--cm-fs-meta);letter-spacing:.02em;color:var(--dsw-alias-label-tertiary);user-select:none;padding:8px 8px 4px;font-weight:500}._367UGW_paletteGroup:not([data-first]){border-top:1px solid var(--dsw-alias-border-l1);margin-top:4px}._367UGW_paletteItem{border-radius:var(--cm-r-2);font-size:var(--cm-fs-base);color:var(--dsw-alias-label-primary);cursor:pointer;align-items:center;gap:8px;padding:6px 8px;display:flex}._367UGW_paletteItem[data-active]{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_paletteItem[data-disabled]{opacity:.45;cursor:default}._367UGW_paletteItemLabel{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}._367UGW_paletteItemGroup{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);flex:none}._367UGW_paletteEmpty{font-size:var(--cm-fs-base);color:var(--dsw-alias-label-tertiary);padding:10px 8px}._367UGW_paletteHint{border-top:1px solid var(--dsw-alias-border-l1);font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);margin-top:8px;padding-top:6px}._367UGW_checkboxRow,._367UGW_radioLabel{cursor:pointer;font-size:var(--cm-fs-base);color:var(--dsw-alias-label-primary);align-items:flex-start;gap:6px;display:flex}._367UGW_checkboxRow input,._367UGW_radioLabel input{width:16px;height:16px;accent-color:var(--cm-brand);cursor:pointer;flex:none;margin:2px 0 0}._367UGW_checkboxRow input:focus-visible,._367UGW_radioLabel input:focus-visible{outline:var(--cm-focus-width) solid var(--cm-focus-color);outline-offset:2px}._367UGW_badge{border-radius:var(--cm-r-pill);height:19px;font-size:var(--cm-fs-meta);white-space:nowrap;color:var(--dsw-alias-label-tertiary);border:none;align-items:center;gap:4px;padding:0 8px;font-weight:500;line-height:1.25;display:inline-flex}._367UGW_badge[data-kind=ok]{background:color-mix(in srgb, var(--cm-ok) 10%, transparent);color:var(--cm-ok)}._367UGW_badge[data-kind=info]{background:color-mix(in srgb, var(--cm-accent) 10%, transparent);color:var(--cm-accent)}._367UGW_badge[data-kind=warn]{background:color-mix(in srgb, var(--cm-warn) 12%, transparent);color:var(--cm-warn)}._367UGW_badge[data-kind=error]{background:color-mix(in srgb, var(--cm-error) 10%, transparent);color:var(--cm-error)}._367UGW_badgeHost{align-items:center;display:inline-flex}._367UGW_banner{animation:_367UGW_itemEnter var(--cm-motion-base) var(--cm-motion-ease-out);border-radius:var(--cm-r-3);border:.5px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);font-size:var(--cm-fs-base);box-sizing:border-box;flex-wrap:wrap;align-items:center;gap:6px 10px;width:100%;margin:0 0 10px;padding:8px 12px;display:flex}._367UGW_banner[data-kind=ok]{border-color:color-mix(in srgb, var(--cm-ok) 35%, transparent);background:color-mix(in srgb, var(--cm-ok) 10%, transparent)}._367UGW_banner[data-kind=info]{border-color:color-mix(in srgb, var(--cm-accent) 30%, transparent);background:color-mix(in srgb, var(--cm-accent) 10%, transparent)}._367UGW_banner[data-kind=warn]{border-color:color-mix(in srgb, var(--cm-warn) 40%, transparent);background:color-mix(in srgb, var(--cm-warn) 12%, transparent)}._367UGW_banner[data-kind=error]{border-color:color-mix(in srgb, var(--cm-error) 45%, transparent);background:color-mix(in srgb, var(--cm-error) 10%, transparent)}._367UGW_spinnerWrap{vertical-align:middle;align-items:center;gap:6px;display:inline-flex}._367UGW_spinner{vertical-align:middle;transform-origin:50%;flex:none;width:13px;height:13px;animation:.7s linear infinite _367UGW_spin;display:inline-block}._367UGW_spinnerTrack{fill:none;stroke:color-mix(in srgb, currentColor 30%, transparent);stroke-width:3px}._367UGW_spinnerArc{fill:none;stroke:currentColor;stroke-width:3px;stroke-linecap:round}@keyframes _367UGW_spin{to{transform:rotate(360deg)}}._367UGW_spinnerLabel{font-size:var(--cm-fs-table);color:inherit;opacity:.85}._367UGW_skeletonRoot{flex-direction:column;gap:8px;width:100%;margin-top:8px;display:flex}._367UGW_skeletonBars,._367UGW_skeletonCards{flex-direction:column;gap:8px;display:flex}._367UGW_skeletonBar{border-radius:var(--cm-r-1);background-color:var(--cm-skeleton);background-image:linear-gradient(90deg, transparent, color-mix(in srgb, var(--dsw-alias-label-tertiary) 26%, transparent), transparent);animation:_367UGW_skeletonShimmer 1.3s var(--cm-motion-ease-in-out) infinite;background-position:-160px 0;background-repeat:no-repeat;background-size:160px 100%;display:block}@keyframes _367UGW_skeletonShimmer{to{background-position:calc(100% + 160px) 0}}._367UGW_skeletonTitle{border-radius:var(--cm-r-2);width:42%;height:13px}._367UGW_skeletonLine{height:11px}._367UGW_skeletonBlock{border-radius:var(--cm-r-3);height:46px}._367UGW_skeletonRow{border-radius:var(--cm-r-2);height:30px}._367UGW_skeletonBars>._367UGW_skeletonBar:nth-child(4n+2){width:92%}._367UGW_skeletonBars>._367UGW_skeletonBar:nth-child(4n+3){width:78%}._367UGW_skeletonBars>._367UGW_skeletonBar:nth-child(4n){width:64%}._367UGW_skeletonBars>._367UGW_skeletonBar:nth-child(2){animation-delay:60ms}._367UGW_skeletonBars>._367UGW_skeletonBar:nth-child(3){animation-delay:.12s}._367UGW_skeletonBars>._367UGW_skeletonBar:nth-child(4){animation-delay:.18s}._367UGW_skeletonBars>._367UGW_skeletonBar:nth-child(n+5){animation-delay:.24s}._367UGW_skeletonCard{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);flex-direction:column;gap:8px;padding:12px;display:flex}._367UGW_skeletonCard>._367UGW_skeletonBar:nth-child(2){width:84%}._367UGW_skeletonCard>._367UGW_skeletonBar:nth-child(3){width:56%}._367UGW_skeletonTable{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);overflow:hidden}._367UGW_skeletonTableRow{border-bottom:1px solid var(--dsw-alias-border-l1);align-items:center;gap:10px;padding:8px 10px;display:flex}._367UGW_skeletonTableRow:last-child{border-bottom:none}._367UGW_skeletonTableCell{flex:1 1 0;height:11px}._367UGW_skeletonTableCell:first-child{flex:0 0 40%}._367UGW_skeletonTableCell:last-child{flex:0 0 20%}._367UGW_skeletonCaption{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary)}._367UGW_card{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);margin:0 0 10px;padding:12px}._367UGW_groupLabel{font-size:var(--cm-fs-meta);letter-spacing:.02em;color:var(--dsw-alias-label-tertiary);margin-bottom:8px;font-weight:700;display:block}._367UGW_groupHeader{align-items:baseline;gap:8px;margin-bottom:10px;display:flex}._367UGW_groupHeader ._367UGW_groupLabel{white-space:nowrap;flex:none;margin-bottom:0}._367UGW_groupNote{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary)}._367UGW_groupItems{flex-direction:column;gap:6px;display:flex}._367UGW_sectionOptionRow{flex-direction:column;gap:4px;display:flex}._367UGW_field{flex-direction:column;gap:4px;margin:0 0 10px;display:flex}._367UGW_fieldLabel{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);font-weight:600}._367UGW_hint{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);line-height:1.5}._367UGW_formError{font-size:var(--cm-fs-meta);color:var(--cm-error)}._367UGW_infoHint{vertical-align:middle;align-items:center;display:inline-flex}._367UGW_infoHintBtn{border-radius:var(--cm-r-1);width:18px;height:18px;font:inherit;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;line-height:1.25;display:inline-flex}._367UGW_infoHintBtn:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._367UGW_infoHintBtn[data-open]:focus-visible{outline:var(--cm-focus-width) solid var(--cm-focus-color);outline-offset:1px}._367UGW_infoHintBtn[data-open]{color:var(--dsw-alias-label-primary)}._367UGW_infoHintBtn[data-pinned]{background:color-mix(in srgb, var(--cm-accent) 14%, transparent);color:var(--cm-accent)}._367UGW_infoHintBubble{z-index:var(--cm-z-pop);box-sizing:border-box;border-radius:var(--cm-r-2);background:var(--cm-tooltip-bg);max-width:min(260px,100vw - 24px);max-height:min(480px,100vh - 16px);box-shadow:var(--cm-shadow-1);color:var(--cm-tooltip-fg);font-size:var(--cm-fs-table);white-space:pre-wrap;overflow-wrap:anywhere;pointer-events:none;visibility:hidden;border:0;padding:8px 10px;line-height:1.5;position:fixed;overflow-y:auto}._367UGW_infoHintBubble[data-ready]{visibility:visible;animation:_367UGW_infoHintIn var(--cm-motion-fast) var(--cm-motion-ease-out);transform-origin:top}._367UGW_infoHintBubble[data-ready][data-side=top]{transform-origin:bottom}@keyframes _367UGW_infoHintIn{0%{opacity:0}to{opacity:1}}._367UGW_controlRow{align-items:center;gap:8px;margin:0 0 10px;display:flex}._367UGW_sectionTitleBlock{min-width:0;margin:0 0 10px}._367UGW_sectionTitleRow{align-items:center;gap:8px;min-width:0;display:flex}._367UGW_sectionTitle{font-size:var(--cm-fs-title);color:var(--dsw-alias-label-primary);margin:0;font-weight:700;line-height:1.5}._367UGW_sectionSubtitle{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);margin:1px 0 0}._367UGW_empty{animation:_367UGW_itemEnter var(--cm-motion-base) var(--cm-motion-ease-out);border:1px dashed var(--dsw-alias-border-l2);border-radius:var(--cm-r-3);text-align:center;font-size:var(--cm-fs-table);color:var(--dsw-alias-label-tertiary);box-sizing:border-box;flex-direction:column;justify-content:center;align-items:center;gap:4px;width:100%;padding:24px 16px;display:flex}._367UGW_emptySteps{margin:2px 0 10px}._367UGW_tableWrap{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);margin-bottom:10px;overflow:hidden}._367UGW_tableFixed th,._367UGW_tableFixed td{padding-left:12px;padding-right:12px}._367UGW_tableScroll{max-height:420px;overflow:auto}._367UGW_dataTable{border-collapse:collapse;width:100%;font-size:var(--cm-fs-table)}._367UGW_dataTable th,._367UGW_dataTable td{box-sizing:border-box}._367UGW_tableFixed{table-layout:fixed}._367UGW_tableFixed td,._367UGW_tableFixed th{text-overflow:ellipsis;overflow:hidden}._367UGW_tableCompact th,._367UGW_tableCompact td{padding-left:8px;padding-right:8px}._367UGW_dataTable td._367UGW_dim{white-space:nowrap}._367UGW_dataTable th{z-index:var(--cm-z-raise);text-align:left;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);border-bottom:.5px solid var(--dsw-alias-border-l2);white-space:nowrap;padding:6px 10px;font-weight:600;position:sticky;top:0}._367UGW_dataTable td{border-bottom:.5px solid var(--dsw-alias-border-l2);vertical-align:middle;color:var(--dsw-alias-label-primary);padding:6px 10px}._367UGW_dataTable tbody tr:last-child td{border-bottom:none}._367UGW_dataTable tbody tr{transition:background-color .1s ease-out}._367UGW_dataTable tbody tr:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_dataTable tbody tr[data-selected]{background:color-mix(in srgb, var(--cm-accent) 9%, transparent)}._367UGW_dataTable ._367UGW_num{text-align:right;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--cm-fs-table);white-space:nowrap}._367UGW_dataTable ._367UGW_dim{color:var(--dsw-alias-label-secondary)}._367UGW_dataTable ._367UGW_cellActions{text-align:right;white-space:nowrap}._367UGW_dataTable td._367UGW_cellActions{text-overflow:clip;overflow:visible}._367UGW_rowActions{align-items:center;gap:2px;display:inline-flex}._367UGW_cellMain{flex-direction:column;justify-content:center;gap:1px;min-width:0;min-height:30px;display:flex}._367UGW_cellTitle{text-overflow:ellipsis;white-space:nowrap;font-weight:500;overflow:hidden}._367UGW_cellMeta{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);align-items:center;gap:6px;min-width:0;display:inline-flex;overflow:hidden}._367UGW_cellMetaNoteText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}._367UGW_actionRow ._367UGW_banner{flex:auto;min-width:0;margin:0}._367UGW_warnText{color:var(--cm-warn)}._367UGW_kvRow{border-bottom:.5px solid var(--dsw-alias-border-l2);font-size:var(--cm-fs-table);align-items:baseline;gap:10px;min-width:0;padding:4px 0;display:flex}._367UGW_kvRow:last-child{border-bottom:none}._367UGW_kvRow+._367UGW_actionRow{margin-top:8px}._367UGW_checkboxRow+._367UGW_actionRow{margin-top:10px}._367UGW_kvKey{width:88px;color:var(--dsw-alias-label-tertiary);font-size:var(--cm-fs-meta);flex:none}._367UGW_kvValue{overflow-wrap:anywhere;flex:auto;min-width:0}._367UGW_kvValue._367UGW_mono{font-size:var(--cm-fs-table);color:var(--dsw-alias-label-secondary)}._367UGW_segGroup,._367UGW_modeTabs{border-radius:var(--cm-r-3);background:var(--cm-hover);border:none;align-items:center;gap:2px;margin:0 0 10px;padding:2px;display:inline-flex}._367UGW_segItem,._367UGW_modeTab{border-radius:var(--cm-r-2);height:24px;font:inherit;font-size:var(--cm-fs-table);color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border:none;align-items:center;gap:4px;padding:0 10px;font-weight:500;display:inline-flex}._367UGW_segItem:hover,._367UGW_modeTab:hover{color:var(--dsw-alias-label-primary)}._367UGW_segItem:focus-visible,._367UGW_modeTab:focus-visible{outline:var(--cm-focus-width) solid var(--cm-focus-color);outline-offset:1px}._367UGW_segItem[data-active],._367UGW_modeTab[data-active]{background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);box-shadow:var(--cm-shadow-1);font-weight:500}._367UGW_modeHint{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);margin:-4px 0 10px}._367UGW_stepperDot,._367UGW_stepperLabel{transition:background-color var(--cm-motion-fast) ease, border-color var(--cm-motion-fast) ease, color var(--cm-motion-fast) ease}._367UGW_stepper{scrollbar-width:none;align-items:center;padding:2px 0;display:flex;overflow-x:auto}._367UGW_stepper::-webkit-scrollbar{display:none}._367UGW_stepperStep{flex:none;align-items:center;gap:4px;display:inline-flex}._367UGW_stepperDot{border:1.5px solid var(--dsw-alias-border-l2);width:17px;height:17px;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);border-radius:50%;flex:none;justify-content:center;align-items:center;font-weight:700;display:inline-flex}._367UGW_stepperDot[data-state=current]{border-color:var(--cm-accent);background:var(--cm-accent);color:var(--dsw-alias-label-primary-foreground)}._367UGW_stepperDot[data-state=done]{background:color-mix(in srgb, var(--cm-ok) 16%, transparent);color:var(--cm-ok);border-color:#0000}._367UGW_stepperLabel{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);white-space:nowrap}._367UGW_stepperStep[data-state=current] ._367UGW_stepperLabel{color:var(--dsw-alias-label-primary);font-weight:600}._367UGW_stepperStep[data-state=done] ._367UGW_stepperLabel{color:var(--dsw-alias-label-secondary)}._367UGW_stepperConnector{background:var(--dsw-alias-border-l2);flex:none;width:14px;height:1.5px;margin:0 4px}._367UGW_stepperStep[data-state=done] ._367UGW_stepperConnector{background:color-mix(in srgb, var(--cm-ok) 45%, transparent)}._367UGW_progressBlock{margin:0 0 10px}._367UGW_progressTrack{border-radius:var(--cm-r-1);background:color-mix(in srgb, var(--dsw-alias-border-l1) 80%, transparent);height:5px;position:relative;overflow:hidden}._367UGW_progressBar{border-radius:var(--cm-r-1);background:var(--cm-accent);transition:width var(--cm-motion-slow) var(--cm-motion-ease-out);position:absolute;inset:0 auto 0 0}._367UGW_progressBarDone{background:var(--cm-ok)}._367UGW_progressBarFailed{background:var(--cm-error)}._367UGW_progressIndeterminate{border-radius:var(--cm-r-1);background:var(--cm-accent);width:34%;animation:_367UGW_indet 1.15s var(--cm-motion-ease-in-out) infinite;position:absolute;top:0;bottom:0}@keyframes _367UGW_indet{0%{left:-34%}to{left:100%}}._367UGW_progressMeta{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;margin-top:4px;display:flex}._367UGW_progressLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}._367UGW_progressPercent{color:var(--dsw-alias-label-tertiary);flex:none;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}._367UGW_progressBadge{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);flex:none;align-items:center;gap:4px;display:inline-flex}._367UGW_progressBadgeCount{border-radius:var(--cm-r-3);background:color-mix(in srgb, var(--cm-info) 14%, transparent);color:var(--dsw-alias-label-secondary);padding:0 4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}._367UGW_progressBadgeSection{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}._367UGW_progressDetail{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);margin-top:2px}._367UGW_planScroll,._367UGW_reportScroll,._367UGW_confirmScroll,._367UGW_pullScroll,._367UGW_diffScroll,._367UGW_historyScroll,._367UGW_consultScroll{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-base);max-height:380px;overflow:auto}._367UGW_consultScroll{padding:0 6px}._367UGW_logScroll{background:var(--dsw-alias-bg-base);max-height:220px;overflow:auto}._367UGW_dialogMask{z-index:var(--cm-z-mask);background:var(--cm-mask);backdrop-filter:var(--cm-mask-blur);animation:_367UGW_maskIn var(--cm-motion-fast) var(--cm-motion-ease-out);justify-content:center;align-items:center;display:flex;position:fixed;inset:0}@keyframes _367UGW_maskIn{0%{opacity:0}to{opacity:1}}._367UGW_dialogContentCenter{z-index:var(--cm-z-modal);animation:_367UGW_dialogIn var(--cm-motion-base) var(--cm-motion-ease-out);position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}@keyframes _367UGW_dialogIn{0%{opacity:0;transform:translate(-50%,-50%)translateY(4px)}to{opacity:1;transform:translate(-50%,-50%)translateY(0)}}._367UGW_dialogMask[data-state=closed]{animation:_367UGW_maskOut var(--cm-motion-fast) var(--cm-motion-ease-out)}._367UGW_dialogContentCenter[data-state=closed]{animation:_367UGW_dialogOut var(--cm-motion-fast) var(--cm-motion-ease-out)}@keyframes _367UGW_maskOut{to{opacity:0}}@keyframes _367UGW_dialogOut{to{opacity:0;transform:translate(-50%,-50%)scale(.98)}}._367UGW_dialogCard{border-radius:var(--cm-r-surface);background:var(--dsw-alias-bg-layer-2);width:min(640px,100vw - 48px,95%);max-width:calc(100vw - 48px);max-height:min(600px,100vh - 64px,92%);box-shadow:var(--cm-shadow-2);border:0;flex-direction:column;display:flex}._367UGW_dialogHeader{font-size:var(--cm-fs-title);color:var(--dsw-alias-label-primary);padding:12px 16px 0;font-weight:500}._367UGW_dialogHeaderRow{align-items:center;gap:8px;padding:12px 14px 0;display:flex}._367UGW_dialogHeaderRow ._367UGW_dialogHeader{padding:0}._367UGW_dialogClose{margin-left:auto}._367UGW_dialogBody{min-height:0;font-size:var(--cm-fs-base);color:var(--dsw-alias-label-secondary);flex:auto;padding:8px 16px 12px;overflow-y:auto}._367UGW_dialogBodyScroll{max-height:460px;overflow-y:auto}._367UGW_dialogWide{width:min(720px,100vw - 48px,96%);max-height:min(620px,100vh - 64px,92%)}._367UGW_dialogFooter{border-top:.5px solid var(--dsw-alias-border-l2);justify-content:flex-end;gap:8px;margin:0;padding:10px 16px 14px}._367UGW_updateVersionRow{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:10px;display:flex}._367UGW_updateVersionArrow{color:var(--dsw-alias-label-tertiary)}._367UGW_updateVersionTarget{font-size:var(--cm-fs-title);color:var(--dsw-alias-label-primary);font-weight:600}._367UGW_updateNotesLoading{justify-content:center;padding:24px 0;display:flex}._367UGW_toastViewport{z-index:var(--cm-z-toast);pointer-events:none;flex-direction:column;align-items:flex-end;gap:8px;max-width:calc(100% - 20px);display:flex;position:absolute;bottom:42px;right:10px}._367UGW_toast{pointer-events:auto;border-radius:var(--cm-r-surface);background:var(--cm-toast-bg);width:fit-content;max-width:420px;box-shadow:var(--cm-shadow-2);font-size:var(--cm-fs-title);color:var(--cm-toast-fg);animation:_367UGW_toastIn var(--cm-motion-base) var(--cm-motion-ease-out);border:0;align-items:flex-start;gap:8px;padding:12px 16px;line-height:1.5;display:flex}@keyframes _367UGW_toastIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}._367UGW_toast[data-kind=ok] ._367UGW_toastGlyph{color:var(--cm-ok)}._367UGW_toast[data-kind=info] ._367UGW_toastGlyph{color:var(--cm-accent)}._367UGW_toast[data-kind=warn] ._367UGW_toastGlyph{color:var(--cm-warn-label)}._367UGW_toast[data-kind=error] ._367UGW_toastGlyph{color:var(--cm-error)}._367UGW_toastGlyph{flex:none;margin-top:1px;display:inline-flex}._367UGW_toastText{word-break:break-word;min-width:0}._367UGW_toast>button{flex:none;width:18px;height:18px;margin-left:2px}._367UGW_statusAction{font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;min-width:0;padding:0;display:inline-flex}._367UGW_statusAction:hover{color:var(--dsw-alias-label-primary);text-decoration:underline}._367UGW_statusAction:focus-visible{outline:var(--cm-focus-width) solid var(--cm-focus-color);outline-offset:1px;border-radius:var(--cm-r-1)}._367UGW_runsCenter{flex-direction:column;gap:10px;display:flex}._367UGW_runsSummary{flex-wrap:wrap;align-items:center;gap:8px;display:flex}._367UGW_runsSummaryTitle{font-size:var(--cm-fs-table);color:var(--dsw-alias-label-primary);font-weight:700}._367UGW_runsCardHead{flex-wrap:wrap;align-items:center;gap:6px;margin:0 0 8px;display:flex}._367UGW_runsCardTitle{font-size:var(--cm-fs-base);color:var(--dsw-alias-label-primary);font-weight:600}._367UGW_runsWarnNote{border:1px solid color-mix(in srgb, var(--cm-warn) 45%, transparent);border-radius:var(--cm-r-2);background:color-mix(in srgb, var(--cm-warn) 10%, transparent);font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);margin:8px 0 0;padding:6px 8px}._367UGW_runsWarnNoteDetail{color:var(--dsw-alias-label-tertiary);margin:4px 0 0}._367UGW_runsCardTime{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);white-space:nowrap;margin-left:auto}._367UGW_runsCounts{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);margin:8px 0 0}._367UGW_runsLogTail{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-2);background:var(--dsw-alias-bg-base);max-height:108px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);margin:8px 0 0;padding:6px 8px;line-height:1.5;overflow-y:auto}._367UGW_runsLogLine{white-space:pre-wrap;word-break:break-all}._367UGW_runsCardActions{flex-wrap:wrap;align-items:center;gap:8px;margin:10px 0 0;display:flex}._367UGW_runsOption{border:1px solid var(--dsw-alias-border-l2);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);width:100%;font:inherit;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;flex-direction:column;gap:2px;margin:0 0 8px;padding:8px 10px;display:flex}._367UGW_runsOption:hover{border-color:var(--cm-accent)}._367UGW_runsOption:focus-visible{outline:var(--cm-focus-width) solid var(--cm-focus-color);outline-offset:1px}._367UGW_runsOption[data-active]{border-color:var(--cm-accent);background:color-mix(in srgb, var(--cm-accent) 8%, transparent)}._367UGW_runsOptionTitle{font-size:var(--cm-fs-base);align-items:center;gap:6px;font-weight:600;display:flex}._367UGW_runsOptionDesc{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary)}._367UGW_runsOptionTag{font-size:var(--cm-fs-meta);background:color-mix(in srgb, var(--cm-accent) 14%, transparent);color:var(--cm-accent);border-radius:999px;padding:0 4px;font-weight:600}._367UGW_actionRow{flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 10px;display:flex}._367UGW_actionRowTop{flex-wrap:wrap;align-items:center;gap:8px;margin:10px 0;display:flex}._367UGW_snapshotPickerHint{margin-top:4px;margin-bottom:10px}._367UGW_headRow{flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 10px;display:flex}._367UGW_headRow ._367UGW_groupLabel{margin-bottom:0}._367UGW_authorRow{flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}._367UGW_authorRow ._367UGW_groupLabel{margin-bottom:0}._367UGW_marketFilterGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-bottom:8px;display:grid}._367UGW_marketFilterSearch{grid-column:1/-1}._367UGW_marketFilterMeta{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:8px;display:flex}._367UGW_statStrip{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);flex-wrap:wrap;flex:none;align-items:stretch;gap:6px 0;min-height:32px;margin-bottom:10px;display:flex}._367UGW_statStrip>:last-child{padding-right:8px}._367UGW_statStrip[data-tone=error]{border-color:color-mix(in srgb, var(--cm-error) 45%, transparent);background:color-mix(in srgb, var(--cm-error) 7%, transparent)}._367UGW_statStrip[data-tone=warn]{border-color:color-mix(in srgb, var(--cm-warn) 40%, transparent);background:color-mix(in srgb, var(--cm-warn) 6%, transparent)}._367UGW_statHealth{font-size:var(--cm-fs-table);color:var(--dsw-alias-label-primary);white-space:nowrap;flex:none;align-items:center;gap:6px;padding:4px 8px;font-weight:600;display:flex}._367UGW_statHealthAction{font:inherit;font-size:var(--cm-fs-table);cursor:pointer;text-align:left;background:0 0;border:none;font-weight:600}._367UGW_statHealthAction:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_statHealthAction:focus-visible{outline:var(--cm-focus-width) solid var(--cm-focus-color);outline-offset:-2px;border-radius:var(--cm-r-2)}._367UGW_statSeg{border:none;border-left:1px solid var(--dsw-alias-border-l1);font:inherit;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);white-space:nowrap;cursor:pointer;background:0 0;flex:none;align-items:center;gap:6px;padding:4px 8px;display:flex}._367UGW_statSeg>span:first-child{color:var(--dsw-alias-label-tertiary)}._367UGW_statSeg:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._367UGW_statSeg:hover>span:first-child{color:var(--dsw-alias-label-secondary)}._367UGW_statSeg:focus-visible{outline:var(--cm-focus-width) solid var(--cm-focus-color);outline-offset:-2px}._367UGW_statSeg b{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-weight:700}._367UGW_statSegDim{color:var(--dsw-alias-label-tertiary)}._367UGW_toolRow{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:10px;display:flex}._367UGW_infoValue{flex:auto;align-items:center;gap:8px;min-width:0;display:inline-flex}._367UGW_infoValue ._367UGW_mono{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._367UGW_copyBtn{border-radius:var(--cm-r-1);width:20px;height:20px;font:inherit;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;line-height:1.25;display:inline-flex}._367UGW_copyBtn:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._367UGW_copyBtn:focus-visible{outline:var(--cm-focus-width) solid var(--cm-focus-color);outline-offset:1px}._367UGW_activityRow ._367UGW_copyBtn{opacity:0}._367UGW_activityRow:hover ._367UGW_copyBtn,._367UGW_activityRow ._367UGW_copyBtn:focus-visible{opacity:1}._367UGW_activityCard{flex-direction:column;min-height:0;margin-bottom:0;display:flex}._367UGW_diskUsageCard{height:var(--cm-disk-card-h);min-height:var(--cm-disk-card-h);max-height:var(--cm-disk-card-h)}._367UGW_diskUsageScroll{flex:auto;min-height:0;max-height:none}._367UGW_activityHeader{align-items:center;gap:8px;margin-bottom:8px;display:flex}._367UGW_activityTitle{font-size:var(--cm-fs-meta);letter-spacing:.02em;color:var(--dsw-alias-label-tertiary);flex:auto;font-weight:700}._367UGW_activityRows{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-base);flex:auto;min-height:0;overflow-y:auto}._367UGW_activityRow{border-bottom:.5px solid var(--dsw-alias-border-l2);font-size:var(--cm-fs-table);grid-template-columns:72px minmax(0,1fr) auto;align-items:center;gap:10px;min-width:0;padding:4px 10px;line-height:1.5;display:grid}._367UGW_activityRow:last-child{border-bottom:none}._367UGW_activityTime{color:var(--dsw-alias-label-tertiary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;line-height:1.5;font-size:var(--cm-fs-meta);white-space:nowrap;justify-self:end}._367UGW_activityKind{color:var(--dsw-alias-label-tertiary);line-height:1.5;font-size:var(--cm-fs-meta);white-space:nowrap;flex:none}._367UGW_activitySummary{min-width:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;line-height:1.5;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;display:inline-flex}._367UGW_activitySummaryText{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._367UGW_activityBadge{flex:none;justify-content:flex-end;align-items:center;line-height:1.5;display:inline-flex}._367UGW_activityResultOk{line-height:1.5;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);white-space:nowrap;align-items:center;gap:4px;display:inline-flex}._367UGW_factGrid{grid-template-columns:repeat(4,minmax(0,1fr));gap:6px 12px;display:grid}._367UGW_factCell{flex-direction:column;gap:2px;min-width:0;display:flex}._367UGW_factLabel{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);white-space:nowrap}._367UGW_factValue{font-size:var(--cm-fs-table);color:var(--dsw-alias-label-primary);white-space:nowrap;text-overflow:ellipsis;font-weight:600;overflow:hidden}._367UGW_sectionGrid{grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:0 24px;display:grid}._367UGW_sectionRow{border-bottom:.5px solid var(--dsw-alias-border-l2);font-size:var(--cm-fs-table);grid-template-columns:minmax(0,1fr) auto 56px;align-items:center;gap:10px;min-width:0;padding:4px 0;display:grid}._367UGW_sectionRow:nth-last-child(-n+2){border-bottom:none}._367UGW_sectionName{min-width:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._367UGW_sectionCount{color:var(--dsw-alias-label-tertiary);font-size:var(--cm-fs-meta);font-variant-numeric:tabular-nums;white-space:nowrap;justify-self:end}._367UGW_sectionSize{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap;justify-self:end}._367UGW_activityEmpty{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);text-align:center;padding:16px}._367UGW_snapshotList{flex-direction:column;gap:10px;margin-bottom:12px;display:flex}._367UGW_snapshotRow{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);align-items:center;gap:10px;padding:12px 14px;display:flex}._367UGW_snapshotRow[data-selected]{border-color:var(--cm-accent);background:color-mix(in srgb, var(--cm-accent) 7%, transparent)}._367UGW_snapshotRowHeader{font-size:var(--cm-fs-table);align-items:center;gap:8px;display:flex}._367UGW_snapshotRowMain{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;font-weight:500;overflow:hidden}._367UGW_snapshotRowText{flex-direction:column;flex:auto;gap:4px;min-width:0;display:flex}._367UGW_snapshotRowName{font-weight:500;font-size:var(--cm-fs-base);word-break:break-all;line-height:1.5}._367UGW_snapshotRowMeta{min-width:0;font-size:var(--cm-fs-table);color:var(--dsw-alias-label-secondary);align-items:center;gap:10px;display:flex}._367UGW_snapshotRowBadges{flex:none;align-items:center;gap:6px;display:inline-flex}._367UGW_snapshotRowIssues{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}._367UGW_snapshotRowFacts{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums;flex:none}._367UGW_snapshotList._367UGW_reportScroll{background:var(--dsw-alias-bg-layer-2);margin-bottom:0;padding:10px 12px 10px 10px}._367UGW_reasonList{flex-direction:column;flex-basis:100%;gap:4px;min-width:0;display:flex}._367UGW_reasonLine{align-items:baseline;gap:6px;min-width:0;display:flex}._367UGW_reasonLine>span:first-child{overflow-wrap:anywhere;min-width:0}._367UGW_viewBody{flex-direction:column;flex:auto;min-width:0;min-height:0;display:flex}._367UGW_resultScroll{flex:auto;min-height:0;overflow-y:auto}._367UGW_resultFooter{border-top:1px solid var(--dsw-alias-border-l1);flex:none;align-items:center;margin:10px 0 0;padding-top:10px}._367UGW_fillCard{flex:auto;margin-bottom:0}._367UGW_fillViewport{flex-direction:column;flex:auto;min-height:0;margin-bottom:0;display:flex}._367UGW_fillViewport ._367UGW_tableScroll{flex:auto;max-height:none}._367UGW_compositionViewport{flex:auto;min-height:0;overflow:auto}._367UGW_sparseFill{flex-direction:column;flex:auto;justify-content:flex-start;align-items:flex-start;gap:10px;min-height:280px;display:flex}._367UGW_pickerRoot{flex-direction:column;gap:8px;min-width:0;display:flex;position:relative}._367UGW_pickerOverlay{z-index:var(--cm-z-sticky);animation:_367UGW_maskIn var(--cm-motion-fast) var(--cm-motion-ease-out);border-radius:var(--cm-r-3);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 62%, transparent);backdrop-filter:blur(1px);justify-content:center;align-items:center;display:flex;position:absolute;inset:0}._367UGW_pickerToolbar{align-items:center;gap:8px;min-width:0;display:flex}._367UGW_pickerToolbar ._367UGW_input{flex:auto;min-width:0}._367UGW_pickerList{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);max-height:320px;padding:4px 10px;overflow:auto}._367UGW_pickerModalBody{flex-direction:column;gap:8px;height:min(420px,62vh);min-height:0;display:flex}._367UGW_pickerModalBody ._367UGW_pickerRoot{flex:auto;min-height:0}._367UGW_pickerModalBody ._367UGW_pickerList{scrollbar-gutter:stable;flex:auto;min-height:0;max-height:none}._367UGW_pickerGroup+._367UGW_pickerGroup{border-top:.5px solid var(--dsw-alias-border-l2)}._367UGW_pickerUnit{animation:_367UGW_itemEnter var(--cm-motion-base) var(--cm-motion-ease-out);align-items:center;min-width:0;padding:2px 0 2px 16px;display:flex}._367UGW_pickerUnitName{font-size:var(--cm-fs-table);color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:280px;overflow:hidden}._367UGW_pickerTreeRow{align-items:center;gap:4px;min-width:0;padding:4px 0;display:flex}._367UGW_pickerTreeRow>:last-child{flex:auto;min-width:0}._367UGW_pickerChevronSpacer{flex:none;width:18px;height:18px;display:inline-block}._367UGW_pickerGroupTitle{border-top:1px solid var(--dsw-alias-border-l2);align-items:center;gap:6px;padding:8px 0 4px;display:flex}._367UGW_pickerGroupTitle:first-child{border-top:none;padding-top:0}._367UGW_pickerGroupTitleName{font-size:var(--cm-fs-meta);letter-spacing:.02em;color:var(--dsw-alias-label-secondary);font-weight:600}._367UGW_pickerSubgroup{padding-left:18px}._367UGW_pickerSubgroupName{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-weight:600;overflow:hidden}._367UGW_pickerChildren{border-left:1px solid var(--dsw-alias-border-l1);margin-left:8px;padding-left:4px}._367UGW_pickerUnitNested{gap:4px}._367UGW_pickerMore{justify-content:center;padding:4px 0 2px 16px;display:flex}._367UGW_pickerUnitDetail{max-width:220px;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._367UGW_pickerCount{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap}._367UGW_pickerFooter{border-top:1px solid var(--dsw-alias-border-l1);font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);padding-top:6px}._367UGW_optionsRow{align-items:center;gap:16px;display:flex;& ._367UGW_noticeSlot{flex-direction:column;justify-content:center;min-height:40px;display:flex}& ._367UGW_noticeSlot ._367UGW_banner{margin:0}& ._367UGW_noticeLine{white-space:nowrap;text-overflow:ellipsis;display:block;overflow:hidden}margin-bottom:4px}._367UGW_groupList{flex-direction:column;gap:8px;margin-bottom:10px;display:flex}._367UGW_groupCard{margin:0}._367UGW_categoryItem{flex-wrap:wrap;align-items:baseline;gap:8px;min-width:0;display:flex}._367UGW_categoryName{color:var(--dsw-alias-label-primary);flex:none;font-weight:500}._367UGW_categoryDesc{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);min-width:0}._367UGW_optionsCard{margin:0 0 10px}._367UGW_secretFields ._367UGW_field{margin-bottom:0}._367UGW_groupHintRow{margin-bottom:10px}._367UGW_secretFields{background:0 0;border:none;border-radius:0;grid-template-columns:1fr 1fr;gap:0 10px;margin:6px 0 10px;padding:0;display:grid}._367UGW_warnList{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);margin:4px 0 0;padding-left:18px}._367UGW_wizardStepperRow{align-items:center;gap:10px;margin-bottom:10px;display:flex}._367UGW_conflictDetail{margin-top:2px}._367UGW_conflictList{flex-direction:column;gap:8px;margin-bottom:10px;display:flex}._367UGW_conflictItem{border:1px solid color-mix(in srgb, var(--cm-warn) 35%, transparent);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);padding:10px 12px}._367UGW_conflictHead{font-size:var(--cm-fs-table);align-items:center;gap:8px;margin-bottom:6px;display:flex}._367UGW_conflictId{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-weight:600;overflow:hidden}._367UGW_conflictOptions{flex-wrap:wrap;gap:4px 14px;margin-top:6px;display:flex}._367UGW_conflictChoices{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-top:8px;display:grid}._367UGW_choiceCard{border:1px solid var(--dsw-alias-border-l2);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-base);font-size:var(--cm-fs-table);color:var(--dsw-alias-label-secondary);cursor:pointer;align-items:center;gap:6px;padding:8px 10px;font-weight:500;transition:border-color .12s ease-out,background-color .12s ease-out;display:flex}._367UGW_choiceCard:hover{border-color:color-mix(in srgb, var(--cm-accent) 40%, var(--dsw-alias-border-l2))}._367UGW_choiceCard:focus-within{outline:var(--cm-focus-width) solid var(--cm-focus-color);outline-offset:1px}._367UGW_choiceCard[data-selected]{border-color:var(--cm-accent);background:color-mix(in srgb, var(--cm-accent) 9%, transparent);color:var(--dsw-alias-label-primary)}._367UGW_choiceCard input{width:13px;height:13px;accent-color:var(--cm-accent);flex:none;margin:0}._367UGW_choiceTitle{min-width:0}._367UGW_conflictDetail{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-2);background:var(--dsw-alias-bg-base);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;white-space:normal;padding:8px 10px}._367UGW_conflictPrefix{color:var(--dsw-alias-label-tertiary);margin-bottom:4px}._367UGW_conflictLine{align-items:baseline;gap:8px;padding:4px 0;display:flex}._367UGW_conflictLine+._367UGW_conflictLine{border-top:.5px solid var(--dsw-alias-border-l2)}._367UGW_conflictLineLabel{min-width:56px;color:var(--dsw-alias-label-tertiary);flex:none;font-weight:600}._367UGW_conflictLineValue{overflow-wrap:anywhere;flex:auto;min-width:0}._367UGW_pathMappingList{flex-direction:column;gap:6px;margin-bottom:10px;display:flex}._367UGW_pathRow{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--cm-fs-meta);flex-direction:column;align-items:stretch;gap:8px;padding:8px 10px;display:flex}._367UGW_pathOld,._367UGW_pathNew{border:1px solid var(--dsw-alias-border-l2);border-radius:var(--cm-r-2);background:var(--dsw-alias-bg-base);overflow-wrap:anywhere;flex-direction:column;flex:auto;width:100%;min-width:0;padding:4px 8px;display:flex}._367UGW_pathValue{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;margin:2px 0 0}._367UGW_pathIssueKind{flex:none}._367UGW_secretsList{flex-direction:column;display:flex}._367UGW_snapshotPickerRow{flex-wrap:nowrap;align-items:flex-end;gap:8px;margin-top:10px;margin-bottom:10px;display:flex}._367UGW_snapshotPickerRow ._367UGW_field{margin-bottom:0}._367UGW_pickerAction{flex:none;align-items:center;display:inline-flex}._367UGW_logPanel{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-base);margin-bottom:10px;overflow:hidden}._367UGW_logHeader{border-bottom:1px solid var(--dsw-alias-border-l1);font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);align-items:center;gap:8px;padding:6px 10px;font-weight:600;display:flex}._367UGW_logLine{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;padding:1px 10px;line-height:1.5}._367UGW_logCounts{color:var(--dsw-alias-label-tertiary);font-weight:500}._367UGW_logFilterButton{font:inherit;font-size:var(--cm-fs-meta);color:var(--cm-accent);cursor:pointer;background:0 0;border:none;padding:0 4px}._367UGW_logFilterButton[data-active]{color:var(--dsw-alias-label-primary);font-weight:700}._367UGW_logEntry+._367UGW_logEntry{border-top:.5px solid var(--dsw-alias-border-l2)}._367UGW_logLine[data-level=fail]{color:var(--cm-error)}._367UGW_logLine[data-level=warn]{color:var(--cm-warn)}._367UGW_logLine[data-level=ok]{color:var(--cm-ok)}._367UGW_logLine[data-level=skip]{color:var(--dsw-alias-label-tertiary)}._367UGW_logLine[data-level=running]{color:var(--dsw-alias-label-primary)}._367UGW_logDetail{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);white-space:pre-wrap;overflow-wrap:anywhere;padding:0 10px 0 22px;line-height:1.5}._367UGW_logDetail[data-kind=command]{color:var(--dsw-alias-label-secondary)}._367UGW_logEmpty{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);text-align:center;padding:12px}._367UGW_logJumpButton{font:inherit;font-size:var(--cm-fs-meta);color:var(--cm-accent);cursor:pointer;background:0 0;border:none;margin-left:auto;padding:0 4px}._367UGW_reportView{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);margin-bottom:10px;overflow:hidden}._367UGW_reportList{flex-direction:column;display:flex}._367UGW_confirmItem{border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 50%, transparent);padding:8px 10px}._367UGW_confirmItem:last-child{border-bottom:none}._367UGW_confirmItemHead{flex-wrap:wrap;align-items:center;gap:8px;display:flex}._367UGW_confirmItemDesc{min-width:0;font-size:var(--cm-fs-base);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;flex:200px}._367UGW_confirmItemHead+._367UGW_conflictItem{margin-top:8px}._367UGW_reportBlock{margin-bottom:10px}._367UGW_reportProblemRow{border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 50%, transparent);padding:6px 10px}._367UGW_reportProblemRow:last-child{border-bottom:none}._367UGW_reportProblemHead{align-items:center;gap:6px;display:flex}._367UGW_reportProblemText{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--cm-fs-table);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}._367UGW_reportProblemReason{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;margin-top:2px;line-height:1.5}._367UGW_reportSectionRow{align-items:center;gap:6px;padding:4px 0;display:flex}._367UGW_reportWarningRow{font-size:var(--cm-fs-meta);color:var(--cm-warn);overflow-wrap:anywhere;padding:2px 10px;line-height:1.5}._367UGW_reportDetails{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);margin-top:4px}._367UGW_reportDetails>summary{cursor:pointer;color:var(--dsw-alias-label-secondary);padding:2px 0}._367UGW_reportDetails ._367UGW_reportScroll{margin-top:6px}._367UGW_reportView ._367UGW_reportScroll{background:0 0;border:none;border-radius:0}._367UGW_reportBody{flex-direction:column;gap:2px;padding:8px 12px;display:flex}._367UGW_reportHeadline{font-size:var(--cm-fs-base);color:var(--dsw-alias-label-primary);margin-bottom:2px;font-weight:600}._367UGW_reportText{font-size:var(--cm-fs-table);color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;padding:8px 12px}._367UGW_reportFooter{border-top:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);align-items:center;gap:8px;padding:8px 12px;display:flex}._367UGW_errorBanner{border:1px solid color-mix(in srgb, var(--cm-error) 45%, transparent);border-radius:var(--cm-r-3);background:color-mix(in srgb, var(--cm-error) 8%, transparent);font-size:var(--cm-fs-table);align-items:flex-start;gap:8px;margin:0 0 10px;padding:8px 12px;display:flex}._367UGW_errorTitle{color:var(--cm-error);font-weight:600}._367UGW_errorLine{white-space:pre-wrap;overflow-wrap:anywhere;color:var(--dsw-alias-label-secondary);margin:0}._367UGW_errorList{font-size:var(--cm-fs-meta);margin:4px 0 0;padding-left:18px}._367UGW_errorItem{overflow-wrap:anywhere}._367UGW_errorReason{white-space:pre-wrap;overflow-wrap:anywhere;min-width:0;color:var(--dsw-alias-label-tertiary);margin:0}._367UGW_errorFooter{margin-top:6px}._367UGW_errorAction{margin-right:8px}._367UGW_errorActionLabel{color:var(--cm-accent)}._367UGW_inspectGroup{margin-bottom:10px}._367UGW_kindTag{border-radius:var(--cm-r-1);background:var(--dsw-alias-interactive-bg-hover);height:16px;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);white-space:nowrap;align-items:center;padding:0 6px;font-weight:600;display:inline-flex}._367UGW_kindTagOk{background:color-mix(in srgb, var(--cm-ok) 13%, transparent);color:var(--cm-ok)}._367UGW_kindTagInfo{background:color-mix(in srgb, var(--cm-accent) 13%, transparent);color:var(--cm-accent)}._367UGW_kindTagWarn{background:color-mix(in srgb, var(--cm-warn) 13%, transparent);color:var(--cm-warn)}._367UGW_kindTagError{background:color-mix(in srgb, var(--cm-error) 13%, transparent);color:var(--cm-error)}._367UGW_restorePlan{animation:_367UGW_itemEnter var(--cm-motion-base) var(--cm-motion-ease-out);flex-direction:column;gap:10px;display:flex}._367UGW_restorePlanList{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}._367UGW_restorePlanRow,._367UGW_restorePlanRowStatic{border-radius:var(--cm-r-2);align-items:center;gap:8px;width:100%;padding:4px 6px;display:flex}._367UGW_restorePlanRow{color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:none}._367UGW_restorePlanRow:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_restorePlanRow:focus-visible{box-shadow:0 0 0 2px color-mix(in srgb, var(--cm-accent) 55%, transparent);outline:none}._367UGW_restorePlanPath{min-width:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--cm-fs-table);color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}._367UGW_restorePlanStat{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;flex:none}._367UGW_restorePlanChevron{color:var(--dsw-alias-label-tertiary);flex:none}._367UGW_restorePlanNote{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;padding:0 6px 4px 24px}._367UGW_restorePlanGroupHead{align-items:center;gap:8px;margin:0 0 4px;display:flex}._367UGW_restorePlanGroupHead ._367UGW_groupLabel{margin-bottom:0;display:inline}._367UGW_diffGroupToggle{color:var(--dsw-alias-label-secondary);font-size:var(--cm-fs-meta);cursor:pointer;background:0 0;border:none;padding:0;font-weight:700}._367UGW_diffGroupToggle:hover{color:var(--dsw-alias-label-primary)}._367UGW_diffGroupToggle:focus-visible{border-radius:var(--cm-r-1);box-shadow:0 0 0 2px color-mix(in srgb, var(--cm-accent) 55%, transparent);outline:none}._367UGW_diffStatTotal{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--cm-fs-meta);font-variant-numeric:tabular-nums}._367UGW_diffStatAdd{color:var(--cm-ok)}._367UGW_diffStatDel{color:var(--cm-error)}._367UGW_rollbackTabIcon{flex:none;align-items:center;margin-right:6px;display:inline-flex}._367UGW_diffFileHead{border-bottom:1px solid var(--dsw-alias-border-l1);font-size:var(--cm-fs-table);flex:none;align-items:center;gap:8px;padding:2px 6px;line-height:1.5;display:flex}._367UGW_diffFilePath{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-secondary);flex:auto;overflow:hidden}._367UGW_diffFileStat{font-variant-numeric:tabular-nums;flex:none}._367UGW_diffPane{margin:2px 0 8px}._367UGW_diffPaneFill{flex-direction:column;height:100%;min-height:0;margin:0;display:flex}._367UGW_diffPane ._367UGW_diffScroll{max-height:min(80vh,800px)}._367UGW_dialogCard ._367UGW_diffPane ._367UGW_diffScroll{max-height:380px}._367UGW_diffPaneFill ._367UGW_diffScroll{flex:auto;min-height:0;max-height:calc(100vh - 90px)}._367UGW_diffTable{border-collapse:collapse;table-layout:fixed;width:100%;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--cm-fs-table);line-height:1.5}._367UGW_diffNoColW3{width:calc(3ch + 18px)}._367UGW_diffNoColW4{width:calc(4ch + 18px)}._367UGW_diffNoColW5{width:calc(5ch + 18px)}._367UGW_diffNoColW6{width:calc(6ch + 18px)}._367UGW_diffNoHead{border-bottom:1px solid var(--dsw-alias-border-l1);border-right:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-tertiary);font-size:var(--cm-fs-meta);text-align:left;padding:2px 6px;font-weight:600;line-height:1.5}._367UGW_diffNoHead+._367UGW_diffNoHead{border-left:1px solid var(--dsw-alias-border-l1)}._367UGW_diffHunkRow td{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-tertiary);padding:2px 6px}._367UGW_diffTable tbody td:nth-child(3),._367UGW_diffHunkRow td+td{border-left:1px solid var(--dsw-alias-border-l1)}._367UGW_diffNo{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;text-align:right;vertical-align:top;user-select:none;padding:1px 4px}._367UGW_diffNoDel{background:color-mix(in srgb, var(--cm-error) 12%, transparent);color:var(--cm-error);box-shadow:inset 3px 0 0 var(--cm-error)}._367UGW_diffNoAdd{background:color-mix(in srgb, var(--cm-ok) 12%, transparent);color:var(--cm-ok);box-shadow:inset 3px 0 0 var(--cm-ok)}._367UGW_diffCell{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;vertical-align:top;padding:1px 6px}._367UGW_diffCellAdd{background:color-mix(in srgb, var(--cm-ok) 12%, transparent)}._367UGW_diffCellDel{background:color-mix(in srgb, var(--cm-error) 12%, transparent)}._367UGW_nextStepsGroup{margin-bottom:10px}._367UGW_nextStepsList{max-height:132px;overflow-y:auto}._367UGW_rollbackBox{border:1px solid var(--dsw-alias-border-l2);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-base);margin-bottom:10px;padding:8px 10px}._367UGW_statRow{flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}._367UGW_statRow:not(:last-child){margin-bottom:10px}._367UGW_consultSection{margin-top:10px}._367UGW_consultSection:first-of-type{margin-top:8px}._367UGW_consultSection ._367UGW_statRow{margin-top:0}._367UGW_hiddenFile{display:none}._367UGW_cliName,._367UGW_cliCommand{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--cm-fs-meta)}._367UGW_cliCommand{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}._367UGW_historyGroup{margin-bottom:12px}._367UGW_historyRow{border-bottom:.5px solid var(--dsw-alias-border-l2);font-size:var(--cm-fs-table);align-items:flex-start;gap:8px;padding:6px 8px;display:flex}._367UGW_historyRow:last-child{border-bottom:none}._367UGW_historyRowMain{flex:auto;min-width:0}._367UGW_historyMeta{flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:2px;display:flex}._367UGW_historySummary{overflow-wrap:anywhere;color:var(--dsw-alias-label-secondary);display:block}._367UGW_historyTime{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);flex:none;padding-top:1px}._367UGW_historySections{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary)}._367UGW_profileRow{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);margin-bottom:6px;padding:8px 12px}._367UGW_profileRow[data-selected]{border-color:var(--cm-accent);background:color-mix(in srgb, var(--cm-accent) 7%, transparent)}._367UGW_profileRowHeader{font-size:var(--cm-fs-table);align-items:center;gap:8px;display:flex}._367UGW_profileRowMain{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;font-weight:500;overflow:hidden}button._367UGW_profileRowMain{font:inherit;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:none;flex-direction:column;align-items:flex-start;gap:2px;padding:0;display:flex}._367UGW_profileRowTitle{align-items:center;gap:6px;min-width:0;max-width:100%;display:flex}._367UGW_profileRowName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._367UGW_profileRowMeta{max-width:100%;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-weight:400;display:block;overflow:hidden}._367UGW_detailLines{font-size:var(--cm-fs-meta);flex-direction:column;gap:2px;min-width:0;display:flex}button._367UGW_profileRowMain:hover{color:var(--cm-accent)}._367UGW_listHeaderRow{align-items:center;gap:8px;margin:0 0 8px;display:flex}._367UGW_listHeaderRow ._367UGW_groupLabel{margin-bottom:0}._367UGW_listHeaderRow ._367UGW_cellMeta{flex:auto;min-width:0}._367UGW_badgeRow{flex:none;align-items:center;gap:4px;display:inline-flex}._367UGW_actionRow[data-inline]{flex:none;margin:0}._367UGW_aboutLinkRow{flex-wrap:wrap;align-items:center;gap:8px;display:flex}._367UGW_aboutAuthor{font-size:var(--cm-fs-base);color:var(--cm-accent);overflow-wrap:anywhere;font-weight:600;text-decoration:none}._367UGW_aboutAuthor:hover{text-decoration:underline}._367UGW_aboutAuthor:focus-visible{outline:var(--cm-focus-width) solid var(--cm-focus-color);outline-offset:1px;border-radius:var(--cm-r-1)}._367UGW_consultDimension{border-bottom:.5px solid var(--dsw-alias-border-l2);font-size:var(--cm-fs-table);padding:6px 0}._367UGW_consultDimension:last-child{border-bottom:none}._367UGW_severityError{color:var(--cm-error);font-weight:600}._367UGW_viewBody{gap:10px}._367UGW_viewBody>*{margin-bottom:0}._367UGW_viewBody>._367UGW_statRow{margin-top:0;margin-bottom:0}._367UGW_viewBody:after{content:\"\";flex:none;height:8px}@media (width<=900px){._367UGW_secretFields{grid-template-columns:1fr}._367UGW_pagePad{padding:10px 12px 12px}}._367UGW_marketReviewPage{flex-direction:column;flex:1 0 auto;gap:10px;min-height:200px;display:flex}._367UGW_marketReviewPage ._367UGW_pickerRoot{flex:auto}._367UGW_marketReviewScroll,._367UGW_marketReviewPage ._367UGW_pickerList{scrollbar-gutter:stable;flex:auto;min-height:200px;max-height:800px;overflow:auto}._367UGW_marketReviewScroll{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-base);padding:6px 10px}@media (prefers-reduced-motion:reduce){._367UGW_toast,._367UGW_statusDot[data-pulse],._367UGW_pagePad,._367UGW_dialogMask,._367UGW_dialogContentCenter,._367UGW_snapshotList>*,._367UGW_dataTable tbody tr,._367UGW_viewEnter,._367UGW_pickerOverlay,._367UGW_pickerUnit,._367UGW_banner,._367UGW_empty{animation:none}._367UGW_statusDot,._367UGW_stepperDot,._367UGW_stepperLabel{transition:none}._367UGW_selectMenu,._367UGW_selectChevron{transition:none;animation:none}._367UGW_artifactDetailWrap,._367UGW_artifactDetailWrap>*{transition:none}._367UGW_dialogMask[data-state=closed],._367UGW_dialogContentCenter[data-state=closed],._367UGW_restorePlan,._367UGW_infoHintBubble{animation:none}._367UGW_collapse{transition:none}._367UGW_skeletonBar{background-image:none;animation:none}}._367UGW_sourceList{flex-direction:column;gap:6px;margin-bottom:10px;display:flex}._367UGW_sourceRow{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);align-items:flex-start;gap:8px;min-width:0;padding:8px 10px;display:flex}._367UGW_sourceRow[data-selected]{border-color:var(--cm-accent);background:color-mix(in srgb, var(--cm-accent) 7%, transparent)}._367UGW_sourceRow[data-disabled]{opacity:.7}._367UGW_sourceRowMain{flex:auto;min-width:0}._367UGW_sourceRowHead{align-items:center;gap:8px;min-width:0;display:flex}._367UGW_sourceRowName{font-size:var(--cm-fs-table);color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-weight:600;overflow:hidden}._367UGW_sourceRowHead>:not(._367UGW_sourceRowName){flex:none}._367UGW_sourcePaths{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;margin-top:4px;line-height:1.5;display:block}._367UGW_skipList{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);flex-direction:column;gap:4px;margin:6px 0 0;padding:0;display:flex}._367UGW_skipRow{flex-wrap:wrap;align-items:baseline;gap:6px;min-width:0;display:flex}._367UGW_skipCode{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:var(--cm-fs-meta);border-radius:var(--cm-r-1);background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 12%, transparent);color:var(--dsw-alias-label-secondary);white-space:nowrap;flex:none;padding:1px 4px}._367UGW_skipText{overflow-wrap:anywhere;flex:auto;min-width:0}._367UGW_skipMeta{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none}._367UGW_chatEntryScope{--cm-text-1:var(--dsw-alias-label-primary);--cm-text-3:var(--dsw-alias-label-tertiary);--cm-surface-2:var(--dsw-alias-bg-layer-2);--cm-chat-bubble:var(--dsw-specific-bubble,color-mix(in srgb, var(--cm-text-1) 12%, transparent));--cm-line-1:var(--dsw-alias-border-l1);--cm-line-2:var(--dsw-alias-border-l2);--cm-fs-meta:11px;--cm-fs-base:var(--dsh-content-font-size,14px);--cm-lh-base:calc(22px + var(--dsh-content-font-delta,0px));--cm-text-2:var(--dsw-alias-label-secondary);--cm-r-chat:var(--dsw-radius-xl,20px);--cm-r-act:var(--dsw-radius-sm,8px);--cm-chat-card-bg:var(--dsw-specific-input-major,transparent);--cm-chat-hover-bg:var(--dsw-alias-interactive-bg-hover,var(--cm-line-1));--cm-fs-second:var(--dsh-content-font-size-secondary,13px);--cm-lh-second:calc(24px + var(--dsh-content-font-delta,0px));--cm-lh-ref:calc(18px + var(--dsh-content-font-delta-secondary,0px));--cm-fs-card:14px;--cm-lh-card:22px;--cm-lh-meta:15px;--cm-chat-action:calc(28px + var(--dsh-content-font-delta,0px));--cm-chat-glyph:calc(15px + var(--dsh-content-font-delta,0px));--cm-sp-2:4px;--cm-sp-3:6px;--cm-sp-4:8px;--cm-sp-5:10px;--cm-sp-6:12px;--cm-sp-8:16px;--cm-r-2:6px;--cm-r-3:8px;min-width:0;color:var(--cm-text-1);font-size:var(--cm-fs-base);line-height:var(--cm-lh-base);display:block}._367UGW_chatEntryRow{align-items:flex-end;gap:var(--cm-sp-3);flex-direction:column;display:flex}._367UGW_chatEntryStack{align-items:flex-end;gap:var(--cm-sp-4);min-width:0;max-width:min(calc(var(--dsh-chat-content-width,748px) * .702), 82%);flex-direction:column;display:flex}._367UGW_chatBubble{max-width:100%;padding:var(--cm-sp-5) var(--cm-sp-8);border-radius:var(--cm-r-chat);background:var(--cm-chat-bubble);color:var(--cm-text-1);white-space:pre-wrap;word-break:break-word}._367UGW_chatBubbleText{white-space:pre-wrap;word-break:break-word}._367UGW_chatFallbackBubble{border-left:2px solid var(--cm-text-1)}._367UGW_chatAttachmentRow{justify-content:flex-end;gap:var(--cm-sp-4);flex-wrap:wrap;max-width:100%;display:flex}._367UGW_chatFileCard{align-items:center;gap:var(--cm-sp-5);box-sizing:border-box;width:240px;min-height:64px;padding:var(--cm-sp-4) var(--cm-sp-6);border:.5px solid var(--cm-line-2);border-radius:var(--cm-r-chat);background:var(--cm-chat-card-bg);flex:0 0 240px;display:inline-flex}._367UGW_chatFileIcon{flex:none;width:28px;height:28px}._367UGW_chatFileContent{flex-direction:column;flex:1;min-width:0;display:flex}._367UGW_chatFileExt{border-radius:var(--cm-r-2);background:var(--cm-line-1);min-width:28px;height:28px;color:var(--cm-text-1);font-size:var(--cm-fs-meta);letter-spacing:.02em;flex:none;justify-content:center;align-items:center;display:inline-flex}._367UGW_chatFileName{color:var(--cm-text-1);font-size:var(--cm-fs-card);font-weight:500;line-height:var(--cm-lh-card);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._367UGW_chatFileMeta{color:var(--cm-text-3);font-size:12px;line-height:var(--cm-lh-meta);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._367UGW_chatRawBlock{font-size:var(--cm-fs-meta);color:var(--cm-text-3)}._367UGW_chatRawSummary{cursor:pointer}._367UGW_chatRawPre{max-height:220px;margin:var(--cm-sp-2) 0 0;padding:var(--cm-sp-3);border-radius:var(--cm-r-2);background:var(--cm-surface-2);color:var(--cm-text-3);white-space:pre-wrap;word-break:break-all;overflow:auto}._367UGW_chatEntryActions{align-items:center;gap:var(--cm-sp-4);height:var(--cm-chat-action);margin-top:var(--cm-sp-2);margin-left:calc(-1 * var(--cm-sp-3));display:flex}._367UGW_chatEntryTime{color:var(--cm-text-3);font-size:var(--cm-fs-second);line-height:var(--cm-lh-second);white-space:nowrap;padding-right:var(--cm-sp-6)}._367UGW_chatEntryNotice{max-width:min(calc(var(--dsh-chat-content-width,748px) * .702), 82%);color:var(--cm-text-3);font-size:var(--cm-fs-meta)}._367UGW_chatEntryReference{color:var(--cm-text-3);font-size:var(--cm-fs-second);line-height:var(--cm-lh-ref)}._367UGW_chatActionBtn{width:var(--cm-chat-action);height:var(--cm-chat-action);padding:var(--cm-sp-3);border-radius:var(--cm-r-act);color:var(--cm-text-3);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;display:inline-flex}._367UGW_chatActionBtn svg{width:var(--cm-chat-glyph);height:var(--cm-chat-glyph)}._367UGW_chatActionBtn:hover{background:var(--cm-chat-hover-bg);color:var(--cm-text-2)}@media (hover:hover){:is([data-chat-flow-kind=user],[data-chat-flow-kind=steering]):has(~:is([data-chat-flow-kind=user],[data-chat-flow-kind=steering])) ._367UGW_chatEntryActions{opacity:0;transition:opacity var(--cm-motion-fast)}:is([data-chat-flow-kind=user],[data-chat-flow-kind=steering]):has(~:is([data-chat-flow-kind=user],[data-chat-flow-kind=steering])):hover ._367UGW_chatEntryActions,:is([data-chat-flow-kind=user],[data-chat-flow-kind=steering]):has(~:is([data-chat-flow-kind=user],[data-chat-flow-kind=steering])):focus-within ._367UGW_chatEntryActions{opacity:1}}._367UGW_chatActionBtn:disabled{color:var(--cm-text-3);opacity:.5;cursor:not-allowed}._367UGW_rollbackFileList{margin-top:var(--cm-sp-2);flex-direction:column;display:flex}._367UGW_rollbackFileRow{align-items:center;gap:var(--cm-sp-3);padding:var(--cm-sp-3) 0 var(--cm-sp-3) var(--cm-sp-2);grid-template-columns:auto minmax(0,1fr) auto;display:grid;position:relative}._367UGW_rollbackFileRow:before{content:\"\";left:0;top:var(--cm-sp-2);bottom:var(--cm-sp-2);background:var(--cm-info);width:2px;position:absolute}._367UGW_rollbackFileRow[data-kind=create]:before{background:var(--cm-ok)}._367UGW_rollbackFileRow[data-kind=delete]:before{background:var(--cm-error)}._367UGW_rollbackFileRow:not([data-kind]):before{display:none}._367UGW_rollbackFileIcon{flex:none;align-items:center;display:inline-flex}._367UGW_rollbackFilePath{min-width:0;color:var(--cm-text-1);font-size:var(--cm-fs-table);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}._367UGW_rollbackFileDir{color:var(--cm-text-3);transition:color var(--cm-motion-fast) ease}._367UGW_rollbackFileStat{justify-content:flex-end;justify-self:end;align-items:baseline;gap:var(--cm-sp-2);display:inline-flex}._367UGW_rollbackAdded{color:var(--cm-ok);font-size:var(--cm-fs-table);font-variant-numeric:tabular-nums;flex:none}._367UGW_rollbackRemoved{color:var(--cm-error);font-size:var(--cm-fs-table);font-variant-numeric:tabular-nums;flex:none}._367UGW_rollbackDeleted{color:var(--cm-error);font-size:var(--cm-fs-table);flex:none}._367UGW_rollbackFilePath:is(button){font:inherit;font-size:var(--cm-fs-table);color:var(--cm-text-1);text-align:left;cursor:pointer;transition:color var(--cm-motion-fast) ease;background:0 0;border:0;padding:0}._367UGW_rollbackFilePath:is(button):hover:not(:disabled),._367UGW_rollbackFilePath:is(button):focus-visible,._367UGW_rollbackFilePath:is(button):hover:not(:disabled) ._367UGW_rollbackFileDir,._367UGW_rollbackFilePath:is(button):focus-visible ._367UGW_rollbackFileDir{color:var(--cm-accent)}._367UGW_rollbackFilePath:is(button):disabled{color:var(--cm-text-1);cursor:not-allowed;opacity:.7}._367UGW_previewChoiceRow{justify-content:space-between;align-items:baseline;gap:var(--cm-sp-4);margin:0 0 var(--cm-sp-2);display:flex}._367UGW_previewScope{align-items:baseline;gap:var(--cm-sp-3);font-size:var(--cm-fs-meta);color:var(--cm-text-2);font-variant-numeric:tabular-nums;flex:none;display:inline-flex}._367UGW_previewScopeStats{align-items:baseline;gap:var(--cm-sp-3);display:inline-flex}._367UGW_previewScope[data-off=true] ._367UGW_previewScopeStats{color:var(--cm-text-3);opacity:.75}._367UGW_previewScopeOff{color:var(--cm-text-3)}._367UGW_inlineDiffBox{gap:var(--cm-sp-2);margin-top:var(--cm-sp-2);padding:var(--cm-sp-2);border:1px solid var(--cm-line-1);border-radius:var(--cm-r-2);flex-direction:column;display:flex}._367UGW_rollbackWarnings{flex-direction:column;gap:4px;margin-bottom:10px;display:flex}._367UGW_rollbackToolbar{align-items:center;gap:8px;margin-bottom:8px;display:flex}._367UGW_rollbackSummary{font-size:var(--cm-fs-table);color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-weight:600}._367UGW_rollbackScroll{padding:8px}._367UGW_rollbackGroup{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);flex-direction:column;flex:auto;gap:8px;min-height:0;padding:8px 10px;display:flex}._367UGW_rollbackGroupHead{border-bottom:1px solid var(--dsw-alias-border-l1);flex-wrap:wrap;align-items:center;gap:6px;padding-bottom:6px;display:flex}._367UGW_rollbackGroupTitle{font-size:var(--cm-fs-table);color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;font-weight:600}._367UGW_rollbackGroupUnit{text-overflow:ellipsis;white-space:nowrap;text-align:right;min-width:0;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);flex:auto;margin-left:auto;overflow:hidden}._367UGW_rollbackPoints{flex-direction:column;gap:6px;display:flex}._367UGW_rollbackPoint{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-base);border-left-width:2px;flex-direction:column;gap:4px;padding:8px 10px;display:flex}._367UGW_rollbackPoint[data-kind=auto]{border-left-color:var(--cm-ok)}._367UGW_rollbackPoint[data-kind=guard]{border-left-color:var(--cm-info)}._367UGW_rollbackPoint[data-kind=unknown]{border-left-color:var(--cm-text-3)}._367UGW_rollbackPointTop{flex-wrap:wrap;align-items:center;gap:6px;display:flex}._367UGW_rollbackPointTurn{font-size:var(--cm-fs-table);color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-weight:600}._367UGW_rollbackPointActions{flex:none;align-items:center;gap:6px;margin-left:auto;display:flex}._367UGW_rollbackPointMeta{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);flex-wrap:wrap;align-items:center;gap:6px;line-height:1.5;display:flex}._367UGW_rollbackMetaDot{color:var(--dsw-alias-label-tertiary);flex:none}._367UGW_rollbackLedger{align-items:stretch;gap:10px;height:340px;display:flex}._367UGW_rollbackSessions{flex-direction:column;flex:0 0 148px;gap:4px;height:100%;display:flex;overflow:auto}._367UGW_rollbackSessionItem{text-align:left;border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-2);background:var(--dsw-alias-bg-base);width:100%;color:var(--dsw-alias-label-secondary);cursor:pointer;flex-direction:column;gap:2px;padding:6px 8px;display:flex}._367UGW_rollbackSessionItem:hover{background:var(--dsw-alias-bg-layer-2)}._367UGW_rollbackSessionItem[data-active]{border-color:var(--cm-accent);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary)}._367UGW_rollbackSessionId{font-size:var(--cm-fs-table);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._367UGW_rollbackSessionMeta{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);align-items:center;gap:2px;line-height:1.5;display:flex}._367UGW_rollbackLedgerMain{flex-direction:column;flex:auto;gap:8px;min-width:0;height:100%;display:flex}._367UGW_rollbackPointsScroll{flex:auto;min-height:0;padding:8px;overflow:auto}._367UGW_rollbackPointNote{text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:100%;overflow:hidden}._367UGW_shHeaderTrailing{align-items:center;gap:8px;margin-left:auto;display:inline-flex}._367UGW_shHeaderTrailing~._367UGW_dialogClose{margin-left:0}._367UGW_shSummary{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);flex-direction:column;gap:10px;margin:0 0 10px;padding:12px 14px;display:flex}._367UGW_shMetrics{flex-wrap:wrap;align-items:flex-end;gap:8px 24px;display:flex}._367UGW_shMetric{flex-direction:column;gap:2px;min-width:0;display:flex}._367UGW_shMetricValue{font-size:var(--cm-fs-title);color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-weight:600;line-height:1.25}._367UGW_shMetricLabel{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary)}._367UGW_shMetric[data-tone=warn] ._367UGW_shMetricValue{color:var(--cm-warn)}._367UGW_shMetric[data-tone=ok] ._367UGW_shMetricValue{color:var(--cm-ok)}._367UGW_shSeverities{flex-wrap:wrap;align-items:center;gap:6px;display:flex}._367UGW_shSeverity{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:2px 8px;line-height:1.5;display:inline-flex}._367UGW_shSeverityCount{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-weight:600}._367UGW_shSeverity[data-severity=blocksStartup],._367UGW_shSeverity[data-severity=unloadable]{border-color:color-mix(in srgb, var(--cm-error) 45%, transparent)}._367UGW_shSeverity[data-severity=nextRequestFails],._367UGW_shSeverity[data-severity=invisible]{border-color:color-mix(in srgb, var(--cm-warn) 45%, transparent)}._367UGW_shNotes{border-top:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 60%, transparent);flex-direction:column;gap:4px;padding-top:8px;display:flex}._367UGW_shSectionHead{flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 10px;display:flex}._367UGW_shSectionHead ._367UGW_groupLabel{margin-bottom:0}._367UGW_shSectionTitle{font-size:var(--cm-fs-title);color:var(--dsw-alias-label-primary);font-weight:600;line-height:1.25}._367UGW_snapshotList._367UGW_shScroll{background:var(--dsw-alias-bg-base);padding:8px}._367UGW_shRow{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);border-left-width:2px;flex-direction:column;gap:4px;padding:8px 10px;display:flex}._367UGW_shRow[data-severity=blocksStartup],._367UGW_shRow[data-severity=unloadable]{border-left-color:var(--cm-error)}._367UGW_shRow[data-severity=nextRequestFails],._367UGW_shRow[data-severity=invisible]{border-left-color:var(--cm-warn)}._367UGW_shRow[data-severity=ok]{border-left-color:var(--cm-ok)}._367UGW_shRowTop{flex-wrap:wrap;align-items:center;gap:6px;display:flex}._367UGW_shRowId{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:var(--cm-fs-table);color:var(--dsw-alias-label-primary);flex:auto;font-weight:600;overflow:hidden}._367UGW_shRowActions{flex:none;align-items:center;gap:6px;margin-left:auto;display:flex}._367UGW_shRowMeta{font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-tertiary);flex-wrap:wrap;align-items:center;gap:6px;line-height:1.5;display:flex}._367UGW_shIssue{border-radius:var(--cm-r-1);background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 12%, transparent);color:var(--dsw-alias-label-secondary);align-items:center;padding:2px 6px;display:inline-flex}._367UGW_shRowFacts{white-space:nowrap;font-variant-numeric:tabular-nums;flex:none;margin-left:auto}._367UGW_shMetaDot{color:var(--dsw-alias-label-tertiary);flex:none}._367UGW_shLines{flex-direction:column;gap:4px;display:flex}._367UGW_shPanel{border:1px solid var(--dsw-alias-border-l2);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-base);margin:0 0 10px;padding:10px 12px}._367UGW_shPanelHead{flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:6px;display:flex}._367UGW_shPanelTitle{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:var(--cm-fs-table);color:var(--dsw-alias-label-primary);flex:auto;font-weight:600;overflow:hidden}._367UGW_shCommands{border:1px solid var(--dsw-alias-border-l1);border-radius:var(--cm-r-3);background:var(--dsw-alias-bg-layer-2);margin:0 0 10px;padding:0;list-style:none;overflow:hidden}._367UGW_shCommand{border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 50%, transparent);align-items:center;gap:8px;padding:8px 10px;display:flex}._367UGW_shCommand:last-child{border-bottom:none}._367UGW_shCommand code{overflow-wrap:anywhere;min-width:0;font-size:var(--cm-fs-meta);color:var(--dsw-alias-label-secondary);flex:auto}";
14447
14699
  const tagId = "dsh-config-manager/config-manager.module.css";
14448
14700
  if (typeof document !== "undefined" && document.querySelector("style[data-tag=\"dsh-config-manager/config-manager.module.css\"]") === null) {
14449
14701
  const tag = document.createElement("style");
@@ -14453,522 +14705,528 @@ if (typeof document !== "undefined" && document.querySelector("style[data-tag=\"
14453
14705
  document.head.appendChild(tag);
14454
14706
  }
14455
14707
  var config_manager_module_css_default = {
14456
- "progressIndeterminate": "_367UGW_progressIndeterminate",
14457
- "logFilterButton": "_367UGW_logFilterButton",
14458
- "runsOptionDesc": "_367UGW_runsOptionDesc",
14459
- "skeletonRoot": "_367UGW_skeletonRoot",
14460
- "navMore": "_367UGW_navMore",
14461
- "modeHint": "_367UGW_modeHint",
14462
- "activityCard": "_367UGW_activityCard",
14463
- "reportSectionRow": "_367UGW_reportSectionRow",
14464
- "snapshotRowFacts": "_367UGW_snapshotRowFacts",
14465
- "diffNoColW4": "_367UGW_diffNoColW4",
14466
- "pickerFooter": "_367UGW_pickerFooter",
14467
- "activityKind": "_367UGW_activityKind",
14468
- "statusPulse": "_367UGW_statusPulse",
14469
- "conflictDetail": "_367UGW_conflictDetail",
14470
- "conflictItem": "_367UGW_conflictItem",
14471
- "progressDetail": "_367UGW_progressDetail",
14472
- "reportHeadline": "_367UGW_reportHeadline",
14473
- "rollbackPoints": "_367UGW_rollbackPoints",
14708
+ "chatEntryActions": "_367UGW_chatEntryActions",
14709
+ "updateNotesLoading": "_367UGW_updateNotesLoading",
14710
+ "reportDetails": "_367UGW_reportDetails",
14711
+ "selectTrigger": "_367UGW_selectTrigger",
14712
+ "runsCardTime": "_367UGW_runsCardTime",
14713
+ "historyMeta": "_367UGW_historyMeta",
14714
+ "activityEmpty": "_367UGW_activityEmpty",
14715
+ "rollbackPointNote": "_367UGW_rollbackPointNote",
14716
+ "progressBar": "_367UGW_progressBar",
14717
+ "mono": "_367UGW_mono",
14718
+ "factCell": "_367UGW_factCell",
14719
+ "badgeHost": "_367UGW_badgeHost",
14720
+ "errorTitle": "_367UGW_errorTitle",
14721
+ "artifactActions": "_367UGW_artifactActions",
14722
+ "rollbackPointTurn": "_367UGW_rollbackPointTurn",
14723
+ "skeletonTitle": "_367UGW_skeletonTitle",
14724
+ "historyTime": "_367UGW_historyTime",
14725
+ "shRowId": "_367UGW_shRowId",
14726
+ "updateVersionArrow": "_367UGW_updateVersionArrow",
14727
+ "sectionTitle": "_367UGW_sectionTitle",
14728
+ "kvKey": "_367UGW_kvKey",
14729
+ "historyScroll": "_367UGW_historyScroll",
14730
+ "pickerModalBody": "_367UGW_pickerModalBody",
14731
+ "reportProblemRow": "_367UGW_reportProblemRow",
14732
+ "pickerMore": "_367UGW_pickerMore",
14733
+ "sourceRowMain": "_367UGW_sourceRowMain",
14734
+ "diffNoDel": "_367UGW_diffNoDel",
14735
+ "cellActions": "_367UGW_cellActions",
14736
+ "controlRow": "_367UGW_controlRow",
14737
+ "libraryFooter": "_367UGW_libraryFooter",
14738
+ "conflictId": "_367UGW_conflictId",
14739
+ "dialogCard": "_367UGW_dialogCard",
14740
+ "sparseFill": "_367UGW_sparseFill",
14741
+ "errorLine": "_367UGW_errorLine",
14742
+ "chatFileMeta": "_367UGW_chatFileMeta",
14743
+ "groupItems": "_367UGW_groupItems",
14744
+ "navMoreRoot": "_367UGW_navMoreRoot",
14745
+ "modeTabs": "_367UGW_modeTabs",
14746
+ "runsSummary": "_367UGW_runsSummary",
14747
+ "errorReason": "_367UGW_errorReason",
14474
14748
  "severityError": "_367UGW_severityError",
14475
- "rollbackGroupTitle": "_367UGW_rollbackGroupTitle",
14476
- "progressMeta": "_367UGW_progressMeta",
14477
- "progressBlock": "_367UGW_progressBlock",
14749
+ "chatEntryRow": "_367UGW_chatEntryRow",
14750
+ "selectOptionLabel": "_367UGW_selectOptionLabel",
14751
+ "diffFileStat": "_367UGW_diffFileStat",
14752
+ "progressBadgeCount": "_367UGW_progressBadgeCount",
14753
+ "spinnerWrap": "_367UGW_spinnerWrap",
14754
+ "categoryName": "_367UGW_categoryName",
14755
+ "hint": "_367UGW_hint",
14478
14756
  "restorePlanNote": "_367UGW_restorePlanNote",
14479
- "shellMain": "_367UGW_shellMain",
14480
- "authorRow": "_367UGW_authorRow",
14481
- "marketFilterMeta": "_367UGW_marketFilterMeta",
14482
- "conflictLine": "_367UGW_conflictLine",
14483
- "chatActionBtn": "_367UGW_chatActionBtn",
14484
- "sectionSize": "_367UGW_sectionSize",
14485
- "shSeverityCount": "_367UGW_shSeverityCount",
14486
- "bannerSlot": "_367UGW_bannerSlot",
14487
- "paletteItemLabel": "_367UGW_paletteItemLabel",
14488
- "conflictPrefix": "_367UGW_conflictPrefix",
14757
+ "taskHead": "_367UGW_taskHead",
14758
+ "previewScopeStats": "_367UGW_previewScopeStats",
14759
+ "selectMenuPortal": "_367UGW_selectMenuPortal",
14760
+ "compositionViewport": "_367UGW_compositionViewport",
14761
+ "secretFields": "_367UGW_secretFields",
14762
+ "reportFooter": "_367UGW_reportFooter",
14763
+ "dialogHeader": "_367UGW_dialogHeader",
14764
+ "diffTable": "_367UGW_diffTable",
14765
+ "factGrid": "_367UGW_factGrid",
14766
+ "field": "_367UGW_field",
14767
+ "shRowActions": "_367UGW_shRowActions",
14489
14768
  "nextStepsGroup": "_367UGW_nextStepsGroup",
14490
- "rollbackPointsScroll": "_367UGW_rollbackPointsScroll",
14491
- "snapshotRow": "_367UGW_snapshotRow",
14492
- "groupNote": "_367UGW_groupNote",
14493
- "categoryItem": "_367UGW_categoryItem",
14494
- "dim": "_367UGW_dim",
14769
+ "sectionSubtitle": "_367UGW_sectionSubtitle",
14770
+ "rollbackWarnings": "_367UGW_rollbackWarnings",
14771
+ "conflictDetail": "_367UGW_conflictDetail",
14772
+ "restorePlanPath": "_367UGW_restorePlanPath",
14773
+ "sectionName": "_367UGW_sectionName",
14774
+ "rollbackFileIcon": "_367UGW_rollbackFileIcon",
14775
+ "shMetrics": "_367UGW_shMetrics",
14776
+ "shSectionTitle": "_367UGW_shSectionTitle",
14777
+ "profileRowHeader": "_367UGW_profileRowHeader",
14778
+ "artifactMeta": "_367UGW_artifactMeta",
14779
+ "shCommands": "_367UGW_shCommands",
14780
+ "rollbackPoint": "_367UGW_rollbackPoint",
14781
+ "cellMain": "_367UGW_cellMain",
14782
+ "toastText": "_367UGW_toastText",
14783
+ "previewChoiceRow": "_367UGW_previewChoiceRow",
14784
+ "shRowTop": "_367UGW_shRowTop",
14785
+ "sectionOptionRow": "_367UGW_sectionOptionRow",
14495
14786
  "activityTime": "_367UGW_activityTime",
14496
- "runsCounts": "_367UGW_runsCounts",
14497
- "collapseInner": "_367UGW_collapseInner",
14498
- "stepperStep": "_367UGW_stepperStep",
14499
- "sparseFill": "_367UGW_sparseFill",
14500
- "diffHunkRow": "_367UGW_diffHunkRow",
14501
- "actionRowTop": "_367UGW_actionRowTop",
14502
- "navMeasure": "_367UGW_navMeasure",
14503
- "diffStatAdd": "_367UGW_diffStatAdd",
14504
- "selectMenu": "_367UGW_selectMenu",
14505
- "paletteItemGroup": "_367UGW_paletteItemGroup",
14506
- "progressBadge": "_367UGW_progressBadge",
14507
- "rollbackFileStat": "_367UGW_rollbackFileStat",
14508
- "shPanelHead": "_367UGW_shPanelHead",
14787
+ "warnText": "_367UGW_warnText",
14788
+ "pickerOverlay": "_367UGW_pickerOverlay",
14789
+ "rollbackPointTop": "_367UGW_rollbackPointTop",
14790
+ "dim": "_367UGW_dim",
14509
14791
  "detailLines": "_367UGW_detailLines",
14510
- "sectionName": "_367UGW_sectionName",
14511
- "shRowId": "_367UGW_shRowId",
14512
- "progressBadgeSection": "_367UGW_progressBadgeSection",
14513
- "snapshotRowMain": "_367UGW_snapshotRowMain",
14514
- "rowActions": "_367UGW_rowActions",
14515
- "snapshotRowName": "_367UGW_snapshotRowName",
14792
+ "listHeaderRow": "_367UGW_listHeaderRow",
14793
+ "skeletonCards": "_367UGW_skeletonCards",
14794
+ "iconBtn": "_367UGW_iconBtn",
14795
+ "conflictHead": "_367UGW_conflictHead",
14516
14796
  "snapshotRowMeta": "_367UGW_snapshotRowMeta",
14517
- "updateVersionTarget": "_367UGW_updateVersionTarget",
14518
- "rollbackPointTop": "_367UGW_rollbackPointTop",
14519
- "skipMeta": "_367UGW_skipMeta",
14520
- "snapshotPickerHint": "_367UGW_snapshotPickerHint",
14521
- "pathValue": "_367UGW_pathValue",
14522
- "diffPane": "_367UGW_diffPane",
14523
- "headRow": "_367UGW_headRow",
14524
- "infoHintIn": "_367UGW_infoHintIn",
14525
- "activitySummary": "_367UGW_activitySummary",
14526
- "spinner": "_367UGW_spinner",
14527
- "kindTagWarn": "_367UGW_kindTagWarn",
14797
+ "diffPaneFill": "_367UGW_diffPaneFill",
14798
+ "chatBubbleText": "_367UGW_chatBubbleText",
14799
+ "conflictOptions": "_367UGW_conflictOptions",
14528
14800
  "libraryFilterCount": "_367UGW_libraryFilterCount",
14529
- "badgeRow": "_367UGW_badgeRow",
14530
- "controlRow": "_367UGW_controlRow",
14531
- "sectionTitle": "_367UGW_sectionTitle",
14532
- "profileRowMeta": "_367UGW_profileRowMeta",
14533
- "rollbackPointMeta": "_367UGW_rollbackPointMeta",
14534
- "infoHintBtn": "_367UGW_infoHintBtn",
14535
- "artifactDetailWrap": "_367UGW_artifactDetailWrap",
14536
- "rollbackFileDir": "_367UGW_rollbackFileDir",
14537
- "factValue": "_367UGW_factValue",
14538
- "secretFields": "_367UGW_secretFields",
14539
- "iconBtn": "_367UGW_iconBtn",
14540
- "runsOption": "_367UGW_runsOption",
14541
- "chatEntryRow": "_367UGW_chatEntryRow",
14542
- "rollbackFileIcon": "_367UGW_rollbackFileIcon",
14543
- "planScroll": "_367UGW_planScroll",
14544
- "logEmpty": "_367UGW_logEmpty",
14545
- "rollbackPointTurn": "_367UGW_rollbackPointTurn",
14546
- "diffNoColW5": "_367UGW_diffNoColW5",
14547
- "cellTitle": "_367UGW_cellTitle",
14548
- "diskUsageScroll": "_367UGW_diskUsageScroll",
14549
- "snapshotPickerRow": "_367UGW_snapshotPickerRow",
14550
- "reportFooter": "_367UGW_reportFooter",
14551
- "shRowFacts": "_367UGW_shRowFacts",
14552
- "radioLabel": "_367UGW_radioLabel",
14553
- "runsWarnNote": "_367UGW_runsWarnNote",
14554
- "diffCell": "_367UGW_diffCell",
14555
- "shSectionTitle": "_367UGW_shSectionTitle",
14556
- "historyScroll": "_367UGW_historyScroll",
14557
- "artifactRow": "_367UGW_artifactRow",
14558
- "tableWrap": "_367UGW_tableWrap",
14559
- "reportText": "_367UGW_reportText",
14560
- "groupItems": "_367UGW_groupItems",
14561
- "toastGlyph": "_367UGW_toastGlyph",
14562
- "restorePlanRowStatic": "_367UGW_restorePlanRowStatic",
14563
- "diffNoColW6": "_367UGW_diffNoColW6",
14564
- "historySections": "_367UGW_historySections",
14565
- "snapshotRowIssues": "_367UGW_snapshotRowIssues",
14801
+ "reportProblemReason": "_367UGW_reportProblemReason",
14566
14802
  "reasonList": "_367UGW_reasonList",
14567
- "marketReviewPage": "_367UGW_marketReviewPage",
14568
- "diffFilePath": "_367UGW_diffFilePath",
14569
- "logJumpButton": "_367UGW_logJumpButton",
14570
- "rollbackFilePath": "_367UGW_rollbackFilePath",
14571
- "shMetricLabel": "_367UGW_shMetricLabel",
14572
- "dialogWide": "_367UGW_dialogWide",
14573
- "copyBtn": "_367UGW_copyBtn",
14574
- "shLines": "_367UGW_shLines",
14575
14803
  "rollbackTabIcon": "_367UGW_rollbackTabIcon",
14576
- "activityHeader": "_367UGW_activityHeader",
14577
- "shNotes": "_367UGW_shNotes",
14578
- "runsLogTail": "_367UGW_runsLogTail",
14579
- "snapshotList": "_367UGW_snapshotList",
14580
- "pickerUnitDetail": "_367UGW_pickerUnitDetail",
14581
- "kvValue": "_367UGW_kvValue",
14582
- "maskIn": "_367UGW_maskIn",
14583
- "resultScroll": "_367UGW_resultScroll",
14584
- "noticeLine": "_367UGW_noticeLine",
14585
- "rollbackBox": "_367UGW_rollbackBox",
14586
- "shHeaderTrailing": "_367UGW_shHeaderTrailing",
14587
- "shRowMeta": "_367UGW_shRowMeta",
14588
- "pickerSubgroupName": "_367UGW_pickerSubgroupName",
14589
- "errorLine": "_367UGW_errorLine",
14590
- "diffNoDel": "_367UGW_diffNoDel",
14591
- "chatEntryStack": "_367UGW_chatEntryStack",
14592
- "shellContent": "_367UGW_shellContent",
14593
- "paletteGroup": "_367UGW_paletteGroup",
14594
- "libraryListState": "_367UGW_libraryListState",
14595
- "sectionOptionRow": "_367UGW_sectionOptionRow",
14596
- "activityResultOk": "_367UGW_activityResultOk",
14597
- "dialogOut": "_367UGW_dialogOut",
14598
- "confirmScroll": "_367UGW_confirmScroll",
14599
- "skeletonBlock": "_367UGW_skeletonBlock",
14600
- "pickerChevronSpacer": "_367UGW_pickerChevronSpacer",
14601
- "logPanel": "_367UGW_logPanel",
14804
+ "shMetric": "_367UGW_shMetric",
14805
+ "warnList": "_367UGW_warnList",
14806
+ "sourceList": "_367UGW_sourceList",
14807
+ "skipList": "_367UGW_skipList",
14808
+ "diffFilePath": "_367UGW_diffFilePath",
14602
14809
  "collapse": "_367UGW_collapse",
14603
- "skipText": "_367UGW_skipText",
14604
- "libraryFilter": "_367UGW_libraryFilter",
14810
+ "categoryDesc": "_367UGW_categoryDesc",
14811
+ "navMore": "_367UGW_navMore",
14812
+ "progressBlock": "_367UGW_progressBlock",
14813
+ "collapseInner": "_367UGW_collapseInner",
14814
+ "rollbackDeleted": "_367UGW_rollbackDeleted",
14815
+ "diffPane": "_367UGW_diffPane",
14816
+ "conflictLine": "_367UGW_conflictLine",
14817
+ "runsOption": "_367UGW_runsOption",
14818
+ "diffCell": "_367UGW_diffCell",
14819
+ "restorePlanRow": "_367UGW_restorePlanRow",
14820
+ "confirmItemHead": "_367UGW_confirmItemHead",
14821
+ "statusAction": "_367UGW_statusAction",
14822
+ "profileRowMain": "_367UGW_profileRowMain",
14823
+ "badgeRow": "_367UGW_badgeRow",
14824
+ "reportView": "_367UGW_reportView",
14825
+ "skipRow": "_367UGW_skipRow",
14605
14826
  "reportList": "_367UGW_reportList",
14606
- "errorAction": "_367UGW_errorAction",
14607
- "rollbackGroupUnit": "_367UGW_rollbackGroupUnit",
14608
- "rollbackGroupHead": "_367UGW_rollbackGroupHead",
14609
- "profileRowHeader": "_367UGW_profileRowHeader",
14610
- "artifactRowHead": "_367UGW_artifactRowHead",
14611
- "shRow": "_367UGW_shRow",
14612
- "choiceTitle": "_367UGW_choiceTitle",
14613
- "sectionSubtitle": "_367UGW_sectionSubtitle",
14614
- "errorItem": "_367UGW_errorItem",
14615
- "modeTabs": "_367UGW_modeTabs",
14616
- "fillCard": "_367UGW_fillCard",
14617
- "pickerSubgroup": "_367UGW_pickerSubgroup",
14618
- "toastViewport": "_367UGW_toastViewport",
14619
- "shSectionHead": "_367UGW_shSectionHead",
14620
- "rollbackSummary": "_367UGW_rollbackSummary",
14621
- "reportScroll": "_367UGW_reportScroll",
14622
- "pagePad": "_367UGW_pagePad",
14623
- "progressBarFailed": "_367UGW_progressBarFailed",
14624
- "sectionRow": "_367UGW_sectionRow",
14625
- "errorList": "_367UGW_errorList",
14827
+ "reportProblemHead": "_367UGW_reportProblemHead",
14828
+ "librarySearch": "_367UGW_librarySearch",
14829
+ "reportBody": "_367UGW_reportBody",
14830
+ "diffFileHead": "_367UGW_diffFileHead",
14831
+ "statusMeta": "_367UGW_statusMeta",
14832
+ "pathOld": "_367UGW_pathOld",
14833
+ "navActions": "_367UGW_navActions",
14834
+ "taskPanel": "_367UGW_taskPanel",
14835
+ "diffStatTotal": "_367UGW_diffStatTotal",
14836
+ "progressMeta": "_367UGW_progressMeta",
14626
14837
  "toast": "_367UGW_toast",
14627
- "diffNoColW3": "_367UGW_diffNoColW3",
14628
- "taskPanelIn": "_367UGW_taskPanelIn",
14629
- "taskHead": "_367UGW_taskHead",
14838
+ "logEmpty": "_367UGW_logEmpty",
14630
14839
  "inlineDiffBox": "_367UGW_inlineDiffBox",
14631
- "kvKey": "_367UGW_kvKey",
14840
+ "shellMain": "_367UGW_shellMain",
14841
+ "skipMeta": "_367UGW_skipMeta",
14842
+ "profileRowMeta": "_367UGW_profileRowMeta",
14843
+ "dialogBody": "_367UGW_dialogBody",
14632
14844
  "cliName": "_367UGW_cliName",
14633
- "conflictOptions": "_367UGW_conflictOptions",
14634
- "pickerAction": "_367UGW_pickerAction",
14635
- "navActions": "_367UGW_navActions",
14636
- "pathIssueKind": "_367UGW_pathIssueKind",
14637
- "pathRow": "_367UGW_pathRow",
14638
- "cellMetaNoteText": "_367UGW_cellMetaNoteText",
14639
14845
  "wizardStepperRow": "_367UGW_wizardStepperRow",
14640
- "runsSummary": "_367UGW_runsSummary",
14641
- "errorFooter": "_367UGW_errorFooter",
14642
- "reportBlock": "_367UGW_reportBlock",
14643
- "shCommands": "_367UGW_shCommands",
14644
- "choiceCard": "_367UGW_choiceCard",
14645
- "logHeader": "_367UGW_logHeader",
14646
- "reportProblemHead": "_367UGW_reportProblemHead",
14846
+ "maskIn": "_367UGW_maskIn",
14847
+ "consultDimension": "_367UGW_consultDimension",
14848
+ "progressTrack": "_367UGW_progressTrack",
14849
+ "historyGroup": "_367UGW_historyGroup",
14850
+ "statusBar": "_367UGW_statusBar",
14851
+ "rollbackSummary": "_367UGW_rollbackSummary",
14852
+ "badge": "_367UGW_badge",
14853
+ "toastViewport": "_367UGW_toastViewport",
14854
+ "statSegDim": "_367UGW_statSegDim",
14855
+ "rollbackFileRow": "_367UGW_rollbackFileRow",
14856
+ "restorePlanList": "_367UGW_restorePlanList",
14857
+ "authorRow": "_367UGW_authorRow",
14858
+ "diffStatDel": "_367UGW_diffStatDel",
14647
14859
  "cliCommand": "_367UGW_cliCommand",
14648
- "chatFileMeta": "_367UGW_chatFileMeta",
14649
- "noticeSlot": "_367UGW_noticeSlot",
14650
- "shSummary": "_367UGW_shSummary",
14651
- "sourceRowMain": "_367UGW_sourceRowMain",
14652
- "stepperDot": "_367UGW_stepperDot",
14653
- "skipRow": "_367UGW_skipRow",
14654
- "primaryButton": "_367UGW_primaryButton",
14655
- "logLine": "_367UGW_logLine",
14656
- "activitySummaryText": "_367UGW_activitySummaryText",
14657
- "navDot": "_367UGW_navDot",
14658
- "spinnerArc": "_367UGW_spinnerArc",
14659
- "fieldLabel": "_367UGW_fieldLabel",
14660
- "statusIndeterminate": "_367UGW_statusIndeterminate",
14661
- "num": "_367UGW_num",
14662
- "runsCardActions": "_367UGW_runsCardActions",
14663
- "marketFilterGrid": "_367UGW_marketFilterGrid",
14664
- "logDetail": "_367UGW_logDetail",
14665
- "restorePlanPath": "_367UGW_restorePlanPath",
14666
- "infoHintBubble": "_367UGW_infoHintBubble",
14667
- "activityRows": "_367UGW_activityRows",
14668
- "statusAction": "_367UGW_statusAction",
14860
+ "restorePlan": "_367UGW_restorePlan",
14861
+ "marketReviewPage": "_367UGW_marketReviewPage",
14862
+ "kvValue": "_367UGW_kvValue",
14863
+ "rollbackMetaDot": "_367UGW_rollbackMetaDot",
14864
+ "snapshotRow": "_367UGW_snapshotRow",
14669
14865
  "shCommand": "_367UGW_shCommand",
14670
- "artifactDetailInner": "_367UGW_artifactDetailInner",
14671
- "errorBanner": "_367UGW_errorBanner",
14672
- "paletteEmpty": "_367UGW_paletteEmpty",
14673
- "artifactBadges": "_367UGW_artifactBadges",
14674
- "runsOptionTitle": "_367UGW_runsOptionTitle",
14675
- "nextStepsList": "_367UGW_nextStepsList",
14676
- "statusTask": "_367UGW_statusTask",
14866
+ "progressBadgeSection": "_367UGW_progressBadgeSection",
14867
+ "pathRow": "_367UGW_pathRow",
14868
+ "diffNoColW4": "_367UGW_diffNoColW4",
14869
+ "shScroll": "_367UGW_shScroll",
14870
+ "taskPanelIn": "_367UGW_taskPanelIn",
14871
+ "errorFooter": "_367UGW_errorFooter",
14872
+ "logEntry": "_367UGW_logEntry",
14873
+ "statusDot": "_367UGW_statusDot",
14874
+ "viewBody": "_367UGW_viewBody",
14875
+ "skeletonRoot": "_367UGW_skeletonRoot",
14876
+ "errorAction": "_367UGW_errorAction",
14877
+ "input": "_367UGW_input",
14878
+ "libraryListState": "_367UGW_libraryListState",
14879
+ "selectMenu": "_367UGW_selectMenu",
14880
+ "resultScroll": "_367UGW_resultScroll",
14881
+ "restorePlanChevron": "_367UGW_restorePlanChevron",
14882
+ "sourceRowName": "_367UGW_sourceRowName",
14883
+ "pathMappingList": "_367UGW_pathMappingList",
14884
+ "shMetricValue": "_367UGW_shMetricValue",
14885
+ "logScroll": "_367UGW_logScroll",
14886
+ "runsCardActions": "_367UGW_runsCardActions",
14887
+ "modeHint": "_367UGW_modeHint",
14888
+ "reportProblemText": "_367UGW_reportProblemText",
14889
+ "chatRawPre": "_367UGW_chatRawPre",
14890
+ "empty": "_367UGW_empty",
14891
+ "pageEnter": "_367UGW_pageEnter",
14892
+ "shSeverities": "_367UGW_shSeverities",
14893
+ "shPanel": "_367UGW_shPanel",
14894
+ "kindTagError": "_367UGW_kindTagError",
14895
+ "statRow": "_367UGW_statRow",
14896
+ "navStrip": "_367UGW_navStrip",
14897
+ "rollbackBox": "_367UGW_rollbackBox",
14898
+ "dialogFooter": "_367UGW_dialogFooter",
14677
14899
  "dialogBodyScroll": "_367UGW_dialogBodyScroll",
14678
- "groupHintRow": "_367UGW_groupHintRow",
14679
- "confirmItem": "_367UGW_confirmItem",
14680
- "libraryFilters": "_367UGW_libraryFilters",
14681
- "dialogHeaderRow": "_367UGW_dialogHeaderRow",
14682
- "diffCellAdd": "_367UGW_diffCellAdd",
14900
+ "activitySummaryText": "_367UGW_activitySummaryText",
14901
+ "taskTitle": "_367UGW_taskTitle",
14902
+ "groupHeader": "_367UGW_groupHeader",
14903
+ "optionsCard": "_367UGW_optionsCard",
14904
+ "logCounts": "_367UGW_logCounts",
14905
+ "statStrip": "_367UGW_statStrip",
14906
+ "chatFileExt": "_367UGW_chatFileExt",
14907
+ "rollbackScroll": "_367UGW_rollbackScroll",
14908
+ "shSeverityCount": "_367UGW_shSeverityCount",
14909
+ "cellMeta": "_367UGW_cellMeta",
14910
+ "statusProgress": "_367UGW_statusProgress",
14911
+ "libraryCount": "_367UGW_libraryCount",
14912
+ "statusTask": "_367UGW_statusTask",
14683
14913
  "sectionTitleRow": "_367UGW_sectionTitleRow",
14684
- "runsCenter": "_367UGW_runsCenter",
14685
- "pullScroll": "_367UGW_pullScroll",
14686
- "paletteHint": "_367UGW_paletteHint",
14687
- "reasonLine": "_367UGW_reasonLine",
14914
+ "banner": "_367UGW_banner",
14915
+ "statSeg": "_367UGW_statSeg",
14916
+ "aboutAuthor": "_367UGW_aboutAuthor",
14917
+ "skeletonTableRow": "_367UGW_skeletonTableRow",
14918
+ "conflictItem": "_367UGW_conflictItem",
14919
+ "confirmItem": "_367UGW_confirmItem",
14920
+ "logJumpButton": "_367UGW_logJumpButton",
14921
+ "dialogMask": "_367UGW_dialogMask",
14922
+ "shIssue": "_367UGW_shIssue",
14923
+ "pickerRoot": "_367UGW_pickerRoot",
14924
+ "rollbackSessions": "_367UGW_rollbackSessions",
14925
+ "artifactBadges": "_367UGW_artifactBadges",
14926
+ "runsLogTail": "_367UGW_runsLogTail",
14927
+ "selectLabel": "_367UGW_selectLabel",
14928
+ "runsLogLine": "_367UGW_runsLogLine",
14929
+ "kindTagInfo": "_367UGW_kindTagInfo",
14930
+ "pickerAction": "_367UGW_pickerAction",
14931
+ "dataTable": "_367UGW_dataTable",
14932
+ "runsOptionDesc": "_367UGW_runsOptionDesc",
14933
+ "reportHeadline": "_367UGW_reportHeadline",
14688
14934
  "pathNew": "_367UGW_pathNew",
14689
- "skipCode": "_367UGW_skipCode",
14690
- "badge": "_367UGW_badge",
14691
- "infoHint": "_367UGW_infoHint",
14692
- "diffPaneFill": "_367UGW_diffPaneFill",
14935
+ "indet": "_367UGW_indet",
14936
+ "skeletonCard": "_367UGW_skeletonCard",
14937
+ "skeletonCaption": "_367UGW_skeletonCaption",
14938
+ "spinnerTrack": "_367UGW_spinnerTrack",
14693
14939
  "conflictChoices": "_367UGW_conflictChoices",
14694
- "rollbackDeleted": "_367UGW_rollbackDeleted",
14695
- "artifactMeta": "_367UGW_artifactMeta",
14696
- "skeletonCards": "_367UGW_skeletonCards",
14697
- "chatEntryReference": "_367UGW_chatEntryReference",
14698
- "artifactExpand": "_367UGW_artifactExpand",
14699
- "kindTagError": "_367UGW_kindTagError",
14700
- "rollbackScroll": "_367UGW_rollbackScroll",
14701
- "emptySteps": "_367UGW_emptySteps",
14702
- "rollbackPoint": "_367UGW_rollbackPoint",
14703
- "chatFallbackBubble": "_367UGW_chatFallbackBubble",
14704
- "rollbackSessionItem": "_367UGW_rollbackSessionItem",
14705
- "shPanel": "_367UGW_shPanel",
14706
- "dangerButton": "_367UGW_dangerButton",
14707
- "chatRawPre": "_367UGW_chatRawPre",
14708
- "pickerRoot": "_367UGW_pickerRoot",
14709
- "shellNav": "_367UGW_shellNav",
14710
- "reportBody": "_367UGW_reportBody",
14711
- "profileRowName": "_367UGW_profileRowName",
14712
- "checkboxRow": "_367UGW_checkboxRow",
14713
- "progressPercent": "_367UGW_progressPercent",
14714
- "marketFilterSearch": "_367UGW_marketFilterSearch",
14715
- "historySummary": "_367UGW_historySummary",
14716
- "diffStatTotal": "_367UGW_diffStatTotal",
14717
- "runsCardTime": "_367UGW_runsCardTime",
14718
- "reportProblemText": "_367UGW_reportProblemText",
14719
- "statusText": "_367UGW_statusText",
14720
- "aboutAuthor": "_367UGW_aboutAuthor",
14721
- "profileRow": "_367UGW_profileRow",
14722
- "conflictLineValue": "_367UGW_conflictLineValue",
14723
- "paletteItem": "_367UGW_paletteItem",
14724
- "tableScroll": "_367UGW_tableScroll",
14725
- "dialogMask": "_367UGW_dialogMask",
14726
- "selectMenuPortal": "_367UGW_selectMenuPortal",
14727
- "libraryFooter": "_367UGW_libraryFooter",
14728
- "statHealthAction": "_367UGW_statHealthAction",
14729
- "selectChevron": "_367UGW_selectChevron",
14730
- "libraryCount": "_367UGW_libraryCount",
14731
- "syncChannelBody": "_367UGW_syncChannelBody",
14732
- "sourcePaths": "_367UGW_sourcePaths",
14733
- "dataTable": "_367UGW_dataTable",
14734
- "spinnerLabel": "_367UGW_spinnerLabel",
14735
- "skeletonTable": "_367UGW_skeletonTable",
14736
- "skeletonCard": "_367UGW_skeletonCard",
14737
- "chatEntryTime": "_367UGW_chatEntryTime",
14738
- "chatFileName": "_367UGW_chatFileName",
14739
- "kvRow": "_367UGW_kvRow",
14740
- "stepperLabel": "_367UGW_stepperLabel",
14741
- "restorePlan": "_367UGW_restorePlan",
14742
- "skipList": "_367UGW_skipList",
14743
- "updateNotesLoading": "_367UGW_updateNotesLoading",
14744
- "previewScopeOff": "_367UGW_previewScopeOff",
14745
- "spinnerTrack": "_367UGW_spinnerTrack",
14746
- "kindTag": "_367UGW_kindTag",
14940
+ "snapshotRowHeader": "_367UGW_snapshotRowHeader",
14941
+ "skeletonRow": "_367UGW_skeletonRow",
14942
+ "artifactRowHead": "_367UGW_artifactRowHead",
14943
+ "progressIndeterminate": "_367UGW_progressIndeterminate",
14944
+ "diffStatAdd": "_367UGW_diffStatAdd",
14945
+ "pickerToolbar": "_367UGW_pickerToolbar",
14946
+ "rollbackFileStat": "_367UGW_rollbackFileStat",
14747
14947
  "chatRawBlock": "_367UGW_chatRawBlock",
14748
- "selectTrigger": "_367UGW_selectTrigger",
14749
- "chatAttachmentRow": "_367UGW_chatAttachmentRow",
14750
- "dialogContentCenter": "_367UGW_dialogContentCenter",
14751
- "dialogIn": "_367UGW_dialogIn",
14752
- "viewBody": "_367UGW_viewBody",
14753
- "skeletonShimmer": "_367UGW_skeletonShimmer",
14754
- "statHealth": "_367UGW_statHealth",
14755
- "historyRowMain": "_367UGW_historyRowMain",
14756
- "updateVersionRow": "_367UGW_updateVersionRow",
14948
+ "snapshotList": "_367UGW_snapshotList",
14949
+ "rollbackRemoved": "_367UGW_rollbackRemoved",
14757
14950
  "runsOptionTag": "_367UGW_runsOptionTag",
14758
- "diffNo": "_367UGW_diffNo",
14759
- "selectOption": "_367UGW_selectOption",
14951
+ "toolRow": "_367UGW_toolRow",
14952
+ "toastGlyph": "_367UGW_toastGlyph",
14953
+ "artifactRow": "_367UGW_artifactRow",
14954
+ "rollbackLedger": "_367UGW_rollbackLedger",
14955
+ "radioLabel": "_367UGW_radioLabel",
14956
+ "checkboxRow": "_367UGW_checkboxRow",
14957
+ "progressDetail": "_367UGW_progressDetail",
14760
14958
  "runsSummaryTitle": "_367UGW_runsSummaryTitle",
14761
- "rollbackPointNote": "_367UGW_rollbackPointNote",
14762
- "restorePlanStat": "_367UGW_restorePlanStat",
14763
- "groupHeader": "_367UGW_groupHeader",
14959
+ "section": "_367UGW_section",
14960
+ "kindTagWarn": "_367UGW_kindTagWarn",
14961
+ "maskOut": "_367UGW_maskOut",
14962
+ "primaryButton": "_367UGW_primaryButton",
14963
+ "infoHintBubble": "_367UGW_infoHintBubble",
14964
+ "planScroll": "_367UGW_planScroll",
14965
+ "pickerSubgroup": "_367UGW_pickerSubgroup",
14966
+ "logPanel": "_367UGW_logPanel",
14967
+ "segGroup": "_367UGW_segGroup",
14968
+ "navMeasure": "_367UGW_navMeasure",
14969
+ "sectionSize": "_367UGW_sectionSize",
14970
+ "paletteHint": "_367UGW_paletteHint",
14971
+ "statusPulse": "_367UGW_statusPulse",
14972
+ "runsCenter": "_367UGW_runsCenter",
14973
+ "groupNote": "_367UGW_groupNote",
14974
+ "infoHintIn": "_367UGW_infoHintIn",
14975
+ "skipCode": "_367UGW_skipCode",
14976
+ "kvRow": "_367UGW_kvRow",
14977
+ "dialogWide": "_367UGW_dialogWide",
14978
+ "secretsList": "_367UGW_secretsList",
14979
+ "chatFileIcon": "_367UGW_chatFileIcon",
14980
+ "num": "_367UGW_num",
14981
+ "pickerGroup": "_367UGW_pickerGroup",
14982
+ "reportText": "_367UGW_reportText",
14983
+ "inspectGroup": "_367UGW_inspectGroup",
14984
+ "progressBarFailed": "_367UGW_progressBarFailed",
14985
+ "tableCompact": "_367UGW_tableCompact",
14986
+ "pullScroll": "_367UGW_pullScroll",
14987
+ "categoryItem": "_367UGW_categoryItem",
14988
+ "rollbackPointMeta": "_367UGW_rollbackPointMeta",
14989
+ "shPanelTitle": "_367UGW_shPanelTitle",
14990
+ "marketFilterGrid": "_367UGW_marketFilterGrid",
14991
+ "activitySummary": "_367UGW_activitySummary",
14992
+ "errorBanner": "_367UGW_errorBanner",
14993
+ "artifactTitle": "_367UGW_artifactTitle",
14994
+ "artifactDetailInner": "_367UGW_artifactDetailInner",
14995
+ "artifactDetailWrap": "_367UGW_artifactDetailWrap",
14996
+ "navDot": "_367UGW_navDot",
14997
+ "copyBtn": "_367UGW_copyBtn",
14998
+ "pickerList": "_367UGW_pickerList",
14999
+ "noticeLine": "_367UGW_noticeLine",
14764
15000
  "actionRow": "_367UGW_actionRow",
14765
- "dialogHeader": "_367UGW_dialogHeader",
14766
- "statStrip": "_367UGW_statStrip",
14767
- "conflictHead": "_367UGW_conflictHead",
14768
- "snapshotRowText": "_367UGW_snapshotRowText",
14769
- "statSeg": "_367UGW_statSeg",
14770
- "taskPanel": "_367UGW_taskPanel",
15001
+ "diffScroll": "_367UGW_diffScroll",
15002
+ "statusText": "_367UGW_statusText",
15003
+ "activityTitle": "_367UGW_activityTitle",
15004
+ "optionsRow": "_367UGW_optionsRow",
15005
+ "conflictList": "_367UGW_conflictList",
15006
+ "artifactMain": "_367UGW_artifactMain",
15007
+ "dialogContentCenter": "_367UGW_dialogContentCenter",
14771
15008
  "consultSection": "_367UGW_consultSection",
14772
- "spin": "_367UGW_spin",
14773
- "artifactName": "_367UGW_artifactName",
14774
- "runsCardTitle": "_367UGW_runsCardTitle",
14775
- "groupLabel": "_367UGW_groupLabel",
14776
- "logScroll": "_367UGW_logScroll",
14777
- "diffFileHead": "_367UGW_diffFileHead",
14778
- "diffStatDel": "_367UGW_diffStatDel",
14779
- "rollbackGroup": "_367UGW_rollbackGroup",
14780
- "factGrid": "_367UGW_factGrid",
14781
- "pickerUnitNested": "_367UGW_pickerUnitNested",
14782
- "diffTable": "_367UGW_diffTable",
14783
- "diffCellDel": "_367UGW_diffCellDel",
14784
- "profileRowTitle": "_367UGW_profileRowTitle",
14785
- "rollbackWarnings": "_367UGW_rollbackWarnings",
14786
- "indet": "_367UGW_indet",
14787
- "restorePlanList": "_367UGW_restorePlanList",
14788
- "kindTagOk": "_367UGW_kindTagOk",
14789
- "pickerUnitName": "_367UGW_pickerUnitName",
14790
- "shIssue": "_367UGW_shIssue",
14791
- "fillViewport": "_367UGW_fillViewport",
14792
- "sectionTitleBlock": "_367UGW_sectionTitleBlock",
14793
- "sourceRow": "_367UGW_sourceRow",
14794
- "diffNoAdd": "_367UGW_diffNoAdd",
14795
- "rollbackSessions": "_367UGW_rollbackSessions",
14796
- "reportDetails": "_367UGW_reportDetails",
14797
- "selectRoot": "_367UGW_selectRoot",
14798
- "artifactActions": "_367UGW_artifactActions",
14799
- "skeletonTableCell": "_367UGW_skeletonTableCell",
14800
- "toolRow": "_367UGW_toolRow",
15009
+ "shSectionHead": "_367UGW_shSectionHead",
15010
+ "runsCardHead": "_367UGW_runsCardHead",
15011
+ "spinner": "_367UGW_spinner",
15012
+ "chatRawSummary": "_367UGW_chatRawSummary",
15013
+ "bannerSlot": "_367UGW_bannerSlot",
15014
+ "card": "_367UGW_card",
15015
+ "tableFixed": "_367UGW_tableFixed",
15016
+ "diffGroupToggle": "_367UGW_diffGroupToggle",
15017
+ "progressLabel": "_367UGW_progressLabel",
15018
+ "rowActions": "_367UGW_rowActions",
15019
+ "reportWarningRow": "_367UGW_reportWarningRow",
15020
+ "conflictLineLabel": "_367UGW_conflictLineLabel",
15021
+ "resultFooter": "_367UGW_resultFooter",
15022
+ "consultScroll": "_367UGW_consultScroll",
15023
+ "errorItem": "_367UGW_errorItem",
15024
+ "chatEntryStack": "_367UGW_chatEntryStack",
15025
+ "runsOptionTitle": "_367UGW_runsOptionTitle",
15026
+ "shRowFacts": "_367UGW_shRowFacts",
15027
+ "nextStepsList": "_367UGW_nextStepsList",
15028
+ "confirmItemDesc": "_367UGW_confirmItemDesc",
15029
+ "updateVersionTarget": "_367UGW_updateVersionTarget",
15030
+ "rollbackLedgerMain": "_367UGW_rollbackLedgerMain",
15031
+ "spinnerLabel": "_367UGW_spinnerLabel",
15032
+ "chatEntryNotice": "_367UGW_chatEntryNotice",
15033
+ "viewEnter": "_367UGW_viewEnter",
15034
+ "diskUsageCard": "_367UGW_diskUsageCard",
15035
+ "paletteEmpty": "_367UGW_paletteEmpty",
15036
+ "taskBody": "_367UGW_taskBody",
15037
+ "paletteItem": "_367UGW_paletteItem",
15038
+ "logDetail": "_367UGW_logDetail",
14801
15039
  "sectionGrid": "_367UGW_sectionGrid",
14802
- "warnList": "_367UGW_warnList",
14803
15040
  "aboutLinkRow": "_367UGW_aboutLinkRow",
14804
- "consultDimension": "_367UGW_consultDimension",
14805
- "restorePlanChevron": "_367UGW_restorePlanChevron",
14806
- "skeletonLine": "_367UGW_skeletonLine",
14807
- "diffFileStat": "_367UGW_diffFileStat",
14808
- "field": "_367UGW_field",
14809
- "profileRowMain": "_367UGW_profileRowMain",
14810
- "chatEntryNotice": "_367UGW_chatEntryNotice",
14811
- "navStrip": "_367UGW_navStrip",
14812
- "factLabel": "_367UGW_factLabel",
14813
- "rollbackPointActions": "_367UGW_rollbackPointActions",
14814
- "pickerCount": "_367UGW_pickerCount",
14815
- "modeTab": "_367UGW_modeTab",
14816
- "historyRow": "_367UGW_historyRow",
14817
15041
  "rollbackFileList": "_367UGW_rollbackFileList",
15042
+ "rollbackPoints": "_367UGW_rollbackPoints",
15043
+ "infoHint": "_367UGW_infoHint",
15044
+ "rollbackAdded": "_367UGW_rollbackAdded",
15045
+ "modeTab": "_367UGW_modeTab",
15046
+ "errorList": "_367UGW_errorList",
15047
+ "skeletonTableCell": "_367UGW_skeletonTableCell",
15048
+ "segItem": "_367UGW_segItem",
15049
+ "shSeverity": "_367UGW_shSeverity",
15050
+ "artifactList": "_367UGW_artifactList",
15051
+ "cellTitle": "_367UGW_cellTitle",
15052
+ "sourcePaths": "_367UGW_sourcePaths",
15053
+ "chatEntryScope": "_367UGW_chatEntryScope",
15054
+ "pathValue": "_367UGW_pathValue",
15055
+ "chatEntryTime": "_367UGW_chatEntryTime",
14818
15056
  "rollbackSessionMeta": "_367UGW_rollbackSessionMeta",
14819
- "chatFileCard": "_367UGW_chatFileCard",
14820
- "shMetrics": "_367UGW_shMetrics",
14821
- "infoValue": "_367UGW_infoValue",
14822
- "progressBadgeCount": "_367UGW_progressBadgeCount",
14823
- "errorActionLabel": "_367UGW_errorActionLabel",
14824
- "activityRow": "_367UGW_activityRow",
14825
- "shScroll": "_367UGW_shScroll",
14826
- "pickerList": "_367UGW_pickerList",
14827
- "tableCompact": "_367UGW_tableCompact",
14828
- "navMoreRoot": "_367UGW_navMoreRoot",
14829
- "taskTitle": "_367UGW_taskTitle",
14830
- "stepper": "_367UGW_stepper",
14831
- "dialogCard": "_367UGW_dialogCard",
14832
- "paletteInput": "_367UGW_paletteInput",
14833
- "restorePlanRow": "_367UGW_restorePlanRow",
14834
- "previewChoiceRow": "_367UGW_previewChoiceRow",
14835
- "runsCardHead": "_367UGW_runsCardHead",
14836
- "pickerMore": "_367UGW_pickerMore",
14837
- "selectLabel": "_367UGW_selectLabel",
14838
- "section": "_367UGW_section",
14839
- "groupList": "_367UGW_groupList",
14840
- "segGroup": "_367UGW_segGroup",
14841
- "conflictLineLabel": "_367UGW_conflictLineLabel",
14842
- "historyMeta": "_367UGW_historyMeta",
14843
- "groupCard": "_367UGW_groupCard",
14844
- "sectionCount": "_367UGW_sectionCount",
14845
- "chatEntryActions": "_367UGW_chatEntryActions",
14846
- "shSeverities": "_367UGW_shSeverities",
14847
- "empty": "_367UGW_empty",
14848
- "skeletonTableRow": "_367UGW_skeletonTableRow",
14849
- "spinnerWrap": "_367UGW_spinnerWrap",
14850
- "hiddenFile": "_367UGW_hiddenFile",
14851
- "runsLogLine": "_367UGW_runsLogLine",
14852
- "shMetricValue": "_367UGW_shMetricValue",
14853
- "sourceList": "_367UGW_sourceList",
14854
- "conflictList": "_367UGW_conflictList",
14855
- "pickerModalBody": "_367UGW_pickerModalBody",
14856
- "pageEnter": "_367UGW_pageEnter",
14857
- "rollbackFileRow": "_367UGW_rollbackFileRow",
15057
+ "historySummary": "_367UGW_historySummary",
15058
+ "chatEntryReference": "_367UGW_chatEntryReference",
15059
+ "snapshotRowText": "_367UGW_snapshotRowText",
15060
+ "fieldLabel": "_367UGW_fieldLabel",
15061
+ "fillCard": "_367UGW_fillCard",
15062
+ "pickerUnitDetail": "_367UGW_pickerUnitDetail",
14858
15063
  "pickerTreeRow": "_367UGW_pickerTreeRow",
14859
- "resultFooter": "_367UGW_resultFooter",
14860
- "rollbackMetaDot": "_367UGW_rollbackMetaDot",
14861
- "statusBar": "_367UGW_statusBar",
15064
+ "chatFileName": "_367UGW_chatFileName",
15065
+ "shRow": "_367UGW_shRow",
15066
+ "cellMetaNoteText": "_367UGW_cellMetaNoteText",
15067
+ "chatActionBtn": "_367UGW_chatActionBtn",
15068
+ "groupLabel": "_367UGW_groupLabel",
15069
+ "progressBadge": "_367UGW_progressBadge",
15070
+ "paletteItemGroup": "_367UGW_paletteItemGroup",
15071
+ "skeletonShimmer": "_367UGW_skeletonShimmer",
15072
+ "stepperConnector": "_367UGW_stepperConnector",
15073
+ "dangerButton": "_367UGW_dangerButton",
15074
+ "marketFilterMeta": "_367UGW_marketFilterMeta",
15075
+ "sectionRow": "_367UGW_sectionRow",
14862
15076
  "skeletonBar": "_367UGW_skeletonBar",
14863
- "chatEntryScope": "_367UGW_chatEntryScope",
14864
- "itemEnter": "_367UGW_itemEnter",
14865
- "taskBody": "_367UGW_taskBody",
14866
- "rollbackLedgerMain": "_367UGW_rollbackLedgerMain",
14867
- "shRowTop": "_367UGW_shRowTop",
14868
- "selectMenuIn": "_367UGW_selectMenuIn",
14869
- "chatBubbleText": "_367UGW_chatBubbleText",
14870
- "shMetaDot": "_367UGW_shMetaDot",
14871
- "skeletonRow": "_367UGW_skeletonRow",
14872
- "cellMain": "_367UGW_cellMain",
14873
- "statSegDim": "_367UGW_statSegDim",
14874
- "errorReason": "_367UGW_errorReason",
14875
- "statusProgress": "_367UGW_statusProgress",
14876
- "progressBar": "_367UGW_progressBar",
14877
- "updateVersionArrow": "_367UGW_updateVersionArrow",
14878
- "pickerOverlay": "_367UGW_pickerOverlay",
14879
- "rollbackRemoved": "_367UGW_rollbackRemoved",
14880
- "skeletonCaption": "_367UGW_skeletonCaption",
14881
- "compositionViewport": "_367UGW_compositionViewport",
14882
- "logCounts": "_367UGW_logCounts",
14883
- "dialogFooter": "_367UGW_dialogFooter",
14884
- "categoryName": "_367UGW_categoryName",
14885
- "activityEmpty": "_367UGW_activityEmpty",
14886
- "warnText": "_367UGW_warnText",
14887
- "activityTitle": "_367UGW_activityTitle",
14888
- "pickerGroup": "_367UGW_pickerGroup",
14889
- "chatRawSummary": "_367UGW_chatRawSummary",
14890
- "categoryDesc": "_367UGW_categoryDesc",
14891
- "inspectGroup": "_367UGW_inspectGroup",
14892
- "shPanelTitle": "_367UGW_shPanelTitle",
14893
- "librarySearch": "_367UGW_librarySearch",
14894
- "cellActions": "_367UGW_cellActions",
14895
- "reportWarningRow": "_367UGW_reportWarningRow",
14896
- "previewScope": "_367UGW_previewScope",
14897
- "chatBubble": "_367UGW_chatBubble",
14898
- "reportProblemRow": "_367UGW_reportProblemRow",
15077
+ "paletteItemLabel": "_367UGW_paletteItemLabel",
15078
+ "choiceTitle": "_367UGW_choiceTitle",
15079
+ "sectionTitleBlock": "_367UGW_sectionTitleBlock",
15080
+ "chatFileContent": "_367UGW_chatFileContent",
14899
15081
  "statusSpacer": "_367UGW_statusSpacer",
14900
- "artifactList": "_367UGW_artifactList",
15082
+ "factValue": "_367UGW_factValue",
15083
+ "rollbackGroupHead": "_367UGW_rollbackGroupHead",
15084
+ "hiddenFile": "_367UGW_hiddenFile",
14901
15085
  "navTab": "_367UGW_navTab",
14902
- "skeletonTitle": "_367UGW_skeletonTitle",
14903
- "shRowActions": "_367UGW_shRowActions",
14904
- "diffNoHead": "_367UGW_diffNoHead",
15086
+ "groupHintRow": "_367UGW_groupHintRow",
15087
+ "reportBlock": "_367UGW_reportBlock",
15088
+ "rollbackFilePath": "_367UGW_rollbackFilePath",
15089
+ "shNotes": "_367UGW_shNotes",
15090
+ "pickerChildren": "_367UGW_pickerChildren",
15091
+ "logFilterButton": "_367UGW_logFilterButton",
15092
+ "skeletonBars": "_367UGW_skeletonBars",
15093
+ "pickerChevronSpacer": "_367UGW_pickerChevronSpacer",
15094
+ "pickerSubgroupName": "_367UGW_pickerSubgroupName",
15095
+ "sectionCount": "_367UGW_sectionCount",
15096
+ "pickerFooter": "_367UGW_pickerFooter",
15097
+ "snapshotPickerHint": "_367UGW_snapshotPickerHint",
15098
+ "pickerGroupTitle": "_367UGW_pickerGroupTitle",
15099
+ "spin": "_367UGW_spin",
15100
+ "statHealthAction": "_367UGW_statHealthAction",
15101
+ "diffCellAdd": "_367UGW_diffCellAdd",
15102
+ "rollbackSessionId": "_367UGW_rollbackSessionId",
15103
+ "tableScroll": "_367UGW_tableScroll",
15104
+ "selectRoot": "_367UGW_selectRoot",
15105
+ "profileRowName": "_367UGW_profileRowName",
15106
+ "sourceRow": "_367UGW_sourceRow",
15107
+ "itemEnter": "_367UGW_itemEnter",
15108
+ "shellContent": "_367UGW_shellContent",
15109
+ "historyRow": "_367UGW_historyRow",
15110
+ "chatFallbackBubble": "_367UGW_chatFallbackBubble",
15111
+ "previewScope": "_367UGW_previewScope",
15112
+ "rollbackPointsScroll": "_367UGW_rollbackPointsScroll",
15113
+ "pickerUnitName": "_367UGW_pickerUnitName",
15114
+ "infoValue": "_367UGW_infoValue",
15115
+ "logLine": "_367UGW_logLine",
15116
+ "reportScroll": "_367UGW_reportScroll",
15117
+ "groupCard": "_367UGW_groupCard",
14905
15118
  "activityBadge": "_367UGW_activityBadge",
14906
- "segItem": "_367UGW_segItem",
14907
- "reportProblemReason": "_367UGW_reportProblemReason",
14908
- "statusMeta": "_367UGW_statusMeta",
14909
- "ghostButton": "_367UGW_ghostButton",
14910
- "selectOptionLabel": "_367UGW_selectOptionLabel",
14911
- "conflictId": "_367UGW_conflictId",
14912
- "rollbackLedger": "_367UGW_rollbackLedger",
14913
- "paletteList": "_367UGW_paletteList",
14914
- "dialogClose": "_367UGW_dialogClose",
15119
+ "choiceCard": "_367UGW_choiceCard",
15120
+ "errorActionLabel": "_367UGW_errorActionLabel",
15121
+ "tableWrap": "_367UGW_tableWrap",
15122
+ "pickerUnitNested": "_367UGW_pickerUnitNested",
15123
+ "stepperDot": "_367UGW_stepperDot",
15124
+ "diffNoColW3": "_367UGW_diffNoColW3",
15125
+ "reportSectionRow": "_367UGW_reportSectionRow",
15126
+ "runsWarnNote": "_367UGW_runsWarnNote",
14915
15127
  "runsWarnNoteDetail": "_367UGW_runsWarnNoteDetail",
14916
- "formError": "_367UGW_formError",
14917
- "errorTitle": "_367UGW_errorTitle",
14918
- "mono": "_367UGW_mono",
14919
- "sourceRowName": "_367UGW_sourceRowName",
14920
- "artifactMain": "_367UGW_artifactMain",
14921
- "listHeaderRow": "_367UGW_listHeaderRow",
14922
- "hint": "_367UGW_hint",
14923
- "confirmItemHead": "_367UGW_confirmItemHead",
14924
- "historyTime": "_367UGW_historyTime",
15128
+ "snapshotRowName": "_367UGW_snapshotRowName",
15129
+ "actionRowTop": "_367UGW_actionRowTop",
15130
+ "libraryFilters": "_367UGW_libraryFilters",
15131
+ "artifactExpand": "_367UGW_artifactExpand",
15132
+ "fillViewport": "_367UGW_fillViewport",
15133
+ "shMetricLabel": "_367UGW_shMetricLabel",
15134
+ "skeletonLine": "_367UGW_skeletonLine",
15135
+ "noticeSlot": "_367UGW_noticeSlot",
15136
+ "chatFileCard": "_367UGW_chatFileCard",
15137
+ "rollbackGroup": "_367UGW_rollbackGroup",
15138
+ "conflictLineValue": "_367UGW_conflictLineValue",
15139
+ "pickerCount": "_367UGW_pickerCount",
15140
+ "diffNoHead": "_367UGW_diffNoHead",
15141
+ "restorePlanGroupHead": "_367UGW_restorePlanGroupHead",
15142
+ "selectOption": "_367UGW_selectOption",
15143
+ "statHealth": "_367UGW_statHealth",
15144
+ "pathIssueKind": "_367UGW_pathIssueKind",
15145
+ "pagePad": "_367UGW_pagePad",
15146
+ "snapshotRowBadges": "_367UGW_snapshotRowBadges",
15147
+ "shRowMeta": "_367UGW_shRowMeta",
15148
+ "toastIn": "_367UGW_toastIn",
14925
15149
  "rollbackToolbar": "_367UGW_rollbackToolbar",
14926
- "logEntry": "_367UGW_logEntry",
14927
- "previewScopeStats": "_367UGW_previewScopeStats",
14928
- "skeletonBars": "_367UGW_skeletonBars",
14929
- "tableFixed": "_367UGW_tableFixed",
15150
+ "factLabel": "_367UGW_factLabel",
15151
+ "dialogOut": "_367UGW_dialogOut",
15152
+ "paletteList": "_367UGW_paletteList",
15153
+ "spinnerArc": "_367UGW_spinnerArc",
15154
+ "dialogHeaderRow": "_367UGW_dialogHeaderRow",
15155
+ "syncChannelBody": "_367UGW_syncChannelBody",
15156
+ "snapshotRowFacts": "_367UGW_snapshotRowFacts",
15157
+ "logHeader": "_367UGW_logHeader",
15158
+ "shMetaDot": "_367UGW_shMetaDot",
15159
+ "selectMenuIn": "_367UGW_selectMenuIn",
15160
+ "historyRowMain": "_367UGW_historyRowMain",
15161
+ "libraryFilter": "_367UGW_libraryFilter",
15162
+ "profileRowTitle": "_367UGW_profileRowTitle",
15163
+ "emptySteps": "_367UGW_emptySteps",
15164
+ "kindTagOk": "_367UGW_kindTagOk",
15165
+ "formError": "_367UGW_formError",
14930
15166
  "marketReviewScroll": "_367UGW_marketReviewScroll",
14931
- "stepperConnector": "_367UGW_stepperConnector",
14932
- "progressLabel": "_367UGW_progressLabel",
14933
- "artifactTitle": "_367UGW_artifactTitle",
15167
+ "diffNoAdd": "_367UGW_diffNoAdd",
15168
+ "confirmScroll": "_367UGW_confirmScroll",
15169
+ "shellNav": "_367UGW_shellNav",
15170
+ "shLines": "_367UGW_shLines",
14934
15171
  "progressBarDone": "_367UGW_progressBarDone",
14935
- "diffScroll": "_367UGW_diffScroll",
14936
- "shSeverity": "_367UGW_shSeverity",
14937
- "optionsCard": "_367UGW_optionsCard",
14938
- "progressTrack": "_367UGW_progressTrack",
14939
- "maskOut": "_367UGW_maskOut",
14940
- "card": "_367UGW_card",
14941
- "confirmItemDesc": "_367UGW_confirmItemDesc",
14942
- "chatFileExt": "_367UGW_chatFileExt",
14943
- "diffGroupToggle": "_367UGW_diffGroupToggle",
14944
- "toastText": "_367UGW_toastText",
14945
- "pathMappingList": "_367UGW_pathMappingList",
14946
- "historyGroup": "_367UGW_historyGroup",
14947
- "factCell": "_367UGW_factCell",
14948
- "toastIn": "_367UGW_toastIn",
14949
- "snapshotRowBadges": "_367UGW_snapshotRowBadges",
14950
- "cellMeta": "_367UGW_cellMeta",
15172
+ "progressPercent": "_367UGW_progressPercent",
15173
+ "statusIndeterminate": "_367UGW_statusIndeterminate",
15174
+ "stepper": "_367UGW_stepper",
15175
+ "ghostButton": "_367UGW_ghostButton",
15176
+ "conflictPrefix": "_367UGW_conflictPrefix",
15177
+ "runsCounts": "_367UGW_runsCounts",
15178
+ "diffNo": "_367UGW_diffNo",
15179
+ "rollbackPointActions": "_367UGW_rollbackPointActions",
15180
+ "dialogClose": "_367UGW_dialogClose",
15181
+ "groupList": "_367UGW_groupList",
15182
+ "skipText": "_367UGW_skipText",
15183
+ "previewScopeOff": "_367UGW_previewScopeOff",
15184
+ "skeletonBlock": "_367UGW_skeletonBlock",
15185
+ "rollbackGroupUnit": "_367UGW_rollbackGroupUnit",
15186
+ "kindTag": "_367UGW_kindTag",
15187
+ "restorePlanStat": "_367UGW_restorePlanStat",
15188
+ "activityCard": "_367UGW_activityCard",
15189
+ "snapshotPickerRow": "_367UGW_snapshotPickerRow",
15190
+ "rollbackFileDir": "_367UGW_rollbackFileDir",
15191
+ "stepperStep": "_367UGW_stepperStep",
15192
+ "stepperLabel": "_367UGW_stepperLabel",
15193
+ "activityRow": "_367UGW_activityRow",
15194
+ "diffHunkRow": "_367UGW_diffHunkRow",
15195
+ "artifactName": "_367UGW_artifactName",
15196
+ "infoHintBtn": "_367UGW_infoHintBtn",
15197
+ "skeletonTable": "_367UGW_skeletonTable",
15198
+ "activityRows": "_367UGW_activityRows",
15199
+ "diffCellDel": "_367UGW_diffCellDel",
15200
+ "profileRow": "_367UGW_profileRow",
15201
+ "marketFilterSearch": "_367UGW_marketFilterSearch",
15202
+ "headRow": "_367UGW_headRow",
15203
+ "activityKind": "_367UGW_activityKind",
15204
+ "activityResultOk": "_367UGW_activityResultOk",
14951
15205
  "sourceRowHead": "_367UGW_sourceRowHead",
15206
+ "historySections": "_367UGW_historySections",
15207
+ "restorePlanRowStatic": "_367UGW_restorePlanRowStatic",
15208
+ "rollbackGroupTitle": "_367UGW_rollbackGroupTitle",
15209
+ "paletteGroup": "_367UGW_paletteGroup",
14952
15210
  "pickerUnit": "_367UGW_pickerUnit",
14953
- "secretsList": "_367UGW_secretsList",
14954
- "pathOld": "_367UGW_pathOld",
14955
- "kindTagInfo": "_367UGW_kindTagInfo",
14956
- "restorePlanGroupHead": "_367UGW_restorePlanGroupHead",
14957
- "rollbackAdded": "_367UGW_rollbackAdded",
14958
- "statRow": "_367UGW_statRow",
14959
- "snapshotRowHeader": "_367UGW_snapshotRowHeader",
14960
- "rollbackSessionId": "_367UGW_rollbackSessionId",
14961
- "viewEnter": "_367UGW_viewEnter",
14962
- "diskUsageCard": "_367UGW_diskUsageCard",
14963
- "optionsRow": "_367UGW_optionsRow",
14964
- "pickerToolbar": "_367UGW_pickerToolbar",
14965
- "shMetric": "_367UGW_shMetric",
14966
- "dialogBody": "_367UGW_dialogBody",
14967
- "input": "_367UGW_input",
14968
- "statusDot": "_367UGW_statusDot",
14969
- "reportView": "_367UGW_reportView",
14970
- "consultScroll": "_367UGW_consultScroll",
14971
- "banner": "_367UGW_banner"
15211
+ "shHeaderTrailing": "_367UGW_shHeaderTrailing",
15212
+ "diffNoColW5": "_367UGW_diffNoColW5",
15213
+ "updateVersionRow": "_367UGW_updateVersionRow",
15214
+ "paletteInput": "_367UGW_paletteInput",
15215
+ "snapshotRowIssues": "_367UGW_snapshotRowIssues",
15216
+ "diffNoColW6": "_367UGW_diffNoColW6",
15217
+ "rollbackSessionItem": "_367UGW_rollbackSessionItem",
15218
+ "activityHeader": "_367UGW_activityHeader",
15219
+ "shPanelHead": "_367UGW_shPanelHead",
15220
+ "runsCardTitle": "_367UGW_runsCardTitle",
15221
+ "reasonLine": "_367UGW_reasonLine",
15222
+ "pickerGroupTitleName": "_367UGW_pickerGroupTitleName",
15223
+ "diskUsageScroll": "_367UGW_diskUsageScroll",
15224
+ "chatBubble": "_367UGW_chatBubble",
15225
+ "shSummary": "_367UGW_shSummary",
15226
+ "selectChevron": "_367UGW_selectChevron",
15227
+ "chatAttachmentRow": "_367UGW_chatAttachmentRow",
15228
+ "dialogIn": "_367UGW_dialogIn",
15229
+ "snapshotRowMain": "_367UGW_snapshotRowMain"
14972
15230
  };
14973
15231
  //#endregion
14974
15232
  //#region src/client/common/Modal.tsx
@@ -15456,6 +15714,67 @@ function CommandPalette({ open, onClose, commands, ctx, onRun, t }) {
15456
15714
  });
15457
15715
  }
15458
15716
  //#endregion
15717
+ //#region src/ui/badge-tone.ts
15718
+ /** 四态 → 原生 tone(ok=success / warn=warning / error=danger / info=info)。 */
15719
+ const BADGE_TONE = {
15720
+ ok: "success",
15721
+ info: "info",
15722
+ warn: "warning",
15723
+ error: "danger"
15724
+ };
15725
+ /** 取某个四态对应的原生 tone;未知输入按 info 处理(调用方给的是字面量联合,此为防御)。 */
15726
+ function badgeTone(kind) {
15727
+ return BADGE_TONE[kind] ?? "info";
15728
+ }
15729
+ //#endregion
15730
+ //#region src/client/common/host-primitives.ts
15731
+ let cached;
15732
+ /** 取一次宿主原语包(**每个进程只试一次**,失败记 null 不再重试)。 */
15733
+ function hostPrimitives() {
15734
+ if (cached !== void 0) return cached;
15735
+ cached = null;
15736
+ try {
15737
+ const loaded = typeof require === "function" ? require("@deepseek-ai/dsh-client-ui-primitives") : null;
15738
+ if (loaded !== null && typeof loaded === "object") cached = loaded;
15739
+ } catch {
15740
+ cached = null;
15741
+ }
15742
+ return cached;
15743
+ }
15744
+ /** DSH 自带的文件类型图标(拿不到回 null,调用方回落自己的画法)。 */
15745
+ function hostFileTypeIcon() {
15746
+ const icon = hostPrimitives()?.FileTypeIcon;
15747
+ if (typeof icon === "function" || typeof icon === "object") return icon;
15748
+ return null;
15749
+ }
15750
+ /**
15751
+ * DSH 自带的只读标签(徽章):与宿主同一颗组件、同一套调色板,拿不到回 null
15752
+ * (调用方回落本仓库的 `.badge[data-kind]` 样式)。
15753
+ */
15754
+ function hostTag() {
15755
+ const tag = hostPrimitives()?.Tag;
15756
+ if (typeof tag === "function" || typeof tag === "object") return tag;
15757
+ return null;
15758
+ }
15759
+ /**
15760
+ * DSH 自带的图标组件(按导出名取;拿不到回 null ⇒ 调用方回落本仓库的图标)。
15761
+ *
15762
+ * 为什么按名字取而不是顶层 import:与 FileTypeIcon / projectUserText 同一条纪律(老宿主没有
15763
+ * 这份模块表,顶层 import 会把整个浏览器半打挂);**为什么要用宿主图标**(2026-10-17 用户要求):
15764
+ * 复制按钮在 DSH 里是 `IconCopyOutlineRegular → IconCheckOutlineRegular` 的**瞬时切换**(无形变动画),
15765
+ * 回退用 `IconRefreshOutlineRegular` —— 与动作行同框时字形、描边、视觉重量才与原生一致。
15766
+ */
15767
+ function hostIcon(name) {
15768
+ const icon = hostPrimitives()?.[name];
15769
+ if (typeof icon === "function" || typeof icon === "object") return icon;
15770
+ return null;
15771
+ }
15772
+ /** DSH 自带的用户正文投影(把会话引用/斜杠名渲染成 chip;拿不到回 null)。 */
15773
+ function hostUserTextProjector() {
15774
+ const project = hostPrimitives()?.projectUserText;
15775
+ return typeof project === "function" ? project : null;
15776
+ }
15777
+ //#endregion
15459
15778
  //#region src/client/common/ui.tsx
15460
15779
  /**
15461
15780
  * 统一按钮(primary=主操作 / ghost=次操作 / danger=危险操作)。
@@ -15544,10 +15863,30 @@ function StatusDot({ kind = "idle", pulse }) {
15544
15863
  "aria-hidden": "true"
15545
15864
  });
15546
15865
  }
15547
- /** 状态徽章(info=业务色 / ok=成功 / warn=警告 / error=错误)。 */
15866
+ /**
15867
+ * 状态徽章(info=业务色 / ok=成功 / warn=警告 / error=错误)。
15868
+ *
15869
+ * **优先复用宿主的 `Tag`**(DSH 原生只读标签,与设置页/插件清单里那枚同源):四态映射到
15870
+ * 原生调色板的 success / info / warning / danger(映射表在 `src/ui/badge-tone.ts`,可单测)。
15871
+ * 拿不到原生包(老宿主)时回落本仓库的 `.badge[data-kind]` —— 两条路径的语义由**同一张表**给出。
15872
+ * 原生 Tag 没有 title 入参:需要悬停提示时套一层 inline-flex 的 wrapper,不改变布局。
15873
+ */
15548
15874
  function Badge({ kind = "info", children, title }) {
15875
+ const DshTag = hostTag();
15876
+ if (DshTag !== null) {
15877
+ const tag = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DshTag, {
15878
+ tone: badgeTone(kind),
15879
+ children
15880
+ });
15881
+ return title === void 0 ? tag : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
15882
+ className: config_manager_module_css_default.badgeHost,
15883
+ title,
15884
+ children: tag
15885
+ });
15886
+ }
15549
15887
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
15550
- className: `${config_manager_module_css_default.badge} ${config_manager_module_css_default[`badge${kind[0].toUpperCase()}${kind.slice(1)}`] ?? ""}`,
15888
+ className: config_manager_module_css_default.badge,
15889
+ "data-kind": kind,
15551
15890
  title,
15552
15891
  children
15553
15892
  });
@@ -16127,20 +16466,20 @@ const zh$4 = {
16127
16466
  "section.settings": "设置",
16128
16467
  "section.ui": "UI 偏好",
16129
16468
  "section.providers": "Provider 与模型",
16130
- "section.plugins": "插件",
16469
+ "section.plugins": "插件清单",
16131
16470
  "section.mcp": "MCP 服务器",
16132
16471
  "section.prompts": "提示词",
16133
16472
  "section.skills": "技能",
16134
16473
  "section.agentPresets": "Agent 预设",
16135
16474
  "section.agentInstructions": "全局指令",
16136
16475
  "section.workspaces": "工作区",
16137
- "section.pluginFiles": "其他插件零散文件",
16476
+ "section.pluginFiles": "插件散落配置",
16138
16477
  "section.credentialsStatus": "凭据状态",
16139
16478
  "section.secrets": "密钥",
16140
16479
  "section.sessions": "历史会话",
16141
- "section.self": "本插件自身配置",
16142
- "section.pluginData": "其他插件数据",
16143
- "section.pluginAssets": "其他插件大文件",
16480
+ "section.self": "配置管理器设置",
16481
+ "section.pluginData": "插件数据目录",
16482
+ "section.pluginAssets": "插件大文件",
16144
16483
  "view.about": "关于",
16145
16484
  "about.snippet.environment": "### 环境 / Environment",
16146
16485
  "about.releaseNotes.rateLimited": "GitHub API 速率限制(Rate limit exceeded),请稍后再试或直接在 GitHub 上查看。",
@@ -16280,6 +16619,26 @@ const zh$4 = {
16280
16619
  "picker.sensitive": "敏感",
16281
16620
  "picker.showAll": "显示全部(共 {count} 条)",
16282
16621
  "picker.summaryImport": "将导入 {sections} 个分区 · {units} 个条目",
16622
+ "picker.pluginRoot": "插件",
16623
+ "picker.pluginLeafPlugin": "插件清单条目",
16624
+ "picker.pluginLeafConfig": "数据目录(配置)",
16625
+ "picker.pluginLeafAssets": "大文件(壁纸 / 数据库)",
16626
+ "picker.pluginAreaUnread": "未读取",
16627
+ "picker.pluginAreaAbsent": "无内容",
16628
+ "picker.pluginViewEmpty": "插件清单还没读到,先读取「插件」分区。",
16629
+ "picker.bucketPlugins": "插件分区的其他条目(补丁行 / pnpm-workspace.yaml)",
16630
+ "picker.bucketLooseFiles": "未归属到插件的配置(~/.dsh 根)",
16631
+ "picker.bucketHint": "这些条目没有可证明的插件归属,不猜;展开可逐条勾选。",
16632
+ "picker.groupHint.extensions": "这一组里的插件分区合并成一棵按插件分组的树:默认只显示一个「插件」区块,展开它才列出各个插件,插件名下面是它的清单条目、数据目录与大文件。只显示能证明的归属(内置来源表 + 插件自述 dsh.dataDirs)——「插件散落配置」没有包名信息,因此留在「未归属」里;带「设备相关」的分区默认不勾选,跨设备导入时可能不适用。",
16633
+ "group.general": "通用",
16634
+ "group.ai": "AI",
16635
+ "group.extensions": "插件与扩展",
16636
+ "group.mcp": "MCP / 工具",
16637
+ "group.customization": "定制",
16638
+ "group.automation": "自动化",
16639
+ "group.workspace": "工作区",
16640
+ "group.ui": "界面",
16641
+ "group.optional": "可选数据",
16283
16642
  "import.nothingSelected": "当前没有勾选任何要导入的内容,请把需要导入的分区或条目勾上。",
16284
16643
  "import.excludedByUser": "本次有 {count} 项被你取消勾选:未导入,也未进快照。",
16285
16644
  "import.consult.hint": "只读分析:先看结论与依据,确认后再选择要导入的内容。",
@@ -16441,7 +16800,6 @@ const zh$4 = {
16441
16800
  "snapshots.plan.diffEscape": "路径越界,已拒绝读取",
16442
16801
  "snapshots.plan.diffNotApplicable": "该动作不是文件内容变更,无逐行对照",
16443
16802
  "snapshots.plan.diffDegraded": "差异过大,已按整块对比显示",
16444
- "snapshots.plan.diffTruncated": "仅显示前 {shown} 行(共 {total} 行)",
16445
16803
  "snapshots.plan.statSkipped.tooLarge": "体积超上限,未统计",
16446
16804
  "snapshots.plan.statSkipped.binary": "二进制",
16447
16805
  "snapshots.plan.statSkipped.budget": "未统计(文件数上限)",
@@ -17006,20 +17364,20 @@ const en$4 = {
17006
17364
  "section.settings": "Settings",
17007
17365
  "section.ui": "UI Preferences",
17008
17366
  "section.providers": "Providers & Models",
17009
- "section.plugins": "Plugins",
17367
+ "section.plugins": "Plugin list",
17010
17368
  "section.mcp": "MCP Servers",
17011
17369
  "section.prompts": "Prompts",
17012
17370
  "section.skills": "Skills",
17013
17371
  "section.agentPresets": "Agent Presets",
17014
17372
  "section.agentInstructions": "Agent Instructions",
17015
17373
  "section.workspaces": "Workspaces",
17016
- "section.pluginFiles": "Other Plugins' Loose Files",
17374
+ "section.pluginFiles": "Plugin config files",
17017
17375
  "section.credentialsStatus": "Credentials Status",
17018
17376
  "section.secrets": "Secrets",
17019
17377
  "section.sessions": "Sessions",
17020
- "section.self": "This Plugin's Own Config",
17021
- "section.pluginData": "Other Plugins' Data",
17022
- "section.pluginAssets": "Other Plugins' Large Files",
17378
+ "section.self": "Config Manager settings",
17379
+ "section.pluginData": "Plugin data dirs",
17380
+ "section.pluginAssets": "Plugin large files",
17023
17381
  "view.about": "About",
17024
17382
  "about.snippet.environment": "### Environment",
17025
17383
  "about.releaseNotes.rateLimited": "GitHub API rate limit exceeded — please try again later, or view the release notes directly on GitHub.",
@@ -17159,6 +17517,26 @@ const en$4 = {
17159
17517
  "picker.sensitive": "Sensitive",
17160
17518
  "picker.showAll": "Show all ({count})",
17161
17519
  "picker.summaryImport": "Will import {sections} section(s) · {units} item(s)",
17520
+ "picker.pluginRoot": "Plugins",
17521
+ "picker.pluginLeafPlugin": "Plugin list entry",
17522
+ "picker.pluginLeafConfig": "Data dir (config)",
17523
+ "picker.pluginLeafAssets": "Large files (wallpapers / databases)",
17524
+ "picker.pluginAreaUnread": "Not read yet",
17525
+ "picker.pluginAreaAbsent": "No content",
17526
+ "picker.pluginViewEmpty": "The plugin list has not been read yet — read the \"Plugins\" section first.",
17527
+ "picker.bucketPlugins": "Other entries of the plugins section (patch lines / pnpm-workspace.yaml)",
17528
+ "picker.bucketLooseFiles": "Config not attributable to a plugin (~/.dsh root)",
17529
+ "picker.bucketHint": "These entries have no provable plugin ownership — we never guess; expand to tick them one by one.",
17530
+ "picker.groupHint.extensions": "The plugin sections in this group are merged into one tree grouped by plugin: by default you only see a single “Plugins” block — expand it to list the plugins, each with its list entry, data dirs and large files. Only provable ownership is shown (built-in source table + plugins that declare dsh.dataDirs) — ‘Plugin config files’ carries no package name and therefore stays under \"unowned\"; device-specific sections are unchecked by default and may not apply on another machine.",
17531
+ "group.general": "General",
17532
+ "group.ai": "AI",
17533
+ "group.extensions": "Extensions",
17534
+ "group.mcp": "MCP / Tools",
17535
+ "group.customization": "Customization",
17536
+ "group.automation": "Automation",
17537
+ "group.workspace": "Workspace",
17538
+ "group.ui": "UI",
17539
+ "group.optional": "Optional Data",
17162
17540
  "import.nothingSelected": "Nothing is selected to import — tick the sections or items you want to import.",
17163
17541
  "import.excludedByUser": "{count} item(s) were deselected: neither imported nor snapshotted.",
17164
17542
  "import.consult.hint": "Read-only analysis: review the verdict and its evidence first, then choose what to import.",
@@ -17320,7 +17698,6 @@ const en$4 = {
17320
17698
  "snapshots.plan.diffEscape": "Path escapes the sandbox: read refused",
17321
17699
  "snapshots.plan.diffNotApplicable": "This action is not a file content change",
17322
17700
  "snapshots.plan.diffDegraded": "Diff too large: shown as a whole-block replacement",
17323
- "snapshots.plan.diffTruncated": "Showing first {shown} rows of {total}",
17324
17701
  "snapshots.plan.statSkipped.tooLarge": "Too large to count",
17325
17702
  "snapshots.plan.statSkipped.binary": "Binary",
17326
17703
  "snapshots.plan.statSkipped.budget": "Not counted (file limit)",
@@ -19194,10 +19571,6 @@ function maxLineDigits(hunks) {
19194
19571
  }
19195
19572
  return String(max).length;
19196
19573
  }
19197
- /** 行对总数(渲染层做「超长截断」提示时的分母)。 */
19198
- function countSideRows(groups) {
19199
- return groups.reduce((sum, group) => sum + group.rows.length, 0);
19200
- }
19201
19574
  /**
19202
19575
  * 一侧的行数统计:**只数 unidiff 语义的增删行**(与 git 的 `+A −R` 同口径)。
19203
19576
  * 成对修改在 unidiff 里本来就是「一删一增」,所以这里不需要按行对再折算。
@@ -19212,6 +19585,31 @@ function diffLineCounts(hunks) {
19212
19585
  removed
19213
19586
  };
19214
19587
  }
19588
+ //#endregion
19589
+ //#region src/client/common/DiffTable.tsx
19590
+ /**
19591
+ * 双栏差异表(共享渲染原语)——「快照恢复计划」与「回滚点 · 查看」共用同一副骨架。
19592
+ *
19593
+ * 为什么是共享原语(AGENTS.md Reuse Before Creating):两处要画的是**同一件事**
19594
+ * (hunks → 左右对照:左 = before / 当前,右 = after / 目标),差别只在列头、文件头与截断文案;
19595
+ * 复制第二份渲染代码必然从视觉与截断口径开始漂移。
19596
+ *
19597
+ * 观感(2026-10-14 按用户参考图改成编辑器式双栏):
19598
+ * · **可选文件头**(`.diffFileHead`)= 路径 + `+A` / `−R`:只在调用方**没在别处写过路径**时传 title;
19599
+ * · **每一栏各自一块头**(`@@ -a,b +c,d @@`,两栏同一段文本,与单文件 diff 编辑器的观感一致);
19600
+ * · **行号栏按语义着色**(删侧红 / 增侧绿)并带一条 3px 实心色条(`.diffNoDel` / `.diffNoAdd` 的内阴影),
19601
+ * 色条落在**该栏自己的左缘**(左栏 = 整表左缘,右栏 = 两栏分界处);
19602
+ * · 内容栏只在增删行上着色(`.diffCellAdd` / `.diffCellDel`,12% 混色),上下文行不上色;
19603
+ * · 两栏之间一条竖分割线(块头与正文都要有)。
19604
+ *
19605
+ * 规模:**全部画出来,不截断**(2026-10-15 用户:「为什么最多只能加载 400 行?我需要能完整的加载」)。
19606
+ * 到这里的 hunks 已经是宿主给的**全部**内容(单文件字节上限在宿主侧:回滚预览 1 MiB、恢复计划 maxSideBytes),
19607
+ * 渲染层再砍一刀只会让同一份数据在界面上少半截,而用户没有任何办法看到剩下的
19608
+ *(2026-10-14 起那道「最多 400 行对」的上限已删除,连文案一起去掉)。
19609
+ *
19610
+ * 分工:行对对齐 / 块头 / 行号列宽 / 行数统计全来自 `src/ui/diff-view.ts`(纯函数、node 单测);本组件只画。
19611
+ * 安全:单元格文本是磁盘 / 宿主原文 ⇒ 展示前**必须**过调用方传进来的 sanitize(本该是 redact)。
19612
+ */
19215
19613
  /** 左侧单元格:成对修改 / 纯删除 → 红底;上下文 → 中性。 */
19216
19614
  function leftCellClass(kind) {
19217
19615
  return kind === "change" || kind === "del" ? config_manager_module_css_default.diffCell + " " + config_manager_module_css_default.diffCellDel : config_manager_module_css_default.diffCell ?? "";
@@ -19229,97 +19627,82 @@ function rightNoClass(kind) {
19229
19627
  return kind === "change" || kind === "add" ? config_manager_module_css_default.diffNo + " " + config_manager_module_css_default.diffNoAdd : config_manager_module_css_default.diffNo ?? "";
19230
19628
  }
19231
19629
  /** 左右双栏逐行对照(文件头 + 表头 + 块头 + 行号 + 单元格)。 */
19232
- function DiffTable({ hunks, beforeLabel, afterLabel, title, truncatedNotice, sanitize, rowCap = 400 }) {
19630
+ function DiffTable({ hunks, beforeLabel, afterLabel, title, sanitize }) {
19233
19631
  const cell = sanitize ?? ((text) => redact(text));
19234
19632
  const groups = toSideBySide(hunks);
19235
- const total = countSideRows(groups);
19236
19633
  const counts = diffLineCounts(hunks);
19237
19634
  const digits = maxLineDigits(hunks);
19238
19635
  const noColClass = digits <= 3 ? config_manager_module_css_default.diffNoColW3 : digits === 4 ? config_manager_module_css_default.diffNoColW4 : digits === 5 ? config_manager_module_css_default.diffNoColW5 : config_manager_module_css_default.diffNoColW6;
19239
- let rendered = 0;
19240
- const capped = total > rowCap;
19241
- const notice = capped && truncatedNotice !== void 0 ? truncatedNotice(rowCap, total) : null;
19242
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
19243
- title !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
19244
- className: config_manager_module_css_default.diffFileHead,
19245
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
19246
- className: config_manager_module_css_default.diffFilePath + " " + config_manager_module_css_default.mono,
19247
- title,
19248
- children: title
19249
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
19250
- className: config_manager_module_css_default.diffFileStat,
19251
- children: [
19252
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
19253
- className: config_manager_module_css_default.diffStatAdd,
19254
- children: ["+", counts.added]
19255
- }),
19256
- " ",
19257
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
19258
- className: config_manager_module_css_default.diffStatDel,
19259
- children: ["−", counts.removed]
19260
- })
19261
- ]
19262
- })]
19263
- }),
19264
- notice !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
19265
- className: config_manager_module_css_default.hint,
19266
- children: notice
19267
- }),
19268
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
19269
- className: config_manager_module_css_default.diffScroll,
19270
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("table", {
19271
- className: config_manager_module_css_default.diffTable,
19272
- children: [
19273
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("colgroup", { children: [
19274
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("col", { className: noColClass }),
19275
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("col", {}),
19276
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("col", { className: noColClass }),
19277
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("col", {})
19278
- ] }),
19279
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("thead", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
19280
- className: config_manager_module_css_default.diffNoHead,
19636
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [title !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
19637
+ className: config_manager_module_css_default.diffFileHead,
19638
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
19639
+ className: config_manager_module_css_default.diffFilePath + " " + config_manager_module_css_default.mono,
19640
+ title,
19641
+ children: title
19642
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
19643
+ className: config_manager_module_css_default.diffFileStat,
19644
+ children: [
19645
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
19646
+ className: config_manager_module_css_default.diffStatAdd,
19647
+ children: ["+", counts.added]
19648
+ }),
19649
+ " ",
19650
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
19651
+ className: config_manager_module_css_default.diffStatDel,
19652
+ children: ["−", counts.removed]
19653
+ })
19654
+ ]
19655
+ })]
19656
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
19657
+ className: config_manager_module_css_default.diffScroll,
19658
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("table", {
19659
+ className: config_manager_module_css_default.diffTable,
19660
+ children: [
19661
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("colgroup", { children: [
19662
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("col", { className: noColClass }),
19663
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("col", {}),
19664
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("col", { className: noColClass }),
19665
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("col", {})
19666
+ ] }),
19667
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("thead", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
19668
+ className: config_manager_module_css_default.diffNoHead,
19669
+ colSpan: 2,
19670
+ children: beforeLabel
19671
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
19672
+ className: config_manager_module_css_default.diffNoHead,
19673
+ colSpan: 2,
19674
+ children: afterLabel
19675
+ })] }) }),
19676
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tbody", { children: groups.map((group) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", {
19677
+ className: config_manager_module_css_default.diffHunkRow,
19678
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
19281
19679
  colSpan: 2,
19282
- children: beforeLabel
19283
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
19284
- className: config_manager_module_css_default.diffNoHead,
19680
+ children: group.header
19681
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
19285
19682
  colSpan: 2,
19286
- children: afterLabel
19287
- })] }) }),
19288
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tbody", { children: groups.map((group) => {
19289
- const rows = capped ? group.rows.slice(0, Math.max(0, rowCap - rendered)) : group.rows;
19290
- rendered += rows.length;
19291
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", {
19292
- className: config_manager_module_css_default.diffHunkRow,
19293
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
19294
- colSpan: 2,
19295
- children: group.header
19296
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
19297
- colSpan: 2,
19298
- children: group.header
19299
- })]
19300
- }), rows.map((row, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [
19301
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
19302
- className: leftNoClass(row.kind),
19303
- children: row.left?.oldNo ?? ""
19304
- }),
19305
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
19306
- className: leftCellClass(row.kind),
19307
- children: row.left === null ? "" : cell(row.left.text)
19308
- }),
19309
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
19310
- className: rightNoClass(row.kind),
19311
- children: row.right?.newNo ?? ""
19312
- }),
19313
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
19314
- className: rightCellClass(row.kind),
19315
- children: row.right === null ? "" : cell(row.right.text)
19316
- })
19317
- ] }, group.header + "-" + String(index)))] }, group.header);
19318
- }) })
19319
- ]
19320
- })
19683
+ children: group.header
19684
+ })]
19685
+ }), group.rows.map((row, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [
19686
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
19687
+ className: leftNoClass(row.kind),
19688
+ children: row.left?.oldNo ?? ""
19689
+ }),
19690
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
19691
+ className: leftCellClass(row.kind),
19692
+ children: row.left === null ? "" : cell(row.left.text)
19693
+ }),
19694
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
19695
+ className: rightNoClass(row.kind),
19696
+ children: row.right?.newNo ?? ""
19697
+ }),
19698
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
19699
+ className: rightCellClass(row.kind),
19700
+ children: row.right === null ? "" : cell(row.right.text)
19701
+ })
19702
+ ] }, group.header + "-" + String(index)))] }, group.header)) })
19703
+ ]
19321
19704
  })
19322
- ] });
19705
+ })] });
19323
19706
  }
19324
19707
  //#endregion
19325
19708
  //#region src/client/common/Motion.tsx
@@ -19439,10 +19822,6 @@ function DiffPane({ state, t }) {
19439
19822
  hunks: diff.hunks,
19440
19823
  beforeLabel: t("snapshots.plan.beforeLabel"),
19441
19824
  afterLabel: t("snapshots.plan.afterLabel"),
19442
- truncatedNotice: (shown, total) => t("snapshots.plan.diffTruncated", {
19443
- shown: String(shown),
19444
- total: String(total)
19445
- }),
19446
19825
  sanitize: redact
19447
19826
  })]
19448
19827
  });
@@ -22699,6 +23078,28 @@ function kindLabel(kindKey, t) {
22699
23078
  */
22700
23079
  /** 单元名显示长度上限(配合 .pickerUnitName 的 CSS 省略做兜底;UI-16) */
22701
23080
  const UNIT_NAME_MAX = 44;
23081
+ /**
23082
+ * 「插件」一级区块在展开态表里的键(与插件包名、`bucket:<分区>` 共用 `expandedPlugins` 这张表)。
23083
+ * 默认折叠 —— 用户要求「所有插件收在一个叫插件的区块里,展开后才出现」。
23084
+ */
23085
+ const PLUGIN_ROOT_KEY = "plugin-root";
23086
+ /**
23087
+ * 分组标题的字典键(与 `ui/types.ts` 的 EXPORT_GROUPS 一一对应)。
23088
+ *
23089
+ * **顺序不在这里**:顺序由调用方给的节点顺序决定(宿主目录已按 EXPORT_GROUPS 排好),
23090
+ * 本表只负责「id → 本地化文案」这一件事(否则中英文界面会漂移)。
23091
+ */
23092
+ const GROUP_TITLE_KEY = {
23093
+ general: "group.general",
23094
+ ai: "group.ai",
23095
+ extensions: "group.extensions",
23096
+ mcp: "group.mcp",
23097
+ customization: "group.customization",
23098
+ automation: "group.automation",
23099
+ workspace: "group.workspace",
23100
+ ui: "group.ui",
23101
+ optional: "group.optional"
23102
+ };
22702
23103
  /** 单元列表容器 id(展开按钮的 aria-controls 指向它;UI-22) */
22703
23104
  function unitsId(section) {
22704
23105
  return `picker-units-${section}`;
@@ -22719,7 +23120,30 @@ function ContentPicker({ nodes, value, onChange, t, sectionLabel, loading = fals
22719
23120
  * 分组行的勾选框也照常可用(不必先展开就能整组选/取消)。
22720
23121
  */
22721
23122
  const [expandedGroups, setExpandedGroups] = (0, react.useState)({});
23123
+ /**
23124
+ * 「按插件看」的展开态(键 = 插件包名,或 \`bucket:<分区 id>\`)。
23125
+ * 默认全部折叠 —— 展开插件节点时才去读它涉及的 pluginData / pluginAssets 清单(惰性,见渲染处)。
23126
+ */
23127
+ const [expandedPlugins, setExpandedPlugins] = (0, react.useState)({});
23128
+ /**
23129
+ * 待补勾队列(键 = 「插件」一级区块或某个插件名)。
23130
+ *
23131
+ * 为什么需要它:分区清单是**惰性**读取的 —— 勾一级区块/插件时,它名下还有区域没读到(unread),
23132
+ * 那些单元此刻勾不上。若就此结束,用户会以为「全带上了」,实际包里少了数据目录/大文件。
23133
+ * 所以:先勾已知的 + 触发读取 + 入队;清单到货后(nodes 变化)自动补齐并出队。
23134
+ */
23135
+ const [pendingChecks, setPendingChecks] = (0, react.useState)([]);
22722
23136
  const visible = (0, react.useMemo)(() => filterSections(nodes, query), [nodes, query]);
23137
+ /** 「按插件看」的树:同一份 nodes 的第二个投影(纯函数在 src/ui/selection-model.ts) */
23138
+ /** 「按插件看」的完整树(无搜索过滤;纯函数在 src/ui/selection-model.ts) */
23139
+ const fullTree = (0, react.useMemo)(() => pluginTree(nodes), [nodes]);
23140
+ const filteredTree = (0, react.useMemo)(() => filterPluginTree(fullTree, query), [fullTree, query]);
23141
+ /**
23142
+ * 搜索把树过滤空时**回落到完整树**:分区名命中(如搜「插件数据目录」)应当仍能看到这一组,
23143
+ * 否则用户会在组标题下面看到一句「没有匹配」,而组里的分区明明就在那里。
23144
+ */
23145
+ const tree = filteredTree.entries.length === 0 && filteredTree.buckets.every((b) => b.units.length === 0) ? fullTree : filteredTree;
23146
+ const firstTreeSection = visible.filter((n) => isPluginTreeSection(n.section)).map((n) => n.section)[0];
22723
23147
  const summary = pickerSummary(value, nodes);
22724
23148
  /**
22725
23149
  * 未读到清单的分区数(在途 + 失败,去重;G-02):> 0 时 footer 合计必须标注
@@ -22741,6 +23165,422 @@ function ContentPicker({ nodes, value, onChange, t, sectionLabel, loading = fals
22741
23165
  };
22742
23166
  /** 该分区属于哪一侧(决定联动方向):会话侧 / 工作区侧 / 其它(两条都跑)。 */
22743
23167
  const focusOf = (section) => section === "sessions" ? "sessions" : section === "workspaces" ? "workspaces" : "both";
23168
+ /**
23169
+ * 待补勾:清单到货后把「勾一级区块/插件时还没读到」的单元补齐(见 pendingChecks 的注释)。
23170
+ *
23171
+ * 收敛判据是「该节点名下已无 unread 叶子」;只要还在读就一直排队,到齐后补一次并出队。
23172
+ * 幂等:补齐结果与当前选择等价时不写库(sameSelection),避免自激渲染。
23173
+ */
23174
+ (0, react.useEffect)(() => {
23175
+ if (pendingChecks.length === 0) return;
23176
+ const { selection, remaining } = applyPluginPendingChecks(value, nodes, tree, pendingChecks);
23177
+ setPendingChecks(remaining);
23178
+ if (!sameSelection(selection, value)) commit(selection);
23179
+ }, [
23180
+ pendingChecks,
23181
+ tree,
23182
+ nodes,
23183
+ value
23184
+ ]);
23185
+ /** 叶子的种类文案(模型不出文案;i18n 铁律)。 */
23186
+ const leafKindText = (kind) => kind === "plugin" ? t("picker.pluginLeafPlugin") : kind === "config" ? t("picker.pluginLeafConfig") : t("picker.pluginLeafAssets");
23187
+ /**
23188
+ * 桶的标题文案(无法归属到具体插件的整块分区 —— 不猜归属的结果必须显式说出来)。
23189
+ *
23190
+ * 只有两个桶:插件分区里的补丁行 / pnpm-workspace.yaml,以及 pluginFiles。两者都**不是插件**,
23191
+ * 因此不放进「插件」一级区块里。缺省回落分区显示名(新增桶时不会渲染出裸 key)。
23192
+ */
23193
+ const bucketLabel = (section) => section === "plugins" ? t("picker.bucketPlugins") : section === "pluginFiles" ? t("picker.bucketLooseFiles") : label(section);
23194
+ /**
23195
+ * 单个单元行(**唯一实现**:「按分区看」的单元与「按插件看」的桶共用同一个渲染)。
23196
+ *
23197
+ * G-01:单元名与 detail 都是**宿主下发的文本**(导入侧来自备份包内的单元名/会话名),
23198
+ * 必须同等待遇 —— 显示文本与 title 都先过 redact,且**先脱敏、后省略**(反过来的话,
23199
+ * 被截断的密钥不再匹配值形状模式而漏网)。
23200
+ */
23201
+ const renderUnitRow = (node, u, nested) => {
23202
+ const safeLabel = redact(u.label);
23203
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
23204
+ className: nested ? config_manager_module_css_default.pickerUnit + " " + config_manager_module_css_default.pickerUnitNested : config_manager_module_css_default.pickerUnit,
23205
+ children: [nested && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23206
+ className: config_manager_module_css_default.pickerChevronSpacer,
23207
+ "aria-hidden": "true"
23208
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Checkbox, {
23209
+ checked: unitChecked(value, node.section, u.id),
23210
+ onChange: (checked) => {
23211
+ commit(toggleUnit(value, nodes, u.id, checked), focusOf(node.section), {
23212
+ unitId: u.id,
23213
+ checked
23214
+ });
23215
+ },
23216
+ label: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
23217
+ className: config_manager_module_css_default.categoryItem,
23218
+ children: [
23219
+ u.blank === true ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23220
+ className: config_manager_module_css_default.pickerUnitName,
23221
+ title: safeLabel,
23222
+ children: t("picker.blankSession")
23223
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23224
+ className: config_manager_module_css_default.pickerUnitName,
23225
+ title: safeLabel,
23226
+ children: tailWeightedEllipsis(safeLabel, UNIT_NAME_MAX)
23227
+ }),
23228
+ u.lockedWith !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23229
+ title: t("picker.lockedHint"),
23230
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Badge, {
23231
+ kind: "warn",
23232
+ children: t("picker.locked")
23233
+ })
23234
+ }),
23235
+ u.fileCount !== void 0 && u.fileCount > 1 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23236
+ className: config_manager_module_css_default.pickerCount,
23237
+ children: t("picker.fileCount", { count: String(u.fileCount) })
23238
+ }),
23239
+ unitBadge?.(node.section, u.id),
23240
+ u.detail !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23241
+ className: config_manager_module_css_default.pickerUnitDetail,
23242
+ children: redact(u.detail)
23243
+ }),
23244
+ u.sizeBytes > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23245
+ className: config_manager_module_css_default.sectionSize + " " + config_manager_module_css_default.mono,
23246
+ children: formatBytes$1(u.sizeBytes)
23247
+ })
23248
+ ]
23249
+ })
23250
+ })]
23251
+ }, u.id);
23252
+ };
23253
+ /**
23254
+ * 「插件与扩展」组里的四个插件分区合并渲染成的**一棵按插件分组的树**(用户要求:
23255
+ * 不再用「按分区 / 按插件」视图切换 —— 树就是这一组的渲染方式)。
23256
+ *
23257
+ * 只显示**能证明**的归属(宿主下发的 relatedAreas = 内置来源表 + 插件自述 dsh.dataDirs);
23258
+ * pluginFiles 没有任何包名信息,因此整块进「未归属」桶 —— 不猜,也不假装它属于某个插件。
23259
+ * 「注册表说它应该在哪儿」与「磁盘上确实有」分开渲染:unread 不可勾(展开时才去读),
23260
+ * absent 明确标「无内容」—— 否则会出现「勾了却没导出」的幽灵勾选(引擎只带走清单里真实存在的单元)。
23261
+ *
23262
+ * 纯展示:叶子仍是原来的单元 id,勾选仍走 toggleUnit / toggleSection(语义一字不改)。
23263
+ */
23264
+ const renderPluginTree = () => {
23265
+ /**
23266
+ * 「插件」一级区块(用户要求:所有插件先收在一个可折叠的区块里,展开才列出插件)。
23267
+ *
23268
+ * 默认**折叠**;**搜索时自动展开** —— 否则搜索结果会藏在折叠节点里,看起来像「没有匹配」。
23269
+ * 它的勾选框 = 所有插件名下**存在的**单元(逐个走 toggleUnit),与「未归属 / 遗留数据」桶无关:
23270
+ * 那两个桶是「无法归属的东西」,不该被「全选所有插件」顺手带上。
23271
+ */
23272
+ const rootKey = PLUGIN_ROOT_KEY;
23273
+ const rootOpen = expandedPlugins[rootKey] === true || query.trim() !== "";
23274
+ const rootState = pluginTreePickState(value, tree);
23275
+ const rootPicked = pluginTreeSelectedCount(value, tree);
23276
+ const rootTotal = pluginTreeTotalCount(tree);
23277
+ const rootSize = tree.entries.reduce((n, e) => n + e.leaves.reduce((m, l) => m + l.sizeBytes, 0), 0);
23278
+ const rootUnread = pluginTreeUnreadSections(tree);
23279
+ const body = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
23280
+ !tree.pluginsLoaded && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23281
+ className: config_manager_module_css_default.hint,
23282
+ children: t("picker.pluginViewEmpty")
23283
+ }),
23284
+ tree.pluginsLoaded && tree.entries.length === 0 && tree.buckets.every((b) => b.units.length === 0) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23285
+ className: config_manager_module_css_default.hint,
23286
+ children: t("picker.empty")
23287
+ }),
23288
+ tree.entries.map((entry) => {
23289
+ const open = expandedPlugins[entry.name] === true;
23290
+ const state = pluginEntryPickState(value, entry);
23291
+ const picked = pluginEntrySelectedCount(value, entry);
23292
+ const total = pluginEntryTotalCount(entry);
23293
+ const unread = pluginEntryUnreadSections(entry);
23294
+ const entrySize = entry.leaves.reduce((n, l) => n + l.sizeBytes, 0);
23295
+ const bodyId = "picker-plugin-" + entry.name;
23296
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
23297
+ className: config_manager_module_css_default.pickerGroup,
23298
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
23299
+ className: config_manager_module_css_default.pickerTreeRow,
23300
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
23301
+ type: "button",
23302
+ className: config_manager_module_css_default.iconBtn,
23303
+ "data-size": "sm",
23304
+ "aria-expanded": open,
23305
+ "aria-controls": bodyId,
23306
+ "aria-label": open ? t("picker.collapse") : t("picker.expand"),
23307
+ title: open ? t("picker.collapse") : t("picker.expand"),
23308
+ onClick: () => {
23309
+ if (!open) for (const s of unread) onRequestUnits?.(s);
23310
+ setExpandedPlugins({
23311
+ ...expandedPlugins,
23312
+ [entry.name]: !open
23313
+ });
23314
+ },
23315
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ExpandChevron, { open })
23316
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Checkbox, {
23317
+ checked: state === "all",
23318
+ onChange: (checked) => {
23319
+ if (!checked) {
23320
+ setPendingChecks((prev) => prev.filter((p) => p.key !== entry.name));
23321
+ commit(togglePluginEntry(value, nodes, entry, false));
23322
+ return;
23323
+ }
23324
+ for (const s of unread) onRequestUnits?.(s);
23325
+ if (unread.length > 0) setPendingChecks((prev) => prev.some((p) => p.key === entry.name) ? prev : [...prev, {
23326
+ key: entry.name,
23327
+ kind: "entry"
23328
+ }]);
23329
+ commit(togglePluginEntry(value, nodes, entry, true));
23330
+ },
23331
+ label: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
23332
+ className: config_manager_module_css_default.categoryItem,
23333
+ children: [
23334
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23335
+ className: config_manager_module_css_default.pickerUnitName,
23336
+ title: redact(entry.name),
23337
+ children: tailWeightedEllipsis(redact(entry.name), UNIT_NAME_MAX)
23338
+ }),
23339
+ state === "partial" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Badge, {
23340
+ kind: "info",
23341
+ children: t("picker.partial")
23342
+ }),
23343
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23344
+ className: config_manager_module_css_default.pickerCount,
23345
+ children: t("picker.selectedOf", {
23346
+ selected: String(picked),
23347
+ total: String(total)
23348
+ })
23349
+ }),
23350
+ entrySize > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23351
+ className: config_manager_module_css_default.sectionSize + " " + config_manager_module_css_default.mono,
23352
+ children: formatBytes$1(entrySize)
23353
+ }),
23354
+ unread.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23355
+ className: config_manager_module_css_default.pickerCount,
23356
+ children: t("picker.pluginAreaUnread")
23357
+ })
23358
+ ]
23359
+ })
23360
+ })]
23361
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Collapse, {
23362
+ open,
23363
+ id: bodyId,
23364
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
23365
+ className: config_manager_module_css_default.pickerChildren,
23366
+ children: entry.leaves.map((leaf) => {
23367
+ const kindText = leafKindText(leaf.kind);
23368
+ const leafName = leaf.kind === "plugin" ? kindText : kindText + " · " + redact(leaf.label);
23369
+ if (leaf.state !== "present") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
23370
+ className: config_manager_module_css_default.pickerUnit + " " + config_manager_module_css_default.pickerUnitNested,
23371
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23372
+ className: config_manager_module_css_default.pickerChevronSpacer,
23373
+ "aria-hidden": "true"
23374
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
23375
+ className: config_manager_module_css_default.categoryItem,
23376
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23377
+ className: config_manager_module_css_default.pickerUnitName,
23378
+ title: redact(leaf.label),
23379
+ children: leafName
23380
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23381
+ className: config_manager_module_css_default.pickerCount,
23382
+ children: leaf.state === "unread" ? t("picker.pluginAreaUnread") : t("picker.pluginAreaAbsent")
23383
+ })]
23384
+ })]
23385
+ }, leaf.unitId);
23386
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
23387
+ className: config_manager_module_css_default.pickerUnit + " " + config_manager_module_css_default.pickerUnitNested,
23388
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23389
+ className: config_manager_module_css_default.pickerChevronSpacer,
23390
+ "aria-hidden": "true"
23391
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Checkbox, {
23392
+ checked: unitChecked(value, leaf.section, leaf.unitId),
23393
+ onChange: (checked) => {
23394
+ commit(toggleUnit(value, nodes, leaf.unitId, checked));
23395
+ },
23396
+ label: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
23397
+ className: config_manager_module_css_default.categoryItem,
23398
+ children: [
23399
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23400
+ className: config_manager_module_css_default.pickerUnitName,
23401
+ title: redact(leaf.label),
23402
+ children: leafName
23403
+ }),
23404
+ leaf.detail !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23405
+ className: config_manager_module_css_default.pickerUnitDetail,
23406
+ children: redact(leaf.detail)
23407
+ }),
23408
+ leaf.sizeBytes > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23409
+ className: config_manager_module_css_default.sectionSize + " " + config_manager_module_css_default.mono,
23410
+ children: formatBytes$1(leaf.sizeBytes)
23411
+ })
23412
+ ]
23413
+ })
23414
+ })]
23415
+ }, leaf.unitId);
23416
+ })
23417
+ })
23418
+ })]
23419
+ }, entry.name);
23420
+ })
23421
+ ] });
23422
+ const bucketsBody = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: tree.buckets.map((bucket) => {
23423
+ const node = nodes.find((n) => n.section === bucket.section);
23424
+ if (node === void 0) return null;
23425
+ const key = "bucket:" + bucket.section;
23426
+ const open = expandedPlugins[key] === true;
23427
+ const units = visibleUnits(bucket.units, showAllUnits[key] === true);
23428
+ const bodyId = "picker-bucket-" + bucket.section;
23429
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
23430
+ className: config_manager_module_css_default.pickerGroup,
23431
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
23432
+ className: config_manager_module_css_default.pickerTreeRow,
23433
+ children: [bucket.units.length > 0 || !bucket.loaded ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
23434
+ type: "button",
23435
+ className: config_manager_module_css_default.iconBtn,
23436
+ "data-size": "sm",
23437
+ "aria-expanded": open,
23438
+ "aria-controls": bodyId,
23439
+ "aria-label": open ? t("picker.collapse") : t("picker.expand"),
23440
+ title: open ? t("picker.collapse") : t("picker.expand"),
23441
+ onClick: () => {
23442
+ if (!open && !bucket.loaded) onRequestUnits?.(bucket.section);
23443
+ setExpandedPlugins({
23444
+ ...expandedPlugins,
23445
+ [key]: !open
23446
+ });
23447
+ },
23448
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ExpandChevron, { open })
23449
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23450
+ className: config_manager_module_css_default.pickerChevronSpacer,
23451
+ "aria-hidden": "true"
23452
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Checkbox, {
23453
+ checked: sectionPickState(value, node) === "all",
23454
+ onChange: (checked) => {
23455
+ commit(toggleSection(value, node, checked), focusOf(node.section));
23456
+ },
23457
+ label: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
23458
+ className: config_manager_module_css_default.categoryItem,
23459
+ children: [
23460
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23461
+ className: config_manager_module_css_default.pickerUnitName,
23462
+ children: bucketLabel(bucket.section)
23463
+ }),
23464
+ sectionPickState(value, node) === "partial" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Badge, {
23465
+ kind: "info",
23466
+ children: t("picker.partial")
23467
+ }),
23468
+ node.portability === "deviceSpecific" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Badge, {
23469
+ kind: "warn",
23470
+ children: t("picker.deviceSpecific")
23471
+ }),
23472
+ bucket.loaded && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23473
+ className: config_manager_module_css_default.pickerCount,
23474
+ children: t("picker.selectedOf", {
23475
+ selected: String(selectedUnitCount(value, node)),
23476
+ total: String(node.units.length === 0 ? node.count : node.units.length)
23477
+ })
23478
+ }),
23479
+ bucket.loaded && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InfoHint, {
23480
+ text: t("picker.bucketHint"),
23481
+ t
23482
+ })
23483
+ ]
23484
+ })
23485
+ })]
23486
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Collapse, {
23487
+ open,
23488
+ id: bodyId,
23489
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
23490
+ className: config_manager_module_css_default.pickerChildren,
23491
+ children: [units.shown.map((u) => renderUnitRow(node, u, true)), units.hidden > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
23492
+ className: config_manager_module_css_default.pickerMore,
23493
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
23494
+ type: "button",
23495
+ className: config_manager_module_css_default.ghostButton,
23496
+ "data-size": "sm",
23497
+ onClick: () => {
23498
+ setShowAllUnits({
23499
+ ...showAllUnits,
23500
+ [key]: true
23501
+ });
23502
+ },
23503
+ children: t("picker.showAll", { count: String(bucket.units.length) })
23504
+ })
23505
+ })]
23506
+ })
23507
+ })]
23508
+ }, key);
23509
+ }) });
23510
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
23511
+ className: config_manager_module_css_default.pickerGroup,
23512
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
23513
+ className: config_manager_module_css_default.pickerTreeRow,
23514
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
23515
+ type: "button",
23516
+ className: config_manager_module_css_default.iconBtn,
23517
+ "data-size": "sm",
23518
+ "aria-expanded": rootOpen,
23519
+ "aria-controls": "picker-plugin-root",
23520
+ "aria-label": rootOpen ? t("picker.collapse") : t("picker.expand"),
23521
+ title: rootOpen ? t("picker.collapse") : t("picker.expand"),
23522
+ onClick: () => {
23523
+ if (!rootOpen) for (const s of rootUnread) onRequestUnits?.(s);
23524
+ setExpandedPlugins({
23525
+ ...expandedPlugins,
23526
+ [rootKey]: !rootOpen
23527
+ });
23528
+ },
23529
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ExpandChevron, { open: rootOpen })
23530
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Checkbox, {
23531
+ checked: rootState === "all",
23532
+ onChange: (checked) => {
23533
+ if (!checked) {
23534
+ setPendingChecks((prev) => prev.filter((p) => p.kind !== "root"));
23535
+ commit(togglePluginTree(value, nodes, tree, false));
23536
+ return;
23537
+ }
23538
+ for (const s of rootUnread) onRequestUnits?.(s);
23539
+ if (!tree.pluginsLoaded || tree.entries.some((e) => pluginEntryUnreadSections(e).length > 0)) setPendingChecks((prev) => prev.some((p) => p.kind === "root") ? prev : [...prev, {
23540
+ key: rootKey,
23541
+ kind: "root"
23542
+ }]);
23543
+ commit(togglePluginTree(value, nodes, tree, true));
23544
+ },
23545
+ label: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
23546
+ className: config_manager_module_css_default.categoryItem,
23547
+ children: [
23548
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23549
+ className: config_manager_module_css_default.categoryName,
23550
+ children: t("picker.pluginRoot")
23551
+ }),
23552
+ rootState === "partial" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Badge, {
23553
+ kind: "info",
23554
+ children: t("picker.partial")
23555
+ }),
23556
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23557
+ className: config_manager_module_css_default.pickerCount,
23558
+ children: t("picker.selectedOf", {
23559
+ selected: String(rootPicked),
23560
+ total: String(rootTotal)
23561
+ })
23562
+ }),
23563
+ rootSize > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23564
+ className: config_manager_module_css_default.sectionSize + " " + config_manager_module_css_default.mono,
23565
+ children: formatBytes$1(rootSize)
23566
+ }),
23567
+ rootUnread.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23568
+ className: config_manager_module_css_default.pickerCount,
23569
+ children: t("picker.pluginAreaUnread")
23570
+ })
23571
+ ]
23572
+ })
23573
+ })]
23574
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Collapse, {
23575
+ open: rootOpen,
23576
+ id: "picker-plugin-root",
23577
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
23578
+ className: config_manager_module_css_default.pickerChildren,
23579
+ children: body
23580
+ })
23581
+ })]
23582
+ }), bucketsBody] });
23583
+ };
22744
23584
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
22745
23585
  className: config_manager_module_css_default.pickerRoot,
22746
23586
  children: [
@@ -22790,7 +23630,21 @@ function ContentPicker({ nodes, value, onChange, t, sectionLabel, loading = fals
22790
23630
  }),
22791
23631
  visible.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
22792
23632
  className: config_manager_module_css_default.pickerList,
22793
- children: visible.map((node) => {
23633
+ children: visible.map((node, nodeIndex) => {
23634
+ /**
23635
+ * 分组标题:只在**分组变化处**插一行(顺序 = 调用方给的顺序,UI 不重排)。
23636
+ * 没有 group 的调用方(导入向导 / 市场)整段不渲染 —— 行为逐像素不变。
23637
+ * 标题不是选项(DESIGN.md:更小更淡、不可选中、非首组起分隔线),
23638
+ * 因此这里用 span 而不是 Checkbox —— 免得被读成「灰掉的选项」。
23639
+ */
23640
+ const groupTitle = node.group !== void 0 && (nodeIndex === 0 || visible[nodeIndex - 1]?.group !== node.group) ? node.group : void 0;
23641
+ /**
23642
+ * 「插件与扩展」组里的四个插件分区(plugins / pluginFiles / pluginData / pluginAssets)
23643
+ * 合并成一棵按插件分组的树:只在其中**第一个出现**的分区处渲染一次(见 renderPluginTree),
23644
+ * 其余成员就地跳过 —— 顺序仍由调用方给的节点顺序决定,不引入第二个排序来源。
23645
+ * `self`(配置管理器设置)不在那四项里,照旧按普通分区行渲染。
23646
+ */
23647
+ if (isPluginTreeSection(node.section) && node.section !== firstTreeSection) return null;
22794
23648
  const state = sectionPickState(value, node);
22795
23649
  const open = expanded[node.section] === true;
22796
23650
  const picked = selectedUnitCount(value, node);
@@ -22812,7 +23666,16 @@ function ContentPicker({ nodes, value, onChange, t, sectionLabel, loading = fals
22812
23666
  };
22813
23667
  /** 本帧要渲染的单元(默认前 N 条;UI-15) */
22814
23668
  const units = visibleUnits(node.units, showAllUnits[node.section] === true);
22815
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
23669
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react.Fragment, { children: [groupTitle !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
23670
+ className: config_manager_module_css_default.pickerGroupTitle,
23671
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23672
+ className: config_manager_module_css_default.pickerGroupTitleName,
23673
+ children: t(GROUP_TITLE_KEY[groupTitle])
23674
+ }), groupTitle === "extensions" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InfoHint, {
23675
+ text: t("picker.groupHint.extensions"),
23676
+ t
23677
+ })]
23678
+ }), node.section === firstTreeSection ? renderPluginTree() : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
22816
23679
  className: config_manager_module_css_default.pickerGroup,
22817
23680
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
22818
23681
  className: config_manager_module_css_default.pickerTreeRow,
@@ -22880,138 +23743,87 @@ function ContentPicker({ nodes, value, onChange, t, sectionLabel, loading = fals
22880
23743
  ]
22881
23744
  })
22882
23745
  })]
22883
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Collapse, {
23746
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Collapse, {
22884
23747
  open,
22885
23748
  id: unitsId(node.section),
22886
- children: [groupUnits(units.shown).map((group, gi) => {
22887
- const groupState = groupPickState(value, group, node.section);
22888
- const groupPicked = groupSelectedCount(value, group, node.section);
22889
- const groupKey = node.section + ":" + (group.label ?? "__flat");
22890
- const groupOpen = group.label === null || expandedGroups[groupKey] === true;
22891
- const groupBodyId = "picker-units-" + node.section + "-g" + String(gi);
22892
- /**
22893
- * 单个单元行。G-01:单元名与 detail 都是**宿主下发的文本**(导入侧来自备份包内的
22894
- * 单元名/会话名),必须同等待遇 —— 显示文本与 title 都先过 redact,且
22895
- * **先脱敏、后省略**(反过来的话,被截断的密钥不再匹配值形状模式而漏网)。
22896
- */
22897
- const renderUnit = (u) => {
22898
- const safeLabel = redact(u.label);
22899
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
22900
- className: group.label !== null ? config_manager_module_css_default.pickerUnit + " " + config_manager_module_css_default.pickerUnitNested : config_manager_module_css_default.pickerUnit,
22901
- children: [group.label !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
22902
- className: config_manager_module_css_default.pickerChevronSpacer,
22903
- "aria-hidden": "true"
23749
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
23750
+ className: config_manager_module_css_default.pickerChildren,
23751
+ children: [groupUnits(units.shown).map((group, gi) => {
23752
+ const groupState = groupPickState(value, group, node.section);
23753
+ const groupPicked = groupSelectedCount(value, group, node.section);
23754
+ const groupKey = node.section + ":" + (group.label ?? "__flat");
23755
+ const groupOpen = group.label === null || expandedGroups[groupKey] === true;
23756
+ const groupBodyId = "picker-units-" + node.section + "-g" + String(gi);
23757
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [group.label !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
23758
+ className: config_manager_module_css_default.pickerTreeRow + " " + config_manager_module_css_default.pickerSubgroup,
23759
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
23760
+ type: "button",
23761
+ className: config_manager_module_css_default.iconBtn,
23762
+ "data-size": "sm",
23763
+ "aria-expanded": groupOpen,
23764
+ "aria-controls": groupBodyId,
23765
+ "aria-label": groupOpen ? t("picker.collapse") : t("picker.expand"),
23766
+ title: groupOpen ? t("picker.collapse") : t("picker.expand"),
23767
+ onClick: () => {
23768
+ setExpandedGroups({
23769
+ ...expandedGroups,
23770
+ [groupKey]: !groupOpen
23771
+ });
23772
+ },
23773
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ExpandChevron, { open: groupOpen })
22904
23774
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Checkbox, {
22905
- checked: unitChecked(value, node.section, u.id),
23775
+ checked: groupState === "all",
22906
23776
  onChange: (checked) => {
22907
- commit(toggleUnit(value, nodes, u.id, checked), focusOf(node.section), {
22908
- unitId: u.id,
22909
- checked
22910
- });
23777
+ commit(toggleUnitGroup(value, node, group, checked), focusOf(node.section));
22911
23778
  },
22912
23779
  label: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
22913
23780
  className: config_manager_module_css_default.categoryItem,
22914
23781
  children: [
22915
- u.blank === true ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
22916
- className: config_manager_module_css_default.pickerUnitName,
22917
- title: safeLabel,
22918
- children: t("picker.blankSession")
22919
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
22920
- className: config_manager_module_css_default.pickerUnitName,
22921
- title: safeLabel,
22922
- children: tailWeightedEllipsis(safeLabel, UNIT_NAME_MAX)
23782
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23783
+ className: config_manager_module_css_default.pickerSubgroupName,
23784
+ title: redact(group.label),
23785
+ children: redact(group.label)
22923
23786
  }),
22924
- u.lockedWith !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
22925
- title: t("picker.lockedHint"),
22926
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Badge, {
22927
- kind: "warn",
22928
- children: t("picker.locked")
22929
- })
23787
+ groupState === "partial" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Badge, {
23788
+ kind: "info",
23789
+ children: t("picker.partial")
22930
23790
  }),
22931
- u.fileCount !== void 0 && u.fileCount > 1 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
23791
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
22932
23792
  className: config_manager_module_css_default.pickerCount,
22933
- children: t("picker.fileCount", { count: String(u.fileCount) })
22934
- }),
22935
- unitBadge?.(node.section, u.id),
22936
- u.detail !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
22937
- className: config_manager_module_css_default.pickerUnitDetail,
22938
- children: redact(u.detail)
22939
- }),
22940
- u.sizeBytes > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
22941
- className: config_manager_module_css_default.sectionSize + " " + config_manager_module_css_default.mono,
22942
- children: formatBytes$1(u.sizeBytes)
23793
+ children: t("picker.selectedOf", {
23794
+ selected: String(groupPicked),
23795
+ total: String(group.units.length)
23796
+ })
22943
23797
  })
22944
23798
  ]
22945
23799
  })
22946
23800
  })]
22947
- }, u.id);
22948
- };
22949
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [group.label !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
22950
- className: config_manager_module_css_default.pickerTreeRow + " " + config_manager_module_css_default.pickerSubgroup,
22951
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
23801
+ }), group.label === null ? group.units.map((u) => renderUnitRow(node, u, true)) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Collapse, {
23802
+ open: groupOpen,
23803
+ id: groupBodyId,
23804
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
23805
+ className: config_manager_module_css_default.pickerChildren,
23806
+ children: group.units.map((u) => renderUnitRow(node, u, true))
23807
+ })
23808
+ })] }, groupKey);
23809
+ }), units.hidden > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
23810
+ className: config_manager_module_css_default.pickerMore,
23811
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
22952
23812
  type: "button",
22953
- className: config_manager_module_css_default.iconBtn,
23813
+ className: config_manager_module_css_default.ghostButton,
22954
23814
  "data-size": "sm",
22955
- "aria-expanded": groupOpen,
22956
- "aria-controls": groupBodyId,
22957
- "aria-label": groupOpen ? t("picker.collapse") : t("picker.expand"),
22958
- title: groupOpen ? t("picker.collapse") : t("picker.expand"),
22959
23815
  onClick: () => {
22960
- setExpandedGroups({
22961
- ...expandedGroups,
22962
- [groupKey]: !groupOpen
23816
+ setShowAllUnits({
23817
+ ...showAllUnits,
23818
+ [node.section]: true
22963
23819
  });
22964
23820
  },
22965
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ExpandChevron, { open: groupOpen })
22966
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Checkbox, {
22967
- checked: groupState === "all",
22968
- onChange: (checked) => {
22969
- commit(toggleUnitGroup(value, node, group, checked), focusOf(node.section));
22970
- },
22971
- label: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
22972
- className: config_manager_module_css_default.categoryItem,
22973
- children: [
22974
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
22975
- className: config_manager_module_css_default.pickerSubgroupName,
22976
- title: redact(group.label),
22977
- children: redact(group.label)
22978
- }),
22979
- groupState === "partial" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Badge, {
22980
- kind: "info",
22981
- children: t("picker.partial")
22982
- }),
22983
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
22984
- className: config_manager_module_css_default.pickerCount,
22985
- children: t("picker.selectedOf", {
22986
- selected: String(groupPicked),
22987
- total: String(group.units.length)
22988
- })
22989
- })
22990
- ]
22991
- })
22992
- })]
22993
- }), group.label === null ? group.units.map(renderUnit) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Collapse, {
22994
- open: groupOpen,
22995
- id: groupBodyId,
22996
- children: group.units.map(renderUnit)
22997
- })] }, groupKey);
22998
- }), units.hidden > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
22999
- className: config_manager_module_css_default.pickerMore,
23000
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
23001
- type: "button",
23002
- className: config_manager_module_css_default.ghostButton,
23003
- "data-size": "sm",
23004
- onClick: () => {
23005
- setShowAllUnits({
23006
- ...showAllUnits,
23007
- [node.section]: true
23008
- });
23009
- },
23010
- children: t("picker.showAll", { count: String(node.units.length) })
23011
- })
23012
- })]
23821
+ children: t("picker.showAll", { count: String(node.units.length) })
23822
+ })
23823
+ })]
23824
+ })
23013
23825
  })]
23014
- }, node.section);
23826
+ })] }, node.section);
23015
23827
  })
23016
23828
  }),
23017
23829
  busy && !loading && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -23829,7 +24641,8 @@ function ExportView({ api, t }) {
23829
24641
  units: got?.items ?? [],
23830
24642
  unitsUnread: got === void 0,
23831
24643
  portability: c.portability,
23832
- sensitive: c.sensitive === true
24644
+ sensitive: c.sensitive === true,
24645
+ group: c.group
23833
24646
  };
23834
24647
  });
23835
24648
  /**
@@ -29918,6 +30731,65 @@ function UnreadableSnapshotsBanner({ items, t }) {
29918
30731
  });
29919
30732
  }
29920
30733
  //#endregion
30734
+ //#region src/client/sync/PushPreviewCard.tsx
30735
+ /** P0-②:push 预览内容(绑 src/ui/i18n.ts 的 UiT 文案;纯展示,无敏感字段)。 */
30736
+ function PushPreviewCard({ preview, t, uiT, sectionName }) {
30737
+ const view = pushPreviewView(preview, uiT);
30738
+ if (view === null) return null;
30739
+ if (view.error !== null) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
30740
+ kind: "error",
30741
+ children: view.error
30742
+ });
30743
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
30744
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
30745
+ kind: "info",
30746
+ children: view.headline
30747
+ }),
30748
+ view.previewHint !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
30749
+ className: config_manager_module_css_default.hint,
30750
+ children: view.previewHint
30751
+ }),
30752
+ view.remoteSnapshotCount === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
30753
+ kind: "warn",
30754
+ children: t("syncflow.pushFirstBaseline")
30755
+ }),
30756
+ view.encryptedHint !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
30757
+ kind: "warn",
30758
+ children: view.encryptedHint
30759
+ }),
30760
+ view.credentialsHint !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
30761
+ kind: "warn",
30762
+ children: view.credentialsHint
30763
+ }),
30764
+ view.hint !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
30765
+ kind: "warn",
30766
+ children: view.hint
30767
+ }),
30768
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Card, {
30769
+ className: config_manager_module_css_default.card,
30770
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
30771
+ className: config_manager_module_css_default.groupLabel,
30772
+ children: t("syncflow.pushPreviewSections")
30773
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
30774
+ className: config_manager_module_css_default.planScroll,
30775
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
30776
+ className: config_manager_module_css_default.reportList,
30777
+ children: view.rows.map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", { children: [
30778
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
30779
+ className: config_manager_module_css_default.kindTag,
30780
+ children: row.changed ? t("syncflow.pushChanged") : t("syncflow.pushUnchanged")
30781
+ }),
30782
+ " ",
30783
+ sectionName(row.section),
30784
+ " · ",
30785
+ row.count
30786
+ ] }, row.section))
30787
+ })
30788
+ })]
30789
+ })
30790
+ ] });
30791
+ }
30792
+ //#endregion
29921
30793
  //#region src/client/sync/SyncConfirmView.tsx
29922
30794
  /**
29923
30795
  * 一键同步差异确认视图(方案 A §5 差异确认数据流)。
@@ -31947,59 +32819,6 @@ function SyncPanel({ api, t, cmT }) {
31947
32819
  ]
31948
32820
  });
31949
32821
  }
31950
- /** P0-②:push 预览内容(绑 src/ui/i18n.ts 的 UiT 文案;纯展示,无敏感字段)。 */
31951
- function PushPreviewCard({ preview, t, uiT, sectionName }) {
31952
- const view = pushPreviewView(preview, uiT);
31953
- if (view === null) return null;
31954
- if (view.error !== null) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
31955
- kind: "error",
31956
- children: view.error
31957
- });
31958
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
31959
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
31960
- kind: "info",
31961
- children: view.headline
31962
- }),
31963
- view.previewHint !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
31964
- className: config_manager_module_css_default.hint,
31965
- children: view.previewHint
31966
- }),
31967
- view.remoteSnapshotCount === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
31968
- kind: "warn",
31969
- children: t("syncflow.pushFirstBaseline")
31970
- }),
31971
- view.encryptedHint !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
31972
- kind: "warn",
31973
- children: view.encryptedHint
31974
- }),
31975
- view.credentialsHint !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
31976
- kind: "warn",
31977
- children: view.credentialsHint
31978
- }),
31979
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Card, {
31980
- className: config_manager_module_css_default.card,
31981
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
31982
- className: config_manager_module_css_default.groupLabel,
31983
- children: t("syncflow.pushPreviewSections")
31984
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
31985
- className: config_manager_module_css_default.planScroll,
31986
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
31987
- className: config_manager_module_css_default.reportList,
31988
- children: view.rows.map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", { children: [
31989
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
31990
- className: config_manager_module_css_default.kindTag,
31991
- children: row.changed ? t("syncflow.pushChanged") : t("syncflow.pushUnchanged")
31992
- }),
31993
- " ",
31994
- sectionName(row.section),
31995
- " · ",
31996
- row.count
31997
- ] }, row.section))
31998
- })
31999
- })]
32000
- })
32001
- ] });
32002
- }
32003
32822
  //#endregion
32004
32823
  //#region src/ui/market-import.ts
32005
32824
  /** 计划的纯诊断项(不写盘,不进选择列表,也不进逐项摘要)。 */
@@ -37022,8 +37841,17 @@ function DiskUsageCard({ api, infoHintLabel, onBackupsChanged }) {
37022
37841
  const [includeExpired, setIncludeExpired] = (0, react.useState)(false);
37023
37842
  const [confirmOpen, setConfirmOpen] = (0, react.useState)(false);
37024
37843
  const mountedRef = (0, react.useRef)(true);
37025
- (0, react.useEffect)(() => () => {
37026
- mountedRef.current = false;
37844
+ /**
37845
+ * 挂载标记:只在**卸载**时置 false,并在每次挂载时显式写回 true。
37846
+ * 必须写回:React 18 StrictMode 会走 `effect → cleanup → effect` 双调用,只挂 cleanup 的话
37847
+ * 第二次挂载后标记永远是 false ⇒ 清理请求的 resolve/reject 被整段吞掉,
37848
+ * 表现就是「点了清理,弹窗不关、按钮一直在转」。
37849
+ */
37850
+ (0, react.useEffect)(() => {
37851
+ mountedRef.current = true;
37852
+ return () => {
37853
+ mountedRef.current = false;
37854
+ };
37027
37855
  }, []);
37028
37856
  const load = () => {
37029
37857
  setStatus("loading");
@@ -37049,15 +37877,24 @@ function DiskUsageCard({ api, infoHintLabel, onBackupsChanged }) {
37049
37877
  const tmpMarket = vm?.clean.actions.find((a) => a.id === "tmp-market");
37050
37878
  const expiredExports = vm?.clean.actions.find((a) => a.id === "expired-exports");
37051
37879
  const nothingToReclaim = (tmpMarket?.bytes ?? 0) + (includeExpired ? expiredExports?.bytes ?? 0 : 0) === 0;
37880
+ /**
37881
+ * 清理:**点确认的那一刻就关掉弹窗**,进度交给卡片上的「立即清理」按钮承载
37882
+ * (loading 图标 + 文案「正在清理…」,见下方按钮)。
37883
+ *
37884
+ * 为什么不把 busy 留在弹窗里转圈:清理可能耗时数秒,而弹窗正好盖住卡片 ——
37885
+ * 用户既看不到按钮进入 loading,也看不到释放量从有变没,观感就是「点了没反应」。
37886
+ * 关窗**不等于操作可取消**:`busy` 期间刷新与清理按钮一律禁用、不会重复提交;
37887
+ * 失败走 toast(卡片保持 ready,不重载列表、不掉回骨架)。
37888
+ */
37052
37889
  const runCleanup = () => {
37053
37890
  if (busy) return;
37054
37891
  setBusy(true);
37892
+ setConfirmOpen(false);
37055
37893
  const categories = ["tmp"];
37056
37894
  if (includeExpired) categories.push("expired-exports");
37057
37895
  api.cleanupDiskUsage(categories).then((result) => {
37058
37896
  if (!mountedRef.current) return;
37059
37897
  setBusy(false);
37060
- setConfirmOpen(false);
37061
37898
  setReport(result.report);
37062
37899
  if (includeExpired) onBackupsChanged?.();
37063
37900
  const outcome = cleanupOutcome({
@@ -37078,7 +37915,6 @@ function DiskUsageCard({ api, infoHintLabel, onBackupsChanged }) {
37078
37915
  }, (err) => {
37079
37916
  if (!mountedRef.current) return;
37080
37917
  setBusy(false);
37081
- setConfirmOpen(false);
37082
37918
  toast.error(redact(err instanceof Error ? err.message : String(err)));
37083
37919
  });
37084
37920
  };
@@ -37708,6 +38544,51 @@ function rollbackPreviewScope(files, removals) {
37708
38544
  removals: removals.length
37709
38545
  };
37710
38546
  }
38547
+ /** 从预览推出可勾选行(只读;绝不改任何判定) */
38548
+ function rollbackSelectionRows(preview) {
38549
+ const files = preview?.workspace?.files;
38550
+ if (!Array.isArray(files)) return [];
38551
+ const out = [];
38552
+ for (const file of files) {
38553
+ if (file === null || typeof file !== "object") continue;
38554
+ const path = typeof file.path === "string" ? file.path : "";
38555
+ if (path === "") continue;
38556
+ const row = {
38557
+ path,
38558
+ parts: splitRollbackPath(path),
38559
+ foreign: file.foreign === true
38560
+ };
38561
+ if (row.foreign && typeof file.foreignSessionId === "string" && file.foreignSessionId !== "") row.foreignSessionId = file.foreignSessionId;
38562
+ out.push(row);
38563
+ }
38564
+ return out;
38565
+ }
38566
+ /**
38567
+ * 默认勾选 = **非 foreign** 的行(B 的自动隔离口径)。用户可在弹窗里逐个改回去。
38568
+ *
38569
+ * 为什么要在这里定而不在组件里:同一条默认值要在面板与聊天两个入口一致,
38570
+ * 且「默认排除别的会话的改动」是产品决定,必须可测。
38571
+ */
38572
+ function rollbackDefaultSelection(rows) {
38573
+ return rows.filter((row) => !row.foreign).map((row) => row.path);
38574
+ }
38575
+ /**
38576
+ * 勾选集 → `onlyPaths`:
38577
+ * · **全选**(含空清单)⇒ `null`(不传字段 = 走既有全量口径,老宿主也照样工作);
38578
+ * · 真的少勾 ⇒ 把选中的清单原样传给宿主(空数组由调用方拦:宿主侧它是 400)。
38579
+ */
38580
+ function rollbackOnlyPaths(rows, selected) {
38581
+ if (rows.length === 0) return null;
38582
+ const chosen = new Set(selected);
38583
+ const picked = rows.filter((row) => chosen.has(row.path)).map((row) => row.path);
38584
+ return picked.length === rows.length ? null : picked;
38585
+ }
38586
+ /** 该不该拦住提交:清单非空、却一个都没勾(宿主会把空数组当 400) */
38587
+ function rollbackSelectionBlocksSubmit(rows, selected) {
38588
+ if (rows.length === 0) return false;
38589
+ const chosen = new Set(selected);
38590
+ return !rows.some((row) => chosen.has(row.path));
38591
+ }
37711
38592
  /**
37712
38593
  * 差异无法逐行展示时的字典键(本层**只回键**,文案在字典里)。
37713
38594
  * 未知 / 缺失原因回落 null —— 调用方按「未知原因」出话,绝不回落成「没有差异」(那是另一件事)。
@@ -37886,7 +38767,14 @@ function rollbackRewindRows(result) {
37886
38767
  leftoversTruncated: segment.leftoversTruncated === true || segment.createdAfterTruncated === true,
37887
38768
  childSessionId,
37888
38769
  detail: redactLines(segment.detail),
37889
- guidance: rollbackGuidanceRows(segment.guidance)
38770
+ guidance: rollbackGuidanceRows(segment.guidance),
38771
+ foreignSkipped: numberOrNull(segment.foreignSkipped) ?? 0,
38772
+ selectionSkipped: numberOrNull(segment.selectionSkipped) ?? 0,
38773
+ mergedCount: numberOrNull(segment.mergedCount) ?? 0,
38774
+ conflictCount: numberOrNull(segment.conflictCount) ?? 0,
38775
+ conflictPaths: redactLines(segment.conflictPaths),
38776
+ unavailableCount: numberOrNull(segment.unavailableCount) ?? 0,
38777
+ concurrentCount: numberOrNull(segment.concurrentCount) ?? 0
37890
38778
  };
37891
38779
  });
37892
38780
  }
@@ -38774,12 +39662,37 @@ var ChatPointWindowController = class {
38774
39662
  const CHAT_NODE_SLOT = "conversation.chat.node";
38775
39663
  /** 本插件接管的 entry key(= 用户消息;steering 是**另一个** key,一律不接管)。 */
38776
39664
  const CHAT_NODE_USER_KEY = "user";
38777
- function planChatNodeRegistration(declaredKind) {
39665
+ /** 从 `entriesOfSlot('conversation.chat.node')` 的返回值里读 user cell 的赢家(形状不符一律 null)。 */
39666
+ function chatNodeUserOccupant(entries) {
39667
+ if (!Array.isArray(entries)) return null;
39668
+ let winner = null;
39669
+ for (const entry of entries) {
39670
+ const record = asRecord$1(entry);
39671
+ const options = asRecord$1(record?.["options"]);
39672
+ if (options === null || options["key"] !== "user") continue;
39673
+ const raw = options["priority"];
39674
+ const priority = typeof raw === "number" && Number.isFinite(raw) ? raw : 0;
39675
+ const label = record?.["registrant"] ?? options["registrant"];
39676
+ const registrant = typeof label === "string" && label !== "" ? label : null;
39677
+ if (winner === null || priority < winner.priority) winner = {
39678
+ priority,
39679
+ registrant
39680
+ };
39681
+ }
39682
+ return winner;
39683
+ }
39684
+ function planChatNodeRegistration(declaredKind, occupant = null) {
38778
39685
  if (declaredKind !== "keyed") return {
38779
39686
  kind: "skip",
38780
39687
  reason: "slot-kind-mismatch",
38781
39688
  declared: declaredKind
38782
39689
  };
39690
+ if (occupant !== null && occupant.priority < -1) return {
39691
+ kind: "skip",
39692
+ reason: "shadowed",
39693
+ declared: declaredKind,
39694
+ occupant
39695
+ };
38783
39696
  return { kind: "register" };
38784
39697
  }
38785
39698
  function asRecord$1(value) {
@@ -38804,6 +39717,19 @@ function chatNodeTurn(node) {
38804
39717
  status: typeof status === "string" ? status : null
38805
39718
  };
38806
39719
  }
39720
+ /**
39721
+ * 宿主 `conversation.chat.user.content`(Factory 位)的名字。
39722
+ *
39723
+ * 0.2.1-alpha.3 起用户气泡的正文/附件/引用**整体换轨**到这条 factory:图片位
39724
+ * `conversation.chat.user.images` 是它的 children(single/session),旧的 `conversation.message.images`
39725
+ * 与节点 props 上的 `renderMessageImages` 同时删除(本机解包 0.2.1-rc.2 实测:后者 0 次出现)。
39726
+ * 因此「接管 user 之后自己复刻气泡」这条路在 0.2.1 上拿不到图片位(issue #92)——正确做法是把正文
39727
+ * **委托回宿主自己的 content factory**,图片由 ui-attachment 在该 factory 的渲染上下文里 renderSlot。
39728
+ *
39729
+ * 老宿主(≤0.2.0)没有这条 factory:`FactoryOutlet` 在定义缺失时回落调用方给的 `options.fallback`
39730
+ * ⇒ 渲染层把**自绘气泡**当 fallback 传进去,0.1.x/0.2.0 的路径逐字不变(一个版本双栈兼容)。
39731
+ */
39732
+ const CHAT_USER_CONTENT_FACTORY = "conversation.chat.user.content";
38807
39733
  /** 宿主 `compactImages` 的同一口径:**附件总数**(图片 + 文件)> 1。 */
38808
39734
  function chatEntryCompactOf(view) {
38809
39735
  return view.attachments.length > 1;
@@ -38851,11 +39777,12 @@ function formatChatEntryClock(time) {
38851
39777
  */
38852
39778
  const CHAT_SESSION_WIRE_RE = /@\[([^\]\n]+)\]\(dsh-session:[^)\s]+\)/gu;
38853
39779
  /**
38854
- * 正文的**最小文本投影**:把会话引用线格式换成它的人类可读 label。
39780
+ * 正文的**最小文本投影**(宿主投影不可用时的兜底):把会话引用线格式换成它的人类可读 label。
38855
39781
  *
38856
- * 宿主做的是「换成 chip 节点」(`projectUserText`,还会把裸 `@name` 也装饰成 chip、把引用汇总成
38857
- * 一行 referenceSummary);我们**不做 chip**(ui-primitives 包私有、不可导入,见 G-39 已追认差距),
38858
- * 但**绝不把线格式原样打给用户看** —— 那是机器的编码,正常人读不了(t4 复核 D5,medium)。
39782
+ * 2026-10-15 起:气泡正文**优先走宿主自己的** `projectUserText`(见 `projectChatEntryTextWithHost`
39783
+ * —— 它能把会话引用与技能渲染成 chip,并在给了打开器时可点开);本函数是**兜底与纯文本路径**
39784
+ * (复制按钮、错误边界降级、老宿主没有原语包时)的唯一实现:任何情况下都**不把线格式原样打给用户看**
39785
+ * (那是机器的编码,正常人读不了 —— t4 复核 D5,medium)。
38859
39786
  * 与宿主一致的边界:只认 `dsh-session:` 的括号形式;`g` flag 下逐处替换,正则自身 lastIndex 置零。
38860
39787
  */
38861
39788
  function projectChatEntryText(text) {
@@ -38864,6 +39791,33 @@ function projectChatEntryText(text) {
38864
39791
  return text.replace(CHAT_SESSION_WIRE_RE, "$1");
38865
39792
  }
38866
39793
  /**
39794
+ * 用**宿主自己**的 `projectUserText` 投影正文(2026-10-15:按生态既有做法补齐 G-39 差距①)。
39795
+ *
39796
+ * 实证(为什么这条现在成立):ui-primitives 由 DSH shell 的模块表作为 static module seed 预置,
39797
+ * 插件 bundle 的 `require` 能命中 —— 第三方插件 dsh-reedit 就是这么拿 `projectUserText` 的,
39798
+ * 本仓的 `RollbackFileIcon` 也早就这样拿 `FileTypeIcon`。**只能帧内惰取**(顶层 import 在老宿主
39799
+ * 会打挂整个浏览器半加载),入口在 `common/host-primitives.ts`。
39800
+ *
39801
+ * 四条判据缺一不可(本函数**绝不抛**,任一条不满足就回 null ⇒ 调用方回落 `projectChatEntryText`):
39802
+ * ① 有投影器(老宿主没有原语包 → null);② 原文非空;
39803
+ * ③ 投影不抛错;④ 投影返回**非空节点**(null/undefined/false = 宿主拒绝了这段文本)。
39804
+ *
39805
+ * 为什么投影要当参数传进来:纯层与单测都不认识模块表 —— 抽成参数后,上面四条判据能逐条覆盖。
39806
+ */
39807
+ function projectChatEntryTextWithHost(projector, rawText, options = {}) {
39808
+ if (typeof projector !== "function") return null;
39809
+ if (rawText === "") return null;
39810
+ try {
39811
+ const node = projector(rawText, options.sessionLabels ?? [], options.skillNames ?? [], "skill", {
39812
+ openFile: options.openFile,
39813
+ openSkill: options.openSkill
39814
+ });
39815
+ return node === null || node === void 0 || node === false ? null : node;
39816
+ } catch {
39817
+ return null;
39818
+ }
39819
+ }
39820
+ /**
38867
39821
  * 扩展名 → 文件卡上的短徽标:宿主 `fileExtension` + 宿主那行 meta 的同一截断
38868
39822
  * (`fileExtension(name).toUpperCase().slice(0, 8)`);后缀为空(无点 / 点在末尾)回 null。
38869
39823
  *
@@ -38913,7 +39867,9 @@ function buildChatEntryBubble(content) {
38913
39867
  const text = projectChatEntryText(content);
38914
39868
  return {
38915
39869
  text,
39870
+ rawText: content,
38916
39871
  attachments: [],
39872
+ hostAttachments: [],
38917
39873
  images: [],
38918
39874
  files: [],
38919
39875
  raw: [],
@@ -38922,7 +39878,9 @@ function buildChatEntryBubble(content) {
38922
39878
  }
38923
39879
  if (!Array.isArray(content)) return {
38924
39880
  text: "",
39881
+ rawText: "",
38925
39882
  attachments: [],
39883
+ hostAttachments: [],
38926
39884
  images: [],
38927
39885
  files: [],
38928
39886
  raw: content === null || content === void 0 ? [] : [{
@@ -38932,12 +39890,15 @@ function buildChatEntryBubble(content) {
38932
39890
  showBubble: content !== null && content !== void 0
38933
39891
  };
38934
39892
  const texts = [];
39893
+ const rawTexts = [];
38935
39894
  const attachments = [];
39895
+ const hostAttachments = [];
38936
39896
  const raw = [];
38937
39897
  content.forEach((block, index) => {
38938
39898
  const record = asRecord$1(block);
38939
39899
  const type = record?.["type"];
38940
39900
  if (type === "text" && typeof record?.["text"] === "string") {
39901
+ rawTexts.push(record["text"]);
38941
39902
  texts.push(projectChatEntryText(record["text"]));
38942
39903
  return;
38943
39904
  }
@@ -38946,6 +39907,10 @@ function buildChatEntryBubble(content) {
38946
39907
  kind: "image",
38947
39908
  image: { attachment: record["attachment"] }
38948
39909
  });
39910
+ hostAttachments.push({
39911
+ type: "image",
39912
+ image: { attachment: record["attachment"] }
39913
+ });
38949
39914
  return;
38950
39915
  }
38951
39916
  if (type === "file" && record?.["attachment"] !== void 0) {
@@ -38960,6 +39925,10 @@ function buildChatEntryBubble(content) {
38960
39925
  bytes: typeof bytes === "number" && Number.isFinite(bytes) ? bytes : null
38961
39926
  }
38962
39927
  });
39928
+ hostAttachments.push({
39929
+ type: "file",
39930
+ file: record["attachment"]
39931
+ });
38963
39932
  return;
38964
39933
  }
38965
39934
  raw.push({
@@ -38970,7 +39939,9 @@ function buildChatEntryBubble(content) {
38970
39939
  const text = texts.join("");
38971
39940
  return {
38972
39941
  text,
39942
+ rawText: rawTexts.join(""),
38973
39943
  attachments,
39944
+ hostAttachments,
38974
39945
  images: attachments.flatMap((item) => item.kind === "image" ? [item.image] : []),
38975
39946
  files: attachments.flatMap((item) => item.kind === "file" ? [item.file] : []),
38976
39947
  raw,
@@ -38978,6 +39949,35 @@ function buildChatEntryBubble(content) {
38978
39949
  };
38979
39950
  }
38980
39951
  /**
39952
+ * 节点 data + 气泡视图 → 宿主 content factory 的入参(0.2.1+ 委托路径的**唯一**组装点)。
39953
+ *
39954
+ * 逐字对齐宿主 `UserStyleBubble` 的 `prepared` / `facts` 两段 useMemo:
39955
+ * · `content.text` = 未投影的文本拼接(宿主 factory 自己把它交给 `conversation.user.text` 投影成 chip);
39956
+ * · `content.attachments` = 宿主形状的有序附件(同一趟走查产出);
39957
+ * · `content.extraBlocks` = rest 块原样;
39958
+ * · `referenceLabels` / `sessionLabels` / `skillNames` **只在节点真的带了该字段时出现** ——
39959
+ * 宿主用「字段是否存在」区分「没带」与「空数组」,我们传 `[]` 会改变它的分支。
39960
+ *
39961
+ * 本函数不抛(读不到就按「没带」处理),与 buildChatEntryBubble 同一条纪律。
39962
+ */
39963
+ function buildHostUserContentInput(data, bubble) {
39964
+ const content = {
39965
+ text: bubble.rawText,
39966
+ attachments: bubble.hostAttachments,
39967
+ extraBlocks: bubble.raw.map((block) => block.payload)
39968
+ };
39969
+ const facts = {};
39970
+ if (data.referenceLabels !== null) {
39971
+ content.referenceLabels = data.referenceLabels;
39972
+ facts.sessionLabels = data.referenceLabels;
39973
+ }
39974
+ if (data.skillNames !== null) facts.skillNames = data.skillNames;
39975
+ return {
39976
+ content,
39977
+ facts
39978
+ };
39979
+ }
39980
+ /**
38981
39981
  * 有序附件 → 渲染计划(宿主 `attachments.map` 的逐字同构):
38982
39982
  * · **顺序 = content 原始顺序**(绝不重排成「先图片后文件」);
38983
39983
  * · 图片**每张一次** `renderMessageImages({ images: [image], align: 'end', compact })`
@@ -39113,13 +40113,15 @@ function shouldRetryChatPoint(lookup) {
39113
40113
  function buildChatEntryView(node) {
39114
40114
  const data = readChatEntryNodeData(node);
39115
40115
  const turn = chatNodeTurn(node);
40116
+ const bubble = buildChatEntryBubble(data.content);
39116
40117
  return {
39117
40118
  turnNumber: turn?.turn ?? null,
39118
40119
  turnStatus: turn?.status ?? null,
39119
- bubble: buildChatEntryBubble(data.content),
40120
+ bubble,
39120
40121
  clock: formatChatEntryClock(data.time),
39121
40122
  referenceLabels: data.referenceLabels ?? [],
39122
- skillNames: data.skillNames ?? []
40123
+ skillNames: data.skillNames ?? [],
40124
+ hostContent: buildHostUserContentInput(data, bubble)
39123
40125
  };
39124
40126
  }
39125
40127
  /**
@@ -39636,69 +40638,66 @@ function subscribeRollbackEntryEnabled(listener) {
39636
40638
  //#region src/client/recovery/RollbackDiffPane.tsx
39637
40639
  const rk$2 = (key) => key;
39638
40640
  function RollbackDiffPane({ state, rt, title, fill }) {
39639
- if (state.status === "loading") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Spinner, { label: rt("rollback.diff.loading") });
39640
- if (state.status === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
40641
+ /**
40642
+ * 撑满档(只给侧栏标签页)下**每一个状态都套同一个整块容器**:只让「就绪且有差异」撑满时,
40643
+ * 加载 / 一致 / 看不了 / 读失败会突然缩成一行 —— 那同样是「预览高度不跟侧栏走」,
40644
+ * 而且一屏高度在四种状态间来回跳。非撑满(弹窗内的降级通道)保持原样:不留白、不加外边距。
40645
+ */
40646
+ const shell = (body) => fill === true ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
40647
+ className: config_manager_module_css_default.diffPane + " " + config_manager_module_css_default.diffPaneFill,
40648
+ children: body
40649
+ }) : body;
40650
+ if (state.status === "loading") return shell(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Spinner, { label: rt("rollback.diff.loading") }));
40651
+ if (state.status === "error") return shell(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
39641
40652
  kind: "error",
39642
40653
  children: state.message === null ? rt("rollback.diff.failed") : redact(state.message)
39643
- });
40654
+ }));
39644
40655
  const diff = state.diff;
39645
40656
  if (diff.ok !== true) {
39646
40657
  const code = diff.code === void 0 || diff.code === "" ? "" : " — " + diff.code;
39647
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
40658
+ return shell(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
39648
40659
  kind: "error",
39649
40660
  children: rt("rollback.diff.failed") + code
39650
- });
40661
+ }));
39651
40662
  }
39652
40663
  if (!rollbackFileDiffComparable(diff)) {
39653
40664
  const key = rollbackFileDiffReasonKey(diff.reason);
39654
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
40665
+ return shell(/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39655
40666
  className: config_manager_module_css_default.hint,
39656
40667
  children: key === null ? rt("rollback.diff.reason.unknown") : rt(rk$2(key))
39657
- });
40668
+ }));
39658
40669
  }
39659
- if (diff.identical) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
40670
+ if (diff.mergeSkipped === true) return shell(/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
40671
+ className: config_manager_module_css_default.hint,
40672
+ children: rt(rk$2("rollback.diff.skipped"))
40673
+ }));
40674
+ if (diff.identical) return shell(/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39660
40675
  className: config_manager_module_css_default.hint,
39661
40676
  children: rt("rollback.diff.identical")
39662
- });
40677
+ }));
39663
40678
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39664
40679
  className: fill === true ? config_manager_module_css_default.diffPane + " " + config_manager_module_css_default.diffPaneFill : config_manager_module_css_default.diffPane,
39665
- children: [diff.degraded && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39666
- className: config_manager_module_css_default.hint,
39667
- children: rt("rollback.diff.degraded")
39668
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DiffTable, {
39669
- hunks: diff.hunks,
39670
- title,
39671
- beforeLabel: rt("rollback.diff.before"),
39672
- afterLabel: rt("rollback.diff.after"),
39673
- truncatedNotice: (shown, total) => rt("rollback.diff.truncated", {
39674
- shown: String(shown),
39675
- total: String(total)
40680
+ children: [
40681
+ diff.merged === true && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
40682
+ className: config_manager_module_css_default.hint,
40683
+ children: rt(rk$2("rollback.diff.merged"))
39676
40684
  }),
39677
- sanitize: redact
39678
- })]
40685
+ diff.degraded && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
40686
+ className: config_manager_module_css_default.hint,
40687
+ children: rt("rollback.diff.degraded")
40688
+ }),
40689
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DiffTable, {
40690
+ hunks: diff.hunks,
40691
+ title,
40692
+ beforeLabel: rt("rollback.diff.before"),
40693
+ afterLabel: rt("rollback.diff.after"),
40694
+ sanitize: redact
40695
+ })
40696
+ ]
39679
40697
  });
39680
40698
  }
39681
40699
  //#endregion
39682
40700
  //#region src/client/chat/RollbackFileIcon.tsx
39683
- /** 惰取结果的三态缓存(undefined = 还没试过;null = 试过了,这台宿主没有)。 */
39684
- let cachedDshFileTypeIcon;
39685
- /**
39686
- * 惰取 DSH 自带的 `FileTypeIcon`(**每次进程只试一次**,失败就记 null 不再重试)。
39687
- *
39688
- * 为什么不用 `import()`:动态 import 在 cjs 产物里同样要走模块表,且会把整个包拖进 chunk;
39689
- * 这里的 `require` 是 DSH loader 交给插件工厂的那一个(banner 里 `factory: (require) => {...}`)。
39690
- */
39691
- function dshFileTypeIcon() {
39692
- if (cachedDshFileTypeIcon !== void 0) return cachedDshFileTypeIcon;
39693
- cachedDshFileTypeIcon = null;
39694
- try {
39695
- const icon = (typeof require === "function" ? require("@deepseek-ai/dsh-client-ui-primitives") : null)?.FileTypeIcon;
39696
- if (typeof icon === "function" || typeof icon === "object") cachedDshFileTypeIcon = icon;
39697
- } catch {
39698
- cachedDshFileTypeIcon = null;
39699
- }
39700
- return cachedDshFileTypeIcon;
39701
- }
39702
40701
  /**
39703
40702
  * 最后的兜底:共享图标原语的通用「文件」图标(`common/Icon.tsx` 的 `name="file"`)。
39704
40703
  * 只有「没有 better-sidebar + 宿主模块表里没有 ui-primitives」两条同时成立时才会出现 ——
@@ -39722,7 +40721,7 @@ function RollbackFileIcon({ path, size = 14, render }) {
39722
40721
  }
39723
40722
  if (node !== null && node !== void 0 && node !== false) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: node });
39724
40723
  }
39725
- const Dsh = dshFileTypeIcon();
40724
+ const Dsh = hostFileTypeIcon();
39726
40725
  if (Dsh !== null) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Dsh, {
39727
40726
  path,
39728
40727
  size
@@ -39740,7 +40739,11 @@ const rk$1 = (key) => key;
39740
40739
  * (取值域在 src/ui/rollback-view.ts,契约里已有),**绝不**从 `added === 0` 反推删除 ——
39741
40740
  * 一个文件被清空成 0 行同样是 `+0 −N`,那是另一件事。
39742
40741
  */
39743
- function FileStat({ status, added, removed, unknown, deleted, rt }) {
40742
+ function FileStat({ status, added, removed, unknown, deleted, skipped, rt }) {
40743
+ if (skipped === true) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
40744
+ className: config_manager_module_css_default.hint,
40745
+ children: rt(rk$1("rollback.preview.file.skipped"))
40746
+ });
39744
40747
  if (status === "delete") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39745
40748
  className: config_manager_module_css_default.rollbackDeleted,
39746
40749
  children: deleted
@@ -39758,7 +40761,9 @@ function FileStat({ status, added, removed, unknown, deleted, rt }) {
39758
40761
  })] });
39759
40762
  }
39760
40763
  /** 文件清单(改动行 + 删除行)。两处调用共用这一份渲染。 */
39761
- function RollbackFileChanges({ files, removals, rt, view, renderFileIcon }) {
40764
+ function RollbackFileChanges({ files, removals, rt, view, renderFileIcon, selection }) {
40765
+ const selectedSet = selection === void 0 ? null : new Set(selection.selected);
40766
+ const foreignSet = selection === void 0 ? null : new Set(selection.foreign);
39762
40767
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39763
40768
  className: config_manager_module_css_default.rollbackFileList,
39764
40769
  role: "list",
@@ -39773,6 +40778,16 @@ function RollbackFileChanges({ files, removals, rt, view, renderFileIcon }) {
39773
40778
  role: "listitem",
39774
40779
  "data-kind": previewFileStatusKnown(file.status) ? file.status : void 0,
39775
40780
  children: [
40781
+ selection !== void 0 && selectedSet !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
40782
+ type: "checkbox",
40783
+ checked: selectedSet.has(file.path),
40784
+ disabled: selection.disabled,
40785
+ title: selection.toggleLabel(file.path),
40786
+ "aria-label": selection.toggleLabel(file.path),
40787
+ onChange: () => {
40788
+ selection.onToggle(file.path);
40789
+ }
40790
+ }),
39776
40791
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39777
40792
  className: config_manager_module_css_default.rollbackFileIcon,
39778
40793
  "aria-hidden": "true",
@@ -39797,6 +40812,11 @@ function RollbackFileChanges({ files, removals, rt, view, renderFileIcon }) {
39797
40812
  },
39798
40813
  children: label
39799
40814
  }),
40815
+ selection !== void 0 && foreignSet !== null && foreignSet.has(file.path) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
40816
+ className: config_manager_module_css_default.hint,
40817
+ "data-foreign": "true",
40818
+ children: selection.foreignLabel
40819
+ }),
39800
40820
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39801
40821
  className: config_manager_module_css_default.rollbackFileStat,
39802
40822
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FileStat, {
@@ -39805,6 +40825,7 @@ function RollbackFileChanges({ files, removals, rt, view, renderFileIcon }) {
39805
40825
  removed: file.removed,
39806
40826
  unknown: rt("rollback.preview.file.unknown"),
39807
40827
  deleted: rt(rk$1("rollback.preview.file.deleted")),
40828
+ skipped: file.skipped === true,
39808
40829
  rt
39809
40830
  })
39810
40831
  })
@@ -39922,6 +40943,11 @@ function RollbackCard({ recoveryApi, t }) {
39922
40943
  * (= 最新那条对话,见下方 activeGroup 的推导)。
39923
40944
  */
39924
40945
  const [selectedSession, setSelectedSession] = (0, react.useState)(null);
40946
+ /**
40947
+ * 路径级勾选(2026-10-17 定案 A):这次回退要恢复哪些文件。
40948
+ * 初值在**每次打开预览**时按引擎的归属标记重置(别的对话改过的默认不勾,见 rollbackSelectionRows)。
40949
+ */
40950
+ const [selectedPaths, setSelectedPaths] = (0, react.useState)([]);
39925
40951
  /** 「刷新」在途:**保留旧内容**,只把刷新按钮置为在途(见 load 的 keep 语义) */
39926
40952
  const [refreshing, setRefreshing] = (0, react.useState)(false);
39927
40953
  /** 开关(issue #88)在途:置灰防重复点击,但不改开关的显示值(值只在宿主确认后变) */
@@ -39996,6 +41022,7 @@ function RollbackCard({ recoveryApi, t }) {
39996
41022
  if (!mounted.current || previewSeq.current !== seq) return;
39997
41023
  setPreviewLoading(false);
39998
41024
  setPreview(res);
41025
+ setSelectedPaths(rollbackDefaultSelection(rollbackSelectionRows(res)));
39999
41026
  setMode(rollbackPreviewVerdict(res).mode);
40000
41027
  if (!res.ok) setActionError(t(dyn(rollbackCodeKey(res.code))));
40001
41028
  }, (err) => {
@@ -40053,7 +41080,8 @@ function RollbackCard({ recoveryApi, t }) {
40053
41080
  userConfirmed: true,
40054
41081
  mode,
40055
41082
  segments: rollbackModeSegments(mode),
40056
- allowPartial
41083
+ allowPartial,
41084
+ ...onlyPaths === null ? {} : { onlyPaths }
40057
41085
  }).then((res) => {
40058
41086
  if (!mounted.current) return;
40059
41087
  setBusy(false);
@@ -40169,6 +41197,11 @@ function RollbackCard({ recoveryApi, t }) {
40169
41197
  const previewGuidance = rollbackPreviewGuidance(preview);
40170
41198
  /** 会被**改动** / 会被**删除**的文件:与聊天里的回退预览同一对读法(引擎 preview.workspace 的同一份数据)。 */
40171
41199
  const previewFiles = readRollbackPreviewFiles(preview?.workspace);
41200
+ /** 可勾选行 / 勾选结果(判定全在 src/ui/rollback-view.ts) */
41201
+ const selectionRows = rollbackSelectionRows(preview);
41202
+ const selectionBlocked = rollbackSelectionBlocksSubmit(selectionRows, selectedPaths);
41203
+ const selectionForeign = selectionRows.filter((row) => row.foreign).map((row) => row.path);
41204
+ const onlyPaths = rollbackOnlyPaths(selectionRows, selectedPaths);
40172
41205
  const previewRemovals = readRollbackPreviewRemovals(preview?.workspace);
40173
41206
  /** 三个数字的口径与「文件行」同源(rollbackPreviewScope:行数只累加两侧都可信的那部分)。 */
40174
41207
  const previewScope = rollbackPreviewScope(previewFiles, previewRemovals);
@@ -40595,7 +41628,17 @@ function RollbackCard({ recoveryApi, t }) {
40595
41628
  files: previewFiles,
40596
41629
  removals: previewRemovals,
40597
41630
  rt: t,
40598
- view: fileView
41631
+ view: fileView,
41632
+ selection: {
41633
+ selected: selectedPaths,
41634
+ foreign: selectionForeign,
41635
+ foreignLabel: t("rollback.preview.select.foreign"),
41636
+ toggleLabel: (path) => t("rollback.preview.select.toggle", { path }),
41637
+ disabled: busy,
41638
+ onToggle: (path) => {
41639
+ setSelectedPaths((prev) => prev.includes(path) ? prev.filter((item) => item !== path) : [...prev, path]);
41640
+ }
41641
+ }
40599
41642
  })
40600
41643
  }),
40601
41644
  inlineDiff !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -40641,7 +41684,7 @@ function RollbackCard({ recoveryApi, t }) {
40641
41684
  children: [
40642
41685
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
40643
41686
  variant: "danger",
40644
- disabled: busy || !canRewind,
41687
+ disabled: busy || !canRewind || selectionBlocked,
40645
41688
  loading: busy,
40646
41689
  onClick: () => {
40647
41690
  setConfirmOpen(true);
@@ -40709,6 +41752,13 @@ function RollbackCard({ recoveryApi, t }) {
40709
41752
  leftovers: segment.leftoversCount
40710
41753
  }) }),
40711
41754
  segment.childSessionId !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("rollback.rewind.result.child", { id: segment.childSessionId }) }),
41755
+ segment.foreignSkipped > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("rollback.result.foreignSkipped", { n: segment.foreignSkipped }) }),
41756
+ segment.selectionSkipped > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("rollback.result.selectionSkipped", { n: segment.selectionSkipped }) }),
41757
+ segment.mergedCount > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("rollback.result.merged", { n: segment.mergedCount }) }),
41758
+ segment.conflictCount > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("rollback.result.conflict", { n: segment.conflictCount }) }),
41759
+ segment.unavailableCount > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("rollback.result.unavailable", { n: segment.unavailableCount }) }),
41760
+ segment.concurrentCount > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("rollback.result.concurrent", { n: segment.concurrentCount }) }),
41761
+ segment.conflictPaths.map((line) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: line }, "conflict:" + line)),
40712
41762
  segment.detail.map((line) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: line }, line)),
40713
41763
  segment.guidance.map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [t(dyn(row.key)), row.detail !== null ? " — " + row.detail : ""] }, row.key + (row.detail ?? "")))
40714
41764
  ]
@@ -47660,7 +48710,7 @@ const zh$2 = {
47660
48710
  "rollback.code.fork-failed": "fork 子会话失败,会话段未回退",
47661
48711
  "rollback.code.capture-failed": "该态留点失败",
47662
48712
  "rollback.code.capture-truncated": "该态留点到达上限被截断(已如实标注)",
47663
- "rollback.code.capture-degraded": "该态留点不完整(有链接或读不到的内容被跳过,已逐条留痕)",
48713
+ "rollback.code.capture-degraded": "该态留点不完整(有读不到或期间被改写的内容,已逐条留痕)",
47664
48714
  "rollback.code.no-chunks": "没有给出工作区路径分块",
47665
48715
  "rollback.code.chunk-not-absolute": "工作区分块必须是绝对路径",
47666
48716
  "rollback.code.chunk-not-found": "工作区分块不存在或不可用",
@@ -47699,6 +48749,14 @@ const zh$2 = {
47699
48749
  "rollback.preview.notice.skipped": "{n} 项在留点时被跳过(未记录;已计入证明名单 ⇒ 不参与删除判据)",
47700
48750
  "rollback.preview.notice.truncated": "该点捕获被上限截断(超单文件上限 / 字节预算 / 文件数预算);删除判据另看证明名单(路径索引)是否完整",
47701
48751
  "rollback.preview.files.title": "将被回退的文件:",
48752
+ "rollback.preview.select.foreign": "其它对话改过",
48753
+ "rollback.preview.select.toggle": "「{path}」:勾上则这次回退恢复它",
48754
+ "rollback.result.foreignSkipped": "{n} 个文件在留点后被其它对话改过,这次没有回退它们",
48755
+ "rollback.result.merged": "{n} 个文件已合并:撤销本次对话的改动,保留其它对话的改动",
48756
+ "rollback.result.conflict": "{n} 个文件两侧改到同一处,已保持原样 —— 需要你手工处理",
48757
+ "rollback.result.unavailable": "{n} 个文件无法安全撤销(缺少中间版本 / 二进制 / 差异过大),已保持原样",
48758
+ "rollback.result.concurrent": "{n} 个文件在回退过程中又被改过,已保持原样",
48759
+ "rollback.result.selectionSkipped": "{n} 个文件按你的勾选跳过了",
47702
48760
  "rollback.preview.files.empty": "工作区与该回退点一致,无需恢复",
47703
48761
  "rollback.preview.files.unavailable": "该回退点的工作区态没有可用的记录(原因:{reason}),无需恢复",
47704
48762
  "rollback.preview.files.unavailableSession": "该回退点的工作区态没有可用的记录(原因:{reason});会话仍会回退到该点之前",
@@ -47708,6 +48766,9 @@ const zh$2 = {
47708
48766
  "rollback.preview.file.removed": "−{n}",
47709
48767
  /** 整文件删除(用户 2026-10-12 第 6 条):写「删除」而不是 `+0 −N` —— 那是两件事。 */
47710
48768
  "rollback.preview.file.deleted": "删除",
48769
+ "rollback.preview.file.skipped": "不会改动(与其它对话的改动冲突,或无法安全合并)",
48770
+ "rollback.diff.merged": "下面是合并后的结果:撤销本对话的改动、保留其它对话的改动",
48771
+ "rollback.diff.skipped": "这次回退不会改动它(与其它对话的改动冲突,或无法安全合并)",
47711
48772
  "rollback.preview.file.unknown": "行数未统计",
47712
48773
  "rollback.preview.file.unknownHint": "这些文件的行数没有统计出来(文件过大、不是文本或内容副本读不出来)—— 回退仍会照常覆盖它们。",
47713
48774
  "rollback.diff.viewHint": "查看差异:{path}",
@@ -47716,7 +48777,6 @@ const zh$2 = {
47716
48777
  "rollback.diff.after": "回退后",
47717
48778
  "rollback.diff.identical": "该文件与回退点内容一致,回退不会改动它",
47718
48779
  "rollback.diff.degraded": "差异规模较大,已按整块替换展示(仍是完整结果,只是不是最小的编辑脚本)",
47719
- "rollback.diff.truncated": "只画了前 {shown} 行(共 {total} 行),数据本身是完整的",
47720
48780
  "rollback.diff.reason.missingBlob": "这份内容副本读不出来,无法逐行对照(回退仍会尝试写回它)",
47721
48781
  "rollback.diff.reason.binary": "不是文本文件,没有逐行差异可看",
47722
48782
  "rollback.diff.reason.tooLarge": "文件超过展示上限,没有逐行差异可看(回退仍会照常覆盖它)",
@@ -48191,7 +49251,7 @@ const en$2 = {
48191
49251
  "rollback.code.fork-failed": "Forking the child session failed; the session segment was not rolled back",
48192
49252
  "rollback.code.capture-failed": "Failed to capture this state",
48193
49253
  "rollback.code.capture-truncated": "This state hit the capture limit and was truncated (recorded honestly)",
48194
- "rollback.code.capture-degraded": "This state was captured incompletely (skipped links or unreadable entries are recorded)",
49254
+ "rollback.code.capture-degraded": "This state was captured incompletely (unreadable entries, or files rewritten while capturing, are recorded)",
48195
49255
  "rollback.code.no-chunks": "No workspace path chunks were provided",
48196
49256
  "rollback.code.chunk-not-absolute": "Workspace chunks must be absolute paths",
48197
49257
  "rollback.code.chunk-not-found": "Workspace chunk is missing or unusable",
@@ -48230,6 +49290,14 @@ const en$2 = {
48230
49290
  "rollback.preview.notice.skipped": "{n} item(s) were skipped at capture time (not recorded; they are in the proof list, so they are outside the deletion test)",
48231
49291
  "rollback.preview.notice.truncated": "Capture was truncated by a limit (per-file / byte budget / file-count budget); whether anything is deleted also depends on whether the proof list (path index) is complete",
48232
49292
  "rollback.preview.files.title": "Files that will be rewound:",
49293
+ "rollback.preview.select.foreign": "Changed by another conversation",
49294
+ "rollback.preview.select.toggle": "\"{path}\": check to restore it in this rewind",
49295
+ "rollback.result.foreignSkipped": "{n} file(s) were changed by another conversation after this point; this rewind left them untouched",
49296
+ "rollback.result.merged": "{n} file(s) merged: the change from this conversation was reverted and the change from the other conversation was kept",
49297
+ "rollback.result.conflict": "{n} file(s) were changed on both sides in the same place and were left as they are — they need your decision",
49298
+ "rollback.result.unavailable": "{n} file(s) could not be reverted safely (no common ancestor / binary / diff too large) and were left as they are",
49299
+ "rollback.result.concurrent": "{n} file(s) changed again while this rewind was running and were left as they are",
49300
+ "rollback.result.selectionSkipped": "{n} file(s) skipped by your selection",
48233
49301
  "rollback.preview.files.empty": "The workspace already matches this rollback point, nothing to restore",
48234
49302
  "rollback.preview.files.unavailable": "The workspace state of this rollback point has no usable record (reason: {reason}), nothing to restore",
48235
49303
  "rollback.preview.files.unavailableSession": "The workspace state of this rollback point has no usable record (reason: {reason}); the session will still be rewound to before this point",
@@ -48238,6 +49306,9 @@ const en$2 = {
48238
49306
  "rollback.preview.file.added": "+{n}",
48239
49307
  "rollback.preview.file.removed": "−{n}",
48240
49308
  "rollback.preview.file.deleted": "Delete",
49309
+ "rollback.preview.file.skipped": "Left unchanged (conflicts with another conversation, or cannot be merged safely)",
49310
+ "rollback.diff.merged": "Below is the merged result: the change from this conversation is reverted and the change from the other conversation is kept",
49311
+ "rollback.diff.skipped": "This rewind will not change it (it conflicts with another conversation, or cannot be merged safely)",
48241
49312
  "rollback.preview.file.unknown": "line counts not measured",
48242
49313
  "rollback.preview.file.unknownHint": "Line counts could not be measured for these files (too large, not text, or the content copy is unreadable) — the rewind will still overwrite them.",
48243
49314
  "rollback.diff.viewHint": "View diff: {path}",
@@ -48246,7 +49317,6 @@ const en$2 = {
48246
49317
  "rollback.diff.after": "After rewind",
48247
49318
  "rollback.diff.identical": "This file already matches the rollback point, so the rewind will not change it",
48248
49319
  "rollback.diff.degraded": "The diff is large, so it is shown as a whole-block replacement (still complete, just not a minimal edit script)",
48249
- "rollback.diff.truncated": "Only the first {shown} of {total} rows are drawn (the data itself is complete)",
48250
49320
  "rollback.diff.reason.missingBlob": "The stored content copy cannot be read, so no line-by-line comparison is possible (the rewind will still try to write it back)",
48251
49321
  "rollback.diff.reason.binary": "Not a text file, so there is no line-by-line diff to show",
48252
49322
  "rollback.diff.reason.tooLarge": "The file exceeds the display limit, so there is no line-by-line diff (the rewind will still overwrite it)",
@@ -49189,9 +50259,15 @@ function RollbackReviewDialog({ sessionId, turn, port, rt, t, openChildSession,
49189
50259
  *
49190
50260
  * 为什么必须接管(而不是追加):该 key 没有 children 表(宿主只对 turn-tail 声明了子位),
49191
50261
  * framework 没有「往用户消息里加 UI」的位子;唯一合法做法是 priority -1 遮蔽宿主的
49192
- * `UserMessageNodeView`,然后在自己的渲染里把那条气泡**复刻**一遍(宿主组件 / CSS Modules
49193
- * 全是 ui-chat 私有、不可导入 —— 外观靠本仓库 CSS 逼近,图片**必须**走 owner 给的
49194
- * `renderMessageImages`)。
50262
+ * `UserMessageNodeView`,然后在自己的渲染里产出那条气泡。
50263
+ *
50264
+ * 正文**谁来画**在 0.2.1-alpha.3 换过一代(issue #92):宿主把图片位搬进
50265
+ * `conversation.chat.user.content` factory 的 children,并删掉了节点 props 上的 `renderMessageImages`。
50266
+ * 因此现在的口径是 **优先委托宿主的 content factory**(`renderFactorySlot(CHAT_USER_CONTENT_FACTORY, …)`),
50267
+ * 只有在宿主**没有**注册那条 factory 时(≤0.2.0)才回落到自绘气泡 —— 自绘气泡同时是那次调用的
50268
+ * `options.fallback`,所以三格(老宿主 / 新宿主 / 宿主中途撤掉 factory)都有确定行为,
50269
+ * 不会出现空白气泡。自绘那一格图片只能走 owner 的 `renderMessageImages`(宿主的 CSS Modules 与组件
50270
+ * 全是 ui-chat 私有、不可导入,外观靠本仓库 CSS 逼近)。
49195
50271
  *
49196
50272
  * 三件硬约束(本文件是它们的落点):
49197
50273
  * ① **用户消息绝不消失**:整个子树包在 `ChatEntryErrorBoundary` 里,抛错就降级成
@@ -49204,25 +50280,41 @@ function RollbackReviewDialog({ sessionId, turn, port, rt, t, openChildSession,
49204
50280
  * 组件的全部判定在 `chat-entry-view.ts`(node 可测):本文件只做装配、订阅与渲染。
49205
50281
  */
49206
50282
  const NEWLINE = String.fromCharCode(10);
49207
- /** 文件卡:文件名 + 扩展名徽标 + 体积(扩展名徽标 = 类型图标的诚实兜底,见能力对照表)。 */
50283
+ /**
50284
+ * 文件卡:类型图标 + 文件名 + 体积。
50285
+ *
50286
+ * 类型图标**优先用宿主自己的** `FileTypeIcon`(ui-primitives,帧内惰取 —— 见 common/host-primitives.ts);
50287
+ * 拿不到(老宿主)才回落我们自己的**扩展名徽标**(口径与宿主 fileExtension 一致,见 fileExtensionOf)。
50288
+ * 2026-10-15:此前一律走徽标,是因为「ui-primitives 包私有不可导入」只对**构建期 import** 成立 ——
50289
+ * 运行期 require 是生态通行做法(dsh-reedit / dsh-better-sidebar / 本仓 RollbackFileIcon 都这么做)。
50290
+ */
49208
50291
  function FileCard({ file, size }) {
50292
+ const DshIcon = hostFileTypeIcon();
50293
+ /**
50294
+ * 元信息 = 宿主 `.fileMeta` 的**同一组合**:大写的扩展名(≤8 字符)+ 体积文本,空格连接。
50295
+ * 宿主那行是「EXT SIZE」一行的次级小字(不是我们此前那个「文件名旁边挂一个体积」的排法)。
50296
+ */
50297
+ const meta = [file.ext === null ? "" : file.ext.toUpperCase().slice(0, 8), size ?? ""].filter((part) => part !== "").join(" ");
49209
50298
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
49210
50299
  className: config_manager_module_css_default.chatFileCard,
49211
50300
  title: file.name !== "" ? file.name : void 0,
49212
- children: [
49213
- file.ext !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49214
- className: config_manager_module_css_default.chatFileExt,
49215
- children: file.ext
49216
- }),
49217
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
50301
+ children: [DshIcon !== null && file.name !== "" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DshIcon, {
50302
+ path: file.name,
50303
+ size: 28,
50304
+ className: config_manager_module_css_default.chatFileIcon
50305
+ }) : file.ext !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
50306
+ className: config_manager_module_css_default.chatFileExt,
50307
+ children: file.ext
50308
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
50309
+ className: config_manager_module_css_default.chatFileContent,
50310
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49218
50311
  className: config_manager_module_css_default.chatFileName,
49219
50312
  children: file.name !== "" ? file.name : "?"
49220
- }),
49221
- size !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
50313
+ }), meta !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49222
50314
  className: config_manager_module_css_default.chatFileMeta,
49223
- children: size
49224
- })
49225
- ]
50315
+ children: meta
50316
+ })]
50317
+ })]
49226
50318
  });
49227
50319
  }
49228
50320
  /** 未知块:宿主用 JsonBlock,这里用原生 `<details>` + 预格式化 JSON(零新增依赖、零新增通道)。 */
@@ -49259,15 +50351,24 @@ function ChatEntryCopyAction({ text, t }) {
49259
50351
  if (ok) setCopied(true);
49260
50352
  });
49261
50353
  }, [copied, text]);
50354
+ /**
50355
+ * 图标 = **DSH 原生那两颗**(2026-10-17 用户要求「复制 icon 与动画都用 DSH 原生的」):
50356
+ * 宿主 MessageIconActions 的复制反馈就是 `IconCopyOutlineRegular → IconCheckOutlineRegular` 的
50357
+ * **瞬时切换**(宿主 `.action svg` 没有任何 transition/animation —— 它的「动画」就是这一次换图)。
50358
+ * 本仓库的 `CopyStateIcon`(morphicons 形变)只在**拿不到宿主图标的老宿主**上兜底。
50359
+ */
50360
+ const HostCopyIcon = hostIcon("IconCopyOutlineRegular");
50361
+ const HostCheckIcon = hostIcon("IconCheckOutlineRegular");
49262
50362
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
49263
50363
  type: "button",
49264
50364
  className: config_manager_module_css_default.chatActionBtn,
49265
50365
  "aria-label": copied ? t("chat.entry.copied") : t("chat.entry.copy"),
49266
50366
  title: copied ? t("chat.entry.copied") : t("chat.entry.copy"),
49267
50367
  onClick: onCopy,
49268
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CopyStateIcon, {
50368
+ "data-copy-state": copied ? "copied" : "idle",
50369
+ children: HostCopyIcon !== null && HostCheckIcon !== null ? copied ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HostCheckIcon, { size: 15 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HostCopyIcon, { size: 15 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CopyStateIcon, {
49269
50370
  done: copied,
49270
- size: 13
50371
+ size: 15
49271
50372
  })
49272
50373
  });
49273
50374
  }
@@ -49280,17 +50381,21 @@ function ChatEntryCopyAction({ text, t }) {
49280
50381
  * (`projectChatEntryText`),且 `data.referenceLabels` 非空时渲染**宿主的引用汇总行**
49281
50382
  * (见下方 `css.chatEntryReference` + `t('chat.entry.referenceSummary')` 那段,文案与宿主
49282
50383
  * `引用会话 · {labels}` 逐字同义)。**仍有的差距**只有 chip 的**外观与可点开**(已追认)。
49283
- * · **技能(skillNames)**:**仍不渲染** —— 宿主交给 ui-primitives 的 `projectUserText` 在正文内部
49284
- * 把它渲染成 chip(包私有、不可导入)⇒ 我们不为技能产出任何界面元素(不编造内容)。
49285
- * · 文件类型图标:宿主用 ui-primitives 的 FileTypeIcon(包私有)⇒ 我们用**扩展名徽标**兜底;
49286
- * · 气泡底色:宿主直接用 `--dsw-specific-bubble`,本仓库 token 层没有这一档 ⇒ 用 `--cm-surface-2`
49287
- * (亮/暗主题下都是「比底更强的面」),不改 DESIGN 体系、不新增 token。
50384
+ * · **技能(skillNames)与引用 chip**:2026-10-15 起正文**优先交给宿主自己的** `projectUserText`
50385
+ * (ui-primitives 帧内惰取,见 common/host-primitives.ts)——技能与引用渲染成 chip,`openFile` /
50386
+ * `openSkill` 可用时还能点开;拿不到原语(老宿主)就回落我们的纯文本投影,**不编造内容、不留空白**。
50387
+ * · 文件类型图标:同样优先宿主的 `FileTypeIcon`,拿不到才回落到**扩展名徽标**兜底;
50388
+ * · 气泡底色:`--cm-chat-bubble`(= 宿主 `--dsw-specific-bubble`,2026-10-15 之前误用 `--cm-surface-2`
50389
+ * ⇒ 浅色主题下与页面同色、气泡看不见;详见 DESIGN.md §15b 与 css 里那两条定义行的注释)。
49288
50390
  */
49289
50391
  /**
49290
50392
  * 订阅入口可见性信号(issue #88)。
49291
50393
  *
49292
50394
  * 为什么要在组件里订阅而不是把开关当 prop 往下传:入口是**遮蔽宿主渲染器**注册的(无常),
49293
- * 开关变化时没有任何父级会重渲染它 —— DNS 状态只能靠这条信号推。订阅开销 = 一个 Set 里的回调。
50395
+ * 开关变化时没有任何父级会重渲染它 —— 状态只能靠这条信号推。订阅开销 = 一个 Set 里的回调。
50396
+ *
50397
+ * 2026-10-17 起登记本身随开关撤销(关闭 ⇒ 让出 user cell、本组件直接卸载,宿主原生气泡接管回来),
50398
+ * 所以这里是**兜底**:万一信号已翻转而本组件还活着,也绝不画出那颗按钮。
49294
50399
  */
49295
50400
  function useRollbackEntryEnabled() {
49296
50401
  const [value, setValue] = (0, react.useState)(() => isRollbackEntryEnabled());
@@ -49299,7 +50404,7 @@ function useRollbackEntryEnabled() {
49299
50404
  }), []);
49300
50405
  return value;
49301
50406
  }
49302
- function ChatEntryBody({ node, sessionId, renderMessageImages, t, rt, port, openChildSession, archiveParentSession, startFreshSession, openDiff, fileIcon }) {
50407
+ function ChatEntryBody({ node, sessionId, openFile, openSkill, renderMessageImages, loadImage, renderFactorySlot, t, rt, port, openChildSession, archiveParentSession, startFreshSession, openDiff, fileIcon }) {
49303
50408
  const view = (0, react.useMemo)(() => buildChatEntryView(node), [node]);
49304
50409
  const [lookup, setLookup] = (0, react.useState)(null);
49305
50410
  /** 有界重试窗口是否还开着(**状态诚实**的唯一开关,R1)—— 由状态机的 `onState` 驱动。 */
@@ -49368,10 +50473,16 @@ function ChatEntryBody({ node, sessionId, renderMessageImages, t, rt, port, open
49368
50473
  setDialogTurn(button.turn);
49369
50474
  }, [button]);
49370
50475
  const bubble = view.bubble;
50476
+ /** 回退图标同样走宿主(`IconRefreshOutlineRegular`):与复制图标同一套字形/描边;拿不到回落 RefreshIcon。 */
50477
+ const HostRefreshIcon = hostIcon("IconRefreshOutlineRegular");
49371
50478
  /**
49372
50479
  * 附件按**content 原始顺序**输出(宿主 `attachments.map` 同构):图片走 owner 的
49373
50480
  * `renderMessageImages`(每张一次调用),文件走文件卡 —— 两类**共用同一条序列**,
49374
50481
  * 绝不重排成「先图片后文件」(t4 复核 D2)。
50482
+ *
50483
+ * 这条自绘路径**只在宿主没有 content factory 时**才会上屏(见下面的 `content`):
50484
+ * 0.2.1 起 `renderMessageImages` 已不存在,此时图片位置如实显示提示文本 —— 但那一格
50485
+ * 正常情况下走的是宿主自己的 factory,根本到不了这里。
49375
50486
  */
49376
50487
  const canRenderImages = typeof renderMessageImages === "function";
49377
50488
  const attachmentNodes = planChatEntryAttachments(bubble).map((item) => item.kind === "image" ? canRenderImages ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react.Fragment, { children: renderMessageImages(item.owner) }, "image:" + String(item.index)) : null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FileCard, {
@@ -49379,41 +50490,84 @@ function ChatEntryBody({ node, sessionId, renderMessageImages, t, rt, port, open
49379
50490
  size: item.size
49380
50491
  }, "file:" + String(item.index)));
49381
50492
  const hasAttachments = attachmentNodes.some((node) => node !== null);
50493
+ /**
50494
+ * 正文:**优先宿主自己的** `projectUserText`(会话引用 / 技能渲染成 chip,给了打开器就能点开),
50495
+ * 拿不到就回落我们自己的纯文本投影(`bubble.text`,线格式也已换成 label)。
50496
+ * 四条回落判据在纯层(`projectChatEntryTextWithHost`);投影器**帧内惰取**(老宿主没有原语包 → null)。
50497
+ */
50498
+ const hostText = projectChatEntryTextWithHost(hostUserTextProjector(), bubble.rawText, {
50499
+ sessionLabels: view.referenceLabels,
50500
+ skillNames: view.skillNames,
50501
+ openFile,
50502
+ openSkill
50503
+ });
49382
50504
  const reasonKey = button.kind === "disabled" ? button.key : null;
50505
+ /**
50506
+ * **自绘气泡**(= 0.2.1 之前那条路径,style 与宿主 .userStack/.bubble 逐条对齐见本文件头注释)。
50507
+ *
50508
+ * 两个身份:① 老宿主(≤0.2.0)没有 `conversation.chat.user.content` 这条 factory,正文由它承担;
50509
+ * ② 新宿主上它是那次 factory 调用的 **fallback** —— 定义缺失(或宿主中途撤掉)时由
50510
+ * `FactoryOutlet` 回落,用户消息因此**永远不会**变成空白。
50511
+ *
50512
+ * 图片:这条路径只能走 owner 的 `renderMessageImages`(0.2.1 起已不存在)⇒ 那一格如实显示提示文本,
50513
+ * 而不是静默消失;新宿主正常情况下根本不会渲染到这里(走的是宿主自己的 content factory)。
50514
+ */
50515
+ const ownContent = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50516
+ className: config_manager_module_css_default.chatEntryStack,
50517
+ children: [
50518
+ hasAttachments && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
50519
+ className: config_manager_module_css_default.chatAttachmentRow,
50520
+ "data-message-attachments": "",
50521
+ children: attachmentNodes
50522
+ }),
50523
+ bubble.showBubble && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50524
+ className: config_manager_module_css_default.chatBubble,
50525
+ children: [bubble.text !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
50526
+ className: config_manager_module_css_default.chatBubbleText,
50527
+ children: hostText === null ? bubble.text : hostText
50528
+ }), bubble.raw.map((block) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RawBlock, {
50529
+ payload: block.payload,
50530
+ label: t("chat.entry.extraBlock"),
50531
+ truncatedLabel: (total) => t("chat.entry.truncated", { total })
50532
+ }, "raw-" + block.id))]
50533
+ }),
50534
+ !canRenderImages && bubble.images.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
50535
+ className: config_manager_module_css_default.chatEntryNotice,
50536
+ children: t("chat.entry.noImageRenderer")
50537
+ }),
50538
+ view.referenceLabels.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
50539
+ className: config_manager_module_css_default.chatEntryReference,
50540
+ "data-ref-chip": "",
50541
+ children: t("chat.entry.referenceSummary", { labels: view.referenceLabels.join(t("chat.entry.referenceSeparator")) })
50542
+ })
50543
+ ]
50544
+ });
50545
+ /**
50546
+ * 正文 / 附件 / 引用(issue #92):**优先委托宿主自己的 content factory**。
50547
+ *
50548
+ * 为什么不能再自绘:0.2.1-alpha.3 起宿主把图片位搬进 `conversation.chat.user.content` 的 children
50549
+ * (`conversation.chat.user.images`),并在节点 props 上删掉了 `renderMessageImages` —— 自己复刻气泡
50550
+ * 就必然拿不到图片位。委托之后,图片由 ui-attachment 在该 factory 的渲染上下文里 renderSlot,
50551
+ * 正文/文件卡/引用/未知块也全部回到宿主实现 ⇒ 与宿主原生气泡**同构**,且以后宿主再改图片实现也不用跟。
50552
+ *
50553
+ * 入参逐字对齐宿主 `UserStyleBubble`(`content` / `loadImage` / `facts` / `interactive: true`),
50554
+ * 组装全在纯层 `buildHostUserContentInput`。**判据不是 `typeof renderFactorySlot === 'function'`** ——
50555
+ * 该席位在新旧宿主上都存在(ui-renderer 的 standardKit 无条件发放),真正的裁决点是这条 factory
50556
+ * 注册没注册:`FactoryOutlet` 在读不到定义时渲染我们给的 `fallback`(= 上面的自绘气泡)——
50557
+ * 于是「老宿主 ≤0.2.0」「新宿主 ≥0.2.1」「宿主中途撤掉 factory」三格都有确定行为,不必开两条发布线。
50558
+ * 调用本身不吃任何副作用,返回不透明 ReactNode(React 元素),空定义时是 fallback 的元素包装。
50559
+ */
50560
+ const content = typeof renderFactorySlot === "function" ? renderFactorySlot(CHAT_USER_CONTENT_FACTORY, {
50561
+ content: view.hostContent.content,
50562
+ loadImage,
50563
+ facts: view.hostContent.facts,
50564
+ interactive: true
50565
+ }, { fallback: ownContent }) : ownContent;
49383
50566
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49384
50567
  className: config_manager_module_css_default.chatEntryScope,
49385
50568
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49386
50569
  className: config_manager_module_css_default.chatEntryRow,
49387
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49388
- className: config_manager_module_css_default.chatEntryStack,
49389
- children: [
49390
- hasAttachments && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
49391
- className: config_manager_module_css_default.chatAttachmentRow,
49392
- "data-message-attachments": "",
49393
- children: attachmentNodes
49394
- }),
49395
- bubble.showBubble && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49396
- className: config_manager_module_css_default.chatBubble,
49397
- children: [bubble.text !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49398
- className: config_manager_module_css_default.chatBubbleText,
49399
- children: bubble.text
49400
- }), bubble.raw.map((block) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RawBlock, {
49401
- payload: block.payload,
49402
- label: t("chat.entry.extraBlock"),
49403
- truncatedLabel: (total) => t("chat.entry.truncated", { total })
49404
- }, "raw-" + block.id))]
49405
- }),
49406
- !canRenderImages && bubble.images.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
49407
- className: config_manager_module_css_default.chatEntryNotice,
49408
- children: t("chat.entry.noImageRenderer")
49409
- }),
49410
- view.referenceLabels.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
49411
- className: config_manager_module_css_default.chatEntryReference,
49412
- "data-ref-chip": "",
49413
- children: t("chat.entry.referenceSummary", { labels: view.referenceLabels.join(t("chat.entry.referenceSeparator")) })
49414
- })
49415
- ]
49416
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50570
+ children: [content, /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49417
50571
  className: config_manager_module_css_default.chatEntryActions,
49418
50572
  children: [
49419
50573
  view.clock !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -49433,7 +50587,7 @@ function ChatEntryBody({ node, sessionId, renderMessageImages, t, rt, port, open
49433
50587
  onClick: openDialog,
49434
50588
  "data-chat-entry-window-open": windowOpen ? "" : void 0,
49435
50589
  "data-chat-entry-window-closed": windowOpen ? void 0 : "",
49436
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RefreshIcon, { size: 13 })
50590
+ children: HostRefreshIcon === null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RefreshIcon, { size: 15 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HostRefreshIcon, { size: 15 })
49437
50591
  })
49438
50592
  ]
49439
50593
  })]
@@ -49537,6 +50691,11 @@ function ChatEntryNodeView(props) {
49537
50691
  * 2026-10-12(用户要求「聊天内回退入口只有每条用户消息」):旧的「整回合」档连同它的偏好模块
49538
50692
  * (`chat-entry-pref` / `chat-entry-mount`)与回合尾入口(`conversation.chat.turnTail`)一并删除 ——
49539
50693
  * 入口恒为每条用户消息气泡里的那一颗,于是这里不再有偏好门,也不再需要「切档时重新评估」的订阅。
50694
+ *
50695
+ * 2026-10-17(用户要求):开关**关闭时不得再接管用户消息气泡**。原实现是「登记常驻、只收起按钮」——
50696
+ * 功能关掉之后那条气泡仍由我们代画(即使正文已委托宿主 factory,外层壳与动作行仍是我们的)。
50697
+ * 现在登记本身随开关出现 / 撤销(`registerChatNodeEntryWhenEnabled`):关掉即让出 user cell,
50698
+ * 宿主 `UserMessageNodeView` 原样接管回来。
49540
50699
  */
49541
50700
  /** 诊断(ASCII,与界面文案无关;console.* 实参不触发 i18n 守卫)。 */
49542
50701
  function warnChatNode(message) {
@@ -49553,20 +50712,33 @@ function declaredSlotKind(probe) {
49553
50712
  return null;
49554
50713
  }
49555
50714
  }
50715
+ /** user cell 的当前赢家(没有探测面 / 形状不符 / 探测抛错都回 null —— 探测失败不当成「有人占」)。 */
50716
+ function chatNodeOccupantOf(probe) {
50717
+ if (probe === void 0 || probe === null || typeof probe.entriesOfSlot !== "function") return null;
50718
+ try {
50719
+ return chatNodeUserOccupant(probe.entriesOfSlot(CHAT_NODE_SLOT));
50720
+ } catch {
50721
+ return null;
50722
+ }
50723
+ }
49556
50724
  /**
49557
50725
  * 登记「接管 conversation.chat.node / user」的渲染器。
49558
50726
  *
49559
- * 两道门(顺序即优先级):
50727
+ * 三道门(顺序即优先级):
49560
50728
  * ① 声明形态不是 `keyed`(0.1.x 的 ui-chat 契约不同)→ 跳过(按 keyed 参数注册会抛);
49561
- * ② 注册本身抛错 → 吞掉并告警(只丢这一个入口)。
50729
+ * ② **user cell 已被更低优先级占住**(别的插件也在接管用户消息,2026-10-15)→ 让位并如实告警:
50730
+ * 注册也永远轮不到渲染(keyed cell「最低的渲染」),不抢别人的格子、也不静默;
50731
+ * ③ 注册本身抛错 → 吞掉并告警(只丢这一个入口)。
49562
50732
  *
49563
50733
  * @returns disposer;跳过 / 失败时是 no-op。
49564
50734
  */
49565
50735
  function registerChatNodeEntry(options) {
49566
50736
  const warn = options.warn ?? warnChatNode;
49567
50737
  const declared = declaredSlotKind(options.probe);
49568
- if (planChatNodeRegistration(declared).kind === "skip") {
49569
- warn("[config-manager] chat user node entry skipped: slot declaration is " + (declared === null ? "missing" : "\"" + declared + "\"") + " (expected \"keyed\")");
50738
+ const plan = planChatNodeRegistration(declared, chatNodeOccupantOf(options.probe));
50739
+ if (plan.kind === "skip") {
50740
+ if (plan.reason === "shadowed") warn("[config-manager] chat user node entry yielded: another renderer owns key \"user\" at a lower priority: priority " + String(plan.occupant.priority) + (plan.occupant.registrant === null ? "" : " (registered by " + plan.occupant.registrant + ")") + " — entry not registered");
50741
+ else warn("[config-manager] chat user node entry skipped: slot declaration is " + (declared === null ? "missing" : "\"" + declared + "\"") + " (expected \"keyed\")");
49570
50742
  return () => {};
49571
50743
  }
49572
50744
  try {
@@ -49576,6 +50748,35 @@ function registerChatNodeEntry(options) {
49576
50748
  return () => {};
49577
50749
  }
49578
50750
  }
50751
+ function registerChatNodeEntryWhenEnabled(options) {
50752
+ /** 当前登记的解绑函数;null = 现在没有登记(= 宿主渲染器在渲染那条 cell)。 */
50753
+ let disposeEntry = null;
50754
+ const sync = () => {
50755
+ if (options.isEnabled() === true) {
50756
+ if (disposeEntry === null) disposeEntry = registerChatNodeEntry({
50757
+ probe: options.probe,
50758
+ register: options.register,
50759
+ ...options.warn === void 0 ? {} : { warn: options.warn }
50760
+ });
50761
+ return;
50762
+ }
50763
+ if (disposeEntry !== null) {
50764
+ const dispose = disposeEntry;
50765
+ disposeEntry = null;
50766
+ dispose();
50767
+ }
50768
+ };
50769
+ const unsubscribe = options.subscribe(sync);
50770
+ sync();
50771
+ return () => {
50772
+ unsubscribe();
50773
+ if (disposeEntry !== null) {
50774
+ const dispose = disposeEntry;
50775
+ disposeEntry = null;
50776
+ dispose();
50777
+ }
50778
+ };
50779
+ }
49579
50780
  //#endregion
49580
50781
  //#region src/client/chat/rollback-diff-tab.ts
49581
50782
  /**
@@ -49878,6 +51079,10 @@ function apply(ctx) {
49878
51079
  * 并留一条 warn 级日志便于排障。
49879
51080
  *
49880
51081
  * 判据读的是 storage 响应(`rollbackEntryVisible`:老宿主没有该字段 ⇒ 按「默认开」,与那一版语义一致)。
51082
+ *
51083
+ * 2026-10-17 起这条信号还决定**要不要接管用户消息气泡**(不再只是按钮可见性):信号为假时
51084
+ * `registerChatNodeEntryWhenEnabled` 一次都不登记,那条 cell 由宿主 `UserMessageNodeView` 原生渲染
51085
+ * —— 与「关掉功能后连查询都不发」同一条口径:关掉 = 整条入口链路不存在。
49881
51086
  */
49882
51087
  recoveryApi.rollbackPointStorage?.().then((status) => {
49883
51088
  setRollbackEntryEnabled(rollbackEntryVisible(status));
@@ -49972,18 +51177,27 @@ function apply(ctx) {
49972
51177
  * 宿主 UserMessageNodeView 是唯一合法做法,那条气泡由我们自复刻。依据(含 -1 为何是唯一合法优先级)
49973
51178
  * → `src/client/chat/chat-slots.ts` 头部注释。
49974
51179
  *
51180
+ * **开关关着就完全不接管**(2026-10-17 用户要求):登记由 `registerChatNodeEntryWhenEnabled` 驱动 ——
51181
+ * 关掉回合自动留点后让出 user cell,那条消息回到宿主原生气泡(旧实现是「登记常驻、只收起按钮」,
51182
+ * 气泡仍由我们代画,用户看到的就是「关掉了还在接管」)。开关重新打开时登记当场补上,不需要重载插件。
51183
+ *
49975
51184
  * 形态探测 + 失败软化在 `registerChatNodeEntry`:0.1.x 的 ui-chat 契约不同(非 keyed)或注册抛错,
49976
51185
  * 都只丢这一个入口,绝不打挂本插件其余槽位与宿主启动。
49977
51186
  */
49978
- ctx.slots.inject(CHAT_NODE_SLOT, () => registerChatNodeEntry({
49979
- probe: { spec: (key) => ctx.slots.spec(key) },
51187
+ ctx.slots.inject(CHAT_NODE_SLOT, () => registerChatNodeEntryWhenEnabled({
51188
+ probe: {
51189
+ spec: (key) => ctx.slots.spec(key),
51190
+ entriesOfSlot: (key) => ctx.slots.entriesOfSlot?.(key)
51191
+ },
49980
51192
  register: () => ctx.slots.register({
49981
51193
  name: CHAT_NODE_SLOT,
49982
51194
  key: CHAT_NODE_USER_KEY,
49983
51195
  priority: -1,
49984
51196
  locale: CHAT_NS,
49985
51197
  inject: chatEntryInjected
49986
- }, ChatEntryNodeView)
51198
+ }, ChatEntryNodeView),
51199
+ isEnabled: isRollbackEntryEnabled,
51200
+ subscribe: subscribeRollbackEntryEnabled
49987
51201
  }));
49988
51202
  /**
49989
51203
  * ── 「查看」→ DSH 右侧栏「回滚差异」标签页(**只读**)──────────────────────────────