humanish 0.108.0 → 0.109.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. package/ARCHITECTURE.md +58 -59
  2. package/CHANGELOG.md +22 -0
  3. package/CONTEXT.md +44 -44
  4. package/README.md +3 -3
  5. package/TELEMETRY.md +2 -2
  6. package/dist/actors/codex/app-server-trace.js +2 -1
  7. package/dist/actors/codex/restricted-participant.js +12 -12
  8. package/dist/actors/codex/restricted-session.d.ts +2 -2
  9. package/dist/actors/computer-use/actor.d.ts +6 -6
  10. package/dist/actors/computer-use/actor.js +2 -2
  11. package/dist/actors/computer-use/admission-limit.d.ts +2 -2
  12. package/dist/actors/computer-use/admission-limit.js +3 -3
  13. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  14. package/dist/actors/computer-use/executor-error.js +3 -3
  15. package/dist/actors/computer-use/loop/actions.js +5 -5
  16. package/dist/actors/computer-use/loop/debrief.js +2 -2
  17. package/dist/actors/computer-use/loop/ending.d.ts +1 -1
  18. package/dist/actors/computer-use/loop/ending.js +12 -11
  19. package/dist/actors/computer-use/loop/observation.js +6 -5
  20. package/dist/actors/computer-use/loop/provider-call.js +11 -11
  21. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  22. package/dist/actors/computer-use/loop/session.js +2 -2
  23. package/dist/actors/computer-use/loop/trace.js +3 -2
  24. package/dist/actors/computer-use/loop/types.d.ts +24 -24
  25. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  26. package/dist/actors/computer-use/loop.d.ts +6 -1
  27. package/dist/actors/computer-use/loop.js +26 -4
  28. package/dist/actors/computer-use/openai-provider.d.ts +2 -2
  29. package/dist/actors/computer-use/openai-provider.js +8 -8
  30. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  31. package/dist/actors/computer-use/provider-error.js +6 -6
  32. package/dist/actors/contract.d.ts +4 -4
  33. package/dist/actors/contract.js +1 -1
  34. package/dist/actors/local-agent/claude-session.js +3 -3
  35. package/dist/actors/local-agent/cli.d.ts +1 -1
  36. package/dist/actors/local-agent/cli.js +1 -1
  37. package/dist/actors/reasoning-effort.js +3 -3
  38. package/dist/actors/registry.d.ts +2 -2
  39. package/dist/actors/registry.js +3 -3
  40. package/dist/actors/scripted-browser/actor.d.ts +2 -2
  41. package/dist/actors/scripted-browser/actor.js +1 -1
  42. package/dist/analysis/automatic-completion.d.ts +7 -7
  43. package/dist/analysis/automatic-completion.js +1 -1
  44. package/dist/analysis/automatic-config.d.ts +6 -6
  45. package/dist/analysis/automatic-config.js +1 -1
  46. package/dist/analysis/execute.d.ts +1 -1
  47. package/dist/analysis/execute.js +1 -1
  48. package/dist/analysis/types.d.ts +6 -0
  49. package/dist/browser-control/client.js +16 -16
  50. package/dist/browser-control/dispatcher.js +4 -4
  51. package/dist/browser-control/protocol.js +14 -14
  52. package/dist/browser-control/recording-transfer.js +4 -4
  53. package/dist/browser-control/transport.js +7 -7
  54. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  55. package/dist/cli/commands/comms.js +14 -22
  56. package/dist/cli/commands/migrate.js +15 -4
  57. package/dist/cli/commands/observe.d.ts +0 -1
  58. package/dist/cli/commands/observe.js +0 -15
  59. package/dist/cli/commands/run-command.d.ts +2 -2
  60. package/dist/cli/commands/run-command.js +3 -3
  61. package/dist/cli/commands/runs.js +9 -7
  62. package/dist/cli/commands/setup.js +5 -7
  63. package/dist/cli/commands/study-format.d.ts +9 -0
  64. package/dist/cli/commands/{lab-format.js → study-format.js} +5 -5
  65. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  66. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +12 -12
  67. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  68. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  69. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  70. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +3 -3
  71. package/dist/cli/commands/study-route-run.d.ts +19 -0
  72. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  73. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  74. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  75. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  76. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +7 -7
  77. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  78. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  79. package/dist/cli/commands/study-run.d.ts +9 -0
  80. package/dist/cli/commands/{lab-run.js → study-run.js} +34 -34
  81. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +5 -5
  82. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +1 -1
  83. package/dist/cli/commands/study.js +13 -49
  84. package/dist/cli/commands/tui.js +12 -12
  85. package/dist/cli/commands/watch.js +30 -65
  86. package/dist/cli/deprecations.d.ts +1 -13
  87. package/dist/cli/deprecations.js +0 -30
  88. package/dist/cli/doctor.d.ts +3 -3
  89. package/dist/cli/doctor.js +16 -16
  90. package/dist/cli/first-run-path.d.ts +4 -4
  91. package/dist/cli/first-run-path.js +7 -7
  92. package/dist/cli/io.d.ts +3 -3
  93. package/dist/cli/io.js +2 -2
  94. package/dist/cli/observer-follow.d.ts +2 -2
  95. package/dist/cli/observer-follow.js +2 -2
  96. package/dist/cli/orientation.d.ts +4 -4
  97. package/dist/cli/orientation.js +58 -20
  98. package/dist/cli/program.js +3 -4
  99. package/dist/cli/telemetry.d.ts +1 -1
  100. package/dist/cli/telemetry.js +14 -20
  101. package/dist/comms/catch-host.d.ts +1 -1
  102. package/dist/comms/catch-host.js +3 -3
  103. package/dist/comms/connections.d.ts +1 -1
  104. package/dist/comms/connections.js +2 -2
  105. package/dist/comms/external-evidence.d.ts +5 -5
  106. package/dist/comms/external-evidence.js +4 -3
  107. package/dist/comms/fake-inbox.d.ts +2 -2
  108. package/dist/comms/fake-inbox.js +2 -2
  109. package/dist/comms/receiving-runtime.d.ts +4 -4
  110. package/dist/comms/sandbox-catch.d.ts +2 -2
  111. package/dist/comms/sandbox-catch.js +2 -2
  112. package/dist/comms/setup.d.ts +2 -2
  113. package/dist/comms/setup.js +29 -32
  114. package/dist/evidence/redaction.d.ts +11 -0
  115. package/dist/evidence/redaction.js +43 -0
  116. package/dist/feedback/draft.js +2 -2
  117. package/dist/feedback/export-bundle.js +5 -4
  118. package/dist/feedback/export.js +3 -2
  119. package/dist/feedback/proof.d.ts +1 -1
  120. package/dist/feedback/proof.js +2 -2
  121. package/dist/guest/bootstrap.js +6 -6
  122. package/dist/guest/browser-tools.js +8 -8
  123. package/dist/guest/chromium-text.js +17 -17
  124. package/dist/guest/desktop-executor.d.ts +2 -2
  125. package/dist/guest/desktop-executor.js +20 -20
  126. package/dist/guest/desktop-keys.js +4 -4
  127. package/dist/guest/desktop-media.d.ts +2 -2
  128. package/dist/guest/desktop-media.js +16 -16
  129. package/dist/guest/desktop-native.js +10 -10
  130. package/dist/guest/runtime-desktop.js +2 -2
  131. package/dist/guest/runtime-processes.d.ts +2 -2
  132. package/dist/guest/runtime-processes.js +2 -2
  133. package/dist/guest/runtime.js +5 -5
  134. package/dist/index.d.ts +13 -15
  135. package/dist/index.js +6 -8
  136. package/dist/observer/artifact.d.ts +1 -1
  137. package/dist/observer/artifact.js +1 -1
  138. package/dist/observer/data.d.ts +1 -1
  139. package/dist/observer/library.d.ts +2 -0
  140. package/dist/observer/library.js +4 -1
  141. package/dist/observer/render.js +7 -1
  142. package/dist/observer/run-routes.d.ts +1 -0
  143. package/dist/observer/run-routes.js +37 -12
  144. package/dist/observer/serve.d.ts +1 -1
  145. package/dist/observer-app.html +1 -1
  146. package/dist/routes/computer-use/bundle-parts.js +3 -2
  147. package/dist/routes/computer-use/bundle.d.ts +2 -2
  148. package/dist/routes/computer-use/bundle.js +7 -6
  149. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +5 -5
  150. package/dist/routes/computer-use/e2b-desktop/comms.js +5 -4
  151. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +1 -1
  152. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  153. package/dist/routes/computer-use/e2b-desktop/prepare.js +3 -3
  154. package/dist/routes/computer-use/e2b-desktop/start.js +3 -4
  155. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  156. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -3
  157. package/dist/routes/computer-use/external-comms.d.ts +3 -3
  158. package/dist/routes/computer-use/fanout-bundle.js +11 -10
  159. package/dist/routes/computer-use/fanout-records.js +2 -2
  160. package/dist/routes/computer-use/in-process-desktop.js +1 -1
  161. package/dist/routes/computer-use/live-flush.d.ts +3 -3
  162. package/dist/routes/computer-use/live-phase.d.ts +2 -3
  163. package/dist/routes/computer-use/live-phase.js +3 -3
  164. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  165. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  166. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  167. package/dist/routes/computer-use/local-vm.js +2 -2
  168. package/dist/routes/computer-use/participant-desktop.d.ts +3 -3
  169. package/dist/routes/computer-use/participant-desktop.js +1 -1
  170. package/dist/routes/computer-use/participant-execution.js +1 -1
  171. package/dist/routes/computer-use/participant-model.js +3 -3
  172. package/dist/routes/computer-use/participant-prompt.d.ts +5 -5
  173. package/dist/routes/computer-use/participant-prompt.js +3 -3
  174. package/dist/routes/computer-use/participant-runs.d.ts +10 -10
  175. package/dist/routes/computer-use/participant-runs.js +14 -13
  176. package/dist/routes/computer-use/plan.d.ts +12 -12
  177. package/dist/routes/computer-use/plan.js +27 -27
  178. package/dist/routes/computer-use/preflight.d.ts +5 -5
  179. package/dist/routes/computer-use/preflight.js +5 -5
  180. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  181. package/dist/routes/computer-use/rerun-selection.js +3 -2
  182. package/dist/routes/computer-use/result.d.ts +4 -4
  183. package/dist/routes/computer-use/result.js +13 -12
  184. package/dist/routes/computer-use/route.d.ts +12 -12
  185. package/dist/routes/computer-use/route.js +19 -19
  186. package/dist/routes/computer-use/self-report.js +1 -1
  187. package/dist/routes/computer-use/setup.d.ts +22 -22
  188. package/dist/routes/computer-use/setup.js +15 -15
  189. package/dist/routes/computer-use/single-bundle.d.ts +4 -4
  190. package/dist/routes/computer-use/single-bundle.js +14 -13
  191. package/dist/routes/computer-use/subject-projection.d.ts +3 -3
  192. package/dist/routes/computer-use/types.d.ts +34 -34
  193. package/dist/routes/computer-use/types.js +3 -3
  194. package/dist/routes/preview.d.ts +6 -6
  195. package/dist/routes/preview.js +5 -5
  196. package/dist/routes/scripted/bundle.d.ts +6 -6
  197. package/dist/routes/scripted/bundle.js +10 -9
  198. package/dist/routes/scripted/plan.d.ts +7 -7
  199. package/dist/routes/scripted/plan.js +6 -6
  200. package/dist/routes/scripted/result.d.ts +3 -3
  201. package/dist/routes/scripted/result.js +9 -9
  202. package/dist/routes/scripted/route.d.ts +9 -9
  203. package/dist/routes/scripted/route.js +11 -11
  204. package/dist/routes/scripted/scenario.d.ts +1 -1
  205. package/dist/routes/scripted/scenario.js +3 -3
  206. package/dist/routes/scripted/setup.d.ts +6 -6
  207. package/dist/routes/scripted/setup.js +4 -4
  208. package/dist/routes/scripted/subject.d.ts +5 -5
  209. package/dist/routes/scripted/subject.js +3 -3
  210. package/dist/routes/scripted/surface-records.d.ts +1 -1
  211. package/dist/routes/scripted/surface-records.js +2 -2
  212. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  213. package/dist/routes/scripted/types.d.ts +17 -17
  214. package/dist/routes/scripted/types.js +1 -1
  215. package/dist/routes/shared-world/bundle-records.js +3 -3
  216. package/dist/routes/shared-world/bundle.js +15 -14
  217. package/dist/routes/shared-world/checkpoints.d.ts +3 -3
  218. package/dist/routes/shared-world/checkpoints.js +1 -1
  219. package/dist/routes/shared-world/comms.d.ts +9 -9
  220. package/dist/routes/shared-world/comms.js +6 -5
  221. package/dist/routes/shared-world/participant-specs.d.ts +3 -3
  222. package/dist/routes/shared-world/participant-specs.js +7 -7
  223. package/dist/routes/shared-world/plan.d.ts +9 -9
  224. package/dist/routes/shared-world/plan.js +9 -9
  225. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  226. package/dist/routes/shared-world/provisioned.js +4 -4
  227. package/dist/routes/shared-world/result.d.ts +6 -6
  228. package/dist/routes/shared-world/result.js +11 -10
  229. package/dist/routes/shared-world/route.d.ts +11 -11
  230. package/dist/routes/shared-world/route.js +19 -19
  231. package/dist/routes/shared-world/setup.d.ts +13 -13
  232. package/dist/routes/shared-world/setup.js +19 -19
  233. package/dist/routes/shared-world/types.d.ts +27 -27
  234. package/dist/routes/terminal/adapter.d.ts +2 -2
  235. package/dist/routes/terminal/adapter.js +4 -4
  236. package/dist/routes/terminal/bundle.d.ts +11 -11
  237. package/dist/routes/terminal/bundle.js +12 -12
  238. package/dist/routes/terminal/credentials.d.ts +4 -4
  239. package/dist/routes/terminal/credentials.js +5 -5
  240. package/dist/routes/terminal/dry-run.d.ts +4 -4
  241. package/dist/routes/terminal/dry-run.js +9 -9
  242. package/dist/routes/terminal/ledger.d.ts +2 -2
  243. package/dist/routes/terminal/lifetime.d.ts +1 -1
  244. package/dist/routes/terminal/lifetime.js +1 -1
  245. package/dist/routes/terminal/live-finish.d.ts +2 -2
  246. package/dist/routes/terminal/live-finish.js +7 -7
  247. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  248. package/dist/routes/terminal/live-sandbox.js +3 -2
  249. package/dist/routes/terminal/participant-text.js +2 -1
  250. package/dist/routes/terminal/persona.d.ts +2 -2
  251. package/dist/routes/terminal/persona.js +2 -2
  252. package/dist/routes/terminal/plan.d.ts +7 -7
  253. package/dist/routes/terminal/plan.js +5 -5
  254. package/dist/routes/terminal/result.d.ts +5 -5
  255. package/dist/routes/terminal/result.js +7 -7
  256. package/dist/routes/terminal/route.d.ts +9 -9
  257. package/dist/routes/terminal/route.js +14 -14
  258. package/dist/routes/terminal/session.d.ts +5 -5
  259. package/dist/routes/terminal/session.js +7 -7
  260. package/dist/routes/terminal/trace.d.ts +2 -2
  261. package/dist/routes/terminal/types.d.ts +24 -24
  262. package/dist/routes/terminal/types.js +2 -2
  263. package/dist/run/bundle.d.ts +7 -7
  264. package/dist/run/bundle.js +2 -2
  265. package/dist/run/costs.d.ts +23 -0
  266. package/dist/run/costs.js +72 -43
  267. package/dist/run/dry-run-inputs.d.ts +1 -1
  268. package/dist/run/dry-run-inputs.js +1 -1
  269. package/dist/run/dry-run.js +2 -2
  270. package/dist/run/outcomes.d.ts +1 -1
  271. package/dist/run/participant.d.ts +1 -1
  272. package/dist/run/preflight-receipts.js +1 -1
  273. package/dist/run/pricing.js +2 -2
  274. package/dist/run/projection.d.ts +32 -32
  275. package/dist/run/projection.js +44 -44
  276. package/dist/run/reclaim.d.ts +1 -1
  277. package/dist/run/reclaim.js +1 -1
  278. package/dist/run/results.d.ts +2 -2
  279. package/dist/run/run-cost.d.ts +53 -0
  280. package/dist/run/run-cost.js +105 -0
  281. package/dist/run/run-index-analysis.d.ts +15 -0
  282. package/dist/run/run-index-analysis.js +77 -0
  283. package/dist/run/run-index.d.ts +11 -1
  284. package/dist/run/run-index.js +63 -49
  285. package/dist/run/run.d.ts +3 -3
  286. package/dist/run/run.js +2 -2
  287. package/dist/run/shared-world-evidence.d.ts +1 -1
  288. package/dist/run/shared-world-shape.js +1 -1
  289. package/dist/run/stats.d.ts +3 -3
  290. package/dist/run/stats.js +14 -14
  291. package/dist/run/status.d.ts +10 -2
  292. package/dist/run/status.js +6 -3
  293. package/dist/run/streams.d.ts +2 -2
  294. package/dist/run/study-provenance.d.ts +4 -2
  295. package/dist/run/study-provenance.js +7 -4
  296. package/dist/run/study-result.d.ts +0 -5
  297. package/dist/run/study-result.js +1 -1
  298. package/dist/run-study.d.ts +112 -0
  299. package/dist/{run-lab.js → run-study.js} +52 -45
  300. package/dist/{lab → study}/adapter-extension.d.ts +8 -20
  301. package/dist/{lab → study}/adapter-extension.js +2 -14
  302. package/dist/{lab → study}/adapter-scorer-loader.d.ts +10 -10
  303. package/dist/{lab → study}/adapter-scorer-loader.js +3 -3
  304. package/dist/study/composition-rules.d.ts +7 -0
  305. package/dist/{lab → study}/composition-rules.js +12 -12
  306. package/dist/study/config.d.ts +15 -0
  307. package/dist/{lab → study}/config.js +37 -20
  308. package/dist/study/convert.d.ts +1 -1
  309. package/dist/study/convert.js +15 -15
  310. package/dist/{lab → study}/device-presets.d.ts +2 -2
  311. package/dist/{lab → study}/discover.d.ts +29 -23
  312. package/dist/{lab → study}/discover.js +97 -118
  313. package/dist/{lab → study}/doctor.d.ts +11 -11
  314. package/dist/{lab → study}/doctor.js +18 -18
  315. package/dist/study/files.d.ts +2 -2
  316. package/dist/study/files.js +6 -5
  317. package/dist/{lab → study}/init-templates.d.ts +2 -2
  318. package/dist/{lab → study}/init-templates.js +16 -11
  319. package/dist/{lab → study}/init.d.ts +1 -1
  320. package/dist/{lab → study}/init.js +7 -4
  321. package/dist/{lab → study}/keys.d.ts +2 -2
  322. package/dist/{lab → study}/keys.js +10 -10
  323. package/dist/study/migrate.d.ts +8 -3
  324. package/dist/study/migrate.js +60 -4
  325. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  326. package/dist/{lab → study}/parse/actors.js +5 -5
  327. package/dist/study/parse/comms.d.ts +12 -0
  328. package/dist/study/parse/execution.d.ts +19 -0
  329. package/dist/{lab → study}/parse/study-v3.d.ts +3 -5
  330. package/dist/{lab → study}/parse/study-v3.js +3 -3
  331. package/dist/{lab → study}/parse/subject-state.d.ts +8 -8
  332. package/dist/{lab → study}/parse/subject-state.js +4 -4
  333. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  334. package/dist/{lab → study}/parse/subject.js +8 -8
  335. package/dist/{lab → study}/parse/values.d.ts +2 -2
  336. package/dist/{lab → study}/persona-resolve.d.ts +4 -4
  337. package/dist/{lab → study}/persona-resolve.js +2 -2
  338. package/dist/{lab → study}/plan-base.d.ts +7 -7
  339. package/dist/{lab → study}/plan-base.js +1 -1
  340. package/dist/{lab → study}/plan-participants.d.ts +10 -10
  341. package/dist/{lab → study}/plan-participants.js +4 -4
  342. package/dist/{lab → study}/plan-types.d.ts +28 -28
  343. package/dist/{lab → study}/plan-types.js +2 -2
  344. package/dist/study/plan.d.ts +13 -0
  345. package/dist/{lab → study}/plan.js +20 -20
  346. package/dist/study/preflight-probes.d.ts +3 -0
  347. package/dist/{lab → study}/preflight-probes.js +9 -8
  348. package/dist/study/preflight-result.d.ts +8 -0
  349. package/dist/{lab → study}/preflight-result.js +3 -3
  350. package/dist/{lab → study}/preflight.d.ts +31 -31
  351. package/dist/{lab → study}/preflight.js +8 -8
  352. package/dist/{lab → study}/requirements.d.ts +3 -3
  353. package/dist/{lab → study}/requirements.js +1 -1
  354. package/dist/study/route-inputs.d.ts +28 -0
  355. package/dist/{lab → study}/route-inputs.js +1 -1
  356. package/dist/{lab → study}/routing.d.ts +12 -12
  357. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -10
  358. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +4 -4
  359. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +8 -17
  360. package/dist/study/run-study-homes.js +3 -0
  361. package/dist/study/run-study-options.d.ts +28 -0
  362. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +16 -15
  363. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +2 -2
  364. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  365. package/dist/{lab → study}/summary.d.ts +10 -10
  366. package/dist/{lab → study}/summary.js +15 -15
  367. package/dist/{lab → study}/tasks.d.ts +3 -3
  368. package/dist/{lab → study}/tasks.js +1 -1
  369. package/dist/{lab → study}/types.d.ts +104 -104
  370. package/dist/{lab → study}/types.js +1 -1
  371. package/dist/{lab → study}/validation.d.ts +19 -19
  372. package/dist/{lab → study}/validation.js +13 -13
  373. package/dist/{lab → study}/warnings.d.ts +4 -4
  374. package/dist/{lab → study}/warnings.js +1 -1
  375. package/dist/subject/clone.d.ts +6 -6
  376. package/dist/subject/clone.js +2 -2
  377. package/dist/subject/local-tree-archive.d.ts +2 -2
  378. package/dist/subject/local-tree-archive.js +3 -3
  379. package/dist/subject/local-tree.d.ts +3 -3
  380. package/dist/subject/runtime.js +2 -2
  381. package/dist/subject/serve.d.ts +4 -4
  382. package/dist/subject/state.d.ts +3 -3
  383. package/dist/subject/state.js +1 -1
  384. package/dist/subject/steps.d.ts +1 -1
  385. package/dist/subject/steps.js +1 -1
  386. package/dist/substrates/desktop-session.js +2 -2
  387. package/dist/substrates/detached.d.ts +1 -1
  388. package/dist/substrates/e2b/desktop-browser.d.ts +4 -4
  389. package/dist/substrates/e2b/desktop-browser.js +1 -1
  390. package/dist/substrates/e2b/desktop-cdp.d.ts +1 -1
  391. package/dist/substrates/e2b/desktop-cdp.js +1 -1
  392. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  393. package/dist/substrates/e2b/desktop-executor.js +12 -12
  394. package/dist/substrates/e2b/desktop-geometry.d.ts +1 -1
  395. package/dist/substrates/e2b/desktop-geometry.js +1 -1
  396. package/dist/substrates/e2b/desktop-media.d.ts +3 -3
  397. package/dist/substrates/e2b/lifetime.js +1 -1
  398. package/dist/substrates/e2b/sandbox.d.ts +3 -3
  399. package/dist/substrates/e2b/sandbox.js +1 -1
  400. package/dist/substrates/e2b/sdk.d.ts +1 -1
  401. package/dist/substrates/e2b/sdk.js +1 -1
  402. package/dist/substrates/local/runtime-config.d.ts +4 -4
  403. package/dist/substrates/local/runtime-config.js +4 -4
  404. package/dist/tui/contract.d.ts +8 -8
  405. package/dist/tui/contract.js +2 -2
  406. package/dist/tui/launch.d.ts +3 -3
  407. package/dist/tui/launch.js +22 -16
  408. package/dist/tui-app.js +139 -139
  409. package/dist/verify/subject.d.ts +1 -1
  410. package/dist/verify/subject.js +1 -1
  411. package/dist/verify/verify.js +2 -1
  412. package/docs/architecture/actor-contract.md +5 -5
  413. package/docs/architecture/browser-control.md +1 -1
  414. package/docs/architecture/external-public-shared-world.md +8 -7
  415. package/docs/architecture/github-feedback-loop.md +1 -1
  416. package/docs/architecture/task-protocol-support.md +1 -1
  417. package/docs/architecture/terminal-product-route.md +18 -18
  418. package/docs/contracts/adapter-fixtures.md +2 -2
  419. package/docs/contracts/errors.md +8 -8
  420. package/docs/contracts/run-bundle.md +6 -4
  421. package/docs/contracts/schemas.md +61 -42
  422. package/docs/contracts/study-analysis.md +4 -1
  423. package/docs/contracts/study-costs.md +17 -2
  424. package/examples/README.md +1 -1
  425. package/examples/scorer/scorer.mjs +3 -3
  426. package/package.json +2 -1
  427. package/skills/humanish/SKILL.md +8 -6
  428. package/skills/humanish/agents/openai.yaml +1 -1
  429. package/dist/cli/commands/lab-format.d.ts +0 -9
  430. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  431. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  432. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  433. package/dist/cli/commands/lab-run.d.ts +0 -9
  434. package/dist/lab/composition-rules.d.ts +0 -7
  435. package/dist/lab/config.d.ts +0 -7
  436. package/dist/lab/deprecated-fields.d.ts +0 -10
  437. package/dist/lab/deprecated-fields.js +0 -24
  438. package/dist/lab/parse/comms.d.ts +0 -12
  439. package/dist/lab/parse/execution.d.ts +0 -19
  440. package/dist/lab/plan.d.ts +0 -13
  441. package/dist/lab/preflight-probes.d.ts +0 -3
  442. package/dist/lab/preflight-result.d.ts +0 -8
  443. package/dist/lab/route-inputs.d.ts +0 -28
  444. package/dist/lab/run-lab-homes.js +0 -7
  445. package/dist/lab/run-lab-options.d.ts +0 -28
  446. package/dist/library-aliases.d.ts +0 -56
  447. package/dist/library-aliases.js +0 -22
  448. package/dist/run-lab.d.ts +0 -112
  449. /package/dist/{lab → study}/device-presets.js +0 -0
  450. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  451. /package/dist/{lab → study}/init-paths.js +0 -0
  452. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  453. /package/dist/{lab → study}/init-plan.js +0 -0
  454. /package/dist/{lab → study}/parse/comms.js +0 -0
  455. /package/dist/{lab → study}/parse/execution.js +0 -0
  456. /package/dist/{lab → study}/parse/values.js +0 -0
  457. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  458. /package/dist/{lab → study}/participant-assignment.js +0 -0
  459. /package/dist/{lab → study}/persona.d.ts +0 -0
  460. /package/dist/{lab → study}/persona.js +0 -0
  461. /package/dist/{lab → study}/routing.js +0 -0
@@ -3,7 +3,7 @@ import { type AnalysisFetch, type AnalysisProvider } from "./provider.js";
3
3
  import type { RejectedAnalysisOutput } from "./diagnostics.js";
4
4
  export declare const ANALYSIS_PROMPT_VERSION = "study-evidence-6";
5
5
  export declare const isSupportedAnalysisModel: (model: string) => boolean;
6
- /** The OpenAI output limit when a lab omits maxOutputTokens, and the most it may ask for. */
6
+ /** The OpenAI output limit when a study omits maxOutputTokens, and the most it may ask for. */
7
7
  export declare const DEFAULT_ANALYSIS_MAX_OUTPUT_TOKENS = 16384;
8
8
  export declare const MAX_ANALYSIS_OUTPUT_TOKENS = 32768;
9
9
  export interface AnalysisAdmission {
@@ -21,7 +21,7 @@ const SUPPORTED_ANALYSIS_MODELS = Object.freeze([
21
21
  ]);
22
22
  const SUPPORTED_MODELS = new Set(SUPPORTED_ANALYSIS_MODELS);
23
23
  export const isSupportedAnalysisModel = (model) => SUPPORTED_MODELS.has(model);
24
- /** The OpenAI output limit when a lab omits maxOutputTokens, and the most it may ask for. */
24
+ /** The OpenAI output limit when a study omits maxOutputTokens, and the most it may ask for. */
25
25
  export const DEFAULT_ANALYSIS_MAX_OUTPUT_TOKENS = 16_384;
26
26
  export const MAX_ANALYSIS_OUTPUT_TOKENS = 32_768;
27
27
  const MAX_EVIDENCE_BYTES = 1024 * 1024;
@@ -1,6 +1,7 @@
1
1
  import type { ActorStatus, ActorCompletionReason, ActorStopCause, ParticipantDeclaredOutcome } from "../actors/contract.js";
2
2
  import type { CuaGoalSource } from "../actors/goal-source.js";
3
3
  import type { AutomaticAnalysisView } from "./job.js";
4
+ import type { RunAnalysisCost } from "../run/run-cost.js";
4
5
  /** Independent interpretation of retained evidence; never a participant or harness verdict. */
5
6
  export declare const ANALYSIS_SCHEMA: "humanish.study-analysis.v1";
6
7
  export declare const ANALYSIS_CORRECTION_SCHEMA: "humanish.study-analysis-correction.v1";
@@ -213,5 +214,10 @@ export interface LoadedAnalysis {
213
214
  warnings: string[];
214
215
  /** Independent post-run execution metadata; never changes evidence sharing grades. */
215
216
  automatic?: AutomaticAnalysisView;
217
+ /**
218
+ * What the run's analysis requests cost, every attempt counted once (src/run/costs.ts
219
+ * readAnalysisAccounting, the reader stats uses). Absent when the run sent none.
220
+ */
221
+ spend?: RunAnalysisCost;
216
222
  }
217
223
  export {};
@@ -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
  import { BROWSER_CONTROL_LIMITS, BROWSER_CONTROL_VERSION, decodeBrowserControlObservation, parseBrowserControlReply, sameBrowserControlIdentity, validateBrowserControlAction, validateBrowserControlIdentity, } from "./protocol.js";
3
3
  import { BrowserControlTransport } from "./transport.js";
4
4
  import { receiveBrowserControlRecording } from "./recording-transfer.js";
@@ -8,7 +8,7 @@ export function createBrowserControlClient(options) {
8
8
  if (!Number.isFinite(timeoutMs) ||
9
9
  timeoutMs < 1 ||
10
10
  timeoutMs > BROWSER_CONTROL_LIMITS.maxRequestTimeoutMs)
11
- throw new CuaExecutorError("invalid_request", "not_dispatched");
11
+ throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
12
12
  const state = {
13
13
  identity,
14
14
  timeoutMs,
@@ -47,7 +47,7 @@ function closeClient(state, code) {
47
47
  state.pending = undefined;
48
48
  if (operation) {
49
49
  operation.dispose();
50
- operation.reject(new CuaExecutorError(code, operation.written ? "outcome_uncertain" : "not_dispatched"));
50
+ operation.reject(new ComputerUseExecutorError(code, operation.written ? "outcome_uncertain" : "not_dispatched"));
51
51
  }
52
52
  }
53
53
  /** Settles the pending exchange once both its reply has arrived and its request write finished. */
@@ -68,7 +68,7 @@ function finishExchange(session) {
68
68
  code !== "action_rejected" ||
69
69
  disposition !== "not_dispatched")
70
70
  session.transport.close(code);
71
- operation.reject(new CuaExecutorError(code, disposition));
71
+ operation.reject(new ComputerUseExecutorError(code, disposition));
72
72
  }
73
73
  }
74
74
  /** Matches a reply frame to the pending request; any mismatch closes the channel. */
@@ -120,12 +120,12 @@ function acceptReply(session, value) {
120
120
  function exchange(session, operation, action, signal, destination) {
121
121
  const { transport } = session;
122
122
  if (session.closed)
123
- return Promise.reject(new CuaExecutorError("executor_closed", "not_dispatched"));
123
+ return Promise.reject(new ComputerUseExecutorError("executor_closed", "not_dispatched"));
124
124
  if (signal?.aborted)
125
- return Promise.reject(new CuaExecutorError("cancelled", "not_dispatched"));
125
+ return Promise.reject(new ComputerUseExecutorError("cancelled", "not_dispatched"));
126
126
  if (session.seq >= Number.MAX_SAFE_INTEGER) {
127
127
  transport.close("protocol_mismatch");
128
- return Promise.reject(new CuaExecutorError("protocol_mismatch", "not_dispatched"));
128
+ return Promise.reject(new ComputerUseExecutorError("protocol_mismatch", "not_dispatched"));
129
129
  }
130
130
  session.seq += 1;
131
131
  const seq = session.seq;
@@ -174,9 +174,9 @@ function exchange(session, operation, action, signal, destination) {
174
174
  /** Runs one public operation at a time on an open client. */
175
175
  async function withOperation(session, work) {
176
176
  if (session.closed)
177
- throw new CuaExecutorError("executor_closed", "not_dispatched");
177
+ throw new ComputerUseExecutorError("executor_closed", "not_dispatched");
178
178
  if (session.busy)
179
- throw new CuaExecutorError("executor_busy", "not_dispatched");
179
+ throw new ComputerUseExecutorError("executor_busy", "not_dispatched");
180
180
  session.busy = true;
181
181
  try {
182
182
  return await work();
@@ -202,34 +202,34 @@ async function observe(session) {
202
202
  }
203
203
  catch {
204
204
  session.transport.close("invalid_response");
205
- throw new CuaExecutorError("invalid_response", "outcome_uncertain");
205
+ throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
206
206
  }
207
207
  }
208
208
  async function execute(session, action, signal) {
209
209
  const validAction = validateBrowserControlAction(action);
210
210
  if (validAction.kind === "speak" && !session.speechEnabled) {
211
- throw new CuaExecutorError("action_rejected", "not_dispatched");
211
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
212
212
  }
213
213
  if (signal?.aborted)
214
- throw new CuaExecutorError("cancelled", "not_dispatched");
214
+ throw new ComputerUseExecutorError("cancelled", "not_dispatched");
215
215
  try {
216
216
  await hello(session, signal);
217
217
  }
218
218
  catch (error) {
219
- if (error instanceof CuaExecutorError)
220
- throw new CuaExecutorError(error.code, "not_dispatched");
219
+ if (error instanceof ComputerUseExecutorError)
220
+ throw new ComputerUseExecutorError(error.code, "not_dispatched");
221
221
  throw error;
222
222
  }
223
223
  await exchange(session, "EXECUTE", validAction, signal);
224
224
  }
225
225
  async function finishRecording(session, destination) {
226
226
  if (!destination || destination.destroyed)
227
- throw new CuaExecutorError("invalid_request", "not_dispatched");
227
+ throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
228
228
  try {
229
229
  await hello(session);
230
230
  const reply = await exchange(session, "FINISH_RECORDING", undefined, undefined, destination);
231
231
  if (!reply.ok || !reply.recording)
232
- throw new CuaExecutorError("invalid_response", "outcome_uncertain");
232
+ throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
233
233
  return reply.recording;
234
234
  }
235
235
  catch (error) {
@@ -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
  import { BROWSER_CONTROL_LIMITS, BROWSER_CONTROL_VERSION, encodeBrowserControlObservation, parseBrowserControlRequest, safeBrowserControlFailure, sameBrowserControlIdentity, validateBrowserControlIdentity, } from "./protocol.js";
3
3
  import { BrowserControlTransport } from "./transport.js";
4
4
  import { sendBrowserControlRecording } from "./recording-transfer.js";
@@ -103,7 +103,7 @@ function failure(common, error, invoked) {
103
103
  async function dispatch(session, request, signal) {
104
104
  const common = replyCommon(session.identity, request);
105
105
  if (!authorized(session.options) || signal.aborted) {
106
- const refusal = new CuaExecutorError("session_revoked", "not_dispatched");
106
+ const refusal = new ComputerUseExecutorError("session_revoked", "not_dispatched");
107
107
  await sendReply(session, request, failure(common, refusal, false));
108
108
  return;
109
109
  }
@@ -160,7 +160,7 @@ async function execute(session, request, common, signal) {
160
160
  let invoked = false, reply;
161
161
  try {
162
162
  if (request.action.kind === "speak" && session.options.executor.speechEnabled !== true) {
163
- throw new CuaExecutorError("action_rejected", "not_dispatched");
163
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
164
164
  }
165
165
  // No await between the owner gate in dispatch and invocation. The physical driver must
166
166
  // check this signal again immediately before each actual input after preparation.
@@ -183,7 +183,7 @@ async function finishRecording(session, request, common, signal) {
183
183
  let reply;
184
184
  try {
185
185
  if (!options.finishRecording)
186
- throw new CuaExecutorError("action_rejected", "not_dispatched");
186
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
187
187
  const recording = await options.finishRecording();
188
188
  let metadata;
189
189
  try {
@@ -1,7 +1,7 @@
1
1
  import { PNG } from "pngjs";
2
2
  import { z } from "zod";
3
3
  import { CUA_SPEECH_LIMITS } from "../actors/computer-use/speech.js";
4
- import { CuaExecutorError, isCuaExecutorError, } from "../actors/computer-use/executor-error.js";
4
+ import { ComputerUseExecutorError, isComputerUseExecutorError, } from "../actors/computer-use/executor-error.js";
5
5
  import { desktopRecordingMetadataSchema } from "../evidence/desktop-recording-types.js";
6
6
  export const BROWSER_CONTROL_VERSION = 1;
7
7
  export const BROWSER_CONTROL_LIMITS = Object.freeze({
@@ -219,7 +219,7 @@ const replySchema = z.discriminatedUnion("ok", [
219
219
  export function validateBrowserControlIdentity(value) {
220
220
  const parsed = identitySchema.safeParse(value);
221
221
  if (!parsed.success)
222
- throw new CuaExecutorError("invalid_request", "not_dispatched");
222
+ throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
223
223
  return parsed.data;
224
224
  }
225
225
  export function sameBrowserControlIdentity(a, b) {
@@ -230,41 +230,41 @@ export function sameBrowserControlIdentity(a, b) {
230
230
  export function parseBrowserControlRequest(value) {
231
231
  const parsed = requestSchema.safeParse(value);
232
232
  if (!parsed.success)
233
- throw new CuaExecutorError("invalid_request", "not_dispatched");
233
+ throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
234
234
  const request = parsed.data;
235
235
  if (request.requestId !== `request-${request.seq}` ||
236
236
  (request.operation === "EXECUTE" && request.actionId !== `action-${request.seq}`))
237
- throw new CuaExecutorError("invalid_request", "not_dispatched");
237
+ throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
238
238
  return request;
239
239
  }
240
240
  export function parseBrowserControlReply(value) {
241
241
  const parsed = replySchema.safeParse(value);
242
242
  if (!parsed.success)
243
- throw new CuaExecutorError("invalid_response", "outcome_uncertain");
243
+ throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
244
244
  const reply = parsed.data;
245
245
  if ((reply.operation === "EXECUTE") !== (reply.actionId !== undefined) ||
246
246
  (reply.ok &&
247
247
  ((reply.operation === "OBSERVE") !== (reply.observation !== undefined) ||
248
248
  (reply.operation === "FINISH_RECORDING") !== (reply.recording !== undefined))))
249
- throw new CuaExecutorError("invalid_response", "outcome_uncertain");
249
+ throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
250
250
  return reply;
251
251
  }
252
252
  export function validateBrowserControlAction(value) {
253
253
  const parsed = wireActionSchema.safeParse(value);
254
254
  if (!parsed.success)
255
- throw new CuaExecutorError("invalid_request", "not_dispatched");
255
+ throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
256
256
  return parsed.data;
257
257
  }
258
258
  export function validateHeardSpeech(value) {
259
259
  const parsed = heardSpeechListSchema.safeParse(value);
260
260
  if (!parsed.success)
261
- throw new CuaExecutorError("invalid_response", "outcome_uncertain");
261
+ throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
262
262
  return parsed.data;
263
263
  }
264
264
  /** Check dimensions before allocating decoder output; v1 accepts browser-style 8-bit, noninterlaced PNG. */
265
265
  export function validateBrowserControlPng(bytes) {
266
266
  const fail = () => {
267
- throw new CuaExecutorError("invalid_response", "outcome_uncertain");
267
+ throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
268
268
  };
269
269
  if (bytes.length < 45 ||
270
270
  bytes.length > BROWSER_CONTROL_LIMITS.pngBytes ||
@@ -316,7 +316,7 @@ export function encodeBrowserControlObservation(observation) {
316
316
  if (!observation ||
317
317
  observation.appState !== undefined ||
318
318
  !Buffer.isBuffer(observation.screenshot))
319
- throw new CuaExecutorError("invalid_response", "outcome_uncertain");
319
+ throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
320
320
  validateBrowserControlPng(observation.screenshot);
321
321
  const parsed = observationSchema.safeParse({
322
322
  png: observation.screenshot.toString("base64"),
@@ -328,17 +328,17 @@ export function encodeBrowserControlObservation(observation) {
328
328
  ...(observation.heardSpeech !== undefined ? { heardSpeech: observation.heardSpeech } : {}),
329
329
  });
330
330
  if (!parsed.success)
331
- throw new CuaExecutorError("invalid_response", "outcome_uncertain");
331
+ throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
332
332
  return parsed.data;
333
333
  }
334
334
  export function decodeBrowserControlObservation(value) {
335
335
  const parsed = observationSchema.safeParse(value);
336
336
  if (!parsed.success)
337
- throw new CuaExecutorError("invalid_response", "outcome_uncertain");
337
+ throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
338
338
  const { png, ...state } = parsed.data;
339
339
  const screenshot = Buffer.from(png, "base64");
340
340
  if (screenshot.toString("base64") !== png)
341
- throw new CuaExecutorError("invalid_response", "outcome_uncertain");
341
+ throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
342
342
  validateBrowserControlPng(screenshot);
343
343
  return {
344
344
  screenshot,
@@ -351,7 +351,7 @@ export function decodeBrowserControlObservation(value) {
351
351
  };
352
352
  }
353
353
  export function safeBrowserControlFailure(error, dispatched) {
354
- if (isCuaExecutorError(error))
354
+ if (isComputerUseExecutorError(error))
355
355
  return { code: error.code, disposition: error.disposition };
356
356
  return {
357
357
  code: "action_rejected",
@@ -1,6 +1,6 @@
1
1
  import { Transform } from "node:stream";
2
2
  import { pipeline } from "node:stream/promises";
3
- import { CuaExecutorError } from "../actors/computer-use/executor-error.js";
3
+ import { ComputerUseExecutorError } from "../actors/computer-use/executor-error.js";
4
4
  import { DESKTOP_RECORDING_MAX_BYTES } from "../evidence/desktop-recording-types.js";
5
5
  const BROWSER_CONTROL_RECORDING_TRANSFER_TIMEOUT_MS = 120_000;
6
6
  function exactBytes(expected) {
@@ -17,7 +17,7 @@ function exactBytes(expected) {
17
17
  }
18
18
  function validLength(bytes) {
19
19
  if (!Number.isSafeInteger(bytes) || bytes < 1 || bytes > DESKTOP_RECORDING_MAX_BYTES) {
20
- throw new CuaExecutorError("invalid_response", "outcome_uncertain");
20
+ throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
21
21
  }
22
22
  }
23
23
  export async function receiveBrowserControlRecording(source, destination, bytes) {
@@ -28,7 +28,7 @@ export async function receiveBrowserControlRecording(source, destination, bytes)
28
28
  });
29
29
  }
30
30
  catch {
31
- throw new CuaExecutorError("transport_failed", "outcome_uncertain");
31
+ throw new ComputerUseExecutorError("transport_failed", "outcome_uncertain");
32
32
  }
33
33
  }
34
34
  export async function sendBrowserControlRecording(source, destination, bytes) {
@@ -43,6 +43,6 @@ export async function sendBrowserControlRecording(source, destination, bytes) {
43
43
  }
44
44
  catch {
45
45
  destination.destroy();
46
- throw new CuaExecutorError("transport_failed", "outcome_uncertain");
46
+ throw new ComputerUseExecutorError("transport_failed", "outcome_uncertain");
47
47
  }
48
48
  }
@@ -1,6 +1,6 @@
1
1
  import { TextDecoder } from "node:util";
2
2
  import { BROWSER_CONTROL_LIMITS } from "./protocol.js";
3
- import { CuaExecutorError, } from "../actors/computer-use/executor-error.js";
3
+ import { ComputerUseExecutorError, } from "../actors/computer-use/executor-error.js";
4
4
  /** Owned byte channel only. This module never discovers endpoints or reconnects. */
5
5
  export class BrowserControlTransport {
6
6
  stream;
@@ -92,7 +92,7 @@ export class BrowserControlTransport {
92
92
  /** Relinquish the live byte stream synchronously after a complete frame. */
93
93
  handoff() {
94
94
  if (this.ended || this.handedOff || this.payload !== undefined || this.headerUsed !== 0) {
95
- throw new CuaExecutorError("transport_failed", "outcome_uncertain");
95
+ throw new ComputerUseExecutorError("transport_failed", "outcome_uncertain");
96
96
  }
97
97
  this.handedOff = true;
98
98
  clearTimeout(this.frameTimer);
@@ -112,9 +112,9 @@ export class BrowserControlTransport {
112
112
  };
113
113
  send(value, beforeWrite = () => { }) {
114
114
  if (this.ended || this.handedOff)
115
- return Promise.reject(new CuaExecutorError("executor_closed", "not_dispatched"));
115
+ return Promise.reject(new ComputerUseExecutorError("executor_closed", "not_dispatched"));
116
116
  if (this.sending)
117
- return Promise.reject(new CuaExecutorError("executor_busy", "not_dispatched"));
117
+ return Promise.reject(new ComputerUseExecutorError("executor_busy", "not_dispatched"));
118
118
  let payload;
119
119
  try {
120
120
  const json = JSON.stringify(value);
@@ -123,7 +123,7 @@ export class BrowserControlTransport {
123
123
  payload = Buffer.from(json);
124
124
  }
125
125
  catch {
126
- return Promise.reject(new CuaExecutorError("invalid_request", "not_dispatched"));
126
+ return Promise.reject(new ComputerUseExecutorError("invalid_request", "not_dispatched"));
127
127
  }
128
128
  const frame = Buffer.allocUnsafe(4 + payload.length);
129
129
  frame.writeUInt32BE(payload.length);
@@ -144,7 +144,7 @@ export class BrowserControlTransport {
144
144
  try {
145
145
  beforeWrite();
146
146
  if (this.ended) {
147
- done(new CuaExecutorError("executor_closed", "not_dispatched"));
147
+ done(new ComputerUseExecutorError("executor_closed", "not_dispatched"));
148
148
  return;
149
149
  }
150
150
  this.stream.write(frame, (error) => {
@@ -178,7 +178,7 @@ export class BrowserControlTransport {
178
178
  this.stream.off("close", releaseListeners);
179
179
  };
180
180
  this.stream.once("close", releaseListeners);
181
- this.pendingWrite?.(new CuaExecutorError(code, "outcome_uncertain"));
181
+ this.pendingWrite?.(new ComputerUseExecutorError(code, "outcome_uncertain"));
182
182
  this.stream.destroy();
183
183
  // A stream whose close event already happened will not emit it again. `closed`
184
184
  // can also precede queued error/close events, so defer removal past native ticks.
@@ -1,8 +1,8 @@
1
- import type { RunLabOptions } from "../../run-lab.js";
1
+ import type { RunStudyOptions } from "../../run-study.js";
2
2
  import type { CliIo } from "../io.js";
3
3
  /**
4
4
  * Post-run analysis cancellation for the CLI: while analysis runs, SIGINT, SIGTERM and SIGHUP abort
5
5
  * it. The listeners exist only during analysis; before it, the run's own handlers
6
6
  * (run-signals.ts) hold the signals and hand them over here.
7
7
  */
8
- export declare function cliAnalysisOptions(io: Pick<CliIo, "writeErr">): Pick<RunLabOptions, "onEvent" | "analysisSignal">;
8
+ export declare function cliAnalysisOptions(io: Pick<CliIo, "writeErr">): Pick<RunStudyOptions, "onEvent" | "analysisSignal">;
@@ -3,11 +3,10 @@ import { Command } from "commander";
3
3
  import { COMMS_PROVIDERS, saveCommsConnection } from "../../comms/connections.js";
4
4
  import { catchTokenRefusal } from "../../comms/external-evidence.js";
5
5
  import { readCommsSetup } from "../../comms/setup.js";
6
- import { checkCommsConnection, configureCommsLab } from "../../comms/setup.js";
6
+ import { checkCommsConnection, configureCommsStudy } from "../../comms/setup.js";
7
7
  import { inspectCommsRecovery, recoverCommsReceiving } from "../../comms/receiving-recovery.js";
8
8
  import { resolveReceivingConnection } from "../../comms/receiving-runtime.js";
9
- import { resolveLabManifest } from "../../lab/discover.js";
10
- import { oldStudyOption, studyOptionValue } from "../deprecations.js";
9
+ import { resolveStudyManifest } from "../../study/discover.js";
11
10
  import { runCommsCatchHost } from "../../comms/catch-host.js";
12
11
  import { DEFAULT_SANDBOX_CATCH_PORT } from "../../comms/sandbox-catch.js";
13
12
  import { applyEnvFileOption, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, PORT_OPTION_DESCRIPTION, writeResult, messageOutput, } from "../io.js";
@@ -46,7 +45,6 @@ export function registerCommsCommands(parent, io) {
46
45
  .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
47
46
  .option("--connection <name>", "Saved connection name.", "agentmail")
48
47
  .option("--study <path>", "Check the connection this study selects.")
49
- .addOption(oldStudyOption("path"))
50
48
  .option("--online", "Make a read-only provider authentication request.")
51
49
  .option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
52
50
  .option("--json", JSON_OPTION_DESCRIPTION)
@@ -54,20 +52,12 @@ export function registerCommsCommands(parent, io) {
54
52
  comms
55
53
  .command("configure")
56
54
  .description("Preview or save a local receiving-enabled copy of a supported study. No provider requests.")
57
- // Required, but checked in the action, so --lab still works for one minor.
58
- .option("--study <path>", "Source study path or name. Required.")
59
- .addOption(oldStudyOption("path"))
55
+ .requiredOption("--study <path>", "Source study path or name. Required.")
60
56
  .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
61
57
  .option("--connection <name>", "Saved connection name.", "agentmail")
62
58
  .option("--apply", "Save the local copy; the source study stays unchanged.")
63
59
  .option("--plan-token <digest>", "Require the source and destination to match a previous preview.")
64
60
  .option("--json", JSON_OPTION_DESCRIPTION)
65
- .hook("preAction", (command) => {
66
- const options = command.opts();
67
- // The message commander gives a missing required option.
68
- if (options.study === undefined && options.lab === undefined)
69
- command.error("error: required option '--study <path>' not specified");
70
- })
71
61
  .action((options, command) => handleCommsConfigure(io, options, command));
72
62
  comms
73
63
  .command("recover")
@@ -119,13 +109,19 @@ async function handleCommsCheck(io, options, command) {
119
109
  if (!(await applyEnvFileOption({ command, cwd: options.cwd, envFile: options.envFile, io })))
120
110
  return;
121
111
  let connection = options.connection;
122
- const study = studyOptionValue(command, io, options);
112
+ const study = options.study;
123
113
  if (study) {
124
- const resolved = await resolveLabManifest(options.cwd, study);
114
+ const resolved = await resolveStudyManifest(options.cwd, study);
125
115
  if (!resolved.ok || resolved.config.comms?.email?.kind !== "real") {
116
+ // A file humanish no longer reads gets discovery's message, which names the fix.
117
+ const named = !resolved.ok &&
118
+ (resolved.error.code === "HUMANISH_STUDY_V2_UNSUPPORTED" ||
119
+ resolved.error.code === "HUMANISH_STUDY_RETIRED_DIRECTORY");
126
120
  const result = {
127
121
  ok: false,
128
- message: "This study does not select a real email connection.",
122
+ message: named
123
+ ? resolved.error.message
124
+ : "This study does not select a real email connection.",
129
125
  };
130
126
  writeResult(command, io, result, messageOutput);
131
127
  io.setExitCode(2);
@@ -143,13 +139,9 @@ async function handleCommsCheck(io, options, command) {
143
139
  io.setExitCode(result.ok ? 0 : 2);
144
140
  }
145
141
  async function handleCommsConfigure(io, options, command) {
146
- const study = studyOptionValue(command, io, options);
147
- // The preAction hook refuses a call without either option.
148
- if (study === undefined)
149
- return;
150
- const result = await configureCommsLab({
142
+ const result = await configureCommsStudy({
151
143
  cwd: resolve(options.cwd),
152
- lab: study,
144
+ study: options.study,
153
145
  connection: options.connection,
154
146
  ...(options.apply === undefined ? {} : { apply: options.apply }),
155
147
  ...(options.planToken === undefined ? {} : { planToken: options.planToken }),
@@ -4,8 +4,11 @@ function formatValue(value) {
4
4
  const text = JSON.stringify(value);
5
5
  return text.length > 80 ? `${text.slice(0, 77)}...` : text;
6
6
  }
7
- /** Each file's source, destination, moved keys and dropped keys, printed before any write. */
8
- function formatMigratePlan(files) {
7
+ /**
8
+ * Each file's source, destination, moved keys and dropped keys, and each labs/ directory the moves
9
+ * empty, printed before any write.
10
+ */
11
+ function formatMigratePlan(files, emptied) {
9
12
  const lines = [];
10
13
  for (const file of files) {
11
14
  if (file.action === "skip") {
@@ -22,6 +25,9 @@ function formatMigratePlan(files) {
22
25
  lines.push(` its comment: ${key.comments.replace(/\n/g, " ")}`);
23
26
  }
24
27
  }
28
+ for (const directory of emptied) {
29
+ lines.push(`${directory}/: removed after the move, since nothing else is in it`);
30
+ }
25
31
  return lines.length > 0 ? `${lines.join("\n")}\n` : "No study files to convert.\n";
26
32
  }
27
33
  function formatMigrateOutcome(result) {
@@ -33,7 +39,12 @@ function formatMigrateOutcome(result) {
33
39
  const files = written === 1 ? "1 study file" : `${written} study files`;
34
40
  if (result.dryRun)
35
41
  return `Dry run: nothing was written. ${files} would change.\n`;
36
- return written === 0 ? "No v2 study files to convert.\n" : `Converted ${files}.\n`;
42
+ if (written === 0)
43
+ return "No v2 study files to convert.\n";
44
+ const removed = result.removedDirectories ?? [];
45
+ return removed.length === 0
46
+ ? `Converted ${files}.\n`
47
+ : `Converted ${files}. Removed ${removed.map((directory) => `${directory}/`).join(", ")}, which the move emptied.\n`;
37
48
  }
38
49
  /** `humanish migrate`. */
39
50
  export function registerMigrateCommand(parent, io) {
@@ -57,7 +68,7 @@ export function registerMigrateCommand(parent, io) {
57
68
  dryRun: options.dryRun === true,
58
69
  // The plan is printed before anything is written; with --json it goes to stderr, so stdout
59
70
  // stays one JSON document.
60
- onPlan: (files) => (json ? io.writeErr : io.writeOut)(formatMigratePlan(files)),
71
+ onPlan: (files, emptied) => (json ? io.writeErr : io.writeOut)(formatMigratePlan(files, emptied)),
61
72
  });
62
73
  writeResult(command, io, result, formatMigrateOutcome);
63
74
  io.setExitCode(result.ok ? 0 : 2);
@@ -1,4 +1,3 @@
1
1
  import { Command } from "commander";
2
2
  import { type CliIo } from "../io.js";
3
3
  export declare function registerObserveCommand(parent: Command, io: CliIo): void;
4
- export declare function registerServeCommand(parent: Command, io: CliIo): void;
@@ -3,7 +3,6 @@ import { openTarget, renderObserver, serveObserver } from "../../observer/render
3
3
  import { SERVE_SCHEMA, serveObserverLibrary } from "../../observer/serve.js";
4
4
  import { startExposedObserver, validateExposure } from "../../observer/exposure.js";
5
5
  import { ServeTunnelError } from "../../observer/tunnel.js";
6
- import { deprecationMessage, warnAndQueue } from "../deprecations.js";
7
6
  import { collectRepeated, CWD_OPTION_DESCRIPTION, formatRunHuman, freePortOption, JSON_OPTION_DESCRIPTION, parseObserverPort, RUN_OPTION_DESCRIPTION, wantsJson, writeResult, } from "../io.js";
8
7
  import { exitCodeForSignal, formatObserverHuman, } from "../observer-follow.js";
9
8
  export function registerObserveCommand(parent, io) {
@@ -185,20 +184,6 @@ async function serveObserveUntilSignal(io, server, options) {
185
184
  }
186
185
  });
187
186
  }
188
- // Removed in 0.109.0: `serve` stays one minor as a hidden alias of `observe --all`.
189
- export function registerServeCommand(parent, io) {
190
- addLibraryOptions(parent
191
- .command("serve", { hidden: true })
192
- .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
193
- .addOption(freePortOption())
194
- .option("--run <id>", RUN_OPTION_DESCRIPTION)
195
- .option("--open", "Open the library in the default browser.")
196
- .option("--no-open", "Serve without opening a browser.")
197
- .option("--json", JSON_OPTION_DESCRIPTION)).action((options, command) => {
198
- warnAndQueue(command, io, deprecationMessage("humanish serve", "humanish observe --all"));
199
- return handleServe(io, options, command);
200
- });
201
- }
202
187
  async function handleServe(io, options, command) {
203
188
  const fail = (code, message) => refuseServe(command, io, options, code, message);
204
189
  const port = parseObserverPort(options.port);
@@ -1,6 +1,6 @@
1
1
  import type { Command } from "commander";
2
- import { type CliIo, type LabCommandOptions as RunOptions } from "../io.js";
3
- /** The parsed flags of `run`, `watch` and the `lab run` alias. */
2
+ import { type CliIo, type StudyCommandOptions as RunOptions } from "../io.js";
3
+ /** The parsed flags of `run` and `watch`. */
4
4
  export type { RunOptions };
5
5
  /** The flags a run takes, whichever command starts it. */
6
6
  export declare function addRunOptions(command: Command): Command;
@@ -1,5 +1,5 @@
1
1
  import { runDryRun } from "../../run/dry-run.js";
2
- import { runLabCommand } from "./lab-run.js";
2
+ import { runStudyCommand } from "./study-run.js";
3
3
  import { applyEnvFileOption, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, formatRunHuman, freePortOption, JSON_OPTION_DESCRIPTION, parsePositiveInteger, writeResult, } from "../io.js";
4
4
  /** The flags a run takes, whichever command starts it. */
5
5
  export function addRunOptions(command) {
@@ -54,13 +54,13 @@ export async function handleRun(io, named, options, command) {
54
54
  cwd: options.cwd,
55
55
  envFile: options.envFile,
56
56
  io,
57
- // runLabCommand discovers keys for a live lab; the lab-less preview needs none.
57
+ // runStudyCommand discovers keys for a live study; a preview without a study needs none.
58
58
  discoverKeys: false,
59
59
  });
60
60
  if (!loaded)
61
61
  return;
62
62
  if (study !== undefined) {
63
- await runLabCommand({ command, io, lab: study, mode: "run", options });
63
+ await runStudyCommand({ command, io, study, mode: "run", options });
64
64
  return;
65
65
  }
66
66
  const participantCount = options.count === undefined ? undefined : parsePositiveInteger(options.count);
@@ -7,8 +7,8 @@ import { cleanupRun, listRuns, readReview } from "../../run/stored-runs.js";
7
7
  import { verifyRun } from "../../verify/verify.js";
8
8
  import { reclaimPreflightSandboxes, reclaimRunSandboxes, } from "../../run/reclaim.js";
9
9
  import { addRunOptions, handleRun } from "./run-command.js";
10
- import { oldStudyOption, studyOptionValue } from "../deprecations.js";
11
- import { CWD_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, RUN_OPTION_DESCRIPTION, writeResult, humanError, } from "../io.js";
10
+ import { applyEnvFileOption, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, RUN_OPTION_DESCRIPTION, writeResult, humanError, } from "../io.js";
11
+ import { plural } from "../../run/text.js";
12
12
  export function registerRunCommand(parent, io) {
13
13
  addRunOptions(parent
14
14
  .command("run")
@@ -98,14 +98,12 @@ export function registerStatsCommand(parent, io) {
98
98
  .description("Cost, outcome, and duration roll-ups across run history. Estimates stay labelled; unknown costs count as unknown.")
99
99
  .summary("Show cost, outcomes and durations across runs.")
100
100
  .option("--study <id>", "Only runs of this study id.")
101
- .addOption(oldStudyOption("id"))
102
101
  .option("--since <date>", "Only runs that started on or after this ISO date or datetime.")
103
102
  .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
104
103
  .option("--json", JSON_OPTION_DESCRIPTION)
105
104
  .action(async (options, command) => {
106
- const study = studyOptionValue(command, io, options);
107
105
  const result = await computeStats(options.cwd, {
108
- ...(study === undefined ? {} : { lab: study }),
106
+ ...(options.study === undefined ? {} : { study: options.study }),
109
107
  ...(options.since === undefined ? {} : { since: options.since }),
110
108
  });
111
109
  writeResult(command, io, result, formatStatsHuman);
@@ -167,13 +165,17 @@ export function registerRuntimeCommands(parent, io) {
167
165
  export function registerReclaimCommand(parent, io) {
168
166
  parent
169
167
  .command("reclaim")
170
- .description("Kill an interrupted run's sandboxes by the exact ids journaled in its sandbox-receipts.ndjson; never enumerates the E2B account. Needs E2B_API_KEY in the environment.")
168
+ .description("Kill an interrupted run's sandboxes by the exact ids journaled in its sandbox-receipts.ndjson; never enumerates the E2B account. Needs E2B_API_KEY in the environment or in --env-file.")
171
169
  .summary("Stop an interrupted run's leftover sandboxes.")
172
170
  .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
173
171
  .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
174
172
  .addOption(new Option("--preflight", "Reclaim sandboxes left by interrupted `humanish study check` probes (journaled in .humanish/preflight) instead of a run's.").conflicts("run"))
173
+ .option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
175
174
  .option("--json", JSON_OPTION_DESCRIPTION)
176
175
  .action(async (options, command) => {
176
+ // The kill calls read E2B_API_KEY from the environment: the env file, then discovered keys.
177
+ if (!(await applyEnvFileOption({ command, cwd: options.cwd, envFile: options.envFile, io })))
178
+ return;
177
179
  const result = options.preflight
178
180
  ? await reclaimPreflightSandboxes(options.cwd)
179
181
  : await reclaimRunSandboxes(options.cwd, options.run);
@@ -183,7 +185,7 @@ export function registerReclaimCommand(parent, io) {
183
185
  }
184
186
  function formatReclaimHuman(result) {
185
187
  const lines = [];
186
- lines.push(`Reclaim ${result.runId}: ${result.ok ? "ok" : "FAILED"} — ${result.receiptCount} sandbox receipt(s).`);
188
+ lines.push(`Reclaim ${result.runId}: ${result.ok ? "ok" : "failed"}, ${plural(result.receiptCount, "sandbox receipt")}.`);
187
189
  for (const outcome of result.outcomes) {
188
190
  lines.push(` ${outcome.sandboxId} (${outcome.laneId}): ${outcome.state}${outcome.detail ? ` — ${outcome.detail}` : ""}`);
189
191
  }