humanish 0.106.0 → 0.107.0

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 (459) hide show
  1. package/AGENTS.md +4 -2
  2. package/ARCHITECTURE.md +17 -16
  3. package/CHANGELOG.md +24 -0
  4. package/CONTEXT.md +42 -39
  5. package/CONTRIBUTING.md +8 -6
  6. package/README.md +8 -3
  7. package/dist/actors/codex/app-server-client.js +2 -1
  8. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  9. package/dist/actors/codex/app-server-trace.js +1 -3
  10. package/dist/actors/codex/app-server.js +2 -1
  11. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  12. package/dist/actors/codex/protocol-compat.js +357 -0
  13. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  14. package/dist/actors/codex/protocol-contract.js +471 -0
  15. package/dist/actors/codex/qualified-versions.d.ts +31 -4
  16. package/dist/actors/codex/qualified-versions.js +51 -6
  17. package/dist/actors/codex/restricted-executable.d.ts +24 -0
  18. package/dist/actors/codex/restricted-executable.js +97 -22
  19. package/dist/actors/codex/restricted-launch.d.ts +7 -1
  20. package/dist/actors/codex/restricted-launch.js +42 -3
  21. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  22. package/dist/actors/codex/restricted-notifications.js +277 -0
  23. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  24. package/dist/actors/codex/restricted-participant.js +60 -2
  25. package/dist/actors/codex/restricted-policy.d.ts +9 -1
  26. package/dist/actors/codex/restricted-session.d.ts +14 -1
  27. package/dist/actors/codex/restricted-session.js +50 -17
  28. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  29. package/dist/actors/codex/restricted-transport.js +139 -27
  30. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  31. package/dist/actors/codex/restricted-turn.js +43 -30
  32. package/dist/actors/computer-use/actor.d.ts +1 -1
  33. package/dist/actors/computer-use/actor.js +4 -4
  34. package/dist/actors/computer-use/loop/backstop.js +1 -1
  35. package/dist/actors/computer-use/loop/ending.d.ts +2 -2
  36. package/dist/actors/computer-use/loop/ending.js +2 -2
  37. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  38. package/dist/actors/computer-use/loop/spend.js +3 -3
  39. package/dist/actors/computer-use/loop/trace.js +2 -2
  40. package/dist/actors/computer-use/loop/types.d.ts +14 -5
  41. package/dist/actors/computer-use/loop.js +4 -4
  42. package/dist/actors/computer-use/openai-provider.d.ts +1 -1
  43. package/dist/actors/computer-use/openai-provider.js +2 -2
  44. package/dist/actors/contract.d.ts +10 -8
  45. package/dist/actors/contract.js +7 -1
  46. package/dist/actors/local-agent/cli.js +1 -1
  47. package/dist/actors/scripted-browser/actor.d.ts +2 -2
  48. package/dist/actors/scripted-browser/journey.js +15 -4
  49. package/dist/actors/scripted-browser/steps.js +18 -0
  50. package/dist/actors/scripted-browser/types.d.ts +11 -1
  51. package/dist/actors/stop-conditions.js +1 -3
  52. package/dist/analysis/automatic-completion.d.ts +13 -8
  53. package/dist/analysis/automatic-completion.js +14 -8
  54. package/dist/analysis/automatic-config.d.ts +1 -1
  55. package/dist/analysis/automatic-config.js +2 -2
  56. package/dist/analysis/automatic.d.ts +10 -4
  57. package/dist/analysis/automatic.js +17 -13
  58. package/dist/analysis/diagnostics.d.ts +23 -0
  59. package/dist/analysis/diagnostics.js +112 -0
  60. package/dist/analysis/evidence-sources.js +2 -2
  61. package/dist/analysis/evidence.js +6 -6
  62. package/dist/analysis/execute.d.ts +7 -1
  63. package/dist/analysis/execute.js +39 -12
  64. package/dist/analysis/job.d.ts +8 -5
  65. package/dist/analysis/job.js +15 -14
  66. package/dist/analysis/load.d.ts +1 -1
  67. package/dist/analysis/load.js +5 -5
  68. package/dist/analysis/provider.d.ts +9 -1
  69. package/dist/analysis/restricted-codex.d.ts +2 -0
  70. package/dist/analysis/restricted-codex.js +10 -1
  71. package/dist/analysis/service.d.ts +2 -0
  72. package/dist/analysis/service.js +31 -12
  73. package/dist/analysis/sharing.d.ts +2 -2
  74. package/dist/analysis/sharing.js +5 -5
  75. package/dist/analysis/store-executions.d.ts +5 -5
  76. package/dist/analysis/store-executions.js +12 -12
  77. package/dist/analysis/store.d.ts +4 -4
  78. package/dist/analysis/store.js +13 -13
  79. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  80. package/dist/cli/commands/analysis-signals.js +4 -1
  81. package/dist/cli/commands/analyze.js +4 -2
  82. package/dist/cli/commands/comms.js +8 -1
  83. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  84. package/dist/cli/commands/lab-route-computer-use.js +26 -14
  85. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  86. package/dist/cli/commands/lab-route-preview.js +3 -4
  87. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  88. package/dist/cli/commands/lab-route-run.js +6 -2
  89. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  90. package/dist/cli/commands/lab-route-scripted.js +0 -1
  91. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  92. package/dist/cli/commands/lab-route-shared-world.js +0 -1
  93. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  94. package/dist/cli/commands/lab-route-terminal.js +0 -1
  95. package/dist/cli/commands/lab-run.js +76 -45
  96. package/dist/cli/commands/lab-scorer.d.ts +0 -2
  97. package/dist/cli/commands/lab.js +12 -6
  98. package/dist/cli/commands/observe.js +22 -0
  99. package/dist/cli/commands/run-signals.d.ts +30 -0
  100. package/dist/cli/commands/run-signals.js +146 -0
  101. package/dist/cli/commands/runs.js +10 -8
  102. package/dist/cli/commands/watch.js +12 -10
  103. package/dist/cli/doctor.d.ts +3 -0
  104. package/dist/cli/doctor.js +10 -2
  105. package/dist/cli/io.d.ts +5 -4
  106. package/dist/cli/io.js +12 -8
  107. package/dist/cli/program.js +3 -3
  108. package/dist/cli/renamed-options.d.ts +11 -0
  109. package/dist/cli/renamed-options.js +18 -0
  110. package/dist/cli/telemetry.d.ts +2 -2
  111. package/dist/cli/telemetry.js +1 -1
  112. package/dist/comms/capture-surface.d.ts +1 -1
  113. package/dist/comms/catch-host.d.ts +1 -1
  114. package/dist/comms/connections.js +4 -4
  115. package/dist/comms/external-evidence.d.ts +27 -0
  116. package/dist/comms/external-evidence.js +93 -0
  117. package/dist/comms/lease-store.js +7 -7
  118. package/dist/comms/types.js +1 -1
  119. package/dist/evidence/browser-hygiene.d.ts +1 -1
  120. package/dist/evidence/browser-hygiene.js +1 -1
  121. package/dist/evidence/redaction.js +1 -1
  122. package/dist/evidence/secret-scrub.d.ts +9 -0
  123. package/dist/evidence/secret-scrub.js +96 -0
  124. package/dist/feedback/draft.js +7 -9
  125. package/dist/feedback/export-bundle.js +4 -4
  126. package/dist/feedback/export.js +9 -9
  127. package/dist/feedback/feedback.d.ts +1 -1
  128. package/dist/index.d.ts +3 -6
  129. package/dist/index.js +3 -6
  130. package/dist/keys/key-resolution.d.ts +3 -1
  131. package/dist/keys/key-resolution.js +18 -16
  132. package/dist/lab/adapter-extension.d.ts +28 -6
  133. package/dist/lab/adapter-extension.js +65 -126
  134. package/dist/lab/adapter-scorer-loader.d.ts +25 -5
  135. package/dist/lab/adapter-scorer-loader.js +24 -0
  136. package/dist/lab/composition-rules.d.ts +2 -0
  137. package/dist/lab/composition-rules.js +35 -26
  138. package/dist/lab/config.js +28 -26
  139. package/dist/lab/device-presets.d.ts +2 -2
  140. package/dist/lab/discover.js +1 -3
  141. package/dist/lab/doctor.d.ts +44 -9
  142. package/dist/lab/doctor.js +149 -41
  143. package/dist/lab/init-plan.js +1 -3
  144. package/dist/lab/keys.js +1 -1
  145. package/dist/lab/lab-deps.d.ts +85 -0
  146. package/dist/lab/lab-deps.js +4 -0
  147. package/dist/lab/parse/actors.js +8 -7
  148. package/dist/lab/parse/comms.js +3 -2
  149. package/dist/lab/parse/execution.js +3 -2
  150. package/dist/lab/parse/subject-state.js +2 -1
  151. package/dist/lab/parse/subject.js +2 -1
  152. package/dist/lab/parse/values.d.ts +0 -1
  153. package/dist/lab/parse/values.js +0 -3
  154. package/dist/lab/persona-resolve.d.ts +3 -3
  155. package/dist/lab/persona-resolve.js +4 -4
  156. package/dist/lab/persona.js +1 -3
  157. package/dist/lab/plan-base.d.ts +6 -2
  158. package/dist/lab/plan-base.js +22 -7
  159. package/dist/lab/plan-participants.d.ts +5 -5
  160. package/dist/lab/plan-participants.js +2 -2
  161. package/dist/lab/plan-types.d.ts +33 -7
  162. package/dist/lab/plan.d.ts +3 -11
  163. package/dist/lab/plan.js +18 -42
  164. package/dist/lab/preflight-result.js +0 -2
  165. package/dist/lab/preflight.d.ts +0 -3
  166. package/dist/lab/preflight.js +1 -1
  167. package/dist/lab/requirements.d.ts +20 -0
  168. package/dist/lab/requirements.js +54 -0
  169. package/dist/lab/route-inputs.d.ts +23 -12
  170. package/dist/lab/route-inputs.js +48 -51
  171. package/dist/lab/routing.d.ts +19 -24
  172. package/dist/lab/routing.js +14 -47
  173. package/dist/lab/run-lab-events.d.ts +6 -11
  174. package/dist/lab/run-lab-events.js +3 -11
  175. package/dist/lab/run-lab-homes.d.ts +64 -0
  176. package/dist/lab/run-lab-homes.js +3 -0
  177. package/dist/lab/run-lab-options.d.ts +12 -66
  178. package/dist/lab/run-lab-options.js +45 -275
  179. package/dist/lab/summary.d.ts +9 -4
  180. package/dist/lab/summary.js +15 -8
  181. package/dist/lab/types.d.ts +132 -132
  182. package/dist/lab/validation.d.ts +15 -15
  183. package/dist/lab/validation.js +28 -28
  184. package/dist/lab/warnings.js +20 -19
  185. package/dist/observer/artifact.d.ts +1 -1
  186. package/dist/observer/artifact.js +3 -3
  187. package/dist/observer/data.js +2 -2
  188. package/dist/observer/render.js +2 -2
  189. package/dist/observer/run-routes.d.ts +1 -1
  190. package/dist/observer/run-routes.js +5 -5
  191. package/dist/observer/serve.d.ts +17 -0
  192. package/dist/observer/serve.js +34 -3
  193. package/dist/observer-app.html +1 -1
  194. package/dist/routes/computer-use/bundle-parts.d.ts +1 -1
  195. package/dist/routes/computer-use/bundle-parts.js +10 -3
  196. package/dist/routes/computer-use/bundle.d.ts +4 -11
  197. package/dist/routes/computer-use/bundle.js +9 -15
  198. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  199. package/dist/routes/computer-use/diagnostics.js +1 -1
  200. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +10 -10
  201. package/dist/routes/computer-use/e2b-desktop/comms.js +11 -14
  202. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  203. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -7
  204. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +13 -13
  205. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -11
  206. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  207. package/dist/routes/computer-use/e2b-desktop/prepare.js +33 -36
  208. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  209. package/dist/routes/computer-use/e2b-desktop/start.js +24 -23
  210. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  211. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  212. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  213. package/dist/routes/computer-use/e2b-desktop/teardown.js +29 -17
  214. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  215. package/dist/routes/computer-use/external-comms.js +19 -43
  216. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  217. package/dist/routes/computer-use/fanout-bundle.js +25 -29
  218. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +25 -19
  219. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  220. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  221. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  222. package/dist/routes/computer-use/live-flush.js +19 -27
  223. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +14 -13
  224. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  225. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  226. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  227. package/dist/routes/computer-use/local-vm.js +39 -66
  228. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  229. package/dist/routes/computer-use/participant-desktop.js +5 -25
  230. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +10 -10
  231. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +35 -22
  232. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  233. package/dist/routes/computer-use/participant-facts.js +12 -1
  234. package/dist/routes/computer-use/participant-model.d.ts +19 -11
  235. package/dist/routes/computer-use/participant-model.js +58 -33
  236. package/dist/routes/computer-use/participant-prompt.d.ts +3 -3
  237. package/dist/routes/computer-use/participant-prompt.js +4 -4
  238. package/dist/routes/computer-use/participant-runs.d.ts +6 -6
  239. package/dist/routes/computer-use/participant-runs.js +8 -8
  240. package/dist/routes/computer-use/plan.d.ts +21 -29
  241. package/dist/routes/computer-use/plan.js +59 -65
  242. package/dist/routes/computer-use/preflight.d.ts +6 -11
  243. package/dist/routes/computer-use/preflight.js +26 -18
  244. package/dist/routes/computer-use/rerun-selection.js +10 -6
  245. package/dist/routes/computer-use/result.d.ts +1 -1
  246. package/dist/routes/computer-use/result.js +40 -30
  247. package/dist/routes/computer-use/route.d.ts +3 -4
  248. package/dist/routes/computer-use/route.js +21 -19
  249. package/dist/routes/computer-use/self-report.d.ts +2 -2
  250. package/dist/routes/computer-use/self-report.js +4 -4
  251. package/dist/routes/computer-use/setup.d.ts +8 -17
  252. package/dist/routes/computer-use/setup.js +98 -86
  253. package/dist/routes/computer-use/single-bundle.d.ts +8 -11
  254. package/dist/routes/computer-use/single-bundle.js +20 -25
  255. package/dist/routes/computer-use/subject-projection.d.ts +5 -7
  256. package/dist/routes/computer-use/subject-projection.js +20 -19
  257. package/dist/routes/computer-use/types.d.ts +169 -211
  258. package/dist/routes/computer-use/types.js +13 -6
  259. package/dist/routes/preview.js +0 -1
  260. package/dist/routes/scripted/bundle.d.ts +3 -6
  261. package/dist/routes/scripted/bundle.js +11 -16
  262. package/dist/routes/scripted/plan.d.ts +5 -7
  263. package/dist/routes/scripted/plan.js +6 -4
  264. package/dist/routes/scripted/result.d.ts +4 -1
  265. package/dist/routes/scripted/result.js +10 -6
  266. package/dist/routes/scripted/route.js +10 -11
  267. package/dist/routes/scripted/scenario.d.ts +1 -1
  268. package/dist/routes/scripted/scenario.js +1 -1
  269. package/dist/routes/scripted/setup.d.ts +3 -2
  270. package/dist/routes/scripted/setup.js +22 -21
  271. package/dist/routes/scripted/subject.d.ts +8 -3
  272. package/dist/routes/scripted/subject.js +11 -6
  273. package/dist/routes/scripted/surface-records.js +1 -1
  274. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  275. package/dist/routes/scripted/surface-sessions.js +4 -4
  276. package/dist/routes/scripted/types.d.ts +19 -36
  277. package/dist/routes/scripted/types.js +1 -2
  278. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +8 -8
  279. package/dist/routes/shared-world/bundle.d.ts +2 -2
  280. package/dist/routes/shared-world/bundle.js +22 -26
  281. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  282. package/dist/routes/shared-world/checkpoints.js +4 -4
  283. package/dist/routes/shared-world/comms.d.ts +5 -4
  284. package/dist/routes/shared-world/comms.js +28 -41
  285. package/dist/routes/shared-world/external-public.d.ts +5 -5
  286. package/dist/routes/shared-world/external-public.js +19 -20
  287. package/dist/routes/shared-world/handoff.d.ts +4 -4
  288. package/dist/routes/shared-world/handoff.js +50 -50
  289. package/dist/routes/shared-world/lobby-code.d.ts +5 -5
  290. package/dist/routes/shared-world/lobby-code.js +13 -13
  291. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +8 -6
  292. package/dist/routes/shared-world/{seats.js → participant-specs.js} +46 -51
  293. package/dist/routes/shared-world/plan.d.ts +2 -6
  294. package/dist/routes/shared-world/plan.js +1 -2
  295. package/dist/routes/shared-world/provenance.d.ts +4 -4
  296. package/dist/routes/shared-world/provenance.js +4 -4
  297. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  298. package/dist/routes/shared-world/provisioned.js +48 -41
  299. package/dist/routes/shared-world/result.js +31 -19
  300. package/dist/routes/shared-world/route.js +37 -41
  301. package/dist/routes/shared-world/setup.d.ts +5 -4
  302. package/dist/routes/shared-world/setup.js +12 -14
  303. package/dist/routes/shared-world/types.d.ts +53 -126
  304. package/dist/routes/shared-world/types.js +2 -2
  305. package/dist/routes/terminal/adapter.d.ts +8 -8
  306. package/dist/routes/terminal/adapter.js +28 -125
  307. package/dist/routes/terminal/bundle.d.ts +7 -12
  308. package/dist/routes/terminal/bundle.js +24 -34
  309. package/dist/routes/terminal/credentials.d.ts +2 -2
  310. package/dist/routes/terminal/credentials.js +16 -16
  311. package/dist/routes/terminal/dry-run.d.ts +1 -1
  312. package/dist/routes/terminal/dry-run.js +9 -11
  313. package/dist/routes/terminal/encoding.d.ts +1 -1
  314. package/dist/routes/terminal/encoding.js +2 -2
  315. package/dist/routes/terminal/ledger.d.ts +6 -6
  316. package/dist/routes/terminal/ledger.js +9 -9
  317. package/dist/routes/terminal/live-finish.d.ts +1 -2
  318. package/dist/routes/terminal/live-finish.js +21 -20
  319. package/dist/routes/terminal/live-sandbox.d.ts +4 -2
  320. package/dist/routes/terminal/live-sandbox.js +25 -21
  321. package/dist/routes/terminal/participant-text.d.ts +23 -0
  322. package/dist/routes/terminal/participant-text.js +165 -0
  323. package/dist/routes/terminal/plan.d.ts +2 -6
  324. package/dist/routes/terminal/plan.js +13 -9
  325. package/dist/routes/terminal/recorder.d.ts +6 -1
  326. package/dist/routes/terminal/recorder.js +12 -4
  327. package/dist/routes/terminal/result.js +4 -4
  328. package/dist/routes/terminal/route.js +26 -26
  329. package/dist/routes/terminal/runtime.d.ts +3 -2
  330. package/dist/routes/terminal/runtime.js +3 -3
  331. package/dist/routes/terminal/sandbox.d.ts +5 -3
  332. package/dist/routes/terminal/sandbox.js +13 -16
  333. package/dist/routes/terminal/session.js +16 -14
  334. package/dist/routes/terminal/token-usage.js +5 -5
  335. package/dist/routes/terminal/trace.d.ts +5 -8
  336. package/dist/routes/terminal/trace.js +9 -64
  337. package/dist/routes/terminal/types.d.ts +85 -93
  338. package/dist/routes/terminal/types.js +9 -4
  339. package/dist/run/active-runs.d.ts +13 -0
  340. package/dist/run/active-runs.js +12 -0
  341. package/dist/run/bundle-shape.d.ts +2 -1
  342. package/dist/run/bundle-shape.js +4 -4
  343. package/dist/run/bundle.d.ts +63 -56
  344. package/dist/run/bundle.js +9 -8
  345. package/dist/run/cost-summary.js +3 -2
  346. package/dist/run/costs.d.ts +6 -6
  347. package/dist/run/costs.js +10 -10
  348. package/dist/run/detail.d.ts +5 -5
  349. package/dist/run/detail.js +6 -6
  350. package/dist/run/dry-run.js +5 -12
  351. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  352. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  353. package/dist/run/feedback-shape.js +1 -1
  354. package/dist/run/judge.d.ts +16 -4
  355. package/dist/run/judge.js +24 -7
  356. package/dist/run/locate.d.ts +2 -0
  357. package/dist/run/locate.js +3 -1
  358. package/dist/run/outcomes.d.ts +3 -3
  359. package/dist/run/outcomes.js +3 -3
  360. package/dist/run/participant-records.d.ts +2 -2
  361. package/dist/run/participant-records.js +2 -2
  362. package/dist/run/paths.js +1 -1
  363. package/dist/run/pricing.d.ts +19 -9
  364. package/dist/run/pricing.js +30 -18
  365. package/dist/run/projection.d.ts +13 -13
  366. package/dist/run/projection.js +8 -8
  367. package/dist/run/reclaim.d.ts +7 -1
  368. package/dist/run/reclaim.js +24 -4
  369. package/dist/run/results.d.ts +1 -1
  370. package/dist/run/run-index.d.ts +1 -1
  371. package/dist/run/run-index.js +11 -11
  372. package/dist/run/run.d.ts +4 -2
  373. package/dist/run/run.js +9 -5
  374. package/dist/run/sandbox-receipts.d.ts +4 -4
  375. package/dist/run/sandbox-receipts.js +4 -4
  376. package/dist/run/shared-world-evidence.d.ts +47 -47
  377. package/dist/run/shared-world-shape.d.ts +3 -3
  378. package/dist/run/shared-world-shape.js +11 -11
  379. package/dist/run/stats.d.ts +5 -5
  380. package/dist/run/stats.js +8 -8
  381. package/dist/run/status.d.ts +16 -6
  382. package/dist/run/status.js +31 -8
  383. package/dist/run/streams.d.ts +26 -19
  384. package/dist/run/terminal-contract.d.ts +5 -5
  385. package/dist/run/terminal-contract.js +4 -4
  386. package/dist/run/transient-comms-secrets.d.ts +5 -0
  387. package/dist/run/transient-comms-secrets.js +12 -0
  388. package/dist/run-lab.d.ts +36 -34
  389. package/dist/run-lab.js +41 -37
  390. package/dist/subject/desktop-cli.d.ts +1 -1
  391. package/dist/subject/desktop-cli.js +1 -1
  392. package/dist/subject/local-tree-archive.d.ts +1 -1
  393. package/dist/subject/local-tree-archive.js +4 -4
  394. package/dist/subject/local-tree.d.ts +2 -2
  395. package/dist/subject/local-tree.js +1 -1
  396. package/dist/subject/node-bootstrap.d.ts +1 -1
  397. package/dist/subject/node-bootstrap.js +4 -4
  398. package/dist/subject/runtime.js +5 -5
  399. package/dist/subject/serve.js +1 -1
  400. package/dist/subject/steps.d.ts +4 -4
  401. package/dist/subject/steps.js +5 -5
  402. package/dist/substrates/desktop-session.d.ts +2 -0
  403. package/dist/substrates/e2b/cdp-probe.d.ts +2 -2
  404. package/dist/substrates/e2b/cdp-probe.js +1 -1
  405. package/dist/substrates/e2b/desktop-browser.d.ts +3 -3
  406. package/dist/substrates/e2b/desktop-browser.js +4 -4
  407. package/dist/substrates/e2b/desktop-cdp.d.ts +7 -7
  408. package/dist/substrates/e2b/desktop-cdp.js +4 -4
  409. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  410. package/dist/substrates/e2b/desktop-geometry.js +3 -3
  411. package/dist/substrates/e2b/desktop-media.js +2 -2
  412. package/dist/substrates/e2b/sandbox.d.ts +2 -0
  413. package/dist/substrates/e2b/sandbox.js +22 -8
  414. package/dist/substrates/e2b/sdk.d.ts +12 -1
  415. package/dist/substrates/e2b/sdk.js +30 -9
  416. package/dist/substrates/local/runtime-host.d.ts +2 -0
  417. package/dist/substrates/local/runtime-host.js +6 -0
  418. package/dist/tui/actions.d.ts +7 -5
  419. package/dist/tui/actions.js +18 -9
  420. package/dist/tui-app.js +42 -42
  421. package/dist/verify/actor.d.ts +10 -10
  422. package/dist/verify/actor.js +15 -15
  423. package/dist/verify/artifacts.d.ts +1 -1
  424. package/dist/verify/artifacts.js +3 -3
  425. package/dist/verify/costs.d.ts +2 -2
  426. package/dist/verify/costs.js +2 -2
  427. package/dist/verify/liveness.d.ts +1 -1
  428. package/dist/verify/liveness.js +4 -1
  429. package/dist/verify/rerun.d.ts +1 -1
  430. package/dist/verify/rerun.js +1 -1
  431. package/dist/verify/shared-world.js +2 -2
  432. package/dist/verify/verify.js +6 -6
  433. package/docs/README.md +1 -1
  434. package/docs/architecture/actor-contract.md +60 -22
  435. package/docs/architecture/desktop-sessions.md +9 -9
  436. package/docs/architecture/external-public-shared-world.md +5 -0
  437. package/docs/architecture/observer.md +4 -4
  438. package/docs/architecture/restricted-codex-analysis.md +40 -4
  439. package/docs/architecture/state-driven-executor.md +4 -5
  440. package/docs/architecture/task-protocol-support.md +3 -5
  441. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +24 -16
  442. package/docs/contracts/run-bundle.md +10 -8
  443. package/docs/contracts/schemas.md +109 -53
  444. package/docs/contracts/study-analysis.md +24 -0
  445. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  446. package/docs/product/automatic-analysis.md +1 -0
  447. package/docs/ramp/README.md +2 -1
  448. package/package.json +4 -4
  449. package/skills/humanish/SKILL.md +3 -2
  450. package/skills/humanish/agents/openai.yaml +1 -1
  451. package/dist/deprecated.d.ts +0 -90
  452. package/dist/deprecated.js +0 -106
  453. package/dist/lab/bag-overrides.d.ts +0 -18
  454. package/dist/lab/bag-overrides.js +0 -121
  455. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  456. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  457. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  458. /package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +0 -0
  459. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -1,32 +1,39 @@
1
- // The model side of one computer-use lane: the provider a local agent brings, the session options
1
+ // The model side of one computer-use participant: the provider a local agent brings, the session options
2
2
  // the loop runs with, the study's shared spend ledger, the provider cleanup, and the checks on the
3
- // finished session. The desktop side stays with the lane runner.
3
+ // finished session. The desktop side stays with the participant runner.
4
4
  import { startClaudeSession } from "../../actors/local-agent/claude-session.js";
5
5
  import { createLocalAgentProvider } from "../../actors/local-agent/cli.js";
6
- import { DEFAULT_OPENAI_CU_MODEL } from "../../actors/computer-use/openai-provider.js";
6
+ import { pricedModel } from "../../lab/plan-base.js";
7
7
  import { estimateActorCostForExecution, round6 } from "../../run/pricing.js";
8
8
  import { redactText } from "../../evidence/redaction.js";
9
- import { createRestrictedCodexParticipant } from "../../actors/codex/restricted-participant.js";
9
+ import { createRestrictedCodexParticipant, } from "../../actors/codex/restricted-participant.js";
10
10
  import { writeContainedOutputFile } from "../../run/contained-output.js";
11
11
  import { withInboxMission } from "./participant-prompt.js";
12
12
  import { resolveSelfReportedBlocker, resolveSelfReportedFriction, sessionEnding, } from "./self-report.js";
13
13
  import { hollowCompletion } from "../../run/judge.js";
14
- import { legacyHookSpecOf } from "./legacy-lane-spec.js";
15
- /** Starts the lane's model: a caller's provider, the operator's Codex, a Claude session, or none. */
14
+ // Caller providers backed by a native Codex session (the local study's), with their close report.
15
+ const closeReports = new WeakMap();
16
+ /**
17
+ * Registers a caller's provider as backed by a native Codex session: the participant runner reads the session's
18
+ * run warnings and a refusal no request reported from `report` when it closes the provider.
19
+ */
20
+ export function withCloseReport(provider, report) {
21
+ closeReports.set(provider, report);
22
+ return provider;
23
+ }
24
+ /** Starts the participant's model: a caller's provider, the operator's Codex, a Claude session, or none. */
16
25
  export async function startParticipantModel(spec, deps, executor) {
17
- const { config, env } = deps;
18
- if (deps.hooks.buildProvider) {
19
- return {
20
- provider: await deps.hooks.buildProvider({
21
- config,
22
- actor: deps.descriptor,
23
- lane: legacyHookSpecOf(spec),
24
- laneCount: deps.participantCount,
25
- executor,
26
- }),
26
+ const { env, brain } = deps;
27
+ if (deps.createProvider) {
28
+ const participant = {
29
+ id: spec.planned.id,
30
+ index: spec.planned.index,
31
+ count: deps.participantCount,
27
32
  };
33
+ return { provider: await deps.createProvider(participant, executor) };
28
34
  }
29
- if (deps.localAgent === "codex") {
35
+ const localAgent = brain.kind === "local-agent" ? brain.agent : undefined;
36
+ if (localAgent === "codex") {
30
37
  // Hosted local-agent studies use the same native participant engine as local desktops.
31
38
  // Operator auth deliberately retains the operator's Codex home, config and supported auth
32
39
  // stores instead of applying the isolated restricted-account profile used by local studies.
@@ -35,13 +42,13 @@ export async function startParticipantModel(spec, deps, executor) {
35
42
  ...(spec.planned.limits.reasoningEffort === undefined
36
43
  ? {}
37
44
  : { reasoningEffort: spec.planned.limits.reasoningEffort }),
38
- ...(config.actors[0]?.model === undefined ? {} : { model: config.actors[0].model }),
45
+ ...(brain.declaredModel === undefined ? {} : { model: brain.declaredModel }),
39
46
  ...(executor.speechEnabled === true ? { speechEnabled: true } : {}),
40
47
  session: { env },
41
48
  });
42
49
  return { provider: codexParticipant.provider, codexParticipant };
43
50
  }
44
- if (deps.localAgent === "claude") {
51
+ if (localAgent === "claude") {
45
52
  // One session for the whole run, like the codex thread above (#520). The one-shot
46
53
  // provider (createLocalAgentProvider) spawned `claude -p` per turn, and every turn
47
54
  // started with no memory of the last. HUMANISH_LOCAL_AGENT_ONE_SHOT=1 keeps that path
@@ -58,7 +65,7 @@ export async function startParticipantModel(spec, deps, executor) {
58
65
  ...(spec.planned.limits.reasoningEffort === undefined
59
66
  ? {}
60
67
  : { reasoningEffort: spec.planned.limits.reasoningEffort }),
61
- ...(config.actors[0]?.model === undefined ? {} : { model: config.actors[0].model }),
68
+ ...(brain.declaredModel === undefined ? {} : { model: brain.declaredModel }),
62
69
  }),
63
70
  };
64
71
  }
@@ -66,22 +73,21 @@ export async function startParticipantModel(spec, deps, executor) {
66
73
  ...(spec.planned.limits.reasoningEffort === undefined
67
74
  ? {}
68
75
  : { reasoningEffort: spec.planned.limits.reasoningEffort }),
69
- ...(config.actors[0]?.model === undefined ? {} : { model: config.actors[0].model }),
76
+ ...(brain.declaredModel === undefined ? {} : { model: brain.declaredModel }),
70
77
  });
71
78
  return { provider: claudeSession.provider, claudeSession };
72
79
  }
73
80
  return {};
74
81
  }
75
- /** The options the lane's session runs with: prompt, model settings, spend caps and callbacks. */
82
+ /** The options the participant's session runs with: prompt, model settings, spend caps and callbacks. */
76
83
  export function participantSessionOptions(spec, deps, ready, provider, writeScreenshot) {
77
- const { config } = deps;
78
84
  const { executor, inbox } = ready;
79
85
  // The FAIL-CLOSED spend cap (execution.caps.maxUsd) is wired into the loop as maxUsd + an
80
86
  // injected pure per-turn estimator keyed on the resolved model. Preflight already refused a
81
87
  // cap on an unpriced model, so the estimate is measurable whenever a cap is in force. The
82
88
  // model id here matches provider.version (openai-responses-cu resolves the default when unset).
83
- const capModelId = config.actors[0]?.model ?? DEFAULT_OPENAI_CU_MODEL;
84
- const maxUsd = config.execution?.caps?.maxUsd;
89
+ const capModelId = pricedModel(deps.brain);
90
+ const maxUsd = deps.caps.maxUsd;
85
91
  return {
86
92
  instructions: inbox
87
93
  ? withInboxMission(spec, inbox.url, inbox.address, inbox.receiving).instructions
@@ -94,8 +100,9 @@ export function participantSessionOptions(spec, deps, ready, provider, writeScre
94
100
  ...(provider === undefined ? {} : { provider: provider }),
95
101
  openai: {
96
102
  apiKey: deps.openaiApiKey,
97
- ...(config.actors[0]?.model ? { model: config.actors[0].model } : {}),
98
- // Per-LANE, not per-actor: two lanes at different efforts is the control this exists for.
103
+ ...(deps.brain.declaredModel ? { model: deps.brain.declaredModel } : {}),
104
+ // Per-participant, not per-actor: two participants at different efforts is the control this
105
+ // exists for.
99
106
  ...(spec.planned.limits.reasoningEffort === undefined
100
107
  ? {}
101
108
  : { reasoningEffort: spec.planned.limits.reasoningEffort }),
@@ -122,8 +129,9 @@ export function participantSessionOptions(spec, deps, ready, provider, writeScre
122
129
  : { stopWhen: spec.planned.limits.stopWhen }),
123
130
  ...(spec.planned.limits.dwell === undefined ? {} : { dwell: spec.planned.limits.dwell }),
124
131
  ...(spec.planned.tasks === undefined ? {} : { tasks: spec.planned.tasks }),
125
- // The STUDY budget (#299): this lane notes its own running estimate on the shared ledger
126
- // and stops when the RUN total crosses the cap — independent of the per-lane maxUsd above.
132
+ // The STUDY budget (#299): this participant notes its own running estimate on the shared
133
+ // ledger and stops when the RUN total crosses the cap — independent of the per-participant
134
+ // maxUsd above.
127
135
  ...(deps.runBudget === undefined
128
136
  ? {}
129
137
  : {
@@ -141,18 +149,19 @@ export function participantSessionOptions(spec, deps, ready, provider, writeScre
141
149
  ...(deps.onTrace === undefined
142
150
  ? {}
143
151
  : {
144
- // Forwards the RUNNING usage as well: the lane is where both are known, and usage
152
+ // Forwards the RUNNING usage as well: the participant runner is where both are known, and usage
145
153
  // without it never reaches the flush — which is how the live cost stayed unknown.
146
154
  onTrace: (items, usage, metadata) => deps.onTrace?.(spec.planned.id, items, usage, metadata),
147
155
  }),
148
156
  };
149
157
  }
150
158
  /**
151
- * Closes the lane's model, in the order it was opened. Returns true when a provider's cleanup is
159
+ * Closes the participant's model, in the order it was opened. Returns true when a provider's cleanup is
152
160
  * unconfirmed; each failure also adds a warning.
153
161
  */
154
162
  export async function closeParticipantModel(model, warnings) {
155
163
  let unconfirmed = false;
164
+ let refusal;
156
165
  try {
157
166
  if (model.codexParticipant === undefined)
158
167
  await model.provider?.close?.();
@@ -163,6 +172,8 @@ export async function closeParticipantModel(model, warnings) {
163
172
  }
164
173
  try {
165
174
  const cleanup = await model.codexParticipant?.close();
175
+ warnings.push(...(cleanup?.warnings ?? []));
176
+ refusal = cleanup?.refusal;
166
177
  if (cleanup?.status === "unconfirmed") {
167
178
  warnings.push("Model provider cleanup is unconfirmed.");
168
179
  unconfirmed = true;
@@ -172,17 +183,31 @@ export async function closeParticipantModel(model, warnings) {
172
183
  warnings.push("Model provider cleanup is unconfirmed.");
173
184
  unconfirmed = true;
174
185
  }
186
+ const report = model.codexParticipant === undefined && model.provider !== undefined
187
+ ? closeReports.get(model.provider)
188
+ : undefined;
189
+ if (report) {
190
+ // The provider's own close reported cleanup above; this reads what its session found.
191
+ try {
192
+ const found = await report();
193
+ warnings.push(...(found.warnings ?? []));
194
+ refusal ??= found.refusal;
195
+ }
196
+ catch {
197
+ /* Cleanup was already reported through the provider's close. */
198
+ }
199
+ }
175
200
  try {
176
201
  await model.claudeSession?.close();
177
202
  }
178
203
  catch {
179
204
  warnings.push("Claude session cleanup failed; desktop cleanup will still run.");
180
205
  }
181
- return unconfirmed;
206
+ return { unconfirmed, refusal };
182
207
  }
183
208
  /** Prices the finished session's tokens onto its trace, writes the trace, and warns on raw screenshots. */
184
209
  export async function recordParticipantTrace(spec, deps, session, warnings) {
185
- // Per-lane model-token cost ESTIMATE, attached to the trace before it is persisted (the model
210
+ // Per-participant model-token cost ESTIMATE, attached to the trace before it is persisted (the model
186
211
  // id is authoritative here — provider.version). Kept at the lab boundary so the pure loop
187
212
  // never depends on the operator rate table. estimateActorCost declares absent (null) for an
188
213
  // unknown rate / missing usage rather than guessing.
@@ -15,8 +15,8 @@ export declare const DEFAULT_MISSION = "You are testing a web application. The b
15
15
  export declare const CLOSING_LINE_DIRECTIVE: string;
16
16
  /** The persona id a computer-use participant gets when neither it nor its actor names one. */
17
17
  export declare const FALLBACK_PERSONA_ID = "cua-operator";
18
- /** Compose one lane's actor prompt: persona line + device line + mission + per-lane steer.
19
- * At N=1 (homogeneous, no roster) this reproduces the prior composeInstructions byte-for-byte. */
18
+ /** Compose one participant's actor prompt: persona line + device line + mission + per-participant
19
+ * steer. At N=1 (homogeneous, no roster) this reproduces the prior composeInstructions byte-for-byte. */
20
20
  export declare function composeParticipantInstructions(args: {
21
21
  mission: string;
22
22
  persona?: string;
@@ -46,7 +46,7 @@ export declare function composeParticipantInstructions(args: {
46
46
  instructions: string;
47
47
  persona: ActorPersonaRef;
48
48
  };
49
- /** Runtime-inject the persona inbox instruction into a lane's prompt (#297 slice B). The inbox URL is a
49
+ /** Runtime-inject the persona inbox instruction into a participant's prompt (#297 slice B). The inbox URL is a
50
50
  * runtime loopback/getHost address (not secret), so — mirroring the lobby-code runtime injection — this
51
51
  * augments only the instructions the model receives; the authored prompt + its digest are unchanged.
52
52
  * Returns a new spec (never mutates). Shared by the CUA + concurrent shared-world routes. */
@@ -19,8 +19,8 @@ export const CLOSING_LINE_DIRECTIVE = "When you stop, make the FIRST line of you
19
19
  "Then, from the next line, say what you did, what confused you, and where you hesitated.";
20
20
  /** The persona id a computer-use participant gets when neither it nor its actor names one. */
21
21
  export const FALLBACK_PERSONA_ID = "cua-operator";
22
- /** Compose one lane's actor prompt: persona line + device line + mission + per-lane steer.
23
- * At N=1 (homogeneous, no roster) this reproduces the prior composeInstructions byte-for-byte. */
22
+ /** Compose one participant's actor prompt: persona line + device line + mission + per-participant
23
+ * steer. At N=1 (homogeneous, no roster) this reproduces the prior composeInstructions byte-for-byte. */
24
24
  export function composeParticipantInstructions(args) {
25
25
  const { name, preset } = args.device;
26
26
  const deviceLine = preset.isMobile
@@ -31,7 +31,7 @@ export function composeParticipantInstructions(args) {
31
31
  // be measured optimizes for the measurement instead of using the product (src/lab/tasks.ts).
32
32
  const taskLines = renderTaskPrompt(args.tasks ?? []);
33
33
  // A resolved persona contributes its compiled directives (friction tolerance, skill bias,
34
- // accessibility behavior, constraints) through the SAME persona.ts compiler the terminal lane
34
+ // accessibility behavior, constraints) through the SAME persona.ts compiler the terminal route
35
35
  // uses, so one persona file means one behavior across every route.
36
36
  const personaLine = args.resolvedPersona
37
37
  ? renderPersonaPromptSection(args.resolvedPersona)
@@ -64,7 +64,7 @@ export function composeParticipantInstructions(args) {
64
64
  },
65
65
  };
66
66
  }
67
- /** Runtime-inject the persona inbox instruction into a lane's prompt (#297 slice B). The inbox URL is a
67
+ /** Runtime-inject the persona inbox instruction into a participant's prompt (#297 slice B). The inbox URL is a
68
68
  * runtime loopback/getHost address (not secret), so — mirroring the lobby-code runtime injection — this
69
69
  * augments only the instructions the model receives; the authored prompt + its digest are unchanged.
70
70
  * Returns a new spec (never mutates). Shared by the CUA + concurrent shared-world routes. */
@@ -5,8 +5,8 @@ import { type RunRerunLineage } from "../../run/bundle.js";
5
5
  import type { PreparedSelectedOutputDirectory } from "../../run/contained-output.js";
6
6
  import { type CuaActorLabErrorCode, type CuaParticipantPlan, type CuaParticipantPlanEntry, type DesktopParticipantRun } from "./types.js";
7
7
  export declare function defaultSessionTimeoutMs(config: LabConfig): number;
8
- /** Per-lane sandbox deadline (each lane owns its own desktop). Mirrors the single-lane formula
9
- * verbatim so N=1 stays byte-stable: explicit sandboxTimeoutMs, else session budget + (clone
8
+ /** Per-participant sandbox deadline (each one owns its own desktop). Mirrors the
9
+ * single-participant formula verbatim so N=1 stays byte-stable: explicit sandboxTimeoutMs, else session budget + (clone
10
10
  * or local-tree: provision budget + Σ state-step budgets) + the server-side
11
11
  * reclamation buffer. Local-tree shares the clone route's provisioning budget: it swaps a
12
12
  * git clone for an upload+extract, but the shared install/build/state/start/probe pipeline
@@ -21,8 +21,8 @@ export declare function resolveParticipantSandboxMs(config: LabConfig): number;
21
21
  */
22
22
  export declare function boundedConcurrency(declared: number | undefined, participantCount: number): number;
23
23
  /**
24
- * Pure pre-flight plan resolver (runs in dry-run AND live). Returns the lane table, the
25
- * effective concurrency, the wave count, the per-lane session budget, and the worst-case total
24
+ * Pure pre-flight plan resolver (runs in dry-run AND live). Returns the participant table, the
25
+ * effective concurrency, the wave count, the per-participant session budget, and the worst-case total
26
26
  * sandbox-minutes — BEFORE any sandbox or provider call. The same plan appears in dry-run,
27
27
  * marked $0 (dryRun: true).
28
28
  */
@@ -32,7 +32,7 @@ export declare function resolveCuaParticipantPlan(config: LabConfig, opts?: {
32
32
  dryRun?: boolean;
33
33
  personas?: Map<string, ResolvedPersona>;
34
34
  }): CuaParticipantPlan;
35
- /** Print the lane plan to stderr BEFORE any sandbox/provider call (public-safe: ids, devices,
35
+ /** Print the participant plan to stderr BEFORE any sandbox/provider call (public-safe: ids, devices,
36
36
  * digests, and budgets only — no prompt text, no secrets). */
37
37
  export declare function emitPreflightPlan(participantPlan: CuaParticipantPlan, labId: string): void;
38
38
  export declare function formatParticipantPlanEntry(entry: CuaParticipantPlanEntry): string;
@@ -63,5 +63,5 @@ export declare function loadCuaParticipants(args: {
63
63
  code: CuaActorLabErrorCode;
64
64
  message: string;
65
65
  }>;
66
- /** Scrub known secret values from each lane's declarative snapshot before any bundle uses it. */
66
+ /** Scrub known secret values from each participant's declarative snapshot before any bundle uses it. */
67
67
  export declare function sanitizeParticipantRuns(runs: readonly DesktopParticipantRun[], scrub: (text: string) => string): void;
@@ -26,8 +26,8 @@ export function defaultSessionTimeoutMs(config) {
26
26
  const room = MAX_SANDBOX_MS - SUBJECT_PROVISION_BUDGET_MS - stateBudgetMs - SANDBOX_TIMEOUT_BUFFER_MS;
27
27
  return Math.max(MIN_DERIVED_SESSION_TIMEOUT_MS, Math.min(DEFAULT_APP_URL_SESSION_TIMEOUT_MS, room));
28
28
  }
29
- /** Per-lane sandbox deadline (each lane owns its own desktop). Mirrors the single-lane formula
30
- * verbatim so N=1 stays byte-stable: explicit sandboxTimeoutMs, else session budget + (clone
29
+ /** Per-participant sandbox deadline (each one owns its own desktop). Mirrors the
30
+ * single-participant formula verbatim so N=1 stays byte-stable: explicit sandboxTimeoutMs, else session budget + (clone
31
31
  * or local-tree: provision budget + Σ state-step budgets) + the server-side
32
32
  * reclamation buffer. Local-tree shares the clone route's provisioning budget: it swaps a
33
33
  * git clone for an upload+extract, but the shared install/build/state/start/probe pipeline
@@ -162,8 +162,8 @@ function participantRunsAndPlan(planned, opts = {}) {
162
162
  return { runs, participantPlan };
163
163
  }
164
164
  /**
165
- * Pure pre-flight plan resolver (runs in dry-run AND live). Returns the lane table, the
166
- * effective concurrency, the wave count, the per-lane session budget, and the worst-case total
165
+ * Pure pre-flight plan resolver (runs in dry-run AND live). Returns the participant table, the
166
+ * effective concurrency, the wave count, the per-participant session budget, and the worst-case total
167
167
  * sandbox-minutes — BEFORE any sandbox or provider call. The same plan appears in dry-run,
168
168
  * marked $0 (dryRun: true).
169
169
  */
@@ -171,11 +171,11 @@ export function resolveCuaParticipantPlan(config, opts = {}) {
171
171
  const { countOverride, ...rest } = opts;
172
172
  return participantRunsAndPlan(plannedParticipantsOf(config, countOverride), rest).participantPlan;
173
173
  }
174
- /** Print the lane plan to stderr BEFORE any sandbox/provider call (public-safe: ids, devices,
174
+ /** Print the participant plan to stderr BEFORE any sandbox/provider call (public-safe: ids, devices,
175
175
  * digests, and budgets only — no prompt text, no secrets). */
176
176
  export function emitPreflightPlan(participantPlan, labId) {
177
177
  const lines = [];
178
- lines.push(`humanish cua fan-out plan (${labId}): ${participantPlan.laneCount} participant(s), strategy ${participantPlan.strategy}, concurrency ${participantPlan.concurrency}${participantPlan.envLoweredConcurrencyFrom === undefined ? "" : ` (lowered from ${participantPlan.envLoweredConcurrencyFrom} by ${CUA_MAX_CONCURRENCY_ENV})`}, ${participantPlan.waves} wave(s).`);
178
+ lines.push(`humanish computer-use fan-out plan (${labId}): ${participantPlan.laneCount} participant(s), strategy ${participantPlan.strategy}, concurrency ${participantPlan.concurrency}${participantPlan.envLoweredConcurrencyFrom === undefined ? "" : ` (lowered from ${participantPlan.envLoweredConcurrencyFrom} by ${CUA_MAX_CONCURRENCY_ENV})`}, ${participantPlan.waves} wave(s).`);
179
179
  lines.push(` session budget ${Math.round(participantPlan.perLaneSessionBudgetMs / 1000)}s per participant; worst-case ~${participantPlan.worstCaseSandboxMinutes} sandbox-minutes total${participantPlan.dryRun ? " (dry-run: $0)" : ""}.`);
180
180
  for (const entry of participantPlan.lanes) {
181
181
  lines.push(` - ${formatParticipantPlanEntry(entry)}`);
@@ -212,7 +212,7 @@ export async function compileParticipantPersonas(projectRoot, personaIds) {
212
212
  export async function loadCuaParticipants(args) {
213
213
  const { plan } = args;
214
214
  const { participants } = plan.runner;
215
- // Compile any committed personas BEFORE planning, so the plan builder stays pure and each lane's
215
+ // Compile any committed personas BEFORE planning, so the plan builder stays pure and each participant's
216
216
  // prompt carries real behavioral directives rather than a bare `Persona: <id>.` label (#381).
217
217
  const personas = await compileParticipantPersonas(args.projectRoot, participants.map((participant) => participant.personaId));
218
218
  const { runs: participantRuns, participantPlan } = participantRunsAndPlan({
@@ -244,7 +244,7 @@ export async function loadCuaParticipants(args) {
244
244
  rerunLineage: selected.rerun,
245
245
  };
246
246
  }
247
- /** Scrub known secret values from each lane's declarative snapshot before any bundle uses it. */
247
+ /** Scrub known secret values from each participant's declarative snapshot before any bundle uses it. */
248
248
  export function sanitizeParticipantRuns(runs, scrub) {
249
249
  for (const spec of runs) {
250
250
  if (spec.evidenceAssignment)
@@ -1,14 +1,13 @@
1
1
  import { type CuaActorDescriptor } from "../../actors/registry.js";
2
- import type { ComputerUsePlan, RoutePlanResult, RouteRefusal } from "../../lab/plan-types.js";
3
- import type { LabConfig, LabSubjectServe, LabSubjectState } from "../../lab/types.js";
4
- import type { RunLabProvenance } from "../../run/status.js";
5
- import { type CuaActorLabErrorCode, type CuaActorLabHooks, type RunCuaActorLabOptions } from "./types.js";
2
+ import type { ComputerUsePlan, ComputerUseRunner, RoutePlanResult, RouteRefusal } from "../../lab/plan-types.js";
3
+ import type { LabConfig, LabSubjectState } from "../../lab/types.js";
4
+ import { type CuaActorLabErrorCode, type RunCuaActorLabOptions } from "./types.js";
6
5
  /** The error a computer-use lab returns before a run starts. */
7
6
  export interface ComputerUseRefusal extends RouteRefusal<"computer-use", CuaActorLabErrorCode> {
8
7
  /**
9
8
  * Where the route returns it. "before-scope": analysis and tasks, returned before the run scope
10
9
  * with no automatic-analysis record. "in-scope": after the cwd checks. "after-personas": after
11
- * the route reads committed persona files, so a persona-file error still wins over the lane cap
10
+ * the route reads committed persona files, so a persona-file error still wins over the participant cap
12
11
  * and in-process fan-out.
13
12
  */
14
13
  readonly stage: "before-scope" | "in-scope" | "after-personas";
@@ -18,39 +17,32 @@ export interface ComputerUseRefusal extends RouteRefusal<"computer-use", CuaActo
18
17
  export type ComputerUsePlanResult = RoutePlanResult<ComputerUsePlan, ComputerUseRefusal>;
19
18
  /** The registered descriptor for a planned actor id; planComputerUseLab checked the registry. */
20
19
  export declare function cuaDescriptorOf(actor: string): CuaActorDescriptor;
21
- /** Which subject route a computer-use lab takes, derived once from its config and hooks. */
22
- export interface CuaSubjectRoute {
23
- cloneRoute: boolean;
24
- /** A CLI studied at a desktop: nothing cloned, no browser, a terminal instead. */
25
- desktopCliRoute: boolean;
26
- localTreeRoute: boolean;
27
- /**
28
- * Clone and local-tree both provision the subject in-sandbox (clone via git, local-tree via
29
- * pack+upload) and share the install/build/state/start/probe pipeline, so every seam that gates
30
- * on "does this route provision a subject" is keyed on this union.
31
- */
32
- provisionedRoute: boolean;
33
- localAppSubject: boolean;
34
- /** A caller-supplied executor drives the subject in-process; no desktop is created. */
35
- inProcessRoute: boolean;
36
- serve: LabSubjectServe | undefined;
37
- appUrl: string;
38
- subjectRepo: string | undefined;
39
- subjectEnvNames: string[];
20
+ /** Which of the caller's driving homes, createProvider and inProcess, a run has. */
21
+ export interface CallerDriving {
22
+ readonly inProcess: boolean;
23
+ readonly createProvider: boolean;
40
24
  }
41
- export declare function cuaSubjectRoute(config: LabConfig, hooks: CuaActorLabHooks): CuaSubjectRoute;
25
+ /** The driving a computer-use run's options carry. */
26
+ export declare function callerDrivingOf(options: {
27
+ readonly inProcess?: unknown;
28
+ readonly createProvider?: unknown;
29
+ }): CallerDriving;
42
30
  /** The state a planned run's provisioned subject declares. Other subjects declare none. */
43
31
  export declare function cuaDeclaredState(plan: ComputerUsePlan): LabSubjectState | undefined;
44
- /** The route facts a planned run takes: its runner's desktop and subject. */
45
- export declare function cuaSubjectRouteOf(plan: ComputerUsePlan): CuaSubjectRoute;
32
+ /** The URL a refused lab's result names, from its declaration: a provisioned subject's serve URL. */
33
+ export declare function declaredAppUrl(config: LabConfig): string;
34
+ /** The URL a planned run's participants open: a provisioned subject's served URL, else its own. */
35
+ export declare function plannedAppUrl(subject: ComputerUseRunner["subject"]): string;
46
36
  /**
47
37
  * Plan a computer-use lab. It is called for any config handed to the computer-use runner, not only
48
38
  * one routeOf sends here, so a config for another route gets this route's refusal.
49
39
  */
50
40
  export declare function planComputerUseLab(config: LabConfig, input: {
51
41
  readonly dryRun: boolean;
52
- readonly lab?: RunLabProvenance;
53
- readonly hooks?: CuaActorLabHooks;
42
+ /** Whether deps.runSession is set: a caller's session runner cannot enforce maxOutputTokens. */
43
+ readonly hasRunSession?: boolean;
44
+ /** Which of the caller's driving homes are set; neither when absent. */
45
+ readonly driving?: CallerDriving;
54
46
  readonly countOverride?: number;
55
47
  readonly rerun?: RunCuaActorLabOptions["rerun"];
56
48
  }): ComputerUsePlanResult;