humanish 0.107.0 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (671) hide show
  1. package/ARCHITECTURE.md +73 -69
  2. package/CHANGELOG.md +27 -0
  3. package/CONTEXT.md +51 -44
  4. package/README.md +148 -175
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-trace.js +2 -1
  14. package/dist/actors/codex/app-server-ui.js +1 -1
  15. package/dist/actors/codex/codex-admission.d.ts +91 -0
  16. package/dist/actors/codex/codex-admission.js +150 -0
  17. package/dist/actors/codex/restricted-executable.d.ts +4 -4
  18. package/dist/actors/codex/restricted-executable.js +8 -8
  19. package/dist/actors/codex/restricted-launch.d.ts +2 -1
  20. package/dist/actors/codex/restricted-launch.js +1 -1
  21. package/dist/actors/codex/restricted-participant.js +20 -18
  22. package/dist/actors/codex/restricted-policy.d.ts +2 -2
  23. package/dist/actors/codex/restricted-policy.js +2 -2
  24. package/dist/actors/codex/restricted-session.d.ts +3 -3
  25. package/dist/actors/codex/restricted-session.js +10 -5
  26. package/dist/actors/computer-use/actor.d.ts +18 -18
  27. package/dist/actors/computer-use/actor.js +4 -4
  28. package/dist/actors/computer-use/admission-limit.d.ts +3 -3
  29. package/dist/actors/computer-use/admission-limit.js +4 -4
  30. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  31. package/dist/actors/computer-use/executor-error.js +3 -3
  32. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  33. package/dist/actors/computer-use/loop/actions.js +15 -15
  34. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  35. package/dist/actors/computer-use/loop/backstop.js +14 -12
  36. package/dist/actors/computer-use/loop/debrief.js +2 -2
  37. package/dist/actors/computer-use/loop/ending.d.ts +6 -6
  38. package/dist/actors/computer-use/loop/ending.js +18 -17
  39. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  40. package/dist/actors/computer-use/loop/observation.js +15 -14
  41. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  42. package/dist/actors/computer-use/loop/provider-call.js +12 -12
  43. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  44. package/dist/actors/computer-use/loop/session.js +4 -4
  45. package/dist/actors/computer-use/loop/spend.d.ts +1 -1
  46. package/dist/actors/computer-use/loop/spend.js +1 -1
  47. package/dist/actors/computer-use/loop/trace.js +11 -9
  48. package/dist/actors/computer-use/loop/types.d.ts +47 -45
  49. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  50. package/dist/actors/computer-use/loop/usage.js +2 -2
  51. package/dist/actors/computer-use/loop.d.ts +6 -1
  52. package/dist/actors/computer-use/loop.js +26 -4
  53. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  54. package/dist/actors/computer-use/openai-context.js +214 -0
  55. package/dist/actors/computer-use/openai-provider.d.ts +13 -10
  56. package/dist/actors/computer-use/openai-provider.js +52 -41
  57. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  58. package/dist/actors/computer-use/openai-requests.js +82 -15
  59. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  60. package/dist/actors/computer-use/openai-wire.js +36 -34
  61. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  62. package/dist/actors/computer-use/provider-error.js +6 -6
  63. package/dist/actors/contract.d.ts +82 -47
  64. package/dist/actors/contract.js +30 -24
  65. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  66. package/dist/actors/local-agent/claude-session.js +13 -12
  67. package/dist/actors/local-agent/cli.d.ts +9 -7
  68. package/dist/actors/local-agent/cli.js +24 -28
  69. package/dist/actors/local-agent/readiness.d.ts +2 -2
  70. package/dist/actors/local-agent/readiness.js +4 -4
  71. package/dist/actors/reasoning-effort.js +8 -8
  72. package/dist/actors/registry.d.ts +12 -12
  73. package/dist/actors/registry.js +21 -20
  74. package/dist/actors/scripted-browser/actor.d.ts +10 -10
  75. package/dist/actors/scripted-browser/actor.js +17 -17
  76. package/dist/actors/scripted-browser/browser-command.js +1 -1
  77. package/dist/actors/scripted-browser/steps.js +1 -1
  78. package/dist/actors/scripted-browser/types.d.ts +1 -1
  79. package/dist/actors/stop-conditions.d.ts +1 -1
  80. package/dist/analysis/automatic-completion.d.ts +7 -7
  81. package/dist/analysis/automatic-completion.js +1 -1
  82. package/dist/analysis/automatic-config.d.ts +6 -6
  83. package/dist/analysis/automatic-config.js +1 -1
  84. package/dist/analysis/codex-config.d.ts +6 -2
  85. package/dist/analysis/codex-config.js +22 -14
  86. package/dist/analysis/execute.d.ts +1 -1
  87. package/dist/analysis/execute.js +1 -1
  88. package/dist/analysis/service.js +5 -5
  89. package/dist/analysis/types.d.ts +6 -0
  90. package/dist/browser-control/client.js +16 -16
  91. package/dist/browser-control/dispatcher.js +4 -4
  92. package/dist/browser-control/protocol.js +14 -14
  93. package/dist/browser-control/recording-transfer.js +4 -4
  94. package/dist/browser-control/transport.js +7 -7
  95. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  96. package/dist/cli/commands/analyze.js +19 -16
  97. package/dist/cli/commands/codex.js +9 -9
  98. package/dist/cli/commands/comms.js +48 -35
  99. package/dist/cli/commands/feedback.js +20 -21
  100. package/dist/cli/commands/migrate.d.ts +4 -0
  101. package/dist/cli/commands/migrate.js +65 -0
  102. package/dist/cli/commands/observe.d.ts +0 -1
  103. package/dist/cli/commands/observe.js +136 -112
  104. package/dist/cli/commands/run-command.d.ts +10 -0
  105. package/dist/cli/commands/run-command.js +85 -0
  106. package/dist/cli/commands/runs.js +136 -139
  107. package/dist/cli/commands/setup.d.ts +2 -2
  108. package/dist/cli/commands/setup.js +27 -24
  109. package/dist/cli/commands/study-format.d.ts +9 -0
  110. package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
  111. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  112. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
  113. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  114. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  115. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  116. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
  117. package/dist/cli/commands/study-route-run.d.ts +19 -0
  118. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  119. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  120. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  121. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  122. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
  123. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  124. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  125. package/dist/cli/commands/study-run.d.ts +9 -0
  126. package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
  127. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
  128. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
  129. package/dist/cli/commands/study.d.ts +3 -0
  130. package/dist/cli/commands/study.js +146 -0
  131. package/dist/cli/commands/tui.d.ts +4 -4
  132. package/dist/cli/commands/tui.js +31 -31
  133. package/dist/cli/commands/watch.js +71 -121
  134. package/dist/cli/deprecations.d.ts +6 -0
  135. package/dist/cli/deprecations.js +18 -0
  136. package/dist/cli/doctor.d.ts +18 -8
  137. package/dist/cli/doctor.js +114 -59
  138. package/dist/cli/first-run-path.d.ts +15 -13
  139. package/dist/cli/first-run-path.js +35 -33
  140. package/dist/cli/io.d.ts +44 -9
  141. package/dist/cli/io.js +98 -23
  142. package/dist/cli/observer-follow.d.ts +3 -3
  143. package/dist/cli/observer-follow.js +6 -7
  144. package/dist/cli/orientation.d.ts +10 -7
  145. package/dist/cli/orientation.js +89 -47
  146. package/dist/cli/product-sentence.d.ts +6 -0
  147. package/dist/cli/product-sentence.js +6 -0
  148. package/dist/cli/program.d.ts +6 -1
  149. package/dist/cli/program.js +111 -43
  150. package/dist/cli/telemetry.d.ts +16 -16
  151. package/dist/cli/telemetry.js +46 -44
  152. package/dist/cli.js +1 -1
  153. package/dist/comms/capture-surface.d.ts +13 -12
  154. package/dist/comms/capture-surface.js +23 -22
  155. package/dist/comms/catch-host.d.ts +7 -7
  156. package/dist/comms/catch-host.js +17 -17
  157. package/dist/comms/connections.d.ts +1 -1
  158. package/dist/comms/connections.js +2 -2
  159. package/dist/comms/email-catch.d.ts +3 -3
  160. package/dist/comms/email-catch.js +8 -8
  161. package/dist/comms/external-evidence.d.ts +5 -5
  162. package/dist/comms/external-evidence.js +5 -4
  163. package/dist/comms/extract.js +2 -2
  164. package/dist/comms/fake-inbox.d.ts +3 -3
  165. package/dist/comms/fake-inbox.js +3 -3
  166. package/dist/comms/receiving-render.d.ts +1 -1
  167. package/dist/comms/receiving-render.js +2 -2
  168. package/dist/comms/receiving-runtime.d.ts +4 -4
  169. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  170. package/dist/comms/sandbox-catch-script.js +6 -6
  171. package/dist/comms/sandbox-catch.d.ts +38 -39
  172. package/dist/comms/sandbox-catch.js +36 -37
  173. package/dist/comms/setup.d.ts +2 -2
  174. package/dist/comms/setup.js +56 -25
  175. package/dist/comms/thread-evidence.d.ts +1 -1
  176. package/dist/comms/thread-evidence.js +6 -6
  177. package/dist/comms/types.d.ts +6 -6
  178. package/dist/comms/types.js +3 -3
  179. package/dist/evidence/frame-signature.d.ts +1 -1
  180. package/dist/evidence/frame-signature.js +4 -4
  181. package/dist/evidence/redaction.d.ts +3 -3
  182. package/dist/evidence/redaction.js +4 -4
  183. package/dist/feedback/draft.js +38 -80
  184. package/dist/feedback/export-bundle.js +1 -1
  185. package/dist/feedback/export.d.ts +5 -1
  186. package/dist/feedback/export.js +10 -10
  187. package/dist/feedback/feedback.d.ts +2 -2
  188. package/dist/feedback/feedback.js +21 -3
  189. package/dist/feedback/proof.d.ts +1 -1
  190. package/dist/feedback/proof.js +2 -2
  191. package/dist/guest/bootstrap.js +6 -6
  192. package/dist/guest/browser-tools.js +8 -8
  193. package/dist/guest/chromium-text.js +19 -19
  194. package/dist/guest/desktop-executor.d.ts +2 -2
  195. package/dist/guest/desktop-executor.js +20 -20
  196. package/dist/guest/desktop-keys.js +4 -4
  197. package/dist/guest/desktop-media.d.ts +2 -2
  198. package/dist/guest/desktop-media.js +16 -16
  199. package/dist/guest/desktop-native.d.ts +1 -1
  200. package/dist/guest/desktop-native.js +10 -10
  201. package/dist/guest/runtime-desktop.js +2 -2
  202. package/dist/guest/runtime-processes.d.ts +2 -2
  203. package/dist/guest/runtime-processes.js +2 -2
  204. package/dist/guest/runtime.js +6 -6
  205. package/dist/index.d.ts +14 -14
  206. package/dist/index.js +8 -8
  207. package/dist/keys/key-resolution.d.ts +5 -5
  208. package/dist/keys/key-resolution.js +23 -23
  209. package/dist/observer/artifact.d.ts +2 -2
  210. package/dist/observer/artifact.js +7 -7
  211. package/dist/observer/data.d.ts +6 -6
  212. package/dist/observer/data.js +5 -4
  213. package/dist/observer/exposure.d.ts +1 -1
  214. package/dist/observer/exposure.js +11 -11
  215. package/dist/observer/http.js +1 -1
  216. package/dist/observer/library.d.ts +3 -1
  217. package/dist/observer/library.js +8 -3
  218. package/dist/observer/listen.js +5 -4
  219. package/dist/observer/render.d.ts +1 -1
  220. package/dist/observer/render.js +17 -6
  221. package/dist/observer/run-routes.d.ts +4 -3
  222. package/dist/observer/run-routes.js +38 -13
  223. package/dist/observer/serve.d.ts +1 -1
  224. package/dist/observer/serve.js +7 -3
  225. package/dist/observer/tunnel.js +1 -1
  226. package/dist/observer-app.html +4 -4
  227. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  228. package/dist/routes/computer-use/bundle-parts.js +18 -17
  229. package/dist/routes/computer-use/bundle.d.ts +2 -2
  230. package/dist/routes/computer-use/bundle.js +10 -9
  231. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
  232. package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
  233. package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
  234. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
  235. package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
  236. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  237. package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
  238. package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
  239. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  240. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
  241. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  242. package/dist/routes/computer-use/external-comms.js +1 -1
  243. package/dist/routes/computer-use/fanout-bundle.js +27 -26
  244. package/dist/routes/computer-use/fanout-records.js +12 -13
  245. package/dist/routes/computer-use/live-flush.d.ts +4 -4
  246. package/dist/routes/computer-use/live-flush.js +6 -6
  247. package/dist/routes/computer-use/live-phase.d.ts +5 -4
  248. package/dist/routes/computer-use/live-phase.js +8 -8
  249. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  250. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  251. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  252. package/dist/routes/computer-use/local-vm.js +3 -3
  253. package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
  254. package/dist/routes/computer-use/participant-desktop.js +5 -5
  255. package/dist/routes/computer-use/participant-execution.d.ts +4 -4
  256. package/dist/routes/computer-use/participant-execution.js +10 -10
  257. package/dist/routes/computer-use/participant-model.d.ts +6 -0
  258. package/dist/routes/computer-use/participant-model.js +33 -15
  259. package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
  260. package/dist/routes/computer-use/participant-prompt.js +9 -9
  261. package/dist/routes/computer-use/participant-runs.d.ts +16 -16
  262. package/dist/routes/computer-use/participant-runs.js +26 -25
  263. package/dist/routes/computer-use/plan.d.ts +12 -12
  264. package/dist/routes/computer-use/plan.js +42 -42
  265. package/dist/routes/computer-use/preflight.d.ts +5 -5
  266. package/dist/routes/computer-use/preflight.js +25 -25
  267. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  268. package/dist/routes/computer-use/rerun-selection.js +4 -3
  269. package/dist/routes/computer-use/result.d.ts +4 -4
  270. package/dist/routes/computer-use/result.js +22 -21
  271. package/dist/routes/computer-use/route.d.ts +12 -11
  272. package/dist/routes/computer-use/route.js +31 -30
  273. package/dist/routes/computer-use/self-report.d.ts +7 -7
  274. package/dist/routes/computer-use/self-report.js +32 -32
  275. package/dist/routes/computer-use/setup.d.ts +23 -23
  276. package/dist/routes/computer-use/setup.js +28 -29
  277. package/dist/routes/computer-use/single-bundle.d.ts +11 -11
  278. package/dist/routes/computer-use/single-bundle.js +40 -41
  279. package/dist/routes/computer-use/subject-projection.d.ts +4 -4
  280. package/dist/routes/computer-use/subject-projection.js +6 -6
  281. package/dist/routes/computer-use/types.d.ts +71 -73
  282. package/dist/routes/computer-use/types.js +12 -12
  283. package/dist/routes/preview.d.ts +13 -7
  284. package/dist/routes/preview.js +11 -7
  285. package/dist/routes/scripted/bundle.d.ts +7 -7
  286. package/dist/routes/scripted/bundle.js +20 -18
  287. package/dist/routes/scripted/plan.d.ts +8 -8
  288. package/dist/routes/scripted/plan.js +13 -13
  289. package/dist/routes/scripted/result.d.ts +3 -3
  290. package/dist/routes/scripted/result.js +13 -13
  291. package/dist/routes/scripted/route.d.ts +9 -9
  292. package/dist/routes/scripted/route.js +15 -16
  293. package/dist/routes/scripted/scenario.d.ts +1 -1
  294. package/dist/routes/scripted/scenario.js +5 -5
  295. package/dist/routes/scripted/setup.d.ts +6 -6
  296. package/dist/routes/scripted/setup.js +8 -8
  297. package/dist/routes/scripted/subject.d.ts +5 -5
  298. package/dist/routes/scripted/subject.js +4 -4
  299. package/dist/routes/scripted/surface-records.d.ts +1 -1
  300. package/dist/routes/scripted/surface-records.js +4 -4
  301. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  302. package/dist/routes/scripted/types.d.ts +18 -20
  303. package/dist/routes/scripted/types.js +2 -2
  304. package/dist/routes/shared-world/bundle-records.js +11 -10
  305. package/dist/routes/shared-world/bundle.d.ts +5 -5
  306. package/dist/routes/shared-world/bundle.js +46 -43
  307. package/dist/routes/shared-world/checkpoints.d.ts +4 -4
  308. package/dist/routes/shared-world/checkpoints.js +2 -2
  309. package/dist/routes/shared-world/comms.d.ts +14 -14
  310. package/dist/routes/shared-world/comms.js +19 -18
  311. package/dist/routes/shared-world/external-public.d.ts +4 -3
  312. package/dist/routes/shared-world/external-public.js +16 -12
  313. package/dist/routes/shared-world/handoff.d.ts +7 -6
  314. package/dist/routes/shared-world/handoff.js +65 -57
  315. package/dist/routes/shared-world/lobby-code.d.ts +2 -2
  316. package/dist/routes/shared-world/lobby-code.js +9 -9
  317. package/dist/routes/shared-world/participant-specs.d.ts +10 -9
  318. package/dist/routes/shared-world/participant-specs.js +38 -31
  319. package/dist/routes/shared-world/plan.d.ts +9 -9
  320. package/dist/routes/shared-world/plan.js +16 -16
  321. package/dist/routes/shared-world/provenance.d.ts +2 -2
  322. package/dist/routes/shared-world/provenance.js +2 -2
  323. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  324. package/dist/routes/shared-world/provisioned.js +18 -17
  325. package/dist/routes/shared-world/result.d.ts +6 -6
  326. package/dist/routes/shared-world/result.js +29 -29
  327. package/dist/routes/shared-world/route.d.ts +11 -11
  328. package/dist/routes/shared-world/route.js +40 -39
  329. package/dist/routes/shared-world/setup.d.ts +16 -16
  330. package/dist/routes/shared-world/setup.js +23 -23
  331. package/dist/routes/shared-world/types.d.ts +55 -53
  332. package/dist/routes/shared-world/types.js +4 -4
  333. package/dist/routes/terminal/adapter.d.ts +5 -5
  334. package/dist/routes/terminal/adapter.js +9 -9
  335. package/dist/routes/terminal/bundle.d.ts +13 -13
  336. package/dist/routes/terminal/bundle.js +28 -27
  337. package/dist/routes/terminal/credentials.d.ts +8 -8
  338. package/dist/routes/terminal/credentials.js +12 -12
  339. package/dist/routes/terminal/dry-run.d.ts +4 -4
  340. package/dist/routes/terminal/dry-run.js +12 -12
  341. package/dist/routes/terminal/encoding.js +2 -2
  342. package/dist/routes/terminal/ledger.d.ts +5 -5
  343. package/dist/routes/terminal/ledger.js +14 -14
  344. package/dist/routes/terminal/lifetime.d.ts +1 -1
  345. package/dist/routes/terminal/lifetime.js +1 -1
  346. package/dist/routes/terminal/live-finish.d.ts +2 -2
  347. package/dist/routes/terminal/live-finish.js +10 -10
  348. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  349. package/dist/routes/terminal/live-sandbox.js +15 -15
  350. package/dist/routes/terminal/participant-text.js +2 -1
  351. package/dist/routes/terminal/persona.d.ts +2 -2
  352. package/dist/routes/terminal/persona.js +3 -3
  353. package/dist/routes/terminal/plan.d.ts +7 -7
  354. package/dist/routes/terminal/plan.js +15 -15
  355. package/dist/routes/terminal/recorder.js +2 -2
  356. package/dist/routes/terminal/result.d.ts +5 -5
  357. package/dist/routes/terminal/result.js +14 -14
  358. package/dist/routes/terminal/route.d.ts +9 -9
  359. package/dist/routes/terminal/route.js +19 -20
  360. package/dist/routes/terminal/sandbox.d.ts +1 -1
  361. package/dist/routes/terminal/sandbox.js +1 -1
  362. package/dist/routes/terminal/session.d.ts +5 -5
  363. package/dist/routes/terminal/session.js +14 -13
  364. package/dist/routes/terminal/token-usage.d.ts +1 -1
  365. package/dist/routes/terminal/token-usage.js +7 -8
  366. package/dist/routes/terminal/trace.d.ts +4 -4
  367. package/dist/routes/terminal/trace.js +2 -2
  368. package/dist/routes/terminal/types.d.ts +48 -50
  369. package/dist/routes/terminal/types.js +5 -5
  370. package/dist/run/bundle-shape.js +3 -3
  371. package/dist/run/bundle.d.ts +49 -49
  372. package/dist/run/bundle.js +3 -2
  373. package/dist/run/cost-summary.js +3 -3
  374. package/dist/run/costs.d.ts +23 -0
  375. package/dist/run/costs.js +79 -44
  376. package/dist/run/detail.d.ts +6 -6
  377. package/dist/run/detail.js +4 -4
  378. package/dist/run/dry-run-inputs.d.ts +1 -1
  379. package/dist/run/dry-run-inputs.js +2 -2
  380. package/dist/run/dry-run.js +20 -20
  381. package/dist/run/judge.d.ts +19 -13
  382. package/dist/run/judge.js +18 -8
  383. package/dist/run/outcomes.d.ts +1 -1
  384. package/dist/run/participant.d.ts +1 -1
  385. package/dist/run/paths.d.ts +1 -1
  386. package/dist/run/paths.js +1 -1
  387. package/dist/run/preflight-receipts.js +1 -1
  388. package/dist/run/pricing.d.ts +11 -6
  389. package/dist/run/pricing.js +22 -15
  390. package/dist/run/projection.d.ts +46 -46
  391. package/dist/run/projection.js +57 -57
  392. package/dist/run/reclaim.d.ts +1 -1
  393. package/dist/run/reclaim.js +3 -3
  394. package/dist/run/results.d.ts +5 -5
  395. package/dist/run/run-cost.d.ts +53 -0
  396. package/dist/run/run-cost.js +105 -0
  397. package/dist/run/run-index-analysis.d.ts +15 -0
  398. package/dist/run/run-index-analysis.js +77 -0
  399. package/dist/run/run-index.d.ts +19 -7
  400. package/dist/run/run-index.js +77 -64
  401. package/dist/run/run-not-found.d.ts +5 -0
  402. package/dist/run/run-not-found.js +15 -0
  403. package/dist/run/run.d.ts +6 -5
  404. package/dist/run/run.js +3 -3
  405. package/dist/run/sandbox-receipts.d.ts +2 -2
  406. package/dist/run/sandbox-receipts.js +3 -3
  407. package/dist/run/shared-world-evidence.d.ts +37 -36
  408. package/dist/run/shared-world-evidence.js +4 -4
  409. package/dist/run/shared-world-shape.d.ts +1 -1
  410. package/dist/run/shared-world-shape.js +7 -7
  411. package/dist/run/stats.d.ts +14 -8
  412. package/dist/run/stats.js +121 -63
  413. package/dist/run/status.d.ts +16 -29
  414. package/dist/run/status.js +10 -29
  415. package/dist/run/stored-runs.js +2 -1
  416. package/dist/run/stream-shape.js +1 -1
  417. package/dist/run/streams.d.ts +7 -7
  418. package/dist/run/study-provenance.d.ts +49 -0
  419. package/dist/run/study-provenance.js +66 -0
  420. package/dist/run/study-result.d.ts +11 -0
  421. package/dist/run/study-result.js +9 -0
  422. package/dist/run/text.d.ts +2 -0
  423. package/dist/run/text.js +4 -0
  424. package/dist/run-study.d.ts +112 -0
  425. package/dist/{run-lab.js → run-study.js} +52 -47
  426. package/dist/{lab → study}/adapter-extension.d.ts +15 -27
  427. package/dist/{lab → study}/adapter-extension.js +10 -45
  428. package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
  429. package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
  430. package/dist/study/composition-rules.d.ts +7 -0
  431. package/dist/{lab → study}/composition-rules.js +53 -53
  432. package/dist/study/config.d.ts +15 -0
  433. package/dist/{lab → study}/config.js +98 -41
  434. package/dist/study/convert.d.ts +33 -0
  435. package/dist/study/convert.js +432 -0
  436. package/dist/{lab → study}/device-presets.d.ts +10 -10
  437. package/dist/{lab → study}/device-presets.js +11 -11
  438. package/dist/study/discover.d.ts +75 -0
  439. package/dist/{lab → study}/discover.js +134 -95
  440. package/dist/{lab → study}/doctor.d.ts +19 -12
  441. package/dist/{lab → study}/doctor.js +58 -20
  442. package/dist/study/field-paths.d.ts +12 -0
  443. package/dist/study/field-paths.js +126 -0
  444. package/dist/study/files.d.ts +26 -0
  445. package/dist/study/files.js +44 -0
  446. package/dist/{lab → study}/init-templates.d.ts +2 -2
  447. package/dist/study/init-templates.js +421 -0
  448. package/dist/{lab → study}/init.d.ts +2 -2
  449. package/dist/{lab → study}/init.js +46 -11
  450. package/dist/study/keys.d.ts +4 -0
  451. package/dist/{lab → study}/keys.js +46 -12
  452. package/dist/study/migrate.d.ts +48 -0
  453. package/dist/study/migrate.js +408 -0
  454. package/dist/study/owned-files.d.ts +38 -0
  455. package/dist/study/owned-files.js +182 -0
  456. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  457. package/dist/{lab → study}/parse/actors.js +14 -14
  458. package/dist/study/parse/comms.d.ts +12 -0
  459. package/dist/{lab → study}/parse/comms.js +5 -5
  460. package/dist/study/parse/execution.d.ts +19 -0
  461. package/dist/{lab → study}/parse/execution.js +13 -13
  462. package/dist/study/parse/study-v3.d.ts +21 -0
  463. package/dist/study/parse/study-v3.js +259 -0
  464. package/dist/study/parse/subject-state.d.ts +30 -0
  465. package/dist/{lab → study}/parse/subject-state.js +19 -19
  466. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  467. package/dist/{lab → study}/parse/subject.js +34 -34
  468. package/dist/{lab → study}/parse/values.d.ts +3 -3
  469. package/dist/{lab → study}/parse/values.js +3 -3
  470. package/dist/{lab → study}/persona-resolve.d.ts +8 -8
  471. package/dist/{lab → study}/persona-resolve.js +6 -6
  472. package/dist/{lab → study}/plan-base.d.ts +7 -7
  473. package/dist/{lab → study}/plan-base.js +1 -1
  474. package/dist/{lab → study}/plan-participants.d.ts +12 -12
  475. package/dist/{lab → study}/plan-participants.js +4 -4
  476. package/dist/{lab → study}/plan-types.d.ts +31 -31
  477. package/dist/{lab → study}/plan-types.js +2 -2
  478. package/dist/study/plan.d.ts +13 -0
  479. package/dist/study/plan.js +101 -0
  480. package/dist/study/preflight-probes.d.ts +3 -0
  481. package/dist/{lab → study}/preflight-probes.js +20 -19
  482. package/dist/study/preflight-result.d.ts +8 -0
  483. package/dist/{lab → study}/preflight-result.js +5 -4
  484. package/dist/study/preflight.d.ts +94 -0
  485. package/dist/{lab → study}/preflight.js +12 -12
  486. package/dist/{lab → study}/requirements.d.ts +3 -3
  487. package/dist/{lab → study}/requirements.js +1 -1
  488. package/dist/study/route-inputs.d.ts +28 -0
  489. package/dist/{lab → study}/route-inputs.js +1 -1
  490. package/dist/{lab → study}/routing.d.ts +39 -33
  491. package/dist/{lab → study}/routing.js +60 -29
  492. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
  493. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
  494. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
  495. package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
  496. package/dist/study/run-study-options.d.ts +28 -0
  497. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
  498. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
  499. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  500. package/dist/{lab → study}/summary.d.ts +16 -15
  501. package/dist/{lab → study}/summary.js +21 -21
  502. package/dist/{lab → study}/tasks.d.ts +18 -18
  503. package/dist/{lab → study}/tasks.js +14 -14
  504. package/dist/{lab → study}/types.d.ts +202 -196
  505. package/dist/{lab → study}/types.js +3 -1
  506. package/dist/{lab → study}/validation.d.ts +27 -27
  507. package/dist/{lab → study}/validation.js +53 -51
  508. package/dist/study/warnings.d.ts +12 -0
  509. package/dist/{lab → study}/warnings.js +62 -34
  510. package/dist/subject/clone.d.ts +7 -7
  511. package/dist/subject/clone.js +2 -2
  512. package/dist/subject/desktop-cli.d.ts +1 -1
  513. package/dist/subject/desktop-cli.js +2 -2
  514. package/dist/subject/local-tree-archive.d.ts +2 -2
  515. package/dist/subject/local-tree-archive.js +4 -4
  516. package/dist/subject/local-tree.d.ts +4 -4
  517. package/dist/subject/node-bootstrap.js +1 -1
  518. package/dist/subject/runtime.js +9 -10
  519. package/dist/subject/serve.d.ts +5 -5
  520. package/dist/subject/serve.js +3 -3
  521. package/dist/subject/state.d.ts +4 -4
  522. package/dist/subject/state.js +1 -1
  523. package/dist/subject/steps.d.ts +6 -6
  524. package/dist/subject/steps.js +5 -5
  525. package/dist/substrates/command-failure.d.ts +3 -3
  526. package/dist/substrates/command-failure.js +3 -3
  527. package/dist/substrates/desktop-session.js +2 -2
  528. package/dist/substrates/detached.d.ts +6 -6
  529. package/dist/substrates/detached.js +7 -7
  530. package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
  531. package/dist/substrates/e2b/cdp-probe.js +14 -17
  532. package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
  533. package/dist/substrates/e2b/desktop-browser.js +9 -9
  534. package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
  535. package/dist/substrates/e2b/desktop-cdp.js +9 -9
  536. package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
  537. package/dist/substrates/e2b/desktop-executor.js +13 -13
  538. package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
  539. package/dist/substrates/e2b/desktop-geometry.js +8 -8
  540. package/dist/substrates/e2b/desktop-media.d.ts +4 -4
  541. package/dist/substrates/e2b/desktop-media.js +1 -1
  542. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  543. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  544. package/dist/substrates/e2b/lifetime.js +1 -1
  545. package/dist/substrates/e2b/sandbox.d.ts +4 -4
  546. package/dist/substrates/e2b/sandbox.js +2 -2
  547. package/dist/substrates/e2b/sdk.d.ts +12 -12
  548. package/dist/substrates/e2b/sdk.js +7 -7
  549. package/dist/substrates/local/runtime-config.d.ts +4 -4
  550. package/dist/substrates/local/runtime-config.js +4 -4
  551. package/dist/tui/actions.d.ts +1 -1
  552. package/dist/tui/actions.js +13 -13
  553. package/dist/tui/contract.d.ts +23 -23
  554. package/dist/tui/contract.js +11 -11
  555. package/dist/tui/launch.d.ts +7 -7
  556. package/dist/tui/launch.js +36 -31
  557. package/dist/tui/project.js +5 -5
  558. package/dist/tui-app.js +139 -139
  559. package/dist/verify/actor.d.ts +8 -8
  560. package/dist/verify/actor.js +36 -36
  561. package/dist/verify/artifacts.d.ts +2 -2
  562. package/dist/verify/artifacts.js +3 -3
  563. package/dist/verify/context-growth.d.ts +9 -0
  564. package/dist/verify/context-growth.js +62 -0
  565. package/dist/verify/costs.d.ts +6 -6
  566. package/dist/verify/costs.js +8 -8
  567. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  568. package/dist/verify/shared-world-concurrent.js +79 -76
  569. package/dist/verify/shared-world.d.ts +2 -2
  570. package/dist/verify/shared-world.js +16 -16
  571. package/dist/verify/subject.d.ts +5 -5
  572. package/dist/verify/subject.js +19 -19
  573. package/dist/verify/verify.js +94 -44
  574. package/docs/README.md +25 -32
  575. package/docs/architecture/actor-contract.md +60 -91
  576. package/docs/architecture/browser-control.md +1 -1
  577. package/docs/architecture/desktop-sessions.md +7 -7
  578. package/docs/architecture/external-public-shared-world.md +68 -65
  579. package/docs/architecture/github-feedback-loop.md +2 -5
  580. package/docs/architecture/guest-desktop.md +2 -2
  581. package/docs/architecture/observer.md +34 -34
  582. package/docs/architecture/restricted-codex-analysis.md +34 -28
  583. package/docs/architecture/serve.md +34 -37
  584. package/docs/architecture/state-driven-executor.md +55 -58
  585. package/docs/architecture/task-protocol-support.md +6 -6
  586. package/docs/architecture/terminal-product-route.md +70 -110
  587. package/docs/contracts/README.md +24 -0
  588. package/docs/contracts/adapter-admission.md +3 -3
  589. package/docs/contracts/adapter-fixtures.md +4 -7
  590. package/docs/contracts/core.md +1 -3
  591. package/docs/contracts/errors.md +62 -0
  592. package/docs/contracts/feedback.md +8 -9
  593. package/docs/contracts/policy.md +7 -12
  594. package/docs/contracts/run-bundle.md +42 -44
  595. package/docs/contracts/schemas.md +446 -368
  596. package/docs/contracts/study-analysis.md +7 -4
  597. package/docs/contracts/study-costs.md +28 -9
  598. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  599. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  600. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  601. package/docs/principles/actor-fidelity.md +4 -4
  602. package/docs/principles/engineering.md +3 -3
  603. package/docs/principles/invariants-and-defaults.md +38 -38
  604. package/docs/principles/self-driving-harness.md +1 -5
  605. package/docs/principles/three-roles.md +1 -1
  606. package/docs/product/automatic-analysis.md +7 -7
  607. package/examples/README.md +1 -1
  608. package/examples/participant/README.md +5 -5
  609. package/examples/participant/run.mjs +11 -10
  610. package/examples/scorer/README.md +3 -3
  611. package/examples/scorer/run.mjs +11 -12
  612. package/examples/scorer/scorer.mjs +3 -3
  613. package/package.json +16 -17
  614. package/skills/humanish/SKILL.md +64 -60
  615. package/skills/humanish/agents/openai.yaml +1 -1
  616. package/AGENTS.md +0 -99
  617. package/CONTRIBUTING.md +0 -148
  618. package/dist/actors/codex/qualified-versions.d.ts +0 -72
  619. package/dist/actors/codex/qualified-versions.js +0 -132
  620. package/dist/cli/commands/lab-format.d.ts +0 -8
  621. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  622. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  623. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  624. package/dist/cli/commands/lab-run.d.ts +0 -9
  625. package/dist/cli/commands/lab.d.ts +0 -3
  626. package/dist/cli/commands/lab.js +0 -199
  627. package/dist/cli/renamed-options.d.ts +0 -11
  628. package/dist/cli/renamed-options.js +0 -18
  629. package/dist/lab/composition-rules.d.ts +0 -7
  630. package/dist/lab/config.d.ts +0 -7
  631. package/dist/lab/discover.d.ts +0 -65
  632. package/dist/lab/init-templates.js +0 -416
  633. package/dist/lab/keys.d.ts +0 -2
  634. package/dist/lab/parse/comms.d.ts +0 -12
  635. package/dist/lab/parse/execution.d.ts +0 -19
  636. package/dist/lab/parse/subject-state.d.ts +0 -30
  637. package/dist/lab/plan.d.ts +0 -19
  638. package/dist/lab/plan.js +0 -132
  639. package/dist/lab/preflight-probes.d.ts +0 -3
  640. package/dist/lab/preflight-result.d.ts +0 -7
  641. package/dist/lab/preflight.d.ts +0 -92
  642. package/dist/lab/route-inputs.d.ts +0 -28
  643. package/dist/lab/run-lab-options.d.ts +0 -28
  644. package/dist/lab/warnings.d.ts +0 -2
  645. package/dist/observer/static.d.ts +0 -39
  646. package/dist/observer/static.js +0 -369
  647. package/dist/run-lab.d.ts +0 -112
  648. package/docs/architecture/comms-inbox.md +0 -122
  649. package/docs/architecture/desktop-recording.md +0 -80
  650. package/docs/architecture/local-browser-runtime.md +0 -178
  651. package/docs/architecture/observer-review.md +0 -144
  652. package/docs/architecture/participant-media.md +0 -90
  653. package/docs/architecture/project-layout.md +0 -62
  654. package/docs/architecture/real-email-receiving.md +0 -136
  655. package/docs/assets/humanish-drawdb-hero.png +0 -0
  656. package/docs/assets/humanish-observer-hero.png +0 -0
  657. package/docs/goals/current.md +0 -207
  658. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  659. package/docs/product/open-source-install-experience.md +0 -240
  660. package/docs/ramp/README.md +0 -295
  661. package/docs/release/open-source-readiness.md +0 -222
  662. package/docs/release/public-readiness-standard.md +0 -210
  663. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  664. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  665. /package/dist/{lab → study}/init-paths.js +0 -0
  666. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  667. /package/dist/{lab → study}/init-plan.js +0 -0
  668. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  669. /package/dist/{lab → study}/participant-assignment.js +0 -0
  670. /package/dist/{lab → study}/persona.d.ts +0 -0
  671. /package/dist/{lab → study}/persona.js +0 -0
package/TELEMETRY.md CHANGED
@@ -6,26 +6,28 @@ disclosed the first time it happens, and you can switch it off in one command.
6
6
 
7
7
  This follows the convention the Next.js and Vercel CLIs established, with one
8
8
  difference: humanish is stricter about what may be collected, because a study's
9
- subject is your product and a lab id can name something you have not announced.
9
+ subject is your product and a study id can name something you have not announced.
10
10
 
11
11
  ## Why
12
12
 
13
13
  humanish shipped sixty-one releases without being able to answer _"does anyone
14
14
  get to a working first run?"_. The answer, when it finally arrived, came from an
15
15
  adoption post-mortem: the first live run had been impossible for months, because
16
- the starter labs shipped with a placeholder URL. Nobody reported it. Without
16
+ the starter studies shipped with a placeholder URL. Nobody reported it. Without
17
17
  telemetry, humanish cannot tell whether new users reach a working first run.
18
18
 
19
19
  ## What is collected
20
20
 
21
- - which command ran (`run`, `lab run`, `init`, …)
21
+ - which command ran (`run`, `init`, …)
22
22
  - the humanish version, your OS, your Node major version, whether you are in CI
23
23
  - whether the command succeeded (its exit code), and roughly how long it took
24
24
  (a bucket such as `1-5m`, never an exact duration)
25
25
  - for a study: whether it was a dry run or live, its outcome (one of a fixed
26
26
  set of words such as `passed`, `abandoned`, `all_passed`), which brain route
27
- ran it (`provider-key`, `local-agent`, or `none` for a dry run), and which lab
28
- ran, **only if it is one of the starter labs `humanish init` writes**
27
+ ran it (`provider-key`, `local-agent`, or `none` for a dry run), and which study
28
+ ran, **only if it is one of the starter studies `humanish init` writes**. That id is sent as
29
+ `study`. 0.108 and earlier also sent it as `lab`, the property's earlier name; 0.109 sends
30
+ `study` only
29
31
  - when a command fails: humanish's own error code (`HUMANISH_…`), never the
30
32
  message. Which failure ends a first run is the question this exists to answer.
31
33
  - for CUA results with diagnostics: `diagnostic_category` is exactly one of
@@ -58,7 +60,7 @@ HUMANISH_TELEMETRY_DEBUG=1 humanish run first-run
58
60
 
59
61
  ## What is never collected
60
62
 
61
- Your own lab ids and titles. Your subjects: repos, URLs, app names. Personas,
63
+ Your own study ids and titles. Your subjects: repos, URLs, app names. Personas,
62
64
  missions, or any prompt text. Paths, working directories, hostnames, usernames.
63
65
  Run ids, evidence, screenshots, traces. Credential names or values. There is no
64
66
  field in the payload that could carry any of these. `src/cli/telemetry.ts` enforces
@@ -6,7 +6,7 @@ export declare const AFFORDANCE_CLASS_SCHEMA = "humanish.affordance-use.v1";
6
6
  * direct navigation, "shortcut" (MAS-Bench) for a non-UI route to the same outcome.
7
7
  */
8
8
  export type AffordanceClass =
9
- /** Pointer or drag interaction with what is rendered on screen — the naturalistic core. */
9
+ /** Pointer or drag interaction with what is rendered on screen: the naturalistic core. */
10
10
  "pointer"
11
11
  /** Keyboard input into the page: typed text that is not a URL and not script. */
12
12
  | "keyboard"
@@ -32,7 +32,7 @@ export declare const SHORTCUT_AFFORDANCE_CLASSES: readonly AffordanceClass[];
32
32
  export interface AffordanceObservation {
33
33
  affordance: AffordanceClass;
34
34
  /**
35
- * A public-safe hint about WHY this class was assigned, when one exists — a URL scheme or the
35
+ * A public-safe hint about why this class was assigned, when one exists: a URL scheme or the
36
36
  * devtools chord. Never the typed text, never a full URL (which can carry a session token).
37
37
  */
38
38
  signal?: string;
@@ -40,7 +40,7 @@ export interface AffordanceObservation {
40
40
  /** Aggregate per-run record: how many actions fell into each class. */
41
41
  export interface AffordanceUse {
42
42
  schema: typeof AFFORDANCE_CLASS_SCHEMA;
43
- /** Counts by class; a class with zero actions is omitted so the record stays small and honest. */
43
+ /** Counts by class. A class with zero actions is omitted, so every listed class was used. */
44
44
  counts: Partial<Record<AffordanceClass, number>>;
45
45
  /** Total classified actions (the denominator for any rate an adopter computes). */
46
46
  total: number;
@@ -48,7 +48,7 @@ export interface AffordanceUse {
48
48
  shortcutTotal: number;
49
49
  }
50
50
  /**
51
- * Classify one computer-use action. PURE: same action in, same class out, no I/O, no clock. The
51
+ * Classify one computer-use action. Pure: same action in, same class out, no I/O, no clock. The
52
52
  * returned signal is public-safe (a scheme or a chord), never the action's text.
53
53
  */
54
54
  export declare function classifyCuaAction(action: CuaAction): AffordanceObservation;
@@ -1,25 +1,25 @@
1
- // Affordance classification (#369): WHICH KIND of route an actor took to accomplish a step.
1
+ // Affordance classification: which kind of route an actor took to accomplish a step.
2
2
  //
3
3
  // Why this exists. A computer-use actor in a human-persona study typed a `javascript:` URL into
4
4
  // the address bar to get past a step, and the run finished green: the actor routed around the
5
5
  // friction the study existed to measure, and nothing in the evidence said so. Whether that is a
6
- // defect depends on a question the bundle never recorded — who is this study's user? For a human
7
- // population it invalidates the run; for an agent-facing product whose users ARE agents the same
6
+ // defect depends on a question the bundle never recorded: who is this study's user? For a human
7
+ // population it invalidates the run; for an agent-facing product whose users are agents the same
8
8
  // act is faithful, and the fact the agent reached for it is itself a finding about how legible
9
- // the surface is. So the harness records the class and bakes NO verdict: the adopter's scorer
9
+ // the surface is. So the harness records the class and bakes no verdict: the adopter's scorer
10
10
  // (review.scorer.ref) decides what it means, because that judgment is product semantics.
11
11
  //
12
12
  // Two design facts drive the shape:
13
13
  //
14
- // 1. The computer-use action space is mouse + keyboard only — there is no `goto` action. Typing a
15
- // URL is a `type` action whose TEXT happens to be a URL, and typing script is a `type` action
14
+ // 1. The computer-use action space is mouse + keyboard only; there is no `goto` action. Typing a
15
+ // URL is a `type` action whose text happens to be a URL, and typing script is a `type` action
16
16
  // whose text happens to start with `javascript:`. Classification therefore has to look at the
17
17
  // typed text, which exists only at dispatch time.
18
18
  // 2. Raw typed text is never persisted (describeCuaAction deliberately renders `type [N chars]`),
19
- // so this module returns a CLASS and at most a scheme-shaped signal — never the text. The
19
+ // so this module returns a class and at most a scheme-shaped signal, never the text. The
20
20
  // class is public-safe by construction.
21
21
  //
22
- // Direct URL navigation is deliberately its own class and NOT lumped with script execution:
22
+ // Direct URL navigation is deliberately its own class, separate from script execution:
23
23
  // `load(url)` appears in 99.4% of 2,337 real human web demonstrations (WebLINX), so address-bar
24
24
  // use is ordinary human behavior. The anomalous classes are script execution and developer
25
25
  // tooling. See docs/principles/actor-fidelity.md for the evidence and the scoping of the claim.
@@ -61,7 +61,7 @@ const DEVTOOLS_CHORDS = new Set([
61
61
  "meta+alt+c",
62
62
  ]);
63
63
  /**
64
- * Classify one computer-use action. PURE: same action in, same class out, no I/O, no clock. The
64
+ * Classify one computer-use action. Pure: same action in, same class out, no I/O, no clock. The
65
65
  * returned signal is public-safe (a scheme or a chord), never the action's text.
66
66
  */
67
67
  export function classifyCuaAction(action) {
@@ -95,7 +95,7 @@ export function classifyCuaAction(action) {
95
95
  return { affordance: "browser-internal", signal: schemeOf(text) };
96
96
  }
97
97
  if (HTTP_URL.test(text)) {
98
- // Scheme only — a full URL can carry a session token or an identifying path.
98
+ // Scheme only: a full URL can carry a session token or an identifying path.
99
99
  return { affordance: "url-navigation", signal: schemeOf(text) };
100
100
  }
101
101
  if (BARE_HOST.test(text)) {
@@ -113,7 +113,7 @@ export function classifyCuaAction(action) {
113
113
  }
114
114
  /**
115
115
  * Normalize a key chord so the same physical shortcut matches however a provider spells it:
116
- * `Control`/`ctrl`, `Meta`/`Command`/`cmd`, `Option`/`alt` all collapse, and modifier ORDER is
116
+ * `Control`/`ctrl`, `Meta`/`Command`/`cmd`, `Option`/`alt` all collapse, and modifier order is
117
117
  * normalized so ["Shift","Control","J"] and ["Control","Shift","J"] are one chord.
118
118
  */
119
119
  function normalizeChord(keys) {
@@ -138,7 +138,7 @@ function normalizeChord(keys) {
138
138
  const rest = parts.filter((part) => !order.includes(part));
139
139
  return [...modifiers, ...rest].join("+");
140
140
  }
141
- /** The scheme alone, lowercased — never the rest of a URL, which can carry a session token. */
141
+ /** The scheme alone, lowercased; never the rest of a URL, which can carry a session token. */
142
142
  function schemeOf(text) {
143
143
  const trimmed = text.trim();
144
144
  const colon = trimmed.indexOf(":");
@@ -1,11 +1,11 @@
1
1
  export interface AgentSession {
2
2
  /** Human-readable runner name, for the refusal message. */
3
3
  runner: string;
4
- /** The environment variable that identified it — named so the reader can check us. */
4
+ /** The environment variable that identified it, named so the reader can check us. */
5
5
  marker: string;
6
6
  }
7
7
  /**
8
8
  * The agent runner driving this process, when one identifies itself. `undefined` means nothing
9
- * claimed to be an agent — which is NOT proof a person is there, only the absence of a claim.
9
+ * claimed to be an agent, which is not proof a person is there, only the absence of a claim.
10
10
  */
11
11
  export declare function detectAgentSession(env?: NodeJS.ProcessEnv): AgentSession | undefined;
@@ -1,19 +1,19 @@
1
- // Is the terminal on the other end of this process a PERSON's, or an agent's?
1
+ // Is the terminal on the other end of this process a person's, or an agent's?
2
2
  //
3
- // WHY THIS EXISTS: `humanish tui` refused a non-TTY, on the reasoning that an agent driving an
3
+ // Why this exists: `humanish tui` refused a non-TTY, on the reasoning that an agent driving an
4
4
  // interactive surface has asked for something that cannot exist. A study of that refusal
5
5
  // (labs/handed-a-human-surface.yaml) found it never fires: `codex exec` allocates a PTY for the
6
- // commands it runs, so both streams ARE terminals. The TUI launched, the agent navigated the labs
7
- // list, opened one, and — its own words — "accidentally triggered a zero-cost dry run while
6
+ // commands it runs, so both streams are terminals. The TUI launched, the agent navigated the labs
7
+ // list, opened one, and (in its own words) "accidentally triggered a zero-cost dry run while
8
8
  // navigating". A stray Enter on a live row is the same two keystrokes as a deliberate one.
9
9
  //
10
10
  // So a TTY is a real answer to the wrong question. It says a terminal exists; it does not say
11
11
  // anyone is reading it. Agent runners announce themselves in the environment, which is the only
12
12
  // signal available before the first keystroke, and is what `is-in-ci` has always done for CI.
13
13
  //
14
- // EVERY MARKER BELOW WAS OBSERVED, not guessed. Two runtimes are covered because two are what we
14
+ // Every marker below was observed, not guessed. Two runtimes are covered because two are what we
15
15
  // could verify: Claude Code (read off a live session) and Codex (read off the study sandbox, by a
16
- // names-only `env | cut -d= -f1` probe that never touched a value). Others certainly exist — add
16
+ // names-only `env | cut -d= -f1` probe that never touched a value). Others certainly exist; add
17
17
  // them the same way, from a real session, rather than from a plausible-looking guess. A marker
18
18
  // that is wrong refuses a person for no reason.
19
19
  const MARKERS = [
@@ -27,7 +27,7 @@ const MARKERS = [
27
27
  ];
28
28
  /**
29
29
  * The agent runner driving this process, when one identifies itself. `undefined` means nothing
30
- * claimed to be an agent — which is NOT proof a person is there, only the absence of a claim.
30
+ * claimed to be an agent, which is not proof a person is there, only the absence of a claim.
31
31
  */
32
32
  export function detectAgentSession(env = process.env) {
33
33
  for (const { marker, runner } of MARKERS) {
@@ -5,7 +5,7 @@ export declare function codexStatusToCompletionReason(status: CodexAppServerStat
5
5
  /**
6
6
  * Map a Codex app-server run result into the provider-neutral ActorTrace. Pure
7
7
  * and side-effect-free. The persona reference is supplied by the harness; until
8
- * personas are load-bearing it is a minimal stub ({ id, traitsApplied: [],
8
+ * the Codex route uses personas it is a minimal stub ({ id, traitsApplied: [],
9
9
  * promptDigest }).
10
10
  */
11
11
  export declare function codexResultToActorTrace(result: CodexAppServerRunResult, persona: ActorPersonaRef): ActorTrace;
@@ -173,7 +173,7 @@ function codexTraceToActorItems(trace) {
173
173
  /**
174
174
  * Map a Codex app-server run result into the provider-neutral ActorTrace. Pure
175
175
  * and side-effect-free. The persona reference is supplied by the harness; until
176
- * personas are load-bearing it is a minimal stub ({ id, traitsApplied: [],
176
+ * the Codex route uses personas it is a minimal stub ({ id, traitsApplied: [],
177
177
  * promptDigest }).
178
178
  */
179
179
  export function codexResultToActorTrace(result, persona) {
@@ -2,6 +2,7 @@
2
2
  // from app-server envelopes, and the redaction applied before anything is persisted.
3
3
  import { digestText, publicPathForTrace, redactText, tailText } from "../../evidence/redaction.js";
4
4
  import { isRecord } from "../../run/type-guards.js";
5
+ import { plural } from "../../run/text.js";
5
6
  export const CODEX_APP_SERVER_TRACE_SCHEMA = "humanish.codex-app-server-trace.v1";
6
7
  const authLikeKey = /(api[_-]?key|access[_-]?token|auth[_-]?url|authorization|bearer|credential|password|secret|token)$/i;
7
8
  const pathLikeKey = /^(cwd|path|writableRoots|workspaceRoot)$/i;
@@ -295,7 +296,7 @@ export function renderTranscript(trace) {
295
296
  [
296
297
  "File changes",
297
298
  trace.fileChanges
298
- .map((fileChange) => `${fileChange.status ?? "fileChange"} ${fileChange.changeCount ?? 0} change(s)`)
299
+ .map((fileChange) => `${fileChange.status ?? "fileChange"} ${plural(fileChange.changeCount ?? 0, "change")}`)
299
300
  .join("\n"),
300
301
  ],
301
302
  ];
@@ -242,7 +242,7 @@ function renderCodexAppServerUiHtml() {
242
242
  <h1>Codex App-Server Actor</h1>
243
243
  <p id="subtitle">Connecting to humanish state...</p>
244
244
  </div>
245
- <div class="pill" id="status" data-status="starting">STARTING</div>
245
+ <div class="pill" id="status" data-status="starting">starting</div>
246
246
  </header>
247
247
  <main>
248
248
  <aside>
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Which Codex CLI releases the restricted launcher starts: every stable `MAJOR.MINOR.PATCH`
3
+ * release from RECORDED_CODEX_CLI_FLOOR (0.154.0, the oldest known to work) on, except the
4
+ * refused ones. There is no ceiling, so a new release runs the day it ships; a release that breaks
5
+ * humanish is a bug, fixed by refusing it here until humanish handles it. Saved bundles read any
6
+ * stable release from the same floor, refused or not (src/actors/contract.ts).
7
+ *
8
+ * A release string is a compatibility check, not binary attestation: the launcher compares what
9
+ * `codex --version`, initialize and thread start report, and a modified binary can report any
10
+ * of them. Each launch also checks the release's app-server schema (protocol-compat.ts).
11
+ */
12
+ export declare const REFUSED_CODEX_CLI_VERSIONS: readonly {
13
+ readonly version: string;
14
+ readonly reason: string;
15
+ readonly issue: string;
16
+ }[];
17
+ /**
18
+ * Releases `pnpm codex:qualify` passed on Linux x64, oldest first. They gate nothing: the newest is
19
+ * the default a declaration names before detection, the install target and the "last tested"
20
+ * hint, and the list is the qualifier's baseline.
21
+ */
22
+ export declare const TESTED_CODEX_CLI_VERSIONS: readonly ["0.154.0", "0.157.1", "0.159.2", "0.159.3", "0.160.0"];
23
+ /**
24
+ * The run warning for a hosted (operator-mode) participant on a release not in
25
+ * TESTED_CODEX_CLI_VERSIONS, or undefined. No qualifier ran that release in operator mode, so its
26
+ * evidence rests on what each launch checks (open-admission design, answer C).
27
+ */
28
+ export declare function untestedOperatorReleaseWarning(cliVersion: string | undefined, operator: boolean): string | undefined;
29
+ /** Why the launcher refuses a release, or undefined when it starts it. */
30
+ export type CodexCliRefusal = {
31
+ readonly reason: "unrecognized";
32
+ } | {
33
+ readonly reason: "prerelease" | "below_floor";
34
+ readonly version: string;
35
+ } | {
36
+ readonly reason: "refused";
37
+ readonly version: string;
38
+ readonly detail: string;
39
+ readonly issue: string;
40
+ };
41
+ /**
42
+ * Why the launcher refuses a release: not a plain `MAJOR.MINOR.PATCH` (or longer than the 64
43
+ * characters parseCodexCliVersion reads), a prerelease (`-` after the core), older than the floor,
44
+ * or refused.
45
+ */
46
+ export declare function codexCliRefusal(version: string | undefined): CodexCliRefusal | undefined;
47
+ /** Whether the launcher starts this release. */
48
+ export declare const admitsCodexCliVersion: (version: string) => boolean;
49
+ /**
50
+ * Hosts where isolated launches run (the Codex-account analyst and local-browser participants).
51
+ * Operator launches run on every host with a native npm build (restrictedCodexNpmTarget).
52
+ */
53
+ export declare const supportsIsolatedCodex: (platform: NodeJS.Platform, arch: string) => boolean;
54
+ /** What a declaration names before the installed CLI is detected: the newest tested release. */
55
+ export declare function defaultCodexCliVersion(): string;
56
+ /** The version from `codex --version` output (`codex-cli 0.157.1`); any other shape is undefined. */
57
+ export declare function parseCodexCliVersion(stdout: string): string | undefined;
58
+ /**
59
+ * doctor's recovery for a refused CLI: the release it found and where, why it is refused, and how
60
+ * to replace that binary with the last tested release.
61
+ */
62
+ export declare function codexVersionRecovery(detected: string | undefined, installation?: CodexInstallation): string;
63
+ /**
64
+ * Where the `codex` humanish found was installed, which decides the command that replaces it.
65
+ * `path` is the file on `PATH`.
66
+ */
67
+ export type CodexInstallation = {
68
+ readonly kind: "project";
69
+ readonly path: string;
70
+ readonly project: string;
71
+ } | {
72
+ readonly kind: "global";
73
+ readonly path: string;
74
+ } | {
75
+ readonly kind: "other";
76
+ readonly path: string;
77
+ };
78
+ /**
79
+ * Classifies the `codex` on `PATH` by the file it resolves to. A project's node_modules/.bin/codex
80
+ * resolving into that project's @openai/codex is project-local, so `npx` runs it before any global
81
+ * install. One inside npm's global prefix (`npm prefix -g`) is global. Anything else, such as
82
+ * Homebrew or a standalone download, is other.
83
+ */
84
+ export declare function classifyCodexInstallation(found: {
85
+ path: string;
86
+ resolved: string;
87
+ }, npmGlobalPrefix: string | undefined): CodexInstallation;
88
+ /** One sentence: how to put the last tested Codex CLI in place of the one humanish found. */
89
+ export declare function codexInstallAdvice(installation: CodexInstallation | undefined): string;
90
+ /** For refusal messages: which releases the launcher starts, and the last tested one. */
91
+ export declare function describeCodexCliAdmission(): string;
@@ -0,0 +1,150 @@
1
+ import path from "node:path";
2
+ import { RECORDED_CODEX_CLI_FLOOR, isRecordedCodexCliVersion } from "../contract.js";
3
+ /**
4
+ * Which Codex CLI releases the restricted launcher starts: every stable `MAJOR.MINOR.PATCH`
5
+ * release from RECORDED_CODEX_CLI_FLOOR (0.154.0, the oldest known to work) on, except the
6
+ * refused ones. There is no ceiling, so a new release runs the day it ships; a release that breaks
7
+ * humanish is a bug, fixed by refusing it here until humanish handles it. Saved bundles read any
8
+ * stable release from the same floor, refused or not (src/actors/contract.ts).
9
+ *
10
+ * A release string is a compatibility check, not binary attestation: the launcher compares what
11
+ * `codex --version`, initialize and thread start report, and a modified binary can report any
12
+ * of them. Each launch also checks the release's app-server schema (protocol-compat.ts).
13
+ */
14
+ export const REFUSED_CODEX_CLI_VERSIONS = [];
15
+ /**
16
+ * Releases `pnpm codex:qualify` passed on Linux x64, oldest first. They gate nothing: the newest is
17
+ * the default a declaration names before detection, the install target and the "last tested"
18
+ * hint, and the list is the qualifier's baseline.
19
+ */
20
+ export const TESTED_CODEX_CLI_VERSIONS = [
21
+ "0.154.0",
22
+ "0.157.1",
23
+ "0.159.2",
24
+ "0.159.3",
25
+ "0.160.0",
26
+ ];
27
+ /**
28
+ * The run warning for a hosted (operator-mode) participant on a release not in
29
+ * TESTED_CODEX_CLI_VERSIONS, or undefined. No qualifier ran that release in operator mode, so its
30
+ * evidence rests on what each launch checks (open-admission design, answer C).
31
+ */
32
+ export function untestedOperatorReleaseWarning(cliVersion, operator) {
33
+ if (!operator || cliVersion === undefined)
34
+ return undefined;
35
+ if (TESTED_CODEX_CLI_VERSIONS.includes(cliVersion))
36
+ return undefined;
37
+ return `Codex CLI ${cliVersion} has not been tested with humanish; this hosted participant's evidence rests on the checks each launch makes.`;
38
+ }
39
+ const CORE = "(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)";
40
+ /**
41
+ * Why the launcher refuses a release: not a plain `MAJOR.MINOR.PATCH` (or longer than the 64
42
+ * characters parseCodexCliVersion reads), a prerelease (`-` after the core), older than the floor,
43
+ * or refused.
44
+ */
45
+ export function codexCliRefusal(version) {
46
+ if (version === undefined || version.length > 64)
47
+ return { reason: "unrecognized" };
48
+ if (new RegExp(`^${CORE}-[0-9A-Za-z.-]+(?:\\+[0-9A-Za-z.-]+)?$`).test(version))
49
+ return { reason: "prerelease", version };
50
+ if (!new RegExp(`^${CORE}$`).test(version))
51
+ return { reason: "unrecognized" };
52
+ if (!isRecordedCodexCliVersion(version))
53
+ return { reason: "below_floor", version };
54
+ const refused = REFUSED_CODEX_CLI_VERSIONS.find((entry) => entry.version === version);
55
+ return refused === undefined
56
+ ? undefined
57
+ : { reason: "refused", version, detail: refused.reason, issue: refused.issue };
58
+ }
59
+ /** Whether the launcher starts this release. */
60
+ export const admitsCodexCliVersion = (version) => codexCliRefusal(version) === undefined;
61
+ /**
62
+ * Hosts where isolated launches run (the Codex-account analyst and local-browser participants).
63
+ * Operator launches run on every host with a native npm build (restrictedCodexNpmTarget).
64
+ */
65
+ export const supportsIsolatedCodex = (platform, arch) => (platform === "linux" && arch === "x64") || (platform === "darwin" && arch === "arm64");
66
+ /** What a declaration names before the installed CLI is detected: the newest tested release. */
67
+ export function defaultCodexCliVersion() {
68
+ return TESTED_CODEX_CLI_VERSIONS.at(-1);
69
+ }
70
+ /** The version from `codex --version` output (`codex-cli 0.157.1`); any other shape is undefined. */
71
+ export function parseCodexCliVersion(stdout) {
72
+ return /^codex-cli ([0-9][0-9A-Za-z.+-]{0,63})$/.exec(stdout.trim())?.[1];
73
+ }
74
+ /** Why a release is refused, as a clause; the admission rule when it is not refused. */
75
+ function refusalClause(detected) {
76
+ const refusal = codexCliRefusal(detected);
77
+ switch (refusal?.reason) {
78
+ case "unrecognized":
79
+ return `it is not a plain MAJOR.MINOR.PATCH release; ${describeCodexCliAdmission()}`;
80
+ case "prerelease":
81
+ return "it is a prerelease, and humanish runs stable releases";
82
+ case "below_floor":
83
+ return `it is older than ${RECORDED_CODEX_CLI_FLOOR}, the oldest release humanish supports`;
84
+ case "refused":
85
+ return `humanish refuses it: ${refusal.detail} (${refusal.issue})`;
86
+ default:
87
+ return describeCodexCliAdmission();
88
+ }
89
+ }
90
+ /**
91
+ * doctor's recovery for a refused CLI: the release it found and where, why it is refused, and how
92
+ * to replace that binary with the last tested release.
93
+ */
94
+ export function codexVersionRecovery(detected, installation) {
95
+ const found = detected === undefined
96
+ ? "The installed Codex CLI did not report a recognizable version"
97
+ : `Found Codex CLI ${detected}`;
98
+ const where = installation === undefined ? "" : ` at \`${installation.path}\``;
99
+ return `${found}${where}; ${refusalClause(detected)}. ${codexInstallAdvice(installation)} Then sign in with a ChatGPT account (\`codex login\`).`;
100
+ }
101
+ const inside = (file, directory) => file.startsWith(`${directory}${path.sep}`);
102
+ /**
103
+ * Classifies the `codex` on `PATH` by the file it resolves to. A project's node_modules/.bin/codex
104
+ * resolving into that project's @openai/codex is project-local, so `npx` runs it before any global
105
+ * install. One inside npm's global prefix (`npm prefix -g`) is global. Anything else, such as
106
+ * Homebrew or a standalone download, is other.
107
+ */
108
+ export function classifyCodexInstallation(found, npmGlobalPrefix) {
109
+ const bin = path.dirname(found.path);
110
+ const modules = path.dirname(bin);
111
+ if (path.basename(bin) === ".bin" &&
112
+ path.basename(modules) === "node_modules" &&
113
+ inside(found.resolved, path.join(modules, "@openai", "codex")))
114
+ return { kind: "project", path: found.path, project: path.dirname(modules) };
115
+ if (npmGlobalPrefix !== undefined &&
116
+ (found.path === path.join(npmGlobalPrefix, "bin", "codex") ||
117
+ inside(found.resolved, path.join(npmGlobalPrefix, "lib", "node_modules", "@openai", "codex"))))
118
+ return { kind: "global", path: found.path };
119
+ return { kind: "other", path: found.path };
120
+ }
121
+ /**
122
+ * The command that installs the last tested Codex CLI where it replaces the one humanish found:
123
+ * in its project for a project-local install, otherwise npm's global install.
124
+ */
125
+ function codexInstallCommand(installation) {
126
+ const version = defaultCodexCliVersion();
127
+ return installation?.kind === "project"
128
+ ? `npm install -D @openai/codex@${version}`
129
+ : `npm install -g @openai/codex@${version}`;
130
+ }
131
+ /** One sentence: how to put the last tested Codex CLI in place of the one humanish found. */
132
+ export function codexInstallAdvice(installation) {
133
+ const command = codexInstallCommand(installation);
134
+ switch (installation?.kind) {
135
+ case undefined:
136
+ return `Install the last tested release with \`${command}\`.`;
137
+ case "global":
138
+ return `Replace it with \`${command}\`.`;
139
+ case "project":
140
+ return `It is installed in this project: run \`${command}\` in \`${installation.project}\`, or \`npm uninstall @openai/codex\` there to use the global Codex.`;
141
+ case "other":
142
+ return `Update it with the tool that installed it, or put Codex ${defaultCodexCliVersion()} first on PATH.`;
143
+ }
144
+ }
145
+ /** For refusal messages: which releases the launcher starts, and the last tested one. */
146
+ export function describeCodexCliAdmission() {
147
+ const refused = REFUSED_CODEX_CLI_VERSIONS.map((entry) => entry.version);
148
+ const except = refused.length === 0 ? "" : ` except ${refused.join(", ")}`;
149
+ return `humanish runs stable Codex CLI releases from ${RECORDED_CODEX_CLI_FLOOR}${except} (last tested: ${defaultCodexCliVersion()})`;
150
+ }
@@ -1,5 +1,5 @@
1
1
  import { type RestrictedCodexDeadline, type RestrictedCodexSpawn } from "./restricted-transport.js";
2
- /** The environment of every Codex child: a private home and scratch, and PATH and locale. */
2
+ /** The environment of every Codex child: a private home and scratch, and `PATH` and locale. */
3
3
  export declare function childEnvironment(source: NodeJS.ProcessEnv, home: string, scratch: string): NodeJS.ProcessEnv;
4
4
  /** Official npm launcher target map for the Unix hosts supported by this transport. */
5
5
  export declare function restrictedCodexNpmTarget(platform: NodeJS.Platform, arch: string): {
@@ -11,7 +11,7 @@ export interface RefusedCodexExecutable {
11
11
  readonly path?: string;
12
12
  readonly reason: string;
13
13
  }
14
- /** Resolve PATH without running a shell. The npm launcher is resolved to its
14
+ /** Resolve `PATH` without running a shell. The npm launcher is resolved to its
15
15
  * native optional package so cleanup owns the real app-server child. */
16
16
  export declare function resolveExecutable(options: {
17
17
  executable?: string;
@@ -37,5 +37,5 @@ export declare function foundCodexExecutable(env: NodeJS.ProcessEnv): Promise<{
37
37
  * version check: 15 seconds, and a few kilobytes of output, which it does not otherwise read.
38
38
  */
39
39
  export declare function generateProtocolSchema(file: string, env: NodeJS.ProcessEnv, cwd: string, out: string, spawnFn: RestrictedCodexSpawn, deadline: RestrictedCodexDeadline): Promise<boolean>;
40
- /** Returns the detected release after checking it against the admitted list. */
41
- export declare function checkVersion(file: string, env: NodeJS.ProcessEnv, cwd: string, spawnFn: RestrictedCodexSpawn, deadline: RestrictedCodexDeadline, admitted: readonly string[], expected: string | undefined): Promise<string>;
40
+ /** Returns the detected release after checking it against launch admission (`admits`). */
41
+ export declare function checkVersion(file: string, env: NodeJS.ProcessEnv, cwd: string, spawnFn: RestrictedCodexSpawn, deadline: RestrictedCodexDeadline, admits: (version: string) => boolean, expected: string | undefined): Promise<string>;
@@ -1,13 +1,13 @@
1
- // Finding and admitting the Codex CLI a restricted launch runs: the native executable behind PATH
1
+ // Finding and admitting the Codex CLI a restricted launch runs: the native executable behind `PATH`
2
2
  // or the npm launcher, the environment its children get, and the `--version` check against the
3
3
  // host's admitted releases.
4
4
  import { constants } from "node:fs";
5
5
  import { access, open, realpath } from "node:fs/promises";
6
6
  import { createRequire } from "node:module";
7
7
  import path from "node:path";
8
- import { parseCodexCliVersion } from "./qualified-versions.js";
8
+ import { parseCodexCliVersion } from "./codex-admission.js";
9
9
  import { RestrictedCodexStop, closeOwnedCodexProcess, ownCodexProcess, retainUnclosedChild, } from "./restricted-transport.js";
10
- /** The environment of every Codex child: a private home and scratch, and PATH and locale. */
10
+ /** The environment of every Codex child: a private home and scratch, and `PATH` and locale. */
11
11
  export function childEnvironment(source, home, scratch) {
12
12
  const result = { HOME: home, CODEX_HOME: home, TMPDIR: scratch };
13
13
  for (const key of ["PATH", "LANG", "USER", "LOGNAME"])
@@ -47,7 +47,7 @@ export function restrictedCodexNpmTarget(platform, arch) {
47
47
  return { triple: "aarch64-apple-darwin", packageName: "codex-darwin-arm64" };
48
48
  return undefined;
49
49
  }
50
- /** Resolve PATH without running a shell. The npm launcher is resolved to its
50
+ /** Resolve `PATH` without running a shell. The npm launcher is resolved to its
51
51
  * native optional package so cleanup owns the real app-server child. */
52
52
  export async function resolveExecutable(options, env) {
53
53
  const located = await locateExecutable(options, env);
@@ -72,7 +72,7 @@ async function firstCodexOnPath(env) {
72
72
  return candidate;
73
73
  }
74
74
  catch {
75
- /* Continue PATH. */
75
+ /* Try the next `PATH` entry. */
76
76
  }
77
77
  }
78
78
  return undefined;
@@ -177,8 +177,8 @@ export async function generateProtocolSchema(file, env, cwd, out, spawnFn, deadl
177
177
  }
178
178
  }
179
179
  }
180
- /** Returns the detected release after checking it against the admitted list. */
181
- export async function checkVersion(file, env, cwd, spawnFn, deadline, admitted, expected) {
180
+ /** Returns the detected release after checking it against launch admission (`admits`). */
181
+ export async function checkVersion(file, env, cwd, spawnFn, deadline, admits, expected) {
182
182
  deadline.check();
183
183
  const owned = ownCodexProcess(spawnFn(file, ["--version"], { cwd, env, detached: false, stdio: ["pipe", "pipe", "pipe"] }));
184
184
  let text = "", bytes = 0, exitCode = null;
@@ -206,7 +206,7 @@ export async function checkVersion(file, env, cwd, spawnFn, deadline, admitted,
206
206
  throw new RestrictedCodexStop("codex_unavailable");
207
207
  const version = parseCodexCliVersion(text);
208
208
  if (version === undefined ||
209
- !admitted.includes(version) ||
209
+ !admits(version) ||
210
210
  (expected !== undefined && version !== expected))
211
211
  throw new RestrictedCodexStop("codex_unsupported_version", version);
212
212
  return version;
@@ -22,7 +22,8 @@ export interface LaunchSettings {
22
22
  readonly operatorAuth: boolean;
23
23
  readonly reasoningEffort: ReasoningEffort;
24
24
  readonly spawnFn: RestrictedCodexSpawn;
25
- readonly admittedVersions: readonly string[];
25
+ /** Launch admission: codex-admission.ts, or the qualifier's exact list (restricted-session.ts). */
26
+ readonly admits: (version: string) => boolean;
26
27
  }
27
28
  /** What a launch records on the session, each piece as soon as it exists. */
28
29
  export interface LaunchState {
@@ -179,7 +179,7 @@ export async function launchAdmittedAppServer(settings, state, request, deadline
179
179
  for (const directory of [home, state.cwd, state.scratch])
180
180
  await mkdir(directory, { mode: 0o700 });
181
181
  const env = childEnvironment(sourceEnv, home, state.scratch);
182
- state.cliVersion = await checkVersion(file, env, state.cwd, spawnFn, deadline, settings.admittedVersions, options.cliVersion);
182
+ state.cliVersion = await checkVersion(file, env, state.cwd, spawnFn, deadline, settings.admits, options.cliVersion);
183
183
  await admitProtocol(file, env, state, spawnFn, deadline, {
184
184
  reasoningEffort,
185
185
  platform: settings.platform,