@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,156 @@
1
+ import { z } from "zod";
2
+ import type { Assertion } from "./case.js";
3
+ import { ErrorEventReasonSchema } from "./events.js";
4
+ import type { Run } from "./run.js";
5
+ import { TokenUsageSchema } from "./usage.js";
6
+
7
+ export const AssertionResultSchema = z.object({
8
+ passed: z.boolean(),
9
+ score: z.number().min(0).max(1),
10
+ comment: z.exactOptional(z.string()),
11
+ detail: z.unknown().optional(),
12
+ /** Present when the assertion could not produce a judgment. */
13
+ errorMessage: z.exactOptional(z.string()),
14
+ /** Tokens the assertion itself spent. Only LLM-judge assertions report this. */
15
+ usage: z.exactOptional(TokenUsageSchema),
16
+ });
17
+ export type AssertionResult = z.infer<typeof AssertionResultSchema>;
18
+
19
+ export type EvaluateContext = {
20
+ /**
21
+ * Fires when the run is being torn down. Long-running assertions (an LLM
22
+ * judge, a shell command) must cancel their in-flight work, or a Ctrl-C
23
+ * leaves billable subprocesses running past the run's end.
24
+ */
25
+ abortSignal?: AbortSignal;
26
+ /**
27
+ * Persists a judge-attempt start before an assertion invokes its provider.
28
+ * Grading marks it complete only after assertion spend is journaled.
29
+ */
30
+ recordModelAttemptStart?: (kind: "judge") => Promise<void>;
31
+ };
32
+
33
+ // Not schema-derived: generic config type, `evaluate` is a method.
34
+ export interface AssertionImpl<C extends Assertion = Assertion> {
35
+ type: C["type"];
36
+ configSchema?: z.ZodTypeAny;
37
+ evaluate(config: C, run: Run, ctx?: EvaluateContext): Promise<AssertionResult>;
38
+ }
39
+
40
+ /**
41
+ * Public assertion extension contract. Unlike the lower-level
42
+ * `AssertionImpl`, plugins must describe their case configuration so Lux can
43
+ * reject invalid plans before starting a subject run.
44
+ */
45
+ export type AssertionPlugin<C extends Assertion = Assertion> = AssertionImpl<C> & {
46
+ configSchema: z.ZodObject & z.ZodType<C>;
47
+ /** Author-maintained identity for evaluator/schema behavior. */
48
+ pluginVersion: string;
49
+ };
50
+
51
+ type SchemaAssertion<S extends z.ZodObject> = z.output<S> extends Assertion ? z.output<S> : never;
52
+
53
+ type IsUnion<T, Whole = T> = T extends Whole ? ([Whole] extends [T] ? false : true) : never;
54
+
55
+ type SingleStringLiteral<T> = T extends string
56
+ ? string extends T
57
+ ? never
58
+ : true extends IsUnion<T>
59
+ ? never
60
+ : T
61
+ : never;
62
+
63
+ type LiteralAssertionType<S extends z.ZodObject> =
64
+ SchemaAssertion<S> extends { type: infer OutputType }
65
+ ? z.input<S> extends { type: infer InputType }
66
+ ? SingleStringLiteral<OutputType> extends infer Literal extends string
67
+ ? [InputType, Literal] extends [Literal, InputType]
68
+ ? Literal
69
+ : never
70
+ : never
71
+ : never
72
+ : never;
73
+
74
+ export type AssertionPluginDefinition<S extends z.ZodObject> = {
75
+ type: LiteralAssertionType<S>;
76
+ configSchema: S;
77
+ pluginVersion: string;
78
+ evaluate(config: SchemaAssertion<S>, run: Run, ctx?: EvaluateContext): Promise<AssertionResult>;
79
+ };
80
+
81
+ export const assertionPluginIssue = (definition: {
82
+ type?: unknown;
83
+ configSchema?: unknown;
84
+ pluginVersion?: unknown;
85
+ evaluate?: unknown;
86
+ }): string | undefined => {
87
+ if (typeof definition.type !== "string") {
88
+ return "assertion plugin type must be a string";
89
+ }
90
+ if (!(definition.configSchema instanceof z.ZodObject)) {
91
+ return "assertion plugin configSchema must be a direct Zod object";
92
+ }
93
+ const discriminator = definition.configSchema.shape.type;
94
+ if (
95
+ !(discriminator instanceof z.ZodLiteral) ||
96
+ discriminator.values.size !== 1 ||
97
+ discriminator.value !== definition.type
98
+ ) {
99
+ return "assertion plugin configSchema.type must be the matching string literal";
100
+ }
101
+ if (typeof definition.pluginVersion !== "string" || !definition.pluginVersion.trim()) {
102
+ return "assertion plugin pluginVersion must not be empty";
103
+ }
104
+ if (typeof definition.evaluate !== "function") {
105
+ return "assertion plugin evaluate must be a function";
106
+ }
107
+ return undefined;
108
+ };
109
+
110
+ /**
111
+ * Define a schema-validated assertion plugin while inferring the config passed
112
+ * to `evaluate` from the schema.
113
+ */
114
+ export const defineAssertion = <S extends z.ZodObject>(
115
+ definition: AssertionPluginDefinition<S>,
116
+ ): AssertionPlugin<SchemaAssertion<S>> => {
117
+ const issue = assertionPluginIssue(definition);
118
+ if (issue) throw new TypeError(issue);
119
+ return definition as unknown as AssertionPlugin<SchemaAssertion<S>>;
120
+ };
121
+
122
+ export const GradingAssertionEntrySchema = z.object({
123
+ /** Stable author-supplied id, or a deterministic positional fallback. */
124
+ id: z.exactOptional(z.string()),
125
+ type: z.string(),
126
+ name: z.string(),
127
+ passed: z.boolean(),
128
+ score: z.number(),
129
+ weight: z.number(),
130
+ threshold: z.number(),
131
+ /** Wall-clock the assertion took to evaluate. A `rubric` costs seconds; a file check, none. */
132
+ durationMs: z.number(),
133
+ comment: z.exactOptional(z.string()),
134
+ detail: z.unknown().optional(),
135
+ errorMessage: z.exactOptional(z.string()),
136
+ usage: z.exactOptional(TokenUsageSchema),
137
+ });
138
+ export type GradingAssertionEntry = z.infer<typeof GradingAssertionEntrySchema>;
139
+
140
+ export const GradingReportSchema = z.object({
141
+ schemaVersion: z.literal(1),
142
+ casePassed: z.boolean().nullable(),
143
+ caseScore: z.number().nullable(),
144
+ assertions: z.array(GradingAssertionEntrySchema),
145
+ /**
146
+ * Present when the subject run or grading did not complete. Assertions may
147
+ * still contain partial diagnostics, but the report is not a clean verdict.
148
+ */
149
+ incomplete: z.exactOptional(
150
+ z.object({
151
+ exitReason: ErrorEventReasonSchema,
152
+ phase: z.enum(["run", "collection", "grading"]).optional(),
153
+ }),
154
+ ),
155
+ });
156
+ export type GradingReport = z.infer<typeof GradingReportSchema>;
@@ -0,0 +1,103 @@
1
+ import { z } from "zod";
2
+ import { formatZodIssues } from "./zod.js";
3
+
4
+ export const FixturesRefSchema = z.union([
5
+ z.string(),
6
+ z.object({ kind: z.literal("dir"), path: z.string() }).strict(),
7
+ ]);
8
+ export type FixturesRef = z.infer<typeof FixturesRefSchema>;
9
+
10
+ // A driver/answerer is referenced either by a bare registry name (no config)
11
+ // or by an object pairing the name with its config. Keeping the name and its
12
+ // config in one object (rather than a name + a sibling `*Config` key) removes
13
+ // the question of which config goes with which plugin and lets a future typed
14
+ // `defineEvalCase` discriminate the config type on `name`.
15
+ export const DriverRefSchema = z.union([
16
+ z.string(),
17
+ z.object({ name: z.string(), config: z.unknown().optional() }).strict(),
18
+ ]);
19
+ export type DriverRef = z.infer<typeof DriverRefSchema>;
20
+
21
+ export const AnswererRefSchema = z.union([
22
+ z.string(),
23
+ z.object({ name: z.string(), config: z.unknown().optional() }).strict(),
24
+ ]);
25
+ export type AnswererRef = z.infer<typeof AnswererRefSchema>;
26
+
27
+ export const AssertionSchema = z
28
+ .object({
29
+ /** Stable identity used to compare this assertion across variants and repetitions. */
30
+ id: z.string().min(1).optional(),
31
+ type: z.string(),
32
+ name: z.string().optional(),
33
+ weight: z.number().positive().optional(),
34
+ threshold: z.number().min(0).max(1).optional(),
35
+ })
36
+ .loose();
37
+ export type Assertion = z.infer<typeof AssertionSchema>;
38
+
39
+ const EvalCaseObjectSchema = z.object({
40
+ id: z.string().optional(),
41
+ prompt: z.string().min(1, "prompt is required"),
42
+ persona: z.string().min(1).optional(),
43
+ driver: DriverRefSchema.optional(),
44
+ answerer: AnswererRefSchema.optional(),
45
+ fixtures: FixturesRefSchema.optional(),
46
+ assertions: z.array(AssertionSchema).optional(),
47
+ meta: z.record(z.string(), z.unknown()).optional(),
48
+ });
49
+
50
+ export const EvalCaseSchema = EvalCaseObjectSchema
51
+ // strict so a stray `driverConfig`/`answererConfig` (the old shape) or a
52
+ // typo'd field fails loudly instead of being silently dropped.
53
+ .strict()
54
+ .superRefine((evalCase, ctx) => {
55
+ const seen = new Set<string>();
56
+ for (const [index, assertion] of (evalCase.assertions ?? []).entries()) {
57
+ if (!assertion.id) continue;
58
+ if (seen.has(assertion.id)) {
59
+ ctx.addIssue({
60
+ code: "custom",
61
+ path: ["assertions", index, "id"],
62
+ message: `duplicate assertion id '${assertion.id}'`,
63
+ });
64
+ }
65
+ seen.add(assertion.id);
66
+ }
67
+ });
68
+ export type EvalCase = z.infer<typeof EvalCaseSchema>;
69
+
70
+ export const defineEvalCase = (input: EvalCase): EvalCase => {
71
+ const parsed = EvalCaseSchema.safeParse(input);
72
+ if (!parsed.success) {
73
+ throw new Error(`Invalid eval case: ${formatZodIssues(parsed.error)}`);
74
+ }
75
+ return parsed.data;
76
+ };
77
+
78
+ const PersistedFixturesRefSchema = z.union([
79
+ z.string(),
80
+ z.looseObject({ kind: z.literal("dir"), path: z.string() }),
81
+ ]);
82
+ const PersistedDriverRefSchema = z.union([
83
+ z.string(),
84
+ z.looseObject({ name: z.string(), config: z.unknown().optional() }),
85
+ ]);
86
+ const PersistedAnswererRefSchema = z.union([
87
+ z.string(),
88
+ z.looseObject({ name: z.string(), config: z.unknown().optional() }),
89
+ ]);
90
+
91
+ // The `case.json` frozen into a run dir. Reading run history stays permissive
92
+ // where authoring is strict: every field optional, unknown keys kept —
93
+ // serialization drops what it can't represent (predicate functions), and a
94
+ // frozen case from any other lux version must still load.
95
+ export const PersistedCaseSchema = EvalCaseObjectSchema.partial()
96
+ .extend({
97
+ casePath: z.exactOptional(z.string()),
98
+ driver: PersistedDriverRefSchema.optional(),
99
+ answerer: PersistedAnswererRefSchema.optional(),
100
+ fixtures: PersistedFixturesRefSchema.optional(),
101
+ })
102
+ .loose();
103
+ export type PersistedCase = z.infer<typeof PersistedCaseSchema>;
@@ -0,0 +1,47 @@
1
+ import { z } from "zod";
2
+ import type { Answer, Interrupt } from "./events.js";
3
+
4
+ export const CONVERSATION_TURN_REQUEST = "lux.conversation-turn.v1" as const;
5
+
6
+ export const ConversationTurnRequestSchema = z
7
+ .object({
8
+ type: z.literal(CONVERSATION_TURN_REQUEST),
9
+ /** The agent's user-visible message at the end of its current turn. */
10
+ message: z.string(),
11
+ })
12
+ .strict();
13
+ export type ConversationTurnRequest = z.infer<typeof ConversationTurnRequestSchema>;
14
+
15
+ export const ConversationTurnResponseSchema = z.discriminatedUnion("action", [
16
+ z.object({ action: z.literal("stop") }).strict(),
17
+ z
18
+ .object({
19
+ action: z.literal("reply"),
20
+ text: z.string().trim().min(1),
21
+ })
22
+ .strict(),
23
+ ]);
24
+ export type ConversationTurnResponse = z.infer<typeof ConversationTurnResponseSchema>;
25
+
26
+ export const conversationTurnInterrupt = (
27
+ id: string,
28
+ message: string,
29
+ context?: unknown,
30
+ ): Interrupt => ({
31
+ kind: "custom",
32
+ id,
33
+ payload: { type: CONVERSATION_TURN_REQUEST, message },
34
+ ...(context === undefined ? {} : { context }),
35
+ });
36
+
37
+ export const isConversationTurnInterrupt = (
38
+ interrupt: Interrupt,
39
+ ): interrupt is Extract<Interrupt, { kind: "custom" }> & {
40
+ payload: ConversationTurnRequest;
41
+ } =>
42
+ interrupt.kind === "custom" && ConversationTurnRequestSchema.safeParse(interrupt.payload).success;
43
+
44
+ export const conversationTurnResponse = (answer: Answer): ConversationTurnResponse | null => {
45
+ if (answer.kind !== "custom") return null;
46
+ return ConversationTurnResponseSchema.safeParse(answer.payload).data ?? null;
47
+ };
@@ -0,0 +1,75 @@
1
+ import { z } from "zod";
2
+ import type { EventHandler } from "./emitter.js";
3
+ import type { Answer, Done, ErrorEvent, Interrupt, Progress, ReadyState } from "./events.js";
4
+
5
+ export const ArtifactSchema = z.object({
6
+ path: z.string(),
7
+ /**
8
+ * Absolute dir `path` is relative to, when it is not the run's default
9
+ * `<runDir>/artifacts` (e.g. a driver configured to run in a checkout).
10
+ * Consumers resolve `path` against this before falling back to the default.
11
+ */
12
+ root: z.exactOptional(z.string()),
13
+ contentType: z.exactOptional(z.string()),
14
+ size: z.exactOptional(z.number()),
15
+ meta: z.exactOptional(z.record(z.string(), z.unknown())),
16
+ });
17
+ export type Artifact = z.infer<typeof ArtifactSchema>;
18
+
19
+ export const ResolvedFixturesSchema = z.object({
20
+ rootDir: z.string(),
21
+ meta: z.exactOptional(z.record(z.string(), z.unknown())),
22
+ });
23
+ export type ResolvedFixtures = z.infer<typeof ResolvedFixturesSchema>;
24
+
25
+ // Not schema-derived: `abortSignal` is a host object.
26
+ export type StartContext = {
27
+ /** Stable selected case id, available to drivers that multiplex scenarios. */
28
+ caseId?: string;
29
+ prompt: string;
30
+ fixtures?: ResolvedFixtures | undefined;
31
+ /** Root containing persisted runs. Drivers may use it as an isolation boundary. */
32
+ runsRoot?: string | undefined;
33
+ runDir: string;
34
+ artifactsDir: string;
35
+ abortSignal: AbortSignal;
36
+ };
37
+
38
+ export type DriverEventMap = {
39
+ interrupt: Interrupt;
40
+ progress: Progress;
41
+ done: Done;
42
+ error: ErrorEvent;
43
+ };
44
+
45
+ /**
46
+ * Handlers may be async, and a driver **must await** every handler before
47
+ * emitting its next event: the orchestrator's `interrupt` handler awaits the
48
+ * answerer and calls `respond` before the agent may continue, so dispatching
49
+ * without awaiting breaks that interrupt/respond serialization. Backing the
50
+ * event surface with `TypedEmitter` provides this ordering.
51
+ */
52
+ export interface AgentDriver {
53
+ start(ctx: StartContext): Promise<ReadyState>;
54
+ on<K extends keyof DriverEventMap>(event: K, handler: EventHandler<DriverEventMap[K]>): void;
55
+ off<K extends keyof DriverEventMap>(event: K, handler: EventHandler<DriverEventMap[K]>): void;
56
+ respond(answer: Answer): Promise<void>;
57
+ /**
58
+ * Stop agent work after a terminal protocol event but before evidence is
59
+ * collected. Process-backed drivers should implement this so a child cannot
60
+ * mutate artifacts while assertions are reading them.
61
+ */
62
+ quiesce?(): Promise<void>;
63
+ /**
64
+ * Return a stable evidence snapshot. Drivers without `quiesce` are
65
+ * responsible for stopping background writers before this promise resolves.
66
+ */
67
+ collect(): Promise<Artifact[]>;
68
+ close(): Promise<void>;
69
+ }
70
+
71
+ export type DriverPlugin<Cfg = unknown> = {
72
+ name: string;
73
+ configSchema?: z.ZodTypeAny;
74
+ create: (config: Cfg) => AgentDriver | Promise<AgentDriver>;
75
+ };
@@ -0,0 +1,38 @@
1
+ export type EventHandler<E> = (event: E) => void | Promise<void>;
2
+
3
+ /**
4
+ * Minimal typed event emitter (Node's EventEmitter is untyped on the
5
+ * listener side).
6
+ *
7
+ * Handlers are awaited serially within a single emit — the orchestrator's
8
+ * interrupt handler must finish before the driver continues — so keep
9
+ * handlers cheap. Dispatch is fail-fast: a throwing handler propagates out
10
+ * of `emit` and later handlers are skipped; callers treat a broken handler
11
+ * as a broken run. Handlers live in a Set: double registration is a no-op,
12
+ * and changes mid-emit affect the remainder of that dispatch.
13
+ */
14
+ export class TypedEmitter<EventMap extends Record<string, unknown>> {
15
+ private readonly handlers = new Map<keyof EventMap, Set<EventHandler<unknown>>>();
16
+
17
+ on<K extends keyof EventMap>(event: K, handler: EventHandler<EventMap[K]>): void {
18
+ const set = this.handlers.get(event) ?? new Set<EventHandler<unknown>>();
19
+ this.handlers.set(event, set);
20
+ set.add(handler as EventHandler<unknown>);
21
+ }
22
+
23
+ off<K extends keyof EventMap>(event: K, handler: EventHandler<EventMap[K]>): void {
24
+ this.handlers.get(event)?.delete(handler as EventHandler<unknown>);
25
+ }
26
+
27
+ async emit<K extends keyof EventMap>(event: K, payload: EventMap[K]): Promise<void> {
28
+ const set = this.handlers.get(event);
29
+ if (!set) return;
30
+ for (const handler of set) {
31
+ await (handler as EventHandler<EventMap[K]>)(payload);
32
+ }
33
+ }
34
+
35
+ removeAllListeners(): void {
36
+ this.handlers.clear();
37
+ }
38
+ }
@@ -0,0 +1,135 @@
1
+ import { z } from "zod";
2
+
3
+ export const InterruptKindSchema = z.enum(["ask", "approve", "custom"]);
4
+ export type InterruptKind = z.infer<typeof InterruptKindSchema>;
5
+
6
+ export const AskInterruptSchema = z.object({
7
+ kind: z.literal("ask"),
8
+ id: z.string(),
9
+ question: z.string(),
10
+ context: z.unknown().optional(),
11
+ });
12
+
13
+ export const ApproveInterruptSchema = z.object({
14
+ kind: z.literal("approve"),
15
+ id: z.string(),
16
+ request: z.string(),
17
+ context: z.unknown().optional(),
18
+ });
19
+
20
+ export const CustomInterruptSchema = z.object({
21
+ kind: z.literal("custom"),
22
+ id: z.string(),
23
+ payload: z.unknown(),
24
+ context: z.unknown().optional(),
25
+ });
26
+
27
+ export const InterruptSchema = z.discriminatedUnion("kind", [
28
+ AskInterruptSchema,
29
+ ApproveInterruptSchema,
30
+ CustomInterruptSchema,
31
+ ]);
32
+ export type Interrupt = z.infer<typeof InterruptSchema>;
33
+
34
+ export const AskAnswerSchema = z.object({
35
+ kind: z.literal("ask"),
36
+ id: z.string(),
37
+ text: z.string(),
38
+ });
39
+
40
+ export const ApproveAnswerSchema = z.object({
41
+ kind: z.literal("approve"),
42
+ id: z.string(),
43
+ approved: z.boolean(),
44
+ reason: z.exactOptional(z.string()),
45
+ });
46
+
47
+ export const CustomAnswerSchema = z.object({
48
+ kind: z.literal("custom"),
49
+ id: z.string(),
50
+ payload: z.unknown(),
51
+ });
52
+
53
+ export const AnswerSchema = z.discriminatedUnion("kind", [
54
+ AskAnswerSchema,
55
+ ApproveAnswerSchema,
56
+ CustomAnswerSchema,
57
+ ]);
58
+ export type Answer = z.infer<typeof AnswerSchema>;
59
+
60
+ export const ProgressSchema = z.object({
61
+ id: z.string(),
62
+ kind: z.string(),
63
+ payload: z.unknown(),
64
+ ts: z.number(),
65
+ });
66
+ export type Progress = z.infer<typeof ProgressSchema>;
67
+
68
+ export const DoneSchema = z.object({
69
+ exitReason: z.literal("done"),
70
+ /**
71
+ * Driver-defined summary. The orchestrator recognizes `usage`, `cost`,
72
+ * `modelCalls`, and `unpricedModelCalls` when present while preserving room
73
+ * for domain-specific measurements.
74
+ */
75
+ summary: z.unknown().optional(),
76
+ });
77
+ export type Done = z.infer<typeof DoneSchema>;
78
+
79
+ export const ErrorEventReasonSchema = z.enum(["error", "idle-timeout", "max-interactions"]);
80
+ export type ErrorEventReason = z.infer<typeof ErrorEventReasonSchema>;
81
+
82
+ export const ErrorEventSchema = z.object({
83
+ exitReason: ErrorEventReasonSchema,
84
+ reason: z.string(),
85
+ });
86
+ export type ErrorEvent = z.infer<typeof ErrorEventSchema>;
87
+
88
+ export const LifecycleStageSchema = z.enum([
89
+ "load",
90
+ "prepare-answerer",
91
+ "start-driver",
92
+ "run-loop",
93
+ "collect-start",
94
+ "collect-end",
95
+ "grade-start",
96
+ "grade-end",
97
+ "close",
98
+ ]);
99
+ export type LifecycleStage = z.infer<typeof LifecycleStageSchema>;
100
+
101
+ export const ReadyStateSchema = z.object({
102
+ agentId: z.string(),
103
+ agentVersion: z.exactOptional(z.string()),
104
+ model: z.exactOptional(z.string()),
105
+ detail: z.exactOptional(z.record(z.string(), z.unknown())),
106
+ });
107
+ export type ReadyState = z.infer<typeof ReadyStateSchema>;
108
+
109
+ const stamped = { ts: z.number() };
110
+
111
+ // Nested because a flat union on `type` would collide across the arms sharing it.
112
+ const InterruptEventSchema = z.discriminatedUnion("kind", [
113
+ AskInterruptSchema.extend({ type: z.literal("interrupt"), ...stamped }),
114
+ ApproveInterruptSchema.extend({ type: z.literal("interrupt"), ...stamped }),
115
+ CustomInterruptSchema.extend({ type: z.literal("interrupt"), ...stamped }),
116
+ ]);
117
+
118
+ const RespondedEventSchema = z.discriminatedUnion("kind", [
119
+ AskAnswerSchema.extend({ type: z.literal("responded"), ...stamped }),
120
+ ApproveAnswerSchema.extend({ type: z.literal("responded"), ...stamped }),
121
+ CustomAnswerSchema.extend({ type: z.literal("responded"), ...stamped }),
122
+ ]);
123
+
124
+ export const RunEventSchema = z.discriminatedUnion("type", [
125
+ // `ready` is the one un-stamped arm: the orchestrator persists the driver's
126
+ // ReadyState verbatim, and the adjacent `lifecycle` events carry its timing.
127
+ ReadyStateSchema.extend({ type: z.literal("ready") }),
128
+ InterruptEventSchema,
129
+ RespondedEventSchema,
130
+ ProgressSchema.extend({ type: z.literal("progress") }),
131
+ DoneSchema.extend({ type: z.literal("done"), ...stamped }),
132
+ ErrorEventSchema.extend({ type: z.literal("error"), ...stamped }),
133
+ z.object({ type: z.literal("lifecycle"), stage: LifecycleStageSchema, ...stamped }),
134
+ ]);
135
+ export type RunEvent = z.infer<typeof RunEventSchema>;