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
package/dist/cli/io.js CHANGED
@@ -3,10 +3,11 @@ import { DEFAULT_ANALYSIS_MAX_COST_USD } from "../analysis/automatic-config.js";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { dirname, resolve } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
- import { Command } from "commander";
6
+ import { Command, Option } from "commander";
7
7
  import { loadEnvFile } from "../keys/env-file.js";
8
8
  import { discoverProviderKeys } from "../keys/key-resolution.js";
9
9
  import { deriveRunFacts } from "./telemetry.js";
10
+ import { withQueuedWarnings } from "./deprecations.js";
10
11
  import { forTerminal } from "../routes/terminal/encoding.js";
11
12
  export const CLI_RESPONSE_SCHEMA = "humanish.cli-response.v1";
12
13
  function readCliVersion() {
@@ -17,11 +18,19 @@ function readCliVersion() {
17
18
  : "0.0.0";
18
19
  }
19
20
  export const CLI_VERSION = readCliVersion();
20
- // Shared so the ~20 leaf commands that declare their own --json flag cannot drift
21
- // from each other in wording.
21
+ // One text per shared flag, so the same flag reads the same on every command.
22
+ // tests/cli/shared-options.test.ts walks the program and holds every use to these.
22
23
  export const JSON_OPTION_DESCRIPTION = "Print a machine-readable JSON response.";
23
- // Transcode ONLY for a terminal. A pipe carries bytes to another program — mangling those would
24
- // corrupt a JSON payload for a reader that handles UTF-8 perfectly well — while a TTY carries them
24
+ export const CWD_OPTION_DESCRIPTION = "Project directory.";
25
+ export const RUN_OPTION_DESCRIPTION = "Run id, or latest.";
26
+ export const ENV_FILE_OPTION_DESCRIPTION = "Load unset variables from this env file. Values are never printed or saved.";
27
+ export const PORT_OPTION_DESCRIPTION = "Port to listen on at 127.0.0.1.";
28
+ /** `--port` for a loopback server whose default, 0, lets the OS pick a free port. */
29
+ export function freePortOption() {
30
+ return new Option("--port <port>", PORT_OPTION_DESCRIPTION).default("0", "a free port");
31
+ }
32
+ // Transcode only for a terminal. A pipe carries bytes to another program, and mangling those would
33
+ // corrupt a JSON payload for a reader that handles UTF-8 perfectly well, while a TTY carries them
25
34
  // to a font, through a locale that may not decode them. See src/routes/terminal/encoding.ts for what a
26
35
  // participant actually read back off the screen.
27
36
  const forStream = (stream, text) => stream.isTTY === true ? forTerminal(text) : text;
@@ -37,7 +46,7 @@ export const defaultIo = {
37
46
  // of the invocation (a fresh object every createProgram() call) rather than a
38
47
  // module-level boolean, so tests that construct multiple `createProgram()`
39
48
  // instances in the same process never see one instance's writes bleed into
40
- // another's, and nothing needs explicit cleanup -- the entry is released once
49
+ // another's, and nothing needs explicit cleanup: the entry is released once
41
50
  // that Command tree is garbage collected.
42
51
  const invocationEnvelopeWritten = new WeakSet();
43
52
  function rootCommandOf(command) {
@@ -77,7 +86,7 @@ export async function applyEnvFileOption(args) {
77
86
  return true;
78
87
  }
79
88
  /**
80
- * Provider-key discovery (#436): fill still-missing keys from the documented project overlay, the
89
+ * Provider-key discovery: fill still-missing keys from the documented project overlay, the
81
90
  * owning vendors' native stores, and the humanish user store. It is fill-only (an explicit
82
91
  * --env-file or process env always wins), and each fill is announced by name and source on
83
92
  * stderr, never by value. HUMANISH_STRICT_KEYS=1 restores env-only behavior.
@@ -97,7 +106,7 @@ export async function discoverCliKeys(args) {
97
106
  // Discovery must never break a command; a rung that fails to read is a miss, not an error.
98
107
  }
99
108
  }
100
- export function parseLabCount(value, fallback) {
109
+ export function parseStudyCount(value, fallback) {
101
110
  return value === undefined ? fallback : parsePositiveInteger(value);
102
111
  }
103
112
  export function parseParticipantIds(value) {
@@ -115,21 +124,60 @@ export function parseParticipantIds(value) {
115
124
  }
116
125
  return participantIds;
117
126
  }
118
- // Exported so tests/cli/program.test.ts can drive the command-boundary catch-all's
119
- // post-write guard (invocationEnvelopeAlreadyWritten above) through the same
120
- // funnel every real command uses, without duplicating its stdout-vs-formatHuman
121
- // branching. Not re-exported from src/index.ts; this stays an internal seam.
127
+ /**
128
+ * The command to run next, by code. A code is listed only when its messages do not already name a
129
+ * command: the run-not-found and missing-study messages do.
130
+ */
131
+ const NEXT_COMMAND = {
132
+ HUMANISH_STUDY_NOT_FOUND: "humanish study list",
133
+ };
134
+ /** `<command> failed: <message>`, then `code: <CODE>`, then `next: <command>` when one is known. */
135
+ export function formatCliError(command, error) {
136
+ const next = error.code === undefined ? undefined : NEXT_COMMAND[error.code];
137
+ return ([
138
+ `${command} failed: ${error.message}`,
139
+ ...(error.code === undefined ? [] : [`code: ${error.code}`]),
140
+ ...(next === undefined ? [] : [`next: ${next}`]),
141
+ ].join("\n") + "\n");
142
+ }
143
+ /** A result whose human output is its message: stdout when it passed, stderr when it failed. */
144
+ export function messageOutput(value) {
145
+ return value.ok ? `${value.message}\n` : { error: { message: value.message } };
146
+ }
147
+ /** A failed result's human output: its error on stderr and nothing on stdout. */
148
+ export function humanError(error) {
149
+ return { error: error ?? { message: "the command failed without a recorded error" } };
150
+ }
151
+ /** "humanish study show": the command's path as a person types it. */
152
+ function commandLabel(command) {
153
+ const names = [];
154
+ for (let current = command; current !== null; current = current.parent)
155
+ names.unshift(current.name());
156
+ return names.join(" ");
157
+ }
158
+ /** Prints a human formatter's output: text to stdout, an error to stderr through formatCliError. */
159
+ export function writeHuman(command, io, human) {
160
+ if (typeof human === "string") {
161
+ io.writeOut(human);
162
+ return;
163
+ }
164
+ if (human.stdout)
165
+ io.writeOut(human.stdout);
166
+ if (human.error)
167
+ io.writeErr(formatCliError(commandLabel(command), human.error));
168
+ }
122
169
  export function writeResult(command, io, result, formatHuman) {
123
170
  const output = automaticAnalysisEnvelope(result);
124
171
  if (wantsJson(command)) {
125
- io.writeOut(`${JSON.stringify(output, null, 2)}\n`);
172
+ // Queued warnings are on stderr already; a JSON caller gets them in warnings[] as well.
173
+ io.writeOut(`${JSON.stringify(withQueuedWarnings(command, output), null, 2)}\n`);
126
174
  }
127
175
  else {
128
- io.writeOut(formatHuman(output));
176
+ writeHuman(command, io, formatHuman(output));
129
177
  if (output !== null && typeof output === "object" && "automaticAnalysis" in output) {
130
178
  const analysis = output.automaticAnalysis;
131
179
  if (analysis)
132
- io.writeOut(`analysis: ${analysis.state}${analysis.reason ? ` (${analysis.reason})` : ""}\n`);
180
+ io.writeOut(`analysis: ${analysisOutcomeText(analysis)}\n`);
133
181
  const rejected = analysis?.result?.rejectedOutputPath;
134
182
  if (rejected)
135
183
  io.writeOut(`analysis: ${analysis.result?.error?.code ?? "rejected"}; the rejected output is kept locally at ${rejected}\n`);
@@ -139,7 +187,7 @@ export function writeResult(command, io, result, formatHuman) {
139
187
  }
140
188
  markInvocationEnvelopeWritten(command);
141
189
  // Every backend's result passes through here, so this is where a study's facts get read for
142
- // telemetry — not in each backend, which is how they went unreported for two releases.
190
+ // telemetry. Reading them in each route instead is how they went unreported for two releases.
143
191
  noteRunFacts(command, deriveRunFacts(result));
144
192
  }
145
193
  const runFactsByCommand = new WeakMap();
@@ -152,10 +200,10 @@ export function noteRunFacts(command, facts) {
152
200
  export function runFactsFor(command) {
153
201
  return { ...runFactsByCommand.get(command) };
154
202
  }
203
+ /** A run result, or the preview route's study result: they differ only in `schema`. */
155
204
  export function formatRunHuman(result) {
156
- if (!result.ok) {
157
- return `${result.error?.code}: ${result.error?.message}\n`;
158
- }
205
+ if (!result.ok)
206
+ return humanError(result.error);
159
207
  return ([
160
208
  `humanish run ${result.mode}`,
161
209
  `run: ${result.runId}`,
@@ -166,9 +214,8 @@ export function formatRunHuman(result) {
166
214
  ].join("\n") + "\n");
167
215
  }
168
216
  function formatEnvFileHuman(result) {
169
- if (!result.ok) {
170
- return `${result.error?.code}: ${result.error?.message}\n`;
171
- }
217
+ if (!result.ok)
218
+ return humanError(result.error);
172
219
  return ([
173
220
  "humanish env-file loaded",
174
221
  `env-file: ${result.envFile}`,
@@ -205,7 +252,7 @@ export function candidateOption(options) {
205
252
  ...(options.finding === undefined ? {} : { finding: options.finding }),
206
253
  };
207
254
  }
208
- export function collectRepeated(value, previous) {
255
+ export function collectRepeated(value, previous = []) {
209
256
  return [...previous, value];
210
257
  }
211
258
  export function wantsJson(command) {
@@ -218,6 +265,34 @@ export function wantsJson(command) {
218
265
  }
219
266
  return false;
220
267
  }
268
+ /** What the automatic analysis did, in words; JSON output keeps the reason code. */
269
+ const ANALYSIS_REASON_TEXT = {
270
+ AUTOMATIC_ANALYSIS_DRY_RUN: "skipped for dry runs",
271
+ AUTOMATIC_ANALYSIS_KEY_MISSING: "skipped because OPENAI_API_KEY is not set",
272
+ AUTOMATIC_ANALYSIS_NO_PARTICIPANT_EVIDENCE: "skipped because no participant left evidence",
273
+ AUTOMATIC_ANALYSIS_ACTOR_CANCELLED: "skipped because the run stopped before its participants finished",
274
+ AUTOMATIC_ANALYSIS_SOURCE_UNAVAILABLE: "skipped because the run's evidence could not be read",
275
+ AUTOMATIC_ANALYSIS_ALREADY_REQUESTED: "skipped because this run's analysis was already requested",
276
+ AUTOMATIC_ANALYSIS_BUSY: "skipped because another analysis is running",
277
+ AUTOMATIC_ANALYSIS_ADMISSION_REFUSED: "not started because its configuration or question was refused",
278
+ AUTOMATIC_ANALYSIS_CLEANUP_UNCONFIRMED: "not started because the run's cleanup was not confirmed",
279
+ AUTOMATIC_ANALYSIS_REUSED: "complete, reusing an earlier analysis of the same evidence",
280
+ AUTOMATIC_ANALYSIS_LIMITATIONS: "partial, because it covered only part of the evidence",
281
+ AUTOMATIC_ANALYSIS_ADMISSION_EXCEEDED: "partial, because it went over its estimated cost or output",
282
+ AUTOMATIC_ANALYSIS_FAILED: "failed",
283
+ AUTOMATIC_ANALYSIS_CANCELLED: "cancelled",
284
+ AUTOMATIC_ANALYSIS_CODEX_UNAVAILABLE: "failed because the Codex analyst could not run",
285
+ AUTOMATIC_ANALYSIS_PUBLICATION_FAILED: "failed because the report could not be saved",
286
+ AUTOMATIC_ANALYSIS_SOURCE_CHANGED: "failed because the run's evidence changed during analysis",
287
+ AUTOMATIC_ANALYSIS_CANCELLATION_UNAVAILABLE: "outcome unknown: a cancellation could not be recorded",
288
+ AUTOMATIC_ANALYSIS_STORAGE_UNAVAILABLE: "outcome unknown: analysis storage is unavailable",
289
+ AUTOMATIC_ANALYSIS_OUTCOME_UNKNOWN: "outcome unknown",
290
+ };
291
+ export function analysisOutcomeText(analysis) {
292
+ if (analysis.reason === null)
293
+ return analysis.state;
294
+ return ANALYSIS_REASON_TEXT[analysis.reason] ?? `${analysis.state} (${analysis.reason})`;
295
+ }
221
296
  /** Preserve the run's own result while making requested post-processing failures machine-visible. */
222
297
  function overBudgetAnalysisHint(result) {
223
298
  const estimate = result.automaticAnalysis?.result?.admission?.estimatedCostUsd ?? null;
@@ -1,7 +1,7 @@
1
1
  import { Command } from "commander";
2
2
  import type { ObserverResult, ObserverServer } from "../observer/render.js";
3
3
  import type { ExposureRequest } from "../observer/exposure.js";
4
- import { type CliIo, type LabCommandOptions } from "./io.js";
4
+ import { type CliIo, type StudyCommandOptions, type HumanOutput } from "./io.js";
5
5
  /** How a command shows an Observer, decided before the run it shows starts. */
6
6
  export interface ObserverPlan {
7
7
  port: number;
@@ -31,7 +31,7 @@ export declare function showObserver(args: {
31
31
  rendered: ObserverResult;
32
32
  }): Promise<void>;
33
33
  export declare function withObserverServer(rendered: ObserverResult, server: ObserverServer): ObserverResult;
34
- export declare function formatObserverHuman(result: ObserverResult): string;
34
+ export declare function formatObserverHuman(result: ObserverResult): HumanOutput;
35
35
  export type WatchStopSignal = "SIGINT" | "SIGTERM" | "SIGHUP";
36
36
  interface WatchSignalTarget {
37
37
  once(event: WatchStopSignal, listener: () => void): unknown;
@@ -52,5 +52,5 @@ export declare function watchExposeRequested(o: {
52
52
  allowDomain?: string[] | undefined;
53
53
  publicUrl?: string | undefined;
54
54
  }): boolean;
55
- export declare function exposureRequestFromOptions(options: LabCommandOptions): ExposureRequest;
55
+ export declare function exposureRequestFromOptions(options: StudyCommandOptions): ExposureRequest;
56
56
  export {};
@@ -1,6 +1,6 @@
1
1
  import { Command } from "commander";
2
2
  import { serveObserver } from "../observer/render.js";
3
- import { formatRunHuman, parseObserverPort, wantsJson, writeResult, } from "./io.js";
3
+ import { formatRunHuman, parseObserverPort, wantsJson, writeResult, humanError, } from "./io.js";
4
4
  /**
5
5
  * Parse --port and decide open and follow. On an invalid port it writes the failure, sets exit
6
6
  * code 2 and returns null, so a caller refuses before starting a run.
@@ -64,9 +64,8 @@ export function withObserverServer(rendered, server) {
64
64
  };
65
65
  }
66
66
  export function formatObserverHuman(result) {
67
- if (!result.ok) {
68
- return `${result.error?.code}: ${result.error?.message}\n`;
69
- }
67
+ if (!result.ok)
68
+ return humanError(result.error);
70
69
  return ([
71
70
  "humanish observer rendered",
72
71
  `run: ${result.run}`,
@@ -134,8 +133,8 @@ export function exitCodeForSignal(signal) {
134
133
  }
135
134
  }
136
135
  // True when any tunnel-edge exposure flag is present (not --safe, which is an orthogonal filter).
137
- // Used to refuse exposure on the non-lab watch path and on non-CUA backends, where there is no live
138
- // desktop to stream.
136
+ // Callers refuse exposure with it on the watch path without a study and on non-computer-use routes, where
137
+ // there is no live desktop to stream.
139
138
  export function watchExposeRequested(o) {
140
139
  return (o.expose === true ||
141
140
  o.tunnel !== undefined ||
@@ -145,7 +144,7 @@ export function watchExposeRequested(o) {
145
144
  (o.allowDomain?.length ?? 0) > 0 ||
146
145
  o.publicUrl !== undefined);
147
146
  }
148
- // Map LabCommandOptions onto the shared exposure validator input.
147
+ // Map StudyCommandOptions onto the shared exposure validator input.
149
148
  export function exposureRequestFromOptions(options) {
150
149
  return {
151
150
  expose: options.expose === true,
@@ -3,14 +3,14 @@ export interface OrientationState {
3
3
  schema: typeof ORIENTATION_SCHEMA;
4
4
  /** Whether this project has a committed `humanish/` source plane. */
5
5
  initialized: boolean;
6
- /** Committed + gitignored lab manifests discovered in this project. */
7
- labCount: number;
8
- /** Ids of a few labs worth naming in a suggestion. */
9
- labIds: string[];
6
+ /** Committed and gitignored study files found in this project. */
7
+ studyCount: number;
8
+ /** Ids of a few studies worth naming in a suggestion. */
9
+ studyIds: string[];
10
10
  /** Runs already on disk, and the most recent one if there is one. */
11
11
  runCount: number;
12
12
  latestRunId?: string;
13
- /** The commands that make sense from HERE, most useful first. */
13
+ /** The commands that make sense from here, most useful first. */
14
14
  nextCommands: OrientationCommand[];
15
15
  }
16
16
  interface OrientationCommand {
@@ -19,9 +19,12 @@ interface OrientationCommand {
19
19
  }
20
20
  /**
21
21
  * Read the project's state. Pure-ish: it only reads, never writes, and never touches the network or
22
- * a provider — bare invocation must not be able to spend money or mutate a repo.
22
+ * a provider: bare invocation must not be able to spend money or mutate a repo.
23
23
  */
24
- export declare function readOrientation(cwd: string): Promise<OrientationState>;
24
+ export declare function readOrientation(cwd: string, host?: {
25
+ platform: NodeJS.Platform;
26
+ arch: string;
27
+ }): Promise<OrientationState>;
25
28
  /**
26
29
  * The human rendering. Says where you are before it says what to do, because "what should I run"
27
30
  * has no answer that is true in every project.
@@ -1,9 +1,9 @@
1
- // What `humanish` says when you run it with no arguments (#367).
1
+ // What `humanish` says when you run it with no arguments.
2
2
  //
3
- // It used to print commander's help: sixteen subcommands before any value, identical whether you
3
+ // Commander's help would print sixteen subcommands before any value, identical whether you
4
4
  // had never run the tool or had a finished study sitting on disk. That is a poor first contact for
5
- // a human, and it is worse for a coding agent, which needs to know WHERE IT IS before it can choose
6
- // a command — help is a menu, not an orientation.
5
+ // a human, and it is worse for a coding agent, which needs to know where it is before it can choose
6
+ // a command; help is a menu, not an orientation.
7
7
  //
8
8
  // So bare invocation answers three questions instead: what is this, what state is this project in,
9
9
  // and what should I run next. The answer is derived from the project rather than fixed, so it is
@@ -12,96 +12,138 @@
12
12
  // Both audiences are served by the same data (docs/principles/three-roles.md). A human on a
13
13
  // terminal gets prose and an offer to set things up; an agent gets the same facts as stable text,
14
14
  // or as JSON with `--json`. Neither is a special case of the other bolted on afterwards.
15
- import { listLabManifests } from "../lab/discover.js";
15
+ import { listStudyManifests } from "../study/discover.js";
16
16
  import { listRuns } from "../run/stored-runs.js";
17
+ import { plural } from "../run/text.js";
18
+ import { supportsLocalBrowser } from "./first-run-path.js";
19
+ import { PRODUCT_SENTENCE } from "./product-sentence.js";
17
20
  export const ORIENTATION_SCHEMA = "humanish.orientation.v1";
18
21
  /**
19
22
  * Read the project's state. Pure-ish: it only reads, never writes, and never touches the network or
20
- * a provider — bare invocation must not be able to spend money or mutate a repo.
23
+ * a provider: bare invocation must not be able to spend money or mutate a repo.
21
24
  */
22
- export async function readOrientation(cwd) {
23
- const [labs, runs] = await Promise.all([
24
- listLabManifests(cwd).catch(() => undefined),
25
+ export async function readOrientation(cwd, host = process) {
26
+ const [found, runs] = await Promise.all([
27
+ listStudyManifests(cwd).catch(() => undefined),
25
28
  listRuns(cwd).catch(() => undefined),
26
29
  ]);
27
- const labIds = (labs?.labs ?? [])
28
- .map((lab) => lab.id)
30
+ const studyIds = (found?.studies ?? [])
31
+ .map((study) => study.id)
29
32
  .filter((id) => typeof id === "string");
30
33
  const runIds = (runs?.runs ?? [])
31
34
  .map((run) => run.runId)
32
35
  .filter((id) => typeof id === "string");
33
36
  const latest = typeof runs?.latest === "string" ? runs.latest : runIds[0];
34
- const initialized = (labs?.labs ?? []).some((lab) => lab.origin === "committed") || labIds.length > 0;
37
+ const retiredFiles = found?.retired ?? [];
38
+ const retired = {
39
+ v2: retiredFiles.filter((file) => file.code === "HUMANISH_STUDY_V2_UNSUPPORTED").length,
40
+ moved: retiredFiles.filter((file) => file.code === "HUMANISH_STUDY_RETIRED_DIRECTORY").length,
41
+ };
42
+ const initialized = (found?.studies ?? []).some((study) => study.origin === "committed") ||
43
+ studyIds.length > 0 ||
44
+ retiredFiles.length > 0;
35
45
  return {
36
46
  schema: ORIENTATION_SCHEMA,
37
47
  initialized,
38
- labCount: labIds.length,
39
- labIds: labIds.slice(0, 3),
48
+ studyCount: studyIds.length,
49
+ studyIds: studyIds.slice(0, 3),
40
50
  runCount: runIds.length,
41
51
  ...(latest === undefined ? {} : { latestRunId: latest }),
42
- nextCommands: nextCommandsFor({ initialized, labIds, hasRun: runIds.length > 0 }),
52
+ nextCommands: nextCommandsFor({
53
+ initialized,
54
+ studyIds,
55
+ retired,
56
+ hasRun: runIds.length > 0,
57
+ host,
58
+ }),
43
59
  };
44
60
  }
45
61
  /**
46
62
  * The two or three commands worth running from this state. Deliberately short: a list of everything
47
- * is what bare invocation used to print, and it is why nobody read it.
63
+ * is commander's help, which nobody reads.
48
64
  */
49
65
  function nextCommandsFor(args) {
66
+ const { v2, moved } = args.retired;
67
+ const fixes = [
68
+ ...(v2 === 0
69
+ ? []
70
+ : [
71
+ {
72
+ command: "humanish migrate --dry-run",
73
+ why: `${plural(v2, "study file")} ${v2 === 1 ? "uses" : "use"} humanish.lab.v2, which humanish no longer reads; this lists the conversion, and humanish migrate writes it`,
74
+ },
75
+ ]),
76
+ ...(moved === 0
77
+ ? []
78
+ : [
79
+ {
80
+ command: "humanish study list",
81
+ why: `${plural(moved, "study file")} ${moved === 1 ? "is" : "are"} in a labs/ directory, which humanish no longer reads; this names each one and the studies/ directory to move it to`,
82
+ },
83
+ ]),
84
+ ];
85
+ // A fix that is already `humanish study list` replaces the plain suggestion of the same command.
86
+ const named = new Set(fixes.map((fix) => fix.command));
87
+ return [...fixes, ...nextCommandsForStudies(args).filter((next) => !named.has(next.command))];
88
+ }
89
+ function nextCommandsForStudies(args) {
90
+ const dryRun = {
91
+ command: "humanish run first-run",
92
+ why: "a dry run: no browser or model runs, no keys, no spend",
93
+ };
50
94
  if (!args.initialized) {
51
95
  return [
52
- { command: "humanish init", why: "create humanish/ with a starter lab and persona" },
53
96
  {
54
- command: "humanish run first-run",
55
- why: "a synthetic run with no keys and no spend, to see the shape of the evidence",
97
+ command: "humanish init --yes",
98
+ why: "write starter studies, personas and an AGENTS.md (--dry-run lists every file first)",
56
99
  },
100
+ dryRun,
57
101
  ];
58
102
  }
59
- const suggestedLab = args.labIds[0];
60
- const commands = [
103
+ // The starter live study this host can run. The other starter studies are templates whose subject
104
+ // still names your-org/your-app, so they are never suggested.
105
+ const liveStudy = (supportsLocalBrowser(args.host.platform, args.host.arch)
106
+ ? ["local-browser", "try-live"]
107
+ : ["try-live"]).find((id) => args.studyIds.includes(id));
108
+ if (!args.hasRun) {
109
+ return [
110
+ dryRun,
111
+ liveStudy === undefined
112
+ ? { command: "humanish study list", why: "see the studies this project declares" }
113
+ : {
114
+ command: `humanish doctor --study ${liveStudy}`,
115
+ why: `check what the ${liveStudy} study still needs before a live run`,
116
+ },
117
+ ];
118
+ }
119
+ return [
120
+ ...(liveStudy === undefined
121
+ ? []
122
+ : [{ command: `humanish run ${liveStudy}`, why: "run a real participant against an app" }]),
61
123
  {
62
- command: suggestedLab ? `humanish watch ${suggestedLab}` : "humanish watch",
63
- why: "run a lab and open the Observer while it goes",
64
- },
65
- ];
66
- if (args.hasRun) {
67
- commands.push({
68
124
  command: "humanish verify --run latest",
69
125
  why: "check the last run's evidence and public-safety gates",
70
- });
71
- commands.push({
72
- command: "humanish observe --run latest",
73
- why: "reopen the last run's Observer",
74
- });
75
- }
76
- else {
77
- commands.push({ command: "humanish lab list", why: "see the labs this project declares" });
78
- commands.push({
79
- command: "humanish doctor",
80
- why: "check what this project still needs before a live run",
81
- });
82
- }
83
- return commands;
126
+ },
127
+ { command: "humanish observe --run latest", why: "reopen the last run's Observer" },
128
+ ];
84
129
  }
85
130
  /**
86
131
  * The human rendering. Says where you are before it says what to do, because "what should I run"
87
132
  * has no answer that is true in every project.
88
133
  */
89
134
  export function formatOrientationHuman(state) {
90
- const lines = [
91
- "humanish — run realistic synthetic personas against your app and keep the evidence.",
92
- "",
93
- ];
135
+ const lines = [`humanish: ${PRODUCT_SENTENCE}`, ""];
94
136
  if (!state.initialized) {
95
137
  lines.push("This project is not set up yet.");
96
138
  }
97
139
  else {
98
- const labs = state.labCount === 1 ? "1 lab" : `${state.labCount} labs`;
140
+ const studies = state.studyCount === 1 ? "1 study" : `${state.studyCount} studies`;
99
141
  const runs = state.runCount === 0
100
142
  ? "no runs yet"
101
143
  : state.runCount === 1
102
144
  ? "1 run"
103
145
  : `${state.runCount} runs`;
104
- lines.push(`This project has ${labs} and ${runs}${state.latestRunId ? ` (latest: ${state.latestRunId})` : ""}.`);
146
+ lines.push(`This project has ${studies} and ${runs}${state.latestRunId ? ` (latest: ${state.latestRunId})` : ""}.`);
105
147
  }
106
148
  lines.push("");
107
149
  for (const next of state.nextCommands) {
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The product in one sentence. Line 3 of `README.md`, package.json's description, `humanish --help`,
3
+ * bare `humanish` and the humanish skill all use it; tests/cli/product-sentence.test.ts holds them
4
+ * equal.
5
+ */
6
+ export declare const PRODUCT_SENTENCE = "Synthetic user research for apps, CLIs, and agent-facing product flows.";
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The product in one sentence. Line 3 of `README.md`, package.json's description, `humanish --help`,
3
+ * bare `humanish` and the humanish skill all use it; tests/cli/product-sentence.test.ts holds them
4
+ * equal.
5
+ */
6
+ export const PRODUCT_SENTENCE = "Synthetic user research for apps, CLIs, and agent-facing product flows.";
@@ -4,12 +4,17 @@ import { type CliIo } from "./io.js";
4
4
  /**
5
5
  * Enrich commander's flag rejections with where the flag actually lives. A bare "unknown option"
6
6
  * is accurate and unhelpful in the same way `no labs here yet` was: it reports a fact about this
7
- * command and says nothing the reader can act on. Silence is preserved when no sibling has it —
7
+ * command and says nothing the reader can act on. Silence is preserved when no sibling has it:
8
8
  * inventing a suggestion would be worse than none.
9
9
  */
10
10
  export declare function withSiblingFlagHint(text: string, root: Command): string;
11
11
  /** Drop the literal `--` that `pnpm <script> -- <args>` puts before the CLI's own arguments. */
12
12
  export declare function normalizeCliArgv(argv: string[]): string[];
13
+ /**
14
+ * The root help's examples, in the order a newcomer runs them. Each passes on a freshly
15
+ * initialized project (tests/cli/root-help-examples.test.ts).
16
+ */
17
+ export declare const ROOT_HELP_EXAMPLES: readonly ["humanish init --yes", "humanish run first-run", "humanish observe --run latest --open", "humanish doctor --study try-live", "humanish run try-live", "humanish verify --json"];
13
18
  export declare function createProgram(io?: Partial<CliIo> & {
14
19
  tuiRuntime?: Partial<TuiRuntime>;
15
20
  }): Command;