humanish 0.108.0 → 0.109.1

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 (461) hide show
  1. package/ARCHITECTURE.md +58 -59
  2. package/CHANGELOG.md +22 -0
  3. package/CONTEXT.md +44 -44
  4. package/README.md +3 -3
  5. package/TELEMETRY.md +2 -2
  6. package/dist/actors/codex/app-server-trace.js +2 -1
  7. package/dist/actors/codex/restricted-participant.js +12 -12
  8. package/dist/actors/codex/restricted-session.d.ts +2 -2
  9. package/dist/actors/computer-use/actor.d.ts +6 -6
  10. package/dist/actors/computer-use/actor.js +2 -2
  11. package/dist/actors/computer-use/admission-limit.d.ts +2 -2
  12. package/dist/actors/computer-use/admission-limit.js +3 -3
  13. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  14. package/dist/actors/computer-use/executor-error.js +3 -3
  15. package/dist/actors/computer-use/loop/actions.js +5 -5
  16. package/dist/actors/computer-use/loop/debrief.js +2 -2
  17. package/dist/actors/computer-use/loop/ending.d.ts +1 -1
  18. package/dist/actors/computer-use/loop/ending.js +12 -11
  19. package/dist/actors/computer-use/loop/observation.js +6 -5
  20. package/dist/actors/computer-use/loop/provider-call.js +11 -11
  21. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  22. package/dist/actors/computer-use/loop/session.js +2 -2
  23. package/dist/actors/computer-use/loop/trace.js +3 -2
  24. package/dist/actors/computer-use/loop/types.d.ts +24 -24
  25. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  26. package/dist/actors/computer-use/loop.d.ts +6 -1
  27. package/dist/actors/computer-use/loop.js +26 -4
  28. package/dist/actors/computer-use/openai-provider.d.ts +2 -2
  29. package/dist/actors/computer-use/openai-provider.js +8 -8
  30. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  31. package/dist/actors/computer-use/provider-error.js +6 -6
  32. package/dist/actors/contract.d.ts +4 -4
  33. package/dist/actors/contract.js +1 -1
  34. package/dist/actors/local-agent/claude-session.js +3 -3
  35. package/dist/actors/local-agent/cli.d.ts +1 -1
  36. package/dist/actors/local-agent/cli.js +1 -1
  37. package/dist/actors/reasoning-effort.js +3 -3
  38. package/dist/actors/registry.d.ts +2 -2
  39. package/dist/actors/registry.js +3 -3
  40. package/dist/actors/scripted-browser/actor.d.ts +2 -2
  41. package/dist/actors/scripted-browser/actor.js +1 -1
  42. package/dist/analysis/automatic-completion.d.ts +7 -7
  43. package/dist/analysis/automatic-completion.js +1 -1
  44. package/dist/analysis/automatic-config.d.ts +6 -6
  45. package/dist/analysis/automatic-config.js +1 -1
  46. package/dist/analysis/execute.d.ts +1 -1
  47. package/dist/analysis/execute.js +1 -1
  48. package/dist/analysis/types.d.ts +6 -0
  49. package/dist/browser-control/client.js +16 -16
  50. package/dist/browser-control/dispatcher.js +4 -4
  51. package/dist/browser-control/protocol.js +14 -14
  52. package/dist/browser-control/recording-transfer.js +4 -4
  53. package/dist/browser-control/transport.js +7 -7
  54. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  55. package/dist/cli/commands/comms.js +14 -22
  56. package/dist/cli/commands/migrate.js +15 -4
  57. package/dist/cli/commands/observe.d.ts +0 -1
  58. package/dist/cli/commands/observe.js +0 -15
  59. package/dist/cli/commands/run-command.d.ts +2 -2
  60. package/dist/cli/commands/run-command.js +3 -3
  61. package/dist/cli/commands/runs.js +9 -7
  62. package/dist/cli/commands/setup.js +5 -7
  63. package/dist/cli/commands/study-format.d.ts +9 -0
  64. package/dist/cli/commands/{lab-format.js → study-format.js} +5 -5
  65. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  66. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +12 -12
  67. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  68. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  69. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  70. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +3 -3
  71. package/dist/cli/commands/study-route-run.d.ts +19 -0
  72. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  73. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  74. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  75. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  76. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +7 -7
  77. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  78. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  79. package/dist/cli/commands/study-run.d.ts +9 -0
  80. package/dist/cli/commands/{lab-run.js → study-run.js} +34 -34
  81. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +5 -5
  82. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +1 -1
  83. package/dist/cli/commands/study.js +13 -49
  84. package/dist/cli/commands/tui.js +12 -12
  85. package/dist/cli/commands/watch.js +30 -65
  86. package/dist/cli/deprecations.d.ts +1 -13
  87. package/dist/cli/deprecations.js +0 -30
  88. package/dist/cli/doctor.d.ts +3 -3
  89. package/dist/cli/doctor.js +16 -16
  90. package/dist/cli/first-run-path.d.ts +4 -4
  91. package/dist/cli/first-run-path.js +7 -7
  92. package/dist/cli/io.d.ts +3 -3
  93. package/dist/cli/io.js +2 -2
  94. package/dist/cli/observer-follow.d.ts +2 -2
  95. package/dist/cli/observer-follow.js +2 -2
  96. package/dist/cli/orientation.d.ts +4 -4
  97. package/dist/cli/orientation.js +58 -20
  98. package/dist/cli/program.js +3 -4
  99. package/dist/cli/telemetry.d.ts +1 -1
  100. package/dist/cli/telemetry.js +14 -20
  101. package/dist/comms/catch-host.d.ts +1 -1
  102. package/dist/comms/catch-host.js +3 -3
  103. package/dist/comms/connections.d.ts +1 -1
  104. package/dist/comms/connections.js +2 -2
  105. package/dist/comms/external-evidence.d.ts +5 -5
  106. package/dist/comms/external-evidence.js +4 -3
  107. package/dist/comms/fake-inbox.d.ts +2 -2
  108. package/dist/comms/fake-inbox.js +2 -2
  109. package/dist/comms/receiving-runtime.d.ts +4 -4
  110. package/dist/comms/sandbox-catch.d.ts +2 -2
  111. package/dist/comms/sandbox-catch.js +2 -2
  112. package/dist/comms/setup.d.ts +2 -2
  113. package/dist/comms/setup.js +29 -32
  114. package/dist/evidence/redaction.d.ts +11 -0
  115. package/dist/evidence/redaction.js +43 -0
  116. package/dist/feedback/draft.js +2 -2
  117. package/dist/feedback/export-bundle.js +5 -4
  118. package/dist/feedback/export.js +3 -2
  119. package/dist/feedback/proof.d.ts +1 -1
  120. package/dist/feedback/proof.js +2 -2
  121. package/dist/guest/bootstrap.js +6 -6
  122. package/dist/guest/browser-tools.js +8 -8
  123. package/dist/guest/chromium-text.js +17 -17
  124. package/dist/guest/desktop-executor.d.ts +2 -2
  125. package/dist/guest/desktop-executor.js +20 -20
  126. package/dist/guest/desktop-keys.js +4 -4
  127. package/dist/guest/desktop-media.d.ts +2 -2
  128. package/dist/guest/desktop-media.js +16 -16
  129. package/dist/guest/desktop-native.js +10 -10
  130. package/dist/guest/runtime-desktop.js +2 -2
  131. package/dist/guest/runtime-processes.d.ts +2 -2
  132. package/dist/guest/runtime-processes.js +2 -2
  133. package/dist/guest/runtime.js +5 -5
  134. package/dist/index.d.ts +13 -15
  135. package/dist/index.js +6 -8
  136. package/dist/observer/artifact.d.ts +1 -1
  137. package/dist/observer/artifact.js +1 -1
  138. package/dist/observer/data.d.ts +1 -1
  139. package/dist/observer/library.d.ts +2 -0
  140. package/dist/observer/library.js +4 -1
  141. package/dist/observer/render.js +7 -1
  142. package/dist/observer/run-routes.d.ts +1 -0
  143. package/dist/observer/run-routes.js +37 -12
  144. package/dist/observer/serve.d.ts +1 -1
  145. package/dist/observer-app.html +1 -1
  146. package/dist/routes/computer-use/bundle-parts.js +3 -2
  147. package/dist/routes/computer-use/bundle.d.ts +2 -2
  148. package/dist/routes/computer-use/bundle.js +7 -6
  149. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +5 -5
  150. package/dist/routes/computer-use/e2b-desktop/comms.js +5 -4
  151. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +1 -1
  152. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  153. package/dist/routes/computer-use/e2b-desktop/prepare.js +3 -3
  154. package/dist/routes/computer-use/e2b-desktop/start.js +3 -4
  155. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  156. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -3
  157. package/dist/routes/computer-use/external-comms.d.ts +3 -3
  158. package/dist/routes/computer-use/fanout-bundle.js +11 -10
  159. package/dist/routes/computer-use/fanout-records.js +2 -2
  160. package/dist/routes/computer-use/in-process-desktop.js +1 -1
  161. package/dist/routes/computer-use/live-flush.d.ts +3 -3
  162. package/dist/routes/computer-use/live-phase.d.ts +2 -3
  163. package/dist/routes/computer-use/live-phase.js +3 -3
  164. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  165. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  166. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  167. package/dist/routes/computer-use/local-vm.js +2 -2
  168. package/dist/routes/computer-use/participant-desktop.d.ts +3 -3
  169. package/dist/routes/computer-use/participant-desktop.js +1 -1
  170. package/dist/routes/computer-use/participant-execution.js +1 -1
  171. package/dist/routes/computer-use/participant-model.js +3 -3
  172. package/dist/routes/computer-use/participant-prompt.d.ts +5 -5
  173. package/dist/routes/computer-use/participant-prompt.js +3 -3
  174. package/dist/routes/computer-use/participant-runs.d.ts +10 -10
  175. package/dist/routes/computer-use/participant-runs.js +14 -13
  176. package/dist/routes/computer-use/plan.d.ts +12 -12
  177. package/dist/routes/computer-use/plan.js +27 -27
  178. package/dist/routes/computer-use/preflight.d.ts +5 -5
  179. package/dist/routes/computer-use/preflight.js +5 -5
  180. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  181. package/dist/routes/computer-use/rerun-selection.js +3 -2
  182. package/dist/routes/computer-use/result.d.ts +4 -4
  183. package/dist/routes/computer-use/result.js +13 -12
  184. package/dist/routes/computer-use/route.d.ts +12 -12
  185. package/dist/routes/computer-use/route.js +19 -19
  186. package/dist/routes/computer-use/self-report.js +1 -1
  187. package/dist/routes/computer-use/setup.d.ts +22 -22
  188. package/dist/routes/computer-use/setup.js +15 -15
  189. package/dist/routes/computer-use/single-bundle.d.ts +4 -4
  190. package/dist/routes/computer-use/single-bundle.js +14 -13
  191. package/dist/routes/computer-use/subject-projection.d.ts +3 -3
  192. package/dist/routes/computer-use/types.d.ts +34 -34
  193. package/dist/routes/computer-use/types.js +3 -3
  194. package/dist/routes/preview.d.ts +6 -6
  195. package/dist/routes/preview.js +5 -5
  196. package/dist/routes/scripted/bundle.d.ts +6 -6
  197. package/dist/routes/scripted/bundle.js +10 -9
  198. package/dist/routes/scripted/plan.d.ts +7 -7
  199. package/dist/routes/scripted/plan.js +6 -6
  200. package/dist/routes/scripted/result.d.ts +3 -3
  201. package/dist/routes/scripted/result.js +9 -9
  202. package/dist/routes/scripted/route.d.ts +9 -9
  203. package/dist/routes/scripted/route.js +11 -11
  204. package/dist/routes/scripted/scenario.d.ts +1 -1
  205. package/dist/routes/scripted/scenario.js +3 -3
  206. package/dist/routes/scripted/setup.d.ts +6 -6
  207. package/dist/routes/scripted/setup.js +4 -4
  208. package/dist/routes/scripted/subject.d.ts +5 -5
  209. package/dist/routes/scripted/subject.js +3 -3
  210. package/dist/routes/scripted/surface-records.d.ts +1 -1
  211. package/dist/routes/scripted/surface-records.js +2 -2
  212. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  213. package/dist/routes/scripted/types.d.ts +17 -17
  214. package/dist/routes/scripted/types.js +1 -1
  215. package/dist/routes/shared-world/bundle-records.js +3 -3
  216. package/dist/routes/shared-world/bundle.js +15 -14
  217. package/dist/routes/shared-world/checkpoints.d.ts +3 -3
  218. package/dist/routes/shared-world/checkpoints.js +1 -1
  219. package/dist/routes/shared-world/comms.d.ts +9 -9
  220. package/dist/routes/shared-world/comms.js +6 -5
  221. package/dist/routes/shared-world/participant-specs.d.ts +3 -3
  222. package/dist/routes/shared-world/participant-specs.js +7 -7
  223. package/dist/routes/shared-world/plan.d.ts +9 -9
  224. package/dist/routes/shared-world/plan.js +9 -9
  225. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  226. package/dist/routes/shared-world/provisioned.js +4 -4
  227. package/dist/routes/shared-world/result.d.ts +6 -6
  228. package/dist/routes/shared-world/result.js +11 -10
  229. package/dist/routes/shared-world/route.d.ts +11 -11
  230. package/dist/routes/shared-world/route.js +19 -19
  231. package/dist/routes/shared-world/setup.d.ts +13 -13
  232. package/dist/routes/shared-world/setup.js +19 -19
  233. package/dist/routes/shared-world/types.d.ts +27 -27
  234. package/dist/routes/terminal/adapter.d.ts +2 -2
  235. package/dist/routes/terminal/adapter.js +4 -4
  236. package/dist/routes/terminal/bundle.d.ts +11 -11
  237. package/dist/routes/terminal/bundle.js +12 -12
  238. package/dist/routes/terminal/credentials.d.ts +4 -4
  239. package/dist/routes/terminal/credentials.js +5 -5
  240. package/dist/routes/terminal/dry-run.d.ts +4 -4
  241. package/dist/routes/terminal/dry-run.js +9 -9
  242. package/dist/routes/terminal/ledger.d.ts +2 -2
  243. package/dist/routes/terminal/lifetime.d.ts +1 -1
  244. package/dist/routes/terminal/lifetime.js +1 -1
  245. package/dist/routes/terminal/live-finish.d.ts +2 -2
  246. package/dist/routes/terminal/live-finish.js +7 -7
  247. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  248. package/dist/routes/terminal/live-sandbox.js +3 -2
  249. package/dist/routes/terminal/participant-text.js +2 -1
  250. package/dist/routes/terminal/persona.d.ts +2 -2
  251. package/dist/routes/terminal/persona.js +2 -2
  252. package/dist/routes/terminal/plan.d.ts +7 -7
  253. package/dist/routes/terminal/plan.js +5 -5
  254. package/dist/routes/terminal/result.d.ts +5 -5
  255. package/dist/routes/terminal/result.js +7 -7
  256. package/dist/routes/terminal/route.d.ts +9 -9
  257. package/dist/routes/terminal/route.js +14 -14
  258. package/dist/routes/terminal/session.d.ts +5 -5
  259. package/dist/routes/terminal/session.js +7 -7
  260. package/dist/routes/terminal/trace.d.ts +2 -2
  261. package/dist/routes/terminal/types.d.ts +24 -24
  262. package/dist/routes/terminal/types.js +2 -2
  263. package/dist/run/bundle.d.ts +7 -7
  264. package/dist/run/bundle.js +2 -2
  265. package/dist/run/costs.d.ts +23 -0
  266. package/dist/run/costs.js +72 -43
  267. package/dist/run/dry-run-inputs.d.ts +1 -1
  268. package/dist/run/dry-run-inputs.js +1 -1
  269. package/dist/run/dry-run.js +2 -2
  270. package/dist/run/outcomes.d.ts +1 -1
  271. package/dist/run/participant.d.ts +1 -1
  272. package/dist/run/preflight-receipts.js +1 -1
  273. package/dist/run/pricing.js +2 -2
  274. package/dist/run/projection.d.ts +32 -32
  275. package/dist/run/projection.js +44 -44
  276. package/dist/run/reclaim.d.ts +1 -1
  277. package/dist/run/reclaim.js +1 -1
  278. package/dist/run/results.d.ts +2 -2
  279. package/dist/run/run-cost.d.ts +53 -0
  280. package/dist/run/run-cost.js +105 -0
  281. package/dist/run/run-index-analysis.d.ts +15 -0
  282. package/dist/run/run-index-analysis.js +77 -0
  283. package/dist/run/run-index.d.ts +11 -1
  284. package/dist/run/run-index.js +63 -49
  285. package/dist/run/run.d.ts +3 -3
  286. package/dist/run/run.js +2 -2
  287. package/dist/run/shared-world-evidence.d.ts +1 -1
  288. package/dist/run/shared-world-shape.js +1 -1
  289. package/dist/run/stats.d.ts +3 -3
  290. package/dist/run/stats.js +14 -14
  291. package/dist/run/status.d.ts +10 -2
  292. package/dist/run/status.js +6 -3
  293. package/dist/run/streams.d.ts +2 -2
  294. package/dist/run/study-provenance.d.ts +4 -2
  295. package/dist/run/study-provenance.js +7 -4
  296. package/dist/run/study-result.d.ts +0 -5
  297. package/dist/run/study-result.js +1 -1
  298. package/dist/run-study.d.ts +112 -0
  299. package/dist/{run-lab.js → run-study.js} +52 -45
  300. package/dist/{lab → study}/adapter-extension.d.ts +8 -20
  301. package/dist/{lab → study}/adapter-extension.js +2 -14
  302. package/dist/{lab → study}/adapter-scorer-loader.d.ts +10 -10
  303. package/dist/{lab → study}/adapter-scorer-loader.js +3 -3
  304. package/dist/study/composition-rules.d.ts +7 -0
  305. package/dist/{lab → study}/composition-rules.js +12 -12
  306. package/dist/study/config.d.ts +15 -0
  307. package/dist/{lab → study}/config.js +37 -20
  308. package/dist/study/convert.d.ts +1 -1
  309. package/dist/study/convert.js +15 -15
  310. package/dist/{lab → study}/device-presets.d.ts +2 -2
  311. package/dist/{lab → study}/discover.d.ts +29 -23
  312. package/dist/{lab → study}/discover.js +97 -118
  313. package/dist/{lab → study}/doctor.d.ts +11 -11
  314. package/dist/{lab → study}/doctor.js +18 -18
  315. package/dist/study/files.d.ts +2 -2
  316. package/dist/study/files.js +6 -5
  317. package/dist/{lab → study}/init-templates.d.ts +2 -2
  318. package/dist/{lab → study}/init-templates.js +16 -11
  319. package/dist/{lab → study}/init.d.ts +1 -1
  320. package/dist/{lab → study}/init.js +7 -4
  321. package/dist/{lab → study}/keys.d.ts +2 -2
  322. package/dist/{lab → study}/keys.js +10 -10
  323. package/dist/study/migrate.d.ts +8 -3
  324. package/dist/study/migrate.js +60 -4
  325. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  326. package/dist/{lab → study}/parse/actors.js +5 -5
  327. package/dist/study/parse/comms.d.ts +12 -0
  328. package/dist/study/parse/execution.d.ts +19 -0
  329. package/dist/{lab → study}/parse/study-v3.d.ts +3 -5
  330. package/dist/{lab → study}/parse/study-v3.js +3 -3
  331. package/dist/{lab → study}/parse/subject-state.d.ts +8 -8
  332. package/dist/{lab → study}/parse/subject-state.js +4 -4
  333. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  334. package/dist/{lab → study}/parse/subject.js +8 -8
  335. package/dist/{lab → study}/parse/values.d.ts +2 -2
  336. package/dist/{lab → study}/persona-resolve.d.ts +4 -4
  337. package/dist/{lab → study}/persona-resolve.js +2 -2
  338. package/dist/{lab → study}/plan-base.d.ts +7 -7
  339. package/dist/{lab → study}/plan-base.js +1 -1
  340. package/dist/{lab → study}/plan-participants.d.ts +10 -10
  341. package/dist/{lab → study}/plan-participants.js +4 -4
  342. package/dist/{lab → study}/plan-types.d.ts +28 -28
  343. package/dist/{lab → study}/plan-types.js +2 -2
  344. package/dist/study/plan.d.ts +13 -0
  345. package/dist/{lab → study}/plan.js +20 -20
  346. package/dist/study/preflight-probes.d.ts +3 -0
  347. package/dist/{lab → study}/preflight-probes.js +9 -8
  348. package/dist/study/preflight-result.d.ts +8 -0
  349. package/dist/{lab → study}/preflight-result.js +3 -3
  350. package/dist/{lab → study}/preflight.d.ts +31 -31
  351. package/dist/{lab → study}/preflight.js +8 -8
  352. package/dist/{lab → study}/requirements.d.ts +3 -3
  353. package/dist/{lab → study}/requirements.js +1 -1
  354. package/dist/study/route-inputs.d.ts +28 -0
  355. package/dist/{lab → study}/route-inputs.js +1 -1
  356. package/dist/{lab → study}/routing.d.ts +12 -12
  357. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -10
  358. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +4 -4
  359. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +8 -17
  360. package/dist/study/run-study-homes.js +3 -0
  361. package/dist/study/run-study-options.d.ts +28 -0
  362. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +16 -15
  363. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +2 -2
  364. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  365. package/dist/{lab → study}/summary.d.ts +10 -10
  366. package/dist/{lab → study}/summary.js +15 -15
  367. package/dist/{lab → study}/tasks.d.ts +3 -3
  368. package/dist/{lab → study}/tasks.js +1 -1
  369. package/dist/{lab → study}/types.d.ts +104 -104
  370. package/dist/{lab → study}/types.js +1 -1
  371. package/dist/{lab → study}/validation.d.ts +19 -19
  372. package/dist/{lab → study}/validation.js +13 -13
  373. package/dist/{lab → study}/warnings.d.ts +4 -4
  374. package/dist/{lab → study}/warnings.js +1 -1
  375. package/dist/subject/clone.d.ts +6 -6
  376. package/dist/subject/clone.js +2 -2
  377. package/dist/subject/local-tree-archive.d.ts +2 -2
  378. package/dist/subject/local-tree-archive.js +3 -3
  379. package/dist/subject/local-tree.d.ts +3 -3
  380. package/dist/subject/runtime.js +2 -2
  381. package/dist/subject/serve.d.ts +4 -4
  382. package/dist/subject/state.d.ts +3 -3
  383. package/dist/subject/state.js +1 -1
  384. package/dist/subject/steps.d.ts +1 -1
  385. package/dist/subject/steps.js +1 -1
  386. package/dist/substrates/desktop-session.js +2 -2
  387. package/dist/substrates/detached.d.ts +1 -1
  388. package/dist/substrates/e2b/desktop-browser.d.ts +4 -4
  389. package/dist/substrates/e2b/desktop-browser.js +1 -1
  390. package/dist/substrates/e2b/desktop-cdp.d.ts +1 -1
  391. package/dist/substrates/e2b/desktop-cdp.js +1 -1
  392. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  393. package/dist/substrates/e2b/desktop-executor.js +12 -12
  394. package/dist/substrates/e2b/desktop-geometry.d.ts +1 -1
  395. package/dist/substrates/e2b/desktop-geometry.js +1 -1
  396. package/dist/substrates/e2b/desktop-media.d.ts +3 -3
  397. package/dist/substrates/e2b/lifetime.js +1 -1
  398. package/dist/substrates/e2b/sandbox.d.ts +3 -3
  399. package/dist/substrates/e2b/sandbox.js +1 -1
  400. package/dist/substrates/e2b/sdk.d.ts +1 -1
  401. package/dist/substrates/e2b/sdk.js +1 -1
  402. package/dist/substrates/local/runtime-config.d.ts +4 -4
  403. package/dist/substrates/local/runtime-config.js +4 -4
  404. package/dist/tui/contract.d.ts +8 -8
  405. package/dist/tui/contract.js +2 -2
  406. package/dist/tui/launch.d.ts +3 -3
  407. package/dist/tui/launch.js +22 -16
  408. package/dist/tui-app.js +139 -139
  409. package/dist/verify/subject.d.ts +1 -1
  410. package/dist/verify/subject.js +1 -1
  411. package/dist/verify/verify.js +2 -1
  412. package/docs/architecture/actor-contract.md +5 -5
  413. package/docs/architecture/browser-control.md +1 -1
  414. package/docs/architecture/external-public-shared-world.md +8 -7
  415. package/docs/architecture/github-feedback-loop.md +1 -1
  416. package/docs/architecture/task-protocol-support.md +1 -1
  417. package/docs/architecture/terminal-product-route.md +18 -18
  418. package/docs/contracts/adapter-fixtures.md +2 -2
  419. package/docs/contracts/errors.md +8 -8
  420. package/docs/contracts/run-bundle.md +6 -4
  421. package/docs/contracts/schemas.md +61 -42
  422. package/docs/contracts/study-analysis.md +4 -1
  423. package/docs/contracts/study-costs.md +17 -2
  424. package/examples/README.md +1 -1
  425. package/examples/scorer/scorer.mjs +3 -3
  426. package/package.json +2 -1
  427. package/skills/humanish/SKILL.md +8 -6
  428. package/skills/humanish/agents/openai.yaml +1 -1
  429. package/dist/cli/commands/lab-format.d.ts +0 -9
  430. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  431. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  432. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  433. package/dist/cli/commands/lab-run.d.ts +0 -9
  434. package/dist/lab/composition-rules.d.ts +0 -7
  435. package/dist/lab/config.d.ts +0 -7
  436. package/dist/lab/deprecated-fields.d.ts +0 -10
  437. package/dist/lab/deprecated-fields.js +0 -24
  438. package/dist/lab/parse/comms.d.ts +0 -12
  439. package/dist/lab/parse/execution.d.ts +0 -19
  440. package/dist/lab/plan.d.ts +0 -13
  441. package/dist/lab/preflight-probes.d.ts +0 -3
  442. package/dist/lab/preflight-result.d.ts +0 -8
  443. package/dist/lab/route-inputs.d.ts +0 -28
  444. package/dist/lab/run-lab-homes.js +0 -7
  445. package/dist/lab/run-lab-options.d.ts +0 -28
  446. package/dist/library-aliases.d.ts +0 -56
  447. package/dist/library-aliases.js +0 -22
  448. package/dist/run-lab.d.ts +0 -112
  449. /package/dist/{lab → study}/device-presets.js +0 -0
  450. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  451. /package/dist/{lab → study}/init-paths.js +0 -0
  452. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  453. /package/dist/{lab → study}/init-plan.js +0 -0
  454. /package/dist/{lab → study}/parse/comms.js +0 -0
  455. /package/dist/{lab → study}/parse/execution.js +0 -0
  456. /package/dist/{lab → study}/parse/values.js +0 -0
  457. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  458. /package/dist/{lab → study}/participant-assignment.js +0 -0
  459. /package/dist/{lab → study}/persona.d.ts +0 -0
  460. /package/dist/{lab → study}/persona.js +0 -0
  461. /package/dist/{lab → study}/routing.js +0 -0
@@ -4,24 +4,24 @@ import {} from "./types.js";
4
4
  import { runPublicPreviewPreflight, runSandboxLoopbackPreflight } from "./preflight-probes.js";
5
5
  import { digest, fail, finalize, STUDY_CHECK_SCHEMA } from "./preflight-result.js";
6
6
  import { routeOf } from "./plan.js";
7
- import { resolveLabManifest } from "./discover.js";
7
+ import { resolveStudyManifest } from "./discover.js";
8
8
  import { rosterOf } from "./parse/actors.js";
9
9
  const DEFAULT_PREFLIGHT_TIMEOUT_MS = 30_000;
10
- export async function runLabPreflight(options) {
10
+ export async function runStudyPreflight(options) {
11
11
  const cwd = path.resolve(options.cwd);
12
12
  const reachability = options.reachability ?? "metadata";
13
13
  const timeoutMs = options.timeoutMs ?? DEFAULT_PREFLIGHT_TIMEOUT_MS;
14
- const resolved = await resolveLabManifest(cwd, options.lab);
14
+ const resolved = await resolveStudyManifest(cwd, options.study);
15
15
  if (!resolved.ok) {
16
16
  return {
17
17
  schema: STUDY_CHECK_SCHEMA,
18
18
  ok: false,
19
19
  cwd,
20
- study: options.lab,
20
+ study: options.study,
21
21
  reachability,
22
22
  checks: [
23
23
  {
24
- name: "lab manifest",
24
+ name: "study file",
25
25
  ok: false,
26
26
  message: resolved.error.message,
27
27
  },
@@ -36,8 +36,8 @@ export async function runLabPreflight(options) {
36
36
  const route = routeOf(resolved.config);
37
37
  const ctx = {
38
38
  cwd,
39
- lab: options.lab,
40
- labId: resolved.config.id,
39
+ study: options.study,
40
+ studyId: resolved.config.id,
41
41
  origin: resolved.origin,
42
42
  path: resolved.path,
43
43
  config: resolved.config,
@@ -47,7 +47,7 @@ export async function runLabPreflight(options) {
47
47
  env: options.env ?? process.env,
48
48
  hooks: options.hooks ?? {},
49
49
  checks: [
50
- { name: "lab manifest", ok: true, message: `resolved ${resolved.origin} lab manifest` },
50
+ { name: "study file", ok: true, message: `resolved ${resolved.origin} study file` },
51
51
  { name: "route", ok: true, message: `selected the ${route} route` },
52
52
  ],
53
53
  targets: collectTargets(resolved.config),
@@ -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,4 +1,4 @@
1
- import type { LabConfig } from "./types.js";
1
+ import type { StudyConfig } from "./types.js";
2
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[];
@@ -13,7 +13,7 @@ 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 computerUseParticipantCount(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
19
  * (shared-world participants) from its 0-based position. The parser's filled email recipients and
@@ -29,7 +29,7 @@ export declare function participantIdAt(index: number, declared: string | undefi
29
29
  * bare app-url fallback to the computer-use route so library-API configs with unknown actors still
30
30
  * hit its fail-closed ACTOR_UNSUPPORTED.)
31
31
  */
32
- export declare function isComputerUseComposition(config: LabConfig): boolean;
32
+ export declare function isComputerUseComposition(config: StudyConfig): boolean;
33
33
  /**
34
34
  * True when this config routes to the shared-world route: a clone or local-tree subject
35
35
  * on a hosted desktop whose first actor resolves to a computer-use actor and that declares the
@@ -39,9 +39,9 @@ export declare function isComputerUseComposition(config: LabConfig): boolean;
39
39
  * clone/local-tree × e2b-desktop × computer-use composition without `topology: shared-world` stays per-lane-worlds
40
40
  * (the computer-use route); the topology declaration is the override switch.
41
41
  */
42
- export declare function isSharedWorldComposition(config: LabConfig): boolean;
42
+ export declare function isSharedWorldComposition(config: StudyConfig): boolean;
43
43
  /** The getHost provisioned-subject shared-world shape (clone/local-tree served + exposed in-sandbox). */
44
- export declare function isProvisionedSharedWorldComposition(config: LabConfig): boolean;
44
+ export declare function isProvisionedSharedWorldComposition(config: StudyConfig): boolean;
45
45
  /**
46
46
  * The external-public shared-world shape: a real public deployment used directly as
47
47
  * the shared plane: `source: app-url` + `topology: shared-world` + a computer-use actor on
@@ -51,7 +51,7 @@ export declare function isProvisionedSharedWorldComposition(config: LabConfig):
51
51
  * half-declared external-public config still routes here to get its precise fail-closed reason
52
52
  * rather than silently downgrading to the per-participant computer-use route).
53
53
  */
54
- export declare function isExternalPublicSharedWorldComposition(config: LabConfig): boolean;
54
+ export declare function isExternalPublicSharedWorldComposition(config: StudyConfig): boolean;
55
55
  /**
56
56
  * Resolve a shared-world participant's entry URL from `serve.url` and its roster entry's `entry`
57
57
  * (a relative path or a same-origin absolute URL). Returns null when the result is not a
@@ -64,19 +64,19 @@ export declare function resolveEntryUrl(serveUrl: string, entry: string | undefi
64
64
  * absent; the parse layer enforces that pairing). Mirror of isComputerUseComposition; the single
65
65
  * source of truth for routeOf and the warning logic.
66
66
  */
67
- export declare function isScriptedBrowserComposition(config: LabConfig): boolean;
68
- export declare function isProvisionedScriptedBrowserComposition(config: LabConfig): boolean;
67
+ export declare function isScriptedBrowserComposition(config: StudyConfig): boolean;
68
+ export declare function isProvisionedScriptedBrowserComposition(config: StudyConfig): boolean;
69
69
  /**
70
70
  * True when this config routes to the terminal-product backend: a terminal-product subject whose
71
71
  * first actor resolves to a registered terminal actor (execution.target e2b-terminal or absent;
72
72
  * the parse layer enforces that pairing). Mirror of isComputerUseComposition/isScriptedBrowserComposition;
73
73
  * the single source of truth for routeOf and the warning logic.
74
74
  */
75
- export declare function isTerminalProductComposition(config: LabConfig): boolean;
76
- /** The five execution paths a lab can take. */
77
- export type LabRoute = "preview" | "computer-use" | "shared-world" | "terminal" | "scripted";
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
78
  /**
79
79
  * The route a config takes. It never refuses: a config no route can run still gets the route
80
80
  * whose own checks refuse it with the most precise reason.
81
81
  */
82
- export declare function routeOf(config: LabConfig): LabRoute;
82
+ export declare function routeOf(config: StudyConfig): StudyRoute;
@@ -1,8 +1,8 @@
1
1
  import type { CuaParticipantPlan } from "../routes/computer-use/types.js";
2
2
  import type { SubjectPhaseEvent } from "../subject/steps.js";
3
- import type { InternalRunLabOptions } from "../run-lab.js";
4
- import type { LabRoute } from "./plan.js";
5
- 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";
6
6
  /** One participant, as the options' callbacks see it. */
7
7
  export interface ParticipantRef {
8
8
  readonly id: string;
@@ -19,12 +19,12 @@ export type SetupTarget = {
19
19
  };
20
20
  /**
21
21
  * What a run reports while it runs. `plan` comes from computer use only; the other routes run from
22
- * 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)
23
23
  * and shared world (subject target).
24
24
  */
25
- export type LabEvent = {
25
+ export type StudyEvent = {
26
26
  type: "plan";
27
- route: LabRoute;
27
+ route: StudyRoute;
28
28
  participants: readonly {
29
29
  id: string;
30
30
  persona: string;
@@ -50,12 +50,12 @@ export type LabEvent = {
50
50
  * analysis API key. A callback can hold any of them, and its warning is appended after the route
51
51
  * sanitized its own.
52
52
  */
53
- 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[];
54
54
  /**
55
55
  * The emitter the route hook bags call, or undefined without onEvent. It calls onEvent and never
56
56
  * waits for it: a throw or a rejected promise becomes a run warning, scrubbed of `secretValues`.
57
57
  */
58
- 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;
59
59
  /** The computer-use participant plan as a `plan` event: ids, personas, devices and digests. */
60
- export declare function planEvent(plan: CuaParticipantPlan): LabEvent;
61
- 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) => {
@@ -43,7 +43,7 @@ export function labEventEmitter(onEvent, warnings, secretValues) {
43
43
  catch {
44
44
  detail = "the thrown value has no message";
45
45
  }
46
- warnings.push(`RunLabOptions.onEvent failed on ${type}: ${detail}`);
46
+ warnings.push(`RunStudyOptions.onEvent failed on ${type}: ${detail}`);
47
47
  };
48
48
  try {
49
49
  const returned = onEvent(event);
@@ -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,7 +13,7 @@ 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
  }
@@ -26,7 +26,7 @@ interface StreamEventIds {
26
26
  recordId: string;
27
27
  streamId: string;
28
28
  }
29
- type StreamEventFields = (StreamEventIds & {
29
+ export type StreamEvent = (StreamEventIds & {
30
30
  type: "ready";
31
31
  sandboxId: string;
32
32
  /** Runtime only: carries an auth key and must never be persisted. */
@@ -34,17 +34,8 @@ type StreamEventFields = (StreamEventIds & {
34
34
  }) | (StreamEventIds & {
35
35
  type: "ended";
36
36
  });
37
- export type StreamEvent = StreamEventFields & {
38
- /**
39
- * @deprecated Use `recordId`, which holds the same value. Reading it warns once per process; the
40
- * next minor removes it.
41
- */
42
- readonly simId: string;
43
- };
44
- /** A stream event as the routes report it, with `simId` as a getter over `recordId`. */
45
- export declare function streamEvent(fields: StreamEventFields): StreamEvent;
46
37
  /** The options with a typed home, common to every route. */
47
- export interface RunLabHomes {
38
+ export interface RunStudyHomes {
48
39
  /** Keys and subject env for the run. Defaults to process.env. */
49
40
  env?: Readonly<Record<string, string | undefined>>;
50
41
  /**
@@ -59,14 +50,14 @@ export interface RunLabHomes {
59
50
  * Passive. Never awaited; a throw or a rejected promise becomes a run warning. It observes and
60
51
  * changes no output: subject phases still go to stderr.
61
52
  */
62
- onEvent?: (event: LabEvent) => void | Promise<void>;
53
+ onEvent?: (event: StudyEvent) => void | Promise<void>;
63
54
  /** Awaited after a participant's live stream starts, and again after its sandbox is gone. */
64
55
  onStream?: (event: StreamEvent) => Promise<void> | void;
65
56
  /** Cancels post-run analysis only. */
66
57
  analysisSignal?: AbortSignal;
67
58
  }
68
59
  /** Brain and in-process driving. An in-process executor needs a provider: it returns no frame. */
69
- export type RunLabDriving = {
60
+ export type RunStudyDriving = {
70
61
  inProcess?: undefined;
71
62
  createProvider?: ProviderFactory;
72
63
  } | {
@@ -0,0 +1,3 @@
1
+ // The public RunStudyOptions homes that every route reads: env, scorer, prepareDesktop, onEvent,
2
+ // onStream and analysisSignal, and the brain and in-process driving computer use takes.
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 {};
@@ -1,19 +1,19 @@
1
- // The typed homes on RunLabOptions. runLab calls normalizeRunLabOptions first: it refuses an option
1
+ // The typed homes on RunStudyOptions. runStudyWith calls normalizeRunStudyOptions first: it refuses an option
2
2
  // the route cannot honor and otherwise passes the typed options to the route, with env copied and
3
- // onEvent turned into the emitter. The package's runLab refuses the removed bags
3
+ // onEvent turned into the emitter. The package's runStudy refuses the removed bags
4
4
  // (removedOptionRefusal).
5
5
  import path from "node:path";
6
- import { isLocalBrowserLab } from "../substrates/local/runtime-config.js";
7
- import { resolveLabDryRun } from "./plan.js";
8
- import { knownSecretValues, labEventEmitter } from "./run-lab-events.js";
6
+ import { isLocalBrowserStudy } from "../substrates/local/runtime-config.js";
7
+ import { resolveStudyDryRun } from "./plan.js";
8
+ import { knownSecretValues, studyEventEmitter } from "./run-study-events.js";
9
9
  import { rosterOf } from "./parse/actors.js";
10
10
  import { studyResultIdentity } from "../run/study-result.js";
11
11
  const unsupported = (option, route, reason) => ({
12
12
  ok: false,
13
13
  code: "HUMANISH_STUDY_OPTION_UNSUPPORTED",
14
- message: `RunLabOptions.${option} is not supported on the ${route} route: ${reason}`,
14
+ message: `RunStudyOptions.${option} is not supported on the ${route} route: ${reason}`,
15
15
  });
16
- // Fields RunLabOptions no longer has, and where each one's job went.
16
+ // Fields RunStudyOptions no longer has, and where each one's job went.
17
17
  const REMOVED_OPTIONS = {
18
18
  cuaHooks: "Use scorer, createProvider, inProcess, prepareDesktop, env, onEvent and onStream.",
19
19
  scriptedHooks: "Use prepareDesktop and env.",
@@ -21,9 +21,10 @@ const REMOVED_OPTIONS = {
21
21
  sharedWorldHooks: "Use scorer, prepareDesktop, env, onEvent and onStream.",
22
22
  automaticAnalysis: "Use onEvent (analysis-started, analysis-finished) and analysisSignal.",
23
23
  lab: "The humanish CLI sets it.",
24
+ study: "The humanish CLI sets it.",
24
25
  scorerProvenance: "The humanish CLI sets it.",
25
26
  };
26
- /** The refusal for a field a JavaScript caller passed that RunLabOptions no longer has. */
27
+ /** The refusal for a field a JavaScript caller passed that RunStudyOptions no longer has. */
27
28
  export function removedOptionRefusal(options) {
28
29
  // rerun.laneIds, the older name of rerun.participantIds, would otherwise be ignored, so the rerun
29
30
  // would select every failed participant instead of the ones the caller named.
@@ -31,7 +32,7 @@ export function removedOptionRefusal(options) {
31
32
  return {
32
33
  ok: false,
33
34
  code: "HUMANISH_STUDY_OPTION_UNSUPPORTED",
34
- message: 'RunLabOptions.rerun.laneIds was removed. Use rerun.participantIds. See docs/contracts/schemas.md, "Library options".',
35
+ message: '`rerun.laneIds` was removed in 0.107.0. Use `rerun.participantIds`. See docs/contracts/schemas.md, "Library options".',
35
36
  };
36
37
  const field = Object.keys(REMOVED_OPTIONS).find((key) => Reflect.get(options, key) !== undefined);
37
38
  if (field === undefined)
@@ -39,7 +40,7 @@ export function removedOptionRefusal(options) {
39
40
  return {
40
41
  ok: false,
41
42
  code: "HUMANISH_STUDY_OPTION_UNSUPPORTED",
42
- message: `RunLabOptions.${field} was removed. ${REMOVED_OPTIONS[field]} See docs/contracts/schemas.md, "Library options".`,
43
+ message: `\`${field}\` was removed. ${REMOVED_OPTIONS[field]} See docs/contracts/schemas.md, "Library options".`,
43
44
  };
44
45
  }
45
46
  /** Why the route cannot honor an option it was given, or undefined when it can. */
@@ -52,7 +53,7 @@ function unsupportedOption(config, route, options) {
52
53
  return unsupported("scorer", route, "only computer use, shared world and terminal score runs.");
53
54
  if (createProvider !== undefined && route !== "computer-use")
54
55
  return unsupported("createProvider", route, route === "shared-world"
55
- ? "shared-world participants run the lab's own brain."
56
+ ? "shared-world participants run the study's own brain."
56
57
  : "only computer use takes a caller brain.");
57
58
  if (route === "computer-use") {
58
59
  const source = config.subject.source;
@@ -61,7 +62,7 @@ function unsupportedOption(config, route, options) {
61
62
  return unsupported("inProcess", route, "it drives an app-url or local-app subject.");
62
63
  }
63
64
  if (prepareDesktop !== undefined) {
64
- if (isLocalBrowserLab(config))
65
+ if (isLocalBrowserStudy(config))
65
66
  return unsupported("prepareDesktop", route, "a local VM study has no E2B desktop.");
66
67
  // An in-process run has no desktop to prepare.
67
68
  if (inProcess !== undefined || source === "local-app")
@@ -83,7 +84,7 @@ function unsupportedOption(config, route, options) {
83
84
  * Refuse what the route cannot honor, copy env, and build the emitter onEvent receives through.
84
85
  * Nothing here touches the filesystem, so a refusal leaves no run directory, receipt or sandbox.
85
86
  */
86
- export function normalizeRunLabOptions(config, route, options) {
87
+ export function normalizeRunStudyOptions(config, route, options) {
87
88
  const refused = unsupportedOption(config, route, options);
88
89
  if (refused)
89
90
  return refused;
@@ -92,7 +93,7 @@ export function normalizeRunLabOptions(config, route, options) {
92
93
  // The route gets this copy, so it is the env a warning is scrubbed against, whatever the caller
93
94
  // does to its own object afterwards.
94
95
  const forwardedEnv = env === undefined ? undefined : { ...env };
95
- const emit = labEventEmitter(onEvent, warnings, () => knownSecretValues(config, options, forwardedEnv));
96
+ const emit = studyEventEmitter(onEvent, warnings, () => knownSecretValues(config, options, forwardedEnv));
96
97
  // Every route reads its typed options directly, and onEvent reaches it as `emit`. unsupportedOption
97
98
  // already refused an option no route reads; the preview route reads no env.
98
99
  const normalized = { ...forwarded };
@@ -105,7 +106,7 @@ export function optionRefusalOutcome(config, route, options, refusal) {
105
106
  const cwd = path.resolve(options.cwd);
106
107
  const error = { code: refusal.code, message: refusal.message };
107
108
  const actor = config.actors[0]?.type ?? "";
108
- const dryRun = resolveLabDryRun(config, options.dryRun, true) ?? true;
109
+ const dryRun = resolveStudyDryRun(config, options.dryRun, true) ?? true;
109
110
  const runId = options.runId ?? "not-created";
110
111
  const common = { ok: false, cwd, actor, dryRun, runId, warnings: [], error };
111
112
  switch (route) {
@@ -9,8 +9,8 @@ import type { DetachedTimers } from "../substrates/detached.js";
9
9
  import type { E2BDesktopModule } from "../substrates/e2b/sdk.js";
10
10
  import type { LocalTreeArchive } from "../subject/local-tree-archive.js";
11
11
  import type { SubjectPhaseEvent } from "../subject/steps.js";
12
- import type { ParticipantRef } from "./run-lab-events.js";
13
- export interface LabDeps {
12
+ import type { ParticipantRef } from "./run-study-events.js";
13
+ export interface StudyDeps {
14
14
  /** Loads the E2B SDK. Defaults to loadE2BDesktopModule. */
15
15
  readonly desktopModule?: () => Promise<E2BDesktopModule>;
16
16
  /** Renders the Observer. Defaults to renderObserver. */
@@ -1,4 +1,4 @@
1
- // Test seams: the implementations a test puts in place of the real ones. The internal runLab takes
2
- // them as its third argument and each route runner as `deps`; the package's runLab takes none.
1
+ // Test seams: the implementations a test puts in place of the real ones. The internal runStudyWith takes
2
+ // them as its third argument and each route runner as `deps`; the package's runStudy takes none.
3
3
  // Each field defaults to the real implementation.
4
4
  export {};
@@ -1,13 +1,13 @@
1
1
  import { type LocalRuntimeStatus } from "../substrates/local/runtime.js";
2
2
  import { type KeyResolutionDeps } from "../keys/key-resolution.js";
3
3
  export declare const STUDY_SUMMARY_SCHEMA = "humanish.study-summary.v1";
4
- export interface LabCaps {
4
+ export interface StudyCaps {
5
5
  /** Per-participant blast-radius budget. */
6
6
  laneUsd?: number;
7
7
  /** Shared study budget across every participant. */
8
8
  studyUsd?: number;
9
9
  }
10
- export interface LabSummary {
10
+ export interface StudySummary {
11
11
  runtime?: Pick<LocalRuntimeStatus, "ok" | "installed" | "message">;
12
12
  participantReadiness?: {
13
13
  ok: boolean;
@@ -35,11 +35,11 @@ export interface LabSummary {
35
35
  * The reasoning effort that will actually run, override or default, and `"per-lane"` when the
36
36
  * roster declares more than one, because a single value would be a lie about half the participants.
37
37
  *
38
- * Shown because it was a silent constant: unreachable from a lab, so every run took the provider
38
+ * Shown because it was a silent constant: unreachable from a study, so every run took the provider
39
39
  * default. A study variable you cannot see is one nobody chose.
40
40
  */
41
41
  reasoningEffort?: string;
42
- caps: LabCaps;
42
+ caps: StudyCaps;
43
43
  /**
44
44
  * Whether the configured route's required keys resolve. Dry runs require none. This checks key
45
45
  * presence, not local CLI authentication or provider validity. Undefined when not checked.
@@ -47,12 +47,12 @@ export interface LabSummary {
47
47
  keysReady?: boolean;
48
48
  missingKeys?: string[];
49
49
  /**
50
- * The planner's refusal message when a live key check finds the lab will not plan, as
51
- * `humanish lab run` would report it. `keysReady` is then unset: a refused plan lists no keys.
50
+ * The planner's refusal message when a live key check finds the study will not plan, as
51
+ * `humanish run` would report it. `keysReady` is then unset: a refused plan lists no keys.
52
52
  */
53
53
  planRefusal?: string;
54
54
  }
55
- export interface ReadLabSummaryOptions {
55
+ export interface ReadStudySummaryOptions {
56
56
  /** Skip the key probe (it touches vendor stores); the screen then shows no keys line. */
57
57
  checkKeys?: boolean;
58
58
  env?: NodeJS.ProcessEnv;
@@ -60,7 +60,7 @@ export interface ReadLabSummaryOptions {
60
60
  keyDeps?: KeyResolutionDeps;
61
61
  }
62
62
  /**
63
- * Describe one lab. Returns null when the manifest cannot be resolved: the caller already knows
64
- * the lab exists from the listing, so this failing means the file changed underneath them.
63
+ * Describe one study. Returns null when the manifest cannot be resolved: the caller already knows
64
+ * the study exists from the listing, so this failing means the file changed underneath them.
65
65
  */
66
- export declare function readLabSummary(cwd: string, lab: string, options?: ReadLabSummaryOptions): Promise<LabSummary | null>;
66
+ export declare function readStudySummary(cwd: string, study: string, options?: ReadStudySummaryOptions): Promise<StudySummary | null>;
@@ -1,20 +1,20 @@
1
- import { isLocalBrowserLab } from "../substrates/local/runtime-config.js";
1
+ import { isLocalBrowserStudy } from "../substrates/local/runtime-config.js";
2
2
  import { localRuntimeStatus } from "../substrates/local/runtime.js";
3
- // What a lab is, for the surface that has to describe it before you spend money.
3
+ // What a study is, for the surface that has to describe it before you spend money.
4
4
  //
5
- // The run index and run detail answer questions about runs. This answers a question about the lab
5
+ // The run index and run detail answer questions about runs. This answers a question about the study
6
6
  // itself (what it drives, who is in it, which model, and what it is allowed to spend), which is
7
7
  // what a stakeholder reads on the screen where they decide whether to press Start.
8
8
  //
9
9
  // Resolved analysis defaults are shown independently of declared participant caps. A cap that is not
10
10
  // declared is not "unlimited" and not "$0"; it is a line the screen does not draw.
11
- import { resolveLabDryRun } from "./plan.js";
11
+ import { resolveStudyDryRun } from "./plan.js";
12
12
  import { routeOf } from "./plan.js";
13
13
  import { localCodexParticipantCheck, planCliRun } from "./doctor.js";
14
14
  import { requiredKeys, requiredSubjectEnv } from "./requirements.js";
15
15
  import { automaticAnalysisBudget } from "../analysis/automatic-config.js";
16
16
  import { DEFAULT_OPENAI_CU_MODEL, DEFAULT_OPENAI_CU_REASONING_EFFORT, } from "../actors/computer-use/openai-provider.js";
17
- import { inspectLabManifest } from "./discover.js";
17
+ import { inspectStudyManifest } from "./discover.js";
18
18
  import { isComputerUseComposition } from "./routing.js";
19
19
  import { probeKeySources } from "../keys/key-resolution.js";
20
20
  import { receivingRequiredKey } from "../comms/setup.js";
@@ -35,7 +35,7 @@ function reasoningEffortOf(config) {
35
35
  return "per-lane";
36
36
  return resolved.size === 1 ? [...resolved][0] : fallback;
37
37
  }
38
- /** One short phrase for what the lab drives. */
38
+ /** One short phrase for what the study drives. */
39
39
  function subjectOf(config) {
40
40
  const subject = config.subject;
41
41
  if (subject?.source === undefined)
@@ -76,11 +76,11 @@ function capsOf(config) {
76
76
  };
77
77
  }
78
78
  /**
79
- * Describe one lab. Returns null when the manifest cannot be resolved: the caller already knows
80
- * the lab exists from the listing, so this failing means the file changed underneath them.
79
+ * Describe one study. Returns null when the manifest cannot be resolved: the caller already knows
80
+ * the study exists from the listing, so this failing means the file changed underneath them.
81
81
  */
82
- export async function readLabSummary(cwd, lab, options = {}) {
83
- const inspected = await inspectLabManifest(cwd, lab).catch(() => null);
82
+ export async function readStudySummary(cwd, study, options = {}) {
83
+ const inspected = await inspectStudyManifest(cwd, study).catch(() => null);
84
84
  if (inspected === null || !inspected.ok || inspected.config === undefined)
85
85
  return null;
86
86
  const config = inspected.config;
@@ -88,8 +88,8 @@ export async function readLabSummary(cwd, lab, options = {}) {
88
88
  const route = routeOf(inspected.config);
89
89
  let keysReady;
90
90
  let missingKeys;
91
- const dryRun = resolveLabDryRun(inspected.config, undefined, true) === true;
92
- // A live key check reads the plan's requirements. A lab the planner refuses has none to check,
91
+ const dryRun = resolveStudyDryRun(inspected.config, undefined, true) === true;
92
+ // A live key check reads the plan's requirements. A study the planner refuses has none to check,
93
93
  // so the summary reports the refusal in place of its keys.
94
94
  const planned = options.checkKeys === true && !dryRun ? await planCliRun(inspected.config, cwd) : undefined;
95
95
  const planRefusal = planned?.ok === false ? planned.refusal.message : undefined;
@@ -129,7 +129,7 @@ export async function readLabSummary(cwd, lab, options = {}) {
129
129
  const analysis = automaticAnalysisBudget(inspected.config.review?.analysis, route);
130
130
  const subject = subjectOf(config);
131
131
  const participants = participantsOf(config);
132
- const runtime = options.checkKeys === true && isLocalBrowserLab(inspected.config)
132
+ const runtime = options.checkKeys === true && isLocalBrowserStudy(inspected.config)
133
133
  ? await localRuntimeStatus({
134
134
  ...(options.env ? { env: options.env } : {}),
135
135
  media: inspected.config.execution?.desktop?.media !== undefined ||
@@ -137,7 +137,7 @@ export async function readLabSummary(cwd, lab, options = {}) {
137
137
  })
138
138
  : undefined;
139
139
  const participantReadiness = options.checkKeys === true &&
140
- isLocalBrowserLab(inspected.config) &&
140
+ isLocalBrowserStudy(inspected.config) &&
141
141
  inspected.config.actors[0]?.type === "local-agent"
142
142
  ? await localCodexParticipantCheck({ env: options.env ?? process.env })
143
143
  : undefined;
@@ -160,7 +160,7 @@ export async function readLabSummary(cwd, lab, options = {}) {
160
160
  communications: `Real email · ${inspected.config.comms.email.connection} · fresh inbox per participant · hosted processing · local review only`,
161
161
  }
162
162
  : {}),
163
- studyId: String(config.id ?? lab),
163
+ studyId: String(config.id ?? study),
164
164
  ...(typeof config.title === "string" ? { title: config.title } : {}),
165
165
  ...(typeof config.description === "string" ? { description: config.description.trim() } : {}),
166
166
  ...(subject === undefined ? {} : { subject }),