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

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