dsh-config-manager 0.1.44 → 0.1.45

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.
package/README.md CHANGED
@@ -4,6 +4,16 @@
4
4
 
5
5
  Backup, restore, export, import, migrate and sync your complete DeepSeek Harness (DSH) configuration — settings, model providers, plugins, MCP servers, skills, agent presets and workspaces — and restore your whole environment on a new machine with one click.
6
6
 
7
+ - 🔄 **Backup & Restore** DeepSeek Harness configuration
8
+ - 📦 **Export / Import** complete DSH configuration
9
+ - 🚚 **Migrate** DSH to another machine
10
+ - 🔌 Backup installed **plugins** and plugin configuration
11
+ - 🧩 Backup **MCP servers** and **Skills**
12
+ - 🔐 Encrypted backups with optional credentials
13
+ - ☁️ **Git / WebDAV** configuration sync
14
+ - 🛒 **Configuration market** — browse & one-click install shared configs
15
+ - ↩️ Automatic snapshot and rollback before restore
16
+
7
17
  [English](README.md) · [简体中文](README.zh-CN.md)
8
18
 
9
19
  ---
@@ -43,6 +53,10 @@ Move your complete DeepSeek Harness setup without manually reinstalling plugins,
43
53
 
44
54
  Keep portable configuration synchronized between machines through a private Git repository or WebDAV — secrets never sync.
45
55
 
56
+ ### Discover & install configurations from the marketplace
57
+
58
+ Browse the built-in official market for ready-made configurations (model providers, plugins, MCP servers, skills, agent presets…), preview what would be imported (dry-run), and install with one click — supply-chain warnings are always shown and every section must be explicitly approved before anything is written.
59
+
46
60
  ---
47
61
 
48
62
  ## ✨ Highlights
@@ -58,6 +72,7 @@ Keep portable configuration synchronized between machines through a private Git
58
72
  | ↩️ | **Automatic rollback** | Failed import restores everything automatically |
59
73
  | 📸 | **Snapshot restore** | Undo an import: whole-file restore + uninstall added plugins (CLI & GUI) |
60
74
  | 🔄 | **Remote Sync** | Push/pull portable config via **Git private repo or WebDAV** (secrets never sync) |
75
+ | 🛒 | **Config Marketplace** | Browse & one-click install community configs — supply-chain warnings + per-section approval |
61
76
  | 🗂️ | **Profiles** | Save multiple setups (Work / Personal) and switch anytime |
62
77
  | 🌐 | **Bilingual UI** | Interface, reports and error details follow the DSH app language (中文 / English) |
63
78
 
@@ -73,6 +88,10 @@ Keep portable configuration synchronized between machines through a private Git
73
88
  |:---:|:---:|
74
89
  | ![Snapshot Restore](assets/screenshot-snapshots.png) | ![Remote Sync](assets/screenshot-sync.png) |
75
90
 
91
+ | Configuration Market |
92
+ |:---:|
93
+ | ![Configuration Market](assets/screenshot-market.png) |
94
+
76
95
  ---
77
96
 
78
97
  ## 🔄 How it works?
@@ -103,17 +122,17 @@ It's a standard **DSH plugin** — two steps:
103
122
 
104
123
  ```bash
105
124
  # ① Install the plugin
106
- dsh plugin --profile web add dsh-config-manager@latest --config.auto-install-peers=false
125
+ dsh plugin --profile web add dsh-config-manager@latest
107
126
 
108
127
  # ② Restart DSH (a "Backup & Migration" entry appears in Settings)
109
128
  ```
110
129
 
111
- > 💡 Just copy-paste the command: `--config.auto-install-peers=false` skips a few DSH core packages that aren't on the public registry yet (the DSH runtime provides them), and `@latest` ensures you get the newest build.
130
+ > 💡 Just copy-paste the command: `@latest` ensures you get the newest build.
112
131
  >
113
132
  > 🐛 **`@latest` installed an old version?** That's pnpm 11's `minimumReleaseAge` supply-chain policy, not a cache issue: versions published less than ~30 days ago are excluded from resolution until whitelisted. Two fixes:
114
133
  > - Install an exact version once (it auto-whitelists, then `@latest` works):
115
134
  > ```bash
116
- > dsh plugin --profile web add dsh-config-manager@0.1.8 --config.auto-install-peers=false
135
+ > dsh plugin --profile web add dsh-config-manager@0.1.8
117
136
  > ```
118
137
  > - Or disable the age gate with a one-liner (adds `minimumReleaseAge: 0` at the top of the profile's `pnpm-workspace.yaml`):
119
138
  > ```powershell
@@ -217,6 +236,16 @@ Push / pull your portable config between machines through **either of two channe
217
236
  - **WebDAV auth** uses HTTP Basic: the `username` is stored in the config and may be echoed back into the UI, while the `password` is read live from the DSH credentials slot `DSH_CONFIG_MANAGER_SYNC_WEBDAV_PASSWORD` — it never appears in any sync file or log.
218
237
  - **Plugins auto-install**: when pulling diffs, plugins that are new in the backup are **installed automatically** on confirm — no manual per-item ticking in the diff list. Only **version-conflict** plugins still ask you to pick "Keep Current / Use Imported".
219
238
 
239
+ ### 🛒 Configuration Marketplace
240
+
241
+ Browse and install ready-made configurations (model providers, plugins, MCP servers, skills, agent presets…) shared by the community:
242
+
243
+ - **Built-in official market** — read-only, bound to the official public repo (official badge shown, not editable); first open auto-refreshes, manual refresh also available
244
+ - **Search & filter** — keyword search, category filter, source filter (Official / Community), sorting (recently updated / most starred / name A–Z), and a ⭐ badge showing the **source repo's** star count (queried anonymously, no token involved)
245
+ - **Supply-chain warnings always shown** — source repo URL, "not officially reviewed", download time; **per-section approval** — high-risk sections (sessions / arbitrary files) are banned from listing outright, and every remaining section must be explicitly approved before the import is confirmed
246
+ - **Install reuses the safe import pipeline** — analyze → preview → auto-backup → apply → rollback; nothing is written before you confirm
247
+ - **"My Configs"** — sign in with GitHub (device flow), upload a config to **your own public repo** in one click, and an **auto listing PR** is opened against the official market repo; manage your listings (status badges: not listed / PR pending / listed), update in one click, install back locally, or delist (auto de-listing PR)
248
+
220
249
  ### 🗂️ Profiles
221
250
 
222
251
  Save multiple configurations (Work / Personal) and switch anytime; switching includes preview + auto-backup + rollback.
package/README.zh-CN.md CHANGED
@@ -1,8 +1,19 @@
1
1
  # 🎒 DSH Config Manager
2
2
 
3
- **DeepSeek Harness(DSH)备份 / 恢复 / 迁移插件。**
3
+ **DeepSeek Harness(DSH)配置备份、恢复与迁移插件。**
4
4
 
5
- 一键备份、恢复、导出、导入、迁移和同步你的完整 DSH 配置——设置、模型供应商、插件、MCP 服务器、技能、Agent 预设与工作区;换台电脑,环境一键恢复。
5
+ DSH Config Manager 是一个 DeepSeek Harness 配置备份与迁移插件:一键备份、恢复、导出、导入和迁移完整 DSH 配置,包括——
6
+
7
+ - DSH 设置
8
+ - 模型 / Provider 配置
9
+ - 已安装插件及插件配置
10
+ - MCP Servers
11
+ - Skills
12
+ - Agent Presets
13
+ - Profiles(配置档案)
14
+ - Workspace / AGENTS.md
15
+
16
+ 把当前 DeepSeek Harness 环境导出为可移植备份,在另一台电脑上一键恢复;也支持通过 Git / WebDAV 跨机同步(密钥永不参与同步);还能通过内置**配置市场**浏览、一键安装社区分享的现成配置。
6
17
 
7
18
  [English](README.md) · [简体中文](README.zh-CN.md)
8
19
 
@@ -43,6 +54,10 @@ DSH 是你的 AI 助手工作台,里面存着你的各种设置:模型配置
43
54
 
44
55
  通过私有 Git 仓库或 WebDAV 在多台电脑间保持可移植配置同步——密钥永不参与同步。
45
56
 
57
+ ### 从配置市场发现并安装共享配置
58
+
59
+ 在内置官方市场浏览现成配置(模型 / Provider、插件、MCP、技能、Agent 预设……),先 dry-run 预览再一键安装——供应链警示恒展示,确认导入前每个分区都须显式批准。
60
+
46
61
  ---
47
62
 
48
63
  ## ✨ 核心亮点
@@ -58,6 +73,7 @@ DSH 是你的 AI 助手工作台,里面存着你的各种设置:模型配置
58
73
  | ↩️ | **自动回滚** | 导入失败自动恢复原样,不会弄坏现有配置 |
59
74
  | 📸 | **快照恢复** | 撤销一次导入:整文件还原 + 卸载新增插件(CLI 与 GUI 均支持) |
60
75
  | 🔄 | **远程同步** | 通过 **Git 私有仓库或 WebDAV** 推送 / 拉取可移植配置(密钥永不参与同步) |
76
+ | 🛒 | **配置市场** | 浏览并一键安装社区分享的配置——供应链警示 + 逐分区批准 |
61
77
  | 🗂️ | **配置档案 Profiles** | 保存多套配置(工作 / 个人),随时切换 |
62
78
 
63
79
  ---
@@ -72,6 +88,10 @@ DSH 是你的 AI 助手工作台,里面存着你的各种设置:模型配置
72
88
  |:---:|:---:|
73
89
  | ![快照恢复](assets/screenshot-snapshots.png) | ![远程同步](assets/screenshot-sync.png) |
74
90
 
91
+ | 配置市场 |
92
+ |:---:|
93
+ | ![配置市场](assets/screenshot-market.png) |
94
+
75
95
  ---
76
96
 
77
97
  ## 🔄 它是怎么工作的?
@@ -102,17 +122,17 @@ DSH 是你的 AI 助手工作台,里面存着你的各种设置:模型配置
102
122
 
103
123
  ```bash
104
124
  # ① 安装插件
105
- dsh plugin --profile web add dsh-config-manager@latest --config.auto-install-peers=false
125
+ dsh plugin --profile web add dsh-config-manager@latest
106
126
 
107
127
  # ② 重启 DSH(设置页就会出现「备份与迁移」入口)
108
128
  ```
109
129
 
110
- > 💡 照着复制就行:`--config.auto-install-peers=false` 跳过几个尚未公开发布的 DSH 核心依赖(运行时由 DSH 自己提供),`@latest` 确保装到最新版。
130
+ > 💡 照着复制就行:`@latest` 确保装到最新版。
111
131
  >
112
132
  > 🐛 **`@latest` 装到了旧版?** 这是 **pnpm 11 的 `minimumReleaseAge` 供应链发布年龄策略**(不是缓存):发布不足约 30 天的新版本会被排除出版本解析,直到进入白名单。两种解决办法:
113
133
  > - 装一次精确版本即可自动白名单,之后 `@latest` 正常:
114
134
  > ```bash
115
- > dsh plugin --profile web add dsh-config-manager@0.1.8 --config.auto-install-peers=false
135
+ > dsh plugin --profile web add dsh-config-manager@0.1.8
116
136
  > ```
117
137
  > - 或一行命令彻底关闭年龄门槛(在 profile 的 `pnpm-workspace.yaml` 顶部加 `minimumReleaseAge: 0`):
118
138
  > ```powershell
@@ -216,6 +236,16 @@ dsh plugin --profile web add dsh-config-manager@latest --config.auto-install-pee
216
236
  - **WebDAV 认证**采用 HTTP Basic:`username` 存配置、可在界面回显;`password` 则实时从 DSH credentials 槽位 `DSH_CONFIG_MANAGER_SYNC_WEBDAV_PASSWORD` 读取——绝不出现于任何同步文件或日志。
217
237
  - **插件自动安装**:拉取差异时,备份里新增的插件会在确认导入时**自动安装**,无需在差异列表里逐项手动勾选;只有**版本冲突**的插件仍需要你决定「保留当前 / 采用备份」。
218
238
 
239
+ ### 🛒 配置市场(Marketplace)
240
+
241
+ 浏览并一键安装社区分享的现成配置(模型 / Provider、插件、MCP、技能、Agent 预设……):
242
+
243
+ - **内置官方市场**——只读、绑定官方公开仓库(官方徽章,不可编辑);首次打开自动刷新,也支持手动拉取最新
244
+ - **搜索与筛选**——关键词搜索、类别过滤、来源筛选(官方 / 个人)、排序(最近更新 / ⭐ 最多 / 名称 A–Z),并显示**来源仓库**的 ⭐ star 数(匿名查询,不触碰任何 token)
245
+ - **供应链警示恒展示**——来源仓库 URL +「未经官方审核」+ 下载时间;**逐分区批准**——高风险分区(历史会话 / 任意文件)直接禁止上架,其余分区确认导入前须逐项显式勾选
246
+ - **安装复用安全导入管道**——分析 → 预览 → 自动备份 → 执行 → 回滚;确认前零写入
247
+ - **「我的配置」**——GitHub 登录(device flow)后一键上传到**你自己的公开仓库**,并自动向官方市场仓库提交**收录 PR**;管理已上传条目(收录状态徽章:未收录 / PR 待审核 / 已收录)、一键更新、装回本地、删除(自动下架 PR)
248
+
219
249
  ### 🗂️ 配置档案(Profiles)
220
250
 
221
251
  保存多套配置(如「工作」「个人」),随时切换;切换同样带预览 + 自动备份 + 回滚。
package/lib/client.js CHANGED
@@ -2928,120 +2928,120 @@ if (typeof document !== "undefined" && document.querySelector("style[data-tag=\"
2928
2928
  document.head.appendChild(tag);
2929
2929
  }
2930
2930
  var config_manager_module_css_default = {
2931
- "groupHeader": "_367UGW_groupHeader",
2932
- "hint": "_367UGW_hint",
2933
- "section": "_367UGW_section",
2934
- "modeTabs": "_367UGW_modeTabs",
2935
- "spinnerWrap": "_367UGW_spinnerWrap",
2936
- "viewTabs": "_367UGW_viewTabs",
2937
- "banner": "_367UGW_banner",
2938
- "radioLabel": "_367UGW_radioLabel",
2939
- "pathMappingList": "_367UGW_pathMappingList",
2940
- "errorAction": "_367UGW_errorAction",
2941
- "reportFooter": "_367UGW_reportFooter",
2942
- "conflictOptions": "_367UGW_conflictOptions",
2943
- "dialogHeaderRow": "_367UGW_dialogHeaderRow",
2944
- "categoryName": "_367UGW_categoryName",
2945
- "progressDetail": "_367UGW_progressDetail",
2946
- "pullScroll": "_367UGW_pullScroll",
2947
- "spinnerLabel": "_367UGW_spinnerLabel",
2948
- "dialogBodyScroll": "_367UGW_dialogBodyScroll",
2949
- "viewBody": "_367UGW_viewBody",
2950
- "errorTitle": "_367UGW_errorTitle",
2931
+ "card": "_367UGW_card",
2932
+ "snapshotList": "_367UGW_snapshotList",
2933
+ "conflictItem": "_367UGW_conflictItem",
2951
2934
  "empty": "_367UGW_empty",
2952
- "modeHint": "_367UGW_modeHint",
2953
- "rollbackBox": "_367UGW_rollbackBox",
2954
- "reportView": "_367UGW_reportView",
2955
- "progressBadge": "_367UGW_progressBadge",
2956
- "progressBar": "_367UGW_progressBar",
2957
- "categoryItem": "_367UGW_categoryItem",
2958
- "conflictId": "_367UGW_conflictId",
2959
- "optionsCard": "_367UGW_optionsCard",
2960
- "conflictDetail": "_367UGW_conflictDetail",
2961
- "field": "_367UGW_field",
2962
- "fieldLabel": "_367UGW_fieldLabel",
2963
2935
  "rowActions": "_367UGW_rowActions",
2964
- "reportText": "_367UGW_reportText",
2965
- "dialogWide": "_367UGW_dialogWide",
2936
+ "radioLabel": "_367UGW_radioLabel",
2937
+ "conflictId": "_367UGW_conflictId",
2966
2938
  "badge": "_367UGW_badge",
2967
- "optionsHeader": "_367UGW_optionsHeader",
2968
- "dangerButton": "_367UGW_dangerButton",
2969
- "snapshotList": "_367UGW_snapshotList",
2970
- "warnText": "_367UGW_warnText",
2971
- "checkboxRow": "_367UGW_checkboxRow",
2972
- "secretFields": "_367UGW_secretFields",
2973
- "sectionTitle": "_367UGW_sectionTitle",
2974
- "severityError": "_367UGW_severityError",
2939
+ "groupList": "_367UGW_groupList",
2940
+ "groupNote": "_367UGW_groupNote",
2941
+ "progressBadgeCount": "_367UGW_progressBadgeCount",
2942
+ "progressBlock": "_367UGW_progressBlock",
2943
+ "dialogClose": "_367UGW_dialogClose",
2944
+ "pathValue": "_367UGW_pathValue",
2975
2945
  "errorActionLabel": "_367UGW_errorActionLabel",
2946
+ "errorItem": "_367UGW_errorItem",
2947
+ "groupLabel": "_367UGW_groupLabel",
2948
+ "actionRow": "_367UGW_actionRow",
2949
+ "reportFooter": "_367UGW_reportFooter",
2950
+ "planScroll": "_367UGW_planScroll",
2951
+ "modeHint": "_367UGW_modeHint",
2952
+ "progressTrack": "_367UGW_progressTrack",
2953
+ "primaryButton": "_367UGW_primaryButton",
2976
2954
  "pathRow": "_367UGW_pathRow",
2955
+ "dialogBodyScroll": "_367UGW_dialogBodyScroll",
2956
+ "secretsList": "_367UGW_secretsList",
2957
+ "pullScroll": "_367UGW_pullScroll",
2958
+ "aboutLinkRow": "_367UGW_aboutLinkRow",
2959
+ "conflictList": "_367UGW_conflictList",
2960
+ "groupItems": "_367UGW_groupItems",
2961
+ "categoryDesc": "_367UGW_categoryDesc",
2962
+ "reportView": "_367UGW_reportView",
2963
+ "modeTab": "_367UGW_modeTab",
2964
+ "conflictOptions": "_367UGW_conflictOptions",
2965
+ "groupCard": "_367UGW_groupCard",
2966
+ "dialogCard": "_367UGW_dialogCard",
2967
+ "badgeWarn": "_367UGW_badgeWarn",
2968
+ "progressIndeterminate": "_367UGW_progressIndeterminate",
2969
+ "rollbackBox": "_367UGW_rollbackBox",
2970
+ "aboutAuthor": "_367UGW_aboutAuthor",
2971
+ "errorAction": "_367UGW_errorAction",
2972
+ "formError": "_367UGW_formError",
2973
+ "errorTitle": "_367UGW_errorTitle",
2974
+ "pathNew": "_367UGW_pathNew",
2975
+ "badgeOk": "_367UGW_badgeOk",
2976
+ "dialogHeaderRow": "_367UGW_dialogHeaderRow",
2977
2977
  "errorFooter": "_367UGW_errorFooter",
2978
2978
  "snapshotRow": "_367UGW_snapshotRow",
2979
- "groupList": "_367UGW_groupList",
2980
- "progressTrack": "_367UGW_progressTrack",
2981
- "groupNote": "_367UGW_groupNote",
2982
- "hiddenFile": "_367UGW_hiddenFile",
2979
+ "severityError": "_367UGW_severityError",
2980
+ "snapshotRowHeader": "_367UGW_snapshotRowHeader",
2981
+ "wizardCard": "_367UGW_wizardCard",
2982
+ "categoryName": "_367UGW_categoryName",
2983
2983
  "dialogMask": "_367UGW_dialogMask",
2984
+ "banner": "_367UGW_banner",
2985
+ "reportList": "_367UGW_reportList",
2986
+ "modeTabs": "_367UGW_modeTabs",
2987
+ "progressBadge": "_367UGW_progressBadge",
2988
+ "progressBadgeSection": "_367UGW_progressBadgeSection",
2989
+ "dialogHeader": "_367UGW_dialogHeader",
2990
+ "dangerButton": "_367UGW_dangerButton",
2991
+ "hint": "_367UGW_hint",
2992
+ "progressMeta": "_367UGW_progressMeta",
2993
+ "conflictDetail": "_367UGW_conflictDetail",
2994
+ "pathMappingList": "_367UGW_pathMappingList",
2984
2995
  "statRow": "_367UGW_statRow",
2985
- "dialogBody": "_367UGW_dialogBody",
2986
- "progressPercent": "_367UGW_progressPercent",
2996
+ "errorBanner": "_367UGW_errorBanner",
2987
2997
  "kindTag": "_367UGW_kindTag",
2988
- "conflictList": "_367UGW_conflictList",
2989
- "sectionSubtitle": "_367UGW_sectionSubtitle",
2990
- "primaryButton": "_367UGW_primaryButton",
2991
- "input": "_367UGW_input",
2992
- "planScroll": "_367UGW_planScroll",
2993
- "groupLabel": "_367UGW_groupLabel",
2994
- "secretsList": "_367UGW_secretsList",
2995
- "badgeOk": "_367UGW_badgeOk",
2996
- "groupCard": "_367UGW_groupCard",
2997
- "pathOld": "_367UGW_pathOld",
2998
- "warnList": "_367UGW_warnList",
2999
- "card": "_367UGW_card",
3000
- "progressMeta": "_367UGW_progressMeta",
3001
- "viewTab": "_367UGW_viewTab",
3002
- "errorLine": "_367UGW_errorLine",
3003
- "progressBadgeSection": "_367UGW_progressBadgeSection",
3004
- "dshCmSpin": "_367UGW_dshCmSpin",
3005
- "pathIssueKind": "_367UGW_pathIssueKind",
3006
- "errorItem": "_367UGW_errorItem",
2998
+ "field": "_367UGW_field",
2999
+ "diffScroll": "_367UGW_diffScroll",
3000
+ "optionsCard": "_367UGW_optionsCard",
3001
+ "sectionTitle": "_367UGW_sectionTitle",
3007
3002
  "sectionBody": "_367UGW_sectionBody",
3008
- "reportScroll": "_367UGW_reportScroll",
3009
- "ghostButton": "_367UGW_ghostButton",
3010
- "select": "_367UGW_select",
3011
- "categoryDesc": "_367UGW_categoryDesc",
3012
- "sectionHeader": "_367UGW_sectionHeader",
3013
3003
  "badgeInfo": "_367UGW_badgeInfo",
3014
- "errorList": "_367UGW_errorList",
3015
3004
  "conflictHead": "_367UGW_conflictHead",
3016
- "pathNew": "_367UGW_pathNew",
3017
- "progressBlock": "_367UGW_progressBlock",
3018
- "reportList": "_367UGW_reportList",
3019
- "confirmScroll": "_367UGW_confirmScroll",
3005
+ "progressBar": "_367UGW_progressBar",
3006
+ "reportScroll": "_367UGW_reportScroll",
3007
+ "sectionHeader": "_367UGW_sectionHeader",
3008
+ "select": "_367UGW_select",
3009
+ "dshCmSpin": "_367UGW_dshCmSpin",
3010
+ "errorReason": "_367UGW_errorReason",
3011
+ "warnList": "_367UGW_warnList",
3012
+ "pathIssueKind": "_367UGW_pathIssueKind",
3013
+ "warnText": "_367UGW_warnText",
3014
+ "dialogBody": "_367UGW_dialogBody",
3015
+ "viewTab": "_367UGW_viewTab",
3016
+ "input": "_367UGW_input",
3017
+ "dialogWide": "_367UGW_dialogWide",
3020
3018
  "dshCmIndeterminate": "_367UGW_dshCmIndeterminate",
3021
- "errorBanner": "_367UGW_errorBanner",
3022
- "snapshotRowHeader": "_367UGW_snapshotRowHeader",
3023
- "progressIndeterminate": "_367UGW_progressIndeterminate",
3024
- "aboutLinkRow": "_367UGW_aboutLinkRow",
3025
- "groupItems": "_367UGW_groupItems",
3019
+ "groupHeader": "_367UGW_groupHeader",
3020
+ "viewBody": "_367UGW_viewBody",
3021
+ "fieldLabel": "_367UGW_fieldLabel",
3022
+ "confirmScroll": "_367UGW_confirmScroll",
3023
+ "progressDetail": "_367UGW_progressDetail",
3024
+ "reportText": "_367UGW_reportText",
3025
+ "spinnerLabel": "_367UGW_spinnerLabel",
3026
+ "checkboxRow": "_367UGW_checkboxRow",
3026
3027
  "progressLabel": "_367UGW_progressLabel",
3027
- "badgeWarn": "_367UGW_badgeWarn",
3028
- "dialogCard": "_367UGW_dialogCard",
3028
+ "badgeError": "_367UGW_badgeError",
3029
+ "progressPercent": "_367UGW_progressPercent",
3030
+ "sectionTitleBlock": "_367UGW_sectionTitleBlock",
3029
3031
  "spinner": "_367UGW_spinner",
3030
- "modeTab": "_367UGW_modeTab",
3031
- "conflictItem": "_367UGW_conflictItem",
3032
- "dialogHeader": "_367UGW_dialogHeader",
3033
- "wizardCard": "_367UGW_wizardCard",
3034
- "aboutAuthor": "_367UGW_aboutAuthor",
3035
- "dialogClose": "_367UGW_dialogClose",
3036
- "actionRow": "_367UGW_actionRow",
3037
- "pathValue": "_367UGW_pathValue",
3038
- "formError": "_367UGW_formError",
3032
+ "secretFields": "_367UGW_secretFields",
3033
+ "hiddenFile": "_367UGW_hiddenFile",
3034
+ "optionsHeader": "_367UGW_optionsHeader",
3035
+ "pathOld": "_367UGW_pathOld",
3036
+ "sectionSubtitle": "_367UGW_sectionSubtitle",
3037
+ "viewTabs": "_367UGW_viewTabs",
3038
+ "categoryItem": "_367UGW_categoryItem",
3039
+ "errorList": "_367UGW_errorList",
3040
+ "errorLine": "_367UGW_errorLine",
3041
+ "ghostButton": "_367UGW_ghostButton",
3042
+ "spinnerWrap": "_367UGW_spinnerWrap",
3039
3043
  "progressBarDone": "_367UGW_progressBarDone",
3040
- "sectionTitleBlock": "_367UGW_sectionTitleBlock",
3041
- "badgeError": "_367UGW_badgeError",
3042
- "diffScroll": "_367UGW_diffScroll",
3043
- "progressBadgeCount": "_367UGW_progressBadgeCount",
3044
- "errorReason": "_367UGW_errorReason"
3044
+ "section": "_367UGW_section"
3045
3045
  };
3046
3046
  //#endregion
3047
3047
  //#region src/client/common/ui.tsx
@@ -8718,7 +8718,7 @@ function MyConfigsView({ meApi, api, importApi, syncApi, t, myItems, myItemsErro
8718
8718
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8719
8719
  className: config_manager_module_css_default.dialogBodyScroll,
8720
8720
  children: [
8721
- wizard.step === "select" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
8721
+ wizard.step === "select" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
8722
8722
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8723
8723
  className: config_manager_module_css_default.hint,
8724
8724
  children: t("myconfigs.upload.selectHint")
@@ -8746,7 +8746,7 @@ function MyConfigsView({ meApi, api, importApi, syncApi, t, myItems, myItemsErro
8746
8746
  })
8747
8747
  })
8748
8748
  ] }),
8749
- wizard.step === "validate" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
8749
+ wizard.step === "validate" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
8750
8750
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8751
8751
  className: config_manager_module_css_default.hint,
8752
8752
  children: t("myconfigs.upload.selectHint")
@@ -8778,8 +8778,8 @@ function MyConfigsView({ meApi, api, importApi, syncApi, t, myItems, myItemsErro
8778
8778
  children: redact(wizard.validationError)
8779
8779
  })
8780
8780
  ] }),
8781
- wizard.step === "form" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
8782
- wizard.mode === "update" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
8781
+ wizard.step === "form" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
8782
+ wizard.mode === "update" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
8783
8783
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8784
8784
  className: config_manager_module_css_default.hint,
8785
8785
  children: t("myconfigs.update.zipHint")
@@ -8899,7 +8899,7 @@ function MyConfigsView({ meApi, api, importApi, syncApi, t, myItems, myItemsErro
8899
8899
  kind: "error",
8900
8900
  children: redact(wizard.error)
8901
8901
  }),
8902
- wizard.result !== null && (wizard.result.ok ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
8902
+ wizard.result !== null && (wizard.result.ok ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
8903
8903
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8904
8904
  className: config_manager_module_css_default.groupLabel,
8905
8905
  children: t("myconfigs.result.title")
@@ -9133,7 +9133,7 @@ function MyConfigsView({ meApi, api, importApi, syncApi, t, myItems, myItemsErro
9133
9133
  className: config_manager_module_css_default.statRow,
9134
9134
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Spinner, { label: t("list.loading") })
9135
9135
  }),
9136
- detail !== null && detailView !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
9136
+ detail !== null && detailView !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
9137
9137
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
9138
9138
  kind: "warn",
9139
9139
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("detail.needReview") })
@@ -9148,7 +9148,7 @@ function MyConfigsView({ meApi, api, importApi, syncApi, t, myItems, myItemsErro
9148
9148
  children: detailView.badge.sectionsText
9149
9149
  })]
9150
9150
  }),
9151
- approvalList.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
9151
+ approvalList.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
9152
9152
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
9153
9153
  className: config_manager_module_css_default.groupLabel,
9154
9154
  children: t("detail.approval.title")
@@ -9713,7 +9713,7 @@ function MarketPanel({ api, myConfigsApi, importApi, syncApi, t }) {
9713
9713
  })
9714
9714
  ]
9715
9715
  }),
9716
- detailView.errors.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
9716
+ detailView.errors.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
9717
9717
  className: config_manager_module_css_default.fieldLabel,
9718
9718
  children: t("detail.errors")
9719
9719
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -9727,7 +9727,7 @@ function MarketPanel({ api, myConfigsApi, importApi, syncApi, t }) {
9727
9727
  kind: "info",
9728
9728
  children: t("detail.previewHint")
9729
9729
  }),
9730
- detailView.canImport && approvalList.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
9730
+ detailView.canImport && approvalList.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
9731
9731
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
9732
9732
  className: config_manager_module_css_default.groupLabel,
9733
9733
  children: t("detail.approval.title")