@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
@@ -1,1228 +0,0 @@
1
- import { spawn } from 'node:child_process';
2
- import { createHash, randomUUID } from 'node:crypto';
3
- import path from 'node:path';
4
- import fs from 'fs-extra';
5
- import { assertProcessTreeInspectionAvailable, CODEX_EVAL_PROCESS_TREE_ID_ENV, createChildProcessTreeMonitor, createDirectChildProcessMonitor, processTreeCleanupIsUnconfirmed, releaseChildProcessHandles, scrubProcessTreeId, } from './codex-eval-process-tree.js';
6
- import { assertCodexEvalCanStartWork, applyCodexEvalProviderEnvironment, CODEX_EVAL_CLI_ENTRY_ENV, CODEX_EVAL_CLI_NODE_ENV, cleanCodexEvalRuntimeConfig, codexEvalRuntimeEvidence, createCodexEvalTemporaryRoot, materializeCodexEvalRuntimeHome, redactCodexEvalValue, registerCodexEvalSignalCleanup, } from './codex-eval-runtime-config.js';
7
- import { codexEvalConfigOverrides, codexEvalIsolationEvidence, inspectCodexEvalHostIsolation, validateCodexEvalConfigIsolation, validateCodexEvalRpcIsolation, } from './codex-eval-isolation.js';
8
- import { validatePluginEvalConversationCaseDocument, } from './plugin-eval-contract.js';
9
- const DEFAULT_OBSERVED_PROCESS_EVIDENCE = {
10
- mode: 'observed',
11
- inspectionAvailable: true,
12
- userAcknowledged: false,
13
- descendantCleanupGuaranteed: false,
14
- limitation: 'Process-tree inspection observes and cleans known descendants but does not guarantee descendant cleanup.',
15
- };
16
- async function createEvalTemporaryRoot(prefix, workRoot) {
17
- if (!workRoot)
18
- return createCodexEvalTemporaryRoot(prefix);
19
- await fs.ensureDir(workRoot);
20
- return createCodexEvalTemporaryRoot(prefix, {
21
- allocate: () => fs.mkdtemp(path.join(workRoot, prefix)),
22
- });
23
- }
24
- async function writeJsonAtomic(filePath, value) {
25
- await fs.ensureDir(path.dirname(filePath));
26
- const temporary = `${filePath}.${process.pid}.${randomUUID()}.tmp`;
27
- await fs.writeJson(temporary, value, { spaces: 2 });
28
- await fs.rename(temporary, filePath);
29
- }
30
- export async function settleAppServerProcessCleanup(options) {
31
- const diagnostics = await options.processTreeMonitor.terminate();
32
- const cleanupUnconfirmed = processTreeCleanupIsUnconfirmed(diagnostics);
33
- const closed = await options.waitForClose(1_000);
34
- if (!closed)
35
- releaseChildProcessHandles(options.child);
36
- if (cleanupUnconfirmed)
37
- throw new Error(diagnostics.join(' '));
38
- if (closed)
39
- return;
40
- throw new Error(`Could not confirm Codex app-server process-tree termination. ${diagnostics.join(' ')}`.trim());
41
- }
42
- const PASSTHROUGH_ENV = new Set([
43
- 'PATH',
44
- CODEX_EVAL_CLI_ENTRY_ENV,
45
- CODEX_EVAL_CLI_NODE_ENV,
46
- 'LANG',
47
- 'LC_ALL',
48
- 'HTTP_PROXY',
49
- 'HTTPS_PROXY',
50
- 'ALL_PROXY',
51
- 'NO_PROXY',
52
- 'SSL_CERT_FILE',
53
- 'SSL_CERT_DIR',
54
- 'NODE_EXTRA_CA_CERTS',
55
- ]);
56
- const CODEX_EVAL_APP_SERVER_OVERRIDES = [
57
- 'features.default_mode_request_user_input=true',
58
- ];
59
- function isRecord(value) {
60
- return typeof value === 'object' && value !== null && !Array.isArray(value);
61
- }
62
- function comparablePath(value) {
63
- const normalized = value.replaceAll('\\', '/');
64
- return process.platform === 'win32' ? normalized.toLowerCase() : normalized;
65
- }
66
- function containsForbiddenHostRoot(value, forbiddenHostRoots) {
67
- if (typeof value === 'string') {
68
- const candidate = comparablePath(value);
69
- return forbiddenHostRoots.some((root) => candidate.includes(comparablePath(root)));
70
- }
71
- if (Array.isArray(value)) {
72
- return value.some((entry) => containsForbiddenHostRoot(entry, forbiddenHostRoots));
73
- }
74
- if (isRecord(value)) {
75
- return Object.values(value).some((entry) => containsForbiddenHostRoot(entry, forbiddenHostRoots));
76
- }
77
- return false;
78
- }
79
- function commandInputContainsForbiddenHostRoot(value, forbiddenHostRoots) {
80
- const commandActions = Array.isArray(value.commandActions)
81
- ? value.commandActions.filter(isRecord).map((action) => ({
82
- command: action.command,
83
- path: action.path,
84
- }))
85
- : [];
86
- return containsForbiddenHostRoot([
87
- value.command,
88
- value.cwd,
89
- commandActions,
90
- ], forbiddenHostRoots);
91
- }
92
- function eventContainsForbiddenHostSourceInput(value, forbiddenHostRoots) {
93
- if (!isRecord(value))
94
- return false;
95
- const params = isRecord(value.params) ? value.params : {};
96
- if (value.method === 'item/commandExecution/requestApproval') {
97
- return commandInputContainsForbiddenHostRoot(params, forbiddenHostRoots)
98
- || containsForbiddenHostRoot(params.additionalPermissions, forbiddenHostRoots);
99
- }
100
- if (value.method === 'item/fileChange/requestApproval') {
101
- return containsForbiddenHostRoot(params.grantRoot, forbiddenHostRoots);
102
- }
103
- const item = isRecord(params.item) ? params.item : null;
104
- if (item?.type === 'commandExecution') {
105
- return commandInputContainsForbiddenHostRoot(item, forbiddenHostRoots);
106
- }
107
- if (item?.type === 'fileChange' && Array.isArray(item.changes)) {
108
- const paths = item.changes.filter(isRecord).map((change) => ({
109
- path: change.path,
110
- movePath: isRecord(change.kind) ? change.kind.move_path : undefined,
111
- }));
112
- return containsForbiddenHostRoot(paths, forbiddenHostRoots);
113
- }
114
- if (item?.type === 'imageView') {
115
- return containsForbiddenHostRoot(item.path, forbiddenHostRoots);
116
- }
117
- return false;
118
- }
119
- function eventTraceContainsForbiddenHostSourceInput(eventTrace, forbiddenHostRoots) {
120
- return eventTrace.some((event) => eventContainsForbiddenHostSourceInput(event, forbiddenHostRoots));
121
- }
122
- async function canonicalForbiddenHostRoots(roots) {
123
- const values = await Promise.all(roots.map(async (root) => {
124
- const resolved = path.resolve(root);
125
- const real = await fs.realpath(resolved).catch(() => resolved);
126
- return [resolved, real];
127
- }));
128
- return [...new Set(values.flat())];
129
- }
130
- function requestId(value) {
131
- const rawId = appServerRequestId(value);
132
- return rawId === undefined ? undefined : String(rawId);
133
- }
134
- function appServerRequestId(value) {
135
- return typeof value === 'string' || typeof value === 'number'
136
- ? value
137
- : undefined;
138
- }
139
- export function inspectAppServerConfigWarning(frame) {
140
- if (frame.method !== 'configWarning')
141
- return null;
142
- const params = isRecord(frame.params) ? frame.params : {};
143
- return typeof params.summary === 'string' ? params.summary : JSON.stringify(params);
144
- }
145
- function buildIsolatedEnv(sourceEnv, root, codexHome, runtime) {
146
- const env = {};
147
- for (const name of PASSTHROUGH_ENV) {
148
- if (sourceEnv[name] !== undefined) {
149
- env[name] = sourceEnv[name];
150
- }
151
- }
152
- const home = path.join(root, 'home');
153
- const temp = path.join(root, 'tmp');
154
- return applyCodexEvalProviderEnvironment({
155
- ...env,
156
- HOME: home,
157
- USERPROFILE: home,
158
- CODEX_HOME: codexHome,
159
- XDG_CACHE_HOME: path.join(root, 'xdg-cache'),
160
- XDG_CONFIG_HOME: path.join(root, 'xdg-config'),
161
- XDG_STATE_HOME: path.join(root, 'xdg-state'),
162
- TMPDIR: temp,
163
- TEMP: temp,
164
- TMP: temp,
165
- NO_COLOR: '1',
166
- }, runtime);
167
- }
168
- async function snapshotWorkspace(root) {
169
- const snapshot = new Map();
170
- async function visit(current) {
171
- const entries = await fs.readdir(current, { withFileTypes: true }).catch(() => []);
172
- for (const entry of entries) {
173
- const absolutePath = path.join(current, entry.name);
174
- const relativePath = path.relative(root, absolutePath).split(path.sep).join('/');
175
- if (entry.isDirectory()) {
176
- snapshot.set(`${relativePath}/`, 'directory');
177
- await visit(absolutePath);
178
- }
179
- else if (entry.isFile()) {
180
- snapshot.set(relativePath, createHash('sha256').update(await fs.readFile(absolutePath)).digest('hex'));
181
- }
182
- else if (entry.isSymbolicLink()) {
183
- snapshot.set(relativePath, `symlink:${await fs.readlink(absolutePath)}`);
184
- }
185
- else {
186
- snapshot.set(relativePath, 'other');
187
- }
188
- }
189
- }
190
- await visit(root);
191
- return snapshot;
192
- }
193
- function workspacePathMatchesPattern(relativePath, pattern) {
194
- if (pattern.endsWith('/**')) {
195
- const prefix = pattern.slice(0, -3);
196
- return relativePath === prefix || relativePath.startsWith(`${prefix}/`);
197
- }
198
- return relativePath === pattern;
199
- }
200
- function workspaceChangeIsAllowed(relativePath, patterns) {
201
- if (patterns.some((pattern) => workspacePathMatchesPattern(relativePath, pattern))) {
202
- return true;
203
- }
204
- if (!relativePath.endsWith('/'))
205
- return false;
206
- const directoryPath = relativePath.slice(0, -1);
207
- return patterns.some((pattern) => {
208
- const allowedPath = pattern.endsWith('/**') ? pattern.slice(0, -3) : pattern;
209
- return allowedPath.startsWith(`${directoryPath}/`);
210
- });
211
- }
212
- function jsonContains(actual, expected) {
213
- if (Array.isArray(expected)) {
214
- return Array.isArray(actual)
215
- && actual.length === expected.length
216
- && expected.every((entry, index) => jsonContains(actual[index], entry));
217
- }
218
- if (isRecord(expected)) {
219
- return isRecord(actual)
220
- && Object.entries(expected).every(([key, value]) => Object.prototype.hasOwnProperty.call(actual, key) && jsonContains(actual[key], value));
221
- }
222
- return Object.is(actual, expected);
223
- }
224
- async function readWorkspaceArtifactEvidence(workspaceRoot, expectation) {
225
- const absolutePath = path.join(workspaceRoot, ...expectation.path.split('/'));
226
- const stat = await fs.lstat(absolutePath).catch((error) => {
227
- if (error.code === 'ENOENT')
228
- return null;
229
- throw error;
230
- });
231
- if (!stat) {
232
- return { path: expectation.path, exists: false, kind: 'absent' };
233
- }
234
- if (!stat.isFile() || stat.isSymbolicLink()) {
235
- return { path: expectation.path, exists: true, kind: 'other' };
236
- }
237
- const content = await fs.readFile(absolutePath);
238
- const evidence = {
239
- path: expectation.path,
240
- exists: true,
241
- kind: 'file',
242
- bytes: content.length,
243
- sha256: createHash('sha256').update(content).digest('hex'),
244
- };
245
- if (content.length <= 64 * 1024 && !content.includes(0)) {
246
- evidence.text = content.toString('utf8');
247
- }
248
- return evidence;
249
- }
250
- function validateWorkspaceArtifact(expectation, evidence) {
251
- const diagnostics = [];
252
- if (evidence.exists !== expectation.exists) {
253
- diagnostics.push(`Artifact ${expectation.path} expected exists=${expectation.exists} but exists=${evidence.exists}.`);
254
- return diagnostics;
255
- }
256
- if (!expectation.exists)
257
- return diagnostics;
258
- if (evidence.kind !== 'file') {
259
- diagnostics.push(`Artifact ${expectation.path} must be a regular file.`);
260
- return diagnostics;
261
- }
262
- const text = evidence.text;
263
- if ((expectation.contains.length > 0 || expectation.notContains.length > 0 || expectation.json) && text === undefined) {
264
- diagnostics.push(`Artifact ${expectation.path} is binary or exceeds the 64 KiB assertion limit.`);
265
- return diagnostics;
266
- }
267
- for (const fragment of expectation.contains) {
268
- if (!text.includes(fragment)) {
269
- diagnostics.push(`Artifact ${expectation.path} is missing required text ${JSON.stringify(fragment)}.`);
270
- }
271
- }
272
- for (const fragment of expectation.notContains) {
273
- if (text.includes(fragment)) {
274
- diagnostics.push(`Artifact ${expectation.path} contains forbidden text ${JSON.stringify(fragment)}.`);
275
- }
276
- }
277
- if (expectation.json) {
278
- let parsed;
279
- try {
280
- parsed = JSON.parse(text);
281
- }
282
- catch (error) {
283
- diagnostics.push(`Artifact ${expectation.path} must contain valid JSON: ${error instanceof Error ? error.message : String(error)}.`);
284
- return diagnostics;
285
- }
286
- if (!jsonContains(parsed, expectation.json)) {
287
- diagnostics.push(`Artifact ${expectation.path} JSON does not contain the expected object subset.`);
288
- }
289
- }
290
- return diagnostics;
291
- }
292
- async function isolateWorkspaceSkills(options) {
293
- const skillsRoot = path.join(options.workspaceRoot, '.agents', 'skills');
294
- const allowed = new Set(options.skillNames);
295
- const entries = await fs.readdir(skillsRoot).catch((error) => {
296
- if (error.code === 'ENOENT')
297
- return [];
298
- throw error;
299
- });
300
- await Promise.all(entries.map(async (entry) => {
301
- if (allowed.has(entry))
302
- return;
303
- await fs.remove(path.join(skillsRoot, entry));
304
- }));
305
- const roots = options.skillNames.map((skillName) => path.join(skillsRoot, skillName));
306
- for (const root of roots) {
307
- if (!(await fs.pathExists(path.join(root, 'SKILL.md')))) {
308
- throw new Error(`Materialized eval Skill is missing: ${root}`);
309
- }
310
- }
311
- return roots;
312
- }
313
- function diffSnapshots(before, after) {
314
- const paths = new Set([...before.keys(), ...after.keys()]);
315
- return [...paths]
316
- .filter((entry) => before.get(entry) !== after.get(entry))
317
- .sort((left, right) => left.localeCompare(right));
318
- }
319
- export class EvalAppServerSession {
320
- process;
321
- processTreeId = randomUUID();
322
- processTreeMonitor;
323
- pending = new Map();
324
- handlers = new Set();
325
- failureHandlers = new Set();
326
- stdoutBuffer = '';
327
- stderrBuffer = '';
328
- nextId = 1;
329
- terminalError;
330
- closing = false;
331
- closed;
332
- resolveClosed;
333
- cleanupPromise;
334
- unregisterSignalCleanup = () => undefined;
335
- constructor(options) {
336
- assertCodexEvalCanStartWork();
337
- const processManagement = options.processManagement ?? DEFAULT_OBSERVED_PROCESS_EVIDENCE;
338
- const managed = processManagement.mode === 'managed' || processManagement.mode === 'observed';
339
- this.closed = new Promise((resolve) => {
340
- this.resolveClosed = resolve;
341
- });
342
- const args = [
343
- 'app-server',
344
- ...(options.isolation === 'strict' ? ['--strict-config'] : []),
345
- '--listen',
346
- 'stdio://',
347
- '--config',
348
- 'skills.include_instructions=true',
349
- '--config',
350
- `shell_environment_policy.exclude=${JSON.stringify([
351
- 'CODEX_HOME',
352
- ...options.sensitiveEnvironmentNames,
353
- ])}`,
354
- '--config',
355
- `model_provider=${JSON.stringify(options.modelProvider)}`,
356
- ];
357
- for (const override of codexEvalConfigOverrides(options.isolation)) {
358
- args.push('--config', override);
359
- }
360
- for (const override of CODEX_EVAL_APP_SERVER_OVERRIDES) {
361
- args.push('--config', override);
362
- }
363
- for (const override of options.configOverrides ?? []) {
364
- args.push('--config', override);
365
- }
366
- this.process = spawn(options.codexBin, args, {
367
- cwd: options.cwd,
368
- env: managed
369
- ? { ...options.env, [CODEX_EVAL_PROCESS_TREE_ID_ENV]: this.processTreeId }
370
- : { ...options.env },
371
- shell: false,
372
- detached: managed && process.platform !== 'win32',
373
- stdio: ['pipe', 'pipe', 'pipe'],
374
- });
375
- this.processTreeMonitor = managed
376
- ? createChildProcessTreeMonitor(this.process, { treeId: this.processTreeId })
377
- : createDirectChildProcessMonitor(this.process);
378
- this.process.stdout.setEncoding?.('utf8');
379
- this.process.stderr.setEncoding?.('utf8');
380
- this.process.stdout.on('data', (chunk) => {
381
- this.handleChunk((typeof chunk === 'string' ? chunk : chunk.toString('utf8'))
382
- .replaceAll(this.processTreeId, '[process-tree-id]'));
383
- });
384
- this.process.stderr.on('data', (chunk) => {
385
- this.stderrBuffer = `${this.stderrBuffer}${String(chunk)}`
386
- .replaceAll(this.processTreeId, '[process-tree-id]')
387
- .slice(-32_000);
388
- });
389
- this.process.once('error', (error) => this.fail(error));
390
- this.process.once('close', (code, signal) => {
391
- this.resolveClosed?.();
392
- if (!this.closing) {
393
- this.fail(new Error(`codex app-server exited early (code=${code}, signal=${signal}).`));
394
- }
395
- });
396
- this.unregisterSignalCleanup = registerCodexEvalSignalCleanup(() => this.cleanup());
397
- }
398
- onFrame(handler) {
399
- this.handlers.add(handler);
400
- return () => this.handlers.delete(handler);
401
- }
402
- onFailure(handler) {
403
- this.failureHandlers.add(handler);
404
- if (this.terminalError) {
405
- handler(this.terminalError);
406
- }
407
- return () => this.failureHandlers.delete(handler);
408
- }
409
- async initialize() {
410
- await this.sendRequest('initialize', {
411
- clientInfo: {
412
- name: 'aw-plugin-eval',
413
- title: 'Agent Workflows Plugin Eval',
414
- version: '1',
415
- },
416
- capabilities: {
417
- experimentalApi: true,
418
- requestAttestation: false,
419
- },
420
- });
421
- await this.write({ method: 'initialized' });
422
- }
423
- async sendRequest(method, params, timeoutMs = 30_000) {
424
- if (this.terminalError) {
425
- throw this.terminalError;
426
- }
427
- const id = String(this.nextId++);
428
- return new Promise((resolve, reject) => {
429
- const timer = setTimeout(() => {
430
- this.pending.delete(id);
431
- reject(new Error(`Timed out waiting for app-server method ${method}.`));
432
- }, timeoutMs);
433
- this.pending.set(id, { method, resolve, reject, timer });
434
- void this.write({ id, method, params }).catch((error) => {
435
- clearTimeout(timer);
436
- this.pending.delete(id);
437
- reject(error instanceof Error ? error : new Error(String(error)));
438
- });
439
- });
440
- }
441
- async respond(id, result) {
442
- await this.write({ id, result });
443
- }
444
- async cleanup() {
445
- this.cleanupPromise ??= this.cleanupProcess();
446
- return this.cleanupPromise;
447
- }
448
- async cleanupProcess() {
449
- this.closing = true;
450
- for (const pending of this.pending.values()) {
451
- clearTimeout(pending.timer);
452
- pending.reject(new Error('app-server session closed.'));
453
- }
454
- this.pending.clear();
455
- try {
456
- await settleAppServerProcessCleanup({
457
- child: this.process,
458
- processTreeMonitor: this.processTreeMonitor,
459
- waitForClose: (timeoutMs) => this.waitForClose(timeoutMs),
460
- });
461
- }
462
- finally {
463
- this.unregisterSignalCleanup();
464
- }
465
- }
466
- get stderr() {
467
- return this.stderrBuffer.replaceAll(this.processTreeId, '[process-tree-id]');
468
- }
469
- scrub(value) {
470
- return scrubProcessTreeId(value, this.processTreeId);
471
- }
472
- async waitForClose(timeoutMs) {
473
- let timer;
474
- const result = await Promise.race([
475
- this.closed.then(() => true),
476
- new Promise((resolve) => {
477
- timer = setTimeout(() => resolve(false), timeoutMs);
478
- }),
479
- ]);
480
- if (timer)
481
- clearTimeout(timer);
482
- return result;
483
- }
484
- async write(frame) {
485
- if (!this.process.stdin) {
486
- throw new Error('codex app-server stdin is unavailable.');
487
- }
488
- await new Promise((resolve, reject) => {
489
- this.process.stdin.write(`${JSON.stringify(frame)}\n`, (error) => {
490
- if (error) {
491
- reject(error);
492
- }
493
- else {
494
- resolve();
495
- }
496
- });
497
- });
498
- }
499
- handleChunk(chunk) {
500
- this.stdoutBuffer += chunk;
501
- let newlineIndex = this.stdoutBuffer.indexOf('\n');
502
- while (newlineIndex >= 0) {
503
- const line = this.stdoutBuffer.slice(0, newlineIndex).replace(/\r$/u, '');
504
- this.stdoutBuffer = this.stdoutBuffer.slice(newlineIndex + 1);
505
- this.handleLine(line);
506
- newlineIndex = this.stdoutBuffer.indexOf('\n');
507
- }
508
- }
509
- handleLine(line) {
510
- if (!line.trim()) {
511
- return;
512
- }
513
- let parsed;
514
- try {
515
- parsed = JSON.parse(line);
516
- }
517
- catch {
518
- this.fail(new Error(`Invalid app-server JSONL: ${line.slice(0, 240)}`));
519
- return;
520
- }
521
- if (!isRecord(parsed)) {
522
- return;
523
- }
524
- const id = requestId(parsed.id);
525
- if (id && ('result' in parsed || 'error' in parsed)) {
526
- const pending = this.pending.get(id);
527
- if (!pending) {
528
- return;
529
- }
530
- clearTimeout(pending.timer);
531
- this.pending.delete(id);
532
- if ('error' in parsed) {
533
- pending.reject(new Error(`app-server ${pending.method} failed: ${JSON.stringify(parsed.error)}`));
534
- }
535
- else {
536
- pending.resolve(parsed.result);
537
- }
538
- return;
539
- }
540
- for (const handler of this.handlers) {
541
- void Promise.resolve(handler(parsed)).catch((error) => this.fail(error instanceof Error ? error : new Error(String(error))));
542
- }
543
- }
544
- fail(error) {
545
- if (this.terminalError) {
546
- return;
547
- }
548
- this.terminalError = error;
549
- for (const pending of this.pending.values()) {
550
- clearTimeout(pending.timer);
551
- pending.reject(error);
552
- }
553
- this.pending.clear();
554
- for (const handler of this.failureHandlers) {
555
- handler(error);
556
- }
557
- }
558
- }
559
- async function collectStrictIsolationEvidence(options) {
560
- const [config, requirements] = await Promise.all([
561
- options.session.sendRequest('config/read', {
562
- includeLayers: true,
563
- cwd: options.workspaceRoot,
564
- }),
565
- options.session.sendRequest('configRequirements/read', {}),
566
- ]);
567
- validateCodexEvalConfigIsolation({
568
- config,
569
- requirements,
570
- codexHome: options.codexHome,
571
- workspaceRoot: options.workspaceRoot,
572
- });
573
- const [skills, mcpServers] = await Promise.all([
574
- options.session.sendRequest('skills/list', {
575
- cwds: [options.workspaceRoot],
576
- forceReload: true,
577
- }),
578
- options.session.sendRequest('mcpServerStatus/list', {
579
- cursor: null,
580
- limit: 100,
581
- detail: 'toolsAndAuthOnly',
582
- threadId: null,
583
- }),
584
- ]);
585
- return validateCodexEvalRpcIsolation({
586
- config,
587
- requirements,
588
- skills,
589
- mcpServers,
590
- codexHome: options.codexHome,
591
- workspaceRoot: options.workspaceRoot,
592
- allowedSkillRoots: options.allowedSkillRoots,
593
- });
594
- }
595
- function normalizeScriptedReply(value, label) {
596
- if (typeof value === 'string') {
597
- return {
598
- expectedQuestionCount: 1,
599
- answersByIndex: [value],
600
- unexpectedQuestionAnswer: '我暂时不知道,请先处理已经回答的部分。',
601
- };
602
- }
603
- if (!isRecord(value)) {
604
- throw new Error(`${label} must be a string or object.`);
605
- }
606
- if (!Array.isArray(value.answers_by_index) || value.answers_by_index.some((entry) => typeof entry !== 'string')) {
607
- throw new Error(`${label}.answers_by_index must be an array of strings.`);
608
- }
609
- const expectedQuestionCount = value.expected_question_count;
610
- if (expectedQuestionCount !== undefined &&
611
- (!Number.isInteger(expectedQuestionCount) || expectedQuestionCount < 0)) {
612
- throw new Error(`${label}.expected_question_count must be a non-negative integer.`);
613
- }
614
- const fallback = value.unexpected_question_answer;
615
- if (typeof fallback !== 'string' || fallback.trim() === '') {
616
- throw new Error(`${label}.unexpected_question_answer must be a non-empty string.`);
617
- }
618
- return {
619
- ...(expectedQuestionCount === undefined
620
- ? {}
621
- : { expectedQuestionCount: expectedQuestionCount }),
622
- answersByIndex: value.answers_by_index,
623
- unexpectedQuestionAnswer: fallback,
624
- };
625
- }
626
- async function readConversationCases(casesPath, expectedSkill) {
627
- const raw = await fs.readJson(casesPath);
628
- const evals = validatePluginEvalConversationCaseDocument(raw, expectedSkill);
629
- return evals.map((value, index) => {
630
- const review = isRecord(value.review) ? value.review : {};
631
- if (typeof value.id !== 'string' ||
632
- typeof value.prompt !== 'string' ||
633
- !Array.isArray(value.scripted_replies) ||
634
- typeof value.expected_output !== 'string' ||
635
- !Array.isArray(review.checks) ||
636
- review.checks.some((entry) => typeof entry !== 'string')) {
637
- throw new Error(`evals[${index}] has an invalid behavior case shape.`);
638
- }
639
- return {
640
- id: value.id.trim(),
641
- prompt: value.prompt,
642
- scriptedReplies: value.scripted_replies.map((entry, replyIndex) => normalizeScriptedReply(entry, `evals[${index}].scripted_replies[${replyIndex}]`)),
643
- expectedOutput: value.expected_output,
644
- checks: review.checks,
645
- workspaceFiles: isRecord(value.workspace_files)
646
- ? Object.fromEntries(Object.entries(value.workspace_files).map(([relativePath, content]) => [
647
- relativePath,
648
- content,
649
- ]))
650
- : {},
651
- workspaceUnchanged: review.workspace_unchanged === true,
652
- sandbox: value.sandbox === 'workspace-write' ? 'workspace-write' : 'read-only',
653
- allowedWorkspaceChanges: Array.isArray(review.allowed_workspace_changes)
654
- ? review.allowed_workspace_changes
655
- : [],
656
- artifacts: Array.isArray(review.artifacts)
657
- ? review.artifacts.map((artifact) => {
658
- const row = artifact;
659
- return {
660
- path: row.path,
661
- exists: row.exists !== false,
662
- contains: Array.isArray(row.contains) ? row.contains : [],
663
- notContains: Array.isArray(row.not_contains) ? row.not_contains : [],
664
- ...(isRecord(row.json) ? { json: row.json } : {}),
665
- };
666
- })
667
- : [],
668
- };
669
- });
670
- }
671
- async function materializeConversationWorkspaceFiles(workspaceRoot, workspaceFiles) {
672
- for (const [relativePath, content] of Object.entries(workspaceFiles)) {
673
- const segments = relativePath.split('/');
674
- const fileName = segments.pop();
675
- let parent = workspaceRoot;
676
- for (const segment of segments) {
677
- parent = path.join(parent, segment);
678
- if (await fs.pathExists(parent)) {
679
- const stat = await fs.lstat(parent);
680
- if (!stat.isDirectory() || stat.isSymbolicLink()) {
681
- throw new Error(`Conversation workspace file has an unsafe parent path: ${relativePath}`);
682
- }
683
- }
684
- else {
685
- await fs.mkdir(parent);
686
- }
687
- }
688
- const target = path.join(parent, fileName);
689
- if (await fs.pathExists(target)) {
690
- throw new Error(`Conversation workspace file conflicts with materialized subject: ${relativePath}`);
691
- }
692
- await fs.writeFile(target, content, 'utf8');
693
- }
694
- }
695
- export function extractAppServerThreadId(result) {
696
- if (!isRecord(result) || !isRecord(result.thread) || typeof result.thread.id !== 'string') {
697
- throw new Error('app-server thread/start response is missing thread.id.');
698
- }
699
- return result.thread.id;
700
- }
701
- async function runConversationOnce(options) {
702
- assertCodexEvalCanStartWork();
703
- const temporaryRoot = await createEvalTemporaryRoot('conversation-', options.forbiddenHostRoots.length > 0 ? undefined : options.workRoot);
704
- const runRoot = temporaryRoot.root;
705
- const workspaceRoot = path.join(runRoot, 'project');
706
- const codexHome = path.join(runRoot, 'codex-home');
707
- const diagnostics = [];
708
- const scriptedReplyMismatches = [];
709
- const questions = [];
710
- const finalMessages = [];
711
- const eventTrace = [];
712
- let usage = null;
713
- let isolationEvidence = null;
714
- let session;
715
- let removeHandler;
716
- let removeFailureHandler;
717
- let turnTimer;
718
- const startedAt = Date.now();
719
- try {
720
- await fs.copy(options.sourceProjectRoot, workspaceRoot, { dereference: false });
721
- await materializeConversationWorkspaceFiles(workspaceRoot, options.evalCase.workspaceFiles);
722
- let allowedSkillRoots = [];
723
- if (options.isolation === 'strict') {
724
- const visibleSkills = options.variant === 'with_skill'
725
- ? options.skillNames
726
- : options.skillNames.filter((skillName) => skillName !== options.skillName);
727
- allowedSkillRoots = await isolateWorkspaceSkills({
728
- workspaceRoot,
729
- skillNames: visibleSkills,
730
- });
731
- }
732
- else if (options.variant === 'without_skill') {
733
- await fs.remove(path.join(workspaceRoot, '.agents', 'skills', options.skillName));
734
- }
735
- const env = buildIsolatedEnv(options.sourceEnv, runRoot, codexHome, options.codexRuntime);
736
- await Promise.all([
737
- fs.ensureDir(env.HOME),
738
- fs.ensureDir(env.TMPDIR),
739
- materializeCodexEvalRuntimeHome(options.codexRuntime, codexHome, {
740
- trustedProject: workspaceRoot,
741
- }),
742
- ]);
743
- const before = await snapshotWorkspace(workspaceRoot);
744
- if (options.processManagement.mode === 'managed' ||
745
- options.processManagement.mode === 'observed') {
746
- await assertProcessTreeInspectionAvailable();
747
- }
748
- assertCodexEvalCanStartWork();
749
- session = new EvalAppServerSession({
750
- codexBin: options.codexBin,
751
- cwd: workspaceRoot,
752
- env,
753
- modelProvider: options.codexRuntime.modelProvider,
754
- sensitiveEnvironmentNames: options.codexRuntime.sensitiveEnvironmentNames,
755
- isolation: options.isolation,
756
- processManagement: options.processManagement,
757
- });
758
- let replyStep = 0;
759
- let turnResolve;
760
- let turnReject;
761
- const turnDone = new Promise((resolve, reject) => {
762
- turnResolve = resolve;
763
- turnReject = reject;
764
- });
765
- void turnDone.catch(() => undefined);
766
- removeFailureHandler = session.onFailure((error) => turnReject?.(error));
767
- turnTimer = setTimeout(() => {
768
- turnReject?.(new Error(`conversation turn timed out after ${options.timeoutMs}ms.`));
769
- }, options.timeoutMs);
770
- removeHandler = session.onFrame(async (frame) => {
771
- const method = typeof frame.method === 'string' ? frame.method : '';
772
- const params = isRecord(frame.params) ? frame.params : {};
773
- if (!method.startsWith('remoteControl/') && !method.startsWith('account/')) {
774
- eventTrace.push(frame);
775
- }
776
- const configWarning = inspectAppServerConfigWarning(frame);
777
- if (options.isolation === 'strict' && configWarning) {
778
- throw new Error(`Strict Codex eval received a config warning: ${configWarning}`);
779
- }
780
- if (method === 'item/tool/requestUserInput') {
781
- const responseId = appServerRequestId(frame.id);
782
- const id = requestId(responseId);
783
- if (!id || responseId === undefined || !Array.isArray(params.questions)) {
784
- throw new Error('requestUserInput frame is missing id or questions.');
785
- }
786
- const scripted = options.evalCase.scriptedReplies[replyStep];
787
- if (!scripted) {
788
- scriptedReplyMismatches.push(`Unexpected request_user_input step ${replyStep + 1}.`);
789
- }
790
- const fallback = scripted?.unexpectedQuestionAnswer ?? '请停止提问并交还控制。';
791
- const normalizedQuestions = params.questions.map((value, index) => {
792
- const row = isRecord(value) ? value : {};
793
- return {
794
- id: typeof row.id === 'string' ? row.id : `question-${index}`,
795
- header: typeof row.header === 'string' ? row.header : '',
796
- question: typeof row.question === 'string' ? row.question : '',
797
- options: Array.isArray(row.options)
798
- ? row.options.filter(isRecord).map((option) => ({
799
- label: typeof option.label === 'string' ? option.label : '',
800
- description: typeof option.description === 'string' ? option.description : '',
801
- }))
802
- : null,
803
- };
804
- });
805
- if (scripted?.expectedQuestionCount !== undefined &&
806
- scripted.expectedQuestionCount !== normalizedQuestions.length) {
807
- scriptedReplyMismatches.push(`request_user_input step ${replyStep + 1} expected ${scripted.expectedQuestionCount} questions but received ${normalizedQuestions.length}.`);
808
- }
809
- const answers = Object.fromEntries(normalizedQuestions.map((question, index) => [
810
- question.id,
811
- [scripted?.answersByIndex[index] ?? fallback],
812
- ]));
813
- questions.push({
814
- requestId: id,
815
- step: replyStep,
816
- questions: normalizedQuestions,
817
- answers,
818
- });
819
- replyStep += 1;
820
- await session.respond(responseId, {
821
- answers: Object.fromEntries(Object.entries(answers).map(([key, value]) => [key, { answers: value }])),
822
- });
823
- return;
824
- }
825
- if (method === 'item/completed' && isRecord(params.item)) {
826
- const item = params.item;
827
- if (item.type === 'agentMessage' &&
828
- item.phase === 'final_answer' &&
829
- typeof item.text === 'string') {
830
- finalMessages.push(item.text);
831
- }
832
- }
833
- if (method === 'thread/tokenUsage/updated') {
834
- usage = params.tokenUsage ?? usage;
835
- }
836
- if (method === 'turn/completed') {
837
- const turn = isRecord(params.turn) ? params.turn : {};
838
- turnResolve?.({ complete: turn.status === 'completed' });
839
- }
840
- if (method === 'error') {
841
- turnReject?.(new Error(`app-server error: ${JSON.stringify(params)}`));
842
- }
843
- });
844
- await session.initialize();
845
- if (options.isolation === 'strict') {
846
- isolationEvidence = await collectStrictIsolationEvidence({
847
- session,
848
- workspaceRoot,
849
- codexHome,
850
- allowedSkillRoots,
851
- });
852
- }
853
- const sandboxPolicy = options.evalCase.sandbox === 'workspace-write'
854
- ? {
855
- type: 'workspaceWrite',
856
- writableRoots: [workspaceRoot],
857
- networkAccess: false,
858
- excludeTmpdirEnvVar: false,
859
- excludeSlashTmp: true,
860
- }
861
- : { type: 'readOnly', networkAccess: true };
862
- const threadResult = await session.sendRequest('thread/start', {
863
- cwd: workspaceRoot,
864
- approvalPolicy: 'never',
865
- sandbox: options.evalCase.sandbox,
866
- ephemeral: false,
867
- ...(options.model ? { model: options.model } : {}),
868
- });
869
- const threadId = extractAppServerThreadId(threadResult);
870
- await session.sendRequest('turn/start', {
871
- threadId,
872
- input: [{ type: 'text', text: options.evalCase.prompt, text_elements: [] }],
873
- cwd: workspaceRoot,
874
- approvalPolicy: 'never',
875
- sandboxPolicy,
876
- ...(options.model ? { model: options.model } : {}),
877
- });
878
- const completed = await turnDone;
879
- clearTimeout(turnTimer);
880
- turnTimer = undefined;
881
- removeHandler();
882
- removeHandler = undefined;
883
- removeFailureHandler();
884
- removeFailureHandler = undefined;
885
- const after = await snapshotWorkspace(workspaceRoot);
886
- const workspaceChanges = diffSnapshots(before, after);
887
- const workspaceArtifacts = await Promise.all(options.evalCase.artifacts.map((expectation) => readWorkspaceArtifactEvidence(workspaceRoot, expectation)));
888
- const hostSourceAccessAbsent = options.forbiddenHostRoots.length > 0
889
- ? !eventTraceContainsForbiddenHostSourceInput(eventTrace, options.forbiddenHostRoots)
890
- : null;
891
- if (hostSourceAccessAbsent === false) {
892
- diagnostics.push('Codex eval accessed a forbidden host source root.');
893
- }
894
- if (replyStep < options.evalCase.scriptedReplies.length) {
895
- scriptedReplyMismatches.push(`${options.evalCase.scriptedReplies.length - replyStep} scripted reply step(s) were unused.`);
896
- }
897
- if (options.evalCase.workspaceUnchanged && workspaceChanges.length > 0) {
898
- diagnostics.push(`Workspace changed: ${workspaceChanges.join(', ')}`);
899
- }
900
- if (options.evalCase.sandbox === 'workspace-write') {
901
- const unexpectedChanges = workspaceChanges.filter((relativePath) => !workspaceChangeIsAllowed(relativePath, options.evalCase.allowedWorkspaceChanges));
902
- if (unexpectedChanges.length > 0) {
903
- diagnostics.push(`Workspace changed outside the allowed paths: ${unexpectedChanges.join(', ')}`);
904
- }
905
- }
906
- if (options.variant === 'with_skill') {
907
- diagnostics.push(...scriptedReplyMismatches);
908
- for (const [index, expectation] of options.evalCase.artifacts.entries()) {
909
- diagnostics.push(...validateWorkspaceArtifact(expectation, workspaceArtifacts[index]));
910
- }
911
- }
912
- return session.scrub({
913
- variant: options.variant,
914
- complete: completed.complete,
915
- mechanicalPassed: completed.complete && diagnostics.length === 0,
916
- hostSourceAccessAbsent,
917
- scriptedReplyMismatches,
918
- durationMs: Date.now() - startedAt,
919
- questions,
920
- finalMessages,
921
- usage,
922
- workspaceChanges,
923
- workspaceArtifacts,
924
- diagnostics,
925
- eventTrace,
926
- isolation: isolationEvidence,
927
- ...(session.stderr.trim() ? { stderr: session.stderr.trim() } : {}),
928
- });
929
- }
930
- catch (error) {
931
- const hostSourceAccessAbsent = options.forbiddenHostRoots.length > 0 &&
932
- eventTraceContainsForbiddenHostSourceInput(eventTrace, options.forbiddenHostRoots)
933
- ? false
934
- : null;
935
- const evidence = {
936
- variant: options.variant,
937
- complete: false,
938
- mechanicalPassed: false,
939
- hostSourceAccessAbsent,
940
- scriptedReplyMismatches,
941
- durationMs: Date.now() - startedAt,
942
- questions,
943
- finalMessages,
944
- usage,
945
- workspaceChanges: [],
946
- workspaceArtifacts: [],
947
- diagnostics: [error instanceof Error ? error.stack ?? error.message : String(error)],
948
- eventTrace,
949
- isolation: isolationEvidence,
950
- ...(session?.stderr.trim() ? { stderr: session.stderr.trim() } : {}),
951
- };
952
- return session ? session.scrub(evidence) : evidence;
953
- }
954
- finally {
955
- if (turnTimer) {
956
- clearTimeout(turnTimer);
957
- }
958
- removeHandler?.();
959
- removeFailureHandler?.();
960
- try {
961
- await session?.cleanup();
962
- }
963
- finally {
964
- await temporaryRoot.cleanup();
965
- }
966
- }
967
- }
968
- export async function runCodexEvalIsolationProbe(options) {
969
- assertCodexEvalCanStartWork();
970
- const sourceEnv = options.sourceEnv ?? process.env;
971
- const processManagement = options.processManagement ?? DEFAULT_OBSERVED_PROCESS_EVIDENCE;
972
- const temporaryRoot = await createEvalTemporaryRoot('isolation-probe-');
973
- const workspaceRoot = path.join(temporaryRoot.root, 'project');
974
- const codexHome = path.join(temporaryRoot.root, 'codex-home');
975
- let session;
976
- try {
977
- await fs.copy(options.subjectRoot, workspaceRoot, { dereference: false });
978
- const allowedSkillRoots = await isolateWorkspaceSkills({
979
- workspaceRoot,
980
- skillNames: options.skillNames ?? [options.skillName],
981
- });
982
- const env = buildIsolatedEnv(sourceEnv, temporaryRoot.root, codexHome, options.codexRuntime);
983
- await Promise.all([
984
- fs.ensureDir(env.HOME),
985
- fs.ensureDir(env.TMPDIR),
986
- materializeCodexEvalRuntimeHome(options.codexRuntime, codexHome, {
987
- trustedProject: workspaceRoot,
988
- }),
989
- ]);
990
- if (processManagement.mode === 'managed' || processManagement.mode === 'observed') {
991
- await assertProcessTreeInspectionAvailable();
992
- }
993
- session = new EvalAppServerSession({
994
- codexBin: options.codexBin,
995
- cwd: workspaceRoot,
996
- env,
997
- modelProvider: options.codexRuntime.modelProvider,
998
- sensitiveEnvironmentNames: options.codexRuntime.sensitiveEnvironmentNames,
999
- isolation: 'strict',
1000
- processManagement,
1001
- });
1002
- await session.initialize();
1003
- return await collectStrictIsolationEvidence({
1004
- session,
1005
- workspaceRoot,
1006
- codexHome,
1007
- allowedSkillRoots,
1008
- });
1009
- }
1010
- finally {
1011
- try {
1012
- await session?.cleanup();
1013
- }
1014
- finally {
1015
- await temporaryRoot.cleanup();
1016
- }
1017
- }
1018
- }
1019
- export async function runCodexConversationSuite(options) {
1020
- const skillNames = options.skillNames ?? [options.skillName];
1021
- const sourceEnv = options.sourceEnv ?? process.env;
1022
- const codexRuntime = options.codexRuntime ?? cleanCodexEvalRuntimeConfig(sourceEnv, options.model);
1023
- const model = options.model ?? codexRuntime.model ?? undefined;
1024
- const isolation = options.isolation ?? 'standard';
1025
- const processManagement = options.processManagement ?? DEFAULT_OBSERVED_PROCESS_EVIDENCE;
1026
- const forbiddenHostRoots = await canonicalForbiddenHostRoots([options.subjectRoot, ...(options.forbiddenHostRoots ?? [])]);
1027
- let cases = await readConversationCases(options.casesPath, options.skillName);
1028
- if (options.caseId && options.caseIds) {
1029
- throw new Error('runCodexConversationSuite cannot combine caseId and caseIds.');
1030
- }
1031
- if (options.caseId) {
1032
- cases = cases.filter((entry) => entry.id === options.caseId);
1033
- if (cases.length === 0) {
1034
- throw new Error(`Unknown conversation case: ${options.caseId}`);
1035
- }
1036
- }
1037
- if (options.caseIds) {
1038
- const requested = new Set(options.caseIds);
1039
- cases = cases.filter((entry) => requested.has(entry.id));
1040
- const found = new Set(cases.map((entry) => entry.id));
1041
- const missing = [...requested].filter((id) => !found.has(id));
1042
- if (missing.length > 0) {
1043
- throw new Error(`Unknown conversation cases: ${missing.join(', ')}`);
1044
- }
1045
- }
1046
- let hostIsolation = null;
1047
- try {
1048
- if (isolation === 'strict') {
1049
- hostIsolation = await inspectCodexEvalHostIsolation({ sourceEnv });
1050
- }
1051
- }
1052
- catch (error) {
1053
- const diagnostic = error instanceof Error ? error.stack ?? error.message : String(error);
1054
- const report = redactCodexEvalValue({
1055
- schema_version: 1,
1056
- generated_at: new Date().toISOString(),
1057
- suite: options.suiteId,
1058
- owner_skill: options.skillName,
1059
- participant_skills: skillNames,
1060
- profile: options.profile,
1061
- complete: false,
1062
- mechanical_passed: false,
1063
- qualitative_review: 'required',
1064
- environment_error: diagnostic,
1065
- environment: {
1066
- isolation: codexEvalIsolationEvidence({ mode: isolation }),
1067
- codex_runtime: codexEvalRuntimeEvidence(codexRuntime),
1068
- },
1069
- results: [],
1070
- }, codexRuntime);
1071
- if (options.reportPath) {
1072
- await fs.ensureDir(path.dirname(options.reportPath));
1073
- await writeJsonAtomic(options.reportPath, report);
1074
- }
1075
- return redactCodexEvalValue({
1076
- id: options.suiteId,
1077
- kind: 'conversation',
1078
- skills: skillNames,
1079
- profile: options.profile,
1080
- split: null,
1081
- outcome: 'incomplete',
1082
- complete: false,
1083
- mechanicalPassed: false,
1084
- qualitativeReview: 'required',
1085
- ...(options.reportPath ? { reportPath: options.reportPath } : {}),
1086
- summary: { cases: cases.length, runs: 0 },
1087
- diagnostics: [diagnostic],
1088
- }, codexRuntime);
1089
- }
1090
- const allRunsFor = (caseResults) => caseResults.flatMap((entry) => entry.runs).flatMap((run) => [
1091
- run.with_skill,
1092
- run.without_skill,
1093
- ]);
1094
- const createSuiteReport = (caseResults, reportPath = options.reportPath) => {
1095
- const allRuns = allRunsFor(caseResults);
1096
- const complete = caseResults.length > 0 && allRuns.every((run) => run.complete);
1097
- const mechanicalPassed = complete && allRuns.every((run) => run.mechanicalPassed);
1098
- return redactCodexEvalValue({
1099
- id: options.suiteId,
1100
- kind: 'conversation',
1101
- skills: skillNames,
1102
- profile: options.profile,
1103
- split: null,
1104
- outcome: !complete ? 'incomplete' : !mechanicalPassed ? 'failed' : 'needs_review',
1105
- complete,
1106
- mechanicalPassed,
1107
- qualitativeReview: 'required',
1108
- ...(reportPath ? { reportPath } : {}),
1109
- caseResults: caseResults.map((result) => {
1110
- const runs = allRunsFor([result]);
1111
- const caseComplete = runs.every((run) => run.complete);
1112
- const caseMechanicalPassed = caseComplete && runs.every((run) => run.mechanicalPassed);
1113
- return {
1114
- id: result.id,
1115
- outcome: !caseComplete
1116
- ? 'incomplete'
1117
- : !caseMechanicalPassed
1118
- ? 'failed'
1119
- : 'needs_review',
1120
- complete: caseComplete,
1121
- mechanicalPassed: caseMechanicalPassed,
1122
- qualitativeReview: 'required',
1123
- summary: { runs: runs.length },
1124
- diagnostics: runs.flatMap((run) => run.diagnostics),
1125
- };
1126
- }),
1127
- summary: { cases: caseResults.length, runs: allRuns.length },
1128
- diagnostics: allRuns.flatMap((run) => run.diagnostics),
1129
- }, codexRuntime);
1130
- };
1131
- const writeProgressReport = async (caseResults) => {
1132
- if (!options.reportPath)
1133
- return;
1134
- const allRuns = allRunsFor(caseResults);
1135
- const complete = caseResults.length === cases.length && allRuns.every((run) => run.complete);
1136
- const mechanicalPassed = complete && allRuns.every((run) => run.mechanicalPassed);
1137
- const runtimeProbe = allRuns.find((run) => run.isolation)?.isolation ?? null;
1138
- const report = redactCodexEvalValue({
1139
- schema_version: 1,
1140
- generated_at: new Date().toISOString(),
1141
- suite: options.suiteId,
1142
- owner_skill: options.skillName,
1143
- participant_skills: skillNames,
1144
- profile: options.profile,
1145
- complete,
1146
- mechanical_passed: mechanicalPassed,
1147
- qualitative_review: 'required',
1148
- environment: {
1149
- isolation: codexEvalIsolationEvidence({
1150
- mode: isolation,
1151
- host: hostIsolation,
1152
- runtimeProbe,
1153
- }),
1154
- codex_runtime: codexEvalRuntimeEvidence(codexRuntime),
1155
- },
1156
- results: caseResults,
1157
- }, codexRuntime);
1158
- await writeJsonAtomic(options.reportPath, report);
1159
- };
1160
- const results = [];
1161
- for (const evalCase of cases) {
1162
- const runs = [];
1163
- for (let runIndex = 0; runIndex < options.runs; runIndex += 1) {
1164
- assertCodexEvalCanStartWork();
1165
- const withSkill = await runConversationOnce({
1166
- sourceProjectRoot: options.subjectRoot,
1167
- evalCase,
1168
- variant: 'with_skill',
1169
- skillName: options.skillName,
1170
- skillNames,
1171
- codexBin: options.codexBin,
1172
- model,
1173
- codexRuntime,
1174
- timeoutMs: options.timeoutMs,
1175
- sourceEnv,
1176
- isolation,
1177
- processManagement,
1178
- forbiddenHostRoots,
1179
- workRoot: options.workRoot,
1180
- });
1181
- assertCodexEvalCanStartWork();
1182
- const withoutSkill = await runConversationOnce({
1183
- sourceProjectRoot: options.subjectRoot,
1184
- evalCase,
1185
- variant: 'without_skill',
1186
- skillName: options.skillName,
1187
- skillNames,
1188
- codexBin: options.codexBin,
1189
- model,
1190
- codexRuntime,
1191
- timeoutMs: options.timeoutMs,
1192
- sourceEnv,
1193
- isolation,
1194
- processManagement,
1195
- forbiddenHostRoots,
1196
- workRoot: options.workRoot,
1197
- });
1198
- runs.push({ run: runIndex + 1, with_skill: withSkill, without_skill: withoutSkill });
1199
- }
1200
- const caseResult = {
1201
- id: evalCase.id,
1202
- prompt: evalCase.prompt,
1203
- expected_output: evalCase.expectedOutput,
1204
- checks: evalCase.checks,
1205
- workspace_files: Object.keys(evalCase.workspaceFiles),
1206
- runs,
1207
- };
1208
- results.push(caseResult);
1209
- await writeProgressReport(results);
1210
- await options.onCaseCompleted?.({
1211
- caseId: evalCase.id,
1212
- report: createSuiteReport([caseResult]),
1213
- });
1214
- if (options.stopOnIncomplete && !createSuiteReport([caseResult]).complete)
1215
- break;
1216
- }
1217
- const allRuns = allRunsFor(results);
1218
- const complete = results.length === cases.length && allRuns.every((run) => run.complete);
1219
- const mechanicalPassed = complete && allRuns.every((run) => run.mechanicalPassed);
1220
- await writeProgressReport(results);
1221
- return {
1222
- ...createSuiteReport(results),
1223
- complete,
1224
- mechanicalPassed,
1225
- outcome: !complete ? 'incomplete' : !mechanicalPassed ? 'failed' : 'needs_review',
1226
- };
1227
- }
1228
- //# sourceMappingURL=codex-eval-app-server.js.map