@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
@@ -2,225 +2,57 @@ import { spawn } from 'node:child_process';
2
2
  import { randomUUID } from 'node:crypto';
3
3
  import path from 'node:path';
4
4
  import fs from 'fs-extra';
5
- import { inferLifecycleScriptRunnerFromPath, PLUGIN_SCRIPT_TIMEOUT_DEFAULT_MS, PLUGIN_SCRIPT_TIMEOUT_MAX_MS, PLUGIN_SCRIPT_TIMEOUT_MIN_MS, resolveLifecycleScriptForOs, } from './plugin-script-contract.js';
6
- import { resolveAwHome, } from './paths.js';
7
- import { resolveEffectivePluginConfig } from './plugin-config.js';
8
5
  import { redactString } from '../output/redact.js';
6
+ import { createWindowsJobInvocation, observeProcessTree, terminateProcessTree, } from './process-tree.js';
7
+ import { resolveAwHome } from './paths.js';
8
+ import { resolveEffectivePluginConfig } from './plugin-config.js';
9
9
  import { assertTestWritablePath } from './test-path-fence.js';
10
- import { observeProcessTree, terminateProcessTree, } from './process-tree.js';
11
- export { calculateFileDigest, calculatePluginBundleFingerprint, } from './bundle-integrity.js';
12
- import { calculateFileDigest } from './bundle-integrity.js';
13
- function runtimeOs() {
14
- return process.platform === 'win32' ? 'win32' : process.platform === 'darwin' ? 'darwin' : 'linux';
15
- }
16
- function isInsidePath(childPath, rootPath) {
17
- const relative = path.relative(rootPath, childPath);
18
- return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
19
- }
20
- function lifecycleCodexHome(env) {
21
- return env.AW_CODEX_HOME || path.join(resolveAwHome(env), 'isolated-codex-home');
22
- }
23
- function lifecycleClaudeHome(env) {
24
- return env.AW_CLAUDE_HOME || path.join(resolveAwHome(env), 'isolated-claude-home');
25
- }
26
- function assertLifecycleStagingPathForTests(targetPath, source) {
27
- return assertTestWritablePath(targetPath, source, '用 createIsolatedTestEnv() 生成默认 AW_HOME/TMPDIR,或通过 registerWritableStateRoot() 登记 plugin lifecycle staging 路径。');
28
- }
29
- export async function resolveBundledPluginFilePath(options) {
30
- const resolvedBundleRoot = await fs.realpath(options.bundleRoot);
31
- const resolvedPath = await fs.realpath(path.join(options.bundleRoot, stripDotSlash(options.pluginRelativePath)));
32
- if (!isInsidePath(resolvedPath, resolvedBundleRoot)) {
33
- throw new Error(`${options.fieldName} "${options.pluginRelativePath}" resolves outside the plugin bundle root.`);
34
- }
35
- return resolvedPath;
36
- }
37
- async function createTargetFromPlugin(options) {
38
- const selector = options.plugin.manifest.scripts?.lifecycle?.[options.event];
39
- if (!selector) {
40
- return {
41
- noOp: true,
42
- source: options.source,
43
- bundleRoot: options.plugin.rootDir,
44
- sourceManifest: options.plugin.manifest,
45
- manifestPath: options.plugin.manifestPath,
46
- manifestDigest: await calculateFileDigest(options.plugin.manifestPath),
47
- warnings: options.warnings ?? [],
48
- };
49
- }
50
- const entry = resolveLifecycleScriptForOs(selector, options.runtimeOs);
51
- if (!entry) {
52
- throw new Error(`Plugin "${options.plugin.manifest.name}" declares "${options.event}" lifecycle scripts, but none support ${options.runtimeOs}.`);
53
- }
54
- const bundleRoot = await fs.realpath(options.plugin.rootDir);
55
- const entryPath = await resolveBundledPluginFilePath({
56
- bundleRoot,
57
- pluginRelativePath: entry.path,
58
- fieldName: 'Lifecycle script',
59
- });
60
- return {
61
- noOp: false,
62
- source: options.source,
63
- entry,
64
- entryPath,
65
- bundleRoot,
66
- sourceManifest: options.plugin.manifest,
67
- manifestPath: options.plugin.manifestPath,
68
- manifestDigest: await calculateFileDigest(options.plugin.manifestPath),
69
- warnings: options.warnings ?? [],
70
- };
71
- }
72
- async function resolveCurrentPlugin(_pluginName, currentPlugin, _env) {
73
- return currentPlugin;
74
- }
75
- function createMissingLifecycleWarning(pluginName, event) {
76
- return `No executable ${event} lifecycle script was found for ${pluginName}; continuing cleanup without running a lifecycle script.`;
77
- }
78
- export async function resolveLifecycleScriptTarget(options) {
79
- const runtime = options.runtimeOs ?? runtimeOs();
80
- const warnings = [];
81
- const currentPlugin = await resolveCurrentPlugin(options.pluginName, options.currentPlugin, options.env ?? process.env);
82
- if (currentPlugin) {
83
- return createTargetFromPlugin({
84
- event: options.event,
85
- plugin: currentPlugin,
86
- source: 'currentCatalog',
87
- runtimeOs: runtime,
88
- warnings,
89
- });
90
- }
91
- if (options.event === 'uninstall') {
92
- warnings.push(createMissingLifecycleWarning(options.pluginName, options.event));
93
- }
94
- return { noOp: true, source: 'none', warnings };
95
- }
96
- function stripDotSlash(value) {
97
- return value.startsWith('./') ? value.slice(2) : value;
98
- }
99
- function resolveAutoRunner(entry) {
100
- if (entry.runner !== 'auto') {
101
- return entry.runner;
10
+ import { attachSafeOperationError } from './safe-operation-diagnostic.js';
11
+ import { collectSensitiveTokenRepresentations, containsBlockedSensitiveToken, } from './sensitive-content.js';
12
+ export { calculateFileDigest } from './bundle-integrity.js';
13
+ export const PLUGIN_SCRIPT_TIMEOUT_DEFAULT_MS = 300_000;
14
+ export const PLUGIN_SCRIPT_TIMEOUT_MIN_MS = 1_000;
15
+ export const PLUGIN_SCRIPT_TIMEOUT_MAX_MS = 1_800_000;
16
+ const OUTPUT_LIMIT = 64 * 1024;
17
+ const WINDOWS_JOB_CLOSE_TIMEOUT_MS = 4_500;
18
+ class PluginProcessInputError extends Error {
19
+ constructor(cause) {
20
+ super('Plugin process input could not be sent.', { cause });
21
+ this.name = 'PluginProcessInputError';
102
22
  }
103
- const runner = inferLifecycleScriptRunnerFromPath(entry.path);
104
- if (!runner) {
105
- throw new Error(`Unable to infer lifecycle script runner from "${entry.path}".`);
106
- }
107
- return runner;
108
23
  }
109
- export function quoteCmdArgument(value) {
110
- if (value === '') {
111
- return '""';
112
- }
113
- if (!/[ \t"&|<>^()]/.test(value)) {
114
- return value;
115
- }
116
- let escaped = '"';
117
- let backslashes = 0;
118
- for (const character of value) {
119
- if (character === '\\') {
120
- backslashes += 1;
121
- continue;
122
- }
123
- if (character === '"') {
124
- escaped += '\\'.repeat(backslashes * 2 + 1);
125
- escaped += '"';
126
- backslashes = 0;
127
- continue;
128
- }
129
- escaped += '\\'.repeat(backslashes);
130
- backslashes = 0;
131
- escaped += character === '%' ? '%%' : character;
132
- }
133
- escaped += '\\'.repeat(backslashes * 2);
134
- escaped += '"';
135
- return escaped;
136
- }
137
- export function buildLifecycleScriptInvocation(options) {
138
- const runner = resolveAutoRunner(options.entry);
139
- const scriptArgs = options.entry.args ?? [];
140
- if (!scriptArgs.every((arg) => typeof arg === 'string')) {
141
- throw new Error('Lifecycle script args must be strings.');
142
- }
143
- if (runner === 'node') {
144
- return {
145
- command: process.execPath,
146
- args: [options.entryPath, ...scriptArgs],
147
- cwd: options.cwd,
148
- env: options.env,
149
- };
150
- }
151
- if (runner === 'sh' || runner === 'bash') {
152
- return {
153
- command: runner,
154
- args: [options.entryPath, ...scriptArgs],
155
- cwd: options.cwd,
156
- env: options.env,
157
- };
158
- }
159
- if (runner === 'pwsh' || runner === 'powershell') {
160
- return {
161
- command: runner,
162
- args: ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', options.entryPath, ...scriptArgs],
163
- cwd: options.cwd,
164
- env: options.env,
165
- };
166
- }
167
- return {
168
- command: 'cmd',
169
- args: ['/d', '/s', '/c', [options.entryPath, ...scriptArgs].map(quoteCmdArgument).join(' ')],
170
- cwd: options.cwd,
171
- env: options.env,
172
- };
173
- }
174
- function validateTimeoutMs(value, source) {
175
- if (!Number.isInteger(value) ||
176
- value < PLUGIN_SCRIPT_TIMEOUT_MIN_MS ||
177
- value > PLUGIN_SCRIPT_TIMEOUT_MAX_MS) {
178
- throw new Error(`${source} lifecycle script timeout must be an integer between ${PLUGIN_SCRIPT_TIMEOUT_MIN_MS} and ${PLUGIN_SCRIPT_TIMEOUT_MAX_MS} ms.`);
179
- }
180
- return value;
24
+ export async function resolveBundledPluginFilePath(options) {
25
+ const bundleRoot = await fs.realpath(options.bundleRoot);
26
+ const relativePath = options.pluginRelativePath.startsWith('./') ? options.pluginRelativePath.slice(2) : options.pluginRelativePath;
27
+ const entryPath = await fs.realpath(path.join(bundleRoot, relativePath));
28
+ const relative = path.relative(bundleRoot, entryPath);
29
+ if (relative.startsWith('..') || path.isAbsolute(relative))
30
+ throw new Error(`${options.fieldName} resolves outside the plugin bundle root.`);
31
+ return entryPath;
181
32
  }
182
- export function resolveLifecycleScriptTimeoutMs(options) {
183
- if (options.cliTimeoutMs !== undefined) {
184
- return validateTimeoutMs(options.cliTimeoutMs, 'CLI');
185
- }
186
- const manifestTimeout = options.manifest?.scripts?.timeoutMs;
187
- if (manifestTimeout !== undefined) {
188
- return validateTimeoutMs(manifestTimeout, 'Manifest');
189
- }
190
- return PLUGIN_SCRIPT_TIMEOUT_DEFAULT_MS;
33
+ export function buildNodeScriptInvocation(options) {
34
+ return { command: process.execPath, args: [options.entryPath, ...(options.args ?? [])], cwd: options.cwd, env: options.env, ...(options.stdin === undefined ? {} : { stdin: options.stdin }) };
191
35
  }
192
36
  export function buildPluginScriptSpawnEnv(options) {
193
- if ((options.platform === undefined) === (options.distribution === undefined)) {
194
- throw new Error('Plugin script spawn requires exactly one platform or distribution surface.');
195
- }
196
37
  const input = options.commandEnv;
197
- const runtime = options.runtimeOs ?? runtimeOs();
198
38
  const output = {
199
- AW_HOME: resolveAwHome(input),
200
- AW_CODEX_HOME: lifecycleCodexHome(input),
201
- AW_CLAUDE_HOME: lifecycleClaudeHome(input),
202
- PATH: input.PATH ?? input.Path ?? '',
203
- AW_PLUGIN_CONTEXT: options.contextPath,
204
- AW_PLUGIN_ROOT: options.bundleRoot,
205
- AW_PLUGIN_NAME: options.plugin.name,
206
- AW_PLUGIN_VERSION: options.plugin.version,
207
- AW_PLUGIN_EVENT: options.event,
208
- AW_PLUGIN_SCOPE: options.scope,
39
+ AW_HOME: resolveAwHome(input), AW_CODEX_HOME: input.AW_CODEX_HOME || path.join(resolveAwHome(input), 'isolated-codex-home'),
40
+ AW_CLAUDE_HOME: input.AW_CLAUDE_HOME || path.join(resolveAwHome(input), 'isolated-claude-home'), PATH: input.PATH ?? input.Path ?? '',
41
+ AW_PLUGIN_CONTEXT: options.contextPath, AW_PLUGIN_ROOT: options.bundleRoot, AW_PLUGIN_NAME: options.plugin.name,
42
+ AW_PLUGIN_VERSION: options.plugin.version, AW_PLUGIN_EVENT: options.event, AW_PLUGIN_SCOPE: options.scope,
209
43
  };
210
44
  if (options.platform)
211
45
  output.AW_PLUGIN_PLATFORM = options.platform;
212
46
  if (options.distribution)
213
47
  output.AW_PLUGIN_DISTRIBUTION = options.distribution;
214
- if (runtime === 'win32') {
48
+ if (process.platform === 'win32') {
215
49
  output.USERPROFILE = path.join(options.tempDir, 'home');
216
50
  output.TEMP = path.join(options.tempDir, 'tmp');
217
51
  output.TMP = output.TEMP;
218
- if (input.SystemRoot) {
52
+ if (input.SystemRoot)
219
53
  output.SystemRoot = input.SystemRoot;
220
- }
221
- if (input.ComSpec) {
54
+ if (input.ComSpec)
222
55
  output.ComSpec = input.ComSpec;
223
- }
224
56
  }
225
57
  else {
226
58
  output.HOME = path.join(options.tempDir, 'home');
@@ -228,358 +60,486 @@ export function buildPluginScriptSpawnEnv(options) {
228
60
  }
229
61
  return output;
230
62
  }
231
- export function buildLifecycleSpawnEnv(options) {
232
- return buildPluginScriptSpawnEnv(options);
63
+ export function resolvePluginScriptTimeoutMs(options) {
64
+ const value = options.cliTimeoutMs ?? options.manifestTimeoutMs ?? PLUGIN_SCRIPT_TIMEOUT_DEFAULT_MS;
65
+ if (!Number.isInteger(value) || value < PLUGIN_SCRIPT_TIMEOUT_MIN_MS || value > PLUGIN_SCRIPT_TIMEOUT_MAX_MS)
66
+ throw new Error('Plugin script timeout is outside the supported range.');
67
+ return value;
68
+ }
69
+ function collectScalarLeafTokens(value) {
70
+ if (typeof value === 'string')
71
+ return value === '' ? [] : [value];
72
+ if (typeof value === 'number' || typeof value === 'boolean')
73
+ return [String(value)];
74
+ if (value === null || typeof value !== 'object')
75
+ return [];
76
+ return Object.values(value).flatMap(collectScalarLeafTokens);
233
77
  }
234
78
  export function collectSensitivePluginConfigValues(manifest, values) {
235
- const schema = manifest.config?.schema ?? {};
236
- return Object.entries(schema)
237
- .filter(([, field]) => field.sensitive)
238
- .map(([key]) => values[key])
239
- .filter((value) => value !== undefined)
240
- .map((value) => String(value))
241
- .filter((value) => value.length > 0);
79
+ return Object.entries(manifest.config?.fields ?? {}).flatMap(([key, field]) => {
80
+ const value = values[key];
81
+ if (value === undefined)
82
+ return [];
83
+ if (field.sensitive)
84
+ return collectScalarLeafTokens(value);
85
+ if (field.type !== 'object' || typeof value !== 'object')
86
+ return [];
87
+ return Object.entries(value).flatMap(([property, childValue]) => {
88
+ const child = field.properties?.[property]
89
+ ?? (field.additionalProperties === false ? undefined : field.additionalProperties);
90
+ return child?.sensitive ? collectScalarLeafTokens(childValue) : [];
91
+ });
92
+ });
242
93
  }
243
- export function redactPluginScriptOutput(value, sensitiveValues) {
244
- let output = redactString(value);
245
- for (const sensitiveValue of sensitiveValues) {
246
- output = output.split(sensitiveValue).join('[REDACTED]');
94
+ export function assertNoSensitiveConfigValues(value, sensitiveValues, message) {
95
+ const strings = [];
96
+ const visit = (entry) => {
97
+ if (typeof entry === 'string') {
98
+ strings.push(entry);
99
+ return;
100
+ }
101
+ if (Array.isArray(entry)) {
102
+ entry.forEach(visit);
103
+ return;
104
+ }
105
+ if (entry !== null && typeof entry === 'object') {
106
+ Object.entries(entry).forEach(([key, child]) => {
107
+ strings.push(key);
108
+ visit(child);
109
+ });
110
+ }
111
+ };
112
+ visit(value);
113
+ if (strings.some((entry) => containsBlockedSensitiveToken(entry, sensitiveValues))) {
114
+ throw new Error(message);
247
115
  }
248
- return output;
249
116
  }
250
- export function summarizePluginScriptOutput(value, sensitiveValues) {
251
- const normalized = value.trim().slice(0, 4000);
252
- return redactPluginScriptOutput(normalized, sensitiveValues);
117
+ export function assertNoSensitiveConfigInFiles(files, sensitiveValues, message) {
118
+ assertNoSensitiveConfigValues(Object.entries(files).map(([relativePath, content]) => ({
119
+ relativePath,
120
+ content: content.toString('utf8'),
121
+ })), sensitiveValues, message);
253
122
  }
254
- export async function writeLifecycleScriptContext(options) {
255
- if ((options.sourceId === undefined) !== (options.sourceIdentity === undefined)) {
256
- throw new Error('Lifecycle script context requires a complete source identity.');
257
- }
258
- if (options.target.noOp || !options.target.entry || !options.target.entryPath || !options.target.bundleRoot || !options.target.sourceManifest || !options.target.manifestPath || !options.target.manifestDigest) {
259
- throw new Error('Cannot write lifecycle script context for a no-op target.');
123
+ function findSensitiveTokenMatches(value, sensitiveValue, startLimit) {
124
+ if (sensitiveValue === '')
125
+ return [];
126
+ const matches = [];
127
+ for (let start = value.indexOf(sensitiveValue); start >= 0 && start < startLimit; start = value.indexOf(sensitiveValue, start + 1)) {
128
+ matches.push({ start, end: start + sensitiveValue.length });
260
129
  }
261
- let config = {
262
- schema: options.target.sourceManifest.config?.schema,
263
- values: {},
264
- sources: {},
265
- issues: [],
266
- };
267
- let configStores;
268
- if (options.target.sourceManifest.config?.schema) {
269
- const effective = await resolveEffectivePluginConfig({
270
- sourceId: options.sourceId,
271
- sourceIdentity: options.sourceIdentity,
272
- pluginName: options.target.sourceManifest.name,
273
- manifest: options.target.sourceManifest,
274
- cwd: options.cwd,
275
- env: options.commandEnv,
276
- });
277
- if (effective.issues.length > 0) {
278
- throw new Error(`Invalid AW config for ${options.target.sourceManifest.name}: ${effective.issues.map((issue) => `${issue.key} (${issue.type})`).join(', ')}.`);
130
+ return matches;
131
+ }
132
+ function collectMergedSensitiveTokenMatches(value, sensitiveValues, startLimit) {
133
+ const matches = collectSensitiveTokenRepresentations(sensitiveValues)
134
+ .flatMap((representation) => findSensitiveTokenMatches(value, representation, startLimit))
135
+ .sort((left, right) => left.start - right.start || right.end - left.end);
136
+ const merged = [];
137
+ for (const match of matches) {
138
+ const previous = merged.at(-1);
139
+ if (previous && match.start < previous.end) {
140
+ previous.end = Math.max(previous.end, match.end);
141
+ }
142
+ else {
143
+ merged.push({ ...match });
279
144
  }
280
- configStores = {
281
- user: effective.stores.user.path,
282
- project: effective.stores.project.path,
283
- projectLocal: effective.stores.projectLocal.path,
284
- };
285
- config = {
286
- schema: options.target.sourceManifest.config.schema,
287
- values: effective.values,
288
- sources: effective.sources,
289
- issues: effective.issues,
290
- };
291
145
  }
292
- const context = {
293
- event: options.event,
294
- plugin: {
295
- name: options.target.sourceManifest.name,
296
- version: options.target.sourceManifest.version,
297
- rootDir: options.target.bundleRoot,
298
- ...(options.sourceId ? {
299
- sourceId: options.sourceId,
300
- sourceIdentity: options.sourceIdentity,
301
- pluginId: `${options.sourceId}/${options.target.sourceManifest.name}`,
302
- } : {}),
303
- },
304
- platform: options.platform,
305
- scope: options.scope,
306
- cwd: options.cwd,
307
- paths: {
308
- awHome: resolveAwHome(options.commandEnv),
309
- codexHome: lifecycleCodexHome(options.commandEnv),
310
- claudeHome: lifecycleClaudeHome(options.commandEnv),
311
- manifestPath: options.target.manifestPath,
312
- ...(configStores ? { configStores } : {}),
313
- },
314
- config,
315
- script: {
316
- runner: options.target.entry.runner,
317
- path: options.target.entryPath,
318
- args: options.target.entry.args ?? [],
319
- source: options.target.source,
320
- manifestDigest: options.target.manifestDigest,
321
- },
322
- artifacts: options.artifacts ?? [],
323
- };
324
- const tempRoot = assertLifecycleStagingPathForTests(path.join(resolveAwHome(options.commandEnv), 'tmp'), 'plugin lifecycle temp root');
325
- await fs.ensureDir(tempRoot);
326
- const tempDir = await fs.mkdtemp(assertLifecycleStagingPathForTests(path.join(tempRoot, 'plugin-script-'), 'plugin lifecycle context temp dir'));
327
- const contextPath = assertLifecycleStagingPathForTests(path.join(tempDir, 'context.json'), 'plugin lifecycle context file');
328
- await fs.writeJson(contextPath, context, { spaces: 2 });
329
- try {
330
- await fs.chmod(contextPath, 0o600);
146
+ return merged;
147
+ }
148
+ function redactSensitiveTokenWindow(value, sensitiveValues, windowEnd) {
149
+ const matches = collectMergedSensitiveTokenMatches(value, sensitiveValues, windowEnd);
150
+ let output = '';
151
+ let offset = 0;
152
+ for (const match of matches) {
153
+ output += `${value.slice(offset, match.start)}[REDACTED]`;
154
+ offset = Math.min(match.end, windowEnd);
155
+ }
156
+ return output + value.slice(offset, windowEnd);
157
+ }
158
+ export function redactPluginScriptOutput(value, sensitiveValues) {
159
+ return redactString(redactSensitiveTokenWindow(value, sensitiveValues, value.length));
160
+ }
161
+ export function truncatePluginScriptOutput(value) {
162
+ return value.slice(0, OUTPUT_LIMIT);
163
+ }
164
+ export function summarizePluginScriptOutput(value, sensitiveValues) {
165
+ return redactString(redactSensitiveTokenWindow(value, sensitiveValues, Math.min(value.length, OUTPUT_LIMIT))).trim();
166
+ }
167
+ function summarizePreApplyFailureOutput(value, roots, sensitiveValues) {
168
+ const summary = redactString(sanitizePreApplyErrorMessage(value, roots, sensitiveValues, Math.min(value.length, OUTPUT_LIMIT))).trim();
169
+ const lines = summary.split('\n').map((line) => line.trim()).filter(Boolean);
170
+ const includesRuntimeStack = lines.some((line) => line.startsWith('file://')
171
+ || line.startsWith('at ')
172
+ || /^Node\.js v/u.test(line));
173
+ if (!includesRuntimeStack)
174
+ return summary;
175
+ return lines.find((line) => /^(?:[A-Za-z]*Error|Error):/u.test(line)) ?? '';
176
+ }
177
+ function resolveOutputCaptureLimit(sensitiveValues) {
178
+ const maxSensitiveTokenLength = collectSensitiveTokenRepresentations(sensitiveValues).reduce((maximum, value) => Math.max(maximum, value.length), 0);
179
+ return OUTPUT_LIMIT + maxSensitiveTokenLength;
180
+ }
181
+ function privateRootVariants(root) {
182
+ const normalized = path.resolve(root);
183
+ return [...new Set([
184
+ normalized,
185
+ normalized.replaceAll('\\', '/'),
186
+ ...(normalized.startsWith('/var/') ? [`/private${normalized}`] : []),
187
+ ...(normalized.startsWith('/private/var/') ? [normalized.slice('/private'.length)] : []),
188
+ ])];
189
+ }
190
+ function sanitizePreApplyErrorMessage(value, roots, sensitiveValues, windowEnd = value.length) {
191
+ const matches = [
192
+ ...roots
193
+ .filter(({ root }) => root.trim() !== '')
194
+ .flatMap(({ root, replacement }) => privateRootVariants(root)
195
+ .flatMap((variant) => findSensitiveTokenMatches(value, variant, windowEnd)
196
+ .map((match) => ({ ...match, replacement })))),
197
+ ...collectSensitiveTokenRepresentations(sensitiveValues)
198
+ .flatMap((representation) => findSensitiveTokenMatches(value, representation, windowEnd)
199
+ .map((match) => ({ ...match, replacement: '[REDACTED]' }))),
200
+ ].sort((left, right) => left.start - right.start || right.end - left.end);
201
+ const merged = [];
202
+ for (const match of matches) {
203
+ const previous = merged.at(-1);
204
+ if (previous && match.start < previous.end) {
205
+ previous.end = Math.max(previous.end, match.end);
206
+ }
207
+ else {
208
+ merged.push({ ...match, replacement: match.replacement ?? '[REDACTED]' });
209
+ }
331
210
  }
332
- catch {
333
- // Best effort on non-POSIX filesystems.
211
+ let output = '';
212
+ let offset = 0;
213
+ for (const match of merged) {
214
+ output += `${value.slice(offset, match.start)}${match.replacement}`;
215
+ offset = Math.min(match.end, windowEnd);
334
216
  }
335
- return {
336
- context,
337
- contextPath,
338
- tempDir,
339
- sensitiveValues: collectSensitivePluginConfigValues(options.target.sourceManifest, config.values),
340
- cleanup: async () => {
341
- await fs.remove(tempDir);
342
- },
343
- };
217
+ return output + value.slice(offset, windowEnd);
344
218
  }
345
- export const defaultPluginProcessRunner = {
346
- run(invocation, options) {
347
- return new Promise((resolve, reject) => {
348
- options.signal?.throwIfAborted();
349
- const processMarker = randomUUID();
350
- const child = spawn(invocation.command, invocation.args, {
351
- cwd: invocation.cwd,
352
- env: {
353
- ...invocation.env,
354
- AW_NATIVE_CLI_PROCESS_MARKER: processMarker,
355
- },
356
- shell: false,
357
- stdio: ['ignore', 'pipe', 'pipe'],
358
- });
359
- let stdout = '';
360
- let stderr = '';
361
- let timedOut = false;
362
- let aborted = false;
363
- let settled = false;
364
- let terminating = false;
365
- let processTreeObservation;
366
- if (child.pid !== undefined) {
367
- processTreeObservation = observeProcessTree(child.pid, processMarker);
368
- }
369
- const timer = setTimeout(() => {
370
- timedOut = true;
371
- terminate();
372
- }, options.timeoutMs);
373
- const abort = () => {
374
- aborted = true;
375
- terminate();
376
- };
377
- const cleanup = () => {
378
- clearTimeout(timer);
379
- options.signal?.removeEventListener('abort', abort);
380
- processTreeObservation?.dispose();
381
- };
382
- const settleAfterTermination = () => {
383
- if (settled)
384
- return;
385
- settled = true;
386
- cleanup();
387
- child.stdout?.destroy();
388
- child.stderr?.destroy();
389
- if (aborted) {
390
- try {
391
- options.signal?.throwIfAborted();
219
+ export function createDefaultPluginProcessRunner(dependencies = {}) {
220
+ const platform = dependencies.platform ?? process.platform;
221
+ const spawnImpl = dependencies.spawn ?? spawn;
222
+ const observeProcessTreeImpl = dependencies.observeProcessTree ?? observeProcessTree;
223
+ const terminateProcessTreeImpl = dependencies.terminateProcessTree ?? terminateProcessTree;
224
+ const createWindowsJobInvocationImpl = dependencies.createWindowsJobInvocation ??
225
+ (dependencies.spawn ? undefined : createWindowsJobInvocation);
226
+ return {
227
+ run(invocation, options) {
228
+ return new Promise((resolve, reject) => {
229
+ options.signal?.throwIfAborted();
230
+ const marker = randomUUID();
231
+ const windowsJobInvocation = platform === 'win32' && createWindowsJobInvocationImpl
232
+ ? createWindowsJobInvocationImpl(invocation.command, invocation.args)
233
+ : undefined;
234
+ // Keep long Catalog snapshot directories accessible to libuv's Windows cwd resolution.
235
+ const cwd = platform === 'win32' ? path.win32.toNamespacedPath(invocation.cwd) : invocation.cwd;
236
+ const child = spawnImpl(windowsJobInvocation?.command ?? invocation.command, windowsJobInvocation?.args ?? invocation.args, { cwd, env: { ...invocation.env, AW_NATIVE_CLI_PROCESS_MARKER: marker }, shell: false, stdio: ['pipe', 'pipe', 'pipe'], detached: platform !== 'win32' });
237
+ let stdout = '';
238
+ let stderr = '';
239
+ let timedOut = false;
240
+ let aborted = false;
241
+ let settled = false;
242
+ let terminating = false;
243
+ let stdoutBytes = 0;
244
+ let stdoutTruncated = false;
245
+ let inputCompleted = child.stdin === null;
246
+ let inputError;
247
+ let childExited = false;
248
+ let cleanupCompleted = false;
249
+ let completedExitCode = null;
250
+ let completedSignal = null;
251
+ let windowsJobCloseTimer;
252
+ const outputCaptureLimit = resolveOutputCaptureLimit(options.sensitiveValues ?? []);
253
+ let observation;
254
+ if (!windowsJobInvocation && child.pid !== undefined)
255
+ observation = observeProcessTreeImpl(child.pid, marker);
256
+ const timer = setTimeout(() => { timedOut = true; terminate(); }, options.timeoutMs);
257
+ const abort = () => { aborted = true; terminate(); };
258
+ const cleanup = () => { clearTimeout(timer); if (windowsJobCloseTimer)
259
+ clearTimeout(windowsJobCloseTimer); options.signal?.removeEventListener('abort', abort); observation?.dispose(); };
260
+ const result = () => ({ exitCode: completedExitCode, signal: completedSignal, stdout, stderr, timedOut, ...(stdoutTruncated ? { stdoutTruncated: true } : {}) });
261
+ const settleImmediately = (error) => {
262
+ if (settled)
263
+ return;
264
+ settled = true;
265
+ cleanup();
266
+ reject(error);
267
+ };
268
+ const settleIfComplete = () => {
269
+ if (settled || !childExited || !cleanupCompleted || !inputCompleted)
270
+ return;
271
+ settled = true;
272
+ cleanup();
273
+ if (aborted) {
274
+ try {
275
+ options.signal?.throwIfAborted();
276
+ }
277
+ catch (error) {
278
+ reject(error);
279
+ return;
280
+ }
392
281
  }
393
- catch (error) {
394
- reject(error);
282
+ if (inputError && !(inputError.code === 'EPIPE'
283
+ && completedExitCode === 0
284
+ && completedSignal === null) && !timedOut && completedExitCode === 0 && completedSignal === null) {
285
+ reject(new PluginProcessInputError(inputError));
286
+ return;
287
+ }
288
+ resolve(result());
289
+ };
290
+ function terminate(requireConfirmedCleanup = false, allowUnobservedWindowsProcessOnNormalCompletion = false) {
291
+ if (settled || terminating)
292
+ return;
293
+ terminating = true;
294
+ clearTimeout(timer);
295
+ const direct = (signal) => { if (child.exitCode === null && child.signalCode === null)
296
+ child.kill(signal); };
297
+ if (windowsJobInvocation) {
298
+ try {
299
+ if (child.exitCode === null && child.signalCode === null && child.kill('SIGKILL') === false) {
300
+ throw new Error('Windows Job helper did not accept termination.');
301
+ }
302
+ }
303
+ catch (error) {
304
+ settleImmediately(error);
305
+ return;
306
+ }
307
+ windowsJobCloseTimer = setTimeout(() => settleImmediately(new Error('Windows Job helper exit could not be confirmed.')), WINDOWS_JOB_CLOSE_TIMEOUT_MS);
308
+ windowsJobCloseTimer.unref();
395
309
  return;
396
310
  }
311
+ const termination = child.pid === undefined
312
+ ? Promise.resolve(direct('SIGKILL'))
313
+ : terminateProcessTreeImpl(child.pid, direct, {}, {
314
+ observation,
315
+ requireConfirmedCleanup,
316
+ ...(allowUnobservedWindowsProcessOnNormalCompletion
317
+ ? { allowUnobservedWindowsProcessOnNormalCompletion: true }
318
+ : {}),
319
+ });
320
+ void Promise.resolve(termination).then(() => { cleanupCompleted = true; settleIfComplete(); }, (error) => settleImmediately(error));
397
321
  }
398
- resolve({
399
- exitCode: child.exitCode,
400
- signal: child.signalCode,
401
- stdout,
402
- stderr,
403
- timedOut,
322
+ child.stdout?.setEncoding('utf8');
323
+ child.stderr?.setEncoding('utf8');
324
+ child.stdout?.on('data', (chunk) => {
325
+ if (options.maxStdoutBytes === undefined) {
326
+ if (stdout.length < outputCaptureLimit)
327
+ stdout += chunk.slice(0, outputCaptureLimit - stdout.length);
328
+ return;
329
+ }
330
+ const bytes = Buffer.from(chunk, 'utf8');
331
+ const remaining = Math.max(0, options.maxStdoutBytes - stdoutBytes);
332
+ stdout += bytes.subarray(0, remaining).toString('utf8');
333
+ stdoutBytes += bytes.length;
334
+ if (stdoutBytes > options.maxStdoutBytes) {
335
+ stdoutTruncated = true;
336
+ terminate(true);
337
+ }
404
338
  });
405
- };
406
- function terminate() {
407
- if (settled || terminating)
408
- return;
409
- terminating = true;
410
- clearTimeout(timer);
411
- const killDirectChild = (signal) => {
412
- if (child.exitCode === null && child.signalCode === null)
413
- child.kill(signal);
339
+ child.stderr?.on('data', (chunk) => { if (stderr.length < outputCaptureLimit)
340
+ stderr += chunk.slice(0, outputCaptureLimit - stderr.length); });
341
+ child.on('error', (error) => { if (!settled && (!terminating || windowsJobInvocation))
342
+ settleImmediately(error); });
343
+ const complete = (exitCode, signal) => {
344
+ if (settled)
345
+ return;
346
+ childExited = true;
347
+ completedExitCode = exitCode;
348
+ completedSignal = signal;
349
+ if (windowsJobInvocation) {
350
+ cleanupCompleted = true;
351
+ settleIfComplete();
352
+ return;
353
+ }
354
+ if (terminating) {
355
+ settleIfComplete();
356
+ return;
357
+ }
358
+ terminate(true, platform === 'win32' && exitCode === 0 && signal === null);
414
359
  };
415
- const termination = child.pid === undefined
416
- ? Promise.resolve(killDirectChild('SIGKILL'))
417
- : terminateProcessTree(child.pid, killDirectChild, {}, { observation: processTreeObservation });
418
- void Promise.resolve(termination).then(settleAfterTermination, settleAfterTermination);
419
- }
420
- child.stdout?.setEncoding('utf8');
421
- child.stderr?.setEncoding('utf8');
422
- child.stdout?.on('data', (chunk) => {
423
- stdout += chunk;
424
- });
425
- child.stderr?.on('data', (chunk) => {
426
- stderr += chunk;
427
- });
428
- child.on('error', (error) => {
429
- if (settled || terminating)
430
- return;
431
- settled = true;
432
- cleanup();
433
- reject(error);
434
- });
435
- child.on('close', (exitCode, signal) => {
436
- if (settled || terminating)
437
- return;
438
- settled = true;
439
- cleanup();
440
- resolve({ exitCode, signal, stdout, stderr, timedOut });
360
+ child.on(platform === 'win32' ? 'close' : 'exit', complete);
361
+ if (child.stdin) {
362
+ const completeInput = (error) => {
363
+ if (error !== undefined && error !== null)
364
+ inputError = error;
365
+ inputCompleted = true;
366
+ settleIfComplete();
367
+ };
368
+ child.stdin.once('error', completeInput);
369
+ child.stdin.once('finish', completeInput);
370
+ try {
371
+ child.stdin.end(invocation.stdin ?? '', completeInput);
372
+ }
373
+ catch (error) {
374
+ completeInput(error);
375
+ }
376
+ }
377
+ options.signal?.addEventListener('abort', abort, { once: true });
378
+ if (options.signal?.aborted)
379
+ abort();
441
380
  });
442
- options.signal?.addEventListener('abort', abort, { once: true });
443
- if (options.signal?.aborted)
444
- abort();
445
- });
446
- },
447
- };
448
- async function emitLifecycleEvent(context, event) {
449
- const commandEvent = {
450
- type: event.type,
451
- message: event.message,
452
- data: event.data,
453
- level: event.level,
454
- source: {
455
- plugin: event.plugin,
456
- platform: event.platform,
457
- scope: event.scope,
458
- action: 'lifecycle',
459
381
  },
460
382
  };
461
- await context.reporter.event(commandEvent);
462
- await context.debugLogger.log(commandEvent);
463
383
  }
464
- export async function runLifecycleScript(options) {
465
- const target = await resolveLifecycleScriptTarget({
466
- event: options.event,
467
- pluginName: options.pluginName,
468
- platform: options.platform,
469
- currentPlugin: options.currentPlugin,
470
- cwd: options.cwd,
471
- env: options.context.env,
472
- runtimeOs: options.runtimeOs,
473
- });
474
- for (const warning of target.warnings) {
475
- await options.context.reporter.notice({
476
- level: 'warning',
477
- message: warning,
478
- source: {
479
- platform: options.platform,
480
- plugin: options.pluginName,
481
- scope: options.scope,
482
- action: 'lifecycle',
483
- },
484
- target: 'stderr',
485
- });
486
- }
487
- if (target.noOp) {
488
- await emitLifecycleEvent(options.context, {
489
- type: 'lifecycle.noop',
490
- message: `${options.event} lifecycle script is not declared.`,
491
- plugin: options.pluginName,
492
- platform: options.platform,
493
- scope: options.scope,
494
- level: 'debug',
495
- });
496
- return { executed: false, target };
497
- }
498
- const writtenContext = await writeLifecycleScriptContext({
499
- sourceId: options.currentPlugin?.sourceId,
500
- sourceIdentity: options.currentPlugin?.sourceIdentity,
501
- target,
502
- event: options.event,
503
- platform: options.platform,
504
- scope: options.scope,
505
- cwd: options.cwd,
506
- commandEnv: options.context.env,
507
- artifacts: options.artifacts,
508
- });
384
+ export const defaultPluginProcessRunner = createDefaultPluginProcessRunner();
385
+ export async function runPreApplyScript(options) {
386
+ const declaration = options.plugin.manifest.scripts?.preApply;
387
+ if (!declaration)
388
+ return;
389
+ const awHome = resolveAwHome(options.context.env);
390
+ const codexHome = options.context.env.AW_CODEX_HOME || path.join(awHome, 'isolated-codex-home');
391
+ const claudeHome = options.context.env.AW_CLAUDE_HOME || path.join(awHome, 'isolated-claude-home');
392
+ let tempDir;
393
+ let interruptSignal;
394
+ let interruptReason;
395
+ let sensitiveValues = [];
396
+ let runnerCleanupConfirmed = false;
397
+ let removeInterruptListeners;
398
+ const privateRoots = () => [
399
+ ...(tempDir ? [
400
+ { root: path.join(tempDir, 'home'), replacement: '[temporary-home]' },
401
+ { root: path.join(tempDir, 'tmp'), replacement: '[temporary]' },
402
+ { root: tempDir, replacement: '[temporary]' },
403
+ ] : []),
404
+ { root: codexHome, replacement: '[codex-home]' },
405
+ { root: claudeHome, replacement: '[claude-home]' },
406
+ { root: awHome, replacement: '[aw-home]' },
407
+ { root: options.plugin.rootDir, replacement: '[plugin-root]' },
408
+ { root: options.cwd, replacement: '[project-root]' },
409
+ ];
509
410
  try {
510
- await fs.ensureDir(path.join(writtenContext.tempDir, 'home'));
511
- await fs.ensureDir(path.join(writtenContext.tempDir, 'tmp'));
512
- const timeoutMs = resolveLifecycleScriptTimeoutMs({
513
- cliTimeoutMs: options.scriptTimeoutMs,
514
- manifest: target.sourceManifest,
515
- });
516
- const spawnEnv = buildLifecycleSpawnEnv({
517
- commandEnv: options.context.env,
518
- contextPath: writtenContext.contextPath,
519
- tempDir: writtenContext.tempDir,
520
- plugin: writtenContext.context.plugin,
521
- event: options.event,
522
- platform: options.platform,
523
- scope: options.scope,
524
- bundleRoot: writtenContext.context.plugin.rootDir,
525
- runtimeOs: options.runtimeOs,
526
- });
527
- const invocation = buildLifecycleScriptInvocation({
528
- entry: target.entry,
529
- entryPath: target.entryPath,
530
- cwd: options.cwd,
531
- env: spawnEnv,
532
- });
533
- await emitLifecycleEvent(options.context, {
534
- type: 'lifecycle.start',
535
- plugin: options.pluginName,
536
- platform: options.platform,
537
- scope: options.scope,
538
- level: 'info',
539
- data: {
540
- event: options.event,
541
- source: target.source,
542
- command: invocation.command,
543
- args: invocation.args,
544
- timeoutMs,
545
- },
546
- });
547
- const result = await (options.runner ?? defaultPluginProcessRunner).run(invocation, { timeoutMs });
548
- const stdoutSummary = summarizePluginScriptOutput(result.stdout, writtenContext.sensitiveValues);
549
- const stderrSummary = summarizePluginScriptOutput(result.stderr, writtenContext.sensitiveValues);
550
- await emitLifecycleEvent(options.context, {
551
- type: 'lifecycle.finish',
552
- plugin: options.pluginName,
553
- platform: options.platform,
554
- scope: options.scope,
555
- level: result.exitCode === 0 && !result.timedOut ? 'info' : 'warning',
556
- data: {
557
- event: options.event,
558
- exitCode: result.exitCode,
559
- signal: result.signal,
560
- timedOut: result.timedOut,
561
- stdout: stdoutSummary,
562
- stderr: stderrSummary,
563
- },
564
- });
565
- if (result.timedOut) {
566
- throw new Error(`Lifecycle script "${options.event}" timed out after ${timeoutMs} ms. stderr: ${stderrSummary}`);
411
+ const entryPath = await resolveBundledPluginFilePath({ bundleRoot: options.plugin.rootDir, pluginRelativePath: declaration.path, fieldName: 'preApply script' });
412
+ const effective = options.plugin.manifest.config?.fields
413
+ ? await resolveEffectivePluginConfig({ sourceId: options.plugin.sourceId, sourceIdentity: options.plugin.sourceIdentity, logicalIdentity: options.plugin.catalogLogicalIdentity, pluginName: options.plugin.manifest.name, manifest: options.plugin.manifest, targetScope: options.scope, cwd: options.cwd, env: options.context.env })
414
+ : { values: {}, issues: [] };
415
+ if (effective.issues.length > 0)
416
+ throw new Error(`preApply config is invalid for ${options.plugin.manifest.name}.`);
417
+ const payload = {
418
+ schemaVersion: 1,
419
+ plugin: { pluginId: options.plugin.pluginId ?? `${options.plugin.sourceId}/${options.plugin.manifest.name}`, name: options.plugin.manifest.name, version: options.plugin.manifest.version, rootDir: options.plugin.rootDir },
420
+ target: { platform: options.platform, scope: options.scope, ...(options.scope === 'project' ? { projectRoot: options.cwd } : {}) },
421
+ config: { values: effective.values },
422
+ };
423
+ const tempRoot = assertTestWritablePath(path.join(awHome, 'tmp'), 'preApply temp root');
424
+ await fs.ensureDir(tempRoot);
425
+ tempDir = await fs.mkdtemp(path.join(tempRoot, 'plugin-pre-apply-'));
426
+ await fs.ensureDir(path.join(tempDir, 'home'));
427
+ await fs.ensureDir(path.join(tempDir, 'tmp'));
428
+ const env = buildPluginScriptSpawnEnv({ commandEnv: options.context.env, contextPath: '', tempDir, plugin: payload.plugin, event: 'preApply', platform: options.platform, scope: options.scope, bundleRoot: options.plugin.rootDir });
429
+ delete env.AW_PLUGIN_CONTEXT;
430
+ sensitiveValues = collectSensitivePluginConfigValues(options.plugin.manifest, effective.values);
431
+ const invocation = buildNodeScriptInvocation({ entryPath, cwd: options.plugin.rootDir, env, stdin: `${JSON.stringify(payload)}\n` });
432
+ const runOptions = { timeoutMs: resolvePluginScriptTimeoutMs({ cliTimeoutMs: options.scriptTimeoutMs, manifestTimeoutMs: declaration.timeoutMs }) };
433
+ const interruptController = new AbortController();
434
+ const handleInterrupt = (signal) => {
435
+ if (interruptSignal)
436
+ return;
437
+ interruptSignal = signal;
438
+ interruptReason = new Error(`preApply interrupted by ${signal}.`);
439
+ interruptController.abort(interruptReason);
440
+ };
441
+ const handleSigint = () => handleInterrupt('SIGINT');
442
+ const handleSigterm = () => handleInterrupt('SIGTERM');
443
+ process.on('SIGINT', handleSigint);
444
+ process.on('SIGTERM', handleSigterm);
445
+ removeInterruptListeners = () => {
446
+ process.removeListener('SIGINT', handleSigint);
447
+ process.removeListener('SIGTERM', handleSigterm);
448
+ };
449
+ let result;
450
+ try {
451
+ result = options.runner
452
+ ? await options.runner.run(invocation, { ...runOptions, signal: interruptController.signal })
453
+ : await defaultPluginProcessRunner.run(invocation, { ...runOptions, sensitiveValues, signal: interruptController.signal });
454
+ runnerCleanupConfirmed = true;
567
455
  }
456
+ catch (error) {
457
+ if (interruptSignal && error === interruptReason) {
458
+ runnerCleanupConfirmed = true;
459
+ }
460
+ else if (interruptSignal) {
461
+ throw new Error(`preApply process cleanup failed after ${interruptSignal}.`);
462
+ }
463
+ else if (error instanceof PluginProcessInputError) {
464
+ throw attachSafeOperationError(new Error('preApply input could not be sent.'), {
465
+ code: 'preApplyInputFailed',
466
+ stage: 'preApply',
467
+ safeMessage: 'The preApply context could not be sent to the process.',
468
+ });
469
+ }
470
+ else {
471
+ const causeCode = error && typeof error === 'object' && 'code' in error
472
+ && typeof error.code === 'string' ? error.code : undefined;
473
+ const safeCauseCode = causeCode === 'ENOENT' || causeCode === 'EACCES' || causeCode === 'EPERM'
474
+ ? causeCode : undefined;
475
+ throw attachSafeOperationError(new Error('preApply could not start.'), {
476
+ code: safeCauseCode === 'ENOENT' ? 'preApplyExecutableMissing' : 'preApplyStartFailed',
477
+ stage: 'preApply',
478
+ safeMessage: causeCode === 'ENOENT'
479
+ ? 'The preApply executable is not available.'
480
+ : 'The preApply process could not start.',
481
+ ...(safeCauseCode ? {
482
+ cause: { code: safeCauseCode, safeMessage: `Process start failed (${safeCauseCode}).` },
483
+ } : {}),
484
+ });
485
+ }
486
+ }
487
+ if (!result)
488
+ return;
489
+ const stdout = summarizePreApplyFailureOutput(result.stdout, privateRoots(), sensitiveValues);
490
+ const stderr = summarizePreApplyFailureOutput(result.stderr, privateRoots(), sensitiveValues);
491
+ const output = [
492
+ ...(stdout ? [`stdout: ${stdout}`] : []),
493
+ ...(stderr ? [`stderr: ${stderr}`] : []),
494
+ ].join('; ');
495
+ if (result.timedOut)
496
+ throw attachSafeOperationError(new Error(`preApply timed out.${output ? ` ${output}` : ''}`), {
497
+ code: 'preApplyTimedOut',
498
+ stage: 'preApply',
499
+ safeMessage: 'The preApply process timed out.',
500
+ exitCode: 124,
501
+ });
568
502
  if (result.exitCode !== 0) {
569
- throw new Error(`Lifecycle script "${options.event}" failed with exit code ${result.exitCode}. stderr: ${stderrSummary}`);
503
+ throw attachSafeOperationError(new Error(`preApply failed with exit code ${result.exitCode}.${output ? ` ${output}` : ''}`), {
504
+ code: 'preApplyExited',
505
+ stage: 'preApply',
506
+ safeMessage: 'The preApply process exited unsuccessfully.',
507
+ ...(result.exitCode === null ? {} : { exitCode: result.exitCode }),
508
+ });
570
509
  }
571
- return {
572
- executed: true,
573
- target,
574
- exitCode: result.exitCode,
575
- signal: result.signal,
576
- stdout: stdoutSummary,
577
- stderr: stderrSummary,
578
- timedOut: result.timedOut,
579
- };
510
+ }
511
+ catch (error) {
512
+ const message = error instanceof Error ? error.message : String(error);
513
+ const failure = new Error(redactString(sanitizePreApplyErrorMessage(message, privateRoots(), sensitiveValues)));
514
+ const diagnostic = error && typeof error === 'object' && 'operationDiagnostic' in error
515
+ ? error.operationDiagnostic
516
+ : undefined;
517
+ throw diagnostic ? Object.assign(failure, { operationDiagnostic: diagnostic }) : failure;
580
518
  }
581
519
  finally {
582
- await writtenContext.cleanup();
520
+ let tempCleanupError;
521
+ try {
522
+ if (tempDir)
523
+ await fs.remove(tempDir);
524
+ }
525
+ catch (error) {
526
+ tempCleanupError = error;
527
+ }
528
+ removeInterruptListeners?.();
529
+ if (interruptSignal) {
530
+ if (tempCleanupError) {
531
+ process.stderr.write(`preApply temporary directory cleanup failed after ${interruptSignal}.\n`);
532
+ process.exit(1);
533
+ }
534
+ if (!runnerCleanupConfirmed) {
535
+ process.stderr.write(`preApply process cleanup failed after ${interruptSignal}.\n`);
536
+ process.exit(1);
537
+ }
538
+ process.exit(interruptSignal === 'SIGINT' ? 130 : 143);
539
+ }
540
+ if (tempCleanupError) {
541
+ throw tempCleanupError;
542
+ }
583
543
  }
584
544
  }
585
545
  //# sourceMappingURL=plugin-scripts.js.map