humanish 0.106.0 → 0.107.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 (459) hide show
  1. package/AGENTS.md +4 -2
  2. package/ARCHITECTURE.md +17 -16
  3. package/CHANGELOG.md +24 -0
  4. package/CONTEXT.md +42 -39
  5. package/CONTRIBUTING.md +8 -6
  6. package/README.md +8 -3
  7. package/dist/actors/codex/app-server-client.js +2 -1
  8. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  9. package/dist/actors/codex/app-server-trace.js +1 -3
  10. package/dist/actors/codex/app-server.js +2 -1
  11. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  12. package/dist/actors/codex/protocol-compat.js +357 -0
  13. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  14. package/dist/actors/codex/protocol-contract.js +471 -0
  15. package/dist/actors/codex/qualified-versions.d.ts +31 -4
  16. package/dist/actors/codex/qualified-versions.js +51 -6
  17. package/dist/actors/codex/restricted-executable.d.ts +24 -0
  18. package/dist/actors/codex/restricted-executable.js +97 -22
  19. package/dist/actors/codex/restricted-launch.d.ts +7 -1
  20. package/dist/actors/codex/restricted-launch.js +42 -3
  21. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  22. package/dist/actors/codex/restricted-notifications.js +277 -0
  23. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  24. package/dist/actors/codex/restricted-participant.js +60 -2
  25. package/dist/actors/codex/restricted-policy.d.ts +9 -1
  26. package/dist/actors/codex/restricted-session.d.ts +14 -1
  27. package/dist/actors/codex/restricted-session.js +50 -17
  28. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  29. package/dist/actors/codex/restricted-transport.js +139 -27
  30. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  31. package/dist/actors/codex/restricted-turn.js +43 -30
  32. package/dist/actors/computer-use/actor.d.ts +1 -1
  33. package/dist/actors/computer-use/actor.js +4 -4
  34. package/dist/actors/computer-use/loop/backstop.js +1 -1
  35. package/dist/actors/computer-use/loop/ending.d.ts +2 -2
  36. package/dist/actors/computer-use/loop/ending.js +2 -2
  37. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  38. package/dist/actors/computer-use/loop/spend.js +3 -3
  39. package/dist/actors/computer-use/loop/trace.js +2 -2
  40. package/dist/actors/computer-use/loop/types.d.ts +14 -5
  41. package/dist/actors/computer-use/loop.js +4 -4
  42. package/dist/actors/computer-use/openai-provider.d.ts +1 -1
  43. package/dist/actors/computer-use/openai-provider.js +2 -2
  44. package/dist/actors/contract.d.ts +10 -8
  45. package/dist/actors/contract.js +7 -1
  46. package/dist/actors/local-agent/cli.js +1 -1
  47. package/dist/actors/scripted-browser/actor.d.ts +2 -2
  48. package/dist/actors/scripted-browser/journey.js +15 -4
  49. package/dist/actors/scripted-browser/steps.js +18 -0
  50. package/dist/actors/scripted-browser/types.d.ts +11 -1
  51. package/dist/actors/stop-conditions.js +1 -3
  52. package/dist/analysis/automatic-completion.d.ts +13 -8
  53. package/dist/analysis/automatic-completion.js +14 -8
  54. package/dist/analysis/automatic-config.d.ts +1 -1
  55. package/dist/analysis/automatic-config.js +2 -2
  56. package/dist/analysis/automatic.d.ts +10 -4
  57. package/dist/analysis/automatic.js +17 -13
  58. package/dist/analysis/diagnostics.d.ts +23 -0
  59. package/dist/analysis/diagnostics.js +112 -0
  60. package/dist/analysis/evidence-sources.js +2 -2
  61. package/dist/analysis/evidence.js +6 -6
  62. package/dist/analysis/execute.d.ts +7 -1
  63. package/dist/analysis/execute.js +39 -12
  64. package/dist/analysis/job.d.ts +8 -5
  65. package/dist/analysis/job.js +15 -14
  66. package/dist/analysis/load.d.ts +1 -1
  67. package/dist/analysis/load.js +5 -5
  68. package/dist/analysis/provider.d.ts +9 -1
  69. package/dist/analysis/restricted-codex.d.ts +2 -0
  70. package/dist/analysis/restricted-codex.js +10 -1
  71. package/dist/analysis/service.d.ts +2 -0
  72. package/dist/analysis/service.js +31 -12
  73. package/dist/analysis/sharing.d.ts +2 -2
  74. package/dist/analysis/sharing.js +5 -5
  75. package/dist/analysis/store-executions.d.ts +5 -5
  76. package/dist/analysis/store-executions.js +12 -12
  77. package/dist/analysis/store.d.ts +4 -4
  78. package/dist/analysis/store.js +13 -13
  79. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  80. package/dist/cli/commands/analysis-signals.js +4 -1
  81. package/dist/cli/commands/analyze.js +4 -2
  82. package/dist/cli/commands/comms.js +8 -1
  83. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  84. package/dist/cli/commands/lab-route-computer-use.js +26 -14
  85. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  86. package/dist/cli/commands/lab-route-preview.js +3 -4
  87. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  88. package/dist/cli/commands/lab-route-run.js +6 -2
  89. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  90. package/dist/cli/commands/lab-route-scripted.js +0 -1
  91. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  92. package/dist/cli/commands/lab-route-shared-world.js +0 -1
  93. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  94. package/dist/cli/commands/lab-route-terminal.js +0 -1
  95. package/dist/cli/commands/lab-run.js +76 -45
  96. package/dist/cli/commands/lab-scorer.d.ts +0 -2
  97. package/dist/cli/commands/lab.js +12 -6
  98. package/dist/cli/commands/observe.js +22 -0
  99. package/dist/cli/commands/run-signals.d.ts +30 -0
  100. package/dist/cli/commands/run-signals.js +146 -0
  101. package/dist/cli/commands/runs.js +10 -8
  102. package/dist/cli/commands/watch.js +12 -10
  103. package/dist/cli/doctor.d.ts +3 -0
  104. package/dist/cli/doctor.js +10 -2
  105. package/dist/cli/io.d.ts +5 -4
  106. package/dist/cli/io.js +12 -8
  107. package/dist/cli/program.js +3 -3
  108. package/dist/cli/renamed-options.d.ts +11 -0
  109. package/dist/cli/renamed-options.js +18 -0
  110. package/dist/cli/telemetry.d.ts +2 -2
  111. package/dist/cli/telemetry.js +1 -1
  112. package/dist/comms/capture-surface.d.ts +1 -1
  113. package/dist/comms/catch-host.d.ts +1 -1
  114. package/dist/comms/connections.js +4 -4
  115. package/dist/comms/external-evidence.d.ts +27 -0
  116. package/dist/comms/external-evidence.js +93 -0
  117. package/dist/comms/lease-store.js +7 -7
  118. package/dist/comms/types.js +1 -1
  119. package/dist/evidence/browser-hygiene.d.ts +1 -1
  120. package/dist/evidence/browser-hygiene.js +1 -1
  121. package/dist/evidence/redaction.js +1 -1
  122. package/dist/evidence/secret-scrub.d.ts +9 -0
  123. package/dist/evidence/secret-scrub.js +96 -0
  124. package/dist/feedback/draft.js +7 -9
  125. package/dist/feedback/export-bundle.js +4 -4
  126. package/dist/feedback/export.js +9 -9
  127. package/dist/feedback/feedback.d.ts +1 -1
  128. package/dist/index.d.ts +3 -6
  129. package/dist/index.js +3 -6
  130. package/dist/keys/key-resolution.d.ts +3 -1
  131. package/dist/keys/key-resolution.js +18 -16
  132. package/dist/lab/adapter-extension.d.ts +28 -6
  133. package/dist/lab/adapter-extension.js +65 -126
  134. package/dist/lab/adapter-scorer-loader.d.ts +25 -5
  135. package/dist/lab/adapter-scorer-loader.js +24 -0
  136. package/dist/lab/composition-rules.d.ts +2 -0
  137. package/dist/lab/composition-rules.js +35 -26
  138. package/dist/lab/config.js +28 -26
  139. package/dist/lab/device-presets.d.ts +2 -2
  140. package/dist/lab/discover.js +1 -3
  141. package/dist/lab/doctor.d.ts +44 -9
  142. package/dist/lab/doctor.js +149 -41
  143. package/dist/lab/init-plan.js +1 -3
  144. package/dist/lab/keys.js +1 -1
  145. package/dist/lab/lab-deps.d.ts +85 -0
  146. package/dist/lab/lab-deps.js +4 -0
  147. package/dist/lab/parse/actors.js +8 -7
  148. package/dist/lab/parse/comms.js +3 -2
  149. package/dist/lab/parse/execution.js +3 -2
  150. package/dist/lab/parse/subject-state.js +2 -1
  151. package/dist/lab/parse/subject.js +2 -1
  152. package/dist/lab/parse/values.d.ts +0 -1
  153. package/dist/lab/parse/values.js +0 -3
  154. package/dist/lab/persona-resolve.d.ts +3 -3
  155. package/dist/lab/persona-resolve.js +4 -4
  156. package/dist/lab/persona.js +1 -3
  157. package/dist/lab/plan-base.d.ts +6 -2
  158. package/dist/lab/plan-base.js +22 -7
  159. package/dist/lab/plan-participants.d.ts +5 -5
  160. package/dist/lab/plan-participants.js +2 -2
  161. package/dist/lab/plan-types.d.ts +33 -7
  162. package/dist/lab/plan.d.ts +3 -11
  163. package/dist/lab/plan.js +18 -42
  164. package/dist/lab/preflight-result.js +0 -2
  165. package/dist/lab/preflight.d.ts +0 -3
  166. package/dist/lab/preflight.js +1 -1
  167. package/dist/lab/requirements.d.ts +20 -0
  168. package/dist/lab/requirements.js +54 -0
  169. package/dist/lab/route-inputs.d.ts +23 -12
  170. package/dist/lab/route-inputs.js +48 -51
  171. package/dist/lab/routing.d.ts +19 -24
  172. package/dist/lab/routing.js +14 -47
  173. package/dist/lab/run-lab-events.d.ts +6 -11
  174. package/dist/lab/run-lab-events.js +3 -11
  175. package/dist/lab/run-lab-homes.d.ts +64 -0
  176. package/dist/lab/run-lab-homes.js +3 -0
  177. package/dist/lab/run-lab-options.d.ts +12 -66
  178. package/dist/lab/run-lab-options.js +45 -275
  179. package/dist/lab/summary.d.ts +9 -4
  180. package/dist/lab/summary.js +15 -8
  181. package/dist/lab/types.d.ts +132 -132
  182. package/dist/lab/validation.d.ts +15 -15
  183. package/dist/lab/validation.js +28 -28
  184. package/dist/lab/warnings.js +20 -19
  185. package/dist/observer/artifact.d.ts +1 -1
  186. package/dist/observer/artifact.js +3 -3
  187. package/dist/observer/data.js +2 -2
  188. package/dist/observer/render.js +2 -2
  189. package/dist/observer/run-routes.d.ts +1 -1
  190. package/dist/observer/run-routes.js +5 -5
  191. package/dist/observer/serve.d.ts +17 -0
  192. package/dist/observer/serve.js +34 -3
  193. package/dist/observer-app.html +1 -1
  194. package/dist/routes/computer-use/bundle-parts.d.ts +1 -1
  195. package/dist/routes/computer-use/bundle-parts.js +10 -3
  196. package/dist/routes/computer-use/bundle.d.ts +4 -11
  197. package/dist/routes/computer-use/bundle.js +9 -15
  198. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  199. package/dist/routes/computer-use/diagnostics.js +1 -1
  200. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +10 -10
  201. package/dist/routes/computer-use/e2b-desktop/comms.js +11 -14
  202. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  203. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -7
  204. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +13 -13
  205. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -11
  206. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  207. package/dist/routes/computer-use/e2b-desktop/prepare.js +33 -36
  208. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  209. package/dist/routes/computer-use/e2b-desktop/start.js +24 -23
  210. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  211. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  212. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  213. package/dist/routes/computer-use/e2b-desktop/teardown.js +29 -17
  214. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  215. package/dist/routes/computer-use/external-comms.js +19 -43
  216. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  217. package/dist/routes/computer-use/fanout-bundle.js +25 -29
  218. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +25 -19
  219. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  220. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  221. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  222. package/dist/routes/computer-use/live-flush.js +19 -27
  223. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +14 -13
  224. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  225. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  226. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  227. package/dist/routes/computer-use/local-vm.js +39 -66
  228. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  229. package/dist/routes/computer-use/participant-desktop.js +5 -25
  230. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +10 -10
  231. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +35 -22
  232. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  233. package/dist/routes/computer-use/participant-facts.js +12 -1
  234. package/dist/routes/computer-use/participant-model.d.ts +19 -11
  235. package/dist/routes/computer-use/participant-model.js +58 -33
  236. package/dist/routes/computer-use/participant-prompt.d.ts +3 -3
  237. package/dist/routes/computer-use/participant-prompt.js +4 -4
  238. package/dist/routes/computer-use/participant-runs.d.ts +6 -6
  239. package/dist/routes/computer-use/participant-runs.js +8 -8
  240. package/dist/routes/computer-use/plan.d.ts +21 -29
  241. package/dist/routes/computer-use/plan.js +59 -65
  242. package/dist/routes/computer-use/preflight.d.ts +6 -11
  243. package/dist/routes/computer-use/preflight.js +26 -18
  244. package/dist/routes/computer-use/rerun-selection.js +10 -6
  245. package/dist/routes/computer-use/result.d.ts +1 -1
  246. package/dist/routes/computer-use/result.js +40 -30
  247. package/dist/routes/computer-use/route.d.ts +3 -4
  248. package/dist/routes/computer-use/route.js +21 -19
  249. package/dist/routes/computer-use/self-report.d.ts +2 -2
  250. package/dist/routes/computer-use/self-report.js +4 -4
  251. package/dist/routes/computer-use/setup.d.ts +8 -17
  252. package/dist/routes/computer-use/setup.js +98 -86
  253. package/dist/routes/computer-use/single-bundle.d.ts +8 -11
  254. package/dist/routes/computer-use/single-bundle.js +20 -25
  255. package/dist/routes/computer-use/subject-projection.d.ts +5 -7
  256. package/dist/routes/computer-use/subject-projection.js +20 -19
  257. package/dist/routes/computer-use/types.d.ts +169 -211
  258. package/dist/routes/computer-use/types.js +13 -6
  259. package/dist/routes/preview.js +0 -1
  260. package/dist/routes/scripted/bundle.d.ts +3 -6
  261. package/dist/routes/scripted/bundle.js +11 -16
  262. package/dist/routes/scripted/plan.d.ts +5 -7
  263. package/dist/routes/scripted/plan.js +6 -4
  264. package/dist/routes/scripted/result.d.ts +4 -1
  265. package/dist/routes/scripted/result.js +10 -6
  266. package/dist/routes/scripted/route.js +10 -11
  267. package/dist/routes/scripted/scenario.d.ts +1 -1
  268. package/dist/routes/scripted/scenario.js +1 -1
  269. package/dist/routes/scripted/setup.d.ts +3 -2
  270. package/dist/routes/scripted/setup.js +22 -21
  271. package/dist/routes/scripted/subject.d.ts +8 -3
  272. package/dist/routes/scripted/subject.js +11 -6
  273. package/dist/routes/scripted/surface-records.js +1 -1
  274. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  275. package/dist/routes/scripted/surface-sessions.js +4 -4
  276. package/dist/routes/scripted/types.d.ts +19 -36
  277. package/dist/routes/scripted/types.js +1 -2
  278. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +8 -8
  279. package/dist/routes/shared-world/bundle.d.ts +2 -2
  280. package/dist/routes/shared-world/bundle.js +22 -26
  281. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  282. package/dist/routes/shared-world/checkpoints.js +4 -4
  283. package/dist/routes/shared-world/comms.d.ts +5 -4
  284. package/dist/routes/shared-world/comms.js +28 -41
  285. package/dist/routes/shared-world/external-public.d.ts +5 -5
  286. package/dist/routes/shared-world/external-public.js +19 -20
  287. package/dist/routes/shared-world/handoff.d.ts +4 -4
  288. package/dist/routes/shared-world/handoff.js +50 -50
  289. package/dist/routes/shared-world/lobby-code.d.ts +5 -5
  290. package/dist/routes/shared-world/lobby-code.js +13 -13
  291. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +8 -6
  292. package/dist/routes/shared-world/{seats.js → participant-specs.js} +46 -51
  293. package/dist/routes/shared-world/plan.d.ts +2 -6
  294. package/dist/routes/shared-world/plan.js +1 -2
  295. package/dist/routes/shared-world/provenance.d.ts +4 -4
  296. package/dist/routes/shared-world/provenance.js +4 -4
  297. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  298. package/dist/routes/shared-world/provisioned.js +48 -41
  299. package/dist/routes/shared-world/result.js +31 -19
  300. package/dist/routes/shared-world/route.js +37 -41
  301. package/dist/routes/shared-world/setup.d.ts +5 -4
  302. package/dist/routes/shared-world/setup.js +12 -14
  303. package/dist/routes/shared-world/types.d.ts +53 -126
  304. package/dist/routes/shared-world/types.js +2 -2
  305. package/dist/routes/terminal/adapter.d.ts +8 -8
  306. package/dist/routes/terminal/adapter.js +28 -125
  307. package/dist/routes/terminal/bundle.d.ts +7 -12
  308. package/dist/routes/terminal/bundle.js +24 -34
  309. package/dist/routes/terminal/credentials.d.ts +2 -2
  310. package/dist/routes/terminal/credentials.js +16 -16
  311. package/dist/routes/terminal/dry-run.d.ts +1 -1
  312. package/dist/routes/terminal/dry-run.js +9 -11
  313. package/dist/routes/terminal/encoding.d.ts +1 -1
  314. package/dist/routes/terminal/encoding.js +2 -2
  315. package/dist/routes/terminal/ledger.d.ts +6 -6
  316. package/dist/routes/terminal/ledger.js +9 -9
  317. package/dist/routes/terminal/live-finish.d.ts +1 -2
  318. package/dist/routes/terminal/live-finish.js +21 -20
  319. package/dist/routes/terminal/live-sandbox.d.ts +4 -2
  320. package/dist/routes/terminal/live-sandbox.js +25 -21
  321. package/dist/routes/terminal/participant-text.d.ts +23 -0
  322. package/dist/routes/terminal/participant-text.js +165 -0
  323. package/dist/routes/terminal/plan.d.ts +2 -6
  324. package/dist/routes/terminal/plan.js +13 -9
  325. package/dist/routes/terminal/recorder.d.ts +6 -1
  326. package/dist/routes/terminal/recorder.js +12 -4
  327. package/dist/routes/terminal/result.js +4 -4
  328. package/dist/routes/terminal/route.js +26 -26
  329. package/dist/routes/terminal/runtime.d.ts +3 -2
  330. package/dist/routes/terminal/runtime.js +3 -3
  331. package/dist/routes/terminal/sandbox.d.ts +5 -3
  332. package/dist/routes/terminal/sandbox.js +13 -16
  333. package/dist/routes/terminal/session.js +16 -14
  334. package/dist/routes/terminal/token-usage.js +5 -5
  335. package/dist/routes/terminal/trace.d.ts +5 -8
  336. package/dist/routes/terminal/trace.js +9 -64
  337. package/dist/routes/terminal/types.d.ts +85 -93
  338. package/dist/routes/terminal/types.js +9 -4
  339. package/dist/run/active-runs.d.ts +13 -0
  340. package/dist/run/active-runs.js +12 -0
  341. package/dist/run/bundle-shape.d.ts +2 -1
  342. package/dist/run/bundle-shape.js +4 -4
  343. package/dist/run/bundle.d.ts +63 -56
  344. package/dist/run/bundle.js +9 -8
  345. package/dist/run/cost-summary.js +3 -2
  346. package/dist/run/costs.d.ts +6 -6
  347. package/dist/run/costs.js +10 -10
  348. package/dist/run/detail.d.ts +5 -5
  349. package/dist/run/detail.js +6 -6
  350. package/dist/run/dry-run.js +5 -12
  351. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  352. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  353. package/dist/run/feedback-shape.js +1 -1
  354. package/dist/run/judge.d.ts +16 -4
  355. package/dist/run/judge.js +24 -7
  356. package/dist/run/locate.d.ts +2 -0
  357. package/dist/run/locate.js +3 -1
  358. package/dist/run/outcomes.d.ts +3 -3
  359. package/dist/run/outcomes.js +3 -3
  360. package/dist/run/participant-records.d.ts +2 -2
  361. package/dist/run/participant-records.js +2 -2
  362. package/dist/run/paths.js +1 -1
  363. package/dist/run/pricing.d.ts +19 -9
  364. package/dist/run/pricing.js +30 -18
  365. package/dist/run/projection.d.ts +13 -13
  366. package/dist/run/projection.js +8 -8
  367. package/dist/run/reclaim.d.ts +7 -1
  368. package/dist/run/reclaim.js +24 -4
  369. package/dist/run/results.d.ts +1 -1
  370. package/dist/run/run-index.d.ts +1 -1
  371. package/dist/run/run-index.js +11 -11
  372. package/dist/run/run.d.ts +4 -2
  373. package/dist/run/run.js +9 -5
  374. package/dist/run/sandbox-receipts.d.ts +4 -4
  375. package/dist/run/sandbox-receipts.js +4 -4
  376. package/dist/run/shared-world-evidence.d.ts +47 -47
  377. package/dist/run/shared-world-shape.d.ts +3 -3
  378. package/dist/run/shared-world-shape.js +11 -11
  379. package/dist/run/stats.d.ts +5 -5
  380. package/dist/run/stats.js +8 -8
  381. package/dist/run/status.d.ts +16 -6
  382. package/dist/run/status.js +31 -8
  383. package/dist/run/streams.d.ts +26 -19
  384. package/dist/run/terminal-contract.d.ts +5 -5
  385. package/dist/run/terminal-contract.js +4 -4
  386. package/dist/run/transient-comms-secrets.d.ts +5 -0
  387. package/dist/run/transient-comms-secrets.js +12 -0
  388. package/dist/run-lab.d.ts +36 -34
  389. package/dist/run-lab.js +41 -37
  390. package/dist/subject/desktop-cli.d.ts +1 -1
  391. package/dist/subject/desktop-cli.js +1 -1
  392. package/dist/subject/local-tree-archive.d.ts +1 -1
  393. package/dist/subject/local-tree-archive.js +4 -4
  394. package/dist/subject/local-tree.d.ts +2 -2
  395. package/dist/subject/local-tree.js +1 -1
  396. package/dist/subject/node-bootstrap.d.ts +1 -1
  397. package/dist/subject/node-bootstrap.js +4 -4
  398. package/dist/subject/runtime.js +5 -5
  399. package/dist/subject/serve.js +1 -1
  400. package/dist/subject/steps.d.ts +4 -4
  401. package/dist/subject/steps.js +5 -5
  402. package/dist/substrates/desktop-session.d.ts +2 -0
  403. package/dist/substrates/e2b/cdp-probe.d.ts +2 -2
  404. package/dist/substrates/e2b/cdp-probe.js +1 -1
  405. package/dist/substrates/e2b/desktop-browser.d.ts +3 -3
  406. package/dist/substrates/e2b/desktop-browser.js +4 -4
  407. package/dist/substrates/e2b/desktop-cdp.d.ts +7 -7
  408. package/dist/substrates/e2b/desktop-cdp.js +4 -4
  409. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  410. package/dist/substrates/e2b/desktop-geometry.js +3 -3
  411. package/dist/substrates/e2b/desktop-media.js +2 -2
  412. package/dist/substrates/e2b/sandbox.d.ts +2 -0
  413. package/dist/substrates/e2b/sandbox.js +22 -8
  414. package/dist/substrates/e2b/sdk.d.ts +12 -1
  415. package/dist/substrates/e2b/sdk.js +30 -9
  416. package/dist/substrates/local/runtime-host.d.ts +2 -0
  417. package/dist/substrates/local/runtime-host.js +6 -0
  418. package/dist/tui/actions.d.ts +7 -5
  419. package/dist/tui/actions.js +18 -9
  420. package/dist/tui-app.js +42 -42
  421. package/dist/verify/actor.d.ts +10 -10
  422. package/dist/verify/actor.js +15 -15
  423. package/dist/verify/artifacts.d.ts +1 -1
  424. package/dist/verify/artifacts.js +3 -3
  425. package/dist/verify/costs.d.ts +2 -2
  426. package/dist/verify/costs.js +2 -2
  427. package/dist/verify/liveness.d.ts +1 -1
  428. package/dist/verify/liveness.js +4 -1
  429. package/dist/verify/rerun.d.ts +1 -1
  430. package/dist/verify/rerun.js +1 -1
  431. package/dist/verify/shared-world.js +2 -2
  432. package/dist/verify/verify.js +6 -6
  433. package/docs/README.md +1 -1
  434. package/docs/architecture/actor-contract.md +60 -22
  435. package/docs/architecture/desktop-sessions.md +9 -9
  436. package/docs/architecture/external-public-shared-world.md +5 -0
  437. package/docs/architecture/observer.md +4 -4
  438. package/docs/architecture/restricted-codex-analysis.md +40 -4
  439. package/docs/architecture/state-driven-executor.md +4 -5
  440. package/docs/architecture/task-protocol-support.md +3 -5
  441. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +24 -16
  442. package/docs/contracts/run-bundle.md +10 -8
  443. package/docs/contracts/schemas.md +109 -53
  444. package/docs/contracts/study-analysis.md +24 -0
  445. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  446. package/docs/product/automatic-analysis.md +1 -0
  447. package/docs/ramp/README.md +2 -1
  448. package/package.json +4 -4
  449. package/skills/humanish/SKILL.md +3 -2
  450. package/skills/humanish/agents/openai.yaml +1 -1
  451. package/dist/deprecated.d.ts +0 -90
  452. package/dist/deprecated.js +0 -106
  453. package/dist/lab/bag-overrides.d.ts +0 -18
  454. package/dist/lab/bag-overrides.js +0 -121
  455. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  456. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  457. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  458. /package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +0 -0
  459. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -0,0 +1,471 @@
1
+ // The app-server protocol humanish depends on: each method it calls with the fields and values it
2
+ // sends and the response fields it reads, each notification and server request it consumes, and
3
+ // the containers its item policy reads in every notification. protocol-compat.ts checks a
4
+ // release's generated schema against this table on every launch.
5
+ //
6
+ // Types and known values are the baseline of every release this humanish admits. A read rule's
7
+ // `expects` lists the values humanish compares against; one a release no longer allows refuses
8
+ // the launch. `known` lists every string value the baseline offers; one beyond it is recorded and
9
+ // the launch goes on. Values humanish only refuses (an asynchronous delivery, a raw item type it
10
+ // allows but does not need) are `known`, since their removal cannot make humanish accept more.
11
+ const S = ["string"];
12
+ const B = ["boolean"];
13
+ const I = ["integer"];
14
+ const A = ["array"];
15
+ const O = ["object"];
16
+ const orNull = (types) => [
17
+ ...types,
18
+ "null",
19
+ ];
20
+ const sent = (path, sends, ...expects) => (expects.length === 0 ? { path, sends } : { path, sends, expects });
21
+ const object = (path, fields) => ({
22
+ path,
23
+ sends: O,
24
+ fields,
25
+ });
26
+ const scope = [
27
+ { path: "threadId", types: S },
28
+ { path: "turnId", types: S },
29
+ ];
30
+ /** ThreadItem types in the baseline; humanish admits five and refuses the rest. */
31
+ const THREAD_ITEM_TYPES = [
32
+ "userMessage",
33
+ "hookPrompt",
34
+ "agentMessage",
35
+ "functionCallOutput",
36
+ "plan",
37
+ "reasoning",
38
+ "commandExecution",
39
+ "fileChange",
40
+ "mcpToolCall",
41
+ "dynamicToolCall",
42
+ "collabAgentToolCall",
43
+ "subAgentActivity",
44
+ "webSearch",
45
+ "imageView",
46
+ "sleep",
47
+ "imageGeneration",
48
+ "enteredReviewMode",
49
+ "exitedReviewMode",
50
+ "contextCompaction",
51
+ ];
52
+ /** ResponseItem types in the baseline (rawResponseItem/completed). */
53
+ const RAW_ITEM_TYPES = [
54
+ "message",
55
+ "agent_message",
56
+ "reasoning",
57
+ "local_shell_call",
58
+ "function_call",
59
+ "tool_search_call",
60
+ "function_call_output",
61
+ "custom_tool_call",
62
+ "custom_tool_call_output",
63
+ "tool_search_output",
64
+ "web_search_call",
65
+ "image_generation_call",
66
+ "compaction",
67
+ "configuration_update",
68
+ "compaction_trigger",
69
+ "context_compaction",
70
+ "other",
71
+ ];
72
+ const APPROVAL_POLICIES = ["untrusted", "on-request", "never"];
73
+ const itemType = {
74
+ path: "item.type",
75
+ types: S,
76
+ expects: ["userMessage", "agentMessage", "reasoning", "contextCompaction", "dynamicToolCall"],
77
+ known: THREAD_ITEM_TYPES,
78
+ };
79
+ /** What the tool policy reads on both item notifications; it refuses on a value, not an absence. */
80
+ const agentMessageRefusals = [
81
+ { path: "item.{type=agentMessage}.delivery", types: orNull(S), known: ["async"], optional: true },
82
+ { path: "item.{type=agentMessage}.questions", types: orNull(A), optional: true },
83
+ ];
84
+ const dynamicTool = (status, others) => [
85
+ { path: "item.{type=dynamicToolCall}.tool", types: S },
86
+ { path: "item.{type=dynamicToolCall}.namespace", types: orNull(S), expects: [null] },
87
+ { path: "item.{type=dynamicToolCall}.status", types: S, expects: [status], known: others },
88
+ ];
89
+ /** item/started: the type, the tool policy and a started tool call (restricted-turn.ts admitsItem). */
90
+ const startedReads = [
91
+ ...scope,
92
+ itemType,
93
+ ...agentMessageRefusals,
94
+ ...dynamicTool("inProgress", ["completed", "failed"]),
95
+ ];
96
+ /** item/completed adds the answer's shape and a finished tool call. */
97
+ const completedReads = [
98
+ ...scope,
99
+ itemType,
100
+ ...agentMessageRefusals,
101
+ { path: "item.{type=agentMessage}.id", types: S },
102
+ { path: "item.{type=agentMessage}.text", types: S },
103
+ {
104
+ path: "item.{type=agentMessage}.phase",
105
+ types: orNull(S),
106
+ expects: [null, "final_answer", "commentary"],
107
+ known: [],
108
+ },
109
+ ...dynamicTool("completed", ["inProgress", "failed"]),
110
+ { path: "item.{type=dynamicToolCall}.success", types: orNull(B), expects: [true] },
111
+ ];
112
+ /** initialize, config/read and account/read: what the launch handshake sends and reads. */
113
+ function handshakeRequests(host) {
114
+ const effort = host.reasoningEffort;
115
+ return [
116
+ {
117
+ method: "initialize",
118
+ params: [
119
+ object("", ["clientInfo", "capabilities"]),
120
+ object("clientInfo", ["name", "version"]),
121
+ sent("clientInfo.name", S),
122
+ sent("clientInfo.version", S),
123
+ object("capabilities", ["experimentalApi"]),
124
+ sent("capabilities.experimentalApi", B, true),
125
+ ],
126
+ response: {
127
+ definition: "InitializeResponse",
128
+ reads: [
129
+ { path: "userAgent", types: S },
130
+ { path: "codexHome", types: S },
131
+ {
132
+ path: "platformOs",
133
+ types: S,
134
+ expects: [host.platform === "darwin" ? "macos" : "linux"],
135
+ },
136
+ { path: "platformFamily", types: S, expects: ["unix"] },
137
+ ],
138
+ },
139
+ },
140
+ {
141
+ method: "config/read",
142
+ params: [
143
+ object("", ["includeLayers", "cwd"]),
144
+ sent("includeLayers", B, true),
145
+ sent("cwd", S),
146
+ ],
147
+ response: {
148
+ definition: "ConfigReadResponse",
149
+ reads: [
150
+ { path: "layers", types: orNull(A) },
151
+ {
152
+ path: "layers[].name.type",
153
+ types: S,
154
+ expects: ["user", "system"],
155
+ known: [
156
+ "packagedDefaults",
157
+ "mdm",
158
+ "enterpriseManaged",
159
+ "project",
160
+ "sessionFlags",
161
+ "legacyManagedConfigTomlFromFile",
162
+ "legacyManagedConfigTomlFromMdm",
163
+ ],
164
+ },
165
+ // admitsRestrictedCodexConfig reads the file and profile of the user layer only.
166
+ { path: "layers[].name.{type=user}.file", types: S },
167
+ { path: "layers[].name.{type=user}.profile", types: orNull(S), expects: [null] },
168
+ { path: "layers[].disabledReason", types: orNull(S), expects: [null] },
169
+ // A system layer must be empty (admitsRestrictedCodexConfig).
170
+ { path: "layers[].config" },
171
+ { path: "config", types: O },
172
+ { path: "config.model", types: orNull(S) },
173
+ { path: "config.model_provider", types: orNull(S), expects: ["openai"] },
174
+ { path: "config.model_reasoning_effort", types: orNull(S), expects: [effort] },
175
+ {
176
+ path: "config.forced_login_method",
177
+ types: orNull(S),
178
+ expects: ["chatgpt"],
179
+ known: ["api"],
180
+ },
181
+ {
182
+ path: "config.sandbox_mode",
183
+ types: orNull(S),
184
+ expects: ["read-only"],
185
+ known: ["workspace-write", "danger-full-access"],
186
+ },
187
+ {
188
+ path: "config.approval_policy",
189
+ types: ["string", "object", "null"],
190
+ expects: ["never"],
191
+ known: APPROVAL_POLICIES,
192
+ },
193
+ {
194
+ path: "config.web_search",
195
+ types: orNull(S),
196
+ expects: ["disabled"],
197
+ known: ["cached", "indexed", "live"],
198
+ },
199
+ { path: "config.analytics", types: orNull(O) },
200
+ { path: "config.analytics.enabled", types: orNull(B), expects: [false] },
201
+ ],
202
+ },
203
+ },
204
+ {
205
+ method: "account/read",
206
+ params: [object("", ["refreshToken"]), sent("refreshToken", B, false)],
207
+ response: {
208
+ definition: "GetAccountResponse",
209
+ reads: [
210
+ { path: "account", types: orNull(O), expects: [null] },
211
+ {
212
+ path: "account.type",
213
+ types: S,
214
+ expects: ["chatgpt", "apiKey"],
215
+ known: ["amazonBedrock"],
216
+ },
217
+ { path: "requiresOpenaiAuth", types: B, expects: [true] },
218
+ ],
219
+ },
220
+ },
221
+ ];
222
+ }
223
+ /** thread/start, mcpServerStatus/list, turn/start and turn/interrupt. */
224
+ function threadRequests(host) {
225
+ const effort = host.reasoningEffort;
226
+ return [
227
+ {
228
+ method: "thread/start",
229
+ params: [
230
+ object("", [
231
+ "cwd",
232
+ "ephemeral",
233
+ "experimentalRawEvents",
234
+ "approvalPolicy",
235
+ "sandbox",
236
+ "model",
237
+ "modelProvider",
238
+ "allowProviderModelFallback",
239
+ "environments",
240
+ "runtimeWorkspaceRoots",
241
+ "dynamicTools",
242
+ "baseInstructions",
243
+ "config",
244
+ ]),
245
+ sent("cwd", S),
246
+ sent("ephemeral", B, true),
247
+ sent("experimentalRawEvents", B, true),
248
+ sent("approvalPolicy", S, "never"),
249
+ sent("sandbox", S, "read-only"),
250
+ sent("model", S),
251
+ sent("modelProvider", S, "openai"),
252
+ sent("allowProviderModelFallback", B, false),
253
+ sent("environments", A),
254
+ sent("runtimeWorkspaceRoots", A),
255
+ sent("dynamicTools", A),
256
+ sent("dynamicTools[].type", S, "function"),
257
+ object("dynamicTools[].{type=function}", ["type", "name", "description", "inputSchema"]),
258
+ sent("dynamicTools[].{type=function}.name", S),
259
+ sent("dynamicTools[].{type=function}.description", S),
260
+ sent("dynamicTools[].{type=function}.inputSchema", O),
261
+ sent("baseInstructions", S),
262
+ sent("config", O),
263
+ ],
264
+ response: {
265
+ definition: "ThreadStartResponse",
266
+ reads: [
267
+ { path: "thread.id", types: S },
268
+ { path: "thread.ephemeral", types: B, expects: [true] },
269
+ { path: "thread.model", types: orNull(S) },
270
+ { path: "thread.modelProvider", types: S, expects: ["openai"] },
271
+ { path: "thread.reasoningEffort", types: orNull(S), expects: [effort] },
272
+ { path: "thread.cliVersion", types: S },
273
+ { path: "thread.environments", types: orNull(A) },
274
+ { path: "thread.path", types: orNull(S), expects: [null] },
275
+ { path: "thread.cwd", types: S },
276
+ { path: "model", types: S },
277
+ { path: "modelProvider", types: S, expects: ["openai"] },
278
+ { path: "reasoningEffort", types: orNull(S), expects: [effort] },
279
+ { path: "cwd", types: S },
280
+ {
281
+ path: "approvalPolicy",
282
+ types: ["string", "object"],
283
+ expects: ["never"],
284
+ known: APPROVAL_POLICIES,
285
+ },
286
+ {
287
+ path: "sandbox.type",
288
+ types: S,
289
+ expects: ["readOnly"],
290
+ known: ["dangerFullAccess", "externalSandbox", "workspaceWrite"],
291
+ },
292
+ { path: "sandbox.{type=readOnly}.networkAccess", types: B, expects: [false] },
293
+ { path: "instructionSources", types: A },
294
+ { path: "runtimeWorkspaceRoots", types: A },
295
+ ],
296
+ },
297
+ },
298
+ {
299
+ method: "mcpServerStatus/list",
300
+ params: [object("", ["limit"]), sent("limit", I)],
301
+ response: {
302
+ definition: "ListMcpServerStatusResponse",
303
+ reads: [
304
+ { path: "data", types: A },
305
+ { path: "nextCursor", types: orNull(S), expects: [null] },
306
+ ],
307
+ },
308
+ },
309
+ {
310
+ method: "turn/start",
311
+ params: [
312
+ object("", [
313
+ "threadId",
314
+ "cwd",
315
+ "approvalPolicy",
316
+ "sandboxPolicy",
317
+ "environments",
318
+ "runtimeWorkspaceRoots",
319
+ "effort",
320
+ "model",
321
+ "outputSchema",
322
+ "input",
323
+ ]),
324
+ sent("threadId", S),
325
+ sent("cwd", S),
326
+ sent("approvalPolicy", S, "never"),
327
+ sent("sandboxPolicy.type", S, "readOnly"),
328
+ object("sandboxPolicy.{type=readOnly}", ["type"]),
329
+ sent("environments", A),
330
+ sent("runtimeWorkspaceRoots", A),
331
+ sent("effort", S, effort),
332
+ sent("model", S),
333
+ sent("outputSchema", O),
334
+ sent("input", A),
335
+ sent("input[].type", S, "text", "localImage"),
336
+ object("input[].{type=text}", ["type", "text", "text_elements"]),
337
+ sent("input[].{type=text}.text", S),
338
+ sent("input[].{type=text}.text_elements", A),
339
+ object("input[].{type=localImage}", ["type", "path"]),
340
+ sent("input[].{type=localImage}.path", S),
341
+ ],
342
+ response: { definition: "TurnStartResponse", reads: [{ path: "turn.id", types: S }] },
343
+ },
344
+ {
345
+ method: "turn/interrupt",
346
+ params: [object("", ["threadId", "turnId"]), sent("threadId", S), sent("turnId", S)],
347
+ },
348
+ ];
349
+ }
350
+ /** The notifications and the server request humanish consumes, and its reply to that request. */
351
+ const MESSAGES = [
352
+ // Where the baseline carries items; a release that moves them refuses (ITEM_CARRIERS).
353
+ {
354
+ method: "thread/started",
355
+ definition: "ThreadStartedNotification",
356
+ reads: [
357
+ { path: "thread", types: orNull(O) },
358
+ { path: "thread.turns", types: orNull(A) },
359
+ { path: "thread.turns[].items", types: orNull(A) },
360
+ ],
361
+ },
362
+ {
363
+ method: "turn/started",
364
+ definition: "TurnStartedNotification",
365
+ reads: [
366
+ { path: "threadId", types: S },
367
+ { path: "turn.id", types: S },
368
+ { path: "turn.items", types: orNull(A) },
369
+ ],
370
+ },
371
+ {
372
+ method: "turn/completed",
373
+ definition: "TurnCompletedNotification",
374
+ reads: [
375
+ { path: "threadId", types: S },
376
+ { path: "turn.id", types: S },
377
+ {
378
+ path: "turn.status",
379
+ types: S,
380
+ expects: ["completed", "interrupted"],
381
+ known: ["failed", "inProgress"],
382
+ },
383
+ { path: "turn.error", types: orNull(O), expects: [null] },
384
+ { path: "turn.items", types: orNull(A) },
385
+ ],
386
+ },
387
+ { method: "item/started", definition: "ItemStartedNotification", reads: startedReads },
388
+ { method: "item/completed", definition: "ItemCompletedNotification", reads: completedReads },
389
+ {
390
+ method: "item/agentMessage/delta",
391
+ definition: "AgentMessageDeltaNotification",
392
+ reads: [...scope, { path: "delta", types: S }],
393
+ },
394
+ {
395
+ method: "rawResponseItem/completed",
396
+ definition: "RawResponseItemCompletedNotification",
397
+ reads: [
398
+ ...scope,
399
+ {
400
+ path: "item.type",
401
+ types: S,
402
+ expects: ["message", "reasoning", "custom_tool_call", "function_call"],
403
+ known: RAW_ITEM_TYPES,
404
+ },
405
+ { path: "item.{type=custom_tool_call}.name", types: S, expects: ["exec"] },
406
+ { path: "item.{type=function_call}.name", types: S, expects: ["wait"] },
407
+ { path: "item.{type=message}.content", types: A },
408
+ // humanish stops on a "refusal" content item, which the baseline schema does not list.
409
+ {
410
+ path: "item.{type=message}.content[].type",
411
+ types: S,
412
+ known: ["input_text", "input_image", "input_audio", "output_text", "refusal"],
413
+ },
414
+ ],
415
+ },
416
+ {
417
+ method: "thread/tokenUsage/updated",
418
+ definition: "ThreadTokenUsageUpdatedNotification",
419
+ reads: [
420
+ ...scope,
421
+ { path: "tokenUsage.total.inputTokens", types: I },
422
+ { path: "tokenUsage.total.outputTokens", types: I },
423
+ { path: "tokenUsage.total.cachedInputTokens", types: I },
424
+ { path: "tokenUsage.total.cacheWriteInputTokens", types: I },
425
+ ],
426
+ },
427
+ {
428
+ method: "item/tool/call",
429
+ definition: "DynamicToolCallParams",
430
+ reads: [
431
+ ...scope,
432
+ { path: "callId", types: S },
433
+ { path: "tool", types: S },
434
+ { path: "namespace", types: orNull(S), expects: [null] },
435
+ { path: "arguments" },
436
+ ],
437
+ reply: {
438
+ definition: "DynamicToolCallResponse",
439
+ sends: [
440
+ object("", ["success", "contentItems"]),
441
+ sent("success", B, true),
442
+ sent("contentItems", A),
443
+ sent("contentItems[].type", S, "inputText"),
444
+ object("contentItems[].{type=inputText}", ["type", "text"]),
445
+ sent("contentItems[].{type=inputText}.text", S),
446
+ ],
447
+ },
448
+ },
449
+ ];
450
+ /** A container that stops being an array or object would hide its items from the item policy. */
451
+ const ITEM_CARRIERS = [
452
+ { path: "items", types: orNull(A), optional: true },
453
+ { path: "turn", types: orNull(O), optional: true },
454
+ { path: "turn.items", types: orNull(A), optional: true },
455
+ { path: "thread", types: orNull(O), optional: true },
456
+ { path: "thread.turns", types: orNull(A), optional: true },
457
+ { path: "thread.turns[]", types: O, optional: true },
458
+ { path: "thread.turns[].items", types: orNull(A), optional: true },
459
+ ];
460
+ /**
461
+ * The contract for one launch. config/read's `config` is typed only for some keys; the keys
462
+ * humanish pins that the schema leaves open are checked at launch by admitsRestrictedCodexConfig,
463
+ * which compares exact values, so they are not listed here.
464
+ */
465
+ export function protocolContract(host) {
466
+ return {
467
+ requests: [...handshakeRequests(host), ...threadRequests(host)],
468
+ messages: MESSAGES,
469
+ itemCarriers: ITEM_CARRIERS,
470
+ };
471
+ }
@@ -10,7 +10,7 @@
10
10
  * of them.
11
11
  */
12
12
  export declare const QUALIFIED_CODEX_CLI_VERSIONS: {
13
- readonly "linux-x64": readonly ["0.154.0", "0.157.1", "0.159.2", "0.159.3"];
13
+ readonly "linux-x64": readonly ["0.154.0", "0.157.1", "0.159.2", "0.159.3", "0.160.0"];
14
14
  readonly "darwin-arm64": readonly ["0.154.0"];
15
15
  };
16
16
  /**
@@ -36,10 +36,37 @@ export declare function defaultCodexCliVersion(platform?: NodeJS.Platform, arch?
36
36
  /** The version from `codex --version` output (`codex-cli 0.157.1`); any other shape is undefined. */
37
37
  export declare function parseCodexCliVersion(stdout: string): string | undefined;
38
38
  /**
39
- * doctor's recovery for an unadmitted CLI: the release it found, what this host admits, and the
40
- * exact command that installs the newest admitted release.
39
+ * doctor's recovery for an unadmitted CLI: the release it found and where, what this host admits,
40
+ * and how to replace that binary with the newest admitted release.
41
41
  */
42
- export declare function codexVersionRecovery(detected: string | undefined, platform?: NodeJS.Platform, arch?: string): string;
42
+ export declare function codexVersionRecovery(detected: string | undefined, installation?: CodexInstallation, platform?: NodeJS.Platform, arch?: string): string;
43
+ /**
44
+ * Where the `codex` humanish found was installed, which decides the command that replaces it.
45
+ * `path` is the file on `PATH`.
46
+ */
47
+ export type CodexInstallation = {
48
+ readonly kind: "project";
49
+ readonly path: string;
50
+ readonly project: string;
51
+ } | {
52
+ readonly kind: "global";
53
+ readonly path: string;
54
+ } | {
55
+ readonly kind: "other";
56
+ readonly path: string;
57
+ };
58
+ /**
59
+ * Classifies the `codex` on `PATH` by the file it resolves to. A project's node_modules/.bin/codex
60
+ * resolving into that project's @openai/codex is project-local, so `npx` runs it before any global
61
+ * install. One inside npm's global prefix (`npm prefix -g`) is global. Anything else, such as
62
+ * Homebrew or a standalone download, is other.
63
+ */
64
+ export declare function classifyCodexInstallation(found: {
65
+ path: string;
66
+ resolved: string;
67
+ }, npmGlobalPrefix: string | undefined): CodexInstallation;
68
+ /** One sentence: how to put the newest admitted Codex CLI in place of the one humanish found. */
69
+ export declare function codexInstallAdvice(installation: CodexInstallation | undefined, platform?: NodeJS.Platform, arch?: string): string;
43
70
  /** For refusal messages: the admitted releases on this host, or every host when it has none. */
44
71
  export declare function describeQualifiedCodexCliVersions(platform?: NodeJS.Platform, arch?: string): string;
45
72
  export {};
@@ -1,3 +1,4 @@
1
+ import path from "node:path";
1
2
  /**
2
3
  * Codex CLI releases the restricted launcher admits, per host, oldest first. Each qualified
3
4
  * release needs a receipt under docs/goals/computer-use-actor/receipts/ that meets
@@ -10,7 +11,7 @@
10
11
  * of them.
11
12
  */
12
13
  export const QUALIFIED_CODEX_CLI_VERSIONS = {
13
- "linux-x64": ["0.154.0", "0.157.1", "0.159.2", "0.159.3"],
14
+ "linux-x64": ["0.154.0", "0.157.1", "0.159.2", "0.159.3", "0.160.0"],
14
15
  "darwin-arm64": ["0.154.0"],
15
16
  };
16
17
  /**
@@ -66,15 +67,59 @@ function describeHost(host) {
66
67
  : `${PREEXISTING_CODEX_CLI_ADMISSIONS[host].join(", ")} (pre-existing admission, not qualified)`;
67
68
  }
68
69
  /**
69
- * doctor's recovery for an unadmitted CLI: the release it found, what this host admits, and the
70
- * exact command that installs the newest admitted release.
70
+ * doctor's recovery for an unadmitted CLI: the release it found and where, what this host admits,
71
+ * and how to replace that binary with the newest admitted release.
71
72
  */
72
- export function codexVersionRecovery(detected, platform = process.platform, arch = process.arch) {
73
+ export function codexVersionRecovery(detected, installation, platform = process.platform, arch = process.arch) {
73
74
  const found = detected === undefined
74
75
  ? "The installed Codex CLI did not report a recognizable version"
75
76
  : `Found Codex CLI ${detected}`;
76
- const install = `npm install -g @openai/codex@${defaultCodexCliVersion(platform, arch)}`;
77
- return `${found}; ${describeQualifiedCodexCliVersions(platform, arch)}. Install the newest with \`${install}\`, then sign in with a ChatGPT account (\`codex login\`).`;
77
+ const where = installation === undefined ? "" : ` at \`${installation.path}\``;
78
+ return `${found}${where}; ${describeQualifiedCodexCliVersions(platform, arch)}. ${codexInstallAdvice(installation, platform, arch)} Then sign in with a ChatGPT account (\`codex login\`).`;
79
+ }
80
+ const inside = (file, directory) => file.startsWith(`${directory}${path.sep}`);
81
+ /**
82
+ * Classifies the `codex` on `PATH` by the file it resolves to. A project's node_modules/.bin/codex
83
+ * resolving into that project's @openai/codex is project-local, so `npx` runs it before any global
84
+ * install. One inside npm's global prefix (`npm prefix -g`) is global. Anything else, such as
85
+ * Homebrew or a standalone download, is other.
86
+ */
87
+ export function classifyCodexInstallation(found, npmGlobalPrefix) {
88
+ const bin = path.dirname(found.path);
89
+ const modules = path.dirname(bin);
90
+ if (path.basename(bin) === ".bin" &&
91
+ path.basename(modules) === "node_modules" &&
92
+ inside(found.resolved, path.join(modules, "@openai", "codex")))
93
+ return { kind: "project", path: found.path, project: path.dirname(modules) };
94
+ if (npmGlobalPrefix !== undefined &&
95
+ (found.path === path.join(npmGlobalPrefix, "bin", "codex") ||
96
+ inside(found.resolved, path.join(npmGlobalPrefix, "lib", "node_modules", "@openai", "codex"))))
97
+ return { kind: "global", path: found.path };
98
+ return { kind: "other", path: found.path };
99
+ }
100
+ /**
101
+ * The command that installs the newest admitted Codex CLI where it replaces the one humanish
102
+ * found: in its project for a project-local install, otherwise npm's global install.
103
+ */
104
+ function codexInstallCommand(installation, platform = process.platform, arch = process.arch) {
105
+ const version = defaultCodexCliVersion(platform, arch);
106
+ return installation?.kind === "project"
107
+ ? `npm install -D @openai/codex@${version}`
108
+ : `npm install -g @openai/codex@${version}`;
109
+ }
110
+ /** One sentence: how to put the newest admitted Codex CLI in place of the one humanish found. */
111
+ export function codexInstallAdvice(installation, platform = process.platform, arch = process.arch) {
112
+ const command = codexInstallCommand(installation, platform, arch);
113
+ switch (installation?.kind) {
114
+ case undefined:
115
+ return `Install the newest with \`${command}\`.`;
116
+ case "global":
117
+ return `Replace it with \`${command}\`.`;
118
+ case "project":
119
+ return `It is installed in this project: run \`${command}\` in \`${installation.project}\`, or \`npm uninstall @openai/codex\` there to use the global Codex.`;
120
+ case "other":
121
+ return `Update it with the tool that installed it, or put Codex ${defaultCodexCliVersion(platform, arch)} first on PATH.`;
122
+ }
78
123
  }
79
124
  /** For refusal messages: the admitted releases on this host, or every host when it has none. */
80
125
  export function describeQualifiedCodexCliVersions(platform = process.platform, arch = process.arch) {
@@ -6,6 +6,11 @@ export declare function restrictedCodexNpmTarget(platform: NodeJS.Platform, arch
6
6
  triple: string;
7
7
  packageName: string;
8
8
  } | undefined;
9
+ /** The `codex` file humanish found and would not run, and why. No path: none was found. */
10
+ export interface RefusedCodexExecutable {
11
+ readonly path?: string;
12
+ readonly reason: string;
13
+ }
9
14
  /** Resolve PATH without running a shell. The npm launcher is resolved to its
10
15
  * native optional package so cleanup owns the real app-server child. */
11
16
  export declare function resolveExecutable(options: {
@@ -13,5 +18,24 @@ export declare function resolveExecutable(options: {
13
18
  platform?: NodeJS.Platform;
14
19
  arch?: string;
15
20
  }, env: NodeJS.ProcessEnv): Promise<string>;
21
+ /** The `codex` resolveExecutable turns down and why, or undefined when it finds one to run. */
22
+ export declare function refusedCodexExecutable(env: NodeJS.ProcessEnv, options?: {
23
+ platform?: NodeJS.Platform;
24
+ arch?: string;
25
+ }): Promise<RefusedCodexExecutable | undefined>;
26
+ /**
27
+ * The `codex` resolveExecutable picks from `PATH`, runnable or not, and the file it resolves to:
28
+ * what decides the command that replaces it. Undefined when `PATH` has none that resolves.
29
+ */
30
+ export declare function foundCodexExecutable(env: NodeJS.ProcessEnv): Promise<{
31
+ path: string;
32
+ resolved: string;
33
+ } | undefined>;
34
+ /**
35
+ * Writes this release's app-server schema (`app-server generate-json-schema --experimental`) into
36
+ * `out`, for the protocol check. False when the release exits without one. Bounded like the
37
+ * version check: 15 seconds, and a few kilobytes of output, which it does not otherwise read.
38
+ */
39
+ export declare function generateProtocolSchema(file: string, env: NodeJS.ProcessEnv, cwd: string, out: string, spawnFn: RestrictedCodexSpawn, deadline: RestrictedCodexDeadline): Promise<boolean>;
16
40
  /** Returns the detected release after checking it against the admitted list. */
17
41
  export declare function checkVersion(file: string, env: NodeJS.ProcessEnv, cwd: string, spawnFn: RestrictedCodexSpawn, deadline: RestrictedCodexDeadline, admitted: readonly string[], expected: string | undefined): Promise<string>;