humanish 0.107.0 → 0.109.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 (671) hide show
  1. package/ARCHITECTURE.md +73 -69
  2. package/CHANGELOG.md +27 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +148 -175
  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-trace.js +2 -1
  14. package/dist/actors/codex/app-server-ui.js +1 -1
  15. package/dist/actors/codex/codex-admission.d.ts +91 -0
  16. package/dist/actors/codex/codex-admission.js +150 -0
  17. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  18. package/dist/actors/codex/restricted-executable.js +8 -8
  19. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  20. package/dist/actors/codex/restricted-launch.js +1 -1
  21. package/dist/actors/codex/restricted-participant.js +20 -18
  22. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  23. package/dist/actors/codex/restricted-policy.js +2 -2
  24. package/dist/actors/codex/restricted-session.d.ts +3 -3
  25. package/dist/actors/codex/restricted-session.js +10 -5
  26. package/dist/actors/computer-use/actor.d.ts +18 -18
  27. package/dist/actors/computer-use/actor.js +4 -4
  28. package/dist/actors/computer-use/admission-limit.d.ts +3 -3
  29. package/dist/actors/computer-use/admission-limit.js +4 -4
  30. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  31. package/dist/actors/computer-use/executor-error.js +3 -3
  32. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  33. package/dist/actors/computer-use/loop/actions.js +15 -15
  34. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  35. package/dist/actors/computer-use/loop/backstop.js +14 -12
  36. package/dist/actors/computer-use/loop/debrief.js +2 -2
  37. package/dist/actors/computer-use/loop/ending.d.ts +6 -6
  38. package/dist/actors/computer-use/loop/ending.js +18 -17
  39. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  40. package/dist/actors/computer-use/loop/observation.js +15 -14
  41. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  42. package/dist/actors/computer-use/loop/provider-call.js +12 -12
  43. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  44. package/dist/actors/computer-use/loop/session.js +4 -4
  45. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  46. package/dist/actors/computer-use/loop/spend.js +1 -1
  47. package/dist/actors/computer-use/loop/trace.js +11 -9
  48. package/dist/actors/computer-use/loop/types.d.ts +47 -45
  49. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  50. package/dist/actors/computer-use/loop/usage.js +2 -2
  51. package/dist/actors/computer-use/loop.d.ts +6 -1
  52. package/dist/actors/computer-use/loop.js +26 -4
  53. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  54. package/dist/actors/computer-use/openai-context.js +214 -0
  55. package/dist/actors/computer-use/openai-provider.d.ts +13 -10
  56. package/dist/actors/computer-use/openai-provider.js +52 -41
  57. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  58. package/dist/actors/computer-use/openai-requests.js +82 -15
  59. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  60. package/dist/actors/computer-use/openai-wire.js +36 -34
  61. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  62. package/dist/actors/computer-use/provider-error.js +6 -6
  63. package/dist/actors/contract.d.ts +82 -47
  64. package/dist/actors/contract.js +30 -24
  65. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  66. package/dist/actors/local-agent/claude-session.js +13 -12
  67. package/dist/actors/local-agent/cli.d.ts +9 -7
  68. package/dist/actors/local-agent/cli.js +24 -28
  69. package/dist/actors/local-agent/readiness.d.ts +2 -2
  70. package/dist/actors/local-agent/readiness.js +4 -4
  71. package/dist/actors/reasoning-effort.js +8 -8
  72. package/dist/actors/registry.d.ts +12 -12
  73. package/dist/actors/registry.js +21 -20
  74. package/dist/actors/scripted-browser/actor.d.ts +10 -10
  75. package/dist/actors/scripted-browser/actor.js +17 -17
  76. package/dist/actors/scripted-browser/browser-command.js +1 -1
  77. package/dist/actors/scripted-browser/steps.js +1 -1
  78. package/dist/actors/scripted-browser/types.d.ts +1 -1
  79. package/dist/actors/stop-conditions.d.ts +1 -1
  80. package/dist/analysis/automatic-completion.d.ts +7 -7
  81. package/dist/analysis/automatic-completion.js +1 -1
  82. package/dist/analysis/automatic-config.d.ts +6 -6
  83. package/dist/analysis/automatic-config.js +1 -1
  84. package/dist/analysis/codex-config.d.ts +6 -2
  85. package/dist/analysis/codex-config.js +22 -14
  86. package/dist/analysis/execute.d.ts +1 -1
  87. package/dist/analysis/execute.js +1 -1
  88. package/dist/analysis/service.js +5 -5
  89. package/dist/analysis/types.d.ts +6 -0
  90. package/dist/browser-control/client.js +16 -16
  91. package/dist/browser-control/dispatcher.js +4 -4
  92. package/dist/browser-control/protocol.js +14 -14
  93. package/dist/browser-control/recording-transfer.js +4 -4
  94. package/dist/browser-control/transport.js +7 -7
  95. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  96. package/dist/cli/commands/analyze.js +19 -16
  97. package/dist/cli/commands/codex.js +9 -9
  98. package/dist/cli/commands/comms.js +48 -35
  99. package/dist/cli/commands/feedback.js +20 -21
  100. package/dist/cli/commands/migrate.d.ts +4 -0
  101. package/dist/cli/commands/migrate.js +65 -0
  102. package/dist/cli/commands/observe.d.ts +0 -1
  103. package/dist/cli/commands/observe.js +136 -112
  104. package/dist/cli/commands/run-command.d.ts +10 -0
  105. package/dist/cli/commands/run-command.js +85 -0
  106. package/dist/cli/commands/runs.js +136 -139
  107. package/dist/cli/commands/setup.d.ts +2 -2
  108. package/dist/cli/commands/setup.js +27 -24
  109. package/dist/cli/commands/study-format.d.ts +9 -0
  110. package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
  111. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  112. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
  113. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  114. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  115. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  116. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
  117. package/dist/cli/commands/study-route-run.d.ts +19 -0
  118. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  119. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  120. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  121. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  122. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
  123. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  124. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  125. package/dist/cli/commands/study-run.d.ts +9 -0
  126. package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
  127. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
  128. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
  129. package/dist/cli/commands/study.d.ts +3 -0
  130. package/dist/cli/commands/study.js +146 -0
  131. package/dist/cli/commands/tui.d.ts +4 -4
  132. package/dist/cli/commands/tui.js +31 -31
  133. package/dist/cli/commands/watch.js +71 -121
  134. package/dist/cli/deprecations.d.ts +6 -0
  135. package/dist/cli/deprecations.js +18 -0
  136. package/dist/cli/doctor.d.ts +18 -8
  137. package/dist/cli/doctor.js +114 -59
  138. package/dist/cli/first-run-path.d.ts +15 -13
  139. package/dist/cli/first-run-path.js +35 -33
  140. package/dist/cli/io.d.ts +44 -9
  141. package/dist/cli/io.js +98 -23
  142. package/dist/cli/observer-follow.d.ts +3 -3
  143. package/dist/cli/observer-follow.js +6 -7
  144. package/dist/cli/orientation.d.ts +10 -7
  145. package/dist/cli/orientation.js +89 -47
  146. package/dist/cli/product-sentence.d.ts +6 -0
  147. package/dist/cli/product-sentence.js +6 -0
  148. package/dist/cli/program.d.ts +6 -1
  149. package/dist/cli/program.js +111 -43
  150. package/dist/cli/telemetry.d.ts +16 -16
  151. package/dist/cli/telemetry.js +46 -44
  152. package/dist/cli.js +1 -1
  153. package/dist/comms/capture-surface.d.ts +13 -12
  154. package/dist/comms/capture-surface.js +23 -22
  155. package/dist/comms/catch-host.d.ts +7 -7
  156. package/dist/comms/catch-host.js +17 -17
  157. package/dist/comms/connections.d.ts +1 -1
  158. package/dist/comms/connections.js +2 -2
  159. package/dist/comms/email-catch.d.ts +3 -3
  160. package/dist/comms/email-catch.js +8 -8
  161. package/dist/comms/external-evidence.d.ts +5 -5
  162. package/dist/comms/external-evidence.js +5 -4
  163. package/dist/comms/extract.js +2 -2
  164. package/dist/comms/fake-inbox.d.ts +3 -3
  165. package/dist/comms/fake-inbox.js +3 -3
  166. package/dist/comms/receiving-render.d.ts +1 -1
  167. package/dist/comms/receiving-render.js +2 -2
  168. package/dist/comms/receiving-runtime.d.ts +4 -4
  169. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  170. package/dist/comms/sandbox-catch-script.js +6 -6
  171. package/dist/comms/sandbox-catch.d.ts +38 -39
  172. package/dist/comms/sandbox-catch.js +36 -37
  173. package/dist/comms/setup.d.ts +2 -2
  174. package/dist/comms/setup.js +56 -25
  175. package/dist/comms/thread-evidence.d.ts +1 -1
  176. package/dist/comms/thread-evidence.js +6 -6
  177. package/dist/comms/types.d.ts +6 -6
  178. package/dist/comms/types.js +3 -3
  179. package/dist/evidence/frame-signature.d.ts +1 -1
  180. package/dist/evidence/frame-signature.js +4 -4
  181. package/dist/evidence/redaction.d.ts +3 -3
  182. package/dist/evidence/redaction.js +4 -4
  183. package/dist/feedback/draft.js +38 -80
  184. package/dist/feedback/export-bundle.js +1 -1
  185. package/dist/feedback/export.d.ts +5 -1
  186. package/dist/feedback/export.js +10 -10
  187. package/dist/feedback/feedback.d.ts +2 -2
  188. package/dist/feedback/feedback.js +21 -3
  189. package/dist/feedback/proof.d.ts +1 -1
  190. package/dist/feedback/proof.js +2 -2
  191. package/dist/guest/bootstrap.js +6 -6
  192. package/dist/guest/browser-tools.js +8 -8
  193. package/dist/guest/chromium-text.js +19 -19
  194. package/dist/guest/desktop-executor.d.ts +2 -2
  195. package/dist/guest/desktop-executor.js +20 -20
  196. package/dist/guest/desktop-keys.js +4 -4
  197. package/dist/guest/desktop-media.d.ts +2 -2
  198. package/dist/guest/desktop-media.js +16 -16
  199. package/dist/guest/desktop-native.d.ts +1 -1
  200. package/dist/guest/desktop-native.js +10 -10
  201. package/dist/guest/runtime-desktop.js +2 -2
  202. package/dist/guest/runtime-processes.d.ts +2 -2
  203. package/dist/guest/runtime-processes.js +2 -2
  204. package/dist/guest/runtime.js +6 -6
  205. package/dist/index.d.ts +14 -14
  206. package/dist/index.js +8 -8
  207. package/dist/keys/key-resolution.d.ts +5 -5
  208. package/dist/keys/key-resolution.js +23 -23
  209. package/dist/observer/artifact.d.ts +2 -2
  210. package/dist/observer/artifact.js +7 -7
  211. package/dist/observer/data.d.ts +6 -6
  212. package/dist/observer/data.js +5 -4
  213. package/dist/observer/exposure.d.ts +1 -1
  214. package/dist/observer/exposure.js +11 -11
  215. package/dist/observer/http.js +1 -1
  216. package/dist/observer/library.d.ts +3 -1
  217. package/dist/observer/library.js +8 -3
  218. package/dist/observer/listen.js +5 -4
  219. package/dist/observer/render.d.ts +1 -1
  220. package/dist/observer/render.js +17 -6
  221. package/dist/observer/run-routes.d.ts +4 -3
  222. package/dist/observer/run-routes.js +38 -13
  223. package/dist/observer/serve.d.ts +1 -1
  224. package/dist/observer/serve.js +7 -3
  225. package/dist/observer/tunnel.js +1 -1
  226. package/dist/observer-app.html +4 -4
  227. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  228. package/dist/routes/computer-use/bundle-parts.js +18 -17
  229. package/dist/routes/computer-use/bundle.d.ts +2 -2
  230. package/dist/routes/computer-use/bundle.js +10 -9
  231. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
  232. package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
  233. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  234. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
  235. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  236. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
  238. package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
  239. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  240. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
  241. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  242. package/dist/routes/computer-use/external-comms.js +1 -1
  243. package/dist/routes/computer-use/fanout-bundle.js +27 -26
  244. package/dist/routes/computer-use/fanout-records.js +12 -13
  245. package/dist/routes/computer-use/live-flush.d.ts +4 -4
  246. package/dist/routes/computer-use/live-flush.js +6 -6
  247. package/dist/routes/computer-use/live-phase.d.ts +5 -4
  248. package/dist/routes/computer-use/live-phase.js +8 -8
  249. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  250. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  251. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  252. package/dist/routes/computer-use/local-vm.js +3 -3
  253. package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
  254. package/dist/routes/computer-use/participant-desktop.js +5 -5
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +10 -10
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +33 -15
  259. package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
  260. package/dist/routes/computer-use/participant-prompt.js +9 -9
  261. package/dist/routes/computer-use/participant-runs.d.ts +16 -16
  262. package/dist/routes/computer-use/participant-runs.js +26 -25
  263. package/dist/routes/computer-use/plan.d.ts +12 -12
  264. package/dist/routes/computer-use/plan.js +42 -42
  265. package/dist/routes/computer-use/preflight.d.ts +5 -5
  266. package/dist/routes/computer-use/preflight.js +25 -25
  267. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  268. package/dist/routes/computer-use/rerun-selection.js +4 -3
  269. package/dist/routes/computer-use/result.d.ts +4 -4
  270. package/dist/routes/computer-use/result.js +22 -21
  271. package/dist/routes/computer-use/route.d.ts +12 -11
  272. package/dist/routes/computer-use/route.js +31 -30
  273. package/dist/routes/computer-use/self-report.d.ts +7 -7
  274. package/dist/routes/computer-use/self-report.js +32 -32
  275. package/dist/routes/computer-use/setup.d.ts +23 -23
  276. package/dist/routes/computer-use/setup.js +28 -29
  277. package/dist/routes/computer-use/single-bundle.d.ts +11 -11
  278. package/dist/routes/computer-use/single-bundle.js +40 -41
  279. package/dist/routes/computer-use/subject-projection.d.ts +4 -4
  280. package/dist/routes/computer-use/subject-projection.js +6 -6
  281. package/dist/routes/computer-use/types.d.ts +71 -73
  282. package/dist/routes/computer-use/types.js +12 -12
  283. package/dist/routes/preview.d.ts +13 -7
  284. package/dist/routes/preview.js +11 -7
  285. package/dist/routes/scripted/bundle.d.ts +7 -7
  286. package/dist/routes/scripted/bundle.js +20 -18
  287. package/dist/routes/scripted/plan.d.ts +8 -8
  288. package/dist/routes/scripted/plan.js +13 -13
  289. package/dist/routes/scripted/result.d.ts +3 -3
  290. package/dist/routes/scripted/result.js +13 -13
  291. package/dist/routes/scripted/route.d.ts +9 -9
  292. package/dist/routes/scripted/route.js +15 -16
  293. package/dist/routes/scripted/scenario.d.ts +1 -1
  294. package/dist/routes/scripted/scenario.js +5 -5
  295. package/dist/routes/scripted/setup.d.ts +6 -6
  296. package/dist/routes/scripted/setup.js +8 -8
  297. package/dist/routes/scripted/subject.d.ts +5 -5
  298. package/dist/routes/scripted/subject.js +4 -4
  299. package/dist/routes/scripted/surface-records.d.ts +1 -1
  300. package/dist/routes/scripted/surface-records.js +4 -4
  301. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  302. package/dist/routes/scripted/types.d.ts +18 -20
  303. package/dist/routes/scripted/types.js +2 -2
  304. package/dist/routes/shared-world/bundle-records.js +11 -10
  305. package/dist/routes/shared-world/bundle.d.ts +5 -5
  306. package/dist/routes/shared-world/bundle.js +46 -43
  307. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  308. package/dist/routes/shared-world/checkpoints.js +2 -2
  309. package/dist/routes/shared-world/comms.d.ts +14 -14
  310. package/dist/routes/shared-world/comms.js +19 -18
  311. package/dist/routes/shared-world/external-public.d.ts +4 -3
  312. package/dist/routes/shared-world/external-public.js +16 -12
  313. package/dist/routes/shared-world/handoff.d.ts +7 -6
  314. package/dist/routes/shared-world/handoff.js +65 -57
  315. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  316. package/dist/routes/shared-world/lobby-code.js +9 -9
  317. package/dist/routes/shared-world/participant-specs.d.ts +10 -9
  318. package/dist/routes/shared-world/participant-specs.js +38 -31
  319. package/dist/routes/shared-world/plan.d.ts +9 -9
  320. package/dist/routes/shared-world/plan.js +16 -16
  321. package/dist/routes/shared-world/provenance.d.ts +2 -2
  322. package/dist/routes/shared-world/provenance.js +2 -2
  323. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  324. package/dist/routes/shared-world/provisioned.js +18 -17
  325. package/dist/routes/shared-world/result.d.ts +6 -6
  326. package/dist/routes/shared-world/result.js +29 -29
  327. package/dist/routes/shared-world/route.d.ts +11 -11
  328. package/dist/routes/shared-world/route.js +40 -39
  329. package/dist/routes/shared-world/setup.d.ts +16 -16
  330. package/dist/routes/shared-world/setup.js +23 -23
  331. package/dist/routes/shared-world/types.d.ts +55 -53
  332. package/dist/routes/shared-world/types.js +4 -4
  333. package/dist/routes/terminal/adapter.d.ts +5 -5
  334. package/dist/routes/terminal/adapter.js +9 -9
  335. package/dist/routes/terminal/bundle.d.ts +13 -13
  336. package/dist/routes/terminal/bundle.js +28 -27
  337. package/dist/routes/terminal/credentials.d.ts +8 -8
  338. package/dist/routes/terminal/credentials.js +12 -12
  339. package/dist/routes/terminal/dry-run.d.ts +4 -4
  340. package/dist/routes/terminal/dry-run.js +12 -12
  341. package/dist/routes/terminal/encoding.js +2 -2
  342. package/dist/routes/terminal/ledger.d.ts +5 -5
  343. package/dist/routes/terminal/ledger.js +14 -14
  344. package/dist/routes/terminal/lifetime.d.ts +1 -1
  345. package/dist/routes/terminal/lifetime.js +1 -1
  346. package/dist/routes/terminal/live-finish.d.ts +2 -2
  347. package/dist/routes/terminal/live-finish.js +10 -10
  348. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  349. package/dist/routes/terminal/live-sandbox.js +15 -15
  350. package/dist/routes/terminal/participant-text.js +2 -1
  351. package/dist/routes/terminal/persona.d.ts +2 -2
  352. package/dist/routes/terminal/persona.js +3 -3
  353. package/dist/routes/terminal/plan.d.ts +7 -7
  354. package/dist/routes/terminal/plan.js +15 -15
  355. package/dist/routes/terminal/recorder.js +2 -2
  356. package/dist/routes/terminal/result.d.ts +5 -5
  357. package/dist/routes/terminal/result.js +14 -14
  358. package/dist/routes/terminal/route.d.ts +9 -9
  359. package/dist/routes/terminal/route.js +19 -20
  360. package/dist/routes/terminal/sandbox.d.ts +1 -1
  361. package/dist/routes/terminal/sandbox.js +1 -1
  362. package/dist/routes/terminal/session.d.ts +5 -5
  363. package/dist/routes/terminal/session.js +14 -13
  364. package/dist/routes/terminal/token-usage.d.ts +1 -1
  365. package/dist/routes/terminal/token-usage.js +7 -8
  366. package/dist/routes/terminal/trace.d.ts +4 -4
  367. package/dist/routes/terminal/trace.js +2 -2
  368. package/dist/routes/terminal/types.d.ts +48 -50
  369. package/dist/routes/terminal/types.js +5 -5
  370. package/dist/run/bundle-shape.js +3 -3
  371. package/dist/run/bundle.d.ts +49 -49
  372. package/dist/run/bundle.js +3 -2
  373. package/dist/run/cost-summary.js +3 -3
  374. package/dist/run/costs.d.ts +23 -0
  375. package/dist/run/costs.js +79 -44
  376. package/dist/run/detail.d.ts +6 -6
  377. package/dist/run/detail.js +4 -4
  378. package/dist/run/dry-run-inputs.d.ts +1 -1
  379. package/dist/run/dry-run-inputs.js +2 -2
  380. package/dist/run/dry-run.js +20 -20
  381. package/dist/run/judge.d.ts +19 -13
  382. package/dist/run/judge.js +18 -8
  383. package/dist/run/outcomes.d.ts +1 -1
  384. package/dist/run/participant.d.ts +1 -1
  385. package/dist/run/paths.d.ts +1 -1
  386. package/dist/run/paths.js +1 -1
  387. package/dist/run/preflight-receipts.js +1 -1
  388. package/dist/run/pricing.d.ts +11 -6
  389. package/dist/run/pricing.js +22 -15
  390. package/dist/run/projection.d.ts +46 -46
  391. package/dist/run/projection.js +57 -57
  392. package/dist/run/reclaim.d.ts +1 -1
  393. package/dist/run/reclaim.js +3 -3
  394. package/dist/run/results.d.ts +5 -5
  395. package/dist/run/run-cost.d.ts +53 -0
  396. package/dist/run/run-cost.js +105 -0
  397. package/dist/run/run-index-analysis.d.ts +15 -0
  398. package/dist/run/run-index-analysis.js +77 -0
  399. package/dist/run/run-index.d.ts +19 -7
  400. package/dist/run/run-index.js +77 -64
  401. package/dist/run/run-not-found.d.ts +5 -0
  402. package/dist/run/run-not-found.js +15 -0
  403. package/dist/run/run.d.ts +6 -5
  404. package/dist/run/run.js +3 -3
  405. package/dist/run/sandbox-receipts.d.ts +2 -2
  406. package/dist/run/sandbox-receipts.js +3 -3
  407. package/dist/run/shared-world-evidence.d.ts +37 -36
  408. package/dist/run/shared-world-evidence.js +4 -4
  409. package/dist/run/shared-world-shape.d.ts +1 -1
  410. package/dist/run/shared-world-shape.js +7 -7
  411. package/dist/run/stats.d.ts +14 -8
  412. package/dist/run/stats.js +121 -63
  413. package/dist/run/status.d.ts +16 -29
  414. package/dist/run/status.js +10 -29
  415. package/dist/run/stored-runs.js +2 -1
  416. package/dist/run/stream-shape.js +1 -1
  417. package/dist/run/streams.d.ts +7 -7
  418. package/dist/run/study-provenance.d.ts +49 -0
  419. package/dist/run/study-provenance.js +66 -0
  420. package/dist/run/study-result.d.ts +11 -0
  421. package/dist/run/study-result.js +9 -0
  422. package/dist/run/text.d.ts +2 -0
  423. package/dist/run/text.js +4 -0
  424. package/dist/run-study.d.ts +112 -0
  425. package/dist/{run-lab.js → run-study.js} +52 -47
  426. package/dist/{lab → study}/adapter-extension.d.ts +15 -27
  427. package/dist/{lab → study}/adapter-extension.js +10 -45
  428. package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
  429. package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
  430. package/dist/study/composition-rules.d.ts +7 -0
  431. package/dist/{lab → study}/composition-rules.js +53 -53
  432. package/dist/study/config.d.ts +15 -0
  433. package/dist/{lab → study}/config.js +98 -41
  434. package/dist/study/convert.d.ts +33 -0
  435. package/dist/study/convert.js +432 -0
  436. package/dist/{lab → study}/device-presets.d.ts +10 -10
  437. package/dist/{lab → study}/device-presets.js +11 -11
  438. package/dist/study/discover.d.ts +75 -0
  439. package/dist/{lab → study}/discover.js +134 -95
  440. package/dist/{lab → study}/doctor.d.ts +19 -12
  441. package/dist/{lab → study}/doctor.js +58 -20
  442. package/dist/study/field-paths.d.ts +12 -0
  443. package/dist/study/field-paths.js +126 -0
  444. package/dist/study/files.d.ts +26 -0
  445. package/dist/study/files.js +44 -0
  446. package/dist/{lab → study}/init-templates.d.ts +2 -2
  447. package/dist/study/init-templates.js +421 -0
  448. package/dist/{lab → study}/init.d.ts +2 -2
  449. package/dist/{lab → study}/init.js +46 -11
  450. package/dist/study/keys.d.ts +4 -0
  451. package/dist/{lab → study}/keys.js +46 -12
  452. package/dist/study/migrate.d.ts +48 -0
  453. package/dist/study/migrate.js +408 -0
  454. package/dist/study/owned-files.d.ts +38 -0
  455. package/dist/study/owned-files.js +182 -0
  456. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  457. package/dist/{lab → study}/parse/actors.js +14 -14
  458. package/dist/study/parse/comms.d.ts +12 -0
  459. package/dist/{lab → study}/parse/comms.js +5 -5
  460. package/dist/study/parse/execution.d.ts +19 -0
  461. package/dist/{lab → study}/parse/execution.js +13 -13
  462. package/dist/study/parse/study-v3.d.ts +21 -0
  463. package/dist/study/parse/study-v3.js +259 -0
  464. package/dist/study/parse/subject-state.d.ts +30 -0
  465. package/dist/{lab → study}/parse/subject-state.js +19 -19
  466. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  467. package/dist/{lab → study}/parse/subject.js +34 -34
  468. package/dist/{lab → study}/parse/values.d.ts +3 -3
  469. package/dist/{lab → study}/parse/values.js +3 -3
  470. package/dist/{lab → study}/persona-resolve.d.ts +8 -8
  471. package/dist/{lab → study}/persona-resolve.js +6 -6
  472. package/dist/{lab → study}/plan-base.d.ts +7 -7
  473. package/dist/{lab → study}/plan-base.js +1 -1
  474. package/dist/{lab → study}/plan-participants.d.ts +12 -12
  475. package/dist/{lab → study}/plan-participants.js +4 -4
  476. package/dist/{lab → study}/plan-types.d.ts +31 -31
  477. package/dist/{lab → study}/plan-types.js +2 -2
  478. package/dist/study/plan.d.ts +13 -0
  479. package/dist/study/plan.js +101 -0
  480. package/dist/study/preflight-probes.d.ts +3 -0
  481. package/dist/{lab → study}/preflight-probes.js +20 -19
  482. package/dist/study/preflight-result.d.ts +8 -0
  483. package/dist/{lab → study}/preflight-result.js +5 -4
  484. package/dist/study/preflight.d.ts +94 -0
  485. package/dist/{lab → study}/preflight.js +12 -12
  486. package/dist/{lab → study}/requirements.d.ts +3 -3
  487. package/dist/{lab → study}/requirements.js +1 -1
  488. package/dist/study/route-inputs.d.ts +28 -0
  489. package/dist/{lab → study}/route-inputs.js +1 -1
  490. package/dist/{lab → study}/routing.d.ts +39 -33
  491. package/dist/{lab → study}/routing.js +60 -29
  492. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
  493. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
  494. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
  495. package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
  496. package/dist/study/run-study-options.d.ts +28 -0
  497. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
  498. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
  499. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  500. package/dist/{lab → study}/summary.d.ts +16 -15
  501. package/dist/{lab → study}/summary.js +21 -21
  502. package/dist/{lab → study}/tasks.d.ts +18 -18
  503. package/dist/{lab → study}/tasks.js +14 -14
  504. package/dist/{lab → study}/types.d.ts +202 -196
  505. package/dist/{lab → study}/types.js +3 -1
  506. package/dist/{lab → study}/validation.d.ts +27 -27
  507. package/dist/{lab → study}/validation.js +53 -51
  508. package/dist/study/warnings.d.ts +12 -0
  509. package/dist/{lab → study}/warnings.js +62 -34
  510. package/dist/subject/clone.d.ts +7 -7
  511. package/dist/subject/clone.js +2 -2
  512. package/dist/subject/desktop-cli.d.ts +1 -1
  513. package/dist/subject/desktop-cli.js +2 -2
  514. package/dist/subject/local-tree-archive.d.ts +2 -2
  515. package/dist/subject/local-tree-archive.js +4 -4
  516. package/dist/subject/local-tree.d.ts +4 -4
  517. package/dist/subject/node-bootstrap.js +1 -1
  518. package/dist/subject/runtime.js +9 -10
  519. package/dist/subject/serve.d.ts +5 -5
  520. package/dist/subject/serve.js +3 -3
  521. package/dist/subject/state.d.ts +4 -4
  522. package/dist/subject/state.js +1 -1
  523. package/dist/subject/steps.d.ts +6 -6
  524. package/dist/subject/steps.js +5 -5
  525. package/dist/substrates/command-failure.d.ts +3 -3
  526. package/dist/substrates/command-failure.js +3 -3
  527. package/dist/substrates/desktop-session.js +2 -2
  528. package/dist/substrates/detached.d.ts +6 -6
  529. package/dist/substrates/detached.js +7 -7
  530. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  531. package/dist/substrates/e2b/cdp-probe.js +14 -17
  532. package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
  533. package/dist/substrates/e2b/desktop-browser.js +9 -9
  534. package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
  535. package/dist/substrates/e2b/desktop-cdp.js +9 -9
  536. package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
  537. package/dist/substrates/e2b/desktop-executor.js +13 -13
  538. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  539. package/dist/substrates/e2b/desktop-geometry.js +8 -8
  540. package/dist/substrates/e2b/desktop-media.d.ts +4 -4
  541. package/dist/substrates/e2b/desktop-media.js +1 -1
  542. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  543. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  544. package/dist/substrates/e2b/lifetime.js +1 -1
  545. package/dist/substrates/e2b/sandbox.d.ts +4 -4
  546. package/dist/substrates/e2b/sandbox.js +2 -2
  547. package/dist/substrates/e2b/sdk.d.ts +12 -12
  548. package/dist/substrates/e2b/sdk.js +7 -7
  549. package/dist/substrates/local/runtime-config.d.ts +4 -4
  550. package/dist/substrates/local/runtime-config.js +4 -4
  551. package/dist/tui/actions.d.ts +1 -1
  552. package/dist/tui/actions.js +13 -13
  553. package/dist/tui/contract.d.ts +23 -23
  554. package/dist/tui/contract.js +11 -11
  555. package/dist/tui/launch.d.ts +7 -7
  556. package/dist/tui/launch.js +36 -31
  557. package/dist/tui/project.js +5 -5
  558. package/dist/tui-app.js +139 -139
  559. package/dist/verify/actor.d.ts +8 -8
  560. package/dist/verify/actor.js +36 -36
  561. package/dist/verify/artifacts.d.ts +2 -2
  562. package/dist/verify/artifacts.js +3 -3
  563. package/dist/verify/context-growth.d.ts +9 -0
  564. package/dist/verify/context-growth.js +62 -0
  565. package/dist/verify/costs.d.ts +6 -6
  566. package/dist/verify/costs.js +8 -8
  567. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  568. package/dist/verify/shared-world-concurrent.js +79 -76
  569. package/dist/verify/shared-world.d.ts +2 -2
  570. package/dist/verify/shared-world.js +16 -16
  571. package/dist/verify/subject.d.ts +5 -5
  572. package/dist/verify/subject.js +19 -19
  573. package/dist/verify/verify.js +94 -44
  574. package/docs/README.md +25 -32
  575. package/docs/architecture/actor-contract.md +60 -91
  576. package/docs/architecture/browser-control.md +1 -1
  577. package/docs/architecture/desktop-sessions.md +7 -7
  578. package/docs/architecture/external-public-shared-world.md +68 -65
  579. package/docs/architecture/github-feedback-loop.md +2 -5
  580. package/docs/architecture/guest-desktop.md +2 -2
  581. package/docs/architecture/observer.md +34 -34
  582. package/docs/architecture/restricted-codex-analysis.md +34 -28
  583. package/docs/architecture/serve.md +34 -37
  584. package/docs/architecture/state-driven-executor.md +55 -58
  585. package/docs/architecture/task-protocol-support.md +6 -6
  586. package/docs/architecture/terminal-product-route.md +70 -110
  587. package/docs/contracts/README.md +24 -0
  588. package/docs/contracts/adapter-admission.md +3 -3
  589. package/docs/contracts/adapter-fixtures.md +4 -7
  590. package/docs/contracts/core.md +1 -3
  591. package/docs/contracts/errors.md +62 -0
  592. package/docs/contracts/feedback.md +8 -9
  593. package/docs/contracts/policy.md +7 -12
  594. package/docs/contracts/run-bundle.md +42 -44
  595. package/docs/contracts/schemas.md +446 -368
  596. package/docs/contracts/study-analysis.md +7 -4
  597. package/docs/contracts/study-costs.md +28 -9
  598. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  599. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  600. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  601. package/docs/principles/actor-fidelity.md +4 -4
  602. package/docs/principles/engineering.md +3 -3
  603. package/docs/principles/invariants-and-defaults.md +38 -38
  604. package/docs/principles/self-driving-harness.md +1 -5
  605. package/docs/principles/three-roles.md +1 -1
  606. package/docs/product/automatic-analysis.md +7 -7
  607. package/examples/README.md +1 -1
  608. package/examples/participant/README.md +5 -5
  609. package/examples/participant/run.mjs +11 -10
  610. package/examples/scorer/README.md +3 -3
  611. package/examples/scorer/run.mjs +11 -12
  612. package/examples/scorer/scorer.mjs +3 -3
  613. package/package.json +16 -17
  614. package/skills/humanish/SKILL.md +64 -60
  615. package/skills/humanish/agents/openai.yaml +1 -1
  616. package/AGENTS.md +0 -99
  617. package/CONTRIBUTING.md +0 -148
  618. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  619. package/dist/actors/codex/qualified-versions.js +0 -132
  620. package/dist/cli/commands/lab-format.d.ts +0 -8
  621. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  622. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  623. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  624. package/dist/cli/commands/lab-run.d.ts +0 -9
  625. package/dist/cli/commands/lab.d.ts +0 -3
  626. package/dist/cli/commands/lab.js +0 -199
  627. package/dist/cli/renamed-options.d.ts +0 -11
  628. package/dist/cli/renamed-options.js +0 -18
  629. package/dist/lab/composition-rules.d.ts +0 -7
  630. package/dist/lab/config.d.ts +0 -7
  631. package/dist/lab/discover.d.ts +0 -65
  632. package/dist/lab/init-templates.js +0 -416
  633. package/dist/lab/keys.d.ts +0 -2
  634. package/dist/lab/parse/comms.d.ts +0 -12
  635. package/dist/lab/parse/execution.d.ts +0 -19
  636. package/dist/lab/parse/subject-state.d.ts +0 -30
  637. package/dist/lab/plan.d.ts +0 -19
  638. package/dist/lab/plan.js +0 -132
  639. package/dist/lab/preflight-probes.d.ts +0 -3
  640. package/dist/lab/preflight-result.d.ts +0 -7
  641. package/dist/lab/preflight.d.ts +0 -92
  642. package/dist/lab/route-inputs.d.ts +0 -28
  643. package/dist/lab/run-lab-options.d.ts +0 -28
  644. package/dist/lab/warnings.d.ts +0 -2
  645. package/dist/observer/static.d.ts +0 -39
  646. package/dist/observer/static.js +0 -369
  647. package/dist/run-lab.d.ts +0 -112
  648. package/docs/architecture/comms-inbox.md +0 -122
  649. package/docs/architecture/desktop-recording.md +0 -80
  650. package/docs/architecture/local-browser-runtime.md +0 -178
  651. package/docs/architecture/observer-review.md +0 -144
  652. package/docs/architecture/participant-media.md +0 -90
  653. package/docs/architecture/project-layout.md +0 -62
  654. package/docs/architecture/real-email-receiving.md +0 -136
  655. package/docs/assets/humanish-drawdb-hero.png +0 -0
  656. package/docs/assets/humanish-observer-hero.png +0 -0
  657. package/docs/goals/current.md +0 -207
  658. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  659. package/docs/product/open-source-install-experience.md +0 -240
  660. package/docs/ramp/README.md +0 -295
  661. package/docs/release/open-source-readiness.md +0 -222
  662. package/docs/release/public-readiness-standard.md +0 -210
  663. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  664. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  665. /package/dist/{lab → study}/init-paths.js +0 -0
  666. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  667. /package/dist/{lab → study}/init-plan.js +0 -0
  668. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  669. /package/dist/{lab → study}/participant-assignment.js +0 -0
  670. /package/dist/{lab → study}/persona.d.ts +0 -0
  671. /package/dist/{lab → study}/persona.js +0 -0
@@ -1,7 +1,8 @@
1
1
  import { validClosingReport } from "./loop.js";
2
- import { CuaAdmissionLimitError, isCuaAdmissionLimitError } from "./admission-limit.js";
3
- import { CuaPromptRefusedError } from "./provider-error.js";
4
- import { acceptReply, debriefRequestBody, turnRequestBody, } from "./openai-requests.js";
2
+ import { ComputerUseAdmissionLimitError, isComputerUseAdmissionLimitError, } from "./admission-limit.js";
3
+ import { ComputerUsePromptRefusedError } from "./provider-error.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
- * The effort a request carries when a lab declares none. Exported because a default that only
59
- * 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).
59
+ * The effort a request carries when a study declares none. Exported because a default that only
60
+ * exists as a literal inside the provider is exactly how it stayed invisible: the study surface has
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
  */
@@ -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
@@ -279,8 +280,8 @@ async function postResponse(transport, body, signal, retries, interaction, spend
279
280
  catch (error) {
280
281
  // An explicit local pre-dispatch limit is terminal. Recreate the fixed safe payload
281
282
  // rather than propagating caller-added message/context through the transport seam.
282
- if (isCuaAdmissionLimitError(error))
283
- throw new CuaAdmissionLimitError();
283
+ if (isComputerUseAdmissionLimitError(error))
284
+ throw new ComputerUseAdmissionLimitError();
284
285
  // Dispatch may have reached the provider. Preserve this uncertainty even when a later
285
286
  // retry succeeds or is refused locally; only that later refusal is known not to dispatch.
286
287
  // Under a spend gate the loop accounts for the attempt instead: it books a resend below
@@ -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;
@@ -316,7 +317,7 @@ async function postResponse(transport, body, signal, retries, interaction, spend
316
317
  }
317
318
  // A usage-policy flag is terminal for this prompt: typed so the loop names it, never retried.
318
319
  if (namedProviderErrorCode(bodyText) === "invalid_prompt") {
319
- throw new CuaPromptRefusedError("OpenAI", "400 invalid_prompt");
320
+ throw new ComputerUsePromptRefusedError("OpenAI", "400 invalid_prompt");
320
321
  }
321
322
  const detail = requestRejectionDetail(bodyText);
322
323
  throw new Error(`OpenAI Responses 400${detail === undefined ? "" : ` ${detail}`}`);
@@ -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 study 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
+ }
@@ -1,8 +1,10 @@
1
- import { buildCallOutput, buildContinuationRequest, buildInitialRequest, } from "./openai-wire.js";
1
+ import { CarriedConversation, estimateTokens } from "./openai-context.js";
2
+ import { buildCallOutput, buildContinuationRequest, buildInitialRequest, hintItems, openingMessage, } from "./openai-wire.js";
2
3
  /** The closing report's output limit: its own cap, or the declared limit when that is lower. */
3
4
  const CLOSING_OUTPUT_LIMIT = 1024;
4
5
  function requestContext(settings, state, instructions) {
5
6
  return {
7
+ stateless: state.mode === "explicit_context",
6
8
  model: settings.model,
7
9
  instructions,
8
10
  reasoningEffort: settings.reasoningEffort,
@@ -17,28 +19,43 @@ function requestContext(settings, state, instructions) {
17
19
  }
18
20
  /** No reply has been accepted yet, so the next request opens the conversation. */
19
21
  function isFirstTurn(state) {
20
- return state.lastResponseId === undefined && state.pendingCallIds.length === 0;
22
+ return state.replies === 0;
21
23
  }
22
24
  /**
23
- * The body of the next participant request: the opening request with the first screen, or a
24
- * continuation that answers each pending computer_call with the latest screenshot.
25
+ * The items the next request adds to the conversation: the opening message with the first
26
+ * screen, or an output for each pending computer_call with the latest screenshot and any hint.
27
+ * Built once per turn, so every attempt at the request and the accepted reply see the same items.
25
28
  */
26
- export function turnRequestBody(settings, state, req) {
29
+ export function turnInputItems(state, req) {
30
+ if (isFirstTurn(state))
31
+ return [openingMessage(req.instructions, req.observation.screenshot)];
32
+ return [
33
+ ...state.pendingCallIds.map((id) => buildCallOutput(id, req.observation.screenshot, req.acknowledgedSafetyChecks)),
34
+ ...hintItems(req.contextHint),
35
+ ];
36
+ }
37
+ /**
38
+ * The body of the next participant request: the opening request, or a continuation carrying
39
+ * `sent` (turnInputItems). A threaded continuation names the previous response; an
40
+ * explicit-context one carries the conversation ahead of `sent`.
41
+ */
42
+ export function turnRequestBody(settings, state, req, sent) {
27
43
  const ctx = requestContext(settings, state, req.instructions);
28
44
  if (isFirstTurn(state))
29
45
  return buildInitialRequest(ctx, req.observation.screenshot);
30
46
  return buildContinuationRequest({
31
47
  ctx,
32
48
  previousResponseId: state.lastResponseId,
33
- callOutputs: state.pendingCallIds.map((id) => buildCallOutput(id, req.observation.screenshot, req.acknowledgedSafetyChecks)),
34
- ...(req.contextHint === undefined ? {} : { contextHint: req.contextHint }),
35
- ...(state.mode === "explicit_context" ? { explicitContextItems: state.lastOutputItems } : {}),
49
+ callOutputs: [...sent],
50
+ ...(state.mode === "explicit_context"
51
+ ? { explicitContextItems: state.conversation.carried() }
52
+ : {}),
36
53
  });
37
54
  }
38
55
  /** The body of the read-only closing report: no tools, a small output limit, a strict schema. */
39
- export function debriefRequestBody(settings, state, req) {
56
+ export function debriefRequestBody(settings, state, req, sent) {
40
57
  return {
41
- ...turnRequestBody(settings, state, req),
58
+ ...turnRequestBody(settings, state, req, sent),
42
59
  tool_choice: "none",
43
60
  max_output_tokens: Math.min(settings.maxOutputTokens ?? CLOSING_OUTPUT_LIMIT, CLOSING_OUTPUT_LIMIT),
44
61
  text: {
@@ -60,15 +77,65 @@ export function debriefRequestBody(settings, state, req) {
60
77
  };
61
78
  }
62
79
  /**
63
- * Move the conversation on to an accepted reply. A participant reply cut off by the output limit
64
- * is set aside, so the next request is the same one again (outputLimitRetry); its actions never
65
- * run, so no call output is owed for them.
80
+ * Move the conversation on to an accepted reply to a request that added `sent`. A participant
81
+ * reply cut off by the output limit is set aside, so the next request is the same one again
82
+ * (outputLimitRetry); its actions never run, so no call output is owed for them.
66
83
  */
67
- export function acceptReply(state, parsed, closing) {
84
+ export function acceptReply(state, parsed, closing, sent) {
68
85
  if (!closing && parsed.turn.interruption === "output_limit")
69
86
  return;
70
87
  if (parsed.turn.responseId !== undefined)
71
88
  state.lastResponseId = parsed.turn.responseId;
72
89
  state.pendingCallIds = parsed.callIds;
73
- state.lastOutputItems = parsed.outputItems;
90
+ state.replies += 1;
91
+ state.conversation.accept(state.replies, sent, parsed.outputItems);
92
+ }
93
+ /** The trace's account of how a session carried its conversation (ActorConversation). */
94
+ export class ConversationRecord {
95
+ now;
96
+ explicitReason;
97
+ switchedAt;
98
+ switchedAtRequest;
99
+ summarizedTurns = 0;
100
+ requests = [];
101
+ constructor(configured, now) {
102
+ this.now = now;
103
+ if (configured)
104
+ this.explicitReason = "configured";
105
+ }
106
+ /** The organization rejected server-side state, so the request being sent is explicit_context. */
107
+ switched() {
108
+ this.explicitReason = "zdr_rejection";
109
+ this.switchedAt = new Date(this.now()).toISOString();
110
+ // Counted like requests[], which includes replies set aside at their output limit.
111
+ this.switchedAtRequest = this.requests.length + 1;
112
+ }
113
+ /** A participant request just went out with `sent` after the carried conversation. */
114
+ requested(state, sent) {
115
+ if (state.mode !== "explicit_context") {
116
+ this.requests.push({ mode: "threaded" });
117
+ return;
118
+ }
119
+ const carried = state.conversation.size();
120
+ // Only summaries a request carried count; the conversation also trims after the last reply.
121
+ this.summarizedTurns = carried.notedTurns;
122
+ this.requests.push({
123
+ mode: "explicit_context",
124
+ carriedExchanges: carried.exchanges,
125
+ carriedScreenshots: carried.screenshots,
126
+ estimatedInputTokens: carried.estimatedTokens + estimateTokens(sent),
127
+ });
128
+ }
129
+ snapshot(state) {
130
+ return {
131
+ mode: state.mode === "explicit_context" ? "explicit_context" : "threaded",
132
+ ...(this.explicitReason === undefined ? {} : { explicitReason: this.explicitReason }),
133
+ ...(this.switchedAt === undefined ? {} : { switchedAt: this.switchedAt }),
134
+ ...(this.switchedAtRequest === undefined
135
+ ? {}
136
+ : { switchedAtRequest: this.switchedAtRequest }),
137
+ summarizedTurns: this.summarizedTurns,
138
+ requests: this.requests.map((request) => ({ ...request })),
139
+ };
140
+ }
74
141
  }
@@ -1,6 +1,7 @@
1
1
  import type { CuaAction, CuaSafetyCheck, CuaTurn } from "./loop.js";
2
2
  import type { ReasoningEffort } from "../reasoning-effort.js";
3
3
  export declare function asRecord(value: unknown): Record<string, unknown>;
4
+ export declare function asArray(value: unknown): unknown[];
4
5
  export declare function optionalString(value: unknown): string | undefined;
5
6
  /**
6
7
  * Map an OpenAI computer action object to a provider-neutral CuaAction, or null
@@ -23,11 +24,16 @@ export interface ParsedOpenAiResponse {
23
24
  export declare function parseOpenAiResponse(raw: unknown): ParsedOpenAiResponse;
24
25
  export type OpenAiReasoningSummary = "auto" | "concise" | "detailed";
25
26
  export interface OpenAiCuContext {
27
+ /**
28
+ * The server keeps no conversation (explicit_context): the request asks not to be stored and
29
+ * for its reasoning back in encrypted form, so the next request can carry it.
30
+ */
31
+ stateless?: boolean;
26
32
  model: string;
27
33
  instructions: string;
28
34
  reasoningEffort: ReasoningEffort;
29
35
  maxOutputTokens?: number;
30
- /** When set, request provider-sanctioned reasoning summaries (#427). Absent = do not ask. */
36
+ /** When set, request provider-sanctioned reasoning summaries. Absent = do not ask. */
31
37
  reasoningSummary?: OpenAiReasoningSummary;
32
38
  safetyIdentifier?: string;
33
39
  }
@@ -37,14 +43,18 @@ export interface OpenAiCuContext {
37
43
  * limit when that is lower.
38
44
  */
39
45
  export declare function buildInitialRequest(ctx: OpenAiCuContext, screenshot?: Buffer): Record<string, unknown>;
46
+ /** One input message, read as the words of `sender`: the user, the developer, or the model itself. */
47
+ export declare function inputMessage(sender: "user" | "developer" | "assistant", content: readonly unknown[]): Record<string, unknown>;
48
+ /** The first request's only input item: the instructions and, when there is one, the first screen. */
49
+ export declare function openingMessage(instructions: string, screenshot?: Buffer): Record<string, unknown>;
40
50
  /**
41
51
  * Build one computer_call_output for a pending call id, carrying the latest
42
52
  * screenshot as an inline data URL. Acknowledged safety checks (if any) are
43
53
  * echoed back so the model can proceed past a check the harness approved.
44
54
  *
45
55
  * The screenshot param is `Buffer | undefined` because CuaObservation.screenshot is now
46
- * optional (a non-vision executor omits it). This provider is a VISION model (it sets
47
- * requiresFrame), so a missing frame is a hard error here — defense-in-depth: the loop's
56
+ * optional (a non-vision executor omits it). This provider is a vision model (it sets
57
+ * requiresFrame), so a missing frame is a hard error here as defense-in-depth: the loop's
48
58
  * per-turn requiresFrame guard already fails closed before this is reached, but throwing keeps
49
59
  * the mapper self-validating and isolable.
50
60
  */
@@ -52,16 +62,18 @@ export declare function buildCallOutput(callId: string, screenshot: Buffer | und
52
62
  export interface ContinuationRequestArgs {
53
63
  ctx: OpenAiCuContext;
54
64
  previousResponseId: string | undefined;
55
- callOutputs: object[];
65
+ callOutputs: readonly unknown[];
56
66
  contextHint?: string;
57
67
  explicitContextItems?: unknown[];
58
68
  }
69
+ /** An optional context hint as input items (none when there is no hint). */
70
+ export declare function hintItems(contextHint: string | undefined): unknown[];
59
71
  /**
60
72
  * Build a continuation request body. Two modes:
61
73
  * - default: thread server-side state via previous_response_id and send only the
62
74
  * new call outputs (plus an optional hint).
63
- * - explicit-context (ZDR): no previous_response_id; the prior output items are
64
- * re-sent inline ahead of the new call outputs so the model has full context
65
- * without the server retaining any.
75
+ * - explicit-context (ZDR): no previous_response_id; the carried conversation
76
+ * (openai-context.ts) is sent inline ahead of the new call outputs, so the model
77
+ * has the session without the server retaining any.
66
78
  */
67
79
  export declare function buildContinuationRequest(args: ContinuationRequestArgs): Record<string, unknown>;