@lesliechan721/aw 0.1.0-beta.10

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 (508) hide show
  1. package/dist/authoring/assets/aw-config.d.mts +51 -0
  2. package/dist/authoring/assets/aw-config.mjs +1025 -0
  3. package/dist/authoring/assets/aw-config.mjs.map +1 -0
  4. package/dist/authoring/scripts/add-skill.d.mts +2 -0
  5. package/dist/authoring/scripts/add-skill.mjs +355 -0
  6. package/dist/authoring/scripts/add-skill.mjs.map +1 -0
  7. package/dist/authoring/scripts/init-plugin.d.mts +2 -0
  8. package/dist/authoring/scripts/init-plugin.mjs +487 -0
  9. package/dist/authoring/scripts/init-plugin.mjs.map +1 -0
  10. package/dist/authoring/scripts/lib/javascript-import-scanner.d.mts +4 -0
  11. package/dist/authoring/scripts/lib/javascript-import-scanner.mjs +261 -0
  12. package/dist/authoring/scripts/lib/javascript-import-scanner.mjs.map +1 -0
  13. package/dist/authoring/scripts/lib/plugin-root.d.mts +26 -0
  14. package/dist/authoring/scripts/lib/plugin-root.mjs +125 -0
  15. package/dist/authoring/scripts/lib/plugin-root.mjs.map +1 -0
  16. package/dist/authoring/scripts/lib/plugin-version-check.d.mts +69 -0
  17. package/dist/authoring/scripts/lib/plugin-version-check.mjs +563 -0
  18. package/dist/authoring/scripts/lib/plugin-version-check.mjs.map +1 -0
  19. package/dist/authoring/scripts/lib/semver.d.mts +9 -0
  20. package/dist/authoring/scripts/lib/semver.mjs +63 -0
  21. package/dist/authoring/scripts/lib/semver.mjs.map +1 -0
  22. package/dist/authoring/scripts/lib/skill-scaffold.d.mts +111 -0
  23. package/dist/authoring/scripts/lib/skill-scaffold.mjs +353 -0
  24. package/dist/authoring/scripts/lib/skill-scaffold.mjs.map +1 -0
  25. package/dist/authoring/scripts/plugin-status.d.mts +2 -0
  26. package/dist/authoring/scripts/plugin-status.mjs +93 -0
  27. package/dist/authoring/scripts/plugin-status.mjs.map +1 -0
  28. package/dist/authoring/scripts/remove-plugin.d.mts +2 -0
  29. package/dist/authoring/scripts/remove-plugin.mjs +367 -0
  30. package/dist/authoring/scripts/remove-plugin.mjs.map +1 -0
  31. package/dist/authoring/scripts/validate-plugin.d.mts +2 -0
  32. package/dist/authoring/scripts/validate-plugin.mjs +3465 -0
  33. package/dist/authoring/scripts/validate-plugin.mjs.map +1 -0
  34. package/dist/authoring/scripts/validate-skill.d.mts +2 -0
  35. package/dist/authoring/scripts/validate-skill.mjs +126 -0
  36. package/dist/authoring/scripts/validate-skill.mjs.map +1 -0
  37. package/dist/authoring/templates/aw-config-runtime.d.mts +2 -0
  38. package/dist/authoring/templates/aw-config-runtime.mjs +407 -0
  39. package/dist/authoring/templates/aw-config-runtime.mjs.map +1 -0
  40. package/dist/index.d.ts +2 -0
  41. package/dist/index.js +8 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/scripts/aw-skill-eval-materializer.d.ts +24 -0
  44. package/dist/scripts/aw-skill-eval-materializer.js +309 -0
  45. package/dist/scripts/aw-skill-eval-materializer.js.map +1 -0
  46. package/dist/scripts/bundle-plugins.d.ts +17 -0
  47. package/dist/scripts/bundle-plugins.js +126 -0
  48. package/dist/scripts/bundle-plugins.js.map +1 -0
  49. package/dist/scripts/plugin-staging.d.ts +26 -0
  50. package/dist/scripts/plugin-staging.js +76 -0
  51. package/dist/scripts/plugin-staging.js.map +1 -0
  52. package/dist/scripts/test-plugin-scripts.d.ts +7 -0
  53. package/dist/scripts/test-plugin-scripts.js +610 -0
  54. package/dist/scripts/test-plugin-scripts.js.map +1 -0
  55. package/dist/src/adapters/helpers.d.ts +44 -0
  56. package/dist/src/adapters/helpers.js +95 -0
  57. package/dist/src/adapters/helpers.js.map +1 -0
  58. package/dist/src/authoring/workspace-commands.d.ts +70 -0
  59. package/dist/src/authoring/workspace-commands.js +158 -0
  60. package/dist/src/authoring/workspace-commands.js.map +1 -0
  61. package/dist/src/commands/aw-capabilities.d.ts +78 -0
  62. package/dist/src/commands/aw-capabilities.js +254 -0
  63. package/dist/src/commands/aw-capabilities.js.map +1 -0
  64. package/dist/src/commands/catalog-dev-source.d.ts +120 -0
  65. package/dist/src/commands/catalog-dev-source.js +434 -0
  66. package/dist/src/commands/catalog-dev-source.js.map +1 -0
  67. package/dist/src/commands/catalog-generation.d.ts +16 -0
  68. package/dist/src/commands/catalog-generation.js +9 -0
  69. package/dist/src/commands/catalog-generation.js.map +1 -0
  70. package/dist/src/commands/catalog-publication-inspection.d.ts +138 -0
  71. package/dist/src/commands/catalog-publication-inspection.js +711 -0
  72. package/dist/src/commands/catalog-publication-inspection.js.map +1 -0
  73. package/dist/src/commands/catalog-publication-journal.d.ts +56 -0
  74. package/dist/src/commands/catalog-publication-journal.js +215 -0
  75. package/dist/src/commands/catalog-publication-journal.js.map +1 -0
  76. package/dist/src/commands/catalog-publication-target.d.ts +18 -0
  77. package/dist/src/commands/catalog-publication-target.js +95 -0
  78. package/dist/src/commands/catalog-publication-target.js.map +1 -0
  79. package/dist/src/commands/catalog-publish.d.ts +103 -0
  80. package/dist/src/commands/catalog-publish.js +804 -0
  81. package/dist/src/commands/catalog-publish.js.map +1 -0
  82. package/dist/src/commands/catalog-source.d.ts +134 -0
  83. package/dist/src/commands/catalog-source.js +377 -0
  84. package/dist/src/commands/catalog-source.js.map +1 -0
  85. package/dist/src/commands/catalog-status.d.ts +56 -0
  86. package/dist/src/commands/catalog-status.js +217 -0
  87. package/dist/src/commands/catalog-status.js.map +1 -0
  88. package/dist/src/commands/catalog-store.d.ts +80 -0
  89. package/dist/src/commands/catalog-store.js +348 -0
  90. package/dist/src/commands/catalog-store.js.map +1 -0
  91. package/dist/src/commands/catalog-workspace-resolution.d.ts +13 -0
  92. package/dist/src/commands/catalog-workspace-resolution.js +42 -0
  93. package/dist/src/commands/catalog-workspace-resolution.js.map +1 -0
  94. package/dist/src/commands/console.d.ts +3 -0
  95. package/dist/src/commands/console.js +44 -0
  96. package/dist/src/commands/console.js.map +1 -0
  97. package/dist/src/commands/dependency-operation-plan.d.ts +58 -0
  98. package/dist/src/commands/dependency-operation-plan.js +261 -0
  99. package/dist/src/commands/dependency-operation-plan.js.map +1 -0
  100. package/dist/src/commands/init.d.ts +25 -0
  101. package/dist/src/commands/init.js +42 -0
  102. package/dist/src/commands/init.js.map +1 -0
  103. package/dist/src/commands/offline-cleanup-evidence.d.ts +59 -0
  104. package/dist/src/commands/offline-cleanup-evidence.js +163 -0
  105. package/dist/src/commands/offline-cleanup-evidence.js.map +1 -0
  106. package/dist/src/commands/operation-plan.d.ts +126 -0
  107. package/dist/src/commands/operation-plan.js +47 -0
  108. package/dist/src/commands/operation-plan.js.map +1 -0
  109. package/dist/src/commands/operation-planner.d.ts +46 -0
  110. package/dist/src/commands/operation-planner.js +139 -0
  111. package/dist/src/commands/operation-planner.js.map +1 -0
  112. package/dist/src/commands/options.d.ts +70 -0
  113. package/dist/src/commands/options.js +194 -0
  114. package/dist/src/commands/options.js.map +1 -0
  115. package/dist/src/commands/plugin-capabilities.d.ts +22 -0
  116. package/dist/src/commands/plugin-capabilities.js +159 -0
  117. package/dist/src/commands/plugin-capabilities.js.map +1 -0
  118. package/dist/src/commands/rebuild-command.d.ts +88 -0
  119. package/dist/src/commands/rebuild-command.js +3626 -0
  120. package/dist/src/commands/rebuild-command.js.map +1 -0
  121. package/dist/src/commands/rebuild-integration.d.ts +190 -0
  122. package/dist/src/commands/rebuild-integration.js +4439 -0
  123. package/dist/src/commands/rebuild-integration.js.map +1 -0
  124. package/dist/src/commands/rebuild-operations.d.ts +100 -0
  125. package/dist/src/commands/rebuild-operations.js +625 -0
  126. package/dist/src/commands/rebuild-operations.js.map +1 -0
  127. package/dist/src/commands/reconcile-operation-plan.d.ts +26 -0
  128. package/dist/src/commands/reconcile-operation-plan.js +28 -0
  129. package/dist/src/commands/reconcile-operation-plan.js.map +1 -0
  130. package/dist/src/commands/review-publication.d.ts +99 -0
  131. package/dist/src/commands/review-publication.js +904 -0
  132. package/dist/src/commands/review-publication.js.map +1 -0
  133. package/dist/src/commands/runtime.d.ts +172 -0
  134. package/dist/src/commands/runtime.js +720 -0
  135. package/dist/src/commands/runtime.js.map +1 -0
  136. package/dist/src/commands/skill-eval.d.ts +33 -0
  137. package/dist/src/commands/skill-eval.js +363 -0
  138. package/dist/src/commands/skill-eval.js.map +1 -0
  139. package/dist/src/commands/status-v6.d.ts +206 -0
  140. package/dist/src/commands/status-v6.js +2175 -0
  141. package/dist/src/commands/status-v6.js.map +1 -0
  142. package/dist/src/commands/sync-command.d.ts +23 -0
  143. package/dist/src/commands/sync-command.js +242 -0
  144. package/dist/src/commands/sync-command.js.map +1 -0
  145. package/dist/src/commands/wizard.d.ts +56 -0
  146. package/dist/src/commands/wizard.js +58 -0
  147. package/dist/src/commands/wizard.js.map +1 -0
  148. package/dist/src/commands/write-commands.d.ts +7 -0
  149. package/dist/src/commands/write-commands.js +190 -0
  150. package/dist/src/commands/write-commands.js.map +1 -0
  151. package/dist/src/constants.d.ts +31 -0
  152. package/dist/src/constants.js +32 -0
  153. package/dist/src/constants.js.map +1 -0
  154. package/dist/src/eval/manifest-v1.d.ts +67 -0
  155. package/dist/src/eval/manifest-v1.js +347 -0
  156. package/dist/src/eval/manifest-v1.js.map +1 -0
  157. package/dist/src/generators/agents.d.ts +3 -0
  158. package/dist/src/generators/agents.js +46 -0
  159. package/dist/src/generators/agents.js.map +1 -0
  160. package/dist/src/generators/hooks.d.ts +15 -0
  161. package/dist/src/generators/hooks.js +76 -0
  162. package/dist/src/generators/hooks.js.map +1 -0
  163. package/dist/src/generators/instructions.d.ts +13 -0
  164. package/dist/src/generators/instructions.js +66 -0
  165. package/dist/src/generators/instructions.js.map +1 -0
  166. package/dist/src/generators/local-plugin.d.ts +56 -0
  167. package/dist/src/generators/local-plugin.js +1373 -0
  168. package/dist/src/generators/local-plugin.js.map +1 -0
  169. package/dist/src/generators/permissions.d.ts +10 -0
  170. package/dist/src/generators/permissions.js +37 -0
  171. package/dist/src/generators/permissions.js.map +1 -0
  172. package/dist/src/generators/shared.d.ts +2 -0
  173. package/dist/src/generators/shared.js +15 -0
  174. package/dist/src/generators/shared.js.map +1 -0
  175. package/dist/src/index.d.ts +41 -0
  176. package/dist/src/index.js +3327 -0
  177. package/dist/src/index.js.map +1 -0
  178. package/dist/src/output/command-receipt.d.ts +87 -0
  179. package/dist/src/output/command-receipt.js +302 -0
  180. package/dist/src/output/command-receipt.js.map +1 -0
  181. package/dist/src/output/debug-log.d.ts +4 -0
  182. package/dist/src/output/debug-log.js +97 -0
  183. package/dist/src/output/debug-log.js.map +1 -0
  184. package/dist/src/output/equivalent-command.d.ts +9 -0
  185. package/dist/src/output/equivalent-command.js +39 -0
  186. package/dist/src/output/equivalent-command.js.map +1 -0
  187. package/dist/src/output/model.d.ts +76 -0
  188. package/dist/src/output/model.js +2 -0
  189. package/dist/src/output/model.js.map +1 -0
  190. package/dist/src/output/rebuild-progress.d.ts +21 -0
  191. package/dist/src/output/rebuild-progress.js +128 -0
  192. package/dist/src/output/rebuild-progress.js.map +1 -0
  193. package/dist/src/output/redact.d.ts +3 -0
  194. package/dist/src/output/redact.js +39 -0
  195. package/dist/src/output/redact.js.map +1 -0
  196. package/dist/src/output/reporter.d.ts +9 -0
  197. package/dist/src/output/reporter.js +133 -0
  198. package/dist/src/output/reporter.js.map +1 -0
  199. package/dist/src/portable/commands.d.ts +124 -0
  200. package/dist/src/portable/commands.js +557 -0
  201. package/dist/src/portable/commands.js.map +1 -0
  202. package/dist/src/portable/materializer.d.ts +50 -0
  203. package/dist/src/portable/materializer.js +462 -0
  204. package/dist/src/portable/materializer.js.map +1 -0
  205. package/dist/src/portable/skills-cli.d.ts +43 -0
  206. package/dist/src/portable/skills-cli.js +148 -0
  207. package/dist/src/portable/skills-cli.js.map +1 -0
  208. package/dist/src/tui/catalog-freshness.d.ts +1 -0
  209. package/dist/src/tui/catalog-freshness.js +2 -0
  210. package/dist/src/tui/catalog-freshness.js.map +1 -0
  211. package/dist/src/tui/catalog-generation.d.ts +21 -0
  212. package/dist/src/tui/catalog-generation.js +116 -0
  213. package/dist/src/tui/catalog-generation.js.map +1 -0
  214. package/dist/src/tui/catalog-sources/projection.d.ts +4 -0
  215. package/dist/src/tui/catalog-sources/projection.js +17 -0
  216. package/dist/src/tui/catalog-sources/projection.js.map +1 -0
  217. package/dist/src/tui/catalog-sources/review.d.ts +3 -0
  218. package/dist/src/tui/catalog-sources/review.js +13 -0
  219. package/dist/src/tui/catalog-sources/review.js.map +1 -0
  220. package/dist/src/tui/catalog-sources/screens.d.ts +12 -0
  221. package/dist/src/tui/catalog-sources/screens.js +33 -0
  222. package/dist/src/tui/catalog-sources/screens.js.map +1 -0
  223. package/dist/src/tui/catalog-sources/session.d.ts +22 -0
  224. package/dist/src/tui/catalog-sources/session.js +225 -0
  225. package/dist/src/tui/catalog-sources/session.js.map +1 -0
  226. package/dist/src/tui/catalog-sources/types.d.ts +41 -0
  227. package/dist/src/tui/catalog-sources/types.js +2 -0
  228. package/dist/src/tui/catalog-sources/types.js.map +1 -0
  229. package/dist/src/tui/components.d.ts +102 -0
  230. package/dist/src/tui/components.js +184 -0
  231. package/dist/src/tui/components.js.map +1 -0
  232. package/dist/src/tui/console-app-v4.d.ts +20 -0
  233. package/dist/src/tui/console-app-v4.js +5066 -0
  234. package/dist/src/tui/console-app-v4.js.map +1 -0
  235. package/dist/src/tui/controller-runtime.d.ts +23 -0
  236. package/dist/src/tui/controller-runtime.js +2011 -0
  237. package/dist/src/tui/controller-runtime.js.map +1 -0
  238. package/dist/src/tui/controller.d.ts +557 -0
  239. package/dist/src/tui/controller.js +2120 -0
  240. package/dist/src/tui/controller.js.map +1 -0
  241. package/dist/src/tui/diagnostics.d.ts +30 -0
  242. package/dist/src/tui/diagnostics.js +71 -0
  243. package/dist/src/tui/diagnostics.js.map +1 -0
  244. package/dist/src/tui/index.d.ts +17 -0
  245. package/dist/src/tui/index.js +17 -0
  246. package/dist/src/tui/index.js.map +1 -0
  247. package/dist/src/tui/input-display.d.ts +8 -0
  248. package/dist/src/tui/input-display.js +36 -0
  249. package/dist/src/tui/input-display.js.map +1 -0
  250. package/dist/src/tui/keys.d.ts +12 -0
  251. package/dist/src/tui/keys.js +22 -0
  252. package/dist/src/tui/keys.js.map +1 -0
  253. package/dist/src/tui/layout.d.ts +12 -0
  254. package/dist/src/tui/layout.js +19 -0
  255. package/dist/src/tui/layout.js.map +1 -0
  256. package/dist/src/tui/model.d.ts +424 -0
  257. package/dist/src/tui/model.js +1493 -0
  258. package/dist/src/tui/model.js.map +1 -0
  259. package/dist/src/tui/operation-review-planner.d.ts +21 -0
  260. package/dist/src/tui/operation-review-planner.js +622 -0
  261. package/dist/src/tui/operation-review-planner.js.map +1 -0
  262. package/dist/src/tui/prompt.d.ts +8 -0
  263. package/dist/src/tui/prompt.js +231 -0
  264. package/dist/src/tui/prompt.js.map +1 -0
  265. package/dist/src/tui/router.d.ts +206 -0
  266. package/dist/src/tui/router.js +137 -0
  267. package/dist/src/tui/router.js.map +1 -0
  268. package/dist/src/tui/runner.d.ts +11 -0
  269. package/dist/src/tui/runner.js +71 -0
  270. package/dist/src/tui/runner.js.map +1 -0
  271. package/dist/src/tui/source-ref-presets.d.ts +3 -0
  272. package/dist/src/tui/source-ref-presets.js +11 -0
  273. package/dist/src/tui/source-ref-presets.js.map +1 -0
  274. package/dist/src/tui/theme.d.ts +26 -0
  275. package/dist/src/tui/theme.js +28 -0
  276. package/dist/src/tui/theme.js.map +1 -0
  277. package/dist/src/tui/viewport.d.ts +20 -0
  278. package/dist/src/tui/viewport.js +29 -0
  279. package/dist/src/tui/viewport.js.map +1 -0
  280. package/dist/src/tui/views.d.ts +57 -0
  281. package/dist/src/tui/views.js +201 -0
  282. package/dist/src/tui/views.js.map +1 -0
  283. package/dist/src/tui/wizard.d.ts +11 -0
  284. package/dist/src/tui/wizard.js +323 -0
  285. package/dist/src/tui/wizard.js.map +1 -0
  286. package/dist/src/types.d.ts +474 -0
  287. package/dist/src/types.js +34 -0
  288. package/dist/src/types.js.map +1 -0
  289. package/dist/src/utils/agent-version.d.ts +19 -0
  290. package/dist/src/utils/agent-version.js +205 -0
  291. package/dist/src/utils/agent-version.js.map +1 -0
  292. package/dist/src/utils/artifact-plan.d.ts +27 -0
  293. package/dist/src/utils/artifact-plan.js +453 -0
  294. package/dist/src/utils/artifact-plan.js.map +1 -0
  295. package/dist/src/utils/artifact-renderer.d.ts +129 -0
  296. package/dist/src/utils/artifact-renderer.js +400 -0
  297. package/dist/src/utils/artifact-renderer.js.map +1 -0
  298. package/dist/src/utils/artifact-request.d.ts +16 -0
  299. package/dist/src/utils/artifact-request.js +42 -0
  300. package/dist/src/utils/artifact-request.js.map +1 -0
  301. package/dist/src/utils/artifact-sources.d.ts +8 -0
  302. package/dist/src/utils/artifact-sources.js +10 -0
  303. package/dist/src/utils/artifact-sources.js.map +1 -0
  304. package/dist/src/utils/aw-home-mutation-lock.d.ts +11 -0
  305. package/dist/src/utils/aw-home-mutation-lock.js +83 -0
  306. package/dist/src/utils/aw-home-mutation-lock.js.map +1 -0
  307. package/dist/src/utils/bundle-integrity.d.ts +2 -0
  308. package/dist/src/utils/bundle-integrity.js +63 -0
  309. package/dist/src/utils/bundle-integrity.js.map +1 -0
  310. package/dist/src/utils/bundle-layout.d.ts +4 -0
  311. package/dist/src/utils/bundle-layout.js +531 -0
  312. package/dist/src/utils/bundle-layout.js.map +1 -0
  313. package/dist/src/utils/catalog-digests.d.ts +18 -0
  314. package/dist/src/utils/catalog-digests.js +156 -0
  315. package/dist/src/utils/catalog-digests.js.map +1 -0
  316. package/dist/src/utils/catalog-generation-control-snapshot.d.ts +11 -0
  317. package/dist/src/utils/catalog-generation-control-snapshot.js +45 -0
  318. package/dist/src/utils/catalog-generation-control-snapshot.js.map +1 -0
  319. package/dist/src/utils/catalog-generation-error.d.ts +16 -0
  320. package/dist/src/utils/catalog-generation-error.js +30 -0
  321. package/dist/src/utils/catalog-generation-error.js.map +1 -0
  322. package/dist/src/utils/catalog-generation-resolver.d.ts +32 -0
  323. package/dist/src/utils/catalog-generation-resolver.js +251 -0
  324. package/dist/src/utils/catalog-generation-resolver.js.map +1 -0
  325. package/dist/src/utils/catalog-generation-service.d.ts +161 -0
  326. package/dist/src/utils/catalog-generation-service.js +1237 -0
  327. package/dist/src/utils/catalog-generation-service.js.map +1 -0
  328. package/dist/src/utils/catalog-generation-state.d.ts +22 -0
  329. package/dist/src/utils/catalog-generation-state.js +192 -0
  330. package/dist/src/utils/catalog-generation-state.js.map +1 -0
  331. package/dist/src/utils/catalog-generation-store.d.ts +57 -0
  332. package/dist/src/utils/catalog-generation-store.js +397 -0
  333. package/dist/src/utils/catalog-generation-store.js.map +1 -0
  334. package/dist/src/utils/catalog-manifest-v7.d.ts +5 -0
  335. package/dist/src/utils/catalog-manifest-v7.js +98 -0
  336. package/dist/src/utils/catalog-manifest-v7.js.map +1 -0
  337. package/dist/src/utils/catalog-operation-context.d.ts +20 -0
  338. package/dist/src/utils/catalog-operation-context.js +141 -0
  339. package/dist/src/utils/catalog-operation-context.js.map +1 -0
  340. package/dist/src/utils/catalog-public-error.d.ts +19 -0
  341. package/dist/src/utils/catalog-public-error.js +100 -0
  342. package/dist/src/utils/catalog-public-error.js.map +1 -0
  343. package/dist/src/utils/catalog-runtime-projection.d.ts +33 -0
  344. package/dist/src/utils/catalog-runtime-projection.js +77 -0
  345. package/dist/src/utils/catalog-runtime-projection.js.map +1 -0
  346. package/dist/src/utils/catalog-snapshot.d.ts +10 -0
  347. package/dist/src/utils/catalog-snapshot.js +20 -0
  348. package/dist/src/utils/catalog-snapshot.js.map +1 -0
  349. package/dist/src/utils/catalog-source-identity.d.ts +5 -0
  350. package/dist/src/utils/catalog-source-identity.js +137 -0
  351. package/dist/src/utils/catalog-source-identity.js.map +1 -0
  352. package/dist/src/utils/catalog-source-impact.d.ts +20 -0
  353. package/dist/src/utils/catalog-source-impact.js +222 -0
  354. package/dist/src/utils/catalog-source-impact.js.map +1 -0
  355. package/dist/src/utils/catalog-source-presentation.d.ts +1 -0
  356. package/dist/src/utils/catalog-source-presentation.js +32 -0
  357. package/dist/src/utils/catalog-source-presentation.js.map +1 -0
  358. package/dist/src/utils/catalog-source-references.d.ts +66 -0
  359. package/dist/src/utils/catalog-source-references.js +1180 -0
  360. package/dist/src/utils/catalog-source-references.js.map +1 -0
  361. package/dist/src/utils/catalog-sources.d.ts +53 -0
  362. package/dist/src/utils/catalog-sources.js +456 -0
  363. package/dist/src/utils/catalog-sources.js.map +1 -0
  364. package/dist/src/utils/codex-config.d.ts +126 -0
  365. package/dist/src/utils/codex-config.js +1032 -0
  366. package/dist/src/utils/codex-config.js.map +1 -0
  367. package/dist/src/utils/codex-manager.d.ts +81 -0
  368. package/dist/src/utils/codex-manager.js +810 -0
  369. package/dist/src/utils/codex-manager.js.map +1 -0
  370. package/dist/src/utils/codex-marketplace-path.d.ts +5 -0
  371. package/dist/src/utils/codex-marketplace-path.js +45 -0
  372. package/dist/src/utils/codex-marketplace-path.js.map +1 -0
  373. package/dist/src/utils/codex-native-observation.d.ts +16 -0
  374. package/dist/src/utils/codex-native-observation.js +22 -0
  375. package/dist/src/utils/codex-native-observation.js.map +1 -0
  376. package/dist/src/utils/codex-native-render-receipt.d.ts +40 -0
  377. package/dist/src/utils/codex-native-render-receipt.js +205 -0
  378. package/dist/src/utils/codex-native-render-receipt.js.map +1 -0
  379. package/dist/src/utils/codex-reconciler.d.ts +128 -0
  380. package/dist/src/utils/codex-reconciler.js +294 -0
  381. package/dist/src/utils/codex-reconciler.js.map +1 -0
  382. package/dist/src/utils/codex-roles.d.ts +71 -0
  383. package/dist/src/utils/codex-roles.js +257 -0
  384. package/dist/src/utils/codex-roles.js.map +1 -0
  385. package/dist/src/utils/codex-shared-native.d.ts +63 -0
  386. package/dist/src/utils/codex-shared-native.js +142 -0
  387. package/dist/src/utils/codex-shared-native.js.map +1 -0
  388. package/dist/src/utils/codex-skill-staging.d.ts +11 -0
  389. package/dist/src/utils/codex-skill-staging.js +8 -0
  390. package/dist/src/utils/codex-skill-staging.js.map +1 -0
  391. package/dist/src/utils/codex-surface-analysis.d.ts +45 -0
  392. package/dist/src/utils/codex-surface-analysis.js +245 -0
  393. package/dist/src/utils/codex-surface-analysis.js.map +1 -0
  394. package/dist/src/utils/config-value.d.ts +3 -0
  395. package/dist/src/utils/config-value.js +23 -0
  396. package/dist/src/utils/config-value.js.map +1 -0
  397. package/dist/src/utils/dynamic-skill-tree.d.ts +36 -0
  398. package/dist/src/utils/dynamic-skill-tree.js +466 -0
  399. package/dist/src/utils/dynamic-skill-tree.js.map +1 -0
  400. package/dist/src/utils/file-rules.d.ts +1 -0
  401. package/dist/src/utils/file-rules.js +2 -0
  402. package/dist/src/utils/file-rules.js.map +1 -0
  403. package/dist/src/utils/git-catalog-provider.d.ts +22 -0
  404. package/dist/src/utils/git-catalog-provider.js +497 -0
  405. package/dist/src/utils/git-catalog-provider.js.map +1 -0
  406. package/dist/src/utils/hooks-contract.d.ts +1 -0
  407. package/dist/src/utils/hooks-contract.js +2 -0
  408. package/dist/src/utils/hooks-contract.js.map +1 -0
  409. package/dist/src/utils/json.d.ts +4 -0
  410. package/dist/src/utils/json.js +29 -0
  411. package/dist/src/utils/json.js.map +1 -0
  412. package/dist/src/utils/local-marketplace.d.ts +41 -0
  413. package/dist/src/utils/local-marketplace.js +316 -0
  414. package/dist/src/utils/local-marketplace.js.map +1 -0
  415. package/dist/src/utils/manifest.d.ts +11 -0
  416. package/dist/src/utils/manifest.js +33 -0
  417. package/dist/src/utils/manifest.js.map +1 -0
  418. package/dist/src/utils/marketplace.d.ts +3 -0
  419. package/dist/src/utils/marketplace.js +76 -0
  420. package/dist/src/utils/marketplace.js.map +1 -0
  421. package/dist/src/utils/multi-source-catalog.d.ts +66 -0
  422. package/dist/src/utils/multi-source-catalog.js +345 -0
  423. package/dist/src/utils/multi-source-catalog.js.map +1 -0
  424. package/dist/src/utils/native-cli.d.ts +118 -0
  425. package/dist/src/utils/native-cli.js +518 -0
  426. package/dist/src/utils/native-cli.js.map +1 -0
  427. package/dist/src/utils/orphan-marketplace-cleanup.d.ts +18 -0
  428. package/dist/src/utils/orphan-marketplace-cleanup.js +198 -0
  429. package/dist/src/utils/orphan-marketplace-cleanup.js.map +1 -0
  430. package/dist/src/utils/ownership.d.ts +194 -0
  431. package/dist/src/utils/ownership.js +723 -0
  432. package/dist/src/utils/ownership.js.map +1 -0
  433. package/dist/src/utils/path-catalog-provider.d.ts +7 -0
  434. package/dist/src/utils/path-catalog-provider.js +74 -0
  435. package/dist/src/utils/path-catalog-provider.js.map +1 -0
  436. package/dist/src/utils/paths.d.ts +40 -0
  437. package/dist/src/utils/paths.js +137 -0
  438. package/dist/src/utils/paths.js.map +1 -0
  439. package/dist/src/utils/platform-entries.d.ts +1 -0
  440. package/dist/src/utils/platform-entries.js +2 -0
  441. package/dist/src/utils/platform-entries.js.map +1 -0
  442. package/dist/src/utils/platform-support.d.ts +1 -0
  443. package/dist/src/utils/platform-support.js +2 -0
  444. package/dist/src/utils/platform-support.js.map +1 -0
  445. package/dist/src/utils/plugin-config-write.d.ts +110 -0
  446. package/dist/src/utils/plugin-config-write.js +773 -0
  447. package/dist/src/utils/plugin-config-write.js.map +1 -0
  448. package/dist/src/utils/plugin-config.d.ts +389 -0
  449. package/dist/src/utils/plugin-config.js +1642 -0
  450. package/dist/src/utils/plugin-config.js.map +1 -0
  451. package/dist/src/utils/plugin-dependencies.d.ts +12 -0
  452. package/dist/src/utils/plugin-dependencies.js +162 -0
  453. package/dist/src/utils/plugin-dependencies.js.map +1 -0
  454. package/dist/src/utils/plugin-intent-state.d.ts +34 -0
  455. package/dist/src/utils/plugin-intent-state.js +289 -0
  456. package/dist/src/utils/plugin-intent-state.js.map +1 -0
  457. package/dist/src/utils/plugin-script-contract.d.ts +1 -0
  458. package/dist/src/utils/plugin-script-contract.js +2 -0
  459. package/dist/src/utils/plugin-script-contract.js.map +1 -0
  460. package/dist/src/utils/plugin-scripts.d.ts +101 -0
  461. package/dist/src/utils/plugin-scripts.js +253 -0
  462. package/dist/src/utils/plugin-scripts.js.map +1 -0
  463. package/dist/src/utils/process-lock.d.ts +47 -0
  464. package/dist/src/utils/process-lock.js +532 -0
  465. package/dist/src/utils/process-lock.js.map +1 -0
  466. package/dist/src/utils/process-tree.d.ts +2 -0
  467. package/dist/src/utils/process-tree.js +2 -0
  468. package/dist/src/utils/process-tree.js.map +1 -0
  469. package/dist/src/utils/project-boundary.d.ts +9 -0
  470. package/dist/src/utils/project-boundary.js +67 -0
  471. package/dist/src/utils/project-boundary.js.map +1 -0
  472. package/dist/src/utils/rendered-contract.d.ts +8 -0
  473. package/dist/src/utils/rendered-contract.js +134 -0
  474. package/dist/src/utils/rendered-contract.js.map +1 -0
  475. package/dist/src/utils/runtime-skill-closure.d.ts +13 -0
  476. package/dist/src/utils/runtime-skill-closure.js +863 -0
  477. package/dist/src/utils/runtime-skill-closure.js.map +1 -0
  478. package/dist/src/utils/safe-fs.d.ts +21 -0
  479. package/dist/src/utils/safe-fs.js +111 -0
  480. package/dist/src/utils/safe-fs.js.map +1 -0
  481. package/dist/src/utils/skill-authoring.d.ts +1 -0
  482. package/dist/src/utils/skill-authoring.js +2 -0
  483. package/dist/src/utils/skill-authoring.js.map +1 -0
  484. package/dist/src/utils/skill-validation.d.ts +37 -0
  485. package/dist/src/utils/skill-validation.js +326 -0
  486. package/dist/src/utils/skill-validation.js.map +1 -0
  487. package/dist/src/utils/slash-commands.d.ts +1 -0
  488. package/dist/src/utils/slash-commands.js +2 -0
  489. package/dist/src/utils/slash-commands.js.map +1 -0
  490. package/dist/src/utils/state-paths.d.ts +14 -0
  491. package/dist/src/utils/state-paths.js +139 -0
  492. package/dist/src/utils/state-paths.js.map +1 -0
  493. package/dist/src/utils/target-eligibility.d.ts +13 -0
  494. package/dist/src/utils/target-eligibility.js +35 -0
  495. package/dist/src/utils/target-eligibility.js.map +1 -0
  496. package/dist/src/utils/target-order.d.ts +7 -0
  497. package/dist/src/utils/target-order.js +10 -0
  498. package/dist/src/utils/target-order.js.map +1 -0
  499. package/dist/src/utils/template-engine.d.ts +1 -0
  500. package/dist/src/utils/template-engine.js +2 -0
  501. package/dist/src/utils/template-engine.js.map +1 -0
  502. package/dist/src/utils/test-path-fence.d.ts +12 -0
  503. package/dist/src/utils/test-path-fence.js +31 -0
  504. package/dist/src/utils/test-path-fence.js.map +1 -0
  505. package/dist/vitest.config.d.ts +2 -0
  506. package/dist/vitest.config.js +16 -0
  507. package/dist/vitest.config.js.map +1 -0
  508. package/package.json +64 -0
@@ -0,0 +1,1237 @@
1
+ import { withAwHomeMutationLock, } from './aw-home-mutation-lock.js';
2
+ import { CatalogGenerationError, catalogGenerationErrorCode } from './catalog-generation-error.js';
3
+ import { createCatalogStoreKey, prepareCatalogStoreEntryRepair, publishCatalogStoreEntry, readCatalogSnapshotLogicalIdentity, readCatalogStoreEntry, } from './catalog-generation-store.js';
4
+ import { readCatalogGenerationState, replaceInvalidCatalogGenerationState, withCatalogGenerationStateTransaction, } from './catalog-generation-state.js';
5
+ export { removeCatalogSourceGenerationState } from './catalog-generation-state.js';
6
+ import { validateCatalogSnapshotTransport } from './catalog-snapshot.js';
7
+ import { calculateCatalogSourceConfigFingerprint, calculateCatalogSourceIdentity } from './catalog-source-identity.js';
8
+ import { readCatalogSourcesConfigSnapshot } from './catalog-sources.js';
9
+ import { catalogGitProviderInternal } from './git-catalog-provider.js';
10
+ import { catalogPathProviderInternal } from './path-catalog-provider.js';
11
+ import { resolveActiveCatalogGeneration } from './catalog-generation-resolver.js';
12
+ import { compareStrictSemVer } from './manifest.js';
13
+ import { calculateCatalogSourceImpactDigest, catalogSourceImpactRequiresConfirmation, inspectCatalogSourceImpact, } from './catalog-source-impact.js';
14
+ const CANDIDATE_FIELDS = [
15
+ 'sourceConfigFingerprint', 'sourceIdentity', 'logicalIdentity', 'requestedRef',
16
+ 'resolvedCommit', 'catalogVersion', 'channel', 'manifestDigest', 'snapshotDigest',
17
+ ];
18
+ function now(runtime) {
19
+ return (runtime?.now?.() ?? new Date()).toISOString();
20
+ }
21
+ function warnCleanupFailure(sourceId) {
22
+ try {
23
+ process.emitWarning(`Catalog provider staging cleanup failed for source "${sourceId}".`, {
24
+ code: 'AW_CATALOG_PROVIDER_CLEANUP_FAILED',
25
+ });
26
+ }
27
+ catch {
28
+ // Cleanup diagnostics cannot replace the operation result.
29
+ }
30
+ }
31
+ async function resolveProvider(options) {
32
+ const providers = options.runtime?.providers ?? {
33
+ git: catalogGitProviderInternal.resolve,
34
+ path: catalogPathProviderInternal.resolve,
35
+ };
36
+ return providers[options.source.type](options.source, {
37
+ cliVersion: options.cliVersion,
38
+ env: options.env,
39
+ signal: options.signal,
40
+ });
41
+ }
42
+ async function resolveCandidate(options) {
43
+ const source = options.source ?? (await readCatalogSourcesConfigSnapshot(options.env)).config.sources
44
+ .find((entry) => entry.id === options.sourceId);
45
+ if (!source)
46
+ throw new CatalogGenerationError({
47
+ code: 'catalogGenerationSourceMissing', sourceId: options.sourceId,
48
+ message: `Catalog source "${options.sourceId}" is not configured.`,
49
+ });
50
+ const resolution = await resolveProvider({ source, ...options });
51
+ try {
52
+ const sourceIdentity = await calculateCatalogSourceIdentity(source);
53
+ if (resolution.sourceId !== source.id || resolution.sourceIdentity !== sourceIdentity) {
54
+ throw new CatalogGenerationError({
55
+ code: 'catalogGenerationIdentityMismatch', sourceId: source.id,
56
+ message: `Catalog provider returned mismatched identity for source "${source.id}".`,
57
+ });
58
+ }
59
+ const validation = await validateCatalogSnapshotTransport(resolution.rootDir);
60
+ if (validation.manifestDigest !== resolution.manifestDigest
61
+ || validation.snapshotDigest !== resolution.snapshotDigest)
62
+ throw new CatalogGenerationError({
63
+ code: 'catalogGenerationIdentityMismatch', sourceId: source.id,
64
+ message: `Catalog provider returned mismatched snapshot evidence for source "${source.id}".`,
65
+ });
66
+ return {
67
+ source,
68
+ resolution,
69
+ candidate: {
70
+ sourceConfigFingerprint: calculateCatalogSourceConfigFingerprint(source),
71
+ sourceIdentity: resolution.sourceIdentity,
72
+ logicalIdentity: await readCatalogSnapshotLogicalIdentity(resolution.rootDir),
73
+ catalogVersion: validation.manifest.catalogVersion,
74
+ channel: validation.manifest.channel,
75
+ requestedRef: resolution.requestedRef,
76
+ resolvedCommit: resolution.resolvedCommit,
77
+ manifestDigest: resolution.manifestDigest,
78
+ snapshotDigest: resolution.snapshotDigest,
79
+ },
80
+ };
81
+ }
82
+ catch (error) {
83
+ await resolution.cleanup().catch(() => warnCleanupFailure(source.id));
84
+ throw error;
85
+ }
86
+ }
87
+ export function compareCatalogGenerationCandidates(expected, actual) {
88
+ const changedFields = CANDIDATE_FIELDS.filter((field) => expected[field] !== actual[field]);
89
+ return { matches: changedFields.length === 0, changedFields };
90
+ }
91
+ export function compareCatalogGenerationFreshness(options) {
92
+ const active = options.active;
93
+ if (!active) {
94
+ return {
95
+ state: options.sourceType === 'path' ? 'localChangesAvailable' : 'updateAvailable',
96
+ candidate: options.candidate,
97
+ };
98
+ }
99
+ const base = {
100
+ activeVersion: active.catalogVersion,
101
+ activeResolvedCommit: active.resolvedCommit,
102
+ candidate: options.candidate,
103
+ };
104
+ if (active.logicalIdentity !== options.candidate.logicalIdentity) {
105
+ return { ...base, state: 'incompatible', errorCode: 'catalogLogicalIdentityChanged' };
106
+ }
107
+ if (active.snapshotDigest === options.candidate.snapshotDigest) {
108
+ return { ...base, state: 'current' };
109
+ }
110
+ if (options.sourceType === 'path') {
111
+ return { ...base, state: 'localChangesAvailable' };
112
+ }
113
+ const relation = compareStrictSemVer(options.candidate.catalogVersion, active.catalogVersion);
114
+ if (relation > 0)
115
+ return { ...base, state: 'updateAvailable' };
116
+ if (relation < 0)
117
+ return { ...base, state: 'rollbackDetected' };
118
+ return { ...base, state: 'versionConflict' };
119
+ }
120
+ function publicEvidence(candidate) {
121
+ const { sourceConfigFingerprint: _fingerprint, ...evidence } = candidate;
122
+ return evidence;
123
+ }
124
+ function sameActive(active, next) {
125
+ return Boolean(active)
126
+ && active.sourceConfigFingerprint === next.sourceConfigFingerprint
127
+ && active.sourceIdentity === next.sourceIdentity
128
+ && active.requestedRef === next.requestedRef
129
+ && active.resolvedCommit === next.resolvedCommit
130
+ && active.logicalIdentity === next.logicalIdentity
131
+ && active.manifestDigest === next.manifestDigest
132
+ && active.snapshotDigest === next.snapshotDigest;
133
+ }
134
+ const ACTIVE_FIELDS = [
135
+ 'sourceConfigFingerprint', 'sourceIdentity', 'requestedRef', 'resolvedCommit',
136
+ 'logicalIdentity', 'manifestDigest', 'snapshotDigest', 'activatedAt',
137
+ ];
138
+ function assertExpectedActive(sourceId, current, expected) {
139
+ if (expected === undefined)
140
+ return;
141
+ const matches = expected === null
142
+ ? current === undefined
143
+ : current !== undefined && ACTIVE_FIELDS.every((field) => current[field] === expected[field]);
144
+ if (!matches)
145
+ throw new CatalogGenerationError({
146
+ code: 'catalogGenerationReviewStale',
147
+ sourceId,
148
+ message: `Active Catalog for source "${sourceId}" changed after review. Review it again.`,
149
+ });
150
+ }
151
+ async function assertCurrentSource(options) {
152
+ const config = await readCatalogSourcesConfigSnapshot(options.env);
153
+ if (options.expectedConfigDigest && config.digest !== options.expectedConfigDigest) {
154
+ throw new CatalogGenerationError({
155
+ code: 'catalogGenerationReviewStale', sourceId: options.sourceId,
156
+ message: `Catalog source "${options.sourceId}" configuration changed after review. Review it again.`,
157
+ });
158
+ }
159
+ const source = config.config.sources.find((entry) => entry.id === options.sourceId);
160
+ if (!source)
161
+ throw new CatalogGenerationError({
162
+ code: 'catalogGenerationSourceMissing', sourceId: options.sourceId,
163
+ message: `Catalog source "${options.sourceId}" was removed during sync.`,
164
+ });
165
+ if (calculateCatalogSourceConfigFingerprint(source) !== options.candidate.sourceConfigFingerprint
166
+ || await calculateCatalogSourceIdentity(source) !== options.candidate.sourceIdentity)
167
+ throw new CatalogGenerationError({
168
+ code: 'catalogGenerationIdentityMismatch', sourceId: options.sourceId,
169
+ message: `Catalog source "${options.sourceId}" changed during sync. Run sync again.`,
170
+ });
171
+ return source;
172
+ }
173
+ async function enforceCatalogActivationPolicy(options) {
174
+ const configuredChanged = Boolean(options.active)
175
+ && (options.active.sourceConfigFingerprint !== options.candidate.sourceConfigFingerprint
176
+ || options.active.sourceIdentity !== options.candidate.sourceIdentity);
177
+ if (options.mode === 'explicitSourceChange' && options.active && !configuredChanged) {
178
+ throw new CatalogGenerationError({
179
+ code: 'catalogGenerationReviewStale', sourceId: options.sourceId,
180
+ message: `Catalog source "${options.sourceId}" no longer has a verified source configuration change.`,
181
+ });
182
+ }
183
+ if (options.mode === 'exactRepair') {
184
+ if (!options.active
185
+ || options.active.logicalIdentity !== options.candidate.logicalIdentity
186
+ || options.active.snapshotDigest !== options.candidate.snapshotDigest
187
+ || options.active.manifestDigest !== options.candidate.manifestDigest
188
+ || options.active.resolvedCommit !== options.candidate.resolvedCommit) {
189
+ throw new CatalogGenerationError({
190
+ code: 'catalogGenerationReviewStale', sourceId: options.sourceId,
191
+ message: `Catalog source "${options.sourceId}" no longer matches the exact repair target.`,
192
+ });
193
+ }
194
+ await readCatalogStoreEntry({
195
+ logicalIdentity: options.active.logicalIdentity,
196
+ snapshotDigest: options.active.snapshotDigest,
197
+ env: options.env,
198
+ }).then(() => {
199
+ throw new CatalogGenerationError({
200
+ code: 'catalogGenerationReviewStale', sourceId: options.sourceId,
201
+ message: `Catalog source "${options.sourceId}" Active entry is no longer damaged. Review it again.`,
202
+ });
203
+ }).catch((error) => {
204
+ if (error instanceof CatalogGenerationError
205
+ && error.code === 'catalogGenerationReviewStale')
206
+ throw error;
207
+ });
208
+ return { preserveActive: true };
209
+ }
210
+ if (catalogSourceImpactRequiresConfirmation(options.impact) && !options.impactConfirmed) {
211
+ throw new CatalogGenerationError({
212
+ code: 'catalogImpactConfirmationRequired', sourceId: options.sourceId,
213
+ message: `Catalog source "${options.sourceId}" has affected or unknown references. Use --yes after reviewing the impact.`,
214
+ impact: options.impact,
215
+ });
216
+ }
217
+ if (!options.active)
218
+ return { preserveActive: false };
219
+ if (options.mode === 'normal'
220
+ && options.active.logicalIdentity !== options.candidate.logicalIdentity) {
221
+ throw new CatalogGenerationError({
222
+ code: 'catalogLogicalIdentityChanged', sourceId: options.sourceId,
223
+ message: `Catalog source "${options.sourceId}" changed logical identity without a verified source configuration change.`,
224
+ });
225
+ }
226
+ if (options.mode === 'replaceDamaged') {
227
+ if (options.active.logicalIdentity !== options.candidate.logicalIdentity && !configuredChanged) {
228
+ throw new CatalogGenerationError({
229
+ code: 'catalogLogicalIdentityChanged', sourceId: options.sourceId,
230
+ message: `Catalog source "${options.sourceId}" changed logical identity without a verified source configuration change.`,
231
+ });
232
+ }
233
+ await readCatalogStoreEntry({
234
+ logicalIdentity: options.active.logicalIdentity,
235
+ snapshotDigest: options.active.snapshotDigest,
236
+ env: options.env,
237
+ }).then(() => {
238
+ throw new CatalogGenerationError({
239
+ code: 'catalogGenerationReviewStale', sourceId: options.sourceId,
240
+ message: `Catalog source "${options.sourceId}" Active entry is no longer damaged. Review it again.`,
241
+ });
242
+ }).catch((error) => {
243
+ if (error instanceof CatalogGenerationError
244
+ && error.code === 'catalogGenerationReviewStale')
245
+ throw error;
246
+ });
247
+ return { preserveActive: false };
248
+ }
249
+ let previous;
250
+ try {
251
+ previous = await readCatalogStoreEntry({
252
+ logicalIdentity: options.active.logicalIdentity,
253
+ snapshotDigest: options.active.snapshotDigest,
254
+ env: options.env,
255
+ });
256
+ }
257
+ catch (error) {
258
+ throw new CatalogGenerationError({
259
+ code: 'catalogReplaceDamagedRequired', sourceId: options.sourceId,
260
+ message: `Catalog source "${options.sourceId}" Active entry is damaged. Repair it or use --replace-damaged --yes.`,
261
+ cause: error,
262
+ });
263
+ }
264
+ if (options.mode === 'explicitSourceChange')
265
+ return { preserveActive: false };
266
+ if (options.source.type === 'path') {
267
+ return { preserveActive: options.active.snapshotDigest === options.candidate.snapshotDigest };
268
+ }
269
+ if (options.active.snapshotDigest === options.candidate.snapshotDigest) {
270
+ return { preserveActive: true };
271
+ }
272
+ const relation = compareStrictSemVer(options.candidate.catalogVersion, previous.metadata.catalogVersion);
273
+ if (relation === 0)
274
+ throw new CatalogGenerationError({
275
+ code: 'catalogVersionConflict', sourceId: options.sourceId,
276
+ message: `Catalog source "${options.sourceId}" candidate has the same version with different content.`,
277
+ });
278
+ if (relation < 0)
279
+ throw new CatalogGenerationError({
280
+ code: 'catalogRollbackDetected', sourceId: options.sourceId,
281
+ message: `Catalog source "${options.sourceId}" candidate version is lower than the Active version.`,
282
+ });
283
+ return { preserveActive: false };
284
+ }
285
+ function assertExpectedImpact(options) {
286
+ if (options.expectedImpactDigest
287
+ && calculateCatalogSourceImpactDigest(options.impact) !== options.expectedImpactDigest) {
288
+ throw new CatalogGenerationError({
289
+ code: 'catalogGenerationReviewStale',
290
+ sourceId: options.sourceId,
291
+ message: `Catalog source "${options.sourceId}" impact changed after review. Review it again.`,
292
+ impact: options.impact,
293
+ });
294
+ }
295
+ }
296
+ async function inspectActivationImpact(options) {
297
+ return inspectCatalogSourceImpact({
298
+ sourceId: options.sourceId,
299
+ cwd: options.cwd,
300
+ env: options.env,
301
+ sourcePrimary: options.source.primary,
302
+ mode: options.mode,
303
+ ...(options.mode === 'generation' ? { candidateManifest: options.candidateManifest } : {}),
304
+ });
305
+ }
306
+ function assertStoreMatchesCandidate(sourceId, store, candidate) {
307
+ if (store.metadata.logicalIdentity !== candidate.logicalIdentity
308
+ || store.metadata.manifestDigest !== candidate.manifestDigest
309
+ || store.metadata.snapshotDigest !== candidate.snapshotDigest)
310
+ throw new CatalogGenerationError({
311
+ code: 'catalogGenerationPublishFailed', sourceId,
312
+ message: `Catalog store evidence does not match the validated candidate for source "${sourceId}".`,
313
+ });
314
+ }
315
+ async function writeLastSync(options) {
316
+ return withAwHomeMutationLock({
317
+ env: options.env,
318
+ signal: options.signal,
319
+ action: async () => {
320
+ await assertCurrentSource(options);
321
+ const lastSync = {
322
+ syncedAt: now(options.runtime), mode: options.mode, state: options.state,
323
+ ...(options.state === 'succeeded'
324
+ ? { resolvedCommit: options.candidate.resolvedCommit }
325
+ : { errorCode: options.errorCode }),
326
+ };
327
+ await withCatalogGenerationStateTransaction({
328
+ env: options.env,
329
+ beforeReplace: async () => { await assertCurrentSource(options); },
330
+ action: async (current) => ({
331
+ state: {
332
+ schemaVersion: 1,
333
+ sources: {
334
+ ...current.sources,
335
+ [options.sourceId]: { ...current.sources[options.sourceId], lastSync },
336
+ },
337
+ },
338
+ result: undefined,
339
+ }),
340
+ });
341
+ return lastSync;
342
+ },
343
+ });
344
+ }
345
+ async function recordFailure(options) {
346
+ if (!options.candidate)
347
+ return;
348
+ await writeLastSync({ ...options, candidate: options.candidate, state: 'failed' })
349
+ .catch(() => undefined);
350
+ }
351
+ async function readCandidateContinuity(sourceId, env) {
352
+ const source = (await readCatalogSourcesConfigSnapshot(env)).config.sources
353
+ .find((entry) => entry.id === sourceId);
354
+ if (!source)
355
+ return undefined;
356
+ return {
357
+ sourceConfigFingerprint: calculateCatalogSourceConfigFingerprint(source),
358
+ sourceIdentity: await calculateCatalogSourceIdentity(source),
359
+ };
360
+ }
361
+ export async function probeCatalogSourceGeneration(options) {
362
+ const env = options.env ?? process.env;
363
+ let resolved;
364
+ try {
365
+ resolved = await resolveCandidate({ ...options, env });
366
+ return {
367
+ sourceId: options.sourceId,
368
+ candidate: resolved.candidate,
369
+ manifest: resolved.resolution.manifest,
370
+ };
371
+ }
372
+ finally {
373
+ if (resolved)
374
+ await resolved.resolution.cleanup().catch(() => warnCleanupFailure(options.sourceId));
375
+ }
376
+ }
377
+ export async function probeCatalogSourceRepairGeneration(options) {
378
+ const env = options.env ?? process.env;
379
+ const config = await readCatalogSourcesConfigSnapshot(env);
380
+ if (options.expectedConfigDigest && config.digest !== options.expectedConfigDigest) {
381
+ throw new CatalogGenerationError({
382
+ code: 'catalogGenerationReviewStale', sourceId: options.sourceId,
383
+ message: `Catalog source "${options.sourceId}" configuration changed after review.`,
384
+ });
385
+ }
386
+ const source = config.config.sources.find((entry) => entry.id === options.sourceId);
387
+ const active = options.expectedActive
388
+ ?? (await readCatalogGenerationState(env)).sources[options.sourceId]?.active;
389
+ if (!source || !active)
390
+ throw new CatalogGenerationError({
391
+ code: 'catalogGenerationUnavailable', sourceId: options.sourceId,
392
+ message: `Catalog source "${options.sourceId}" has no Active snapshot to repair.`,
393
+ });
394
+ const exactSource = source.type === 'git'
395
+ ? { ...source, refPolicy: { type: 'explicit', ref: active.resolvedCommit } }
396
+ : source;
397
+ let resolved;
398
+ try {
399
+ resolved = await resolveCandidate({ ...options, source: exactSource, env });
400
+ const candidate = {
401
+ ...resolved.candidate,
402
+ sourceConfigFingerprint: calculateCatalogSourceConfigFingerprint(source),
403
+ sourceIdentity: await calculateCatalogSourceIdentity(source),
404
+ requestedRef: active.requestedRef,
405
+ };
406
+ if (candidate.logicalIdentity !== active.logicalIdentity
407
+ || candidate.snapshotDigest !== active.snapshotDigest
408
+ || candidate.manifestDigest !== active.manifestDigest
409
+ || candidate.resolvedCommit !== active.resolvedCommit) {
410
+ throw new CatalogGenerationError({
411
+ code: 'catalogReplaceDamagedRequired', sourceId: options.sourceId,
412
+ message: `Catalog source "${options.sourceId}" cannot reproduce the damaged Active entry. Use the current candidate replacement Review.`,
413
+ });
414
+ }
415
+ return { sourceId: options.sourceId, candidate, manifest: resolved.resolution.manifest };
416
+ }
417
+ catch (error) {
418
+ if (error instanceof CatalogGenerationError)
419
+ throw error;
420
+ throw new CatalogGenerationError({
421
+ code: 'catalogReplaceDamagedRequired', sourceId: options.sourceId,
422
+ message: `Catalog source "${options.sourceId}" cannot reproduce the damaged Active entry. Use the current candidate replacement Review.`,
423
+ cause: error,
424
+ });
425
+ }
426
+ finally {
427
+ if (resolved)
428
+ await resolved.resolution.cleanup().catch(() => warnCleanupFailure(options.sourceId));
429
+ }
430
+ }
431
+ export async function probeCatalogSourceFreshness(options) {
432
+ const env = options.env ?? process.env;
433
+ options.signal?.throwIfAborted();
434
+ const source = (await readCatalogSourcesConfigSnapshot(env)).config.sources
435
+ .find((entry) => entry.id === options.sourceId);
436
+ if (!source)
437
+ throw new CatalogGenerationError({
438
+ code: 'catalogGenerationSourceMissing',
439
+ sourceId: options.sourceId,
440
+ message: `Catalog source "${options.sourceId}" is not configured.`,
441
+ });
442
+ const active = await resolveActiveCatalogGeneration({
443
+ sourceId: source.id,
444
+ env,
445
+ validatedStoreEntries: options.runtime?.validatedStoreEntries,
446
+ validatingStoreEntries: options.runtime?.validatingStoreEntries,
447
+ }).catch(() => undefined);
448
+ const activeEvidence = active ? {
449
+ logicalIdentity: active.logicalIdentity,
450
+ catalogVersion: active.catalogVersion,
451
+ snapshotDigest: active.snapshotDigest,
452
+ resolvedCommit: active.resolvedCommit,
453
+ } : undefined;
454
+ if (source.type === 'git' && active && options.fullValidation !== true) {
455
+ const remote = await (options.runtime?.probeGitRef ?? catalogGitProviderInternal.probeRef)(source, {
456
+ cliVersion: options.cliVersion,
457
+ env,
458
+ signal: options.signal,
459
+ });
460
+ if (remote.sourceId !== source.id || remote.sourceIdentity !== active.sourceIdentity) {
461
+ throw new CatalogGenerationError({
462
+ code: 'catalogGenerationIdentityMismatch',
463
+ sourceId: source.id,
464
+ message: `Catalog provider returned mismatched identity for source "${source.id}".`,
465
+ });
466
+ }
467
+ if (remote.fixed) {
468
+ return {
469
+ sourceId: source.id,
470
+ state: 'fixed',
471
+ activeVersion: active.catalogVersion,
472
+ activeResolvedCommit: active.resolvedCommit,
473
+ };
474
+ }
475
+ if (remote.resolvedCommit === active.resolvedCommit) {
476
+ return {
477
+ sourceId: source.id,
478
+ state: 'current',
479
+ activeVersion: active.catalogVersion,
480
+ activeResolvedCommit: remote.resolvedCommit,
481
+ };
482
+ }
483
+ }
484
+ const probe = await probeCatalogSourceGeneration({
485
+ sourceId: source.id,
486
+ source,
487
+ cliVersion: options.cliVersion,
488
+ env,
489
+ signal: options.signal,
490
+ runtime: options.runtime,
491
+ });
492
+ return {
493
+ ...compareCatalogGenerationFreshness({
494
+ sourceType: source.type,
495
+ ...(activeEvidence ? { active: activeEvidence } : {}),
496
+ candidate: probe.candidate,
497
+ }),
498
+ sourceId: source.id,
499
+ reusableCandidate: {
500
+ probe,
501
+ sourceConfigFingerprint: calculateCatalogSourceConfigFingerprint(source),
502
+ activeStoreKey: active?.storeKey ?? null,
503
+ },
504
+ };
505
+ }
506
+ export async function recordCatalogGenerationCheck(options) {
507
+ const env = options.env ?? process.env;
508
+ const lastSync = await writeLastSync({
509
+ sourceId: options.probe.sourceId, candidate: options.probe.candidate,
510
+ mode: 'check', state: 'succeeded', env,
511
+ signal: options.signal, runtime: options.runtime,
512
+ });
513
+ const active = (await readCatalogGenerationState(env)).sources[options.probe.sourceId]?.active;
514
+ return {
515
+ catalogGenerationSchemaVersion: 1, sourceId: options.probe.sourceId,
516
+ mode: 'check', outcome: 'checked', activeChanged: false,
517
+ resolution: publicEvidence(options.probe.candidate),
518
+ ...(active ? { active } : {}), lastSync,
519
+ };
520
+ }
521
+ async function activateResolvedCandidate(options) {
522
+ const candidate = options.resolved.candidate;
523
+ const store = options.store ?? await publishCatalogStoreEntry({
524
+ resolution: options.resolved.resolution, env: options.env, signal: options.signal,
525
+ });
526
+ assertStoreMatchesCandidate(options.sourceId, store, candidate);
527
+ return withAwHomeMutationLock({
528
+ env: options.env,
529
+ token: options.token,
530
+ signal: options.signal,
531
+ action: async () => {
532
+ const lockedStore = await readCatalogStoreEntry({
533
+ logicalIdentity: store.metadata.logicalIdentity,
534
+ snapshotDigest: store.metadata.snapshotDigest,
535
+ env: options.env,
536
+ });
537
+ assertStoreMatchesCandidate(options.sourceId, lockedStore, candidate);
538
+ const source = await assertCurrentSource({
539
+ sourceId: options.sourceId,
540
+ candidate,
541
+ env: options.env,
542
+ expectedConfigDigest: options.expectedConfigDigest,
543
+ });
544
+ const syncedAt = now(options.runtime);
545
+ return withCatalogGenerationStateTransaction({
546
+ env: options.env,
547
+ beforeReplace: async () => {
548
+ await assertCurrentSource({
549
+ sourceId: options.sourceId,
550
+ candidate,
551
+ env: options.env,
552
+ expectedConfigDigest: options.expectedConfigDigest,
553
+ });
554
+ },
555
+ action: async (current) => {
556
+ const previous = current.sources[options.sourceId]?.active;
557
+ assertExpectedActive(options.sourceId, previous, options.expectedActive);
558
+ const impact = await inspectActivationImpact({
559
+ sourceId: options.sourceId,
560
+ source,
561
+ cwd: options.cwd ?? process.cwd(),
562
+ env: options.env,
563
+ mode: options.impactMode ?? 'generation',
564
+ candidateManifest: options.resolved.resolution.manifest,
565
+ });
566
+ assertExpectedImpact({
567
+ sourceId: options.sourceId,
568
+ impact,
569
+ expectedImpactDigest: options.expectedImpactDigest,
570
+ });
571
+ const policy = await enforceCatalogActivationPolicy({
572
+ sourceId: options.sourceId,
573
+ source,
574
+ active: previous,
575
+ candidate,
576
+ mode: options.activationMode,
577
+ env: options.env,
578
+ impact,
579
+ impactConfirmed: options.impactConfirmed,
580
+ });
581
+ const activeInput = {
582
+ sourceConfigFingerprint: candidate.sourceConfigFingerprint,
583
+ sourceIdentity: candidate.sourceIdentity,
584
+ requestedRef: candidate.requestedRef,
585
+ resolvedCommit: candidate.resolvedCommit,
586
+ logicalIdentity: store.metadata.logicalIdentity,
587
+ manifestDigest: store.metadata.manifestDigest,
588
+ snapshotDigest: store.metadata.snapshotDigest,
589
+ };
590
+ const unchanged = policy.preserveActive || sameActive(previous, activeInput);
591
+ const active = unchanged
592
+ ? previous
593
+ : { ...activeInput, activatedAt: syncedAt };
594
+ const lastSync = {
595
+ syncedAt, mode: 'sync', state: 'succeeded', resolvedCommit: candidate.resolvedCommit,
596
+ };
597
+ return {
598
+ state: {
599
+ schemaVersion: 1,
600
+ sources: { ...current.sources, [options.sourceId]: { active, lastSync } },
601
+ },
602
+ result: {
603
+ catalogGenerationSchemaVersion: 1, sourceId: options.sourceId,
604
+ mode: 'sync', outcome: unchanged ? 'unchanged' : 'activated',
605
+ activeChanged: !unchanged, resolution: publicEvidence(candidate), active, lastSync,
606
+ impact,
607
+ },
608
+ };
609
+ },
610
+ });
611
+ },
612
+ });
613
+ }
614
+ export async function activateCatalogSourceGeneration(options) {
615
+ const env = options.env ?? process.env;
616
+ const initialCandidate = await readCandidateContinuity(options.sourceId, env);
617
+ let resolved;
618
+ try {
619
+ resolved = await resolveCandidate({ ...options, env });
620
+ if (options.expectedCandidate
621
+ && !compareCatalogGenerationCandidates(options.expectedCandidate, resolved.candidate).matches) {
622
+ throw new CatalogGenerationError({
623
+ code: 'catalogGenerationReviewStale', sourceId: options.sourceId,
624
+ message: `Catalog source "${options.sourceId}" changed after review. Review it again.`,
625
+ });
626
+ }
627
+ const impact = await inspectActivationImpact({
628
+ sourceId: options.sourceId,
629
+ cwd: options.cwd ?? process.cwd(),
630
+ env,
631
+ source: resolved.source,
632
+ mode: options.impactMode ?? 'generation',
633
+ candidateManifest: resolved.resolution.manifest,
634
+ });
635
+ assertExpectedImpact({
636
+ sourceId: options.sourceId,
637
+ impact,
638
+ expectedImpactDigest: options.expectedImpactDigest,
639
+ });
640
+ await options.runtime?.afterCandidateResolved?.();
641
+ return await activateResolvedCandidate({
642
+ ...options,
643
+ env,
644
+ resolved,
645
+ activationMode: options.activationMode ?? 'normal',
646
+ impactConfirmed: options.impactConfirmed === true,
647
+ });
648
+ }
649
+ catch (error) {
650
+ if (!(error instanceof CatalogGenerationError
651
+ && error.code === 'catalogGenerationReviewStale')) {
652
+ await recordFailure({
653
+ sourceId: options.sourceId, candidate: resolved?.candidate ?? initialCandidate, mode: 'sync',
654
+ errorCode: error instanceof CatalogGenerationError
655
+ ? error.code : 'catalogGenerationRefreshFailed',
656
+ env, signal: options.signal, runtime: options.runtime,
657
+ });
658
+ }
659
+ if (error instanceof CatalogGenerationError)
660
+ throw error;
661
+ throw new CatalogGenerationError({
662
+ code: 'catalogGenerationRefreshFailed', sourceId: options.sourceId,
663
+ message: `Cannot sync Catalog source "${options.sourceId}". The previous Active snapshot is unchanged.`,
664
+ cause: error,
665
+ });
666
+ }
667
+ finally {
668
+ if (resolved)
669
+ await resolved.resolution.cleanup().catch(() => warnCleanupFailure(options.sourceId));
670
+ }
671
+ }
672
+ export async function recoverCatalogGenerationStateAndActivate(options) {
673
+ const env = options.env ?? process.env;
674
+ let resolved;
675
+ try {
676
+ resolved = await resolveCandidate({ ...options, env });
677
+ if (!compareCatalogGenerationCandidates(options.expectedCandidate, resolved.candidate).matches) {
678
+ throw new CatalogGenerationError({
679
+ code: 'catalogGenerationReviewStale', sourceId: options.sourceId,
680
+ message: `Catalog source "${options.sourceId}" changed after review. Review it again.`,
681
+ });
682
+ }
683
+ const impact = await inspectCatalogSourceImpact({
684
+ sourceId: options.sourceId,
685
+ cwd: options.cwd ?? process.cwd(),
686
+ env,
687
+ sourcePrimary: resolved.source.primary,
688
+ mode: 'generation',
689
+ candidateManifest: resolved.resolution.manifest,
690
+ });
691
+ assertExpectedImpact({
692
+ sourceId: options.sourceId,
693
+ impact,
694
+ expectedImpactDigest: options.expectedImpactDigest,
695
+ });
696
+ await options.runtime?.afterCandidateResolved?.();
697
+ const store = await publishCatalogStoreEntry({
698
+ resolution: resolved.resolution, env, signal: options.signal,
699
+ });
700
+ assertStoreMatchesCandidate(options.sourceId, store, resolved.candidate);
701
+ await options.runtime?.afterRecoveryStorePublished?.();
702
+ return withAwHomeMutationLock({
703
+ env,
704
+ signal: options.signal,
705
+ action: async () => {
706
+ const lockedStore = await readCatalogStoreEntry({
707
+ logicalIdentity: store.metadata.logicalIdentity,
708
+ snapshotDigest: store.metadata.snapshotDigest,
709
+ env,
710
+ });
711
+ assertStoreMatchesCandidate(options.sourceId, lockedStore, resolved.candidate);
712
+ const source = await assertCurrentSource({
713
+ sourceId: options.sourceId,
714
+ candidate: resolved.candidate,
715
+ env,
716
+ });
717
+ const lockedImpact = await inspectActivationImpact({
718
+ sourceId: options.sourceId,
719
+ source,
720
+ cwd: options.cwd ?? process.cwd(),
721
+ env,
722
+ mode: 'generation',
723
+ candidateManifest: resolved.resolution.manifest,
724
+ });
725
+ assertExpectedImpact({
726
+ sourceId: options.sourceId,
727
+ impact: lockedImpact,
728
+ expectedImpactDigest: options.expectedImpactDigest,
729
+ });
730
+ await enforceCatalogActivationPolicy({
731
+ sourceId: options.sourceId,
732
+ source,
733
+ active: undefined,
734
+ candidate: resolved.candidate,
735
+ mode: 'normal',
736
+ env,
737
+ impact: lockedImpact,
738
+ impactConfirmed: options.impactConfirmed === true,
739
+ });
740
+ const syncedAt = now(options.runtime);
741
+ const candidate = resolved.candidate;
742
+ const active = {
743
+ sourceConfigFingerprint: candidate.sourceConfigFingerprint,
744
+ sourceIdentity: candidate.sourceIdentity,
745
+ requestedRef: candidate.requestedRef,
746
+ resolvedCommit: candidate.resolvedCommit,
747
+ logicalIdentity: store.metadata.logicalIdentity,
748
+ manifestDigest: store.metadata.manifestDigest,
749
+ snapshotDigest: store.metadata.snapshotDigest,
750
+ activatedAt: syncedAt,
751
+ };
752
+ const lastSync = {
753
+ syncedAt, mode: 'sync', state: 'succeeded', resolvedCommit: candidate.resolvedCommit,
754
+ };
755
+ await replaceInvalidCatalogGenerationState({
756
+ env,
757
+ state: { schemaVersion: 1, sources: { [options.sourceId]: { active, lastSync } } },
758
+ beforeReplace: async () => {
759
+ await assertCurrentSource({
760
+ sourceId: options.sourceId, candidate, env,
761
+ });
762
+ },
763
+ });
764
+ return {
765
+ catalogGenerationSchemaVersion: 1,
766
+ sourceId: options.sourceId,
767
+ mode: 'sync',
768
+ outcome: 'activated',
769
+ activeChanged: true,
770
+ resolution: publicEvidence(candidate),
771
+ active,
772
+ lastSync,
773
+ impact: lockedImpact,
774
+ };
775
+ },
776
+ });
777
+ }
778
+ finally {
779
+ if (resolved)
780
+ await resolved.resolution.cleanup().catch(() => warnCleanupFailure(options.sourceId));
781
+ }
782
+ }
783
+ export async function repairCatalogSourceGeneration(options) {
784
+ const env = options.env ?? process.env;
785
+ const target = options.expectedActive === undefined
786
+ ? (await readCatalogGenerationState(env)).sources[options.sourceId]?.active
787
+ : options.expectedActive ?? undefined;
788
+ if (!target)
789
+ throw new CatalogGenerationError({
790
+ code: 'catalogGenerationUnavailable', sourceId: options.sourceId,
791
+ message: `Catalog source "${options.sourceId}" has no Active snapshot to repair.`,
792
+ });
793
+ let resolved;
794
+ let preparedRepair;
795
+ try {
796
+ const config = await readCatalogSourcesConfigSnapshot(env);
797
+ if (options.expectedConfigDigest && config.digest !== options.expectedConfigDigest) {
798
+ throw new CatalogGenerationError({
799
+ code: 'catalogGenerationReviewStale', sourceId: options.sourceId,
800
+ message: `Catalog source "${options.sourceId}" configuration changed after review.`,
801
+ });
802
+ }
803
+ const source = config.config.sources.find((entry) => entry.id === options.sourceId);
804
+ if (!source)
805
+ throw new CatalogGenerationError({
806
+ code: 'catalogGenerationSourceMissing', sourceId: options.sourceId,
807
+ message: `Catalog source "${options.sourceId}" is not configured.`,
808
+ });
809
+ const exactSource = source.type === 'git'
810
+ ? { ...source, refPolicy: { type: 'explicit', ref: target.resolvedCommit } }
811
+ : source;
812
+ const exact = await resolveCandidate({ ...options, source: exactSource, env });
813
+ resolved = {
814
+ ...exact,
815
+ source,
816
+ candidate: {
817
+ ...exact.candidate,
818
+ sourceConfigFingerprint: calculateCatalogSourceConfigFingerprint(source),
819
+ sourceIdentity: await calculateCatalogSourceIdentity(source),
820
+ requestedRef: target.requestedRef,
821
+ },
822
+ };
823
+ if (options.expectedCandidate
824
+ && !compareCatalogGenerationCandidates(options.expectedCandidate, resolved.candidate).matches) {
825
+ throw new CatalogGenerationError({
826
+ code: 'catalogGenerationReviewStale', sourceId: options.sourceId,
827
+ message: `Catalog source "${options.sourceId}" changed after review. Review it again.`,
828
+ });
829
+ }
830
+ await options.runtime?.afterCandidateResolved?.();
831
+ if (resolved.candidate.logicalIdentity !== target.logicalIdentity
832
+ || resolved.candidate.snapshotDigest !== target.snapshotDigest
833
+ || resolved.candidate.manifestDigest !== target.manifestDigest
834
+ || resolved.candidate.resolvedCommit !== target.resolvedCommit) {
835
+ throw new CatalogGenerationError({
836
+ code: 'catalogReplaceDamagedRequired', sourceId: options.sourceId,
837
+ message: `Catalog source "${options.sourceId}" cannot reproduce the damaged Active entry. Use the current candidate replacement Review.`,
838
+ });
839
+ }
840
+ preparedRepair = await prepareCatalogStoreEntryRepair({
841
+ resolution: resolved.resolution,
842
+ logicalIdentity: target.logicalIdentity,
843
+ snapshotDigest: target.snapshotDigest,
844
+ env,
845
+ signal: options.signal,
846
+ });
847
+ return await withAwHomeMutationLock({
848
+ env,
849
+ signal: options.signal,
850
+ action: async () => {
851
+ const currentSource = await assertCurrentSource({
852
+ sourceId: options.sourceId,
853
+ candidate: resolved.candidate,
854
+ env,
855
+ expectedConfigDigest: options.expectedConfigDigest,
856
+ });
857
+ const currentState = await readCatalogGenerationState(env);
858
+ const current = currentState.sources[options.sourceId]?.active;
859
+ assertExpectedActive(options.sourceId, current, options.expectedActive);
860
+ if (options.expectedActive === undefined)
861
+ assertExpectedActive(options.sourceId, current, target);
862
+ await enforceCatalogActivationPolicy({
863
+ sourceId: options.sourceId,
864
+ source: currentSource,
865
+ active: current,
866
+ candidate: resolved.candidate,
867
+ mode: 'exactRepair',
868
+ env,
869
+ impact: {
870
+ impactSchemaVersion: 1,
871
+ sourceId: options.sourceId,
872
+ inventoryComplete: true,
873
+ references: [],
874
+ affectedReferences: [],
875
+ changes: { added: [], removed: [], changed: [], newlyIncompatible: [], dependencyChanged: [] },
876
+ errors: [],
877
+ },
878
+ impactConfirmed: true,
879
+ });
880
+ const store = await preparedRepair.commit();
881
+ assertStoreMatchesCandidate(options.sourceId, store, resolved.candidate);
882
+ const syncedAt = now(options.runtime);
883
+ const lastSync = {
884
+ syncedAt,
885
+ mode: 'sync',
886
+ state: 'succeeded',
887
+ resolvedCommit: target.resolvedCommit,
888
+ };
889
+ await withCatalogGenerationStateTransaction({
890
+ env,
891
+ beforeReplace: async () => {
892
+ await assertCurrentSource({
893
+ sourceId: options.sourceId,
894
+ candidate: resolved.candidate,
895
+ env,
896
+ expectedConfigDigest: options.expectedConfigDigest,
897
+ });
898
+ const active = (await readCatalogGenerationState(env)).sources[options.sourceId]?.active;
899
+ assertExpectedActive(options.sourceId, active, options.expectedActive ?? target);
900
+ },
901
+ action: async (latest) => ({
902
+ state: {
903
+ schemaVersion: 1,
904
+ sources: {
905
+ ...latest.sources,
906
+ [options.sourceId]: { active: target, lastSync },
907
+ },
908
+ },
909
+ result: undefined,
910
+ }),
911
+ });
912
+ return {
913
+ catalogGenerationSchemaVersion: 1,
914
+ sourceId: options.sourceId,
915
+ mode: 'sync',
916
+ outcome: 'unchanged',
917
+ activeChanged: false,
918
+ resolution: publicEvidence(resolved.candidate),
919
+ active: target,
920
+ lastSync,
921
+ };
922
+ },
923
+ });
924
+ }
925
+ catch (error) {
926
+ if (error instanceof CatalogGenerationError)
927
+ throw error;
928
+ throw new CatalogGenerationError({
929
+ code: 'catalogReplaceDamagedRequired', sourceId: options.sourceId,
930
+ message: `Catalog source "${options.sourceId}" cannot reproduce the damaged Active entry. Use --replace-damaged --yes to use the current candidate.`,
931
+ cause: error,
932
+ });
933
+ }
934
+ finally {
935
+ if (preparedRepair)
936
+ await preparedRepair.cleanup();
937
+ if (resolved)
938
+ await resolved.resolution.cleanup().catch(() => warnCleanupFailure(options.sourceId));
939
+ }
940
+ }
941
+ export async function replaceDamagedCatalogSourceGeneration(options) {
942
+ const env = options.env ?? process.env;
943
+ let resolved;
944
+ let preparedRepair;
945
+ try {
946
+ resolved = await resolveCandidate({ ...options, env });
947
+ if (options.expectedCandidate
948
+ && !compareCatalogGenerationCandidates(options.expectedCandidate, resolved.candidate).matches) {
949
+ throw new CatalogGenerationError({
950
+ code: 'catalogGenerationReviewStale', sourceId: options.sourceId,
951
+ message: `Catalog source "${options.sourceId}" changed after review. Review it again.`,
952
+ });
953
+ }
954
+ const targetKey = createCatalogStoreKey(options.expectedActive.logicalIdentity, options.expectedActive.snapshotDigest);
955
+ const candidateKey = createCatalogStoreKey(resolved.candidate.logicalIdentity, resolved.candidate.snapshotDigest);
956
+ const impact = await inspectCatalogSourceImpact({
957
+ sourceId: options.sourceId,
958
+ cwd: options.cwd ?? process.cwd(),
959
+ env,
960
+ sourcePrimary: resolved.source.primary,
961
+ mode: 'generation',
962
+ candidateManifest: resolved.resolution.manifest,
963
+ });
964
+ assertExpectedImpact({
965
+ sourceId: options.sourceId,
966
+ impact,
967
+ expectedImpactDigest: options.expectedImpactDigest,
968
+ });
969
+ await options.runtime?.afterCandidateResolved?.();
970
+ if (targetKey === candidateKey) {
971
+ preparedRepair = await prepareCatalogStoreEntryRepair({
972
+ resolution: resolved.resolution,
973
+ logicalIdentity: resolved.candidate.logicalIdentity,
974
+ snapshotDigest: resolved.candidate.snapshotDigest,
975
+ env,
976
+ signal: options.signal,
977
+ });
978
+ return await withAwHomeMutationLock({
979
+ env,
980
+ signal: options.signal,
981
+ action: async () => {
982
+ const source = await assertCurrentSource({
983
+ sourceId: options.sourceId,
984
+ candidate: resolved.candidate,
985
+ env,
986
+ expectedConfigDigest: options.expectedConfigDigest,
987
+ });
988
+ const syncedAt = now(options.runtime);
989
+ return withCatalogGenerationStateTransaction({
990
+ env,
991
+ beforeReplace: async () => {
992
+ await assertCurrentSource({
993
+ sourceId: options.sourceId,
994
+ candidate: resolved.candidate,
995
+ env,
996
+ expectedConfigDigest: options.expectedConfigDigest,
997
+ });
998
+ },
999
+ action: async (current) => {
1000
+ const previous = current.sources[options.sourceId]?.active;
1001
+ assertExpectedActive(options.sourceId, previous, options.expectedActive);
1002
+ const lockedImpact = await inspectActivationImpact({
1003
+ sourceId: options.sourceId,
1004
+ source,
1005
+ cwd: options.cwd ?? process.cwd(),
1006
+ env,
1007
+ mode: 'generation',
1008
+ candidateManifest: resolved.resolution.manifest,
1009
+ });
1010
+ assertExpectedImpact({
1011
+ sourceId: options.sourceId,
1012
+ impact: lockedImpact,
1013
+ expectedImpactDigest: options.expectedImpactDigest,
1014
+ });
1015
+ await enforceCatalogActivationPolicy({
1016
+ sourceId: options.sourceId,
1017
+ source,
1018
+ active: previous,
1019
+ candidate: resolved.candidate,
1020
+ mode: 'replaceDamaged',
1021
+ env,
1022
+ impact: lockedImpact,
1023
+ impactConfirmed: options.impactConfirmed === true,
1024
+ });
1025
+ const store = await preparedRepair.commit();
1026
+ assertStoreMatchesCandidate(options.sourceId, store, resolved.candidate);
1027
+ const activeInput = {
1028
+ sourceConfigFingerprint: resolved.candidate.sourceConfigFingerprint,
1029
+ sourceIdentity: resolved.candidate.sourceIdentity,
1030
+ requestedRef: resolved.candidate.requestedRef,
1031
+ resolvedCommit: resolved.candidate.resolvedCommit,
1032
+ logicalIdentity: store.metadata.logicalIdentity,
1033
+ manifestDigest: store.metadata.manifestDigest,
1034
+ snapshotDigest: store.metadata.snapshotDigest,
1035
+ };
1036
+ const unchanged = sameActive(previous, activeInput);
1037
+ const active = unchanged
1038
+ ? previous
1039
+ : { ...activeInput, activatedAt: syncedAt };
1040
+ const lastSync = {
1041
+ syncedAt,
1042
+ mode: 'sync',
1043
+ state: 'succeeded',
1044
+ resolvedCommit: resolved.candidate.resolvedCommit,
1045
+ };
1046
+ return {
1047
+ state: {
1048
+ schemaVersion: 1,
1049
+ sources: { ...current.sources, [options.sourceId]: { active, lastSync } },
1050
+ },
1051
+ result: {
1052
+ catalogGenerationSchemaVersion: 1,
1053
+ sourceId: options.sourceId,
1054
+ mode: 'sync',
1055
+ outcome: unchanged ? 'unchanged' : 'activated',
1056
+ activeChanged: !unchanged,
1057
+ resolution: publicEvidence(resolved.candidate),
1058
+ active,
1059
+ lastSync,
1060
+ impact: lockedImpact,
1061
+ },
1062
+ };
1063
+ },
1064
+ });
1065
+ },
1066
+ });
1067
+ }
1068
+ return await activateResolvedCandidate({
1069
+ ...options,
1070
+ env,
1071
+ resolved,
1072
+ expectedActive: options.expectedActive,
1073
+ activationMode: 'replaceDamaged',
1074
+ impactConfirmed: options.impactConfirmed === true,
1075
+ });
1076
+ }
1077
+ finally {
1078
+ if (preparedRepair)
1079
+ await preparedRepair.cleanup();
1080
+ if (resolved)
1081
+ await resolved.resolution.cleanup().catch(() => warnCleanupFailure(options.sourceId));
1082
+ }
1083
+ }
1084
+ async function inferredActivationMode(options) {
1085
+ if (!options.active)
1086
+ return 'normal';
1087
+ const source = (await readCatalogSourcesConfigSnapshot(options.env)).config.sources
1088
+ .find((entry) => entry.id === options.sourceId);
1089
+ if (!source)
1090
+ return 'normal';
1091
+ return options.active.sourceConfigFingerprint !== calculateCatalogSourceConfigFingerprint(source)
1092
+ || options.active.sourceIdentity !== await calculateCatalogSourceIdentity(source)
1093
+ ? 'explicitSourceChange'
1094
+ : 'normal';
1095
+ }
1096
+ export async function syncCatalogSourceGeneration(options) {
1097
+ const env = options.env ?? process.env;
1098
+ if (!options.check) {
1099
+ const config = await readCatalogSourcesConfigSnapshot(env);
1100
+ const active = (await readCatalogGenerationState(env)).sources[options.sourceId]?.active;
1101
+ if (options.replaceDamaged === true && options.impactConfirmed !== true) {
1102
+ throw new CatalogGenerationError({
1103
+ code: 'catalogImpactConfirmationRequired', sourceId: options.sourceId,
1104
+ message: '--replace-damaged requires --yes.',
1105
+ });
1106
+ }
1107
+ if (active) {
1108
+ const damaged = await readCatalogStoreEntry({
1109
+ logicalIdentity: active.logicalIdentity,
1110
+ snapshotDigest: active.snapshotDigest,
1111
+ env,
1112
+ }).then(() => false).catch(() => true);
1113
+ if (damaged) {
1114
+ try {
1115
+ await repairCatalogSourceGeneration({
1116
+ ...options,
1117
+ env,
1118
+ expectedActive: active,
1119
+ expectedConfigDigest: config.digest,
1120
+ });
1121
+ }
1122
+ catch (error) {
1123
+ if (!(error instanceof CatalogGenerationError)
1124
+ || error.code !== 'catalogReplaceDamagedRequired'
1125
+ || options.replaceDamaged !== true)
1126
+ throw error;
1127
+ return replaceDamagedCatalogSourceGeneration({
1128
+ ...options,
1129
+ env,
1130
+ expectedActive: active,
1131
+ expectedConfigDigest: config.digest,
1132
+ impactConfirmed: true,
1133
+ });
1134
+ }
1135
+ }
1136
+ else if (options.replaceDamaged === true) {
1137
+ throw new CatalogGenerationError({
1138
+ code: 'catalogGenerationReviewStale', sourceId: options.sourceId,
1139
+ message: `Catalog source "${options.sourceId}" Active entry is not damaged.`,
1140
+ });
1141
+ }
1142
+ }
1143
+ return activateCatalogSourceGeneration({
1144
+ ...options,
1145
+ env,
1146
+ expectedActive: active ?? null,
1147
+ activationMode: await inferredActivationMode({ sourceId: options.sourceId, active, env }),
1148
+ });
1149
+ }
1150
+ const initialCandidate = await readCandidateContinuity(options.sourceId, env);
1151
+ let probe;
1152
+ try {
1153
+ probe = await probeCatalogSourceGeneration({ ...options, env });
1154
+ const source = (await readCatalogSourcesConfigSnapshot(env)).config.sources
1155
+ .find((entry) => entry.id === options.sourceId);
1156
+ const impact = await inspectCatalogSourceImpact({
1157
+ sourceId: options.sourceId,
1158
+ cwd: options.cwd ?? process.cwd(),
1159
+ env,
1160
+ sourcePrimary: source?.primary === true,
1161
+ mode: 'generation',
1162
+ candidateManifest: probe.manifest,
1163
+ });
1164
+ const result = await recordCatalogGenerationCheck({
1165
+ probe,
1166
+ env,
1167
+ signal: options.signal,
1168
+ runtime: options.runtime,
1169
+ });
1170
+ return { ...result, impact };
1171
+ }
1172
+ catch (error) {
1173
+ await recordFailure({
1174
+ sourceId: options.sourceId, candidate: probe?.candidate ?? initialCandidate, mode: 'check',
1175
+ errorCode: error instanceof CatalogGenerationError
1176
+ ? error.code : 'catalogGenerationRefreshFailed',
1177
+ env, signal: options.signal, runtime: options.runtime,
1178
+ });
1179
+ if (error instanceof CatalogGenerationError)
1180
+ throw error;
1181
+ throw new CatalogGenerationError({
1182
+ code: 'catalogGenerationRefreshFailed', sourceId: options.sourceId,
1183
+ message: `Cannot check Catalog source "${options.sourceId}".`, cause: error,
1184
+ });
1185
+ }
1186
+ }
1187
+ export async function readCatalogGenerationStatus(options = {}) {
1188
+ const env = options.env ?? process.env;
1189
+ const config = await readCatalogSourcesConfigSnapshot(env);
1190
+ const state = await readCatalogGenerationState(env);
1191
+ const selected = options.sourceId
1192
+ ? config.config.sources.filter((source) => source.id === options.sourceId)
1193
+ : config.config.sources;
1194
+ if (options.sourceId && selected.length === 0)
1195
+ throw new CatalogGenerationError({
1196
+ code: 'catalogGenerationSourceMissing', sourceId: options.sourceId,
1197
+ message: `Catalog source "${options.sourceId}" is not configured.`,
1198
+ });
1199
+ const sources = await Promise.all(selected.map(async (source) => {
1200
+ const configuredSourceIdentity = await calculateCatalogSourceIdentity(source);
1201
+ const sourceState = state.sources[source.id];
1202
+ const active = sourceState?.active;
1203
+ const configMatchesActive = Boolean(active)
1204
+ && active.sourceIdentity === configuredSourceIdentity
1205
+ && active.sourceConfigFingerprint === calculateCatalogSourceConfigFingerprint(source);
1206
+ if (!active)
1207
+ return {
1208
+ sourceId: source.id, configuredSourceIdentity, activeReady: false,
1209
+ configMatchesActive: false, lastSync: sourceState?.lastSync,
1210
+ };
1211
+ try {
1212
+ const entry = await readCatalogStoreEntry({
1213
+ logicalIdentity: active.logicalIdentity, snapshotDigest: active.snapshotDigest, env,
1214
+ });
1215
+ if (entry.metadata.manifestDigest !== active.manifestDigest)
1216
+ throw new CatalogGenerationError({
1217
+ code: 'catalogGenerationIdentityMismatch', message: 'Active does not match store metadata.',
1218
+ });
1219
+ return {
1220
+ sourceId: source.id, configuredSourceIdentity, active,
1221
+ activeReady: configMatchesActive, configMatchesActive,
1222
+ catalogVersion: entry.metadata.catalogVersion, channel: entry.metadata.channel,
1223
+ storeKey: createCatalogStoreKey(active.logicalIdentity, active.snapshotDigest),
1224
+ lastSync: sourceState?.lastSync,
1225
+ };
1226
+ }
1227
+ catch (error) {
1228
+ return {
1229
+ sourceId: source.id, configuredSourceIdentity, active, activeReady: false,
1230
+ configMatchesActive, lastSync: sourceState?.lastSync,
1231
+ errorCode: catalogGenerationErrorCode(error),
1232
+ };
1233
+ }
1234
+ }));
1235
+ return { catalogGenerationStatusSchemaVersion: 1, sources };
1236
+ }
1237
+ //# sourceMappingURL=catalog-generation-service.js.map