humanish 0.106.1 → 0.108.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (668) hide show
  1. package/ARCHITECTURE.md +38 -32
  2. package/CHANGELOG.md +28 -0
  3. package/CONTEXT.md +51 -41
  4. package/README.md +152 -174
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-client.js +2 -1
  14. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  15. package/dist/actors/codex/app-server-trace.js +1 -3
  16. package/dist/actors/codex/app-server-ui.js +1 -1
  17. package/dist/actors/codex/app-server.js +2 -1
  18. package/dist/actors/codex/codex-admission.d.ts +91 -0
  19. package/dist/actors/codex/codex-admission.js +150 -0
  20. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  21. package/dist/actors/codex/protocol-compat.js +357 -0
  22. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  23. package/dist/actors/codex/protocol-contract.js +471 -0
  24. package/dist/actors/codex/restricted-executable.d.ts +28 -4
  25. package/dist/actors/codex/restricted-executable.js +104 -29
  26. package/dist/actors/codex/restricted-launch.d.ts +9 -2
  27. package/dist/actors/codex/restricted-launch.js +43 -4
  28. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  29. package/dist/actors/codex/restricted-notifications.js +277 -0
  30. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  31. package/dist/actors/codex/restricted-participant.js +66 -6
  32. package/dist/actors/codex/restricted-policy.d.ts +11 -3
  33. package/dist/actors/codex/restricted-policy.js +2 -2
  34. package/dist/actors/codex/restricted-session.d.ts +16 -3
  35. package/dist/actors/codex/restricted-session.js +60 -22
  36. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  37. package/dist/actors/codex/restricted-transport.js +139 -27
  38. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  39. package/dist/actors/codex/restricted-turn.js +43 -30
  40. package/dist/actors/computer-use/actor.d.ts +17 -17
  41. package/dist/actors/computer-use/actor.js +6 -6
  42. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  43. package/dist/actors/computer-use/admission-limit.js +1 -1
  44. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  45. package/dist/actors/computer-use/loop/actions.js +10 -10
  46. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  47. package/dist/actors/computer-use/loop/backstop.js +15 -13
  48. package/dist/actors/computer-use/loop/ending.d.ts +7 -7
  49. package/dist/actors/computer-use/loop/ending.js +9 -9
  50. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  51. package/dist/actors/computer-use/loop/observation.js +9 -9
  52. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  53. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  54. package/dist/actors/computer-use/loop/session.js +3 -3
  55. package/dist/actors/computer-use/loop/spend.d.ts +2 -2
  56. package/dist/actors/computer-use/loop/spend.js +4 -4
  57. package/dist/actors/computer-use/loop/trace.js +11 -10
  58. package/dist/actors/computer-use/loop/types.d.ts +37 -26
  59. package/dist/actors/computer-use/loop/usage.js +2 -2
  60. package/dist/actors/computer-use/loop.js +4 -4
  61. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  62. package/dist/actors/computer-use/openai-context.js +214 -0
  63. package/dist/actors/computer-use/openai-provider.d.ts +12 -9
  64. package/dist/actors/computer-use/openai-provider.js +47 -36
  65. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  66. package/dist/actors/computer-use/openai-requests.js +82 -15
  67. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  68. package/dist/actors/computer-use/openai-wire.js +36 -34
  69. package/dist/actors/contract.d.ts +86 -49
  70. package/dist/actors/contract.js +29 -23
  71. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  72. package/dist/actors/local-agent/claude-session.js +10 -9
  73. package/dist/actors/local-agent/cli.d.ts +8 -6
  74. package/dist/actors/local-agent/cli.js +24 -28
  75. package/dist/actors/local-agent/readiness.d.ts +2 -2
  76. package/dist/actors/local-agent/readiness.js +4 -4
  77. package/dist/actors/reasoning-effort.js +6 -6
  78. package/dist/actors/registry.d.ts +10 -10
  79. package/dist/actors/registry.js +18 -17
  80. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  81. package/dist/actors/scripted-browser/actor.js +16 -16
  82. package/dist/actors/scripted-browser/browser-command.js +1 -1
  83. package/dist/actors/scripted-browser/journey.js +15 -4
  84. package/dist/actors/scripted-browser/steps.js +19 -1
  85. package/dist/actors/scripted-browser/types.d.ts +12 -2
  86. package/dist/actors/stop-conditions.d.ts +1 -1
  87. package/dist/actors/stop-conditions.js +1 -3
  88. package/dist/analysis/automatic-completion.d.ts +13 -8
  89. package/dist/analysis/automatic-completion.js +14 -8
  90. package/dist/analysis/automatic-config.d.ts +1 -1
  91. package/dist/analysis/automatic-config.js +2 -2
  92. package/dist/analysis/automatic.d.ts +10 -4
  93. package/dist/analysis/automatic.js +17 -13
  94. package/dist/analysis/codex-config.d.ts +6 -2
  95. package/dist/analysis/codex-config.js +22 -14
  96. package/dist/analysis/diagnostics.d.ts +23 -0
  97. package/dist/analysis/diagnostics.js +112 -0
  98. package/dist/analysis/evidence-sources.js +2 -2
  99. package/dist/analysis/evidence.js +6 -6
  100. package/dist/analysis/execute.d.ts +7 -1
  101. package/dist/analysis/execute.js +39 -12
  102. package/dist/analysis/job.d.ts +8 -5
  103. package/dist/analysis/job.js +15 -14
  104. package/dist/analysis/load.d.ts +1 -1
  105. package/dist/analysis/load.js +5 -5
  106. package/dist/analysis/provider.d.ts +9 -1
  107. package/dist/analysis/restricted-codex.d.ts +2 -0
  108. package/dist/analysis/restricted-codex.js +10 -1
  109. package/dist/analysis/service.d.ts +2 -0
  110. package/dist/analysis/service.js +35 -16
  111. package/dist/analysis/sharing.d.ts +2 -2
  112. package/dist/analysis/sharing.js +5 -5
  113. package/dist/analysis/store-executions.d.ts +5 -5
  114. package/dist/analysis/store-executions.js +12 -12
  115. package/dist/analysis/store.d.ts +4 -4
  116. package/dist/analysis/store.js +13 -13
  117. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  118. package/dist/cli/commands/analysis-signals.js +4 -1
  119. package/dist/cli/commands/analyze.js +23 -18
  120. package/dist/cli/commands/codex.js +9 -9
  121. package/dist/cli/commands/comms.js +62 -34
  122. package/dist/cli/commands/feedback.js +20 -21
  123. package/dist/cli/commands/lab-format.d.ts +5 -4
  124. package/dist/cli/commands/lab-format.js +35 -23
  125. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  126. package/dist/cli/commands/lab-route-computer-use.js +32 -21
  127. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  128. package/dist/cli/commands/lab-route-preview.js +7 -7
  129. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  130. package/dist/cli/commands/lab-route-run.js +6 -2
  131. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  132. package/dist/cli/commands/lab-route-scripted.js +0 -1
  133. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  134. package/dist/cli/commands/lab-route-shared-world.js +3 -4
  135. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  136. package/dist/cli/commands/lab-route-terminal.js +0 -1
  137. package/dist/cli/commands/lab-run.js +84 -54
  138. package/dist/cli/commands/lab-scorer.d.ts +2 -4
  139. package/dist/cli/commands/lab-scorer.js +1 -1
  140. package/dist/cli/commands/migrate.d.ts +4 -0
  141. package/dist/cli/commands/migrate.js +65 -0
  142. package/dist/cli/commands/observe.js +168 -107
  143. package/dist/cli/commands/run-command.d.ts +10 -0
  144. package/dist/cli/commands/run-command.js +85 -0
  145. package/dist/cli/commands/run-signals.d.ts +30 -0
  146. package/dist/cli/commands/run-signals.js +146 -0
  147. package/dist/cli/commands/runs.js +137 -136
  148. package/dist/cli/commands/setup.d.ts +2 -2
  149. package/dist/cli/commands/setup.js +26 -21
  150. package/dist/cli/commands/study.d.ts +3 -0
  151. package/dist/cli/commands/study.js +182 -0
  152. package/dist/cli/commands/tui.d.ts +4 -4
  153. package/dist/cli/commands/tui.js +21 -21
  154. package/dist/cli/commands/watch.js +64 -77
  155. package/dist/cli/deprecations.d.ts +18 -0
  156. package/dist/cli/deprecations.js +48 -0
  157. package/dist/cli/doctor.d.ts +18 -5
  158. package/dist/cli/doctor.js +111 -48
  159. package/dist/cli/first-run-path.d.ts +12 -10
  160. package/dist/cli/first-run-path.js +30 -28
  161. package/dist/cli/io.d.ts +46 -10
  162. package/dist/cli/io.js +109 -30
  163. package/dist/cli/observer-follow.d.ts +2 -2
  164. package/dist/cli/observer-follow.js +5 -6
  165. package/dist/cli/orientation.d.ts +6 -3
  166. package/dist/cli/orientation.js +43 -39
  167. package/dist/cli/product-sentence.d.ts +6 -0
  168. package/dist/cli/product-sentence.js +6 -0
  169. package/dist/cli/program.d.ts +6 -1
  170. package/dist/cli/program.js +112 -43
  171. package/dist/cli/telemetry.d.ts +17 -17
  172. package/dist/cli/telemetry.js +49 -41
  173. package/dist/cli.js +1 -1
  174. package/dist/comms/capture-surface.d.ts +14 -13
  175. package/dist/comms/capture-surface.js +23 -22
  176. package/dist/comms/catch-host.d.ts +8 -8
  177. package/dist/comms/catch-host.js +14 -14
  178. package/dist/comms/connections.js +4 -4
  179. package/dist/comms/email-catch.d.ts +3 -3
  180. package/dist/comms/email-catch.js +8 -8
  181. package/dist/comms/external-evidence.d.ts +27 -0
  182. package/dist/comms/external-evidence.js +93 -0
  183. package/dist/comms/extract.js +2 -2
  184. package/dist/comms/fake-inbox.d.ts +2 -2
  185. package/dist/comms/fake-inbox.js +2 -2
  186. package/dist/comms/lease-store.js +7 -7
  187. package/dist/comms/receiving-render.d.ts +1 -1
  188. package/dist/comms/receiving-render.js +2 -2
  189. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  190. package/dist/comms/sandbox-catch-script.js +6 -6
  191. package/dist/comms/sandbox-catch.d.ts +36 -37
  192. package/dist/comms/sandbox-catch.js +34 -35
  193. package/dist/comms/setup.js +42 -8
  194. package/dist/comms/thread-evidence.d.ts +1 -1
  195. package/dist/comms/thread-evidence.js +6 -6
  196. package/dist/comms/types.d.ts +6 -6
  197. package/dist/comms/types.js +4 -4
  198. package/dist/evidence/browser-hygiene.d.ts +1 -1
  199. package/dist/evidence/browser-hygiene.js +1 -1
  200. package/dist/evidence/frame-signature.d.ts +1 -1
  201. package/dist/evidence/frame-signature.js +4 -4
  202. package/dist/evidence/redaction.d.ts +3 -3
  203. package/dist/evidence/redaction.js +5 -5
  204. package/dist/evidence/secret-scrub.d.ts +9 -0
  205. package/dist/evidence/secret-scrub.js +96 -0
  206. package/dist/feedback/draft.js +41 -85
  207. package/dist/feedback/export-bundle.js +5 -5
  208. package/dist/feedback/export.d.ts +5 -1
  209. package/dist/feedback/export.js +16 -17
  210. package/dist/feedback/feedback.d.ts +3 -3
  211. package/dist/feedback/feedback.js +21 -3
  212. package/dist/guest/chromium-text.js +2 -2
  213. package/dist/guest/desktop-native.d.ts +1 -1
  214. package/dist/guest/runtime.js +1 -1
  215. package/dist/index.d.ts +14 -15
  216. package/dist/index.js +10 -11
  217. package/dist/keys/key-resolution.d.ts +7 -5
  218. package/dist/keys/key-resolution.js +40 -38
  219. package/dist/lab/adapter-extension.d.ts +35 -13
  220. package/dist/lab/adapter-extension.js +50 -134
  221. package/dist/lab/adapter-scorer-loader.d.ts +32 -12
  222. package/dist/lab/adapter-scorer-loader.js +56 -32
  223. package/dist/lab/composition-rules.js +58 -58
  224. package/dist/lab/config.js +85 -43
  225. package/dist/lab/deprecated-fields.d.ts +10 -0
  226. package/dist/lab/deprecated-fields.js +24 -0
  227. package/dist/lab/device-presets.d.ts +10 -10
  228. package/dist/lab/device-presets.js +11 -11
  229. package/dist/lab/discover.d.ts +13 -9
  230. package/dist/lab/discover.js +118 -60
  231. package/dist/lab/doctor.d.ts +53 -11
  232. package/dist/lab/doctor.js +193 -47
  233. package/dist/lab/init-plan.js +1 -3
  234. package/dist/lab/init-templates.js +147 -147
  235. package/dist/lab/init.d.ts +1 -1
  236. package/dist/lab/init.js +41 -9
  237. package/dist/lab/keys.d.ts +2 -0
  238. package/dist/lab/keys.js +43 -9
  239. package/dist/lab/lab-deps.d.ts +80 -0
  240. package/dist/lab/lab-deps.js +4 -0
  241. package/dist/lab/parse/actors.js +17 -16
  242. package/dist/lab/parse/comms.js +8 -7
  243. package/dist/lab/parse/execution.js +15 -14
  244. package/dist/lab/parse/study-v3.d.ts +23 -0
  245. package/dist/lab/parse/study-v3.js +259 -0
  246. package/dist/lab/parse/subject-state.d.ts +7 -7
  247. package/dist/lab/parse/subject-state.js +18 -17
  248. package/dist/lab/parse/subject.js +30 -29
  249. package/dist/lab/parse/values.d.ts +1 -2
  250. package/dist/lab/parse/values.js +3 -6
  251. package/dist/lab/persona-resolve.d.ts +7 -7
  252. package/dist/lab/persona-resolve.js +8 -8
  253. package/dist/lab/persona.js +1 -3
  254. package/dist/lab/plan-base.d.ts +0 -2
  255. package/dist/lab/plan-base.js +6 -4
  256. package/dist/lab/plan-participants.d.ts +7 -7
  257. package/dist/lab/plan-participants.js +2 -2
  258. package/dist/lab/plan-types.d.ts +26 -8
  259. package/dist/lab/plan.d.ts +4 -18
  260. package/dist/lab/plan.js +24 -79
  261. package/dist/lab/preflight-probes.js +11 -11
  262. package/dist/lab/preflight-result.d.ts +2 -1
  263. package/dist/lab/preflight-result.js +5 -6
  264. package/dist/lab/preflight.d.ts +7 -8
  265. package/dist/lab/preflight.js +6 -6
  266. package/dist/lab/requirements.d.ts +20 -0
  267. package/dist/lab/requirements.js +54 -0
  268. package/dist/lab/route-inputs.d.ts +23 -12
  269. package/dist/lab/route-inputs.js +48 -51
  270. package/dist/lab/routing.d.ts +42 -41
  271. package/dist/lab/routing.js +66 -68
  272. package/dist/lab/run-lab-events.d.ts +3 -11
  273. package/dist/lab/run-lab-events.js +2 -16
  274. package/dist/lab/run-lab-homes.d.ts +76 -0
  275. package/dist/lab/run-lab-homes.js +7 -0
  276. package/dist/lab/run-lab-options.d.ts +12 -66
  277. package/dist/lab/run-lab-options.js +58 -285
  278. package/dist/lab/summary.d.ts +15 -9
  279. package/dist/lab/summary.js +24 -17
  280. package/dist/lab/tasks.d.ts +15 -15
  281. package/dist/lab/tasks.js +14 -14
  282. package/dist/lab/types.d.ts +201 -195
  283. package/dist/lab/types.js +2 -0
  284. package/dist/lab/validation.d.ts +21 -21
  285. package/dist/lab/validation.js +61 -59
  286. package/dist/lab/warnings.d.ts +10 -0
  287. package/dist/lab/warnings.js +70 -41
  288. package/dist/library-aliases.d.ts +56 -0
  289. package/dist/library-aliases.js +22 -0
  290. package/dist/observer/artifact.d.ts +2 -2
  291. package/dist/observer/artifact.js +9 -9
  292. package/dist/observer/data.d.ts +6 -6
  293. package/dist/observer/data.js +7 -6
  294. package/dist/observer/exposure.d.ts +1 -1
  295. package/dist/observer/exposure.js +11 -11
  296. package/dist/observer/http.js +1 -1
  297. package/dist/observer/library.d.ts +1 -1
  298. package/dist/observer/library.js +4 -2
  299. package/dist/observer/listen.js +5 -4
  300. package/dist/observer/render.d.ts +1 -1
  301. package/dist/observer/render.js +12 -7
  302. package/dist/observer/run-routes.d.ts +4 -4
  303. package/dist/observer/run-routes.js +6 -6
  304. package/dist/observer/serve.d.ts +17 -0
  305. package/dist/observer/serve.js +41 -6
  306. package/dist/observer/tunnel.js +1 -1
  307. package/dist/observer-app.html +4 -4
  308. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  309. package/dist/routes/computer-use/bundle-parts.js +24 -17
  310. package/dist/routes/computer-use/bundle.d.ts +4 -11
  311. package/dist/routes/computer-use/bundle.js +12 -18
  312. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  313. package/dist/routes/computer-use/diagnostics.js +1 -1
  314. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
  315. package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
  316. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  317. package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
  318. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
  319. package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
  320. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  321. package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
  322. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  323. package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
  324. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  325. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  326. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  327. package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
  328. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  329. package/dist/routes/computer-use/external-comms.js +19 -43
  330. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  331. package/dist/routes/computer-use/fanout-bundle.js +38 -42
  332. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
  333. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  334. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  335. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  336. package/dist/routes/computer-use/live-flush.js +20 -28
  337. package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
  338. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
  339. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  340. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  341. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  342. package/dist/routes/computer-use/local-vm.js +40 -67
  343. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  344. package/dist/routes/computer-use/participant-desktop.js +5 -25
  345. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
  346. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
  347. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  348. package/dist/routes/computer-use/participant-facts.js +12 -1
  349. package/dist/routes/computer-use/participant-model.d.ts +25 -11
  350. package/dist/routes/computer-use/participant-model.js +76 -34
  351. package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
  352. package/dist/routes/computer-use/participant-prompt.js +8 -8
  353. package/dist/routes/computer-use/participant-runs.d.ts +11 -11
  354. package/dist/routes/computer-use/participant-runs.js +18 -18
  355. package/dist/routes/computer-use/plan.d.ts +21 -29
  356. package/dist/routes/computer-use/plan.js +70 -78
  357. package/dist/routes/computer-use/preflight.d.ts +3 -5
  358. package/dist/routes/computer-use/preflight.js +40 -36
  359. package/dist/routes/computer-use/rerun-selection.js +11 -7
  360. package/dist/routes/computer-use/result.d.ts +1 -1
  361. package/dist/routes/computer-use/result.js +48 -38
  362. package/dist/routes/computer-use/route.d.ts +5 -5
  363. package/dist/routes/computer-use/route.js +36 -33
  364. package/dist/routes/computer-use/self-report.d.ts +8 -8
  365. package/dist/routes/computer-use/self-report.js +33 -33
  366. package/dist/routes/computer-use/setup.d.ts +9 -15
  367. package/dist/routes/computer-use/setup.js +106 -83
  368. package/dist/routes/computer-use/single-bundle.d.ts +13 -16
  369. package/dist/routes/computer-use/single-bundle.js +46 -53
  370. package/dist/routes/computer-use/subject-projection.d.ts +6 -8
  371. package/dist/routes/computer-use/subject-projection.js +24 -23
  372. package/dist/routes/computer-use/types.d.ts +195 -238
  373. package/dist/routes/computer-use/types.js +21 -13
  374. package/dist/routes/preview.d.ts +8 -2
  375. package/dist/routes/preview.js +8 -5
  376. package/dist/routes/scripted/bundle.d.ts +5 -8
  377. package/dist/routes/scripted/bundle.js +23 -27
  378. package/dist/routes/scripted/plan.d.ts +6 -8
  379. package/dist/routes/scripted/plan.js +15 -13
  380. package/dist/routes/scripted/result.d.ts +4 -1
  381. package/dist/routes/scripted/result.js +15 -11
  382. package/dist/routes/scripted/route.js +15 -17
  383. package/dist/routes/scripted/scenario.d.ts +1 -1
  384. package/dist/routes/scripted/scenario.js +3 -3
  385. package/dist/routes/scripted/setup.d.ts +3 -2
  386. package/dist/routes/scripted/setup.js +27 -26
  387. package/dist/routes/scripted/subject.d.ts +8 -3
  388. package/dist/routes/scripted/subject.js +10 -6
  389. package/dist/routes/scripted/surface-records.js +4 -4
  390. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  391. package/dist/routes/scripted/surface-sessions.js +4 -4
  392. package/dist/routes/scripted/types.d.ts +21 -40
  393. package/dist/routes/scripted/types.js +2 -3
  394. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
  395. package/dist/routes/shared-world/bundle.d.ts +7 -7
  396. package/dist/routes/shared-world/bundle.js +60 -62
  397. package/dist/routes/shared-world/checkpoints.d.ts +5 -5
  398. package/dist/routes/shared-world/checkpoints.js +5 -5
  399. package/dist/routes/shared-world/comms.d.ts +8 -7
  400. package/dist/routes/shared-world/comms.js +38 -51
  401. package/dist/routes/shared-world/external-public.d.ts +6 -5
  402. package/dist/routes/shared-world/external-public.js +28 -25
  403. package/dist/routes/shared-world/handoff.d.ts +10 -9
  404. package/dist/routes/shared-world/handoff.js +89 -81
  405. package/dist/routes/shared-world/lobby-code.d.ts +7 -7
  406. package/dist/routes/shared-world/lobby-code.js +22 -22
  407. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
  408. package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
  409. package/dist/routes/shared-world/plan.d.ts +2 -6
  410. package/dist/routes/shared-world/plan.js +8 -9
  411. package/dist/routes/shared-world/provenance.d.ts +4 -4
  412. package/dist/routes/shared-world/provenance.js +4 -4
  413. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  414. package/dist/routes/shared-world/provisioned.js +55 -48
  415. package/dist/routes/shared-world/result.js +47 -36
  416. package/dist/routes/shared-world/route.js +54 -57
  417. package/dist/routes/shared-world/setup.d.ts +6 -5
  418. package/dist/routes/shared-world/setup.js +16 -18
  419. package/dist/routes/shared-world/types.d.ts +70 -141
  420. package/dist/routes/shared-world/types.js +5 -5
  421. package/dist/routes/terminal/adapter.d.ts +10 -10
  422. package/dist/routes/terminal/adapter.js +32 -129
  423. package/dist/routes/terminal/bundle.d.ts +10 -15
  424. package/dist/routes/terminal/bundle.js +43 -52
  425. package/dist/routes/terminal/credentials.d.ts +4 -4
  426. package/dist/routes/terminal/credentials.js +20 -20
  427. package/dist/routes/terminal/dry-run.d.ts +1 -1
  428. package/dist/routes/terminal/dry-run.js +13 -15
  429. package/dist/routes/terminal/encoding.d.ts +1 -1
  430. package/dist/routes/terminal/encoding.js +4 -4
  431. package/dist/routes/terminal/ledger.d.ts +8 -8
  432. package/dist/routes/terminal/ledger.js +22 -22
  433. package/dist/routes/terminal/live-finish.d.ts +1 -2
  434. package/dist/routes/terminal/live-finish.js +24 -23
  435. package/dist/routes/terminal/live-sandbox.d.ts +3 -2
  436. package/dist/routes/terminal/live-sandbox.js +31 -32
  437. package/dist/routes/terminal/participant-text.d.ts +23 -0
  438. package/dist/routes/terminal/participant-text.js +165 -0
  439. package/dist/routes/terminal/persona.js +1 -1
  440. package/dist/routes/terminal/plan.d.ts +2 -6
  441. package/dist/routes/terminal/plan.js +23 -19
  442. package/dist/routes/terminal/recorder.d.ts +6 -1
  443. package/dist/routes/terminal/recorder.js +12 -4
  444. package/dist/routes/terminal/result.js +12 -12
  445. package/dist/routes/terminal/route.js +30 -31
  446. package/dist/routes/terminal/runtime.d.ts +3 -2
  447. package/dist/routes/terminal/runtime.js +3 -3
  448. package/dist/routes/terminal/sandbox.d.ts +4 -4
  449. package/dist/routes/terminal/sandbox.js +10 -10
  450. package/dist/routes/terminal/session.js +22 -19
  451. package/dist/routes/terminal/token-usage.d.ts +1 -1
  452. package/dist/routes/terminal/token-usage.js +10 -11
  453. package/dist/routes/terminal/trace.d.ts +7 -10
  454. package/dist/routes/terminal/trace.js +11 -66
  455. package/dist/routes/terminal/types.d.ts +104 -114
  456. package/dist/routes/terminal/types.js +12 -7
  457. package/dist/run/active-runs.d.ts +13 -0
  458. package/dist/run/active-runs.js +12 -0
  459. package/dist/run/bundle-shape.d.ts +2 -1
  460. package/dist/run/bundle-shape.js +7 -7
  461. package/dist/run/bundle.d.ts +99 -92
  462. package/dist/run/bundle.js +10 -8
  463. package/dist/run/cost-summary.js +6 -5
  464. package/dist/run/costs.d.ts +6 -6
  465. package/dist/run/costs.js +17 -11
  466. package/dist/run/detail.d.ts +9 -9
  467. package/dist/run/detail.js +10 -10
  468. package/dist/run/dry-run-inputs.js +1 -1
  469. package/dist/run/dry-run.js +23 -30
  470. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  471. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  472. package/dist/run/feedback-shape.js +1 -1
  473. package/dist/run/judge.d.ts +34 -16
  474. package/dist/run/judge.js +41 -14
  475. package/dist/run/locate.d.ts +2 -0
  476. package/dist/run/locate.js +3 -1
  477. package/dist/run/outcomes.d.ts +3 -3
  478. package/dist/run/outcomes.js +3 -3
  479. package/dist/run/participant-records.d.ts +2 -2
  480. package/dist/run/participant-records.js +2 -2
  481. package/dist/run/paths.d.ts +1 -1
  482. package/dist/run/paths.js +2 -2
  483. package/dist/run/pricing.d.ts +30 -15
  484. package/dist/run/pricing.js +49 -30
  485. package/dist/run/projection.d.ts +27 -27
  486. package/dist/run/projection.js +23 -23
  487. package/dist/run/reclaim.d.ts +6 -0
  488. package/dist/run/reclaim.js +15 -5
  489. package/dist/run/results.d.ts +5 -5
  490. package/dist/run/run-index.d.ts +9 -7
  491. package/dist/run/run-index.js +24 -25
  492. package/dist/run/run-not-found.d.ts +5 -0
  493. package/dist/run/run-not-found.js +15 -0
  494. package/dist/run/run.d.ts +7 -4
  495. package/dist/run/run.js +10 -6
  496. package/dist/run/sandbox-receipts.d.ts +5 -5
  497. package/dist/run/sandbox-receipts.js +6 -6
  498. package/dist/run/shared-world-evidence.d.ts +67 -66
  499. package/dist/run/shared-world-evidence.js +4 -4
  500. package/dist/run/shared-world-shape.d.ts +3 -3
  501. package/dist/run/shared-world-shape.js +16 -16
  502. package/dist/run/stats.d.ts +17 -11
  503. package/dist/run/stats.js +124 -66
  504. package/dist/run/status.d.ts +21 -32
  505. package/dist/run/status.js +34 -33
  506. package/dist/run/stored-runs.js +2 -1
  507. package/dist/run/stream-shape.js +1 -1
  508. package/dist/run/streams.d.ts +29 -22
  509. package/dist/run/study-provenance.d.ts +47 -0
  510. package/dist/run/study-provenance.js +63 -0
  511. package/dist/run/study-result.d.ts +16 -0
  512. package/dist/run/study-result.js +9 -0
  513. package/dist/run/terminal-contract.d.ts +5 -5
  514. package/dist/run/terminal-contract.js +4 -4
  515. package/dist/run/text.d.ts +2 -0
  516. package/dist/run/text.js +4 -0
  517. package/dist/run/transient-comms-secrets.d.ts +5 -0
  518. package/dist/run/transient-comms-secrets.js +12 -0
  519. package/dist/run-lab.d.ts +40 -38
  520. package/dist/run-lab.js +42 -40
  521. package/dist/study/convert.d.ts +33 -0
  522. package/dist/study/convert.js +432 -0
  523. package/dist/study/field-paths.d.ts +12 -0
  524. package/dist/study/field-paths.js +126 -0
  525. package/dist/study/files.d.ts +26 -0
  526. package/dist/study/files.js +43 -0
  527. package/dist/study/migrate.d.ts +48 -0
  528. package/dist/study/migrate.js +408 -0
  529. package/dist/study/owned-files.d.ts +38 -0
  530. package/dist/study/owned-files.js +182 -0
  531. package/dist/subject/clone.d.ts +1 -1
  532. package/dist/subject/desktop-cli.d.ts +2 -2
  533. package/dist/subject/desktop-cli.js +3 -3
  534. package/dist/subject/local-tree-archive.d.ts +1 -1
  535. package/dist/subject/local-tree-archive.js +5 -5
  536. package/dist/subject/local-tree.d.ts +3 -3
  537. package/dist/subject/local-tree.js +1 -1
  538. package/dist/subject/node-bootstrap.d.ts +1 -1
  539. package/dist/subject/node-bootstrap.js +4 -4
  540. package/dist/subject/runtime.js +10 -11
  541. package/dist/subject/serve.d.ts +1 -1
  542. package/dist/subject/serve.js +4 -4
  543. package/dist/subject/state.d.ts +1 -1
  544. package/dist/subject/steps.d.ts +8 -8
  545. package/dist/subject/steps.js +7 -7
  546. package/dist/substrates/command-failure.d.ts +3 -3
  547. package/dist/substrates/command-failure.js +3 -3
  548. package/dist/substrates/detached.d.ts +6 -6
  549. package/dist/substrates/detached.js +7 -7
  550. package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
  551. package/dist/substrates/e2b/cdp-probe.js +15 -18
  552. package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
  553. package/dist/substrates/e2b/desktop-browser.js +12 -12
  554. package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
  555. package/dist/substrates/e2b/desktop-cdp.js +11 -11
  556. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  557. package/dist/substrates/e2b/desktop-executor.js +1 -1
  558. package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
  559. package/dist/substrates/e2b/desktop-geometry.js +9 -9
  560. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  561. package/dist/substrates/e2b/desktop-media.js +3 -3
  562. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  563. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  564. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  565. package/dist/substrates/e2b/sandbox.js +2 -2
  566. package/dist/substrates/e2b/sdk.d.ts +11 -11
  567. package/dist/substrates/e2b/sdk.js +8 -8
  568. package/dist/substrates/local/runtime-host.d.ts +2 -0
  569. package/dist/substrates/local/runtime-host.js +6 -0
  570. package/dist/tui/actions.d.ts +8 -6
  571. package/dist/tui/actions.js +31 -22
  572. package/dist/tui/contract.d.ts +16 -16
  573. package/dist/tui/contract.js +10 -10
  574. package/dist/tui/launch.d.ts +4 -4
  575. package/dist/tui/launch.js +18 -19
  576. package/dist/tui/project.js +5 -5
  577. package/dist/tui-app.js +83 -83
  578. package/dist/verify/actor.d.ts +14 -14
  579. package/dist/verify/actor.js +45 -45
  580. package/dist/verify/artifacts.d.ts +3 -3
  581. package/dist/verify/artifacts.js +6 -6
  582. package/dist/verify/context-growth.d.ts +9 -0
  583. package/dist/verify/context-growth.js +62 -0
  584. package/dist/verify/costs.d.ts +7 -7
  585. package/dist/verify/costs.js +9 -9
  586. package/dist/verify/liveness.d.ts +1 -1
  587. package/dist/verify/liveness.js +4 -1
  588. package/dist/verify/rerun.d.ts +1 -1
  589. package/dist/verify/rerun.js +1 -1
  590. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  591. package/dist/verify/shared-world-concurrent.js +79 -76
  592. package/dist/verify/shared-world.d.ts +2 -2
  593. package/dist/verify/shared-world.js +18 -18
  594. package/dist/verify/subject.d.ts +4 -4
  595. package/dist/verify/subject.js +18 -18
  596. package/dist/verify/verify.js +98 -49
  597. package/docs/README.md +26 -33
  598. package/docs/architecture/actor-contract.md +105 -98
  599. package/docs/architecture/desktop-sessions.md +14 -14
  600. package/docs/architecture/external-public-shared-world.md +66 -59
  601. package/docs/architecture/github-feedback-loop.md +1 -4
  602. package/docs/architecture/guest-desktop.md +2 -2
  603. package/docs/architecture/observer.md +37 -37
  604. package/docs/architecture/restricted-codex-analysis.md +70 -30
  605. package/docs/architecture/serve.md +34 -37
  606. package/docs/architecture/state-driven-executor.md +55 -59
  607. package/docs/architecture/task-protocol-support.md +7 -9
  608. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
  609. package/docs/contracts/README.md +24 -0
  610. package/docs/contracts/adapter-admission.md +3 -3
  611. package/docs/contracts/adapter-fixtures.md +2 -5
  612. package/docs/contracts/core.md +1 -3
  613. package/docs/contracts/errors.md +62 -0
  614. package/docs/contracts/feedback.md +8 -9
  615. package/docs/contracts/policy.md +7 -12
  616. package/docs/contracts/run-bundle.md +54 -51
  617. package/docs/contracts/schemas.md +505 -390
  618. package/docs/contracts/study-analysis.md +26 -2
  619. package/docs/contracts/study-costs.md +11 -7
  620. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  621. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  622. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  623. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  624. package/docs/principles/actor-fidelity.md +4 -4
  625. package/docs/principles/engineering.md +3 -3
  626. package/docs/principles/invariants-and-defaults.md +38 -38
  627. package/docs/principles/self-driving-harness.md +1 -5
  628. package/docs/principles/three-roles.md +1 -1
  629. package/docs/product/automatic-analysis.md +8 -7
  630. package/examples/participant/README.md +5 -5
  631. package/examples/participant/run.mjs +11 -10
  632. package/examples/scorer/README.md +3 -3
  633. package/examples/scorer/run.mjs +11 -12
  634. package/package.json +16 -17
  635. package/skills/humanish/SKILL.md +63 -60
  636. package/skills/humanish/agents/openai.yaml +1 -1
  637. package/AGENTS.md +0 -99
  638. package/CONTRIBUTING.md +0 -148
  639. package/dist/actors/codex/qualified-versions.d.ts +0 -45
  640. package/dist/actors/codex/qualified-versions.js +0 -87
  641. package/dist/cli/commands/lab.d.ts +0 -3
  642. package/dist/cli/commands/lab.js +0 -193
  643. package/dist/deprecated.d.ts +0 -90
  644. package/dist/deprecated.js +0 -106
  645. package/dist/lab/bag-overrides.d.ts +0 -18
  646. package/dist/lab/bag-overrides.js +0 -121
  647. package/dist/observer/static.d.ts +0 -39
  648. package/dist/observer/static.js +0 -369
  649. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  650. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  651. package/docs/architecture/comms-inbox.md +0 -122
  652. package/docs/architecture/desktop-recording.md +0 -80
  653. package/docs/architecture/local-browser-runtime.md +0 -178
  654. package/docs/architecture/observer-review.md +0 -144
  655. package/docs/architecture/participant-media.md +0 -90
  656. package/docs/architecture/project-layout.md +0 -62
  657. package/docs/architecture/real-email-receiving.md +0 -136
  658. package/docs/assets/humanish-drawdb-hero.png +0 -0
  659. package/docs/assets/humanish-observer-hero.png +0 -0
  660. package/docs/goals/current.md +0 -207
  661. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  662. package/docs/product/open-source-install-experience.md +0 -240
  663. package/docs/ramp/README.md +0 -294
  664. package/docs/release/open-source-readiness.md +0 -222
  665. package/docs/release/public-readiness-standard.md +0 -210
  666. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  667. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  668. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -4,7 +4,7 @@ import type { LabActor } from "./types.js";
4
4
  /** Title-case an id for the fallback display name (`skeptical-power-user` -> `Skeptical Power User`). */
5
5
  export declare function personaTitleFromId(personaId: string): string;
6
6
  /**
7
- * Resolve ONE persona from `humanish/personas/`, then the ignored `.humanish/local/personas/`.
7
+ * Resolve one persona from `humanish/personas/`, then the ignored `.humanish/local/personas/`.
8
8
  * Returns `null` with a warning when the id is unsafe or no file exists. Invalid rich backgrounds
9
9
  * reject the study before execution.
10
10
  */
@@ -13,8 +13,8 @@ export declare function resolveCommittedPersona(projectRoot: PreparedSelectedOut
13
13
  warnings: string[];
14
14
  }>;
15
15
  /**
16
- * Resolve every distinct persona id a run will use, once, before lane specs are built. Returning a
17
- * map keeps the plan builder PURE (it is exported npm surface and asserted pure by tests): the
16
+ * Resolve every distinct persona id a run will use, once, before participant specs are built. Returning a
17
+ * map keeps the plan builder pure (it is exported npm surface and asserted pure by tests): the
18
18
  * async file reads happen here, and the composer only does a lookup.
19
19
  */
20
20
  export declare function resolveCommittedPersonas(projectRoot: PreparedSelectedOutputDirectory, personaIds: readonly (string | undefined)[]): Promise<{
@@ -22,16 +22,16 @@ export declare function resolveCommittedPersonas(projectRoot: PreparedSelectedOu
22
22
  warnings: string[];
23
23
  }>;
24
24
  /**
25
- * Every persona id a lab config could put on a browser lane: the per-lane roster when one is
26
- * declared, otherwise the actor-level persona that every fan-out lane inherits.
25
+ * Every persona id a lab config could put on a browser participant: the roster when one is
26
+ * declared, otherwise the actor-level persona that every fan-out participant inherits.
27
27
  */
28
28
  export declare function labPersonaIds(config: {
29
29
  actors?: readonly Pick<LabActor, "persona" | "lanes">[];
30
30
  }): string[];
31
31
  /**
32
32
  * Same resolution from a plain cwd, for the labs that carry a directory string rather than an
33
- * already-prepared root. Realpath-then-prepare mirrors the cua lab so a symlinked cwd still reads
34
- * personas from the physical project.
33
+ * already-prepared root. Realpath-then-prepare mirrors the computer-use route so a symlinked cwd
34
+ * still reads personas from the physical project.
35
35
  */
36
36
  export declare function resolveCommittedPersonasForCwd(cwd: string, personaIds: readonly (string | undefined)[]): Promise<{
37
37
  personas: Map<string, ResolvedPersona>;
@@ -6,7 +6,7 @@ import { prepareSelectedOutputDirectory, readContainedRegularFile, } from "../ru
6
6
  import { digestText, redactText } from "../evidence/redaction.js";
7
7
  import { realpath } from "node:fs/promises";
8
8
  import { rosterOf } from "./parse/actors.js";
9
- /** Persona ids are file-name segments, never paths: the same grammar the terminal lane enforces. */
9
+ /** Persona ids are file-name segments, never paths: the same grammar the terminal route enforces. */
10
10
  const PERSONA_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_-]*$/;
11
11
  /** Title-case an id for the fallback display name (`skeptical-power-user` -> `Skeptical Power User`). */
12
12
  export function personaTitleFromId(personaId) {
@@ -22,7 +22,7 @@ const PERSONA_DIRECTORIES = [
22
22
  path.posix.join(".humanish", "local", "personas"),
23
23
  ];
24
24
  /**
25
- * Resolve ONE persona from `humanish/personas/`, then the ignored `.humanish/local/personas/`.
25
+ * Resolve one persona from `humanish/personas/`, then the ignored `.humanish/local/personas/`.
26
26
  * Returns `null` with a warning when the id is unsafe or no file exists. Invalid rich backgrounds
27
27
  * reject the study before execution.
28
28
  */
@@ -65,8 +65,8 @@ export async function resolveCommittedPersona(projectRoot, personaId) {
65
65
  };
66
66
  }
67
67
  /**
68
- * Resolve every distinct persona id a run will use, once, before lane specs are built. Returning a
69
- * map keeps the plan builder PURE (it is exported npm surface and asserted pure by tests): the
68
+ * Resolve every distinct persona id a run will use, once, before participant specs are built. Returning a
69
+ * map keeps the plan builder pure (it is exported npm surface and asserted pure by tests): the
70
70
  * async file reads happen here, and the composer only does a lookup.
71
71
  */
72
72
  export async function resolveCommittedPersonas(projectRoot, personaIds) {
@@ -81,8 +81,8 @@ export async function resolveCommittedPersonas(projectRoot, personaIds) {
81
81
  return { personas, warnings };
82
82
  }
83
83
  /**
84
- * Every persona id a lab config could put on a browser lane: the per-lane roster when one is
85
- * declared, otherwise the actor-level persona that every fan-out lane inherits.
84
+ * Every persona id a lab config could put on a browser participant: the roster when one is
85
+ * declared, otherwise the actor-level persona that every fan-out participant inherits.
86
86
  */
87
87
  export function labPersonaIds(config) {
88
88
  const ids = [];
@@ -98,8 +98,8 @@ export function labPersonaIds(config) {
98
98
  }
99
99
  /**
100
100
  * Same resolution from a plain cwd, for the labs that carry a directory string rather than an
101
- * already-prepared root. Realpath-then-prepare mirrors the cua lab so a symlinked cwd still reads
102
- * personas from the physical project.
101
+ * already-prepared root. Realpath-then-prepare mirrors the computer-use route so a symlinked cwd
102
+ * still reads personas from the physical project.
103
103
  */
104
104
  export async function resolveCommittedPersonasForCwd(cwd, personaIds) {
105
105
  try {
@@ -1,4 +1,5 @@
1
1
  import { digestText, redactText } from "../evidence/redaction.js";
2
+ import { isRecord } from "../run/type-guards.js";
2
3
  export const PERSONA_BACKGROUND_MAX_BYTES = 32 * 1024;
3
4
  const PERSONA_COMPILER_VERSION = 2;
4
5
  export class PersonaConfigError extends Error {
@@ -18,9 +19,6 @@ const PERSONA_FIELDS = new Set([
18
19
  "constraints",
19
20
  ]);
20
21
  const TRAIT_FIELDS = new Set(["patience", "technical_confidence", "accessibility_needs"]);
21
- function isRecord(value) {
22
- return typeof value === "object" && value !== null && !Array.isArray(value);
23
- }
24
22
  function cleanText(value) {
25
23
  return value
26
24
  .replace(/\r\n?/g, "\n")
@@ -1,4 +1,3 @@
1
- import type { RunLabProvenance } from "../run/status.js";
2
1
  import type { Brain, ComputerUsePlan, NonEmpty, PlannedAnalysis, ProvisionedSubject, Requirement } from "./plan-types.js";
3
2
  import type { LabConfig } from "./types.js";
4
3
  export type Base = Omit<ComputerUsePlan, "route" | "actor" | "runner" | "concurrency" | "sessionBudgetMs" | "sandboxMs" | "caps" | "rerun">;
@@ -22,7 +21,6 @@ export declare function pricedModel(brain: Brain): string;
22
21
  /** The fields every plan shares, from a config whose analysis already resolved. */
23
22
  export declare function planBase(config: LabConfig, input: {
24
23
  readonly dryRun: boolean;
25
- readonly lab?: RunLabProvenance;
26
24
  readonly analysis?: {
27
25
  readonly config?: PlannedAnalysis["config"] | undefined;
28
26
  readonly preferLargerOutput?: boolean | undefined;
@@ -1,10 +1,13 @@
1
1
  // What every route planner shares: the plan fields common to all routes, the frozen residual config,
2
2
  // and the requirement and subject helpers.
3
3
  import { DEFAULT_OPENAI_CU_MODEL } from "../actors/computer-use/openai-provider.js";
4
- function deepFreeze(value) {
5
- if (typeof value === "object" && value !== null) {
4
+ // A YAML alias can make a parsed record contain itself (an inline persona that names its own
5
+ // anchor), and structuredClone keeps the cycle, so each object is frozen once.
6
+ function deepFreeze(value, frozen = new WeakSet()) {
7
+ if (typeof value === "object" && value !== null && !frozen.has(value)) {
8
+ frozen.add(value);
6
9
  for (const child of Object.values(value))
7
- deepFreeze(child);
10
+ deepFreeze(child, frozen);
8
11
  Object.freeze(value);
9
12
  }
10
13
  return value;
@@ -109,7 +112,6 @@ export function planBase(config, input) {
109
112
  return {
110
113
  labId: config.id,
111
114
  ...(config.title === undefined ? {} : { title: config.title }),
112
- ...(input.lab === undefined ? {} : { lab: input.lab }),
113
115
  residual: residualOf(config),
114
116
  dryRun: input.dryRun,
115
117
  ...(analysis === undefined
@@ -5,7 +5,7 @@ import type { LabTask } from "./tasks.js";
5
5
  import type { LabConfig } from "./types.js";
6
6
  /** Who one participant is. Every route with participants carries this record. */
7
7
  export interface Participant {
8
- /** Declared roster id, else `lane-NN` (independent lanes) or `role-NN` (shared-world seats). */
8
+ /** Declared roster id, else `lane-NN` (independent participants) or `role-NN` (shared-world participants). */
9
9
  readonly id: string;
10
10
  /** 0-based position in the roster. Bundle `sim-NNN` and `stream-NNN` ids derive from it. */
11
11
  readonly index: number;
@@ -30,7 +30,7 @@ interface DesktopParticipant extends Participant {
30
30
  readonly preset: DevicePreset;
31
31
  readonly resolution: [number, number];
32
32
  };
33
- /** Lane value, else actor value, else absent (the provider default is recorded in the trace). */
33
+ /** The `lanes[]` entry's value, else actor value, else absent (the provider default is recorded in the trace). */
34
34
  readonly limits: {
35
35
  readonly stopWhen?: StopWhen;
36
36
  readonly dwell?: DwellWindow;
@@ -38,20 +38,20 @@ interface DesktopParticipant extends Participant {
38
38
  readonly maxOutputTokens?: number;
39
39
  };
40
40
  }
41
- /** Only independent computer-use lanes consume a task protocol and a per-lane target. */
41
+ /** Only independent computer-use participants consume a task protocol and their own target. */
42
42
  export interface ComputerUseParticipant extends DesktopParticipant {
43
43
  readonly tasks?: readonly LabTask[];
44
- /** app-url fan-out only: this lane's own entry URL; absent means the subject URL. */
44
+ /** app-url fan-out only: this participant's own entry URL; absent means the subject URL. */
45
45
  readonly targetUrl?: string;
46
46
  }
47
- /** A seat on a provisioned plane: an optional same-origin path under `serve.url`. */
47
+ /** A participant on a provisioned plane: an optional same-origin path under `serve.url`. */
48
48
  export interface ProvisionedParticipant extends DesktopParticipant {
49
49
  readonly entry?: string;
50
50
  readonly host?: never;
51
51
  readonly tasks?: never;
52
52
  readonly targetUrl?: never;
53
53
  }
54
- /** A seat on an external public plane: exactly one seat hosts the shared session. */
54
+ /** A participant on an external public plane: exactly one participant hosts the shared session. */
55
55
  export interface ExternalPublicParticipant extends DesktopParticipant {
56
56
  readonly host: boolean;
57
57
  readonly entry?: never;
@@ -68,7 +68,7 @@ export type SharedWorldRoster = {
68
68
  /** One shared-world participant on either plane. */
69
69
  export type SharedWorldParticipant = ProvisionedParticipant | ExternalPublicParticipant;
70
70
  /**
71
- * The lanes of a computer-use lab: the declared roster, else `count` identical lanes. A count
71
+ * The participants of a computer-use lab: the declared roster, else `count` identical ones. A count
72
72
  * override (`--count`) applies only when no roster is declared.
73
73
  */
74
74
  export declare function computerUseParticipants(config: LabConfig, countOverride?: number): ComputerUseParticipant[];
@@ -1,5 +1,5 @@
1
1
  // Who takes part in a lab: one record per participant, built from the declared roster or a count.
2
- // Computer-use lanes and shared-world seats share the desktop fields; each kind adds its own.
2
+ // Computer-use and shared-world participants share the desktop fields; each kind adds its own.
3
3
  import { resolveParticipantDevice } from "./device-presets.js";
4
4
  import { isSharedWorldComposition, participantIdAt } from "./routing.js";
5
5
  import { focusOf, rosterOf } from "./parse/actors.js";
@@ -35,7 +35,7 @@ function desktopParticipant(config, entry, index, kind, focus) {
35
35
  };
36
36
  }
37
37
  /**
38
- * The lanes of a computer-use lab: the declared roster, else `count` identical lanes. A count
38
+ * The participants of a computer-use lab: the declared roster, else `count` identical ones. A count
39
39
  * override (`--count`) applies only when no roster is declared.
40
40
  */
41
41
  export function computerUseParticipants(config, countOverride) {
@@ -4,14 +4,17 @@ 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
11
  import type { LabConfig, LabExecutionTerminal, LabRuntimeAuth, LabScenarioCaps, LabSubjectProduct, LabSubjectServe, LabSubjectState, LabSubjectStateCheckpoint } from "./types.js";
12
12
  export type NonEmpty<T> = readonly [T, ...T[]];
13
13
  type AtLeastTwo<T> = readonly [T, T, ...T[]];
14
- /** Something a route checks right before acquisition. Doctor, the TUI and preflight list the same set. */
14
+ /**
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.
17
+ */
15
18
  export type Requirement = {
16
19
  readonly kind: "key";
17
20
  readonly name: "OPENAI_API_KEY" | "E2B_API_KEY";
@@ -39,7 +42,12 @@ export type Requirement = {
39
42
  readonly kind: "external-catch";
40
43
  readonly url: string;
41
44
  };
42
- /** Config fields no plan field decides. Routes read nothing else from the config. */
45
+ /**
46
+ * Config fields no plan field decides. After admission, computer use reads the config only to pass
47
+ * it to the caller's createProvider and inProcess executor; its planner, refusal envelopes and local
48
+ * VM study read it before a plan exists. Shared world, terminal and scripted still read some config
49
+ * fields at run time.
50
+ */
43
51
  export type ResidualConfig = Pick<LabConfig, "comms" | "policies" | "personas" | "defaults" | "review"> & {
44
52
  readonly execution?: Pick<NonNullable<LabConfig["execution"]>, "desktop" | "target">;
45
53
  readonly subject: Pick<LabConfig["subject"], "clone" | "localTree" | "repos" | "envValues">;
@@ -54,7 +62,7 @@ interface PlanBase {
54
62
  readonly labId: string;
55
63
  /** The lab's declared title, which bundles record. */
56
64
  readonly title?: string;
57
- readonly lab?: RunLabProvenance;
65
+ readonly lab?: RunStudyProvenance;
58
66
  /** A frozen copy owned by the plan. */
59
67
  readonly residual: Readonly<ResidualConfig>;
60
68
  readonly dryRun: boolean;
@@ -74,7 +82,7 @@ interface PreviewPlan extends PlanBase {
74
82
  readonly participantCount: number;
75
83
  }
76
84
  /**
77
- * The model driving a desktop participant. `caller` is the library caller's buildProvider.
85
+ * The model driving a desktop participant. `caller` is the library caller's createProvider.
78
86
  * `declaredModel` is actors[0].model as the lab wrote it, absent when undeclared: the providers
79
87
  * take it as written, and spend is priced at it, else the default (pricedModel). An openai
80
88
  * brain's `model` is the one its provider runs, with that default applied.
@@ -107,6 +115,11 @@ export interface AppUrlSubject {
107
115
  readonly kind: "app-url";
108
116
  readonly appUrl: string;
109
117
  readonly publicTargets: boolean;
118
+ /**
119
+ * A `subject.serve.url` declared on this subject, which the parser refuses and only a library
120
+ * config can carry. Participants map links to it back to their own app.
121
+ */
122
+ readonly serveUrl?: string;
110
123
  }
111
124
  /**
112
125
  * Supported subject and desktop pairings. The local VM also takes public targets: the route runs
@@ -119,6 +132,8 @@ export type ComputerUseRunner = {
119
132
  readonly subject: AppUrlSubject | ProvisionedSubject | {
120
133
  readonly kind: "desktop-cli";
121
134
  readonly product: LabSubjectProduct;
135
+ /** As on AppUrlSubject: a library config's declared `subject.serve.url`. */
136
+ readonly serveUrl?: string;
122
137
  };
123
138
  } | {
124
139
  readonly desktop: "local-vm";
@@ -179,7 +194,7 @@ export interface SharedWorldPlan extends PlanBase {
179
194
  readonly plane: SharedWorldPlane;
180
195
  /** At least 2. */
181
196
  readonly concurrency: number;
182
- /** The declared seat session timeout; the route supplies its default. */
197
+ /** The declared participant session timeout; the route supplies its default. */
183
198
  readonly sessionTimeoutMs?: number;
184
199
  readonly brain: Extract<Brain, {
185
200
  kind: "openai" | "local-agent";
@@ -201,7 +216,10 @@ export type TerminalPlan = PlanBase & {
201
216
  readonly mission?: string;
202
217
  readonly runtime: {
203
218
  readonly version?: string;
204
- readonly model?: string;
219
+ /** Passed to Codex as `--model` on every run, so the bundle can name and price it. */
220
+ readonly model: string;
221
+ /** `declared` by the lab's actor, or humanish's participant default. */
222
+ readonly modelSource: "declared" | "humanish_default";
205
223
  readonly reasoningEffort?: ReasoningEffort;
206
224
  readonly auth?: LabRuntimeAuth;
207
225
  };
@@ -264,7 +282,7 @@ export type RoutePlanResult<Plan, Refusal> = {
264
282
  readonly refusal: Refusal;
265
283
  };
266
284
  /** The error codes the preview route returns before a run starts. */
267
- 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";
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";
268
286
  /** Why planLab refused: the route's own code and message, as its runner returns them. */
269
287
  export type PlanRefusal = RouteRefusal<"preview", PreviewRefusalCode> | TerminalRefusal | ScriptedRefusal | ComputerUseRefusal | SharedWorldRefusal;
270
288
  export type PlanResult = {
@@ -1,22 +1,8 @@
1
- import type { RunLabOptions } from "../run-lab.js";
1
+ import type { InternalRunLabOptions } from "../run-lab.js";
2
+ import type { LabDeps } from "./lab-deps.js";
2
3
  import type { PlanResult } from "./plan-types.js";
3
4
  import type { LabConfig } from "./types.js";
4
- /** The five execution paths a lab can take. */
5
- export type LabRoute = "preview" | "computer-use" | "shared-world" | "terminal" | "scripted";
6
- /** A route's older name, kept in `LabOutcome.backend` and the preflight result's `backend`. */
7
- export type LabBackend = "synthetic" | "cua" | "scripted" | "terminal" | "concurrent-shared-world";
8
- /** The backend name older callers and wire fields use for a route. */
9
- export declare function backendOf(route: LabRoute): LabBackend;
10
- /**
11
- * The backend a config runs on: `routeOf`, under its older name.
12
- * @deprecated Use `routeOf`, and `backendOf` for the older backend name. This goes in the next minor.
13
- */
14
- export declare function selectLabBackend(config: LabConfig): LabBackend;
15
- /**
16
- * The route a config takes. It never refuses: a config no route can run still gets the route
17
- * whose own checks refuse it with the most precise reason.
18
- */
19
- export declare function routeOf(config: LabConfig): LabRoute;
5
+ export { routeOf, type LabRoute } from "./routing.js";
20
6
  /** Resolve dry-run: explicit override wins, else the scenario mode, else the given fallback. */
21
7
  export declare function resolveLabDryRun(config: LabConfig, override: boolean | undefined, fallback: boolean | undefined): boolean | undefined;
22
8
  /**
@@ -24,4 +10,4 @@ export declare function resolveLabDryRun(config: LabConfig, override: boolean |
24
10
  * makes every refusal that route makes, in the route's order and with its codes and messages; the
25
11
  * route's exported runner calls the same planner.
26
12
  */
27
- export declare function planLab(config: LabConfig, options: RunLabOptions): PlanResult;
13
+ export declare function planLab(config: LabConfig, options: InternalRunLabOptions, deps?: LabDeps): PlanResult;
package/dist/lab/plan.js CHANGED
@@ -1,67 +1,17 @@
1
1
  // The route decision. A lab's route follows from its composition (subject.source,
2
- // execution.target, the first actor's registered lane, subject.topology), never from a declared
3
- // kind. This is the only function that decides it; backendOf maps its answer to the older
4
- // backend names.
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.
5
4
  import { resolveAutomaticAnalysis } from "../analysis/automatic-config.js";
6
- import { planComputerUseLab } from "../routes/computer-use/plan.js";
7
- import { planScriptedLab } from "../routes/scripted/plan.js";
5
+ import { callerDrivingOf, planComputerUseLab } from "../routes/computer-use/plan.js";
6
+ import { injectedBrowser, planScriptedLab } from "../routes/scripted/plan.js";
8
7
  import { planSharedWorldLab } from "../routes/shared-world/plan.js";
9
8
  import { planTerminalLab } from "../routes/terminal/plan.js";
10
9
  import { localBrowserDefaults } from "../substrates/local/runtime-config.js";
11
10
  import { THIS_REPO_DRY_RUN_ONLY } from "./composition-rules.js";
12
11
  import { planBase } from "./plan-base.js";
13
- import { isComputerUseComposition, isScriptedBrowserComposition, isSharedWorldComposition, isTerminalProductComposition, } from "./routing.js";
12
+ import { routeOf } from "./routing.js";
14
13
  import { automaticAnalysisRouteReason, taskProtocolValidationReason } from "./validation.js";
15
- const BACKENDS = {
16
- preview: "synthetic",
17
- "computer-use": "cua",
18
- "shared-world": "concurrent-shared-world",
19
- terminal: "terminal",
20
- scripted: "scripted",
21
- };
22
- /** The backend name older callers and wire fields use for a route. */
23
- export function backendOf(route) {
24
- return BACKENDS[route];
25
- }
26
- /**
27
- * The backend a config runs on: `routeOf`, under its older name.
28
- * @deprecated Use `routeOf`, and `backendOf` for the older backend name. This goes in the next minor.
29
- */
30
- export function selectLabBackend(config) {
31
- return backendOf(routeOf(config));
32
- }
33
- /**
34
- * The route a config takes. It never refuses: a config no route can run still gets the route
35
- * whose own checks refuse it with the most precise reason.
36
- */
37
- export function routeOf(config) {
38
- const source = config.subject.source;
39
- // A scripted-browser actor on a loopback app or a provisioned clone replays committed steps.
40
- if (isScriptedBrowserComposition(config))
41
- return "scripted";
42
- // A terminal-product subject goes to the terminal route even with an unregistered actor, so that
43
- // route refuses the actor instead of another route running something else.
44
- if (isTerminalProductComposition(config) || source === "terminal-product")
45
- return "terminal";
46
- // Checked before computer use: the same composition without the topology declaration runs as
47
- // independent lanes.
48
- if (isSharedWorldComposition(config))
49
- return "shared-world";
50
- // A CLI studied at a desktop is a computer-use study whose subject is a terminal window.
51
- if (source === "desktop-cli")
52
- return "computer-use";
53
- // Every other app-url, clone, local-app or local-tree config goes to computer use, including
54
- // ones with an unknown actor: that route refuses the actor, where the preview route would run
55
- // no participant at all.
56
- if (isComputerUseComposition(config) ||
57
- source === "app-url" ||
58
- source === "clone" ||
59
- source === "local-app" ||
60
- source === "local-tree")
61
- return "computer-use";
62
- // this-repo runs the synthetic preview.
63
- return "preview";
64
- }
14
+ export { routeOf } from "./routing.js";
65
15
  /** Resolve dry-run: explicit override wins, else the scenario mode, else the given fallback. */
66
16
  export function resolveLabDryRun(config, override, fallback) {
67
17
  if (override !== undefined) {
@@ -85,19 +35,19 @@ function planPreview(config, options, input) {
85
35
  refusal: { route: "preview", code, message },
86
36
  });
87
37
  if (String(config.comms?.email?.kind) === "real")
88
- return refuse("HUMANISH_LAB_COMMS_UNSUPPORTED", "Real email receiving is unsupported on the preview route. Use a supported hosted computer-use lab.");
38
+ return refuse("HUMANISH_STUDY_COMMS_UNSUPPORTED", "Real email receiving is unsupported on the preview route. Use a supported hosted computer-use lab.");
89
39
  const analysis = resolveAutomaticAnalysis(config.review?.analysis);
90
40
  if (!analysis.ok)
91
- return refuse("HUMANISH_LAB_ANALYSIS_INVALID", analysis.message);
41
+ return refuse("HUMANISH_STUDY_ANALYSIS_INVALID", analysis.message);
92
42
  const unsupported = automaticAnalysisRouteReason(config);
93
43
  if (unsupported)
94
- return refuse("HUMANISH_LAB_ANALYSIS_UNSUPPORTED", unsupported);
44
+ return refuse("HUMANISH_STUDY_ANALYSIS_UNSUPPORTED", unsupported);
95
45
  const tasksReason = taskProtocolValidationReason(config);
96
46
  if (tasksReason)
97
- return refuse("HUMANISH_LAB_TASKS_UNSUPPORTED", tasksReason);
47
+ return refuse("HUMANISH_STUDY_TASKS_UNSUPPORTED", tasksReason);
98
48
  const participantCount = options.count ?? config.actors[0]?.count ?? 4;
99
49
  if (!Number.isSafeInteger(participantCount) || participantCount < 1)
100
- return refuse("HUMANISH_INVALID_SIM_COUNT", "count must be a positive integer.");
50
+ return refuse("HUMANISH_INVALID_PARTICIPANT_COUNT", "count must be a positive integer.");
101
51
  if (!input.dryRun)
102
52
  return refuse("HUMANISH_LIVE_RUN_UNIMPLEMENTED", THIS_REPO_DRY_RUN_ONLY);
103
53
  return {
@@ -115,42 +65,37 @@ function planPreview(config, options, input) {
115
65
  * makes every refusal that route makes, in the route's order and with its codes and messages; the
116
66
  * route's exported runner calls the same planner.
117
67
  */
118
- export function planLab(config, options) {
68
+ export function planLab(config, options, deps = {}) {
119
69
  const lab = localBrowserDefaults(config);
120
- const input = {
121
- dryRun: resolveLabDryRun(lab, options.dryRun, true) ?? true,
122
- ...(options.lab === undefined ? {} : { lab: options.lab }),
123
- };
124
- const result = planRoute(routeOf(config), lab, options, input);
70
+ const input = { dryRun: resolveLabDryRun(lab, options.dryRun, true) ?? true };
71
+ const result = planRoute(routeOf(config), lab, options, input, deps);
125
72
  if (!result.ok)
126
73
  return result;
127
- return { ok: true, planned: { plan: result.plan } };
74
+ // The manifest the CLI resolved enters the plan here and nowhere else; the routes read
75
+ // plan.lab for the run's status record and bundle.
76
+ const plan = options.lab === undefined ? result.plan : { ...result.plan, lab: options.lab };
77
+ return { ok: true, planned: { plan } };
128
78
  }
129
- function planRoute(route, lab, options, input) {
79
+ function planRoute(route, lab, options, input, deps) {
130
80
  switch (route) {
131
81
  case "preview":
132
82
  return planPreview(lab, options, input);
133
83
  case "computer-use":
134
84
  return planComputerUseLab(lab, {
135
85
  ...input,
136
- ...(options.cuaHooks === undefined ? {} : { hooks: options.cuaHooks }),
86
+ hasRunSession: deps.runSession !== undefined,
87
+ driving: callerDrivingOf(options),
137
88
  ...(options.count === undefined ? {} : { countOverride: options.count }),
138
89
  ...(options.rerun === undefined ? {} : { rerun: options.rerun }),
139
90
  });
140
91
  case "shared-world":
141
92
  return planSharedWorldLab(lab, {
142
93
  ...input,
143
- ...(options.sharedWorldHooks === undefined ? {} : { hooks: options.sharedWorldHooks }),
94
+ hasRunSession: deps.runSession !== undefined,
144
95
  });
145
96
  case "terminal":
146
- return planTerminalLab(lab, {
147
- ...input,
148
- ...(options.terminalHooks === undefined ? {} : { hooks: options.terminalHooks }),
149
- });
97
+ return planTerminalLab(lab, { ...input, hasCostProbe: deps.costProbe !== undefined });
150
98
  case "scripted":
151
- return planScriptedLab(lab, {
152
- ...input,
153
- ...(options.scriptedHooks === undefined ? {} : { hooks: options.scriptedHooks }),
154
- });
99
+ return planScriptedLab(lab, { ...input, injectedBrowser: injectedBrowser(deps) });
155
100
  }
156
101
  }
@@ -19,7 +19,7 @@ const PREFLIGHT_LEASE_BUFFER_MS = 5 * 60_000;
19
19
  export async function runPublicPreviewPreflight(ctx) {
20
20
  const routeError = publicPreviewRouteError(ctx.config, ctx.route);
21
21
  if (routeError) {
22
- return fail(ctx, "HUMANISH_LAB_PREFLIGHT_UNSUPPORTED_ROUTE", routeError, [
22
+ return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_UNSUPPORTED_ROUTE", routeError, [
23
23
  { name: "route", ok: false, message: routeError },
24
24
  ]);
25
25
  }
@@ -28,12 +28,12 @@ export async function runPublicPreviewPreflight(ctx) {
28
28
  ? rosterTargets
29
29
  : ctx.targets.filter((target) => target.kind === "subject.appUrl");
30
30
  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" }]);
31
+ 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
32
  }
33
33
  const loopbackTarget = publicTargets.find((target) => target.loopback);
34
34
  if (loopbackTarget) {
35
35
  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.", [
36
+ 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
37
  {
38
38
  name: "target policy",
39
39
  ok: false,
@@ -43,7 +43,7 @@ export async function runPublicPreviewPreflight(ctx) {
43
43
  }
44
44
  const e2bApiKey = ctx.env.E2B_API_KEY?.trim();
45
45
  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" }]);
46
+ 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
47
  }
48
48
  // Each target gets at most one readiness budget.
49
49
  const leaseMs = publicTargets.length * ctx.timeoutMs + PREFLIGHT_LEASE_BUFFER_MS;
@@ -63,7 +63,7 @@ export async function runPublicPreviewPreflight(ctx) {
63
63
  }
64
64
  const failed = publicTargets.find((target) => target.reachable === false);
65
65
  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.", [
66
+ return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_TARGET_UNREACHABLE", "one or more declared public-preview targets were not reachable from the hosted desktop.", [
67
67
  {
68
68
  name: "target reachability",
69
69
  ok: false,
@@ -82,13 +82,13 @@ export async function runPublicPreviewPreflight(ctx) {
82
82
  export async function runSandboxLoopbackPreflight(ctx) {
83
83
  const routeError = sandboxLoopbackRouteError(ctx.config, ctx.route);
84
84
  if (routeError) {
85
- return fail(ctx, "HUMANISH_LAB_PREFLIGHT_UNSUPPORTED_ROUTE", routeError, [
85
+ return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_UNSUPPORTED_ROUTE", routeError, [
86
86
  { name: "route", ok: false, message: routeError },
87
87
  ]);
88
88
  }
89
89
  const missingEnv = (ctx.config.subject.env ?? []).filter((name) => !ctx.env[name]?.trim());
90
90
  if (missingEnv.length > 0) {
91
- return fail(ctx, "HUMANISH_LAB_PREFLIGHT_ENV_MISSING", `sandbox-loopback preflight needs declared env values: ${missingEnv.join(", ")}`, [
91
+ return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_ENV_MISSING", `sandbox-loopback preflight needs declared env values: ${missingEnv.join(", ")}`, [
92
92
  {
93
93
  name: "subject env",
94
94
  ok: false,
@@ -98,12 +98,12 @@ export async function runSandboxLoopbackPreflight(ctx) {
98
98
  }
99
99
  const e2bApiKey = ctx.env.E2B_API_KEY?.trim();
100
100
  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" }]);
101
+ 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
102
  }
103
103
  const repo = ctx.config.subject.repos?.[0];
104
104
  const serve = ctx.config.subject.serve;
105
105
  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" }]);
106
+ 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
107
  }
108
108
  let subjectCommitDigest;
109
109
  // The longest the clone and serve steps can take with the lab's own budgets, so the probe is
@@ -216,7 +216,7 @@ async function withPreflightSandbox(ctx, args, callback) {
216
216
  if (failureMessage) {
217
217
  return {
218
218
  ok: false,
219
- result: fail(ctx, "HUMANISH_LAB_PREFLIGHT_PROVISION_FAILED", failureMessage, [
219
+ result: fail(ctx, "HUMANISH_STUDY_PREFLIGHT_PROVISION_FAILED", failureMessage, [
220
220
  { name: "sandbox preflight", ok: false, message: failureMessage },
221
221
  ]),
222
222
  };
@@ -224,7 +224,7 @@ async function withPreflightSandbox(ctx, args, callback) {
224
224
  if (ctx.sandbox.created && ctx.sandbox.killed !== true) {
225
225
  return {
226
226
  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" }]),
227
+ 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
228
  };
229
229
  }
230
230
  return { ok: true };
@@ -1,5 +1,6 @@
1
1
  import type { LabPreflightCheck, LabPreflightResult, PreflightContext } from "./preflight.js";
2
- export declare const LAB_PREFLIGHT_SCHEMA = "humanish.lab-preflight-result.v1";
2
+ /** The schema of `lab preflight` results: whether a study is ready to run on this machine. */
3
+ export declare const STUDY_CHECK_SCHEMA = "humanish.study-check.v1";
3
4
  export declare function finalize(ctx: PreflightContext, args?: {
4
5
  check?: LabPreflightCheck;
5
6
  }): LabPreflightResult;
@@ -1,23 +1,22 @@
1
1
  // The preflight result a run returns, built from its context. preflight.ts and the probes in
2
2
  // preflight-probes.ts both finish through these, so they live below both.
3
- import { backendOf } from "./plan.js";
4
3
  import { automaticAnalysisBudget } from "../analysis/automatic-config.js";
5
4
  import { digestText } from "../evidence/redaction.js";
6
- export const LAB_PREFLIGHT_SCHEMA = "humanish.lab-preflight-result.v1";
5
+ /** The schema of `lab preflight` results: whether a study is ready to run on this machine. */
6
+ export const STUDY_CHECK_SCHEMA = "humanish.study-check.v1";
7
7
  export function finalize(ctx, args) {
8
8
  const checks = args?.check ? [...ctx.checks, args.check] : ctx.checks;
9
9
  const analysis = automaticAnalysisBudget(ctx.config.review?.analysis, ctx.route);
10
10
  return {
11
- schema: LAB_PREFLIGHT_SCHEMA,
11
+ schema: STUDY_CHECK_SCHEMA,
12
12
  ...(analysis ? { analysis } : {}),
13
13
  ok: checks.every((check) => check.ok) &&
14
14
  ctx.targets.every((target) => target.status !== "failed" && target.status !== "blocked"),
15
15
  cwd: ctx.cwd,
16
- lab: ctx.lab,
17
- labId: ctx.labId,
16
+ study: ctx.lab,
17
+ studyId: ctx.labId,
18
18
  origin: ctx.origin,
19
19
  path: ctx.path,
20
- backend: backendOf(ctx.route),
21
20
  route: ctx.route,
22
21
  reachability: ctx.reachability,
23
22
  checks,