humanish 0.106.1 → 0.108.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (668) hide show
  1. package/ARCHITECTURE.md +38 -32
  2. package/CHANGELOG.md +28 -0
  3. package/CONTEXT.md +51 -41
  4. package/README.md +152 -174
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-client.js +2 -1
  14. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  15. package/dist/actors/codex/app-server-trace.js +1 -3
  16. package/dist/actors/codex/app-server-ui.js +1 -1
  17. package/dist/actors/codex/app-server.js +2 -1
  18. package/dist/actors/codex/codex-admission.d.ts +91 -0
  19. package/dist/actors/codex/codex-admission.js +150 -0
  20. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  21. package/dist/actors/codex/protocol-compat.js +357 -0
  22. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  23. package/dist/actors/codex/protocol-contract.js +471 -0
  24. package/dist/actors/codex/restricted-executable.d.ts +28 -4
  25. package/dist/actors/codex/restricted-executable.js +104 -29
  26. package/dist/actors/codex/restricted-launch.d.ts +9 -2
  27. package/dist/actors/codex/restricted-launch.js +43 -4
  28. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  29. package/dist/actors/codex/restricted-notifications.js +277 -0
  30. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  31. package/dist/actors/codex/restricted-participant.js +66 -6
  32. package/dist/actors/codex/restricted-policy.d.ts +11 -3
  33. package/dist/actors/codex/restricted-policy.js +2 -2
  34. package/dist/actors/codex/restricted-session.d.ts +16 -3
  35. package/dist/actors/codex/restricted-session.js +60 -22
  36. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  37. package/dist/actors/codex/restricted-transport.js +139 -27
  38. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  39. package/dist/actors/codex/restricted-turn.js +43 -30
  40. package/dist/actors/computer-use/actor.d.ts +17 -17
  41. package/dist/actors/computer-use/actor.js +6 -6
  42. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  43. package/dist/actors/computer-use/admission-limit.js +1 -1
  44. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  45. package/dist/actors/computer-use/loop/actions.js +10 -10
  46. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  47. package/dist/actors/computer-use/loop/backstop.js +15 -13
  48. package/dist/actors/computer-use/loop/ending.d.ts +7 -7
  49. package/dist/actors/computer-use/loop/ending.js +9 -9
  50. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  51. package/dist/actors/computer-use/loop/observation.js +9 -9
  52. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  53. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  54. package/dist/actors/computer-use/loop/session.js +3 -3
  55. package/dist/actors/computer-use/loop/spend.d.ts +2 -2
  56. package/dist/actors/computer-use/loop/spend.js +4 -4
  57. package/dist/actors/computer-use/loop/trace.js +11 -10
  58. package/dist/actors/computer-use/loop/types.d.ts +37 -26
  59. package/dist/actors/computer-use/loop/usage.js +2 -2
  60. package/dist/actors/computer-use/loop.js +4 -4
  61. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  62. package/dist/actors/computer-use/openai-context.js +214 -0
  63. package/dist/actors/computer-use/openai-provider.d.ts +12 -9
  64. package/dist/actors/computer-use/openai-provider.js +47 -36
  65. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  66. package/dist/actors/computer-use/openai-requests.js +82 -15
  67. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  68. package/dist/actors/computer-use/openai-wire.js +36 -34
  69. package/dist/actors/contract.d.ts +86 -49
  70. package/dist/actors/contract.js +29 -23
  71. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  72. package/dist/actors/local-agent/claude-session.js +10 -9
  73. package/dist/actors/local-agent/cli.d.ts +8 -6
  74. package/dist/actors/local-agent/cli.js +24 -28
  75. package/dist/actors/local-agent/readiness.d.ts +2 -2
  76. package/dist/actors/local-agent/readiness.js +4 -4
  77. package/dist/actors/reasoning-effort.js +6 -6
  78. package/dist/actors/registry.d.ts +10 -10
  79. package/dist/actors/registry.js +18 -17
  80. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  81. package/dist/actors/scripted-browser/actor.js +16 -16
  82. package/dist/actors/scripted-browser/browser-command.js +1 -1
  83. package/dist/actors/scripted-browser/journey.js +15 -4
  84. package/dist/actors/scripted-browser/steps.js +19 -1
  85. package/dist/actors/scripted-browser/types.d.ts +12 -2
  86. package/dist/actors/stop-conditions.d.ts +1 -1
  87. package/dist/actors/stop-conditions.js +1 -3
  88. package/dist/analysis/automatic-completion.d.ts +13 -8
  89. package/dist/analysis/automatic-completion.js +14 -8
  90. package/dist/analysis/automatic-config.d.ts +1 -1
  91. package/dist/analysis/automatic-config.js +2 -2
  92. package/dist/analysis/automatic.d.ts +10 -4
  93. package/dist/analysis/automatic.js +17 -13
  94. package/dist/analysis/codex-config.d.ts +6 -2
  95. package/dist/analysis/codex-config.js +22 -14
  96. package/dist/analysis/diagnostics.d.ts +23 -0
  97. package/dist/analysis/diagnostics.js +112 -0
  98. package/dist/analysis/evidence-sources.js +2 -2
  99. package/dist/analysis/evidence.js +6 -6
  100. package/dist/analysis/execute.d.ts +7 -1
  101. package/dist/analysis/execute.js +39 -12
  102. package/dist/analysis/job.d.ts +8 -5
  103. package/dist/analysis/job.js +15 -14
  104. package/dist/analysis/load.d.ts +1 -1
  105. package/dist/analysis/load.js +5 -5
  106. package/dist/analysis/provider.d.ts +9 -1
  107. package/dist/analysis/restricted-codex.d.ts +2 -0
  108. package/dist/analysis/restricted-codex.js +10 -1
  109. package/dist/analysis/service.d.ts +2 -0
  110. package/dist/analysis/service.js +35 -16
  111. package/dist/analysis/sharing.d.ts +2 -2
  112. package/dist/analysis/sharing.js +5 -5
  113. package/dist/analysis/store-executions.d.ts +5 -5
  114. package/dist/analysis/store-executions.js +12 -12
  115. package/dist/analysis/store.d.ts +4 -4
  116. package/dist/analysis/store.js +13 -13
  117. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  118. package/dist/cli/commands/analysis-signals.js +4 -1
  119. package/dist/cli/commands/analyze.js +23 -18
  120. package/dist/cli/commands/codex.js +9 -9
  121. package/dist/cli/commands/comms.js +62 -34
  122. package/dist/cli/commands/feedback.js +20 -21
  123. package/dist/cli/commands/lab-format.d.ts +5 -4
  124. package/dist/cli/commands/lab-format.js +35 -23
  125. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  126. package/dist/cli/commands/lab-route-computer-use.js +32 -21
  127. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  128. package/dist/cli/commands/lab-route-preview.js +7 -7
  129. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  130. package/dist/cli/commands/lab-route-run.js +6 -2
  131. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  132. package/dist/cli/commands/lab-route-scripted.js +0 -1
  133. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  134. package/dist/cli/commands/lab-route-shared-world.js +3 -4
  135. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  136. package/dist/cli/commands/lab-route-terminal.js +0 -1
  137. package/dist/cli/commands/lab-run.js +84 -54
  138. package/dist/cli/commands/lab-scorer.d.ts +2 -4
  139. package/dist/cli/commands/lab-scorer.js +1 -1
  140. package/dist/cli/commands/migrate.d.ts +4 -0
  141. package/dist/cli/commands/migrate.js +65 -0
  142. package/dist/cli/commands/observe.js +168 -107
  143. package/dist/cli/commands/run-command.d.ts +10 -0
  144. package/dist/cli/commands/run-command.js +85 -0
  145. package/dist/cli/commands/run-signals.d.ts +30 -0
  146. package/dist/cli/commands/run-signals.js +146 -0
  147. package/dist/cli/commands/runs.js +137 -136
  148. package/dist/cli/commands/setup.d.ts +2 -2
  149. package/dist/cli/commands/setup.js +26 -21
  150. package/dist/cli/commands/study.d.ts +3 -0
  151. package/dist/cli/commands/study.js +182 -0
  152. package/dist/cli/commands/tui.d.ts +4 -4
  153. package/dist/cli/commands/tui.js +21 -21
  154. package/dist/cli/commands/watch.js +64 -77
  155. package/dist/cli/deprecations.d.ts +18 -0
  156. package/dist/cli/deprecations.js +48 -0
  157. package/dist/cli/doctor.d.ts +18 -5
  158. package/dist/cli/doctor.js +111 -48
  159. package/dist/cli/first-run-path.d.ts +12 -10
  160. package/dist/cli/first-run-path.js +30 -28
  161. package/dist/cli/io.d.ts +46 -10
  162. package/dist/cli/io.js +109 -30
  163. package/dist/cli/observer-follow.d.ts +2 -2
  164. package/dist/cli/observer-follow.js +5 -6
  165. package/dist/cli/orientation.d.ts +6 -3
  166. package/dist/cli/orientation.js +43 -39
  167. package/dist/cli/product-sentence.d.ts +6 -0
  168. package/dist/cli/product-sentence.js +6 -0
  169. package/dist/cli/program.d.ts +6 -1
  170. package/dist/cli/program.js +112 -43
  171. package/dist/cli/telemetry.d.ts +17 -17
  172. package/dist/cli/telemetry.js +49 -41
  173. package/dist/cli.js +1 -1
  174. package/dist/comms/capture-surface.d.ts +14 -13
  175. package/dist/comms/capture-surface.js +23 -22
  176. package/dist/comms/catch-host.d.ts +8 -8
  177. package/dist/comms/catch-host.js +14 -14
  178. package/dist/comms/connections.js +4 -4
  179. package/dist/comms/email-catch.d.ts +3 -3
  180. package/dist/comms/email-catch.js +8 -8
  181. package/dist/comms/external-evidence.d.ts +27 -0
  182. package/dist/comms/external-evidence.js +93 -0
  183. package/dist/comms/extract.js +2 -2
  184. package/dist/comms/fake-inbox.d.ts +2 -2
  185. package/dist/comms/fake-inbox.js +2 -2
  186. package/dist/comms/lease-store.js +7 -7
  187. package/dist/comms/receiving-render.d.ts +1 -1
  188. package/dist/comms/receiving-render.js +2 -2
  189. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  190. package/dist/comms/sandbox-catch-script.js +6 -6
  191. package/dist/comms/sandbox-catch.d.ts +36 -37
  192. package/dist/comms/sandbox-catch.js +34 -35
  193. package/dist/comms/setup.js +42 -8
  194. package/dist/comms/thread-evidence.d.ts +1 -1
  195. package/dist/comms/thread-evidence.js +6 -6
  196. package/dist/comms/types.d.ts +6 -6
  197. package/dist/comms/types.js +4 -4
  198. package/dist/evidence/browser-hygiene.d.ts +1 -1
  199. package/dist/evidence/browser-hygiene.js +1 -1
  200. package/dist/evidence/frame-signature.d.ts +1 -1
  201. package/dist/evidence/frame-signature.js +4 -4
  202. package/dist/evidence/redaction.d.ts +3 -3
  203. package/dist/evidence/redaction.js +5 -5
  204. package/dist/evidence/secret-scrub.d.ts +9 -0
  205. package/dist/evidence/secret-scrub.js +96 -0
  206. package/dist/feedback/draft.js +41 -85
  207. package/dist/feedback/export-bundle.js +5 -5
  208. package/dist/feedback/export.d.ts +5 -1
  209. package/dist/feedback/export.js +16 -17
  210. package/dist/feedback/feedback.d.ts +3 -3
  211. package/dist/feedback/feedback.js +21 -3
  212. package/dist/guest/chromium-text.js +2 -2
  213. package/dist/guest/desktop-native.d.ts +1 -1
  214. package/dist/guest/runtime.js +1 -1
  215. package/dist/index.d.ts +14 -15
  216. package/dist/index.js +10 -11
  217. package/dist/keys/key-resolution.d.ts +7 -5
  218. package/dist/keys/key-resolution.js +40 -38
  219. package/dist/lab/adapter-extension.d.ts +35 -13
  220. package/dist/lab/adapter-extension.js +50 -134
  221. package/dist/lab/adapter-scorer-loader.d.ts +32 -12
  222. package/dist/lab/adapter-scorer-loader.js +56 -32
  223. package/dist/lab/composition-rules.js +58 -58
  224. package/dist/lab/config.js +85 -43
  225. package/dist/lab/deprecated-fields.d.ts +10 -0
  226. package/dist/lab/deprecated-fields.js +24 -0
  227. package/dist/lab/device-presets.d.ts +10 -10
  228. package/dist/lab/device-presets.js +11 -11
  229. package/dist/lab/discover.d.ts +13 -9
  230. package/dist/lab/discover.js +118 -60
  231. package/dist/lab/doctor.d.ts +53 -11
  232. package/dist/lab/doctor.js +193 -47
  233. package/dist/lab/init-plan.js +1 -3
  234. package/dist/lab/init-templates.js +147 -147
  235. package/dist/lab/init.d.ts +1 -1
  236. package/dist/lab/init.js +41 -9
  237. package/dist/lab/keys.d.ts +2 -0
  238. package/dist/lab/keys.js +43 -9
  239. package/dist/lab/lab-deps.d.ts +80 -0
  240. package/dist/lab/lab-deps.js +4 -0
  241. package/dist/lab/parse/actors.js +17 -16
  242. package/dist/lab/parse/comms.js +8 -7
  243. package/dist/lab/parse/execution.js +15 -14
  244. package/dist/lab/parse/study-v3.d.ts +23 -0
  245. package/dist/lab/parse/study-v3.js +259 -0
  246. package/dist/lab/parse/subject-state.d.ts +7 -7
  247. package/dist/lab/parse/subject-state.js +18 -17
  248. package/dist/lab/parse/subject.js +30 -29
  249. package/dist/lab/parse/values.d.ts +1 -2
  250. package/dist/lab/parse/values.js +3 -6
  251. package/dist/lab/persona-resolve.d.ts +7 -7
  252. package/dist/lab/persona-resolve.js +8 -8
  253. package/dist/lab/persona.js +1 -3
  254. package/dist/lab/plan-base.d.ts +0 -2
  255. package/dist/lab/plan-base.js +6 -4
  256. package/dist/lab/plan-participants.d.ts +7 -7
  257. package/dist/lab/plan-participants.js +2 -2
  258. package/dist/lab/plan-types.d.ts +26 -8
  259. package/dist/lab/plan.d.ts +4 -18
  260. package/dist/lab/plan.js +24 -79
  261. package/dist/lab/preflight-probes.js +11 -11
  262. package/dist/lab/preflight-result.d.ts +2 -1
  263. package/dist/lab/preflight-result.js +5 -6
  264. package/dist/lab/preflight.d.ts +7 -8
  265. package/dist/lab/preflight.js +6 -6
  266. package/dist/lab/requirements.d.ts +20 -0
  267. package/dist/lab/requirements.js +54 -0
  268. package/dist/lab/route-inputs.d.ts +23 -12
  269. package/dist/lab/route-inputs.js +48 -51
  270. package/dist/lab/routing.d.ts +42 -41
  271. package/dist/lab/routing.js +66 -68
  272. package/dist/lab/run-lab-events.d.ts +3 -11
  273. package/dist/lab/run-lab-events.js +2 -16
  274. package/dist/lab/run-lab-homes.d.ts +76 -0
  275. package/dist/lab/run-lab-homes.js +7 -0
  276. package/dist/lab/run-lab-options.d.ts +12 -66
  277. package/dist/lab/run-lab-options.js +58 -285
  278. package/dist/lab/summary.d.ts +15 -9
  279. package/dist/lab/summary.js +24 -17
  280. package/dist/lab/tasks.d.ts +15 -15
  281. package/dist/lab/tasks.js +14 -14
  282. package/dist/lab/types.d.ts +201 -195
  283. package/dist/lab/types.js +2 -0
  284. package/dist/lab/validation.d.ts +21 -21
  285. package/dist/lab/validation.js +61 -59
  286. package/dist/lab/warnings.d.ts +10 -0
  287. package/dist/lab/warnings.js +70 -41
  288. package/dist/library-aliases.d.ts +56 -0
  289. package/dist/library-aliases.js +22 -0
  290. package/dist/observer/artifact.d.ts +2 -2
  291. package/dist/observer/artifact.js +9 -9
  292. package/dist/observer/data.d.ts +6 -6
  293. package/dist/observer/data.js +7 -6
  294. package/dist/observer/exposure.d.ts +1 -1
  295. package/dist/observer/exposure.js +11 -11
  296. package/dist/observer/http.js +1 -1
  297. package/dist/observer/library.d.ts +1 -1
  298. package/dist/observer/library.js +4 -2
  299. package/dist/observer/listen.js +5 -4
  300. package/dist/observer/render.d.ts +1 -1
  301. package/dist/observer/render.js +12 -7
  302. package/dist/observer/run-routes.d.ts +4 -4
  303. package/dist/observer/run-routes.js +6 -6
  304. package/dist/observer/serve.d.ts +17 -0
  305. package/dist/observer/serve.js +41 -6
  306. package/dist/observer/tunnel.js +1 -1
  307. package/dist/observer-app.html +4 -4
  308. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  309. package/dist/routes/computer-use/bundle-parts.js +24 -17
  310. package/dist/routes/computer-use/bundle.d.ts +4 -11
  311. package/dist/routes/computer-use/bundle.js +12 -18
  312. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  313. package/dist/routes/computer-use/diagnostics.js +1 -1
  314. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
  315. package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
  316. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  317. package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
  318. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
  319. package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
  320. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  321. package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
  322. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  323. package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
  324. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  325. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  326. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  327. package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
  328. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  329. package/dist/routes/computer-use/external-comms.js +19 -43
  330. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  331. package/dist/routes/computer-use/fanout-bundle.js +38 -42
  332. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
  333. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  334. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  335. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  336. package/dist/routes/computer-use/live-flush.js +20 -28
  337. package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
  338. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
  339. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  340. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  341. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  342. package/dist/routes/computer-use/local-vm.js +40 -67
  343. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  344. package/dist/routes/computer-use/participant-desktop.js +5 -25
  345. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
  346. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
  347. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  348. package/dist/routes/computer-use/participant-facts.js +12 -1
  349. package/dist/routes/computer-use/participant-model.d.ts +25 -11
  350. package/dist/routes/computer-use/participant-model.js +76 -34
  351. package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
  352. package/dist/routes/computer-use/participant-prompt.js +8 -8
  353. package/dist/routes/computer-use/participant-runs.d.ts +11 -11
  354. package/dist/routes/computer-use/participant-runs.js +18 -18
  355. package/dist/routes/computer-use/plan.d.ts +21 -29
  356. package/dist/routes/computer-use/plan.js +70 -78
  357. package/dist/routes/computer-use/preflight.d.ts +3 -5
  358. package/dist/routes/computer-use/preflight.js +40 -36
  359. package/dist/routes/computer-use/rerun-selection.js +11 -7
  360. package/dist/routes/computer-use/result.d.ts +1 -1
  361. package/dist/routes/computer-use/result.js +48 -38
  362. package/dist/routes/computer-use/route.d.ts +5 -5
  363. package/dist/routes/computer-use/route.js +36 -33
  364. package/dist/routes/computer-use/self-report.d.ts +8 -8
  365. package/dist/routes/computer-use/self-report.js +33 -33
  366. package/dist/routes/computer-use/setup.d.ts +9 -15
  367. package/dist/routes/computer-use/setup.js +106 -83
  368. package/dist/routes/computer-use/single-bundle.d.ts +13 -16
  369. package/dist/routes/computer-use/single-bundle.js +46 -53
  370. package/dist/routes/computer-use/subject-projection.d.ts +6 -8
  371. package/dist/routes/computer-use/subject-projection.js +24 -23
  372. package/dist/routes/computer-use/types.d.ts +195 -238
  373. package/dist/routes/computer-use/types.js +21 -13
  374. package/dist/routes/preview.d.ts +8 -2
  375. package/dist/routes/preview.js +8 -5
  376. package/dist/routes/scripted/bundle.d.ts +5 -8
  377. package/dist/routes/scripted/bundle.js +23 -27
  378. package/dist/routes/scripted/plan.d.ts +6 -8
  379. package/dist/routes/scripted/plan.js +15 -13
  380. package/dist/routes/scripted/result.d.ts +4 -1
  381. package/dist/routes/scripted/result.js +15 -11
  382. package/dist/routes/scripted/route.js +15 -17
  383. package/dist/routes/scripted/scenario.d.ts +1 -1
  384. package/dist/routes/scripted/scenario.js +3 -3
  385. package/dist/routes/scripted/setup.d.ts +3 -2
  386. package/dist/routes/scripted/setup.js +27 -26
  387. package/dist/routes/scripted/subject.d.ts +8 -3
  388. package/dist/routes/scripted/subject.js +10 -6
  389. package/dist/routes/scripted/surface-records.js +4 -4
  390. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  391. package/dist/routes/scripted/surface-sessions.js +4 -4
  392. package/dist/routes/scripted/types.d.ts +21 -40
  393. package/dist/routes/scripted/types.js +2 -3
  394. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
  395. package/dist/routes/shared-world/bundle.d.ts +7 -7
  396. package/dist/routes/shared-world/bundle.js +60 -62
  397. package/dist/routes/shared-world/checkpoints.d.ts +5 -5
  398. package/dist/routes/shared-world/checkpoints.js +5 -5
  399. package/dist/routes/shared-world/comms.d.ts +8 -7
  400. package/dist/routes/shared-world/comms.js +38 -51
  401. package/dist/routes/shared-world/external-public.d.ts +6 -5
  402. package/dist/routes/shared-world/external-public.js +28 -25
  403. package/dist/routes/shared-world/handoff.d.ts +10 -9
  404. package/dist/routes/shared-world/handoff.js +89 -81
  405. package/dist/routes/shared-world/lobby-code.d.ts +7 -7
  406. package/dist/routes/shared-world/lobby-code.js +22 -22
  407. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
  408. package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
  409. package/dist/routes/shared-world/plan.d.ts +2 -6
  410. package/dist/routes/shared-world/plan.js +8 -9
  411. package/dist/routes/shared-world/provenance.d.ts +4 -4
  412. package/dist/routes/shared-world/provenance.js +4 -4
  413. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  414. package/dist/routes/shared-world/provisioned.js +55 -48
  415. package/dist/routes/shared-world/result.js +47 -36
  416. package/dist/routes/shared-world/route.js +54 -57
  417. package/dist/routes/shared-world/setup.d.ts +6 -5
  418. package/dist/routes/shared-world/setup.js +16 -18
  419. package/dist/routes/shared-world/types.d.ts +70 -141
  420. package/dist/routes/shared-world/types.js +5 -5
  421. package/dist/routes/terminal/adapter.d.ts +10 -10
  422. package/dist/routes/terminal/adapter.js +32 -129
  423. package/dist/routes/terminal/bundle.d.ts +10 -15
  424. package/dist/routes/terminal/bundle.js +43 -52
  425. package/dist/routes/terminal/credentials.d.ts +4 -4
  426. package/dist/routes/terminal/credentials.js +20 -20
  427. package/dist/routes/terminal/dry-run.d.ts +1 -1
  428. package/dist/routes/terminal/dry-run.js +13 -15
  429. package/dist/routes/terminal/encoding.d.ts +1 -1
  430. package/dist/routes/terminal/encoding.js +4 -4
  431. package/dist/routes/terminal/ledger.d.ts +8 -8
  432. package/dist/routes/terminal/ledger.js +22 -22
  433. package/dist/routes/terminal/live-finish.d.ts +1 -2
  434. package/dist/routes/terminal/live-finish.js +24 -23
  435. package/dist/routes/terminal/live-sandbox.d.ts +3 -2
  436. package/dist/routes/terminal/live-sandbox.js +31 -32
  437. package/dist/routes/terminal/participant-text.d.ts +23 -0
  438. package/dist/routes/terminal/participant-text.js +165 -0
  439. package/dist/routes/terminal/persona.js +1 -1
  440. package/dist/routes/terminal/plan.d.ts +2 -6
  441. package/dist/routes/terminal/plan.js +23 -19
  442. package/dist/routes/terminal/recorder.d.ts +6 -1
  443. package/dist/routes/terminal/recorder.js +12 -4
  444. package/dist/routes/terminal/result.js +12 -12
  445. package/dist/routes/terminal/route.js +30 -31
  446. package/dist/routes/terminal/runtime.d.ts +3 -2
  447. package/dist/routes/terminal/runtime.js +3 -3
  448. package/dist/routes/terminal/sandbox.d.ts +4 -4
  449. package/dist/routes/terminal/sandbox.js +10 -10
  450. package/dist/routes/terminal/session.js +22 -19
  451. package/dist/routes/terminal/token-usage.d.ts +1 -1
  452. package/dist/routes/terminal/token-usage.js +10 -11
  453. package/dist/routes/terminal/trace.d.ts +7 -10
  454. package/dist/routes/terminal/trace.js +11 -66
  455. package/dist/routes/terminal/types.d.ts +104 -114
  456. package/dist/routes/terminal/types.js +12 -7
  457. package/dist/run/active-runs.d.ts +13 -0
  458. package/dist/run/active-runs.js +12 -0
  459. package/dist/run/bundle-shape.d.ts +2 -1
  460. package/dist/run/bundle-shape.js +7 -7
  461. package/dist/run/bundle.d.ts +99 -92
  462. package/dist/run/bundle.js +10 -8
  463. package/dist/run/cost-summary.js +6 -5
  464. package/dist/run/costs.d.ts +6 -6
  465. package/dist/run/costs.js +17 -11
  466. package/dist/run/detail.d.ts +9 -9
  467. package/dist/run/detail.js +10 -10
  468. package/dist/run/dry-run-inputs.js +1 -1
  469. package/dist/run/dry-run.js +23 -30
  470. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  471. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  472. package/dist/run/feedback-shape.js +1 -1
  473. package/dist/run/judge.d.ts +34 -16
  474. package/dist/run/judge.js +41 -14
  475. package/dist/run/locate.d.ts +2 -0
  476. package/dist/run/locate.js +3 -1
  477. package/dist/run/outcomes.d.ts +3 -3
  478. package/dist/run/outcomes.js +3 -3
  479. package/dist/run/participant-records.d.ts +2 -2
  480. package/dist/run/participant-records.js +2 -2
  481. package/dist/run/paths.d.ts +1 -1
  482. package/dist/run/paths.js +2 -2
  483. package/dist/run/pricing.d.ts +30 -15
  484. package/dist/run/pricing.js +49 -30
  485. package/dist/run/projection.d.ts +27 -27
  486. package/dist/run/projection.js +23 -23
  487. package/dist/run/reclaim.d.ts +6 -0
  488. package/dist/run/reclaim.js +15 -5
  489. package/dist/run/results.d.ts +5 -5
  490. package/dist/run/run-index.d.ts +9 -7
  491. package/dist/run/run-index.js +24 -25
  492. package/dist/run/run-not-found.d.ts +5 -0
  493. package/dist/run/run-not-found.js +15 -0
  494. package/dist/run/run.d.ts +7 -4
  495. package/dist/run/run.js +10 -6
  496. package/dist/run/sandbox-receipts.d.ts +5 -5
  497. package/dist/run/sandbox-receipts.js +6 -6
  498. package/dist/run/shared-world-evidence.d.ts +67 -66
  499. package/dist/run/shared-world-evidence.js +4 -4
  500. package/dist/run/shared-world-shape.d.ts +3 -3
  501. package/dist/run/shared-world-shape.js +16 -16
  502. package/dist/run/stats.d.ts +17 -11
  503. package/dist/run/stats.js +124 -66
  504. package/dist/run/status.d.ts +21 -32
  505. package/dist/run/status.js +34 -33
  506. package/dist/run/stored-runs.js +2 -1
  507. package/dist/run/stream-shape.js +1 -1
  508. package/dist/run/streams.d.ts +29 -22
  509. package/dist/run/study-provenance.d.ts +47 -0
  510. package/dist/run/study-provenance.js +63 -0
  511. package/dist/run/study-result.d.ts +16 -0
  512. package/dist/run/study-result.js +9 -0
  513. package/dist/run/terminal-contract.d.ts +5 -5
  514. package/dist/run/terminal-contract.js +4 -4
  515. package/dist/run/text.d.ts +2 -0
  516. package/dist/run/text.js +4 -0
  517. package/dist/run/transient-comms-secrets.d.ts +5 -0
  518. package/dist/run/transient-comms-secrets.js +12 -0
  519. package/dist/run-lab.d.ts +40 -38
  520. package/dist/run-lab.js +42 -40
  521. package/dist/study/convert.d.ts +33 -0
  522. package/dist/study/convert.js +432 -0
  523. package/dist/study/field-paths.d.ts +12 -0
  524. package/dist/study/field-paths.js +126 -0
  525. package/dist/study/files.d.ts +26 -0
  526. package/dist/study/files.js +43 -0
  527. package/dist/study/migrate.d.ts +48 -0
  528. package/dist/study/migrate.js +408 -0
  529. package/dist/study/owned-files.d.ts +38 -0
  530. package/dist/study/owned-files.js +182 -0
  531. package/dist/subject/clone.d.ts +1 -1
  532. package/dist/subject/desktop-cli.d.ts +2 -2
  533. package/dist/subject/desktop-cli.js +3 -3
  534. package/dist/subject/local-tree-archive.d.ts +1 -1
  535. package/dist/subject/local-tree-archive.js +5 -5
  536. package/dist/subject/local-tree.d.ts +3 -3
  537. package/dist/subject/local-tree.js +1 -1
  538. package/dist/subject/node-bootstrap.d.ts +1 -1
  539. package/dist/subject/node-bootstrap.js +4 -4
  540. package/dist/subject/runtime.js +10 -11
  541. package/dist/subject/serve.d.ts +1 -1
  542. package/dist/subject/serve.js +4 -4
  543. package/dist/subject/state.d.ts +1 -1
  544. package/dist/subject/steps.d.ts +8 -8
  545. package/dist/subject/steps.js +7 -7
  546. package/dist/substrates/command-failure.d.ts +3 -3
  547. package/dist/substrates/command-failure.js +3 -3
  548. package/dist/substrates/detached.d.ts +6 -6
  549. package/dist/substrates/detached.js +7 -7
  550. package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
  551. package/dist/substrates/e2b/cdp-probe.js +15 -18
  552. package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
  553. package/dist/substrates/e2b/desktop-browser.js +12 -12
  554. package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
  555. package/dist/substrates/e2b/desktop-cdp.js +11 -11
  556. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  557. package/dist/substrates/e2b/desktop-executor.js +1 -1
  558. package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
  559. package/dist/substrates/e2b/desktop-geometry.js +9 -9
  560. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  561. package/dist/substrates/e2b/desktop-media.js +3 -3
  562. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  563. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  564. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  565. package/dist/substrates/e2b/sandbox.js +2 -2
  566. package/dist/substrates/e2b/sdk.d.ts +11 -11
  567. package/dist/substrates/e2b/sdk.js +8 -8
  568. package/dist/substrates/local/runtime-host.d.ts +2 -0
  569. package/dist/substrates/local/runtime-host.js +6 -0
  570. package/dist/tui/actions.d.ts +8 -6
  571. package/dist/tui/actions.js +31 -22
  572. package/dist/tui/contract.d.ts +16 -16
  573. package/dist/tui/contract.js +10 -10
  574. package/dist/tui/launch.d.ts +4 -4
  575. package/dist/tui/launch.js +18 -19
  576. package/dist/tui/project.js +5 -5
  577. package/dist/tui-app.js +83 -83
  578. package/dist/verify/actor.d.ts +14 -14
  579. package/dist/verify/actor.js +45 -45
  580. package/dist/verify/artifacts.d.ts +3 -3
  581. package/dist/verify/artifacts.js +6 -6
  582. package/dist/verify/context-growth.d.ts +9 -0
  583. package/dist/verify/context-growth.js +62 -0
  584. package/dist/verify/costs.d.ts +7 -7
  585. package/dist/verify/costs.js +9 -9
  586. package/dist/verify/liveness.d.ts +1 -1
  587. package/dist/verify/liveness.js +4 -1
  588. package/dist/verify/rerun.d.ts +1 -1
  589. package/dist/verify/rerun.js +1 -1
  590. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  591. package/dist/verify/shared-world-concurrent.js +79 -76
  592. package/dist/verify/shared-world.d.ts +2 -2
  593. package/dist/verify/shared-world.js +18 -18
  594. package/dist/verify/subject.d.ts +4 -4
  595. package/dist/verify/subject.js +18 -18
  596. package/dist/verify/verify.js +98 -49
  597. package/docs/README.md +26 -33
  598. package/docs/architecture/actor-contract.md +105 -98
  599. package/docs/architecture/desktop-sessions.md +14 -14
  600. package/docs/architecture/external-public-shared-world.md +66 -59
  601. package/docs/architecture/github-feedback-loop.md +1 -4
  602. package/docs/architecture/guest-desktop.md +2 -2
  603. package/docs/architecture/observer.md +37 -37
  604. package/docs/architecture/restricted-codex-analysis.md +70 -30
  605. package/docs/architecture/serve.md +34 -37
  606. package/docs/architecture/state-driven-executor.md +55 -59
  607. package/docs/architecture/task-protocol-support.md +7 -9
  608. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
  609. package/docs/contracts/README.md +24 -0
  610. package/docs/contracts/adapter-admission.md +3 -3
  611. package/docs/contracts/adapter-fixtures.md +2 -5
  612. package/docs/contracts/core.md +1 -3
  613. package/docs/contracts/errors.md +62 -0
  614. package/docs/contracts/feedback.md +8 -9
  615. package/docs/contracts/policy.md +7 -12
  616. package/docs/contracts/run-bundle.md +54 -51
  617. package/docs/contracts/schemas.md +505 -390
  618. package/docs/contracts/study-analysis.md +26 -2
  619. package/docs/contracts/study-costs.md +11 -7
  620. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  621. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  622. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  623. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  624. package/docs/principles/actor-fidelity.md +4 -4
  625. package/docs/principles/engineering.md +3 -3
  626. package/docs/principles/invariants-and-defaults.md +38 -38
  627. package/docs/principles/self-driving-harness.md +1 -5
  628. package/docs/principles/three-roles.md +1 -1
  629. package/docs/product/automatic-analysis.md +8 -7
  630. package/examples/participant/README.md +5 -5
  631. package/examples/participant/run.mjs +11 -10
  632. package/examples/scorer/README.md +3 -3
  633. package/examples/scorer/run.mjs +11 -12
  634. package/package.json +16 -17
  635. package/skills/humanish/SKILL.md +63 -60
  636. package/skills/humanish/agents/openai.yaml +1 -1
  637. package/AGENTS.md +0 -99
  638. package/CONTRIBUTING.md +0 -148
  639. package/dist/actors/codex/qualified-versions.d.ts +0 -45
  640. package/dist/actors/codex/qualified-versions.js +0 -87
  641. package/dist/cli/commands/lab.d.ts +0 -3
  642. package/dist/cli/commands/lab.js +0 -193
  643. package/dist/deprecated.d.ts +0 -90
  644. package/dist/deprecated.js +0 -106
  645. package/dist/lab/bag-overrides.d.ts +0 -18
  646. package/dist/lab/bag-overrides.js +0 -121
  647. package/dist/observer/static.d.ts +0 -39
  648. package/dist/observer/static.js +0 -369
  649. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  650. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  651. package/docs/architecture/comms-inbox.md +0 -122
  652. package/docs/architecture/desktop-recording.md +0 -80
  653. package/docs/architecture/local-browser-runtime.md +0 -178
  654. package/docs/architecture/observer-review.md +0 -144
  655. package/docs/architecture/participant-media.md +0 -90
  656. package/docs/architecture/project-layout.md +0 -62
  657. package/docs/architecture/real-email-receiving.md +0 -136
  658. package/docs/assets/humanish-drawdb-hero.png +0 -0
  659. package/docs/assets/humanish-observer-hero.png +0 -0
  660. package/docs/goals/current.md +0 -207
  661. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  662. package/docs/product/open-source-install-experience.md +0 -240
  663. package/docs/ramp/README.md +0 -294
  664. package/docs/release/open-source-readiness.md +0 -222
  665. package/docs/release/public-readiness-standard.md +0 -210
  666. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  667. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  668. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -1,13 +1,13 @@
1
- // Finding and admitting the Codex CLI a restricted launch runs: the native executable behind PATH
1
+ // Finding and admitting the Codex CLI a restricted launch runs: the native executable behind `PATH`
2
2
  // or the npm launcher, the environment its children get, and the `--version` check against the
3
3
  // host's admitted releases.
4
4
  import { constants } from "node:fs";
5
5
  import { access, open, realpath } from "node:fs/promises";
6
6
  import { createRequire } from "node:module";
7
7
  import path from "node:path";
8
- import { parseCodexCliVersion } from "./qualified-versions.js";
8
+ import { parseCodexCliVersion } from "./codex-admission.js";
9
9
  import { RestrictedCodexStop, closeOwnedCodexProcess, ownCodexProcess, retainUnclosedChild, } from "./restricted-transport.js";
10
- /** The environment of every Codex child: a private home and scratch, and PATH and locale. */
10
+ /** The environment of every Codex child: a private home and scratch, and `PATH` and locale. */
11
11
  export function childEnvironment(source, home, scratch) {
12
12
  const result = { HOME: home, CODEX_HOME: home, TMPDIR: scratch };
13
13
  for (const key of ["PATH", "LANG", "USER", "LOGNAME"])
@@ -47,42 +47,75 @@ export function restrictedCodexNpmTarget(platform, arch) {
47
47
  return { triple: "aarch64-apple-darwin", packageName: "codex-darwin-arm64" };
48
48
  return undefined;
49
49
  }
50
- /** Resolve PATH without running a shell. The npm launcher is resolved to its
50
+ /** Resolve `PATH` without running a shell. The npm launcher is resolved to its
51
51
  * native optional package so cleanup owns the real app-server child. */
52
52
  export async function resolveExecutable(options, env) {
53
- const platform = options.platform ?? process.platform, arch = options.arch ?? process.arch;
54
- let selected = options.executable;
55
- if (selected === undefined) {
56
- for (const directory of (env.PATH ?? "")
57
- .split(path.delimiter)
58
- .filter((entry) => path.isAbsolute(entry))) {
59
- const candidate = path.join(directory, "codex");
60
- try {
61
- await access(candidate, constants.X_OK);
62
- selected = candidate;
63
- break;
64
- }
65
- catch {
66
- /* Continue PATH. */
67
- }
53
+ const located = await locateExecutable(options, env);
54
+ // The stop carries only its code; doctor asks refusedCodexExecutable for the file and reason.
55
+ if ("refused" in located)
56
+ throw new RestrictedCodexStop("codex_unavailable");
57
+ return located.file;
58
+ }
59
+ /** The `codex` resolveExecutable turns down and why, or undefined when it finds one to run. */
60
+ export async function refusedCodexExecutable(env, options = {}) {
61
+ const located = await locateExecutable(options, env);
62
+ return "refused" in located ? located.refused : undefined;
63
+ }
64
+ /** The first executable `codex` on `PATH`, as resolveExecutable picks it. */
65
+ async function firstCodexOnPath(env) {
66
+ for (const directory of (env.PATH ?? "")
67
+ .split(path.delimiter)
68
+ .filter((entry) => path.isAbsolute(entry))) {
69
+ const candidate = path.join(directory, "codex");
70
+ try {
71
+ await access(candidate, constants.X_OK);
72
+ return candidate;
73
+ }
74
+ catch {
75
+ /* Try the next `PATH` entry. */
68
76
  }
69
77
  }
70
- if (selected === undefined || !path.isAbsolute(selected))
71
- throw new RestrictedCodexStop("codex_unavailable");
78
+ return undefined;
79
+ }
80
+ /**
81
+ * The `codex` resolveExecutable picks from `PATH`, runnable or not, and the file it resolves to:
82
+ * what decides the command that replaces it. Undefined when `PATH` has none that resolves.
83
+ */
84
+ export async function foundCodexExecutable(env) {
85
+ const selected = await firstCodexOnPath(env);
86
+ if (selected === undefined)
87
+ return undefined;
88
+ try {
89
+ return { path: selected, resolved: await realpath(selected) };
90
+ }
91
+ catch {
92
+ return undefined;
93
+ }
94
+ }
95
+ async function locateExecutable(options, env) {
96
+ const platform = options.platform ?? process.platform, arch = options.arch ?? process.arch;
97
+ const selected = options.executable ?? (await firstCodexOnPath(env));
98
+ const refused = (reason, file) => ({
99
+ refused: { ...(file === undefined ? {} : { path: file }), reason },
100
+ });
101
+ if (selected === undefined)
102
+ return refused("no executable `codex` is on PATH");
103
+ if (!path.isAbsolute(selected))
104
+ return refused("it is not an absolute path", selected);
72
105
  let resolved;
73
106
  try {
74
107
  resolved = await realpath(selected);
75
108
  }
76
109
  catch {
77
- throw new RestrictedCodexStop("codex_unavailable");
110
+ return refused("it does not resolve to a file", selected);
78
111
  }
79
112
  if (await isNativeExecutable(resolved, platform))
80
- return resolved;
113
+ return { file: resolved };
81
114
  if (path.basename(resolved) === "codex.js" && path.basename(path.dirname(resolved)) === "bin") {
82
115
  const packageRoot = path.dirname(path.dirname(resolved));
83
116
  const target = restrictedCodexNpmTarget(platform, arch);
84
117
  if (!target)
85
- throw new RestrictedCodexStop("codex_unavailable");
118
+ return refused(`the npm package has no native build for ${platform}-${arch}`, resolved);
86
119
  const { triple, packageName: nativePackage } = target;
87
120
  const candidates = [];
88
121
  try {
@@ -97,13 +130,55 @@ export async function resolveExecutable(options, env) {
97
130
  candidates.push(path.join(packageRoot, "vendor", triple, "bin", "codex"));
98
131
  for (const candidate of candidates) {
99
132
  if (await isNativeExecutable(candidate, platform))
100
- return realpath(candidate);
133
+ return { file: await realpath(candidate) };
134
+ }
135
+ return refused(`the npm package's native ${nativePackage} build is missing`, resolved);
136
+ }
137
+ return refused("it is neither a native Codex executable nor the @openai/codex npm launcher", resolved);
138
+ }
139
+ /**
140
+ * Writes this release's app-server schema (`app-server generate-json-schema --experimental`) into
141
+ * `out`, for the protocol check. False when the release exits without one. Bounded like the
142
+ * version check: 15 seconds, and a few kilobytes of output, which it does not otherwise read.
143
+ */
144
+ export async function generateProtocolSchema(file, env, cwd, out, spawnFn, deadline) {
145
+ deadline.check();
146
+ const owned = ownCodexProcess(spawnFn(file, ["app-server", "generate-json-schema", "--experimental", "--out", out], {
147
+ cwd,
148
+ env,
149
+ detached: false,
150
+ stdio: ["pipe", "pipe", "pipe"],
151
+ }));
152
+ let bytes = 0, exitCode = null;
153
+ const timer = setTimeout(() => deadline.stop("timeout"), 15_000);
154
+ const count = (chunk) => {
155
+ bytes += chunk.length;
156
+ if (bytes > 65_536)
157
+ deadline.stop("response_too_large");
158
+ };
159
+ owned.child.on("error", () => deadline.stop("codex_unavailable"));
160
+ owned.child.stdin.on("error", () => deadline.stop("codex_unavailable"));
161
+ owned.child.stdout.on("data", count);
162
+ owned.child.stderr.on("data", count);
163
+ owned.child.on("exit", (code) => {
164
+ exitCode = code;
165
+ });
166
+ try {
167
+ owned.child.stdin.end();
168
+ await deadline.wait(owned.closed);
169
+ return exitCode === 0;
170
+ }
171
+ finally {
172
+ clearTimeout(timer);
173
+ if (!(await closeOwnedCodexProcess(owned))) {
174
+ retainUnclosedChild(owned.closed);
175
+ // oxlint-disable-next-line no-unsafe-finally -- a Codex process that did not close invalidates the check
176
+ throw new RestrictedCodexStop("codex_cleanup_failed");
101
177
  }
102
178
  }
103
- throw new RestrictedCodexStop("codex_unavailable");
104
179
  }
105
- /** Returns the detected release after checking it against the admitted list. */
106
- export async function checkVersion(file, env, cwd, spawnFn, deadline, admitted, expected) {
180
+ /** Returns the detected release after checking it against launch admission (`admits`). */
181
+ export async function checkVersion(file, env, cwd, spawnFn, deadline, admits, expected) {
107
182
  deadline.check();
108
183
  const owned = ownCodexProcess(spawnFn(file, ["--version"], { cwd, env, detached: false, stdio: ["pipe", "pipe", "pipe"] }));
109
184
  let text = "", bytes = 0, exitCode = null;
@@ -131,7 +206,7 @@ export async function checkVersion(file, env, cwd, spawnFn, deadline, admitted,
131
206
  throw new RestrictedCodexStop("codex_unavailable");
132
207
  const version = parseCodexCliVersion(text);
133
208
  if (version === undefined ||
134
- !admitted.includes(version) ||
209
+ !admits(version) ||
135
210
  (expected !== undefined && version !== expected))
136
211
  throw new RestrictedCodexStop("codex_unsupported_version", version);
137
212
  return version;
@@ -22,7 +22,8 @@ export interface LaunchSettings {
22
22
  readonly operatorAuth: boolean;
23
23
  readonly reasoningEffort: ReasoningEffort;
24
24
  readonly spawnFn: RestrictedCodexSpawn;
25
- readonly admittedVersions: readonly string[];
25
+ /** Launch admission: codex-admission.ts, or the qualifier's exact list (restricted-session.ts). */
26
+ readonly admits: (version: string) => boolean;
26
27
  }
27
28
  /** What a launch records on the session, each piece as soon as it exists. */
28
29
  export interface LaunchState {
@@ -46,6 +47,12 @@ export interface LaunchState {
46
47
  resolvedModel: string | undefined;
47
48
  authentication: "chatgpt-account" | "api-key" | undefined;
48
49
  cliVersion: string | undefined;
50
+ /** Notification methods this humanish does not know that carried no item, by count. */
51
+ unknownNotifications: Map<string, number>;
52
+ /** How the release's schema differs from the fields humanish reads; set when that refuses. */
53
+ protocolIncompatibilities: string[] | undefined;
54
+ /** Schema values beyond the baseline, recorded at launch. */
55
+ protocolAdditions: string[] | undefined;
49
56
  }
50
57
  /** An admitted value, or the refusal a launch stops with. */
51
58
  export type Admission<T> = {
@@ -112,5 +119,5 @@ export declare function admitMcpStatus(reply: Record<string, unknown>): Admissio
112
119
  * The session's one-time launch: a private home, the auth link, the version check and the spawn,
113
120
  * then initialize, config, account, thread and MCP admission.
114
121
  */
115
- export declare function launchAdmittedAppServer(settings: LaunchSettings, state: LaunchState, request: RestrictedCodexRequest, deadline: RestrictedCodexDeadline, frameLimit: number, enter: (phase: CuaProviderFailurePhase) => void): Promise<RestrictedCodexTransport>;
122
+ export declare function launchAdmittedAppServer(settings: LaunchSettings, state: LaunchState, request: RestrictedCodexRequest, deadline: RestrictedCodexDeadline, frameLimit: number, enter: (phase: CuaProviderFailurePhase) => void, install: (transport: RestrictedCodexTransport) => void): Promise<RestrictedCodexTransport>;
116
123
  export {};
@@ -4,10 +4,12 @@
4
4
  // none of them touches the session. launchAdmittedAppServer sends the requests in order, stops on
5
5
  // the first refusal, and records each piece of state as soon as it exists so the session's
6
6
  // teardown (restricted-session.ts) cleans up a launch that fails partway.
7
- import { chmod, mkdir, mkdtemp, realpath, stat, symlink, writeFile } from "node:fs/promises";
7
+ import { chmod, mkdir, mkdtemp, realpath, rm, stat, symlink, writeFile } from "node:fs/promises";
8
8
  import { homedir, tmpdir } from "node:os";
9
9
  import path from "node:path";
10
- import { checkVersion, childEnvironment, resolveExecutable } from "./restricted-executable.js";
10
+ import { checkVersion, childEnvironment, generateProtocolSchema, resolveExecutable, } from "./restricted-executable.js";
11
+ import { checkProtocol, loadProtocolSchema } from "./protocol-compat.js";
12
+ import { protocolContract } from "./protocol-contract.js";
11
13
  import { admitsRestrictedCodexConfig, admitsRestrictedCodexThread, codexRecord, restrictedCodexConfig, } from "./restricted-policy.js";
12
14
  import { RestrictedCodexDeadline, RestrictedCodexStop, RestrictedCodexTransport, ownCodexProcess, } from "./restricted-transport.js";
13
15
  /** The admitted value; a refusal stops the launch. */
@@ -114,6 +116,37 @@ export function admitMcpStatus(reply) {
114
116
  return { refusal: "codex_unsafe_configuration" };
115
117
  return { value: undefined };
116
118
  }
119
+ /**
120
+ * The release's own app-server schema against the fields humanish reads and sends
121
+ * (protocol-contract.ts), generated into the private work directory on every launch. A change
122
+ * there refuses as codex_incompatible_release; a value beyond the baseline is recorded when the
123
+ * launch is admitted. Reading the schema waits on the deadline; a stop leaves the directory to
124
+ * the session's teardown, which removes the whole work directory.
125
+ */
126
+ async function admitProtocol(file, env, state, spawnFn, deadline, host) {
127
+ const directory = path.join(state.work, "schema");
128
+ const generated = await generateProtocolSchema(file, env, state.cwd, directory, spawnFn, deadline);
129
+ const schema = generated
130
+ ? await deadline.wait(loadProtocolSchema(directory).catch(() => undefined))
131
+ : undefined;
132
+ const result = schema === undefined
133
+ ? {
134
+ incompatibilities: [
135
+ generated
136
+ ? "its generated app-server schema could not be read"
137
+ : "it did not generate an app-server schema",
138
+ ],
139
+ additions: [],
140
+ }
141
+ : checkProtocol(schema, protocolContract(host));
142
+ await rm(directory, { recursive: true, force: true });
143
+ deadline.check();
144
+ if (result.incompatibilities.length > 0) {
145
+ state.protocolIncompatibilities = result.incompatibilities;
146
+ throw new RestrictedCodexStop("codex_incompatible_release");
147
+ }
148
+ state.protocolAdditions = result.additions;
149
+ }
117
150
  /** The host's Codex auth.json, which a private home links to instead of copying. */
118
151
  async function hostAuthFile(options, sourceEnv) {
119
152
  const authHome = options.authHome ?? sourceEnv.CODEX_HOME ?? path.join(sourceEnv.HOME ?? homedir(), ".codex");
@@ -133,7 +166,7 @@ async function hostAuthFile(options, sourceEnv) {
133
166
  * The session's one-time launch: a private home, the auth link, the version check and the spawn,
134
167
  * then initialize, config, account, thread and MCP admission.
135
168
  */
136
- export async function launchAdmittedAppServer(settings, state, request, deadline, frameLimit, enter) {
169
+ export async function launchAdmittedAppServer(settings, state, request, deadline, frameLimit, enter, install) {
137
170
  const { options, sourceEnv, participant, operatorAuth, reasoningEffort, spawnFn } = settings;
138
171
  const file = await resolveExecutable(options, sourceEnv);
139
172
  deadline.check();
@@ -146,7 +179,11 @@ export async function launchAdmittedAppServer(settings, state, request, deadline
146
179
  for (const directory of [home, state.cwd, state.scratch])
147
180
  await mkdir(directory, { mode: 0o700 });
148
181
  const env = childEnvironment(sourceEnv, home, state.scratch);
149
- state.cliVersion = await checkVersion(file, env, state.cwd, spawnFn, deadline, settings.admittedVersions, options.cliVersion);
182
+ state.cliVersion = await checkVersion(file, env, state.cwd, spawnFn, deadline, settings.admits, options.cliVersion);
183
+ await admitProtocol(file, env, state, spawnFn, deadline, {
184
+ reasoningEffort,
185
+ platform: settings.platform,
186
+ });
150
187
  const configMode = {
151
188
  participantCodeMode: participant !== undefined,
152
189
  reasoningEffort,
@@ -173,6 +210,8 @@ export async function launchAdmittedAppServer(settings, state, request, deadline
173
210
  stdio: ["pipe", "pipe", "pipe"],
174
211
  }));
175
212
  const launched = new RestrictedCodexTransport(owned, deadline, frameLimit);
213
+ // The session's handlers check output from the first byte, before initialize returns.
214
+ install(launched);
176
215
  state.transport = launched;
177
216
  enter("initialize");
178
217
  const initialize = await launched.rpc("initialize", {
@@ -0,0 +1,101 @@
1
+ import { type RestrictedCodexAnalysisErrorCode } from "./restricted-policy.js";
2
+ import { type RestrictedCodexDeadline, type RestrictedCodexTransport } from "./restricted-transport.js";
3
+ /** Raw response item types an analyst turn may produce. */
4
+ export declare const ANALYST_RAW_ITEM_TYPES: readonly string[];
5
+ /** A participant also runs Code Mode: `exec` custom tool calls and `wait` function calls. */
6
+ export declare const PARTICIPANT_RAW_ITEM_TYPES: readonly string[];
7
+ /** Thread item types an analyst turn may produce. */
8
+ export declare const ANALYST_ITEM_TYPES: readonly string[];
9
+ /** A participant also has its one dynamic tool. */
10
+ export declare const PARTICIPANT_ITEM_TYPES: readonly string[];
11
+ /**
12
+ * Server notification methods in Codex CLI 0.160.0's app-server schema
13
+ * (`codex app-server generate-json-schema --experimental`, ServerNotification), plus two it sends
14
+ * outside that union: rawResponseItem/completed, and rawResponse/completed, whose v2 definition
15
+ * (RawResponseCompletedNotification) carries only a response id and usage.
16
+ */
17
+ export declare const KNOWN_CODEX_NOTIFICATIONS: ReadonlySet<string>;
18
+ /** What the item policy depends on: the session's role and, for a participant, its tool. */
19
+ export interface NotificationPolicy {
20
+ readonly participant: boolean;
21
+ /** The participant's tool name, read at each use; undefined for an analyst. */
22
+ toolName(): string | undefined;
23
+ }
24
+ /** The item policy for a session: a participant's tool name is read at each use. */
25
+ export declare function notificationPolicyOf(participant: {
26
+ readonly tool: {
27
+ readonly name: string;
28
+ };
29
+ } | undefined): NotificationPolicy;
30
+ /** Adds one notification of `method` to a session's unknown-method counts. */
31
+ export declare function countUnknownNotification(counts: Map<string, number>, method: string): void;
32
+ /**
33
+ * The items a notification carries, each with the method whose policy it takes, or null when one
34
+ * is malformed. 0.160.0's schema puts a ThreadItem in `params.item` (item/started,
35
+ * item/completed), `params.turn.items` (turn/started, turn/completed) and
36
+ * `params.thread.turns[].items` (thread/started). An `item` array and an `items` array are read
37
+ * too, for a release that adds them. A nested ThreadItem takes the item/completed policy.
38
+ */
39
+ export declare function notificationItems(method: string, params: Record<string, unknown>): {
40
+ method: string;
41
+ item: Record<string, unknown>;
42
+ }[] | null;
43
+ /**
44
+ * How a notification fares under the item policy: it carries no item, only allowed items, or a
45
+ * disallowed or malformed one.
46
+ */
47
+ export declare function itemPolicyOf(method: string, params: Record<string, unknown>, policy: NotificationPolicy): "none" | "allowed" | "violation";
48
+ /**
49
+ * True when an item breaks the item policy. rawResponseItem/completed, and an item of a raw type
50
+ * under any method other than item/started or item/completed, use the raw-item policy. Every
51
+ * other item uses the thread-item policy: an allowed type, the participant's one dynamic tool, and
52
+ * no agent message that delivers asynchronously or asks a question.
53
+ */
54
+ export declare function itemPolicyViolation(method: string, item: Record<string, unknown>, policy: NotificationPolicy): boolean;
55
+ /**
56
+ * The handler for notifications outside a dispatched turn: during the handshake, before
57
+ * turn/start, between requests and while closing. A disallowed or malformed item refuses; an
58
+ * unknown method without an item is counted; anything else is ignored, as there is no turn to
59
+ * apply it to.
60
+ */
61
+ export declare function idleNotificationHandler(policy: NotificationPolicy, recordUnknown: (method: string) => void, refuse: (code: RestrictedCodexAnalysisErrorCode) => void): (method: string, params: Record<string, unknown>) => void;
62
+ /** The run warning for unknown notification methods, or undefined when there were none. */
63
+ export declare function unknownNotificationsWarning(counts: Readonly<Record<string, number>> | undefined, cliVersion: string | undefined): string | undefined;
64
+ /** The run warning for a last frame cut off by humanish's own stop, or undefined when none was. */
65
+ export declare function truncatedFrameWarning(bytes: number | undefined): string | undefined;
66
+ /** The session fields its handlers outside a turn read and write (restricted-session). */
67
+ export interface NotificationSessionState {
68
+ readonly unknownNotifications: Map<string, number>;
69
+ /** The request in flight's deadline, or undefined between requests. */
70
+ readonly activeDeadline: RestrictedCodexDeadline | undefined;
71
+ readonly transport: RestrictedCodexTransport | undefined;
72
+ /**
73
+ * The first policy refusal or unchecked output in the session, whenever it happened and whether
74
+ * or not a request reported it: a caller that tolerates a request's failure (the debrief) must
75
+ * not absorb it.
76
+ */
77
+ policyRefusal: RestrictedCodexAnalysisErrorCode | undefined;
78
+ /** Bytes of last frames cut off after humanish stopped the app-server: a warning only. */
79
+ truncatedFrameBytes: number | undefined;
80
+ }
81
+ type Participant = {
82
+ readonly tool: {
83
+ readonly name: string;
84
+ };
85
+ } | undefined;
86
+ /**
87
+ * A policy refusal: it is recorded, the active request stops with `code`, pending RPCs are
88
+ * rejected, and between requests the next request fails with it.
89
+ */
90
+ export declare function refuseSession(state: NotificationSessionState, code: RestrictedCodexAnalysisErrorCode): void;
91
+ /** The session's handler for notifications outside a dispatched turn, on its current transport. */
92
+ export declare function idleNotifications(participant: Participant, state: NotificationSessionState): (method: string, params: Record<string, unknown>) => void;
93
+ /**
94
+ * Installs the session's handlers on a new transport, before its first request: notifications
95
+ * outside a turn, notifications once the transport stopped or is closing, and policy failures
96
+ * the transport finds itself.
97
+ */
98
+ export declare function installSessionHandlers(participant: Participant, state: NotificationSessionState, transport: RestrictedCodexTransport): void;
99
+ /** After a request: the turn's handlers come off the transport, and the idle handlers go on. */
100
+ export declare function detachTurn(participant: Participant, state: NotificationSessionState): void;
101
+ export {};