humanish 0.106.1 → 0.108.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 (668) hide show
  1. package/ARCHITECTURE.md +38 -32
  2. package/CHANGELOG.md +28 -0
  3. package/CONTEXT.md +51 -41
  4. package/README.md +152 -174
  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-client.js +2 -1
  14. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  15. package/dist/actors/codex/app-server-trace.js +1 -3
  16. package/dist/actors/codex/app-server-ui.js +1 -1
  17. package/dist/actors/codex/app-server.js +2 -1
  18. package/dist/actors/codex/codex-admission.d.ts +91 -0
  19. package/dist/actors/codex/codex-admission.js +150 -0
  20. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  21. package/dist/actors/codex/protocol-compat.js +357 -0
  22. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  23. package/dist/actors/codex/protocol-contract.js +471 -0
  24. package/dist/actors/codex/restricted-executable.d.ts +28 -4
  25. package/dist/actors/codex/restricted-executable.js +104 -29
  26. package/dist/actors/codex/restricted-launch.d.ts +9 -2
  27. package/dist/actors/codex/restricted-launch.js +43 -4
  28. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  29. package/dist/actors/codex/restricted-notifications.js +277 -0
  30. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  31. package/dist/actors/codex/restricted-participant.js +66 -6
  32. package/dist/actors/codex/restricted-policy.d.ts +11 -3
  33. package/dist/actors/codex/restricted-policy.js +2 -2
  34. package/dist/actors/codex/restricted-session.d.ts +16 -3
  35. package/dist/actors/codex/restricted-session.js +60 -22
  36. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  37. package/dist/actors/codex/restricted-transport.js +139 -27
  38. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  39. package/dist/actors/codex/restricted-turn.js +43 -30
  40. package/dist/actors/computer-use/actor.d.ts +17 -17
  41. package/dist/actors/computer-use/actor.js +6 -6
  42. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  43. package/dist/actors/computer-use/admission-limit.js +1 -1
  44. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  45. package/dist/actors/computer-use/loop/actions.js +10 -10
  46. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  47. package/dist/actors/computer-use/loop/backstop.js +15 -13
  48. package/dist/actors/computer-use/loop/ending.d.ts +7 -7
  49. package/dist/actors/computer-use/loop/ending.js +9 -9
  50. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  51. package/dist/actors/computer-use/loop/observation.js +9 -9
  52. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  53. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  54. package/dist/actors/computer-use/loop/session.js +3 -3
  55. package/dist/actors/computer-use/loop/spend.d.ts +2 -2
  56. package/dist/actors/computer-use/loop/spend.js +4 -4
  57. package/dist/actors/computer-use/loop/trace.js +11 -10
  58. package/dist/actors/computer-use/loop/types.d.ts +37 -26
  59. package/dist/actors/computer-use/loop/usage.js +2 -2
  60. package/dist/actors/computer-use/loop.js +4 -4
  61. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  62. package/dist/actors/computer-use/openai-context.js +214 -0
  63. package/dist/actors/computer-use/openai-provider.d.ts +12 -9
  64. package/dist/actors/computer-use/openai-provider.js +47 -36
  65. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  66. package/dist/actors/computer-use/openai-requests.js +82 -15
  67. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  68. package/dist/actors/computer-use/openai-wire.js +36 -34
  69. package/dist/actors/contract.d.ts +86 -49
  70. package/dist/actors/contract.js +29 -23
  71. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  72. package/dist/actors/local-agent/claude-session.js +10 -9
  73. package/dist/actors/local-agent/cli.d.ts +8 -6
  74. package/dist/actors/local-agent/cli.js +24 -28
  75. package/dist/actors/local-agent/readiness.d.ts +2 -2
  76. package/dist/actors/local-agent/readiness.js +4 -4
  77. package/dist/actors/reasoning-effort.js +6 -6
  78. package/dist/actors/registry.d.ts +10 -10
  79. package/dist/actors/registry.js +18 -17
  80. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  81. package/dist/actors/scripted-browser/actor.js +16 -16
  82. package/dist/actors/scripted-browser/browser-command.js +1 -1
  83. package/dist/actors/scripted-browser/journey.js +15 -4
  84. package/dist/actors/scripted-browser/steps.js +19 -1
  85. package/dist/actors/scripted-browser/types.d.ts +12 -2
  86. package/dist/actors/stop-conditions.d.ts +1 -1
  87. package/dist/actors/stop-conditions.js +1 -3
  88. package/dist/analysis/automatic-completion.d.ts +13 -8
  89. package/dist/analysis/automatic-completion.js +14 -8
  90. package/dist/analysis/automatic-config.d.ts +1 -1
  91. package/dist/analysis/automatic-config.js +2 -2
  92. package/dist/analysis/automatic.d.ts +10 -4
  93. package/dist/analysis/automatic.js +17 -13
  94. package/dist/analysis/codex-config.d.ts +6 -2
  95. package/dist/analysis/codex-config.js +22 -14
  96. package/dist/analysis/diagnostics.d.ts +23 -0
  97. package/dist/analysis/diagnostics.js +112 -0
  98. package/dist/analysis/evidence-sources.js +2 -2
  99. package/dist/analysis/evidence.js +6 -6
  100. package/dist/analysis/execute.d.ts +7 -1
  101. package/dist/analysis/execute.js +39 -12
  102. package/dist/analysis/job.d.ts +8 -5
  103. package/dist/analysis/job.js +15 -14
  104. package/dist/analysis/load.d.ts +1 -1
  105. package/dist/analysis/load.js +5 -5
  106. package/dist/analysis/provider.d.ts +9 -1
  107. package/dist/analysis/restricted-codex.d.ts +2 -0
  108. package/dist/analysis/restricted-codex.js +10 -1
  109. package/dist/analysis/service.d.ts +2 -0
  110. package/dist/analysis/service.js +35 -16
  111. package/dist/analysis/sharing.d.ts +2 -2
  112. package/dist/analysis/sharing.js +5 -5
  113. package/dist/analysis/store-executions.d.ts +5 -5
  114. package/dist/analysis/store-executions.js +12 -12
  115. package/dist/analysis/store.d.ts +4 -4
  116. package/dist/analysis/store.js +13 -13
  117. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  118. package/dist/cli/commands/analysis-signals.js +4 -1
  119. package/dist/cli/commands/analyze.js +23 -18
  120. package/dist/cli/commands/codex.js +9 -9
  121. package/dist/cli/commands/comms.js +62 -34
  122. package/dist/cli/commands/feedback.js +20 -21
  123. package/dist/cli/commands/lab-format.d.ts +5 -4
  124. package/dist/cli/commands/lab-format.js +35 -23
  125. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  126. package/dist/cli/commands/lab-route-computer-use.js +32 -21
  127. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  128. package/dist/cli/commands/lab-route-preview.js +7 -7
  129. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  130. package/dist/cli/commands/lab-route-run.js +6 -2
  131. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  132. package/dist/cli/commands/lab-route-scripted.js +0 -1
  133. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  134. package/dist/cli/commands/lab-route-shared-world.js +3 -4
  135. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  136. package/dist/cli/commands/lab-route-terminal.js +0 -1
  137. package/dist/cli/commands/lab-run.js +84 -54
  138. package/dist/cli/commands/lab-scorer.d.ts +2 -4
  139. package/dist/cli/commands/lab-scorer.js +1 -1
  140. package/dist/cli/commands/migrate.d.ts +4 -0
  141. package/dist/cli/commands/migrate.js +65 -0
  142. package/dist/cli/commands/observe.js +168 -107
  143. package/dist/cli/commands/run-command.d.ts +10 -0
  144. package/dist/cli/commands/run-command.js +85 -0
  145. package/dist/cli/commands/run-signals.d.ts +30 -0
  146. package/dist/cli/commands/run-signals.js +146 -0
  147. package/dist/cli/commands/runs.js +137 -136
  148. package/dist/cli/commands/setup.d.ts +2 -2
  149. package/dist/cli/commands/setup.js +26 -21
  150. package/dist/cli/commands/study.d.ts +3 -0
  151. package/dist/cli/commands/study.js +182 -0
  152. package/dist/cli/commands/tui.d.ts +4 -4
  153. package/dist/cli/commands/tui.js +21 -21
  154. package/dist/cli/commands/watch.js +64 -77
  155. package/dist/cli/deprecations.d.ts +18 -0
  156. package/dist/cli/deprecations.js +48 -0
  157. package/dist/cli/doctor.d.ts +18 -5
  158. package/dist/cli/doctor.js +111 -48
  159. package/dist/cli/first-run-path.d.ts +12 -10
  160. package/dist/cli/first-run-path.js +30 -28
  161. package/dist/cli/io.d.ts +46 -10
  162. package/dist/cli/io.js +109 -30
  163. package/dist/cli/observer-follow.d.ts +2 -2
  164. package/dist/cli/observer-follow.js +5 -6
  165. package/dist/cli/orientation.d.ts +6 -3
  166. package/dist/cli/orientation.js +43 -39
  167. package/dist/cli/product-sentence.d.ts +6 -0
  168. package/dist/cli/product-sentence.js +6 -0
  169. package/dist/cli/program.d.ts +6 -1
  170. package/dist/cli/program.js +112 -43
  171. package/dist/cli/telemetry.d.ts +17 -17
  172. package/dist/cli/telemetry.js +49 -41
  173. package/dist/cli.js +1 -1
  174. package/dist/comms/capture-surface.d.ts +14 -13
  175. package/dist/comms/capture-surface.js +23 -22
  176. package/dist/comms/catch-host.d.ts +8 -8
  177. package/dist/comms/catch-host.js +14 -14
  178. package/dist/comms/connections.js +4 -4
  179. package/dist/comms/email-catch.d.ts +3 -3
  180. package/dist/comms/email-catch.js +8 -8
  181. package/dist/comms/external-evidence.d.ts +27 -0
  182. package/dist/comms/external-evidence.js +93 -0
  183. package/dist/comms/extract.js +2 -2
  184. package/dist/comms/fake-inbox.d.ts +2 -2
  185. package/dist/comms/fake-inbox.js +2 -2
  186. package/dist/comms/lease-store.js +7 -7
  187. package/dist/comms/receiving-render.d.ts +1 -1
  188. package/dist/comms/receiving-render.js +2 -2
  189. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  190. package/dist/comms/sandbox-catch-script.js +6 -6
  191. package/dist/comms/sandbox-catch.d.ts +36 -37
  192. package/dist/comms/sandbox-catch.js +34 -35
  193. package/dist/comms/setup.js +42 -8
  194. package/dist/comms/thread-evidence.d.ts +1 -1
  195. package/dist/comms/thread-evidence.js +6 -6
  196. package/dist/comms/types.d.ts +6 -6
  197. package/dist/comms/types.js +4 -4
  198. package/dist/evidence/browser-hygiene.d.ts +1 -1
  199. package/dist/evidence/browser-hygiene.js +1 -1
  200. package/dist/evidence/frame-signature.d.ts +1 -1
  201. package/dist/evidence/frame-signature.js +4 -4
  202. package/dist/evidence/redaction.d.ts +3 -3
  203. package/dist/evidence/redaction.js +5 -5
  204. package/dist/evidence/secret-scrub.d.ts +9 -0
  205. package/dist/evidence/secret-scrub.js +96 -0
  206. package/dist/feedback/draft.js +41 -85
  207. package/dist/feedback/export-bundle.js +5 -5
  208. package/dist/feedback/export.d.ts +5 -1
  209. package/dist/feedback/export.js +16 -17
  210. package/dist/feedback/feedback.d.ts +3 -3
  211. package/dist/feedback/feedback.js +21 -3
  212. package/dist/guest/chromium-text.js +2 -2
  213. package/dist/guest/desktop-native.d.ts +1 -1
  214. package/dist/guest/runtime.js +1 -1
  215. package/dist/index.d.ts +14 -15
  216. package/dist/index.js +10 -11
  217. package/dist/keys/key-resolution.d.ts +7 -5
  218. package/dist/keys/key-resolution.js +40 -38
  219. package/dist/lab/adapter-extension.d.ts +35 -13
  220. package/dist/lab/adapter-extension.js +50 -134
  221. package/dist/lab/adapter-scorer-loader.d.ts +32 -12
  222. package/dist/lab/adapter-scorer-loader.js +56 -32
  223. package/dist/lab/composition-rules.js +58 -58
  224. package/dist/lab/config.js +85 -43
  225. package/dist/lab/deprecated-fields.d.ts +10 -0
  226. package/dist/lab/deprecated-fields.js +24 -0
  227. package/dist/lab/device-presets.d.ts +10 -10
  228. package/dist/lab/device-presets.js +11 -11
  229. package/dist/lab/discover.d.ts +13 -9
  230. package/dist/lab/discover.js +118 -60
  231. package/dist/lab/doctor.d.ts +53 -11
  232. package/dist/lab/doctor.js +193 -47
  233. package/dist/lab/init-plan.js +1 -3
  234. package/dist/lab/init-templates.js +147 -147
  235. package/dist/lab/init.d.ts +1 -1
  236. package/dist/lab/init.js +41 -9
  237. package/dist/lab/keys.d.ts +2 -0
  238. package/dist/lab/keys.js +43 -9
  239. package/dist/lab/lab-deps.d.ts +80 -0
  240. package/dist/lab/lab-deps.js +4 -0
  241. package/dist/lab/parse/actors.js +17 -16
  242. package/dist/lab/parse/comms.js +8 -7
  243. package/dist/lab/parse/execution.js +15 -14
  244. package/dist/lab/parse/study-v3.d.ts +23 -0
  245. package/dist/lab/parse/study-v3.js +259 -0
  246. package/dist/lab/parse/subject-state.d.ts +7 -7
  247. package/dist/lab/parse/subject-state.js +18 -17
  248. package/dist/lab/parse/subject.js +30 -29
  249. package/dist/lab/parse/values.d.ts +1 -2
  250. package/dist/lab/parse/values.js +3 -6
  251. package/dist/lab/persona-resolve.d.ts +7 -7
  252. package/dist/lab/persona-resolve.js +8 -8
  253. package/dist/lab/persona.js +1 -3
  254. package/dist/lab/plan-base.d.ts +0 -2
  255. package/dist/lab/plan-base.js +6 -4
  256. package/dist/lab/plan-participants.d.ts +7 -7
  257. package/dist/lab/plan-participants.js +2 -2
  258. package/dist/lab/plan-types.d.ts +26 -8
  259. package/dist/lab/plan.d.ts +4 -18
  260. package/dist/lab/plan.js +24 -79
  261. package/dist/lab/preflight-probes.js +11 -11
  262. package/dist/lab/preflight-result.d.ts +2 -1
  263. package/dist/lab/preflight-result.js +5 -6
  264. package/dist/lab/preflight.d.ts +7 -8
  265. package/dist/lab/preflight.js +6 -6
  266. package/dist/lab/requirements.d.ts +20 -0
  267. package/dist/lab/requirements.js +54 -0
  268. package/dist/lab/route-inputs.d.ts +23 -12
  269. package/dist/lab/route-inputs.js +48 -51
  270. package/dist/lab/routing.d.ts +42 -41
  271. package/dist/lab/routing.js +66 -68
  272. package/dist/lab/run-lab-events.d.ts +3 -11
  273. package/dist/lab/run-lab-events.js +2 -16
  274. package/dist/lab/run-lab-homes.d.ts +76 -0
  275. package/dist/lab/run-lab-homes.js +7 -0
  276. package/dist/lab/run-lab-options.d.ts +12 -66
  277. package/dist/lab/run-lab-options.js +58 -285
  278. package/dist/lab/summary.d.ts +15 -9
  279. package/dist/lab/summary.js +24 -17
  280. package/dist/lab/tasks.d.ts +15 -15
  281. package/dist/lab/tasks.js +14 -14
  282. package/dist/lab/types.d.ts +201 -195
  283. package/dist/lab/types.js +2 -0
  284. package/dist/lab/validation.d.ts +21 -21
  285. package/dist/lab/validation.js +61 -59
  286. package/dist/lab/warnings.d.ts +10 -0
  287. package/dist/lab/warnings.js +70 -41
  288. package/dist/library-aliases.d.ts +56 -0
  289. package/dist/library-aliases.js +22 -0
  290. package/dist/observer/artifact.d.ts +2 -2
  291. package/dist/observer/artifact.js +9 -9
  292. package/dist/observer/data.d.ts +6 -6
  293. package/dist/observer/data.js +7 -6
  294. package/dist/observer/exposure.d.ts +1 -1
  295. package/dist/observer/exposure.js +11 -11
  296. package/dist/observer/http.js +1 -1
  297. package/dist/observer/library.d.ts +1 -1
  298. package/dist/observer/library.js +4 -2
  299. package/dist/observer/listen.js +5 -4
  300. package/dist/observer/render.d.ts +1 -1
  301. package/dist/observer/render.js +12 -7
  302. package/dist/observer/run-routes.d.ts +4 -4
  303. package/dist/observer/run-routes.js +6 -6
  304. package/dist/observer/serve.d.ts +17 -0
  305. package/dist/observer/serve.js +41 -6
  306. package/dist/observer/tunnel.js +1 -1
  307. package/dist/observer-app.html +4 -4
  308. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  309. package/dist/routes/computer-use/bundle-parts.js +24 -17
  310. package/dist/routes/computer-use/bundle.d.ts +4 -11
  311. package/dist/routes/computer-use/bundle.js +12 -18
  312. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  313. package/dist/routes/computer-use/diagnostics.js +1 -1
  314. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
  315. package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
  316. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  317. package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
  318. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
  319. package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
  320. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  321. package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
  322. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  323. package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
  324. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  325. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  326. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  327. package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
  328. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  329. package/dist/routes/computer-use/external-comms.js +19 -43
  330. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  331. package/dist/routes/computer-use/fanout-bundle.js +38 -42
  332. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
  333. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  334. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  335. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  336. package/dist/routes/computer-use/live-flush.js +20 -28
  337. package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
  338. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
  339. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  340. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  341. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  342. package/dist/routes/computer-use/local-vm.js +40 -67
  343. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  344. package/dist/routes/computer-use/participant-desktop.js +5 -25
  345. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
  346. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
  347. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  348. package/dist/routes/computer-use/participant-facts.js +12 -1
  349. package/dist/routes/computer-use/participant-model.d.ts +25 -11
  350. package/dist/routes/computer-use/participant-model.js +76 -34
  351. package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
  352. package/dist/routes/computer-use/participant-prompt.js +8 -8
  353. package/dist/routes/computer-use/participant-runs.d.ts +11 -11
  354. package/dist/routes/computer-use/participant-runs.js +18 -18
  355. package/dist/routes/computer-use/plan.d.ts +21 -29
  356. package/dist/routes/computer-use/plan.js +70 -78
  357. package/dist/routes/computer-use/preflight.d.ts +3 -5
  358. package/dist/routes/computer-use/preflight.js +40 -36
  359. package/dist/routes/computer-use/rerun-selection.js +11 -7
  360. package/dist/routes/computer-use/result.d.ts +1 -1
  361. package/dist/routes/computer-use/result.js +48 -38
  362. package/dist/routes/computer-use/route.d.ts +5 -5
  363. package/dist/routes/computer-use/route.js +36 -33
  364. package/dist/routes/computer-use/self-report.d.ts +8 -8
  365. package/dist/routes/computer-use/self-report.js +33 -33
  366. package/dist/routes/computer-use/setup.d.ts +9 -15
  367. package/dist/routes/computer-use/setup.js +106 -83
  368. package/dist/routes/computer-use/single-bundle.d.ts +13 -16
  369. package/dist/routes/computer-use/single-bundle.js +46 -53
  370. package/dist/routes/computer-use/subject-projection.d.ts +6 -8
  371. package/dist/routes/computer-use/subject-projection.js +24 -23
  372. package/dist/routes/computer-use/types.d.ts +195 -238
  373. package/dist/routes/computer-use/types.js +21 -13
  374. package/dist/routes/preview.d.ts +8 -2
  375. package/dist/routes/preview.js +8 -5
  376. package/dist/routes/scripted/bundle.d.ts +5 -8
  377. package/dist/routes/scripted/bundle.js +23 -27
  378. package/dist/routes/scripted/plan.d.ts +6 -8
  379. package/dist/routes/scripted/plan.js +15 -13
  380. package/dist/routes/scripted/result.d.ts +4 -1
  381. package/dist/routes/scripted/result.js +15 -11
  382. package/dist/routes/scripted/route.js +15 -17
  383. package/dist/routes/scripted/scenario.d.ts +1 -1
  384. package/dist/routes/scripted/scenario.js +3 -3
  385. package/dist/routes/scripted/setup.d.ts +3 -2
  386. package/dist/routes/scripted/setup.js +27 -26
  387. package/dist/routes/scripted/subject.d.ts +8 -3
  388. package/dist/routes/scripted/subject.js +10 -6
  389. package/dist/routes/scripted/surface-records.js +4 -4
  390. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  391. package/dist/routes/scripted/surface-sessions.js +4 -4
  392. package/dist/routes/scripted/types.d.ts +21 -40
  393. package/dist/routes/scripted/types.js +2 -3
  394. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
  395. package/dist/routes/shared-world/bundle.d.ts +7 -7
  396. package/dist/routes/shared-world/bundle.js +60 -62
  397. package/dist/routes/shared-world/checkpoints.d.ts +5 -5
  398. package/dist/routes/shared-world/checkpoints.js +5 -5
  399. package/dist/routes/shared-world/comms.d.ts +8 -7
  400. package/dist/routes/shared-world/comms.js +38 -51
  401. package/dist/routes/shared-world/external-public.d.ts +6 -5
  402. package/dist/routes/shared-world/external-public.js +28 -25
  403. package/dist/routes/shared-world/handoff.d.ts +10 -9
  404. package/dist/routes/shared-world/handoff.js +89 -81
  405. package/dist/routes/shared-world/lobby-code.d.ts +7 -7
  406. package/dist/routes/shared-world/lobby-code.js +22 -22
  407. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
  408. package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
  409. package/dist/routes/shared-world/plan.d.ts +2 -6
  410. package/dist/routes/shared-world/plan.js +8 -9
  411. package/dist/routes/shared-world/provenance.d.ts +4 -4
  412. package/dist/routes/shared-world/provenance.js +4 -4
  413. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  414. package/dist/routes/shared-world/provisioned.js +55 -48
  415. package/dist/routes/shared-world/result.js +47 -36
  416. package/dist/routes/shared-world/route.js +54 -57
  417. package/dist/routes/shared-world/setup.d.ts +6 -5
  418. package/dist/routes/shared-world/setup.js +16 -18
  419. package/dist/routes/shared-world/types.d.ts +70 -141
  420. package/dist/routes/shared-world/types.js +5 -5
  421. package/dist/routes/terminal/adapter.d.ts +10 -10
  422. package/dist/routes/terminal/adapter.js +32 -129
  423. package/dist/routes/terminal/bundle.d.ts +10 -15
  424. package/dist/routes/terminal/bundle.js +43 -52
  425. package/dist/routes/terminal/credentials.d.ts +4 -4
  426. package/dist/routes/terminal/credentials.js +20 -20
  427. package/dist/routes/terminal/dry-run.d.ts +1 -1
  428. package/dist/routes/terminal/dry-run.js +13 -15
  429. package/dist/routes/terminal/encoding.d.ts +1 -1
  430. package/dist/routes/terminal/encoding.js +4 -4
  431. package/dist/routes/terminal/ledger.d.ts +8 -8
  432. package/dist/routes/terminal/ledger.js +22 -22
  433. package/dist/routes/terminal/live-finish.d.ts +1 -2
  434. package/dist/routes/terminal/live-finish.js +24 -23
  435. package/dist/routes/terminal/live-sandbox.d.ts +3 -2
  436. package/dist/routes/terminal/live-sandbox.js +31 -32
  437. package/dist/routes/terminal/participant-text.d.ts +23 -0
  438. package/dist/routes/terminal/participant-text.js +165 -0
  439. package/dist/routes/terminal/persona.js +1 -1
  440. package/dist/routes/terminal/plan.d.ts +2 -6
  441. package/dist/routes/terminal/plan.js +23 -19
  442. package/dist/routes/terminal/recorder.d.ts +6 -1
  443. package/dist/routes/terminal/recorder.js +12 -4
  444. package/dist/routes/terminal/result.js +12 -12
  445. package/dist/routes/terminal/route.js +30 -31
  446. package/dist/routes/terminal/runtime.d.ts +3 -2
  447. package/dist/routes/terminal/runtime.js +3 -3
  448. package/dist/routes/terminal/sandbox.d.ts +4 -4
  449. package/dist/routes/terminal/sandbox.js +10 -10
  450. package/dist/routes/terminal/session.js +22 -19
  451. package/dist/routes/terminal/token-usage.d.ts +1 -1
  452. package/dist/routes/terminal/token-usage.js +10 -11
  453. package/dist/routes/terminal/trace.d.ts +7 -10
  454. package/dist/routes/terminal/trace.js +11 -66
  455. package/dist/routes/terminal/types.d.ts +104 -114
  456. package/dist/routes/terminal/types.js +12 -7
  457. package/dist/run/active-runs.d.ts +13 -0
  458. package/dist/run/active-runs.js +12 -0
  459. package/dist/run/bundle-shape.d.ts +2 -1
  460. package/dist/run/bundle-shape.js +7 -7
  461. package/dist/run/bundle.d.ts +99 -92
  462. package/dist/run/bundle.js +10 -8
  463. package/dist/run/cost-summary.js +6 -5
  464. package/dist/run/costs.d.ts +6 -6
  465. package/dist/run/costs.js +17 -11
  466. package/dist/run/detail.d.ts +9 -9
  467. package/dist/run/detail.js +10 -10
  468. package/dist/run/dry-run-inputs.js +1 -1
  469. package/dist/run/dry-run.js +23 -30
  470. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  471. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  472. package/dist/run/feedback-shape.js +1 -1
  473. package/dist/run/judge.d.ts +34 -16
  474. package/dist/run/judge.js +41 -14
  475. package/dist/run/locate.d.ts +2 -0
  476. package/dist/run/locate.js +3 -1
  477. package/dist/run/outcomes.d.ts +3 -3
  478. package/dist/run/outcomes.js +3 -3
  479. package/dist/run/participant-records.d.ts +2 -2
  480. package/dist/run/participant-records.js +2 -2
  481. package/dist/run/paths.d.ts +1 -1
  482. package/dist/run/paths.js +2 -2
  483. package/dist/run/pricing.d.ts +30 -15
  484. package/dist/run/pricing.js +49 -30
  485. package/dist/run/projection.d.ts +27 -27
  486. package/dist/run/projection.js +23 -23
  487. package/dist/run/reclaim.d.ts +6 -0
  488. package/dist/run/reclaim.js +15 -5
  489. package/dist/run/results.d.ts +5 -5
  490. package/dist/run/run-index.d.ts +9 -7
  491. package/dist/run/run-index.js +24 -25
  492. package/dist/run/run-not-found.d.ts +5 -0
  493. package/dist/run/run-not-found.js +15 -0
  494. package/dist/run/run.d.ts +7 -4
  495. package/dist/run/run.js +10 -6
  496. package/dist/run/sandbox-receipts.d.ts +5 -5
  497. package/dist/run/sandbox-receipts.js +6 -6
  498. package/dist/run/shared-world-evidence.d.ts +67 -66
  499. package/dist/run/shared-world-evidence.js +4 -4
  500. package/dist/run/shared-world-shape.d.ts +3 -3
  501. package/dist/run/shared-world-shape.js +16 -16
  502. package/dist/run/stats.d.ts +17 -11
  503. package/dist/run/stats.js +124 -66
  504. package/dist/run/status.d.ts +21 -32
  505. package/dist/run/status.js +34 -33
  506. package/dist/run/stored-runs.js +2 -1
  507. package/dist/run/stream-shape.js +1 -1
  508. package/dist/run/streams.d.ts +29 -22
  509. package/dist/run/study-provenance.d.ts +47 -0
  510. package/dist/run/study-provenance.js +63 -0
  511. package/dist/run/study-result.d.ts +16 -0
  512. package/dist/run/study-result.js +9 -0
  513. package/dist/run/terminal-contract.d.ts +5 -5
  514. package/dist/run/terminal-contract.js +4 -4
  515. package/dist/run/text.d.ts +2 -0
  516. package/dist/run/text.js +4 -0
  517. package/dist/run/transient-comms-secrets.d.ts +5 -0
  518. package/dist/run/transient-comms-secrets.js +12 -0
  519. package/dist/run-lab.d.ts +40 -38
  520. package/dist/run-lab.js +42 -40
  521. package/dist/study/convert.d.ts +33 -0
  522. package/dist/study/convert.js +432 -0
  523. package/dist/study/field-paths.d.ts +12 -0
  524. package/dist/study/field-paths.js +126 -0
  525. package/dist/study/files.d.ts +26 -0
  526. package/dist/study/files.js +43 -0
  527. package/dist/study/migrate.d.ts +48 -0
  528. package/dist/study/migrate.js +408 -0
  529. package/dist/study/owned-files.d.ts +38 -0
  530. package/dist/study/owned-files.js +182 -0
  531. package/dist/subject/clone.d.ts +1 -1
  532. package/dist/subject/desktop-cli.d.ts +2 -2
  533. package/dist/subject/desktop-cli.js +3 -3
  534. package/dist/subject/local-tree-archive.d.ts +1 -1
  535. package/dist/subject/local-tree-archive.js +5 -5
  536. package/dist/subject/local-tree.d.ts +3 -3
  537. package/dist/subject/local-tree.js +1 -1
  538. package/dist/subject/node-bootstrap.d.ts +1 -1
  539. package/dist/subject/node-bootstrap.js +4 -4
  540. package/dist/subject/runtime.js +10 -11
  541. package/dist/subject/serve.d.ts +1 -1
  542. package/dist/subject/serve.js +4 -4
  543. package/dist/subject/state.d.ts +1 -1
  544. package/dist/subject/steps.d.ts +8 -8
  545. package/dist/subject/steps.js +7 -7
  546. package/dist/substrates/command-failure.d.ts +3 -3
  547. package/dist/substrates/command-failure.js +3 -3
  548. package/dist/substrates/detached.d.ts +6 -6
  549. package/dist/substrates/detached.js +7 -7
  550. package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
  551. package/dist/substrates/e2b/cdp-probe.js +15 -18
  552. package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
  553. package/dist/substrates/e2b/desktop-browser.js +12 -12
  554. package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
  555. package/dist/substrates/e2b/desktop-cdp.js +11 -11
  556. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  557. package/dist/substrates/e2b/desktop-executor.js +1 -1
  558. package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
  559. package/dist/substrates/e2b/desktop-geometry.js +9 -9
  560. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  561. package/dist/substrates/e2b/desktop-media.js +3 -3
  562. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  563. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  564. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  565. package/dist/substrates/e2b/sandbox.js +2 -2
  566. package/dist/substrates/e2b/sdk.d.ts +11 -11
  567. package/dist/substrates/e2b/sdk.js +8 -8
  568. package/dist/substrates/local/runtime-host.d.ts +2 -0
  569. package/dist/substrates/local/runtime-host.js +6 -0
  570. package/dist/tui/actions.d.ts +8 -6
  571. package/dist/tui/actions.js +31 -22
  572. package/dist/tui/contract.d.ts +16 -16
  573. package/dist/tui/contract.js +10 -10
  574. package/dist/tui/launch.d.ts +4 -4
  575. package/dist/tui/launch.js +18 -19
  576. package/dist/tui/project.js +5 -5
  577. package/dist/tui-app.js +83 -83
  578. package/dist/verify/actor.d.ts +14 -14
  579. package/dist/verify/actor.js +45 -45
  580. package/dist/verify/artifacts.d.ts +3 -3
  581. package/dist/verify/artifacts.js +6 -6
  582. package/dist/verify/context-growth.d.ts +9 -0
  583. package/dist/verify/context-growth.js +62 -0
  584. package/dist/verify/costs.d.ts +7 -7
  585. package/dist/verify/costs.js +9 -9
  586. package/dist/verify/liveness.d.ts +1 -1
  587. package/dist/verify/liveness.js +4 -1
  588. package/dist/verify/rerun.d.ts +1 -1
  589. package/dist/verify/rerun.js +1 -1
  590. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  591. package/dist/verify/shared-world-concurrent.js +79 -76
  592. package/dist/verify/shared-world.d.ts +2 -2
  593. package/dist/verify/shared-world.js +18 -18
  594. package/dist/verify/subject.d.ts +4 -4
  595. package/dist/verify/subject.js +18 -18
  596. package/dist/verify/verify.js +98 -49
  597. package/docs/README.md +26 -33
  598. package/docs/architecture/actor-contract.md +105 -98
  599. package/docs/architecture/desktop-sessions.md +14 -14
  600. package/docs/architecture/external-public-shared-world.md +66 -59
  601. package/docs/architecture/github-feedback-loop.md +1 -4
  602. package/docs/architecture/guest-desktop.md +2 -2
  603. package/docs/architecture/observer.md +37 -37
  604. package/docs/architecture/restricted-codex-analysis.md +70 -30
  605. package/docs/architecture/serve.md +34 -37
  606. package/docs/architecture/state-driven-executor.md +55 -59
  607. package/docs/architecture/task-protocol-support.md +7 -9
  608. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
  609. package/docs/contracts/README.md +24 -0
  610. package/docs/contracts/adapter-admission.md +3 -3
  611. package/docs/contracts/adapter-fixtures.md +2 -5
  612. package/docs/contracts/core.md +1 -3
  613. package/docs/contracts/errors.md +62 -0
  614. package/docs/contracts/feedback.md +8 -9
  615. package/docs/contracts/policy.md +7 -12
  616. package/docs/contracts/run-bundle.md +54 -51
  617. package/docs/contracts/schemas.md +505 -390
  618. package/docs/contracts/study-analysis.md +26 -2
  619. package/docs/contracts/study-costs.md +11 -7
  620. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  621. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  622. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  623. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  624. package/docs/principles/actor-fidelity.md +4 -4
  625. package/docs/principles/engineering.md +3 -3
  626. package/docs/principles/invariants-and-defaults.md +38 -38
  627. package/docs/principles/self-driving-harness.md +1 -5
  628. package/docs/principles/three-roles.md +1 -1
  629. package/docs/product/automatic-analysis.md +8 -7
  630. package/examples/participant/README.md +5 -5
  631. package/examples/participant/run.mjs +11 -10
  632. package/examples/scorer/README.md +3 -3
  633. package/examples/scorer/run.mjs +11 -12
  634. package/package.json +16 -17
  635. package/skills/humanish/SKILL.md +63 -60
  636. package/skills/humanish/agents/openai.yaml +1 -1
  637. package/AGENTS.md +0 -99
  638. package/CONTRIBUTING.md +0 -148
  639. package/dist/actors/codex/qualified-versions.d.ts +0 -45
  640. package/dist/actors/codex/qualified-versions.js +0 -87
  641. package/dist/cli/commands/lab.d.ts +0 -3
  642. package/dist/cli/commands/lab.js +0 -193
  643. package/dist/deprecated.d.ts +0 -90
  644. package/dist/deprecated.js +0 -106
  645. package/dist/lab/bag-overrides.d.ts +0 -18
  646. package/dist/lab/bag-overrides.js +0 -121
  647. package/dist/observer/static.d.ts +0 -39
  648. package/dist/observer/static.js +0 -369
  649. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  650. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  651. package/docs/architecture/comms-inbox.md +0 -122
  652. package/docs/architecture/desktop-recording.md +0 -80
  653. package/docs/architecture/local-browser-runtime.md +0 -178
  654. package/docs/architecture/observer-review.md +0 -144
  655. package/docs/architecture/participant-media.md +0 -90
  656. package/docs/architecture/project-layout.md +0 -62
  657. package/docs/architecture/real-email-receiving.md +0 -136
  658. package/docs/assets/humanish-drawdb-hero.png +0 -0
  659. package/docs/assets/humanish-observer-hero.png +0 -0
  660. package/docs/goals/current.md +0 -207
  661. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  662. package/docs/product/open-source-install-experience.md +0 -240
  663. package/docs/ramp/README.md +0 -294
  664. package/docs/release/open-source-readiness.md +0 -222
  665. package/docs/release/public-readiness-standard.md +0 -210
  666. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  667. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  668. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -1,6 +1,12 @@
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
4
  declare const DOCTOR_SCHEMA = "humanish.doctor-result.v1";
5
+ /**
6
+ * A row's verdict, as the human output prints it. A "note" is advisory: it never fails the run, so
7
+ * its `ok` is true. "not_checked" goes with `checked: false`.
8
+ */
9
+ type DoctorStatus = "ok" | "missing" | "not_checked" | "note";
4
10
  export interface DoctorResult {
5
11
  schema: typeof DOCTOR_SCHEMA;
6
12
  ok: boolean;
@@ -8,14 +14,15 @@ export interface DoctorResult {
8
14
  checks: Array<{
9
15
  name: string;
10
16
  ok: boolean;
17
+ status: DoctorStatus;
11
18
  message: string;
12
19
  /**
13
- * ADDITIVE + OPTIONAL. `false` means the check never ran — the directory could not be read, so
20
+ * Additive + optional. `false` means the check never ran: the directory could not be read, so
14
21
  * there is nothing to report about it either way. Absent means it ran and `ok` is its verdict.
15
22
  *
16
- * It exists because a failed check and an unrun one used to render identically, and the unrun
17
- * rows carried the SUCCESS text: a participant read `missing package.json: package.json is
18
- * present and safe to read` off a real screen (labs/tui-self-study.yaml).
23
+ * It exists so a failed check and an unrun one render differently. Without it an unrun row
24
+ * shows the success text, such as `missing package.json: package.json is present and safe to
25
+ * read` (labs/tui-self-study.yaml).
19
26
  */
20
27
  checked?: boolean;
21
28
  }>;
@@ -24,16 +31,22 @@ export interface DoctorResult {
24
31
  * Version 2.3.1 stopped holding a launched background command's event stream open. Version 2.3.2
25
32
  * also requires an e2b release whose background command handle supports sendStdin and closeStdin,
26
33
  * which the optional speech transport needs. On older releases the CLI could stay alive minutes
27
- * past a written result (#581, measured 2026-09-04 on 2.2.3: twelve minutes).
34
+ * past a written result (measured 2026-09-04 on 2.2.3: twelve minutes).
28
35
  */
29
36
  export declare const DESKTOP_SDK_FLOOR = "2.3.2";
30
37
  /** The advisory `doctor` attaches to an installed desktop SDK older than the floor, else undefined. */
31
38
  export declare function desktopSdkAdvisory(version: string | undefined): string | undefined;
39
+ /** A row as a check writes it. Doctor derives `status`; an advisory row sets "note" itself. */
40
+ export type DoctorCheckDraft = Omit<DoctorResult["checks"][number], "status"> & {
41
+ status?: "note";
42
+ };
32
43
  export declare function doctor(cwdInput: string, options?: {
33
44
  lab?: string;
34
45
  env?: NodeJS.ProcessEnv;
35
46
  localAgents?: DetectLocalAgentsOptions;
36
47
  /** Where the key probe looks for vendor stores; tests point it at a temp home. */
37
48
  keyDeps?: KeyResolutionDeps;
49
+ /** The hosted Codex participant's operator handshake; tests replace it. */
50
+ codexParticipantReadiness?: LabSetupCheckArgs["codexParticipantReadiness"];
38
51
  }): Promise<DoctorResult>;
39
52
  export {};
@@ -3,8 +3,8 @@ import { existsSync } from "node:fs";
3
3
  import path from "node:path";
4
4
  import { probeKeySources, } from "../keys/key-resolution.js";
5
5
  import { nodeSupportsTui, terminalSurfaceMessage, TUI_BUNDLE_URL } from "../tui/contract.js";
6
- import { detectLocalAgents, localAgentDoctorMessage, } from "../actors/local-agent/cli.js";
7
- import { labSetupChecks } from "../lab/doctor.js";
6
+ import { detectLocalAgents, localAgentDoctorMessage, NO_LOCAL_AGENT_MESSAGE, } from "../actors/local-agent/cli.js";
7
+ import { labSetupChecks, studiesByRequiredKey } from "../lab/doctor.js";
8
8
  import { prepareSelectedOutputDirectory, } from "../run/contained-output.js";
9
9
  import { implicitProjectDirectoryExists, readImplicitProjectFile, validateCwd, } from "../run/project.js";
10
10
  const DOCTOR_SCHEMA = "humanish.doctor-result.v1";
@@ -12,7 +12,7 @@ const DOCTOR_SCHEMA = "humanish.doctor-result.v1";
12
12
  * Version 2.3.1 stopped holding a launched background command's event stream open. Version 2.3.2
13
13
  * also requires an e2b release whose background command handle supports sendStdin and closeStdin,
14
14
  * which the optional speech transport needs. On older releases the CLI could stay alive minutes
15
- * past a written result (#581, measured 2026-09-04 on 2.2.3: twelve minutes).
15
+ * past a written result (measured 2026-09-04 on 2.2.3: twelve minutes).
16
16
  */
17
17
  export const DESKTOP_SDK_FLOOR = "2.3.2";
18
18
  /** The advisory `doctor` attaches to an installed desktop SDK older than the floor, else undefined. */
@@ -31,7 +31,7 @@ export function desktopSdkAdvisory(version) {
31
31
  (have[0] === floor[0] &&
32
32
  (have[1] < floor[1] || (have[1] === floor[1] && have[2] < floor[2])));
33
33
  return older
34
- ? `@e2b/desktop ${version} is older than ${DESKTOP_SDK_FLOOR}, the supported floor for background command cleanup and stdin handles (older releases could keep the CLI alive minutes past its result, #581). Update with \`npm i -D @e2b/desktop@latest\`.`
34
+ ? `@e2b/desktop ${version} is older than ${DESKTOP_SDK_FLOOR}, the supported floor for background command cleanup and stdin handles (older releases could keep the CLI alive for minutes after its result). Update with \`npm i -D @e2b/desktop@latest\`.`
35
35
  : undefined;
36
36
  }
37
37
  /** The version of the @e2b/desktop that `import("@e2b/desktop")` resolves to from here, if readable. */
@@ -52,44 +52,46 @@ export async function doctor(cwdInput, options = {}) {
52
52
  .then((error) => error === null)
53
53
  .catch(() => false);
54
54
  if (!cwdOk) {
55
- const checks = uncheckedProjectChecks("this directory does not exist, or humanish cannot read it", "not checked — the target directory could not be read");
56
- return { schema: DOCTOR_SCHEMA, ok: false, cwd, checks };
55
+ const checks = uncheckedProjectChecks("this directory does not exist, or humanish cannot read it", "not checked: the target directory could not be read");
56
+ return { schema: DOCTOR_SCHEMA, ok: false, cwd, checks: withStatus(checks) };
57
57
  }
58
58
  let projectRoot;
59
59
  try {
60
60
  projectRoot = await prepareSelectedOutputDirectory(path.dirname(cwd), cwd);
61
61
  }
62
62
  catch {
63
- const checks = uncheckedProjectChecks("target directory failed containment validation", "not checked — containment validation failed first");
64
- return { schema: DOCTOR_SCHEMA, ok: false, cwd, checks };
63
+ const checks = uncheckedProjectChecks("target directory failed containment validation", "not checked: the containment check failed first");
64
+ return { schema: DOCTOR_SCHEMA, ok: false, cwd, checks: withStatus(checks) };
65
65
  }
66
66
  const env = options.env ?? process.env;
67
67
  const agents = await detectLocalAgents({ ...options.localAgents, env });
68
68
  const { probes, receivingKey } = await probeDoctorKeys(cwd, env, options.lab, options.keyDeps);
69
+ const keyPresent = (name) => probes.some((probe) => probe.name === name && probe.source !== null);
69
70
  const setup = options.lab
70
71
  ? await labSetupChecks({
71
72
  cwd,
72
73
  lab: options.lab,
73
74
  env,
74
75
  agents,
75
- keyPresent: (name) => probes.some((probe) => probe.name === name && probe.source !== null),
76
+ keyPresent,
77
+ ...(options.codexParticipantReadiness === undefined
78
+ ? {}
79
+ : { codexParticipantReadiness: options.codexParticipantReadiness }),
76
80
  })
77
81
  : undefined;
82
+ // Without --lab, each key row names the labs that need it instead of failing.
83
+ const keyUsers = setup ? undefined : await studiesByRequiredKey(cwd, keyPresent);
78
84
  const checks = [
79
85
  ...(await projectChecks(projectRoot)),
80
86
  await desktopSdkCheck(setup),
81
87
  terminalSurfaceCheck(),
82
- // The operator's own signed-in coding agent, reported as a CAPABILITY and never a gate: a
83
- // machine with none is not broken, it just needs a provider key. This row exists because
84
- // "go make an API key" is where most people trying humanish stop, and a developer very often
85
- // already has one of these signed in.
86
- { name: "local agents", ok: true, message: localAgentDoctorMessage(agents) },
87
- ...keyChecks(probes, receivingKey, setup, agents),
88
+ ...localAgentChecks(agents),
89
+ ...keyChecks(probes, receivingKey, setup, keyUsers),
88
90
  ...(setup?.checks ?? [
89
91
  {
90
92
  name: "setup route",
91
93
  ok: true,
92
- message: "General capabilities only. Use humanish doctor --lab <lab> for the selected participant's requirements and separate analysis readiness.",
94
+ message: "General capabilities only. Use humanish doctor --study <study> for the selected participant's requirements and separate analysis readiness.",
93
95
  },
94
96
  ]),
95
97
  ];
@@ -97,9 +99,15 @@ export async function doctor(cwdInput, options = {}) {
97
99
  schema: DOCTOR_SCHEMA,
98
100
  ok: checks.every((check) => check.ok),
99
101
  cwd,
100
- checks,
102
+ checks: withStatus(checks),
101
103
  };
102
104
  }
105
+ function withStatus(checks) {
106
+ return checks.map((check) => ({
107
+ ...check,
108
+ status: check.ok ? (check.status ?? "ok") : check.checked === false ? "not_checked" : "missing",
109
+ }));
110
+ }
103
111
  /** The rows for a target directory doctor could not open: the failure, then three unrun checks. */
104
112
  function uncheckedProjectChecks(targetMessage, reason) {
105
113
  return [
@@ -144,23 +152,35 @@ async function projectChecks(projectRoot) {
144
152
  };
145
153
  }
146
154
  })(),
147
- {
148
- name: "humanish source",
149
- ok: await safeCheck(() => implicitProjectDirectoryExists(projectRoot, "humanish")),
150
- message: "committed humanish/ source directory is present and safe to read",
151
- },
152
- {
153
- name: "runtime ignore",
154
- ok: await safeCheck(async () => (await readImplicitProjectFile(projectRoot, ".gitignore"))?.includes(".humanish/") ??
155
- false),
156
- message: ".gitignore safely contains .humanish/",
157
- },
155
+ await sourceCheck(projectRoot),
156
+ await runtimeIgnoreCheck(projectRoot),
158
157
  ];
159
158
  }
159
+ // Each row says what it found, and a failing one names the command that fixes it.
160
+ async function sourceCheck(projectRoot) {
161
+ const ok = await safeCheck(() => implicitProjectDirectoryExists(projectRoot, "humanish"));
162
+ return {
163
+ name: "humanish source",
164
+ ok,
165
+ message: ok
166
+ ? "committed humanish/ source directory is present and safe to read"
167
+ : "no readable humanish/ source directory; run humanish init --yes",
168
+ };
169
+ }
170
+ async function runtimeIgnoreCheck(projectRoot) {
171
+ const ok = await safeCheck(async () => (await readImplicitProjectFile(projectRoot, ".gitignore"))?.includes(".humanish/") ?? false);
172
+ return {
173
+ name: "runtime ignore",
174
+ ok,
175
+ message: ok
176
+ ? ".gitignore lists .humanish/"
177
+ : ".gitignore does not list .humanish/; run humanish init --yes",
178
+ };
179
+ }
160
180
  /**
161
- * The optional peer dep every live browser and terminal lane needs (#346). `npx -y humanish` does
162
- * not pull optional peers, so an adopter's FIRST live run used to fail on it — safely and at $0,
163
- * but as a burned first impression on the flagship path. Answering it here means the readiness
181
+ * The optional peer dep every live browser and terminal route needs. `npx -y humanish` does not
182
+ * pull optional peers, so without this check an adopter's first live run fails on it, safely and at
183
+ * $0, but as a burned first impression on the flagship path. Answering it here means the readiness
164
184
  * command actually answers readiness.
165
185
  */
166
186
  async function desktopSdkCheck(setup) {
@@ -175,27 +195,30 @@ async function desktopSdkCheck(setup) {
175
195
  });
176
196
  const version = present ? await installedDesktopSdkVersion() : undefined;
177
197
  const advisory = desktopSdkAdvisory(version);
198
+ // Without --lab nothing selects a desktop route yet, so an absent SDK is advisory.
199
+ const advisoryOnly = !present && setup === undefined;
178
200
  return {
179
201
  name: "e2b desktop sdk",
180
- ok: present || setup?.desktop === false,
202
+ ok: present || advisoryOnly || setup?.desktop === false,
203
+ ...(advisoryOnly ? { status: "note" } : {}),
181
204
  message: present
182
205
  ? `optional peer @e2b/desktop ${version ?? "(version unread)"} is installed; provider access is not tested${advisory === undefined ? "" : `. ${advisory}`}`
183
206
  : setup?.desktop === false
184
207
  ? "optional peer @e2b/desktop is absent; not required by the selected route"
185
- : "optional peer @e2b/desktop is NOT installed: dry runs work, but any live desktop participant will fail closed. Install it with `npm i -D @e2b/desktop`.",
208
+ : "optional peer @e2b/desktop is not installed: dry runs work, but a live run with a desktop participant fails when it starts. Install it with `npm i -D @e2b/desktop`.",
186
209
  };
187
210
  }
188
211
  /**
189
- * The stakeholder surface (#455). Reported as capability, never as a gate: the TUI is optional,
212
+ * The stakeholder surface. Reported as capability, never as a gate: the TUI is optional,
190
213
  * and `doctor` is itself mostly run by agents through a pipe, where a TTY requirement says
191
- * nothing about whether the PROJECT is ready. So this row is always ok.
214
+ * nothing about whether the project is ready. So this row is always ok.
192
215
  *
193
- * WHO IS READING decides the wording, and a real first-contact study
216
+ * Who is reading decides the wording, and a real first-contact study
194
217
  * (labs/first-contact.yaml) is why. An agent evaluating humanish read
195
218
  * "`humanish tui` is available in an interactive terminal", correctly concluded it was not in
196
- * one, and dropped it — then wrote a report FOR A HUMAN that never mentioned the human
219
+ * one, and dropped it, then wrote a report for a human that never mentioned the human
197
220
  * surface at all. Discovery worked; handoff did not. A capability described to a reader who
198
- * cannot use it has to be phrased as something to PASS ON, or it reads as "not for you" and
221
+ * cannot use it has to be phrased as something to pass on, or it reads as "not for you" and
199
222
  * dies there.
200
223
  */
201
224
  function terminalSurfaceCheck() {
@@ -204,6 +227,7 @@ function terminalSurfaceCheck() {
204
227
  return {
205
228
  name: "terminal surface",
206
229
  ok: true,
230
+ ...(supported && bundlePresent ? {} : { status: "note" }),
207
231
  message: terminalSurfaceMessage({
208
232
  supported,
209
233
  bundlePresent,
@@ -234,30 +258,69 @@ async function probeDoctorKeys(cwd, env, lab, keyDeps) {
234
258
  return { probes, receivingKey };
235
259
  }
236
260
  /**
237
- * Provider-key discovery (#436): which source supplies each live-run key, through the same
261
+ * The operator's own coding agents, one row each, reported as a capability and never a gate: a
262
+ * machine with none is not broken, it just needs a provider key. These rows exist because "go make
263
+ * an API key" is where most people trying humanish stop, and a developer very often already has one
264
+ * of these signed in. An agent that is installed but not signed in is a note.
265
+ */
266
+ function localAgentChecks(agents) {
267
+ if (agents.length === 0)
268
+ return [{ name: "local agents", ok: true, message: NO_LOCAL_AGENT_MESSAGE }];
269
+ return agents.map((agent) => ({
270
+ name: `local agent ${agent.bin}`,
271
+ ok: true,
272
+ ...(agent.authStatus === "authenticated" ? {} : { status: "note" }),
273
+ message: localAgentDoctorMessage(agent),
274
+ }));
275
+ }
276
+ /** "try-live", "try-live and local-browser", "a, b and c". */
277
+ function studyList(studies) {
278
+ return studies.length < 2
279
+ ? studies.join("")
280
+ : `${studies.slice(0, -1).join(", ")} and ${studies.at(-1)}`;
281
+ }
282
+ /**
283
+ * Provider-key discovery: which source supplies each live-run key, through the same
238
284
  * chain a live command resolves (env/--env-file, project overlay, vendor stores, the
239
285
  * humanish user store). Values never appear; sources and fill commands do.
286
+ *
287
+ * With --lab, a key the selected route requires fails when missing. Without it, `keyUsers` maps
288
+ * each key to the project's labs that need it, and a key row never fails: a missing key one of
289
+ * them needs is a note.
240
290
  */
241
- function keyChecks(probes, receivingKey, setup, agents) {
291
+ function keyChecks(probes, receivingKey, setup, keyUsers) {
242
292
  return probes.map((probe) => {
243
293
  const present = probe.source !== null;
244
294
  const hint = probe.name === receivingKey
245
295
  ? `provide ${probe.name} through process env or --env-file`
246
296
  : probe.hint;
297
+ if (!setup) {
298
+ const users = keyUsers?.get(probe.name) ?? [];
299
+ const usedBy = users.length > 0 ? `used by ${studyList(users)}` : undefined;
300
+ return {
301
+ name: `key ${probe.name}`,
302
+ ok: true,
303
+ ...(present || usedBy === undefined ? {} : { status: "note" }),
304
+ message: present
305
+ ? `supplied by ${probe.source}; presence only, validity not tested${usedBy ? `; ${usedBy}` : ""}`
306
+ : `missing; ${usedBy ?? "not used by any lab in this project"}; ${hint}`,
307
+ };
308
+ }
247
309
  // GH_TOKEN is needed only for private clone subjects, so its absence is informational.
248
- const required = setup
249
- ? setup.keys.includes(probe.name)
250
- : probe.name === "E2B_API_KEY" ||
251
- (probe.name === "OPENAI_API_KEY" &&
252
- !agents.some((agent) => agent.authStatus === "authenticated"));
310
+ const required = setup.keys.includes(probe.name);
311
+ // A key the lab is known not to read says so, so a present but unused key does not read as
312
+ // one the run will use.
313
+ const unused = setup.reads !== undefined && !setup.reads.has(probe.name);
253
314
  return {
254
315
  name: `key ${probe.name}`,
255
316
  ok: present || !required,
256
317
  message: present
257
- ? `supplied by ${probe.source}; presence only, validity not tested`
318
+ ? unused
319
+ ? `present (${probe.source}), not used by this lab`
320
+ : `supplied by ${probe.source}; presence only, validity not tested`
258
321
  : required
259
- ? `missing from every source — ${hint}`
260
- : `not required for ${setup ? "the selected participant route" : "every route"}; ${hint}`,
322
+ ? `missing from every source; ${hint}`
323
+ : `not required for the selected participant route; ${hint}`,
261
324
  };
262
325
  });
263
326
  }
@@ -8,23 +8,23 @@ export interface FirstRunEnvironment {
8
8
  /** A sandbox to run the study in. Nothing live happens without it. */
9
9
  hasE2bKey: boolean;
10
10
  /**
11
- * Whether `@e2b/desktop` resolves from this project. It is an OPTIONAL peer — the no-keys path
12
- * does not need it — so a fresh `npx humanish` install does not have it, and a live run stops
11
+ * Whether `@e2b/desktop` resolves from this project. It is an optional peer: the no-keys path
12
+ * does not need it, so a fresh `npx humanish` install does not have it, and a live run stops
13
13
  * with "install this other package first". Found by running the published artifact cold, after
14
14
  * two local runs passed because they resolved the peer from the repo's own node_modules.
15
15
  */
16
16
  hasDesktopSdk: boolean;
17
17
  /**
18
18
  * Whether humanish itself is installed in this project rather than running from an npx cache.
19
- * It changes what advice is TRUE: a one-shot `npx humanish` resolves its optional peer relative
20
- * to itself, so "install the peer here" cannot work — humanish has to be installed alongside it.
19
+ * It changes what advice is true: a one-shot `npx humanish` resolves its optional peer relative
20
+ * to itself, so "install the peer here" cannot work; humanish has to be installed alongside it.
21
21
  */
22
22
  installedInProject: boolean;
23
23
  /** A provider API key for the model. */
24
24
  hasProviderKey: boolean;
25
25
  /** The coding agents already signed in locally: Codex, Claude Code, or both. */
26
26
  localAgents: readonly SignedInAgent[];
27
- /** Host shape only; `doctor --lab local-browser` owns exact read-only readiness. */
27
+ /** Host shape only; `doctor --study local-browser` owns exact read-only readiness. */
28
28
  platform?: NodeJS.Platform;
29
29
  arch?: string;
30
30
  }
@@ -32,7 +32,7 @@ export type FirstRunActor = "openai-computer-use" | "local-agent";
32
32
  /**
33
33
  * Which brain the starter live lab should be written for. A machine with a signed-in coding agent
34
34
  * and no provider key can still do a real live run; writing the lab for the credential the
35
- * operator DOESN'T have is how a starter file becomes homework.
35
+ * operator doesn't have is how a starter file becomes homework.
36
36
  */
37
37
  export declare function starterActorFor(env: FirstRunEnvironment): FirstRunActor;
38
38
  /**
@@ -40,6 +40,8 @@ export declare function starterActorFor(env: FirstRunEnvironment): FirstRunActor
40
40
  * refuse to run on a machine where only Claude Code is signed in.
41
41
  */
42
42
  export declare function starterLocalAgentFor(env: FirstRunEnvironment): LocalAgentId | undefined;
43
+ /** Hosts the local browser lab runs on: Linux x64 and Apple Silicon Macs. */
44
+ export declare function supportsLocalBrowser(platform: NodeJS.Platform | undefined, arch: string | undefined): boolean;
43
45
  export interface FirstRunStep {
44
46
  /** The exact command to run. */
45
47
  command: string;
@@ -47,7 +49,7 @@ export interface FirstRunStep {
47
49
  why: string;
48
50
  }
49
51
  /**
50
- * The next one or two commands, in order. Deliberately SHORT: a list of twelve options is the same
52
+ * The next one or two commands, in order. Deliberately short: a list of twelve options is the same
51
53
  * as no guidance, and the reader here has just been handed twenty files.
52
54
  */
53
55
  export declare function firstRunSteps(env: FirstRunEnvironment): FirstRunStep[];
@@ -56,12 +58,12 @@ export declare function firstRunGuidance(env: FirstRunEnvironment): string[];
56
58
  /** Lets init recognise its own section without rewriting a file someone else wrote. */
57
59
  export declare const AGENTS_SECTION_MARKER = "<!-- humanish:agents-guide -->";
58
60
  /**
59
- * What the NEXT coding agent needs to know about humanish in this project.
61
+ * What the next coding agent needs to know about humanish in this project.
60
62
  *
61
- * AGENTS.md is the cross-vendor convention (agents.md) that Codex, Claude Code, Cursor and others
63
+ * `AGENTS.md` is the cross-vendor convention (agents.md) that Codex, Claude Code, Cursor and others
62
64
  * read on arrival. Increasingly the thing that ran `humanish init` was itself an agent working for
63
65
  * someone, and the agent that shows up tomorrow finds a `humanish/` directory with no idea what it
64
- * is for. Deliberately SHORT and command-first: an agent acts on commands, not on prose.
66
+ * is for. Deliberately short and command-first, because an agent acts on the commands it is given.
65
67
  */
66
68
  export declare function agentsSection(): string;
67
69
  export {};
@@ -1,21 +1,21 @@
1
- // What a person — or the coding agent setting humanish up for them — should do NEXT.
1
+ // What a person, or the coding agent setting humanish up for them, should do next.
2
2
  //
3
- // WHY: `humanish init` wrote twenty files and stopped. The only lab that could actually run was a
3
+ // Why: `humanish init` wrote twenty files and stopped. The only lab that could actually run was a
4
4
  // $0 dry run; the two live ones were templates with `your-org/your-app` in them, so the first live
5
5
  // run a newcomer tried could not succeed no matter what credentials they had. Three independent
6
- // sources reached the same place — a participant in our own TUI study walked to the Start row and
6
+ // sources reached the same place: a participant in our own TUI study walked to the Start row and
7
7
  // found a placeholder URL, an adoption review concluded "the funnel is broken at the first live
8
8
  // run", and the release-gate participant said, unprompted, "validate one paid live study before
9
- // committing" (#505).
9
+ // committing".
10
10
  //
11
11
  // The fix is not more surface. Increasingly the thing running `init` is a coding agent acting for
12
12
  // someone, and an agent reads stdout and does what it says. So init ends by naming the next
13
- // command — and names the one that will actually work ON THIS MACHINE, because a next step that
13
+ // command, and names the one that will actually work on this machine, because a next step that
14
14
  // fails is worse than none.
15
15
  /**
16
16
  * Which brain the starter live lab should be written for. A machine with a signed-in coding agent
17
17
  * and no provider key can still do a real live run; writing the lab for the credential the
18
- * operator DOESN'T have is how a starter file becomes homework.
18
+ * operator doesn't have is how a starter file becomes homework.
19
19
  */
20
20
  export function starterActorFor(env) {
21
21
  if (!env.hasProviderKey && env.localAgents.length > 0)
@@ -35,29 +35,31 @@ export function starterLocalAgentFor(env) {
35
35
  }
36
36
  /**
37
37
  * How each hint invokes the CLI. \`npx humanish\` works from a project install and from an npx cache;
38
- * a dev-dependency install puts no \`humanish\` on PATH, so a bare name can reach a stale global one.
38
+ * a dev-dependency install puts no \`humanish\` on \`PATH\`, so a bare name can reach a stale global one.
39
39
  */
40
40
  const HUMANISH = "npx humanish";
41
+ /** Hosts the local browser lab runs on: Linux x64 and Apple Silicon Macs. */
42
+ export function supportsLocalBrowser(platform, arch) {
43
+ return (platform === "linux" && arch === "x64") || (platform === "darwin" && arch === "arm64");
44
+ }
41
45
  /**
42
- * The next one or two commands, in order. Deliberately SHORT: a list of twelve options is the same
46
+ * The next one or two commands, in order. Deliberately short: a list of twelve options is the same
43
47
  * as no guidance, and the reader here has just been handed twenty files.
44
48
  */
45
49
  export function firstRunSteps(env) {
46
50
  const steps = [
47
51
  {
48
52
  command: `${HUMANISH} run first-run`,
49
- why: "an evidence preview: no browser or model runs, no keys, no spend",
53
+ why: "a dry run: no browser or model runs, no keys, no spend",
50
54
  },
51
55
  ];
52
- const localPlatform = (env.platform === "linux" && env.arch === "x64") ||
53
- (env.platform === "darwin" && env.arch === "arm64");
54
- if (localPlatform) {
56
+ if (supportsLocalBrowser(env.platform, env.arch)) {
55
57
  const prerequisites = env.platform === "darwin"
56
58
  ? "M3-or-newer Mac, native ARM64 Node, Lima 2.2+, and a supported signed-in Codex CLI"
57
59
  : "local rootful Docker, KVM, TUN, and a supported signed-in Codex CLI";
58
60
  steps.push({
59
- command: `${HUMANISH} doctor --lab local-browser`,
60
- why: `check the local browser lab (${prerequisites}); no resources or quota used. Run \`${HUMANISH} runtime setup\` to prepare it, then start your app and run \`${HUMANISH} run local-browser\`; no E2B or model API key`,
61
+ command: `${HUMANISH} doctor --study local-browser`,
62
+ why: `check the local browser study (${prerequisites}); no resources or quota used. Run \`${HUMANISH} runtime setup\` to prepare it, then start your app and run \`${HUMANISH} run local-browser\`; no E2B or model API key`,
61
63
  });
62
64
  return steps;
63
65
  }
@@ -74,7 +76,7 @@ export function firstRunSteps(env) {
74
76
  if (env.hasProviderKey || env.localAgents.length > 0) {
75
77
  const brain = env.hasProviderKey
76
78
  ? "your provider key"
77
- : `${preferredAgent(env)?.label} (already signed in — no API key needed)`;
79
+ : `${preferredAgent(env)?.label} (already signed in, so no API key is needed)`;
78
80
  // Everything the step needs, in one line. Splitting it across two commands means the second
79
81
  // one fails, which is the same dead end this guidance exists to remove.
80
82
  const command = env.hasDesktopSdk
@@ -86,7 +88,7 @@ export function firstRunSteps(env) {
86
88
  `npm i -D humanish @e2b/desktop && ${HUMANISH} run try-live`;
87
89
  steps.push({
88
90
  command,
89
- why: `a REAL study: one participant drives a real app in a hosted desktop, using ${brain}` +
91
+ why: `a live study: one participant drives a real app in a hosted desktop, using ${brain}` +
90
92
  (env.hasDesktopSdk ? "" : " (the desktop SDK is an optional peer, so it installs first)") +
91
93
  (!env.hasProviderKey
92
94
  ? "; automatic findings analysis is skipped without OPENAI_API_KEY"
@@ -110,12 +112,12 @@ export function firstRunGuidance(env) {
110
112
  /** Lets init recognise its own section without rewriting a file someone else wrote. */
111
113
  export const AGENTS_SECTION_MARKER = "<!-- humanish:agents-guide -->";
112
114
  /**
113
- * What the NEXT coding agent needs to know about humanish in this project.
115
+ * What the next coding agent needs to know about humanish in this project.
114
116
  *
115
- * AGENTS.md is the cross-vendor convention (agents.md) that Codex, Claude Code, Cursor and others
117
+ * `AGENTS.md` is the cross-vendor convention (agents.md) that Codex, Claude Code, Cursor and others
116
118
  * read on arrival. Increasingly the thing that ran `humanish init` was itself an agent working for
117
119
  * someone, and the agent that shows up tomorrow finds a `humanish/` directory with no idea what it
118
- * is for. Deliberately SHORT and command-first: an agent acts on commands, not on prose.
120
+ * is for. Deliberately short and command-first, because an agent acts on the commands it is given.
119
121
  */
120
122
  export function agentsSection() {
121
123
  return [
@@ -125,22 +127,22 @@ export function agentsSection() {
125
127
  "This project uses humanish: synthetic participants use the product and leave evidence.",
126
128
  "",
127
129
  "```bash",
128
- "humanish doctor --lab try-live # requirements for the selected participant and analysis",
129
- "humanish lab list --json # the labs in this project",
130
- "humanish run first-run # evidence preview only: no browser, model, keys, or spend",
131
- "humanish doctor --lab local-browser # local Docker/Firecracker + Codex-account readiness",
130
+ "humanish doctor --study try-live # requirements for the selected participant and analysis",
131
+ "humanish study list --json # the studies in this project",
132
+ "humanish run first-run # dry run: no browser, model, keys, or spend",
133
+ "humanish doctor --study local-browser # local Docker/Firecracker + Codex-account readiness",
132
134
  "humanish run local-browser # your loopback app; no E2B or model API key",
133
135
  "humanish run try-live # demo app study: E2B plus the selected participant's authentication",
134
136
  "humanish verify --run latest --json # is the evidence share-safe",
135
137
  "```",
136
138
  "",
137
- "- Labs are declared in `humanish/labs/*.yaml`. Edit `try-live.yaml`'s `subject` to point at",
138
- " this project's own app once you have seen a run work.",
139
- "- Configure the local lab without editing YAML: `humanish init --yes --local-browser",
139
+ "- Studies are declared in `humanish/studies/*.yaml`. Edit `try-live.yaml`'s `subject` to point",
140
+ " at this project's own app once you have seen a run work.",
141
+ "- Configure the local study without editing YAML: `humanish init --yes --local-browser",
140
142
  ' http://127.0.0.1:3000 --local-mission "Complete the primary flow"` on first setup.',
141
143
  "- Evidence lands in gitignored `.humanish/runs/`. Never commit it, and never paste raw run",
142
- " bundles into an issue — `humanish feedback issue` produces a redacted, share-safe draft.",
143
- "- `humanish tui` is a HUMAN surface and refuses to run in an agent session. Use the `--json`",
144
+ " bundles into an issue; `humanish feedback issue` writes a redacted, share-safe draft.",
145
+ "- `humanish tui` is for people and refuses to run in an agent session. Use the `--json`",
144
146
  " commands above instead, and tell the person you are working for that `humanish tui` exists.",
145
147
  "- A live run spends money. `execution.caps.maxUsd` in each lab caps estimated model spend: the run",
146
148
  " stops before its next request once the estimate passes it, so the last request can go over, and",
package/dist/cli/io.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Command } from "commander";
1
+ import { Command, Option } from "commander";
2
2
  import { discoverProviderKeys } from "../keys/key-resolution.js";
3
3
  import { type TelemetryProperties } from "./telemetry.js";
4
4
  import type { RunResult } from "../run/results.js";
@@ -11,6 +11,12 @@ export interface CliIo {
11
11
  keyDiscovery?: typeof discoverProviderKeys;
12
12
  }
13
13
  export declare const JSON_OPTION_DESCRIPTION = "Print a machine-readable JSON response.";
14
+ export declare const CWD_OPTION_DESCRIPTION = "Project directory.";
15
+ export declare const RUN_OPTION_DESCRIPTION = "Run id, or latest.";
16
+ export declare const ENV_FILE_OPTION_DESCRIPTION = "Load unset variables from this env file. Values are never printed or saved.";
17
+ export declare const PORT_OPTION_DESCRIPTION = "Port to listen on at 127.0.0.1.";
18
+ /** `--port` for a loopback server whose default, 0, lets the OS pick a free port. */
19
+ export declare function freePortOption(): Option;
14
20
  export interface LabCommandOptions {
15
21
  count?: string | undefined;
16
22
  cwd: string;
@@ -18,14 +24,13 @@ export interface LabCommandOptions {
18
24
  dryRun?: boolean | undefined;
19
25
  envFile?: string | undefined;
20
26
  json?: boolean | undefined;
21
- lanes?: string | undefined;
22
27
  open?: boolean | undefined;
28
+ participants?: string | undefined;
23
29
  port?: string | undefined;
24
30
  rerunFailedFrom?: string | undefined;
25
31
  runId?: string | undefined;
26
- /** #316: repo-relative path to an adopter scorer module; overrides review.scorer.ref when set. */
32
+ /** Repo-relative path to an adopter scorer module; overrides review.scorer.ref when set. */
27
33
  scorer?: string | undefined;
28
- sims?: string | undefined;
29
34
  expose?: boolean | undefined;
30
35
  tunnel?: "ngrok" | undefined;
31
36
  tunnelDomain?: string | undefined;
@@ -49,7 +54,7 @@ export declare function applyEnvFileOption(args: {
49
54
  discoverKeys?: boolean;
50
55
  }): Promise<boolean>;
51
56
  /**
52
- * Provider-key discovery (#436): fill still-missing keys from the documented project overlay, the
57
+ * Provider-key discovery: fill still-missing keys from the documented project overlay, the
53
58
  * owning vendors' native stores, and the humanish user store. It is fill-only (an explicit
54
59
  * --env-file or process env always wins), and each fill is announced by name and source on
55
60
  * stderr, never by value. HUMANISH_STRICT_KEYS=1 restores env-only behavior.
@@ -59,14 +64,41 @@ export declare function discoverCliKeys(args: {
59
64
  cwd: string;
60
65
  env?: NodeJS.ProcessEnv;
61
66
  onDiscovered?: (names: string[]) => void;
67
+ /** Announce only the fills of these names; every key is still filled. Undefined announces all. */
68
+ announced?: ReadonlySet<string>;
62
69
  }): Promise<void>;
63
70
  export declare function parseLabCount(value: string | undefined, fallback: number): number | null;
64
71
  export declare function parseParticipantIds(value: string | undefined): string[];
65
- export declare function writeResult<T>(command: Command, io: CliIo, result: T, formatHuman: (result: T) => string): void;
66
- export declare function noteStudyFacts(command: Command, facts: TelemetryProperties): void;
72
+ /** An error as a result carries it. A result with only a message, such as keys or comms, has no code. */
73
+ export interface CliError {
74
+ code?: string;
75
+ message: string;
76
+ }
77
+ /**
78
+ * What a human formatter prints: text for stdout, or stdout lines plus an error that writeResult
79
+ * prints on stderr through formatCliError. --json output never goes through it.
80
+ */
81
+ export type HumanOutput = string | {
82
+ stdout?: string;
83
+ error?: CliError | undefined;
84
+ };
85
+ /** `<command> failed: <message>`, then `code: <CODE>`, then `next: <command>` when one is known. */
86
+ export declare function formatCliError(command: string, error: CliError): string;
87
+ /** A result whose human output is its message: stdout when it passed, stderr when it failed. */
88
+ export declare function messageOutput(value: {
89
+ ok: boolean;
90
+ message: string;
91
+ }): HumanOutput;
92
+ /** A failed result's human output: its error on stderr and nothing on stdout. */
93
+ export declare function humanError(error: CliError | undefined): HumanOutput;
94
+ /** Prints a human formatter's output: text to stdout, an error to stderr through formatCliError. */
95
+ export declare function writeHuman(command: Command, io: CliIo, human: HumanOutput): void;
96
+ export declare function writeResult<T>(command: Command, io: CliIo, result: T, formatHuman: (result: T) => HumanOutput): void;
97
+ export declare function noteRunFacts(command: Command, facts: TelemetryProperties): void;
67
98
  /** Exported for tests: the facts writeResult read off a command's result document. */
68
- export declare function studyFactsFor(command: Command): TelemetryProperties;
69
- export declare function formatRunHuman(result: RunResult): string;
99
+ export declare function runFactsFor(command: Command): TelemetryProperties;
100
+ /** A run result, or the preview route's study result: they differ only in `schema`. */
101
+ export declare function formatRunHuman(result: Omit<RunResult, "schema">): HumanOutput;
70
102
  export declare function parsePositiveInteger(value: string): number | null;
71
103
  export declare function parseTimeoutMs(value: string): number | null;
72
104
  export declare function parseObserverPort(value: string): number | null;
@@ -80,6 +112,10 @@ export declare function candidateOption(options: {
80
112
  analysis?: string;
81
113
  finding?: string;
82
114
  };
83
- export declare function collectRepeated(value: string, previous: string[]): string[];
115
+ export declare function collectRepeated(value: string, previous?: string[]): string[];
84
116
  export declare function wantsJson(command: Command): boolean;
117
+ export declare function analysisOutcomeText(analysis: {
118
+ state: string;
119
+ reason: string | null;
120
+ }): string;
85
121
  export declare function automaticAnalysisEnvelope<T>(result: T): T;