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
@@ -1,6 +1,6 @@
1
1
  import { attachBrowserControlDispatcher } from "../browser-control/dispatcher.js";
2
2
  import { encodeGuestBootstrap, GuestBootstrapReader, GUEST_BOOTSTRAP_LIMITS, guestReadyTimeoutMs, } from "./bootstrap.js";
3
- import { CuaExecutorError } from "../actors/computer-use/executor-error.js";
3
+ import { ComputerUseExecutorError } from "../actors/computer-use/executor-error.js";
4
4
  /** One admitted desktop and one dispatcher. The owner retains physical teardown. */
5
5
  export async function runGuestRuntime(options) {
6
6
  const owner = new AbortController();
@@ -77,7 +77,7 @@ export async function runGuestRuntime(options) {
77
77
  reader = new GuestBootstrapReader(options.transport, options.revision, authority, false, terminal);
78
78
  const identity = await reader.identity;
79
79
  if (authority.aborted)
80
- throw new CuaExecutorError("session_revoked", "not_dispatched");
80
+ throw new ComputerUseExecutorError("session_revoked", "not_dispatched");
81
81
  clearTimeout(timer);
82
82
  timer = setTimeout(() => {
83
83
  void close();
@@ -87,7 +87,7 @@ export async function runGuestRuntime(options) {
87
87
  desktop = await Promise.race([
88
88
  preparing,
89
89
  new Promise((_, reject) => {
90
- const stop = () => reject(new CuaExecutorError("session_revoked", "not_dispatched"));
90
+ const stop = () => reject(new ComputerUseExecutorError("session_revoked", "not_dispatched"));
91
91
  authority.addEventListener("abort", stop, { once: true });
92
92
  void preparing.finally(() => authority.removeEventListener("abort", stop)).catch(() => { });
93
93
  if (authority.aborted)
@@ -95,7 +95,7 @@ export async function runGuestRuntime(options) {
95
95
  }),
96
96
  ]);
97
97
  if (authority.aborted)
98
- throw new CuaExecutorError("session_revoked", "not_dispatched");
98
+ throw new ComputerUseExecutorError("session_revoked", "not_dispatched");
99
99
  reader.handoff();
100
100
  dispatcher = attachBrowserControlDispatcher({
101
101
  transport: options.transport,
@@ -105,14 +105,14 @@ export async function runGuestRuntime(options) {
105
105
  isAuthorized: () => !authority.aborted,
106
106
  ...(desktop.finishRecording ? { finishRecording: desktop.finishRecording } : {}),
107
107
  });
108
- // No await in this handoff: an immediate HELLO already has its sole receiver.
108
+ // No await in this handoff: an immediate hello already has its sole receiver.
109
109
  options.transport.write(encodeGuestBootstrap(identity, true), (error) => {
110
110
  if (error)
111
111
  terminal();
112
112
  });
113
113
  options.transport.resume();
114
114
  if (authority.aborted || options.transport.destroyed)
115
- throw new CuaExecutorError("session_revoked", "not_dispatched");
115
+ throw new ComputerUseExecutorError("session_revoked", "not_dispatched");
116
116
  options.marker("R");
117
117
  clearTimeout(timer);
118
118
  return { close, closed };
package/dist/index.d.ts CHANGED
@@ -1,12 +1,12 @@
1
- export { runPackageLab as runLab } from "./run-lab.js";
2
- export type { LabOutcome, LabResult, RunLabOptions } from "./run-lab.js";
3
- export type { LabEvent } from "./lab/run-lab-events.js";
4
- export type { ProviderContext } from "./lab/run-lab-homes.js";
5
- export { routeOf } from "./lab/plan.js";
6
- export type { LabRoute } from "./lab/plan.js";
7
- export { parseLabConfig } from "./lab/config.js";
8
- export { LAB_CONFIG_SCHEMA } from "./lab/types.js";
9
- export type { LabConfig } from "./lab/types.js";
1
+ export { runStudy } from "./run-study.js";
2
+ export type { StudyOutcome, StudyResult, RunStudyOptions } from "./run-study.js";
3
+ export type { StudyEvent } from "./study/run-study-events.js";
4
+ export type { ProviderContext } from "./study/run-study-homes.js";
5
+ export { routeOf } from "./study/plan.js";
6
+ export type { StudyRoute } from "./study/plan.js";
7
+ export { parseStudy } from "./study/config.js";
8
+ export { STUDY_SCHEMA } from "./study/types.js";
9
+ export type { StudyConfig } from "./study/types.js";
10
10
  export { verifyRun } from "./verify/verify.js";
11
11
  export type { VerifyResult } from "./verify/verify.js";
12
12
  export { renderObserver } from "./observer/render.js";
@@ -14,16 +14,16 @@ export type { ObserverResult } from "./observer/render.js";
14
14
  export type { RunBundle, RunFeedbackCandidate } from "./run/bundle.js";
15
15
  export type { ActorTrace } from "./actors/contract.js";
16
16
  export { runComputerUseLoop, stableProgressKey } from "./actors/computer-use/loop.js";
17
- export type { CuaAction, CuaExecutor, CuaLoopOptions, CuaLoopResult, CuaObservation, CuaProvider, CuaSafetyCheck, CuaTurn, CuaTurnRequest, } from "./actors/computer-use/loop.js";
17
+ export type { CuaAction as ComputerUseAction, CuaExecutor as ComputerUseExecutor, CuaLoopOptions as ComputerUseLoopOptions, CuaLoopResult as ComputerUseLoopResult, CuaObservation as ComputerUseObservation, CuaProvider as ComputerUseProvider, CuaSafetyCheck as ComputerUseSafetyCheck, CuaTurn as ComputerUseTurn, CuaTurnRequest as ComputerUseTurnRequest, } from "./actors/computer-use/loop.js";
18
18
  export type { ActorCapabilities } from "./actors/contract.js";
19
19
  export { createOpenAiResponsesProvider } from "./actors/computer-use/openai-provider.js";
20
20
  export type { OpenAiResponsesProviderOptions } from "./actors/computer-use/openai-provider.js";
21
- export { CuaAdmissionLimitError } from "./actors/computer-use/admission-limit.js";
21
+ export { ComputerUseAdmissionLimitError } from "./actors/computer-use/admission-limit.js";
22
22
  export { defaultRedactionHooks } from "./evidence/redaction.js";
23
23
  export type { RedactionHooks } from "./evidence/redaction.js";
24
24
  export type { E2BDesktopSandbox } from "./substrates/e2b/sdk.js";
25
- export { browserScorer, terminalScorer } from "./lab/adapter-scorer-loader.js";
26
- export type { AdapterScorerModule, AdapterScoringContext } from "./lab/adapter-scorer-loader.js";
27
- export type { BrowserLabScoringContext } from "./lab/adapter-extension.js";
25
+ export { browserScorer, terminalScorer } from "./study/adapter-scorer-loader.js";
26
+ export type { AdapterScorerModule, AdapterScoringContext } from "./study/adapter-scorer-loader.js";
27
+ export type { BrowserScoringContext } from "./study/adapter-extension.js";
28
28
  export type { TerminalProductScoringContext } from "./routes/terminal/types.js";
29
29
  export type { RunAdapterArtifact, RunAdapterScore } from "./run/bundle.js";
package/dist/index.js CHANGED
@@ -1,18 +1,18 @@
1
- // The library surface: what an adopter needs to run a lab, read a run, bring a participant or
1
+ // The library surface: what an adopter needs to run a study, read a run, bring a participant or
2
2
  // score a run. Everything else is internal and reached through the `humanish` bin. See
3
3
  // docs/contracts/schemas.md, "Library options", and the site's library page.
4
- // Run a lab.
5
- export { runPackageLab as runLab } from "./run-lab.js";
6
- export { routeOf } from "./lab/plan.js";
7
- export { parseLabConfig } from "./lab/config.js";
8
- export { LAB_CONFIG_SCHEMA } from "./lab/types.js";
4
+ // Run a study.
5
+ export { runStudy } from "./run-study.js";
6
+ export { routeOf } from "./study/plan.js";
7
+ export { parseStudy } from "./study/config.js";
8
+ export { STUDY_SCHEMA } from "./study/types.js";
9
9
  // Read a run.
10
10
  export { verifyRun } from "./verify/verify.js";
11
11
  export { renderObserver } from "./observer/render.js";
12
12
  // Bring a participant.
13
13
  export { runComputerUseLoop, stableProgressKey } from "./actors/computer-use/loop.js";
14
14
  export { createOpenAiResponsesProvider } from "./actors/computer-use/openai-provider.js";
15
- export { CuaAdmissionLimitError } from "./actors/computer-use/admission-limit.js";
15
+ export { ComputerUseAdmissionLimitError } from "./actors/computer-use/admission-limit.js";
16
16
  export { defaultRedactionHooks } from "./evidence/redaction.js";
17
17
  // Score a run.
18
- export { browserScorer, terminalScorer } from "./lab/adapter-scorer-loader.js";
18
+ export { browserScorer, terminalScorer } from "./study/adapter-scorer-loader.js";
@@ -1,6 +1,6 @@
1
1
  export interface ResolvedKeyFill {
2
2
  name: string;
3
- /** Human-readable source label (a path or command name) — never a value. */
3
+ /** Human-readable source label (a path or command name), never a value. */
4
4
  source: string;
5
5
  }
6
6
  export interface KeyResolutionDeps {
@@ -29,8 +29,8 @@ export interface KeySourceProbe {
29
29
  /** The command/path that would fill it when missing. */
30
30
  hint: string;
31
31
  }
32
- /** The nearest fill instruction for a missing key — used by doctor rows and appended to
33
- * *_KEYS_MISSING errors so the failure names the fix, not just the absence (#436). */
32
+ /** The nearest fill instruction for a missing key. Doctor rows use it, and it is appended to
33
+ * *_KEYS_MISSING errors so the failure names the fix. */
34
34
  export declare function missingKeyHint(name: string): string;
35
35
  /** One shared suffix for *_KEYS_MISSING messages: where discovery looked, and what fills each
36
36
  * missing key. Pure text; never values. */
@@ -47,10 +47,10 @@ export declare function probeKeySources(names: readonly string[], args: {
47
47
  /** Resolve a `humanish keys set` target: a vendor alias or a raw env name. Null = invalid. */
48
48
  export declare function resolveKeyName(vendorOrName: string): string | null;
49
49
  /** Write one key into the user store (0700 dir, 0600 file). Only allowlisted provider names
50
- * are storable (the store feeds implicit discovery — an arbitrary-name store would be an env
50
+ * are storable (the store feeds implicit discovery, so an arbitrary-name store would be an env
51
51
  * injection vector with extra steps). The value must be a single non-empty line that
52
52
  * round-trips the store's own parser byte-identically, and the write refuses symlinks at the
53
- * file and its parent directory (red-team findings). */
53
+ * file and its parent directory. */
54
54
  export declare function setUserKey(name: string, value: string, env: NodeJS.ProcessEnv, deps?: KeyResolutionDeps): {
55
55
  path: string;
56
56
  };
@@ -1,21 +1,21 @@
1
- // Provider-key discovery (#436): resolve the keys a live run needs through each vendor's
1
+ // Provider-key discovery: resolve the keys a live run needs through each vendor's
2
2
  // native chain instead of demanding a per-repo --env-file that operators hand-copy keys into.
3
3
  //
4
- // The chain, per key, FILL-ONLY (a rung never overrides anything already present):
5
- // 1. process env — including whatever --env-file just loaded (explicit always wins);
6
- // 2. `.humanish/local/provider.env` — the project-local overlay this CLI's own --help
4
+ // The chain, per key, fill-only (a rung never overrides anything already present):
5
+ // 1. process env, including whatever --env-file just loaded (explicit always wins);
6
+ // 2. `.humanish/local/provider.env`, the project-local overlay this CLI's own --help
7
7
  // examples document;
8
8
  // 3. the owning vendor's native store, where one exists:
9
9
  // E2B_API_KEY <- ~/.e2b/config.json (written by `e2b auth login`);
10
10
  // GH_TOKEN <- `gh auth token` (the gh CLI's credential chain);
11
11
  // 4. the humanish user-level store `$XDG_CONFIG_HOME/humanish/keys.env`, written only by
12
- // `humanish keys set` (0600, prompted or --stdin) — the fallback for vendors that ship
12
+ // `humanish keys set` (0600, prompted or --stdin), the fallback for vendors that ship
13
13
  // no machine chain of their own (OpenAI, Anthropic).
14
14
  //
15
15
  // Every fill is announced by key name + source, never by value. The subject app's own
16
16
  // `.env`/`.env.local` are never read: those hold product credentials, a different class
17
- // (#11); this module only reads humanish-owned files and vendor-owned stores.
18
- // `HUMANISH_STRICT_KEYS=1` disables every rung below process env (the pre-#436 behavior).
17
+ // of secret; this module only reads humanish-owned files and vendor-owned stores.
18
+ // `HUMANISH_STRICT_KEYS=1` disables every rung below process env.
19
19
  import { spawn } from "node:child_process";
20
20
  import { chmodSync, closeSync, constants as fsConstants, existsSync, ftruncateSync, lstatSync, mkdirSync, openSync, readFileSync, writeSync, } from "node:fs";
21
21
  import { homedir } from "node:os";
@@ -24,7 +24,7 @@ import { loadEnvFile } from "./env-file.js";
24
24
  /** The only names implicit discovery may fill (and `humanish keys set` may store). Everything
25
25
  * else in an overlay/store file is ignored-and-named: a repo-planted NODE_OPTIONS/LD_PRELOAD
26
26
  * must never enter process env off a file the operator did not explicitly pass (an explicit
27
- * --env-file remains the operator's own full-file load). Red-team finding, #436. */
27
+ * --env-file remains the operator's own full-file load). */
28
28
  const KNOWN_PROVIDER_KEYS = [
29
29
  "OPENAI_API_KEY",
30
30
  "ANTHROPIC_API_KEY",
@@ -52,7 +52,7 @@ export function userKeyStorePath(env, deps = {}) {
52
52
  const home = deps.homeDir ?? homedir();
53
53
  const declared = env.XDG_CONFIG_HOME?.trim();
54
54
  // The XDG spec: a relative XDG_CONFIG_HOME must be ignored. Honoring one would make the
55
- // key store cwd-relative — `humanish keys set` would write a secret into the current repo.
55
+ // key store cwd-relative: `humanish keys set` would write a secret into the current repo.
56
56
  const configHome = declared !== undefined && declared !== "" && path.isAbsolute(declared)
57
57
  ? declared
58
58
  : path.join(home, ".config");
@@ -151,16 +151,16 @@ export async function discoverProviderKeys(args) {
151
151
  const fills = [];
152
152
  const ignored = [];
153
153
  // Fill-only means presence wins, including an explicitly-set empty value: an operator who
154
- // exported OPENAI_API_KEY="" said "off", and a rung that "fixes" that has overridden them
155
- // (red-team finding). Only a truly-unset name is fillable.
154
+ // exported OPENAI_API_KEY="" said "off", and a rung that "fixes" that has overridden them.
155
+ // Only a truly-unset name is fillable.
156
156
  const fillable = (name) => env[name] === undefined;
157
157
  const fill = (name, value, source) => {
158
158
  env[name] = value;
159
159
  fills.push({ name, source });
160
160
  };
161
161
  // Rung 2: the documented project-local overlay. Parsed atomically against a scratch env so a
162
- // file loadEnvFile rejects can never half-apply (red-team finding: earlier lines used to land
163
- // in env unannounced before the parse error aborted). Only allowlisted provider names cross
162
+ // file loadEnvFile rejects can never half-apply: otherwise lines before the parse error would
163
+ // land in env unannounced. Only allowlisted provider names cross
164
164
  // from the file into the real env.
165
165
  const overlayPath = path.resolve(cwd, PROJECT_OVERLAY_RELATIVE);
166
166
  if (isRegularFile(overlayPath) && !dirIsSymlink(overlayPath)) {
@@ -196,7 +196,7 @@ export async function discoverProviderKeys(args) {
196
196
  }
197
197
  // Rung 4: the humanish user-level store, read with the same lenient parser `keys set`/`list`
198
198
  // use, so one hand-mangled line degrades to that line alone instead of silently voiding the
199
- // whole store (red-team finding: the strict parser disagreed with the store's own reader).
199
+ // whole store, as the strict parser would.
200
200
  const storePath = userKeyStorePath(env, deps);
201
201
  if (isRegularFile(storePath) && !dirIsSymlink(storePath)) {
202
202
  for (const [name, value] of readStoreEntries(storePath)) {
@@ -213,11 +213,11 @@ export async function discoverProviderKeys(args) {
213
213
  if (announced === undefined || announced.has(fill_.name))
214
214
  announce(`humanish keys: ${fill_.name} from ${fill_.source}`);
215
215
  for (const name of ignored)
216
- announce(`humanish keys: ignored non-provider name ${name} — implicit discovery fills provider keys only; pass the file via --env-file to load everything in it`);
216
+ announce(`humanish keys: ignored ${name}, which is not a provider key. Discovery loads provider keys only; pass the file with --env-file to load every name in it.`);
217
217
  return fills;
218
218
  }
219
219
  /** True when the file's parent directory is (or traverses) a symlink at its last component:
220
- * the dir-level retarget that defeats a file-level lstat check (red-team finding). */
220
+ * the dir-level retarget that defeats a file-level lstat check. */
221
221
  function dirIsSymlink(filePath) {
222
222
  try {
223
223
  return lstatSync(path.dirname(filePath)).isSymbolicLink();
@@ -230,8 +230,8 @@ function storeLabel(env, deps) {
230
230
  const home = deps.homeDir ?? homedir();
231
231
  return userKeyStorePath(env, deps).replace(home, "~");
232
232
  }
233
- /** The nearest fill instruction for a missing key — used by doctor rows and appended to
234
- * *_KEYS_MISSING errors so the failure names the fix, not just the absence (#436). */
233
+ /** The nearest fill instruction for a missing key. Doctor rows use it, and it is appended to
234
+ * *_KEYS_MISSING errors so the failure names the fix. */
235
235
  export function missingKeyHint(name) {
236
236
  switch (name) {
237
237
  case "E2B_API_KEY":
@@ -273,7 +273,7 @@ export async function probeKeySources(names, args) {
273
273
  return names.map((name) => {
274
274
  const inEnv = args.env[name] !== undefined && args.env[name]?.trim() !== "";
275
275
  // GH_TOKEN and GITHUB_TOKEN are one credential with two spellings; a doctor row that says
276
- // "missing" while GITHUB_TOKEN sits in the env would be wrong (red-team nit).
276
+ // "missing" while GITHUB_TOKEN sits in the env would be wrong.
277
277
  const aliasInEnv = name === "GH_TOKEN" &&
278
278
  args.env.GITHUB_TOKEN !== undefined &&
279
279
  args.env.GITHUB_TOKEN.trim() !== "";
@@ -294,10 +294,10 @@ export function resolveKeyName(vendorOrName) {
294
294
  return ENV_NAME.test(vendorOrName) ? vendorOrName : null;
295
295
  }
296
296
  /** Write one key into the user store (0700 dir, 0600 file). Only allowlisted provider names
297
- * are storable (the store feeds implicit discovery — an arbitrary-name store would be an env
297
+ * are storable (the store feeds implicit discovery, so an arbitrary-name store would be an env
298
298
  * injection vector with extra steps). The value must be a single non-empty line that
299
299
  * round-trips the store's own parser byte-identically, and the write refuses symlinks at the
300
- * file and its parent directory (red-team findings). */
300
+ * file and its parent directory. */
301
301
  export function setUserKey(name, value, env, deps = {}) {
302
302
  const trimmed = value.trim();
303
303
  if (trimmed.length === 0 || /[\u0000-\u001f\u007f]/.test(trimmed)) {
@@ -363,8 +363,8 @@ function readStoreEntries(storePath) {
363
363
  function writeStore(storePath, entries) {
364
364
  const body = [...entries.entries()].map(([name, value]) => `${name}=${value}`).join("\n");
365
365
  const text = body.length > 0 ? `${body}\n` : "";
366
- // O_NOFOLLOW: a symlinked keys.env must never carry the write to its target (red-team
367
- // reproduced writing a secret through the link into an attacker-chosen file).
366
+ // O_NOFOLLOW: a symlinked keys.env must never carry the write to its target, which would put a
367
+ // secret into an attacker-chosen file.
368
368
  const fd = openSync(storePath, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_NOFOLLOW, 0o600);
369
369
  try {
370
370
  ftruncateSync(fd, 0);
@@ -1,8 +1,8 @@
1
1
  import type { LoadedAnalysis } from "../analysis/types.js";
2
2
  import { type ObserverData } from "./data.js";
3
3
  /**
4
- * Resolve — and in a repo checkout, build — the Observer artifact BEFORE any run or
5
- * lab work starts. A missing artifact must cost seconds at startup, never a completed
4
+ * Resolve (and in a repo checkout, build) the Observer artifact before any run or
5
+ * study work starts. A missing artifact must cost seconds at startup, never a completed
6
6
  * session (a live participant spends real money before the render step would have noticed).
7
7
  * Unconditional on purpose: the artifact is the only renderer now, so the fail-before-
8
8
  * spend property this preflight bought under the flag matters more, not less.
@@ -11,8 +11,8 @@ const OBSERVER_DATA_PLACEHOLDER = "__HUMANISH_OBSERVER_DATA__";
11
11
  const OBSERVER_DATA_SLOT = `<script id="observer-data" type="application/json">${OBSERVER_DATA_PLACEHOLDER}</script>`;
12
12
  let cachedObserverArtifact = null;
13
13
  /**
14
- * Resolve — and in a repo checkout, build — the Observer artifact BEFORE any run or
15
- * lab work starts. A missing artifact must cost seconds at startup, never a completed
14
+ * Resolve (and in a repo checkout, build) the Observer artifact before any run or
15
+ * study work starts. A missing artifact must cost seconds at startup, never a completed
16
16
  * session (a live participant spends real money before the render step would have noticed).
17
17
  * Unconditional on purpose: the artifact is the only renderer now, so the fail-before-
18
18
  * spend property this preflight bought under the flag matters more, not less.
@@ -42,7 +42,7 @@ function loadObserverArtifact() {
42
42
  // together) must not race one `vite build` output: a reader can catch the
43
43
  // artifact half-written. A mkdir lock serializes builders across processes;
44
44
  // whoever loses the race re-checks staleness and usually just reads.
45
- // The lock lives OUTSIDE dist/ (vite empties dist mid-build) and inside an
45
+ // The lock lives outside dist/ (vite empties dist mid-build) and inside an
46
46
  // ignored path so a crashed builder cannot dirty the tree.
47
47
  const lockDir = path.join(workspaceDir, "node_modules", ".observer-build-lock");
48
48
  mkdirSync(path.dirname(lockDir), { recursive: true });
@@ -50,7 +50,7 @@ function loadObserverArtifact() {
50
50
  for (;;) {
51
51
  try {
52
52
  mkdirSync(lockDir);
53
- break; // lock acquired — this process builds
53
+ break; // lock acquired: this process builds
54
54
  }
55
55
  catch {
56
56
  if (Date.now() > deadline)
@@ -71,7 +71,7 @@ function loadObserverArtifact() {
71
71
  try {
72
72
  // NODE_ENV is forced: Vite respects a preset NODE_ENV (test, development),
73
73
  // and a dev-flavored artifact embeds jsxDEV plus the builder's absolute
74
- // filesystem paths — which the run's public-safety scan then rightly rejects.
74
+ // filesystem paths, which the run's public-safety scan then rightly rejects.
75
75
  execSync("pnpm --filter humanish-observer build", {
76
76
  cwd: repoRoot,
77
77
  stdio: ["ignore", "pipe", "inherit"],
@@ -79,7 +79,7 @@ function loadObserverArtifact() {
79
79
  });
80
80
  }
81
81
  catch {
82
- throw new Error("observer workspace build failed — run `pnpm --filter humanish-observer build` for the full output.");
82
+ throw new Error("observer workspace build failed; run `pnpm --filter humanish-observer build` to see the full output.");
83
83
  }
84
84
  }
85
85
  }
@@ -169,7 +169,7 @@ function renderObserverAppHtml(data, snapshot, analysis, assets) {
169
169
  .replace(OBSERVER_DATA_SLOT, () => `<script id="observer-data" type="application/json">${escapeJsonScript(data)}</script>`)
170
170
  .replace(/<script id="study-analysis" type="application\/json">[\s\S]*?<\/script>/, () => `<script id="study-analysis" type="application/json">${escapeJsonScript(analysis)}</script>`)
171
171
  .replace("</body>", () => `${renderExportAssets(assets)}</body>`)
172
- .replace(/<title>[^<]*<\/title>/, () => `<title>humanish Observer — ${escapeHtml(data.run.runId)}</title>`);
172
+ .replace(/<title>[^<]*<\/title>/, () => `<title>humanish Observer · ${escapeHtml(data.run.runId)}</title>`);
173
173
  }
174
174
  /** Render current packaged UI around a validated/projected Observer snapshot. */
175
175
  export function renderObserverHtml(data, options = {}) {
@@ -31,18 +31,18 @@ export interface ObserverData {
31
31
  lifecycle: RunBundle["lifecycle"];
32
32
  knownGaps: string[];
33
33
  /**
34
- * What happened to the PARTICIPANTS, with the denominator attached. `status` above collapses the
34
+ * What happened to the participants, with the denominator attached. `status` above collapses the
35
35
  * run to one word for a gate; this is the study result, and it is what the person watching
36
36
  * through the glass actually wants to know. Absent on a bundle with no participants.
37
37
  *
38
- * A viewing room that shows only vivid moments manufactures certainty from n=1 — so the count
38
+ * A viewing room that shows only vivid moments manufactures certainty from n=1, so the count
39
39
  * travels with the outcome here, always (docs/principles/three-roles.md).
40
40
  */
41
41
  participants?: RunBundle["review"]["participants"];
42
42
  /** The same thing as one readable line, so a renderer cannot accidentally show a number
43
43
  * without its denominator. */
44
44
  participantsLine?: string;
45
- /** The study's per-task completion rates (#414), when the lab declared a protocol. */
45
+ /** The study's per-task completion rates, when the study declared a protocol. */
46
46
  tasks?: RunBundle["review"]["tasks"];
47
47
  /** Pre-formatted like participantsLine, denominator on every number. */
48
48
  tasksLine?: string;
@@ -56,8 +56,8 @@ export interface ObserverData {
56
56
  };
57
57
  laneGroups: ObserverLaneGroup[];
58
58
  /**
59
- * OPTIONAL run-level cost ESTIMATE projected straight through from the bundle
60
- * (humanish.run-cost-summary.v1). Absent when the bundle carries none. The Observer LABELS every
59
+ * Optional run-level cost estimate projected straight through from the bundle
60
+ * (humanish.run-cost-summary.v1). Absent when the bundle carries none. The Observer labels every
61
61
  * figure as estimated (rates as of <asOf>) and never presents it as an authoritative charge.
62
62
  */
63
63
  cost?: RunCostSummary;
@@ -68,7 +68,7 @@ export interface ObserverData {
68
68
  publishable: false;
69
69
  note: string;
70
70
  /**
71
- * ADDITIVE + OPTIONAL (#584): the result of verification at static render or
71
+ * Additive + optional: the result of verification at static render or
72
72
  * export time. Unverified projections omit this field. The timestamp records
73
73
  * that check; it is not an assertion about subsequent file changes.
74
74
  */
@@ -33,7 +33,7 @@ export function buildObserverData(bundle, generatedAt = new Date().toISOString()
33
33
  const sim = bundle.simulations.find((candidate) => candidate.id === stream.simId) ??
34
34
  fallbackSimulation(bundle, stream);
35
35
  // A natural session can finish its protocol while the participant explicitly reports a
36
- // blocker (#690). Match the review's typed-outcome rule without rewriting the raw trace or
36
+ // blocker. Match the review's typed-outcome rule without rewriting the raw trace or
37
37
  // guessing from prose. Never turn an active or failed harness into a participant outcome.
38
38
  const status = (stream.status === "passed" || stream.status === "complete") &&
39
39
  stream.actor?.completionReason === "goal_satisfied" &&
@@ -47,7 +47,7 @@ export function buildObserverData(bundle, generatedAt = new Date().toISOString()
47
47
  status,
48
48
  sim,
49
49
  kindLabel: kindLabel(stream.kind),
50
- statusLabel: statusLabel(status),
50
+ statusLabel: statusLabel(status, bundle.mode),
51
51
  terminalPlain: stripAnsi(stream.terminal?.tail ?? ""),
52
52
  timeline: [
53
53
  ...events.filter((event) => event.simId === sim.id || event.streamId === stream.id),
@@ -229,10 +229,11 @@ function kindLabel(kind) {
229
229
  return "Summary";
230
230
  }
231
231
  }
232
- function statusLabel(status) {
232
+ /** `contract_proof_only` reads "Dry run" on a dry run; a live participant with it has no result. */
233
+ function statusLabel(status, mode) {
233
234
  switch (status) {
234
235
  case "contract_proof_only":
235
- return "Contract proof";
236
+ return mode === "dry-run" ? "Dry run" : "No verdict";
236
237
  case "preparing":
237
238
  return "Preparing";
238
239
  case "queued":
@@ -47,7 +47,7 @@ export type ExposureValidation = {
47
47
  };
48
48
  };
49
49
  /** Why `watch` refuses `--safe`, on every watch path. */
50
- export declare const WATCH_SAFE_NOT_APPLICABLE_MESSAGE = "watch streams a single live run that is never share_ready; --safe (a share_ready library filter) applies to `serve`, not `watch`. Restrict viewers with edge auth: --allow-email / --allow-domain.";
50
+ export declare const WATCH_SAFE_NOT_APPLICABLE_MESSAGE = "watch streams a single live run that is never share_ready, so --safe (a share_ready library filter for `observe --all`) cannot apply. Restrict viewers with edge auth: --allow-email / --allow-domain.";
51
51
  export declare function validateExposure(surface: ExposureSurface, request: ExposureRequest, live?: WatchLiveContext): ExposureValidation;
52
52
  export interface ExposableServer {
53
53
  readonly port: number;
@@ -1,15 +1,15 @@
1
- // Shared fail-closed exposure validation + tunnel orchestration for BOTH `serve` (a library of
2
- // finished runs) and `watch` (one live run). Exposure auth is TUNNEL-EDGE only: humanish carries no
1
+ // Shared fail-closed exposure validation + tunnel orchestration for both `serve` (a library of
2
+ // finished runs) and `watch` (one live run). Exposure auth is tunnel-edge only: humanish carries no
3
3
  // in-process auth. Exposure is admitted only behind edge auth (ngrok --oauth google, or an operator
4
- // --public-url they secure) OR, for serve, behind --safe (share_ready runs only). A live watch run
5
- // is never share_ready (raw, unverified screenshots), so watch --expose ALWAYS requires edge auth.
4
+ // --public-url they secure) or, for serve, behind --safe (share_ready runs only). A live watch run
5
+ // is never share_ready (raw, unverified screenshots), so watch --expose always requires edge auth.
6
6
  //
7
7
  // This module is pure with respect to the fail-closed matrix (validateExposure) and thin over the
8
8
  // tunnel launcher (startExposedObserver), so the CLI just maps flags in and results out.
9
9
  import { parsePublicOrigin } from "./http.js";
10
10
  import { startNgrokTunnel } from "./tunnel.js";
11
11
  /** Why `watch` refuses `--safe`, on every watch path. */
12
- export const WATCH_SAFE_NOT_APPLICABLE_MESSAGE = "watch streams a single live run that is never share_ready; --safe (a share_ready library filter) applies to `serve`, not `watch`. Restrict viewers with edge auth: --allow-email / --allow-domain.";
12
+ export const WATCH_SAFE_NOT_APPLICABLE_MESSAGE = "watch streams a single live run that is never share_ready, so --safe (a share_ready library filter for `observe --all`) cannot apply. Restrict viewers with edge auth: --allow-email / --allow-domain.";
13
13
  function code(surface, suffix) {
14
14
  return `HUMANISH_${surface.toUpperCase()}_${suffix}`;
15
15
  }
@@ -70,12 +70,12 @@ export function validateExposure(surface, request, live) {
70
70
  const warnings = [];
71
71
  if (surface === "watch") {
72
72
  // A live, in-progress run is never share_ready (raw screenshots, unverified), so --safe would
73
- // admit nothing and expose nothing: watch --expose ALWAYS requires edge auth, and the live-follow
73
+ // admit nothing and expose nothing: watch --expose always requires edge auth, and the live-follow
74
74
  // preconditions are checked first so `--dry-run`/`--detach`/`--json` fail with the clearer reason.
75
75
  if (live && (live.dryRun || live.detach || live.json)) {
76
76
  return fail("EXPOSE_REQUIRES_LIVE_FOLLOW", "watch --expose streams a live desktop over an attached follow channel; it cannot combine with --dry-run, --detach, or --json.");
77
77
  }
78
- // --safe is a share_ready LIBRARY filter for `serve`; watch streams a single live run that is
78
+ // --safe is a share_ready library filter for `serve`; watch streams a single live run that is
79
79
  // never share_ready, so --safe would silently do nothing here. Reject it rather than ignore it.
80
80
  if (request.safe) {
81
81
  return fail("SAFE_NOT_APPLICABLE", WATCH_SAFE_NOT_APPLICABLE_MESSAGE);
@@ -85,18 +85,18 @@ export function validateExposure(surface, request, live) {
85
85
  }
86
86
  }
87
87
  else {
88
- // serve: --expose must ALWAYS resolve to a reachable public origin (a tunnel or a --public-url),
88
+ // serve: --expose must always resolve to a reachable public origin (a tunnel or a --public-url),
89
89
  // even under --safe. Without one the exposed server is an unreachable loopback no-op, so fail
90
- // closed before the origin-less bind. When an origin IS present, keep the edge-auth-OR-safe gate.
90
+ // closed before the origin-less bind. When an origin is present, keep the edge-auth-or-safe gate.
91
91
  if (!request.tunnel && !publicOrigin) {
92
92
  return fail("EXPOSE_REQUIRES_ORIGIN", "--expose needs a declared public origin: pass --tunnel ngrok or --public-url <origin>.");
93
93
  }
94
94
  if (!edgeAuthed && !request.safe) {
95
- return fail("EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE", "--expose opens a public URL to local run bundles; require edge auth (--oauth google with --tunnel, or a --public-url you secure) OR --safe (share_ready runs only).");
95
+ return fail("EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE", "--expose opens a public URL to local run bundles, so it needs edge auth (--oauth google with --tunnel, or a --public-url you secure) or --safe (share_ready runs only).");
96
96
  }
97
97
  }
98
98
  if (request.oauth && request.allowEmails.length === 0 && request.allowDomains.length === 0) {
99
- warnings.push("ngrok --oauth google with NO --allow-email/--allow-domain lets ANY Google account that reaches the URL in; add at least one allow rule to restrict who can watch.");
99
+ warnings.push("ngrok --oauth google without --allow-email or --allow-domain lets in any Google account that reaches the URL. Add at least one allow rule to choose who can watch.");
100
100
  }
101
101
  const mode = edgeAuthed ? "exposed" : "share-safe-open";
102
102
  return {
@@ -1,4 +1,4 @@
1
- // Shared HTTP hardening primitives for the serve surfaces. Extracted here so BOTH the live
1
+ // Shared HTTP hardening primitives for the serve surfaces. Extracted here so both the live
2
2
  // Observer server (src/observer/render.ts) and the run-library server
3
3
  // (src/observer/serve.ts) can enforce the identical Host allowlist + security-header posture
4
4
  // without a module cycle. This file imports nothing from the serve modules.
@@ -9,10 +9,12 @@ export interface LibraryHistory {
9
9
  /** Current contained status-record observation, separate from the evidence verdict. */
10
10
  runtimeState?: "running" | "finished" | "interrupted" | "unknown";
11
11
  streamCount: number;
12
- /** Labeled run-total cost ESTIMATE (null when the run carries no cost summary). */
12
+ /** Labeled run-total cost estimate (null when the run carries no cost summary). */
13
13
  estimatedCostUsd: number | null;
14
14
  costRatesAsOf: string | null;
15
15
  costPlaceholder: boolean;
16
+ /** The row's cost text: participants and desktops plus the run's analyses (src/run/run-cost.ts). */
17
+ costLabel: string | null;
16
18
  }>;
17
19
  }
18
20
  export interface LibraryRenderOptions {
@@ -7,8 +7,8 @@ const STATUS_TONES = {
7
7
  };
8
8
  export function renderLibraryHtml(history, opts) {
9
9
  const emptyState = opts.safe
10
- ? "No share_ready runs yet — run `humanish verify` to see why."
11
- : "No runs yet — run `humanish watch` to create one.";
10
+ ? "No share_ready runs yet. Run `humanish verify` to see why."
11
+ : "No runs yet. Run `humanish watch` to create one.";
12
12
  return `<!doctype html>
13
13
  <html lang="en" data-theme="dark">
14
14
  <head>
@@ -39,6 +39,7 @@ function modeLabel(opts) {
39
39
  const auth = opts.mode === "exposed" ? "edge-authed" : opts.mode === "share-safe-open" ? "open" : "loopback";
40
40
  return opts.safe ? `${auth} · share_ready only` : auth;
41
41
  }
42
+ // prose-check: script (the library page's CSS)
42
43
  function libraryCss() {
43
44
  return `
44
45
  :root { color-scheme: dark; }
@@ -80,6 +81,7 @@ main { padding: 1rem 1.1rem 3rem; max-width: 44rem; margin: 0 auto; }
80
81
  .empty { color: #9aa3b2; font-size: 0.85rem; padding: 2rem 0; text-align: center; }
81
82
  `;
82
83
  }
84
+ // prose-check: script (the library page's JavaScript)
83
85
  function libraryClientJs() {
84
86
  const tones = JSON.stringify(STATUS_TONES);
85
87
  return `
@@ -125,7 +127,10 @@ function libraryClientJs() {
125
127
  var metaBits = [run.mode || "unknown", run.streamCount + " participants", run.createdAt || ""];
126
128
  // Labeled cost token: ALWAYS "~$X est." (never a bare "$X"), so the library never implies an
127
129
  // authoritative charge. Null = omitted (advisory, fail-open on display).
128
- if (run.estimatedCostUsd != null) {
130
+ if (run.costLabel) {
131
+ metaBits.push(run.costLabel + (run.costPlaceholder ? " (placeholder)" : ""));
132
+ if (run.costRatesAsOf) meta.title = "estimated, rates as of " + run.costRatesAsOf;
133
+ } else if (run.estimatedCostUsd != null) {
129
134
  metaBits.push("~$" + Number(run.estimatedCostUsd).toFixed(2) + " est." + (run.costPlaceholder ? " (placeholder)" : ""));
130
135
  if (run.costRatesAsOf) meta.title = "estimated, rates as of " + run.costRatesAsOf;
131
136
  }
@@ -1,9 +1,10 @@
1
1
  // One loopback bind for every humanish server, with the one failure people actually hit named.
2
2
  //
3
- // `listen EADDRINUSE` used to surface as HUMANISH_UNEXPECTED, the command-boundary catch-all for
4
- // "a handler threw" (#484). Something already serving on the port is the most expected condition
5
- // a serve command has: a second session, a forgotten background one, someone's dev server. It only
6
- // bites with an explicit --port, which is exactly when a person is asking for a stable address.
3
+ // `listen EADDRINUSE` becomes PortInUseError: HUMANISH_UNEXPECTED, the command-boundary catch-all
4
+ // for "a handler threw", would misname it. Something already serving on the port is the most
5
+ // expected condition a serve command has: a second session, a forgotten background one, someone's
6
+ // dev server. It only bites with an explicit --port, which is exactly when a person is asking for a
7
+ // stable address.
7
8
  export class PortInUseError extends Error {
8
9
  port;
9
10
  holder;
@@ -48,7 +48,7 @@ export declare function serveObserver(result: ObserverResult, options?: Observer
48
48
  export interface DesktopOpenerHost {
49
49
  platform: NodeJS.Platform;
50
50
  env: NodeJS.ProcessEnv;
51
- /** Whether an executable with this name is on the host's PATH. */
51
+ /** Whether an executable with this name is on the host's `PATH`. */
52
52
  onPath(name: string): boolean;
53
53
  }
54
54
  /**