@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,219 @@
1
+ /**
2
+ * 防抖文件监听 + 回声抑制(Phase 1 P0-1:自动快照)。
3
+ *
4
+ * 为什么把监听器做成 core 模块而不是直接在宿主里调 fs.watch:
5
+ * 1. **可测**:watch 工厂与定时器都由调用方注入,测试用假实现即可驱动时序,
6
+ * 不需要真文件系统、不依赖 sleep,避免既有的「负载相关偶发失败」类脆弱测试;
7
+ * 2. **回声抑制是一等公民**:恢复/回滚动作自己会写文件,若不抑制就会立刻产生
8
+ * 一个「等于刚写回内容」的自动快照,把重做通道堵死。本模块提供两层抑制:
9
+ * `beginSuppress/endSuppress`(写操作窗口内直接丢弃事件)与 `EchoRegistry`
10
+ * (窗口外按内容指纹识别回声,防「延迟投递的事件」漏网)。
11
+ * 3. **平台差异隔离**:Windows 上被监听目录删除/改名时 FSWatcher 会异步抛 EPERM,
12
+ * 不挂 error 处理器会变成未捕获 'error' 事件直接把进程炸掉——本模块统一接管。
13
+ */
14
+ import path from 'node:path';
15
+ const defaultTimers = {
16
+ setTimeout: (fn, ms) => globalThis.setTimeout(fn, ms),
17
+ clearTimeout: (handle) => { globalThis.clearTimeout(handle); },
18
+ };
19
+ /** 临时文件 / 编辑器残留:默认忽略,避免「保存一次触发多轮快照」 */
20
+ export function isIgnorableFileName(name) {
21
+ if (name === '')
22
+ return true;
23
+ if (name.startsWith('.'))
24
+ return true; // .git / .DS_Store / .swp 等
25
+ if (name.endsWith('~'))
26
+ return true; // 编辑器备份
27
+ if (name.endsWith('.tmp'))
28
+ return true; // 本仓库 atomicWriteFile 的中间产物
29
+ if (name.endsWith('.swp') || name.endsWith('.swo'))
30
+ return true;
31
+ if (/\.\d{6,}$/.test(name))
32
+ return true; // 版本化临时(file.json.1234567)
33
+ return false;
34
+ }
35
+ /**
36
+ * 防抖监听器:把高频文件事件合并成一次 `onFlush`。
37
+ *
38
+ * 生命周期:`start()` 建立监听;`stop()` 关闭全部监听并清掉待发定时器;
39
+ * `start()` 可在 `stop()` 后重新调用(幂等重建——宿主改配置后需要重建监听集)。
40
+ */
41
+ export class DebouncedWatcher {
42
+ options;
43
+ timers;
44
+ handles = [];
45
+ timer = null;
46
+ pending = new Map();
47
+ suppressCount = 0;
48
+ running = false;
49
+ constructor(options) {
50
+ this.options = options;
51
+ this.timers = options.timers ?? defaultTimers;
52
+ }
53
+ get isRunning() {
54
+ return this.running;
55
+ }
56
+ /** 当前抑制深度(>0 表示正在执行会自写文件的操作) */
57
+ get suppressDepth() {
58
+ return this.suppressCount;
59
+ }
60
+ /** 待发事件数(测试与诊断用) */
61
+ get pendingCount() {
62
+ return this.pending.size;
63
+ }
64
+ start() {
65
+ this.stop();
66
+ this.running = true;
67
+ for (const dir of this.options.dirs) {
68
+ try {
69
+ const handle = this.options.watchFactory(dir, (_eventType, filename) => {
70
+ this.onEvent(dir, filename);
71
+ });
72
+ this.handles.push({ dir, handle });
73
+ }
74
+ catch (error) {
75
+ this.options.onError?.(dir, error);
76
+ }
77
+ }
78
+ }
79
+ stop() {
80
+ for (const { handle } of this.handles) {
81
+ try {
82
+ handle.close();
83
+ }
84
+ catch {
85
+ // 关闭失败不影响其余清理
86
+ }
87
+ }
88
+ this.handles = [];
89
+ if (this.timer !== null) {
90
+ this.timers.clearTimeout(this.timer);
91
+ this.timer = null;
92
+ }
93
+ this.pending.clear();
94
+ this.running = false;
95
+ }
96
+ /**
97
+ * 进入抑制窗口:期间产生的文件事件**直接丢弃**。
98
+ * 调用方必须在 finally 里 `endSuppress()`,否则自动快照会永久停摆。
99
+ */
100
+ beginSuppress() {
101
+ this.suppressCount += 1;
102
+ }
103
+ /**
104
+ * 退出抑制窗口:深度归零时**顺带清空待发事件**——那些事件正是被抑制的写操作
105
+ * 自己产生的,若放行会立刻产生一个回声快照(挡住重做)。
106
+ */
107
+ endSuppress() {
108
+ if (this.suppressDepth === 0)
109
+ return;
110
+ this.suppressCount -= 1;
111
+ if (this.suppressDepth === 0) {
112
+ this.pending.clear();
113
+ if (this.timer !== null) {
114
+ this.timers.clearTimeout(this.timer);
115
+ this.timer = null;
116
+ }
117
+ }
118
+ }
119
+ /** 同步便捷包装:抑制窗口内执行 fn,异常也保证退出抑制。 */
120
+ suppressWhile(fn) {
121
+ this.beginSuppress();
122
+ try {
123
+ return fn();
124
+ }
125
+ finally {
126
+ this.endSuppress();
127
+ }
128
+ }
129
+ /** 异步便捷包装(恢复/回滚等长操作)。 */
130
+ async suppressWhileAsync(fn) {
131
+ this.beginSuppress();
132
+ try {
133
+ return await fn();
134
+ }
135
+ finally {
136
+ this.endSuppress();
137
+ }
138
+ }
139
+ onEvent(dir, filename) {
140
+ if (this.suppressDepth > 0)
141
+ return; // 抑制窗口:自写文件不触发快照
142
+ if (filename === null || typeof filename !== 'string')
143
+ return;
144
+ if (isIgnorableFileName(filename))
145
+ return;
146
+ const basename = path.basename(filename);
147
+ if (isIgnorableFileName(basename))
148
+ return;
149
+ // 同目录同文件去重(fs.watch 常对一次保存投递 change+rename 两个事件)
150
+ this.pending.set(`${dir}\u0000${filename}`, { dir, filename });
151
+ this.schedule();
152
+ }
153
+ schedule() {
154
+ if (this.timer !== null)
155
+ this.timers.clearTimeout(this.timer);
156
+ this.timer = this.timers.setTimeout(() => {
157
+ this.timer = null;
158
+ const events = [...this.pending.values()];
159
+ this.pending.clear();
160
+ if (events.length === 0)
161
+ return;
162
+ if (this.suppressDepth > 0)
163
+ return; // 定时器期间被抑制 → 丢弃
164
+ this.options.onFlush(events);
165
+ }, this.options.debounceMs);
166
+ }
167
+ }
168
+ /**
169
+ * 回声登记表:记录「我们刚刚写回的内容指纹」,用于识别监听器收到的
170
+ * 「恢复动作自己的写」这一回声。
171
+ *
172
+ * 与 `beginSuppress/endSuppress` 的分工:抑制窗口覆盖**写操作进行中**的事件;
173
+ * 本表覆盖**窗口之后才被投递**的延迟事件(macOS / 网络盘 / 杀毒软件扫描后
174
+ * 重写文件都可能造成事件晚到)。两条防线缺一不可——竞品的注释与 v0.4.6
175
+ * CHANGELOG 都记录了「macOS 延迟投递的回声快照挡住 redo」这一实际事故。
176
+ */
177
+ export class EchoRegistry {
178
+ hashes = new Map();
179
+ /** 登记一次写回:key 建议 `${scope}:${relPath}`(如 `config:cordis.patch.yml`) */
180
+ record(key, hash) {
181
+ this.hashes.set(key, hash);
182
+ }
183
+ /** 是否仍等于我们写回的内容(= 回声,应忽略) */
184
+ isEcho(key, hash) {
185
+ return this.hashes.get(key) === hash;
186
+ }
187
+ has(key) {
188
+ return this.hashes.has(key);
189
+ }
190
+ get size() {
191
+ return this.hashes.size;
192
+ }
193
+ /**
194
+ * 清空。
195
+ * 语义:**真实变更一旦发生就清空整表**——否则后续对同一路径的合法修改
196
+ * 只要恰好等于某次历史写回内容就会被误判为回声而漏拍。
197
+ */
198
+ clear() {
199
+ this.hashes.clear();
200
+ }
201
+ }
202
+ /**
203
+ * 把事件批按「目录 → 文件名」聚合,便于调用方按关注目录分类。
204
+ * 返回 Map<dir, Set<filename>>(顺序无关,便于集合判定)。
205
+ */
206
+ export function groupEventsByDir(events) {
207
+ const out = new Map();
208
+ for (const e of events) {
209
+ const set = out.get(e.dir) ?? new Set();
210
+ set.add(e.filename);
211
+ out.set(e.dir, set);
212
+ }
213
+ return out;
214
+ }
215
+ /** 事件批里是否包含关注的文件名(跨目录;用于「配置目录里出现了被关注的 basename」判定) */
216
+ export function hasWatchedBasename(events, watched) {
217
+ return events.some((e) => watched.has(path.basename(e.filename)));
218
+ }
219
+ //# sourceMappingURL=watcher.js.map
package/lib/index.d.ts ADDED
@@ -0,0 +1,238 @@
1
+ /**
2
+ * dsh-config-manager — host half.
3
+ *
4
+ * Mounts the backup / export / import engine (src/core Exporter + Importer
5
+ * three-stage flow) behind the `/api/dsh-config-manager/*` route family that
6
+ * the browser half (`./client`) calls, and wraps the real DSH host services
7
+ * into the engine's `HostContext` facade (src/core/types.ts):
8
+ *
9
+ * ctx.settings -> SettingsFacade (@deepseek-ai/dsh-settings)
10
+ * ctx.credentials -> CredentialsFacade (@deepseek-ai/dsh-credentials)
11
+ * ctx.plugins -> PluginsFacade (官方 dsh plugin CLI 通道 + profile 文件,
12
+ * 见 src/core/plugin-cli.ts)
13
+ * ctx.workspaceRegistry -> WorkspaceFacade (@deepseek-ai/dsh-workspace)
14
+ * ~/.dsh/cordis.patch.yml-> PatchFileFacade (js-yaml)
15
+ * $DSH_HOME files -> FileSystemFacade (node:fs, home-relative)
16
+ * resolveDshHome() -> homeDir (@deepseek-ai/dsh-home-paths)
17
+ *
18
+ * Security posture (mirrors the verified @linxin666/dsh-ssh@0.1.12 routes):
19
+ * - every route carries the loopback-only + same-origin trust fence
20
+ * (isLoopbackRequest); LAN-exposed deployments never serve these endpoints;
21
+ * - uploads/exported ZIPs are staged under $DSH_HOME/dsh-config-manager/{tmp,exports}
22
+ * and every `path`/`zipPath` reference is confined to those roots;
23
+ * - the encryption password is in-memory only: used to derive the AES-256-GCM
24
+ * key for secrets.enc, never written to any file, manifest, or log;
25
+ * - the import execute endpoint refuses to run without `confirm: true`
26
+ * (core ImportNotConfirmedError safety valve).
27
+ *
28
+ * Optional services are read with ctx.get() at call time (never injected), so
29
+ * the engine keeps working in profiles without the web-only workspace
30
+ * service; hard dependencies are the core `settings`/`credentials` services
31
+ * present in every profile. Plugin install/list no longer depend on the
32
+ * web-only pluginMarketplace/pluginInventory services: both go through the
33
+ * official `dsh plugin --profile <name>` CLI (pnpm forwarder) and read the
34
+ * profile's package.json / node_modules directly.
35
+ */
36
+ import type { ServerResponse } from 'node:http';
37
+ import type { Context } from '@deepseek-ai/cordis';
38
+ import type { CredentialProvider } from '@deepseek-ai/dsh-credentials';
39
+ import { type RestorePlan, type RestoreReport } from './core/restore.ts';
40
+ import type { MsgFunc } from './core/messages.ts';
41
+ import { runDshPlugin } from './core/plugin-cli.ts';
42
+ import type { PatchFileFacade, PluginInfo, PluginsFacade } from './core/types.ts';
43
+ import type { SyncConfig } from './sync/sync-config.ts';
44
+ import type { ConfiguredSecretPatterns } from './security/secret-scanner.ts';
45
+ import type { SectionId } from './schema/types.ts';
46
+ /** Stable cordis plugin name — must match the cordis.patch.yml row id. */
47
+ export declare const name = "config-manager";
48
+ /** Services required before the engine can mount (present in every profile). */
49
+ export declare const inject: string[];
50
+ /**
51
+ * 内置 GitHub OAuth App 的 client_id(「使用 GitHub 登录」device flow 缺省值)。
52
+ * Client ID 是公开标识(GitHub 官方明确非机密):内置后所有安装者开箱即用,
53
+ * 无需各自注册/配置 OAuth App;token 仍按用户私有(各自授权、各自存 credentials)。
54
+ * 插件配置的 githubClientId 优先于本默认值(换自有 App 时覆盖)。
55
+ */
56
+ export declare const DEFAULT_GITHUB_CLIENT_ID = "Ov23liq4i7n8UsylGRfb";
57
+ /** Plugin config (composition entry); the loader applies it as-is. */
58
+ export interface Config {
59
+ /** Master switch; defaults to true. */
60
+ enabled?: boolean;
61
+ /** Data root override; defaults to $DSH_HOME/dsh-config-manager. */
62
+ dataDir?: string;
63
+ /** 管理的 profile 名(插件依赖读写/安装目标);缺省取启动参数 --profile,再缺省 'web'。 */
64
+ profile?: string;
65
+ /**
66
+ * GitHub OAuth App 的 client_id(「使用 GitHub 登录」device flow)。
67
+ * 缺省使用内置 DEFAULT_GITHUB_CLIENT_ID(公开标识,开箱即用);
68
+ * 显式配置可覆盖(换自有 OAuth App 时)。
69
+ */
70
+ githubClientId?: string;
71
+ /**
72
+ * GitHub OAuth App 的 client_secret(confidential app 必需;public app 可省略)。
73
+ * 只存在于宿主进程:device flow 轮询时由宿主直接发送给 GitHub,绝不回传浏览器/日志。
74
+ */
75
+ githubClientSecret?: string;
76
+ /**
77
+ * pluginFiles 分区:额外白名单文件(相对 ~/.dsh 根的单文件名或子路径)。
78
+ * 与默认白名单(dsh-ssh.json、pet.json)合并;用于精确指定要随导出携带的插件配置文件。
79
+ */
80
+ pluginFiles?: string[];
81
+ /**
82
+ * pluginFiles 分区:约定的插件配置目录(相对 ~/.dsh 根,如 'plugin-config')。
83
+ * 导出时递归收集该目录下所有文件(按相对 ~/.dsh 根的路径写回),实现「往目录放文件即自动随备份携带」。
84
+ */
85
+ pluginFilesDir?: string;
86
+ /**
87
+ * F2 个人隐私规则(对齐 dsh-packer config.personalPatterns):个人化敏感字段名 /
88
+ * 引用字段 / 值形状模式,由部署者注入(个人昵称、本机用户名等),不进开源代码。
89
+ * 未配置时扫描器行为与默认完全一致。
90
+ */
91
+ personalPatterns?: ConfiguredSecretPatterns;
92
+ }
93
+ /**
94
+ * 同步 token 的 DSH credentials 引用名(POSIX env-var 形态,满足 CredentialRef 品牌要求)。
95
+ * token 只经 credentialRef 读写(写入由请求体触发,读取在每次 git 网络操作时 resolve),
96
+ * 永不进 repoUrl / argv / commit / 同步文件 / 日志。
97
+ */
98
+ export declare const SYNC_CREDENTIAL_REF = "DSH_CONFIG_MANAGER_SYNC_TOKEN";
99
+ /**
100
+ * WebDAV 通道口令的独立 DSH credentials 引用(与 git token 槽位分离)。
101
+ * 口令只经 credentialRef 读写(写入由请求体触发,读取在每次 WebDAV 网络操作时
102
+ * by WebDavTransport 经注入的 getPassword() resolve),永不进 URL / 请求头 / 日志。
103
+ */
104
+ export declare const SYNC_WEBDAV_CREDENTIAL_REF = "DSH_CONFIG_MANAGER_SYNC_WEBDAV_PASSWORD";
105
+ /** 包名 → patch 行 id slug(仿 marketplace ensureRow):去 @、非法字符→-、连续-合并、去首尾-。 */
106
+ export declare function slugOf(name: string): string;
107
+ /** 某 patch 行(raw)是否激活了指定包名(兼容单行与 insert 块成员)。 */
108
+ export declare function patchRowActivates(raw: unknown, name: string): boolean;
109
+ /**
110
+ * 非 bundle 插件安装成功后,幂等补 profile cordis.patch.yml 激活行
111
+ * ({id: pm-<slug>, name: <pkg>},仿 marketplace ensureRow)。bundle 包不写行
112
+ * (CLI 的 reconcile 已维护 dsh.profile.bundles)。
113
+ */
114
+ export declare function ensureActivationRow(patchFile: PatchFileFacade, pkgDir: string, pkg: string): Promise<void>;
115
+ /**
116
+ * Plugins facade:官方 dsh plugin CLI 通道(任何 profile 可用)+ profile 文件
117
+ * 实时清单 + 非 bundle 插件激活行幂等补写。不再依赖 web 专用
118
+ * pluginMarketplace / pluginInventory 服务。
119
+ *
120
+ * 导出 + runner 可注入:M5 单测用 mock runner 验证「无 marketplace 时 install
121
+ * 走 CLI 通道」的行为契约,不触发真实子进程;生产路径默认参数不变。
122
+ */
123
+ export declare class DshPluginsFacade implements PluginsFacade {
124
+ private readonly homeDir;
125
+ private readonly profile;
126
+ private readonly patchFile;
127
+ private readonly msg;
128
+ private readonly runner;
129
+ constructor(homeDir: string, profile: string, patchFile: PatchFileFacade, runner?: typeof runDshPlugin, msg?: MsgFunc);
130
+ listInstalled(): Promise<PluginInfo[]>;
131
+ install(pkg: string, spec?: string, signal?: AbortSignal): Promise<{
132
+ needsRestart: boolean;
133
+ }>;
134
+ }
135
+ /** 同步路由可预期的请求级错误(status 缺省 400;引擎/传输失败走 500) */
136
+ export declare class SyncRouteError extends Error {
137
+ readonly status: number;
138
+ constructor(message: string, status?: number);
139
+ }
140
+ /** 同步路由错误统一出口:SyncRouteError 用其 status,其余 500(GitTransport 错误消息已脱敏) */
141
+ export declare function writeSyncRouteError(res: ServerResponse, error: unknown): void;
142
+ /** parseSyncBody 的凭据写入依赖(只用到 set;测试可注入内存 mock)。 */
143
+ export interface ParseSyncBodyDeps {
144
+ credentials: Pick<CredentialProvider, 'set'>;
145
+ }
146
+ /**
147
+ * 解析同步请求体,按 transport 分支返回归一化的 SyncConfig(可辨识联合,schemaVersion=2)。
148
+ * 请求体形状(flat,M4 契约):
149
+ * - git: { transport:'git', repoUrl, token? } —— token 非空写 SYNC_CREDENTIAL_REF;
150
+ * git 可执行文件固定使用系统 PATH 中的 git(不再接受自定义 gitBin)。
151
+ * - webdav: { transport:'webdav', url, username?, password? } —— password 非空写 SYNC_WEBDAV_CREDENTIAL_REF。
152
+ * 返回值不含任何 secret(password/token 只进 credentials,永不回传/落同步文件)。
153
+ */
154
+ export declare function parseSyncBody(body: Record<string, unknown>, deps: ParseSyncBodyDeps): Promise<SyncConfig>;
155
+ /** 由 SyncConfig 合成 WebDAV 通道 baseUrl(webdav.url,尾部规范化带 '/';git 通道返回 '')。 */
156
+ export declare function webdavBaseUrl(cfg: SyncConfig): string;
157
+ /**
158
+ * 补全 webdav 配置缺失的 username(从持久化配置回填;纯函数,不修改入参)。
159
+ * 语义与 password 一致:请求未带 username(表单留空/挂载自动加载)→ 沿用已保存的值;
160
+ * 请求显式带 username → 原样保留(用户新输入优先)。非 webdav / 无持久化 → 原样返回。
161
+ */
162
+ export declare function mergePersistedWebDavUsername(cfg: SyncConfig, persisted: SyncConfig | null): SyncConfig;
163
+ /**
164
+ * 解析 push 请求体的分区选择(sections)——「高级/自定义导出」模式负载。
165
+ * - 缺省 / 非数组 / 空数组 → undefined(= 全部 portable 推荐分区,即「默认/快速导出」模式);
166
+ * - 元素必须是 knownIds(已知 adapter id)中的非空字符串,非法 → SyncRouteError(不静默吞错);
167
+ * - 返回去重后的数组(保持原顺序;重复分区不做重复导出)。
168
+ */
169
+ export declare function extractSyncSections(body: Record<string, unknown>, knownIds: ReadonlySet<string>): SectionId[] | undefined;
170
+ /** POST /restore 请求体校验(纯函数;snapshotId 拒绝路径分隔符防 join 越界)。 */
171
+ export type BuildRestoreBodyResult = {
172
+ ok: true;
173
+ value: {
174
+ snapshotId: string;
175
+ dryRun: boolean;
176
+ };
177
+ } | {
178
+ ok: false;
179
+ error: string;
180
+ };
181
+ export declare function buildRestoreBody(body: unknown): BuildRestoreBodyResult;
182
+ /**
183
+ * 宿主侧恢复动作执行器(真实执行 restore 计划):
184
+ * 整文件/文件还原与删除走 ctx.fs(home-relative facade,越界由 facade 再拦一道),
185
+ * blob 读取与 pre-restore 副本走快照目录(node fs),插件卸载走官方 dsh plugin CLI。
186
+ */
187
+ export interface RestoreExecutor {
188
+ /** 读快照目录内 blob(相对 snapshotDir) */
189
+ readBlob(blobPath: string): Promise<Uint8Array>;
190
+ /** 把当前 home 文件内容复制到 <snapshotDir>/pre-restore/(覆盖/删除前的双保险) */
191
+ savePreRestore(relPath: string): Promise<void>;
192
+ existsHome(relPath: string): Promise<boolean>;
193
+ writeHome(relPath: string, data: Uint8Array): Promise<void>;
194
+ removeHome(relPath: string): Promise<void>;
195
+ /** 卸载插件(官方通道);失败返回 { ok:false, message } */
196
+ uninstallPlugin(name: string): Promise<{
197
+ ok: boolean;
198
+ message?: string;
199
+ }>;
200
+ }
201
+ /**
202
+ * 按计划执行恢复动作(纯执行器;逐项 try/catch 不拖垮其余),
203
+ * 返回与 CLI 一致的诚实报告。顺序 = 计划顺序(整文件 → 插件 → file 补偿)。
204
+ * @param onAction - 每项动作执行回调(宿主路由埋点:更新 RunRegistry 进度;
205
+ * index/1-based、total=计划动作数、detail=动作描述)
206
+ */
207
+ export declare function executeRestorePlan(plan: RestorePlan, exec: RestoreExecutor, onAction?: (info: {
208
+ index: number;
209
+ total: number;
210
+ detail: string;
211
+ }) => void): Promise<RestoreReport>;
212
+ /**
213
+ * GitHub 凭据「缺失或失效」判定(issue #29):`no_token`(credentials 里从未配置 token)与
214
+ * `unauthorized`(401,token 过期/被撤销)对用户都是同一个「未登录」,必须走同一分支——
215
+ * 否则 `no_token` 会落到 500,UI 把「未登录」渲染成「登录状态读取失败」的误导性横幅。
216
+ * 其余分类(network_error / rate_limited / server_error / validation_failed / fork_timeout…)
217
+ * 是真实故障,仍按 500 暴露,绝不伪装成「未登录」。
218
+ */
219
+ export declare function isGitHubAuthMissing(error: unknown): boolean;
220
+ /** /status 的插件诊断位(issue #28)。仅回非敏感元信息:目录、profile 名、计数。 */
221
+ export interface PluginDiagnostics {
222
+ homeDir: string;
223
+ profile: string;
224
+ /** profile 目录的 package.json 是否可读(不可读 → 清单必然为空) */
225
+ profileManifestReadable: boolean;
226
+ /** 插件清单来源 = package.json 的 dependencies 里非 in-box 的包 */
227
+ installedPluginCount: number;
228
+ installedPluginNames: string[];
229
+ /** dsh.profile.bundles 声明(非空即「替换默认插件栈」) */
230
+ bundles: string[];
231
+ }
232
+ /**
233
+ * Mount the config-manager engine: host context, adapters, and the
234
+ * /api/dsh-config-manager routes (when a webServer is present).
235
+ * @param ctx - host plugin context carrying settings/credentials/webServer.
236
+ * @param config - resolved plugin config.
237
+ */
238
+ export declare function apply(ctx: Context, config?: Config): void;