@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,58 @@
1
+ import type { SectionId } from '../schema/types.ts';
2
+ import type { ConsultSourceData, ConsultSourceRef, MigratabilityResult } from './migration-consult.ts';
3
+ export interface ConsultSourceReaderOptions {
4
+ /** 计算可迁移性(宿主注入;缺省 null = 不评估) */
5
+ computeMigratability?: (zipPath: string) => Promise<MigratabilityResult>;
6
+ /** 高熵扫描开关(固定 true 保证确定性;缺省 true) */
7
+ highEntropy?: boolean;
8
+ }
9
+ /** 从导出 ZIP 读取并归一化源数据(只读) */
10
+ export declare function readExportZipSource(ref: ConsultSourceRef, zipPath: string, opts?: ConsultSourceReaderOptions): Promise<ConsultSourceData>;
11
+ export interface LocalSnapshotSourceInput {
12
+ /** 快照捕获的分区数据(按 adapter 分组;best-effort) */
13
+ sections: Map<SectionId, unknown>;
14
+ /** 快照完整性校验结果(verifySnapshot) */
15
+ verify: {
16
+ ok: boolean;
17
+ reason?: string;
18
+ };
19
+ /** 恢复计划(planRestore)→ 可迁移性 */
20
+ restorePlan: {
21
+ itemCount: number;
22
+ conflicts: number;
23
+ warnings: number;
24
+ sections: SectionId[];
25
+ errors: string[];
26
+ };
27
+ /** 合成 manifest 的源信息(宿主 dshVersion/platform) */
28
+ sourceDsh: string;
29
+ sourcePlatform: string;
30
+ }
31
+ /**
32
+ * 从本地快照(rollback 点)构建 ConsultSourceData。
33
+ * 快照无导出 manifest → 用合成 manifest(schemaVersion=1,sections 来自捕获分区),
34
+ * 避免「无导出 manifest」被误判为 compatibility/integrity critical。
35
+ * 完整性 = verifySnapshot(blob hashes / metadataHash);可迁移性 = planRestore。
36
+ */
37
+ export declare function buildLocalSnapshotSource(ref: ConsultSourceRef, input: LocalSnapshotSourceInput): ConsultSourceData;
38
+ export interface ProfileSourceInput {
39
+ /** profile 的分区数据(decodeSections) */
40
+ sections: Map<SectionId, unknown>;
41
+ /** 切换预览(analyzeSwitch)→ 可迁移性 */
42
+ switchPreview: {
43
+ itemCount: number;
44
+ conflicts: number;
45
+ warnings: number;
46
+ sections: SectionId[];
47
+ errors: string[];
48
+ };
49
+ /** 合成 manifest 的源信息(宿主 dshVersion/platform) */
50
+ sourceDsh: string;
51
+ sourcePlatform: string;
52
+ }
53
+ /**
54
+ * 从配置档案(profile.json)构建 ConsultSourceData。
55
+ * profile 无导出 manifest → 用合成 manifest(sections 来自 profile 分区)。
56
+ * 可迁移性 = analyzeSwitch(切换预览计划项)。
57
+ */
58
+ export declare function buildProfileSource(ref: ConsultSourceRef, input: ProfileSourceInput): ConsultSourceData;
@@ -0,0 +1,260 @@
1
+ /**
2
+ * 迁移前咨询的源读取(Phase 7,只读分析层)。
3
+ *
4
+ * 把 4 种可迁移源(export-zip / local-snapshot / remote-snapshot / profile)归一化为
5
+ * `ConsultSourceData`,供 `computeConsultReport` 评分。本模块**只读**:
6
+ * - 读 ZIP / 快照 / profile 文件;
7
+ * - 复用安全/schema 工具(parseZipHardened / parseManifest / verifyChecksumsJson /
8
+ * validateSectionData / scanAndRedact / scanText);
9
+ * - 可迁移性经宿主注入的 `computeMigratability`(analyzeImport / createImportPlan,零写入)。
10
+ *
11
+ * READ-ONLY 磁盘边界:临时 ZIP 可写但必须净空(调用方负责 try/finally 清理);
12
+ * 配置 / 快照存储 / journal 零写。
13
+ */
14
+ import fs from 'node:fs/promises';
15
+ import { parseZipHardened } from '../security/zip-security.js';
16
+ import { MANIFEST_FILE, CHECKSUMS_FILE, parseManifest, validateManifest } from '../schema/manifest.js';
17
+ import { verifyChecksumsJson } from '../security/integrity.js';
18
+ import { SECTION_JSON_PATHS, SECTION_FILE_PREFIXES, isFileSection } from '../schema/config.js';
19
+ import { scanAndRedact, scanText } from '../security/secret-scanner.js';
20
+ /** 从导出 ZIP 读取并归一化源数据(只读) */
21
+ export async function readExportZipSource(ref, zipPath, opts = {}) {
22
+ const highEntropy = opts.highEntropy ?? true;
23
+ const raw = await fs.readFile(zipPath);
24
+ // 1. 安全解析 ZIP(捕获 Zip Slip / 结构问题)
25
+ const zipSlipIssues = [];
26
+ let archive;
27
+ try {
28
+ archive = parseZipHardened(raw);
29
+ }
30
+ catch (err) {
31
+ zipSlipIssues.push(err instanceof Error ? err.message : String(err));
32
+ return {
33
+ source: ref,
34
+ manifest: null,
35
+ manifestIssues: [],
36
+ sections: new Map(),
37
+ sectionFiles: new Map(),
38
+ checksums: null,
39
+ checksumIssues: [],
40
+ zipSlipIssues,
41
+ encrypted: false,
42
+ containsSecrets: false,
43
+ sourceDsh: '',
44
+ sourcePlatform: '',
45
+ schemaVersion: 0,
46
+ missingSections: [],
47
+ sensitiveHits: [],
48
+ migratability: null,
49
+ };
50
+ }
51
+ // 2. manifest(捕获结构问题,不抛错)
52
+ let manifest = null;
53
+ let manifestIssues = [];
54
+ if (archive.has(MANIFEST_FILE)) {
55
+ try {
56
+ manifest = parseManifest(archive.readEntryText(MANIFEST_FILE));
57
+ }
58
+ catch {
59
+ // parseManifest 抛错 → 用 validateManifest 捕获具体问题
60
+ try {
61
+ const parsed = JSON.parse(archive.readEntryText(MANIFEST_FILE));
62
+ manifestIssues = validateManifest(parsed);
63
+ }
64
+ catch {
65
+ manifestIssues = [{ path: '$', message: 'manifest 无法解析', severity: 'error' }];
66
+ }
67
+ }
68
+ }
69
+ else {
70
+ manifestIssues = [{ path: '$', message: 'manifest 缺失', severity: 'error' }];
71
+ }
72
+ // 3. checksums(捕获不匹配,不抛错)
73
+ const checksumIssues = [];
74
+ let checksums = null;
75
+ if (archive.has(CHECKSUMS_FILE)) {
76
+ try {
77
+ const entries = new Map();
78
+ for (const name of archive.names()) {
79
+ if (name === MANIFEST_FILE || name === CHECKSUMS_FILE)
80
+ continue;
81
+ try {
82
+ entries.set(name, archive.readEntry(name));
83
+ }
84
+ catch { /* 损坏条目计入 checksumIssues */ }
85
+ }
86
+ const result = verifyChecksumsJson(entries, archive.readEntryText(CHECKSUMS_FILE));
87
+ checksums = result.ok ? {} : null;
88
+ for (const m of result.mismatches)
89
+ checksumIssues.push(`"${m}" (hash 不符)`);
90
+ for (const m of result.missing)
91
+ checksumIssues.push(`"${m}" (缺失)`);
92
+ }
93
+ catch (err) {
94
+ checksumIssues.push(err instanceof Error ? err.message : String(err));
95
+ }
96
+ }
97
+ // 4. 提取分区(捕获缺失/不可解析)
98
+ const sections = new Map();
99
+ const sectionFiles = new Map();
100
+ const missingSections = [];
101
+ if (manifest !== null) {
102
+ for (const [sid, enabled] of Object.entries(manifest.sections)) {
103
+ if (!enabled)
104
+ continue;
105
+ if (isFileSection(sid)) {
106
+ const prefix = SECTION_FILE_PREFIXES[sid];
107
+ for (const name of archive.names()) {
108
+ if (!name.startsWith(prefix) || name === prefix)
109
+ continue;
110
+ const rel = name.slice(prefix.length);
111
+ if (rel === '' || rel.endsWith('/'))
112
+ continue;
113
+ sectionFiles.set(`${sid}/${rel}`, archive.readEntry(name));
114
+ }
115
+ sections.set(sid, { version: 1, files: [] });
116
+ continue;
117
+ }
118
+ const jsonPath = SECTION_JSON_PATHS[sid];
119
+ if (jsonPath === undefined)
120
+ continue;
121
+ if (!archive.has(jsonPath)) {
122
+ missingSections.push(sid);
123
+ continue;
124
+ }
125
+ try {
126
+ sections.set(sid, archive.readEntryJson(jsonPath));
127
+ }
128
+ catch {
129
+ missingSections.push(sid);
130
+ }
131
+ }
132
+ }
133
+ // 5. 敏感暴露面(scanAndRedact 结构化 + scanText 文件类)
134
+ const sensitiveHits = [];
135
+ for (const [sid, data] of sections) {
136
+ const { hits } = scanAndRedact(data, { highEntropy });
137
+ for (const h of hits)
138
+ sensitiveHits.push({ path: `${sid}:${h.path}`, field: h.field });
139
+ }
140
+ for (const [key, bytes] of sectionFiles) {
141
+ const text = Buffer.from(bytes).toString('utf8');
142
+ for (const h of scanText(text, { highEntropy })) {
143
+ sensitiveHits.push({ path: `${key}:${h.path}`, field: h.field });
144
+ }
145
+ }
146
+ // 6. 可迁移性(宿主注入;零写入)
147
+ const migratability = opts.computeMigratability !== undefined
148
+ ? await opts.computeMigratability(zipPath)
149
+ : null;
150
+ return {
151
+ source: ref,
152
+ manifest,
153
+ manifestIssues,
154
+ sections,
155
+ sectionFiles,
156
+ checksums,
157
+ checksumIssues,
158
+ zipSlipIssues,
159
+ encrypted: manifest?.security.encrypted ?? false,
160
+ containsSecrets: manifest?.security.containsSecrets ?? false,
161
+ sourceDsh: manifest?.source.dshVersion ?? '',
162
+ sourcePlatform: manifest?.source.platform ?? '',
163
+ schemaVersion: manifest?.schemaVersion ?? 0,
164
+ missingSections,
165
+ sensitiveHits,
166
+ migratability,
167
+ };
168
+ }
169
+ /**
170
+ * 从本地快照(rollback 点)构建 ConsultSourceData。
171
+ * 快照无导出 manifest → 用合成 manifest(schemaVersion=1,sections 来自捕获分区),
172
+ * 避免「无导出 manifest」被误判为 compatibility/integrity critical。
173
+ * 完整性 = verifySnapshot(blob hashes / metadataHash);可迁移性 = planRestore。
174
+ */
175
+ export function buildLocalSnapshotSource(ref, input) {
176
+ const sectionFlags = {};
177
+ for (const sid of input.sections.keys())
178
+ sectionFlags[sid] = true;
179
+ const manifest = {
180
+ schemaVersion: 1,
181
+ exporter: { name: 'DSH Config Manager', version: 'snapshot' },
182
+ source: { dshVersion: input.sourceDsh, platform: input.sourcePlatform, arch: 'unknown' },
183
+ exportedAt: new Date().toISOString(),
184
+ sections: sectionFlags,
185
+ security: { containsSecrets: false, encrypted: false, encryption: null },
186
+ };
187
+ const manifestIssues = input.verify.ok ? [] : [{ path: '$', message: input.verify.reason ?? '快照完整性校验失败', severity: 'error' }];
188
+ const checksumIssues = input.verify.ok ? [] : [input.verify.reason ?? '快照完整性校验失败'];
189
+ const migratability = {
190
+ ok: input.restorePlan.errors.length === 0,
191
+ itemCount: input.restorePlan.itemCount,
192
+ fatalConflicts: input.restorePlan.conflicts,
193
+ warnings: input.restorePlan.warnings,
194
+ sections: input.restorePlan.sections,
195
+ errors: input.restorePlan.errors,
196
+ };
197
+ return {
198
+ source: ref,
199
+ manifest,
200
+ manifestIssues,
201
+ sections: input.sections,
202
+ sectionFiles: new Map(),
203
+ checksums: input.verify.ok ? {} : null,
204
+ checksumIssues,
205
+ zipSlipIssues: [],
206
+ encrypted: false,
207
+ containsSecrets: false,
208
+ sourceDsh: input.sourceDsh,
209
+ sourcePlatform: input.sourcePlatform,
210
+ schemaVersion: 1,
211
+ missingSections: [],
212
+ sensitiveHits: [],
213
+ migratability,
214
+ };
215
+ }
216
+ /**
217
+ * 从配置档案(profile.json)构建 ConsultSourceData。
218
+ * profile 无导出 manifest → 用合成 manifest(sections 来自 profile 分区)。
219
+ * 可迁移性 = analyzeSwitch(切换预览计划项)。
220
+ */
221
+ export function buildProfileSource(ref, input) {
222
+ const sectionFlags = {};
223
+ for (const sid of input.sections.keys())
224
+ sectionFlags[sid] = true;
225
+ const manifest = {
226
+ schemaVersion: 1,
227
+ exporter: { name: 'DSH Config Manager', version: 'profile' },
228
+ source: { dshVersion: input.sourceDsh, platform: input.sourcePlatform, arch: 'unknown' },
229
+ exportedAt: new Date().toISOString(),
230
+ sections: sectionFlags,
231
+ security: { containsSecrets: false, encrypted: false, encryption: null },
232
+ };
233
+ const migratability = {
234
+ ok: input.switchPreview.errors.length === 0,
235
+ itemCount: input.switchPreview.itemCount,
236
+ fatalConflicts: input.switchPreview.conflicts,
237
+ warnings: input.switchPreview.warnings,
238
+ sections: input.switchPreview.sections,
239
+ errors: input.switchPreview.errors,
240
+ };
241
+ return {
242
+ source: ref,
243
+ manifest,
244
+ manifestIssues: [],
245
+ sections: input.sections,
246
+ sectionFiles: new Map(),
247
+ checksums: {},
248
+ checksumIssues: [],
249
+ zipSlipIssues: [],
250
+ encrypted: false,
251
+ containsSecrets: false,
252
+ sourceDsh: input.sourceDsh,
253
+ sourcePlatform: input.sourcePlatform,
254
+ schemaVersion: 1,
255
+ missingSections: [],
256
+ sensitiveHits: [],
257
+ migratability,
258
+ };
259
+ }
260
+ //# sourceMappingURL=consult-source.js.map
@@ -0,0 +1,84 @@
1
+ /** 上次启动结果(持久化到 <dir>/boot-state.json)。 */
2
+ export interface BootState {
3
+ /** 本次启动开始时刻(ISO 字符串)。 */
4
+ startedAt: string;
5
+ /** 启动进程 pid。 */
6
+ pid: number;
7
+ /** 本次启动是否已判定成功。 */
8
+ ok: boolean;
9
+ /** 判定成功的时刻;未成功为 null。 */
10
+ okAt: string | null;
11
+ /** 最近一次「确认正常」的时刻(成功启动时推进)。 */
12
+ lastGoodAt: string | null;
13
+ /** 崩溃原因归因;无归因为 null。 */
14
+ crashReason: CrashKind | null;
15
+ }
16
+ /** 崩溃原因分类(日志尾部签名 → 枚举;无匹配为 unknown)。 */
17
+ export type CrashKind = 'session-corrupt' | 'bundle-check' | 'patch-tree' | 'unknown';
18
+ /** 本次启动的 boot alert(结构化判定结果,无用户文案)。 */
19
+ export interface BootAlert {
20
+ /** 是否判定为「上次启动崩溃」。 */
21
+ crashed: boolean;
22
+ /** 最近一次确认正常的时刻(供「恢复最后正常快照」使用)。 */
23
+ lastGoodAt: string | null;
24
+ /** 崩溃原因;未崩溃或无证据为 null。 */
25
+ crashReason: CrashKind | null;
26
+ /** 建议用户采取的动作,枚举而非文案。 */
27
+ advice: CrashAdvice;
28
+ }
29
+ /** 建议动作(枚举码;文案由宿主 i18n 决定)。 */
30
+ export type CrashAdvice = 'none' | 'restore-last-good' | 'repair-session' | 'check-bundles' | 'check-patch-tree';
31
+ /** 按日志尾部签名分类崩溃原因;无匹配返回 'unknown'。 */
32
+ export declare function classifyCrashLog(text: string): CrashKind;
33
+ /**
34
+ * advice 由 crashReason 决定:session-corrupt→repair-session, bundle-check→check-bundles,
35
+ * patch-tree→check-patch-tree, unknown→restore-last-good(crashReason 为 null 时同样
36
+ * 回退 restore-last-good:崩溃但无归因证据,只有「回到最后正常」这一条稳妥动作)。
37
+ * crashed=false 时 advice='none'。
38
+ */
39
+ export declare function adviceFor(kind: CrashKind | null, crashed: boolean): CrashAdvice;
40
+ /** 只读读取 boot-state;缺失/损坏/非法一律返回 null(绝不抛)。 */
41
+ export declare function readBootState(dir: string): Promise<BootState | null>;
42
+ /**
43
+ * 原子写入 boot-state(用 ../utils/atomic-write.ts 的 atomicWriteFile)。失败不抛。
44
+ * 只落盘 BootState 的六个已知字段(避免调用方对象上的额外字段进入持久化文件)。
45
+ */
46
+ export declare function writeBootState(dir: string, state: BootState): Promise<void>;
47
+ /**
48
+ * 计算本次启动的 boot alert。
49
+ * - prev 为 null(首次启动)→ crashed=false,lastGoodAt=null,crashReason=null,advice='none';
50
+ * - prev.ok !== true → crashed=true(上次没走到「确认成功」);
51
+ * - crashReason 优先沿用 prev.crashReason(上次已算过),否则若给了 logTail 就用 classifyCrashLog;
52
+ * - crashed=false 时 crashReason 恒为 null(健康启动不做归因,见文件头「语义决策」)。
53
+ */
54
+ export declare function computeBootAlert(prev: BootState | null, logTail: string | null): BootAlert;
55
+ /**
56
+ * 从候选日志文件里读尾部(最多 maxBytes,默认 262144),返回第一个非空日志的文本;
57
+ * 无则 null。单个候选不可读(不存在/无权限/是目录)不抛,直接跳到下一个。
58
+ */
59
+ export declare function readCrashLogTail(candidates: readonly string[], maxBytes?: number): Promise<string | null>;
60
+ /**
61
+ * 列出候选日志路径:`<homeDir>/logs/*.log`(按文件名字典序,稳定可测)与
62
+ * `<homeDir>/dsh.log`(存在才纳入)。`logs` 目录不存在/不可读时返回空数组
63
+ * —— 与「无候选日志」同义(不抛)。
64
+ */
65
+ export declare function listCandidateLogs(homeDir: string): Promise<string[]>;
66
+ /**
67
+ * 选「最后正常快照」:在 snapshots 中找 createdAt <= lastGoodAt 的**最新**一个,
68
+ * 跳过 kind==='pre-restore'(恢复前双保险快照,不代表「正常状态」)。
69
+ * lastGoodAt 为 null / 非法 → null;无符合项(含 createdAt 不可解析者)→ null。
70
+ * createdAt 相同时保留数组中靠前者。入参为最小结构类型,刻意不 import restore.ts
71
+ * (快照元信息 → 恢复执行 的依赖方向必须单向,避免循环依赖)。
72
+ */
73
+ export declare function selectLastGoodSnapshot<T extends {
74
+ id: string;
75
+ createdAt: string;
76
+ kind?: string;
77
+ }>(snapshots: readonly T[], lastGoodAt: string | null): T | null;
78
+ /** 启动生命周期辅助:apply 时调用一次,写「正在启动」(ok:false)。 */
79
+ export declare function beginBoot(pid: number, prev: BootState | null, now?: () => Date): BootState;
80
+ /**
81
+ * 30 秒后 / dispose 时调用:标记成功并推进 lastGoodAt(ok:true、okAt=lastGoodAt=now)。
82
+ * 同时清空 crashReason:本次启动已确认正常,陈旧归因不得延续到下一次崩溃判定。
83
+ */
84
+ export declare function markBootOk(state: BootState, now?: () => Date): BootState;