humanish 0.106.1 → 0.108.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (668) hide show
  1. package/ARCHITECTURE.md +38 -32
  2. package/CHANGELOG.md +28 -0
  3. package/CONTEXT.md +51 -41
  4. package/README.md +152 -174
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-client.js +2 -1
  14. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  15. package/dist/actors/codex/app-server-trace.js +1 -3
  16. package/dist/actors/codex/app-server-ui.js +1 -1
  17. package/dist/actors/codex/app-server.js +2 -1
  18. package/dist/actors/codex/codex-admission.d.ts +91 -0
  19. package/dist/actors/codex/codex-admission.js +150 -0
  20. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  21. package/dist/actors/codex/protocol-compat.js +357 -0
  22. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  23. package/dist/actors/codex/protocol-contract.js +471 -0
  24. package/dist/actors/codex/restricted-executable.d.ts +28 -4
  25. package/dist/actors/codex/restricted-executable.js +104 -29
  26. package/dist/actors/codex/restricted-launch.d.ts +9 -2
  27. package/dist/actors/codex/restricted-launch.js +43 -4
  28. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  29. package/dist/actors/codex/restricted-notifications.js +277 -0
  30. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  31. package/dist/actors/codex/restricted-participant.js +66 -6
  32. package/dist/actors/codex/restricted-policy.d.ts +11 -3
  33. package/dist/actors/codex/restricted-policy.js +2 -2
  34. package/dist/actors/codex/restricted-session.d.ts +16 -3
  35. package/dist/actors/codex/restricted-session.js +60 -22
  36. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  37. package/dist/actors/codex/restricted-transport.js +139 -27
  38. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  39. package/dist/actors/codex/restricted-turn.js +43 -30
  40. package/dist/actors/computer-use/actor.d.ts +17 -17
  41. package/dist/actors/computer-use/actor.js +6 -6
  42. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  43. package/dist/actors/computer-use/admission-limit.js +1 -1
  44. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  45. package/dist/actors/computer-use/loop/actions.js +10 -10
  46. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  47. package/dist/actors/computer-use/loop/backstop.js +15 -13
  48. package/dist/actors/computer-use/loop/ending.d.ts +7 -7
  49. package/dist/actors/computer-use/loop/ending.js +9 -9
  50. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  51. package/dist/actors/computer-use/loop/observation.js +9 -9
  52. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  53. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  54. package/dist/actors/computer-use/loop/session.js +3 -3
  55. package/dist/actors/computer-use/loop/spend.d.ts +2 -2
  56. package/dist/actors/computer-use/loop/spend.js +4 -4
  57. package/dist/actors/computer-use/loop/trace.js +11 -10
  58. package/dist/actors/computer-use/loop/types.d.ts +37 -26
  59. package/dist/actors/computer-use/loop/usage.js +2 -2
  60. package/dist/actors/computer-use/loop.js +4 -4
  61. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  62. package/dist/actors/computer-use/openai-context.js +214 -0
  63. package/dist/actors/computer-use/openai-provider.d.ts +12 -9
  64. package/dist/actors/computer-use/openai-provider.js +47 -36
  65. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  66. package/dist/actors/computer-use/openai-requests.js +82 -15
  67. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  68. package/dist/actors/computer-use/openai-wire.js +36 -34
  69. package/dist/actors/contract.d.ts +86 -49
  70. package/dist/actors/contract.js +29 -23
  71. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  72. package/dist/actors/local-agent/claude-session.js +10 -9
  73. package/dist/actors/local-agent/cli.d.ts +8 -6
  74. package/dist/actors/local-agent/cli.js +24 -28
  75. package/dist/actors/local-agent/readiness.d.ts +2 -2
  76. package/dist/actors/local-agent/readiness.js +4 -4
  77. package/dist/actors/reasoning-effort.js +6 -6
  78. package/dist/actors/registry.d.ts +10 -10
  79. package/dist/actors/registry.js +18 -17
  80. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  81. package/dist/actors/scripted-browser/actor.js +16 -16
  82. package/dist/actors/scripted-browser/browser-command.js +1 -1
  83. package/dist/actors/scripted-browser/journey.js +15 -4
  84. package/dist/actors/scripted-browser/steps.js +19 -1
  85. package/dist/actors/scripted-browser/types.d.ts +12 -2
  86. package/dist/actors/stop-conditions.d.ts +1 -1
  87. package/dist/actors/stop-conditions.js +1 -3
  88. package/dist/analysis/automatic-completion.d.ts +13 -8
  89. package/dist/analysis/automatic-completion.js +14 -8
  90. package/dist/analysis/automatic-config.d.ts +1 -1
  91. package/dist/analysis/automatic-config.js +2 -2
  92. package/dist/analysis/automatic.d.ts +10 -4
  93. package/dist/analysis/automatic.js +17 -13
  94. package/dist/analysis/codex-config.d.ts +6 -2
  95. package/dist/analysis/codex-config.js +22 -14
  96. package/dist/analysis/diagnostics.d.ts +23 -0
  97. package/dist/analysis/diagnostics.js +112 -0
  98. package/dist/analysis/evidence-sources.js +2 -2
  99. package/dist/analysis/evidence.js +6 -6
  100. package/dist/analysis/execute.d.ts +7 -1
  101. package/dist/analysis/execute.js +39 -12
  102. package/dist/analysis/job.d.ts +8 -5
  103. package/dist/analysis/job.js +15 -14
  104. package/dist/analysis/load.d.ts +1 -1
  105. package/dist/analysis/load.js +5 -5
  106. package/dist/analysis/provider.d.ts +9 -1
  107. package/dist/analysis/restricted-codex.d.ts +2 -0
  108. package/dist/analysis/restricted-codex.js +10 -1
  109. package/dist/analysis/service.d.ts +2 -0
  110. package/dist/analysis/service.js +35 -16
  111. package/dist/analysis/sharing.d.ts +2 -2
  112. package/dist/analysis/sharing.js +5 -5
  113. package/dist/analysis/store-executions.d.ts +5 -5
  114. package/dist/analysis/store-executions.js +12 -12
  115. package/dist/analysis/store.d.ts +4 -4
  116. package/dist/analysis/store.js +13 -13
  117. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  118. package/dist/cli/commands/analysis-signals.js +4 -1
  119. package/dist/cli/commands/analyze.js +23 -18
  120. package/dist/cli/commands/codex.js +9 -9
  121. package/dist/cli/commands/comms.js +62 -34
  122. package/dist/cli/commands/feedback.js +20 -21
  123. package/dist/cli/commands/lab-format.d.ts +5 -4
  124. package/dist/cli/commands/lab-format.js +35 -23
  125. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  126. package/dist/cli/commands/lab-route-computer-use.js +32 -21
  127. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  128. package/dist/cli/commands/lab-route-preview.js +7 -7
  129. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  130. package/dist/cli/commands/lab-route-run.js +6 -2
  131. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  132. package/dist/cli/commands/lab-route-scripted.js +0 -1
  133. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  134. package/dist/cli/commands/lab-route-shared-world.js +3 -4
  135. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  136. package/dist/cli/commands/lab-route-terminal.js +0 -1
  137. package/dist/cli/commands/lab-run.js +84 -54
  138. package/dist/cli/commands/lab-scorer.d.ts +2 -4
  139. package/dist/cli/commands/lab-scorer.js +1 -1
  140. package/dist/cli/commands/migrate.d.ts +4 -0
  141. package/dist/cli/commands/migrate.js +65 -0
  142. package/dist/cli/commands/observe.js +168 -107
  143. package/dist/cli/commands/run-command.d.ts +10 -0
  144. package/dist/cli/commands/run-command.js +85 -0
  145. package/dist/cli/commands/run-signals.d.ts +30 -0
  146. package/dist/cli/commands/run-signals.js +146 -0
  147. package/dist/cli/commands/runs.js +137 -136
  148. package/dist/cli/commands/setup.d.ts +2 -2
  149. package/dist/cli/commands/setup.js +26 -21
  150. package/dist/cli/commands/study.d.ts +3 -0
  151. package/dist/cli/commands/study.js +182 -0
  152. package/dist/cli/commands/tui.d.ts +4 -4
  153. package/dist/cli/commands/tui.js +21 -21
  154. package/dist/cli/commands/watch.js +64 -77
  155. package/dist/cli/deprecations.d.ts +18 -0
  156. package/dist/cli/deprecations.js +48 -0
  157. package/dist/cli/doctor.d.ts +18 -5
  158. package/dist/cli/doctor.js +111 -48
  159. package/dist/cli/first-run-path.d.ts +12 -10
  160. package/dist/cli/first-run-path.js +30 -28
  161. package/dist/cli/io.d.ts +46 -10
  162. package/dist/cli/io.js +109 -30
  163. package/dist/cli/observer-follow.d.ts +2 -2
  164. package/dist/cli/observer-follow.js +5 -6
  165. package/dist/cli/orientation.d.ts +6 -3
  166. package/dist/cli/orientation.js +43 -39
  167. package/dist/cli/product-sentence.d.ts +6 -0
  168. package/dist/cli/product-sentence.js +6 -0
  169. package/dist/cli/program.d.ts +6 -1
  170. package/dist/cli/program.js +112 -43
  171. package/dist/cli/telemetry.d.ts +17 -17
  172. package/dist/cli/telemetry.js +49 -41
  173. package/dist/cli.js +1 -1
  174. package/dist/comms/capture-surface.d.ts +14 -13
  175. package/dist/comms/capture-surface.js +23 -22
  176. package/dist/comms/catch-host.d.ts +8 -8
  177. package/dist/comms/catch-host.js +14 -14
  178. package/dist/comms/connections.js +4 -4
  179. package/dist/comms/email-catch.d.ts +3 -3
  180. package/dist/comms/email-catch.js +8 -8
  181. package/dist/comms/external-evidence.d.ts +27 -0
  182. package/dist/comms/external-evidence.js +93 -0
  183. package/dist/comms/extract.js +2 -2
  184. package/dist/comms/fake-inbox.d.ts +2 -2
  185. package/dist/comms/fake-inbox.js +2 -2
  186. package/dist/comms/lease-store.js +7 -7
  187. package/dist/comms/receiving-render.d.ts +1 -1
  188. package/dist/comms/receiving-render.js +2 -2
  189. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  190. package/dist/comms/sandbox-catch-script.js +6 -6
  191. package/dist/comms/sandbox-catch.d.ts +36 -37
  192. package/dist/comms/sandbox-catch.js +34 -35
  193. package/dist/comms/setup.js +42 -8
  194. package/dist/comms/thread-evidence.d.ts +1 -1
  195. package/dist/comms/thread-evidence.js +6 -6
  196. package/dist/comms/types.d.ts +6 -6
  197. package/dist/comms/types.js +4 -4
  198. package/dist/evidence/browser-hygiene.d.ts +1 -1
  199. package/dist/evidence/browser-hygiene.js +1 -1
  200. package/dist/evidence/frame-signature.d.ts +1 -1
  201. package/dist/evidence/frame-signature.js +4 -4
  202. package/dist/evidence/redaction.d.ts +3 -3
  203. package/dist/evidence/redaction.js +5 -5
  204. package/dist/evidence/secret-scrub.d.ts +9 -0
  205. package/dist/evidence/secret-scrub.js +96 -0
  206. package/dist/feedback/draft.js +41 -85
  207. package/dist/feedback/export-bundle.js +5 -5
  208. package/dist/feedback/export.d.ts +5 -1
  209. package/dist/feedback/export.js +16 -17
  210. package/dist/feedback/feedback.d.ts +3 -3
  211. package/dist/feedback/feedback.js +21 -3
  212. package/dist/guest/chromium-text.js +2 -2
  213. package/dist/guest/desktop-native.d.ts +1 -1
  214. package/dist/guest/runtime.js +1 -1
  215. package/dist/index.d.ts +14 -15
  216. package/dist/index.js +10 -11
  217. package/dist/keys/key-resolution.d.ts +7 -5
  218. package/dist/keys/key-resolution.js +40 -38
  219. package/dist/lab/adapter-extension.d.ts +35 -13
  220. package/dist/lab/adapter-extension.js +50 -134
  221. package/dist/lab/adapter-scorer-loader.d.ts +32 -12
  222. package/dist/lab/adapter-scorer-loader.js +56 -32
  223. package/dist/lab/composition-rules.js +58 -58
  224. package/dist/lab/config.js +85 -43
  225. package/dist/lab/deprecated-fields.d.ts +10 -0
  226. package/dist/lab/deprecated-fields.js +24 -0
  227. package/dist/lab/device-presets.d.ts +10 -10
  228. package/dist/lab/device-presets.js +11 -11
  229. package/dist/lab/discover.d.ts +13 -9
  230. package/dist/lab/discover.js +118 -60
  231. package/dist/lab/doctor.d.ts +53 -11
  232. package/dist/lab/doctor.js +193 -47
  233. package/dist/lab/init-plan.js +1 -3
  234. package/dist/lab/init-templates.js +147 -147
  235. package/dist/lab/init.d.ts +1 -1
  236. package/dist/lab/init.js +41 -9
  237. package/dist/lab/keys.d.ts +2 -0
  238. package/dist/lab/keys.js +43 -9
  239. package/dist/lab/lab-deps.d.ts +80 -0
  240. package/dist/lab/lab-deps.js +4 -0
  241. package/dist/lab/parse/actors.js +17 -16
  242. package/dist/lab/parse/comms.js +8 -7
  243. package/dist/lab/parse/execution.js +15 -14
  244. package/dist/lab/parse/study-v3.d.ts +23 -0
  245. package/dist/lab/parse/study-v3.js +259 -0
  246. package/dist/lab/parse/subject-state.d.ts +7 -7
  247. package/dist/lab/parse/subject-state.js +18 -17
  248. package/dist/lab/parse/subject.js +30 -29
  249. package/dist/lab/parse/values.d.ts +1 -2
  250. package/dist/lab/parse/values.js +3 -6
  251. package/dist/lab/persona-resolve.d.ts +7 -7
  252. package/dist/lab/persona-resolve.js +8 -8
  253. package/dist/lab/persona.js +1 -3
  254. package/dist/lab/plan-base.d.ts +0 -2
  255. package/dist/lab/plan-base.js +6 -4
  256. package/dist/lab/plan-participants.d.ts +7 -7
  257. package/dist/lab/plan-participants.js +2 -2
  258. package/dist/lab/plan-types.d.ts +26 -8
  259. package/dist/lab/plan.d.ts +4 -18
  260. package/dist/lab/plan.js +24 -79
  261. package/dist/lab/preflight-probes.js +11 -11
  262. package/dist/lab/preflight-result.d.ts +2 -1
  263. package/dist/lab/preflight-result.js +5 -6
  264. package/dist/lab/preflight.d.ts +7 -8
  265. package/dist/lab/preflight.js +6 -6
  266. package/dist/lab/requirements.d.ts +20 -0
  267. package/dist/lab/requirements.js +54 -0
  268. package/dist/lab/route-inputs.d.ts +23 -12
  269. package/dist/lab/route-inputs.js +48 -51
  270. package/dist/lab/routing.d.ts +42 -41
  271. package/dist/lab/routing.js +66 -68
  272. package/dist/lab/run-lab-events.d.ts +3 -11
  273. package/dist/lab/run-lab-events.js +2 -16
  274. package/dist/lab/run-lab-homes.d.ts +76 -0
  275. package/dist/lab/run-lab-homes.js +7 -0
  276. package/dist/lab/run-lab-options.d.ts +12 -66
  277. package/dist/lab/run-lab-options.js +58 -285
  278. package/dist/lab/summary.d.ts +15 -9
  279. package/dist/lab/summary.js +24 -17
  280. package/dist/lab/tasks.d.ts +15 -15
  281. package/dist/lab/tasks.js +14 -14
  282. package/dist/lab/types.d.ts +201 -195
  283. package/dist/lab/types.js +2 -0
  284. package/dist/lab/validation.d.ts +21 -21
  285. package/dist/lab/validation.js +61 -59
  286. package/dist/lab/warnings.d.ts +10 -0
  287. package/dist/lab/warnings.js +70 -41
  288. package/dist/library-aliases.d.ts +56 -0
  289. package/dist/library-aliases.js +22 -0
  290. package/dist/observer/artifact.d.ts +2 -2
  291. package/dist/observer/artifact.js +9 -9
  292. package/dist/observer/data.d.ts +6 -6
  293. package/dist/observer/data.js +7 -6
  294. package/dist/observer/exposure.d.ts +1 -1
  295. package/dist/observer/exposure.js +11 -11
  296. package/dist/observer/http.js +1 -1
  297. package/dist/observer/library.d.ts +1 -1
  298. package/dist/observer/library.js +4 -2
  299. package/dist/observer/listen.js +5 -4
  300. package/dist/observer/render.d.ts +1 -1
  301. package/dist/observer/render.js +12 -7
  302. package/dist/observer/run-routes.d.ts +4 -4
  303. package/dist/observer/run-routes.js +6 -6
  304. package/dist/observer/serve.d.ts +17 -0
  305. package/dist/observer/serve.js +41 -6
  306. package/dist/observer/tunnel.js +1 -1
  307. package/dist/observer-app.html +4 -4
  308. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  309. package/dist/routes/computer-use/bundle-parts.js +24 -17
  310. package/dist/routes/computer-use/bundle.d.ts +4 -11
  311. package/dist/routes/computer-use/bundle.js +12 -18
  312. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  313. package/dist/routes/computer-use/diagnostics.js +1 -1
  314. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
  315. package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
  316. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  317. package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
  318. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
  319. package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
  320. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  321. package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
  322. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  323. package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
  324. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  325. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  326. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  327. package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
  328. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  329. package/dist/routes/computer-use/external-comms.js +19 -43
  330. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  331. package/dist/routes/computer-use/fanout-bundle.js +38 -42
  332. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
  333. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  334. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  335. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  336. package/dist/routes/computer-use/live-flush.js +20 -28
  337. package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
  338. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
  339. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  340. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  341. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  342. package/dist/routes/computer-use/local-vm.js +40 -67
  343. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  344. package/dist/routes/computer-use/participant-desktop.js +5 -25
  345. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
  346. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
  347. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  348. package/dist/routes/computer-use/participant-facts.js +12 -1
  349. package/dist/routes/computer-use/participant-model.d.ts +25 -11
  350. package/dist/routes/computer-use/participant-model.js +76 -34
  351. package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
  352. package/dist/routes/computer-use/participant-prompt.js +8 -8
  353. package/dist/routes/computer-use/participant-runs.d.ts +11 -11
  354. package/dist/routes/computer-use/participant-runs.js +18 -18
  355. package/dist/routes/computer-use/plan.d.ts +21 -29
  356. package/dist/routes/computer-use/plan.js +70 -78
  357. package/dist/routes/computer-use/preflight.d.ts +3 -5
  358. package/dist/routes/computer-use/preflight.js +40 -36
  359. package/dist/routes/computer-use/rerun-selection.js +11 -7
  360. package/dist/routes/computer-use/result.d.ts +1 -1
  361. package/dist/routes/computer-use/result.js +48 -38
  362. package/dist/routes/computer-use/route.d.ts +5 -5
  363. package/dist/routes/computer-use/route.js +36 -33
  364. package/dist/routes/computer-use/self-report.d.ts +8 -8
  365. package/dist/routes/computer-use/self-report.js +33 -33
  366. package/dist/routes/computer-use/setup.d.ts +9 -15
  367. package/dist/routes/computer-use/setup.js +106 -83
  368. package/dist/routes/computer-use/single-bundle.d.ts +13 -16
  369. package/dist/routes/computer-use/single-bundle.js +46 -53
  370. package/dist/routes/computer-use/subject-projection.d.ts +6 -8
  371. package/dist/routes/computer-use/subject-projection.js +24 -23
  372. package/dist/routes/computer-use/types.d.ts +195 -238
  373. package/dist/routes/computer-use/types.js +21 -13
  374. package/dist/routes/preview.d.ts +8 -2
  375. package/dist/routes/preview.js +8 -5
  376. package/dist/routes/scripted/bundle.d.ts +5 -8
  377. package/dist/routes/scripted/bundle.js +23 -27
  378. package/dist/routes/scripted/plan.d.ts +6 -8
  379. package/dist/routes/scripted/plan.js +15 -13
  380. package/dist/routes/scripted/result.d.ts +4 -1
  381. package/dist/routes/scripted/result.js +15 -11
  382. package/dist/routes/scripted/route.js +15 -17
  383. package/dist/routes/scripted/scenario.d.ts +1 -1
  384. package/dist/routes/scripted/scenario.js +3 -3
  385. package/dist/routes/scripted/setup.d.ts +3 -2
  386. package/dist/routes/scripted/setup.js +27 -26
  387. package/dist/routes/scripted/subject.d.ts +8 -3
  388. package/dist/routes/scripted/subject.js +10 -6
  389. package/dist/routes/scripted/surface-records.js +4 -4
  390. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  391. package/dist/routes/scripted/surface-sessions.js +4 -4
  392. package/dist/routes/scripted/types.d.ts +21 -40
  393. package/dist/routes/scripted/types.js +2 -3
  394. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
  395. package/dist/routes/shared-world/bundle.d.ts +7 -7
  396. package/dist/routes/shared-world/bundle.js +60 -62
  397. package/dist/routes/shared-world/checkpoints.d.ts +5 -5
  398. package/dist/routes/shared-world/checkpoints.js +5 -5
  399. package/dist/routes/shared-world/comms.d.ts +8 -7
  400. package/dist/routes/shared-world/comms.js +38 -51
  401. package/dist/routes/shared-world/external-public.d.ts +6 -5
  402. package/dist/routes/shared-world/external-public.js +28 -25
  403. package/dist/routes/shared-world/handoff.d.ts +10 -9
  404. package/dist/routes/shared-world/handoff.js +89 -81
  405. package/dist/routes/shared-world/lobby-code.d.ts +7 -7
  406. package/dist/routes/shared-world/lobby-code.js +22 -22
  407. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
  408. package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
  409. package/dist/routes/shared-world/plan.d.ts +2 -6
  410. package/dist/routes/shared-world/plan.js +8 -9
  411. package/dist/routes/shared-world/provenance.d.ts +4 -4
  412. package/dist/routes/shared-world/provenance.js +4 -4
  413. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  414. package/dist/routes/shared-world/provisioned.js +55 -48
  415. package/dist/routes/shared-world/result.js +47 -36
  416. package/dist/routes/shared-world/route.js +54 -57
  417. package/dist/routes/shared-world/setup.d.ts +6 -5
  418. package/dist/routes/shared-world/setup.js +16 -18
  419. package/dist/routes/shared-world/types.d.ts +70 -141
  420. package/dist/routes/shared-world/types.js +5 -5
  421. package/dist/routes/terminal/adapter.d.ts +10 -10
  422. package/dist/routes/terminal/adapter.js +32 -129
  423. package/dist/routes/terminal/bundle.d.ts +10 -15
  424. package/dist/routes/terminal/bundle.js +43 -52
  425. package/dist/routes/terminal/credentials.d.ts +4 -4
  426. package/dist/routes/terminal/credentials.js +20 -20
  427. package/dist/routes/terminal/dry-run.d.ts +1 -1
  428. package/dist/routes/terminal/dry-run.js +13 -15
  429. package/dist/routes/terminal/encoding.d.ts +1 -1
  430. package/dist/routes/terminal/encoding.js +4 -4
  431. package/dist/routes/terminal/ledger.d.ts +8 -8
  432. package/dist/routes/terminal/ledger.js +22 -22
  433. package/dist/routes/terminal/live-finish.d.ts +1 -2
  434. package/dist/routes/terminal/live-finish.js +24 -23
  435. package/dist/routes/terminal/live-sandbox.d.ts +3 -2
  436. package/dist/routes/terminal/live-sandbox.js +31 -32
  437. package/dist/routes/terminal/participant-text.d.ts +23 -0
  438. package/dist/routes/terminal/participant-text.js +165 -0
  439. package/dist/routes/terminal/persona.js +1 -1
  440. package/dist/routes/terminal/plan.d.ts +2 -6
  441. package/dist/routes/terminal/plan.js +23 -19
  442. package/dist/routes/terminal/recorder.d.ts +6 -1
  443. package/dist/routes/terminal/recorder.js +12 -4
  444. package/dist/routes/terminal/result.js +12 -12
  445. package/dist/routes/terminal/route.js +30 -31
  446. package/dist/routes/terminal/runtime.d.ts +3 -2
  447. package/dist/routes/terminal/runtime.js +3 -3
  448. package/dist/routes/terminal/sandbox.d.ts +4 -4
  449. package/dist/routes/terminal/sandbox.js +10 -10
  450. package/dist/routes/terminal/session.js +22 -19
  451. package/dist/routes/terminal/token-usage.d.ts +1 -1
  452. package/dist/routes/terminal/token-usage.js +10 -11
  453. package/dist/routes/terminal/trace.d.ts +7 -10
  454. package/dist/routes/terminal/trace.js +11 -66
  455. package/dist/routes/terminal/types.d.ts +104 -114
  456. package/dist/routes/terminal/types.js +12 -7
  457. package/dist/run/active-runs.d.ts +13 -0
  458. package/dist/run/active-runs.js +12 -0
  459. package/dist/run/bundle-shape.d.ts +2 -1
  460. package/dist/run/bundle-shape.js +7 -7
  461. package/dist/run/bundle.d.ts +99 -92
  462. package/dist/run/bundle.js +10 -8
  463. package/dist/run/cost-summary.js +6 -5
  464. package/dist/run/costs.d.ts +6 -6
  465. package/dist/run/costs.js +17 -11
  466. package/dist/run/detail.d.ts +9 -9
  467. package/dist/run/detail.js +10 -10
  468. package/dist/run/dry-run-inputs.js +1 -1
  469. package/dist/run/dry-run.js +23 -30
  470. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  471. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  472. package/dist/run/feedback-shape.js +1 -1
  473. package/dist/run/judge.d.ts +34 -16
  474. package/dist/run/judge.js +41 -14
  475. package/dist/run/locate.d.ts +2 -0
  476. package/dist/run/locate.js +3 -1
  477. package/dist/run/outcomes.d.ts +3 -3
  478. package/dist/run/outcomes.js +3 -3
  479. package/dist/run/participant-records.d.ts +2 -2
  480. package/dist/run/participant-records.js +2 -2
  481. package/dist/run/paths.d.ts +1 -1
  482. package/dist/run/paths.js +2 -2
  483. package/dist/run/pricing.d.ts +30 -15
  484. package/dist/run/pricing.js +49 -30
  485. package/dist/run/projection.d.ts +27 -27
  486. package/dist/run/projection.js +23 -23
  487. package/dist/run/reclaim.d.ts +6 -0
  488. package/dist/run/reclaim.js +15 -5
  489. package/dist/run/results.d.ts +5 -5
  490. package/dist/run/run-index.d.ts +9 -7
  491. package/dist/run/run-index.js +24 -25
  492. package/dist/run/run-not-found.d.ts +5 -0
  493. package/dist/run/run-not-found.js +15 -0
  494. package/dist/run/run.d.ts +7 -4
  495. package/dist/run/run.js +10 -6
  496. package/dist/run/sandbox-receipts.d.ts +5 -5
  497. package/dist/run/sandbox-receipts.js +6 -6
  498. package/dist/run/shared-world-evidence.d.ts +67 -66
  499. package/dist/run/shared-world-evidence.js +4 -4
  500. package/dist/run/shared-world-shape.d.ts +3 -3
  501. package/dist/run/shared-world-shape.js +16 -16
  502. package/dist/run/stats.d.ts +17 -11
  503. package/dist/run/stats.js +124 -66
  504. package/dist/run/status.d.ts +21 -32
  505. package/dist/run/status.js +34 -33
  506. package/dist/run/stored-runs.js +2 -1
  507. package/dist/run/stream-shape.js +1 -1
  508. package/dist/run/streams.d.ts +29 -22
  509. package/dist/run/study-provenance.d.ts +47 -0
  510. package/dist/run/study-provenance.js +63 -0
  511. package/dist/run/study-result.d.ts +16 -0
  512. package/dist/run/study-result.js +9 -0
  513. package/dist/run/terminal-contract.d.ts +5 -5
  514. package/dist/run/terminal-contract.js +4 -4
  515. package/dist/run/text.d.ts +2 -0
  516. package/dist/run/text.js +4 -0
  517. package/dist/run/transient-comms-secrets.d.ts +5 -0
  518. package/dist/run/transient-comms-secrets.js +12 -0
  519. package/dist/run-lab.d.ts +40 -38
  520. package/dist/run-lab.js +42 -40
  521. package/dist/study/convert.d.ts +33 -0
  522. package/dist/study/convert.js +432 -0
  523. package/dist/study/field-paths.d.ts +12 -0
  524. package/dist/study/field-paths.js +126 -0
  525. package/dist/study/files.d.ts +26 -0
  526. package/dist/study/files.js +43 -0
  527. package/dist/study/migrate.d.ts +48 -0
  528. package/dist/study/migrate.js +408 -0
  529. package/dist/study/owned-files.d.ts +38 -0
  530. package/dist/study/owned-files.js +182 -0
  531. package/dist/subject/clone.d.ts +1 -1
  532. package/dist/subject/desktop-cli.d.ts +2 -2
  533. package/dist/subject/desktop-cli.js +3 -3
  534. package/dist/subject/local-tree-archive.d.ts +1 -1
  535. package/dist/subject/local-tree-archive.js +5 -5
  536. package/dist/subject/local-tree.d.ts +3 -3
  537. package/dist/subject/local-tree.js +1 -1
  538. package/dist/subject/node-bootstrap.d.ts +1 -1
  539. package/dist/subject/node-bootstrap.js +4 -4
  540. package/dist/subject/runtime.js +10 -11
  541. package/dist/subject/serve.d.ts +1 -1
  542. package/dist/subject/serve.js +4 -4
  543. package/dist/subject/state.d.ts +1 -1
  544. package/dist/subject/steps.d.ts +8 -8
  545. package/dist/subject/steps.js +7 -7
  546. package/dist/substrates/command-failure.d.ts +3 -3
  547. package/dist/substrates/command-failure.js +3 -3
  548. package/dist/substrates/detached.d.ts +6 -6
  549. package/dist/substrates/detached.js +7 -7
  550. package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
  551. package/dist/substrates/e2b/cdp-probe.js +15 -18
  552. package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
  553. package/dist/substrates/e2b/desktop-browser.js +12 -12
  554. package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
  555. package/dist/substrates/e2b/desktop-cdp.js +11 -11
  556. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  557. package/dist/substrates/e2b/desktop-executor.js +1 -1
  558. package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
  559. package/dist/substrates/e2b/desktop-geometry.js +9 -9
  560. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  561. package/dist/substrates/e2b/desktop-media.js +3 -3
  562. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  563. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  564. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  565. package/dist/substrates/e2b/sandbox.js +2 -2
  566. package/dist/substrates/e2b/sdk.d.ts +11 -11
  567. package/dist/substrates/e2b/sdk.js +8 -8
  568. package/dist/substrates/local/runtime-host.d.ts +2 -0
  569. package/dist/substrates/local/runtime-host.js +6 -0
  570. package/dist/tui/actions.d.ts +8 -6
  571. package/dist/tui/actions.js +31 -22
  572. package/dist/tui/contract.d.ts +16 -16
  573. package/dist/tui/contract.js +10 -10
  574. package/dist/tui/launch.d.ts +4 -4
  575. package/dist/tui/launch.js +18 -19
  576. package/dist/tui/project.js +5 -5
  577. package/dist/tui-app.js +83 -83
  578. package/dist/verify/actor.d.ts +14 -14
  579. package/dist/verify/actor.js +45 -45
  580. package/dist/verify/artifacts.d.ts +3 -3
  581. package/dist/verify/artifacts.js +6 -6
  582. package/dist/verify/context-growth.d.ts +9 -0
  583. package/dist/verify/context-growth.js +62 -0
  584. package/dist/verify/costs.d.ts +7 -7
  585. package/dist/verify/costs.js +9 -9
  586. package/dist/verify/liveness.d.ts +1 -1
  587. package/dist/verify/liveness.js +4 -1
  588. package/dist/verify/rerun.d.ts +1 -1
  589. package/dist/verify/rerun.js +1 -1
  590. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  591. package/dist/verify/shared-world-concurrent.js +79 -76
  592. package/dist/verify/shared-world.d.ts +2 -2
  593. package/dist/verify/shared-world.js +18 -18
  594. package/dist/verify/subject.d.ts +4 -4
  595. package/dist/verify/subject.js +18 -18
  596. package/dist/verify/verify.js +98 -49
  597. package/docs/README.md +26 -33
  598. package/docs/architecture/actor-contract.md +105 -98
  599. package/docs/architecture/desktop-sessions.md +14 -14
  600. package/docs/architecture/external-public-shared-world.md +66 -59
  601. package/docs/architecture/github-feedback-loop.md +1 -4
  602. package/docs/architecture/guest-desktop.md +2 -2
  603. package/docs/architecture/observer.md +37 -37
  604. package/docs/architecture/restricted-codex-analysis.md +70 -30
  605. package/docs/architecture/serve.md +34 -37
  606. package/docs/architecture/state-driven-executor.md +55 -59
  607. package/docs/architecture/task-protocol-support.md +7 -9
  608. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
  609. package/docs/contracts/README.md +24 -0
  610. package/docs/contracts/adapter-admission.md +3 -3
  611. package/docs/contracts/adapter-fixtures.md +2 -5
  612. package/docs/contracts/core.md +1 -3
  613. package/docs/contracts/errors.md +62 -0
  614. package/docs/contracts/feedback.md +8 -9
  615. package/docs/contracts/policy.md +7 -12
  616. package/docs/contracts/run-bundle.md +54 -51
  617. package/docs/contracts/schemas.md +505 -390
  618. package/docs/contracts/study-analysis.md +26 -2
  619. package/docs/contracts/study-costs.md +11 -7
  620. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  621. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  622. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  623. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  624. package/docs/principles/actor-fidelity.md +4 -4
  625. package/docs/principles/engineering.md +3 -3
  626. package/docs/principles/invariants-and-defaults.md +38 -38
  627. package/docs/principles/self-driving-harness.md +1 -5
  628. package/docs/principles/three-roles.md +1 -1
  629. package/docs/product/automatic-analysis.md +8 -7
  630. package/examples/participant/README.md +5 -5
  631. package/examples/participant/run.mjs +11 -10
  632. package/examples/scorer/README.md +3 -3
  633. package/examples/scorer/run.mjs +11 -12
  634. package/package.json +16 -17
  635. package/skills/humanish/SKILL.md +63 -60
  636. package/skills/humanish/agents/openai.yaml +1 -1
  637. package/AGENTS.md +0 -99
  638. package/CONTRIBUTING.md +0 -148
  639. package/dist/actors/codex/qualified-versions.d.ts +0 -45
  640. package/dist/actors/codex/qualified-versions.js +0 -87
  641. package/dist/cli/commands/lab.d.ts +0 -3
  642. package/dist/cli/commands/lab.js +0 -193
  643. package/dist/deprecated.d.ts +0 -90
  644. package/dist/deprecated.js +0 -106
  645. package/dist/lab/bag-overrides.d.ts +0 -18
  646. package/dist/lab/bag-overrides.js +0 -121
  647. package/dist/observer/static.d.ts +0 -39
  648. package/dist/observer/static.js +0 -369
  649. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  650. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  651. package/docs/architecture/comms-inbox.md +0 -122
  652. package/docs/architecture/desktop-recording.md +0 -80
  653. package/docs/architecture/local-browser-runtime.md +0 -178
  654. package/docs/architecture/observer-review.md +0 -144
  655. package/docs/architecture/participant-media.md +0 -90
  656. package/docs/architecture/project-layout.md +0 -62
  657. package/docs/architecture/real-email-receiving.md +0 -136
  658. package/docs/assets/humanish-drawdb-hero.png +0 -0
  659. package/docs/assets/humanish-observer-hero.png +0 -0
  660. package/docs/goals/current.md +0 -207
  661. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  662. package/docs/product/open-source-install-experience.md +0 -240
  663. package/docs/ramp/README.md +0 -294
  664. package/docs/release/open-source-readiness.md +0 -222
  665. package/docs/release/public-readiness-standard.md +0 -210
  666. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  667. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  668. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -1,146 +1,60 @@
1
+ import path from "node:path";
1
2
  import { Command, Option } from "commander";
3
+ import { shellQuote } from "../../substrates/shell.js";
2
4
  import { computeStats, formatStatsHuman } from "../../run/stats.js";
3
5
  import { DEFAULT_EXPORT_MAX_BYTES, exportRun, formatExportHuman } from "../../feedback/export.js";
4
6
  import { cleanupRun, listRuns, readReview } from "../../run/stored-runs.js";
5
- import { runDryRun } from "../../run/dry-run.js";
6
7
  import { verifyRun } from "../../verify/verify.js";
7
8
  import { reclaimPreflightSandboxes, reclaimRunSandboxes, } from "../../run/reclaim.js";
8
- import { runLabCommand } from "./lab-run.js";
9
- import { applyEnvFileOption, formatRunHuman, JSON_OPTION_DESCRIPTION, parsePositiveInteger, writeResult, } from "../io.js";
10
- const SCRIPTED_BROWSER_DOCS_URL = "https://humanish.dev/docs/lab-manifests#scripted-browser-scenarios";
9
+ import { addRunOptions, handleRun } from "./run-command.js";
10
+ import { oldStudyOption, studyOptionValue } from "../deprecations.js";
11
+ import { CWD_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, RUN_OPTION_DESCRIPTION, writeResult, humanError, } from "../io.js";
11
12
  export function registerRunCommand(parent, io) {
12
- parent
13
+ addRunOptions(parent
13
14
  .command("run")
14
- .argument("[lab]", "Optional lab id or .yaml path.")
15
- .description("Run a lab (or a synthetic dry-run bundle). The everyday command.")
16
- .summary("Run a persona/scenario simulation or dry-run bundle.")
17
- .option("--dry-run", "Generate contract proof without browser, keys, or provider spend.")
18
- // `humanish run <lab>` and `humanish lab run <lab>` are the SAME operation on the same
19
- // dispatcher, but this one used to forward four options while its sibling forwarded all of
20
- // them — so `humanish run first-run --no-open` failed while `lab run` accepted it. A
21
- // participant hit exactly that and filed it as a documentation mismatch. Same command, same
22
- // flags (CLIG: "be consistent across subcommands").
23
- .option("--open", "Open the observer in the default browser.")
24
- .option("--no-open", "Render without opening a browser.")
25
- .option("--detach", "Render/open once and exit without an attached watch server.")
26
- .option("--port <port>", "Local observer server port when following.", "0")
27
- .option("--sims <count>", "Simulation count. A dry run accepts any positive count.")
28
- // Agents with an older installed skill still send --app-url. Accepting it hidden lets the
29
- // refusal name the replacement; commander's bare unknown-option error names nothing. Delete
30
- // after 0.106.x.
31
- .addOption(new Option("--app-url <url>").hideHelp())
32
- .option("--cwd <path>", "Target project directory.", ".")
33
- .option("--env-file <path>", "Load a local env file for this run without persisting values.")
34
- .option("--run-id <id>", "Explicit run id for deterministic fixture tests; refused when that run already exists.")
35
- .option("--json", JSON_OPTION_DESCRIPTION)
36
- .action(async (lab, options, command) => {
37
- if (options.appUrl !== undefined) {
38
- const result = {
39
- schema: "humanish.run-result.v1",
40
- ok: false,
41
- cwd: options.cwd,
42
- warnings: [],
43
- error: {
44
- code: "HUMANISH_APP_URL_REMOVED",
45
- message: `--app-url was removed. To drive an app on a loopback URL, write a scripted-browser lab and run \`humanish run <lab>\`: ${SCRIPTED_BROWSER_DOCS_URL}`,
46
- },
47
- };
48
- writeResult(command, io, result, formatRunHuman);
49
- io.setExitCode(2);
50
- return;
51
- }
52
- if (!(await applyEnvFileOption({
53
- command,
54
- cwd: options.cwd,
55
- envFile: options.envFile,
56
- io,
57
- // runLabCommand discovers keys for a live lab; the lab-less preview needs none.
58
- discoverKeys: false,
59
- }))) {
60
- return;
61
- }
62
- if (lab) {
63
- await runLabCommand({
64
- command,
65
- io,
66
- lab,
67
- mode: "run",
68
- // Forwarded wholesale, exactly as `lab run` does. Cherry-picking a subset here is what
69
- // made the two commands disagree in the first place.
70
- options: options,
71
- });
72
- return;
73
- }
74
- const participantCount = options.sims === undefined ? undefined : parsePositiveInteger(options.sims);
75
- if (options.sims !== undefined && participantCount === null) {
76
- const result = {
77
- schema: "humanish.run-result.v1",
78
- ok: false,
79
- cwd: options.cwd,
80
- warnings: [],
81
- error: {
82
- code: "HUMANISH_INVALID_SIM_COUNT",
83
- message: "--sims must be a positive integer.",
84
- },
85
- };
86
- writeResult(command, io, result, formatRunHuman);
87
- io.setExitCode(2);
88
- return;
89
- }
90
- const result = await runDryRun({
91
- cwd: options.cwd,
92
- ...(options.dryRun === undefined ? {} : { dryRun: options.dryRun }),
93
- ...(options.runId === undefined ? {} : { runId: options.runId }),
94
- ...(participantCount === undefined || participantCount === null
95
- ? {}
96
- : { simCount: participantCount }),
97
- // Rendered the way `watch` renders it, so a bundle is the same bundle whichever command
98
- // produced it (#597). A render failure is a warning on the result.
99
- observer: { open: false },
100
- });
101
- writeResult(command, io, result, formatRunHuman);
102
- io.setExitCode(result.ok ? 0 : 2);
103
- });
15
+ .argument("[study]", "Optional study id or .yaml path.")
16
+ .description("Run a study, as a dry run or with live participants. This is the everyday command.")
17
+ .summary("Run a study, as a dry run or with live participants.")).action((study, options, command) => handleRun(io, study, options, command));
104
18
  }
105
19
  export function registerVerifyCommand(parent, io) {
106
20
  parent
107
21
  .command("verify")
108
- .description("Validate a run bundle and public-safety gates.")
109
- .summary("Validate a run bundle and public-safety gates.")
110
- .option("--run <id>", "Run id or latest pointer.", "latest")
111
- .option("--cwd <path>", "Target project directory.", ".")
22
+ .description("Check a run's evidence and share safety.")
23
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
24
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
25
+ .option("--verbose", "Print every check, passing ones included.")
112
26
  .option("--json", JSON_OPTION_DESCRIPTION)
113
27
  .action(async (options, command) => {
114
28
  const result = await verifyRun(options.cwd, options.run);
115
- writeResult(command, io, result, formatVerifyHuman);
29
+ writeResult(command, io, result, (value) => options.verbose ? formatVerifyVerbose(value) : formatVerifyHuman(value));
116
30
  io.setExitCode(result.ok ? 0 : 2);
117
31
  });
118
32
  }
119
33
  export function registerCleanupCommand(parent, io) {
120
34
  parent
121
35
  .command("cleanup")
122
- .description("Inspect recorded resource evidence and write cleanup.json; stored ids do not authorize provider mutation.")
123
- .summary("Write a resource cleanup inspection receipt.")
124
- .option("--run <id>", "Run id or latest pointer.", "latest")
125
- .option("--cwd <path>", "Target project directory.", ".")
36
+ .description("Check a run's recorded resources and write cleanup.json. It stops nothing; humanish reclaim stops leftover sandboxes.")
37
+ .summary("Check that a run's resources were stopped.")
38
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
39
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
126
40
  .option("--json", JSON_OPTION_DESCRIPTION)
127
41
  .action(async (options, command) => {
128
42
  const result = await cleanupRun(options.cwd, options.run);
129
- writeResult(command, io, result, formatCleanupHuman);
43
+ writeResult(command, io, result, (value) => formatCleanupHuman(value, options.cwd));
130
44
  io.setExitCode(result.ok ? 0 : 2);
131
45
  });
132
46
  }
133
47
  export function registerReviewCommand(parent, io) {
134
48
  parent
135
49
  .command("review")
136
- .description("Build a review packet from verified run evidence.")
50
+ .description("Show a run's review: verdict, summary and gaps.")
137
51
  .summary("Build a review packet from verified run evidence.")
138
- .option("--run <id>", "Run id or latest pointer.", "latest")
139
- .option("--cwd <path>", "Target project directory.", ".")
52
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
53
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
140
54
  .option("--json", JSON_OPTION_DESCRIPTION)
141
55
  .action(async (options, command) => {
142
56
  const result = await readReview(options.cwd, options.run);
143
- writeResult(command, io, result, (value) => `${JSON.stringify(value, null, 2)}\n`);
57
+ writeResult(command, io, result, formatReviewHuman);
144
58
  io.setExitCode("ok" in result && result.ok === false ? 2 : 0);
145
59
  });
146
60
  }
@@ -148,16 +62,16 @@ export function registerExportCommand(parent, io) {
148
62
  parent
149
63
  .command("export")
150
64
  .description("Export a run as self-contained Observer HTML, or a separately verified redacted bundle workspace. HTML requires share_ready unless --local-only; bundle format requires --redact-screenshots and preserves the original.")
151
- .summary("Export Observer HTML or a redacted bundle workspace.")
152
- .option("--run <id>", "Run id or 'latest'.", "latest")
65
+ .summary("Export a run as an Observer page or redacted bundle.")
66
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
153
67
  .addOption(new Option("--format <format>", "Output format; bundle creates a new standalone workspace.")
154
68
  .choices(["html", "bundle"])
155
69
  .default("html"))
156
70
  .option("--redact-screenshots", "Bundle only: blur PNG screenshots in a verified copy; keep original evidence unchanged.")
157
71
  .option("--out <path>", "HTML file or new bundle workspace. Default: .humanish/exports/<runId>.html or <runId>-redacted/.")
158
- .option("--local-only", "Export a bundle that is not share_ready, with a LOCAL ONLY banner in the file.")
159
- .option("--max-bytes <n>", "Refuse an export larger than this.", String(DEFAULT_EXPORT_MAX_BYTES))
160
- .option("--cwd <path>", "Target project directory.", ".")
72
+ .option("--local-only", 'Export a bundle that is not share_ready, with a "Local only" banner in the file.')
73
+ .addOption(new Option("--max-bytes <n>", "Refuse an export larger than this many bytes.").default(String(DEFAULT_EXPORT_MAX_BYTES), `${DEFAULT_EXPORT_MAX_BYTES / 1024 / 1024} MB`))
74
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
161
75
  .option("--json", JSON_OPTION_DESCRIPTION)
162
76
  .action(async (options, command) => {
163
77
  const maxBytes = options.format === "bundle"
@@ -182,14 +96,16 @@ export function registerStatsCommand(parent, io) {
182
96
  parent
183
97
  .command("stats")
184
98
  .description("Cost, outcome, and duration roll-ups across run history. Estimates stay labelled; unknown costs count as unknown.")
185
- .summary("Roll up cost, outcomes, and durations across runs.")
186
- .option("--lab <id>", "Only runs from this lab id.")
99
+ .summary("Show cost, outcomes and durations across runs.")
100
+ .option("--study <id>", "Only runs of this study id.")
101
+ .addOption(oldStudyOption("id"))
187
102
  .option("--since <date>", "Only runs that started on or after this ISO date or datetime.")
188
- .option("--cwd <path>", "Target project directory.", ".")
103
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
189
104
  .option("--json", JSON_OPTION_DESCRIPTION)
190
105
  .action(async (options, command) => {
106
+ const study = studyOptionValue(command, io, options);
191
107
  const result = await computeStats(options.cwd, {
192
- ...(options.lab === undefined ? {} : { lab: options.lab }),
108
+ ...(study === undefined ? {} : { lab: study }),
193
109
  ...(options.since === undefined ? {} : { since: options.since }),
194
110
  });
195
111
  writeResult(command, io, result, formatStatsHuman);
@@ -199,9 +115,8 @@ export function registerStatsCommand(parent, io) {
199
115
  export function registerRunsCommand(parent, io) {
200
116
  parent
201
117
  .command("runs")
202
- .description("List local humanish runs and latest pointers.")
203
- .summary("List local humanish runs and latest pointers.")
204
- .option("--cwd <path>", "Target project directory.", ".")
118
+ .description("List this project's runs and which one is latest.")
119
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
205
120
  .option("--json", JSON_OPTION_DESCRIPTION)
206
121
  .action(async (options, command) => {
207
122
  const result = await listRuns(options.cwd);
@@ -253,10 +168,10 @@ export function registerReclaimCommand(parent, io) {
253
168
  parent
254
169
  .command("reclaim")
255
170
  .description("Kill an interrupted run's sandboxes by the exact ids journaled in its sandbox-receipts.ndjson; never enumerates the E2B account. Needs E2B_API_KEY in the environment.")
256
- .summary("Reclaim an interrupted run's sandboxes by recorded id.")
257
- .option("--cwd <path>", "Target project directory.", ".")
258
- .option("--run <id>", "Run id, or 'latest'.", "latest")
259
- .addOption(new Option("--preflight", "Reclaim sandboxes left by interrupted `humanish lab preflight` probes (journaled in .humanish/preflight) instead of a run's.").conflicts("run"))
171
+ .summary("Stop an interrupted run's leftover sandboxes.")
172
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
173
+ .option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
174
+ .addOption(new Option("--preflight", "Reclaim sandboxes left by interrupted `humanish study check` probes (journaled in .humanish/preflight) instead of a run's.").conflicts("run"))
260
175
  .option("--json", JSON_OPTION_DESCRIPTION)
261
176
  .action(async (options, command) => {
262
177
  const result = options.preflight
@@ -274,36 +189,122 @@ function formatReclaimHuman(result) {
274
189
  }
275
190
  for (const warning of result.warnings)
276
191
  lines.push(` warning: ${warning}`);
277
- if (result.error)
278
- lines.push(` error: ${result.error.message}`);
279
- return lines.join("\n");
192
+ const stdout = lines.join("\n");
193
+ return result.error === undefined ? stdout : { stdout: `${stdout}\n`, error: result.error };
194
+ }
195
+ const REVIEW_VERDICTS = {
196
+ // A dry run, or a live run with no participant result; review's result does not carry the mode.
197
+ contract_proof_only: "no verdict; no product behavior was tested",
198
+ pass: "pass",
199
+ fail: "fail",
200
+ blocked: "blocked",
201
+ timed_out: "timed out",
202
+ };
203
+ /** A run's review: its verdict, summary and gaps, and where review.json is. */
204
+ function formatReviewHuman(result) {
205
+ if (!("verdict" in result)) {
206
+ // A run that did not pass verify has no review to show; verify says why.
207
+ const error = result.error ?? {
208
+ code: "HUMANISH_INVALID_RUN_BUNDLE",
209
+ message: "Run bundle failed verification.",
210
+ };
211
+ return error.code === "HUMANISH_INVALID_RUN_BUNDLE"
212
+ ? {
213
+ error: {
214
+ ...error,
215
+ message: `${error.message} humanish verify --run ${result.run} shows why.`,
216
+ },
217
+ }
218
+ : humanError(error);
219
+ }
220
+ return ([
221
+ `humanish review ${result.runId}: ${REVIEW_VERDICTS[result.verdict]}`,
222
+ "",
223
+ result.summary,
224
+ ...(result.gaps.length === 0 ? [] : ["", "gaps:", ...result.gaps.map((gap) => `- ${gap}`)]),
225
+ "",
226
+ `review: ${result.path}`,
227
+ ].join("\n") + "\n");
228
+ }
229
+ /** The run id verify read, from the bundle path, so `latest` prints as the id it points at. */
230
+ function verifiedRunId(result) {
231
+ return result.bundlePath === undefined
232
+ ? result.run
233
+ : path.basename(path.dirname(result.bundlePath));
280
234
  }
235
+ /** Share-safety reasons, except VERIFY_FAILED, which the failing checks above it already say. */
236
+ function shareSafetyLines(result) {
237
+ return result.shareSafety.reasons
238
+ .filter((reason) => reason.code !== "VERIFY_FAILED")
239
+ .map((reason) => `share-safety: ${reason.code}: ${reason.message}`);
240
+ }
241
+ /**
242
+ * One line for a pass. A failure lists only the failing checks. `--verbose` prints every check.
243
+ * A run that does not exist prints only that.
244
+ */
281
245
  function formatVerifyHuman(result) {
246
+ if (result.error?.code === "HUMANISH_RUN_NOT_FOUND")
247
+ return humanError(result.error);
248
+ const runId = verifiedRunId(result);
249
+ const total = result.checks.length;
250
+ const failed = result.checks.filter((check) => !check.ok);
251
+ const lines = result.ok
252
+ ? [`verified ${runId} · ${result.shareSafety.status} · ${total} checks passed`]
253
+ : [
254
+ `verify failed: ${runId} · ${result.shareSafety.status} · ${failed.length} of ${total} checks failed`,
255
+ ...failed.map((check) => `- ${check.message}`),
256
+ ];
257
+ lines.push(...shareSafetyLines(result), ...result.warnings.map((warning) => `warning: ${warning}`));
258
+ const cwdFlag = result.cwd === process.cwd() ? "" : ` --cwd ${result.cwd}`;
259
+ if (!result.ok)
260
+ lines.push(`every check: humanish verify --run ${runId}${cwdFlag} --verbose`);
261
+ return `${lines.join("\n")}\n`;
262
+ }
263
+ function formatVerifyVerbose(result) {
264
+ if (result.error?.code === "HUMANISH_RUN_NOT_FOUND")
265
+ return humanError(result.error);
282
266
  return ([
283
267
  `humanish verify ${result.ok ? "passed" : "failed"}`,
284
- `run: ${result.run}`,
268
+ `run: ${verifiedRunId(result)}`,
285
269
  `share-safety: ${result.shareSafety.status}`,
286
270
  ...result.shareSafety.reasons.map((reason) => `share-safety reason: ${reason.code}: ${reason.message}`),
287
271
  ...result.checks.map((check) => `- ${check.ok ? "ok" : "fail"} ${check.name}: ${check.message}`),
288
272
  ...result.warnings.map((warning) => `warning: ${warning}`),
289
273
  ].join("\n") + "\n");
290
274
  }
291
- function formatCleanupHuman(result) {
292
- if (!result.ok && result.error) {
293
- return `${result.error.code}: ${result.error.message}\n`;
294
- }
275
+ /** A command-line argument, single-quoted only when the shell would split or expand it. */
276
+ function shellArg(value) {
277
+ return /^[\w@%+=:,./-]+$/.test(value) ? value : shellQuote(value);
278
+ }
279
+ /**
280
+ * Cleanup only reads evidence and never stops a sandbox. A failed resource is an E2B sandbox not
281
+ * recorded as stopped, which reclaim can stop from the run's sandbox receipts, so the last line
282
+ * names it. A skipped resource is a provider reclaim does not handle, so it gets no line. `cwd` is
283
+ * the --cwd the command was given, since cleanup's result masks it.
284
+ */
285
+ function reclaimPointer(result, cwd) {
286
+ if (result.runId === undefined || result.summary.failed === 0)
287
+ return [];
288
+ const cwdFlag = cwd === "." ? "" : ` --cwd ${shellArg(cwd)}`;
289
+ return [
290
+ `To stop leftover sandboxes, run humanish reclaim --run ${shellArg(result.runId)}${cwdFlag}.`,
291
+ ];
292
+ }
293
+ function formatCleanupHuman(result, cwd) {
294
+ if (!result.ok && result.error)
295
+ return humanError(result.error);
295
296
  return ([
296
297
  `humanish cleanup ${result.ok ? "passed" : "failed"}`,
297
298
  `run: ${result.runId ?? result.run}`,
298
299
  `resources: already-clean ${result.summary.alreadyClean}, skipped ${result.summary.skipped}, failed ${result.summary.failed}`,
299
300
  ...(result.cleanupPath ? [`cleanup: ${result.cleanupPath}`] : []),
300
301
  ...result.warnings.map((warning) => `warning: ${warning}`),
302
+ ...reclaimPointer(result, cwd),
301
303
  ].join("\n") + "\n");
302
304
  }
303
305
  function formatRunsHuman(result) {
304
- if (!result.ok) {
305
- return `${result.error?.code}: ${result.error?.message}\n`;
306
- }
306
+ if (!result.ok)
307
+ return humanError(result.error);
307
308
  if (result.runs.length === 0) {
308
309
  return `No humanish runs found in ${result.cwd}\n`;
309
310
  }
@@ -3,9 +3,9 @@ import { type CliIo } from "../io.js";
3
3
  export declare function registerInitCommand(parent: Command, io: CliIo): void;
4
4
  export declare function registerDoctorCommand(parent: Command, io: CliIo): void;
5
5
  /**
6
- * `humanish telemetry status|enable|disable` — the opt-out the convention requires, plus a `status`
6
+ * `humanish telemetry status|enable|disable`: the opt-out the convention requires, plus a `status`
7
7
  * that prints the exact document that would be sent. "You can read what we collect" is what makes
8
- * default-on honest rather than merely lawful.
8
+ * default-on collection checkable by the person it describes.
9
9
  */
10
10
  export declare function registerTelemetryCommand(parent: Command, io: CliIo): void;
11
11
  export declare function registerKeysCommand(parent: Command, io: CliIo): void;
@@ -4,17 +4,18 @@ import { promptSecret } from "../secret-prompt.js";
4
4
  import { runInit } from "../../lab/init.js";
5
5
  import { buildPayload, disabledByEnvironment, readTelemetryState, telemetryStatePath, writeTelemetryState, } from "../telemetry.js";
6
6
  import { doctor } from "../doctor.js";
7
- import { applyEnvFileOption, CLI_VERSION, JSON_OPTION_DESCRIPTION, markInvocationEnvelopeWritten, wantsJson, writeResult, } from "../io.js";
7
+ import { oldStudyOption, studyOptionValue } from "../deprecations.js";
8
+ import { applyEnvFileOption, CLI_VERSION, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, markInvocationEnvelopeWritten, wantsJson, writeResult, formatCliError, } from "../io.js";
8
9
  export function registerInitCommand(parent, io) {
9
10
  parent
10
11
  .command("init")
11
12
  .description("Set up committed humanish/ source files and ignored .humanish/ runtime state.")
12
- .summary("Set up humanish/ source and .humanish/ runtime state.")
13
+ .summary("Set up starter studies and personas in this project.")
13
14
  .option("--dry-run", "Print planned changes without writing files.")
14
15
  .option("--yes", "Apply safe generated changes without prompting.")
15
16
  .option("--local-browser <url>", "Set the local-browser starter to this loopback app URL (explicit port above 1023).")
16
17
  .option("--local-mission <text>", "Set the local-browser participant mission.")
17
- .option("--cwd <path>", "Target project directory.", ".")
18
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
18
19
  .option("--json", JSON_OPTION_DESCRIPTION)
19
20
  .action(async (options, command) => {
20
21
  const initOptions = {
@@ -47,25 +48,27 @@ export function registerDoctorCommand(parent, io) {
47
48
  parent
48
49
  .command("doctor")
49
50
  .description("Explain project readiness and missing humanish setup.")
50
- .summary("Explain project readiness and missing setup.")
51
- .option("--cwd <path>", "Target project directory.", ".")
52
- .option("--lab <lab>", "Check the selected lab's desktop, participant authentication and separate analysis requirements; no provider calls.")
53
- .option("--env-file <path>", "Load a local env file for these setup checks without printing values.")
51
+ .summary("Check what this project and machine need for a run.")
52
+ .option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
53
+ .option("--study <study>", "Check the study's desktop, participant authentication and separate analysis requirements; no provider calls.")
54
+ .addOption(oldStudyOption("study"))
55
+ .option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
54
56
  .option("--json", JSON_OPTION_DESCRIPTION)
55
57
  .action(async (options, command) => {
58
+ const study = studyOptionValue(command, io, options);
56
59
  if (options.envFile &&
57
60
  !(await applyEnvFileOption({ command, cwd: options.cwd, envFile: options.envFile, io })))
58
61
  return;
59
- const result = await doctor(options.cwd, options.lab ? { lab: options.lab } : {});
62
+ const result = await doctor(options.cwd, study ? { lab: study } : {});
60
63
  writeResult(command, io, result, formatDoctorHuman);
61
64
  // Behavioral change: was exit 1, every other structured command uses 2.
62
65
  io.setExitCode(result.ok ? 0 : 2);
63
66
  });
64
67
  }
65
68
  /**
66
- * `humanish telemetry status|enable|disable` — the opt-out the convention requires, plus a `status`
69
+ * `humanish telemetry status|enable|disable`: the opt-out the convention requires, plus a `status`
67
70
  * that prints the exact document that would be sent. "You can read what we collect" is what makes
68
- * default-on honest rather than merely lawful.
71
+ * default-on collection checkable by the person it describes.
69
72
  */
70
73
  export function registerTelemetryCommand(parent, io) {
71
74
  const telemetry = parent
@@ -83,8 +86,8 @@ export function registerTelemetryCommand(parent, io) {
83
86
  anonymousId: state.anonymousId,
84
87
  version: CLI_VERSION,
85
88
  properties: {
86
- command: "lab run",
87
- lab: "try-live",
89
+ command: "run",
90
+ study: "try-live",
88
91
  mode: "live",
89
92
  outcome: "incomplete",
90
93
  brain: "provider-key",
@@ -110,7 +113,7 @@ export function registerTelemetryCommand(parent, io) {
110
113
  `telemetry: ${result.enabled ? "on" : "off"}${envOff ? " (DO_NOT_TRACK / HUMANISH_TELEMETRY_DISABLED)" : ""}`,
111
114
  `state: ${result.statePath}`,
112
115
  "",
113
- "a complete example of what is sent — there are no other fields:",
116
+ "every field that is sent, with example values:",
114
117
  JSON.stringify(sample, null, 2),
115
118
  "",
116
119
  "never sent: labs you wrote, subjects, personas, missions, paths, run evidence, key names or values.",
@@ -139,6 +142,8 @@ export function registerTelemetryCommand(parent, io) {
139
142
  }
140
143
  const KEYS_RESULT_SCHEMA = "humanish.keys-result.v1";
141
144
  function formatKeysHuman(result) {
145
+ if (!result.ok)
146
+ return { error: { message: result.message } };
142
147
  const lines = [
143
148
  `humanish keys ${result.ok ? "ok" : "failed"}`,
144
149
  `store: ${result.store}`,
@@ -165,7 +170,7 @@ export function registerKeysCommand(parent, io) {
165
170
  const keys = parent
166
171
  .command("keys")
167
172
  .description("Manage the humanish user-level key store used by provider-key discovery.")
168
- .summary("Manage the user-level provider key store.");
173
+ .summary("Store and manage your provider keys.");
169
174
  keys
170
175
  .command("set")
171
176
  .argument("<vendor-or-name>", "A vendor alias (openai, e2b, anthropic, github, agentmail) or a raw ENV_NAME.")
@@ -254,7 +259,7 @@ export function registerKeysCommand(parent, io) {
254
259
  });
255
260
  keys
256
261
  .command("list")
257
- .description("List the NAMES stored in the user store. Values are never printed.")
262
+ .description("List the key names in the user store. Values are never printed.")
258
263
  .option("--json", JSON_OPTION_DESCRIPTION)
259
264
  .action(async (_options, command) => {
260
265
  const storePath = userKeyStorePath(process.env);
@@ -277,10 +282,10 @@ function formatDoctorHuman(result) {
277
282
  return ([
278
283
  `humanish doctor ${result.ok ? "ok" : "needs setup"}`,
279
284
  `cwd: ${result.cwd}`,
280
- // "missing" is a VERDICT, and a row that never ran has none. A participant reading doctor on a
285
+ // "missing" is a verdict, and a row that never ran has none. A participant reading doctor on a
281
286
  // fresh desktop got `- missing package.json: package.json is present and safe to read`, which
282
287
  // contradicts itself in eleven words (labs/tui-self-study.yaml).
283
- ...result.checks.map((check) => `- ${check.ok ? "ok" : check.checked === false ? "not checked" : "missing"} ${check.name}: ${check.message}`),
288
+ ...result.checks.map((check) => `- ${check.status.replace("_", " ")} ${check.name}: ${check.message}`),
284
289
  ].join("\n") + "\n");
285
290
  }
286
291
  function formatInitHuman(result) {
@@ -307,14 +312,14 @@ function formatInitHuman(result) {
307
312
  if (result.warnings.length > 0) {
308
313
  lines.push("", "warnings:", ...result.warnings.map((warning) => `- ${warning}`));
309
314
  }
310
- if (result.error) {
311
- lines.push("", `${result.error.code}: ${result.error.message}`);
312
- }
315
+ // init writes a refused plan to stderr, so the error goes there in the shared shape.
316
+ if (result.error)
317
+ lines.push("", formatCliError("humanish init", result.error).trimEnd());
313
318
  if (result.mode === "needs-confirmation") {
314
319
  lines.push("", "Run with --dry-run --json to inspect or --yes to apply.");
315
320
  }
316
321
  else if (result.ok && result.nextSteps !== undefined) {
317
- // Twenty files and no next step is where the funnel died (#505). Increasingly the reader here
322
+ // Twenty files and no next step is where the funnel died. Increasingly the reader here
318
323
  // is a coding agent doing setup for someone, and an agent does what stdout tells it to.
319
324
  lines.push(...result.nextSteps);
320
325
  }
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ import { type CliIo } from "../io.js";
3
+ export declare function registerStudyCommands(parent: Command, io: CliIo): void;