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

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 (727) hide show
  1. package/lib/answerers/claude-code/index.d.ts +15 -3
  2. package/lib/answerers/claude-code/index.d.ts.map +1 -1
  3. package/lib/answerers/claude-code/index.js +6 -5
  4. package/lib/answerers/claude-code/index.js.map +1 -1
  5. package/lib/answerers/persona/index.d.ts +44 -5
  6. package/lib/answerers/persona/index.d.ts.map +1 -1
  7. package/lib/answerers/persona/index.js +60 -34
  8. package/lib/answerers/persona/index.js.map +1 -1
  9. package/lib/answerers/terminal/index.d.ts +9 -3
  10. package/lib/answerers/terminal/index.d.ts.map +1 -1
  11. package/lib/answerers/terminal/index.js +7 -5
  12. package/lib/answerers/terminal/index.js.map +1 -1
  13. package/lib/assertions/authoring.d.ts +2 -2
  14. package/lib/assertions/authoring.d.ts.map +1 -1
  15. package/lib/assertions/authoring.js.map +1 -1
  16. package/lib/assertions/core/command-exits-zero.d.ts +4 -1
  17. package/lib/assertions/core/command-exits-zero.d.ts.map +1 -1
  18. package/lib/assertions/core/command-exits-zero.js +50 -7
  19. package/lib/assertions/core/command-exits-zero.js.map +1 -1
  20. package/lib/assertions/core/event-checks.d.ts +3 -0
  21. package/lib/assertions/core/event-checks.d.ts.map +1 -1
  22. package/lib/assertions/core/event-checks.js +49 -3
  23. package/lib/assertions/core/event-checks.js.map +1 -1
  24. package/lib/assertions/core/file-checks.d.ts +6 -0
  25. package/lib/assertions/core/file-checks.d.ts.map +1 -1
  26. package/lib/assertions/core/helpers.d.ts +2 -7
  27. package/lib/assertions/core/helpers.d.ts.map +1 -1
  28. package/lib/assertions/core/helpers.js +2 -6
  29. package/lib/assertions/core/helpers.js.map +1 -1
  30. package/lib/assertions/core/index.d.ts.map +1 -1
  31. package/lib/assertions/core/index.js +2 -1
  32. package/lib/assertions/core/index.js.map +1 -1
  33. package/lib/assertions/core/json-pointer-equals.d.ts +1 -0
  34. package/lib/assertions/core/json-pointer-equals.d.ts.map +1 -1
  35. package/lib/assertions/core/output-checks.d.ts +3 -0
  36. package/lib/assertions/core/output-checks.d.ts.map +1 -1
  37. package/lib/assertions/core/predicate.d.ts +1 -0
  38. package/lib/assertions/core/predicate.d.ts.map +1 -1
  39. package/lib/assertions/core/resource-checks.d.ts +25 -0
  40. package/lib/assertions/core/resource-checks.d.ts.map +1 -1
  41. package/lib/assertions/core/resource-checks.js +35 -5
  42. package/lib/assertions/core/resource-checks.js.map +1 -1
  43. package/lib/assertions/rubric/index.d.ts +28 -3
  44. package/lib/assertions/rubric/index.d.ts.map +1 -1
  45. package/lib/assertions/rubric/index.js +59 -13
  46. package/lib/assertions/rubric/index.js.map +1 -1
  47. package/lib/assertions/rubric/internal.d.ts +30 -5
  48. package/lib/assertions/rubric/internal.d.ts.map +1 -1
  49. package/lib/assertions/rubric/internal.js +181 -28
  50. package/lib/assertions/rubric/internal.js.map +1 -1
  51. package/lib/authoring.d.ts +36 -2
  52. package/lib/authoring.d.ts.map +1 -1
  53. package/lib/authoring.js +36 -1
  54. package/lib/authoring.js.map +1 -1
  55. package/lib/cli/bin.js +2 -13
  56. package/lib/cli/bin.js.map +1 -1
  57. package/lib/cli/command-runtime.d.ts +3 -3
  58. package/lib/cli/command-runtime.d.ts.map +1 -1
  59. package/lib/cli/command-runtime.js +17 -6
  60. package/lib/cli/command-runtime.js.map +1 -1
  61. package/lib/cli/doctor.d.ts +55 -0
  62. package/lib/cli/doctor.d.ts.map +1 -0
  63. package/lib/cli/doctor.js +14 -0
  64. package/lib/cli/doctor.js.map +1 -0
  65. package/lib/cli/harness-plan.d.ts +26 -0
  66. package/lib/cli/harness-plan.d.ts.map +1 -0
  67. package/lib/cli/harness-plan.js +75 -0
  68. package/lib/cli/harness-plan.js.map +1 -0
  69. package/lib/cli/init-templates.d.ts +11 -0
  70. package/lib/cli/init-templates.d.ts.map +1 -0
  71. package/lib/cli/init-templates.js +215 -0
  72. package/lib/cli/init-templates.js.map +1 -0
  73. package/lib/cli/init.d.ts +10 -0
  74. package/lib/cli/init.d.ts.map +1 -1
  75. package/lib/cli/init.js +34 -173
  76. package/lib/cli/init.js.map +1 -1
  77. package/lib/cli/output-schemas.d.ts +1408 -0
  78. package/lib/cli/output-schemas.d.ts.map +1 -0
  79. package/lib/cli/output-schemas.js +91 -0
  80. package/lib/cli/output-schemas.js.map +1 -0
  81. package/lib/cli/program.d.ts +140 -12
  82. package/lib/cli/program.d.ts.map +1 -1
  83. package/lib/cli/program.js +779 -646
  84. package/lib/cli/program.js.map +1 -1
  85. package/lib/cli/render/reporter.d.ts.map +1 -1
  86. package/lib/cli/render/reporter.js +48 -8
  87. package/lib/cli/render/reporter.js.map +1 -1
  88. package/lib/cli/run-options.d.ts +20 -4
  89. package/lib/cli/run-options.d.ts.map +1 -1
  90. package/lib/cli/run-options.js +100 -19
  91. package/lib/cli/run-options.js.map +1 -1
  92. package/lib/cli/view.d.ts +15 -0
  93. package/lib/cli/view.d.ts.map +1 -0
  94. package/lib/cli/view.js +168 -0
  95. package/lib/cli/view.js.map +1 -0
  96. package/lib/container/driver.d.ts +27 -0
  97. package/lib/container/driver.d.ts.map +1 -0
  98. package/lib/container/driver.js +197 -0
  99. package/lib/container/driver.js.map +1 -0
  100. package/lib/container/protocol.d.ts +12 -0
  101. package/lib/container/protocol.d.ts.map +1 -0
  102. package/lib/container/protocol.js +38 -0
  103. package/lib/container/protocol.js.map +1 -0
  104. package/lib/container/resources.d.ts +12 -0
  105. package/lib/container/resources.d.ts.map +1 -0
  106. package/lib/container/resources.js +133 -0
  107. package/lib/container/resources.js.map +1 -0
  108. package/lib/container/worker.d.ts +2 -0
  109. package/lib/container/worker.d.ts.map +1 -0
  110. package/lib/container/worker.js +85 -0
  111. package/lib/container/worker.js.map +1 -0
  112. package/lib/core/action-events.d.ts +29 -0
  113. package/lib/core/action-events.d.ts.map +1 -0
  114. package/lib/core/action-events.js +51 -0
  115. package/lib/core/action-events.js.map +1 -0
  116. package/lib/core/agent-activity.d.ts +49 -0
  117. package/lib/core/agent-activity.d.ts.map +1 -0
  118. package/lib/core/agent-activity.js +206 -0
  119. package/lib/core/agent-activity.js.map +1 -0
  120. package/lib/core/agent-environment.d.ts +5 -0
  121. package/lib/core/agent-environment.d.ts.map +1 -0
  122. package/lib/core/agent-environment.js +47 -0
  123. package/lib/core/agent-environment.js.map +1 -0
  124. package/lib/core/agent-events.d.ts +26 -0
  125. package/lib/core/agent-events.d.ts.map +1 -0
  126. package/lib/core/agent-events.js +13 -0
  127. package/lib/core/agent-events.js.map +1 -0
  128. package/lib/core/annotation.d.ts +6 -2
  129. package/lib/core/annotation.d.ts.map +1 -1
  130. package/lib/core/annotation.js +2 -1
  131. package/lib/core/annotation.js.map +1 -1
  132. package/lib/core/answerer.d.ts +12 -0
  133. package/lib/core/answerer.d.ts.map +1 -1
  134. package/lib/core/answerer.js +2 -0
  135. package/lib/core/answerer.js.map +1 -1
  136. package/lib/core/artifact-evidence.d.ts +8 -0
  137. package/lib/core/artifact-evidence.d.ts.map +1 -1
  138. package/lib/core/artifact-evidence.js +36 -4
  139. package/lib/core/artifact-evidence.js.map +1 -1
  140. package/lib/core/assertion.d.ts +20 -2
  141. package/lib/core/assertion.d.ts.map +1 -1
  142. package/lib/core/assertion.js +19 -1
  143. package/lib/core/assertion.js.map +1 -1
  144. package/lib/core/case.d.ts +111 -3
  145. package/lib/core/case.d.ts.map +1 -1
  146. package/lib/core/case.js +17 -2
  147. package/lib/core/case.js.map +1 -1
  148. package/lib/core/command-verification.d.ts +10 -0
  149. package/lib/core/command-verification.d.ts.map +1 -0
  150. package/lib/core/command-verification.js +66 -0
  151. package/lib/core/command-verification.js.map +1 -0
  152. package/lib/core/driver-execution.d.ts +83 -0
  153. package/lib/core/driver-execution.d.ts.map +1 -0
  154. package/lib/core/driver-execution.js +72 -0
  155. package/lib/core/driver-execution.js.map +1 -0
  156. package/lib/core/driver-metrics.d.ts +98 -0
  157. package/lib/core/driver-metrics.d.ts.map +1 -0
  158. package/lib/core/driver-metrics.js +36 -0
  159. package/lib/core/driver-metrics.js.map +1 -0
  160. package/lib/core/driver.d.ts +64 -0
  161. package/lib/core/driver.d.ts.map +1 -1
  162. package/lib/core/driver.js +28 -0
  163. package/lib/core/driver.js.map +1 -1
  164. package/lib/core/duration.d.ts +5 -0
  165. package/lib/core/duration.d.ts.map +1 -0
  166. package/lib/core/duration.js +49 -0
  167. package/lib/core/duration.js.map +1 -0
  168. package/lib/core/environment.d.ts +18 -0
  169. package/lib/core/environment.d.ts.map +1 -0
  170. package/lib/core/environment.js +21 -0
  171. package/lib/core/environment.js.map +1 -0
  172. package/lib/core/evaluation-clusters.d.ts +17 -0
  173. package/lib/core/evaluation-clusters.d.ts.map +1 -0
  174. package/lib/core/evaluation-clusters.js +23 -0
  175. package/lib/core/evaluation-clusters.js.map +1 -0
  176. package/lib/core/events.d.ts +36 -0
  177. package/lib/core/events.d.ts.map +1 -1
  178. package/lib/core/events.js +12 -2
  179. package/lib/core/events.js.map +1 -1
  180. package/lib/core/experiment.d.ts +32 -2
  181. package/lib/core/experiment.d.ts.map +1 -1
  182. package/lib/core/experiment.js +35 -18
  183. package/lib/core/experiment.js.map +1 -1
  184. package/lib/core/file-tree.d.ts +7 -0
  185. package/lib/core/file-tree.d.ts.map +1 -0
  186. package/lib/core/file-tree.js +35 -0
  187. package/lib/core/file-tree.js.map +1 -0
  188. package/lib/core/global-id.d.ts +6 -0
  189. package/lib/core/global-id.d.ts.map +1 -0
  190. package/lib/core/global-id.js +17 -0
  191. package/lib/core/global-id.js.map +1 -0
  192. package/lib/core/harness-catalog.d.ts +35 -0
  193. package/lib/core/harness-catalog.d.ts.map +1 -0
  194. package/lib/core/harness-catalog.js +45 -0
  195. package/lib/core/harness-catalog.js.map +1 -0
  196. package/lib/core/harness-catalogs/antigravity.d.ts +11 -0
  197. package/lib/core/harness-catalogs/antigravity.d.ts.map +1 -0
  198. package/lib/core/harness-catalogs/antigravity.js +23 -0
  199. package/lib/core/harness-catalogs/antigravity.js.map +1 -0
  200. package/lib/core/harness-catalogs/claude-code.d.ts +12 -0
  201. package/lib/core/harness-catalogs/claude-code.d.ts.map +1 -0
  202. package/lib/core/harness-catalogs/claude-code.js +24 -0
  203. package/lib/core/harness-catalogs/claude-code.js.map +1 -0
  204. package/lib/core/harness-catalogs/codex.d.ts +11 -0
  205. package/lib/core/harness-catalogs/codex.d.ts.map +1 -0
  206. package/lib/core/harness-catalogs/codex.js +26 -0
  207. package/lib/core/harness-catalogs/codex.js.map +1 -0
  208. package/lib/core/harness-catalogs/copilot.d.ts +29 -0
  209. package/lib/core/harness-catalogs/copilot.d.ts.map +1 -0
  210. package/lib/core/harness-catalogs/copilot.js +45 -0
  211. package/lib/core/harness-catalogs/copilot.js.map +1 -0
  212. package/lib/core/harness-catalogs/cursor.d.ts +2 -0
  213. package/lib/core/harness-catalogs/cursor.d.ts.map +1 -0
  214. package/lib/core/harness-catalogs/cursor.js +13 -0
  215. package/lib/core/harness-catalogs/cursor.js.map +1 -0
  216. package/lib/core/harness-catalogs/grok-build.d.ts +7 -0
  217. package/lib/core/harness-catalogs/grok-build.d.ts.map +1 -0
  218. package/lib/core/harness-catalogs/grok-build.js +18 -0
  219. package/lib/core/harness-catalogs/grok-build.js.map +1 -0
  220. package/lib/core/harness-catalogs/index.d.ts +73 -0
  221. package/lib/core/harness-catalogs/index.d.ts.map +1 -0
  222. package/lib/core/harness-catalogs/index.js +17 -0
  223. package/lib/core/harness-catalogs/index.js.map +1 -0
  224. package/lib/core/harness-matrix.d.ts +154 -0
  225. package/lib/core/harness-matrix.d.ts.map +1 -0
  226. package/lib/core/harness-matrix.js +204 -0
  227. package/lib/core/harness-matrix.js.map +1 -0
  228. package/lib/core/index.d.ts +12 -0
  229. package/lib/core/index.d.ts.map +1 -1
  230. package/lib/core/index.js +12 -0
  231. package/lib/core/index.js.map +1 -1
  232. package/lib/core/lifecycle-fixtures.d.ts.map +1 -1
  233. package/lib/core/lifecycle-fixtures.js +4 -2
  234. package/lib/core/lifecycle-fixtures.js.map +1 -1
  235. package/lib/core/model-cli.d.ts +9 -11
  236. package/lib/core/model-cli.d.ts.map +1 -1
  237. package/lib/core/model-cli.js +31 -19
  238. package/lib/core/model-cli.js.map +1 -1
  239. package/lib/core/platform-process.d.ts +6 -1
  240. package/lib/core/platform-process.d.ts.map +1 -1
  241. package/lib/core/platform-process.js +49 -11
  242. package/lib/core/platform-process.js.map +1 -1
  243. package/lib/core/rubric.d.ts +1 -0
  244. package/lib/core/rubric.d.ts.map +1 -1
  245. package/lib/core/run.d.ts +293 -1
  246. package/lib/core/run.d.ts.map +1 -1
  247. package/lib/core/run.js +27 -0
  248. package/lib/core/run.js.map +1 -1
  249. package/lib/core/secure-copy.d.ts.map +1 -0
  250. package/lib/core/secure-copy.js.map +1 -0
  251. package/lib/core/usage.d.ts +5 -0
  252. package/lib/core/usage.d.ts.map +1 -1
  253. package/lib/core/usage.js +3 -0
  254. package/lib/core/usage.js.map +1 -1
  255. package/lib/core/wire.d.ts +12 -0
  256. package/lib/core/wire.d.ts.map +1 -1
  257. package/lib/core/wire.js +5 -1
  258. package/lib/core/wire.js.map +1 -1
  259. package/lib/drivers/antigravity/artifacts.d.ts +2 -0
  260. package/lib/drivers/antigravity/artifacts.d.ts.map +1 -0
  261. package/lib/drivers/antigravity/artifacts.js +33 -0
  262. package/lib/drivers/antigravity/artifacts.js.map +1 -0
  263. package/lib/drivers/antigravity/config.d.ts +88 -0
  264. package/lib/drivers/antigravity/config.d.ts.map +1 -0
  265. package/lib/drivers/antigravity/config.js +87 -0
  266. package/lib/drivers/antigravity/config.js.map +1 -0
  267. package/lib/drivers/antigravity/events.d.ts +4 -0
  268. package/lib/drivers/antigravity/events.d.ts.map +1 -0
  269. package/lib/drivers/antigravity/events.js +241 -0
  270. package/lib/drivers/antigravity/events.js.map +1 -0
  271. package/lib/drivers/antigravity/index.d.ts +114 -0
  272. package/lib/drivers/antigravity/index.d.ts.map +1 -0
  273. package/lib/drivers/antigravity/index.js +113 -0
  274. package/lib/drivers/antigravity/index.js.map +1 -0
  275. package/lib/drivers/antigravity/runtime.d.ts +7 -0
  276. package/lib/drivers/antigravity/runtime.d.ts.map +1 -0
  277. package/lib/drivers/antigravity/runtime.js +83 -0
  278. package/lib/drivers/antigravity/runtime.js.map +1 -0
  279. package/lib/drivers/claude-code/deferred-process.d.ts +17 -0
  280. package/lib/drivers/claude-code/deferred-process.d.ts.map +1 -0
  281. package/lib/drivers/claude-code/deferred-process.js +108 -0
  282. package/lib/drivers/claude-code/deferred-process.js.map +1 -0
  283. package/lib/drivers/claude-code/index.d.ts +180 -10
  284. package/lib/drivers/claude-code/index.d.ts.map +1 -1
  285. package/lib/drivers/claude-code/index.js +186 -252
  286. package/lib/drivers/claude-code/index.js.map +1 -1
  287. package/lib/drivers/claude-code/isolation.d.ts +8 -0
  288. package/lib/drivers/claude-code/isolation.d.ts.map +1 -0
  289. package/lib/drivers/claude-code/isolation.js +199 -0
  290. package/lib/drivers/claude-code/isolation.js.map +1 -0
  291. package/lib/drivers/claude-code/parse-events.d.ts.map +1 -1
  292. package/lib/drivers/claude-code/parse-events.js +73 -8
  293. package/lib/drivers/claude-code/parse-events.js.map +1 -1
  294. package/lib/drivers/codex/app-events.d.ts +9 -2
  295. package/lib/drivers/codex/app-events.d.ts.map +1 -1
  296. package/lib/drivers/codex/app-events.js +104 -12
  297. package/lib/drivers/codex/app-events.js.map +1 -1
  298. package/lib/drivers/codex/config.d.ts +66 -5
  299. package/lib/drivers/codex/config.d.ts.map +1 -1
  300. package/lib/drivers/codex/config.js +39 -8
  301. package/lib/drivers/codex/config.js.map +1 -1
  302. package/lib/drivers/codex/exec-events.d.ts +4 -0
  303. package/lib/drivers/codex/exec-events.d.ts.map +1 -0
  304. package/lib/drivers/codex/exec-events.js +230 -0
  305. package/lib/drivers/codex/exec-events.js.map +1 -0
  306. package/lib/drivers/codex/index.d.ts +138 -4
  307. package/lib/drivers/codex/index.d.ts.map +1 -1
  308. package/lib/drivers/codex/index.js +112 -276
  309. package/lib/drivers/codex/index.js.map +1 -1
  310. package/lib/drivers/copilot/config.d.ts +84 -0
  311. package/lib/drivers/copilot/config.d.ts.map +1 -0
  312. package/lib/drivers/copilot/config.js +57 -0
  313. package/lib/drivers/copilot/config.js.map +1 -0
  314. package/lib/drivers/copilot/index.d.ts +107 -0
  315. package/lib/drivers/copilot/index.d.ts.map +1 -0
  316. package/lib/drivers/copilot/index.js +268 -0
  317. package/lib/drivers/copilot/index.js.map +1 -0
  318. package/lib/drivers/cursor/config.d.ts +28 -0
  319. package/lib/drivers/cursor/config.d.ts.map +1 -0
  320. package/lib/drivers/cursor/config.js +28 -0
  321. package/lib/drivers/cursor/config.js.map +1 -0
  322. package/lib/drivers/cursor/index.d.ts +44 -0
  323. package/lib/drivers/cursor/index.d.ts.map +1 -0
  324. package/lib/drivers/cursor/index.js +286 -0
  325. package/lib/drivers/cursor/index.js.map +1 -0
  326. package/lib/drivers/cursor/interaction.d.ts +6 -0
  327. package/lib/drivers/cursor/interaction.d.ts.map +1 -0
  328. package/lib/drivers/cursor/interaction.js +55 -0
  329. package/lib/drivers/cursor/interaction.js.map +1 -0
  330. package/lib/drivers/grok-build/config.d.ts +68 -0
  331. package/lib/drivers/grok-build/config.d.ts.map +1 -0
  332. package/lib/drivers/grok-build/config.js +40 -0
  333. package/lib/drivers/grok-build/config.js.map +1 -0
  334. package/lib/drivers/grok-build/index.d.ts +87 -0
  335. package/lib/drivers/grok-build/index.d.ts.map +1 -0
  336. package/lib/drivers/grok-build/index.js +293 -0
  337. package/lib/drivers/grok-build/index.js.map +1 -0
  338. package/lib/drivers/mcp/index.d.ts +37 -4
  339. package/lib/drivers/mcp/index.d.ts.map +1 -1
  340. package/lib/drivers/mcp/index.js +25 -11
  341. package/lib/drivers/mcp/index.js.map +1 -1
  342. package/lib/drivers/shared/acp-events.d.ts +15 -0
  343. package/lib/drivers/shared/acp-events.d.ts.map +1 -0
  344. package/lib/drivers/shared/acp-events.js +83 -0
  345. package/lib/drivers/shared/acp-events.js.map +1 -0
  346. package/lib/drivers/shared/acp-interaction.d.ts +7 -0
  347. package/lib/drivers/shared/acp-interaction.d.ts.map +1 -0
  348. package/lib/drivers/shared/acp-interaction.js +20 -0
  349. package/lib/drivers/shared/acp-interaction.js.map +1 -0
  350. package/lib/drivers/shared/acp-session.d.ts +4 -0
  351. package/lib/drivers/shared/acp-session.d.ts.map +1 -0
  352. package/lib/drivers/shared/acp-session.js +23 -0
  353. package/lib/drivers/shared/acp-session.js.map +1 -0
  354. package/lib/drivers/shared/acp-transport.d.ts +40 -0
  355. package/lib/drivers/shared/acp-transport.d.ts.map +1 -0
  356. package/lib/drivers/shared/acp-transport.js +152 -0
  357. package/lib/drivers/shared/acp-transport.js.map +1 -0
  358. package/lib/drivers/shared/artifacts.d.ts.map +1 -1
  359. package/lib/drivers/shared/artifacts.js +3 -2
  360. package/lib/drivers/shared/artifacts.js.map +1 -1
  361. package/lib/drivers/shared/experiment-behavior.d.ts +13 -0
  362. package/lib/drivers/shared/experiment-behavior.d.ts.map +1 -0
  363. package/lib/drivers/shared/experiment-behavior.js +197 -0
  364. package/lib/drivers/shared/experiment-behavior.js.map +1 -0
  365. package/lib/drivers/shared/experiment-policy.d.ts +4 -0
  366. package/lib/drivers/shared/experiment-policy.d.ts.map +1 -0
  367. package/lib/drivers/shared/experiment-policy.js +143 -0
  368. package/lib/drivers/shared/experiment-policy.js.map +1 -0
  369. package/lib/drivers/subprocess/index.d.ts +39 -4
  370. package/lib/drivers/subprocess/index.d.ts.map +1 -1
  371. package/lib/drivers/subprocess/index.js +56 -12
  372. package/lib/drivers/subprocess/index.js.map +1 -1
  373. package/lib/index.d.ts +22 -8
  374. package/lib/index.d.ts.map +1 -1
  375. package/lib/index.js +20 -6
  376. package/lib/index.js.map +1 -1
  377. package/lib/optimization/reflective.d.ts +3 -1
  378. package/lib/optimization/reflective.d.ts.map +1 -1
  379. package/lib/optimization/reflective.js +3 -2
  380. package/lib/optimization/reflective.js.map +1 -1
  381. package/lib/orchestrator/annotation-loader.d.ts +6 -2
  382. package/lib/orchestrator/annotation-loader.d.ts.map +1 -1
  383. package/lib/orchestrator/annotation-loader.js +8 -0
  384. package/lib/orchestrator/annotation-loader.js.map +1 -1
  385. package/lib/orchestrator/annotation-store.d.ts.map +1 -1
  386. package/lib/orchestrator/annotation-store.js +16 -2
  387. package/lib/orchestrator/annotation-store.js.map +1 -1
  388. package/lib/orchestrator/artifact-origin.d.ts +3 -0
  389. package/lib/orchestrator/artifact-origin.d.ts.map +1 -0
  390. package/lib/orchestrator/artifact-origin.js +40 -0
  391. package/lib/orchestrator/artifact-origin.js.map +1 -0
  392. package/lib/orchestrator/campaign-lifecycle.d.ts +1 -0
  393. package/lib/orchestrator/campaign-lifecycle.d.ts.map +1 -1
  394. package/lib/orchestrator/campaign-lifecycle.js +4 -1
  395. package/lib/orchestrator/campaign-lifecycle.js.map +1 -1
  396. package/lib/orchestrator/candidates.d.ts.map +1 -1
  397. package/lib/orchestrator/candidates.js +3 -2
  398. package/lib/orchestrator/candidates.js.map +1 -1
  399. package/lib/orchestrator/compare.d.ts +19 -3
  400. package/lib/orchestrator/compare.d.ts.map +1 -1
  401. package/lib/orchestrator/compare.js +32 -6
  402. package/lib/orchestrator/compare.js.map +1 -1
  403. package/lib/orchestrator/comparison-identity.d.ts.map +1 -1
  404. package/lib/orchestrator/comparison-identity.js +2 -0
  405. package/lib/orchestrator/comparison-identity.js.map +1 -1
  406. package/lib/orchestrator/config.d.ts +179 -1
  407. package/lib/orchestrator/config.d.ts.map +1 -1
  408. package/lib/orchestrator/config.js +18 -4
  409. package/lib/orchestrator/config.js.map +1 -1
  410. package/lib/orchestrator/discover.d.ts +1 -0
  411. package/lib/orchestrator/discover.d.ts.map +1 -1
  412. package/lib/orchestrator/discover.js +7 -1
  413. package/lib/orchestrator/discover.js.map +1 -1
  414. package/lib/orchestrator/doctor.d.ts +1 -0
  415. package/lib/orchestrator/doctor.d.ts.map +1 -1
  416. package/lib/orchestrator/doctor.js +121 -33
  417. package/lib/orchestrator/doctor.js.map +1 -1
  418. package/lib/orchestrator/driver-capabilities.d.ts +4 -0
  419. package/lib/orchestrator/driver-capabilities.d.ts.map +1 -0
  420. package/lib/orchestrator/driver-capabilities.js +13 -0
  421. package/lib/orchestrator/driver-capabilities.js.map +1 -0
  422. package/lib/orchestrator/driver-identity.d.ts +5 -0
  423. package/lib/orchestrator/driver-identity.d.ts.map +1 -0
  424. package/lib/orchestrator/driver-identity.js +51 -0
  425. package/lib/orchestrator/driver-identity.js.map +1 -0
  426. package/lib/orchestrator/experiment-context.d.ts +51 -3
  427. package/lib/orchestrator/experiment-context.d.ts.map +1 -1
  428. package/lib/orchestrator/experiment-context.js.map +1 -1
  429. package/lib/orchestrator/experiment-contracts.d.ts +30 -1
  430. package/lib/orchestrator/experiment-contracts.d.ts.map +1 -1
  431. package/lib/orchestrator/experiment-corpus.d.ts +2 -1
  432. package/lib/orchestrator/experiment-corpus.d.ts.map +1 -1
  433. package/lib/orchestrator/experiment-corpus.js +28 -22
  434. package/lib/orchestrator/experiment-corpus.js.map +1 -1
  435. package/lib/orchestrator/experiment-effects.d.ts +33 -0
  436. package/lib/orchestrator/experiment-effects.d.ts.map +1 -0
  437. package/lib/orchestrator/experiment-effects.js +44 -0
  438. package/lib/orchestrator/experiment-effects.js.map +1 -0
  439. package/lib/orchestrator/experiment-evaluation.d.ts.map +1 -1
  440. package/lib/orchestrator/experiment-evaluation.js +56 -5
  441. package/lib/orchestrator/experiment-evaluation.js.map +1 -1
  442. package/lib/orchestrator/experiment-identity.d.ts +3 -0
  443. package/lib/orchestrator/experiment-identity.d.ts.map +1 -1
  444. package/lib/orchestrator/experiment-identity.js +22 -33
  445. package/lib/orchestrator/experiment-identity.js.map +1 -1
  446. package/lib/orchestrator/experiment-loader.d.ts +8 -3
  447. package/lib/orchestrator/experiment-loader.d.ts.map +1 -1
  448. package/lib/orchestrator/experiment-preflight.d.ts +3 -0
  449. package/lib/orchestrator/experiment-preflight.d.ts.map +1 -0
  450. package/lib/orchestrator/experiment-preflight.js +21 -0
  451. package/lib/orchestrator/experiment-preflight.js.map +1 -0
  452. package/lib/orchestrator/experiment-report.d.ts +90 -1
  453. package/lib/orchestrator/experiment-report.d.ts.map +1 -1
  454. package/lib/orchestrator/experiment-report.js +9 -1
  455. package/lib/orchestrator/experiment-report.js.map +1 -1
  456. package/lib/orchestrator/experiment-runs.d.ts +61 -2
  457. package/lib/orchestrator/experiment-runs.d.ts.map +1 -1
  458. package/lib/orchestrator/experiment-runs.js +13 -5
  459. package/lib/orchestrator/experiment-runs.js.map +1 -1
  460. package/lib/orchestrator/experiment-runtime-identity.d.ts +0 -16
  461. package/lib/orchestrator/experiment-runtime-identity.d.ts.map +1 -1
  462. package/lib/orchestrator/experiment-runtime-identity.js +5 -220
  463. package/lib/orchestrator/experiment-runtime-identity.js.map +1 -1
  464. package/lib/orchestrator/experiment-selection.d.ts.map +1 -1
  465. package/lib/orchestrator/experiment-selection.js +52 -0
  466. package/lib/orchestrator/experiment-selection.js.map +1 -1
  467. package/lib/orchestrator/experiment.d.ts +3 -3
  468. package/lib/orchestrator/experiment.d.ts.map +1 -1
  469. package/lib/orchestrator/experiment.js +26 -21
  470. package/lib/orchestrator/experiment.js.map +1 -1
  471. package/lib/orchestrator/fixture-identity.d.ts +1 -0
  472. package/lib/orchestrator/fixture-identity.d.ts.map +1 -1
  473. package/lib/orchestrator/fixture-identity.js +6 -1
  474. package/lib/orchestrator/fixture-identity.js.map +1 -1
  475. package/lib/orchestrator/fs-read.d.ts +1 -6
  476. package/lib/orchestrator/fs-read.d.ts.map +1 -1
  477. package/lib/orchestrator/fs-read.js +2 -32
  478. package/lib/orchestrator/fs-read.js.map +1 -1
  479. package/lib/orchestrator/grader-experiment.d.ts +33 -3
  480. package/lib/orchestrator/grader-experiment.d.ts.map +1 -1
  481. package/lib/orchestrator/grader-experiment.js +54 -9
  482. package/lib/orchestrator/grader-experiment.js.map +1 -1
  483. package/lib/orchestrator/grading.d.ts +2 -1
  484. package/lib/orchestrator/grading.d.ts.map +1 -1
  485. package/lib/orchestrator/grading.js +46 -31
  486. package/lib/orchestrator/grading.js.map +1 -1
  487. package/lib/orchestrator/harness-catalog-drift.d.ts +22 -0
  488. package/lib/orchestrator/harness-catalog-drift.d.ts.map +1 -0
  489. package/lib/orchestrator/harness-catalog-drift.js +90 -0
  490. package/lib/orchestrator/harness-catalog-drift.js.map +1 -0
  491. package/lib/orchestrator/harness-registry.d.ts +4 -0
  492. package/lib/orchestrator/harness-registry.d.ts.map +1 -0
  493. package/lib/orchestrator/harness-registry.js +5 -0
  494. package/lib/orchestrator/harness-registry.js.map +1 -0
  495. package/lib/orchestrator/index.d.ts +1 -1
  496. package/lib/orchestrator/index.d.ts.map +1 -1
  497. package/lib/orchestrator/index.js +1 -1
  498. package/lib/orchestrator/index.js.map +1 -1
  499. package/lib/orchestrator/list-runs.d.ts +8 -1
  500. package/lib/orchestrator/list-runs.d.ts.map +1 -1
  501. package/lib/orchestrator/list-runs.js +81 -14
  502. package/lib/orchestrator/list-runs.js.map +1 -1
  503. package/lib/orchestrator/optimization-lifecycle.d.ts.map +1 -1
  504. package/lib/orchestrator/optimization-lifecycle.js +3 -1
  505. package/lib/orchestrator/optimization-lifecycle.js.map +1 -1
  506. package/lib/orchestrator/orchestrator.d.ts +18 -2
  507. package/lib/orchestrator/orchestrator.d.ts.map +1 -1
  508. package/lib/orchestrator/orchestrator.js +50 -168
  509. package/lib/orchestrator/orchestrator.js.map +1 -1
  510. package/lib/orchestrator/paired-effects.d.ts +34 -0
  511. package/lib/orchestrator/paired-effects.d.ts.map +1 -0
  512. package/lib/orchestrator/paired-effects.js +158 -0
  513. package/lib/orchestrator/paired-effects.js.map +1 -0
  514. package/lib/orchestrator/provenance.d.ts +5 -1
  515. package/lib/orchestrator/provenance.d.ts.map +1 -1
  516. package/lib/orchestrator/provenance.js +16 -3
  517. package/lib/orchestrator/provenance.js.map +1 -1
  518. package/lib/orchestrator/regrade.d.ts +9 -1
  519. package/lib/orchestrator/regrade.d.ts.map +1 -1
  520. package/lib/orchestrator/rubric-loader.js +1 -1
  521. package/lib/orchestrator/rubric-loader.js.map +1 -1
  522. package/lib/orchestrator/run-dir.d.ts +2 -0
  523. package/lib/orchestrator/run-dir.d.ts.map +1 -1
  524. package/lib/orchestrator/run-dir.js +1 -1
  525. package/lib/orchestrator/run-dir.js.map +1 -1
  526. package/lib/orchestrator/run-execution.d.ts +3 -0
  527. package/lib/orchestrator/run-execution.d.ts.map +1 -1
  528. package/lib/orchestrator/run-execution.js +66 -12
  529. package/lib/orchestrator/run-execution.js.map +1 -1
  530. package/lib/orchestrator/run-lifecycle.d.ts +1 -0
  531. package/lib/orchestrator/run-lifecycle.d.ts.map +1 -1
  532. package/lib/orchestrator/run-lifecycle.js +3 -2
  533. package/lib/orchestrator/run-lifecycle.js.map +1 -1
  534. package/lib/orchestrator/run-workspace.d.ts +10 -0
  535. package/lib/orchestrator/run-workspace.d.ts.map +1 -0
  536. package/lib/orchestrator/run-workspace.js +58 -0
  537. package/lib/orchestrator/run-workspace.js.map +1 -0
  538. package/lib/orchestrator/suite-compare.d.ts +37 -0
  539. package/lib/orchestrator/suite-compare.d.ts.map +1 -1
  540. package/lib/orchestrator/suite-compare.js +27 -17
  541. package/lib/orchestrator/suite-compare.js.map +1 -1
  542. package/lib/orchestrator/suite-runs.d.ts +6 -1
  543. package/lib/orchestrator/suite-runs.d.ts.map +1 -1
  544. package/lib/orchestrator/suite-runs.js +14 -2
  545. package/lib/orchestrator/suite-runs.js.map +1 -1
  546. package/lib/orchestrator/suite-summary.d.ts +77 -0
  547. package/lib/orchestrator/suite-summary.d.ts.map +1 -1
  548. package/lib/orchestrator/suite-summary.js +61 -12
  549. package/lib/orchestrator/suite-summary.js.map +1 -1
  550. package/lib/previewer/artifacts.d.ts +25 -0
  551. package/lib/previewer/artifacts.d.ts.map +1 -0
  552. package/lib/previewer/artifacts.js +180 -0
  553. package/lib/previewer/artifacts.js.map +1 -0
  554. package/lib/previewer/server.d.ts +111 -0
  555. package/lib/previewer/server.d.ts.map +1 -0
  556. package/lib/previewer/server.js +558 -0
  557. package/lib/previewer/server.js.map +1 -0
  558. package/package.json +3 -3
  559. package/skills/lux-answerer/SKILL.md +2 -2
  560. package/src/answerers/claude-code/index.ts +6 -5
  561. package/src/answerers/persona/index.ts +75 -34
  562. package/src/answerers/terminal/index.ts +8 -12
  563. package/src/assertions/authoring.ts +2 -0
  564. package/src/assertions/core/command-exits-zero.ts +61 -7
  565. package/src/assertions/core/event-checks.ts +64 -3
  566. package/src/assertions/core/helpers.ts +3 -6
  567. package/src/assertions/core/index.ts +2 -0
  568. package/src/assertions/core/resource-checks.ts +38 -5
  569. package/src/assertions/rubric/index.ts +68 -13
  570. package/src/assertions/rubric/internal.ts +227 -27
  571. package/src/authoring.ts +345 -2
  572. package/src/cli/bin.ts +2 -12
  573. package/src/cli/command-runtime.ts +20 -9
  574. package/src/cli/doctor.ts +17 -0
  575. package/src/cli/harness-plan.ts +117 -0
  576. package/src/cli/init-templates.ts +238 -0
  577. package/src/cli/init.ts +53 -184
  578. package/src/cli/output-schemas.ts +106 -0
  579. package/src/cli/program.ts +691 -721
  580. package/src/cli/render/reporter.ts +50 -8
  581. package/src/cli/run-options.ts +132 -25
  582. package/src/cli/view.ts +129 -0
  583. package/src/container/driver.ts +211 -0
  584. package/src/container/protocol.ts +48 -0
  585. package/src/container/resources.ts +153 -0
  586. package/src/container/worker.ts +107 -0
  587. package/src/core/action-events.ts +59 -0
  588. package/src/core/agent-activity.ts +236 -0
  589. package/src/core/agent-environment.ts +64 -0
  590. package/src/core/agent-events.ts +17 -0
  591. package/src/core/annotation.ts +2 -1
  592. package/src/core/answerer.ts +9 -0
  593. package/src/core/artifact-evidence.ts +47 -4
  594. package/src/core/assertion.ts +21 -1
  595. package/src/core/case.ts +21 -3
  596. package/src/core/command-verification.ts +74 -0
  597. package/src/core/driver-execution.ts +84 -0
  598. package/src/core/driver-metrics.ts +51 -0
  599. package/src/core/driver.ts +76 -0
  600. package/src/core/duration.ts +52 -0
  601. package/src/core/environment.ts +22 -0
  602. package/src/core/evaluation-clusters.ts +35 -0
  603. package/src/core/events.ts +14 -2
  604. package/src/core/experiment.ts +64 -24
  605. package/src/core/file-tree.ts +35 -0
  606. package/src/core/global-id.ts +26 -0
  607. package/src/core/harness-catalog.ts +100 -0
  608. package/src/core/harness-catalogs/antigravity.ts +24 -0
  609. package/src/core/harness-catalogs/claude-code.ts +25 -0
  610. package/src/core/harness-catalogs/codex.ts +27 -0
  611. package/src/core/harness-catalogs/copilot.ts +46 -0
  612. package/src/core/harness-catalogs/cursor.ts +13 -0
  613. package/src/core/harness-catalogs/grok-build.ts +19 -0
  614. package/src/core/harness-catalogs/index.ts +31 -0
  615. package/src/core/harness-matrix.ts +316 -0
  616. package/src/core/index.ts +12 -0
  617. package/src/core/lifecycle-fixtures.ts +4 -2
  618. package/src/core/model-cli.ts +52 -23
  619. package/src/core/platform-process.ts +58 -10
  620. package/src/core/run.ts +31 -0
  621. package/src/core/usage.ts +8 -0
  622. package/src/core/wire.ts +5 -1
  623. package/src/drivers/antigravity/README.md +171 -0
  624. package/src/drivers/antigravity/artifacts.ts +37 -0
  625. package/src/drivers/antigravity/config.ts +92 -0
  626. package/src/drivers/antigravity/events.ts +290 -0
  627. package/src/drivers/antigravity/index.ts +132 -0
  628. package/src/drivers/antigravity/runtime.ts +94 -0
  629. package/src/drivers/claude-code/deferred-process.ts +118 -0
  630. package/src/drivers/claude-code/index.ts +216 -281
  631. package/src/drivers/claude-code/isolation.ts +228 -0
  632. package/src/drivers/claude-code/parse-events.ts +98 -12
  633. package/src/drivers/codex/app-events.ts +126 -16
  634. package/src/drivers/codex/config.ts +50 -8
  635. package/src/drivers/codex/exec-events.ts +258 -0
  636. package/src/drivers/codex/index.ts +144 -312
  637. package/src/drivers/copilot/README.md +60 -0
  638. package/src/drivers/copilot/config.ts +61 -0
  639. package/src/drivers/copilot/index.ts +310 -0
  640. package/src/drivers/cursor/README.md +66 -0
  641. package/src/drivers/cursor/config.ts +31 -0
  642. package/src/drivers/cursor/index.ts +326 -0
  643. package/src/drivers/cursor/interaction.ts +74 -0
  644. package/src/drivers/grok-build/README.md +112 -0
  645. package/src/drivers/grok-build/config.ts +43 -0
  646. package/src/drivers/grok-build/index.ts +331 -0
  647. package/src/drivers/mcp/index.ts +25 -11
  648. package/src/drivers/shared/acp-events.ts +94 -0
  649. package/src/drivers/shared/acp-interaction.ts +27 -0
  650. package/src/drivers/shared/acp-session.ts +40 -0
  651. package/src/drivers/shared/acp-transport.ts +187 -0
  652. package/src/drivers/shared/artifacts.ts +6 -2
  653. package/src/drivers/shared/experiment-behavior.ts +214 -0
  654. package/src/drivers/shared/experiment-policy.ts +195 -0
  655. package/src/drivers/subprocess/index.ts +55 -12
  656. package/src/index.ts +115 -10
  657. package/src/optimization/reflective.ts +3 -2
  658. package/src/orchestrator/annotation-loader.ts +10 -0
  659. package/src/orchestrator/annotation-store.ts +24 -3
  660. package/src/orchestrator/artifact-origin.ts +50 -0
  661. package/src/orchestrator/campaign-lifecycle.ts +5 -1
  662. package/src/orchestrator/candidates.ts +3 -2
  663. package/src/orchestrator/compare.ts +41 -6
  664. package/src/orchestrator/comparison-identity.ts +2 -0
  665. package/src/orchestrator/config.ts +20 -3
  666. package/src/orchestrator/discover.ts +8 -1
  667. package/src/orchestrator/doctor.ts +189 -28
  668. package/src/orchestrator/driver-capabilities.ts +21 -0
  669. package/src/orchestrator/driver-identity.ts +69 -0
  670. package/src/orchestrator/experiment-context.ts +3 -2
  671. package/src/orchestrator/experiment-corpus.ts +53 -37
  672. package/src/orchestrator/experiment-effects.ts +61 -0
  673. package/src/orchestrator/experiment-evaluation.ts +71 -10
  674. package/src/orchestrator/experiment-identity.ts +42 -48
  675. package/src/orchestrator/experiment-preflight.ts +27 -0
  676. package/src/orchestrator/experiment-report.ts +21 -1
  677. package/src/orchestrator/experiment-runs.ts +11 -4
  678. package/src/orchestrator/experiment-runtime-identity.ts +5 -243
  679. package/src/orchestrator/experiment-selection.ts +77 -0
  680. package/src/orchestrator/experiment.ts +29 -29
  681. package/src/orchestrator/fixture-identity.ts +9 -1
  682. package/src/orchestrator/fs-read.ts +2 -32
  683. package/src/orchestrator/grader-experiment.ts +74 -13
  684. package/src/orchestrator/grading.ts +67 -28
  685. package/src/orchestrator/harness-catalog-drift.ts +132 -0
  686. package/src/orchestrator/harness-registry.ts +12 -0
  687. package/src/orchestrator/index.ts +1 -0
  688. package/src/orchestrator/list-runs.ts +98 -13
  689. package/src/orchestrator/optimization-lifecycle.ts +4 -1
  690. package/src/orchestrator/orchestrator.ts +92 -216
  691. package/src/orchestrator/paired-effects.ts +209 -0
  692. package/src/orchestrator/provenance.ts +23 -3
  693. package/src/orchestrator/rubric-loader.ts +1 -1
  694. package/src/orchestrator/run-dir.ts +8 -1
  695. package/src/orchestrator/run-execution.ts +77 -11
  696. package/src/orchestrator/run-lifecycle.ts +4 -2
  697. package/src/orchestrator/run-workspace.ts +62 -0
  698. package/src/orchestrator/suite-compare.ts +29 -19
  699. package/src/orchestrator/suite-runs.ts +13 -2
  700. package/src/orchestrator/suite-summary.ts +122 -13
  701. package/src/previewer/artifacts.ts +221 -0
  702. package/src/previewer/server.ts +787 -0
  703. package/viewer/app.css +2079 -0
  704. package/viewer/app.js +627 -0
  705. package/viewer/artifact-view.js +48 -0
  706. package/viewer/charts.js +86 -0
  707. package/viewer/detail.js +1237 -0
  708. package/viewer/format.js +129 -0
  709. package/viewer/index.html +151 -0
  710. package/lib/answerers/scripted/index.d.ts +0 -8
  711. package/lib/answerers/scripted/index.d.ts.map +0 -1
  712. package/lib/answerers/scripted/index.js +0 -163
  713. package/lib/answerers/scripted/index.js.map +0 -1
  714. package/lib/cli/skills.d.ts +0 -38
  715. package/lib/cli/skills.d.ts.map +0 -1
  716. package/lib/cli/skills.js +0 -84
  717. package/lib/cli/skills.js.map +0 -1
  718. package/lib/drivers/shared/secure-copy.d.ts.map +0 -1
  719. package/lib/drivers/shared/secure-copy.js.map +0 -1
  720. package/skills/lux/SKILL.md +0 -85
  721. package/skills/lux/references/cli.md +0 -102
  722. package/skills/lux/references/eval-authoring.md +0 -105
  723. package/src/answerers/scripted/index.ts +0 -186
  724. package/src/cli/skills.ts +0 -129
  725. /package/lib/{drivers/shared → core}/secure-copy.d.ts +0 -0
  726. /package/lib/{drivers/shared → core}/secure-copy.js +0 -0
  727. /package/src/{drivers/shared → core}/secure-copy.ts +0 -0
@@ -1,12 +1,17 @@
1
- import { cp, mkdir, readdir, realpath, rm, writeFile } from "node:fs/promises";
2
- import { homedir } from "node:os";
3
- import { dirname, join, resolve, sep } from "node:path";
1
+ import { cp, mkdir, realpath, rm, writeFile } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
4
3
  import { temporaryDirectory } from "tempy";
5
4
  import { z } from "zod";
6
- import { DEFAULT_CLAUDE_MODEL, discoverCliVersion, exec, TypedEmitter, } from "../../core/index.js";
5
+ import { agentEnvironment, InheritEnvironmentSchema } from "../../core/agent-environment.js";
6
+ import { DurationSchema, durationMs } from "../../core/duration.js";
7
+ import { applyCatalogEffort, claudeCodeCatalog, DEFAULT_CLAUDE_MODEL, defineDriver, discoverCliVersion, selectModelAndReasoningEffort, TypedEmitter, } from "../../core/index.js";
8
+ import { copyRegularFileNoFollow } from "../../core/secure-copy.js";
7
9
  import { walkArtifacts } from "../shared/artifacts.js";
8
- import { copyRegularFileNoFollow } from "../shared/secure-copy.js";
10
+ import { claudeConfigRoot, claudeUserBehaviorHash, configuredClaudeSourceHashes, } from "../shared/experiment-behavior.js";
11
+ import { prepareClaudeExperimentConfig } from "../shared/experiment-policy.js";
9
12
  import { subprocessDriver } from "../subprocess/index.js";
13
+ import { runDeferredProcess } from "./deferred-process.js";
14
+ import { isolatedLaunch } from "./isolation.js";
10
15
  import { ClaudeCodeLineSchema, makeParseEvent } from "./parse-events.js";
11
16
  const LUX_BOOKKEEPING_FILES = new Set([
12
17
  "events.jsonl",
@@ -19,12 +24,23 @@ const LUX_BOOKKEEPING_FILES = new Set([
19
24
  const commandName = (command) => command.split(/[\\/]/).at(-1) ?? command;
20
25
  const ISOLATION_RESERVED_ARGS = new Set([
21
26
  "--add-dir",
27
+ "--dangerously-skip-permissions",
28
+ "--allow-dangerously-skip-permissions",
29
+ "--permission-mode",
30
+ "--teleport",
31
+ "--continue",
32
+ "-c",
33
+ "--resume",
34
+ "-r",
35
+ "--fork-session",
36
+ "--session-id",
22
37
  "--agent",
23
38
  "--agents",
24
39
  "--bare",
25
40
  "--mcp-config",
26
41
  "--no-session-persistence",
27
42
  "--plugin-dir",
43
+ "--plugin-dir-no-mcp",
28
44
  "--plugin-url",
29
45
  "--safe-mode",
30
46
  "--setting-sources",
@@ -39,6 +55,8 @@ const IsolationSchema = z
39
55
  * and `addDirs` paths are included automatically.
40
56
  */
41
57
  allowRead: z.array(z.string()).default([]),
58
+ /** Additional protected trees and files, including other evaluation runs. */
59
+ denyRead: z.array(z.string()).optional(),
42
60
  })
43
61
  .strict();
44
62
  export const ClaudeCodeDriverConfigSchema = z
@@ -50,15 +68,15 @@ export const ClaudeCodeDriverConfigSchema = z
50
68
  cwdMode: z.enum(["artifacts", "runDir"]).default("artifacts"),
51
69
  cwd: z.string().optional(),
52
70
  env: z.record(z.string(), z.string()).optional(),
71
+ inheritEnv: InheritEnvironmentSchema.default(true),
53
72
  /** Low-cost by default; choose a larger model explicitly when needed. */
54
73
  model: z.string().min(1).default(DEFAULT_CLAUDE_MODEL),
55
- /** Claude effort level; low by default to control eval cost. */
56
- effort: z.enum(["low", "medium", "high", "max"]).default("low"),
74
+ reasoningEffort: z.enum(claudeCodeCatalog.efforts).optional(),
57
75
  /** Permission mode passed to claude. */
58
76
  permissionMode: z
59
77
  .enum(["acceptEdits", "auto", "bypassPermissions", "default", "dontAsk", "manual", "plan"])
60
78
  .optional(),
61
- /** Additional tools pre-approved beyond Lux's minimal coding and ask tools. */
79
+ /** Additional pre-approvals; auto mode omits the baseline coding-tool grants. */
62
80
  allowedTools: z.array(z.string().min(1)).optional(),
63
81
  /** Plugin directories to load (`--plugin-dir`): skills, subagents, commands, hooks. */
64
82
  pluginDirs: z.array(z.string()).optional(),
@@ -83,15 +101,32 @@ export const ClaudeCodeDriverConfigSchema = z
83
101
  * when a weaker model asks in text instead of calling `askToolName`.
84
102
  */
85
103
  textQuestionFallback: z.boolean().default(false),
86
- /** Per-event idle timeout. */
87
- idleTimeoutMs: z.number().positive().default(600_000),
104
+ /** Maximum silence between recognized protocol events; excludes answerer wait time. */
105
+ idleTimeout: DurationSchema.default("10 minutes"),
106
+ /** Optional elapsed-time cap per defer-resume CLI invocation, regardless of activity. */
107
+ turnTimeout: DurationSchema.optional(),
88
108
  /** Cap on outstanding interrupts before the driver aborts. */
89
109
  maxInterrupts: z.number().positive().default(20),
90
110
  })
91
111
  .strict()
92
112
  .superRefine((config, ctx) => {
113
+ if (config.turnTimeout !== undefined && config.interactionMode !== "defer-resume") {
114
+ ctx.addIssue({
115
+ code: "custom",
116
+ path: ["turnTimeout"],
117
+ message: "turnTimeout requires defer-resume mode",
118
+ });
119
+ }
93
120
  if (config.interactionMode === "defer-resume") {
94
- const reserved = config.extraArgs?.find((arg) => ["--input-format", "--no-session-persistence", "--resume", "-r", "--settings"].some((name) => arg === name || arg.startsWith(`${name}=`)));
121
+ const reserved = config.extraArgs?.find((arg) => [
122
+ "--input-format",
123
+ "--no-session-persistence",
124
+ "--resume",
125
+ "-r",
126
+ "--settings",
127
+ "--permission-prompt-tool",
128
+ "--permission-prompts",
129
+ ].some((name) => arg === name || arg.startsWith(`${name}=`)));
95
130
  if (reserved) {
96
131
  ctx.addIssue({
97
132
  code: "custom",
@@ -109,11 +144,11 @@ export const ClaudeCodeDriverConfigSchema = z
109
144
  message: "isolation requires permissionMode to be omitted or 'default'; Claude Code forces default mode while subprocess environment scrubbing is enabled",
110
145
  });
111
146
  }
112
- if (config.interactionMode === "defer-resume") {
147
+ if (config.interactionMode === "defer-resume" && config.pluginDirs?.length) {
113
148
  ctx.addIssue({
114
149
  code: "custom",
115
- path: ["interactionMode"],
116
- message: "defer-resume requires session persistence and is incompatible with isolation",
150
+ path: ["pluginDirs"],
151
+ message: "isolated defer-resume cannot load plugin hooks; use addDirs for read-only skill files",
117
152
  });
118
153
  }
119
154
  if (config.cwd || config.cwdMode !== "artifacts") {
@@ -131,7 +166,8 @@ export const ClaudeCodeDriverConfigSchema = z
131
166
  message: `isolation owns ${reserved}; configure isolation instead`,
132
167
  });
133
168
  }
134
- });
169
+ })
170
+ .transform(applyCatalogEffort(claudeCodeCatalog));
135
171
  const buildArgs = (config) => {
136
172
  const out = [
137
173
  "--print",
@@ -141,7 +177,7 @@ const buildArgs = (config) => {
141
177
  "stream-json",
142
178
  "--verbose",
143
179
  ];
144
- out.push("--model", config.model, "--effort", config.effort);
180
+ out.push("--model", config.model, ...effortArgs(config));
145
181
  if (config.permissionMode)
146
182
  out.push("--permission-mode", config.permissionMode);
147
183
  out.push("--allowed-tools", ...allowedTools(config));
@@ -171,12 +207,26 @@ const deferredHookSettings = (config, hookPath) => ({
171
207
  ],
172
208
  },
173
209
  });
210
+ const effortArgs = (config) => config.reasoningEffort ? ["--effort", config.reasoningEffort] : [];
174
211
  const allowedTools = (config) => [
175
- ...new Set([...MINIMAL_ALLOWED_TOOLS, config.askToolName, ...(config.allowedTools ?? [])]),
212
+ ...new Set([
213
+ ...(config.permissionMode === "auto" ? [] : MINIMAL_ALLOWED_TOOLS),
214
+ config.askToolName,
215
+ ...(config.allowedTools ?? []),
216
+ ]),
176
217
  ];
177
- const buildDeferredArgs = (config, hookPath, sessionId) => {
178
- const out = ["--print", "--output-format", "stream-json", "--verbose"];
179
- out.push("--model", config.model, "--effort", config.effort);
218
+ const buildDeferredArgs = (config, hookPath, sessionId, isolation) => {
219
+ // Native print mode removes AskUserQuestion unless a host permission surface exists.
220
+ // The trusted PreToolUse hook handles the question before that surface is consulted.
221
+ const out = [
222
+ "--print",
223
+ "--output-format",
224
+ "stream-json",
225
+ "--verbose",
226
+ "--permission-prompt-tool",
227
+ "stdio",
228
+ ];
229
+ out.push("--model", config.model, ...effortArgs(config));
180
230
  if (config.permissionMode)
181
231
  out.push("--permission-mode", config.permissionMode);
182
232
  out.push("--allowed-tools", ...allowedTools(config));
@@ -184,9 +234,16 @@ const buildDeferredArgs = (config, hookPath, sessionId) => {
184
234
  out.push("--plugin-dir", dir);
185
235
  if (config.agent)
186
236
  out.push("--agent", config.agent);
187
- for (const dir of config.addDirs ?? [])
188
- out.push("--add-dir", dir);
189
- out.push("--settings", JSON.stringify(deferredHookSettings(config, hookPath)));
237
+ if (!isolation)
238
+ for (const dir of config.addDirs ?? [])
239
+ out.push("--add-dir", dir);
240
+ out.push("--settings", JSON.stringify({
241
+ ...isolation?.settings,
242
+ ...deferredHookSettings(config, hookPath),
243
+ ...(isolation ? { disableAllHooks: false } : {}),
244
+ }));
245
+ if (isolation)
246
+ out.push("--strict-mcp-config", "--setting-sources", "");
190
247
  if (sessionId)
191
248
  out.push("--resume", sessionId);
192
249
  if (config.extraArgs)
@@ -242,163 +299,6 @@ process.stdin.on("end", () => {
242
299
  }));
243
300
  });
244
301
  `;
245
- const isWithin = (parent, child) => child === parent || child.startsWith(`${parent}${sep}`);
246
- const permissionPath = (tool, path, directory) => {
247
- const absolute = resolve(path).replaceAll("\\", "/");
248
- return `${tool}(//${absolute.replace(/^\/+/, "")}${directory ? "/**" : ""})`;
249
- };
250
- /**
251
- * Permission rules have no "allow inside deny" override, so isolate a root by
252
- * denying every sibling around explicitly allowed descendants.
253
- */
254
- const carvedPermissionDenials = async (tool, root, allowed) => {
255
- const normalizedRoot = resolve(root);
256
- const inside = allowed
257
- .map((path) => resolve(path))
258
- .filter((path) => isWithin(normalizedRoot, path));
259
- if (inside.some((path) => path === normalizedRoot))
260
- return [];
261
- if (inside.length === 0)
262
- return [permissionPath(tool, normalizedRoot, true)];
263
- const out = [];
264
- const walk = async (dir) => {
265
- const entries = await readdir(dir, { withFileTypes: true });
266
- entries.sort((a, b) => a.name.localeCompare(b.name));
267
- for (const entry of entries) {
268
- const path = join(dir, entry.name);
269
- if (inside.some((allowedPath) => allowedPath === path))
270
- continue;
271
- if (entry.isDirectory() && inside.some((allowedPath) => isWithin(path, allowedPath))) {
272
- await walk(path);
273
- }
274
- else {
275
- out.push(permissionPath(tool, path, entry.isDirectory()));
276
- }
277
- }
278
- };
279
- await walk(normalizedRoot);
280
- return out;
281
- };
282
- const carvedReadDenials = (root, allowed) => carvedPermissionDenials("Read", root, allowed);
283
- const existingRealpaths = async (paths) => {
284
- const found = await Promise.all(paths.map(async (path) => {
285
- try {
286
- return await realpath(resolve(path));
287
- }
288
- catch {
289
- return null;
290
- }
291
- }));
292
- return [...new Set(found.filter((path) => path !== null))];
293
- };
294
- const compactRoots = (paths) => [...new Set(paths)]
295
- .sort((a, b) => a.length - b.length || a.localeCompare(b))
296
- .filter((path, index, roots) => !roots.slice(0, index).some((root) => isWithin(root, path)));
297
- const isolatedLaunch = async (config, ctx, workspace) => {
298
- const homeRoots = await existingRealpaths([
299
- homedir(),
300
- ...(config.env?.HOME ? [config.env.HOME] : []),
301
- ]);
302
- const sensitiveHomePaths = homeRoots.flatMap((home) => [
303
- join(home, ".aws"),
304
- join(home, ".config", "gcloud"),
305
- join(home, ".docker", "config.json"),
306
- join(home, ".git-credentials"),
307
- join(home, ".gnupg"),
308
- join(home, ".kube"),
309
- join(home, ".netrc"),
310
- join(home, ".npmrc"),
311
- join(home, ".ssh"),
312
- ]);
313
- const protectedRoots = await existingRealpaths([
314
- ...(ctx.runsRoot ? [ctx.runsRoot] : [ctx.runDir]),
315
- ...(process.env.CLAUDE_CONFIG_DIR ? [process.env.CLAUDE_CONFIG_DIR] : []),
316
- ...(config.env?.CLAUDE_CONFIG_DIR ? [config.env.CLAUDE_CONFIG_DIR] : []),
317
- ...sensitiveHomePaths,
318
- ...homeRoots.flatMap((home) => [
319
- join(home, ".claude", "projects"),
320
- join(home, ".claude", "memory"),
321
- ]),
322
- ]);
323
- const denyRoots = compactRoots(protectedRoots);
324
- const allowed = compactRoots(await existingRealpaths([
325
- ...(config.pluginDirs ?? []),
326
- ...(config.addDirs ?? []),
327
- ...(config.isolation?.allowRead ?? []),
328
- ]));
329
- const overlapping = allowed.find((path) => (path !== workspace && isWithin(path, workspace)) ||
330
- denyRoots.some((root) => isWithin(path, root)) ||
331
- protectedRoots.some((root) => isWithin(root, path)));
332
- if (overlapping) {
333
- throw new Error(`isolation read carve-out overlaps a protected boundary: ${overlapping}`);
334
- }
335
- const readOnlyRoots = allowed.filter((path) => !isWithin(workspace, path));
336
- const editDenyRoots = compactRoots([...denyRoots, ...readOnlyRoots]);
337
- const [readDenials, writeDenials] = await Promise.all([
338
- Promise.all(denyRoots.map((root) => carvedPermissionDenials("Read", root, allowed))),
339
- Promise.all(editDenyRoots.map((root) => carvedPermissionDenials("Edit", root, []))),
340
- ]);
341
- const denyRules = [...readDenials.flat(), ...writeDenials.flat()];
342
- const sandboxSettings = {
343
- disableAllHooks: true,
344
- permissions: { deny: denyRules },
345
- sandbox: {
346
- enabled: true,
347
- failIfUnavailable: true,
348
- allowUnsandboxedCommands: false,
349
- filesystem: {
350
- denyRead: denyRoots,
351
- denyWrite: denyRoots,
352
- allowRead: allowed,
353
- },
354
- // Filesystem isolation does not disable the live docs and package
355
- // registry access that cases are intended to exercise.
356
- network: { allowedDomains: ["*"] },
357
- },
358
- };
359
- const stateDir = join(workspace, ".lux-claude");
360
- const tmpDir = join(stateDir, "tmp");
361
- const cacheDir = join(stateDir, "cache");
362
- const pluginCacheDir = join(stateDir, "plugins");
363
- await Promise.all([
364
- mkdir(tmpDir, { recursive: true }),
365
- mkdir(cacheDir, { recursive: true }),
366
- mkdir(pluginCacheDir, { recursive: true }),
367
- ]);
368
- return {
369
- args: [
370
- // --add-dir also discovers skills and agents. Isolation treats addDirs
371
- // as data-only read grants, so expose them through the filesystem policy
372
- // above without passing the discovery flag to Claude.
373
- ...buildArgs({ ...config, addDirs: undefined }),
374
- "--no-session-persistence",
375
- "--strict-mcp-config",
376
- // Authentication is independent of filesystem setting sources. Keep
377
- // these empty instead of using --safe-mode: safe mode would also disable
378
- // the explicitly requested plugin's skills, commands, and agents.
379
- "--setting-sources",
380
- "",
381
- "--settings",
382
- JSON.stringify(sandboxSettings),
383
- ],
384
- env: {
385
- ...(config.env ?? {}),
386
- CLAUDE_CODE_DISABLE_AUTO_MEMORY: "1",
387
- CLAUDE_CODE_DISABLE_CLAUDE_MDS: "1",
388
- CLAUDE_CODE_SKIP_PROMPT_HISTORY: "1",
389
- CLAUDE_CODE_DISABLE_BACKGROUND_TASKS: "1",
390
- CLAUDE_CODE_SUBPROCESS_ENV_SCRUB: "1",
391
- CLAUDE_CODE_AUTO_CONNECT_IDE: "false",
392
- CLAUDE_CODE_PLUGIN_CACHE_DIR: pluginCacheDir,
393
- CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL: "1",
394
- DISABLE_AUTOUPDATER: "1",
395
- TMPDIR: tmpDir,
396
- XDG_CACHE_HOME: cacheDir,
397
- npm_config_cache: join(cacheDir, "npm"),
398
- BUN_INSTALL_CACHE_DIR: join(cacheDir, "bun"),
399
- },
400
- };
401
- };
402
302
  const formatPrompt = (text) => `${JSON.stringify({
403
303
  type: "user",
404
304
  message: { role: "user", content: [{ type: "text", text }] },
@@ -426,15 +326,15 @@ const formatAnswer = (answer) => {
426
326
  class ClaudeCodeDriverImpl {
427
327
  inner = null;
428
328
  emitter = new TypedEmitter();
429
- // The attach closure captures its (event, handler) pair with narrow types,
430
- // so the queue stays type-safe without per-entry casts; the identity pair
431
- // rides along so off() can drop a queued attach symmetrically.
329
+ // Typed closures retain handler identity so off() can detach queued listeners.
432
330
  pendingAttach = [];
433
331
  config;
434
332
  collectDir = null;
435
333
  artifactsDir = null;
436
334
  runDir = null;
437
335
  isolatedWorkspace = null;
336
+ isolationControlDir = null;
337
+ deferredIsolation;
438
338
  deferredContext = null;
439
339
  deferredCwd = null;
440
340
  deferredHookPath = null;
@@ -448,6 +348,7 @@ class ClaudeCodeDriverImpl {
448
348
  deferredInterrupts = 0;
449
349
  deferredTerminal = false;
450
350
  deferredTurn = null;
351
+ deferredAbort = new AbortController();
451
352
  constructor(config) {
452
353
  this.config = config;
453
354
  }
@@ -479,15 +380,20 @@ class ClaudeCodeDriverImpl {
479
380
  }
480
381
  let cwd = this.config.cwd ?? (this.config.cwdMode === "artifacts" ? ctx.artifactsDir : ctx.runDir);
481
382
  let args = buildArgs(this.config);
482
- let env = this.config.env;
383
+ let env = agentEnvironment(process.env, this.config.inheritEnv, this.config.env);
483
384
  if (this.config.isolation) {
484
- const workspace = await realpath(temporaryDirectory({ prefix: "lux-claude-workspace-" }));
485
- await cp(ctx.artifactsDir, workspace, { recursive: true });
486
- this.isolatedWorkspace = workspace;
487
- cwd = workspace;
488
- const launch = await isolatedLaunch(this.config, ctx, workspace);
489
- args = launch.args;
490
- env = launch.env;
385
+ const launch = await this.prepareIsolation(ctx);
386
+ cwd = this.isolatedWorkspace;
387
+ args = [
388
+ ...buildArgs({ ...this.config, addDirs: undefined }),
389
+ "--no-session-persistence",
390
+ "--strict-mcp-config",
391
+ "--setting-sources",
392
+ "",
393
+ "--settings",
394
+ JSON.stringify(launch.settings),
395
+ ];
396
+ env = agentEnvironment(process.env, this.config.inheritEnv, launch.env);
491
397
  }
492
398
  this.collectDir = cwd;
493
399
  this.artifactsDir = ctx.artifactsDir;
@@ -500,11 +406,12 @@ class ClaudeCodeDriverImpl {
500
406
  args,
501
407
  cwd,
502
408
  env,
409
+ inheritEnv: false,
503
410
  protocol: "custom",
504
411
  parseEvent: makeParseEvent(this.config, cliVersion),
505
412
  formatAnswer,
506
413
  formatPrompt,
507
- idleTimeoutMs: this.config.idleTimeoutMs,
414
+ idleTimeout: this.config.idleTimeout,
508
415
  maxInterrupts: this.config.maxInterrupts,
509
416
  });
510
417
  for (const queued of this.pendingAttach)
@@ -534,10 +441,8 @@ class ClaudeCodeDriverImpl {
534
441
  async collect() {
535
442
  if (!this.collectDir)
536
443
  return [];
537
- // A terminal protocol event can arrive before the CLI and its descendants
538
- // have exited. Quiesce the whole process tree before walking/copying files
539
- // so it cannot swap a checked regular file into a symlink.
540
- await this.inner?.close();
444
+ // Stop descendants before collecting: terminal events can precede their exit.
445
+ await this.quiesce();
541
446
  const artifacts = await walkArtifacts(this.collectDir);
542
447
  if (this.isolatedWorkspace && this.artifactsDir) {
543
448
  await Promise.all(artifacts.map(async (artifact) => {
@@ -548,21 +453,23 @@ class ClaudeCodeDriverImpl {
548
453
  }));
549
454
  return artifacts;
550
455
  }
551
- // Consumers resolve artifact paths against <runDir>/artifacts by default;
552
- // a walk of any other root must say what its paths are relative to, or
553
- // the judge and file assertions silently miss every file.
456
+ // Assertions need an explicit root for artifacts collected outside artifactsDir.
554
457
  if (this.collectDir === this.artifactsDir)
555
458
  return artifacts;
556
459
  const root = this.collectDir;
557
- // Walking the run dir itself would list Lux's own bookkeeping as agent
558
- // work product; only top-level files can collide with these names.
460
+ // Top-level bookkeeping in runDir is not agent work product.
559
461
  const withRoot = artifacts.map((a) => ({ ...a, root }));
560
462
  return root === this.runDir
561
463
  ? withRoot.filter((a) => !LUX_BOOKKEEPING_FILES.has(a.path))
562
464
  : withRoot;
563
465
  }
466
+ async verificationWorkspace() {
467
+ await this.quiesce();
468
+ return this.isolatedWorkspace ?? undefined;
469
+ }
564
470
  async quiesce() {
565
471
  if (this.config.interactionMode === "defer-resume") {
472
+ this.deferredAbort.abort();
566
473
  await this.deferredTurn;
567
474
  return;
568
475
  }
@@ -571,6 +478,7 @@ class ClaudeCodeDriverImpl {
571
478
  async close() {
572
479
  try {
573
480
  if (this.config.interactionMode === "defer-resume") {
481
+ await this.quiesce();
574
482
  this.emitter.removeAllListeners();
575
483
  if (this.deferredHookPath) {
576
484
  await rm(this.deferredHookPath, { force: true });
@@ -582,14 +490,25 @@ class ClaudeCodeDriverImpl {
582
490
  }
583
491
  }
584
492
  finally {
585
- if (this.isolatedWorkspace) {
586
- await rm(this.isolatedWorkspace, { recursive: true, force: true });
587
- this.isolatedWorkspace = null;
588
- }
493
+ await Promise.all([this.isolatedWorkspace, this.isolationControlDir]
494
+ .filter((path) => path !== null)
495
+ .map((path) => rm(path, { recursive: true, force: true })));
496
+ this.isolatedWorkspace = null;
497
+ this.isolationControlDir = null;
589
498
  }
590
499
  }
500
+ async prepareIsolation(ctx) {
501
+ this.isolatedWorkspace = await realpath(temporaryDirectory({ prefix: "lux-claude-workspace-" }));
502
+ this.isolationControlDir = await realpath(temporaryDirectory({ prefix: "lux-claude-control-" }));
503
+ await cp(ctx.artifactsDir, this.isolatedWorkspace, { recursive: true });
504
+ return isolatedLaunch(this.config, ctx, this.isolatedWorkspace, this.isolationControlDir);
505
+ }
591
506
  async startDeferred(ctx) {
592
- const cwd = this.config.cwd ?? (this.config.cwdMode === "artifacts" ? ctx.artifactsDir : ctx.runDir);
507
+ let cwd = this.config.cwd ?? (this.config.cwdMode === "artifacts" ? ctx.artifactsDir : ctx.runDir);
508
+ if (this.config.isolation) {
509
+ this.deferredIsolation = await this.prepareIsolation(ctx);
510
+ cwd = this.isolatedWorkspace;
511
+ }
593
512
  this.collectDir = cwd;
594
513
  this.artifactsDir = ctx.artifactsDir;
595
514
  this.runDir = ctx.runDir;
@@ -639,56 +558,45 @@ class ClaudeCodeDriverImpl {
639
558
  else if (resumeWithAnswer && answer?.kind === "ask") {
640
559
  input = { input: answer.text };
641
560
  }
642
- const result = await exec(this.config.command, buildDeferredArgs(this.config, hookPath, this.deferredSessionId ?? undefined), {
561
+ const terminal = await runDeferredProcess({
562
+ command: this.config.command,
563
+ args: buildDeferredArgs(this.config, hookPath, this.deferredSessionId ?? undefined, this.deferredIsolation),
643
564
  cwd,
644
- env: {
645
- ...process.env,
565
+ env: agentEnvironment(process.env, this.config.inheritEnv, {
566
+ ...(this.deferredIsolation?.env ?? this.config.env),
646
567
  LUX_RUN_DIR: ctx.runDir,
647
568
  LUX_ARTIFACTS_DIR: ctx.artifactsDir,
648
- ...this.config.env,
649
569
  ...(answer ? { LUX_CLAUDE_DEFERRED_ANSWER: JSON.stringify(answer) } : {}),
650
- },
570
+ }),
651
571
  ...input,
652
- timeoutMs: this.config.idleTimeoutMs,
653
- signal: ctx.abortSignal,
654
- });
655
- if (result.stderr.trim()) {
656
- for (const line of result.stderr.trimEnd().split("\n")) {
657
- process.stderr.write(`[claude-code] ${line}\n`);
658
- }
659
- }
660
- for (const line of result.stdout.split("\n")) {
661
- if (!line.trim())
662
- continue;
663
- try {
664
- const envelope = ClaudeCodeLineSchema.safeParse(JSON.parse(line));
665
- if (envelope.success &&
666
- (envelope.data.type === "system" || envelope.data.type === "result") &&
667
- envelope.data.session_id) {
668
- this.deferredSessionId = envelope.data.session_id;
572
+ idleTimeoutMs: durationMs(this.config.idleTimeout),
573
+ ...(this.config.turnTimeout === undefined
574
+ ? {}
575
+ : { turnTimeoutMs: durationMs(this.config.turnTimeout) }),
576
+ signal: AbortSignal.any([ctx.abortSignal, this.deferredAbort.signal]),
577
+ parse: (line) => {
578
+ try {
579
+ const envelope = ClaudeCodeLineSchema.safeParse(JSON.parse(line));
580
+ if (envelope.success &&
581
+ (envelope.data.type === "system" || envelope.data.type === "result") &&
582
+ envelope.data.session_id) {
583
+ this.deferredSessionId = envelope.data.session_id;
584
+ }
669
585
  }
670
- }
671
- catch {
672
- // The parser below deliberately ignores unmodeled output.
673
- }
674
- const parsed = parse(line);
675
- if (!parsed)
676
- continue;
677
- for (const event of Array.isArray(parsed) ? parsed : [parsed]) {
678
- await this.dispatchDeferred(event);
679
- }
680
- }
681
- if (result.timedOut) {
682
- throw new Error(`no event for ${this.config.idleTimeoutMs}ms`);
683
- }
684
- if (result.signal)
685
- throw new Error(`claude exited from signal ${result.signal}`);
686
- if (result.exitCode !== 0 && !this.deferredTerminal) {
687
- throw new Error(`claude exited ${result.exitCode}`);
688
- }
689
- if (!resuming && this.deferredReady) {
690
- throw new Error("claude exited before ready");
586
+ catch {
587
+ // The parser below deliberately ignores unmodeled output.
588
+ }
589
+ return parse(line);
590
+ },
591
+ onEvent: (event) => this.dispatchDeferred(event),
592
+ });
593
+ if (this.deferredReady) {
594
+ throw new Error(terminal?.tag === "error" ? terminal.error.reason : "claude exited before ready");
691
595
  }
596
+ if (terminal)
597
+ await this.dispatchDeferred(terminal);
598
+ if (!terminal)
599
+ throw new Error("claude exited before a terminal result");
692
600
  }
693
601
  async dispatchDeferred(event) {
694
602
  if (this.deferredTerminal)
@@ -769,11 +677,37 @@ class ClaudeCodeDriverImpl {
769
677
  });
770
678
  }
771
679
  }
772
- export const claudeCodeDriver = {
680
+ export const claudeCodeDriver = defineDriver({
773
681
  name: "claude-code",
774
682
  configSchema: ClaudeCodeDriverConfigSchema,
683
+ runtime: (config) => ({
684
+ commands: [config.command],
685
+ capabilities: {
686
+ interactive: true,
687
+ "tool-calls": true,
688
+ "tool-results": true,
689
+ artifacts: true,
690
+ subagents: true,
691
+ usage: true,
692
+ cost: true,
693
+ isolation: Boolean(config.isolation),
694
+ },
695
+ }),
696
+ experiment: {
697
+ version: "1",
698
+ prepare: prepareClaudeExperimentConfig,
699
+ identity: async (config, { rootDir }) => {
700
+ const configRoot = claudeConfigRoot({ config });
701
+ return {
702
+ configRoot,
703
+ userBehaviorHash: await claudeUserBehaviorHash(configRoot),
704
+ sources: await configuredClaudeSourceHashes({ name: "claude-code", config }, rootDir),
705
+ };
706
+ },
707
+ },
708
+ selectHarness: selectModelAndReasoningEffort,
775
709
  create: (config) => new ClaudeCodeDriverImpl(config),
776
- };
710
+ });
777
711
  // Internal exports for testing
778
- export { buildArgs, buildDeferredArgs, carvedReadDenials, copyRegularFileNoFollow, formatAnswer, formatPrompt, makeParseEvent, walkArtifacts, };
712
+ export { buildArgs, buildDeferredArgs, copyRegularFileNoFollow, formatAnswer, formatPrompt, makeParseEvent, walkArtifacts, };
779
713
  //# sourceMappingURL=index.js.map