@lesliechan721/aw 0.1.0-beta.5 → 0.1.0-beta.50

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 (566) hide show
  1. package/dist/authoring/assets/aw-config.mjs +100 -501
  2. package/dist/authoring/assets/aw-config.mjs.map +1 -1
  3. package/dist/authoring/assets/aw-runtime-config.d.mts +13 -0
  4. package/dist/authoring/assets/aw-runtime-config.mjs +199 -0
  5. package/dist/authoring/assets/aw-runtime-config.mjs.map +1 -0
  6. package/dist/authoring/scripts/add-skill.mjs +4 -4
  7. package/dist/authoring/scripts/add-skill.mjs.map +1 -1
  8. package/dist/authoring/scripts/init-plugin.mjs +67 -97
  9. package/dist/authoring/scripts/init-plugin.mjs.map +1 -1
  10. package/dist/authoring/scripts/lib/plugin-root.mjs +4 -4
  11. package/dist/authoring/scripts/lib/plugin-root.mjs.map +1 -1
  12. package/dist/authoring/scripts/lib/plugin-version-check.d.mts +1 -0
  13. package/dist/authoring/scripts/lib/plugin-version-check.mjs +229 -8
  14. package/dist/authoring/scripts/lib/plugin-version-check.mjs.map +1 -1
  15. package/dist/authoring/scripts/lib/skill-scaffold.d.mts +77 -90
  16. package/dist/authoring/scripts/lib/skill-scaffold.mjs +99 -120
  17. package/dist/authoring/scripts/lib/skill-scaffold.mjs.map +1 -1
  18. package/dist/authoring/scripts/plugin-status.mjs +8 -11
  19. package/dist/authoring/scripts/plugin-status.mjs.map +1 -1
  20. package/dist/authoring/scripts/remove-plugin.mjs +3 -2
  21. package/dist/authoring/scripts/remove-plugin.mjs.map +1 -1
  22. package/dist/authoring/scripts/validate-plugin.mjs +346 -1131
  23. package/dist/authoring/scripts/validate-plugin.mjs.map +1 -1
  24. package/dist/scripts/aw-skill-eval-materializer.d.ts +26 -0
  25. package/dist/scripts/aw-skill-eval-materializer.js +306 -0
  26. package/dist/scripts/aw-skill-eval-materializer.js.map +1 -0
  27. package/dist/scripts/bundle-plugins.d.ts +1 -0
  28. package/dist/scripts/bundle-plugins.js +20 -5
  29. package/dist/scripts/bundle-plugins.js.map +1 -1
  30. package/dist/scripts/plugin-staging.d.ts +7 -9
  31. package/dist/scripts/plugin-staging.js +18 -29
  32. package/dist/scripts/plugin-staging.js.map +1 -1
  33. package/dist/scripts/test-plugin-scripts.d.ts +2 -0
  34. package/dist/scripts/test-plugin-scripts.js +47 -76
  35. package/dist/scripts/test-plugin-scripts.js.map +1 -1
  36. package/dist/scripts/test-workers.d.mts +24 -0
  37. package/dist/scripts/test-workers.mjs +59 -0
  38. package/dist/scripts/test-workers.mjs.map +1 -0
  39. package/dist/src/adapters/helpers.js +2 -2
  40. package/dist/src/adapters/helpers.js.map +1 -1
  41. package/dist/src/authoring/workspace-commands.d.ts +17 -1
  42. package/dist/src/authoring/workspace-commands.js +21 -4
  43. package/dist/src/authoring/workspace-commands.js.map +1 -1
  44. package/dist/src/commands/aw-capabilities.d.ts +78 -0
  45. package/dist/src/commands/aw-capabilities.js +264 -0
  46. package/dist/src/commands/aw-capabilities.js.map +1 -0
  47. package/dist/src/commands/catalog-dev-source.d.ts +154 -0
  48. package/dist/src/commands/catalog-dev-source.js +655 -0
  49. package/dist/src/commands/catalog-dev-source.js.map +1 -0
  50. package/dist/src/commands/catalog-generation.d.ts +21 -0
  51. package/dist/src/commands/catalog-generation.js +9 -0
  52. package/dist/src/commands/catalog-generation.js.map +1 -0
  53. package/dist/src/commands/catalog-publication-inspection.d.ts +71 -30
  54. package/dist/src/commands/catalog-publication-inspection.js +475 -63
  55. package/dist/src/commands/catalog-publication-inspection.js.map +1 -1
  56. package/dist/src/commands/catalog-publication-journal.d.ts +68 -0
  57. package/dist/src/commands/catalog-publication-journal.js +292 -0
  58. package/dist/src/commands/catalog-publication-journal.js.map +1 -0
  59. package/dist/src/commands/catalog-publication-target.d.ts +18 -0
  60. package/dist/src/commands/catalog-publication-target.js +95 -0
  61. package/dist/src/commands/catalog-publication-target.js.map +1 -0
  62. package/dist/src/commands/catalog-publish.d.ts +73 -15
  63. package/dist/src/commands/catalog-publish.js +701 -212
  64. package/dist/src/commands/catalog-publish.js.map +1 -1
  65. package/dist/src/commands/catalog-source.d.ts +60 -22
  66. package/dist/src/commands/catalog-source.js +311 -91
  67. package/dist/src/commands/catalog-source.js.map +1 -1
  68. package/dist/src/commands/catalog-status.d.ts +18 -22
  69. package/dist/src/commands/catalog-status.js +81 -115
  70. package/dist/src/commands/catalog-status.js.map +1 -1
  71. package/dist/src/commands/catalog-store.d.ts +104 -0
  72. package/dist/src/commands/catalog-store.js +685 -0
  73. package/dist/src/commands/catalog-store.js.map +1 -0
  74. package/dist/src/commands/catalog-workspace-resolution.d.ts +13 -0
  75. package/dist/src/commands/catalog-workspace-resolution.js +42 -0
  76. package/dist/src/commands/catalog-workspace-resolution.js.map +1 -0
  77. package/dist/src/commands/console.js +28 -17
  78. package/dist/src/commands/console.js.map +1 -1
  79. package/dist/src/commands/dependency-operation-plan.d.ts +52 -15
  80. package/dist/src/commands/dependency-operation-plan.js +289 -7
  81. package/dist/src/commands/dependency-operation-plan.js.map +1 -1
  82. package/dist/src/commands/init.d.ts +5 -11
  83. package/dist/src/commands/init.js +30 -51
  84. package/dist/src/commands/init.js.map +1 -1
  85. package/dist/src/commands/offline-cleanup-evidence.d.ts +67 -0
  86. package/dist/src/commands/offline-cleanup-evidence.js +181 -0
  87. package/dist/src/commands/offline-cleanup-evidence.js.map +1 -0
  88. package/dist/src/commands/operation-plan.d.ts +146 -0
  89. package/dist/src/commands/operation-plan.js +71 -0
  90. package/dist/src/commands/operation-plan.js.map +1 -0
  91. package/dist/src/commands/operation-planner.d.ts +46 -0
  92. package/dist/src/commands/operation-planner.js +141 -0
  93. package/dist/src/commands/operation-planner.js.map +1 -0
  94. package/dist/src/commands/options.d.ts +9 -7
  95. package/dist/src/commands/options.js +83 -21
  96. package/dist/src/commands/options.js.map +1 -1
  97. package/dist/src/commands/plugin-capabilities.js +23 -3
  98. package/dist/src/commands/plugin-capabilities.js.map +1 -1
  99. package/dist/src/commands/rebuild-command.d.ts +77 -31
  100. package/dist/src/commands/rebuild-command.js +4862 -729
  101. package/dist/src/commands/rebuild-command.js.map +1 -1
  102. package/dist/src/commands/rebuild-integration.d.ts +131 -21
  103. package/dist/src/commands/rebuild-integration.js +2866 -1339
  104. package/dist/src/commands/rebuild-integration.js.map +1 -1
  105. package/dist/src/commands/rebuild-operations.d.ts +58 -30
  106. package/dist/src/commands/rebuild-operations.js +260 -319
  107. package/dist/src/commands/rebuild-operations.js.map +1 -1
  108. package/dist/src/commands/reconcile-operation-plan.d.ts +28 -0
  109. package/dist/src/commands/reconcile-operation-plan.js +47 -0
  110. package/dist/src/commands/reconcile-operation-plan.js.map +1 -0
  111. package/dist/src/commands/review-inspection.d.ts +228 -0
  112. package/dist/src/commands/review-inspection.js +1341 -0
  113. package/dist/src/commands/review-inspection.js.map +1 -0
  114. package/dist/src/commands/review-preparation.d.ts +49 -0
  115. package/dist/src/commands/review-preparation.js +427 -0
  116. package/dist/src/commands/review-preparation.js.map +1 -0
  117. package/dist/src/commands/runtime.d.ts +1 -5
  118. package/dist/src/commands/runtime.js +24 -50
  119. package/dist/src/commands/runtime.js.map +1 -1
  120. package/dist/src/commands/skill-eval.d.ts +39 -0
  121. package/dist/src/commands/skill-eval.js +400 -0
  122. package/dist/src/commands/skill-eval.js.map +1 -0
  123. package/dist/src/commands/status-v6.d.ts +279 -0
  124. package/dist/src/commands/status-v6.js +2787 -0
  125. package/dist/src/commands/status-v6.js.map +1 -0
  126. package/dist/src/commands/sync-command.d.ts +40 -0
  127. package/dist/src/commands/sync-command.js +250 -0
  128. package/dist/src/commands/sync-command.js.map +1 -0
  129. package/dist/src/commands/wizard.d.ts +8 -5
  130. package/dist/src/commands/wizard.js +6 -4
  131. package/dist/src/commands/wizard.js.map +1 -1
  132. package/dist/src/commands/write-commands.d.ts +9 -3
  133. package/dist/src/commands/write-commands.js +127 -31
  134. package/dist/src/commands/write-commands.js.map +1 -1
  135. package/dist/src/constants.d.ts +7 -1
  136. package/dist/src/constants.js +7 -1
  137. package/dist/src/constants.js.map +1 -1
  138. package/dist/src/eval/manifest-v1.d.ts +71 -0
  139. package/dist/src/eval/manifest-v1.js +370 -0
  140. package/dist/src/eval/manifest-v1.js.map +1 -0
  141. package/dist/src/generators/local-plugin.d.ts +5 -1
  142. package/dist/src/generators/local-plugin.js +236 -109
  143. package/dist/src/generators/local-plugin.js.map +1 -1
  144. package/dist/src/index.d.ts +10 -4
  145. package/dist/src/index.js +1793 -486
  146. package/dist/src/index.js.map +1 -1
  147. package/dist/src/output/command-receipt.d.ts +43 -46
  148. package/dist/src/output/command-receipt.js +256 -80
  149. package/dist/src/output/command-receipt.js.map +1 -1
  150. package/dist/src/output/model.d.ts +3 -44
  151. package/dist/src/output/model.js +1 -144
  152. package/dist/src/output/model.js.map +1 -1
  153. package/dist/src/output/rebuild-progress.js +1 -13
  154. package/dist/src/output/rebuild-progress.js.map +1 -1
  155. package/dist/src/portable/commands.d.ts +46 -7
  156. package/dist/src/portable/commands.js +349 -37
  157. package/dist/src/portable/commands.js.map +1 -1
  158. package/dist/src/portable/materializer.d.ts +17 -4
  159. package/dist/src/portable/materializer.js +179 -41
  160. package/dist/src/portable/materializer.js.map +1 -1
  161. package/dist/src/portable/skills-cli.d.ts +15 -7
  162. package/dist/src/portable/skills-cli.js +74 -20
  163. package/dist/src/portable/skills-cli.js.map +1 -1
  164. package/dist/src/review/eval-source-input.d.ts +43 -0
  165. package/dist/src/review/eval-source-input.js +207 -0
  166. package/dist/src/review/eval-source-input.js.map +1 -0
  167. package/dist/src/review/review-profile.d.ts +17 -0
  168. package/dist/src/review/review-profile.js +234 -0
  169. package/dist/src/review/review-profile.js.map +1 -0
  170. package/dist/src/review/review-selection.d.ts +30 -0
  171. package/dist/src/review/review-selection.js +527 -0
  172. package/dist/src/review/review-selection.js.map +1 -0
  173. package/dist/src/review/review-types.d.ts +68 -0
  174. package/dist/src/review/review-types.js +16 -0
  175. package/dist/src/review/review-types.js.map +1 -0
  176. package/dist/src/review/skill-materialization.d.ts +13 -0
  177. package/dist/src/review/skill-materialization.js +75 -0
  178. package/dist/src/review/skill-materialization.js.map +1 -0
  179. package/dist/src/review/source-binding.d.ts +183 -0
  180. package/dist/src/review/source-binding.js +708 -0
  181. package/dist/src/review/source-binding.js.map +1 -0
  182. package/dist/src/tui/catalog-freshness.d.ts +1 -0
  183. package/dist/src/tui/catalog-freshness.js +2 -0
  184. package/dist/src/tui/catalog-freshness.js.map +1 -0
  185. package/dist/src/tui/catalog-generation.d.ts +21 -0
  186. package/dist/src/tui/catalog-generation.js +156 -0
  187. package/dist/src/tui/catalog-generation.js.map +1 -0
  188. package/dist/src/tui/catalog-sources/projection.d.ts +4 -0
  189. package/dist/src/tui/catalog-sources/projection.js +17 -0
  190. package/dist/src/tui/catalog-sources/projection.js.map +1 -0
  191. package/dist/src/tui/catalog-sources/review.d.ts +3 -0
  192. package/dist/src/tui/catalog-sources/review.js +13 -0
  193. package/dist/src/tui/catalog-sources/review.js.map +1 -0
  194. package/dist/src/tui/catalog-sources/screens.d.ts +12 -0
  195. package/dist/src/tui/catalog-sources/screens.js +40 -0
  196. package/dist/src/tui/catalog-sources/screens.js.map +1 -0
  197. package/dist/src/tui/catalog-sources/session.d.ts +32 -0
  198. package/dist/src/tui/catalog-sources/session.js +300 -0
  199. package/dist/src/tui/catalog-sources/session.js.map +1 -0
  200. package/dist/src/tui/catalog-sources/types.d.ts +54 -0
  201. package/dist/src/tui/catalog-sources/types.js +2 -0
  202. package/dist/src/tui/catalog-sources/types.js.map +1 -0
  203. package/dist/src/tui/catalog-store-task.d.ts +16 -0
  204. package/dist/src/tui/catalog-store-task.js +19 -0
  205. package/dist/src/tui/catalog-store-task.js.map +1 -0
  206. package/dist/src/tui/clipboard.d.ts +13 -0
  207. package/dist/src/tui/clipboard.js +95 -0
  208. package/dist/src/tui/clipboard.js.map +1 -0
  209. package/dist/src/tui/components.d.ts +110 -3
  210. package/dist/src/tui/components.js +183 -36
  211. package/dist/src/tui/components.js.map +1 -1
  212. package/dist/src/tui/config-array-draft.d.ts +29 -0
  213. package/dist/src/tui/config-array-draft.js +48 -0
  214. package/dist/src/tui/config-array-draft.js.map +1 -0
  215. package/dist/src/tui/config-leaf-editor.d.ts +16 -0
  216. package/dist/src/tui/config-leaf-editor.js +206 -0
  217. package/dist/src/tui/config-leaf-editor.js.map +1 -0
  218. package/dist/src/tui/config-value-presentation.d.ts +20 -0
  219. package/dist/src/tui/config-value-presentation.js +104 -0
  220. package/dist/src/tui/config-value-presentation.js.map +1 -0
  221. package/dist/src/tui/console-app-v4.d.ts +14 -4
  222. package/dist/src/tui/console-app-v4.js +8941 -1872
  223. package/dist/src/tui/console-app-v4.js.map +1 -1
  224. package/dist/src/tui/content-item-card.d.ts +13 -0
  225. package/dist/src/tui/content-item-card.js +51 -0
  226. package/dist/src/tui/content-item-card.js.map +1 -0
  227. package/dist/src/tui/controller-runtime.d.ts +10 -2
  228. package/dist/src/tui/controller-runtime.js +3211 -388
  229. package/dist/src/tui/controller-runtime.js.map +1 -1
  230. package/dist/src/tui/controller.d.ts +615 -45
  231. package/dist/src/tui/controller.js +3558 -768
  232. package/dist/src/tui/controller.js.map +1 -1
  233. package/dist/src/tui/dependency-graph-view.d.ts +39 -0
  234. package/dist/src/tui/dependency-graph-view.js +121 -0
  235. package/dist/src/tui/dependency-graph-view.js.map +1 -0
  236. package/dist/src/tui/dependency-graph.d.ts +81 -0
  237. package/dist/src/tui/dependency-graph.js +452 -0
  238. package/dist/src/tui/dependency-graph.js.map +1 -0
  239. package/dist/src/tui/diagnostic-projection.d.ts +23 -0
  240. package/dist/src/tui/diagnostic-projection.js +567 -0
  241. package/dist/src/tui/diagnostic-projection.js.map +1 -0
  242. package/dist/src/tui/diagnostics.d.ts +3 -3
  243. package/dist/src/tui/diagnostics.js +14 -2
  244. package/dist/src/tui/diagnostics.js.map +1 -1
  245. package/dist/src/tui/entity-cards.d.ts +55 -0
  246. package/dist/src/tui/entity-cards.js +220 -0
  247. package/dist/src/tui/entity-cards.js.map +1 -0
  248. package/dist/src/tui/glossary.d.ts +23 -0
  249. package/dist/src/tui/glossary.js +42 -0
  250. package/dist/src/tui/glossary.js.map +1 -0
  251. package/dist/src/tui/index.d.ts +6 -1
  252. package/dist/src/tui/index.js +5 -1
  253. package/dist/src/tui/index.js.map +1 -1
  254. package/dist/src/tui/input-display.d.ts +9 -0
  255. package/dist/src/tui/input-display.js +58 -0
  256. package/dist/src/tui/input-display.js.map +1 -0
  257. package/dist/src/tui/keys.d.ts +44 -0
  258. package/dist/src/tui/keys.js +43 -15
  259. package/dist/src/tui/keys.js.map +1 -1
  260. package/dist/src/tui/lifecycle-action-view.d.ts +6 -0
  261. package/dist/src/tui/lifecycle-action-view.js +36 -0
  262. package/dist/src/tui/lifecycle-action-view.js.map +1 -0
  263. package/dist/src/tui/model.d.ts +223 -31
  264. package/dist/src/tui/model.js +1510 -397
  265. package/dist/src/tui/model.js.map +1 -1
  266. package/dist/src/tui/operation-diagnostic-screens.d.ts +8 -0
  267. package/dist/src/tui/operation-diagnostic-screens.js +71 -0
  268. package/dist/src/tui/operation-diagnostic-screens.js.map +1 -0
  269. package/dist/src/tui/operation-history.d.ts +81 -0
  270. package/dist/src/tui/operation-history.js +136 -0
  271. package/dist/src/tui/operation-history.js.map +1 -0
  272. package/dist/src/tui/operation-review-planner.d.ts +21 -0
  273. package/dist/src/tui/operation-review-planner.js +1295 -0
  274. package/dist/src/tui/operation-review-planner.js.map +1 -0
  275. package/dist/src/tui/plugin-content.d.ts +31 -0
  276. package/dist/src/tui/plugin-content.js +680 -0
  277. package/dist/src/tui/plugin-content.js.map +1 -0
  278. package/dist/src/tui/plugin-detail.d.ts +52 -0
  279. package/dist/src/tui/plugin-detail.js +165 -0
  280. package/dist/src/tui/plugin-detail.js.map +1 -0
  281. package/dist/src/tui/plugin-write-task.d.ts +69 -0
  282. package/dist/src/tui/plugin-write-task.js +286 -0
  283. package/dist/src/tui/plugin-write-task.js.map +1 -0
  284. package/dist/src/tui/project-inventory.d.ts +68 -0
  285. package/dist/src/tui/project-inventory.js +203 -0
  286. package/dist/src/tui/project-inventory.js.map +1 -0
  287. package/dist/src/tui/prompt.js +4 -15
  288. package/dist/src/tui/prompt.js.map +1 -1
  289. package/dist/src/tui/query-header.d.ts +30 -0
  290. package/dist/src/tui/query-header.js +40 -0
  291. package/dist/src/tui/query-header.js.map +1 -0
  292. package/dist/src/tui/reader.d.ts +37 -0
  293. package/dist/src/tui/reader.js +47 -0
  294. package/dist/src/tui/reader.js.map +1 -0
  295. package/dist/src/tui/router.d.ts +197 -10
  296. package/dist/src/tui/router.js +338 -50
  297. package/dist/src/tui/router.js.map +1 -1
  298. package/dist/src/tui/screen-registry.d.ts +701 -0
  299. package/dist/src/tui/screen-registry.js +230 -0
  300. package/dist/src/tui/screen-registry.js.map +1 -0
  301. package/dist/src/tui/session-console-app.d.ts +6 -0
  302. package/dist/src/tui/session-console-app.js +13 -0
  303. package/dist/src/tui/session-console-app.js.map +1 -0
  304. package/dist/src/tui/session-host.d.ts +45 -0
  305. package/dist/src/tui/session-host.js +209 -0
  306. package/dist/src/tui/session-host.js.map +1 -0
  307. package/dist/src/tui/source-detail-card.d.ts +29 -0
  308. package/dist/src/tui/source-detail-card.js +45 -0
  309. package/dist/src/tui/source-detail-card.js.map +1 -0
  310. package/dist/src/tui/source-ref-presets.d.ts +3 -0
  311. package/dist/src/tui/source-ref-presets.js +11 -0
  312. package/dist/src/tui/source-ref-presets.js.map +1 -0
  313. package/dist/src/tui/theme.d.ts +12 -0
  314. package/dist/src/tui/theme.js +12 -0
  315. package/dist/src/tui/theme.js.map +1 -1
  316. package/dist/src/tui/viewport.d.ts +1 -0
  317. package/dist/src/tui/viewport.js +23 -0
  318. package/dist/src/tui/viewport.js.map +1 -1
  319. package/dist/src/tui/views.js +31 -3
  320. package/dist/src/tui/views.js.map +1 -1
  321. package/dist/src/tui/wizard.js +37 -13
  322. package/dist/src/tui/wizard.js.map +1 -1
  323. package/dist/src/types.d.ts +244 -20
  324. package/dist/src/types.js +1 -0
  325. package/dist/src/types.js.map +1 -1
  326. package/dist/src/utils/agent-version.d.ts +7 -1
  327. package/dist/src/utils/agent-version.js +41 -8
  328. package/dist/src/utils/agent-version.js.map +1 -1
  329. package/dist/src/utils/artifact-plan.d.ts +5 -4
  330. package/dist/src/utils/artifact-plan.js +18 -7
  331. package/dist/src/utils/artifact-plan.js.map +1 -1
  332. package/dist/src/utils/artifact-renderer.d.ts +17 -7
  333. package/dist/src/utils/artifact-renderer.js +214 -216
  334. package/dist/src/utils/artifact-renderer.js.map +1 -1
  335. package/dist/src/utils/artifact-request.d.ts +21 -0
  336. package/dist/src/utils/artifact-request.js +78 -0
  337. package/dist/src/utils/artifact-request.js.map +1 -0
  338. package/dist/src/utils/aw-home-mutation-lock.d.ts +1 -0
  339. package/dist/src/utils/aw-home-mutation-lock.js +32 -4
  340. package/dist/src/utils/aw-home-mutation-lock.js.map +1 -1
  341. package/dist/src/utils/bundle-integrity.d.ts +0 -1
  342. package/dist/src/utils/bundle-integrity.js +0 -25
  343. package/dist/src/utils/bundle-integrity.js.map +1 -1
  344. package/dist/src/utils/bundle-layout.js +22 -29
  345. package/dist/src/utils/bundle-layout.js.map +1 -1
  346. package/dist/src/utils/catalog-capability-projection.d.ts +8 -0
  347. package/dist/src/utils/catalog-capability-projection.js +14 -0
  348. package/dist/src/utils/catalog-capability-projection.js.map +1 -0
  349. package/dist/src/utils/catalog-digests.d.ts +10 -0
  350. package/dist/src/utils/catalog-digests.js +57 -20
  351. package/dist/src/utils/catalog-digests.js.map +1 -1
  352. package/dist/src/utils/catalog-generation-control-snapshot.d.ts +11 -0
  353. package/dist/src/utils/catalog-generation-control-snapshot.js +45 -0
  354. package/dist/src/utils/catalog-generation-control-snapshot.js.map +1 -0
  355. package/dist/src/utils/catalog-generation-error.d.ts +16 -0
  356. package/dist/src/utils/catalog-generation-error.js +30 -0
  357. package/dist/src/utils/catalog-generation-error.js.map +1 -0
  358. package/dist/src/utils/catalog-generation-resolver.d.ts +44 -0
  359. package/dist/src/utils/catalog-generation-resolver.js +273 -0
  360. package/dist/src/utils/catalog-generation-resolver.js.map +1 -0
  361. package/dist/src/utils/catalog-generation-service.d.ts +172 -0
  362. package/dist/src/utils/catalog-generation-service.js +1271 -0
  363. package/dist/src/utils/catalog-generation-service.js.map +1 -0
  364. package/dist/src/utils/catalog-generation-state.d.ts +22 -0
  365. package/dist/src/utils/catalog-generation-state.js +192 -0
  366. package/dist/src/utils/catalog-generation-state.js.map +1 -0
  367. package/dist/src/utils/catalog-generation-store.d.ts +58 -0
  368. package/dist/src/utils/catalog-generation-store.js +452 -0
  369. package/dist/src/utils/catalog-generation-store.js.map +1 -0
  370. package/dist/src/utils/catalog-manifest-v7.d.ts +5 -0
  371. package/dist/src/utils/{catalog-manifest-v4.js → catalog-manifest-v7.js} +35 -43
  372. package/dist/src/utils/catalog-manifest-v7.js.map +1 -0
  373. package/dist/src/utils/catalog-operation-context.d.ts +20 -0
  374. package/dist/src/utils/catalog-operation-context.js +142 -0
  375. package/dist/src/utils/catalog-operation-context.js.map +1 -0
  376. package/dist/src/utils/catalog-public-error.d.ts +7 -3
  377. package/dist/src/utils/catalog-public-error.js +28 -8
  378. package/dist/src/utils/catalog-public-error.js.map +1 -1
  379. package/dist/src/utils/catalog-runtime-projection.d.ts +3 -0
  380. package/dist/src/utils/catalog-runtime-projection.js +5 -40
  381. package/dist/src/utils/catalog-runtime-projection.js.map +1 -1
  382. package/dist/src/utils/catalog-snapshot.d.ts +5 -3
  383. package/dist/src/utils/catalog-snapshot.js +11 -3
  384. package/dist/src/utils/catalog-snapshot.js.map +1 -1
  385. package/dist/src/utils/catalog-source-identity.d.ts +1 -0
  386. package/dist/src/utils/catalog-source-identity.js +21 -2
  387. package/dist/src/utils/catalog-source-identity.js.map +1 -1
  388. package/dist/src/utils/catalog-source-impact.d.ts +21 -0
  389. package/dist/src/utils/catalog-source-impact.js +344 -0
  390. package/dist/src/utils/catalog-source-impact.js.map +1 -0
  391. package/dist/src/utils/catalog-source-references.d.ts +3 -2
  392. package/dist/src/utils/catalog-source-references.js +195 -347
  393. package/dist/src/utils/catalog-source-references.js.map +1 -1
  394. package/dist/src/utils/catalog-sources.d.ts +15 -1
  395. package/dist/src/utils/catalog-sources.js +206 -27
  396. package/dist/src/utils/catalog-sources.js.map +1 -1
  397. package/dist/src/utils/codex-config.d.ts +2 -0
  398. package/dist/src/utils/codex-config.js +26 -5
  399. package/dist/src/utils/codex-config.js.map +1 -1
  400. package/dist/src/utils/codex-manager.d.ts +79 -0
  401. package/dist/src/utils/codex-manager.js +747 -0
  402. package/dist/src/utils/codex-manager.js.map +1 -0
  403. package/dist/src/utils/codex-marketplace-path.d.ts +5 -0
  404. package/dist/src/utils/codex-marketplace-path.js +45 -0
  405. package/dist/src/utils/codex-marketplace-path.js.map +1 -0
  406. package/dist/src/utils/codex-native-observation.d.ts +49 -0
  407. package/dist/src/utils/codex-native-observation.js +154 -0
  408. package/dist/src/utils/codex-native-observation.js.map +1 -0
  409. package/dist/src/utils/codex-native-render-receipt.d.ts +40 -0
  410. package/dist/src/utils/codex-native-render-receipt.js +205 -0
  411. package/dist/src/utils/codex-native-render-receipt.js.map +1 -0
  412. package/dist/src/utils/codex-reconciler.d.ts +126 -0
  413. package/dist/src/utils/codex-reconciler.js +298 -0
  414. package/dist/src/utils/codex-reconciler.js.map +1 -0
  415. package/dist/src/utils/codex-shared-native.d.ts +43 -0
  416. package/dist/src/utils/codex-shared-native.js +81 -0
  417. package/dist/src/utils/codex-shared-native.js.map +1 -0
  418. package/dist/src/utils/codex-skill-staging.d.ts +2 -0
  419. package/dist/src/utils/codex-skill-staging.js.map +1 -1
  420. package/dist/src/utils/codex-surface-analysis.d.ts +46 -0
  421. package/dist/src/utils/codex-surface-analysis.js +247 -0
  422. package/dist/src/utils/codex-surface-analysis.js.map +1 -0
  423. package/dist/src/utils/dynamic-skill-tree.d.ts +4 -0
  424. package/dist/src/utils/dynamic-skill-tree.js +35 -5
  425. package/dist/src/utils/dynamic-skill-tree.js.map +1 -1
  426. package/dist/src/utils/git-catalog-provider.d.ts +16 -0
  427. package/dist/src/utils/git-catalog-provider.js +177 -145
  428. package/dist/src/utils/git-catalog-provider.js.map +1 -1
  429. package/dist/src/utils/local-marketplace.d.ts +18 -1
  430. package/dist/src/utils/local-marketplace.js +354 -84
  431. package/dist/src/utils/local-marketplace.js.map +1 -1
  432. package/dist/src/utils/manifest.d.ts +1 -3
  433. package/dist/src/utils/manifest.js +1 -3
  434. package/dist/src/utils/manifest.js.map +1 -1
  435. package/dist/src/utils/multi-source-catalog.d.ts +3 -9
  436. package/dist/src/utils/multi-source-catalog.js +54 -110
  437. package/dist/src/utils/multi-source-catalog.js.map +1 -1
  438. package/dist/src/utils/native-cli.d.ts +55 -7
  439. package/dist/src/utils/native-cli.js +400 -58
  440. package/dist/src/utils/native-cli.js.map +1 -1
  441. package/dist/src/utils/orphan-marketplace-cleanup.js +0 -4
  442. package/dist/src/utils/orphan-marketplace-cleanup.js.map +1 -1
  443. package/dist/src/utils/ownership.d.ts +84 -20
  444. package/dist/src/utils/ownership.js +179 -222
  445. package/dist/src/utils/ownership.js.map +1 -1
  446. package/dist/src/utils/path-catalog-provider.d.ts +1 -1
  447. package/dist/src/utils/path-catalog-provider.js +54 -65
  448. package/dist/src/utils/path-catalog-provider.js.map +1 -1
  449. package/dist/src/utils/paths.d.ts +0 -1
  450. package/dist/src/utils/paths.js +0 -1
  451. package/dist/src/utils/paths.js.map +1 -1
  452. package/dist/src/utils/plugin-config-impact.d.ts +33 -0
  453. package/dist/src/utils/plugin-config-impact.js +298 -0
  454. package/dist/src/utils/plugin-config-impact.js.map +1 -0
  455. package/dist/src/utils/plugin-config-write.d.ts +52 -27
  456. package/dist/src/utils/plugin-config-write.js +1000 -296
  457. package/dist/src/utils/plugin-config-write.js.map +1 -1
  458. package/dist/src/utils/plugin-config.d.ts +153 -93
  459. package/dist/src/utils/plugin-config.js +1116 -968
  460. package/dist/src/utils/plugin-config.js.map +1 -1
  461. package/dist/src/utils/plugin-intent-state.d.ts +49 -0
  462. package/dist/src/utils/plugin-intent-state.js +320 -0
  463. package/dist/src/utils/plugin-intent-state.js.map +1 -0
  464. package/dist/src/utils/plugin-scripts.d.ts +65 -125
  465. package/dist/src/utils/plugin-scripts.js +484 -524
  466. package/dist/src/utils/plugin-scripts.js.map +1 -1
  467. package/dist/src/utils/process-tree.d.ts +2 -2
  468. package/dist/src/utils/process-tree.js +1 -1
  469. package/dist/src/utils/process-tree.js.map +1 -1
  470. package/dist/src/utils/project-boundary.d.ts +11 -13
  471. package/dist/src/utils/project-boundary.js +28 -34
  472. package/dist/src/utils/project-boundary.js.map +1 -1
  473. package/dist/src/utils/runtime-config.d.ts +20 -0
  474. package/dist/src/utils/runtime-config.js +75 -0
  475. package/dist/src/utils/runtime-config.js.map +1 -0
  476. package/dist/src/utils/safe-fs.d.ts +21 -0
  477. package/dist/src/utils/safe-fs.js +111 -0
  478. package/dist/src/utils/safe-fs.js.map +1 -0
  479. package/dist/src/utils/safe-operation-diagnostic.d.ts +15 -0
  480. package/dist/src/utils/safe-operation-diagnostic.js +33 -0
  481. package/dist/src/utils/safe-operation-diagnostic.js.map +1 -0
  482. package/dist/src/utils/sensitive-content.d.ts +4 -0
  483. package/dist/src/utils/sensitive-content.js +36 -0
  484. package/dist/src/utils/sensitive-content.js.map +1 -0
  485. package/dist/src/utils/state-paths.js +7 -2
  486. package/dist/src/utils/state-paths.js.map +1 -1
  487. package/dist/src/utils/target-eligibility.d.ts +8 -2
  488. package/dist/src/utils/target-eligibility.js +17 -8
  489. package/dist/src/utils/target-eligibility.js.map +1 -1
  490. package/dist/src/utils/windows-claude-shim.d.ts +7 -0
  491. package/dist/src/utils/windows-claude-shim.js +10 -0
  492. package/dist/src/utils/windows-claude-shim.js.map +1 -0
  493. package/dist/src/utils/windows-npm-shim.d.ts +14 -0
  494. package/dist/src/utils/windows-npm-shim.js +140 -0
  495. package/dist/src/utils/windows-npm-shim.js.map +1 -0
  496. package/dist/vitest.config.js +92 -10
  497. package/dist/vitest.config.js.map +1 -1
  498. package/package.json +27 -18
  499. package/dist/authoring/scripts/check-plugin-versions.d.mts +0 -2
  500. package/dist/authoring/scripts/check-plugin-versions.mjs +0 -5
  501. package/dist/authoring/scripts/check-plugin-versions.mjs.map +0 -1
  502. package/dist/scripts/aw-skill-eval-engine.d.ts +0 -13
  503. package/dist/scripts/aw-skill-eval-engine.js +0 -31
  504. package/dist/scripts/aw-skill-eval-engine.js.map +0 -1
  505. package/dist/scripts/codex-eval-app-server.d.ts +0 -89
  506. package/dist/scripts/codex-eval-app-server.js +0 -1228
  507. package/dist/scripts/codex-eval-app-server.js.map +0 -1
  508. package/dist/scripts/codex-eval-isolation.d.ts +0 -61
  509. package/dist/scripts/codex-eval-isolation.js +0 -318
  510. package/dist/scripts/codex-eval-isolation.js.map +0 -1
  511. package/dist/scripts/codex-eval-process-management.d.ts +0 -8
  512. package/dist/scripts/codex-eval-process-management.js +0 -69
  513. package/dist/scripts/codex-eval-process-management.js.map +0 -1
  514. package/dist/scripts/codex-eval-process-tree.d.ts +0 -38
  515. package/dist/scripts/codex-eval-process-tree.js +0 -803
  516. package/dist/scripts/codex-eval-process-tree.js.map +0 -1
  517. package/dist/scripts/codex-eval-runtime-config.d.ts +0 -62
  518. package/dist/scripts/codex-eval-runtime-config.js +0 -843
  519. package/dist/scripts/codex-eval-runtime-config.js.map +0 -1
  520. package/dist/scripts/codex-trigger-eval.d.ts +0 -84
  521. package/dist/scripts/codex-trigger-eval.js +0 -968
  522. package/dist/scripts/codex-trigger-eval.js.map +0 -1
  523. package/dist/scripts/eval-plugin-skills-audited.d.ts +0 -6
  524. package/dist/scripts/eval-plugin-skills-audited.js +0 -261
  525. package/dist/scripts/eval-plugin-skills-audited.js.map +0 -1
  526. package/dist/scripts/eval-plugin-skills.d.ts +0 -45
  527. package/dist/scripts/eval-plugin-skills.js +0 -1586
  528. package/dist/scripts/eval-plugin-skills.js.map +0 -1
  529. package/dist/scripts/eval-run-layout.d.ts +0 -17
  530. package/dist/scripts/eval-run-layout.js +0 -26
  531. package/dist/scripts/eval-run-layout.js.map +0 -1
  532. package/dist/scripts/plugin-eval-contract.d.ts +0 -185
  533. package/dist/scripts/plugin-eval-contract.js +0 -695
  534. package/dist/scripts/plugin-eval-contract.js.map +0 -1
  535. package/dist/scripts/plugin-eval-materializer.d.ts +0 -13
  536. package/dist/scripts/plugin-eval-materializer.js +0 -421
  537. package/dist/scripts/plugin-eval-materializer.js.map +0 -1
  538. package/dist/scripts/skill-reporting.d.ts +0 -212
  539. package/dist/scripts/skill-reporting.js +0 -922
  540. package/dist/scripts/skill-reporting.js.map +0 -1
  541. package/dist/src/commands/status-v4.d.ts +0 -123
  542. package/dist/src/commands/status-v4.js +0 -905
  543. package/dist/src/commands/status-v4.js.map +0 -1
  544. package/dist/src/commands/status.d.ts +0 -93
  545. package/dist/src/commands/status.js +0 -442
  546. package/dist/src/commands/status.js.map +0 -1
  547. package/dist/src/utils/active-marketplace-runtime-lock.d.ts +0 -12
  548. package/dist/src/utils/active-marketplace-runtime-lock.js +0 -133
  549. package/dist/src/utils/active-marketplace-runtime-lock.js.map +0 -1
  550. package/dist/src/utils/catalog-manifest-v3.d.ts +0 -2
  551. package/dist/src/utils/catalog-manifest-v3.js +0 -3
  552. package/dist/src/utils/catalog-manifest-v3.js.map +0 -1
  553. package/dist/src/utils/catalog-manifest-v4.d.ts +0 -5
  554. package/dist/src/utils/catalog-manifest-v4.js.map +0 -1
  555. package/dist/src/utils/catalog-source-cache.d.ts +0 -62
  556. package/dist/src/utils/catalog-source-cache.js +0 -296
  557. package/dist/src/utils/catalog-source-cache.js.map +0 -1
  558. package/dist/src/utils/codex-project-surface.d.ts +0 -3
  559. package/dist/src/utils/codex-project-surface.js +0 -49
  560. package/dist/src/utils/codex-project-surface.js.map +0 -1
  561. package/dist/src/utils/lifecycle-active-store.d.ts +0 -175
  562. package/dist/src/utils/lifecycle-active-store.js +0 -1276
  563. package/dist/src/utils/lifecycle-active-store.js.map +0 -1
  564. package/dist/src/utils/plugin-release.d.ts +0 -2
  565. package/dist/src/utils/plugin-release.js +0 -2
  566. package/dist/src/utils/plugin-release.js.map +0 -1
@@ -0,0 +1,708 @@
1
+ import crypto from 'node:crypto';
2
+ import path from 'node:path';
3
+ import { canonicalJson, computeCanonicalDirectoryDigest, computeEvalFileDigest, computeEvalProviderDigest, computeSkillDigest, } from '@lesliechan721/agent-skill-eval';
4
+ import { calculateCatalogWorkspaceSourceIdentity, GENERATED_OUTPUT_MARKER_FILENAME, readCatalogWorkspace, formatPluginConfigIssue, validatePluginConfigCandidate, } from '@lesliechan721/aw-plugin-core';
5
+ import fs from 'fs-extra';
6
+ import { assertNoSensitiveProfileConfig, readAwSkillEvalManifest, } from '../eval/manifest-v1.js';
7
+ import { resolveArtifactRenderConfig } from '../utils/artifact-renderer.js';
8
+ import { CLI_RESERVED_IMPORTS } from '../utils/manifest.js';
9
+ import { resolvePluginMetaDependencyClosure } from '../utils/plugin-dependencies.js';
10
+ import { parseAwSourceBindingEvalInput, resolveAwSourceBindingEvalProvider, resolveEvalSourceBindingInput, } from './eval-source-input.js';
11
+ import { normalizeReviewProfileConfig, parseReviewProfile } from './review-profile.js';
12
+ import { resolveReviewSelection } from './review-selection.js';
13
+ export { computeAwSourceBindingSelectedCasesDigest, computeAwSourceBindingSuiteDefaultsDigest, resolveAwSourceBindingEvalProvider, resolveEvalSourceBindingInput, selectAwSourceBindingEvalCases, } from './eval-source-input.js';
14
+ export const AW_SOURCE_BINDING_FILENAME = 'aw-source-binding.json';
15
+ const digestPattern = /^sha256:[0-9a-f]{64}$/u;
16
+ const safeIdPattern = /^[a-z0-9][a-z0-9-]*$/u;
17
+ const unsupportedV1Message = 'AW source binding schema version 1 is unsupported. Run "aw skill eval prepare" or "aw skill materialize" again.';
18
+ function digestCanonical(value) {
19
+ return `sha256:${crypto.createHash('sha256').update(canonicalJson(value)).digest('hex')}`;
20
+ }
21
+ function strictRecord(value, keys) {
22
+ return !!value
23
+ && typeof value === 'object'
24
+ && !Array.isArray(value)
25
+ && Object.keys(value).length === keys.length
26
+ && Object.keys(value).every((key) => keys.includes(key));
27
+ }
28
+ function nonEmptyString(value) {
29
+ return typeof value === 'string' && value.trim() !== '' && value === value.trim();
30
+ }
31
+ function digestString(value) {
32
+ return typeof value === 'string' && digestPattern.test(value);
33
+ }
34
+ function scopeValue(value) {
35
+ return value === 'project' || value === 'user';
36
+ }
37
+ function safeId(value) {
38
+ return typeof value === 'string' && safeIdPattern.test(value);
39
+ }
40
+ function normalizeRelativePath(value) {
41
+ if (typeof value !== 'string'
42
+ || value === ''
43
+ || value.includes('\\')
44
+ || path.posix.isAbsolute(value)
45
+ || path.win32.isAbsolute(value)
46
+ || path.posix.normalize(value) !== value
47
+ || value === '..'
48
+ || value.startsWith('../')) {
49
+ throw new Error('Source binding artifact path must be a safe relative POSIX path.');
50
+ }
51
+ return value;
52
+ }
53
+ function normalizeSource(value) {
54
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
55
+ throw new Error('Source binding source must be an object.');
56
+ }
57
+ const row = value;
58
+ if (row.kind === 'workspace') {
59
+ if (!strictRecord(row, ['kind', 'workspaceIdentity', 'sourceIdentity'])
60
+ || !nonEmptyString(row.workspaceIdentity)
61
+ || !digestString(row.sourceIdentity))
62
+ throw new Error('Source binding Workspace identity is invalid.');
63
+ return {
64
+ kind: 'workspace',
65
+ workspaceIdentity: row.workspaceIdentity,
66
+ sourceIdentity: row.sourceIdentity,
67
+ };
68
+ }
69
+ if (row.kind !== 'catalog-snapshot'
70
+ || !strictRecord(row, [
71
+ 'kind',
72
+ 'sourceId',
73
+ 'catalogSourceIdentity',
74
+ 'logicalIdentity',
75
+ 'snapshotDigest',
76
+ 'workspaceIdentity',
77
+ 'workspaceSourceIdentity',
78
+ ])
79
+ || !safeId(row.sourceId)
80
+ || !digestString(row.catalogSourceIdentity)
81
+ || !nonEmptyString(row.logicalIdentity)
82
+ || !digestString(row.snapshotDigest)
83
+ || !nonEmptyString(row.workspaceIdentity)
84
+ || !digestString(row.workspaceSourceIdentity))
85
+ throw new Error('Source binding Catalog snapshot identity is invalid.');
86
+ return {
87
+ kind: 'catalog-snapshot',
88
+ sourceId: row.sourceId,
89
+ catalogSourceIdentity: row.catalogSourceIdentity,
90
+ logicalIdentity: row.logicalIdentity,
91
+ snapshotDigest: row.snapshotDigest,
92
+ workspaceIdentity: row.workspaceIdentity,
93
+ workspaceSourceIdentity: row.workspaceSourceIdentity,
94
+ };
95
+ }
96
+ function normalizeSubject(value) {
97
+ const row = value;
98
+ if (!strictRecord(row, ['plugin', ...(row?.skill === undefined ? [] : ['skill']), ...(row?.suite === undefined ? [] : ['suite'])])
99
+ || !safeId(row.plugin)
100
+ || (row.skill !== undefined && !safeId(row.skill))
101
+ || (row.suite !== undefined && !safeId(row.suite)))
102
+ throw new Error('Source binding subject is invalid.');
103
+ if (row.suite !== undefined && row.skill === undefined) {
104
+ throw new Error('Source binding suite requires a Skill subject.');
105
+ }
106
+ return {
107
+ plugin: row.plugin,
108
+ ...(row.skill === undefined ? {} : { skill: row.skill }),
109
+ ...(row.suite === undefined ? {} : { suite: row.suite }),
110
+ };
111
+ }
112
+ function normalizeProfile(value) {
113
+ const row = value;
114
+ if (row?.kind === 'review')
115
+ return parseReviewProfile(value);
116
+ if (!strictRecord(row, ['kind', 'id', 'scope', 'inputDigest',
117
+ ...(row?.kind === 'eval' && row.config !== undefined ? ['config'] : [])])
118
+ || !scopeValue(row.scope)
119
+ || !digestString(row.inputDigest))
120
+ throw new Error('Source binding profile is invalid.');
121
+ if (row.kind === 'eval' && safeId(row.id)) {
122
+ return {
123
+ kind: 'eval', id: row.id, scope: row.scope, inputDigest: row.inputDigest,
124
+ ...(row.config === undefined ? {} : { config: normalizeReviewProfileConfig(row.config) }),
125
+ };
126
+ }
127
+ if (row.kind === 'portable' && row.id === `agent-skills-${row.scope}`) {
128
+ return {
129
+ kind: 'portable',
130
+ id: `agent-skills-${row.scope}`,
131
+ scope: row.scope,
132
+ inputDigest: row.inputDigest,
133
+ };
134
+ }
135
+ throw new Error('Source binding profile kind or id is invalid.');
136
+ }
137
+ function normalizeArtifact(value) {
138
+ const row = value;
139
+ if (!row || typeof row !== 'object' || Array.isArray(row) || !digestString(row.digest)) {
140
+ throw new Error('Source binding artifact is invalid.');
141
+ }
142
+ const relativePath = normalizeRelativePath(row.path);
143
+ if (row.kind === 'eval-target') {
144
+ if (!strictRecord(row, ['kind', 'skill', 'path', 'digest']) || !safeId(row.skill)) {
145
+ throw new Error('Source binding Eval Skill artifact is invalid.');
146
+ }
147
+ return { kind: row.kind, skill: row.skill, path: relativePath, digest: row.digest };
148
+ }
149
+ if (row.kind === 'portable-skill' || row.kind === 'review-skill') {
150
+ if (!strictRecord(row, ['kind', 'plugin', 'skill', 'path', 'digest'])
151
+ || !safeId(row.plugin)
152
+ || !safeId(row.skill))
153
+ throw new Error('Source binding materialized Skill artifact is invalid.');
154
+ return {
155
+ kind: row.kind,
156
+ plugin: row.plugin,
157
+ skill: row.skill,
158
+ path: relativePath,
159
+ digest: row.digest,
160
+ };
161
+ }
162
+ if (row.kind === 'eval-workspace' || row.kind === 'eval-cases') {
163
+ if (!strictRecord(row, ['kind', 'path', 'digest'])) {
164
+ throw new Error('Source binding Eval artifact is invalid.');
165
+ }
166
+ return { kind: row.kind, path: relativePath, digest: row.digest };
167
+ }
168
+ throw new Error('Source binding artifact kind is invalid.');
169
+ }
170
+ export function parseAwSourceBinding(value) {
171
+ const row = value;
172
+ if (row?.schemaVersion === 1 && row.kind === 'aw-source-binding') {
173
+ throw new Error(unsupportedV1Message);
174
+ }
175
+ if (!strictRecord(row, [
176
+ 'schemaVersion',
177
+ 'kind',
178
+ 'source',
179
+ 'subject',
180
+ 'profile',
181
+ ...(row?.evalInput === undefined ? [] : ['evalInput']),
182
+ 'artifacts',
183
+ 'finalDigest',
184
+ ])
185
+ || row.schemaVersion !== 2
186
+ || row.kind !== 'aw-source-binding'
187
+ || !Array.isArray(row.artifacts)
188
+ || row.artifacts.length === 0
189
+ || !digestString(row.finalDigest))
190
+ throw new Error('Source binding receipt is invalid.');
191
+ const binding = {
192
+ schemaVersion: 2,
193
+ kind: 'aw-source-binding',
194
+ source: normalizeSource(row.source),
195
+ subject: normalizeSubject(row.subject),
196
+ profile: normalizeProfile(row.profile),
197
+ ...(row.evalInput === undefined ? {} : { evalInput: parseAwSourceBindingEvalInput(row.evalInput) }),
198
+ artifacts: row.artifacts.map(normalizeArtifact),
199
+ finalDigest: row.finalDigest,
200
+ };
201
+ const paths = binding.artifacts.map((artifact) => artifact.path);
202
+ if (new Set(paths).size !== paths.length || paths.includes(AW_SOURCE_BINDING_FILENAME)) {
203
+ throw new Error('Source binding artifact paths must be unique and exclude the receipt.');
204
+ }
205
+ if (binding.profile.kind === 'eval') {
206
+ const expectedKinds = ['eval-cases', 'eval-target', 'eval-workspace'];
207
+ if (binding.artifacts.length !== 3
208
+ || [...binding.artifacts.map((artifact) => artifact.kind)].sort().join(',') !== expectedKinds.join(',')
209
+ || binding.subject.skill === undefined
210
+ || binding.subject.suite === undefined
211
+ || binding.evalInput === undefined
212
+ || binding.artifacts.some((artifact) => artifact.kind === 'eval-target' && artifact.skill !== binding.subject.skill))
213
+ throw new Error('Source binding artifacts do not match the Eval profile.');
214
+ }
215
+ else if (binding.profile.kind === 'portable') {
216
+ if (binding.subject.skill !== undefined
217
+ || binding.subject.suite !== undefined
218
+ || binding.evalInput !== undefined
219
+ || binding.artifacts.some((artifact) => artifact.kind !== 'portable-skill')
220
+ || new Set(binding.artifacts.map((artifact) => artifact.kind === 'portable-skill' ? artifact.skill : '')).size !== binding.artifacts.length)
221
+ throw new Error('Source binding artifacts do not match the portable profile.');
222
+ }
223
+ else {
224
+ const reviewArtifacts = binding.artifacts.filter((artifact) => artifact.kind === 'review-skill');
225
+ if (binding.subject.suite !== undefined
226
+ || binding.evalInput !== undefined
227
+ || reviewArtifacts.length !== binding.artifacts.length
228
+ || reviewArtifacts.some((artifact) => artifact.plugin !== binding.subject.plugin)
229
+ || new Set(reviewArtifacts.map((artifact) => artifact.skill)).size !== reviewArtifacts.length
230
+ || (binding.subject.skill !== undefined
231
+ && (reviewArtifacts.length !== 1 || reviewArtifacts[0].skill !== binding.subject.skill)))
232
+ throw new Error('Source binding artifacts do not match the Review profile.');
233
+ }
234
+ return binding;
235
+ }
236
+ function bindingDigest(binding) {
237
+ return digestCanonical(binding);
238
+ }
239
+ async function artifactDigest(rootDir, artifact) {
240
+ const relativePath = normalizeRelativePath(artifact.path);
241
+ const absolutePath = path.resolve(rootDir, ...relativePath.split('/'));
242
+ const relative = path.relative(rootDir, absolutePath);
243
+ if (relative === '' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
244
+ throw new Error('Source binding artifact escapes its materialization root.');
245
+ }
246
+ let current = rootDir;
247
+ for (const segment of relativePath.split('/')) {
248
+ current = path.join(current, segment);
249
+ const info = await fs.lstat(current);
250
+ if (info.isSymbolicLink())
251
+ throw new Error('Source binding artifact path contains a symbolic link.');
252
+ }
253
+ if (artifact.kind === 'eval-workspace')
254
+ return computeCanonicalDirectoryDigest(absolutePath);
255
+ if (artifact.kind === 'eval-cases')
256
+ return computeEvalFileDigest(absolutePath);
257
+ return computeSkillDigest(absolutePath);
258
+ }
259
+ export async function writeAwSourceBinding(options) {
260
+ const rootDir = await fs.realpath(options.rootDir);
261
+ const artifacts = [];
262
+ for (const artifact of options.artifacts) {
263
+ artifacts.push({ ...artifact, digest: await artifactDigest(rootDir, artifact) });
264
+ }
265
+ const unsigned = {
266
+ schemaVersion: 2,
267
+ kind: 'aw-source-binding',
268
+ source: options.source,
269
+ subject: options.subject,
270
+ profile: options.profile,
271
+ ...(options.evalInput === undefined ? {} : { evalInput: options.evalInput }),
272
+ artifacts,
273
+ };
274
+ const binding = parseAwSourceBinding({ ...unsigned, finalDigest: bindingDigest(unsigned) });
275
+ const bindingPath = path.join(rootDir, AW_SOURCE_BINDING_FILENAME);
276
+ await fs.writeFile(bindingPath, `${JSON.stringify(binding, null, 2)}\n`, { flag: 'wx' });
277
+ return { bindingPath, binding };
278
+ }
279
+ export async function resolveWorkspaceBindingSource(workspace) {
280
+ return {
281
+ kind: 'workspace',
282
+ workspaceIdentity: workspace.workspaceIdentity,
283
+ sourceIdentity: await calculateCatalogWorkspaceSourceIdentity(workspace),
284
+ };
285
+ }
286
+ export async function resolveCatalogSnapshotBindingSource(source) {
287
+ const markerPath = path.join(source.rootDir, GENERATED_OUTPUT_MARKER_FILENAME);
288
+ const markerInfo = await fs.lstat(markerPath);
289
+ if (!markerInfo.isFile() || markerInfo.isSymbolicLink()) {
290
+ throw new Error('Validated Catalog snapshot marker is unsafe.');
291
+ }
292
+ const marker = await fs.readJson(markerPath);
293
+ if (!strictRecord(marker, ['schemaVersion', 'kind', 'workspaceIdentity', 'sourceIdentity'])
294
+ || marker.schemaVersion !== 1
295
+ || marker.kind !== 'catalog'
296
+ || !nonEmptyString(marker.workspaceIdentity)
297
+ || !digestString(marker.sourceIdentity))
298
+ throw new Error('Validated Catalog snapshot marker is invalid.');
299
+ return {
300
+ kind: 'catalog-snapshot',
301
+ sourceId: source.sourceId,
302
+ catalogSourceIdentity: source.sourceIdentity,
303
+ logicalIdentity: source.logicalIdentity,
304
+ snapshotDigest: source.snapshotDigest,
305
+ workspaceIdentity: marker.workspaceIdentity,
306
+ workspaceSourceIdentity: marker.sourceIdentity,
307
+ };
308
+ }
309
+ export function resolveEvalProfileBindingInput(profile, plugins, configOverrides = {}) {
310
+ assertNoSensitiveProfileConfig(profile, plugins);
311
+ const normalizedConfig = normalizeReviewProfileConfig(configOverrides);
312
+ const selectedPlugins = new Set(profile.plugins.map((entry) => entry.name));
313
+ if (Object.keys(normalizedConfig).some((name) => !selectedPlugins.has(name))) {
314
+ throw new Error('Eval config overrides must name plugins in the selected profile.');
315
+ }
316
+ assertNoSensitiveProfileConfig({
317
+ ...profile,
318
+ plugins: profile.plugins.map((entry) => ({
319
+ ...entry,
320
+ config: { ...entry.config, ...(normalizedConfig[entry.name] ?? {}) },
321
+ })),
322
+ }, plugins);
323
+ const explicitConfig = new Map(profile.plugins.map((entry) => [entry.name, entry.config]));
324
+ const overrides = new Map(Object.entries(profile.configByScope ?? {}).map(([scope, entries]) => [
325
+ scope,
326
+ new Map(entries?.map((entry) => [entry.name, entry.config]) ?? []),
327
+ ]));
328
+ const closure = resolvePluginMetaDependencyClosure(plugins, profile.plugins.map((entry) => entry.name));
329
+ const materializationProfile = {
330
+ id: profile.id,
331
+ scope: profile.scope,
332
+ plugins: closure.map((plugin) => ({
333
+ name: plugin.manifest.name,
334
+ configByScope: Object.fromEntries([
335
+ profile.scope,
336
+ ...((plugin.manifest.artifacts?.targets ?? []).some((target) => target.platform === 'codex'
337
+ && target.target === 'codex.skill'
338
+ && target.scopes.includes(profile.scope)
339
+ && target.delivery?.mode === 'codex-native')
340
+ ? ['user']
341
+ : []),
342
+ ].sort().map((scope) => [
343
+ scope,
344
+ {
345
+ ...(explicitConfig.get(plugin.manifest.name) ?? {}),
346
+ ...(overrides.get(scope)?.get(plugin.manifest.name) ?? {}),
347
+ ...(normalizedConfig[plugin.manifest.name] ?? {}),
348
+ },
349
+ ])),
350
+ })),
351
+ };
352
+ for (const plugin of closure) {
353
+ const installation = materializationProfile.plugins.find((entry) => entry.name === plugin.manifest.name);
354
+ for (const [scope, config] of Object.entries(installation.configByScope)) {
355
+ for (const [key, field] of Object.entries(plugin.manifest.config?.fields ?? {})) {
356
+ if (field.required === true && field.default === undefined && !Object.hasOwn(config, key)) {
357
+ throw new Error(`Eval profile "${profile.id}" is missing required config "${key}" `
358
+ + `for plugin "${plugin.manifest.name}" in ${scope} scope.`);
359
+ }
360
+ }
361
+ if (plugin.manifest.config) {
362
+ const defaults = Object.fromEntries(Object.entries(plugin.manifest.config.fields)
363
+ .flatMap(([key, field]) => field.default === undefined ? [] : [[key, field.default]]));
364
+ const issues = validatePluginConfigCandidate(plugin.manifest.config, { ...defaults, ...config });
365
+ if (issues.length > 0) {
366
+ throw new Error(`Eval profile "${profile.id}" has invalid config for plugin "${plugin.manifest.name}" in ${scope} scope: ${formatPluginConfigIssue(issues[0])}`);
367
+ }
368
+ }
369
+ }
370
+ }
371
+ return {
372
+ materializationProfile,
373
+ profile: {
374
+ kind: 'eval',
375
+ id: profile.id,
376
+ scope: profile.scope,
377
+ inputDigest: digestCanonical(materializationProfile),
378
+ ...(Object.keys(normalizedConfig).length === 0 ? {} : { config: normalizedConfig }),
379
+ },
380
+ };
381
+ }
382
+ export async function resolvePortablePluginProfileConfig(options) {
383
+ const config = await resolveArtifactRenderConfig({
384
+ sourceId: options.sourceId ?? options.plugin.sourceId,
385
+ sourceIdentity: options.catalogSourceIdentity ?? options.plugin.sourceIdentity,
386
+ logicalIdentity: options.logicalIdentity ?? options.plugin.catalogLogicalIdentity,
387
+ pluginName: options.plugin.manifest.name,
388
+ manifest: options.plugin.manifest,
389
+ scope: options.scope,
390
+ cwd: options.cwd,
391
+ env: options.env,
392
+ });
393
+ if (config.issues.length > 0) {
394
+ throw new Error(`Portable materialization config is invalid: ${config.issues.map((issue) => issue.message).join('; ')}`);
395
+ }
396
+ return {
397
+ config,
398
+ digest: digestCanonical({ values: config.values, sources: config.sources }),
399
+ };
400
+ }
401
+ export async function resolvePortableProfileBindingInput(options) {
402
+ const closure = resolvePluginMetaDependencyClosure(options.plugins, [options.pluginName]);
403
+ const configDigests = [];
404
+ for (const plugin of closure) {
405
+ if (!plugin.manifest.distributions?.agentSkills)
406
+ continue;
407
+ const resolved = await resolvePortablePluginProfileConfig({ ...options, plugin });
408
+ const id = options.sourceId ? `${options.sourceId}/${plugin.manifest.name}` : plugin.manifest.name;
409
+ configDigests.push([id, resolved.digest]);
410
+ }
411
+ return {
412
+ kind: 'portable',
413
+ id: `agent-skills-${options.scope}`,
414
+ scope: options.scope,
415
+ inputDigest: `sha256:${crypto.createHash('sha256')
416
+ .update(JSON.stringify(configDigests))
417
+ .digest('hex')}`,
418
+ };
419
+ }
420
+ function sameSubject(left, right) {
421
+ return left.plugin === right.plugin && left.skill === right.skill && left.suite === right.suite;
422
+ }
423
+ async function currentWorkspaceProfile(options) {
424
+ const plugin = options.workspace.plugins.find((entry) => entry.manifest.name === options.binding.subject.plugin);
425
+ if (!plugin)
426
+ throw new Error('The bound plugin is not present in the current Workspace.');
427
+ if (options.binding.profile.kind === 'eval') {
428
+ const loaded = await readAwSkillEvalManifest({ plugin, skill: options.binding.subject.skill });
429
+ const suite = loaded.manifest.suites.find((entry) => entry.id === options.binding.subject.suite);
430
+ const profile = loaded.manifest.profiles.find((entry) => entry.id === options.binding.profile.id);
431
+ if (!suite || !profile || suite.profiles && !suite.profiles.includes(profile.id)) {
432
+ throw new Error('The bound Eval suite or profile is not present in the current Workspace.');
433
+ }
434
+ return resolveEvalProfileBindingInput(profile, options.workspace.plugins, options.binding.profile.config).profile;
435
+ }
436
+ if (options.binding.profile.kind === 'review') {
437
+ const skills = options.binding.artifacts.flatMap((artifact) => artifact.kind === 'review-skill' ? [artifact.skill] : []);
438
+ const selection = await resolveReviewSelection({
439
+ cwd: options.workspace.workspaceRoot,
440
+ workspaceRoot: options.workspace.workspaceRoot,
441
+ target: options.binding.subject.plugin,
442
+ skills,
443
+ platform: options.binding.profile.platform,
444
+ scope: options.binding.profile.scope,
445
+ config: options.binding.profile.config,
446
+ env: options.env,
447
+ });
448
+ const profile = selection.profiles[0]?.profile;
449
+ if (!profile)
450
+ throw new Error('The bound Review profile is not present in the current Workspace.');
451
+ return profile;
452
+ }
453
+ const source = options.binding.source;
454
+ return resolvePortableProfileBindingInput({
455
+ plugins: options.workspace.plugins,
456
+ pluginName: options.binding.subject.plugin,
457
+ scope: options.binding.profile.scope,
458
+ cwd: options.cwd,
459
+ env: options.env,
460
+ ...(source.kind === 'catalog-snapshot'
461
+ ? {
462
+ sourceId: source.sourceId,
463
+ catalogSourceIdentity: source.catalogSourceIdentity,
464
+ logicalIdentity: source.logicalIdentity,
465
+ }
466
+ : {}),
467
+ });
468
+ }
469
+ export async function resolveCurrentWorkspaceAwSourceBinding(options) {
470
+ return {
471
+ source: options.context.source,
472
+ profile: await currentWorkspaceProfile({
473
+ workspace: options.context.workspace,
474
+ binding: options.binding,
475
+ cwd: options.cwd ?? options.context.workspace.workspaceRoot,
476
+ env: options.env,
477
+ }),
478
+ };
479
+ }
480
+ export async function createAwSourceBindingWorkspaceValidationContext(workspaceRoot) {
481
+ const workspace = await readCatalogWorkspace(workspaceRoot, { reservedImports: CLI_RESERVED_IMPORTS });
482
+ return { workspace, source: await resolveWorkspaceBindingSource(workspace) };
483
+ }
484
+ export async function readAwSourceBinding(bindingPath) {
485
+ const resolved = path.resolve(bindingPath);
486
+ const info = await fs.lstat(resolved);
487
+ if (!info.isFile() || info.isSymbolicLink() || path.basename(resolved) !== AW_SOURCE_BINDING_FILENAME) {
488
+ throw new Error('AW source binding receipt path is invalid.');
489
+ }
490
+ const binding = parseAwSourceBinding(await fs.readJson(resolved));
491
+ const unsigned = {
492
+ schemaVersion: binding.schemaVersion,
493
+ kind: binding.kind,
494
+ source: binding.source,
495
+ subject: binding.subject,
496
+ profile: binding.profile,
497
+ ...(binding.evalInput === undefined ? {} : { evalInput: binding.evalInput }),
498
+ artifacts: binding.artifacts,
499
+ };
500
+ if (binding.finalDigest !== bindingDigest(unsigned)) {
501
+ throw new Error('AW source binding receipt digest is invalid.');
502
+ }
503
+ return binding;
504
+ }
505
+ function bindingMatchesWorkspaceSource(binding, current) {
506
+ return binding.kind === 'workspace'
507
+ ? binding.workspaceIdentity === current.workspaceIdentity
508
+ && binding.sourceIdentity === current.sourceIdentity
509
+ : binding.workspaceIdentity === current.workspaceIdentity
510
+ && binding.workspaceSourceIdentity === current.sourceIdentity;
511
+ }
512
+ async function currentPortableArtifactOwners(options) {
513
+ const closure = resolvePluginMetaDependencyClosure(options.workspace.plugins, [options.binding.subject.plugin]);
514
+ const owners = new Map();
515
+ const record = (skill, plugin) => {
516
+ owners.set(skill, owners.has(skill) ? null : plugin);
517
+ };
518
+ for (const plugin of closure) {
519
+ const distribution = plugin.manifest.distributions?.agentSkills;
520
+ if (!distribution)
521
+ continue;
522
+ const dynamicKeys = new Set((plugin.manifest.artifacts?.targets ?? [])
523
+ .filter((target) => target.target === 'agent-skills.skill')
524
+ .map((target) => target.skillKey));
525
+ for (const target of plugin.manifest.artifacts?.targets ?? []) {
526
+ if (target.target === 'agent-skills.skill'
527
+ && target.scopes.includes(options.binding.profile.scope))
528
+ record(target.skillKey, plugin.manifest.name);
529
+ }
530
+ if (!distribution.skills)
531
+ continue;
532
+ const root = path.join(plugin.rootDir, distribution.skills.replace(/^\.\//u, ''));
533
+ const rootInfo = await fs.lstat(root).catch(() => null);
534
+ if (!rootInfo?.isDirectory() || rootInfo.isSymbolicLink())
535
+ continue;
536
+ for (const entry of await fs.readdir(root, { withFileTypes: true })) {
537
+ if (dynamicKeys.has(entry.name))
538
+ continue;
539
+ const info = await fs.lstat(path.join(root, entry.name)).catch(() => null);
540
+ if (entry.isDirectory() && info?.isDirectory() && !info.isSymbolicLink()) {
541
+ record(entry.name, plugin.manifest.name);
542
+ }
543
+ }
544
+ }
545
+ return owners;
546
+ }
547
+ async function currentEvalInput(options) {
548
+ const evalInput = options.binding.evalInput;
549
+ if (options.binding.profile.kind !== 'eval' || !evalInput) {
550
+ throw new Error('The source binding does not contain Eval input.');
551
+ }
552
+ const plugin = options.workspace.plugins.find((entry) => entry.manifest.name === options.binding.subject.plugin);
553
+ if (!plugin)
554
+ throw new Error('The bound plugin is not present in the current Workspace.');
555
+ const loaded = await readAwSkillEvalManifest({ plugin, skill: options.binding.subject.skill });
556
+ const suite = loaded.manifest.suites.find((entry) => entry.id === options.binding.subject.suite);
557
+ if (!suite)
558
+ throw new Error('The bound Eval suite is not present in the current Workspace.');
559
+ const preparedEvalRoot = path.join(options.preparedRoot, 'workspace', 'eval');
560
+ const provider = await resolveAwSourceBindingEvalProvider({
561
+ evalRoot: loaded.evalRoot,
562
+ preparedEvalRoot,
563
+ suite,
564
+ });
565
+ const resolved = await resolveEvalSourceBindingInput({
566
+ workspaceRoot: options.workspace.workspaceRoot,
567
+ evalRoot: loaded.evalRoot,
568
+ manifestPath: loaded.manifestPath,
569
+ suite,
570
+ defaults: loaded.manifest.defaults,
571
+ cases: loaded.casesBySuite.get(suite.id),
572
+ corpusPaths: loaded.manifest.suites.map((entry) => entry.cases),
573
+ selection: { caseIds: evalInput.selectedCaseIds },
574
+ providerDigest: computeEvalProviderDigest(provider),
575
+ preparedEvalRoot,
576
+ });
577
+ const casesArtifact = options.binding.artifacts.find((artifact) => artifact.kind === 'eval-cases');
578
+ if (!casesArtifact)
579
+ throw new Error('The source binding does not contain prepared Eval cases.');
580
+ const preparedCases = await fs.readJson(path.join(options.preparedRoot, ...casesArtifact.path.split('/')));
581
+ if (digestCanonical(preparedCases) !== resolved.input.selectedCasesDigest) {
582
+ throw new Error('Prepared Eval cases do not match the current selected source cases.');
583
+ }
584
+ return resolved.input;
585
+ }
586
+ export async function validateAwSourceBindingForWorkspace(options) {
587
+ const bindingPath = path.resolve(options.bindingPath);
588
+ const info = await fs.lstat(bindingPath).catch(() => null);
589
+ if (!info) {
590
+ return {
591
+ state: 'incomplete',
592
+ binding: null,
593
+ outputs: [],
594
+ issues: [{ code: 'sourceBindingMissing', message: 'AW source binding receipt is missing.' }],
595
+ };
596
+ }
597
+ if (!info.isFile() || info.isSymbolicLink() || path.basename(bindingPath) !== AW_SOURCE_BINDING_FILENAME) {
598
+ return {
599
+ state: 'invalid',
600
+ binding: null,
601
+ outputs: [],
602
+ issues: [{ code: 'sourceBindingInvalid', message: 'AW source binding receipt path is invalid.' }],
603
+ };
604
+ }
605
+ let binding;
606
+ try {
607
+ binding = await readAwSourceBinding(bindingPath);
608
+ }
609
+ catch (error) {
610
+ const message = error instanceof Error && error.message === unsupportedV1Message
611
+ ? unsupportedV1Message
612
+ : 'AW source binding receipt is invalid.';
613
+ return {
614
+ state: 'invalid',
615
+ binding: null,
616
+ outputs: [],
617
+ issues: [{ code: 'sourceBindingInvalid', message }],
618
+ };
619
+ }
620
+ const issues = [];
621
+ if (!sameSubject(binding.subject, options.expectedSubject)) {
622
+ issues.push({ code: 'sourceBindingSubjectDrift', message: 'The bound subject does not match the requested source subject.' });
623
+ }
624
+ if (!bindingMatchesWorkspaceSource(binding.source, options.context.source)) {
625
+ issues.push({ code: 'sourceBindingSourceDrift', message: 'The current Workspace source identity differs from the bound source.' });
626
+ }
627
+ try {
628
+ const current = await resolveCurrentWorkspaceAwSourceBinding({
629
+ context: options.context,
630
+ binding,
631
+ cwd: options.cwd,
632
+ env: options.env,
633
+ });
634
+ if (binding.profile.kind !== current.profile.kind
635
+ || binding.profile.id !== current.profile.id
636
+ || binding.profile.scope !== current.profile.scope
637
+ || binding.profile.inputDigest !== current.profile.inputDigest) {
638
+ issues.push({ code: 'sourceBindingProfileDrift', message: 'The current profile input differs from the bound profile.' });
639
+ }
640
+ }
641
+ catch {
642
+ issues.push({ code: 'sourceBindingProfileDrift', message: 'The current profile input cannot be validated.' });
643
+ }
644
+ const rootDir = path.dirname(bindingPath);
645
+ if (binding.profile.kind === 'eval') {
646
+ try {
647
+ const current = await currentEvalInput({
648
+ workspace: options.context.workspace,
649
+ binding,
650
+ preparedRoot: rootDir,
651
+ });
652
+ if (canonicalJson(current) !== canonicalJson(binding.evalInput)) {
653
+ issues.push({
654
+ code: 'sourceBindingEvalInputDrift',
655
+ message: 'The current Eval source input differs from the bound source input.',
656
+ });
657
+ }
658
+ }
659
+ catch {
660
+ issues.push({
661
+ code: 'sourceBindingEvalInputDrift',
662
+ message: 'The current Eval source input cannot be validated against the prepared input.',
663
+ });
664
+ }
665
+ }
666
+ let portableOwners = null;
667
+ if (binding.profile.kind === 'portable') {
668
+ try {
669
+ portableOwners = await currentPortableArtifactOwners({
670
+ workspace: options.context.workspace,
671
+ binding,
672
+ });
673
+ }
674
+ catch {
675
+ portableOwners = new Map();
676
+ }
677
+ }
678
+ for (const artifact of binding.artifacts) {
679
+ if (artifact.kind === 'portable-skill'
680
+ && portableOwners?.get(artifact.skill) !== artifact.plugin) {
681
+ issues.push({
682
+ code: 'sourceBindingArtifactDrift',
683
+ message: `The current source does not declare ${artifact.plugin}/${artifact.skill} in the bound dependency closure.`,
684
+ });
685
+ }
686
+ try {
687
+ const actual = await artifactDigest(rootDir, artifact);
688
+ if (actual !== artifact.digest) {
689
+ issues.push({ code: 'sourceBindingArtifactDrift', message: `The materialized artifact differs from its binding: ${artifact.path}` });
690
+ }
691
+ }
692
+ catch {
693
+ issues.push({ code: 'sourceBindingArtifactDrift', message: `The materialized artifact is missing or invalid: ${artifact.path}` });
694
+ }
695
+ }
696
+ return issues.length === 0
697
+ ? {
698
+ state: 'verified',
699
+ binding,
700
+ outputs: binding.artifacts.map((artifact) => ({
701
+ ...artifact,
702
+ path: path.resolve(rootDir, ...artifact.path.split('/')),
703
+ })),
704
+ issues: [],
705
+ }
706
+ : { state: 'drifted', binding, outputs: [], issues };
707
+ }
708
+ //# sourceMappingURL=source-binding.js.map