humanish 0.107.0 → 0.109.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 (671) hide show
  1. package/ARCHITECTURE.md +73 -69
  2. package/CHANGELOG.md +27 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +148 -175
  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-trace.js +2 -1
  14. package/dist/actors/codex/app-server-ui.js +1 -1
  15. package/dist/actors/codex/codex-admission.d.ts +91 -0
  16. package/dist/actors/codex/codex-admission.js +150 -0
  17. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  18. package/dist/actors/codex/restricted-executable.js +8 -8
  19. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  20. package/dist/actors/codex/restricted-launch.js +1 -1
  21. package/dist/actors/codex/restricted-participant.js +20 -18
  22. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  23. package/dist/actors/codex/restricted-policy.js +2 -2
  24. package/dist/actors/codex/restricted-session.d.ts +3 -3
  25. package/dist/actors/codex/restricted-session.js +10 -5
  26. package/dist/actors/computer-use/actor.d.ts +18 -18
  27. package/dist/actors/computer-use/actor.js +4 -4
  28. package/dist/actors/computer-use/admission-limit.d.ts +3 -3
  29. package/dist/actors/computer-use/admission-limit.js +4 -4
  30. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  31. package/dist/actors/computer-use/executor-error.js +3 -3
  32. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  33. package/dist/actors/computer-use/loop/actions.js +15 -15
  34. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  35. package/dist/actors/computer-use/loop/backstop.js +14 -12
  36. package/dist/actors/computer-use/loop/debrief.js +2 -2
  37. package/dist/actors/computer-use/loop/ending.d.ts +6 -6
  38. package/dist/actors/computer-use/loop/ending.js +18 -17
  39. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  40. package/dist/actors/computer-use/loop/observation.js +15 -14
  41. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  42. package/dist/actors/computer-use/loop/provider-call.js +12 -12
  43. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  44. package/dist/actors/computer-use/loop/session.js +4 -4
  45. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  46. package/dist/actors/computer-use/loop/spend.js +1 -1
  47. package/dist/actors/computer-use/loop/trace.js +11 -9
  48. package/dist/actors/computer-use/loop/types.d.ts +47 -45
  49. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  50. package/dist/actors/computer-use/loop/usage.js +2 -2
  51. package/dist/actors/computer-use/loop.d.ts +6 -1
  52. package/dist/actors/computer-use/loop.js +26 -4
  53. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  54. package/dist/actors/computer-use/openai-context.js +214 -0
  55. package/dist/actors/computer-use/openai-provider.d.ts +13 -10
  56. package/dist/actors/computer-use/openai-provider.js +52 -41
  57. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  58. package/dist/actors/computer-use/openai-requests.js +82 -15
  59. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  60. package/dist/actors/computer-use/openai-wire.js +36 -34
  61. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  62. package/dist/actors/computer-use/provider-error.js +6 -6
  63. package/dist/actors/contract.d.ts +82 -47
  64. package/dist/actors/contract.js +30 -24
  65. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  66. package/dist/actors/local-agent/claude-session.js +13 -12
  67. package/dist/actors/local-agent/cli.d.ts +9 -7
  68. package/dist/actors/local-agent/cli.js +24 -28
  69. package/dist/actors/local-agent/readiness.d.ts +2 -2
  70. package/dist/actors/local-agent/readiness.js +4 -4
  71. package/dist/actors/reasoning-effort.js +8 -8
  72. package/dist/actors/registry.d.ts +12 -12
  73. package/dist/actors/registry.js +21 -20
  74. package/dist/actors/scripted-browser/actor.d.ts +10 -10
  75. package/dist/actors/scripted-browser/actor.js +17 -17
  76. package/dist/actors/scripted-browser/browser-command.js +1 -1
  77. package/dist/actors/scripted-browser/steps.js +1 -1
  78. package/dist/actors/scripted-browser/types.d.ts +1 -1
  79. package/dist/actors/stop-conditions.d.ts +1 -1
  80. package/dist/analysis/automatic-completion.d.ts +7 -7
  81. package/dist/analysis/automatic-completion.js +1 -1
  82. package/dist/analysis/automatic-config.d.ts +6 -6
  83. package/dist/analysis/automatic-config.js +1 -1
  84. package/dist/analysis/codex-config.d.ts +6 -2
  85. package/dist/analysis/codex-config.js +22 -14
  86. package/dist/analysis/execute.d.ts +1 -1
  87. package/dist/analysis/execute.js +1 -1
  88. package/dist/analysis/service.js +5 -5
  89. package/dist/analysis/types.d.ts +6 -0
  90. package/dist/browser-control/client.js +16 -16
  91. package/dist/browser-control/dispatcher.js +4 -4
  92. package/dist/browser-control/protocol.js +14 -14
  93. package/dist/browser-control/recording-transfer.js +4 -4
  94. package/dist/browser-control/transport.js +7 -7
  95. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  96. package/dist/cli/commands/analyze.js +19 -16
  97. package/dist/cli/commands/codex.js +9 -9
  98. package/dist/cli/commands/comms.js +48 -35
  99. package/dist/cli/commands/feedback.js +20 -21
  100. package/dist/cli/commands/migrate.d.ts +4 -0
  101. package/dist/cli/commands/migrate.js +65 -0
  102. package/dist/cli/commands/observe.d.ts +0 -1
  103. package/dist/cli/commands/observe.js +136 -112
  104. package/dist/cli/commands/run-command.d.ts +10 -0
  105. package/dist/cli/commands/run-command.js +85 -0
  106. package/dist/cli/commands/runs.js +136 -139
  107. package/dist/cli/commands/setup.d.ts +2 -2
  108. package/dist/cli/commands/setup.js +27 -24
  109. package/dist/cli/commands/study-format.d.ts +9 -0
  110. package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
  111. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  112. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
  113. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  114. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  115. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  116. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
  117. package/dist/cli/commands/study-route-run.d.ts +19 -0
  118. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  119. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  120. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  121. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  122. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
  123. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  124. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  125. package/dist/cli/commands/study-run.d.ts +9 -0
  126. package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
  127. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
  128. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
  129. package/dist/cli/commands/study.d.ts +3 -0
  130. package/dist/cli/commands/study.js +146 -0
  131. package/dist/cli/commands/tui.d.ts +4 -4
  132. package/dist/cli/commands/tui.js +31 -31
  133. package/dist/cli/commands/watch.js +71 -121
  134. package/dist/cli/deprecations.d.ts +6 -0
  135. package/dist/cli/deprecations.js +18 -0
  136. package/dist/cli/doctor.d.ts +18 -8
  137. package/dist/cli/doctor.js +114 -59
  138. package/dist/cli/first-run-path.d.ts +15 -13
  139. package/dist/cli/first-run-path.js +35 -33
  140. package/dist/cli/io.d.ts +44 -9
  141. package/dist/cli/io.js +98 -23
  142. package/dist/cli/observer-follow.d.ts +3 -3
  143. package/dist/cli/observer-follow.js +6 -7
  144. package/dist/cli/orientation.d.ts +10 -7
  145. package/dist/cli/orientation.js +89 -47
  146. package/dist/cli/product-sentence.d.ts +6 -0
  147. package/dist/cli/product-sentence.js +6 -0
  148. package/dist/cli/program.d.ts +6 -1
  149. package/dist/cli/program.js +111 -43
  150. package/dist/cli/telemetry.d.ts +16 -16
  151. package/dist/cli/telemetry.js +46 -44
  152. package/dist/cli.js +1 -1
  153. package/dist/comms/capture-surface.d.ts +13 -12
  154. package/dist/comms/capture-surface.js +23 -22
  155. package/dist/comms/catch-host.d.ts +7 -7
  156. package/dist/comms/catch-host.js +17 -17
  157. package/dist/comms/connections.d.ts +1 -1
  158. package/dist/comms/connections.js +2 -2
  159. package/dist/comms/email-catch.d.ts +3 -3
  160. package/dist/comms/email-catch.js +8 -8
  161. package/dist/comms/external-evidence.d.ts +5 -5
  162. package/dist/comms/external-evidence.js +5 -4
  163. package/dist/comms/extract.js +2 -2
  164. package/dist/comms/fake-inbox.d.ts +3 -3
  165. package/dist/comms/fake-inbox.js +3 -3
  166. package/dist/comms/receiving-render.d.ts +1 -1
  167. package/dist/comms/receiving-render.js +2 -2
  168. package/dist/comms/receiving-runtime.d.ts +4 -4
  169. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  170. package/dist/comms/sandbox-catch-script.js +6 -6
  171. package/dist/comms/sandbox-catch.d.ts +38 -39
  172. package/dist/comms/sandbox-catch.js +36 -37
  173. package/dist/comms/setup.d.ts +2 -2
  174. package/dist/comms/setup.js +56 -25
  175. package/dist/comms/thread-evidence.d.ts +1 -1
  176. package/dist/comms/thread-evidence.js +6 -6
  177. package/dist/comms/types.d.ts +6 -6
  178. package/dist/comms/types.js +3 -3
  179. package/dist/evidence/frame-signature.d.ts +1 -1
  180. package/dist/evidence/frame-signature.js +4 -4
  181. package/dist/evidence/redaction.d.ts +3 -3
  182. package/dist/evidence/redaction.js +4 -4
  183. package/dist/feedback/draft.js +38 -80
  184. package/dist/feedback/export-bundle.js +1 -1
  185. package/dist/feedback/export.d.ts +5 -1
  186. package/dist/feedback/export.js +10 -10
  187. package/dist/feedback/feedback.d.ts +2 -2
  188. package/dist/feedback/feedback.js +21 -3
  189. package/dist/feedback/proof.d.ts +1 -1
  190. package/dist/feedback/proof.js +2 -2
  191. package/dist/guest/bootstrap.js +6 -6
  192. package/dist/guest/browser-tools.js +8 -8
  193. package/dist/guest/chromium-text.js +19 -19
  194. package/dist/guest/desktop-executor.d.ts +2 -2
  195. package/dist/guest/desktop-executor.js +20 -20
  196. package/dist/guest/desktop-keys.js +4 -4
  197. package/dist/guest/desktop-media.d.ts +2 -2
  198. package/dist/guest/desktop-media.js +16 -16
  199. package/dist/guest/desktop-native.d.ts +1 -1
  200. package/dist/guest/desktop-native.js +10 -10
  201. package/dist/guest/runtime-desktop.js +2 -2
  202. package/dist/guest/runtime-processes.d.ts +2 -2
  203. package/dist/guest/runtime-processes.js +2 -2
  204. package/dist/guest/runtime.js +6 -6
  205. package/dist/index.d.ts +14 -14
  206. package/dist/index.js +8 -8
  207. package/dist/keys/key-resolution.d.ts +5 -5
  208. package/dist/keys/key-resolution.js +23 -23
  209. package/dist/observer/artifact.d.ts +2 -2
  210. package/dist/observer/artifact.js +7 -7
  211. package/dist/observer/data.d.ts +6 -6
  212. package/dist/observer/data.js +5 -4
  213. package/dist/observer/exposure.d.ts +1 -1
  214. package/dist/observer/exposure.js +11 -11
  215. package/dist/observer/http.js +1 -1
  216. package/dist/observer/library.d.ts +3 -1
  217. package/dist/observer/library.js +8 -3
  218. package/dist/observer/listen.js +5 -4
  219. package/dist/observer/render.d.ts +1 -1
  220. package/dist/observer/render.js +17 -6
  221. package/dist/observer/run-routes.d.ts +4 -3
  222. package/dist/observer/run-routes.js +38 -13
  223. package/dist/observer/serve.d.ts +1 -1
  224. package/dist/observer/serve.js +7 -3
  225. package/dist/observer/tunnel.js +1 -1
  226. package/dist/observer-app.html +4 -4
  227. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  228. package/dist/routes/computer-use/bundle-parts.js +18 -17
  229. package/dist/routes/computer-use/bundle.d.ts +2 -2
  230. package/dist/routes/computer-use/bundle.js +10 -9
  231. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
  232. package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
  233. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  234. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
  235. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  236. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
  238. package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
  239. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  240. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
  241. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  242. package/dist/routes/computer-use/external-comms.js +1 -1
  243. package/dist/routes/computer-use/fanout-bundle.js +27 -26
  244. package/dist/routes/computer-use/fanout-records.js +12 -13
  245. package/dist/routes/computer-use/live-flush.d.ts +4 -4
  246. package/dist/routes/computer-use/live-flush.js +6 -6
  247. package/dist/routes/computer-use/live-phase.d.ts +5 -4
  248. package/dist/routes/computer-use/live-phase.js +8 -8
  249. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  250. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  251. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  252. package/dist/routes/computer-use/local-vm.js +3 -3
  253. package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
  254. package/dist/routes/computer-use/participant-desktop.js +5 -5
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +10 -10
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +33 -15
  259. package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
  260. package/dist/routes/computer-use/participant-prompt.js +9 -9
  261. package/dist/routes/computer-use/participant-runs.d.ts +16 -16
  262. package/dist/routes/computer-use/participant-runs.js +26 -25
  263. package/dist/routes/computer-use/plan.d.ts +12 -12
  264. package/dist/routes/computer-use/plan.js +42 -42
  265. package/dist/routes/computer-use/preflight.d.ts +5 -5
  266. package/dist/routes/computer-use/preflight.js +25 -25
  267. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  268. package/dist/routes/computer-use/rerun-selection.js +4 -3
  269. package/dist/routes/computer-use/result.d.ts +4 -4
  270. package/dist/routes/computer-use/result.js +22 -21
  271. package/dist/routes/computer-use/route.d.ts +12 -11
  272. package/dist/routes/computer-use/route.js +31 -30
  273. package/dist/routes/computer-use/self-report.d.ts +7 -7
  274. package/dist/routes/computer-use/self-report.js +32 -32
  275. package/dist/routes/computer-use/setup.d.ts +23 -23
  276. package/dist/routes/computer-use/setup.js +28 -29
  277. package/dist/routes/computer-use/single-bundle.d.ts +11 -11
  278. package/dist/routes/computer-use/single-bundle.js +40 -41
  279. package/dist/routes/computer-use/subject-projection.d.ts +4 -4
  280. package/dist/routes/computer-use/subject-projection.js +6 -6
  281. package/dist/routes/computer-use/types.d.ts +71 -73
  282. package/dist/routes/computer-use/types.js +12 -12
  283. package/dist/routes/preview.d.ts +13 -7
  284. package/dist/routes/preview.js +11 -7
  285. package/dist/routes/scripted/bundle.d.ts +7 -7
  286. package/dist/routes/scripted/bundle.js +20 -18
  287. package/dist/routes/scripted/plan.d.ts +8 -8
  288. package/dist/routes/scripted/plan.js +13 -13
  289. package/dist/routes/scripted/result.d.ts +3 -3
  290. package/dist/routes/scripted/result.js +13 -13
  291. package/dist/routes/scripted/route.d.ts +9 -9
  292. package/dist/routes/scripted/route.js +15 -16
  293. package/dist/routes/scripted/scenario.d.ts +1 -1
  294. package/dist/routes/scripted/scenario.js +5 -5
  295. package/dist/routes/scripted/setup.d.ts +6 -6
  296. package/dist/routes/scripted/setup.js +8 -8
  297. package/dist/routes/scripted/subject.d.ts +5 -5
  298. package/dist/routes/scripted/subject.js +4 -4
  299. package/dist/routes/scripted/surface-records.d.ts +1 -1
  300. package/dist/routes/scripted/surface-records.js +4 -4
  301. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  302. package/dist/routes/scripted/types.d.ts +18 -20
  303. package/dist/routes/scripted/types.js +2 -2
  304. package/dist/routes/shared-world/bundle-records.js +11 -10
  305. package/dist/routes/shared-world/bundle.d.ts +5 -5
  306. package/dist/routes/shared-world/bundle.js +46 -43
  307. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  308. package/dist/routes/shared-world/checkpoints.js +2 -2
  309. package/dist/routes/shared-world/comms.d.ts +14 -14
  310. package/dist/routes/shared-world/comms.js +19 -18
  311. package/dist/routes/shared-world/external-public.d.ts +4 -3
  312. package/dist/routes/shared-world/external-public.js +16 -12
  313. package/dist/routes/shared-world/handoff.d.ts +7 -6
  314. package/dist/routes/shared-world/handoff.js +65 -57
  315. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  316. package/dist/routes/shared-world/lobby-code.js +9 -9
  317. package/dist/routes/shared-world/participant-specs.d.ts +10 -9
  318. package/dist/routes/shared-world/participant-specs.js +38 -31
  319. package/dist/routes/shared-world/plan.d.ts +9 -9
  320. package/dist/routes/shared-world/plan.js +16 -16
  321. package/dist/routes/shared-world/provenance.d.ts +2 -2
  322. package/dist/routes/shared-world/provenance.js +2 -2
  323. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  324. package/dist/routes/shared-world/provisioned.js +18 -17
  325. package/dist/routes/shared-world/result.d.ts +6 -6
  326. package/dist/routes/shared-world/result.js +29 -29
  327. package/dist/routes/shared-world/route.d.ts +11 -11
  328. package/dist/routes/shared-world/route.js +40 -39
  329. package/dist/routes/shared-world/setup.d.ts +16 -16
  330. package/dist/routes/shared-world/setup.js +23 -23
  331. package/dist/routes/shared-world/types.d.ts +55 -53
  332. package/dist/routes/shared-world/types.js +4 -4
  333. package/dist/routes/terminal/adapter.d.ts +5 -5
  334. package/dist/routes/terminal/adapter.js +9 -9
  335. package/dist/routes/terminal/bundle.d.ts +13 -13
  336. package/dist/routes/terminal/bundle.js +28 -27
  337. package/dist/routes/terminal/credentials.d.ts +8 -8
  338. package/dist/routes/terminal/credentials.js +12 -12
  339. package/dist/routes/terminal/dry-run.d.ts +4 -4
  340. package/dist/routes/terminal/dry-run.js +12 -12
  341. package/dist/routes/terminal/encoding.js +2 -2
  342. package/dist/routes/terminal/ledger.d.ts +5 -5
  343. package/dist/routes/terminal/ledger.js +14 -14
  344. package/dist/routes/terminal/lifetime.d.ts +1 -1
  345. package/dist/routes/terminal/lifetime.js +1 -1
  346. package/dist/routes/terminal/live-finish.d.ts +2 -2
  347. package/dist/routes/terminal/live-finish.js +10 -10
  348. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  349. package/dist/routes/terminal/live-sandbox.js +15 -15
  350. package/dist/routes/terminal/participant-text.js +2 -1
  351. package/dist/routes/terminal/persona.d.ts +2 -2
  352. package/dist/routes/terminal/persona.js +3 -3
  353. package/dist/routes/terminal/plan.d.ts +7 -7
  354. package/dist/routes/terminal/plan.js +15 -15
  355. package/dist/routes/terminal/recorder.js +2 -2
  356. package/dist/routes/terminal/result.d.ts +5 -5
  357. package/dist/routes/terminal/result.js +14 -14
  358. package/dist/routes/terminal/route.d.ts +9 -9
  359. package/dist/routes/terminal/route.js +19 -20
  360. package/dist/routes/terminal/sandbox.d.ts +1 -1
  361. package/dist/routes/terminal/sandbox.js +1 -1
  362. package/dist/routes/terminal/session.d.ts +5 -5
  363. package/dist/routes/terminal/session.js +14 -13
  364. package/dist/routes/terminal/token-usage.d.ts +1 -1
  365. package/dist/routes/terminal/token-usage.js +7 -8
  366. package/dist/routes/terminal/trace.d.ts +4 -4
  367. package/dist/routes/terminal/trace.js +2 -2
  368. package/dist/routes/terminal/types.d.ts +48 -50
  369. package/dist/routes/terminal/types.js +5 -5
  370. package/dist/run/bundle-shape.js +3 -3
  371. package/dist/run/bundle.d.ts +49 -49
  372. package/dist/run/bundle.js +3 -2
  373. package/dist/run/cost-summary.js +3 -3
  374. package/dist/run/costs.d.ts +23 -0
  375. package/dist/run/costs.js +79 -44
  376. package/dist/run/detail.d.ts +6 -6
  377. package/dist/run/detail.js +4 -4
  378. package/dist/run/dry-run-inputs.d.ts +1 -1
  379. package/dist/run/dry-run-inputs.js +2 -2
  380. package/dist/run/dry-run.js +20 -20
  381. package/dist/run/judge.d.ts +19 -13
  382. package/dist/run/judge.js +18 -8
  383. package/dist/run/outcomes.d.ts +1 -1
  384. package/dist/run/participant.d.ts +1 -1
  385. package/dist/run/paths.d.ts +1 -1
  386. package/dist/run/paths.js +1 -1
  387. package/dist/run/preflight-receipts.js +1 -1
  388. package/dist/run/pricing.d.ts +11 -6
  389. package/dist/run/pricing.js +22 -15
  390. package/dist/run/projection.d.ts +46 -46
  391. package/dist/run/projection.js +57 -57
  392. package/dist/run/reclaim.d.ts +1 -1
  393. package/dist/run/reclaim.js +3 -3
  394. package/dist/run/results.d.ts +5 -5
  395. package/dist/run/run-cost.d.ts +53 -0
  396. package/dist/run/run-cost.js +105 -0
  397. package/dist/run/run-index-analysis.d.ts +15 -0
  398. package/dist/run/run-index-analysis.js +77 -0
  399. package/dist/run/run-index.d.ts +19 -7
  400. package/dist/run/run-index.js +77 -64
  401. package/dist/run/run-not-found.d.ts +5 -0
  402. package/dist/run/run-not-found.js +15 -0
  403. package/dist/run/run.d.ts +6 -5
  404. package/dist/run/run.js +3 -3
  405. package/dist/run/sandbox-receipts.d.ts +2 -2
  406. package/dist/run/sandbox-receipts.js +3 -3
  407. package/dist/run/shared-world-evidence.d.ts +37 -36
  408. package/dist/run/shared-world-evidence.js +4 -4
  409. package/dist/run/shared-world-shape.d.ts +1 -1
  410. package/dist/run/shared-world-shape.js +7 -7
  411. package/dist/run/stats.d.ts +14 -8
  412. package/dist/run/stats.js +121 -63
  413. package/dist/run/status.d.ts +16 -29
  414. package/dist/run/status.js +10 -29
  415. package/dist/run/stored-runs.js +2 -1
  416. package/dist/run/stream-shape.js +1 -1
  417. package/dist/run/streams.d.ts +7 -7
  418. package/dist/run/study-provenance.d.ts +49 -0
  419. package/dist/run/study-provenance.js +66 -0
  420. package/dist/run/study-result.d.ts +11 -0
  421. package/dist/run/study-result.js +9 -0
  422. package/dist/run/text.d.ts +2 -0
  423. package/dist/run/text.js +4 -0
  424. package/dist/run-study.d.ts +112 -0
  425. package/dist/{run-lab.js → run-study.js} +52 -47
  426. package/dist/{lab → study}/adapter-extension.d.ts +15 -27
  427. package/dist/{lab → study}/adapter-extension.js +10 -45
  428. package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
  429. package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
  430. package/dist/study/composition-rules.d.ts +7 -0
  431. package/dist/{lab → study}/composition-rules.js +53 -53
  432. package/dist/study/config.d.ts +15 -0
  433. package/dist/{lab → study}/config.js +98 -41
  434. package/dist/study/convert.d.ts +33 -0
  435. package/dist/study/convert.js +432 -0
  436. package/dist/{lab → study}/device-presets.d.ts +10 -10
  437. package/dist/{lab → study}/device-presets.js +11 -11
  438. package/dist/study/discover.d.ts +75 -0
  439. package/dist/{lab → study}/discover.js +134 -95
  440. package/dist/{lab → study}/doctor.d.ts +19 -12
  441. package/dist/{lab → study}/doctor.js +58 -20
  442. package/dist/study/field-paths.d.ts +12 -0
  443. package/dist/study/field-paths.js +126 -0
  444. package/dist/study/files.d.ts +26 -0
  445. package/dist/study/files.js +44 -0
  446. package/dist/{lab → study}/init-templates.d.ts +2 -2
  447. package/dist/study/init-templates.js +421 -0
  448. package/dist/{lab → study}/init.d.ts +2 -2
  449. package/dist/{lab → study}/init.js +46 -11
  450. package/dist/study/keys.d.ts +4 -0
  451. package/dist/{lab → study}/keys.js +46 -12
  452. package/dist/study/migrate.d.ts +48 -0
  453. package/dist/study/migrate.js +408 -0
  454. package/dist/study/owned-files.d.ts +38 -0
  455. package/dist/study/owned-files.js +182 -0
  456. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  457. package/dist/{lab → study}/parse/actors.js +14 -14
  458. package/dist/study/parse/comms.d.ts +12 -0
  459. package/dist/{lab → study}/parse/comms.js +5 -5
  460. package/dist/study/parse/execution.d.ts +19 -0
  461. package/dist/{lab → study}/parse/execution.js +13 -13
  462. package/dist/study/parse/study-v3.d.ts +21 -0
  463. package/dist/study/parse/study-v3.js +259 -0
  464. package/dist/study/parse/subject-state.d.ts +30 -0
  465. package/dist/{lab → study}/parse/subject-state.js +19 -19
  466. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  467. package/dist/{lab → study}/parse/subject.js +34 -34
  468. package/dist/{lab → study}/parse/values.d.ts +3 -3
  469. package/dist/{lab → study}/parse/values.js +3 -3
  470. package/dist/{lab → study}/persona-resolve.d.ts +8 -8
  471. package/dist/{lab → study}/persona-resolve.js +6 -6
  472. package/dist/{lab → study}/plan-base.d.ts +7 -7
  473. package/dist/{lab → study}/plan-base.js +1 -1
  474. package/dist/{lab → study}/plan-participants.d.ts +12 -12
  475. package/dist/{lab → study}/plan-participants.js +4 -4
  476. package/dist/{lab → study}/plan-types.d.ts +31 -31
  477. package/dist/{lab → study}/plan-types.js +2 -2
  478. package/dist/study/plan.d.ts +13 -0
  479. package/dist/study/plan.js +101 -0
  480. package/dist/study/preflight-probes.d.ts +3 -0
  481. package/dist/{lab → study}/preflight-probes.js +20 -19
  482. package/dist/study/preflight-result.d.ts +8 -0
  483. package/dist/{lab → study}/preflight-result.js +5 -4
  484. package/dist/study/preflight.d.ts +94 -0
  485. package/dist/{lab → study}/preflight.js +12 -12
  486. package/dist/{lab → study}/requirements.d.ts +3 -3
  487. package/dist/{lab → study}/requirements.js +1 -1
  488. package/dist/study/route-inputs.d.ts +28 -0
  489. package/dist/{lab → study}/route-inputs.js +1 -1
  490. package/dist/{lab → study}/routing.d.ts +39 -33
  491. package/dist/{lab → study}/routing.js +60 -29
  492. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
  493. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
  494. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
  495. package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
  496. package/dist/study/run-study-options.d.ts +28 -0
  497. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
  498. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
  499. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  500. package/dist/{lab → study}/summary.d.ts +16 -15
  501. package/dist/{lab → study}/summary.js +21 -21
  502. package/dist/{lab → study}/tasks.d.ts +18 -18
  503. package/dist/{lab → study}/tasks.js +14 -14
  504. package/dist/{lab → study}/types.d.ts +202 -196
  505. package/dist/{lab → study}/types.js +3 -1
  506. package/dist/{lab → study}/validation.d.ts +27 -27
  507. package/dist/{lab → study}/validation.js +53 -51
  508. package/dist/study/warnings.d.ts +12 -0
  509. package/dist/{lab → study}/warnings.js +62 -34
  510. package/dist/subject/clone.d.ts +7 -7
  511. package/dist/subject/clone.js +2 -2
  512. package/dist/subject/desktop-cli.d.ts +1 -1
  513. package/dist/subject/desktop-cli.js +2 -2
  514. package/dist/subject/local-tree-archive.d.ts +2 -2
  515. package/dist/subject/local-tree-archive.js +4 -4
  516. package/dist/subject/local-tree.d.ts +4 -4
  517. package/dist/subject/node-bootstrap.js +1 -1
  518. package/dist/subject/runtime.js +9 -10
  519. package/dist/subject/serve.d.ts +5 -5
  520. package/dist/subject/serve.js +3 -3
  521. package/dist/subject/state.d.ts +4 -4
  522. package/dist/subject/state.js +1 -1
  523. package/dist/subject/steps.d.ts +6 -6
  524. package/dist/subject/steps.js +5 -5
  525. package/dist/substrates/command-failure.d.ts +3 -3
  526. package/dist/substrates/command-failure.js +3 -3
  527. package/dist/substrates/desktop-session.js +2 -2
  528. package/dist/substrates/detached.d.ts +6 -6
  529. package/dist/substrates/detached.js +7 -7
  530. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  531. package/dist/substrates/e2b/cdp-probe.js +14 -17
  532. package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
  533. package/dist/substrates/e2b/desktop-browser.js +9 -9
  534. package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
  535. package/dist/substrates/e2b/desktop-cdp.js +9 -9
  536. package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
  537. package/dist/substrates/e2b/desktop-executor.js +13 -13
  538. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  539. package/dist/substrates/e2b/desktop-geometry.js +8 -8
  540. package/dist/substrates/e2b/desktop-media.d.ts +4 -4
  541. package/dist/substrates/e2b/desktop-media.js +1 -1
  542. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  543. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  544. package/dist/substrates/e2b/lifetime.js +1 -1
  545. package/dist/substrates/e2b/sandbox.d.ts +4 -4
  546. package/dist/substrates/e2b/sandbox.js +2 -2
  547. package/dist/substrates/e2b/sdk.d.ts +12 -12
  548. package/dist/substrates/e2b/sdk.js +7 -7
  549. package/dist/substrates/local/runtime-config.d.ts +4 -4
  550. package/dist/substrates/local/runtime-config.js +4 -4
  551. package/dist/tui/actions.d.ts +1 -1
  552. package/dist/tui/actions.js +13 -13
  553. package/dist/tui/contract.d.ts +23 -23
  554. package/dist/tui/contract.js +11 -11
  555. package/dist/tui/launch.d.ts +7 -7
  556. package/dist/tui/launch.js +36 -31
  557. package/dist/tui/project.js +5 -5
  558. package/dist/tui-app.js +139 -139
  559. package/dist/verify/actor.d.ts +8 -8
  560. package/dist/verify/actor.js +36 -36
  561. package/dist/verify/artifacts.d.ts +2 -2
  562. package/dist/verify/artifacts.js +3 -3
  563. package/dist/verify/context-growth.d.ts +9 -0
  564. package/dist/verify/context-growth.js +62 -0
  565. package/dist/verify/costs.d.ts +6 -6
  566. package/dist/verify/costs.js +8 -8
  567. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  568. package/dist/verify/shared-world-concurrent.js +79 -76
  569. package/dist/verify/shared-world.d.ts +2 -2
  570. package/dist/verify/shared-world.js +16 -16
  571. package/dist/verify/subject.d.ts +5 -5
  572. package/dist/verify/subject.js +19 -19
  573. package/dist/verify/verify.js +94 -44
  574. package/docs/README.md +25 -32
  575. package/docs/architecture/actor-contract.md +60 -91
  576. package/docs/architecture/browser-control.md +1 -1
  577. package/docs/architecture/desktop-sessions.md +7 -7
  578. package/docs/architecture/external-public-shared-world.md +68 -65
  579. package/docs/architecture/github-feedback-loop.md +2 -5
  580. package/docs/architecture/guest-desktop.md +2 -2
  581. package/docs/architecture/observer.md +34 -34
  582. package/docs/architecture/restricted-codex-analysis.md +34 -28
  583. package/docs/architecture/serve.md +34 -37
  584. package/docs/architecture/state-driven-executor.md +55 -58
  585. package/docs/architecture/task-protocol-support.md +6 -6
  586. package/docs/architecture/terminal-product-route.md +70 -110
  587. package/docs/contracts/README.md +24 -0
  588. package/docs/contracts/adapter-admission.md +3 -3
  589. package/docs/contracts/adapter-fixtures.md +4 -7
  590. package/docs/contracts/core.md +1 -3
  591. package/docs/contracts/errors.md +62 -0
  592. package/docs/contracts/feedback.md +8 -9
  593. package/docs/contracts/policy.md +7 -12
  594. package/docs/contracts/run-bundle.md +42 -44
  595. package/docs/contracts/schemas.md +446 -368
  596. package/docs/contracts/study-analysis.md +7 -4
  597. package/docs/contracts/study-costs.md +28 -9
  598. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  599. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  600. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  601. package/docs/principles/actor-fidelity.md +4 -4
  602. package/docs/principles/engineering.md +3 -3
  603. package/docs/principles/invariants-and-defaults.md +38 -38
  604. package/docs/principles/self-driving-harness.md +1 -5
  605. package/docs/principles/three-roles.md +1 -1
  606. package/docs/product/automatic-analysis.md +7 -7
  607. package/examples/README.md +1 -1
  608. package/examples/participant/README.md +5 -5
  609. package/examples/participant/run.mjs +11 -10
  610. package/examples/scorer/README.md +3 -3
  611. package/examples/scorer/run.mjs +11 -12
  612. package/examples/scorer/scorer.mjs +3 -3
  613. package/package.json +16 -17
  614. package/skills/humanish/SKILL.md +64 -60
  615. package/skills/humanish/agents/openai.yaml +1 -1
  616. package/AGENTS.md +0 -99
  617. package/CONTRIBUTING.md +0 -148
  618. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  619. package/dist/actors/codex/qualified-versions.js +0 -132
  620. package/dist/cli/commands/lab-format.d.ts +0 -8
  621. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  622. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  623. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  624. package/dist/cli/commands/lab-run.d.ts +0 -9
  625. package/dist/cli/commands/lab.d.ts +0 -3
  626. package/dist/cli/commands/lab.js +0 -199
  627. package/dist/cli/renamed-options.d.ts +0 -11
  628. package/dist/cli/renamed-options.js +0 -18
  629. package/dist/lab/composition-rules.d.ts +0 -7
  630. package/dist/lab/config.d.ts +0 -7
  631. package/dist/lab/discover.d.ts +0 -65
  632. package/dist/lab/init-templates.js +0 -416
  633. package/dist/lab/keys.d.ts +0 -2
  634. package/dist/lab/parse/comms.d.ts +0 -12
  635. package/dist/lab/parse/execution.d.ts +0 -19
  636. package/dist/lab/parse/subject-state.d.ts +0 -30
  637. package/dist/lab/plan.d.ts +0 -19
  638. package/dist/lab/plan.js +0 -132
  639. package/dist/lab/preflight-probes.d.ts +0 -3
  640. package/dist/lab/preflight-result.d.ts +0 -7
  641. package/dist/lab/preflight.d.ts +0 -92
  642. package/dist/lab/route-inputs.d.ts +0 -28
  643. package/dist/lab/run-lab-options.d.ts +0 -28
  644. package/dist/lab/warnings.d.ts +0 -2
  645. package/dist/observer/static.d.ts +0 -39
  646. package/dist/observer/static.js +0 -369
  647. package/dist/run-lab.d.ts +0 -112
  648. package/docs/architecture/comms-inbox.md +0 -122
  649. package/docs/architecture/desktop-recording.md +0 -80
  650. package/docs/architecture/local-browser-runtime.md +0 -178
  651. package/docs/architecture/observer-review.md +0 -144
  652. package/docs/architecture/participant-media.md +0 -90
  653. package/docs/architecture/project-layout.md +0 -62
  654. package/docs/architecture/real-email-receiving.md +0 -136
  655. package/docs/assets/humanish-drawdb-hero.png +0 -0
  656. package/docs/assets/humanish-observer-hero.png +0 -0
  657. package/docs/goals/current.md +0 -207
  658. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  659. package/docs/product/open-source-install-experience.md +0 -240
  660. package/docs/ramp/README.md +0 -295
  661. package/docs/release/open-source-readiness.md +0 -222
  662. package/docs/release/public-readiness-standard.md +0 -210
  663. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  664. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  665. /package/dist/{lab → study}/init-paths.js +0 -0
  666. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  667. /package/dist/{lab → study}/init-plan.js +0 -0
  668. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  669. /package/dist/{lab → study}/participant-assignment.js +0 -0
  670. /package/dist/{lab → study}/persona.d.ts +0 -0
  671. /package/dist/{lab → study}/persona.js +0 -0
@@ -1,4 +1,4 @@
1
- import type { LabPlan, Requirement } from "./plan-types.js";
1
+ import type { StudyPlan, Requirement } from "./plan-types.js";
2
2
  /** The `key` requirements whose value `env` lacks, OPENAI_API_KEY before E2B_API_KEY. */
3
3
  export declare function missingKeys(requirements: readonly Requirement[], env: Record<string, string | undefined>): string[];
4
4
  /** The subject env names the requirements list and `env` lacks, in declaration order. */
@@ -13,8 +13,8 @@ export declare function requiredSubjectEnv(requirements: readonly Requirement[])
13
13
  /**
14
14
  * The provider keys a live run of `plan` is known to read: its `key` and `key-one-of` names, its
15
15
  * subject env, the external catch's token variable, ANTHROPIC_API_KEY for a Claude Code
16
- * participant, and OPENAI_API_KEY when automatic analysis runs on OpenAI. `lab run` prints a
16
+ * participant, and OPENAI_API_KEY when automatic analysis runs on OpenAI. `run` prints a
17
17
  * key-source line for these only. Discovery still fills every key it finds: other readers, such as
18
18
  * a declared scorer's host code, are not in the plan.
19
19
  */
20
- export declare function keyNamesOf(plan: LabPlan): ReadonlySet<string>;
20
+ export declare function keyNamesOf(plan: StudyPlan): ReadonlySet<string>;
@@ -30,7 +30,7 @@ export function requiredSubjectEnv(requirements) {
30
30
  /**
31
31
  * The provider keys a live run of `plan` is known to read: its `key` and `key-one-of` names, its
32
32
  * subject env, the external catch's token variable, ANTHROPIC_API_KEY for a Claude Code
33
- * participant, and OPENAI_API_KEY when automatic analysis runs on OpenAI. `lab run` prints a
33
+ * participant, and OPENAI_API_KEY when automatic analysis runs on OpenAI. `run` prints a
34
34
  * key-source line for these only. Discovery still fills every key it finds: other readers, such as
35
35
  * a declared scorer's host code, are not in the plan.
36
36
  */
@@ -0,0 +1,28 @@
1
+ import type { InternalRunStudyOptions } from "../run-study.js";
2
+ import type { RunScorerProvenance } from "../run/bundle.js";
3
+ import { type AdapterScorerModule } from "./adapter-scorer-loader.js";
4
+ import type { StudyDeps } from "./study-deps.js";
5
+ import type { StudyEvent } from "./run-study-events.js";
6
+ import type { ComputerUseRunInput } from "../routes/computer-use/types.js";
7
+ import type { ScriptedRunInput } from "../routes/scripted/types.js";
8
+ import type { SharedWorldRunInput } from "../routes/shared-world/types.js";
9
+ import type { TerminalRunInput } from "../routes/terminal/types.js";
10
+ export declare function computerUseInput(options: InternalRunStudyOptions, deps: StudyDeps, emit: StudyEmit | undefined): ComputerUseRunInput;
11
+ export declare function scriptedInput(options: InternalRunStudyOptions, deps: StudyDeps, emit: StudyEmit | undefined): ScriptedRunInput;
12
+ export declare function terminalInput(options: InternalRunStudyOptions, deps: StudyDeps, emit: StudyEmit | undefined): TerminalRunInput;
13
+ export declare function sharedWorldInput(options: InternalRunStudyOptions, deps: StudyDeps, emit: StudyEmit | undefined): SharedWorldRunInput;
14
+ /** A scorer the CLI loads after the route's local checks, and the provenance it stamps on the run. */
15
+ export type LateScorer = Pick<InternalRunStudyOptions, "scorer" | "scorerProvenance">;
16
+ /** Narrows RunStudyOptions.scorer to the context the route passes (adapter-scorer-loader.ts). */
17
+ type NarrowScorer<S> = (scorer: AdapterScorerModule) => S;
18
+ /**
19
+ * A route's input with a scorer loaded after admission, and the scorer's provenance, as if the
20
+ * caller had passed them up front. The rest of the input is the one the route's checks admitted.
21
+ */
22
+ export declare function withLateScorer<S, I extends {
23
+ scorer?: S;
24
+ scorerProvenance?: RunScorerProvenance;
25
+ }>(input: I, late: LateScorer | undefined, narrow: NarrowScorer<S>): I;
26
+ /** Reports a StudyEvent to onEvent without waiting (normalizeRunStudyOptions builds it). */
27
+ type StudyEmit = (event: StudyEvent) => void;
28
+ export {};
@@ -1,4 +1,4 @@
1
- // What each route's run takes from runLab's options: the shared run settings, the typed options
1
+ // What each route's run takes from runStudyWith's options: the shared run settings, the typed options
2
2
  // the route reads, the event emitter, the test seams and the declared scorer's provenance.
3
3
  import { browserRouteScorer, terminalRouteScorer, } from "./adapter-scorer-loader.js";
4
4
  export function computerUseInput(options, deps, emit) {
@@ -1,10 +1,10 @@
1
- import type { LabConfig } from "./types.js";
2
- export declare const MAX_CUA_LANES = 16;
1
+ import type { StudyConfig } from "./types.js";
2
+ export declare const MAX_COMPUTER_USE_PARTICIPANTS = 16;
3
3
  export declare function actorResolvesToComputerUse(type: string | undefined): boolean;
4
4
  export declare function registeredComputerUseActors(): string[];
5
5
  export declare function actorResolvesToScriptedBrowser(type: string | undefined): boolean;
6
6
  export declare function registeredScriptedBrowserActors(): string[];
7
- /** True when `type` resolves to a registered terminal actor (the "terminal" lane). Exported so
7
+ /** True when `type` resolves to a registered terminal actor (the "terminal" run kind). Exported so
8
8
  * the engine + tests can resolve the dispatch the same way the parser does. */
9
9
  export declare function actorResolvesToTerminal(type: string | undefined): boolean;
10
10
  export declare function registeredTerminalActors(): string[];
@@ -13,64 +13,70 @@ export declare function registeredTerminalActors(): string[];
13
13
  * a homogeneous `count`, else 1. The single source of truth shared by the parser, the engine,
14
14
  * and the pre-flight plan so the participant count is computed the same way everywhere.
15
15
  */
16
- export declare function cuaLaneCount(config: LabConfig): number;
16
+ export declare function computerUseParticipantCount(config: StudyConfig): number;
17
17
  /**
18
18
  * A participant's id: its declared roster id, else `lane-NN` (independent participants) or `role-NN`
19
- * (shared-world seats) from its 0-based position. The parser's filled email recipients and the
20
- * routes that name participants both call this, so a filled recipient names a participant that
19
+ * (shared-world participants) from its 0-based position. The parser's filled email recipients and
20
+ * the routes that name participants both call this, so a filled recipient names a participant that
21
21
  * runs.
22
22
  */
23
23
  export declare function participantIdAt(index: number, declared: string | undefined, kind: "lane" | "seat"): string;
24
24
  /**
25
- * True when this config routes to the computer-use backend: an app-url subject whose first
26
- * actor resolves to a registered computer-use actor, or a clone subject on a hosted desktop
27
- * whose first actor does. Single source of truth — routeOf and the warning logic
28
- * both use it. (The app-url branch used to be unconditionally true; it narrowed when the
29
- * scripted-browser route arrived. Behavior-preserving for every parse-valid config —
30
- * routeOf keeps a bare app-url fallback to the cua backend so library-API configs
31
- * with unknown actors still hit its fail-closed ACTOR_UNSUPPORTED.)
25
+ * True when this config routes to the computer-use backend: an app-url subject whose first actor
26
+ * resolves to a registered computer-use actor, or a clone subject on a hosted desktop whose first
27
+ * actor does. Single source of truth: routeOf and the warning logic both use it. (The app-url
28
+ * branch also checks the first actor, so a scripted-browser actor routes elsewhere. routeOf keeps a
29
+ * bare app-url fallback to the computer-use route so library-API configs with unknown actors still
30
+ * hit its fail-closed ACTOR_UNSUPPORTED.)
32
31
  */
33
- export declare function isComputerUseComposition(config: LabConfig): boolean;
32
+ export declare function isComputerUseComposition(config: StudyConfig): boolean;
34
33
  /**
35
- * True when this config routes to the SHARED-WORLD backend (#164): a clone or local-tree subject
34
+ * True when this config routes to the shared-world route: a clone or local-tree subject
36
35
  * on a hosted desktop whose first actor resolves to a computer-use actor and that declares the
37
36
  * `shared-world` topology. Mirror of isComputerUseComposition; the single source of truth shared by
38
- * routeOf (which checks it before the cua route) and the warning logic. Every
37
+ * routeOf (which checks it before the computer-use route) and the warning logic. Every
39
38
  * shared-world study runs its participants at once (`execution.concurrency` >= 2). The same
40
39
  * clone/local-tree × e2b-desktop × computer-use composition without `topology: shared-world` stays per-lane-worlds
41
- * (the cua route) — the topology declaration is the override switch.
40
+ * (the computer-use route); the topology declaration is the override switch.
42
41
  */
43
- export declare function isSharedWorldComposition(config: LabConfig): boolean;
42
+ export declare function isSharedWorldComposition(config: StudyConfig): boolean;
44
43
  /** The getHost provisioned-subject shared-world shape (clone/local-tree served + exposed in-sandbox). */
45
- export declare function isProvisionedSharedWorldComposition(config: LabConfig): boolean;
44
+ export declare function isProvisionedSharedWorldComposition(config: StudyConfig): boolean;
46
45
  /**
47
- * The external-public shared-world shape (#164 phase 2): a real public deployment used directly as
48
- * the shared plane — `source: app-url` + `topology: shared-world` + a computer-use actor on
46
+ * The external-public shared-world shape: a real public deployment used directly as
47
+ * the shared plane: `source: app-url` + `topology: shared-world` + a computer-use actor on
49
48
  * e2b-desktop + `policies.allowPublicTargets: true`. No getHost, no clone, no subject sandbox, no
50
49
  * seed. The operator-ownership attestation `subject.publicTarget` is required (validated in
51
- * externalPublicSharedWorldValidationReason, not here — this predicate is the router only, so a
50
+ * externalPublicSharedWorldValidationReason, not here; this predicate is the router only, so a
52
51
  * half-declared external-public config still routes here to get its precise fail-closed reason
53
- * rather than silently downgrading to the per-participant cua route).
52
+ * rather than silently downgrading to the per-participant computer-use route).
54
53
  */
55
- export declare function isExternalPublicSharedWorldComposition(config: LabConfig): boolean;
54
+ export declare function isExternalPublicSharedWorldComposition(config: StudyConfig): boolean;
56
55
  /**
57
- * Resolve a shared-world seat's entry URL from `serve.url` + a role's `entry` (relative path or
58
- * same-origin absolute URL). Returns null when the combination is not a same-origin loopback URL
59
- * (the load-bearing public-safety boundary — a seat only ever drives the in-sandbox app).
56
+ * Resolve a shared-world participant's entry URL from `serve.url` and its roster entry's `entry`
57
+ * (a relative path or a same-origin absolute URL). Returns null when the result is not a
58
+ * same-origin loopback URL, so a participant only ever drives the in-sandbox app.
60
59
  */
61
- export declare function resolveSeatUrl(serveUrl: string, entry: string | undefined): string | null;
60
+ export declare function resolveEntryUrl(serveUrl: string, entry: string | undefined): string | null;
62
61
  /**
63
62
  * True when this config routes to the scripted-browser backend: an app-url subject whose
64
63
  * first actor resolves to a registered scripted-browser actor (execution.target local or
65
- * absent — the parse layer enforces that pairing). Mirror of isComputerUseComposition; the single
64
+ * absent; the parse layer enforces that pairing). Mirror of isComputerUseComposition; the single
66
65
  * source of truth for routeOf and the warning logic.
67
66
  */
68
- export declare function isScriptedBrowserComposition(config: LabConfig): boolean;
69
- export declare function isProvisionedScriptedBrowserComposition(config: LabConfig): boolean;
67
+ export declare function isScriptedBrowserComposition(config: StudyConfig): boolean;
68
+ export declare function isProvisionedScriptedBrowserComposition(config: StudyConfig): boolean;
70
69
  /**
71
70
  * True when this config routes to the terminal-product backend: a terminal-product subject whose
72
- * first actor resolves to a registered terminal actor (execution.target e2b-terminal or absent —
71
+ * first actor resolves to a registered terminal actor (execution.target e2b-terminal or absent;
73
72
  * the parse layer enforces that pairing). Mirror of isComputerUseComposition/isScriptedBrowserComposition;
74
73
  * the single source of truth for routeOf and the warning logic.
75
74
  */
76
- export declare function isTerminalProductComposition(config: LabConfig): boolean;
75
+ export declare function isTerminalProductComposition(config: StudyConfig): boolean;
76
+ /** The five execution paths a study can take. */
77
+ export type StudyRoute = "preview" | "computer-use" | "shared-world" | "terminal" | "scripted";
78
+ /**
79
+ * The route a config takes. It never refuses: a config no route can run still gets the route
80
+ * whose own checks refuse it with the most precise reason.
81
+ */
82
+ export declare function routeOf(config: StudyConfig): StudyRoute;
@@ -1,8 +1,8 @@
1
1
  import { actorRegistry } from "../actors/registry.js";
2
2
  import { isLoopbackUrl } from "./parse/subject.js";
3
- // Hard cap on fan-out participants (per the ratified design). No HUMANISH_MAX_LANES escape above this
4
- // until a reference panel demands it — N concurrent paid desktops is real money.
5
- export const MAX_CUA_LANES = 16;
3
+ // Hard cap on computer-use participants. No setting raises it: each participant is a paid desktop,
4
+ // and they all run at once.
5
+ export const MAX_COMPUTER_USE_PARTICIPANTS = 16;
6
6
  // Run kinds whose evidence is the participant's screenshots. An actor that declares it produces none
7
7
  // cannot run on them: a code-only actor would claim a GUI flow it only reached through a shell.
8
8
  const SCREENSHOT_RUN_KINDS = new Set([
@@ -36,7 +36,7 @@ export function actorResolvesToScriptedBrowser(type) {
36
36
  export function registeredScriptedBrowserActors() {
37
37
  return registeredActorsOn("scripted-browser");
38
38
  }
39
- /** True when `type` resolves to a registered terminal actor (the "terminal" lane). Exported so
39
+ /** True when `type` resolves to a registered terminal actor (the "terminal" run kind). Exported so
40
40
  * the engine + tests can resolve the dispatch the same way the parser does. */
41
41
  export function actorResolvesToTerminal(type) {
42
42
  return actorResolvesTo(type, "terminal");
@@ -49,7 +49,7 @@ export function registeredTerminalActors() {
49
49
  * a homogeneous `count`, else 1. The single source of truth shared by the parser, the engine,
50
50
  * and the pre-flight plan so the participant count is computed the same way everywhere.
51
51
  */
52
- export function cuaLaneCount(config) {
52
+ export function computerUseParticipantCount(config) {
53
53
  const actor = config.actors[0];
54
54
  if (actor?.lanes !== undefined) {
55
55
  return actor.lanes.length;
@@ -58,29 +58,28 @@ export function cuaLaneCount(config) {
58
58
  }
59
59
  /**
60
60
  * A participant's id: its declared roster id, else `lane-NN` (independent participants) or `role-NN`
61
- * (shared-world seats) from its 0-based position. The parser's filled email recipients and the
62
- * routes that name participants both call this, so a filled recipient names a participant that
61
+ * (shared-world participants) from its 0-based position. The parser's filled email recipients and
62
+ * the routes that name participants both call this, so a filled recipient names a participant that
63
63
  * runs.
64
64
  */
65
65
  export function participantIdAt(index, declared, kind) {
66
66
  return declared ?? `${kind === "seat" ? "role" : "lane"}-${String(index + 1).padStart(2, "0")}`;
67
67
  }
68
68
  /**
69
- * True when this config routes to the computer-use backend: an app-url subject whose first
70
- * actor resolves to a registered computer-use actor, or a clone subject on a hosted desktop
71
- * whose first actor does. Single source of truth — routeOf and the warning logic
72
- * both use it. (The app-url branch used to be unconditionally true; it narrowed when the
73
- * scripted-browser route arrived. Behavior-preserving for every parse-valid config —
74
- * routeOf keeps a bare app-url fallback to the cua backend so library-API configs
75
- * with unknown actors still hit its fail-closed ACTOR_UNSUPPORTED.)
69
+ * True when this config routes to the computer-use backend: an app-url subject whose first actor
70
+ * resolves to a registered computer-use actor, or a clone subject on a hosted desktop whose first
71
+ * actor does. Single source of truth: routeOf and the warning logic both use it. (The app-url
72
+ * branch also checks the first actor, so a scripted-browser actor routes elsewhere. routeOf keeps a
73
+ * bare app-url fallback to the computer-use route so library-API configs with unknown actors still
74
+ * hit its fail-closed ACTOR_UNSUPPORTED.)
76
75
  */
77
76
  export function isComputerUseComposition(config) {
78
77
  // local-app drives the cua loop in-process (a custom executor + a non-vision provider), so it
79
- // routes to the cua backend exactly like an app-url subject with a computer-use actor.
78
+ // routes to the computer-use route exactly like an app-url subject with a computer-use actor.
80
79
  if (config.subject.source === "app-url" || config.subject.source === "local-app") {
81
80
  return actorResolvesToComputerUse(config.actors[0]?.type);
82
81
  }
83
- // desktop-cli hands the participant a terminal instead of a served page (#495), but it is the
82
+ // desktop-cli hands the participant a terminal instead of a served page, but it is the
84
83
  // same route: same desktop, same actor, same prompt fields. Leaving it out of this predicate told
85
84
  // adopters their mission and persona were inert on the one route whose whole point is that a
86
85
  // person reads a screen.
@@ -95,13 +94,13 @@ export function isComputerUseComposition(config) {
95
94
  actorResolvesToComputerUse(config.actors[0]?.type));
96
95
  }
97
96
  /**
98
- * True when this config routes to the SHARED-WORLD backend (#164): a clone or local-tree subject
97
+ * True when this config routes to the shared-world route: a clone or local-tree subject
99
98
  * on a hosted desktop whose first actor resolves to a computer-use actor and that declares the
100
99
  * `shared-world` topology. Mirror of isComputerUseComposition; the single source of truth shared by
101
- * routeOf (which checks it before the cua route) and the warning logic. Every
100
+ * routeOf (which checks it before the computer-use route) and the warning logic. Every
102
101
  * shared-world study runs its participants at once (`execution.concurrency` >= 2). The same
103
102
  * clone/local-tree × e2b-desktop × computer-use composition without `topology: shared-world` stays per-lane-worlds
104
- * (the cua route) — the topology declaration is the override switch.
103
+ * (the computer-use route); the topology declaration is the override switch.
105
104
  */
106
105
  export function isSharedWorldComposition(config) {
107
106
  return (isProvisionedSharedWorldComposition(config) || isExternalPublicSharedWorldComposition(config));
@@ -114,13 +113,13 @@ export function isProvisionedSharedWorldComposition(config) {
114
113
  actorResolvesToComputerUse(config.actors[0]?.type));
115
114
  }
116
115
  /**
117
- * The external-public shared-world shape (#164 phase 2): a real public deployment used directly as
118
- * the shared plane — `source: app-url` + `topology: shared-world` + a computer-use actor on
116
+ * The external-public shared-world shape: a real public deployment used directly as
117
+ * the shared plane: `source: app-url` + `topology: shared-world` + a computer-use actor on
119
118
  * e2b-desktop + `policies.allowPublicTargets: true`. No getHost, no clone, no subject sandbox, no
120
119
  * seed. The operator-ownership attestation `subject.publicTarget` is required (validated in
121
- * externalPublicSharedWorldValidationReason, not here — this predicate is the router only, so a
120
+ * externalPublicSharedWorldValidationReason, not here; this predicate is the router only, so a
122
121
  * half-declared external-public config still routes here to get its precise fail-closed reason
123
- * rather than silently downgrading to the per-participant cua route).
122
+ * rather than silently downgrading to the per-participant computer-use route).
124
123
  */
125
124
  export function isExternalPublicSharedWorldComposition(config) {
126
125
  return (config.subject.source === "app-url" &&
@@ -130,11 +129,11 @@ export function isExternalPublicSharedWorldComposition(config) {
130
129
  config.policies?.allowPublicTargets === true);
131
130
  }
132
131
  /**
133
- * Resolve a shared-world seat's entry URL from `serve.url` + a role's `entry` (relative path or
134
- * same-origin absolute URL). Returns null when the combination is not a same-origin loopback URL
135
- * (the load-bearing public-safety boundary — a seat only ever drives the in-sandbox app).
132
+ * Resolve a shared-world participant's entry URL from `serve.url` and its roster entry's `entry`
133
+ * (a relative path or a same-origin absolute URL). Returns null when the result is not a
134
+ * same-origin loopback URL, so a participant only ever drives the in-sandbox app.
136
135
  */
137
- export function resolveSeatUrl(serveUrl, entry) {
136
+ export function resolveEntryUrl(serveUrl, entry) {
138
137
  if (entry === undefined || entry === "") {
139
138
  return isLoopbackUrl(serveUrl) ? serveUrl : null;
140
139
  }
@@ -156,7 +155,7 @@ export function resolveSeatUrl(serveUrl, entry) {
156
155
  /**
157
156
  * True when this config routes to the scripted-browser backend: an app-url subject whose
158
157
  * first actor resolves to a registered scripted-browser actor (execution.target local or
159
- * absent — the parse layer enforces that pairing). Mirror of isComputerUseComposition; the single
158
+ * absent; the parse layer enforces that pairing). Mirror of isComputerUseComposition; the single
160
159
  * source of truth for routeOf and the warning logic.
161
160
  */
162
161
  export function isScriptedBrowserComposition(config) {
@@ -172,10 +171,42 @@ export function isProvisionedScriptedBrowserComposition(config) {
172
171
  }
173
172
  /**
174
173
  * True when this config routes to the terminal-product backend: a terminal-product subject whose
175
- * first actor resolves to a registered terminal actor (execution.target e2b-terminal or absent —
174
+ * first actor resolves to a registered terminal actor (execution.target e2b-terminal or absent;
176
175
  * the parse layer enforces that pairing). Mirror of isComputerUseComposition/isScriptedBrowserComposition;
177
176
  * the single source of truth for routeOf and the warning logic.
178
177
  */
179
178
  export function isTerminalProductComposition(config) {
180
179
  return (config.subject.source === "terminal-product" && actorResolvesToTerminal(config.actors[0]?.type));
181
180
  }
181
+ /**
182
+ * The route a config takes. It never refuses: a config no route can run still gets the route
183
+ * whose own checks refuse it with the most precise reason.
184
+ */
185
+ export function routeOf(config) {
186
+ const source = config.subject.source;
187
+ // A scripted-browser actor on a loopback app or a provisioned clone replays committed steps.
188
+ if (isScriptedBrowserComposition(config))
189
+ return "scripted";
190
+ // A terminal-product subject goes to the terminal route even with an unregistered actor, so that
191
+ // route refuses the actor instead of another route running something else.
192
+ if (isTerminalProductComposition(config) || source === "terminal-product")
193
+ return "terminal";
194
+ // Checked before computer use: the same composition without the topology declaration runs
195
+ // independent participants.
196
+ if (isSharedWorldComposition(config))
197
+ return "shared-world";
198
+ // A CLI studied at a desktop is a computer-use study whose subject is a terminal window.
199
+ if (source === "desktop-cli")
200
+ return "computer-use";
201
+ // Every other app-url, clone, local-app or local-tree config goes to computer use, including
202
+ // ones with an unknown actor: that route refuses the actor, where the preview route would run
203
+ // no participant at all.
204
+ if (isComputerUseComposition(config) ||
205
+ source === "app-url" ||
206
+ source === "clone" ||
207
+ source === "local-app" ||
208
+ source === "local-tree")
209
+ return "computer-use";
210
+ // this-repo runs the synthetic preview.
211
+ return "preview";
212
+ }
@@ -1,9 +1,8 @@
1
1
  import type { CuaParticipantPlan } from "../routes/computer-use/types.js";
2
- import type { PhaseParticipant } from "./lab-deps.js";
3
2
  import type { SubjectPhaseEvent } from "../subject/steps.js";
4
- import type { InternalRunLabOptions } from "../run-lab.js";
5
- import type { LabRoute } from "./plan.js";
6
- import type { LabConfig } from "./types.js";
3
+ import type { InternalRunStudyOptions } from "../run-study.js";
4
+ import type { StudyRoute } from "./plan.js";
5
+ import type { StudyConfig } from "./types.js";
7
6
  /** One participant, as the options' callbacks see it. */
8
7
  export interface ParticipantRef {
9
8
  readonly id: string;
@@ -20,12 +19,12 @@ export type SetupTarget = {
20
19
  };
21
20
  /**
22
21
  * What a run reports while it runs. `plan` comes from computer use only; the other routes run from
23
- * the lab plan but do not emit it. `subject-phase` comes from computer use (participant target)
22
+ * the study plan but do not emit it. `subject-phase` comes from computer use (participant target)
24
23
  * and shared world (subject target).
25
24
  */
26
- export type LabEvent = {
25
+ export type StudyEvent = {
27
26
  type: "plan";
28
- route: LabRoute;
27
+ route: StudyRoute;
29
28
  participants: readonly {
30
29
  id: string;
31
30
  persona: string;
@@ -51,14 +50,12 @@ export type LabEvent = {
51
50
  * analysis API key. A callback can hold any of them, and its warning is appended after the route
52
51
  * sanitized its own.
53
52
  */
54
- export declare function knownSecretValues(config: LabConfig, options: InternalRunLabOptions, forwardedEnv: Readonly<Record<string, string | undefined>> | undefined): string[];
53
+ export declare function knownSecretValues(config: StudyConfig, options: InternalRunStudyOptions, forwardedEnv: Readonly<Record<string, string | undefined>> | undefined): string[];
55
54
  /**
56
55
  * The emitter the route hook bags call, or undefined without onEvent. It calls onEvent and never
57
56
  * waits for it: a throw or a rejected promise becomes a run warning, scrubbed of `secretValues`.
58
57
  */
59
- export declare function labEventEmitter(onEvent: ((event: LabEvent) => void | Promise<void>) | undefined, warnings: string[], secretValues: () => string[]): ((event: LabEvent) => void) | undefined;
58
+ export declare function studyEventEmitter(onEvent: ((event: StudyEvent) => void | Promise<void>) | undefined, warnings: string[], secretValues: () => string[]): ((event: StudyEvent) => void) | undefined;
60
59
  /** The computer-use participant plan as a `plan` event: ids, personas, devices and digests. */
61
- export declare function planEvent(plan: CuaParticipantPlan): LabEvent;
62
- /** A participant as the route reports a phase for it, renamed to the event's field names. */
63
- export declare const participantOf: (participant: PhaseParticipant) => ParticipantRef;
64
- export declare function phaseEvent(event: SubjectPhaseEvent, target: SetupTarget): LabEvent;
60
+ export declare function planEvent(plan: CuaParticipantPlan): StudyEvent;
61
+ export declare function phaseEvent(event: SubjectPhaseEvent, target: SetupTarget): StudyEvent;
@@ -1,5 +1,5 @@
1
- // What a run reports through RunLabOptions.onEvent, and how a callback failure becomes a run
2
- // warning. normalizeRunLabOptions (run-lab-options.ts) builds the emitter and hands it to the
1
+ // What a run reports through RunStudyOptions.onEvent, and how a callback failure becomes a run
2
+ // warning. normalizeRunStudyOptions (run-study-options.ts) builds the emitter and hands it to the
3
3
  // route hook bags it maps; the event values are built here.
4
4
  import { redactText, scrubLiterals, toErrorMessage } from "../evidence/redaction.js";
5
5
  /**
@@ -26,7 +26,7 @@ export function knownSecretValues(config, options, forwardedEnv) {
26
26
  * The emitter the route hook bags call, or undefined without onEvent. It calls onEvent and never
27
27
  * waits for it: a throw or a rejected promise becomes a run warning, scrubbed of `secretValues`.
28
28
  */
29
- export function labEventEmitter(onEvent, warnings, secretValues) {
29
+ export function studyEventEmitter(onEvent, warnings, secretValues) {
30
30
  if (onEvent === undefined)
31
31
  return undefined;
32
32
  return (event) => {
@@ -68,12 +68,6 @@ export function planEvent(plan) {
68
68
  })),
69
69
  };
70
70
  }
71
- /** A participant as the route reports a phase for it, renamed to the event's field names. */
72
- export const participantOf = (participant) => ({
73
- id: participant.laneId,
74
- index: participant.laneIndex,
75
- count: participant.laneCount,
76
- });
77
71
  export function phaseEvent(event, target) {
78
72
  return {
79
73
  type: "subject-phase",
@@ -1,11 +1,11 @@
1
1
  import type { CuaExecutor, CuaProvider } from "../actors/computer-use/loop.js";
2
2
  import type { E2BDesktopSandbox } from "../substrates/e2b/sdk.js";
3
3
  import type { AdapterScorerModule } from "./adapter-scorer-loader.js";
4
- import type { LabEvent, ParticipantRef, SetupTarget } from "./run-lab-events.js";
5
- import type { LabConfig } from "./types.js";
4
+ import type { StudyEvent, ParticipantRef, SetupTarget } from "./run-study-events.js";
5
+ import type { StudyConfig } from "./types.js";
6
6
  /** What `createProvider` receives for each participant. */
7
7
  export interface ProviderContext {
8
- readonly config: LabConfig;
8
+ readonly config: StudyConfig;
9
9
  readonly participant: ParticipantRef;
10
10
  readonly executor: CuaExecutor;
11
11
  }
@@ -13,27 +13,29 @@ export type ProviderFactory = (ctx: ProviderContext) => Promise<CuaProvider>;
13
13
  /** The caller's executor for an in-process run, built once for the run's single participant. */
14
14
  export interface InProcessDriver {
15
15
  executor: (ctx: {
16
- config: LabConfig;
16
+ config: StudyConfig;
17
17
  appUrl: string;
18
18
  }) => Promise<CuaExecutor>;
19
19
  }
20
- export type StreamEvent =
21
- /** Runtime only: `url` carries an auth key and must never be persisted. */
22
- {
23
- type: "ready";
20
+ interface StreamEventIds {
24
21
  participantId: string;
25
- sandboxId: string;
26
- simId: string;
22
+ /**
23
+ * The id of this participant's entry in run.json `simulations[]` (`sim-001`), which
24
+ * `streams[].simId` also holds.
25
+ */
26
+ recordId: string;
27
27
  streamId: string;
28
+ }
29
+ export type StreamEvent = (StreamEventIds & {
30
+ type: "ready";
31
+ sandboxId: string;
32
+ /** Runtime only: carries an auth key and must never be persisted. */
28
33
  url: string;
29
- } | {
34
+ }) | (StreamEventIds & {
30
35
  type: "ended";
31
- participantId: string;
32
- simId: string;
33
- streamId: string;
34
- };
36
+ });
35
37
  /** The options with a typed home, common to every route. */
36
- export interface RunLabHomes {
38
+ export interface RunStudyHomes {
37
39
  /** Keys and subject env for the run. Defaults to process.env. */
38
40
  env?: Readonly<Record<string, string | undefined>>;
39
41
  /**
@@ -48,17 +50,18 @@ export interface RunLabHomes {
48
50
  * Passive. Never awaited; a throw or a rejected promise becomes a run warning. It observes and
49
51
  * changes no output: subject phases still go to stderr.
50
52
  */
51
- onEvent?: (event: LabEvent) => void | Promise<void>;
53
+ onEvent?: (event: StudyEvent) => void | Promise<void>;
52
54
  /** Awaited after a participant's live stream starts, and again after its sandbox is gone. */
53
55
  onStream?: (event: StreamEvent) => Promise<void> | void;
54
56
  /** Cancels post-run analysis only. */
55
57
  analysisSignal?: AbortSignal;
56
58
  }
57
59
  /** Brain and in-process driving. An in-process executor needs a provider: it returns no frame. */
58
- export type RunLabDriving = {
60
+ export type RunStudyDriving = {
59
61
  inProcess?: undefined;
60
62
  createProvider?: ProviderFactory;
61
63
  } | {
62
64
  inProcess: InProcessDriver;
63
65
  createProvider: ProviderFactory;
64
66
  };
67
+ export {};
@@ -1,3 +1,3 @@
1
- // The public RunLabOptions homes that every route reads: env, scorer, prepareDesktop, onEvent,
1
+ // The public RunStudyOptions homes that every route reads: env, scorer, prepareDesktop, onEvent,
2
2
  // onStream and analysisSignal, and the brain and in-process driving computer use takes.
3
3
  export {};
@@ -0,0 +1,28 @@
1
+ import type { InternalRunStudyOptions, StudyOutcome, RunStudyOptions } from "../run-study.js";
2
+ import { type StudyRoute } from "./plan.js";
3
+ import type { StudyConfig } from "./types.js";
4
+ import { type StudyEvent } from "./run-study-events.js";
5
+ type Refusal = {
6
+ ok: false;
7
+ code: "HUMANISH_STUDY_OPTION_UNSUPPORTED" | "HUMANISH_STUDY_V2_UNSUPPORTED";
8
+ message: string;
9
+ };
10
+ type Normalized = {
11
+ ok: true;
12
+ /** The options the route reads: onEvent removed, env copied. */
13
+ options: InternalRunStudyOptions;
14
+ /** Filled by onEvent failures while the run runs; runStudyWith appends them to the result. */
15
+ warnings: string[];
16
+ /** Calls onEvent and never waits for it, or undefined without onEvent. The routes report through it. */
17
+ emit: ((event: StudyEvent) => void) | undefined;
18
+ };
19
+ /** The refusal for a field a JavaScript caller passed that RunStudyOptions no longer has. */
20
+ export declare function removedOptionRefusal(options: RunStudyOptions): Refusal | undefined;
21
+ /**
22
+ * Refuse what the route cannot honor, copy env, and build the emitter onEvent receives through.
23
+ * Nothing here touches the filesystem, so a refusal leaves no run directory, receipt or sandbox.
24
+ */
25
+ export declare function normalizeRunStudyOptions(config: StudyConfig, route: StudyRoute, options: InternalRunStudyOptions): Normalized | Refusal;
26
+ /** A refusal in the route's own result envelope, before any run exists. */
27
+ export declare function optionRefusalOutcome(config: StudyConfig, route: StudyRoute, options: RunStudyOptions, refusal: Refusal): StudyOutcome;
28
+ export {};