@prismatic-io/lux 0.0.2-preview.4 → 0.0.2-preview.40

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