@lesliechan721/aw 0.1.0-beta.6 → 0.1.0-beta.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) 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 -92
  16. package/dist/authoring/scripts/lib/skill-scaffold.mjs +99 -124
  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 +552 -1142
  23. package/dist/authoring/scripts/validate-plugin.mjs.map +1 -1
  24. package/dist/native-runtime/reader-runtime.mjs +34 -0
  25. package/dist/native-runtime/reader.d.mts +6 -0
  26. package/dist/native-runtime/reader.mjs +11 -0
  27. package/dist/scripts/aw-skill-eval-materializer.d.ts +26 -0
  28. package/dist/scripts/aw-skill-eval-materializer.js +306 -0
  29. package/dist/scripts/aw-skill-eval-materializer.js.map +1 -0
  30. package/dist/scripts/bundle-plugins.d.ts +1 -0
  31. package/dist/scripts/bundle-plugins.js +19 -8
  32. package/dist/scripts/bundle-plugins.js.map +1 -1
  33. package/dist/scripts/plugin-staging.d.ts +7 -9
  34. package/dist/scripts/plugin-staging.js +18 -29
  35. package/dist/scripts/plugin-staging.js.map +1 -1
  36. package/dist/scripts/plugin-test-reporter.d.mts +2 -0
  37. package/dist/scripts/plugin-test-reporter.mjs +21 -0
  38. package/dist/scripts/plugin-test-reporter.mjs.map +1 -0
  39. package/dist/scripts/test-plugin-scripts.d.ts +5 -0
  40. package/dist/scripts/test-plugin-scripts.js +208 -89
  41. package/dist/scripts/test-plugin-scripts.js.map +1 -1
  42. package/dist/scripts/test-workers.d.mts +24 -0
  43. package/dist/scripts/test-workers.mjs +59 -0
  44. package/dist/scripts/test-workers.mjs.map +1 -0
  45. package/dist/src/adapters/helpers.d.ts +7 -0
  46. package/dist/src/adapters/helpers.js +2 -2
  47. package/dist/src/adapters/helpers.js.map +1 -1
  48. package/dist/src/authoring/workspace-commands.d.ts +19 -1
  49. package/dist/src/authoring/workspace-commands.js +24 -5
  50. package/dist/src/authoring/workspace-commands.js.map +1 -1
  51. package/dist/src/commands/aw-capabilities.d.ts +78 -0
  52. package/dist/src/commands/aw-capabilities.js +266 -0
  53. package/dist/src/commands/aw-capabilities.js.map +1 -0
  54. package/dist/src/commands/catalog-dev-source.d.ts +154 -0
  55. package/dist/src/commands/catalog-dev-source.js +655 -0
  56. package/dist/src/commands/catalog-dev-source.js.map +1 -0
  57. package/dist/src/commands/catalog-generation.d.ts +21 -0
  58. package/dist/src/commands/catalog-generation.js +9 -0
  59. package/dist/src/commands/catalog-generation.js.map +1 -0
  60. package/dist/src/commands/catalog-publication-inspection.d.ts +71 -30
  61. package/dist/src/commands/catalog-publication-inspection.js +475 -63
  62. package/dist/src/commands/catalog-publication-inspection.js.map +1 -1
  63. package/dist/src/commands/catalog-publication-journal.d.ts +68 -0
  64. package/dist/src/commands/catalog-publication-journal.js +292 -0
  65. package/dist/src/commands/catalog-publication-journal.js.map +1 -0
  66. package/dist/src/commands/catalog-publication-target.d.ts +18 -0
  67. package/dist/src/commands/catalog-publication-target.js +95 -0
  68. package/dist/src/commands/catalog-publication-target.js.map +1 -0
  69. package/dist/src/commands/catalog-publish.d.ts +73 -15
  70. package/dist/src/commands/catalog-publish.js +701 -212
  71. package/dist/src/commands/catalog-publish.js.map +1 -1
  72. package/dist/src/commands/catalog-source.d.ts +60 -22
  73. package/dist/src/commands/catalog-source.js +311 -91
  74. package/dist/src/commands/catalog-source.js.map +1 -1
  75. package/dist/src/commands/catalog-status.d.ts +18 -22
  76. package/dist/src/commands/catalog-status.js +81 -115
  77. package/dist/src/commands/catalog-status.js.map +1 -1
  78. package/dist/src/commands/catalog-store.d.ts +104 -0
  79. package/dist/src/commands/catalog-store.js +685 -0
  80. package/dist/src/commands/catalog-store.js.map +1 -0
  81. package/dist/src/commands/catalog-workspace-resolution.d.ts +13 -0
  82. package/dist/src/commands/catalog-workspace-resolution.js +42 -0
  83. package/dist/src/commands/catalog-workspace-resolution.js.map +1 -0
  84. package/dist/src/commands/console.js +28 -17
  85. package/dist/src/commands/console.js.map +1 -1
  86. package/dist/src/commands/dependency-operation-plan.d.ts +52 -15
  87. package/dist/src/commands/dependency-operation-plan.js +289 -7
  88. package/dist/src/commands/dependency-operation-plan.js.map +1 -1
  89. package/dist/src/commands/init.d.ts +5 -11
  90. package/dist/src/commands/init.js +30 -51
  91. package/dist/src/commands/init.js.map +1 -1
  92. package/dist/src/commands/managed-commands.d.ts +28 -0
  93. package/dist/src/commands/managed-commands.js +315 -0
  94. package/dist/src/commands/managed-commands.js.map +1 -0
  95. package/dist/src/commands/offline-cleanup-evidence.d.ts +67 -0
  96. package/dist/src/commands/offline-cleanup-evidence.js +181 -0
  97. package/dist/src/commands/offline-cleanup-evidence.js.map +1 -0
  98. package/dist/src/commands/operation-plan.d.ts +182 -0
  99. package/dist/src/commands/operation-plan.js +71 -0
  100. package/dist/src/commands/operation-plan.js.map +1 -0
  101. package/dist/src/commands/operation-planner.d.ts +47 -0
  102. package/dist/src/commands/operation-planner.js +142 -0
  103. package/dist/src/commands/operation-planner.js.map +1 -0
  104. package/dist/src/commands/options.d.ts +9 -7
  105. package/dist/src/commands/options.js +83 -21
  106. package/dist/src/commands/options.js.map +1 -1
  107. package/dist/src/commands/plugin-capabilities.js +65 -4
  108. package/dist/src/commands/plugin-capabilities.js.map +1 -1
  109. package/dist/src/commands/rebuild-command.d.ts +78 -31
  110. package/dist/src/commands/rebuild-command.js +5229 -942
  111. package/dist/src/commands/rebuild-command.js.map +1 -1
  112. package/dist/src/commands/rebuild-integration.d.ts +143 -21
  113. package/dist/src/commands/rebuild-integration.js +3384 -1342
  114. package/dist/src/commands/rebuild-integration.js.map +1 -1
  115. package/dist/src/commands/rebuild-operations.d.ts +60 -30
  116. package/dist/src/commands/rebuild-operations.js +267 -320
  117. package/dist/src/commands/rebuild-operations.js.map +1 -1
  118. package/dist/src/commands/reconcile-operation-plan.d.ts +28 -0
  119. package/dist/src/commands/reconcile-operation-plan.js +47 -0
  120. package/dist/src/commands/reconcile-operation-plan.js.map +1 -0
  121. package/dist/src/commands/review-inspection.d.ts +60 -0
  122. package/dist/src/commands/review-inspection.js +422 -0
  123. package/dist/src/commands/review-inspection.js.map +1 -0
  124. package/dist/src/commands/review-preparation.d.ts +49 -0
  125. package/dist/src/commands/review-preparation.js +427 -0
  126. package/dist/src/commands/review-preparation.js.map +1 -0
  127. package/dist/src/commands/runtime.d.ts +1 -5
  128. package/dist/src/commands/runtime.js +27 -53
  129. package/dist/src/commands/runtime.js.map +1 -1
  130. package/dist/src/commands/skill-eval.d.ts +39 -0
  131. package/dist/src/commands/skill-eval.js +400 -0
  132. package/dist/src/commands/skill-eval.js.map +1 -0
  133. package/dist/src/commands/status-v6.d.ts +279 -0
  134. package/dist/src/commands/status-v6.js +2785 -0
  135. package/dist/src/commands/status-v6.js.map +1 -0
  136. package/dist/src/commands/sync-command.d.ts +40 -0
  137. package/dist/src/commands/sync-command.js +254 -0
  138. package/dist/src/commands/sync-command.js.map +1 -0
  139. package/dist/src/commands/wizard.d.ts +8 -5
  140. package/dist/src/commands/wizard.js +6 -4
  141. package/dist/src/commands/wizard.js.map +1 -1
  142. package/dist/src/commands/write-commands.d.ts +9 -3
  143. package/dist/src/commands/write-commands.js +136 -31
  144. package/dist/src/commands/write-commands.js.map +1 -1
  145. package/dist/src/constants.d.ts +7 -2
  146. package/dist/src/constants.js +7 -2
  147. package/dist/src/constants.js.map +1 -1
  148. package/dist/src/eval/manifest-v1.d.ts +68 -0
  149. package/dist/src/eval/manifest-v1.js +353 -0
  150. package/dist/src/eval/manifest-v1.js.map +1 -0
  151. package/dist/src/generators/local-plugin.d.ts +5 -1
  152. package/dist/src/generators/local-plugin.js +261 -109
  153. package/dist/src/generators/local-plugin.js.map +1 -1
  154. package/dist/src/generators/permissions.d.ts +5 -2
  155. package/dist/src/generators/permissions.js +28 -15
  156. package/dist/src/generators/permissions.js.map +1 -1
  157. package/dist/src/index.d.ts +10 -4
  158. package/dist/src/index.js +1774 -609
  159. package/dist/src/index.js.map +1 -1
  160. package/dist/src/output/command-receipt.d.ts +47 -46
  161. package/dist/src/output/command-receipt.js +277 -79
  162. package/dist/src/output/command-receipt.js.map +1 -1
  163. package/dist/src/output/model.d.ts +3 -44
  164. package/dist/src/output/model.js +1 -144
  165. package/dist/src/output/model.js.map +1 -1
  166. package/dist/src/output/rebuild-progress.js +15 -13
  167. package/dist/src/output/rebuild-progress.js.map +1 -1
  168. package/dist/src/portable/commands.d.ts +46 -7
  169. package/dist/src/portable/commands.js +349 -37
  170. package/dist/src/portable/commands.js.map +1 -1
  171. package/dist/src/portable/materializer.d.ts +17 -4
  172. package/dist/src/portable/materializer.js +186 -41
  173. package/dist/src/portable/materializer.js.map +1 -1
  174. package/dist/src/portable/skills-cli.d.ts +15 -7
  175. package/dist/src/portable/skills-cli.js +74 -20
  176. package/dist/src/portable/skills-cli.js.map +1 -1
  177. package/dist/src/review/eval-source-input.d.ts +43 -0
  178. package/dist/src/review/eval-source-input.js +207 -0
  179. package/dist/src/review/eval-source-input.js.map +1 -0
  180. package/dist/src/review/review-profile.d.ts +17 -0
  181. package/dist/src/review/review-profile.js +234 -0
  182. package/dist/src/review/review-profile.js.map +1 -0
  183. package/dist/src/review/review-selection.d.ts +30 -0
  184. package/dist/src/review/review-selection.js +527 -0
  185. package/dist/src/review/review-selection.js.map +1 -0
  186. package/dist/src/review/review-types.d.ts +68 -0
  187. package/dist/src/review/review-types.js +16 -0
  188. package/dist/src/review/review-types.js.map +1 -0
  189. package/dist/src/review/skill-materialization.d.ts +26 -0
  190. package/dist/src/review/skill-materialization.js +217 -0
  191. package/dist/src/review/skill-materialization.js.map +1 -0
  192. package/dist/src/review/source-binding.d.ts +183 -0
  193. package/dist/src/review/source-binding.js +708 -0
  194. package/dist/src/review/source-binding.js.map +1 -0
  195. package/dist/src/tui/catalog-freshness.d.ts +1 -0
  196. package/dist/src/tui/catalog-freshness.js +2 -0
  197. package/dist/src/tui/catalog-freshness.js.map +1 -0
  198. package/dist/src/tui/catalog-generation.d.ts +21 -0
  199. package/dist/src/tui/catalog-generation.js +156 -0
  200. package/dist/src/tui/catalog-generation.js.map +1 -0
  201. package/dist/src/tui/catalog-sources/projection.d.ts +4 -0
  202. package/dist/src/tui/catalog-sources/projection.js +17 -0
  203. package/dist/src/tui/catalog-sources/projection.js.map +1 -0
  204. package/dist/src/tui/catalog-sources/review.d.ts +3 -0
  205. package/dist/src/tui/catalog-sources/review.js +13 -0
  206. package/dist/src/tui/catalog-sources/review.js.map +1 -0
  207. package/dist/src/tui/catalog-sources/screens.d.ts +12 -0
  208. package/dist/src/tui/catalog-sources/screens.js +40 -0
  209. package/dist/src/tui/catalog-sources/screens.js.map +1 -0
  210. package/dist/src/tui/catalog-sources/session.d.ts +32 -0
  211. package/dist/src/tui/catalog-sources/session.js +300 -0
  212. package/dist/src/tui/catalog-sources/session.js.map +1 -0
  213. package/dist/src/tui/catalog-sources/types.d.ts +54 -0
  214. package/dist/src/tui/catalog-sources/types.js +2 -0
  215. package/dist/src/tui/catalog-sources/types.js.map +1 -0
  216. package/dist/src/tui/catalog-store-task.d.ts +16 -0
  217. package/dist/src/tui/catalog-store-task.js +19 -0
  218. package/dist/src/tui/catalog-store-task.js.map +1 -0
  219. package/dist/src/tui/clipboard.d.ts +13 -0
  220. package/dist/src/tui/clipboard.js +95 -0
  221. package/dist/src/tui/clipboard.js.map +1 -0
  222. package/dist/src/tui/components.d.ts +110 -3
  223. package/dist/src/tui/components.js +183 -36
  224. package/dist/src/tui/components.js.map +1 -1
  225. package/dist/src/tui/config-array-draft.d.ts +29 -0
  226. package/dist/src/tui/config-array-draft.js +48 -0
  227. package/dist/src/tui/config-array-draft.js.map +1 -0
  228. package/dist/src/tui/config-leaf-editor.d.ts +19 -0
  229. package/dist/src/tui/config-leaf-editor.js +212 -0
  230. package/dist/src/tui/config-leaf-editor.js.map +1 -0
  231. package/dist/src/tui/config-references.d.ts +34 -0
  232. package/dist/src/tui/config-references.js +70 -0
  233. package/dist/src/tui/config-references.js.map +1 -0
  234. package/dist/src/tui/config-value-presentation.d.ts +20 -0
  235. package/dist/src/tui/config-value-presentation.js +104 -0
  236. package/dist/src/tui/config-value-presentation.js.map +1 -0
  237. package/dist/src/tui/console-app-v4.d.ts +14 -4
  238. package/dist/src/tui/console-app-v4.js +9205 -1951
  239. package/dist/src/tui/console-app-v4.js.map +1 -1
  240. package/dist/src/tui/content-item-card.d.ts +13 -0
  241. package/dist/src/tui/content-item-card.js +51 -0
  242. package/dist/src/tui/content-item-card.js.map +1 -0
  243. package/dist/src/tui/controller-runtime.d.ts +10 -2
  244. package/dist/src/tui/controller-runtime.js +3289 -388
  245. package/dist/src/tui/controller-runtime.js.map +1 -1
  246. package/dist/src/tui/controller.d.ts +622 -45
  247. package/dist/src/tui/controller.js +3589 -768
  248. package/dist/src/tui/controller.js.map +1 -1
  249. package/dist/src/tui/dependency-graph-view.d.ts +39 -0
  250. package/dist/src/tui/dependency-graph-view.js +121 -0
  251. package/dist/src/tui/dependency-graph-view.js.map +1 -0
  252. package/dist/src/tui/dependency-graph.d.ts +81 -0
  253. package/dist/src/tui/dependency-graph.js +452 -0
  254. package/dist/src/tui/dependency-graph.js.map +1 -0
  255. package/dist/src/tui/diagnostic-projection.d.ts +23 -0
  256. package/dist/src/tui/diagnostic-projection.js +595 -0
  257. package/dist/src/tui/diagnostic-projection.js.map +1 -0
  258. package/dist/src/tui/diagnostics.d.ts +3 -3
  259. package/dist/src/tui/diagnostics.js +14 -2
  260. package/dist/src/tui/diagnostics.js.map +1 -1
  261. package/dist/src/tui/entity-cards.d.ts +55 -0
  262. package/dist/src/tui/entity-cards.js +220 -0
  263. package/dist/src/tui/entity-cards.js.map +1 -0
  264. package/dist/src/tui/glossary.d.ts +23 -0
  265. package/dist/src/tui/glossary.js +42 -0
  266. package/dist/src/tui/glossary.js.map +1 -0
  267. package/dist/src/tui/index.d.ts +6 -1
  268. package/dist/src/tui/index.js +5 -1
  269. package/dist/src/tui/index.js.map +1 -1
  270. package/dist/src/tui/input-display.d.ts +9 -0
  271. package/dist/src/tui/input-display.js +58 -0
  272. package/dist/src/tui/input-display.js.map +1 -0
  273. package/dist/src/tui/keys.d.ts +44 -0
  274. package/dist/src/tui/keys.js +43 -15
  275. package/dist/src/tui/keys.js.map +1 -1
  276. package/dist/src/tui/lifecycle-action-view.d.ts +6 -0
  277. package/dist/src/tui/lifecycle-action-view.js +36 -0
  278. package/dist/src/tui/lifecycle-action-view.js.map +1 -0
  279. package/dist/src/tui/model.d.ts +224 -31
  280. package/dist/src/tui/model.js +1510 -397
  281. package/dist/src/tui/model.js.map +1 -1
  282. package/dist/src/tui/operation-diagnostic-screens.d.ts +8 -0
  283. package/dist/src/tui/operation-diagnostic-screens.js +71 -0
  284. package/dist/src/tui/operation-diagnostic-screens.js.map +1 -0
  285. package/dist/src/tui/operation-history.d.ts +81 -0
  286. package/dist/src/tui/operation-history.js +136 -0
  287. package/dist/src/tui/operation-history.js.map +1 -0
  288. package/dist/src/tui/operation-review-planner.d.ts +21 -0
  289. package/dist/src/tui/operation-review-planner.js +1392 -0
  290. package/dist/src/tui/operation-review-planner.js.map +1 -0
  291. package/dist/src/tui/plugin-content.d.ts +31 -0
  292. package/dist/src/tui/plugin-content.js +680 -0
  293. package/dist/src/tui/plugin-content.js.map +1 -0
  294. package/dist/src/tui/plugin-detail.d.ts +52 -0
  295. package/dist/src/tui/plugin-detail.js +165 -0
  296. package/dist/src/tui/plugin-detail.js.map +1 -0
  297. package/dist/src/tui/plugin-write-task.d.ts +69 -0
  298. package/dist/src/tui/plugin-write-task.js +286 -0
  299. package/dist/src/tui/plugin-write-task.js.map +1 -0
  300. package/dist/src/tui/project-inventory.d.ts +68 -0
  301. package/dist/src/tui/project-inventory.js +203 -0
  302. package/dist/src/tui/project-inventory.js.map +1 -0
  303. package/dist/src/tui/prompt.js +4 -15
  304. package/dist/src/tui/prompt.js.map +1 -1
  305. package/dist/src/tui/query-header.d.ts +30 -0
  306. package/dist/src/tui/query-header.js +40 -0
  307. package/dist/src/tui/query-header.js.map +1 -0
  308. package/dist/src/tui/reader.d.ts +37 -0
  309. package/dist/src/tui/reader.js +47 -0
  310. package/dist/src/tui/reader.js.map +1 -0
  311. package/dist/src/tui/router.d.ts +197 -10
  312. package/dist/src/tui/router.js +338 -50
  313. package/dist/src/tui/router.js.map +1 -1
  314. package/dist/src/tui/screen-registry.d.ts +701 -0
  315. package/dist/src/tui/screen-registry.js +230 -0
  316. package/dist/src/tui/screen-registry.js.map +1 -0
  317. package/dist/src/tui/session-console-app.d.ts +6 -0
  318. package/dist/src/tui/session-console-app.js +13 -0
  319. package/dist/src/tui/session-console-app.js.map +1 -0
  320. package/dist/src/tui/session-host.d.ts +45 -0
  321. package/dist/src/tui/session-host.js +209 -0
  322. package/dist/src/tui/session-host.js.map +1 -0
  323. package/dist/src/tui/source-detail-card.d.ts +29 -0
  324. package/dist/src/tui/source-detail-card.js +45 -0
  325. package/dist/src/tui/source-detail-card.js.map +1 -0
  326. package/dist/src/tui/source-ref-presets.d.ts +3 -0
  327. package/dist/src/tui/source-ref-presets.js +11 -0
  328. package/dist/src/tui/source-ref-presets.js.map +1 -0
  329. package/dist/src/tui/theme.d.ts +12 -0
  330. package/dist/src/tui/theme.js +12 -0
  331. package/dist/src/tui/theme.js.map +1 -1
  332. package/dist/src/tui/viewport.d.ts +1 -0
  333. package/dist/src/tui/viewport.js +23 -0
  334. package/dist/src/tui/viewport.js.map +1 -1
  335. package/dist/src/tui/views.js +31 -3
  336. package/dist/src/tui/views.js.map +1 -1
  337. package/dist/src/tui/wizard.js +37 -13
  338. package/dist/src/tui/wizard.js.map +1 -1
  339. package/dist/src/types.d.ts +264 -21
  340. package/dist/src/types.js +1 -0
  341. package/dist/src/types.js.map +1 -1
  342. package/dist/src/utils/agent-version.d.ts +7 -1
  343. package/dist/src/utils/agent-version.js +36 -7
  344. package/dist/src/utils/agent-version.js.map +1 -1
  345. package/dist/src/utils/artifact-plan.d.ts +8 -6
  346. package/dist/src/utils/artifact-plan.js +67 -13
  347. package/dist/src/utils/artifact-plan.js.map +1 -1
  348. package/dist/src/utils/artifact-renderer.d.ts +24 -10
  349. package/dist/src/utils/artifact-renderer.js +230 -220
  350. package/dist/src/utils/artifact-renderer.js.map +1 -1
  351. package/dist/src/utils/artifact-request.d.ts +32 -0
  352. package/dist/src/utils/artifact-request.js +90 -0
  353. package/dist/src/utils/artifact-request.js.map +1 -0
  354. package/dist/src/utils/artifact-sources.d.ts +4 -0
  355. package/dist/src/utils/artifact-sources.js +17 -0
  356. package/dist/src/utils/artifact-sources.js.map +1 -1
  357. package/dist/src/utils/aw-home-mutation-lock.d.ts +1 -0
  358. package/dist/src/utils/aw-home-mutation-lock.js +32 -4
  359. package/dist/src/utils/aw-home-mutation-lock.js.map +1 -1
  360. package/dist/src/utils/bundle-integrity.d.ts +0 -1
  361. package/dist/src/utils/bundle-integrity.js +0 -25
  362. package/dist/src/utils/bundle-integrity.js.map +1 -1
  363. package/dist/src/utils/bundle-layout.js +29 -29
  364. package/dist/src/utils/bundle-layout.js.map +1 -1
  365. package/dist/src/utils/catalog-capability-projection.d.ts +8 -0
  366. package/dist/src/utils/catalog-capability-projection.js +14 -0
  367. package/dist/src/utils/catalog-capability-projection.js.map +1 -0
  368. package/dist/src/utils/catalog-digests.d.ts +10 -0
  369. package/dist/src/utils/catalog-digests.js +57 -20
  370. package/dist/src/utils/catalog-digests.js.map +1 -1
  371. package/dist/src/utils/catalog-generation-control-snapshot.d.ts +11 -0
  372. package/dist/src/utils/catalog-generation-control-snapshot.js +45 -0
  373. package/dist/src/utils/catalog-generation-control-snapshot.js.map +1 -0
  374. package/dist/src/utils/catalog-generation-error.d.ts +16 -0
  375. package/dist/src/utils/catalog-generation-error.js +30 -0
  376. package/dist/src/utils/catalog-generation-error.js.map +1 -0
  377. package/dist/src/utils/catalog-generation-resolver.d.ts +44 -0
  378. package/dist/src/utils/catalog-generation-resolver.js +273 -0
  379. package/dist/src/utils/catalog-generation-resolver.js.map +1 -0
  380. package/dist/src/utils/catalog-generation-service.d.ts +172 -0
  381. package/dist/src/utils/catalog-generation-service.js +1271 -0
  382. package/dist/src/utils/catalog-generation-service.js.map +1 -0
  383. package/dist/src/utils/catalog-generation-state.d.ts +22 -0
  384. package/dist/src/utils/catalog-generation-state.js +192 -0
  385. package/dist/src/utils/catalog-generation-state.js.map +1 -0
  386. package/dist/src/utils/catalog-generation-store.d.ts +58 -0
  387. package/dist/src/utils/catalog-generation-store.js +452 -0
  388. package/dist/src/utils/catalog-generation-store.js.map +1 -0
  389. package/dist/src/utils/catalog-manifest-v7.d.ts +5 -0
  390. package/dist/src/utils/{catalog-manifest-v4.js → catalog-manifest-v7.js} +35 -43
  391. package/dist/src/utils/catalog-manifest-v7.js.map +1 -0
  392. package/dist/src/utils/catalog-operation-context.d.ts +20 -0
  393. package/dist/src/utils/catalog-operation-context.js +142 -0
  394. package/dist/src/utils/catalog-operation-context.js.map +1 -0
  395. package/dist/src/utils/catalog-public-error.d.ts +7 -3
  396. package/dist/src/utils/catalog-public-error.js +28 -8
  397. package/dist/src/utils/catalog-public-error.js.map +1 -1
  398. package/dist/src/utils/catalog-runtime-projection.d.ts +3 -0
  399. package/dist/src/utils/catalog-runtime-projection.js +5 -40
  400. package/dist/src/utils/catalog-runtime-projection.js.map +1 -1
  401. package/dist/src/utils/catalog-snapshot.d.ts +5 -3
  402. package/dist/src/utils/catalog-snapshot.js +11 -3
  403. package/dist/src/utils/catalog-snapshot.js.map +1 -1
  404. package/dist/src/utils/catalog-source-identity.d.ts +1 -0
  405. package/dist/src/utils/catalog-source-identity.js +21 -2
  406. package/dist/src/utils/catalog-source-identity.js.map +1 -1
  407. package/dist/src/utils/catalog-source-impact.d.ts +21 -0
  408. package/dist/src/utils/catalog-source-impact.js +344 -0
  409. package/dist/src/utils/catalog-source-impact.js.map +1 -0
  410. package/dist/src/utils/catalog-source-references.d.ts +3 -2
  411. package/dist/src/utils/catalog-source-references.js +195 -347
  412. package/dist/src/utils/catalog-source-references.js.map +1 -1
  413. package/dist/src/utils/catalog-sources.d.ts +15 -1
  414. package/dist/src/utils/catalog-sources.js +206 -27
  415. package/dist/src/utils/catalog-sources.js.map +1 -1
  416. package/dist/src/utils/claude-skills-root.d.ts +8 -0
  417. package/dist/src/utils/claude-skills-root.js +76 -0
  418. package/dist/src/utils/claude-skills-root.js.map +1 -0
  419. package/dist/src/utils/codex-config.d.ts +2 -0
  420. package/dist/src/utils/codex-config.js +26 -5
  421. package/dist/src/utils/codex-config.js.map +1 -1
  422. package/dist/src/utils/codex-manager.d.ts +79 -0
  423. package/dist/src/utils/codex-manager.js +735 -0
  424. package/dist/src/utils/codex-manager.js.map +1 -0
  425. package/dist/src/utils/codex-marketplace-path.d.ts +5 -0
  426. package/dist/src/utils/codex-marketplace-path.js +45 -0
  427. package/dist/src/utils/codex-marketplace-path.js.map +1 -0
  428. package/dist/src/utils/codex-native-observation.d.ts +49 -0
  429. package/dist/src/utils/codex-native-observation.js +154 -0
  430. package/dist/src/utils/codex-native-observation.js.map +1 -0
  431. package/dist/src/utils/codex-native-render-receipt.d.ts +40 -0
  432. package/dist/src/utils/codex-native-render-receipt.js +205 -0
  433. package/dist/src/utils/codex-native-render-receipt.js.map +1 -0
  434. package/dist/src/utils/codex-reconciler.d.ts +126 -0
  435. package/dist/src/utils/codex-reconciler.js +298 -0
  436. package/dist/src/utils/codex-reconciler.js.map +1 -0
  437. package/dist/src/utils/codex-shared-native.d.ts +43 -0
  438. package/dist/src/utils/codex-shared-native.js +81 -0
  439. package/dist/src/utils/codex-shared-native.js.map +1 -0
  440. package/dist/src/utils/codex-skill-staging.d.ts +2 -0
  441. package/dist/src/utils/codex-skill-staging.js.map +1 -1
  442. package/dist/src/utils/codex-skills-root.d.ts +4 -0
  443. package/dist/src/utils/codex-skills-root.js +25 -0
  444. package/dist/src/utils/codex-skills-root.js.map +1 -0
  445. package/dist/src/utils/codex-surface-analysis.d.ts +46 -0
  446. package/dist/src/utils/codex-surface-analysis.js +247 -0
  447. package/dist/src/utils/codex-surface-analysis.js.map +1 -0
  448. package/dist/src/utils/dynamic-skill-tree.d.ts +5 -0
  449. package/dist/src/utils/dynamic-skill-tree.js +56 -7
  450. package/dist/src/utils/dynamic-skill-tree.js.map +1 -1
  451. package/dist/src/utils/git-catalog-provider.d.ts +16 -0
  452. package/dist/src/utils/git-catalog-provider.js +177 -145
  453. package/dist/src/utils/git-catalog-provider.js.map +1 -1
  454. package/dist/src/utils/local-marketplace.d.ts +27 -1
  455. package/dist/src/utils/local-marketplace.js +434 -84
  456. package/dist/src/utils/local-marketplace.js.map +1 -1
  457. package/dist/src/utils/managed-command-closure.d.ts +3 -0
  458. package/dist/src/utils/managed-command-closure.js +35 -0
  459. package/dist/src/utils/managed-command-closure.js.map +1 -0
  460. package/dist/src/utils/managed-command-evidence.d.ts +7 -0
  461. package/dist/src/utils/managed-command-evidence.js +86 -0
  462. package/dist/src/utils/managed-command-evidence.js.map +1 -0
  463. package/dist/src/utils/managed-command-materialization.d.ts +115 -0
  464. package/dist/src/utils/managed-command-materialization.js +359 -0
  465. package/dist/src/utils/managed-command-materialization.js.map +1 -0
  466. package/dist/src/utils/managed-command-runtime.d.ts +33 -0
  467. package/dist/src/utils/managed-command-runtime.js +121 -0
  468. package/dist/src/utils/managed-command-runtime.js.map +1 -0
  469. package/dist/src/utils/managed-command-store.d.ts +128 -0
  470. package/dist/src/utils/managed-command-store.js +589 -0
  471. package/dist/src/utils/managed-command-store.js.map +1 -0
  472. package/dist/src/utils/manifest.d.ts +1 -3
  473. package/dist/src/utils/manifest.js +1 -3
  474. package/dist/src/utils/manifest.js.map +1 -1
  475. package/dist/src/utils/multi-source-catalog.d.ts +3 -9
  476. package/dist/src/utils/multi-source-catalog.js +54 -110
  477. package/dist/src/utils/multi-source-catalog.js.map +1 -1
  478. package/dist/src/utils/native-cli.d.ts +61 -7
  479. package/dist/src/utils/native-cli.js +426 -58
  480. package/dist/src/utils/native-cli.js.map +1 -1
  481. package/dist/src/utils/native-tool-context.d.ts +14 -0
  482. package/dist/src/utils/native-tool-context.js +38 -0
  483. package/dist/src/utils/native-tool-context.js.map +1 -0
  484. package/dist/src/utils/native-tool-review.d.ts +21 -0
  485. package/dist/src/utils/native-tool-review.js +102 -0
  486. package/dist/src/utils/native-tool-review.js.map +1 -0
  487. package/dist/src/utils/orphan-marketplace-cleanup.js +0 -4
  488. package/dist/src/utils/orphan-marketplace-cleanup.js.map +1 -1
  489. package/dist/src/utils/ownership.d.ts +88 -20
  490. package/dist/src/utils/ownership.js +185 -223
  491. package/dist/src/utils/ownership.js.map +1 -1
  492. package/dist/src/utils/path-catalog-provider.d.ts +1 -1
  493. package/dist/src/utils/path-catalog-provider.js +54 -65
  494. package/dist/src/utils/path-catalog-provider.js.map +1 -1
  495. package/dist/src/utils/paths.d.ts +0 -1
  496. package/dist/src/utils/paths.js +0 -1
  497. package/dist/src/utils/paths.js.map +1 -1
  498. package/dist/src/utils/plugin-config-impact.d.ts +40 -0
  499. package/dist/src/utils/plugin-config-impact.js +373 -0
  500. package/dist/src/utils/plugin-config-impact.js.map +1 -0
  501. package/dist/src/utils/plugin-config-write.d.ts +52 -27
  502. package/dist/src/utils/plugin-config-write.js +1112 -298
  503. package/dist/src/utils/plugin-config-write.js.map +1 -1
  504. package/dist/src/utils/plugin-config.d.ts +153 -93
  505. package/dist/src/utils/plugin-config.js +1116 -968
  506. package/dist/src/utils/plugin-config.js.map +1 -1
  507. package/dist/src/utils/plugin-intent-state.d.ts +49 -0
  508. package/dist/src/utils/plugin-intent-state.js +320 -0
  509. package/dist/src/utils/plugin-intent-state.js.map +1 -0
  510. package/dist/src/utils/plugin-scripts.d.ts +66 -125
  511. package/dist/src/utils/plugin-scripts.js +518 -526
  512. package/dist/src/utils/plugin-scripts.js.map +1 -1
  513. package/dist/src/utils/process-lock.js +14 -5
  514. package/dist/src/utils/process-lock.js.map +1 -1
  515. package/dist/src/utils/process-tree.d.ts +2 -2
  516. package/dist/src/utils/process-tree.js +1 -1
  517. package/dist/src/utils/process-tree.js.map +1 -1
  518. package/dist/src/utils/project-boundary.d.ts +11 -13
  519. package/dist/src/utils/project-boundary.js +28 -34
  520. package/dist/src/utils/project-boundary.js.map +1 -1
  521. package/dist/src/utils/rendered-contract.js +18 -1
  522. package/dist/src/utils/rendered-contract.js.map +1 -1
  523. package/dist/src/utils/runtime-config.d.ts +20 -0
  524. package/dist/src/utils/runtime-config.js +75 -0
  525. package/dist/src/utils/runtime-config.js.map +1 -0
  526. package/dist/src/utils/runtime-skill-closure.js +47 -6
  527. package/dist/src/utils/runtime-skill-closure.js.map +1 -1
  528. package/dist/src/utils/safe-fs.d.ts +21 -0
  529. package/dist/src/utils/safe-fs.js +111 -0
  530. package/dist/src/utils/safe-fs.js.map +1 -0
  531. package/dist/src/utils/safe-operation-diagnostic.d.ts +15 -0
  532. package/dist/src/utils/safe-operation-diagnostic.js +33 -0
  533. package/dist/src/utils/safe-operation-diagnostic.js.map +1 -0
  534. package/dist/src/utils/sensitive-content.d.ts +4 -0
  535. package/dist/src/utils/sensitive-content.js +36 -0
  536. package/dist/src/utils/sensitive-content.js.map +1 -0
  537. package/dist/src/utils/state-paths.js +7 -2
  538. package/dist/src/utils/state-paths.js.map +1 -1
  539. package/dist/src/utils/target-eligibility.d.ts +8 -2
  540. package/dist/src/utils/target-eligibility.js +17 -8
  541. package/dist/src/utils/target-eligibility.js.map +1 -1
  542. package/dist/src/utils/windows-claude-shim.d.ts +7 -0
  543. package/dist/src/utils/windows-claude-shim.js +10 -0
  544. package/dist/src/utils/windows-claude-shim.js.map +1 -0
  545. package/dist/src/utils/windows-npm-shim.d.ts +14 -0
  546. package/dist/src/utils/windows-npm-shim.js +140 -0
  547. package/dist/src/utils/windows-npm-shim.js.map +1 -0
  548. package/dist/vitest.config.js +100 -9
  549. package/dist/vitest.config.js.map +1 -1
  550. package/package.json +31 -21
  551. package/dist/authoring/scripts/check-plugin-versions.d.mts +0 -2
  552. package/dist/authoring/scripts/check-plugin-versions.mjs +0 -5
  553. package/dist/authoring/scripts/check-plugin-versions.mjs.map +0 -1
  554. package/dist/scripts/aw-skill-eval-engine.d.ts +0 -13
  555. package/dist/scripts/aw-skill-eval-engine.js +0 -31
  556. package/dist/scripts/aw-skill-eval-engine.js.map +0 -1
  557. package/dist/scripts/codex-eval-app-server.d.ts +0 -89
  558. package/dist/scripts/codex-eval-app-server.js +0 -1228
  559. package/dist/scripts/codex-eval-app-server.js.map +0 -1
  560. package/dist/scripts/codex-eval-isolation.d.ts +0 -61
  561. package/dist/scripts/codex-eval-isolation.js +0 -318
  562. package/dist/scripts/codex-eval-isolation.js.map +0 -1
  563. package/dist/scripts/codex-eval-process-management.d.ts +0 -8
  564. package/dist/scripts/codex-eval-process-management.js +0 -69
  565. package/dist/scripts/codex-eval-process-management.js.map +0 -1
  566. package/dist/scripts/codex-eval-process-tree.d.ts +0 -38
  567. package/dist/scripts/codex-eval-process-tree.js +0 -803
  568. package/dist/scripts/codex-eval-process-tree.js.map +0 -1
  569. package/dist/scripts/codex-eval-runtime-config.d.ts +0 -62
  570. package/dist/scripts/codex-eval-runtime-config.js +0 -843
  571. package/dist/scripts/codex-eval-runtime-config.js.map +0 -1
  572. package/dist/scripts/codex-trigger-eval.d.ts +0 -84
  573. package/dist/scripts/codex-trigger-eval.js +0 -968
  574. package/dist/scripts/codex-trigger-eval.js.map +0 -1
  575. package/dist/scripts/eval-plugin-skills-audited.d.ts +0 -6
  576. package/dist/scripts/eval-plugin-skills-audited.js +0 -261
  577. package/dist/scripts/eval-plugin-skills-audited.js.map +0 -1
  578. package/dist/scripts/eval-plugin-skills.d.ts +0 -45
  579. package/dist/scripts/eval-plugin-skills.js +0 -1586
  580. package/dist/scripts/eval-plugin-skills.js.map +0 -1
  581. package/dist/scripts/eval-run-layout.d.ts +0 -17
  582. package/dist/scripts/eval-run-layout.js +0 -26
  583. package/dist/scripts/eval-run-layout.js.map +0 -1
  584. package/dist/scripts/plugin-eval-contract.d.ts +0 -185
  585. package/dist/scripts/plugin-eval-contract.js +0 -695
  586. package/dist/scripts/plugin-eval-contract.js.map +0 -1
  587. package/dist/scripts/plugin-eval-materializer.d.ts +0 -13
  588. package/dist/scripts/plugin-eval-materializer.js +0 -421
  589. package/dist/scripts/plugin-eval-materializer.js.map +0 -1
  590. package/dist/scripts/skill-reporting.d.ts +0 -212
  591. package/dist/scripts/skill-reporting.js +0 -922
  592. package/dist/scripts/skill-reporting.js.map +0 -1
  593. package/dist/src/commands/review-publication.d.ts +0 -99
  594. package/dist/src/commands/review-publication.js +0 -904
  595. package/dist/src/commands/review-publication.js.map +0 -1
  596. package/dist/src/commands/status-v4.d.ts +0 -123
  597. package/dist/src/commands/status-v4.js +0 -905
  598. package/dist/src/commands/status-v4.js.map +0 -1
  599. package/dist/src/commands/status.d.ts +0 -93
  600. package/dist/src/commands/status.js +0 -442
  601. package/dist/src/commands/status.js.map +0 -1
  602. package/dist/src/utils/active-marketplace-runtime-lock.d.ts +0 -12
  603. package/dist/src/utils/active-marketplace-runtime-lock.js +0 -133
  604. package/dist/src/utils/active-marketplace-runtime-lock.js.map +0 -1
  605. package/dist/src/utils/catalog-manifest-v3.d.ts +0 -2
  606. package/dist/src/utils/catalog-manifest-v3.js +0 -3
  607. package/dist/src/utils/catalog-manifest-v3.js.map +0 -1
  608. package/dist/src/utils/catalog-manifest-v4.d.ts +0 -5
  609. package/dist/src/utils/catalog-manifest-v4.js.map +0 -1
  610. package/dist/src/utils/catalog-source-cache.d.ts +0 -62
  611. package/dist/src/utils/catalog-source-cache.js +0 -296
  612. package/dist/src/utils/catalog-source-cache.js.map +0 -1
  613. package/dist/src/utils/codex-project-surface.d.ts +0 -3
  614. package/dist/src/utils/codex-project-surface.js +0 -49
  615. package/dist/src/utils/codex-project-surface.js.map +0 -1
  616. package/dist/src/utils/lifecycle-active-store.d.ts +0 -175
  617. package/dist/src/utils/lifecycle-active-store.js +0 -1276
  618. package/dist/src/utils/lifecycle-active-store.js.map +0 -1
  619. package/dist/src/utils/plugin-release.d.ts +0 -2
  620. package/dist/src/utils/plugin-release.js +0 -2
  621. package/dist/src/utils/plugin-release.js.map +0 -1
@@ -2,225 +2,83 @@ 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, resolveWindowsJobHelperPath, 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
+ const WINDOWS_SYSTEM_ENV_KEYS = [
19
+ 'SystemRoot', 'windir', 'SystemDrive', 'ComSpec', 'PATHEXT',
20
+ 'ProgramFiles', 'ProgramFiles(x86)', 'ProgramW6432',
21
+ 'CommonProgramFiles', 'CommonProgramFiles(x86)', 'CommonProgramW6432',
22
+ ];
23
+ class PluginProcessInputError extends Error {
24
+ constructor(cause) {
25
+ super('Plugin process input could not be sent.', { cause });
26
+ this.name = 'PluginProcessInputError';
102
27
  }
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
28
  }
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
- };
29
+ export async function resolveBundledPluginFilePath(options) {
30
+ const bundleRoot = await fs.realpath(options.bundleRoot);
31
+ const relativePath = options.pluginRelativePath.startsWith('./') ? options.pluginRelativePath.slice(2) : options.pluginRelativePath;
32
+ const entryPath = await fs.realpath(path.join(bundleRoot, relativePath));
33
+ const relative = path.relative(bundleRoot, entryPath);
34
+ if (relative.startsWith('..') || path.isAbsolute(relative))
35
+ throw new Error(`${options.fieldName} resolves outside the plugin bundle root.`);
36
+ return entryPath;
173
37
  }
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;
38
+ export function buildNodeScriptInvocation(options) {
39
+ return { command: process.execPath, args: [options.entryPath, ...(options.args ?? [])], cwd: options.cwd, env: options.env, ...(options.stdin === undefined ? {} : { stdin: options.stdin }) };
181
40
  }
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;
41
+ export async function preparePluginScriptDirectories(tempDir) {
42
+ const home = path.join(tempDir, 'home');
43
+ await Promise.all([
44
+ fs.ensureDir(home),
45
+ fs.ensureDir(path.join(tempDir, 'tmp')),
46
+ ...(process.platform === 'win32' ? [
47
+ fs.ensureDir(path.join(home, 'AppData', 'Roaming')),
48
+ fs.ensureDir(path.join(home, 'AppData', 'Local')),
49
+ ] : []),
50
+ ]);
191
51
  }
192
52
  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
- const input = options.commandEnv;
197
- const runtime = options.runtimeOs ?? runtimeOs();
53
+ const input = process.platform === 'win32'
54
+ ? Object.fromEntries(Object.entries(options.commandEnv).map(([key, value]) => [key.toUpperCase(), value]))
55
+ : options.commandEnv;
198
56
  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,
57
+ AW_HOME: resolveAwHome(input), AW_CODEX_HOME: input.AW_CODEX_HOME || path.join(resolveAwHome(input), 'isolated-codex-home'),
58
+ AW_CLAUDE_HOME: input.AW_CLAUDE_HOME || path.join(resolveAwHome(input), 'isolated-claude-home'), PATH: input.PATH ?? input.Path ?? '',
59
+ AW_PLUGIN_CONTEXT: options.contextPath, AW_PLUGIN_ROOT: options.bundleRoot, AW_PLUGIN_NAME: options.plugin.name,
60
+ AW_PLUGIN_VERSION: options.plugin.version, AW_PLUGIN_EVENT: options.event, AW_PLUGIN_SCOPE: options.scope,
209
61
  };
210
62
  if (options.platform)
211
63
  output.AW_PLUGIN_PLATFORM = options.platform;
212
64
  if (options.distribution)
213
65
  output.AW_PLUGIN_DISTRIBUTION = options.distribution;
214
- if (runtime === 'win32') {
215
- output.USERPROFILE = path.join(options.tempDir, 'home');
66
+ if (process.platform === 'win32') {
67
+ // Native Windows hosts need system installation paths to load their runtime
68
+ // and modules. Keep user state and module-path overrides out of this list.
69
+ for (const key of WINDOWS_SYSTEM_ENV_KEYS) {
70
+ const value = input[key.toUpperCase()];
71
+ if (value !== undefined)
72
+ output[key] = value;
73
+ }
74
+ output.HOME = path.join(options.tempDir, 'home');
75
+ output.USERPROFILE = output.HOME;
76
+ output.HOMEDRIVE = path.parse(output.HOME).root.replace(/[\\/]$/u, '');
77
+ output.HOMEPATH = output.HOME.slice(output.HOMEDRIVE.length);
78
+ output.APPDATA = path.join(output.HOME, 'AppData', 'Roaming');
79
+ output.LOCALAPPDATA = path.join(output.HOME, 'AppData', 'Local');
216
80
  output.TEMP = path.join(options.tempDir, 'tmp');
217
81
  output.TMP = output.TEMP;
218
- if (input.SystemRoot) {
219
- output.SystemRoot = input.SystemRoot;
220
- }
221
- if (input.ComSpec) {
222
- output.ComSpec = input.ComSpec;
223
- }
224
82
  }
225
83
  else {
226
84
  output.HOME = path.join(options.tempDir, 'home');
@@ -228,358 +86,492 @@ export function buildPluginScriptSpawnEnv(options) {
228
86
  }
229
87
  return output;
230
88
  }
231
- export function buildLifecycleSpawnEnv(options) {
232
- return buildPluginScriptSpawnEnv(options);
89
+ export function resolvePluginScriptTimeoutMs(options) {
90
+ const value = options.cliTimeoutMs ?? options.manifestTimeoutMs ?? PLUGIN_SCRIPT_TIMEOUT_DEFAULT_MS;
91
+ if (!Number.isInteger(value) || value < PLUGIN_SCRIPT_TIMEOUT_MIN_MS || value > PLUGIN_SCRIPT_TIMEOUT_MAX_MS)
92
+ throw new Error('Plugin script timeout is outside the supported range.');
93
+ return value;
94
+ }
95
+ function collectScalarLeafTokens(value) {
96
+ if (typeof value === 'string')
97
+ return value === '' ? [] : [value];
98
+ if (typeof value === 'number' || typeof value === 'boolean')
99
+ return [String(value)];
100
+ if (value === null || typeof value !== 'object')
101
+ return [];
102
+ return Object.values(value).flatMap(collectScalarLeafTokens);
233
103
  }
234
104
  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);
105
+ return Object.entries(manifest.config?.fields ?? {}).flatMap(([key, field]) => {
106
+ const value = values[key];
107
+ if (value === undefined)
108
+ return [];
109
+ if (field.sensitive)
110
+ return collectScalarLeafTokens(value);
111
+ if (field.type !== 'object' || typeof value !== 'object')
112
+ return [];
113
+ return Object.entries(value).flatMap(([property, childValue]) => {
114
+ const child = field.properties?.[property]
115
+ ?? (field.additionalProperties === false ? undefined : field.additionalProperties);
116
+ return child?.sensitive ? collectScalarLeafTokens(childValue) : [];
117
+ });
118
+ });
242
119
  }
243
- export function redactPluginScriptOutput(value, sensitiveValues) {
244
- let output = redactString(value);
245
- for (const sensitiveValue of sensitiveValues) {
246
- output = output.split(sensitiveValue).join('[REDACTED]');
120
+ export function assertNoSensitiveConfigValues(value, sensitiveValues, message) {
121
+ const strings = [];
122
+ const visit = (entry) => {
123
+ if (typeof entry === 'string') {
124
+ strings.push(entry);
125
+ return;
126
+ }
127
+ if (Array.isArray(entry)) {
128
+ entry.forEach(visit);
129
+ return;
130
+ }
131
+ if (entry !== null && typeof entry === 'object') {
132
+ Object.entries(entry).forEach(([key, child]) => {
133
+ strings.push(key);
134
+ visit(child);
135
+ });
136
+ }
137
+ };
138
+ visit(value);
139
+ if (strings.some((entry) => containsBlockedSensitiveToken(entry, sensitiveValues))) {
140
+ throw new Error(message);
247
141
  }
248
- return output;
249
142
  }
250
- export function summarizePluginScriptOutput(value, sensitiveValues) {
251
- const normalized = value.trim().slice(0, 4000);
252
- return redactPluginScriptOutput(normalized, sensitiveValues);
143
+ export function assertNoSensitiveConfigInFiles(files, sensitiveValues, message) {
144
+ assertNoSensitiveConfigValues(Object.entries(files).map(([relativePath, content]) => ({
145
+ relativePath,
146
+ content: content.toString('utf8'),
147
+ })), sensitiveValues, message);
253
148
  }
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.');
149
+ function findSensitiveTokenMatches(value, sensitiveValue, startLimit) {
150
+ if (sensitiveValue === '')
151
+ return [];
152
+ const matches = [];
153
+ for (let start = value.indexOf(sensitiveValue); start >= 0 && start < startLimit; start = value.indexOf(sensitiveValue, start + 1)) {
154
+ matches.push({ start, end: start + sensitiveValue.length });
257
155
  }
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.');
260
- }
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(', ')}.`);
156
+ return matches;
157
+ }
158
+ function collectMergedSensitiveTokenMatches(value, sensitiveValues, startLimit) {
159
+ const matches = collectSensitiveTokenRepresentations(sensitiveValues)
160
+ .flatMap((representation) => findSensitiveTokenMatches(value, representation, startLimit))
161
+ .sort((left, right) => left.start - right.start || right.end - left.end);
162
+ const merged = [];
163
+ for (const match of matches) {
164
+ const previous = merged.at(-1);
165
+ if (previous && match.start < previous.end) {
166
+ previous.end = Math.max(previous.end, match.end);
167
+ }
168
+ else {
169
+ merged.push({ ...match });
279
170
  }
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
171
  }
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);
172
+ return merged;
173
+ }
174
+ function redactSensitiveTokenWindow(value, sensitiveValues, windowEnd) {
175
+ const matches = collectMergedSensitiveTokenMatches(value, sensitiveValues, windowEnd);
176
+ let output = '';
177
+ let offset = 0;
178
+ for (const match of matches) {
179
+ output += `${value.slice(offset, match.start)}[REDACTED]`;
180
+ offset = Math.min(match.end, windowEnd);
331
181
  }
332
- catch {
333
- // Best effort on non-POSIX filesystems.
182
+ return output + value.slice(offset, windowEnd);
183
+ }
184
+ export function redactPluginScriptOutput(value, sensitiveValues) {
185
+ return redactString(redactSensitiveTokenWindow(value, sensitiveValues, value.length));
186
+ }
187
+ export function truncatePluginScriptOutput(value) {
188
+ return value.slice(0, OUTPUT_LIMIT);
189
+ }
190
+ export function summarizePluginScriptOutput(value, sensitiveValues) {
191
+ return redactString(redactSensitiveTokenWindow(value, sensitiveValues, Math.min(value.length, OUTPUT_LIMIT))).trim();
192
+ }
193
+ function summarizePreApplyFailureOutput(value, roots, sensitiveValues) {
194
+ const summary = redactString(sanitizePreApplyErrorMessage(value, roots, sensitiveValues, Math.min(value.length, OUTPUT_LIMIT))).trim();
195
+ const lines = summary.split('\n').map((line) => line.trim()).filter(Boolean);
196
+ const includesRuntimeStack = lines.some((line) => line.startsWith('file://')
197
+ || line.startsWith('at ')
198
+ || /^Node\.js v/u.test(line));
199
+ if (!includesRuntimeStack)
200
+ return summary;
201
+ return lines.find((line) => /^(?:[A-Za-z]*Error|Error):/u.test(line)) ?? '';
202
+ }
203
+ function resolveOutputCaptureLimit(sensitiveValues) {
204
+ const maxSensitiveTokenLength = collectSensitiveTokenRepresentations(sensitiveValues).reduce((maximum, value) => Math.max(maximum, value.length), 0);
205
+ return OUTPUT_LIMIT + maxSensitiveTokenLength;
206
+ }
207
+ function privateRootVariants(root) {
208
+ const normalized = path.resolve(root);
209
+ return [...new Set([
210
+ normalized,
211
+ normalized.replaceAll('\\', '/'),
212
+ ...(normalized.startsWith('/var/') ? [`/private${normalized}`] : []),
213
+ ...(normalized.startsWith('/private/var/') ? [normalized.slice('/private'.length)] : []),
214
+ ])];
215
+ }
216
+ function sanitizePreApplyErrorMessage(value, roots, sensitiveValues, windowEnd = value.length) {
217
+ const matches = [
218
+ ...roots
219
+ .filter(({ root }) => root.trim() !== '')
220
+ .flatMap(({ root, replacement }) => privateRootVariants(root)
221
+ .flatMap((variant) => findSensitiveTokenMatches(value, variant, windowEnd)
222
+ .map((match) => ({ ...match, replacement })))),
223
+ ...collectSensitiveTokenRepresentations(sensitiveValues)
224
+ .flatMap((representation) => findSensitiveTokenMatches(value, representation, windowEnd)
225
+ .map((match) => ({ ...match, replacement: '[REDACTED]' }))),
226
+ ].sort((left, right) => left.start - right.start || right.end - left.end);
227
+ const merged = [];
228
+ for (const match of matches) {
229
+ const previous = merged.at(-1);
230
+ if (previous && match.start < previous.end) {
231
+ previous.end = Math.max(previous.end, match.end);
232
+ }
233
+ else {
234
+ merged.push({ ...match, replacement: match.replacement ?? '[REDACTED]' });
235
+ }
334
236
  }
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
- };
237
+ let output = '';
238
+ let offset = 0;
239
+ for (const match of merged) {
240
+ output += `${value.slice(offset, match.start)}${match.replacement}`;
241
+ offset = Math.min(match.end, windowEnd);
242
+ }
243
+ return output + value.slice(offset, windowEnd);
344
244
  }
345
- export const defaultPluginProcessRunner = {
346
- run(invocation, options) {
347
- return new Promise((resolve, reject) => {
245
+ export function createDefaultPluginProcessRunner(dependencies = {}) {
246
+ const platform = dependencies.platform ?? process.platform;
247
+ const spawnImpl = dependencies.spawn ?? spawn;
248
+ const observeProcessTreeImpl = dependencies.observeProcessTree ?? observeProcessTree;
249
+ const terminateProcessTreeImpl = dependencies.terminateProcessTree ?? terminateProcessTree;
250
+ const createWindowsJobInvocationImpl = dependencies.createWindowsJobInvocation;
251
+ const usesDefaultWindowsJob = !dependencies.spawn && !createWindowsJobInvocationImpl;
252
+ return {
253
+ async run(invocation, options) {
348
254
  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();
255
+ const windowsJobInvocation = platform === 'win32'
256
+ ? createWindowsJobInvocationImpl
257
+ ? createWindowsJobInvocationImpl(invocation.command, invocation.args)
258
+ : usesDefaultWindowsJob
259
+ ? createWindowsJobInvocation(invocation.command, invocation.args, {
260
+ helperPath: await resolveWindowsJobHelperPath(),
261
+ })
262
+ : undefined
263
+ : undefined;
264
+ return new Promise((resolve, reject) => {
265
+ options.signal?.throwIfAborted();
266
+ const marker = randomUUID();
267
+ // Keep long Catalog snapshot directories accessible to libuv's Windows cwd resolution.
268
+ const cwd = platform === 'win32' ? path.win32.toNamespacedPath(invocation.cwd) : invocation.cwd;
269
+ 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' });
270
+ let stdout = '';
271
+ let stderr = '';
272
+ let timedOut = false;
273
+ let aborted = false;
274
+ let settled = false;
275
+ let terminating = false;
276
+ let stdoutBytes = 0;
277
+ let stdoutTruncated = false;
278
+ let inputCompleted = child.stdin === null;
279
+ let inputError;
280
+ let childExited = false;
281
+ let cleanupCompleted = false;
282
+ let completedExitCode = null;
283
+ let completedSignal = null;
284
+ let windowsJobCloseTimer;
285
+ const outputCaptureLimit = resolveOutputCaptureLimit(options.sensitiveValues ?? []);
286
+ let observation;
287
+ if (!windowsJobInvocation && child.pid !== undefined)
288
+ observation = observeProcessTreeImpl(child.pid, marker);
289
+ const timer = setTimeout(() => { timedOut = true; terminate(); }, options.timeoutMs);
290
+ const abort = () => { aborted = true; terminate(); };
291
+ const cleanup = () => { clearTimeout(timer); if (windowsJobCloseTimer)
292
+ clearTimeout(windowsJobCloseTimer); options.signal?.removeEventListener('abort', abort); observation?.dispose(); };
293
+ const result = () => ({ exitCode: completedExitCode, signal: completedSignal, stdout, stderr, timedOut, ...(stdoutTruncated ? { stdoutTruncated: true } : {}) });
294
+ const settleImmediately = (error) => {
295
+ if (settled)
296
+ return;
297
+ settled = true;
298
+ cleanup();
299
+ reject(error);
300
+ };
301
+ const settleIfComplete = () => {
302
+ if (settled || !childExited || !cleanupCompleted || !inputCompleted)
303
+ return;
304
+ settled = true;
305
+ cleanup();
306
+ if (aborted) {
307
+ try {
308
+ options.signal?.throwIfAborted();
309
+ }
310
+ catch (error) {
311
+ reject(error);
312
+ return;
313
+ }
392
314
  }
393
- catch (error) {
394
- reject(error);
315
+ if (inputError && !(inputError.code === 'EPIPE'
316
+ && completedExitCode === 0
317
+ && completedSignal === null) && !timedOut && completedExitCode === 0 && completedSignal === null) {
318
+ reject(new PluginProcessInputError(inputError));
319
+ return;
320
+ }
321
+ resolve(result());
322
+ };
323
+ function terminate(requireConfirmedCleanup = false, allowUnobservedWindowsProcessOnNormalCompletion = false) {
324
+ if (settled || terminating)
325
+ return;
326
+ terminating = true;
327
+ clearTimeout(timer);
328
+ const direct = (signal) => { if (child.exitCode === null && child.signalCode === null)
329
+ child.kill(signal); };
330
+ if (windowsJobInvocation) {
331
+ try {
332
+ if (child.exitCode === null && child.signalCode === null && child.kill('SIGKILL') === false) {
333
+ throw new Error('Windows Job helper did not accept termination.');
334
+ }
335
+ }
336
+ catch (error) {
337
+ settleImmediately(error);
338
+ return;
339
+ }
340
+ windowsJobCloseTimer = setTimeout(() => settleImmediately(new Error('Windows Job helper exit could not be confirmed.')), WINDOWS_JOB_CLOSE_TIMEOUT_MS);
341
+ windowsJobCloseTimer.unref();
395
342
  return;
396
343
  }
344
+ const termination = child.pid === undefined
345
+ ? Promise.resolve(direct('SIGKILL'))
346
+ : terminateProcessTreeImpl(child.pid, direct, {}, {
347
+ observation,
348
+ requireConfirmedCleanup,
349
+ ...(allowUnobservedWindowsProcessOnNormalCompletion
350
+ ? { allowUnobservedWindowsProcessOnNormalCompletion: true }
351
+ : {}),
352
+ });
353
+ void Promise.resolve(termination).then(() => { cleanupCompleted = true; settleIfComplete(); }, (error) => settleImmediately(error));
397
354
  }
398
- resolve({
399
- exitCode: child.exitCode,
400
- signal: child.signalCode,
401
- stdout,
402
- stderr,
403
- timedOut,
355
+ child.stdout?.setEncoding('utf8');
356
+ child.stderr?.setEncoding('utf8');
357
+ child.stdout?.on('data', (chunk) => {
358
+ if (options.maxStdoutBytes === undefined) {
359
+ if (stdout.length < outputCaptureLimit)
360
+ stdout += chunk.slice(0, outputCaptureLimit - stdout.length);
361
+ return;
362
+ }
363
+ const bytes = Buffer.from(chunk, 'utf8');
364
+ const remaining = Math.max(0, options.maxStdoutBytes - stdoutBytes);
365
+ stdout += bytes.subarray(0, remaining).toString('utf8');
366
+ stdoutBytes += bytes.length;
367
+ if (stdoutBytes > options.maxStdoutBytes) {
368
+ stdoutTruncated = true;
369
+ terminate(true);
370
+ }
404
371
  });
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);
372
+ child.stderr?.on('data', (chunk) => { if (stderr.length < outputCaptureLimit)
373
+ stderr += chunk.slice(0, outputCaptureLimit - stderr.length); });
374
+ child.on('error', (error) => { if (!settled && (!terminating || windowsJobInvocation))
375
+ settleImmediately(error); });
376
+ const complete = (exitCode, signal) => {
377
+ if (settled)
378
+ return;
379
+ childExited = true;
380
+ completedExitCode = exitCode;
381
+ completedSignal = signal;
382
+ if (windowsJobInvocation) {
383
+ cleanupCompleted = true;
384
+ settleIfComplete();
385
+ return;
386
+ }
387
+ if (terminating) {
388
+ settleIfComplete();
389
+ return;
390
+ }
391
+ terminate(true, platform === 'win32' && exitCode === 0 && signal === null);
414
392
  };
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 });
393
+ child.on(platform === 'win32' ? 'close' : 'exit', complete);
394
+ if (child.stdin) {
395
+ const completeInput = (error) => {
396
+ if (error !== undefined && error !== null)
397
+ inputError = error;
398
+ inputCompleted = true;
399
+ settleIfComplete();
400
+ };
401
+ child.stdin.once('error', completeInput);
402
+ child.stdin.once('finish', completeInput);
403
+ try {
404
+ child.stdin.end(invocation.stdin ?? '', completeInput);
405
+ }
406
+ catch (error) {
407
+ completeInput(error);
408
+ }
409
+ }
410
+ options.signal?.addEventListener('abort', abort, { once: true });
411
+ if (options.signal?.aborted)
412
+ abort();
441
413
  });
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
414
  },
460
415
  };
461
- await context.reporter.event(commandEvent);
462
- await context.debugLogger.log(commandEvent);
463
416
  }
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
- });
417
+ export const defaultPluginProcessRunner = createDefaultPluginProcessRunner();
418
+ export async function runPreApplyScript(options) {
419
+ const declaration = options.plugin.manifest.scripts?.preApply;
420
+ if (!declaration)
421
+ return;
422
+ const awHome = resolveAwHome(options.context.env);
423
+ const codexHome = options.context.env.AW_CODEX_HOME || path.join(awHome, 'isolated-codex-home');
424
+ const claudeHome = options.context.env.AW_CLAUDE_HOME || path.join(awHome, 'isolated-claude-home');
425
+ let tempDir;
426
+ let interruptSignal;
427
+ let interruptReason;
428
+ let sensitiveValues = [];
429
+ let runnerCleanupConfirmed = false;
430
+ let removeInterruptListeners;
431
+ const privateRoots = () => [
432
+ ...(tempDir ? [
433
+ { root: path.join(tempDir, 'home'), replacement: '[temporary-home]' },
434
+ { root: path.join(tempDir, 'tmp'), replacement: '[temporary]' },
435
+ { root: tempDir, replacement: '[temporary]' },
436
+ ] : []),
437
+ { root: codexHome, replacement: '[codex-home]' },
438
+ { root: claudeHome, replacement: '[claude-home]' },
439
+ { root: awHome, replacement: '[aw-home]' },
440
+ { root: options.plugin.rootDir, replacement: '[plugin-root]' },
441
+ { root: options.cwd, replacement: '[project-root]' },
442
+ ];
509
443
  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}`);
444
+ const entryPath = await resolveBundledPluginFilePath({ bundleRoot: options.plugin.rootDir, pluginRelativePath: declaration.path, fieldName: 'preApply script' });
445
+ const effective = options.plugin.manifest.config?.fields
446
+ ? 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 })
447
+ : { values: {}, issues: [] };
448
+ if (effective.issues.length > 0)
449
+ throw new Error(`preApply config is invalid for ${options.plugin.manifest.name}.`);
450
+ const payload = {
451
+ schemaVersion: 1,
452
+ 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 },
453
+ target: { platform: options.platform, scope: options.scope, ...(options.scope === 'project' ? { projectRoot: options.cwd } : {}) },
454
+ config: { values: effective.values },
455
+ };
456
+ const tempRoot = assertTestWritablePath(path.join(awHome, 'tmp'), 'preApply temp root');
457
+ await fs.ensureDir(tempRoot);
458
+ tempDir = await fs.mkdtemp(path.join(tempRoot, 'plugin-pre-apply-'));
459
+ await preparePluginScriptDirectories(tempDir);
460
+ const env = buildPluginScriptSpawnEnv({ commandEnv: options.context.env, contextPath: '', tempDir, plugin: payload.plugin, event: 'preApply', platform: options.platform, scope: options.scope, bundleRoot: options.plugin.rootDir });
461
+ delete env.AW_PLUGIN_CONTEXT;
462
+ sensitiveValues = collectSensitivePluginConfigValues(options.plugin.manifest, effective.values);
463
+ const invocation = buildNodeScriptInvocation({ entryPath, cwd: options.plugin.rootDir, env, stdin: `${JSON.stringify(payload)}\n` });
464
+ const runOptions = { timeoutMs: resolvePluginScriptTimeoutMs({ cliTimeoutMs: options.scriptTimeoutMs, manifestTimeoutMs: declaration.timeoutMs }) };
465
+ const interruptController = new AbortController();
466
+ const handleInterrupt = (signal) => {
467
+ if (interruptSignal)
468
+ return;
469
+ interruptSignal = signal;
470
+ interruptReason = new Error(`preApply interrupted by ${signal}.`);
471
+ interruptController.abort(interruptReason);
472
+ };
473
+ const handleSigint = () => handleInterrupt('SIGINT');
474
+ const handleSigterm = () => handleInterrupt('SIGTERM');
475
+ process.on('SIGINT', handleSigint);
476
+ process.on('SIGTERM', handleSigterm);
477
+ removeInterruptListeners = () => {
478
+ process.removeListener('SIGINT', handleSigint);
479
+ process.removeListener('SIGTERM', handleSigterm);
480
+ };
481
+ let result;
482
+ try {
483
+ result = options.runner
484
+ ? await options.runner.run(invocation, { ...runOptions, signal: interruptController.signal })
485
+ : await defaultPluginProcessRunner.run(invocation, { ...runOptions, sensitiveValues, signal: interruptController.signal });
486
+ runnerCleanupConfirmed = true;
567
487
  }
488
+ catch (error) {
489
+ if (interruptSignal && error === interruptReason) {
490
+ runnerCleanupConfirmed = true;
491
+ }
492
+ else if (interruptSignal) {
493
+ throw new Error(`preApply process cleanup failed after ${interruptSignal}.`);
494
+ }
495
+ else if (error instanceof PluginProcessInputError) {
496
+ throw attachSafeOperationError(new Error('preApply input could not be sent.'), {
497
+ code: 'preApplyInputFailed',
498
+ stage: 'preApply',
499
+ safeMessage: 'The preApply context could not be sent to the process.',
500
+ });
501
+ }
502
+ else {
503
+ const causeCode = error && typeof error === 'object' && 'code' in error
504
+ && typeof error.code === 'string' ? error.code : undefined;
505
+ const safeCauseCode = causeCode === 'ENOENT' || causeCode === 'EACCES' || causeCode === 'EPERM'
506
+ ? causeCode : undefined;
507
+ throw attachSafeOperationError(new Error('preApply could not start.'), {
508
+ code: safeCauseCode === 'ENOENT' ? 'preApplyExecutableMissing' : 'preApplyStartFailed',
509
+ stage: 'preApply',
510
+ safeMessage: causeCode === 'ENOENT'
511
+ ? 'The preApply executable is not available.'
512
+ : 'The preApply process could not start.',
513
+ ...(safeCauseCode ? {
514
+ cause: { code: safeCauseCode, safeMessage: `Process start failed (${safeCauseCode}).` },
515
+ } : {}),
516
+ });
517
+ }
518
+ }
519
+ if (!result)
520
+ return;
521
+ const stdout = summarizePreApplyFailureOutput(result.stdout, privateRoots(), sensitiveValues);
522
+ const stderr = summarizePreApplyFailureOutput(result.stderr, privateRoots(), sensitiveValues);
523
+ const output = [
524
+ ...(stdout ? [`stdout: ${stdout}`] : []),
525
+ ...(stderr ? [`stderr: ${stderr}`] : []),
526
+ ].join('; ');
527
+ if (result.timedOut)
528
+ throw attachSafeOperationError(new Error(`preApply timed out.${output ? ` ${output}` : ''}`), {
529
+ code: 'preApplyTimedOut',
530
+ stage: 'preApply',
531
+ safeMessage: 'The preApply process timed out.',
532
+ exitCode: 124,
533
+ });
568
534
  if (result.exitCode !== 0) {
569
- throw new Error(`Lifecycle script "${options.event}" failed with exit code ${result.exitCode}. stderr: ${stderrSummary}`);
535
+ throw attachSafeOperationError(new Error(`preApply failed with exit code ${result.exitCode}.${output ? ` ${output}` : ''}`), {
536
+ code: 'preApplyExited',
537
+ stage: 'preApply',
538
+ safeMessage: 'The preApply process exited unsuccessfully.',
539
+ ...(result.exitCode === null ? {} : { exitCode: result.exitCode }),
540
+ });
570
541
  }
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
- };
542
+ }
543
+ catch (error) {
544
+ const message = error instanceof Error ? error.message : String(error);
545
+ const failure = new Error(redactString(sanitizePreApplyErrorMessage(message, privateRoots(), sensitiveValues)));
546
+ const diagnostic = error && typeof error === 'object' && 'operationDiagnostic' in error
547
+ ? error.operationDiagnostic
548
+ : undefined;
549
+ throw diagnostic ? Object.assign(failure, { operationDiagnostic: diagnostic }) : failure;
580
550
  }
581
551
  finally {
582
- await writtenContext.cleanup();
552
+ let tempCleanupError;
553
+ try {
554
+ if (tempDir)
555
+ await fs.remove(tempDir);
556
+ }
557
+ catch (error) {
558
+ tempCleanupError = error;
559
+ }
560
+ removeInterruptListeners?.();
561
+ if (interruptSignal) {
562
+ if (tempCleanupError) {
563
+ process.stderr.write(`preApply temporary directory cleanup failed after ${interruptSignal}.\n`);
564
+ process.exit(1);
565
+ }
566
+ if (!runnerCleanupConfirmed) {
567
+ process.stderr.write(`preApply process cleanup failed after ${interruptSignal}.\n`);
568
+ process.exit(1);
569
+ }
570
+ process.exit(interruptSignal === 'SIGINT' ? 130 : 143);
571
+ }
572
+ if (tempCleanupError) {
573
+ throw tempCleanupError;
574
+ }
583
575
  }
584
576
  }
585
577
  //# sourceMappingURL=plugin-scripts.js.map