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
@@ -1,39 +1,40 @@
1
- // The external-public plane's host-first handoff. The host seat opens a lobby; each follower waits
1
+ // The external-public plane's host-first handoff. The host opens a lobby; each follower waits
2
2
  // for the host's lobby code, read from the host's URL, narration or screen, and then joins with it.
3
3
  // A follower fails closed without opening if the host never yields a code within the deadline.
4
4
  //
5
- // TEMPORARY SHIM (tracked by #296): this CDP URL-relay handoff — reading the host's /lobby/CODE off
6
- // its own browser and threading it into the follower missions — is a temporary coordination shim.
7
- // It is to be augmented/replaced by the actor message bus (fake SMS/email invite) in #297: the
8
- // human-realistic version is the HOST SENDING the invite link and followers RECEIVING and tapping
5
+ // Temporary shim: this CDP URL-relay handoff reads the host's /lobby/CODE off its
6
+ // own browser and threads it into the follower missions.
7
+ // It is to be augmented/replaced by the actor message bus (fake SMS/email invite): the
8
+ // human-realistic version is the host sending the invite link and followers receiving and tapping
9
9
  // it, rather than the orchestrator relaying the code out-of-band.
10
10
  import { commandDigestOf } from "../../subject/state.js";
11
11
  import { toErrorMessage } from "../../evidence/redaction.js";
12
12
  import { inboxRecipientFor, participantHasInboxRecipient, } from "../computer-use/participant-desktop.js";
13
13
  import { withInboxMission } from "../computer-use/participant-prompt.js";
14
- import { runCuaParticipant } from "../computer-use/lanes.js";
14
+ import { runCuaParticipant } from "../computer-use/participant-execution.js";
15
15
  import { extractLobbyCode, extractLobbyCodeFromNarration } from "./lobby-code.js";
16
16
  import { hostOriginDigest } from "./provenance.js";
17
- import { makeBlockedFollowerOutcome, withLobbyCodeMission, } from "./seats.js";
18
- // The FLOOR for the host-first handoff barrier deadline (ms). The host seat must surface a
17
+ import { makeBlockedFollowerOutcome, withLobbyCodeMission, } from "./participant-specs.js";
18
+ // The floor for the host-first handoff barrier deadline (ms). The host must surface a
19
19
  // shared-session (/lobby/CODE) URL within the deadline or the run fails closed and no follower
20
- // opens. The effective deadline SCALES with the per-seat run budget (execution.timeoutMs): a fixed
21
- // 2 min is too tight for a real create-a-lobby flow on a mobile-layout seat once you subtract the
22
- // seat's own desktop provisioning — the host reaches /lobby/CODE, but after the followers already
23
- // gave up. So use max(FLOOR, 40% of the budget), capped at the budget. The latch resolves the
24
- // instant the host actually reaches /lobby, so a generous ceiling only affects the fail-closed case.
20
+ // opens. The effective deadline scales with the per-participant run budget (execution.timeoutMs): a
21
+ // fixed 2 min is too tight for a real create-a-lobby flow on a mobile-layout participant once you
22
+ // subtract the participant's own desktop provisioning: the host reaches /lobby/CODE, but after the
23
+ // followers already gave up. So use max(floor, 40% of the budget), capped at the budget. The latch
24
+ // resolves the instant the host actually reaches /lobby, so a generous ceiling only affects the
25
+ // fail-closed case.
25
26
  const DEFAULT_HANDOFF_DEADLINE_MS = 120_000;
26
27
  const HANDOFF_DEADLINE_BUDGET_FRACTION = 0.4;
27
- // Per-seat runaway backstop for the vision-off-frame lobby-code read (used by the host to LATCH the
28
- // handoff code, and by each follower to independently OBSERVE its own code for the convergence proof):
29
- // at most this many single-frame reads before the seat is assumed to be somewhere without a code. Each
30
- // reader stops the instant it has what it needs, so in practice only a handful fire (a seat reaches its
31
- // /lobby within a few turns). NOTE: these reads are out-of-band OpenAI calls (external-public route
32
- // only) and are NOT counted against execution.caps.maxUsd — this hard cap is what bounds their spend
33
- // instead (each read is one cheap single-frame OCR call). If this route ever runs under a strict
34
- // budget, fold the estimate in.
28
+ // Per-participant runaway backstop for the vision-off-frame lobby-code read (used by the host to
29
+ // latch the handoff code, and by each follower to independently observe its own code for the
30
+ // convergence proof): at most this many single-frame reads before the participant is assumed to be
31
+ // somewhere without a code. Each reader stops the instant it has what it needs, so in practice only
32
+ // a handful fire (a participant reaches its /lobby within a few turns). NOTE: these reads are
33
+ // out-of-band OpenAI calls (external-public route only) and are left out of execution.caps.maxUsd,
34
+ // so this hard cap is what bounds their spend (each read is one cheap single-frame OCR call). If
35
+ // this route ever runs under a strict budget, fold the estimate in.
35
36
  const MAX_LOBBY_CODE_VISION_READS = 30;
36
- // Idle/no-progress backstop for the HOST lane specifically (default is 6/8). The host legitimately sits
37
+ // Idle/no-progress backstop for the host participant specifically (default is 6/8). The host legitimately sits
37
38
  // on an unchanging waiting-room screen while followers provision and join; it must not give up first.
38
39
  const HOST_WAIT_IDLE_STEPS = 80;
39
40
  const FOLLOWER_WAIT_IDLE_STEPS = 40;
@@ -66,21 +67,23 @@ class HandoffTimeoutError extends Error {
66
67
  }
67
68
  }
68
69
  /**
69
- * The handoff latch, its deadline and what each seat observed. The latched code and observed URLs
70
- * are runtime-only and land in persisted METADATA only as digests (origin + convergence). (The code
71
- * is a shareable game code, not a secret, and it still renders in the host's screenshots, which are
72
- * full-fidelity unless redactScreenshots is set — the digesting is about narration/URL metadata.)
70
+ * The handoff latch, its deadline and what each participant observed. The latched code and observed
71
+ * URLs are runtime-only and land in persisted metadata only as digests (origin + convergence). (The
72
+ * code is a shareable game code, not a secret, and it still renders in the host's screenshots,
73
+ * which are full-fidelity unless redactScreenshots is set. The digesting is about narration/URL
74
+ * metadata.)
73
75
  */
74
76
  export class LobbyHandoff {
75
- // Per-lane runtime-only observed state (never persisted raw): the last observed URL and the last
76
- // observed /lobby/CODE per seat, fed by onObservedUrl. The URL is digested to ORIGIN for each seat's
77
- // routeHostDigest (no code leaks); the codes drive the cross-seat lobby-convergence digest.
77
+ // Per-participant runtime-only observed state (never persisted raw): the last observed URL and the last
78
+ // observed /lobby/CODE per participant, fed by onObservedUrl. The URL is digested to its origin
79
+ // for each participant's routeHostDigest (no code leaks); the codes drive the cross-participant
80
+ // lobby-convergence digest.
78
81
  observedFinalUrls;
79
82
  observedLobbyCodes;
80
83
  latchedLobbyCode;
81
84
  /** A follower gave up because the deadline passed. */
82
85
  timedOut = false;
83
- /** Why the host seat ended without producing a lobby code. */
86
+ /** Why the host ended without producing a lobby code. */
84
87
  hostFailure;
85
88
  deadlineMs;
86
89
  lobbyCodeLatch = deferred();
@@ -100,7 +103,7 @@ export class LobbyHandoff {
100
103
  this.openaiApiKey = options.openaiApiKey;
101
104
  }
102
105
  /**
103
- * Scrubs the latched lobby CODE from ANY persisted narration once the host resolves it (the
106
+ * Scrubs the latched lobby code from any persisted narration once the host resolves it (the
104
107
  * 6-char code has no detectable secret shape, so shape-only redaction cannot catch it).
105
108
  */
106
109
  scrub = (text) => {
@@ -122,7 +125,7 @@ export class LobbyHandoff {
122
125
  this.deadlineTimer = undefined;
123
126
  }
124
127
  }
125
- // Resolve the host->follower handoff latch from WHICHEVER path sees the code first (CDP url-read,
128
+ // Resolve the host->follower handoff latch from whichever path sees the code first (CDP url-read,
126
129
  // host narration, or vision-off-frame). Idempotent: only the first code wins, and it is also stashed
127
130
  // as latchedLobbyCode so it gets scrubbed from any later narration.
128
131
  latchLobbyCode(code, participantIndex) {
@@ -133,11 +136,12 @@ export class LobbyHandoff {
133
136
  this.stopDeadline();
134
137
  this.lobbyCodeLatch.resolve(code);
135
138
  }
136
- // Build an onScreenshot handler that vision-reads the lobby code off THIS seat's own frame (the
137
- // CDP-independent observation). `done()` short-circuits once this seat has what it needs (the host
138
- // once latched; a follower once it has recorded its own observed code), `onCode` records/latches the
139
- // result. One read in flight at a time, bounded by MAX_LOBBY_CODE_VISION_READS so a seat that never
140
- // reaches a lobby can't rack up unbounded calls (fire-and-forget; the loop never awaits it).
139
+ // Build an onScreenshot handler that vision-reads the lobby code off this participant's own frame
140
+ // (the CDP-independent observation). `done()` short-circuits once this participant has what it
141
+ // needs (the host once latched; a follower once it has recorded its own observed code), `onCode`
142
+ // records/latches the result. One read in flight at a time, bounded by
143
+ // MAX_LOBBY_CODE_VISION_READS so a participant that never reaches a lobby can't rack up unbounded
144
+ // calls (fire-and-forget; the loop never awaits it).
141
145
  makeLobbyCodeVisionReader(done, onCode) {
142
146
  let inFlight = false;
143
147
  let reads = 0;
@@ -184,32 +188,34 @@ export class LobbyHandoff {
184
188
  this.lobbyCodeLatch.reject(new Error(this.hostFailure));
185
189
  }
186
190
  }
187
- /** The digest-only convergence proofs over what the seats observed. */
191
+ /** The digest-only convergence proofs over what the participants observed. */
188
192
  convergence(declaredOriginDigest) {
189
- // Observed-origin convergence proof (blocker 2): the convergence claim is about what the seats
190
- // OBSERVED, not what was DECLARED. Digest each observing seat's origin and require they AGREE on
191
- // ONE — that agreement IS the convergence proof and becomes plane.publicOriginDigest. A normal
192
- // cross-origin redirect (declared apex -> observed www) is therefore tolerated: the seats still
193
- // converge on ONE observed origin. Leave it undefined (verify fails closed) only if the seats did
194
- // not converge on a single observed origin (or none observed one).
193
+ // Observed-origin convergence proof: the convergence claim is about what the participants
194
+ // observed. Digest each observing participant's origin and require one shared origin; that
195
+ // agreement is the convergence proof and becomes plane.publicOriginDigest. A normal
196
+ // cross-origin redirect (declared apex -> observed www) is therefore tolerated: the
197
+ // participants still converge on one observed origin. Leave it undefined (verify fails closed)
198
+ // only if the participants did not converge on a single observed origin (or none observed one).
195
199
  const observedOriginDigests = this.observedFinalUrls
196
200
  .filter((url) => typeof url === "string" && url.length > 0)
197
201
  .map((url) => hostOriginDigest(url));
198
202
  const distinctObservedOrigins = new Set(observedOriginDigests);
199
203
  const publicOriginDigest = distinctObservedOrigins.size === 1
200
204
  ? [...distinctObservedOrigins][0]
201
- : // NOTHING observed (e.g. a handoff-timeout run where no seat ever navigated): fall back to the
202
- // DECLARED origin so a FAILED run's bundle stays structurally valid (every seat's route then
203
- // digests to the declared origin too). The run still fails closed for its own reason (HANDOFF_
204
- // TIMEOUT / no lobby convergence / no overlap-on-pass). GENUINE divergence (≥2 distinct observed
205
- // origins) leaves it undefined so verify fails closed on the non-convergence.
205
+ : // Nothing observed (e.g. a handoff-timeout run where no participant ever navigated): fall
206
+ // back to the declared origin so a failed run's bundle stays structurally valid (every
207
+ // participant's route then digests to the declared origin too). The run still fails
208
+ // closed for its own reason (`HANDOFF_TIMEOUT`, no lobby convergence, no
209
+ // overlap-on-pass). Real divergence (≥2 distinct observed origins) leaves it undefined so
210
+ // verify fails closed on the non-convergence.
206
211
  distinctObservedOrigins.size === 0
207
212
  ? declaredOriginDigest
208
213
  : undefined;
209
- // Lobby-convergence proof: a digest of the shared /lobby/CODE path iff EVERY seat converged on the
210
- // SAME code (a follower stuck on "/" yields no code → no false convergence). Digest-only. NOTE:
211
- // observedLobbyCodes may be a SPARSE array (a seat that never observed a code leaves a hole), and
212
- // Array.prototype.every SKIPS holes — so count the DEFINED codes explicitly, never rely on every().
214
+ // Lobby-convergence proof: a digest of the shared /lobby/CODE path iff every participant
215
+ // converged on the same code (a follower stuck on "/" yields no code, so no false convergence).
216
+ // Digest-only. observedLobbyCodes may be a sparse array (a participant that never observed a
217
+ // code leaves a hole), and Array.prototype.every skips holes, so count the defined codes
218
+ // explicitly instead of every().
213
219
  const definedCodes = this.observedLobbyCodes.filter((code) => code !== undefined);
214
220
  const distinctCodes = new Set(definedCodes);
215
221
  const lobbyConvergenceDigest = distinctCodes.size === 1 && definedCodes.length === this.observedLobbyCodes.length
@@ -218,30 +224,30 @@ export class LobbyHandoff {
218
224
  return { publicOriginDigest, lobbyConvergenceDigest };
219
225
  }
220
226
  }
221
- // Adopter-hosted inbox (#387): the persona is told its address and inbox URL on THIS plane.
227
+ // Adopter-hosted inbox: the persona is told its address and inbox URL on this plane.
222
228
  function withParticipantInbox(spec, inbox) {
223
229
  return inbox && participantHasInboxRecipient(inbox.email, spec.planned.id)
224
230
  ? withInboxMission(spec, inbox.inboxUrl, inboxRecipientFor(inbox.email, spec.planned.id)?.address)
225
231
  : spec;
226
232
  }
227
- // The HOST lane (which yields the /lobby/CODE the followers wait on) runs on its OWN dedicated
228
- // slot, and the FOLLOWERS run through a bounded pool of size concurrency-1 (blockers 1 & 4):
229
- // followers block on the host's code while holding a worker slot, so if the host lane were
230
- // scheduled INSIDE the same bounded pool it could be starved (never scheduled among the first
231
- // `concurrency` workers) and the run would die with a spurious HANDOFF_TIMEOUT (e.g. lanes
232
- // [p2,p3,host] with concurrency 2). Giving the host its own slot, started IMMEDIATELY and OUTSIDE
233
- // the follower pool, guarantees it is ALWAYS schedulable regardless of its roster position or of
234
- // concurrency vs lane count — while total in-flight paid desktops stay ≤ the declared concurrency
233
+ // The host participant (which yields the /lobby/CODE the followers wait on) runs on its own dedicated
234
+ // slot, and the followers run through a bounded pool of size concurrency-1 (blockers 1 & 4):
235
+ // followers block on the host's code while holding a worker slot, so if the host participant were
236
+ // scheduled inside the same bounded pool it could be starved (never scheduled among the first
237
+ // `concurrency` workers) and the run would die with a spurious HANDOFF_TIMEOUT (e.g. participants
238
+ // [p2,p3,host] with concurrency 2). Giving the host its own slot, started immediately and outside
239
+ // the follower pool, keeps it schedulable regardless of its roster position or of concurrency vs
240
+ // participant count, while total in-flight paid desktops stay ≤ the declared concurrency
235
241
  // (host + up to concurrency-1 followers), preserving the spend cap.
236
242
  export async function runHost(handoff, deps, spec, participantIndex) {
237
243
  const onObservedUrl = handoff.makeObservedUrl(participantIndex, true);
238
- // CDP-INDEPENDENT handoff paths (the E2B-desktop CDP url-read the onObservedUrl path relies on is
239
- // unreliable in practice). Two backups, both resolving the SAME latch; whichever sees the code first
244
+ // CDP-independent handoff paths (the E2B-desktop CDP url-read the onObservedUrl path relies on is
245
+ // unreliable in practice). Two backups, both resolving the same latch; whichever sees the code first
240
246
  // wins, all digest-only:
241
- // (1) onMessage — scan the host's own narration IF it happens to state the lobby URL; and
242
- // (2) onScreenshot — vision-read the code straight off the host's waiting-room frame. This is the
243
- // robust one: the code is rendered on screen even when CDP fails AND when the host never
244
- // narrates it, and — crucially — the host is NOT asked to announce anything, so it keeps
247
+ // (1) onMessage: scan the host's own narration if it happens to state the lobby URL; and
248
+ // (2) onScreenshot: vision-read the code straight off the host's waiting-room frame. This is the
249
+ // robust one: the code is rendered on screen even when CDP fails and when the host never
250
+ // narrates it, and the host is never asked to announce anything, so it keeps
245
251
  // running (create -> wait for players -> Start -> play) instead of ending on a stray message.
246
252
  const onMessage = (text) => {
247
253
  if (handoff.latchedLobbyCode !== undefined)
@@ -250,13 +256,14 @@ export async function runHost(handoff, deps, spec, participantIndex) {
250
256
  if (code !== undefined)
251
257
  handoff.latchLobbyCode(code, participantIndex);
252
258
  };
253
- // Vision-read the host's waiting-room frame and LATCH the code for the followers (stops once latched).
259
+ // Vision-read the host's waiting-room frame and latch the code for the followers (stops once latched).
254
260
  const onScreenshot = handoff.makeLobbyCodeVisionReader(() => handoff.latchedLobbyCode !== undefined, (code) => handoff.latchLobbyCode(code, participantIndex));
255
- // The host's job includes a long LEGITIMATE idle wait — sitting in the waiting room while the
261
+ // The host's job includes a long, legitimate idle wait: sitting in the waiting room while the
256
262
  // followers provision their own desktops and walk the Join flow (easily 15-30 turns of an
257
263
  // unchanging "waiting for players" screen). At the default idle backstop (6) the host would give up
258
264
  // before anyone arrives, orphaning the lobby (exactly the earlier failure). Raise the host's idle /
259
- // no-progress tolerance so it waits patiently; the per-seat timeout still bounds a truly stuck host.
265
+ // no-progress tolerance so it waits patiently; the per-participant timeout still bounds a truly
266
+ // stuck host.
260
267
  const hostSpec = {
261
268
  ...withParticipantInbox(spec, deps.inbox),
262
269
  backstop: {
@@ -291,7 +298,7 @@ export async function runHost(handoff, deps, spec, participantIndex) {
291
298
  }
292
299
  export async function runFollower(handoff, deps, spec, participantIndex) {
293
300
  const onObservedUrl = handoff.makeObservedUrl(participantIndex, false);
294
- // FOLLOWER: do NOT compose a mission or open the target until the host yields a lobby code.
301
+ // Follower: compose no mission and open no target until the host yields a lobby code.
295
302
  let code;
296
303
  try {
297
304
  code = await handoff.waitForHostCode();
@@ -310,9 +317,10 @@ export async function runFollower(handoff, deps, spec, participantIndex) {
310
317
  route: deps.publicAppUrl,
311
318
  };
312
319
  }
313
- // Followers also idle-wait — in the waiting room until the host starts, and between rounds. Raise
320
+ // Followers also idle-wait: in the waiting room until the host starts, and between rounds. Raise
314
321
  // their idle backstop too (less than the host's: they wait less), so a follower that joins ahead of
315
- // the other does not give up before the game begins. Per-seat timeout still bounds a stuck follower.
322
+ // the other does not give up before the game begins. Per-participant timeout still bounds a stuck
323
+ // follower.
316
324
  const followerSpec = {
317
325
  ...withLobbyCodeMission(withParticipantInbox(spec, deps.inbox), code),
318
326
  backstop: {
@@ -320,13 +328,13 @@ export async function runFollower(handoff, deps, spec, participantIndex) {
320
328
  noProgressSteps: spec.backstop?.noProgressSteps ?? FOLLOWER_WAIT_IDLE_STEPS,
321
329
  },
322
330
  };
323
- // Independently OBSERVE this follower's own lobby code by vision-reading its waiting-room frame,
324
- // and record it for the cross-seat convergence proof. This does NOT latch anything (followers gate
325
- // on the HOST's code, not their own) — it just fills this seat's observedLobbyCodes slot from a
326
- // reliable signal instead of the flaky CDP url-read, so lobbyConvergenceDigest can prove all seats
327
- // reached the SAME /lobby/CODE. If a follower somehow joined a DIFFERENT lobby, it reads a different
328
- // code and convergence correctly fails (no false proof); if it never reads one, the seat stays a
329
- // hole and convergence is honestly "not observed" for that seat.
331
+ // Independently observe this follower's own lobby code by vision-reading its waiting-room frame,
332
+ // and record it for the cross-participant convergence proof. This latches nothing (followers gate
333
+ // on the host's code). It fills this participant's observedLobbyCodes slot from a
334
+ // reliable signal instead of the flaky CDP url-read, so lobbyConvergenceDigest can prove all
335
+ // participants reached the same /lobby/CODE. If a follower somehow joined another lobby, it reads
336
+ // a different code and convergence correctly fails (no false proof); if it never reads one, the
337
+ // participant stays a hole and convergence is recorded as "not observed" for that participant.
330
338
  const onScreenshot = handoff.makeLobbyCodeVisionReader(() => handoff.observedLobbyCodes[participantIndex] !== undefined, (observed) => {
331
339
  handoff.observedLobbyCodes[participantIndex] = observed;
332
340
  });
@@ -1,14 +1,14 @@
1
- /** Extract the shared-session CODE from a (runtime-only) observed URL, or undefined. Exported for the
2
- * handoff regex table test — pure, no side effects, never persists its input. */
1
+ /** Extract the shared-session code from a (runtime-only) observed URL, or undefined. Exported for the
2
+ * handoff regex table test. Pure, no side effects, never persists its input. */
3
3
  export declare function extractLobbyCode(url: string | undefined): string | undefined;
4
4
  export declare function extractLobbyCodeFromNarration(text: string | undefined): string | undefined;
5
5
  /** Pull the assistant's plain text out of an OpenAI Responses API body (`output_text` convenience
6
6
  * field, else the concatenated `output[].content[].text`). Tolerant of shape drift; pure. */
7
7
  export declare function extractResponsesOutputText(parsed: unknown): string | undefined;
8
- /** Parse a vision reply into a lobby CODE. PRECISION-FIRST: accept ONLY when the whole reply IS the
9
- * six-character code, or when it echoes an explicit /lobby/CODE — never a bare 6-letter token buried in
10
- * prose (e.g. "I see a home SCREEN"), because a wrong latch fails the entire run, whereas a miss just
11
- * retries on the next frame while the host keeps waiting. NONE (the instructed "no code" reply) is
8
+ /** Parse a vision reply into a lobby code. Precision-first: accept only when the whole reply is the
9
+ * six-character code, or when it echoes an explicit /lobby/CODE; never a bare 6-letter token buried in
10
+ * prose (e.g. "I see a home `SCREEN`"), because a wrong latch fails the entire run, whereas a miss just
11
+ * retries on the next frame while the host keeps waiting. `NONE` (the instructed "no code" reply) is
12
12
  * rejected. Pure. */
13
13
  export declare function parseLobbyCodeReply(reply: string | undefined): string | undefined;
14
14
  export interface ReadLobbyCodeOptions {
@@ -18,7 +18,7 @@ export interface ReadLobbyCodeOptions {
18
18
  signal?: AbortSignal;
19
19
  }
20
20
  /**
21
- * Vision-read a lobby CODE straight off a host waiting-room FRAME (the robust, CDP-independent handoff
21
+ * Vision-read a lobby code straight off a host waiting-room frame (the robust, CDP-independent handoff
22
22
  * relay). Fail-soft: any network/HTTP/parse problem returns undefined so the caller simply retries on
23
23
  * the next frame. The frame is runtime-only; only the extracted code is used (as a digest downstream).
24
24
  */
@@ -1,15 +1,15 @@
1
- // Reads a lobby code (the /lobby/CODE path segment) from a URL, from a seat's narration or, through
2
- // a vision model call, from a seat's screenshot. The external-public plane uses it to hand the
3
- // host's lobby to the followers.
1
+ // Reads a lobby code (the /lobby/CODE path segment) from a URL, from a participant's narration or,
2
+ // through a vision model call, from a participant's screenshot. The external-public plane uses it
3
+ // to hand the host's lobby to the followers.
4
4
  import { OPENAI_RESPONSES_URL } from "../../actors/openai-endpoint.js";
5
5
  /**
6
6
  * The lobby-trivia (and general "/lobby/CODE") shared-session URL matcher. A code is exactly 6 chars of
7
- * the [A-Z2-9] class; a locale prefix (/en/lobby/…) and a query/hash suffix are tolerated. RUNTIME-ONLY
8
- * input (a live location.href); only the extracted CODE is used, and it lands only as a digest.
7
+ * the [A-Z2-9] class; a locale prefix (/en/lobby/…) and a query/hash suffix are tolerated. Runtime-only
8
+ * input (a live location.href); only the extracted code is used, and it lands only as a digest.
9
9
  */
10
10
  const LOBBY_CODE_PATTERN = /\/lobby\/([A-Z2-9]{6})(?:$|[/?#])/;
11
- /** Extract the shared-session CODE from a (runtime-only) observed URL, or undefined. Exported for the
12
- * handoff regex table test — pure, no side effects, never persists its input. */
11
+ /** Extract the shared-session code from a (runtime-only) observed URL, or undefined. Exported for the
12
+ * handoff regex table test. Pure, no side effects, never persists its input. */
13
13
  export function extractLobbyCode(url) {
14
14
  if (typeof url !== "string")
15
15
  return undefined;
@@ -17,10 +17,10 @@ export function extractLobbyCode(url) {
17
17
  return match ? match[1] : undefined;
18
18
  }
19
19
  /**
20
- * Extract a lobby CODE from free-form ACTOR NARRATION (the host's reasoning/message where it states
20
+ * Extract a lobby code from free-form actor narration (the host's reasoning/message where it states
21
21
  * the lobby URL it sees), where the /lobby/CODE is followed by arbitrary prose (a space, backtick,
22
- * newline) rather than end-of-string or /?# — so the strict LOBBY_CODE_PATTERN would miss it. Uses a
23
- * negative-lookahead boundary (exactly 6 code chars). This is the CDP-INDEPENDENT handoff path: the
22
+ * newline) rather than end-of-string or /?#, so the strict LOBBY_CODE_PATTERN would miss it. Uses a
23
+ * negative-lookahead boundary (exactly 6 code chars). This is the CDP-independent handoff path: the
24
24
  * host reads the code on screen and states it, and this reads it from the model's own text. Pure;
25
25
  * input is runtime-only; only the code is used (as a digest).
26
26
  */
@@ -32,10 +32,10 @@ export function extractLobbyCodeFromNarration(text) {
32
32
  if (inUrl)
33
33
  return inUrl[1];
34
34
  // Fallback: an explicitly-labeled bare code (e.g. "LOBBY_CODE=ABC123"), which the host may state
35
- // if it copied the code rather than the URL. The label is matched case-insensitively, but the CODE
36
- // itself must be UPPERCASE [A-Z2-9] — a real lobby code always renders uppercase, whereas an /i match
35
+ // if it copied the code rather than the URL. The label is matched case-insensitively, but the code
36
+ // itself must be uppercase [A-Z2-9]: a real lobby code always renders uppercase, whereas an /i match
37
37
  // on the code class would also grab an ordinary lowercase word after "lobby code " (e.g. "the lobby
38
- // code screen") and latch a WRONG code. Precision-first, matching parseLobbyCodeReply's rationale.
38
+ // code screen") and latch a wrong code. Precision-first, matching parseLobbyCodeReply's rationale.
39
39
  const labeled = text.match(/lobby[ _-]?code[=:\s]+([A-Z2-9]{6})(?![A-Za-z2-9])/i);
40
40
  return labeled && labeled[1] && /^[A-Z2-9]{6}$/.test(labeled[1]) ? labeled[1] : undefined;
41
41
  }
@@ -67,10 +67,10 @@ export function extractResponsesOutputText(parsed) {
67
67
  }
68
68
  return parts.length > 0 ? parts.join("\n") : undefined;
69
69
  }
70
- /** Parse a vision reply into a lobby CODE. PRECISION-FIRST: accept ONLY when the whole reply IS the
71
- * six-character code, or when it echoes an explicit /lobby/CODE — never a bare 6-letter token buried in
72
- * prose (e.g. "I see a home SCREEN"), because a wrong latch fails the entire run, whereas a miss just
73
- * retries on the next frame while the host keeps waiting. NONE (the instructed "no code" reply) is
70
+ /** Parse a vision reply into a lobby code. Precision-first: accept only when the whole reply is the
71
+ * six-character code, or when it echoes an explicit /lobby/CODE; never a bare 6-letter token buried in
72
+ * prose (e.g. "I see a home `SCREEN`"), because a wrong latch fails the entire run, whereas a miss just
73
+ * retries on the next frame while the host keeps waiting. `NONE` (the instructed "no code" reply) is
74
74
  * rejected. Pure. */
75
75
  export function parseLobbyCodeReply(reply) {
76
76
  if (typeof reply !== "string")
@@ -88,11 +88,11 @@ const LOBBY_CODE_VISION_PROMPT = "This is a screenshot of a the example multipla
88
88
  "code'/'room code' label or inside an invite link of the form /lobby/CODE. Your entire reply MUST be " +
89
89
  "exactly those 6 characters in uppercase and NOTHING else (no words, no punctuation). If no lobby " +
90
90
  "code is visible on this screen (e.g. it is the home screen or a game round), reply exactly NONE.";
91
- // A single-frame OCR-style read. gpt-5.5 (the CU default) is used deliberately: it reliably reads the
92
- // 6-char code off a dense MOBILE-viewport waiting room — a smaller/cheaper model (gpt-4.1-mini) was
93
- // tried and could NOT read it. reasoning.effort stays "low" (minimal) and the output budget is small
91
+ // A single-frame OCR-style read. gpt-5.5 (the computer-use default) is used deliberately: it reliably reads the
92
+ // 6-char code off a dense mobile-viewport waiting room. A smaller/cheaper model (gpt-4.1-mini) was
93
+ // tried and could not read it. reasoning.effort stays "low" (minimal) and the output budget is small
94
94
  // but comfortably clear of the "incomplete on reasoning overflow" edge. Kept on the same account/key
95
- // as the actor; the same full-fidelity frame is already sent to this API by the CU provider, so this
95
+ // as the actor; the same full-fidelity frame is already sent to this API by the computer-use provider, so this
96
96
  // adds no new data-exposure surface. See onScreenshot in runHost.
97
97
  const LOBBY_CODE_VISION_MODEL = "gpt-5.5";
98
98
  // Output-token budget for the read. The answer is 6 chars, but leave clear margin over any low-effort
@@ -102,7 +102,7 @@ const LOBBY_CODE_VISION_MAX_OUTPUT_TOKENS = 64;
102
102
  // visionInFlight pinned true and silently kill the relay for the rest of the host run.
103
103
  const LOBBY_CODE_VISION_TIMEOUT_MS = 15_000;
104
104
  /**
105
- * Vision-read a lobby CODE straight off a host waiting-room FRAME (the robust, CDP-independent handoff
105
+ * Vision-read a lobby code straight off a host waiting-room frame (the robust, CDP-independent handoff
106
106
  * relay). Fail-soft: any network/HTTP/parse problem returns undefined so the caller simply retries on
107
107
  * the next frame. The frame is runtime-only; only the extracted code is used (as a digest downstream).
108
108
  */
@@ -4,13 +4,13 @@ import type { RunBundle } from "../../run/bundle.js";
4
4
  import type { CuaParticipantDeps, DesktopParticipantRun, ParticipantRunOutcome } from "../computer-use/types.js";
5
5
  import type { LiveParticipants, PlaneContext } from "./types.js";
6
6
  export declare function defaultSessionTimeoutMs(plan: SharedWorldPlan): number;
7
- /** Resolve an actor's seat URL against the harness-minted getHost base (entry is a same-origin
8
- * relative path, validated at parse against serve.url). */
7
+ /** Resolve an actor's participant URL against the harness-minted getHost base (entry is a
8
+ * same-origin relative path, validated at parse against serve.url). */
9
9
  export declare function resolveActorEntryUrl(baseUrl: string, entry: string | undefined): string;
10
10
  export declare function participantTaxonomyLabel(labels: Participant["labels"]): string;
11
- /** Thread the host-yielded lobby CODE into a follower's mission at runtime (external-public route).
12
- * The CODE flows into the follower's join instruction; it is persisted only as the composed prompt
13
- * the model reads (never a raw bundle field), and the lab scrubs the CODE from all narration. The
11
+ /** Thread the host-yielded lobby code into a follower's mission at runtime (external-public route).
12
+ * The code flows into the follower's join instruction; it is persisted only as the composed prompt
13
+ * the model reads (never a raw bundle field), and the lab scrubs the code from all narration. The
14
14
  * follower joins through the real UI (a direct /lobby/CODE visit does not auto-join a non-member). */
15
15
  export declare function withLobbyCodeMission(spec: DesktopParticipantRun, code: string): DesktopParticipantRun;
16
16
  /** A follower blocked by an expired deadline or an ended host. It never opened a browser;
@@ -19,20 +19,23 @@ export declare function makeBlockedFollowerOutcome(spec: DesktopParticipantRun,
19
19
  /** The computer-use runner deps every participant shares, on either plane. */
20
20
  export type ParticipantRunDeps = Omit<CuaParticipantDeps, "signalProvisioned" | "appUrl" | "onObservedUrl">;
21
21
  /**
22
- * A live run publishes an in-progress bundle before its seats start, whether or not an Observer
23
- * is attached, and the seats' live traces rewrite it as they go, as on the computer-use route. A
24
- * run killed mid-way leaves that evidence on disk. The flush starts with the first snapshot.
22
+ * A live run publishes an in-progress bundle before its participants start, whether or not an
23
+ * Observer is attached, and the participants' live traces rewrite it as they go, as on the
24
+ * computer-use route. A run killed mid-way leaves that evidence on disk. The flush starts with the
25
+ * first snapshot.
25
26
  */
26
27
  export declare function startParticipantFlush(ctx: PlaneContext, live: LiveParticipants, bundle: RunBundle): void;
27
28
  /**
28
- * The runner deps both planes give every participant. cloneRoute=false + subjectEnvNames=[] keep subject
29
- * creds out of every actor sandbox (FIX-10). `scrubKnownValues` is the plane's scrub: the
30
- * external-public plane also scrubs the latched lobby code.
29
+ * The runner deps both planes give every participant. The `shared-app` subject keeps three things
30
+ * out of every actor sandbox: the subject env names' values, the GitHub token, and clone
31
+ * or local-tree provisioning. The committed subject.envValues still reach it, non-secret by parse.
32
+ * `scrubKnownValues` is the plane's scrub: the external-public plane also scrubs the latched lobby
33
+ * code.
31
34
  */
32
35
  export declare function participantRunDeps(ctx: PlaneContext, live: LiveParticipants, scrubKnownValues: (text: string) => string): ParticipantRunDeps;
33
36
  /**
34
37
  * Each participant's actor spec, with committed personas compiled in so each prompt carries real
35
- * behavioral directives (#381). Evidence copies of the assignment, instructions and persona are
38
+ * behavioral directives. Evidence copies of the assignment, instructions and persona are
36
39
  * scrubbed of the run's known secret values.
37
40
  */
38
41
  export declare function buildParticipantSpecs(participants: readonly SharedWorldParticipant[], cwd: string, scrubKnownValues: (text: string) => string): Promise<DesktopParticipantRun[]>;