humanish 0.108.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 (455) hide show
  1. package/ARCHITECTURE.md +58 -59
  2. package/CHANGELOG.md +13 -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/observe.d.ts +0 -1
  57. package/dist/cli/commands/observe.js +0 -15
  58. package/dist/cli/commands/run-command.d.ts +2 -2
  59. package/dist/cli/commands/run-command.js +3 -3
  60. package/dist/cli/commands/runs.js +3 -5
  61. package/dist/cli/commands/setup.js +5 -7
  62. package/dist/cli/commands/study-format.d.ts +9 -0
  63. package/dist/cli/commands/{lab-format.js → study-format.js} +5 -5
  64. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  65. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +12 -12
  66. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  67. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  68. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  69. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +3 -3
  70. package/dist/cli/commands/study-route-run.d.ts +19 -0
  71. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  72. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  73. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  74. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  75. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +7 -7
  76. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  77. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  78. package/dist/cli/commands/study-run.d.ts +9 -0
  79. package/dist/cli/commands/{lab-run.js → study-run.js} +34 -34
  80. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +5 -5
  81. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +1 -1
  82. package/dist/cli/commands/study.js +13 -49
  83. package/dist/cli/commands/tui.js +12 -12
  84. package/dist/cli/commands/watch.js +30 -65
  85. package/dist/cli/deprecations.d.ts +1 -13
  86. package/dist/cli/deprecations.js +0 -30
  87. package/dist/cli/doctor.d.ts +3 -3
  88. package/dist/cli/doctor.js +16 -16
  89. package/dist/cli/first-run-path.d.ts +4 -4
  90. package/dist/cli/first-run-path.js +7 -7
  91. package/dist/cli/io.d.ts +3 -3
  92. package/dist/cli/io.js +2 -2
  93. package/dist/cli/observer-follow.d.ts +2 -2
  94. package/dist/cli/observer-follow.js +2 -2
  95. package/dist/cli/orientation.d.ts +4 -4
  96. package/dist/cli/orientation.js +58 -20
  97. package/dist/cli/program.js +3 -4
  98. package/dist/cli/telemetry.d.ts +1 -1
  99. package/dist/cli/telemetry.js +14 -20
  100. package/dist/comms/catch-host.d.ts +1 -1
  101. package/dist/comms/catch-host.js +3 -3
  102. package/dist/comms/connections.d.ts +1 -1
  103. package/dist/comms/connections.js +2 -2
  104. package/dist/comms/external-evidence.d.ts +5 -5
  105. package/dist/comms/external-evidence.js +4 -3
  106. package/dist/comms/fake-inbox.d.ts +2 -2
  107. package/dist/comms/fake-inbox.js +2 -2
  108. package/dist/comms/receiving-runtime.d.ts +4 -4
  109. package/dist/comms/sandbox-catch.d.ts +2 -2
  110. package/dist/comms/sandbox-catch.js +2 -2
  111. package/dist/comms/setup.d.ts +2 -2
  112. package/dist/comms/setup.js +29 -32
  113. package/dist/feedback/draft.js +2 -2
  114. package/dist/feedback/export.js +3 -2
  115. package/dist/feedback/proof.d.ts +1 -1
  116. package/dist/feedback/proof.js +2 -2
  117. package/dist/guest/bootstrap.js +6 -6
  118. package/dist/guest/browser-tools.js +8 -8
  119. package/dist/guest/chromium-text.js +17 -17
  120. package/dist/guest/desktop-executor.d.ts +2 -2
  121. package/dist/guest/desktop-executor.js +20 -20
  122. package/dist/guest/desktop-keys.js +4 -4
  123. package/dist/guest/desktop-media.d.ts +2 -2
  124. package/dist/guest/desktop-media.js +16 -16
  125. package/dist/guest/desktop-native.js +10 -10
  126. package/dist/guest/runtime-desktop.js +2 -2
  127. package/dist/guest/runtime-processes.d.ts +2 -2
  128. package/dist/guest/runtime-processes.js +2 -2
  129. package/dist/guest/runtime.js +5 -5
  130. package/dist/index.d.ts +13 -15
  131. package/dist/index.js +6 -8
  132. package/dist/observer/artifact.d.ts +1 -1
  133. package/dist/observer/artifact.js +1 -1
  134. package/dist/observer/data.d.ts +1 -1
  135. package/dist/observer/library.d.ts +2 -0
  136. package/dist/observer/library.js +4 -1
  137. package/dist/observer/render.js +7 -1
  138. package/dist/observer/run-routes.d.ts +1 -0
  139. package/dist/observer/run-routes.js +37 -12
  140. package/dist/observer/serve.d.ts +1 -1
  141. package/dist/observer-app.html +1 -1
  142. package/dist/routes/computer-use/bundle-parts.js +3 -2
  143. package/dist/routes/computer-use/bundle.d.ts +2 -2
  144. package/dist/routes/computer-use/bundle.js +7 -6
  145. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +5 -5
  146. package/dist/routes/computer-use/e2b-desktop/comms.js +5 -4
  147. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +1 -1
  148. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  149. package/dist/routes/computer-use/e2b-desktop/prepare.js +3 -3
  150. package/dist/routes/computer-use/e2b-desktop/start.js +3 -4
  151. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  152. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -3
  153. package/dist/routes/computer-use/external-comms.d.ts +3 -3
  154. package/dist/routes/computer-use/fanout-bundle.js +11 -10
  155. package/dist/routes/computer-use/fanout-records.js +2 -2
  156. package/dist/routes/computer-use/live-flush.d.ts +3 -3
  157. package/dist/routes/computer-use/live-phase.d.ts +2 -3
  158. package/dist/routes/computer-use/live-phase.js +3 -3
  159. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  160. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  161. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  162. package/dist/routes/computer-use/local-vm.js +2 -2
  163. package/dist/routes/computer-use/participant-desktop.d.ts +3 -3
  164. package/dist/routes/computer-use/participant-desktop.js +1 -1
  165. package/dist/routes/computer-use/participant-execution.js +1 -1
  166. package/dist/routes/computer-use/participant-model.js +3 -3
  167. package/dist/routes/computer-use/participant-prompt.d.ts +5 -5
  168. package/dist/routes/computer-use/participant-prompt.js +3 -3
  169. package/dist/routes/computer-use/participant-runs.d.ts +10 -10
  170. package/dist/routes/computer-use/participant-runs.js +14 -13
  171. package/dist/routes/computer-use/plan.d.ts +12 -12
  172. package/dist/routes/computer-use/plan.js +24 -24
  173. package/dist/routes/computer-use/preflight.d.ts +5 -5
  174. package/dist/routes/computer-use/preflight.js +5 -5
  175. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  176. package/dist/routes/computer-use/rerun-selection.js +3 -2
  177. package/dist/routes/computer-use/result.d.ts +4 -4
  178. package/dist/routes/computer-use/result.js +13 -12
  179. package/dist/routes/computer-use/route.d.ts +12 -12
  180. package/dist/routes/computer-use/route.js +19 -19
  181. package/dist/routes/computer-use/self-report.js +1 -1
  182. package/dist/routes/computer-use/setup.d.ts +22 -22
  183. package/dist/routes/computer-use/setup.js +15 -15
  184. package/dist/routes/computer-use/single-bundle.d.ts +4 -4
  185. package/dist/routes/computer-use/single-bundle.js +14 -13
  186. package/dist/routes/computer-use/subject-projection.d.ts +3 -3
  187. package/dist/routes/computer-use/types.d.ts +34 -34
  188. package/dist/routes/computer-use/types.js +3 -3
  189. package/dist/routes/preview.d.ts +6 -6
  190. package/dist/routes/preview.js +5 -5
  191. package/dist/routes/scripted/bundle.d.ts +6 -6
  192. package/dist/routes/scripted/bundle.js +10 -9
  193. package/dist/routes/scripted/plan.d.ts +7 -7
  194. package/dist/routes/scripted/plan.js +6 -6
  195. package/dist/routes/scripted/result.d.ts +3 -3
  196. package/dist/routes/scripted/result.js +9 -9
  197. package/dist/routes/scripted/route.d.ts +9 -9
  198. package/dist/routes/scripted/route.js +11 -11
  199. package/dist/routes/scripted/scenario.d.ts +1 -1
  200. package/dist/routes/scripted/scenario.js +3 -3
  201. package/dist/routes/scripted/setup.d.ts +6 -6
  202. package/dist/routes/scripted/setup.js +4 -4
  203. package/dist/routes/scripted/subject.d.ts +5 -5
  204. package/dist/routes/scripted/subject.js +3 -3
  205. package/dist/routes/scripted/surface-records.d.ts +1 -1
  206. package/dist/routes/scripted/surface-records.js +2 -2
  207. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  208. package/dist/routes/scripted/types.d.ts +17 -17
  209. package/dist/routes/scripted/types.js +1 -1
  210. package/dist/routes/shared-world/bundle-records.js +3 -3
  211. package/dist/routes/shared-world/bundle.js +15 -14
  212. package/dist/routes/shared-world/checkpoints.d.ts +3 -3
  213. package/dist/routes/shared-world/checkpoints.js +1 -1
  214. package/dist/routes/shared-world/comms.d.ts +9 -9
  215. package/dist/routes/shared-world/comms.js +6 -5
  216. package/dist/routes/shared-world/participant-specs.d.ts +3 -3
  217. package/dist/routes/shared-world/participant-specs.js +7 -7
  218. package/dist/routes/shared-world/plan.d.ts +9 -9
  219. package/dist/routes/shared-world/plan.js +9 -9
  220. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  221. package/dist/routes/shared-world/provisioned.js +4 -4
  222. package/dist/routes/shared-world/result.d.ts +6 -6
  223. package/dist/routes/shared-world/result.js +11 -10
  224. package/dist/routes/shared-world/route.d.ts +11 -11
  225. package/dist/routes/shared-world/route.js +19 -19
  226. package/dist/routes/shared-world/setup.d.ts +13 -13
  227. package/dist/routes/shared-world/setup.js +19 -19
  228. package/dist/routes/shared-world/types.d.ts +27 -27
  229. package/dist/routes/terminal/adapter.d.ts +2 -2
  230. package/dist/routes/terminal/adapter.js +4 -4
  231. package/dist/routes/terminal/bundle.d.ts +11 -11
  232. package/dist/routes/terminal/bundle.js +12 -12
  233. package/dist/routes/terminal/credentials.d.ts +4 -4
  234. package/dist/routes/terminal/credentials.js +5 -5
  235. package/dist/routes/terminal/dry-run.d.ts +4 -4
  236. package/dist/routes/terminal/dry-run.js +9 -9
  237. package/dist/routes/terminal/ledger.d.ts +2 -2
  238. package/dist/routes/terminal/lifetime.d.ts +1 -1
  239. package/dist/routes/terminal/lifetime.js +1 -1
  240. package/dist/routes/terminal/live-finish.d.ts +2 -2
  241. package/dist/routes/terminal/live-finish.js +7 -7
  242. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  243. package/dist/routes/terminal/live-sandbox.js +3 -2
  244. package/dist/routes/terminal/participant-text.js +2 -1
  245. package/dist/routes/terminal/persona.d.ts +2 -2
  246. package/dist/routes/terminal/persona.js +2 -2
  247. package/dist/routes/terminal/plan.d.ts +7 -7
  248. package/dist/routes/terminal/plan.js +5 -5
  249. package/dist/routes/terminal/result.d.ts +5 -5
  250. package/dist/routes/terminal/result.js +7 -7
  251. package/dist/routes/terminal/route.d.ts +9 -9
  252. package/dist/routes/terminal/route.js +14 -14
  253. package/dist/routes/terminal/session.d.ts +5 -5
  254. package/dist/routes/terminal/session.js +7 -7
  255. package/dist/routes/terminal/trace.d.ts +2 -2
  256. package/dist/routes/terminal/types.d.ts +24 -24
  257. package/dist/routes/terminal/types.js +2 -2
  258. package/dist/run/bundle.d.ts +7 -7
  259. package/dist/run/bundle.js +2 -2
  260. package/dist/run/costs.d.ts +23 -0
  261. package/dist/run/costs.js +72 -43
  262. package/dist/run/dry-run-inputs.d.ts +1 -1
  263. package/dist/run/dry-run-inputs.js +1 -1
  264. package/dist/run/dry-run.js +2 -2
  265. package/dist/run/outcomes.d.ts +1 -1
  266. package/dist/run/participant.d.ts +1 -1
  267. package/dist/run/preflight-receipts.js +1 -1
  268. package/dist/run/pricing.js +2 -2
  269. package/dist/run/projection.d.ts +32 -32
  270. package/dist/run/projection.js +44 -44
  271. package/dist/run/reclaim.d.ts +1 -1
  272. package/dist/run/reclaim.js +1 -1
  273. package/dist/run/results.d.ts +2 -2
  274. package/dist/run/run-cost.d.ts +53 -0
  275. package/dist/run/run-cost.js +105 -0
  276. package/dist/run/run-index-analysis.d.ts +15 -0
  277. package/dist/run/run-index-analysis.js +77 -0
  278. package/dist/run/run-index.d.ts +11 -1
  279. package/dist/run/run-index.js +63 -49
  280. package/dist/run/run.d.ts +3 -3
  281. package/dist/run/run.js +2 -2
  282. package/dist/run/shared-world-evidence.d.ts +1 -1
  283. package/dist/run/shared-world-shape.js +1 -1
  284. package/dist/run/stats.d.ts +3 -3
  285. package/dist/run/stats.js +14 -14
  286. package/dist/run/status.d.ts +10 -2
  287. package/dist/run/status.js +6 -3
  288. package/dist/run/streams.d.ts +2 -2
  289. package/dist/run/study-provenance.d.ts +4 -2
  290. package/dist/run/study-provenance.js +7 -4
  291. package/dist/run/study-result.d.ts +0 -5
  292. package/dist/run/study-result.js +1 -1
  293. package/dist/run-study.d.ts +112 -0
  294. package/dist/{run-lab.js → run-study.js} +52 -45
  295. package/dist/{lab → study}/adapter-extension.d.ts +8 -20
  296. package/dist/{lab → study}/adapter-extension.js +2 -14
  297. package/dist/{lab → study}/adapter-scorer-loader.d.ts +10 -10
  298. package/dist/{lab → study}/adapter-scorer-loader.js +3 -3
  299. package/dist/study/composition-rules.d.ts +7 -0
  300. package/dist/{lab → study}/composition-rules.js +12 -12
  301. package/dist/study/config.d.ts +15 -0
  302. package/dist/{lab → study}/config.js +37 -20
  303. package/dist/study/convert.d.ts +1 -1
  304. package/dist/study/convert.js +15 -15
  305. package/dist/{lab → study}/device-presets.d.ts +2 -2
  306. package/dist/{lab → study}/discover.d.ts +29 -23
  307. package/dist/{lab → study}/discover.js +97 -118
  308. package/dist/{lab → study}/doctor.d.ts +11 -11
  309. package/dist/{lab → study}/doctor.js +18 -18
  310. package/dist/study/files.d.ts +2 -2
  311. package/dist/study/files.js +6 -5
  312. package/dist/{lab → study}/init-templates.d.ts +2 -2
  313. package/dist/{lab → study}/init-templates.js +16 -11
  314. package/dist/{lab → study}/init.d.ts +1 -1
  315. package/dist/{lab → study}/init.js +7 -4
  316. package/dist/{lab → study}/keys.d.ts +2 -2
  317. package/dist/{lab → study}/keys.js +10 -10
  318. package/dist/study/migrate.d.ts +1 -1
  319. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  320. package/dist/{lab → study}/parse/actors.js +5 -5
  321. package/dist/study/parse/comms.d.ts +12 -0
  322. package/dist/study/parse/execution.d.ts +19 -0
  323. package/dist/{lab → study}/parse/study-v3.d.ts +3 -5
  324. package/dist/{lab → study}/parse/study-v3.js +3 -3
  325. package/dist/{lab → study}/parse/subject-state.d.ts +8 -8
  326. package/dist/{lab → study}/parse/subject-state.js +4 -4
  327. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  328. package/dist/{lab → study}/parse/subject.js +8 -8
  329. package/dist/{lab → study}/parse/values.d.ts +2 -2
  330. package/dist/{lab → study}/persona-resolve.d.ts +4 -4
  331. package/dist/{lab → study}/persona-resolve.js +2 -2
  332. package/dist/{lab → study}/plan-base.d.ts +7 -7
  333. package/dist/{lab → study}/plan-base.js +1 -1
  334. package/dist/{lab → study}/plan-participants.d.ts +10 -10
  335. package/dist/{lab → study}/plan-participants.js +4 -4
  336. package/dist/{lab → study}/plan-types.d.ts +28 -28
  337. package/dist/{lab → study}/plan-types.js +2 -2
  338. package/dist/study/plan.d.ts +13 -0
  339. package/dist/{lab → study}/plan.js +20 -20
  340. package/dist/study/preflight-probes.d.ts +3 -0
  341. package/dist/{lab → study}/preflight-probes.js +9 -8
  342. package/dist/study/preflight-result.d.ts +8 -0
  343. package/dist/{lab → study}/preflight-result.js +3 -3
  344. package/dist/{lab → study}/preflight.d.ts +31 -31
  345. package/dist/{lab → study}/preflight.js +8 -8
  346. package/dist/{lab → study}/requirements.d.ts +3 -3
  347. package/dist/{lab → study}/requirements.js +1 -1
  348. package/dist/study/route-inputs.d.ts +28 -0
  349. package/dist/{lab → study}/route-inputs.js +1 -1
  350. package/dist/{lab → study}/routing.d.ts +12 -12
  351. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -10
  352. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -3
  353. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +8 -17
  354. package/dist/study/run-study-homes.js +3 -0
  355. package/dist/study/run-study-options.d.ts +28 -0
  356. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +13 -12
  357. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +2 -2
  358. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  359. package/dist/{lab → study}/summary.d.ts +10 -10
  360. package/dist/{lab → study}/summary.js +15 -15
  361. package/dist/{lab → study}/tasks.d.ts +3 -3
  362. package/dist/{lab → study}/tasks.js +1 -1
  363. package/dist/{lab → study}/types.d.ts +104 -104
  364. package/dist/{lab → study}/types.js +1 -1
  365. package/dist/{lab → study}/validation.d.ts +19 -19
  366. package/dist/{lab → study}/validation.js +13 -13
  367. package/dist/{lab → study}/warnings.d.ts +4 -4
  368. package/dist/{lab → study}/warnings.js +1 -1
  369. package/dist/subject/clone.d.ts +6 -6
  370. package/dist/subject/clone.js +2 -2
  371. package/dist/subject/local-tree-archive.d.ts +2 -2
  372. package/dist/subject/local-tree-archive.js +3 -3
  373. package/dist/subject/local-tree.d.ts +3 -3
  374. package/dist/subject/runtime.js +2 -2
  375. package/dist/subject/serve.d.ts +4 -4
  376. package/dist/subject/state.d.ts +3 -3
  377. package/dist/subject/state.js +1 -1
  378. package/dist/subject/steps.d.ts +1 -1
  379. package/dist/subject/steps.js +1 -1
  380. package/dist/substrates/desktop-session.js +2 -2
  381. package/dist/substrates/detached.d.ts +1 -1
  382. package/dist/substrates/e2b/desktop-browser.d.ts +4 -4
  383. package/dist/substrates/e2b/desktop-browser.js +1 -1
  384. package/dist/substrates/e2b/desktop-cdp.d.ts +1 -1
  385. package/dist/substrates/e2b/desktop-cdp.js +1 -1
  386. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  387. package/dist/substrates/e2b/desktop-executor.js +12 -12
  388. package/dist/substrates/e2b/desktop-geometry.d.ts +1 -1
  389. package/dist/substrates/e2b/desktop-geometry.js +1 -1
  390. package/dist/substrates/e2b/desktop-media.d.ts +3 -3
  391. package/dist/substrates/e2b/lifetime.js +1 -1
  392. package/dist/substrates/e2b/sandbox.d.ts +3 -3
  393. package/dist/substrates/e2b/sandbox.js +1 -1
  394. package/dist/substrates/e2b/sdk.d.ts +1 -1
  395. package/dist/substrates/e2b/sdk.js +1 -1
  396. package/dist/substrates/local/runtime-config.d.ts +4 -4
  397. package/dist/substrates/local/runtime-config.js +4 -4
  398. package/dist/tui/contract.d.ts +8 -8
  399. package/dist/tui/contract.js +2 -2
  400. package/dist/tui/launch.d.ts +3 -3
  401. package/dist/tui/launch.js +22 -16
  402. package/dist/tui-app.js +139 -139
  403. package/dist/verify/subject.d.ts +1 -1
  404. package/dist/verify/subject.js +1 -1
  405. package/dist/verify/verify.js +2 -1
  406. package/docs/architecture/actor-contract.md +5 -5
  407. package/docs/architecture/browser-control.md +1 -1
  408. package/docs/architecture/external-public-shared-world.md +8 -7
  409. package/docs/architecture/github-feedback-loop.md +1 -1
  410. package/docs/architecture/task-protocol-support.md +1 -1
  411. package/docs/architecture/terminal-product-route.md +18 -18
  412. package/docs/contracts/adapter-fixtures.md +2 -2
  413. package/docs/contracts/errors.md +8 -8
  414. package/docs/contracts/run-bundle.md +1 -4
  415. package/docs/contracts/schemas.md +61 -42
  416. package/docs/contracts/study-analysis.md +4 -1
  417. package/docs/contracts/study-costs.md +17 -2
  418. package/examples/README.md +1 -1
  419. package/examples/scorer/scorer.mjs +3 -3
  420. package/package.json +1 -1
  421. package/skills/humanish/SKILL.md +8 -6
  422. package/skills/humanish/agents/openai.yaml +1 -1
  423. package/dist/cli/commands/lab-format.d.ts +0 -9
  424. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  425. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  426. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  427. package/dist/cli/commands/lab-run.d.ts +0 -9
  428. package/dist/lab/composition-rules.d.ts +0 -7
  429. package/dist/lab/config.d.ts +0 -7
  430. package/dist/lab/deprecated-fields.d.ts +0 -10
  431. package/dist/lab/deprecated-fields.js +0 -24
  432. package/dist/lab/parse/comms.d.ts +0 -12
  433. package/dist/lab/parse/execution.d.ts +0 -19
  434. package/dist/lab/plan.d.ts +0 -13
  435. package/dist/lab/preflight-probes.d.ts +0 -3
  436. package/dist/lab/preflight-result.d.ts +0 -8
  437. package/dist/lab/route-inputs.d.ts +0 -28
  438. package/dist/lab/run-lab-homes.js +0 -7
  439. package/dist/lab/run-lab-options.d.ts +0 -28
  440. package/dist/library-aliases.d.ts +0 -56
  441. package/dist/library-aliases.js +0 -22
  442. package/dist/run-lab.d.ts +0 -112
  443. /package/dist/{lab → study}/device-presets.js +0 -0
  444. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  445. /package/dist/{lab → study}/init-paths.js +0 -0
  446. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  447. /package/dist/{lab → study}/init-plan.js +0 -0
  448. /package/dist/{lab → study}/parse/comms.js +0 -0
  449. /package/dist/{lab → study}/parse/execution.js +0 -0
  450. /package/dist/{lab → study}/parse/values.js +0 -0
  451. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  452. /package/dist/{lab → study}/participant-assignment.js +0 -0
  453. /package/dist/{lab → study}/persona.d.ts +0 -0
  454. /package/dist/{lab → study}/persona.js +0 -0
  455. /package/dist/{lab → study}/routing.js +0 -0
@@ -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) => {
@@ -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,11 +1,11 @@
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) => ({
@@ -13,7 +13,7 @@ const unsupported = (option, route, reason) => ({
13
13
  code: "HUMANISH_STUDY_OPTION_UNSUPPORTED",
14
14
  message: `RunLabOptions.${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.
@@ -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 }),
@@ -12,7 +12,7 @@ declare const TASK_FUNNEL_SCHEMA: "humanish.task-funnel.v1";
12
12
  * how they will be judged changes what they do. A persona told "you succeed when the URL contains
13
13
  * /dashboard" will go find that URL, which measures the instruction rather than the product.
14
14
  */
15
- export interface LabTask {
15
+ export interface StudyTask {
16
16
  /** Stable id, used in evidence and in the funnel. Researcher-facing. */
17
17
  id: string;
18
18
  /** Participant-facing. What they are asked to do. The only half that reaches the prompt. */
@@ -68,7 +68,7 @@ export declare class TaskTracker {
68
68
  /** Which observation fields were ever populated this session. A criterion whose field never
69
69
  * arrived was never evaluated against anything, however many turns ran. */
70
70
  private readonly fieldsSeen;
71
- constructor(tasks: readonly LabTask[]);
71
+ constructor(tasks: readonly StudyTask[]);
72
72
  /** Evaluate every still-incomplete task against one observation. Returns newly completed tasks. */
73
73
  observe(observation: StopConditionObservation, turn: number): TaskCompletion[];
74
74
  /** Which observation fields a task's criteria actually read. A task whose rules need `url` was
@@ -85,7 +85,7 @@ export declare class TaskTracker {
85
85
  * and the study stops being about the product. A test pins this, because it is the kind of leak a
86
86
  * later convenience change makes without noticing.
87
87
  */
88
- export declare function renderTaskPrompt(tasks: readonly LabTask[]): string | undefined;
88
+ export declare function renderTaskPrompt(tasks: readonly StudyTask[]): string | undefined;
89
89
  /** One line a stakeholder can read, with the denominator attached. */
90
90
  export declare function formatTaskFunnel(funnel: TaskFunnel): string;
91
91
  export {};
@@ -1,6 +1,6 @@
1
1
  // Tasks: the researcher's protocol, expressed as config (docs/principles/three-roles.md).
2
2
  //
3
- // A lab could declare a prose `mission` and nothing else. That is a brief, not a protocol, and it
3
+ // A study could declare a prose `mission` and nothing else. That is a brief, not a protocol, and it
4
4
  // left "where did people get stuck" answerable only from an actor's own narration, which is the one
5
5
  // source a study should not have to take on faith.
6
6
  //