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
@@ -2,7 +2,7 @@ import type { HeardSpeech } from "../speech.js";
2
2
  import type { ActorCapabilities, ActorConversation, ActorExecutionProfile, ActorPersonaRef, ActorSessionResult, ActorTokenUsage, ActorTrace, ActorTraceItem, ParticipantClosingReport, ParticipantDeclaredOutcome, ProviderRequestReceipt } from "../../contract.js";
3
3
  import type { RedactionHooks } from "../../../evidence/redaction.js";
4
4
  import type { DwellWindow, StopWhen } from "../../stop-conditions.js";
5
- import type { LabTask } from "../../../lab/tasks.js";
5
+ import type { StudyTask } from "../../../study/tasks.js";
6
6
  import type { ReasoningEffort } from "../../reasoning-effort.js";
7
7
  /**
8
8
  * One desktop action. `heldKeys` on a pointer action are held down for the whole action and
@@ -80,7 +80,7 @@ export interface CuaObservation {
80
80
  * in-memory progress key is derived from it. A structured blob has no detectable secret shape
81
81
  * (the published-evidence scan catches only secret-shaped patterns), so it is handled like
82
82
  * stateSignature, which is never written as text either. Persisting it would need a stringified
83
- * projection through redaction.redactText and the lab's scrubText, with its fields capped or
83
+ * projection through redaction.redactText and the run's scrubText, with its fields capped or
84
84
  * allowlisted, since pattern and literal redaction cannot sanitize an arbitrary blob.
85
85
  */
86
86
  appState?: Record<string, unknown>;
@@ -301,7 +301,7 @@ export interface CuaLoopOptions {
301
301
  /**
302
302
  * Extra literal scrub for known provisioned values (which have no detectable "shape", so
303
303
  * pattern redaction cannot catch them), composed before redactText on every model-authored
304
- * text item (reasoning, message, completion summary) and the loop error. The lab passes the
304
+ * text item (reasoning, message, completion summary) and the loop error. The route passes the
305
305
  * env-value scrubber here so a value the model narrates can never land raw in the trace.
306
306
  * Default: identity (the loop is shape-only on its own).
307
307
  */
@@ -324,19 +324,19 @@ export interface CuaLoopOptions {
324
324
  /** Injected pause for the dwell window's cadence; tests advance their clock through it. */
325
325
  sleep?: (ms: number) => Promise<void>;
326
326
  /**
327
- * The lab's declared protocol: discrete tasks whose completion is corroborated by the
327
+ * The study's declared protocol: discrete tasks whose completion is corroborated by the
328
328
  * same observations stopWhen reads, on the same cadence. The tracker never influences the loop's
329
329
  * control flow: a completed task list does not stop a session (that is stopWhen's job); it only
330
330
  * records the funnel that lands on the trace. The participant-facing halves of these tasks are
331
331
  * already in `instructions` (composed upstream); the loop reads only the `success` criteria,
332
332
  * which never reach the prompt.
333
333
  */
334
- tasks?: readonly LabTask[];
334
+ tasks?: readonly StudyTask[];
335
335
  /**
336
336
  * Spend cap in USD. When set, the loop stops with budget_reached as soon as the running
337
337
  * estimated spend crosses it, before the next provider turn. Absent means uncapped. maxUsd: 0
338
338
  * can still permit one model request before its reported spend trips the check. Enforcement
339
- * needs an estimate, so the lab refuses a cap on an unpriced model at preflight.
339
+ * needs an estimate, so humanish refuses a cap on an unpriced model at preflight.
340
340
  */
341
341
  maxUsd?: number;
342
342
  /**
@@ -363,6 +363,22 @@ export interface CuaLoopOptions {
363
363
  * built-in route sets it.
364
364
  */
365
365
  requireReportedUsageForSpendCap?: boolean;
366
+ /**
367
+ * Trace snapshot for a watcher: the redacted items recorded so far, with the running
368
+ * usage so a run can be priced in flight. Called after each checkpoint's screenshot (the initial
369
+ * observation and every acted turn, so a flush never shows an action without the frame before
370
+ * it), after each dwell frame, and after a closing request. The array is a fresh copy; its items
371
+ * are the objects the final trace persists. Not awaited, so a slow flush cannot stall a turn.
372
+ * Default: no-op.
373
+ */
374
+ onTrace?: (items: readonly ActorTraceItem[], usage: ActorTokenUsage, metadata?: CuaLiveMetadata) => void;
375
+ }
376
+ /**
377
+ * The runtime-only taps the external-public shared-world handoff (src/routes/shared-world/handoff.ts)
378
+ * reads the lobby code through. Internal: 0.109.0 removed them from CuaLoopOptions, and a library
379
+ * caller wraps the executor's `observe` or the provider's `nextTurn` instead.
380
+ */
381
+ export interface LoopTaps {
366
382
  /**
367
383
  * Runtime-only URL tap: called with `observation.url` for each observation a turn may receive
368
384
  * (the initial one, each post-action one and the one after a dwell window). The loop never
@@ -370,9 +386,6 @@ export interface CuaLoopOptions {
370
386
  *
371
387
  * Built-in caller: the external-public shared-world handoff (src/routes/shared-world/handoff.ts)
372
388
  * latches the host participant's lobby URL and checks that each follower reached the same lobby.
373
- *
374
- * @deprecated Wrap the executor's `observe` and read `url` from each observation it returns. The
375
- * next minor removes this option.
376
389
  */
377
390
  onObservedUrl?: (url: string | undefined) => void;
378
391
  /**
@@ -383,9 +396,6 @@ export interface CuaLoopOptions {
383
396
  *
384
397
  * Built-in caller: the external-public handoff scans the host's narration for the lobby code,
385
398
  * because the E2B desktop's CDP URL read behind onObservedUrl is unreliable.
386
- *
387
- * @deprecated Wrap the provider's `nextTurn` and read `reasoning` and `message` from each turn it
388
- * returns. The next minor removes this option.
389
399
  */
390
400
  onMessage?: (text: string) => void;
391
401
  /**
@@ -395,21 +405,11 @@ export interface CuaLoopOptions {
395
405
  *
396
406
  * Built-in caller: the external-public handoff reads the lobby code off each participant's own
397
407
  * frame until that participant has one: the host's latch, or a follower's convergence observation.
398
- *
399
- * @deprecated Wrap the executor's `observe` and read `screenshot` from each observation it
400
- * returns. The next minor removes this option.
401
408
  */
402
409
  onScreenshot?: (frame: Buffer) => void;
403
- /**
404
- * Trace snapshot for a watcher: the redacted items recorded so far, with the running
405
- * usage so a run can be priced in flight. Called after each checkpoint's screenshot (the initial
406
- * observation and every acted turn, so a flush never shows an action without the frame before
407
- * it), after each dwell frame, and after a closing request. The array is a fresh copy; its items
408
- * are the objects the final trace persists. Not awaited, so a slow flush cannot stall a turn.
409
- * Default: no-op.
410
- */
411
- onTrace?: (items: readonly ActorTraceItem[], usage: ActorTokenUsage, metadata?: CuaLiveMetadata) => void;
412
410
  }
411
+ /** The loop's options inside humanish: the public ones plus the handoff's taps. */
412
+ export type LoopRunOptions = CuaLoopOptions & LoopTaps;
413
413
  export type CuaLiveMetadata = Pick<ActorTrace, "executionProfile" | "providerRequests" | "historyTurnsOmitted">;
414
414
  /** What runComputerUseLoop returns; the public name for an actor session result. */
415
415
  export type CuaLoopResult = ActorSessionResult;
@@ -1,5 +1,5 @@
1
1
  import type { ActorProviderRequest, ActorTokenUsage, ProviderRequestReceipt } from "../../contract.js";
2
- import type { CuaProviderError } from "../provider-error.js";
2
+ import type { ComputerUseProviderError } from "../provider-error.js";
3
3
  import type { CuaLiveMetadata, CuaProvider, CuaTurn } from "./types.js";
4
4
  type TurnUsage = NonNullable<CuaTurn["usage"]>;
5
5
  /** Turn usage with valid input and output counts, cache counts within input, and turns that add up. */
@@ -67,7 +67,7 @@ export declare class UsageLedger {
67
67
  * Book one settled single-dispatch request. A request that settles while a continuing request
68
68
  * is open belongs to that interaction, whatever kind the caller asked for.
69
69
  */
70
- settle(kind: "interaction" | "debrief", receipt: ProviderRequestReceipt, usage: ActorTokenUsage | undefined, error: CuaProviderError | undefined): "interaction" | "debrief";
70
+ settle(kind: "interaction" | "debrief", receipt: ProviderRequestReceipt, usage: ActorTokenUsage | undefined, error: ComputerUseProviderError | undefined): "interaction" | "debrief";
71
71
  /**
72
72
  * The running usage both spend guards price: totals plus the per-inference ledger, shaped like
73
73
  * the trace's final tokenUsage so one estimator prices both. Unlike the persisted trace, where an
@@ -1,4 +1,4 @@
1
- import type { CuaLoopOptions, CuaLoopResult } from "./loop/types.js";
1
+ import type { CuaLoopOptions, CuaLoopResult, LoopRunOptions } from "./loop/types.js";
2
2
  export type { CuaAction, CuaExecutor, CuaLiveMetadata, CuaLoopOptions, CuaLoopResult, CuaObservation, CuaProvider, CuaSafetyCheck, CuaSpendGate, CuaTurn, CuaTurnRequest, } from "./loop/types.js";
3
3
  export { describeCuaAction } from "./loop/actions.js";
4
4
  export { stableProgressKey } from "./loop/backstop.js";
@@ -9,3 +9,8 @@ export { validClosingReport } from "./loop/debrief.js";
9
9
  * it is recorded; screenshots are persisted raw unless redactScreenshots is set.
10
10
  */
11
11
  export declare function runComputerUseLoop(options: CuaLoopOptions): Promise<CuaLoopResult>;
12
+ /**
13
+ * runComputerUseLoop with the external-public handoff's taps (LoopTaps), which the public
14
+ * options no longer carry. The actor's entry.
15
+ */
16
+ export declare function runComputerUseLoopWithTaps(options: LoopRunOptions): Promise<CuaLoopResult>;
@@ -1,4 +1,4 @@
1
- import { CuaProviderError } from "./provider-error.js";
1
+ import { ComputerUseProviderError } from "./provider-error.js";
2
2
  import { runActionBatch } from "./loop/actions.js";
3
3
  import { advanceBackstop, startBackstop } from "./loop/backstop.js";
4
4
  import { requestDebrief } from "./loop/debrief.js";
@@ -20,6 +20,28 @@ export { validClosingReport } from "./loop/debrief.js";
20
20
  * it is recorded; screenshots are persisted raw unless redactScreenshots is set.
21
21
  */
22
22
  export async function runComputerUseLoop(options) {
23
+ refuseRemovedOptions(options);
24
+ return runComputerUseLoopWithTaps(options);
25
+ }
26
+ /** What 0.109.0 removed from CuaLoopOptions, and what a caller does instead. */
27
+ const REMOVED_OPTIONS = {
28
+ onObservedUrl: "Wrap the executor's `observe` and read `url` from each observation it returns.",
29
+ onMessage: "Wrap the provider's `nextTurn` and read `reasoning` and `message` from each turn it returns.",
30
+ onScreenshot: "Wrap the executor's `observe` and read `screenshot` from each observation it returns.",
31
+ };
32
+ /** A JavaScript caller still passing a removed option gets an error, not a hook that never fires. */
33
+ function refuseRemovedOptions(options) {
34
+ for (const [name, replacement] of Object.entries(REMOVED_OPTIONS)) {
35
+ if (options[name] !== undefined) {
36
+ throw new TypeError(`runComputerUseLoop: ${name} was removed in 0.109.0. ${replacement}`);
37
+ }
38
+ }
39
+ }
40
+ /**
41
+ * runComputerUseLoop with the external-public handoff's taps (LoopTaps), which the public
42
+ * options no longer carry. The actor's entry.
43
+ */
44
+ export async function runComputerUseLoopWithTaps(options) {
23
45
  refuseAccountBilledCaps(options);
24
46
  const session = new LoopSession(options);
25
47
  const conversation = {
@@ -132,7 +154,7 @@ function applyBackstop(session, conversation, step, turnHints) {
132
154
  }
133
155
  function refuseAccountBilledCaps(options) {
134
156
  if (accountBillingConflicts(options.provider, options)) {
135
- throw new CuaProviderError("request_rejected", {
157
+ throw new ComputerUseProviderError("request_rejected", {
136
158
  dispatched: false,
137
159
  usageComplete: false,
138
160
  cleanup: "confirmed",
@@ -201,7 +223,7 @@ function stopBeforeActing(session, turn, turnNumber) {
201
223
  }
202
224
  return undefined;
203
225
  }
204
- /** Hand the turn's narration to the onMessage hook; see CuaLoopOptions.onMessage. */
226
+ /** Hand the turn's narration to the onMessage tap; see LoopTaps.onMessage. */
205
227
  function forwardNarration(session, turn) {
206
228
  const { onMessage } = session.settings;
207
229
  const narration = [turn.reasoning, turn.message]
@@ -241,7 +263,7 @@ function reviewSafetyChecks(session, conversation, turn) {
241
263
  const { acknowledgeSafetyChecks } = session;
242
264
  const acks = acknowledgeSafetyChecks(turn.pendingSafetyChecks);
243
265
  if (acks === null || acks.length === 0) {
244
- return stops.blockedOnSafetyChecks(session.settings.redaction.redactText(turn.pendingSafetyChecks.map((check) => check.code).join(", ")));
266
+ return stops.blockedOnSafetyChecks(session.settings.redaction.redactText(turn.pendingSafetyChecks.map((check) => check.code).join(", ")), turn.pendingSafetyChecks.length);
245
267
  }
246
268
  conversation.acknowledgedSafetyChecks = acks;
247
269
  return undefined;
@@ -5,8 +5,8 @@ import type { ReasoningEffort } from "../reasoning-effort.js";
5
5
  export declare const OPENAI_RESPONSES_CU_CAPABILITIES: ActorCapabilities;
6
6
  export declare const DEFAULT_OPENAI_CU_MODEL = "gpt-5.6-sol";
7
7
  /**
8
- * The effort a request carries when a lab declares none. Exported because a default that only
9
- * exists as a literal inside the provider is exactly how it stayed invisible: the lab surface has
8
+ * The effort a request carries when a study declares none. Exported because a default that only
9
+ * exists as a literal inside the provider is exactly how it stayed invisible: the study surface has
10
10
  * to be able to say what will actually run.
11
11
  */
12
12
  export declare const DEFAULT_OPENAI_CU_REASONING_EFFORT: ReasoningEffort;
@@ -1,6 +1,6 @@
1
1
  import { validClosingReport } from "./loop.js";
2
- import { CuaAdmissionLimitError, isCuaAdmissionLimitError } from "./admission-limit.js";
3
- import { CuaPromptRefusedError } from "./provider-error.js";
2
+ import { ComputerUseAdmissionLimitError, isComputerUseAdmissionLimitError, } from "./admission-limit.js";
3
+ import { ComputerUsePromptRefusedError } from "./provider-error.js";
4
4
  import { CarriedConversation } from "./openai-context.js";
5
5
  import { acceptReply, ConversationRecord, debriefRequestBody, turnInputItems, turnRequestBody, } from "./openai-requests.js";
6
6
  import { asRecord, optionalString, parseOpenAiResponse, } from "./openai-wire.js";
@@ -56,8 +56,8 @@ export const OPENAI_RESPONSES_CU_CAPABILITIES = {
56
56
  // rate-table key stay stable if OpenAI repoints the alias.
57
57
  export const DEFAULT_OPENAI_CU_MODEL = "gpt-5.6-sol";
58
58
  /**
59
- * The effort a request carries when a lab declares none. Exported because a default that only
60
- * exists as a literal inside the provider is exactly how it stayed invisible: the lab surface has
59
+ * The effort a request carries when a study declares none. Exported because a default that only
60
+ * exists as a literal inside the provider is exactly how it stayed invisible: the study surface has
61
61
  * to be able to say what will actually run.
62
62
  */
63
63
  export const DEFAULT_OPENAI_CU_REASONING_EFFORT = "medium";
@@ -280,8 +280,8 @@ async function postResponse(transport, body, signal, retries, interaction, spend
280
280
  catch (error) {
281
281
  // An explicit local pre-dispatch limit is terminal. Recreate the fixed safe payload
282
282
  // rather than propagating caller-added message/context through the transport seam.
283
- if (isCuaAdmissionLimitError(error))
284
- throw new CuaAdmissionLimitError();
283
+ if (isComputerUseAdmissionLimitError(error))
284
+ throw new ComputerUseAdmissionLimitError();
285
285
  // Dispatch may have reached the provider. Preserve this uncertainty even when a later
286
286
  // retry succeeds or is refused locally; only that later refusal is known not to dispatch.
287
287
  // Under a spend gate the loop accounts for the attempt instead: it books a resend below
@@ -317,7 +317,7 @@ async function postResponse(transport, body, signal, retries, interaction, spend
317
317
  }
318
318
  // A usage-policy flag is terminal for this prompt: typed so the loop names it, never retried.
319
319
  if (namedProviderErrorCode(bodyText) === "invalid_prompt") {
320
- throw new CuaPromptRefusedError("OpenAI", "400 invalid_prompt");
320
+ throw new ComputerUsePromptRefusedError("OpenAI", "400 invalid_prompt");
321
321
  }
322
322
  const detail = requestRejectionDetail(bodyText);
323
323
  throw new Error(`OpenAI Responses 400${detail === undefined ? "" : ` ${detail}`}`);
@@ -452,7 +452,7 @@ export function createOpenAiResponsesProvider(options) {
452
452
  return {
453
453
  id: "openai-responses-cu",
454
454
  version: model,
455
- // The effort the wire actually carries, not the one the lab asked for: the provider defaults
455
+ // The effort the wire actually carries, not the one the study asked for: the provider defaults
456
456
  // an absent request to "medium", and the trace has to say what produced it.
457
457
  modelSettings: {
458
458
  reasoningEffort,
@@ -5,23 +5,23 @@ export declare const isCuaProviderFailurePhase: (value: unknown) => value is Cua
5
5
  declare const codes: readonly ["request_rejected", "unavailable", "busy", "refused", "invalid_response", "protocol_error", "timeout", "cancelled", "process_failed", "cleanup_unconfirmed"];
6
6
  export type CuaProviderErrorCode = (typeof codes)[number];
7
7
  /** Safe local classification. Never attach provider prose, stderr, paths or a raw cause. */
8
- export declare class CuaProviderError extends Error {
8
+ export declare class ComputerUseProviderError extends Error {
9
9
  readonly code: CuaProviderErrorCode;
10
10
  readonly receipt: ProviderRequestReceipt;
11
11
  readonly usage?: ActorTokenUsage;
12
12
  readonly failurePhase?: CuaProviderFailurePhase;
13
13
  constructor(code: CuaProviderErrorCode, receipt: ProviderRequestReceipt, usage?: ActorTokenUsage, failurePhase?: CuaProviderFailurePhase);
14
14
  }
15
- export declare const isCuaProviderError: (value: unknown) => value is CuaProviderError;
15
+ export declare const isComputerUseProviderError: (value: unknown) => value is ComputerUseProviderError;
16
16
  /**
17
17
  * The model provider refused the request under its usage policy (OpenAI `invalid_prompt`). A
18
18
  * refusal is the provider's decision about this prompt, so it is not a harness fault, and sending
19
19
  * the same prompt again is not a recovery path. `providerCode` is the provider's identifier only;
20
20
  * the provider's message can echo the prompt and is never attached.
21
21
  */
22
- export declare class CuaPromptRefusedError extends Error {
22
+ export declare class ComputerUsePromptRefusedError extends Error {
23
23
  readonly providerCode: string;
24
24
  constructor(provider: string, providerCode: string);
25
25
  }
26
- export declare const isCuaPromptRefusedError: (value: unknown) => value is CuaPromptRefusedError;
26
+ export declare const isComputerUsePromptRefusedError: (value: unknown) => value is ComputerUsePromptRefusedError;
27
27
  export {};
@@ -24,7 +24,7 @@ const codes = Object.freeze([
24
24
  ]);
25
25
  const errors = new WeakSet();
26
26
  /** Safe local classification. Never attach provider prose, stderr, paths or a raw cause. */
27
- export class CuaProviderError extends Error {
27
+ export class ComputerUseProviderError extends Error {
28
28
  code;
29
29
  receipt;
30
30
  usage;
@@ -50,7 +50,7 @@ export class CuaProviderError extends Error {
50
50
  throw new TypeError("Invalid participant provider error declaration.");
51
51
  }
52
52
  super(`Participant provider: ${code}`);
53
- this.name = "CuaProviderError";
53
+ this.name = "ComputerUseProviderError";
54
54
  this.code = code;
55
55
  this.receipt = Object.freeze({
56
56
  dispatched: receipt.dispatched,
@@ -66,7 +66,7 @@ export class CuaProviderError extends Error {
66
66
  errors.add(this);
67
67
  }
68
68
  }
69
- export const isCuaProviderError = (value) => typeof value === "object" && value !== null && errors.has(value);
69
+ export const isComputerUseProviderError = (value) => typeof value === "object" && value !== null && errors.has(value);
70
70
  const refusals = new WeakSet();
71
71
  /**
72
72
  * The model provider refused the request under its usage policy (OpenAI `invalid_prompt`). A
@@ -74,13 +74,13 @@ const refusals = new WeakSet();
74
74
  * the same prompt again is not a recovery path. `providerCode` is the provider's identifier only;
75
75
  * the provider's message can echo the prompt and is never attached.
76
76
  */
77
- export class CuaPromptRefusedError extends Error {
77
+ export class ComputerUsePromptRefusedError extends Error {
78
78
  providerCode;
79
79
  constructor(provider, providerCode) {
80
80
  super(`${provider} refused the prompt under its usage policy (${providerCode})`);
81
- this.name = "CuaPromptRefusedError";
81
+ this.name = "ComputerUsePromptRefusedError";
82
82
  this.providerCode = providerCode;
83
83
  refusals.add(this);
84
84
  }
85
85
  }
86
- export const isCuaPromptRefusedError = (value) => typeof value === "object" && value !== null && refusals.has(value);
86
+ export const isComputerUsePromptRefusedError = (value) => typeof value === "object" && value !== null && refusals.has(value);
@@ -1,6 +1,6 @@
1
1
  import type { AffordanceUse } from "./affordance.js";
2
2
  import type { ActorEstimatedCost } from "../run/pricing.js";
3
- import type { TaskFunnel } from "../lab/tasks.js";
3
+ import type { TaskFunnel } from "../study/tasks.js";
4
4
  import { type CuaProviderFailurePhase } from "./computer-use/provider-error.js";
5
5
  export declare const ACTOR_TRACE_SCHEMA = "humanish.actor-trace.v1";
6
6
  /**
@@ -271,7 +271,7 @@ export interface ActorTrace {
271
271
  * carried. Present on traces whose provider declares settings; absent everywhere else and on
272
272
  * every pre-existing bundle, and its absence is tolerated by verify.
273
273
  *
274
- * It exists because effort was a silent constant: unreachable from a lab, so every run took the
274
+ * It exists because effort was a silent constant: unreachable from a study, so every run took the
275
275
  * provider default. Effort is part of who the participant was, not of how the instrument was
276
276
  * tuned (docs/principles/actor-fidelity.md), so a trace that does not carry it is a result with
277
277
  * half its sample description missing, and two such traces cannot be compared.
@@ -294,8 +294,8 @@ export interface ActorTrace {
294
294
  affordanceUse?: AffordanceUse;
295
295
  /**
296
296
  * Additive + optional task funnel (humanish.task-funnel.v1): how far this participant got
297
- * through the lab's declared protocol, corroborated per task by observations rather than by the
298
- * actor's own narration. Present only when the lab declared `tasks` and the session ran; absent
297
+ * through the study's declared protocol, corroborated per task by observations rather than by the
298
+ * actor's own narration. Present only when the study declared `tasks` and the session ran; absent
299
299
  * on every pre-existing bundle and on dry-run contract bundles (a funnel that
300
300
  * was never measured is not an empty funnel). Its absence is tolerated by verify.
301
301
  */
@@ -6,7 +6,7 @@ import { isCuaProviderFailurePhase, } from "./computer-use/provider-error.js";
6
6
  // The schema maps the providers and routes implemented by the closed first-party
7
7
  // registry. The broader Actor.run(input) and ApprovalPolicy contract remains
8
8
  // design-only and is intentionally absent from these runtime types. RedactionHooks
9
- // (src/evidence/redaction.ts) and ResolvedPersona (src/lab/persona.ts) ship in
9
+ // (src/evidence/redaction.ts) and ResolvedPersona (src/study/persona.ts) ship in
10
10
  // their own modules.
11
11
  export const ACTOR_TRACE_SCHEMA = "humanish.actor-trace.v1";
12
12
  /**
@@ -2,7 +2,7 @@
2
2
  //
3
3
  // Why: `actors[].localAgent: codex` already runs through a persistent app-server thread,
4
4
  // so the participant remembers what it tried. `claude` spawned `claude -p` per turn, so every
5
- // turn started cold. Measured on the same lab with the same credentials (n=1 each): one-shot,
5
+ // turn started cold. Measured on the same study with the same credentials (n=1 each): one-shot,
6
6
  // 188 actions over 90 turns and never finished; a thread that remembers, 21 actions over 8 turns
7
7
  // and goal_satisfied in 103 s. A participant that cannot remember trying the menu tries the menu
8
8
  // again. Until this existed, comparing the two agents measured the transport, not the model.
@@ -22,7 +22,7 @@ import { mkdtemp, rm, unlink, writeFile } from "node:fs/promises";
22
22
  import { tmpdir } from "node:os";
23
23
  import path from "node:path";
24
24
  import readline from "node:readline";
25
- import { CuaProviderError } from "../computer-use/provider-error.js";
25
+ import { ComputerUseProviderError } from "../computer-use/provider-error.js";
26
26
  import { declaredOutcomeOf, parseAgentJson, promptFor, toCuaActions, LOCAL_AGENT_CAPABILITIES, } from "./cli.js";
27
27
  /** How long Claude Code may take to acknowledge an interrupt before the session is ended. */
28
28
  const INTERRUPT_RECEIPT_TIMEOUT_MS = 5_000;
@@ -289,7 +289,7 @@ export async function startClaudeSession(options = {}) {
289
289
  usageIncomplete = true;
290
290
  if (error instanceof ClaudeSessionDesyncError) {
291
291
  // The stream no longer pairs results with turns, so no later turn can trust it.
292
- throw new CuaProviderError("protocol_error", {
292
+ throw new ComputerUseProviderError("protocol_error", {
293
293
  dispatched: "unknown",
294
294
  usageComplete: false,
295
295
  cleanup: "unconfirmed",
@@ -49,7 +49,7 @@ export interface LocalAgentProviderOptions {
49
49
  timeoutMs?: number;
50
50
  /**
51
51
  * Recorded in the trace's model settings. Low by default: a computer-use run is sixty turns, and
52
- * a high-effort answer per turn costs minutes. The lab can raise it.
52
+ * a high-effort answer per turn costs minutes. The study can raise it.
53
53
  */
54
54
  reasoningEffort?: ReasoningEffort;
55
55
  /** Model override passed to the CLI (`--model`). Absent = the CLI's own default. */
@@ -401,7 +401,7 @@ export const NO_LOCAL_AGENT_MESSAGE = "no local coding agent found. openai-compu
401
401
  /** Doctor's row for one installed agent, in the register the other rows use. */
402
402
  export function localAgentDoctorMessage(agent) {
403
403
  if (agent.authStatus === "authenticated")
404
- return `${agent.label} reports signed in; a lab with actors[0].type: local-agent can use it instead of a provider API key. Account access and limits are untested.`;
404
+ return `${agent.label} reports signed in; a study with actors[0].type: local-agent can use it instead of a provider API key. Account access and limits are untested.`;
405
405
  const status = agent.id === "codex" ? "codex login status" : "claude auth status";
406
406
  return agent.authStatus === "unauthenticated"
407
407
  ? `${agent.label} is installed and reports not signed in; run \`${agent.id === "codex" ? "codex login" : "claude auth login"}\``
@@ -1,7 +1,7 @@
1
- // The provider-declared reasoning-effort vocabulary, kept in its own module so the lab schema and
1
+ // The provider-declared reasoning-effort vocabulary, kept in its own module so the study schema and
2
2
  // the OpenAI provider can share it without the schema depending on a provider.
3
3
  //
4
- // Why this exists: effort was reachable in the provider and unreachable from a lab. Every
4
+ // Why this exists: effort was reachable in the provider and unreachable from a study. Every
5
5
  // computer-use run humanish had ever done was therefore the provider default, not by decision but
6
6
  // by omission. Effort changes who the participant is, the same way a persona prompt does
7
7
  // (docs/principles/actor-fidelity.md: capability settings are recruiting decisions), so pinning it
@@ -10,7 +10,7 @@
10
10
  //
11
11
  // Support is model-dependent. OpenAI documents the vocabulary below as the union across models and
12
12
  // states plainly that "supported values are model-dependent"; there is no offline way to know which
13
- // subset a given model id accepts. So this module refuses to pretend: it validates that a lab asked
13
+ // subset a given model id accepts. So this module refuses to pretend: it validates that a study asked
14
14
  // for a real effort level, and a model that does not support the one it was asked for fails on the
15
15
  // first turn with the provider's own message rather than being silently downgraded. Silent
16
16
  // downgrade is the worse failure: it would record an effort the run did not actually use.
@@ -31,7 +31,7 @@ export type ActorDescriptor = CodexActorDescriptor | CuaActorDescriptor | Script
31
31
  * CuaActorDescriptor: its runSession takes CuaActorSessionOptions and returns a CuaLoopResult.
32
32
  * Any future computer-use provider (e.g. stagehand-cua) must keep that session signature and add
33
33
  * its id to CuaActorDescriptor["id"], so code narrowed by this guard can still tell the ids apart.
34
- * This guard is what lets the lab dispatch on capabilities rather than on hardcoded actor ids.
34
+ * This guard is what lets humanish dispatch on capabilities rather than on hardcoded actor ids.
35
35
  */
36
36
  export declare function isCuaActorDescriptor(descriptor: ActorDescriptor): descriptor is CuaActorDescriptor;
37
37
  /**
@@ -39,7 +39,7 @@ export declare function isCuaActorDescriptor(descriptor: ActorDescriptor): descr
39
39
  * "scripted-browser" run kind is a ScriptedBrowserActorDescriptor; runSession takes
40
40
  * ScriptedBrowserSessionOptions and returns ScriptedBrowserSessionResult (trace fully formed,
41
41
  * like the CUA shape; no separate toActorTrace). Any future scripted driver (e.g. a HAR
42
- * replayer) must keep this signature; it is what lets the lab dispatch on capabilities, not ids.
42
+ * replayer) must keep this signature; it is what lets humanish dispatch on capabilities.
43
43
  */
44
44
  export declare function isScriptedBrowserActorDescriptor(descriptor: ActorDescriptor): descriptor is ScriptedBrowserActorDescriptor;
45
45
  /**
@@ -10,7 +10,7 @@ import { runScriptedBrowserSession, } from "./scripted-browser/actor.js";
10
10
  * CuaActorDescriptor: its runSession takes CuaActorSessionOptions and returns a CuaLoopResult.
11
11
  * Any future computer-use provider (e.g. stagehand-cua) must keep that session signature and add
12
12
  * its id to CuaActorDescriptor["id"], so code narrowed by this guard can still tell the ids apart.
13
- * This guard is what lets the lab dispatch on capabilities rather than on hardcoded actor ids.
13
+ * This guard is what lets humanish dispatch on capabilities rather than on hardcoded actor ids.
14
14
  */
15
15
  export function isCuaActorDescriptor(descriptor) {
16
16
  return descriptor.capabilities.lanes.includes("computer-use");
@@ -20,7 +20,7 @@ export function isCuaActorDescriptor(descriptor) {
20
20
  * "scripted-browser" run kind is a ScriptedBrowserActorDescriptor; runSession takes
21
21
  * ScriptedBrowserSessionOptions and returns ScriptedBrowserSessionResult (trace fully formed,
22
22
  * like the CUA shape; no separate toActorTrace). Any future scripted driver (e.g. a HAR
23
- * replayer) must keep this signature; it is what lets the lab dispatch on capabilities, not ids.
23
+ * replayer) must keep this signature; it is what lets humanish dispatch on capabilities.
24
24
  */
25
25
  export function isScriptedBrowserActorDescriptor(descriptor) {
26
26
  return descriptor.capabilities.lanes.includes("scripted-browser");
@@ -74,7 +74,7 @@ export const actorRegistry = {
74
74
  },
75
75
  // The ActorId names the terminal-product dispatch slot; the live route records the concrete
76
76
  // provider as "codex". keyPlacement "in-sandbox-command-scoped" is registry-declared and
77
- // enforced by runTerminalProductLab before it creates a sandbox, which is where this actor runs.
77
+ // enforced by runTerminalProductStudy before it creates a sandbox, which is where this actor runs.
78
78
  "codex-exec": {
79
79
  id: "codex-exec",
80
80
  label: "Codex Exec (autonomous terminal agent, in-sandbox)",
@@ -15,7 +15,7 @@ export interface ScriptedBrowserSessionOptions {
15
15
  /** id = actors[0].persona ?? "scripted-journey"; promptDigest = journey.sourceDigest prefix
16
16
  * (the step manifest is the "prompt"; no model prompt exists on this route). */
17
17
  persona: ActorPersonaRef;
18
- /** Journey wall-clock budget in ms; the lab route passes execution.timeoutMs or 300_000. */
18
+ /** Journey wall-clock budget in ms; the route passes execution.timeoutMs or 300_000. */
19
19
  timeoutMs: number;
20
20
  /** Absolute; the session writes screenshots/ and traces/<surface>.json beneath it. */
21
21
  artifactRoot: string;
@@ -45,5 +45,5 @@ export interface ScriptedBrowserSessionResult extends ActorSessionResult {
45
45
  * approvals exist on a deterministic replay), asserted in tests.
46
46
  */
47
47
  export declare function runScriptedBrowserSession(options: ScriptedBrowserSessionOptions): Promise<ScriptedBrowserSessionResult>;
48
- /** Internal lab seam: the run root is already prepared and must stay bound to that identity. */
48
+ /** Internal route seam: the run root is already prepared and must stay bound to that identity. */
49
49
  export declare function runScriptedBrowserSessionInPreparedRoot(options: ScriptedBrowserSessionOptions, preparedArtifactRoot: PreparedOutputRoot): Promise<ScriptedBrowserSessionResult>;
@@ -69,7 +69,7 @@ export async function runScriptedBrowserSession(options) {
69
69
  const preparedArtifactRoot = await prepareSelectedOutputDirectory(process.cwd(), options.artifactRoot);
70
70
  return runScriptedBrowserSessionInPreparedRoot(options, preparedArtifactRoot);
71
71
  }
72
- /** Internal lab seam: the run root is already prepared and must stay bound to that identity. */
72
+ /** Internal route seam: the run root is already prepared and must stay bound to that identity. */
73
73
  export async function runScriptedBrowserSessionInPreparedRoot(options, preparedArtifactRoot) {
74
74
  assertScriptedSessionPathIds(options);
75
75
  await prepareContainedOutputDirectory(preparedArtifactRoot, "screenshots");
@@ -1,16 +1,16 @@
1
1
  import { FinishedRun } from "../run/run.js";
2
2
  import type { AnalysisConfig } from "./types.js";
3
- import type { LabDeps } from "../lab/lab-deps.js";
4
- import type { LabEvent } from "../lab/run-lab-events.js";
3
+ import type { StudyDeps } from "../study/study-deps.js";
4
+ import type { StudyEvent } from "../study/run-study-events.js";
5
5
  import { type AutomaticAnalysisDeps } from "./automatic.js";
6
6
  import type { AutomaticAnalysisOutcome } from "./job.js";
7
7
  /** What a route's input gives its analysis: the test's runner and deps, the signal and onEvent. */
8
8
  export interface AnalysisInput {
9
- readonly deps?: Pick<LabDeps, "analysis">;
9
+ readonly deps?: Pick<StudyDeps, "analysis">;
10
10
  /** Cancels the analysis only. */
11
11
  readonly analysisSignal?: AbortSignal;
12
12
  /** Receives analysis-started and analysis-finished. */
13
- readonly emit?: (event: LabEvent) => void;
13
+ readonly emit?: (event: StudyEvent) => void;
14
14
  }
15
15
  export interface AutomaticAnalysisResult {
16
16
  automaticAnalysis?: AutomaticAnalysisOutcome;
@@ -27,15 +27,15 @@ export declare function completeAutomaticAnalysis<T extends {
27
27
  runId: string;
28
28
  dryRun: boolean;
29
29
  }>(result: T, finished: FinishedRun | undefined, config: AnalysisConfig | undefined, input: AnalysisInput | undefined, { trigger, preferLargerOutput, refusal, }?: {
30
- /** "default" when the lab declared no analysis; its missing-key skip is not a failure. */
30
+ /** "default" when the study declared no analysis; its missing-key skip is not a failure. */
31
31
  trigger?: "default" | "explicit";
32
- /** The lab omitted an output limit, so a larger one may be used within the admission budget. */
32
+ /** The study omitted an output limit, so a larger one may be used within the admission budget. */
33
33
  preferLargerOutput?: boolean;
34
34
  /** The route's reason not to analyze this run; see AutomaticAnalysisDeps.refusal. */
35
35
  refusal?: AutomaticAnalysisDeps["refusal"];
36
36
  }): Promise<T & AutomaticAnalysisResult>;
37
37
  /**
38
- * True when an analysis the lab never declared was refused because its conservative estimate is
38
+ * True when an analysis the study never declared was refused because its conservative estimate is
39
39
  * over the default cap. The author did not ask for it, so the refusal does not fail the run;
40
40
  * `humanish analyze --max-cost` can still run it.
41
41
  */
@@ -72,7 +72,7 @@ export async function completeAutomaticAnalysis(result, finished, config, input,
72
72
  }
73
73
  }
74
74
  /**
75
- * True when an analysis the lab never declared was refused because its conservative estimate is
75
+ * True when an analysis the study never declared was refused because its conservative estimate is
76
76
  * over the default cap. The author did not ask for it, so the refusal does not fail the run;
77
77
  * `humanish analyze --max-cost` can still run it.
78
78
  */
@@ -1,14 +1,14 @@
1
- import type { LabRoute } from "../lab/plan.js";
1
+ import type { StudyRoute } from "../study/plan.js";
2
2
  import type { AnalysisConfig } from "./types.js";
3
3
  export declare const DEFAULT_ANALYSIS_TIMEOUT_MS = 600000;
4
4
  export declare const DEFAULT_ANALYSIS_MODEL = "gpt-6-astra";
5
- interface LabAnalysisSettings {
5
+ interface StudyAnalysisSettings {
6
6
  model?: string;
7
7
  question?: string;
8
8
  timeoutMs?: number;
9
9
  }
10
- /** The lab's review.analysis: a provider selection for a separate review after a live study. */
11
- export type LabAnalysis = LabAnalysisSettings & ({
10
+ /** The study's review.analysis: a provider selection for a separate review after a live study. */
11
+ export type StudyAnalysis = StudyAnalysisSettings & ({
12
12
  provider?: "openai";
13
13
  maxCostUsd: number;
14
14
  maxOutputTokens?: number;
@@ -17,7 +17,7 @@ export type LabAnalysis = LabAnalysisSettings & ({
17
17
  maxCostUsd?: null;
18
18
  maxOutputTokens?: null;
19
19
  });
20
- /** The spend cap on an analysis the lab did not declare. */
20
+ /** The spend cap on an analysis the study did not declare. */
21
21
  export declare const DEFAULT_ANALYSIS_MAX_COST_USD = 3;
22
22
  /** Called for parsed manifests and direct library configs, before participant execution. */
23
23
  export declare function resolveAutomaticAnalysis(raw: unknown): {
@@ -36,6 +36,6 @@ export interface AutomaticAnalysisBudget {
36
36
  trigger: "default" | "explicit";
37
37
  }
38
38
  /** Metadata only: resolving the future live-run budget never reads keys or dispatches. */
39
- export declare function automaticAnalysisBudget(raw: unknown, route: LabRoute): AutomaticAnalysisBudget | undefined;
39
+ export declare function automaticAnalysisBudget(raw: unknown, route: StudyRoute): AutomaticAnalysisBudget | undefined;
40
40
  export declare function formatAutomaticAnalysisBudget(budget: AutomaticAnalysisBudget): string;
41
41
  export {};
@@ -22,7 +22,7 @@ const SENSITIVE_QUESTION = {
22
22
  ok: false,
23
23
  message: "review.analysis.question contains sensitive text and cannot be sent for analysis.",
24
24
  };
25
- /** The spend cap on an analysis the lab did not declare. */
25
+ /** The spend cap on an analysis the study did not declare. */
26
26
  export const DEFAULT_ANALYSIS_MAX_COST_USD = 3;
27
27
  /** Called for parsed manifests and direct library configs, before participant execution. */
28
28
  export function resolveAutomaticAnalysis(raw) {