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
@@ -2,12 +2,13 @@ import { spawn } from "node:child_process";
2
2
  import { chmod, lstat, mkdir, mkdtemp, readdir, realpath, rm, unlink, writeFile, } from "node:fs/promises";
3
3
  import { homedir, tmpdir } from "node:os";
4
4
  import path from "node:path";
5
- import { admittedCodexCliVersions } from "./qualified-versions.js";
5
+ import { admitsCodexCliVersion, supportsIsolatedCodex } from "./codex-admission.js";
6
6
  import { launchAdmittedAppServer, } from "./restricted-launch.js";
7
7
  import { CODEX_IMAGE, CODEX_MAX_OUTPUT_BYTES, CODEX_MAX_REQUEST_BYTES, RESTRICTED_CODEX_ANALYSIS_MODELS, codexRecord, restrictedCodexFailure, restrictedCodexRequestError, } from "./restricted-policy.js";
8
- import { RestrictedCodexDeadline, RestrictedCodexStop, RestrictedCodexTransport, hasUnclosedChildren, retainUnclosedChild, } from "./restricted-transport.js";
8
+ import { RestrictedCodexDeadline, RestrictedCodexStop, hasUnclosedChildren, retainUnclosedChild, } from "./restricted-transport.js";
9
9
  import { checkVersion, childEnvironment, resolveExecutable, restrictedCodexNpmTarget, } from "./restricted-executable.js";
10
10
  import { RestrictedCodexTurn } from "./restricted-turn.js";
11
+ import { countUnknownNotification, detachTurn, idleNotifications, installSessionHandlers, notificationPolicyOf, refuseSession, } from "./restricted-notifications.js";
11
12
  function validParticipant(options) {
12
13
  if (!options)
13
14
  return true;
@@ -34,12 +35,29 @@ function validParticipant(options) {
34
35
  export async function runRestrictedCodexSession(request, options = {}, readinessOnly = false) {
35
36
  const session = createRestrictedCodexSession(options);
36
37
  const result = await session.run(request, readinessOnly);
37
- return (await session.close())
38
- ? result
39
- : {
38
+ const closed = await session.close();
39
+ const unknownNotifications = session.unknownNotifications ?? {};
40
+ const truncatedFrameBytes = session.truncatedFrameBytes;
41
+ const { protocolIncompatibilities, protocolAdditions } = session;
42
+ const noted = {
43
+ ...(Object.keys(unknownNotifications).length === 0 ? {} : { unknownNotifications }),
44
+ ...(truncatedFrameBytes === undefined ? {} : { truncatedFrameBytes }),
45
+ ...(protocolIncompatibilities === undefined ? {} : { protocolIncompatibilities }),
46
+ ...(protocolAdditions === undefined || protocolAdditions.length === 0
47
+ ? {}
48
+ : { protocolAdditions }),
49
+ };
50
+ if (!closed)
51
+ return {
40
52
  ...restrictedCodexFailure("codex_cleanup_failed", result.dispatched, result.usage),
41
53
  failurePhase: "cleanup",
54
+ ...noted,
42
55
  };
56
+ // A disallowed item while the app-server shut down fails a request that had completed.
57
+ const refusal = session.policyRefusal;
58
+ return refusal !== undefined && result.errorCode === null
59
+ ? { ...restrictedCodexFailure(refusal, result.dispatched, result.usage), ...noted }
60
+ : { ...result, ...noted };
43
61
  }
44
62
  async function writeRecoveryMarker(work, sourceEnv, reason) {
45
63
  const cache = sourceEnv.XDG_CACHE_HOME ?? path.join(sourceEnv.HOME ?? homedir(), ".cache");
@@ -200,17 +218,12 @@ function newTurn(settings, state, deadline) {
200
218
  turnStarted: (turnId) => {
201
219
  state.interrupt = { threadId: state.threadId, turnId };
202
220
  },
221
+ policy: notificationPolicyOf(participant),
222
+ idle: (method, params) => idleNotifications(participant, state)(method, params),
223
+ recordUnknown: (method) => countUnknownNotification(state.unknownNotifications, method),
224
+ refuse: (code) => refuseSession(state, code),
203
225
  });
204
226
  }
205
- /** After a request: the turn's handlers come off the transport. */
206
- function detachTurn(transport) {
207
- if (transport)
208
- transport.onNotification = () => undefined;
209
- if (transport)
210
- transport.onRequest = undefined;
211
- if (transport)
212
- transport.onRequestComplete = undefined;
213
- }
214
227
  /** Request dispatch: launch on the first request, then one turn; a failed request tears down. */
215
228
  async function runTurn(settings, state, dispose, request, readinessOnly) {
216
229
  const participant = settings.participant;
@@ -228,13 +241,13 @@ async function runTurn(settings, state, dispose, request, readinessOnly) {
228
241
  if (!state.transport) {
229
242
  state.transport = await launchAdmittedAppServer(settings, state, request, deadline, frameLimit, (next) => {
230
243
  phase = next;
231
- });
244
+ }, (transport) => installSessionHandlers(participant, state, transport));
232
245
  selectedModel = state.identity.model;
233
246
  }
234
247
  else
235
248
  state.transport.beginRequest(deadline, frameLimit);
236
- // onNotification ignores events before dispatch and onRequestComplete follows only a host
237
- // callback, so wiring both after the first launch's handshake loses nothing.
249
+ // Before dispatch the turn passes notifications to the idle handler the launch installed,
250
+ // and onRequestComplete follows only a host callback, so wiring both here loses nothing.
238
251
  state.transport.onNotification = turn.onNotification;
239
252
  state.transport.onRequestComplete = turn.onRequestComplete;
240
253
  if (readinessOnly)
@@ -269,7 +282,7 @@ async function runTurn(settings, state, dispose, request, readinessOnly) {
269
282
  state.pendingInferenceUsage = undefined;
270
283
  deadline.close();
271
284
  state.activeDeadline = undefined;
272
- detachTurn(state.transport);
285
+ detachTurn(participant, state);
273
286
  if (result.errorCode !== null) {
274
287
  if (result.errorCode === "codex_cleanup_failed")
275
288
  state.cleanupTrusted = false;
@@ -299,11 +312,16 @@ function refusedRun(settings, state, request, busy) {
299
312
  return restrictedCodexFailure("codex_busy");
300
313
  const supportedPlatform = operatorAuth
301
314
  ? restrictedCodexNpmTarget(platform, arch) !== undefined
302
- : (platform === "linux" && arch === "x64") || (platform === "darwin" && arch === "arm64");
315
+ : supportsIsolatedCodex(platform, arch);
303
316
  if (!supportedPlatform)
304
317
  return restrictedCodexFailure("codex_unsupported_platform");
305
318
  return undefined;
306
319
  }
320
+ /** Which releases a session starts: launch admission, or the qualifier's exact list. */
321
+ function launchAdmission(options) {
322
+ const exact = options.cliVersions;
323
+ return exact === undefined ? admitsCodexCliVersion : (version) => exact.includes(version);
324
+ }
307
325
  export function createRestrictedCodexSession(options = {}) {
308
326
  // Option reads keep their old order: platform, arch, env, participant, spawnFn, cliVersions.
309
327
  const platform = options.platform ?? process.platform, arch = options.arch ?? process.arch;
@@ -318,7 +336,7 @@ export function createRestrictedCodexSession(options = {}) {
318
336
  operatorAuth: participant?.authMode === "operator",
319
337
  reasoningEffort: participant?.reasoningEffort ?? "low",
320
338
  spawnFn: options.spawnFn ?? ((file, args, spawnOptions) => spawn(file, args, spawnOptions)),
321
- admittedVersions: options.cliVersions ?? admittedCodexCliVersions(platform, arch),
339
+ admits: launchAdmission(options),
322
340
  };
323
341
  const state = {
324
342
  work: undefined,
@@ -335,10 +353,15 @@ export function createRestrictedCodexSession(options = {}) {
335
353
  resolvedModel: undefined,
336
354
  authentication: undefined,
337
355
  cliVersion: undefined,
356
+ unknownNotifications: new Map(),
357
+ protocolIncompatibilities: undefined,
358
+ protocolAdditions: undefined,
338
359
  activeDeadline: undefined,
339
360
  interrupt: undefined,
340
361
  closed: false,
341
362
  cleanupTrusted: true,
363
+ policyRefusal: undefined,
364
+ truncatedFrameBytes: undefined,
342
365
  };
343
366
  let pending, closing, disposing;
344
367
  const dispose = () => {
@@ -361,6 +384,21 @@ export function createRestrictedCodexSession(options = {}) {
361
384
  get cliVersion() {
362
385
  return state.cliVersion;
363
386
  },
387
+ get unknownNotifications() {
388
+ return Object.fromEntries(state.unknownNotifications);
389
+ },
390
+ get policyRefusal() {
391
+ return state.policyRefusal;
392
+ },
393
+ get truncatedFrameBytes() {
394
+ return state.truncatedFrameBytes;
395
+ },
396
+ get protocolIncompatibilities() {
397
+ return state.protocolIncompatibilities;
398
+ },
399
+ get protocolAdditions() {
400
+ return state.protocolAdditions;
401
+ },
364
402
  run(request, readinessOnly = false) {
365
403
  const refusal = refusedRun(settings, state, request, () => pending !== undefined);
366
404
  if (refusal)
@@ -401,7 +439,7 @@ export async function checkRestrictedCodexSessionReadiness(input = {}, options =
401
439
  * `--version` runs with a private temporary home, removed afterwards. */
402
440
  export async function detectRestrictedCodexCliVersion(input = {}, options = {}) {
403
441
  const platform = options.platform ?? process.platform, arch = options.arch ?? process.arch;
404
- if (!((platform === "linux" && arch === "x64") || (platform === "darwin" && arch === "arm64")))
442
+ if (!supportsIsolatedCodex(platform, arch))
405
443
  return { cliVersion: null, errorCode: "codex_unsupported_platform" };
406
444
  const sourceEnv = options.env ?? process.env;
407
445
  const deadline = new RestrictedCodexDeadline(input.timeoutMs ?? 15_000, input.signal);
@@ -411,7 +449,7 @@ export async function detectRestrictedCodexCliVersion(input = {}, options = {})
411
449
  work = await realpath(await mkdtemp(path.join(options.tempRoot ?? tmpdir(), "humanish-codex-version-")));
412
450
  const home = path.join(work, "home");
413
451
  await mkdir(home, { mode: 0o700 });
414
- const cliVersion = await checkVersion(file, childEnvironment(sourceEnv, home, work), work, options.spawnFn ?? ((command, args, settings) => spawn(command, args, settings)), deadline, options.cliVersions ?? admittedCodexCliVersions(platform, arch), options.cliVersion);
452
+ const cliVersion = await checkVersion(file, childEnvironment(sourceEnv, home, work), work, options.spawnFn ?? ((command, args, settings) => spawn(command, args, settings)), deadline, launchAdmission(options), options.cliVersion);
415
453
  return { cliVersion, errorCode: null };
416
454
  }
417
455
  catch (error) {
@@ -34,11 +34,21 @@ export declare class RestrictedCodexDeadline {
34
34
  }
35
35
  export declare function retainUnclosedChild(closed: Promise<void>): void;
36
36
  export declare const hasUnclosedChildren: () => boolean;
37
+ /** How the process exited: its exit code, or the signal that ended it. */
38
+ interface OwnedCodexExit {
39
+ code: number | null;
40
+ signal: NodeJS.Signals | null;
41
+ }
37
42
  export interface OwnedCodexProcess {
38
43
  child: ChildProcessWithoutNullStreams;
39
44
  closed: Promise<void>;
40
45
  isClosed(): boolean;
41
46
  hasExited(): boolean;
47
+ /** Resolves with the 'exit' event's code and signal. */
48
+ readonly exit: Promise<OwnedCodexExit>;
49
+ /** The signals humanish delivered while the process was still running (signalOwnedChild). */
50
+ signalsSent(): readonly NodeJS.Signals[];
51
+ recordSignal(signal: NodeJS.Signals): void;
42
52
  }
43
53
  export declare function ownCodexProcess(child: ChildProcessWithoutNullStreams): OwnedCodexProcess;
44
54
  export declare function closeOwnedCodexProcess(owned: OwnedCodexProcess): Promise<boolean>;
@@ -55,11 +65,29 @@ export declare class RestrictedCodexTransport {
55
65
  private eventCount;
56
66
  private closing;
57
67
  onNotification: (method: string, params: Record<string, unknown>) => void;
68
+ /** Notifications after the deadline stopped or close began: no turn handles them, only the policy. */
69
+ onPolicyOnlyNotification: (method: string, params: Record<string, unknown>) => void;
70
+ /** A server request with no handler, or output that could not be checked (failUninspected). */
71
+ onPolicyFailure: (code: RestrictedCodexAnalysisErrorCode) => void;
72
+ /** The size of a last frame cut off after humanish stopped the process: a warning only. */
73
+ onTruncatedFrame: (bytes: number) => void;
58
74
  onRequest: ((method: string, params: Record<string, unknown>) => Promise<Record<string, unknown>>) | undefined;
59
75
  onRequestComplete: (() => void) | undefined;
60
76
  constructor(owned: OwnedCodexProcess, deadline: RestrictedCodexDeadline, frameLimit?: number);
61
77
  /** A completed turn releases its deadline and wire budget, not its conversation. */
62
78
  beginRequest(deadline: RestrictedCodexDeadline, frameLimit: number): void;
79
+ /** One line of output: a malformed line could not be checked. */
80
+ private frame;
81
+ /**
82
+ * Output that could not be checked: past a byte, frame or event limit, malformed, or cut off.
83
+ * The session records it through onPolicyFailure, whatever state the transport is in.
84
+ */
85
+ private failUninspected;
86
+ /**
87
+ * Refuses the session with `code`: stops the current deadline and rejects pending requests.
88
+ * Between requests the stopped deadline makes the next beginRequest throw the code.
89
+ */
90
+ refuse(code: RestrictedCodexAnalysisErrorCode): void;
63
91
  private fail;
64
92
  private message;
65
93
  private write;
@@ -71,3 +99,4 @@ export declare class RestrictedCodexTransport {
71
99
  turnId: string;
72
100
  }): Promise<boolean>;
73
101
  }
102
+ export {};
@@ -91,8 +91,12 @@ export function retainUnclosedChild(closed) {
91
91
  export const hasUnclosedChildren = () => unclosedChildren.size > 0;
92
92
  export function ownCodexProcess(child) {
93
93
  let closed = false, exited = false;
94
- child.once("exit", () => {
95
- exited = true;
94
+ const sent = [];
95
+ const exit = new Promise((resolve) => {
96
+ child.once("exit", (code, signal) => {
97
+ exited = true;
98
+ resolve({ code, signal });
99
+ });
96
100
  });
97
101
  const completion = new Promise((resolve) => {
98
102
  child.once("close", () => {
@@ -100,7 +104,17 @@ export function ownCodexProcess(child) {
100
104
  resolve();
101
105
  });
102
106
  });
103
- return { child, closed: completion, isClosed: () => closed, hasExited: () => exited };
107
+ return {
108
+ child,
109
+ closed: completion,
110
+ isClosed: () => closed,
111
+ hasExited: () => exited,
112
+ exit,
113
+ signalsSent: () => sent,
114
+ recordSignal: (signal) => {
115
+ sent.push(signal);
116
+ },
117
+ };
104
118
  }
105
119
  async function settlesWithin(promise, ms) {
106
120
  let timer;
@@ -122,7 +136,9 @@ function signalOwnedChild(owned, signal) {
122
136
  if (owned.hasExited() || owned.isClosed())
123
137
  return;
124
138
  try {
125
- owned.child.kill(signal);
139
+ // kill() is true when the signal was delivered.
140
+ if (owned.child.kill(signal))
141
+ owned.recordSignal(signal);
126
142
  }
127
143
  catch {
128
144
  /* Closing is still checked below. */
@@ -142,6 +158,15 @@ export async function closeOwnedCodexProcess(owned) {
142
158
  owned.child.stderr.destroy();
143
159
  return closed;
144
160
  }
161
+ function isJson(text) {
162
+ try {
163
+ JSON.parse(text);
164
+ return true;
165
+ }
166
+ catch {
167
+ return false;
168
+ }
169
+ }
145
170
  export class RestrictedCodexTransport {
146
171
  owned;
147
172
  deadline;
@@ -155,6 +180,12 @@ export class RestrictedCodexTransport {
155
180
  eventCount = 0;
156
181
  closing = false;
157
182
  onNotification = () => undefined;
183
+ /** Notifications after the deadline stopped or close began: no turn handles them, only the policy. */
184
+ onPolicyOnlyNotification = () => undefined;
185
+ /** A server request with no handler, or output that could not be checked (failUninspected). */
186
+ onPolicyFailure = () => undefined;
187
+ /** The size of a last frame cut off after humanish stopped the process: a warning only. */
188
+ onTruncatedFrame = () => undefined;
158
189
  onRequest;
159
190
  onRequestComplete;
160
191
  constructor(owned, deadline, frameLimit = CODEX_MAX_OUTPUT_BYTES) {
@@ -165,38 +196,59 @@ export class RestrictedCodexTransport {
165
196
  child.on("error", () => this.fail("codex_process_failed"));
166
197
  child.stdin.on("error", () => this.fail("codex_process_failed"));
167
198
  child.on("close", () => this.fail("codex_process_failed"));
199
+ // Output is read until the process exits. Once the deadline stops or close begins, it is read
200
+ // for the item policy only (message); only the byte and frame limits stop reading, and they
201
+ // count as unchecked output.
168
202
  child.stdout.on("data", (chunk) => {
169
- if ((!this.closing && this.deadline.code !== null) ||
170
- (this.closing && this.pending.size === 0))
171
- return;
172
203
  this.stdoutBytes += chunk.length;
173
204
  if (this.stdoutBytes >
174
205
  Math.max(CODEX_MAX_STDOUT_BYTES, this.frameLimit * 2 + CODEX_MAX_OUTPUT_BYTES * 2)) {
175
- this.fail("response_too_large");
206
+ this.failUninspected("response_too_large");
176
207
  return;
177
208
  }
178
209
  this.line += this.decoder.write(chunk);
179
210
  if (Buffer.byteLength(this.line) > this.frameLimit) {
180
- this.fail("response_too_large");
211
+ this.failUninspected("response_too_large");
181
212
  return;
182
213
  }
183
214
  while (this.line.includes("\n")) {
184
- const split = this.line.indexOf("\n"), line = this.line.slice(0, split);
215
+ const split = this.line.indexOf("\n");
216
+ const line = this.line.slice(0, split);
185
217
  this.line = this.line.slice(split + 1);
186
- if (line.length === 0) {
187
- this.fail("codex_protocol_error");
188
- return;
189
- }
190
- try {
191
- this.message(JSON.parse(line));
192
- }
193
- catch {
194
- this.fail("codex_protocol_error");
195
- }
196
- if (this.deadline.code !== null && !this.closing)
197
- return;
218
+ this.frame(line);
198
219
  }
199
220
  });
221
+ // A last frame without its newline is parsed when it is whole JSON. A cut-off frame is a
222
+ // warning with its size only when humanish's own signal cut it: the signal reached the running
223
+ // process before its output ended, and the process then exited by that signal or with a code.
224
+ // Any other cut-off frame (an exit on its own, a crash, a signal humanish did not send) went
225
+ // unchecked.
226
+ child.stdout.on("end", () => {
227
+ const rest = this.line + this.decoder.end();
228
+ this.line = "";
229
+ const lines = rest.split("\n").filter((line) => line.length > 0);
230
+ const last = lines.pop();
231
+ for (const line of lines)
232
+ this.frame(line);
233
+ if (last === undefined)
234
+ return;
235
+ if (isJson(last)) {
236
+ this.frame(last);
237
+ return;
238
+ }
239
+ if (this.owned.signalsSent().length === 0) {
240
+ this.failUninspected("codex_protocol_error");
241
+ return;
242
+ }
243
+ const bytes = Buffer.byteLength(last);
244
+ void this.owned.exit.then(({ code, signal }) => {
245
+ const ours = signal === null ? code !== null : this.owned.signalsSent().includes(signal);
246
+ if (ours)
247
+ this.onTruncatedFrame(bytes);
248
+ else
249
+ this.failUninspected("codex_protocol_error");
250
+ });
251
+ });
200
252
  child.stderr.on("data", (chunk) => {
201
253
  this.stderrBytes += chunk.length;
202
254
  if (this.stderrBytes > CODEX_MAX_OUTPUT_BYTES)
@@ -215,6 +267,41 @@ export class RestrictedCodexTransport {
215
267
  this.stderrBytes = 0;
216
268
  this.eventCount = 0;
217
269
  }
270
+ /** One line of output: a malformed line could not be checked. */
271
+ frame(line) {
272
+ let parsed;
273
+ try {
274
+ parsed = line.length === 0 ? undefined : JSON.parse(line);
275
+ }
276
+ catch {
277
+ parsed = undefined;
278
+ }
279
+ if (parsed === undefined) {
280
+ this.failUninspected("codex_protocol_error");
281
+ return;
282
+ }
283
+ try {
284
+ this.message(parsed);
285
+ }
286
+ catch {
287
+ this.fail("codex_protocol_error");
288
+ }
289
+ }
290
+ /**
291
+ * Output that could not be checked: past a byte, frame or event limit, malformed, or cut off.
292
+ * The session records it through onPolicyFailure, whatever state the transport is in.
293
+ */
294
+ failUninspected(code) {
295
+ this.onPolicyFailure(code);
296
+ this.fail(code);
297
+ }
298
+ /**
299
+ * Refuses the session with `code`: stops the current deadline and rejects pending requests.
300
+ * Between requests the stopped deadline makes the next beginRequest throw the code.
301
+ */
302
+ refuse(code) {
303
+ this.fail(code);
304
+ }
218
305
  fail(code) {
219
306
  if (!this.closing)
220
307
  this.deadline.stop(code);
@@ -225,13 +312,31 @@ export class RestrictedCodexTransport {
225
312
  message(raw) {
226
313
  const value = codexRecord(raw);
227
314
  if (Object.keys(value).length === 0) {
228
- this.fail("codex_protocol_error");
315
+ this.failUninspected("codex_protocol_error");
229
316
  return;
230
317
  }
318
+ // After the deadline stopped or close began, output is read for the item policy only.
319
+ const policyOnly = this.closing || this.deadline.code !== null;
231
320
  if (value.id !== undefined && typeof value.method === "string") {
321
+ // A server request is then declined unhandled: its turn is over or being interrupted, so a
322
+ // tool call that crossed the stop runs nothing and is not a policy refusal.
323
+ if (policyOnly) {
324
+ try {
325
+ this.write({
326
+ id: value.id,
327
+ error: { code: -32601, message: "Host request is disabled" },
328
+ });
329
+ }
330
+ catch {
331
+ /* The process is already closing. */
332
+ }
333
+ return;
334
+ }
232
335
  if (!this.onRequest || ++this.eventCount > CODEX_MAX_EVENTS) {
336
+ const code = this.eventCount > CODEX_MAX_EVENTS ? "response_too_large" : "codex_tool_call";
337
+ this.onPolicyFailure(code);
233
338
  this.write({ id: value.id, error: { code: -32601, message: "Host request is disabled" } });
234
- this.fail(this.eventCount > CODEX_MAX_EVENTS ? "response_too_large" : "codex_tool_call");
339
+ this.fail(code);
235
340
  return;
236
341
  }
237
342
  const id = value.id;
@@ -263,7 +368,9 @@ export class RestrictedCodexTransport {
263
368
  if (typeof value.id === "number" && value.method === undefined) {
264
369
  const pending = this.pending.get(value.id);
265
370
  if (!pending) {
266
- this.fail("codex_protocol_error");
371
+ // A late reply, such as an interrupt's after its wait, carries no item.
372
+ if (!policyOnly)
373
+ this.fail("codex_protocol_error");
267
374
  return;
268
375
  }
269
376
  this.pending.delete(value.id);
@@ -280,10 +387,12 @@ export class RestrictedCodexTransport {
280
387
  if (typeof value.method !== "string" ||
281
388
  value.id !== undefined ||
282
389
  ++this.eventCount > CODEX_MAX_EVENTS) {
283
- this.fail(this.eventCount > CODEX_MAX_EVENTS ? "response_too_large" : "codex_protocol_error");
390
+ this.failUninspected(this.eventCount > CODEX_MAX_EVENTS ? "response_too_large" : "codex_protocol_error");
284
391
  return;
285
392
  }
286
- if (!this.closing)
393
+ if (policyOnly)
394
+ this.onPolicyOnlyNotification(value.method, codexRecord(value.params));
395
+ else
287
396
  this.onNotification(value.method, codexRecord(value.params));
288
397
  }
289
398
  write(value) {
@@ -324,6 +433,9 @@ export class RestrictedCodexTransport {
324
433
  }
325
434
  async close(interrupt) {
326
435
  this.closing = true;
436
+ // Shutdown output gets its own byte and event budget.
437
+ this.stdoutBytes = 0;
438
+ this.eventCount = 0;
327
439
  if (interrupt && !this.owned.isClosed()) {
328
440
  const { id, result } = this.request("turn/interrupt", interrupt);
329
441
  await settlesWithin(result, 1000);
@@ -1,5 +1,6 @@
1
- import { type RestrictedCodexResult, type RestrictedCodexUsage } from "./restricted-policy.js";
1
+ import { type RestrictedCodexAnalysisErrorCode, type RestrictedCodexResult, type RestrictedCodexUsage } from "./restricted-policy.js";
2
2
  import { type RestrictedCodexDeadline, type RestrictedCodexTransport } from "./restricted-transport.js";
3
+ import { type NotificationPolicy } from "./restricted-notifications.js";
3
4
  /** What a turn reads from and reports to its session. */
4
5
  export interface RestrictedCodexTurnContext {
5
6
  readonly deadline: RestrictedCodexDeadline;
@@ -23,11 +24,23 @@ export interface RestrictedCodexTurnContext {
23
24
  reportUsage(usage: RestrictedCodexUsage | undefined, inference: RestrictedCodexUsage[] | undefined): void;
24
25
  /** The turn the session interrupts if it closes now. */
25
26
  turnStarted(turnId: string): void;
27
+ /** The item policy every notification's item passes, whatever its method. */
28
+ readonly policy: NotificationPolicy;
29
+ /** The session's handler for notifications that arrive before this turn is dispatched. */
30
+ idle(method: string, params: Record<string, unknown>): void;
31
+ /** Counts a notification method this humanish does not know that carried no item. */
32
+ recordUnknown(method: string): void;
33
+ /**
34
+ * A policy refusal: stops this request with `code`, and the session records it when the
35
+ * request already stopped for another reason, such as a close.
36
+ */
37
+ refuse(code: RestrictedCodexAnalysisErrorCode): void;
26
38
  }
27
39
  /**
28
- * Drain: every notification and tool request of one turn. Nothing is handled before `dispatched`;
29
- * events that arrive before turn/start's reply wait until acknowledge() and are then checked in
30
- * order. `finished` resolves only with a completed, validated final answer.
40
+ * Drain: every notification and tool request of one turn. Before `dispatched`, notifications go
41
+ * to the session's idle handler; events that arrive after dispatch but before turn/start's reply
42
+ * pass the item policy at once, then wait until acknowledge() and are checked in order.
43
+ * `finished` resolves only with a completed, validated final answer.
31
44
  */
32
45
  export declare class RestrictedCodexTurn {
33
46
  private readonly context;
@@ -53,6 +66,8 @@ export declare class RestrictedCodexTurn {
53
66
  acknowledge(returnedTurnId: unknown): void;
54
67
  readonly onNotification: RestrictedCodexTransport["onNotification"];
55
68
  readonly onRequest: NonNullable<RestrictedCodexTransport["onRequest"]>;
69
+ /** Refuses a tool request: the session records the refusal, and the transport answers it. */
70
+ private refuseRequest;
56
71
  readonly onRequestComplete: () => void;
57
72
  private handleTurnEvent;
58
73
  private recordUsage;