@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,103 @@
1
+ /**
2
+ * Phase 4 crash-injection child harness:用真实 Phase3Recovery.runJournaled({ deferredSnapshot:true })
3
+ * 执行一个 op-bound snapshot + mutation,随后在指定 crash point SIGKILL 自己。
4
+ *
5
+ * 用法(argv):
6
+ * argv[2] = workDir(写入 transactions/ 与 snapshots/ 的根)
7
+ * argv[3] = crashPoint(C1..C10,见 phase4-crash-injection.test.ts)
8
+ *
9
+ * 每个 crash point 在流程的指定边界 SIGKILL,验证「journal 状态 + snapshot 是否存在」反映该点。
10
+ * 用真实磁盘 FileSnapshotStore(manifest + READY),非 throw 替代。
11
+ */
12
+ import fs from 'node:fs/promises';
13
+ import fssync from 'node:fs';
14
+ import path from 'node:path';
15
+ import { Phase3Recovery } from './phase3-host.js';
16
+ import { createSnapshot, FileSnapshotStore } from './backup.js';
17
+ const workDir = process.argv[2];
18
+ const crashPoint = process.argv[3];
19
+ const dataDir = path.join(workDir, 'data');
20
+ const snapDir = path.join(dataDir, 'snapshots');
21
+ const txDir = path.join(dataDir, 'transactions');
22
+ const FP = 'fp-crash';
23
+ const sideEffect = path.join(workDir, 'home', 'side-effect.txt');
24
+ function die() { process.kill(process.pid, 'SIGKILL'); throw new Error('unreachable'); }
25
+ async function main() {
26
+ // 用真实磁盘 FileSnapshotStore(manifest+READY)与真实 plan
27
+ fssync.mkdirSync(dataDir, { recursive: true });
28
+ const recovery = new Phase3Recovery({ dataDir, packageVersion: '0.1.54', environmentFingerprint: FP });
29
+ await recovery.store.ensureDirs();
30
+ const store = new FileSnapshotStore({ dir: snapDir });
31
+ const lockCtx = { token: { tokenId: 't', managerId: 'm', instanceId: 'crash-child', acquiredAt: Date.now() } };
32
+ const plan = {
33
+ items: [{ id: 'settings:general', kind: 'Update', adapter: 'settings', description: 'u', severity: 'info', target: { adapter: 'settings', ref: 'general' } }],
34
+ globalStrategy: 'replace', pathMappings: [], missingSecrets: [], needsRestart: false,
35
+ estimatedActions: {},
36
+ };
37
+ // 构造内存 ctx:engineSnapshotEntry 需要 settings.describe;hostFile 备份需要 settings.yaml
38
+ // 这里不复用 makeContext(子进程需独立构造,无 import 依赖测试 helper)。
39
+ const ctx = {
40
+ homeDir: path.join(workDir, 'home'),
41
+ platform: 'win32',
42
+ arch: 'x64',
43
+ dshVersion: '0.1.54',
44
+ profile: 'web',
45
+ fs: {
46
+ readFile: async (p) => Buffer.from('settings.yaml-content', 'utf8'),
47
+ },
48
+ settings: {
49
+ describe: async (ref) => ({ value: { theme: 'dark' }, revision: 1, secrets: [] }),
50
+ },
51
+ credentials: { describe: async () => ({ configured: false }) },
52
+ plugins: { listInstalled: async () => [] },
53
+ workspace: { listRecords: async () => [] },
54
+ patchFile: { readPatchLines: async () => [] },
55
+ log: { warn: () => { } },
56
+ };
57
+ try {
58
+ await recovery.runJournaled({
59
+ operationType: 'import-apply',
60
+ lockCtx,
61
+ deferredSnapshot: true,
62
+ fn: async (journalCtx) => {
63
+ if (crashPoint === 'C1')
64
+ die(); // after journal CREATED, before snapshot
65
+ const snap = await createSnapshot({
66
+ ctx, plan, sourceZip: 'crash.zip', store, adapters: [],
67
+ operationId: journalCtx?.operationId, operationType: journalCtx?.operationType,
68
+ environmentFingerprint: journalCtx?.environmentFingerprint, ownerInstanceId: journalCtx?.ownerInstanceId,
69
+ });
70
+ if (crashPoint === 'C2')
71
+ die(); // during/after snapshot write, before bind
72
+ await journalCtx?.bindSnapshot(snap.id);
73
+ if (crashPoint === 'C3')
74
+ die(); // after journal binding (SNAPSHOT_CREATED), before APPLYING
75
+ await journalCtx?.markApplying();
76
+ if (crashPoint === 'C4')
77
+ die(); // after APPLYING, before mutation
78
+ // 真实 local file mutation
79
+ await fs.mkdir(path.dirname(sideEffect), { recursive: true });
80
+ await fs.writeFile(sideEffect, 'mutated');
81
+ if (crashPoint === 'C5')
82
+ die(); // after first local file mutation
83
+ if (crashPoint === 'C6')
84
+ die(); // mid-mutation
85
+ if (crashPoint === 'C7')
86
+ die(); // after mutation, before COMMITTED
87
+ // 业务成功
88
+ },
89
+ });
90
+ if (crashPoint === 'C8' || crashPoint === 'C9' || crashPoint === 'C10') {
91
+ // 已到 COMMITTED(runJournaled 返回),C8=C9=C10 视为「COMMITTED 后不应 rollback」的探针
92
+ process.exit(0);
93
+ }
94
+ // 未指定 crash point → 正常完成不 kill
95
+ process.exit(0);
96
+ }
97
+ catch {
98
+ // 被杀不会到这
99
+ process.exit(0);
100
+ }
101
+ }
102
+ main().catch(() => process.exit(2));
103
+ //# sourceMappingURL=phase4-crash-child.js.map
@@ -0,0 +1,150 @@
1
+ /**
2
+ * dsh plugin CLI 通道(方案A 主机侧实现,M1)。
3
+ *
4
+ * 本模块是唯一的子进程启动点:把「安装 / 更新 profile 插件」转成官方
5
+ * `dsh plugin --profile <name> <args…>` 调用(dsh CLI 内部转发 pnpm,并在
6
+ * 成功后 reconcile dsh.profile.bundles),以及从 profile 文件实时读取已装
7
+ * 插件清单(不依赖 web 专用 pluginMarketplace / pluginInventory 服务)。
8
+ *
9
+ * 设计对齐:
10
+ * - dsh 官方实现 @deepseek-ai/dsh/lib/plugin-*.js(runPlugin / reconcilePlugins /
11
+ * exportsPatch 的 bundle 判定语义);
12
+ * - dshmarket src/dsh-cli.ts(dshArgv / spawnShim / killTree / spawnEnv)与
13
+ * src/profile.ts(readInstalled / readInstalledVersion / hasDshManifest)。
14
+ *
15
+ * 只依赖 node 内置模块,零 DSH 运行时依赖(M5 的 TDD 可直接单测本模块)。
16
+ */
17
+ import type { ChildProcess } from 'node:child_process';
18
+ import type { PluginInfo } from './types.ts';
19
+ /**
20
+ * dsh 出厂自带的 in-box bundle(profile 模板自身安装的层):唯一从「已装
21
+ * 插件清单」中隐藏的名字。社区插件可以合法地发布在官方 scope 下,因此不能
22
+ * 按 scope 整段过滤(dshmarket #28 的结论)。
23
+ */
24
+ export declare const INBOX_BUNDLES: ReadonlySet<string>;
25
+ /**
26
+ * profile 名合法性校验,与 dsh-app-boot 的 resolveProfileDir 一致:拒绝空名、
27
+ * 路径分隔符与保留名,防止 join(home, 'profiles', name) 越界。
28
+ */
29
+ export declare function validateProfileName(profile: string): string;
30
+ /** Profile 目录:$DSH_HOME/profiles/<name>(homeDir 由宿主 resolveDshHome() 解析)。 */
31
+ export declare function resolveProfileDir(homeDir: string, profile: string): string;
32
+ /**
33
+ * 从启动参数解析 profile 名:`--profile <name>` → 缺省 'web'。与宿主 apply 时的
34
+ * resolveProfileName 同源(config 覆盖仅 apply 处有;报告/适配器场景用本函数即可)。
35
+ * argv 参数化便于测试;缺省读当前进程 argv。
36
+ * 宽容语义:缺值 / 值以 '-' 开头 / 校验非法 → 一律回退 'web'。消息构建路径
37
+ * (applyItem 失败分支、补行等)绝不允许因 profile 名抛错破坏非致命 warning;
38
+ * 且 launcher 在启动时已拒绝非法 profile,此分支实际不可达。
39
+ */
40
+ export declare function resolveProfileNameFromArgv(argv?: readonly string[]): string;
41
+ interface ProfileManifest {
42
+ dependencies?: Record<string, string>;
43
+ dsh?: {
44
+ profile?: {
45
+ bundles?: string[];
46
+ };
47
+ };
48
+ }
49
+ /** 读 profile package.json;不可读(未初始化 / 损坏)返回 null。 */
50
+ export declare function readProfileManifest(profileDir: string): ProfileManifest | null;
51
+ /** 写回 profile package.json(2 空格缩进 + 尾换行,与 dsh-app-boot 一致;原子写防半装损坏)。 */
52
+ export declare function writeProfileManifest(profileDir: string, manifest: ProfileManifest): void;
53
+ /** 真实已装的依赖(in-box bundles 过滤掉):name → 声明的版本 spec。 */
54
+ export declare function readInstalled(profileDir: string): Record<string, string>;
55
+ /** node_modules/<name>/package.json 里实际落盘的版本;未装 / 不可读为 null。 */
56
+ export declare function readInstalledVersion(profileDir: string, name: string): string | null;
57
+ /** 包的 package.json 是否声明 dsh.bundle.patch(即它是一个 bundle / profile 层)。 */
58
+ export declare function hasDshBundlePatch(pkgDir: string): boolean;
59
+ /**
60
+ * 维护 dsh.profile.bundles 与已装依赖一致(语义对齐官方 plugin 命令的
61
+ * reconcilePlugins,按「已装状态」而非依赖 diff 判定):
62
+ * - 声明 dsh.bundle.patch 的依赖必须出现在 bundles(追加在依赖顺序尾部);
63
+ * - bundles 中「曾是依赖、但不再是(移除或版本不再声明 patch)」的条目移出;
64
+ * - in-box bundles 不是依赖,永远不碰。
65
+ * 仅在确有变化时写回 package.json。返回是否写回。
66
+ */
67
+ export declare function reconcileBundles(profileDir: string): boolean;
68
+ /**
69
+ * 中止安装后清理半装状态(用户「跳过当前插件」):移除 profile package.json 中的
70
+ * 依赖行 + reconcile bundles + 删 node_modules/<pkg>。
71
+ *
72
+ * 目的:pnpm add 被中途 kill 后,package.json 可能已声明依赖但 node_modules 不完整,
73
+ * 直接启动 DSH 会因缺包而失败。本函数把 manifest 恢复为「该插件未安装」的一致状态,
74
+ * 消除「声明了依赖但没装全」的启动风险。pnpm-lock.yaml 不触碰(运行时不被读取,
75
+ * 下次安装 pnpm 自行对齐)。尽力而为:任何失败不抛错,由调用方记录告警。
76
+ */
77
+ export declare function cleanupAbortedInstall(profileDir: string, pkg: string): void;
78
+ /** 实时读 profile 已装插件清单(先 reconcile bundles,再逐依赖取版本/bundle 属性)。 */
79
+ export declare function listInstalledPlugins(homeDir: string, profile: string): PluginInfo[];
80
+ /** 安装目标:非 registry spec 按 spec 安装;其余按裸包名(npm 最新版)。 */
81
+ export declare function installSpecFor(pkg: string, spec?: string): string;
82
+ /**
83
+ * 重放启动当前宿主进程的 dsh CLI:
84
+ * - process.argv[1] 是 dsh 入口(全局 bin / 源码启动的 bin.ts / bin.js)→ 用
85
+ * 当前 Node 重新执行该入口(execArgv 原样保留,cwd 靠近入口保持相对导入可解析);
86
+ * - 否则退回 PATH 上的 `dsh`(Windows 是 .cmd,需经 shell)。
87
+ */
88
+ export declare function dshArgv(): {
89
+ file: string;
90
+ args: string[];
91
+ cwd: string | undefined;
92
+ viaShell: boolean;
93
+ };
94
+ /** 为一个 argv token 构造 cmd.exe 命令行引用(需要引用的 token 用双引号包裹并加倍内部引号)。 */
95
+ export declare function quoteCmdArg(arg: string): string;
96
+ /** 由 argv 构造 cmd.exe 命令行(仅 Windows 垫片路径使用)。 */
97
+ export declare function cmdCommandLine(argv: readonly string[]): string;
98
+ /**
99
+ * 杀掉子进程整棵进程树:Windows 的 kill() 只终止包装进程、pnpm 子进程还活着,
100
+ * 用 taskkill /T /F;POSIX 子进程独立进程组启动(detached),先 SIGTERM 组、
101
+ * 5 秒后 SIGKILL 兜底。
102
+ */
103
+ export declare function killTree(child: ChildProcess): void;
104
+ /** 一次 dsh plugin 子进程调用的原始结果(M2 失败分类器的输入)。 */
105
+ export interface DshPluginResult {
106
+ exitCode: number | null;
107
+ timedOut: boolean;
108
+ /** 经 AbortSignal 中止(用户跳过/取消):进程树被 kill,非失败语义 */
109
+ aborted?: boolean;
110
+ stdout: string;
111
+ stderr: string;
112
+ /** spawn 自身失败(如 ENOENT);此时 exitCode 固定为 127。 */
113
+ spawnError?: string;
114
+ }
115
+ /**
116
+ * 运行 `dsh plugin --profile <profile> <pluginArgs…>`:
117
+ * cwd=profile 目录、CI 环境、windowsHide、pipe 输出、15 分钟超时杀进程树。
118
+ * 永远 resolve(不 throw),由调用方判定成败。
119
+ *
120
+ * signal:可选 AbortSignal。中止时立即 killTree 杀掉整棵进程树(dsh 包装 + pnpm 孙进程),
121
+ * 结果标记 aborted=true(调用方据此判定「用户跳过/取消」,而非失败)。
122
+ */
123
+ export declare function runDshPlugin(profileDir: string, profile: string, pluginArgs: readonly string[], timeoutMs?: number, signal?: AbortSignal): Promise<DshPluginResult>;
124
+ /**
125
+ * 已识别的 pnpm/dsh CLI 失败模式(纯函数,可独立单测)。
126
+ * 识别语义对齐 dshmarket src/pnpm-compat.ts:dsh 的包装行不提供原因,必须
127
+ * 从 pnpm 的真实诊断文本里认。
128
+ */
129
+ export type DshPluginFailureCode = 'hoist-pattern-diff' | 'adding-to-root' | 'not-a-workspace' | 'release-age-violation' | 'git-build-blocked' | 'fetch-404' | 'transient-network' | 'pnpm-missing' | 'patch-file-missing';
130
+ export interface DshPluginFailure {
131
+ code: DshPluginFailureCode;
132
+ /** 双语可操作消息(同一字符串内 zh / en)。 */
133
+ message: string;
134
+ /** true = 按消息指示重跑(重建 / 直接重试)通常即可恢复;false = 需要人工动作。 */
135
+ recoverable: boolean;
136
+ }
137
+ /**
138
+ * 瞬时网络故障判定:pnpm 的 5xx 拉取码、meta 拉取放弃、以及穿透 dsh 包装的
139
+ * 原始 socket 错误。永久的形态(404、鉴权)刻意排除——重试只会加倍等坏消息。
140
+ */
141
+ export declare function isTransientDshPluginFailure(output: string): boolean;
142
+ /**
143
+ * 把一次失败的 dsh plugin 调用的合并输出映射到已知失败模式。
144
+ * @param output - stdout+stderr 合并文本。
145
+ * @returns 分类结果;未识别返回 null(调用方展示原始摘要)。
146
+ */
147
+ export declare function classifyDshPluginFailure(output: string): DshPluginFailure | null;
148
+ /** 安装失败 → 分类后的双语可读 Error;未识别则保留 stderr 尾部摘要。 */
149
+ export declare function installErrorFor(pkg: string, result: DshPluginResult): Error;
150
+ export {};