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
- // Who takes part in a lab: one record per participant, built from the declared roster or a count.
1
+ // Who takes part in a study: one record per participant, built from the declared roster or a count.
2
2
  // Computer-use and shared-world participants share the desktop fields; each kind adds its own.
3
3
  import { resolveParticipantDevice } from "./device-presets.js";
4
4
  import { isSharedWorldComposition, participantIdAt } from "./routing.js";
@@ -35,7 +35,7 @@ function desktopParticipant(config, entry, index, kind, focus) {
35
35
  };
36
36
  }
37
37
  /**
38
- * The participants of a computer-use lab: the declared roster, else `count` identical ones. A count
38
+ * The participants of a computer-use study: the declared roster, else `count` identical ones. A count
39
39
  * override (`--count`) applies only when no roster is declared.
40
40
  */
41
41
  export function computerUseParticipants(config, countOverride) {
@@ -52,7 +52,7 @@ export function computerUseParticipants(config, countOverride) {
52
52
  };
53
53
  });
54
54
  }
55
- /** The participants of a shared-world lab, one per roster entry, typed by the plane they share. */
55
+ /** The participants of a shared-world study, one per roster entry, typed by the plane they share. */
56
56
  export function sharedWorldParticipants(config) {
57
57
  const roster = rosterOf(config.actors[0]) ?? [];
58
58
  const participantAt = (entry, index) => desktopParticipant(config, entry, index, "seat", entry.instruction);
@@ -73,7 +73,7 @@ export function sharedWorldParticipants(config) {
73
73
  })),
74
74
  };
75
75
  }
76
- /** The ids of the participants a computer-use or shared-world lab runs, in roster order. */
76
+ /** The ids of the participants a computer-use or shared-world study runs, in roster order. */
77
77
  export function declaredParticipantIds(config) {
78
78
  const actor = config.actors[0];
79
79
  const roster = rosterOf(actor);
@@ -8,12 +8,12 @@ import type { RunStudyProvenance } from "../run/study-provenance.js";
8
8
  import type { ComputerUseRefusal } from "../routes/computer-use/plan.js";
9
9
  import type { SharedWorldRefusal } from "../routes/shared-world/plan.js";
10
10
  import type { ComputerUseParticipant, ExternalPublicParticipant, ProvisionedParticipant } from "./plan-participants.js";
11
- import type { LabConfig, LabExecutionTerminal, LabRuntimeAuth, LabScenarioCaps, LabSubjectProduct, LabSubjectServe, LabSubjectState, LabSubjectStateCheckpoint } from "./types.js";
11
+ import type { StudyConfig, StudyExecutionTerminal, StudyRuntimeAuth, StudyScenarioCaps, StudySubjectProduct, StudySubjectServe, StudySubjectState, StudySubjectStateCheckpoint } from "./types.js";
12
12
  export type NonEmpty<T> = readonly [T, ...T[]];
13
13
  type AtLeastTwo<T> = readonly [T, T, ...T[]];
14
14
  /**
15
15
  * Something a route checks right before acquisition. Preflight refuses on, and doctor and the TUI
16
- * report, the keys and subject env listed here, through src/lab/requirements.ts.
16
+ * report, the keys and subject env listed here, through src/study/requirements.ts.
17
17
  */
18
18
  export type Requirement = {
19
19
  readonly kind: "key";
@@ -48,21 +48,21 @@ export type Requirement = {
48
48
  * VM study read it before a plan exists. Shared world, terminal and scripted still read some config
49
49
  * fields at run time.
50
50
  */
51
- export type ResidualConfig = Pick<LabConfig, "comms" | "policies" | "personas" | "defaults" | "review"> & {
52
- readonly execution?: Pick<NonNullable<LabConfig["execution"]>, "desktop" | "target">;
53
- readonly subject: Pick<LabConfig["subject"], "clone" | "localTree" | "repos" | "envValues">;
51
+ export type ResidualConfig = Pick<StudyConfig, "comms" | "policies" | "personas" | "defaults" | "review"> & {
52
+ readonly execution?: Pick<NonNullable<StudyConfig["execution"]>, "desktop" | "target">;
53
+ readonly subject: Pick<StudyConfig["subject"], "clone" | "localTree" | "repos" | "envValues">;
54
54
  };
55
55
  export interface PlannedAnalysis {
56
56
  readonly config: AnalysisConfig;
57
- /** "default" when the lab declared no review.analysis. */
57
+ /** "default" when the study declared no review.analysis. */
58
58
  readonly trigger: "default" | "explicit";
59
59
  readonly preferLargerOutput: boolean;
60
60
  }
61
61
  interface PlanBase {
62
- readonly labId: string;
63
- /** The lab's declared title, which bundles record. */
62
+ readonly studyId: string;
63
+ /** The study's declared title, which bundles record. */
64
64
  readonly title?: string;
65
- readonly lab?: RunStudyProvenance;
65
+ readonly study?: RunStudyProvenance;
66
66
  /** A frozen copy owned by the plan. */
67
67
  readonly residual: Readonly<ResidualConfig>;
68
68
  readonly dryRun: boolean;
@@ -83,7 +83,7 @@ interface PreviewPlan extends PlanBase {
83
83
  }
84
84
  /**
85
85
  * The model driving a desktop participant. `caller` is the library caller's createProvider.
86
- * `declaredModel` is actors[0].model as the lab wrote it, absent when undeclared: the providers
86
+ * `declaredModel` is actors[0].model as the study wrote it, absent when undeclared: the providers
87
87
  * take it as written, and spend is priced at it, else the default (pricedModel). An openai
88
88
  * brain's `model` is the one its provider runs, with that default applied.
89
89
  */
@@ -102,14 +102,14 @@ export type Brain = {
102
102
  export type ProvisionedSubject = {
103
103
  readonly kind: "clone";
104
104
  readonly repo: string;
105
- readonly serve: LabSubjectServe;
105
+ readonly serve: StudySubjectServe;
106
106
  readonly env: readonly string[];
107
- readonly state?: LabSubjectState;
107
+ readonly state?: StudySubjectState;
108
108
  } | {
109
109
  readonly kind: "local-tree";
110
- readonly serve: LabSubjectServe;
110
+ readonly serve: StudySubjectServe;
111
111
  readonly env: readonly string[];
112
- readonly state?: LabSubjectState;
112
+ readonly state?: StudySubjectState;
113
113
  };
114
114
  export interface AppUrlSubject {
115
115
  readonly kind: "app-url";
@@ -131,7 +131,7 @@ export type ComputerUseRunner = {
131
131
  readonly participants: NonEmpty<ComputerUseParticipant>;
132
132
  readonly subject: AppUrlSubject | ProvisionedSubject | {
133
133
  readonly kind: "desktop-cli";
134
- readonly product: LabSubjectProduct;
134
+ readonly product: StudySubjectProduct;
135
135
  /** As on AppUrlSubject: a library config's declared `subject.serve.url`. */
136
136
  readonly serveUrl?: string;
137
137
  };
@@ -172,8 +172,8 @@ export interface ComputerUsePlan extends PlanBase {
172
172
  readonly participantIds?: readonly string[];
173
173
  };
174
174
  }
175
- type CheckpointedState = LabSubjectState & {
176
- readonly checkpoint: NonEmpty<LabSubjectStateCheckpoint>;
175
+ type CheckpointedState = StudySubjectState & {
176
+ readonly checkpoint: NonEmpty<StudySubjectStateCheckpoint>;
177
177
  };
178
178
  export type SharedWorldPlane = {
179
179
  readonly kind: "provisioned";
@@ -208,7 +208,7 @@ export type TerminalPlan = PlanBase & {
208
208
  readonly route: "terminal";
209
209
  /** The registered terminal actor that runs. */
210
210
  readonly actor: string;
211
- readonly product: LabSubjectProduct & {
211
+ readonly product: StudySubjectProduct & {
212
212
  readonly publicSurfaces: NonEmpty<string>;
213
213
  };
214
214
  /** The declared persona and mission; the route supplies its defaults. */
@@ -218,21 +218,21 @@ export type TerminalPlan = PlanBase & {
218
218
  readonly version?: string;
219
219
  /** Passed to Codex as `--model` on every run, so the bundle can name and price it. */
220
220
  readonly model: string;
221
- /** `declared` by the lab's actor, or humanish's participant default. */
221
+ /** `declared` by the study's actor, or humanish's participant default. */
222
222
  readonly modelSource: "declared" | "humanish_default";
223
223
  readonly reasoningEffort?: ReasoningEffort;
224
- readonly auth?: LabRuntimeAuth;
224
+ readonly auth?: StudyRuntimeAuth;
225
225
  };
226
226
  /** The declared egress routing allowlist; without one the sandbox egress is unrestricted. */
227
227
  readonly egressAllow?: readonly string[];
228
228
  /** The declared operator stdin posture; the route defaults to "disabled". */
229
- readonly stdin?: NonNullable<LabExecutionTerminal["stdin"]>;
229
+ readonly stdin?: NonNullable<StudyExecutionTerminal["stdin"]>;
230
230
  } & ({
231
231
  readonly dryRun: true;
232
- readonly caps?: LabScenarioCaps;
232
+ readonly caps?: StudyScenarioCaps;
233
233
  } | {
234
234
  readonly dryRun: false;
235
- readonly caps: LabScenarioCaps & {
235
+ readonly caps: StudyScenarioCaps & {
236
236
  readonly maxUsd: number;
237
237
  readonly maxMinutes: number;
238
238
  };
@@ -259,9 +259,9 @@ export interface ScriptedPlan extends PlanBase {
259
259
  readonly personaId?: string;
260
260
  readonly sessionTimeoutMs?: number;
261
261
  }
262
- export type LabPlan = PreviewPlan | ComputerUsePlan | SharedWorldPlan | TerminalPlan | ScriptedPlan;
263
- interface PlannedLab {
264
- readonly plan: LabPlan;
262
+ export type StudyPlan = PreviewPlan | ComputerUsePlan | SharedWorldPlan | TerminalPlan | ScriptedPlan;
263
+ interface PlannedStudy {
264
+ readonly plan: StudyPlan;
265
265
  }
266
266
  /**
267
267
  * The error a route returns before a run starts: the route, its error code and a message. Each
@@ -283,11 +283,11 @@ export type RoutePlanResult<Plan, Refusal> = {
283
283
  };
284
284
  /** The error codes the preview route returns before a run starts. */
285
285
  export type PreviewRefusalCode = "HUMANISH_STUDY_COMMS_UNSUPPORTED" | "HUMANISH_STUDY_ANALYSIS_INVALID" | "HUMANISH_STUDY_ANALYSIS_UNSUPPORTED" | "HUMANISH_STUDY_TASKS_UNSUPPORTED" | "HUMANISH_INVALID_PARTICIPANT_COUNT" | "HUMANISH_LIVE_RUN_UNIMPLEMENTED";
286
- /** Why planLab refused: the route's own code and message, as its runner returns them. */
286
+ /** Why planStudy refused: the route's own code and message, as its runner returns them. */
287
287
  export type PlanRefusal = RouteRefusal<"preview", PreviewRefusalCode> | TerminalRefusal | ScriptedRefusal | ComputerUseRefusal | SharedWorldRefusal;
288
288
  export type PlanResult = {
289
289
  readonly ok: true;
290
- readonly planned: PlannedLab;
290
+ readonly planned: PlannedStudy;
291
291
  } | {
292
292
  readonly ok: false;
293
293
  readonly refusal: PlanRefusal;
@@ -1,5 +1,5 @@
1
- // The LabPlan union: what planLab decides about a lab before anything runs. Each route has its own
1
+ // The StudyPlan union: what planStudy decides about a study before anything runs. Each route has its own
2
2
  // variant, and each supported subject and substrate pairing is its own case, so a combination the
3
3
  // routes refuse cannot be written down. Numeric bounds, unique ids, safe URLs and "exactly one
4
- // host" stay checks in planLab.
4
+ // host" stay checks in planStudy.
5
5
  export {};
@@ -0,0 +1,13 @@
1
+ import type { InternalRunStudyOptions } from "../run-study.js";
2
+ import type { StudyDeps } from "./study-deps.js";
3
+ import type { PlanResult } from "./plan-types.js";
4
+ import type { StudyConfig } from "./types.js";
5
+ export { routeOf, type StudyRoute } from "./routing.js";
6
+ /** Resolve dry-run: explicit override wins, else the scenario mode, else the given fallback. */
7
+ export declare function resolveStudyDryRun(config: StudyConfig, override: boolean | undefined, fallback: boolean | undefined): boolean | undefined;
8
+ /**
9
+ * The plan a study runs under, built without reading files, env or the network. Each route's planner
10
+ * makes every refusal that route makes, in the route's order and with its codes and messages; the
11
+ * route's exported runner calls the same planner.
12
+ */
13
+ export declare function planStudy(config: StudyConfig, options: InternalRunStudyOptions, deps?: StudyDeps): PlanResult;
@@ -1,11 +1,11 @@
1
- // The route decision. A lab's route follows from its composition (subject.source,
1
+ // The route decision. A study's route follows from its composition (subject.source,
2
2
  // execution.target, the first actor's registered run kind, subject.topology), never from a
3
3
  // declared kind. This is the only function that decides it.
4
4
  import { resolveAutomaticAnalysis } from "../analysis/automatic-config.js";
5
- import { callerDrivingOf, planComputerUseLab } from "../routes/computer-use/plan.js";
6
- import { injectedBrowser, planScriptedLab } from "../routes/scripted/plan.js";
7
- import { planSharedWorldLab } from "../routes/shared-world/plan.js";
8
- import { planTerminalLab } from "../routes/terminal/plan.js";
5
+ import { callerDrivingOf, planComputerUseStudy } from "../routes/computer-use/plan.js";
6
+ import { injectedBrowser, planScriptedStudy } from "../routes/scripted/plan.js";
7
+ import { planSharedWorldStudy } from "../routes/shared-world/plan.js";
8
+ import { planTerminalStudy } from "../routes/terminal/plan.js";
9
9
  import { localBrowserDefaults } from "../substrates/local/runtime-config.js";
10
10
  import { THIS_REPO_DRY_RUN_ONLY } from "./composition-rules.js";
11
11
  import { planBase } from "./plan-base.js";
@@ -13,7 +13,7 @@ import { routeOf } from "./routing.js";
13
13
  import { automaticAnalysisRouteReason, taskProtocolValidationReason } from "./validation.js";
14
14
  export { routeOf } from "./routing.js";
15
15
  /** Resolve dry-run: explicit override wins, else the scenario mode, else the given fallback. */
16
- export function resolveLabDryRun(config, override, fallback) {
16
+ export function resolveStudyDryRun(config, override, fallback) {
17
17
  if (override !== undefined) {
18
18
  return override;
19
19
  }
@@ -35,7 +35,7 @@ function planPreview(config, options, input) {
35
35
  refusal: { route: "preview", code, message },
36
36
  });
37
37
  if (String(config.comms?.email?.kind) === "real")
38
- return refuse("HUMANISH_STUDY_COMMS_UNSUPPORTED", "Real email receiving is unsupported on the preview route. Use a supported hosted computer-use lab.");
38
+ return refuse("HUMANISH_STUDY_COMMS_UNSUPPORTED", "Real email receiving is unsupported on the preview route. Use a supported hosted computer-use study.");
39
39
  const analysis = resolveAutomaticAnalysis(config.review?.analysis);
40
40
  if (!analysis.ok)
41
41
  return refuse("HUMANISH_STUDY_ANALYSIS_INVALID", analysis.message);
@@ -61,27 +61,27 @@ function planPreview(config, options, input) {
61
61
  };
62
62
  }
63
63
  /**
64
- * The plan a lab runs under, built without reading files, env or the network. Each route's planner
64
+ * The plan a study runs under, built without reading files, env or the network. Each route's planner
65
65
  * makes every refusal that route makes, in the route's order and with its codes and messages; the
66
66
  * route's exported runner calls the same planner.
67
67
  */
68
- export function planLab(config, options, deps = {}) {
69
- const lab = localBrowserDefaults(config);
70
- const input = { dryRun: resolveLabDryRun(lab, options.dryRun, true) ?? true };
71
- const result = planRoute(routeOf(config), lab, options, input, deps);
68
+ export function planStudy(config, options, deps = {}) {
69
+ const study = localBrowserDefaults(config);
70
+ const input = { dryRun: resolveStudyDryRun(study, options.dryRun, true) ?? true };
71
+ const result = planRoute(routeOf(config), study, options, input, deps);
72
72
  if (!result.ok)
73
73
  return result;
74
74
  // The manifest the CLI resolved enters the plan here and nowhere else; the routes read
75
- // plan.lab for the run's status record and bundle.
76
- const plan = options.lab === undefined ? result.plan : { ...result.plan, lab: options.lab };
75
+ // plan.study for the run's status record and bundle.
76
+ const plan = options.study === undefined ? result.plan : { ...result.plan, study: options.study };
77
77
  return { ok: true, planned: { plan } };
78
78
  }
79
- function planRoute(route, lab, options, input, deps) {
79
+ function planRoute(route, study, options, input, deps) {
80
80
  switch (route) {
81
81
  case "preview":
82
- return planPreview(lab, options, input);
82
+ return planPreview(study, options, input);
83
83
  case "computer-use":
84
- return planComputerUseLab(lab, {
84
+ return planComputerUseStudy(study, {
85
85
  ...input,
86
86
  hasRunSession: deps.runSession !== undefined,
87
87
  driving: callerDrivingOf(options),
@@ -89,13 +89,13 @@ function planRoute(route, lab, options, input, deps) {
89
89
  ...(options.rerun === undefined ? {} : { rerun: options.rerun }),
90
90
  });
91
91
  case "shared-world":
92
- return planSharedWorldLab(lab, {
92
+ return planSharedWorldStudy(study, {
93
93
  ...input,
94
94
  hasRunSession: deps.runSession !== undefined,
95
95
  });
96
96
  case "terminal":
97
- return planTerminalLab(lab, { ...input, hasCostProbe: deps.costProbe !== undefined });
97
+ return planTerminalStudy(study, { ...input, hasCostProbe: deps.costProbe !== undefined });
98
98
  case "scripted":
99
- return planScriptedLab(lab, { ...input, injectedBrowser: injectedBrowser(deps) });
99
+ return planScriptedStudy(study, { ...input, injectedBrowser: injectedBrowser(deps) });
100
100
  }
101
101
  }
@@ -0,0 +1,3 @@
1
+ import type { StudyPreflightResult, PreflightContext } from "./preflight.js";
2
+ export declare function runPublicPreviewPreflight(ctx: PreflightContext): Promise<StudyPreflightResult>;
3
+ export declare function runSandboxLoopbackPreflight(ctx: PreflightContext): Promise<StudyPreflightResult>;
@@ -1,9 +1,9 @@
1
- // The two reachability probes `humanish lab preflight` can run: public-preview checks a public
1
+ // The two reachability probes `humanish study check` can run: public-preview checks a public
2
2
  // target from an E2B desktop, and sandbox-loopback serves a clone subject inside one. Each leases one
3
3
  // sandbox, journals it for `humanish reclaim --preflight`, and tears it down. preflight.ts resolves
4
- // the lab and dispatches here.
4
+ // the study and dispatches here.
5
5
  import { cloneProvisioningBudgetMs, provisionCloneSubject } from "../subject/clone.js";
6
- import { CUA_ACTOR_LAB_PROVIDER_METADATA } from "../routes/computer-use/e2b-desktop/prepare.js";
6
+ import { CUA_ACTOR_STUDY_PROVIDER_METADATA } from "../routes/computer-use/e2b-desktop/prepare.js";
7
7
  import { MAX_SANDBOX_MS } from "../substrates/e2b/lifetime.js";
8
8
  import { abandonPreflightJournal, discardPreflightJournal, openPreflightJournal, } from "../run/preflight-receipts.js";
9
9
  import { probeUrl } from "../substrates/detached.js";
@@ -13,6 +13,7 @@ import { e2bShell } from "../substrates/e2b/shell.js";
13
13
  import { redactText } from "../evidence/redaction.js";
14
14
  import { digest, fail, finalize } from "./preflight-result.js";
15
15
  import { rosterOf } from "./parse/actors.js";
16
+ import { plural } from "../run/text.js";
16
17
  const DEFAULT_REQUEST_TIMEOUT_MS = 60_000;
17
18
  // Room on the probe's lease for desktop boot and teardown around the work it does.
18
19
  const PREFLIGHT_LEASE_BUFFER_MS = 5 * 60_000;
@@ -92,7 +93,7 @@ export async function runSandboxLoopbackPreflight(ctx) {
92
93
  {
93
94
  name: "subject env",
94
95
  ok: false,
95
- message: `${missingEnv.length} declared env var value(s) missing`,
96
+ message: `${plural(missingEnv.length, "declared env var value")} missing`,
96
97
  },
97
98
  ]);
98
99
  }
@@ -106,7 +107,7 @@ export async function runSandboxLoopbackPreflight(ctx) {
106
107
  return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_UNSUPPORTED_ROUTE", "sandbox-loopback preflight requires one clone repo and subject.serve.", [{ name: "clone subject", ok: false, message: "missing repo or serve block" }]);
107
108
  }
108
109
  let subjectCommitDigest;
109
- // The longest the clone and serve steps can take with the lab's own budgets, so the probe is
110
+ // The longest the clone and serve steps can take with the study's own budgets, so the probe is
110
111
  // never cut off where the run's provisioning would still be allowed to finish.
111
112
  const leaseMs = cloneProvisioningBudgetMs(serve, ctx.config.subject.state) + PREFLIGHT_LEASE_BUFFER_MS;
112
113
  const probe = await withPreflightSandbox(ctx, { e2bApiKey, leaseMs }, async (shell) => {
@@ -167,7 +168,7 @@ async function withPreflightSandbox(ctx, args, callback) {
167
168
  timeoutMs,
168
169
  lifecycle: { onTimeout: "kill" },
169
170
  metadata: {
170
- ...CUA_ACTOR_LAB_PROVIDER_METADATA,
171
+ ...CUA_ACTOR_STUDY_PROVIDER_METADATA,
171
172
  mode: "lab-preflight",
172
173
  labId: ctx.config.id,
173
174
  reachability: ctx.reachability,
@@ -282,7 +283,7 @@ function publicPreviewRouteError(config, route) {
282
283
  if (route !== "computer-use" ||
283
284
  config.subject.source !== "app-url" ||
284
285
  config.execution?.target !== "e2b-desktop") {
285
- return "public-preview preflight supports app-url × e2b-desktop computer-use labs.";
286
+ return "public-preview preflight supports app-url × e2b-desktop computer-use studies.";
286
287
  }
287
288
  if (config.policies?.allowPublicTargets !== true) {
288
289
  return "public-preview preflight requires policies.allowPublicTargets: true so the owner explicitly declares the public/preview target.";
@@ -293,7 +294,7 @@ function sandboxLoopbackRouteError(config, route) {
293
294
  if (route !== "computer-use" ||
294
295
  config.subject.source !== "clone" ||
295
296
  config.execution?.target !== "e2b-desktop") {
296
- return "sandbox-loopback preflight supports clone × e2b-desktop computer-use labs. (local-tree labs are not preflightable yet: see the local-tree goal doc's out-of-scope list; a dry run of the lab is the current no-spend check.)";
297
+ return "sandbox-loopback preflight supports clone × e2b-desktop computer-use studies. Local-tree studies cannot be preflighted yet; a dry run of the study is the current no-spend check.";
297
298
  }
298
299
  if (!config.subject.serve) {
299
300
  return "sandbox-loopback preflight requires subject.serve.";
@@ -0,0 +1,8 @@
1
+ import type { StudyPreflightCheck, StudyPreflightResult, PreflightContext } from "./preflight.js";
2
+ /** The schema of `study check` results: whether a study is ready to run on this machine. */
3
+ export declare const STUDY_CHECK_SCHEMA = "humanish.study-check.v1";
4
+ export declare function finalize(ctx: PreflightContext, args?: {
5
+ check?: StudyPreflightCheck;
6
+ }): StudyPreflightResult;
7
+ export declare function fail(ctx: PreflightContext, code: NonNullable<StudyPreflightResult["error"]>["code"], message: string, checks: StudyPreflightCheck[]): StudyPreflightResult;
8
+ export declare function digest(value: string): string;
@@ -2,7 +2,7 @@
2
2
  // preflight-probes.ts both finish through these, so they live below both.
3
3
  import { automaticAnalysisBudget } from "../analysis/automatic-config.js";
4
4
  import { digestText } from "../evidence/redaction.js";
5
- /** The schema of `lab preflight` results: whether a study is ready to run on this machine. */
5
+ /** The schema of `study check` results: whether a study is ready to run on this machine. */
6
6
  export const STUDY_CHECK_SCHEMA = "humanish.study-check.v1";
7
7
  export function finalize(ctx, args) {
8
8
  const checks = args?.check ? [...ctx.checks, args.check] : ctx.checks;
@@ -13,8 +13,8 @@ export function finalize(ctx, args) {
13
13
  ok: checks.every((check) => check.ok) &&
14
14
  ctx.targets.every((target) => target.status !== "failed" && target.status !== "blocked"),
15
15
  cwd: ctx.cwd,
16
- study: ctx.lab,
17
- studyId: ctx.labId,
16
+ study: ctx.study,
17
+ studyId: ctx.studyId,
18
18
  origin: ctx.origin,
19
19
  path: ctx.path,
20
20
  route: ctx.route,
@@ -1,16 +1,16 @@
1
1
  import type { AutomaticAnalysisBudget } from "../analysis/automatic-config.js";
2
2
  import type { E2BDesktopModule } from "../substrates/e2b/sdk.js";
3
- import { type LabConfig } from "./types.js";
3
+ import { type StudyConfig } from "./types.js";
4
4
  import { STUDY_CHECK_SCHEMA } from "./preflight-result.js";
5
- import { type LabRoute } from "./plan.js";
6
- import { type LabResolveFailure } from "./discover.js";
7
- export type LabPreflightReachabilityMode = "metadata" | "public-preview" | "sandbox-loopback" | "prepared-host";
8
- export interface LabPreflightCheck {
5
+ import { type StudyRoute } from "./plan.js";
6
+ import { type StudyResolveFailure } from "./discover.js";
7
+ export type StudyPreflightReachabilityMode = "metadata" | "public-preview" | "sandbox-loopback" | "prepared-host";
8
+ export interface StudyPreflightCheck {
9
9
  name: string;
10
10
  ok: boolean;
11
11
  message: string;
12
12
  }
13
- export interface LabPreflightTarget {
13
+ export interface StudyPreflightTarget {
14
14
  label: string;
15
15
  kind: "subject.appUrl" | "actors[0].lanes[].target" | "subject.serve.url" | "subject.product.publicSurface";
16
16
  targetDigest: string;
@@ -23,7 +23,7 @@ export interface LabPreflightTarget {
23
23
  errorCode?: "HUMANISH_PREFLIGHT_TARGET_BLOCKED" | "HUMANISH_PREFLIGHT_TARGET_UNREACHABLE";
24
24
  message: string;
25
25
  }
26
- interface LabPreflightSandbox {
26
+ interface StudyPreflightSandbox {
27
27
  created: boolean;
28
28
  killed?: boolean;
29
29
  /** The probe's server-side timeout, after which the provider kills it. */
@@ -31,11 +31,11 @@ interface LabPreflightSandbox {
31
31
  sandboxIdDigest?: string;
32
32
  template?: string;
33
33
  }
34
- interface LabPreflightSpend {
34
+ interface StudyPreflightSpend {
35
35
  e2bDesktop: boolean;
36
36
  model: false;
37
37
  }
38
- export interface LabPreflightResult {
38
+ export interface StudyPreflightResult {
39
39
  /** The separate budget for a future live run, never spend by preflight itself. */
40
40
  analysis?: AutomaticAnalysisBudget;
41
41
  schema: typeof STUDY_CHECK_SCHEMA;
@@ -47,48 +47,48 @@ export interface LabPreflightResult {
47
47
  studyId?: string;
48
48
  origin?: string;
49
49
  path?: string;
50
- route?: LabRoute;
51
- reachability: LabPreflightReachabilityMode;
52
- checks: LabPreflightCheck[];
53
- targets: LabPreflightTarget[];
54
- sandbox: LabPreflightSandbox;
55
- spend: LabPreflightSpend;
50
+ route?: StudyRoute;
51
+ reachability: StudyPreflightReachabilityMode;
52
+ checks: StudyPreflightCheck[];
53
+ targets: StudyPreflightTarget[];
54
+ sandbox: StudyPreflightSandbox;
55
+ spend: StudyPreflightSpend;
56
56
  warnings: string[];
57
57
  error?: {
58
- code: LabResolveFailure["error"]["code"] | "HUMANISH_STUDY_PREFLIGHT_INVALID_OPTION" | "HUMANISH_STUDY_PREFLIGHT_UNSUPPORTED_ROUTE" | "HUMANISH_STUDY_PREFLIGHT_TARGET_POLICY" | "HUMANISH_STUDY_PREFLIGHT_ENV_MISSING" | "HUMANISH_STUDY_PREFLIGHT_E2B_REQUIRED" | "HUMANISH_STUDY_PREFLIGHT_TARGET_UNREACHABLE" | "HUMANISH_STUDY_PREFLIGHT_PROVISION_FAILED" | "HUMANISH_STUDY_PREFLIGHT_TEARDOWN_FAILED";
58
+ code: StudyResolveFailure["error"]["code"] | "HUMANISH_STUDY_PREFLIGHT_INVALID_OPTION" | "HUMANISH_STUDY_PREFLIGHT_UNSUPPORTED_ROUTE" | "HUMANISH_STUDY_PREFLIGHT_TARGET_POLICY" | "HUMANISH_STUDY_PREFLIGHT_ENV_MISSING" | "HUMANISH_STUDY_PREFLIGHT_E2B_REQUIRED" | "HUMANISH_STUDY_PREFLIGHT_TARGET_UNREACHABLE" | "HUMANISH_STUDY_PREFLIGHT_PROVISION_FAILED" | "HUMANISH_STUDY_PREFLIGHT_TEARDOWN_FAILED";
59
59
  message: string;
60
60
  };
61
61
  }
62
- interface LabPreflightHooks {
62
+ interface StudyPreflightHooks {
63
63
  loadDesktopModule?: () => Promise<E2BDesktopModule>;
64
64
  now?: () => number;
65
65
  sleep?: (ms: number) => Promise<void>;
66
66
  }
67
- export interface RunLabPreflightOptions {
67
+ export interface RunStudyPreflightOptions {
68
68
  cwd: string;
69
- lab: string;
70
- reachability?: LabPreflightReachabilityMode;
69
+ study: string;
70
+ reachability?: StudyPreflightReachabilityMode;
71
71
  timeoutMs?: number;
72
72
  env?: NodeJS.ProcessEnv;
73
- hooks?: LabPreflightHooks;
73
+ hooks?: StudyPreflightHooks;
74
74
  }
75
75
  /** A preflight run's state; the probes in preflight-probes.ts read and extend it. */
76
76
  export interface PreflightContext {
77
77
  cwd: string;
78
- lab: string;
79
- labId: string;
78
+ study: string;
79
+ studyId: string;
80
80
  origin: string;
81
81
  path: string;
82
- config: LabConfig;
83
- route: LabRoute;
84
- reachability: LabPreflightReachabilityMode;
82
+ config: StudyConfig;
83
+ route: StudyRoute;
84
+ reachability: StudyPreflightReachabilityMode;
85
85
  timeoutMs: number;
86
86
  env: NodeJS.ProcessEnv;
87
- hooks: LabPreflightHooks;
88
- checks: LabPreflightCheck[];
89
- targets: LabPreflightTarget[];
90
- sandbox: LabPreflightSandbox;
87
+ hooks: StudyPreflightHooks;
88
+ checks: StudyPreflightCheck[];
89
+ targets: StudyPreflightTarget[];
90
+ sandbox: StudyPreflightSandbox;
91
91
  warnings: string[];
92
92
  }
93
- export declare function runLabPreflight(options: RunLabPreflightOptions): Promise<LabPreflightResult>;
93
+ export declare function runStudyPreflight(options: RunStudyPreflightOptions): Promise<StudyPreflightResult>;
94
94
  export {};
@@ -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) {