@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
@@ -0,0 +1,238 @@
1
+ type StarterDriver =
2
+ | "subprocess"
3
+ | "claude-code"
4
+ | "codex"
5
+ | "cursor"
6
+ | "copilot"
7
+ | "antigravity"
8
+ | "grok-build";
9
+
10
+ export const luxConfigBody = (
11
+ withExperiment: boolean,
12
+ driver?: StarterDriver,
13
+ model?: string,
14
+ ): string => {
15
+ const subjectRoot = withExperiment ? ' subjectRoot: ".",\n' : "";
16
+ const profiles = withExperiment ? " profiles: { starter: {} },\n" : "";
17
+ const selectedDriver = driver ?? (withExperiment ? undefined : "subprocess");
18
+ const modelField = model ? `model: ${JSON.stringify(model)}, ` : "";
19
+ let defaultDriver: string;
20
+ if (selectedDriver === "subprocess") {
21
+ defaultDriver = ` defaultDriver: { name: "subprocess", config: {
22
+ command: process.execPath,
23
+ args: [fileURLToPath(new URL("./agent/demo.mjs", import.meta.url))],
24
+ inheritEnv: false,
25
+ } },
26
+ `;
27
+ } else if (selectedDriver) {
28
+ const efforts = {
29
+ "claude-code": 'reasoningEffort: "low"',
30
+ codex: 'reasoningEffort: "low"',
31
+ cursor: "",
32
+ "grok-build": 'reasoningEffort: "low", permissionMode: "auto"',
33
+ copilot: 'reasoningEffort: "low"',
34
+ antigravity: 'reasoningEffort: "low"',
35
+ };
36
+ defaultDriver = ` defaultDriver: { name: ${JSON.stringify(selectedDriver)}, config: { ${modelField}${efforts[selectedDriver]} } },
37
+ `;
38
+ } else {
39
+ defaultDriver = ` // Select a driver with lux init --experiment --driver codex --force.
40
+ // defaultDriver: { name: "codex", config: { reasoningEffort: "low" } },
41
+ `;
42
+ }
43
+ return `${selectedDriver === "subprocess" ? 'import { fileURLToPath } from "node:url";\n' : ""}import type { LuxConfig } from "@prismatic-io/lux";
44
+
45
+ /**
46
+ * Lux project configuration. Drivers, answerers, and assertions
47
+ * register here; \`lux run\` discovers cases under \`casesRoot\`.
48
+ */
49
+ const config: LuxConfig = {
50
+ casesRoot: "./cases",
51
+ fixturesRoot: "./fixtures",
52
+ runsRoot: "./.lux-runs",
53
+ ${subjectRoot} // Runners default to cheap models and low effort instead of inheriting CLI defaults.
54
+ ${defaultDriver} // Persona answerers and rubric judges default to cheap models and low effort.
55
+ // Override both explicitly when a stronger harness is worth the added cost:
56
+ // harness: { provider: "codex", model: "YOUR_HARNESS_MODEL" },
57
+ defaultAnswerer: "persona",
58
+ ${profiles} // drivers: [/* register drivers here */],
59
+ // answerers: [/* register answerers here */],
60
+ // assertions: [/* register custom assertions here */],
61
+ };
62
+
63
+ export default config;
64
+ `;
65
+ };
66
+
67
+ export const DEMO_AGENT_BODY = `import { writeFile } from "node:fs/promises";
68
+ import { join } from "node:path";
69
+
70
+ const send = (event) => process.stdout.write(JSON.stringify(event) + "\\n");
71
+ send({ type: "ready", agentId: "addition-demo" });
72
+ await writeFile(join(process.env.LUX_ARTIFACTS_DIR, "add.mjs"), "export const add = (a, b) => a + b;\\n");
73
+ send({ type: "done", summary: "Wrote add.mjs" });
74
+ `;
75
+
76
+ const ADDITION_COMMAND = `node --input-type=module -e "import assert from 'node:assert/strict'; import { add } from './add.mjs'; assert.equal(add(2, 3), 5); assert.equal(add(-2, 2), 0); assert.equal(add(0, 0), 0);"`;
77
+
78
+ export const SAMPLE_CASE_BODY = `import { defineEvalCase } from "@prismatic-io/lux";
79
+
80
+ export default defineEvalCase({
81
+ id: "addition",
82
+ prompt: "Write add.mjs exporting add(a, b). It must add two numbers, including negative numbers and zero.",
83
+ assertions: [
84
+ { id: "completed", type: "run-succeeded" },
85
+ { id: "module-written", type: "file-exists", path: "add.mjs" },
86
+ {
87
+ id: "adds-correctly",
88
+ type: "command-exits-zero",
89
+ command: ${JSON.stringify(ADDITION_COMMAND)},
90
+ },
91
+ ],
92
+ });
93
+ `;
94
+
95
+ export const EXPERIMENT_SAMPLE_CASE_BODY = `import { defineEvalCase } from "@prismatic-io/lux";
96
+
97
+ /**
98
+ * A starter smoke case. It inherits the default driver from lux.config.ts.
99
+ */
100
+ export default defineEvalCase({
101
+ id: "hello-world",
102
+ prompt: "Say hello to the world.",
103
+ assertions: [{ id: "completed", type: "run-succeeded" }],
104
+ });
105
+ `;
106
+
107
+ export const README_BODY = `# Lux evals
108
+
109
+ This directory holds your evaluation cases.
110
+
111
+ ## Layout
112
+
113
+ - \`lux.config.ts\` — project configuration: default driver/answerer and registered plugins.
114
+ - \`cases/\` — one TypeScript file per eval case. Default-export a \`defineEvalCase({...})\`.
115
+ - \`fixtures/\` — starting state for cases that need pre-staged input.
116
+ - \`.lux-runs/\` — run output, gitignored.
117
+
118
+ ## Setup
119
+
120
+ Install Lux in the project so authored TypeScript cases can resolve its API:
121
+
122
+ \`\`\`bash
123
+ npm install --save-dev @prismatic-io/lux
124
+ \`\`\`
125
+
126
+ ## First result
127
+
128
+ The default starter uses a local deterministic agent and makes no model calls.
129
+ Run \`npm exec -- lux run\`, then \`npm exec -- lux view\` to inspect its
130
+ artifact and behavioral assertions. In \`agent/demo.mjs\`, replace \`a + b\`
131
+ with \`a - b\` and run again: the agent completes, but the behavioral assertion
132
+ fails. Restore addition and rerun to see it pass.
133
+
134
+ For a real coding agent, scaffold with \`lux init --driver claude-code\` or
135
+ \`lux init --driver codex\`. Cursor, Copilot, and Antigravity require an
136
+ explicit model, for example \`lux init --driver copilot --model <model-id>\`.
137
+ These modes make model calls when you run cases and require the corresponding
138
+ authenticated CLI.
139
+
140
+ ## Run cases
141
+
142
+ \`lux run\` discovers every case under \`casesRoot\` and runs it. Filter by
143
+ name/path substring, by \`--tag\`, or repeat each matched eval with \`--loop\`:
144
+
145
+ \`\`\`bash
146
+ npm exec -- lux run # every discovered case
147
+ npm exec -- lux run addition # cases whose id/path contains "hello-world"
148
+ npm exec -- lux run cases/addition.ts # one file directly
149
+ npm exec -- lux run --tag smoke # cases tagged "smoke" (meta.tags)
150
+ npm exec -- lux run --loop 5 # run each matched eval 5 times
151
+ \`\`\`
152
+
153
+ See the [Lux docs](https://github.com/prismatic-io/lux) for the full design.
154
+ `;
155
+
156
+ export const STARTER_PROMPT_BODY = `# Starter agent instructions
157
+
158
+ Complete the requested task and verify the result. Ask for clarification when
159
+ missing information changes the correct outcome.
160
+ `;
161
+
162
+ export const experimentCaseBody = (
163
+ id: string,
164
+ split: "train" | "validation" | "test",
165
+ task: string,
166
+ ): string => {
167
+ const checks = {
168
+ train: "assert.equal(result(2, 3), 5); assert.equal(result(-2, 2), 0)",
169
+ validation:
170
+ "assert.equal(result(12, 0, 10), 10); assert.equal(result(-1, 0, 10), 0); assert.equal(result(5, 0, 10), 5)",
171
+ test: "assert.equal(result(' Lux REVIEW '), 'lux review'); assert.equal(result(''), '')",
172
+ };
173
+ const command = `node --input-type=module -e "import assert from 'node:assert/strict'; import { result } from './result.mjs'; ${checks[split]};"`;
174
+ return `import { defineEvalCase, subjectPath } from "@prismatic-io/lux";
175
+
176
+ export default defineEvalCase({
177
+ id: ${JSON.stringify(id)},
178
+ prompt: [
179
+ \`Read \${subjectPath("prompts/agent.md")} and use it as task guidance.\`,
180
+ ${JSON.stringify(task)},
181
+ ].join("\\n\\n"),
182
+ assertions: [
183
+ { id: "completed", type: "run-succeeded" },
184
+ { id: "behavior", type: "command-exits-zero", command: ${JSON.stringify(command)} },
185
+ ],
186
+ meta: { tags: [${JSON.stringify(split)}] },
187
+ });
188
+ `;
189
+ };
190
+
191
+ export const STARTER_EXPERIMENT_BODY = `import { defineExperiment } from "@prismatic-io/lux";
192
+
193
+ export default defineExperiment({
194
+ id: "starter-agent-improvement",
195
+ subject: {
196
+ root: "..",
197
+ mutable: ["prompts/agent.md"],
198
+ },
199
+ profiles: ["starter"],
200
+ splits: {
201
+ train: { tags: ["train"] },
202
+ validation: { tags: ["validation"] },
203
+ test: { tags: ["test"] },
204
+ },
205
+ repetitions: { search: 1, promotion: 2 },
206
+ objectives: {
207
+ constraints: [
208
+ { metric: "quality.passRate", min: 1 },
209
+ { metric: "quality.passRate", min: 1, split: "test" },
210
+ { metric: "quality.caseRegressions", max: 0 },
211
+ { metric: "quality.caseRegressions", max: 0, split: "test" },
212
+ ],
213
+ minimize: [
214
+ { metric: "agent.total" },
215
+ { metric: "subject.bytes" },
216
+ ],
217
+ },
218
+ optimizer: {
219
+ algorithm: "reflective",
220
+ config: {
221
+ provider: "claude-code",
222
+ model: "YOUR_OPTIMIZER_MODEL",
223
+ reasoningEffort: "low",
224
+ },
225
+ },
226
+ budget: {
227
+ maxCandidates: 4,
228
+ patience: 1,
229
+ maxMetricCalls: 40,
230
+ maxJudgeCalls: 40,
231
+ maxProposalCalls: 3,
232
+ maxTokens: 1_000_000,
233
+ maxCostUsd: 25,
234
+ maxUnpricedModelCalls: 25,
235
+ maxWallTimeMs: 1_800_000,
236
+ },
237
+ });
238
+ `;
package/src/cli/init.ts CHANGED
@@ -2,14 +2,49 @@ import { randomUUID } from "node:crypto";
2
2
  import { constants, lstat, mkdir, open, realpath, rename, rm, writeFile } from "node:fs/promises";
3
3
  import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
4
4
  import { z } from "zod";
5
+ import {
6
+ DEMO_AGENT_BODY,
7
+ EXPERIMENT_SAMPLE_CASE_BODY,
8
+ experimentCaseBody,
9
+ luxConfigBody,
10
+ README_BODY,
11
+ SAMPLE_CASE_BODY,
12
+ STARTER_EXPERIMENT_BODY,
13
+ STARTER_PROMPT_BODY,
14
+ } from "./init-templates.js";
15
+
16
+ const EXPLICIT_MODEL_DRIVERS = new Set(["cursor", "copilot", "antigravity", "grok-build"]);
5
17
 
6
18
  const InitOptionsSchema = z
7
19
  .object({
8
20
  cwd: z.string().min(1),
9
21
  force: z.boolean().default(false),
10
22
  experiment: z.boolean().default(false),
23
+ driver: z
24
+ .enum([
25
+ "subprocess",
26
+ "claude-code",
27
+ "codex",
28
+ "cursor",
29
+ "copilot",
30
+ "antigravity",
31
+ "grok-build",
32
+ ])
33
+ .optional(),
34
+ model: z.string().min(1).optional(),
11
35
  })
12
- .strict();
36
+ .strict()
37
+ .refine(
38
+ (options) => !EXPLICIT_MODEL_DRIVERS.has(options.driver ?? "") || options.model !== undefined,
39
+ {
40
+ path: ["model"],
41
+ message: "Cursor, Copilot, and Antigravity require an explicit --model",
42
+ },
43
+ )
44
+ .refine((options) => !(options.experiment && options.driver === "subprocess"), {
45
+ path: ["driver"],
46
+ message: "The deterministic starter is for runs; choose a coding agent for experiments",
47
+ });
13
48
  type InitOptions = z.input<typeof InitOptionsSchema>;
14
49
 
15
50
  const InitResultSchema = z
@@ -133,181 +168,6 @@ const appendGitignoreEntry = async (
133
168
  else result.updated.push(path);
134
169
  };
135
170
 
136
- const luxConfigBody = (withExperiment: boolean): string => {
137
- const subjectRoot = withExperiment ? ' subjectRoot: ".",\n' : "";
138
- const profiles = withExperiment ? " profiles: { starter: {} },\n" : "";
139
- const defaultDriver = withExperiment
140
- ? ` // Choose one driver before running the scaffold.
141
- // defaultDriver: { name: "codex", config: { model: "YOUR_CODEX_MODEL", reasoningEffort: "high" } },
142
- // defaultDriver: { name: "claude-code", config: { model: "YOUR_CLAUDE_MODEL", effort: "high" } },
143
- `
144
- : ` // The subprocess command must implement Lux's lux-jsonl protocol.
145
- // Replace this entire object when using the built-in Codex or Claude Code driver.
146
- defaultDriver: { name: "subprocess", config: { command: "your-agent-cli" } },
147
- `;
148
- return `import type { LuxConfig } from "@prismatic-io/lux";
149
-
150
- /**
151
- * Lux project configuration. Drivers, answerers, and assertions
152
- * register here; \`lux run\` discovers cases under \`casesRoot\`.
153
- */
154
- const config: LuxConfig = {
155
- casesRoot: "./cases",
156
- fixturesRoot: "./fixtures",
157
- runsRoot: "./.lux-runs",
158
- ${subjectRoot} // Runners default to cheap models and low effort instead of inheriting CLI defaults.
159
- ${defaultDriver} // Persona answerers and rubric judges default to cheap models and low effort.
160
- // Override both explicitly when a stronger harness is worth the added cost:
161
- // harness: { provider: "codex", model: "YOUR_HARNESS_MODEL" },
162
- defaultAnswerer: "persona",
163
- ${profiles} // drivers: [/* register drivers here */],
164
- // answerers: [/* register answerers here */],
165
- // assertions: [/* register custom assertions here */],
166
- };
167
-
168
- export default config;
169
- `;
170
- };
171
-
172
- const SAMPLE_CASE_BODY = `import { defineEvalCase } from "@prismatic-io/lux";
173
-
174
- /**
175
- * A starter case. It inherits defaultDriver from lux.config.ts.
176
- * Replace the prompt and persona to match the behavior you need.
177
- */
178
- export default defineEvalCase({
179
- id: "hello-world",
180
- prompt: "Say hello to the world.",
181
- persona: "You are a friendly developer. Keep answers short.",
182
- assertions: [
183
- { id: "completed", type: "run-succeeded" },
184
- // { type: "contains", text: "hello" },
185
- // { type: "command-exits-zero", command: "echo done" },
186
- ],
187
- });
188
- `;
189
-
190
- const EXPERIMENT_SAMPLE_CASE_BODY = `import { defineEvalCase } from "@prismatic-io/lux";
191
-
192
- /**
193
- * A starter smoke case. It inherits the default driver from lux.config.ts.
194
- */
195
- export default defineEvalCase({
196
- id: "hello-world",
197
- prompt: "Say hello to the world.",
198
- assertions: [{ id: "completed", type: "run-succeeded" }],
199
- });
200
- `;
201
-
202
- const README_BODY = `# Lux evals
203
-
204
- This directory holds your evaluation cases.
205
-
206
- ## Layout
207
-
208
- - \`lux.config.ts\` — project configuration: default driver/answerer and registered plugins.
209
- - \`cases/\` — one TypeScript file per eval case. Default-export a \`defineEvalCase({...})\`.
210
- - \`fixtures/\` — starting state for cases that need pre-staged input.
211
- - \`.lux-runs/\` — run output, gitignored.
212
-
213
- ## Setup
214
-
215
- Install Lux in the project so authored TypeScript cases can resolve its API:
216
-
217
- \`\`\`bash
218
- npm install --save-dev @prismatic-io/lux
219
- \`\`\`
220
-
221
- ## Run cases
222
-
223
- \`lux run\` discovers every case under \`casesRoot\` and runs it. Filter by
224
- name/path substring, by \`--tag\`, or repeat each matched eval with \`--loop\`:
225
-
226
- \`\`\`bash
227
- npm exec -- lux run # every discovered case
228
- npm exec -- lux run hello-world # cases whose id/path contains "hello-world"
229
- npm exec -- lux run cases/hello-world.ts # one file directly
230
- npm exec -- lux run --tag smoke # cases tagged "smoke" (meta.tags)
231
- npm exec -- lux run --loop 5 # run each matched eval 5 times
232
- \`\`\`
233
-
234
- See the [Lux docs](https://github.com/prismatic-io/lux) for the full design.
235
- `;
236
-
237
- const STARTER_PROMPT_BODY = `# Starter agent instructions
238
-
239
- Complete the requested task directly. Prefer deterministic work, use the fewest
240
- tools needed, and ask a question only when proceeding would be unsafe.
241
- `;
242
-
243
- const experimentCaseBody = (
244
- id: string,
245
- split: "train" | "validation" | "test",
246
- task: string,
247
- ): string => `import { defineEvalCase, subjectPath } from "@prismatic-io/lux";
248
-
249
- export default defineEvalCase({
250
- id: ${JSON.stringify(id)},
251
- prompt: [
252
- \`Read \${subjectPath("prompts/agent.md")} and follow it as the system instructions.\`,
253
- ${JSON.stringify(task)},
254
- ].join("\\n\\n"),
255
- assertions: [{ id: "completed", type: "run-succeeded" }],
256
- meta: { tags: [${JSON.stringify(split)}] },
257
- });
258
- `;
259
-
260
- const STARTER_EXPERIMENT_BODY = `import { defineExperiment } from "@prismatic-io/lux";
261
-
262
- export default defineExperiment({
263
- id: "starter-agent-improvement",
264
- subject: {
265
- root: "..",
266
- mutable: ["prompts/agent.md"],
267
- },
268
- profiles: ["starter"],
269
- splits: {
270
- train: { tags: ["train"] },
271
- validation: { tags: ["validation"] },
272
- test: { tags: ["test"] },
273
- },
274
- repetitions: { search: 1, promotion: 2 },
275
- objectives: {
276
- constraints: [
277
- { metric: "quality.passRate", min: 1 },
278
- { metric: "quality.passRate", min: 1, split: "test" },
279
- { metric: "quality.caseRegressions", max: 0 },
280
- { metric: "quality.caseRegressions", max: 0, split: "test" },
281
- ],
282
- minimize: [
283
- { metric: "agent.total" },
284
- { metric: "interrupts.ask" },
285
- { metric: "toolCalls" },
286
- { metric: "subject.bytes" },
287
- ],
288
- },
289
- optimizer: {
290
- algorithm: "reflective",
291
- config: {
292
- provider: "claude-code",
293
- model: "YOUR_OPTIMIZER_MODEL",
294
- reasoningEffort: "low",
295
- },
296
- },
297
- budget: {
298
- maxCandidates: 4,
299
- patience: 1,
300
- maxMetricCalls: 40,
301
- maxJudgeCalls: 40,
302
- maxProposalCalls: 3,
303
- maxTokens: 1_000_000,
304
- maxCostUsd: 25,
305
- maxUnpricedModelCalls: 25,
306
- maxWallTimeMs: 1_800_000,
307
- },
308
- });
309
- `;
310
-
311
171
  export const initProject = async (options: InitOptions): Promise<InitResult> => {
312
172
  const parsedOptions = InitOptionsSchema.parse(options);
313
173
  const experiment = parsedOptions.experiment;
@@ -317,14 +177,23 @@ export const initProject = async (options: InitOptions): Promise<InitResult> =>
317
177
  await mkdir(parsedOptions.cwd, { recursive: true });
318
178
  const root = await realpath(parsedOptions.cwd);
319
179
 
320
- await writeIfMissing(root, join(root, "lux.config.ts"), luxConfigBody(experiment), result, force);
321
180
  await writeIfMissing(
322
181
  root,
323
- join(root, "cases", "hello-world.ts"),
182
+ join(root, "lux.config.ts"),
183
+ luxConfigBody(experiment, parsedOptions.driver, parsedOptions.model),
184
+ result,
185
+ force,
186
+ );
187
+ await writeIfMissing(
188
+ root,
189
+ join(root, "cases", experiment ? "hello-world.ts" : "addition.ts"),
324
190
  experiment ? EXPERIMENT_SAMPLE_CASE_BODY : SAMPLE_CASE_BODY,
325
191
  result,
326
192
  force,
327
193
  );
194
+ if (!experiment && (!parsedOptions.driver || parsedOptions.driver === "subprocess")) {
195
+ await writeIfMissing(root, join(root, "agent", "demo.mjs"), DEMO_AGENT_BODY, result, force);
196
+ }
328
197
  await writeIfMissing(root, join(root, "fixtures", ".gitkeep"), "", result, force);
329
198
  // README is the user's to evolve once it exists; `--force` refreshes only
330
199
  // the lux-owned scaffold files, never a hand-edited README.
@@ -344,7 +213,7 @@ export const initProject = async (options: InitOptions): Promise<InitResult> =>
344
213
  experimentCaseBody(
345
214
  "starter/train",
346
215
  "train",
347
- "Complete the representative training task and summarize the result.",
216
+ "Write result.mjs exporting result(a, b), which adds two numbers including negative numbers.",
348
217
  ),
349
218
  result,
350
219
  force,
@@ -355,7 +224,7 @@ export const initProject = async (options: InitOptions): Promise<InitResult> =>
355
224
  experimentCaseBody(
356
225
  "starter/validation",
357
226
  "validation",
358
- "Complete an independently designed validation task and summarize the result.",
227
+ "Write result.mjs exporting result(value, min, max), which clamps a number to the inclusive bounds.",
359
228
  ),
360
229
  result,
361
230
  force,
@@ -366,7 +235,7 @@ export const initProject = async (options: InitOptions): Promise<InitResult> =>
366
235
  experimentCaseBody(
367
236
  "starter/test",
368
237
  "test",
369
- "Complete the final held-out task and summarize the result.",
238
+ "Write result.mjs exporting result(text), which trims surrounding whitespace and lowercases the text.",
370
239
  ),
371
240
  result,
372
241
  force,
@@ -397,14 +266,14 @@ export const formatInitReport = (result: InitResult, cwd: string): string => {
397
266
  lines.push("");
398
267
  lines.push("Next steps:");
399
268
  lines.push(" 1. Install @prismatic-io/lux in this project if it is not already present.");
400
- lines.push(" 2. Edit lux.config.ts to choose a driver.");
269
+ lines.push(" 2. Review lux.config.ts and the selected driver.");
401
270
  if (result.experiment) {
402
271
  lines.push(" 3. Replace the starter prompt and split cases with representative evidence.");
403
272
  lines.push(" 4. lux doctor");
404
273
  lines.push(" 5. lux optimize experiments/starter.optimize.ts --plan");
405
274
  } else {
406
- lines.push(" 3. Edit cases/hello-world.ts with a real prompt.");
407
- lines.push(" 4. lux run");
275
+ lines.push(" 3. lux run");
276
+ lines.push(" 4. lux view");
408
277
  }
409
278
  return lines.join("\n");
410
279
  };
@@ -0,0 +1,109 @@
1
+ import { z } from "incur";
2
+ import {
3
+ ActionTimingSchema,
4
+ AgentActivitySchema,
5
+ DriverMetricsSchema,
6
+ GradingReportSchema,
7
+ PersistedCaseSchema,
8
+ RunEventSchema,
9
+ RunMetadataSchema,
10
+ RunUsageSchema,
11
+ } from "../core/index.js";
12
+ import {
13
+ ExperimentRunSchema,
14
+ SuiteComparisonSchema,
15
+ SuiteRunSchema,
16
+ } from "../orchestrator/index.js";
17
+
18
+ const nullableNumber = z.number().nullable();
19
+ const listedRun = z.object({
20
+ caseSlug: z.string(),
21
+ driverName: z.string(),
22
+ ts: z.string(),
23
+ runDir: z.string(),
24
+ exitReason: RunMetadataSchema.shape.exitReason.nullable(),
25
+ driverAgentId: z.string().nullable(),
26
+ startedAt: z.string().nullable(),
27
+ endedAt: z.string().nullable(),
28
+ durationMs: nullableNumber,
29
+ timeToFirstActionMs: nullableNumber,
30
+ timeToFirstMutationMs: nullableNumber,
31
+ timeToFirstDurableMutationMs: nullableNumber,
32
+ driverMetrics: DriverMetricsSchema,
33
+ subagentCount: z.number(),
34
+ casePassed: z.boolean().nullable(),
35
+ caseScore: nullableNumber,
36
+ assertionPassed: z.number(),
37
+ assertionTotal: z.number(),
38
+ readErrors: z.array(z.string()).optional(),
39
+ });
40
+ const suite = SuiteRunSchema.extend({ suiteDir: z.string() });
41
+ const experiment = ExperimentRunSchema.extend({ experimentDir: z.string() });
42
+ const listing = z.object({
43
+ runsRoot: z.string(),
44
+ readErrors: z.array(z.object({ path: z.string(), message: z.string() })).optional(),
45
+ });
46
+ export const ViewOutputSchema = z.union([
47
+ z.object({
48
+ runDir: z.string(),
49
+ case: PersistedCaseSchema.nullable(),
50
+ metadata: RunMetadataSchema.nullable(),
51
+ grading: GradingReportSchema.nullable(),
52
+ events: z.array(RunEventSchema),
53
+ artifacts: z.array(z.string()),
54
+ }),
55
+ suite,
56
+ experiment,
57
+ listing.extend({ runs: z.array(listedRun), suites: z.array(suite).optional() }),
58
+ listing.extend({ suites: z.array(suite) }),
59
+ listing.extend({ experiments: z.array(experiment) }),
60
+ z.object({ url: z.string(), runsRoot: z.string() }),
61
+ ]);
62
+ const interrupts = z.object({ ask: z.number(), approve: z.number(), custom: z.number() });
63
+ const verdict = z
64
+ .object({ passed: z.boolean().nullable(), score: z.number().nullable() })
65
+ .nullable();
66
+ const runComparison = z.object({
67
+ pathA: z.string(),
68
+ pathB: z.string(),
69
+ caseMismatch: z.array(z.object({ field: z.string(), a: z.unknown(), b: z.unknown() })),
70
+ runDelta: z
71
+ .object({
72
+ exitReason: z.object({ a: z.string(), b: z.string() }),
73
+ durationMsA: nullableNumber,
74
+ durationMsB: nullableNumber,
75
+ actionTiming: z.object({ a: ActionTimingSchema, b: ActionTimingSchema }),
76
+ driverMetrics: z.object({ a: DriverMetricsSchema, b: DriverMetricsSchema }),
77
+ agentActivity: z.object({ a: z.array(AgentActivitySchema), b: z.array(AgentActivitySchema) }),
78
+ interruptCounts: z.object({ a: interrupts, b: interrupts }),
79
+ usage: z.object({ a: RunUsageSchema, b: RunUsageSchema }),
80
+ agentUsageAvailable: z.object({ a: z.boolean(), b: z.boolean() }).optional(),
81
+ })
82
+ .nullable(),
83
+ grading: z.object({
84
+ casePassedA: z.boolean().nullable(),
85
+ casePassedB: z.boolean().nullable(),
86
+ caseScoreA: nullableNumber,
87
+ caseScoreB: nullableNumber,
88
+ caseScoreComparable: z.boolean(),
89
+ deltas: z.array(
90
+ z.object({
91
+ id: z.string(),
92
+ type: z.string(),
93
+ name: z.string(),
94
+ before: verdict,
95
+ after: verdict,
96
+ status: z.enum(["added", "removed", "improved", "regressed", "unchanged", "unavailable"]),
97
+ }),
98
+ ),
99
+ improvements: z.number(),
100
+ regressions: z.number(),
101
+ }),
102
+ artifactsDelta: z.object({
103
+ added: z.array(z.string()),
104
+ removed: z.array(z.string()),
105
+ changed: z.array(z.string()),
106
+ unchanged: z.array(z.string()),
107
+ }),
108
+ });
109
+ export const CompareOutputSchema = z.union([SuiteComparisonSchema, runComparison]);