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
@@ -1,4 +1,5 @@
1
1
  import type { RunBundle } from "./bundle.js";
2
+ import { type RunStudyProvenance } from "./study-provenance.js";
2
3
  import { type PreparedOutputRoot } from "./contained-output.js";
3
4
  import type { ExecutionOutcome } from "./judge.js";
4
5
  export declare const RUN_STATUS_SCHEMA = "humanish.run-status.v1";
@@ -12,15 +13,6 @@ export declare const RUN_STATUS_TOUCH_MS = 5000;
12
13
  * slack so an ordinary scheduling hiccup or a slow disk never mislabels a healthy run.
13
14
  */
14
15
  export declare const RUN_STATUS_STALE_MS: number;
15
- /** Which manifest a run came from, when it came from one. */
16
- export interface RunLabProvenance {
17
- /** The lab id as declared in its manifest (`config.id`). */
18
- id: string;
19
- /** Repo-relative manifest path, when the run came from a file on disk. */
20
- path?: string;
21
- /** `committed` = humanish/labs, `ignored` = a local overlay, `explicit` = a path the operator passed. */
22
- origin?: "committed" | "ignored" | "explicit";
23
- }
24
16
  type RunStatusState = "running" | "finished" | "interrupted";
25
17
  /** The signals the CLI's run handler records when it stops a run. */
26
18
  export type RunInterruptSignal = "SIGINT" | "SIGTERM" | "SIGHUP";
@@ -40,6 +32,11 @@ interface RunStatusOutcome {
40
32
  };
41
33
  /** The run-level estimate, `null` when declared absent (never coerced to 0). */
42
34
  estimatedCostUsd?: number | null;
35
+ /**
36
+ * `cost.fullyEstimated`: false when some participant or desktop usage has no price, so the
37
+ * estimate is a lower bound. Absent means unknown, as in every record written before 0.109.
38
+ */
39
+ estimatedCostComplete?: boolean;
43
40
  durationMs?: number;
44
41
  }
45
42
  /** The outcome a finalized status record carries, read from the bundle that was just written. */
@@ -49,8 +46,13 @@ export interface RunStatusRecord {
49
46
  runId: string;
50
47
  state: RunStatusState;
51
48
  mode: "dry-run" | "live";
52
- /** Absent when the run did not come from a lab manifest (a library caller, a bare `run`). */
53
- lab?: RunLabProvenance;
49
+ /** Absent when the run did not come from a study file (a library caller, a bare `run`). */
50
+ study?: RunStudyProvenance;
51
+ /**
52
+ * `study`'s value, as runs saved by 0.108 and earlier wrote it. humanish no longer writes it.
53
+ * Read either through studyProvenanceOf.
54
+ */
55
+ lab?: RunStudyProvenance;
54
56
  /** The pid that owns the run, for local liveness checks. */
55
57
  pid: number;
56
58
  startedAt: string;
@@ -68,7 +70,7 @@ export interface RunStatusHandle {
68
70
  * still has a record to classify. */
69
71
  readonly started: Promise<void>;
70
72
  /** Finalize: state `finished`, `completedAt`, and the derived outcome. Stops the cadence.
71
- * Idempotent — a second call is a no-op, so a backend with several exit paths is safe. */
73
+ * Idempotent: a second call is a no-op, so a route with several exit paths is safe. */
72
74
  finish(outcome?: RunStatusOutcome): Promise<void>;
73
75
  /** After finish, add the result's ok and execution outcome to the finished record, so status.json
74
76
  * and the result agree. Before finish it does nothing. */
@@ -85,12 +87,12 @@ export interface RunStatusHandle {
85
87
  export interface BeginRunStatusOptions {
86
88
  runId: string;
87
89
  mode: "dry-run" | "live";
88
- lab?: RunLabProvenance | undefined;
90
+ study?: RunStudyProvenance | undefined;
89
91
  }
90
92
  /**
91
93
  * Start a run's status record and keep it fresh. Fire-and-forget by design: a status write that
92
94
  * fails must never fail the run it describes, so every write swallows its error. The interval is
93
- * `unref`'d — this file can never be the reason a process stays alive.
95
+ * `unref`'d, so this file can never be the reason a process stays alive.
94
96
  */
95
97
  export declare function beginRunStatus(runPaths: PreparedOutputRoot, options: BeginRunStatusOptions): RunStatusHandle;
96
98
  /** The three ways a run reads from disk. `interrupted` is a record its stopped process wrote, or a
@@ -103,19 +105,4 @@ export type RunLiveness = "running" | "interrupted" | "finished";
103
105
  export declare function classifyRunStatus(record: Pick<RunStatusRecord, "state" | "updatedAt">, nowMs: number, staleMs?: number): RunLiveness;
104
106
  /** Shape guard for a record read off disk. Unknown extra fields are tolerated (additive contract). */
105
107
  export declare function isRunStatusRecord(value: unknown): value is RunStatusRecord;
106
- /**
107
- * The legacy bridge: infer a lab id for a bundle written before this contract, where the only
108
- * attribution was the `lab:<id>` convention on persona/scenario source strings. Deliberately
109
- * conservative — it reads the convention and nothing else, and a `lab:` prefix with an empty
110
- * remainder is not an id. Ids may contain colons (the removed meta-lab wrote `oss:meta`), so
111
- * only the first segment is stripped. Returns undefined when the bundle carries no such marker.
112
- */
113
- export declare function inferLegacyLabId(bundle: {
114
- persona?: {
115
- source?: string;
116
- };
117
- scenario?: {
118
- source?: string;
119
- };
120
- }): string | undefined;
121
108
  export {};
@@ -1,14 +1,15 @@
1
1
  // Run identity and liveness on disk: one small record per run, written by every backend, that says
2
- // which lab the run belongs to and whether it is still alive. A reader can list and classify runs
2
+ // which study the run belongs to and whether it is still alive. A reader can list and classify runs
3
3
  // from it without parsing every bundle, and can tell a live run from an abandoned one.
4
4
  //
5
5
  // run.json remains the evidence of record. This file is a derived index and liveness record:
6
6
  // `verify` never gates on it, nothing here is a claim about what a participant did, and when the
7
7
  // two disagree run.json wins and this file can be rebuilt from it.
8
8
  //
9
- // Public safety: it holds only the run id, the lab id/path/origin (the strings `humanish lab list`
9
+ // Public safety: it holds only the run id, the study id/path/origin (the strings `humanish study list`
10
10
  // prints), the mode, a local pid and timestamps. It holds no hostname or user/path identity: an
11
11
  // operator may share the run directory, so a share-safety gate must have nothing to strip here.
12
+ import { isProvenanceField, studyFields } from "./study-provenance.js";
12
13
  import { writeContainedOutputFile } from "./contained-output.js";
13
14
  import { redactText } from "../evidence/redaction.js";
14
15
  export const RUN_STATUS_SCHEMA = "humanish.run-status.v1";
@@ -41,12 +42,15 @@ export function runStatusOutcome(bundle) {
41
42
  ...(bundle.cost?.estimatedTotalUsd === undefined
42
43
  ? {}
43
44
  : { estimatedCostUsd: bundle.cost.estimatedTotalUsd }),
45
+ ...(typeof bundle.cost?.fullyEstimated === "boolean"
46
+ ? { estimatedCostComplete: bundle.cost.fullyEstimated }
47
+ : {}),
44
48
  };
45
49
  }
46
50
  /**
47
51
  * Start a run's status record and keep it fresh. Fire-and-forget by design: a status write that
48
52
  * fails must never fail the run it describes, so every write swallows its error. The interval is
49
- * `unref`'d — this file can never be the reason a process stays alive.
53
+ * `unref`'d, so this file can never be the reason a process stays alive.
50
54
  */
51
55
  export function beginRunStatus(runPaths, options) {
52
56
  const iso = () => new Date().toISOString();
@@ -56,7 +60,7 @@ export function beginRunStatus(runPaths, options) {
56
60
  runId: options.runId,
57
61
  state: "running",
58
62
  mode: options.mode,
59
- ...(options.lab === undefined ? {} : { lab: options.lab }),
63
+ ...studyFields(options.study),
60
64
  pid: process.pid,
61
65
  startedAt,
62
66
  updatedAt: startedAt,
@@ -170,30 +174,7 @@ export function isRunStatusRecord(value) {
170
174
  return false;
171
175
  if (typeof record.startedAt !== "string" || typeof record.updatedAt !== "string")
172
176
  return false;
173
- if (record.lab !== undefined) {
174
- if (record.lab === null || typeof record.lab !== "object")
175
- return false;
176
- if (typeof record.lab.id !== "string")
177
- return false;
178
- }
177
+ if (!isProvenanceField(record.study) || !isProvenanceField(record.lab))
178
+ return false;
179
179
  return true;
180
180
  }
181
- /**
182
- * The legacy bridge: infer a lab id for a bundle written before this contract, where the only
183
- * attribution was the `lab:<id>` convention on persona/scenario source strings. Deliberately
184
- * conservative — it reads the convention and nothing else, and a `lab:` prefix with an empty
185
- * remainder is not an id. Ids may contain colons (the removed meta-lab wrote `oss:meta`), so
186
- * only the first segment is stripped. Returns undefined when the bundle carries no such marker.
187
- */
188
- export function inferLegacyLabId(bundle) {
189
- for (const source of [bundle.persona?.source, bundle.scenario?.source]) {
190
- if (typeof source !== "string")
191
- continue;
192
- if (!source.startsWith("lab:"))
193
- continue;
194
- const id = source.slice("lab:".length).trim();
195
- if (id !== "")
196
- return id;
197
- }
198
- return undefined;
199
- }
@@ -1,4 +1,5 @@
1
1
  import { lstat, readdir } from "node:fs/promises";
2
+ import { runNotFoundMessage } from "./run-not-found.js";
2
3
  import path from "node:path";
3
4
  import { redactText } from "../evidence/redaction.js";
4
5
  import { bindExistingRunArtifactPaths, RUNS_RELATIVE_ROOT, isSafeRunIdSegment, resolveRunsRoot, validatePreparedRunArtifactPaths, } from "./paths.js";
@@ -66,7 +67,7 @@ export async function cleanupRun(cwdInput, runInput, hooks = {}) {
66
67
  if (!resolved) {
67
68
  return cleanupRefusal(cwd, runInput, checkedAt, {
68
69
  code: "HUMANISH_RUN_NOT_FOUND",
69
- message: `Run not found: ${runInput}`,
70
+ message: await runNotFoundMessage(cwd, runInput),
70
71
  });
71
72
  }
72
73
  const runPaths = resolved;
@@ -140,7 +140,7 @@ export function isRunSimulationStatus(value) {
140
140
  value === "running" ||
141
141
  value === "passed" ||
142
142
  // Participant outcomes (docs/principles/three-roles.md). This runtime allowlist is the actual
143
- // gate — the TS union alone does not validate a bundle read back from disk.
143
+ // gate; the TS union alone does not validate a bundle read back from disk.
144
144
  value === "abandoned" ||
145
145
  value === "incomplete" ||
146
146
  value === "complete" ||
@@ -64,14 +64,14 @@ export interface RunDesktopGeometry {
64
64
  source: "xdpyinfo";
65
65
  };
66
66
  /**
67
- * The device preset as declared by the lab, present only when it differs from `requested`
67
+ * The device preset as declared by the study, present only when it differs from `requested`
68
68
  * because the rendered width was floored to MIN_DESKTOP_RENDER_WIDTH.
69
69
  *
70
70
  * Without this, a floored run is indistinguishable from a faithful one: `verified` compares
71
71
  * the floored number with itself and reports a match, so a reader of the bundle sees
72
72
  * requested 500 / verified 500 and reasonably concludes a 500-wide preset was asked for. A
73
- * `mobile` (414) and a `small-mobile` (360) seat both render at 500 and look identical here.
74
- * When this field is set, the preset width did not render; see #221.
73
+ * `mobile` (414) and a `small-mobile` (360) participant both render at 500 and look identical
74
+ * here. When this field is set, the preset width did not render.
75
75
  */
76
76
  declared?: {
77
77
  width: number;
@@ -96,7 +96,7 @@ export interface RunDesktopGeometry {
96
96
  source: "cdp";
97
97
  };
98
98
  /**
99
- * Mobile fidelity beyond viewport size (#221), present only when the lab asked for it. `requested`
99
+ * Mobile fidelity beyond viewport size, present only when the study asked for it. `requested`
100
100
  * is what was applied through CDP; `resolved` is what the page reported about itself afterwards
101
101
  * and is the proof, never copied from the request. A run without this block is a
102
102
  * responsive-viewport study, whatever its preset is named.
@@ -122,7 +122,7 @@ export interface RunDesktopGeometry {
122
122
  };
123
123
  /**
124
124
  * Page targets the participant drove after the launch page (a link that opened in a new tab)
125
- * whose own read-back reported the requested viewport width (#623). Absent when the
125
+ * whose own read-back reported the requested viewport width. Absent when the
126
126
  * participant never left the launch tab; a later tab that did not report the width is a
127
127
  * participant warning instead.
128
128
  */
@@ -234,9 +234,9 @@ export interface RunStream {
234
234
  };
235
235
  actor?: ActorTrace;
236
236
  /**
237
- * Mid-run partial actor evidence (#441): the redacted trace items recorded so far,
237
+ * Mid-run partial actor evidence: the redacted trace items recorded so far,
238
238
  * flushed while a live participant is still running so the attached Observer's timeline can
239
- * grow. It is deliberately not an ActorTrace: a running participant has no honest status,
239
+ * grow. It is deliberately not an ActorTrace: a running participant has no final status,
240
240
  * completionReason, or completedAt, and this shape cannot claim them. Present only on
241
241
  * `inProgress` bundles; the final write replaces it with the real `actor` and never
242
242
  * carries it.
@@ -0,0 +1,49 @@
1
+ /** Which study a run came from, when it came from one. */
2
+ export interface RunStudyProvenance {
3
+ /** The study id its file declares (`config.id`). */
4
+ id: string;
5
+ /** Project-relative path of the study file, when the run came from a file on disk. */
6
+ path?: string;
7
+ /**
8
+ * `committed` = humanish/studies or humanish/labs, `ignored` = a local overlay, `explicit` = a
9
+ * path the operator passed.
10
+ */
11
+ origin?: "committed" | "ignored" | "explicit";
12
+ }
13
+ /** Whether a saved record's `study` or `lab` field is absent or shaped like a provenance. */
14
+ export declare function isProvenanceField(value: unknown): boolean;
15
+ /**
16
+ * A saved record's study: a valid `study`, else a valid `lab`, else the id its persona or scenario
17
+ * source names by convention.
18
+ */
19
+ export declare function studyProvenanceOf(record: {
20
+ study?: unknown;
21
+ lab?: unknown;
22
+ persona?: {
23
+ source?: unknown;
24
+ };
25
+ scenario?: {
26
+ source?: unknown;
27
+ };
28
+ }): RunStudyProvenance | undefined;
29
+ /**
30
+ * `study`, as run.json and status.json write it. 0.108 wrote `lab` beside it with the same value;
31
+ * 0.109 stopped, and studyProvenanceOf still reads `lab` from those runs.
32
+ */
33
+ export declare function studyFields(study: RunStudyProvenance | undefined): {
34
+ study?: RunStudyProvenance;
35
+ };
36
+ /**
37
+ * The study id a run names by the `study:<id>` or `lab:<id>` convention on its persona or scenario
38
+ * source, the only attribution a run written before `lab` and `study` has. A prefix with an empty
39
+ * remainder is not an id. Ids may contain colons (`lab:oss:meta`), so only the prefix is stripped.
40
+ * Readers keep both prefixes for good: saved runs say `lab:`.
41
+ */
42
+ export declare function inferLegacyStudyId(bundle: {
43
+ persona?: {
44
+ source?: unknown;
45
+ };
46
+ scenario?: {
47
+ source?: unknown;
48
+ };
49
+ }): string | undefined;
@@ -0,0 +1,66 @@
1
+ // Which study a saved run came from. run.json and status.json write it as `study`; runs saved by
2
+ // 0.108 and earlier also carry `lab` with the same value. Every reader goes through
3
+ // studyProvenanceOf, which also reads a run older than both fields by the `study:<id>` or
4
+ // `lab:<id>` convention on its persona and scenario sources.
5
+ const ORIGINS = ["committed", "ignored", "explicit"];
6
+ /** `value` as a provenance when it has an id, keeping only its fields that are valid. */
7
+ function provenance(value) {
8
+ if (value === null || typeof value !== "object")
9
+ return undefined;
10
+ const record = value;
11
+ if (typeof record.id !== "string" || record.id === "")
12
+ return undefined;
13
+ const origin = record.origin;
14
+ return {
15
+ id: record.id,
16
+ ...(typeof record.path === "string" ? { path: record.path } : {}),
17
+ ...(typeof origin === "string" && ORIGINS.includes(origin)
18
+ ? { origin: origin }
19
+ : {}),
20
+ };
21
+ }
22
+ /** Whether a saved record's `study` or `lab` field is absent or shaped like a provenance. */
23
+ export function isProvenanceField(value) {
24
+ if (value === undefined)
25
+ return true;
26
+ if (value === null || typeof value !== "object")
27
+ return false;
28
+ return typeof value.id === "string";
29
+ }
30
+ /**
31
+ * A saved record's study: a valid `study`, else a valid `lab`, else the id its persona or scenario
32
+ * source names by convention.
33
+ */
34
+ export function studyProvenanceOf(record) {
35
+ const declared = provenance(record.study) ?? provenance(record.lab);
36
+ if (declared !== undefined)
37
+ return declared;
38
+ const id = inferLegacyStudyId(record);
39
+ return id === undefined ? undefined : { id };
40
+ }
41
+ /**
42
+ * `study`, as run.json and status.json write it. 0.108 wrote `lab` beside it with the same value;
43
+ * 0.109 stopped, and studyProvenanceOf still reads `lab` from those runs.
44
+ */
45
+ export function studyFields(study) {
46
+ return study === undefined ? {} : { study };
47
+ }
48
+ /**
49
+ * The study id a run names by the `study:<id>` or `lab:<id>` convention on its persona or scenario
50
+ * source, the only attribution a run written before `lab` and `study` has. A prefix with an empty
51
+ * remainder is not an id. Ids may contain colons (`lab:oss:meta`), so only the prefix is stripped.
52
+ * Readers keep both prefixes for good: saved runs say `lab:`.
53
+ */
54
+ export function inferLegacyStudyId(bundle) {
55
+ for (const source of [bundle.persona?.source, bundle.scenario?.source]) {
56
+ if (typeof source !== "string")
57
+ continue;
58
+ const prefix = ["study:", "lab:"].find((candidate) => source.startsWith(candidate));
59
+ if (prefix === undefined)
60
+ continue;
61
+ const id = source.slice(prefix.length).trim();
62
+ if (id !== "")
63
+ return id;
64
+ }
65
+ return undefined;
66
+ }
@@ -0,0 +1,11 @@
1
+ /** The schema of a study's result on every route. */
2
+ export declare const STUDY_RESULT_SCHEMA = "humanish.study-result.v1";
3
+ /** The fields every route's result carries to name its route and its study. */
4
+ export interface StudyResultIdentity<R extends string> {
5
+ schema: typeof STUDY_RESULT_SCHEMA;
6
+ route: R;
7
+ /** The study's `id`. */
8
+ studyId: string;
9
+ }
10
+ /** The identity fields for a result of route `route` from the study `studyId`. */
11
+ export declare function studyResultIdentity<R extends string>(route: R, studyId: string): StudyResultIdentity<R>;
@@ -0,0 +1,9 @@
1
+ // The schema every route's result carries when a study runs: preview, computer use, scripted,
2
+ // terminal and shared world. `route` says which, and route-specific fields stay on their route's
3
+ // result type.
4
+ /** The schema of a study's result on every route. */
5
+ export const STUDY_RESULT_SCHEMA = "humanish.study-result.v1";
6
+ /** The identity fields for a result of route `route` from the study `studyId`. */
7
+ export function studyResultIdentity(route, studyId) {
8
+ return { schema: STUDY_RESULT_SCHEMA, route, studyId };
9
+ }
@@ -1,2 +1,4 @@
1
1
  /** Escape a literal string for use inside a RegExp source. */
2
2
  export declare function escapeRegExp(value: string): string;
3
+ /** "1 run", "2 runs"; `plural` names the irregular form, as in plural(n, "analysis", "analyses"). */
4
+ export declare function plural(count: number, singular: string, pluralForm?: string): string;
package/dist/run/text.js CHANGED
@@ -2,3 +2,7 @@
2
2
  export function escapeRegExp(value) {
3
3
  return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
4
4
  }
5
+ /** "1 run", "2 runs"; `plural` names the irregular form, as in plural(n, "analysis", "analyses"). */
6
+ export function plural(count, singular, pluralForm = `${singular}s`) {
7
+ return `${count} ${count === 1 ? singular : pluralForm}`;
8
+ }
@@ -0,0 +1,112 @@
1
+ import type { LocalVmInput } from "./routes/computer-use/types.js";
2
+ import { type LateScorer } from "./study/route-inputs.js";
3
+ import { type StudyRoute } from "./study/plan.js";
4
+ import type { StudyDeps } from "./study/study-deps.js";
5
+ import type { RunStudyDriving, RunStudyHomes } from "./study/run-study-homes.js";
6
+ import { type StudyConfig } from "./study/types.js";
7
+ import type { ObserverResult } from "./observer/render.js";
8
+ import { type CuaActorStudyResult } from "./routes/computer-use/types.js";
9
+ import { type PreviewStudyResult } from "./routes/preview.js";
10
+ import { type ScriptedBrowserStudyResult } from "./routes/scripted/types.js";
11
+ import { type ConcurrentSharedWorldStudyResult } from "./routes/shared-world/types.js";
12
+ import { type TerminalProductStudyResult } from "./routes/terminal/types.js";
13
+ import { type RunScorerProvenance } from "./run/bundle.js";
14
+ import type { RunStudyProvenance } from "./run/study-provenance.js";
15
+ /**
16
+ * Runs a study on its route. The options are checked against the route and mapped into the route's
17
+ * hook bags before anything runs. Each route closes the run it started on every exit through its
18
+ * own run scope (`src/run/run.ts`).
19
+ */
20
+ export declare function runStudyWith(config: StudyConfig, options: InternalRunStudyOptions, deps?: StudyDeps): Promise<StudyOutcome>;
21
+ /**
22
+ * The package's study runner (`src/index.ts`): runStudyWith with the public options only. A
23
+ * JavaScript caller that passes a field RunStudyOptions no longer has, or a humanish.lab.v2 config,
24
+ * is refused in the route's own result envelope before anything runs.
25
+ */
26
+ export declare function runStudy(config: StudyConfig, options: RunStudyOptions): Promise<StudyOutcome>;
27
+ /** A study planned once: the route's refusal, or the run of its plan. */
28
+ export type PreparedStudy = {
29
+ readonly ok: false;
30
+ readonly outcome: StudyOutcome;
31
+ } | {
32
+ readonly ok: true;
33
+ /** Runs the plan. A scorer loaded after planning joins the run's hooks; it changes no plan. */
34
+ run(scorer?: LateScorer): Promise<StudyOutcome>;
35
+ };
36
+ /**
37
+ * Normalizes the options and plans the study once, so a caller can present a refusal before it loads
38
+ * anything the run needs. A local browser study's provider is bound first, so the plan is made with
39
+ * it, and its desktop goes to the computer-use run as `localVm`; with inProcess the caller drives
40
+ * the app in process and needs no desktop.
41
+ */
42
+ export declare function prepareStudy(config: StudyConfig, options: InternalRunStudyOptions, deps?: StudyDeps): Promise<PreparedStudy>;
43
+ /**
44
+ * What a package caller passes to runStudy: the run's settings and the typed homes (`RunStudyHomes`,
45
+ * `RunStudyDriving`). Each wins over the config when provided.
46
+ */
47
+ export type RunStudyOptions = RunStudyBase & RunStudyHomes & RunStudyDriving;
48
+ interface RunStudyBase {
49
+ cwd: string;
50
+ runId?: string;
51
+ dryRun?: boolean;
52
+ open?: boolean;
53
+ /** Participant count override: preview participants or computer-use desktops. */
54
+ count?: number;
55
+ /** CUA fan-out only: create a new run for failed/selected participants from a prior run. */
56
+ rerun?: {
57
+ sourceRunId: string;
58
+ participantIds?: string[];
59
+ };
60
+ onObserverReady?: (observer: ObserverResult & {
61
+ ok: true;
62
+ }) => Promise<void> | void;
63
+ }
64
+ /** runStudyWith's options inside the package: the public ones plus what only the CLI and tests set. */
65
+ export type InternalRunStudyOptions = RunStudyOptions & RunStudyInternals;
66
+ interface RunStudyInternals {
67
+ /**
68
+ * Which manifest this run came from. planStudy puts it on the plan, and the route reads
69
+ * plan.study for the run's status record and bundle. Absent for a library caller that passes a
70
+ * StudyConfig directly; that run records no study.
71
+ */
72
+ study?: RunStudyProvenance;
73
+ /**
74
+ * Config-declared scorer provenance, forwarded alongside the
75
+ * loaded scorer. Its presence is the "declared" marker the terminal route reads to flip a
76
+ * status:"fail" verdict; the browser routes stamp it as evidence (they already flip). Core-computed
77
+ * (path + digest), never adopter-supplied; absent for library callers.
78
+ */
79
+ scorerProvenance?: RunScorerProvenance;
80
+ /** The local VM study's desktop, analysis gate and signal, for a local browser study. */
81
+ localVm?: LocalVmInput;
82
+ }
83
+ /** A run's result and the route it ran on. */
84
+ interface RouteOutcome<R extends StudyRoute, T> {
85
+ route: R;
86
+ result: T;
87
+ }
88
+ export type StudyOutcome = RouteOutcome<"preview", PreviewStudyResult> | RouteOutcome<"computer-use", CuaActorStudyResult> | RouteOutcome<"scripted", ScriptedBrowserStudyResult> | RouteOutcome<"terminal", TerminalProductStudyResult> | RouteOutcome<"shared-world", ConcurrentSharedWorldStudyResult>;
89
+ /**
90
+ * A plan past its route's local checks that need no scorer: the refusal they returned, or the
91
+ * route's run, which takes a scorer loaded after them.
92
+ */
93
+ export type AdmittedPlan<R extends StudyRoute = StudyRoute> = {
94
+ readonly ok: false;
95
+ readonly outcome: Extract<StudyOutcome, {
96
+ route: R;
97
+ }>;
98
+ } | {
99
+ readonly ok: true;
100
+ run(scorer?: LateScorer): Promise<Extract<StudyOutcome, {
101
+ route: R;
102
+ }>>;
103
+ };
104
+ /** The result of a run on route `R`, the `result` of that route's `StudyOutcome`. */
105
+ export type StudyResult<R extends StudyRoute = StudyRoute> = {
106
+ preview: PreviewStudyResult;
107
+ "computer-use": CuaActorStudyResult;
108
+ scripted: ScriptedBrowserStudyResult;
109
+ terminal: TerminalProductStudyResult;
110
+ "shared-world": ConcurrentSharedWorldStudyResult;
111
+ }[R];
112
+ export {};