@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
@@ -0,0 +1,81 @@
1
+ /**
2
+ * 可操作错误模型(规范 §23,m6-ui)。
3
+ *
4
+ * 绝不只有 "Something went wrong.":
5
+ * - 解析错误 → Reason + Suggested action(可操作);
6
+ * - 输出前强制脱敏(redact),Secret 永不进入 UI/日志;
7
+ * - 文案经 UiT 注入(zh 源 / en 镜像,见 i18n.ts)。
8
+ */
9
+ import { redact } from '../security/redaction.js';
10
+ import { zhUiT } from './i18n.js';
11
+ function buildErrorRules(t) {
12
+ return [
13
+ {
14
+ match: (m) => /SETTINGS_CONFLICT|revision.*conflict/i.test(m),
15
+ title: t('error.settingsConflict.title'),
16
+ suggestedAction: t('error.settingsConflict.action'),
17
+ retryable: true,
18
+ },
19
+ {
20
+ match: (m) => /ImportNotConfirmed|未确认/i.test(m),
21
+ title: t('error.notConfirmed.title'),
22
+ suggestedAction: t('error.notConfirmed.action'),
23
+ retryable: true,
24
+ },
25
+ {
26
+ match: (m) => /backup integrity|完整性校验失败|checksum/i.test(m),
27
+ title: t('error.integrity.title'),
28
+ suggestedAction: t('error.integrity.action'),
29
+ retryable: false,
30
+ },
31
+ {
32
+ match: (m) => /schema.*(不支持|超出)|无法导入|Unsupported|schemaUnsupported|无法导入/i.test(m),
33
+ title: t('error.schema.title'),
34
+ suggestedAction: t('error.schema.action'),
35
+ retryable: false,
36
+ },
37
+ {
38
+ match: (m) => /ENOENT|not found|无法读取|不存在|readFailed/i.test(m),
39
+ title: t('error.notFound.title'),
40
+ suggestedAction: t('error.notFound.action'),
41
+ retryable: true,
42
+ },
43
+ {
44
+ match: (m) => /EACCES|permission|权限/i.test(m),
45
+ title: t('error.permission.title'),
46
+ suggestedAction: t('error.permission.action'),
47
+ retryable: true,
48
+ },
49
+ {
50
+ match: (m) => /install.*(plugin|插件)|needsRestart|重启/i.test(m),
51
+ title: t('error.needsRestart.title'),
52
+ suggestedAction: t('error.needsRestart.action'),
53
+ retryable: false,
54
+ },
55
+ ];
56
+ }
57
+ /** 将任意错误转换为可操作错误(消息已脱敏,不泄漏 Secret) */
58
+ export function toActionableError(err, opts) {
59
+ const t = opts?.t ?? zhUiT;
60
+ const raw = err instanceof Error ? err.message : String(err ?? t('commonUnknownError'));
61
+ const message = redact(raw);
62
+ const rule = buildErrorRules(t).find((r) => r.match(message));
63
+ return {
64
+ title: rule?.title ?? opts?.fallbackTitle ?? t('error.fallback'),
65
+ reason: message,
66
+ suggestedAction: rule?.suggestedAction,
67
+ item: opts?.item !== undefined ? redact(opts.item) : undefined,
68
+ retryable: rule?.retryable ?? true,
69
+ };
70
+ }
71
+ /** 格式化为用户可读的多行文本(Reason / Suggested action) */
72
+ export function formatActionableError(e, t = zhUiT) {
73
+ const lines = [e.title];
74
+ lines.push(`${t('error.reason')}: ${e.reason}`);
75
+ if (e.suggestedAction)
76
+ lines.push(`${t('error.suggestedAction')}: ${e.suggestedAction}`);
77
+ if (e.item)
78
+ lines.push(`${t('error.item')}: ${e.item}`);
79
+ return lines.join('\n');
80
+ }
81
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Export 控制器(规范 §1 / §21,m6-ui)。
3
+ *
4
+ * 职责:
5
+ * - Quick Export:推荐项 = defaultIncluded 且非 deviceSpecific 的分区(设计 §11.1);
6
+ * - Custom Export:按 §1 分组目录逐项勾选(含默认关闭的可选分区 pluginFiles/sessions);
7
+ * - 进度事件:调用 core 前后按 §29 阶段文案发出(UI 不冻结);
8
+ * - 结果:返回 ExportReport 并渲染 §21 文本报告。
9
+ *
10
+ * 依赖注入:ExportPort 由宿主在挂载时接入真实 Exporter(core/exporter.ts),
11
+ * 测试注入内存 mock —— 本层零依赖 core 实现。
12
+ */
13
+ import type { Manifest, SectionId } from '../schema/types.ts';
14
+ import type { ExportOptions, ExportReport } from '../core/types.ts';
15
+ import { type ExportCategory, type ExportGroup, type ProgressListener } from './types.ts';
16
+ import { type UiT } from './i18n.ts';
17
+ /** UI → core 的导出端口(宿主注入 Exporter.export;测试注入 mock) */
18
+ export interface ExportPort {
19
+ export(options: ExportOptions): Promise<{
20
+ zipPath: string;
21
+ manifest: Manifest;
22
+ report: ExportReport;
23
+ }>;
24
+ }
25
+ /**
26
+ * 自定义导出文件名的归一化(P0-④ 体验优化):无需用户手动输入 `.zip`。
27
+ * - trim 首尾空白;空串 → ''(宿主自动命名);
28
+ * - 非空且未以 `.zip` 结尾 → 自动补全 `.zip`(大小写不敏感判定,统一补小写后缀);
29
+ * - 已以 `.zip` 结尾 → 原样返回(含首字符为字母数字的校验由调用方/宿主把关)。
30
+ */
31
+ export declare function normalizeExportFileName(raw: string): string;
32
+ /** 导出附加选项(P0-④:自定义文件名/备注——经 ExportFlow.run 透传给 host /export) */
33
+ export interface ExportExtraOptions {
34
+ /** 自定义导出文件名(.zip;缺省宿主自动命名) */
35
+ fileName?: string;
36
+ /** 导出备注(写入 exports/.backup-notes.json;缺省无) */
37
+ note?: string;
38
+ }
39
+ export interface ExportFlowOptions {
40
+ port: ExportPort;
41
+ /** 分类目录(缺省用内置目录,与 adapters 的 displayName/defaultIncluded/portability 对齐) */
42
+ categories?: ExportCategory[];
43
+ onProgress?: ProgressListener;
44
+ /** 报告渲染翻译器(zh/en,见 i18n.ts) */
45
+ t?: UiT;
46
+ }
47
+ export interface ExportRunResult {
48
+ zipPath: string;
49
+ manifest: Manifest;
50
+ report: ExportReport;
51
+ /** §21 渲染文本(report.ts) */
52
+ text: string;
53
+ }
54
+ /** 内置分类目录(与 src/adapters/* 的 displayName/defaultIncluded/portability 对齐,研究报告 §2.2) */
55
+ export declare const DEFAULT_CATEGORIES: readonly ExportCategory[];
56
+ export declare class ExportFlow {
57
+ readonly categories: readonly ExportCategory[];
58
+ private readonly port;
59
+ private readonly onProgress;
60
+ private readonly t;
61
+ constructor(opts: ExportFlowOptions);
62
+ /** Quick Export 推荐分区(defaultIncluded 且非 deviceSpecific) */
63
+ quickSelection(): SectionId[];
64
+ /** 按 §1 分组返回分类目录(Custom Export 树) */
65
+ groupedCatalog(): {
66
+ group: ExportGroup;
67
+ label: string;
68
+ note?: string;
69
+ categories: ExportCategory[];
70
+ }[];
71
+ /** 校验 Custom 勾选:未知分区 = invalid;deviceSpecific 分区给提示警告(仍可继续) */
72
+ validateSelection(selection: readonly SectionId[]): {
73
+ valid: boolean;
74
+ warnings: string[];
75
+ };
76
+ /** 执行导出:发进度事件 → 调 core → 渲染 §21 报告 */
77
+ run(mode: 'quick' | 'custom', selection: readonly SectionId[], opts?: {
78
+ includeSecrets?: boolean;
79
+ fileName?: string;
80
+ note?: string;
81
+ }): Promise<ExportRunResult>;
82
+ }
@@ -0,0 +1,98 @@
1
+ import { EXPORT_GROUPS, isQuickRecommended, } from './types.js';
2
+ import { EXPORT_STAGES, ProgressTracker } from './progress.js';
3
+ import { renderExportReport } from './report.js';
4
+ import { zhUiT } from './i18n.js';
5
+ /**
6
+ * 自定义导出文件名的归一化(P0-④ 体验优化):无需用户手动输入 `.zip`。
7
+ * - trim 首尾空白;空串 → ''(宿主自动命名);
8
+ * - 非空且未以 `.zip` 结尾 → 自动补全 `.zip`(大小写不敏感判定,统一补小写后缀);
9
+ * - 已以 `.zip` 结尾 → 原样返回(含首字符为字母数字的校验由调用方/宿主把关)。
10
+ */
11
+ export function normalizeExportFileName(raw) {
12
+ const trimmed = raw.trim();
13
+ if (trimmed === '')
14
+ return '';
15
+ return /\.zip$/i.test(trimmed) ? trimmed : `${trimmed}.zip`;
16
+ }
17
+ /** 内置分类目录(与 src/adapters/* 的 displayName/defaultIncluded/portability 对齐,研究报告 §2.2) */
18
+ export const DEFAULT_CATEGORIES = [
19
+ { id: 'settings', label: 'Settings', description: 'DSH 全局设置(namespace 分区,redacted)', defaultIncluded: true, portability: 'portable', group: 'general' },
20
+ { id: 'providers', label: 'Providers & Models', description: 'LLM Provider / Model / 默认模型 / BaseURL', defaultIncluded: true, portability: 'portable', group: 'ai' },
21
+ { id: 'plugins', label: 'Plugins', description: '已安装插件清单与启用状态(不含二进制)', defaultIncluded: true, portability: 'portable', group: 'extensions' },
22
+ { id: 'pluginFiles', label: 'Plugin Files', description: '插件自有配置文件(白名单 + plugin-config/ 目录,整文件复制)', defaultIncluded: false, portability: 'deviceSpecific', group: 'extensions' },
23
+ { id: 'self', label: 'Plugin Self Config', description: '本插件自身配置(同步/自动同步/分区选择/UI 偏好/市场;sync-*.json 等,不含凭据值)', defaultIncluded: true, portability: 'portable', group: 'extensions' },
24
+ { id: 'mcp', label: 'MCP Servers', description: 'MCP 服务器组合配置(需重启生效)', defaultIncluded: true, portability: 'platformSpecific', group: 'mcp' },
25
+ { id: 'prompts', label: 'Prompts', description: 'System Prompt / Plan Mode 提示', defaultIncluded: true, portability: 'portable', group: 'customization' },
26
+ { id: 'skills', label: 'Skills', description: '用户技能文件(~/.dsh/skills)', defaultIncluded: true, portability: 'portable', group: 'customization' },
27
+ { id: 'agentPresets', label: 'Agent Presets', description: 'Agent 预设(~/.dsh/.agent-presets)', defaultIncluded: true, portability: 'portable', group: 'customization' },
28
+ { id: 'agentInstructions', label: 'Agent Instructions', description: '全局指令文件(~/.dsh/AGENTS.md,注入每个会话)', defaultIncluded: true, portability: 'portable', group: 'customization' },
29
+ { id: 'workspaces', label: 'Workspaces', description: '工作区记录(含绝对路径,需路径映射)', defaultIncluded: true, portability: 'platformSpecific', group: 'workspace' },
30
+ { id: 'ui', label: 'UI Preferences', description: 'UI 类 settings namespace(localStorage 项仅说明)', defaultIncluded: true, portability: 'portable', group: 'ui' },
31
+ { id: 'credentialsStatus', label: 'Credentials Status', description: '凭据状态(configured 标记,永不导出值)', defaultIncluded: true, portability: 'deviceSpecific', group: 'optional', sensitive: true },
32
+ { id: 'sessions', label: 'Sessions', description: '历史会话(默认关闭,含敏感内容)', defaultIncluded: false, portability: 'deviceSpecific', group: 'optional' },
33
+ ];
34
+ export class ExportFlow {
35
+ categories;
36
+ port;
37
+ onProgress;
38
+ t;
39
+ constructor(opts) {
40
+ this.port = opts.port;
41
+ this.categories = opts.categories ?? DEFAULT_CATEGORIES;
42
+ this.onProgress = opts.onProgress;
43
+ this.t = opts.t ?? zhUiT;
44
+ }
45
+ /** Quick Export 推荐分区(defaultIncluded 且非 deviceSpecific) */
46
+ quickSelection() {
47
+ return this.categories.filter(isQuickRecommended).map((c) => c.id);
48
+ }
49
+ /** 按 §1 分组返回分类目录(Custom Export 树) */
50
+ groupedCatalog() {
51
+ return EXPORT_GROUPS.map((g) => ({
52
+ group: g.id,
53
+ label: g.label,
54
+ note: g.note,
55
+ categories: this.categories.filter((c) => c.group === g.id),
56
+ }));
57
+ }
58
+ /** 校验 Custom 勾选:未知分区 = invalid;deviceSpecific 分区给提示警告(仍可继续) */
59
+ validateSelection(selection) {
60
+ const warnings = [];
61
+ let valid = true;
62
+ const known = new Set(this.categories.map((c) => c.id));
63
+ for (const id of selection) {
64
+ if (!known.has(id)) {
65
+ warnings.push(`未知分区:${id}`);
66
+ valid = false;
67
+ }
68
+ }
69
+ for (const c of this.categories) {
70
+ if (selection.includes(c.id) && c.portability === 'deviceSpecific') {
71
+ warnings.push(`${c.label} 为设备相关数据(${c.portability}),跨设备导入时可能不适用`);
72
+ }
73
+ }
74
+ return { valid, warnings };
75
+ }
76
+ /** 执行导出:发进度事件 → 调 core → 渲染 §21 报告 */
77
+ async run(mode, selection, opts = {}) {
78
+ const tracker = new ProgressTracker(EXPORT_STAGES, this.onProgress);
79
+ const only = mode === 'quick' ? this.quickSelection() : [...selection];
80
+ if (mode === 'quick' && opts.includeSecrets === undefined)
81
+ opts = { ...opts, includeSecrets: false };
82
+ // 导出工作全部发生在 port.export() 的单次请求内,客户端无法逐阶段上报真实进度。
83
+ // 旧实现把整串阶段一次性 emit,请求期间 UI 会静止在假的「Calculating checksums... 86%」,
84
+ // 任何慢请求/挂起请求看起来都像卡死。改为:请求期间只发一个不带 step/total 的 in-flight
85
+ // 阶段(ProgressBar 显示不定态动画),完成后发 done(100%)。超时/失败由 api 层显式抛出。
86
+ tracker.emit('exporting');
87
+ const result = await this.port.export({
88
+ includeSecrets: opts.includeSecrets ?? false,
89
+ only,
90
+ // P0-④:透传自定义文件名/备注(非敏感;host 做安全校验与持久化)
91
+ ...(opts.fileName !== undefined && opts.fileName !== '' ? { outPath: opts.fileName } : {}),
92
+ ...(opts.note !== undefined ? { note: opts.note } : {}),
93
+ });
94
+ tracker.emit('done');
95
+ return { ...result, text: renderExportReport(result.report, this.t) };
96
+ }
97
+ }
98
+ //# sourceMappingURL=export-flow.js.map
@@ -0,0 +1,289 @@
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 declare const uiZh: {
13
+ readonly commonClose: '关闭';
14
+ readonly commonCancel: '取消';
15
+ readonly commonRetry: '重试';
16
+ readonly commonLoading: '加载中…';
17
+ readonly commonUnknownError: '未知错误';
18
+ readonly commonNext: '下一步';
19
+ readonly commonBack: '上一步';
20
+ readonly commonDone: '完成';
21
+ readonly 'export.download': '下载备份文件';
22
+ readonly 'export.running': '正在导出…';
23
+ readonly 'export.run': '开始导出';
24
+ readonly 'export.selectionWarnings': '以下分区为设备相关数据,跨设备导入时可能不适用:';
25
+ readonly 'export.included': '已包含';
26
+ readonly 'export.excluded': '未包含';
27
+ readonly 'export.unknownSection': '未知分区:{id}';
28
+ readonly 'export.deviceSpecific': '{label} 为设备相关数据({portability}),跨设备导入时可能不适用';
29
+ readonly 'report.backupCreated': '备份已创建';
30
+ readonly 'report.importComplete': '导入完成';
31
+ readonly 'report.importFailed': '导入失败';
32
+ readonly 'report.tombstonedSkipped': '已按删除记录跳过 {count} 项';
33
+ readonly 'report.included': '已包含:';
34
+ readonly 'report.excluded': '未包含:';
35
+ readonly 'report.security': '安全:';
36
+ readonly 'report.apiKeysExcluded': 'API 密钥已排除:';
37
+ readonly 'report.containsSecrets': '包含密钥:';
38
+ readonly 'report.encrypted': '已加密:';
39
+ readonly 'report.redacted': '{count} 个敏感字段已脱敏';
40
+ readonly 'report.file': '文件:';
41
+ readonly 'report.yes': '是';
42
+ readonly 'report.yesEncrypted': '是(加密)';
43
+ readonly 'report.no': '否';
44
+ readonly 'report.importedRestored': '已导入/恢复';
45
+ readonly 'report.skipped': '跳过';
46
+ readonly 'report.needAttention': '需注意';
47
+ readonly 'report.failed': '失败';
48
+ readonly 'report.noChanges': '无变更';
49
+ readonly 'report.reason': '原因';
50
+ readonly 'report.note': '说明';
51
+ readonly 'report.unknownReason': '未知原因';
52
+ readonly 'report.secrets': '密钥:';
53
+ readonly 'report.credentialsNeedEntry': '{count} 个凭据需要补录';
54
+ readonly 'report.restartRequired': '重启 DSH 后生效:{detail}';
55
+ readonly 'report.restartPluginsMcp': '插件/MCP 更改将在重启 DSH 后生效';
56
+ readonly 'report.rollbackFull': '回滚:已完整恢复导入前的配置。';
57
+ readonly 'report.rollbackPartial': '回滚部分完成。';
58
+ readonly 'report.rollbackManual': '以下项目可能需要人工恢复:';
59
+ readonly 'report.restored': '已恢复:{count} 项';
60
+ readonly 'error.notMounted': 'config-manager 服务未挂载(插件未加载):请确认 profile 中已安装 dsh-config-manager 并重启 DSH';
61
+ readonly 'error.httpInvalidJson': 'HTTP {status}: 无效的 JSON 响应';
62
+ readonly 'error.fallback': '操作失败';
63
+ readonly 'error.downloadFailed': '下载失败:HTTP {status}';
64
+ readonly 'error.exportTimeout': '导出超时({minutes} 分钟):导出过程未完成,请重试;若反复超时请检查 DSH 状态';
65
+ readonly 'error.syncTimeout': '同步请求超时({minutes} 分钟):请检查网络与仓库可达性后重试';
66
+ readonly 'error.recoveryTimeout': '恢复请求超时({minutes} 分钟):恢复过程未完成,请重试;若反复超时请检查 DSH 状态';
67
+ readonly 'error.lifecycleTimeout': '灾备请求超时({minutes} 分钟):撤销/重做未完成,请重试;若反复超时请检查 DSH 状态';
68
+ readonly 'error.settingsConflict.title': '配置已被并发修改';
69
+ readonly 'error.settingsConflict.action': '目标 DSH 的该配置在导入期间被其他进程修改,为避免覆盖请重新导出或手动核对后再试。';
70
+ readonly 'error.notConfirmed.title': '导入未确认';
71
+ readonly 'error.notConfirmed.action': '请在预览页确认导入内容后重试。';
72
+ readonly 'error.integrity.title': '备份完整性校验失败';
73
+ readonly 'error.integrity.action': '备份文件可能已损坏或被篡改,请重新导出备份后再试。';
74
+ readonly 'error.schema.title': '备份格式版本不受支持';
75
+ readonly 'error.schema.action': '请升级 DSH Config Manager 或使用相同版本的备份文件。';
76
+ readonly 'error.notFound.title': '文件或路径不存在';
77
+ readonly 'error.notFound.action': '请检查文件路径是否正确、文件是否已被移动或删除。';
78
+ readonly 'error.permission.title': '权限不足';
79
+ readonly 'error.permission.action': '请检查目标目录的读写权限后重试。';
80
+ readonly 'error.needsRestart.title': '插件代码更新需要重启生效';
81
+ readonly 'error.needsRestart.action': '导入已完成;patch / settings 由宿主热重载即时生效,但被覆盖安装的插件包代码需重启 DSH 后才生效。';
82
+ readonly 'error.reason': '原因';
83
+ readonly 'error.suggestedAction': '建议操作';
84
+ readonly 'error.item': '相关项';
85
+ readonly 'progress.analyzing': '正在分析配置…';
86
+ readonly 'progress.exportingSettings': '正在导出设置…';
87
+ readonly 'progress.scanningSecrets': '正在扫描密钥…';
88
+ readonly 'progress.exportingPlugins': '正在导出插件…';
89
+ readonly 'progress.creatingArchive': '正在创建归档…';
90
+ readonly 'progress.calculatingChecksums': '正在核对文件完整性…';
91
+ readonly 'progress.exporting': '正在导出配置…';
92
+ readonly 'progress.validating': '正在校验备份…';
93
+ readonly 'progress.checkingCompatibility': '正在检查兼容性…';
94
+ readonly 'progress.creatingSnapshot': '正在创建安全快照…';
95
+ readonly 'progress.restoringSettings': '正在恢复设置…';
96
+ readonly 'progress.restoringPlugins': '正在恢复插件…';
97
+ readonly 'progress.restoringMcp': '正在恢复 MCP…';
98
+ readonly 'progress.validatingConfig': '正在校验配置…';
99
+ readonly 'progress.rollingBack': '正在回滚…';
100
+ readonly 'progress.executing': '正在应用配置(插件安装可能需要较长时间)…';
101
+ readonly 'progress.done': '完成';
102
+ readonly 'snapshots.createdAt': '创建时间';
103
+ readonly 'snapshots.sourceZip': '来源';
104
+ readonly 'snapshots.status': '状态';
105
+ readonly 'snapshots.entries': '条目';
106
+ readonly 'snapshots.plugins': '插件';
107
+ readonly 'snapshots.statusPending': '待处理';
108
+ readonly 'snapshots.statusDone': '已完成';
109
+ readonly 'snapshots.statusRolledback': '已回滚';
110
+ readonly 'snapshots.statusUnknown': '未知';
111
+ readonly 'snapshots.planTitle': '恢复计划预览';
112
+ readonly 'snapshots.confirmRestore': '确认恢复?会先把当前文件备份到一个安全位置,再删除导入期间新增的插件。';
113
+ readonly 'snapshots.execute': '执行恢复';
114
+ readonly 'snapshots.executing': '正在恢复…';
115
+ readonly 'snapshots.restored': '已恢复';
116
+ readonly 'snapshots.removedPlugins': '已卸载插件';
117
+ readonly 'snapshots.manualHints': '需人工处理';
118
+ readonly 'snapshots.failed': '失败';
119
+ readonly 'snapshots.skipped': '跳过';
120
+ readonly 'snapshots.noActions': '该快照无可恢复动作(或全部跳过)。';
121
+ readonly 'snapshots.empty': '暂无快照。导入时会自动创建安全快照。';
122
+ readonly 'snapshots.loading': '正在加载快照…';
123
+ readonly 'snapshots.selectHint': '选择一个快照预览其恢复计划(只读预览,不会改动任何设置):';
124
+ readonly 'snapshots.reportTitle': '恢复报告';
125
+ readonly 'sync.privateRepoHint': '安全要求:同步仓库必须为私有仓库(public 仓库会公开你的配置内容)。认证 token 仅用于仓库访问,绝不写入同步文件、提交内容或日志。';
126
+ readonly 'sync.kind.create': '新增';
127
+ readonly 'sync.kind.update': '更新';
128
+ readonly 'sync.kind.skip': '跳过';
129
+ readonly 'sync.kind.conflict': '冲突';
130
+ readonly 'sync.kind.install': '安装';
131
+ readonly 'sync.kind.missingSecret': '缺密钥';
132
+ readonly 'sync.kind.missingDependency': '缺依赖';
133
+ readonly 'sync.kind.pathMapping': '路径映射';
134
+ readonly 'sync.kind.warning': '警告';
135
+ readonly 'sync.kind.error': '错误';
136
+ readonly 'sync.severity.error': '错误';
137
+ readonly 'sync.severity.warning': '警告';
138
+ readonly 'sync.severity.info': '信息';
139
+ readonly 'sync.pushLabel': '推送到远端';
140
+ readonly 'sync.pullLabel': '拉取差异预览';
141
+ readonly 'sync.pushing': '正在推送…';
142
+ readonly 'sync.pulling': '正在拉取…';
143
+ readonly 'sync.statusLoading': '正在读取同步状态…';
144
+ readonly 'sync.statusUnconfigured': '尚未配置同步仓库(请填写仓库地址并推送一次以保存配置)';
145
+ readonly 'sync.credConfigured': '凭据已配置';
146
+ readonly 'sync.credMissing': '未配置凭据(token 将在首次推送/拉取时写入 DSH credentials)';
147
+ readonly 'sync.lastSync': '上次同步:{time}';
148
+ readonly 'sync.neverSynced': '尚未同步过';
149
+ readonly 'sync.neverSyncedShort': '从未同步';
150
+ readonly 'sync.pushFailed': '推送失败';
151
+ readonly 'sync.pushOk': '推送成功(快照 {id})';
152
+ readonly 'sync.pushPreviewHeadline': '将推送 {total} 个分区({changed} 个有变化)';
153
+ readonly 'sync.pushPreviewHint': '以上为只读预览,不会写入远端。确认后点击「推送」才真正上传。';
154
+ readonly 'sync.pushPreviewEncrypted': '加密快照:载荷将整体加密,各分区相对基线的变化不可比对。';
155
+ readonly 'sync.pullFailed': '拉取失败';
156
+ readonly 'sync.pullOk': '远端快照 {id} 差异预览:共 {count} 项变更';
157
+ readonly 'sync.pullEmpty': '远端快照与本地一致(无变更)';
158
+ readonly 'sync.previewHint': '以上为只读差异预览,不会执行导入。当前版本暂不支持一键导入;如需应用远端配置,请使用「导入恢复」向导手动导入导出的备份。';
159
+ readonly 'sync.syncTitle': '一键同步';
160
+ readonly 'sync.syncButton': '一键同步';
161
+ readonly 'sync.syncing': '正在同步…';
162
+ readonly 'sync.syncHeadline': '远端快照 {id} 差异确认:共 {count} 项';
163
+ readonly 'sync.syncEmpty': '远端快照与本地一致(无变更)';
164
+ readonly 'sync.syncFailed': '同步失败';
165
+ readonly 'sync.confirmAdopt': '采用远端';
166
+ readonly 'sync.confirmSkip': '跳过';
167
+ readonly 'sync.confirmRequired': '需要人工决策';
168
+ readonly 'sync.needsReviewBadge': '需人工决策';
169
+ readonly 'sync.selectSnapshot': '选择历史快照';
170
+ readonly 'sync.latestSnapshot': '最新快照';
171
+ readonly 'sync.noSnapshots': '远端暂无快照';
172
+ readonly 'sync.confirmImport': '确认导入';
173
+ readonly 'sync.cancelConfirm': '取消';
174
+ readonly 'sync.conflictResolve': '冲突解决';
175
+ readonly 'sync.conflictUseLocal': '用本地';
176
+ readonly 'sync.conflictUseRemote': '用远端';
177
+ readonly 'sync.conflictSkip': '跳过';
178
+ readonly 'sync.conflictResolvedLocal': '已选:本地';
179
+ readonly 'sync.conflictResolvedRemote': '已选:远端';
180
+ readonly 'sync.conflictResolvedSkip': '已选:跳过';
181
+ readonly 'sync.importDone': '已导入 {n} 个分区';
182
+ readonly 'sync.importSkipped': '已跳过 {n} 项';
183
+ readonly 'sync.importFailed': '导入失败(已整体回滚)';
184
+ readonly 'sync.rollbackButton': '回滚到应用前';
185
+ readonly 'sync.rollingBack': '正在回滚…';
186
+ readonly 'sync.rollbackDone': '已回滚到应用前';
187
+ readonly 'sync.appliedSections': '已写入';
188
+ readonly 'sync.importWarnings': '导入告警';
189
+ readonly 'sync.autosyncTitle': '自动同步';
190
+ readonly 'sync.autosyncDesc': '开启后,DSH 将按固定间隔自动执行双向同步(拉取合并 + 上传);DSH 启动时还会触发一次「自动下载合并(不上传)」以保持本地为最新。仅在无冲突且无需人工干预时才自动写入。';
191
+ readonly 'sync.autosyncEnabled': '启用自动同步';
192
+ readonly 'sync.autosyncInterval': '同步间隔';
193
+ readonly 'sync.autosyncIntervalHint': 'DSH 启动时自动下载合并不上传。';
194
+ readonly 'sync.autosyncNever': '从未运行';
195
+ readonly 'sync.autosyncLastRun': '上次运行:{time}';
196
+ readonly 'sync.autosyncNextIn': '下次约 {time} 后';
197
+ readonly 'sync.autosyncSuccess': '成功';
198
+ readonly 'sync.autosyncSkipped': '已跳过';
199
+ readonly 'sync.autosyncFailed': '失败';
200
+ readonly 'sync.autosyncPartial': '部分成功';
201
+ readonly 'sync.autosyncFailCount': '连续失败 {n} 次';
202
+ readonly 'sync.autosyncSyncing': '自动同步进行中…';
203
+ readonly 'sync.interval.5m': '5 分钟';
204
+ readonly 'sync.interval.15m': '15 分钟';
205
+ readonly 'sync.interval.30m': '30 分钟';
206
+ readonly 'sync.interval.60m': '60 分钟';
207
+ readonly 'sync.interval.6h': '6 小时';
208
+ readonly 'sync.interval.12h': '12 小时';
209
+ readonly 'sync.interval.24h': '24 小时';
210
+ readonly 'sync.duration.min': '{n} 分钟';
211
+ readonly 'sync.duration.hour': '{n} 小时';
212
+ readonly 'sync.duration.day': '{n} 天';
213
+ readonly 'sync.hist.autosync': '自动同步';
214
+ readonly 'sync.hist.directionPull': '下载';
215
+ readonly 'sync.hist.directionPush': '上传';
216
+ readonly 'sync.hist.directionBoth': '双向';
217
+ readonly 'sync.hist.skipReasonConflict': '冲突项被跳过';
218
+ readonly 'sync.hist.skipReasonNoRemote': '远端无快照';
219
+ readonly 'sync.hist.skipReasonNotConfigured': '未配置仓库';
220
+ readonly 'sync.hist.skipReasonNetwork': '网络问题';
221
+ readonly 'sync.hist.conflictedSections': '跳过冲突分区:{sections}';
222
+ readonly 'sync.hist.appliedSections': '应用分区:{sections}';
223
+ readonly 'sync.hist.failedError': '错误:{error}';
224
+ readonly 'sync.hist.notifiedAt': '已通知';
225
+ readonly 'sync.github.starting': '正在发起 GitHub 授权…';
226
+ readonly 'sync.github.waitingNoCode': '请在浏览器中打开授权页面并完成授权…';
227
+ readonly 'sync.github.waiting': '请在浏览器中打开授权页面,输入一次性代码 {code} 完成授权(自动等待确认)。';
228
+ readonly 'sync.github.polling': '正在确认 GitHub 授权状态…';
229
+ readonly 'sync.github.success': 'GitHub 登录成功:token 已安全写入 DSH credentials,可直接推送/拉取。';
230
+ readonly 'sync.github.failed': 'GitHub 登录失败';
231
+ readonly 'sync.github.defaultStatus': '通过 GitHub OAuth 设备码流程登录,token 自动写入 DSH credentials(无需手动输入)。';
232
+ readonly 'sync.github.login': '使用 GitHub 登录';
233
+ readonly 'sync.github.relogin': '重新登录';
234
+ readonly 'sync.github.pollSuccess': 'GitHub 登录成功:token 已安全写入 DSH credentials。';
235
+ readonly 'sync.github.pollDenied': 'GitHub 授权被拒绝(access_denied)。可重新发起登录,或改用下方手动 token 输入。';
236
+ readonly 'sync.github.pollExpired': 'GitHub 授权已过期(expired_token)。请重新发起登录。';
237
+ readonly 'sync.github.pollError': 'GitHub OAuth 错误:{detail}';
238
+ readonly 'sync.github.unknownError': '未知错误';
239
+ readonly 'market.statusLoading': '正在读取市场状态…';
240
+ readonly 'market.statusUnconfigured': '尚未添加市场(请输入公开 Git 仓库地址)';
241
+ readonly 'market.statusConfigured': '已添加 {count} 个市场';
242
+ readonly 'market.supplyUnofficial': '来自公共网络、非官方审核';
243
+ readonly 'market.supplySource': '来源仓库:{url}';
244
+ readonly 'market.supplyDownloadedAt': '下载时间:{time}';
245
+ readonly 'market.supplyAuthor': '作者:{author}';
246
+ readonly 'market.supplyProvenanceSource': '作者声明来源:{source}';
247
+ readonly 'market.supplyProvenanceNote': '作者自述:{note}';
248
+ readonly 'market.detail.sections': '包含分区:{sections}';
249
+ readonly 'market.detail.sectionsEmpty': '未声明分区';
250
+ readonly 'market.detail.statusValid': '校验通过';
251
+ readonly 'market.detail.statusInvalid': '校验未通过';
252
+ readonly 'myConfigs.autoField': '系统自动';
253
+ readonly 'myConfigs.field.id': '条目 ID';
254
+ readonly 'myConfigs.field.author': '作者';
255
+ readonly 'myConfigs.field.version': '版本';
256
+ readonly 'myConfigs.field.updatedAt': '更新时间';
257
+ readonly 'myConfigs.status.notListed': '未收录';
258
+ readonly 'myConfigs.status.pendingPr': 'PR 待审核';
259
+ readonly 'myConfigs.status.listed': '已收录';
260
+ readonly 'myConfigs.form.errorName': '名称不能为空';
261
+ readonly 'consult.dim.compatibility': '版本/平台兼容性';
262
+ readonly 'consult.dim.integrity': '结构完整性';
263
+ readonly 'consult.dim.sections': '分区完整性';
264
+ readonly 'consult.dim.consistency': '一致性';
265
+ readonly 'consult.dim.sensitive': '敏感暴露';
266
+ readonly 'consult.dim.migratability': '可迁移性';
267
+ readonly 'consult.recommendation.proceed': '建议:可继续';
268
+ readonly 'consult.recommendation.review': '建议:需人工确认';
269
+ readonly 'consult.recommendation.block': '建议:阻止执行';
270
+ readonly 'consult.title': '迁移前咨询';
271
+ readonly 'consult.healthScore': '健康评分 {score}';
272
+ readonly 'consult.dryRun': '只读分析';
273
+ readonly 'consult.reasons': '建议依据';
274
+ readonly 'consult.willApply': '将应用';
275
+ readonly 'consult.sections': '{count} 个分区';
276
+ readonly 'consult.items': '{count} 项';
277
+ readonly 'consult.conflicts': '{count} 个冲突';
278
+ readonly 'consult.risks': '{count} 个风险';
279
+ readonly 'consult.dimensions': '评分维度';
280
+ readonly 'consult.loading': '正在生成咨询报告…';
281
+ };
282
+ export type UiTextKey = keyof typeof uiZh;
283
+ export declare const uiEn: Record<UiTextKey, string>;
284
+ /** UI 翻译函数:key → 当前语言文案({param} 插值;未知键回退 zh/键名)。 */
285
+ export type UiT = (key: UiTextKey, params?: Record<string, string | number>) => string;
286
+ /** 构造 翻译函数(zh 源 / en 镜像;缺 key 回退)。 */
287
+ export declare function makeUiT(lang: 'zh' | 'en'): UiT;
288
+ /** 缺省 UI 翻译(zh):未注入的渲染路径行为与改造前完全一致。 */
289
+ export declare const zhUiT: UiT;