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
package/dist/lab/keys.js CHANGED
@@ -92,8 +92,11 @@ const ACTOR = {
92
92
  type: true,
93
93
  count: true,
94
94
  lanes: PARTICIPANT_ENTRY,
95
- // Roster groups are lanes with a count; the parser expands them into lanes.
96
- roster: { ...PARTICIPANT_ENTRY, count: true },
95
+ // Roster groups are participants with a count; the parser expands them into `lanes[]`.
96
+ roster: {
97
+ ...PARTICIPANT_ENTRY,
98
+ count: true,
99
+ },
97
100
  persona: true,
98
101
  mission: true,
99
102
  model: true,
@@ -200,14 +203,45 @@ const LAB_KEYS = {
200
203
  defaults: { open: true },
201
204
  comms: { email: EMAIL },
202
205
  };
206
+ function without(shape, ...keys) {
207
+ return Object.fromEntries(Object.entries(shape).filter(([key]) => !keys.includes(key)));
208
+ }
209
+ // humanish.study.v3. The route is declared, so `subject.topology` goes. The participant keys leave
210
+ // the actor for `participants`, and `caps` is one top-level block. Top-level `personas` and
211
+ // `scenario.inline` are read by no route, and `scenario` is a string.
212
+ const STUDY_KEYS = {
213
+ schema: true,
214
+ id: true,
215
+ title: true,
216
+ description: true,
217
+ route: true,
218
+ mode: true,
219
+ subject: without(SUBJECT, "topology"),
220
+ actor: without(ACTOR, "count", "lanes", "roster", "laneFocus"),
221
+ // A count, `{ count, instruction }` or a list of entries. studyToV2 checks which form the route
222
+ // takes; an entry with a count is a group.
223
+ participants: { ...PARTICIPANT_ENTRY, count: true },
224
+ surfaces: true,
225
+ caps: CAPS,
226
+ execution: without(EXECUTION, "caps"),
227
+ scenario: true,
228
+ policies: LAB_KEYS.policies,
229
+ review: LAB_KEYS.review,
230
+ defaults: LAB_KEYS.defaults,
231
+ comms: LAB_KEYS.comms,
232
+ };
203
233
  /** The first key in `raw` that LAB_KEYS does not list, as an error message; undefined if none. */
204
234
  export function findUnknownLabKey(raw) {
205
- return walk(raw, LAB_KEYS, "");
235
+ return walk(raw, LAB_KEYS, "", "lab");
236
+ }
237
+ /** The first key in a humanish.study.v3 document that the format does not have; undefined if none. */
238
+ export function findUnknownStudyKey(raw) {
239
+ return walk(raw, STUDY_KEYS, "", "study");
206
240
  }
207
- function walk(value, shape, path) {
241
+ function walk(value, shape, path, noun) {
208
242
  if (Array.isArray(value)) {
209
243
  for (const [index, item] of value.entries()) {
210
- const found = walk(item, shape, `${path}[${index}]`);
244
+ const found = walk(item, shape, `${path}[${index}]`, noun);
211
245
  if (found)
212
246
  return found;
213
247
  }
@@ -220,23 +254,23 @@ function walk(value, shape, path) {
220
254
  // Object.hasOwn: a key like `constructor` must not match Object.prototype.
221
255
  const unknown = Object.keys(record).filter((key) => !Object.hasOwn(shape, key));
222
256
  if (unknown.length > 0)
223
- return unknownKeysMessage(path, unknown, known);
257
+ return unknownKeysMessage(path, unknown, known, noun);
224
258
  for (const [key, child] of Object.entries(record)) {
225
259
  const expected = shape[key];
226
260
  if (expected !== true && expected !== undefined) {
227
- const found = walk(child, expected, path ? `${path}.${key}` : key);
261
+ const found = walk(child, expected, path ? `${path}.${key}` : key, noun);
228
262
  if (found)
229
263
  return found;
230
264
  }
231
265
  }
232
266
  return undefined;
233
267
  }
234
- function unknownKeysMessage(path, unknown, known) {
268
+ function unknownKeysMessage(path, unknown, known, noun) {
235
269
  const named = unknown.map((key) => {
236
270
  const suggestion = closest(key, known);
237
271
  return suggestion ? `${key} (did you mean \`${suggestion}\`?)` : key;
238
272
  });
239
- return `Unknown lab field(s)${path ? ` in \`${path}\`` : ""}: ${named.join(", ")}. Known fields: ${known.join(", ")}.`;
273
+ return `Unknown ${noun} field(s)${path ? ` in \`${path}\`` : ""}: ${named.join(", ")}. Known fields: ${known.join(", ")}.`;
240
274
  }
241
275
  // The known key within edit distance 2, or one that differs only in case.
242
276
  function closest(key, known) {
@@ -0,0 +1,80 @@
1
+ import type { ScriptedBrowserSessionOptions, ScriptedBrowserSessionResult } from "../actors/scripted-browser/actor.js";
2
+ import type { ScriptedBrowserLaunchArgs, ScriptedBrowserLike } from "../actors/scripted-browser/types.js";
3
+ import type { CuaActorSessionOptions } from "../actors/computer-use/actor.js";
4
+ import type { AutomaticAnalysisDeps, runAutomaticAnalysis } from "../analysis/automatic.js";
5
+ import type { CuaLoopResult } from "../actors/computer-use/loop.js";
6
+ import type { renderObserver } from "../observer/render.js";
7
+ import type { TerminalCostProbe } from "../routes/terminal/types.js";
8
+ import type { DetachedTimers } from "../substrates/detached.js";
9
+ import type { E2BDesktopModule } from "../substrates/e2b/sdk.js";
10
+ import type { LocalTreeArchive } from "../subject/local-tree-archive.js";
11
+ import type { SubjectPhaseEvent } from "../subject/steps.js";
12
+ import type { ParticipantRef } from "./run-lab-events.js";
13
+ export interface LabDeps {
14
+ /** Loads the E2B SDK. Defaults to loadE2BDesktopModule. */
15
+ readonly desktopModule?: () => Promise<E2BDesktopModule>;
16
+ /** Renders the Observer. Defaults to renderObserver. */
17
+ readonly renderObserver?: typeof renderObserver;
18
+ /** The clock, in epoch milliseconds. Defaults to Date.now. */
19
+ readonly now?: () => number;
20
+ /** Clock and sleep for detached provisioning steps. */
21
+ readonly detachedTimers?: DetachedTimers;
22
+ /**
23
+ * Computer use and shared world: where subject-provisioning phases go in place of stderr. A
24
+ * computer-use phase names its participant; a shared-world plane's names none. onEvent still
25
+ * receives every phase.
26
+ */
27
+ readonly subjectPhaseSink?: (event: SubjectPhaseEvent, participant?: ParticipantRef) => void;
28
+ /**
29
+ * Shared world: runs each participant's computer-use session in place of the actor's own. The
30
+ * planner reads whether it is set: a custom runner cannot enforce actors[0].maxOutputTokens.
31
+ */
32
+ readonly runSession?: (options: CuaActorSessionOptions) => Promise<CuaLoopResult>;
33
+ /**
34
+ * Shared world: packs a local-tree subject on the host. Defaults to createLocalTreeArchive and a
35
+ * read of the archive it writes. Called once per run, before the subject sandbox exists.
36
+ */
37
+ readonly packLocalTree?: (args: {
38
+ root: string;
39
+ extraExclude?: string[];
40
+ maxArchiveBytes?: number;
41
+ }) => Promise<{
42
+ archive: LocalTreeArchive;
43
+ buffer: ArrayBuffer;
44
+ }>;
45
+ /** Shared world: the background stateSeries prober's cadence in milliseconds. Defaults to 1000. */
46
+ readonly proberCadenceMs?: number;
47
+ /**
48
+ * Shared world, external-public plane: how long the host has to surface a /lobby/CODE URL
49
+ * before the run fails closed. Defaults to 120000, capped by execution.timeoutMs.
50
+ */
51
+ readonly handoffDeadlineMs?: number;
52
+ /**
53
+ * Shared world, external-public plane: reads a /lobby/CODE off a participant's screenshot.
54
+ * Defaults to the single-frame OpenAI read.
55
+ */
56
+ readonly readLobbyCodeFromFrame?: (frame: Buffer, apiKey: string) => Promise<string | undefined>;
57
+ /**
58
+ * Every route: post-run analysis in place of the real one. `run` replaces
59
+ * the real analysis runner, and `deps` (provider fetch, keys, clock) reach the analysis only,
60
+ * never a participant.
61
+ */
62
+ readonly analysis?: {
63
+ readonly run?: typeof runAutomaticAnalysis;
64
+ readonly deps?: AutomaticAnalysisDeps;
65
+ };
66
+ /** Scripted: runs one surface's session in place of the scripted-browser actor. */
67
+ readonly runScriptedSession?: (options: ScriptedBrowserSessionOptions) => Promise<ScriptedBrowserSessionResult>;
68
+ /**
69
+ * Scripted: launches the browser each session drives, so no browser binary is resolved. The
70
+ * planner reads whether it, or browserCommand, is set: a live run then needs no host browser.
71
+ */
72
+ readonly launchBrowser?: (args: ScriptedBrowserLaunchArgs) => Promise<ScriptedBrowserLike>;
73
+ /** Scripted: the browser binary to launch; operators use HUMANISH_BROWSER_COMMAND. */
74
+ readonly browserCommand?: string;
75
+ /**
76
+ * Terminal: known spend lines for the cost ledger. The planner reads whether it is set, since
77
+ * only a measured line can trip a positive maxUsd.
78
+ */
79
+ readonly costProbe?: TerminalCostProbe;
80
+ }
@@ -0,0 +1,4 @@
1
+ // Test seams: the implementations a test puts in place of the real ones. The internal runLab takes
2
+ // them as its third argument and each route runner as `deps`; the package's runLab takes none.
3
+ // Each field defaults to the real implementation.
4
+ export {};
@@ -3,8 +3,9 @@ import { isReasoningEffort, reasoningEffortNames } from "../../actors/reasoning-
3
3
  import { isMaxOutputTokens } from "../../actors/output-token-limit.js";
4
4
  import { isHttpUrl } from "./subject.js";
5
5
  import { registeredComputerUseActors, registeredScriptedBrowserActors, registeredTerminalActors, } from "../routing.js";
6
- import { invalid, isRecord, posInt, str } from "./values.js";
7
- // A lane id interpolates into per-lane evidence paths (screenshots/<id>/, actors/<id>.json), so
6
+ import { invalid, posInt, str } from "./values.js";
7
+ import { isRecord } from "../../run/type-guards.js";
8
+ // A participant id interpolates into its evidence paths (screenshots/<id>/, actors/<id>.json), so
8
9
  // it must be a public-safe path token, same shape as a lab id.
9
10
  export const PARTICIPANT_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.-]*$/;
10
11
  export const PARTICIPANT_ID_MAX_CHARS = 40;
@@ -21,8 +22,8 @@ export function focusOf(actor) {
21
22
  // Actor ids humanish no longer registers. Rejecting them at parse keeps a lab that names one
22
23
  // from running on a route that ignores actors[0].type, such as a this-repo dry run.
23
24
  const REMOVED_ACTOR_TYPES = new Set(["pi-agent-core", "claude-agent-sdk"]);
24
- // Only actors on a lane a route dispatches. codex-app-server is registered but declares only the
25
- // "code" lane, which no lab route runs, so naming it would lead to the same dead end.
25
+ // Only actors of a run kind a route dispatches. codex-app-server is registered but declares only
26
+ // the "code" run kind, which no study route runs, so naming it would lead to the same dead end.
26
27
  function routableActorTypes() {
27
28
  return [
28
29
  ...registeredComputerUseActors(),
@@ -56,10 +57,10 @@ export function parseActors(raw) {
56
57
  if (count !== undefined)
57
58
  actor.count = count;
58
59
  if (entry.lanes !== undefined && entry.roster !== undefined) {
59
- return invalid(`actors[${index}].lanes and actors[${index}].roster are mutually exclusive: declare participants in \`lanes\` OR in compact \`roster\` groups, not both.`);
60
+ return invalid(`Set either actors[${index}].lanes or actors[${index}].roster, not both: list participants one by one in \`lanes\`, or in groups in \`roster\`.`);
60
61
  }
61
62
  if (entry.roster !== undefined && count !== undefined) {
62
- return invalid(`actors[${index}].roster and actors[${index}].count are mutually exclusive — use compact differentiated groups OR a homogeneous count, not both.`);
63
+ return invalid(`Set either actors[${index}].roster or actors[${index}].count, not both: \`roster\` declares groups of distinct participants, and \`count\` declares identical ones.`);
63
64
  }
64
65
  if (entry.roster !== undefined && entry.laneFocus !== undefined) {
65
66
  return invalid(`actors[${index}].roster and actors[${index}].laneFocus are mutually exclusive: a roster group's instruction is each participant's steer.`);
@@ -138,7 +139,7 @@ function parseFocus(raw) {
138
139
  return Object.keys(focus).length > 0 ? focus : undefined;
139
140
  }
140
141
  /**
141
- * Parse `actors[index].roster` compact groups into concrete lanes. This is authoring sugar for
142
+ * Parse `actors[index].roster` compact groups into concrete `lanes[]` entries. This is authoring sugar for
142
143
  * "N users of M adapter-owned types across S surfaces"; the runtime receives only `lanes[]`.
143
144
  */
144
145
  function parseRosterGroups(raw, actorIndex) {
@@ -159,7 +160,7 @@ function parseRosterGroups(raw, actorIndex) {
159
160
  return invalid(`actors[${actorIndex}].roster[${groupIndex}].id is required and must be a public-safe token matching ${PARTICIPANT_ID_PATTERN}.`);
160
161
  }
161
162
  if (!PARTICIPANT_ID_PATTERN.test(groupId) || groupId.length > PARTICIPANT_ID_MAX_CHARS - 3) {
162
- return invalid(`actors[${actorIndex}].roster[${groupIndex}].id must be a public-safe token matching ${PARTICIPANT_ID_PATTERN} and at most ${PARTICIPANT_ID_MAX_CHARS - 3} chars (generated participant ids use <id>-NN); got "${groupId}".`);
163
+ return invalid(`actors[${actorIndex}].roster[${groupIndex}].id must match ${PARTICIPANT_ID_PATTERN} and be at most ${PARTICIPANT_ID_MAX_CHARS - 3} characters, because each generated participant id adds a suffix like "-01"; "${groupId}" is not.`);
163
164
  }
164
165
  if (seenGroupIds.has(groupId)) {
165
166
  return invalid(`actors[${actorIndex}].roster group ids must be unique (duplicate "${groupId}").`);
@@ -183,11 +184,11 @@ function parseRosterGroups(raw, actorIndex) {
183
184
  }
184
185
  /**
185
186
  * Parse `actors[index].lanes` into a fan-out roster (computer-use E2B route). Structural only:
186
- * each lane is `{ id?, actorType?, surface?, caseGroup?, persona?, device?, instruction?, target?,
187
+ * each entry is `{ id?, actorType?, surface?, caseGroup?, persona?, device?, instruction?, target?,
187
188
  * entry?, host?, reasoningEffort?, stopWhen?, dwell? }`.
188
- * Lane ids (when declared) must be public-safe path tokens and unique; lane grouping metadata
189
- * must be public-safe tokens; a lane device must be a known preset name. The
190
- * route-scoped cross-validation (lanes XOR count/laneFocus, device XOR raw resolution, cap 16)
189
+ * Participant ids (when declared) must be public-safe path tokens and unique; grouping metadata
190
+ * must be public-safe tokens; a device must be a known preset name. The
191
+ * route-scoped cross-validation (`lanes` XOR `count`/`laneFocus`, device XOR raw resolution, cap 16)
191
192
  * runs in parseLabConfig where the route is known.
192
193
  */
193
194
  function parseParticipantEntries(raw, actorIndex) {
@@ -271,7 +272,7 @@ function parseParticipantEntries(raw, actorIndex) {
271
272
  const entryPath = str(entry.entry);
272
273
  if (entryPath !== undefined)
273
274
  parsedEntry.entry = entryPath;
274
- // `host` marks the designated host seat on the external-public shared-world route; the
275
+ // `host` marks the designated host on the external-public shared-world route; the
275
276
  // exactly-one-host check runs in externalPublicSharedWorldValidationReason (route context).
276
277
  if (entry.host !== undefined) {
277
278
  if (typeof entry.host !== "boolean") {
@@ -286,7 +287,7 @@ function parseParticipantEntries(raw, actorIndex) {
286
287
  }
287
288
  /**
288
289
  * The researcher's protocol. Each task carries what the participant is asked to do and, optionally,
289
- * the observation that proves it happened — reusing `stopWhen`, so a criterion is exactly as
290
+ * the observation that proves it happened, reusing `stopWhen`, so a criterion is exactly as
290
291
  * expressive as a stop condition and an author who knows one knows the other.
291
292
  *
292
293
  * A task with no `success` is allowed on purpose: some things you ask a participant to do (think
@@ -313,7 +314,7 @@ function parseTasks(raw, field) {
313
314
  seen.add(id);
314
315
  const goal = str(entry.goal);
315
316
  if (goal === undefined) {
316
- return invalid(`\`${field}[${index}].goal\` is required — what the PARTICIPANT is asked to do, in their language.`);
317
+ return invalid(`\`${field}[${index}].goal\` is required: what the participant is asked to do, in their own words.`);
317
318
  }
318
319
  const successResult = parseStopWhen(entry.success, `${field}[${index}].success`);
319
320
  if (!successResult.ok)
@@ -326,7 +327,7 @@ function parseTasks(raw, field) {
326
327
  }
327
328
  return { ok: true, value: tasks };
328
329
  }
329
- /** The bounds a dwell window (#510) must sit inside: at least one frame, at most an hour. */
330
+ /** The bounds a dwell window must sit inside: at least one frame, at most an hour. */
330
331
  const DWELL_MIN_MS = 1_000;
331
332
  const DWELL_MAX_MS = 3_600_000;
332
333
  const DWELL_DEFAULT_EVERY_MS = 10_000;
@@ -1,4 +1,5 @@
1
- import { invalid, isRecord, posInt, str } from "./values.js";
1
+ import { invalid, posInt, str } from "./values.js";
2
+ import { isRecord } from "../../run/type-guards.js";
2
3
  // Fail-loud (never silently swallow a comms setting): a malformed `comms` block returns a parse
3
4
  // failure rather than being dropped.
4
5
  export function parseComms(raw) {
@@ -29,8 +30,8 @@ function parseCommsEmail(raw) {
29
30
  if (raw.kind !== undefined && raw.kind !== "fake") {
30
31
  return invalid("`comms.email.kind` must be `fake`.");
31
32
  }
32
- // external ingress (#328): the ADOPTER runs the catch, so there is no subject env for humanish to
33
- // inject and `injectEnv` becomes meaningless rather than merely unused — the operator points their
33
+ // external ingress: the adopter runs the catch, so there is no subject env for humanish to
34
+ // inject and `injectEnv` has nothing to name: the operator points their
34
35
  // own app at their own catch. Parse it first so the injectEnv requirement can key off it.
35
36
  const external = parseExternalCatch(raw.external);
36
37
  if (!external.ok)
@@ -126,7 +127,7 @@ function parseExternalCatch(raw) {
126
127
  return invalid("`comms.email.external` must be a mapping.");
127
128
  const catchBaseUrl = str(raw.catchBaseUrl);
128
129
  if (catchBaseUrl === undefined) {
129
- return invalid("`comms.email.external.catchBaseUrl` is required — the base URL of the catch YOU run (humanish reads its GET /deliveries and your app POSTs its sends to it).");
130
+ return invalid("`comms.email.external.catchBaseUrl` is required: the base URL of the catch you run. Your app sends its mail to it, and humanish reads GET /deliveries from it.");
130
131
  }
131
132
  for (const [field, value] of [
132
133
  ["catchBaseUrl", catchBaseUrl],
@@ -147,7 +148,7 @@ function parseExternalCatch(raw) {
147
148
  }
148
149
  const authTokenEnv = str(raw.authTokenEnv);
149
150
  if (authTokenEnv !== undefined && !/^[A-Za-z_][A-Za-z0-9_]*$/.test(authTokenEnv)) {
150
- return invalid(`\`comms.email.external.authTokenEnv\` must be a valid env var NAME (got "${authTokenEnv}"); the value is read at runtime and never persisted.`);
151
+ return invalid(`\`comms.email.external.authTokenEnv\` must be an environment variable name, and "${authTokenEnv}" is not one. Its value is read when the run starts and never stored.`);
151
152
  }
152
153
  const inboxBaseUrl = str(raw.inboxBaseUrl);
153
154
  return {
@@ -174,7 +175,7 @@ function parseSmtp(raw) {
174
175
  const hostEnv = envName(raw.hostEnv, "hostEnv");
175
176
  const portEnv = envName(raw.portEnv, "portEnv");
176
177
  if (hostEnv === undefined || portEnv === undefined) {
177
- return invalid("`comms.email.smtp` needs both `hostEnv` and `portEnv` — the subject-env vars your app reads for its SMTP host and port. The harness sets them to its own loopback listener.");
178
+ return invalid("`comms.email.smtp` needs both `hostEnv` and `portEnv`: the environment variables your app reads for its SMTP host and port. humanish sets them to its own loopback listener.");
178
179
  }
179
180
  if (hostEnv.startsWith("__invalid__") || portEnv.startsWith("__invalid__")) {
180
181
  return invalid("`comms.email.smtp.hostEnv` and `portEnv` must be valid env var names.");
@@ -226,7 +227,7 @@ export function addressedRecipients(email) {
226
227
  ? []
227
228
  : [{ participantId: recipient.lane, address: recipient.address }]);
228
229
  }
229
- /** `comms.email.recipients`: which lane each captured address belongs to. */
230
+ /** `comms.email.recipients`: which participant each captured address belongs to. */
230
231
  function parseRecipients(raw) {
231
232
  if (raw === undefined)
232
233
  return { ok: true, value: undefined };
@@ -1,7 +1,8 @@
1
1
  import { resolveAutomaticAnalysis } from "../../analysis/automatic-config.js";
2
2
  import { DEVICE_PRESET_NAMES, isDevicePresetName } from "../device-presets.js";
3
3
  import { isExactRuntimeVersion } from "../../routes/terminal/runtime.js";
4
- import { invalid, isRecord, nonNegNumber, posInt, str } from "./values.js";
4
+ import { invalid, nonNegNumber, posInt, str } from "./values.js";
5
+ import { isRecord } from "../../run/type-guards.js";
5
6
  export function parseExecution(raw) {
6
7
  if (raw === undefined) {
7
8
  return { ok: true, value: undefined };
@@ -32,7 +33,7 @@ export function parseExecution(raw) {
32
33
  }
33
34
  if (desktopResult.value)
34
35
  execution.desktop = desktopResult.value;
35
- // Reuse the terminal lane's caps parser (same shape, not a fork) — a malformed budget is a hard
36
+ // Reuse the terminal route's caps parser (same shape, not a fork); a malformed budget is a hard
36
37
  // error, never silently dropped (a cap that silently does nothing would be a safety lie).
37
38
  const capsResult = parseCaps(raw.caps);
38
39
  if (!capsResult.ok) {
@@ -89,9 +90,9 @@ function parseTerminal(raw) {
89
90
  const transport = str(raw.transport);
90
91
  if (transport !== "exec-stream") {
91
92
  // "pty" is deliberately rejected: stdin is disabled, so the capture is a non-interactive
92
- // exec stream — an interactive-PTY label would overstate the mechanism (invariant 6 + the
93
- // goal packet's PTY ruling). True duplex PTY does not ship.
94
- return invalid("`execution.terminal.transport` must be exec-stream — captured non-interactive exec output (stdin disabled) is not an interactive PTY; true duplex PTY transport is not supported.");
93
+ // exec stream, and an interactive-PTY label would overstate the mechanism. True duplex PTY
94
+ // does not ship.
95
+ return invalid("`execution.terminal.transport` must be exec-stream: the route captures the agent's output with stdin closed, and an interactive terminal (pty) is not supported.");
95
96
  }
96
97
  terminal.transport = transport;
97
98
  }
@@ -102,9 +103,9 @@ function parseTerminal(raw) {
102
103
  }
103
104
  if (stdin === "sent") {
104
105
  // Assisted input is forbidden until the interventions ledger + comparability flag + verify
105
- // check exist (safety contract item 7) — shipping it now would let an assisted run pose as
106
- // autonomous green proof.
107
- return invalid("`execution.terminal.stdin: sent` (assisted input) is not supported — the current route cannot capture assisted input with a non-comparable marker. stdin is disabled by default.");
106
+ // check exist (the terminal route's stdin rule); shipping it now would let an assisted run
107
+ // pose as autonomous green proof.
108
+ return invalid("`execution.terminal.stdin: sent` (assisted input) is not supported: the route cannot yet mark a run that received typed help as different from an unassisted one. Remove the setting; stdin stays closed.");
108
109
  }
109
110
  terminal.stdin = stdin;
110
111
  }
@@ -152,13 +153,13 @@ function parseDesktop(raw) {
152
153
  }
153
154
  desktop.browser = browser;
154
155
  }
155
- // A custom E2B desktop template NAME or ID. Trimmed non-empty when present; deliberately NOT
156
- // allowlisted (any string is a valid template name/id — over-restricting would reject real
156
+ // A custom E2B desktop template name or ID. Trimmed non-empty when present; deliberately not
157
+ // allowlisted (any string is a valid template name/id; over-restricting would reject real
157
158
  // adopter images). An explicitly-set but blank/whitespace value is a mistake, not a template.
158
159
  if (raw.template !== undefined) {
159
160
  const template = str(raw.template);
160
161
  if (template === undefined) {
161
- return invalid("`execution.desktop.template` must be a non-empty E2B desktop template NAME or ID when set (any string is accepted; there is no allowlist).");
162
+ return invalid("`execution.desktop.template` must be a non-empty E2B desktop template name or ID when it is set. Any name is accepted.");
162
163
  }
163
164
  desktop.template = template;
164
165
  }
@@ -246,8 +247,8 @@ export function parseScenario(raw) {
246
247
  }
247
248
  /**
248
249
  * Parse `scenario.caps`. Returns a parse failure on a malformed value rather than silently
249
- * dropping a budget declaration (a cap that silently does nothing would be a safety lie —
250
- * invariant 6). Each cap must be a non-negative finite number.
250
+ * dropping a budget declaration (a cap that silently does nothing would claim protection it
251
+ * does not give). Each cap must be a non-negative finite number.
251
252
  */
252
253
  function parseCaps(raw) {
253
254
  if (raw === undefined) {
@@ -338,7 +339,7 @@ function parseReviewScorer(raw) {
338
339
  return invalid("`review.scorer` must be a mapping with a `ref` path (e.g. { ref: scorers/product.mjs }).");
339
340
  const unknownKeys = Object.keys(raw).filter((key) => key !== "ref");
340
341
  if (unknownKeys.length > 0) {
341
- return invalid(`Unknown \`review.scorer\` field(s): ${unknownKeys.join(", ")}. review.scorer accepts only \`ref\` (a repo-relative scorer-module path).`);
342
+ return invalid(`\`review.scorer\` accepts only \`ref\` (a scorer module path relative to the project), and these fields are unknown: ${unknownKeys.join(", ")}.`);
342
343
  }
343
344
  const ref = str(raw.ref);
344
345
  if (!ref)
@@ -0,0 +1,23 @@
1
+ import { type LabConfigParseFailure } from "../types.js";
2
+ declare const ROUTES: readonly ["preview", "computer-use", "shared-world", "terminal", "scripted"];
3
+ /** A route a study declares. */
4
+ export type StudyRoute = (typeof ROUTES)[number];
5
+ export interface StudyDocument {
6
+ readonly route: StudyRoute;
7
+ /** The same document in the humanish.lab.v2 spelling. */
8
+ readonly v2: Record<string, unknown>;
9
+ /** For each expanded participant, the index of the `participants` entry it came from. */
10
+ readonly participantSource: readonly number[];
11
+ }
12
+ type Parsed<T> = {
13
+ ok: true;
14
+ value: T;
15
+ } | LabConfigParseFailure;
16
+ /** Rewrite a humanish.study.v3 document into humanish.lab.v2, or refuse it. */
17
+ export declare function studyToV2(raw: Record<string, unknown>): Parsed<StudyDocument>;
18
+ /**
19
+ * Spell a v2 parser message the way the study file is written: `actors[0].lanes[3]` becomes the
20
+ * `participants` entry it came from, `execution.caps` and `scenario.caps` become `caps`, and so on.
21
+ */
22
+ export declare function studySpelling(message: string, route: StudyRoute, participantSource: readonly number[]): string;
23
+ export {};