humanish 0.106.0 → 0.107.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. package/AGENTS.md +4 -2
  2. package/ARCHITECTURE.md +17 -16
  3. package/CHANGELOG.md +24 -0
  4. package/CONTEXT.md +42 -39
  5. package/CONTRIBUTING.md +8 -6
  6. package/README.md +8 -3
  7. package/dist/actors/codex/app-server-client.js +2 -1
  8. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  9. package/dist/actors/codex/app-server-trace.js +1 -3
  10. package/dist/actors/codex/app-server.js +2 -1
  11. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  12. package/dist/actors/codex/protocol-compat.js +357 -0
  13. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  14. package/dist/actors/codex/protocol-contract.js +471 -0
  15. package/dist/actors/codex/qualified-versions.d.ts +31 -4
  16. package/dist/actors/codex/qualified-versions.js +51 -6
  17. package/dist/actors/codex/restricted-executable.d.ts +24 -0
  18. package/dist/actors/codex/restricted-executable.js +97 -22
  19. package/dist/actors/codex/restricted-launch.d.ts +7 -1
  20. package/dist/actors/codex/restricted-launch.js +42 -3
  21. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  22. package/dist/actors/codex/restricted-notifications.js +277 -0
  23. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  24. package/dist/actors/codex/restricted-participant.js +60 -2
  25. package/dist/actors/codex/restricted-policy.d.ts +9 -1
  26. package/dist/actors/codex/restricted-session.d.ts +14 -1
  27. package/dist/actors/codex/restricted-session.js +50 -17
  28. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  29. package/dist/actors/codex/restricted-transport.js +139 -27
  30. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  31. package/dist/actors/codex/restricted-turn.js +43 -30
  32. package/dist/actors/computer-use/actor.d.ts +1 -1
  33. package/dist/actors/computer-use/actor.js +4 -4
  34. package/dist/actors/computer-use/loop/backstop.js +1 -1
  35. package/dist/actors/computer-use/loop/ending.d.ts +2 -2
  36. package/dist/actors/computer-use/loop/ending.js +2 -2
  37. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  38. package/dist/actors/computer-use/loop/spend.js +3 -3
  39. package/dist/actors/computer-use/loop/trace.js +2 -2
  40. package/dist/actors/computer-use/loop/types.d.ts +14 -5
  41. package/dist/actors/computer-use/loop.js +4 -4
  42. package/dist/actors/computer-use/openai-provider.d.ts +1 -1
  43. package/dist/actors/computer-use/openai-provider.js +2 -2
  44. package/dist/actors/contract.d.ts +10 -8
  45. package/dist/actors/contract.js +7 -1
  46. package/dist/actors/local-agent/cli.js +1 -1
  47. package/dist/actors/scripted-browser/actor.d.ts +2 -2
  48. package/dist/actors/scripted-browser/journey.js +15 -4
  49. package/dist/actors/scripted-browser/steps.js +18 -0
  50. package/dist/actors/scripted-browser/types.d.ts +11 -1
  51. package/dist/actors/stop-conditions.js +1 -3
  52. package/dist/analysis/automatic-completion.d.ts +13 -8
  53. package/dist/analysis/automatic-completion.js +14 -8
  54. package/dist/analysis/automatic-config.d.ts +1 -1
  55. package/dist/analysis/automatic-config.js +2 -2
  56. package/dist/analysis/automatic.d.ts +10 -4
  57. package/dist/analysis/automatic.js +17 -13
  58. package/dist/analysis/diagnostics.d.ts +23 -0
  59. package/dist/analysis/diagnostics.js +112 -0
  60. package/dist/analysis/evidence-sources.js +2 -2
  61. package/dist/analysis/evidence.js +6 -6
  62. package/dist/analysis/execute.d.ts +7 -1
  63. package/dist/analysis/execute.js +39 -12
  64. package/dist/analysis/job.d.ts +8 -5
  65. package/dist/analysis/job.js +15 -14
  66. package/dist/analysis/load.d.ts +1 -1
  67. package/dist/analysis/load.js +5 -5
  68. package/dist/analysis/provider.d.ts +9 -1
  69. package/dist/analysis/restricted-codex.d.ts +2 -0
  70. package/dist/analysis/restricted-codex.js +10 -1
  71. package/dist/analysis/service.d.ts +2 -0
  72. package/dist/analysis/service.js +31 -12
  73. package/dist/analysis/sharing.d.ts +2 -2
  74. package/dist/analysis/sharing.js +5 -5
  75. package/dist/analysis/store-executions.d.ts +5 -5
  76. package/dist/analysis/store-executions.js +12 -12
  77. package/dist/analysis/store.d.ts +4 -4
  78. package/dist/analysis/store.js +13 -13
  79. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  80. package/dist/cli/commands/analysis-signals.js +4 -1
  81. package/dist/cli/commands/analyze.js +4 -2
  82. package/dist/cli/commands/comms.js +8 -1
  83. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  84. package/dist/cli/commands/lab-route-computer-use.js +26 -14
  85. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  86. package/dist/cli/commands/lab-route-preview.js +3 -4
  87. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  88. package/dist/cli/commands/lab-route-run.js +6 -2
  89. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  90. package/dist/cli/commands/lab-route-scripted.js +0 -1
  91. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  92. package/dist/cli/commands/lab-route-shared-world.js +0 -1
  93. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  94. package/dist/cli/commands/lab-route-terminal.js +0 -1
  95. package/dist/cli/commands/lab-run.js +76 -45
  96. package/dist/cli/commands/lab-scorer.d.ts +0 -2
  97. package/dist/cli/commands/lab.js +12 -6
  98. package/dist/cli/commands/observe.js +22 -0
  99. package/dist/cli/commands/run-signals.d.ts +30 -0
  100. package/dist/cli/commands/run-signals.js +146 -0
  101. package/dist/cli/commands/runs.js +10 -8
  102. package/dist/cli/commands/watch.js +12 -10
  103. package/dist/cli/doctor.d.ts +3 -0
  104. package/dist/cli/doctor.js +10 -2
  105. package/dist/cli/io.d.ts +5 -4
  106. package/dist/cli/io.js +12 -8
  107. package/dist/cli/program.js +3 -3
  108. package/dist/cli/renamed-options.d.ts +11 -0
  109. package/dist/cli/renamed-options.js +18 -0
  110. package/dist/cli/telemetry.d.ts +2 -2
  111. package/dist/cli/telemetry.js +1 -1
  112. package/dist/comms/capture-surface.d.ts +1 -1
  113. package/dist/comms/catch-host.d.ts +1 -1
  114. package/dist/comms/connections.js +4 -4
  115. package/dist/comms/external-evidence.d.ts +27 -0
  116. package/dist/comms/external-evidence.js +93 -0
  117. package/dist/comms/lease-store.js +7 -7
  118. package/dist/comms/types.js +1 -1
  119. package/dist/evidence/browser-hygiene.d.ts +1 -1
  120. package/dist/evidence/browser-hygiene.js +1 -1
  121. package/dist/evidence/redaction.js +1 -1
  122. package/dist/evidence/secret-scrub.d.ts +9 -0
  123. package/dist/evidence/secret-scrub.js +96 -0
  124. package/dist/feedback/draft.js +7 -9
  125. package/dist/feedback/export-bundle.js +4 -4
  126. package/dist/feedback/export.js +9 -9
  127. package/dist/feedback/feedback.d.ts +1 -1
  128. package/dist/index.d.ts +3 -6
  129. package/dist/index.js +3 -6
  130. package/dist/keys/key-resolution.d.ts +3 -1
  131. package/dist/keys/key-resolution.js +18 -16
  132. package/dist/lab/adapter-extension.d.ts +28 -6
  133. package/dist/lab/adapter-extension.js +65 -126
  134. package/dist/lab/adapter-scorer-loader.d.ts +25 -5
  135. package/dist/lab/adapter-scorer-loader.js +24 -0
  136. package/dist/lab/composition-rules.d.ts +2 -0
  137. package/dist/lab/composition-rules.js +35 -26
  138. package/dist/lab/config.js +28 -26
  139. package/dist/lab/device-presets.d.ts +2 -2
  140. package/dist/lab/discover.js +1 -3
  141. package/dist/lab/doctor.d.ts +44 -9
  142. package/dist/lab/doctor.js +149 -41
  143. package/dist/lab/init-plan.js +1 -3
  144. package/dist/lab/keys.js +1 -1
  145. package/dist/lab/lab-deps.d.ts +85 -0
  146. package/dist/lab/lab-deps.js +4 -0
  147. package/dist/lab/parse/actors.js +8 -7
  148. package/dist/lab/parse/comms.js +3 -2
  149. package/dist/lab/parse/execution.js +3 -2
  150. package/dist/lab/parse/subject-state.js +2 -1
  151. package/dist/lab/parse/subject.js +2 -1
  152. package/dist/lab/parse/values.d.ts +0 -1
  153. package/dist/lab/parse/values.js +0 -3
  154. package/dist/lab/persona-resolve.d.ts +3 -3
  155. package/dist/lab/persona-resolve.js +4 -4
  156. package/dist/lab/persona.js +1 -3
  157. package/dist/lab/plan-base.d.ts +6 -2
  158. package/dist/lab/plan-base.js +22 -7
  159. package/dist/lab/plan-participants.d.ts +5 -5
  160. package/dist/lab/plan-participants.js +2 -2
  161. package/dist/lab/plan-types.d.ts +33 -7
  162. package/dist/lab/plan.d.ts +3 -11
  163. package/dist/lab/plan.js +18 -42
  164. package/dist/lab/preflight-result.js +0 -2
  165. package/dist/lab/preflight.d.ts +0 -3
  166. package/dist/lab/preflight.js +1 -1
  167. package/dist/lab/requirements.d.ts +20 -0
  168. package/dist/lab/requirements.js +54 -0
  169. package/dist/lab/route-inputs.d.ts +23 -12
  170. package/dist/lab/route-inputs.js +48 -51
  171. package/dist/lab/routing.d.ts +19 -24
  172. package/dist/lab/routing.js +14 -47
  173. package/dist/lab/run-lab-events.d.ts +6 -11
  174. package/dist/lab/run-lab-events.js +3 -11
  175. package/dist/lab/run-lab-homes.d.ts +64 -0
  176. package/dist/lab/run-lab-homes.js +3 -0
  177. package/dist/lab/run-lab-options.d.ts +12 -66
  178. package/dist/lab/run-lab-options.js +45 -275
  179. package/dist/lab/summary.d.ts +9 -4
  180. package/dist/lab/summary.js +15 -8
  181. package/dist/lab/types.d.ts +132 -132
  182. package/dist/lab/validation.d.ts +15 -15
  183. package/dist/lab/validation.js +28 -28
  184. package/dist/lab/warnings.js +20 -19
  185. package/dist/observer/artifact.d.ts +1 -1
  186. package/dist/observer/artifact.js +3 -3
  187. package/dist/observer/data.js +2 -2
  188. package/dist/observer/render.js +2 -2
  189. package/dist/observer/run-routes.d.ts +1 -1
  190. package/dist/observer/run-routes.js +5 -5
  191. package/dist/observer/serve.d.ts +17 -0
  192. package/dist/observer/serve.js +34 -3
  193. package/dist/observer-app.html +1 -1
  194. package/dist/routes/computer-use/bundle-parts.d.ts +1 -1
  195. package/dist/routes/computer-use/bundle-parts.js +10 -3
  196. package/dist/routes/computer-use/bundle.d.ts +4 -11
  197. package/dist/routes/computer-use/bundle.js +9 -15
  198. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  199. package/dist/routes/computer-use/diagnostics.js +1 -1
  200. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +10 -10
  201. package/dist/routes/computer-use/e2b-desktop/comms.js +11 -14
  202. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  203. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -7
  204. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +13 -13
  205. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -11
  206. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  207. package/dist/routes/computer-use/e2b-desktop/prepare.js +33 -36
  208. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  209. package/dist/routes/computer-use/e2b-desktop/start.js +24 -23
  210. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  211. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  212. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  213. package/dist/routes/computer-use/e2b-desktop/teardown.js +29 -17
  214. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  215. package/dist/routes/computer-use/external-comms.js +19 -43
  216. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  217. package/dist/routes/computer-use/fanout-bundle.js +25 -29
  218. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +25 -19
  219. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  220. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  221. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  222. package/dist/routes/computer-use/live-flush.js +19 -27
  223. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +14 -13
  224. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  225. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  226. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  227. package/dist/routes/computer-use/local-vm.js +39 -66
  228. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  229. package/dist/routes/computer-use/participant-desktop.js +5 -25
  230. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +10 -10
  231. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +35 -22
  232. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  233. package/dist/routes/computer-use/participant-facts.js +12 -1
  234. package/dist/routes/computer-use/participant-model.d.ts +19 -11
  235. package/dist/routes/computer-use/participant-model.js +58 -33
  236. package/dist/routes/computer-use/participant-prompt.d.ts +3 -3
  237. package/dist/routes/computer-use/participant-prompt.js +4 -4
  238. package/dist/routes/computer-use/participant-runs.d.ts +6 -6
  239. package/dist/routes/computer-use/participant-runs.js +8 -8
  240. package/dist/routes/computer-use/plan.d.ts +21 -29
  241. package/dist/routes/computer-use/plan.js +59 -65
  242. package/dist/routes/computer-use/preflight.d.ts +6 -11
  243. package/dist/routes/computer-use/preflight.js +26 -18
  244. package/dist/routes/computer-use/rerun-selection.js +10 -6
  245. package/dist/routes/computer-use/result.d.ts +1 -1
  246. package/dist/routes/computer-use/result.js +40 -30
  247. package/dist/routes/computer-use/route.d.ts +3 -4
  248. package/dist/routes/computer-use/route.js +21 -19
  249. package/dist/routes/computer-use/self-report.d.ts +2 -2
  250. package/dist/routes/computer-use/self-report.js +4 -4
  251. package/dist/routes/computer-use/setup.d.ts +8 -17
  252. package/dist/routes/computer-use/setup.js +98 -86
  253. package/dist/routes/computer-use/single-bundle.d.ts +8 -11
  254. package/dist/routes/computer-use/single-bundle.js +20 -25
  255. package/dist/routes/computer-use/subject-projection.d.ts +5 -7
  256. package/dist/routes/computer-use/subject-projection.js +20 -19
  257. package/dist/routes/computer-use/types.d.ts +169 -211
  258. package/dist/routes/computer-use/types.js +13 -6
  259. package/dist/routes/preview.js +0 -1
  260. package/dist/routes/scripted/bundle.d.ts +3 -6
  261. package/dist/routes/scripted/bundle.js +11 -16
  262. package/dist/routes/scripted/plan.d.ts +5 -7
  263. package/dist/routes/scripted/plan.js +6 -4
  264. package/dist/routes/scripted/result.d.ts +4 -1
  265. package/dist/routes/scripted/result.js +10 -6
  266. package/dist/routes/scripted/route.js +10 -11
  267. package/dist/routes/scripted/scenario.d.ts +1 -1
  268. package/dist/routes/scripted/scenario.js +1 -1
  269. package/dist/routes/scripted/setup.d.ts +3 -2
  270. package/dist/routes/scripted/setup.js +22 -21
  271. package/dist/routes/scripted/subject.d.ts +8 -3
  272. package/dist/routes/scripted/subject.js +11 -6
  273. package/dist/routes/scripted/surface-records.js +1 -1
  274. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  275. package/dist/routes/scripted/surface-sessions.js +4 -4
  276. package/dist/routes/scripted/types.d.ts +19 -36
  277. package/dist/routes/scripted/types.js +1 -2
  278. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +8 -8
  279. package/dist/routes/shared-world/bundle.d.ts +2 -2
  280. package/dist/routes/shared-world/bundle.js +22 -26
  281. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  282. package/dist/routes/shared-world/checkpoints.js +4 -4
  283. package/dist/routes/shared-world/comms.d.ts +5 -4
  284. package/dist/routes/shared-world/comms.js +28 -41
  285. package/dist/routes/shared-world/external-public.d.ts +5 -5
  286. package/dist/routes/shared-world/external-public.js +19 -20
  287. package/dist/routes/shared-world/handoff.d.ts +4 -4
  288. package/dist/routes/shared-world/handoff.js +50 -50
  289. package/dist/routes/shared-world/lobby-code.d.ts +5 -5
  290. package/dist/routes/shared-world/lobby-code.js +13 -13
  291. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +8 -6
  292. package/dist/routes/shared-world/{seats.js → participant-specs.js} +46 -51
  293. package/dist/routes/shared-world/plan.d.ts +2 -6
  294. package/dist/routes/shared-world/plan.js +1 -2
  295. package/dist/routes/shared-world/provenance.d.ts +4 -4
  296. package/dist/routes/shared-world/provenance.js +4 -4
  297. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  298. package/dist/routes/shared-world/provisioned.js +48 -41
  299. package/dist/routes/shared-world/result.js +31 -19
  300. package/dist/routes/shared-world/route.js +37 -41
  301. package/dist/routes/shared-world/setup.d.ts +5 -4
  302. package/dist/routes/shared-world/setup.js +12 -14
  303. package/dist/routes/shared-world/types.d.ts +53 -126
  304. package/dist/routes/shared-world/types.js +2 -2
  305. package/dist/routes/terminal/adapter.d.ts +8 -8
  306. package/dist/routes/terminal/adapter.js +28 -125
  307. package/dist/routes/terminal/bundle.d.ts +7 -12
  308. package/dist/routes/terminal/bundle.js +24 -34
  309. package/dist/routes/terminal/credentials.d.ts +2 -2
  310. package/dist/routes/terminal/credentials.js +16 -16
  311. package/dist/routes/terminal/dry-run.d.ts +1 -1
  312. package/dist/routes/terminal/dry-run.js +9 -11
  313. package/dist/routes/terminal/encoding.d.ts +1 -1
  314. package/dist/routes/terminal/encoding.js +2 -2
  315. package/dist/routes/terminal/ledger.d.ts +6 -6
  316. package/dist/routes/terminal/ledger.js +9 -9
  317. package/dist/routes/terminal/live-finish.d.ts +1 -2
  318. package/dist/routes/terminal/live-finish.js +21 -20
  319. package/dist/routes/terminal/live-sandbox.d.ts +4 -2
  320. package/dist/routes/terminal/live-sandbox.js +25 -21
  321. package/dist/routes/terminal/participant-text.d.ts +23 -0
  322. package/dist/routes/terminal/participant-text.js +165 -0
  323. package/dist/routes/terminal/plan.d.ts +2 -6
  324. package/dist/routes/terminal/plan.js +13 -9
  325. package/dist/routes/terminal/recorder.d.ts +6 -1
  326. package/dist/routes/terminal/recorder.js +12 -4
  327. package/dist/routes/terminal/result.js +4 -4
  328. package/dist/routes/terminal/route.js +26 -26
  329. package/dist/routes/terminal/runtime.d.ts +3 -2
  330. package/dist/routes/terminal/runtime.js +3 -3
  331. package/dist/routes/terminal/sandbox.d.ts +5 -3
  332. package/dist/routes/terminal/sandbox.js +13 -16
  333. package/dist/routes/terminal/session.js +16 -14
  334. package/dist/routes/terminal/token-usage.js +5 -5
  335. package/dist/routes/terminal/trace.d.ts +5 -8
  336. package/dist/routes/terminal/trace.js +9 -64
  337. package/dist/routes/terminal/types.d.ts +85 -93
  338. package/dist/routes/terminal/types.js +9 -4
  339. package/dist/run/active-runs.d.ts +13 -0
  340. package/dist/run/active-runs.js +12 -0
  341. package/dist/run/bundle-shape.d.ts +2 -1
  342. package/dist/run/bundle-shape.js +4 -4
  343. package/dist/run/bundle.d.ts +63 -56
  344. package/dist/run/bundle.js +9 -8
  345. package/dist/run/cost-summary.js +3 -2
  346. package/dist/run/costs.d.ts +6 -6
  347. package/dist/run/costs.js +10 -10
  348. package/dist/run/detail.d.ts +5 -5
  349. package/dist/run/detail.js +6 -6
  350. package/dist/run/dry-run.js +5 -12
  351. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  352. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  353. package/dist/run/feedback-shape.js +1 -1
  354. package/dist/run/judge.d.ts +16 -4
  355. package/dist/run/judge.js +24 -7
  356. package/dist/run/locate.d.ts +2 -0
  357. package/dist/run/locate.js +3 -1
  358. package/dist/run/outcomes.d.ts +3 -3
  359. package/dist/run/outcomes.js +3 -3
  360. package/dist/run/participant-records.d.ts +2 -2
  361. package/dist/run/participant-records.js +2 -2
  362. package/dist/run/paths.js +1 -1
  363. package/dist/run/pricing.d.ts +19 -9
  364. package/dist/run/pricing.js +30 -18
  365. package/dist/run/projection.d.ts +13 -13
  366. package/dist/run/projection.js +8 -8
  367. package/dist/run/reclaim.d.ts +7 -1
  368. package/dist/run/reclaim.js +24 -4
  369. package/dist/run/results.d.ts +1 -1
  370. package/dist/run/run-index.d.ts +1 -1
  371. package/dist/run/run-index.js +11 -11
  372. package/dist/run/run.d.ts +4 -2
  373. package/dist/run/run.js +9 -5
  374. package/dist/run/sandbox-receipts.d.ts +4 -4
  375. package/dist/run/sandbox-receipts.js +4 -4
  376. package/dist/run/shared-world-evidence.d.ts +47 -47
  377. package/dist/run/shared-world-shape.d.ts +3 -3
  378. package/dist/run/shared-world-shape.js +11 -11
  379. package/dist/run/stats.d.ts +5 -5
  380. package/dist/run/stats.js +8 -8
  381. package/dist/run/status.d.ts +16 -6
  382. package/dist/run/status.js +31 -8
  383. package/dist/run/streams.d.ts +26 -19
  384. package/dist/run/terminal-contract.d.ts +5 -5
  385. package/dist/run/terminal-contract.js +4 -4
  386. package/dist/run/transient-comms-secrets.d.ts +5 -0
  387. package/dist/run/transient-comms-secrets.js +12 -0
  388. package/dist/run-lab.d.ts +36 -34
  389. package/dist/run-lab.js +41 -37
  390. package/dist/subject/desktop-cli.d.ts +1 -1
  391. package/dist/subject/desktop-cli.js +1 -1
  392. package/dist/subject/local-tree-archive.d.ts +1 -1
  393. package/dist/subject/local-tree-archive.js +4 -4
  394. package/dist/subject/local-tree.d.ts +2 -2
  395. package/dist/subject/local-tree.js +1 -1
  396. package/dist/subject/node-bootstrap.d.ts +1 -1
  397. package/dist/subject/node-bootstrap.js +4 -4
  398. package/dist/subject/runtime.js +5 -5
  399. package/dist/subject/serve.js +1 -1
  400. package/dist/subject/steps.d.ts +4 -4
  401. package/dist/subject/steps.js +5 -5
  402. package/dist/substrates/desktop-session.d.ts +2 -0
  403. package/dist/substrates/e2b/cdp-probe.d.ts +2 -2
  404. package/dist/substrates/e2b/cdp-probe.js +1 -1
  405. package/dist/substrates/e2b/desktop-browser.d.ts +3 -3
  406. package/dist/substrates/e2b/desktop-browser.js +4 -4
  407. package/dist/substrates/e2b/desktop-cdp.d.ts +7 -7
  408. package/dist/substrates/e2b/desktop-cdp.js +4 -4
  409. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  410. package/dist/substrates/e2b/desktop-geometry.js +3 -3
  411. package/dist/substrates/e2b/desktop-media.js +2 -2
  412. package/dist/substrates/e2b/sandbox.d.ts +2 -0
  413. package/dist/substrates/e2b/sandbox.js +22 -8
  414. package/dist/substrates/e2b/sdk.d.ts +12 -1
  415. package/dist/substrates/e2b/sdk.js +30 -9
  416. package/dist/substrates/local/runtime-host.d.ts +2 -0
  417. package/dist/substrates/local/runtime-host.js +6 -0
  418. package/dist/tui/actions.d.ts +7 -5
  419. package/dist/tui/actions.js +18 -9
  420. package/dist/tui-app.js +42 -42
  421. package/dist/verify/actor.d.ts +10 -10
  422. package/dist/verify/actor.js +15 -15
  423. package/dist/verify/artifacts.d.ts +1 -1
  424. package/dist/verify/artifacts.js +3 -3
  425. package/dist/verify/costs.d.ts +2 -2
  426. package/dist/verify/costs.js +2 -2
  427. package/dist/verify/liveness.d.ts +1 -1
  428. package/dist/verify/liveness.js +4 -1
  429. package/dist/verify/rerun.d.ts +1 -1
  430. package/dist/verify/rerun.js +1 -1
  431. package/dist/verify/shared-world.js +2 -2
  432. package/dist/verify/verify.js +6 -6
  433. package/docs/README.md +1 -1
  434. package/docs/architecture/actor-contract.md +60 -22
  435. package/docs/architecture/desktop-sessions.md +9 -9
  436. package/docs/architecture/external-public-shared-world.md +5 -0
  437. package/docs/architecture/observer.md +4 -4
  438. package/docs/architecture/restricted-codex-analysis.md +40 -4
  439. package/docs/architecture/state-driven-executor.md +4 -5
  440. package/docs/architecture/task-protocol-support.md +3 -5
  441. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +24 -16
  442. package/docs/contracts/run-bundle.md +10 -8
  443. package/docs/contracts/schemas.md +109 -53
  444. package/docs/contracts/study-analysis.md +24 -0
  445. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  446. package/docs/product/automatic-analysis.md +1 -0
  447. package/docs/ramp/README.md +2 -1
  448. package/package.json +4 -4
  449. package/skills/humanish/SKILL.md +3 -2
  450. package/skills/humanish/agents/openai.yaml +1 -1
  451. package/dist/deprecated.d.ts +0 -90
  452. package/dist/deprecated.js +0 -106
  453. package/dist/lab/bag-overrides.d.ts +0 -18
  454. package/dist/lab/bag-overrides.js +0 -121
  455. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  456. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  457. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  458. /package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +0 -0
  459. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -1,10 +1,10 @@
1
1
  // Finishing a concurrent shared-world run: publishing its bundle, rendering the Observer, and the
2
2
  // lab result with each role's outcome and the one error a run that did not pass reports.
3
3
  import { redactText } from "../../evidence/redaction.js";
4
- import { adapterScoreFailureMessage, applyBrowserAdapterHooks, } from "../../lab/adapter-extension.js";
4
+ import { adapterScoreFailureMessage, applyBrowserScorer } from "../../lab/adapter-extension.js";
5
5
  import { attachObserverRuntimeStreamUrls } from "../../observer/render.js";
6
- import { foldScorerFailures, judgeExecution, OUTCOME_POLICIES, participantHarnessFailed, resultOk, sharedWorldShortfall, } from "../../run/judge.js";
7
- import { participantFactsOf } from "../computer-use/participant-facts.js";
6
+ import { foldScorerFailures, judgeExecution, sandboxCleanupFailure, OUTCOME_POLICIES, participantHarnessFailed, resultOk, sharedWorldShortfall, } from "../../run/judge.js";
7
+ import { participantFactsOf, unreleasedSandboxFailures, } from "../computer-use/participant-facts.js";
8
8
  import { resolveSubjectState } from "../computer-use/subject-projection.js";
9
9
  import { actorRunPassed, buildConcurrentSharedWorldBundle, judgeSharedWorldRun, maxSimultaneousWindows, } from "./bundle.js";
10
10
  import { planeStateOf } from "./plan.js";
@@ -18,6 +18,7 @@ export function emptyPlaneResults() {
18
18
  subjectCommit: undefined,
19
19
  subjectSandboxId: undefined,
20
20
  subjectKilled: false,
21
+ subjectReleaseWarning: undefined,
21
22
  subjectDesktop: undefined,
22
23
  getHostUrl: undefined,
23
24
  publicOriginDigest: undefined,
@@ -85,8 +86,8 @@ function concurrentLabError(args) {
85
86
  if (ok)
86
87
  return undefined;
87
88
  if (handoffTimedOut) {
88
- // Checked BEFORE the observer failure: the host never yielded a /lobby/CODE within the
89
- // deadline (followers failed closed without opening), which is the ROOT CAUSE — and it can
89
+ // Checked before the observer failure: the host never yielded a /lobby/CODE within the
90
+ // deadline (followers failed closed without opening), which is the root cause, and it can
90
91
  // itself make the Observer unable to render a coherent run. Report the distinct, honest
91
92
  // handoff-timeout code rather than a generic observer/run failure.
92
93
  return {
@@ -159,10 +160,12 @@ export function concurrentLabFailure(envelope) {
159
160
  }
160
161
  /**
161
162
  * The run's execution failures: a run error (the handoff, the plane), each seat whose session
162
- * failed in the harness, and an Observer that failed.
163
+ * failed in the harness, each provider whose cleanup is unconfirmed or that reported a disallowed
164
+ * item after its last request, each sandbox whose release is unconfirmed, and an Observer that
165
+ * failed.
163
166
  */
164
167
  function sharedWorldExecutionFailures(args) {
165
- const { runError, actorResults, observer } = args;
168
+ const { runId, runError, actorResults, subject, observer } = args;
166
169
  return [
167
170
  ...(runError === undefined ? [] : [{ kind: "run", message: runError }]),
168
171
  ...actorResults
@@ -179,6 +182,18 @@ function sharedWorldExecutionFailures(args) {
179
182
  message: `${result.spec.planned.id}: ${result.outcome.providerCleanupError}`,
180
183
  },
181
184
  ]),
185
+ ...actorResults.flatMap((result) => result.outcome.providerPolicyError === undefined
186
+ ? []
187
+ : [
188
+ {
189
+ kind: "provider-policy",
190
+ message: `${result.spec.planned.id}: ${result.outcome.providerPolicyError}`,
191
+ },
192
+ ]),
193
+ ...unreleasedSandboxFailures(actorResults.map((result) => result.outcome), runId),
194
+ ...(subject.subjectSandboxId === undefined || subject.subjectKilled
195
+ ? []
196
+ : [sandboxCleanupFailure("subject", subject.subjectReleaseWarning, runId)]),
182
197
  ...(observer.ok
183
198
  ? []
184
199
  : [
@@ -191,7 +206,7 @@ function sharedWorldExecutionFailures(args) {
191
206
  }
192
207
  /** Builds and publishes the bundle, renders the Observer and returns the lab result. */
193
208
  export async function finishConcurrentRun(ctx, live, results, plane) {
194
- const { plan, input, descriptor, hooks, actorSpecs, run, runId, createdAt } = ctx;
209
+ const { plan, input, descriptor, actorSpecs, run, runId } = ctx;
195
210
  const participantCount = plan.plane.participants.length;
196
211
  const { cwd, concurrency, source, seedDigest, receiving, warnings, scrubKnownValues } = ctx;
197
212
  const { dryRun } = plan;
@@ -218,17 +233,15 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
218
233
  }),
219
234
  });
220
235
  const planeCommit = localTreeRoute ? localTreeArchive?.git?.commit : subjectCommit;
221
- // Collect per-actor warnings (each lane's own teardown/raw-screenshot notes).
236
+ // Collect per-actor warnings (each participant's own teardown/raw-screenshot notes).
222
237
  for (const result of actorResults) {
223
238
  warnings.push(...result.outcome.warnings);
224
239
  }
225
240
  const bundleArgs = {
226
- ...(plan.lab === undefined ? {} : { lab: plan.lab }),
241
+ run,
227
242
  plan,
228
243
  descriptor,
229
- createdAt,
230
244
  dryRun,
231
- runId,
232
245
  source,
233
246
  actorSpecs,
234
247
  actorResults,
@@ -249,8 +262,8 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
249
262
  const judgment = judgeSharedWorldRun(bundleArgs);
250
263
  const bundle = buildConcurrentSharedWorldBundle({ ...bundleArgs, judgment });
251
264
  const adapterWarnings = [];
252
- const scorerResult = await applyBrowserAdapterHooks({
253
- hooks,
265
+ const scorerResult = await applyBrowserScorer({
266
+ scorer: input.scorer,
254
267
  bundle,
255
268
  context: {
256
269
  bundle,
@@ -258,13 +271,12 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
258
271
  labId: plan.labId,
259
272
  runId,
260
273
  actor: descriptor.id,
261
- backend: "concurrent-shared-world",
274
+ route: "shared-world",
262
275
  dryRun,
263
- laneCount: participantCount,
276
+ participantCount,
264
277
  },
265
278
  sanitize: (text) => redactText(scrubKnownValues(text)),
266
279
  warnings: adapterWarnings,
267
- hookLabel: "sharedWorldHooks",
268
280
  ...(input.scorerProvenance === undefined ? {} : { scorerProvenance: input.scorerProvenance }),
269
281
  });
270
282
  // The one final verdict fold: scoring can only make the judged verdict stricter.
@@ -276,13 +288,13 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
276
288
  if (observer.ok && live.observer) {
277
289
  attachObserverRuntimeStreamUrls(observer, live.streamUrls);
278
290
  }
279
- // Concurrent "ok": every actor must produce a terminal, engaged PASSED session, and the seats
291
+ // Concurrent "ok": every actor must produce a terminal, engaged, passed session, and the seats
280
292
  // must show the concurrency verify requires of a pass (judgeSharedWorld). This is a
281
293
  // harness/session-credibility gate, not mission-completion proof; a failed actor trace cannot
282
294
  // make the route green just because the harness got a terminal.
283
295
  const adapterFailure = adapterScoreFailureMessage(bundle);
284
296
  const policy = OUTCOME_POLICIES["shared-world"];
285
- const execution = judgeExecution(sharedWorldExecutionFailures({ runError, actorResults, observer }), policy);
297
+ const execution = judgeExecution(sharedWorldExecutionFailures({ runId, runError, actorResults, subject: results, observer }), policy);
286
298
  const ok = resultOk({ judgment, execution, scorerFailures: scorerResult.failures, policy });
287
299
  const overlapProven = !dryRun && judgment.world.overlap;
288
300
  const participantResults = concurrentParticipantResults(actorSpecs, actorResults, dryRun);
@@ -1,38 +1,39 @@
1
- // The CONCURRENT shared-world lab backend (#164 phase 2): N persona lanes drive ONE shared,
2
- // mutable service plane SIMULTANEOUSLY — the actual leverage of a sim. A recomposition of shipped
1
+ // The concurrent shared-world lab backend (#164 phase 2): N persona participants drive one shared,
2
+ // mutable service plane at the same time. A recomposition of shipped
3
3
  // pieces + the getHost wrapper:
4
4
  //
5
- // - ONE SUBJECT sandbox: provisionCloneSubject ONCE (clone+install+build+seed) + serve on
5
+ // - One subject sandbox: provisionCloneSubject once (clone+install+build+seed) + serve on
6
6
  // 0.0.0.0, exposed via getHost(port) → a tokenless reachable URL (the headless service host;
7
7
  // no GUI seat).
8
- // - N ACTOR desktop sandboxes: fan-out's runCuaParticipant machinery (per-lane device/persona, by-id
8
+ // - N actor desktop sandboxes: fan-out's runCuaParticipant machinery (per-participant device/persona, by-id
9
9
  // teardown) bounded by execution.concurrency, each browser pointed at the getHost URL —
10
- // driving the shared service AT THE SAME TIME. INDEPENDENT (FIX-11): no pipeline gate, no
10
+ // driving the shared service at the same time. Independent: no pipeline gate, no
11
11
  // fail-fast — one actor's failure must not block the swarm or corrupt the "M of N" outcomes.
12
12
  // - A background prober snapshots the subject DB checkpoint digests on a cadence → a stateSeries
13
13
  // of the shared world evolving under load.
14
- // - ALL N+1 sandboxes torn down BY exact id in a finally — NEVER Sandbox.list.
14
+ // - All N+1 sandboxes torn down by exact id in a finally, never through Sandbox.list.
15
15
  //
16
- // HONEST ATTRIBUTION (verify-enforced, doctrine-audit fixes incorporated): the bundle declares
17
- // attributionClass: shared-world + a CONCURRENT humanish.shared-world.v1 block (topologyMode
18
- // "concurrent"; laneWindows + stateSeries + outcomes; NO timeline) whose attributionLimits drop
16
+ // Attribution (enforced by verify): the bundle declares
17
+ // attributionClass: shared-world + a concurrent humanish.shared-world.v1 block (topologyMode
18
+ // "concurrent"; laneWindows + stateSeries + outcomes; no timeline) whose attributionLimits drop
19
19
  // `sequential-only`/`no-concurrent-races` and add `concurrent`,
20
20
  // `best-effort-causal-attribution`, `non-deterministic-shared-state`,
21
21
  // `window-and-snapshot-granularity`, `contention-observed-not-proven-safe`,
22
- // `state-change-not-isolated-to-actors`. laneWindows + stateSeries are INDEPENDENT series with NO
22
+ // `state-change-not-isolated-to-actors`. laneWindows + stateSeries are independent series with no
23
23
  // per-delta→actor field — causation under concurrency is structurally inexpressible.
24
24
  //
25
- // CAPABILITY vs PROOF (FIX-1): the deterministic $0 gate proves the PLUMBING + the honesty
25
+ // Capability and proof: the deterministic $0 gate proves the plumbing + the honesty
26
26
  // contract — the real mapWithConcurrency produces genuinely overlapping laneWindows (a rendezvous
27
- // latch in the fake session forces two lane fns in-flight while the REAL orchestrator clock
27
+ // latch in the fake session forces two participant fns in-flight while the real orchestrator clock
28
28
  // measures the windows). Every generated bundle describes only its own observations; no one run
29
29
  // establishes scale, repeatability, or adopter-harness replacement.
30
30
  //
31
- // Synthetic-subject (FIX-3): a getHost URL is internet-reachable for the run, so this route is
32
- // synthetic-seeded-subjects ONLY. Verify fail-closes on subject.state.provenance != "seeded" and
31
+ // Synthetic subject: a getHost URL is internet-reachable for the run, so this route is for
32
+ // synthetic seeded subjects only. Verify fail-closes on subject.state.provenance != "seeded" and
33
33
  // requires the author attestation subject.exposure: synthetic. This is author-trust + a provenance
34
- // gate, NOT a no-real-data guarantee (humanish cannot tell synthetic from real data).
34
+ // gate; humanish cannot tell synthetic from real data, so it makes no claim about real data.
35
35
  import path from "node:path";
36
+ import { missingKeys, missingSubjectEnv } from "../../lab/requirements.js";
36
37
  import { completeAutomaticAnalysis } from "../../analysis/automatic-completion.js";
37
38
  import { resolveAutomaticAnalysis } from "../../analysis/automatic-config.js";
38
39
  import { scrubLiterals } from "../../evidence/redaction.js";
@@ -46,7 +47,8 @@ import { localAgentRefusal } from "../../actors/local-agent/readiness.js";
46
47
  import { runProvisionedPlane } from "./provisioned.js";
47
48
  import { concurrentLabFailure, finishConcurrentRun } from "./result.js";
48
49
  import { prepareConcurrentRun } from "./setup.js";
49
- import { sharedWorldInputWithScorer } from "../../lab/route-inputs.js";
50
+ import { browserRouteScorer } from "../../lab/adapter-scorer-loader.js";
51
+ import { withLateScorer } from "../../lab/route-inputs.js";
50
52
  import {} from "./types.js";
51
53
  import { rosterOf } from "../../lab/parse/actors.js";
52
54
  /** The shared-world code for each local-agent refusal, kind for kind with computer-use. */
@@ -62,12 +64,11 @@ const LOCAL_AGENT_REFUSAL_CODES = {
62
64
  * run and its analysis.
63
65
  */
64
66
  export async function runConcurrentSharedWorld(options) {
65
- const { config, dryRun, lab, ...input } = options;
67
+ const { config, dryRun, ...input } = options;
66
68
  // planSharedWorldLab makes every configuration refusal, in the order this route always has.
67
69
  const planned = planSharedWorldLab(config, {
68
70
  dryRun,
69
- ...(lab === undefined ? {} : { lab }),
70
- hooks: input.hooks ?? {},
71
+ hasRunSession: input.deps?.runSession !== undefined,
71
72
  });
72
73
  if (planned.ok)
73
74
  return runSharedWorldPlan(planned.plan, input, config);
@@ -90,7 +91,7 @@ export function sharedWorldLabRefusal(options, refusal) {
90
91
  });
91
92
  // A refusal starts no run, so a declared or default analysis is recorded as skipped.
92
93
  const analysis = resolveAutomaticAnalysis(config.review?.analysis);
93
- return completeAutomaticAnalysis(fail(refusal.code, refusal.message, refusal.actor), undefined, analysis.ok ? analysis.config : undefined, options.automaticAnalysis, { trigger: config.review?.analysis === undefined ? "default" : "explicit" });
94
+ return completeAutomaticAnalysis(fail(refusal.code, refusal.message, refusal.actor), undefined, analysis.ok ? analysis.config : undefined, options, { trigger: config.review?.analysis === undefined ? "default" : "explicit" });
94
95
  }
95
96
  /**
96
97
  * runLab's step for a shared-world plan. It runs a live plan's local checks (the keys, a local
@@ -103,11 +104,11 @@ export async function admitSharedWorldPlan(plan, input, config) {
103
104
  return { ok: false, outcome: sharedWorldOutcome(refused) };
104
105
  return {
105
106
  ok: true,
106
- run: async (scorer) => sharedWorldOutcome(await runAdmittedSharedWorldRun(plan, sharedWorldInputWithScorer(input, scorer), config)),
107
+ run: async (scorer) => sharedWorldOutcome(await runAdmittedSharedWorldRun(plan, withLateScorer(input, scorer, browserRouteScorer), config)),
107
108
  };
108
109
  }
109
110
  function sharedWorldOutcome(result) {
110
- return { route: "shared-world", backend: "concurrent-shared-world", result };
111
+ return { route: "shared-world", result };
111
112
  }
112
113
  /** Run a shared-world plan: its local checks, then the run. */
113
114
  export async function runSharedWorldPlan(plan, input, config) {
@@ -122,18 +123,13 @@ export async function runSharedWorldPlan(plan, input, config) {
122
123
  async function admitSharedWorldRun(plan, input) {
123
124
  if (plan.dryRun)
124
125
  return undefined;
125
- const env = input.hooks?.env ?? process.env;
126
- const subjectEnvNames = plan.plane.kind === "provisioned" ? plan.plane.subject.env : [];
126
+ const env = input.env ?? process.env;
127
127
  const fail = (code, message) => completeSharedWorldAnalysis(plan, input, sharedWorldFailure(plan, input)(code, message, sharedWorldDescriptorOf(plan.actor).id), undefined);
128
- // OPENAI_API_KEY drives an openai brain's seats and the external-public plane's lobby-code
129
- // reader; a local-agent brain's seats run on the operator's signed-in agent instead.
130
- const openaiKeyNeeded = plan.brain.kind === "openai" || plan.plane.kind === "external-public";
131
- const missingKeys = [
132
- ...(env.OPENAI_API_KEY?.trim() || !openaiKeyNeeded ? [] : ["OPENAI_API_KEY"]),
133
- ...(env.E2B_API_KEY?.trim() ? [] : ["E2B_API_KEY"]),
134
- ];
135
- if (missingKeys.length > 0) {
136
- return fail("HUMANISH_CONCURRENT_SHARED_WORLD_LAB_KEYS_MISSING", `Live concurrent shared-world labs need ${missingKeys.join(" and ")} in the environment (values are never persisted). ${describeMissingKeys(missingKeys, env)}`);
128
+ // The plan lists OPENAI_API_KEY for an openai brain's seats and the external-public plane's
129
+ // lobby-code reader; a local-agent brain's seats run on the operator's signed-in agent instead.
130
+ const missing = missingKeys(plan.requirements, env);
131
+ if (missing.length > 0) {
132
+ return fail("HUMANISH_CONCURRENT_SHARED_WORLD_LAB_KEYS_MISSING", `Live concurrent shared-world labs need ${missing.join(" and ")} in the environment (values are never persisted). ${describeMissingKeys(missing, env)}`);
137
133
  }
138
134
  if (plan.brain.kind === "local-agent") {
139
135
  // A missing or signed-out agent found after the seats' desktops are paid for is the same
@@ -142,9 +138,9 @@ async function admitSharedWorldRun(plan, input) {
142
138
  if (refusal)
143
139
  return fail(LOCAL_AGENT_REFUSAL_CODES[refusal.kind], refusal.message);
144
140
  }
145
- const missingSubjectEnv = subjectEnvNames.filter((name) => !env[name]?.trim());
146
- if (missingSubjectEnv.length > 0) {
147
- return fail("HUMANISH_CONCURRENT_SHARED_WORLD_LAB_SUBJECT_ENV_MISSING", `subject.env declares ${missingSubjectEnv.join(", ")} but the environment does not provide ${missingSubjectEnv.length === 1 ? "it" : "them"} (pass via --env-file; values are never persisted).`);
141
+ const unsetSubjectEnv = missingSubjectEnv(plan.requirements, env);
142
+ if (unsetSubjectEnv.length > 0) {
143
+ return fail("HUMANISH_CONCURRENT_SHARED_WORLD_LAB_SUBJECT_ENV_MISSING", `subject.env declares ${unsetSubjectEnv.join(", ")} but the environment does not provide ${unsetSubjectEnv.length === 1 ? "it" : "them"} (pass via --env-file; values are never persisted).`);
148
144
  }
149
145
  return undefined;
150
146
  }
@@ -160,7 +156,7 @@ function runAdmittedSharedWorldRun(plan, input, config) {
160
156
  });
161
157
  }
162
158
  function completeSharedWorldAnalysis(plan, input, result, finished) {
163
- return completeAutomaticAnalysis(result, finished, plan.analysis?.config, input.automaticAnalysis, {
159
+ return completeAutomaticAnalysis(result, finished, plan.analysis?.config, input, {
164
160
  ...(plan.analysis === undefined ? {} : { trigger: plan.analysis.trigger }),
165
161
  preferLargerOutput: plan.analysis?.preferLargerOutput === true,
166
162
  });
@@ -180,8 +176,8 @@ function sharedWorldFailure(plan, input) {
180
176
  async function runPlanInScope(plan, input, config, scope) {
181
177
  const { dryRun } = plan;
182
178
  const requestedCwd = path.resolve(input.cwd);
183
- const hooks = input.hooks ?? {};
184
- const env = hooks.env ?? process.env;
179
+ const deps = input.deps ?? {};
180
+ const env = input.env ?? process.env;
185
181
  const fail = sharedWorldFailure(plan, input);
186
182
  const descriptor = sharedWorldDescriptorOf(plan.actor);
187
183
  const planeClass = plan.plane.kind === "external-public" ? "external-public" : "provisioned-getHost";
@@ -194,7 +190,7 @@ async function runPlanInScope(plan, input, config, scope) {
194
190
  const subjectRepo = plan.residual.subject.repos?.[0] ?? "";
195
191
  const subjectEnvNames = [...(subject?.env ?? [])];
196
192
  const checkpoints = [...(subject?.state.checkpoint ?? [])];
197
- const runSession = hooks.runSession ?? descriptor.runSession;
193
+ const runSession = deps.runSession ?? descriptor.runSession;
198
194
  const openaiApiKey = env.OPENAI_API_KEY?.trim() ?? "";
199
195
  const e2bApiKey = env.E2B_API_KEY?.trim() ?? "";
200
196
  const knownSecretValues = [
@@ -212,7 +208,7 @@ async function runPlanInScope(plan, input, config, scope) {
212
208
  input,
213
209
  config,
214
210
  requestedCwd,
215
- hooks,
211
+ deps,
216
212
  env,
217
213
  descriptor,
218
214
  planeClass,
@@ -1,17 +1,18 @@
1
1
  import type { CuaActorDescriptor } from "../../actors/registry.js";
2
2
  import type { LabConfig, LabSubjectServe, LabSubjectStateCheckpoint } from "../../lab/types.js";
3
3
  import type { RunScope } from "../../run/run.js";
4
- import type { ConcurrentSharedWorldLabErrorCode, ConcurrentSharedWorldLabResult, ConcurrentSharedWorldPlaneClass, FinishFacts, LiveParticipants, PlaneContext, PlaneResults, PlaneSelection, SharedWorldLabHooks, SharedWorldRunInput } from "./types.js";
4
+ import type { ConcurrentSharedWorldLabErrorCode, ConcurrentSharedWorldLabResult, ConcurrentSharedWorldPlaneClass, FinishFacts, LiveParticipants, PlaneContext, PlaneResults, PlaneSelection, SharedWorldRunInput } from "./types.js";
5
+ import type { LabDeps } from "../../lab/lab-deps.js";
5
6
  import type { SharedWorldPlan } from "../../lab/plan-types.js";
6
7
  /** What validation derived from the lab, which setup reads. */
7
8
  interface AdmittedLab {
8
9
  plan: SharedWorldPlan;
9
10
  input: SharedWorldRunInput;
10
- /** Read by the computer-use lane runner, whose hooks and desktop setup take the whole config.
11
- * Seats, their count and their host and entry come from the plan's participants. */
11
+ /** Read for the subject's serve URL, which each seat's subject names. Seats, their count and
12
+ * their host and entry come from the plan's participants. */
12
13
  config: LabConfig;
13
14
  requestedCwd: string;
14
- hooks: SharedWorldLabHooks;
15
+ deps: LabDeps;
15
16
  env: Record<string, string | undefined>;
16
17
  descriptor: CuaActorDescriptor;
17
18
  planeClass: ConcurrentSharedWorldPlaneClass;
@@ -10,7 +10,7 @@ import { prepareEmailReceiving, prepareExternalComms, receivingSourceOf, subject
10
10
  import { declaredOriginDigestOf } from "./external-public.js";
11
11
  import { packSubjectTree } from "./provisioned.js";
12
12
  import { emptyPlaneResults } from "./result.js";
13
- import { buildParticipantSpecs, defaultSessionTimeoutMs } from "./seats.js";
13
+ import { buildParticipantSpecs, defaultSessionTimeoutMs } from "./participant-specs.js";
14
14
  import { planeStateOf } from "./plan.js";
15
15
  import path from "node:path";
16
16
  import { e2bRequestTimeoutMs } from "../../substrates/e2b/lifetime.js";
@@ -49,7 +49,7 @@ async function bindPhysicalProject(requestedCwd) {
49
49
  .physicalPath;
50
50
  }
51
51
  function startConcurrentRun(lab, cwd, scope) {
52
- const { plan, input, hooks } = lab;
52
+ const { plan, input, deps } = lab;
53
53
  return scope.startRun({
54
54
  cwd,
55
55
  runId: input.runId,
@@ -57,7 +57,7 @@ function startConcurrentRun(lab, cwd, scope) {
57
57
  mode: plan.dryRun ? "dry-run" : "live",
58
58
  lab: plan.lab,
59
59
  renderReview: renderConcurrentReviewMarkdown,
60
- observer: { open: input.open === true, render: hooks.renderObserverFn },
60
+ observer: { open: input.open === true, render: deps.renderObserver },
61
61
  });
62
62
  }
63
63
  /**
@@ -65,7 +65,7 @@ function startConcurrentRun(lab, cwd, scope) {
65
65
  * specs, comms, the packed tree and email receiving. Returns the refusal when one of them fails.
66
66
  */
67
67
  export async function prepareConcurrentRun(lab, scope) {
68
- const { plan, input, config, requestedCwd, hooks, env, descriptor, planeClass, fail } = lab;
68
+ const { plan, input, config, requestedCwd, deps, env, descriptor, planeClass, fail } = lab;
69
69
  const { runBudget, runSession, localTreeRoute, subjectEnvNames, publicRepo } = lab;
70
70
  const { openaiApiKey, e2bApiKey, knownSecretValues, scrubKnownValues } = lab;
71
71
  const { dryRun, concurrency } = plan;
@@ -73,17 +73,14 @@ export async function prepareConcurrentRun(lab, scope) {
73
73
  const warnings = [];
74
74
  // The comms catch and the packed tree are checked before the run starts, so a refusal leaves
75
75
  // no run directory. Neither spends: the probe is one request and packing runs on the host.
76
- const externalComms = await prepareExternalComms(plan.residual, planeClass, dryRun, warnings);
76
+ const externalComms = await prepareExternalComms(plan.residual, planeClass, dryRun, warnings, env);
77
77
  if (!externalComms.ok) {
78
- return {
79
- ok: false,
80
- result: fail("HUMANISH_CONCURRENT_SHARED_WORLD_LAB_COMMS_CATCH_UNREACHABLE", externalComms.message),
81
- };
78
+ return { ok: false, result: fail(externalComms.code, externalComms.message) };
82
79
  }
83
80
  // Pack the working tree once per run, on the host, before any sandbox exists: a packing
84
81
  // failure fails the run closed without sandbox cost. Dry-run packs nothing.
85
82
  const packed = localTreeRoute && !dryRun
86
- ? await packSubjectTree(cwd, plan.residual, hooks, scrubKnownValues)
83
+ ? await packSubjectTree(cwd, plan.residual, deps, scrubKnownValues)
87
84
  : { ok: true, archive: undefined, buffer: undefined };
88
85
  if (!packed.ok) {
89
86
  return {
@@ -102,9 +99,9 @@ export async function prepareConcurrentRun(lab, scope) {
102
99
  const timeoutMs = plan.sessionTimeoutMs ?? defaultSessionTimeoutMs(plan);
103
100
  const requestTimeoutMs = e2bRequestTimeoutMs(env);
104
101
  const redactScreenshots = plan.residual.policies?.redactScreenshots === true;
105
- const timers = hooks.detachedTimers ?? {};
106
- const now = hooks.now ?? Date.now;
107
- const proberCadenceMs = hooks.proberCadenceMs ?? DEFAULT_PROBER_CADENCE_MS;
102
+ const timers = deps.detachedTimers ?? {};
103
+ const now = deps.now ?? Date.now;
104
+ const proberCadenceMs = deps.proberCadenceMs ?? DEFAULT_PROBER_CADENCE_MS;
108
105
  const seedDigest = seedRecipeDigest(planeStateOf(plan));
109
106
  const source = await buildRunSource({
110
107
  capturedAt: createdAt,
@@ -147,7 +144,7 @@ export async function prepareConcurrentRun(lab, scope) {
147
144
  input,
148
145
  config,
149
146
  descriptor,
150
- hooks,
147
+ deps,
151
148
  env,
152
149
  concurrency,
153
150
  runBudget,
@@ -155,6 +152,7 @@ export async function prepareConcurrentRun(lab, scope) {
155
152
  openaiApiKey,
156
153
  e2bApiKey,
157
154
  scrubKnownValues,
155
+ knownSecretValues,
158
156
  cwd,
159
157
  run,
160
158
  runId,