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,56 +1,56 @@
1
- import type { LabConfig } from "./types.js";
1
+ import type { StudyConfig } from "./types.js";
2
2
  /**
3
3
  * Cross-validate the computer-use fan-out declaration (`per-lane-worlds`). Returns the failure
4
- * message, or null when valid. The parser enforces it, and runLab checks it again for a config
4
+ * message, or null when valid. The parser enforces it, and runStudyWith checks it again for a config
5
5
  * that skipped the parser. It runs rosterStructuralValidationReason (id and device
6
6
  * validity, unique ids) first, then the route-scoped XOR, cap and policy checks.
7
7
  */
8
- export declare function computerUseValidationReason(config: LabConfig): string | null;
8
+ export declare function computerUseValidationReason(config: StudyConfig): string | null;
9
9
  /**
10
10
  * Cross-validate a `topology: shared-world` declaration. Returns the failure message, or
11
11
  * null when the one shared-world route can run it: the external-public checks for an app-url
12
12
  * subject, the provisioned checks otherwise. Enforced at parse and again by the route, since
13
- * runLab takes a config that skipped the parser.
13
+ * runStudyWith takes a config that skipped the parser.
14
14
  */
15
- export declare function sharedWorldValidationReason(config: LabConfig): string | null;
15
+ export declare function sharedWorldValidationReason(config: StudyConfig): string | null;
16
16
  /**
17
17
  * Declared capture devices must be implemented by the selected execution route.
18
18
  * Unsupported backends pass false when called directly, where the declared
19
19
  * topology may not identify the backend that is actually executing.
20
20
  */
21
- export declare function desktopMediaValidationReason(config: LabConfig, supportsMedia?: boolean): string | undefined;
21
+ export declare function desktopMediaValidationReason(config: StudyConfig, supportsMedia?: boolean): string | undefined;
22
22
  /** Reused by direct library runners so unsupported receiving never becomes inert configuration. */
23
- export declare function receivingEmailValidationReason(config: LabConfig): string | undefined;
23
+ export declare function receivingEmailValidationReason(config: StudyConfig): string | undefined;
24
24
  /** Refuse task declarations that the selected execution path would discard.
25
25
  * Direct runners pass their actual support rather than trusting the config's dispatch shape. */
26
- export declare function taskProtocolValidationReason(config: LabConfig, supportsTasks?: boolean): string | null;
26
+ export declare function taskProtocolValidationReason(config: StudyConfig, supportsTasks?: boolean): string | null;
27
27
  /**
28
28
  * Refuse a clone subject whose target is not an explicit e2b-desktop. Every clone route clones and
29
- * serves the repo inside a hosted desktop sandbox, and routeOf sends every clone lab to
29
+ * serves the repo inside a hosted desktop sandbox, and routeOf sends every clone study to
30
30
  * one, so any other target, or none, would still run on an E2B desktop. Requiring it explicitly
31
31
  * also means the parser's clone checks, which run only on e2b-desktop, cannot be skipped. Enforced
32
32
  * at parse and again on the computer-use and scripted-browser routes for library callers.
33
33
  */
34
- export declare function cloneTargetValidationReason(config: LabConfig): string | null;
34
+ export declare function cloneTargetValidationReason(config: StudyConfig): string | null;
35
35
  /**
36
- * Refuse a positive `scenario.caps.maxUsd` or `maxTotalUsd` on a computer-use lab.
36
+ * Refuse a positive `scenario.caps.maxUsd` or `maxTotalUsd` on a computer-use study.
37
37
  * `scenario.caps` belongs to the terminal route; the computer-use route stops on `execution.caps`,
38
- * so a dollar figure here would read as a cap while the lab ran uncapped. Zero spends nothing
38
+ * so a dollar figure here would read as a cap while the study ran uncapped. Zero spends nothing
39
39
  * either way and stays a warning. Enforced at parse and again on the computer-use routes for
40
40
  * library callers.
41
41
  */
42
- export declare function scenarioCapsValidationReason(config: LabConfig): string | null;
42
+ export declare function scenarioCapsValidationReason(config: StudyConfig): string | null;
43
43
  /** Refuse a claimed output bound when the route cannot pass it to the first-party provider. */
44
- export declare function outputTokenLimitValidationReason(config: LabConfig): string | null;
44
+ export declare function outputTokenLimitValidationReason(config: StudyConfig): string | null;
45
45
  /**
46
46
  * Cross-validate a concurrent shared-world declaration. Returns the failure message,
47
47
  * or null when valid. Includes the base shared-world checks plus the concurrent extras: a synthetic
48
48
  * subject attestation, a 0.0.0.0 serve bind (getHost only routes to a port bound on
49
49
  * all interfaces), and no `subject.clone.keep`/`subject.localTree.keep` (either would
50
- * orphan actor sandboxes). Enforced at parse and re-enforced in the engine (runLab
50
+ * orphan actor sandboxes). Enforced at parse and re-enforced in the engine (runStudyWith
51
51
  * takes a config that skipped the parser).
52
52
  */
53
- export declare function concurrentSharedWorldValidationReason(config: LabConfig): string | null;
53
+ export declare function concurrentSharedWorldValidationReason(config: StudyConfig): string | null;
54
54
  /**
55
55
  * Cross-validate the external-public shared-world declaration: a real public
56
56
  * deployment used directly as the shared plane (no getHost, no clone, no subject sandbox, no seed).
@@ -60,8 +60,8 @@ export declare function concurrentSharedWorldValidationReason(config: LabConfig)
60
60
  * non-loopback appUrl + allowPublicTargets + the operator-ownership attestation subject.publicTarget +
61
61
  * concurrency >= 2 + an actors[0].lanes roster of ≥2 with exactly one host participant. The getHost synthetic
62
62
  * gate is deliberately unreachable here (there is no internet-reachable harness-owned URL to attest).
63
- * Enforced at parse and re-enforced in the engine (runLab takes a config that skipped the parser).
63
+ * Enforced at parse and re-enforced in the engine (runStudyWith takes a config that skipped the parser).
64
64
  */
65
- export declare function externalPublicSharedWorldValidationReason(config: LabConfig): string | null;
65
+ export declare function externalPublicSharedWorldValidationReason(config: StudyConfig): string | null;
66
66
  /** Analysis requires a live recording producer, including supported dry-run previews. */
67
- export declare function automaticAnalysisRouteReason(config: LabConfig): string | undefined;
67
+ export declare function automaticAnalysisRouteReason(config: StudyConfig): string | undefined;
@@ -5,7 +5,7 @@ import { declaredTargets } from "./plan-participants.js";
5
5
  import { actorResolvesToComputerUse, computerUseParticipantCount, MAX_COMPUTER_USE_PARTICIPANTS, registeredComputerUseActors, resolveEntryUrl, isComputerUseComposition, isScriptedBrowserComposition, isSharedWorldComposition, isTerminalProductComposition, } from "./routing.js";
6
6
  /**
7
7
  * Cross-validate the computer-use fan-out declaration (`per-lane-worlds`). Returns the failure
8
- * message, or null when valid. The parser enforces it, and runLab checks it again for a config
8
+ * message, or null when valid. The parser enforces it, and runStudyWith checks it again for a config
9
9
  * that skipped the parser. It runs rosterStructuralValidationReason (id and device
10
10
  * validity, unique ids) first, then the route-scoped XOR, cap and policy checks.
11
11
  */
@@ -66,7 +66,7 @@ export function computerUseValidationReason(config) {
66
66
  }
67
67
  /**
68
68
  * Engine-level path-token validation for configs supplied directly through the
69
- * public TypeScript/JavaScript API instead of parseLabConfig.
69
+ * public TypeScript/JavaScript API instead of parseStudy.
70
70
  */
71
71
  function rosterStructuralValidationReason(config) {
72
72
  const roster = rosterOf(config.actors[0]);
@@ -100,7 +100,7 @@ function rosterStructuralValidationReason(config) {
100
100
  * Cross-validate a `topology: shared-world` declaration. Returns the failure message, or
101
101
  * null when the one shared-world route can run it: the external-public checks for an app-url
102
102
  * subject, the provisioned checks otherwise. Enforced at parse and again by the route, since
103
- * runLab takes a config that skipped the parser.
103
+ * runStudyWith takes a config that skipped the parser.
104
104
  */
105
105
  export function sharedWorldValidationReason(config) {
106
106
  return config.subject.source === "app-url"
@@ -192,7 +192,7 @@ export function receivingEmailValidationReason(config) {
192
192
  return undefined;
193
193
  if (!isComputerUseComposition(config) ||
194
194
  !["app-url", "clone", "local-tree"].includes(config.subject.source)) {
195
- return "Real email receiving requires a hosted computer-use browser lab with an app-url, clone, or local-tree subject. Scripted, terminal, desktop-cli and local-app routes are unsupported.";
195
+ return "Real email receiving requires a hosted computer-use browser study with an app-url, clone, or local-tree subject. Scripted, terminal, desktop-cli and local-app routes are unsupported.";
196
196
  }
197
197
  if (config.actors.some((actor) => actor.type === "local-agent")) {
198
198
  return "Real email receiving is unavailable for local-agent: its host process does not isolate the inbox management credential. Use a hosted first-party computer-use actor.";
@@ -216,7 +216,7 @@ export function taskProtocolValidationReason(config, supportsTasks = isComputerU
216
216
  }
217
217
  /**
218
218
  * Refuse a clone subject whose target is not an explicit e2b-desktop. Every clone route clones and
219
- * serves the repo inside a hosted desktop sandbox, and routeOf sends every clone lab to
219
+ * serves the repo inside a hosted desktop sandbox, and routeOf sends every clone study to
220
220
  * one, so any other target, or none, would still run on an E2B desktop. Requiring it explicitly
221
221
  * also means the parser's clone checks, which run only on e2b-desktop, cannot be skipped. Enforced
222
222
  * at parse and again on the computer-use and scripted-browser routes for library callers.
@@ -226,12 +226,12 @@ export function cloneTargetValidationReason(config) {
226
226
  if (config.subject.source !== "clone" || target === "e2b-desktop")
227
227
  return null;
228
228
  const got = target === undefined ? "it is absent" : `got "${target}"`;
229
- return `clone subjects require \`execution.target: e2b-desktop\` (${got}): the lab clones and serves the repo inside a hosted desktop sandbox. \`execution.target: local\` applies to app-url and local-app subjects.`;
229
+ return `clone subjects require \`execution.target: e2b-desktop\` (${got}): humanish clones and serves the repo inside a hosted desktop sandbox. \`execution.target: local\` applies to app-url and local-app subjects.`;
230
230
  }
231
231
  /**
232
- * Refuse a positive `scenario.caps.maxUsd` or `maxTotalUsd` on a computer-use lab.
232
+ * Refuse a positive `scenario.caps.maxUsd` or `maxTotalUsd` on a computer-use study.
233
233
  * `scenario.caps` belongs to the terminal route; the computer-use route stops on `execution.caps`,
234
- * so a dollar figure here would read as a cap while the lab ran uncapped. Zero spends nothing
234
+ * so a dollar figure here would read as a cap while the study ran uncapped. Zero spends nothing
235
235
  * either way and stays a warning. Enforced at parse and again on the computer-use routes for
236
236
  * library callers.
237
237
  */
@@ -242,7 +242,7 @@ export function scenarioCapsValidationReason(config) {
242
242
  const value = config.scenario?.caps?.[key];
243
243
  if (value === undefined || value <= 0)
244
244
  continue;
245
- return `scenario.caps.${key} (${value}) does not cap a computer-use lab: this route stops on execution.caps.${key}. Move the value to execution.caps.${key}; scenario.caps applies only to terminal-product labs.`;
245
+ return `scenario.caps.${key} (${value}) does not cap a computer-use study: this route stops on execution.caps.${key}. Move the value to execution.caps.${key}; scenario.caps applies only to terminal-product studies.`;
246
246
  }
247
247
  return null;
248
248
  }
@@ -274,14 +274,14 @@ function sharedWorldConcurrencyReason(config) {
274
274
  const concurrency = config.execution?.concurrency ?? participants;
275
275
  if (concurrency >= 2)
276
276
  return null;
277
- return `shared-world labs need \`execution.concurrency\` of at least 2 (got ${concurrency}). Sequential shared-world turns (concurrency 1) were removed in 0.106.0: omit execution.concurrency to run every participant at once, or set it to 2 or more. A provisioned subject also needs \`subject.exposure: synthetic\` and a \`serve.start\` that binds 0.0.0.0.`;
277
+ return `shared-world studies need \`execution.concurrency\` of at least 2 (got ${concurrency}). Sequential shared-world turns (concurrency 1) were removed in 0.106.0: omit execution.concurrency to run every participant at once, or set it to 2 or more. A provisioned subject also needs \`subject.exposure: synthetic\` and a \`serve.start\` that binds 0.0.0.0.`;
278
278
  }
279
279
  /**
280
280
  * Cross-validate a concurrent shared-world declaration. Returns the failure message,
281
281
  * or null when valid. Includes the base shared-world checks plus the concurrent extras: a synthetic
282
282
  * subject attestation, a 0.0.0.0 serve bind (getHost only routes to a port bound on
283
283
  * all interfaces), and no `subject.clone.keep`/`subject.localTree.keep` (either would
284
- * orphan actor sandboxes). Enforced at parse and re-enforced in the engine (runLab
284
+ * orphan actor sandboxes). Enforced at parse and re-enforced in the engine (runStudyWith
285
285
  * takes a config that skipped the parser).
286
286
  */
287
287
  export function concurrentSharedWorldValidationReason(config) {
@@ -314,7 +314,7 @@ export function concurrentSharedWorldValidationReason(config) {
314
314
  * non-loopback appUrl + allowPublicTargets + the operator-ownership attestation subject.publicTarget +
315
315
  * concurrency >= 2 + an actors[0].lanes roster of ≥2 with exactly one host participant. The getHost synthetic
316
316
  * gate is deliberately unreachable here (there is no internet-reachable harness-owned URL to attest).
317
- * Enforced at parse and re-enforced in the engine (runLab takes a config that skipped the parser).
317
+ * Enforced at parse and re-enforced in the engine (runStudyWith takes a config that skipped the parser).
318
318
  */
319
319
  export function externalPublicSharedWorldValidationReason(config) {
320
320
  const structuralReason = rosterStructuralValidationReason(config);
@@ -385,5 +385,5 @@ export function automaticAnalysisRouteReason(config) {
385
385
  isSharedWorldComposition(config) ||
386
386
  ["app-url", "local-app", "local-tree", "desktop-cli", "terminal-product"].includes(config.subject.source))
387
387
  return undefined;
388
- return "review.analysis requires a computer-use, scripted-browser, terminal-product or shared-world lab; this lab's route does not produce an eligible live recording.";
388
+ return "review.analysis requires a computer-use, scripted-browser, terminal-product or shared-world study; this study's route does not produce an eligible live recording.";
389
389
  }
@@ -1,12 +1,12 @@
1
- import type { LabConfig } from "./types.js";
1
+ import type { StudyConfig } from "./types.js";
2
2
  /**
3
3
  * The fields a config sets that its route does not read, each as `field` or `field (reason)`. A v2
4
4
  * file gets them as one warning; a v3 study is refused for any of them.
5
5
  */
6
- export declare function inertFieldLabels(config: LabConfig): string[];
6
+ export declare function inertFieldLabels(config: StudyConfig): string[];
7
7
  /**
8
8
  * The same fields as `inertFieldLabels`, as paths without their reasons, such as
9
9
  * `actors[0].lanes[].entry` or `execution.timeoutMs`. `humanish migrate` drops each one.
10
10
  */
11
- export declare function inertFieldPaths(config: LabConfig): string[];
12
- export declare function forwardDeclaredWarnings(config: LabConfig): string[];
11
+ export declare function inertFieldPaths(config: StudyConfig): string[];
12
+ export declare function forwardDeclaredWarnings(config: StudyConfig): string[];
@@ -136,7 +136,7 @@ const CONFIG_ROWS = [
136
136
  // declared external one would silently collect nothing.
137
137
  {
138
138
  field: "comms.email.external",
139
- reason: "this subject is harness-provisioned, so humanish hosts the catch itself and injects its URL; an adopter-hosted catch would receive nothing. Drop `external` here, or move the lab to an app-url/operator-provisioned subject",
139
+ reason: "this subject is harness-provisioned, so humanish hosts the catch itself and injects its URL; an adopter-hosted catch would receive nothing. Drop `external` here, or move the study to an app-url or operator-provisioned subject",
140
140
  applies: (config) => Boolean(config.comms?.email?.external) &&
141
141
  (config.subject.source === "clone" || config.subject.source === "local-tree"),
142
142
  },
@@ -1,15 +1,15 @@
1
- import type { LabSubjectServe, LabSubjectState } from "../lab/types.js";
1
+ import type { StudySubjectServe, StudySubjectState } from "../study/types.js";
2
2
  import type { RunSubjectStateStepRecord } from "../run/bundle.js";
3
3
  import { type DetachedTimers } from "../substrates/detached.js";
4
4
  import { type Shell } from "../substrates/shell.js";
5
5
  import { type SubjectPhaseEvent } from "./steps.js";
6
- /** The longest provisionCloneSubject can take with the lab's budgets: the clone, then serving. */
7
- export declare function cloneProvisioningBudgetMs(serve: LabSubjectServe, state: LabSubjectState | undefined): number;
6
+ /** The longest provisionCloneSubject can take with the study's budgets: the clone, then serving. */
7
+ export declare function cloneProvisioningBudgetMs(serve: StudySubjectServe, state: StudySubjectState | undefined): number;
8
8
  /**
9
9
  * Provision a clone subject inside the sandbox: clone, then the shared serve pipeline (install,
10
10
  * state before-build, build, state before-start, start, readiness probe, state after-ready).
11
11
  * Returns the latest subject HEAD after successful provisioning. Throws (with a capped log tail
12
- * for the caller to redact) on any failing step; the lab persists that as a failed-evidence
12
+ * for the caller to redact) on any failing step; the route persists that as a failed-evidence
13
13
  * bundle.
14
14
  *
15
15
  * Auth: when GITHUB_TOKEN is among the declared subject env names, the clone authenticates via an
@@ -20,9 +20,9 @@ export declare function cloneProvisioningBudgetMs(serve: LabSubjectServe, state:
20
20
  export declare function provisionCloneSubject(shell: Shell, args: {
21
21
  repo: string;
22
22
  depth: number;
23
- serve: LabSubjectServe;
23
+ serve: StudySubjectServe;
24
24
  /** Declared subject state (seed steps; external declaration is provenance-only). */
25
- state?: LabSubjectState;
25
+ state?: StudySubjectState;
26
26
  hasGithubToken: boolean;
27
27
  requestTimeoutMs: number;
28
28
  /** Literal scrubber for known provisioned values, applied to log tails pre-truncation. */
@@ -3,7 +3,7 @@ import { detachedTimersOf, runDetachedStep } from "../substrates/detached.js";
3
3
  import { runOrThrow } from "../substrates/shell.js";
4
4
  import { runSubjectServePipeline, serveProvisioningBudgetMs } from "./serve.js";
5
5
  import { SOURCE_TIMEOUT_MS, emitPhaseCompleted, emitPhaseStarted, SUBJECT_DIR, } from "./steps.js";
6
- /** The longest provisionCloneSubject can take with the lab's budgets: the clone, then serving. */
6
+ /** The longest provisionCloneSubject can take with the study's budgets: the clone, then serving. */
7
7
  export function cloneProvisioningBudgetMs(serve, state) {
8
8
  return SOURCE_TIMEOUT_MS + serveProvisioningBudgetMs(serve, state);
9
9
  }
@@ -11,7 +11,7 @@ export function cloneProvisioningBudgetMs(serve, state) {
11
11
  * Provision a clone subject inside the sandbox: clone, then the shared serve pipeline (install,
12
12
  * state before-build, build, state before-start, start, readiness probe, state after-ready).
13
13
  * Returns the latest subject HEAD after successful provisioning. Throws (with a capped log tail
14
- * for the caller to redact) on any failing step; the lab persists that as a failed-evidence
14
+ * for the caller to redact) on any failing step; the route persists that as a failed-evidence
15
15
  * bundle.
16
16
  *
17
17
  * Auth: when GITHUB_TOKEN is among the declared subject env names, the clone authenticates via an
@@ -76,7 +76,7 @@ export declare function createLocalTreeArchive(root: string, options?: CreateLoc
76
76
  * produces (no leading "./", no trailing "/"). Absolute paths and glob syntax
77
77
  * are rejected instead of silently ignored: an exclude the author believed in but
78
78
  * that never matches anything is a leak vector, so unusable shapes fail
79
- * closed at the packing boundary (and, for lab manifests, already at parse
80
- * time in src/lab/parse/subject.ts).
79
+ * closed at the packing boundary (and, for study manifests, already at parse
80
+ * time in src/study/parse/subject.ts).
81
81
  */
82
82
  export declare function normalizeExtraExcludeEntry(entry: string): string;
@@ -111,7 +111,7 @@ export function createLocalTreeArchive(root, options = {}) {
111
111
  if (entries.length === 0) {
112
112
  throw new Error(`Local tree root "${path.basename(resolvedRoot)}" produced zero packable entries after the always-on denylist` +
113
113
  (extraExclude.length > 0 ? " and extraExclude" : "") +
114
- "; local-tree packing requires at least one non-denylisted file or symlink. (Paths in this message are basenames only; the packed root is the lab resolution cwd.)");
114
+ "; local-tree packing requires at least one non-denylisted file or symlink. (Paths in this message are basenames only; the packed root is the study's working directory.)");
115
115
  }
116
116
  // Check the cap from enumerated sizes before reading/hashing file bytes, so
117
117
  // an oversized tree fails closed without the cost of hashing all of it.
@@ -292,8 +292,8 @@ function isDenylistedSegment(relPath) {
292
292
  * produces (no leading "./", no trailing "/"). Absolute paths and glob syntax
293
293
  * are rejected instead of silently ignored: an exclude the author believed in but
294
294
  * that never matches anything is a leak vector, so unusable shapes fail
295
- * closed at the packing boundary (and, for lab manifests, already at parse
296
- * time in src/lab/parse/subject.ts).
295
+ * closed at the packing boundary (and, for study manifests, already at parse
296
+ * time in src/study/parse/subject.ts).
297
297
  */
298
298
  export function normalizeExtraExcludeEntry(entry) {
299
299
  const trimmed = entry.trim();
@@ -1,4 +1,4 @@
1
- import type { LabSubjectServe, LabSubjectState } from "../lab/types.js";
1
+ import type { StudySubjectServe, StudySubjectState } from "../study/types.js";
2
2
  import type { RunSubjectStateStepRecord } from "../run/bundle.js";
3
3
  import { type DetachedTimers } from "../substrates/detached.js";
4
4
  import type { Shell } from "../substrates/shell.js";
@@ -14,9 +14,9 @@ import { type SubjectPhaseEvent } from "./steps.js";
14
14
  export declare function provisionLocalTreeSubject(shell: Shell, args: {
15
15
  /** The once-per-run packed archive bytes (shared byte-identically across every participant). */
16
16
  archiveBuffer: ArrayBuffer;
17
- serve: LabSubjectServe;
17
+ serve: StudySubjectServe;
18
18
  /** Declared subject state (seed steps; external declaration is provenance-only). */
19
- state?: LabSubjectState;
19
+ state?: StudySubjectState;
20
20
  requestTimeoutMs: number;
21
21
  /** Literal scrubber for known provisioned values, applied to log tails pre-truncation. */
22
22
  scrub: (text: string) => string;
@@ -5,11 +5,11 @@
5
5
  // Node for the computer-use clone/local-tree route. Without it, any study whose `serve.install`
6
6
  // runs npm or pnpm dies with `pnpm: command not found` after its sandbox is created and paid for.
7
7
  //
8
- // That failure is invisible up front: `lab inspect` is clean, the plan prints normally, the sandbox
8
+ // That failure is invisible up front: `study show` is clean, the plan prints normally, the sandbox
9
9
  // provisions, and the first signal is a shell exit code attributed to "subject install failed".
10
10
  // Nobody can debug that from the outside.
11
11
  //
12
- // The harness provides the runtime instead of warning about it. An adopter writing a lab for a Node app should not have to
12
+ // The harness provides the runtime instead of warning about it. An adopter writing a study for a Node app should not have to
13
13
  // know which binaries the template happens to carry. That is the harness's job, and the terminal
14
14
  // route already treats it that way. Detection is conservative and the bootstrap is skipped whenever
15
15
  // a runtime is already present, so a custom template that ships Node pays nothing.
@@ -1,4 +1,4 @@
1
- import type { LabSubjectServe, LabSubjectState } from "../lab/types.js";
1
+ import type { StudySubjectServe, StudySubjectState } from "../study/types.js";
2
2
  import type { RunSubjectStateStepRecord } from "../run/bundle.js";
3
3
  import { type DetachedTimers } from "../substrates/detached.js";
4
4
  import type { Shell } from "../substrates/shell.js";
@@ -8,7 +8,7 @@ import { type SubjectPhaseEvent } from "./steps.js";
8
8
  * with their one retry, the package-manager step, every seed step, the build and the readiness
9
9
  * wait. Detached-step polling adds seconds on top.
10
10
  */
11
- export declare function serveProvisioningBudgetMs(serve: LabSubjectServe, state: LabSubjectState | undefined): number;
11
+ export declare function serveProvisioningBudgetMs(serve: StudySubjectServe, state: StudySubjectState | undefined): number;
12
12
  /**
13
13
  * The provisioning pipeline the clone and local-tree routes share once SUBJECT_DIR is populated
14
14
  * (by git clone, or by upload and extract): install, state before-build, build, state
@@ -21,9 +21,9 @@ export declare function serveProvisioningBudgetMs(serve: LabSubjectServe, state:
21
21
  * eats the session budget.
22
22
  */
23
23
  export declare function runSubjectServePipeline(shell: Shell, args: {
24
- serve: LabSubjectServe;
24
+ serve: StudySubjectServe;
25
25
  /** Declared subject state (seed steps; external declaration is provenance-only). */
26
- state?: LabSubjectState;
26
+ state?: StudySubjectState;
27
27
  requestTimeoutMs: number;
28
28
  /** Literal scrubber for known provisioned values, applied to log tails pre-truncation. */
29
29
  scrub: (text: string) => string;
@@ -1,4 +1,4 @@
1
- import type { LabStateStepWhen, LabSubjectState } from "../lab/types.js";
1
+ import type { StudyStateStepWhen, StudySubjectState } from "../study/types.js";
2
2
  import type { RunSubjectStateStepRecord } from "../run/bundle.js";
3
3
  import { type DetachedTimers } from "../substrates/detached.js";
4
4
  import type { Shell } from "../substrates/shell.js";
@@ -11,8 +11,8 @@ export declare function commandDigestOf(command: string): string;
11
11
  * `subject-state-<name>` so a step can never collide with a serve step. Each step's record goes
12
12
  * to `onStateStep` as it finishes; the first failure throws with its scrubbed log tail.
13
13
  */
14
- export declare function runStateSteps(shell: Shell, when: LabStateStepWhen, args: {
15
- state?: LabSubjectState;
14
+ export declare function runStateSteps(shell: Shell, when: StudyStateStepWhen, args: {
15
+ state?: StudySubjectState;
16
16
  requestTimeoutMs: number;
17
17
  /** Literal scrubber for known provisioned values, applied to log tails pre-truncation. */
18
18
  scrub: (text: string) => string;
@@ -39,7 +39,7 @@ export async function runStateSteps(shell, when, args) {
39
39
  args.onStateStep?.({
40
40
  name: step.name,
41
41
  when,
42
- // Digest only (sha256-16): the command text never persists: the lab YAML in the
42
+ // Digest only (sha256-16): the command text never persists: the study YAML in the
43
43
  // consumer's repo is the plaintext source of truth.
44
44
  commandDigest: commandDigestOf(step.command),
45
45
  ok: result.ok,
@@ -27,7 +27,7 @@ export declare function emitPhaseCompleted(onPhase: ((event: SubjectPhaseEvent)
27
27
  /** Default phase-boundary sink (stderr): one line per event, prefixed with the participant id
28
28
  * only when the run has more than one participant. A single participant still gets every line:
29
29
  * a silent clone, install, build and ready boot is the bug this event stream exists to close.
30
- * Overridable via LabDeps.subjectPhaseSink so deterministic tests capture instead of writing to
30
+ * Overridable via StudyDeps.subjectPhaseSink so deterministic tests capture instead of writing to
31
31
  * the real stderr. */
32
32
  export declare function defaultSubjectPhaseSink(event: SubjectPhaseEvent, participant: {
33
33
  readonly id: string;
@@ -25,7 +25,7 @@ export function emitPhaseCompleted(onPhase, now, startedAt, phase, ok, message)
25
25
  /** Default phase-boundary sink (stderr): one line per event, prefixed with the participant id
26
26
  * only when the run has more than one participant. A single participant still gets every line:
27
27
  * a silent clone, install, build and ready boot is the bug this event stream exists to close.
28
- * Overridable via LabDeps.subjectPhaseSink so deterministic tests capture instead of writing to
28
+ * Overridable via StudyDeps.subjectPhaseSink so deterministic tests capture instead of writing to
29
29
  * the real stderr. */
30
30
  export function defaultSubjectPhaseSink(event, participant) {
31
31
  const durationSuffix = event.durationMs === undefined ? "" : ` (${event.durationMs}ms)`;
@@ -1,4 +1,4 @@
1
- import { CuaExecutorError } from "../actors/computer-use/executor-error.js";
1
+ import { ComputerUseExecutorError } from "../actors/computer-use/executor-error.js";
2
2
  /**
3
3
  * Wrap an already-acquired resource. The adapter supplies release authority as a closure;
4
4
  * this layer never reconstructs it from a saved ID or enumerates provider resources.
@@ -12,7 +12,7 @@ export function ownDesktopAllocation(options) {
12
12
  let closing;
13
13
  const assertOpen = () => {
14
14
  if (closing !== undefined)
15
- throw new CuaExecutorError("executor_closed", "not_dispatched");
15
+ throw new ComputerUseExecutorError("executor_closed", "not_dispatched");
16
16
  };
17
17
  const close = (policy = {}) => {
18
18
  // Install the promise before invoking release: concurrent/reentrant callers share it.
@@ -10,7 +10,7 @@ export declare function detachedTimersOf(options: DetachedTimers): DetachedTimer
10
10
  export interface DetachedStepOptions extends DetachedTimers {
11
11
  /** Short [a-z0-9-] label; names the script/status/log files under /tmp. */
12
12
  name: string;
13
- /** The shell command to run (the lab author's own command: package.json-script trust). */
13
+ /** The shell command to run (the study author's own command: package.json-script trust). */
14
14
  command: string;
15
15
  cwd?: string;
16
16
  /** Wall-clock budget for the step. */
@@ -1,4 +1,4 @@
1
- import type { LabDesktopBrowser } from "../../lab/types.js";
1
+ import type { StudyDesktopBrowser } from "../../study/types.js";
2
2
  import type { E2BDesktopSandbox } from "./sdk.js";
3
3
  import type { DesktopMediaEvidence } from "./desktop-media.js";
4
4
  export declare const DESKTOP_SETTLE_MS = 8000;
@@ -27,7 +27,7 @@ export type ChromeDevToolsReadiness = {
27
27
  /** Reads the readiness markers from a launch command's stdout. */
28
28
  export declare function parseChromeDevToolsReadiness(stdout: string): ChromeDevToolsReadiness | undefined;
29
29
  export interface DesktopBrowserEvidence {
30
- requested: LabDesktopBrowser;
30
+ requested: StudyDesktopBrowser;
31
31
  resolved?: string;
32
32
  /** Synthetic media devices the browser was launched with, and how permission is answered. */
33
33
  media?: DesktopMediaEvidence;
@@ -42,7 +42,7 @@ export interface DesktopBrowserLaunchIdentity {
42
42
  }
43
43
  /**
44
44
  * Runtime-only launch result. `evidence` is what the bundle records: the requested browser and the
45
- * one that launched, and only when the lab declared a browser.
45
+ * one that launched, and only when the study declared a browser.
46
46
  */
47
47
  export interface DesktopBrowserLaunchResult {
48
48
  family: DesktopBrowserFamily;
@@ -65,7 +65,7 @@ export declare function buildFillDesktopWindowCommand(windowId: string, width: n
65
65
  * below checks for clipping and refuses an uncorrectable window before the actor runs.
66
66
  */
67
67
  export declare function fillDesktopBrowserWindow(desktop: E2BDesktopSandbox, windowId: string, resolution: readonly [number, number], requestTimeoutMs: number): Promise<void>;
68
- export declare function openDesktopBrowserTarget(desktop: E2BDesktopSandbox, targetUrl: string, requestTimeoutMs: number, browserPreference: LabDesktopBrowser | undefined,
68
+ export declare function openDesktopBrowserTarget(desktop: E2BDesktopSandbox, targetUrl: string, requestTimeoutMs: number, browserPreference: StudyDesktopBrowser | undefined,
69
69
  /** Launch-time flags that make mobile fidelity hold across every tab: the user agent and
70
70
  * touch events are browser-wide here, where the CDP holder covers only the launch page. */
71
71
  extraChromiumFlags?: readonly string[], environment?: Readonly<Record<string, string>>): Promise<DesktopBrowserLaunchResult>;
@@ -2,7 +2,7 @@
2
2
  // window a desktop-CLI study starts in.
3
3
  import { CHROMIUM_EVIDENCE_HYGIENE_FLAGS, chromiumEvidenceProfilePreferencesJson, } from "../../evidence/browser-hygiene.js";
4
4
  import { failureTail } from "../../evidence/redaction.js";
5
- import { isHttpUrl } from "../../lab/parse/subject.js";
5
+ import { isHttpUrl } from "../../study/parse/subject.js";
6
6
  import { runDetachedStep } from "../detached.js";
7
7
  import { shellQuote } from "../shell.js";
8
8
  import { e2bShell } from "./shell.js";
@@ -59,7 +59,7 @@ export declare function makeChromeBrowserStateObserver(desktop: E2BDesktopSandbo
59
59
  text?: string;
60
60
  scrollY?: number;
61
61
  }>;
62
- /** The user agent a mobile-emulated participant presents unless the lab sets its own. */
62
+ /** The user agent a mobile-emulated participant presents unless the study sets its own. */
63
63
  export declare const DEFAULT_MOBILE_USER_AGENT = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1";
64
64
  /**
65
65
  * Apply mobile emulation to the participant's launch page and read back what the page reports.
@@ -97,7 +97,7 @@ export function makeChromeBrowserStateObserver(desktop, requestTimeoutMs, endpoi
97
97
  };
98
98
  };
99
99
  }
100
- /** The user agent a mobile-emulated participant presents unless the lab sets its own. */
100
+ /** The user agent a mobile-emulated participant presents unless the study sets its own. */
101
101
  export const DEFAULT_MOBILE_USER_AGENT = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1";
102
102
  /**
103
103
  * Apply mobile emulation to the participant's launch page and read back what the page reports.
@@ -77,7 +77,7 @@ export type CuaTypePhase = "desktop-write" | "text-tempfile" | "text-command";
77
77
  * password), so the message names the phase and, for xdotool, its exit code only: no text, no
78
78
  * temp-file path, no substrate output. The loop records `.name` + `.message` into the actor trace.
79
79
  */
80
- export declare class CuaTypeError extends Error {
80
+ export declare class ComputerUseTypeError extends Error {
81
81
  readonly phase: CuaTypePhase;
82
82
  readonly exitCode?: number;
83
83
  constructor(phase: CuaTypePhase, exitCode?: number);
@@ -1,7 +1,7 @@
1
1
  import { shellQuote } from "../shell.js";
2
2
  import { perceptualSignature } from "../../evidence/frame-signature.js";
3
3
  import { commandFailureInfo } from "../command-failure.js";
4
- import { CuaExecutorError } from "../../actors/computer-use/executor-error.js";
4
+ import { ComputerUseExecutorError } from "../../actors/computer-use/executor-error.js";
5
5
  import { xdotoolHeldModifiers } from "../../guest/desktop-keys.js";
6
6
  const DEFAULT_WAIT_MS = 500;
7
7
  const DEFAULT_SCROLL_AMOUNT_PER_TICK = 100;
@@ -72,12 +72,12 @@ function toBuffer(bytes) {
72
72
  * password), so the message names the phase and, for xdotool, its exit code only: no text, no
73
73
  * temp-file path, no substrate output. The loop records `.name` + `.message` into the actor trace.
74
74
  */
75
- export class CuaTypeError extends Error {
75
+ export class ComputerUseTypeError extends Error {
76
76
  phase;
77
77
  exitCode;
78
78
  constructor(phase, exitCode) {
79
79
  super(`type failed at ${phase}${exitCode === undefined ? "" : ` (exit ${exitCode})`}`);
80
- this.name = "CuaTypeError";
80
+ this.name = "ComputerUseTypeError";
81
81
  this.phase = phase;
82
82
  if (exitCode !== undefined)
83
83
  this.exitCode = exitCode;
@@ -107,17 +107,17 @@ async function typeText(desktop, text) {
107
107
  directory = made.stdout?.trim();
108
108
  }
109
109
  catch {
110
- throw new CuaTypeError("text-tempfile");
110
+ throw new ComputerUseTypeError("text-tempfile");
111
111
  }
112
112
  if (directory === undefined || !TYPE_DIRECTORY.test(directory))
113
- throw new CuaTypeError("text-tempfile");
113
+ throw new ComputerUseTypeError("text-tempfile");
114
114
  const file = `${directory}/text`;
115
115
  try {
116
116
  try {
117
117
  await files.write(file, text, { requestTimeoutMs: TYPE_COMMAND_TIMEOUT_MS });
118
118
  }
119
119
  catch {
120
- throw new CuaTypeError("text-tempfile");
120
+ throw new ComputerUseTypeError("text-tempfile");
121
121
  }
122
122
  // xdotool waits the delay after every character, so a long text needs a longer budget.
123
123
  const timeoutMs = TYPE_COMMAND_TIMEOUT_MS + [...text].length * XDOTOOL_TYPE_DELAY_MS;
@@ -127,11 +127,11 @@ async function typeText(desktop, text) {
127
127
  }
128
128
  catch (error) {
129
129
  // The SDK throws on a non-zero exit; only its exit code is kept.
130
- throw new CuaTypeError("text-command", commandFailureInfo(error).exitCode);
130
+ throw new ComputerUseTypeError("text-command", commandFailureInfo(error).exitCode);
131
131
  }
132
132
  // A structural fake may return a non-zero exit instead of throwing, as the SDK does.
133
133
  if (result?.exitCode !== undefined && result.exitCode !== 0)
134
- throw new CuaTypeError("text-command", result.exitCode);
134
+ throw new ComputerUseTypeError("text-command", result.exitCode);
135
135
  }
136
136
  finally {
137
137
  await commands.run(`rm -rf -- ${shellQuote(directory)}`, quick).catch(() => undefined);
@@ -230,7 +230,7 @@ export function createE2BDesktopExecutor(desktop, options = {}) {
230
230
  await desktop.write(action.text);
231
231
  }
232
232
  catch {
233
- throw new CuaTypeError("desktop-write");
233
+ throw new ComputerUseTypeError("desktop-write");
234
234
  }
235
235
  return;
236
236
  }
@@ -261,7 +261,7 @@ export function createE2BDesktopExecutor(desktop, options = {}) {
261
261
  // capturing here would double-capture. Leave the desktop untouched.
262
262
  return;
263
263
  case "speak":
264
- throw new CuaExecutorError("action_rejected", "not_dispatched");
264
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
265
265
  }
266
266
  }
267
267
  }
@@ -278,7 +278,7 @@ function sendsNoInput(action) {
278
278
  async function withHeldModifiers(desktop, chord, run) {
279
279
  const commands = desktop.commands;
280
280
  if (!commands)
281
- throw new CuaExecutorError("action_rejected", "not_dispatched");
281
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
282
282
  const options = { requestTimeoutMs: HELD_KEYS_TIMEOUT_MS, timeoutMs: HELD_KEYS_TIMEOUT_MS };
283
283
  let failed = false;
284
284
  let failure;
@@ -295,7 +295,7 @@ async function withHeldModifiers(desktop, chord, run) {
295
295
  await commands.run(`xdotool keyup ${chord}`, options);
296
296
  }
297
297
  catch {
298
- throw new CuaExecutorError("execution_failed", "outcome_uncertain");
298
+ throw new ComputerUseExecutorError("execution_failed", "outcome_uncertain");
299
299
  }
300
300
  if (failed)
301
301
  throw failure;
@@ -1,4 +1,4 @@
1
- import { type DevicePreset } from "../../lab/device-presets.js";
1
+ import { type DevicePreset } from "../../study/device-presets.js";
2
2
  import { type RunDesktopGeometry } from "../../run/streams.js";
3
3
  import { type ChromeCdpPagePreference } from "./cdp-probe.js";
4
4
  import { type DesktopBrowserFamily, type DesktopBrowserLaunchIdentity } from "./desktop-browser.js";