humanish 0.106.0 → 0.107.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. package/AGENTS.md +4 -2
  2. package/ARCHITECTURE.md +17 -16
  3. package/CHANGELOG.md +24 -0
  4. package/CONTEXT.md +42 -39
  5. package/CONTRIBUTING.md +8 -6
  6. package/README.md +8 -3
  7. package/dist/actors/codex/app-server-client.js +2 -1
  8. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  9. package/dist/actors/codex/app-server-trace.js +1 -3
  10. package/dist/actors/codex/app-server.js +2 -1
  11. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  12. package/dist/actors/codex/protocol-compat.js +357 -0
  13. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  14. package/dist/actors/codex/protocol-contract.js +471 -0
  15. package/dist/actors/codex/qualified-versions.d.ts +31 -4
  16. package/dist/actors/codex/qualified-versions.js +51 -6
  17. package/dist/actors/codex/restricted-executable.d.ts +24 -0
  18. package/dist/actors/codex/restricted-executable.js +97 -22
  19. package/dist/actors/codex/restricted-launch.d.ts +7 -1
  20. package/dist/actors/codex/restricted-launch.js +42 -3
  21. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  22. package/dist/actors/codex/restricted-notifications.js +277 -0
  23. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  24. package/dist/actors/codex/restricted-participant.js +60 -2
  25. package/dist/actors/codex/restricted-policy.d.ts +9 -1
  26. package/dist/actors/codex/restricted-session.d.ts +14 -1
  27. package/dist/actors/codex/restricted-session.js +50 -17
  28. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  29. package/dist/actors/codex/restricted-transport.js +139 -27
  30. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  31. package/dist/actors/codex/restricted-turn.js +43 -30
  32. package/dist/actors/computer-use/actor.d.ts +1 -1
  33. package/dist/actors/computer-use/actor.js +4 -4
  34. package/dist/actors/computer-use/loop/backstop.js +1 -1
  35. package/dist/actors/computer-use/loop/ending.d.ts +2 -2
  36. package/dist/actors/computer-use/loop/ending.js +2 -2
  37. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  38. package/dist/actors/computer-use/loop/spend.js +3 -3
  39. package/dist/actors/computer-use/loop/trace.js +2 -2
  40. package/dist/actors/computer-use/loop/types.d.ts +14 -5
  41. package/dist/actors/computer-use/loop.js +4 -4
  42. package/dist/actors/computer-use/openai-provider.d.ts +1 -1
  43. package/dist/actors/computer-use/openai-provider.js +2 -2
  44. package/dist/actors/contract.d.ts +10 -8
  45. package/dist/actors/contract.js +7 -1
  46. package/dist/actors/local-agent/cli.js +1 -1
  47. package/dist/actors/scripted-browser/actor.d.ts +2 -2
  48. package/dist/actors/scripted-browser/journey.js +15 -4
  49. package/dist/actors/scripted-browser/steps.js +18 -0
  50. package/dist/actors/scripted-browser/types.d.ts +11 -1
  51. package/dist/actors/stop-conditions.js +1 -3
  52. package/dist/analysis/automatic-completion.d.ts +13 -8
  53. package/dist/analysis/automatic-completion.js +14 -8
  54. package/dist/analysis/automatic-config.d.ts +1 -1
  55. package/dist/analysis/automatic-config.js +2 -2
  56. package/dist/analysis/automatic.d.ts +10 -4
  57. package/dist/analysis/automatic.js +17 -13
  58. package/dist/analysis/diagnostics.d.ts +23 -0
  59. package/dist/analysis/diagnostics.js +112 -0
  60. package/dist/analysis/evidence-sources.js +2 -2
  61. package/dist/analysis/evidence.js +6 -6
  62. package/dist/analysis/execute.d.ts +7 -1
  63. package/dist/analysis/execute.js +39 -12
  64. package/dist/analysis/job.d.ts +8 -5
  65. package/dist/analysis/job.js +15 -14
  66. package/dist/analysis/load.d.ts +1 -1
  67. package/dist/analysis/load.js +5 -5
  68. package/dist/analysis/provider.d.ts +9 -1
  69. package/dist/analysis/restricted-codex.d.ts +2 -0
  70. package/dist/analysis/restricted-codex.js +10 -1
  71. package/dist/analysis/service.d.ts +2 -0
  72. package/dist/analysis/service.js +31 -12
  73. package/dist/analysis/sharing.d.ts +2 -2
  74. package/dist/analysis/sharing.js +5 -5
  75. package/dist/analysis/store-executions.d.ts +5 -5
  76. package/dist/analysis/store-executions.js +12 -12
  77. package/dist/analysis/store.d.ts +4 -4
  78. package/dist/analysis/store.js +13 -13
  79. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  80. package/dist/cli/commands/analysis-signals.js +4 -1
  81. package/dist/cli/commands/analyze.js +4 -2
  82. package/dist/cli/commands/comms.js +8 -1
  83. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  84. package/dist/cli/commands/lab-route-computer-use.js +26 -14
  85. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  86. package/dist/cli/commands/lab-route-preview.js +3 -4
  87. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  88. package/dist/cli/commands/lab-route-run.js +6 -2
  89. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  90. package/dist/cli/commands/lab-route-scripted.js +0 -1
  91. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  92. package/dist/cli/commands/lab-route-shared-world.js +0 -1
  93. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  94. package/dist/cli/commands/lab-route-terminal.js +0 -1
  95. package/dist/cli/commands/lab-run.js +76 -45
  96. package/dist/cli/commands/lab-scorer.d.ts +0 -2
  97. package/dist/cli/commands/lab.js +12 -6
  98. package/dist/cli/commands/observe.js +22 -0
  99. package/dist/cli/commands/run-signals.d.ts +30 -0
  100. package/dist/cli/commands/run-signals.js +146 -0
  101. package/dist/cli/commands/runs.js +10 -8
  102. package/dist/cli/commands/watch.js +12 -10
  103. package/dist/cli/doctor.d.ts +3 -0
  104. package/dist/cli/doctor.js +10 -2
  105. package/dist/cli/io.d.ts +5 -4
  106. package/dist/cli/io.js +12 -8
  107. package/dist/cli/program.js +3 -3
  108. package/dist/cli/renamed-options.d.ts +11 -0
  109. package/dist/cli/renamed-options.js +18 -0
  110. package/dist/cli/telemetry.d.ts +2 -2
  111. package/dist/cli/telemetry.js +1 -1
  112. package/dist/comms/capture-surface.d.ts +1 -1
  113. package/dist/comms/catch-host.d.ts +1 -1
  114. package/dist/comms/connections.js +4 -4
  115. package/dist/comms/external-evidence.d.ts +27 -0
  116. package/dist/comms/external-evidence.js +93 -0
  117. package/dist/comms/lease-store.js +7 -7
  118. package/dist/comms/types.js +1 -1
  119. package/dist/evidence/browser-hygiene.d.ts +1 -1
  120. package/dist/evidence/browser-hygiene.js +1 -1
  121. package/dist/evidence/redaction.js +1 -1
  122. package/dist/evidence/secret-scrub.d.ts +9 -0
  123. package/dist/evidence/secret-scrub.js +96 -0
  124. package/dist/feedback/draft.js +7 -9
  125. package/dist/feedback/export-bundle.js +4 -4
  126. package/dist/feedback/export.js +9 -9
  127. package/dist/feedback/feedback.d.ts +1 -1
  128. package/dist/index.d.ts +3 -6
  129. package/dist/index.js +3 -6
  130. package/dist/keys/key-resolution.d.ts +3 -1
  131. package/dist/keys/key-resolution.js +18 -16
  132. package/dist/lab/adapter-extension.d.ts +28 -6
  133. package/dist/lab/adapter-extension.js +65 -126
  134. package/dist/lab/adapter-scorer-loader.d.ts +25 -5
  135. package/dist/lab/adapter-scorer-loader.js +24 -0
  136. package/dist/lab/composition-rules.d.ts +2 -0
  137. package/dist/lab/composition-rules.js +35 -26
  138. package/dist/lab/config.js +28 -26
  139. package/dist/lab/device-presets.d.ts +2 -2
  140. package/dist/lab/discover.js +1 -3
  141. package/dist/lab/doctor.d.ts +44 -9
  142. package/dist/lab/doctor.js +149 -41
  143. package/dist/lab/init-plan.js +1 -3
  144. package/dist/lab/keys.js +1 -1
  145. package/dist/lab/lab-deps.d.ts +85 -0
  146. package/dist/lab/lab-deps.js +4 -0
  147. package/dist/lab/parse/actors.js +8 -7
  148. package/dist/lab/parse/comms.js +3 -2
  149. package/dist/lab/parse/execution.js +3 -2
  150. package/dist/lab/parse/subject-state.js +2 -1
  151. package/dist/lab/parse/subject.js +2 -1
  152. package/dist/lab/parse/values.d.ts +0 -1
  153. package/dist/lab/parse/values.js +0 -3
  154. package/dist/lab/persona-resolve.d.ts +3 -3
  155. package/dist/lab/persona-resolve.js +4 -4
  156. package/dist/lab/persona.js +1 -3
  157. package/dist/lab/plan-base.d.ts +6 -2
  158. package/dist/lab/plan-base.js +22 -7
  159. package/dist/lab/plan-participants.d.ts +5 -5
  160. package/dist/lab/plan-participants.js +2 -2
  161. package/dist/lab/plan-types.d.ts +33 -7
  162. package/dist/lab/plan.d.ts +3 -11
  163. package/dist/lab/plan.js +18 -42
  164. package/dist/lab/preflight-result.js +0 -2
  165. package/dist/lab/preflight.d.ts +0 -3
  166. package/dist/lab/preflight.js +1 -1
  167. package/dist/lab/requirements.d.ts +20 -0
  168. package/dist/lab/requirements.js +54 -0
  169. package/dist/lab/route-inputs.d.ts +23 -12
  170. package/dist/lab/route-inputs.js +48 -51
  171. package/dist/lab/routing.d.ts +19 -24
  172. package/dist/lab/routing.js +14 -47
  173. package/dist/lab/run-lab-events.d.ts +6 -11
  174. package/dist/lab/run-lab-events.js +3 -11
  175. package/dist/lab/run-lab-homes.d.ts +64 -0
  176. package/dist/lab/run-lab-homes.js +3 -0
  177. package/dist/lab/run-lab-options.d.ts +12 -66
  178. package/dist/lab/run-lab-options.js +45 -275
  179. package/dist/lab/summary.d.ts +9 -4
  180. package/dist/lab/summary.js +15 -8
  181. package/dist/lab/types.d.ts +132 -132
  182. package/dist/lab/validation.d.ts +15 -15
  183. package/dist/lab/validation.js +28 -28
  184. package/dist/lab/warnings.js +20 -19
  185. package/dist/observer/artifact.d.ts +1 -1
  186. package/dist/observer/artifact.js +3 -3
  187. package/dist/observer/data.js +2 -2
  188. package/dist/observer/render.js +2 -2
  189. package/dist/observer/run-routes.d.ts +1 -1
  190. package/dist/observer/run-routes.js +5 -5
  191. package/dist/observer/serve.d.ts +17 -0
  192. package/dist/observer/serve.js +34 -3
  193. package/dist/observer-app.html +1 -1
  194. package/dist/routes/computer-use/bundle-parts.d.ts +1 -1
  195. package/dist/routes/computer-use/bundle-parts.js +10 -3
  196. package/dist/routes/computer-use/bundle.d.ts +4 -11
  197. package/dist/routes/computer-use/bundle.js +9 -15
  198. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  199. package/dist/routes/computer-use/diagnostics.js +1 -1
  200. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +10 -10
  201. package/dist/routes/computer-use/e2b-desktop/comms.js +11 -14
  202. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  203. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -7
  204. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +13 -13
  205. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -11
  206. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  207. package/dist/routes/computer-use/e2b-desktop/prepare.js +33 -36
  208. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  209. package/dist/routes/computer-use/e2b-desktop/start.js +24 -23
  210. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  211. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  212. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  213. package/dist/routes/computer-use/e2b-desktop/teardown.js +29 -17
  214. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  215. package/dist/routes/computer-use/external-comms.js +19 -43
  216. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  217. package/dist/routes/computer-use/fanout-bundle.js +25 -29
  218. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +25 -19
  219. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  220. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  221. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  222. package/dist/routes/computer-use/live-flush.js +19 -27
  223. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +14 -13
  224. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  225. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  226. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  227. package/dist/routes/computer-use/local-vm.js +39 -66
  228. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  229. package/dist/routes/computer-use/participant-desktop.js +5 -25
  230. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +10 -10
  231. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +35 -22
  232. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  233. package/dist/routes/computer-use/participant-facts.js +12 -1
  234. package/dist/routes/computer-use/participant-model.d.ts +19 -11
  235. package/dist/routes/computer-use/participant-model.js +58 -33
  236. package/dist/routes/computer-use/participant-prompt.d.ts +3 -3
  237. package/dist/routes/computer-use/participant-prompt.js +4 -4
  238. package/dist/routes/computer-use/participant-runs.d.ts +6 -6
  239. package/dist/routes/computer-use/participant-runs.js +8 -8
  240. package/dist/routes/computer-use/plan.d.ts +21 -29
  241. package/dist/routes/computer-use/plan.js +59 -65
  242. package/dist/routes/computer-use/preflight.d.ts +6 -11
  243. package/dist/routes/computer-use/preflight.js +26 -18
  244. package/dist/routes/computer-use/rerun-selection.js +10 -6
  245. package/dist/routes/computer-use/result.d.ts +1 -1
  246. package/dist/routes/computer-use/result.js +40 -30
  247. package/dist/routes/computer-use/route.d.ts +3 -4
  248. package/dist/routes/computer-use/route.js +21 -19
  249. package/dist/routes/computer-use/self-report.d.ts +2 -2
  250. package/dist/routes/computer-use/self-report.js +4 -4
  251. package/dist/routes/computer-use/setup.d.ts +8 -17
  252. package/dist/routes/computer-use/setup.js +98 -86
  253. package/dist/routes/computer-use/single-bundle.d.ts +8 -11
  254. package/dist/routes/computer-use/single-bundle.js +20 -25
  255. package/dist/routes/computer-use/subject-projection.d.ts +5 -7
  256. package/dist/routes/computer-use/subject-projection.js +20 -19
  257. package/dist/routes/computer-use/types.d.ts +169 -211
  258. package/dist/routes/computer-use/types.js +13 -6
  259. package/dist/routes/preview.js +0 -1
  260. package/dist/routes/scripted/bundle.d.ts +3 -6
  261. package/dist/routes/scripted/bundle.js +11 -16
  262. package/dist/routes/scripted/plan.d.ts +5 -7
  263. package/dist/routes/scripted/plan.js +6 -4
  264. package/dist/routes/scripted/result.d.ts +4 -1
  265. package/dist/routes/scripted/result.js +10 -6
  266. package/dist/routes/scripted/route.js +10 -11
  267. package/dist/routes/scripted/scenario.d.ts +1 -1
  268. package/dist/routes/scripted/scenario.js +1 -1
  269. package/dist/routes/scripted/setup.d.ts +3 -2
  270. package/dist/routes/scripted/setup.js +22 -21
  271. package/dist/routes/scripted/subject.d.ts +8 -3
  272. package/dist/routes/scripted/subject.js +11 -6
  273. package/dist/routes/scripted/surface-records.js +1 -1
  274. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  275. package/dist/routes/scripted/surface-sessions.js +4 -4
  276. package/dist/routes/scripted/types.d.ts +19 -36
  277. package/dist/routes/scripted/types.js +1 -2
  278. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +8 -8
  279. package/dist/routes/shared-world/bundle.d.ts +2 -2
  280. package/dist/routes/shared-world/bundle.js +22 -26
  281. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  282. package/dist/routes/shared-world/checkpoints.js +4 -4
  283. package/dist/routes/shared-world/comms.d.ts +5 -4
  284. package/dist/routes/shared-world/comms.js +28 -41
  285. package/dist/routes/shared-world/external-public.d.ts +5 -5
  286. package/dist/routes/shared-world/external-public.js +19 -20
  287. package/dist/routes/shared-world/handoff.d.ts +4 -4
  288. package/dist/routes/shared-world/handoff.js +50 -50
  289. package/dist/routes/shared-world/lobby-code.d.ts +5 -5
  290. package/dist/routes/shared-world/lobby-code.js +13 -13
  291. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +8 -6
  292. package/dist/routes/shared-world/{seats.js → participant-specs.js} +46 -51
  293. package/dist/routes/shared-world/plan.d.ts +2 -6
  294. package/dist/routes/shared-world/plan.js +1 -2
  295. package/dist/routes/shared-world/provenance.d.ts +4 -4
  296. package/dist/routes/shared-world/provenance.js +4 -4
  297. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  298. package/dist/routes/shared-world/provisioned.js +48 -41
  299. package/dist/routes/shared-world/result.js +31 -19
  300. package/dist/routes/shared-world/route.js +37 -41
  301. package/dist/routes/shared-world/setup.d.ts +5 -4
  302. package/dist/routes/shared-world/setup.js +12 -14
  303. package/dist/routes/shared-world/types.d.ts +53 -126
  304. package/dist/routes/shared-world/types.js +2 -2
  305. package/dist/routes/terminal/adapter.d.ts +8 -8
  306. package/dist/routes/terminal/adapter.js +28 -125
  307. package/dist/routes/terminal/bundle.d.ts +7 -12
  308. package/dist/routes/terminal/bundle.js +24 -34
  309. package/dist/routes/terminal/credentials.d.ts +2 -2
  310. package/dist/routes/terminal/credentials.js +16 -16
  311. package/dist/routes/terminal/dry-run.d.ts +1 -1
  312. package/dist/routes/terminal/dry-run.js +9 -11
  313. package/dist/routes/terminal/encoding.d.ts +1 -1
  314. package/dist/routes/terminal/encoding.js +2 -2
  315. package/dist/routes/terminal/ledger.d.ts +6 -6
  316. package/dist/routes/terminal/ledger.js +9 -9
  317. package/dist/routes/terminal/live-finish.d.ts +1 -2
  318. package/dist/routes/terminal/live-finish.js +21 -20
  319. package/dist/routes/terminal/live-sandbox.d.ts +4 -2
  320. package/dist/routes/terminal/live-sandbox.js +25 -21
  321. package/dist/routes/terminal/participant-text.d.ts +23 -0
  322. package/dist/routes/terminal/participant-text.js +165 -0
  323. package/dist/routes/terminal/plan.d.ts +2 -6
  324. package/dist/routes/terminal/plan.js +13 -9
  325. package/dist/routes/terminal/recorder.d.ts +6 -1
  326. package/dist/routes/terminal/recorder.js +12 -4
  327. package/dist/routes/terminal/result.js +4 -4
  328. package/dist/routes/terminal/route.js +26 -26
  329. package/dist/routes/terminal/runtime.d.ts +3 -2
  330. package/dist/routes/terminal/runtime.js +3 -3
  331. package/dist/routes/terminal/sandbox.d.ts +5 -3
  332. package/dist/routes/terminal/sandbox.js +13 -16
  333. package/dist/routes/terminal/session.js +16 -14
  334. package/dist/routes/terminal/token-usage.js +5 -5
  335. package/dist/routes/terminal/trace.d.ts +5 -8
  336. package/dist/routes/terminal/trace.js +9 -64
  337. package/dist/routes/terminal/types.d.ts +85 -93
  338. package/dist/routes/terminal/types.js +9 -4
  339. package/dist/run/active-runs.d.ts +13 -0
  340. package/dist/run/active-runs.js +12 -0
  341. package/dist/run/bundle-shape.d.ts +2 -1
  342. package/dist/run/bundle-shape.js +4 -4
  343. package/dist/run/bundle.d.ts +63 -56
  344. package/dist/run/bundle.js +9 -8
  345. package/dist/run/cost-summary.js +3 -2
  346. package/dist/run/costs.d.ts +6 -6
  347. package/dist/run/costs.js +10 -10
  348. package/dist/run/detail.d.ts +5 -5
  349. package/dist/run/detail.js +6 -6
  350. package/dist/run/dry-run.js +5 -12
  351. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  352. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  353. package/dist/run/feedback-shape.js +1 -1
  354. package/dist/run/judge.d.ts +16 -4
  355. package/dist/run/judge.js +24 -7
  356. package/dist/run/locate.d.ts +2 -0
  357. package/dist/run/locate.js +3 -1
  358. package/dist/run/outcomes.d.ts +3 -3
  359. package/dist/run/outcomes.js +3 -3
  360. package/dist/run/participant-records.d.ts +2 -2
  361. package/dist/run/participant-records.js +2 -2
  362. package/dist/run/paths.js +1 -1
  363. package/dist/run/pricing.d.ts +19 -9
  364. package/dist/run/pricing.js +30 -18
  365. package/dist/run/projection.d.ts +13 -13
  366. package/dist/run/projection.js +8 -8
  367. package/dist/run/reclaim.d.ts +7 -1
  368. package/dist/run/reclaim.js +24 -4
  369. package/dist/run/results.d.ts +1 -1
  370. package/dist/run/run-index.d.ts +1 -1
  371. package/dist/run/run-index.js +11 -11
  372. package/dist/run/run.d.ts +4 -2
  373. package/dist/run/run.js +9 -5
  374. package/dist/run/sandbox-receipts.d.ts +4 -4
  375. package/dist/run/sandbox-receipts.js +4 -4
  376. package/dist/run/shared-world-evidence.d.ts +47 -47
  377. package/dist/run/shared-world-shape.d.ts +3 -3
  378. package/dist/run/shared-world-shape.js +11 -11
  379. package/dist/run/stats.d.ts +5 -5
  380. package/dist/run/stats.js +8 -8
  381. package/dist/run/status.d.ts +16 -6
  382. package/dist/run/status.js +31 -8
  383. package/dist/run/streams.d.ts +26 -19
  384. package/dist/run/terminal-contract.d.ts +5 -5
  385. package/dist/run/terminal-contract.js +4 -4
  386. package/dist/run/transient-comms-secrets.d.ts +5 -0
  387. package/dist/run/transient-comms-secrets.js +12 -0
  388. package/dist/run-lab.d.ts +36 -34
  389. package/dist/run-lab.js +41 -37
  390. package/dist/subject/desktop-cli.d.ts +1 -1
  391. package/dist/subject/desktop-cli.js +1 -1
  392. package/dist/subject/local-tree-archive.d.ts +1 -1
  393. package/dist/subject/local-tree-archive.js +4 -4
  394. package/dist/subject/local-tree.d.ts +2 -2
  395. package/dist/subject/local-tree.js +1 -1
  396. package/dist/subject/node-bootstrap.d.ts +1 -1
  397. package/dist/subject/node-bootstrap.js +4 -4
  398. package/dist/subject/runtime.js +5 -5
  399. package/dist/subject/serve.js +1 -1
  400. package/dist/subject/steps.d.ts +4 -4
  401. package/dist/subject/steps.js +5 -5
  402. package/dist/substrates/desktop-session.d.ts +2 -0
  403. package/dist/substrates/e2b/cdp-probe.d.ts +2 -2
  404. package/dist/substrates/e2b/cdp-probe.js +1 -1
  405. package/dist/substrates/e2b/desktop-browser.d.ts +3 -3
  406. package/dist/substrates/e2b/desktop-browser.js +4 -4
  407. package/dist/substrates/e2b/desktop-cdp.d.ts +7 -7
  408. package/dist/substrates/e2b/desktop-cdp.js +4 -4
  409. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  410. package/dist/substrates/e2b/desktop-geometry.js +3 -3
  411. package/dist/substrates/e2b/desktop-media.js +2 -2
  412. package/dist/substrates/e2b/sandbox.d.ts +2 -0
  413. package/dist/substrates/e2b/sandbox.js +22 -8
  414. package/dist/substrates/e2b/sdk.d.ts +12 -1
  415. package/dist/substrates/e2b/sdk.js +30 -9
  416. package/dist/substrates/local/runtime-host.d.ts +2 -0
  417. package/dist/substrates/local/runtime-host.js +6 -0
  418. package/dist/tui/actions.d.ts +7 -5
  419. package/dist/tui/actions.js +18 -9
  420. package/dist/tui-app.js +42 -42
  421. package/dist/verify/actor.d.ts +10 -10
  422. package/dist/verify/actor.js +15 -15
  423. package/dist/verify/artifacts.d.ts +1 -1
  424. package/dist/verify/artifacts.js +3 -3
  425. package/dist/verify/costs.d.ts +2 -2
  426. package/dist/verify/costs.js +2 -2
  427. package/dist/verify/liveness.d.ts +1 -1
  428. package/dist/verify/liveness.js +4 -1
  429. package/dist/verify/rerun.d.ts +1 -1
  430. package/dist/verify/rerun.js +1 -1
  431. package/dist/verify/shared-world.js +2 -2
  432. package/dist/verify/verify.js +6 -6
  433. package/docs/README.md +1 -1
  434. package/docs/architecture/actor-contract.md +60 -22
  435. package/docs/architecture/desktop-sessions.md +9 -9
  436. package/docs/architecture/external-public-shared-world.md +5 -0
  437. package/docs/architecture/observer.md +4 -4
  438. package/docs/architecture/restricted-codex-analysis.md +40 -4
  439. package/docs/architecture/state-driven-executor.md +4 -5
  440. package/docs/architecture/task-protocol-support.md +3 -5
  441. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +24 -16
  442. package/docs/contracts/run-bundle.md +10 -8
  443. package/docs/contracts/schemas.md +109 -53
  444. package/docs/contracts/study-analysis.md +24 -0
  445. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  446. package/docs/product/automatic-analysis.md +1 -0
  447. package/docs/ramp/README.md +2 -1
  448. package/package.json +4 -4
  449. package/skills/humanish/SKILL.md +3 -2
  450. package/skills/humanish/agents/openai.yaml +1 -1
  451. package/dist/deprecated.d.ts +0 -90
  452. package/dist/deprecated.js +0 -106
  453. package/dist/lab/bag-overrides.d.ts +0 -18
  454. package/dist/lab/bag-overrides.js +0 -121
  455. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  456. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  457. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  458. /package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +0 -0
  459. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -34,7 +34,7 @@ export declare function participantFeedbackCandidates(args: {
34
34
  commsArtifactPath?: string;
35
35
  }>;
36
36
  }): RunFeedbackCandidate[];
37
- /** Human-readable provenance line for the single-lane subject.provenance event (invariant 5):
37
+ /** Human-readable provenance line for the single-participant subject.provenance event (invariant 5):
38
38
  * claims "cloned/packed and served" ONLY when it actually happened. */
39
39
  export declare function subjectProvenanceMessage(provenance: CuaSubjectProvenanceArg, publicAppUrl: string, dryRun: boolean, hasSession: boolean): string;
40
40
  export declare function providerResourcesForOutcome(args: {
@@ -109,7 +109,7 @@ export function participantFeedbackCandidates(args) {
109
109
  }
110
110
  return candidates;
111
111
  }
112
- /** Human-readable provenance line for the single-lane subject.provenance event (invariant 5):
112
+ /** Human-readable provenance line for the single-participant subject.provenance event (invariant 5):
113
113
  * claims "cloned/packed and served" ONLY when it actually happened. */
114
114
  export function subjectProvenanceMessage(provenance, publicAppUrl, dryRun, hasSession) {
115
115
  if (provenance.source === "clone") {
@@ -149,14 +149,21 @@ export function providerResourcesForOutcome(args) {
149
149
  kind: "sandbox",
150
150
  id: args.outcome.sandboxId,
151
151
  owner: "humanish",
152
- status: args.outcome.killed ? "killed" : "running",
152
+ // Only a sandbox kept on purpose is known to be running; an unconfirmed release may or may
153
+ // not have stopped it.
154
+ status: args.outcome.killed
155
+ ? "killed"
156
+ : args.outcome.sandboxRelease?.state === "retained"
157
+ ? "running"
158
+ : "unknown",
153
159
  ...participantResourceIds(args.ids, args.participantId),
154
160
  createdAt: args.createdAt,
155
161
  cleanup: {
156
162
  killed: args.outcome.killed,
157
163
  reason: args.outcome.killed
158
164
  ? "killed during normal participant teardown"
159
- : "not killed during normal participant teardown; cleanup may reclaim by exact recorded id",
165
+ : (args.outcome.sandboxRelease?.warning ??
166
+ "not killed during normal participant teardown; cleanup may reclaim by exact recorded id"),
160
167
  },
161
168
  },
162
169
  ];
@@ -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>;