dsh-config-manager 0.1.40 → 0.1.42

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 (77) hide show
  1. package/LICENSE +21 -0
  2. package/lib/client.d.ts +134 -10
  3. package/lib/client.js +2252 -1177
  4. package/lib/client.js.map +1 -1
  5. package/lib/core/cache-cleaner.d.ts +39 -0
  6. package/lib/core/cache-cleaner.js +164 -0
  7. package/lib/core/cache-cleaner.js.map +1 -0
  8. package/lib/index.js +265 -5
  9. package/lib/index.js.map +1 -1
  10. package/lib/market/github-repos.d.ts +37 -8
  11. package/lib/market/github-repos.js +113 -33
  12. package/lib/market/github-repos.js.map +1 -1
  13. package/lib/market/my-repo.d.ts +113 -4
  14. package/lib/market/my-repo.js +313 -29
  15. package/lib/market/my-repo.js.map +1 -1
  16. package/lib/market/prepare.js +3 -2
  17. package/lib/market/prepare.js.map +1 -1
  18. package/lib/market/repo-url.d.ts +24 -0
  19. package/lib/market/repo-url.js +30 -0
  20. package/lib/market/repo-url.js.map +1 -0
  21. package/lib/market/star-cache.d.ts +48 -0
  22. package/lib/market/star-cache.js +57 -0
  23. package/lib/market/star-cache.js.map +1 -0
  24. package/lib/market/types.d.ts +4 -0
  25. package/lib/security/secret-scanner.d.ts +15 -3
  26. package/lib/security/secret-scanner.js +139 -54
  27. package/lib/security/secret-scanner.js.map +1 -1
  28. package/lib/sync/ui-prefs.d.ts +14 -0
  29. package/lib/sync/ui-prefs.js +32 -4
  30. package/lib/sync/ui-prefs.js.map +1 -1
  31. package/lib/ui/star-prompt.d.ts +37 -0
  32. package/lib/ui/star-prompt.js +36 -0
  33. package/lib/ui/star-prompt.js.map +1 -0
  34. package/package.json +2 -1
  35. package/src/client/ConfigManagerSection.tsx +75 -1
  36. package/src/client/api.ts +51 -0
  37. package/src/client/common/ConfirmDialog.tsx +144 -0
  38. package/src/client/common/ui.tsx +4 -2
  39. package/src/client/config-manager.module.css +101 -0
  40. package/src/client/locales.ts +11 -0
  41. package/src/client/market/MarketPanel.tsx +180 -47
  42. package/src/client/market/MyConfigsView.tsx +516 -128
  43. package/src/client/market/disclaimer.test.ts +57 -0
  44. package/src/client/market/disclaimer.ts +43 -0
  45. package/src/client/market/market-api.test.ts +3 -0
  46. package/src/client/market/market-locales.ts +56 -17
  47. package/src/client/market/market-view.test.ts +74 -3
  48. package/src/client/market/market-view.ts +56 -0
  49. package/src/client/market/my-configs-api.ts +20 -2
  50. package/src/client/market/my-configs-view.test.ts +160 -2
  51. package/src/client/market/my-configs-view.ts +173 -0
  52. package/src/client/run-store.test.ts +40 -2
  53. package/src/client/run-store.ts +78 -10
  54. package/src/client/sync/SyncConfirmView.tsx +28 -22
  55. package/src/client/sync/SyncSettingsView.tsx +175 -65
  56. package/src/client/sync/sync-api.ts +19 -0
  57. package/src/client/sync/sync-locales.ts +14 -2
  58. package/src/core/cache-cleaner.test.ts +333 -0
  59. package/src/core/cache-cleaner.ts +196 -0
  60. package/src/index.ts +253 -5
  61. package/src/market/github-repos.test.ts +163 -8
  62. package/src/market/github-repos.ts +122 -35
  63. package/src/market/my-repo.test.ts +188 -27
  64. package/src/market/my-repo.ts +407 -33
  65. package/src/market/prepare.test.ts +71 -1
  66. package/src/market/prepare.ts +3 -2
  67. package/src/market/repo-url.test.ts +60 -0
  68. package/src/market/repo-url.ts +45 -0
  69. package/src/market/star-cache.test.ts +102 -0
  70. package/src/market/star-cache.ts +91 -0
  71. package/src/market/types.ts +4 -0
  72. package/src/security/secret-scanner.ts +134 -50
  73. package/src/security/security.test.ts +82 -2
  74. package/src/sync/ui-prefs.test.ts +58 -2
  75. package/src/sync/ui-prefs.ts +42 -4
  76. package/src/ui/star-prompt.test.ts +53 -0
  77. package/src/ui/star-prompt.ts +55 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 xiajiajun516
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/lib/client.d.ts CHANGED
@@ -568,6 +568,31 @@ interface RestoreResponse {
568
568
  plan?: RestorePlan;
569
569
  report?: RestoreReport;
570
570
  }
571
+ /** Star 引导弹窗状态(GET /star-prompt;纯偏好,无 secret) */
572
+ interface StarPromptStatus {
573
+ ok: boolean;
574
+ /** 引导用户点 Star 的 GitHub 仓库地址(Host 提供,硬编码常量) */
575
+ repoUrl: string;
576
+ /** 首次进入页面时间(ms 时间戳);undefined = 尚未进入过页面 */
577
+ firstSeenAt?: number;
578
+ /** 用户点过「不再提示」 */
579
+ dismissed: boolean;
580
+ /** 用户点过「去点 Star」(方案 A:引导完成) */
581
+ clicked: boolean;
582
+ }
583
+ /** Star 引导弹窗状态的局部更新补丁(POST /star-prompt;全部可选) */
584
+ interface StarPromptPatch {
585
+ firstSeenAt?: number;
586
+ dismissed?: boolean;
587
+ clicked?: boolean;
588
+ }
589
+ /** POST /star-prompt 响应(更新后的最新状态) */
590
+ interface StarPromptSaveResponse {
591
+ ok: boolean;
592
+ firstSeenAt?: number;
593
+ dismissed: boolean;
594
+ clicked: boolean;
595
+ }
571
596
  /** 携带路由 JSON error 消息的错误类型 */
572
597
  declare class ConfigManagerApiError extends Error {
573
598
  constructor(message: string);
@@ -599,6 +624,11 @@ declare class ConfigManagerApi {
599
624
  constructor(t?: UiT);
600
625
  /** 健康/版本检查(主页横幅:插件版本 / DSH 版本 / 平台) */
601
626
  status(): Promise<ServiceStatus>;
627
+ /** Star 引导弹窗状态(进入页面时判定是否展示 / 是否补记首次使用时间)。 */
628
+ starPromptStatus(): Promise<StarPromptStatus>;
629
+ /** 保存 Star 引导弹窗状态(局部更新:firstSeenAt / dismissed / clicked)。
630
+ * 纯偏好无 secret;失败由调用方静默降级(本次不弹/不记,下次再判)。 */
631
+ saveStarPrompt(patch: StarPromptPatch): Promise<StarPromptSaveResponse>;
602
632
  /** ExportPort.export:调用 Host 侧导出编排(core Exporter)。加密密码随请求体传输(仅内存)。
603
633
  * 带 AbortController 超时:宿主若卡死,客户端得到明确错误而不是永远停在进度条。 */
604
634
  export(options: ExportOptions): Promise<ExportResponse>;
@@ -962,6 +992,17 @@ interface GithubPollResponse {
962
992
  /** success 时恒 true(凭据已配置);便于 UI 直接刷新状态 */
963
993
  credentialConfigured?: boolean;
964
994
  }
995
+ /** POST /sync/github/validate 响应:token 是否已配置 + 是否有效(GET /user;
996
+ * 401 → 无效)。只回布尔 + 登录名(非敏感),token 值永不回传浏览器。 */
997
+ interface GithubValidateResponse {
998
+ ok: boolean;
999
+ /** token 是否存在于 DSH credentials */
1000
+ configured: boolean;
1001
+ /** token 是否有效(GitHub GET /user 成功;configured=false 时恒 false) */
1002
+ valid: boolean;
1003
+ /** GitHub 登录名(valid=true 时;非敏感展示位) */
1004
+ login?: string;
1005
+ }
965
1006
  /** 远程同步浏览器半数据入口(备份与迁移页第 4 个 tab 的注入业务面) */
966
1007
  declare class SyncApi {
967
1008
  readonly t: UiT;
@@ -980,6 +1021,9 @@ declare class SyncApi {
980
1021
  githubCancel(flowId: string): Promise<{
981
1022
  ok: boolean;
982
1023
  }>;
1024
+ /** GitHub token 有效性校验(判定「是否已登录」:token 存在且 GitHub API 接受;
1025
+ * 401 → valid:false 引导重新登录;非 401 错误向上抛,UI 兜底不误判登出) */
1026
+ githubValidate(): Promise<GithubValidateResponse>;
983
1027
  /** 同步历史:列出本地祖先快照 + 自动同步执行记录(按 createdAt 倒序合并)。 */
984
1028
  history(): Promise<SyncHistoryResponse>;
985
1029
  /** 远端历史快照列表(供「选择历史快照」下拉)。 */
@@ -1071,6 +1115,8 @@ interface MarketListItem {
1071
1115
  categories?: string[];
1072
1116
  /** 条目来源仓库 URL(来自 index 条目;UI 据此显示来源徽章);缺省 = 市场仓库自身 */
1073
1117
  repo?: string;
1118
+ /** 条目来源仓库的 star 数(仓库级,非条目级;undefined = 无数据——查询失败/非 GitHub 仓库) */
1119
+ stars?: number;
1074
1120
  /** 本地缓存状态:cached | fresh | none(UI 徽章) */
1075
1121
  cacheState: 'cached' | 'fresh' | 'none';
1076
1122
  }
@@ -1110,6 +1156,8 @@ interface MarketStatusResponse {
1110
1156
  /** 是否已添加过至少一个市场 */
1111
1157
  configured: boolean;
1112
1158
  markets: MarketSummary[];
1159
+ /** 本次 dsh 启动后市场是否已刷新过(首次打开市场页自动更新一次的依据;进程内存,dsh 重启后重置) */
1160
+ bootAutoRefreshed?: boolean;
1113
1161
  }
1114
1162
  /** POST /market/refresh 响应:{ ok, items, market } */
1115
1163
  interface MarketRefreshResponse {
@@ -1190,7 +1238,15 @@ interface MyRepoForm {
1190
1238
  description?: string;
1191
1239
  categories?: string[];
1192
1240
  }
1193
- /** upload / update 返回(ok=false 时携带已脱敏 error + errorCode) */
1241
+ /** 收录流程状态:pending=已提交、后台处理中;done=已提交收录(PR 已开/复用);failed=收录失败可重试 */
1242
+ type ListingState = 'pending' | 'done' | 'failed';
1243
+ /**
1244
+ * upload / update 返回(ok=false 时携带已脱敏 error + errorCode)。
1245
+ * 流程拆分(2026-08-20 优化):upload/update 只同步执行「推用户仓库」并立即返回
1246
+ * (listing='pending'),「收录流程」(fork + 官方 index + PR)在后台异步执行,
1247
+ * 避免 GitHub fork 排队时整个上传请求长时间挂起;收录结果经 listingStatus /
1248
+ * /me/items 状态徽章查询。
1249
+ */
1194
1250
  interface UploadResult {
1195
1251
  ok: boolean;
1196
1252
  itemId: string;
@@ -1199,14 +1255,47 @@ interface UploadResult {
1199
1255
  sections: SectionId[];
1200
1256
  /** 用户公开仓库 URL(https://github.com/<login>/dsh-configs) */
1201
1257
  repoUrl: string;
1258
+ /** 收录 PR 编号(异步模式下收起完成前为 null;完成经 listingStatus 查询) */
1202
1259
  prNumber: number | null;
1260
+ /** 收录 PR 链接(同上) */
1203
1261
  prUrl: string | null;
1204
1262
  warnings: string[];
1263
+ /** 收录流程状态:ok=true 且上传成功后为 'pending'(后台进行中);失败无收录流程时 'done' 无意义 */
1264
+ listing: ListingState;
1265
+ /** listing='failed' 时:收录失败原因(已脱敏,含重试指引) */
1266
+ listingError?: string;
1205
1267
  /** ok=false 时:可展示错误(已脱敏,无 token 形态) */
1206
1268
  error?: string;
1207
1269
  /** ok=false 时:错误分类码(unauthorized/prepare_failed/...;无则 'internal') */
1208
1270
  errorCode?: string;
1209
1271
  }
1272
+ /** POST /me/listing 响应:收录任务状态(结果卡轮询用,比拉全列表更轻) */
1273
+ interface ListingStatusResponse {
1274
+ itemId: string;
1275
+ listing: ListingState;
1276
+ /** listing='done' 时:PR 编号 */
1277
+ prNumber: number | null;
1278
+ /** listing='done' 时:PR 链接 */
1279
+ prUrl: string | null;
1280
+ /** listing='failed' 时:失败原因(已脱敏) */
1281
+ error?: string;
1282
+ }
1283
+ /** POST /me/delete 响应:删除条目结果 */
1284
+ interface DeleteResult {
1285
+ ok: boolean;
1286
+ itemId: string;
1287
+ /** 是否已异步提交「下架 PR」(条目此前已收录进官方市场时 true) */
1288
+ delisted: boolean;
1289
+ /** 被关闭的收录 PR(条目处于待审核、有 open PR 时关闭它) */
1290
+ prNumber: number | null;
1291
+ /** 被关闭 PR 的链接(同上) */
1292
+ prUrl: string | null;
1293
+ warnings: string[];
1294
+ /** ok=false 时:可展示错误(已脱敏) */
1295
+ error?: string;
1296
+ /** ok=false 时:错误分类码(item_not_found/unauthorized/...) */
1297
+ errorCode?: string;
1298
+ }
1210
1299
  /** listItems 条目:用户仓库 index.json 条目 + 收录状态 */
1211
1300
  interface MyItemEntry {
1212
1301
  id: string;
@@ -1221,6 +1310,8 @@ interface MyItemEntry {
1221
1310
  prUrl?: string;
1222
1311
  /** 用户公开仓库 URL */
1223
1312
  repoUrl: string;
1313
+ /** 用户公开仓库(<login>/dsh-configs)的 star 数(仓库级;undefined = 无数据) */
1314
+ stars?: number;
1224
1315
  }
1225
1316
  //#endregion
1226
1317
  //#region src/client/market/my-configs-api.d.ts
@@ -1276,6 +1367,12 @@ declare class MyConfigsApi {
1276
1367
  zipPath: string;
1277
1368
  form: MyConfigsFormPayload;
1278
1369
  }): Promise<MyUploadResult>;
1370
+ /** 查询收录/下架任务状态(结果卡轮询;任务表未命中时 Host 回退 GitHub 实况推导;无任务无实况 → null) */
1371
+ meListing(itemId: string): Promise<ListingStatusResponse | null>;
1372
+ /** 重新提交收录(失败/重启丢失后重试;幂等复用已存在 fork/open PR) */
1373
+ meRelist(itemId: string): Promise<ListingStatusResponse>;
1374
+ /** 删除条目(同步删本地索引+文件;已收录自动后台提下架 PR;待审核自动关闭收录 PR) */
1375
+ meDelete(itemId: string): Promise<DeleteResult>;
1279
1376
  }
1280
1377
  //#endregion
1281
1378
  //#region src/client/client-types.d.ts
@@ -1426,6 +1523,10 @@ declare const zh$2: {
1426
1523
  readonly 'report.needsRestart': "插件 / MCP 变更将在重启 DSH 后生效。";
1427
1524
  readonly 'error.title': "操作失败";
1428
1525
  readonly 'error.hint': "错误消息已自动脱敏,不会泄露任何密钥信息。";
1526
+ readonly 'starPrompt.title': "喜欢 Config Manager 吗?";
1527
+ readonly 'starPrompt.body': "如果你觉得这个插件有用,欢迎到 GitHub 点个 ⭐ Star 支持一下——你的支持是持续维护的最大动力!";
1528
+ readonly 'starPrompt.star': "去点 Star";
1529
+ readonly 'starPrompt.dismiss': "不再提示";
1429
1530
  readonly 'about.title': "关于 DSH Config Manager";
1430
1531
  readonly 'about.subtitle': "插件信息、作者与反馈入口";
1431
1532
  readonly 'about.official': "官方";
@@ -1464,10 +1565,14 @@ declare const zh$1: {
1464
1565
  readonly 'config.saving': "保存中…";
1465
1566
  readonly 'config.saveHint': "表单改动会自动保存(密码/token 安全写入 DSH credentials,不会写入同步文件或日志);也可点击按钮立即保存。";
1466
1567
  readonly 'channel.title': "同步通道";
1467
- readonly 'channel.hint': "选择远程同步通道:Git 私有仓库或 WebDAV 服务器。";
1468
1568
  readonly 'channel.git': "Git 私有仓库";
1469
1569
  readonly 'channel.webdav': "WebDAV 服务器";
1470
1570
  readonly 'channel.perChannelHint': "GitHub 与 WebDAV 通道的自动同步、同步模式、加密与远端快照各自独立配置。";
1571
+ readonly 'channel.open': "配置同步通道";
1572
+ readonly 'channel.openHint': "远程同步通过「同步通道」进行:Git 私有仓库或 WebDAV 服务器。点击按钮在弹窗中配置或修改。";
1573
+ readonly 'channel.configured': "已配置";
1574
+ readonly 'channel.notConfigured': "未配置";
1575
+ readonly 'channel.currentUrl': "当前地址";
1471
1576
  readonly 'webdav.title': "WebDAV 配置";
1472
1577
  readonly 'webdav.url': "服务器地址";
1473
1578
  readonly 'webdav.urlHint': "WebDAV 服务器根地址(https://…)。同步快照与索引存放于该地址的 snapshots/ 子目录下。请勿在地址中包含用户名/密码。";
@@ -1483,6 +1588,7 @@ declare const zh$1: {
1483
1588
  readonly 'github.login': "使用 GitHub 登录";
1484
1589
  readonly 'github.retry': "重新登录";
1485
1590
  readonly 'github.cancel': "取消";
1591
+ readonly 'github.tokenInvalid': "GitHub 登录已失效,请重新登录。";
1486
1592
  readonly 'github.userCode': "一次性授权代码";
1487
1593
  readonly 'github.openAuth': "打开 GitHub 授权页面";
1488
1594
  readonly 'github.clientIdHint': "需要插件配置 githubClientId(GitHub OAuth App 的 client_id)才能使用 GitHub 登录。";
@@ -1631,27 +1737,28 @@ declare const zh: {
1631
1737
  readonly 'section.label': "配置市场";
1632
1738
  readonly 'section.description': "浏览并下载社区共享的配置(公开 Git 仓库;下载内容一律视为不可信,导入前必经校验与确认)";
1633
1739
  readonly 'config.title': "市场仓库";
1634
- readonly 'config.builtinHint': "内置官方市场,只读、不可编辑(由创建者维护的公开 Git 仓库)。";
1635
- readonly 'config.official': "内置官方市场";
1636
- readonly 'config.custom': "自定义市场地址";
1637
- readonly 'config.repoUrlHint': "内置公开 Git 仓库地址。市场只读拉取(绝不推送)。";
1638
1740
  readonly 'config.refresh': "拉取最新";
1639
1741
  readonly 'config.refreshing': "拉取中…";
1640
- readonly 'config.addedAt': "更新于:{time}";
1641
- readonly 'config.itemCount': "{count} 个条目";
1642
1742
  readonly 'list.empty': "内置市场尚未加载。请先「拉取最新」。";
1643
1743
  readonly 'list.browse': "浏览";
1644
1744
  readonly 'list.loading': "正在读取市场…";
1645
1745
  readonly 'list.noItems': "该市场暂无条目。";
1646
1746
  readonly 'list.searchPlaceholder': "搜索名称 / 作者 / 描述…";
1647
1747
  readonly 'list.categoriesAll': "全部类别";
1748
+ readonly 'list.sourceAll': "全部来源";
1749
+ readonly 'list.sourceOfficial': "官方配置";
1750
+ readonly 'list.sourcePersonal': "个人配置";
1751
+ readonly 'list.sortDefault': "默认排序";
1752
+ readonly 'list.sortUpdated': "最新更新";
1753
+ readonly 'list.sortStars': "⭐ 最多";
1754
+ readonly 'list.sortName': "名称 A–Z";
1755
+ readonly 'list.stars': "⭐ {count}";
1756
+ readonly 'list.starsHint': "来源仓库 star 数(仓库级,非本条目)";
1648
1757
  readonly 'list.count': "共 {count} 个条目";
1649
1758
  readonly 'list.filtered': "(筛选后 {count} 个)";
1650
1759
  readonly 'list.cacheCached': "已缓存";
1651
1760
  readonly 'list.cacheFresh': "刚刚拉取";
1652
1761
  readonly 'list.cacheNone': "未缓存";
1653
- readonly 'list.sourceOfficial': "官方来源";
1654
- readonly 'list.sourceThirdParty': "第三方来源";
1655
1762
  readonly 'list.download': "查看详情";
1656
1763
  readonly 'detail.title': "条目详情";
1657
1764
  readonly 'detail.downloadedAt': "下载时间:{time}";
@@ -1705,6 +1812,8 @@ declare const zh: {
1705
1812
  readonly 'myconfigs.update.hint': "版本将自动 +1,已预填原条目信息(名称可改)。";
1706
1813
  readonly 'myconfigs.update.run': "一键更新";
1707
1814
  readonly 'myconfigs.update.running': "更新中…";
1815
+ readonly 'myconfigs.update.zipHint': "更新需要新的配置包:选择新 zip 后自动校验,通过后即可一键更新。";
1816
+ readonly 'myconfigs.update.selectZip': "选择新 ZIP…";
1708
1817
  readonly 'myconfigs.result.title': "上传/更新完成";
1709
1818
  readonly 'myconfigs.result.version': "版本 {version}";
1710
1819
  readonly 'myconfigs.result.sha256': "SHA-256:{hash}";
@@ -1713,6 +1822,9 @@ declare const zh: {
1713
1822
  readonly 'myconfigs.result.openRepo': "打开仓库";
1714
1823
  readonly 'myconfigs.result.pr': "收录 PR #{number}";
1715
1824
  readonly 'myconfigs.result.openPr': "查看 PR";
1825
+ readonly 'myconfigs.result.listingPending': "已上传 ✓ 正在后台提交收录(fork + 收录 PR),稍后列表状态自动更新";
1826
+ readonly 'myconfigs.result.listingFailed': "收录失败";
1827
+ readonly 'myconfigs.result.relist': "重新提交收录";
1716
1828
  readonly 'myconfigs.list.title': "已上传";
1717
1829
  readonly 'myconfigs.list.empty': "尚未上传任何配置";
1718
1830
  readonly 'myconfigs.list.loading': "正在读取…";
@@ -1722,6 +1834,18 @@ declare const zh: {
1722
1834
  readonly 'myconfigs.item.update': "更新";
1723
1835
  readonly 'myconfigs.item.install': "装回本地";
1724
1836
  readonly 'myconfigs.item.openPr': "查看收录 PR";
1837
+ readonly 'myconfigs.delete.run': "删除";
1838
+ readonly 'myconfigs.delete.confirm': "确认删除";
1839
+ readonly 'myconfigs.delete.confirmTitle': "删除条目";
1840
+ readonly 'myconfigs.delete.confirmText': "确认删除?该操作会从配置仓库永久删除该条目的索引与文件(不可恢复)";
1841
+ readonly 'myconfigs.delete.delistStarted': "已删除本地条目,并自动提交「下架 PR」(官方市场移除需人工合并,期间市场可能仍显示该条目)";
1842
+ readonly 'myconfigs.delete.prClosed': "已删除本地条目,并关闭该条目的待审核收录 PR";
1843
+ readonly 'disclaimer.title': "免责声明";
1844
+ readonly 'disclaimer.upload.text': "你即将把配置上传到你的公开仓库(<login>/dsh-configs)并提交官方市场收录申请。\n\n上传后内容将对所有人公开可见,且需经过人工审核才能进入官方市场。请确保:\n· 内容不包含任何真实密钥 / 凭据(环境变量引用如 $VAR 是安全的);\n· 内容不包含个人隐私或本地环境信息;\n· 你有权分享这些配置。";
1845
+ readonly 'disclaimer.download.text': "你即将从公共网络市场下载配置并导入本地。\n\n下载内容属于不可信输入:未经官方审核、可能包含风险(安装插件 / 写入文件 / 修改设置)。\n· 导入前会逐项展示并校验,高风险分区默认不导入、需逐项批准;\n· 导入会先自动创建快照,失败可回滚;\n· 请核对来源与内容后再确认导入。";
1846
+ readonly 'disclaimer.install.text': "你即将把配置从你的公开仓库装回本地。\n\n该内容属于你此前上传的配置,但同样会经过安全校验与逐分区批准:\n· 高风险分区默认不导入、需逐项批准;\n· 导入前自动创建快照,失败可回滚。";
1847
+ readonly 'disclaimer.confirm': "我已了解,继续";
1848
+ readonly 'disclaimer.dontAsk': "不再提示(该操作以后不再显示免责声明)";
1725
1849
  readonly 'myconfigs.error.loadStatus': "登录状态读取失败";
1726
1850
  readonly 'myconfigs.error.loadItems': "已上传列表读取失败";
1727
1851
  readonly 'common.cancel': "取消";