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,32 +1,25 @@
1
1
  import type { CuaActorDescriptor } from "../../actors/registry.js";
2
2
  import type { ComputerUsePlan } from "../../lab/plan-types.js";
3
- import type { RunBundle, RunRerunLineage } from "../../run/bundle.js";
4
- import type { RunLabProvenance } from "../../run/status.js";
3
+ import type { BundleRun, RunBundle, RunRerunLineage } from "../../run/bundle.js";
5
4
  import { type Judgment } from "../../run/judge.js";
6
5
  import type { CuaParticipantPlan, DesktopParticipantRun, CuaSubjectProjection, CuaSubjectProvenanceArg, ParticipantRunOutcome } from "./types.js";
7
6
  /** What every bundle of one run shares, in progress or final. */
8
7
  export interface CuaRunBundleBase {
9
- lab?: RunLabProvenance;
8
+ /** The run every bundle of it belongs to. */
9
+ run: BundleRun;
10
10
  participantRuns: DesktopParticipantRun[];
11
11
  descriptor: CuaActorDescriptor;
12
12
  appUrl: string;
13
- createdAt: string;
14
13
  plan: ComputerUsePlan;
15
- runId: string;
16
14
  source: RunBundle["source"];
17
15
  participantPlan: CuaParticipantPlan;
18
16
  rerun?: RunRerunLineage;
19
17
  redactScreenshots: boolean;
20
- inProcessRoute: boolean;
21
- localAppSubject: boolean;
22
- cloneRoute: boolean;
23
- localTreeRoute: boolean;
24
18
  publicRepo?: string;
25
- subjectEnvNames: string[];
26
19
  }
27
20
  /**
28
21
  * The judgment for the current state of a computer-use run, by the rule for its shape: one
29
- * participant (its tallied status is the verdict) or several (every lane must pass). The bundle's
22
+ * participant (its tallied status is the verdict) or several (every participant must pass). The bundle's
30
23
  * verdict and the lab result's ok both come from it.
31
24
  */
32
25
  export declare function judgeComputerUseRun(base: Pick<CuaRunBundleBase, "participantRuns" | "rerun">, state: {
@@ -15,7 +15,7 @@ function isOneParticipantRun(base) {
15
15
  }
16
16
  /**
17
17
  * The judgment for the current state of a computer-use run, by the rule for its shape: one
18
- * participant (its tallied status is the verdict) or several (every lane must pass). The bundle's
18
+ * participant (its tallied status is the verdict) or several (every participant must pass). The bundle's
19
19
  * verdict and the lab result's ok both come from it.
20
20
  */
21
21
  export function judgeComputerUseRun(base, state) {
@@ -41,31 +41,25 @@ export function judgeComputerUseRun(base, state) {
41
41
  * the participant plan and each participant's subject. Both argument mappings are here.
42
42
  */
43
43
  export function buildCuaRunBundle(base, state) {
44
- const lab = base.lab === undefined ? {} : { lab: base.lab };
45
44
  const inProgress = state.inProgress === undefined ? {} : { inProgress: true };
46
45
  if (isOneParticipantRun(base))
47
46
  return buildSingleParticipantBundle(singleParticipantArgs(base, state));
48
47
  return buildCuaFanoutBundle({
49
48
  verdict: state.judgment.verdict,
50
- ...lab,
49
+ run: base.run,
51
50
  specs: base.participantRuns,
52
51
  ...(state.outcomes === undefined ? {} : { outcomes: state.outcomes }),
53
52
  subjects: state.subjects,
54
53
  aggregateSubject: state.aggregateSubject,
55
54
  descriptor: base.descriptor,
56
55
  appUrl: base.appUrl,
57
- createdAt: base.createdAt,
58
56
  dryRun: state.dryRun,
59
57
  plan: base.plan,
60
- runId: base.runId,
61
58
  source: base.source,
62
59
  participantPlan: base.participantPlan,
63
60
  ...(base.rerun === undefined ? {} : { rerun: base.rerun }),
64
61
  ...(state.failFastReason === undefined ? {} : { failFastReason: state.failFastReason }),
65
- cloneRoute: base.cloneRoute,
66
- localTreeRoute: base.localTreeRoute,
67
62
  ...(base.publicRepo === undefined ? {} : { publicRepo: base.publicRepo }),
68
- subjectEnvNames: base.subjectEnvNames,
69
63
  ...inProgress,
70
64
  });
71
65
  }
@@ -78,7 +72,7 @@ function singleParticipantArgs(base, state) {
78
72
  return {
79
73
  verdict: state.judgment.verdict,
80
74
  realEmail: plan.residual.comms?.email?.kind === "real",
81
- ...(base.lab === undefined ? {} : { lab: base.lab }),
75
+ run: base.run,
82
76
  actorId: base.descriptor.id,
83
77
  appUrl: spec.planned.targetUrl ?? base.appUrl,
84
78
  participantId: spec.planned.id,
@@ -89,7 +83,6 @@ function singleParticipantArgs(base, state) {
89
83
  ...(spec.planned.labels.caseGroup === undefined
90
84
  ? {}
91
85
  : { caseGroup: spec.planned.labels.caseGroup }),
92
- createdAt: base.createdAt,
93
86
  dryRun: state.dryRun,
94
87
  labId: plan.labId,
95
88
  ...(plan.title ? { labTitle: plan.title } : {}),
@@ -97,8 +90,8 @@ function singleParticipantArgs(base, state) {
97
90
  ...(spec.evidenceAssignment === undefined ? {} : { assignment: spec.evidenceAssignment }),
98
91
  persona: spec.persona,
99
92
  resolution: spec.planned.device.resolution,
100
- desktopRoute: !base.inProcessRoute,
101
- substrate: base.inProcessRoute
93
+ desktopRoute: base.plan.runner.desktop !== "in-process",
94
+ substrate: base.plan.runner.desktop === "in-process"
102
95
  ? "local-filesystem"
103
96
  : plan.residual.execution?.target === "local"
104
97
  ? "local-desktop"
@@ -106,7 +99,6 @@ function singleParticipantArgs(base, state) {
106
99
  ...(outcome?.desktopGeometry === undefined ? {} : { desktopGeometry: outcome.desktopGeometry }),
107
100
  ...(outcome?.recording === undefined ? {} : { recording: outcome.recording }),
108
101
  isMobile: spec.planned.device.preset.isMobile,
109
- runId: base.runId,
110
102
  screenshots: outcome?.screenshots ?? [],
111
103
  captureRedaction: base.redactScreenshots ? "blurred" : "raw",
112
104
  ...(outcome?.session ? { session: outcome.session } : {}),
@@ -129,11 +121,13 @@ function singleParticipantArgs(base, state) {
129
121
  ...(outcome?.desktopBrowser === undefined ? {} : { desktopBrowser: outcome.desktopBrowser }),
130
122
  providerResources: providerResourcesForOutcome({
131
123
  outcome,
132
- createdAt: base.createdAt,
124
+ createdAt: base.run.createdAt,
133
125
  ids: spec,
134
126
  participantId: spec.planned.id,
135
127
  }),
136
- ...(base.localAppSubject || base.inProcessRoute ? { entryKind: "local-app" } : {}),
128
+ ...(base.plan.runner.subject.kind === "local-app" || base.plan.runner.desktop === "in-process"
129
+ ? { entryKind: "local-app" }
130
+ : {}),
137
131
  ...(outcome?.session ? { traceArtifactPath: spec.traceArtifactPath } : {}),
138
132
  ...(outcome?.commsArtifactPath === undefined
139
133
  ? {}
@@ -23,7 +23,7 @@ export declare function cuaParticipantDiagnostics(input: {
23
23
  noEngagement?: boolean;
24
24
  session?: SessionEnding;
25
25
  }): CuaDiagnostics;
26
- /** Each lane retains its details. The summary never borrows lane one's ending for other lanes. */
26
+ /** Each participant retains its details. The summary never borrows the first one's ending for the others. */
27
27
  export declare function summarizeCuaDiagnostics(input: {
28
28
  dryRun: boolean;
29
29
  evidenceInvalid: boolean;
@@ -54,7 +54,7 @@ export function cuaParticipantDiagnostics(input) {
54
54
  ? { category: "participant_outcome" }
55
55
  : { category: "unknown" };
56
56
  }
57
- /** Each lane retains its details. The summary never borrows lane one's ending for other lanes. */
57
+ /** Each participant retains its details. The summary never borrows the first one's ending for the others. */
58
58
  export function summarizeCuaDiagnostics(input) {
59
59
  if (input.evidenceInvalid)
60
60
  return { category: "evidence_invalid" };
@@ -3,8 +3,8 @@ import { type DeployedCommsCatch } from "../../../comms/sandbox-catch.js";
3
3
  import type { LabCommsEmail, LabConfig } from "../../../lab/types.js";
4
4
  import type { Shell } from "../../../substrates/shell.js";
5
5
  import type { ReadyParticipantDesktop } from "../participant-desktop.js";
6
- import type { CuaParticipantDeps, DesktopParticipantRun } from "../types.js";
7
- /** A lane's captured-email wiring, decided from config before the sandbox exists. */
6
+ import { type E2BDesktopDeps, type DesktopParticipantRun } from "../types.js";
7
+ /** A participant's captured-email wiring, decided from config before the sandbox exists. */
8
8
  export interface ParticipantComms {
9
9
  readonly email: LabCommsEmail;
10
10
  readonly port: number;
@@ -20,9 +20,9 @@ export interface ParticipantComms {
20
20
  /**
21
21
  * On an in-sandbox subject route, redirect the app's email-API sends into an in-sandbox catch
22
22
  * (loopback) so its verification mail is CAPTURED, not sent to the internet. Undefined when the
23
- * lab declares no fake email, which leaves the lane unchanged.
23
+ * lab declares no fake email, which leaves the participant unchanged.
24
24
  */
25
- export declare function planParticipantComms(config: LabConfig, targetUrl: string, inSandboxSubject: boolean): ParticipantComms | undefined;
25
+ export declare function planParticipantComms(comms: LabConfig["comms"], serveUrl: string | undefined, targetUrl: string, inSandboxSubject: boolean): ParticipantComms | undefined;
26
26
  /** The env the subject app reads to reach the catch, injected at sandbox create so it boots with it. */
27
27
  export declare function participantCommsEnv(comms: ParticipantComms | undefined): Record<string, string>;
28
28
  /** A started catch and the stop for its inbox-surface loop. */
@@ -37,20 +37,20 @@ export interface RunningCommsCatch {
37
37
  * rather than silently sending real mail.
38
38
  */
39
39
  export declare function startCommsCatch(shell: Shell, comms: ParticipantComms, requestTimeoutMs: number): Promise<RunningCommsCatch>;
40
- /** Stand up the real-email receiving surface and attach it to the lane; returns the inbox URL. */
41
- export declare function attachReceivingInbox(shell: Shell, spec: DesktopParticipantRun, deps: CuaParticipantDeps & {
42
- receiving: NonNullable<CuaParticipantDeps["receiving"]>;
40
+ /** Stand up the real-email receiving surface and attach it to the participant; returns the inbox URL. */
41
+ export declare function attachReceivingInbox(shell: Shell, spec: DesktopParticipantRun, deps: E2BDesktopDeps & {
42
+ receiving: NonNullable<E2BDesktopDeps["receiving"]>;
43
43
  }, targetUrl: string): Promise<string>;
44
44
  /** The inbox the persona is told about: real receiving, the captured catch, or an external inbox. */
45
45
  export declare function participantInbox(args: {
46
46
  spec: DesktopParticipantRun;
47
- deps: CuaParticipantDeps;
47
+ deps: E2BDesktopDeps;
48
48
  receivingInboxUrl: string | undefined;
49
49
  comms: ParticipantComms | undefined;
50
50
  catchReady: boolean;
51
51
  }): ReadyParticipantDesktop["inbox"];
52
52
  /**
53
- * Before this lane's sandbox is torn down, drain everything the in-sandbox catch captured, route it
53
+ * Before this participant's sandbox is torn down, drain everything the in-sandbox catch captured, route it
54
54
  * into a host fake inbox addressed to the declared recipients, and write the digest-only thread
55
55
  * artifact. Returns the artifact path when one was written. A drain failure is a warning and never
56
56
  * breaks teardown: the sandbox must still be killed either way.
@@ -60,6 +60,6 @@ export declare function drainCommsEvidence(args: {
60
60
  comms: ParticipantComms;
61
61
  deployed: DeployedCommsCatch;
62
62
  spec: DesktopParticipantRun;
63
- deps: CuaParticipantDeps;
63
+ deps: E2BDesktopDeps;
64
64
  warnings: string[];
65
65
  }): Promise<string | undefined>;
@@ -1,4 +1,4 @@
1
- // Off-app email for one E2B desktop lane (#297): the in-sandbox catch the subject app sends to, the
1
+ // Off-app email for one E2B desktop participant (#297): the in-sandbox catch the subject app sends to, the
2
2
  // persona's inbox surface, the real-email receiving surface, and the evidence drained at teardown.
3
3
  import { setTimeout as delay } from "node:timers/promises";
4
4
  import { buildOriginMap } from "../../../comms/capture-surface.js";
@@ -8,6 +8,7 @@ import { DEFAULT_SANDBOX_CATCH_PORT, collectCommsThread, deployCommsCatch, refre
8
8
  import { redactText, toErrorMessage } from "../../../evidence/redaction.js";
9
9
  import { writeContainedOutputFile } from "../../../run/contained-output.js";
10
10
  import { inboxRecipientFor, participantHasInboxRecipient } from "../participant-desktop.js";
11
+ import { participantServeUrl } from "../types.js";
11
12
  import { addressedRecipients } from "../../../lab/parse/comms.js";
12
13
  /** Mid-run inbox-surface render cadence (ms). Coarse enough that the per-tick `cat` + file writes stay
13
14
  * cheap; fine enough that a verification email is visible seconds after the app sends it. */
@@ -15,10 +16,10 @@ const INBOX_SURFACE_CADENCE_MS = 2500;
15
16
  /**
16
17
  * On an in-sandbox subject route, redirect the app's email-API sends into an in-sandbox catch
17
18
  * (loopback) so its verification mail is CAPTURED, not sent to the internet. Undefined when the
18
- * lab declares no fake email, which leaves the lane unchanged.
19
+ * lab declares no fake email, which leaves the participant unchanged.
19
20
  */
20
- export function planParticipantComms(config, targetUrl, inSandboxSubject) {
21
- const email = inSandboxSubject && config.comms?.email?.kind === "fake" ? config.comms.email : undefined;
21
+ export function planParticipantComms(comms, serveUrl, targetUrl, inSandboxSubject) {
22
+ const email = inSandboxSubject && comms?.email?.kind === "fake" ? comms.email : undefined;
22
23
  if (email === undefined)
23
24
  return undefined;
24
25
  const port = email.port ?? DEFAULT_SANDBOX_CATCH_PORT;
@@ -30,9 +31,7 @@ export function planParticipantComms(config, targetUrl, inSandboxSubject) {
30
31
  smtpPort: email.smtp?.port,
31
32
  inboxUrl: `http://127.0.0.1:${port}/inbox`,
32
33
  originMap: buildOriginMap({
33
- ...(config.subject.serve?.url === undefined
34
- ? {}
35
- : { internalServeUrl: config.subject.serve.url }),
34
+ ...(serveUrl === undefined ? {} : { internalServeUrl: serveUrl }),
36
35
  reachableBaseUrl: targetUrl,
37
36
  ...(email.linkOrigin === undefined ? {} : { linkOrigin: email.linkOrigin }),
38
37
  }),
@@ -125,22 +124,20 @@ export async function startCommsCatch(shell, comms, requestTimeoutMs) {
125
124
  },
126
125
  };
127
126
  }
128
- /** Stand up the real-email receiving surface and attach it to the lane; returns the inbox URL. */
127
+ /** Stand up the real-email receiving surface and attach it to the participant; returns the inbox URL. */
129
128
  export async function attachReceivingInbox(shell, spec, deps, targetUrl) {
130
- const { config } = deps;
129
+ const serveUrl = participantServeUrl(deps.subject);
131
130
  const surface = await deployReceivingInbox(shell, {
132
131
  leaseId: spec.streamId,
133
132
  requestTimeoutMs: Math.min(deps.requestTimeoutMs, 30_000),
134
133
  });
135
- const email = config.comms?.email;
134
+ const email = deps.residual.comms?.email;
136
135
  try {
137
136
  await deps.receiving.attach(spec.planned.id, {
138
137
  surface,
139
138
  allowedOrigins: [...new Set([new URL(targetUrl).origin, ...(email?.allowedOrigins ?? [])])],
140
139
  originMap: buildOriginMap({
141
- ...(config.subject.serve?.url === undefined
142
- ? {}
143
- : { internalServeUrl: config.subject.serve.url }),
140
+ ...(serveUrl === undefined ? {} : { internalServeUrl: serveUrl }),
144
141
  reachableBaseUrl: targetUrl,
145
142
  ...(email?.linkOrigin === undefined ? {} : { linkOrigin: email.linkOrigin }),
146
143
  }),
@@ -177,7 +174,7 @@ export function participantInbox(args) {
177
174
  return undefined;
178
175
  }
179
176
  /**
180
- * Before this lane's sandbox is torn down, drain everything the in-sandbox catch captured, route it
177
+ * Before this participant's sandbox is torn down, drain everything the in-sandbox catch captured, route it
181
178
  * into a host fake inbox addressed to the declared recipients, and write the digest-only thread
182
179
  * artifact. Returns the artifact path when one was written. A drain failure is a warning and never
183
180
  * breaks teardown: the sandbox must still be killed either way.
@@ -1,3 +1,3 @@
1
1
  import type { ParticipantDesktop } from "../participant-desktop.js";
2
- import type { CuaParticipantDeps, DesktopParticipantRun } from "../types.js";
3
- export declare function createE2BParticipantDesktop(spec: DesktopParticipantRun, deps: CuaParticipantDeps, warnings: string[]): ParticipantDesktop;
2
+ import { type E2BDesktopDeps, type DesktopParticipantRun } from "../types.js";
3
+ export declare function createE2BParticipantDesktop(spec: DesktopParticipantRun, deps: E2BDesktopDeps, warnings: string[]): ParticipantDesktop;
@@ -1,7 +1,3 @@
1
- // E2B owns provisioning and final evidence; the participant runner only uses the ready port. The
2
- // lane's steps live in prepare.ts, start.ts and teardown.ts beside this file, and fill the state
3
- // record in state.ts in the order below.
4
- import { defaultSubjectPhaseSink } from "../../../subject/steps.js";
5
1
  import { createE2BDesktopExecutor } from "../../../substrates/e2b/desktop-executor.js";
6
2
  import { participantInbox, planParticipantComms } from "./comms.js";
7
3
  import { participantBrowserStateObserver } from "./fidelity.js";
@@ -9,6 +5,7 @@ import { acquireParticipantDesktop, provisionParticipantSubject, verifyParticipa
9
5
  import { openParticipantSurface, startParticipantMedia, startParticipantStream } from "./start.js";
10
6
  import { desktopEvidenceOf, newParticipantState } from "./state.js";
11
7
  import { finishE2BDesktop } from "./teardown.js";
8
+ import { participantServeUrl } from "../types.js";
12
9
  export function createE2BParticipantDesktop(spec, deps, warnings) {
13
10
  const targetUrl = spec.planned.targetUrl ?? deps.appUrl;
14
11
  const state = newParticipantState(spec);
@@ -17,15 +14,15 @@ export function createE2BParticipantDesktop(spec, deps, warnings) {
17
14
  deps,
18
15
  warnings,
19
16
  targetUrl,
20
- desktopCliRoute: deps.desktopCliRoute === true,
17
+ desktopCliRoute: deps.subject.kind === "desktop-cli",
21
18
  // Off-app comms (#297): gated entirely on config.comms; no comms declared, no change.
22
- comms: planParticipantComms(deps.config, targetUrl, deps.cloneRoute || deps.localTreeRoute === true),
19
+ comms: planParticipantComms(deps.residual.comms, participantServeUrl(deps.subject), targetUrl, deps.subject.kind === "clone" || deps.subject.kind === "local-tree"),
23
20
  // The default or injected sink sees every event, started and completed alike, so an operator
24
21
  // watching stderr sees both halves of each phase; the state keeps only completed ones.
25
22
  onSubjectPhase: (event) => {
26
23
  if (event.ok !== undefined)
27
24
  state.phaseRecords.push(event);
28
- (deps.hooks.onPhase ?? defaultSubjectPhaseSink)(event, {
25
+ deps.reportSubjectPhase(event, {
29
26
  laneId: spec.planned.id,
30
27
  laneIndex: spec.planned.index,
31
28
  laneCount: deps.participantCount,
@@ -1,30 +1,30 @@
1
- import type { LabConfig } from "../../../lab/types.js";
1
+ import type { ResidualConfig } from "../../../lab/plan-types.js";
2
2
  import type { RunDesktopGeometry } from "../../../run/streams.js";
3
3
  import type { DesktopBrowserFamily, DesktopBrowserLaunchIdentity } from "../../../substrates/e2b/desktop-browser.js";
4
4
  import { makeChromeBrowserStateObserver } from "../../../substrates/e2b/desktop-cdp.js";
5
5
  import { captureDesktopBrowserGeometry } from "../../../substrates/e2b/desktop-geometry.js";
6
6
  import type { E2BDesktopSandbox } from "../../../substrates/e2b/sdk.js";
7
- import type { CuaParticipantDeps, DesktopParticipantRun } from "../types.js";
7
+ import type { E2BDesktopDeps, DesktopParticipantRun } from "../types.js";
8
8
  type BrowserGeometry = Awaited<ReturnType<typeof captureDesktopBrowserGeometry>>;
9
- /** The mobile emulation a lane applied, updated as later tabs are covered and at teardown. */
9
+ /** The mobile emulation a participant applied, updated as later tabs are covered and at teardown. */
10
10
  export interface ParticipantFidelity {
11
11
  applied: RunDesktopGeometry["fidelity"] | undefined;
12
12
  emulatedTargetId: string | undefined;
13
13
  holderName: string | undefined;
14
14
  }
15
- /** Only lanes on a mobile preset are emulated; the flags go on the browser command line. */
16
- export declare function mobileLaunchFlags(config: LabConfig, spec: DesktopParticipantRun): string[];
15
+ /** Only participants on a mobile preset are emulated; the flags go on the browser command line. */
16
+ export declare function mobileLaunchFlags(residual: Readonly<ResidualConfig>, spec: DesktopParticipantRun): string[];
17
17
  /**
18
18
  * Apply mobile fidelity to the launch page before the geometry capture and the participant's first
19
- * observation. A request that cannot be applied fails the lane closed with the reason. Only lanes on
20
- * a mobile preset are emulated: a run-wide flag must not hand a desktop or tablet lane an iPhone
21
- * user agent (the first live proof did exactly that to the desktop newcomer beside the phone lane).
22
- * Those lanes carry no fidelity block, which is honest.
19
+ * observation. A request that cannot be applied fails the participant closed with the reason. Only
20
+ * participants on a mobile preset are emulated: a run-wide flag must not hand a desktop or tablet
21
+ * participant an iPhone user agent (the first live proof did exactly that to the desktop newcomer
22
+ * beside the phone participant). Those participants carry no fidelity block, which is honest.
23
23
  */
24
24
  export declare function applyParticipantMobileFidelity(args: {
25
25
  desktop: E2BDesktopSandbox;
26
26
  spec: DesktopParticipantRun;
27
- deps: CuaParticipantDeps;
27
+ deps: E2BDesktopDeps;
28
28
  targetUrl: string;
29
29
  browserFamily: DesktopBrowserFamily;
30
30
  launchIdentity: DesktopBrowserLaunchIdentity | undefined;
@@ -35,7 +35,7 @@ export declare function applyParticipantMobileFidelity(args: {
35
35
  export declare function participantBrowserStateObserver(args: {
36
36
  desktop: E2BDesktopSandbox;
37
37
  spec: DesktopParticipantRun;
38
- deps: CuaParticipantDeps;
38
+ deps: E2BDesktopDeps;
39
39
  targetUrl: string;
40
40
  launchIdentity: DesktopBrowserLaunchIdentity | undefined;
41
41
  targetId: string | undefined;
@@ -43,7 +43,7 @@ export declare function participantBrowserStateObserver(args: {
43
43
  warnings: string[];
44
44
  }): ReturnType<typeof makeChromeBrowserStateObserver>;
45
45
  /**
46
- * The lane's final browser geometry, measured while the sandbox is alive. A final capture that
46
+ * The participant's final browser geometry, measured while the sandbox is alive. A final capture that
47
47
  * measured EITHER field wins whole, so a partial final capture omits fields the launch-time capture
48
48
  * had (honest omission); only a final capture that measured NOTHING falls back to the launch-time
49
49
  * capture. Also reads the emulation holder's log into the fidelity block.
@@ -51,7 +51,7 @@ export declare function participantBrowserStateObserver(args: {
51
51
  export declare function finalParticipantGeometry(args: {
52
52
  desktop: E2BDesktopSandbox;
53
53
  spec: DesktopParticipantRun;
54
- deps: CuaParticipantDeps;
54
+ deps: E2BDesktopDeps;
55
55
  targetUrl: string;
56
56
  browserFamily: DesktopBrowserFamily;
57
57
  launchIdentity: DesktopBrowserLaunchIdentity | undefined;
@@ -1,13 +1,13 @@
1
- // Device fidelity for one E2B desktop lane: mobile emulation beyond viewport size (#221), the
1
+ // Device fidelity for one E2B desktop participant: mobile emulation beyond viewport size (#221), the
2
2
  // browser-state observer that watches it for drift (#623), and the final browser geometry.
3
3
  import { redactText, toErrorMessage } from "../../../evidence/redaction.js";
4
4
  import { readDetachedLog } from "../../../substrates/detached.js";
5
5
  import { applyMobileEmulation, DEFAULT_MOBILE_USER_AGENT, makeChromeBrowserStateObserver, } from "../../../substrates/e2b/desktop-cdp.js";
6
6
  import { captureDesktopBrowserGeometry } from "../../../substrates/e2b/desktop-geometry.js";
7
7
  import { e2bShell } from "../../../substrates/e2b/shell.js";
8
- /** Only lanes on a mobile preset are emulated; the flags go on the browser command line. */
9
- export function mobileLaunchFlags(config, spec) {
10
- const requested = config.execution?.desktop?.fidelity;
8
+ /** Only participants on a mobile preset are emulated; the flags go on the browser command line. */
9
+ export function mobileLaunchFlags(residual, spec) {
10
+ const requested = residual.execution?.desktop?.fidelity;
11
11
  if (!requested?.mobileEmulation || !spec.planned.device.preset.isMobile)
12
12
  return [];
13
13
  return [
@@ -25,14 +25,14 @@ function cdpEndpoint(identity, targetUrl) {
25
25
  }
26
26
  /**
27
27
  * Apply mobile fidelity to the launch page before the geometry capture and the participant's first
28
- * observation. A request that cannot be applied fails the lane closed with the reason. Only lanes on
29
- * a mobile preset are emulated: a run-wide flag must not hand a desktop or tablet lane an iPhone
30
- * user agent (the first live proof did exactly that to the desktop newcomer beside the phone lane).
31
- * Those lanes carry no fidelity block, which is honest.
28
+ * observation. A request that cannot be applied fails the participant closed with the reason. Only
29
+ * participants on a mobile preset are emulated: a run-wide flag must not hand a desktop or tablet
30
+ * participant an iPhone user agent (the first live proof did exactly that to the desktop newcomer
31
+ * beside the phone participant). Those participants carry no fidelity block, which is honest.
32
32
  */
33
33
  export async function applyParticipantMobileFidelity(args) {
34
34
  const { spec, deps } = args;
35
- const request = deps.config.execution?.desktop?.fidelity;
35
+ const request = deps.residual.execution?.desktop?.fidelity;
36
36
  const none = {
37
37
  applied: undefined,
38
38
  emulatedTargetId: undefined,
@@ -62,7 +62,7 @@ export function participantBrowserStateObserver(args) {
62
62
  const { spec, deps, fidelity, warnings } = args;
63
63
  return makeChromeBrowserStateObserver(args.desktop, deps.requestTimeoutMs, cdpEndpoint(args.launchIdentity, args.targetUrl), {
64
64
  targetId: args.targetId,
65
- // Once per lane: a dark observation channel is a gap in the instrument, and the
65
+ // Once per participant: a dark observation channel is a gap in the instrument, and the
66
66
  // funnel's NEVER MEASURED count needs this line to explain itself (#514).
67
67
  onUnavailable: (reason) => {
68
68
  warnings.push(`Browser-state observer unavailable for participant ${spec.planned.id} (${redactText(deps.scrubKnownValues(reason))}); ` +
@@ -94,7 +94,7 @@ export function participantBrowserStateObserver(args) {
94
94
  });
95
95
  }
96
96
  /**
97
- * The lane's final browser geometry, measured while the sandbox is alive. A final capture that
97
+ * The participant's final browser geometry, measured while the sandbox is alive. A final capture that
98
98
  * measured EITHER field wins whole, so a partial final capture omits fields the launch-time capture
99
99
  * had (honest omission); only a final capture that measured NOTHING falls back to the launch-time
100
100
  * capture. Also reads the emulation holder's log into the fidelity block.
@@ -5,12 +5,12 @@ export declare const CUA_ACTOR_LAB_PROVIDER_METADATA: {
5
5
  readonly tool: "humanish";
6
6
  };
7
7
  /**
8
- * Create the lane's sandbox, record its resources, run the adopter's prepare hook, and attach the
9
- * lane's inbox and comms catch. Returns the sandbox, which the later steps drive.
8
+ * Create the participant's sandbox, record its resources, run the adopter's prepare hook, and attach the
9
+ * participant's inbox and comms catch. Returns the sandbox, which the later steps drive.
10
10
  */
11
11
  export declare function acquireParticipantDesktop(ctx: E2BParticipantContext, state: E2BParticipantState): Promise<E2BDesktopSandbox>;
12
12
  /**
13
- * Verify the lane's screen in the sandbox. A mismatch fails the lane closed unless the run records
13
+ * Verify the participant's screen in the sandbox. A mismatch fails the participant closed unless the run records
14
14
  * requested and verified geometry side by side.
15
15
  */
16
16
  export declare function verifyParticipantScreen(ctx: E2BParticipantContext, state: E2BParticipantState, desktop: E2BDesktopSandbox): Promise<void>;
@@ -1,5 +1,5 @@
1
- // The first half of an E2B desktop lane's preparation: acquire the sandbox, verify its screen, and
2
- // provision the subject. Each step fills the lane's state; a step that cannot proceed throws.
1
+ // The first half of an E2B desktop participant's preparation: acquire the sandbox, verify its screen, and
2
+ // provision the subject. Each step fills the participant's state; a step that cannot proceed throws.
3
3
  import { redactText } from "../../../evidence/redaction.js";
4
4
  import { provisionCloneSubject } from "../../../subject/clone.js";
5
5
  import { provisionDesktopCli } from "../../../subject/desktop-cli.js";
@@ -10,22 +10,24 @@ import { acquireE2BDesktopSandbox, e2bDesktopTemplate } from "../../../substrate
10
10
  import { loadE2BDesktopModule } from "../../../substrates/e2b/sdk.js";
11
11
  import { e2bShell } from "../../../substrates/e2b/shell.js";
12
12
  import { attachReceivingInbox, participantCommsEnv, startCommsCatch } from "./comms.js";
13
+ import { participantSubjectEnv } from "../types.js";
13
14
  export const CUA_ACTOR_LAB_PROVIDER_METADATA = {
14
15
  mode: "cua-actor-lab",
15
16
  tool: "humanish",
16
17
  };
17
18
  /**
18
- * Create the lane's sandbox, record its resources, run the adopter's prepare hook, and attach the
19
- * lane's inbox and comms catch. Returns the sandbox, which the later steps drive.
19
+ * Create the participant's sandbox, record its resources, run the adopter's prepare hook, and attach the
20
+ * participant's inbox and comms catch. Returns the sandbox, which the later steps drive.
20
21
  */
21
22
  export async function acquireParticipantDesktop(ctx, state) {
22
23
  const { spec, deps, warnings } = ctx;
23
- const { config, subjectEnvNames, env } = deps;
24
- const subjectEnvValues = config.subject.envValues ?? {};
24
+ const { residual, env } = deps;
25
+ const subjectEnvNames = participantSubjectEnv(deps.subject);
26
+ const subjectEnvValues = residual.subject.envValues ?? {};
25
27
  // Off-app comms (#297): the base-URL env is injected at sandbox create, so the app reads it at
26
28
  // boot; the catch starts right after create.
27
29
  const commsEnv = participantCommsEnv(ctx.comms);
28
- const desktopModule = await (deps.hooks.loadDesktopModule ?? loadE2BDesktopModule)();
30
+ const desktopModule = await (deps.desktopModule ?? loadE2BDesktopModule)();
29
31
  // An explicit template wins. Speech gets the versioned media image; ordinary
30
32
  // browser studies retain the SDK default desktop.
31
33
  const acquired = await acquireE2BDesktopSandbox({
@@ -36,7 +38,7 @@ export async function acquireParticipantDesktop(ctx, state) {
36
38
  timeoutMs: deps.sandboxMs,
37
39
  metadata: {
38
40
  ...CUA_ACTOR_LAB_PROVIDER_METADATA,
39
- labId: config.id,
41
+ labId: deps.labId,
40
42
  simId: spec.recordId,
41
43
  laneId: spec.planned.id,
42
44
  laneIndex: String(spec.planned.index),
@@ -62,7 +64,7 @@ export async function acquireParticipantDesktop(ctx, state) {
62
64
  dpi: 96,
63
65
  lifecycle: { onTimeout: "kill" },
64
66
  },
65
- template: e2bDesktopTemplate(config),
67
+ template: e2bDesktopTemplate(residual),
66
68
  retry: {
67
69
  // The default loader reclaims an acquired handle before retrying failed desktop startup.
68
70
  // Its error names the cleanup outcome; pre-construction allocation failures remain unowned.
@@ -76,7 +78,7 @@ export async function acquireParticipantDesktop(ctx, state) {
76
78
  });
77
79
  },
78
80
  },
79
- // The receipt is on disk before any work, so `humanish reclaim` can kill this lane's
81
+ // The receipt is on disk before any work, so `humanish reclaim` can kill this participant's
80
82
  // sandbox by exact id after an interrupt.
81
83
  receipt: { root: deps.artifactRoot, participantId: spec.planned.id, now: deps.now },
82
84
  });
@@ -92,13 +94,10 @@ export async function acquireParticipantDesktop(ctx, state) {
92
94
  if ("reason" in desktopResources) {
93
95
  warnings.push(`Desktop resource size unavailable (${desktopResources.reason}); compute cost remains unpriced.`);
94
96
  }
95
- if (deps.hooks.prepareDesktop) {
96
- await deps.hooks.prepareDesktop(desktop, {
97
- laneId: spec.planned.id,
98
- laneIndex: spec.planned.index,
99
- laneCount: deps.participantCount,
100
- });
101
- }
97
+ await deps.prepareDesktop?.(desktop, {
98
+ kind: "participant",
99
+ participant: { id: spec.planned.id, index: spec.planned.index, count: deps.participantCount },
100
+ });
102
101
  if (deps.receiving) {
103
102
  state.receivingInboxUrl = await attachReceivingInbox(shell, spec, { ...deps, receiving: deps.receiving }, ctx.targetUrl);
104
103
  state.commsArtifactPath = "comms/receiving.json";
@@ -108,7 +107,7 @@ export async function acquireParticipantDesktop(ctx, state) {
108
107
  return desktop;
109
108
  }
110
109
  /**
111
- * Verify the lane's screen in the sandbox. A mismatch fails the lane closed unless the run records
110
+ * Verify the participant's screen in the sandbox. A mismatch fails the participant closed unless the run records
112
111
  * requested and verified geometry side by side.
113
112
  */
114
113
  export async function verifyParticipantScreen(ctx, state, desktop) {
@@ -135,7 +134,7 @@ export async function verifyParticipantScreen(ctx, state, desktop) {
135
134
  }
136
135
  if (screenGeometry.error && screenGeometry.verified) {
137
136
  // record-evidence policy: the bundle keeps requested vs verified as separate facts and
138
- // discloses the divergence instead of failing this lane's world mid-flight.
137
+ // discloses the divergence instead of failing this participant's world mid-flight.
139
138
  const mismatchWarning = deps.scrubKnownValues(`Participant ${spec.planned.id} requested a ${spec.planned.device.resolution[0]}x${spec.planned.device.resolution[1]} screen but xdpyinfo reports ${screenGeometry.verified.width}x${screenGeometry.verified.height}; recording requested vs verified separately instead of failing the participant closed.`);
140
139
  warnings.push(mismatchWarning);
141
140
  state.desktopGeometry = {
@@ -147,28 +146,26 @@ export async function verifyParticipantScreen(ctx, state, desktop) {
147
146
  /** Install a desktop CLI, or clone or unpack the subject and serve it, in the sandbox. */
148
147
  export async function provisionParticipantSubject(ctx, state, desktop) {
149
148
  const { deps } = ctx;
150
- const { config, cloneRoute, localTreeRoute, serve, subjectRepo } = deps;
149
+ const { residual, subject } = deps;
151
150
  const shell = e2bShell(desktop);
152
- if (ctx.desktopCliRoute) {
151
+ if (subject.kind === "desktop-cli") {
153
152
  // Prepare the runtime and any declared product install, UNKEYED. With install omitted,
154
153
  // the participant discovers and installs the product from its public surfaces.
155
154
  await provisionDesktopCli(shell, {
156
- product: config.subject.product?.name ?? "",
157
- ...(config.subject.product?.install === undefined
158
- ? {}
159
- : { install: config.subject.product.install }),
155
+ product: subject.product.name,
156
+ ...(subject.product.install === undefined ? {} : { install: subject.product.install }),
160
157
  requestTimeoutMs: deps.requestTimeoutMs,
161
158
  scrub: deps.scrubKnownValues,
162
159
  onPhase: ctx.onSubjectPhase,
163
160
  });
164
161
  }
165
- if (cloneRoute && serve && subjectRepo) {
162
+ if (subject.kind === "clone") {
166
163
  state.subjectCommit = await provisionCloneSubject(shell, {
167
- repo: subjectRepo,
168
- depth: config.subject.clone?.depth ?? 1,
169
- serve,
170
- ...(config.subject.state === undefined ? {} : { state: config.subject.state }),
171
- hasGithubToken: deps.hasGithubToken,
164
+ repo: subject.repo,
165
+ depth: residual.subject.clone?.depth ?? 1,
166
+ serve: subject.serve,
167
+ ...(subject.state === undefined ? {} : { state: subject.state }),
168
+ hasGithubToken: subject.env.includes("GITHUB_TOKEN"),
172
169
  requestTimeoutMs: deps.requestTimeoutMs,
173
170
  scrub: deps.scrubKnownValues,
174
171
  onCommit: (commit) => {
@@ -178,21 +175,21 @@ export async function provisionParticipantSubject(ctx, state, desktop) {
178
175
  state.stateStepRecords.push(record);
179
176
  },
180
177
  onPhase: ctx.onSubjectPhase,
181
- ...deps.hooks.detachedTimers,
178
+ ...deps.detachedTimers,
182
179
  });
183
180
  }
184
- else if (localTreeRoute && serve && deps.localTreeArchiveBuffer) {
181
+ else if (subject.kind === "local-tree" && deps.localTreeArchiveBuffer) {
185
182
  await provisionLocalTreeSubject(shell, {
186
183
  archiveBuffer: deps.localTreeArchiveBuffer,
187
- serve,
188
- ...(config.subject.state === undefined ? {} : { state: config.subject.state }),
184
+ serve: subject.serve,
185
+ ...(subject.state === undefined ? {} : { state: subject.state }),
189
186
  requestTimeoutMs: deps.requestTimeoutMs,
190
187
  scrub: deps.scrubKnownValues,
191
188
  onStateStep: (record) => {
192
189
  state.stateStepRecords.push(record);
193
190
  },
194
191
  onPhase: ctx.onSubjectPhase,
195
- ...deps.hooks.detachedTimers,
192
+ ...deps.detachedTimers,
196
193
  });
197
194
  }
198
195
  }