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

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 (756) 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 +65 -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 +67 -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 +211 -46
  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 +153 -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 +31 -15
  250. package/lib/core/model-cli.d.ts.map +1 -1
  251. package/lib/core/model-cli.js +53 -23
  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 +198 -253
  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 +149 -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 +231 -10
  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 +163 -78
  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 +52 -4
  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 +32 -24
  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 +50 -42
  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 +59 -179
  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/regrade.js +5 -1
  546. package/lib/orchestrator/regrade.js.map +1 -1
  547. package/lib/orchestrator/rubric-loader.js +1 -1
  548. package/lib/orchestrator/rubric-loader.js.map +1 -1
  549. package/lib/orchestrator/run-dir.d.ts +2 -0
  550. package/lib/orchestrator/run-dir.d.ts.map +1 -1
  551. package/lib/orchestrator/run-dir.js +1 -1
  552. package/lib/orchestrator/run-dir.js.map +1 -1
  553. package/lib/orchestrator/run-execution.d.ts +3 -0
  554. package/lib/orchestrator/run-execution.d.ts.map +1 -1
  555. package/lib/orchestrator/run-execution.js +64 -10
  556. package/lib/orchestrator/run-execution.js.map +1 -1
  557. package/lib/orchestrator/run-lifecycle.d.ts +1 -0
  558. package/lib/orchestrator/run-lifecycle.d.ts.map +1 -1
  559. package/lib/orchestrator/run-lifecycle.js +3 -2
  560. package/lib/orchestrator/run-lifecycle.js.map +1 -1
  561. package/lib/orchestrator/run-workspace.d.ts +10 -0
  562. package/lib/orchestrator/run-workspace.d.ts.map +1 -0
  563. package/lib/orchestrator/run-workspace.js +58 -0
  564. package/lib/orchestrator/run-workspace.js.map +1 -0
  565. package/lib/orchestrator/suite-compare.d.ts +37 -0
  566. package/lib/orchestrator/suite-compare.d.ts.map +1 -1
  567. package/lib/orchestrator/suite-compare.js +44 -22
  568. package/lib/orchestrator/suite-compare.js.map +1 -1
  569. package/lib/orchestrator/suite-runs.d.ts +6 -1
  570. package/lib/orchestrator/suite-runs.d.ts.map +1 -1
  571. package/lib/orchestrator/suite-runs.js +14 -2
  572. package/lib/orchestrator/suite-runs.js.map +1 -1
  573. package/lib/orchestrator/suite-summary.d.ts +79 -0
  574. package/lib/orchestrator/suite-summary.d.ts.map +1 -1
  575. package/lib/orchestrator/suite-summary.js +67 -14
  576. package/lib/orchestrator/suite-summary.js.map +1 -1
  577. package/lib/previewer/artifacts.d.ts +25 -0
  578. package/lib/previewer/artifacts.d.ts.map +1 -0
  579. package/lib/previewer/artifacts.js +180 -0
  580. package/lib/previewer/artifacts.js.map +1 -0
  581. package/lib/previewer/server.d.ts +111 -0
  582. package/lib/previewer/server.d.ts.map +1 -0
  583. package/lib/previewer/server.js +559 -0
  584. package/lib/previewer/server.js.map +1 -0
  585. package/package.json +4 -2
  586. package/skills/lux-answerer/SKILL.md +2 -2
  587. package/src/answerers/claude-code/index.ts +6 -5
  588. package/src/answerers/persona/index.ts +80 -34
  589. package/src/answerers/terminal/index.ts +7 -11
  590. package/src/assertions/authoring.ts +2 -0
  591. package/src/assertions/core/command-exits-zero.ts +82 -17
  592. package/src/assertions/core/event-checks.ts +64 -3
  593. package/src/assertions/core/index.ts +2 -0
  594. package/src/assertions/core/resource-checks.ts +38 -5
  595. package/src/assertions/core/safe-regex.ts +16 -6
  596. package/src/assertions/rubric/evidence.ts +85 -0
  597. package/src/assertions/rubric/index.ts +76 -46
  598. package/src/assertions/rubric/internal.ts +264 -46
  599. package/src/authoring.ts +346 -2
  600. package/src/cli/bin.ts +2 -12
  601. package/src/cli/command-runtime.ts +20 -9
  602. package/src/cli/doctor.ts +17 -0
  603. package/src/cli/harness-plan.ts +123 -0
  604. package/src/cli/init-templates.ts +176 -0
  605. package/src/cli/init.ts +53 -184
  606. package/src/cli/output-schemas.ts +109 -0
  607. package/src/cli/program.ts +697 -730
  608. package/src/cli/render/format.ts +1 -1
  609. package/src/cli/render/reporter.ts +36 -8
  610. package/src/cli/run-options.ts +131 -25
  611. package/src/cli/view.ts +129 -0
  612. package/src/container/driver.ts +213 -0
  613. package/src/container/paths.ts +29 -0
  614. package/src/container/protocol.ts +48 -0
  615. package/src/container/resources.ts +165 -0
  616. package/src/container/worker.ts +107 -0
  617. package/src/core/action-events.ts +59 -0
  618. package/src/core/agent-activity.ts +236 -0
  619. package/src/core/agent-environment.ts +64 -0
  620. package/src/core/agent-events.ts +17 -0
  621. package/src/core/annotation.ts +2 -1
  622. package/src/core/answerer.ts +9 -0
  623. package/src/core/artifact-evidence.ts +40 -5
  624. package/src/core/assertion.ts +8 -2
  625. package/src/core/case-defaults.ts +65 -0
  626. package/src/core/case.ts +79 -8
  627. package/src/core/command-verification.ts +74 -0
  628. package/src/core/driver-execution.ts +84 -0
  629. package/src/core/driver-metrics.ts +51 -0
  630. package/src/core/driver.ts +76 -0
  631. package/src/core/duration.ts +52 -0
  632. package/src/core/environment.ts +22 -0
  633. package/src/core/evaluation-clusters.ts +35 -0
  634. package/src/core/events.ts +13 -2
  635. package/src/core/experiment.ts +71 -25
  636. package/src/core/file-tree.ts +35 -0
  637. package/src/core/global-id.ts +26 -0
  638. package/src/core/harness-catalog.ts +100 -0
  639. package/src/core/harness-catalogs/antigravity.ts +24 -0
  640. package/src/core/harness-catalogs/claude-code.ts +25 -0
  641. package/src/core/harness-catalogs/codex.ts +27 -0
  642. package/src/core/harness-catalogs/copilot.ts +46 -0
  643. package/src/core/harness-catalogs/cursor.ts +13 -0
  644. package/src/core/harness-catalogs/grok-build.ts +19 -0
  645. package/src/core/harness-catalogs/index.ts +31 -0
  646. package/src/core/harness-matrix.ts +316 -0
  647. package/src/core/index.ts +12 -0
  648. package/src/core/lifecycle-fixtures.ts +4 -2
  649. package/src/core/model-cli.ts +78 -28
  650. package/src/core/platform-process.ts +65 -16
  651. package/src/core/reference-defaults.ts +47 -0
  652. package/src/core/run.ts +31 -0
  653. package/src/core/usage.ts +8 -0
  654. package/src/drivers/antigravity/README.md +171 -0
  655. package/src/drivers/antigravity/artifacts.ts +37 -0
  656. package/src/drivers/antigravity/config.ts +92 -0
  657. package/src/drivers/antigravity/events.ts +290 -0
  658. package/src/drivers/antigravity/index.ts +132 -0
  659. package/src/drivers/antigravity/runtime.ts +94 -0
  660. package/src/drivers/claude-code/deferred-process.ts +118 -0
  661. package/src/drivers/claude-code/index.ts +228 -282
  662. package/src/drivers/claude-code/isolation.ts +228 -0
  663. package/src/drivers/claude-code/parse-events.ts +98 -12
  664. package/src/drivers/codex/app-events.ts +126 -16
  665. package/src/drivers/codex/config.ts +59 -8
  666. package/src/drivers/codex/exec-events.ts +258 -0
  667. package/src/drivers/codex/index.ts +146 -312
  668. package/src/drivers/copilot/README.md +60 -0
  669. package/src/drivers/copilot/config.ts +61 -0
  670. package/src/drivers/copilot/index.ts +310 -0
  671. package/src/drivers/cursor/README.md +66 -0
  672. package/src/drivers/cursor/config.ts +31 -0
  673. package/src/drivers/cursor/index.ts +326 -0
  674. package/src/drivers/cursor/interaction.ts +74 -0
  675. package/src/drivers/grok-build/README.md +112 -0
  676. package/src/drivers/grok-build/config.ts +43 -0
  677. package/src/drivers/grok-build/index.ts +331 -0
  678. package/src/drivers/mcp/index.ts +25 -11
  679. package/src/drivers/shared/acp-events.ts +94 -0
  680. package/src/drivers/shared/acp-interaction.ts +27 -0
  681. package/src/drivers/shared/acp-session.ts +40 -0
  682. package/src/drivers/shared/acp-transport.ts +187 -0
  683. package/src/drivers/shared/artifacts.ts +6 -2
  684. package/src/drivers/shared/experiment-behavior.ts +217 -0
  685. package/src/drivers/shared/experiment-policy.ts +201 -0
  686. package/src/drivers/shared/skills.ts +74 -0
  687. package/src/drivers/subprocess/index.ts +55 -12
  688. package/src/index.ts +117 -6
  689. package/src/optimization/reflective.ts +3 -2
  690. package/src/orchestrator/annotation-loader.ts +10 -0
  691. package/src/orchestrator/annotation-store.ts +24 -3
  692. package/src/orchestrator/artifact-origin.ts +50 -0
  693. package/src/orchestrator/campaign-lifecycle.ts +5 -1
  694. package/src/orchestrator/candidates.ts +3 -2
  695. package/src/orchestrator/compare.ts +62 -13
  696. package/src/orchestrator/comparison-identity.ts +2 -0
  697. package/src/orchestrator/config.ts +23 -1
  698. package/src/orchestrator/discover.ts +8 -1
  699. package/src/orchestrator/doctor.ts +281 -74
  700. package/src/orchestrator/driver-capabilities.ts +21 -0
  701. package/src/orchestrator/driver-identity.ts +69 -0
  702. package/src/orchestrator/experiment-context.ts +5 -3
  703. package/src/orchestrator/experiment-corpus.ts +68 -39
  704. package/src/orchestrator/experiment-effects.ts +63 -0
  705. package/src/orchestrator/experiment-evaluation.ts +88 -10
  706. package/src/orchestrator/experiment-identity.ts +98 -61
  707. package/src/orchestrator/experiment-preflight.ts +27 -0
  708. package/src/orchestrator/experiment-report.ts +21 -1
  709. package/src/orchestrator/experiment-runs.ts +11 -4
  710. package/src/orchestrator/experiment-runtime-identity.ts +5 -243
  711. package/src/orchestrator/experiment-selection.ts +178 -18
  712. package/src/orchestrator/experiment.ts +29 -29
  713. package/src/orchestrator/fixture-identity.ts +9 -1
  714. package/src/orchestrator/fs-read.ts +2 -32
  715. package/src/orchestrator/grader-experiment.ts +74 -13
  716. package/src/orchestrator/grading.ts +60 -31
  717. package/src/orchestrator/harness-catalog-drift.ts +132 -0
  718. package/src/orchestrator/harness-registry.ts +12 -0
  719. package/src/orchestrator/index.ts +1 -0
  720. package/src/orchestrator/list-runs.ts +102 -18
  721. package/src/orchestrator/optimization-lifecycle.ts +4 -1
  722. package/src/orchestrator/orchestrator.ts +104 -226
  723. package/src/orchestrator/paired-effects.ts +214 -0
  724. package/src/orchestrator/profile.ts +24 -0
  725. package/src/orchestrator/provenance.ts +23 -3
  726. package/src/orchestrator/regrade.ts +5 -1
  727. package/src/orchestrator/rubric-loader.ts +1 -1
  728. package/src/orchestrator/run-dir.ts +8 -1
  729. package/src/orchestrator/run-execution.ts +75 -10
  730. package/src/orchestrator/run-lifecycle.ts +4 -2
  731. package/src/orchestrator/run-workspace.ts +62 -0
  732. package/src/orchestrator/suite-compare.ts +47 -23
  733. package/src/orchestrator/suite-runs.ts +13 -2
  734. package/src/orchestrator/suite-summary.ts +129 -15
  735. package/src/previewer/artifacts.ts +221 -0
  736. package/src/previewer/server.ts +789 -0
  737. package/viewer/app.css +2111 -0
  738. package/viewer/app.js +627 -0
  739. package/viewer/artifact-view.js +48 -0
  740. package/viewer/charts.js +98 -0
  741. package/viewer/detail.js +1266 -0
  742. package/viewer/format.js +129 -0
  743. package/viewer/index.html +151 -0
  744. package/lib/cli/skills.d.ts +0 -38
  745. package/lib/cli/skills.d.ts.map +0 -1
  746. package/lib/cli/skills.js +0 -84
  747. package/lib/cli/skills.js.map +0 -1
  748. package/lib/drivers/shared/secure-copy.d.ts.map +0 -1
  749. package/lib/drivers/shared/secure-copy.js.map +0 -1
  750. package/skills/lux/SKILL.md +0 -89
  751. package/skills/lux/references/cli.md +0 -125
  752. package/skills/lux/references/eval-authoring.md +0 -257
  753. package/src/cli/skills.ts +0 -129
  754. /package/lib/{drivers/shared → core}/secure-copy.d.ts +0 -0
  755. /package/lib/{drivers/shared → core}/secure-copy.js +0 -0
  756. /package/src/{drivers/shared → core}/secure-copy.ts +0 -0
@@ -4,18 +4,40 @@ 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 { resolveHarnessForDriver } from "../core/model-cli.js";
19
+ import { mergeDriverReference, withDriverDefaults } from "../core/reference-defaults.js";
8
20
  import { registryForEvalCase } from "./case-extensions.js";
9
21
  import { buildRegistryFromConfig, loadLuxConfig, type ResolvedLuxConfig } from "./config.js";
10
22
  import { type DiscoveredCase, type DiscoveryResult, discoverCases } from "./discover.js";
11
- import { cliIdentity, ExperimentCampaignPlanSchema, planExperimentCampaign } from "./experiment.js";
23
+ import { validateDriverCapabilities } from "./driver-capabilities.js";
24
+ import { ExperimentCampaignPlanSchema, planExperimentCampaign } from "./experiment.js";
12
25
  import {
13
26
  experimentCampaignMode,
14
27
  loadExperimentCampaign,
15
28
  resolveExperimentCampaignPath,
16
29
  } from "./experiment-loader.js";
30
+ import { cliIdentity } from "./experiment-runtime-identity.js";
17
31
  import { assertionConfigForSchema } from "./grading.js";
32
+ import {
33
+ describeHarnessCatalogDrift,
34
+ harnessCatalogDrift,
35
+ harnessCatalogProbes,
36
+ hasHarnessCatalogDrift,
37
+ } from "./harness-catalog-drift.js";
18
38
  import { loadEvalCase } from "./loader.js";
39
+ import { resolveAnswererReference } from "./orchestrator.js";
40
+ import { resolveProfile } from "./profile.js";
19
41
  import { validatePluginConfig, validatePluginConfigAsync } from "./validate-plugin-config.js";
20
42
 
21
43
  export const DoctorDiagnosticSchema = z
@@ -60,6 +82,7 @@ export const DoctorOptionsSchema = z
60
82
  .object({
61
83
  cwd: z.string().min(1),
62
84
  campaigns: z.array(z.string()).optional(),
85
+ static: z.boolean().optional(),
63
86
  })
64
87
  .strict();
65
88
  export type DoctorOptions = z.input<typeof DoctorOptionsSchema>;
@@ -102,57 +125,61 @@ const rawRefConfig = (reference: unknown): unknown =>
102
125
  ? (reference as { config?: unknown }).config
103
126
  : undefined;
104
127
 
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
- };
128
+ const boundPermutation = (
129
+ permutation: HarnessPermutation,
130
+ config: ResolvedLuxConfig,
131
+ registry: Registry,
132
+ ): DriverRef => {
133
+ const plugin = registry.getDriver(permutation.driver);
134
+ if (!plugin) throw new Error(`unknown driver '${permutation.driver}'`);
135
+ return withDriverDefaults(
136
+ permutationDriverRef(permutation, config.defaultDriver, plugin),
137
+ config.driverDefaults,
138
+ ) as DriverRef;
130
139
  };
131
140
 
132
- const caseDriverReferences = (local: unknown, config: ResolvedLuxConfig): unknown[] => {
141
+ const caseDriverReferences = (
142
+ authored: Pick<EvalCase, "driver" | "matrix">,
143
+ config: ResolvedLuxConfig,
144
+ registry: Registry,
145
+ ): unknown[] => {
146
+ const local = authored.driver;
147
+ const permutations = casePermutations(authored, config.matrix);
148
+ if (permutations.length > 0) {
149
+ return permutations.map((permutation) =>
150
+ mergeDriverReference(boundPermutation(permutation, config, registry), local),
151
+ );
152
+ }
133
153
  const fallbacks = [
134
- config.defaultDriver,
135
- ...Object.values(config.profiles ?? {}).map((profile) => profile.driver),
154
+ resolveProfile(config).driver,
155
+ ...Object.values(config.profiles ?? {}).map(
156
+ (profile) => resolveProfile(config, profile).driver,
157
+ ),
136
158
  ].filter((reference) => reference !== undefined);
137
159
  if (!local) return [...new Set(fallbacks)];
138
- if (fallbacks.length === 0) return [local];
139
- const references = fallbacks.map((fallback) => effectiveDriverReference(local, fallback));
160
+ if (fallbacks.length === 0) return [withDriverDefaults(local, config.driverDefaults)];
161
+ const references = fallbacks.map((fallback) =>
162
+ withDriverDefaults(mergeDriverReference(fallback, local), config.driverDefaults),
163
+ );
140
164
  return [
141
165
  ...new Map(references.map((reference) => [JSON.stringify(reference), reference])).values(),
142
166
  ];
143
167
  };
144
168
 
145
- const driverCommand = (reference: unknown): string | undefined => {
169
+ const driverCommands = (reference: unknown, registry: Registry): string[] => {
146
170
  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;
171
+ const plugin = name ? registry.getDriver(name) : undefined;
172
+ if (!plugin?.runtime) return [];
173
+ try {
174
+ const config = validatePluginConfig(
175
+ plugin.configSchema,
176
+ rawRefConfig(reference),
177
+ `driver '${name}'`,
178
+ );
179
+ return plugin.runtime(config).commands;
180
+ } catch {
181
+ return [];
154
182
  }
155
- return undefined;
156
183
  };
157
184
 
158
185
  const answererCommand = (reference: unknown): string | undefined => {
@@ -163,12 +190,11 @@ const answererCommand = (reference: unknown): string | undefined => {
163
190
  return config.provider === "codex" ? "codex" : "claude";
164
191
  };
165
192
 
166
- const rubricCommands = (assertion: unknown, config: ResolvedLuxConfig): string[] => {
193
+ const rubricCommands = (
194
+ assertion: unknown,
195
+ harnesses: ReturnType<typeof resolveHarnessForDriver>[],
196
+ ): string[] => {
167
197
  const rubric = RubricConfigSchema.parse(assertion);
168
- const harnesses = [
169
- config.harness,
170
- ...Object.values(config.profiles ?? {}).map((profile) => profile.harness ?? config.harness),
171
- ];
172
198
  const commands = harnesses.map((harness) => {
173
199
  const provider = rubric.provider ?? harness?.provider ?? "claude-code";
174
200
  const inheritsHarness = rubric.provider === undefined || rubric.provider === harness?.provider;
@@ -179,13 +205,37 @@ const rubricCommands = (assertion: unknown, config: ResolvedLuxConfig): string[]
179
205
  return [...new Set(commands)];
180
206
  };
181
207
 
182
- const configuredCliTargets = (config: ResolvedLuxConfig): CliTarget[] => {
208
+ const configuredCliTargets = (config: ResolvedLuxConfig, registry: Registry): CliTarget[] => {
183
209
  const targets: CliTarget[] = [];
184
210
  const add = (label: string, command: string | undefined): void => {
185
211
  if (command) targets.push({ label, command });
186
212
  };
187
- add("default driver", driverCommand(config.defaultDriver));
188
- add("default answerer", answererCommand(config.defaultAnswerer));
213
+ for (const command of driverCommands(resolveProfile(config).driver, registry))
214
+ add("default driver", command);
215
+ for (const permutation of expandHarnessMatrix(config.matrix ?? [])) {
216
+ try {
217
+ for (const command of driverCommands(
218
+ boundPermutation(permutation, config, registry),
219
+ registry,
220
+ ))
221
+ add(`matrix '${permutationId(permutation)}' driver`, command);
222
+ } catch {
223
+ /* Reported by validateConfiguredMatrix. */
224
+ }
225
+ }
226
+ const base = resolveProfile(config);
227
+ if (base.driver || base.harness) {
228
+ add(
229
+ "default answerer",
230
+ answererCommand(
231
+ resolveAnswererReference(
232
+ { prompt: "" },
233
+ base.answerer ?? config.defaultAnswerer,
234
+ resolveHarnessForDriver(base.harness, base.driver),
235
+ ),
236
+ ),
237
+ );
238
+ }
189
239
  if (config.harness) {
190
240
  add(
191
241
  "default harness",
@@ -195,9 +245,21 @@ const configuredCliTargets = (config: ResolvedLuxConfig): CliTarget[] => {
195
245
  for (const [id, profile] of Object.entries(config.profiles ?? {}).sort(([a], [b]) =>
196
246
  a.localeCompare(b),
197
247
  )) {
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;
248
+ for (const command of driverCommands(resolveProfile(config, profile).driver, registry)) {
249
+ add(`profile '${id}' driver`, command);
250
+ }
251
+ const resolved = resolveProfile(config, profile);
252
+ add(
253
+ `profile '${id}' answerer`,
254
+ answererCommand(
255
+ resolveAnswererReference(
256
+ { prompt: "" },
257
+ resolved.answerer ?? config.defaultAnswerer,
258
+ resolveHarnessForDriver(resolved.harness, resolved.driver),
259
+ ),
260
+ ),
261
+ );
262
+ const harness = resolveProfile(config, profile).harness;
201
263
  if (harness) {
202
264
  add(
203
265
  `profile '${id}' harness`,
@@ -299,18 +361,18 @@ const loadDoctorRegistry = (
299
361
  const configuredDriverReferences = (
300
362
  config: ResolvedLuxConfig,
301
363
  ): Array<readonly [string, unknown]> => [
302
- ["default", config.defaultDriver],
364
+ ["default", resolveProfile(config).driver],
303
365
  ...Object.entries(config.profiles ?? {}).map(
304
- ([id, profile]) => [`profile '${id}'`, profile.driver] as const,
366
+ ([id, profile]) => [`profile '${id}'`, resolveProfile(config, profile).driver] as const,
305
367
  ),
306
368
  ];
307
369
 
308
370
  const configuredAnswererReferences = (
309
371
  config: ResolvedLuxConfig,
310
372
  ): Array<readonly [string, unknown]> => [
311
- ["default", config.defaultAnswerer],
373
+ ["default", resolveProfile(config).answerer],
312
374
  ...Object.entries(config.profiles ?? {}).map(
313
- ([id, profile]) => [`profile '${id}'`, profile.answerer] as const,
375
+ ([id, profile]) => [`profile '${id}'`, resolveProfile(config, profile).answerer] as const,
314
376
  ),
315
377
  ];
316
378
 
@@ -348,6 +410,32 @@ const validateConfiguredDrivers = (
348
410
  }
349
411
  };
350
412
 
413
+ const validateConfiguredMatrix = (
414
+ config: ResolvedLuxConfig,
415
+ registry: Registry,
416
+ recorder: DoctorRecorder,
417
+ ): void => {
418
+ for (const permutation of expandHarnessMatrix(config.matrix ?? [])) {
419
+ const id = permutationId(permutation);
420
+ try {
421
+ const reference = boundPermutation(permutation, config, registry);
422
+ const plugin = registry.getDriver(permutation.driver);
423
+ validatePluginConfig(
424
+ plugin?.configSchema,
425
+ rawRefConfig(reference),
426
+ `matrix '${id}' driver '${permutation.driver}'`,
427
+ );
428
+ } catch (error) {
429
+ recorder.add(
430
+ `matrix:${id}`,
431
+ "fail",
432
+ `matrix permutation '${id}' is not runnable`,
433
+ firstLine(error),
434
+ );
435
+ }
436
+ }
437
+ };
438
+
351
439
  const validateConfiguredAnswerers = (
352
440
  config: ResolvedLuxConfig,
353
441
  registry: Registry,
@@ -418,17 +506,19 @@ const caseDriverFailure = (
418
506
  caseId: string,
419
507
  reference: unknown,
420
508
  registry: Registry,
509
+ required: EvalCase["requires"],
421
510
  ): string | null => {
422
511
  const name = refName(reference);
423
512
  if (!name) return "driver reference has no name";
424
513
  const plugin = registry.getDriver(name);
425
514
  if (!plugin) return `unknown driver '${name}'`;
426
515
  try {
427
- validatePluginConfig(
516
+ const config = validatePluginConfig(
428
517
  plugin.configSchema,
429
518
  rawRefConfig(reference),
430
519
  `case '${caseId}' driver '${name}'`,
431
520
  );
521
+ validateDriverCapabilities(plugin, config, required, driverExecutionOf(reference));
432
522
  return null;
433
523
  } catch (error) {
434
524
  return firstLine(error);
@@ -440,6 +530,7 @@ const validateCaseDrivers = (
440
530
  drivers: readonly unknown[],
441
531
  registry: Registry,
442
532
  recorder: DoctorRecorder,
533
+ required: EvalCase["requires"],
443
534
  ): void => {
444
535
  if (drivers.length === 0) {
445
536
  recorder.add(
@@ -450,7 +541,7 @@ const validateCaseDrivers = (
450
541
  return;
451
542
  }
452
543
  const failures = drivers
453
- .map((driver) => caseDriverFailure(caseId, driver, registry))
544
+ .map((driver) => caseDriverFailure(caseId, driver, registry, required))
454
545
  .filter((failure): failure is string => failure !== null);
455
546
  if (failures.length === drivers.length) {
456
547
  recorder.add(
@@ -498,7 +589,7 @@ const validateCaseAnswerer = (
498
589
  const validateCaseAssertions = async (
499
590
  caseId: string,
500
591
  authored: EvalCase,
501
- config: ResolvedLuxConfig,
592
+ harnesses: ReturnType<typeof resolveHarnessForDriver>[],
502
593
  registry: Registry,
503
594
  recorder: DoctorRecorder,
504
595
  ): Promise<CliTarget[]> => {
@@ -530,7 +621,7 @@ const validateCaseAssertions = async (
530
621
  );
531
622
  }
532
623
  if (assertion.type === "rubric") {
533
- for (const command of rubricCommands(assertion, config)) {
624
+ for (const command of rubricCommands(assertion, harnesses)) {
534
625
  targets.push({ label: `case '${caseId}' rubric judge`, command });
535
626
  }
536
627
  }
@@ -542,13 +633,16 @@ const executionTargetsForCase = (
542
633
  caseId: string,
543
634
  drivers: readonly unknown[],
544
635
  answerer: unknown,
636
+ registry: Registry,
545
637
  ): CliTarget[] => {
546
638
  const targets = drivers.flatMap((driver): CliTarget[] => {
547
- const command = driverCommand(driver);
548
- return command ? [{ label: `case '${caseId}' driver`, command }] : [];
639
+ return driverCommands(driver, registry).map((command) => ({
640
+ label: `case '${caseId}' driver`,
641
+ command,
642
+ }));
549
643
  });
550
- const command = answererCommand(answerer);
551
- if (command) targets.push({ label: `case '${caseId}' answerer`, command });
644
+ const answererCli = answererCommand(answerer);
645
+ if (answererCli) targets.push({ label: `case '${caseId}' answerer`, command: answererCli });
552
646
  return targets;
553
647
  };
554
648
 
@@ -561,13 +655,54 @@ const inspectCase = async (
561
655
  try {
562
656
  const authored = await loadEvalCase(discovered.path);
563
657
  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);
567
- validateCaseAnswerer(discovered.id, answerer, caseRegistry, recorder);
658
+ const profiles = [
659
+ resolveProfile(config),
660
+ ...Object.values(config.profiles ?? {}).map((profile) => resolveProfile(config, profile)),
661
+ ];
662
+ const contexts = profiles.flatMap((profile, index) => {
663
+ const drivers = caseDriverReferences(
664
+ authored,
665
+ {
666
+ ...config,
667
+ profiles: {},
668
+ defaultDriver: profile.driver,
669
+ ...(index > 0 ? { matrix: undefined } : {}),
670
+ },
671
+ caseRegistry,
672
+ );
673
+ return drivers.map((driver) => {
674
+ const harness = resolveHarnessForDriver(profile.harness, refName(driver));
675
+ return {
676
+ driver,
677
+ harness,
678
+ answerer: resolveAnswererReference(
679
+ authored,
680
+ profile.answerer ?? config.defaultAnswerer,
681
+ harness,
682
+ ),
683
+ };
684
+ });
685
+ });
686
+ validateCaseDrivers(
687
+ discovered.id,
688
+ contexts.map(({ driver }) => driver),
689
+ caseRegistry,
690
+ recorder,
691
+ authored.requires,
692
+ );
693
+ for (const { answerer } of contexts)
694
+ validateCaseAnswerer(discovered.id, answerer, caseRegistry, recorder);
568
695
  return [
569
- ...(await validateCaseAssertions(discovered.id, authored, config, caseRegistry, recorder)),
570
- ...executionTargetsForCase(discovered.id, drivers, answerer),
696
+ ...(await validateCaseAssertions(
697
+ discovered.id,
698
+ authored,
699
+ contexts.map(({ harness }) => harness),
700
+ caseRegistry,
701
+ recorder,
702
+ )),
703
+ ...contexts.flatMap(({ driver, answerer }) =>
704
+ executionTargetsForCase(discovered.id, [driver], answerer, caseRegistry),
705
+ ),
571
706
  ];
572
707
  } catch (error) {
573
708
  recorder.add(
@@ -644,6 +779,54 @@ const inspectCliTargets = async (
644
779
  }
645
780
  };
646
781
 
782
+ const catalogDriverReferences = (config: ResolvedLuxConfig): unknown[] => [
783
+ ...configuredDriverReferences(config).map(([, reference]) => reference),
784
+ ...(config.matrix ?? []).map((entry) => ({ name: entry.driver, config: entry.config })),
785
+ ];
786
+
787
+ const configuredDriverCommand = (config: ResolvedLuxConfig, driver: string): string | undefined => {
788
+ for (const reference of catalogDriverReferences(config)) {
789
+ if (refName(reference) !== driver) continue;
790
+ const command = (rawRefConfig(reference) as { command?: unknown } | undefined)?.command;
791
+ if (typeof command === "string") return command;
792
+ }
793
+ return undefined;
794
+ };
795
+
796
+ const inspectHarnessCatalogs = async (
797
+ config: ResolvedLuxConfig,
798
+ recorder: DoctorRecorder,
799
+ ): Promise<void> => {
800
+ const configured = new Set(
801
+ catalogDriverReferences(config)
802
+ .map(refName)
803
+ .filter((name): name is string => name !== undefined),
804
+ );
805
+ for (const probe of harnessCatalogProbes) {
806
+ const driver = probe.catalog.driver;
807
+ if (!configured.has(driver)) continue;
808
+ const live = await probe.read(configuredDriverCommand(config, driver));
809
+ if (!live) {
810
+ recorder.add(
811
+ `catalog:${driver}`,
812
+ "warn",
813
+ `${driver} harness catalog (verified ${probe.catalog.verified}) could not be compared with the installed CLI`,
814
+ `${probe.source} was unavailable`,
815
+ );
816
+ continue;
817
+ }
818
+ const drift = harnessCatalogDrift(probe.catalog, live);
819
+ recorder.add(
820
+ `catalog:${driver}`,
821
+ hasHarnessCatalogDrift(drift) ? "warn" : "pass",
822
+ hasHarnessCatalogDrift(drift)
823
+ ? `${driver} harness catalog (verified ${probe.catalog.verified}) differs from the installed CLI`
824
+ : `${driver} harness catalog matches the installed CLI`,
825
+ describeHarnessCatalogDrift(drift) || undefined,
826
+ );
827
+ }
828
+ };
829
+
647
830
  const isBlockingCampaignWarning = (warning: string): boolean =>
648
831
  warning.includes("below confidence minSamples=") || warning.includes("cannot attain confidence");
649
832
 
@@ -652,6 +835,7 @@ const inspectCampaign = async (
652
835
  config: ResolvedLuxConfig,
653
836
  registry: Registry,
654
837
  recorder: DoctorRecorder,
838
+ staticChecks: boolean,
655
839
  ): Promise<void> => {
656
840
  try {
657
841
  const loaded = await loadExperimentCampaign(path);
@@ -665,7 +849,9 @@ const inspectCampaign = async (
665
849
  placeholders.join(", "),
666
850
  );
667
851
  }
668
- const plan = await planExperimentCampaign({ config, registry, loaded }, mode);
852
+ const plan = await planExperimentCampaign({ config, registry, loaded }, mode, {
853
+ static: staticChecks,
854
+ });
669
855
  recorder.campaigns.push({ path, campaignId: loaded.campaign.id, mode, plan });
670
856
  recorder.add(
671
857
  `campaign:${loaded.campaign.id}`,
@@ -697,6 +883,7 @@ const inspectCampaigns = async (
697
883
  config: ResolvedLuxConfig,
698
884
  registry: Registry,
699
885
  recorder: DoctorRecorder,
886
+ staticChecks: boolean,
700
887
  ): Promise<void> => {
701
888
  let paths: string[];
702
889
  try {
@@ -719,7 +906,7 @@ const inspectCampaigns = async (
719
906
  );
720
907
  }
721
908
  for (const path of paths) {
722
- await inspectCampaign(path, config, registry, recorder);
909
+ await inspectCampaign(path, config, registry, recorder, staticChecks);
723
910
  }
724
911
  };
725
912
 
@@ -733,10 +920,30 @@ export const doctorProject = async (options: DoctorOptions): Promise<DoctorRepor
733
920
  if (!registry) return recorder.finish(config.rootDir);
734
921
 
735
922
  validateConfiguredDrivers(config, registry, recorder);
923
+ validateConfiguredMatrix(config, registry, recorder);
736
924
  validateConfiguredAnswerers(config, registry, recorder);
737
925
  const caseCliTargets = await inspectCases(config, registry, recorder);
738
- await inspectCliTargets([...configuredCliTargets(config), ...caseCliTargets], config, recorder);
739
- await inspectCampaigns(parsedOptions.campaigns ?? [], config, registry, recorder);
926
+ if (parsedOptions.static) {
927
+ recorder.add(
928
+ "static-checks",
929
+ "warn",
930
+ "static checks only; installed executables and campaign execution identity were not checked",
931
+ );
932
+ } else {
933
+ await inspectCliTargets(
934
+ [...configuredCliTargets(config, registry), ...caseCliTargets],
935
+ config,
936
+ recorder,
937
+ );
938
+ await inspectHarnessCatalogs(config, recorder);
939
+ }
940
+ await inspectCampaigns(
941
+ parsedOptions.campaigns ?? [],
942
+ config,
943
+ registry,
944
+ recorder,
945
+ parsedOptions.static ?? false,
946
+ );
740
947
  return recorder.finish(config.rootDir);
741
948
  };
742
949
 
@@ -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
  };