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
@@ -2,26 +2,26 @@ import { automaticAnalysisBudget, formatAutomaticAnalysisBudget, } from "../../a
2
2
  import { resolve } from "node:path";
3
3
  import { Command } from "commander";
4
4
  import { deriveRunFacts } from "../telemetry.js";
5
- import { resolveLabManifest } from "../../lab/discover.js";
5
+ import { resolveStudyManifest } from "../../study/discover.js";
6
6
  import { warnAndQueue } from "../deprecations.js";
7
- import { planLab, resolveLabDryRun } from "../../lab/plan.js";
8
- import { keyNamesOf } from "../../lab/requirements.js";
9
- import { routeOf } from "../../lab/plan.js";
10
- import { computerUseRouteRun } from "./lab-route-computer-use.js";
11
- import { runRoute } from "./lab-route-run.js";
12
- import { scriptedRouteRun } from "./lab-route-scripted.js";
13
- import { sharedWorldRouteRun } from "./lab-route-shared-world.js";
14
- import { previewRouteRun } from "./lab-route-preview.js";
15
- import { terminalRouteRun } from "./lab-route-terminal.js";
16
- import { maybeLoadAdapterScorer } from "./lab-scorer.js";
7
+ import { planStudy, resolveStudyDryRun } from "../../study/plan.js";
8
+ import { keyNamesOf } from "../../study/requirements.js";
9
+ import { routeOf } from "../../study/plan.js";
10
+ import { computerUseRouteRun } from "./study-route-computer-use.js";
11
+ import { runRoute } from "./study-route-run.js";
12
+ import { scriptedRouteRun } from "./study-route-scripted.js";
13
+ import { sharedWorldRouteRun } from "./study-route-shared-world.js";
14
+ import { previewRouteRun } from "./study-route-preview.js";
15
+ import { terminalRouteRun } from "./study-route-terminal.js";
16
+ import { maybeLoadAdapterScorer } from "./study-scorer.js";
17
17
  import { discoverCliKeys, formatRunHuman, noteRunFacts, writeResult, } from "../io.js";
18
18
  import { watchExposeRequested } from "../observer-follow.js";
19
19
  import { beginRunSignalPhase } from "./run-signals.js";
20
20
  import { WATCH_SAFE_NOT_APPLICABLE_MESSAGE } from "../../observer/exposure.js";
21
- export async function runLabCommand(args) {
22
- const resolved = await resolveLabManifest(args.options.cwd, args.lab);
21
+ export async function runStudyCommand(args) {
22
+ const resolved = await resolveStudyManifest(args.options.cwd, args.study);
23
23
  if (!resolved.ok) {
24
- writeResult(args.command, args.io, resolved, formatLabResolveFailureHuman);
24
+ writeResult(args.command, args.io, resolved, formatStudyResolveFailureHuman);
25
25
  args.io.setExitCode(2);
26
26
  return;
27
27
  }
@@ -33,14 +33,14 @@ export async function runLabCommand(args) {
33
33
  const config = resolved.config;
34
34
  // The run's identity: which manifest, where it lives, and whether it is committed, a
35
35
  // local overlay, or an explicit path. Resolved once here (the only place that knows all three)
36
- // and carried into the run's status record and bundle so the filesystem can answer "which lab
36
+ // and carried into the run's status record and bundle so the filesystem can answer "which study
37
37
  // produced this run" without the old `persona.source = "lab:<id>"` string convention.
38
- const lab = { id: config.id, path: resolved.path, origin: resolved.origin };
39
- // Named here, once, for every route: a preview or terminal result carries no labId, so the
40
- // starter lab `first-run` went unnamed in telemetry while the computer-use ones were named.
41
- noteRunFacts(args.command, deriveRunFacts({ labId: config.id }));
38
+ const study = { id: config.id, path: resolved.path, origin: resolved.origin };
39
+ // Named here, once, for every route, so the starter study `first-run` is named in telemetry
40
+ // whatever its route's result carries.
41
+ noteRunFacts(args.command, deriveRunFacts({ studyId: config.id }));
42
42
  const route = routeOf(config);
43
- if (route !== "computer-use" && labRerunFlagsRequested(args.options)) {
43
+ if (route !== "computer-use" && studyRerunFlagsRequested(args.options)) {
44
44
  writeUnsupportedRerunFlagsResult(args, route);
45
45
  return;
46
46
  }
@@ -54,7 +54,7 @@ export async function runLabCommand(args) {
54
54
  warnings: [],
55
55
  error: {
56
56
  code: "HUMANISH_WATCH_OPTION_CONFLICT",
57
- message: `--expose/--tunnel/--oauth stream a live desktop and apply only to computer-use labs; this lab resolved to the ${route} route.`,
57
+ message: `--expose/--tunnel/--oauth stream a live desktop and apply only to computer-use studies; this study runs on the ${route} route.`,
58
58
  },
59
59
  };
60
60
  writeResult(args.command, args.io, result, formatRunHuman);
@@ -81,8 +81,8 @@ export async function runLabCommand(args) {
81
81
  // Only a live run reads provider keys, so a dry run looks none up: no `gh auth token`, no e2b
82
82
  // login, overlay or key store. A live run fills every key it finds and prints a line only for
83
83
  // the keys its plan reads. This comes after the option refusals above, which read no key, and
84
- // before the route's CLI setup and prepareLab, which do.
85
- if (resolveLabDryRun(config, args.options.dryRun, true) === false) {
84
+ // before the route's CLI setup and prepareStudy, which do.
85
+ if (resolveStudyDryRun(config, args.options.dryRun, true) === false) {
86
86
  const announced = announcedKeyNames(config, args.options);
87
87
  await discoverCliKeys({
88
88
  io: args.io,
@@ -90,15 +90,15 @@ export async function runLabCommand(args) {
90
90
  ...(announced === undefined ? {} : { announced }),
91
91
  });
92
92
  }
93
- // The route's CLI setup refuses bad options, runLab's plan refuses bad labs, and the route's local
93
+ // The route's CLI setup refuses bad options, runStudyWith's plan refuses bad labs, and the route's local
94
94
  // checks (keys, runtime auth, subject env, the local agent, caps) refuse this machine, all before
95
95
  // the scorer loads, so none imports the scorer's host code. The scripted route's checks and the
96
96
  // run-id claim still come after it; the scripted route takes no scorer.
97
97
  const routeRun = routeRunFor(route, { ...args, config });
98
98
  if (routeRun === undefined)
99
99
  return;
100
- // Every route's runLab options carry the lab's provenance, from here only.
101
- const run = { ...routeRun, options: { ...routeRun.options, lab } };
100
+ // Every route's runStudyWith options carry the study's provenance, from here only.
101
+ const run = { ...routeRun, options: { ...routeRun.options, study } };
102
102
  // From here a signal marks the run interrupted and reclaims its sandboxes (run-signals.ts).
103
103
  const signals = beginRunSignalPhase(args.io);
104
104
  try {
@@ -126,12 +126,12 @@ export async function runLabCommand(args) {
126
126
  }
127
127
  const scorer = scorerLoad.scorer;
128
128
  if (scorer) {
129
- // Cross-repo guardrail: `humanish lab run` now import()s host JS named in the manifest.
129
+ // Cross-repo guardrail: `humanish run` import()s host JS named in the manifest.
130
130
  // Surface it so the invoker (who may not be the manifest author) knows executable code ran.
131
131
  args.io.writeErr(`warning: review scorer ${scorer.provenance.ref} (${scorer.provenance.source}) is code that humanish loaded and ran in this process. Review it as you would any code you run.\n`);
132
132
  }
133
133
  const analysisBudget = automaticAnalysisBudget(config.review?.analysis, route);
134
- if (analysisBudget && resolveLabDryRun(config, args.options.dryRun, true) === false) {
134
+ if (analysisBudget && resolveStudyDryRun(config, args.options.dryRun, true) === false) {
135
135
  args.io.writeErr(`${formatAutomaticAnalysisBudget(analysisBudget)}\n`);
136
136
  }
137
137
  return scorer === undefined ? {} : { scorer };
@@ -147,12 +147,12 @@ export async function runLabCommand(args) {
147
147
  /**
148
148
  * The filled keys a live run prints a line for: the ones its plan reads. Count and rerun options
149
149
  * change who runs, not which keys. Undefined, so every fill is printed, when a scorer is declared,
150
- * since its host code may read any key, and when the lab does not plan.
150
+ * since its host code may read any key, and when the study does not plan.
151
151
  */
152
152
  function announcedKeyNames(config, options) {
153
153
  if (options.scorer !== undefined || config.review?.scorer !== undefined)
154
154
  return undefined;
155
- const planned = planLab(config, { cwd: options.cwd, dryRun: false });
155
+ const planned = planStudy(config, { cwd: options.cwd, dryRun: false });
156
156
  return planned.ok ? keyNamesOf(planned.planned.plan) : undefined;
157
157
  }
158
158
  /** The route's CLI setup. Undefined when the setup has already written its own result. */
@@ -170,10 +170,10 @@ function routeRunFor(route, args) {
170
170
  return sharedWorldRouteRun(args);
171
171
  default:
172
172
  // Compile-time exhaustiveness: a future route must be handled here, not silently no-op.
173
- throw new Error(`Unhandled lab route: ${String(route)}`);
173
+ throw new Error(`Unhandled study route: ${String(route)}`);
174
174
  }
175
175
  }
176
- function labRerunFlagsRequested(options) {
176
+ function studyRerunFlagsRequested(options) {
177
177
  return options.rerunFailedFrom !== undefined || options.participants !== undefined;
178
178
  }
179
179
  function writeUnsupportedRerunFlagsResult(args, route) {
@@ -184,13 +184,13 @@ function writeUnsupportedRerunFlagsResult(args, route) {
184
184
  warnings: [],
185
185
  error: {
186
186
  code: "HUMANISH_UNSUPPORTED_RERUN_FLAGS",
187
- message: `--rerun-failed-from/--participants apply only to computer-use fan-out labs; this lab resolved to the ${route} route.`,
187
+ message: `--rerun-failed-from/--participants apply only to computer-use studies with more than one participant; this study runs on the ${route} route.`,
188
188
  },
189
189
  };
190
190
  writeResult(args.command, args.io, result, formatRunHuman);
191
191
  args.io.setExitCode(2);
192
192
  }
193
- function formatLabResolveFailureHuman(result) {
193
+ function formatStudyResolveFailureHuman(result) {
194
194
  const warnings = result.warnings.map((warning) => `warning: ${warning}\n`).join("");
195
195
  return { ...(warnings ? { stdout: warnings } : {}), error: result.error };
196
196
  }
@@ -1,7 +1,7 @@
1
- import { type AdapterScorerModule } from "../../lab/adapter-scorer-loader.js";
2
- import type { LabRoute } from "../../lab/plan.js";
1
+ import { type AdapterScorerModule } from "../../study/adapter-scorer-loader.js";
2
+ import type { StudyRoute } from "../../study/plan.js";
3
3
  import type { RunScorerProvenance } from "../../run/bundle.js";
4
- import type { LabConfig } from "../../lab/types.js";
4
+ import type { StudyConfig } from "../../study/types.js";
5
5
  import type { RunResult } from "../../run/results.js";
6
6
  /** A config-declared scorer that resolved + loaded fail-closed, ready to thread into a backend. */
7
7
  export interface LoadedAdapterScorer {
@@ -16,8 +16,8 @@ export interface LoadedAdapterScorer {
16
16
  */
17
17
  export declare function maybeLoadAdapterScorer(args: {
18
18
  cwd: string;
19
- config: LabConfig;
20
- route: LabRoute;
19
+ config: StudyConfig;
20
+ route: StudyRoute;
21
21
  flag: string | undefined;
22
22
  }): Promise<{
23
23
  ok: true;
@@ -1,4 +1,4 @@
1
- import { loadAdapterScorer } from "../../lab/adapter-scorer-loader.js";
1
+ import { loadAdapterScorer } from "../../study/adapter-scorer-loader.js";
2
2
  /**
3
3
  * Resolve `review.scorer.ref` (or the `--scorer` override) to a loaded adopter scorer, fail-closed
4
4
  * (typed error) pre-spend. Precedence: CLI `--scorer` overrides the manifest; `source` records which
@@ -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 {};