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
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
- import { deriveStudyFacts } from "./telemetry.js";
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.
@@ -89,6 +98,7 @@ export async function discoverCliKeys(args) {
89
98
  cwd: args.cwd,
90
99
  env: args.env ?? process.env,
91
100
  announce: (line) => args.io.writeErr(`${line}\n`),
101
+ ...(args.announced === undefined ? {} : { announced: args.announced }),
92
102
  });
93
103
  args.onDiscovered?.(discovered.map((fill) => fill.name));
94
104
  }
@@ -114,57 +124,98 @@ export function parseParticipantIds(value) {
114
124
  }
115
125
  return participantIds;
116
126
  }
117
- // Exported so tests/cli/program.test.ts can drive the command-boundary catch-all's
118
- // post-write guard (invocationEnvelopeAlreadyWritten above) through the same
119
- // funnel every real command uses, without duplicating its stdout-vs-formatHuman
120
- // 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 lab-less run 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
+ }
121
169
  export function writeResult(command, io, result, formatHuman) {
122
170
  const output = automaticAnalysisEnvelope(result);
123
171
  if (wantsJson(command)) {
124
- 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`);
125
174
  }
126
175
  else {
127
- io.writeOut(formatHuman(output));
176
+ writeHuman(command, io, formatHuman(output));
128
177
  if (output !== null && typeof output === "object" && "automaticAnalysis" in output) {
129
178
  const analysis = output.automaticAnalysis;
130
179
  if (analysis)
131
- io.writeOut(`analysis: ${analysis.state}${analysis.reason ? ` (${analysis.reason})` : ""}\n`);
180
+ io.writeOut(`analysis: ${analysisOutcomeText(analysis)}\n`);
181
+ const rejected = analysis?.result?.rejectedOutputPath;
182
+ if (rejected)
183
+ io.writeOut(`analysis: ${analysis.result?.error?.code ?? "rejected"}; the rejected output is kept locally at ${rejected}\n`);
132
184
  if (defaultAnalysisOverBudget(output))
133
185
  io.writeOut(overBudgetAnalysisHint(output));
134
186
  }
135
187
  }
136
188
  markInvocationEnvelopeWritten(command);
137
189
  // Every backend's result passes through here, so this is where a study's facts get read for
138
- // telemetry — not in each backend, which is how they went unreported for two releases.
139
- noteStudyFacts(command, deriveStudyFacts(result));
190
+ // telemetry. Reading them in each route instead is how they went unreported for two releases.
191
+ noteRunFacts(command, deriveRunFacts(result));
140
192
  }
141
- const studyFactsByCommand = new WeakMap();
142
- export function noteStudyFacts(command, facts) {
193
+ const runFactsByCommand = new WeakMap();
194
+ export function noteRunFacts(command, facts) {
143
195
  if (Object.keys(facts).length === 0)
144
196
  return;
145
- studyFactsByCommand.set(command, { ...studyFactsByCommand.get(command), ...facts });
197
+ runFactsByCommand.set(command, { ...runFactsByCommand.get(command), ...facts });
146
198
  }
147
199
  /** Exported for tests: the facts writeResult read off a command's result document. */
148
- export function studyFactsFor(command) {
149
- return { ...studyFactsByCommand.get(command) };
200
+ export function runFactsFor(command) {
201
+ return { ...runFactsByCommand.get(command) };
150
202
  }
203
+ /** A run result, or the preview route's study result: they differ only in `schema`. */
151
204
  export function formatRunHuman(result) {
152
- if (!result.ok) {
153
- return `${result.error?.code}: ${result.error?.message}\n`;
154
- }
205
+ if (!result.ok)
206
+ return humanError(result.error);
155
207
  return ([
156
208
  `humanish run ${result.mode}`,
157
209
  `run: ${result.runId}`,
158
- ...(result.simCount === undefined ? [] : [`sims: ${result.simCount}`]),
210
+ ...(result.simCount === undefined ? [] : [`participants: ${result.simCount}`]),
159
211
  `bundle: ${result.bundlePath}`,
160
212
  `review: ${result.reviewPath}`,
161
213
  ...result.warnings.map((warning) => `warning: ${warning}`),
162
214
  ].join("\n") + "\n");
163
215
  }
164
216
  function formatEnvFileHuman(result) {
165
- if (!result.ok) {
166
- return `${result.error?.code}: ${result.error?.message}\n`;
167
- }
217
+ if (!result.ok)
218
+ return humanError(result.error);
168
219
  return ([
169
220
  "humanish env-file loaded",
170
221
  `env-file: ${result.envFile}`,
@@ -201,7 +252,7 @@ export function candidateOption(options) {
201
252
  ...(options.finding === undefined ? {} : { finding: options.finding }),
202
253
  };
203
254
  }
204
- export function collectRepeated(value, previous) {
255
+ export function collectRepeated(value, previous = []) {
205
256
  return [...previous, value];
206
257
  }
207
258
  export function wantsJson(command) {
@@ -214,6 +265,34 @@ export function wantsJson(command) {
214
265
  }
215
266
  return false;
216
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
+ }
217
296
  /** Preserve the run's own result while making requested post-processing failures machine-visible. */
218
297
  function overBudgetAnalysisHint(result) {
219
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 LabCommandOptions, 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;
@@ -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 non-lab watch path 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 ||
@@ -10,7 +10,7 @@ export interface OrientationState {
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
@@ -14,24 +14,26 @@
14
14
  // or as JSON with `--json`. Neither is a special case of the other bolted on afterwards.
15
15
  import { listLabManifests } from "../lab/discover.js";
16
16
  import { listRuns } from "../run/stored-runs.js";
17
+ import { supportsLocalBrowser } from "./first-run-path.js";
18
+ import { PRODUCT_SENTENCE } from "./product-sentence.js";
17
19
  export const ORIENTATION_SCHEMA = "humanish.orientation.v1";
18
20
  /**
19
21
  * 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.
22
+ * a provider: bare invocation must not be able to spend money or mutate a repo.
21
23
  */
22
- export async function readOrientation(cwd) {
24
+ export async function readOrientation(cwd, host = process) {
23
25
  const [labs, runs] = await Promise.all([
24
26
  listLabManifests(cwd).catch(() => undefined),
25
27
  listRuns(cwd).catch(() => undefined),
26
28
  ]);
27
- const labIds = (labs?.labs ?? [])
29
+ const labIds = (labs?.studies ?? [])
28
30
  .map((lab) => lab.id)
29
31
  .filter((id) => typeof id === "string");
30
32
  const runIds = (runs?.runs ?? [])
31
33
  .map((run) => run.runId)
32
34
  .filter((id) => typeof id === "string");
33
35
  const latest = typeof runs?.latest === "string" ? runs.latest : runIds[0];
34
- const initialized = (labs?.labs ?? []).some((lab) => lab.origin === "committed") || labIds.length > 0;
36
+ const initialized = (labs?.studies ?? []).some((lab) => lab.origin === "committed") || labIds.length > 0;
35
37
  return {
36
38
  schema: ORIENTATION_SCHEMA,
37
39
  initialized,
@@ -39,58 +41,60 @@ export async function readOrientation(cwd) {
39
41
  labIds: labIds.slice(0, 3),
40
42
  runCount: runIds.length,
41
43
  ...(latest === undefined ? {} : { latestRunId: latest }),
42
- nextCommands: nextCommandsFor({ initialized, labIds, hasRun: runIds.length > 0 }),
44
+ nextCommands: nextCommandsFor({ initialized, labIds, hasRun: runIds.length > 0, host }),
43
45
  };
44
46
  }
45
47
  /**
46
48
  * 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.
49
+ * is commander's help, which nobody reads.
48
50
  */
49
51
  function nextCommandsFor(args) {
52
+ const dryRun = {
53
+ command: "humanish run first-run",
54
+ why: "a dry run: no browser or model runs, no keys, no spend",
55
+ };
50
56
  if (!args.initialized) {
51
57
  return [
52
- { command: "humanish init", why: "create humanish/ with a starter lab and persona" },
53
58
  {
54
- command: "humanish run first-run",
55
- why: "a synthetic run with no keys and no spend, to see the shape of the evidence",
59
+ command: "humanish init --yes",
60
+ why: "write starter labs, personas and an AGENTS.md (--dry-run lists every file first)",
56
61
  },
62
+ dryRun,
63
+ ];
64
+ }
65
+ // The starter live lab this host can run. The other starter labs are templates whose subject
66
+ // still names your-org/your-app, so they are never suggested.
67
+ const liveLab = (supportsLocalBrowser(args.host.platform, args.host.arch)
68
+ ? ["local-browser", "try-live"]
69
+ : ["try-live"]).find((id) => args.labIds.includes(id));
70
+ if (!args.hasRun) {
71
+ return [
72
+ dryRun,
73
+ liveLab === undefined
74
+ ? { command: "humanish study list", why: "see the studies this project declares" }
75
+ : {
76
+ command: `humanish doctor --study ${liveLab}`,
77
+ why: `check what the ${liveLab} study still needs before a live run`,
78
+ },
57
79
  ];
58
80
  }
59
- const suggestedLab = args.labIds[0];
60
- const commands = [
81
+ return [
82
+ ...(liveLab === undefined
83
+ ? []
84
+ : [{ command: `humanish run ${liveLab}`, why: "run a real participant against an app" }]),
61
85
  {
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
86
  command: "humanish verify --run latest",
69
87
  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;
88
+ },
89
+ { command: "humanish observe --run latest", why: "reopen the last run's Observer" },
90
+ ];
84
91
  }
85
92
  /**
86
93
  * The human rendering. Says where you are before it says what to do, because "what should I run"
87
94
  * has no answer that is true in every project.
88
95
  */
89
96
  export function formatOrientationHuman(state) {
90
- const lines = [
91
- "humanish — run realistic synthetic personas against your app and keep the evidence.",
92
- "",
93
- ];
97
+ const lines = [`humanish: ${PRODUCT_SENTENCE}`, ""];
94
98
  if (!state.initialized) {
95
99
  lines.push("This project is not set up yet.");
96
100
  }
@@ -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;