humanish 0.106.1 → 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 (453) hide show
  1. package/AGENTS.md +4 -4
  2. package/ARCHITECTURE.md +17 -16
  3. package/CHANGELOG.md +14 -0
  4. package/CONTEXT.md +42 -39
  5. package/CONTRIBUTING.md +8 -8
  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 +30 -3
  16. package/dist/actors/codex/qualified-versions.js +50 -5
  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 +9 -7
  45. package/dist/actors/local-agent/cli.js +1 -1
  46. package/dist/actors/scripted-browser/actor.d.ts +2 -2
  47. package/dist/actors/scripted-browser/journey.js +15 -4
  48. package/dist/actors/scripted-browser/steps.js +18 -0
  49. package/dist/actors/scripted-browser/types.d.ts +11 -1
  50. package/dist/actors/stop-conditions.js +1 -3
  51. package/dist/analysis/automatic-completion.d.ts +13 -8
  52. package/dist/analysis/automatic-completion.js +14 -8
  53. package/dist/analysis/automatic-config.d.ts +1 -1
  54. package/dist/analysis/automatic-config.js +2 -2
  55. package/dist/analysis/automatic.d.ts +10 -4
  56. package/dist/analysis/automatic.js +17 -13
  57. package/dist/analysis/diagnostics.d.ts +23 -0
  58. package/dist/analysis/diagnostics.js +112 -0
  59. package/dist/analysis/evidence-sources.js +2 -2
  60. package/dist/analysis/evidence.js +6 -6
  61. package/dist/analysis/execute.d.ts +7 -1
  62. package/dist/analysis/execute.js +39 -12
  63. package/dist/analysis/job.d.ts +8 -5
  64. package/dist/analysis/job.js +15 -14
  65. package/dist/analysis/load.d.ts +1 -1
  66. package/dist/analysis/load.js +5 -5
  67. package/dist/analysis/provider.d.ts +9 -1
  68. package/dist/analysis/restricted-codex.d.ts +2 -0
  69. package/dist/analysis/restricted-codex.js +10 -1
  70. package/dist/analysis/service.d.ts +2 -0
  71. package/dist/analysis/service.js +31 -12
  72. package/dist/analysis/sharing.d.ts +2 -2
  73. package/dist/analysis/sharing.js +5 -5
  74. package/dist/analysis/store-executions.d.ts +5 -5
  75. package/dist/analysis/store-executions.js +12 -12
  76. package/dist/analysis/store.d.ts +4 -4
  77. package/dist/analysis/store.js +13 -13
  78. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  79. package/dist/cli/commands/analysis-signals.js +4 -1
  80. package/dist/cli/commands/analyze.js +4 -2
  81. package/dist/cli/commands/comms.js +8 -1
  82. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  83. package/dist/cli/commands/lab-route-computer-use.js +26 -14
  84. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  85. package/dist/cli/commands/lab-route-preview.js +3 -4
  86. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  87. package/dist/cli/commands/lab-route-run.js +6 -2
  88. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  89. package/dist/cli/commands/lab-route-scripted.js +0 -1
  90. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  91. package/dist/cli/commands/lab-route-shared-world.js +0 -1
  92. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  93. package/dist/cli/commands/lab-route-terminal.js +0 -1
  94. package/dist/cli/commands/lab-run.js +76 -45
  95. package/dist/cli/commands/lab-scorer.d.ts +0 -2
  96. package/dist/cli/commands/lab.js +12 -6
  97. package/dist/cli/commands/observe.js +22 -0
  98. package/dist/cli/commands/run-signals.d.ts +30 -0
  99. package/dist/cli/commands/run-signals.js +146 -0
  100. package/dist/cli/commands/runs.js +10 -8
  101. package/dist/cli/commands/watch.js +12 -10
  102. package/dist/cli/doctor.d.ts +3 -0
  103. package/dist/cli/doctor.js +10 -2
  104. package/dist/cli/io.d.ts +5 -4
  105. package/dist/cli/io.js +12 -8
  106. package/dist/cli/program.js +3 -3
  107. package/dist/cli/renamed-options.d.ts +11 -0
  108. package/dist/cli/renamed-options.js +18 -0
  109. package/dist/cli/telemetry.d.ts +2 -2
  110. package/dist/cli/telemetry.js +1 -1
  111. package/dist/comms/capture-surface.d.ts +1 -1
  112. package/dist/comms/catch-host.d.ts +1 -1
  113. package/dist/comms/connections.js +4 -4
  114. package/dist/comms/external-evidence.d.ts +27 -0
  115. package/dist/comms/external-evidence.js +93 -0
  116. package/dist/comms/lease-store.js +7 -7
  117. package/dist/comms/types.js +1 -1
  118. package/dist/evidence/browser-hygiene.d.ts +1 -1
  119. package/dist/evidence/browser-hygiene.js +1 -1
  120. package/dist/evidence/redaction.js +1 -1
  121. package/dist/evidence/secret-scrub.d.ts +9 -0
  122. package/dist/evidence/secret-scrub.js +96 -0
  123. package/dist/feedback/draft.js +7 -9
  124. package/dist/feedback/export-bundle.js +4 -4
  125. package/dist/feedback/export.js +9 -9
  126. package/dist/feedback/feedback.d.ts +1 -1
  127. package/dist/index.d.ts +3 -6
  128. package/dist/index.js +3 -6
  129. package/dist/keys/key-resolution.d.ts +3 -1
  130. package/dist/keys/key-resolution.js +18 -16
  131. package/dist/lab/adapter-extension.d.ts +28 -6
  132. package/dist/lab/adapter-extension.js +65 -126
  133. package/dist/lab/adapter-scorer-loader.d.ts +25 -5
  134. package/dist/lab/adapter-scorer-loader.js +24 -0
  135. package/dist/lab/composition-rules.js +20 -20
  136. package/dist/lab/config.js +28 -26
  137. package/dist/lab/device-presets.d.ts +2 -2
  138. package/dist/lab/discover.js +1 -3
  139. package/dist/lab/doctor.d.ts +44 -9
  140. package/dist/lab/doctor.js +149 -41
  141. package/dist/lab/init-plan.js +1 -3
  142. package/dist/lab/keys.js +1 -1
  143. package/dist/lab/lab-deps.d.ts +85 -0
  144. package/dist/lab/lab-deps.js +4 -0
  145. package/dist/lab/parse/actors.js +8 -7
  146. package/dist/lab/parse/comms.js +3 -2
  147. package/dist/lab/parse/execution.js +3 -2
  148. package/dist/lab/parse/subject-state.js +2 -1
  149. package/dist/lab/parse/subject.js +2 -1
  150. package/dist/lab/parse/values.d.ts +0 -1
  151. package/dist/lab/parse/values.js +0 -3
  152. package/dist/lab/persona-resolve.d.ts +3 -3
  153. package/dist/lab/persona-resolve.js +4 -4
  154. package/dist/lab/persona.js +1 -3
  155. package/dist/lab/plan-base.d.ts +0 -2
  156. package/dist/lab/plan-base.js +6 -4
  157. package/dist/lab/plan-participants.d.ts +5 -5
  158. package/dist/lab/plan-participants.js +2 -2
  159. package/dist/lab/plan-types.d.ts +22 -4
  160. package/dist/lab/plan.d.ts +3 -11
  161. package/dist/lab/plan.js +18 -42
  162. package/dist/lab/preflight-result.js +0 -2
  163. package/dist/lab/preflight.d.ts +0 -3
  164. package/dist/lab/preflight.js +1 -1
  165. package/dist/lab/requirements.d.ts +20 -0
  166. package/dist/lab/requirements.js +54 -0
  167. package/dist/lab/route-inputs.d.ts +23 -12
  168. package/dist/lab/route-inputs.js +48 -51
  169. package/dist/lab/routing.d.ts +19 -24
  170. package/dist/lab/routing.js +14 -47
  171. package/dist/lab/run-lab-events.d.ts +6 -11
  172. package/dist/lab/run-lab-events.js +3 -11
  173. package/dist/lab/run-lab-homes.d.ts +64 -0
  174. package/dist/lab/run-lab-homes.js +3 -0
  175. package/dist/lab/run-lab-options.d.ts +12 -66
  176. package/dist/lab/run-lab-options.js +45 -275
  177. package/dist/lab/summary.d.ts +9 -4
  178. package/dist/lab/summary.js +15 -8
  179. package/dist/lab/types.d.ts +132 -132
  180. package/dist/lab/validation.d.ts +15 -15
  181. package/dist/lab/validation.js +28 -28
  182. package/dist/lab/warnings.js +20 -19
  183. package/dist/observer/artifact.d.ts +1 -1
  184. package/dist/observer/artifact.js +3 -3
  185. package/dist/observer/data.js +2 -2
  186. package/dist/observer/render.js +2 -2
  187. package/dist/observer/run-routes.d.ts +1 -1
  188. package/dist/observer/run-routes.js +5 -5
  189. package/dist/observer/serve.d.ts +17 -0
  190. package/dist/observer/serve.js +34 -3
  191. package/dist/routes/computer-use/bundle-parts.d.ts +1 -1
  192. package/dist/routes/computer-use/bundle-parts.js +10 -3
  193. package/dist/routes/computer-use/bundle.d.ts +4 -11
  194. package/dist/routes/computer-use/bundle.js +9 -15
  195. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  196. package/dist/routes/computer-use/diagnostics.js +1 -1
  197. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +10 -10
  198. package/dist/routes/computer-use/e2b-desktop/comms.js +11 -14
  199. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  200. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -7
  201. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +13 -13
  202. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -11
  203. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  204. package/dist/routes/computer-use/e2b-desktop/prepare.js +33 -36
  205. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  206. package/dist/routes/computer-use/e2b-desktop/start.js +24 -23
  207. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  208. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  209. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  210. package/dist/routes/computer-use/e2b-desktop/teardown.js +29 -17
  211. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  212. package/dist/routes/computer-use/external-comms.js +19 -43
  213. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  214. package/dist/routes/computer-use/fanout-bundle.js +25 -29
  215. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +25 -19
  216. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  217. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  218. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  219. package/dist/routes/computer-use/live-flush.js +19 -27
  220. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +12 -11
  221. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  222. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  223. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  224. package/dist/routes/computer-use/local-vm.js +39 -66
  225. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  226. package/dist/routes/computer-use/participant-desktop.js +5 -25
  227. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +10 -10
  228. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +35 -22
  229. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  230. package/dist/routes/computer-use/participant-facts.js +12 -1
  231. package/dist/routes/computer-use/participant-model.d.ts +19 -11
  232. package/dist/routes/computer-use/participant-model.js +49 -25
  233. package/dist/routes/computer-use/participant-prompt.d.ts +3 -3
  234. package/dist/routes/computer-use/participant-prompt.js +4 -4
  235. package/dist/routes/computer-use/participant-runs.d.ts +6 -6
  236. package/dist/routes/computer-use/participant-runs.js +8 -8
  237. package/dist/routes/computer-use/plan.d.ts +21 -29
  238. package/dist/routes/computer-use/plan.js +52 -60
  239. package/dist/routes/computer-use/preflight.d.ts +3 -5
  240. package/dist/routes/computer-use/preflight.js +20 -16
  241. package/dist/routes/computer-use/rerun-selection.js +10 -6
  242. package/dist/routes/computer-use/result.d.ts +1 -1
  243. package/dist/routes/computer-use/result.js +40 -30
  244. package/dist/routes/computer-use/route.d.ts +3 -4
  245. package/dist/routes/computer-use/route.js +21 -19
  246. package/dist/routes/computer-use/self-report.d.ts +2 -2
  247. package/dist/routes/computer-use/self-report.js +4 -4
  248. package/dist/routes/computer-use/setup.d.ts +8 -14
  249. package/dist/routes/computer-use/setup.js +96 -72
  250. package/dist/routes/computer-use/single-bundle.d.ts +8 -11
  251. package/dist/routes/computer-use/single-bundle.js +20 -25
  252. package/dist/routes/computer-use/subject-projection.d.ts +5 -7
  253. package/dist/routes/computer-use/subject-projection.js +20 -19
  254. package/dist/routes/computer-use/types.d.ts +169 -210
  255. package/dist/routes/computer-use/types.js +13 -5
  256. package/dist/routes/preview.js +0 -1
  257. package/dist/routes/scripted/bundle.d.ts +3 -6
  258. package/dist/routes/scripted/bundle.js +11 -16
  259. package/dist/routes/scripted/plan.d.ts +5 -7
  260. package/dist/routes/scripted/plan.js +6 -4
  261. package/dist/routes/scripted/result.d.ts +4 -1
  262. package/dist/routes/scripted/result.js +10 -6
  263. package/dist/routes/scripted/route.js +10 -11
  264. package/dist/routes/scripted/scenario.d.ts +1 -1
  265. package/dist/routes/scripted/scenario.js +1 -1
  266. package/dist/routes/scripted/setup.d.ts +3 -2
  267. package/dist/routes/scripted/setup.js +22 -21
  268. package/dist/routes/scripted/subject.d.ts +8 -3
  269. package/dist/routes/scripted/subject.js +9 -5
  270. package/dist/routes/scripted/surface-records.js +1 -1
  271. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  272. package/dist/routes/scripted/surface-sessions.js +4 -4
  273. package/dist/routes/scripted/types.d.ts +19 -36
  274. package/dist/routes/scripted/types.js +1 -2
  275. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +8 -8
  276. package/dist/routes/shared-world/bundle.d.ts +2 -2
  277. package/dist/routes/shared-world/bundle.js +22 -26
  278. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  279. package/dist/routes/shared-world/checkpoints.js +4 -4
  280. package/dist/routes/shared-world/comms.d.ts +5 -4
  281. package/dist/routes/shared-world/comms.js +28 -41
  282. package/dist/routes/shared-world/external-public.d.ts +5 -5
  283. package/dist/routes/shared-world/external-public.js +19 -20
  284. package/dist/routes/shared-world/handoff.d.ts +4 -4
  285. package/dist/routes/shared-world/handoff.js +50 -50
  286. package/dist/routes/shared-world/lobby-code.d.ts +5 -5
  287. package/dist/routes/shared-world/lobby-code.js +13 -13
  288. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +8 -6
  289. package/dist/routes/shared-world/{seats.js → participant-specs.js} +43 -48
  290. package/dist/routes/shared-world/plan.d.ts +2 -6
  291. package/dist/routes/shared-world/plan.js +1 -2
  292. package/dist/routes/shared-world/provenance.d.ts +4 -4
  293. package/dist/routes/shared-world/provenance.js +4 -4
  294. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  295. package/dist/routes/shared-world/provisioned.js +46 -40
  296. package/dist/routes/shared-world/result.js +31 -19
  297. package/dist/routes/shared-world/route.js +37 -41
  298. package/dist/routes/shared-world/setup.d.ts +5 -4
  299. package/dist/routes/shared-world/setup.js +12 -14
  300. package/dist/routes/shared-world/types.d.ts +53 -126
  301. package/dist/routes/shared-world/types.js +2 -2
  302. package/dist/routes/terminal/adapter.d.ts +8 -8
  303. package/dist/routes/terminal/adapter.js +28 -125
  304. package/dist/routes/terminal/bundle.d.ts +7 -12
  305. package/dist/routes/terminal/bundle.js +24 -34
  306. package/dist/routes/terminal/credentials.d.ts +2 -2
  307. package/dist/routes/terminal/credentials.js +16 -16
  308. package/dist/routes/terminal/dry-run.d.ts +1 -1
  309. package/dist/routes/terminal/dry-run.js +9 -11
  310. package/dist/routes/terminal/encoding.d.ts +1 -1
  311. package/dist/routes/terminal/encoding.js +2 -2
  312. package/dist/routes/terminal/ledger.d.ts +6 -6
  313. package/dist/routes/terminal/ledger.js +9 -9
  314. package/dist/routes/terminal/live-finish.d.ts +1 -2
  315. package/dist/routes/terminal/live-finish.js +21 -20
  316. package/dist/routes/terminal/live-sandbox.d.ts +3 -2
  317. package/dist/routes/terminal/live-sandbox.js +20 -20
  318. package/dist/routes/terminal/participant-text.d.ts +23 -0
  319. package/dist/routes/terminal/participant-text.js +165 -0
  320. package/dist/routes/terminal/plan.d.ts +2 -6
  321. package/dist/routes/terminal/plan.js +13 -9
  322. package/dist/routes/terminal/recorder.d.ts +6 -1
  323. package/dist/routes/terminal/recorder.js +12 -4
  324. package/dist/routes/terminal/result.js +4 -4
  325. package/dist/routes/terminal/route.js +26 -26
  326. package/dist/routes/terminal/runtime.d.ts +3 -2
  327. package/dist/routes/terminal/runtime.js +3 -3
  328. package/dist/routes/terminal/sandbox.d.ts +3 -3
  329. package/dist/routes/terminal/sandbox.js +9 -9
  330. package/dist/routes/terminal/session.js +16 -14
  331. package/dist/routes/terminal/token-usage.js +5 -5
  332. package/dist/routes/terminal/trace.d.ts +5 -8
  333. package/dist/routes/terminal/trace.js +9 -64
  334. package/dist/routes/terminal/types.d.ts +85 -93
  335. package/dist/routes/terminal/types.js +9 -4
  336. package/dist/run/active-runs.d.ts +13 -0
  337. package/dist/run/active-runs.js +12 -0
  338. package/dist/run/bundle-shape.d.ts +2 -1
  339. package/dist/run/bundle-shape.js +4 -4
  340. package/dist/run/bundle.d.ts +63 -56
  341. package/dist/run/bundle.js +9 -8
  342. package/dist/run/cost-summary.js +3 -2
  343. package/dist/run/costs.d.ts +6 -6
  344. package/dist/run/costs.js +10 -10
  345. package/dist/run/detail.d.ts +5 -5
  346. package/dist/run/detail.js +6 -6
  347. package/dist/run/dry-run.js +5 -12
  348. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  349. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  350. package/dist/run/feedback-shape.js +1 -1
  351. package/dist/run/judge.d.ts +16 -4
  352. package/dist/run/judge.js +24 -7
  353. package/dist/run/locate.d.ts +2 -0
  354. package/dist/run/locate.js +3 -1
  355. package/dist/run/outcomes.d.ts +3 -3
  356. package/dist/run/outcomes.js +3 -3
  357. package/dist/run/participant-records.d.ts +2 -2
  358. package/dist/run/participant-records.js +2 -2
  359. package/dist/run/paths.js +1 -1
  360. package/dist/run/pricing.d.ts +19 -9
  361. package/dist/run/pricing.js +30 -18
  362. package/dist/run/projection.d.ts +13 -13
  363. package/dist/run/projection.js +8 -8
  364. package/dist/run/reclaim.d.ts +6 -0
  365. package/dist/run/reclaim.js +13 -3
  366. package/dist/run/results.d.ts +1 -1
  367. package/dist/run/run-index.d.ts +1 -1
  368. package/dist/run/run-index.js +11 -11
  369. package/dist/run/run.d.ts +4 -2
  370. package/dist/run/run.js +9 -5
  371. package/dist/run/sandbox-receipts.d.ts +4 -4
  372. package/dist/run/sandbox-receipts.js +4 -4
  373. package/dist/run/shared-world-evidence.d.ts +47 -47
  374. package/dist/run/shared-world-shape.d.ts +3 -3
  375. package/dist/run/shared-world-shape.js +11 -11
  376. package/dist/run/stats.d.ts +5 -5
  377. package/dist/run/stats.js +8 -8
  378. package/dist/run/status.d.ts +16 -6
  379. package/dist/run/status.js +31 -8
  380. package/dist/run/streams.d.ts +26 -19
  381. package/dist/run/terminal-contract.d.ts +5 -5
  382. package/dist/run/terminal-contract.js +4 -4
  383. package/dist/run/transient-comms-secrets.d.ts +5 -0
  384. package/dist/run/transient-comms-secrets.js +12 -0
  385. package/dist/run-lab.d.ts +36 -34
  386. package/dist/run-lab.js +41 -37
  387. package/dist/subject/desktop-cli.d.ts +1 -1
  388. package/dist/subject/desktop-cli.js +1 -1
  389. package/dist/subject/local-tree-archive.d.ts +1 -1
  390. package/dist/subject/local-tree-archive.js +4 -4
  391. package/dist/subject/local-tree.d.ts +2 -2
  392. package/dist/subject/local-tree.js +1 -1
  393. package/dist/subject/node-bootstrap.d.ts +1 -1
  394. package/dist/subject/node-bootstrap.js +4 -4
  395. package/dist/subject/runtime.js +5 -5
  396. package/dist/subject/serve.js +1 -1
  397. package/dist/subject/steps.d.ts +4 -4
  398. package/dist/subject/steps.js +5 -5
  399. package/dist/substrates/e2b/cdp-probe.d.ts +2 -2
  400. package/dist/substrates/e2b/cdp-probe.js +1 -1
  401. package/dist/substrates/e2b/desktop-browser.d.ts +3 -3
  402. package/dist/substrates/e2b/desktop-browser.js +4 -4
  403. package/dist/substrates/e2b/desktop-cdp.d.ts +7 -7
  404. package/dist/substrates/e2b/desktop-cdp.js +4 -4
  405. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  406. package/dist/substrates/e2b/desktop-geometry.js +3 -3
  407. package/dist/substrates/e2b/desktop-media.js +2 -2
  408. package/dist/substrates/e2b/sandbox.js +1 -1
  409. package/dist/substrates/e2b/sdk.js +2 -2
  410. package/dist/substrates/local/runtime-host.d.ts +2 -0
  411. package/dist/substrates/local/runtime-host.js +6 -0
  412. package/dist/tui/actions.d.ts +7 -5
  413. package/dist/tui/actions.js +18 -9
  414. package/dist/tui-app.js +42 -42
  415. package/dist/verify/actor.d.ts +10 -10
  416. package/dist/verify/actor.js +15 -15
  417. package/dist/verify/artifacts.d.ts +1 -1
  418. package/dist/verify/artifacts.js +3 -3
  419. package/dist/verify/costs.d.ts +2 -2
  420. package/dist/verify/costs.js +2 -2
  421. package/dist/verify/liveness.d.ts +1 -1
  422. package/dist/verify/liveness.js +4 -1
  423. package/dist/verify/rerun.d.ts +1 -1
  424. package/dist/verify/rerun.js +1 -1
  425. package/dist/verify/shared-world.js +2 -2
  426. package/dist/verify/verify.js +6 -6
  427. package/docs/README.md +1 -1
  428. package/docs/architecture/actor-contract.md +60 -22
  429. package/docs/architecture/desktop-sessions.md +9 -9
  430. package/docs/architecture/external-public-shared-world.md +5 -0
  431. package/docs/architecture/observer.md +4 -4
  432. package/docs/architecture/restricted-codex-analysis.md +36 -2
  433. package/docs/architecture/state-driven-executor.md +4 -5
  434. package/docs/architecture/task-protocol-support.md +3 -5
  435. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +24 -16
  436. package/docs/contracts/run-bundle.md +10 -8
  437. package/docs/contracts/schemas.md +109 -53
  438. package/docs/contracts/study-analysis.md +24 -0
  439. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  440. package/docs/product/automatic-analysis.md +1 -0
  441. package/docs/ramp/README.md +2 -1
  442. package/package.json +4 -4
  443. package/skills/humanish/SKILL.md +3 -2
  444. package/skills/humanish/agents/openai.yaml +1 -1
  445. package/dist/deprecated.d.ts +0 -90
  446. package/dist/deprecated.js +0 -106
  447. package/dist/lab/bag-overrides.d.ts +0 -18
  448. package/dist/lab/bag-overrides.js +0 -121
  449. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  450. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  451. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  452. /package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +0 -0
  453. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -1,6 +1,6 @@
1
- // The computer-use run's setup: resolve the project and route, plan the lanes, make the live
2
- // checks that need no sandbox, pack a local tree, then start the run and build the lane deps and
3
- // bundle base that the lanes and the finish share.
1
+ // The computer-use run's setup: resolve the project and route, plan the participants, make the
2
+ // live checks that need no sandbox, pack a local tree, then start the run and build the
3
+ // participant deps and bundle base that the participants and the finish share.
4
4
  import { randomBytes } from "node:crypto";
5
5
  import { realpath } from "node:fs/promises";
6
6
  import path from "node:path";
@@ -15,14 +15,15 @@ import { emitPreflightPlan, compileParticipantPersonas, loadCuaParticipants, san
15
15
  import { makeCuaRunBudget } from "./participant-model.js";
16
16
  import { e2bRequestTimeoutMs } from "../../substrates/e2b/lifetime.js";
17
17
  import { liveCuaRejection } from "./preflight.js";
18
- import { cuaDescriptorOf, cuaSubjectRoute, cuaSubjectRouteOf, } from "./plan.js";
18
+ import { cuaDescriptorOf, declaredAppUrl, plannedAppUrl } from "./plan.js";
19
19
  import { trackRuntimeStreams } from "./live-flush.js";
20
+ import { participantOf, phaseEvent, planEvent } from "../../lab/run-lab-events.js";
21
+ import { defaultSubjectPhaseSink } from "../../subject/steps.js";
20
22
  import {} from "./bundle.js";
21
23
  import { packRunLocalTree } from "./local-tree-pack.js";
22
24
  import { projectParticipantSubjects, subjectProvenanceArg } from "./subject-projection.js";
23
- import { CUA_ACTOR_LAB_SCHEMA, } from "./types.js";
25
+ import { CUA_ACTOR_LAB_SCHEMA, participantSubjectEnv, } from "./types.js";
24
26
  import { labPersonaIds } from "../../lab/persona-resolve.js";
25
- import { participantDesktopOf } from "./participant-desktop.js";
26
27
  /** The physical project, bound before any caller hook runs. */
27
28
  async function bindProject(cwd) {
28
29
  // Capture the physical project before reading or invoking any caller hook. A supported
@@ -32,13 +33,12 @@ async function bindProject(cwd) {
32
33
  return prepareSelectedOutputDirectory(path.dirname(physicalCwd), physicalCwd);
33
34
  }
34
35
  /**
35
- * The envelope of a refusal the plan left for after the cwd checks. The lane cap and in-process
36
- * fan-out refusals come after the committed personas are read, so a persona-file error still wins.
36
+ * The envelope of a refusal the plan left for after the cwd checks. The participant cap and
37
+ * in-process fan-out refusals come after the committed personas are read, so a persona-file error still wins.
37
38
  */
38
39
  export async function refuseCuaLab(options, refusal) {
39
40
  const { config, dryRun } = options;
40
41
  const projectRoot = await bindProject(options.cwd);
41
- const hooks = options.hooks ?? {};
42
42
  // The committed personas are read before the refusal returns, so a persona-file error wins.
43
43
  if (refusal.stage === "after-personas")
44
44
  await compileParticipantPersonas(projectRoot, labPersonaIds(config));
@@ -48,7 +48,7 @@ export async function refuseCuaLab(options, refusal) {
48
48
  cwd: projectRoot.physicalPath,
49
49
  labId: config.id,
50
50
  actor: refusal.actor ?? config.actors[0]?.type ?? "",
51
- appUrl: cuaSubjectRoute(config, hooks).appUrl,
51
+ appUrl: declaredAppUrl(config),
52
52
  dryRun,
53
53
  runId: options.runId ?? "not-created",
54
54
  lanes: [],
@@ -66,11 +66,13 @@ export async function admitCuaRun(plan, input, config) {
66
66
  const { dryRun } = plan;
67
67
  const projectRoot = await bindProject(input.cwd);
68
68
  const cwd = projectRoot.physicalPath;
69
- const hooks = input.hooks ?? {};
70
- const streams = trackRuntimeStreams(hooks);
71
- const env = hooks.env ?? process.env;
72
- const subjectRoute = cuaSubjectRouteOf(plan);
73
- const { cloneRoute, localTreeRoute, inProcessRoute, appUrl, subjectRepo, subjectEnvNames } = subjectRoute;
69
+ const seams = input.deps ?? {};
70
+ const streams = trackRuntimeStreams(input.onStream);
71
+ const env = input.env ?? process.env;
72
+ const { subject, desktop } = plan.runner;
73
+ const inProcess = desktop === "in-process";
74
+ const appUrl = plannedAppUrl(subject);
75
+ const subjectEnvNames = [...participantSubjectEnv(subject)];
74
76
  const fail = (code, message, actorLabel) => ({
75
77
  schema: CUA_ACTOR_LAB_SCHEMA,
76
78
  ok: false,
@@ -88,15 +90,29 @@ export async function admitCuaRun(plan, input, config) {
88
90
  ok: false,
89
91
  result: fail(...args),
90
92
  });
93
+ // runLab's local VM study supplies a local-target app-url lab's desktop; a direct route call or
94
+ // an in-process executor on the same lab has none. It reads the declared source, as the planner
95
+ // did: a library config the parser never saw can plan to an app-url subject from another source.
96
+ if (config.subject.source === "app-url" &&
97
+ config.execution?.target === "local" &&
98
+ input.localVm === undefined)
99
+ return refuse("HUMANISH_CUA_LAB_LOCAL_DESKTOP_MISSING", "An app-url lab with execution.target: local needs a local desktop. runLab starts one; a direct route call or an in-process executor does not.");
91
100
  const descriptor = cuaDescriptorOf(plan.actor);
92
- const runSession = hooks.runSession ?? descriptor.runSession;
101
+ const baseRunSession = seams.runSession ?? descriptor.runSession;
102
+ // A local VM study's sessions abort on its signal.
103
+ const localVmSignal = input.localVm?.signal;
104
+ const runSession = localVmSignal === undefined
105
+ ? baseRunSession
106
+ : (options) => baseRunSession({ ...options, signal: localVmSignal });
93
107
  // Adopter-hosted comms plane on the app-url route (#380): humanish provisions no subject here,
94
108
  // so it cannot host a catch — the OPERATOR runs one, and humanish still does every other part
95
109
  // of the funnel: tells each persona its address and inbox URL, drains the catch over HTTP after
96
- // the lanes, and writes the same digest-only evidence. Declaring `external` previously did
110
+ // the participants, and writes the same digest-only evidence. Declaring `external` previously did
97
111
  // nothing on this route (and, per #387, on every other) while its docs said otherwise.
98
112
  const comms = plan.residual.comms;
99
- const externalCommsConfig = !cloneRoute && !localTreeRoute && !inProcessRoute ? comms?.email?.external : undefined;
113
+ const externalCommsConfig = subject.kind !== "clone" && subject.kind !== "local-tree" && !inProcess
114
+ ? comms?.email?.external
115
+ : undefined;
100
116
  const externalCommsEmail = externalCommsConfig ? comms?.email : undefined;
101
117
  const participants = await loadCuaParticipants({ plan, cwd, projectRoot, env });
102
118
  if (!participants.ok) {
@@ -104,13 +120,13 @@ export async function admitCuaRun(plan, input, config) {
104
120
  }
105
121
  const { participantRuns, participantPlan, rerunLineage } = participants;
106
122
  const participantCount = participantRuns.length;
107
- // Pre-flight plan: BEFORE any sandbox or provider call (dry-run AND live). The hook fires for
108
- // every N (observable + testable); the stderr table prints for fan-out (N>1) so single-lane
109
- // runs stay as quiet as they always were.
123
+ // Pre-flight plan: BEFORE any sandbox or provider call (dry-run AND live). onEvent gets it for
124
+ // every N; the stderr table prints for fan-out (N>1) so single-participant runs stay as quiet as they
125
+ // always were.
110
126
  if (participantCount > 1) {
111
127
  emitPreflightPlan(participantPlan, plan.labId);
112
128
  }
113
- hooks.onPreflight?.(participantPlan);
129
+ input.emit?.(planEvent(participantPlan));
114
130
  await assertPreparedSelectedOutputDirectory(projectRoot);
115
131
  // Read keys once into locals (names only; values never logged or persisted).
116
132
  const openaiApiKey = env.OPENAI_API_KEY?.trim() ?? "";
@@ -124,34 +140,30 @@ export async function admitCuaRun(plan, input, config) {
124
140
  const scrubKnownValues = scrubLiterals(knownSecretValues);
125
141
  sanitizeParticipantRuns(participantRuns, scrubKnownValues);
126
142
  const redactRepoLabel = plan.residual.policies?.redactRepos ?? subjectEnvNames.includes("GITHUB_TOKEN");
127
- const publicRepo = cloneRoute && subjectRepo ? (redactRepoLabel ? "repo-01" : subjectRepo) : undefined;
128
- const hasGithubToken = subjectEnvNames.includes("GITHUB_TOKEN");
143
+ const publicRepo = subject.kind === "clone" ? (redactRepoLabel ? "repo-01" : subject.repo) : undefined;
129
144
  // Key-gating is route-aware: the in-process route uses the caller's OWN model + executor, and
130
145
  // the local-agent route uses a CLI the operator has already signed in to.
131
- if (!dryRun && !inProcessRoute) {
146
+ if (!dryRun && !inProcess) {
132
147
  const rejection = await liveCuaRejection({
133
148
  caps: plan.caps,
134
149
  brain: plan.runner.brain,
135
- hooks,
136
150
  env,
137
- openaiApiKey,
138
- e2bApiKey,
139
- subjectEnvNames,
151
+ requirements: plan.requirements,
140
152
  externalCommsConfig,
141
153
  });
142
154
  if (rejection)
143
155
  return refuse(rejection.code, rejection.message, descriptor.id);
144
156
  }
145
157
  // Pack the working tree ONCE per run, on the host, BEFORE any sandbox or provider call: every
146
- // fan-out lane below uploads this SAME archive, so one archiveSha256 describes every lane's
147
- // digest. Dry-run packs nothing (no fs side effects; the contract bundle carries no
158
+ // fan-out participant below uploads this SAME archive, so one archiveSha256 describes every
159
+ // participant's digest. Dry-run packs nothing (no fs side effects; the contract bundle carries no
148
160
  // archiveSha256). A packing failure fails the run closed here, before any sandbox is
149
161
  // created and before the run directory exists.
150
162
  let localTreeArchive;
151
163
  let localTreeArchiveBuffer;
152
- if (localTreeRoute && !dryRun) {
164
+ if (subject.kind === "local-tree" && !dryRun) {
153
165
  try {
154
- const packed = await packRunLocalTree(hooks, plan.residual, cwd);
166
+ const packed = await packRunLocalTree(seams, plan.residual, cwd);
155
167
  localTreeArchive = packed.archive;
156
168
  localTreeArchiveBuffer = packed.buffer;
157
169
  }
@@ -165,10 +177,10 @@ export async function admitCuaRun(plan, input, config) {
165
177
  config,
166
178
  dryRun,
167
179
  cwd,
168
- hooks,
180
+ seams,
169
181
  streams,
170
182
  env,
171
- subjectRoute,
183
+ appUrl,
172
184
  fail,
173
185
  refuse,
174
186
  descriptor,
@@ -184,7 +196,6 @@ export async function admitCuaRun(plan, input, config) {
184
196
  knownSecretValues,
185
197
  scrubKnownValues,
186
198
  publicRepo,
187
- hasGithubToken,
188
199
  localTreeArchive,
189
200
  localTreeArchiveBuffer,
190
201
  },
@@ -192,8 +203,8 @@ export async function admitCuaRun(plan, input, config) {
192
203
  }
193
204
  /** Starts the run and builds what the participants and the finish read: the deps and the bundle base. */
194
205
  export async function startCuaRun(plan, input, admitted, scope) {
195
- const { config, dryRun, cwd, hooks, descriptor, participantRuns, participantPlan, publicRepo } = admitted;
196
- const { appUrl, inProcessRoute, localAppSubject, cloneRoute, localTreeRoute, subjectEnvNames } = admitted.subjectRoute;
206
+ const { dryRun, cwd, seams, descriptor, participantRuns, participantPlan, publicRepo } = admitted;
207
+ const { appUrl } = admitted;
197
208
  // The run's status record exists from here on, so anything watching the runs directory can
198
209
  // tell which lab this is and that it is alive. The fail-closed returns below leave it finished
199
210
  // with no outcome when the scope closes; a crash leaves it stale, which reads as interrupted.
@@ -204,12 +215,12 @@ export async function startCuaRun(plan, input, admitted, scope) {
204
215
  mode: dryRun ? "dry-run" : "live",
205
216
  lab: plan.lab,
206
217
  renderReview: renderCuaReviewMarkdown,
207
- observer: { open: input.open === true, render: hooks.renderObserverFn },
218
+ observer: { open: input.open === true, render: seams.renderObserver },
208
219
  });
209
220
  if (!started.ok)
210
221
  return admitted.refuse(started.code, started.message, descriptor.id);
211
222
  const { run } = started;
212
- const { runId, createdAt, paths: runPaths } = run;
223
+ const { createdAt, paths: runPaths } = run;
213
224
  const redactScreenshots = plan.residual.policies?.redactScreenshots === true;
214
225
  await prepareContainedOutputDirectory(runPaths, "screenshots");
215
226
  const source = await buildRunSource({
@@ -219,7 +230,7 @@ export async function startCuaRun(plan, input, admitted, scope) {
219
230
  packageName: "humanish",
220
231
  });
221
232
  // Live-trace flush seam (#441): runLabParticipants fills it when a live run has an in-progress bundle
222
- // to grow; lanes call it through deps.onTrace. It exists before deps so deps can reference it as
233
+ // to grow; participants call it through deps.onTrace. It exists before deps so deps can reference it as
223
234
  // a stable indirection.
224
235
  const liveTrace = {};
225
236
  const deps = cuaParticipantDeps(plan, input, admitted, {
@@ -229,7 +240,6 @@ export async function startCuaRun(plan, input, admitted, scope) {
229
240
  });
230
241
  const subjectArgs = {
231
242
  plan,
232
- subjectRoute: admitted.subjectRoute,
233
243
  ...(publicRepo === undefined ? {} : { publicRepo }),
234
244
  ...(admitted.localTreeArchive === undefined
235
245
  ? {}
@@ -242,25 +252,20 @@ export async function startCuaRun(plan, input, admitted, scope) {
242
252
  dryRun: false,
243
253
  });
244
254
  const inProgressAggregateSubject = inProgressSubjects[0];
245
- const inProgressProvenance = subjectProvenanceArg(inProgressAggregateSubject, publicRepo, subjectEnvNames);
255
+ const inProgressProvenance = subjectProvenanceArg(inProgressAggregateSubject, publicRepo, [
256
+ ...participantSubjectEnv(plan.runner.subject),
257
+ ]);
246
258
  const bundleBase = {
247
- ...(plan.lab === undefined ? {} : { lab: plan.lab }),
259
+ run,
248
260
  participantRuns,
249
261
  descriptor,
250
262
  appUrl,
251
- createdAt,
252
263
  plan,
253
- runId,
254
264
  source,
255
265
  participantPlan,
256
266
  ...(admitted.rerunLineage === undefined ? {} : { rerun: admitted.rerunLineage }),
257
267
  redactScreenshots,
258
- inProcessRoute,
259
- localAppSubject,
260
- cloneRoute,
261
- localTreeRoute,
262
268
  ...(publicRepo === undefined ? {} : { publicRepo }),
263
- subjectEnvNames,
264
269
  };
265
270
  const { externalCommsConfig, externalCommsEmail } = admitted;
266
271
  return {
@@ -268,10 +273,8 @@ export async function startCuaRun(plan, input, admitted, scope) {
268
273
  setup: {
269
274
  plan,
270
275
  input,
271
- config,
272
276
  cwd,
273
277
  descriptor,
274
- subjectRoute: admitted.subjectRoute,
275
278
  run,
276
279
  streams: admitted.streams,
277
280
  participantRuns,
@@ -294,35 +297,30 @@ export async function startCuaRun(plan, input, admitted, scope) {
294
297
  },
295
298
  fail: admitted.fail,
296
299
  },
297
- finish: { hooks, rerunLineage: admitted.rerunLineage, publicRepo, subjectArgs },
300
+ finish: { rerunLineage: admitted.rerunLineage, publicRepo, subjectArgs },
298
301
  };
299
302
  }
300
- /** The lane deps every lane reads: the route, keys, timeouts, scrubber, budget and hooks. */
303
+ /** The participant deps every participant reads: the route, keys, timeouts, scrubber, budget and seams. */
301
304
  function cuaParticipantDeps(plan, input, admitted, run) {
302
- const { config, dryRun, hooks, streams, env, descriptor, runSession, participantCount } = admitted;
303
- const { hasGithubToken, localTreeArchiveBuffer } = admitted;
305
+ const { config, dryRun, seams, streams, env, runSession, participantCount } = admitted;
306
+ const { localTreeArchiveBuffer } = admitted;
304
307
  const { openaiApiKey, e2bApiKey, scrubKnownValues } = admitted;
305
308
  const { externalCommsConfig, externalCommsEmail } = admitted;
306
- const { appUrl, cloneRoute, desktopCliRoute, localTreeRoute, serve, subjectRepo } = admitted.subjectRoute;
307
- const { subjectEnvNames } = admitted.subjectRoute;
309
+ const { appUrl } = admitted;
308
310
  const { runPaths, redactScreenshots, liveTrace } = run;
309
- const createDesktop = participantDesktopOf(hooks);
311
+ const createDesktop = input.localVm?.desktop;
310
312
  const timeoutMs = plan.sessionBudgetMs;
311
313
  const requestTimeoutMs = e2bRequestTimeoutMs(env);
312
314
  return {
313
315
  ...(createDesktop === undefined ? {} : { createDesktop }),
314
316
  onTrace: (participantId, items, usage, metadata) => liveTrace.flush?.(participantId, items, usage, metadata),
315
- config,
316
- descriptor,
317
+ ...callerDriving(input, config),
318
+ residual: plan.residual,
319
+ labId: plan.labId,
320
+ caps: plan.caps,
317
321
  appUrl,
318
322
  brain: plan.runner.brain,
319
- cloneRoute,
320
- desktopCliRoute,
321
- localTreeRoute,
322
- ...(serve === undefined ? {} : { serve }),
323
- ...(subjectRepo === undefined ? {} : { subjectRepo }),
324
- subjectEnvNames,
325
- hasGithubToken,
323
+ subject: plan.runner.subject,
326
324
  ...(localTreeArchiveBuffer === undefined ? {} : { localTreeArchiveBuffer }),
327
325
  env,
328
326
  openaiApiKey,
@@ -336,7 +334,7 @@ function cuaParticipantDeps(plan, input, admitted, run) {
336
334
  redactScreenshots,
337
335
  scrubKnownValues,
338
336
  runSession,
339
- // The study-level ledger exists once per RUN, shared by every lane (#299). Dry runs never
337
+ // The study-level ledger exists once per RUN, shared by every participant (#299). Dry runs never
340
338
  // spend, so they carry none.
341
339
  ...(dryRun || plan.caps.maxTotalUsd === undefined
342
340
  ? {}
@@ -349,8 +347,34 @@ function cuaParticipantDeps(plan, input, admitted, run) {
349
347
  inboxUrl: externalInboxUrl(externalCommsConfig),
350
348
  },
351
349
  }),
352
- now: hooks.now ?? Date.now,
353
- hooks: streams.hooks,
350
+ now: seams.now ?? Date.now,
351
+ ...(seams.desktopModule === undefined ? {} : { desktopModule: seams.desktopModule }),
352
+ ...(input.prepareDesktop === undefined ? {} : { prepareDesktop: input.prepareDesktop }),
353
+ ...(seams.detachedTimers === undefined ? {} : { detachedTimers: seams.detachedTimers }),
354
+ onStream: streams.onStream,
355
+ reportSubjectPhase: subjectPhaseReporter(input),
356
+ };
357
+ }
358
+ /** The caller's createProvider and inProcess executor, with the run's config bound. */
359
+ function callerDriving(input, config) {
360
+ const { createProvider, inProcess } = input;
361
+ return {
362
+ ...(createProvider === undefined
363
+ ? {}
364
+ : {
365
+ createProvider: (participant, executor) => createProvider({ config, participant, executor }),
366
+ }),
367
+ ...(inProcess === undefined
368
+ ? {}
369
+ : { inProcessExecutor: (appUrl) => inProcess.executor({ config, appUrl }) }),
370
+ };
371
+ }
372
+ /** Each subject phase goes to the phase sink, stderr by default, and to onEvent. */
373
+ function subjectPhaseReporter(input) {
374
+ const sink = input.deps?.subjectPhaseSink ?? defaultSubjectPhaseSink;
375
+ return (event, participant) => {
376
+ sink(event, participant);
377
+ input.emit?.(phaseEvent(event, { kind: "participant", participant: participantOf(participant) }));
354
378
  };
355
379
  }
356
380
  function makeCuaRunId() {
@@ -3,8 +3,7 @@ import type { SubjectPhaseEvent } from "../../subject/steps.js";
3
3
  import type { DesktopBrowserEvidence } from "../../substrates/e2b/desktop-browser.js";
4
4
  import type { ActorPersonaRef } from "../../actors/contract.js";
5
5
  import type { CuaLoopResult } from "../../actors/computer-use/loop.js";
6
- import { type RunLabProvenance } from "../../run/status.js";
7
- import { type RunBundle, type RunFeedbackCandidate, type RunProviderResource } from "../../run/bundle.js";
6
+ import { type BundleRun, type RunBundle, type RunFeedbackCandidate, type RunProviderResource } from "../../run/bundle.js";
8
7
  import { type RunDesktopGeometry, type RunStream } from "../../run/streams.js";
9
8
  import { type Verdict } from "../../run/judge.js";
10
9
  import { type DesktopUsage } from "../../run/cost-summary.js";
@@ -17,8 +16,8 @@ export declare function buildSingleParticipantBundle(args: {
17
16
  /** The run's verdict, from the judge. */
18
17
  verdict: Verdict;
19
18
  realEmail?: boolean;
20
- /** Lab provenance for the bundle's own `lab` field (#455). */
21
- lab?: RunLabProvenance;
19
+ /** The run this bundle belongs to; the bundle head reads its id, mode, start and lab. */
20
+ run: BundleRun;
22
21
  actorId: string;
23
22
  appUrl: string;
24
23
  /** The participant's plan id, saved as the stream's laneId ("lane-01" when absent). */
@@ -26,7 +25,6 @@ export declare function buildSingleParticipantBundle(args: {
26
25
  actorType?: string;
27
26
  surface?: string;
28
27
  caseGroup?: string;
29
- createdAt: string;
30
28
  dryRun: boolean;
31
29
  labId: string;
32
30
  labTitle?: string;
@@ -44,7 +42,6 @@ export declare function buildSingleParticipantBundle(args: {
44
42
  /** Device-preset touch metadata echoed on the measured stream viewport (a prompt signal on
45
43
  * this route, never a rendered claim); the measured width/height/DPR stay authoritative. */
46
44
  isMobile?: boolean;
47
- runId: string;
48
45
  screenshots: string[];
49
46
  /** Relative run-dir path of the digest-only comms-thread evidence artifact (humanish.comms-thread.v1),
50
47
  * when a comms lab captured mail; registered as a "log" stream artifact. */
@@ -59,10 +56,10 @@ export declare function buildSingleParticipantBundle(args: {
59
56
  session?: CuaLoopResult;
60
57
  sessionError?: string;
61
58
  /**
62
- * The lane's own credibility read of a goal_satisfied session (#476). The actor's status is
63
- * evidence of what it CLAIMED; whether the harness counts the claim is decided by the lane
59
+ * The route's own credibility read of a goal_satisfied session (#476). The actor's status is
60
+ * evidence of what it CLAIMED; whether the harness counts the claim is decided by the route
64
61
  * (zero engagement, a final message that describes a blocker). The review has to say the same
65
- * thing the lane's exit code says, or the durable bundle reports a participant reaching the
62
+ * thing the participant's exit code says, or the durable bundle reports a participant reaching the
66
63
  * goal on a run the harness refused to count.
67
64
  */
68
65
  credibility?: {
@@ -80,7 +77,7 @@ export declare function buildSingleParticipantBundle(args: {
80
77
  * declared honestly as caller-provisioned/unpinned with no E2B. Absent: a plain app-url entry.
81
78
  */
82
79
  entryKind?: "local-app";
83
- /** The custom E2B desktop template (image) this lane launched on, when configured (provenance). */
80
+ /** The custom E2B desktop template (image) this participant launched on, when configured (provenance). */
84
81
  desktopTemplate?: string;
85
82
  /** The configured browser choice and the command that opened, when explicitly configured. */
86
83
  desktopBrowser?: DesktopBrowserEvidence;
@@ -90,7 +87,7 @@ export declare function buildSingleParticipantBundle(args: {
90
87
  /** Completed subject-phase records (clone/upload/extract/install/build/ready/state groups)
91
88
  * to fold into bundle.events, so run.json carries real phase timing after the fact. */
92
89
  phaseEvents?: SubjectPhaseEvent[];
93
- /** Host-side E2B desktop billed span for this lane, in minutes (from ParticipantRunOutcome
90
+ /** Host-side E2B desktop billed span for this participant, in minutes (from ParticipantRunOutcome
94
91
  * desktopDurationMs). Absent when no sandbox ran (in-process/dry-run) → no desktop cost line. */
95
92
  desktopMinutes?: number;
96
93
  desktopUsage?: DesktopUsage;
@@ -1,6 +1,5 @@
1
1
  import { participantAssignment } from "../../lab/participant-assignment.js";
2
2
  import { redactText } from "../../evidence/redaction.js";
3
- import {} from "../../run/status.js";
4
3
  import { REVIEW_SCHEMA, bundleArtifacts, bundleHead, } from "../../run/bundle.js";
5
4
  import {} from "../../run/streams.js";
6
5
  import { aggregateTaskFunnels, tallyParticipantOutcomes, withCuaReviewProvenance, } from "../../run/outcomes.js";
@@ -94,8 +93,8 @@ function singleSimulation(args, view) {
94
93
  : args.sessionError !== undefined
95
94
  ? `Computer-use lab failed before a terminal session verdict: ${args.sessionError}`
96
95
  : `Contract participant for the computer-use actor (${args.actorId}) against ${publicAppUrl}.`,
97
- startedAt: args.createdAt,
98
- updatedAt: args.createdAt,
96
+ startedAt: args.run.createdAt,
97
+ updatedAt: args.run.createdAt,
99
98
  });
100
99
  }
101
100
  function singleStream(args, view) {
@@ -111,7 +110,7 @@ function singleStream(args, view) {
111
110
  label: `CUA browser — ${args.labId}`,
112
111
  status,
113
112
  transport: "snapshot",
114
- updatedAt: args.createdAt,
113
+ updatedAt: args.run.createdAt,
115
114
  embed: lastScreenshot
116
115
  ? { kind: "screenshot", url: lastScreenshot, title: `CUA desktop (${screenshotMode})` }
117
116
  : { kind: "placeholder", title: "CUA desktop" },
@@ -162,7 +161,7 @@ function singleEvents(args, view) {
162
161
  const events = [
163
162
  {
164
163
  id: "event-000-created",
165
- at: args.createdAt,
164
+ at: args.run.createdAt,
166
165
  level: "info",
167
166
  type: "cua-lab.run.created",
168
167
  message: `Created computer-use lab run for ${args.labId} (actor ${args.actorId}).`,
@@ -170,7 +169,7 @@ function singleEvents(args, view) {
170
169
  args.subjectProvenance
171
170
  ? participantEvent(SINGLE, {
172
171
  id: "event-001-subject",
173
- at: args.createdAt,
172
+ at: args.run.createdAt,
174
173
  level: "info",
175
174
  type: "cua-lab.subject.provenance",
176
175
  // HONEST WORDING: claim "cloned/packed and served" only when it actually happened.
@@ -178,7 +177,7 @@ function singleEvents(args, view) {
178
177
  })
179
178
  : participantEvent(SINGLE, {
180
179
  id: "event-001-subject",
181
- at: args.createdAt,
180
+ at: args.run.createdAt,
182
181
  level: "info",
183
182
  type: "cua-lab.subject.declared",
184
183
  // Invariant 5: declare what the subject WAS, including the ABSENCE of a pin. A
@@ -195,7 +194,7 @@ function singleEvents(args, view) {
195
194
  args.session
196
195
  ? participantEvent(SINGLE, {
197
196
  id: "event-002-session",
198
- at: args.createdAt,
197
+ at: args.run.createdAt,
199
198
  level: args.session.status === "passed" ? "info" : "warn",
200
199
  type: `cua-lab.session.${args.session.completionReason}`,
201
200
  message: `${args.session.status}: ${args.session.reason}`,
@@ -203,7 +202,7 @@ function singleEvents(args, view) {
203
202
  : args.inProgress === true
204
203
  ? participantEvent(SINGLE, {
205
204
  id: "event-002-running",
206
- at: args.createdAt,
205
+ at: args.run.createdAt,
207
206
  level: "info",
208
207
  type: "cua-lab.session.running",
209
208
  message: "Live computer-use session is running; terminal evidence has not been written yet.",
@@ -211,14 +210,14 @@ function singleEvents(args, view) {
211
210
  : args.sessionError !== undefined
212
211
  ? participantEvent(SINGLE, {
213
212
  id: "event-002-session",
214
- at: args.createdAt,
213
+ at: args.run.createdAt,
215
214
  level: "error",
216
215
  type: "cua-lab.session.error",
217
216
  message: args.sessionError,
218
217
  })
219
218
  : participantEvent(SINGLE, {
220
219
  id: "event-002-contract",
221
- at: args.createdAt,
220
+ at: args.run.createdAt,
222
221
  level: "info",
223
222
  type: "cua-lab.contract.ready",
224
223
  message: "Dry-run contract bundle ready; switch scenario.mode to live for a real desktop session.",
@@ -242,7 +241,7 @@ function singleEvents(args, view) {
242
241
  for (const warning of desktopGeometry?.warnings ?? []) {
243
242
  record({
244
243
  id: `event-${String(phaseEventSeq++).padStart(3, "0")}-geometry-warning`,
245
- at: args.createdAt,
244
+ at: args.run.createdAt,
246
245
  level: "warn",
247
246
  type: "cua-lab.geometry.warning",
248
247
  message: warning,
@@ -254,12 +253,12 @@ function singleReview(args, view, stream) {
254
253
  const { reason } = view;
255
254
  // A funnel with a denominator of one is still the funnel — and its absence stays honest: no
256
255
  // declared protocol (or a dry run) means no `tasks` field, never an empty one.
257
- const singleStudyTasks = args.inProgress !== true && args.session?.trace.taskFunnel !== undefined
256
+ const singleRunTasks = args.inProgress !== true && args.session?.trace.taskFunnel !== undefined
258
257
  ? aggregateTaskFunnels([args.session.trace.taskFunnel])
259
258
  : undefined;
260
- // What happened to the participant, as the LANE judged it — the same rule the fan-out roll-up
259
+ // What happened to the participant, as the route judged it — the same rule the fan-out roll-up
261
260
  // applies (participantStatusForOutcome). Before #476 this read the actor's own status, so a
262
- // run the lane refused as "not a credible pass" was written up as verdict pass, 1/1 reached
261
+ // run the route refused as "not a credible pass" was written up as verdict pass, 1/1 reached
263
262
  // the goal, and every projection of the bundle (Observer tally, `runs`, the status index)
264
263
  // repeated it. Found on a real drawDB run whose participant wrote "Blocked after partial
265
264
  // completion".
@@ -274,14 +273,14 @@ function singleReview(args, view, stream) {
274
273
  const review = withCuaReviewProvenance({
275
274
  schema: REVIEW_SCHEMA,
276
275
  verdict: args.verdict,
277
- // One lane is still a study with a denominator of one, and saying so keeps a single-lane
278
- // result from being read as though it generalized.
276
+ // One participant is still a study with a denominator of one, and saying so keeps a
277
+ // single-participant result from being read as though it generalized.
279
278
  ...(participantStatus !== undefined && args.inProgress !== true
280
279
  ? {
281
280
  participants: tallyParticipantOutcomes([participantStatus], [args.credibility?.reportedFriction === true]),
282
281
  }
283
282
  : {}),
284
- ...(singleStudyTasks === undefined ? {} : { tasks: singleStudyTasks }),
283
+ ...(singleRunTasks === undefined ? {} : { tasks: singleRunTasks }),
285
284
  summary: credibilityNote === undefined ? reason : `${credibilityNote} ${reason}`,
286
285
  gaps: args.session || args.sessionError !== undefined
287
286
  ? []
@@ -305,15 +304,11 @@ export function buildSingleParticipantBundle(args) {
305
304
  const events = singleEvents(args, view);
306
305
  const review = singleReview(args, view, stream);
307
306
  return {
308
- ...bundleHead({
307
+ ...bundleHead(args.run, {
309
308
  ...(args.realEmail && !args.dryRun
310
309
  ? { publication: { restrictions: ["real-communications"] } }
311
310
  : {}),
312
- runId: args.runId,
313
- mode: args.dryRun ? "dry-run" : "live",
314
311
  participants: 1,
315
- createdAt: args.createdAt,
316
- ...(args.lab === undefined ? {} : { lab: args.lab }),
317
312
  source: args.source,
318
313
  }),
319
314
  persona: {
@@ -331,7 +326,7 @@ export function buildSingleParticipantBundle(args) {
331
326
  },
332
327
  lifecycle: [
333
328
  {
334
- at: args.createdAt,
329
+ at: args.run.createdAt,
335
330
  event: "cua-lab.run.created",
336
331
  message: `Created computer-use lab run with one participant in a desktop browser (actor ${args.actorId}).`,
337
332
  },
@@ -356,7 +351,7 @@ export function buildSingleParticipantBundle(args) {
356
351
  feedbackCandidates: args.dryRun || args.inProgress === true
357
352
  ? []
358
353
  : participantFeedbackCandidates({
359
- runId: args.runId,
354
+ runId: args.run.runId,
360
355
  scenarioId: `cua-${args.labId}`,
361
356
  adapterId: args.labId,
362
357
  goal: redactText(args.mission),
@@ -2,16 +2,14 @@ import type { ComputerUsePlan } from "../../lab/plan-types.js";
2
2
  import type { LabSubjectState } from "../../lab/types.js";
3
3
  import { type RunSubjectProvenance, type RunSubjectStateStepRecord } from "../../run/bundle.js";
4
4
  import { type LocalTreeArchive } from "../../subject/local-tree-archive.js";
5
- import { type CuaSubjectRoute } from "./plan.js";
6
5
  import { type DesktopParticipantRun, type CuaSubjectProjection, type CuaSubjectProvenanceArg, type ParticipantRunOutcome } from "./types.js";
7
6
  /**
8
- * Each lane's subject projection. A lane's outcome adds the subject commit it resolved and the
7
+ * Each participant's subject projection. A participant's outcome adds the subject commit it resolved and the
9
8
  * state steps it executed; without outcomes (dry run, or a run still in progress) the declared
10
9
  * state is projected as not yet run.
11
10
  */
12
11
  export declare function projectParticipantSubjects(args: {
13
12
  plan: ComputerUsePlan;
14
- subjectRoute: CuaSubjectRoute;
15
13
  publicRepo?: string;
16
14
  localTreeArchive?: LocalTreeArchive;
17
15
  runs: readonly DesktopParticipantRun[];
@@ -35,10 +33,10 @@ export declare function resolveSubjectState(args: {
35
33
  * default branch that builder already handles). */
36
34
  export declare function subjectProvenanceArg(subject: CuaSubjectProjection, publicRepo: string | undefined, subjectEnvNames: string[]): CuaSubjectProvenanceArg | undefined;
37
35
  /**
38
- * The run-level subject for the top level and the bundle. Local-tree lanes all pack from the same
39
- * once-per-run archive, so every lane already carries the identical archiveSha256/commit/dirty and
40
- * the first lane's projection is the aggregate. Clone lanes each resolve their own commit; the
41
- * aggregate carries it only when every lane agrees, and warns when they diverge.
36
+ * The run-level subject for the top level and the bundle. Local-tree participants all pack from the
37
+ * same once-per-run archive, so every participant already carries the identical archiveSha256/commit/dirty and
38
+ * the first participant's projection is the aggregate. Clone participants each resolve their own
39
+ * commit; the aggregate carries it only when every participant agrees, and warns when they diverge.
42
40
  */
43
41
  export declare function aggregateCuaSubject(args: {
44
42
  subjects: readonly CuaSubjectProjection[];