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
@@ -10,7 +10,7 @@
10
10
  // against a real app (it fills forms and clicks buttons). A dry run parses and digest-pins the
11
11
  // scenario and writes the contract bundle without touching anything.
12
12
  //
13
- // Subject provenance (invariant 5): an app-url run declares that the lab did not provision the
13
+ // Subject provenance: an app-url run declares that the lab did not provision the
14
14
  // subject, so its build provenance is unpinned and the evidence binds to the scenario digest. A
15
15
  // clone run records commit, env names, state provenance and a host digest, never the raw getHost
16
16
  // URL or a secret value.
@@ -24,24 +24,24 @@ import { buildRunSource } from "../../run/bundle.js";
24
24
  import { prepareSelectedOutputDirectory } from "../../run/contained-output.js";
25
25
  import { runScope } from "../../run/run.js";
26
26
  import { renderScriptedReviewMarkdown } from "./bundle.js";
27
- import { planScriptedLab } from "./plan.js";
27
+ import { injectedBrowser, planScriptedLab } from "./plan.js";
28
28
  import { finishScriptedRun } from "./result.js";
29
29
  import { UnsafeScriptedSessionResultError } from "./session-result.js";
30
30
  import { prepareScriptedRun } from "./setup.js";
31
31
  import { ScriptedSubject } from "./subject.js";
32
32
  import { runScriptedSessions, writeSurfaceTraces } from "./surface-sessions.js";
33
- import { SCRIPTED_BROWSER_LAB_SCHEMA, } from "./types.js";
33
+ import {} from "./types.js";
34
+ import { studyResultIdentity } from "../../run/study-result.js";
34
35
  /**
35
36
  * The config-taking entry point. It plans, returns a refusal with the envelope the route has always
36
37
  * returned at that refusal's stage, and otherwise runs the plan.
37
38
  */
38
39
  export async function runScriptedBrowserLab(options) {
39
- const { config, dryRun, lab, ...input } = options;
40
+ const { config, dryRun, ...input } = options;
40
41
  // planScriptedLab makes every configuration refusal, in the order this route always has.
41
42
  const planned = planScriptedLab(config, {
42
43
  dryRun,
43
- ...(lab === undefined ? {} : { lab }),
44
- ...(input.hooks === undefined ? {} : { hooks: input.hooks }),
44
+ injectedBrowser: injectedBrowser(input.deps),
45
45
  });
46
46
  if (planned.ok)
47
47
  return runScriptedPlan(planned.plan, input);
@@ -57,10 +57,9 @@ export async function scriptedLabRefusal(options, refusal) {
57
57
  const actorType = config.actors[0]?.type ?? "";
58
58
  if (refusal.beforeScope)
59
59
  return {
60
- schema: SCRIPTED_BROWSER_LAB_SCHEMA,
60
+ ...studyResultIdentity("scripted", config.id),
61
61
  ok: false,
62
62
  cwd,
63
- labId: config.id,
64
63
  actor: actorType,
65
64
  dryRun,
66
65
  runId: options.runId ?? "not-created",
@@ -73,10 +72,9 @@ export async function scriptedLabRefusal(options, refusal) {
73
72
  const physicalCwd = await realpath(cwd);
74
73
  await prepareSelectedOutputDirectory(path.dirname(physicalCwd), physicalCwd);
75
74
  const refused = {
76
- schema: SCRIPTED_BROWSER_LAB_SCHEMA,
75
+ ...studyResultIdentity("scripted", config.id),
77
76
  ok: false,
78
77
  cwd,
79
- labId: config.id,
80
78
  actor: refusal.actor ?? actorType,
81
79
  appUrl: refusal.appUrl ?? config.subject.appUrl ?? "",
82
80
  dryRun,
@@ -86,7 +84,7 @@ export async function scriptedLabRefusal(options, refusal) {
86
84
  error: { code: refusal.code, message: refusal.message },
87
85
  };
88
86
  const analysis = resolveAutomaticAnalysis(config.review?.analysis);
89
- return completeAutomaticAnalysis(refused, undefined, analysis.ok ? analysis.config : undefined, options.automaticAnalysis, { trigger: config.review?.analysis === undefined ? "default" : "explicit" });
87
+ return completeAutomaticAnalysis(refused, undefined, analysis.ok ? analysis.config : undefined, options, { trigger: config.review?.analysis === undefined ? "default" : "explicit" });
90
88
  }
91
89
  /**
92
90
  * runLab's step for a scripted plan. It takes no scorer, and its local checks (keys, a browser)
@@ -97,7 +95,6 @@ export function admitScriptedPlan(plan, input) {
97
95
  ok: true,
98
96
  run: async () => ({
99
97
  route: "scripted",
100
- backend: "scripted",
101
98
  result: await runScriptedPlan(plan, input),
102
99
  }),
103
100
  };
@@ -112,7 +109,7 @@ export function admitScriptedPlan(plan, input) {
112
109
  */
113
110
  export async function runScriptedPlan(plan, input) {
114
111
  const { result, finished } = await runScope((scope) => runScriptedPlanInScope(plan, input, scope));
115
- return completeAutomaticAnalysis(result, finished, plan.analysis?.config, input.automaticAnalysis, {
112
+ return completeAutomaticAnalysis(result, finished, plan.analysis?.config, input, {
116
113
  ...(plan.analysis === undefined ? {} : { trigger: plan.analysis.trigger }),
117
114
  preferLargerOutput: plan.analysis?.preferLargerOutput === true,
118
115
  });
@@ -130,7 +127,7 @@ async function runScriptedPlanInScope(plan, input, scope) {
130
127
  mode: dryRun ? "dry-run" : "live",
131
128
  lab: plan.lab,
132
129
  renderReview: renderScriptedReviewMarkdown,
133
- observer: { open: input.open === true, render: setup.hooks.renderObserverFn },
130
+ observer: { open: input.open === true, render: setup.deps.renderObserver },
134
131
  });
135
132
  if (!started.ok) {
136
133
  return setup.failed(started.code, started.message);
@@ -148,7 +145,8 @@ async function runScriptedPlanInScope(plan, input, scope) {
148
145
  ? new ScriptedSubject({
149
146
  plan,
150
147
  clone: setup.clone,
151
- hooks: setup.hooks,
148
+ deps: setup.deps,
149
+ ...(input.prepareDesktop === undefined ? {} : { prepareDesktop: input.prepareDesktop }),
152
150
  env: setup.env,
153
151
  e2bApiKey: setup.e2bApiKey,
154
152
  runPaths,
@@ -156,7 +154,7 @@ async function runScriptedPlanInScope(plan, input, scope) {
156
154
  subjectEnvNames: setup.subjectEnvNames,
157
155
  hasGithubToken: setup.hasGithubToken,
158
156
  scrubKnownValues: setup.scrubKnownValues,
159
- now: setup.hooks.now ?? Date.now,
157
+ now: setup.deps.now ?? Date.now,
160
158
  warnings: setup.warnings,
161
159
  })
162
160
  : undefined;
@@ -175,7 +173,7 @@ async function runScriptedPlanInScope(plan, input, scope) {
175
173
  artifactRoot,
176
174
  }, {
177
175
  surfaces: setup.surfaces,
178
- hooks: setup.hooks,
176
+ deps: setup.deps,
179
177
  browserCommand: setup.browserCommand,
180
178
  runPaths,
181
179
  });
@@ -9,7 +9,7 @@ interface ResolvedScriptedScenario {
9
9
  }
10
10
  /**
11
11
  * Resolve and consume `scenario.ref`. Path-style refs (contain a separator or end .yaml/.yml)
12
- * resolve against cwd and are CLAMPED inside it — a ../../ escape is rejected, never recorded
12
+ * resolve against cwd and are clamped inside it: a ../../ escape is rejected, never recorded
13
13
  * as repo-relative provenance. Id-style refs must be public-safe tokens and resolve to
14
14
  * humanish/scenarios/<ref>.yaml (then .yml). Every failure mode is fail-closed. planScriptedLab
15
15
  * has already refused a missing or blank ref.
@@ -11,7 +11,7 @@ import { readContainedRegularFile, } from "../../run/contained-output.js";
11
11
  const SCENARIO_REF_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.-]*$/;
12
12
  /**
13
13
  * Resolve and consume `scenario.ref`. Path-style refs (contain a separator or end .yaml/.yml)
14
- * resolve against cwd and are CLAMPED inside it — a ../../ escape is rejected, never recorded
14
+ * resolve against cwd and are clamped inside it: a ../../ escape is rejected, never recorded
15
15
  * as repo-relative provenance. Id-style refs must be public-safe tokens and resolve to
16
16
  * humanish/scenarios/<ref>.yaml (then .yml). Every failure mode is fail-closed. planScriptedLab
17
17
  * has already refused a missing or blank ref.
@@ -26,7 +26,7 @@ export async function resolveScriptedScenario(projectRoot, ref) {
26
26
  if (!relative || relative.startsWith("..") || path.isAbsolute(relative)) {
27
27
  return {
28
28
  ok: false,
29
- message: `scenario.ref path must stay inside the target cwd (got "${trimmed}") — provenance is recorded repo-relative and an escaping path cannot be.`,
29
+ message: `scenario.ref must stay inside the project directory, and "${trimmed}" does not: the run records it relative to the project.`,
30
30
  };
31
31
  }
32
32
  source = relative.split(path.sep).join("/");
@@ -80,7 +80,7 @@ export async function resolveScriptedScenario(projectRoot, ref) {
80
80
  if (!parsed.journey) {
81
81
  return {
82
82
  ok: false,
83
- message: `${source} declares no executable browser steps — the scripted-browser actor needs a scenario with browser.steps.`,
83
+ message: `${source} declares no browser steps, and the scripted-browser actor needs a scenario with browser.steps.`,
84
84
  };
85
85
  }
86
86
  return { ok: true, journey: parsed.journey, source, sourceDigest };
@@ -1,12 +1,13 @@
1
1
  import type { ActorPersonaRef } from "../../actors/contract.js";
2
2
  import type { BrowserPersonaJourney, ScriptedBrowserEvidenceUrlPolicy } from "../../actors/scripted-browser/types.js";
3
3
  import type { ScriptedPlan } from "../../lab/plan-types.js";
4
- import { type ScriptedBrowserLabHooks, type ScriptedBrowserLabResult, type ScriptedRunInput } from "./types.js";
4
+ import { type ScriptedBrowserLabResult, type ScriptedRunInput } from "./types.js";
5
+ import type { LabDeps } from "../../lab/lab-deps.js";
5
6
  /** What setup hands the run: the plan's subject and scenario, keys and the browser to launch. */
6
7
  export interface ScriptedRunSetup {
7
8
  cwd: string;
8
9
  physicalCwd: string;
9
- hooks: ScriptedBrowserLabHooks;
10
+ deps: LabDeps;
10
11
  warnings: string[];
11
12
  failed: (code: NonNullable<ScriptedBrowserLabResult["error"]>["code"], message: string) => ScriptedBrowserLabResult;
12
13
  clone: Extract<ScriptedPlan["subject"], {
@@ -2,13 +2,15 @@
2
2
  // the E2B key and subject env of a live clone, a browser to launch) and the values the run reads
3
3
  // (the evidence URL policy, the scrubber for clone values, the persona and the session budget).
4
4
  import { realpath } from "node:fs/promises";
5
+ import { missingKeys, missingSubjectEnv } from "../../lab/requirements.js";
5
6
  import path from "node:path";
6
7
  import { resolveBrowserCommand } from "../../actors/scripted-browser/browser-command.js";
7
8
  import { describeMissingKeys } from "../../keys/key-resolution.js";
8
9
  import { prepareSelectedOutputDirectory } from "../../run/contained-output.js";
9
10
  import { evidenceAppUrlOf } from "./plan.js";
10
11
  import { resolveScriptedScenario } from "./scenario.js";
11
- import { SCRIPTED_BROWSER_LAB_SCHEMA, } from "./types.js";
12
+ import {} from "./types.js";
13
+ import { studyResultIdentity } from "../../run/study-result.js";
12
14
  // Journey wall-clock budget per surface: 5 minutes. A scripted surface has zero model cost and
13
15
  // sandbox-seconds are pennies; a short default only truncated slow-loading subjects.
14
16
  const DEFAULT_SESSION_TIMEOUT_MS = 300_000;
@@ -21,15 +23,14 @@ export async function prepareScriptedRun(plan, input) {
21
23
  const cwd = path.resolve(input.cwd);
22
24
  const physicalCwd = await realpath(cwd);
23
25
  const projectRoot = await prepareSelectedOutputDirectory(path.dirname(physicalCwd), physicalCwd);
24
- const hooks = input.hooks ?? {};
26
+ const deps = input.deps ?? {};
25
27
  const warnings = [];
26
28
  const clone = plan.subject.kind === "clone" ? plan.subject : undefined;
27
29
  const evidenceAppUrl = evidenceAppUrlOf(plan.subject);
28
30
  const failed = (code, message) => ({
29
- schema: SCRIPTED_BROWSER_LAB_SCHEMA,
31
+ ...studyResultIdentity("scripted", plan.labId),
30
32
  ok: false,
31
33
  cwd,
32
- labId: plan.labId,
33
34
  actor: plan.actor,
34
35
  appUrl: evidenceAppUrl,
35
36
  dryRun,
@@ -42,7 +43,7 @@ export async function prepareScriptedRun(plan, input) {
42
43
  ? { kind: "provisioned-subject", evidenceOrigin: evidenceAppUrl }
43
44
  : { kind: "loopback" };
44
45
  const subjectEnvNames = [...(clone?.env ?? [])];
45
- const env = hooks.env ?? process.env;
46
+ const env = input.env ?? process.env;
46
47
  const e2bApiKey = env.E2B_API_KEY?.trim() ?? "";
47
48
  const hasGithubToken = subjectEnvNames.includes("GITHUB_TOKEN");
48
49
  const redactRepoLabel = plan.residual.policies?.redactRepos ?? hasGithubToken;
@@ -57,42 +58,42 @@ export async function prepareScriptedRun(plan, input) {
57
58
  if (!scenario.ok) {
58
59
  return {
59
60
  ok: false,
60
- result: failed("HUMANISH_SCRIPTED_LAB_SCENARIO_INVALID", scenario.message),
61
+ result: failed("HUMANISH_SCRIPTED_SCENARIO_INVALID", scenario.message),
61
62
  };
62
63
  }
63
64
  const journey = scenario.journey;
64
- if (!dryRun && clone) {
65
- if (!e2bApiKey) {
66
- return {
67
- ok: false,
68
- result: failed("HUMANISH_SCRIPTED_LAB_KEYS_MISSING", `Live clone scripted-browser labs require E2B_API_KEY (dry-run remains $0 and does not provision a subject). ${describeMissingKeys(["E2B_API_KEY"], env)}`),
69
- };
70
- }
71
- const missingSubjectEnv = subjectEnvNames.filter((name) => !env[name]?.trim());
72
- if (missingSubjectEnv.length > 0) {
73
- return {
74
- ok: false,
75
- result: failed("HUMANISH_SCRIPTED_LAB_SUBJECT_ENV_MISSING", `Subject env values missing for live clone scripted-browser lab: ${missingSubjectEnv.join(", ")}.`),
76
- };
77
- }
65
+ // The plan lists E2B_API_KEY and the subject env only for a live clone.
66
+ const missing = missingKeys(plan.requirements, env);
67
+ if (missing.length > 0) {
68
+ return {
69
+ ok: false,
70
+ result: failed("HUMANISH_SCRIPTED_KEYS_MISSING", `Live clone scripted-browser labs require ${missing.join(" and ")} (dry-run remains $0 and does not provision a subject). ${describeMissingKeys(missing, env)}`),
71
+ };
72
+ }
73
+ const unsetSubjectEnv = missingSubjectEnv(plan.requirements, env);
74
+ if (unsetSubjectEnv.length > 0) {
75
+ return {
76
+ ok: false,
77
+ result: failed("HUMANISH_SCRIPTED_SUBJECT_ENV_MISSING", `Subject env values missing for live clone scripted-browser lab: ${unsetSubjectEnv.join(", ")}.`),
78
+ };
78
79
  }
79
80
  const surfaces = plan.surfaces;
80
81
  const timeoutMs = plan.sessionTimeoutMs ?? DEFAULT_SESSION_TIMEOUT_MS;
81
82
  const persona = {
82
83
  id: plan.personaId ?? "scripted-journey",
83
84
  traitsApplied: [],
84
- // The step manifest IS the "prompt" on this lane; the digest binds the trace to the
85
+ // The step manifest is the "prompt" on this route; the digest binds the trace to the
85
86
  // committed scenario text.
86
87
  promptDigest: journey.sourceDigest.slice(0, 16),
87
88
  };
88
- // Live runs need a browser BEFORE any actuation (unless one is injected).
89
- let browserCommand = hooks.browserCommand;
90
- if (!dryRun && !hooks.launchBrowser && !browserCommand) {
89
+ // Live runs need a browser before any actuation (unless one is injected).
90
+ let browserCommand = deps.browserCommand;
91
+ if (!dryRun && !deps.launchBrowser && !browserCommand) {
91
92
  const resolved = await resolveBrowserCommand();
92
93
  if (!resolved) {
93
94
  return {
94
95
  ok: false,
95
- result: failed("HUMANISH_SCRIPTED_LAB_BROWSER_MISSING", "No Chrome/Chromium browser command was found for the scripted-browser actor. Set HUMANISH_BROWSER_COMMAND to a browser binary playwright-core can launch."),
96
+ result: failed("HUMANISH_SCRIPTED_BROWSER_MISSING", "No Chrome/Chromium browser command was found for the scripted-browser actor. Set HUMANISH_BROWSER_COMMAND to a browser binary playwright-core can launch."),
96
97
  };
97
98
  }
98
99
  browserCommand = resolved;
@@ -102,7 +103,7 @@ export async function prepareScriptedRun(plan, input) {
102
103
  setup: {
103
104
  cwd,
104
105
  physicalCwd,
105
- hooks,
106
+ deps,
106
107
  warnings,
107
108
  failed,
108
109
  clone,
@@ -2,7 +2,8 @@ import type { ScriptedPlan } from "../../lab/plan-types.js";
2
2
  import { type PreparedRunArtifactPaths } from "../../run/paths.js";
3
3
  import type { RunSubjectStateStepRecord } from "../../run/bundle.js";
4
4
  import { type DesktopResourceObservation } from "../../substrates/e2b/desktop-resources.js";
5
- import type { ScriptedBrowserLabHooks } from "./types.js";
5
+ import type { LabDeps } from "../../lab/lab-deps.js";
6
+ import type { RunLabHomes } from "../../lab/run-lab-homes.js";
6
7
  type ScriptedCloneSubject = Extract<ScriptedPlan["subject"], {
7
8
  readonly kind: "clone";
8
9
  }>;
@@ -10,8 +11,10 @@ type ScriptedCloneSubject = Extract<ScriptedPlan["subject"], {
10
11
  export interface ScriptedSubjectInputs {
11
12
  plan: ScriptedPlan;
12
13
  clone: ScriptedCloneSubject;
13
- hooks: ScriptedBrowserLabHooks;
14
- env: Record<string, string | undefined>;
14
+ deps: LabDeps;
15
+ /** Runs after the subject sandbox exists and before provisioning. */
16
+ prepareDesktop?: NonNullable<RunLabHomes["prepareDesktop"]>;
17
+ env: Readonly<Record<string, string | undefined>>;
15
18
  e2bApiKey: string;
16
19
  runPaths: PreparedRunArtifactPaths;
17
20
  timeoutMs: number;
@@ -26,6 +29,8 @@ export interface ScriptedSubjectInputs {
26
29
  export declare class ScriptedSubject {
27
30
  sandboxId: string | undefined;
28
31
  killed: boolean;
32
+ /** The scrubbed release warning when the subject's release is unconfirmed. */
33
+ releaseWarning: string | undefined;
29
34
  commit: string | undefined;
30
35
  hostDigest: string | undefined;
31
36
  readonly stateStepRecords: RunSubjectStateStepRecord[];
@@ -37,6 +37,8 @@ function hostOriginDigest(url) {
37
37
  export class ScriptedSubject {
38
38
  sandboxId;
39
39
  killed = false;
40
+ /** The scrubbed release warning when the subject's release is unconfirmed. */
41
+ releaseWarning;
40
42
  commit;
41
43
  hostDigest;
42
44
  stateStepRecords = [];
@@ -50,15 +52,15 @@ export class ScriptedSubject {
50
52
  }
51
53
  /** Acquires, provisions and serves the subject. Returns the tokenless getHost URL to drive. */
52
54
  async provision() {
53
- const { plan, clone, hooks, env, e2bApiKey, runPaths, timeoutMs } = this.inputs;
55
+ const { plan, clone, deps, prepareDesktop, env, e2bApiKey, runPaths, timeoutMs } = this.inputs;
54
56
  const { subjectEnvNames, hasGithubToken, scrubKnownValues, now } = this.inputs;
55
57
  const requestTimeoutMs = e2bRequestTimeoutMs(env);
56
- const timers = hooks.detachedTimers ?? {};
58
+ const timers = deps.detachedTimers ?? {};
57
59
  const subjectSandboxTimeoutMs = timeoutMs +
58
60
  SUBJECT_PROVISION_BUDGET_MS +
59
61
  (clone.state?.seed ?? []).reduce((sum, step) => sum + (step.timeoutMs ?? DEFAULT_STATE_STEP_TIMEOUT_MS), 0) +
60
62
  SANDBOX_TIMEOUT_BUFFER_MS;
61
- const subjectModule = await (hooks.loadDesktopModule ?? loadE2BDesktopModule)();
63
+ const subjectModule = await (deps.desktopModule ?? loadE2BDesktopModule)();
62
64
  await validatePreparedRunArtifactPaths(runPaths);
63
65
  // The receipt is on disk before any work on the sandbox, so `humanish reclaim` can kill
64
66
  // it by exact id when this process dies mid-run; the finally block below only runs while
@@ -73,7 +75,7 @@ export class ScriptedSubject {
73
75
  mode: "scripted-browser-lab",
74
76
  tool: "humanish",
75
77
  labId: plan.labId,
76
- role: "subject",
78
+ kind: "subject",
77
79
  actor: plan.actor,
78
80
  },
79
81
  ...(subjectEnvNames.length > 0
@@ -92,8 +94,8 @@ export class ScriptedSubject {
92
94
  this.sandboxId = subject.allocation.resourceId;
93
95
  this.createdAtMs = now();
94
96
  this.resources = await observeDesktopResources(subjectDesktop);
95
- if (hooks.prepareDesktop) {
96
- await hooks.prepareDesktop(subjectDesktop);
97
+ if (prepareDesktop) {
98
+ await prepareDesktop(subjectDesktop, { kind: "subject" });
97
99
  await validatePreparedRunArtifactPaths(runPaths);
98
100
  }
99
101
  this.commit = await provisionCloneSubject(e2bShell(subjectDesktop), {
@@ -137,6 +139,8 @@ export class ScriptedSubject {
137
139
  this.killed = reading.released;
138
140
  if (reading.warning)
139
141
  warnings.push(reading.warning);
142
+ if (!reading.released)
143
+ this.releaseWarning = reading.warning ?? "Subject sandbox release is unconfirmed.";
140
144
  // Without a kill method, or in E2B debug mode, no kill reached E2B, so there is no teardown
141
145
  // time to record.
142
146
  if (released.status !== "unconfirmed" || released.reason !== "release_unavailable")
@@ -18,7 +18,7 @@ export function scriptedSurfaceRecords(context, surface, index, result, screensh
18
18
  : "contract_proof_only";
19
19
  const reason = result?.reason ??
20
20
  context.sessionError ??
21
- "Contract bundle only: dry-run pinned the scenario contract without launching a browser or touching the subject app.";
21
+ "Dry run: the scenario was pinned without launching a browser or touching the subject app.";
22
22
  const simulation = participantRecord(ids, index + 1, {
23
23
  personaId: context.persona.id,
24
24
  scenarioId: context.journey.scenarioId,
@@ -31,20 +31,20 @@ export function scriptedSurfaceRecords(context, surface, index, result, screensh
31
31
  ? `Scripted-browser actor (${context.actorId}) replayed ${context.journey.scenarioId} on the ${surface.id} surface; ${result.completionReason}.`
32
32
  : context.sessionError !== undefined
33
33
  ? `Scripted lab failed before a terminal session verdict: ${context.sessionError}`
34
- : `Contract participant for the scripted-browser actor (${context.actorId}) against ${context.appUrl}.`,
34
+ : `Scripted-browser actor (${context.actorId}) against ${context.appUrl}; no session ran.`,
35
35
  startedAt: context.createdAt,
36
36
  updatedAt: result?.capture.capturedAt ?? context.createdAt,
37
37
  });
38
38
  const stream = participantStream(ids, {
39
39
  kind: "browser",
40
- label: `${surface.label} — ${context.labId}`,
40
+ label: `${surface.label} · ${context.labId}`,
41
41
  status,
42
42
  transport: "snapshot",
43
43
  updatedAt: result?.capture.capturedAt ?? context.createdAt,
44
44
  embed: lastScreenshot
45
45
  ? { kind: "screenshot", url: `../${lastScreenshot}`, title: `${surface.label} (raw)` }
46
46
  : { kind: "placeholder", title: surface.label },
47
- // REAL emulated viewport: isMobile/deviceScaleFactor genuinely render on this route
47
+ // Real emulated viewport: isMobile/deviceScaleFactor genuinely render on this route
48
48
  // (playwright emulation), unlike the e2b-desktop route's prompt-signal-only fidelity.
49
49
  viewport: surface.viewport,
50
50
  ui: {
@@ -1,11 +1,11 @@
1
1
  import { type ScriptedBrowserSessionOptions, type ScriptedBrowserSessionResult } from "../../actors/scripted-browser/actor.js";
2
2
  import type { ScriptedPlan } from "../../lab/plan-types.js";
3
3
  import { type PreparedRunArtifactPaths } from "../../run/paths.js";
4
- import type { ScriptedBrowserLabHooks } from "./types.js";
4
+ import type { LabDeps } from "../../lab/lab-deps.js";
5
5
  /** One session per surface, in parallel. */
6
6
  export declare function runScriptedSessions(session: Required<Pick<ScriptedBrowserSessionOptions, "appUrl" | "evidenceAppUrl" | "urlPolicy" | "journey" | "persona" | "timeoutMs" | "artifactRoot">>, run: {
7
7
  surfaces: ScriptedPlan["surfaces"];
8
- hooks: ScriptedBrowserLabHooks;
8
+ deps: LabDeps;
9
9
  browserCommand: string | undefined;
10
10
  runPaths: PreparedRunArtifactPaths;
11
11
  }): Promise<ScriptedBrowserSessionResult[]>;
@@ -7,8 +7,8 @@ import { validateScriptedSessionResult } from "./session-result.js";
7
7
  /** One session per surface, in parallel. */
8
8
  export function runScriptedSessions(session, run) {
9
9
  const { appUrl, evidenceAppUrl, urlPolicy, journey, persona, timeoutMs, artifactRoot } = session;
10
- const { surfaces, hooks, browserCommand, runPaths } = run;
11
- const runSession = hooks.runSession;
10
+ const { surfaces, deps, browserCommand, runPaths } = run;
11
+ const runSession = deps.runScriptedSession;
12
12
  return Promise.all(surfaces.map((surface) => {
13
13
  const sessionOptions = {
14
14
  appUrl,
@@ -20,8 +20,8 @@ export function runScriptedSessions(session, run) {
20
20
  timeoutMs,
21
21
  artifactRoot,
22
22
  ...(browserCommand === undefined ? {} : { browserCommand }),
23
- ...(hooks.launchBrowser === undefined ? {} : { launchBrowser: hooks.launchBrowser }),
24
- ...(hooks.now === undefined ? {} : { now: hooks.now }),
23
+ ...(deps.launchBrowser === undefined ? {} : { launchBrowser: deps.launchBrowser }),
24
+ ...(deps.now === undefined ? {} : { now: deps.now }),
25
25
  };
26
26
  return runSession
27
27
  ? runSession(sessionOptions).then(async (result) => {
@@ -1,48 +1,31 @@
1
1
  import type { ActorCompletionReason, ActorStatus } from "../../actors/contract.js";
2
- import type { ScriptedBrowserSessionOptions, ScriptedBrowserSessionResult } from "../../actors/scripted-browser/actor.js";
3
- import type { ScriptedBrowserLaunchArgs, ScriptedBrowserLike } from "../../actors/scripted-browser/types.js";
4
- import type { AutomaticAnalysisHooks, AutomaticAnalysisResult } from "../../analysis/automatic-completion.js";
2
+ import type { LabEvent } from "../../lab/run-lab-events.js";
3
+ import type { AutomaticAnalysisResult } from "../../analysis/automatic-completion.js";
5
4
  import type { LabConfig } from "../../lab/types.js";
6
- import { renderObserver, type ObserverResult } from "../../observer/render.js";
5
+ import type { ObserverResult } from "../../observer/render.js";
7
6
  import type { RunSubjectProvenance } from "../../run/bundle.js";
8
- import type { RunLabProvenance } from "../../run/status.js";
9
- import type { DetachedTimers } from "../../substrates/detached.js";
10
- import type { E2BDesktopModule, E2BDesktopSandbox } from "../../substrates/e2b/sdk.js";
11
- export declare const SCRIPTED_BROWSER_LAB_SCHEMA = "humanish.scripted-lab-result.v1";
12
- /**
13
- * Library-level hooks: DI seams so CI drives the full path (real engine, real projection)
14
- * with a fake browser at zero spend, plus the production browser resolution override.
15
- */
16
- export interface ScriptedBrowserLabHooks {
17
- runSession?: (options: ScriptedBrowserSessionOptions) => Promise<ScriptedBrowserSessionResult>;
18
- /** Injected browser factory — forwarded to every session; skips browser-binary resolution. */
19
- launchBrowser?: (args: ScriptedBrowserLaunchArgs) => Promise<ScriptedBrowserLike>;
20
- /** Test/library env seam; CLI passes process.env. Values are scrubbed, names only persist. */
21
- env?: Record<string, string | undefined>;
22
- /** E2B DI seam for clone × e2b-desktop × scripted-browser. */
23
- loadDesktopModule?: () => Promise<E2BDesktopModule>;
24
- /** Optional adopter hook after subject sandbox creation, before clone provisioning. */
25
- prepareDesktop?: (desktop: E2BDesktopSandbox) => Promise<void>;
26
- /** Detached-step timers for deterministic tests around clone/seed/start provisioning. */
27
- detachedTimers?: DetachedTimers;
28
- /** Override the resolved browser binary (tests; operators use HUMANISH_BROWSER_COMMAND). */
29
- browserCommand?: string;
30
- renderObserverFn?: typeof renderObserver;
31
- now?: () => number;
32
- }
7
+ import type { LabDeps } from "../../lab/lab-deps.js";
8
+ import type { RunLabHomes } from "../../lab/run-lab-homes.js";
9
+ import { type StudyResultIdentity } from "../../run/study-result.js";
33
10
  /** What a scripted run takes besides its plan. The plan carries the config, dry run and lab. */
34
11
  export type ScriptedRunInput = Omit<RunScriptedBrowserLabOptions, "config" | "dryRun" | "lab">;
35
12
  export interface RunScriptedBrowserLabOptions {
36
- automaticAnalysis?: AutomaticAnalysisHooks;
37
- /** Which manifest produced this run (#455); threaded into the status record + bundle. */
38
- lab?: RunLabProvenance;
13
+ /** Cancels post-run analysis only. */
14
+ analysisSignal?: AbortSignal;
15
+ /** Reports the analysis window to onEvent; built by normalizeRunLabOptions. */
16
+ emit?: (event: LabEvent) => void;
39
17
  cwd: string;
40
18
  config: LabConfig;
41
19
  /** Resolved upstream (scenario.mode + CLI override); defaults safe (dry-run). */
42
20
  dryRun: boolean;
43
21
  open?: boolean;
44
22
  runId?: string;
45
- hooks?: ScriptedBrowserLabHooks;
23
+ /** Keys and subject env for the run. Defaults to process.env. Values are scrubbed; names persist. */
24
+ env?: Readonly<Record<string, string | undefined>>;
25
+ /** Runs after a clone subject's sandbox exists and before provisioning. */
26
+ prepareDesktop?: NonNullable<RunLabHomes["prepareDesktop"]>;
27
+ /** Test seams: the browser, the session, the E2B module, timers, the renderer and the clock. */
28
+ deps?: LabDeps;
46
29
  }
47
30
  interface ScriptedBrowserLabSession {
48
31
  surface: string;
@@ -51,14 +34,12 @@ interface ScriptedBrowserLabSession {
51
34
  reason: string;
52
35
  screenshots: number;
53
36
  }
54
- export interface ScriptedBrowserLabResult extends AutomaticAnalysisResult {
55
- schema: typeof SCRIPTED_BROWSER_LAB_SCHEMA;
56
- /** True when the bundle verified AND (dry-run, or every session reached a terminal verdict
57
- * without a harness error). The subject failing the script is successful EVIDENCE, not a lab
58
- * failure. */
37
+ export interface ScriptedBrowserLabResult extends AutomaticAnalysisResult, StudyResultIdentity<"scripted"> {
38
+ /** True when the bundle verified and (dry-run, or every session reached a terminal verdict
39
+ * without a harness error). The subject failing the script is successful evidence, and the lab
40
+ * does not fail for it. */
59
41
  ok: boolean;
60
42
  cwd: string;
61
- labId: string;
62
43
  /** The registry-resolved actor id that ran (or would run) the sessions. */
63
44
  actor: string;
64
45
  appUrl: string;
@@ -81,7 +62,7 @@ export interface ScriptedBrowserLabResult extends AutomaticAnalysisResult {
81
62
  observer?: ObserverResult;
82
63
  warnings: string[];
83
64
  error?: {
84
- code: "HUMANISH_LAB_ANALYSIS_INVALID" | "HUMANISH_LAB_TASKS_UNSUPPORTED" | "HUMANISH_LAB_OPTION_CONFLICT" | "HUMANISH_LAB_OPTION_UNSUPPORTED" | "HUMANISH_SCRIPTED_LAB_FAILED" | "HUMANISH_SCRIPTED_LAB_ACTOR_UNSUPPORTED" | "HUMANISH_SCRIPTED_LAB_SCENARIO_INVALID" | "HUMANISH_SCRIPTED_LAB_SUBJECT_UNSAFE" | "HUMANISH_SCRIPTED_LAB_BROWSER_MISSING" | "HUMANISH_SCRIPTED_LAB_KEYS_MISSING" | "HUMANISH_SCRIPTED_LAB_SUBJECT_ENV_MISSING" | "HUMANISH_SCRIPTED_LAB_GETHOST_UNAVAILABLE" | "HUMANISH_RUN_ID_IN_USE";
65
+ code: "HUMANISH_STUDY_ANALYSIS_INVALID" | "HUMANISH_STUDY_TASKS_UNSUPPORTED" | "HUMANISH_STUDY_OPTION_UNSUPPORTED" | "HUMANISH_SCRIPTED_FAILED" | "HUMANISH_SCRIPTED_ACTOR_UNSUPPORTED" | "HUMANISH_SCRIPTED_SCENARIO_INVALID" | "HUMANISH_SCRIPTED_SUBJECT_UNSAFE" | "HUMANISH_SCRIPTED_BROWSER_MISSING" | "HUMANISH_SCRIPTED_KEYS_MISSING" | "HUMANISH_SCRIPTED_SUBJECT_ENV_MISSING" | "HUMANISH_SCRIPTED_GETHOST_UNAVAILABLE" | "HUMANISH_RUN_ID_IN_USE";
85
66
  message: string;
86
67
  };
87
68
  }
@@ -1,3 +1,2 @@
1
- // The scripted-browser lab's schema constant, library hooks, options and result types.
2
- import { renderObserver } from "../../observer/render.js";
3
- export const SCRIPTED_BROWSER_LAB_SCHEMA = "humanish.scripted-lab-result.v1";
1
+ // The scripted-browser lab's schema constant, options and result types.
2
+ import {} from "../../run/study-result.js";