humanish 0.106.1 → 0.107.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 (453) hide show
  1. package/AGENTS.md +4 -4
  2. package/ARCHITECTURE.md +17 -16
  3. package/CHANGELOG.md +14 -0
  4. package/CONTEXT.md +42 -39
  5. package/CONTRIBUTING.md +8 -8
  6. package/README.md +8 -3
  7. package/dist/actors/codex/app-server-client.js +2 -1
  8. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  9. package/dist/actors/codex/app-server-trace.js +1 -3
  10. package/dist/actors/codex/app-server.js +2 -1
  11. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  12. package/dist/actors/codex/protocol-compat.js +357 -0
  13. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  14. package/dist/actors/codex/protocol-contract.js +471 -0
  15. package/dist/actors/codex/qualified-versions.d.ts +30 -3
  16. package/dist/actors/codex/qualified-versions.js +50 -5
  17. package/dist/actors/codex/restricted-executable.d.ts +24 -0
  18. package/dist/actors/codex/restricted-executable.js +97 -22
  19. package/dist/actors/codex/restricted-launch.d.ts +7 -1
  20. package/dist/actors/codex/restricted-launch.js +42 -3
  21. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  22. package/dist/actors/codex/restricted-notifications.js +277 -0
  23. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  24. package/dist/actors/codex/restricted-participant.js +60 -2
  25. package/dist/actors/codex/restricted-policy.d.ts +9 -1
  26. package/dist/actors/codex/restricted-session.d.ts +14 -1
  27. package/dist/actors/codex/restricted-session.js +50 -17
  28. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  29. package/dist/actors/codex/restricted-transport.js +139 -27
  30. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  31. package/dist/actors/codex/restricted-turn.js +43 -30
  32. package/dist/actors/computer-use/actor.d.ts +1 -1
  33. package/dist/actors/computer-use/actor.js +4 -4
  34. package/dist/actors/computer-use/loop/backstop.js +1 -1
  35. package/dist/actors/computer-use/loop/ending.d.ts +2 -2
  36. package/dist/actors/computer-use/loop/ending.js +2 -2
  37. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  38. package/dist/actors/computer-use/loop/spend.js +3 -3
  39. package/dist/actors/computer-use/loop/trace.js +2 -2
  40. package/dist/actors/computer-use/loop/types.d.ts +14 -5
  41. package/dist/actors/computer-use/loop.js +4 -4
  42. package/dist/actors/computer-use/openai-provider.d.ts +1 -1
  43. package/dist/actors/computer-use/openai-provider.js +2 -2
  44. package/dist/actors/contract.d.ts +9 -7
  45. package/dist/actors/local-agent/cli.js +1 -1
  46. package/dist/actors/scripted-browser/actor.d.ts +2 -2
  47. package/dist/actors/scripted-browser/journey.js +15 -4
  48. package/dist/actors/scripted-browser/steps.js +18 -0
  49. package/dist/actors/scripted-browser/types.d.ts +11 -1
  50. package/dist/actors/stop-conditions.js +1 -3
  51. package/dist/analysis/automatic-completion.d.ts +13 -8
  52. package/dist/analysis/automatic-completion.js +14 -8
  53. package/dist/analysis/automatic-config.d.ts +1 -1
  54. package/dist/analysis/automatic-config.js +2 -2
  55. package/dist/analysis/automatic.d.ts +10 -4
  56. package/dist/analysis/automatic.js +17 -13
  57. package/dist/analysis/diagnostics.d.ts +23 -0
  58. package/dist/analysis/diagnostics.js +112 -0
  59. package/dist/analysis/evidence-sources.js +2 -2
  60. package/dist/analysis/evidence.js +6 -6
  61. package/dist/analysis/execute.d.ts +7 -1
  62. package/dist/analysis/execute.js +39 -12
  63. package/dist/analysis/job.d.ts +8 -5
  64. package/dist/analysis/job.js +15 -14
  65. package/dist/analysis/load.d.ts +1 -1
  66. package/dist/analysis/load.js +5 -5
  67. package/dist/analysis/provider.d.ts +9 -1
  68. package/dist/analysis/restricted-codex.d.ts +2 -0
  69. package/dist/analysis/restricted-codex.js +10 -1
  70. package/dist/analysis/service.d.ts +2 -0
  71. package/dist/analysis/service.js +31 -12
  72. package/dist/analysis/sharing.d.ts +2 -2
  73. package/dist/analysis/sharing.js +5 -5
  74. package/dist/analysis/store-executions.d.ts +5 -5
  75. package/dist/analysis/store-executions.js +12 -12
  76. package/dist/analysis/store.d.ts +4 -4
  77. package/dist/analysis/store.js +13 -13
  78. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  79. package/dist/cli/commands/analysis-signals.js +4 -1
  80. package/dist/cli/commands/analyze.js +4 -2
  81. package/dist/cli/commands/comms.js +8 -1
  82. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  83. package/dist/cli/commands/lab-route-computer-use.js +26 -14
  84. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  85. package/dist/cli/commands/lab-route-preview.js +3 -4
  86. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  87. package/dist/cli/commands/lab-route-run.js +6 -2
  88. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  89. package/dist/cli/commands/lab-route-scripted.js +0 -1
  90. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  91. package/dist/cli/commands/lab-route-shared-world.js +0 -1
  92. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  93. package/dist/cli/commands/lab-route-terminal.js +0 -1
  94. package/dist/cli/commands/lab-run.js +76 -45
  95. package/dist/cli/commands/lab-scorer.d.ts +0 -2
  96. package/dist/cli/commands/lab.js +12 -6
  97. package/dist/cli/commands/observe.js +22 -0
  98. package/dist/cli/commands/run-signals.d.ts +30 -0
  99. package/dist/cli/commands/run-signals.js +146 -0
  100. package/dist/cli/commands/runs.js +10 -8
  101. package/dist/cli/commands/watch.js +12 -10
  102. package/dist/cli/doctor.d.ts +3 -0
  103. package/dist/cli/doctor.js +10 -2
  104. package/dist/cli/io.d.ts +5 -4
  105. package/dist/cli/io.js +12 -8
  106. package/dist/cli/program.js +3 -3
  107. package/dist/cli/renamed-options.d.ts +11 -0
  108. package/dist/cli/renamed-options.js +18 -0
  109. package/dist/cli/telemetry.d.ts +2 -2
  110. package/dist/cli/telemetry.js +1 -1
  111. package/dist/comms/capture-surface.d.ts +1 -1
  112. package/dist/comms/catch-host.d.ts +1 -1
  113. package/dist/comms/connections.js +4 -4
  114. package/dist/comms/external-evidence.d.ts +27 -0
  115. package/dist/comms/external-evidence.js +93 -0
  116. package/dist/comms/lease-store.js +7 -7
  117. package/dist/comms/types.js +1 -1
  118. package/dist/evidence/browser-hygiene.d.ts +1 -1
  119. package/dist/evidence/browser-hygiene.js +1 -1
  120. package/dist/evidence/redaction.js +1 -1
  121. package/dist/evidence/secret-scrub.d.ts +9 -0
  122. package/dist/evidence/secret-scrub.js +96 -0
  123. package/dist/feedback/draft.js +7 -9
  124. package/dist/feedback/export-bundle.js +4 -4
  125. package/dist/feedback/export.js +9 -9
  126. package/dist/feedback/feedback.d.ts +1 -1
  127. package/dist/index.d.ts +3 -6
  128. package/dist/index.js +3 -6
  129. package/dist/keys/key-resolution.d.ts +3 -1
  130. package/dist/keys/key-resolution.js +18 -16
  131. package/dist/lab/adapter-extension.d.ts +28 -6
  132. package/dist/lab/adapter-extension.js +65 -126
  133. package/dist/lab/adapter-scorer-loader.d.ts +25 -5
  134. package/dist/lab/adapter-scorer-loader.js +24 -0
  135. package/dist/lab/composition-rules.js +20 -20
  136. package/dist/lab/config.js +28 -26
  137. package/dist/lab/device-presets.d.ts +2 -2
  138. package/dist/lab/discover.js +1 -3
  139. package/dist/lab/doctor.d.ts +44 -9
  140. package/dist/lab/doctor.js +149 -41
  141. package/dist/lab/init-plan.js +1 -3
  142. package/dist/lab/keys.js +1 -1
  143. package/dist/lab/lab-deps.d.ts +85 -0
  144. package/dist/lab/lab-deps.js +4 -0
  145. package/dist/lab/parse/actors.js +8 -7
  146. package/dist/lab/parse/comms.js +3 -2
  147. package/dist/lab/parse/execution.js +3 -2
  148. package/dist/lab/parse/subject-state.js +2 -1
  149. package/dist/lab/parse/subject.js +2 -1
  150. package/dist/lab/parse/values.d.ts +0 -1
  151. package/dist/lab/parse/values.js +0 -3
  152. package/dist/lab/persona-resolve.d.ts +3 -3
  153. package/dist/lab/persona-resolve.js +4 -4
  154. package/dist/lab/persona.js +1 -3
  155. package/dist/lab/plan-base.d.ts +0 -2
  156. package/dist/lab/plan-base.js +6 -4
  157. package/dist/lab/plan-participants.d.ts +5 -5
  158. package/dist/lab/plan-participants.js +2 -2
  159. package/dist/lab/plan-types.d.ts +22 -4
  160. package/dist/lab/plan.d.ts +3 -11
  161. package/dist/lab/plan.js +18 -42
  162. package/dist/lab/preflight-result.js +0 -2
  163. package/dist/lab/preflight.d.ts +0 -3
  164. package/dist/lab/preflight.js +1 -1
  165. package/dist/lab/requirements.d.ts +20 -0
  166. package/dist/lab/requirements.js +54 -0
  167. package/dist/lab/route-inputs.d.ts +23 -12
  168. package/dist/lab/route-inputs.js +48 -51
  169. package/dist/lab/routing.d.ts +19 -24
  170. package/dist/lab/routing.js +14 -47
  171. package/dist/lab/run-lab-events.d.ts +6 -11
  172. package/dist/lab/run-lab-events.js +3 -11
  173. package/dist/lab/run-lab-homes.d.ts +64 -0
  174. package/dist/lab/run-lab-homes.js +3 -0
  175. package/dist/lab/run-lab-options.d.ts +12 -66
  176. package/dist/lab/run-lab-options.js +45 -275
  177. package/dist/lab/summary.d.ts +9 -4
  178. package/dist/lab/summary.js +15 -8
  179. package/dist/lab/types.d.ts +132 -132
  180. package/dist/lab/validation.d.ts +15 -15
  181. package/dist/lab/validation.js +28 -28
  182. package/dist/lab/warnings.js +20 -19
  183. package/dist/observer/artifact.d.ts +1 -1
  184. package/dist/observer/artifact.js +3 -3
  185. package/dist/observer/data.js +2 -2
  186. package/dist/observer/render.js +2 -2
  187. package/dist/observer/run-routes.d.ts +1 -1
  188. package/dist/observer/run-routes.js +5 -5
  189. package/dist/observer/serve.d.ts +17 -0
  190. package/dist/observer/serve.js +34 -3
  191. package/dist/routes/computer-use/bundle-parts.d.ts +1 -1
  192. package/dist/routes/computer-use/bundle-parts.js +10 -3
  193. package/dist/routes/computer-use/bundle.d.ts +4 -11
  194. package/dist/routes/computer-use/bundle.js +9 -15
  195. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  196. package/dist/routes/computer-use/diagnostics.js +1 -1
  197. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +10 -10
  198. package/dist/routes/computer-use/e2b-desktop/comms.js +11 -14
  199. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  200. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -7
  201. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +13 -13
  202. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -11
  203. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  204. package/dist/routes/computer-use/e2b-desktop/prepare.js +33 -36
  205. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  206. package/dist/routes/computer-use/e2b-desktop/start.js +24 -23
  207. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  208. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  209. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  210. package/dist/routes/computer-use/e2b-desktop/teardown.js +29 -17
  211. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  212. package/dist/routes/computer-use/external-comms.js +19 -43
  213. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  214. package/dist/routes/computer-use/fanout-bundle.js +25 -29
  215. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +25 -19
  216. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  217. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  218. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  219. package/dist/routes/computer-use/live-flush.js +19 -27
  220. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +12 -11
  221. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  222. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  223. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  224. package/dist/routes/computer-use/local-vm.js +39 -66
  225. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  226. package/dist/routes/computer-use/participant-desktop.js +5 -25
  227. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +10 -10
  228. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +35 -22
  229. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  230. package/dist/routes/computer-use/participant-facts.js +12 -1
  231. package/dist/routes/computer-use/participant-model.d.ts +19 -11
  232. package/dist/routes/computer-use/participant-model.js +49 -25
  233. package/dist/routes/computer-use/participant-prompt.d.ts +3 -3
  234. package/dist/routes/computer-use/participant-prompt.js +4 -4
  235. package/dist/routes/computer-use/participant-runs.d.ts +6 -6
  236. package/dist/routes/computer-use/participant-runs.js +8 -8
  237. package/dist/routes/computer-use/plan.d.ts +21 -29
  238. package/dist/routes/computer-use/plan.js +52 -60
  239. package/dist/routes/computer-use/preflight.d.ts +3 -5
  240. package/dist/routes/computer-use/preflight.js +20 -16
  241. package/dist/routes/computer-use/rerun-selection.js +10 -6
  242. package/dist/routes/computer-use/result.d.ts +1 -1
  243. package/dist/routes/computer-use/result.js +40 -30
  244. package/dist/routes/computer-use/route.d.ts +3 -4
  245. package/dist/routes/computer-use/route.js +21 -19
  246. package/dist/routes/computer-use/self-report.d.ts +2 -2
  247. package/dist/routes/computer-use/self-report.js +4 -4
  248. package/dist/routes/computer-use/setup.d.ts +8 -14
  249. package/dist/routes/computer-use/setup.js +96 -72
  250. package/dist/routes/computer-use/single-bundle.d.ts +8 -11
  251. package/dist/routes/computer-use/single-bundle.js +20 -25
  252. package/dist/routes/computer-use/subject-projection.d.ts +5 -7
  253. package/dist/routes/computer-use/subject-projection.js +20 -19
  254. package/dist/routes/computer-use/types.d.ts +169 -210
  255. package/dist/routes/computer-use/types.js +13 -5
  256. package/dist/routes/preview.js +0 -1
  257. package/dist/routes/scripted/bundle.d.ts +3 -6
  258. package/dist/routes/scripted/bundle.js +11 -16
  259. package/dist/routes/scripted/plan.d.ts +5 -7
  260. package/dist/routes/scripted/plan.js +6 -4
  261. package/dist/routes/scripted/result.d.ts +4 -1
  262. package/dist/routes/scripted/result.js +10 -6
  263. package/dist/routes/scripted/route.js +10 -11
  264. package/dist/routes/scripted/scenario.d.ts +1 -1
  265. package/dist/routes/scripted/scenario.js +1 -1
  266. package/dist/routes/scripted/setup.d.ts +3 -2
  267. package/dist/routes/scripted/setup.js +22 -21
  268. package/dist/routes/scripted/subject.d.ts +8 -3
  269. package/dist/routes/scripted/subject.js +9 -5
  270. package/dist/routes/scripted/surface-records.js +1 -1
  271. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  272. package/dist/routes/scripted/surface-sessions.js +4 -4
  273. package/dist/routes/scripted/types.d.ts +19 -36
  274. package/dist/routes/scripted/types.js +1 -2
  275. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +8 -8
  276. package/dist/routes/shared-world/bundle.d.ts +2 -2
  277. package/dist/routes/shared-world/bundle.js +22 -26
  278. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  279. package/dist/routes/shared-world/checkpoints.js +4 -4
  280. package/dist/routes/shared-world/comms.d.ts +5 -4
  281. package/dist/routes/shared-world/comms.js +28 -41
  282. package/dist/routes/shared-world/external-public.d.ts +5 -5
  283. package/dist/routes/shared-world/external-public.js +19 -20
  284. package/dist/routes/shared-world/handoff.d.ts +4 -4
  285. package/dist/routes/shared-world/handoff.js +50 -50
  286. package/dist/routes/shared-world/lobby-code.d.ts +5 -5
  287. package/dist/routes/shared-world/lobby-code.js +13 -13
  288. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +8 -6
  289. package/dist/routes/shared-world/{seats.js → participant-specs.js} +43 -48
  290. package/dist/routes/shared-world/plan.d.ts +2 -6
  291. package/dist/routes/shared-world/plan.js +1 -2
  292. package/dist/routes/shared-world/provenance.d.ts +4 -4
  293. package/dist/routes/shared-world/provenance.js +4 -4
  294. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  295. package/dist/routes/shared-world/provisioned.js +46 -40
  296. package/dist/routes/shared-world/result.js +31 -19
  297. package/dist/routes/shared-world/route.js +37 -41
  298. package/dist/routes/shared-world/setup.d.ts +5 -4
  299. package/dist/routes/shared-world/setup.js +12 -14
  300. package/dist/routes/shared-world/types.d.ts +53 -126
  301. package/dist/routes/shared-world/types.js +2 -2
  302. package/dist/routes/terminal/adapter.d.ts +8 -8
  303. package/dist/routes/terminal/adapter.js +28 -125
  304. package/dist/routes/terminal/bundle.d.ts +7 -12
  305. package/dist/routes/terminal/bundle.js +24 -34
  306. package/dist/routes/terminal/credentials.d.ts +2 -2
  307. package/dist/routes/terminal/credentials.js +16 -16
  308. package/dist/routes/terminal/dry-run.d.ts +1 -1
  309. package/dist/routes/terminal/dry-run.js +9 -11
  310. package/dist/routes/terminal/encoding.d.ts +1 -1
  311. package/dist/routes/terminal/encoding.js +2 -2
  312. package/dist/routes/terminal/ledger.d.ts +6 -6
  313. package/dist/routes/terminal/ledger.js +9 -9
  314. package/dist/routes/terminal/live-finish.d.ts +1 -2
  315. package/dist/routes/terminal/live-finish.js +21 -20
  316. package/dist/routes/terminal/live-sandbox.d.ts +3 -2
  317. package/dist/routes/terminal/live-sandbox.js +20 -20
  318. package/dist/routes/terminal/participant-text.d.ts +23 -0
  319. package/dist/routes/terminal/participant-text.js +165 -0
  320. package/dist/routes/terminal/plan.d.ts +2 -6
  321. package/dist/routes/terminal/plan.js +13 -9
  322. package/dist/routes/terminal/recorder.d.ts +6 -1
  323. package/dist/routes/terminal/recorder.js +12 -4
  324. package/dist/routes/terminal/result.js +4 -4
  325. package/dist/routes/terminal/route.js +26 -26
  326. package/dist/routes/terminal/runtime.d.ts +3 -2
  327. package/dist/routes/terminal/runtime.js +3 -3
  328. package/dist/routes/terminal/sandbox.d.ts +3 -3
  329. package/dist/routes/terminal/sandbox.js +9 -9
  330. package/dist/routes/terminal/session.js +16 -14
  331. package/dist/routes/terminal/token-usage.js +5 -5
  332. package/dist/routes/terminal/trace.d.ts +5 -8
  333. package/dist/routes/terminal/trace.js +9 -64
  334. package/dist/routes/terminal/types.d.ts +85 -93
  335. package/dist/routes/terminal/types.js +9 -4
  336. package/dist/run/active-runs.d.ts +13 -0
  337. package/dist/run/active-runs.js +12 -0
  338. package/dist/run/bundle-shape.d.ts +2 -1
  339. package/dist/run/bundle-shape.js +4 -4
  340. package/dist/run/bundle.d.ts +63 -56
  341. package/dist/run/bundle.js +9 -8
  342. package/dist/run/cost-summary.js +3 -2
  343. package/dist/run/costs.d.ts +6 -6
  344. package/dist/run/costs.js +10 -10
  345. package/dist/run/detail.d.ts +5 -5
  346. package/dist/run/detail.js +6 -6
  347. package/dist/run/dry-run.js +5 -12
  348. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  349. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  350. package/dist/run/feedback-shape.js +1 -1
  351. package/dist/run/judge.d.ts +16 -4
  352. package/dist/run/judge.js +24 -7
  353. package/dist/run/locate.d.ts +2 -0
  354. package/dist/run/locate.js +3 -1
  355. package/dist/run/outcomes.d.ts +3 -3
  356. package/dist/run/outcomes.js +3 -3
  357. package/dist/run/participant-records.d.ts +2 -2
  358. package/dist/run/participant-records.js +2 -2
  359. package/dist/run/paths.js +1 -1
  360. package/dist/run/pricing.d.ts +19 -9
  361. package/dist/run/pricing.js +30 -18
  362. package/dist/run/projection.d.ts +13 -13
  363. package/dist/run/projection.js +8 -8
  364. package/dist/run/reclaim.d.ts +6 -0
  365. package/dist/run/reclaim.js +13 -3
  366. package/dist/run/results.d.ts +1 -1
  367. package/dist/run/run-index.d.ts +1 -1
  368. package/dist/run/run-index.js +11 -11
  369. package/dist/run/run.d.ts +4 -2
  370. package/dist/run/run.js +9 -5
  371. package/dist/run/sandbox-receipts.d.ts +4 -4
  372. package/dist/run/sandbox-receipts.js +4 -4
  373. package/dist/run/shared-world-evidence.d.ts +47 -47
  374. package/dist/run/shared-world-shape.d.ts +3 -3
  375. package/dist/run/shared-world-shape.js +11 -11
  376. package/dist/run/stats.d.ts +5 -5
  377. package/dist/run/stats.js +8 -8
  378. package/dist/run/status.d.ts +16 -6
  379. package/dist/run/status.js +31 -8
  380. package/dist/run/streams.d.ts +26 -19
  381. package/dist/run/terminal-contract.d.ts +5 -5
  382. package/dist/run/terminal-contract.js +4 -4
  383. package/dist/run/transient-comms-secrets.d.ts +5 -0
  384. package/dist/run/transient-comms-secrets.js +12 -0
  385. package/dist/run-lab.d.ts +36 -34
  386. package/dist/run-lab.js +41 -37
  387. package/dist/subject/desktop-cli.d.ts +1 -1
  388. package/dist/subject/desktop-cli.js +1 -1
  389. package/dist/subject/local-tree-archive.d.ts +1 -1
  390. package/dist/subject/local-tree-archive.js +4 -4
  391. package/dist/subject/local-tree.d.ts +2 -2
  392. package/dist/subject/local-tree.js +1 -1
  393. package/dist/subject/node-bootstrap.d.ts +1 -1
  394. package/dist/subject/node-bootstrap.js +4 -4
  395. package/dist/subject/runtime.js +5 -5
  396. package/dist/subject/serve.js +1 -1
  397. package/dist/subject/steps.d.ts +4 -4
  398. package/dist/subject/steps.js +5 -5
  399. package/dist/substrates/e2b/cdp-probe.d.ts +2 -2
  400. package/dist/substrates/e2b/cdp-probe.js +1 -1
  401. package/dist/substrates/e2b/desktop-browser.d.ts +3 -3
  402. package/dist/substrates/e2b/desktop-browser.js +4 -4
  403. package/dist/substrates/e2b/desktop-cdp.d.ts +7 -7
  404. package/dist/substrates/e2b/desktop-cdp.js +4 -4
  405. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  406. package/dist/substrates/e2b/desktop-geometry.js +3 -3
  407. package/dist/substrates/e2b/desktop-media.js +2 -2
  408. package/dist/substrates/e2b/sandbox.js +1 -1
  409. package/dist/substrates/e2b/sdk.js +2 -2
  410. package/dist/substrates/local/runtime-host.d.ts +2 -0
  411. package/dist/substrates/local/runtime-host.js +6 -0
  412. package/dist/tui/actions.d.ts +7 -5
  413. package/dist/tui/actions.js +18 -9
  414. package/dist/tui-app.js +42 -42
  415. package/dist/verify/actor.d.ts +10 -10
  416. package/dist/verify/actor.js +15 -15
  417. package/dist/verify/artifacts.d.ts +1 -1
  418. package/dist/verify/artifacts.js +3 -3
  419. package/dist/verify/costs.d.ts +2 -2
  420. package/dist/verify/costs.js +2 -2
  421. package/dist/verify/liveness.d.ts +1 -1
  422. package/dist/verify/liveness.js +4 -1
  423. package/dist/verify/rerun.d.ts +1 -1
  424. package/dist/verify/rerun.js +1 -1
  425. package/dist/verify/shared-world.js +2 -2
  426. package/dist/verify/verify.js +6 -6
  427. package/docs/README.md +1 -1
  428. package/docs/architecture/actor-contract.md +60 -22
  429. package/docs/architecture/desktop-sessions.md +9 -9
  430. package/docs/architecture/external-public-shared-world.md +5 -0
  431. package/docs/architecture/observer.md +4 -4
  432. package/docs/architecture/restricted-codex-analysis.md +36 -2
  433. package/docs/architecture/state-driven-executor.md +4 -5
  434. package/docs/architecture/task-protocol-support.md +3 -5
  435. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +24 -16
  436. package/docs/contracts/run-bundle.md +10 -8
  437. package/docs/contracts/schemas.md +109 -53
  438. package/docs/contracts/study-analysis.md +24 -0
  439. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  440. package/docs/product/automatic-analysis.md +1 -0
  441. package/docs/ramp/README.md +2 -1
  442. package/package.json +4 -4
  443. package/skills/humanish/SKILL.md +3 -2
  444. package/skills/humanish/agents/openai.yaml +1 -1
  445. package/dist/deprecated.d.ts +0 -90
  446. package/dist/deprecated.js +0 -106
  447. package/dist/lab/bag-overrides.d.ts +0 -18
  448. package/dist/lab/bag-overrides.js +0 -121
  449. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  450. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  451. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  452. /package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +0 -0
  453. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -4,7 +4,7 @@ import path from "node:path";
4
4
  import { physicalCwdOf, runIdOf, validatePreparedRunRootIdentity, } from "../run/paths.js";
5
5
  import { assertPreparedSelectedOutputDirectory, bindExistingManagedHumanishOutputDirectory, prepareContainedOutputDirectoryRoot, writeContainedOutputFile, } from "../run/contained-output.js";
6
6
  import { EVIDENCE_LIMITS, validateAnalysisEvidence } from "./evidence.js";
7
- import { pathMissing, isStudyEvidencePath, readBoundedStudyFile } from "../run/study-files.js";
7
+ import { pathMissing, isEvidencePath, readBoundedFile } from "../run/evidence-files.js";
8
8
  import { hashAnalysisValue, validateAnalysisArtifact, validateAnalysisCorrection, } from "./validation.js";
9
9
  import { ANALYSIS_ID_PATTERN, } from "./types.js";
10
10
  import { RUN_BUNDLE_FILE } from "../run/bundle.js";
@@ -61,9 +61,9 @@ export async function claimDirectory(parent, id) {
61
61
  return prepareContainedOutputDirectoryRoot(parent, id);
62
62
  }
63
63
  /** A claimed version is never reused, including after interruption before publication. */
64
- export async function writeStudyAnalysis(prepared, value) {
64
+ export async function writeAnalysis(prepared, value) {
65
65
  const artifact = validateAnalysisArtifact(value);
66
- const source = await readBoundedStudyFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes);
66
+ const source = await readBoundedFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes);
67
67
  if (!source)
68
68
  throw new Error("ANALYSIS_SOURCE_UNAVAILABLE");
69
69
  await validateAnalysisEvidence(prepared, artifact, source);
@@ -73,7 +73,7 @@ export async function writeStudyAnalysis(prepared, value) {
73
73
  const root = await prepareContainedOutputDirectoryRoot(prepared, ANALYSIS_DIRECTORY);
74
74
  const claimed = await claimDirectory(root, artifact.id);
75
75
  // Recheck source immediately before publishing the immutable record.
76
- const current = await readBoundedStudyFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes);
76
+ const current = await readBoundedFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes);
77
77
  if (!current?.equals(source))
78
78
  throw new Error("ANALYSIS_SOURCE_CHANGED");
79
79
  await writeContainedOutputFile(claimed, "analysis.json", bytes);
@@ -100,7 +100,7 @@ export async function directoryIds(root, limit, ignoreLegacyFiles = false) {
100
100
  if (entry.name.startsWith(".humanish-write-"))
101
101
  continue;
102
102
  if (ignoreLegacyFiles &&
103
- isStudyEvidencePath(entry.name) &&
103
+ isEvidencePath(entry.name) &&
104
104
  !["analysis.json", "correction.json", "receipt.json"].includes(entry.name))
105
105
  continue;
106
106
  warnings.push("ANALYSIS_UNSAFE_ENTRY_IGNORED");
@@ -118,7 +118,7 @@ export async function directoryIds(root, limit, ignoreLegacyFiles = false) {
118
118
  async function readVersion(prepared, root, id, source) {
119
119
  if (!safeId(id))
120
120
  return { id: "invalid", state: "invalid", analysis: null, warnings: ["ANALYSIS_ID_INVALID"] };
121
- const bytes = await readBoundedStudyFile(root, `${id}/analysis.json`, ANALYSIS_MAX_BYTES);
121
+ const bytes = await readBoundedFile(root, `${id}/analysis.json`, ANALYSIS_MAX_BYTES);
122
122
  // A claimed directory without a published record is an interrupted write, not a report.
123
123
  if (bytes === null) {
124
124
  if (await pathMissing(path.join(root.physicalPath, id, "analysis.json")).catch(() => false))
@@ -159,14 +159,14 @@ async function readVersion(prepared, root, id, source) {
159
159
  return { id, state: "ready", analysis, warnings: [] };
160
160
  }
161
161
  /** Read one exact result without reading automatic job state or unrelated history. */
162
- export async function readStudyAnalysisVersion(prepared, id) {
162
+ export async function readAnalysisVersion(prepared, id) {
163
163
  if (!safeId(id))
164
164
  return null;
165
165
  try {
166
166
  const root = await existingRoot(prepared);
167
167
  if (!root)
168
168
  return null;
169
- return await readVersion(prepared, root, id, await readBoundedStudyFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes));
169
+ return await readVersion(prepared, root, id, await readBoundedFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes));
170
170
  }
171
171
  catch {
172
172
  return null;
@@ -179,7 +179,7 @@ export async function listAnalyses(prepared) {
179
179
  if (!root)
180
180
  return [];
181
181
  const inventory = await directoryIds(root, MAX_VERSIONS, true);
182
- const source = await readBoundedStudyFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes);
182
+ const source = await readBoundedFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes);
183
183
  const results = [];
184
184
  for (const id of inventory.ids) {
185
185
  const entry = await readVersion(prepared, root, id, source);
@@ -219,7 +219,7 @@ async function readCorrections(prepared, root, analysis) {
219
219
  const inventory = await directoryIds(bound, MAX_CORRECTIONS);
220
220
  warnings.push(...inventory.warnings);
221
221
  for (const id of inventory.ids) {
222
- const bytes = await readBoundedStudyFile(root, `${analysis.id}/corrections/${id}/correction.json`, MAX_CORRECTION_BYTES);
222
+ const bytes = await readBoundedFile(root, `${analysis.id}/corrections/${id}/correction.json`, MAX_CORRECTION_BYTES);
223
223
  if (!bytes) {
224
224
  // An unpublished claim directory is harmless; a present record that
225
225
  // cannot be checked must not silently erase a prior review decision.
@@ -246,7 +246,7 @@ async function readCorrections(prepared, root, analysis) {
246
246
  corrections.sort((a, b) => a.createdAt.localeCompare(b.createdAt) || a.id.localeCompare(b.id));
247
247
  return { corrections, warnings };
248
248
  }
249
- export async function loadStudyAnalysisRecord(prepared, id) {
249
+ export async function loadAnalysisRecord(prepared, id) {
250
250
  if (id !== undefined && !safeId(id))
251
251
  return empty("invalid", ["ANALYSIS_ID_INVALID"]);
252
252
  try {
@@ -290,9 +290,9 @@ function assertCorrectionBinding(analysis, correction) {
290
290
  Date.parse(correction.createdAt) < Date.parse(analysis.completedAt))
291
291
  throw new Error("ANALYSIS_CORRECTION_BINDING_INVALID");
292
292
  }
293
- export async function appendStudyAnalysisCorrection(prepared, value) {
293
+ export async function appendAnalysisCorrection(prepared, value) {
294
294
  const correction = validateAnalysisCorrection(value);
295
- const loaded = await loadStudyAnalysisRecord(prepared, correction.analysisId);
295
+ const loaded = await loadAnalysisRecord(prepared, correction.analysisId);
296
296
  if (loaded.state !== "ready" || !loaded.analysis)
297
297
  throw new Error("ANALYSIS_CORRECTION_SOURCE_UNAVAILABLE");
298
298
  assertCorrectionBinding(loaded.analysis, correction);
@@ -2,6 +2,7 @@ import type { RunLabOptions } from "../../run-lab.js";
2
2
  import type { CliIo } from "../io.js";
3
3
  /**
4
4
  * Post-run analysis cancellation for the CLI: while analysis runs, SIGINT, SIGTERM and SIGHUP abort
5
- * it. The listeners exist only during analysis, so actor signal behavior is unchanged.
5
+ * it. The listeners exist only during analysis; before it, the run's own handlers
6
+ * (run-signals.ts) hold the signals and hand them over here.
6
7
  */
7
8
  export declare function cliAnalysisOptions(io: Pick<CliIo, "writeErr">): Pick<RunLabOptions, "onEvent" | "analysisSignal">;
@@ -1,6 +1,8 @@
1
+ import { handOverRunSignals } from "./run-signals.js";
1
2
  /**
2
3
  * Post-run analysis cancellation for the CLI: while analysis runs, SIGINT, SIGTERM and SIGHUP abort
3
- * it. The listeners exist only during analysis, so actor signal behavior is unchanged.
4
+ * it. The listeners exist only during analysis; before it, the run's own handlers
5
+ * (run-signals.ts) hold the signals and hand them over here.
4
6
  */
5
7
  export function cliAnalysisOptions(io) {
6
8
  const controller = new AbortController();
@@ -13,6 +15,7 @@ export function cliAnalysisOptions(io) {
13
15
  onEvent: (event) => {
14
16
  if (event.type === "analysis-started") {
15
17
  io.writeErr("Participants finished; preparing analysis…\n");
18
+ handOverRunSignals();
16
19
  for (const signal of signals)
17
20
  process.on(signal, cancel);
18
21
  }
@@ -3,7 +3,7 @@ import { Command, Option } from "commander";
3
3
  import { forTerminal } from "../../routes/terminal/encoding.js";
4
4
  import { analyzeRun, correctAnalysis, dryRunBundleRefusal, showAnalysis, } from "../../analysis/service.js";
5
5
  import { listAnalyses } from "../../analysis/store.js";
6
- import { listStudyAnalysisExecutions } from "../../analysis/store-executions.js";
6
+ import { listAnalysisExecutions } from "../../analysis/store-executions.js";
7
7
  import { resolveRunPath } from "../../run/locate.js";
8
8
  import { discoverCliKeys, JSON_OPTION_DESCRIPTION, writeResult } from "../io.js";
9
9
  import { resolvePhysicalCwd } from "../../run/paths.js";
@@ -132,6 +132,8 @@ async function handleAnalyze(io, options, command) {
132
132
  lines.push(`${value.reused ? "Reused" : "Saved"} ${value.status} analysis: ${value.artifactPath}`);
133
133
  if (value.executionReceiptPath)
134
134
  lines.push(`Execution receipt: ${value.executionReceiptPath}`);
135
+ if (value.rejectedOutputPath)
136
+ lines.push(`Rejected output, kept locally for diagnosis: ${value.rejectedOutputPath}`);
135
137
  if (value.usage) {
136
138
  lines.push(`Recorded attempt usage${value.usage.usageComplete ? "" : " (incomplete)"}: ${value.usage.inputTokens ?? "unknown"} input tokens, ${value.usage.outputTokens ?? "unknown"} output tokens.`);
137
139
  lines.push(`Estimated attempt cost: ${value.usage.estimatedCostUsd === null ? "unknown" : `$${value.usage.estimatedCostUsd}`}.`);
@@ -152,7 +154,7 @@ async function handleAnalyzeList(io, options, command) {
152
154
  const prepared = await resolveRunPath(await resolvePhysicalCwd(options.cwd), options.run).catch(() => null);
153
155
  const versions = prepared ? await listAnalyses(prepared) : [];
154
156
  const executions = prepared
155
- ? await listStudyAnalysisExecutions(prepared)
157
+ ? await listAnalysisExecutions(prepared)
156
158
  : { receipts: [], warnings: [] };
157
159
  const result = {
158
160
  schema: "humanish.analysis-history.v1",
@@ -1,6 +1,7 @@
1
1
  import { resolve } from "node:path";
2
2
  import { Command } from "commander";
3
3
  import { COMMS_PROVIDERS, saveCommsConnection } from "../../comms/connections.js";
4
+ import { catchTokenRefusal } from "../../comms/external-evidence.js";
4
5
  import { readCommsSetup } from "../../comms/setup.js";
5
6
  import { checkCommsConnection, configureCommsLab } from "../../comms/setup.js";
6
7
  import { inspectCommsRecovery, recoverCommsReceiving } from "../../comms/receiving-recovery.js";
@@ -73,7 +74,7 @@ export function registerCommsCommands(parent, io) {
73
74
  .summary("Run the adopter-hosted email catch.")
74
75
  .option("--port <port>", "Port for capture + inbox (default 8025).", String(DEFAULT_SANDBOX_CATCH_PORT))
75
76
  .option("--dir <path>", "Directory for the deliveries log and rendered inbox.", ".humanish/comms-catch")
76
- .option("--token <value>", "Require this bearer token on GET /deliveries (recommended when reachable off-host).")
77
+ .option("--token <value>", "Require this bearer token, at least 16 characters, on GET /deliveries (recommended when reachable off-host).")
77
78
  .option("--smtp-port <port>", "Also capture SMTP mail on 127.0.0.1:<port>. Point your app's SMTP transport here.")
78
79
  .option("--inbox-port <port>", "Also serve a READ-ONLY inbox listener on 0.0.0.0:<port>, so a persona on another machine can open /inbox. Without it the catch stays loopback-only.")
79
80
  .option("--recipient <address>", "Only render mail sent to this address (repeatable). Default: render whatever the app actually mailed.", (value, previous) => [...(previous ?? []), value])
@@ -178,6 +179,12 @@ async function handleCommsRecover(io, options, command) {
178
179
  }
179
180
  }
180
181
  async function handleCommsCatch(io, options) {
182
+ const tokenRefusal = catchTokenRefusal(options.token);
183
+ if (tokenRefusal !== undefined) {
184
+ io.writeErr(`--token: ${tokenRefusal} The token guards GET /deliveries, and runs scrub it from their warnings.\n`);
185
+ io.setExitCode(2);
186
+ return;
187
+ }
181
188
  const port = Number.parseInt(options.port, 10);
182
189
  if (!Number.isInteger(port) || port <= 0 || port > 65_534) {
183
190
  io.writeErr("--port must be an integer between 1 and 65534.\n");
@@ -1,5 +1,4 @@
1
1
  import { Command } from "commander";
2
- import type { RunLabProvenance } from "../../run/status.js";
3
2
  import type { LabConfig } from "../../lab/types.js";
4
3
  import { type CliIo, type LabCommandOptions } from "../io.js";
5
4
  import type { RouteRun } from "./lab-route-run.js";
@@ -7,7 +6,6 @@ interface ComputerUseRouteArgs {
7
6
  command: Command;
8
7
  io: CliIo;
9
8
  config: LabConfig;
10
- labProvenance?: RunLabProvenance;
11
9
  mode: "run" | "watch";
12
10
  options: LabCommandOptions;
13
11
  }
@@ -7,6 +7,7 @@ import { serveObserver } from "../../observer/render.js";
7
7
  import { startExposedObserver, validateExposure } from "../../observer/exposure.js";
8
8
  import { ServeTunnelError } from "../../observer/tunnel.js";
9
9
  import { cliAnalysisOptions } from "./analysis-signals.js";
10
+ import { onRunShutdown } from "./run-signals.js";
10
11
  import { parseLabCount, parseParticipantIds, parseObserverPort, wantsJson, writeResult, } from "../io.js";
11
12
  import { exposureRequestFromOptions, followObserver, planObserver, showObserver, staticObserverOpen, withObserverServer, } from "../observer-follow.js";
12
13
  import { formatCuaLabHuman } from "./lab-format.js";
@@ -29,6 +30,7 @@ export function computerUseRouteRun(args) {
29
30
  tunnel: undefined,
30
31
  exposeWarnings: [],
31
32
  publicTarget: undefined,
33
+ releaseShutdown: undefined,
32
34
  };
33
35
  return {
34
36
  options: cuaRunOptions(args, settings, prepared, live),
@@ -37,7 +39,12 @@ export function computerUseRouteRun(args) {
37
39
  if (outcome.route !== "computer-use") {
38
40
  throw new Error(`Expected the computer-use route, got ${outcome.route}.`);
39
41
  }
40
- await reportCuaRun(args, prepared, outcome.result, live);
42
+ try {
43
+ await reportCuaRun(args, prepared, outcome.result, live);
44
+ }
45
+ finally {
46
+ live.releaseShutdown?.();
47
+ }
41
48
  },
42
49
  };
43
50
  }
@@ -66,15 +73,15 @@ function resolveCuaSettings(args) {
66
73
  mode: args.mode,
67
74
  wantsMachine,
68
75
  });
69
- const participantIds = parseParticipantIds(args.options.lanes);
76
+ const participantIds = parseParticipantIds(args.options.participants);
70
77
  if (participantIds.length > 0 && !args.options.rerunFailedFrom) {
71
- args.io.writeErr("error: --lanes requires --rerun-failed-from.\n");
78
+ args.io.writeErr("error: --participants requires --rerun-failed-from.\n");
72
79
  args.io.setExitCode(2);
73
80
  return undefined;
74
81
  }
75
- const count = parseLabCount(args.options.count ?? args.options.sims, args.config.actors[0]?.count ?? 1);
82
+ const count = parseLabCount(args.options.count, args.config.actors[0]?.count ?? 1);
76
83
  if (count === null) {
77
- args.io.writeErr("error: --count/--sims must be a positive integer.\n");
84
+ args.io.writeErr("error: --count must be a positive integer.\n");
78
85
  args.io.setExitCode(2);
79
86
  return undefined;
80
87
  }
@@ -122,7 +129,6 @@ function cuaRunOptions(args, settings, prepared, live) {
122
129
  return {
123
130
  ...cliAnalysisOptions(args.io),
124
131
  cwd: args.options.cwd,
125
- ...(args.labProvenance === undefined ? {} : { lab: args.labProvenance }),
126
132
  // A followed watch opens the served Observer (or prints the phone target under --expose), so
127
133
  // its static render never opens. A non-follow watch opens what its plan says, once. Run mode
128
134
  // keeps the static open.
@@ -153,20 +159,24 @@ function cuaRunOptions(args, settings, prepared, live) {
153
159
  }),
154
160
  };
155
161
  }
162
+ /** Closes the loopback server and any tunnel the watch attached. Safe to call twice. */
163
+ async function closeLiveAttachment(io, live) {
164
+ const { server, tunnel } = live;
165
+ live.server = null;
166
+ live.tunnel = undefined;
167
+ await server?.close().catch((cleanupError) => {
168
+ io.writeErr(`watch cleanup failed: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}\n`);
169
+ });
170
+ await tunnel?.close().catch(() => undefined);
171
+ }
156
172
  /**
157
173
  * Tears down the loopback server and any tunnel started inside onObserverReady, then reports a
158
174
  * tunnel startup failure or rethrows. The sandbox is created after onObserverReady returns, so a
159
175
  * tunnel failure cannot orphan one.
160
176
  */
161
177
  async function closeLiveAfterRunError(args, settings, live, error) {
162
- await live.server?.close().catch((cleanupError) => {
163
- args.io.writeErr(`watch cleanup failed: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}\n`);
164
- });
165
- live.server = null;
166
- if (live.tunnel) {
167
- await live.tunnel.close().catch(() => undefined);
168
- live.tunnel = undefined;
169
- }
178
+ await closeLiveAttachment(args.io, live);
179
+ live.releaseShutdown?.();
170
180
  if (error instanceof ServeTunnelError) {
171
181
  refuseCua(args, settings.dryRun, error.code, error.message);
172
182
  return;
@@ -182,6 +192,8 @@ async function attachLiveObserver(io, settings, exposure, live, observer) {
182
192
  port: settings.port,
183
193
  exposed: exposure.exposed,
184
194
  });
195
+ // A signal that stops the run closes the server and any tunnel before the process exits.
196
+ live.releaseShutdown ??= onRunShutdown(() => closeLiveAttachment(io, live));
185
197
  }
186
198
  if (exposure.exposed) {
187
199
  const activeServer = live.server;
@@ -1,5 +1,4 @@
1
1
  import { Command } from "commander";
2
- import type { RunLabProvenance } from "../../run/status.js";
3
2
  import type { LabConfig } from "../../lab/types.js";
4
3
  import { type CliIo, type LabCommandOptions } from "../io.js";
5
4
  import type { RouteRun } from "./lab-route-run.js";
@@ -8,12 +7,11 @@ interface PreviewRouteArgs {
8
7
  io: CliIo;
9
8
  lab: string;
10
9
  config: LabConfig;
11
- labProvenance?: RunLabProvenance;
12
10
  mode: "run" | "watch";
13
11
  options: LabCommandOptions;
14
12
  }
15
13
  /**
16
- * The preview route's CLI setup: the sim count and Observer plan, its runLab options, and how it
14
+ * The preview route's CLI setup: the participant count and Observer plan, its runLab options, and how it
17
15
  * presents the outcome. Undefined when setup has already written its own result.
18
16
  */
19
17
  export declare function previewRouteRun(args: PreviewRouteArgs): RouteRun | undefined;
@@ -2,11 +2,11 @@ import { Command } from "commander";
2
2
  import { formatRunHuman, parseLabCount, writeResult, } from "../io.js";
3
3
  import { planObserver, showObserver, staticObserverOpen } from "../observer-follow.js";
4
4
  /**
5
- * The preview route's CLI setup: the sim count and Observer plan, its runLab options, and how it
5
+ * The preview route's CLI setup: the participant count and Observer plan, its runLab options, and how it
6
6
  * presents the outcome. Undefined when setup has already written its own result.
7
7
  */
8
8
  export function previewRouteRun(args) {
9
- const participantCount = parseLabCount(args.options.sims, args.config.actors[0]?.count ?? 4);
9
+ const participantCount = parseLabCount(args.options.count, args.config.actors[0]?.count ?? 4);
10
10
  if (participantCount === null) {
11
11
  const result = {
12
12
  schema: "humanish.run-result.v1",
@@ -15,7 +15,7 @@ export function previewRouteRun(args) {
15
15
  warnings: [],
16
16
  error: {
17
17
  code: "HUMANISH_INVALID_SIM_COUNT",
18
- message: "--sims must be a positive integer.",
18
+ message: "--count must be a positive integer.",
19
19
  },
20
20
  };
21
21
  writeResult(args.command, args.io, result, formatRunHuman);
@@ -42,7 +42,6 @@ export function previewRouteRun(args) {
42
42
  return {
43
43
  options: {
44
44
  cwd: args.options.cwd,
45
- ...(args.labProvenance === undefined ? {} : { lab: args.labProvenance }),
46
45
  count: participantCount,
47
46
  ...(args.options.dryRun === undefined ? {} : { dryRun: args.options.dryRun }),
48
47
  ...(args.options.runId === undefined ? {} : { runId: args.options.runId }),
@@ -1,8 +1,8 @@
1
- import { type LabOutcome, type RunLabOptions } from "../../run-lab.js";
1
+ import { type InternalRunLabOptions, type LabOutcome } from "../../run-lab.js";
2
2
  import type { LabConfig } from "../../lab/types.js";
3
3
  import type { LoadedAdapterScorer } from "./lab-scorer.js";
4
4
  export interface RouteRun {
5
- readonly options: RunLabOptions;
5
+ readonly options: InternalRunLabOptions;
6
6
  present(outcome: LabOutcome): Promise<void>;
7
7
  /** Handles an error runLab threw, and rethrows any it does not handle. */
8
8
  onRunError?(error: unknown): Promise<void>;
@@ -10,8 +10,10 @@ export interface RouteRun {
10
10
  /**
11
11
  * Plans the lab with a route's options, then presents the refusal or the run. `beforeRun` runs
12
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.
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).
14
16
  */
15
17
  export declare function runRoute(config: LabConfig, run: RouteRun, beforeRun?: () => Promise<{
16
18
  scorer?: LoadedAdapterScorer;
17
- } | undefined>): Promise<void>;
19
+ } | undefined>, afterRun?: () => void): Promise<void>;
@@ -4,9 +4,11 @@ import { prepareLab } from "../../run-lab.js";
4
4
  /**
5
5
  * Plans the lab with a route's options, then presents the refusal or the run. `beforeRun` runs
6
6
  * only for a plan that will run: it loads the scorer, or writes its own refusal and returns
7
- * undefined, so a refused lab never imports the scorer's host code.
7
+ * undefined, so a refused lab never imports the scorer's host code. `afterRun` runs once runLab
8
+ * has returned or thrown, before presentation, which may hold its own signal handlers (watch's
9
+ * Observer and tunnel).
8
10
  */
9
- export async function runRoute(config, run, beforeRun = () => Promise.resolve({})) {
11
+ export async function runRoute(config, run, beforeRun = () => Promise.resolve({}), afterRun = () => undefined) {
10
12
  let outcome;
11
13
  try {
12
14
  const prepared = await prepareLab(config, run.options);
@@ -22,10 +24,12 @@ export async function runRoute(config, run, beforeRun = () => Promise.resolve({}
22
24
  }
23
25
  }
24
26
  catch (error) {
27
+ afterRun();
25
28
  if (run.onRunError === undefined)
26
29
  throw error;
27
30
  await run.onRunError(error);
28
31
  return;
29
32
  }
33
+ afterRun();
30
34
  await run.present(outcome);
31
35
  }
@@ -1,5 +1,4 @@
1
1
  import { Command } from "commander";
2
- import type { RunLabProvenance } from "../../run/status.js";
3
2
  import type { LabConfig } from "../../lab/types.js";
4
3
  import { type CliIo, type LabCommandOptions } from "../io.js";
5
4
  import type { RouteRun } from "./lab-route-run.js";
@@ -7,7 +6,6 @@ interface ScriptedRouteArgs {
7
6
  command: Command;
8
7
  io: CliIo;
9
8
  config: LabConfig;
10
- labProvenance?: RunLabProvenance;
11
9
  mode: "run" | "watch";
12
10
  options: LabCommandOptions;
13
11
  }
@@ -24,7 +24,6 @@ export function scriptedRouteRun(args) {
24
24
  options: {
25
25
  ...cliAnalysisOptions(args.io),
26
26
  cwd: args.options.cwd,
27
- ...(args.labProvenance === undefined ? {} : { lab: args.labProvenance }),
28
27
  open: observerOpen(args.mode, finishedPlan, shouldOpen),
29
28
  ...(args.options.dryRun === undefined ? {} : { dryRun: args.options.dryRun }),
30
29
  ...(args.options.runId === undefined ? {} : { runId: args.options.runId }),
@@ -1,5 +1,4 @@
1
1
  import { Command } from "commander";
2
- import type { RunLabProvenance } from "../../run/status.js";
3
2
  import type { LabConfig } from "../../lab/types.js";
4
3
  import { type CliIo, type LabCommandOptions } from "../io.js";
5
4
  import type { RouteRun } from "./lab-route-run.js";
@@ -7,7 +6,6 @@ interface SharedWorldRouteArgs {
7
6
  command: Command;
8
7
  io: CliIo;
9
8
  config: LabConfig;
10
- labProvenance?: RunLabProvenance;
11
9
  mode: "run" | "watch";
12
10
  options: LabCommandOptions;
13
11
  }
@@ -63,7 +63,6 @@ export function sharedWorldRouteRun(args) {
63
63
  options: {
64
64
  ...cliAnalysisOptions(args.io),
65
65
  cwd: args.options.cwd,
66
- ...(args.labProvenance === undefined ? {} : { lab: args.labProvenance }),
67
66
  open: wantsFollow
68
67
  ? false
69
68
  : finishedPlan === undefined
@@ -1,5 +1,4 @@
1
1
  import { Command } from "commander";
2
- import type { RunLabProvenance } from "../../run/status.js";
3
2
  import type { LabConfig } from "../../lab/types.js";
4
3
  import { type CliIo, type LabCommandOptions } from "../io.js";
5
4
  import type { RouteRun } from "./lab-route-run.js";
@@ -7,7 +6,6 @@ interface TerminalRouteArgs {
7
6
  command: Command;
8
7
  io: CliIo;
9
8
  config: LabConfig;
10
- labProvenance?: RunLabProvenance;
11
9
  mode: "run" | "watch";
12
10
  options: LabCommandOptions;
13
11
  }
@@ -24,7 +24,6 @@ export function terminalRouteRun(args) {
24
24
  options: {
25
25
  ...cliAnalysisOptions(args.io),
26
26
  cwd: args.options.cwd,
27
- ...(args.labProvenance === undefined ? {} : { lab: args.labProvenance }),
28
27
  open: observerOpen(args.mode, finishedPlan, shouldOpen),
29
28
  ...(args.options.dryRun === undefined ? {} : { dryRun: args.options.dryRun }),
30
29
  ...(args.options.runId === undefined ? {} : { runId: args.options.runId }),