humanish 0.107.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 (671) hide show
  1. package/ARCHITECTURE.md +73 -69
  2. package/CHANGELOG.md +27 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +148 -175
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-trace.js +2 -1
  14. package/dist/actors/codex/app-server-ui.js +1 -1
  15. package/dist/actors/codex/codex-admission.d.ts +91 -0
  16. package/dist/actors/codex/codex-admission.js +150 -0
  17. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  18. package/dist/actors/codex/restricted-executable.js +8 -8
  19. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  20. package/dist/actors/codex/restricted-launch.js +1 -1
  21. package/dist/actors/codex/restricted-participant.js +20 -18
  22. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  23. package/dist/actors/codex/restricted-policy.js +2 -2
  24. package/dist/actors/codex/restricted-session.d.ts +3 -3
  25. package/dist/actors/codex/restricted-session.js +10 -5
  26. package/dist/actors/computer-use/actor.d.ts +18 -18
  27. package/dist/actors/computer-use/actor.js +4 -4
  28. package/dist/actors/computer-use/admission-limit.d.ts +3 -3
  29. package/dist/actors/computer-use/admission-limit.js +4 -4
  30. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  31. package/dist/actors/computer-use/executor-error.js +3 -3
  32. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  33. package/dist/actors/computer-use/loop/actions.js +15 -15
  34. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  35. package/dist/actors/computer-use/loop/backstop.js +14 -12
  36. package/dist/actors/computer-use/loop/debrief.js +2 -2
  37. package/dist/actors/computer-use/loop/ending.d.ts +6 -6
  38. package/dist/actors/computer-use/loop/ending.js +18 -17
  39. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  40. package/dist/actors/computer-use/loop/observation.js +15 -14
  41. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  42. package/dist/actors/computer-use/loop/provider-call.js +12 -12
  43. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  44. package/dist/actors/computer-use/loop/session.js +4 -4
  45. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  46. package/dist/actors/computer-use/loop/spend.js +1 -1
  47. package/dist/actors/computer-use/loop/trace.js +11 -9
  48. package/dist/actors/computer-use/loop/types.d.ts +47 -45
  49. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  50. package/dist/actors/computer-use/loop/usage.js +2 -2
  51. package/dist/actors/computer-use/loop.d.ts +6 -1
  52. package/dist/actors/computer-use/loop.js +26 -4
  53. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  54. package/dist/actors/computer-use/openai-context.js +214 -0
  55. package/dist/actors/computer-use/openai-provider.d.ts +13 -10
  56. package/dist/actors/computer-use/openai-provider.js +52 -41
  57. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  58. package/dist/actors/computer-use/openai-requests.js +82 -15
  59. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  60. package/dist/actors/computer-use/openai-wire.js +36 -34
  61. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  62. package/dist/actors/computer-use/provider-error.js +6 -6
  63. package/dist/actors/contract.d.ts +82 -47
  64. package/dist/actors/contract.js +30 -24
  65. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  66. package/dist/actors/local-agent/claude-session.js +13 -12
  67. package/dist/actors/local-agent/cli.d.ts +9 -7
  68. package/dist/actors/local-agent/cli.js +24 -28
  69. package/dist/actors/local-agent/readiness.d.ts +2 -2
  70. package/dist/actors/local-agent/readiness.js +4 -4
  71. package/dist/actors/reasoning-effort.js +8 -8
  72. package/dist/actors/registry.d.ts +12 -12
  73. package/dist/actors/registry.js +21 -20
  74. package/dist/actors/scripted-browser/actor.d.ts +10 -10
  75. package/dist/actors/scripted-browser/actor.js +17 -17
  76. package/dist/actors/scripted-browser/browser-command.js +1 -1
  77. package/dist/actors/scripted-browser/steps.js +1 -1
  78. package/dist/actors/scripted-browser/types.d.ts +1 -1
  79. package/dist/actors/stop-conditions.d.ts +1 -1
  80. package/dist/analysis/automatic-completion.d.ts +7 -7
  81. package/dist/analysis/automatic-completion.js +1 -1
  82. package/dist/analysis/automatic-config.d.ts +6 -6
  83. package/dist/analysis/automatic-config.js +1 -1
  84. package/dist/analysis/codex-config.d.ts +6 -2
  85. package/dist/analysis/codex-config.js +22 -14
  86. package/dist/analysis/execute.d.ts +1 -1
  87. package/dist/analysis/execute.js +1 -1
  88. package/dist/analysis/service.js +5 -5
  89. package/dist/analysis/types.d.ts +6 -0
  90. package/dist/browser-control/client.js +16 -16
  91. package/dist/browser-control/dispatcher.js +4 -4
  92. package/dist/browser-control/protocol.js +14 -14
  93. package/dist/browser-control/recording-transfer.js +4 -4
  94. package/dist/browser-control/transport.js +7 -7
  95. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  96. package/dist/cli/commands/analyze.js +19 -16
  97. package/dist/cli/commands/codex.js +9 -9
  98. package/dist/cli/commands/comms.js +48 -35
  99. package/dist/cli/commands/feedback.js +20 -21
  100. package/dist/cli/commands/migrate.d.ts +4 -0
  101. package/dist/cli/commands/migrate.js +65 -0
  102. package/dist/cli/commands/observe.d.ts +0 -1
  103. package/dist/cli/commands/observe.js +136 -112
  104. package/dist/cli/commands/run-command.d.ts +10 -0
  105. package/dist/cli/commands/run-command.js +85 -0
  106. package/dist/cli/commands/runs.js +136 -139
  107. package/dist/cli/commands/setup.d.ts +2 -2
  108. package/dist/cli/commands/setup.js +27 -24
  109. package/dist/cli/commands/study-format.d.ts +9 -0
  110. package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
  111. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  112. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
  113. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  114. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  115. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  116. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
  117. package/dist/cli/commands/study-route-run.d.ts +19 -0
  118. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  119. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  120. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  121. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  122. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
  123. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  124. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  125. package/dist/cli/commands/study-run.d.ts +9 -0
  126. package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
  127. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
  128. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
  129. package/dist/cli/commands/study.d.ts +3 -0
  130. package/dist/cli/commands/study.js +146 -0
  131. package/dist/cli/commands/tui.d.ts +4 -4
  132. package/dist/cli/commands/tui.js +31 -31
  133. package/dist/cli/commands/watch.js +71 -121
  134. package/dist/cli/deprecations.d.ts +6 -0
  135. package/dist/cli/deprecations.js +18 -0
  136. package/dist/cli/doctor.d.ts +18 -8
  137. package/dist/cli/doctor.js +114 -59
  138. package/dist/cli/first-run-path.d.ts +15 -13
  139. package/dist/cli/first-run-path.js +35 -33
  140. package/dist/cli/io.d.ts +44 -9
  141. package/dist/cli/io.js +98 -23
  142. package/dist/cli/observer-follow.d.ts +3 -3
  143. package/dist/cli/observer-follow.js +6 -7
  144. package/dist/cli/orientation.d.ts +10 -7
  145. package/dist/cli/orientation.js +89 -47
  146. package/dist/cli/product-sentence.d.ts +6 -0
  147. package/dist/cli/product-sentence.js +6 -0
  148. package/dist/cli/program.d.ts +6 -1
  149. package/dist/cli/program.js +111 -43
  150. package/dist/cli/telemetry.d.ts +16 -16
  151. package/dist/cli/telemetry.js +46 -44
  152. package/dist/cli.js +1 -1
  153. package/dist/comms/capture-surface.d.ts +13 -12
  154. package/dist/comms/capture-surface.js +23 -22
  155. package/dist/comms/catch-host.d.ts +7 -7
  156. package/dist/comms/catch-host.js +17 -17
  157. package/dist/comms/connections.d.ts +1 -1
  158. package/dist/comms/connections.js +2 -2
  159. package/dist/comms/email-catch.d.ts +3 -3
  160. package/dist/comms/email-catch.js +8 -8
  161. package/dist/comms/external-evidence.d.ts +5 -5
  162. package/dist/comms/external-evidence.js +5 -4
  163. package/dist/comms/extract.js +2 -2
  164. package/dist/comms/fake-inbox.d.ts +3 -3
  165. package/dist/comms/fake-inbox.js +3 -3
  166. package/dist/comms/receiving-render.d.ts +1 -1
  167. package/dist/comms/receiving-render.js +2 -2
  168. package/dist/comms/receiving-runtime.d.ts +4 -4
  169. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  170. package/dist/comms/sandbox-catch-script.js +6 -6
  171. package/dist/comms/sandbox-catch.d.ts +38 -39
  172. package/dist/comms/sandbox-catch.js +36 -37
  173. package/dist/comms/setup.d.ts +2 -2
  174. package/dist/comms/setup.js +56 -25
  175. package/dist/comms/thread-evidence.d.ts +1 -1
  176. package/dist/comms/thread-evidence.js +6 -6
  177. package/dist/comms/types.d.ts +6 -6
  178. package/dist/comms/types.js +3 -3
  179. package/dist/evidence/frame-signature.d.ts +1 -1
  180. package/dist/evidence/frame-signature.js +4 -4
  181. package/dist/evidence/redaction.d.ts +3 -3
  182. package/dist/evidence/redaction.js +4 -4
  183. package/dist/feedback/draft.js +38 -80
  184. package/dist/feedback/export-bundle.js +1 -1
  185. package/dist/feedback/export.d.ts +5 -1
  186. package/dist/feedback/export.js +10 -10
  187. package/dist/feedback/feedback.d.ts +2 -2
  188. package/dist/feedback/feedback.js +21 -3
  189. package/dist/feedback/proof.d.ts +1 -1
  190. package/dist/feedback/proof.js +2 -2
  191. package/dist/guest/bootstrap.js +6 -6
  192. package/dist/guest/browser-tools.js +8 -8
  193. package/dist/guest/chromium-text.js +19 -19
  194. package/dist/guest/desktop-executor.d.ts +2 -2
  195. package/dist/guest/desktop-executor.js +20 -20
  196. package/dist/guest/desktop-keys.js +4 -4
  197. package/dist/guest/desktop-media.d.ts +2 -2
  198. package/dist/guest/desktop-media.js +16 -16
  199. package/dist/guest/desktop-native.d.ts +1 -1
  200. package/dist/guest/desktop-native.js +10 -10
  201. package/dist/guest/runtime-desktop.js +2 -2
  202. package/dist/guest/runtime-processes.d.ts +2 -2
  203. package/dist/guest/runtime-processes.js +2 -2
  204. package/dist/guest/runtime.js +6 -6
  205. package/dist/index.d.ts +14 -14
  206. package/dist/index.js +8 -8
  207. package/dist/keys/key-resolution.d.ts +5 -5
  208. package/dist/keys/key-resolution.js +23 -23
  209. package/dist/observer/artifact.d.ts +2 -2
  210. package/dist/observer/artifact.js +7 -7
  211. package/dist/observer/data.d.ts +6 -6
  212. package/dist/observer/data.js +5 -4
  213. package/dist/observer/exposure.d.ts +1 -1
  214. package/dist/observer/exposure.js +11 -11
  215. package/dist/observer/http.js +1 -1
  216. package/dist/observer/library.d.ts +3 -1
  217. package/dist/observer/library.js +8 -3
  218. package/dist/observer/listen.js +5 -4
  219. package/dist/observer/render.d.ts +1 -1
  220. package/dist/observer/render.js +17 -6
  221. package/dist/observer/run-routes.d.ts +4 -3
  222. package/dist/observer/run-routes.js +38 -13
  223. package/dist/observer/serve.d.ts +1 -1
  224. package/dist/observer/serve.js +7 -3
  225. package/dist/observer/tunnel.js +1 -1
  226. package/dist/observer-app.html +4 -4
  227. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  228. package/dist/routes/computer-use/bundle-parts.js +18 -17
  229. package/dist/routes/computer-use/bundle.d.ts +2 -2
  230. package/dist/routes/computer-use/bundle.js +10 -9
  231. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
  232. package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
  233. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  234. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
  235. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  236. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
  238. package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
  239. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  240. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
  241. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  242. package/dist/routes/computer-use/external-comms.js +1 -1
  243. package/dist/routes/computer-use/fanout-bundle.js +27 -26
  244. package/dist/routes/computer-use/fanout-records.js +12 -13
  245. package/dist/routes/computer-use/live-flush.d.ts +4 -4
  246. package/dist/routes/computer-use/live-flush.js +6 -6
  247. package/dist/routes/computer-use/live-phase.d.ts +5 -4
  248. package/dist/routes/computer-use/live-phase.js +8 -8
  249. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  250. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  251. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  252. package/dist/routes/computer-use/local-vm.js +3 -3
  253. package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
  254. package/dist/routes/computer-use/participant-desktop.js +5 -5
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +10 -10
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +33 -15
  259. package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
  260. package/dist/routes/computer-use/participant-prompt.js +9 -9
  261. package/dist/routes/computer-use/participant-runs.d.ts +16 -16
  262. package/dist/routes/computer-use/participant-runs.js +26 -25
  263. package/dist/routes/computer-use/plan.d.ts +12 -12
  264. package/dist/routes/computer-use/plan.js +42 -42
  265. package/dist/routes/computer-use/preflight.d.ts +5 -5
  266. package/dist/routes/computer-use/preflight.js +25 -25
  267. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  268. package/dist/routes/computer-use/rerun-selection.js +4 -3
  269. package/dist/routes/computer-use/result.d.ts +4 -4
  270. package/dist/routes/computer-use/result.js +22 -21
  271. package/dist/routes/computer-use/route.d.ts +12 -11
  272. package/dist/routes/computer-use/route.js +31 -30
  273. package/dist/routes/computer-use/self-report.d.ts +7 -7
  274. package/dist/routes/computer-use/self-report.js +32 -32
  275. package/dist/routes/computer-use/setup.d.ts +23 -23
  276. package/dist/routes/computer-use/setup.js +28 -29
  277. package/dist/routes/computer-use/single-bundle.d.ts +11 -11
  278. package/dist/routes/computer-use/single-bundle.js +40 -41
  279. package/dist/routes/computer-use/subject-projection.d.ts +4 -4
  280. package/dist/routes/computer-use/subject-projection.js +6 -6
  281. package/dist/routes/computer-use/types.d.ts +71 -73
  282. package/dist/routes/computer-use/types.js +12 -12
  283. package/dist/routes/preview.d.ts +13 -7
  284. package/dist/routes/preview.js +11 -7
  285. package/dist/routes/scripted/bundle.d.ts +7 -7
  286. package/dist/routes/scripted/bundle.js +20 -18
  287. package/dist/routes/scripted/plan.d.ts +8 -8
  288. package/dist/routes/scripted/plan.js +13 -13
  289. package/dist/routes/scripted/result.d.ts +3 -3
  290. package/dist/routes/scripted/result.js +13 -13
  291. package/dist/routes/scripted/route.d.ts +9 -9
  292. package/dist/routes/scripted/route.js +15 -16
  293. package/dist/routes/scripted/scenario.d.ts +1 -1
  294. package/dist/routes/scripted/scenario.js +5 -5
  295. package/dist/routes/scripted/setup.d.ts +6 -6
  296. package/dist/routes/scripted/setup.js +8 -8
  297. package/dist/routes/scripted/subject.d.ts +5 -5
  298. package/dist/routes/scripted/subject.js +4 -4
  299. package/dist/routes/scripted/surface-records.d.ts +1 -1
  300. package/dist/routes/scripted/surface-records.js +4 -4
  301. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  302. package/dist/routes/scripted/types.d.ts +18 -20
  303. package/dist/routes/scripted/types.js +2 -2
  304. package/dist/routes/shared-world/bundle-records.js +11 -10
  305. package/dist/routes/shared-world/bundle.d.ts +5 -5
  306. package/dist/routes/shared-world/bundle.js +46 -43
  307. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  308. package/dist/routes/shared-world/checkpoints.js +2 -2
  309. package/dist/routes/shared-world/comms.d.ts +14 -14
  310. package/dist/routes/shared-world/comms.js +19 -18
  311. package/dist/routes/shared-world/external-public.d.ts +4 -3
  312. package/dist/routes/shared-world/external-public.js +16 -12
  313. package/dist/routes/shared-world/handoff.d.ts +7 -6
  314. package/dist/routes/shared-world/handoff.js +65 -57
  315. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  316. package/dist/routes/shared-world/lobby-code.js +9 -9
  317. package/dist/routes/shared-world/participant-specs.d.ts +10 -9
  318. package/dist/routes/shared-world/participant-specs.js +38 -31
  319. package/dist/routes/shared-world/plan.d.ts +9 -9
  320. package/dist/routes/shared-world/plan.js +16 -16
  321. package/dist/routes/shared-world/provenance.d.ts +2 -2
  322. package/dist/routes/shared-world/provenance.js +2 -2
  323. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  324. package/dist/routes/shared-world/provisioned.js +18 -17
  325. package/dist/routes/shared-world/result.d.ts +6 -6
  326. package/dist/routes/shared-world/result.js +29 -29
  327. package/dist/routes/shared-world/route.d.ts +11 -11
  328. package/dist/routes/shared-world/route.js +40 -39
  329. package/dist/routes/shared-world/setup.d.ts +16 -16
  330. package/dist/routes/shared-world/setup.js +23 -23
  331. package/dist/routes/shared-world/types.d.ts +55 -53
  332. package/dist/routes/shared-world/types.js +4 -4
  333. package/dist/routes/terminal/adapter.d.ts +5 -5
  334. package/dist/routes/terminal/adapter.js +9 -9
  335. package/dist/routes/terminal/bundle.d.ts +13 -13
  336. package/dist/routes/terminal/bundle.js +28 -27
  337. package/dist/routes/terminal/credentials.d.ts +8 -8
  338. package/dist/routes/terminal/credentials.js +12 -12
  339. package/dist/routes/terminal/dry-run.d.ts +4 -4
  340. package/dist/routes/terminal/dry-run.js +12 -12
  341. package/dist/routes/terminal/encoding.js +2 -2
  342. package/dist/routes/terminal/ledger.d.ts +5 -5
  343. package/dist/routes/terminal/ledger.js +14 -14
  344. package/dist/routes/terminal/lifetime.d.ts +1 -1
  345. package/dist/routes/terminal/lifetime.js +1 -1
  346. package/dist/routes/terminal/live-finish.d.ts +2 -2
  347. package/dist/routes/terminal/live-finish.js +10 -10
  348. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  349. package/dist/routes/terminal/live-sandbox.js +15 -15
  350. package/dist/routes/terminal/participant-text.js +2 -1
  351. package/dist/routes/terminal/persona.d.ts +2 -2
  352. package/dist/routes/terminal/persona.js +3 -3
  353. package/dist/routes/terminal/plan.d.ts +7 -7
  354. package/dist/routes/terminal/plan.js +15 -15
  355. package/dist/routes/terminal/recorder.js +2 -2
  356. package/dist/routes/terminal/result.d.ts +5 -5
  357. package/dist/routes/terminal/result.js +14 -14
  358. package/dist/routes/terminal/route.d.ts +9 -9
  359. package/dist/routes/terminal/route.js +19 -20
  360. package/dist/routes/terminal/sandbox.d.ts +1 -1
  361. package/dist/routes/terminal/sandbox.js +1 -1
  362. package/dist/routes/terminal/session.d.ts +5 -5
  363. package/dist/routes/terminal/session.js +14 -13
  364. package/dist/routes/terminal/token-usage.d.ts +1 -1
  365. package/dist/routes/terminal/token-usage.js +7 -8
  366. package/dist/routes/terminal/trace.d.ts +4 -4
  367. package/dist/routes/terminal/trace.js +2 -2
  368. package/dist/routes/terminal/types.d.ts +48 -50
  369. package/dist/routes/terminal/types.js +5 -5
  370. package/dist/run/bundle-shape.js +3 -3
  371. package/dist/run/bundle.d.ts +49 -49
  372. package/dist/run/bundle.js +3 -2
  373. package/dist/run/cost-summary.js +3 -3
  374. package/dist/run/costs.d.ts +23 -0
  375. package/dist/run/costs.js +79 -44
  376. package/dist/run/detail.d.ts +6 -6
  377. package/dist/run/detail.js +4 -4
  378. package/dist/run/dry-run-inputs.d.ts +1 -1
  379. package/dist/run/dry-run-inputs.js +2 -2
  380. package/dist/run/dry-run.js +20 -20
  381. package/dist/run/judge.d.ts +19 -13
  382. package/dist/run/judge.js +18 -8
  383. package/dist/run/outcomes.d.ts +1 -1
  384. package/dist/run/participant.d.ts +1 -1
  385. package/dist/run/paths.d.ts +1 -1
  386. package/dist/run/paths.js +1 -1
  387. package/dist/run/preflight-receipts.js +1 -1
  388. package/dist/run/pricing.d.ts +11 -6
  389. package/dist/run/pricing.js +22 -15
  390. package/dist/run/projection.d.ts +46 -46
  391. package/dist/run/projection.js +57 -57
  392. package/dist/run/reclaim.d.ts +1 -1
  393. package/dist/run/reclaim.js +3 -3
  394. package/dist/run/results.d.ts +5 -5
  395. package/dist/run/run-cost.d.ts +53 -0
  396. package/dist/run/run-cost.js +105 -0
  397. package/dist/run/run-index-analysis.d.ts +15 -0
  398. package/dist/run/run-index-analysis.js +77 -0
  399. package/dist/run/run-index.d.ts +19 -7
  400. package/dist/run/run-index.js +77 -64
  401. package/dist/run/run-not-found.d.ts +5 -0
  402. package/dist/run/run-not-found.js +15 -0
  403. package/dist/run/run.d.ts +6 -5
  404. package/dist/run/run.js +3 -3
  405. package/dist/run/sandbox-receipts.d.ts +2 -2
  406. package/dist/run/sandbox-receipts.js +3 -3
  407. package/dist/run/shared-world-evidence.d.ts +37 -36
  408. package/dist/run/shared-world-evidence.js +4 -4
  409. package/dist/run/shared-world-shape.d.ts +1 -1
  410. package/dist/run/shared-world-shape.js +7 -7
  411. package/dist/run/stats.d.ts +14 -8
  412. package/dist/run/stats.js +121 -63
  413. package/dist/run/status.d.ts +16 -29
  414. package/dist/run/status.js +10 -29
  415. package/dist/run/stored-runs.js +2 -1
  416. package/dist/run/stream-shape.js +1 -1
  417. package/dist/run/streams.d.ts +7 -7
  418. package/dist/run/study-provenance.d.ts +49 -0
  419. package/dist/run/study-provenance.js +66 -0
  420. package/dist/run/study-result.d.ts +11 -0
  421. package/dist/run/study-result.js +9 -0
  422. package/dist/run/text.d.ts +2 -0
  423. package/dist/run/text.js +4 -0
  424. package/dist/run-study.d.ts +112 -0
  425. package/dist/{run-lab.js → run-study.js} +52 -47
  426. package/dist/{lab → study}/adapter-extension.d.ts +15 -27
  427. package/dist/{lab → study}/adapter-extension.js +10 -45
  428. package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
  429. package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
  430. package/dist/study/composition-rules.d.ts +7 -0
  431. package/dist/{lab → study}/composition-rules.js +53 -53
  432. package/dist/study/config.d.ts +15 -0
  433. package/dist/{lab → study}/config.js +98 -41
  434. package/dist/study/convert.d.ts +33 -0
  435. package/dist/study/convert.js +432 -0
  436. package/dist/{lab → study}/device-presets.d.ts +10 -10
  437. package/dist/{lab → study}/device-presets.js +11 -11
  438. package/dist/study/discover.d.ts +75 -0
  439. package/dist/{lab → study}/discover.js +134 -95
  440. package/dist/{lab → study}/doctor.d.ts +19 -12
  441. package/dist/{lab → study}/doctor.js +58 -20
  442. package/dist/study/field-paths.d.ts +12 -0
  443. package/dist/study/field-paths.js +126 -0
  444. package/dist/study/files.d.ts +26 -0
  445. package/dist/study/files.js +44 -0
  446. package/dist/{lab → study}/init-templates.d.ts +2 -2
  447. package/dist/study/init-templates.js +421 -0
  448. package/dist/{lab → study}/init.d.ts +2 -2
  449. package/dist/{lab → study}/init.js +46 -11
  450. package/dist/study/keys.d.ts +4 -0
  451. package/dist/{lab → study}/keys.js +46 -12
  452. package/dist/study/migrate.d.ts +48 -0
  453. package/dist/study/migrate.js +408 -0
  454. package/dist/study/owned-files.d.ts +38 -0
  455. package/dist/study/owned-files.js +182 -0
  456. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  457. package/dist/{lab → study}/parse/actors.js +14 -14
  458. package/dist/study/parse/comms.d.ts +12 -0
  459. package/dist/{lab → study}/parse/comms.js +5 -5
  460. package/dist/study/parse/execution.d.ts +19 -0
  461. package/dist/{lab → study}/parse/execution.js +13 -13
  462. package/dist/study/parse/study-v3.d.ts +21 -0
  463. package/dist/study/parse/study-v3.js +259 -0
  464. package/dist/study/parse/subject-state.d.ts +30 -0
  465. package/dist/{lab → study}/parse/subject-state.js +19 -19
  466. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  467. package/dist/{lab → study}/parse/subject.js +34 -34
  468. package/dist/{lab → study}/parse/values.d.ts +3 -3
  469. package/dist/{lab → study}/parse/values.js +3 -3
  470. package/dist/{lab → study}/persona-resolve.d.ts +8 -8
  471. package/dist/{lab → study}/persona-resolve.js +6 -6
  472. package/dist/{lab → study}/plan-base.d.ts +7 -7
  473. package/dist/{lab → study}/plan-base.js +1 -1
  474. package/dist/{lab → study}/plan-participants.d.ts +12 -12
  475. package/dist/{lab → study}/plan-participants.js +4 -4
  476. package/dist/{lab → study}/plan-types.d.ts +31 -31
  477. package/dist/{lab → study}/plan-types.js +2 -2
  478. package/dist/study/plan.d.ts +13 -0
  479. package/dist/study/plan.js +101 -0
  480. package/dist/study/preflight-probes.d.ts +3 -0
  481. package/dist/{lab → study}/preflight-probes.js +20 -19
  482. package/dist/study/preflight-result.d.ts +8 -0
  483. package/dist/{lab → study}/preflight-result.js +5 -4
  484. package/dist/study/preflight.d.ts +94 -0
  485. package/dist/{lab → study}/preflight.js +12 -12
  486. package/dist/{lab → study}/requirements.d.ts +3 -3
  487. package/dist/{lab → study}/requirements.js +1 -1
  488. package/dist/study/route-inputs.d.ts +28 -0
  489. package/dist/{lab → study}/route-inputs.js +1 -1
  490. package/dist/{lab → study}/routing.d.ts +39 -33
  491. package/dist/{lab → study}/routing.js +60 -29
  492. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
  493. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
  494. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
  495. package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
  496. package/dist/study/run-study-options.d.ts +28 -0
  497. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
  498. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
  499. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  500. package/dist/{lab → study}/summary.d.ts +16 -15
  501. package/dist/{lab → study}/summary.js +21 -21
  502. package/dist/{lab → study}/tasks.d.ts +18 -18
  503. package/dist/{lab → study}/tasks.js +14 -14
  504. package/dist/{lab → study}/types.d.ts +202 -196
  505. package/dist/{lab → study}/types.js +3 -1
  506. package/dist/{lab → study}/validation.d.ts +27 -27
  507. package/dist/{lab → study}/validation.js +53 -51
  508. package/dist/study/warnings.d.ts +12 -0
  509. package/dist/{lab → study}/warnings.js +62 -34
  510. package/dist/subject/clone.d.ts +7 -7
  511. package/dist/subject/clone.js +2 -2
  512. package/dist/subject/desktop-cli.d.ts +1 -1
  513. package/dist/subject/desktop-cli.js +2 -2
  514. package/dist/subject/local-tree-archive.d.ts +2 -2
  515. package/dist/subject/local-tree-archive.js +4 -4
  516. package/dist/subject/local-tree.d.ts +4 -4
  517. package/dist/subject/node-bootstrap.js +1 -1
  518. package/dist/subject/runtime.js +9 -10
  519. package/dist/subject/serve.d.ts +5 -5
  520. package/dist/subject/serve.js +3 -3
  521. package/dist/subject/state.d.ts +4 -4
  522. package/dist/subject/state.js +1 -1
  523. package/dist/subject/steps.d.ts +6 -6
  524. package/dist/subject/steps.js +5 -5
  525. package/dist/substrates/command-failure.d.ts +3 -3
  526. package/dist/substrates/command-failure.js +3 -3
  527. package/dist/substrates/desktop-session.js +2 -2
  528. package/dist/substrates/detached.d.ts +6 -6
  529. package/dist/substrates/detached.js +7 -7
  530. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  531. package/dist/substrates/e2b/cdp-probe.js +14 -17
  532. package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
  533. package/dist/substrates/e2b/desktop-browser.js +9 -9
  534. package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
  535. package/dist/substrates/e2b/desktop-cdp.js +9 -9
  536. package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
  537. package/dist/substrates/e2b/desktop-executor.js +13 -13
  538. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  539. package/dist/substrates/e2b/desktop-geometry.js +8 -8
  540. package/dist/substrates/e2b/desktop-media.d.ts +4 -4
  541. package/dist/substrates/e2b/desktop-media.js +1 -1
  542. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  543. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  544. package/dist/substrates/e2b/lifetime.js +1 -1
  545. package/dist/substrates/e2b/sandbox.d.ts +4 -4
  546. package/dist/substrates/e2b/sandbox.js +2 -2
  547. package/dist/substrates/e2b/sdk.d.ts +12 -12
  548. package/dist/substrates/e2b/sdk.js +7 -7
  549. package/dist/substrates/local/runtime-config.d.ts +4 -4
  550. package/dist/substrates/local/runtime-config.js +4 -4
  551. package/dist/tui/actions.d.ts +1 -1
  552. package/dist/tui/actions.js +13 -13
  553. package/dist/tui/contract.d.ts +23 -23
  554. package/dist/tui/contract.js +11 -11
  555. package/dist/tui/launch.d.ts +7 -7
  556. package/dist/tui/launch.js +36 -31
  557. package/dist/tui/project.js +5 -5
  558. package/dist/tui-app.js +139 -139
  559. package/dist/verify/actor.d.ts +8 -8
  560. package/dist/verify/actor.js +36 -36
  561. package/dist/verify/artifacts.d.ts +2 -2
  562. package/dist/verify/artifacts.js +3 -3
  563. package/dist/verify/context-growth.d.ts +9 -0
  564. package/dist/verify/context-growth.js +62 -0
  565. package/dist/verify/costs.d.ts +6 -6
  566. package/dist/verify/costs.js +8 -8
  567. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  568. package/dist/verify/shared-world-concurrent.js +79 -76
  569. package/dist/verify/shared-world.d.ts +2 -2
  570. package/dist/verify/shared-world.js +16 -16
  571. package/dist/verify/subject.d.ts +5 -5
  572. package/dist/verify/subject.js +19 -19
  573. package/dist/verify/verify.js +94 -44
  574. package/docs/README.md +25 -32
  575. package/docs/architecture/actor-contract.md +60 -91
  576. package/docs/architecture/browser-control.md +1 -1
  577. package/docs/architecture/desktop-sessions.md +7 -7
  578. package/docs/architecture/external-public-shared-world.md +68 -65
  579. package/docs/architecture/github-feedback-loop.md +2 -5
  580. package/docs/architecture/guest-desktop.md +2 -2
  581. package/docs/architecture/observer.md +34 -34
  582. package/docs/architecture/restricted-codex-analysis.md +34 -28
  583. package/docs/architecture/serve.md +34 -37
  584. package/docs/architecture/state-driven-executor.md +55 -58
  585. package/docs/architecture/task-protocol-support.md +6 -6
  586. package/docs/architecture/terminal-product-route.md +70 -110
  587. package/docs/contracts/README.md +24 -0
  588. package/docs/contracts/adapter-admission.md +3 -3
  589. package/docs/contracts/adapter-fixtures.md +4 -7
  590. package/docs/contracts/core.md +1 -3
  591. package/docs/contracts/errors.md +62 -0
  592. package/docs/contracts/feedback.md +8 -9
  593. package/docs/contracts/policy.md +7 -12
  594. package/docs/contracts/run-bundle.md +42 -44
  595. package/docs/contracts/schemas.md +446 -368
  596. package/docs/contracts/study-analysis.md +7 -4
  597. package/docs/contracts/study-costs.md +28 -9
  598. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  599. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  600. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  601. package/docs/principles/actor-fidelity.md +4 -4
  602. package/docs/principles/engineering.md +3 -3
  603. package/docs/principles/invariants-and-defaults.md +38 -38
  604. package/docs/principles/self-driving-harness.md +1 -5
  605. package/docs/principles/three-roles.md +1 -1
  606. package/docs/product/automatic-analysis.md +7 -7
  607. package/examples/README.md +1 -1
  608. package/examples/participant/README.md +5 -5
  609. package/examples/participant/run.mjs +11 -10
  610. package/examples/scorer/README.md +3 -3
  611. package/examples/scorer/run.mjs +11 -12
  612. package/examples/scorer/scorer.mjs +3 -3
  613. package/package.json +16 -17
  614. package/skills/humanish/SKILL.md +64 -60
  615. package/skills/humanish/agents/openai.yaml +1 -1
  616. package/AGENTS.md +0 -99
  617. package/CONTRIBUTING.md +0 -148
  618. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  619. package/dist/actors/codex/qualified-versions.js +0 -132
  620. package/dist/cli/commands/lab-format.d.ts +0 -8
  621. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  622. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  623. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  624. package/dist/cli/commands/lab-run.d.ts +0 -9
  625. package/dist/cli/commands/lab.d.ts +0 -3
  626. package/dist/cli/commands/lab.js +0 -199
  627. package/dist/cli/renamed-options.d.ts +0 -11
  628. package/dist/cli/renamed-options.js +0 -18
  629. package/dist/lab/composition-rules.d.ts +0 -7
  630. package/dist/lab/config.d.ts +0 -7
  631. package/dist/lab/discover.d.ts +0 -65
  632. package/dist/lab/init-templates.js +0 -416
  633. package/dist/lab/keys.d.ts +0 -2
  634. package/dist/lab/parse/comms.d.ts +0 -12
  635. package/dist/lab/parse/execution.d.ts +0 -19
  636. package/dist/lab/parse/subject-state.d.ts +0 -30
  637. package/dist/lab/plan.d.ts +0 -19
  638. package/dist/lab/plan.js +0 -132
  639. package/dist/lab/preflight-probes.d.ts +0 -3
  640. package/dist/lab/preflight-result.d.ts +0 -7
  641. package/dist/lab/preflight.d.ts +0 -92
  642. package/dist/lab/route-inputs.d.ts +0 -28
  643. package/dist/lab/run-lab-options.d.ts +0 -28
  644. package/dist/lab/warnings.d.ts +0 -2
  645. package/dist/observer/static.d.ts +0 -39
  646. package/dist/observer/static.js +0 -369
  647. package/dist/run-lab.d.ts +0 -112
  648. package/docs/architecture/comms-inbox.md +0 -122
  649. package/docs/architecture/desktop-recording.md +0 -80
  650. package/docs/architecture/local-browser-runtime.md +0 -178
  651. package/docs/architecture/observer-review.md +0 -144
  652. package/docs/architecture/participant-media.md +0 -90
  653. package/docs/architecture/project-layout.md +0 -62
  654. package/docs/architecture/real-email-receiving.md +0 -136
  655. package/docs/assets/humanish-drawdb-hero.png +0 -0
  656. package/docs/assets/humanish-observer-hero.png +0 -0
  657. package/docs/goals/current.md +0 -207
  658. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  659. package/docs/product/open-source-install-experience.md +0 -240
  660. package/docs/ramp/README.md +0 -295
  661. package/docs/release/open-source-readiness.md +0 -222
  662. package/docs/release/public-readiness-standard.md +0 -210
  663. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  664. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  665. /package/dist/{lab → study}/init-paths.js +0 -0
  666. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  667. /package/dist/{lab → study}/init-plan.js +0 -0
  668. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  669. /package/dist/{lab → study}/participant-assignment.js +0 -0
  670. /package/dist/{lab → study}/persona.d.ts +0 -0
  671. /package/dist/{lab → study}/persona.js +0 -0
@@ -2,44 +2,45 @@ 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";
6
- import { planLab, resolveLabDryRun } from "../../lab/plan.js";
7
- import { keyNamesOf } from "../../lab/requirements.js";
8
- import { routeOf } from "../../lab/plan.js";
9
- import { computerUseRouteRun } from "./lab-route-computer-use.js";
10
- import { runRoute } from "./lab-route-run.js";
11
- import { scriptedRouteRun } from "./lab-route-scripted.js";
12
- import { sharedWorldRouteRun } from "./lab-route-shared-world.js";
13
- import { previewRouteRun } from "./lab-route-preview.js";
14
- import { terminalRouteRun } from "./lab-route-terminal.js";
15
- import { maybeLoadAdapterScorer } from "./lab-scorer.js";
5
+ import { resolveStudyManifest } from "../../study/discover.js";
6
+ import { warnAndQueue } from "../deprecations.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";
16
17
  import { discoverCliKeys, formatRunHuman, noteRunFacts, writeResult, } from "../io.js";
17
18
  import { watchExposeRequested } from "../observer-follow.js";
18
19
  import { beginRunSignalPhase } from "./run-signals.js";
19
20
  import { WATCH_SAFE_NOT_APPLICABLE_MESSAGE } from "../../observer/exposure.js";
20
- export async function runLabCommand(args) {
21
- 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);
22
23
  if (!resolved.ok) {
23
- writeResult(args.command, args.io, resolved, formatLabResolveFailureHuman);
24
+ writeResult(args.command, args.io, resolved, formatStudyResolveFailureHuman);
24
25
  args.io.setExitCode(2);
25
26
  return;
26
27
  }
27
28
  // Surface forward-declared-field + .yml warnings on run/watch too, not only on inspect.
28
29
  // Otherwise a setting that does nothing is silently swallowed on the path users actually run.
29
- for (const warning of resolved.warnings) {
30
- args.io.writeErr(`warning: ${warning}\n`);
31
- }
30
+ // Each also goes into the JSON result's warnings[], so a --json caller sees it.
31
+ for (const warning of resolved.warnings)
32
+ warnAndQueue(args.command, args.io, warning);
32
33
  const config = resolved.config;
33
- // The run's identity (#455): which manifest, where it lives, and whether it is committed, a
34
- // local overlay, or an explicit path. Resolved once here — the only place that knows all three —
35
- // and carried into the run's status record and bundle so the filesystem can answer "which lab
34
+ // The run's identity: which manifest, where it lives, and whether it is committed, a
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 study
36
37
  // produced this run" without the old `persona.source = "lab:<id>"` string convention.
37
- const lab = { id: config.id, path: resolved.path, origin: resolved.origin };
38
- // Named here, once, for every route: a preview or terminal result carries no labId, so the
39
- // starter lab `first-run` went unnamed in telemetry while the computer-use ones were named.
40
- 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 }));
41
42
  const route = routeOf(config);
42
- if (route !== "computer-use" && labRerunFlagsRequested(args.options)) {
43
+ if (route !== "computer-use" && studyRerunFlagsRequested(args.options)) {
43
44
  writeUnsupportedRerunFlagsResult(args, route);
44
45
  return;
45
46
  }
@@ -53,7 +54,7 @@ export async function runLabCommand(args) {
53
54
  warnings: [],
54
55
  error: {
55
56
  code: "HUMANISH_WATCH_OPTION_CONFLICT",
56
- 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.`,
57
58
  },
58
59
  };
59
60
  writeResult(args.command, args.io, result, formatRunHuman);
@@ -80,8 +81,8 @@ export async function runLabCommand(args) {
80
81
  // Only a live run reads provider keys, so a dry run looks none up: no `gh auth token`, no e2b
81
82
  // login, overlay or key store. A live run fills every key it finds and prints a line only for
82
83
  // the keys its plan reads. This comes after the option refusals above, which read no key, and
83
- // before the route's CLI setup and prepareLab, which do.
84
- 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) {
85
86
  const announced = announcedKeyNames(config, args.options);
86
87
  await discoverCliKeys({
87
88
  io: args.io,
@@ -89,19 +90,19 @@ export async function runLabCommand(args) {
89
90
  ...(announced === undefined ? {} : { announced }),
90
91
  });
91
92
  }
92
- // 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
93
94
  // checks (keys, runtime auth, subject env, the local agent, caps) refuse this machine, all before
94
95
  // the scorer loads, so none imports the scorer's host code. The scripted route's checks and the
95
96
  // run-id claim still come after it; the scripted route takes no scorer.
96
97
  const routeRun = routeRunFor(route, { ...args, config });
97
98
  if (routeRun === undefined)
98
99
  return;
99
- // Every route's runLab options carry the lab's provenance, from here only.
100
- 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 } };
101
102
  // From here a signal marks the run interrupted and reclaims its sandboxes (run-signals.ts).
102
103
  const signals = beginRunSignalPhase(args.io);
103
104
  try {
104
- // #316: resolve + load a config-declared/CLI-flagged adopter scorer FAIL-CLOSED, before any
105
+ // Resolve + load a config-declared/CLI-flagged adopter scorer fail-closed, before any
105
106
  // spend, and only for a plan that will run. A declared gate that cannot load (bad ref, not
106
107
  // found, load failure, no hooks, unsupported route) aborts with exit 2 rather than green-passing.
107
108
  await runRoute(config, run, async () => {
@@ -125,12 +126,12 @@ export async function runLabCommand(args) {
125
126
  }
126
127
  const scorer = scorerLoad.scorer;
127
128
  if (scorer) {
128
- // 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.
129
130
  // Surface it so the invoker (who may not be the manifest author) knows executable code ran.
130
- args.io.writeErr(`warning: review scorer ${scorer.provenance.ref} (${scorer.provenance.source}) is executable host code loaded and run in-process — review it as code, not config.\n`);
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`);
131
132
  }
132
133
  const analysisBudget = automaticAnalysisBudget(config.review?.analysis, route);
133
- if (analysisBudget && resolveLabDryRun(config, args.options.dryRun, true) === false) {
134
+ if (analysisBudget && resolveStudyDryRun(config, args.options.dryRun, true) === false) {
134
135
  args.io.writeErr(`${formatAutomaticAnalysisBudget(analysisBudget)}\n`);
135
136
  }
136
137
  return scorer === undefined ? {} : { scorer };
@@ -146,12 +147,12 @@ export async function runLabCommand(args) {
146
147
  /**
147
148
  * The filled keys a live run prints a line for: the ones its plan reads. Count and rerun options
148
149
  * change who runs, not which keys. Undefined, so every fill is printed, when a scorer is declared,
149
- * 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.
150
151
  */
151
152
  function announcedKeyNames(config, options) {
152
153
  if (options.scorer !== undefined || config.review?.scorer !== undefined)
153
154
  return undefined;
154
- const planned = planLab(config, { cwd: options.cwd, dryRun: false });
155
+ const planned = planStudy(config, { cwd: options.cwd, dryRun: false });
155
156
  return planned.ok ? keyNamesOf(planned.planned.plan) : undefined;
156
157
  }
157
158
  /** The route's CLI setup. Undefined when the setup has already written its own result. */
@@ -169,10 +170,10 @@ function routeRunFor(route, args) {
169
170
  return sharedWorldRouteRun(args);
170
171
  default:
171
172
  // Compile-time exhaustiveness: a future route must be handled here, not silently no-op.
172
- throw new Error(`Unhandled lab route: ${String(route)}`);
173
+ throw new Error(`Unhandled study route: ${String(route)}`);
173
174
  }
174
175
  }
175
- function labRerunFlagsRequested(options) {
176
+ function studyRerunFlagsRequested(options) {
176
177
  return options.rerunFailedFrom !== undefined || options.participants !== undefined;
177
178
  }
178
179
  function writeUnsupportedRerunFlagsResult(args, route) {
@@ -183,15 +184,13 @@ function writeUnsupportedRerunFlagsResult(args, route) {
183
184
  warnings: [],
184
185
  error: {
185
186
  code: "HUMANISH_UNSUPPORTED_RERUN_FLAGS",
186
- 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.`,
187
188
  },
188
189
  };
189
190
  writeResult(args.command, args.io, result, formatRunHuman);
190
191
  args.io.setExitCode(2);
191
192
  }
192
- function formatLabResolveFailureHuman(result) {
193
- return ([
194
- `${result.error.code}: ${result.error.message}`,
195
- ...result.warnings.map((warning) => `warning: ${warning}`),
196
- ].join("\n") + "\n");
193
+ function formatStudyResolveFailureHuman(result) {
194
+ const warnings = result.warnings.map((warning) => `warning: ${warning}\n`).join("");
195
+ return { ...(warnings ? { stdout: warnings } : {}), error: result.error };
197
196
  }
@@ -1,23 +1,23 @@
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
- /** A CONFIG-DECLARED scorer that resolved + loaded fail-closed, ready to thread into a backend. */
6
+ /** A config-declared scorer that resolved + loaded fail-closed, ready to thread into a backend. */
7
7
  export interface LoadedAdapterScorer {
8
8
  hooks: AdapterScorerModule;
9
9
  provenance: RunScorerProvenance;
10
10
  }
11
11
  /**
12
12
  * Resolve `review.scorer.ref` (or the `--scorer` override) to a loaded adopter scorer, fail-closed
13
- * (typed error) PRE-SPEND. Precedence: CLI `--scorer` overrides the manifest; `source` records which
13
+ * (typed error) pre-spend. Precedence: CLI `--scorer` overrides the manifest; `source` records which
14
14
  * won. No scorer declared → `{ ok: true }` with no scorer. A declared scorer on an unsupported
15
15
  * backend, or a bad/unreadable/broken ref, → `{ ok: false }` so the caller aborts with exit 2.
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,7 +1,7 @@
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
- * (typed error) PRE-SPEND. Precedence: CLI `--scorer` overrides the manifest; `source` records which
4
+ * (typed error) pre-spend. Precedence: CLI `--scorer` overrides the manifest; `source` records which
5
5
  * won. No scorer declared → `{ ok: true }` with no scorer. A declared scorer on an unsupported
6
6
  * backend, or a bad/unreadable/broken ref, → `{ ok: false }` so the caller aborts with exit 2.
7
7
  */
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ import { type CliIo } from "../io.js";
3
+ export declare function registerStudyCommands(parent: Command, io: CliIo): void;
@@ -0,0 +1,146 @@
1
+ import { formatAutomaticAnalysisBudget } from "../../analysis/automatic-config.js";
2
+ import { resolve } from "node:path";
3
+ import { Command, Option } from "commander";
4
+ import { inspectStudyManifest, listStudyManifests } from "../../study/discover.js";
5
+ import { runStudyPreflight, } from "../../study/preflight.js";
6
+ import { applyEnvFileOption, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, parsePositiveInteger, writeResult, humanError, } from "../io.js";
7
+ export function registerStudyCommands(parent, io) {
8
+ const study = parent
9
+ .command("study")
10
+ .description("List, show and check studies in humanish/studies/.");
11
+ listCommand(study.command("list"), io);
12
+ showCommand(study.command("show"), io);
13
+ checkCommand(study.command("check"), io);
14
+ }
15
+ function listCommand(command, io) {
16
+ command
17
+ .description("List the studies in this project, committed and local.")
18
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
19
+ .option("--json", JSON_OPTION_DESCRIPTION)
20
+ .action((options, command) => handleStudyList(io, options, command));
21
+ }
22
+ function showCommand(command, io) {
23
+ command
24
+ .argument("<study>", "Study id or .yaml path.")
25
+ .description("Show a study's parsed file and its warnings without running it.")
26
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
27
+ .option("--json", JSON_OPTION_DESCRIPTION)
28
+ .action((name, options, command) => handleStudyShow(io, name, options, command));
29
+ }
30
+ function checkCommand(command, io) {
31
+ command
32
+ .argument("<study>", "Study id or .yaml path.")
33
+ .description("Check the study file and, with --reachability, its named endpoints. humanish doctor --study <study> checks this machine.")
34
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
35
+ .addOption(new Option("--reachability <mode>", "Reachability mode.")
36
+ .choices(["metadata", "public-preview", "sandbox-loopback", "prepared-host"])
37
+ .default("metadata"))
38
+ .option("--timeout-ms <ms>", "Target reachability timeout.", String(30_000))
39
+ .option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
40
+ .option("--json", JSON_OPTION_DESCRIPTION)
41
+ .action((name, options, command) => handleStudyCheck(io, name, options, command));
42
+ }
43
+ async function handleStudyList(io, options, command) {
44
+ const result = await listStudyManifests(options.cwd);
45
+ writeResult(command, io, result, formatStudyListHuman);
46
+ io.setExitCode(0);
47
+ }
48
+ async function handleStudyShow(io, name, options, command) {
49
+ const result = await inspectStudyManifest(options.cwd, name);
50
+ writeResult(command, io, result, formatStudyShowHuman);
51
+ io.setExitCode(result.ok ? 0 : 2);
52
+ }
53
+ async function handleStudyCheck(io, name, options, command) {
54
+ if (!(await applyEnvFileOption({
55
+ command,
56
+ cwd: options.cwd,
57
+ envFile: options.envFile,
58
+ io,
59
+ }))) {
60
+ return;
61
+ }
62
+ const timeoutMs = parsePositiveInteger(options.timeoutMs);
63
+ if (timeoutMs === null) {
64
+ const result = {
65
+ schema: "humanish.study-check.v1",
66
+ ok: false,
67
+ cwd: resolve(options.cwd),
68
+ study: name,
69
+ reachability: options.reachability,
70
+ checks: [{ name: "timeout", ok: false, message: "--timeout-ms must be a positive integer." }],
71
+ targets: [],
72
+ sandbox: { created: false },
73
+ spend: { e2bDesktop: false, model: false },
74
+ warnings: [],
75
+ error: {
76
+ code: "HUMANISH_STUDY_PREFLIGHT_INVALID_OPTION",
77
+ message: "--timeout-ms must be a positive integer.",
78
+ },
79
+ };
80
+ writeResult(command, io, result, formatStudyCheckHuman);
81
+ io.setExitCode(2);
82
+ return;
83
+ }
84
+ const result = await runStudyPreflight({
85
+ cwd: options.cwd,
86
+ study: name,
87
+ reachability: options.reachability,
88
+ timeoutMs,
89
+ });
90
+ writeResult(command, io, result, formatStudyCheckHuman);
91
+ io.setExitCode(result.ok ? 0 : 2);
92
+ }
93
+ function formatStudyListHuman(result) {
94
+ if (result.studies.length === 0) {
95
+ return ([
96
+ `No studies found in ${result.cwd}`,
97
+ "Create one under humanish/studies/*.yaml, or pass a .yaml path.",
98
+ ...result.warnings.map((warning) => `warning: ${warning}`),
99
+ ].join("\n") + "\n");
100
+ }
101
+ return ([
102
+ "humanish studies",
103
+ ...result.studies.map((study) => `- ${study.id} ${study.source} ${study.origin} ${study.path}${study.title ? ` (${study.title})` : ""}`),
104
+ ...result.warnings.map((warning) => `warning: ${warning}`),
105
+ ].join("\n") + "\n");
106
+ }
107
+ function formatStudyShowHuman(result) {
108
+ if (!result.ok || !result.config)
109
+ return humanError(result.error);
110
+ const config = result.config;
111
+ return ([
112
+ "humanish study",
113
+ `id: ${config.id}`,
114
+ `subject: ${config.subject.source}`,
115
+ ...(config.execution?.target ? [`execution: ${config.execution.target}`] : []),
116
+ `actors: ${config.actors.map((actor) => actor.type).join(", ")}`,
117
+ ...(config.title ? [`title: ${config.title}`] : []),
118
+ ...(config.description ? [`description: ${config.description}`] : []),
119
+ ...(result.path ? [`path: ${result.path}`] : []),
120
+ ...(result.origin ? [`origin: ${result.origin}`] : []),
121
+ ...(config.subject.repos?.length ? [`repos: ${config.subject.repos.join(", ")}`] : []),
122
+ ...(result.personas ?? []).map((persona) => `persona ${persona.id}: ${persona.brief ? `authored context (before runtime additions)\n${persona.brief.text}` : "unresolved; id only"}`),
123
+ ...result.warnings.map((warning) => `warning: ${warning}`),
124
+ ].join("\n") + "\n");
125
+ }
126
+ function formatStudyCheckHuman(result) {
127
+ const checkedTargets = result.targets.filter((target) => target.checked);
128
+ const reachableTargets = checkedTargets.filter((target) => target.reachable === true);
129
+ const blockedTargets = result.targets.filter((target) => target.status === "blocked");
130
+ const stdout = [
131
+ `humanish study check ${result.ok ? "passed" : "failed"}`,
132
+ `study: ${result.studyId ?? result.study}`,
133
+ ...(result.route ? [`route: ${result.route}`] : []),
134
+ `reachability: ${result.reachability}`,
135
+ `targets: ${checkedTargets.length ? `${reachableTargets.length}/${checkedTargets.length} reachable` : `${result.targets.length} declared, not checked`}`,
136
+ ...(blockedTargets.length ? [`blocked-targets: ${blockedTargets.length}`] : []),
137
+ `spend: ${result.spend.e2bDesktop ? "one e2b desktop, no model calls" : "none"}`,
138
+ ...(result.analysis ? [formatAutomaticAnalysisBudget(result.analysis)] : []),
139
+ ...(result.sandbox.created
140
+ ? [`sandbox: created=yes killed=${result.sandbox.killed === true ? "yes" : "no"}`]
141
+ : []),
142
+ ...result.checks.map((check) => `- ${check.ok ? "ok" : "fail"} ${check.name}: ${check.message}`),
143
+ ...result.warnings.map((warning) => `warning: ${warning}`),
144
+ ].join("\n") + "\n";
145
+ return result.error === undefined ? stdout : { stdout, error: result.error };
146
+ }
@@ -5,7 +5,7 @@ import { type TuiModule } from "../../tui/contract.js";
5
5
  import { type CliIo } from "../io.js";
6
6
  /**
7
7
  * The pieces of the outside world the `tui` command touches. Injectable for the same reason
8
- * `keyDiscovery` is: the refusals ARE the behavior worth testing, and a test cannot make a real
8
+ * `keyDiscovery` is: the refusals are the behavior worth testing, and a test cannot make a real
9
9
  * TTY, an old Node, or a missing bundle appear.
10
10
  */
11
11
  export interface TuiRuntime {
@@ -21,12 +21,12 @@ export interface TuiRuntime {
21
21
  }
22
22
  export declare const defaultTuiRuntime: TuiRuntime;
23
23
  /**
24
- * The stakeholder surface (#455). Every other command is written so an agent can drive it; this one
25
- * is the opposite — it takes the screen and waits for a person.
24
+ * The stakeholder surface. Every other command is written so an agent can drive it; this one
25
+ * is the opposite: it takes the screen and waits for a person.
26
26
  *
27
27
  * That inversion is why it refuses rather than degrades. An agent that runs `humanish tui` with a
28
28
  * piped stdout has asked for something that cannot exist, and the useful answer is a structured
29
- * error naming the command that WOULD have answered the question. A TUI that quietly rendered
29
+ * error naming the command that would have answered the question. A TUI that quietly rendered
30
30
  * frames into a pipe would poison a transcript with escape codes and look like a hang.
31
31
  */
32
32
  export declare function registerTuiCommand(parent: Command, io: CliIo, runtime?: TuiRuntime): void;
@@ -4,22 +4,22 @@ 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";
19
19
  import { launchRun, readLaunchLogTail } from "../../tui/launch.js";
20
20
  import { TUI_MIN_NODE_MAJOR, nodeSupportsTui, TUI_BUNDLE_URL, } from "../../tui/contract.js";
21
21
  import { detectAgentSession } from "../../actors/agent-session.js";
22
- import { applyEnvFileOption, CLI_VERSION, JSON_OPTION_DESCRIPTION, markInvocationEnvelopeWritten, wantsJson, } from "../io.js";
22
+ import { applyEnvFileOption, CLI_VERSION, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, markInvocationEnvelopeWritten, wantsJson, } from "../io.js";
23
23
  export const defaultTuiRuntime = {
24
24
  checkComms: checkCommsConnection,
25
25
  promptSecret,
@@ -45,21 +45,21 @@ function refuseTui(command, io, refusal) {
45
45
  io.setExitCode(2);
46
46
  }
47
47
  /**
48
- * The stakeholder surface (#455). Every other command is written so an agent can drive it; this one
49
- * is the opposite — it takes the screen and waits for a person.
48
+ * The stakeholder surface. Every other command is written so an agent can drive it; this one
49
+ * is the opposite: it takes the screen and waits for a person.
50
50
  *
51
51
  * That inversion is why it refuses rather than degrades. An agent that runs `humanish tui` with a
52
52
  * piped stdout has asked for something that cannot exist, and the useful answer is a structured
53
- * error naming the command that WOULD have answered the question. A TUI that quietly rendered
53
+ * error naming the command that would have answered the question. A TUI that quietly rendered
54
54
  * frames into a pipe would poison a transcript with escape codes and look like a hang.
55
55
  */
56
56
  export function registerTuiCommand(parent, io, runtime = defaultTuiRuntime) {
57
57
  parent
58
58
  .command("tui")
59
- .description("Open the interactive terminal surface for browsing labs and runs (humans only).")
60
- .summary("Human terminal for labs and runs; refuses detected agent sessions and non-TTY input/output. Agents: humanish lab list --json, humanish lab inspect <lab> --json, humanish runs --json.")
61
- .option("--cwd <path>", "Target project directory.", ".")
62
- .option("--env-file <path>", "Load a local env file for this terminal session and its runs without printing values.")
59
+ .description("Browse studies and runs in an interactive terminal UI. It refuses detected agent sessions and non-TTY input or output; agents use humanish study list --json, humanish study show <study> --json and humanish runs --json.")
60
+ .summary("Browse studies and runs in a terminal UI for people.")
61
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
62
+ .option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
63
63
  .option("--force", "Open it anyway in a session that looks like an agent's.")
64
64
  .option("--json", JSON_OPTION_DESCRIPTION)
65
65
  .action((options, command) => handleTui(io, runtime, options, command));
@@ -70,7 +70,7 @@ async function handleTui(io, runtime, options, command) {
70
70
  refuseTui(command, io, refusal);
71
71
  return;
72
72
  }
73
- // The Ink app ships as a pre-built bundle beside the compiled CLI and is loaded ONLY here, so
73
+ // The Ink app ships as a pre-built bundle beside the compiled CLI and is loaded only here, so
74
74
  // no agent-facing command pays its parse cost.
75
75
  const bundle = TUI_BUNDLE_URL;
76
76
  const loaded = await runtime.loadTui(bundle);
@@ -80,7 +80,7 @@ async function handleTui(io, runtime, options, command) {
80
80
  ok: false,
81
81
  error: {
82
82
  code: "HUMANISH_TUI_BUNDLE_MISSING",
83
- message: `The terminal surface bundle is missing at ${bundle.pathname}. In a checkout, run \`pnpm build\`; in an install, this package is incomplete — please report it.`,
83
+ message: `The terminal surface bundle is missing at ${bundle.pathname}. In a checkout, run \`pnpm build\`; an installed package always ships it, so please report this as a bug.`,
84
84
  },
85
85
  });
86
86
  return;
@@ -102,12 +102,12 @@ async function handleTui(io, runtime, options, command) {
102
102
  }
103
103
  /** The refusal for a session the surface cannot serve, or undefined when it may open. */
104
104
  function checkTuiSession(runtime, force) {
105
- // An agent runner, even with a real terminal. `codex exec` allocates a PTY for the commands
106
- // it runs, so the TTY check below passes and the surface used to open: a study watched an
107
- // agent navigate the labs list and start a run it did not mean to start
108
- // (humanish/labs/handed-a-human-surface.yaml). A TTY says a terminal exists, not that anyone is
109
- // reading it. `--force` is the escape for the person who really is at this keyboard —
110
- // capturing frames from inside an agent session is exactly that case.
105
+ // An agent runner, even with a real terminal. `codex exec` allocates a PTY for the commands it
106
+ // runs, so the TTY check below passes for an agent too, and an agent in the surface can start a
107
+ // run it did not mean to start (humanish/studies/handed-a-human-surface.yaml records one). A TTY
108
+ // says a terminal exists, not that anyone is reading it. `--force` is the escape for the person
109
+ // who really is at this keyboard, and capturing frames from inside an agent session is exactly
110
+ // that case.
111
111
  const agent = force ? undefined : detectAgentSession(runtime.env);
112
112
  if (agent !== undefined) {
113
113
  return {
@@ -117,8 +117,8 @@ function checkTuiSession(runtime, force) {
117
117
  code: "HUMANISH_TUI_AGENT_SESSION",
118
118
  message: `humanish tui is a surface for a person, and ${agent.marker} says this session belongs to ${agent.runner}. ` +
119
119
  "It renders frames of escape codes into a transcript, and its keys can start runs. " +
120
- "`humanish runs --json` lists runs, `humanish lab list --json` lists the labs in this project, " +
121
- "and `humanish lab run <lab> --json` starts one. If you are a person at this keyboard, add --force.",
120
+ "`humanish runs --json` lists runs, `humanish study list --json` lists the studies in this project, " +
121
+ "and `humanish run <study> --json` starts one. If you are a person at this keyboard, add --force.",
122
122
  },
123
123
  };
124
124
  }
@@ -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 lab run --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)).labs.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),
@@ -259,7 +259,7 @@ function tuiCapabilities(session) {
259
259
  ? {
260
260
  schema: TUI_ACTION_SCHEMA,
261
261
  ok: true,
262
- message: `set up humanish here — ${result.changes.filter((change) => change.action !== "skip").length} files written`,
262
+ message: `set up humanish here: ${result.changes.filter((change) => change.action !== "skip").length} files written`,
263
263
  }
264
264
  : {
265
265
  schema: TUI_ACTION_SCHEMA,