humanish 0.107.0 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (671) hide show
  1. package/ARCHITECTURE.md +73 -69
  2. package/CHANGELOG.md +27 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +148 -175
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-trace.js +2 -1
  14. package/dist/actors/codex/app-server-ui.js +1 -1
  15. package/dist/actors/codex/codex-admission.d.ts +91 -0
  16. package/dist/actors/codex/codex-admission.js +150 -0
  17. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  18. package/dist/actors/codex/restricted-executable.js +8 -8
  19. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  20. package/dist/actors/codex/restricted-launch.js +1 -1
  21. package/dist/actors/codex/restricted-participant.js +20 -18
  22. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  23. package/dist/actors/codex/restricted-policy.js +2 -2
  24. package/dist/actors/codex/restricted-session.d.ts +3 -3
  25. package/dist/actors/codex/restricted-session.js +10 -5
  26. package/dist/actors/computer-use/actor.d.ts +18 -18
  27. package/dist/actors/computer-use/actor.js +4 -4
  28. package/dist/actors/computer-use/admission-limit.d.ts +3 -3
  29. package/dist/actors/computer-use/admission-limit.js +4 -4
  30. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  31. package/dist/actors/computer-use/executor-error.js +3 -3
  32. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  33. package/dist/actors/computer-use/loop/actions.js +15 -15
  34. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  35. package/dist/actors/computer-use/loop/backstop.js +14 -12
  36. package/dist/actors/computer-use/loop/debrief.js +2 -2
  37. package/dist/actors/computer-use/loop/ending.d.ts +6 -6
  38. package/dist/actors/computer-use/loop/ending.js +18 -17
  39. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  40. package/dist/actors/computer-use/loop/observation.js +15 -14
  41. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  42. package/dist/actors/computer-use/loop/provider-call.js +12 -12
  43. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  44. package/dist/actors/computer-use/loop/session.js +4 -4
  45. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  46. package/dist/actors/computer-use/loop/spend.js +1 -1
  47. package/dist/actors/computer-use/loop/trace.js +11 -9
  48. package/dist/actors/computer-use/loop/types.d.ts +47 -45
  49. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  50. package/dist/actors/computer-use/loop/usage.js +2 -2
  51. package/dist/actors/computer-use/loop.d.ts +6 -1
  52. package/dist/actors/computer-use/loop.js +26 -4
  53. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  54. package/dist/actors/computer-use/openai-context.js +214 -0
  55. package/dist/actors/computer-use/openai-provider.d.ts +13 -10
  56. package/dist/actors/computer-use/openai-provider.js +52 -41
  57. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  58. package/dist/actors/computer-use/openai-requests.js +82 -15
  59. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  60. package/dist/actors/computer-use/openai-wire.js +36 -34
  61. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  62. package/dist/actors/computer-use/provider-error.js +6 -6
  63. package/dist/actors/contract.d.ts +82 -47
  64. package/dist/actors/contract.js +30 -24
  65. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  66. package/dist/actors/local-agent/claude-session.js +13 -12
  67. package/dist/actors/local-agent/cli.d.ts +9 -7
  68. package/dist/actors/local-agent/cli.js +24 -28
  69. package/dist/actors/local-agent/readiness.d.ts +2 -2
  70. package/dist/actors/local-agent/readiness.js +4 -4
  71. package/dist/actors/reasoning-effort.js +8 -8
  72. package/dist/actors/registry.d.ts +12 -12
  73. package/dist/actors/registry.js +21 -20
  74. package/dist/actors/scripted-browser/actor.d.ts +10 -10
  75. package/dist/actors/scripted-browser/actor.js +17 -17
  76. package/dist/actors/scripted-browser/browser-command.js +1 -1
  77. package/dist/actors/scripted-browser/steps.js +1 -1
  78. package/dist/actors/scripted-browser/types.d.ts +1 -1
  79. package/dist/actors/stop-conditions.d.ts +1 -1
  80. package/dist/analysis/automatic-completion.d.ts +7 -7
  81. package/dist/analysis/automatic-completion.js +1 -1
  82. package/dist/analysis/automatic-config.d.ts +6 -6
  83. package/dist/analysis/automatic-config.js +1 -1
  84. package/dist/analysis/codex-config.d.ts +6 -2
  85. package/dist/analysis/codex-config.js +22 -14
  86. package/dist/analysis/execute.d.ts +1 -1
  87. package/dist/analysis/execute.js +1 -1
  88. package/dist/analysis/service.js +5 -5
  89. package/dist/analysis/types.d.ts +6 -0
  90. package/dist/browser-control/client.js +16 -16
  91. package/dist/browser-control/dispatcher.js +4 -4
  92. package/dist/browser-control/protocol.js +14 -14
  93. package/dist/browser-control/recording-transfer.js +4 -4
  94. package/dist/browser-control/transport.js +7 -7
  95. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  96. package/dist/cli/commands/analyze.js +19 -16
  97. package/dist/cli/commands/codex.js +9 -9
  98. package/dist/cli/commands/comms.js +48 -35
  99. package/dist/cli/commands/feedback.js +20 -21
  100. package/dist/cli/commands/migrate.d.ts +4 -0
  101. package/dist/cli/commands/migrate.js +65 -0
  102. package/dist/cli/commands/observe.d.ts +0 -1
  103. package/dist/cli/commands/observe.js +136 -112
  104. package/dist/cli/commands/run-command.d.ts +10 -0
  105. package/dist/cli/commands/run-command.js +85 -0
  106. package/dist/cli/commands/runs.js +136 -139
  107. package/dist/cli/commands/setup.d.ts +2 -2
  108. package/dist/cli/commands/setup.js +27 -24
  109. package/dist/cli/commands/study-format.d.ts +9 -0
  110. package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
  111. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  112. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
  113. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  114. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  115. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  116. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
  117. package/dist/cli/commands/study-route-run.d.ts +19 -0
  118. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  119. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  120. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  121. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  122. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
  123. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  124. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  125. package/dist/cli/commands/study-run.d.ts +9 -0
  126. package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
  127. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
  128. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
  129. package/dist/cli/commands/study.d.ts +3 -0
  130. package/dist/cli/commands/study.js +146 -0
  131. package/dist/cli/commands/tui.d.ts +4 -4
  132. package/dist/cli/commands/tui.js +31 -31
  133. package/dist/cli/commands/watch.js +71 -121
  134. package/dist/cli/deprecations.d.ts +6 -0
  135. package/dist/cli/deprecations.js +18 -0
  136. package/dist/cli/doctor.d.ts +18 -8
  137. package/dist/cli/doctor.js +114 -59
  138. package/dist/cli/first-run-path.d.ts +15 -13
  139. package/dist/cli/first-run-path.js +35 -33
  140. package/dist/cli/io.d.ts +44 -9
  141. package/dist/cli/io.js +98 -23
  142. package/dist/cli/observer-follow.d.ts +3 -3
  143. package/dist/cli/observer-follow.js +6 -7
  144. package/dist/cli/orientation.d.ts +10 -7
  145. package/dist/cli/orientation.js +89 -47
  146. package/dist/cli/product-sentence.d.ts +6 -0
  147. package/dist/cli/product-sentence.js +6 -0
  148. package/dist/cli/program.d.ts +6 -1
  149. package/dist/cli/program.js +111 -43
  150. package/dist/cli/telemetry.d.ts +16 -16
  151. package/dist/cli/telemetry.js +46 -44
  152. package/dist/cli.js +1 -1
  153. package/dist/comms/capture-surface.d.ts +13 -12
  154. package/dist/comms/capture-surface.js +23 -22
  155. package/dist/comms/catch-host.d.ts +7 -7
  156. package/dist/comms/catch-host.js +17 -17
  157. package/dist/comms/connections.d.ts +1 -1
  158. package/dist/comms/connections.js +2 -2
  159. package/dist/comms/email-catch.d.ts +3 -3
  160. package/dist/comms/email-catch.js +8 -8
  161. package/dist/comms/external-evidence.d.ts +5 -5
  162. package/dist/comms/external-evidence.js +5 -4
  163. package/dist/comms/extract.js +2 -2
  164. package/dist/comms/fake-inbox.d.ts +3 -3
  165. package/dist/comms/fake-inbox.js +3 -3
  166. package/dist/comms/receiving-render.d.ts +1 -1
  167. package/dist/comms/receiving-render.js +2 -2
  168. package/dist/comms/receiving-runtime.d.ts +4 -4
  169. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  170. package/dist/comms/sandbox-catch-script.js +6 -6
  171. package/dist/comms/sandbox-catch.d.ts +38 -39
  172. package/dist/comms/sandbox-catch.js +36 -37
  173. package/dist/comms/setup.d.ts +2 -2
  174. package/dist/comms/setup.js +56 -25
  175. package/dist/comms/thread-evidence.d.ts +1 -1
  176. package/dist/comms/thread-evidence.js +6 -6
  177. package/dist/comms/types.d.ts +6 -6
  178. package/dist/comms/types.js +3 -3
  179. package/dist/evidence/frame-signature.d.ts +1 -1
  180. package/dist/evidence/frame-signature.js +4 -4
  181. package/dist/evidence/redaction.d.ts +3 -3
  182. package/dist/evidence/redaction.js +4 -4
  183. package/dist/feedback/draft.js +38 -80
  184. package/dist/feedback/export-bundle.js +1 -1
  185. package/dist/feedback/export.d.ts +5 -1
  186. package/dist/feedback/export.js +10 -10
  187. package/dist/feedback/feedback.d.ts +2 -2
  188. package/dist/feedback/feedback.js +21 -3
  189. package/dist/feedback/proof.d.ts +1 -1
  190. package/dist/feedback/proof.js +2 -2
  191. package/dist/guest/bootstrap.js +6 -6
  192. package/dist/guest/browser-tools.js +8 -8
  193. package/dist/guest/chromium-text.js +19 -19
  194. package/dist/guest/desktop-executor.d.ts +2 -2
  195. package/dist/guest/desktop-executor.js +20 -20
  196. package/dist/guest/desktop-keys.js +4 -4
  197. package/dist/guest/desktop-media.d.ts +2 -2
  198. package/dist/guest/desktop-media.js +16 -16
  199. package/dist/guest/desktop-native.d.ts +1 -1
  200. package/dist/guest/desktop-native.js +10 -10
  201. package/dist/guest/runtime-desktop.js +2 -2
  202. package/dist/guest/runtime-processes.d.ts +2 -2
  203. package/dist/guest/runtime-processes.js +2 -2
  204. package/dist/guest/runtime.js +6 -6
  205. package/dist/index.d.ts +14 -14
  206. package/dist/index.js +8 -8
  207. package/dist/keys/key-resolution.d.ts +5 -5
  208. package/dist/keys/key-resolution.js +23 -23
  209. package/dist/observer/artifact.d.ts +2 -2
  210. package/dist/observer/artifact.js +7 -7
  211. package/dist/observer/data.d.ts +6 -6
  212. package/dist/observer/data.js +5 -4
  213. package/dist/observer/exposure.d.ts +1 -1
  214. package/dist/observer/exposure.js +11 -11
  215. package/dist/observer/http.js +1 -1
  216. package/dist/observer/library.d.ts +3 -1
  217. package/dist/observer/library.js +8 -3
  218. package/dist/observer/listen.js +5 -4
  219. package/dist/observer/render.d.ts +1 -1
  220. package/dist/observer/render.js +17 -6
  221. package/dist/observer/run-routes.d.ts +4 -3
  222. package/dist/observer/run-routes.js +38 -13
  223. package/dist/observer/serve.d.ts +1 -1
  224. package/dist/observer/serve.js +7 -3
  225. package/dist/observer/tunnel.js +1 -1
  226. package/dist/observer-app.html +4 -4
  227. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  228. package/dist/routes/computer-use/bundle-parts.js +18 -17
  229. package/dist/routes/computer-use/bundle.d.ts +2 -2
  230. package/dist/routes/computer-use/bundle.js +10 -9
  231. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
  232. package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
  233. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  234. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
  235. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  236. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
  238. package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
  239. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  240. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
  241. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  242. package/dist/routes/computer-use/external-comms.js +1 -1
  243. package/dist/routes/computer-use/fanout-bundle.js +27 -26
  244. package/dist/routes/computer-use/fanout-records.js +12 -13
  245. package/dist/routes/computer-use/live-flush.d.ts +4 -4
  246. package/dist/routes/computer-use/live-flush.js +6 -6
  247. package/dist/routes/computer-use/live-phase.d.ts +5 -4
  248. package/dist/routes/computer-use/live-phase.js +8 -8
  249. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  250. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  251. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  252. package/dist/routes/computer-use/local-vm.js +3 -3
  253. package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
  254. package/dist/routes/computer-use/participant-desktop.js +5 -5
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +10 -10
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +33 -15
  259. package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
  260. package/dist/routes/computer-use/participant-prompt.js +9 -9
  261. package/dist/routes/computer-use/participant-runs.d.ts +16 -16
  262. package/dist/routes/computer-use/participant-runs.js +26 -25
  263. package/dist/routes/computer-use/plan.d.ts +12 -12
  264. package/dist/routes/computer-use/plan.js +42 -42
  265. package/dist/routes/computer-use/preflight.d.ts +5 -5
  266. package/dist/routes/computer-use/preflight.js +25 -25
  267. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  268. package/dist/routes/computer-use/rerun-selection.js +4 -3
  269. package/dist/routes/computer-use/result.d.ts +4 -4
  270. package/dist/routes/computer-use/result.js +22 -21
  271. package/dist/routes/computer-use/route.d.ts +12 -11
  272. package/dist/routes/computer-use/route.js +31 -30
  273. package/dist/routes/computer-use/self-report.d.ts +7 -7
  274. package/dist/routes/computer-use/self-report.js +32 -32
  275. package/dist/routes/computer-use/setup.d.ts +23 -23
  276. package/dist/routes/computer-use/setup.js +28 -29
  277. package/dist/routes/computer-use/single-bundle.d.ts +11 -11
  278. package/dist/routes/computer-use/single-bundle.js +40 -41
  279. package/dist/routes/computer-use/subject-projection.d.ts +4 -4
  280. package/dist/routes/computer-use/subject-projection.js +6 -6
  281. package/dist/routes/computer-use/types.d.ts +71 -73
  282. package/dist/routes/computer-use/types.js +12 -12
  283. package/dist/routes/preview.d.ts +13 -7
  284. package/dist/routes/preview.js +11 -7
  285. package/dist/routes/scripted/bundle.d.ts +7 -7
  286. package/dist/routes/scripted/bundle.js +20 -18
  287. package/dist/routes/scripted/plan.d.ts +8 -8
  288. package/dist/routes/scripted/plan.js +13 -13
  289. package/dist/routes/scripted/result.d.ts +3 -3
  290. package/dist/routes/scripted/result.js +13 -13
  291. package/dist/routes/scripted/route.d.ts +9 -9
  292. package/dist/routes/scripted/route.js +15 -16
  293. package/dist/routes/scripted/scenario.d.ts +1 -1
  294. package/dist/routes/scripted/scenario.js +5 -5
  295. package/dist/routes/scripted/setup.d.ts +6 -6
  296. package/dist/routes/scripted/setup.js +8 -8
  297. package/dist/routes/scripted/subject.d.ts +5 -5
  298. package/dist/routes/scripted/subject.js +4 -4
  299. package/dist/routes/scripted/surface-records.d.ts +1 -1
  300. package/dist/routes/scripted/surface-records.js +4 -4
  301. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  302. package/dist/routes/scripted/types.d.ts +18 -20
  303. package/dist/routes/scripted/types.js +2 -2
  304. package/dist/routes/shared-world/bundle-records.js +11 -10
  305. package/dist/routes/shared-world/bundle.d.ts +5 -5
  306. package/dist/routes/shared-world/bundle.js +46 -43
  307. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  308. package/dist/routes/shared-world/checkpoints.js +2 -2
  309. package/dist/routes/shared-world/comms.d.ts +14 -14
  310. package/dist/routes/shared-world/comms.js +19 -18
  311. package/dist/routes/shared-world/external-public.d.ts +4 -3
  312. package/dist/routes/shared-world/external-public.js +16 -12
  313. package/dist/routes/shared-world/handoff.d.ts +7 -6
  314. package/dist/routes/shared-world/handoff.js +65 -57
  315. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  316. package/dist/routes/shared-world/lobby-code.js +9 -9
  317. package/dist/routes/shared-world/participant-specs.d.ts +10 -9
  318. package/dist/routes/shared-world/participant-specs.js +38 -31
  319. package/dist/routes/shared-world/plan.d.ts +9 -9
  320. package/dist/routes/shared-world/plan.js +16 -16
  321. package/dist/routes/shared-world/provenance.d.ts +2 -2
  322. package/dist/routes/shared-world/provenance.js +2 -2
  323. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  324. package/dist/routes/shared-world/provisioned.js +18 -17
  325. package/dist/routes/shared-world/result.d.ts +6 -6
  326. package/dist/routes/shared-world/result.js +29 -29
  327. package/dist/routes/shared-world/route.d.ts +11 -11
  328. package/dist/routes/shared-world/route.js +40 -39
  329. package/dist/routes/shared-world/setup.d.ts +16 -16
  330. package/dist/routes/shared-world/setup.js +23 -23
  331. package/dist/routes/shared-world/types.d.ts +55 -53
  332. package/dist/routes/shared-world/types.js +4 -4
  333. package/dist/routes/terminal/adapter.d.ts +5 -5
  334. package/dist/routes/terminal/adapter.js +9 -9
  335. package/dist/routes/terminal/bundle.d.ts +13 -13
  336. package/dist/routes/terminal/bundle.js +28 -27
  337. package/dist/routes/terminal/credentials.d.ts +8 -8
  338. package/dist/routes/terminal/credentials.js +12 -12
  339. package/dist/routes/terminal/dry-run.d.ts +4 -4
  340. package/dist/routes/terminal/dry-run.js +12 -12
  341. package/dist/routes/terminal/encoding.js +2 -2
  342. package/dist/routes/terminal/ledger.d.ts +5 -5
  343. package/dist/routes/terminal/ledger.js +14 -14
  344. package/dist/routes/terminal/lifetime.d.ts +1 -1
  345. package/dist/routes/terminal/lifetime.js +1 -1
  346. package/dist/routes/terminal/live-finish.d.ts +2 -2
  347. package/dist/routes/terminal/live-finish.js +10 -10
  348. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  349. package/dist/routes/terminal/live-sandbox.js +15 -15
  350. package/dist/routes/terminal/participant-text.js +2 -1
  351. package/dist/routes/terminal/persona.d.ts +2 -2
  352. package/dist/routes/terminal/persona.js +3 -3
  353. package/dist/routes/terminal/plan.d.ts +7 -7
  354. package/dist/routes/terminal/plan.js +15 -15
  355. package/dist/routes/terminal/recorder.js +2 -2
  356. package/dist/routes/terminal/result.d.ts +5 -5
  357. package/dist/routes/terminal/result.js +14 -14
  358. package/dist/routes/terminal/route.d.ts +9 -9
  359. package/dist/routes/terminal/route.js +19 -20
  360. package/dist/routes/terminal/sandbox.d.ts +1 -1
  361. package/dist/routes/terminal/sandbox.js +1 -1
  362. package/dist/routes/terminal/session.d.ts +5 -5
  363. package/dist/routes/terminal/session.js +14 -13
  364. package/dist/routes/terminal/token-usage.d.ts +1 -1
  365. package/dist/routes/terminal/token-usage.js +7 -8
  366. package/dist/routes/terminal/trace.d.ts +4 -4
  367. package/dist/routes/terminal/trace.js +2 -2
  368. package/dist/routes/terminal/types.d.ts +48 -50
  369. package/dist/routes/terminal/types.js +5 -5
  370. package/dist/run/bundle-shape.js +3 -3
  371. package/dist/run/bundle.d.ts +49 -49
  372. package/dist/run/bundle.js +3 -2
  373. package/dist/run/cost-summary.js +3 -3
  374. package/dist/run/costs.d.ts +23 -0
  375. package/dist/run/costs.js +79 -44
  376. package/dist/run/detail.d.ts +6 -6
  377. package/dist/run/detail.js +4 -4
  378. package/dist/run/dry-run-inputs.d.ts +1 -1
  379. package/dist/run/dry-run-inputs.js +2 -2
  380. package/dist/run/dry-run.js +20 -20
  381. package/dist/run/judge.d.ts +19 -13
  382. package/dist/run/judge.js +18 -8
  383. package/dist/run/outcomes.d.ts +1 -1
  384. package/dist/run/participant.d.ts +1 -1
  385. package/dist/run/paths.d.ts +1 -1
  386. package/dist/run/paths.js +1 -1
  387. package/dist/run/preflight-receipts.js +1 -1
  388. package/dist/run/pricing.d.ts +11 -6
  389. package/dist/run/pricing.js +22 -15
  390. package/dist/run/projection.d.ts +46 -46
  391. package/dist/run/projection.js +57 -57
  392. package/dist/run/reclaim.d.ts +1 -1
  393. package/dist/run/reclaim.js +3 -3
  394. package/dist/run/results.d.ts +5 -5
  395. package/dist/run/run-cost.d.ts +53 -0
  396. package/dist/run/run-cost.js +105 -0
  397. package/dist/run/run-index-analysis.d.ts +15 -0
  398. package/dist/run/run-index-analysis.js +77 -0
  399. package/dist/run/run-index.d.ts +19 -7
  400. package/dist/run/run-index.js +77 -64
  401. package/dist/run/run-not-found.d.ts +5 -0
  402. package/dist/run/run-not-found.js +15 -0
  403. package/dist/run/run.d.ts +6 -5
  404. package/dist/run/run.js +3 -3
  405. package/dist/run/sandbox-receipts.d.ts +2 -2
  406. package/dist/run/sandbox-receipts.js +3 -3
  407. package/dist/run/shared-world-evidence.d.ts +37 -36
  408. package/dist/run/shared-world-evidence.js +4 -4
  409. package/dist/run/shared-world-shape.d.ts +1 -1
  410. package/dist/run/shared-world-shape.js +7 -7
  411. package/dist/run/stats.d.ts +14 -8
  412. package/dist/run/stats.js +121 -63
  413. package/dist/run/status.d.ts +16 -29
  414. package/dist/run/status.js +10 -29
  415. package/dist/run/stored-runs.js +2 -1
  416. package/dist/run/stream-shape.js +1 -1
  417. package/dist/run/streams.d.ts +7 -7
  418. package/dist/run/study-provenance.d.ts +49 -0
  419. package/dist/run/study-provenance.js +66 -0
  420. package/dist/run/study-result.d.ts +11 -0
  421. package/dist/run/study-result.js +9 -0
  422. package/dist/run/text.d.ts +2 -0
  423. package/dist/run/text.js +4 -0
  424. package/dist/run-study.d.ts +112 -0
  425. package/dist/{run-lab.js → run-study.js} +52 -47
  426. package/dist/{lab → study}/adapter-extension.d.ts +15 -27
  427. package/dist/{lab → study}/adapter-extension.js +10 -45
  428. package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
  429. package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
  430. package/dist/study/composition-rules.d.ts +7 -0
  431. package/dist/{lab → study}/composition-rules.js +53 -53
  432. package/dist/study/config.d.ts +15 -0
  433. package/dist/{lab → study}/config.js +98 -41
  434. package/dist/study/convert.d.ts +33 -0
  435. package/dist/study/convert.js +432 -0
  436. package/dist/{lab → study}/device-presets.d.ts +10 -10
  437. package/dist/{lab → study}/device-presets.js +11 -11
  438. package/dist/study/discover.d.ts +75 -0
  439. package/dist/{lab → study}/discover.js +134 -95
  440. package/dist/{lab → study}/doctor.d.ts +19 -12
  441. package/dist/{lab → study}/doctor.js +58 -20
  442. package/dist/study/field-paths.d.ts +12 -0
  443. package/dist/study/field-paths.js +126 -0
  444. package/dist/study/files.d.ts +26 -0
  445. package/dist/study/files.js +44 -0
  446. package/dist/{lab → study}/init-templates.d.ts +2 -2
  447. package/dist/study/init-templates.js +421 -0
  448. package/dist/{lab → study}/init.d.ts +2 -2
  449. package/dist/{lab → study}/init.js +46 -11
  450. package/dist/study/keys.d.ts +4 -0
  451. package/dist/{lab → study}/keys.js +46 -12
  452. package/dist/study/migrate.d.ts +48 -0
  453. package/dist/study/migrate.js +408 -0
  454. package/dist/study/owned-files.d.ts +38 -0
  455. package/dist/study/owned-files.js +182 -0
  456. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  457. package/dist/{lab → study}/parse/actors.js +14 -14
  458. package/dist/study/parse/comms.d.ts +12 -0
  459. package/dist/{lab → study}/parse/comms.js +5 -5
  460. package/dist/study/parse/execution.d.ts +19 -0
  461. package/dist/{lab → study}/parse/execution.js +13 -13
  462. package/dist/study/parse/study-v3.d.ts +21 -0
  463. package/dist/study/parse/study-v3.js +259 -0
  464. package/dist/study/parse/subject-state.d.ts +30 -0
  465. package/dist/{lab → study}/parse/subject-state.js +19 -19
  466. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  467. package/dist/{lab → study}/parse/subject.js +34 -34
  468. package/dist/{lab → study}/parse/values.d.ts +3 -3
  469. package/dist/{lab → study}/parse/values.js +3 -3
  470. package/dist/{lab → study}/persona-resolve.d.ts +8 -8
  471. package/dist/{lab → study}/persona-resolve.js +6 -6
  472. package/dist/{lab → study}/plan-base.d.ts +7 -7
  473. package/dist/{lab → study}/plan-base.js +1 -1
  474. package/dist/{lab → study}/plan-participants.d.ts +12 -12
  475. package/dist/{lab → study}/plan-participants.js +4 -4
  476. package/dist/{lab → study}/plan-types.d.ts +31 -31
  477. package/dist/{lab → study}/plan-types.js +2 -2
  478. package/dist/study/plan.d.ts +13 -0
  479. package/dist/study/plan.js +101 -0
  480. package/dist/study/preflight-probes.d.ts +3 -0
  481. package/dist/{lab → study}/preflight-probes.js +20 -19
  482. package/dist/study/preflight-result.d.ts +8 -0
  483. package/dist/{lab → study}/preflight-result.js +5 -4
  484. package/dist/study/preflight.d.ts +94 -0
  485. package/dist/{lab → study}/preflight.js +12 -12
  486. package/dist/{lab → study}/requirements.d.ts +3 -3
  487. package/dist/{lab → study}/requirements.js +1 -1
  488. package/dist/study/route-inputs.d.ts +28 -0
  489. package/dist/{lab → study}/route-inputs.js +1 -1
  490. package/dist/{lab → study}/routing.d.ts +39 -33
  491. package/dist/{lab → study}/routing.js +60 -29
  492. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
  493. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
  494. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
  495. package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
  496. package/dist/study/run-study-options.d.ts +28 -0
  497. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
  498. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
  499. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  500. package/dist/{lab → study}/summary.d.ts +16 -15
  501. package/dist/{lab → study}/summary.js +21 -21
  502. package/dist/{lab → study}/tasks.d.ts +18 -18
  503. package/dist/{lab → study}/tasks.js +14 -14
  504. package/dist/{lab → study}/types.d.ts +202 -196
  505. package/dist/{lab → study}/types.js +3 -1
  506. package/dist/{lab → study}/validation.d.ts +27 -27
  507. package/dist/{lab → study}/validation.js +53 -51
  508. package/dist/study/warnings.d.ts +12 -0
  509. package/dist/{lab → study}/warnings.js +62 -34
  510. package/dist/subject/clone.d.ts +7 -7
  511. package/dist/subject/clone.js +2 -2
  512. package/dist/subject/desktop-cli.d.ts +1 -1
  513. package/dist/subject/desktop-cli.js +2 -2
  514. package/dist/subject/local-tree-archive.d.ts +2 -2
  515. package/dist/subject/local-tree-archive.js +4 -4
  516. package/dist/subject/local-tree.d.ts +4 -4
  517. package/dist/subject/node-bootstrap.js +1 -1
  518. package/dist/subject/runtime.js +9 -10
  519. package/dist/subject/serve.d.ts +5 -5
  520. package/dist/subject/serve.js +3 -3
  521. package/dist/subject/state.d.ts +4 -4
  522. package/dist/subject/state.js +1 -1
  523. package/dist/subject/steps.d.ts +6 -6
  524. package/dist/subject/steps.js +5 -5
  525. package/dist/substrates/command-failure.d.ts +3 -3
  526. package/dist/substrates/command-failure.js +3 -3
  527. package/dist/substrates/desktop-session.js +2 -2
  528. package/dist/substrates/detached.d.ts +6 -6
  529. package/dist/substrates/detached.js +7 -7
  530. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  531. package/dist/substrates/e2b/cdp-probe.js +14 -17
  532. package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
  533. package/dist/substrates/e2b/desktop-browser.js +9 -9
  534. package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
  535. package/dist/substrates/e2b/desktop-cdp.js +9 -9
  536. package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
  537. package/dist/substrates/e2b/desktop-executor.js +13 -13
  538. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  539. package/dist/substrates/e2b/desktop-geometry.js +8 -8
  540. package/dist/substrates/e2b/desktop-media.d.ts +4 -4
  541. package/dist/substrates/e2b/desktop-media.js +1 -1
  542. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  543. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  544. package/dist/substrates/e2b/lifetime.js +1 -1
  545. package/dist/substrates/e2b/sandbox.d.ts +4 -4
  546. package/dist/substrates/e2b/sandbox.js +2 -2
  547. package/dist/substrates/e2b/sdk.d.ts +12 -12
  548. package/dist/substrates/e2b/sdk.js +7 -7
  549. package/dist/substrates/local/runtime-config.d.ts +4 -4
  550. package/dist/substrates/local/runtime-config.js +4 -4
  551. package/dist/tui/actions.d.ts +1 -1
  552. package/dist/tui/actions.js +13 -13
  553. package/dist/tui/contract.d.ts +23 -23
  554. package/dist/tui/contract.js +11 -11
  555. package/dist/tui/launch.d.ts +7 -7
  556. package/dist/tui/launch.js +36 -31
  557. package/dist/tui/project.js +5 -5
  558. package/dist/tui-app.js +139 -139
  559. package/dist/verify/actor.d.ts +8 -8
  560. package/dist/verify/actor.js +36 -36
  561. package/dist/verify/artifacts.d.ts +2 -2
  562. package/dist/verify/artifacts.js +3 -3
  563. package/dist/verify/context-growth.d.ts +9 -0
  564. package/dist/verify/context-growth.js +62 -0
  565. package/dist/verify/costs.d.ts +6 -6
  566. package/dist/verify/costs.js +8 -8
  567. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  568. package/dist/verify/shared-world-concurrent.js +79 -76
  569. package/dist/verify/shared-world.d.ts +2 -2
  570. package/dist/verify/shared-world.js +16 -16
  571. package/dist/verify/subject.d.ts +5 -5
  572. package/dist/verify/subject.js +19 -19
  573. package/dist/verify/verify.js +94 -44
  574. package/docs/README.md +25 -32
  575. package/docs/architecture/actor-contract.md +60 -91
  576. package/docs/architecture/browser-control.md +1 -1
  577. package/docs/architecture/desktop-sessions.md +7 -7
  578. package/docs/architecture/external-public-shared-world.md +68 -65
  579. package/docs/architecture/github-feedback-loop.md +2 -5
  580. package/docs/architecture/guest-desktop.md +2 -2
  581. package/docs/architecture/observer.md +34 -34
  582. package/docs/architecture/restricted-codex-analysis.md +34 -28
  583. package/docs/architecture/serve.md +34 -37
  584. package/docs/architecture/state-driven-executor.md +55 -58
  585. package/docs/architecture/task-protocol-support.md +6 -6
  586. package/docs/architecture/terminal-product-route.md +70 -110
  587. package/docs/contracts/README.md +24 -0
  588. package/docs/contracts/adapter-admission.md +3 -3
  589. package/docs/contracts/adapter-fixtures.md +4 -7
  590. package/docs/contracts/core.md +1 -3
  591. package/docs/contracts/errors.md +62 -0
  592. package/docs/contracts/feedback.md +8 -9
  593. package/docs/contracts/policy.md +7 -12
  594. package/docs/contracts/run-bundle.md +42 -44
  595. package/docs/contracts/schemas.md +446 -368
  596. package/docs/contracts/study-analysis.md +7 -4
  597. package/docs/contracts/study-costs.md +28 -9
  598. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  599. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  600. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  601. package/docs/principles/actor-fidelity.md +4 -4
  602. package/docs/principles/engineering.md +3 -3
  603. package/docs/principles/invariants-and-defaults.md +38 -38
  604. package/docs/principles/self-driving-harness.md +1 -5
  605. package/docs/principles/three-roles.md +1 -1
  606. package/docs/product/automatic-analysis.md +7 -7
  607. package/examples/README.md +1 -1
  608. package/examples/participant/README.md +5 -5
  609. package/examples/participant/run.mjs +11 -10
  610. package/examples/scorer/README.md +3 -3
  611. package/examples/scorer/run.mjs +11 -12
  612. package/examples/scorer/scorer.mjs +3 -3
  613. package/package.json +16 -17
  614. package/skills/humanish/SKILL.md +64 -60
  615. package/skills/humanish/agents/openai.yaml +1 -1
  616. package/AGENTS.md +0 -99
  617. package/CONTRIBUTING.md +0 -148
  618. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  619. package/dist/actors/codex/qualified-versions.js +0 -132
  620. package/dist/cli/commands/lab-format.d.ts +0 -8
  621. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  622. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  623. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  624. package/dist/cli/commands/lab-run.d.ts +0 -9
  625. package/dist/cli/commands/lab.d.ts +0 -3
  626. package/dist/cli/commands/lab.js +0 -199
  627. package/dist/cli/renamed-options.d.ts +0 -11
  628. package/dist/cli/renamed-options.js +0 -18
  629. package/dist/lab/composition-rules.d.ts +0 -7
  630. package/dist/lab/config.d.ts +0 -7
  631. package/dist/lab/discover.d.ts +0 -65
  632. package/dist/lab/init-templates.js +0 -416
  633. package/dist/lab/keys.d.ts +0 -2
  634. package/dist/lab/parse/comms.d.ts +0 -12
  635. package/dist/lab/parse/execution.d.ts +0 -19
  636. package/dist/lab/parse/subject-state.d.ts +0 -30
  637. package/dist/lab/plan.d.ts +0 -19
  638. package/dist/lab/plan.js +0 -132
  639. package/dist/lab/preflight-probes.d.ts +0 -3
  640. package/dist/lab/preflight-result.d.ts +0 -7
  641. package/dist/lab/preflight.d.ts +0 -92
  642. package/dist/lab/route-inputs.d.ts +0 -28
  643. package/dist/lab/run-lab-options.d.ts +0 -28
  644. package/dist/lab/warnings.d.ts +0 -2
  645. package/dist/observer/static.d.ts +0 -39
  646. package/dist/observer/static.js +0 -369
  647. package/dist/run-lab.d.ts +0 -112
  648. package/docs/architecture/comms-inbox.md +0 -122
  649. package/docs/architecture/desktop-recording.md +0 -80
  650. package/docs/architecture/local-browser-runtime.md +0 -178
  651. package/docs/architecture/observer-review.md +0 -144
  652. package/docs/architecture/participant-media.md +0 -90
  653. package/docs/architecture/project-layout.md +0 -62
  654. package/docs/architecture/real-email-receiving.md +0 -136
  655. package/docs/assets/humanish-drawdb-hero.png +0 -0
  656. package/docs/assets/humanish-observer-hero.png +0 -0
  657. package/docs/goals/current.md +0 -207
  658. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  659. package/docs/product/open-source-install-experience.md +0 -240
  660. package/docs/ramp/README.md +0 -295
  661. package/docs/release/open-source-readiness.md +0 -222
  662. package/docs/release/public-readiness-standard.md +0 -210
  663. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  664. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  665. /package/dist/{lab → study}/init-paths.js +0 -0
  666. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  667. /package/dist/{lab → study}/init-plan.js +0 -0
  668. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  669. /package/dist/{lab → study}/participant-assignment.js +0 -0
  670. /package/dist/{lab → study}/persona.d.ts +0 -0
  671. /package/dist/{lab → study}/persona.js +0 -0
package/CONTRIBUTING.md DELETED
@@ -1,148 +0,0 @@
1
- # Contributing
2
-
3
- Thanks for helping make humanish better.
4
-
5
- ## Read these in order
6
-
7
- 1. [README.md](README.md): what humanish does and how a user runs a study.
8
- 2. This file: the ground rules, the commands and what a pull request needs.
9
- 3. [ARCHITECTURE.md](ARCHITECTURE.md): `humanish run <lab>` traced through the code, the code map
10
- and the invariants a change must keep.
11
- 4. [CONTEXT.md](CONTEXT.md): the domain terms and the field spellings that map to them.
12
- 5. [docs/ramp/README.md](docs/ramp/README.md), for depth: current state, how to pick work and the
13
- quality bar.
14
-
15
- [docs/README.md](https://github.com/danielgwilson/humanish/blob/main/docs/README.md) sorts the rest of `docs/` into guides, reference, design records
16
- and history.
17
-
18
- ## Ground Rules
19
-
20
- - Follow [engineering principles](docs/principles/engineering.md): prefer simple,
21
- idiomatic implementations and reuse established components. Validate the changed
22
- behavior and material risks; keep required CI and release gates.
23
- - Keep examples synthetic and public-safe.
24
- - Do not commit `.env*`, `.npmrc`, `.humanish/`, generated run bundles, provider
25
- credentials, private screenshots, raw transcripts, or customer data.
26
- - Prefer small PRs with explicit proof commands.
27
- - Keep a target product's page names, milestones, and vocabulary in adapters.
28
- - For changes to credentials, provider spend, hosted execution or GitHub mutation,
29
- state the relevant authority and failure boundaries. Use dry runs where useful;
30
- they do not establish live behavior.
31
-
32
- ## Local Setup
33
-
34
- Use Node.js 22.19 or newer and pnpm 12; `packageManager` in `package.json` pins the pnpm version.
35
-
36
- ```bash
37
- pnpm install --frozen-lockfile # as CI installs
38
- pnpm vitest run tests/<file> # while editing: one test file, a few seconds
39
- pnpm docs:check # after editing a doc: paths, anchors, symbols, the CLI reference
40
- pnpm format # oxfmt; run before every commit
41
- pnpm release:check # once before pushing: the gate CI's test job runs
42
- ```
43
-
44
- `release:check` runs `pnpm check` (format, lint, knip, the prose and vocabulary caps, typecheck,
45
- the test suites, build and the startup proofs), then `api:proof`, `public-surface:scan`,
46
- `skill:check` and `npm pack --dry-run`. On a 16-core Linux machine it takes about 6 minutes, 4 of
47
- them in `pnpm check`. The test step prints nothing for a few minutes while it runs. `skill:check`
48
- calls `npx skills`, so it needs network access.
49
-
50
- CI (`.github/workflows/ci.yml`) runs six jobs on every pull request and every push to `main`:
51
-
52
- | Job | What it runs |
53
- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
54
- | `test` (Node 22.19.0 and 24) | `pnpm release:check` |
55
- | `site` | `pnpm docs:check`, then the site's typecheck, `registry:check` and build |
56
- | `observer` | `pnpm build`, the Observer's typecheck and tests, `pnpm browser-control:proof` and the four `observer:*:proof` scripts in Chromium |
57
- | `tui` | The TUI's typecheck and tests |
58
- | `guest-desktop` | Builds the guest image and runs `pnpm guest-desktop:proof`, only when guest files change |
59
- | `secret-scan` | gitleaks over the full git history |
60
-
61
- Two kinds of change need one more step:
62
-
63
- - After changing a CLI option, run `pnpm docs:generate`. `pnpm docs:check` fails on a stale
64
- `site/content/docs/cli.mdx`.
65
- - After changing what `src/index.ts` exports, run `pnpm build`, then `pnpm api:proof --update`, and
66
- review the diff to `tests/golden/public-api.json`. `pnpm api:proof` also runs `examples/` against
67
- the packed package.
68
-
69
- `pnpm format` rewrites files with oxfmt. `pnpm check` fails on unformatted files.
70
- It also holds three counts to caps in package.json: oxlint warnings (`lint`), prose in `src/`
71
- comments (`prose:check`: issue references, `FIX-N` tags, all-caps emphasis), and identifiers and
72
- file names in `src/` outside the exempt contract modules that still say lane, seat, role, sim or
73
- study (`vocabulary:check`). Each check fails when its count rises above the cap and also when it
74
- falls below it, so the PR that reduces a count lowers the cap in the same commit; the failure
75
- message names the flag and the new value. CI's `caps` workflow (`scripts/check-cap-direction.mjs`)
76
- also fails a PR that raises or removes a cap against the base branch, unless the PR has the
77
- `raise-cap` label and a `Cap raise:` line in its body that says why. `pnpm lint` prints the warnings
78
- that already exist, several hundred of them; that is expected. `pnpm knip` fails on unused files,
79
- dependencies and exports, and on any import cycle.
80
-
81
- ## Useful Commands
82
-
83
- ```bash
84
- pnpm humanish --help
85
- pnpm humanish watch --json --no-open
86
- pnpm humanish verify --run latest --json
87
- pnpm pack:dry-run
88
- ```
89
-
90
- ## Make your first change
91
-
92
- This walkthrough changes the persona id a computer-use participant gets when neither the
93
- participant nor its actor names one. It runs offline and spends nothing. Two tests pin the id, and
94
- the steps below update both.
95
-
96
- 1. Change `FALLBACK_PERSONA_ID` (`src/routes/computer-use/participant-prompt.ts`) from
97
- `"cua-operator"` to a new id.
98
- 2. Run `pnpm vitest run tests/routes/computer-use/lane-persona-fallback.test.ts`. It fails because
99
- it asserts the old id. Update the assertion once the new id is what you want.
100
- 3. Run `pnpm vitest run tests/routes/computer-use/local-vm.golden.test.ts`. It fails because the
101
- local VM golden, `tests/golden/routes/computer-use-local-vm-live.json`, records the persona id.
102
- Rerun it with `-u` to rewrite the golden, then check with `git diff tests/golden/` that only
103
- the persona id changed.
104
- 4. Run `mkdir -p .humanish/local/labs`, then copy `humanish/labs/dwell-window-todomvc.yaml` to
105
- `.humanish/local/labs/walkthrough.yaml`. Change its `id` to `walkthrough` and delete its
106
- `persona:` line.
107
- 5. Run `pnpm humanish run walkthrough --dry-run --no-open`. It prints the run id on its `run:`
108
- line. Check `persona.id` in `.humanish/runs/<runId>/run.json`.
109
- 6. Run `pnpm humanish verify --run latest`, then `pnpm format` and `pnpm release:check`.
110
-
111
- Common changes touch these tests and contracts:
112
-
113
- | Change | Tests | Contract or doc to update |
114
- | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
115
- | A lab manifest field | `tests/lab/config.test.ts`, the route's tests. Its cases pin each lab's warnings, so a new warning fails cases that expect none | `docs/contracts/schemas.md`, `site/content/docs/lab-manifests.mdx` |
116
- | A CLI option | the command's tests under `tests/cli/` | Run `pnpm docs:generate` to update `site/content/docs/cli.mdx` |
117
- | A `run.json` field | the route's tests; rerun them with `-u` to update `tests/golden/routes/` and `tests/golden/failures/<route>/` | `docs/contracts/run-bundle.md` |
118
- | An actor trace field | `tests/actors/`, `tests/actors/conformance.test.ts`, then the route goldens with `-u` | `docs/contracts/schemas.md#actor-trace`, `docs/architecture/actor-contract.md` |
119
- | Observer data | `tests/observer/data-contract.test.ts` with `UPDATE_OBSERVER_DATA_GOLDENS=1` | `docs/architecture/observer.md` |
120
- | Observer UI | `observer/tests/` and the four `observer:*:proof` scripts | `observer/AGENTS.md` |
121
- | A route's behavior | the route's folder in `tests/routes/` (the scripted route's main suite is `tests/routes/scripted/route.test.ts`), `tests/lab/task-route-preflight.test.ts` | the support matrix in `docs/ramp/README.md` |
122
- | An actor | `tests/actors/`, `tests/actors/conformance.test.ts` | `docs/architecture/actor-contract.md` |
123
- | Redaction or share safety | `tests/evidence/`, `tests/run/transient-comms-secrets.test.ts` | `docs/contracts/policy.md` |
124
- | Study analysis | `tests/analysis/` | `docs/contracts/study-analysis.md` |
125
- | A public export | `pnpm build` and `pnpm api:proof` (`--update` to accept) | `tests/golden/public-api.json` |
126
- | An example | `pnpm build` and `pnpm api:proof`, which runs every example | `examples/README.md` |
127
-
128
- Three folders hold fixtures. `tests/fixtures/` holds test inputs, `humanish/fixtures/` holds the
129
- synthetic apps this repo's own labs start, and the root `fixtures/` holds synthetic apps and cases
130
- that several tests and scripts copy, such as `fixtures/minimal-app/`.
131
-
132
- ### Find the test folders outside the `src/` mirror
133
-
134
- Most of `tests/` mirrors `src/`. Six folders sit outside that mirror. `tests/admission/` pins what the CLI and the
135
- library do when they refuse a lab before a run starts, and `tests/scripts/` tests `scripts/`.
136
- `tests/surface/` checks the README, the site, `site/public/llms.txt`, the agent skill and the package
137
- against the shipped CLI. `tests/helpers/`, `tests/fixtures/` and `tests/golden/` hold shared test
138
- code, inputs and goldens.
139
-
140
- ## Pull Requests
141
-
142
- PRs should include:
143
-
144
- - a concise summary;
145
- - why the design is the simplest adequate option, when adding architectural complexity;
146
- - proof commands and outcomes;
147
- - any remaining gaps;
148
- - confirmation that fixtures and examples are synthetic or redacted.
@@ -1,72 +0,0 @@
1
- /**
2
- * Codex CLI releases the restricted launcher admits, per host, oldest first. Each qualified
3
- * release needs a receipt under docs/goals/computer-use-actor/receipts/ that meets
4
- * docs/architecture/restricted-codex-analysis.md ("Admitting a Codex CLI release"). Removing a
5
- * release stops new launches; saved bundles stay readable through the separate reader lists in
6
- * src/actors/contract.ts.
7
- *
8
- * A release string is a compatibility check, not binary attestation: the launcher compares what
9
- * `codex --version`, initialize and thread start report, and a modified binary can report any
10
- * of them.
11
- */
12
- export declare const QUALIFIED_CODEX_CLI_VERSIONS: {
13
- readonly "linux-x64": readonly ["0.154.0", "0.157.1", "0.159.2", "0.159.3", "0.160.0"];
14
- readonly "darwin-arm64": readonly ["0.154.0"];
15
- };
16
- /**
17
- * The pre-existing admission, not a qualification. Hosted participants on these hosts ran
18
- * 0.154.0 while it was the only admitted release, and they keep it; no qualification has run
19
- * on either host, and no later release is admitted there.
20
- */
21
- export declare const PREEXISTING_CODEX_CLI_ADMISSIONS: {
22
- readonly "linux-arm64": readonly ["0.154.0"];
23
- readonly "darwin-x64": readonly ["0.154.0"];
24
- };
25
- type QualifiedHost = keyof typeof QUALIFIED_CODEX_CLI_VERSIONS;
26
- type PreexistingHost = keyof typeof PREEXISTING_CODEX_CLI_ADMISSIONS;
27
- export type CodexHost = QualifiedHost | PreexistingHost;
28
- export type AdmittedCodexCliVersion = (typeof QUALIFIED_CODEX_CLI_VERSIONS)[QualifiedHost][number] | (typeof PREEXISTING_CODEX_CLI_ADMISSIONS)[PreexistingHost][number];
29
- export declare function codexHost(platform: NodeJS.Platform, arch: string): CodexHost | undefined;
30
- /** Releases that passed qualification on this host; the pre-existing admission is excluded. */
31
- export declare function qualifiedCodexCliVersions(platform: NodeJS.Platform, arch: string): readonly AdmittedCodexCliVersion[];
32
- /** Everything the launcher starts on this host: qualified releases or the pre-existing one. */
33
- export declare function admittedCodexCliVersions(platform: NodeJS.Platform, arch: string): readonly AdmittedCodexCliVersion[];
34
- /** What a declaration names before the installed CLI is detected: the host's newest release. */
35
- export declare function defaultCodexCliVersion(platform?: NodeJS.Platform, arch?: string): AdmittedCodexCliVersion;
36
- /** The version from `codex --version` output (`codex-cli 0.157.1`); any other shape is undefined. */
37
- export declare function parseCodexCliVersion(stdout: string): string | undefined;
38
- /**
39
- * doctor's recovery for an unadmitted CLI: the release it found and where, what this host admits,
40
- * and how to replace that binary with the newest admitted release.
41
- */
42
- export declare function codexVersionRecovery(detected: string | undefined, installation?: CodexInstallation, platform?: NodeJS.Platform, arch?: string): string;
43
- /**
44
- * Where the `codex` humanish found was installed, which decides the command that replaces it.
45
- * `path` is the file on `PATH`.
46
- */
47
- export type CodexInstallation = {
48
- readonly kind: "project";
49
- readonly path: string;
50
- readonly project: string;
51
- } | {
52
- readonly kind: "global";
53
- readonly path: string;
54
- } | {
55
- readonly kind: "other";
56
- readonly path: string;
57
- };
58
- /**
59
- * Classifies the `codex` on `PATH` by the file it resolves to. A project's node_modules/.bin/codex
60
- * resolving into that project's @openai/codex is project-local, so `npx` runs it before any global
61
- * install. One inside npm's global prefix (`npm prefix -g`) is global. Anything else, such as
62
- * Homebrew or a standalone download, is other.
63
- */
64
- export declare function classifyCodexInstallation(found: {
65
- path: string;
66
- resolved: string;
67
- }, npmGlobalPrefix: string | undefined): CodexInstallation;
68
- /** One sentence: how to put the newest admitted Codex CLI in place of the one humanish found. */
69
- export declare function codexInstallAdvice(installation: CodexInstallation | undefined, platform?: NodeJS.Platform, arch?: string): string;
70
- /** For refusal messages: the admitted releases on this host, or every host when it has none. */
71
- export declare function describeQualifiedCodexCliVersions(platform?: NodeJS.Platform, arch?: string): string;
72
- export {};
@@ -1,132 +0,0 @@
1
- import path from "node:path";
2
- /**
3
- * Codex CLI releases the restricted launcher admits, per host, oldest first. Each qualified
4
- * release needs a receipt under docs/goals/computer-use-actor/receipts/ that meets
5
- * docs/architecture/restricted-codex-analysis.md ("Admitting a Codex CLI release"). Removing a
6
- * release stops new launches; saved bundles stay readable through the separate reader lists in
7
- * src/actors/contract.ts.
8
- *
9
- * A release string is a compatibility check, not binary attestation: the launcher compares what
10
- * `codex --version`, initialize and thread start report, and a modified binary can report any
11
- * of them.
12
- */
13
- export const QUALIFIED_CODEX_CLI_VERSIONS = {
14
- "linux-x64": ["0.154.0", "0.157.1", "0.159.2", "0.159.3", "0.160.0"],
15
- "darwin-arm64": ["0.154.0"],
16
- };
17
- /**
18
- * The pre-existing admission, not a qualification. Hosted participants on these hosts ran
19
- * 0.154.0 while it was the only admitted release, and they keep it; no qualification has run
20
- * on either host, and no later release is admitted there.
21
- */
22
- export const PREEXISTING_CODEX_CLI_ADMISSIONS = {
23
- "linux-arm64": ["0.154.0"],
24
- "darwin-x64": ["0.154.0"],
25
- };
26
- const HOST_LABELS = {
27
- "linux-x64": "Linux x64",
28
- "darwin-arm64": "macOS arm64",
29
- "linux-arm64": "Linux arm64",
30
- "darwin-x64": "macOS x64",
31
- };
32
- export function codexHost(platform, arch) {
33
- const host = `${platform}-${arch}`;
34
- return Object.hasOwn(QUALIFIED_CODEX_CLI_VERSIONS, host) ||
35
- Object.hasOwn(PREEXISTING_CODEX_CLI_ADMISSIONS, host)
36
- ? host
37
- : undefined;
38
- }
39
- /** Releases that passed qualification on this host; the pre-existing admission is excluded. */
40
- export function qualifiedCodexCliVersions(platform, arch) {
41
- const host = codexHost(platform, arch);
42
- return host !== undefined && Object.hasOwn(QUALIFIED_CODEX_CLI_VERSIONS, host)
43
- ? QUALIFIED_CODEX_CLI_VERSIONS[host]
44
- : [];
45
- }
46
- /** Everything the launcher starts on this host: qualified releases or the pre-existing one. */
47
- export function admittedCodexCliVersions(platform, arch) {
48
- const host = codexHost(platform, arch);
49
- if (host === undefined)
50
- return [];
51
- return Object.hasOwn(QUALIFIED_CODEX_CLI_VERSIONS, host)
52
- ? QUALIFIED_CODEX_CLI_VERSIONS[host]
53
- : PREEXISTING_CODEX_CLI_ADMISSIONS[host];
54
- }
55
- /** What a declaration names before the installed CLI is detected: the host's newest release. */
56
- export function defaultCodexCliVersion(platform = process.platform, arch = process.arch) {
57
- return (admittedCodexCliVersions(platform, arch).at(-1) ??
58
- QUALIFIED_CODEX_CLI_VERSIONS["linux-x64"].at(-1));
59
- }
60
- /** The version from `codex --version` output (`codex-cli 0.157.1`); any other shape is undefined. */
61
- export function parseCodexCliVersion(stdout) {
62
- return /^codex-cli ([0-9][0-9A-Za-z.+-]{0,63})$/.exec(stdout.trim())?.[1];
63
- }
64
- function describeHost(host) {
65
- return Object.hasOwn(QUALIFIED_CODEX_CLI_VERSIONS, host)
66
- ? QUALIFIED_CODEX_CLI_VERSIONS[host].join(", ")
67
- : `${PREEXISTING_CODEX_CLI_ADMISSIONS[host].join(", ")} (pre-existing admission, not qualified)`;
68
- }
69
- /**
70
- * doctor's recovery for an unadmitted CLI: the release it found and where, what this host admits,
71
- * and how to replace that binary with the newest admitted release.
72
- */
73
- export function codexVersionRecovery(detected, installation, platform = process.platform, arch = process.arch) {
74
- const found = detected === undefined
75
- ? "The installed Codex CLI did not report a recognizable version"
76
- : `Found Codex CLI ${detected}`;
77
- const where = installation === undefined ? "" : ` at \`${installation.path}\``;
78
- return `${found}${where}; ${describeQualifiedCodexCliVersions(platform, arch)}. ${codexInstallAdvice(installation, platform, arch)} Then sign in with a ChatGPT account (\`codex login\`).`;
79
- }
80
- const inside = (file, directory) => file.startsWith(`${directory}${path.sep}`);
81
- /**
82
- * Classifies the `codex` on `PATH` by the file it resolves to. A project's node_modules/.bin/codex
83
- * resolving into that project's @openai/codex is project-local, so `npx` runs it before any global
84
- * install. One inside npm's global prefix (`npm prefix -g`) is global. Anything else, such as
85
- * Homebrew or a standalone download, is other.
86
- */
87
- export function classifyCodexInstallation(found, npmGlobalPrefix) {
88
- const bin = path.dirname(found.path);
89
- const modules = path.dirname(bin);
90
- if (path.basename(bin) === ".bin" &&
91
- path.basename(modules) === "node_modules" &&
92
- inside(found.resolved, path.join(modules, "@openai", "codex")))
93
- return { kind: "project", path: found.path, project: path.dirname(modules) };
94
- if (npmGlobalPrefix !== undefined &&
95
- (found.path === path.join(npmGlobalPrefix, "bin", "codex") ||
96
- inside(found.resolved, path.join(npmGlobalPrefix, "lib", "node_modules", "@openai", "codex"))))
97
- return { kind: "global", path: found.path };
98
- return { kind: "other", path: found.path };
99
- }
100
- /**
101
- * The command that installs the newest admitted Codex CLI where it replaces the one humanish
102
- * found: in its project for a project-local install, otherwise npm's global install.
103
- */
104
- function codexInstallCommand(installation, platform = process.platform, arch = process.arch) {
105
- const version = defaultCodexCliVersion(platform, arch);
106
- return installation?.kind === "project"
107
- ? `npm install -D @openai/codex@${version}`
108
- : `npm install -g @openai/codex@${version}`;
109
- }
110
- /** One sentence: how to put the newest admitted Codex CLI in place of the one humanish found. */
111
- export function codexInstallAdvice(installation, platform = process.platform, arch = process.arch) {
112
- const command = codexInstallCommand(installation, platform, arch);
113
- switch (installation?.kind) {
114
- case undefined:
115
- return `Install the newest with \`${command}\`.`;
116
- case "global":
117
- return `Replace it with \`${command}\`.`;
118
- case "project":
119
- return `It is installed in this project: run \`${command}\` in \`${installation.project}\`, or \`npm uninstall @openai/codex\` there to use the global Codex.`;
120
- case "other":
121
- return `Update it with the tool that installed it, or put Codex ${defaultCodexCliVersion(platform, arch)} first on PATH.`;
122
- }
123
- }
124
- /** For refusal messages: the admitted releases on this host, or every host when it has none. */
125
- export function describeQualifiedCodexCliVersions(platform = process.platform, arch = process.arch) {
126
- const host = codexHost(platform, arch);
127
- if (host !== undefined)
128
- return `${HOST_LABELS[host]} accepts Codex CLI ${describeHost(host)}`;
129
- return Object.keys(HOST_LABELS)
130
- .map((key) => `${HOST_LABELS[key]}: ${describeHost(key)}`)
131
- .join("; ");
132
- }
@@ -1,8 +0,0 @@
1
- import type { CuaActorLabResult } from "../../routes/computer-use/types.js";
2
- import type { ScriptedBrowserLabResult } from "../../routes/scripted/types.js";
3
- import type { TerminalProductLabResult } from "../../routes/terminal/types.js";
4
- import type { ConcurrentSharedWorldLabResult } from "../../routes/shared-world/types.js";
5
- export declare function formatConcurrentSharedWorldLabHuman(result: ConcurrentSharedWorldLabResult): string;
6
- export declare function formatTerminalLabHuman(result: TerminalProductLabResult): string;
7
- export declare function formatScriptedLabHuman(result: ScriptedBrowserLabResult): string;
8
- export declare function formatCuaLabHuman(result: CuaActorLabResult): string;
@@ -1,19 +0,0 @@
1
- import { type InternalRunLabOptions, type LabOutcome } from "../../run-lab.js";
2
- import type { LabConfig } from "../../lab/types.js";
3
- import type { LoadedAdapterScorer } from "./lab-scorer.js";
4
- export interface RouteRun {
5
- readonly options: InternalRunLabOptions;
6
- present(outcome: LabOutcome): Promise<void>;
7
- /** Handles an error runLab threw, and rethrows any it does not handle. */
8
- onRunError?(error: unknown): Promise<void>;
9
- }
10
- /**
11
- * Plans the lab with a route's options, then presents the refusal or the run. `beforeRun` runs
12
- * only for a plan that will run: it loads the scorer, or writes its own refusal and returns
13
- * undefined, so a refused lab never imports the scorer's host code. `afterRun` runs once runLab
14
- * has returned or thrown, before presentation, which may hold its own signal handlers (watch's
15
- * Observer and tunnel).
16
- */
17
- export declare function runRoute(config: LabConfig, run: RouteRun, beforeRun?: () => Promise<{
18
- scorer?: LoadedAdapterScorer;
19
- } | undefined>, afterRun?: () => void): Promise<void>;
@@ -1,17 +0,0 @@
1
- import { Command } from "commander";
2
- import type { LabConfig } from "../../lab/types.js";
3
- import { type CliIo, type LabCommandOptions } from "../io.js";
4
- import type { RouteRun } from "./lab-route-run.js";
5
- interface ScriptedRouteArgs {
6
- command: Command;
7
- io: CliIo;
8
- config: LabConfig;
9
- mode: "run" | "watch";
10
- options: LabCommandOptions;
11
- }
12
- /**
13
- * The scripted route's CLI setup: its open semantics and runLab options, and how it presents the
14
- * outcome. Undefined when watch-mode setup has already written its own result.
15
- */
16
- export declare function scriptedRouteRun(args: ScriptedRouteArgs): RouteRun | undefined;
17
- export {};
@@ -1,17 +0,0 @@
1
- import { Command } from "commander";
2
- import type { LabConfig } from "../../lab/types.js";
3
- import { type CliIo, type LabCommandOptions } from "../io.js";
4
- import type { RouteRun } from "./lab-route-run.js";
5
- interface TerminalRouteArgs {
6
- command: Command;
7
- io: CliIo;
8
- config: LabConfig;
9
- mode: "run" | "watch";
10
- options: LabCommandOptions;
11
- }
12
- /**
13
- * The terminal route's CLI setup: its open semantics and runLab options, and how it presents the
14
- * outcome. Undefined when watch-mode setup has already written its own result.
15
- */
16
- export declare function terminalRouteRun(args: TerminalRouteArgs): RouteRun | undefined;
17
- export {};
@@ -1,9 +0,0 @@
1
- import { Command } from "commander";
2
- import { type CliIo, type LabCommandOptions } from "../io.js";
3
- export declare function runLabCommand(args: {
4
- command: Command;
5
- io: CliIo;
6
- lab: string;
7
- mode: "run" | "watch";
8
- options: LabCommandOptions;
9
- }): Promise<void>;
@@ -1,3 +0,0 @@
1
- import { Command } from "commander";
2
- import { type CliIo } from "../io.js";
3
- export declare function registerLabCommands(parent: Command, io: CliIo): void;
@@ -1,199 +0,0 @@
1
- import { formatAutomaticAnalysisBudget } from "../../analysis/automatic-config.js";
2
- import { resolve } from "node:path";
3
- import { Command, Option } from "commander";
4
- import { inspectLabManifest, listLabManifests } from "../../lab/discover.js";
5
- import { runLabPreflight, } from "../../lab/preflight.js";
6
- import { runLabCommand } from "./lab-run.js";
7
- import { countOption, participantsOption } from "../renamed-options.js";
8
- import { applyEnvFileOption, JSON_OPTION_DESCRIPTION, parsePositiveInteger, writeResult, } from "../io.js";
9
- export function registerLabCommands(parent, io) {
10
- const lab = parent
11
- .command("lab")
12
- .description("List, inspect, and run humanish lab manifests.")
13
- .summary("List, inspect, and run humanish lab manifests.");
14
- lab
15
- .command("list")
16
- .description("List committed and ignored humanish lab manifests.")
17
- .option("--cwd <path>", "Target project directory.", ".")
18
- .option("--json", JSON_OPTION_DESCRIPTION)
19
- .action((options, command) => handleLabList(io, options, command));
20
- lab
21
- .command("inspect")
22
- .argument("<lab>", "Lab id or .yaml path.")
23
- .description("Inspect a humanish lab manifest without running it.")
24
- .option("--cwd <path>", "Target project directory.", ".")
25
- .option("--json", JSON_OPTION_DESCRIPTION)
26
- .action((labName, options, command) => handleLabInspect(io, labName, options, command));
27
- lab
28
- .command("preflight")
29
- .argument("<lab>", "Lab id or .yaml path.")
30
- .description("Check lab metadata or explicitly probe reachability. Metadata mode does not verify setup; use doctor --lab <lab> first.")
31
- .option("--cwd <path>", "Target project directory.", ".")
32
- .addOption(new Option("--reachability <mode>", "Reachability mode.")
33
- .choices(["metadata", "public-preview", "sandbox-loopback", "prepared-host"])
34
- .default("metadata"))
35
- .option("--timeout-ms <ms>", "Target reachability timeout.", String(30_000))
36
- .option("--env-file <path>", "Load a local env file for this preflight without persisting values.")
37
- .option("--json", JSON_OPTION_DESCRIPTION)
38
- .action((labName, options, command) => handleLabPreflight(io, labName, options, command));
39
- lab
40
- .command("run")
41
- .argument("<lab>", "Lab id or .yaml path.")
42
- .description("Run a humanish lab manifest. Same as `humanish run <lab>`, grouped under `lab`.")
43
- .option("--env-file <path>", "Load a local env file for this lab without persisting values.")
44
- .option("--dry-run", "Render contract evidence without live provider spend.")
45
- .option("--open", "Open the observer in the default browser.")
46
- .option("--no-open", "Render without opening a browser.")
47
- .option("--detach", "Render/open once and exit without attached watch server.")
48
- .option("--port <port>", "Local observer server port when following.", "0")
49
- .option("--count <count>", "Override the participant count of a preview or computer-use lab.")
50
- // The older spelling of --count, hidden and noted on stderr (renamed-options.ts).
51
- .addOption(new Option("--sims <count>").hideHelp())
52
- .option("--rerun-failed-from <run>", "CUA fan-out only: create a new run for failed participants from a prior run.")
53
- .option("--participants <ids>", "CUA rerun only: comma-separated participant ids from the source run. Ids are the lab's declared actors[0].lanes[].id, or lane-01, lane-02, … by position.")
54
- // The older spelling of --participants, hidden and noted on stderr (renamed-options.ts).
55
- .addOption(new Option("--lanes <participant-ids>").hideHelp())
56
- .option("--run-id <id>", "Explicit lab run id; refused when that run already exists.")
57
- .option("--cwd <path>", "Target project directory.", ".")
58
- .option("--scorer <path>", "Terminal/computer-use/shared-world labs only: repo-relative adopter scorer module (.mjs). Overrides review.scorer.ref. Executable code: review it as code.")
59
- .option("--json", JSON_OPTION_DESCRIPTION)
60
- .addHelpText("after", [
61
- "",
62
- "Examples:",
63
- " humanish lab run first-run",
64
- " humanish lab run fanout-demo --rerun-failed-from latest --participants lane-02,lane-04",
65
- " humanish lab run my-terminal-lab --scorer scorers/product.mjs",
66
- " humanish lab run .humanish/labs/private-dogfood.yaml --env-file .humanish/local/provider.env",
67
- "",
68
- "Human watch path:",
69
- " humanish watch first-run",
70
- " humanish watch --lab .humanish/labs/local.yaml",
71
- ].join("\n"))
72
- .action((labName, options, command) => handleLabRun(io, labName, options, command));
73
- }
74
- async function handleLabList(io, options, command) {
75
- const result = await listLabManifests(options.cwd);
76
- writeResult(command, io, result, formatLabListHuman);
77
- io.setExitCode(0);
78
- }
79
- async function handleLabInspect(io, labName, options, command) {
80
- const result = await inspectLabManifest(options.cwd, labName);
81
- writeResult(command, io, result, formatLabInspectHuman);
82
- io.setExitCode(result.ok ? 0 : 2);
83
- }
84
- async function handleLabPreflight(io, labName, options, command) {
85
- if (!(await applyEnvFileOption({
86
- command,
87
- cwd: options.cwd,
88
- envFile: options.envFile,
89
- io,
90
- }))) {
91
- return;
92
- }
93
- const timeoutMs = parsePositiveInteger(options.timeoutMs);
94
- if (timeoutMs === null) {
95
- const result = {
96
- schema: "humanish.lab-preflight-result.v1",
97
- ok: false,
98
- cwd: resolve(options.cwd),
99
- lab: labName,
100
- reachability: options.reachability,
101
- checks: [{ name: "timeout", ok: false, message: "--timeout-ms must be a positive integer." }],
102
- targets: [],
103
- sandbox: { created: false },
104
- spend: { e2bDesktop: false, model: false },
105
- warnings: [],
106
- error: {
107
- code: "HUMANISH_LAB_PREFLIGHT_INVALID_OPTION",
108
- message: "--timeout-ms must be a positive integer.",
109
- },
110
- };
111
- writeResult(command, io, result, formatLabPreflightHuman);
112
- io.setExitCode(2);
113
- return;
114
- }
115
- const result = await runLabPreflight({
116
- cwd: options.cwd,
117
- lab: labName,
118
- reachability: options.reachability,
119
- timeoutMs,
120
- });
121
- writeResult(command, io, result, formatLabPreflightHuman);
122
- io.setExitCode(result.ok ? 0 : 2);
123
- }
124
- async function handleLabRun(io, labName, options, command) {
125
- const count = countOption(io, options);
126
- const participants = participantsOption(io, options);
127
- if (!(await applyEnvFileOption({
128
- command,
129
- cwd: options.cwd,
130
- envFile: options.envFile,
131
- io,
132
- // runLabCommand discovers keys once the lab resolves to a live run.
133
- discoverKeys: false,
134
- }))) {
135
- return;
136
- }
137
- await runLabCommand({
138
- command,
139
- io,
140
- lab: labName,
141
- mode: "run",
142
- options: { ...options, count, participants },
143
- });
144
- }
145
- function formatLabListHuman(result) {
146
- if (result.labs.length === 0) {
147
- return ([
148
- `No humanish labs found in ${result.cwd}`,
149
- "Create one under humanish/labs/*.yaml, .humanish/labs/*.yaml, or pass a .yaml path.",
150
- ...result.warnings.map((warning) => `warning: ${warning}`),
151
- ].join("\n") + "\n");
152
- }
153
- return ([
154
- "humanish labs",
155
- ...result.labs.map((lab) => `- ${lab.id} ${lab.source} ${lab.origin} ${lab.path}${lab.title ? ` (${lab.title})` : ""}`),
156
- ...result.warnings.map((warning) => `warning: ${warning}`),
157
- ].join("\n") + "\n");
158
- }
159
- function formatLabInspectHuman(result) {
160
- if (!result.ok || !result.config) {
161
- return `${result.error?.code}: ${result.error?.message}\n`;
162
- }
163
- const config = result.config;
164
- return ([
165
- "humanish lab",
166
- `id: ${config.id}`,
167
- `subject: ${config.subject.source}`,
168
- ...(config.execution?.target ? [`execution: ${config.execution.target}`] : []),
169
- `actors: ${config.actors.map((actor) => actor.type).join(", ")}`,
170
- ...(config.title ? [`title: ${config.title}`] : []),
171
- ...(config.description ? [`description: ${config.description}`] : []),
172
- ...(result.path ? [`path: ${result.path}`] : []),
173
- ...(result.origin ? [`origin: ${result.origin}`] : []),
174
- ...(config.subject.repos?.length ? [`repos: ${config.subject.repos.join(", ")}`] : []),
175
- ...(result.personas ?? []).map((persona) => `persona ${persona.id}: ${persona.brief ? `authored context (before runtime additions)\n${persona.brief.text}` : "unresolved; id only"}`),
176
- ...result.warnings.map((warning) => `warning: ${warning}`),
177
- ].join("\n") + "\n");
178
- }
179
- function formatLabPreflightHuman(result) {
180
- const checkedTargets = result.targets.filter((target) => target.checked);
181
- const reachableTargets = checkedTargets.filter((target) => target.reachable === true);
182
- const blockedTargets = result.targets.filter((target) => target.status === "blocked");
183
- return ([
184
- `humanish lab preflight ${result.ok ? "passed" : "failed"}`,
185
- `lab: ${result.labId ?? result.lab}`,
186
- ...(result.route ? [`route: ${result.route}`] : []),
187
- `reachability: ${result.reachability}`,
188
- `targets: ${checkedTargets.length ? `${reachableTargets.length}/${checkedTargets.length} reachable` : `${result.targets.length} declared, not checked`}`,
189
- ...(blockedTargets.length ? [`blocked-targets: ${blockedTargets.length}`] : []),
190
- `spend: ${result.spend.e2bDesktop ? "one e2b desktop, no model calls" : "none"}`,
191
- ...(result.analysis ? [formatAutomaticAnalysisBudget(result.analysis)] : []),
192
- ...(result.sandbox.created
193
- ? [`sandbox: created=yes killed=${result.sandbox.killed === true ? "yes" : "no"}`]
194
- : []),
195
- ...result.checks.map((check) => `- ${check.ok ? "ok" : "fail"} ${check.name}: ${check.message}`),
196
- ...(result.error ? [`error: ${result.error.code}: ${result.error.message}`] : []),
197
- ...result.warnings.map((warning) => `warning: ${warning}`),
198
- ].join("\n") + "\n");
199
- }
@@ -1,11 +0,0 @@
1
- import type { CliIo } from "./io.js";
2
- /** `--participants`, or `--lanes` when only the older spelling is set. */
3
- export declare function participantsOption(io: CliIo, options: {
4
- participants?: string | undefined;
5
- lanes?: string | undefined;
6
- }): string | undefined;
7
- /** `--count`, or `--sims` when only the older spelling is set. */
8
- export declare function countOption(io: CliIo, options: {
9
- count?: string | undefined;
10
- sims?: string | undefined;
11
- }): string | undefined;