humanish 0.108.0 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (455) hide show
  1. package/ARCHITECTURE.md +58 -59
  2. package/CHANGELOG.md +13 -0
  3. package/CONTEXT.md +44 -44
  4. package/README.md +3 -3
  5. package/TELEMETRY.md +2 -2
  6. package/dist/actors/codex/app-server-trace.js +2 -1
  7. package/dist/actors/codex/restricted-participant.js +12 -12
  8. package/dist/actors/codex/restricted-session.d.ts +2 -2
  9. package/dist/actors/computer-use/actor.d.ts +6 -6
  10. package/dist/actors/computer-use/actor.js +2 -2
  11. package/dist/actors/computer-use/admission-limit.d.ts +2 -2
  12. package/dist/actors/computer-use/admission-limit.js +3 -3
  13. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  14. package/dist/actors/computer-use/executor-error.js +3 -3
  15. package/dist/actors/computer-use/loop/actions.js +5 -5
  16. package/dist/actors/computer-use/loop/debrief.js +2 -2
  17. package/dist/actors/computer-use/loop/ending.d.ts +1 -1
  18. package/dist/actors/computer-use/loop/ending.js +12 -11
  19. package/dist/actors/computer-use/loop/observation.js +6 -5
  20. package/dist/actors/computer-use/loop/provider-call.js +11 -11
  21. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  22. package/dist/actors/computer-use/loop/session.js +2 -2
  23. package/dist/actors/computer-use/loop/trace.js +3 -2
  24. package/dist/actors/computer-use/loop/types.d.ts +24 -24
  25. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  26. package/dist/actors/computer-use/loop.d.ts +6 -1
  27. package/dist/actors/computer-use/loop.js +26 -4
  28. package/dist/actors/computer-use/openai-provider.d.ts +2 -2
  29. package/dist/actors/computer-use/openai-provider.js +8 -8
  30. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  31. package/dist/actors/computer-use/provider-error.js +6 -6
  32. package/dist/actors/contract.d.ts +4 -4
  33. package/dist/actors/contract.js +1 -1
  34. package/dist/actors/local-agent/claude-session.js +3 -3
  35. package/dist/actors/local-agent/cli.d.ts +1 -1
  36. package/dist/actors/local-agent/cli.js +1 -1
  37. package/dist/actors/reasoning-effort.js +3 -3
  38. package/dist/actors/registry.d.ts +2 -2
  39. package/dist/actors/registry.js +3 -3
  40. package/dist/actors/scripted-browser/actor.d.ts +2 -2
  41. package/dist/actors/scripted-browser/actor.js +1 -1
  42. package/dist/analysis/automatic-completion.d.ts +7 -7
  43. package/dist/analysis/automatic-completion.js +1 -1
  44. package/dist/analysis/automatic-config.d.ts +6 -6
  45. package/dist/analysis/automatic-config.js +1 -1
  46. package/dist/analysis/execute.d.ts +1 -1
  47. package/dist/analysis/execute.js +1 -1
  48. package/dist/analysis/types.d.ts +6 -0
  49. package/dist/browser-control/client.js +16 -16
  50. package/dist/browser-control/dispatcher.js +4 -4
  51. package/dist/browser-control/protocol.js +14 -14
  52. package/dist/browser-control/recording-transfer.js +4 -4
  53. package/dist/browser-control/transport.js +7 -7
  54. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  55. package/dist/cli/commands/comms.js +14 -22
  56. package/dist/cli/commands/observe.d.ts +0 -1
  57. package/dist/cli/commands/observe.js +0 -15
  58. package/dist/cli/commands/run-command.d.ts +2 -2
  59. package/dist/cli/commands/run-command.js +3 -3
  60. package/dist/cli/commands/runs.js +3 -5
  61. package/dist/cli/commands/setup.js +5 -7
  62. package/dist/cli/commands/study-format.d.ts +9 -0
  63. package/dist/cli/commands/{lab-format.js → study-format.js} +5 -5
  64. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  65. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +12 -12
  66. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  67. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  68. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  69. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +3 -3
  70. package/dist/cli/commands/study-route-run.d.ts +19 -0
  71. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  72. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  73. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  74. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  75. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +7 -7
  76. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  77. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  78. package/dist/cli/commands/study-run.d.ts +9 -0
  79. package/dist/cli/commands/{lab-run.js → study-run.js} +34 -34
  80. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +5 -5
  81. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +1 -1
  82. package/dist/cli/commands/study.js +13 -49
  83. package/dist/cli/commands/tui.js +12 -12
  84. package/dist/cli/commands/watch.js +30 -65
  85. package/dist/cli/deprecations.d.ts +1 -13
  86. package/dist/cli/deprecations.js +0 -30
  87. package/dist/cli/doctor.d.ts +3 -3
  88. package/dist/cli/doctor.js +16 -16
  89. package/dist/cli/first-run-path.d.ts +4 -4
  90. package/dist/cli/first-run-path.js +7 -7
  91. package/dist/cli/io.d.ts +3 -3
  92. package/dist/cli/io.js +2 -2
  93. package/dist/cli/observer-follow.d.ts +2 -2
  94. package/dist/cli/observer-follow.js +2 -2
  95. package/dist/cli/orientation.d.ts +4 -4
  96. package/dist/cli/orientation.js +58 -20
  97. package/dist/cli/program.js +3 -4
  98. package/dist/cli/telemetry.d.ts +1 -1
  99. package/dist/cli/telemetry.js +14 -20
  100. package/dist/comms/catch-host.d.ts +1 -1
  101. package/dist/comms/catch-host.js +3 -3
  102. package/dist/comms/connections.d.ts +1 -1
  103. package/dist/comms/connections.js +2 -2
  104. package/dist/comms/external-evidence.d.ts +5 -5
  105. package/dist/comms/external-evidence.js +4 -3
  106. package/dist/comms/fake-inbox.d.ts +2 -2
  107. package/dist/comms/fake-inbox.js +2 -2
  108. package/dist/comms/receiving-runtime.d.ts +4 -4
  109. package/dist/comms/sandbox-catch.d.ts +2 -2
  110. package/dist/comms/sandbox-catch.js +2 -2
  111. package/dist/comms/setup.d.ts +2 -2
  112. package/dist/comms/setup.js +29 -32
  113. package/dist/feedback/draft.js +2 -2
  114. package/dist/feedback/export.js +3 -2
  115. package/dist/feedback/proof.d.ts +1 -1
  116. package/dist/feedback/proof.js +2 -2
  117. package/dist/guest/bootstrap.js +6 -6
  118. package/dist/guest/browser-tools.js +8 -8
  119. package/dist/guest/chromium-text.js +17 -17
  120. package/dist/guest/desktop-executor.d.ts +2 -2
  121. package/dist/guest/desktop-executor.js +20 -20
  122. package/dist/guest/desktop-keys.js +4 -4
  123. package/dist/guest/desktop-media.d.ts +2 -2
  124. package/dist/guest/desktop-media.js +16 -16
  125. package/dist/guest/desktop-native.js +10 -10
  126. package/dist/guest/runtime-desktop.js +2 -2
  127. package/dist/guest/runtime-processes.d.ts +2 -2
  128. package/dist/guest/runtime-processes.js +2 -2
  129. package/dist/guest/runtime.js +5 -5
  130. package/dist/index.d.ts +13 -15
  131. package/dist/index.js +6 -8
  132. package/dist/observer/artifact.d.ts +1 -1
  133. package/dist/observer/artifact.js +1 -1
  134. package/dist/observer/data.d.ts +1 -1
  135. package/dist/observer/library.d.ts +2 -0
  136. package/dist/observer/library.js +4 -1
  137. package/dist/observer/render.js +7 -1
  138. package/dist/observer/run-routes.d.ts +1 -0
  139. package/dist/observer/run-routes.js +37 -12
  140. package/dist/observer/serve.d.ts +1 -1
  141. package/dist/observer-app.html +1 -1
  142. package/dist/routes/computer-use/bundle-parts.js +3 -2
  143. package/dist/routes/computer-use/bundle.d.ts +2 -2
  144. package/dist/routes/computer-use/bundle.js +7 -6
  145. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +5 -5
  146. package/dist/routes/computer-use/e2b-desktop/comms.js +5 -4
  147. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +1 -1
  148. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  149. package/dist/routes/computer-use/e2b-desktop/prepare.js +3 -3
  150. package/dist/routes/computer-use/e2b-desktop/start.js +3 -4
  151. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  152. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -3
  153. package/dist/routes/computer-use/external-comms.d.ts +3 -3
  154. package/dist/routes/computer-use/fanout-bundle.js +11 -10
  155. package/dist/routes/computer-use/fanout-records.js +2 -2
  156. package/dist/routes/computer-use/live-flush.d.ts +3 -3
  157. package/dist/routes/computer-use/live-phase.d.ts +2 -3
  158. package/dist/routes/computer-use/live-phase.js +3 -3
  159. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  160. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  161. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  162. package/dist/routes/computer-use/local-vm.js +2 -2
  163. package/dist/routes/computer-use/participant-desktop.d.ts +3 -3
  164. package/dist/routes/computer-use/participant-desktop.js +1 -1
  165. package/dist/routes/computer-use/participant-execution.js +1 -1
  166. package/dist/routes/computer-use/participant-model.js +3 -3
  167. package/dist/routes/computer-use/participant-prompt.d.ts +5 -5
  168. package/dist/routes/computer-use/participant-prompt.js +3 -3
  169. package/dist/routes/computer-use/participant-runs.d.ts +10 -10
  170. package/dist/routes/computer-use/participant-runs.js +14 -13
  171. package/dist/routes/computer-use/plan.d.ts +12 -12
  172. package/dist/routes/computer-use/plan.js +24 -24
  173. package/dist/routes/computer-use/preflight.d.ts +5 -5
  174. package/dist/routes/computer-use/preflight.js +5 -5
  175. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  176. package/dist/routes/computer-use/rerun-selection.js +3 -2
  177. package/dist/routes/computer-use/result.d.ts +4 -4
  178. package/dist/routes/computer-use/result.js +13 -12
  179. package/dist/routes/computer-use/route.d.ts +12 -12
  180. package/dist/routes/computer-use/route.js +19 -19
  181. package/dist/routes/computer-use/self-report.js +1 -1
  182. package/dist/routes/computer-use/setup.d.ts +22 -22
  183. package/dist/routes/computer-use/setup.js +15 -15
  184. package/dist/routes/computer-use/single-bundle.d.ts +4 -4
  185. package/dist/routes/computer-use/single-bundle.js +14 -13
  186. package/dist/routes/computer-use/subject-projection.d.ts +3 -3
  187. package/dist/routes/computer-use/types.d.ts +34 -34
  188. package/dist/routes/computer-use/types.js +3 -3
  189. package/dist/routes/preview.d.ts +6 -6
  190. package/dist/routes/preview.js +5 -5
  191. package/dist/routes/scripted/bundle.d.ts +6 -6
  192. package/dist/routes/scripted/bundle.js +10 -9
  193. package/dist/routes/scripted/plan.d.ts +7 -7
  194. package/dist/routes/scripted/plan.js +6 -6
  195. package/dist/routes/scripted/result.d.ts +3 -3
  196. package/dist/routes/scripted/result.js +9 -9
  197. package/dist/routes/scripted/route.d.ts +9 -9
  198. package/dist/routes/scripted/route.js +11 -11
  199. package/dist/routes/scripted/scenario.d.ts +1 -1
  200. package/dist/routes/scripted/scenario.js +3 -3
  201. package/dist/routes/scripted/setup.d.ts +6 -6
  202. package/dist/routes/scripted/setup.js +4 -4
  203. package/dist/routes/scripted/subject.d.ts +5 -5
  204. package/dist/routes/scripted/subject.js +3 -3
  205. package/dist/routes/scripted/surface-records.d.ts +1 -1
  206. package/dist/routes/scripted/surface-records.js +2 -2
  207. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  208. package/dist/routes/scripted/types.d.ts +17 -17
  209. package/dist/routes/scripted/types.js +1 -1
  210. package/dist/routes/shared-world/bundle-records.js +3 -3
  211. package/dist/routes/shared-world/bundle.js +15 -14
  212. package/dist/routes/shared-world/checkpoints.d.ts +3 -3
  213. package/dist/routes/shared-world/checkpoints.js +1 -1
  214. package/dist/routes/shared-world/comms.d.ts +9 -9
  215. package/dist/routes/shared-world/comms.js +6 -5
  216. package/dist/routes/shared-world/participant-specs.d.ts +3 -3
  217. package/dist/routes/shared-world/participant-specs.js +7 -7
  218. package/dist/routes/shared-world/plan.d.ts +9 -9
  219. package/dist/routes/shared-world/plan.js +9 -9
  220. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  221. package/dist/routes/shared-world/provisioned.js +4 -4
  222. package/dist/routes/shared-world/result.d.ts +6 -6
  223. package/dist/routes/shared-world/result.js +11 -10
  224. package/dist/routes/shared-world/route.d.ts +11 -11
  225. package/dist/routes/shared-world/route.js +19 -19
  226. package/dist/routes/shared-world/setup.d.ts +13 -13
  227. package/dist/routes/shared-world/setup.js +19 -19
  228. package/dist/routes/shared-world/types.d.ts +27 -27
  229. package/dist/routes/terminal/adapter.d.ts +2 -2
  230. package/dist/routes/terminal/adapter.js +4 -4
  231. package/dist/routes/terminal/bundle.d.ts +11 -11
  232. package/dist/routes/terminal/bundle.js +12 -12
  233. package/dist/routes/terminal/credentials.d.ts +4 -4
  234. package/dist/routes/terminal/credentials.js +5 -5
  235. package/dist/routes/terminal/dry-run.d.ts +4 -4
  236. package/dist/routes/terminal/dry-run.js +9 -9
  237. package/dist/routes/terminal/ledger.d.ts +2 -2
  238. package/dist/routes/terminal/lifetime.d.ts +1 -1
  239. package/dist/routes/terminal/lifetime.js +1 -1
  240. package/dist/routes/terminal/live-finish.d.ts +2 -2
  241. package/dist/routes/terminal/live-finish.js +7 -7
  242. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  243. package/dist/routes/terminal/live-sandbox.js +3 -2
  244. package/dist/routes/terminal/participant-text.js +2 -1
  245. package/dist/routes/terminal/persona.d.ts +2 -2
  246. package/dist/routes/terminal/persona.js +2 -2
  247. package/dist/routes/terminal/plan.d.ts +7 -7
  248. package/dist/routes/terminal/plan.js +5 -5
  249. package/dist/routes/terminal/result.d.ts +5 -5
  250. package/dist/routes/terminal/result.js +7 -7
  251. package/dist/routes/terminal/route.d.ts +9 -9
  252. package/dist/routes/terminal/route.js +14 -14
  253. package/dist/routes/terminal/session.d.ts +5 -5
  254. package/dist/routes/terminal/session.js +7 -7
  255. package/dist/routes/terminal/trace.d.ts +2 -2
  256. package/dist/routes/terminal/types.d.ts +24 -24
  257. package/dist/routes/terminal/types.js +2 -2
  258. package/dist/run/bundle.d.ts +7 -7
  259. package/dist/run/bundle.js +2 -2
  260. package/dist/run/costs.d.ts +23 -0
  261. package/dist/run/costs.js +72 -43
  262. package/dist/run/dry-run-inputs.d.ts +1 -1
  263. package/dist/run/dry-run-inputs.js +1 -1
  264. package/dist/run/dry-run.js +2 -2
  265. package/dist/run/outcomes.d.ts +1 -1
  266. package/dist/run/participant.d.ts +1 -1
  267. package/dist/run/preflight-receipts.js +1 -1
  268. package/dist/run/pricing.js +2 -2
  269. package/dist/run/projection.d.ts +32 -32
  270. package/dist/run/projection.js +44 -44
  271. package/dist/run/reclaim.d.ts +1 -1
  272. package/dist/run/reclaim.js +1 -1
  273. package/dist/run/results.d.ts +2 -2
  274. package/dist/run/run-cost.d.ts +53 -0
  275. package/dist/run/run-cost.js +105 -0
  276. package/dist/run/run-index-analysis.d.ts +15 -0
  277. package/dist/run/run-index-analysis.js +77 -0
  278. package/dist/run/run-index.d.ts +11 -1
  279. package/dist/run/run-index.js +63 -49
  280. package/dist/run/run.d.ts +3 -3
  281. package/dist/run/run.js +2 -2
  282. package/dist/run/shared-world-evidence.d.ts +1 -1
  283. package/dist/run/shared-world-shape.js +1 -1
  284. package/dist/run/stats.d.ts +3 -3
  285. package/dist/run/stats.js +14 -14
  286. package/dist/run/status.d.ts +10 -2
  287. package/dist/run/status.js +6 -3
  288. package/dist/run/streams.d.ts +2 -2
  289. package/dist/run/study-provenance.d.ts +4 -2
  290. package/dist/run/study-provenance.js +7 -4
  291. package/dist/run/study-result.d.ts +0 -5
  292. package/dist/run/study-result.js +1 -1
  293. package/dist/run-study.d.ts +112 -0
  294. package/dist/{run-lab.js → run-study.js} +52 -45
  295. package/dist/{lab → study}/adapter-extension.d.ts +8 -20
  296. package/dist/{lab → study}/adapter-extension.js +2 -14
  297. package/dist/{lab → study}/adapter-scorer-loader.d.ts +10 -10
  298. package/dist/{lab → study}/adapter-scorer-loader.js +3 -3
  299. package/dist/study/composition-rules.d.ts +7 -0
  300. package/dist/{lab → study}/composition-rules.js +12 -12
  301. package/dist/study/config.d.ts +15 -0
  302. package/dist/{lab → study}/config.js +37 -20
  303. package/dist/study/convert.d.ts +1 -1
  304. package/dist/study/convert.js +15 -15
  305. package/dist/{lab → study}/device-presets.d.ts +2 -2
  306. package/dist/{lab → study}/discover.d.ts +29 -23
  307. package/dist/{lab → study}/discover.js +97 -118
  308. package/dist/{lab → study}/doctor.d.ts +11 -11
  309. package/dist/{lab → study}/doctor.js +18 -18
  310. package/dist/study/files.d.ts +2 -2
  311. package/dist/study/files.js +6 -5
  312. package/dist/{lab → study}/init-templates.d.ts +2 -2
  313. package/dist/{lab → study}/init-templates.js +16 -11
  314. package/dist/{lab → study}/init.d.ts +1 -1
  315. package/dist/{lab → study}/init.js +7 -4
  316. package/dist/{lab → study}/keys.d.ts +2 -2
  317. package/dist/{lab → study}/keys.js +10 -10
  318. package/dist/study/migrate.d.ts +1 -1
  319. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  320. package/dist/{lab → study}/parse/actors.js +5 -5
  321. package/dist/study/parse/comms.d.ts +12 -0
  322. package/dist/study/parse/execution.d.ts +19 -0
  323. package/dist/{lab → study}/parse/study-v3.d.ts +3 -5
  324. package/dist/{lab → study}/parse/study-v3.js +3 -3
  325. package/dist/{lab → study}/parse/subject-state.d.ts +8 -8
  326. package/dist/{lab → study}/parse/subject-state.js +4 -4
  327. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  328. package/dist/{lab → study}/parse/subject.js +8 -8
  329. package/dist/{lab → study}/parse/values.d.ts +2 -2
  330. package/dist/{lab → study}/persona-resolve.d.ts +4 -4
  331. package/dist/{lab → study}/persona-resolve.js +2 -2
  332. package/dist/{lab → study}/plan-base.d.ts +7 -7
  333. package/dist/{lab → study}/plan-base.js +1 -1
  334. package/dist/{lab → study}/plan-participants.d.ts +10 -10
  335. package/dist/{lab → study}/plan-participants.js +4 -4
  336. package/dist/{lab → study}/plan-types.d.ts +28 -28
  337. package/dist/{lab → study}/plan-types.js +2 -2
  338. package/dist/study/plan.d.ts +13 -0
  339. package/dist/{lab → study}/plan.js +20 -20
  340. package/dist/study/preflight-probes.d.ts +3 -0
  341. package/dist/{lab → study}/preflight-probes.js +9 -8
  342. package/dist/study/preflight-result.d.ts +8 -0
  343. package/dist/{lab → study}/preflight-result.js +3 -3
  344. package/dist/{lab → study}/preflight.d.ts +31 -31
  345. package/dist/{lab → study}/preflight.js +8 -8
  346. package/dist/{lab → study}/requirements.d.ts +3 -3
  347. package/dist/{lab → study}/requirements.js +1 -1
  348. package/dist/study/route-inputs.d.ts +28 -0
  349. package/dist/{lab → study}/route-inputs.js +1 -1
  350. package/dist/{lab → study}/routing.d.ts +12 -12
  351. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -10
  352. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -3
  353. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +8 -17
  354. package/dist/study/run-study-homes.js +3 -0
  355. package/dist/study/run-study-options.d.ts +28 -0
  356. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +13 -12
  357. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +2 -2
  358. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  359. package/dist/{lab → study}/summary.d.ts +10 -10
  360. package/dist/{lab → study}/summary.js +15 -15
  361. package/dist/{lab → study}/tasks.d.ts +3 -3
  362. package/dist/{lab → study}/tasks.js +1 -1
  363. package/dist/{lab → study}/types.d.ts +104 -104
  364. package/dist/{lab → study}/types.js +1 -1
  365. package/dist/{lab → study}/validation.d.ts +19 -19
  366. package/dist/{lab → study}/validation.js +13 -13
  367. package/dist/{lab → study}/warnings.d.ts +4 -4
  368. package/dist/{lab → study}/warnings.js +1 -1
  369. package/dist/subject/clone.d.ts +6 -6
  370. package/dist/subject/clone.js +2 -2
  371. package/dist/subject/local-tree-archive.d.ts +2 -2
  372. package/dist/subject/local-tree-archive.js +3 -3
  373. package/dist/subject/local-tree.d.ts +3 -3
  374. package/dist/subject/runtime.js +2 -2
  375. package/dist/subject/serve.d.ts +4 -4
  376. package/dist/subject/state.d.ts +3 -3
  377. package/dist/subject/state.js +1 -1
  378. package/dist/subject/steps.d.ts +1 -1
  379. package/dist/subject/steps.js +1 -1
  380. package/dist/substrates/desktop-session.js +2 -2
  381. package/dist/substrates/detached.d.ts +1 -1
  382. package/dist/substrates/e2b/desktop-browser.d.ts +4 -4
  383. package/dist/substrates/e2b/desktop-browser.js +1 -1
  384. package/dist/substrates/e2b/desktop-cdp.d.ts +1 -1
  385. package/dist/substrates/e2b/desktop-cdp.js +1 -1
  386. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  387. package/dist/substrates/e2b/desktop-executor.js +12 -12
  388. package/dist/substrates/e2b/desktop-geometry.d.ts +1 -1
  389. package/dist/substrates/e2b/desktop-geometry.js +1 -1
  390. package/dist/substrates/e2b/desktop-media.d.ts +3 -3
  391. package/dist/substrates/e2b/lifetime.js +1 -1
  392. package/dist/substrates/e2b/sandbox.d.ts +3 -3
  393. package/dist/substrates/e2b/sandbox.js +1 -1
  394. package/dist/substrates/e2b/sdk.d.ts +1 -1
  395. package/dist/substrates/e2b/sdk.js +1 -1
  396. package/dist/substrates/local/runtime-config.d.ts +4 -4
  397. package/dist/substrates/local/runtime-config.js +4 -4
  398. package/dist/tui/contract.d.ts +8 -8
  399. package/dist/tui/contract.js +2 -2
  400. package/dist/tui/launch.d.ts +3 -3
  401. package/dist/tui/launch.js +22 -16
  402. package/dist/tui-app.js +139 -139
  403. package/dist/verify/subject.d.ts +1 -1
  404. package/dist/verify/subject.js +1 -1
  405. package/dist/verify/verify.js +2 -1
  406. package/docs/architecture/actor-contract.md +5 -5
  407. package/docs/architecture/browser-control.md +1 -1
  408. package/docs/architecture/external-public-shared-world.md +8 -7
  409. package/docs/architecture/github-feedback-loop.md +1 -1
  410. package/docs/architecture/task-protocol-support.md +1 -1
  411. package/docs/architecture/terminal-product-route.md +18 -18
  412. package/docs/contracts/adapter-fixtures.md +2 -2
  413. package/docs/contracts/errors.md +8 -8
  414. package/docs/contracts/run-bundle.md +1 -4
  415. package/docs/contracts/schemas.md +61 -42
  416. package/docs/contracts/study-analysis.md +4 -1
  417. package/docs/contracts/study-costs.md +17 -2
  418. package/examples/README.md +1 -1
  419. package/examples/scorer/scorer.mjs +3 -3
  420. package/package.json +1 -1
  421. package/skills/humanish/SKILL.md +8 -6
  422. package/skills/humanish/agents/openai.yaml +1 -1
  423. package/dist/cli/commands/lab-format.d.ts +0 -9
  424. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  425. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  426. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  427. package/dist/cli/commands/lab-run.d.ts +0 -9
  428. package/dist/lab/composition-rules.d.ts +0 -7
  429. package/dist/lab/config.d.ts +0 -7
  430. package/dist/lab/deprecated-fields.d.ts +0 -10
  431. package/dist/lab/deprecated-fields.js +0 -24
  432. package/dist/lab/parse/comms.d.ts +0 -12
  433. package/dist/lab/parse/execution.d.ts +0 -19
  434. package/dist/lab/plan.d.ts +0 -13
  435. package/dist/lab/preflight-probes.d.ts +0 -3
  436. package/dist/lab/preflight-result.d.ts +0 -8
  437. package/dist/lab/route-inputs.d.ts +0 -28
  438. package/dist/lab/run-lab-homes.js +0 -7
  439. package/dist/lab/run-lab-options.d.ts +0 -28
  440. package/dist/library-aliases.d.ts +0 -56
  441. package/dist/library-aliases.js +0 -22
  442. package/dist/run-lab.d.ts +0 -112
  443. /package/dist/{lab → study}/device-presets.js +0 -0
  444. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  445. /package/dist/{lab → study}/init-paths.js +0 -0
  446. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  447. /package/dist/{lab → study}/init-plan.js +0 -0
  448. /package/dist/{lab → study}/parse/comms.js +0 -0
  449. /package/dist/{lab → study}/parse/execution.js +0 -0
  450. /package/dist/{lab → study}/parse/values.js +0 -0
  451. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  452. /package/dist/{lab → study}/participant-assignment.js +0 -0
  453. /package/dist/{lab → study}/persona.d.ts +0 -0
  454. /package/dist/{lab → study}/persona.js +0 -0
  455. /package/dist/{lab → study}/routing.js +0 -0
@@ -1,10 +1,8 @@
1
1
  import { formatAutomaticAnalysisBudget } from "../../analysis/automatic-config.js";
2
2
  import { resolve } from "node:path";
3
3
  import { Command, Option } from "commander";
4
- import { inspectLabManifest, listLabManifests } from "../../lab/discover.js";
5
- import { runLabPreflight, } from "../../lab/preflight.js";
6
- import { addRunOptions, handleRun } from "./run-command.js";
7
- import { deprecationMessage, warnAndQueue } from "../deprecations.js";
4
+ import { inspectStudyManifest, listStudyManifests } from "../../study/discover.js";
5
+ import { runStudyPreflight, } from "../../study/preflight.js";
8
6
  import { applyEnvFileOption, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, parsePositiveInteger, writeResult, humanError, } from "../io.js";
9
7
  export function registerStudyCommands(parent, io) {
10
8
  const study = parent
@@ -13,51 +11,23 @@ export function registerStudyCommands(parent, io) {
13
11
  listCommand(study.command("list"), io);
14
12
  showCommand(study.command("show"), io);
15
13
  checkCommand(study.command("check"), io);
16
- // Removed in 0.109.0: the `lab` group stays one minor, hidden. Its list, inspect and preflight
17
- // run as study list, show and check, and `lab run` runs as `run`, each after a warning.
18
- const lab = parent
19
- .command("lab", { hidden: true })
20
- .description("Deprecated: use humanish study.");
21
- listCommand(lab.command("list"), io, "humanish study list");
22
- showCommand(lab.command("inspect"), io, "humanish study show <study>");
23
- checkCommand(lab.command("preflight"), io, "humanish study check <study>");
24
- addRunOptions(lab.command("run", { hidden: true }).argument("<study>", "Study id or .yaml path.")).action((name, options, command) => {
25
- warnOldCommand(command, io, "humanish run <study>");
26
- return handleRun(io, name, options, command);
27
- });
28
- }
29
- /** The warning for a `lab` subcommand, naming its replacement. */
30
- function warnOldCommand(command, io, replacement) {
31
- warnAndQueue(command, io, deprecationMessage(`humanish lab ${command.name()}`, replacement));
32
14
  }
33
- function listCommand(command, io, replacement) {
15
+ function listCommand(command, io) {
34
16
  command
35
17
  .description("List the studies in this project, committed and local.")
36
18
  .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
37
19
  .option("--json", JSON_OPTION_DESCRIPTION)
38
- .action((options, command) => {
39
- if (replacement !== undefined)
40
- warnOldCommand(command, io, replacement);
41
- return handleStudyList(io, options, command);
42
- });
43
- if (replacement !== undefined)
44
- command.description(`Deprecated: use ${replacement}.`);
20
+ .action((options, command) => handleStudyList(io, options, command));
45
21
  }
46
- function showCommand(command, io, replacement) {
22
+ function showCommand(command, io) {
47
23
  command
48
24
  .argument("<study>", "Study id or .yaml path.")
49
25
  .description("Show a study's parsed file and its warnings without running it.")
50
26
  .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
51
27
  .option("--json", JSON_OPTION_DESCRIPTION)
52
- .action((name, options, command) => {
53
- if (replacement !== undefined)
54
- warnOldCommand(command, io, replacement);
55
- return handleStudyShow(io, name, options, command);
56
- });
57
- if (replacement !== undefined)
58
- command.description(`Deprecated: use ${replacement}.`);
28
+ .action((name, options, command) => handleStudyShow(io, name, options, command));
59
29
  }
60
- function checkCommand(command, io, replacement) {
30
+ function checkCommand(command, io) {
61
31
  command
62
32
  .argument("<study>", "Study id or .yaml path.")
63
33
  .description("Check the study file and, with --reachability, its named endpoints. humanish doctor --study <study> checks this machine.")
@@ -68,21 +38,15 @@ function checkCommand(command, io, replacement) {
68
38
  .option("--timeout-ms <ms>", "Target reachability timeout.", String(30_000))
69
39
  .option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
70
40
  .option("--json", JSON_OPTION_DESCRIPTION)
71
- .action((name, options, command) => {
72
- if (replacement !== undefined)
73
- warnOldCommand(command, io, replacement);
74
- return handleStudyCheck(io, name, options, command);
75
- });
76
- if (replacement !== undefined)
77
- command.description(`Deprecated: use ${replacement}.`);
41
+ .action((name, options, command) => handleStudyCheck(io, name, options, command));
78
42
  }
79
43
  async function handleStudyList(io, options, command) {
80
- const result = await listLabManifests(options.cwd);
44
+ const result = await listStudyManifests(options.cwd);
81
45
  writeResult(command, io, result, formatStudyListHuman);
82
46
  io.setExitCode(0);
83
47
  }
84
48
  async function handleStudyShow(io, name, options, command) {
85
- const result = await inspectLabManifest(options.cwd, name);
49
+ const result = await inspectStudyManifest(options.cwd, name);
86
50
  writeResult(command, io, result, formatStudyShowHuman);
87
51
  io.setExitCode(result.ok ? 0 : 2);
88
52
  }
@@ -117,9 +81,9 @@ async function handleStudyCheck(io, name, options, command) {
117
81
  io.setExitCode(2);
118
82
  return;
119
83
  }
120
- const result = await runLabPreflight({
84
+ const result = await runStudyPreflight({
121
85
  cwd: options.cwd,
122
- lab: name,
86
+ study: name,
123
87
  reachability: options.reachability,
124
88
  timeoutMs,
125
89
  });
@@ -136,7 +100,7 @@ function formatStudyListHuman(result) {
136
100
  }
137
101
  return ([
138
102
  "humanish studies",
139
- ...result.studies.map((lab) => `- ${lab.id} ${lab.source} ${lab.origin} ${lab.path}${lab.title ? ` (${lab.title})` : ""}${lab.error ? `\n error: ${lab.error}` : ""}`),
103
+ ...result.studies.map((study) => `- ${study.id} ${study.source} ${study.origin} ${study.path}${study.title ? ` (${study.title})` : ""}`),
140
104
  ...result.warnings.map((warning) => `warning: ${warning}`),
141
105
  ].join("\n") + "\n");
142
106
  }
@@ -4,15 +4,15 @@ import { Command } from "commander";
4
4
  import { setUserKey } from "../../keys/key-resolution.js";
5
5
  import { saveCommsConnection } from "../../comms/connections.js";
6
6
  import { readCommsSetup } from "../../comms/setup.js";
7
- import { checkCommsConnection, configureCommsLab, } from "../../comms/setup.js";
7
+ import { checkCommsConnection, configureCommsStudy, } from "../../comms/setup.js";
8
8
  import { inspectCommsRecovery, recoverCommsReceiving } from "../../comms/receiving-recovery.js";
9
9
  import { resolveReceivingConnection } from "../../comms/receiving-runtime.js";
10
10
  import { promptSecret } from "../secret-prompt.js";
11
- import { runInit } from "../../lab/init.js";
12
- import { listLabManifests } from "../../lab/discover.js";
11
+ import { runInit } from "../../study/init.js";
12
+ import { listStudyManifests } from "../../study/discover.js";
13
13
  import { reclaimRunSandboxes } from "../../run/reclaim.js";
14
14
  import { RunIndexCache, readRunIndex } from "../../run/run-index.js";
15
- import { readLabSummary } from "../../lab/summary.js";
15
+ import { readStudySummary } from "../../study/summary.js";
16
16
  import { readProjectState } from "../../tui/project.js";
17
17
  import { createTuiObserverSession, stopRun, TUI_ACTION_SCHEMA } from "../../tui/actions.js";
18
18
  import { readRunDetail } from "../../run/detail.js";
@@ -128,7 +128,7 @@ function checkTuiSession(runtime, force) {
128
128
  ok: false,
129
129
  error: {
130
130
  code: "HUMANISH_TUI_REQUIRES_TTY",
131
- message: "humanish tui needs an interactive terminal. For scripted or agent use, `humanish runs --json` lists the same runs and `humanish run <lab> --json` starts one.",
131
+ message: "humanish tui needs an interactive terminal. For scripted or agent use, `humanish runs --json` lists the same runs and `humanish run <study> --json` starts one.",
132
132
  },
133
133
  };
134
134
  }
@@ -210,13 +210,13 @@ function tuiCapabilities(session) {
210
210
  });
211
211
  return session.connectionCheck;
212
212
  },
213
- labs: async () => (await listLabManifests(cwd)).studies.map((lab) => ({
214
- title: lab.title ?? lab.id,
215
- path: lab.path,
213
+ studies: async () => (await listStudyManifests(cwd)).studies.map((study) => ({
214
+ title: study.title ?? study.id,
215
+ path: study.path,
216
216
  })),
217
- configure: (lab, apply, planToken) => configureCommsLab({
217
+ configure: (study, apply, planToken) => configureCommsStudy({
218
218
  cwd,
219
- lab,
219
+ study,
220
220
  connection: "agentmail",
221
221
  apply,
222
222
  ...(planToken ? { planToken } : {}),
@@ -244,11 +244,11 @@ function tuiCapabilities(session) {
244
244
  // One cache for the life of the surface: it refreshes on a cadence, and re-walking every
245
245
  // run tree each tick is the cost this index exists to avoid.
246
246
  readRunIndex: (target, readOptions) => readRunIndex(target, { ...readOptions, cache: runIndexCache }),
247
- listLabs: listLabManifests,
247
+ listStudies: listStudyManifests,
248
248
  startRun: (launchOptions) => launchRun({ ...launchOptions, env: sessionEnv }),
249
249
  readLaunchLog: readLaunchLogTail,
250
250
  readRunDetail,
251
- readLabSummary: (target, lab, readOptions) => readLabSummary(target, lab, { ...readOptions, env: sessionEnv }),
251
+ readStudySummary: (target, study, readOptions) => readStudySummary(target, study, { ...readOptions, env: sessionEnv }),
252
252
  readProjectState,
253
253
  openObserver: (target, observerPath) => observerSession.open(target, observerPath),
254
254
  reclaimRun: (target, runId) => reclaimRunSandboxes(target, runId),
@@ -1,10 +1,9 @@
1
1
  import { Command, Option } from "commander";
2
- import { renderObserver, serveObserver } from "../../observer/render.js";
2
+ import { serveObserver } from "../../observer/render.js";
3
3
  import { WATCH_SAFE_NOT_APPLICABLE_MESSAGE } from "../../observer/exposure.js";
4
4
  import { runDryRun } from "../../run/dry-run.js";
5
- import { runLabCommand } from "./lab-run.js";
5
+ import { runStudyCommand } from "./study-run.js";
6
6
  import { addRunOptions, studyOnlyFlags } from "./run-command.js";
7
- import { deprecationMessage, oldStudyOption, studyOptionValue, warnAndQueue, } from "../deprecations.js";
8
7
  import { applyEnvFileOption, collectRepeated, formatRunHuman, parseObserverPort, parsePositiveInteger, wantsJson, writeResult, } from "../io.js";
9
8
  import { followObserver, formatObserverHuman, watchExposeRequested } from "../observer-follow.js";
10
9
  export function registerWatchCommand(parent, io) {
@@ -14,10 +13,7 @@ export function registerWatchCommand(parent, io) {
14
13
  .argument("[study]", "Study id or .yaml path to run and observe.")
15
14
  .description("Run a study, open its Observer and keep the shell attached.")
16
15
  .summary("Run a study and follow it in the Observer.")
17
- .option("--study <id-or-path>", "Study id or .yaml path, in place of the argument.")
18
- .addOption(oldStudyOption("id-or-path"))
19
- // Removed in 0.109.0: watch --run stays one minor, hidden; observe --run shows a saved run.
20
- .addOption(new Option("--run <id>", "Deprecated: use humanish observe --run <id>.").hideHelp()))
16
+ .option("--study <id-or-path>", "Study id or .yaml path, in place of the argument."))
21
17
  .option("--expose", "Computer-use studies only: share the live run through an authenticated tunnel, to watch from a phone. Requires --oauth or --public-url.")
22
18
  .addOption(new Option("--tunnel <provider>", "Spawn the external tunnel binary against the loopback port.").choices(["ngrok"]))
23
19
  .option("--tunnel-domain <domain>", "Reserved domain passed to ngrok as --url (e.g. observer.example.com). Requires --tunnel.")
@@ -51,10 +47,7 @@ export function registerWatchCommand(parent, io) {
51
47
  }
52
48
  async function handleWatch(io, named, parsed, command) {
53
49
  const options = parsed;
54
- if (options.run !== undefined) {
55
- warnAndQueue(command, io, deprecationMessage("humanish watch --run", "humanish observe --run <id>"));
56
- }
57
- const option = studyOptionValue(command, io, options);
50
+ const option = options.study;
58
51
  const study = option ?? named;
59
52
  if (option !== undefined && named !== undefined) {
60
53
  refuseWatch(command, io, options.cwd, {
@@ -68,7 +61,7 @@ async function handleWatch(io, named, parsed, command) {
68
61
  cwd: options.cwd,
69
62
  envFile: options.envFile,
70
63
  io,
71
- // runLabCommand discovers keys for a live lab; a preview or a saved run needs none.
64
+ // runStudyCommand discovers keys for a live study; a preview run needs none.
72
65
  discoverKeys: false,
73
66
  }))) {
74
67
  return;
@@ -85,9 +78,9 @@ async function handleWatch(io, named, parsed, command) {
85
78
  });
86
79
  return;
87
80
  }
88
- // Exposure is only meaningful for a live computer-use study run (it serves the live desktop). The
89
- // non-lab watch path (existing evidence, or a fresh synthetic run) has no live desktop to
90
- // stream, so exposure flags there are refused rather than silently ignored; use `observe --all`.
81
+ // Exposure is only meaningful for a live computer-use study run (it serves the live desktop). A
82
+ // watch without a study starts a fresh synthetic run with no live desktop to stream, so exposure
83
+ // flags there are refused rather than silently ignored; use `observe --all`.
91
84
  if (watchExposeRequested(options)) {
92
85
  refuseWatch(command, io, options.cwd, {
93
86
  code: "HUMANISH_WATCH_OPTION_CONFLICT",
@@ -103,7 +96,7 @@ async function handleWatch(io, named, parsed, command) {
103
96
  });
104
97
  return;
105
98
  }
106
- const target = resolveWatchTarget(options, command);
99
+ const target = resolveWatchTarget(options);
107
100
  if ("code" in target) {
108
101
  refuseWatch(command, io, options.cwd, target);
109
102
  return;
@@ -136,24 +129,13 @@ function refuseWatch(command, io, cwd, refusal) {
136
129
  writeResult(command, io, result, formatRunHuman);
137
130
  io.setExitCode(2);
138
131
  }
139
- /** A study argument starts that study under watch; `--run` would name other evidence. */
132
+ /** A study argument starts that study under watch. */
140
133
  async function watchStudy(io, command, study, options) {
141
- if (options.run !== undefined) {
142
- refuseWatch(command, io, options.cwd, {
143
- code: "HUMANISH_WATCH_OPTION_CONFLICT",
144
- message: "Use either a study to start evidence or --run to watch existing evidence, not both.",
145
- });
146
- return;
147
- }
148
- // Forwarded wholesale, as `run` forwards its options, so a run flag reaches the lab either way.
149
- await runLabCommand({ command, io, lab: study, mode: "watch", options });
134
+ // Forwarded wholesale, as `run` forwards its options, so a run flag reaches the run either way.
135
+ await runStudyCommand({ command, io, study, mode: "watch", options });
150
136
  }
151
- /** Without a study, watch shows existing evidence (`--run`) or a fresh synthetic run (`--count`). */
152
- function resolveWatchTarget(options, command) {
153
- const runOptionSource = typeof command.getOptionValueSource === "function"
154
- ? command.getOptionValueSource("run")
155
- : undefined;
156
- const runWasOmitted = runOptionSource === undefined || runOptionSource === "default";
137
+ /** Without a study, watch starts a fresh synthetic run of `--count` participants, 4 by default. */
138
+ function resolveWatchTarget(options) {
157
139
  const participantCount = options.count === undefined ? undefined : parsePositiveInteger(options.count);
158
140
  const port = parseObserverPort(options.port);
159
141
  if (participantCount === null) {
@@ -162,48 +144,31 @@ function resolveWatchTarget(options, command) {
162
144
  message: "--count must be a positive integer.",
163
145
  };
164
146
  }
165
- if (!runWasOmitted && participantCount !== undefined) {
166
- return {
167
- code: "HUMANISH_WATCH_OPTION_CONFLICT",
168
- message: "Use either --run to watch existing evidence or --count to start a fresh run, not both.",
169
- };
170
- }
171
- if (!runWasOmitted && options.runId !== undefined) {
172
- return {
173
- code: "HUMANISH_WATCH_OPTION_CONFLICT",
174
- message: "--run-id only applies to fresh watch runs; remove --run or remove --run-id.",
175
- };
176
- }
177
147
  if (port === null) {
178
148
  return {
179
149
  code: "HUMANISH_INVALID_PORT",
180
150
  message: "--port must be an integer between 0 and 65535.",
181
151
  };
182
152
  }
183
- return { requestedParticipantCount: participantCount ?? (runWasOmitted ? 4 : undefined), port };
153
+ return { requestedParticipantCount: participantCount ?? 4, port };
184
154
  }
185
- /** Render the evidence to show; undefined when a fresh run failed and its result was written. */
155
+ /** Render the fresh run; undefined when it failed and its result was written. */
186
156
  async function renderWatchEvidence(io, command, options, requestedParticipantCount, staticOpen) {
187
- if (requestedParticipantCount !== undefined && requestedParticipantCount !== null) {
188
- // A fresh run renders through its finished run, so the page shown is the run just
189
- // written, never a directory swapped in under its id.
190
- const runResult = await runDryRun({
191
- cwd: options.cwd,
192
- dryRun: true,
193
- participantCount: requestedParticipantCount,
194
- ...(options.runId === undefined ? {} : { runId: options.runId }),
195
- observer: { open: staticOpen },
196
- });
197
- if (!runResult.ok || runResult.observer === undefined) {
198
- writeResult(command, io, runResult, formatRunHuman);
199
- io.setExitCode(2);
200
- return undefined;
201
- }
202
- return runResult.observer;
203
- }
204
- return renderObserver(options.cwd, options.run ?? "latest", {
205
- open: staticOpen,
157
+ // A fresh run renders through its finished run, so the page shown is the run just written,
158
+ // never a directory swapped in under its id.
159
+ const runResult = await runDryRun({
160
+ cwd: options.cwd,
161
+ dryRun: true,
162
+ participantCount: requestedParticipantCount,
163
+ ...(options.runId === undefined ? {} : { runId: options.runId }),
164
+ observer: { open: staticOpen },
206
165
  });
166
+ if (!runResult.ok || runResult.observer === undefined) {
167
+ writeResult(command, io, runResult, formatRunHuman);
168
+ io.setExitCode(2);
169
+ return undefined;
170
+ }
171
+ return runResult.observer;
207
172
  }
208
173
  /** Write the result, then keep a live server attached when following. */
209
174
  async function reportWatch(io, command, rendered, serve) {
@@ -1,18 +1,6 @@
1
- import { Option, type Command } from "commander";
1
+ import type { Command } from "commander";
2
2
  import type { CliIo } from "./io.js";
3
- /** `<old> is deprecated and is removed in the next minor. Use <replacement>.` */
4
- export declare function deprecationMessage(old: string, replacement: string): string;
5
3
  /** Print `warning: <message>` on stderr, and queue the message for the command's JSON result. */
6
4
  export declare function warnAndQueue(command: Command, io: CliIo, message: string): void;
7
5
  /** `output` with the command's queued warnings at the front of its `warnings`. */
8
6
  export declare function withQueuedWarnings<T>(command: Command, output: T): T;
9
- /**
10
- * The 0.107 spelling of `--study`, hidden for one minor. Commander refuses it together with
11
- * `--study`. Read the value with studyOptionValue.
12
- */
13
- export declare function oldStudyOption(valueName: string): Option;
14
- /** The `--study` value, or the `--lab` value with its deprecation warning. */
15
- export declare function studyOptionValue(command: Command, io: CliIo, options: {
16
- study?: string | undefined;
17
- lab?: string | undefined;
18
- }): string | undefined;
@@ -1,12 +1,4 @@
1
- // A warning a command prints, such as a deprecated spelling or a study file 0.109 stops reading,
2
- // goes to stderr when it happens and into the `warnings` array of the command's JSON result, so a
3
- // caller that reads only stdout sees it too. writeResult adds the queued warnings.
4
- import { Option } from "commander";
5
1
  const queued = new WeakMap();
6
- /** `<old> is deprecated and is removed in the next minor. Use <replacement>.` */
7
- export function deprecationMessage(old, replacement) {
8
- return `${old} is deprecated and is removed in the next minor. Use ${replacement}.`;
9
- }
10
2
  /** Print `warning: <message>` on stderr, and queue the message for the command's JSON result. */
11
3
  export function warnAndQueue(command, io, message) {
12
4
  io.writeErr(`warning: ${message}\n`);
@@ -24,25 +16,3 @@ export function withQueuedWarnings(command, output) {
24
16
  return output;
25
17
  return { ...output, warnings: [...messages, ...(existing ?? [])] };
26
18
  }
27
- /**
28
- * The 0.107 spelling of `--study`, hidden for one minor. Commander refuses it together with
29
- * `--study`. Read the value with studyOptionValue.
30
- */
31
- export function oldStudyOption(valueName) {
32
- return new Option(`--lab <${valueName}>`).hideHelp().conflicts("study");
33
- }
34
- /** The `--study` value, or the `--lab` value with its deprecation warning. */
35
- export function studyOptionValue(command, io, options) {
36
- if (options.lab === undefined)
37
- return options.study;
38
- const path = commandPath(command);
39
- warnAndQueue(command, io, deprecationMessage(`humanish ${path} --lab`, `humanish ${path} --study <study>`));
40
- return options.lab;
41
- }
42
- /** The command's words after `humanish`, such as `comms check`. */
43
- function commandPath(command) {
44
- const words = [];
45
- for (let at = command; at?.parent; at = at.parent)
46
- words.unshift(at.name());
47
- return words.join(" ");
48
- }
@@ -1,6 +1,6 @@
1
1
  import { type KeyResolutionDeps } from "../keys/key-resolution.js";
2
2
  import { type DetectLocalAgentsOptions } from "../actors/local-agent/cli.js";
3
- import { type LabSetupCheckArgs } from "../lab/doctor.js";
3
+ import { type StudySetupCheckArgs } from "../study/doctor.js";
4
4
  declare const DOCTOR_SCHEMA = "humanish.doctor-result.v1";
5
5
  /**
6
6
  * A row's verdict, as the human output prints it. A "note" is advisory: it never fails the run, so
@@ -41,12 +41,12 @@ export type DoctorCheckDraft = Omit<DoctorResult["checks"][number], "status"> &
41
41
  status?: "note";
42
42
  };
43
43
  export declare function doctor(cwdInput: string, options?: {
44
- lab?: string;
44
+ study?: string;
45
45
  env?: NodeJS.ProcessEnv;
46
46
  localAgents?: DetectLocalAgentsOptions;
47
47
  /** Where the key probe looks for vendor stores; tests point it at a temp home. */
48
48
  keyDeps?: KeyResolutionDeps;
49
49
  /** The hosted Codex participant's operator handshake; tests replace it. */
50
- codexParticipantReadiness?: LabSetupCheckArgs["codexParticipantReadiness"];
50
+ codexParticipantReadiness?: StudySetupCheckArgs["codexParticipantReadiness"];
51
51
  }): Promise<DoctorResult>;
52
52
  export {};
@@ -4,7 +4,7 @@ import path from "node:path";
4
4
  import { probeKeySources, } from "../keys/key-resolution.js";
5
5
  import { nodeSupportsTui, terminalSurfaceMessage, TUI_BUNDLE_URL } from "../tui/contract.js";
6
6
  import { detectLocalAgents, localAgentDoctorMessage, NO_LOCAL_AGENT_MESSAGE, } from "../actors/local-agent/cli.js";
7
- import { labSetupChecks, studiesByRequiredKey } from "../lab/doctor.js";
7
+ import { studySetupChecks, studiesByRequiredKey, } from "../study/doctor.js";
8
8
  import { prepareSelectedOutputDirectory, } from "../run/contained-output.js";
9
9
  import { implicitProjectDirectoryExists, readImplicitProjectFile, validateCwd, } from "../run/project.js";
10
10
  const DOCTOR_SCHEMA = "humanish.doctor-result.v1";
@@ -65,12 +65,12 @@ export async function doctor(cwdInput, options = {}) {
65
65
  }
66
66
  const env = options.env ?? process.env;
67
67
  const agents = await detectLocalAgents({ ...options.localAgents, env });
68
- const { probes, receivingKey } = await probeDoctorKeys(cwd, env, options.lab, options.keyDeps);
68
+ const { probes, receivingKey } = await probeDoctorKeys(cwd, env, options.study, options.keyDeps);
69
69
  const keyPresent = (name) => probes.some((probe) => probe.name === name && probe.source !== null);
70
- const setup = options.lab
71
- ? await labSetupChecks({
70
+ const setup = options.study
71
+ ? await studySetupChecks({
72
72
  cwd,
73
- lab: options.lab,
73
+ study: options.study,
74
74
  env,
75
75
  agents,
76
76
  keyPresent,
@@ -79,7 +79,7 @@ export async function doctor(cwdInput, options = {}) {
79
79
  : { codexParticipantReadiness: options.codexParticipantReadiness }),
80
80
  })
81
81
  : undefined;
82
- // Without --lab, each key row names the labs that need it instead of failing.
82
+ // Without --study, each key row names the studies that need it instead of failing.
83
83
  const keyUsers = setup ? undefined : await studiesByRequiredKey(cwd, keyPresent);
84
84
  const checks = [
85
85
  ...(await projectChecks(projectRoot)),
@@ -195,7 +195,7 @@ async function desktopSdkCheck(setup) {
195
195
  });
196
196
  const version = present ? await installedDesktopSdkVersion() : undefined;
197
197
  const advisory = desktopSdkAdvisory(version);
198
- // Without --lab nothing selects a desktop route yet, so an absent SDK is advisory.
198
+ // Without --study nothing selects a desktop route yet, so an absent SDK is advisory.
199
199
  const advisoryOnly = !present && setup === undefined;
200
200
  return {
201
201
  name: "e2b desktop sdk",
@@ -236,13 +236,13 @@ function terminalSurfaceCheck() {
236
236
  }),
237
237
  };
238
238
  }
239
- /** Probes the live-run keys, plus the receiving-email key a real-comms lab names. */
240
- async function probeDoctorKeys(cwd, env, lab, keyDeps) {
239
+ /** Probes the live-run keys, plus the receiving-email key a real-comms study names. */
240
+ async function probeDoctorKeys(cwd, env, study, keyDeps) {
241
241
  const keyNames = new Set(["OPENAI_API_KEY", "E2B_API_KEY", "GH_TOKEN", "CODEX_API_KEY"]);
242
242
  let receivingKey = null;
243
- if (lab) {
244
- const { resolveLabManifest } = await import("../lab/discover.js");
245
- const resolved = await resolveLabManifest(cwd, lab);
243
+ if (study) {
244
+ const { resolveStudyManifest } = await import("../study/discover.js");
245
+ const resolved = await resolveStudyManifest(cwd, study);
246
246
  if (resolved.ok && resolved.config.comms?.email?.kind === "real") {
247
247
  const { receivingRequiredKey } = await import("../comms/setup.js");
248
248
  receivingKey = await receivingRequiredKey(cwd, resolved.config.comms.email.connection);
@@ -284,7 +284,7 @@ function studyList(studies) {
284
284
  * chain a live command resolves (env/--env-file, project overlay, vendor stores, the
285
285
  * humanish user store). Values never appear; sources and fill commands do.
286
286
  *
287
- * With --lab, a key the selected route requires fails when missing. Without it, `keyUsers` maps
287
+ * With --study, a key the selected route requires fails when missing. Without it, `keyUsers` maps
288
288
  * each key to the project's labs that need it, and a key row never fails: a missing key one of
289
289
  * them needs is a note.
290
290
  */
@@ -303,12 +303,12 @@ function keyChecks(probes, receivingKey, setup, keyUsers) {
303
303
  ...(present || usedBy === undefined ? {} : { status: "note" }),
304
304
  message: present
305
305
  ? `supplied by ${probe.source}; presence only, validity not tested${usedBy ? `; ${usedBy}` : ""}`
306
- : `missing; ${usedBy ?? "not used by any lab in this project"}; ${hint}`,
306
+ : `missing; ${usedBy ?? "not used by any study in this project"}; ${hint}`,
307
307
  };
308
308
  }
309
309
  // GH_TOKEN is needed only for private clone subjects, so its absence is informational.
310
310
  const required = setup.keys.includes(probe.name);
311
- // A key the lab is known not to read says so, so a present but unused key does not read as
311
+ // A key the study is known not to read says so, so a present but unused key does not read as
312
312
  // one the run will use.
313
313
  const unused = setup.reads !== undefined && !setup.reads.has(probe.name);
314
314
  return {
@@ -316,7 +316,7 @@ function keyChecks(probes, receivingKey, setup, keyUsers) {
316
316
  ok: present || !required,
317
317
  message: present
318
318
  ? unused
319
- ? `present (${probe.source}), not used by this lab`
319
+ ? `present (${probe.source}), not used by this study`
320
320
  : `supplied by ${probe.source}; presence only, validity not tested`
321
321
  : required
322
322
  ? `missing from every source; ${hint}`
@@ -30,17 +30,17 @@ export interface FirstRunEnvironment {
30
30
  }
31
31
  export type FirstRunActor = "openai-computer-use" | "local-agent";
32
32
  /**
33
- * Which brain the starter live lab should be written for. A machine with a signed-in coding agent
34
- * and no provider key can still do a real live run; writing the lab for the credential the
33
+ * Which brain the starter live study should be written for. A machine with a signed-in coding agent
34
+ * and no provider key can still do a real live run; writing the study for the credential the
35
35
  * operator doesn't have is how a starter file becomes homework.
36
36
  */
37
37
  export declare function starterActorFor(env: FirstRunEnvironment): FirstRunActor;
38
38
  /**
39
- * The `localAgent` a local-agent starter lab names. Left out, the lab would default to Codex and
39
+ * The `localAgent` a local-agent starter study names. Left out, the study would default to Codex and
40
40
  * refuse to run on a machine where only Claude Code is signed in.
41
41
  */
42
42
  export declare function starterLocalAgentFor(env: FirstRunEnvironment): LocalAgentId | undefined;
43
- /** Hosts the local browser lab runs on: Linux x64 and Apple Silicon Macs. */
43
+ /** Hosts that run local browser studies: Linux x64 and Apple Silicon Macs. */
44
44
  export declare function supportsLocalBrowser(platform: NodeJS.Platform | undefined, arch: string | undefined): boolean;
45
45
  export interface FirstRunStep {
46
46
  /** The exact command to run. */
@@ -1,6 +1,6 @@
1
1
  // What a person, or the coding agent setting humanish up for them, should do next.
2
2
  //
3
- // Why: `humanish init` wrote twenty files and stopped. The only lab that could actually run was a
3
+ // Why: `humanish init` wrote twenty files and stopped. The only study that could actually run was a
4
4
  // $0 dry run; the two live ones were templates with `your-org/your-app` in them, so the first live
5
5
  // run a newcomer tried could not succeed no matter what credentials they had. Three independent
6
6
  // sources reached the same place: a participant in our own TUI study walked to the Start row and
@@ -13,8 +13,8 @@
13
13
  // command, and names the one that will actually work on this machine, because a next step that
14
14
  // fails is worse than none.
15
15
  /**
16
- * Which brain the starter live lab should be written for. A machine with a signed-in coding agent
17
- * and no provider key can still do a real live run; writing the lab for the credential the
16
+ * Which brain the starter live study should be written for. A machine with a signed-in coding agent
17
+ * and no provider key can still do a real live run; writing the study for the credential the
18
18
  * operator doesn't have is how a starter file becomes homework.
19
19
  */
20
20
  export function starterActorFor(env) {
@@ -27,7 +27,7 @@ function preferredAgent(env) {
27
27
  return env.localAgents.find((agent) => agent.id === "codex") ?? env.localAgents[0];
28
28
  }
29
29
  /**
30
- * The `localAgent` a local-agent starter lab names. Left out, the lab would default to Codex and
30
+ * The `localAgent` a local-agent starter study names. Left out, the study would default to Codex and
31
31
  * refuse to run on a machine where only Claude Code is signed in.
32
32
  */
33
33
  export function starterLocalAgentFor(env) {
@@ -38,7 +38,7 @@ export function starterLocalAgentFor(env) {
38
38
  * a dev-dependency install puts no \`humanish\` on \`PATH\`, so a bare name can reach a stale global one.
39
39
  */
40
40
  const HUMANISH = "npx humanish";
41
- /** Hosts the local browser lab runs on: Linux x64 and Apple Silicon Macs. */
41
+ /** Hosts that run local browser studies: Linux x64 and Apple Silicon Macs. */
42
42
  export function supportsLocalBrowser(platform, arch) {
43
43
  return (platform === "linux" && arch === "x64") || (platform === "darwin" && arch === "arm64");
44
44
  }
@@ -99,7 +99,7 @@ export function firstRunSteps(env) {
99
99
  }
100
100
  steps.push({
101
101
  command: `${HUMANISH} keys set openai`,
102
- why: "openai-computer-use needs an API key; to use a Codex or Claude Code login instead, sign in and change the lab to actors[0].type: local-agent" +
102
+ why: "openai-computer-use needs an API key; to use a Codex or Claude Code login instead, sign in and change the study to actors[0].type: local-agent" +
103
103
  localUnavailable,
104
104
  });
105
105
  return steps;
@@ -144,7 +144,7 @@ export function agentsSection() {
144
144
  " bundles into an issue; `humanish feedback issue` writes a redacted, share-safe draft.",
145
145
  "- `humanish tui` is for people and refuses to run in an agent session. Use the `--json`",
146
146
  " commands above instead, and tell the person you are working for that `humanish tui` exists.",
147
- "- A live run spends money. `execution.caps.maxUsd` in each lab caps estimated model spend: the run",
147
+ "- A live run spends money. `execution.caps.maxUsd` in each study caps estimated model spend: the run",
148
148
  " stops before its next request once the estimate passes it, so the last request can go over, and",
149
149
  " hosted desktop time is billed on top. Do not raise it without asking the person you are working for.",
150
150
  "",
package/dist/cli/io.d.ts CHANGED
@@ -17,7 +17,7 @@ export declare const ENV_FILE_OPTION_DESCRIPTION = "Load unset variables from th
17
17
  export declare const PORT_OPTION_DESCRIPTION = "Port to listen on at 127.0.0.1.";
18
18
  /** `--port` for a loopback server whose default, 0, lets the OS pick a free port. */
19
19
  export declare function freePortOption(): Option;
20
- export interface LabCommandOptions {
20
+ export interface StudyCommandOptions {
21
21
  count?: string | undefined;
22
22
  cwd: string;
23
23
  detach?: boolean | undefined;
@@ -50,7 +50,7 @@ export declare function applyEnvFileOption(args: {
50
50
  io: CliIo;
51
51
  env?: NodeJS.ProcessEnv;
52
52
  onDiscovered?: (names: string[]) => void;
53
- /** False for the lab-running commands, which discover only once the lab resolves to live. */
53
+ /** False for the study-running commands, which discover only once the study resolves to live. */
54
54
  discoverKeys?: boolean;
55
55
  }): Promise<boolean>;
56
56
  /**
@@ -67,7 +67,7 @@ export declare function discoverCliKeys(args: {
67
67
  /** Announce only the fills of these names; every key is still filled. Undefined announces all. */
68
68
  announced?: ReadonlySet<string>;
69
69
  }): Promise<void>;
70
- export declare function parseLabCount(value: string | undefined, fallback: number): number | null;
70
+ export declare function parseStudyCount(value: string | undefined, fallback: number): number | null;
71
71
  export declare function parseParticipantIds(value: string | undefined): string[];
72
72
  /** An error as a result carries it. A result with only a message, such as keys or comms, has no code. */
73
73
  export interface CliError {
package/dist/cli/io.js CHANGED
@@ -106,7 +106,7 @@ export async function discoverCliKeys(args) {
106
106
  // Discovery must never break a command; a rung that fails to read is a miss, not an error.
107
107
  }
108
108
  }
109
- export function parseLabCount(value, fallback) {
109
+ export function parseStudyCount(value, fallback) {
110
110
  return value === undefined ? fallback : parsePositiveInteger(value);
111
111
  }
112
112
  export function parseParticipantIds(value) {
@@ -126,7 +126,7 @@ export function parseParticipantIds(value) {
126
126
  }
127
127
  /**
128
128
  * The command to run next, by code. A code is listed only when its messages do not already name a
129
- * command: the run-not-found and lab-less run messages do.
129
+ * command: the run-not-found and missing-study messages do.
130
130
  */
131
131
  const NEXT_COMMAND = {
132
132
  HUMANISH_STUDY_NOT_FOUND: "humanish study list",