@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
@@ -3,32 +3,38 @@ import { homedir } from "node:os";
3
3
  import { dirname, join } from "node:path";
4
4
  import { createInterface } from "node:readline";
5
5
  import { temporaryDirectory } from "tempy";
6
- import { z } from "zod";
6
+ import { agentEnvironment } from "../../core/agent-environment.js";
7
+ import { durationMs } from "../../core/duration.js";
7
8
  import {
8
9
  type AgentDriver,
9
10
  type Answer,
10
11
  type Artifact,
11
12
  type DriverEventMap,
12
- type DriverPlugin,
13
+ defineDriver,
13
14
  discoverCliVersion,
14
- type ParsedDriverEvent,
15
15
  type ReadyState,
16
16
  type StartContext,
17
+ selectModelAndReasoningEffort,
17
18
  spawnManagedProcess,
18
19
  type TokenUsage,
19
20
  TypedEmitter,
20
- toolResultProgress,
21
21
  } from "../../core/index.js";
22
+ import { resolveExecutable } from "../../core/platform-process.js";
23
+ import { copyRegularFileNoFollow } from "../../core/secure-copy.js";
22
24
  import { walkArtifacts } from "../shared/artifacts.js";
23
- import { copyRegularFileNoFollow } from "../shared/secure-copy.js";
25
+ import { configuredClaudeSourceHashes } from "../shared/experiment-behavior.js";
26
+ import { prepareCodexExperimentConfig } from "../shared/experiment-policy.js";
27
+ import { stageSkills } from "../shared/skills.js";
24
28
  import { subprocessDriver } from "../subprocess/index.js";
25
29
  import {
26
30
  type AppTurnFacets,
31
+ appAgentLifecycleProgress,
27
32
  appItemProgress,
28
33
  appItemToolName,
29
34
  appTurnLabel,
30
35
  appUsage,
31
36
  asRecord,
37
+ CodexSubagentTracker,
32
38
  messageOf,
33
39
  type RpcId,
34
40
  type RpcRecord,
@@ -39,266 +45,14 @@ import {
39
45
  type CodexConfigValue,
40
46
  type CodexDriverConfig,
41
47
  CodexDriverConfigSchema,
48
+ codexConfigOverrides,
42
49
  } from "./config.js";
43
50
 
51
+ import { makeParseEvent } from "./exec-events.js";
52
+
44
53
  const LUX_BOOKKEEPING_FILES = new Set(["events.jsonl", "case.json", "run.json", "grading.json"]);
45
54
  const commandName = (command: string): string => command.split(/[\\/]/).at(-1) ?? command;
46
55
 
47
- const CodexUsageSchema = z.object({
48
- input_tokens: z.number().nonnegative().catch(0),
49
- cached_input_tokens: z.number().nonnegative().catch(0),
50
- output_tokens: z.number().nonnegative().catch(0),
51
- });
52
-
53
- const parseUsage = (raw: unknown): TokenUsage | null => {
54
- const usage = CodexUsageSchema.safeParse(raw).data;
55
- if (!usage) return null;
56
- return {
57
- input: Math.max(0, usage.input_tokens - usage.cached_input_tokens),
58
- output: usage.output_tokens,
59
- cacheRead: usage.cached_input_tokens,
60
- cacheCreation: 0,
61
- };
62
- };
63
-
64
- const resultText = (content: unknown): string => {
65
- if (typeof content === "string") return content;
66
- if (!Array.isArray(content)) return "";
67
- return content
68
- .filter(
69
- (block): block is { type: "text"; text: string } =>
70
- typeof block === "object" &&
71
- block !== null &&
72
- (block as { type?: unknown }).type === "text" &&
73
- typeof (block as { text?: unknown }).text === "string",
74
- )
75
- .map((block) => block.text)
76
- .join("\n");
77
- };
78
-
79
- const startedItemProgress = (
80
- item: Record<string, unknown>,
81
- id: string,
82
- ): ParsedDriverEvent | null => {
83
- if (item.type === "command_execution") {
84
- return {
85
- tag: "progress",
86
- progress: {
87
- id: `tc-${id}`,
88
- kind: "tool-call",
89
- payload: { name: "command_execution", input: { command: item.command }, toolUseId: id },
90
- ts: Date.now(),
91
- },
92
- };
93
- }
94
- if (item.type === "mcp_tool_call") {
95
- const tool = typeof item.tool === "string" ? item.tool : String(item.name ?? "mcp_tool_call");
96
- const server = typeof item.server === "string" ? item.server : undefined;
97
- return {
98
- tag: "progress",
99
- progress: {
100
- id: `tc-${id}`,
101
- kind: "tool-call",
102
- payload: {
103
- name: tool,
104
- input: item.arguments ?? item.input,
105
- toolUseId: id,
106
- ...(server ? { server } : {}),
107
- },
108
- ts: Date.now(),
109
- },
110
- };
111
- }
112
- if (item.type === "web_search") {
113
- return {
114
- tag: "progress",
115
- progress: {
116
- id: `tc-${id}`,
117
- kind: "tool-call",
118
- payload: { name: "web_search", input: { query: item.query }, toolUseId: id },
119
- ts: Date.now(),
120
- },
121
- };
122
- }
123
- if (item.type === "file_change") {
124
- return {
125
- tag: "progress",
126
- progress: {
127
- id: `tc-${id}`,
128
- kind: "tool-call",
129
- payload: { name: "file_change", input: { changes: item.changes }, toolUseId: id },
130
- ts: Date.now(),
131
- },
132
- };
133
- }
134
- return null;
135
- };
136
-
137
- const completedItemProgress = (
138
- item: Record<string, unknown>,
139
- id: string,
140
- ): ParsedDriverEvent | null => {
141
- if (item.type === "agent_message" && typeof item.text === "string") {
142
- return {
143
- tag: "progress",
144
- progress: {
145
- id: `am-${id}`,
146
- kind: "agent-message",
147
- payload: { text: item.text },
148
- ts: Date.now(),
149
- },
150
- };
151
- }
152
- if (item.type === "reasoning") {
153
- const text = typeof item.text === "string" ? item.text : item.summary;
154
- return {
155
- tag: "progress",
156
- progress: { id: `reasoning-${id}`, kind: "reasoning", payload: { text }, ts: Date.now() },
157
- };
158
- }
159
- if (item.type === "mcp_tool_call") {
160
- const tool = typeof item.tool === "string" ? item.tool : String(item.name ?? "mcp_tool_call");
161
- const raw =
162
- item.result && typeof item.result === "object"
163
- ? (item.result as Record<string, unknown>)
164
- : item;
165
- const content = raw.content ?? item.result ?? [];
166
- const structuredContent = raw.structuredContent ?? raw.structured_content;
167
- return {
168
- tag: "progress",
169
- progress: toolResultProgress(
170
- 0,
171
- {
172
- name: tool,
173
- toolUseId: id,
174
- content,
175
- ...(structuredContent && typeof structuredContent === "object"
176
- ? { structuredContent: structuredContent as Record<string, unknown> }
177
- : {}),
178
- isError:
179
- raw.isError === true ||
180
- raw.is_error === true ||
181
- item.status === "failed" ||
182
- (item.error !== undefined && item.error !== null),
183
- text: resultText(content) || (typeof item.error === "string" ? item.error : ""),
184
- },
185
- Date.now(),
186
- ),
187
- };
188
- }
189
- if (item.type === "command_execution") {
190
- const output = item.aggregated_output ?? item.output ?? "";
191
- const exitCode = typeof item.exit_code === "number" ? item.exit_code : undefined;
192
- return {
193
- tag: "progress",
194
- progress: toolResultProgress(
195
- 0,
196
- {
197
- name: "command_execution",
198
- toolUseId: id,
199
- content: { output, ...(exitCode !== undefined ? { exitCode } : {}) },
200
- isError: item.status === "failed" || (exitCode !== undefined && exitCode !== 0),
201
- text: typeof output === "string" ? output : JSON.stringify(output),
202
- },
203
- Date.now(),
204
- ),
205
- };
206
- }
207
- if (item.type === "web_search" || item.type === "file_change") {
208
- const isWebSearch = item.type === "web_search";
209
- const content = isWebSearch
210
- ? { query: item.query }
211
- : { changes: item.changes, status: item.status };
212
- let text = JSON.stringify(item.changes ?? []);
213
- if (isWebSearch) text = typeof item.query === "string" ? item.query : "";
214
- return {
215
- tag: "progress",
216
- progress: toolResultProgress(
217
- 0,
218
- {
219
- name: item.type,
220
- toolUseId: id,
221
- content,
222
- isError: item.status === "failed",
223
- text,
224
- },
225
- Date.now(),
226
- ),
227
- };
228
- }
229
- return null;
230
- };
231
-
232
- const itemProgress = (
233
- item: Record<string, unknown>,
234
- phase: "started" | "completed",
235
- ): ParsedDriverEvent | null => {
236
- const id = typeof item.id === "string" ? item.id : `${String(item.type)}-${Date.now()}`;
237
- return phase === "started" ? startedItemProgress(item, id) : completedItemProgress(item, id);
238
- };
239
-
240
- const makeParseEvent = (config: CodexDriverConfig, cliVersion?: string) => {
241
- let threadId: string | undefined;
242
- return (line: string): ParsedDriverEvent | ParsedDriverEvent[] | null => {
243
- let event: Record<string, unknown>;
244
- try {
245
- event = JSON.parse(line) as Record<string, unknown>;
246
- } catch {
247
- return null;
248
- }
249
- if (event.type === "thread.started") {
250
- threadId = typeof event.thread_id === "string" ? event.thread_id : undefined;
251
- return {
252
- tag: "ready",
253
- ready: {
254
- agentId: "codex",
255
- model: config.model,
256
- detail: { ...(threadId ? { threadId } : {}), ...(cliVersion ? { cliVersion } : {}) },
257
- },
258
- };
259
- }
260
- if (event.type === "item.started" || event.type === "item.completed") {
261
- if (!event.item || typeof event.item !== "object") return null;
262
- return itemProgress(
263
- event.item as Record<string, unknown>,
264
- event.type === "item.started" ? "started" : "completed",
265
- );
266
- }
267
- if (event.type === "turn.completed") {
268
- const usage = parseUsage(event.usage);
269
- const events: ParsedDriverEvent[] = [];
270
- if (usage) {
271
- events.push({
272
- tag: "progress",
273
- progress: {
274
- id: `usage-${threadId ?? Date.now()}`,
275
- kind: "usage",
276
- payload: usage,
277
- ts: Date.now(),
278
- },
279
- });
280
- }
281
- events.push({
282
- tag: "done",
283
- done: { exitReason: "done", summary: { threadId, ...(usage ? { usage } : {}) } },
284
- });
285
- return events;
286
- }
287
- if (event.type === "turn.failed" || event.type === "error") {
288
- const nestedMessage =
289
- event.error && typeof event.error === "object"
290
- ? (event.error as Record<string, unknown>).message
291
- : undefined;
292
- let message = "codex reported an error";
293
- if (typeof event.message === "string") message = event.message;
294
- else if (typeof event.error === "string") message = event.error;
295
- else if (typeof nestedMessage === "string") message = nestedMessage;
296
- return { tag: "error", error: { exitReason: "error", reason: message } };
297
- }
298
- return null;
299
- };
300
- };
301
-
302
56
  class CodexAppServerDriverImpl implements AgentDriver {
303
57
  private readonly emitter = new TypedEmitter<DriverEventMap>();
304
58
  private readonly config: CodexDriverConfig;
@@ -308,6 +62,7 @@ class CodexAppServerDriverImpl implements AgentDriver {
308
62
  private runDir: string | null = null;
309
63
  private isolatedWorkspace: string | null = null;
310
64
  private isolatedStateDir: string | null = null;
65
+ private isolationConfig: Record<string, CodexConfigValue> = {};
311
66
  private threadId: string | null = null;
312
67
  private cliVersion: string | undefined;
313
68
  private nextRequestId = 1;
@@ -316,7 +71,7 @@ class CodexAppServerDriverImpl implements AgentDriver {
316
71
  { resolve: (result: RpcRecord) => void; reject: (error: Error) => void }
317
72
  >();
318
73
  private readonly interrupts = new Map<string, { id: RpcId; method: string; params: RpcRecord }>();
319
- private readonly subagentParents = new Map<string, string>();
74
+ private readonly subagents = new CodexSubagentTracker();
320
75
  private readonly turnFacets = new Map<string, AppTurnFacets>();
321
76
  private interruptCount = 0;
322
77
  private idleTimer: NodeJS.Timeout | null = null;
@@ -345,10 +100,12 @@ class CodexAppServerDriverImpl implements AgentDriver {
345
100
  let cwd =
346
101
  this.config.cwd ?? (this.config.cwdMode === "artifacts" ? ctx.artifactsDir : ctx.runDir);
347
102
  let env = this.config.env;
103
+ let launchCommand = this.config.command;
348
104
  if (this.config.isolation) {
349
105
  const workspace = await realpath(temporaryDirectory({ prefix: "lux-codex-workspace-" }));
350
106
  await cp(ctx.artifactsDir, workspace, { recursive: true });
351
107
  this.isolatedWorkspace = workspace;
108
+ await stageSkills(this.config.skillDirs ?? [], workspace, ".agents");
352
109
  cwd = workspace;
353
110
  }
354
111
  if (this.config.isolation || this.config.ignoreUserConfig) {
@@ -372,6 +129,45 @@ class CodexAppServerDriverImpl implements AgentDriver {
372
129
  CODEX_CONFIG_HOME: stateDir,
373
130
  };
374
131
  }
132
+ if (this.config.isolation) {
133
+ const reads = await Promise.all(
134
+ this.config.isolation.allowRead.map((path) => realpath(path)),
135
+ );
136
+ const executable = resolveExecutable(
137
+ this.config.command,
138
+ { ...agentEnvironment(process.env, this.config.inheritEnv), ...env },
139
+ undefined,
140
+ cwd,
141
+ );
142
+ if (executable) {
143
+ launchCommand = await realpath(executable);
144
+ reads.push(executable, launchCommand);
145
+ }
146
+ // Native filesystem tools relaunch the CLI inside the subject sandbox.
147
+ // Workspace requirements reload process configuration during a turn.
148
+ // A thread-only profile is accepted at startup but fails that reload.
149
+ this.isolationConfig = {
150
+ allow_login_shell: false,
151
+ project_doc_max_bytes: 0,
152
+ projects: { [cwd]: { trust_level: "untrusted" } },
153
+ default_permissions: "lux-isolated",
154
+ permissions: {
155
+ "lux-isolated": {
156
+ filesystem: {
157
+ ":minimal": "read",
158
+ [cwd]: "write",
159
+ ...Object.fromEntries(reads.map((path) => [path, "read"])),
160
+ },
161
+ network: { enabled: true },
162
+ },
163
+ },
164
+ features: {
165
+ ...((this.config.config?.features as Record<string, CodexConfigValue>) ?? {}),
166
+ shell_snapshot: false,
167
+ shell_snapshot_v2: false,
168
+ },
169
+ };
170
+ }
375
171
  this.collectDir = cwd;
376
172
  this.artifactsDir = ctx.artifactsDir;
377
173
  this.runDir = ctx.runDir;
@@ -382,16 +178,23 @@ class CodexAppServerDriverImpl implements AgentDriver {
382
178
  commandName(this.config.command) === "codex"
383
179
  ? await discoverCliVersion(this.config.command)
384
180
  : undefined;
385
- const managed = spawnManagedProcess(this.config.command, buildAppServerArgs(this.config), {
386
- cwd,
387
- env: {
388
- ...process.env,
389
- LUX_RUN_DIR: ctx.runDir,
390
- LUX_ARTIFACTS_DIR: ctx.artifactsDir,
391
- ...env,
181
+ const managed = spawnManagedProcess(
182
+ launchCommand,
183
+ buildAppServerArgs({
184
+ ...this.config,
185
+ config: { ...this.config.config, ...this.isolationConfig },
186
+ }),
187
+ {
188
+ cwd,
189
+ env: {
190
+ ...agentEnvironment(process.env, this.config.inheritEnv),
191
+ LUX_RUN_DIR: ctx.runDir,
192
+ LUX_ARTIFACTS_DIR: ctx.artifactsDir,
193
+ ...env,
194
+ },
195
+ signal: ctx.abortSignal,
392
196
  },
393
- signal: ctx.abortSignal,
394
- });
197
+ );
395
198
  this.process = managed;
396
199
  managed.child.stderr.setEncoding("utf8");
397
200
  let stderrTail = "";
@@ -436,41 +239,35 @@ class CodexAppServerDriverImpl implements AgentDriver {
436
239
  capabilities: { experimentalApi: true, requestAttestation: false },
437
240
  });
438
241
  this.notify("initialized");
439
- const isolationReads = this.config.isolation
440
- ? await Promise.all(this.config.isolation.allowRead.map((path) => realpath(path)))
441
- : [];
442
242
  const threadConfig: Record<string, CodexConfigValue> = {
443
- ...(this.config.config ?? {}),
444
- model_reasoning_effort: this.config.reasoningEffort,
445
- ...(this.config.isolation
446
- ? {
447
- project_doc_max_bytes: 0,
448
- projects: { [cwd]: { trust_level: "untrusted" } },
449
- permissions: {
450
- "lux-isolated": {
451
- filesystem: {
452
- ":minimal": "read",
453
- ":workspace_roots": { ".": "write" },
454
- ...Object.fromEntries(isolationReads.map((path) => [path, "read"])),
455
- },
456
- network: { enabled: true },
457
- },
458
- },
459
- }
243
+ ...codexConfigOverrides(this.config),
244
+ ...(this.config.reasoningEffort
245
+ ? { model_reasoning_effort: this.config.reasoningEffort }
460
246
  : {}),
247
+ ...this.isolationConfig,
461
248
  };
462
249
  const started = await this.request("thread/start", {
463
250
  model: this.config.model,
464
251
  cwd,
465
- runtimeWorkspaceRoots: this.config.addDirs ?? [],
252
+ runtimeWorkspaceRoots: this.config.isolation
253
+ ? [cwd, ...(this.config.addDirs ?? [])]
254
+ : (this.config.addDirs ?? []),
466
255
  approvalPolicy: this.config.approvalPolicy,
467
- approvalsReviewer: "user",
256
+ approvalsReviewer: this.config.approvalsReviewer,
468
257
  ...(this.config.isolation
469
258
  ? { permissions: "lux-isolated" }
470
259
  : { sandbox: this.config.sandbox }),
471
260
  config: threadConfig,
472
261
  ephemeral: this.config.ephemeral,
473
262
  });
263
+ if (
264
+ this.config.approvalsReviewer === "auto_review" &&
265
+ started.approvalsReviewer !== "auto_review"
266
+ ) {
267
+ throw new Error(
268
+ "codex app-server did not enable the requested auto_review approvals reviewer",
269
+ );
270
+ }
474
271
  const thread = asRecord(started.thread);
475
272
  if (!thread || typeof thread.id !== "string") {
476
273
  throw new Error("codex app-server returned an invalid thread/start response");
@@ -481,6 +278,7 @@ class CodexAppServerDriverImpl implements AgentDriver {
481
278
  model: typeof started.model === "string" ? started.model : this.config.model,
482
279
  detail: {
483
280
  threadId: thread.id,
281
+ approvalsReviewer: this.config.approvalsReviewer,
484
282
  ...(typeof thread.sessionId === "string" ? { sessionId: thread.sessionId } : {}),
485
283
  ...(this.cliVersion ? { cliVersion: this.cliVersion } : {}),
486
284
  },
@@ -586,6 +384,11 @@ class CodexAppServerDriverImpl implements AgentDriver {
586
384
  : withRoot;
587
385
  }
588
386
 
387
+ async verificationWorkspace(): Promise<string | undefined> {
388
+ await this.quiesce();
389
+ return this.isolatedWorkspace ?? undefined;
390
+ }
391
+
589
392
  async quiesce(): Promise<void> {
590
393
  this.clearIdleTimer();
591
394
  await this.process?.terminate();
@@ -659,6 +462,7 @@ class CodexAppServerDriverImpl implements AgentDriver {
659
462
  }
660
463
 
661
464
  private async dispatch(message: RpcRecord): Promise<void> {
465
+ if (this.terminal) return;
662
466
  const method = typeof message.method === "string" ? message.method : "";
663
467
  const params = asRecord(message.params) ?? {};
664
468
  if (message.id !== undefined && method) {
@@ -669,6 +473,14 @@ class CodexAppServerDriverImpl implements AgentDriver {
669
473
  await this.handleItemNotification(method, params);
670
474
  return;
671
475
  }
476
+ if (
477
+ (method === "thread/tokenUsage/updated" ||
478
+ method === "turn/completed" ||
479
+ method === "error") &&
480
+ typeof params.threadId === "string" &&
481
+ params.threadId !== this.threadId
482
+ )
483
+ return;
672
484
  if (method === "thread/tokenUsage/updated") {
673
485
  this.handleTokenUsageNotification(params);
674
486
  return;
@@ -702,28 +514,28 @@ class CodexAppServerDriverImpl implements AgentDriver {
702
514
  const toolName = item ? appItemToolName(item) : null;
703
515
  if (toolName && !facets.tools.includes(toolName)) facets.tools.push(toolName);
704
516
  if (turnId) this.turnFacets.set(turnId, facets);
705
- this.recordSubagentParents(item);
706
- const parentToolUseId =
707
- typeof params.threadId === "string" ? this.subagentParents.get(params.threadId) : undefined;
517
+ const threadId = typeof params.threadId === "string" ? params.threadId : undefined;
518
+ this.subagents.record(item, threadId, this.threadId);
519
+ const agent = this.subagents.attribution(threadId, this.threadId);
708
520
  const event = item
709
- ? appItemProgress(item, method === "item/started" ? "started" : "completed", parentToolUseId)
521
+ ? appItemProgress(item, method === "item/started" ? "started" : "completed", agent)
710
522
  : null;
711
523
  if (event?.tag === "progress") await this.emitter.emit("progress", event.progress);
712
- }
713
-
714
- private recordSubagentParents(item: RpcRecord | null): void {
715
- if (item?.type !== "collabAgentToolCall" || typeof item.id !== "string") return;
716
- const receiverThreadIds = Array.isArray(item.receiverThreadIds)
717
- ? item.receiverThreadIds.filter((value): value is string => typeof value === "string")
718
- : [];
719
- for (const receiverThreadId of receiverThreadIds) {
720
- this.subagentParents.set(receiverThreadId, item.id);
524
+ if (item) {
525
+ for (const lifecycle of appAgentLifecycleProgress(
526
+ item,
527
+ method === "item/started" ? "started" : "completed",
528
+ agent,
529
+ event?.tag === "progress" ? event.progress.ts : Date.now(),
530
+ )) {
531
+ await this.emitter.emit("progress", lifecycle);
532
+ }
721
533
  }
722
534
  }
723
535
 
724
536
  private handleTokenUsageNotification(params: RpcRecord): void {
725
537
  const tokenUsage = asRecord(params.tokenUsage);
726
- const usage = appUsage(tokenUsage?.last);
538
+ const usage = appUsage(tokenUsage?.total) ?? appUsage(tokenUsage?.last);
727
539
  if (usage) this.latestUsage = usage;
728
540
  }
729
541
 
@@ -775,6 +587,7 @@ class CodexAppServerDriverImpl implements AgentDriver {
775
587
  }
776
588
 
777
589
  private handleErrorNotification(params: RpcRecord): void {
590
+ if (params.willRetry === true) return;
778
591
  const error = asRecord(params.error);
779
592
  let errorMessage = "codex app-server reported an error";
780
593
  if (typeof params.message === "string") errorMessage = params.message;
@@ -883,8 +696,8 @@ class CodexAppServerDriverImpl implements AgentDriver {
883
696
  this.idleTimer = setTimeout(() => {
884
697
  this.idleTimer = null;
885
698
  if (this.interrupts.size > 0) return;
886
- this.fail(`no event for ${this.config.idleTimeoutMs}ms`, "idle-timeout");
887
- }, this.config.idleTimeoutMs);
699
+ this.fail(`no event for ${durationMs(this.config.idleTimeout)}ms`, "idle-timeout");
700
+ }, durationMs(this.config.idleTimeout));
888
701
  }
889
702
 
890
703
  private clearIdleTimer(): void {
@@ -942,12 +755,13 @@ class CodexExecDriverImpl implements AgentDriver {
942
755
  command: this.config.command,
943
756
  args: buildArgs(this.config),
944
757
  cwd,
945
- env: this.config.env,
758
+ env: agentEnvironment(process.env, this.config.inheritEnv, this.config.env),
759
+ inheritEnv: false,
946
760
  protocol: "custom",
947
761
  parseEvent: makeParseEvent(this.config, cliVersion),
948
762
  formatPrompt: (prompt) => prompt,
949
763
  closeStdinAfterPrompt: true,
950
- idleTimeoutMs: this.config.idleTimeoutMs,
764
+ idleTimeout: this.config.idleTimeout,
951
765
  maxLineBytes: this.config.maxLineBytes,
952
766
  maxInterrupts: 1,
953
767
  });
@@ -982,14 +796,34 @@ class CodexExecDriverImpl implements AgentDriver {
982
796
  }
983
797
  }
984
798
 
985
- export const codexDriver: DriverPlugin<CodexDriverConfig> = {
799
+ export const codexDriver = defineDriver({
986
800
  name: "codex",
987
801
  configSchema: CodexDriverConfigSchema,
802
+ runtime: (config) => ({
803
+ commands: [config.command],
804
+ capabilities: {
805
+ interactive: config.interactionMode === "app-server",
806
+ "tool-calls": true,
807
+ "tool-results": true,
808
+ artifacts: true,
809
+ subagents: config.interactionMode === "app-server",
810
+ usage: true,
811
+ cost: false,
812
+ isolation: Boolean(config.isolation),
813
+ },
814
+ }),
815
+ experiment: {
816
+ version: "1",
817
+ prepare: prepareCodexExperimentConfig,
818
+ identity: (config, { rootDir }) =>
819
+ configuredClaudeSourceHashes({ name: "codex", config }, rootDir),
820
+ },
821
+ selectHarness: selectModelAndReasoningEffort,
988
822
  create: (config) =>
989
823
  config.interactionMode === "app-server"
990
824
  ? new CodexAppServerDriverImpl(config)
991
825
  : new CodexExecDriverImpl(config),
992
- };
826
+ });
993
827
 
994
828
  export type { CodexDriverConfig };
995
829
  export { appItemProgress, buildAppServerArgs, buildArgs, CodexDriverConfigSchema, makeParseEvent };
@@ -0,0 +1,60 @@
1
+ # Copilot driver
2
+
3
+ The `copilot` driver runs GitHub Copilot CLI as an Agent Client Protocol (ACP)
4
+ server (`copilot --acp`). Install the CLI and run `copilot login` before Lux
5
+ starts it. Your GitHub plan must allow Copilot CLI model access.
6
+
7
+ ```ts
8
+ {
9
+ name: "copilot",
10
+ config: {
11
+ model: "YOUR_COPILOT_MODEL",
12
+ reasoningEffort: "low",
13
+ allowTools: ["shell(git:*)"],
14
+ },
15
+ }
16
+ ```
17
+
18
+ `model` is required because Copilot's `auto` selection can pick any model in
19
+ the plan. Lux passes `--model` and `--effort` on the command line. Copilot's
20
+ `--effort` accepts `none` through `max`, but each model honors only a subset
21
+ and silently falls back on the rest, so the harness catalog in
22
+ `core/harness-catalogs/copilot.ts` records the levels per model id and Lux
23
+ rejects a level the model does not honor. Models whose levels are not published
24
+ (Gemini, Grok, Kimi, MAI) are listed with no effort. When no effort is set, a
25
+ model with levels runs at `low`. When ACP advertises a model selector, Lux
26
+ selects and verifies the requested model; otherwise it records the model as
27
+ requested rather than confirmed. `lux doctor` compares the catalog's model ids with
28
+ `copilot help config` and warns when they differ.
29
+
30
+ Tool permission requests arrive as ACP `session/request_permission` calls and
31
+ become `approve` interrupts. Lux answers with the one-operation option only and
32
+ never selects a remembered grant. `allowTools` and `denyTools` pass Copilot
33
+ permission patterns; `allowAllTools` approves everything, which turns the
34
+ interactive capability off. The `ask_user` tool is disabled because Copilot has
35
+ no ACP wire for it. `askUser: true` is rejected before launching the CLI;
36
+ permission interrupts remain supported through the normal Lux answerer.
37
+
38
+ Copilot loads its native workspace instructions and bundled GitHub MCP server
39
+ by default, matching ordinary harness execution. Set `customInstructions: false`
40
+ or `builtinMcps: false` to disable them for a specific evaluation. Auto-update is
41
+ always off. The driver provides no ambient-configuration isolation: Copilot still
42
+ reads `~/.copilot` settings, MCP configuration, and credentials. Usage and
43
+ cost are recorded as unknown; `--usage-output-file` cannot be combined with
44
+ `--acp`.
45
+
46
+ The adapter has synthetic protocol and lifecycle tests plus an opt-in live
47
+ smoke task: `mise run smoke:harnesses -- copilot` from the repository root.
48
+ The live task uses your installed CLI, existing login, and model quota. CLI
49
+ `1.0.83` passed the authenticated file-copy smoke on 2026-09-30 after the account
50
+ received a Copilot seat and CLI access. A seat alone does not enable the CLI:
51
+ check the organization's Copilot CLI policy when GitHub returns a feature-access
52
+ 403. Lux also recognizes the CLI's native authorization diagnostic as an error
53
+ even when Copilot ends the turn normally.
54
+
55
+ Protocol references:
56
+
57
+ - [Copilot CLI command-line reference](https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-programmatic-reference)
58
+ - [Copilot CLI permissions](https://docs.github.com/en/copilot/concepts/agents/copilot-cli/about-copilot-cli)
59
+ - [ACP session modes](https://agentclientprotocol.com/protocol/session-modes)
60
+ - [ACP tool calls and permissions](https://agentclientprotocol.com/protocol/tool-calls)