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,277 @@
1
+ // The policy every app-server notification passes, whenever it arrives: during the launch
2
+ // handshake, before a turn is dispatched, during a turn, or between requests. A notification that
3
+ // carries an item is checked against the item policy whatever its method, so a new method cannot
4
+ // carry a native operation past it. A method this humanish does not know that carries no item is
5
+ // counted and reported, not refused, so a release's new progress events do not break a run.
6
+ import { codexRecord, toolPolicyViolation, } from "./restricted-policy.js";
7
+ import { RestrictedCodexStop, } from "./restricted-transport.js";
8
+ const rawCompactionTypes = ["compaction", "compaction_summary", "context_compaction"];
9
+ /** Raw response item types an analyst turn may produce. */
10
+ export const ANALYST_RAW_ITEM_TYPES = [
11
+ "message",
12
+ "reasoning",
13
+ ...rawCompactionTypes,
14
+ ];
15
+ /** A participant also runs Code Mode: `exec` custom tool calls and `wait` function calls. */
16
+ export const PARTICIPANT_RAW_ITEM_TYPES = [
17
+ ...ANALYST_RAW_ITEM_TYPES,
18
+ "custom_tool_call",
19
+ "custom_tool_call_output",
20
+ "function_call",
21
+ "function_call_output",
22
+ ];
23
+ /** Thread item types an analyst turn may produce. */
24
+ export const ANALYST_ITEM_TYPES = [
25
+ "userMessage",
26
+ "agentMessage",
27
+ "reasoning",
28
+ "contextCompaction",
29
+ ];
30
+ /** A participant also has its one dynamic tool. */
31
+ export const PARTICIPANT_ITEM_TYPES = [...ANALYST_ITEM_TYPES, "dynamicToolCall"];
32
+ /**
33
+ * Server notification methods in Codex CLI 0.160.0's app-server schema
34
+ * (`codex app-server generate-json-schema --experimental`, ServerNotification), plus two it sends
35
+ * outside that union: rawResponseItem/completed, and rawResponse/completed, whose v2 definition
36
+ * (RawResponseCompletedNotification) carries only a response id and usage.
37
+ */
38
+ export const KNOWN_CODEX_NOTIFICATIONS = new Set([
39
+ "account/gatewayOAuth/changed",
40
+ "account/login/completed",
41
+ "account/rateLimits/updated",
42
+ "account/updated",
43
+ "app/list/updated",
44
+ "autoApprovalReview/strictReviewRequired",
45
+ "command/exec/outputDelta",
46
+ "configWarning",
47
+ "deprecationNotice",
48
+ "error",
49
+ "externalAgentConfig/import/completed",
50
+ "externalAgentConfig/import/progress",
51
+ "fs/changed",
52
+ "fuzzyFileSearch/sessionCompleted",
53
+ "fuzzyFileSearch/sessionUpdated",
54
+ "guardianWarning",
55
+ "hook/completed",
56
+ "hook/started",
57
+ "item/agentMessage/delta",
58
+ "item/autoApprovalReview/completed",
59
+ "item/autoApprovalReview/started",
60
+ "item/commandExecution/outputDelta",
61
+ "item/commandExecution/terminalInteraction",
62
+ "item/completed",
63
+ "item/fileChange/outputDelta",
64
+ "item/fileChange/patchUpdated",
65
+ "item/mcpToolCall/progress",
66
+ "item/plan/delta",
67
+ "item/reasoning/summaryPartAdded",
68
+ "item/reasoning/summaryTextDelta",
69
+ "item/reasoning/textDelta",
70
+ "item/started",
71
+ "mcpServer/event/stream/notification",
72
+ "mcpServer/oauthLogin/completed",
73
+ "mcpServer/startupStatus/updated",
74
+ "model/rerouted",
75
+ "model/safetyBuffering/updated",
76
+ "model/verification",
77
+ "modelProvider/authRecoveryCompleted",
78
+ "modelProvider/authRecoveryStarted",
79
+ "process/exited",
80
+ "process/outputDelta",
81
+ "project/changed",
82
+ "rawResponse/completed",
83
+ "rawResponseItem/completed",
84
+ "remoteControl/status/changed",
85
+ "serverRequest/resolved",
86
+ "skills/changed",
87
+ "thread/archived",
88
+ "thread/attachment/updated",
89
+ "thread/closed",
90
+ "thread/compacted",
91
+ "thread/deleted",
92
+ "thread/environment/connected",
93
+ "thread/environment/disconnected",
94
+ "thread/goal/cleared",
95
+ "thread/goal/updated",
96
+ "thread/name/updated",
97
+ "thread/project/updated",
98
+ "thread/queue/changed",
99
+ "thread/realtime/closed",
100
+ "thread/realtime/error",
101
+ "thread/realtime/item/completed",
102
+ "thread/realtime/item/started",
103
+ "thread/realtime/item/transcript/delta",
104
+ "thread/realtime/itemAdded",
105
+ "thread/realtime/outputAudio/delta",
106
+ "thread/realtime/sdp",
107
+ "thread/realtime/started",
108
+ "thread/realtime/transcript/delta",
109
+ "thread/realtime/transcript/done",
110
+ "thread/reverted",
111
+ "thread/settings/updated",
112
+ "thread/started",
113
+ "thread/status/changed",
114
+ "thread/tokenUsage/updated",
115
+ "thread/unarchived",
116
+ "turn/completed",
117
+ "turn/diff/updated",
118
+ "turn/moderationMetadata",
119
+ "turn/plan/updated",
120
+ "turn/started",
121
+ "warning",
122
+ "windows/worldWritableWarning",
123
+ "windowsSandbox/setupCompleted",
124
+ ]);
125
+ /** The item policy for a session: a participant's tool name is read at each use. */
126
+ export function notificationPolicyOf(participant) {
127
+ return { participant: participant !== undefined, toolName: () => participant?.tool.name };
128
+ }
129
+ /** Adds one notification of `method` to a session's unknown-method counts. */
130
+ export function countUnknownNotification(counts, method) {
131
+ counts.set(method, (counts.get(method) ?? 0) + 1);
132
+ }
133
+ const isItem = (value) => value !== null &&
134
+ typeof value === "object" &&
135
+ !Array.isArray(value) &&
136
+ typeof value.type === "string";
137
+ /**
138
+ * The items a notification carries, each with the method whose policy it takes, or null when one
139
+ * is malformed. 0.160.0's schema puts a ThreadItem in `params.item` (item/started,
140
+ * item/completed), `params.turn.items` (turn/started, turn/completed) and
141
+ * `params.thread.turns[].items` (thread/started). An `item` array and an `items` array are read
142
+ * too, for a release that adds them. A nested ThreadItem takes the item/completed policy.
143
+ */
144
+ export function notificationItems(method, params) {
145
+ const found = [];
146
+ let malformed = false;
147
+ const add = (value, itemMethod) => {
148
+ if (isItem(value))
149
+ found.push({ method: itemMethod, item: value });
150
+ else
151
+ malformed = true;
152
+ };
153
+ const addAll = (value, itemMethod) => {
154
+ if (Array.isArray(value))
155
+ for (const item of value)
156
+ add(item, itemMethod);
157
+ };
158
+ if (Array.isArray(params.item))
159
+ addAll(params.item, method);
160
+ else if (params.item !== undefined && params.item !== null)
161
+ add(params.item, method);
162
+ addAll(params.items, method);
163
+ addAll(codexRecord(params.turn).items, "item/completed");
164
+ const turns = codexRecord(params.thread).turns;
165
+ if (Array.isArray(turns))
166
+ for (const turn of turns)
167
+ addAll(codexRecord(turn).items, "item/completed");
168
+ return malformed ? null : found;
169
+ }
170
+ /**
171
+ * How a notification fares under the item policy: it carries no item, only allowed items, or a
172
+ * disallowed or malformed one.
173
+ */
174
+ export function itemPolicyOf(method, params, policy) {
175
+ const found = notificationItems(method, params);
176
+ if (found === null)
177
+ return "violation";
178
+ if (found.length === 0)
179
+ return "none";
180
+ return found.some((entry) => itemPolicyViolation(entry.method, entry.item, policy))
181
+ ? "violation"
182
+ : "allowed";
183
+ }
184
+ /**
185
+ * True when an item breaks the item policy. rawResponseItem/completed, and an item of a raw type
186
+ * under any method other than item/started or item/completed, use the raw-item policy. Every
187
+ * other item uses the thread-item policy: an allowed type, the participant's one dynamic tool, and
188
+ * no agent message that delivers asynchronously or asks a question.
189
+ */
190
+ export function itemPolicyViolation(method, item, policy) {
191
+ const rawTypes = policy.participant ? PARTICIPANT_RAW_ITEM_TYPES : ANALYST_RAW_ITEM_TYPES;
192
+ const threadItemMethod = method === "item/started" || method === "item/completed";
193
+ const type = String(item.type);
194
+ if (method === "rawResponseItem/completed" || (!threadItemMethod && rawTypes.includes(type)))
195
+ return toolPolicyViolation("rawResponseItem/completed", item, rawTypes);
196
+ const itemTypes = policy.participant ? PARTICIPANT_ITEM_TYPES : ANALYST_ITEM_TYPES;
197
+ if (!itemTypes.includes(type))
198
+ return true;
199
+ if (type === "dynamicToolCall" && (item.tool !== policy.toolName() || item.namespace !== null))
200
+ return true;
201
+ return toolPolicyViolation("item/completed", item, rawTypes);
202
+ }
203
+ /**
204
+ * The handler for notifications outside a dispatched turn: during the handshake, before
205
+ * turn/start, between requests and while closing. A disallowed or malformed item refuses; an
206
+ * unknown method without an item is counted; anything else is ignored, as there is no turn to
207
+ * apply it to.
208
+ */
209
+ export function idleNotificationHandler(policy, recordUnknown, refuse) {
210
+ return (method, params) => {
211
+ const items = itemPolicyOf(method, params, policy);
212
+ if (items === "violation")
213
+ refuse("codex_tool_call");
214
+ else if (items === "none" && !KNOWN_CODEX_NOTIFICATIONS.has(method))
215
+ recordUnknown(method);
216
+ };
217
+ }
218
+ /** The run warning for unknown notification methods, or undefined when there were none. */
219
+ export function unknownNotificationsWarning(counts, cliVersion) {
220
+ const entries = Object.entries(counts ?? {}).sort(([a], [b]) => a.localeCompare(b));
221
+ if (entries.length === 0)
222
+ return undefined;
223
+ const list = entries.map(([method, count]) => `${method} ×${count}`).join(", ");
224
+ return `Codex CLI${cliVersion === undefined ? "" : ` ${cliVersion}`} sent notification methods humanish does not know: ${list}. They carried no item and were ignored.`;
225
+ }
226
+ /** The run warning for a last frame cut off by humanish's own stop, or undefined when none was. */
227
+ export function truncatedFrameWarning(bytes) {
228
+ return bytes === undefined
229
+ ? undefined
230
+ : `Codex output was cut off when humanish stopped the app-server: ${bytes} bytes of an unfinished last frame were not checked.`;
231
+ }
232
+ /**
233
+ * A policy refusal: it is recorded, the active request stops with `code`, pending RPCs are
234
+ * rejected, and between requests the next request fails with it.
235
+ */
236
+ export function refuseSession(state, code) {
237
+ state.policyRefusal ??= code;
238
+ state.activeDeadline?.stop(code);
239
+ state.transport?.refuse(code);
240
+ }
241
+ /** The session's handler for notifications outside a dispatched turn, on its current transport. */
242
+ export function idleNotifications(participant, state) {
243
+ return idleNotificationHandler(notificationPolicyOf(participant), (method) => countUnknownNotification(state.unknownNotifications, method), (code) => refuseSession(state, code));
244
+ }
245
+ /**
246
+ * Installs the session's handlers on a new transport, before its first request: notifications
247
+ * outside a turn, notifications once the transport stopped or is closing, and policy failures
248
+ * the transport finds itself.
249
+ */
250
+ export function installSessionHandlers(participant, state, transport) {
251
+ transport.onNotification = idleNotifications(participant, state);
252
+ transport.onPolicyOnlyNotification = idleNotificationHandler(notificationPolicyOf(participant), (method) => countUnknownNotification(state.unknownNotifications, method), (code) => {
253
+ state.policyRefusal ??= code;
254
+ });
255
+ transport.onPolicyFailure = (code) => {
256
+ state.policyRefusal ??= code;
257
+ };
258
+ transport.onTruncatedFrame = (bytes) => {
259
+ state.truncatedFrameBytes = (state.truncatedFrameBytes ?? 0) + bytes;
260
+ };
261
+ }
262
+ /** A server request outside a turn is refused; the transport answers it and stops the request. */
263
+ function idleRequests(state) {
264
+ return async () => {
265
+ state.policyRefusal ??= "codex_tool_call";
266
+ throw new RestrictedCodexStop("codex_tool_call");
267
+ };
268
+ }
269
+ /** After a request: the turn's handlers come off the transport, and the idle handlers go on. */
270
+ export function detachTurn(participant, state) {
271
+ const transport = state.transport;
272
+ if (!transport)
273
+ return;
274
+ transport.onNotification = idleNotifications(participant, state);
275
+ transport.onRequest = idleRequests(state);
276
+ transport.onRequestComplete = undefined;
277
+ }
@@ -1,8 +1,13 @@
1
1
  import type { CuaProvider } from "../computer-use/loop.js";
2
2
  import { type RestrictedCodexSessionOptions } from "./restricted-session.js";
3
+ import type { RestrictedCodexAnalysisErrorCode } from "./restricted-policy.js";
3
4
  import type { ReasoningEffort } from "../reasoning-effort.js";
4
5
  export type ParticipantProviderCloseResult = {
5
6
  status: "confirmed" | "unconfirmed";
7
+ /** Run warnings from the native session, such as notification methods humanish does not know. */
8
+ warnings?: string[];
9
+ /** A refusal after the last request, such as a disallowed item outside a turn. It fails the run. */
10
+ refusal?: RestrictedCodexAnalysisErrorCode;
6
11
  };
7
12
  export interface RestrictedParticipantOptions {
8
13
  session?: RestrictedCodexSessionOptions;
@@ -13,6 +18,31 @@ export interface RestrictedParticipantOptions {
13
18
  /** Admit speech actions and heard-speaker evidence for a speech-capable desktop only. */
14
19
  speechEnabled?: boolean;
15
20
  }
21
+ /** What doctor's hosted-participant check found, before any turn. */
22
+ export interface ParticipantReadiness {
23
+ ready: boolean;
24
+ errorCode: RestrictedCodexAnalysisErrorCode | null;
25
+ /** The release the launch admitted. */
26
+ cliVersion?: string;
27
+ /** How the release's schema differs from the fields humanish reads, when that refused it. */
28
+ protocolIncompatibilities?: readonly string[];
29
+ /** Schema values beyond the baseline, recorded by a launch that passed. */
30
+ protocolAdditions?: readonly string[];
31
+ /** The model thread/start resolved from the operator's configuration or the declared model. */
32
+ resolvedModel?: string;
33
+ authentication?: "chatgpt-account" | "api-key";
34
+ }
35
+ /**
36
+ * doctor's check for a hosted Codex participant: the operator-auth launch up to an ephemeral
37
+ * thread (the version check, initialize, config/read, account/read and thread/start). It sends no
38
+ * turn, so no model request is made, and its tool is never called.
39
+ */
40
+ export declare function checkRestrictedCodexParticipantReadiness(options: {
41
+ session?: RestrictedCodexSessionOptions;
42
+ model?: string;
43
+ reasoningEffort?: ReasoningEffort;
44
+ timeoutMs?: number;
45
+ }): Promise<ParticipantReadiness>;
16
46
  /** One native tool-calling conversation; the existing CUA loop owns every input. */
17
47
  export declare function createRestrictedCodexParticipant(options?: RestrictedParticipantOptions): {
18
48
  provider: CuaProvider;
@@ -1,9 +1,11 @@
1
- import { isRecordedCodexCliVersion, } from "../contract.js";
2
- import { defaultCodexCliVersion } from "./qualified-versions.js";
1
+ import {} from "../contract.js";
2
+ import { defaultCodexCliVersion, untestedOperatorReleaseWarning } from "./codex-admission.js";
3
3
  import { CuaProviderError, isCuaProviderError, } from "../computer-use/provider-error.js";
4
4
  import { validateBrowserControlPng, validateHeardSpeech } from "../../browser-control/protocol.js";
5
5
  import { createRestrictedCodexSession, } from "./restricted-session.js";
6
6
  import { PARTICIPANT_PROFILE, PARTICIPANT_LIMITS as L, PARTICIPANT_FINAL_SCHEMA, participantToolSchema, parseParticipantTool, parseParticipantFinal, } from "./restricted-participant-policy.js";
7
+ import { truncatedFrameWarning, unknownNotificationsWarning } from "./restricted-notifications.js";
8
+ import { protocolAdditionsWarning, protocolIncompatibilityMessage } from "./protocol-compat.js";
7
9
  const codeOf = (code) => {
8
10
  if (code === "cancelled" || code === "timeout" || code === "refusal")
9
11
  return code === "refusal" ? "refused" : code;
@@ -36,8 +38,9 @@ function deferred() {
36
38
  void promise.catch(() => undefined);
37
39
  return { promise, resolve, reject };
38
40
  }
41
+ // prose-check: model prompt (Codex reads this tool description, not a person)
39
42
  const toolDescription = (speechEnabled) => `Act on the participant's browser through humanish. Submit one to four UI actions${speechEnabled ? ", including speak when you need to reply aloud," : ""} and a short public comment; never private reasoning. humanish returns a JSON STRING with execution acknowledgments${speechEnabled ? ", speech heard from the actual participant speaker sink," : ""} and a fresh screenshot. In Code Mode use: const r = JSON.parse(await tools.humanish_ui({narration: "...", actions: [...]})); text({acknowledgments: r.acknowledgments${speechEnabled ? ", heardSpeech: r.heardSpeech" : ""}, contextHint: r.contextHint, closing: r.closing}); image(r.imageUrl). Call serially and inspect each returned screenshot${speechEnabled ? " and heardSpeech array" : ""} before deciding what to do next.${speechEnabled ? " Use speak only after the visible UI shows that you joined the call and your microphone is unmuted; it sends audio into that call." : ""} Acknowledged input does not prove an application outcome. If closing is true, stop calling tools and give your final account.`;
40
- const participantInstructions = (study, speechEnabled) => `${study}\n\nYou are the study participant throughout this conversation, including its closing account. Use only the supplied screenshots and humanish_ui tool to interact. The tool returns a JSON string: parse it, inspect acknowledgments${speechEnabled ? " and heardSpeech captured from the actual participant speaker sink" : ""}, and display imageUrl with Code Mode image(). Do not print the image data URL as text. Keep your persona and earlier observations throughout the session.${speechEnabled ? " A speak action plays into the participant microphone; use it only after the visible UI shows that you joined the call and the microphone is unmuted." : ""} Speak publicly about your experience, never reveal private reasoning. Completed inputs do not prove application outcomes; verify on the next screenshot. When the task ends, return only the required final JSON with outcome, summary and frictionReports. Report observed confusion and recovered mistakes as well as blockers. Do not invent observations.`;
43
+ const participantInstructions = (prompt, speechEnabled) => `${prompt}\n\nYou are the study participant throughout this conversation, including its closing account. Use only the supplied screenshots and humanish_ui tool to interact. The tool returns a JSON string: parse it, inspect acknowledgments${speechEnabled ? " and heardSpeech captured from the actual participant speaker sink" : ""}, and display imageUrl with Code Mode image(). Do not print the image data URL as text. Keep your persona and earlier observations throughout the session.${speechEnabled ? " A speak action plays into the participant microphone; use it only after the visible UI shows that you joined the call and the microphone is unmuted." : ""} Speak publicly about your experience, never reveal private reasoning. Completed inputs do not prove application outcomes; verify on the next screenshot. When the task ends, return only the required final JSON with outcome, summary and frictionReports. Report observed confusion and recovered mistakes as well as blockers. Do not invent observations.`;
41
44
  /** Turns and failures from the native run, handed in order to the next provider request. */
42
45
  class ParticipantEvents {
43
46
  queued = [];
@@ -194,13 +197,49 @@ function participantSession(options, speechEnabled, effort, call) {
194
197
  },
195
198
  });
196
199
  }
200
+ /**
201
+ * doctor's check for a hosted Codex participant: the operator-auth launch up to an ephemeral
202
+ * thread (the version check, initialize, config/read, account/read and thread/start). It sends no
203
+ * turn, so no model request is made, and its tool is never called.
204
+ */
205
+ export async function checkRestrictedCodexParticipantReadiness(options) {
206
+ const session = participantSession({
207
+ authMode: "operator",
208
+ ...(options.session === undefined ? {} : { session: options.session }),
209
+ }, false, options.reasoningEffort ?? "low", async () => {
210
+ throw new Error("A readiness check makes no tool call");
211
+ });
212
+ const result = await session.run({
213
+ ...(options.model === undefined ? {} : { model: options.model }),
214
+ instructions: participantInstructions("Readiness check only.", false),
215
+ evidence: "",
216
+ images: [],
217
+ schema: PARTICIPANT_FINAL_SCHEMA,
218
+ maxOutputTokens: null,
219
+ timeoutMs: options.timeoutMs ?? 15_000,
220
+ }, true);
221
+ const closed = await session.close();
222
+ const errorCode = closed ? result.errorCode : (result.errorCode ?? "codex_cleanup_failed");
223
+ return {
224
+ ready: errorCode === null && result.status === "completed",
225
+ errorCode,
226
+ ...(session.cliVersion === undefined ? {} : { cliVersion: session.cliVersion }),
227
+ ...(session.protocolIncompatibilities === undefined
228
+ ? {}
229
+ : { protocolIncompatibilities: session.protocolIncompatibilities }),
230
+ ...(session.protocolAdditions === undefined || session.protocolAdditions.length === 0
231
+ ? {}
232
+ : { protocolAdditions: session.protocolAdditions }),
233
+ ...(session.resolvedModel === undefined ? {} : { resolvedModel: session.resolvedModel }),
234
+ ...(session.authentication === undefined ? {} : { authentication: session.authentication }),
235
+ };
236
+ }
197
237
  /**
198
238
  * The profile a run records: the detected release, or the host default before the first launch.
199
239
  * An operator-auth session has one only once it resolved a model on a ChatGPT account.
200
240
  */
201
241
  function participantExecutionProfile(session, operator, effort) {
202
- const detected = session.cliVersion;
203
- const cliVersion = isRecordedCodexCliVersion(detected) ? detected : defaultCodexCliVersion();
242
+ const cliVersion = session.cliVersion ?? defaultCodexCliVersion();
204
243
  if (!operator)
205
244
  return { ...PARTICIPANT_PROFILE, cliVersion };
206
245
  return session.authentication === "chatgpt-account" && session.resolvedModel
@@ -244,6 +283,24 @@ function closeParticipantSession(state) {
244
283
  return confirmed;
245
284
  }));
246
285
  }
286
+ /** What the closed native session reports beside cleanup: its run warnings and a late refusal. */
287
+ function sessionReport(session, operator) {
288
+ const warnings = [
289
+ // A resolved model means thread/start was admitted: the release actually launched.
290
+ untestedOperatorReleaseWarning(session.resolvedModel === undefined ? undefined : session.cliVersion, operator),
291
+ session.protocolIncompatibilities === undefined
292
+ ? undefined
293
+ : protocolIncompatibilityMessage(session.cliVersion, session.protocolIncompatibilities),
294
+ protocolAdditionsWarning(session.cliVersion, session.protocolAdditions),
295
+ unknownNotificationsWarning(session.unknownNotifications, session.cliVersion),
296
+ truncatedFrameWarning(session.truncatedFrameBytes),
297
+ ].filter((warning) => warning !== undefined);
298
+ const refusal = session.policyRefusal;
299
+ return {
300
+ ...(warnings.length === 0 ? {} : { warnings }),
301
+ ...(refusal === undefined ? {} : { refusal }),
302
+ };
303
+ }
247
304
  /** Stops the conversation: abort the native run, reject a waiting tool call, close the session. */
248
305
  function revokeParticipant(state) {
249
306
  state.closed = true;
@@ -424,7 +481,10 @@ export function createRestrictedCodexParticipant(options = {}) {
424
481
  const work = Promise.all([state.nativeTask, closeParticipantSession(state)]).then(([, ok]) => ok);
425
482
  if (!(await withinCleanupBudget(work, state.abortAt)))
426
483
  state.failedCleanup = true;
427
- return { status: state.failedCleanup ? "unconfirmed" : "confirmed" };
484
+ return {
485
+ status: state.failedCleanup ? "unconfirmed" : "confirmed",
486
+ ...sessionReport(state.session, settings.operator),
487
+ };
428
488
  })();
429
489
  return closing;
430
490
  },
@@ -1,8 +1,8 @@
1
1
  import type { ReasoningEffort } from "../reasoning-effort.js";
2
2
  /** Versioned, deliberately narrow profile qualified with an account-backed vision turn.
3
3
  * The CLI still advertises code-mode tools: disabling their host is the enforcement
4
- * boundary. Feature names alone are not proof that a tool has been removed. The admitted
5
- * CLI releases are per host, in qualified-versions.ts. */
4
+ * boundary. Feature names alone are not proof that a tool has been removed. Which CLI
5
+ * releases launch is decided in codex-admission.ts. */
6
6
  export declare const RESTRICTED_CODEX_ANALYSIS_IDENTITY: {
7
7
  readonly provider: "codex";
8
8
  readonly authMode: "chatgpt";
@@ -11,7 +11,7 @@ export declare const RESTRICTED_CODEX_ANALYSIS_IDENTITY: {
11
11
  readonly reasoningEffort: "low";
12
12
  };
13
13
  export declare const RESTRICTED_CODEX_ANALYSIS_MODELS: readonly ["gpt-6-astra"];
14
- export type RestrictedCodexAnalysisErrorCode = "invalid_request" | "cancelled" | "timeout" | "response_too_large" | "invalid_response" | "refusal" | "output_incomplete" | "codex_unavailable" | "codex_unsupported_version" | "codex_unsupported_platform" | "codex_login_required" | "codex_unsupported_auth" | "codex_unsafe_configuration" | "codex_model_unavailable" | "codex_protocol_error" | "codex_tool_call" | "codex_process_failed" | "codex_cleanup_failed" | "codex_busy";
14
+ export type RestrictedCodexAnalysisErrorCode = "invalid_request" | "cancelled" | "timeout" | "response_too_large" | "invalid_response" | "refusal" | "output_incomplete" | "codex_unavailable" | "codex_unsupported_version" | "codex_incompatible_release" | "codex_unsupported_platform" | "codex_login_required" | "codex_unsupported_auth" | "codex_unsafe_configuration" | "codex_model_unavailable" | "codex_protocol_error" | "codex_tool_call" | "codex_process_failed" | "codex_cleanup_failed" | "codex_busy";
15
15
  export interface RestrictedCodexRequest {
16
16
  model?: string | undefined;
17
17
  instructions: string;
@@ -40,6 +40,14 @@ export interface RestrictedCodexResult {
40
40
  usageComplete: boolean;
41
41
  dispatched: boolean;
42
42
  errorCode: RestrictedCodexAnalysisErrorCode | null;
43
+ /** Notification methods this humanish does not know that carried no item, by count. */
44
+ unknownNotifications?: Readonly<Record<string, number>>;
45
+ /** How the release's app-server schema differs from the fields humanish reads (protocol-compat). */
46
+ protocolIncompatibilities?: readonly string[];
47
+ /** Schema values beyond the baseline humanish knows; recorded, and the launch continued. */
48
+ protocolAdditions?: readonly string[];
49
+ /** Bytes of a last frame cut off when humanish stopped the app-server. */
50
+ truncatedFrameBytes?: number;
43
51
  }
44
52
  export declare const CODEX_MAX_REQUEST_BYTES: number;
45
53
  export declare const CODEX_MAX_OUTPUT_BYTES: number;
@@ -1,7 +1,7 @@
1
1
  /** Versioned, deliberately narrow profile qualified with an account-backed vision turn.
2
2
  * The CLI still advertises code-mode tools: disabling their host is the enforcement
3
- * boundary. Feature names alone are not proof that a tool has been removed. The admitted
4
- * CLI releases are per host, in qualified-versions.ts. */
3
+ * boundary. Feature names alone are not proof that a tool has been removed. Which CLI
4
+ * releases launch is decided in codex-admission.ts. */
5
5
  export const RESTRICTED_CODEX_ANALYSIS_IDENTITY = {
6
6
  provider: "codex",
7
7
  authMode: "chatgpt",
@@ -12,9 +12,9 @@ export interface RestrictedCodexSessionOptions {
12
12
  /** The release a caller already recorded (an analysis identity); any other release is refused. */
13
13
  cliVersion?: string;
14
14
  /**
15
- * Bypasses qualification: replaces this host's admitted releases with any list. It exists only
16
- * so scripts/codex-qualify.mjs can launch an unqualified candidate. No library export, lab
17
- * manifest, CLI flag, RunLabOptions field or cuaHooks entry reaches it
15
+ * Bypasses launch admission: admits exactly this list. It exists only so
16
+ * scripts/codex-qualify.mjs can launch a candidate admission would refuse. No library export, lab
17
+ * manifest, CLI flag, RunLabOptions field or LabDeps seam reaches it
18
18
  * (tests/actors/codex/cli-versions-seam.test.ts).
19
19
  */
20
20
  cliVersions?: readonly string[];
@@ -40,6 +40,19 @@ export interface RestrictedCodexSession {
40
40
  readonly authentication?: "chatgpt-account" | "api-key" | undefined;
41
41
  /** The admitted release this session launched, once its version check has passed. */
42
42
  readonly cliVersion?: string | undefined;
43
+ /** Notification methods this humanish does not know that carried no item, by count. */
44
+ readonly unknownNotifications?: Readonly<Record<string, number>>;
45
+ /**
46
+ * The first policy refusal or unchecked output in the session, whether or not a request reported
47
+ * it. A participant's close fails the run with it.
48
+ */
49
+ readonly policyRefusal?: RestrictedCodexAnalysisErrorCode | undefined;
50
+ /** Bytes of last frames cut off after humanish stopped the app-server; a run warning. */
51
+ readonly truncatedFrameBytes?: number | undefined;
52
+ /** How the release's schema differs from the fields humanish reads, when that refused it. */
53
+ readonly protocolIncompatibilities?: readonly string[] | undefined;
54
+ /** Schema values beyond the baseline humanish knows, recorded at launch. */
55
+ readonly protocolAdditions?: readonly string[] | undefined;
43
56
  run(request: RestrictedCodexRequest, readinessOnly?: boolean): Promise<RestrictedCodexResult>;
44
57
  close(): Promise<boolean>;
45
58
  }