@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,260 @@
1
+ import type { z } from "zod";
2
+ import {
3
+ type Assertion,
4
+ type AssertionImpl,
5
+ type AssertionProgress,
6
+ AssertionResultSchema,
7
+ type GradingAssertionEntry,
8
+ type GradingReport,
9
+ guardRunObserver,
10
+ type Registry,
11
+ type Run,
12
+ type RunObserver,
13
+ valueHash,
14
+ } from "../core/index.js";
15
+ import { validatePluginConfigAsync } from "./validate-plugin-config.js";
16
+
17
+ const FRAMEWORK_KEYS = new Set(["id", "type", "name", "weight", "threshold"]);
18
+
19
+ const shapeOf = (schema: z.ZodTypeAny): Record<string, unknown> | null => {
20
+ const shape = (schema as { shape?: unknown }).shape;
21
+ return shape && typeof shape === "object" ? (shape as Record<string, unknown>) : null;
22
+ };
23
+
24
+ /**
25
+ * A `.strict()` plugin schema must not choke on framework keys it never
26
+ * declared, while one that does declare them (rubric's `threshold`,
27
+ * tool-called's `name`) keeps receiving them. Non-object schemas expose no
28
+ * shape to consult, so they get the assertion as-is.
29
+ */
30
+ export const assertionConfigForSchema = (a: Assertion, schema: z.ZodTypeAny): unknown => {
31
+ const shape = shapeOf(schema);
32
+ if (!shape) return a;
33
+ return Object.fromEntries(
34
+ Object.entries(a).filter(([key]) => !FRAMEWORK_KEYS.has(key) || key in shape),
35
+ );
36
+ };
37
+
38
+ export type AssertionPluginIdentity = {
39
+ type: string;
40
+ pluginVersion: string | null;
41
+ };
42
+
43
+ export type AssertionEvaluatorIdentity = AssertionPluginIdentity & {
44
+ evaluate: AssertionImpl["evaluate"];
45
+ };
46
+
47
+ export const assertionEvaluatorIdentities = (
48
+ assertions: readonly Assertion[],
49
+ registry: Registry,
50
+ ): AssertionEvaluatorIdentity[] =>
51
+ [...new Set(assertions.map((assertion) => assertion.type))].sort().map((type) => {
52
+ const implementation = registry.getAssertion(type);
53
+ if (!implementation) throw new Error(`unknown assertion type: ${type}`);
54
+ return {
55
+ type,
56
+ pluginVersion:
57
+ "pluginVersion" in implementation && typeof implementation.pluginVersion === "string"
58
+ ? implementation.pluginVersion
59
+ : null,
60
+ evaluate: implementation.evaluate,
61
+ };
62
+ });
63
+
64
+ export const assertionPluginIdentities = (
65
+ assertions: readonly Assertion[],
66
+ registry: Registry,
67
+ ): AssertionPluginIdentity[] =>
68
+ assertionEvaluatorIdentities(assertions, registry).map(({ type, pluginVersion }) => ({
69
+ type,
70
+ pluginVersion,
71
+ }));
72
+
73
+ export const graderConfigHash = (input: {
74
+ luxVersion: string;
75
+ implementationHash: string;
76
+ assertions: readonly AssertionEvaluatorIdentity[];
77
+ validatedAssertionsHash: string;
78
+ graderContext?: unknown;
79
+ }): string =>
80
+ valueHash({
81
+ luxVersion: input.luxVersion,
82
+ implementationHash: input.implementationHash,
83
+ assertions: input.assertions,
84
+ validatedAssertionsHash: input.validatedAssertionsHash,
85
+ graderContext: input.graderContext ?? null,
86
+ });
87
+
88
+ export const validateAssertionPlan = async (
89
+ assertions: readonly Assertion[],
90
+ registry: Registry,
91
+ ): Promise<unknown[]> => {
92
+ const validated: unknown[] = [];
93
+ // Async refinements may allocate workers or other bounded resources.
94
+ // Validate in authored order so an unbounded assertion list cannot fan
95
+ // those resources out before the subject driver even starts.
96
+ for (const [index, assertion] of assertions.entries()) {
97
+ const implementation = registry.getAssertion(assertion.type);
98
+ if (!implementation) {
99
+ throw new Error(
100
+ `invalid assertion plan at assertions[${index}]: no assertion implementation registered for type '${assertion.type}'`,
101
+ );
102
+ }
103
+ validated.push(
104
+ await validatePluginConfigAsync(
105
+ implementation.configSchema,
106
+ implementation.configSchema
107
+ ? assertionConfigForSchema(assertion, implementation.configSchema)
108
+ : assertion,
109
+ `assertion '${assertion.type}' at assertions[${index}]`,
110
+ ),
111
+ );
112
+ }
113
+ return validated;
114
+ };
115
+
116
+ const describeAssertion = (a: Assertion): string => {
117
+ if (a.name) return a.name;
118
+ const fields = Object.entries(a)
119
+ .filter(([k, v]) => !FRAMEWORK_KEYS.has(k) && typeof v !== "function")
120
+ .map(([k, v]) => `${k}=${typeof v === "string" ? v : JSON.stringify(v)}`)
121
+ .join(" ");
122
+ return fields ? `${a.type} ${fields}` : a.type;
123
+ };
124
+
125
+ export const gradeRun = async (
126
+ run: Run,
127
+ registry: Registry,
128
+ observer?: RunObserver,
129
+ abortSignal?: AbortSignal,
130
+ recordAssertion?: (entry: GradingAssertionEntry, index: number) => void | Promise<void>,
131
+ modelAttempts?: {
132
+ start: (kind: "judge") => string | Promise<string>;
133
+ complete: (attemptIds: readonly string[]) => void | Promise<void>;
134
+ },
135
+ validatedConfigs?: readonly unknown[],
136
+ ): Promise<GradingReport> => {
137
+ const guardedObserver = guardRunObserver(observer);
138
+ const assertions = run.case.assertions ?? [];
139
+ if (assertions.length === 0) {
140
+ return { schemaVersion: 1, casePassed: null, caseScore: null, assertions: [] };
141
+ }
142
+
143
+ const entries: GradingAssertionEntry[] = [];
144
+ let weightedScoreSum = 0;
145
+ let weightSum = 0;
146
+ let allPassed = true;
147
+ let gradingIncomplete = false;
148
+
149
+ for (const [index, a] of assertions.entries()) {
150
+ // Grading is the last cancellation point — an LLM judge can run for
151
+ // minutes per assertion. An aborted grade can't claim everything passed.
152
+ if (abortSignal?.aborted) {
153
+ gradingIncomplete = true;
154
+ break;
155
+ }
156
+ const impl = registry.getAssertion(a.type);
157
+ const weight = a.weight ?? 1;
158
+ // `threshold` is an OPTIONAL extra score floor layered on top of the
159
+ // assertion's own verdict (`result.passed`). Default 0 means "no floor",
160
+ // so a graded assertion like `rubric` passes on its own bar (judge
161
+ // score >= 0.8). A non-zero default here would force every sub-1.0
162
+ // graded score to fail even when the assertion reports passed.
163
+ const threshold = a.threshold ?? 0;
164
+ const id = a.id ?? `${a.type}:${index + 1}`;
165
+ const name = describeAssertion(a);
166
+ const progress: AssertionProgress = {
167
+ index,
168
+ total: assertions.length,
169
+ id,
170
+ type: a.type,
171
+ name,
172
+ };
173
+ guardedObserver?.assertionStart?.(progress);
174
+ const startedAt = Date.now();
175
+ let entry: GradingAssertionEntry;
176
+ const assertionAttemptIds: string[] = [];
177
+
178
+ try {
179
+ if (!impl) throw new Error(`no assertion implementation registered for type '${a.type}'`);
180
+ const validated = validatedConfigs
181
+ ? validatedConfigs[index]
182
+ : await validatePluginConfigAsync(
183
+ impl.configSchema,
184
+ impl.configSchema ? assertionConfigForSchema(a, impl.configSchema) : a,
185
+ `assertion '${a.type}'`,
186
+ );
187
+ if (validatedConfigs && index >= validatedConfigs.length) {
188
+ throw new Error(`validated assertion plan is missing assertions[${index}]`);
189
+ }
190
+ // Pass the validated config so schema defaults (e.g. timeoutMs)
191
+ // reach evaluate(); the raw assertion object has none applied.
192
+ const result = AssertionResultSchema.parse(
193
+ await impl.evaluate(validated as typeof a, run, {
194
+ ...(abortSignal ? { abortSignal } : {}),
195
+ ...(modelAttempts
196
+ ? {
197
+ recordModelAttemptStart: async (_kind: "judge") => {
198
+ assertionAttemptIds.push(await modelAttempts.start("judge"));
199
+ },
200
+ }
201
+ : {}),
202
+ }),
203
+ );
204
+ const passed =
205
+ result.errorMessage === undefined && result.passed && result.score >= threshold;
206
+ entry = {
207
+ id,
208
+ type: a.type,
209
+ name,
210
+ passed,
211
+ score: result.score,
212
+ weight,
213
+ threshold,
214
+ durationMs: Date.now() - startedAt,
215
+ ...(result.comment !== undefined ? { comment: result.comment } : {}),
216
+ detail: result.detail,
217
+ ...(result.errorMessage !== undefined ? { errorMessage: result.errorMessage } : {}),
218
+ ...(result.usage ? { usage: result.usage } : {}),
219
+ };
220
+ if (result.errorMessage !== undefined) {
221
+ gradingIncomplete = true;
222
+ } else {
223
+ if (!passed) allPassed = false;
224
+ weightedScoreSum += weight * result.score;
225
+ weightSum += weight;
226
+ }
227
+ } catch (err) {
228
+ const message = err instanceof Error ? err.message : String(err);
229
+ entry = {
230
+ id,
231
+ type: a.type,
232
+ name,
233
+ passed: false,
234
+ score: 0,
235
+ weight,
236
+ threshold,
237
+ durationMs: Date.now() - startedAt,
238
+ errorMessage: message,
239
+ };
240
+ gradingIncomplete = true;
241
+ }
242
+
243
+ entries.push(entry);
244
+ guardedObserver?.assertionEnd?.(progress, entry);
245
+ await recordAssertion?.(entry, index);
246
+ await modelAttempts?.complete(assertionAttemptIds);
247
+ }
248
+
249
+ let caseScore: number | null = null;
250
+ if (!gradingIncomplete) caseScore = weightSum > 0 ? weightedScoreSum / weightSum : 0;
251
+ return {
252
+ schemaVersion: 1,
253
+ casePassed: gradingIncomplete ? null : allPassed,
254
+ caseScore,
255
+ assertions: entries,
256
+ ...(gradingIncomplete
257
+ ? { incomplete: { exitReason: "error" as const, phase: "grading" as const } }
258
+ : {}),
259
+ };
260
+ };
@@ -0,0 +1,186 @@
1
+ // Public orchestration surface. Keep this list explicit: several orchestrator
2
+ // modules export helpers solely for focused contract tests, and a wildcard
3
+ // here would silently turn the next such helper into package API.
4
+ export {
5
+ assertDisjointAnnotationSplits,
6
+ type LoadedGraderAnnotations,
7
+ LoadedGraderAnnotationsSchema,
8
+ loadGraderAnnotations,
9
+ selectGraderAnnotations,
10
+ } from "./annotation-loader.js";
11
+ export { upsertGraderAnnotation } from "./annotation-store.js";
12
+ export {
13
+ applyCandidate,
14
+ captureSeedCandidate,
15
+ createCandidate,
16
+ hashSubjectTree,
17
+ materializeCandidate,
18
+ validateCandidate,
19
+ } from "./candidates.js";
20
+ export {
21
+ type ComparisonInput,
22
+ compareRuns,
23
+ formatComparisonText,
24
+ type GradingDelta,
25
+ hasRegression,
26
+ loadRunBundle,
27
+ type RunBundle,
28
+ type RunComparison,
29
+ } from "./compare.js";
30
+ export {
31
+ buildRegistryFromConfig,
32
+ type ExperimentProfile,
33
+ ExperimentProfileSchema,
34
+ findConfigFile,
35
+ type LuxConfig,
36
+ loadLuxConfig,
37
+ type ResolvedLuxConfig,
38
+ } from "./config.js";
39
+ export {
40
+ type CaseFilter,
41
+ type DiscoveredCase,
42
+ type DiscoveryProblem,
43
+ type DiscoveryResult,
44
+ discoverCases,
45
+ selectCases,
46
+ } from "./discover.js";
47
+ export {
48
+ type DoctorCampaignReport,
49
+ DoctorCampaignReportSchema,
50
+ type DoctorDiagnostic,
51
+ DoctorDiagnosticSchema,
52
+ type DoctorOptions,
53
+ DoctorOptionsSchema,
54
+ type DoctorReport,
55
+ DoctorReportSchema,
56
+ doctorProject,
57
+ formatDoctorReport,
58
+ } from "./doctor.js";
59
+ export {
60
+ type CampaignExecutionOptions,
61
+ type CampaignExecutionResult,
62
+ CampaignExecutionResultSchema,
63
+ deriveExperimentSelection,
64
+ type ExperimentCampaignPlan,
65
+ ExperimentCampaignPlanSchema,
66
+ type ExperimentDecisionCandidate,
67
+ ExperimentDecisionCandidateSchema,
68
+ optimizeExperimentCampaign,
69
+ paretoFrontier,
70
+ planExperimentCampaign,
71
+ rankCandidates,
72
+ runExperimentCampaign,
73
+ } from "./experiment.js";
74
+ export {
75
+ type ExperimentCommandMode,
76
+ ExperimentCommandModeSchema,
77
+ experimentCampaignMode,
78
+ type LoadedExperimentCampaign,
79
+ LoadedExperimentCampaignSchema,
80
+ loadExperimentCampaign,
81
+ resolveExperimentCampaignPath,
82
+ } from "./experiment-loader.js";
83
+ export {
84
+ createExperimentDecisionReport,
85
+ type ExperimentDecisionReport,
86
+ ExperimentDecisionReportSchema,
87
+ formatExperimentDecisionMarkdown,
88
+ loadExperimentDecisionReport,
89
+ loadVerifiedExperimentDecisionSnapshot,
90
+ type VerifiedExperimentDecisionSnapshot,
91
+ VerifiedExperimentDecisionSnapshotSchema,
92
+ verifyExperimentDecisionIntegrity,
93
+ } from "./experiment-report.js";
94
+ export {
95
+ type ExperimentBudgetUsage,
96
+ type ExperimentEvaluation,
97
+ type ExperimentRun,
98
+ ExperimentRunSchema,
99
+ type ExperimentSelection,
100
+ ExperimentSelectionSchema,
101
+ formatExperimentRun,
102
+ formatExperimentRunsTable,
103
+ isExperimentRun,
104
+ listExperimentRuns,
105
+ loadExperimentCandidate,
106
+ loadExperimentCandidates,
107
+ loadExperimentRun,
108
+ migrateExperimentCandidateIntegrity,
109
+ verifyExperimentRunIntegrity,
110
+ } from "./experiment-runs.js";
111
+ export {
112
+ compareGraderAnnotation,
113
+ evaluateGraderCandidate,
114
+ type GraderEvaluationEvidence,
115
+ GraderEvaluationEvidenceSchema,
116
+ type GraderJudgment,
117
+ summarizeGraderEvidence,
118
+ } from "./grader-experiment.js";
119
+ export { gradeRun, validateAssertionPlan } from "./grading.js";
120
+ export {
121
+ formatRunDetail,
122
+ formatRunsTable,
123
+ type ListedRun,
124
+ listRuns,
125
+ loadRunDetail,
126
+ type RunDetail,
127
+ } from "./list-runs.js";
128
+ export { loadEvalCase } from "./loader.js";
129
+ // The resolution and run-directory helpers exported by orchestrator.ts exist
130
+ // for its own contract tests; the class and observer/request types are the
131
+ // supported programmatic runner.
132
+ export {
133
+ type CaseObserver,
134
+ Orchestrator,
135
+ type OrchestratorOptions,
136
+ type RunRequest,
137
+ type RunResult,
138
+ type SuiteCaseResult,
139
+ type SuiteItem,
140
+ type SuiteObserver,
141
+ } from "./orchestrator.js";
142
+ export {
143
+ GRADING_SNAPSHOT_SCHEMA_VERSION,
144
+ type GradingSnapshot,
145
+ GradingSnapshotSchema,
146
+ loadFrozenRegradableRun,
147
+ loadRegradableRun,
148
+ regradeRun,
149
+ releaseFrozenRegradableRun,
150
+ } from "./regrade.js";
151
+ export { loadRubricDefinition } from "./rubric-loader.js";
152
+ export {
153
+ compareSuiteRuns,
154
+ compareSuiteSummaries,
155
+ formatSuiteComparisonText,
156
+ hasSuiteRegression,
157
+ type SuiteCaseComparison,
158
+ SuiteCaseComparisonSchema,
159
+ type SuiteComparison,
160
+ SuiteComparisonSchema,
161
+ } from "./suite-compare.js";
162
+ // openSuiteRun is persistence plumbing; callers create suites through
163
+ // Orchestrator and consume them through these read APIs.
164
+ export {
165
+ formatSuiteRunDetail,
166
+ formatSuiteRunsTable,
167
+ listSuiteRuns,
168
+ loadSuiteRun,
169
+ type SuiteRun,
170
+ type SuiteRunItem,
171
+ SuiteRunSchema,
172
+ } from "./suite-runs.js";
173
+ export {
174
+ buildSuiteSummary,
175
+ type CaseSummary,
176
+ loadSuiteSummary,
177
+ type MetricSummary,
178
+ MetricSummarySchema,
179
+ type OutcomeSummary,
180
+ type SuiteSample,
181
+ SuiteSampleSchema,
182
+ type SuiteSummary,
183
+ SuiteSummarySchema,
184
+ summarizeNumbers,
185
+ writeSuiteSummary,
186
+ } from "./suite-summary.js";
@@ -0,0 +1,90 @@
1
+ import type { LifecycleHookCleanup, LifecycleHooksPlugin } from "../core/index.js";
2
+
3
+ type RegisteredLifecycleCleanup = {
4
+ label: string;
5
+ cleanup: LifecycleHookCleanup;
6
+ };
7
+
8
+ const errorMessage = (error: unknown): string =>
9
+ error instanceof Error ? error.message : String(error);
10
+
11
+ const lifecycleError = (label: string, phase: "setup" | "cleanup", error: unknown): Error =>
12
+ new Error(`${label} ${phase} failed: ${errorMessage(error)}`, { cause: error });
13
+
14
+ const cleanupLifecycleHooks = async (
15
+ cleanups: readonly RegisteredLifecycleCleanup[],
16
+ ): Promise<void> => {
17
+ const failures: Error[] = [];
18
+ for (const { label, cleanup } of [...cleanups].reverse()) {
19
+ try {
20
+ await cleanup();
21
+ } catch (error) {
22
+ failures.push(lifecycleError(label, "cleanup", error));
23
+ }
24
+ }
25
+ if (failures.length === 1) throw failures[0];
26
+ if (failures.length > 1) {
27
+ throw new AggregateError(failures, "multiple lifecycle hook cleanups failed");
28
+ }
29
+ };
30
+
31
+ export const setupLifecycleHooks = async (
32
+ hooks: readonly LifecycleHooksPlugin[],
33
+ scope: "suite" | "case",
34
+ invoke: (
35
+ hook: LifecycleHooksPlugin,
36
+ ) => LifecycleHookCleanup | undefined | Promise<LifecycleHookCleanup | undefined>,
37
+ abortSignal?: AbortSignal,
38
+ ): Promise<LifecycleHookCleanup> => {
39
+ const cleanups: RegisteredLifecycleCleanup[] = [];
40
+ try {
41
+ for (const hook of hooks) {
42
+ abortSignal?.throwIfAborted();
43
+ const label = `lifecycle hook '${hook.name}' ${scope}`;
44
+ let cleanup: LifecycleHookCleanup | undefined;
45
+ try {
46
+ cleanup = await invoke(hook);
47
+ } catch (error) {
48
+ throw lifecycleError(label, "setup", error);
49
+ }
50
+ if (cleanup !== undefined && typeof cleanup !== "function") {
51
+ throw new TypeError(`${label} setup returned a non-function cleanup`);
52
+ }
53
+ if (cleanup) cleanups.push({ label, cleanup });
54
+ abortSignal?.throwIfAborted();
55
+ }
56
+ } catch (error) {
57
+ let cleanupError: unknown;
58
+ try {
59
+ await cleanupLifecycleHooks(cleanups);
60
+ } catch (cleanupFailure) {
61
+ cleanupError = cleanupFailure;
62
+ }
63
+ const setupError =
64
+ error instanceof Error &&
65
+ (/lifecycle hook '.+' (suite|case) setup/.test(error.message) ||
66
+ /returned a non-function cleanup/.test(error.message))
67
+ ? error
68
+ : lifecycleError(`lifecycle hook ${scope}`, "setup", error);
69
+ if (cleanupError) {
70
+ throw new AggregateError(
71
+ [setupError, cleanupError],
72
+ `${scope} lifecycle setup and rollback failed`,
73
+ );
74
+ }
75
+ throw setupError;
76
+ }
77
+
78
+ let cleaned = false;
79
+ return async () => {
80
+ if (cleaned) return;
81
+ cleaned = true;
82
+ await cleanupLifecycleHooks(cleanups);
83
+ };
84
+ };
85
+
86
+ export const combineLifecycleFailures = (
87
+ primary: unknown,
88
+ cleanup: unknown,
89
+ message: string,
90
+ ): AggregateError => new AggregateError([primary, cleanup], message);