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
@@ -4,16 +4,16 @@ import type { ReasoningEffort } from "../actors/reasoning-effort.js";
4
4
  import type { BrowserSurface } from "../actors/scripted-browser/types.js";
5
5
  import type { ScriptedRefusal } from "../routes/scripted/plan.js";
6
6
  import type { TerminalRefusal } from "../routes/terminal/plan.js";
7
- import type { RunLabProvenance } from "../run/status.js";
7
+ import type { RunStudyProvenance } from "../run/study-provenance.js";
8
8
  import type { ComputerUseRefusal } from "../routes/computer-use/plan.js";
9
9
  import type { SharedWorldRefusal } from "../routes/shared-world/plan.js";
10
10
  import type { ComputerUseParticipant, ExternalPublicParticipant, ProvisionedParticipant } from "./plan-participants.js";
11
- import type { LabConfig, LabExecutionTerminal, LabRuntimeAuth, LabScenarioCaps, LabSubjectProduct, LabSubjectServe, LabSubjectState, LabSubjectStateCheckpoint } from "./types.js";
11
+ import type { StudyConfig, StudyExecutionTerminal, StudyRuntimeAuth, StudyScenarioCaps, StudySubjectProduct, StudySubjectServe, StudySubjectState, StudySubjectStateCheckpoint } from "./types.js";
12
12
  export type NonEmpty<T> = readonly [T, ...T[]];
13
13
  type AtLeastTwo<T> = readonly [T, T, ...T[]];
14
14
  /**
15
15
  * Something a route checks right before acquisition. Preflight refuses on, and doctor and the TUI
16
- * report, the keys and subject env listed here, through src/lab/requirements.ts.
16
+ * report, the keys and subject env listed here, through src/study/requirements.ts.
17
17
  */
18
18
  export type Requirement = {
19
19
  readonly kind: "key";
@@ -48,21 +48,21 @@ export type Requirement = {
48
48
  * VM study read it before a plan exists. Shared world, terminal and scripted still read some config
49
49
  * fields at run time.
50
50
  */
51
- export type ResidualConfig = Pick<LabConfig, "comms" | "policies" | "personas" | "defaults" | "review"> & {
52
- readonly execution?: Pick<NonNullable<LabConfig["execution"]>, "desktop" | "target">;
53
- readonly subject: Pick<LabConfig["subject"], "clone" | "localTree" | "repos" | "envValues">;
51
+ export type ResidualConfig = Pick<StudyConfig, "comms" | "policies" | "personas" | "defaults" | "review"> & {
52
+ readonly execution?: Pick<NonNullable<StudyConfig["execution"]>, "desktop" | "target">;
53
+ readonly subject: Pick<StudyConfig["subject"], "clone" | "localTree" | "repos" | "envValues">;
54
54
  };
55
55
  export interface PlannedAnalysis {
56
56
  readonly config: AnalysisConfig;
57
- /** "default" when the lab declared no review.analysis. */
57
+ /** "default" when the study declared no review.analysis. */
58
58
  readonly trigger: "default" | "explicit";
59
59
  readonly preferLargerOutput: boolean;
60
60
  }
61
61
  interface PlanBase {
62
- readonly labId: string;
63
- /** The lab's declared title, which bundles record. */
62
+ readonly studyId: string;
63
+ /** The study's declared title, which bundles record. */
64
64
  readonly title?: string;
65
- readonly lab?: RunLabProvenance;
65
+ readonly study?: RunStudyProvenance;
66
66
  /** A frozen copy owned by the plan. */
67
67
  readonly residual: Readonly<ResidualConfig>;
68
68
  readonly dryRun: boolean;
@@ -83,7 +83,7 @@ interface PreviewPlan extends PlanBase {
83
83
  }
84
84
  /**
85
85
  * The model driving a desktop participant. `caller` is the library caller's createProvider.
86
- * `declaredModel` is actors[0].model as the lab wrote it, absent when undeclared: the providers
86
+ * `declaredModel` is actors[0].model as the study wrote it, absent when undeclared: the providers
87
87
  * take it as written, and spend is priced at it, else the default (pricedModel). An openai
88
88
  * brain's `model` is the one its provider runs, with that default applied.
89
89
  */
@@ -102,14 +102,14 @@ export type Brain = {
102
102
  export type ProvisionedSubject = {
103
103
  readonly kind: "clone";
104
104
  readonly repo: string;
105
- readonly serve: LabSubjectServe;
105
+ readonly serve: StudySubjectServe;
106
106
  readonly env: readonly string[];
107
- readonly state?: LabSubjectState;
107
+ readonly state?: StudySubjectState;
108
108
  } | {
109
109
  readonly kind: "local-tree";
110
- readonly serve: LabSubjectServe;
110
+ readonly serve: StudySubjectServe;
111
111
  readonly env: readonly string[];
112
- readonly state?: LabSubjectState;
112
+ readonly state?: StudySubjectState;
113
113
  };
114
114
  export interface AppUrlSubject {
115
115
  readonly kind: "app-url";
@@ -131,7 +131,7 @@ export type ComputerUseRunner = {
131
131
  readonly participants: NonEmpty<ComputerUseParticipant>;
132
132
  readonly subject: AppUrlSubject | ProvisionedSubject | {
133
133
  readonly kind: "desktop-cli";
134
- readonly product: LabSubjectProduct;
134
+ readonly product: StudySubjectProduct;
135
135
  /** As on AppUrlSubject: a library config's declared `subject.serve.url`. */
136
136
  readonly serveUrl?: string;
137
137
  };
@@ -172,8 +172,8 @@ export interface ComputerUsePlan extends PlanBase {
172
172
  readonly participantIds?: readonly string[];
173
173
  };
174
174
  }
175
- type CheckpointedState = LabSubjectState & {
176
- readonly checkpoint: NonEmpty<LabSubjectStateCheckpoint>;
175
+ type CheckpointedState = StudySubjectState & {
176
+ readonly checkpoint: NonEmpty<StudySubjectStateCheckpoint>;
177
177
  };
178
178
  export type SharedWorldPlane = {
179
179
  readonly kind: "provisioned";
@@ -194,7 +194,7 @@ export interface SharedWorldPlan extends PlanBase {
194
194
  readonly plane: SharedWorldPlane;
195
195
  /** At least 2. */
196
196
  readonly concurrency: number;
197
- /** The declared seat session timeout; the route supplies its default. */
197
+ /** The declared participant session timeout; the route supplies its default. */
198
198
  readonly sessionTimeoutMs?: number;
199
199
  readonly brain: Extract<Brain, {
200
200
  kind: "openai" | "local-agent";
@@ -208,7 +208,7 @@ export type TerminalPlan = PlanBase & {
208
208
  readonly route: "terminal";
209
209
  /** The registered terminal actor that runs. */
210
210
  readonly actor: string;
211
- readonly product: LabSubjectProduct & {
211
+ readonly product: StudySubjectProduct & {
212
212
  readonly publicSurfaces: NonEmpty<string>;
213
213
  };
214
214
  /** The declared persona and mission; the route supplies its defaults. */
@@ -218,21 +218,21 @@ export type TerminalPlan = PlanBase & {
218
218
  readonly version?: string;
219
219
  /** Passed to Codex as `--model` on every run, so the bundle can name and price it. */
220
220
  readonly model: string;
221
- /** `declared` by the lab's actor, or humanish's participant default. */
221
+ /** `declared` by the study's actor, or humanish's participant default. */
222
222
  readonly modelSource: "declared" | "humanish_default";
223
223
  readonly reasoningEffort?: ReasoningEffort;
224
- readonly auth?: LabRuntimeAuth;
224
+ readonly auth?: StudyRuntimeAuth;
225
225
  };
226
226
  /** The declared egress routing allowlist; without one the sandbox egress is unrestricted. */
227
227
  readonly egressAllow?: readonly string[];
228
228
  /** The declared operator stdin posture; the route defaults to "disabled". */
229
- readonly stdin?: NonNullable<LabExecutionTerminal["stdin"]>;
229
+ readonly stdin?: NonNullable<StudyExecutionTerminal["stdin"]>;
230
230
  } & ({
231
231
  readonly dryRun: true;
232
- readonly caps?: LabScenarioCaps;
232
+ readonly caps?: StudyScenarioCaps;
233
233
  } | {
234
234
  readonly dryRun: false;
235
- readonly caps: LabScenarioCaps & {
235
+ readonly caps: StudyScenarioCaps & {
236
236
  readonly maxUsd: number;
237
237
  readonly maxMinutes: number;
238
238
  };
@@ -259,9 +259,9 @@ export interface ScriptedPlan extends PlanBase {
259
259
  readonly personaId?: string;
260
260
  readonly sessionTimeoutMs?: number;
261
261
  }
262
- export type LabPlan = PreviewPlan | ComputerUsePlan | SharedWorldPlan | TerminalPlan | ScriptedPlan;
263
- interface PlannedLab {
264
- readonly plan: LabPlan;
262
+ export type StudyPlan = PreviewPlan | ComputerUsePlan | SharedWorldPlan | TerminalPlan | ScriptedPlan;
263
+ interface PlannedStudy {
264
+ readonly plan: StudyPlan;
265
265
  }
266
266
  /**
267
267
  * The error a route returns before a run starts: the route, its error code and a message. Each
@@ -282,12 +282,12 @@ export type RoutePlanResult<Plan, Refusal> = {
282
282
  readonly refusal: Refusal;
283
283
  };
284
284
  /** The error codes the preview route returns before a run starts. */
285
- export type PreviewRefusalCode = "HUMANISH_LAB_COMMS_UNSUPPORTED" | "HUMANISH_LAB_ANALYSIS_INVALID" | "HUMANISH_LAB_ANALYSIS_UNSUPPORTED" | "HUMANISH_LAB_TASKS_UNSUPPORTED" | "HUMANISH_INVALID_SIM_COUNT" | "HUMANISH_LIVE_RUN_UNIMPLEMENTED";
286
- /** Why planLab refused: the route's own code and message, as its runner returns them. */
285
+ export type PreviewRefusalCode = "HUMANISH_STUDY_COMMS_UNSUPPORTED" | "HUMANISH_STUDY_ANALYSIS_INVALID" | "HUMANISH_STUDY_ANALYSIS_UNSUPPORTED" | "HUMANISH_STUDY_TASKS_UNSUPPORTED" | "HUMANISH_INVALID_PARTICIPANT_COUNT" | "HUMANISH_LIVE_RUN_UNIMPLEMENTED";
286
+ /** Why planStudy refused: the route's own code and message, as its runner returns them. */
287
287
  export type PlanRefusal = RouteRefusal<"preview", PreviewRefusalCode> | TerminalRefusal | ScriptedRefusal | ComputerUseRefusal | SharedWorldRefusal;
288
288
  export type PlanResult = {
289
289
  readonly ok: true;
290
- readonly planned: PlannedLab;
290
+ readonly planned: PlannedStudy;
291
291
  } | {
292
292
  readonly ok: false;
293
293
  readonly refusal: PlanRefusal;
@@ -1,5 +1,5 @@
1
- // The LabPlan union: what planLab decides about a lab before anything runs. Each route has its own
1
+ // The StudyPlan union: what planStudy decides about a study before anything runs. Each route has its own
2
2
  // variant, and each supported subject and substrate pairing is its own case, so a combination the
3
3
  // routes refuse cannot be written down. Numeric bounds, unique ids, safe URLs and "exactly one
4
- // host" stay checks in planLab.
4
+ // host" stay checks in planStudy.
5
5
  export {};
@@ -0,0 +1,13 @@
1
+ import type { InternalRunStudyOptions } from "../run-study.js";
2
+ import type { StudyDeps } from "./study-deps.js";
3
+ import type { PlanResult } from "./plan-types.js";
4
+ import type { StudyConfig } from "./types.js";
5
+ export { routeOf, type StudyRoute } from "./routing.js";
6
+ /** Resolve dry-run: explicit override wins, else the scenario mode, else the given fallback. */
7
+ export declare function resolveStudyDryRun(config: StudyConfig, override: boolean | undefined, fallback: boolean | undefined): boolean | undefined;
8
+ /**
9
+ * The plan a study runs under, built without reading files, env or the network. Each route's planner
10
+ * makes every refusal that route makes, in the route's order and with its codes and messages; the
11
+ * route's exported runner calls the same planner.
12
+ */
13
+ export declare function planStudy(config: StudyConfig, options: InternalRunStudyOptions, deps?: StudyDeps): PlanResult;
@@ -0,0 +1,101 @@
1
+ // The route decision. A study's route follows from its composition (subject.source,
2
+ // execution.target, the first actor's registered run kind, subject.topology), never from a
3
+ // declared kind. This is the only function that decides it.
4
+ import { resolveAutomaticAnalysis } from "../analysis/automatic-config.js";
5
+ import { callerDrivingOf, planComputerUseStudy } from "../routes/computer-use/plan.js";
6
+ import { injectedBrowser, planScriptedStudy } from "../routes/scripted/plan.js";
7
+ import { planSharedWorldStudy } from "../routes/shared-world/plan.js";
8
+ import { planTerminalStudy } from "../routes/terminal/plan.js";
9
+ import { localBrowserDefaults } from "../substrates/local/runtime-config.js";
10
+ import { THIS_REPO_DRY_RUN_ONLY } from "./composition-rules.js";
11
+ import { planBase } from "./plan-base.js";
12
+ import { routeOf } from "./routing.js";
13
+ import { automaticAnalysisRouteReason, taskProtocolValidationReason } from "./validation.js";
14
+ export { routeOf } from "./routing.js";
15
+ /** Resolve dry-run: explicit override wins, else the scenario mode, else the given fallback. */
16
+ export function resolveStudyDryRun(config, override, fallback) {
17
+ if (override !== undefined) {
18
+ return override;
19
+ }
20
+ if (config.scenario?.mode === "live") {
21
+ return false;
22
+ }
23
+ if (config.scenario?.mode === "dry-run") {
24
+ return true;
25
+ }
26
+ return fallback;
27
+ }
28
+ /**
29
+ * The preview route's refusals before a run starts, in its order: real email receiving, then
30
+ * analysis, then tasks. Each would otherwise be silently ignored by a synthetic run.
31
+ */
32
+ function planPreview(config, options, input) {
33
+ const refuse = (code, message) => ({
34
+ ok: false,
35
+ refusal: { route: "preview", code, message },
36
+ });
37
+ if (String(config.comms?.email?.kind) === "real")
38
+ return refuse("HUMANISH_STUDY_COMMS_UNSUPPORTED", "Real email receiving is unsupported on the preview route. Use a supported hosted computer-use study.");
39
+ const analysis = resolveAutomaticAnalysis(config.review?.analysis);
40
+ if (!analysis.ok)
41
+ return refuse("HUMANISH_STUDY_ANALYSIS_INVALID", analysis.message);
42
+ const unsupported = automaticAnalysisRouteReason(config);
43
+ if (unsupported)
44
+ return refuse("HUMANISH_STUDY_ANALYSIS_UNSUPPORTED", unsupported);
45
+ const tasksReason = taskProtocolValidationReason(config);
46
+ if (tasksReason)
47
+ return refuse("HUMANISH_STUDY_TASKS_UNSUPPORTED", tasksReason);
48
+ const participantCount = options.count ?? config.actors[0]?.count ?? 4;
49
+ if (!Number.isSafeInteger(participantCount) || participantCount < 1)
50
+ return refuse("HUMANISH_INVALID_PARTICIPANT_COUNT", "count must be a positive integer.");
51
+ if (!input.dryRun)
52
+ return refuse("HUMANISH_LIVE_RUN_UNIMPLEMENTED", THIS_REPO_DRY_RUN_ONLY);
53
+ return {
54
+ ok: true,
55
+ plan: {
56
+ ...planBase(config, { ...input, analysis }),
57
+ route: "preview",
58
+ dryRun: true,
59
+ participantCount,
60
+ },
61
+ };
62
+ }
63
+ /**
64
+ * The plan a study runs under, built without reading files, env or the network. Each route's planner
65
+ * makes every refusal that route makes, in the route's order and with its codes and messages; the
66
+ * route's exported runner calls the same planner.
67
+ */
68
+ export function planStudy(config, options, deps = {}) {
69
+ const study = localBrowserDefaults(config);
70
+ const input = { dryRun: resolveStudyDryRun(study, options.dryRun, true) ?? true };
71
+ const result = planRoute(routeOf(config), study, options, input, deps);
72
+ if (!result.ok)
73
+ return result;
74
+ // The manifest the CLI resolved enters the plan here and nowhere else; the routes read
75
+ // plan.study for the run's status record and bundle.
76
+ const plan = options.study === undefined ? result.plan : { ...result.plan, study: options.study };
77
+ return { ok: true, planned: { plan } };
78
+ }
79
+ function planRoute(route, study, options, input, deps) {
80
+ switch (route) {
81
+ case "preview":
82
+ return planPreview(study, options, input);
83
+ case "computer-use":
84
+ return planComputerUseStudy(study, {
85
+ ...input,
86
+ hasRunSession: deps.runSession !== undefined,
87
+ driving: callerDrivingOf(options),
88
+ ...(options.count === undefined ? {} : { countOverride: options.count }),
89
+ ...(options.rerun === undefined ? {} : { rerun: options.rerun }),
90
+ });
91
+ case "shared-world":
92
+ return planSharedWorldStudy(study, {
93
+ ...input,
94
+ hasRunSession: deps.runSession !== undefined,
95
+ });
96
+ case "terminal":
97
+ return planTerminalStudy(study, { ...input, hasCostProbe: deps.costProbe !== undefined });
98
+ case "scripted":
99
+ return planScriptedStudy(study, { ...input, injectedBrowser: injectedBrowser(deps) });
100
+ }
101
+ }
@@ -0,0 +1,3 @@
1
+ import type { StudyPreflightResult, PreflightContext } from "./preflight.js";
2
+ export declare function runPublicPreviewPreflight(ctx: PreflightContext): Promise<StudyPreflightResult>;
3
+ export declare function runSandboxLoopbackPreflight(ctx: PreflightContext): Promise<StudyPreflightResult>;
@@ -1,9 +1,9 @@
1
- // The two reachability probes `humanish lab preflight` can run: public-preview checks a public
1
+ // The two reachability probes `humanish study check` can run: public-preview checks a public
2
2
  // target from an E2B desktop, and sandbox-loopback serves a clone subject inside one. Each leases one
3
3
  // sandbox, journals it for `humanish reclaim --preflight`, and tears it down. preflight.ts resolves
4
- // the lab and dispatches here.
4
+ // the study and dispatches here.
5
5
  import { cloneProvisioningBudgetMs, provisionCloneSubject } from "../subject/clone.js";
6
- import { CUA_ACTOR_LAB_PROVIDER_METADATA } from "../routes/computer-use/e2b-desktop/prepare.js";
6
+ import { CUA_ACTOR_STUDY_PROVIDER_METADATA } from "../routes/computer-use/e2b-desktop/prepare.js";
7
7
  import { MAX_SANDBOX_MS } from "../substrates/e2b/lifetime.js";
8
8
  import { abandonPreflightJournal, discardPreflightJournal, openPreflightJournal, } from "../run/preflight-receipts.js";
9
9
  import { probeUrl } from "../substrates/detached.js";
@@ -13,13 +13,14 @@ import { e2bShell } from "../substrates/e2b/shell.js";
13
13
  import { redactText } from "../evidence/redaction.js";
14
14
  import { digest, fail, finalize } from "./preflight-result.js";
15
15
  import { rosterOf } from "./parse/actors.js";
16
+ import { plural } from "../run/text.js";
16
17
  const DEFAULT_REQUEST_TIMEOUT_MS = 60_000;
17
18
  // Room on the probe's lease for desktop boot and teardown around the work it does.
18
19
  const PREFLIGHT_LEASE_BUFFER_MS = 5 * 60_000;
19
20
  export async function runPublicPreviewPreflight(ctx) {
20
21
  const routeError = publicPreviewRouteError(ctx.config, ctx.route);
21
22
  if (routeError) {
22
- return fail(ctx, "HUMANISH_LAB_PREFLIGHT_UNSUPPORTED_ROUTE", routeError, [
23
+ return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_UNSUPPORTED_ROUTE", routeError, [
23
24
  { name: "route", ok: false, message: routeError },
24
25
  ]);
25
26
  }
@@ -28,12 +29,12 @@ export async function runPublicPreviewPreflight(ctx) {
28
29
  ? rosterTargets
29
30
  : ctx.targets.filter((target) => target.kind === "subject.appUrl");
30
31
  if (publicTargets.length === 0) {
31
- return fail(ctx, "HUMANISH_LAB_PREFLIGHT_TARGET_POLICY", "public-preview preflight needs at least one declared app-url target.", [{ name: "targets", ok: false, message: "no app-url targets were declared" }]);
32
+ return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_TARGET_POLICY", "public-preview preflight needs at least one declared app-url target.", [{ name: "targets", ok: false, message: "no app-url targets were declared" }]);
32
33
  }
33
34
  const loopbackTarget = publicTargets.find((target) => target.loopback);
34
35
  if (loopbackTarget) {
35
36
  blockTarget(loopbackTarget, "public-preview requires externally reachable non-loopback targets.");
36
- return fail(ctx, "HUMANISH_LAB_PREFLIGHT_TARGET_POLICY", "public-preview reachability cannot prove loopback targets from a hosted desktop; use sandbox-loopback or a prepared public target.", [
37
+ return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_TARGET_POLICY", "public-preview reachability cannot prove loopback targets from a hosted desktop; use sandbox-loopback or a prepared public target.", [
37
38
  {
38
39
  name: "target policy",
39
40
  ok: false,
@@ -43,7 +44,7 @@ export async function runPublicPreviewPreflight(ctx) {
43
44
  }
44
45
  const e2bApiKey = ctx.env.E2B_API_KEY?.trim();
45
46
  if (!e2bApiKey) {
46
- return fail(ctx, "HUMANISH_LAB_PREFLIGHT_E2B_REQUIRED", "public-preview preflight creates one E2B desktop to probe target reachability; E2B_API_KEY is required.", [{ name: "e2b api key", ok: false, message: "missing E2B_API_KEY" }]);
47
+ return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_E2B_REQUIRED", "public-preview preflight creates one E2B desktop to probe target reachability; E2B_API_KEY is required.", [{ name: "e2b api key", ok: false, message: "missing E2B_API_KEY" }]);
47
48
  }
48
49
  // Each target gets at most one readiness budget.
49
50
  const leaseMs = publicTargets.length * ctx.timeoutMs + PREFLIGHT_LEASE_BUFFER_MS;
@@ -63,7 +64,7 @@ export async function runPublicPreviewPreflight(ctx) {
63
64
  }
64
65
  const failed = publicTargets.find((target) => target.reachable === false);
65
66
  if (failed) {
66
- return fail(ctx, "HUMANISH_LAB_PREFLIGHT_TARGET_UNREACHABLE", "one or more declared public-preview targets were not reachable from the hosted desktop.", [
67
+ return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_TARGET_UNREACHABLE", "one or more declared public-preview targets were not reachable from the hosted desktop.", [
67
68
  {
68
69
  name: "target reachability",
69
70
  ok: false,
@@ -82,31 +83,31 @@ export async function runPublicPreviewPreflight(ctx) {
82
83
  export async function runSandboxLoopbackPreflight(ctx) {
83
84
  const routeError = sandboxLoopbackRouteError(ctx.config, ctx.route);
84
85
  if (routeError) {
85
- return fail(ctx, "HUMANISH_LAB_PREFLIGHT_UNSUPPORTED_ROUTE", routeError, [
86
+ return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_UNSUPPORTED_ROUTE", routeError, [
86
87
  { name: "route", ok: false, message: routeError },
87
88
  ]);
88
89
  }
89
90
  const missingEnv = (ctx.config.subject.env ?? []).filter((name) => !ctx.env[name]?.trim());
90
91
  if (missingEnv.length > 0) {
91
- return fail(ctx, "HUMANISH_LAB_PREFLIGHT_ENV_MISSING", `sandbox-loopback preflight needs declared env values: ${missingEnv.join(", ")}`, [
92
+ return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_ENV_MISSING", `sandbox-loopback preflight needs declared env values: ${missingEnv.join(", ")}`, [
92
93
  {
93
94
  name: "subject env",
94
95
  ok: false,
95
- message: `${missingEnv.length} declared env var value(s) missing`,
96
+ message: `${plural(missingEnv.length, "declared env var value")} missing`,
96
97
  },
97
98
  ]);
98
99
  }
99
100
  const e2bApiKey = ctx.env.E2B_API_KEY?.trim();
100
101
  if (!e2bApiKey) {
101
- return fail(ctx, "HUMANISH_LAB_PREFLIGHT_E2B_REQUIRED", "sandbox-loopback preflight creates one E2B desktop to clone, serve, and probe the subject; E2B_API_KEY is required.", [{ name: "e2b api key", ok: false, message: "missing E2B_API_KEY" }]);
102
+ return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_E2B_REQUIRED", "sandbox-loopback preflight creates one E2B desktop to clone, serve, and probe the subject; E2B_API_KEY is required.", [{ name: "e2b api key", ok: false, message: "missing E2B_API_KEY" }]);
102
103
  }
103
104
  const repo = ctx.config.subject.repos?.[0];
104
105
  const serve = ctx.config.subject.serve;
105
106
  if (!repo || !serve) {
106
- return fail(ctx, "HUMANISH_LAB_PREFLIGHT_UNSUPPORTED_ROUTE", "sandbox-loopback preflight requires one clone repo and subject.serve.", [{ name: "clone subject", ok: false, message: "missing repo or serve block" }]);
107
+ return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_UNSUPPORTED_ROUTE", "sandbox-loopback preflight requires one clone repo and subject.serve.", [{ name: "clone subject", ok: false, message: "missing repo or serve block" }]);
107
108
  }
108
109
  let subjectCommitDigest;
109
- // The longest the clone and serve steps can take with the lab's own budgets, so the probe is
110
+ // The longest the clone and serve steps can take with the study's own budgets, so the probe is
110
111
  // never cut off where the run's provisioning would still be allowed to finish.
111
112
  const leaseMs = cloneProvisioningBudgetMs(serve, ctx.config.subject.state) + PREFLIGHT_LEASE_BUFFER_MS;
112
113
  const probe = await withPreflightSandbox(ctx, { e2bApiKey, leaseMs }, async (shell) => {
@@ -167,7 +168,7 @@ async function withPreflightSandbox(ctx, args, callback) {
167
168
  timeoutMs,
168
169
  lifecycle: { onTimeout: "kill" },
169
170
  metadata: {
170
- ...CUA_ACTOR_LAB_PROVIDER_METADATA,
171
+ ...CUA_ACTOR_STUDY_PROVIDER_METADATA,
171
172
  mode: "lab-preflight",
172
173
  labId: ctx.config.id,
173
174
  reachability: ctx.reachability,
@@ -216,7 +217,7 @@ async function withPreflightSandbox(ctx, args, callback) {
216
217
  if (failureMessage) {
217
218
  return {
218
219
  ok: false,
219
- result: fail(ctx, "HUMANISH_LAB_PREFLIGHT_PROVISION_FAILED", failureMessage, [
220
+ result: fail(ctx, "HUMANISH_STUDY_PREFLIGHT_PROVISION_FAILED", failureMessage, [
220
221
  { name: "sandbox preflight", ok: false, message: failureMessage },
221
222
  ]),
222
223
  };
@@ -224,7 +225,7 @@ async function withPreflightSandbox(ctx, args, callback) {
224
225
  if (ctx.sandbox.created && ctx.sandbox.killed !== true) {
225
226
  return {
226
227
  ok: false,
227
- result: fail(ctx, "HUMANISH_LAB_PREFLIGHT_TEARDOWN_FAILED", "preflight sandbox was created but teardown could not be proven.", [{ name: "sandbox teardown", ok: false, message: "sandbox kill was not proven" }]),
228
+ result: fail(ctx, "HUMANISH_STUDY_PREFLIGHT_TEARDOWN_FAILED", "preflight sandbox was created but teardown could not be proven.", [{ name: "sandbox teardown", ok: false, message: "sandbox kill was not proven" }]),
228
229
  };
229
230
  }
230
231
  return { ok: true };
@@ -282,7 +283,7 @@ function publicPreviewRouteError(config, route) {
282
283
  if (route !== "computer-use" ||
283
284
  config.subject.source !== "app-url" ||
284
285
  config.execution?.target !== "e2b-desktop") {
285
- return "public-preview preflight supports app-url × e2b-desktop computer-use labs.";
286
+ return "public-preview preflight supports app-url × e2b-desktop computer-use studies.";
286
287
  }
287
288
  if (config.policies?.allowPublicTargets !== true) {
288
289
  return "public-preview preflight requires policies.allowPublicTargets: true so the owner explicitly declares the public/preview target.";
@@ -293,7 +294,7 @@ function sandboxLoopbackRouteError(config, route) {
293
294
  if (route !== "computer-use" ||
294
295
  config.subject.source !== "clone" ||
295
296
  config.execution?.target !== "e2b-desktop") {
296
- return "sandbox-loopback preflight supports clone × e2b-desktop computer-use labs. (local-tree labs are not preflightable yet: see the local-tree goal doc's out-of-scope list; a dry run of the lab is the current no-spend check.)";
297
+ return "sandbox-loopback preflight supports clone × e2b-desktop computer-use studies. Local-tree studies cannot be preflighted yet; a dry run of the study is the current no-spend check.";
297
298
  }
298
299
  if (!config.subject.serve) {
299
300
  return "sandbox-loopback preflight requires subject.serve.";
@@ -0,0 +1,8 @@
1
+ import type { StudyPreflightCheck, StudyPreflightResult, PreflightContext } from "./preflight.js";
2
+ /** The schema of `study check` results: whether a study is ready to run on this machine. */
3
+ export declare const STUDY_CHECK_SCHEMA = "humanish.study-check.v1";
4
+ export declare function finalize(ctx: PreflightContext, args?: {
5
+ check?: StudyPreflightCheck;
6
+ }): StudyPreflightResult;
7
+ export declare function fail(ctx: PreflightContext, code: NonNullable<StudyPreflightResult["error"]>["code"], message: string, checks: StudyPreflightCheck[]): StudyPreflightResult;
8
+ export declare function digest(value: string): string;
@@ -2,18 +2,19 @@
2
2
  // preflight-probes.ts both finish through these, so they live below both.
3
3
  import { automaticAnalysisBudget } from "../analysis/automatic-config.js";
4
4
  import { digestText } from "../evidence/redaction.js";
5
- export const LAB_PREFLIGHT_SCHEMA = "humanish.lab-preflight-result.v1";
5
+ /** The schema of `study check` results: whether a study is ready to run on this machine. */
6
+ export const STUDY_CHECK_SCHEMA = "humanish.study-check.v1";
6
7
  export function finalize(ctx, args) {
7
8
  const checks = args?.check ? [...ctx.checks, args.check] : ctx.checks;
8
9
  const analysis = automaticAnalysisBudget(ctx.config.review?.analysis, ctx.route);
9
10
  return {
10
- schema: LAB_PREFLIGHT_SCHEMA,
11
+ schema: STUDY_CHECK_SCHEMA,
11
12
  ...(analysis ? { analysis } : {}),
12
13
  ok: checks.every((check) => check.ok) &&
13
14
  ctx.targets.every((target) => target.status !== "failed" && target.status !== "blocked"),
14
15
  cwd: ctx.cwd,
15
- lab: ctx.lab,
16
- labId: ctx.labId,
16
+ study: ctx.study,
17
+ studyId: ctx.studyId,
17
18
  origin: ctx.origin,
18
19
  path: ctx.path,
19
20
  route: ctx.route,
@@ -0,0 +1,94 @@
1
+ import type { AutomaticAnalysisBudget } from "../analysis/automatic-config.js";
2
+ import type { E2BDesktopModule } from "../substrates/e2b/sdk.js";
3
+ import { type StudyConfig } from "./types.js";
4
+ import { STUDY_CHECK_SCHEMA } from "./preflight-result.js";
5
+ import { type StudyRoute } from "./plan.js";
6
+ import { type StudyResolveFailure } from "./discover.js";
7
+ export type StudyPreflightReachabilityMode = "metadata" | "public-preview" | "sandbox-loopback" | "prepared-host";
8
+ export interface StudyPreflightCheck {
9
+ name: string;
10
+ ok: boolean;
11
+ message: string;
12
+ }
13
+ export interface StudyPreflightTarget {
14
+ label: string;
15
+ kind: "subject.appUrl" | "actors[0].lanes[].target" | "subject.serve.url" | "subject.product.publicSurface";
16
+ targetDigest: string;
17
+ originDigest?: string;
18
+ loopback: boolean;
19
+ checked: boolean;
20
+ reachable?: boolean;
21
+ status: "not_checked" | "passed" | "failed" | "blocked";
22
+ statusCode?: number;
23
+ errorCode?: "HUMANISH_PREFLIGHT_TARGET_BLOCKED" | "HUMANISH_PREFLIGHT_TARGET_UNREACHABLE";
24
+ message: string;
25
+ }
26
+ interface StudyPreflightSandbox {
27
+ created: boolean;
28
+ killed?: boolean;
29
+ /** The probe's server-side timeout, after which the provider kills it. */
30
+ timeoutMs?: number;
31
+ sandboxIdDigest?: string;
32
+ template?: string;
33
+ }
34
+ interface StudyPreflightSpend {
35
+ e2bDesktop: boolean;
36
+ model: false;
37
+ }
38
+ export interface StudyPreflightResult {
39
+ /** The separate budget for a future live run, never spend by preflight itself. */
40
+ analysis?: AutomaticAnalysisBudget;
41
+ schema: typeof STUDY_CHECK_SCHEMA;
42
+ ok: boolean;
43
+ cwd: string;
44
+ /** The study the caller asked for, as given. */
45
+ study: string;
46
+ /** The resolved study's `id`, once the file parses. */
47
+ studyId?: string;
48
+ origin?: string;
49
+ path?: string;
50
+ route?: StudyRoute;
51
+ reachability: StudyPreflightReachabilityMode;
52
+ checks: StudyPreflightCheck[];
53
+ targets: StudyPreflightTarget[];
54
+ sandbox: StudyPreflightSandbox;
55
+ spend: StudyPreflightSpend;
56
+ warnings: string[];
57
+ error?: {
58
+ code: StudyResolveFailure["error"]["code"] | "HUMANISH_STUDY_PREFLIGHT_INVALID_OPTION" | "HUMANISH_STUDY_PREFLIGHT_UNSUPPORTED_ROUTE" | "HUMANISH_STUDY_PREFLIGHT_TARGET_POLICY" | "HUMANISH_STUDY_PREFLIGHT_ENV_MISSING" | "HUMANISH_STUDY_PREFLIGHT_E2B_REQUIRED" | "HUMANISH_STUDY_PREFLIGHT_TARGET_UNREACHABLE" | "HUMANISH_STUDY_PREFLIGHT_PROVISION_FAILED" | "HUMANISH_STUDY_PREFLIGHT_TEARDOWN_FAILED";
59
+ message: string;
60
+ };
61
+ }
62
+ interface StudyPreflightHooks {
63
+ loadDesktopModule?: () => Promise<E2BDesktopModule>;
64
+ now?: () => number;
65
+ sleep?: (ms: number) => Promise<void>;
66
+ }
67
+ export interface RunStudyPreflightOptions {
68
+ cwd: string;
69
+ study: string;
70
+ reachability?: StudyPreflightReachabilityMode;
71
+ timeoutMs?: number;
72
+ env?: NodeJS.ProcessEnv;
73
+ hooks?: StudyPreflightHooks;
74
+ }
75
+ /** A preflight run's state; the probes in preflight-probes.ts read and extend it. */
76
+ export interface PreflightContext {
77
+ cwd: string;
78
+ study: string;
79
+ studyId: string;
80
+ origin: string;
81
+ path: string;
82
+ config: StudyConfig;
83
+ route: StudyRoute;
84
+ reachability: StudyPreflightReachabilityMode;
85
+ timeoutMs: number;
86
+ env: NodeJS.ProcessEnv;
87
+ hooks: StudyPreflightHooks;
88
+ checks: StudyPreflightCheck[];
89
+ targets: StudyPreflightTarget[];
90
+ sandbox: StudyPreflightSandbox;
91
+ warnings: string[];
92
+ }
93
+ export declare function runStudyPreflight(options: RunStudyPreflightOptions): Promise<StudyPreflightResult>;
94
+ export {};
@@ -2,26 +2,26 @@ import path from "node:path";
2
2
  import { isLoopbackUrl } from "./parse/subject.js";
3
3
  import {} from "./types.js";
4
4
  import { runPublicPreviewPreflight, runSandboxLoopbackPreflight } from "./preflight-probes.js";
5
- import { digest, fail, finalize, LAB_PREFLIGHT_SCHEMA } from "./preflight-result.js";
5
+ import { digest, fail, finalize, STUDY_CHECK_SCHEMA } from "./preflight-result.js";
6
6
  import { routeOf } from "./plan.js";
7
- import { resolveLabManifest } from "./discover.js";
7
+ import { resolveStudyManifest } from "./discover.js";
8
8
  import { rosterOf } from "./parse/actors.js";
9
9
  const DEFAULT_PREFLIGHT_TIMEOUT_MS = 30_000;
10
- export async function runLabPreflight(options) {
10
+ export async function runStudyPreflight(options) {
11
11
  const cwd = path.resolve(options.cwd);
12
12
  const reachability = options.reachability ?? "metadata";
13
13
  const timeoutMs = options.timeoutMs ?? DEFAULT_PREFLIGHT_TIMEOUT_MS;
14
- const resolved = await resolveLabManifest(cwd, options.lab);
14
+ const resolved = await resolveStudyManifest(cwd, options.study);
15
15
  if (!resolved.ok) {
16
16
  return {
17
- schema: LAB_PREFLIGHT_SCHEMA,
17
+ schema: STUDY_CHECK_SCHEMA,
18
18
  ok: false,
19
19
  cwd,
20
- lab: options.lab,
20
+ study: options.study,
21
21
  reachability,
22
22
  checks: [
23
23
  {
24
- name: "lab manifest",
24
+ name: "study file",
25
25
  ok: false,
26
26
  message: resolved.error.message,
27
27
  },
@@ -36,8 +36,8 @@ export async function runLabPreflight(options) {
36
36
  const route = routeOf(resolved.config);
37
37
  const ctx = {
38
38
  cwd,
39
- lab: options.lab,
40
- labId: resolved.config.id,
39
+ study: options.study,
40
+ studyId: resolved.config.id,
41
41
  origin: resolved.origin,
42
42
  path: resolved.path,
43
43
  config: resolved.config,
@@ -47,7 +47,7 @@ export async function runLabPreflight(options) {
47
47
  env: options.env ?? process.env,
48
48
  hooks: options.hooks ?? {},
49
49
  checks: [
50
- { name: "lab manifest", ok: true, message: `resolved ${resolved.origin} lab manifest` },
50
+ { name: "study file", ok: true, message: `resolved ${resolved.origin} study file` },
51
51
  { name: "route", ok: true, message: `selected the ${route} route` },
52
52
  ],
53
53
  targets: collectTargets(resolved.config),
@@ -60,7 +60,7 @@ export async function runLabPreflight(options) {
60
60
  check: {
61
61
  name: "reachability",
62
62
  ok: true,
63
- message: "metadata-only; no network, sandbox, or model calls. Credentials, local login, dependencies and target reachability were not checked; use humanish doctor --lab <lab> for setup checks.",
63
+ message: "metadata-only; no network, sandbox, or model calls. Credentials, local login, dependencies and target reachability were not checked; use humanish doctor --study <study> for setup checks.",
64
64
  },
65
65
  });
66
66
  case "public-preview":
@@ -68,7 +68,7 @@ export async function runLabPreflight(options) {
68
68
  case "sandbox-loopback":
69
69
  return await runSandboxLoopbackPreflight(ctx);
70
70
  case "prepared-host":
71
- return fail(ctx, "HUMANISH_LAB_PREFLIGHT_UNSUPPORTED_ROUTE", "prepared-host preflight requires a library adapter hook; the plain CLI can validate metadata only for this mode.", [
71
+ return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_UNSUPPORTED_ROUTE", "prepared-host preflight requires a library adapter hook; the plain CLI can validate metadata only for this mode.", [
72
72
  {
73
73
  name: "prepared-host",
74
74
  ok: false,