humanish 0.106.1 → 0.108.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 (668) hide show
  1. package/ARCHITECTURE.md +38 -32
  2. package/CHANGELOG.md +28 -0
  3. package/CONTEXT.md +51 -41
  4. package/README.md +152 -174
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-client.js +2 -1
  14. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  15. package/dist/actors/codex/app-server-trace.js +1 -3
  16. package/dist/actors/codex/app-server-ui.js +1 -1
  17. package/dist/actors/codex/app-server.js +2 -1
  18. package/dist/actors/codex/codex-admission.d.ts +91 -0
  19. package/dist/actors/codex/codex-admission.js +150 -0
  20. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  21. package/dist/actors/codex/protocol-compat.js +357 -0
  22. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  23. package/dist/actors/codex/protocol-contract.js +471 -0
  24. package/dist/actors/codex/restricted-executable.d.ts +28 -4
  25. package/dist/actors/codex/restricted-executable.js +104 -29
  26. package/dist/actors/codex/restricted-launch.d.ts +9 -2
  27. package/dist/actors/codex/restricted-launch.js +43 -4
  28. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  29. package/dist/actors/codex/restricted-notifications.js +277 -0
  30. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  31. package/dist/actors/codex/restricted-participant.js +66 -6
  32. package/dist/actors/codex/restricted-policy.d.ts +11 -3
  33. package/dist/actors/codex/restricted-policy.js +2 -2
  34. package/dist/actors/codex/restricted-session.d.ts +16 -3
  35. package/dist/actors/codex/restricted-session.js +60 -22
  36. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  37. package/dist/actors/codex/restricted-transport.js +139 -27
  38. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  39. package/dist/actors/codex/restricted-turn.js +43 -30
  40. package/dist/actors/computer-use/actor.d.ts +17 -17
  41. package/dist/actors/computer-use/actor.js +6 -6
  42. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  43. package/dist/actors/computer-use/admission-limit.js +1 -1
  44. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  45. package/dist/actors/computer-use/loop/actions.js +10 -10
  46. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  47. package/dist/actors/computer-use/loop/backstop.js +15 -13
  48. package/dist/actors/computer-use/loop/ending.d.ts +7 -7
  49. package/dist/actors/computer-use/loop/ending.js +9 -9
  50. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  51. package/dist/actors/computer-use/loop/observation.js +9 -9
  52. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  53. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  54. package/dist/actors/computer-use/loop/session.js +3 -3
  55. package/dist/actors/computer-use/loop/spend.d.ts +2 -2
  56. package/dist/actors/computer-use/loop/spend.js +4 -4
  57. package/dist/actors/computer-use/loop/trace.js +11 -10
  58. package/dist/actors/computer-use/loop/types.d.ts +37 -26
  59. package/dist/actors/computer-use/loop/usage.js +2 -2
  60. package/dist/actors/computer-use/loop.js +4 -4
  61. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  62. package/dist/actors/computer-use/openai-context.js +214 -0
  63. package/dist/actors/computer-use/openai-provider.d.ts +12 -9
  64. package/dist/actors/computer-use/openai-provider.js +47 -36
  65. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  66. package/dist/actors/computer-use/openai-requests.js +82 -15
  67. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  68. package/dist/actors/computer-use/openai-wire.js +36 -34
  69. package/dist/actors/contract.d.ts +86 -49
  70. package/dist/actors/contract.js +29 -23
  71. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  72. package/dist/actors/local-agent/claude-session.js +10 -9
  73. package/dist/actors/local-agent/cli.d.ts +8 -6
  74. package/dist/actors/local-agent/cli.js +24 -28
  75. package/dist/actors/local-agent/readiness.d.ts +2 -2
  76. package/dist/actors/local-agent/readiness.js +4 -4
  77. package/dist/actors/reasoning-effort.js +6 -6
  78. package/dist/actors/registry.d.ts +10 -10
  79. package/dist/actors/registry.js +18 -17
  80. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  81. package/dist/actors/scripted-browser/actor.js +16 -16
  82. package/dist/actors/scripted-browser/browser-command.js +1 -1
  83. package/dist/actors/scripted-browser/journey.js +15 -4
  84. package/dist/actors/scripted-browser/steps.js +19 -1
  85. package/dist/actors/scripted-browser/types.d.ts +12 -2
  86. package/dist/actors/stop-conditions.d.ts +1 -1
  87. package/dist/actors/stop-conditions.js +1 -3
  88. package/dist/analysis/automatic-completion.d.ts +13 -8
  89. package/dist/analysis/automatic-completion.js +14 -8
  90. package/dist/analysis/automatic-config.d.ts +1 -1
  91. package/dist/analysis/automatic-config.js +2 -2
  92. package/dist/analysis/automatic.d.ts +10 -4
  93. package/dist/analysis/automatic.js +17 -13
  94. package/dist/analysis/codex-config.d.ts +6 -2
  95. package/dist/analysis/codex-config.js +22 -14
  96. package/dist/analysis/diagnostics.d.ts +23 -0
  97. package/dist/analysis/diagnostics.js +112 -0
  98. package/dist/analysis/evidence-sources.js +2 -2
  99. package/dist/analysis/evidence.js +6 -6
  100. package/dist/analysis/execute.d.ts +7 -1
  101. package/dist/analysis/execute.js +39 -12
  102. package/dist/analysis/job.d.ts +8 -5
  103. package/dist/analysis/job.js +15 -14
  104. package/dist/analysis/load.d.ts +1 -1
  105. package/dist/analysis/load.js +5 -5
  106. package/dist/analysis/provider.d.ts +9 -1
  107. package/dist/analysis/restricted-codex.d.ts +2 -0
  108. package/dist/analysis/restricted-codex.js +10 -1
  109. package/dist/analysis/service.d.ts +2 -0
  110. package/dist/analysis/service.js +35 -16
  111. package/dist/analysis/sharing.d.ts +2 -2
  112. package/dist/analysis/sharing.js +5 -5
  113. package/dist/analysis/store-executions.d.ts +5 -5
  114. package/dist/analysis/store-executions.js +12 -12
  115. package/dist/analysis/store.d.ts +4 -4
  116. package/dist/analysis/store.js +13 -13
  117. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  118. package/dist/cli/commands/analysis-signals.js +4 -1
  119. package/dist/cli/commands/analyze.js +23 -18
  120. package/dist/cli/commands/codex.js +9 -9
  121. package/dist/cli/commands/comms.js +62 -34
  122. package/dist/cli/commands/feedback.js +20 -21
  123. package/dist/cli/commands/lab-format.d.ts +5 -4
  124. package/dist/cli/commands/lab-format.js +35 -23
  125. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  126. package/dist/cli/commands/lab-route-computer-use.js +32 -21
  127. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  128. package/dist/cli/commands/lab-route-preview.js +7 -7
  129. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  130. package/dist/cli/commands/lab-route-run.js +6 -2
  131. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  132. package/dist/cli/commands/lab-route-scripted.js +0 -1
  133. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  134. package/dist/cli/commands/lab-route-shared-world.js +3 -4
  135. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  136. package/dist/cli/commands/lab-route-terminal.js +0 -1
  137. package/dist/cli/commands/lab-run.js +84 -54
  138. package/dist/cli/commands/lab-scorer.d.ts +2 -4
  139. package/dist/cli/commands/lab-scorer.js +1 -1
  140. package/dist/cli/commands/migrate.d.ts +4 -0
  141. package/dist/cli/commands/migrate.js +65 -0
  142. package/dist/cli/commands/observe.js +168 -107
  143. package/dist/cli/commands/run-command.d.ts +10 -0
  144. package/dist/cli/commands/run-command.js +85 -0
  145. package/dist/cli/commands/run-signals.d.ts +30 -0
  146. package/dist/cli/commands/run-signals.js +146 -0
  147. package/dist/cli/commands/runs.js +137 -136
  148. package/dist/cli/commands/setup.d.ts +2 -2
  149. package/dist/cli/commands/setup.js +26 -21
  150. package/dist/cli/commands/study.d.ts +3 -0
  151. package/dist/cli/commands/study.js +182 -0
  152. package/dist/cli/commands/tui.d.ts +4 -4
  153. package/dist/cli/commands/tui.js +21 -21
  154. package/dist/cli/commands/watch.js +64 -77
  155. package/dist/cli/deprecations.d.ts +18 -0
  156. package/dist/cli/deprecations.js +48 -0
  157. package/dist/cli/doctor.d.ts +18 -5
  158. package/dist/cli/doctor.js +111 -48
  159. package/dist/cli/first-run-path.d.ts +12 -10
  160. package/dist/cli/first-run-path.js +30 -28
  161. package/dist/cli/io.d.ts +46 -10
  162. package/dist/cli/io.js +109 -30
  163. package/dist/cli/observer-follow.d.ts +2 -2
  164. package/dist/cli/observer-follow.js +5 -6
  165. package/dist/cli/orientation.d.ts +6 -3
  166. package/dist/cli/orientation.js +43 -39
  167. package/dist/cli/product-sentence.d.ts +6 -0
  168. package/dist/cli/product-sentence.js +6 -0
  169. package/dist/cli/program.d.ts +6 -1
  170. package/dist/cli/program.js +112 -43
  171. package/dist/cli/telemetry.d.ts +17 -17
  172. package/dist/cli/telemetry.js +49 -41
  173. package/dist/cli.js +1 -1
  174. package/dist/comms/capture-surface.d.ts +14 -13
  175. package/dist/comms/capture-surface.js +23 -22
  176. package/dist/comms/catch-host.d.ts +8 -8
  177. package/dist/comms/catch-host.js +14 -14
  178. package/dist/comms/connections.js +4 -4
  179. package/dist/comms/email-catch.d.ts +3 -3
  180. package/dist/comms/email-catch.js +8 -8
  181. package/dist/comms/external-evidence.d.ts +27 -0
  182. package/dist/comms/external-evidence.js +93 -0
  183. package/dist/comms/extract.js +2 -2
  184. package/dist/comms/fake-inbox.d.ts +2 -2
  185. package/dist/comms/fake-inbox.js +2 -2
  186. package/dist/comms/lease-store.js +7 -7
  187. package/dist/comms/receiving-render.d.ts +1 -1
  188. package/dist/comms/receiving-render.js +2 -2
  189. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  190. package/dist/comms/sandbox-catch-script.js +6 -6
  191. package/dist/comms/sandbox-catch.d.ts +36 -37
  192. package/dist/comms/sandbox-catch.js +34 -35
  193. package/dist/comms/setup.js +42 -8
  194. package/dist/comms/thread-evidence.d.ts +1 -1
  195. package/dist/comms/thread-evidence.js +6 -6
  196. package/dist/comms/types.d.ts +6 -6
  197. package/dist/comms/types.js +4 -4
  198. package/dist/evidence/browser-hygiene.d.ts +1 -1
  199. package/dist/evidence/browser-hygiene.js +1 -1
  200. package/dist/evidence/frame-signature.d.ts +1 -1
  201. package/dist/evidence/frame-signature.js +4 -4
  202. package/dist/evidence/redaction.d.ts +3 -3
  203. package/dist/evidence/redaction.js +5 -5
  204. package/dist/evidence/secret-scrub.d.ts +9 -0
  205. package/dist/evidence/secret-scrub.js +96 -0
  206. package/dist/feedback/draft.js +41 -85
  207. package/dist/feedback/export-bundle.js +5 -5
  208. package/dist/feedback/export.d.ts +5 -1
  209. package/dist/feedback/export.js +16 -17
  210. package/dist/feedback/feedback.d.ts +3 -3
  211. package/dist/feedback/feedback.js +21 -3
  212. package/dist/guest/chromium-text.js +2 -2
  213. package/dist/guest/desktop-native.d.ts +1 -1
  214. package/dist/guest/runtime.js +1 -1
  215. package/dist/index.d.ts +14 -15
  216. package/dist/index.js +10 -11
  217. package/dist/keys/key-resolution.d.ts +7 -5
  218. package/dist/keys/key-resolution.js +40 -38
  219. package/dist/lab/adapter-extension.d.ts +35 -13
  220. package/dist/lab/adapter-extension.js +50 -134
  221. package/dist/lab/adapter-scorer-loader.d.ts +32 -12
  222. package/dist/lab/adapter-scorer-loader.js +56 -32
  223. package/dist/lab/composition-rules.js +58 -58
  224. package/dist/lab/config.js +85 -43
  225. package/dist/lab/deprecated-fields.d.ts +10 -0
  226. package/dist/lab/deprecated-fields.js +24 -0
  227. package/dist/lab/device-presets.d.ts +10 -10
  228. package/dist/lab/device-presets.js +11 -11
  229. package/dist/lab/discover.d.ts +13 -9
  230. package/dist/lab/discover.js +118 -60
  231. package/dist/lab/doctor.d.ts +53 -11
  232. package/dist/lab/doctor.js +193 -47
  233. package/dist/lab/init-plan.js +1 -3
  234. package/dist/lab/init-templates.js +147 -147
  235. package/dist/lab/init.d.ts +1 -1
  236. package/dist/lab/init.js +41 -9
  237. package/dist/lab/keys.d.ts +2 -0
  238. package/dist/lab/keys.js +43 -9
  239. package/dist/lab/lab-deps.d.ts +80 -0
  240. package/dist/lab/lab-deps.js +4 -0
  241. package/dist/lab/parse/actors.js +17 -16
  242. package/dist/lab/parse/comms.js +8 -7
  243. package/dist/lab/parse/execution.js +15 -14
  244. package/dist/lab/parse/study-v3.d.ts +23 -0
  245. package/dist/lab/parse/study-v3.js +259 -0
  246. package/dist/lab/parse/subject-state.d.ts +7 -7
  247. package/dist/lab/parse/subject-state.js +18 -17
  248. package/dist/lab/parse/subject.js +30 -29
  249. package/dist/lab/parse/values.d.ts +1 -2
  250. package/dist/lab/parse/values.js +3 -6
  251. package/dist/lab/persona-resolve.d.ts +7 -7
  252. package/dist/lab/persona-resolve.js +8 -8
  253. package/dist/lab/persona.js +1 -3
  254. package/dist/lab/plan-base.d.ts +0 -2
  255. package/dist/lab/plan-base.js +6 -4
  256. package/dist/lab/plan-participants.d.ts +7 -7
  257. package/dist/lab/plan-participants.js +2 -2
  258. package/dist/lab/plan-types.d.ts +26 -8
  259. package/dist/lab/plan.d.ts +4 -18
  260. package/dist/lab/plan.js +24 -79
  261. package/dist/lab/preflight-probes.js +11 -11
  262. package/dist/lab/preflight-result.d.ts +2 -1
  263. package/dist/lab/preflight-result.js +5 -6
  264. package/dist/lab/preflight.d.ts +7 -8
  265. package/dist/lab/preflight.js +6 -6
  266. package/dist/lab/requirements.d.ts +20 -0
  267. package/dist/lab/requirements.js +54 -0
  268. package/dist/lab/route-inputs.d.ts +23 -12
  269. package/dist/lab/route-inputs.js +48 -51
  270. package/dist/lab/routing.d.ts +42 -41
  271. package/dist/lab/routing.js +66 -68
  272. package/dist/lab/run-lab-events.d.ts +3 -11
  273. package/dist/lab/run-lab-events.js +2 -16
  274. package/dist/lab/run-lab-homes.d.ts +76 -0
  275. package/dist/lab/run-lab-homes.js +7 -0
  276. package/dist/lab/run-lab-options.d.ts +12 -66
  277. package/dist/lab/run-lab-options.js +58 -285
  278. package/dist/lab/summary.d.ts +15 -9
  279. package/dist/lab/summary.js +24 -17
  280. package/dist/lab/tasks.d.ts +15 -15
  281. package/dist/lab/tasks.js +14 -14
  282. package/dist/lab/types.d.ts +201 -195
  283. package/dist/lab/types.js +2 -0
  284. package/dist/lab/validation.d.ts +21 -21
  285. package/dist/lab/validation.js +61 -59
  286. package/dist/lab/warnings.d.ts +10 -0
  287. package/dist/lab/warnings.js +70 -41
  288. package/dist/library-aliases.d.ts +56 -0
  289. package/dist/library-aliases.js +22 -0
  290. package/dist/observer/artifact.d.ts +2 -2
  291. package/dist/observer/artifact.js +9 -9
  292. package/dist/observer/data.d.ts +6 -6
  293. package/dist/observer/data.js +7 -6
  294. package/dist/observer/exposure.d.ts +1 -1
  295. package/dist/observer/exposure.js +11 -11
  296. package/dist/observer/http.js +1 -1
  297. package/dist/observer/library.d.ts +1 -1
  298. package/dist/observer/library.js +4 -2
  299. package/dist/observer/listen.js +5 -4
  300. package/dist/observer/render.d.ts +1 -1
  301. package/dist/observer/render.js +12 -7
  302. package/dist/observer/run-routes.d.ts +4 -4
  303. package/dist/observer/run-routes.js +6 -6
  304. package/dist/observer/serve.d.ts +17 -0
  305. package/dist/observer/serve.js +41 -6
  306. package/dist/observer/tunnel.js +1 -1
  307. package/dist/observer-app.html +4 -4
  308. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  309. package/dist/routes/computer-use/bundle-parts.js +24 -17
  310. package/dist/routes/computer-use/bundle.d.ts +4 -11
  311. package/dist/routes/computer-use/bundle.js +12 -18
  312. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  313. package/dist/routes/computer-use/diagnostics.js +1 -1
  314. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
  315. package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
  316. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  317. package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
  318. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
  319. package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
  320. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  321. package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
  322. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  323. package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
  324. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  325. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  326. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  327. package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
  328. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  329. package/dist/routes/computer-use/external-comms.js +19 -43
  330. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  331. package/dist/routes/computer-use/fanout-bundle.js +38 -42
  332. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
  333. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  334. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  335. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  336. package/dist/routes/computer-use/live-flush.js +20 -28
  337. package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
  338. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
  339. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  340. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  341. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  342. package/dist/routes/computer-use/local-vm.js +40 -67
  343. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  344. package/dist/routes/computer-use/participant-desktop.js +5 -25
  345. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
  346. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
  347. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  348. package/dist/routes/computer-use/participant-facts.js +12 -1
  349. package/dist/routes/computer-use/participant-model.d.ts +25 -11
  350. package/dist/routes/computer-use/participant-model.js +76 -34
  351. package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
  352. package/dist/routes/computer-use/participant-prompt.js +8 -8
  353. package/dist/routes/computer-use/participant-runs.d.ts +11 -11
  354. package/dist/routes/computer-use/participant-runs.js +18 -18
  355. package/dist/routes/computer-use/plan.d.ts +21 -29
  356. package/dist/routes/computer-use/plan.js +70 -78
  357. package/dist/routes/computer-use/preflight.d.ts +3 -5
  358. package/dist/routes/computer-use/preflight.js +40 -36
  359. package/dist/routes/computer-use/rerun-selection.js +11 -7
  360. package/dist/routes/computer-use/result.d.ts +1 -1
  361. package/dist/routes/computer-use/result.js +48 -38
  362. package/dist/routes/computer-use/route.d.ts +5 -5
  363. package/dist/routes/computer-use/route.js +36 -33
  364. package/dist/routes/computer-use/self-report.d.ts +8 -8
  365. package/dist/routes/computer-use/self-report.js +33 -33
  366. package/dist/routes/computer-use/setup.d.ts +9 -15
  367. package/dist/routes/computer-use/setup.js +106 -83
  368. package/dist/routes/computer-use/single-bundle.d.ts +13 -16
  369. package/dist/routes/computer-use/single-bundle.js +46 -53
  370. package/dist/routes/computer-use/subject-projection.d.ts +6 -8
  371. package/dist/routes/computer-use/subject-projection.js +24 -23
  372. package/dist/routes/computer-use/types.d.ts +195 -238
  373. package/dist/routes/computer-use/types.js +21 -13
  374. package/dist/routes/preview.d.ts +8 -2
  375. package/dist/routes/preview.js +8 -5
  376. package/dist/routes/scripted/bundle.d.ts +5 -8
  377. package/dist/routes/scripted/bundle.js +23 -27
  378. package/dist/routes/scripted/plan.d.ts +6 -8
  379. package/dist/routes/scripted/plan.js +15 -13
  380. package/dist/routes/scripted/result.d.ts +4 -1
  381. package/dist/routes/scripted/result.js +15 -11
  382. package/dist/routes/scripted/route.js +15 -17
  383. package/dist/routes/scripted/scenario.d.ts +1 -1
  384. package/dist/routes/scripted/scenario.js +3 -3
  385. package/dist/routes/scripted/setup.d.ts +3 -2
  386. package/dist/routes/scripted/setup.js +27 -26
  387. package/dist/routes/scripted/subject.d.ts +8 -3
  388. package/dist/routes/scripted/subject.js +10 -6
  389. package/dist/routes/scripted/surface-records.js +4 -4
  390. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  391. package/dist/routes/scripted/surface-sessions.js +4 -4
  392. package/dist/routes/scripted/types.d.ts +21 -40
  393. package/dist/routes/scripted/types.js +2 -3
  394. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
  395. package/dist/routes/shared-world/bundle.d.ts +7 -7
  396. package/dist/routes/shared-world/bundle.js +60 -62
  397. package/dist/routes/shared-world/checkpoints.d.ts +5 -5
  398. package/dist/routes/shared-world/checkpoints.js +5 -5
  399. package/dist/routes/shared-world/comms.d.ts +8 -7
  400. package/dist/routes/shared-world/comms.js +38 -51
  401. package/dist/routes/shared-world/external-public.d.ts +6 -5
  402. package/dist/routes/shared-world/external-public.js +28 -25
  403. package/dist/routes/shared-world/handoff.d.ts +10 -9
  404. package/dist/routes/shared-world/handoff.js +89 -81
  405. package/dist/routes/shared-world/lobby-code.d.ts +7 -7
  406. package/dist/routes/shared-world/lobby-code.js +22 -22
  407. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
  408. package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
  409. package/dist/routes/shared-world/plan.d.ts +2 -6
  410. package/dist/routes/shared-world/plan.js +8 -9
  411. package/dist/routes/shared-world/provenance.d.ts +4 -4
  412. package/dist/routes/shared-world/provenance.js +4 -4
  413. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  414. package/dist/routes/shared-world/provisioned.js +55 -48
  415. package/dist/routes/shared-world/result.js +47 -36
  416. package/dist/routes/shared-world/route.js +54 -57
  417. package/dist/routes/shared-world/setup.d.ts +6 -5
  418. package/dist/routes/shared-world/setup.js +16 -18
  419. package/dist/routes/shared-world/types.d.ts +70 -141
  420. package/dist/routes/shared-world/types.js +5 -5
  421. package/dist/routes/terminal/adapter.d.ts +10 -10
  422. package/dist/routes/terminal/adapter.js +32 -129
  423. package/dist/routes/terminal/bundle.d.ts +10 -15
  424. package/dist/routes/terminal/bundle.js +43 -52
  425. package/dist/routes/terminal/credentials.d.ts +4 -4
  426. package/dist/routes/terminal/credentials.js +20 -20
  427. package/dist/routes/terminal/dry-run.d.ts +1 -1
  428. package/dist/routes/terminal/dry-run.js +13 -15
  429. package/dist/routes/terminal/encoding.d.ts +1 -1
  430. package/dist/routes/terminal/encoding.js +4 -4
  431. package/dist/routes/terminal/ledger.d.ts +8 -8
  432. package/dist/routes/terminal/ledger.js +22 -22
  433. package/dist/routes/terminal/live-finish.d.ts +1 -2
  434. package/dist/routes/terminal/live-finish.js +24 -23
  435. package/dist/routes/terminal/live-sandbox.d.ts +3 -2
  436. package/dist/routes/terminal/live-sandbox.js +31 -32
  437. package/dist/routes/terminal/participant-text.d.ts +23 -0
  438. package/dist/routes/terminal/participant-text.js +165 -0
  439. package/dist/routes/terminal/persona.js +1 -1
  440. package/dist/routes/terminal/plan.d.ts +2 -6
  441. package/dist/routes/terminal/plan.js +23 -19
  442. package/dist/routes/terminal/recorder.d.ts +6 -1
  443. package/dist/routes/terminal/recorder.js +12 -4
  444. package/dist/routes/terminal/result.js +12 -12
  445. package/dist/routes/terminal/route.js +30 -31
  446. package/dist/routes/terminal/runtime.d.ts +3 -2
  447. package/dist/routes/terminal/runtime.js +3 -3
  448. package/dist/routes/terminal/sandbox.d.ts +4 -4
  449. package/dist/routes/terminal/sandbox.js +10 -10
  450. package/dist/routes/terminal/session.js +22 -19
  451. package/dist/routes/terminal/token-usage.d.ts +1 -1
  452. package/dist/routes/terminal/token-usage.js +10 -11
  453. package/dist/routes/terminal/trace.d.ts +7 -10
  454. package/dist/routes/terminal/trace.js +11 -66
  455. package/dist/routes/terminal/types.d.ts +104 -114
  456. package/dist/routes/terminal/types.js +12 -7
  457. package/dist/run/active-runs.d.ts +13 -0
  458. package/dist/run/active-runs.js +12 -0
  459. package/dist/run/bundle-shape.d.ts +2 -1
  460. package/dist/run/bundle-shape.js +7 -7
  461. package/dist/run/bundle.d.ts +99 -92
  462. package/dist/run/bundle.js +10 -8
  463. package/dist/run/cost-summary.js +6 -5
  464. package/dist/run/costs.d.ts +6 -6
  465. package/dist/run/costs.js +17 -11
  466. package/dist/run/detail.d.ts +9 -9
  467. package/dist/run/detail.js +10 -10
  468. package/dist/run/dry-run-inputs.js +1 -1
  469. package/dist/run/dry-run.js +23 -30
  470. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  471. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  472. package/dist/run/feedback-shape.js +1 -1
  473. package/dist/run/judge.d.ts +34 -16
  474. package/dist/run/judge.js +41 -14
  475. package/dist/run/locate.d.ts +2 -0
  476. package/dist/run/locate.js +3 -1
  477. package/dist/run/outcomes.d.ts +3 -3
  478. package/dist/run/outcomes.js +3 -3
  479. package/dist/run/participant-records.d.ts +2 -2
  480. package/dist/run/participant-records.js +2 -2
  481. package/dist/run/paths.d.ts +1 -1
  482. package/dist/run/paths.js +2 -2
  483. package/dist/run/pricing.d.ts +30 -15
  484. package/dist/run/pricing.js +49 -30
  485. package/dist/run/projection.d.ts +27 -27
  486. package/dist/run/projection.js +23 -23
  487. package/dist/run/reclaim.d.ts +6 -0
  488. package/dist/run/reclaim.js +15 -5
  489. package/dist/run/results.d.ts +5 -5
  490. package/dist/run/run-index.d.ts +9 -7
  491. package/dist/run/run-index.js +24 -25
  492. package/dist/run/run-not-found.d.ts +5 -0
  493. package/dist/run/run-not-found.js +15 -0
  494. package/dist/run/run.d.ts +7 -4
  495. package/dist/run/run.js +10 -6
  496. package/dist/run/sandbox-receipts.d.ts +5 -5
  497. package/dist/run/sandbox-receipts.js +6 -6
  498. package/dist/run/shared-world-evidence.d.ts +67 -66
  499. package/dist/run/shared-world-evidence.js +4 -4
  500. package/dist/run/shared-world-shape.d.ts +3 -3
  501. package/dist/run/shared-world-shape.js +16 -16
  502. package/dist/run/stats.d.ts +17 -11
  503. package/dist/run/stats.js +124 -66
  504. package/dist/run/status.d.ts +21 -32
  505. package/dist/run/status.js +34 -33
  506. package/dist/run/stored-runs.js +2 -1
  507. package/dist/run/stream-shape.js +1 -1
  508. package/dist/run/streams.d.ts +29 -22
  509. package/dist/run/study-provenance.d.ts +47 -0
  510. package/dist/run/study-provenance.js +63 -0
  511. package/dist/run/study-result.d.ts +16 -0
  512. package/dist/run/study-result.js +9 -0
  513. package/dist/run/terminal-contract.d.ts +5 -5
  514. package/dist/run/terminal-contract.js +4 -4
  515. package/dist/run/text.d.ts +2 -0
  516. package/dist/run/text.js +4 -0
  517. package/dist/run/transient-comms-secrets.d.ts +5 -0
  518. package/dist/run/transient-comms-secrets.js +12 -0
  519. package/dist/run-lab.d.ts +40 -38
  520. package/dist/run-lab.js +42 -40
  521. package/dist/study/convert.d.ts +33 -0
  522. package/dist/study/convert.js +432 -0
  523. package/dist/study/field-paths.d.ts +12 -0
  524. package/dist/study/field-paths.js +126 -0
  525. package/dist/study/files.d.ts +26 -0
  526. package/dist/study/files.js +43 -0
  527. package/dist/study/migrate.d.ts +48 -0
  528. package/dist/study/migrate.js +408 -0
  529. package/dist/study/owned-files.d.ts +38 -0
  530. package/dist/study/owned-files.js +182 -0
  531. package/dist/subject/clone.d.ts +1 -1
  532. package/dist/subject/desktop-cli.d.ts +2 -2
  533. package/dist/subject/desktop-cli.js +3 -3
  534. package/dist/subject/local-tree-archive.d.ts +1 -1
  535. package/dist/subject/local-tree-archive.js +5 -5
  536. package/dist/subject/local-tree.d.ts +3 -3
  537. package/dist/subject/local-tree.js +1 -1
  538. package/dist/subject/node-bootstrap.d.ts +1 -1
  539. package/dist/subject/node-bootstrap.js +4 -4
  540. package/dist/subject/runtime.js +10 -11
  541. package/dist/subject/serve.d.ts +1 -1
  542. package/dist/subject/serve.js +4 -4
  543. package/dist/subject/state.d.ts +1 -1
  544. package/dist/subject/steps.d.ts +8 -8
  545. package/dist/subject/steps.js +7 -7
  546. package/dist/substrates/command-failure.d.ts +3 -3
  547. package/dist/substrates/command-failure.js +3 -3
  548. package/dist/substrates/detached.d.ts +6 -6
  549. package/dist/substrates/detached.js +7 -7
  550. package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
  551. package/dist/substrates/e2b/cdp-probe.js +15 -18
  552. package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
  553. package/dist/substrates/e2b/desktop-browser.js +12 -12
  554. package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
  555. package/dist/substrates/e2b/desktop-cdp.js +11 -11
  556. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  557. package/dist/substrates/e2b/desktop-executor.js +1 -1
  558. package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
  559. package/dist/substrates/e2b/desktop-geometry.js +9 -9
  560. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  561. package/dist/substrates/e2b/desktop-media.js +3 -3
  562. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  563. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  564. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  565. package/dist/substrates/e2b/sandbox.js +2 -2
  566. package/dist/substrates/e2b/sdk.d.ts +11 -11
  567. package/dist/substrates/e2b/sdk.js +8 -8
  568. package/dist/substrates/local/runtime-host.d.ts +2 -0
  569. package/dist/substrates/local/runtime-host.js +6 -0
  570. package/dist/tui/actions.d.ts +8 -6
  571. package/dist/tui/actions.js +31 -22
  572. package/dist/tui/contract.d.ts +16 -16
  573. package/dist/tui/contract.js +10 -10
  574. package/dist/tui/launch.d.ts +4 -4
  575. package/dist/tui/launch.js +18 -19
  576. package/dist/tui/project.js +5 -5
  577. package/dist/tui-app.js +83 -83
  578. package/dist/verify/actor.d.ts +14 -14
  579. package/dist/verify/actor.js +45 -45
  580. package/dist/verify/artifacts.d.ts +3 -3
  581. package/dist/verify/artifacts.js +6 -6
  582. package/dist/verify/context-growth.d.ts +9 -0
  583. package/dist/verify/context-growth.js +62 -0
  584. package/dist/verify/costs.d.ts +7 -7
  585. package/dist/verify/costs.js +9 -9
  586. package/dist/verify/liveness.d.ts +1 -1
  587. package/dist/verify/liveness.js +4 -1
  588. package/dist/verify/rerun.d.ts +1 -1
  589. package/dist/verify/rerun.js +1 -1
  590. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  591. package/dist/verify/shared-world-concurrent.js +79 -76
  592. package/dist/verify/shared-world.d.ts +2 -2
  593. package/dist/verify/shared-world.js +18 -18
  594. package/dist/verify/subject.d.ts +4 -4
  595. package/dist/verify/subject.js +18 -18
  596. package/dist/verify/verify.js +98 -49
  597. package/docs/README.md +26 -33
  598. package/docs/architecture/actor-contract.md +105 -98
  599. package/docs/architecture/desktop-sessions.md +14 -14
  600. package/docs/architecture/external-public-shared-world.md +66 -59
  601. package/docs/architecture/github-feedback-loop.md +1 -4
  602. package/docs/architecture/guest-desktop.md +2 -2
  603. package/docs/architecture/observer.md +37 -37
  604. package/docs/architecture/restricted-codex-analysis.md +70 -30
  605. package/docs/architecture/serve.md +34 -37
  606. package/docs/architecture/state-driven-executor.md +55 -59
  607. package/docs/architecture/task-protocol-support.md +7 -9
  608. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
  609. package/docs/contracts/README.md +24 -0
  610. package/docs/contracts/adapter-admission.md +3 -3
  611. package/docs/contracts/adapter-fixtures.md +2 -5
  612. package/docs/contracts/core.md +1 -3
  613. package/docs/contracts/errors.md +62 -0
  614. package/docs/contracts/feedback.md +8 -9
  615. package/docs/contracts/policy.md +7 -12
  616. package/docs/contracts/run-bundle.md +54 -51
  617. package/docs/contracts/schemas.md +505 -390
  618. package/docs/contracts/study-analysis.md +26 -2
  619. package/docs/contracts/study-costs.md +11 -7
  620. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  621. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  622. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  623. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  624. package/docs/principles/actor-fidelity.md +4 -4
  625. package/docs/principles/engineering.md +3 -3
  626. package/docs/principles/invariants-and-defaults.md +38 -38
  627. package/docs/principles/self-driving-harness.md +1 -5
  628. package/docs/principles/three-roles.md +1 -1
  629. package/docs/product/automatic-analysis.md +8 -7
  630. package/examples/participant/README.md +5 -5
  631. package/examples/participant/run.mjs +11 -10
  632. package/examples/scorer/README.md +3 -3
  633. package/examples/scorer/run.mjs +11 -12
  634. package/package.json +16 -17
  635. package/skills/humanish/SKILL.md +63 -60
  636. package/skills/humanish/agents/openai.yaml +1 -1
  637. package/AGENTS.md +0 -99
  638. package/CONTRIBUTING.md +0 -148
  639. package/dist/actors/codex/qualified-versions.d.ts +0 -45
  640. package/dist/actors/codex/qualified-versions.js +0 -87
  641. package/dist/cli/commands/lab.d.ts +0 -3
  642. package/dist/cli/commands/lab.js +0 -193
  643. package/dist/deprecated.d.ts +0 -90
  644. package/dist/deprecated.js +0 -106
  645. package/dist/lab/bag-overrides.d.ts +0 -18
  646. package/dist/lab/bag-overrides.js +0 -121
  647. package/dist/observer/static.d.ts +0 -39
  648. package/dist/observer/static.js +0 -369
  649. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  650. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  651. package/docs/architecture/comms-inbox.md +0 -122
  652. package/docs/architecture/desktop-recording.md +0 -80
  653. package/docs/architecture/local-browser-runtime.md +0 -178
  654. package/docs/architecture/observer-review.md +0 -144
  655. package/docs/architecture/participant-media.md +0 -90
  656. package/docs/architecture/project-layout.md +0 -62
  657. package/docs/architecture/real-email-receiving.md +0 -136
  658. package/docs/assets/humanish-drawdb-hero.png +0 -0
  659. package/docs/assets/humanish-observer-hero.png +0 -0
  660. package/docs/goals/current.md +0 -207
  661. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  662. package/docs/product/open-source-install-experience.md +0 -240
  663. package/docs/ramp/README.md +0 -294
  664. package/docs/release/open-source-readiness.md +0 -222
  665. package/docs/release/public-readiness-standard.md +0 -210
  666. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  667. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  668. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -5,16 +5,16 @@ import { type CuaSubjectProvenanceArg, type ParticipantRunOutcome } from "./type
5
5
  /** The human-readable state story appended to the provenance event (and review.md via it). */
6
6
  export declare function describeSubjectState(state: RunSubjectProvenance["state"], dryRun: boolean): string;
7
7
  /**
8
- * Feedback candidates derived from what LIVE participants actually reported (#392).
8
+ * Feedback candidates derived from what live participants actually reported.
9
9
  *
10
- * A live run's feedback draft used to fall through to a dry-run template, because no browser route
11
- * ever built a candidate. The candidate worth filing is the one the study produced: a participant
10
+ * A live run's feedback draft comes from these candidates, never from a dry-run template. The
11
+ * candidate worth filing is the one the study produced: a participant
12
12
  * who reported friction on the way (the most valuable thing a run captures), or one who stopped
13
- * trying. A clean pass files nothing here — feedback exists to carry findings, and a run without
14
- * any falls back to an honest live summary in the draft layer instead of a template.
13
+ * trying. A clean pass files nothing here: feedback exists to carry findings, and a run without
14
+ * any falls back to a live summary in the draft layer instead of a template.
15
15
  *
16
- * Everything quoted is already scrub+redacted — participant messages and `session.reason` pass
17
- * through redactNarration in the loop — and passes redactText again here as defense-in-depth.
16
+ * Everything quoted is already scrub+redacted (participant messages and `session.reason` pass
17
+ * through redactNarration in the loop) and passes redactText again here as defense-in-depth.
18
18
  */
19
19
  export declare function participantFeedbackCandidates(args: {
20
20
  runId: string;
@@ -34,8 +34,8 @@ 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):
38
- * claims "cloned/packed and served" ONLY when it actually happened. */
37
+ /** Human-readable provenance line for the single-participant subject.provenance event:
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: {
41
41
  outcome: ParticipantRunOutcome | undefined;
@@ -14,9 +14,9 @@ export function describeSubjectState(state, dryRun) {
14
14
  case "seeded":
15
15
  return `seeded (${state.seed?.length ?? 0} step(s): ${(state.seed ?? []).map((record) => record.name).join(", ")})`;
16
16
  case "unpinned":
17
- return `UNPINNED (external: ${(state.externalEnvNames ?? []).join(", ")})`;
17
+ return `unpinned (external: ${(state.externalEnvNames ?? []).join(", ")})`;
18
18
  case "declared-not-run":
19
- return `declared, not run (${dryRun ? "dry-run contract" : "provisioning did not complete"})`;
19
+ return `declared, not run (${dryRun ? "dry run" : "provisioning did not complete"})`;
20
20
  case "undeclared":
21
21
  return "undeclared";
22
22
  case "external-public":
@@ -24,16 +24,16 @@ export function describeSubjectState(state, dryRun) {
24
24
  }
25
25
  }
26
26
  /**
27
- * Feedback candidates derived from what LIVE participants actually reported (#392).
27
+ * Feedback candidates derived from what live participants actually reported.
28
28
  *
29
- * A live run's feedback draft used to fall through to a dry-run template, because no browser route
30
- * ever built a candidate. The candidate worth filing is the one the study produced: a participant
29
+ * A live run's feedback draft comes from these candidates, never from a dry-run template. The
30
+ * candidate worth filing is the one the study produced: a participant
31
31
  * who reported friction on the way (the most valuable thing a run captures), or one who stopped
32
- * trying. A clean pass files nothing here — feedback exists to carry findings, and a run without
33
- * any falls back to an honest live summary in the draft layer instead of a template.
32
+ * trying. A clean pass files nothing here: feedback exists to carry findings, and a run without
33
+ * any falls back to a live summary in the draft layer instead of a template.
34
34
  *
35
- * Everything quoted is already scrub+redacted — participant messages and `session.reason` pass
36
- * through redactNarration in the loop — and passes redactText again here as defense-in-depth.
35
+ * Everything quoted is already scrub+redacted (participant messages and `session.reason` pass
36
+ * through redactNarration in the loop) and passes redactText again here as defense-in-depth.
37
37
  */
38
38
  export function participantFeedbackCandidates(args) {
39
39
  const candidates = [];
@@ -59,8 +59,8 @@ export function participantFeedbackCandidates(args) {
59
59
  persona_id: participant.personaId,
60
60
  actor: "computer-use",
61
61
  substrate: args.substrate,
62
- // The participant is reporting on the PRODUCT: friction and abandonment are target-app
63
- // findings by the three-roles rule. A harness failure never reaches this builder — it is
62
+ // The participant is reporting on the product: friction and abandonment are target-app
63
+ // findings by the three-roles rule. A harness failure never reaches this builder; it is
64
64
  // not a participant report.
65
65
  failure_owner: "target-app",
66
66
  summary,
@@ -109,12 +109,12 @@ 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):
113
- * claims "cloned/packed and served" ONLY when it actually happened. */
112
+ /** Human-readable provenance line for the single-participant subject.provenance event:
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") {
116
116
  if (dryRun) {
117
- return `Subject declared: clone of ${provenance.repo}, to be served at ${publicAppUrl} in-sandbox (dry-run contract; nothing cloned)`;
117
+ return `Subject declared: clone of ${provenance.repo}, to be served at ${publicAppUrl} in-sandbox (dry run; nothing cloned)`;
118
118
  }
119
119
  if (provenance.commit) {
120
120
  return hasSession
@@ -124,7 +124,7 @@ export function subjectProvenanceMessage(provenance, publicAppUrl, dryRun, hasSe
124
124
  return `Subject clone attempted from ${provenance.repo}; commit unresolved (provisioning failed before resolution)`;
125
125
  }
126
126
  if (dryRun) {
127
- return `Subject declared: local working tree, to be packed and served at ${publicAppUrl} in-sandbox (dry-run contract; nothing packed)`;
127
+ return `Subject declared: local working tree, to be packed and served at ${publicAppUrl} in-sandbox (dry run; nothing packed)`;
128
128
  }
129
129
  if (provenance.archiveSha256) {
130
130
  const dirtyLabel = provenance.dirty === true
@@ -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: {
@@ -2,7 +2,7 @@
2
2
  // and buildCuaRunBundle sends it to the single-participant or the fan-out builder with that
3
3
  // shape's arguments. renderCuaReviewMarkdown writes review.md. shared-world/bundle.ts holds the
4
4
  // same for that route.
5
- import { judgeOneParticipant, judgeParticipants } from "../../run/judge.js";
5
+ import { judgeOneParticipant, judgeParticipants, verdictText, } from "../../run/judge.js";
6
6
  import { desktopSpanToMinutes } from "../../run/cost-summary.js";
7
7
  import { e2bDesktopTemplate } from "../../substrates/e2b/sandbox.js";
8
8
  import { providerResourcesForOutcome } from "./bundle-parts.js";
@@ -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
  ? {}
@@ -163,13 +157,13 @@ export function renderCuaReviewMarkdown(bundle) {
163
157
  "",
164
158
  `- run: ${bundle.runId}`,
165
159
  `- mode: ${bundle.mode}`,
166
- `- run gate: ${bundle.review.verdict}`,
160
+ `- run gate: ${verdictText(bundle.review.verdict, bundle.mode)}`,
167
161
  `- summary: ${bundle.review.summary}`,
168
162
  ...(provenance ? [`- subject: ${provenance.message}`] : []),
169
163
  ...(trace
170
164
  ? [
171
165
  `- actor: ${trace.provider} (${trace.lane}/${trace.protocol})`,
172
- // Honest count: name the trace's actual screenshot mode ("raw" | "blurred"); say
166
+ // Name the trace's actual screenshot mode ("raw" | "blurred"); say
173
167
  // nothing when no frames exist ("n/a") rather than claim a redaction that never ran.
174
168
  `- evidence: ${trace.items.length} trace item(s), ${trace.counts.screenshots ?? 0} ${trace.redaction.screenshots === "raw" || trace.redaction.screenshots === "blurred"
175
169
  ? `${trace.redaction.screenshots} screenshot(s)`
@@ -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;
@@ -19,10 +19,10 @@ export interface ParticipantComms {
19
19
  }
20
20
  /**
21
21
  * On an in-sandbox subject route, redirect the app's email-API sends into an in-sandbox catch
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.
22
+ * (loopback) so its verification mail is captured instead of sent to the internet. Undefined when the
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: 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,17 +8,18 @@ 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. */
14
15
  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
- * (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.
18
+ * (loopback) so its verification mail is captured instead of sent to the internet. Undefined when the
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
  }),
@@ -43,7 +42,7 @@ export function planParticipantComms(config, targetUrl, inSandboxSubject) {
43
42
  export function participantCommsEnv(comms) {
44
43
  if (comms === undefined)
45
44
  return {};
46
- // injectEnv is absent on an adopter-hosted plane (#328): there is no subject env to inject
45
+ // injectEnv is absent on an adopter-hosted plane: there is no subject env to inject
47
46
  // because the operator points their own app at their own catch.
48
47
  const env = comms.email.injectEnv === undefined
49
48
  ? {}
@@ -76,23 +75,23 @@ export async function startCommsCatch(shell, comms, requestTimeoutMs) {
76
75
  if (!deployed.ready) {
77
76
  throw new Error(`comms email catch did not become ready on 127.0.0.1:${comms.port} in the subject sandbox`);
78
77
  }
79
- // Write the EMPTY inbox once up front so the persona's /inbox always resolves to the "No messages
80
- // yet." page — never a bare 404 — the instant it navigates there, even before any mail arrives OR if
78
+ // Write the empty inbox once up front so the persona's /inbox always resolves to the "No messages
79
+ // yet." page (never a bare 404) the instant it navigates there, even before any mail arrives or if
81
80
  // the app sends to an address no declared recipient matches (the loop only re-renders on new mail).
82
81
  await writeInboxSurface(shell, deployed.surfaceDir, [], {
83
82
  originMap: comms.originMap,
84
83
  requestTimeoutMs,
85
84
  });
86
- // The surface uses its OWN FakeInbox + cursor, independent of the teardown evidence drain (two
87
- // readers of the append-only NDJSON — no double-count).
85
+ // The surface uses its own FakeInbox + cursor, independent of the teardown evidence drain (two
86
+ // readers of the append-only NDJSON, so no double-count).
88
87
  const stop = new AbortController();
89
88
  let renderedCount = 0;
90
89
  const loop = (async () => {
91
90
  // Render-first (so even a short session gets a populated inbox), then refresh on a cadence. The
92
- // cadence uses a REAL timer, NOT the injected instant clock: this loop is unbounded, so an instant
91
+ // cadence uses a real timer instead of the injected instant clock: this loop is unbounded, so an instant
93
92
  // sleep would busy-spin and starve the session's own timers. `stop` interrupts the wait
94
93
  // (and clears the timer) so teardown never blocks for a full cadence. Each refresh
95
- // is a full, idempotent rebuild; `renderedCount` only advances on a SUCCESSFUL render so a
94
+ // is a full, idempotent rebuild; `renderedCount` only advances on a successful render so a
96
95
  // transient failure retries cleanly (no duplicate emails).
97
96
  for (;;) {
98
97
  try {
@@ -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.
@@ -203,19 +200,19 @@ export async function drainCommsEvidence(args) {
203
200
  return path;
204
201
  }
205
202
  if (collected.captured > 0) {
206
- // Captured mail that matched no declared recipient must not vanish silently (invariant 6:
207
- // honest signals): tell the operator to declare comms.email.recipients[].address to match
203
+ // Captured mail that matched no declared recipient must not vanish silently: tell the
204
+ // operator to declare comms.email.recipients[].address to match
208
205
  // the address the app actually sends to (e.g. the one the persona surface will sign up with).
209
- warnings.push(`Comms catch captured ${collected.captured} email send(s) but none matched a declared recipient inbox — no comms evidence written. Declare comms.email.recipients[].address to match the address the app sends to.`);
206
+ warnings.push(`The email catch captured ${collected.captured} email send(s), but none matched a declared recipient inbox, so no email evidence was written. Set comms.email.recipients[].address to the address the app sends to.`);
210
207
  }
211
208
  else {
212
- // Zero captures is the silent-broken shape (#351): the app never posted to the catch at
209
+ // Zero captures is the silent-broken shape: the app never posted to the catch at
213
210
  // all, so the personas stared at an empty inbox. Most common cause: the app does not
214
211
  // actually read the declared injectEnv var for its email API base URL.
215
212
  const transportHint = comms.email.smtp
216
213
  ? `Verify the app reads ${comms.email.smtp.hostEnv}/${comms.email.smtp.portEnv} for its SMTP host and port`
217
214
  : `Verify the app reads ${comms.email.injectEnv} for its email API base URL (an SDK that ignores it sends real mail or throws)`;
218
- warnings.push(`Comms catch captured ZERO email sends — the app never delivered mail through the catch. ${transportHint} and that the flow reached an email step.`);
215
+ warnings.push(`The email catch captured no email sends: the app never delivered mail through it. ${transportHint} and that the flow reached an email step.`);
219
216
  }
220
217
  }
221
218
  catch (error) {
@@ -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,18 +14,18 @@ export function createE2BParticipantDesktop(spec, deps, warnings) {
17
14
  deps,
18
15
  warnings,
19
16
  targetUrl,
20
- desktopCliRoute: deps.desktopCliRoute === true,
21
- // 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),
17
+ desktopCliRoute: deps.subject.kind === "desktop-cli",
18
+ // Off-app comms: gated entirely on config.comms; no comms declared, no change.
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, {
29
- laneId: spec.planned.id,
30
- laneIndex: spec.planned.index,
31
- laneCount: deps.participantCount,
25
+ deps.reportSubjectPhase(event, {
26
+ id: spec.planned.id,
27
+ index: spec.planned.index,
28
+ count: deps.participantCount,
32
29
  });
33
30
  },
34
31
  };
@@ -1,30 +1,31 @@
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, since nothing was
23
+ * emulated.
23
24
  */
24
25
  export declare function applyParticipantMobileFidelity(args: {
25
26
  desktop: E2BDesktopSandbox;
26
27
  spec: DesktopParticipantRun;
27
- deps: CuaParticipantDeps;
28
+ deps: E2BDesktopDeps;
28
29
  targetUrl: string;
29
30
  browserFamily: DesktopBrowserFamily;
30
31
  launchIdentity: DesktopBrowserLaunchIdentity | undefined;
@@ -35,7 +36,7 @@ export declare function applyParticipantMobileFidelity(args: {
35
36
  export declare function participantBrowserStateObserver(args: {
36
37
  desktop: E2BDesktopSandbox;
37
38
  spec: DesktopParticipantRun;
38
- deps: CuaParticipantDeps;
39
+ deps: E2BDesktopDeps;
39
40
  targetUrl: string;
40
41
  launchIdentity: DesktopBrowserLaunchIdentity | undefined;
41
42
  targetId: string | undefined;
@@ -43,15 +44,15 @@ export declare function participantBrowserStateObserver(args: {
43
44
  warnings: string[];
44
45
  }): ReturnType<typeof makeChromeBrowserStateObserver>;
45
46
  /**
46
- * The lane's final browser geometry, measured while the sandbox is alive. A final capture that
47
- * measured EITHER field wins whole, so a partial final capture omits fields the launch-time capture
48
- * had (honest omission); only a final capture that measured NOTHING falls back to the launch-time
47
+ * The participant's final browser geometry, measured while the sandbox is alive. A final capture that
48
+ * measured either field wins whole, so a partial final capture omits fields the launch-time capture
49
+ * had; only a final capture that measured nothing falls back to the launch-time
49
50
  * capture. Also reads the emulation holder's log into the fidelity block.
50
51
  */
51
52
  export declare function finalParticipantGeometry(args: {
52
53
  desktop: E2BDesktopSandbox;
53
54
  spec: DesktopParticipantRun;
54
- deps: CuaParticipantDeps;
55
+ deps: E2BDesktopDeps;
55
56
  targetUrl: string;
56
57
  browserFamily: DesktopBrowserFamily;
57
58
  launchIdentity: DesktopBrowserLaunchIdentity | undefined;