@prismatic-io/lux 0.0.1

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 (636) hide show
  1. package/LICENSE +21 -0
  2. package/lib/answerers/claude-code/index.d.ts +17 -0
  3. package/lib/answerers/claude-code/index.d.ts.map +1 -0
  4. package/lib/answerers/claude-code/index.js +280 -0
  5. package/lib/answerers/claude-code/index.js.map +1 -0
  6. package/lib/answerers/persona/index.d.ts +40 -0
  7. package/lib/answerers/persona/index.d.ts.map +1 -0
  8. package/lib/answerers/persona/index.js +265 -0
  9. package/lib/answerers/persona/index.js.map +1 -0
  10. package/lib/answerers/scripted/index.d.ts +8 -0
  11. package/lib/answerers/scripted/index.d.ts.map +1 -0
  12. package/lib/answerers/scripted/index.js +163 -0
  13. package/lib/answerers/scripted/index.js.map +1 -0
  14. package/lib/answerers/shared.d.ts +13 -0
  15. package/lib/answerers/shared.d.ts.map +1 -0
  16. package/lib/answerers/shared.js +17 -0
  17. package/lib/answerers/shared.js.map +1 -0
  18. package/lib/answerers/terminal/index.d.ts +9 -0
  19. package/lib/answerers/terminal/index.d.ts.map +1 -0
  20. package/lib/answerers/terminal/index.js +97 -0
  21. package/lib/answerers/terminal/index.js.map +1 -0
  22. package/lib/assertions/core/command-exits-zero.d.ts +21 -0
  23. package/lib/assertions/core/command-exits-zero.d.ts.map +1 -0
  24. package/lib/assertions/core/command-exits-zero.js +87 -0
  25. package/lib/assertions/core/command-exits-zero.js.map +1 -0
  26. package/lib/assertions/core/event-checks.d.ts +57 -0
  27. package/lib/assertions/core/event-checks.d.ts.map +1 -0
  28. package/lib/assertions/core/event-checks.js +123 -0
  29. package/lib/assertions/core/event-checks.js.map +1 -0
  30. package/lib/assertions/core/file-checks.d.ts +103 -0
  31. package/lib/assertions/core/file-checks.d.ts.map +1 -0
  32. package/lib/assertions/core/file-checks.js +288 -0
  33. package/lib/assertions/core/file-checks.js.map +1 -0
  34. package/lib/assertions/core/helpers.d.ts +66 -0
  35. package/lib/assertions/core/helpers.d.ts.map +1 -0
  36. package/lib/assertions/core/helpers.js +170 -0
  37. package/lib/assertions/core/helpers.js.map +1 -0
  38. package/lib/assertions/core/index.d.ts +15 -0
  39. package/lib/assertions/core/index.d.ts.map +1 -0
  40. package/lib/assertions/core/index.js +56 -0
  41. package/lib/assertions/core/index.js.map +1 -0
  42. package/lib/assertions/core/json-pointer-equals.d.ts +19 -0
  43. package/lib/assertions/core/json-pointer-equals.d.ts.map +1 -0
  44. package/lib/assertions/core/json-pointer-equals.js +71 -0
  45. package/lib/assertions/core/json-pointer-equals.js.map +1 -0
  46. package/lib/assertions/core/output-checks.d.ts +46 -0
  47. package/lib/assertions/core/output-checks.d.ts.map +1 -0
  48. package/lib/assertions/core/output-checks.js +121 -0
  49. package/lib/assertions/core/output-checks.js.map +1 -0
  50. package/lib/assertions/core/predicate.d.ts +14 -0
  51. package/lib/assertions/core/predicate.d.ts.map +1 -0
  52. package/lib/assertions/core/predicate.js +55 -0
  53. package/lib/assertions/core/predicate.js.map +1 -0
  54. package/lib/assertions/core/resource-checks.d.ts +71 -0
  55. package/lib/assertions/core/resource-checks.d.ts.map +1 -0
  56. package/lib/assertions/core/resource-checks.js +159 -0
  57. package/lib/assertions/core/resource-checks.js.map +1 -0
  58. package/lib/assertions/core/safe-regex.d.ts +23 -0
  59. package/lib/assertions/core/safe-regex.d.ts.map +1 -0
  60. package/lib/assertions/core/safe-regex.js +102 -0
  61. package/lib/assertions/core/safe-regex.js.map +1 -0
  62. package/lib/assertions/core/tool-called-with.d.ts +21 -0
  63. package/lib/assertions/core/tool-called-with.d.ts.map +1 -0
  64. package/lib/assertions/core/tool-called-with.js +69 -0
  65. package/lib/assertions/core/tool-called-with.js.map +1 -0
  66. package/lib/assertions/core/tool-calls.d.ts +22 -0
  67. package/lib/assertions/core/tool-calls.d.ts.map +1 -0
  68. package/lib/assertions/core/tool-calls.js +17 -0
  69. package/lib/assertions/core/tool-calls.js.map +1 -0
  70. package/lib/assertions/core/tool-invocation.d.ts +36 -0
  71. package/lib/assertions/core/tool-invocation.d.ts.map +1 -0
  72. package/lib/assertions/core/tool-invocation.js +170 -0
  73. package/lib/assertions/core/tool-invocation.js.map +1 -0
  74. package/lib/assertions/core/tool-result-checks.d.ts +59 -0
  75. package/lib/assertions/core/tool-result-checks.d.ts.map +1 -0
  76. package/lib/assertions/core/tool-result-checks.js +193 -0
  77. package/lib/assertions/core/tool-result-checks.js.map +1 -0
  78. package/lib/assertions/mcp/discovery-checks.d.ts +36 -0
  79. package/lib/assertions/mcp/discovery-checks.d.ts.map +1 -0
  80. package/lib/assertions/mcp/discovery-checks.js +122 -0
  81. package/lib/assertions/mcp/discovery-checks.js.map +1 -0
  82. package/lib/assertions/mcp/index.d.ts +10 -0
  83. package/lib/assertions/mcp/index.d.ts.map +1 -0
  84. package/lib/assertions/mcp/index.js +25 -0
  85. package/lib/assertions/mcp/index.js.map +1 -0
  86. package/lib/assertions/rubric/index.d.ts +104 -0
  87. package/lib/assertions/rubric/index.d.ts.map +1 -0
  88. package/lib/assertions/rubric/index.js +191 -0
  89. package/lib/assertions/rubric/index.js.map +1 -0
  90. package/lib/assertions/rubric/internal.d.ts +14 -0
  91. package/lib/assertions/rubric/internal.d.ts.map +1 -0
  92. package/lib/assertions/rubric/internal.js +335 -0
  93. package/lib/assertions/rubric/internal.js.map +1 -0
  94. package/lib/authoring.d.ts +3 -0
  95. package/lib/authoring.d.ts.map +1 -0
  96. package/lib/authoring.js +3 -0
  97. package/lib/authoring.js.map +1 -0
  98. package/lib/cli/bin.d.ts +3 -0
  99. package/lib/cli/bin.d.ts.map +1 -0
  100. package/lib/cli/bin.js +15 -0
  101. package/lib/cli/bin.js.map +1 -0
  102. package/lib/cli/command-runtime.d.ts +5 -0
  103. package/lib/cli/command-runtime.d.ts.map +1 -0
  104. package/lib/cli/command-runtime.js +30 -0
  105. package/lib/cli/command-runtime.js.map +1 -0
  106. package/lib/cli/init.d.ts +21 -0
  107. package/lib/cli/init.d.ts.map +1 -0
  108. package/lib/cli/init.js +340 -0
  109. package/lib/cli/init.js.map +1 -0
  110. package/lib/cli/program.d.ts +22 -0
  111. package/lib/cli/program.d.ts.map +1 -0
  112. package/lib/cli/program.js +757 -0
  113. package/lib/cli/program.js.map +1 -0
  114. package/lib/cli/render/format.d.ts +14 -0
  115. package/lib/cli/render/format.d.ts.map +1 -0
  116. package/lib/cli/render/format.js +71 -0
  117. package/lib/cli/render/format.js.map +1 -0
  118. package/lib/cli/render/reporter.d.ts +73 -0
  119. package/lib/cli/render/reporter.d.ts.map +1 -0
  120. package/lib/cli/render/reporter.js +519 -0
  121. package/lib/cli/render/reporter.js.map +1 -0
  122. package/lib/cli/render/tty.d.ts +77 -0
  123. package/lib/cli/render/tty.d.ts.map +1 -0
  124. package/lib/cli/render/tty.js +283 -0
  125. package/lib/cli/render/tty.js.map +1 -0
  126. package/lib/cli/run-options.d.ts +27 -0
  127. package/lib/cli/run-options.d.ts.map +1 -0
  128. package/lib/cli/run-options.js +58 -0
  129. package/lib/cli/run-options.js.map +1 -0
  130. package/lib/cli/skills.d.ts +38 -0
  131. package/lib/cli/skills.d.ts.map +1 -0
  132. package/lib/cli/skills.js +84 -0
  133. package/lib/cli/skills.js.map +1 -0
  134. package/lib/core/annotation.d.ts +56 -0
  135. package/lib/core/annotation.d.ts.map +1 -0
  136. package/lib/core/annotation.js +92 -0
  137. package/lib/core/annotation.js.map +1 -0
  138. package/lib/core/answerer.d.ts +68 -0
  139. package/lib/core/answerer.d.ts.map +1 -0
  140. package/lib/core/answerer.js +17 -0
  141. package/lib/core/answerer.js.map +1 -0
  142. package/lib/core/artifact-evidence.d.ts +50 -0
  143. package/lib/core/artifact-evidence.d.ts.map +1 -0
  144. package/lib/core/artifact-evidence.js +185 -0
  145. package/lib/core/artifact-evidence.js.map +1 -0
  146. package/lib/core/artifact-snapshot.d.ts +37 -0
  147. package/lib/core/artifact-snapshot.d.ts.map +1 -0
  148. package/lib/core/artifact-snapshot.js +339 -0
  149. package/lib/core/artifact-snapshot.js.map +1 -0
  150. package/lib/core/assertion.d.ts +129 -0
  151. package/lib/core/assertion.d.ts.map +1 -0
  152. package/lib/core/assertion.js +75 -0
  153. package/lib/core/assertion.js.map +1 -0
  154. package/lib/core/case.d.ts +79 -0
  155. package/lib/core/case.d.ts.map +1 -0
  156. package/lib/core/case.js +90 -0
  157. package/lib/core/case.js.map +1 -0
  158. package/lib/core/conversation-turn.d.ts +23 -0
  159. package/lib/core/conversation-turn.d.ts.map +1 -0
  160. package/lib/core/conversation-turn.js +31 -0
  161. package/lib/core/conversation-turn.js.map +1 -0
  162. package/lib/core/driver.d.ts +64 -0
  163. package/lib/core/driver.d.ts.map +1 -0
  164. package/lib/core/driver.js +18 -0
  165. package/lib/core/driver.js.map +1 -0
  166. package/lib/core/emitter.d.ts +20 -0
  167. package/lib/core/emitter.d.ts.map +1 -0
  168. package/lib/core/emitter.js +34 -0
  169. package/lib/core/emitter.js.map +1 -0
  170. package/lib/core/events.d.ts +202 -0
  171. package/lib/core/events.d.ts.map +1 -0
  172. package/lib/core/events.js +107 -0
  173. package/lib/core/events.js.map +1 -0
  174. package/lib/core/exec.d.ts +82 -0
  175. package/lib/core/exec.d.ts.map +1 -0
  176. package/lib/core/exec.js +168 -0
  177. package/lib/core/exec.js.map +1 -0
  178. package/lib/core/experiment.d.ts +285 -0
  179. package/lib/core/experiment.d.ts.map +1 -0
  180. package/lib/core/experiment.js +389 -0
  181. package/lib/core/experiment.js.map +1 -0
  182. package/lib/core/glob.d.ts +3 -0
  183. package/lib/core/glob.d.ts.map +1 -0
  184. package/lib/core/glob.js +32 -0
  185. package/lib/core/glob.js.map +1 -0
  186. package/lib/core/hash.d.ts +8 -0
  187. package/lib/core/hash.d.ts.map +1 -0
  188. package/lib/core/hash.js +214 -0
  189. package/lib/core/hash.js.map +1 -0
  190. package/lib/core/index.d.ts +29 -0
  191. package/lib/core/index.d.ts.map +1 -0
  192. package/lib/core/index.js +29 -0
  193. package/lib/core/index.js.map +1 -0
  194. package/lib/core/lifecycle-fixtures.d.ts +20 -0
  195. package/lib/core/lifecycle-fixtures.d.ts.map +1 -0
  196. package/lib/core/lifecycle-fixtures.js +109 -0
  197. package/lib/core/lifecycle-fixtures.js.map +1 -0
  198. package/lib/core/lifecycle-hooks.d.ts +52 -0
  199. package/lib/core/lifecycle-hooks.d.ts.map +1 -0
  200. package/lib/core/lifecycle-hooks.js +42 -0
  201. package/lib/core/lifecycle-hooks.js.map +1 -0
  202. package/lib/core/mcp-events.d.ts +44 -0
  203. package/lib/core/mcp-events.d.ts.map +1 -0
  204. package/lib/core/mcp-events.js +23 -0
  205. package/lib/core/mcp-events.js.map +1 -0
  206. package/lib/core/model-cli.d.ts +57 -0
  207. package/lib/core/model-cli.d.ts.map +1 -0
  208. package/lib/core/model-cli.js +237 -0
  209. package/lib/core/model-cli.js.map +1 -0
  210. package/lib/core/observer.d.ts +31 -0
  211. package/lib/core/observer.d.ts.map +1 -0
  212. package/lib/core/observer.js +25 -0
  213. package/lib/core/observer.js.map +1 -0
  214. package/lib/core/platform-process.d.ts +33 -0
  215. package/lib/core/platform-process.d.ts.map +1 -0
  216. package/lib/core/platform-process.js +214 -0
  217. package/lib/core/platform-process.js.map +1 -0
  218. package/lib/core/registry.d.ts +22 -0
  219. package/lib/core/registry.d.ts.map +1 -0
  220. package/lib/core/registry.js +45 -0
  221. package/lib/core/registry.js.map +1 -0
  222. package/lib/core/rubric.d.ts +18 -0
  223. package/lib/core/rubric.d.ts.map +1 -0
  224. package/lib/core/rubric.js +49 -0
  225. package/lib/core/rubric.js.map +1 -0
  226. package/lib/core/run.d.ts +419 -0
  227. package/lib/core/run.d.ts.map +1 -0
  228. package/lib/core/run.js +126 -0
  229. package/lib/core/run.js.map +1 -0
  230. package/lib/core/statistics.d.ts +39 -0
  231. package/lib/core/statistics.d.ts.map +1 -0
  232. package/lib/core/statistics.js +163 -0
  233. package/lib/core/statistics.js.map +1 -0
  234. package/lib/core/subject.d.ts +4 -0
  235. package/lib/core/subject.d.ts.map +1 -0
  236. package/lib/core/subject.js +46 -0
  237. package/lib/core/subject.js.map +1 -0
  238. package/lib/core/tool-events.d.ts +69 -0
  239. package/lib/core/tool-events.d.ts.map +1 -0
  240. package/lib/core/tool-events.js +242 -0
  241. package/lib/core/tool-events.js.map +1 -0
  242. package/lib/core/usage.d.ts +78 -0
  243. package/lib/core/usage.d.ts.map +1 -0
  244. package/lib/core/usage.js +104 -0
  245. package/lib/core/usage.js.map +1 -0
  246. package/lib/core/wire.d.ts +83 -0
  247. package/lib/core/wire.d.ts.map +1 -0
  248. package/lib/core/wire.js +101 -0
  249. package/lib/core/wire.js.map +1 -0
  250. package/lib/core/zod.d.ts +10 -0
  251. package/lib/core/zod.d.ts.map +1 -0
  252. package/lib/core/zod.js +18 -0
  253. package/lib/core/zod.js.map +1 -0
  254. package/lib/drivers/claude-code/index.d.ts +55 -0
  255. package/lib/drivers/claude-code/index.d.ts.map +1 -0
  256. package/lib/drivers/claude-code/index.js +779 -0
  257. package/lib/drivers/claude-code/index.js.map +1 -0
  258. package/lib/drivers/claude-code/parse-events.d.ts +46 -0
  259. package/lib/drivers/claude-code/parse-events.d.ts.map +1 -0
  260. package/lib/drivers/claude-code/parse-events.js +387 -0
  261. package/lib/drivers/claude-code/parse-events.js.map +1 -0
  262. package/lib/drivers/codex/app-events.d.ts +16 -0
  263. package/lib/drivers/codex/app-events.d.ts.map +1 -0
  264. package/lib/drivers/codex/app-events.js +184 -0
  265. package/lib/drivers/codex/app-events.js.map +1 -0
  266. package/lib/drivers/codex/config.d.ts +55 -0
  267. package/lib/drivers/codex/config.d.ts.map +1 -0
  268. package/lib/drivers/codex/config.js +125 -0
  269. package/lib/drivers/codex/config.js.map +1 -0
  270. package/lib/drivers/codex/index.d.ts +8 -0
  271. package/lib/drivers/codex/index.d.ts.map +1 -0
  272. package/lib/drivers/codex/index.js +904 -0
  273. package/lib/drivers/codex/index.js.map +1 -0
  274. package/lib/drivers/mcp/index.d.ts +52 -0
  275. package/lib/drivers/mcp/index.d.ts.map +1 -0
  276. package/lib/drivers/mcp/index.js +282 -0
  277. package/lib/drivers/mcp/index.js.map +1 -0
  278. package/lib/drivers/mcp/transport.d.ts +50 -0
  279. package/lib/drivers/mcp/transport.d.ts.map +1 -0
  280. package/lib/drivers/mcp/transport.js +190 -0
  281. package/lib/drivers/mcp/transport.js.map +1 -0
  282. package/lib/drivers/shared/artifacts.d.ts +4 -0
  283. package/lib/drivers/shared/artifacts.d.ts.map +1 -0
  284. package/lib/drivers/shared/artifacts.js +81 -0
  285. package/lib/drivers/shared/artifacts.js.map +1 -0
  286. package/lib/drivers/shared/secure-copy.d.ts +2 -0
  287. package/lib/drivers/shared/secure-copy.d.ts.map +1 -0
  288. package/lib/drivers/shared/secure-copy.js +35 -0
  289. package/lib/drivers/shared/secure-copy.js.map +1 -0
  290. package/lib/drivers/subprocess/index.d.ts +24 -0
  291. package/lib/drivers/subprocess/index.d.ts.map +1 -0
  292. package/lib/drivers/subprocess/index.js +451 -0
  293. package/lib/drivers/subprocess/index.js.map +1 -0
  294. package/lib/index.d.ts +40 -0
  295. package/lib/index.d.ts.map +1 -0
  296. package/lib/index.js +48 -0
  297. package/lib/index.js.map +1 -0
  298. package/lib/optimization/reflective.d.ts +27 -0
  299. package/lib/optimization/reflective.d.ts.map +1 -0
  300. package/lib/optimization/reflective.js +257 -0
  301. package/lib/optimization/reflective.js.map +1 -0
  302. package/lib/orchestrator/annotation-loader.d.ts +65 -0
  303. package/lib/orchestrator/annotation-loader.d.ts.map +1 -0
  304. package/lib/orchestrator/annotation-loader.js +73 -0
  305. package/lib/orchestrator/annotation-loader.js.map +1 -0
  306. package/lib/orchestrator/annotation-store.d.ts +3 -0
  307. package/lib/orchestrator/annotation-store.d.ts.map +1 -0
  308. package/lib/orchestrator/annotation-store.js +100 -0
  309. package/lib/orchestrator/annotation-store.js.map +1 -0
  310. package/lib/orchestrator/authored-dependencies.d.ts +3 -0
  311. package/lib/orchestrator/authored-dependencies.d.ts.map +1 -0
  312. package/lib/orchestrator/authored-dependencies.js +146 -0
  313. package/lib/orchestrator/authored-dependencies.js.map +1 -0
  314. package/lib/orchestrator/campaign-lifecycle.d.ts +105 -0
  315. package/lib/orchestrator/campaign-lifecycle.d.ts.map +1 -0
  316. package/lib/orchestrator/campaign-lifecycle.js +141 -0
  317. package/lib/orchestrator/campaign-lifecycle.js.map +1 -0
  318. package/lib/orchestrator/candidate-integrity.d.ts +4 -0
  319. package/lib/orchestrator/candidate-integrity.d.ts.map +1 -0
  320. package/lib/orchestrator/candidate-integrity.js +14 -0
  321. package/lib/orchestrator/candidate-integrity.js.map +1 -0
  322. package/lib/orchestrator/candidates.d.ts +13 -0
  323. package/lib/orchestrator/candidates.d.ts.map +1 -0
  324. package/lib/orchestrator/candidates.js +577 -0
  325. package/lib/orchestrator/candidates.js.map +1 -0
  326. package/lib/orchestrator/compare.d.ts +80 -0
  327. package/lib/orchestrator/compare.d.ts.map +1 -0
  328. package/lib/orchestrator/compare.js +270 -0
  329. package/lib/orchestrator/compare.js.map +1 -0
  330. package/lib/orchestrator/comparison-identity.d.ts +10 -0
  331. package/lib/orchestrator/comparison-identity.d.ts.map +1 -0
  332. package/lib/orchestrator/comparison-identity.js +39 -0
  333. package/lib/orchestrator/comparison-identity.js.map +1 -0
  334. package/lib/orchestrator/config.d.ts +121 -0
  335. package/lib/orchestrator/config.d.ts.map +1 -0
  336. package/lib/orchestrator/config.js +176 -0
  337. package/lib/orchestrator/config.js.map +1 -0
  338. package/lib/orchestrator/content-bound-json.d.ts +5 -0
  339. package/lib/orchestrator/content-bound-json.d.ts.map +1 -0
  340. package/lib/orchestrator/content-bound-json.js +59 -0
  341. package/lib/orchestrator/content-bound-json.js.map +1 -0
  342. package/lib/orchestrator/discover.d.ts +45 -0
  343. package/lib/orchestrator/discover.d.ts.map +1 -0
  344. package/lib/orchestrator/discover.js +98 -0
  345. package/lib/orchestrator/discover.js.map +1 -0
  346. package/lib/orchestrator/doctor.d.ts +141 -0
  347. package/lib/orchestrator/doctor.d.ts.map +1 -0
  348. package/lib/orchestrator/doctor.js +525 -0
  349. package/lib/orchestrator/doctor.js.map +1 -0
  350. package/lib/orchestrator/driver-session.d.ts +177 -0
  351. package/lib/orchestrator/driver-session.d.ts.map +1 -0
  352. package/lib/orchestrator/driver-session.js +396 -0
  353. package/lib/orchestrator/driver-session.js.map +1 -0
  354. package/lib/orchestrator/evaluator-identity.d.ts +7 -0
  355. package/lib/orchestrator/evaluator-identity.d.ts.map +1 -0
  356. package/lib/orchestrator/evaluator-identity.js +42 -0
  357. package/lib/orchestrator/evaluator-identity.js.map +1 -0
  358. package/lib/orchestrator/experiment-budget.d.ts +11 -0
  359. package/lib/orchestrator/experiment-budget.d.ts.map +1 -0
  360. package/lib/orchestrator/experiment-budget.js +51 -0
  361. package/lib/orchestrator/experiment-budget.js.map +1 -0
  362. package/lib/orchestrator/experiment-context.d.ts +43 -0
  363. package/lib/orchestrator/experiment-context.d.ts.map +1 -0
  364. package/lib/orchestrator/experiment-context.js +9 -0
  365. package/lib/orchestrator/experiment-context.js.map +1 -0
  366. package/lib/orchestrator/experiment-contracts.d.ts +290 -0
  367. package/lib/orchestrator/experiment-contracts.d.ts.map +1 -0
  368. package/lib/orchestrator/experiment-contracts.js +38 -0
  369. package/lib/orchestrator/experiment-contracts.js.map +1 -0
  370. package/lib/orchestrator/experiment-corpus.d.ts +21 -0
  371. package/lib/orchestrator/experiment-corpus.d.ts.map +1 -0
  372. package/lib/orchestrator/experiment-corpus.js +276 -0
  373. package/lib/orchestrator/experiment-corpus.js.map +1 -0
  374. package/lib/orchestrator/experiment-evaluation.d.ts +44 -0
  375. package/lib/orchestrator/experiment-evaluation.d.ts.map +1 -0
  376. package/lib/orchestrator/experiment-evaluation.js +542 -0
  377. package/lib/orchestrator/experiment-evaluation.js.map +1 -0
  378. package/lib/orchestrator/experiment-finish.d.ts +6 -0
  379. package/lib/orchestrator/experiment-finish.d.ts.map +1 -0
  380. package/lib/orchestrator/experiment-finish.js +19 -0
  381. package/lib/orchestrator/experiment-finish.js.map +1 -0
  382. package/lib/orchestrator/experiment-identity.d.ts +6 -0
  383. package/lib/orchestrator/experiment-identity.d.ts.map +1 -0
  384. package/lib/orchestrator/experiment-identity.js +257 -0
  385. package/lib/orchestrator/experiment-identity.js.map +1 -0
  386. package/lib/orchestrator/experiment-loader.d.ts +175 -0
  387. package/lib/orchestrator/experiment-loader.d.ts.map +1 -0
  388. package/lib/orchestrator/experiment-loader.js +77 -0
  389. package/lib/orchestrator/experiment-loader.js.map +1 -0
  390. package/lib/orchestrator/experiment-report.d.ts +450 -0
  391. package/lib/orchestrator/experiment-report.d.ts.map +1 -0
  392. package/lib/orchestrator/experiment-report.js +570 -0
  393. package/lib/orchestrator/experiment-report.js.map +1 -0
  394. package/lib/orchestrator/experiment-runs.d.ts +379 -0
  395. package/lib/orchestrator/experiment-runs.d.ts.map +1 -0
  396. package/lib/orchestrator/experiment-runs.js +796 -0
  397. package/lib/orchestrator/experiment-runs.js.map +1 -0
  398. package/lib/orchestrator/experiment-runtime-identity.d.ts +41 -0
  399. package/lib/orchestrator/experiment-runtime-identity.d.ts.map +1 -0
  400. package/lib/orchestrator/experiment-runtime-identity.js +411 -0
  401. package/lib/orchestrator/experiment-runtime-identity.js.map +1 -0
  402. package/lib/orchestrator/experiment-selection.d.ts +25 -0
  403. package/lib/orchestrator/experiment-selection.d.ts.map +1 -0
  404. package/lib/orchestrator/experiment-selection.js +286 -0
  405. package/lib/orchestrator/experiment-selection.js.map +1 -0
  406. package/lib/orchestrator/experiment.d.ts +11 -0
  407. package/lib/orchestrator/experiment.d.ts.map +1 -0
  408. package/lib/orchestrator/experiment.js +639 -0
  409. package/lib/orchestrator/experiment.js.map +1 -0
  410. package/lib/orchestrator/fixture-identity.d.ts +7 -0
  411. package/lib/orchestrator/fixture-identity.d.ts.map +1 -0
  412. package/lib/orchestrator/fixture-identity.js +55 -0
  413. package/lib/orchestrator/fixture-identity.js.map +1 -0
  414. package/lib/orchestrator/fs-read.d.ts +19 -0
  415. package/lib/orchestrator/fs-read.d.ts.map +1 -0
  416. package/lib/orchestrator/fs-read.js +113 -0
  417. package/lib/orchestrator/fs-read.js.map +1 -0
  418. package/lib/orchestrator/grader-experiment.d.ts +190 -0
  419. package/lib/orchestrator/grader-experiment.d.ts.map +1 -0
  420. package/lib/orchestrator/grader-experiment.js +579 -0
  421. package/lib/orchestrator/grader-experiment.js.map +1 -0
  422. package/lib/orchestrator/grading.d.ts +31 -0
  423. package/lib/orchestrator/grading.d.ts.map +1 -0
  424. package/lib/orchestrator/grading.js +186 -0
  425. package/lib/orchestrator/grading.js.map +1 -0
  426. package/lib/orchestrator/index.d.ts +22 -0
  427. package/lib/orchestrator/index.d.ts.map +1 -0
  428. package/lib/orchestrator/index.js +30 -0
  429. package/lib/orchestrator/index.js.map +1 -0
  430. package/lib/orchestrator/lifecycle-hook-execution.d.ts +4 -0
  431. package/lib/orchestrator/lifecycle-hook-execution.d.ts.map +1 -0
  432. package/lib/orchestrator/lifecycle-hook-execution.js +67 -0
  433. package/lib/orchestrator/lifecycle-hook-execution.js.map +1 -0
  434. package/lib/orchestrator/list-runs.d.ts +33 -0
  435. package/lib/orchestrator/list-runs.d.ts.map +1 -0
  436. package/lib/orchestrator/list-runs.js +308 -0
  437. package/lib/orchestrator/list-runs.js.map +1 -0
  438. package/lib/orchestrator/loader.d.ts +3 -0
  439. package/lib/orchestrator/loader.d.ts.map +1 -0
  440. package/lib/orchestrator/loader.js +17 -0
  441. package/lib/orchestrator/loader.js.map +1 -0
  442. package/lib/orchestrator/optimization-lifecycle.d.ts +12 -0
  443. package/lib/orchestrator/optimization-lifecycle.d.ts.map +1 -0
  444. package/lib/orchestrator/optimization-lifecycle.js +92 -0
  445. package/lib/orchestrator/optimization-lifecycle.js.map +1 -0
  446. package/lib/orchestrator/orchestrator.d.ts +144 -0
  447. package/lib/orchestrator/orchestrator.d.ts.map +1 -0
  448. package/lib/orchestrator/orchestrator.js +632 -0
  449. package/lib/orchestrator/orchestrator.js.map +1 -0
  450. package/lib/orchestrator/owned-lock.d.ts +17 -0
  451. package/lib/orchestrator/owned-lock.d.ts.map +1 -0
  452. package/lib/orchestrator/owned-lock.js +149 -0
  453. package/lib/orchestrator/owned-lock.js.map +1 -0
  454. package/lib/orchestrator/package-version.d.ts +2 -0
  455. package/lib/orchestrator/package-version.d.ts.map +1 -0
  456. package/lib/orchestrator/package-version.js +4 -0
  457. package/lib/orchestrator/package-version.js.map +1 -0
  458. package/lib/orchestrator/provenance.d.ts +5 -0
  459. package/lib/orchestrator/provenance.d.ts.map +1 -0
  460. package/lib/orchestrator/provenance.js +137 -0
  461. package/lib/orchestrator/provenance.js.map +1 -0
  462. package/lib/orchestrator/regrade.d.ts +80 -0
  463. package/lib/orchestrator/regrade.d.ts.map +1 -0
  464. package/lib/orchestrator/regrade.js +433 -0
  465. package/lib/orchestrator/regrade.js.map +1 -0
  466. package/lib/orchestrator/rubric-loader.d.ts +7 -0
  467. package/lib/orchestrator/rubric-loader.d.ts.map +1 -0
  468. package/lib/orchestrator/rubric-loader.js +65 -0
  469. package/lib/orchestrator/rubric-loader.js.map +1 -0
  470. package/lib/orchestrator/run-dir.d.ts +40 -0
  471. package/lib/orchestrator/run-dir.d.ts.map +1 -0
  472. package/lib/orchestrator/run-dir.js +161 -0
  473. package/lib/orchestrator/run-dir.js.map +1 -0
  474. package/lib/orchestrator/run-execution.d.ts +30 -0
  475. package/lib/orchestrator/run-execution.d.ts.map +1 -0
  476. package/lib/orchestrator/run-execution.js +531 -0
  477. package/lib/orchestrator/run-execution.js.map +1 -0
  478. package/lib/orchestrator/run-lifecycle.d.ts +115 -0
  479. package/lib/orchestrator/run-lifecycle.d.ts.map +1 -0
  480. package/lib/orchestrator/run-lifecycle.js +136 -0
  481. package/lib/orchestrator/run-lifecycle.js.map +1 -0
  482. package/lib/orchestrator/suite-compare.d.ts +76 -0
  483. package/lib/orchestrator/suite-compare.d.ts.map +1 -0
  484. package/lib/orchestrator/suite-compare.js +159 -0
  485. package/lib/orchestrator/suite-compare.js.map +1 -0
  486. package/lib/orchestrator/suite-lifecycle.d.ts +157 -0
  487. package/lib/orchestrator/suite-lifecycle.d.ts.map +1 -0
  488. package/lib/orchestrator/suite-lifecycle.js +253 -0
  489. package/lib/orchestrator/suite-lifecycle.js.map +1 -0
  490. package/lib/orchestrator/suite-runs.d.ts +91 -0
  491. package/lib/orchestrator/suite-runs.d.ts.map +1 -0
  492. package/lib/orchestrator/suite-runs.js +157 -0
  493. package/lib/orchestrator/suite-runs.js.map +1 -0
  494. package/lib/orchestrator/suite-summary.d.ts +109 -0
  495. package/lib/orchestrator/suite-summary.d.ts.map +1 -0
  496. package/lib/orchestrator/suite-summary.js +213 -0
  497. package/lib/orchestrator/suite-summary.js.map +1 -0
  498. package/lib/orchestrator/trace-limits.d.ts +20 -0
  499. package/lib/orchestrator/trace-limits.d.ts.map +1 -0
  500. package/lib/orchestrator/trace-limits.js +28 -0
  501. package/lib/orchestrator/trace-limits.js.map +1 -0
  502. package/lib/orchestrator/validate-plugin-config.d.ts +10 -0
  503. package/lib/orchestrator/validate-plugin-config.d.ts.map +1 -0
  504. package/lib/orchestrator/validate-plugin-config.js +26 -0
  505. package/lib/orchestrator/validate-plugin-config.js.map +1 -0
  506. package/package.json +84 -0
  507. package/skills/lux/SKILL.md +85 -0
  508. package/skills/lux/references/cli.md +102 -0
  509. package/skills/lux/references/eval-authoring.md +105 -0
  510. package/skills/lux-answerer/SKILL.md +169 -0
  511. package/src/answerers/claude-code/index.ts +342 -0
  512. package/src/answerers/persona/index.ts +327 -0
  513. package/src/answerers/scripted/index.ts +186 -0
  514. package/src/answerers/shared.ts +23 -0
  515. package/src/answerers/terminal/index.ts +117 -0
  516. package/src/assertions/core/command-exits-zero.ts +94 -0
  517. package/src/assertions/core/event-checks.ts +138 -0
  518. package/src/assertions/core/file-checks.ts +336 -0
  519. package/src/assertions/core/helpers.ts +203 -0
  520. package/src/assertions/core/index.ts +80 -0
  521. package/src/assertions/core/json-pointer-equals.ts +84 -0
  522. package/src/assertions/core/output-checks.ts +134 -0
  523. package/src/assertions/core/predicate.ts +67 -0
  524. package/src/assertions/core/resource-checks.ts +180 -0
  525. package/src/assertions/core/safe-regex.ts +196 -0
  526. package/src/assertions/core/tool-called-with.ts +68 -0
  527. package/src/assertions/core/tool-calls.ts +28 -0
  528. package/src/assertions/core/tool-invocation.ts +198 -0
  529. package/src/assertions/core/tool-result-checks.ts +211 -0
  530. package/src/assertions/mcp/discovery-checks.ts +139 -0
  531. package/src/assertions/mcp/index.ts +37 -0
  532. package/src/assertions/rubric/index.ts +258 -0
  533. package/src/assertions/rubric/internal.ts +367 -0
  534. package/src/authoring.ts +2 -0
  535. package/src/cli/bin.ts +14 -0
  536. package/src/cli/command-runtime.ts +34 -0
  537. package/src/cli/init.ts +410 -0
  538. package/src/cli/program.ts +992 -0
  539. package/src/cli/render/format.ts +69 -0
  540. package/src/cli/render/reporter.ts +643 -0
  541. package/src/cli/render/tty.ts +314 -0
  542. package/src/cli/run-options.ts +82 -0
  543. package/src/cli/skills.ts +129 -0
  544. package/src/core/annotation.ts +104 -0
  545. package/src/core/answerer.ts +75 -0
  546. package/src/core/artifact-evidence.ts +249 -0
  547. package/src/core/artifact-snapshot.ts +429 -0
  548. package/src/core/assertion.ts +156 -0
  549. package/src/core/case.ts +103 -0
  550. package/src/core/conversation-turn.ts +47 -0
  551. package/src/core/driver.ts +75 -0
  552. package/src/core/emitter.ts +38 -0
  553. package/src/core/events.ts +135 -0
  554. package/src/core/exec.ts +263 -0
  555. package/src/core/experiment.ts +467 -0
  556. package/src/core/glob.ts +31 -0
  557. package/src/core/hash.ts +237 -0
  558. package/src/core/index.ts +28 -0
  559. package/src/core/lifecycle-fixtures.ts +145 -0
  560. package/src/core/lifecycle-hooks.ts +101 -0
  561. package/src/core/mcp-events.ts +57 -0
  562. package/src/core/model-cli.ts +271 -0
  563. package/src/core/observer.ts +50 -0
  564. package/src/core/platform-process.ts +284 -0
  565. package/src/core/registry.ts +57 -0
  566. package/src/core/rubric.ts +52 -0
  567. package/src/core/run.ts +144 -0
  568. package/src/core/statistics.ts +194 -0
  569. package/src/core/subject.ts +50 -0
  570. package/src/core/tool-events.ts +292 -0
  571. package/src/core/usage.ts +123 -0
  572. package/src/core/wire.ts +135 -0
  573. package/src/core/zod.ts +20 -0
  574. package/src/drivers/claude-code/index.ts +866 -0
  575. package/src/drivers/claude-code/parse-events.ts +464 -0
  576. package/src/drivers/codex/app-events.ts +218 -0
  577. package/src/drivers/codex/config.ts +128 -0
  578. package/src/drivers/codex/index.ts +995 -0
  579. package/src/drivers/mcp/index.ts +351 -0
  580. package/src/drivers/mcp/transport.ts +222 -0
  581. package/src/drivers/shared/artifacts.ts +86 -0
  582. package/src/drivers/shared/secure-copy.ts +40 -0
  583. package/src/drivers/subprocess/index.ts +490 -0
  584. package/src/index.ts +594 -0
  585. package/src/optimization/reflective.ts +319 -0
  586. package/src/orchestrator/annotation-loader.ts +97 -0
  587. package/src/orchestrator/annotation-store.ts +112 -0
  588. package/src/orchestrator/authored-dependencies.ts +193 -0
  589. package/src/orchestrator/campaign-lifecycle.ts +181 -0
  590. package/src/orchestrator/candidate-integrity.ts +18 -0
  591. package/src/orchestrator/candidates.ts +683 -0
  592. package/src/orchestrator/compare.ts +358 -0
  593. package/src/orchestrator/comparison-identity.ts +45 -0
  594. package/src/orchestrator/config.ts +205 -0
  595. package/src/orchestrator/content-bound-json.ts +71 -0
  596. package/src/orchestrator/discover.ts +132 -0
  597. package/src/orchestrator/doctor.ts +781 -0
  598. package/src/orchestrator/driver-session.ts +507 -0
  599. package/src/orchestrator/evaluator-identity.ts +45 -0
  600. package/src/orchestrator/experiment-budget.ts +61 -0
  601. package/src/orchestrator/experiment-context.ts +41 -0
  602. package/src/orchestrator/experiment-contracts.ts +43 -0
  603. package/src/orchestrator/experiment-corpus.ts +416 -0
  604. package/src/orchestrator/experiment-evaluation.ts +749 -0
  605. package/src/orchestrator/experiment-finish.ts +33 -0
  606. package/src/orchestrator/experiment-identity.ts +356 -0
  607. package/src/orchestrator/experiment-loader.ts +105 -0
  608. package/src/orchestrator/experiment-report.ts +788 -0
  609. package/src/orchestrator/experiment-runs.ts +960 -0
  610. package/src/orchestrator/experiment-runtime-identity.ts +465 -0
  611. package/src/orchestrator/experiment-selection.ts +467 -0
  612. package/src/orchestrator/experiment.ts +991 -0
  613. package/src/orchestrator/fixture-identity.ts +67 -0
  614. package/src/orchestrator/fs-read.ts +126 -0
  615. package/src/orchestrator/grader-experiment.ts +856 -0
  616. package/src/orchestrator/grading.ts +260 -0
  617. package/src/orchestrator/index.ts +186 -0
  618. package/src/orchestrator/lifecycle-hook-execution.ts +90 -0
  619. package/src/orchestrator/list-runs.ts +384 -0
  620. package/src/orchestrator/loader.ts +19 -0
  621. package/src/orchestrator/optimization-lifecycle.ts +126 -0
  622. package/src/orchestrator/orchestrator.ts +919 -0
  623. package/src/orchestrator/owned-lock.ts +147 -0
  624. package/src/orchestrator/package-version.ts +5 -0
  625. package/src/orchestrator/provenance.ts +140 -0
  626. package/src/orchestrator/regrade.ts +580 -0
  627. package/src/orchestrator/rubric-loader.ts +74 -0
  628. package/src/orchestrator/run-dir.ts +209 -0
  629. package/src/orchestrator/run-execution.ts +694 -0
  630. package/src/orchestrator/run-lifecycle.ts +174 -0
  631. package/src/orchestrator/suite-compare.ts +195 -0
  632. package/src/orchestrator/suite-lifecycle.ts +335 -0
  633. package/src/orchestrator/suite-runs.ts +202 -0
  634. package/src/orchestrator/suite-summary.ts +276 -0
  635. package/src/orchestrator/trace-limits.ts +65 -0
  636. package/src/orchestrator/validate-plugin-config.ts +34 -0
@@ -0,0 +1,632 @@
1
+ import { basename, extname, isAbsolute, join, resolve } from "node:path";
2
+ import { bindSubjectRoot, guardObserverCallback, mergeHarnessModelConfig, valueHash, } from "../core/index.js";
3
+ import { evaluatorImplementationHash } from "./evaluator-identity.js";
4
+ import { assertionEvaluatorIdentities, graderConfigHash, validateAssertionPlan, } from "./grading.js";
5
+ import { combineLifecycleFailures, setupLifecycleHooks } from "./lifecycle-hook-execution.js";
6
+ import { loadEvalCase } from "./loader.js";
7
+ import { LUX_VERSION } from "./package-version.js";
8
+ import { writeRunBundleJson } from "./run-dir.js";
9
+ import { closeRunDirectory, executeRunWithPlugins, INLINE_CASE_PATH, phaseDurations, runDirOfError, } from "./run-execution.js";
10
+ import { executeSuiteLifecycle, validateSuiteConcurrency, } from "./suite-lifecycle.js";
11
+ import { openSuiteRun } from "./suite-runs.js";
12
+ import { buildSuiteSummary, writeSuiteSummary } from "./suite-summary.js";
13
+ import { validatePluginConfig } from "./validate-plugin-config.js";
14
+ const serializeEffect = (effect) => {
15
+ let pending = Promise.resolve();
16
+ return () => (pending = pending.catch(() => undefined).then(effect));
17
+ };
18
+ const errorMessage = (error, depth = 0) => {
19
+ const message = error instanceof Error ? error.message : String(error);
20
+ if (!(error instanceof AggregateError) || depth >= 3)
21
+ return message;
22
+ const details = [...error.errors].slice(0, 8).map((failure) => errorMessage(failure, depth + 1));
23
+ return details.length > 0 ? `${message}: ${details.join("; ")}` : message;
24
+ };
25
+ const causedByAbort = (error, signal) => {
26
+ if (!signal?.aborted || error instanceof AggregateError)
27
+ return false;
28
+ const reason = signal.reason;
29
+ let current = error;
30
+ for (let depth = 0; depth < 8 && current !== undefined; depth += 1) {
31
+ if (current === reason)
32
+ return true;
33
+ if (current instanceof DOMException &&
34
+ current.name === "AbortError" &&
35
+ (reason === undefined || (reason instanceof DOMException && reason.name === "AbortError"))) {
36
+ return true;
37
+ }
38
+ current = current instanceof Error && "cause" in current ? current.cause : undefined;
39
+ }
40
+ return false;
41
+ };
42
+ const recordLifecycleCleanupFailure = async (result, error) => {
43
+ const reason = errorMessage(error);
44
+ result.metadata.endedAt = new Date().toISOString();
45
+ result.metadata.exitReason = "error";
46
+ const primary = result.metadata.operationalFailure;
47
+ result.metadata.operationalFailure = primary
48
+ ? {
49
+ phase: primary.phase,
50
+ reason: `${primary.reason}; lifecycle cleanup also failed during close: ${reason}`,
51
+ }
52
+ : { phase: "close", reason };
53
+ result.exitReason = "error";
54
+ result.grading.casePassed = null;
55
+ await Promise.all([
56
+ writeRunBundleJson(join(result.runDir, "run.json"), result.metadata),
57
+ writeRunBundleJson(join(result.runDir, "grading.json"), result.grading),
58
+ ]);
59
+ };
60
+ const resolveCaseId = (casePath, evalCase, fallback) => {
61
+ if (evalCase.id)
62
+ return evalCase.id;
63
+ if (fallback)
64
+ return fallback;
65
+ if (casePath === INLINE_CASE_PATH)
66
+ return "inline";
67
+ const base = basename(casePath);
68
+ const ext = extname(base);
69
+ return ext ? base.slice(0, -ext.length) : base;
70
+ };
71
+ const driverNameOf = (ref) => (typeof ref === "string" ? ref : ref.name);
72
+ const isRecord = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
73
+ /** Merge plugin config recursively so nested Codex `config`/`env` overrides stay additive. */
74
+ const mergePluginConfig = (base, local) => {
75
+ if (!isRecord(base) || !isRecord(local))
76
+ return local ?? base;
77
+ const merged = { ...base };
78
+ for (const [key, value] of Object.entries(local)) {
79
+ merged[key] = key in merged ? mergePluginConfig(merged[key], value) : value;
80
+ }
81
+ return merged;
82
+ };
83
+ export const resolveDriverReference = (evalCase, fallback) => {
84
+ const local = evalCase.driver;
85
+ if (!local) {
86
+ if (!fallback)
87
+ throw new Error("case names no driver and no defaultDriver is configured");
88
+ return fallback;
89
+ }
90
+ if (!fallback || driverNameOf(local) !== driverNameOf(fallback))
91
+ return local;
92
+ // Naming the same driver opts into project defaults. A case object only
93
+ // needs to carry the fields it wants to override (for example a timeout).
94
+ const baseConfig = typeof fallback === "object" ? fallback.config : undefined;
95
+ const localConfig = typeof local === "object" ? local.config : undefined;
96
+ return {
97
+ name: driverNameOf(local),
98
+ config: mergePluginConfig(baseConfig, localConfig),
99
+ };
100
+ };
101
+ export const resolveAnswererReference = (evalCase, fallback, harness, override) => {
102
+ const ref = override ?? evalCase.answerer ?? fallback;
103
+ const name = typeof ref === "string" ? ref : ref.name;
104
+ if (!harness || name !== "persona")
105
+ return ref;
106
+ return {
107
+ name: "persona",
108
+ config: mergeHarnessModelConfig(harness, typeof ref === "object" ? ref.config : undefined),
109
+ };
110
+ };
111
+ const answererNameOf = (ref) => (typeof ref === "string" ? ref : ref.name);
112
+ const driverConfigOf = (ref) => typeof ref === "object" ? ref.config : undefined;
113
+ const answererConfigOf = (ref) => typeof ref === "object" ? ref.config : undefined;
114
+ const EXPERIMENT_BEHAVIOR_SOURCE_ARGS = new Set([
115
+ "--continue",
116
+ "-c",
117
+ "--fork-session",
118
+ "--resume",
119
+ "-r",
120
+ "--add-dir",
121
+ "--append-system-prompt-file",
122
+ "--mcp-config",
123
+ "--plugin-dir",
124
+ "--settings",
125
+ "--setting-sources",
126
+ "--system-prompt-file",
127
+ ]);
128
+ const CODEX_EXPERIMENT_SOURCE_ARGS = new Set([
129
+ "--add-dir",
130
+ "--cd",
131
+ "-C",
132
+ "--config",
133
+ "-c",
134
+ "--profile",
135
+ "-p",
136
+ ]);
137
+ const bindSubprocessExperimentConfig = (config) => {
138
+ if (typeof config.command !== "string" || !isAbsolute(config.command)) {
139
+ throw new Error("experiment subprocess commands must be absolute direct wrappers so Lux can fingerprint the invoked behavior");
140
+ }
141
+ if (typeof config.cwd === "string") {
142
+ throw new Error("experiment runs do not allow an explicit subprocess cwd; use the candidate subject and staged fixtures");
143
+ }
144
+ if (Array.isArray(config.args) && config.args.length > 0) {
145
+ throw new Error("experiment subprocesses do not allow args; put stable behavior in the fingerprinted direct wrapper");
146
+ }
147
+ if (isRecord(config.env) && Object.keys(config.env).length > 0) {
148
+ throw new Error("experiment subprocesses do not allow custom env; put stable behavior in the fingerprinted direct wrapper");
149
+ }
150
+ return { ...config, inheritEnv: false };
151
+ };
152
+ const validateAgentExperimentConfig = (driverName, config) => {
153
+ const driverEnv = isRecord(config.env) ? config.env : {};
154
+ const commandResolutionOverride = Object.keys(driverEnv).find((name) => ["PATH", "PATHEXT"].includes(name.toUpperCase()));
155
+ if (commandResolutionOverride) {
156
+ throw new Error(`experiment runs do not allow driver env.${commandResolutionOverride}; command resolution must match the fingerprinted host executable`);
157
+ }
158
+ if (typeof config.cwd === "string") {
159
+ throw new Error(`experiment runs do not allow an explicit ${driverName} cwd; use the candidate subject and staged fixtures`);
160
+ }
161
+ const extraArgs = Array.isArray(config.extraArgs)
162
+ ? config.extraArgs.filter((value) => typeof value === "string")
163
+ : [];
164
+ const disallowedArgs = driverName === "claude-code" ? EXPERIMENT_BEHAVIOR_SOURCE_ARGS : CODEX_EXPERIMENT_SOURCE_ARGS;
165
+ const behaviorSourceArg = extraArgs.find((arg) => [...disallowedArgs].some((name) => arg === name || arg.startsWith(`${name}=`)));
166
+ if (behaviorSourceArg) {
167
+ throw new Error(`experiment runs do not allow behavior-bearing extraArgs '${behaviorSourceArg}'; use structured driver fields so Lux can fingerprint the source`);
168
+ }
169
+ const isolation = isRecord(config.isolation) ? config.isolation : {};
170
+ const structuredPaths = [
171
+ ...(driverName === "claude-code" && Array.isArray(config.pluginDirs) ? config.pluginDirs : []),
172
+ ...(Array.isArray(config.addDirs) ? config.addDirs : []),
173
+ ...(driverName === "claude-code" && Array.isArray(isolation.allowRead)
174
+ ? isolation.allowRead
175
+ : []),
176
+ ].filter((value) => typeof value === "string");
177
+ const relativeSource = structuredPaths.find((path) => !isAbsolute(path));
178
+ if (relativeSource) {
179
+ throw new Error(`experiment driver source paths must be absolute after subjectPath binding: ${relativeSource}`);
180
+ }
181
+ return { driverEnv, extraArgs };
182
+ };
183
+ const bindCodexExperimentConfig = (config, extraArgs) => {
184
+ if (typeof config.profile === "string") {
185
+ throw new Error("experiment runs do not allow a Codex profile; use inline driver config so Lux can fingerprint it");
186
+ }
187
+ if (config.ephemeral === false) {
188
+ throw new Error("experiment runs require ephemeral Codex sessions");
189
+ }
190
+ const inlineConfig = isRecord(config.config) ? config.config : {};
191
+ const externalConfigKey = (() => {
192
+ const visit = (value, parent = "") => {
193
+ for (const [key, nested] of Object.entries(value)) {
194
+ const path = parent ? `${parent}.${key}` : key;
195
+ if (/(?:mcp_servers|instructions_file|notify|project_doc)/i.test(key))
196
+ return path;
197
+ if (isRecord(nested)) {
198
+ const found = visit(nested, path);
199
+ if (found)
200
+ return found;
201
+ }
202
+ }
203
+ return undefined;
204
+ };
205
+ return visit(inlineConfig);
206
+ })();
207
+ if (externalConfigKey) {
208
+ throw new Error(`experiment runs do not allow path-bearing Codex config '${externalConfigKey}'`);
209
+ }
210
+ const appServer = config.interactionMode !== "exec";
211
+ return {
212
+ ...config,
213
+ ephemeral: true,
214
+ ignoreUserConfig: true,
215
+ ignoreRules: true,
216
+ ...(appServer && !config.isolation ? { isolation: { allowRead: [] } } : {}),
217
+ extraArgs,
218
+ };
219
+ };
220
+ const bindClaudeExperimentConfig = (config, extraArgs, driverEnv) => {
221
+ if (config.isolation)
222
+ return config;
223
+ return {
224
+ ...config,
225
+ extraArgs: [
226
+ ...extraArgs,
227
+ "--setting-sources",
228
+ "user",
229
+ "--strict-mcp-config",
230
+ "--settings",
231
+ JSON.stringify({ disableAllHooks: true }),
232
+ ],
233
+ env: {
234
+ ...driverEnv,
235
+ CLAUDE_CODE_DISABLE_AUTO_MEMORY: "1",
236
+ CLAUDE_CODE_DISABLE_CLAUDE_MDS: "1",
237
+ CLAUDE_CODE_SKIP_PROMPT_HISTORY: "1",
238
+ CLAUDE_CODE_DISABLE_BACKGROUND_TASKS: "1",
239
+ CLAUDE_CODE_AUTO_CONNECT_IDE: "false",
240
+ CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL: "1",
241
+ DISABLE_AUTOUPDATER: "1",
242
+ },
243
+ };
244
+ };
245
+ export const boundExperimentDriverConfig = (driverName, config, experimentId) => {
246
+ if (!experimentId || !isRecord(config))
247
+ return config;
248
+ if (driverName === "subprocess")
249
+ return bindSubprocessExperimentConfig(config);
250
+ if (driverName !== "claude-code" && driverName !== "codex")
251
+ return config;
252
+ const { driverEnv, extraArgs } = validateAgentExperimentConfig(driverName, config);
253
+ return driverName === "codex"
254
+ ? bindCodexExperimentConfig(config, extraArgs)
255
+ : bindClaudeExperimentConfig(config, extraArgs, driverEnv);
256
+ };
257
+ const closeQuietly = async (close, label) => {
258
+ try {
259
+ await close();
260
+ }
261
+ catch (err) {
262
+ // Cleanup failures must not shadow the original error or stop other
263
+ // cleanup; surface them on stderr.
264
+ process.stderr.write(`[lux] warning: ${label} close failed: ${errorMessage(err)}\n`);
265
+ }
266
+ };
267
+ export class Orchestrator {
268
+ evaluatorHash;
269
+ registry;
270
+ defaultAnswerer;
271
+ defaultDriver;
272
+ harness;
273
+ lifecycleFixtures;
274
+ constructor(options) {
275
+ this.registry = options.registry;
276
+ this.defaultAnswerer = options.defaultAnswerer ?? "persona";
277
+ this.defaultDriver = options.defaultDriver;
278
+ this.harness = options.harness;
279
+ this.lifecycleFixtures = [...(options.lifecycleFixtures ?? [])];
280
+ }
281
+ evaluatorImplementationIdentity() {
282
+ this.evaluatorHash ??= evaluatorImplementationHash();
283
+ return this.evaluatorHash;
284
+ }
285
+ async run(request) {
286
+ if (this.lifecycleFixtures.length > 0 && !request.suiteId) {
287
+ throw new Error("Orchestrator.run() cannot execute configured lifecycle fixtures; use runSuite() for a single case");
288
+ }
289
+ if (!request.case && !request.casePath) {
290
+ throw new Error("RunRequest requires either 'case' or 'casePath'");
291
+ }
292
+ if (request.case && request.casePath) {
293
+ throw new Error("RunRequest allows only one of 'case' or 'casePath', not both");
294
+ }
295
+ const casePath = request.casePath ? resolve(request.casePath) : INLINE_CASE_PATH;
296
+ const authoredCase = request.case ?? (await loadEvalCase(casePath));
297
+ const evalCase = bindSubjectRoot(authoredCase, request.subjectRoot);
298
+ const caseId = resolveCaseId(casePath, evalCase, request.caseId);
299
+ const validatedAssertionConfigs = await validateAssertionPlan(evalCase.assertions ?? [], this.registry);
300
+ const driverRef = resolveDriverReference(evalCase, this.defaultDriver);
301
+ const driverName = driverNameOf(driverRef);
302
+ const answererRef = resolveAnswererReference(evalCase, this.defaultAnswerer, this.harness, request.answererOverride);
303
+ const answererName = answererNameOf(answererRef);
304
+ const driverPlugin = this.registry.getDriver(driverName);
305
+ if (!driverPlugin) {
306
+ throw new Error(`no driver registered for '${driverName}'`);
307
+ }
308
+ const answererPlugin = this.registry.getAnswerer(answererName);
309
+ if (!answererPlugin) {
310
+ throw new Error(`no answerer registered for '${answererName}'`);
311
+ }
312
+ // Validate both configs before instantiating either plugin so a
313
+ // schema failure can't leak a half-initialized driver/answerer.
314
+ const driverCfg = boundExperimentDriverConfig(driverName, validatePluginConfig(driverPlugin.configSchema, driverConfigOf(driverRef), `driver '${driverName}'`), request.experimentId);
315
+ const answererCfg = validatePluginConfig(answererPlugin.configSchema, answererConfigOf(answererRef), `answerer '${answererName}'`);
316
+ const driver = await driverPlugin.create(driverCfg);
317
+ let answerer;
318
+ try {
319
+ answerer = await answererPlugin.create(answererCfg);
320
+ }
321
+ catch (err) {
322
+ await closeQuietly(() => driver.close(), `driver '${driverName}'`);
323
+ throw err;
324
+ }
325
+ try {
326
+ const assertionImplementations = assertionEvaluatorIdentities(authoredCase.assertions ?? [], this.registry);
327
+ const validatedAssertionsHash = valueHash(validatedAssertionConfigs);
328
+ const implementationHash = await this.evaluatorImplementationIdentity();
329
+ const graderHash = graderConfigHash({
330
+ luxVersion: LUX_VERSION,
331
+ implementationHash,
332
+ assertions: assertionImplementations,
333
+ validatedAssertionsHash,
334
+ graderContext: this.harness,
335
+ });
336
+ return await this.runWithPlugins({
337
+ request,
338
+ casePath,
339
+ authoredCase,
340
+ evalCase,
341
+ validatedAssertionConfigs,
342
+ caseId,
343
+ driverName,
344
+ answererName,
345
+ answererConfig: answererCfg,
346
+ driverConfigHash: valueHash(driverCfg),
347
+ answererConfigHash: valueHash(answererCfg),
348
+ validatedAssertionsHash,
349
+ graderConfigHash: graderHash,
350
+ evaluatorConfigHash: valueHash({
351
+ luxVersion: LUX_VERSION,
352
+ implementationHash,
353
+ harness: this.harness,
354
+ driver: { name: driverPlugin.name, create: driverPlugin.create },
355
+ answerer: { name: answererPlugin.name, create: answererPlugin.create },
356
+ assertions: assertionImplementations,
357
+ lifecycleFixtures: this.lifecycleFixtures,
358
+ validatedAssertionsHash,
359
+ }),
360
+ driver,
361
+ answerer,
362
+ });
363
+ }
364
+ finally {
365
+ await closeQuietly(() => driver.close(), `driver '${driverName}'`);
366
+ await closeQuietly(() => answerer.close(), `answerer '${answererName}'`);
367
+ }
368
+ }
369
+ /**
370
+ * Run cases through a bounded pool of `concurrency` workers, continuing on
371
+ * per-case failures and aggregating results in input order. `items` is the
372
+ * exact run list — repetition (`--loop`) is the caller repeating entries.
373
+ */
374
+ async runSuite(items, opts) {
375
+ const observer = opts.observer;
376
+ const requestedConcurrency = validateSuiteConcurrency(opts.concurrency);
377
+ const concurrency = Math.min(requestedConcurrency, Math.max(items.length, 1));
378
+ const suite = await openSuiteRun({
379
+ runsRoot: opts.runsRoot,
380
+ concurrency,
381
+ items,
382
+ ...(opts.profileId ? { profileId: opts.profileId } : {}),
383
+ ...(opts.experimentId ? { experimentId: opts.experimentId } : {}),
384
+ ...(opts.experimentUnitId ? { experimentUnitId: opts.experimentUnitId } : {}),
385
+ ...(opts.experimentAttemptId ? { experimentAttemptId: opts.experimentAttemptId } : {}),
386
+ ...(opts.variantId ? { variantId: opts.variantId } : {}),
387
+ ...(opts.candidateId ? { candidateId: opts.candidateId } : {}),
388
+ ...(opts.subjectHash ? { subjectHash: opts.subjectHash } : {}),
389
+ fixtures: this.lifecycleFixtures.map(({ name, pluginVersion }) => ({
390
+ name,
391
+ pluginVersion,
392
+ })),
393
+ });
394
+ const persistSuite = serializeEffect(suite.write);
395
+ const persistTerminalSuite = async (lifecycleFinalization) => {
396
+ suite.manifest.aborted = lifecycleFinalization.status === "aborted";
397
+ suite.manifest.endedAt ??= new Date().toISOString();
398
+ suite.manifest.status =
399
+ lifecycleFinalization.status === "succeeded" ? "passed" : lifecycleFinalization.status;
400
+ if (lifecycleFinalization.error === null) {
401
+ delete suite.manifest.errorMessage;
402
+ }
403
+ else {
404
+ suite.manifest.errorMessage = errorMessage(lifecycleFinalization.error);
405
+ }
406
+ await persistSuite();
407
+ };
408
+ const startCase = guardObserverCallback(observer?.caseStart?.bind(observer));
409
+ const caseHandles = new Array(items.length);
410
+ const hookContext = {
411
+ suiteId: suite.manifest.suiteId,
412
+ suiteDir: suite.path,
413
+ runsRoot: resolve(opts.runsRoot),
414
+ concurrency,
415
+ items: items.map((item) => ({
416
+ id: item.id,
417
+ caseId: item.caseId ?? item.id,
418
+ path: resolve(item.path),
419
+ })),
420
+ ...(opts.abortSignal ? { abortSignal: opts.abortSignal } : {}),
421
+ };
422
+ let cleanupSuiteHooks = async () => undefined;
423
+ if (!opts.abortSignal?.aborted) {
424
+ try {
425
+ cleanupSuiteHooks = await setupLifecycleHooks(this.lifecycleFixtures, "suite", (hook) => hook.setupSuite?.(hookContext), opts.abortSignal);
426
+ }
427
+ catch (error) {
428
+ const aborted = causedByAbort(error, opts.abortSignal);
429
+ const failed = {
430
+ status: aborted ? "aborted" : "failed",
431
+ items: items.map(() => ({ status: "pending", result: null })),
432
+ results: [],
433
+ error: aborted ? null : error,
434
+ };
435
+ await persistTerminalSuite(failed);
436
+ await writeSuiteSummary(suite.path, buildSuiteSummary(suite.manifest, failed.items.map(() => undefined)));
437
+ if (aborted) {
438
+ return { results: [], aborted: true, suiteDir: suite.path };
439
+ }
440
+ throw error;
441
+ }
442
+ }
443
+ const effects = {
444
+ itemStarted: async (index) => {
445
+ const suiteItem = suite.manifest.items[index];
446
+ if (suiteItem)
447
+ suiteItem.status = "running";
448
+ await persistSuite();
449
+ },
450
+ runItem: async (index) => {
451
+ const item = items[index];
452
+ if (!item)
453
+ throw new Error(`suite item ${index} is missing`);
454
+ const handle = startCase({ caseId: item.id, index, total: items.length }) ?? undefined;
455
+ caseHandles[index] = handle;
456
+ let cleanupCaseHooks;
457
+ try {
458
+ cleanupCaseHooks = await setupLifecycleHooks(this.lifecycleFixtures, "case", (hook) => hook.setupCase?.({
459
+ ...hookContext,
460
+ index,
461
+ item: hookContext.items[index] ?? {
462
+ id: item.id,
463
+ caseId: item.caseId ?? item.id,
464
+ path: resolve(item.path),
465
+ },
466
+ }), opts.abortSignal);
467
+ }
468
+ catch (err) {
469
+ return {
470
+ caseId: item.id,
471
+ runDir: null,
472
+ exitReason: "error",
473
+ casePassed: null,
474
+ errorMessage: errorMessage(err),
475
+ };
476
+ }
477
+ let outcome;
478
+ try {
479
+ const result = await this.run({
480
+ casePath: item.path,
481
+ caseId: item.caseId ?? item.id,
482
+ runsRoot: opts.runsRoot,
483
+ fixturesRoot: opts.fixturesRoot,
484
+ answererOverride: opts.answererOverride,
485
+ observer: handle ?? observer,
486
+ abortSignal: opts.abortSignal,
487
+ suiteId: suite.manifest.suiteId,
488
+ subjectRoot: opts.subjectRoot,
489
+ subjectHash: opts.subjectHash,
490
+ profileId: opts.profileId,
491
+ experimentId: opts.experimentId,
492
+ variantId: opts.variantId,
493
+ candidateId: opts.candidateId,
494
+ ...(opts.recordGradingAssertion
495
+ ? { recordGradingAssertion: opts.recordGradingAssertion }
496
+ : {}),
497
+ ...(opts.recordPreGradingAccounting
498
+ ? { recordPreGradingAccounting: opts.recordPreGradingAccounting }
499
+ : {}),
500
+ ...(opts.recordModelAttemptStart
501
+ ? { recordModelAttemptStart: opts.recordModelAttemptStart }
502
+ : {}),
503
+ ...(opts.recordModelAttemptComplete
504
+ ? { recordModelAttemptComplete: opts.recordModelAttemptComplete }
505
+ : {}),
506
+ ...(opts.recordModelAttemptsComplete
507
+ ? { recordModelAttemptsComplete: opts.recordModelAttemptsComplete }
508
+ : {}),
509
+ });
510
+ outcome = {
511
+ caseId: item.id,
512
+ runDir: result.runDir,
513
+ exitReason: result.exitReason,
514
+ casePassed: result.grading.casePassed,
515
+ result,
516
+ };
517
+ }
518
+ catch (err) {
519
+ outcome = {
520
+ caseId: item.id,
521
+ runDir: runDirOfError(err),
522
+ exitReason: "error",
523
+ casePassed: false,
524
+ errorMessage: errorMessage(err),
525
+ };
526
+ }
527
+ try {
528
+ await cleanupCaseHooks();
529
+ }
530
+ catch (caughtCleanupError) {
531
+ let cleanupError = caughtCleanupError;
532
+ if (outcome.result) {
533
+ try {
534
+ await recordLifecycleCleanupFailure(outcome.result, caughtCleanupError);
535
+ }
536
+ catch (persistenceError) {
537
+ cleanupError = combineLifecycleFailures(caughtCleanupError, persistenceError, `case '${item.id}' lifecycle cleanup and run persistence failed`);
538
+ }
539
+ }
540
+ const failure = outcome.errorMessage
541
+ ? combineLifecycleFailures(new Error(outcome.errorMessage), cleanupError, `case '${item.id}' and its lifecycle cleanup failed`)
542
+ : cleanupError;
543
+ outcome = {
544
+ ...outcome,
545
+ exitReason: "error",
546
+ casePassed: null,
547
+ errorMessage: errorMessage(failure),
548
+ };
549
+ }
550
+ return outcome;
551
+ },
552
+ itemCompleted: async (index, outcome) => {
553
+ const suiteItem = suite.manifest.items[index];
554
+ if (suiteItem) {
555
+ suiteItem.status = "completed";
556
+ suiteItem.runDir = outcome.runDir ? suite.relativeRunDir(outcome.runDir) : null;
557
+ suiteItem.exitReason = outcome.exitReason;
558
+ suiteItem.casePassed = outcome.casePassed;
559
+ if (outcome.errorMessage)
560
+ suiteItem.errorMessage = outcome.errorMessage;
561
+ }
562
+ await persistSuite();
563
+ const handle = caseHandles[index];
564
+ guardObserverCallback(handle?.end?.bind(handle))(outcome);
565
+ },
566
+ resultFailed: (result) => result.exitReason !== "done" || result.casePassed === false,
567
+ finalize: async (lifecycleFinalization) => {
568
+ let terminalFinalization = lifecycleFinalization;
569
+ try {
570
+ await cleanupSuiteHooks();
571
+ }
572
+ catch (cleanupError) {
573
+ terminalFinalization = {
574
+ ...lifecycleFinalization,
575
+ status: "failed",
576
+ error: lifecycleFinalization.error === null
577
+ ? cleanupError
578
+ : combineLifecycleFailures(lifecycleFinalization.error, cleanupError, "suite execution and lifecycle cleanup failed"),
579
+ };
580
+ }
581
+ let finalizationError = terminalFinalization.error;
582
+ try {
583
+ await persistTerminalSuite(terminalFinalization);
584
+ }
585
+ catch (persistenceError) {
586
+ finalizationError =
587
+ finalizationError === null
588
+ ? persistenceError
589
+ : combineLifecycleFailures(finalizationError, persistenceError, "suite finalization and manifest persistence failed");
590
+ }
591
+ const slots = terminalFinalization.items.map((item) => item.result ?? undefined);
592
+ try {
593
+ await writeSuiteSummary(suite.path, buildSuiteSummary(suite.manifest, slots));
594
+ }
595
+ catch (error) {
596
+ const summaryError = new Error(`suite summary persistence failed: ${errorMessage(error)}`, {
597
+ cause: error,
598
+ });
599
+ finalizationError =
600
+ finalizationError === null
601
+ ? summaryError
602
+ : combineLifecycleFailures(finalizationError, summaryError, "suite finalization and summary persistence failed");
603
+ }
604
+ if (finalizationError !== lifecycleFinalization.error) {
605
+ throw finalizationError;
606
+ }
607
+ },
608
+ recordFinalizationFailure: persistTerminalSuite,
609
+ };
610
+ const finalization = await executeSuiteLifecycle({
611
+ itemCount: items.length,
612
+ concurrency,
613
+ ...(opts.abortSignal ? { abortSignal: opts.abortSignal } : {}),
614
+ effects,
615
+ });
616
+ return {
617
+ results: [...finalization.results],
618
+ aborted: finalization.status === "aborted",
619
+ suiteDir: suite.path,
620
+ };
621
+ }
622
+ runWithPlugins(args) {
623
+ return executeRunWithPlugins({
624
+ ...args,
625
+ luxVersion: LUX_VERSION,
626
+ registry: this.registry,
627
+ });
628
+ }
629
+ }
630
+ // Internal exports for testing
631
+ export { closeQuietly, closeRunDirectory, phaseDurations, serializeEffect };
632
+ //# sourceMappingURL=orchestrator.js.map