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
@@ -0,0 +1,214 @@
1
+ import { asArray, asRecord, inputMessage, openAiActionToCua } from "./openai-wire.js";
2
+ // The conversation an explicit-context request carries, kept on the client because the server
3
+ // keeps none (a zero-data-retention org, or zeroDataRetention set). Requests made while the
4
+ // provider still threads on previous_response_id feed it too, so a switch partway through a
5
+ // session keeps everything before the switch.
6
+ //
7
+ // The Responses API pairs items: every computer_call needs its computer_call_output, and a
8
+ // reasoning item travels with the item it preceded. The conversation is therefore cut only at
9
+ // exchange boundaries: one reply's output items together with the items that answered them.
10
+ // When the estimate passes the budget, the opening screenshot goes first, then the oldest
11
+ // exchanges become lines of a progress note that keeps their reasoning summaries, messages and
12
+ // actions as text. The note is an assistant message, so text the model wrote (which can quote a
13
+ // web page) keeps the trust it had when the model wrote it. The newest MIN_KEPT_EXCHANGES
14
+ // exchanges are never collapsed, so a request passes the budget when they alone exceed it; the
15
+ // trace's per-request estimate shows when that happens.
16
+ /** The estimated input a carried conversation may reach before its oldest turns are summarized. */
17
+ export const CONTEXT_TOKEN_BUDGET = 64_000;
18
+ /** Exchanges always carried whole, so the model sees its latest actions with their screens. */
19
+ const MIN_KEPT_EXCHANGES = 2;
20
+ /** The progress note's length cap; past it, the oldest lines are counted instead of shown. */
21
+ const NOTE_CHAR_LIMIT = 16_000;
22
+ /** One note line's cap, so a reply with many actions cannot push the note past its own cap. */
23
+ const LINE_CHAR_LIMIT = 1_200;
24
+ /**
25
+ * Image input tokens per 32-pixel patch. The gpt-5.x and gpt-6 models bill 1.2 per patch, and at
26
+ * the default (auto) detail gpt-5.6 and gpt-6 keep the screenshot's own size. Models that resize
27
+ * to a lower patch budget bill less, so the estimate errs high for them.
28
+ */
29
+ const TOKENS_PER_PATCH = 1.2;
30
+ /** A screenshot whose size cannot be read is estimated as a 2,500-patch image. */
31
+ const UNKNOWN_IMAGE_TOKENS = 3_000;
32
+ export class CarriedConversation {
33
+ budget;
34
+ opening;
35
+ exchanges = [];
36
+ /** The latest accepted reply's output items, which the next request answers. */
37
+ pending;
38
+ notes = [];
39
+ notesDropped = 0;
40
+ collapsedTurns = 0;
41
+ constructor(budget = CONTEXT_TOKEN_BUDGET) {
42
+ this.budget = budget;
43
+ }
44
+ /**
45
+ * Record an accepted reply. `sent` is what that request added after the carried items: the
46
+ * opening message on the first request, then the call outputs and any hint.
47
+ */
48
+ accept(turn, sent, output) {
49
+ if (this.pending === undefined) {
50
+ this.opening = asRecord(sent[0]);
51
+ }
52
+ else {
53
+ this.exchanges.push({ turn: this.pending.turn, output: this.pending.output, answers: sent });
54
+ }
55
+ this.pending = { turn, output };
56
+ this.trim();
57
+ }
58
+ /** The items to send ahead of a request's own new items. */
59
+ carried() {
60
+ const note = this.noteItem();
61
+ return [
62
+ ...(this.opening === undefined ? [] : [this.opening]),
63
+ ...(note === undefined ? [] : [note]),
64
+ ...this.exchanges.flatMap((exchange) => [...exchange.output, ...exchange.answers]),
65
+ ...(this.pending?.output ?? []),
66
+ ];
67
+ }
68
+ /** The carried context's size, for the trace. */
69
+ size() {
70
+ const items = this.carried();
71
+ return {
72
+ exchanges: this.exchanges.length + (this.pending === undefined ? 0 : 1),
73
+ screenshots: items.reduce((count, item) => count + imagesOf(item).length, 0),
74
+ notedTurns: this.collapsedTurns,
75
+ estimatedTokens: estimateTokens(items),
76
+ };
77
+ }
78
+ trim() {
79
+ while (estimateTokens(this.carried()) > this.budget) {
80
+ if (this.opening !== undefined && imagesOf(this.opening).length > 0) {
81
+ this.opening = withoutImages(this.opening);
82
+ continue;
83
+ }
84
+ if (this.exchanges.length <= MIN_KEPT_EXCHANGES)
85
+ return;
86
+ const oldest = this.exchanges.shift();
87
+ this.notes.push(describeExchange(oldest));
88
+ this.collapsedTurns += 1;
89
+ while (this.notes.join("\n").length > NOTE_CHAR_LIMIT && this.notes.length > 1) {
90
+ this.notes.shift();
91
+ this.notesDropped += 1;
92
+ }
93
+ }
94
+ }
95
+ noteItem() {
96
+ if (this.notes.length === 0)
97
+ return undefined;
98
+ const lead = `My notes on my earlier turns in this session, oldest first. Their screenshots are no ` +
99
+ `longer shown; this is what I thought, said and did.` +
100
+ (this.notesDropped === 0 ? "" : ` (${this.notesDropped} earlier turns are not listed.)`);
101
+ return inputMessage("assistant", [
102
+ { type: "output_text", text: `${lead}\n${this.notes.join("\n")}` },
103
+ ]);
104
+ }
105
+ }
106
+ /** One exchange as a progress-note line: its reasoning summary, message and actions. */
107
+ function describeExchange(exchange) {
108
+ const thought = [];
109
+ const said = [];
110
+ const did = [];
111
+ for (const raw of exchange.output) {
112
+ const item = asRecord(raw);
113
+ if (item.type === "reasoning")
114
+ for (const entry of asArray(item.summary)) {
115
+ const text = asRecord(entry).text;
116
+ if (typeof text === "string" && text.length > 0)
117
+ thought.push(text);
118
+ }
119
+ if (item.type === "message")
120
+ for (const entry of asArray(item.content)) {
121
+ const text = asRecord(entry).text;
122
+ if (typeof text === "string" && text.length > 0)
123
+ said.push(text);
124
+ }
125
+ if (item.type === "computer_call") {
126
+ const actions = Array.isArray(item.actions) ? item.actions : [item.action];
127
+ for (const action of actions) {
128
+ const mapped = openAiActionToCua(action);
129
+ if (mapped !== null)
130
+ did.push(describeAction(mapped));
131
+ }
132
+ }
133
+ }
134
+ const parts = [
135
+ thought.length > 0 ? `thought: ${clip(thought.join(" "), 400)}` : undefined,
136
+ said.length > 0 ? `said: ${clip(said.join(" "), 300)}` : undefined,
137
+ did.length > 0 ? `did: ${did.join(", ")}` : undefined,
138
+ ].filter((part) => part !== undefined);
139
+ const line = `Turn ${exchange.turn}: ${parts.length > 0 ? parts.join("; ") : "no recorded output"}`;
140
+ return `${clip(line, LINE_CHAR_LIMIT - 1)}.`;
141
+ }
142
+ function describeAction(action) {
143
+ switch (action.kind) {
144
+ case "click":
145
+ case "double_click":
146
+ case "move":
147
+ return `${action.kind} (${action.x}, ${action.y})`;
148
+ case "scroll":
149
+ return `scroll at (${action.x}, ${action.y}) by (${action.dx}, ${action.dy})`;
150
+ case "type":
151
+ return `type ${JSON.stringify(clip(action.text, 120))}`;
152
+ case "keypress":
153
+ return `keypress ${action.keys.join("+")}`;
154
+ default:
155
+ return action.kind;
156
+ }
157
+ }
158
+ function clip(text, limit) {
159
+ const flat = text.replace(/\s+/g, " ").trim();
160
+ return flat.length <= limit ? flat : `${flat.slice(0, limit - 3)}...`;
161
+ }
162
+ /** The data URLs of the images an input item carries. */
163
+ function imagesOf(item) {
164
+ const record = asRecord(item);
165
+ const output = asRecord(record.output);
166
+ const urls = [];
167
+ if (typeof output.image_url === "string")
168
+ urls.push(output.image_url);
169
+ for (const part of asArray(record.content)) {
170
+ const url = asRecord(part).image_url;
171
+ if (typeof url === "string")
172
+ urls.push(url);
173
+ }
174
+ return urls;
175
+ }
176
+ function withoutImages(item) {
177
+ return {
178
+ ...item,
179
+ content: asArray(item.content).filter((part) => asRecord(part).type !== "input_image"),
180
+ };
181
+ }
182
+ /**
183
+ * A rough input-token estimate: images by their size in 32-pixel patches, everything else at four
184
+ * characters a token. It decides when to trim, not what is billed; the trace records the billed
185
+ * input per request beside it.
186
+ */
187
+ export function estimateTokens(items) {
188
+ let tokens = 0;
189
+ for (const item of items) {
190
+ const images = imagesOf(item);
191
+ for (const url of images)
192
+ tokens += imageTokens(url);
193
+ const text = JSON.stringify(item, (key, value) => (key === "image_url" ? "" : value));
194
+ tokens += Math.ceil(text.length / 4);
195
+ }
196
+ return tokens;
197
+ }
198
+ function imageTokens(dataUrl) {
199
+ const size = pngSize(dataUrl);
200
+ if (size === undefined)
201
+ return UNKNOWN_IMAGE_TOKENS;
202
+ const patches = Math.ceil(size.width / 32) * Math.ceil(size.height / 32);
203
+ return Math.ceil(patches * TOKENS_PER_PATCH);
204
+ }
205
+ /** A PNG's width and height, from the IHDR chunk at the start of its data URL. */
206
+ function pngSize(dataUrl) {
207
+ const prefix = "data:image/png;base64,";
208
+ if (!dataUrl.startsWith(prefix))
209
+ return undefined;
210
+ const head = Buffer.from(dataUrl.slice(prefix.length, prefix.length + 32), "base64");
211
+ if (head.length < 24 || head.toString("ascii", 12, 16) !== "IHDR")
212
+ return undefined;
213
+ return { width: head.readUInt32BE(16), height: head.readUInt32BE(20) };
214
+ }
@@ -7,13 +7,13 @@ export declare const DEFAULT_OPENAI_CU_MODEL = "gpt-5.6-sol";
7
7
  /**
8
8
  * The effort a request carries when a lab declares none. Exported because a default that only
9
9
  * exists as a literal inside the provider is exactly how it stayed invisible: the lab surface has
10
- * to be able to say what will actually run (#497).
10
+ * to be able to say what will actually run.
11
11
  */
12
12
  export declare const DEFAULT_OPENAI_CU_REASONING_EFFORT: ReasoningEffort;
13
13
  /** The opt-in gate for response wire capture: a directory path, or unset for off. */
14
14
  export declare const WIRE_CAPTURE_ENV = "HUMANISH_CUA_WIRE_CAPTURE_DIR";
15
15
  /**
16
- * Deep-copy a captured wire value with every string — object keys included —
16
+ * Deep-copy a captured wire value with every string (object keys included)
17
17
  * passed through the shared redactText, so a secret-shaped echo in a response
18
18
  * can never persist to disk. Pure; non-string primitives pass through unchanged.
19
19
  */
@@ -46,7 +46,7 @@ export declare const RETRY_AFTER_CAP_MS = 60000;
46
46
  * Parse a Retry-After header (delay-seconds or an HTTP-date) into milliseconds from `now`;
47
47
  * undefined when absent or unreadable. OpenAI's 2026-09-02 change added `429 slow_down` and
48
48
  * `503 server_is_overloaded`, both of which may carry it; a fixed 200/400/800 ms backoff against
49
- * a 20 s hint burns every retry inside the hint and ends the lane for nothing.
49
+ * a 20 s hint burns every retry inside the hint and ends the participant's session for nothing.
50
50
  */
51
51
  export declare function retryAfterMs(value: string | null | undefined, now: number): number | undefined;
52
52
  /**
@@ -61,7 +61,7 @@ export interface OpenAiResponsesProviderOptions {
61
61
  model?: string;
62
62
  /**
63
63
  * How hard the model is asked to think per turn. Absent = the provider default below.
64
- * The vocabulary is the documented union across models; SUPPORT IS MODEL-DEPENDENT, so an
64
+ * The vocabulary is the documented union across models; support is model-dependent, so an
65
65
  * unsupported level surfaces as the provider's own first-turn error rather than a silent
66
66
  * downgrade to something the trace would then misreport. See src/actors/reasoning-effort.ts.
67
67
  */
@@ -69,11 +69,11 @@ export interface OpenAiResponsesProviderOptions {
69
69
  /** Optional positive integer output limit per response, including reasoning. Not a spend cap. */
70
70
  maxOutputTokens?: number;
71
71
  /**
72
- * Reasoning-summary capture (#427). Defaults to "auto" (the provider picks the best
72
+ * Reasoning-summary capture. Defaults to "auto" (the provider picks the best
73
73
  * summarizer the model supports); "off" never asks. If the account/model rejects the
74
74
  * request (e.g. an org not verified for reasoning summaries), the provider latches
75
- * summaries off for the session and retries the same turn — the run degrades to
76
- * exactly the pre-#427 behavior instead of failing after spend. Absence stays honest:
75
+ * summaries off for the session and retries the same turn; the run degrades to
76
+ * a run without summaries instead of failing after spend. The trace records the absence:
77
77
  * no summary means no `reasoning` trace items and `counts.reasonings` stays 0.
78
78
  */
79
79
  reasoningSummary?: OpenAiReasoningSummary | "off";
@@ -86,9 +86,12 @@ export interface OpenAiResponsesProviderOptions {
86
86
  * paid request. */
87
87
  singleDispatch?: boolean;
88
88
  delayFn?: (ms: number) => Promise<void>;
89
+ /** Carry the conversation on the client from the first request (explicit_context). */
89
90
  zeroDataRetention?: boolean;
91
+ /** The clock the trace's conversation record reads. Defaults to Date.now. */
92
+ now?: () => number;
90
93
  /**
91
- * Environment for the wire-capture gate (HUMANISH_CUA_WIRE_CAPTURE_DIR — see the
94
+ * Environment for the wire-capture gate (HUMANISH_CUA_WIRE_CAPTURE_DIR; see the
92
95
  * module header). Injectable so deterministic tests control the gate without
93
96
  * mutating process.env. Defaults to process.env.
94
97
  */
@@ -100,7 +103,7 @@ export interface OpenAiResponsesProviderOptions {
100
103
  * call outputs (with the latest screenshot) and thread state via
101
104
  * previous_response_id, transparently falling back to explicit-context mode if
102
105
  * the account rejects server-side retention. Transient HTTP failures are retried
103
- * with exponential backoff. Returns ONLY a CuaTurn from nextTurn; nothing
106
+ * with exponential backoff. Returns only a CuaTurn from nextTurn; nothing
104
107
  * sensitive (the key, the request body, the screenshot, the raw response body)
105
108
  * is ever returned or logged.
106
109
  */
@@ -1,7 +1,8 @@
1
1
  import { validClosingReport } from "./loop.js";
2
2
  import { CuaAdmissionLimitError, isCuaAdmissionLimitError } from "./admission-limit.js";
3
3
  import { CuaPromptRefusedError } from "./provider-error.js";
4
- import { acceptReply, debriefRequestBody, turnRequestBody, } from "./openai-requests.js";
4
+ import { CarriedConversation } from "./openai-context.js";
5
+ import { acceptReply, ConversationRecord, debriefRequestBody, turnInputItems, turnRequestBody, } from "./openai-requests.js";
5
6
  import { asRecord, optionalString, parseOpenAiResponse, } from "./openai-wire.js";
6
7
  import { redactText } from "../../evidence/redaction.js";
7
8
  import { isMaxOutputTokens } from "../output-token-limit.js";
@@ -10,35 +11,35 @@ import { OPENAI_RESPONSES_URL } from "../openai-endpoint.js";
10
11
  // A public-safe re-derivation of the OpenAI Responses API computer-use provider,
11
12
  // behind the CuaProvider port from src/actors/computer-use/loop.ts. The pure wire mapping
12
13
  // (openAiActionToCua, parseOpenAiResponse and the request builders) is in openai-wire.ts.
13
- // This module is the live shim: createOpenAiResponsesProvider does a RAW POST to the
14
+ // This module is the live shim: createOpenAiResponsesProvider does a raw POST to the
14
15
  // Responses endpoint (no SDK dependency) through an injectable FetchLike seam, so the retry,
15
16
  // ZDR fallback, and state threading are testable with a fake.
16
17
  //
17
18
  // Public-safety invariants (this is an OSS repo): the apiKey only ever appears in
18
19
  // the Authorization header, never in a returned object, thrown error, or comment.
19
20
  // Request bodies (which carry base64 screenshots and the persona instructions)
20
- // and screenshots are never logged or returned; nextTurn returns ONLY a CuaTurn,
21
+ // and screenshots are never logged or returned; nextTurn returns only a CuaTurn,
21
22
  // and the engine handles redaction of CuaTurn fields downstream. Error messages
22
23
  // carry the HTTP status only, never the response body (it can echo the input).
23
24
  //
24
- // Wire capture (fixture provenance). The 0.6.1 parser incident — the parser read
25
+ // Wire capture (fixture provenance). In the 0.6.1 parser incident, the parser read
25
26
  // `computer_call.action` (singular) while the live API returns `actions` (array),
26
- // and the hand-written fixtures encoded the SAME wrong shape, so tests passed in
27
- // lockstep with the bug while every live action was silently dropped — taught us
28
- // that deterministic fixtures must derive from CAPTURED live wire shapes, never
27
+ // and the hand-written fixtures encoded the same wrong shape, so tests passed in
28
+ // lockstep with the bug while every live action was silently dropped. It taught us
29
+ // that deterministic fixtures must derive from captured live wire shapes, never
29
30
  // from memory. Setting HUMANISH_CUA_WIRE_CAPTURE_DIR makes the live shim persist
30
- // each successful Responses RESPONSE body into that directory as pretty-printed
31
+ // each successful Responses response body into that directory as pretty-printed
31
32
  // JSON, one file per provider call in call order (wire-001.json, wire-002.json,
32
33
  // ...), for refreshing fixtures. The capture seam is:
33
- // - OPT-IN: unset (or empty) env means zero behavior change — nothing is written;
34
- // - RESPONSE-side only: request bodies carry base64 screenshots and the persona
35
- // instructions and are NEVER captured; non-ok response bodies can echo the
34
+ // - Opt-in: unset (or empty) env means zero behavior change, and nothing is written;
35
+ // - Response-side only: request bodies carry base64 screenshots and the persona
36
+ // instructions and are never captured; non-ok response bodies can echo the
36
37
  // request and are never captured either;
37
- // - REDACTED: every string field (keys and values) passes through the shared
38
+ // - Redacted: every string field (keys and values) passes through the shared
38
39
  // redactText (src/evidence/redaction.ts) before writing, so a secret-shaped echo in a
39
40
  // response cannot persist to disk.
40
41
  // Point the env var at a gitignored path (e.g. under .humanish/): raw captures must
41
- // never be committed — fixtures derived from them must be minimal, hand-reviewed
42
+ // never be committed; fixtures derived from them must be minimal, hand-reviewed
42
43
  // excerpts checked into tests deliberately.
43
44
  export const OPENAI_RESPONSES_CU_CAPABILITIES = {
44
45
  headless: true,
@@ -52,12 +53,12 @@ export const OPENAI_RESPONSES_CU_CAPABILITIES = {
52
53
  };
53
54
  // The flagship 5.6-generation tier ("gpt-5.6" is OpenAI's alias for this exact id; the
54
55
  // computer-use guide's own examples run on it). Explicit tier id so trace provenance and the
55
- // rate-table key stay stable if OpenAI repoints the alias (#334).
56
+ // rate-table key stay stable if OpenAI repoints the alias.
56
57
  export const DEFAULT_OPENAI_CU_MODEL = "gpt-5.6-sol";
57
58
  /**
58
59
  * The effort a request carries when a lab declares none. Exported because a default that only
59
60
  * exists as a literal inside the provider is exactly how it stayed invisible: the lab surface has
60
- * to be able to say what will actually run (#497).
61
+ * to be able to say what will actually run.
61
62
  */
62
63
  export const DEFAULT_OPENAI_CU_REASONING_EFFORT = "medium";
63
64
  // ---------------------------------------------------------------------------
@@ -66,7 +67,7 @@ export const DEFAULT_OPENAI_CU_REASONING_EFFORT = "medium";
66
67
  /** The opt-in gate for response wire capture: a directory path, or unset for off. */
67
68
  export const WIRE_CAPTURE_ENV = "HUMANISH_CUA_WIRE_CAPTURE_DIR";
68
69
  /**
69
- * Deep-copy a captured wire value with every string — object keys included —
70
+ * Deep-copy a captured wire value with every string (object keys included)
70
71
  * passed through the shared redactText, so a secret-shaped echo in a response
71
72
  * can never persist to disk. Pure; non-string primitives pass through unchanged.
72
73
  */
@@ -93,7 +94,7 @@ export const RETRY_AFTER_CAP_MS = 60_000;
93
94
  * Parse a Retry-After header (delay-seconds or an HTTP-date) into milliseconds from `now`;
94
95
  * undefined when absent or unreadable. OpenAI's 2026-09-02 change added `429 slow_down` and
95
96
  * `503 server_is_overloaded`, both of which may carry it; a fixed 200/400/800 ms backoff against
96
- * a 20 s hint burns every retry inside the hint and ends the lane for nothing.
97
+ * a 20 s hint burns every retry inside the hint and ends the participant's session for nothing.
97
98
  */
98
99
  export function retryAfterMs(value, now) {
99
100
  if (value === null || value === undefined)
@@ -109,7 +110,7 @@ export function retryAfterMs(value, now) {
109
110
  return Math.max(0, at - now);
110
111
  }
111
112
  /**
112
- * The provider error codes a lane's reason may name. Read from a non-ok body, which is never
113
+ * The provider error codes a participant's reason may name. Read from a non-ok body, which is never
113
114
  * kept or logged (it can echo the input); only a code on this list crosses over.
114
115
  */
115
116
  const NAMED_PROVIDER_ERROR_CODES = [
@@ -222,7 +223,7 @@ function defaultDelay(ms) {
222
223
  function isAbortError(error) {
223
224
  return error instanceof Error && error.name === "AbortError";
224
225
  }
225
- // Opt-in response wire capture (see module header): an undefined directory means OFF and zero
226
+ // Opt-in response wire capture (see module header): an undefined directory means off and zero
226
227
  // behavior change. The counter is per-provider, so file order is call order.
227
228
  function createWireCapture(captureDir) {
228
229
  let captureCount = 0;
@@ -237,7 +238,7 @@ function createWireCapture(captureDir) {
237
238
  };
238
239
  return {
239
240
  prepareNext,
240
- // Fails loud: a silent capture failure would mean missing turns in a fixture refresh — the
241
+ // Fails loud: a silent capture failure would mean missing turns in a fixture refresh: the
241
242
  // exact "fixtures drift from the wire" pathology capture exists to prevent.
242
243
  record: async (raw) => {
243
244
  if (captureDir === undefined)
@@ -252,7 +253,7 @@ function createWireCapture(captureDir) {
252
253
  }
253
254
  // POST the JSON body and return the parsed JSON on success. Retries on
254
255
  // transient statuses (408/409/429/>=500). Maps a ZDR-policy 400 to a typed
255
- // ZdrError; any other non-ok status throws with the STATUS ONLY (never the
256
+ // ZdrError; any other non-ok status throws with the status only (never the
256
257
  // body, which can echo the input/screenshot).
257
258
  async function postResponse(transport, body, signal, retries, interaction, spend) {
258
259
  // Preflight the deterministic next capture leaf before any network side
@@ -300,7 +301,7 @@ async function postResponse(transport, body, signal, retries, interaction, spend
300
301
  }
301
302
  if (res.ok) {
302
303
  const parsed = await res.json();
303
- // Capture AFTER ok and BEFORE parse-to-CuaTurn: responses only, never the
304
+ // Capture after ok and before parse-to-CuaTurn: responses only, never the
304
305
  // request (screenshots/instructions) and never a non-ok body (input echo).
305
306
  await transport.capture.record(parsed);
306
307
  return parsed;
@@ -353,7 +354,7 @@ async function postResponse(transport, body, signal, retries, interaction, spend
353
354
  * call outputs (with the latest screenshot) and thread state via
354
355
  * previous_response_id, transparently falling back to explicit-context mode if
355
356
  * the account rejects server-side retention. Transient HTTP failures are retried
356
- * with exponential backoff. Returns ONLY a CuaTurn from nextTurn; nothing
357
+ * with exponential backoff. Returns only a CuaTurn from nextTurn; nothing
357
358
  * sensitive (the key, the request body, the screenshot, the raw response body)
358
359
  * is ever returned or logged.
359
360
  */
@@ -379,10 +380,11 @@ export function createOpenAiResponsesProvider(options) {
379
380
  const state = {
380
381
  lastResponseId: undefined,
381
382
  pendingCallIds: [],
382
- lastOutputItems: [],
383
+ replies: 0,
384
+ conversation: new CarriedConversation(),
383
385
  mode: options.zeroDataRetention ? "explicit_context" : "previous_response_id",
384
386
  // Latches to undefined (stop asking) for the rest of the session when the
385
- // account/model rejects the summary request — see OpenAiResponsesProviderOptions.
387
+ // account/model rejects the summary request; see OpenAiResponsesProviderOptions.
386
388
  reasoningSummary: options.reasoningSummary === "off" ? undefined : (options.reasoningSummary ?? "auto"),
387
389
  };
388
390
  const transport = {
@@ -396,15 +398,16 @@ export function createOpenAiResponsesProvider(options) {
396
398
  },
397
399
  };
398
400
  const post = (body, signal, retries = maxRetries, interaction = true, spend) => postResponse(transport, body, signal, retries, interaction, spend);
401
+ const record = new ConversationRecord(options.zeroDataRetention === true, options.now ?? Date.now);
399
402
  // POST with the recoverable-policy latches: a ZDR rejection switches to explicit-context mode; a
400
403
  // reasoning-summary rejection latches summaries off. Each latch can flip only once, so the loop
401
404
  // is bounded; anything else rethrows. The body is rebuilt per attempt so a flipped latch shows.
402
- const postTurn = async (req, signal, spend) => {
405
+ const postTurn = async (req, sent, signal, spend) => {
403
406
  if (options.singleDispatch === true)
404
- return post(turnRequestBody(settings, state, req), signal, 0);
407
+ return post(turnRequestBody(settings, state, req, sent), signal, 0);
405
408
  for (;;) {
406
409
  try {
407
- return await post(turnRequestBody(settings, state, req), signal, maxRetries, true, spend);
410
+ return await post(turnRequestBody(settings, state, req, sent), signal, maxRetries, true, spend);
408
411
  }
409
412
  catch (error) {
410
413
  if (error instanceof SummaryRejectionError && state.reasoningSummary !== undefined) {
@@ -412,6 +415,7 @@ export function createOpenAiResponsesProvider(options) {
412
415
  continue;
413
416
  }
414
417
  if (error instanceof ZdrError && state.mode !== "explicit_context") {
418
+ record.switched();
415
419
  state.mode = "explicit_context";
416
420
  continue;
417
421
  }
@@ -421,12 +425,15 @@ export function createOpenAiResponsesProvider(options) {
421
425
  };
422
426
  const requestTurn = async (req, signal, closing = false, spend) => {
423
427
  await capture.prepareNext();
428
+ const sent = turnInputItems(state, req);
424
429
  // A closing report makes exactly one request: no HTTP or policy-latch retries.
425
430
  const raw = closing
426
- ? await post(debriefRequestBody(settings, state, req), signal, 0, false)
427
- : await postTurn(req, signal, spend);
431
+ ? await post(debriefRequestBody(settings, state, req, sent), signal, 0, false)
432
+ : await postTurn(req, sent, signal, spend);
433
+ if (!closing)
434
+ record.requested(state, sent);
428
435
  const parsed = parseOpenAiResponse(raw);
429
- acceptReply(state, parsed, closing);
436
+ acceptReply(state, parsed, closing, sent);
430
437
  if (closing) {
431
438
  // Refusals, incomplete output, malformed JSON, and invalid shapes remain no-report results.
432
439
  // Never promote raw JSON or a fallback paragraph into a structured finding.
@@ -445,14 +452,14 @@ export function createOpenAiResponsesProvider(options) {
445
452
  return {
446
453
  id: "openai-responses-cu",
447
454
  version: model,
448
- // The effort the wire actually carries, not the one the lab asked for — the provider defaults
449
- // an absent request to "medium", and the trace has to say what produced it (#497).
455
+ // The effort the wire actually carries, not the one the lab asked for: the provider defaults
456
+ // an absent request to "medium", and the trace has to say what produced it.
450
457
  modelSettings: {
451
458
  reasoningEffort,
452
459
  ...(maxOutputTokens === undefined ? {} : { maxOutputTokens }),
453
460
  },
454
461
  capabilities: OPENAI_RESPONSES_CU_CAPABILITIES,
455
- // This is a VISION provider: nextTurn sends the screenshot as the computer_call_output, so
462
+ // This is a vision provider: nextTurn sends the screenshot as the computer_call_output, so
456
463
  // it cannot reason over a screenshot-less observation. The loop reads this to fail closed
457
464
  // (harness_error) when a state-only executor is paired with it (provider-authoring contract).
458
465
  requiresFrame: true,
@@ -461,8 +468,12 @@ export function createOpenAiResponsesProvider(options) {
461
468
  return interactionUsageIncomplete;
462
469
  },
463
470
  nextTurn: (req, signal, spend) => requestTurn(req, signal, false, spend),
464
- // Stateless mode retains only the latest output packet, not the whole session needed for
465
- // retrospective claims. This getter follows both configured ZDR and a runtime policy latch.
471
+ get conversation() {
472
+ return record.snapshot(state);
473
+ },
474
+ // An explicit-context conversation summarizes its oldest turns past its budget, so it may not
475
+ // hold the whole session a retrospective report needs. This getter follows both configured
476
+ // ZDR and a runtime policy latch.
466
477
  get debrief() {
467
478
  return state.mode === "explicit_context" || state.lastResponseId === undefined
468
479
  ? undefined
@@ -1,5 +1,7 @@
1
1
  import type { CuaTurnRequest } from "./loop.js";
2
2
  import type { ReasoningEffort } from "../reasoning-effort.js";
3
+ import type { ActorConversation } from "../contract.js";
4
+ import { CarriedConversation } from "./openai-context.js";
3
5
  import { type OpenAiReasoningSummary, type ParsedOpenAiResponse } from "./openai-wire.js";
4
6
  /** Request settings fixed for a provider's whole session. */
5
7
  export interface OpenAiRequestSettings {
@@ -13,23 +15,47 @@ export interface OpenAiConversationState {
13
15
  lastResponseId: string | undefined;
14
16
  /** computer_call ids the next request owes an output for. */
15
17
  pendingCallIds: string[];
16
- /** The last reply's output items, resent in explicit-context mode. */
17
- lastOutputItems: unknown[];
18
+ /** Accepted replies so far; the next request is number `replies + 1`. */
19
+ replies: number;
20
+ /** The whole conversation, which explicit-context requests carry within its token budget. */
21
+ conversation: CarriedConversation;
18
22
  /** explicit_context after a zero-data-retention rejection or when configured. */
19
23
  mode: "previous_response_id" | "explicit_context";
20
24
  /** Undefined once the account or model rejected reasoning summaries. */
21
25
  reasoningSummary: OpenAiReasoningSummary | undefined;
22
26
  }
23
27
  /**
24
- * The body of the next participant request: the opening request with the first screen, or a
25
- * continuation that answers each pending computer_call with the latest screenshot.
28
+ * The items the next request adds to the conversation: the opening message with the first
29
+ * screen, or an output for each pending computer_call with the latest screenshot and any hint.
30
+ * Built once per turn, so every attempt at the request and the accepted reply see the same items.
26
31
  */
27
- export declare function turnRequestBody(settings: OpenAiRequestSettings, state: OpenAiConversationState, req: CuaTurnRequest): Record<string, unknown>;
32
+ export declare function turnInputItems(state: OpenAiConversationState, req: CuaTurnRequest): readonly unknown[];
33
+ /**
34
+ * The body of the next participant request: the opening request, or a continuation carrying
35
+ * `sent` (turnInputItems). A threaded continuation names the previous response; an
36
+ * explicit-context one carries the conversation ahead of `sent`.
37
+ */
38
+ export declare function turnRequestBody(settings: OpenAiRequestSettings, state: OpenAiConversationState, req: CuaTurnRequest, sent: readonly unknown[]): Record<string, unknown>;
28
39
  /** The body of the read-only closing report: no tools, a small output limit, a strict schema. */
29
- export declare function debriefRequestBody(settings: OpenAiRequestSettings, state: OpenAiConversationState, req: CuaTurnRequest): Record<string, unknown>;
40
+ export declare function debriefRequestBody(settings: OpenAiRequestSettings, state: OpenAiConversationState, req: CuaTurnRequest, sent: readonly unknown[]): Record<string, unknown>;
30
41
  /**
31
- * Move the conversation on to an accepted reply. A participant reply cut off by the output limit
32
- * is set aside, so the next request is the same one again (outputLimitRetry); its actions never
33
- * run, so no call output is owed for them.
42
+ * Move the conversation on to an accepted reply to a request that added `sent`. A participant
43
+ * reply cut off by the output limit is set aside, so the next request is the same one again
44
+ * (outputLimitRetry); its actions never run, so no call output is owed for them.
34
45
  */
35
- export declare function acceptReply(state: OpenAiConversationState, parsed: ParsedOpenAiResponse, closing: boolean): void;
46
+ export declare function acceptReply(state: OpenAiConversationState, parsed: ParsedOpenAiResponse, closing: boolean, sent: readonly unknown[]): void;
47
+ /** The trace's account of how a session carried its conversation (ActorConversation). */
48
+ export declare class ConversationRecord {
49
+ private readonly now;
50
+ private explicitReason;
51
+ private switchedAt;
52
+ private switchedAtRequest;
53
+ private summarizedTurns;
54
+ private readonly requests;
55
+ constructor(configured: boolean, now: () => number);
56
+ /** The organization rejected server-side state, so the request being sent is explicit_context. */
57
+ switched(): void;
58
+ /** A participant request just went out with `sent` after the carried conversation. */
59
+ requested(state: OpenAiConversationState, sent: readonly unknown[]): void;
60
+ snapshot(state: OpenAiConversationState): ActorConversation;
61
+ }