@logictan/dsh-config-manager 0.1.60

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 (429) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +105 -0
  3. package/cordis.patch.yml +21 -0
  4. package/lib/adapters/agent-instructions.d.ts +13 -0
  5. package/lib/adapters/agent-instructions.js +46 -0
  6. package/lib/adapters/agent-presets.d.ts +13 -0
  7. package/lib/adapters/agent-presets.js +14 -0
  8. package/lib/adapters/credentials.d.ts +37 -0
  9. package/lib/adapters/credentials.js +122 -0
  10. package/lib/adapters/file-collection.d.ts +15 -0
  11. package/lib/adapters/file-collection.js +127 -0
  12. package/lib/adapters/index.d.ts +57 -0
  13. package/lib/adapters/index.js +55 -0
  14. package/lib/adapters/link-report.d.ts +16 -0
  15. package/lib/adapters/link-report.js +47 -0
  16. package/lib/adapters/mcp.d.ts +28 -0
  17. package/lib/adapters/mcp.js +178 -0
  18. package/lib/adapters/plugin-files.d.ts +18 -0
  19. package/lib/adapters/plugin-files.js +142 -0
  20. package/lib/adapters/plugins.d.ts +41 -0
  21. package/lib/adapters/plugins.js +603 -0
  22. package/lib/adapters/pnpm-workspace.d.ts +26 -0
  23. package/lib/adapters/pnpm-workspace.js +147 -0
  24. package/lib/adapters/prompts.d.ts +30 -0
  25. package/lib/adapters/prompts.js +231 -0
  26. package/lib/adapters/providers.d.ts +34 -0
  27. package/lib/adapters/providers.js +155 -0
  28. package/lib/adapters/self.d.ts +17 -0
  29. package/lib/adapters/self.js +71 -0
  30. package/lib/adapters/sessions.d.ts +14 -0
  31. package/lib/adapters/sessions.js +15 -0
  32. package/lib/adapters/settings.d.ts +28 -0
  33. package/lib/adapters/settings.js +165 -0
  34. package/lib/adapters/skills.d.ts +13 -0
  35. package/lib/adapters/skills.js +14 -0
  36. package/lib/adapters/test-helpers.d.ts +125 -0
  37. package/lib/adapters/test-helpers.js +236 -0
  38. package/lib/adapters/ui.d.ts +27 -0
  39. package/lib/adapters/ui.js +89 -0
  40. package/lib/adapters/workspaces.d.ts +13 -0
  41. package/lib/adapters/workspaces.js +106 -0
  42. package/lib/client.d.ts +1026 -0
  43. package/lib/client.js +10047 -0
  44. package/lib/core/analyzer.d.ts +99 -0
  45. package/lib/core/analyzer.js +934 -0
  46. package/lib/core/backup.d.ts +138 -0
  47. package/lib/core/backup.js +513 -0
  48. package/lib/core/boot-rescue.d.ts +146 -0
  49. package/lib/core/boot-rescue.js +618 -0
  50. package/lib/core/cache-cleaner.d.ts +31 -0
  51. package/lib/core/cache-cleaner.js +95 -0
  52. package/lib/core/config-lifecycle.d.ts +180 -0
  53. package/lib/core/config-lifecycle.js +481 -0
  54. package/lib/core/config-snapshot.d.ts +135 -0
  55. package/lib/core/config-snapshot.js +424 -0
  56. package/lib/core/config-state.d.ts +70 -0
  57. package/lib/core/config-state.js +177 -0
  58. package/lib/core/consult-source.d.ts +58 -0
  59. package/lib/core/consult-source.js +260 -0
  60. package/lib/core/crash-report.d.ts +84 -0
  61. package/lib/core/crash-report.js +317 -0
  62. package/lib/core/exporter.d.ts +68 -0
  63. package/lib/core/exporter.js +375 -0
  64. package/lib/core/ghost-sweep.d.ts +19 -0
  65. package/lib/core/ghost-sweep.js +52 -0
  66. package/lib/core/importer.d.ts +60 -0
  67. package/lib/core/importer.js +29 -0
  68. package/lib/core/index.d.ts +14 -0
  69. package/lib/core/index.js +14 -0
  70. package/lib/core/journal.d.ts +197 -0
  71. package/lib/core/journal.js +418 -0
  72. package/lib/core/local-plugin-host.d.ts +35 -0
  73. package/lib/core/local-plugin-host.js +120 -0
  74. package/lib/core/local-plugin-pack.d.ts +135 -0
  75. package/lib/core/local-plugin-pack.js +278 -0
  76. package/lib/core/messages.d.ts +310 -0
  77. package/lib/core/messages.js +621 -0
  78. package/lib/core/migration-consult.d.ts +117 -0
  79. package/lib/core/migration-consult.js +363 -0
  80. package/lib/core/migration-history.d.ts +153 -0
  81. package/lib/core/migration-history.js +411 -0
  82. package/lib/core/model-tools.d.ts +50 -0
  83. package/lib/core/model-tools.js +148 -0
  84. package/lib/core/msg-types.d.ts +8 -0
  85. package/lib/core/msg-types.js +6 -0
  86. package/lib/core/phase3-child-crash.d.ts +1 -0
  87. package/lib/core/phase3-child-crash.js +87 -0
  88. package/lib/core/phase3-host.d.ts +138 -0
  89. package/lib/core/phase3-host.js +359 -0
  90. package/lib/core/phase3-prod-child.d.ts +1 -0
  91. package/lib/core/phase3-prod-child.js +35 -0
  92. package/lib/core/phase4-crash-child.d.ts +1 -0
  93. package/lib/core/phase4-crash-child.js +103 -0
  94. package/lib/core/plugin-cli.d.ts +150 -0
  95. package/lib/core/plugin-cli.js +497 -0
  96. package/lib/core/reconcile.d.ts +120 -0
  97. package/lib/core/reconcile.js +389 -0
  98. package/lib/core/recovery-orchestrator.d.ts +94 -0
  99. package/lib/core/recovery-orchestrator.js +327 -0
  100. package/lib/core/restore.d.ts +162 -0
  101. package/lib/core/restore.js +703 -0
  102. package/lib/core/rollback.d.ts +12 -0
  103. package/lib/core/rollback.js +145 -0
  104. package/lib/core/run-registry.d.ts +85 -0
  105. package/lib/core/run-registry.js +157 -0
  106. package/lib/core/startup-barrier.d.ts +53 -0
  107. package/lib/core/startup-barrier.js +77 -0
  108. package/lib/core/types.d.ts +515 -0
  109. package/lib/core/types.js +27 -0
  110. package/lib/core/undo.d.ts +73 -0
  111. package/lib/core/undo.js +87 -0
  112. package/lib/core/validator.d.ts +18 -0
  113. package/lib/core/validator.js +77 -0
  114. package/lib/core/verify-recovery.d.ts +21 -0
  115. package/lib/core/verify-recovery.js +256 -0
  116. package/lib/core/watcher.d.ts +101 -0
  117. package/lib/core/watcher.js +219 -0
  118. package/lib/index.d.ts +238 -0
  119. package/lib/index.js +2764 -0
  120. package/lib/migrations/index.d.ts +29 -0
  121. package/lib/migrations/index.js +56 -0
  122. package/lib/migrations/v1-to-v2.d.ts +9 -0
  123. package/lib/migrations/v1-to-v2.js +10 -0
  124. package/lib/profiles/index.d.ts +4 -0
  125. package/lib/profiles/index.js +5 -0
  126. package/lib/profiles/profile-manager.d.ts +106 -0
  127. package/lib/profiles/profile-manager.js +543 -0
  128. package/lib/schema/config.d.ts +28 -0
  129. package/lib/schema/config.js +165 -0
  130. package/lib/schema/index.d.ts +24 -0
  131. package/lib/schema/index.js +26 -0
  132. package/lib/schema/manifest.d.ts +28 -0
  133. package/lib/schema/manifest.js +109 -0
  134. package/lib/schema/tombstones.d.ts +46 -0
  135. package/lib/schema/tombstones.js +64 -0
  136. package/lib/schema/types.d.ts +232 -0
  137. package/lib/schema/types.js +8 -0
  138. package/lib/schema/versions.d.ts +27 -0
  139. package/lib/schema/versions.js +50 -0
  140. package/lib/security/encryption.d.ts +85 -0
  141. package/lib/security/encryption.js +279 -0
  142. package/lib/security/index.d.ts +16 -0
  143. package/lib/security/index.js +17 -0
  144. package/lib/security/integrity.d.ts +30 -0
  145. package/lib/security/integrity.js +78 -0
  146. package/lib/security/redaction.d.ts +26 -0
  147. package/lib/security/redaction.js +95 -0
  148. package/lib/security/secret-scanner.d.ts +86 -0
  149. package/lib/security/secret-scanner.js +404 -0
  150. package/lib/security/vault.d.ts +59 -0
  151. package/lib/security/vault.js +151 -0
  152. package/lib/security/zip-security.d.ts +27 -0
  153. package/lib/security/zip-security.js +154 -0
  154. package/lib/sync/autosync-config.d.ts +39 -0
  155. package/lib/sync/autosync-config.js +151 -0
  156. package/lib/sync/autosync-scheduler.d.ts +139 -0
  157. package/lib/sync/autosync-scheduler.js +564 -0
  158. package/lib/sync/fs.d.ts +18 -0
  159. package/lib/sync/fs.js +49 -0
  160. package/lib/sync/git/git-transport.d.ts +100 -0
  161. package/lib/sync/git/git-transport.js +437 -0
  162. package/lib/sync/github-auth.d.ts +131 -0
  163. package/lib/sync/github-auth.js +264 -0
  164. package/lib/sync/layout.d.ts +43 -0
  165. package/lib/sync/layout.js +203 -0
  166. package/lib/sync/snapshot-json.d.ts +9 -0
  167. package/lib/sync/snapshot-json.js +107 -0
  168. package/lib/sync/sync-config.d.ts +81 -0
  169. package/lib/sync/sync-config.js +281 -0
  170. package/lib/sync/sync-engine.d.ts +269 -0
  171. package/lib/sync/sync-engine.js +591 -0
  172. package/lib/sync/sync-history.d.ts +42 -0
  173. package/lib/sync/sync-history.js +78 -0
  174. package/lib/sync/sync-selection.d.ts +29 -0
  175. package/lib/sync/sync-selection.js +127 -0
  176. package/lib/sync/sync-session.d.ts +40 -0
  177. package/lib/sync/sync-session.js +54 -0
  178. package/lib/sync/sync-state.d.ts +37 -0
  179. package/lib/sync/sync-state.js +108 -0
  180. package/lib/sync/transport.d.ts +75 -0
  181. package/lib/sync/transport.js +55 -0
  182. package/lib/sync/ui-prefs.d.ts +34 -0
  183. package/lib/sync/ui-prefs.js +109 -0
  184. package/lib/sync/webdav/webdav-transport.d.ts +77 -0
  185. package/lib/sync/webdav/webdav-transport.js +451 -0
  186. package/lib/ui/errors.d.ts +19 -0
  187. package/lib/ui/errors.js +81 -0
  188. package/lib/ui/export-flow.d.ts +82 -0
  189. package/lib/ui/export-flow.js +98 -0
  190. package/lib/ui/i18n.d.ts +289 -0
  191. package/lib/ui/i18n.js +581 -0
  192. package/lib/ui/migration-consult-view.d.ts +91 -0
  193. package/lib/ui/migration-consult-view.js +115 -0
  194. package/lib/ui/progress.d.ts +38 -0
  195. package/lib/ui/progress.js +87 -0
  196. package/lib/ui/report.d.ts +23 -0
  197. package/lib/ui/report.js +153 -0
  198. package/lib/ui/test-helpers.d.ts +69 -0
  199. package/lib/ui/test-helpers.js +154 -0
  200. package/lib/ui/types.d.ts +257 -0
  201. package/lib/ui/types.js +21 -0
  202. package/lib/utils/atomic-write.d.ts +88 -0
  203. package/lib/utils/atomic-write.js +399 -0
  204. package/lib/utils/env-lock.d.ts +393 -0
  205. package/lib/utils/env-lock.js +930 -0
  206. package/lib/utils/hashing.d.ts +17 -0
  207. package/lib/utils/hashing.js +41 -0
  208. package/lib/utils/json.d.ts +24 -0
  209. package/lib/utils/json.js +76 -0
  210. package/lib/utils/logger.d.ts +39 -0
  211. package/lib/utils/logger.js +82 -0
  212. package/lib/utils/paths.d.ts +42 -0
  213. package/lib/utils/paths.js +189 -0
  214. package/lib/utils/proxy.d.ts +69 -0
  215. package/lib/utils/proxy.js +455 -0
  216. package/lib/utils/recursive-walk.d.ts +24 -0
  217. package/lib/utils/recursive-walk.js +134 -0
  218. package/lib/utils/zip.d.ts +54 -0
  219. package/lib/utils/zip.js +285 -0
  220. package/package.json +188 -0
  221. package/src/adapters/agent-instructions.ts +48 -0
  222. package/src/adapters/agent-presets.ts +14 -0
  223. package/src/adapters/credentials.test.ts +90 -0
  224. package/src/adapters/credentials.ts +143 -0
  225. package/src/adapters/file-collection.ts +137 -0
  226. package/src/adapters/files.test.ts +353 -0
  227. package/src/adapters/index.ts +94 -0
  228. package/src/adapters/link-report.test.ts +65 -0
  229. package/src/adapters/link-report.ts +61 -0
  230. package/src/adapters/mcp.test.ts +96 -0
  231. package/src/adapters/mcp.ts +185 -0
  232. package/src/adapters/plugin-files.ts +146 -0
  233. package/src/adapters/plugins.test.ts +326 -0
  234. package/src/adapters/plugins.ts +615 -0
  235. package/src/adapters/pnpm-workspace.test.ts +87 -0
  236. package/src/adapters/pnpm-workspace.ts +150 -0
  237. package/src/adapters/prompts.test.ts +110 -0
  238. package/src/adapters/prompts.ts +230 -0
  239. package/src/adapters/providers.test.ts +126 -0
  240. package/src/adapters/providers.ts +173 -0
  241. package/src/adapters/roundtrip.test.ts +190 -0
  242. package/src/adapters/self.test.ts +92 -0
  243. package/src/adapters/self.ts +75 -0
  244. package/src/adapters/sessions.ts +15 -0
  245. package/src/adapters/settings.test.ts +100 -0
  246. package/src/adapters/settings.ts +187 -0
  247. package/src/adapters/skills.ts +14 -0
  248. package/src/adapters/test-helpers.ts +248 -0
  249. package/src/adapters/ui.test.ts +57 -0
  250. package/src/adapters/ui.ts +108 -0
  251. package/src/adapters/workspaces.test.ts +106 -0
  252. package/src/adapters/workspaces.ts +109 -0
  253. package/src/client/ConfigManagerSection.tsx +90 -0
  254. package/src/client/api.ts +66 -0
  255. package/src/client/client-types.ts +18 -0
  256. package/src/client/common/ErrorBanner.tsx +73 -0
  257. package/src/client/common/Icon.tsx +129 -0
  258. package/src/client/common/Modal.tsx +173 -0
  259. package/src/client/common/ToastViewport.tsx +73 -0
  260. package/src/client/common/toast-store.test.ts +192 -0
  261. package/src/client/common/toast-store.ts +181 -0
  262. package/src/client/common/toast-types.ts +7 -0
  263. package/src/client/common/ui.tsx +342 -0
  264. package/src/client/config-manager.module.css +2971 -0
  265. package/src/client/css-modules.d.ts +8 -0
  266. package/src/client/index.ts +65 -0
  267. package/src/client/locales.ts +56 -0
  268. package/src/client/lucide-icons.d.ts +38 -0
  269. package/src/client/run-store.test.ts +223 -0
  270. package/src/client/run-store.ts +372 -0
  271. package/src/client/sync/SyncConfirmView.tsx +379 -0
  272. package/src/client/sync/SyncHistoryView.test.ts +40 -0
  273. package/src/client/sync/SyncHistoryView.tsx +220 -0
  274. package/src/client/sync/SyncSettingsView.tsx +1535 -0
  275. package/src/client/sync/history-model.test.ts +194 -0
  276. package/src/client/sync/history-model.ts +195 -0
  277. package/src/client/sync/sync-api.test.ts +585 -0
  278. package/src/client/sync/sync-api.ts +543 -0
  279. package/src/client/sync/sync-locales.ts +416 -0
  280. package/src/client/sync/sync-push-preview.test.ts +52 -0
  281. package/src/client/sync/sync-view-v2.test.ts +213 -0
  282. package/src/client/sync/sync-view.test.ts +487 -0
  283. package/src/client/sync/sync-view.ts +759 -0
  284. package/src/core/analyzer.ts +1068 -0
  285. package/src/core/backup.ts +605 -0
  286. package/src/core/boot-rescue.test.ts +847 -0
  287. package/src/core/boot-rescue.ts +737 -0
  288. package/src/core/cache-cleaner.test.ts +169 -0
  289. package/src/core/cache-cleaner.ts +121 -0
  290. package/src/core/config-lifecycle.test.ts +727 -0
  291. package/src/core/config-lifecycle.ts +573 -0
  292. package/src/core/config-snapshot.test.ts +369 -0
  293. package/src/core/config-snapshot.ts +522 -0
  294. package/src/core/config-state.test.ts +381 -0
  295. package/src/core/config-state.ts +207 -0
  296. package/src/core/consult-source.test.ts +199 -0
  297. package/src/core/consult-source.ts +293 -0
  298. package/src/core/crash-report.test.ts +380 -0
  299. package/src/core/crash-report.ts +369 -0
  300. package/src/core/exporter.ts +417 -0
  301. package/src/core/ghost-sweep.test.ts +94 -0
  302. package/src/core/ghost-sweep.ts +67 -0
  303. package/src/core/importer.ts +83 -0
  304. package/src/core/index.ts +56 -0
  305. package/src/core/journal.test.ts +257 -0
  306. package/src/core/journal.ts +518 -0
  307. package/src/core/local-plugin-host.ts +152 -0
  308. package/src/core/local-plugin-pack.test.ts +359 -0
  309. package/src/core/local-plugin-pack.ts +363 -0
  310. package/src/core/messages.test.ts +54 -0
  311. package/src/core/messages.ts +664 -0
  312. package/src/core/migration-consult.test.ts +315 -0
  313. package/src/core/migration-consult.ts +494 -0
  314. package/src/core/migration-history.test.ts +319 -0
  315. package/src/core/migration-history.ts +484 -0
  316. package/src/core/model-tools.test.ts +190 -0
  317. package/src/core/model-tools.ts +208 -0
  318. package/src/core/msg-types.ts +10 -0
  319. package/src/core/phase3-child-crash.ts +95 -0
  320. package/src/core/phase3-host.ts +411 -0
  321. package/src/core/phase3-p1.test.ts +212 -0
  322. package/src/core/phase3-p2b-fingerprint.test.ts +189 -0
  323. package/src/core/phase3-prod-child.ts +36 -0
  324. package/src/core/phase3-production-integration.test.ts +286 -0
  325. package/src/core/phase4-crash-child.ts +101 -0
  326. package/src/core/phase4-crash-injection.test.ts +166 -0
  327. package/src/core/plugin-cli.fs.test.ts +184 -0
  328. package/src/core/plugin-cli.test.ts +137 -0
  329. package/src/core/plugin-cli.ts +563 -0
  330. package/src/core/reconcile.test.ts +392 -0
  331. package/src/core/reconcile.ts +498 -0
  332. package/src/core/recovery-orchestrator.test.ts +145 -0
  333. package/src/core/recovery-orchestrator.ts +366 -0
  334. package/src/core/restore-manage.test.ts +94 -0
  335. package/src/core/restore.ts +849 -0
  336. package/src/core/rollback.ts +151 -0
  337. package/src/core/run-progress.test.ts +237 -0
  338. package/src/core/run-registry.test.ts +232 -0
  339. package/src/core/run-registry.ts +209 -0
  340. package/src/core/smoke.test.ts +842 -0
  341. package/src/core/startup-barrier.ts +99 -0
  342. package/src/core/types.ts +542 -0
  343. package/src/core/undo.ts +116 -0
  344. package/src/core/validator.ts +84 -0
  345. package/src/core/verify-recovery.ts +265 -0
  346. package/src/core/watcher.test.ts +326 -0
  347. package/src/core/watcher.ts +263 -0
  348. package/src/index.facade.test.ts +265 -0
  349. package/src/index.sync.test.ts +217 -0
  350. package/src/index.ts +2975 -0
  351. package/src/migrations/index.ts +71 -0
  352. package/src/migrations/v1-to-v2.ts +17 -0
  353. package/src/profiles/index.ts +8 -0
  354. package/src/profiles/profile-manager.test.ts +282 -0
  355. package/src/profiles/profile-manager.ts +630 -0
  356. package/src/schema/config.ts +165 -0
  357. package/src/schema/index.ts +71 -0
  358. package/src/schema/manifest-schema.test.ts +519 -0
  359. package/src/schema/manifest.ts +124 -0
  360. package/src/schema/tombstones.test.ts +131 -0
  361. package/src/schema/tombstones.ts +89 -0
  362. package/src/schema/types.ts +245 -0
  363. package/src/schema/versions.ts +55 -0
  364. package/src/security/encryption.ts +335 -0
  365. package/src/security/index.ts +16 -0
  366. package/src/security/integrity.ts +102 -0
  367. package/src/security/redaction.ts +101 -0
  368. package/src/security/secret-scanner.ts +445 -0
  369. package/src/security/security.test.ts +1215 -0
  370. package/src/security/vault.test.ts +164 -0
  371. package/src/security/vault.ts +198 -0
  372. package/src/security/zip-security.ts +180 -0
  373. package/src/sync/autosync-config.test.ts +147 -0
  374. package/src/sync/autosync-config.ts +179 -0
  375. package/src/sync/autosync-scheduler.test.ts +490 -0
  376. package/src/sync/autosync-scheduler.ts +646 -0
  377. package/src/sync/fs.ts +48 -0
  378. package/src/sync/git/git-transport.test.ts +673 -0
  379. package/src/sync/git/git-transport.ts +491 -0
  380. package/src/sync/github-auth.test.ts +280 -0
  381. package/src/sync/github-auth.ts +356 -0
  382. package/src/sync/layout.test.ts +270 -0
  383. package/src/sync/layout.ts +222 -0
  384. package/src/sync/snapshot-json.test.ts +119 -0
  385. package/src/sync/snapshot-json.ts +128 -0
  386. package/src/sync/sync-config.test.ts +310 -0
  387. package/src/sync/sync-config.ts +299 -0
  388. package/src/sync/sync-engine.test.ts +1074 -0
  389. package/src/sync/sync-engine.ts +754 -0
  390. package/src/sync/sync-history.test.ts +116 -0
  391. package/src/sync/sync-history.ts +120 -0
  392. package/src/sync/sync-selection.test.ts +186 -0
  393. package/src/sync/sync-selection.ts +143 -0
  394. package/src/sync/sync-session.test.ts +143 -0
  395. package/src/sync/sync-session.ts +77 -0
  396. package/src/sync/sync-state.test.ts +164 -0
  397. package/src/sync/sync-state.ts +131 -0
  398. package/src/sync/transport.test.ts +111 -0
  399. package/src/sync/transport.ts +118 -0
  400. package/src/sync/ui-prefs.test.ts +152 -0
  401. package/src/sync/ui-prefs.ts +135 -0
  402. package/src/sync/webdav/webdav-transport.test.ts +871 -0
  403. package/src/sync/webdav/webdav-transport.ts +535 -0
  404. package/src/ui/errors.test.ts +47 -0
  405. package/src/ui/errors.ts +100 -0
  406. package/src/ui/export-flow.test.ts +87 -0
  407. package/src/ui/export-flow.ts +156 -0
  408. package/src/ui/i18n.ts +590 -0
  409. package/src/ui/migration-consult-view.test.ts +151 -0
  410. package/src/ui/migration-consult-view.ts +178 -0
  411. package/src/ui/progress.test.ts +47 -0
  412. package/src/ui/progress.ts +102 -0
  413. package/src/ui/report.test.ts +101 -0
  414. package/src/ui/report.ts +146 -0
  415. package/src/ui/test-helpers.ts +184 -0
  416. package/src/ui/types.ts +325 -0
  417. package/src/utils/atomic-write.test.ts +312 -0
  418. package/src/utils/atomic-write.ts +422 -0
  419. package/src/utils/env-lock.test.ts +999 -0
  420. package/src/utils/env-lock.ts +1086 -0
  421. package/src/utils/hashing.ts +53 -0
  422. package/src/utils/json.ts +77 -0
  423. package/src/utils/logger.ts +114 -0
  424. package/src/utils/paths.ts +176 -0
  425. package/src/utils/proxy.test.ts +465 -0
  426. package/src/utils/proxy.ts +493 -0
  427. package/src/utils/recursive-walk.test.ts +148 -0
  428. package/src/utils/recursive-walk.ts +145 -0
  429. package/src/utils/zip.ts +332 -0
package/lib/ui/i18n.js ADDED
@@ -0,0 +1,581 @@
1
+ /**
2
+ * 客户端展示层(src/ui/*、src/client/common/*)的渲染文案目录(zh 源语言 / en 镜像)。
3
+ *
4
+ * 与 core 的 messages.ts 分工:本目录负责「客户端纯渲染层」(ReportView / ErrorBanner /
5
+ * ProgressBar / sync-view)产生的中文文案;core 侧引擎消息已随 API 数据源翻译。
6
+ * 这些纯函数原先直接内嵌中文,现经 UiDict 注入:Client 挂载时按 ctx.locale 提供。
7
+ *
8
+ * 纪律:
9
+ * - TextKey 类型 = keyof typeof uiZh,en 缺键/多键即编译错误;
10
+ * - {param} 插值,缺参原样保留。
11
+ */
12
+ export const uiZh = {
13
+ // 通用
14
+ 'commonClose': '关闭',
15
+ 'commonCancel': '取消',
16
+ 'commonRetry': '重试',
17
+ 'commonLoading': '加载中…',
18
+ 'commonUnknownError': '未知错误',
19
+ 'commonNext': '下一步',
20
+ 'commonBack': '上一步',
21
+ 'commonDone': '完成',
22
+ // 导出
23
+ 'export.download': '下载备份文件',
24
+ 'export.running': '正在导出…',
25
+ 'export.run': '开始导出',
26
+ 'export.selectionWarnings': '以下分区为设备相关数据,跨设备导入时可能不适用:',
27
+ 'export.included': '已包含',
28
+ 'export.excluded': '未包含',
29
+ 'export.unknownSection': '未知分区:{id}',
30
+ 'export.deviceSpecific': '{label} 为设备相关数据({portability}),跨设备导入时可能不适用',
31
+ // 报告
32
+ 'report.backupCreated': '备份已创建',
33
+ 'report.importComplete': '导入完成',
34
+ 'report.importFailed': '导入失败',
35
+ 'report.tombstonedSkipped': '已按删除记录跳过 {count} 项',
36
+ 'report.included': '已包含:',
37
+ 'report.excluded': '未包含:',
38
+ 'report.security': '安全:',
39
+ 'report.apiKeysExcluded': 'API 密钥已排除:',
40
+ 'report.containsSecrets': '包含密钥:',
41
+ 'report.encrypted': '已加密:',
42
+ 'report.redacted': '{count} 个敏感字段已脱敏',
43
+ 'report.file': '文件:',
44
+ 'report.yes': '是',
45
+ 'report.yesEncrypted': '是(加密)',
46
+ 'report.no': '否',
47
+ 'report.importedRestored': '已导入/恢复',
48
+ 'report.skipped': '跳过',
49
+ 'report.needAttention': '需注意',
50
+ 'report.failed': '失败',
51
+ 'report.noChanges': '无变更',
52
+ 'report.reason': '原因',
53
+ 'report.note': '说明',
54
+ 'report.unknownReason': '未知原因',
55
+ 'report.secrets': '密钥:',
56
+ 'report.credentialsNeedEntry': '{count} 个凭据需要补录',
57
+ 'report.restartRequired': '重启 DSH 后生效:{detail}',
58
+ 'report.restartPluginsMcp': '插件/MCP 更改将在重启 DSH 后生效',
59
+ 'report.rollbackFull': '回滚:已完整恢复导入前的配置。',
60
+ 'report.rollbackPartial': '回滚部分完成。',
61
+ 'report.rollbackManual': '以下项目可能需要人工恢复:',
62
+ 'report.restored': '已恢复:{count} 项',
63
+ // 错误
64
+ 'error.notMounted': 'config-manager 服务未挂载(插件未加载):请确认 profile 中已安装 dsh-config-manager 并重启 DSH',
65
+ 'error.httpInvalidJson': 'HTTP {status}: 无效的 JSON 响应',
66
+ 'error.fallback': '操作失败',
67
+ 'error.downloadFailed': '下载失败:HTTP {status}',
68
+ 'error.exportTimeout': '导出超时({minutes} 分钟):导出过程未完成,请重试;若反复超时请检查 DSH 状态',
69
+ 'error.syncTimeout': '同步请求超时({minutes} 分钟):请检查网络与仓库可达性后重试',
70
+ 'error.recoveryTimeout': '恢复请求超时({minutes} 分钟):恢复过程未完成,请重试;若反复超时请检查 DSH 状态',
71
+ 'error.lifecycleTimeout': '灾备请求超时({minutes} 分钟):撤销/重做未完成,请重试;若反复超时请检查 DSH 状态',
72
+ 'error.settingsConflict.title': '配置已被并发修改',
73
+ 'error.settingsConflict.action': '目标 DSH 的该配置在导入期间被其他进程修改,为避免覆盖请重新导出或手动核对后再试。',
74
+ 'error.notConfirmed.title': '导入未确认',
75
+ 'error.notConfirmed.action': '请在预览页确认导入内容后重试。',
76
+ 'error.integrity.title': '备份完整性校验失败',
77
+ 'error.integrity.action': '备份文件可能已损坏或被篡改,请重新导出备份后再试。',
78
+ 'error.schema.title': '备份格式版本不受支持',
79
+ 'error.schema.action': '请升级 DSH Config Manager 或使用相同版本的备份文件。',
80
+ 'error.notFound.title': '文件或路径不存在',
81
+ 'error.notFound.action': '请检查文件路径是否正确、文件是否已被移动或删除。',
82
+ 'error.permission.title': '权限不足',
83
+ 'error.permission.action': '请检查目标目录的读写权限后重试。',
84
+ 'error.needsRestart.title': '插件代码更新需要重启生效',
85
+ 'error.needsRestart.action': '导入已完成;patch / settings 由宿主热重载即时生效,但被覆盖安装的插件包代码需重启 DSH 后才生效。',
86
+ 'error.reason': '原因',
87
+ 'error.suggestedAction': '建议操作',
88
+ 'error.item': '相关项',
89
+ // 进度
90
+ 'progress.analyzing': '正在分析配置…',
91
+ 'progress.exportingSettings': '正在导出设置…',
92
+ 'progress.scanningSecrets': '正在扫描密钥…',
93
+ 'progress.exportingPlugins': '正在导出插件…',
94
+ 'progress.creatingArchive': '正在创建归档…',
95
+ 'progress.calculatingChecksums': '正在核对文件完整性…',
96
+ 'progress.exporting': '正在导出配置…',
97
+ 'progress.validating': '正在校验备份…',
98
+ 'progress.checkingCompatibility': '正在检查兼容性…',
99
+ 'progress.creatingSnapshot': '正在创建安全快照…',
100
+ 'progress.restoringSettings': '正在恢复设置…',
101
+ 'progress.restoringPlugins': '正在恢复插件…',
102
+ 'progress.restoringMcp': '正在恢复 MCP…',
103
+ 'progress.validatingConfig': '正在校验配置…',
104
+ 'progress.rollingBack': '正在回滚…',
105
+ 'progress.executing': '正在应用配置(插件安装可能需要较长时间)…',
106
+ 'progress.done': '完成',
107
+ // 快照
108
+ 'snapshots.createdAt': '创建时间',
109
+ 'snapshots.sourceZip': '来源',
110
+ 'snapshots.status': '状态',
111
+ 'snapshots.entries': '条目',
112
+ 'snapshots.plugins': '插件',
113
+ 'snapshots.statusPending': '待处理',
114
+ 'snapshots.statusDone': '已完成',
115
+ 'snapshots.statusRolledback': '已回滚',
116
+ 'snapshots.statusUnknown': '未知',
117
+ 'snapshots.planTitle': '恢复计划预览',
118
+ 'snapshots.confirmRestore': '确认恢复?会先把当前文件备份到一个安全位置,再删除导入期间新增的插件。',
119
+ 'snapshots.execute': '执行恢复',
120
+ 'snapshots.executing': '正在恢复…',
121
+ 'snapshots.restored': '已恢复',
122
+ 'snapshots.removedPlugins': '已卸载插件',
123
+ 'snapshots.manualHints': '需人工处理',
124
+ 'snapshots.failed': '失败',
125
+ 'snapshots.skipped': '跳过',
126
+ 'snapshots.noActions': '该快照无可恢复动作(或全部跳过)。',
127
+ 'snapshots.empty': '暂无快照。导入时会自动创建安全快照。',
128
+ 'snapshots.loading': '正在加载快照…',
129
+ 'snapshots.selectHint': '选择一个快照预览其恢复计划(只读预览,不会改动任何设置):',
130
+ 'snapshots.reportTitle': '恢复报告',
131
+ // 同步区块(sync-view)
132
+ 'sync.privateRepoHint': '安全要求:同步仓库必须为私有仓库(public 仓库会公开你的配置内容)。认证 token 仅用于仓库访问,绝不写入同步文件、提交内容或日志。',
133
+ 'sync.kind.create': '新增',
134
+ 'sync.kind.update': '更新',
135
+ 'sync.kind.skip': '跳过',
136
+ 'sync.kind.conflict': '冲突',
137
+ 'sync.kind.install': '安装',
138
+ 'sync.kind.missingSecret': '缺密钥',
139
+ 'sync.kind.missingDependency': '缺依赖',
140
+ 'sync.kind.pathMapping': '路径映射',
141
+ 'sync.kind.warning': '警告',
142
+ 'sync.kind.error': '错误',
143
+ 'sync.severity.error': '错误',
144
+ 'sync.severity.warning': '警告',
145
+ 'sync.severity.info': '信息',
146
+ 'sync.pushLabel': '推送到远端',
147
+ 'sync.pullLabel': '拉取差异预览',
148
+ 'sync.pushing': '正在推送…',
149
+ 'sync.pulling': '正在拉取…',
150
+ 'sync.statusLoading': '正在读取同步状态…',
151
+ 'sync.statusUnconfigured': '尚未配置同步仓库(请填写仓库地址并推送一次以保存配置)',
152
+ 'sync.credConfigured': '凭据已配置',
153
+ 'sync.credMissing': '未配置凭据(token 将在首次推送/拉取时写入 DSH credentials)',
154
+ 'sync.lastSync': '上次同步:{time}',
155
+ 'sync.neverSynced': '尚未同步过',
156
+ 'sync.neverSyncedShort': '从未同步',
157
+ 'sync.pushFailed': '推送失败',
158
+ 'sync.pushOk': '推送成功(快照 {id})',
159
+ 'sync.pushPreviewHeadline': '将推送 {total} 个分区({changed} 个有变化)',
160
+ 'sync.pushPreviewHint': '以上为只读预览,不会写入远端。确认后点击「推送」才真正上传。',
161
+ 'sync.pushPreviewEncrypted': '加密快照:载荷将整体加密,各分区相对基线的变化不可比对。',
162
+ 'sync.pullFailed': '拉取失败',
163
+ 'sync.pullOk': '远端快照 {id} 差异预览:共 {count} 项变更',
164
+ 'sync.pullEmpty': '远端快照与本地一致(无变更)',
165
+ 'sync.previewHint': '以上为只读差异预览,不会执行导入。当前版本暂不支持一键导入;如需应用远端配置,请使用「导入恢复」向导手动导入导出的备份。',
166
+ // 一键同步(方案 A:拉取 → 逐项确认 → apply-items)
167
+ 'sync.syncTitle': '一键同步',
168
+ 'sync.syncButton': '一键同步',
169
+ 'sync.syncing': '正在同步…',
170
+ 'sync.syncHeadline': '远端快照 {id} 差异确认:共 {count} 项',
171
+ 'sync.syncEmpty': '远端快照与本地一致(无变更)',
172
+ 'sync.syncFailed': '同步失败',
173
+ 'sync.confirmAdopt': '采用远端',
174
+ 'sync.confirmSkip': '跳过',
175
+ 'sync.confirmRequired': '需要人工决策',
176
+ 'sync.needsReviewBadge': '需人工决策',
177
+ 'sync.selectSnapshot': '选择历史快照',
178
+ 'sync.latestSnapshot': '最新快照',
179
+ 'sync.noSnapshots': '远端暂无快照',
180
+ 'sync.confirmImport': '确认导入',
181
+ 'sync.cancelConfirm': '取消',
182
+ 'sync.conflictResolve': '冲突解决',
183
+ 'sync.conflictUseLocal': '用本地',
184
+ 'sync.conflictUseRemote': '用远端',
185
+ 'sync.conflictSkip': '跳过',
186
+ 'sync.conflictResolvedLocal': '已选:本地',
187
+ 'sync.conflictResolvedRemote': '已选:远端',
188
+ 'sync.conflictResolvedSkip': '已选:跳过',
189
+ 'sync.importDone': '已导入 {n} 个分区',
190
+ 'sync.importSkipped': '已跳过 {n} 项',
191
+ 'sync.importFailed': '导入失败(已整体回滚)',
192
+ 'sync.rollbackButton': '回滚到应用前',
193
+ 'sync.rollingBack': '正在回滚…',
194
+ 'sync.rollbackDone': '已回滚到应用前',
195
+ 'sync.appliedSections': '已写入',
196
+ 'sync.importWarnings': '导入告警',
197
+ // 自动同步(方案 A:宿主后台调度)
198
+ 'sync.autosyncTitle': '自动同步',
199
+ 'sync.autosyncDesc': '开启后,DSH 将按固定间隔自动执行双向同步(拉取合并 + 上传);DSH 启动时还会触发一次「自动下载合并(不上传)」以保持本地为最新。仅在无冲突且无需人工干预时才自动写入。',
200
+ 'sync.autosyncEnabled': '启用自动同步',
201
+ 'sync.autosyncInterval': '同步间隔',
202
+ 'sync.autosyncIntervalHint': 'DSH 启动时自动下载合并不上传。',
203
+ 'sync.autosyncNever': '从未运行',
204
+ 'sync.autosyncLastRun': '上次运行:{time}',
205
+ 'sync.autosyncNextIn': '下次约 {time} 后',
206
+ 'sync.autosyncSuccess': '成功',
207
+ 'sync.autosyncSkipped': '已跳过',
208
+ 'sync.autosyncFailed': '失败',
209
+ 'sync.autosyncPartial': '部分成功',
210
+ 'sync.autosyncFailCount': '连续失败 {n} 次',
211
+ 'sync.autosyncSyncing': '自动同步进行中…',
212
+ 'sync.interval.5m': '5 分钟',
213
+ 'sync.interval.15m': '15 分钟',
214
+ 'sync.interval.30m': '30 分钟',
215
+ 'sync.interval.60m': '60 分钟',
216
+ 'sync.interval.6h': '6 小时',
217
+ 'sync.interval.12h': '12 小时',
218
+ 'sync.interval.24h': '24 小时',
219
+ // 自动同步倒计时(剩余时长插值)
220
+ 'sync.duration.min': '{n} 分钟',
221
+ 'sync.duration.hour': '{n} 小时',
222
+ 'sync.duration.day': '{n} 天',
223
+ // 自动同步历史(kind=autosync 行渲染)
224
+ 'sync.hist.autosync': '自动同步',
225
+ 'sync.hist.directionPull': '下载',
226
+ 'sync.hist.directionPush': '上传',
227
+ 'sync.hist.directionBoth': '双向',
228
+ 'sync.hist.skipReasonConflict': '冲突项被跳过',
229
+ 'sync.hist.skipReasonNoRemote': '远端无快照',
230
+ 'sync.hist.skipReasonNotConfigured': '未配置仓库',
231
+ 'sync.hist.skipReasonNetwork': '网络问题',
232
+ 'sync.hist.conflictedSections': '跳过冲突分区:{sections}',
233
+ 'sync.hist.appliedSections': '应用分区:{sections}',
234
+ 'sync.hist.failedError': '错误:{error}',
235
+ 'sync.hist.notifiedAt': '已通知',
236
+ // GitHub OAuth 区块
237
+ 'sync.github.starting': '正在发起 GitHub 授权…',
238
+ 'sync.github.waitingNoCode': '请在浏览器中打开授权页面并完成授权…',
239
+ 'sync.github.waiting': '请在浏览器中打开授权页面,输入一次性代码 {code} 完成授权(自动等待确认)。',
240
+ 'sync.github.polling': '正在确认 GitHub 授权状态…',
241
+ 'sync.github.success': 'GitHub 登录成功:token 已安全写入 DSH credentials,可直接推送/拉取。',
242
+ 'sync.github.failed': 'GitHub 登录失败',
243
+ 'sync.github.defaultStatus': '通过 GitHub OAuth 设备码流程登录,token 自动写入 DSH credentials(无需手动输入)。',
244
+ 'sync.github.login': '使用 GitHub 登录',
245
+ 'sync.github.relogin': '重新登录',
246
+ 'sync.github.pollSuccess': 'GitHub 登录成功:token 已安全写入 DSH credentials。',
247
+ 'sync.github.pollDenied': 'GitHub 授权被拒绝(access_denied)。可重新发起登录,或改用下方手动 token 输入。',
248
+ 'sync.github.pollExpired': 'GitHub 授权已过期(expired_token)。请重新发起登录。',
249
+ 'sync.github.pollError': 'GitHub OAuth 错误:{detail}',
250
+ 'sync.github.unknownError': '未知错误',
251
+ // 配置市场(m-market-ui:market-view 纯渲染模型文案;React 壳文案在 config-manager-market 命名空间)
252
+ 'market.statusLoading': '正在读取市场状态…',
253
+ 'market.statusUnconfigured': '尚未添加市场(请输入公开 Git 仓库地址)',
254
+ 'market.statusConfigured': '已添加 {count} 个市场',
255
+ 'market.supplyUnofficial': '来自公共网络、非官方审核',
256
+ 'market.supplySource': '来源仓库:{url}',
257
+ 'market.supplyDownloadedAt': '下载时间:{time}',
258
+ 'market.supplyAuthor': '作者:{author}',
259
+ 'market.supplyProvenanceSource': '作者声明来源:{source}',
260
+ 'market.supplyProvenanceNote': '作者自述:{note}',
261
+ 'market.detail.sections': '包含分区:{sections}',
262
+ 'market.detail.sectionsEmpty': '未声明分区',
263
+ 'market.detail.statusValid': '校验通过',
264
+ 'market.detail.statusInvalid': '校验未通过',
265
+ // 我的配置(m-my-configs-view:一键上传 / 查看 / 更新;React 壳文案在 config-manager-market 命名空间)
266
+ 'myConfigs.autoField': '系统自动',
267
+ 'myConfigs.field.id': '条目 ID',
268
+ 'myConfigs.field.author': '作者',
269
+ 'myConfigs.field.version': '版本',
270
+ 'myConfigs.field.updatedAt': '更新时间',
271
+ 'myConfigs.status.notListed': '未收录',
272
+ 'myConfigs.status.pendingPr': 'PR 待审核',
273
+ 'myConfigs.status.listed': '已收录',
274
+ 'myConfigs.form.errorName': '名称不能为空',
275
+ // 迁移前咨询(Phase 7:migration-consult-view 纯渲染模型文案)
276
+ 'consult.dim.compatibility': '版本/平台兼容性',
277
+ 'consult.dim.integrity': '结构完整性',
278
+ 'consult.dim.sections': '分区完整性',
279
+ 'consult.dim.consistency': '一致性',
280
+ 'consult.dim.sensitive': '敏感暴露',
281
+ 'consult.dim.migratability': '可迁移性',
282
+ 'consult.recommendation.proceed': '建议:可继续',
283
+ 'consult.recommendation.review': '建议:需人工确认',
284
+ 'consult.recommendation.block': '建议:阻止执行',
285
+ 'consult.title': '迁移前咨询',
286
+ 'consult.healthScore': '健康评分 {score}',
287
+ 'consult.dryRun': '只读分析',
288
+ 'consult.reasons': '建议依据',
289
+ 'consult.willApply': '将应用',
290
+ 'consult.sections': '{count} 个分区',
291
+ 'consult.items': '{count} 项',
292
+ 'consult.conflicts': '{count} 个冲突',
293
+ 'consult.risks': '{count} 个风险',
294
+ 'consult.dimensions': '评分维度',
295
+ 'consult.loading': '正在生成咨询报告…',
296
+ };
297
+ export const uiEn = {
298
+ 'commonClose': 'Close',
299
+ 'commonCancel': 'Cancel',
300
+ 'commonRetry': 'Retry',
301
+ 'commonLoading': 'Loading…',
302
+ 'commonUnknownError': 'Unknown error',
303
+ 'commonNext': 'Next',
304
+ 'commonBack': 'Back',
305
+ 'commonDone': 'Done',
306
+ 'export.download': 'Download backup file',
307
+ 'export.running': 'Exporting…',
308
+ 'export.run': 'Start Export',
309
+ 'export.selectionWarnings': 'Device-specific sections may not apply on another machine:',
310
+ 'export.included': 'Included',
311
+ 'export.excluded': 'Excluded',
312
+ 'export.unknownSection': 'Unknown section: {id}',
313
+ 'export.deviceSpecific': '{label} is device-specific ({portability}) and may not apply on another machine',
314
+ 'report.backupCreated': 'Backup Created',
315
+ 'report.importComplete': 'Import Complete',
316
+ 'report.importFailed': 'Import Failed',
317
+ 'report.tombstonedSkipped': '{count} item(s) skipped by deletion records',
318
+ 'report.included': 'Included:',
319
+ 'report.excluded': 'Excluded:',
320
+ 'report.security': 'Security:',
321
+ 'report.apiKeysExcluded': 'API Keys excluded:',
322
+ 'report.containsSecrets': 'Contains secrets:',
323
+ 'report.encrypted': 'Encrypted:',
324
+ 'report.redacted': '{count} sensitive field(s) redacted',
325
+ 'report.file': 'File:',
326
+ 'report.yes': 'yes',
327
+ 'report.yesEncrypted': 'yes (encrypted)',
328
+ 'report.no': 'no',
329
+ 'report.importedRestored': 'imported/restored',
330
+ 'report.skipped': 'skipped',
331
+ 'report.needAttention': 'need attention',
332
+ 'report.failed': 'failed',
333
+ 'report.noChanges': 'no changes',
334
+ 'report.reason': 'Reason',
335
+ 'report.note': 'Note',
336
+ 'report.unknownReason': 'Unknown reason',
337
+ 'report.secrets': 'Secrets:',
338
+ 'report.credentialsNeedEntry': '{count} credential(s) need to be entered',
339
+ 'report.restartRequired': 'Restart DSH to apply: {detail}',
340
+ 'report.restartPluginsMcp': 'Plugin / MCP changes take effect after restarting DSH',
341
+ 'report.rollbackFull': 'Rollback: fully restored the pre-import configuration.',
342
+ 'report.rollbackPartial': 'Rollback partially completed.',
343
+ 'report.rollbackManual': 'These items may require manual recovery:',
344
+ 'report.restored': 'Restored: {count} item(s)',
345
+ 'error.notMounted': 'config-manager service is not mounted (plugin not loaded): make sure dsh-config-manager is installed in the profile and restart DSH',
346
+ 'error.httpInvalidJson': 'HTTP {status}: invalid JSON response',
347
+ 'error.fallback': 'Operation failed',
348
+ 'error.downloadFailed': 'Download failed: HTTP {status}',
349
+ 'error.exportTimeout': 'Export timed out ({minutes} min): the export did not complete, please retry; if it keeps timing out, check the DSH state',
350
+ 'error.syncTimeout': 'Sync request timed out ({minutes} min): check network and repository reachability, then retry',
351
+ 'error.recoveryTimeout': 'Recovery request timed out ({minutes} min): the recovery did not complete, please retry; if it keeps timing out, check the DSH state',
352
+ 'error.lifecycleTimeout': 'Recovery request timed out ({minutes} min): the undo/redo did not complete, please retry; if it keeps timing out, check the DSH state',
353
+ 'error.settingsConflict.title': 'Configuration changed concurrently',
354
+ '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.',
355
+ 'error.notConfirmed.title': 'Import not confirmed',
356
+ 'error.notConfirmed.action': 'Confirm the import on the preview page, then retry.',
357
+ 'error.integrity.title': 'Backup integrity check failed',
358
+ 'error.integrity.action': 'The backup may be corrupted or tampered with. Re-export the backup, then retry.',
359
+ 'error.schema.title': 'Backup format version not supported',
360
+ 'error.schema.action': 'Upgrade DSH Config Manager or use a backup from the same version.',
361
+ 'error.notFound.title': 'File or path not found',
362
+ 'error.notFound.action': 'Check that the file path is correct and the file has not been moved or deleted.',
363
+ 'error.permission.title': 'Permission denied',
364
+ 'error.permission.action': 'Check read/write permissions on the target directory, then retry.',
365
+ 'error.needsRestart.title': 'Plugin code update requires a restart',
366
+ 'error.needsRestart.action': 'The import is complete; patches and settings hot-reload immediately, but overwritten plugin package code takes effect only after restarting DSH.',
367
+ 'error.reason': 'Reason',
368
+ 'error.suggestedAction': 'Suggested action',
369
+ 'error.item': 'Item',
370
+ 'progress.analyzing': 'Analyzing configuration...',
371
+ 'progress.exportingSettings': 'Exporting settings...',
372
+ 'progress.scanningSecrets': 'Scanning secrets...',
373
+ 'progress.exportingPlugins': 'Exporting plugins...',
374
+ 'progress.creatingArchive': 'Creating archive...',
375
+ 'progress.calculatingChecksums': 'Verifying file integrity...',
376
+ 'progress.exporting': 'Exporting configuration...',
377
+ 'progress.validating': 'Validating backup...',
378
+ 'progress.checkingCompatibility': 'Checking compatibility...',
379
+ 'progress.creatingSnapshot': 'Creating safety snapshot...',
380
+ 'progress.restoringSettings': 'Restoring settings...',
381
+ 'progress.restoringPlugins': 'Restoring plugins...',
382
+ 'progress.restoringMcp': 'Restoring MCP...',
383
+ 'progress.validatingConfig': 'Validating configuration...',
384
+ 'progress.rollingBack': 'Rolling back...',
385
+ 'progress.executing': 'Applying configuration (plugin installs may take a while)...',
386
+ 'progress.done': 'Done',
387
+ 'snapshots.createdAt': 'Created',
388
+ 'snapshots.sourceZip': 'Source',
389
+ 'snapshots.status': 'Status',
390
+ 'snapshots.entries': 'Entries',
391
+ 'snapshots.plugins': 'Plugins',
392
+ 'snapshots.statusPending': 'Pending',
393
+ 'snapshots.statusDone': 'Done',
394
+ 'snapshots.statusRolledback': 'Rolled back',
395
+ 'snapshots.statusUnknown': 'Unknown',
396
+ 'snapshots.planTitle': 'Restore Plan Preview',
397
+ 'snapshots.confirmRestore': 'Confirm restore? Current files are first backed up to a safe location, then plugins added during the import are removed.',
398
+ 'snapshots.execute': 'Restore now',
399
+ 'snapshots.executing': 'Restoring…',
400
+ 'snapshots.restored': 'Restored',
401
+ 'snapshots.removedPlugins': 'Removed plugins',
402
+ 'snapshots.manualHints': 'Manual action needed',
403
+ 'snapshots.failed': 'Failed',
404
+ 'snapshots.skipped': 'Skipped',
405
+ 'snapshots.noActions': 'No restorable actions for this snapshot (or all skipped).',
406
+ 'snapshots.empty': 'No snapshots yet. A safety snapshot is created automatically on import.',
407
+ 'snapshots.loading': 'Loading snapshots…',
408
+ 'snapshots.selectHint': 'Select a snapshot to preview its restore plan (read-only preview, changes nothing):',
409
+ 'snapshots.reportTitle': 'Restore Report',
410
+ 'sync.privateRepoHint': 'Security requirement: the sync repository MUST be private (a public repo would expose your configuration). The auth token is only used for repository access and is never written into sync files, commit content, or logs.',
411
+ 'sync.kind.create': 'Create',
412
+ 'sync.kind.update': 'Update',
413
+ 'sync.kind.skip': 'Skip',
414
+ 'sync.kind.conflict': 'Conflict',
415
+ 'sync.kind.install': 'Install',
416
+ 'sync.kind.missingSecret': 'Secret',
417
+ 'sync.kind.missingDependency': 'Dependency',
418
+ 'sync.kind.pathMapping': 'Path',
419
+ 'sync.kind.warning': 'Warning',
420
+ 'sync.kind.error': 'Error',
421
+ 'sync.severity.error': 'Error',
422
+ 'sync.severity.warning': 'Warning',
423
+ 'sync.severity.info': 'Info',
424
+ 'sync.pushLabel': 'Push to remote',
425
+ 'sync.pullLabel': 'Pull diff preview',
426
+ 'sync.pushing': 'Pushing…',
427
+ 'sync.pulling': 'Pulling…',
428
+ 'sync.statusLoading': 'Reading sync status…',
429
+ 'sync.statusUnconfigured': 'No sync repository configured (fill in the repository URL and push once to save the config)',
430
+ 'sync.credConfigured': 'Credential configured',
431
+ 'sync.credMissing': 'No credential configured (token is written into DSH credentials on first push/pull)',
432
+ 'sync.lastSync': 'Last sync: {time}',
433
+ 'sync.neverSynced': 'Never synced yet',
434
+ 'sync.neverSyncedShort': 'Never synced',
435
+ 'sync.pushFailed': 'Push failed',
436
+ 'sync.pushOk': 'Push succeeded (snapshot {id})',
437
+ 'sync.pushPreviewHeadline': 'Will push {total} section(s) ({changed} changed)',
438
+ 'sync.pushPreviewHint': 'Read-only preview above — nothing is written to the remote. Click "Push" to actually upload.',
439
+ 'sync.pushPreviewEncrypted': 'Encrypted snapshot: the payload is encrypted as a whole; per-section changes vs the baseline cannot be compared.',
440
+ 'sync.pullFailed': 'Pull failed',
441
+ 'sync.pullOk': 'Remote snapshot {id} diff preview: {count} change(s)',
442
+ 'sync.pullEmpty': 'Remote snapshot matches local (no changes)',
443
+ 'sync.previewHint': 'Read-only diff preview above; nothing is imported. One-click import is not supported in this version — use the Import wizard to apply a downloaded backup if needed.',
444
+ 'sync.syncTitle': 'One-Click Sync',
445
+ 'sync.syncButton': 'One-click sync',
446
+ 'sync.syncing': 'Syncing…',
447
+ 'sync.syncHeadline': 'Remote snapshot {id} diff confirm: {count} item(s)',
448
+ 'sync.syncEmpty': 'Remote snapshot matches local (no changes)',
449
+ 'sync.syncFailed': 'Sync failed',
450
+ 'sync.confirmAdopt': 'Adopt remote',
451
+ 'sync.confirmSkip': 'Skip',
452
+ 'sync.confirmRequired': 'Needs decision',
453
+ 'sync.needsReviewBadge': 'Needs decision',
454
+ 'sync.selectSnapshot': 'Select snapshot',
455
+ 'sync.latestSnapshot': 'Latest snapshot',
456
+ 'sync.noSnapshots': 'No remote snapshots',
457
+ 'sync.confirmImport': 'Confirm import',
458
+ 'sync.cancelConfirm': 'Cancel',
459
+ 'sync.conflictResolve': 'Resolve conflict',
460
+ 'sync.conflictUseLocal': 'Use local',
461
+ 'sync.conflictUseRemote': 'Use remote',
462
+ 'sync.conflictSkip': 'Skip',
463
+ 'sync.conflictResolvedLocal': 'Chosen: local',
464
+ 'sync.conflictResolvedRemote': 'Chosen: remote',
465
+ 'sync.conflictResolvedSkip': 'Chosen: skip',
466
+ 'sync.importDone': 'Imported {n} section(s)',
467
+ 'sync.importSkipped': 'Skipped {n} item(s)',
468
+ 'sync.importFailed': 'Import failed (rolled back)',
469
+ 'sync.rollbackButton': 'Rollback',
470
+ 'sync.rollingBack': 'Rolling back…',
471
+ 'sync.rollbackDone': 'Rolled back',
472
+ 'sync.appliedSections': 'Written',
473
+ 'sync.importWarnings': 'Import warnings',
474
+ 'sync.autosyncTitle': 'Auto Sync',
475
+ 'sync.autosyncDesc': 'When enabled, DSH will run two-way sync (pull merge + push) on a fixed interval; on startup it also triggers a download-merge (no upload) to keep local up to date. Local writes happen only when there are no conflicts or manual-decision items.',
476
+ 'sync.autosyncEnabled': 'Enable auto sync',
477
+ 'sync.autosyncInterval': 'Sync interval',
478
+ 'sync.autosyncIntervalHint': 'Auto download-merge on DSH startup, no upload.',
479
+ 'sync.autosyncNever': 'Never run',
480
+ 'sync.autosyncLastRun': 'Last run: {time}',
481
+ 'sync.autosyncNextIn': 'Next in ~{time}',
482
+ 'sync.autosyncSuccess': 'Success',
483
+ 'sync.autosyncSkipped': 'Skipped',
484
+ 'sync.autosyncFailed': 'Failed',
485
+ 'sync.autosyncPartial': 'Partial',
486
+ 'sync.autosyncFailCount': '{n} consecutive failure(s)',
487
+ 'sync.autosyncSyncing': 'Auto sync running…',
488
+ 'sync.interval.5m': '5 min',
489
+ 'sync.interval.15m': '15 min',
490
+ 'sync.interval.30m': '30 min',
491
+ 'sync.interval.60m': '60 min',
492
+ 'sync.interval.6h': '6 hr',
493
+ 'sync.interval.12h': '12 hr',
494
+ 'sync.interval.24h': '24 hr',
495
+ 'sync.duration.min': '{n} min',
496
+ 'sync.duration.hour': '{n} hr',
497
+ 'sync.duration.day': '{n} day',
498
+ 'sync.hist.autosync': 'Auto Sync',
499
+ 'sync.hist.directionPull': 'Pull',
500
+ 'sync.hist.directionPush': 'Push',
501
+ 'sync.hist.directionBoth': 'Both',
502
+ 'sync.hist.skipReasonConflict': 'Conflict items skipped',
503
+ 'sync.hist.skipReasonNoRemote': 'No remote snapshot',
504
+ 'sync.hist.skipReasonNotConfigured': 'No repository configured',
505
+ 'sync.hist.skipReasonNetwork': 'Network issue',
506
+ 'sync.hist.conflictedSections': 'Skipped conflict sections: {sections}',
507
+ 'sync.hist.appliedSections': 'Applied sections: {sections}',
508
+ 'sync.hist.failedError': 'Error: {error}',
509
+ 'sync.hist.notifiedAt': 'Notified',
510
+ 'sync.github.starting': 'Starting GitHub a​u​t​h​o​r​i​z​a​t​i​o​n​…',
511
+ 'sync.github.waitingNoCode': 'Open the authorization page in your browser and complete the flow…',
512
+ 'sync.github.waiting': 'Open the authorization page in your browser, enter the one-time code {code} to finish (waiting for confirmation).',
513
+ 'sync.github.polling': 'Confirming GitHub authorization…',
514
+ 'sync.github.success': 'GitHub sign-in succeeded: token securely written into DSH credentials — you can push/pull now.',
515
+ 'sync.github.failed': 'GitHub sign-in failed',
516
+ 'sync.github.defaultStatus': 'Sign in via the GitHub OAuth device flow; the token is written into DSH credentials automatically (no manual entry).',
517
+ 'sync.github.login': 'Sign in with GitHub',
518
+ 'sync.github.relogin': 'Sign in again',
519
+ 'sync.github.pollSuccess': 'GitHub sign-in succeeded: token securely written into DSH credentials.',
520
+ 'sync.github.pollDenied': 'GitHub authorization was denied (access_denied). You can re-start the sign-in or use manual token entry below.',
521
+ 'sync.github.pollExpired': 'GitHub authorization expired (expired_token). Please re-start the sign-in.',
522
+ 'sync.github.pollError': 'GitHub OAuth error: {detail}',
523
+ 'sync.github.unknownError': 'Unknown error',
524
+ 'market.statusLoading': 'Reading market status…',
525
+ 'market.statusUnconfigured': 'No markets added (enter a public Git repository URL)',
526
+ 'market.statusConfigured': '{count} market(s) added',
527
+ 'market.supplyUnofficial': 'From the public network, not officially reviewed',
528
+ 'market.supplySource': 'Source repo: {url}',
529
+ 'market.supplyDownloadedAt': 'Downloaded at: {time}',
530
+ 'market.supplyAuthor': 'Author: {author}',
531
+ 'market.supplyProvenanceSource': 'Author-declared source: {source}',
532
+ 'market.supplyProvenanceNote': 'Author note: {note}',
533
+ 'market.detail.sections': 'Sections: {sections}',
534
+ 'market.detail.sectionsEmpty': 'No sections declared',
535
+ 'market.detail.statusValid': 'Verified',
536
+ 'market.detail.statusInvalid': 'Failed verification',
537
+ 'myConfigs.autoField': 'Auto',
538
+ 'myConfigs.field.id': 'Item ID',
539
+ 'myConfigs.field.author': 'Author',
540
+ 'myConfigs.field.version': 'Version',
541
+ 'myConfigs.field.updatedAt': 'Updated',
542
+ 'myConfigs.status.notListed': 'Not listed',
543
+ 'myConfigs.status.pendingPr': 'PR pending review',
544
+ 'myConfigs.status.listed': 'Listed',
545
+ 'myConfigs.form.errorName': 'Name is required',
546
+ 'consult.dim.compatibility': 'Version / platform compatibility',
547
+ 'consult.dim.integrity': 'Structural integrity',
548
+ 'consult.dim.sections': 'Section integrity',
549
+ 'consult.dim.consistency': 'Consistency',
550
+ 'consult.dim.sensitive': 'Sensitive exposure',
551
+ 'consult.dim.migratability': 'Migratability',
552
+ 'consult.recommendation.proceed': 'Recommendation: proceed',
553
+ 'consult.recommendation.review': 'Recommendation: review',
554
+ 'consult.recommendation.block': 'Recommendation: block',
555
+ 'consult.title': 'Migration Pre-flight Consultation',
556
+ 'consult.healthScore': 'Health score {score}',
557
+ 'consult.dryRun': 'Read-only analysis',
558
+ 'consult.reasons': 'Recommendation basis',
559
+ 'consult.willApply': 'Will apply',
560
+ 'consult.sections': '{count} section(s)',
561
+ 'consult.items': '{count} item(s)',
562
+ 'consult.conflicts': '{count} conflict(s)',
563
+ 'consult.risks': '{count} risk(s)',
564
+ 'consult.dimensions': 'Score dimensions',
565
+ 'consult.loading': 'Generating consultation report…',
566
+ };
567
+ /** 构造 翻译函数(zh 源 / en 镜像;缺 key 回退)。 */
568
+ export function makeUiT(lang) {
569
+ const dict = lang === 'en' ? uiEn : uiZh;
570
+ const fallback = lang === 'en' ? uiZh : undefined;
571
+ return (key, params) => {
572
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
573
+ const template = dict[key] ?? fallback?.[key] ?? key;
574
+ if (params === undefined)
575
+ return template;
576
+ return String(template).replace(/\{(\w+)\}/g, (match, k) => params[k] === undefined ? match : String(params[k]));
577
+ };
578
+ }
579
+ /** 缺省 UI 翻译(zh):未注入的渲染路径行为与改造前完全一致。 */
580
+ export const zhUiT = makeUiT('zh');
581
+ //# sourceMappingURL=i18n.js.map