humanish 0.106.1 → 0.108.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (668) hide show
  1. package/ARCHITECTURE.md +38 -32
  2. package/CHANGELOG.md +28 -0
  3. package/CONTEXT.md +51 -41
  4. package/README.md +152 -174
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-client.js +2 -1
  14. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  15. package/dist/actors/codex/app-server-trace.js +1 -3
  16. package/dist/actors/codex/app-server-ui.js +1 -1
  17. package/dist/actors/codex/app-server.js +2 -1
  18. package/dist/actors/codex/codex-admission.d.ts +91 -0
  19. package/dist/actors/codex/codex-admission.js +150 -0
  20. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  21. package/dist/actors/codex/protocol-compat.js +357 -0
  22. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  23. package/dist/actors/codex/protocol-contract.js +471 -0
  24. package/dist/actors/codex/restricted-executable.d.ts +28 -4
  25. package/dist/actors/codex/restricted-executable.js +104 -29
  26. package/dist/actors/codex/restricted-launch.d.ts +9 -2
  27. package/dist/actors/codex/restricted-launch.js +43 -4
  28. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  29. package/dist/actors/codex/restricted-notifications.js +277 -0
  30. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  31. package/dist/actors/codex/restricted-participant.js +66 -6
  32. package/dist/actors/codex/restricted-policy.d.ts +11 -3
  33. package/dist/actors/codex/restricted-policy.js +2 -2
  34. package/dist/actors/codex/restricted-session.d.ts +16 -3
  35. package/dist/actors/codex/restricted-session.js +60 -22
  36. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  37. package/dist/actors/codex/restricted-transport.js +139 -27
  38. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  39. package/dist/actors/codex/restricted-turn.js +43 -30
  40. package/dist/actors/computer-use/actor.d.ts +17 -17
  41. package/dist/actors/computer-use/actor.js +6 -6
  42. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  43. package/dist/actors/computer-use/admission-limit.js +1 -1
  44. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  45. package/dist/actors/computer-use/loop/actions.js +10 -10
  46. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  47. package/dist/actors/computer-use/loop/backstop.js +15 -13
  48. package/dist/actors/computer-use/loop/ending.d.ts +7 -7
  49. package/dist/actors/computer-use/loop/ending.js +9 -9
  50. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  51. package/dist/actors/computer-use/loop/observation.js +9 -9
  52. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  53. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  54. package/dist/actors/computer-use/loop/session.js +3 -3
  55. package/dist/actors/computer-use/loop/spend.d.ts +2 -2
  56. package/dist/actors/computer-use/loop/spend.js +4 -4
  57. package/dist/actors/computer-use/loop/trace.js +11 -10
  58. package/dist/actors/computer-use/loop/types.d.ts +37 -26
  59. package/dist/actors/computer-use/loop/usage.js +2 -2
  60. package/dist/actors/computer-use/loop.js +4 -4
  61. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  62. package/dist/actors/computer-use/openai-context.js +214 -0
  63. package/dist/actors/computer-use/openai-provider.d.ts +12 -9
  64. package/dist/actors/computer-use/openai-provider.js +47 -36
  65. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  66. package/dist/actors/computer-use/openai-requests.js +82 -15
  67. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  68. package/dist/actors/computer-use/openai-wire.js +36 -34
  69. package/dist/actors/contract.d.ts +86 -49
  70. package/dist/actors/contract.js +29 -23
  71. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  72. package/dist/actors/local-agent/claude-session.js +10 -9
  73. package/dist/actors/local-agent/cli.d.ts +8 -6
  74. package/dist/actors/local-agent/cli.js +24 -28
  75. package/dist/actors/local-agent/readiness.d.ts +2 -2
  76. package/dist/actors/local-agent/readiness.js +4 -4
  77. package/dist/actors/reasoning-effort.js +6 -6
  78. package/dist/actors/registry.d.ts +10 -10
  79. package/dist/actors/registry.js +18 -17
  80. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  81. package/dist/actors/scripted-browser/actor.js +16 -16
  82. package/dist/actors/scripted-browser/browser-command.js +1 -1
  83. package/dist/actors/scripted-browser/journey.js +15 -4
  84. package/dist/actors/scripted-browser/steps.js +19 -1
  85. package/dist/actors/scripted-browser/types.d.ts +12 -2
  86. package/dist/actors/stop-conditions.d.ts +1 -1
  87. package/dist/actors/stop-conditions.js +1 -3
  88. package/dist/analysis/automatic-completion.d.ts +13 -8
  89. package/dist/analysis/automatic-completion.js +14 -8
  90. package/dist/analysis/automatic-config.d.ts +1 -1
  91. package/dist/analysis/automatic-config.js +2 -2
  92. package/dist/analysis/automatic.d.ts +10 -4
  93. package/dist/analysis/automatic.js +17 -13
  94. package/dist/analysis/codex-config.d.ts +6 -2
  95. package/dist/analysis/codex-config.js +22 -14
  96. package/dist/analysis/diagnostics.d.ts +23 -0
  97. package/dist/analysis/diagnostics.js +112 -0
  98. package/dist/analysis/evidence-sources.js +2 -2
  99. package/dist/analysis/evidence.js +6 -6
  100. package/dist/analysis/execute.d.ts +7 -1
  101. package/dist/analysis/execute.js +39 -12
  102. package/dist/analysis/job.d.ts +8 -5
  103. package/dist/analysis/job.js +15 -14
  104. package/dist/analysis/load.d.ts +1 -1
  105. package/dist/analysis/load.js +5 -5
  106. package/dist/analysis/provider.d.ts +9 -1
  107. package/dist/analysis/restricted-codex.d.ts +2 -0
  108. package/dist/analysis/restricted-codex.js +10 -1
  109. package/dist/analysis/service.d.ts +2 -0
  110. package/dist/analysis/service.js +35 -16
  111. package/dist/analysis/sharing.d.ts +2 -2
  112. package/dist/analysis/sharing.js +5 -5
  113. package/dist/analysis/store-executions.d.ts +5 -5
  114. package/dist/analysis/store-executions.js +12 -12
  115. package/dist/analysis/store.d.ts +4 -4
  116. package/dist/analysis/store.js +13 -13
  117. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  118. package/dist/cli/commands/analysis-signals.js +4 -1
  119. package/dist/cli/commands/analyze.js +23 -18
  120. package/dist/cli/commands/codex.js +9 -9
  121. package/dist/cli/commands/comms.js +62 -34
  122. package/dist/cli/commands/feedback.js +20 -21
  123. package/dist/cli/commands/lab-format.d.ts +5 -4
  124. package/dist/cli/commands/lab-format.js +35 -23
  125. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  126. package/dist/cli/commands/lab-route-computer-use.js +32 -21
  127. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  128. package/dist/cli/commands/lab-route-preview.js +7 -7
  129. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  130. package/dist/cli/commands/lab-route-run.js +6 -2
  131. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  132. package/dist/cli/commands/lab-route-scripted.js +0 -1
  133. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  134. package/dist/cli/commands/lab-route-shared-world.js +3 -4
  135. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  136. package/dist/cli/commands/lab-route-terminal.js +0 -1
  137. package/dist/cli/commands/lab-run.js +84 -54
  138. package/dist/cli/commands/lab-scorer.d.ts +2 -4
  139. package/dist/cli/commands/lab-scorer.js +1 -1
  140. package/dist/cli/commands/migrate.d.ts +4 -0
  141. package/dist/cli/commands/migrate.js +65 -0
  142. package/dist/cli/commands/observe.js +168 -107
  143. package/dist/cli/commands/run-command.d.ts +10 -0
  144. package/dist/cli/commands/run-command.js +85 -0
  145. package/dist/cli/commands/run-signals.d.ts +30 -0
  146. package/dist/cli/commands/run-signals.js +146 -0
  147. package/dist/cli/commands/runs.js +137 -136
  148. package/dist/cli/commands/setup.d.ts +2 -2
  149. package/dist/cli/commands/setup.js +26 -21
  150. package/dist/cli/commands/study.d.ts +3 -0
  151. package/dist/cli/commands/study.js +182 -0
  152. package/dist/cli/commands/tui.d.ts +4 -4
  153. package/dist/cli/commands/tui.js +21 -21
  154. package/dist/cli/commands/watch.js +64 -77
  155. package/dist/cli/deprecations.d.ts +18 -0
  156. package/dist/cli/deprecations.js +48 -0
  157. package/dist/cli/doctor.d.ts +18 -5
  158. package/dist/cli/doctor.js +111 -48
  159. package/dist/cli/first-run-path.d.ts +12 -10
  160. package/dist/cli/first-run-path.js +30 -28
  161. package/dist/cli/io.d.ts +46 -10
  162. package/dist/cli/io.js +109 -30
  163. package/dist/cli/observer-follow.d.ts +2 -2
  164. package/dist/cli/observer-follow.js +5 -6
  165. package/dist/cli/orientation.d.ts +6 -3
  166. package/dist/cli/orientation.js +43 -39
  167. package/dist/cli/product-sentence.d.ts +6 -0
  168. package/dist/cli/product-sentence.js +6 -0
  169. package/dist/cli/program.d.ts +6 -1
  170. package/dist/cli/program.js +112 -43
  171. package/dist/cli/telemetry.d.ts +17 -17
  172. package/dist/cli/telemetry.js +49 -41
  173. package/dist/cli.js +1 -1
  174. package/dist/comms/capture-surface.d.ts +14 -13
  175. package/dist/comms/capture-surface.js +23 -22
  176. package/dist/comms/catch-host.d.ts +8 -8
  177. package/dist/comms/catch-host.js +14 -14
  178. package/dist/comms/connections.js +4 -4
  179. package/dist/comms/email-catch.d.ts +3 -3
  180. package/dist/comms/email-catch.js +8 -8
  181. package/dist/comms/external-evidence.d.ts +27 -0
  182. package/dist/comms/external-evidence.js +93 -0
  183. package/dist/comms/extract.js +2 -2
  184. package/dist/comms/fake-inbox.d.ts +2 -2
  185. package/dist/comms/fake-inbox.js +2 -2
  186. package/dist/comms/lease-store.js +7 -7
  187. package/dist/comms/receiving-render.d.ts +1 -1
  188. package/dist/comms/receiving-render.js +2 -2
  189. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  190. package/dist/comms/sandbox-catch-script.js +6 -6
  191. package/dist/comms/sandbox-catch.d.ts +36 -37
  192. package/dist/comms/sandbox-catch.js +34 -35
  193. package/dist/comms/setup.js +42 -8
  194. package/dist/comms/thread-evidence.d.ts +1 -1
  195. package/dist/comms/thread-evidence.js +6 -6
  196. package/dist/comms/types.d.ts +6 -6
  197. package/dist/comms/types.js +4 -4
  198. package/dist/evidence/browser-hygiene.d.ts +1 -1
  199. package/dist/evidence/browser-hygiene.js +1 -1
  200. package/dist/evidence/frame-signature.d.ts +1 -1
  201. package/dist/evidence/frame-signature.js +4 -4
  202. package/dist/evidence/redaction.d.ts +3 -3
  203. package/dist/evidence/redaction.js +5 -5
  204. package/dist/evidence/secret-scrub.d.ts +9 -0
  205. package/dist/evidence/secret-scrub.js +96 -0
  206. package/dist/feedback/draft.js +41 -85
  207. package/dist/feedback/export-bundle.js +5 -5
  208. package/dist/feedback/export.d.ts +5 -1
  209. package/dist/feedback/export.js +16 -17
  210. package/dist/feedback/feedback.d.ts +3 -3
  211. package/dist/feedback/feedback.js +21 -3
  212. package/dist/guest/chromium-text.js +2 -2
  213. package/dist/guest/desktop-native.d.ts +1 -1
  214. package/dist/guest/runtime.js +1 -1
  215. package/dist/index.d.ts +14 -15
  216. package/dist/index.js +10 -11
  217. package/dist/keys/key-resolution.d.ts +7 -5
  218. package/dist/keys/key-resolution.js +40 -38
  219. package/dist/lab/adapter-extension.d.ts +35 -13
  220. package/dist/lab/adapter-extension.js +50 -134
  221. package/dist/lab/adapter-scorer-loader.d.ts +32 -12
  222. package/dist/lab/adapter-scorer-loader.js +56 -32
  223. package/dist/lab/composition-rules.js +58 -58
  224. package/dist/lab/config.js +85 -43
  225. package/dist/lab/deprecated-fields.d.ts +10 -0
  226. package/dist/lab/deprecated-fields.js +24 -0
  227. package/dist/lab/device-presets.d.ts +10 -10
  228. package/dist/lab/device-presets.js +11 -11
  229. package/dist/lab/discover.d.ts +13 -9
  230. package/dist/lab/discover.js +118 -60
  231. package/dist/lab/doctor.d.ts +53 -11
  232. package/dist/lab/doctor.js +193 -47
  233. package/dist/lab/init-plan.js +1 -3
  234. package/dist/lab/init-templates.js +147 -147
  235. package/dist/lab/init.d.ts +1 -1
  236. package/dist/lab/init.js +41 -9
  237. package/dist/lab/keys.d.ts +2 -0
  238. package/dist/lab/keys.js +43 -9
  239. package/dist/lab/lab-deps.d.ts +80 -0
  240. package/dist/lab/lab-deps.js +4 -0
  241. package/dist/lab/parse/actors.js +17 -16
  242. package/dist/lab/parse/comms.js +8 -7
  243. package/dist/lab/parse/execution.js +15 -14
  244. package/dist/lab/parse/study-v3.d.ts +23 -0
  245. package/dist/lab/parse/study-v3.js +259 -0
  246. package/dist/lab/parse/subject-state.d.ts +7 -7
  247. package/dist/lab/parse/subject-state.js +18 -17
  248. package/dist/lab/parse/subject.js +30 -29
  249. package/dist/lab/parse/values.d.ts +1 -2
  250. package/dist/lab/parse/values.js +3 -6
  251. package/dist/lab/persona-resolve.d.ts +7 -7
  252. package/dist/lab/persona-resolve.js +8 -8
  253. package/dist/lab/persona.js +1 -3
  254. package/dist/lab/plan-base.d.ts +0 -2
  255. package/dist/lab/plan-base.js +6 -4
  256. package/dist/lab/plan-participants.d.ts +7 -7
  257. package/dist/lab/plan-participants.js +2 -2
  258. package/dist/lab/plan-types.d.ts +26 -8
  259. package/dist/lab/plan.d.ts +4 -18
  260. package/dist/lab/plan.js +24 -79
  261. package/dist/lab/preflight-probes.js +11 -11
  262. package/dist/lab/preflight-result.d.ts +2 -1
  263. package/dist/lab/preflight-result.js +5 -6
  264. package/dist/lab/preflight.d.ts +7 -8
  265. package/dist/lab/preflight.js +6 -6
  266. package/dist/lab/requirements.d.ts +20 -0
  267. package/dist/lab/requirements.js +54 -0
  268. package/dist/lab/route-inputs.d.ts +23 -12
  269. package/dist/lab/route-inputs.js +48 -51
  270. package/dist/lab/routing.d.ts +42 -41
  271. package/dist/lab/routing.js +66 -68
  272. package/dist/lab/run-lab-events.d.ts +3 -11
  273. package/dist/lab/run-lab-events.js +2 -16
  274. package/dist/lab/run-lab-homes.d.ts +76 -0
  275. package/dist/lab/run-lab-homes.js +7 -0
  276. package/dist/lab/run-lab-options.d.ts +12 -66
  277. package/dist/lab/run-lab-options.js +58 -285
  278. package/dist/lab/summary.d.ts +15 -9
  279. package/dist/lab/summary.js +24 -17
  280. package/dist/lab/tasks.d.ts +15 -15
  281. package/dist/lab/tasks.js +14 -14
  282. package/dist/lab/types.d.ts +201 -195
  283. package/dist/lab/types.js +2 -0
  284. package/dist/lab/validation.d.ts +21 -21
  285. package/dist/lab/validation.js +61 -59
  286. package/dist/lab/warnings.d.ts +10 -0
  287. package/dist/lab/warnings.js +70 -41
  288. package/dist/library-aliases.d.ts +56 -0
  289. package/dist/library-aliases.js +22 -0
  290. package/dist/observer/artifact.d.ts +2 -2
  291. package/dist/observer/artifact.js +9 -9
  292. package/dist/observer/data.d.ts +6 -6
  293. package/dist/observer/data.js +7 -6
  294. package/dist/observer/exposure.d.ts +1 -1
  295. package/dist/observer/exposure.js +11 -11
  296. package/dist/observer/http.js +1 -1
  297. package/dist/observer/library.d.ts +1 -1
  298. package/dist/observer/library.js +4 -2
  299. package/dist/observer/listen.js +5 -4
  300. package/dist/observer/render.d.ts +1 -1
  301. package/dist/observer/render.js +12 -7
  302. package/dist/observer/run-routes.d.ts +4 -4
  303. package/dist/observer/run-routes.js +6 -6
  304. package/dist/observer/serve.d.ts +17 -0
  305. package/dist/observer/serve.js +41 -6
  306. package/dist/observer/tunnel.js +1 -1
  307. package/dist/observer-app.html +4 -4
  308. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  309. package/dist/routes/computer-use/bundle-parts.js +24 -17
  310. package/dist/routes/computer-use/bundle.d.ts +4 -11
  311. package/dist/routes/computer-use/bundle.js +12 -18
  312. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  313. package/dist/routes/computer-use/diagnostics.js +1 -1
  314. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
  315. package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
  316. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  317. package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
  318. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
  319. package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
  320. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  321. package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
  322. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  323. package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
  324. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  325. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  326. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  327. package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
  328. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  329. package/dist/routes/computer-use/external-comms.js +19 -43
  330. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  331. package/dist/routes/computer-use/fanout-bundle.js +38 -42
  332. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
  333. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  334. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  335. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  336. package/dist/routes/computer-use/live-flush.js +20 -28
  337. package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
  338. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
  339. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  340. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  341. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  342. package/dist/routes/computer-use/local-vm.js +40 -67
  343. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  344. package/dist/routes/computer-use/participant-desktop.js +5 -25
  345. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
  346. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
  347. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  348. package/dist/routes/computer-use/participant-facts.js +12 -1
  349. package/dist/routes/computer-use/participant-model.d.ts +25 -11
  350. package/dist/routes/computer-use/participant-model.js +76 -34
  351. package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
  352. package/dist/routes/computer-use/participant-prompt.js +8 -8
  353. package/dist/routes/computer-use/participant-runs.d.ts +11 -11
  354. package/dist/routes/computer-use/participant-runs.js +18 -18
  355. package/dist/routes/computer-use/plan.d.ts +21 -29
  356. package/dist/routes/computer-use/plan.js +70 -78
  357. package/dist/routes/computer-use/preflight.d.ts +3 -5
  358. package/dist/routes/computer-use/preflight.js +40 -36
  359. package/dist/routes/computer-use/rerun-selection.js +11 -7
  360. package/dist/routes/computer-use/result.d.ts +1 -1
  361. package/dist/routes/computer-use/result.js +48 -38
  362. package/dist/routes/computer-use/route.d.ts +5 -5
  363. package/dist/routes/computer-use/route.js +36 -33
  364. package/dist/routes/computer-use/self-report.d.ts +8 -8
  365. package/dist/routes/computer-use/self-report.js +33 -33
  366. package/dist/routes/computer-use/setup.d.ts +9 -15
  367. package/dist/routes/computer-use/setup.js +106 -83
  368. package/dist/routes/computer-use/single-bundle.d.ts +13 -16
  369. package/dist/routes/computer-use/single-bundle.js +46 -53
  370. package/dist/routes/computer-use/subject-projection.d.ts +6 -8
  371. package/dist/routes/computer-use/subject-projection.js +24 -23
  372. package/dist/routes/computer-use/types.d.ts +195 -238
  373. package/dist/routes/computer-use/types.js +21 -13
  374. package/dist/routes/preview.d.ts +8 -2
  375. package/dist/routes/preview.js +8 -5
  376. package/dist/routes/scripted/bundle.d.ts +5 -8
  377. package/dist/routes/scripted/bundle.js +23 -27
  378. package/dist/routes/scripted/plan.d.ts +6 -8
  379. package/dist/routes/scripted/plan.js +15 -13
  380. package/dist/routes/scripted/result.d.ts +4 -1
  381. package/dist/routes/scripted/result.js +15 -11
  382. package/dist/routes/scripted/route.js +15 -17
  383. package/dist/routes/scripted/scenario.d.ts +1 -1
  384. package/dist/routes/scripted/scenario.js +3 -3
  385. package/dist/routes/scripted/setup.d.ts +3 -2
  386. package/dist/routes/scripted/setup.js +27 -26
  387. package/dist/routes/scripted/subject.d.ts +8 -3
  388. package/dist/routes/scripted/subject.js +10 -6
  389. package/dist/routes/scripted/surface-records.js +4 -4
  390. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  391. package/dist/routes/scripted/surface-sessions.js +4 -4
  392. package/dist/routes/scripted/types.d.ts +21 -40
  393. package/dist/routes/scripted/types.js +2 -3
  394. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
  395. package/dist/routes/shared-world/bundle.d.ts +7 -7
  396. package/dist/routes/shared-world/bundle.js +60 -62
  397. package/dist/routes/shared-world/checkpoints.d.ts +5 -5
  398. package/dist/routes/shared-world/checkpoints.js +5 -5
  399. package/dist/routes/shared-world/comms.d.ts +8 -7
  400. package/dist/routes/shared-world/comms.js +38 -51
  401. package/dist/routes/shared-world/external-public.d.ts +6 -5
  402. package/dist/routes/shared-world/external-public.js +28 -25
  403. package/dist/routes/shared-world/handoff.d.ts +10 -9
  404. package/dist/routes/shared-world/handoff.js +89 -81
  405. package/dist/routes/shared-world/lobby-code.d.ts +7 -7
  406. package/dist/routes/shared-world/lobby-code.js +22 -22
  407. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
  408. package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
  409. package/dist/routes/shared-world/plan.d.ts +2 -6
  410. package/dist/routes/shared-world/plan.js +8 -9
  411. package/dist/routes/shared-world/provenance.d.ts +4 -4
  412. package/dist/routes/shared-world/provenance.js +4 -4
  413. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  414. package/dist/routes/shared-world/provisioned.js +55 -48
  415. package/dist/routes/shared-world/result.js +47 -36
  416. package/dist/routes/shared-world/route.js +54 -57
  417. package/dist/routes/shared-world/setup.d.ts +6 -5
  418. package/dist/routes/shared-world/setup.js +16 -18
  419. package/dist/routes/shared-world/types.d.ts +70 -141
  420. package/dist/routes/shared-world/types.js +5 -5
  421. package/dist/routes/terminal/adapter.d.ts +10 -10
  422. package/dist/routes/terminal/adapter.js +32 -129
  423. package/dist/routes/terminal/bundle.d.ts +10 -15
  424. package/dist/routes/terminal/bundle.js +43 -52
  425. package/dist/routes/terminal/credentials.d.ts +4 -4
  426. package/dist/routes/terminal/credentials.js +20 -20
  427. package/dist/routes/terminal/dry-run.d.ts +1 -1
  428. package/dist/routes/terminal/dry-run.js +13 -15
  429. package/dist/routes/terminal/encoding.d.ts +1 -1
  430. package/dist/routes/terminal/encoding.js +4 -4
  431. package/dist/routes/terminal/ledger.d.ts +8 -8
  432. package/dist/routes/terminal/ledger.js +22 -22
  433. package/dist/routes/terminal/live-finish.d.ts +1 -2
  434. package/dist/routes/terminal/live-finish.js +24 -23
  435. package/dist/routes/terminal/live-sandbox.d.ts +3 -2
  436. package/dist/routes/terminal/live-sandbox.js +31 -32
  437. package/dist/routes/terminal/participant-text.d.ts +23 -0
  438. package/dist/routes/terminal/participant-text.js +165 -0
  439. package/dist/routes/terminal/persona.js +1 -1
  440. package/dist/routes/terminal/plan.d.ts +2 -6
  441. package/dist/routes/terminal/plan.js +23 -19
  442. package/dist/routes/terminal/recorder.d.ts +6 -1
  443. package/dist/routes/terminal/recorder.js +12 -4
  444. package/dist/routes/terminal/result.js +12 -12
  445. package/dist/routes/terminal/route.js +30 -31
  446. package/dist/routes/terminal/runtime.d.ts +3 -2
  447. package/dist/routes/terminal/runtime.js +3 -3
  448. package/dist/routes/terminal/sandbox.d.ts +4 -4
  449. package/dist/routes/terminal/sandbox.js +10 -10
  450. package/dist/routes/terminal/session.js +22 -19
  451. package/dist/routes/terminal/token-usage.d.ts +1 -1
  452. package/dist/routes/terminal/token-usage.js +10 -11
  453. package/dist/routes/terminal/trace.d.ts +7 -10
  454. package/dist/routes/terminal/trace.js +11 -66
  455. package/dist/routes/terminal/types.d.ts +104 -114
  456. package/dist/routes/terminal/types.js +12 -7
  457. package/dist/run/active-runs.d.ts +13 -0
  458. package/dist/run/active-runs.js +12 -0
  459. package/dist/run/bundle-shape.d.ts +2 -1
  460. package/dist/run/bundle-shape.js +7 -7
  461. package/dist/run/bundle.d.ts +99 -92
  462. package/dist/run/bundle.js +10 -8
  463. package/dist/run/cost-summary.js +6 -5
  464. package/dist/run/costs.d.ts +6 -6
  465. package/dist/run/costs.js +17 -11
  466. package/dist/run/detail.d.ts +9 -9
  467. package/dist/run/detail.js +10 -10
  468. package/dist/run/dry-run-inputs.js +1 -1
  469. package/dist/run/dry-run.js +23 -30
  470. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  471. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  472. package/dist/run/feedback-shape.js +1 -1
  473. package/dist/run/judge.d.ts +34 -16
  474. package/dist/run/judge.js +41 -14
  475. package/dist/run/locate.d.ts +2 -0
  476. package/dist/run/locate.js +3 -1
  477. package/dist/run/outcomes.d.ts +3 -3
  478. package/dist/run/outcomes.js +3 -3
  479. package/dist/run/participant-records.d.ts +2 -2
  480. package/dist/run/participant-records.js +2 -2
  481. package/dist/run/paths.d.ts +1 -1
  482. package/dist/run/paths.js +2 -2
  483. package/dist/run/pricing.d.ts +30 -15
  484. package/dist/run/pricing.js +49 -30
  485. package/dist/run/projection.d.ts +27 -27
  486. package/dist/run/projection.js +23 -23
  487. package/dist/run/reclaim.d.ts +6 -0
  488. package/dist/run/reclaim.js +15 -5
  489. package/dist/run/results.d.ts +5 -5
  490. package/dist/run/run-index.d.ts +9 -7
  491. package/dist/run/run-index.js +24 -25
  492. package/dist/run/run-not-found.d.ts +5 -0
  493. package/dist/run/run-not-found.js +15 -0
  494. package/dist/run/run.d.ts +7 -4
  495. package/dist/run/run.js +10 -6
  496. package/dist/run/sandbox-receipts.d.ts +5 -5
  497. package/dist/run/sandbox-receipts.js +6 -6
  498. package/dist/run/shared-world-evidence.d.ts +67 -66
  499. package/dist/run/shared-world-evidence.js +4 -4
  500. package/dist/run/shared-world-shape.d.ts +3 -3
  501. package/dist/run/shared-world-shape.js +16 -16
  502. package/dist/run/stats.d.ts +17 -11
  503. package/dist/run/stats.js +124 -66
  504. package/dist/run/status.d.ts +21 -32
  505. package/dist/run/status.js +34 -33
  506. package/dist/run/stored-runs.js +2 -1
  507. package/dist/run/stream-shape.js +1 -1
  508. package/dist/run/streams.d.ts +29 -22
  509. package/dist/run/study-provenance.d.ts +47 -0
  510. package/dist/run/study-provenance.js +63 -0
  511. package/dist/run/study-result.d.ts +16 -0
  512. package/dist/run/study-result.js +9 -0
  513. package/dist/run/terminal-contract.d.ts +5 -5
  514. package/dist/run/terminal-contract.js +4 -4
  515. package/dist/run/text.d.ts +2 -0
  516. package/dist/run/text.js +4 -0
  517. package/dist/run/transient-comms-secrets.d.ts +5 -0
  518. package/dist/run/transient-comms-secrets.js +12 -0
  519. package/dist/run-lab.d.ts +40 -38
  520. package/dist/run-lab.js +42 -40
  521. package/dist/study/convert.d.ts +33 -0
  522. package/dist/study/convert.js +432 -0
  523. package/dist/study/field-paths.d.ts +12 -0
  524. package/dist/study/field-paths.js +126 -0
  525. package/dist/study/files.d.ts +26 -0
  526. package/dist/study/files.js +43 -0
  527. package/dist/study/migrate.d.ts +48 -0
  528. package/dist/study/migrate.js +408 -0
  529. package/dist/study/owned-files.d.ts +38 -0
  530. package/dist/study/owned-files.js +182 -0
  531. package/dist/subject/clone.d.ts +1 -1
  532. package/dist/subject/desktop-cli.d.ts +2 -2
  533. package/dist/subject/desktop-cli.js +3 -3
  534. package/dist/subject/local-tree-archive.d.ts +1 -1
  535. package/dist/subject/local-tree-archive.js +5 -5
  536. package/dist/subject/local-tree.d.ts +3 -3
  537. package/dist/subject/local-tree.js +1 -1
  538. package/dist/subject/node-bootstrap.d.ts +1 -1
  539. package/dist/subject/node-bootstrap.js +4 -4
  540. package/dist/subject/runtime.js +10 -11
  541. package/dist/subject/serve.d.ts +1 -1
  542. package/dist/subject/serve.js +4 -4
  543. package/dist/subject/state.d.ts +1 -1
  544. package/dist/subject/steps.d.ts +8 -8
  545. package/dist/subject/steps.js +7 -7
  546. package/dist/substrates/command-failure.d.ts +3 -3
  547. package/dist/substrates/command-failure.js +3 -3
  548. package/dist/substrates/detached.d.ts +6 -6
  549. package/dist/substrates/detached.js +7 -7
  550. package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
  551. package/dist/substrates/e2b/cdp-probe.js +15 -18
  552. package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
  553. package/dist/substrates/e2b/desktop-browser.js +12 -12
  554. package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
  555. package/dist/substrates/e2b/desktop-cdp.js +11 -11
  556. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  557. package/dist/substrates/e2b/desktop-executor.js +1 -1
  558. package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
  559. package/dist/substrates/e2b/desktop-geometry.js +9 -9
  560. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  561. package/dist/substrates/e2b/desktop-media.js +3 -3
  562. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  563. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  564. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  565. package/dist/substrates/e2b/sandbox.js +2 -2
  566. package/dist/substrates/e2b/sdk.d.ts +11 -11
  567. package/dist/substrates/e2b/sdk.js +8 -8
  568. package/dist/substrates/local/runtime-host.d.ts +2 -0
  569. package/dist/substrates/local/runtime-host.js +6 -0
  570. package/dist/tui/actions.d.ts +8 -6
  571. package/dist/tui/actions.js +31 -22
  572. package/dist/tui/contract.d.ts +16 -16
  573. package/dist/tui/contract.js +10 -10
  574. package/dist/tui/launch.d.ts +4 -4
  575. package/dist/tui/launch.js +18 -19
  576. package/dist/tui/project.js +5 -5
  577. package/dist/tui-app.js +83 -83
  578. package/dist/verify/actor.d.ts +14 -14
  579. package/dist/verify/actor.js +45 -45
  580. package/dist/verify/artifacts.d.ts +3 -3
  581. package/dist/verify/artifacts.js +6 -6
  582. package/dist/verify/context-growth.d.ts +9 -0
  583. package/dist/verify/context-growth.js +62 -0
  584. package/dist/verify/costs.d.ts +7 -7
  585. package/dist/verify/costs.js +9 -9
  586. package/dist/verify/liveness.d.ts +1 -1
  587. package/dist/verify/liveness.js +4 -1
  588. package/dist/verify/rerun.d.ts +1 -1
  589. package/dist/verify/rerun.js +1 -1
  590. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  591. package/dist/verify/shared-world-concurrent.js +79 -76
  592. package/dist/verify/shared-world.d.ts +2 -2
  593. package/dist/verify/shared-world.js +18 -18
  594. package/dist/verify/subject.d.ts +4 -4
  595. package/dist/verify/subject.js +18 -18
  596. package/dist/verify/verify.js +98 -49
  597. package/docs/README.md +26 -33
  598. package/docs/architecture/actor-contract.md +105 -98
  599. package/docs/architecture/desktop-sessions.md +14 -14
  600. package/docs/architecture/external-public-shared-world.md +66 -59
  601. package/docs/architecture/github-feedback-loop.md +1 -4
  602. package/docs/architecture/guest-desktop.md +2 -2
  603. package/docs/architecture/observer.md +37 -37
  604. package/docs/architecture/restricted-codex-analysis.md +70 -30
  605. package/docs/architecture/serve.md +34 -37
  606. package/docs/architecture/state-driven-executor.md +55 -59
  607. package/docs/architecture/task-protocol-support.md +7 -9
  608. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
  609. package/docs/contracts/README.md +24 -0
  610. package/docs/contracts/adapter-admission.md +3 -3
  611. package/docs/contracts/adapter-fixtures.md +2 -5
  612. package/docs/contracts/core.md +1 -3
  613. package/docs/contracts/errors.md +62 -0
  614. package/docs/contracts/feedback.md +8 -9
  615. package/docs/contracts/policy.md +7 -12
  616. package/docs/contracts/run-bundle.md +54 -51
  617. package/docs/contracts/schemas.md +505 -390
  618. package/docs/contracts/study-analysis.md +26 -2
  619. package/docs/contracts/study-costs.md +11 -7
  620. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  621. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  622. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  623. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  624. package/docs/principles/actor-fidelity.md +4 -4
  625. package/docs/principles/engineering.md +3 -3
  626. package/docs/principles/invariants-and-defaults.md +38 -38
  627. package/docs/principles/self-driving-harness.md +1 -5
  628. package/docs/principles/three-roles.md +1 -1
  629. package/docs/product/automatic-analysis.md +8 -7
  630. package/examples/participant/README.md +5 -5
  631. package/examples/participant/run.mjs +11 -10
  632. package/examples/scorer/README.md +3 -3
  633. package/examples/scorer/run.mjs +11 -12
  634. package/package.json +16 -17
  635. package/skills/humanish/SKILL.md +63 -60
  636. package/skills/humanish/agents/openai.yaml +1 -1
  637. package/AGENTS.md +0 -99
  638. package/CONTRIBUTING.md +0 -148
  639. package/dist/actors/codex/qualified-versions.d.ts +0 -45
  640. package/dist/actors/codex/qualified-versions.js +0 -87
  641. package/dist/cli/commands/lab.d.ts +0 -3
  642. package/dist/cli/commands/lab.js +0 -193
  643. package/dist/deprecated.d.ts +0 -90
  644. package/dist/deprecated.js +0 -106
  645. package/dist/lab/bag-overrides.d.ts +0 -18
  646. package/dist/lab/bag-overrides.js +0 -121
  647. package/dist/observer/static.d.ts +0 -39
  648. package/dist/observer/static.js +0 -369
  649. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  650. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  651. package/docs/architecture/comms-inbox.md +0 -122
  652. package/docs/architecture/desktop-recording.md +0 -80
  653. package/docs/architecture/local-browser-runtime.md +0 -178
  654. package/docs/architecture/observer-review.md +0 -144
  655. package/docs/architecture/participant-media.md +0 -90
  656. package/docs/architecture/project-layout.md +0 -62
  657. package/docs/architecture/real-email-receiving.md +0 -136
  658. package/docs/assets/humanish-drawdb-hero.png +0 -0
  659. package/docs/assets/humanish-observer-hero.png +0 -0
  660. package/docs/goals/current.md +0 -207
  661. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  662. package/docs/product/open-source-install-experience.md +0 -240
  663. package/docs/ramp/README.md +0 -294
  664. package/docs/release/open-source-readiness.md +0 -222
  665. package/docs/release/public-readiness-standard.md +0 -210
  666. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  667. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  668. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -10,20 +10,20 @@ import { isCuaProviderFailurePhase, } from "./computer-use/provider-error.js";
10
10
  // their own modules.
11
11
  export const ACTOR_TRACE_SCHEMA = "humanish.actor-trace.v1";
12
12
  /**
13
- * How a session ended, from the point of view of the STUDY rather than the harness.
13
+ * How a session ended, from the point of view of the study rather than the harness.
14
14
  *
15
15
  * The distinction matters because two of these are participant outcomes and the rest are not. A
16
16
  * participant who abandons a task is the single most valuable thing a usability study produces, and
17
- * recording that as `failed` — as this type used to force — reads as the instrument breaking. See
17
+ * recording that as `failed` reads as the instrument breaking. See
18
18
  * docs/principles/three-roles.md.
19
19
  *
20
20
  * - `passed` the participant reached the goal
21
- * - `abandoned` the participant stopped trying. A FINDING, not a malfunction
21
+ * - `abandoned` the participant stopped trying. A finding, not a malfunction
22
22
  * - `incomplete` the session ended (time or budget) before the goal was reached
23
23
  * - `blocked` the participant could not proceed: an approval the run could not give, or a
24
- * blocker they described in their own final words (#476)
24
+ * blocker they described in their own final words
25
25
  * - `timed_out` the session hit its deadline with no productive activity at all
26
- * - `failed` the HARNESS failed: a dead sandbox, a provider error, a broken artifact
26
+ * - `failed` the harness failed: a dead sandbox, a provider error, a broken artifact
27
27
  */
28
28
  export const ACTOR_STATUSES = [
29
29
  "passed",
@@ -33,7 +33,7 @@ export const ACTOR_STATUSES = [
33
33
  "timed_out",
34
34
  "failed",
35
35
  ];
36
- /** Statuses that describe what happened to a PARTICIPANT rather than a harness malfunction. Verify
36
+ /** Statuses that describe what happened to a participant rather than a harness malfunction. Verify
37
37
  * treats these as study results, so a run whose evidence is sound is not called untrustworthy just
38
38
  * because a persona gave up. */
39
39
  export const PARTICIPANT_OUTCOME_STATUSES = ["abandoned", "incomplete"];
@@ -55,18 +55,23 @@ export const ACTOR_STOP_CAUSES = [
55
55
  "usage_unreported",
56
56
  ];
57
57
  /**
58
- * Codex CLI releases a recorded account profile may name. Append-only: a release can leave the
59
- * launch lists in codex/qualified-versions.ts, but saved bundles naming it stay readable.
58
+ * The oldest Codex CLI release a recorded account profile may name. Readers accept every stable
59
+ * `MAJOR.MINOR.PATCH` release from it on, so a saved bundle stays readable whichever release
60
+ * recorded it; launch admission (codex/codex-admission.ts) alone decides what runs.
60
61
  */
61
- export const RECORDED_CODEX_CLI_VERSIONS = [
62
- "0.154.0",
63
- "0.157.1",
64
- "0.159.2",
65
- "0.159.3",
66
- "0.160.0",
67
- ];
62
+ export const RECORDED_CODEX_CLI_FLOOR = "0.154.0";
63
+ /** A stable release at or above the floor. Parts compare as digit strings, exact at any length. */
68
64
  export function isRecordedCodexCliVersion(value) {
69
- return RECORDED_CODEX_CLI_VERSIONS.some((version) => version === value);
65
+ if (typeof value !== "string" || !/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/.test(value))
66
+ return false;
67
+ const release = value.split("."), floor = RECORDED_CODEX_CLI_FLOOR.split(".");
68
+ for (const [index, part] of release.entries()) {
69
+ const order = part.length - floor[index].length ||
70
+ (part === floor[index] ? 0 : part > floor[index] ? 1 : -1);
71
+ if (order !== 0)
72
+ return order > 0;
73
+ }
74
+ return true;
70
75
  }
71
76
  /** Durable reader profile. Append new qualified profiles; never rewrite old evidence. */
72
77
  export function validActorExecutionProfile(value) {
@@ -174,7 +179,7 @@ export const CODEX_APP_SERVER_CAPABILITIES = {
174
179
  license: "open",
175
180
  };
176
181
  // Scripted browser driver (src/actors/scripted-browser/): deterministic Playwright step
177
- // replay against a loopback app. byoModel is false because there is NO model — the committed
182
+ // replay against a loopback app. byoModel is false because there is no model: the committed
178
183
  // scenario steps are the whole behavior; tokenUsage on its traces records zeros by mechanism.
179
184
  export const SCRIPTED_BROWSER_CAPABILITIES = {
180
185
  headless: true,
@@ -188,12 +193,13 @@ export const SCRIPTED_BROWSER_CAPABILITIES = {
188
193
  };
189
194
  // Terminal agent (src/routes/terminal/route.ts): a real autonomous coding agent (Codex) discovering
190
195
  // and using a CLI/product from inside an E2B shell, capturing its non-interactive exec output as
191
- // a redacted event stream + normalized transcript. The "terminal" lane is the autonomous-agent
192
- // study lane (distinct from "code", the operator-machine Codex lanes). byoModel is false: the
193
- // agent runs its own model via the command-scoped runtime auth, not a humanish-supplied provider.
194
- // keyPlacement is "in-sandbox-command-scoped" — the load-bearing inversion of every existing
195
- // E2B route's external-key default (the agent is the keyed process and it runs INSIDE). The
196
- // terminal-product live route enforces the boundary before sandbox creation.
196
+ // a redacted event stream + normalized transcript. The "terminal" run kind is the
197
+ // autonomous-agent study run kind (distinct from "code", the operator-machine Codex
198
+ // actors). byoModel is false: the agent runs its own model via the command-scoped runtime
199
+ // auth, not a humanish-supplied provider. keyPlacement is "in-sandbox-command-scoped": the
200
+ // inversion of every other E2B route's external-key default (the agent is the keyed process and it
201
+ // runs inside the sandbox). The terminal-product live route enforces the boundary before sandbox
202
+ // creation.
197
203
  export const TERMINAL_AGENT_CAPABILITIES = {
198
204
  headless: true,
199
205
  structuredTrace: true,
@@ -34,7 +34,7 @@ export interface ClaudeSession {
34
34
  export declare function userMessage(text: string): JsonObject;
35
35
  /**
36
36
  * Start one Claude Code session and return a provider that spends it, one user message per
37
- * computer-use turn. Started EAGERLY (before the first screenshot) so the CLI's own boot is paid
37
+ * computer-use turn. Started eagerly (before the first screenshot) so the CLI's own boot is paid
38
38
  * while the sandbox is still settling rather than inside turn one.
39
39
  */
40
40
  export declare function startClaudeSession(options?: ClaudeSessionOptions): Promise<ClaudeSession>;
@@ -1,20 +1,20 @@
1
- // ONE Claude Code process as the computer-use brain, instead of a fresh `claude -p` per turn.
1
+ // One Claude Code process as the computer-use brain, instead of a fresh `claude -p` per turn.
2
2
  //
3
- // WHY (#520): `actors[].localAgent: codex` already runs through a persistent app-server thread,
4
- // so the participant remembers what it tried. `claude` spawned `claude -p` per turn, so EVERY
3
+ // Why: `actors[].localAgent: codex` already runs through a persistent app-server thread,
4
+ // so the participant remembers what it tried. `claude` spawned `claude -p` per turn, so every
5
5
  // turn started cold. Measured on the same lab with the same credentials (n=1 each): one-shot,
6
6
  // 188 actions over 90 turns and never finished; a thread that remembers, 21 actions over 8 turns
7
7
  // and goal_satisfied in 103 s. A participant that cannot remember trying the menu tries the menu
8
8
  // again. Until this existed, comparing the two agents measured the transport, not the model.
9
9
  //
10
- // THE MECHANISM, checked on this machine before it was written: `claude -p --input-format
10
+ // The mechanism, checked on this machine before it was written: `claude -p --input-format
11
11
  // stream-json --output-format stream-json --verbose` is a bidirectional session over stdio. One
12
12
  // NDJSON `user` message in, a stream of `system` / `assistant` / `result` messages out, then it
13
13
  // waits for the next `user` message with the conversation intact. Two messages, one session id,
14
14
  // and a codeword given in the first turn was recalled in the second. `--allowedTools Read` keeps
15
15
  // the bound the one-shot version had: it looks at a picture, and that is all it can do.
16
16
  //
17
- // What this is NOT: a change to the loop, the executor, the trace, or the Observer. Only where
17
+ // What this is not: a change to the loop, the executor, the trace, or the Observer. Only where
18
18
  // the next action comes from.
19
19
  import { spawn } from "node:child_process";
20
20
  import { randomUUID } from "node:crypto";
@@ -221,7 +221,7 @@ export function userMessage(text) {
221
221
  }
222
222
  /**
223
223
  * Start one Claude Code session and return a provider that spends it, one user message per
224
- * computer-use turn. Started EAGERLY (before the first screenshot) so the CLI's own boot is paid
224
+ * computer-use turn. Started eagerly (before the first screenshot) so the CLI's own boot is paid
225
225
  * while the sandbox is still settling rather than inside turn one.
226
226
  */
227
227
  export async function startClaudeSession(options = {}) {
@@ -240,7 +240,7 @@ export async function startClaudeSession(options = {}) {
240
240
  "stream-json",
241
241
  // Required for stream-json output in -p mode; it is what makes the per-turn `result` visible.
242
242
  "--verbose",
243
- // Read is the only tool it needs — the screenshot — and the only one it gets.
243
+ // Read is the only tool it needs (the screenshot) and the only one it gets.
244
244
  "--allowedTools",
245
245
  "Read",
246
246
  ...(options.model === undefined ? [] : ["--model", options.model]),
@@ -274,6 +274,7 @@ export async function startClaudeSession(options = {}) {
274
274
  : `\n\nNote from the harness: ${request.contextHint}`;
275
275
  // The persona and the reply shape are in the conversation after turn one; re-sending them
276
276
  // every turn is what the one-shot version had to do, and it is most of what it cost.
277
+ // prose-check: model prompt (the participant model reads this, not a person)
277
278
  const text = turnIndex === 1
278
279
  ? promptFor(request, shot)
279
280
  : `Read the image file ${shot}. That is the CURRENT SCREEN, after your last actions took effect. ` +
@@ -316,7 +317,7 @@ export async function startClaudeSession(options = {}) {
316
317
  export function turnFromResult(result) {
317
318
  if (result.is_error === true ||
318
319
  (typeof result.subtype === "string" && result.subtype !== "success")) {
319
- // A turn that errored is a BROKEN turn, never an empty one: an empty turn reads to the loop
320
+ // A turn that errored is a broken turn, never an empty one: an empty turn reads to the loop
320
321
  // as "the participant chose to do nothing".
321
322
  throw new Error(`Claude Code turn ended ${String(result.subtype ?? "in error")}: ${String(result.result ?? "").slice(0, 160)}`);
322
323
  }
@@ -354,7 +355,7 @@ export function turnFromResult(result) {
354
355
  ...(typeof parsed.message === "string" && parsed.message.length > 0
355
356
  ? { message: parsed.message }
356
357
  : {}),
357
- // Claude Code reports its token counts per turn (#531). They are recorded as counts; the
358
+ // Claude Code reports its token counts per turn. They are recorded as counts; the
358
359
  // run's cost line stays "not priced", because a subscription is not a rate card.
359
360
  ...(input === undefined && output === undefined
360
361
  ? {}
@@ -20,7 +20,7 @@ interface RawAction {
20
20
  ms?: number | null;
21
21
  }
22
22
  /**
23
- * Map the agent's answer onto the harness action vocabulary. Anything unrecognized is DROPPED
23
+ * Map the agent's answer onto the harness action vocabulary. Anything unrecognized is dropped
24
24
  * rather than guessed at: a coordinate we invented would be recorded as the participant's choice.
25
25
  */
26
26
  export declare function toCuaActions(raw: readonly RawAction[]): CuaAction[];
@@ -29,7 +29,7 @@ export declare function declaredOutcomeOf(value: unknown): ParticipantDeclaredOu
29
29
  /**
30
30
  * Pull the JSON object out of whatever the CLI printed: clean JSON, a Claude Code envelope, or an
31
31
  * answer wrapped in a ```json fence. A response with no object at all is a turn error, never an
32
- * empty turn — an empty turn would read to the loop as "the participant chose to do nothing".
32
+ * empty turn: an empty turn would read to the loop as "the participant chose to do nothing".
33
33
  */
34
34
  export declare function parseAgentJson(text: string): Record<string, unknown>;
35
35
  export interface SpawnResult {
@@ -74,7 +74,7 @@ export interface DetectedLocalAgent extends LocalAgentDescriptor {
74
74
  /** Resolved path to the binary. */
75
75
  binPath: string;
76
76
  /**
77
- * Whether a credential file exists for it. EXISTENCE ONLY — never read, never parsed, never
77
+ * Whether a credential file exists for it. Existence only: never read, never parsed, never
78
78
  * reported beyond this boolean. Keyring storage may have no file at all.
79
79
  */
80
80
  credentialsPresent: boolean;
@@ -106,10 +106,12 @@ export declare function checkHostedCodexCompatibility(binPath: string, options?:
106
106
  *
107
107
  * This is the whole point of the feature at the surface: someone new does not have to go and make
108
108
  * an API key if the thing that can drive the study is already on their laptop. `doctor` says so,
109
- * and says it as a capability rather than a gate — a machine with no local agent is not broken,
109
+ * and says it as a capability rather than a gate: a machine with no local agent is not broken,
110
110
  * it just needs a key.
111
111
  */
112
112
  export declare function detectLocalAgents(options?: DetectLocalAgentsOptions): Promise<DetectedLocalAgent[]>;
113
- /** One line for `doctor`, in the register the other rows use. */
114
- export declare function localAgentDoctorMessage(found: readonly DetectedLocalAgent[]): string;
113
+ /** Doctor's row when neither Codex nor Claude Code is installed. */
114
+ export declare const NO_LOCAL_AGENT_MESSAGE = "no local coding agent found. openai-computer-use needs OPENAI_API_KEY; local-agent needs Codex or Claude Code installed and signed in. Hosted desktops also need E2B_API_KEY.";
115
+ /** Doctor's row for one installed agent, in the register the other rows use. */
116
+ export declare function localAgentDoctorMessage(agent: DetectedLocalAgent): string;
115
117
  export {};
@@ -11,22 +11,22 @@
11
11
  // The design started from a measurement: with every OPENAI_* variable unset, `codex exec --image`
12
12
  // returned a correct click on a real desktop screenshot and `claude -p` agreed within three pixels.
13
13
  //
14
- // WHAT THIS IS NOT: a way to avoid paying. Subscription usage consumes the operator's own plan,
15
- // which is why the cost line for these runs says "not priced" rather than $0 — $0 would be a lie.
14
+ // What this is not: a way to avoid paying. Subscription usage consumes the operator's own plan,
15
+ // which is why the cost line for these runs says "not priced": $0 would be a lie.
16
16
  // It is also not marketed as free API access, and it fails closed on a rate limit rather than
17
17
  // hammering a plan that was sold for interactive coding.
18
18
  //
19
- // WHERE IT IS SAFE, and this inverts the intuitive reading: the local agent only DECIDES. humanish
19
+ // Where it is safe, and this inverts the intuitive reading: the local agent only decides. humanish
20
20
  // executes the action inside the desktop sandbox, so nothing the persona chooses ever runs on the
21
- // operator's machine. The same trick on the TERMINAL lane would be the opposite — it would move
22
- // code execution out of the sandbox and onto a real disk — which is why this is a computer-use
21
+ // operator's machine. The same trick on the terminal route would be the opposite: it would move
22
+ // code execution out of the sandbox and onto a real disk, which is why this is a computer-use
23
23
  // provider and nothing else. Even so, these are coding agents with their own shell and file tools,
24
24
  // so each one is spawned tool-restricted, in a scratch directory, with a per-turn timeout.
25
25
  import { spawn } from "node:child_process";
26
26
  import { mkdtemp, rm, writeFile } from "node:fs/promises";
27
27
  import { tmpdir } from "node:os";
28
28
  import path from "node:path";
29
- import { admittedCodexCliVersions, parseCodexCliVersion } from "../codex/qualified-versions.js";
29
+ import { admitsCodexCliVersion, parseCodexCliVersion } from "../codex/codex-admission.js";
30
30
  import { restrictedCodexNpmTarget } from "../codex/restricted-executable.js";
31
31
  const LOCAL_AGENTS = [
32
32
  { id: "codex", bin: "codex", label: "Codex", credentialPath: ".codex/auth.json" },
@@ -38,7 +38,7 @@ const LOCAL_AGENTS = [
38
38
  },
39
39
  ];
40
40
  /**
41
- * Map the agent's answer onto the harness action vocabulary. Anything unrecognized is DROPPED
41
+ * Map the agent's answer onto the harness action vocabulary. Anything unrecognized is dropped
42
42
  * rather than guessed at: a coordinate we invented would be recorded as the participant's choice.
43
43
  */
44
44
  export function toCuaActions(raw) {
@@ -90,11 +90,11 @@ export function declaredOutcomeOf(value) {
90
90
  /**
91
91
  * Pull the JSON object out of whatever the CLI printed: clean JSON, a Claude Code envelope, or an
92
92
  * answer wrapped in a ```json fence. A response with no object at all is a turn error, never an
93
- * empty turn — an empty turn would read to the loop as "the participant chose to do nothing".
93
+ * empty turn: an empty turn would read to the loop as "the participant chose to do nothing".
94
94
  */
95
95
  export function parseAgentJson(text) {
96
- // ORDER MATTERS, and a test caught it: Claude Code's envelope is valid JSON whose `result`
97
- // STRING contains a ```json fence. Stripping fences first reached inside that string and
96
+ // Order matters, and a test caught it: Claude Code's envelope is valid JSON whose `result`
97
+ // string contains a ```json fence. Stripping fences first reached inside that string and
98
98
  // mangled the envelope. So: parse what we were given, and only go fence-hunting if it is not
99
99
  // already JSON.
100
100
  const attempts = [text.trim()];
@@ -167,6 +167,7 @@ export function promptFor(request, screenshotPath) {
167
167
  const shape = '{"reasoning":string,"done":boolean,"message":string|null,"outcome":"reached"|"not_reached"|"blocked"|null,' +
168
168
  '"actions":[{"kind":"click|double_click|type|keypress|scroll|wait|done",' +
169
169
  '"x":int|null,"y":int|null,"text":string|null,"keys":[string]|null,"ms":int|null}]}';
170
+ // prose-check: model prompt (the participant model reads this, not a person)
170
171
  return [
171
172
  request.instructions,
172
173
  "",
@@ -217,7 +218,7 @@ export function createLocalAgentProvider(options) {
217
218
  "-p",
218
219
  "--output-format",
219
220
  "json",
220
- // Read is the only tool it needs — the screenshot — and the only one it gets.
221
+ // Read is the only tool it needs (the screenshot) and the only one it gets.
221
222
  "--allowedTools",
222
223
  "Read",
223
224
  ...(options.model === undefined ? [] : ["--model", options.model]),
@@ -339,9 +340,7 @@ export async function checkHostedCodexCompatibility(binPath, options = {}) {
339
340
  return "unsupported_platform";
340
341
  const result = await (options.probe ?? authProbe)(binPath, ["--version"], options.env ?? process.env).catch(() => ({ code: null, stdout: "", stderr: "" }));
341
342
  const version = parseCodexCliVersion(result.stdout);
342
- return result.code === 0 &&
343
- version !== undefined &&
344
- admittedCodexCliVersions(platform, arch).some((admitted) => admitted === version)
343
+ return result.code === 0 && version !== undefined && admitsCodexCliVersion(version)
345
344
  ? "supported"
346
345
  : "unsupported_version";
347
346
  }
@@ -350,7 +349,7 @@ export async function checkHostedCodexCompatibility(binPath, options = {}) {
350
349
  *
351
350
  * This is the whole point of the feature at the surface: someone new does not have to go and make
352
351
  * an API key if the thing that can drive the study is already on their laptop. `doctor` says so,
353
- * and says it as a capability rather than a gate — a machine with no local agent is not broken,
352
+ * and says it as a capability rather than a gate: a machine with no local agent is not broken,
354
353
  * it just needs a key.
355
354
  */
356
355
  export async function detectLocalAgents(options = {}) {
@@ -397,17 +396,14 @@ export async function detectLocalAgents(options = {}) {
397
396
  }
398
397
  return found;
399
398
  }
400
- /** One line for `doctor`, in the register the other rows use. */
401
- export function localAgentDoctorMessage(found) {
402
- if (found.length === 0) {
403
- return "no local coding agent found — openai-computer-use needs OPENAI_API_KEY; local-agent needs Codex or Claude Code installed and authenticated. Hosted desktops also need E2B_API_KEY.";
404
- }
405
- return (found
406
- .map((agent) => agent.authStatus === "authenticated"
407
- ? `${agent.label} reports authenticated — actors[0].type: local-agent can use it instead of a provider API key; account access and limits are untested`
408
- : agent.authStatus === "unauthenticated"
409
- ? `${agent.label} reports not signed in — run \`${agent.id === "codex" ? "codex login" : "claude auth login"}\``
410
- : `${agent.label} installed; authentication status could not be checked — run \`${agent.id === "codex" ? "codex login status" : "claude auth status"}\` and update the CLI if needed`)
411
- .join(". ") +
412
- ". Desktop and analysis requirements depend on the selected lab; run doctor --lab <lab> for its setup checks.");
399
+ /** Doctor's row when neither Codex nor Claude Code is installed. */
400
+ export const NO_LOCAL_AGENT_MESSAGE = "no local coding agent found. openai-computer-use needs OPENAI_API_KEY; local-agent needs Codex or Claude Code installed and signed in. Hosted desktops also need E2B_API_KEY.";
401
+ /** Doctor's row for one installed agent, in the register the other rows use. */
402
+ export function localAgentDoctorMessage(agent) {
403
+ if (agent.authStatus === "authenticated")
404
+ return `${agent.label} reports signed in; a lab with actors[0].type: local-agent can use it instead of a provider API key. Account access and limits are untested.`;
405
+ const status = agent.id === "codex" ? "codex login status" : "claude auth status";
406
+ return agent.authStatus === "unauthenticated"
407
+ ? `${agent.label} is installed and reports not signed in; run \`${agent.id === "codex" ? "codex login" : "claude auth login"}\``
408
+ : `${agent.label} is installed; its sign-in status could not be checked. Run \`${status}\`, and update the CLI if needed.`;
413
409
  }
@@ -1,7 +1,7 @@
1
1
  import { type LocalAgentId } from "./cli.js";
2
2
  /** Why a local-agent participant cannot run here. */
3
3
  export type LocalAgentRefusal =
4
- /** The CLI is not on PATH. */
4
+ /** The CLI is not on `PATH`. */
5
5
  {
6
6
  kind: "agent-missing";
7
7
  message: string;
@@ -11,7 +11,7 @@ export type LocalAgentRefusal =
11
11
  kind: "signin-required";
12
12
  message: string;
13
13
  }
14
- /** Hosted Codex on an unsupported platform or an unqualified CLI release. */
14
+ /** Hosted Codex on an unsupported platform or a CLI release the launcher refuses. */
15
15
  | {
16
16
  kind: "unsupported";
17
17
  message: string;
@@ -1,8 +1,8 @@
1
1
  // Whether a local-agent participant can run on this machine before anything is acquired: its CLI
2
- // is on PATH and signed in, a hosted Codex CLI is a qualified release on a supported platform, and
2
+ // is on `PATH` and signed in, a hosted Codex CLI is a qualified release on a supported platform, and
3
3
  // a ChatGPT-account Codex is not asked to enforce a dollar cap it has no price for. Each route maps
4
4
  // the refusal's kind to its own error code.
5
- import { describeQualifiedCodexCliVersions } from "../codex/qualified-versions.js";
5
+ import { describeCodexCliAdmission } from "../codex/codex-admission.js";
6
6
  import { checkHostedCodexCompatibility, detectLocalAgents } from "./cli.js";
7
7
  export async function localAgentRefusal(args) {
8
8
  const { agent, env, caps } = args;
@@ -19,7 +19,7 @@ export async function localAgentRefusal(args) {
19
19
  return {
20
20
  kind: "signin-required",
21
21
  message: chosen.authStatus === "unauthenticated"
22
- ? `${chosen.label} reports not signed in — run \`${chosen.id === "codex" ? "codex login" : "claude auth login"}\`, then retry.`
22
+ ? `${chosen.label} reports it is not signed in; run \`${chosen.id === "codex" ? "codex login" : "claude auth login"}\`, then retry.`
23
23
  : `${chosen.label} authentication status could not be checked. Run \`${chosen.id === "codex" ? "codex login status" : "claude auth status"}\` and update the CLI if needed. No desktop was launched.`,
24
24
  };
25
25
  }
@@ -31,7 +31,7 @@ export async function localAgentRefusal(args) {
31
31
  kind: "unsupported",
32
32
  message: compatibility === "unsupported_platform"
33
33
  ? `Hosted Codex participants require Linux or macOS on x64 or arm64. This host is ${process.platform}/${process.arch}; no desktop was launched.`
34
- : `Hosted Codex participants require a qualified Codex CLI (${describeQualifiedCodexCliVersions()}). Run \`codex --version\` and install a qualified version before retrying; no desktop was launched.`,
34
+ : `Hosted Codex participants need a Codex CLI release humanish runs: ${describeCodexCliAdmission()}. Run \`humanish doctor\` for the release it found and the command that replaces it; no desktop was launched.`,
35
35
  };
36
36
  }
37
37
  if (chosen.billing === "account-unknown" &&
@@ -1,19 +1,19 @@
1
1
  // The provider-declared reasoning-effort vocabulary, kept in its own module so the lab schema and
2
2
  // the OpenAI provider can share it without the schema depending on a provider.
3
3
  //
4
- // WHY THIS EXISTS AT ALL: effort was reachable in the provider and unreachable from a lab. Every
5
- // computer-use run humanish had ever done was therefore the provider default — not by decision but
6
- // by omission (#497). Effort changes who the PARTICIPANT is, the same way a persona prompt does
4
+ // Why this exists: effort was reachable in the provider and unreachable from a lab. Every
5
+ // computer-use run humanish had ever done was therefore the provider default, not by decision but
6
+ // by omission. Effort changes who the participant is, the same way a persona prompt does
7
7
  // (docs/principles/actor-fidelity.md: capability settings are recruiting decisions), so pinning it
8
8
  // invisibly meant every persona finding was really a finding about that persona at medium, with the
9
9
  // second half unsaid.
10
10
  //
11
- // SUPPORT IS MODEL-DEPENDENT. OpenAI documents the vocabulary below as the union across models and
11
+ // Support is model-dependent. OpenAI documents the vocabulary below as the union across models and
12
12
  // states plainly that "supported values are model-dependent"; there is no offline way to know which
13
13
  // subset a given model id accepts. So this module refuses to pretend: it validates that a lab asked
14
- // for a REAL effort level, and a model that does not support the one it was asked for fails on the
14
+ // for a real effort level, and a model that does not support the one it was asked for fails on the
15
15
  // first turn with the provider's own message rather than being silently downgraded. Silent
16
- // downgrade is the worse failure — it would record an effort the run did not actually use.
16
+ // downgrade is the worse failure: it would record an effort the run did not actually use.
17
17
  /** The documented vocabulary, ordered from least to most reasoning. */
18
18
  export const REASONING_EFFORTS = [
19
19
  "none",
@@ -27,27 +27,27 @@ export interface TerminalActorDescriptor extends ActorDescriptorBase {
27
27
  }
28
28
  export type ActorDescriptor = CodexActorDescriptor | CuaActorDescriptor | ScriptedBrowserActorDescriptor | TerminalActorDescriptor;
29
29
  /**
30
- * REGISTRY CONTRACT: an actor whose capabilities include the "computer-use" lane is a
31
- * CuaActorDescriptor — its runSession takes CuaActorSessionOptions and returns a CuaLoopResult.
30
+ * Registry contract: an actor whose capabilities include the "computer-use" run kind is a
31
+ * CuaActorDescriptor: its runSession takes CuaActorSessionOptions and returns a CuaLoopResult.
32
32
  * Any future computer-use provider (e.g. stagehand-cua) must keep that session signature and add
33
33
  * its id to CuaActorDescriptor["id"], so code narrowed by this guard can still tell the ids apart.
34
34
  * This guard is what lets the lab dispatch on capabilities rather than on hardcoded actor ids.
35
35
  */
36
36
  export declare function isCuaActorDescriptor(descriptor: ActorDescriptor): descriptor is CuaActorDescriptor;
37
37
  /**
38
- * REGISTRY CONTRACT (mirror of isCuaActorDescriptor): an actor whose capabilities include the
39
- * "scripted-browser" lane IS a ScriptedBrowserActorDescriptor — runSession takes
38
+ * Registry contract (mirror of isCuaActorDescriptor): an actor whose capabilities include the
39
+ * "scripted-browser" run kind is a ScriptedBrowserActorDescriptor; runSession takes
40
40
  * ScriptedBrowserSessionOptions and returns ScriptedBrowserSessionResult (trace fully formed,
41
- * like the CUA shape — no separate toActorTrace). Any future scripted driver (e.g. a HAR
41
+ * like the CUA shape; no separate toActorTrace). Any future scripted driver (e.g. a HAR
42
42
  * replayer) must keep this signature; it is what lets the lab dispatch on capabilities, not ids.
43
43
  */
44
44
  export declare function isScriptedBrowserActorDescriptor(descriptor: ActorDescriptor): descriptor is ScriptedBrowserActorDescriptor;
45
45
  /**
46
- * REGISTRY CONTRACT (mirror of isCuaActorDescriptor / isScriptedBrowserActorDescriptor): an actor
47
- * whose capabilities include the "terminal" lane IS a TerminalActorDescriptor. This is the guard
48
- * the terminal-product lab uses for route selection and capability enforcement. The current
49
- * descriptor's direct runSession is intentionally unsupported; live execution is route-owned.
50
- * Any future terminal actor must declare keyPlacement honestly and integrate with that lifecycle.
46
+ * Registry contract (mirror of isCuaActorDescriptor / isScriptedBrowserActorDescriptor): an actor
47
+ * whose capabilities include the "terminal" run kind is a TerminalActorDescriptor. This is the
48
+ * guard the terminal-product route uses for route selection and capability enforcement. The current
49
+ * descriptor's direct runSession is intentionally unsupported; live execution is route-owned. Any
50
+ * future terminal actor must declare the keyPlacement it uses and integrate with that lifecycle.
51
51
  */
52
52
  export declare function isTerminalActorDescriptor(descriptor: ActorDescriptor): descriptor is TerminalActorDescriptor;
53
53
  export declare const actorRegistry: Record<ActorId, ActorDescriptor>;
@@ -6,8 +6,8 @@ import { LOCAL_AGENT_CAPABILITIES } from "./local-agent/cli.js";
6
6
  import { OPENAI_RESPONSES_CU_CAPABILITIES } from "./computer-use/openai-provider.js";
7
7
  import { runScriptedBrowserSession, } from "./scripted-browser/actor.js";
8
8
  /**
9
- * REGISTRY CONTRACT: an actor whose capabilities include the "computer-use" lane is a
10
- * CuaActorDescriptor — its runSession takes CuaActorSessionOptions and returns a CuaLoopResult.
9
+ * Registry contract: an actor whose capabilities include the "computer-use" run kind is a
10
+ * CuaActorDescriptor: its runSession takes CuaActorSessionOptions and returns a CuaLoopResult.
11
11
  * Any future computer-use provider (e.g. stagehand-cua) must keep that session signature and add
12
12
  * its id to CuaActorDescriptor["id"], so code narrowed by this guard can still tell the ids apart.
13
13
  * This guard is what lets the lab dispatch on capabilities rather than on hardcoded actor ids.
@@ -16,21 +16,21 @@ export function isCuaActorDescriptor(descriptor) {
16
16
  return descriptor.capabilities.lanes.includes("computer-use");
17
17
  }
18
18
  /**
19
- * REGISTRY CONTRACT (mirror of isCuaActorDescriptor): an actor whose capabilities include the
20
- * "scripted-browser" lane IS a ScriptedBrowserActorDescriptor — runSession takes
19
+ * Registry contract (mirror of isCuaActorDescriptor): an actor whose capabilities include the
20
+ * "scripted-browser" run kind is a ScriptedBrowserActorDescriptor; runSession takes
21
21
  * ScriptedBrowserSessionOptions and returns ScriptedBrowserSessionResult (trace fully formed,
22
- * like the CUA shape — no separate toActorTrace). Any future scripted driver (e.g. a HAR
22
+ * like the CUA shape; no separate toActorTrace). Any future scripted driver (e.g. a HAR
23
23
  * replayer) must keep this signature; it is what lets the lab dispatch on capabilities, not ids.
24
24
  */
25
25
  export function isScriptedBrowserActorDescriptor(descriptor) {
26
26
  return descriptor.capabilities.lanes.includes("scripted-browser");
27
27
  }
28
28
  /**
29
- * REGISTRY CONTRACT (mirror of isCuaActorDescriptor / isScriptedBrowserActorDescriptor): an actor
30
- * whose capabilities include the "terminal" lane IS a TerminalActorDescriptor. This is the guard
31
- * the terminal-product lab uses for route selection and capability enforcement. The current
32
- * descriptor's direct runSession is intentionally unsupported; live execution is route-owned.
33
- * Any future terminal actor must declare keyPlacement honestly and integrate with that lifecycle.
29
+ * Registry contract (mirror of isCuaActorDescriptor / isScriptedBrowserActorDescriptor): an actor
30
+ * whose capabilities include the "terminal" run kind is a TerminalActorDescriptor. This is the
31
+ * guard the terminal-product route uses for route selection and capability enforcement. The current
32
+ * descriptor's direct runSession is intentionally unsupported; live execution is route-owned. Any
33
+ * future terminal actor must declare the keyPlacement it uses and integrate with that lifecycle.
34
34
  */
35
35
  export function isTerminalActorDescriptor(descriptor) {
36
36
  return descriptor.capabilities.lanes.includes("terminal");
@@ -43,13 +43,14 @@ export const actorRegistry = {
43
43
  runSession: runCodexAppServerSession,
44
44
  toActorTrace: codexResultToActorTrace,
45
45
  },
46
- // The ActorId names the actor slot (keeps the lane open for a future stagehand-cua provider);
47
- // the trace's `provider` string stays "openai-responses-cu" (the concrete model adapter).
48
- // The operator's own signed-in coding agent as the computer-use brain (Codex on a ChatGPT plan,
49
- // Claude Code on a Max plan). Same lane, same loop, same evidence — the only difference is where
50
- // the next action comes from, which is exactly why it is a provider swap and not a new lane.
51
- // It exists so someone new can watch a persona drive a real desktop without first going to find
52
- // an API key; the machine they are on very often already has one of these signed in.
46
+ // The ActorId names the actor slot (keeps the slot open for a future stagehand-cua
47
+ // provider); the trace's `provider` string stays "openai-responses-cu" (the concrete model
48
+ // adapter). The operator's own signed-in coding agent as the computer-use brain (Codex on a
49
+ // ChatGPT plan, Claude Code on a Max plan). Same run kind, same loop, same evidence; the only
50
+ // difference is where the next action comes from, which is exactly why it is a provider swap and
51
+ // not a new run kind. It exists so someone new can watch a persona drive a real desktop
52
+ // without first going to find an API key; the machine they are on very often already has one of
53
+ // these signed in.
53
54
  "local-agent": {
54
55
  id: "local-agent",
55
56
  label: "Local coding agent (operator-authenticated)",
@@ -10,10 +10,10 @@ export interface ScriptedBrowserSessionOptions {
10
10
  urlPolicy?: ScriptedBrowserEvidenceUrlPolicy;
11
11
  /** Parsed + validated by the backend (scenario.ref is consumed there, fail-closed). */
12
12
  journey: BrowserPersonaJourney;
13
- /** ONE session per surface lane. */
13
+ /** One session per surface. */
14
14
  surface: BrowserSurface;
15
15
  /** id = actors[0].persona ?? "scripted-journey"; promptDigest = journey.sourceDigest prefix
16
- * (the step manifest IS the "prompt" — no model prompt exists on this lane). */
16
+ * (the step manifest is the "prompt"; no model prompt exists on this route). */
17
17
  persona: ActorPersonaRef;
18
18
  /** Journey wall-clock budget in ms; the lab route passes execution.timeoutMs or 300_000. */
19
19
  timeoutMs: number;
@@ -30,19 +30,19 @@ export interface ScriptedBrowserSessionResult extends ActorSessionResult {
30
30
  capture: BrowserSurfaceCapture;
31
31
  }
32
32
  /**
33
- * Run the scripted journey for ONE surface and return native capture + ActorTrace projection.
33
+ * Run the scripted journey for one surface and return native capture + ActorTrace projection.
34
34
  *
35
35
  * Completion semantics (the contract the projection tests pin):
36
36
  * - every step executed, every assertion passed, HTTP probe ok -> passed / goal_satisfied
37
- * (the scenario's expect blocks ARE the success predicate; a pass claims "the app still
37
+ * (the scenario's expect blocks are the success predicate; a pass claims "the app still
38
38
  * affords this exact journey", nothing about user behavior);
39
39
  * - a step's expectation evaluated false, a step target missing/unactionable, or an
40
- * unreachable subject -> failed / step_failed (the harness executed faithfully; the SUBJECT
41
- * did not satisfy the script — distinct from actor_error/harness_error);
40
+ * unreachable subject -> failed / step_failed (the harness executed faithfully; the subject
41
+ * did not satisfy the script, distinct from actor_error/harness_error);
42
42
  * - journey exceeded timeoutMs -> timed_out / timed_out;
43
43
  * - browser launch/import crash -> failed / harness_error;
44
- * - gave_up / blocked_approval are UNREACHABLE from this actor (no persona patience, no
45
- * approvals exist on a deterministic replay) — asserted in tests.
44
+ * - gave_up / blocked_approval are unreachable from this actor (no persona patience, no
45
+ * approvals exist on a deterministic replay), asserted in tests.
46
46
  */
47
47
  export declare function runScriptedBrowserSession(options: ScriptedBrowserSessionOptions): Promise<ScriptedBrowserSessionResult>;
48
48
  /** Internal lab seam: the run root is already prepared and must stay bound to that identity. */