@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,71 @@
1
+ /**
2
+ * self 分区 adapter(插件自身配置,设计「self 分区」):
3
+ * 数据源 = $DSH_HOME/dsh-config-manager/ 下的插件自身配置文件(白名单收集,非递归):
4
+ * - sync/sync-config.json 同步通道配置(git repoUrl / webdav url+username;凭据值走 credentials 槽位,不含 secret)
5
+ * - sync/sync-autosync.json 自动同步调度配置
6
+ * - sync/sync-selection.json 同步分区选择(默认/高级模式 + 勾选分区)
7
+ * - sync/ui-prefs.json 插件 UI 偏好(如上次选择的同步通道;从 localStorage 迁入)
8
+ *
9
+ * 排除项:sync/sync-history.json(执行记录,属数据非配置)、market/cache/(缓存)、
10
+ * snapshots/(快照)、tmp/ exports/(临时/导出产物)——只备份「配置」,不备份数据。
11
+ *
12
+ * 实现:继承 FileCollectionAdapter 复用 analyzeImport/applyItem/validate(幂等 hash 比对、
13
+ * 快照/回滚路径一致),仅覆写 export() 为白名单收集(self 目录内存在大量非配置子目录,
14
+ * 不能像 skills/sessions 那样整体递归)。
15
+ *
16
+ * relativePath 一律是「相对 baseDir」的路径(如 sync/sync-config.json),与
17
+ * FileCollectionAdapter 的基准目录语义一致:导入时按 path.join(baseDir, rel) 写回
18
+ * $DSH_HOME/dsh-config-manager/<rel>;ZIP 内位于 self/<rel>。
19
+ *
20
+ * 安全不变量:配置文件本身不含凭据值(同步凭据走 DSH credentials 槽位引用),
21
+ * 且文件类分区不进 SecretScanner(与 pluginFiles/skills 同语义)。
22
+ */
23
+ import path from 'node:path';
24
+ import { msgOf } from '../core/messages.js';
25
+ import { sha256Hex } from '../utils/hashing.js';
26
+ import { FileCollectionAdapter } from './file-collection.js';
27
+ /** self 分区白名单文件(相对 baseDir,即 $DSH_HOME/dsh-config-manager/)。 */
28
+ export const SELF_CONFIG_FILES = [
29
+ 'sync/sync-config.json',
30
+ 'sync/sync-autosync.json',
31
+ 'sync/sync-selection.json',
32
+ 'sync/ui-prefs.json',
33
+ // P0-④:导出产物备注清单(exports/.backup-notes.json)——随 self 分区迁移,
34
+ // 换机器后备份列表仍能看到手动导出时填写的备注
35
+ 'exports/.backup-notes.json',
36
+ ];
37
+ export class SelfAdapter extends FileCollectionAdapter {
38
+ id = 'self';
39
+ displayName = 'Plugin Self Config';
40
+ defaultIncluded = true;
41
+ portability = 'portable';
42
+ /** 插件自身配置目录(相对 homeDir;宿主按 dataDir 解析注入,缺省 dsh-config-manager) */
43
+ baseDir;
44
+ constructor(baseDir = 'dsh-config-manager') {
45
+ super();
46
+ this.baseDir = baseDir;
47
+ }
48
+ /** 白名单收集:只导出配置类文件(存在才收),不递归(排除快照/历史/缓存/临时产物)。
49
+ * relativePath 产出相对 baseDir 的路径(与 analyzeImport/applyItem 的 path.join(baseDir, ref) 匹配)。 */
50
+ async export(ctx, _options) {
51
+ const files = [];
52
+ const warnings = [];
53
+ for (const rel of SELF_CONFIG_FILES) {
54
+ // ctx.fs.readFile 语义 = 相对 homeDir 的完整路径 → 拼接 baseDir;产出仍为相对 baseDir
55
+ const data = await ctx.fs.readFile(path.join(this.baseDir, rel)).catch(() => null);
56
+ if (data === null)
57
+ continue; // 未创建过的配置文件跳过(如从未配置市场/同步)
58
+ files.push({ relativePath: rel, data, contentHash: sha256Hex(data) });
59
+ }
60
+ if (files.length === 0) {
61
+ warnings.push(msgOf(ctx)('adapter.dirEmpty', { type: this.displayName }));
62
+ }
63
+ return {
64
+ sectionId: this.id,
65
+ data: { version: 1, files },
66
+ counts: { files: files.length },
67
+ warnings,
68
+ };
69
+ }
70
+ }
71
+ //# sourceMappingURL=self.js.map
@@ -0,0 +1,14 @@
1
+ /**
2
+ * sessions 分区 adapter(默认关,设计 §3.3/§15):
3
+ * 数据源 = ~/.dsh/sessions/<projectKey>/<sessionId>/…(zstd jsonl,含敏感信息)。
4
+ * defaultIncluded=false:Quick Export 不包含,用户显式勾选才导出(v1 文件级复制)。
5
+ * 研究报告 §4.9:DSH 无会话批量导出 API,逐会话文件复制是唯一通道。
6
+ */
7
+ import { FileCollectionAdapter } from './file-collection.ts';
8
+ export declare class SessionsAdapter extends FileCollectionAdapter {
9
+ readonly id: 'sessions';
10
+ readonly displayName = "Sessions";
11
+ readonly defaultIncluded = false;
12
+ readonly portability: 'deviceSpecific';
13
+ readonly baseDir = "sessions";
14
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * sessions 分区 adapter(默认关,设计 §3.3/§15):
3
+ * 数据源 = ~/.dsh/sessions/<projectKey>/<sessionId>/…(zstd jsonl,含敏感信息)。
4
+ * defaultIncluded=false:Quick Export 不包含,用户显式勾选才导出(v1 文件级复制)。
5
+ * 研究报告 §4.9:DSH 无会话批量导出 API,逐会话文件复制是唯一通道。
6
+ */
7
+ import { FileCollectionAdapter } from './file-collection.js';
8
+ export class SessionsAdapter extends FileCollectionAdapter {
9
+ id = 'sessions';
10
+ displayName = 'Sessions';
11
+ defaultIncluded = false;
12
+ portability = 'deviceSpecific';
13
+ baseDir = 'sessions';
14
+ }
15
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1,28 @@
1
+ import type { MsgFunc } from '../core/messages.ts';
2
+ import type { NamespaceRecord, SettingsSection } from '../schema/types.ts';
3
+ import type { ApplyResult, ConfigAdapter, ExportOptions, ExportSection, HostContext, ImportContext, PlanItem, ValidationResult } from '../core/types.ts';
4
+ /** namespace 清单提供者:宿主从 settings.yaml 顶层 key / 插件注册表获得 */
5
+ export type NamespaceProvider = (ctx: HostContext) => Promise<string[]> | string[];
6
+ export declare function resolveNamespaces(namespaces: string[] | NamespaceProvider, ctx: HostContext): Promise<string[]>;
7
+ /** 批量读取 namespace 的 redacted 记录(settings/ui 共用;单项失败跳过并告警) */
8
+ export declare function collectNamespaceRecords(ctx: HostContext, names: string[], warnings: string[]): Promise<Record<string, NamespaceRecord>>;
9
+ /** 值是否“空”(目标已注册但从未配置 → 视为待初始化,Create 而非 Conflict) */
10
+ export declare function isEmptyValue(v: unknown): boolean;
11
+ /** 对比导入记录与目标当前值:不存在 → Create;一致 → Skip;不同 → Conflict;
12
+ * 目标端 describe 抛错(命名空间未注册:提供它的插件在目标未激活/未安装)→ MissingDependency(§15 依赖检测),
13
+ * 此时 Create/Update 必然失败,标记为“需注意”让导入继续,而不是整体失败。纯计算,零写入。 */
14
+ export declare function planNamespaceItems(data: Record<string, NamespaceRecord>, adapter: 'settings' | 'ui', ctx: ImportContext): Promise<PlanItem[]>;
15
+ /** 写入单个 namespace(settings/ui 共用):读时锁 + expectedRevision 乐观锁,防覆盖并发修改 */
16
+ export declare function applyNamespaceItem(item: PlanItem, sectionId: 'settings' | 'ui', ctx: ImportContext): Promise<ApplyResult>;
17
+ export declare class SettingsAdapter implements ConfigAdapter<SettingsSection> {
18
+ readonly id: 'settings';
19
+ readonly displayName = "Settings";
20
+ readonly defaultIncluded = true;
21
+ readonly portability: 'portable';
22
+ private readonly namespaces;
23
+ constructor(namespaces?: string[] | NamespaceProvider);
24
+ export(ctx: HostContext, _options: ExportOptions): Promise<ExportSection<SettingsSection>>;
25
+ analyzeImport(data: SettingsSection, ctx: ImportContext): Promise<PlanItem[]>;
26
+ applyItem(item: PlanItem, ctx: ImportContext): Promise<ApplyResult>;
27
+ validate(data: SettingsSection, msg?: MsgFunc): Promise<ValidationResult>;
28
+ }
@@ -0,0 +1,165 @@
1
+ /**
2
+ * settings 分区 adapter(设计 §3.3/§4.1/§4.2):
3
+ * 数据源 = ~/.dsh/settings.yaml 中「非 UI 类」namespace(经 ctx.settings.describe({redactSecrets:true}))。
4
+ *
5
+ * 说明:DSH settings 服务没有「枚举全部 namespace」的 API(研究报告 §3.2),
6
+ * 因此 namespace 清单由宿主注入(真实实现可从 settings.yaml 顶层 key 解析)。
7
+ * 默认只导出名单内且不属于 UI 类(isUiNamespace)的 namespace,与 ui adapter 互斥并集 = 全部设置。
8
+ */
9
+ import { isDeepStrictEqual } from 'node:util';
10
+ import { msgOf, zhMsg } from '../core/messages.js';
11
+ import { isUiNamespace } from './ui.js';
12
+ export async function resolveNamespaces(namespaces, ctx) {
13
+ return typeof namespaces === 'function' ? namespaces(ctx) : namespaces;
14
+ }
15
+ /** 批量读取 namespace 的 redacted 记录(settings/ui 共用;单项失败跳过并告警) */
16
+ export async function collectNamespaceRecords(ctx, names, warnings) {
17
+ const namespaces = {};
18
+ for (const name of names) {
19
+ try {
20
+ const info = await ctx.settings.describe(name, { redactSecrets: true });
21
+ namespaces[name] = {
22
+ value: info.value,
23
+ base: info.base,
24
+ revision: info.revision,
25
+ applies: info.applies,
26
+ secrets: info.secrets,
27
+ };
28
+ }
29
+ catch (err) {
30
+ warnings.push(msgOf(ctx)('adapter.settingsNsReadFailed', { name, reason: err instanceof Error ? err.message : String(err) }));
31
+ }
32
+ }
33
+ return namespaces;
34
+ }
35
+ /** 值是否“空”(目标已注册但从未配置 → 视为待初始化,Create 而非 Conflict) */
36
+ export function isEmptyValue(v) {
37
+ if (v === undefined || v === null)
38
+ return true;
39
+ if (typeof v === 'object')
40
+ return Object.keys(v).length === 0;
41
+ return false;
42
+ }
43
+ /** 对比导入记录与目标当前值:不存在 → Create;一致 → Skip;不同 → Conflict;
44
+ * 目标端 describe 抛错(命名空间未注册:提供它的插件在目标未激活/未安装)→ MissingDependency(§15 依赖检测),
45
+ * 此时 Create/Update 必然失败,标记为“需注意”让导入继续,而不是整体失败。纯计算,零写入。 */
46
+ export async function planNamespaceItems(data, adapter, ctx) {
47
+ const msg = ctx.msg;
48
+ const items = [];
49
+ for (const [name, rec] of Object.entries(data)) {
50
+ let current = null;
51
+ let targetUnavailable = false;
52
+ try {
53
+ current = await ctx.target.settings.describe(name, { redactSecrets: true });
54
+ }
55
+ catch {
56
+ // 目标连 describe 都失败 → 命名空间未注册(缺少提供插件)或目标不可读:
57
+ // 不能假定“不存在就创建”(replace 会同样失败),按依赖缺失处理。
58
+ targetUnavailable = true;
59
+ }
60
+ const id = `${adapter}:${name}`;
61
+ if (targetUnavailable) {
62
+ items.push({
63
+ id, kind: 'MissingDependency', adapter,
64
+ description: msg('adapter.settingsUnregistered', { ns: name }),
65
+ severity: 'warning', target: { adapter, ref: name },
66
+ });
67
+ }
68
+ else if (current === null || isEmptyValue(current.value)) {
69
+ // 目标已注册但从未配置(空值)→ 初始化(Create)
70
+ items.push({
71
+ id, kind: 'Create', adapter, description: msg('adapter.settingsCreate', { name }), severity: 'info',
72
+ target: { adapter, ref: name },
73
+ });
74
+ }
75
+ else if (isDeepStrictEqual(current.value, rec.value)) {
76
+ items.push({ id, kind: 'Skip', adapter, description: msg('adapter.settingsSame', { name }), severity: 'info' });
77
+ }
78
+ else {
79
+ items.push({
80
+ id, kind: 'Conflict', adapter, description: msg('adapter.settingsDiff', { name }),
81
+ detail: `current=${JSON.stringify(current.value)} imported=${JSON.stringify(rec.value)}`.slice(0, 200),
82
+ severity: 'warning', target: { adapter, ref: name },
83
+ });
84
+ }
85
+ }
86
+ return items;
87
+ }
88
+ /** 写入单个 namespace(settings/ui 共用):读时锁 + expectedRevision 乐观锁,防覆盖并发修改 */
89
+ export async function applyNamespaceItem(item, sectionId, ctx) {
90
+ const ref = item.target?.ref;
91
+ if (!ref)
92
+ return { ok: false, message: ctx.msg('adapter.missingTargetRef') };
93
+ const data = ctx.sections.get(sectionId);
94
+ const rec = data?.namespaces?.[ref];
95
+ if (!rec)
96
+ return { ok: false, message: ctx.msg('adapter.namespaceMissing', { ref }) };
97
+ // 写入前读当前 revision 作为 expectedRevision(读时锁):目标不存在(Create)则不带锁提交
98
+ let expected;
99
+ try {
100
+ expected = (await ctx.target.settings.describe(ref, { redactSecrets: true })).revision;
101
+ }
102
+ catch {
103
+ expected = undefined;
104
+ }
105
+ await ctx.target.settings.replace(ref, rec.value, expected);
106
+ return { ok: true };
107
+ }
108
+ export class SettingsAdapter {
109
+ id = 'settings';
110
+ displayName = 'Settings';
111
+ defaultIncluded = true;
112
+ portability = 'portable';
113
+ namespaces;
114
+ constructor(namespaces = []) {
115
+ this.namespaces = namespaces;
116
+ }
117
+ async export(ctx, _options) {
118
+ const warnings = [];
119
+ const all = await resolveNamespaces(this.namespaces, ctx);
120
+ const nonUi = all.filter((n) => !isUiNamespace(n));
121
+ if (nonUi.length === 0)
122
+ warnings.push(msgOf(ctx)('adapter.noSettingsNamespaces'));
123
+ const namespaces = await collectNamespaceRecords(ctx, nonUi, warnings);
124
+ return {
125
+ sectionId: 'settings',
126
+ data: { version: 1, namespaces },
127
+ counts: { namespaces: Object.keys(namespaces).length },
128
+ warnings,
129
+ };
130
+ }
131
+ async analyzeImport(data, ctx) {
132
+ return planNamespaceItems(data.namespaces, 'settings', ctx);
133
+ }
134
+ async applyItem(item, ctx) {
135
+ return applyNamespaceItem(item, 'settings', ctx);
136
+ }
137
+ async validate(data, msg = zhMsg) {
138
+ const issues = [];
139
+ if (data === null || typeof data !== 'object') {
140
+ return { valid: false, issues: [{ path: '$', message: msg('adapter.validate.object', { subject: 'settings' }), severity: 'error' }] };
141
+ }
142
+ if (data.version !== 1) {
143
+ issues.push({ path: 'version', message: msg('adapter.validate.version', { value: String(data.version) }), severity: 'error' });
144
+ }
145
+ if (data.namespaces === null || typeof data.namespaces !== 'object') {
146
+ issues.push({ path: 'namespaces', message: msg('adapter.validate.missingObject', { subject: 'namespaces' }), severity: 'error' });
147
+ }
148
+ else {
149
+ for (const [name, rec] of Object.entries(data.namespaces)) {
150
+ if (rec === null || typeof rec !== 'object') {
151
+ issues.push({ path: `namespaces.${name}`, message: msg('adapter.validate.recordObject', { subject: 'namespace' }), severity: 'error' });
152
+ continue;
153
+ }
154
+ if (typeof rec.revision !== 'number') {
155
+ issues.push({ path: `namespaces.${name}.revision`, message: msg('adapter.validate.number', { subject: 'revision' }), severity: 'error' });
156
+ }
157
+ if (!('value' in rec)) {
158
+ issues.push({ path: `namespaces.${name}.value`, message: msg('adapter.validate.missingValue'), severity: 'error' });
159
+ }
160
+ }
161
+ }
162
+ return { valid: issues.filter((i) => i.severity === 'error').length === 0, issues };
163
+ }
164
+ }
165
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1,13 @@
1
+ /**
2
+ * skills 分区 adapter(设计 §3.3):
3
+ * 数据源 = ~/.dsh/skills/(flat .md + 目录 bundle;dsh-skill-filesystem 发现)。
4
+ * 仅迁移用户主目录技能;~/.agents/skills、项目级技能默认不迁(研究报告 §2.2)。
5
+ */
6
+ import { FileCollectionAdapter } from './file-collection.ts';
7
+ export declare class SkillsAdapter extends FileCollectionAdapter {
8
+ readonly id: 'skills';
9
+ readonly displayName = "Skills";
10
+ readonly defaultIncluded = true;
11
+ readonly portability: 'portable';
12
+ readonly baseDir = "skills";
13
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * skills 分区 adapter(设计 §3.3):
3
+ * 数据源 = ~/.dsh/skills/(flat .md + 目录 bundle;dsh-skill-filesystem 发现)。
4
+ * 仅迁移用户主目录技能;~/.agents/skills、项目级技能默认不迁(研究报告 §2.2)。
5
+ */
6
+ import { FileCollectionAdapter } from './file-collection.js';
7
+ export class SkillsAdapter extends FileCollectionAdapter {
8
+ id = 'skills';
9
+ displayName = 'Skills';
10
+ defaultIncluded = true;
11
+ portability = 'portable';
12
+ baseDir = 'skills';
13
+ }
14
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1,125 @@
1
+ import { type Logger } from '../utils/logger.ts';
2
+ import { sha256Hex } from '../utils/hashing.ts';
3
+ import type { CredentialsFacade, FileSystemFacade, HostContext, ImportContext, NamespaceInfo, PatchFileFacade, PluginInfo, PluginsFacade, SettingsFacade, Snapshot, SnapshotStore, WorkspaceFacade } from '../core/types.ts';
4
+ import type { Manifest, WorkspaceRecord } from '../schema/types.ts';
5
+ export declare class MemFs implements FileSystemFacade {
6
+ files: Map<string, Uint8Array<ArrayBufferLike>>;
7
+ /** 可选(issue #37):详细的链接遍历。测试按需注入;缺省走 listRecursive 回退路径。 */
8
+ listRecursiveDetailed?: FileSystemFacade['listRecursiveDetailed'];
9
+ private readonly homeDir;
10
+ constructor(homeDir: string);
11
+ private key;
12
+ readFile(relPath: string): Promise<Uint8Array>;
13
+ writeFile(relPath: string, data: Uint8Array): Promise<void>;
14
+ exists(relPath: string): Promise<boolean>;
15
+ copy(from: string, to: string): Promise<void>;
16
+ remove(relPath: string): Promise<void>;
17
+ listRecursive(dir: string): Promise<string[]>;
18
+ mkdir(): Promise<void>;
19
+ }
20
+ /** ns.set 时自动注册(有值即视为对应插件已激活;对齐真实 dsh-settings 的注册语义) */
21
+ declare class AutoRegisterMap extends Map<string, {
22
+ value: unknown;
23
+ base?: unknown;
24
+ revision: number;
25
+ applies?: string[];
26
+ secrets: {
27
+ path: string[];
28
+ set: boolean;
29
+ }[];
30
+ }> {
31
+ private readonly registered;
32
+ constructor(registered: Set<string>);
33
+ set(key: string, value: {
34
+ value: unknown;
35
+ base?: unknown;
36
+ revision: number;
37
+ applies?: string[];
38
+ secrets: {
39
+ path: string[];
40
+ set: boolean;
41
+ }[];
42
+ }): this;
43
+ }
44
+ export declare class MemSettings implements SettingsFacade {
45
+ /** 已注册命名空间(对齐真实 dsh-settings:插件激活时注册;未注册的 describe/replace 抛错) */
46
+ registered: Set<string>;
47
+ /** 有值的命名空间自动视为已注册 */
48
+ ns: AutoRegisterMap;
49
+ describe(namespace: string, _opts?: {
50
+ redactSecrets?: boolean;
51
+ }): Promise<NamespaceInfo>;
52
+ replace(namespace: string, value: unknown, expectedRevision?: number): Promise<void>;
53
+ update?(namespace: string, patch: unknown, expectedRevision?: number): Promise<void>;
54
+ }
55
+ export declare class MemCredentials implements CredentialsFacade {
56
+ values: Map<string, string>;
57
+ describe(ref: string): Promise<{
58
+ configured: boolean;
59
+ source?: string;
60
+ writable?: boolean;
61
+ }>;
62
+ set(ref: string, value: string): Promise<void>;
63
+ unset(ref: string): Promise<void>;
64
+ }
65
+ export declare class MemPlugins implements PluginsFacade {
66
+ installed: Map<string, PluginInfo>;
67
+ /** 测试钩子:install 抛错(模拟 npm ERESOLVE / 网络失败) */
68
+ failInstall: boolean;
69
+ /** 测试钩子:记录最近一次 install 收到的 spec(验证非 registry spec 透传) */
70
+ lastSpec: string | undefined;
71
+ listInstalled(): Promise<PluginInfo[]>;
72
+ install(pkg: string, spec?: string): Promise<{
73
+ needsRestart: boolean;
74
+ }>;
75
+ }
76
+ export declare class MemWorkspace implements WorkspaceFacade {
77
+ records: Map<string, WorkspaceRecord>;
78
+ listRecords(): Promise<WorkspaceRecord[]>;
79
+ writeRecord(r: WorkspaceRecord): Promise<void>;
80
+ removeRecord(id: string): Promise<void>;
81
+ }
82
+ export declare class MemPatch implements PatchFileFacade {
83
+ lines: Map<string, {
84
+ lineId: string;
85
+ raw: unknown;
86
+ }>;
87
+ readPatchLines(_file: string): Promise<{
88
+ lineId: string;
89
+ raw: unknown;
90
+ }[]>;
91
+ applyPatchChanges(_file: string, changes: {
92
+ lineId: string;
93
+ raw: unknown;
94
+ action: 'insert' | 'update' | 'remove';
95
+ }[]): Promise<void>;
96
+ }
97
+ export declare class MemSnapshotStore implements SnapshotStore {
98
+ snapshots: Map<string, Snapshot>;
99
+ blobs: Map<string, Uint8Array<ArrayBufferLike>>;
100
+ save(snapshot: Snapshot, blobs?: Map<string, Uint8Array>): Promise<string>;
101
+ load(id: string): Promise<Snapshot>;
102
+ readBlob(id: string, blobPath: string): Promise<Uint8Array>;
103
+ updateStatus(id: string, status: Snapshot['status']): Promise<void>;
104
+ }
105
+ export declare class MockHostContext implements HostContext {
106
+ platform: string;
107
+ arch: string;
108
+ homeDir: string;
109
+ dshVersion: string;
110
+ log: Logger;
111
+ profile?: string;
112
+ settings: MemSettings;
113
+ credentials: MemCredentials;
114
+ plugins: MemPlugins;
115
+ workspace: MemWorkspace;
116
+ patchFile: MemPatch;
117
+ fs: MemFs;
118
+ constructor(platform: string, homeDir: string, profile?: string);
119
+ }
120
+ export declare function makeContext(platform: string, homeDir: string, profile?: string): MockHostContext;
121
+ /** 构造最小合法 manifest(adapter 单测用;真实 manifest 由 exporter 生成) */
122
+ export declare function makeManifest(platform?: string): Manifest;
123
+ /** 构造 ImportContext(adapter 单测用;sections 键运行时即 SectionId 字符串) */
124
+ export declare function makeImportContext(target: HostContext, sections: ReadonlyMap<string, unknown>, overrides?: Partial<ImportContext>): ImportContext;
125
+ export { sha256Hex };