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
@@ -1,17 +1,11 @@
1
1
  // One restricted Codex request's turn: the notifications and tool requests the app-server sends
2
2
  // while the turn runs. Each is checked against the tool policy, the turn's identity and the output
3
- // limits, and any violation stops the request's deadline with a refusal code.
3
+ // limits, and any violation stops the request's deadline with a refusal code. A policy violation
4
+ // goes through the session, which records it when the request can no longer report it.
4
5
  import { CODEX_MAX_OUTPUT_BYTES, CODEX_MAX_REQUEST_BYTES, codexRecord, restrictedCodexUsage, toolPolicyViolation, } from "./restricted-policy.js";
5
6
  import { RestrictedCodexStop, } from "./restricted-transport.js";
7
+ import { ANALYST_ITEM_TYPES, ANALYST_RAW_ITEM_TYPES, KNOWN_CODEX_NOTIFICATIONS, PARTICIPANT_ITEM_TYPES, PARTICIPANT_RAW_ITEM_TYPES, itemPolicyOf, } from "./restricted-notifications.js";
6
8
  const rawCompactionTypes = ["compaction", "compaction_summary", "context_compaction"];
7
- const analystRawItemTypes = ["message", "reasoning", ...rawCompactionTypes];
8
- const participantRawItemTypes = [
9
- ...analystRawItemTypes,
10
- "custom_tool_call",
11
- "custom_tool_call_output",
12
- "function_call",
13
- "function_call_output",
14
- ];
15
9
  function hasScopedIdentity(method, params, threadId, turnId) {
16
10
  if (method === "turn/started" || method === "turn/completed") {
17
11
  const id = codexRecord(params.turn).id;
@@ -28,8 +22,10 @@ function hasScopedIdentity(method, params, threadId, turnId) {
28
22
  typeof params.turnId === "string" &&
29
23
  params.turnId.length > 0 &&
30
24
  (turnId === undefined || params.turnId === turnId));
25
+ // Before the turn's id is known, an event that names a turn waits in the early buffer, and
26
+ // handleTurnEvent checks it again against the acknowledged id.
31
27
  return ((params.threadId === undefined || params.threadId === threadId) &&
32
- (params.turnId === undefined || params.turnId === turnId));
28
+ (params.turnId === undefined || turnId === undefined || params.turnId === turnId));
33
29
  }
34
30
  function usageDelta(total, baseline) {
35
31
  const delta = {
@@ -44,9 +40,10 @@ function usageDelta(total, baseline) {
44
40
  : null;
45
41
  }
46
42
  /**
47
- * Drain: every notification and tool request of one turn. Nothing is handled before `dispatched`;
48
- * events that arrive before turn/start's reply wait until acknowledge() and are then checked in
49
- * order. `finished` resolves only with a completed, validated final answer.
43
+ * Drain: every notification and tool request of one turn. Before `dispatched`, notifications go
44
+ * to the session's idle handler; events that arrive after dispatch but before turn/start's reply
45
+ * pass the item policy at once, then wait until acknowledge() and are checked in order.
46
+ * `finished` resolves only with a completed, validated final answer.
50
47
  */
51
48
  export class RestrictedCodexTurn {
52
49
  context;
@@ -70,7 +67,9 @@ export class RestrictedCodexTurn {
70
67
  constructor(context) {
71
68
  this.context = context;
72
69
  this.inferenceUsage = context.participant ? [] : null;
73
- this.allowedRawItemTypes = context.participant ? participantRawItemTypes : analystRawItemTypes;
70
+ this.allowedRawItemTypes = context.participant
71
+ ? PARTICIPANT_RAW_ITEM_TYPES
72
+ : ANALYST_RAW_ITEM_TYPES;
74
73
  this.finished = new Promise((resolve) => {
75
74
  this.resolveFinished = resolve;
76
75
  });
@@ -94,8 +93,21 @@ export class RestrictedCodexTurn {
94
93
  }
95
94
  onNotification = (method, params) => {
96
95
  const { deadline } = this.context;
97
- if (!this.dispatched)
96
+ if (!this.dispatched) {
97
+ this.context.idle(method, params);
98
98
  return;
99
+ }
100
+ // The single tool-policy check, first: an event that also fails the identity or delta checks
101
+ // below still has its items recorded. Tool requests must fail even if the turn-start
102
+ // acknowledgment is lost, and every event reaches handleTurnEvent only from here, directly or
103
+ // through the early buffer, so no event skips it. Every item is checked, whatever the method
104
+ // that carries it and wherever the schema nests it.
105
+ const items = itemPolicyOf(method, params, this.context.policy);
106
+ if (toolPolicyViolation(method, codexRecord(params.item), this.allowedRawItemTypes) ||
107
+ items === "violation") {
108
+ this.context.refuse("codex_tool_call");
109
+ return;
110
+ }
99
111
  if (!hasScopedIdentity(method, params, this.context.threadId(), this.turnId ?? this.earlyTurnId)) {
100
112
  deadline.stop("codex_protocol_error");
101
113
  return;
@@ -111,13 +123,8 @@ export class RestrictedCodexTurn {
111
123
  return;
112
124
  }
113
125
  }
114
- // The single tool-policy check. Tool requests must fail even if the turn-start
115
- // acknowledgment is lost, and every event reaches handleTurnEvent only from here, directly
116
- // or through the early buffer, so no event skips it.
117
- if (toolPolicyViolation(method, codexRecord(params.item), this.allowedRawItemTypes)) {
118
- deadline.stop("codex_tool_call");
119
- return;
120
- }
126
+ if (items === "none" && !KNOWN_CODEX_NOTIFICATIONS.has(method))
127
+ this.context.recordUnknown(method);
121
128
  if (method === "turn/started") {
122
129
  const value = codexRecord(params.turn).id;
123
130
  if (typeof value !== "string" ||
@@ -137,7 +144,10 @@ export class RestrictedCodexTurn {
137
144
  onRequest = async (method, params) => {
138
145
  const { deadline, participant, toolCallIds } = this.context;
139
146
  const callId = params.callId;
140
- if (!participant ||
147
+ // A request before turn/start is sent, or after the turn completed, is outside the turn.
148
+ if (!this.dispatched ||
149
+ this.completed ||
150
+ !participant ||
141
151
  method !== "item/tool/call" ||
142
152
  params.threadId !== this.context.threadId() ||
143
153
  typeof params.turnId !== "string" ||
@@ -150,13 +160,13 @@ export class RestrictedCodexTurn {
150
160
  callId.length > 200 ||
151
161
  toolCallIds.has(callId) ||
152
162
  this.toolRequestPending)
153
- throw new RestrictedCodexStop("codex_tool_call");
163
+ this.refuseRequest();
154
164
  // Mark the request outstanding before waiting for a same-chunk turn/start
155
165
  // acknowledgment, so an early completion can never be accepted.
156
166
  this.toolRequestPending = true;
157
167
  const activeTurnId = this.turnId ?? this.earlyTurnId ?? (await deadline.wait(this.turnReady));
158
168
  if (params.turnId !== activeTurnId)
159
- throw new RestrictedCodexStop("codex_tool_call");
169
+ this.refuseRequest();
160
170
  toolCallIds.add(callId);
161
171
  deadline.pause();
162
172
  const text = await deadline.wait(this.context.tool().call(params.arguments));
@@ -170,6 +180,11 @@ export class RestrictedCodexTurn {
170
180
  }
171
181
  return { success: true, contentItems: [{ type: "inputText", text }] };
172
182
  };
183
+ /** Refuses a tool request: the session records the refusal, and the transport answers it. */
184
+ refuseRequest() {
185
+ this.context.refuse("codex_tool_call");
186
+ throw new RestrictedCodexStop("codex_tool_call");
187
+ }
173
188
  onRequestComplete = () => {
174
189
  this.toolRequestPending = false;
175
190
  };
@@ -220,11 +235,9 @@ export class RestrictedCodexTurn {
220
235
  /** The item allowlist, the participant's one dynamic tool and the final answer's shape. */
221
236
  admitsItem(method, item) {
222
237
  const { deadline, participant } = this.context;
223
- const allowedItems = participant
224
- ? ["userMessage", "agentMessage", "reasoning", "contextCompaction", "dynamicToolCall"]
225
- : ["userMessage", "agentMessage", "reasoning", "contextCompaction"];
238
+ const allowedItems = participant ? PARTICIPANT_ITEM_TYPES : ANALYST_ITEM_TYPES;
226
239
  if (!allowedItems.includes(String(item.type))) {
227
- deadline.stop("codex_tool_call");
240
+ this.context.refuse("codex_tool_call");
228
241
  return false;
229
242
  }
230
243
  if (item.type === "dynamicToolCall" &&
@@ -232,7 +245,7 @@ export class RestrictedCodexTurn {
232
245
  item.namespace !== null ||
233
246
  (method === "item/started" && item.status !== "inProgress") ||
234
247
  (method === "item/completed" && (item.status !== "completed" || item.success !== true)))) {
235
- deadline.stop("codex_tool_call");
248
+ this.context.refuse("codex_tool_call");
236
249
  return false;
237
250
  }
238
251
  if (item.type === "agentMessage" &&
@@ -6,11 +6,11 @@ import { type RedactionHooks } from "../../evidence/redaction.js";
6
6
  import type { DwellWindow, StopWhen } from "../stop-conditions.js";
7
7
  import type { LabTask } from "../../lab/tasks.js";
8
8
  export interface CuaActorSessionOptions {
9
- /** The composed mission (persona + scenario/lane instruction) handed to the model. */
9
+ /** The composed mission (persona + scenario/participant instruction) handed to the model. */
10
10
  instructions: string;
11
11
  /** Provenance of the persona this actor embodies (id + applied traits + prompt digest). */
12
12
  persona: ActorPersonaRef;
13
- /** Hard wall-clock runaway guard — the only count-free hard stop the loop honors. */
13
+ /** Hard wall-clock runaway guard: the only count-free hard stop the loop honors. */
14
14
  timeoutMs: number;
15
15
  signal?: AbortSignal;
16
16
  /** Live provider construction (used when `provider` is not injected). */
@@ -19,10 +19,10 @@ export interface CuaActorSessionOptions {
19
19
  desktop?: E2BDesktopLike;
20
20
  executorOptions?: E2BDesktopExecutorOptions;
21
21
  /**
22
- * DI seams — inject to bypass live construction (CI uses these for zero-spend tests; library
23
- * callers use them to drive a state-driven, non-vision flow). NOTE: a STATE executor (one
24
- * whose observe() returns no screenshot — see CuaObservation.screenshot optional) MUST be
25
- * paired with a NON-vision provider (requiresFrame falsey). The default OpenAI provider is
22
+ * DI seams: inject to bypass live construction (CI uses these for zero-spend tests; library
23
+ * callers use them to drive a state-driven, non-vision flow). NOTE: a state executor (one
24
+ * whose observe() returns no screenshot; see CuaObservation.screenshot optional) must be
25
+ * paired with a non-vision provider (requiresFrame falsey). The default OpenAI provider is
26
26
  * vision-based and would fail closed against a screenshot-less observation. See
27
27
  * docs/architecture/state-driven-executor.md.
28
28
  */
@@ -39,7 +39,7 @@ export interface CuaActorSessionOptions {
39
39
  idleSteps?: number;
40
40
  noProgressSteps?: number;
41
41
  /**
42
- * Redact persisted screenshots (blur+downscale). Default FALSE — full fidelity for local use.
42
+ * Redact persisted screenshots (blur+downscale). Default `false`: full fidelity for local use.
43
43
  * Set true for unowned subjects or share-as-is bundles. The provider always sees raw frames.
44
44
  */
45
45
  redactScreenshots?: boolean;
@@ -49,29 +49,29 @@ export interface CuaActorSessionOptions {
49
49
  writeScreenshot?: (name: string, bytes: Buffer) => Promise<string>;
50
50
  /** Deterministic harness-owned stop guards evaluated between model turns. */
51
51
  stopWhen?: StopWhen;
52
- /** A declared observation window (#510), forwarded to the loop. */
52
+ /** A declared observation window, forwarded to the loop. */
53
53
  dwell?: DwellWindow;
54
- /** The lab's declared protocol; the loop records a corroborated task funnel on the trace (#414).
55
- * Only the `success` criteria are read here — the participant-facing goals are already composed
54
+ /** The lab's declared protocol; the loop records a corroborated task funnel on the trace.
55
+ * Only the `success` criteria are read here; the participant-facing goals are already composed
56
56
  * into `instructions` upstream, and the criteria never reach the prompt. */
57
57
  tasks?: readonly LabTask[];
58
- /** FAIL-CLOSED spend cap (USD) threaded to the loop; absent = uncapped. See CuaLoopOptions.maxUsd. */
58
+ /** Fail-closed spend cap (USD) threaded to the loop; absent = uncapped. See CuaLoopOptions.maxUsd. */
59
59
  maxUsd?: number;
60
60
  /** Injected pure per-turn cost estimator paired with `maxUsd`. See CuaLoopOptions.estimateTurnCostUsd. */
61
61
  estimateTurnCostUsd?: (usage: ActorTokenUsage) => number | null;
62
- /** RUN-LEVEL spend guard threaded to the loop (#299). See CuaLoopOptions.overRunBudget. */
62
+ /** Run-level spend guard threaded to the loop. See CuaLoopOptions.overRunBudget. */
63
63
  overRunBudget?: (usage: ActorTokenUsage) => string | null;
64
64
  /** Stricter unknown-usage policy for capped sessions (see CuaLoopOptions); it also makes the
65
65
  * OpenAI provider send one HTTP dispatch per turn. Library-only. */
66
66
  requireReportedUsageForSpendCap?: boolean;
67
- /** RUNTIME-ONLY observed-URL callback threaded to the loop; see CuaLoopOptions.onObservedUrl. Used by
68
- * the concurrent shared-world handoff barrier to latch a host seat's live /lobby/CODE URL. */
67
+ /** Runtime-only observed-URL callback threaded to the loop; see CuaLoopOptions.onObservedUrl. Used by
68
+ * the concurrent shared-world handoff barrier to latch a host's live /lobby/CODE URL. */
69
69
  onObservedUrl?: (url: string | undefined) => void;
70
- /** RUNTIME-ONLY per-turn narration callback threaded to the loop; see CuaLoopOptions.onMessage. */
70
+ /** Runtime-only per-turn narration callback threaded to the loop; see CuaLoopOptions.onMessage. */
71
71
  onMessage?: (text: string) => void;
72
- /** RUNTIME-ONLY per-turn raw-frame callback threaded to the loop; see CuaLoopOptions.onScreenshot. */
72
+ /** Runtime-only per-turn raw-frame callback threaded to the loop; see CuaLoopOptions.onScreenshot. */
73
73
  onScreenshot?: (frame: Buffer) => void;
74
- /** Per-turn trace snapshot callback threaded to the loop (#441); see CuaLoopOptions.onTrace. */
74
+ /** Per-turn trace snapshot callback threaded to the loop; see CuaLoopOptions.onTrace. */
75
75
  onTrace?: (items: readonly ActorTraceItem[], usage: ActorTokenUsage, metadata?: CuaLiveMetadata) => void;
76
76
  }
77
77
  export declare function runCuaActorSession(options: CuaActorSessionOptions): Promise<CuaLoopResult>;
@@ -1,12 +1,12 @@
1
1
  // The registry-facing wrapper for the OpenAI Computer Use (CUA) actor. runComputerUseLoop needs
2
2
  // fully-constructed provider/executor instances; exposing that raw through the actor registry
3
3
  // would leak adapter construction to every call site. So runCuaActorSession takes intent-level
4
- // fields and constructs the provider/executor internally — with DI seams (provider/executor/now)
4
+ // fields and constructs the provider/executor internally, with DI seams (provider/executor/now)
5
5
  // so CI can drive the real loop with fakes and zero network/zero spend (mirrors how the Claude
6
6
  // adapter injects its queryFn).
7
7
  //
8
8
  // The loop already returns a fully-formed ActorTrace at result.trace, so there is no separate
9
- // toActorTrace mapper — runCuaActorSession returns the CuaLoopResult unchanged.
9
+ // toActorTrace mapper: runCuaActorSession returns the CuaLoopResult unchanged.
10
10
  import { runComputerUseLoop, } from "./loop.js";
11
11
  import { createE2BDesktopExecutor, } from "../../substrates/e2b/desktop-executor.js";
12
12
  import { createOpenAiResponsesProvider, } from "./openai-provider.js";
@@ -18,8 +18,8 @@ export async function runCuaActorSession(options) {
18
18
  }
19
19
  const strictSpend = options.requireReportedUsageForSpendCap === true &&
20
20
  (options.maxUsd !== undefined || options.overRunBudget !== undefined);
21
- const provider = options.provider ?? buildProvider(options.openai, strictSpend);
22
- const executor = options.executor ?? buildExecutor(options.desktop, options.executorOptions);
21
+ const provider = options.provider ?? defaultProvider(options.openai, strictSpend);
22
+ const executor = options.executor ?? defaultExecutor(options.desktop, options.executorOptions);
23
23
  const loopOptions = {
24
24
  instructions: options.instructions,
25
25
  provider,
@@ -61,7 +61,7 @@ export async function runCuaActorSession(options) {
61
61
  }
62
62
  return result;
63
63
  }
64
- function buildProvider(openai, strictSpend = false) {
64
+ function defaultProvider(openai, strictSpend = false) {
65
65
  if (!openai) {
66
66
  throw new Error("runCuaActorSession requires either `provider` (injected) or `openai` provider options.");
67
67
  }
@@ -70,7 +70,7 @@ function buildProvider(openai, strictSpend = false) {
70
70
  ...(strictSpend ? { singleDispatch: true } : {}),
71
71
  });
72
72
  }
73
- function buildExecutor(desktop, executorOptions) {
73
+ function defaultExecutor(desktop, executorOptions) {
74
74
  if (!desktop) {
75
75
  throw new Error("runCuaActorSession requires either `executor` (injected) or `desktop` to build one.");
76
76
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * A caller's adapter refused this request BEFORE provider dispatch because a configured
2
+ * A caller's adapter refused this request before provider dispatch because a configured
3
3
  * local control limit was reached. This is an adapter declaration, not a provider response
4
4
  * or independent transport/billing attestation. Never use it for a dispatched request whose
5
5
  * outcome or usage is unknown. Import this class from the same humanish installation as the
@@ -1,6 +1,6 @@
1
1
  const admissionLimits = new WeakSet();
2
2
  /**
3
- * A caller's adapter refused this request BEFORE provider dispatch because a configured
3
+ * A caller's adapter refused this request before provider dispatch because a configured
4
4
  * local control limit was reached. This is an adapter declaration, not a provider response
5
5
  * or independent transport/billing attestation. Never use it for a dispatched request whose
6
6
  * outcome or usage is unknown. Import this class from the same humanish installation as the
@@ -3,10 +3,10 @@ import type { CuaAction, CuaTurnRequest } from "./types.js";
3
3
  /** A public-safe one-line action label. Never includes raw typed text. */
4
4
  export declare function describeCuaAction(action: CuaAction): string;
5
5
  /**
6
- * A public-safe fingerprint of ONE turn's actions, used only in memory to tell "trying the same
7
- * thing again" from "trying something new" (#383).
6
+ * A public-safe fingerprint of one turn's actions, used only in memory to tell "trying the same
7
+ * thing again" from "trying something new".
8
8
  *
9
- * Never includes typed text or key contents — a `type` contributes its LENGTH, exactly as
9
+ * Never includes typed text or key contents: a `type` contributes its length, exactly as
10
10
  * describeCuaAction does, so this can never become a keylogger. Coordinates are bucketed so that
11
11
  * re-clicking the same control counts as a repeat while moving to a different control does not.
12
12
  */
@@ -47,10 +47,10 @@ function describeAction(action) {
47
47
  }
48
48
  }
49
49
  /**
50
- * A public-safe fingerprint of ONE turn's actions, used only in memory to tell "trying the same
51
- * thing again" from "trying something new" (#383).
50
+ * A public-safe fingerprint of one turn's actions, used only in memory to tell "trying the same
51
+ * thing again" from "trying something new".
52
52
  *
53
- * Never includes typed text or key contents — a `type` contributes its LENGTH, exactly as
53
+ * Never includes typed text or key contents: a `type` contributes its length, exactly as
54
54
  * describeCuaAction does, so this can never become a keylogger. Coordinates are bucketed so that
55
55
  * re-clicking the same control counts as a repeat while moving to a different control does not.
56
56
  */
@@ -121,8 +121,8 @@ export async function runActionBatch(session, actions) {
121
121
  if (actionHistory.recentActionTitles.length > RECENT_ACTION_TITLES)
122
122
  actionHistory.recentActionTitles.shift();
123
123
  trace.bump("actions");
124
- // Classify BEFORE execute, mirroring counts.actions: the record is of what the actor
125
- // CHOSE, so an action that then fails to actuate is still an honest record of the route
124
+ // Classify before execute, mirroring counts.actions: the record is of what the actor
125
+ // chose, so an action that then fails to actuate is still a record of the route
126
126
  // it reached for.
127
127
  actionHistory.affordances.push(classifyCuaAction(action));
128
128
  session.phase = `executing ${title}`;
@@ -153,7 +153,7 @@ export async function runActionBatch(session, actions) {
153
153
  if (isCuaExecutorError(error) || !isCommandExitError(error))
154
154
  throw error;
155
155
  // A skipped action changes nothing on screen, so a persistently-failing run makes no
156
- // progress and still terminates honestly via the idle/no-progress backstop (gave_up),
156
+ // progress and still terminates via the idle/no-progress backstop (gave_up),
157
157
  // never a silent actor_error and never an infinite loop.
158
158
  recordCommandFailure(session, title, error);
159
159
  continue;
@@ -164,8 +164,8 @@ export async function runActionBatch(session, actions) {
164
164
  lifecycle: "completed",
165
165
  title,
166
166
  ...(action.kind === "speak" ? { text: session.redactNarration(action.text) } : {}),
167
- // Structured pin coordinates (#441), exactly the click classes the Observer
168
- // pins render — recorded fact instead of a title re-parse downstream.
167
+ // Structured pin coordinates, exactly the click classes the Observer
168
+ // pins render: recorded fact instead of a title re-parse downstream.
169
169
  ...(action.kind === "click" || action.kind === "double_click"
170
170
  ? { coord: { x: action.x, y: action.y } }
171
171
  : {}),
@@ -180,9 +180,9 @@ function countAttempt(session, action, title, status) {
180
180
  session.trace.counts.materialActions += 1;
181
181
  }
182
182
  /**
183
- * Execute one action. Idle actions only look (#480): a `wait` that hangs inside the SDK has in
183
+ * Execute one action. Idle actions only look: a `wait` that hangs inside the SDK has in
184
184
  * effect waited, so a stalled one is skipped with a notice and loses nothing the participant
185
- * chose. An action is recorded as completed only after execute() resolves (#248).
185
+ * chose. An action is recorded as completed only after execute() resolves.
186
186
  */
187
187
  async function dispatchAction(session, action, title) {
188
188
  if (!isIdleAction(action)) {
@@ -2,10 +2,10 @@ import type { CuaAction, CuaObservation } from "./types.js";
2
2
  /**
3
3
  * A deterministic, bounded, sorted-key projection of an appState object, used as the friction
4
4
  * loop's progress key. Two structurally-equal states (regardless of key insertion order) map
5
- * to the SAME string, so key reordering can never fabricate a progress delta; two different
5
+ * to the same string, so key reordering can never fabricate a progress delta; two different
6
6
  * states map to different strings (within the caps).
7
7
  *
8
- * Correctness-load-bearing: it MUST NOT throw on a cyclic or huge input. Cycles are detected
8
+ * Correctness depends on this: it must not throw on a cyclic or huge input. Cycles are detected
9
9
  * with a seen-set (a back-edge degrades to the marker "[Circular]"); depth, key count, array
10
10
  * length, string length, and total output length are all capped so an adversarial or merely
11
11
  * large appState degrades to a bounded value rather than crashing the loop. Pure: it never
@@ -14,7 +14,7 @@ import type { CuaAction, CuaObservation } from "./types.js";
14
14
  export declare function stableProgressKey(appState: Record<string, unknown>): string;
15
15
  export interface Backstop {
16
16
  readonly progressKey: string;
17
- /** The last few turns' action fingerprints, in memory only, for the #383 corroboration rule. */
17
+ /** The last few turns' action fingerprints, in memory only, for the corroboration rule below. */
18
18
  readonly recentFingerprints: readonly string[];
19
19
  readonly consecutiveIdle: number;
20
20
  readonly consecutiveNoProgress: number;
@@ -4,9 +4,9 @@ import { actionFingerprint, isIdleTurn } from "./actions.js";
4
4
  // streak (turns that neither change the UI state nor try something new). It is a pure fold over
5
5
  // turns, never a turn budget.
6
6
  const IDLE_PROGRESS_FORGIVENESS_STEPS = 2;
7
- /** How many recent turns the repetition check looks back over (#383). */
7
+ /** How many recent turns the repetition check looks back over. */
8
8
  const ACTION_REPEAT_WINDOW = 3;
9
- /** Pixels of vertical scroll per progress bucket (#393): a real scroll step (typically >=100px)
9
+ /** Pixels of vertical scroll per progress bucket: a real scroll step (typically >=100px)
10
10
  * crosses a bucket and counts as progress; sub-bucket jiggle does not, so an actor nudging the
11
11
  * same dead panel cannot stay "progressing" forever. */
12
12
  const SCROLL_PROGRESS_BUCKET_PX = 200;
@@ -22,10 +22,10 @@ const STABLE_KEY_MAX_TOTAL = 8192;
22
22
  /**
23
23
  * A deterministic, bounded, sorted-key projection of an appState object, used as the friction
24
24
  * loop's progress key. Two structurally-equal states (regardless of key insertion order) map
25
- * to the SAME string, so key reordering can never fabricate a progress delta; two different
25
+ * to the same string, so key reordering can never fabricate a progress delta; two different
26
26
  * states map to different strings (within the caps).
27
27
  *
28
- * Correctness-load-bearing: it MUST NOT throw on a cyclic or huge input. Cycles are detected
28
+ * Correctness depends on this: it must not throw on a cyclic or huge input. Cycles are detected
29
29
  * with a seen-set (a back-edge degrades to the marker "[Circular]"); depth, key count, array
30
30
  * length, string length, and total output length are all capped so an adversarial or merely
31
31
  * large appState degrades to a bounded value rather than crashing the loop. Pure: it never
@@ -107,8 +107,8 @@ function progressKeyOf(observation) {
107
107
  const base = observation.appState !== undefined
108
108
  ? stableProgressKey(observation.appState)
109
109
  : observation.stateSignature;
110
- // Scroll position is state (#393): a scroll-pinned section keeps the frame hash constant while
111
- // the participant genuinely advances, so the offset rides the key — bucketed, never raw.
110
+ // Scroll position is state: a scroll-pinned section keeps the frame hash constant while
111
+ // the participant genuinely advances, so the offset rides the key, bucketed, never raw.
112
112
  return observation.scrollY === undefined
113
113
  ? base
114
114
  : `${base}#s${Math.round(observation.scrollY / SCROLL_PROGRESS_BUCKET_PX)}`;
@@ -127,23 +127,23 @@ export function advanceBackstop(previous, turn, limits) {
127
127
  const idle = isIdleTurn(turn.actions);
128
128
  const progressKey = progressKeyOf(turn.observation);
129
129
  const frameChanged = progressKey !== previous.progressKey;
130
- // CORROBORATION (#383). A stale frame alone is NOT evidence of a stuck agent. The frame hash is
130
+ // Corroboration. A stale frame alone is not evidence of a stuck agent. The frame hash is
131
131
  // a coarse whole-screen measure, and on a light-themed web app it can miss a renamed row, a new
132
- // list item, or an opened panel — a measured run had 9 visibly different consecutive frames hash
133
- // identically while the agent was a foreign key away from finishing. Ending a lane on that
132
+ // list item, or an opened panel: a measured run had 9 visibly different consecutive frames hash
133
+ // identically while the agent was a foreign key away from finishing. Ending a participant on that
134
134
  // signal alone recorded working sessions as `gave_up`, capping every browser run at roughly
135
135
  // noProgressSteps turns and writing harness artifacts into evidence as actor behavior.
136
136
  //
137
- // So a no-progress turn now requires BOTH a stale frame AND the agent repeating something it
137
+ // So a no-progress turn now requires both a stale frame and the agent repeating something it
138
138
  // just tried. An agent doing varied work is never counted stuck, however blind the hash is;
139
- // an agent re-clicking the same dead control trips it as fast as it did before — arguably
139
+ // an agent re-clicking the same dead control trips it as fast as it did before, arguably
140
140
  // faster, since that is the actual signature of being stuck.
141
141
  const fingerprint = actionFingerprint(turn.actions);
142
142
  const repeatingRecentAction = fingerprint.length > 0 && previous.recentFingerprints.includes(fingerprint);
143
143
  const recentFingerprints = [...previous.recentFingerprints, fingerprint].slice(-ACTION_REPEAT_WINDOW);
144
- // Corroboration governs the FRAME-STALENESS backstop only. The idle backstop below is a direct
144
+ // Corroboration governs the frame-staleness backstop only. The idle backstop below is a direct
145
145
  // behavioral signal already (the agent took nothing but screenshots and waits), so it keeps
146
- // reading the frame on its own — a repeated screenshot is exactly what an idle streak IS, and
146
+ // reading the frame on its own: a repeated screenshot is exactly what an idle streak is, and
147
147
  // feeding repetition into it would grant an extra forgiveness step for being idle.
148
148
  const observedProgress = frameChanged || turn.heardNewSpeech;
149
149
  const progressed = observedProgress || !repeatingRecentAction;
@@ -172,11 +172,13 @@ export function advanceBackstop(previous, turn, limits) {
172
172
  const hints = [];
173
173
  if (consecutiveNoProgress >= noProgressRecoverySteps &&
174
174
  consecutiveNoProgress < limits.noProgressSteps) {
175
+ // prose-check: model prompt (the participant model reads this hint, not a person)
175
176
  hints.push(`No visible progress for ${consecutiveNoProgress} step(s). ` +
176
177
  "If your task calls for waiting for another participant or a pending transition, you may continue waiting. " +
177
178
  "Choose whether to continue or stop based on your situation and what you observe.");
178
179
  }
179
180
  if (consecutiveIdle >= idleRecoverySteps && consecutiveIdle < limits.idleSteps) {
181
+ // prose-check: model prompt (the participant model reads this hint, not a person)
180
182
  hints.push(`You are only waiting or taking screenshots for ${consecutiveIdle} step(s). ` +
181
183
  "If your task calls for waiting, you may continue within the remaining session time. " +
182
184
  "When the relevant controls become actionable, continue your task; describe any blocker you actually encounter.");
@@ -18,25 +18,25 @@ export interface Stop {
18
18
  readonly debriefTrigger?: DebriefTrigger;
19
19
  }
20
20
  /**
21
- * Read the fixed closing line the prompt asks for (#570): the FIRST non-empty line of the
21
+ * Read the fixed closing line the prompt asks for: the first non-empty line of the
22
22
  * participant's last message, exactly one of three phrases, punctuation and case forgiven. Anything
23
23
  * else is absence, never a guess. Exported for tests.
24
24
  */
25
25
  export declare function declaredOutcomeFromClosingLine(message: string | undefined): ParticipantDeclaredOutcome | undefined;
26
- /** The participant's own word for how it ended: a schema field first, then the closing line (#570). */
26
+ /** The participant's own word for how it ended: a schema field first, then the closing line. */
27
27
  export declare function declaredOutcomeOf(turn: CuaTurn): ParticipantDeclaredOutcome | undefined;
28
28
  /**
29
29
  * The participant reported a natural endpoint. "not_reached" is a participant who stopped without
30
30
  * finishing: gave_up, which tallies as abandoned. "blocked" keeps goal_satisfied here (the actor
31
- * did stop on purpose) and the lane's credibility read turns it into a blocked participant, the
31
+ * did stop on purpose) and the route's credibility read turns it into a blocked participant, the
32
32
  * same path a narrated blocker takes.
33
33
  */
34
34
  export declare function participantEnded(turn: CuaTurn, declaredOutcome: ParticipantDeclaredOutcome | undefined, redactNarration: (text: string) => string): Stop;
35
35
  export declare const harnessAborted: Stop;
36
36
  /**
37
37
  * The wall-clock deadline. A session that took at least one material (non-idle) action before the
38
- * cap reached its BUDGET rather than stalling; a deadline hit with zero material actions is still
39
- * an honest failure (timed_out).
38
+ * cap reached its budget rather than stalling; a deadline hit with zero material actions is still
39
+ * recorded as a failure (timed_out).
40
40
  */
41
41
  export declare function timeLimit(session: LoopSession): Stop;
42
42
  /**
@@ -47,7 +47,7 @@ export declare function timeLimit(session: LoopSession): Stop;
47
47
  export declare function spendLimit(session: LoopSession, estimate: number, maxUsd: number): Stop;
48
48
  export declare const nonFiniteEstimate: Stop;
49
49
  /** A study-level stop is a recruiting decision hitting its limit, not this participant's runaway. */
50
- export declare function studySpendLimit(reason: string): Stop;
50
+ export declare function runSpendLimit(reason: string): Stop;
51
51
  export declare const accountBilledCaps: Stop;
52
52
  export declare const adapterLimit: Stop;
53
53
  export declare const usageUnreported: Stop;
@@ -67,7 +67,7 @@ export declare function providerStalledTwice(turnNumber: number, afterMs: number
67
67
  export declare function providerInterrupted(interruption: NonNullable<CuaTurn["interruption"]>): Stop;
68
68
  /**
69
69
  * Safety-check categories are provider-defined enums (e.g. "malicious_instructions"), not free
70
- * text; the evidence records them (redacted for defense-in-depth) so it shows WHY the run paused.
70
+ * text; the evidence records them (redacted for defense-in-depth) so it shows why the run paused.
71
71
  */
72
72
  export declare function blockedOnSafetyChecks(checks: string): Stop;
73
73
  /**
@@ -3,7 +3,7 @@ import { isCuaPromptRefusedError, isCuaProviderError } from "../provider-error.j
3
3
  import { CuaAbortError, CuaDeadlineError } from "./race.js";
4
4
  import { notice } from "./trace.js";
5
5
  /**
6
- * Read the fixed closing line the prompt asks for (#570): the FIRST non-empty line of the
6
+ * Read the fixed closing line the prompt asks for: the first non-empty line of the
7
7
  * participant's last message, exactly one of three phrases, punctuation and case forgiven. Anything
8
8
  * else is absence, never a guess. Exported for tests.
9
9
  */
@@ -25,14 +25,14 @@ export function declaredOutcomeFromClosingLine(message) {
25
25
  return "blocked";
26
26
  return undefined;
27
27
  }
28
- /** The participant's own word for how it ended: a schema field first, then the closing line (#570). */
28
+ /** The participant's own word for how it ended: a schema field first, then the closing line. */
29
29
  export function declaredOutcomeOf(turn) {
30
30
  return turn.outcome ?? declaredOutcomeFromClosingLine(turn.message);
31
31
  }
32
32
  /**
33
33
  * The participant reported a natural endpoint. "not_reached" is a participant who stopped without
34
34
  * finishing: gave_up, which tallies as abandoned. "blocked" keeps goal_satisfied here (the actor
35
- * did stop on purpose) and the lane's credibility read turns it into a blocked participant, the
35
+ * did stop on purpose) and the route's credibility read turns it into a blocked participant, the
36
36
  * same path a narrated blocker takes.
37
37
  */
38
38
  export function participantEnded(turn, declaredOutcome, redactNarration) {
@@ -51,8 +51,8 @@ export const harnessAborted = {
51
51
  };
52
52
  /**
53
53
  * The wall-clock deadline. A session that took at least one material (non-idle) action before the
54
- * cap reached its BUDGET rather than stalling; a deadline hit with zero material actions is still
55
- * an honest failure (timed_out).
54
+ * cap reached its budget rather than stalling; a deadline hit with zero material actions is still
55
+ * recorded as a failure (timed_out).
56
56
  */
57
57
  export function timeLimit(session) {
58
58
  const { timeoutMs } = session;
@@ -86,8 +86,8 @@ export function spendLimit(session, estimate, maxUsd) {
86
86
  return {
87
87
  completionReason: "budget_reached",
88
88
  reason: materialActions > 0
89
- ? `${spend} crossed execution.caps.maxUsd=$${maxUsd} after productive activity (${materialActions} material action(s), ${turns} turn(s)); aborted fail-closed before the next model turn`
90
- : `${spend} crossed execution.caps.maxUsd=$${maxUsd} with no material progress; aborted fail-closed before the next model turn`,
89
+ ? `Stopped before the next model turn: ${spend} passed execution.caps.maxUsd=$${maxUsd} after productive activity (${materialActions} material action(s), ${turns} turn(s))`
90
+ : `Stopped before the next model turn: ${spend} passed execution.caps.maxUsd=$${maxUsd} with no material progress`,
91
91
  stopCause: "spend_limit",
92
92
  };
93
93
  }
@@ -98,7 +98,7 @@ export const nonFiniteEstimate = {
98
98
  reason: "the injected estimateTurnCostUsd returned a non-finite estimate while execution.caps.maxUsd is set; the estimator receives one ActorTokenUsage object. Failing closed instead of running uncapped.",
99
99
  };
100
100
  /** A study-level stop is a recruiting decision hitting its limit, not this participant's runaway. */
101
- export function studySpendLimit(reason) {
101
+ export function runSpendLimit(reason) {
102
102
  return { completionReason: "budget_reached", reason, stopCause: "study_spend_limit" };
103
103
  }
104
104
  // A host-authenticated provider may learn its account billing class during startup. Never price
@@ -178,7 +178,7 @@ export function providerInterrupted(interruption) {
178
178
  }
179
179
  /**
180
180
  * Safety-check categories are provider-defined enums (e.g. "malicious_instructions"), not free
181
- * text; the evidence records them (redacted for defense-in-depth) so it shows WHY the run paused.
181
+ * text; the evidence records them (redacted for defense-in-depth) so it shows why the run paused.
182
182
  */
183
183
  export function blockedOnSafetyChecks(checks) {
184
184
  return {
@@ -23,8 +23,8 @@ export declare class DesktopObserver {
23
23
  checkpoint(turnNumber: number): Promise<Checkpoint>;
24
24
  /**
25
25
  * Hand an observation the next turn may react to to the runtime hooks, and note whether it
26
- * carried app state. Runtime-only: the seat's live location.href goes back to the orchestrator
27
- * and is never persisted.
26
+ * carried app state. Runtime-only: the participant's live location.href goes back to the
27
+ * orchestrator and is never persisted.
28
28
  */
29
29
  private handToHooks;
30
30
  /**