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

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