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

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