@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
@@ -0,0 +1,17 @@
1
+ import { z } from "zod";
2
+ import { AgentAttributionSchema } from "./events.js";
3
+
4
+ export const AGENT_SPAWN_KIND = "agent-spawn" as const;
5
+ export const AGENT_COMPLETED_KIND = "agent-completed" as const;
6
+
7
+ export const AgentSpawnPayloadSchema = z.object({
8
+ agent: AgentAttributionSchema.extend({ role: z.literal("subagent") }),
9
+ prompt: z.exactOptional(z.string()),
10
+ });
11
+ export type AgentSpawnPayload = z.infer<typeof AgentSpawnPayloadSchema>;
12
+
13
+ export const AgentCompletedPayloadSchema = z.object({
14
+ agentId: z.string().min(1),
15
+ status: z.enum(["completed", "failed", "cancelled", "unknown"]),
16
+ });
17
+ export type AgentCompletedPayload = z.infer<typeof AgentCompletedPayloadSchema>;
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { EvaluationMetadataSchema } from "./evaluation-clusters.js";
2
3
  import { formatZodIssues } from "./zod.js";
3
4
 
4
5
  const ExpectedBooleanLabelSchema = z
@@ -35,7 +36,7 @@ export const GraderAnnotationSchema = z
35
36
  reviewer: z.string().min(1).optional(),
36
37
  /** Human rationale supplied to the rubric optimizer on mismatches. */
37
38
  feedback: z.string().optional(),
38
- meta: z.record(z.string(), z.unknown()).optional(),
39
+ meta: EvaluationMetadataSchema.optional(),
39
40
  })
40
41
  .strict()
41
42
  .superRefine((annotation, ctx) => {
@@ -73,3 +73,12 @@ export type AnswererPlugin<Cfg = unknown> = {
73
73
  configSchema?: z.ZodTypeAny;
74
74
  create: (config: Cfg) => Answerer | Promise<Answerer>;
75
75
  };
76
+
77
+ export const defineAnswerer = <S extends z.ZodType>(
78
+ definition: Omit<AnswererPlugin<z.output<S>>, "configSchema"> & { configSchema: S },
79
+ ): Omit<AnswererPlugin<z.output<S>>, "configSchema"> & { configSchema: S } => definition;
80
+
81
+ export const answererRef = <S extends z.ZodType>(
82
+ plugin: { name: string; configSchema: S },
83
+ config: z.input<S>,
84
+ ): { name: string; config: z.input<S> } => ({ name: plugin.name, config });
@@ -188,6 +188,7 @@ export const readInspectedFileBytes = async (
188
188
  expected: Stats,
189
189
  maxBytes: number,
190
190
  label: string,
191
+ prefixOnly = false,
191
192
  ): Promise<Buffer> => {
192
193
  if (!Number.isSafeInteger(maxBytes) || maxBytes < 0 || maxBytes > MAX_ARTIFACT_READ_BYTES) {
193
194
  throw new RangeError(
@@ -195,7 +196,7 @@ export const readInspectedFileBytes = async (
195
196
  );
196
197
  }
197
198
  if (!expected.isFile()) throw new Error(`${label} is not a file`);
198
- if (expected.size > maxBytes) {
199
+ if (!prefixOnly && expected.size > maxBytes) {
199
200
  throw new Error(`${label} exceeds the ${maxBytes}-byte artifact read limit`);
200
201
  }
201
202
 
@@ -210,23 +211,24 @@ export const readInspectedFileBytes = async (
210
211
  if (opened.size !== expected.size) {
211
212
  throw new Error(`${label} changed while it was being inspected`);
212
213
  }
213
- if (opened.size > maxBytes) {
214
+ if (!prefixOnly && opened.size > maxBytes) {
214
215
  throw new Error(`${label} exceeds the ${maxBytes}-byte artifact read limit`);
215
216
  }
216
217
  // Allocate for the inspected file, not the caller's ceiling. Reading one
217
218
  // extra byte detects same-inode growth after fstat without making many
218
219
  // tiny artifact reads reserve the maximum concurrently.
219
- const bytes = Buffer.alloc(expected.size + 1);
220
+ const size = Math.min(expected.size, maxBytes);
221
+ const bytes = Buffer.alloc(size + 1);
220
222
  let offset = 0;
221
223
  while (offset < bytes.length) {
222
224
  const read = await handle.read(bytes, offset, bytes.length - offset, offset);
223
225
  if (read.bytesRead === 0) break;
224
226
  offset += read.bytesRead;
225
227
  }
226
- if (offset !== expected.size) {
228
+ if (offset !== Math.min(expected.size, bytes.length)) {
227
229
  throw new Error(`${label} changed while it was being inspected`);
228
230
  }
229
- return bytes.subarray(0, offset);
231
+ return bytes.subarray(0, Math.min(offset, size));
230
232
  } finally {
231
233
  await handle.close();
232
234
  }
@@ -238,6 +240,39 @@ export const readInspectedFileBytes = async (
238
240
  }
239
241
  };
240
242
 
243
+ /** Read a bounded prefix for presentation without weakening full-evidence reads. */
244
+ export const readRunArtifactExcerpt = async (
245
+ run: RunArtifactEvidence,
246
+ authoredPath: string,
247
+ maxChars: number,
248
+ ): Promise<{ text: string; truncated: boolean }> => {
249
+ if (!Number.isSafeInteger(maxChars) || maxChars < 0 || maxChars > 80_000) {
250
+ throw new RangeError("artifact excerpt maxChars must be an integer from 0 to 80000");
251
+ }
252
+ const inspected = await inspectRunArtifact(run, authoredPath);
253
+ if (!inspected.stats?.isFile()) {
254
+ throw new Error(inspected.issue ?? `${authoredPath} is not a file`);
255
+ }
256
+ // An extra character distinguishes an exact fit from an omitted suffix.
257
+ const bytes = await readInspectedFileBytes(
258
+ inspected.target,
259
+ inspected.stats,
260
+ (maxChars + 1) * 4,
261
+ authoredPath,
262
+ true,
263
+ );
264
+ const text = bytes.toString("utf8");
265
+ let end = Math.min(maxChars, text.length);
266
+ if (
267
+ end > 0 &&
268
+ end < text.length &&
269
+ /[\uD800-\uDBFF]/.test(text[end - 1] ?? "") &&
270
+ /[\uDC00-\uDFFF]/.test(text[end] ?? "")
271
+ )
272
+ end--;
273
+ return { text: text.slice(0, end), truncated: text.length > end };
274
+ };
275
+
241
276
  export const readRunArtifactBytes = async (
242
277
  run: RunArtifactEvidence,
243
278
  authoredPath: string,
@@ -9,6 +9,8 @@ export const AssertionResultSchema = z.object({
9
9
  score: z.number().min(0).max(1),
10
10
  comment: z.exactOptional(z.string()),
11
11
  detail: z.unknown().optional(),
12
+ /** The evaluator ran successfully but lacked evidence for a verdict. */
13
+ abstention: z.exactOptional(z.literal("insufficient-evidence")),
12
14
  /** Present when the assertion could not produce a judgment. */
13
15
  errorMessage: z.exactOptional(z.string()),
14
16
  /** Tokens the assertion itself spent. Only LLM-judge assertions report this. */
@@ -105,6 +107,7 @@ export const baseAssertionFields = {
105
107
  weight: z.number().positive().optional(),
106
108
  threshold: z.number().min(0).max(1).optional(),
107
109
  name: z.string().optional(),
110
+ informational: z.boolean().optional(),
108
111
  } as const;
109
112
 
110
113
  export const defineAssertion = <S extends z.ZodObject>(
@@ -135,14 +138,17 @@ export const GradingAssertionEntrySchema = z.object({
135
138
  id: z.exactOptional(z.string()),
136
139
  type: z.string(),
137
140
  name: z.string(),
138
- passed: z.boolean(),
141
+ passed: z.boolean().nullable(),
142
+ informational: z.exactOptional(z.boolean()),
139
143
  score: z.number(),
140
144
  weight: z.number(),
141
- threshold: z.number(),
145
+ /** Acceptance floor; absent for informational measurements. */
146
+ threshold: z.exactOptional(z.number()),
142
147
  /** Wall-clock the assertion took to evaluate. A `rubric` costs seconds; a file check, none. */
143
148
  durationMs: z.number(),
144
149
  comment: z.exactOptional(z.string()),
145
150
  detail: z.unknown().optional(),
151
+ abstention: z.exactOptional(z.literal("insufficient-evidence")),
146
152
  errorMessage: z.exactOptional(z.string()),
147
153
  usage: z.exactOptional(TokenUsageSchema),
148
154
  });
@@ -0,0 +1,65 @@
1
+ import type { Assertion, EvalCase } from "./case.js";
2
+ import { mergePluginConfig } from "./harness-matrix.js";
3
+ import { mergeAnswererReference, mergeDriverReference } from "./reference-defaults.js";
4
+
5
+ type DeepPartial<T> = T extends readonly unknown[]
6
+ ? T
7
+ : T extends (...args: never[]) => unknown
8
+ ? T
9
+ : T extends object
10
+ ? { [K in keyof T]?: DeepPartial<T[K]> }
11
+ : T;
12
+
13
+ export type AssertionDefaults<A extends Assertion = Assertion> = {
14
+ [Type in A["type"]]?: DeepPartial<Omit<Extract<A, { type: Type }>, "type" | "id">>;
15
+ };
16
+
17
+ export type EvalCaseDefaults<A extends Assertion = Assertion> = Omit<
18
+ Partial<EvalCase>,
19
+ "id" | "prompt" | "assertions"
20
+ > & { assertions?: A[] | undefined };
21
+
22
+ /** Named assertions replace inherited checks; unnamed checks append in declaration order. */
23
+ const mergeAssertions = (base: Assertion[], local: Assertion[]): Assertion[] => {
24
+ const seen = new Set<string>();
25
+ for (const assertion of local) {
26
+ if (!assertion.id) continue;
27
+ if (seen.has(assertion.id)) throw new Error(`duplicate assertion id '${assertion.id}'`);
28
+ seen.add(assertion.id);
29
+ }
30
+ const result = [...base];
31
+ for (const assertion of local) {
32
+ const index = assertion.id ? result.findIndex((entry) => entry.id === assertion.id) : -1;
33
+ if (index < 0) result.push(assertion);
34
+ else result[index] = assertion;
35
+ }
36
+ return result;
37
+ };
38
+
39
+ export const mergeCaseDefaults = (
40
+ base: EvalCaseDefaults,
41
+ local: EvalCaseDefaults,
42
+ ): EvalCaseDefaults => ({
43
+ ...base,
44
+ ...local,
45
+ ...(base.driver || local.driver
46
+ ? { driver: mergeDriverReference(base.driver, local.driver) }
47
+ : {}),
48
+ ...(base.answerer || local.answerer
49
+ ? { answerer: mergeAnswererReference(base.answerer, local.answerer) }
50
+ : {}),
51
+ ...(base.meta || local.meta
52
+ ? { meta: mergePluginConfig(base.meta, local.meta) as EvalCase["meta"] }
53
+ : {}),
54
+ ...(base.assertions || local.assertions
55
+ ? { assertions: mergeAssertions(base.assertions ?? [], local.assertions ?? []) }
56
+ : {}),
57
+ });
58
+
59
+ export const applyAssertionDefaults = (
60
+ assertions: Assertion[],
61
+ defaults: AssertionDefaults,
62
+ ): Assertion[] =>
63
+ assertions.map((assertion) => ({
64
+ ...(mergePluginConfig(defaults[assertion.type], assertion) as Assertion),
65
+ }));
package/src/core/case.ts CHANGED
@@ -1,6 +1,16 @@
1
1
  import { z } from "zod";
2
2
  import type { AssertionPlugin } from "./assertion.js";
3
3
  import { collectEvalCaseExtensions, setEvalCaseExtensions } from "./case-authoring-state.js";
4
+ import {
5
+ type AssertionDefaults,
6
+ applyAssertionDefaults,
7
+ type EvalCaseDefaults,
8
+ mergeCaseDefaults,
9
+ } from "./case-defaults.js";
10
+ import { DriverCapabilitySchema } from "./driver.js";
11
+ import { DriverExecutionSchema } from "./driver-execution.js";
12
+ import { EvaluationMetadataSchema } from "./evaluation-clusters.js";
13
+ import { HarnessMatrixSchema, mergePluginConfig } from "./harness-matrix.js";
4
14
  import type { LifecycleHooksPlugin } from "./lifecycle-hooks.js";
5
15
  import { formatZodIssues } from "./zod.js";
6
16
 
@@ -17,7 +27,13 @@ export type FixturesRef = z.infer<typeof FixturesRefSchema>;
17
27
  // `defineEvalCase` discriminate the config type on `name`.
18
28
  export const DriverRefSchema = z.union([
19
29
  z.string(),
20
- z.object({ name: z.string(), config: z.unknown().optional() }).strict(),
30
+ z
31
+ .object({
32
+ name: z.string(),
33
+ config: z.unknown().optional(),
34
+ execution: DriverExecutionSchema.optional(),
35
+ })
36
+ .strict(),
21
37
  ]);
22
38
  export type DriverRef = z.infer<typeof DriverRefSchema>;
23
39
 
@@ -35,6 +51,7 @@ export const AssertionSchema = z
35
51
  name: z.string().optional(),
36
52
  weight: z.number().positive().optional(),
37
53
  threshold: z.number().min(0).max(1).optional(),
54
+ informational: z.boolean().optional(),
38
55
  })
39
56
  .loose();
40
57
  export type Assertion = z.infer<typeof AssertionSchema>;
@@ -44,10 +61,13 @@ const EvalCaseObjectSchema = z.object({
44
61
  prompt: z.string().min(1, "prompt is required"),
45
62
  persona: z.string().min(1).optional(),
46
63
  driver: DriverRefSchema.optional(),
64
+ /** Harness permutations this case runs through instead of the project matrix. */
65
+ matrix: HarnessMatrixSchema.optional(),
47
66
  answerer: AnswererRefSchema.optional(),
48
67
  fixtures: FixturesRefSchema.optional(),
68
+ requires: z.array(DriverCapabilitySchema).optional(),
49
69
  assertions: z.array(AssertionSchema).optional(),
50
- meta: z.record(z.string(), z.unknown()).optional(),
70
+ meta: EvaluationMetadataSchema.optional(),
51
71
  });
52
72
 
53
73
  export const EvalCaseSchema = EvalCaseObjectSchema
@@ -70,7 +90,10 @@ export const EvalCaseSchema = EvalCaseObjectSchema
70
90
  });
71
91
  export type EvalCase = z.infer<typeof EvalCaseSchema>;
72
92
 
73
- type AssertionPlanFields = Pick<Assertion, "id" | "name" | "threshold" | "weight">;
93
+ type AssertionPlanFields = Pick<
94
+ Assertion,
95
+ "id" | "name" | "threshold" | "weight" | "informational"
96
+ >;
74
97
  type AssertionInputOf<Plugin> =
75
98
  Plugin extends AssertionPlugin<Assertion, infer Input> ? Input & AssertionPlanFields : never;
76
99
 
@@ -79,13 +102,19 @@ export type EvalCaseInput<AllowedAssertion extends Assertion = Assertion> = Omit
79
102
  "assertions"
80
103
  > & {
81
104
  assertions?: AllowedAssertion[];
105
+ assertionDefaults?: AssertionDefaults<AllowedAssertion>;
106
+ /** Remove named inherited checks without replacing the rest of the suite plan. */
107
+ omitAssertions?: string[];
82
108
  };
83
109
 
84
110
  export type EvalCaseAuthoringOptions<
85
111
  Plugins extends readonly AssertionPlugin[] = readonly AssertionPlugin[],
112
+ AllowedAssertion extends Assertion = Assertion,
86
113
  > = {
87
114
  assertions?: Plugins;
88
115
  fixtures?: readonly LifecycleHooksPlugin[];
116
+ defaults?: EvalCaseDefaults<AllowedAssertion | AssertionInputOf<Plugins[number]>>;
117
+ assertionDefaults?: AssertionDefaults<AllowedAssertion | AssertionInputOf<Plugins[number]>>;
89
118
  };
90
119
 
91
120
  export type EvalCaseDefinition<AllowedAssertion extends Assertion = Assertion> = {
@@ -95,16 +124,49 @@ export type EvalCaseDefinition<AllowedAssertion extends Assertion = Assertion> =
95
124
  * Further calls to `extend` append fixtures in setup order.
96
125
  */
97
126
  extend<const Plugins extends readonly AssertionPlugin[] = readonly []>(
98
- options: EvalCaseAuthoringOptions<Plugins>,
127
+ options: EvalCaseAuthoringOptions<Plugins, AllowedAssertion>,
99
128
  ): EvalCaseDefinition<AllowedAssertion | AssertionInputOf<Plugins[number]>>;
100
129
  };
101
130
 
102
131
  export const createEvalCaseDefinition = <AllowedAssertion extends Assertion = Assertion>(
103
132
  inheritedAssertions: readonly AssertionPlugin[] = [],
104
133
  inheritedFixtures: readonly LifecycleHooksPlugin[] = [],
134
+ defaults: EvalCaseDefaults = {},
135
+ assertionDefaults: AssertionDefaults = {},
105
136
  ): EvalCaseDefinition<AllowedAssertion> => {
106
137
  const define = ((input: EvalCaseInput<AllowedAssertion>): EvalCase => {
107
- const parsed = EvalCaseSchema.safeParse(input);
138
+ const { omitAssertions = [], assertionDefaults: localAssertionDefaults = {}, ...local } = input;
139
+ for (const id of omitAssertions) {
140
+ if (!defaults.assertions?.some((assertion) => assertion.id === id)) {
141
+ throw new Error(`cannot omit unknown inherited assertion '${id}'`);
142
+ }
143
+ }
144
+ const resolved = mergeCaseDefaults(
145
+ {
146
+ ...defaults,
147
+ ...(defaults.assertions
148
+ ? {
149
+ assertions: defaults.assertions.filter(
150
+ (assertion) => !omitAssertions.includes(assertion.id ?? ""),
151
+ ),
152
+ }
153
+ : {}),
154
+ },
155
+ local,
156
+ );
157
+ const parsed = EvalCaseSchema.safeParse({
158
+ ...resolved,
159
+ ...("id" in local ? { id: local.id } : {}),
160
+ prompt: local.prompt,
161
+ ...(resolved.assertions
162
+ ? {
163
+ assertions: applyAssertionDefaults(
164
+ resolved.assertions,
165
+ mergePluginConfig(assertionDefaults, localAssertionDefaults) as AssertionDefaults,
166
+ ),
167
+ }
168
+ : {}),
169
+ });
108
170
  if (!parsed.success) {
109
171
  throw new Error(`Invalid eval case: ${formatZodIssues(parsed.error)}`);
110
172
  }
@@ -116,11 +178,19 @@ export const createEvalCaseDefinition = <AllowedAssertion extends Assertion = As
116
178
  setEvalCaseExtensions(parsed.data, extensions);
117
179
  return parsed.data;
118
180
  }) as EvalCaseDefinition<AllowedAssertion>;
119
- define.extend = (({ assertions = [], fixtures = [] }: EvalCaseAuthoringOptions) =>
120
- createEvalCaseDefinition(
181
+ define.extend = ((options: EvalCaseAuthoringOptions) => {
182
+ const { assertions = [], fixtures = [] } = options;
183
+ const inherited = EvalCaseObjectSchema.omit({ id: true, prompt: true })
184
+ .partial()
185
+ .strict()
186
+ .parse(options.defaults ?? {});
187
+ return createEvalCaseDefinition(
121
188
  [...inheritedAssertions, ...assertions],
122
189
  [...inheritedFixtures, ...fixtures],
123
- )) as EvalCaseDefinition<AllowedAssertion>["extend"];
190
+ mergeCaseDefaults(defaults, inherited),
191
+ mergePluginConfig(assertionDefaults, options.assertionDefaults ?? {}) as AssertionDefaults,
192
+ );
193
+ }) as EvalCaseDefinition<AllowedAssertion>["extend"];
124
194
  return define;
125
195
  };
126
196
 
@@ -149,6 +219,7 @@ export const PersistedCaseSchema = EvalCaseObjectSchema.partial()
149
219
  driver: PersistedDriverRefSchema.optional(),
150
220
  answerer: PersistedAnswererRefSchema.optional(),
151
221
  fixtures: PersistedFixturesRefSchema.optional(),
222
+ meta: z.record(z.string(), z.unknown()).optional(),
152
223
  })
153
224
  .loose();
154
225
  export type PersistedCase = z.infer<typeof PersistedCaseSchema>;
@@ -0,0 +1,74 @@
1
+ import { chmod, lstat, mkdir, mkdtemp, readdir, realpath, rm, symlink } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
4
+ import type { Run } from "./run.js";
5
+ import { copyRegularFileNoFollow } from "./secure-copy.js";
6
+
7
+ const executionWorkspaces = new WeakMap<Run, string>();
8
+
9
+ /** Internal: live execution state is deliberately absent from persisted run evidence. */
10
+ export const bindRunExecutionWorkspace = (run: Run, root: string): void => {
11
+ executionWorkspaces.set(run, resolve(root));
12
+ };
13
+
14
+ export const runExecutionWorkspace = (run: Run): string | undefined => executionWorkspaces.get(run);
15
+
16
+ const within = (root: string, path: string): boolean => {
17
+ const rel = relative(root, path);
18
+ return rel !== ".." && !rel.startsWith(`..${sep}`) && !isAbsolute(rel);
19
+ };
20
+
21
+ /** A disposable command tree preserves dependencies without exposing host symlink targets. */
22
+ export const copyCommandWorkspace = async (
23
+ source: string,
24
+ signal?: AbortSignal,
25
+ ): Promise<{
26
+ root: string;
27
+ close: () => Promise<void>;
28
+ }> => {
29
+ const sourceRoot = await realpath(source);
30
+ if (!(await lstat(source)).isDirectory() || (await lstat(source)).isSymbolicLink()) {
31
+ throw new Error(`verification workspace must be a real directory: ${source}`);
32
+ }
33
+ const root = await mkdtemp(join(tmpdir(), "lux-command-verification-"));
34
+ const close = () => rm(root, { recursive: true, force: true });
35
+ let entries = 0;
36
+ const copy = async (directory: string): Promise<void> => {
37
+ if (!within(sourceRoot, await realpath(directory))) {
38
+ throw new Error(`verification directory escapes its workspace: ${directory}`);
39
+ }
40
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
41
+ signal?.throwIfAborted();
42
+ if (++entries > 100_000) throw new Error("verification workspace exceeds 100000 entries");
43
+ if (directory === sourceRoot && entry.name === ".lux-claude") continue;
44
+ const path = join(directory, entry.name);
45
+ const target = join(root, relative(sourceRoot, path));
46
+ const metadata = await lstat(path);
47
+ if (metadata.isSymbolicLink()) {
48
+ const resolved = await realpath(path);
49
+ if (!within(sourceRoot, resolved)) {
50
+ throw new Error(`verification symlink escapes its workspace: ${path}`);
51
+ }
52
+ await symlink(
53
+ relative(dirname(target), join(root, relative(sourceRoot, resolved))),
54
+ target,
55
+ );
56
+ } else if (metadata.isDirectory()) {
57
+ await mkdir(target, { mode: (metadata.mode & 0o777) | 0o700 });
58
+ await copy(path);
59
+ await chmod(target, metadata.mode & 0o777);
60
+ } else if (metadata.isFile()) {
61
+ await copyRegularFileNoFollow(sourceRoot, path, target);
62
+ } else {
63
+ throw new Error(`verification workspace contains an unsupported entry: ${path}`);
64
+ }
65
+ }
66
+ };
67
+ try {
68
+ await copy(sourceRoot);
69
+ return { root, close };
70
+ } catch (error) {
71
+ await close();
72
+ throw error;
73
+ }
74
+ };
@@ -0,0 +1,84 @@
1
+ import { z } from "zod";
2
+
3
+ const homePath = z
4
+ .string()
5
+ .min(1)
6
+ .refine(
7
+ (value) =>
8
+ !value.startsWith("/") &&
9
+ !value.includes("\\") &&
10
+ value.split("/").every((part) => part !== ".." && part !== "." && part !== ""),
11
+ "must be a relative path within the container home",
12
+ );
13
+
14
+ export const ContainerExecutionSchema = z
15
+ .object({
16
+ kind: z.literal("container"),
17
+ /** A locally available image containing Lux and the selected Linux harness. */
18
+ image: z.string().min(1),
19
+ command: z.string().min(1).optional(),
20
+ /** The worker shipped with the same Lux build as the host. */
21
+ worker: z.string().min(1).optional(),
22
+ /** Optional module in the image exporting a custom DriverPlugin as default. */
23
+ driverModule: z.string().min(1).optional(),
24
+ mounts: z
25
+ .array(
26
+ z
27
+ .object({
28
+ source: z.string().min(1),
29
+ target: z.string().min(1).optional(),
30
+ readOnly: z.boolean().optional(),
31
+ })
32
+ .strict(),
33
+ )
34
+ .optional(),
35
+ /** Only these host environment variables enter the container. */
36
+ passEnv: z.array(z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/)).optional(),
37
+ env: z.record(z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/), z.string()).optional(),
38
+ /** Private copies, never host-home mounts; deleted after the run. */
39
+ homeFiles: z
40
+ .array(
41
+ z
42
+ .object({
43
+ destination: homePath,
44
+ source: z.discriminatedUnion("kind", [
45
+ z.object({ kind: z.literal("file"), path: z.string().min(1) }).strict(),
46
+ z
47
+ .object({
48
+ kind: z.literal("keychain"),
49
+ service: z.string().min(1),
50
+ account: z.string().min(1),
51
+ encoding: z.enum(["utf8", "go-keyring-base64"]).optional(),
52
+ })
53
+ .strict(),
54
+ ]),
55
+ })
56
+ .strict(),
57
+ )
58
+ .max(32)
59
+ .optional(),
60
+ network: z.enum(["bridge", "none"]).optional(),
61
+ user: z.string().min(1).optional(),
62
+ memory: z
63
+ .string()
64
+ .regex(/^[1-9][0-9]*[bkmgt]?$/i)
65
+ .optional(),
66
+ cpus: z.number().positive().optional(),
67
+ pidsLimit: z.number().int().positive().optional(),
68
+ startupTimeoutMs: z.number().int().positive().optional(),
69
+ })
70
+ .strict();
71
+
72
+ export const DriverExecutionSchema = z.discriminatedUnion("kind", [
73
+ z.object({ kind: z.literal("host") }).strict(),
74
+ ContainerExecutionSchema,
75
+ ]);
76
+ export type DriverExecution = z.infer<typeof DriverExecutionSchema>;
77
+ export type ContainerExecution = z.infer<typeof ContainerExecutionSchema>;
78
+
79
+ export const driverExecutionOf = (reference: unknown): DriverExecution | undefined => {
80
+ if (!reference || typeof reference !== "object" || !("execution" in reference)) return undefined;
81
+ return reference.execution === undefined
82
+ ? undefined
83
+ : DriverExecutionSchema.parse(reference.execution);
84
+ };
@@ -0,0 +1,51 @@
1
+ import { z } from "zod";
2
+
3
+ export const DriverMetricUnitSchema = z.enum([
4
+ "number",
5
+ "count",
6
+ "milliseconds",
7
+ "bytes",
8
+ "tokens",
9
+ "usd",
10
+ "ratio",
11
+ "percent",
12
+ "score",
13
+ ]);
14
+ export type DriverMetricUnit = z.infer<typeof DriverMetricUnitSchema>;
15
+
16
+ export const DriverMetricDescriptorSchema = z
17
+ .object({
18
+ unit: DriverMetricUnitSchema.default("number"),
19
+ label: z.string().min(1).max(120).optional(),
20
+ better: z.enum(["lower", "higher", "neutral"]).default("neutral"),
21
+ })
22
+ .strict();
23
+ export type DriverMetricDescriptor = z.infer<typeof DriverMetricDescriptorSchema>;
24
+
25
+ export const DriverMetricSchema = DriverMetricDescriptorSchema.extend({
26
+ value: z.number().finite(),
27
+ }).strict();
28
+ export type DriverMetric = z.infer<typeof DriverMetricSchema>;
29
+
30
+ export const DriverMetricsSchema = z.record(z.string().min(1).max(120), DriverMetricSchema);
31
+ export type DriverMetrics = z.infer<typeof DriverMetricsSchema>;
32
+
33
+ const ReportedDriverMetricSchema = z.union([z.number().finite(), DriverMetricSchema]);
34
+ export const ReportedDriverMetricsSchema = z.record(
35
+ z.string().min(1).max(120),
36
+ ReportedDriverMetricSchema,
37
+ );
38
+ export type ReportedDriverMetrics = z.input<typeof ReportedDriverMetricsSchema>;
39
+
40
+ export const normalizeDriverMetrics = (value: unknown): DriverMetrics => {
41
+ if (!value || typeof value !== "object" || Array.isArray(value)) return {};
42
+ return Object.fromEntries(
43
+ Object.entries(value).flatMap(([name, metric]) => {
44
+ if (name.length === 0 || name.length > 120) return [];
45
+ const parsed = DriverMetricSchema.safeParse(
46
+ typeof metric === "number" ? { value: metric } : metric,
47
+ ).data;
48
+ return parsed ? [[name, parsed]] : [];
49
+ }),
50
+ );
51
+ };