@prismatic-io/lux 0.0.2-preview.3 → 0.0.2-preview.30

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 (717) hide show
  1. package/lib/answerers/claude-code/index.d.ts +15 -3
  2. package/lib/answerers/claude-code/index.d.ts.map +1 -1
  3. package/lib/answerers/claude-code/index.js +6 -5
  4. package/lib/answerers/claude-code/index.js.map +1 -1
  5. package/lib/answerers/persona/index.d.ts +44 -5
  6. package/lib/answerers/persona/index.d.ts.map +1 -1
  7. package/lib/answerers/persona/index.js +60 -34
  8. package/lib/answerers/persona/index.js.map +1 -1
  9. package/lib/answerers/terminal/index.d.ts +9 -3
  10. package/lib/answerers/terminal/index.d.ts.map +1 -1
  11. package/lib/answerers/terminal/index.js +7 -5
  12. package/lib/answerers/terminal/index.js.map +1 -1
  13. package/lib/assertions/authoring.d.ts +2 -2
  14. package/lib/assertions/authoring.d.ts.map +1 -1
  15. package/lib/assertions/authoring.js.map +1 -1
  16. package/lib/assertions/core/command-exits-zero.d.ts +3 -1
  17. package/lib/assertions/core/command-exits-zero.d.ts.map +1 -1
  18. package/lib/assertions/core/command-exits-zero.js +50 -7
  19. package/lib/assertions/core/command-exits-zero.js.map +1 -1
  20. package/lib/assertions/core/event-checks.d.ts +3 -0
  21. package/lib/assertions/core/event-checks.d.ts.map +1 -1
  22. package/lib/assertions/core/event-checks.js +49 -3
  23. package/lib/assertions/core/event-checks.js.map +1 -1
  24. package/lib/assertions/core/helpers.d.ts +2 -7
  25. package/lib/assertions/core/helpers.d.ts.map +1 -1
  26. package/lib/assertions/core/helpers.js +2 -6
  27. package/lib/assertions/core/helpers.js.map +1 -1
  28. package/lib/assertions/core/index.d.ts.map +1 -1
  29. package/lib/assertions/core/index.js +2 -1
  30. package/lib/assertions/core/index.js.map +1 -1
  31. package/lib/assertions/core/resource-checks.d.ts +19 -0
  32. package/lib/assertions/core/resource-checks.d.ts.map +1 -1
  33. package/lib/assertions/core/resource-checks.js +35 -5
  34. package/lib/assertions/core/resource-checks.js.map +1 -1
  35. package/lib/assertions/rubric/index.d.ts +26 -3
  36. package/lib/assertions/rubric/index.d.ts.map +1 -1
  37. package/lib/assertions/rubric/index.js +59 -13
  38. package/lib/assertions/rubric/index.js.map +1 -1
  39. package/lib/assertions/rubric/internal.d.ts +30 -5
  40. package/lib/assertions/rubric/internal.d.ts.map +1 -1
  41. package/lib/assertions/rubric/internal.js +181 -28
  42. package/lib/assertions/rubric/internal.js.map +1 -1
  43. package/lib/authoring.d.ts +36 -2
  44. package/lib/authoring.d.ts.map +1 -1
  45. package/lib/authoring.js +36 -1
  46. package/lib/authoring.js.map +1 -1
  47. package/lib/cli/bin.js +2 -13
  48. package/lib/cli/bin.js.map +1 -1
  49. package/lib/cli/command-runtime.d.ts +3 -3
  50. package/lib/cli/command-runtime.d.ts.map +1 -1
  51. package/lib/cli/command-runtime.js +17 -6
  52. package/lib/cli/command-runtime.js.map +1 -1
  53. package/lib/cli/doctor.d.ts +55 -0
  54. package/lib/cli/doctor.d.ts.map +1 -0
  55. package/lib/cli/doctor.js +14 -0
  56. package/lib/cli/doctor.js.map +1 -0
  57. package/lib/cli/harness-plan.d.ts +26 -0
  58. package/lib/cli/harness-plan.d.ts.map +1 -0
  59. package/lib/cli/harness-plan.js +75 -0
  60. package/lib/cli/harness-plan.js.map +1 -0
  61. package/lib/cli/init-templates.d.ts +11 -0
  62. package/lib/cli/init-templates.d.ts.map +1 -0
  63. package/lib/cli/init-templates.js +215 -0
  64. package/lib/cli/init-templates.js.map +1 -0
  65. package/lib/cli/init.d.ts +10 -0
  66. package/lib/cli/init.d.ts.map +1 -1
  67. package/lib/cli/init.js +34 -173
  68. package/lib/cli/init.js.map +1 -1
  69. package/lib/cli/output-schemas.d.ts +1406 -0
  70. package/lib/cli/output-schemas.d.ts.map +1 -0
  71. package/lib/cli/output-schemas.js +91 -0
  72. package/lib/cli/output-schemas.js.map +1 -0
  73. package/lib/cli/program.d.ts +140 -12
  74. package/lib/cli/program.d.ts.map +1 -1
  75. package/lib/cli/program.js +778 -646
  76. package/lib/cli/program.js.map +1 -1
  77. package/lib/cli/render/reporter.d.ts.map +1 -1
  78. package/lib/cli/render/reporter.js +40 -7
  79. package/lib/cli/render/reporter.js.map +1 -1
  80. package/lib/cli/run-options.d.ts +20 -4
  81. package/lib/cli/run-options.d.ts.map +1 -1
  82. package/lib/cli/run-options.js +100 -19
  83. package/lib/cli/run-options.js.map +1 -1
  84. package/lib/cli/view.d.ts +15 -0
  85. package/lib/cli/view.d.ts.map +1 -0
  86. package/lib/cli/view.js +168 -0
  87. package/lib/cli/view.js.map +1 -0
  88. package/lib/container/driver.d.ts +27 -0
  89. package/lib/container/driver.d.ts.map +1 -0
  90. package/lib/container/driver.js +197 -0
  91. package/lib/container/driver.js.map +1 -0
  92. package/lib/container/protocol.d.ts +12 -0
  93. package/lib/container/protocol.d.ts.map +1 -0
  94. package/lib/container/protocol.js +38 -0
  95. package/lib/container/protocol.js.map +1 -0
  96. package/lib/container/resources.d.ts +12 -0
  97. package/lib/container/resources.d.ts.map +1 -0
  98. package/lib/container/resources.js +133 -0
  99. package/lib/container/resources.js.map +1 -0
  100. package/lib/container/worker.d.ts +2 -0
  101. package/lib/container/worker.d.ts.map +1 -0
  102. package/lib/container/worker.js +85 -0
  103. package/lib/container/worker.js.map +1 -0
  104. package/lib/core/action-events.d.ts +29 -0
  105. package/lib/core/action-events.d.ts.map +1 -0
  106. package/lib/core/action-events.js +51 -0
  107. package/lib/core/action-events.js.map +1 -0
  108. package/lib/core/agent-activity.d.ts +49 -0
  109. package/lib/core/agent-activity.d.ts.map +1 -0
  110. package/lib/core/agent-activity.js +206 -0
  111. package/lib/core/agent-activity.js.map +1 -0
  112. package/lib/core/agent-environment.d.ts +5 -0
  113. package/lib/core/agent-environment.d.ts.map +1 -0
  114. package/lib/core/agent-environment.js +47 -0
  115. package/lib/core/agent-environment.js.map +1 -0
  116. package/lib/core/agent-events.d.ts +26 -0
  117. package/lib/core/agent-events.d.ts.map +1 -0
  118. package/lib/core/agent-events.js +13 -0
  119. package/lib/core/agent-events.js.map +1 -0
  120. package/lib/core/annotation.d.ts +6 -2
  121. package/lib/core/annotation.d.ts.map +1 -1
  122. package/lib/core/annotation.js +2 -1
  123. package/lib/core/annotation.js.map +1 -1
  124. package/lib/core/answerer.d.ts +12 -0
  125. package/lib/core/answerer.d.ts.map +1 -1
  126. package/lib/core/answerer.js +2 -0
  127. package/lib/core/answerer.js.map +1 -1
  128. package/lib/core/artifact-evidence.d.ts +8 -0
  129. package/lib/core/artifact-evidence.d.ts.map +1 -1
  130. package/lib/core/artifact-evidence.js +36 -4
  131. package/lib/core/artifact-evidence.js.map +1 -1
  132. package/lib/core/assertion.d.ts +15 -0
  133. package/lib/core/assertion.d.ts.map +1 -1
  134. package/lib/core/assertion.js +16 -0
  135. package/lib/core/assertion.js.map +1 -1
  136. package/lib/core/case.d.ts +106 -2
  137. package/lib/core/case.d.ts.map +1 -1
  138. package/lib/core/case.js +16 -2
  139. package/lib/core/case.js.map +1 -1
  140. package/lib/core/command-verification.d.ts +10 -0
  141. package/lib/core/command-verification.d.ts.map +1 -0
  142. package/lib/core/command-verification.js +66 -0
  143. package/lib/core/command-verification.js.map +1 -0
  144. package/lib/core/driver-execution.d.ts +83 -0
  145. package/lib/core/driver-execution.d.ts.map +1 -0
  146. package/lib/core/driver-execution.js +72 -0
  147. package/lib/core/driver-execution.js.map +1 -0
  148. package/lib/core/driver-metrics.d.ts +98 -0
  149. package/lib/core/driver-metrics.d.ts.map +1 -0
  150. package/lib/core/driver-metrics.js +36 -0
  151. package/lib/core/driver-metrics.js.map +1 -0
  152. package/lib/core/driver.d.ts +64 -0
  153. package/lib/core/driver.d.ts.map +1 -1
  154. package/lib/core/driver.js +28 -0
  155. package/lib/core/driver.js.map +1 -1
  156. package/lib/core/duration.d.ts +5 -0
  157. package/lib/core/duration.d.ts.map +1 -0
  158. package/lib/core/duration.js +49 -0
  159. package/lib/core/duration.js.map +1 -0
  160. package/lib/core/environment.d.ts +18 -0
  161. package/lib/core/environment.d.ts.map +1 -0
  162. package/lib/core/environment.js +21 -0
  163. package/lib/core/environment.js.map +1 -0
  164. package/lib/core/evaluation-clusters.d.ts +17 -0
  165. package/lib/core/evaluation-clusters.d.ts.map +1 -0
  166. package/lib/core/evaluation-clusters.js +23 -0
  167. package/lib/core/evaluation-clusters.js.map +1 -0
  168. package/lib/core/events.d.ts +36 -0
  169. package/lib/core/events.d.ts.map +1 -1
  170. package/lib/core/events.js +12 -2
  171. package/lib/core/events.js.map +1 -1
  172. package/lib/core/experiment.d.ts +32 -2
  173. package/lib/core/experiment.d.ts.map +1 -1
  174. package/lib/core/experiment.js +35 -18
  175. package/lib/core/experiment.js.map +1 -1
  176. package/lib/core/file-tree.d.ts +7 -0
  177. package/lib/core/file-tree.d.ts.map +1 -0
  178. package/lib/core/file-tree.js +35 -0
  179. package/lib/core/file-tree.js.map +1 -0
  180. package/lib/core/global-id.d.ts +6 -0
  181. package/lib/core/global-id.d.ts.map +1 -0
  182. package/lib/core/global-id.js +17 -0
  183. package/lib/core/global-id.js.map +1 -0
  184. package/lib/core/harness-catalog.d.ts +35 -0
  185. package/lib/core/harness-catalog.d.ts.map +1 -0
  186. package/lib/core/harness-catalog.js +45 -0
  187. package/lib/core/harness-catalog.js.map +1 -0
  188. package/lib/core/harness-catalogs/antigravity.d.ts +11 -0
  189. package/lib/core/harness-catalogs/antigravity.d.ts.map +1 -0
  190. package/lib/core/harness-catalogs/antigravity.js +23 -0
  191. package/lib/core/harness-catalogs/antigravity.js.map +1 -0
  192. package/lib/core/harness-catalogs/claude-code.d.ts +12 -0
  193. package/lib/core/harness-catalogs/claude-code.d.ts.map +1 -0
  194. package/lib/core/harness-catalogs/claude-code.js +24 -0
  195. package/lib/core/harness-catalogs/claude-code.js.map +1 -0
  196. package/lib/core/harness-catalogs/codex.d.ts +11 -0
  197. package/lib/core/harness-catalogs/codex.d.ts.map +1 -0
  198. package/lib/core/harness-catalogs/codex.js +26 -0
  199. package/lib/core/harness-catalogs/codex.js.map +1 -0
  200. package/lib/core/harness-catalogs/copilot.d.ts +29 -0
  201. package/lib/core/harness-catalogs/copilot.d.ts.map +1 -0
  202. package/lib/core/harness-catalogs/copilot.js +45 -0
  203. package/lib/core/harness-catalogs/copilot.js.map +1 -0
  204. package/lib/core/harness-catalogs/cursor.d.ts +2 -0
  205. package/lib/core/harness-catalogs/cursor.d.ts.map +1 -0
  206. package/lib/core/harness-catalogs/cursor.js +13 -0
  207. package/lib/core/harness-catalogs/cursor.js.map +1 -0
  208. package/lib/core/harness-catalogs/grok-build.d.ts +7 -0
  209. package/lib/core/harness-catalogs/grok-build.d.ts.map +1 -0
  210. package/lib/core/harness-catalogs/grok-build.js +18 -0
  211. package/lib/core/harness-catalogs/grok-build.js.map +1 -0
  212. package/lib/core/harness-catalogs/index.d.ts +73 -0
  213. package/lib/core/harness-catalogs/index.d.ts.map +1 -0
  214. package/lib/core/harness-catalogs/index.js +17 -0
  215. package/lib/core/harness-catalogs/index.js.map +1 -0
  216. package/lib/core/harness-matrix.d.ts +154 -0
  217. package/lib/core/harness-matrix.d.ts.map +1 -0
  218. package/lib/core/harness-matrix.js +204 -0
  219. package/lib/core/harness-matrix.js.map +1 -0
  220. package/lib/core/index.d.ts +12 -0
  221. package/lib/core/index.d.ts.map +1 -1
  222. package/lib/core/index.js +12 -0
  223. package/lib/core/index.js.map +1 -1
  224. package/lib/core/lifecycle-fixtures.d.ts.map +1 -1
  225. package/lib/core/lifecycle-fixtures.js +4 -2
  226. package/lib/core/lifecycle-fixtures.js.map +1 -1
  227. package/lib/core/model-cli.d.ts +9 -11
  228. package/lib/core/model-cli.d.ts.map +1 -1
  229. package/lib/core/model-cli.js +31 -19
  230. package/lib/core/model-cli.js.map +1 -1
  231. package/lib/core/platform-process.d.ts +6 -1
  232. package/lib/core/platform-process.d.ts.map +1 -1
  233. package/lib/core/platform-process.js +49 -11
  234. package/lib/core/platform-process.js.map +1 -1
  235. package/lib/core/run.d.ts +292 -1
  236. package/lib/core/run.d.ts.map +1 -1
  237. package/lib/core/run.js +27 -0
  238. package/lib/core/run.js.map +1 -1
  239. package/lib/core/secure-copy.d.ts.map +1 -0
  240. package/lib/core/secure-copy.js.map +1 -0
  241. package/lib/core/usage.d.ts +5 -0
  242. package/lib/core/usage.d.ts.map +1 -1
  243. package/lib/core/usage.js +3 -0
  244. package/lib/core/usage.js.map +1 -1
  245. package/lib/core/wire.d.ts +12 -0
  246. package/lib/core/wire.d.ts.map +1 -1
  247. package/lib/core/wire.js +5 -1
  248. package/lib/core/wire.js.map +1 -1
  249. package/lib/drivers/antigravity/artifacts.d.ts +2 -0
  250. package/lib/drivers/antigravity/artifacts.d.ts.map +1 -0
  251. package/lib/drivers/antigravity/artifacts.js +33 -0
  252. package/lib/drivers/antigravity/artifacts.js.map +1 -0
  253. package/lib/drivers/antigravity/config.d.ts +88 -0
  254. package/lib/drivers/antigravity/config.d.ts.map +1 -0
  255. package/lib/drivers/antigravity/config.js +87 -0
  256. package/lib/drivers/antigravity/config.js.map +1 -0
  257. package/lib/drivers/antigravity/events.d.ts +4 -0
  258. package/lib/drivers/antigravity/events.d.ts.map +1 -0
  259. package/lib/drivers/antigravity/events.js +241 -0
  260. package/lib/drivers/antigravity/events.js.map +1 -0
  261. package/lib/drivers/antigravity/index.d.ts +114 -0
  262. package/lib/drivers/antigravity/index.d.ts.map +1 -0
  263. package/lib/drivers/antigravity/index.js +113 -0
  264. package/lib/drivers/antigravity/index.js.map +1 -0
  265. package/lib/drivers/antigravity/runtime.d.ts +7 -0
  266. package/lib/drivers/antigravity/runtime.d.ts.map +1 -0
  267. package/lib/drivers/antigravity/runtime.js +83 -0
  268. package/lib/drivers/antigravity/runtime.js.map +1 -0
  269. package/lib/drivers/claude-code/deferred-process.d.ts +17 -0
  270. package/lib/drivers/claude-code/deferred-process.d.ts.map +1 -0
  271. package/lib/drivers/claude-code/deferred-process.js +108 -0
  272. package/lib/drivers/claude-code/deferred-process.js.map +1 -0
  273. package/lib/drivers/claude-code/index.d.ts +180 -10
  274. package/lib/drivers/claude-code/index.d.ts.map +1 -1
  275. package/lib/drivers/claude-code/index.js +186 -252
  276. package/lib/drivers/claude-code/index.js.map +1 -1
  277. package/lib/drivers/claude-code/isolation.d.ts +8 -0
  278. package/lib/drivers/claude-code/isolation.d.ts.map +1 -0
  279. package/lib/drivers/claude-code/isolation.js +199 -0
  280. package/lib/drivers/claude-code/isolation.js.map +1 -0
  281. package/lib/drivers/claude-code/parse-events.d.ts.map +1 -1
  282. package/lib/drivers/claude-code/parse-events.js +73 -8
  283. package/lib/drivers/claude-code/parse-events.js.map +1 -1
  284. package/lib/drivers/codex/app-events.d.ts +9 -2
  285. package/lib/drivers/codex/app-events.d.ts.map +1 -1
  286. package/lib/drivers/codex/app-events.js +104 -12
  287. package/lib/drivers/codex/app-events.js.map +1 -1
  288. package/lib/drivers/codex/config.d.ts +66 -5
  289. package/lib/drivers/codex/config.d.ts.map +1 -1
  290. package/lib/drivers/codex/config.js +39 -8
  291. package/lib/drivers/codex/config.js.map +1 -1
  292. package/lib/drivers/codex/exec-events.d.ts +4 -0
  293. package/lib/drivers/codex/exec-events.d.ts.map +1 -0
  294. package/lib/drivers/codex/exec-events.js +230 -0
  295. package/lib/drivers/codex/exec-events.js.map +1 -0
  296. package/lib/drivers/codex/index.d.ts +138 -4
  297. package/lib/drivers/codex/index.d.ts.map +1 -1
  298. package/lib/drivers/codex/index.js +112 -276
  299. package/lib/drivers/codex/index.js.map +1 -1
  300. package/lib/drivers/copilot/config.d.ts +84 -0
  301. package/lib/drivers/copilot/config.d.ts.map +1 -0
  302. package/lib/drivers/copilot/config.js +57 -0
  303. package/lib/drivers/copilot/config.js.map +1 -0
  304. package/lib/drivers/copilot/index.d.ts +107 -0
  305. package/lib/drivers/copilot/index.d.ts.map +1 -0
  306. package/lib/drivers/copilot/index.js +268 -0
  307. package/lib/drivers/copilot/index.js.map +1 -0
  308. package/lib/drivers/cursor/config.d.ts +28 -0
  309. package/lib/drivers/cursor/config.d.ts.map +1 -0
  310. package/lib/drivers/cursor/config.js +28 -0
  311. package/lib/drivers/cursor/config.js.map +1 -0
  312. package/lib/drivers/cursor/index.d.ts +44 -0
  313. package/lib/drivers/cursor/index.d.ts.map +1 -0
  314. package/lib/drivers/cursor/index.js +286 -0
  315. package/lib/drivers/cursor/index.js.map +1 -0
  316. package/lib/drivers/cursor/interaction.d.ts +6 -0
  317. package/lib/drivers/cursor/interaction.d.ts.map +1 -0
  318. package/lib/drivers/cursor/interaction.js +55 -0
  319. package/lib/drivers/cursor/interaction.js.map +1 -0
  320. package/lib/drivers/grok-build/config.d.ts +68 -0
  321. package/lib/drivers/grok-build/config.d.ts.map +1 -0
  322. package/lib/drivers/grok-build/config.js +40 -0
  323. package/lib/drivers/grok-build/config.js.map +1 -0
  324. package/lib/drivers/grok-build/index.d.ts +87 -0
  325. package/lib/drivers/grok-build/index.d.ts.map +1 -0
  326. package/lib/drivers/grok-build/index.js +293 -0
  327. package/lib/drivers/grok-build/index.js.map +1 -0
  328. package/lib/drivers/mcp/index.d.ts +37 -4
  329. package/lib/drivers/mcp/index.d.ts.map +1 -1
  330. package/lib/drivers/mcp/index.js +25 -11
  331. package/lib/drivers/mcp/index.js.map +1 -1
  332. package/lib/drivers/shared/acp-events.d.ts +15 -0
  333. package/lib/drivers/shared/acp-events.d.ts.map +1 -0
  334. package/lib/drivers/shared/acp-events.js +83 -0
  335. package/lib/drivers/shared/acp-events.js.map +1 -0
  336. package/lib/drivers/shared/acp-interaction.d.ts +7 -0
  337. package/lib/drivers/shared/acp-interaction.d.ts.map +1 -0
  338. package/lib/drivers/shared/acp-interaction.js +20 -0
  339. package/lib/drivers/shared/acp-interaction.js.map +1 -0
  340. package/lib/drivers/shared/acp-session.d.ts +4 -0
  341. package/lib/drivers/shared/acp-session.d.ts.map +1 -0
  342. package/lib/drivers/shared/acp-session.js +23 -0
  343. package/lib/drivers/shared/acp-session.js.map +1 -0
  344. package/lib/drivers/shared/acp-transport.d.ts +40 -0
  345. package/lib/drivers/shared/acp-transport.d.ts.map +1 -0
  346. package/lib/drivers/shared/acp-transport.js +152 -0
  347. package/lib/drivers/shared/acp-transport.js.map +1 -0
  348. package/lib/drivers/shared/artifacts.d.ts.map +1 -1
  349. package/lib/drivers/shared/artifacts.js +3 -2
  350. package/lib/drivers/shared/artifacts.js.map +1 -1
  351. package/lib/drivers/shared/experiment-behavior.d.ts +13 -0
  352. package/lib/drivers/shared/experiment-behavior.d.ts.map +1 -0
  353. package/lib/drivers/shared/experiment-behavior.js +197 -0
  354. package/lib/drivers/shared/experiment-behavior.js.map +1 -0
  355. package/lib/drivers/shared/experiment-policy.d.ts +4 -0
  356. package/lib/drivers/shared/experiment-policy.d.ts.map +1 -0
  357. package/lib/drivers/shared/experiment-policy.js +143 -0
  358. package/lib/drivers/shared/experiment-policy.js.map +1 -0
  359. package/lib/drivers/subprocess/index.d.ts +39 -4
  360. package/lib/drivers/subprocess/index.d.ts.map +1 -1
  361. package/lib/drivers/subprocess/index.js +56 -12
  362. package/lib/drivers/subprocess/index.js.map +1 -1
  363. package/lib/index.d.ts +22 -8
  364. package/lib/index.d.ts.map +1 -1
  365. package/lib/index.js +20 -6
  366. package/lib/index.js.map +1 -1
  367. package/lib/optimization/reflective.d.ts +3 -1
  368. package/lib/optimization/reflective.d.ts.map +1 -1
  369. package/lib/optimization/reflective.js +3 -2
  370. package/lib/optimization/reflective.js.map +1 -1
  371. package/lib/orchestrator/annotation-loader.d.ts +6 -2
  372. package/lib/orchestrator/annotation-loader.d.ts.map +1 -1
  373. package/lib/orchestrator/annotation-loader.js +8 -0
  374. package/lib/orchestrator/annotation-loader.js.map +1 -1
  375. package/lib/orchestrator/annotation-store.d.ts.map +1 -1
  376. package/lib/orchestrator/annotation-store.js +16 -2
  377. package/lib/orchestrator/annotation-store.js.map +1 -1
  378. package/lib/orchestrator/artifact-origin.d.ts +3 -0
  379. package/lib/orchestrator/artifact-origin.d.ts.map +1 -0
  380. package/lib/orchestrator/artifact-origin.js +40 -0
  381. package/lib/orchestrator/artifact-origin.js.map +1 -0
  382. package/lib/orchestrator/campaign-lifecycle.d.ts +1 -0
  383. package/lib/orchestrator/campaign-lifecycle.d.ts.map +1 -1
  384. package/lib/orchestrator/campaign-lifecycle.js +4 -1
  385. package/lib/orchestrator/campaign-lifecycle.js.map +1 -1
  386. package/lib/orchestrator/candidates.d.ts.map +1 -1
  387. package/lib/orchestrator/candidates.js +3 -2
  388. package/lib/orchestrator/candidates.js.map +1 -1
  389. package/lib/orchestrator/compare.d.ts +17 -1
  390. package/lib/orchestrator/compare.d.ts.map +1 -1
  391. package/lib/orchestrator/compare.js +25 -1
  392. package/lib/orchestrator/compare.js.map +1 -1
  393. package/lib/orchestrator/comparison-identity.d.ts.map +1 -1
  394. package/lib/orchestrator/comparison-identity.js +2 -0
  395. package/lib/orchestrator/comparison-identity.js.map +1 -1
  396. package/lib/orchestrator/config.d.ts +177 -1
  397. package/lib/orchestrator/config.d.ts.map +1 -1
  398. package/lib/orchestrator/config.js +18 -4
  399. package/lib/orchestrator/config.js.map +1 -1
  400. package/lib/orchestrator/discover.d.ts +1 -0
  401. package/lib/orchestrator/discover.d.ts.map +1 -1
  402. package/lib/orchestrator/discover.js +7 -1
  403. package/lib/orchestrator/discover.js.map +1 -1
  404. package/lib/orchestrator/doctor.d.ts +1 -0
  405. package/lib/orchestrator/doctor.d.ts.map +1 -1
  406. package/lib/orchestrator/doctor.js +121 -33
  407. package/lib/orchestrator/doctor.js.map +1 -1
  408. package/lib/orchestrator/driver-capabilities.d.ts +4 -0
  409. package/lib/orchestrator/driver-capabilities.d.ts.map +1 -0
  410. package/lib/orchestrator/driver-capabilities.js +13 -0
  411. package/lib/orchestrator/driver-capabilities.js.map +1 -0
  412. package/lib/orchestrator/driver-identity.d.ts +5 -0
  413. package/lib/orchestrator/driver-identity.d.ts.map +1 -0
  414. package/lib/orchestrator/driver-identity.js +51 -0
  415. package/lib/orchestrator/driver-identity.js.map +1 -0
  416. package/lib/orchestrator/experiment-context.d.ts +51 -3
  417. package/lib/orchestrator/experiment-context.d.ts.map +1 -1
  418. package/lib/orchestrator/experiment-context.js.map +1 -1
  419. package/lib/orchestrator/experiment-contracts.d.ts +30 -1
  420. package/lib/orchestrator/experiment-contracts.d.ts.map +1 -1
  421. package/lib/orchestrator/experiment-corpus.d.ts +2 -1
  422. package/lib/orchestrator/experiment-corpus.d.ts.map +1 -1
  423. package/lib/orchestrator/experiment-corpus.js +28 -22
  424. package/lib/orchestrator/experiment-corpus.js.map +1 -1
  425. package/lib/orchestrator/experiment-effects.d.ts +33 -0
  426. package/lib/orchestrator/experiment-effects.d.ts.map +1 -0
  427. package/lib/orchestrator/experiment-effects.js +44 -0
  428. package/lib/orchestrator/experiment-effects.js.map +1 -0
  429. package/lib/orchestrator/experiment-evaluation.d.ts.map +1 -1
  430. package/lib/orchestrator/experiment-evaluation.js +56 -5
  431. package/lib/orchestrator/experiment-evaluation.js.map +1 -1
  432. package/lib/orchestrator/experiment-identity.d.ts +3 -0
  433. package/lib/orchestrator/experiment-identity.d.ts.map +1 -1
  434. package/lib/orchestrator/experiment-identity.js +22 -33
  435. package/lib/orchestrator/experiment-identity.js.map +1 -1
  436. package/lib/orchestrator/experiment-loader.d.ts +8 -3
  437. package/lib/orchestrator/experiment-loader.d.ts.map +1 -1
  438. package/lib/orchestrator/experiment-preflight.d.ts +3 -0
  439. package/lib/orchestrator/experiment-preflight.d.ts.map +1 -0
  440. package/lib/orchestrator/experiment-preflight.js +21 -0
  441. package/lib/orchestrator/experiment-preflight.js.map +1 -0
  442. package/lib/orchestrator/experiment-report.d.ts +90 -1
  443. package/lib/orchestrator/experiment-report.d.ts.map +1 -1
  444. package/lib/orchestrator/experiment-report.js +9 -1
  445. package/lib/orchestrator/experiment-report.js.map +1 -1
  446. package/lib/orchestrator/experiment-runs.d.ts +61 -2
  447. package/lib/orchestrator/experiment-runs.d.ts.map +1 -1
  448. package/lib/orchestrator/experiment-runs.js +13 -5
  449. package/lib/orchestrator/experiment-runs.js.map +1 -1
  450. package/lib/orchestrator/experiment-runtime-identity.d.ts +0 -16
  451. package/lib/orchestrator/experiment-runtime-identity.d.ts.map +1 -1
  452. package/lib/orchestrator/experiment-runtime-identity.js +5 -220
  453. package/lib/orchestrator/experiment-runtime-identity.js.map +1 -1
  454. package/lib/orchestrator/experiment-selection.d.ts.map +1 -1
  455. package/lib/orchestrator/experiment-selection.js +52 -0
  456. package/lib/orchestrator/experiment-selection.js.map +1 -1
  457. package/lib/orchestrator/experiment.d.ts +3 -3
  458. package/lib/orchestrator/experiment.d.ts.map +1 -1
  459. package/lib/orchestrator/experiment.js +26 -21
  460. package/lib/orchestrator/experiment.js.map +1 -1
  461. package/lib/orchestrator/fixture-identity.d.ts +1 -0
  462. package/lib/orchestrator/fixture-identity.d.ts.map +1 -1
  463. package/lib/orchestrator/fixture-identity.js +6 -1
  464. package/lib/orchestrator/fixture-identity.js.map +1 -1
  465. package/lib/orchestrator/fs-read.d.ts +1 -6
  466. package/lib/orchestrator/fs-read.d.ts.map +1 -1
  467. package/lib/orchestrator/fs-read.js +2 -32
  468. package/lib/orchestrator/fs-read.js.map +1 -1
  469. package/lib/orchestrator/grader-experiment.d.ts +29 -1
  470. package/lib/orchestrator/grader-experiment.d.ts.map +1 -1
  471. package/lib/orchestrator/grader-experiment.js +54 -9
  472. package/lib/orchestrator/grader-experiment.js.map +1 -1
  473. package/lib/orchestrator/grading.d.ts +2 -1
  474. package/lib/orchestrator/grading.d.ts.map +1 -1
  475. package/lib/orchestrator/grading.js +27 -8
  476. package/lib/orchestrator/grading.js.map +1 -1
  477. package/lib/orchestrator/harness-catalog-drift.d.ts +22 -0
  478. package/lib/orchestrator/harness-catalog-drift.d.ts.map +1 -0
  479. package/lib/orchestrator/harness-catalog-drift.js +90 -0
  480. package/lib/orchestrator/harness-catalog-drift.js.map +1 -0
  481. package/lib/orchestrator/harness-registry.d.ts +4 -0
  482. package/lib/orchestrator/harness-registry.d.ts.map +1 -0
  483. package/lib/orchestrator/harness-registry.js +5 -0
  484. package/lib/orchestrator/harness-registry.js.map +1 -0
  485. package/lib/orchestrator/index.d.ts +1 -1
  486. package/lib/orchestrator/index.d.ts.map +1 -1
  487. package/lib/orchestrator/index.js +1 -1
  488. package/lib/orchestrator/index.js.map +1 -1
  489. package/lib/orchestrator/list-runs.d.ts +8 -1
  490. package/lib/orchestrator/list-runs.d.ts.map +1 -1
  491. package/lib/orchestrator/list-runs.js +77 -12
  492. package/lib/orchestrator/list-runs.js.map +1 -1
  493. package/lib/orchestrator/optimization-lifecycle.d.ts.map +1 -1
  494. package/lib/orchestrator/optimization-lifecycle.js +3 -1
  495. package/lib/orchestrator/optimization-lifecycle.js.map +1 -1
  496. package/lib/orchestrator/orchestrator.d.ts +18 -2
  497. package/lib/orchestrator/orchestrator.d.ts.map +1 -1
  498. package/lib/orchestrator/orchestrator.js +50 -168
  499. package/lib/orchestrator/orchestrator.js.map +1 -1
  500. package/lib/orchestrator/paired-effects.d.ts +34 -0
  501. package/lib/orchestrator/paired-effects.d.ts.map +1 -0
  502. package/lib/orchestrator/paired-effects.js +158 -0
  503. package/lib/orchestrator/paired-effects.js.map +1 -0
  504. package/lib/orchestrator/provenance.d.ts +5 -1
  505. package/lib/orchestrator/provenance.d.ts.map +1 -1
  506. package/lib/orchestrator/provenance.js +16 -3
  507. package/lib/orchestrator/provenance.js.map +1 -1
  508. package/lib/orchestrator/regrade.d.ts +7 -0
  509. package/lib/orchestrator/regrade.d.ts.map +1 -1
  510. package/lib/orchestrator/rubric-loader.js +1 -1
  511. package/lib/orchestrator/rubric-loader.js.map +1 -1
  512. package/lib/orchestrator/run-dir.d.ts +2 -0
  513. package/lib/orchestrator/run-dir.d.ts.map +1 -1
  514. package/lib/orchestrator/run-dir.js +1 -1
  515. package/lib/orchestrator/run-dir.js.map +1 -1
  516. package/lib/orchestrator/run-execution.d.ts +3 -0
  517. package/lib/orchestrator/run-execution.d.ts.map +1 -1
  518. package/lib/orchestrator/run-execution.js +66 -12
  519. package/lib/orchestrator/run-execution.js.map +1 -1
  520. package/lib/orchestrator/run-lifecycle.d.ts +1 -0
  521. package/lib/orchestrator/run-lifecycle.d.ts.map +1 -1
  522. package/lib/orchestrator/run-lifecycle.js +3 -2
  523. package/lib/orchestrator/run-lifecycle.js.map +1 -1
  524. package/lib/orchestrator/run-workspace.d.ts +10 -0
  525. package/lib/orchestrator/run-workspace.d.ts.map +1 -0
  526. package/lib/orchestrator/run-workspace.js +58 -0
  527. package/lib/orchestrator/run-workspace.js.map +1 -0
  528. package/lib/orchestrator/suite-compare.d.ts +37 -0
  529. package/lib/orchestrator/suite-compare.d.ts.map +1 -1
  530. package/lib/orchestrator/suite-compare.js +27 -17
  531. package/lib/orchestrator/suite-compare.js.map +1 -1
  532. package/lib/orchestrator/suite-runs.d.ts +6 -1
  533. package/lib/orchestrator/suite-runs.d.ts.map +1 -1
  534. package/lib/orchestrator/suite-runs.js +14 -2
  535. package/lib/orchestrator/suite-runs.js.map +1 -1
  536. package/lib/orchestrator/suite-summary.d.ts +77 -0
  537. package/lib/orchestrator/suite-summary.d.ts.map +1 -1
  538. package/lib/orchestrator/suite-summary.js +61 -12
  539. package/lib/orchestrator/suite-summary.js.map +1 -1
  540. package/lib/previewer/artifacts.d.ts +25 -0
  541. package/lib/previewer/artifacts.d.ts.map +1 -0
  542. package/lib/previewer/artifacts.js +180 -0
  543. package/lib/previewer/artifacts.js.map +1 -0
  544. package/lib/previewer/server.d.ts +111 -0
  545. package/lib/previewer/server.d.ts.map +1 -0
  546. package/lib/previewer/server.js +558 -0
  547. package/lib/previewer/server.js.map +1 -0
  548. package/package.json +3 -3
  549. package/skills/lux-answerer/SKILL.md +2 -2
  550. package/src/answerers/claude-code/index.ts +6 -5
  551. package/src/answerers/persona/index.ts +75 -34
  552. package/src/answerers/terminal/index.ts +8 -12
  553. package/src/assertions/authoring.ts +2 -0
  554. package/src/assertions/core/command-exits-zero.ts +61 -7
  555. package/src/assertions/core/event-checks.ts +64 -3
  556. package/src/assertions/core/helpers.ts +3 -6
  557. package/src/assertions/core/index.ts +2 -0
  558. package/src/assertions/core/resource-checks.ts +38 -5
  559. package/src/assertions/rubric/index.ts +68 -13
  560. package/src/assertions/rubric/internal.ts +227 -27
  561. package/src/authoring.ts +345 -2
  562. package/src/cli/bin.ts +2 -12
  563. package/src/cli/command-runtime.ts +20 -9
  564. package/src/cli/doctor.ts +17 -0
  565. package/src/cli/harness-plan.ts +117 -0
  566. package/src/cli/init-templates.ts +238 -0
  567. package/src/cli/init.ts +53 -184
  568. package/src/cli/output-schemas.ts +106 -0
  569. package/src/cli/program.ts +689 -721
  570. package/src/cli/render/reporter.ts +43 -7
  571. package/src/cli/run-options.ts +132 -25
  572. package/src/cli/view.ts +129 -0
  573. package/src/container/driver.ts +211 -0
  574. package/src/container/protocol.ts +48 -0
  575. package/src/container/resources.ts +153 -0
  576. package/src/container/worker.ts +107 -0
  577. package/src/core/action-events.ts +59 -0
  578. package/src/core/agent-activity.ts +236 -0
  579. package/src/core/agent-environment.ts +64 -0
  580. package/src/core/agent-events.ts +17 -0
  581. package/src/core/annotation.ts +2 -1
  582. package/src/core/answerer.ts +9 -0
  583. package/src/core/artifact-evidence.ts +47 -4
  584. package/src/core/assertion.ts +18 -0
  585. package/src/core/case.ts +16 -2
  586. package/src/core/command-verification.ts +74 -0
  587. package/src/core/driver-execution.ts +84 -0
  588. package/src/core/driver-metrics.ts +51 -0
  589. package/src/core/driver.ts +76 -0
  590. package/src/core/duration.ts +52 -0
  591. package/src/core/environment.ts +22 -0
  592. package/src/core/evaluation-clusters.ts +35 -0
  593. package/src/core/events.ts +14 -2
  594. package/src/core/experiment.ts +64 -24
  595. package/src/core/file-tree.ts +35 -0
  596. package/src/core/global-id.ts +26 -0
  597. package/src/core/harness-catalog.ts +100 -0
  598. package/src/core/harness-catalogs/antigravity.ts +24 -0
  599. package/src/core/harness-catalogs/claude-code.ts +25 -0
  600. package/src/core/harness-catalogs/codex.ts +27 -0
  601. package/src/core/harness-catalogs/copilot.ts +46 -0
  602. package/src/core/harness-catalogs/cursor.ts +13 -0
  603. package/src/core/harness-catalogs/grok-build.ts +19 -0
  604. package/src/core/harness-catalogs/index.ts +31 -0
  605. package/src/core/harness-matrix.ts +316 -0
  606. package/src/core/index.ts +12 -0
  607. package/src/core/lifecycle-fixtures.ts +4 -2
  608. package/src/core/model-cli.ts +52 -23
  609. package/src/core/platform-process.ts +58 -10
  610. package/src/core/run.ts +31 -0
  611. package/src/core/usage.ts +8 -0
  612. package/src/core/wire.ts +5 -1
  613. package/src/drivers/antigravity/README.md +171 -0
  614. package/src/drivers/antigravity/artifacts.ts +37 -0
  615. package/src/drivers/antigravity/config.ts +92 -0
  616. package/src/drivers/antigravity/events.ts +290 -0
  617. package/src/drivers/antigravity/index.ts +132 -0
  618. package/src/drivers/antigravity/runtime.ts +94 -0
  619. package/src/drivers/claude-code/deferred-process.ts +118 -0
  620. package/src/drivers/claude-code/index.ts +216 -281
  621. package/src/drivers/claude-code/isolation.ts +228 -0
  622. package/src/drivers/claude-code/parse-events.ts +98 -12
  623. package/src/drivers/codex/app-events.ts +126 -16
  624. package/src/drivers/codex/config.ts +50 -8
  625. package/src/drivers/codex/exec-events.ts +258 -0
  626. package/src/drivers/codex/index.ts +144 -312
  627. package/src/drivers/copilot/README.md +60 -0
  628. package/src/drivers/copilot/config.ts +61 -0
  629. package/src/drivers/copilot/index.ts +310 -0
  630. package/src/drivers/cursor/README.md +66 -0
  631. package/src/drivers/cursor/config.ts +31 -0
  632. package/src/drivers/cursor/index.ts +326 -0
  633. package/src/drivers/cursor/interaction.ts +74 -0
  634. package/src/drivers/grok-build/README.md +112 -0
  635. package/src/drivers/grok-build/config.ts +43 -0
  636. package/src/drivers/grok-build/index.ts +331 -0
  637. package/src/drivers/mcp/index.ts +25 -11
  638. package/src/drivers/shared/acp-events.ts +94 -0
  639. package/src/drivers/shared/acp-interaction.ts +27 -0
  640. package/src/drivers/shared/acp-session.ts +40 -0
  641. package/src/drivers/shared/acp-transport.ts +187 -0
  642. package/src/drivers/shared/artifacts.ts +6 -2
  643. package/src/drivers/shared/experiment-behavior.ts +214 -0
  644. package/src/drivers/shared/experiment-policy.ts +195 -0
  645. package/src/drivers/subprocess/index.ts +55 -12
  646. package/src/index.ts +115 -10
  647. package/src/optimization/reflective.ts +3 -2
  648. package/src/orchestrator/annotation-loader.ts +10 -0
  649. package/src/orchestrator/annotation-store.ts +24 -3
  650. package/src/orchestrator/artifact-origin.ts +50 -0
  651. package/src/orchestrator/campaign-lifecycle.ts +5 -1
  652. package/src/orchestrator/candidates.ts +3 -2
  653. package/src/orchestrator/compare.ts +34 -1
  654. package/src/orchestrator/comparison-identity.ts +2 -0
  655. package/src/orchestrator/config.ts +20 -3
  656. package/src/orchestrator/discover.ts +8 -1
  657. package/src/orchestrator/doctor.ts +189 -28
  658. package/src/orchestrator/driver-capabilities.ts +21 -0
  659. package/src/orchestrator/driver-identity.ts +69 -0
  660. package/src/orchestrator/experiment-context.ts +3 -2
  661. package/src/orchestrator/experiment-corpus.ts +53 -37
  662. package/src/orchestrator/experiment-effects.ts +61 -0
  663. package/src/orchestrator/experiment-evaluation.ts +71 -10
  664. package/src/orchestrator/experiment-identity.ts +42 -48
  665. package/src/orchestrator/experiment-preflight.ts +27 -0
  666. package/src/orchestrator/experiment-report.ts +21 -1
  667. package/src/orchestrator/experiment-runs.ts +11 -4
  668. package/src/orchestrator/experiment-runtime-identity.ts +5 -243
  669. package/src/orchestrator/experiment-selection.ts +77 -0
  670. package/src/orchestrator/experiment.ts +29 -29
  671. package/src/orchestrator/fixture-identity.ts +9 -1
  672. package/src/orchestrator/fs-read.ts +2 -32
  673. package/src/orchestrator/grader-experiment.ts +74 -13
  674. package/src/orchestrator/grading.ts +35 -7
  675. package/src/orchestrator/harness-catalog-drift.ts +132 -0
  676. package/src/orchestrator/harness-registry.ts +12 -0
  677. package/src/orchestrator/index.ts +1 -0
  678. package/src/orchestrator/list-runs.ts +95 -11
  679. package/src/orchestrator/optimization-lifecycle.ts +4 -1
  680. package/src/orchestrator/orchestrator.ts +92 -216
  681. package/src/orchestrator/paired-effects.ts +209 -0
  682. package/src/orchestrator/provenance.ts +23 -3
  683. package/src/orchestrator/rubric-loader.ts +1 -1
  684. package/src/orchestrator/run-dir.ts +8 -1
  685. package/src/orchestrator/run-execution.ts +77 -11
  686. package/src/orchestrator/run-lifecycle.ts +4 -2
  687. package/src/orchestrator/run-workspace.ts +62 -0
  688. package/src/orchestrator/suite-compare.ts +29 -19
  689. package/src/orchestrator/suite-runs.ts +13 -2
  690. package/src/orchestrator/suite-summary.ts +122 -13
  691. package/src/previewer/artifacts.ts +221 -0
  692. package/src/previewer/server.ts +787 -0
  693. package/viewer/app.css +2075 -0
  694. package/viewer/app.js +627 -0
  695. package/viewer/artifact-view.js +48 -0
  696. package/viewer/charts.js +86 -0
  697. package/viewer/detail.js +1231 -0
  698. package/viewer/format.js +129 -0
  699. package/viewer/index.html +151 -0
  700. package/lib/answerers/scripted/index.d.ts +0 -8
  701. package/lib/answerers/scripted/index.d.ts.map +0 -1
  702. package/lib/answerers/scripted/index.js +0 -163
  703. package/lib/answerers/scripted/index.js.map +0 -1
  704. package/lib/cli/skills.d.ts +0 -38
  705. package/lib/cli/skills.d.ts.map +0 -1
  706. package/lib/cli/skills.js +0 -84
  707. package/lib/cli/skills.js.map +0 -1
  708. package/lib/drivers/shared/secure-copy.d.ts.map +0 -1
  709. package/lib/drivers/shared/secure-copy.js.map +0 -1
  710. package/skills/lux/SKILL.md +0 -85
  711. package/skills/lux/references/cli.md +0 -102
  712. package/skills/lux/references/eval-authoring.md +0 -105
  713. package/src/answerers/scripted/index.ts +0 -186
  714. package/src/cli/skills.ts +0 -129
  715. /package/lib/{drivers/shared → core}/secure-copy.d.ts +0 -0
  716. /package/lib/{drivers/shared → core}/secure-copy.js +0 -0
  717. /package/src/{drivers/shared → core}/secure-copy.ts +0 -0
@@ -4,11 +4,11 @@ import { pathToFileURL } from "node:url";
4
4
  import { z } from "zod";
5
5
  import { claudeCodeAnswerer } from "../answerers/claude-code/index.js";
6
6
  import { personaAnswerer } from "../answerers/persona/index.js";
7
- import { scriptedAnswerer } from "../answerers/scripted/index.js";
8
7
  import { terminalAnswerer } from "../answerers/terminal/index.js";
9
8
  import { allCoreAssertions } from "../assertions/core/index.js";
10
9
  import { allMcpAssertions } from "../assertions/mcp/index.js";
11
10
  import { createRubricAssertion } from "../assertions/rubric/index.js";
11
+ import { EnvironmentDeclarationSchema } from "../core/environment.js";
12
12
  import {
13
13
  type AnswererPlugin,
14
14
  AnswererRefSchema,
@@ -18,13 +18,18 @@ import {
18
18
  type DriverPlugin,
19
19
  DriverRefSchema,
20
20
  formatZodIssues,
21
+ HarnessMatrixSchema,
21
22
  HarnessModelConfigSchema,
22
23
  type LifecycleHooksPlugin,
23
24
  lifecycleHooksPluginIssue,
24
25
  Registry,
25
26
  } from "../core/index.js";
27
+ import { antigravityDriver } from "../drivers/antigravity/index.js";
26
28
  import { claudeCodeDriver } from "../drivers/claude-code/index.js";
27
29
  import { codexDriver } from "../drivers/codex/index.js";
30
+ import { copilotDriver } from "../drivers/copilot/index.js";
31
+ import { cursorDriver } from "../drivers/cursor/index.js";
32
+ import { grokBuildDriver } from "../drivers/grok-build/index.js";
28
33
  import { mcpProbeDriver } from "../drivers/mcp/index.js";
29
34
  import { subprocessDriver } from "../drivers/subprocess/index.js";
30
35
 
@@ -35,6 +40,7 @@ const pluginLike = z.looseObject({
35
40
 
36
41
  export const ExperimentProfileSchema = z
37
42
  .object({
43
+ environment: EnvironmentDeclarationSchema.optional(),
38
44
  driver: DriverRefSchema.optional(),
39
45
  answerer: AnswererRefSchema.optional(),
40
46
  harness: HarnessModelConfigSchema.optional(),
@@ -68,8 +74,9 @@ const LifecycleHooksPluginSchema = z.custom<LifecycleHooksPlugin>().superRefine(
68
74
  if (issue) ctx.addIssue({ code: "custom", message: issue });
69
75
  });
70
76
 
71
- const LuxConfigSchema = z
77
+ export const LuxConfigSchema = z
72
78
  .object({
79
+ environment: EnvironmentDeclarationSchema.optional(),
73
80
  casesRoot: z.string().optional(),
74
81
  fixturesRoot: z.string().optional(),
75
82
  runsRoot: z.string().default(".lux-runs"),
@@ -77,6 +84,8 @@ const LuxConfigSchema = z
77
84
  subjectRoot: z.string().optional(),
78
85
  defaultAnswerer: AnswererRefSchema.default("persona"),
79
86
  defaultDriver: DriverRefSchema.optional(),
87
+ /** Driver, model, and effort permutations every case runs through by default. */
88
+ matrix: HarnessMatrixSchema.optional(),
80
89
  /** Shared provider/model defaults for persona answering and rubric judging. */
81
90
  harness: HarnessModelConfigSchema.optional(),
82
91
  concurrency: z.number().int().min(1).default(1),
@@ -163,8 +172,10 @@ export const loadLuxConfig = async (cwd: string = process.cwd()): Promise<Resolv
163
172
  ...(validated.fixturesRoot ? { fixturesRoot: resolve(root, validated.fixturesRoot) } : {}),
164
173
  defaultAnswerer: validated.defaultAnswerer,
165
174
  ...(validated.defaultDriver ? { defaultDriver: validated.defaultDriver } : {}),
175
+ ...(validated.matrix ? { matrix: validated.matrix } : {}),
166
176
  ...(validated.harness ? { harness: validated.harness } : {}),
167
177
  concurrency: validated.concurrency,
178
+ ...(validated.environment ? { environment: validated.environment } : {}),
168
179
  ...(validated.profiles ? { profiles: validated.profiles } : {}),
169
180
  ...(validated.drivers ? { drivers: validated.drivers } : {}),
170
181
  ...(validated.answerers ? { answerers: validated.answerers } : {}),
@@ -176,13 +187,19 @@ export const loadLuxConfig = async (cwd: string = process.cwd()): Promise<Resolv
176
187
  const builtinDrivers: DriverPlugin<never>[] = [
177
188
  claudeCodeDriver,
178
189
  codexDriver,
190
+ cursorDriver,
191
+ copilotDriver,
192
+ grokBuildDriver,
193
+ antigravityDriver,
179
194
  subprocessDriver,
180
195
  mcpProbeDriver,
181
196
  ];
197
+ export const isBuiltinDriver = (plugin: DriverPlugin): boolean =>
198
+ builtinDrivers.some((builtin) => builtin === plugin);
199
+
182
200
  const builtinAnswerers: AnswererPlugin<never>[] = [
183
201
  personaAnswerer,
184
202
  claudeCodeAnswerer,
185
- scriptedAnswerer,
186
203
  terminalAnswerer,
187
204
  ];
188
205
  export const buildRegistryFromConfig = (config: ResolvedLuxConfig): Registry => {
@@ -13,6 +13,7 @@ export type DiscoveredCase = {
13
13
  relPath: string;
14
14
  /** `meta.tags` normalized to strings; empty when unset. */
15
15
  tags: string[];
16
+ cluster?: string;
16
17
  };
17
18
 
18
19
  /**
@@ -96,7 +97,13 @@ export const discoverCases = async (root: string): Promise<DiscoveryResult> => {
96
97
  problems.push({ path, reason: formatZodIssues(parsed.error) });
97
98
  continue;
98
99
  }
99
- cases.push({ path, id: parsed.data.id ?? relPath, relPath, tags: tagsOf(parsed.data.meta) });
100
+ cases.push({
101
+ path,
102
+ id: parsed.data.id ?? relPath,
103
+ relPath,
104
+ tags: tagsOf(parsed.data.meta),
105
+ ...(parsed.data.meta?.cluster ? { cluster: parsed.data.meta.cluster } : {}),
106
+ });
100
107
  }
101
108
  return { cases, problems };
102
109
  };
@@ -4,17 +4,34 @@ import { resolve } from "node:path";
4
4
  import { glob } from "tinyglobby";
5
5
  import { z } from "zod";
6
6
  import { RubricConfigSchema } from "../assertions/rubric/index.js";
7
- import type { EvalCase, Registry } from "../core/index.js";
7
+ import { driverExecutionOf } from "../core/driver-execution.js";
8
+ import {
9
+ casePermutations,
10
+ type EvalCase,
11
+ expandHarnessMatrix,
12
+ type HarnessPermutation,
13
+ permutationDriverRef,
14
+ permutationId,
15
+ type Registry,
16
+ } from "../core/index.js";
8
17
  import { registryForEvalCase } from "./case-extensions.js";
9
18
  import { buildRegistryFromConfig, loadLuxConfig, type ResolvedLuxConfig } from "./config.js";
10
19
  import { type DiscoveredCase, type DiscoveryResult, discoverCases } from "./discover.js";
11
- import { cliIdentity, ExperimentCampaignPlanSchema, planExperimentCampaign } from "./experiment.js";
20
+ import { validateDriverCapabilities } from "./driver-capabilities.js";
21
+ import { ExperimentCampaignPlanSchema, planExperimentCampaign } from "./experiment.js";
12
22
  import {
13
23
  experimentCampaignMode,
14
24
  loadExperimentCampaign,
15
25
  resolveExperimentCampaignPath,
16
26
  } from "./experiment-loader.js";
27
+ import { cliIdentity } from "./experiment-runtime-identity.js";
17
28
  import { assertionConfigForSchema } from "./grading.js";
29
+ import {
30
+ describeHarnessCatalogDrift,
31
+ harnessCatalogDrift,
32
+ harnessCatalogProbes,
33
+ hasHarnessCatalogDrift,
34
+ } from "./harness-catalog-drift.js";
18
35
  import { loadEvalCase } from "./loader.js";
19
36
  import { validatePluginConfig, validatePluginConfigAsync } from "./validate-plugin-config.js";
20
37
 
@@ -60,6 +77,7 @@ export const DoctorOptionsSchema = z
60
77
  .object({
61
78
  cwd: z.string().min(1),
62
79
  campaigns: z.array(z.string()).optional(),
80
+ static: z.boolean().optional(),
63
81
  })
64
82
  .strict();
65
83
  export type DoctorOptions = z.input<typeof DoctorOptionsSchema>;
@@ -126,10 +144,32 @@ const effectiveDriverReference = (local: unknown, fallback: unknown): unknown =>
126
144
  return {
127
145
  name: refName(local),
128
146
  config: mergeRecords(rawRefConfig(fallback), rawRefConfig(local)),
147
+ execution: driverExecutionOf(local) ?? driverExecutionOf(fallback),
129
148
  };
130
149
  };
131
150
 
132
- const caseDriverReferences = (local: unknown, config: ResolvedLuxConfig): unknown[] => {
151
+ const boundPermutation = (
152
+ permutation: HarnessPermutation,
153
+ config: ResolvedLuxConfig,
154
+ registry: Registry,
155
+ ): unknown => {
156
+ const plugin = registry.getDriver(permutation.driver);
157
+ if (!plugin) throw new Error(`unknown driver '${permutation.driver}'`);
158
+ return permutationDriverRef(permutation, config.defaultDriver, plugin);
159
+ };
160
+
161
+ const caseDriverReferences = (
162
+ authored: Pick<EvalCase, "driver" | "matrix">,
163
+ config: ResolvedLuxConfig,
164
+ registry: Registry,
165
+ ): unknown[] => {
166
+ const local = authored.driver;
167
+ const permutations = casePermutations(authored, config.matrix);
168
+ if (permutations.length > 0) {
169
+ return permutations.map((permutation) =>
170
+ effectiveDriverReference(local, boundPermutation(permutation, config, registry)),
171
+ );
172
+ }
133
173
  const fallbacks = [
134
174
  config.defaultDriver,
135
175
  ...Object.values(config.profiles ?? {}).map((profile) => profile.driver),
@@ -142,17 +182,20 @@ const caseDriverReferences = (local: unknown, config: ResolvedLuxConfig): unknow
142
182
  ];
143
183
  };
144
184
 
145
- const driverCommand = (reference: unknown): string | undefined => {
185
+ const driverCommands = (reference: unknown, registry: Registry): string[] => {
146
186
  const name = refName(reference);
147
- const config = refConfig(reference);
148
- if (name === "claude-code") {
149
- return typeof config.command === "string" ? config.command : "claude";
150
- }
151
- if (name === "codex") return typeof config.command === "string" ? config.command : "codex";
152
- if (name === "subprocess") {
153
- return typeof config.command === "string" ? config.command : undefined;
187
+ const plugin = name ? registry.getDriver(name) : undefined;
188
+ if (!plugin?.runtime) return [];
189
+ try {
190
+ const config = validatePluginConfig(
191
+ plugin.configSchema,
192
+ rawRefConfig(reference),
193
+ `driver '${name}'`,
194
+ );
195
+ return plugin.runtime(config).commands;
196
+ } catch {
197
+ return [];
154
198
  }
155
- return undefined;
156
199
  };
157
200
 
158
201
  const answererCommand = (reference: unknown): string | undefined => {
@@ -179,12 +222,24 @@ const rubricCommands = (assertion: unknown, config: ResolvedLuxConfig): string[]
179
222
  return [...new Set(commands)];
180
223
  };
181
224
 
182
- const configuredCliTargets = (config: ResolvedLuxConfig): CliTarget[] => {
225
+ const configuredCliTargets = (config: ResolvedLuxConfig, registry: Registry): CliTarget[] => {
183
226
  const targets: CliTarget[] = [];
184
227
  const add = (label: string, command: string | undefined): void => {
185
228
  if (command) targets.push({ label, command });
186
229
  };
187
- add("default driver", driverCommand(config.defaultDriver));
230
+ for (const command of driverCommands(config.defaultDriver, registry))
231
+ add("default driver", command);
232
+ for (const permutation of expandHarnessMatrix(config.matrix ?? [])) {
233
+ try {
234
+ for (const command of driverCommands(
235
+ boundPermutation(permutation, config, registry),
236
+ registry,
237
+ ))
238
+ add(`matrix '${permutationId(permutation)}' driver`, command);
239
+ } catch {
240
+ /* Reported by validateConfiguredMatrix. */
241
+ }
242
+ }
188
243
  add("default answerer", answererCommand(config.defaultAnswerer));
189
244
  if (config.harness) {
190
245
  add(
@@ -195,7 +250,9 @@ const configuredCliTargets = (config: ResolvedLuxConfig): CliTarget[] => {
195
250
  for (const [id, profile] of Object.entries(config.profiles ?? {}).sort(([a], [b]) =>
196
251
  a.localeCompare(b),
197
252
  )) {
198
- add(`profile '${id}' driver`, driverCommand(profile.driver ?? config.defaultDriver));
253
+ for (const command of driverCommands(profile.driver ?? config.defaultDriver, registry)) {
254
+ add(`profile '${id}' driver`, command);
255
+ }
199
256
  add(`profile '${id}' answerer`, answererCommand(profile.answerer ?? config.defaultAnswerer));
200
257
  const harness = profile.harness ?? config.harness;
201
258
  if (harness) {
@@ -348,6 +405,32 @@ const validateConfiguredDrivers = (
348
405
  }
349
406
  };
350
407
 
408
+ const validateConfiguredMatrix = (
409
+ config: ResolvedLuxConfig,
410
+ registry: Registry,
411
+ recorder: DoctorRecorder,
412
+ ): void => {
413
+ for (const permutation of expandHarnessMatrix(config.matrix ?? [])) {
414
+ const id = permutationId(permutation);
415
+ try {
416
+ const reference = boundPermutation(permutation, config, registry);
417
+ const plugin = registry.getDriver(permutation.driver);
418
+ validatePluginConfig(
419
+ plugin?.configSchema,
420
+ rawRefConfig(reference),
421
+ `matrix '${id}' driver '${permutation.driver}'`,
422
+ );
423
+ } catch (error) {
424
+ recorder.add(
425
+ `matrix:${id}`,
426
+ "fail",
427
+ `matrix permutation '${id}' is not runnable`,
428
+ firstLine(error),
429
+ );
430
+ }
431
+ }
432
+ };
433
+
351
434
  const validateConfiguredAnswerers = (
352
435
  config: ResolvedLuxConfig,
353
436
  registry: Registry,
@@ -418,17 +501,19 @@ const caseDriverFailure = (
418
501
  caseId: string,
419
502
  reference: unknown,
420
503
  registry: Registry,
504
+ required: EvalCase["requires"],
421
505
  ): string | null => {
422
506
  const name = refName(reference);
423
507
  if (!name) return "driver reference has no name";
424
508
  const plugin = registry.getDriver(name);
425
509
  if (!plugin) return `unknown driver '${name}'`;
426
510
  try {
427
- validatePluginConfig(
511
+ const config = validatePluginConfig(
428
512
  plugin.configSchema,
429
513
  rawRefConfig(reference),
430
514
  `case '${caseId}' driver '${name}'`,
431
515
  );
516
+ validateDriverCapabilities(plugin, config, required, driverExecutionOf(reference));
432
517
  return null;
433
518
  } catch (error) {
434
519
  return firstLine(error);
@@ -440,6 +525,7 @@ const validateCaseDrivers = (
440
525
  drivers: readonly unknown[],
441
526
  registry: Registry,
442
527
  recorder: DoctorRecorder,
528
+ required: EvalCase["requires"],
443
529
  ): void => {
444
530
  if (drivers.length === 0) {
445
531
  recorder.add(
@@ -450,7 +536,7 @@ const validateCaseDrivers = (
450
536
  return;
451
537
  }
452
538
  const failures = drivers
453
- .map((driver) => caseDriverFailure(caseId, driver, registry))
539
+ .map((driver) => caseDriverFailure(caseId, driver, registry, required))
454
540
  .filter((failure): failure is string => failure !== null);
455
541
  if (failures.length === drivers.length) {
456
542
  recorder.add(
@@ -542,13 +628,16 @@ const executionTargetsForCase = (
542
628
  caseId: string,
543
629
  drivers: readonly unknown[],
544
630
  answerer: unknown,
631
+ registry: Registry,
545
632
  ): CliTarget[] => {
546
633
  const targets = drivers.flatMap((driver): CliTarget[] => {
547
- const command = driverCommand(driver);
548
- return command ? [{ label: `case '${caseId}' driver`, command }] : [];
634
+ return driverCommands(driver, registry).map((command) => ({
635
+ label: `case '${caseId}' driver`,
636
+ command,
637
+ }));
549
638
  });
550
- const command = answererCommand(answerer);
551
- if (command) targets.push({ label: `case '${caseId}' answerer`, command });
639
+ const answererCli = answererCommand(answerer);
640
+ if (answererCli) targets.push({ label: `case '${caseId}' answerer`, command: answererCli });
552
641
  return targets;
553
642
  };
554
643
 
@@ -561,13 +650,13 @@ const inspectCase = async (
561
650
  try {
562
651
  const authored = await loadEvalCase(discovered.path);
563
652
  const caseRegistry = registryForEvalCase(registry, authored);
564
- const drivers = caseDriverReferences(authored.driver, config);
653
+ const drivers = caseDriverReferences(authored, config, caseRegistry);
565
654
  const answerer = authored.answerer ?? config.defaultAnswerer;
566
- validateCaseDrivers(discovered.id, drivers, caseRegistry, recorder);
655
+ validateCaseDrivers(discovered.id, drivers, caseRegistry, recorder, authored.requires);
567
656
  validateCaseAnswerer(discovered.id, answerer, caseRegistry, recorder);
568
657
  return [
569
658
  ...(await validateCaseAssertions(discovered.id, authored, config, caseRegistry, recorder)),
570
- ...executionTargetsForCase(discovered.id, drivers, answerer),
659
+ ...executionTargetsForCase(discovered.id, drivers, answerer, caseRegistry),
571
660
  ];
572
661
  } catch (error) {
573
662
  recorder.add(
@@ -644,6 +733,54 @@ const inspectCliTargets = async (
644
733
  }
645
734
  };
646
735
 
736
+ const catalogDriverReferences = (config: ResolvedLuxConfig): unknown[] => [
737
+ ...configuredDriverReferences(config).map(([, reference]) => reference),
738
+ ...(config.matrix ?? []).map((entry) => ({ name: entry.driver, config: entry.config })),
739
+ ];
740
+
741
+ const configuredDriverCommand = (config: ResolvedLuxConfig, driver: string): string | undefined => {
742
+ for (const reference of catalogDriverReferences(config)) {
743
+ if (refName(reference) !== driver) continue;
744
+ const command = (rawRefConfig(reference) as { command?: unknown } | undefined)?.command;
745
+ if (typeof command === "string") return command;
746
+ }
747
+ return undefined;
748
+ };
749
+
750
+ const inspectHarnessCatalogs = async (
751
+ config: ResolvedLuxConfig,
752
+ recorder: DoctorRecorder,
753
+ ): Promise<void> => {
754
+ const configured = new Set(
755
+ catalogDriverReferences(config)
756
+ .map(refName)
757
+ .filter((name): name is string => name !== undefined),
758
+ );
759
+ for (const probe of harnessCatalogProbes) {
760
+ const driver = probe.catalog.driver;
761
+ if (!configured.has(driver)) continue;
762
+ const live = await probe.read(configuredDriverCommand(config, driver));
763
+ if (!live) {
764
+ recorder.add(
765
+ `catalog:${driver}`,
766
+ "warn",
767
+ `${driver} harness catalog (verified ${probe.catalog.verified}) could not be compared with the installed CLI`,
768
+ `${probe.source} was unavailable`,
769
+ );
770
+ continue;
771
+ }
772
+ const drift = harnessCatalogDrift(probe.catalog, live);
773
+ recorder.add(
774
+ `catalog:${driver}`,
775
+ hasHarnessCatalogDrift(drift) ? "warn" : "pass",
776
+ hasHarnessCatalogDrift(drift)
777
+ ? `${driver} harness catalog (verified ${probe.catalog.verified}) differs from the installed CLI`
778
+ : `${driver} harness catalog matches the installed CLI`,
779
+ describeHarnessCatalogDrift(drift) || undefined,
780
+ );
781
+ }
782
+ };
783
+
647
784
  const isBlockingCampaignWarning = (warning: string): boolean =>
648
785
  warning.includes("below confidence minSamples=") || warning.includes("cannot attain confidence");
649
786
 
@@ -652,6 +789,7 @@ const inspectCampaign = async (
652
789
  config: ResolvedLuxConfig,
653
790
  registry: Registry,
654
791
  recorder: DoctorRecorder,
792
+ staticChecks: boolean,
655
793
  ): Promise<void> => {
656
794
  try {
657
795
  const loaded = await loadExperimentCampaign(path);
@@ -665,7 +803,9 @@ const inspectCampaign = async (
665
803
  placeholders.join(", "),
666
804
  );
667
805
  }
668
- const plan = await planExperimentCampaign({ config, registry, loaded }, mode);
806
+ const plan = await planExperimentCampaign({ config, registry, loaded }, mode, {
807
+ static: staticChecks,
808
+ });
669
809
  recorder.campaigns.push({ path, campaignId: loaded.campaign.id, mode, plan });
670
810
  recorder.add(
671
811
  `campaign:${loaded.campaign.id}`,
@@ -697,6 +837,7 @@ const inspectCampaigns = async (
697
837
  config: ResolvedLuxConfig,
698
838
  registry: Registry,
699
839
  recorder: DoctorRecorder,
840
+ staticChecks: boolean,
700
841
  ): Promise<void> => {
701
842
  let paths: string[];
702
843
  try {
@@ -719,7 +860,7 @@ const inspectCampaigns = async (
719
860
  );
720
861
  }
721
862
  for (const path of paths) {
722
- await inspectCampaign(path, config, registry, recorder);
863
+ await inspectCampaign(path, config, registry, recorder, staticChecks);
723
864
  }
724
865
  };
725
866
 
@@ -733,10 +874,30 @@ export const doctorProject = async (options: DoctorOptions): Promise<DoctorRepor
733
874
  if (!registry) return recorder.finish(config.rootDir);
734
875
 
735
876
  validateConfiguredDrivers(config, registry, recorder);
877
+ validateConfiguredMatrix(config, registry, recorder);
736
878
  validateConfiguredAnswerers(config, registry, recorder);
737
879
  const caseCliTargets = await inspectCases(config, registry, recorder);
738
- await inspectCliTargets([...configuredCliTargets(config), ...caseCliTargets], config, recorder);
739
- await inspectCampaigns(parsedOptions.campaigns ?? [], config, registry, recorder);
880
+ if (parsedOptions.static) {
881
+ recorder.add(
882
+ "static-checks",
883
+ "warn",
884
+ "static checks only; installed executables and campaign execution identity were not checked",
885
+ );
886
+ } else {
887
+ await inspectCliTargets(
888
+ [...configuredCliTargets(config, registry), ...caseCliTargets],
889
+ config,
890
+ recorder,
891
+ );
892
+ await inspectHarnessCatalogs(config, recorder);
893
+ }
894
+ await inspectCampaigns(
895
+ parsedOptions.campaigns ?? [],
896
+ config,
897
+ registry,
898
+ recorder,
899
+ parsedOptions.static ?? false,
900
+ );
740
901
  return recorder.finish(config.rootDir);
741
902
  };
742
903
 
@@ -0,0 +1,21 @@
1
+ import type { DriverCapability, DriverPlugin } from "../core/driver.js";
2
+ import type { DriverExecution } from "../core/driver-execution.js";
3
+
4
+ export const validateDriverCapabilities = (
5
+ plugin: DriverPlugin,
6
+ config: unknown,
7
+ required: readonly DriverCapability[] = [],
8
+ execution?: DriverExecution,
9
+ ): void => {
10
+ if (required.length === 0) return;
11
+ const capabilities = {
12
+ ...plugin.runtime?.(config).capabilities,
13
+ ...(execution?.kind === "container" ? { isolation: true } : {}),
14
+ };
15
+ const missing = required.filter((capability) => capabilities?.[capability] !== true);
16
+ if (missing.length > 0) {
17
+ throw new Error(
18
+ `driver '${plugin.name}' does not declare required capabilities: ${missing.join(", ")}`,
19
+ );
20
+ }
21
+ };
@@ -0,0 +1,69 @@
1
+ import type { DriverPlugin, DriverRuntime } from "../core/driver.js";
2
+ import { driverExecutionOf } from "../core/driver-execution.js";
3
+ import type { Registry } from "../core/registry.js";
4
+ import { cliIdentity } from "./experiment-runtime-identity.js";
5
+ import { validatePluginConfig } from "./validate-plugin-config.js";
6
+
7
+ const resolvedDriver = (
8
+ reference: unknown,
9
+ registry: Registry,
10
+ ): { plugin: DriverPlugin; config: unknown } | undefined => {
11
+ const name =
12
+ typeof reference === "string" ? reference : (reference as { name?: unknown } | null)?.name;
13
+ if (typeof name !== "string") return undefined;
14
+ const plugin = registry.getDriver(name);
15
+ if (!plugin) throw new Error(`unknown driver '${name}'`);
16
+ const raw =
17
+ typeof reference === "object" && reference !== null
18
+ ? (reference as { config?: unknown }).config
19
+ : undefined;
20
+ return { plugin, config: validatePluginConfig(plugin.configSchema, raw, `driver '${name}'`) };
21
+ };
22
+
23
+ export const referencedDriverRuntime = (reference: unknown, registry: Registry): DriverRuntime => {
24
+ const resolved = resolvedDriver(reference, registry);
25
+ const runtime = resolved?.plugin.runtime?.(resolved.config) ?? { commands: [], capabilities: {} };
26
+ const execution = driverExecutionOf(reference);
27
+ return execution?.kind === "container"
28
+ ? {
29
+ commands: [execution.command ?? "docker"],
30
+ capabilities: { ...runtime.capabilities, isolation: true },
31
+ }
32
+ : runtime;
33
+ };
34
+
35
+ export const experimentDriverIdentity = async (
36
+ reference: unknown,
37
+ registry: Registry,
38
+ rootDir: string,
39
+ ): Promise<unknown> => {
40
+ if (driverExecutionOf(reference)?.kind === "container")
41
+ throw new Error("container execution does not yet support controlled experiments");
42
+ const resolved = resolvedDriver(reference, registry);
43
+ if (!resolved) return null;
44
+ const { plugin, config } = resolved;
45
+ const experiment = plugin.experiment;
46
+ if (!experiment)
47
+ throw new Error(
48
+ `driver '${plugin.name}' supports ordinary eval runs but does not declare controlled experiment support`,
49
+ );
50
+ if (!experiment.version.trim())
51
+ throw new Error(`driver '${plugin.name}' experiment version must not be empty`);
52
+ const prepared = validatePluginConfig(
53
+ plugin.configSchema,
54
+ experiment.prepare(config),
55
+ `driver '${plugin.name}' experiment configuration`,
56
+ );
57
+ const runtime = plugin.runtime?.(prepared) ?? { commands: [], capabilities: {} };
58
+ const behavior = await experiment.identity(config, { rootDir });
59
+ return {
60
+ driver: plugin.name,
61
+ version: experiment.version,
62
+ config: prepared,
63
+ capabilities: runtime.capabilities,
64
+ executables: await Promise.all(
65
+ runtime.commands.map((command) => cliIdentity(command, rootDir)),
66
+ ),
67
+ behavior,
68
+ };
69
+ };
@@ -3,17 +3,18 @@ import type { ResolvedLuxConfig } from "./config.js";
3
3
  import type { discoverCases } from "./discover.js";
4
4
  import type { LoadedExperimentCampaign } from "./experiment-loader.js";
5
5
 
6
- export type EvaluationCorpus =
6
+ export type CorpusSelection =
7
7
  | {
8
8
  kind: "agent";
9
9
  cases: Awaited<ReturnType<typeof discoverCases>>["cases"];
10
- hash: string;
11
10
  }
12
11
  | {
13
12
  kind: "grader";
14
13
  hash: string;
15
14
  };
16
15
 
16
+ export type EvaluationCorpus = CorpusSelection & { hash: string };
17
+
17
18
  export type CampaignExecutionOptions = {
18
19
  config: ResolvedLuxConfig;
19
20
  registry: Registry;