dsh-config-manager 0.1.71 → 0.1.73

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 (596) hide show
  1. package/README.md +149 -98
  2. package/README.zh-CN.md +245 -88
  3. package/lib/adapters/agent-instructions.js +1 -1
  4. package/lib/adapters/file-collection.js +1 -1
  5. package/lib/adapters/index.d.ts +2 -1
  6. package/lib/adapters/index.js +6 -1
  7. package/lib/adapters/link-report.d.ts +1 -0
  8. package/lib/adapters/link-report.js +27 -3
  9. package/lib/adapters/messages.d.ts +21 -0
  10. package/lib/adapters/messages.js +57 -0
  11. package/lib/adapters/plugin-data.d.ts +114 -0
  12. package/lib/adapters/plugin-data.js +309 -0
  13. package/lib/adapters/plugin-files.js +3 -2
  14. package/lib/adapters/plugins.js +4 -3
  15. package/lib/adapters/prompts.d.ts +1 -0
  16. package/lib/adapters/prompts.js +7 -1
  17. package/lib/adapters/self.d.ts +8 -2
  18. package/lib/adapters/self.js +3 -2
  19. package/lib/adapters/sessions.d.ts +1 -0
  20. package/lib/adapters/sessions.js +4 -2
  21. package/lib/adapters/test-helpers.d.ts +9 -0
  22. package/lib/adapters/test-helpers.js +14 -0
  23. package/lib/adapters/ui.d.ts +2 -2
  24. package/lib/adapters/ui.js +25 -25
  25. package/lib/adapters/workspaces.d.ts +1 -0
  26. package/lib/adapters/workspaces.js +7 -3
  27. package/lib/cli/actions.d.ts +9 -1
  28. package/lib/cli/actions.js +5 -2
  29. package/lib/cli/help.js +23 -10
  30. package/lib/cli/index.d.ts +23 -0
  31. package/lib/cli/index.js +90 -32
  32. package/lib/cli/sessions-inspect.js +3 -1
  33. package/lib/cli/sessions-repair.js +25 -6
  34. package/lib/cli/web/page.d.ts +12 -0
  35. package/lib/cli/web/page.js +21 -12
  36. package/lib/cli/web/routes.js +2 -2
  37. package/lib/cli/web/server.js +4 -4
  38. package/lib/client.d.ts +1442 -494
  39. package/lib/client.js +15326 -8520
  40. package/lib/core/analyzer.d.ts +11 -2
  41. package/lib/core/analyzer.js +31 -8
  42. package/lib/core/backup-plan.d.ts +10 -0
  43. package/lib/core/backup-plan.js +51 -20
  44. package/lib/core/backup-verify.js +24 -23
  45. package/lib/core/backup.d.ts +25 -1
  46. package/lib/core/backup.js +99 -28
  47. package/lib/core/boot-rescue.js +4 -3
  48. package/lib/core/boot-safety.js +2 -1
  49. package/lib/core/command-rollback.d.ts +182 -0
  50. package/lib/core/command-rollback.js +293 -0
  51. package/lib/core/consult-source.js +7 -6
  52. package/lib/core/disk-usage.d.ts +74 -10
  53. package/lib/core/disk-usage.js +67 -4
  54. package/lib/core/engine-locale.d.ts +87 -0
  55. package/lib/core/engine-locale.js +125 -0
  56. package/lib/core/exporter.js +3 -3
  57. package/lib/core/fork-reconcile.d.ts +128 -0
  58. package/lib/core/fork-reconcile.js +150 -0
  59. package/lib/core/journal.js +6 -5
  60. package/lib/core/local-plugin-host.js +3 -2
  61. package/lib/core/local-plugin-pack.js +11 -6
  62. package/lib/core/messages-core.d.ts +294 -0
  63. package/lib/core/messages-core.js +619 -0
  64. package/lib/core/messages.d.ts +61 -2
  65. package/lib/core/messages.js +118 -13
  66. package/lib/core/migration-consult.js +21 -20
  67. package/lib/core/migration-history.js +19 -5
  68. package/lib/core/model-tools.d.ts +0 -22
  69. package/lib/core/model-tools.js +50 -27
  70. package/lib/core/phase3-host.js +30 -5
  71. package/lib/core/plugin-cli.js +18 -19
  72. package/lib/core/plugin-data-registry.d.ts +124 -0
  73. package/lib/core/plugin-data-registry.js +198 -0
  74. package/lib/core/reconcile.d.ts +2 -14
  75. package/lib/core/reconcile.js +87 -17
  76. package/lib/core/recovery-orchestrator.js +19 -18
  77. package/lib/core/reinstall.d.ts +4 -0
  78. package/lib/core/reinstall.js +26 -21
  79. package/lib/core/restore.js +20 -17
  80. package/lib/core/rollback-gate.d.ts +33 -0
  81. package/lib/core/rollback-gate.js +57 -0
  82. package/lib/core/rollback-ignore-rules.d.ts +31 -0
  83. package/lib/core/rollback-ignore-rules.js +140 -0
  84. package/lib/core/rollback-ledger.d.ts +248 -0
  85. package/lib/core/rollback-ledger.js +1282 -0
  86. package/lib/core/rollback-point.d.ts +1391 -0
  87. package/lib/core/rollback-point.js +3503 -0
  88. package/lib/core/rollback.js +6 -4
  89. package/lib/core/run-registry.js +6 -5
  90. package/lib/core/session-health.d.ts +15 -0
  91. package/lib/core/session-meta.d.ts +42 -2
  92. package/lib/core/session-meta.js +140 -1
  93. package/lib/core/session-title.d.ts +28 -0
  94. package/lib/core/session-title.js +185 -0
  95. package/lib/core/startup-barrier.d.ts +24 -0
  96. package/lib/core/startup-barrier.js +22 -0
  97. package/lib/core/transaction-coordinator.js +4 -3
  98. package/lib/core/types.d.ts +37 -1
  99. package/lib/core/validator.js +5 -4
  100. package/lib/core/verify-recovery.js +31 -30
  101. package/lib/foreign/bundle.js +3 -2
  102. package/lib/foreign/continue.js +2 -1
  103. package/lib/foreign/crush.js +2 -1
  104. package/lib/foreign/gemini.js +2 -1
  105. package/lib/foreign/goose.js +2 -1
  106. package/lib/foreign/kilocode.js +2 -1
  107. package/lib/foreign/kimi.js +2 -1
  108. package/lib/foreign/messages.d.ts +15 -0
  109. package/lib/foreign/messages.js +40 -0
  110. package/lib/foreign/mimocode.js +2 -1
  111. package/lib/foreign/openclaw.js +2 -1
  112. package/lib/foreign/opencode.js +2 -1
  113. package/lib/foreign/pi.js +2 -1
  114. package/lib/foreign/qoder.js +2 -1
  115. package/lib/foreign/qwen.js +2 -1
  116. package/lib/foreign/registry.d.ts +1 -1
  117. package/lib/foreign/registry.js +8 -7
  118. package/lib/foreign/teleagent.js +2 -1
  119. package/lib/foreign/workbuddy.js +2 -1
  120. package/lib/foreign/zcode.js +2 -1
  121. package/lib/foreign/zed.js +2 -1
  122. package/lib/index.d.ts +227 -7
  123. package/lib/index.js +799 -54
  124. package/lib/market/git-file-writer.js +20 -19
  125. package/lib/market/github-repos.js +35 -19
  126. package/lib/market/index-parser.js +31 -30
  127. package/lib/market/messages-market.d.ts +138 -0
  128. package/lib/market/messages-market.js +305 -0
  129. package/lib/market/my-repo.d.ts +2 -2
  130. package/lib/market/my-repo.js +32 -29
  131. package/lib/market/prepare.js +18 -15
  132. package/lib/market/security.js +20 -19
  133. package/lib/market/types.js +2 -1
  134. package/lib/market/url.js +2 -1
  135. package/lib/migrations/index.js +6 -5
  136. package/lib/migrations/messages-migrations.d.ts +32 -0
  137. package/lib/migrations/messages-migrations.js +58 -0
  138. package/lib/profiles/dsh-profile-launcher.js +2 -1
  139. package/lib/profiles/dsh-profile-runtime.js +2 -1
  140. package/lib/profiles/messages.d.ts +7 -0
  141. package/lib/profiles/messages.js +27 -0
  142. package/lib/routes/backup.js +18 -2
  143. package/lib/routes/import.js +3 -3
  144. package/lib/routes/index.d.ts +1 -1
  145. package/lib/routes/kit.d.ts +3 -2
  146. package/lib/routes/kit.js +6 -1
  147. package/lib/routes/market.js +1 -1
  148. package/lib/routes/messages.d.ts +43 -0
  149. package/lib/routes/messages.js +102 -0
  150. package/lib/routes/prefs.js +26 -3
  151. package/lib/routes/profiles.js +12 -6
  152. package/lib/routes/recovery.d.ts +21 -0
  153. package/lib/routes/recovery.js +478 -94
  154. package/lib/routes/snapshots.js +51 -4
  155. package/lib/routes/sync.js +79 -17
  156. package/lib/schema/config.d.ts +11 -1
  157. package/lib/schema/config.js +52 -20
  158. package/lib/schema/index.d.ts +8 -6
  159. package/lib/schema/index.js +8 -6
  160. package/lib/schema/manifest.js +19 -18
  161. package/lib/schema/messages.d.ts +47 -0
  162. package/lib/schema/messages.js +110 -0
  163. package/lib/schema/section-registry.d.ts +42 -15
  164. package/lib/schema/section-registry.js +67 -32
  165. package/lib/schema/types.d.ts +1 -1
  166. package/lib/schema/versions.js +6 -5
  167. package/lib/security/encryption.js +16 -15
  168. package/lib/security/integrity.js +8 -7
  169. package/lib/security/messages.d.ts +30 -0
  170. package/lib/security/messages.js +77 -0
  171. package/lib/security/redaction.js +12 -0
  172. package/lib/security/secret-scanner.js +16 -13
  173. package/lib/security/vault.js +2 -1
  174. package/lib/security/zip-security.js +4 -3
  175. package/lib/sync/ancestor.js +2 -1
  176. package/lib/sync/autosync-config.d.ts +11 -0
  177. package/lib/sync/autosync-config.js +12 -0
  178. package/lib/sync/autosync-scheduler.d.ts +11 -1
  179. package/lib/sync/autosync-scheduler.js +115 -76
  180. package/lib/sync/backup-files.js +3 -2
  181. package/lib/sync/backup-scheduler.js +6 -5
  182. package/lib/sync/blob-store.js +2 -1
  183. package/lib/sync/git/git-transport.d.ts +55 -0
  184. package/lib/sync/git/git-transport.js +152 -2
  185. package/lib/sync/github-auth.js +10 -9
  186. package/lib/sync/layout.js +13 -12
  187. package/lib/sync/messages.d.ts +63 -0
  188. package/lib/sync/messages.js +149 -0
  189. package/lib/sync/review-queue.js +6 -5
  190. package/lib/sync/s3/messages.d.ts +7 -0
  191. package/lib/sync/s3/messages.js +16 -0
  192. package/lib/sync/s3/s3-providers.d.ts +4 -1
  193. package/lib/sync/s3/s3-providers.js +5 -5
  194. package/lib/sync/s3/s3-transport.js +1 -1
  195. package/lib/sync/s3/sigv4.js +2 -1
  196. package/lib/sync/snapshot-crypto.js +6 -5
  197. package/lib/sync/snapshot-json.js +3 -2
  198. package/lib/sync/sync-engine.d.ts +58 -22
  199. package/lib/sync/sync-engine.js +119 -48
  200. package/lib/sync/sync-history.js +7 -6
  201. package/lib/sync/sync-selection.d.ts +15 -4
  202. package/lib/sync/sync-selection.js +17 -5
  203. package/lib/sync/ui-prefs.d.ts +22 -0
  204. package/lib/sync/ui-prefs.js +28 -0
  205. package/lib/sync/webdav/webdav-transport.d.ts +1 -0
  206. package/lib/sync/webdav/webdav-transport.js +4 -1
  207. package/lib/ui/artifact-view.js +4 -3
  208. package/lib/ui/commands.d.ts +1 -1
  209. package/lib/ui/commands.js +10 -0
  210. package/lib/ui/diff-view.d.ts +10 -0
  211. package/lib/ui/diff-view.js +17 -0
  212. package/lib/ui/disk-usage-view.d.ts +33 -4
  213. package/lib/ui/disk-usage-view.js +29 -1
  214. package/lib/ui/errors.d.ts +1 -1
  215. package/lib/ui/errors.js +4 -3
  216. package/lib/ui/export-flow.js +26 -20
  217. package/lib/ui/foreign-view.d.ts +5 -1
  218. package/lib/ui/foreign-view.js +26 -2
  219. package/lib/ui/i18n.d.ts +68 -1
  220. package/lib/ui/i18n.js +120 -2
  221. package/lib/ui/import-wizard.d.ts +7 -0
  222. package/lib/ui/import-wizard.js +13 -10
  223. package/lib/ui/progress.d.ts +2 -2
  224. package/lib/ui/progress.js +1 -2
  225. package/lib/ui/report.d.ts +5 -5
  226. package/lib/ui/report.js +6 -6
  227. package/lib/ui/rollback-view.d.ts +815 -0
  228. package/lib/ui/rollback-view.js +738 -0
  229. package/lib/ui/selection-model.d.ts +41 -0
  230. package/lib/ui/selection-model.js +30 -0
  231. package/lib/ui/session-inventory-view.d.ts +97 -3
  232. package/lib/ui/session-inventory-view.js +76 -2
  233. package/lib/ui/session-issue-labels.d.ts +43 -0
  234. package/lib/ui/session-issue-labels.js +48 -0
  235. package/lib/ui/sync-settings-view.d.ts +33 -0
  236. package/lib/ui/sync-settings-view.js +40 -0
  237. package/lib/ui/test-helpers.js +2 -1
  238. package/lib/ui/types.d.ts +8 -3
  239. package/lib/ui/types.js +1 -1
  240. package/lib/utils/atomic-write.js +6 -5
  241. package/lib/utils/bundle-scan.d.ts +11 -1
  242. package/lib/utils/bundle-scan.js +12 -1
  243. package/lib/utils/env-lock.d.ts +10 -0
  244. package/lib/utils/env-lock.js +73 -46
  245. package/lib/utils/json.js +6 -5
  246. package/lib/utils/messages-utils.d.ts +96 -0
  247. package/lib/utils/messages-utils.js +216 -0
  248. package/lib/utils/proxy.js +18 -5
  249. package/lib/utils/recursive-walk.d.ts +22 -0
  250. package/lib/utils/recursive-walk.js +75 -1
  251. package/lib/utils/session-log-repair.js +10 -9
  252. package/lib/utils/zip.js +27 -26
  253. package/package.json +12 -2
  254. package/src/adapters/agent-instructions.ts +1 -1
  255. package/src/adapters/file-collection.test.ts +1 -0
  256. package/src/adapters/file-collection.ts +1 -1
  257. package/src/adapters/files.test.ts +27 -0
  258. package/src/adapters/index.ts +6 -1
  259. package/src/adapters/link-report.test.ts +22 -2
  260. package/src/adapters/link-report.ts +29 -4
  261. package/src/adapters/messages.ts +61 -0
  262. package/src/adapters/plugin-data.test.ts +225 -0
  263. package/src/adapters/plugin-data.ts +351 -0
  264. package/src/adapters/plugin-files.ts +3 -2
  265. package/src/adapters/plugins.ts +4 -3
  266. package/src/adapters/prompts.ts +7 -1
  267. package/src/adapters/self.test.ts +26 -0
  268. package/src/adapters/self.ts +10 -3
  269. package/src/adapters/sessions.ts +4 -2
  270. package/src/adapters/settings.test.ts +38 -1
  271. package/src/adapters/test-helpers.ts +15 -0
  272. package/src/adapters/ui.test.ts +2 -2
  273. package/src/adapters/ui.ts +27 -26
  274. package/src/adapters/workspaces.ts +7 -3
  275. package/src/cli/actions.test.ts +28 -0
  276. package/src/cli/actions.ts +11 -2
  277. package/src/cli/help.ts +23 -10
  278. package/src/cli/index-guards.test.ts +193 -0
  279. package/src/cli/index.ts +106 -31
  280. package/src/cli/sessions-inspect.test.ts +15 -1
  281. package/src/cli/sessions-inspect.ts +3 -1
  282. package/src/cli/sessions-repair.test.ts +84 -0
  283. package/src/cli/sessions-repair.ts +33 -7
  284. package/src/cli/web/console-route-parity.test.ts +115 -0
  285. package/src/cli/web/page.ts +23 -12
  286. package/src/cli/web/routes.ts +2 -1
  287. package/src/cli/web/server.ts +4 -4
  288. package/src/cli/web/web.test.ts +2 -2
  289. package/src/client/ConfigManagerSection.tsx +30 -2
  290. package/src/client/about/AboutPanel.tsx +2 -2
  291. package/src/client/about/PluginUpdateDialog.tsx +1 -1
  292. package/src/client/about/ReleaseNotesDialog.tsx +2 -2
  293. package/src/client/about/about-view.test.ts +13 -3
  294. package/src/client/about/about-view.ts +10 -6
  295. package/src/client/about/release-notes-view.test.ts +14 -4
  296. package/src/client/about/release-notes-view.ts +4 -2
  297. package/src/client/api.ts +18 -6
  298. package/src/client/chat/ChatEntryView.tsx +411 -0
  299. package/src/client/chat/RollbackDiffTab.tsx +108 -0
  300. package/src/client/chat/RollbackFileIcon.tsx +96 -0
  301. package/src/client/chat/RollbackReviewDialog.tsx +607 -0
  302. package/src/client/chat/chat-entry-view.test.ts +1174 -0
  303. package/src/client/chat/chat-entry-view.ts +758 -0
  304. package/src/client/chat/chat-locales.ts +152 -0
  305. package/src/client/chat/chat-node-registration.ts +64 -0
  306. package/src/client/chat/chat-point-window.ts +183 -0
  307. package/src/client/chat/chat-slots.ts +107 -0
  308. package/src/client/chat/rollback-diff-tab.test.ts +105 -0
  309. package/src/client/chat/rollback-diff-tab.ts +174 -0
  310. package/src/client/chat/rollback-entry-view.test.ts +1469 -0
  311. package/src/client/chat/rollback-entry-view.ts +946 -0
  312. package/src/client/chat/sidebar-slots.ts +59 -0
  313. package/src/client/common/ConfirmDialog.tsx +7 -3
  314. package/src/client/common/ContentPicker.tsx +48 -10
  315. package/src/client/common/DiffTable.tsx +133 -0
  316. package/src/client/common/ErrorBanner.tsx +4 -4
  317. package/src/client/common/Icon.tsx +2 -0
  318. package/src/client/common/Modal.tsx +8 -1
  319. package/src/client/common/ProgressBar.tsx +8 -2
  320. package/src/client/common/ReportView.tsx +4 -4
  321. package/src/client/common/RunsCenter.tsx +1 -0
  322. package/src/client/common/client-route-parity.test.ts +84 -0
  323. package/src/client/common/info-hint-guard.test.ts +46 -13
  324. package/src/client/common/picker-lazy-units.test.ts +42 -0
  325. package/src/client/common/plan-text-redaction.test.ts +17 -6
  326. package/src/client/common/progress-view-edge.test.ts +8 -7
  327. package/src/client/common/progress-view.test.ts +9 -9
  328. package/src/client/common/progress-view.ts +2 -2
  329. package/src/client/common/routes.ts +38 -0
  330. package/src/client/common/section-labels.test.ts +1 -0
  331. package/src/client/common/section-labels.ts +2 -0
  332. package/src/client/common/ui.tsx +73 -10
  333. package/src/client/config-manager.module.css +1109 -31
  334. package/src/client/css-scale-guard.test.ts +30 -0
  335. package/src/client/environment/EnvironmentPanel.tsx +11 -4
  336. package/src/client/environment/maintenance/DiskUsageCard.tsx +23 -2
  337. package/src/client/export/ExportView.tsx +13 -8
  338. package/src/client/history/HistoryPanel.tsx +4 -3
  339. package/src/client/history/history-api.ts +2 -2
  340. package/src/client/history/history-locales.ts +5 -1
  341. package/src/client/home/HomePanel.tsx +29 -8
  342. package/src/client/import/ForeignImportView.tsx +4 -5
  343. package/src/client/import/ImportWizardView.tsx +5 -3
  344. package/src/client/import/import-wizard-split.test.ts +3 -1
  345. package/src/client/import/import-wizard-steps.tsx +9 -9
  346. package/src/client/index.ts +232 -3
  347. package/src/client/library/LibraryActions.tsx +32 -7
  348. package/src/client/library/LibraryPanel.tsx +23 -3
  349. package/src/client/library/RestorePlanView.tsx +9 -66
  350. package/src/client/locales.ts +62 -9
  351. package/src/client/lucide-icons.d.ts +1 -0
  352. package/src/client/market/MarketPanel.tsx +13 -2
  353. package/src/client/market/MyConfigsView.tsx +5 -4
  354. package/src/client/market/MyConfigsWizard.tsx +10 -8
  355. package/src/client/market/market-api.test.ts +9 -8
  356. package/src/client/market/market-api.ts +2 -2
  357. package/src/client/market/market-locales.ts +3 -0
  358. package/src/client/market/market-view.test.ts +6 -6
  359. package/src/client/market/market-view.ts +3 -3
  360. package/src/client/market/my-configs-api.ts +2 -2
  361. package/src/client/market/my-configs-view.test.ts +23 -22
  362. package/src/client/market/my-configs-view.ts +8 -8
  363. package/src/client/recovery/IncompleteCopiesSection.tsx +2 -1
  364. package/src/client/recovery/RecoveryPanel.tsx +442 -283
  365. package/src/client/recovery/RollbackCard.tsx +859 -0
  366. package/src/client/recovery/RollbackDiffPane.tsx +69 -0
  367. package/src/client/recovery/RollbackFileChanges.tsx +163 -0
  368. package/src/client/recovery/incident-api.ts +2 -2
  369. package/src/client/recovery/recovery-api.ts +144 -6
  370. package/src/client/recovery/recovery-locales.test.ts +299 -0
  371. package/src/client/recovery/recovery-locales.ts +520 -149
  372. package/src/client/recovery/recovery-panel-layout.test.ts +132 -2
  373. package/src/client/recovery/rollback-enabled.ts +41 -0
  374. package/src/client/recovery/rollback-file-changes.test.ts +114 -0
  375. package/src/client/recovery/session-dialog-mount.test.ts +54 -0
  376. package/src/client/run-store.ts +84 -21
  377. package/src/client/sync/AutosyncCard.tsx +25 -1
  378. package/src/client/sync/ChannelClearConfirmDialog.tsx +6 -3
  379. package/src/client/sync/ChannelConfigDialog.tsx +10 -10
  380. package/src/client/sync/DecryptPasswordCard.tsx +2 -2
  381. package/src/client/sync/SecurityOptionsCard.tsx +27 -17
  382. package/src/client/sync/SyncChannelEntryCard.tsx +14 -2
  383. package/src/client/sync/SyncConfirmView.tsx +46 -8
  384. package/src/client/sync/SyncLogList.tsx +1 -1
  385. package/src/client/sync/SyncPanel.tsx +31 -23
  386. package/src/client/sync/SyncRepositoryPicker.tsx +3 -5
  387. package/src/client/sync/SyncSectionPickerDialog.tsx +11 -2
  388. package/src/client/sync/SyncSettingsView.test.ts +20 -1
  389. package/src/client/sync/UnreadableSnapshotsBanner.tsx +1 -1
  390. package/src/client/sync/WorkDirCard.tsx +112 -0
  391. package/src/client/sync/history-model.test.ts +42 -9
  392. package/src/client/sync/history-model.ts +30 -15
  393. package/src/client/sync/sync-api.test.ts +57 -33
  394. package/src/client/sync/sync-api.ts +80 -6
  395. package/src/client/sync/sync-locales.ts +104 -3
  396. package/src/client/sync/sync-view-v2.test.ts +65 -13
  397. package/src/client/sync/sync-view.test.ts +107 -52
  398. package/src/client/sync/sync-view.ts +124 -41
  399. package/src/core/analyzer.ts +31 -9
  400. package/src/core/backup-plan.test.ts +48 -5
  401. package/src/core/backup-plan.ts +51 -20
  402. package/src/core/backup-verify.ts +24 -23
  403. package/src/core/backup.test.ts +76 -0
  404. package/src/core/backup.ts +105 -29
  405. package/src/core/boot-rescue.ts +4 -3
  406. package/src/core/boot-safety.ts +2 -1
  407. package/src/core/command-rollback.test.ts +536 -0
  408. package/src/core/command-rollback.ts +406 -0
  409. package/src/core/consult-source.ts +7 -6
  410. package/src/core/disk-usage.test.ts +257 -1
  411. package/src/core/disk-usage.ts +134 -14
  412. package/src/core/engine-locale.test.ts +593 -0
  413. package/src/core/engine-locale.ts +175 -0
  414. package/src/core/exporter.ts +3 -3
  415. package/src/core/fork-reconcile.test.ts +279 -0
  416. package/src/core/fork-reconcile.ts +234 -0
  417. package/src/core/journal.ts +6 -5
  418. package/src/core/local-plugin-host.ts +3 -2
  419. package/src/core/local-plugin-pack.ts +11 -6
  420. package/src/core/messages-core.ts +661 -0
  421. package/src/core/messages.ts +125 -17
  422. package/src/core/migration-consult.ts +21 -20
  423. package/src/core/migration-history.ts +19 -5
  424. package/src/core/model-tools.ts +28 -27
  425. package/src/core/phase3-host.ts +21 -5
  426. package/src/core/phase3-p2b-fingerprint.test.ts +22 -0
  427. package/src/core/plugin-cli.ts +18 -19
  428. package/src/core/plugin-data-registry.test.ts +113 -0
  429. package/src/core/plugin-data-registry.ts +261 -0
  430. package/src/core/reconcile.test.ts +117 -0
  431. package/src/core/reconcile.ts +85 -17
  432. package/src/core/recovery-orchestrator.ts +19 -18
  433. package/src/core/reinstall.ts +26 -21
  434. package/src/core/restore.ts +20 -17
  435. package/src/core/rollback-file-diff.test.ts +159 -0
  436. package/src/core/rollback-gate.test.ts +66 -0
  437. package/src/core/rollback-gate.ts +61 -0
  438. package/src/core/rollback-ignore-rules.ts +126 -0
  439. package/src/core/rollback-ledger.test.ts +655 -0
  440. package/src/core/rollback-ledger.ts +1314 -0
  441. package/src/core/rollback-point.test.ts +2853 -0
  442. package/src/core/rollback-point.ts +4340 -0
  443. package/src/core/rollback.ts +5 -3
  444. package/src/core/run-registry.ts +6 -5
  445. package/src/core/session-health.ts +15 -0
  446. package/src/core/session-meta.test.ts +117 -1
  447. package/src/core/session-meta.ts +149 -2
  448. package/src/core/session-title.test.ts +127 -0
  449. package/src/core/session-title.ts +189 -0
  450. package/src/core/startup-barrier.test.ts +69 -0
  451. package/src/core/startup-barrier.ts +27 -0
  452. package/src/core/transaction-coordinator.ts +4 -3
  453. package/src/core/types.ts +37 -1
  454. package/src/core/validator.ts +5 -4
  455. package/src/core/verify-recovery.ts +31 -30
  456. package/src/foreign/bundle.ts +3 -2
  457. package/src/foreign/continue.ts +2 -1
  458. package/src/foreign/crush.ts +2 -1
  459. package/src/foreign/file-budget.test.ts +2 -0
  460. package/src/foreign/gemini.ts +2 -1
  461. package/src/foreign/goose.ts +2 -1
  462. package/src/foreign/kilocode.ts +2 -1
  463. package/src/foreign/kimi.ts +2 -1
  464. package/src/foreign/messages.ts +44 -0
  465. package/src/foreign/mimocode.ts +2 -1
  466. package/src/foreign/openclaw.ts +2 -1
  467. package/src/foreign/opencode.ts +2 -1
  468. package/src/foreign/pi.ts +2 -1
  469. package/src/foreign/qoder.ts +2 -1
  470. package/src/foreign/qwen.ts +2 -1
  471. package/src/foreign/registry.test.ts +1 -1
  472. package/src/foreign/registry.ts +8 -7
  473. package/src/foreign/teleagent.ts +2 -1
  474. package/src/foreign/workbuddy.ts +2 -1
  475. package/src/foreign/zcode.ts +2 -1
  476. package/src/foreign/zed.ts +2 -1
  477. package/src/index.facade.test.ts +340 -1
  478. package/src/index.ts +876 -57
  479. package/src/market/git-file-writer.ts +20 -19
  480. package/src/market/github-repos.test.ts +23 -0
  481. package/src/market/github-repos.ts +37 -19
  482. package/src/market/index-parser.ts +31 -30
  483. package/src/market/messages-market.ts +325 -0
  484. package/src/market/my-repo.ts +32 -29
  485. package/src/market/prepare.ts +18 -15
  486. package/src/market/security.ts +20 -19
  487. package/src/market/types.ts +2 -1
  488. package/src/market/url.ts +2 -1
  489. package/src/migrations/index.ts +6 -5
  490. package/src/migrations/messages-migrations.ts +59 -0
  491. package/src/profiles/dsh-profile-launcher.ts +2 -1
  492. package/src/profiles/dsh-profile-runtime.ts +2 -1
  493. package/src/profiles/messages.ts +31 -0
  494. package/src/routes/backup.ts +18 -2
  495. package/src/routes/import.ts +3 -3
  496. package/src/routes/index.ts +1 -1
  497. package/src/routes/kit.ts +9 -3
  498. package/src/routes/market.ts +1 -1
  499. package/src/routes/messages.ts +106 -0
  500. package/src/routes/prefs.ts +31 -2
  501. package/src/routes/profiles.ts +12 -6
  502. package/src/routes/recovery.test.ts +405 -1
  503. package/src/routes/recovery.ts +477 -94
  504. package/src/routes/snapshots.ts +51 -4
  505. package/src/routes/sync.ts +82 -17
  506. package/src/schema/config.ts +53 -20
  507. package/src/schema/index.ts +7 -5
  508. package/src/schema/manifest-schema.test.ts +4 -4
  509. package/src/schema/manifest.ts +19 -18
  510. package/src/schema/messages.ts +120 -0
  511. package/src/schema/registry.test.ts +28 -7
  512. package/src/schema/section-registry.ts +96 -42
  513. package/src/schema/types.ts +2 -1
  514. package/src/schema/versions.ts +6 -5
  515. package/src/security/encryption.ts +16 -15
  516. package/src/security/integrity.ts +8 -7
  517. package/src/security/messages.ts +87 -0
  518. package/src/security/redaction.test.ts +17 -1
  519. package/src/security/redaction.ts +13 -0
  520. package/src/security/secret-scanner.ts +19 -12
  521. package/src/security/security.test.ts +47 -0
  522. package/src/security/vault.ts +2 -1
  523. package/src/security/zip-security.ts +4 -3
  524. package/src/sync/ancestor.ts +2 -1
  525. package/src/sync/autosync-config.ts +21 -0
  526. package/src/sync/autosync-scheduler.test.ts +63 -7
  527. package/src/sync/autosync-scheduler.ts +118 -78
  528. package/src/sync/backup-files.ts +3 -2
  529. package/src/sync/backup-scheduler.ts +6 -5
  530. package/src/sync/blob-store.ts +2 -1
  531. package/src/sync/git/git-transport.test.ts +170 -8
  532. package/src/sync/git/git-transport.ts +176 -2
  533. package/src/sync/github-auth.ts +10 -9
  534. package/src/sync/layout.ts +13 -12
  535. package/src/sync/messages.ts +153 -0
  536. package/src/sync/review-queue.ts +6 -5
  537. package/src/sync/s3/messages.ts +16 -0
  538. package/src/sync/s3/s3-providers.ts +9 -6
  539. package/src/sync/s3/s3-transport.ts +1 -1
  540. package/src/sync/s3/sigv4.ts +3 -1
  541. package/src/sync/snapshot-crypto.ts +6 -5
  542. package/src/sync/snapshot-json.ts +3 -2
  543. package/src/sync/sync-credentials.test.ts +119 -0
  544. package/src/sync/sync-engine-download-tombstone.test.ts +1 -1
  545. package/src/sync/sync-engine.test.ts +226 -8
  546. package/src/sync/sync-engine.ts +154 -52
  547. package/src/sync/sync-history.ts +7 -6
  548. package/src/sync/sync-selection.test.ts +12 -2
  549. package/src/sync/sync-selection.ts +18 -5
  550. package/src/sync/transport.test.ts +1 -0
  551. package/src/sync/ui-prefs.test.ts +44 -1
  552. package/src/sync/ui-prefs.ts +39 -0
  553. package/src/sync/webdav/webdav-transport.ts +4 -1
  554. package/src/ui/artifact-view.ts +4 -3
  555. package/src/ui/commands.test.ts +1 -0
  556. package/src/ui/commands.ts +11 -1
  557. package/src/ui/diff-view.test.ts +9 -1
  558. package/src/ui/diff-view.ts +22 -0
  559. package/src/ui/disk-usage-view.test.ts +113 -6
  560. package/src/ui/disk-usage-view.ts +63 -7
  561. package/src/ui/errors.ts +4 -3
  562. package/src/ui/export-flow.ts +26 -20
  563. package/src/ui/foreign-view.test.ts +43 -0
  564. package/src/ui/foreign-view.ts +30 -3
  565. package/src/ui/i18n.ts +131 -2
  566. package/src/ui/import-wizard.ts +18 -10
  567. package/src/ui/progress.ts +2 -2
  568. package/src/ui/report.ts +7 -6
  569. package/src/ui/rollback-view.test.ts +836 -0
  570. package/src/ui/rollback-view.ts +1405 -0
  571. package/src/ui/selection-model.test.ts +33 -1
  572. package/src/ui/selection-model.ts +53 -0
  573. package/src/ui/session-inventory-view.test.ts +109 -0
  574. package/src/ui/session-inventory-view.ts +138 -3
  575. package/src/ui/session-issue-labels.test.ts +51 -0
  576. package/src/ui/session-issue-labels.ts +70 -0
  577. package/src/ui/sync-settings-view.test.ts +36 -0
  578. package/src/ui/sync-settings-view.ts +49 -0
  579. package/src/ui/test-helpers.ts +2 -1
  580. package/src/ui/types.ts +10 -4
  581. package/src/utils/atomic-write.ts +6 -5
  582. package/src/utils/bundle-scan.test.ts +2 -2
  583. package/src/utils/bundle-scan.ts +12 -1
  584. package/src/utils/env-lock.ts +83 -49
  585. package/src/utils/json.ts +7 -5
  586. package/src/utils/messages-utils.ts +232 -0
  587. package/src/utils/proxy.test.ts +25 -0
  588. package/src/utils/proxy.ts +19 -5
  589. package/src/utils/recursive-walk.test.ts +43 -0
  590. package/src/utils/recursive-walk.ts +75 -1
  591. package/src/utils/session-log-repair.ts +10 -9
  592. package/src/utils/zip.ts +27 -26
  593. package/lib/core/checkpoint.d.ts +0 -362
  594. package/lib/core/checkpoint.js +0 -1309
  595. package/src/core/checkpoint.test.ts +0 -665
  596. package/src/core/checkpoint.ts +0 -1614
@@ -30,6 +30,7 @@ import { resolveDesktopCarrier } from '../utils/desktop-carrier.js';
30
30
  import { isRecord } from '../utils/guards.js';
31
31
  import { DshProfileError } from './dsh-profile-manager.js';
32
32
  import { readTextSafe, sanitizeFilePart } from './dsh-profile-io.js';
33
+ import { profilesMsg } from './messages.js';
33
34
  import { resolveProcessControl, stopPid } from './process-control.js';
34
35
  import { DSH_PROFILE_LAUNCH_TIMEOUT_MS, isLaunchableShape, isManagedProfileName, } from './dsh-profile-shared.js';
35
36
  /** 实例记录文件名(`<dataDir>/launches.json`;机器本地状态,**不进备份/同步**)。 */
@@ -180,7 +181,7 @@ export class DshProfileLauncher {
180
181
  const rest = records.filter((r) => r.name !== name);
181
182
  const outcome = await stopPid(record.pid, this.proc);
182
183
  if (outcome === 'failed') {
183
- throw new DshProfileError('stopFailed', 'stopFailed: pid ' + String(record.pid) + ' 仍在运行');
184
+ throw new DshProfileError('stopFailed', profilesMsg('profiles.stopFailed', { pid: record.pid }));
184
185
  }
185
186
  this.deps.writeState(serializeLaunches(rest));
186
187
  return { name, result: outcome, port: record.port };
@@ -21,6 +21,7 @@ import { join } from 'node:path';
21
21
  import { atomicWriteFileSync } from '../utils/atomic-write.js';
22
22
  import { readTextSafe, sanitizeFilePart } from './dsh-profile-io.js';
23
23
  import { DshProfileError } from './dsh-profile-manager.js';
24
+ import { profilesMsg } from './messages.js';
24
25
  import { resolveProcessControl, stopPid } from './process-control.js';
25
26
  /** 心跳目录名(`<dataDir>/running`)。 */
26
27
  export const RUNTIME_DIR_NAME = 'running';
@@ -175,7 +176,7 @@ export class DshProfileRuntimeRegistry {
175
176
  throw new DshProfileError('currentProfile');
176
177
  const outcome = await stopPid(record.pid, this.proc);
177
178
  if (outcome === 'failed') {
178
- throw new DshProfileError('stopFailed', `stopFailed: pid ${String(record.pid)} 仍在运行`);
179
+ throw new DshProfileError('stopFailed', profilesMsg('profiles.stopFailed', { pid: record.pid }));
179
180
  }
180
181
  rmSync(this.fileFor(name), { force: true });
181
182
  return { name, result: outcome, port: record.port ?? undefined };
@@ -0,0 +1,7 @@
1
+ import type { MsgParams } from '../core/msg-types.ts';
2
+ export declare const zh: {
3
+ readonly 'profiles.stopFailed': 'stopFailed: pid {pid} 仍在运行';
4
+ };
5
+ export declare const en: Record<keyof typeof zh, string>;
6
+ /** 本域翻译器:key 受目录约束(拼错键 = 编译错误),语言按 engineMsg 的活语言解析。 */
7
+ export declare function profilesMsg(key: keyof typeof zh, params?: MsgParams): string;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * profiles 层的领域消息目录(zh 源 / en 镜像)—— 经 engineMsg 取「调用期」语言文案。
3
+ *
4
+ * 为什么是本域独立目录:src/profiles/** 的写作用域不含 src/core/messages.ts(既有键有冻结指纹),
5
+ * 所以本域的键用 registerMessageCatalog 在**模块加载时**注册进引擎目录,查找顺序见
6
+ * src/core/engine-locale.ts(基础目录 → 注册目录 → 键名)。
7
+ *
8
+ * 纪律(与 src/core/messages.ts 同口径):
9
+ * - zh 值 = 迁移前的既有中文文案**逐字不变**(既有测试断言依赖);
10
+ * - en 类型为 Record<keyof typeof zh, string> —— 缺键/多键即编译错误;
11
+ * - {param} 插值与缺参保留由 engineMsg 负责;
12
+ * - 只追加键,不改既有键。
13
+ */
14
+ import { engineMsg, registerMessageCatalog } from '../core/engine-locale.js';
15
+ export const zh = {
16
+ // ---------- 档案实例停止(dsh-profile-launcher.ts / dsh-profile-runtime.ts) ----------
17
+ 'profiles.stopFailed': 'stopFailed: pid {pid} 仍在运行',
18
+ };
19
+ export const en = {
20
+ 'profiles.stopFailed': 'stopFailed: pid {pid} is still running',
21
+ };
22
+ registerMessageCatalog({ id: 'profiles', zh, en });
23
+ /** 本域翻译器:key 受目录约束(拼错键 = 编译错误),语言按 engineMsg 的活语言解析。 */
24
+ export function profilesMsg(key, params) {
25
+ return engineMsg(key, params);
26
+ }
27
+ //# sourceMappingURL=messages.js.map
@@ -13,7 +13,14 @@ import { MARKET_RETENTION_DEFAULT_MS, TMP_RETENTION_DEFAULT_MS, EXPORTS_RETENTIO
13
13
  import { scanDiskUsage } from '../core/disk-usage.js';
14
14
  import { validateBackupScheduleDraft } from '../ui/backup-schedule.js';
15
15
  import { join as joinPath } from 'node:path';
16
- /** 磁盘体检子区 → 物理目录(`$DSH_HOME/dsh-config-manager` 下的固定布局,单一映射点) */
16
+ /**
17
+ * 磁盘体检子区 → 物理目录(`$DSH_HOME/dsh-config-manager` 下的固定布局,单一映射点)。
18
+ *
19
+ * 注意这里**没有** `rollback-points`:回滚点库与遗留 `checkpoints/` 的位置由 core 按
20
+ * `dataDir + ROLLBACK_POINTS_DIR`(与引擎常量逐字一致,有源码级守卫)与 `LEGACY_DATA_DIRS`
21
+ * 推导(见 `src/core/disk-usage.ts` 的 `diskUsageDirOf`)——宿主路由与离线 CLI 因此不可能
22
+ * 各写一份目录名而漂移。
23
+ */
17
24
  function diskUsageDirsOf(env) {
18
25
  const { dataDir, syncDir, marketDir, tmpDir, snapshotsDir, exportsDir } = env;
19
26
  return {
@@ -129,6 +136,12 @@ export function backupRoutes(env) {
129
136
  // ------------------------------------------------------- disk-usage(只读体检)
130
137
  // 界面「磁盘占用」卡的数据源:按子区回传字节数/文件数 + 各保留期的「已到期」量。
131
138
  // 零写入、零敏感(只有本机目录布局与体积);子区读不到时如实标 unreadable(绝不显示 0 诱导)。
139
+ //
140
+ // 响应恒含两块**此前不可见**的占用(都是 protected,只报告、绝不进清理候选):
141
+ // ① report.areas['rollback-points'] 回滚点库(dataDir/rollback-points,工作区+会话两态的恢复入口);
142
+ // ② report.legacy[] 遗留数据(结构可容纳多条;当前一条 legacy-checkpoints =
143
+ // 旧 checkpoints/ 目录,插件已不再读取、也不代删)。
144
+ // 已超期/可回收字段只对 retained / regenerable 子区有值,这两块恒为空/undefined。
132
145
  endpoint({ path: '/api/dsh-config-manager/disk-usage', methods: ['GET'] }, async (_req, res) => {
133
146
  try {
134
147
  writeJson(res, 200, { ok: true, report: await diskUsageReportOf(env) });
@@ -140,7 +153,10 @@ export function backupRoutes(env) {
140
153
  // ------------------------------------------------- disk-usage/cleanup(手动清理)
141
154
  // 缺省只清可重建的缓存/暂存(tmp + 市场缓存 + 市场工作副本,忽略保留期整块清);
142
155
  // categories 可加入 'expired-exports'(只删已超保留期的导出产物,豁免定时备份)。
143
- // **snapshots / sync 永不在候选集内**(用户数据与安全网)。走 mutation gate:同一时刻只允许一个写操作。
156
+ // **snapshots / sync 永不在候选集内**(用户数据与安全网);**回滚点库
157
+ // (report.areas['rollback-points'])与遗留数据(report.legacy[])同样永不进候选** ——
158
+ // 上面的 categories 白名单就是逐条判据(源级守卫见 src/core/disk-usage.test.ts)。
159
+ // 走 mutation gate:同一时刻只允许一个写操作。
144
160
  endpoint({ path: '/api/dsh-config-manager/disk-usage/cleanup', methods: ['POST'] }, withMutationGate('disk-usage-cleanup', async (req, res) => {
145
161
  try {
146
162
  const body = await readJsonBody(req);
@@ -134,7 +134,7 @@ export function importRoutes(env) {
134
134
  return;
135
135
  }
136
136
  if (!verified.ok || verified.info === null || verified.kdf === null) {
137
- writeJson(res, 400, { error: decryptErrorText(new SecurityError('BAD_PASSWORD', '解密认证失败'), msg) });
137
+ writeJson(res, 400, { error: decryptErrorText(new SecurityError('BAD_PASSWORD', msg('route.decryptAuthFailed')), msg) });
138
138
  return;
139
139
  }
140
140
  // 解密得到明文 ZIP(Security-sensitive transient:随机独占名 + 0600 + 先权限后写,用后即删)
@@ -307,8 +307,8 @@ export function importRoutes(env) {
307
307
  snapshotId: result.snapshotId ?? undefined,
308
308
  runId,
309
309
  source: 'api',
310
- summary: `导入完成:${importSections.join(', ') || '无分区'}(执行 ${result.executed.length} 项)`,
311
- error: result.ok ? undefined : '导入未完全成功',
310
+ summary: msg('route.importHistorySummary', { sections: importSections.join(', ') || msg('route.importNoSections'), count: result.executed.length }),
311
+ error: result.ok ? undefined : msg('route.importIncomplete'),
312
312
  });
313
313
  writeJson(res, 200, historyError === undefined ? { ...result, runId } : { ...result, runId, historyWriteError: historyError });
314
314
  }
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * 顺序对匹配无影响:DSH webServer 的契约是「命名路由必须互不相同,注册顺序不影响请求」
5
5
  * (见 @deepseek-ai/dsh-host-webserver 的 WebServer 文档)。src/index.ts 保留的 7 条被源码级
6
- * 守卫按文件窗口钉住,其余 71 条在这里组装。
6
+ * 守卫按文件窗口钉住,其余 72 条在这里组装。
7
7
  */
8
8
  import type { WebRoute } from './kit.ts';
9
9
  import type { RoutesEnv } from './context.ts';
@@ -9,7 +9,7 @@
9
9
  * - 3 条 prefix 路由自造围栏(裸 isLoopbackRequest + 自判方法)。
10
10
  *
11
11
  * 计数口径(三路一致 = 78,勿再照抄旧审计初稿的计数 —— 那是计数口径 overcount):
12
- * 路由快照 78 条 = 现行 `endpoint()` 声明 78 条 = 运行期 `buildRoutes()` 71 条 + `src/index.ts` 保留的 7 条。
12
+ * 路由快照 79 条 = 现行 `endpoint()` 声明 79 条 = 运行期 `buildRoutes()` 72 条 + `src/index.ts` 保留的 7 条。
13
13
  * 增删路由后必须同步这段计数、`src/routes/index.ts` 的头注释与 parity 快照清单;`tests/route/route-parity.test.ts`
14
14
  * 的「路由计数散文」守卫会拿真实声明数逐条对账(写错即红灯)。
15
15
  *
@@ -17,7 +17,8 @@
17
17
  * 新增一条路由 = 在所属组文件里加一条 `endpoint({ path, methods, kind? }, handler)` 声明,
18
18
  * 围栏/方法/异常处理由 kit 统一提供,无需再写样板。
19
19
  *
20
- * 分层:本文件只依赖 node:http。WebRoute 刻意在本地结构化声明(与
20
+ * 分层:本文件依赖 node:http + `src/core/engine-locale.ts`(t6 起的引擎语言运行时:请求入口失效 +
21
+ * 注册点断言文案)。WebRoute 刻意在本地结构化声明(与
21
22
  * @deepseek-ai/dsh-host-webserver 的同名接口结构等价),因为架构边界测试规定
22
23
  * @deepseek-ai/* 只能出现在 src/index.ts 与 src/client/(见 tests/architecture-boundaries.test.ts)。
23
24
  */
package/lib/routes/kit.js CHANGED
@@ -1,3 +1,5 @@
1
+ import { invalidateEngineLocale } from '../core/engine-locale.js';
2
+ import { engineMsg } from './messages.js';
1
3
  /** kit 产出的路由上挂的声明信息(供注册点兜底断言与 route-parity 测试读取)。 */
2
4
  export const ROUTE_SPEC = Symbol('dsh-config-manager.routeSpec');
3
5
  /* ------------------------------------------------------------------ 错误 */
@@ -121,6 +123,9 @@ export function endpoint(spec, handler) {
121
123
  kind: spec.kind ?? 'exact',
122
124
  path: spec.path,
123
125
  handler: async (req, res) => {
126
+ // 「英文界面零中文」(t6):请求入口强制失效语言缓存 —— 用户切语言后**下一次请求**就必须拿到新语言。
127
+ // 不接也有 LANGUAGE_TTL_MS=1000 的兜底上界;TTL 只给调度器/后台任务这类非请求路径用。
128
+ invalidateEngineLocale();
124
129
  if (!isLoopbackRequest(req)) {
125
130
  writeJsonError(res, 403, 'forbidden: loopback-only');
126
131
  return;
@@ -161,7 +166,7 @@ export function registerRoutes(registry, routes) {
161
166
  return routes.map((route) => {
162
167
  const spec = routeSpecOf(route);
163
168
  if (spec === undefined) {
164
- throw new Error(`路由 ${route.path} 未经 route kit 声明(endpoint())——禁止裸 handler(安全不变量:围栏必须在注册点统一包装)`);
169
+ throw new Error(engineMsg('route.kitUnregistered', { path: route.path }));
165
170
  }
166
171
  return registry.register(route);
167
172
  });
@@ -157,7 +157,7 @@ export function marketRoutes(env) {
157
157
  const downloadedAt = new Date().toISOString();
158
158
  const warnings = manifest !== null
159
159
  ? marketItemWarnings(manifest, sourceRepo, downloadedAt, msg)
160
- : [`条目 ${itemId} 来自公共网络市场,未经官方审核(供应链警示)`];
160
+ : [msg('route.marketItemSupplyChainWarning', { id: itemId })];
161
161
  const base = {
162
162
  id: itemId,
163
163
  name: manifest?.name ?? itemId,
@@ -0,0 +1,43 @@
1
+ import type { MsgFunc } from '../core/msg-types.ts';
2
+ export declare const zh: {
3
+ readonly 'route.kitUnregistered': '路由 {path} 未经 route kit 声明(endpoint())——禁止裸 handler(安全不变量:围栏必须在注册点统一包装)';
4
+ readonly 'route.marketItemSupplyChainWarning': '条目 {id} 来自公共网络市场,未经官方审核(供应链警示)';
5
+ readonly 'route.decryptAuthFailed': '解密认证失败';
6
+ readonly 'route.importNoSections': '无分区';
7
+ readonly 'route.importHistorySummary': '导入完成:{sections}(执行 {count} 项)';
8
+ readonly 'route.importIncomplete': '导入未完全成功';
9
+ readonly 'route.profileLaunchSummary': '启动档案 {name}(独立实例 :{port})';
10
+ readonly 'route.profileCreateSummary': '新建档案 {name}(模板 {template})';
11
+ readonly 'route.profileCopySummary': '复制档案 {from} → {to}{suffix}';
12
+ readonly 'route.profileCopyNoNodeModules': '(未含 node_modules)';
13
+ readonly 'route.profileRenameSummary': '重命名档案 {from} → {to}';
14
+ readonly 'route.profileDeleteSummary': '删除档案 {name}(物理删除目录)';
15
+ readonly 'route.profileStopSummary': '停止档案 {name}({kind}{port})';
16
+ readonly 'route.profileStopOwned': '本插件启动的独立实例';
17
+ readonly 'route.profileStopExternal': '其他实例';
18
+ readonly 'route.snapshotRestoreSummary': '恢复快照 {id}:还原 {count} 项{suffix}';
19
+ readonly 'route.snapshotRestoreRemovedPluginsSuffix': ',卸载插件 {count}';
20
+ readonly 'route.snapshotDeleteSummary': '删除快照 {id}';
21
+ readonly 'route.syncPreviewFailed': '同步预览失败';
22
+ readonly 'route.syncSessionExpired': '同步会话不存在或已过期,请重新拉取预览';
23
+ readonly 'route.syncConflictResolutionRequired': '冲突项 {id} 必须提供 resolution(useRemote/keepLocal/skip)';
24
+ readonly 'route.syncApplySummary': '一键同步应用:{count} 项{status}{ineffective}';
25
+ readonly 'route.syncRollbackIncomplete': '(回滚未完成)';
26
+ readonly 'route.syncRolledBack': '(已回滚)';
27
+ readonly 'route.syncIneffectiveSuffix': '({count} 项未生效)';
28
+ readonly 'route.syncApplyPartial': '同步应用部分成功:有项未生效(见告警明细)';
29
+ readonly 'route.syncApplyFailed': '同步应用未完全成功';
30
+ readonly 'route.syncRollbackSummary': '一键同步回滚({id})';
31
+ readonly 'route.recoverySessionRepairRollback': '会话修复回滚';
32
+ readonly 'route.recoverySessionRepairDropped': '会话修复(丢弃重放重复行 {count} 行)';
33
+ readonly 'route.recoverySessionRepairRejected': '会话修复被拒绝:{reason}';
34
+ readonly 'route.recoverySessionLayoutApplied': '会话布局归位(搬运/隔离 {count} 条)';
35
+ readonly 'route.recoverySessionLayoutPartial': '会话布局归位未全部完成(成功 {applied},失败 {failed},跳过 {skipped})';
36
+ readonly 'route.rollbackPointRewind': '回滚到回滚点:{outcome}';
37
+ readonly 'route.rollbackPointDelete': '删除回滚点 {id}';
38
+ readonly 'route.rollbackPointCleanup': '清理回滚点台账:删除 {records} 个点';
39
+ readonly 'route.recoveryOperationSummary': '恢复操作 {action}';
40
+ };
41
+ export declare const en: Record<keyof typeof zh, string>;
42
+ /** 本域活翻译器(与 core 的 engineMsg 同一实现;导入本模块即完成目录注册)。 */
43
+ export declare const engineMsg: MsgFunc;
@@ -0,0 +1,102 @@
1
+ /**
2
+ * routes 域(src/routes/**)的追加消息目录(zh 源 / en 镜像),归 t6 作用域。
3
+ *
4
+ * 为什么不在 \`src/core/messages.ts\` 追加:该文件不在本作用域的 inScope 内,且既有 372 键有冻结指纹。
5
+ * 本模块经 \`registerMessageCatalog\` 注册**追加目录**:engineMsg / makeMsg 的查找顺序是
6
+ * 「既有目录 → en 下回退既有 zh → 注册目录 → 键名」,所以本域新键只在既有目录未命中时生效,
7
+ * 不可能遮蔽 core 的既有 import.* / host.* 键。
8
+ *
9
+ * 纪律:zh 值 = 改动前的既有中文文案**逐字原样**(迁移历史 summary 的拼接顺序/空格/全角标点不变);
10
+ * en 为 \`Record<keyof typeof zh, string>\`(缺键即编译错)。
11
+ * **导入 \`./kit.ts\` 即完成注册**(kit.ts import 本模块):全部路由组都经 kit.ts 声明路由。
12
+ */
13
+ import { engineMsg as engineMsgOf, registerMessageCatalog } from '../core/engine-locale.js';
14
+ export const zh = {
15
+ // ---------- 注册点安全不变量 ----------
16
+ 'route.kitUnregistered': '路由 {path} 未经 route kit 声明(endpoint())——禁止裸 handler(安全不变量:围栏必须在注册点统一包装)',
17
+ // ---------- 市场 ----------
18
+ 'route.marketItemSupplyChainWarning': '条目 {id} 来自公共网络市场,未经官方审核(供应链警示)',
19
+ // ---------- 导入 ----------
20
+ 'route.decryptAuthFailed': '解密认证失败',
21
+ 'route.importNoSections': '无分区',
22
+ 'route.importHistorySummary': '导入完成:{sections}(执行 {count} 项)',
23
+ 'route.importIncomplete': '导入未完全成功',
24
+ // ---------- 档案 ----------
25
+ 'route.profileLaunchSummary': '启动档案 {name}(独立实例 :{port})',
26
+ 'route.profileCreateSummary': '新建档案 {name}(模板 {template})',
27
+ 'route.profileCopySummary': '复制档案 {from} → {to}{suffix}',
28
+ 'route.profileCopyNoNodeModules': '(未含 node_modules)',
29
+ 'route.profileRenameSummary': '重命名档案 {from} → {to}',
30
+ 'route.profileDeleteSummary': '删除档案 {name}(物理删除目录)',
31
+ 'route.profileStopSummary': '停止档案 {name}({kind}{port})',
32
+ 'route.profileStopOwned': '本插件启动的独立实例',
33
+ 'route.profileStopExternal': '其他实例',
34
+ // ---------- 快照 ----------
35
+ 'route.snapshotRestoreSummary': '恢复快照 {id}:还原 {count} 项{suffix}',
36
+ 'route.snapshotRestoreRemovedPluginsSuffix': ',卸载插件 {count}',
37
+ 'route.snapshotDeleteSummary': '删除快照 {id}',
38
+ // ---------- 一键同步 ----------
39
+ 'route.syncPreviewFailed': '同步预览失败',
40
+ 'route.syncSessionExpired': '同步会话不存在或已过期,请重新拉取预览',
41
+ 'route.syncConflictResolutionRequired': '冲突项 {id} 必须提供 resolution(useRemote/keepLocal/skip)',
42
+ 'route.syncApplySummary': '一键同步应用:{count} 项{status}{ineffective}',
43
+ 'route.syncRollbackIncomplete': '(回滚未完成)',
44
+ 'route.syncRolledBack': '(已回滚)',
45
+ 'route.syncIneffectiveSuffix': '({count} 项未生效)',
46
+ 'route.syncApplyPartial': '同步应用部分成功:有项未生效(见告警明细)',
47
+ 'route.syncApplyFailed': '同步应用未完全成功',
48
+ 'route.syncRollbackSummary': '一键同步回滚({id})',
49
+ // ---------- 事故恢复 ----------
50
+ 'route.recoverySessionRepairRollback': '会话修复回滚',
51
+ 'route.recoverySessionRepairDropped': '会话修复(丢弃重放重复行 {count} 行)',
52
+ 'route.recoverySessionRepairRejected': '会话修复被拒绝:{reason}',
53
+ 'route.recoverySessionLayoutApplied': '会话布局归位(搬运/隔离 {count} 条)',
54
+ 'route.recoverySessionLayoutPartial': '会话布局归位未全部完成(成功 {applied},失败 {failed},跳过 {skipped})',
55
+ 'route.rollbackPointRewind': '回滚到回滚点:{outcome}',
56
+ 'route.rollbackPointDelete': '删除回滚点 {id}',
57
+ 'route.rollbackPointCleanup': '清理回滚点台账:删除 {records} 个点',
58
+ 'route.recoveryOperationSummary': '恢复操作 {action}',
59
+ };
60
+ export const en = {
61
+ 'route.kitUnregistered': 'Route {path} was not declared through the route kit (endpoint()) — bare handlers are forbidden (safety invariant: the fence must be wrapped at the registration point)',
62
+ 'route.marketItemSupplyChainWarning': 'Item {id} comes from a public community marketplace and is not officially reviewed (supply-chain warning)',
63
+ 'route.decryptAuthFailed': 'Decryption authentication failed',
64
+ 'route.importNoSections': 'no sections',
65
+ 'route.importHistorySummary': 'Import finished: {sections} ({count} item(s) executed)',
66
+ 'route.importIncomplete': 'Import did not fully succeed',
67
+ 'route.profileLaunchSummary': 'Launched profile {name} (separate instance :{port})',
68
+ 'route.profileCreateSummary': 'Created profile {name} (template {template})',
69
+ 'route.profileCopySummary': 'Copied profile {from} → {to}{suffix}',
70
+ 'route.profileCopyNoNodeModules': ' (node_modules excluded)',
71
+ 'route.profileRenameSummary': 'Renamed profile {from} → {to}',
72
+ 'route.profileDeleteSummary': 'Deleted profile {name} (directory physically removed)',
73
+ 'route.profileStopSummary': 'Stopped profile {name} ({kind}{port})',
74
+ 'route.profileStopOwned': 'separate instance launched by this plugin',
75
+ 'route.profileStopExternal': 'other instance',
76
+ 'route.snapshotRestoreSummary': 'Restored snapshot {id}: {count} item(s) restored{suffix}',
77
+ 'route.snapshotRestoreRemovedPluginsSuffix': ', {count} plugin(s) uninstalled',
78
+ 'route.snapshotDeleteSummary': 'Deleted snapshot {id}',
79
+ 'route.syncPreviewFailed': 'Sync preview failed',
80
+ 'route.syncSessionExpired': 'The sync session does not exist or has expired; pull a fresh preview',
81
+ 'route.syncConflictResolutionRequired': 'Conflict item {id} must provide a resolution (useRemote/keepLocal/skip)',
82
+ 'route.syncApplySummary': 'One-click sync apply: {count} item(s){status}{ineffective}',
83
+ 'route.syncRollbackIncomplete': ' (rollback incomplete)',
84
+ 'route.syncRolledBack': ' (rolled back)',
85
+ 'route.syncIneffectiveSuffix': ' ({count} item(s) had no effect)',
86
+ 'route.syncApplyPartial': 'Sync apply partially succeeded: some items had no effect (see the warning details)',
87
+ 'route.syncApplyFailed': 'Sync apply did not fully succeed',
88
+ 'route.syncRollbackSummary': 'One-click sync rollback ({id})',
89
+ 'route.recoverySessionRepairRollback': 'Session repair rollback',
90
+ 'route.recoverySessionRepairDropped': 'Session repair (dropped {count} replayed duplicate row(s))',
91
+ 'route.recoverySessionRepairRejected': 'Session repair was rejected: {reason}',
92
+ 'route.recoverySessionLayoutApplied': 'Session layout relocation ({count} item(s) moved/quarantined)',
93
+ 'route.recoverySessionLayoutPartial': 'Session layout relocation did not fully complete ({applied} succeeded, {failed} failed, {skipped} skipped)',
94
+ 'route.rollbackPointRewind': 'Rewind to rollback point: {outcome}',
95
+ 'route.rollbackPointDelete': 'Deleted rollback point {id}',
96
+ 'route.rollbackPointCleanup': 'Cleaned up rollback-point ledger: {records} point(s) deleted',
97
+ 'route.recoveryOperationSummary': 'Recovery operation {action}',
98
+ };
99
+ registerMessageCatalog({ id: 'routes-domain', zh, en });
100
+ /** 本域活翻译器(与 core 的 engineMsg 同一实现;导入本模块即完成目录注册)。 */
101
+ export const engineMsg = engineMsgOf;
102
+ //# sourceMappingURL=messages.js.map
@@ -7,11 +7,30 @@
7
7
  * path/methods 就是唯一声明处;围栏、方法判定与顶层异常处理由 src/routes/kit.ts 在注册点统一提供。
8
8
  */
9
9
  import { endpoint, requireJsonObject, writeJson } from './kit.js';
10
+ import { EnvironmentLockUnavailableError, runWithMutationLock } from '../utils/env-lock.js';
10
11
  import { PLUGIN_VERSION, STAR_PROMPT_REPO_URL } from '../index.js';
11
12
  import { readUiPrefs, updateUiPrefs } from '../sync/ui-prefs.js';
12
13
  import { UpdateChecker, wantsForcedUpdateCheck } from '../core/update-check.js';
13
14
  export function prefsRoutes(env) {
14
- const { syncDir, selfUpdate, withMutationGate, } = env;
15
+ const { host, syncDir, selfUpdate, withMutationGate, } = env;
16
+ /**
17
+ * 偏好写必须与其它写路径**同门**(④A):ui-prefs.json 由 star-prompt / release-notes-prompt /
18
+ * 回滚开关三个端点共写。`updateUiPrefs` 虽是 read→merge→write,但两个端点**并发**时仍会互相覆盖
19
+ * 字段(典型:刚打开的 rollbackEnabled 被另一个端点的旧快照抹掉 ⇒ 重启后功能自己关掉,fail-closed)。
20
+ * 被 SAFE MODE / 环境锁挡住时直接回 423 并返回 null(调用方 return,零写入)。
21
+ */
22
+ const writePrefsOrBlocked = async (res, patch) => {
23
+ try {
24
+ return await runWithMutationLock(host.mutationLock, { op: 'ui-prefs', target: 'star/release-notes', isBlocked: () => host.safeModeIsBlocked?.() ?? false }, async () => await updateUiPrefs(syncDir, patch));
25
+ }
26
+ catch (error) {
27
+ if (error instanceof EnvironmentLockUnavailableError) {
28
+ writeJson(res, 423, { error: error.message, code: 'mutation-locked' });
29
+ return null;
30
+ }
31
+ throw error;
32
+ }
33
+ };
15
34
  // 版本更新检查器:每进程一个(进程内缓存 10 分钟;用户点「重新检查」走 ?force=1)。
16
35
  // 网络失败/超时/响应畸形一律结构化回传(ok:false + 原因),绝不「失败当最新」。
17
36
  const updateChecker = new UpdateChecker(PLUGIN_VERSION);
@@ -51,7 +70,9 @@ export function prefsRoutes(env) {
51
70
  if (body['clicked'] === true) {
52
71
  patch['starPromptClicked'] = true;
53
72
  }
54
- const next = await updateUiPrefs(syncDir, patch);
73
+ const next = await writePrefsOrBlocked(res, patch);
74
+ if (next === null)
75
+ return;
55
76
  writeJson(res, 200, {
56
77
  ok: true,
57
78
  firstSeenAt: next.starPromptFirstSeenAt,
@@ -93,7 +114,9 @@ export function prefsRoutes(env) {
93
114
  if (body['dismissed'] === true) {
94
115
  patch['releaseNotesDismissed'] = true;
95
116
  }
96
- const next = await updateUiPrefs(syncDir, patch);
117
+ const next = await writePrefsOrBlocked(res, patch);
118
+ if (next === null)
119
+ return;
97
120
  writeJson(res, 200, {
98
121
  ok: true,
99
122
  lastSeenVersion: next.releaseNotesLastSeenVersion,
@@ -5,6 +5,8 @@
5
5
  * path/methods 就是唯一声明处;围栏、方法判定与顶层异常处理由 src/routes/kit.ts 在注册点统一提供。
6
6
  */
7
7
  import { endpoint, requireJsonObject, writeJson, queryParam } from './kit.js';
8
+ // t6:「英文界面零中文」——迁移历史 summary 一律由目录键产生(engineMsg 与宿主 msg 同源,且是活翻译器)。
9
+ import { engineMsg } from './messages.js';
8
10
  import { writeProfileError } from '../index.js';
9
11
  import { DSH_PROFILE_TEMPLATES, DshProfileError } from '../profiles/index.js';
10
12
  export function profileRoutes(env) {
@@ -94,7 +96,7 @@ export function profileRoutes(env) {
94
96
  result: 'success',
95
97
  sections: [name],
96
98
  source: 'api',
97
- summary: `启动档案 ${name}(独立实例 :${String(launch.port)})`,
99
+ summary: engineMsg('route.profileLaunchSummary', { name, port: String(launch.port) }),
98
100
  });
99
101
  const running = runningView();
100
102
  writeJson(res, 200, historyError === undefined ? { ok: true, launch, running } : { ok: true, launch, running, historyWriteError: historyError });
@@ -127,7 +129,7 @@ export function profileRoutes(env) {
127
129
  result: 'success',
128
130
  sections: [meta.name],
129
131
  source: 'api',
130
- summary: `新建档案 ${meta.name}(模板 ${template})`,
132
+ summary: engineMsg('route.profileCreateSummary', { name: meta.name, template }),
131
133
  });
132
134
  writeJson(res, 200, historyError === undefined ? { ok: true, profile: meta } : { ok: true, profile: meta, historyWriteError: historyError });
133
135
  }
@@ -167,7 +169,7 @@ export function profileRoutes(env) {
167
169
  result: 'success',
168
170
  sections: [meta.name],
169
171
  source: 'api',
170
- summary: `复制档案 ${name} → ${meta.name}${meta.hasNodeModules ? '' : '(未含 node_modules)'}`,
172
+ summary: engineMsg('route.profileCopySummary', { from: name, to: meta.name, suffix: meta.hasNodeModules ? '' : engineMsg('route.profileCopyNoNodeModules') }),
171
173
  });
172
174
  writeJson(res, 200, historyError === undefined
173
175
  ? { ok: true, profile: meta, copy }
@@ -188,7 +190,7 @@ export function profileRoutes(env) {
188
190
  result: 'success',
189
191
  sections: [name],
190
192
  source: 'api',
191
- summary: `重命名档案 ${name} → ${newName}`,
193
+ summary: engineMsg('route.profileRenameSummary', { from: name, to: newName }),
192
194
  });
193
195
  writeJson(res, 200, historyError === undefined ? { ok: true, profile: meta } : { ok: true, profile: meta, historyWriteError: historyError });
194
196
  }
@@ -211,7 +213,7 @@ export function profileRoutes(env) {
211
213
  result: 'success',
212
214
  sections: [name],
213
215
  source: 'api',
214
- summary: `删除档案 ${name}(物理删除目录)`,
216
+ summary: engineMsg('route.profileDeleteSummary', { name }),
215
217
  });
216
218
  writeJson(res, 200, historyError === undefined ? { ok: true } : { ok: true, historyWriteError: historyError });
217
219
  }
@@ -238,7 +240,11 @@ export function profileRoutes(env) {
238
240
  result: 'success',
239
241
  sections: [name],
240
242
  source: 'api',
241
- summary: `停止档案 ${name}(${owned ? '本插件启动的独立实例' : '其他实例'}${stopped.port !== undefined ? ` :${String(stopped.port)}` : ''})`,
243
+ summary: engineMsg('route.profileStopSummary', {
244
+ name,
245
+ kind: owned ? engineMsg('route.profileStopOwned') : engineMsg('route.profileStopExternal'),
246
+ port: stopped.port !== undefined ? ` :${String(stopped.port)}` : '',
247
+ }),
242
248
  });
243
249
  const running = runningView();
244
250
  writeJson(res, 200, historyError === undefined ? { ok: true, stopped, running } : { ok: true, stopped, running, historyWriteError: historyError });
@@ -6,4 +6,25 @@
6
6
  */
7
7
  import type { WebRoute } from './kit.ts';
8
8
  import type { RoutesEnv } from './context.ts';
9
+ import type { RollbackPreviewResult, RollbackRewindResult } from '../core/rollback-point.ts';
10
+ /**
11
+ * t8 的硬拒**什么时候该生效**(判定链里的位置,t8 实现说明的选项 ②)。
12
+ *
13
+ * 既有护栏**优先**:确认门没开(`userConfirmed !== true`)、该点本来就不可回退
14
+ * (`preview.ok !== true || preview.canRestore !== true`:protected / record-incomplete /
15
+ * 记录不存在 / 存储不可用)、或 SAFE MODE 正拦着(由锁门给 423)时,**把结论让给引擎自己的
16
+ * 结构化拒绝** —— 那些情形下说「对话正在运行」是误导:用户等多久都退不了。
17
+ * 只有「这次本来能退、只是因为它正在运行而不能动工作区」时,才用 `session-active`。
18
+ *
19
+ * 两道门(R1 预检 / R2 锁内二道保险)共用这一份判据,绝不各写一套。
20
+ */
21
+ export declare function sessionActiveGateApplies(preview: RollbackPreviewResult, userConfirmed: boolean, safeModeBlocked: boolean): boolean;
22
+ /**
23
+ * 运行中对话的拒绝结果(t8):**形状与引擎的 rewind 结果同构**,两处(路由预检 / 锁内二道保险)
24
+ * 共用一份,界面照常走「结果 → 文案」那条链。`segments` 恒为空 = 一段都没动(零写入)。
25
+ *
26
+ * 判据来源只有一个:**preview 已算出的 `session.active`**(引擎按会话日志 mtime 静默窗算)——
27
+ * 路由**绝不自己 stat 会话日志**(那会变成第二份判据,两处迟早漂移)。
28
+ */
29
+ export declare function sessionActiveDenied(id: string, preview: RollbackPreviewResult): RollbackRewindResult;
9
30
  export declare function recoveryRoutes(env: RoutesEnv): WebRoute[];