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,92 +1,80 @@
1
- import { labPersonaIds, resolveCommittedPersonasForCwd } from "./persona-resolve.js";
1
+ import { studyPersonaIds, resolveCommittedPersonasForCwd } from "./persona-resolve.js";
2
2
  import { personaBrief, PersonaConfigError } from "./persona.js";
3
3
  import { constants } from "node:fs";
4
4
  import { lstat, open, readdir, realpath } from "node:fs/promises";
5
5
  import path from "node:path";
6
6
  import { parse } from "yaml";
7
- import { parseLabConfig } from "./config.js";
8
- import {} from "./types.js";
7
+ import { parseStudy } from "./config.js";
8
+ import { V2_SCHEMA } from "./types.js";
9
9
  import { assertPreparedSelectedOutputDirectory, assertSafeOutputPathSegment, prepareSelectedOutputDirectory, readContainedRegularFile, } from "../run/contained-output.js";
10
10
  import { isNodeError } from "../run/type-guards.js";
11
- const LAB_LIST_SCHEMA = "humanish.lab-list.v1";
12
- const LAB_INSPECT_SCHEMA = "humanish.lab-inspect.v1";
13
- const committedLabsDir = path.join("humanish", "labs");
14
- const ignoredLabsDirs = [
15
- path.join(".humanish", "labs"),
16
- path.join(".humanish", "local", "labs"),
17
- ];
18
- export async function resolveLabManifest(cwd, lab) {
11
+ import { studyFileCandidates, STUDY_DIRECTORIES } from "./files.js";
12
+ const STUDY_LIST_SCHEMA = "humanish.study-list.v1";
13
+ const STUDY_SHOW_SCHEMA = "humanish.study-show.v1";
14
+ export async function resolveStudyManifest(cwd, study) {
19
15
  const resolvedCwd = path.resolve(cwd);
20
16
  const warnings = [];
21
17
  const projectRoot = await bindProjectRoot(resolvedCwd);
22
18
  if (!projectRoot) {
23
- return invalidLab({ cwd: resolvedCwd, lab, warnings }, "Project root failed containment validation.");
19
+ return invalidStudy({ cwd: resolvedCwd, study, warnings }, "Project root failed containment validation.");
24
20
  }
25
- if (labLooksLikePath(lab)) {
26
- const requestedPath = path.resolve(resolvedCwd, lab);
21
+ if (studyLooksLikePath(study)) {
22
+ const requestedPath = path.resolve(resolvedCwd, study);
27
23
  const read = await readExplicitManifest(projectRoot, requestedPath);
28
24
  if (read.status === "missing") {
29
- return labNotFound(resolvedCwd, lab, warnings);
25
+ return studyNotFound(resolvedCwd, study, warnings);
30
26
  }
31
27
  if (read.status === "unsafe") {
32
- return invalidLab({ cwd: resolvedCwd, lab, warnings }, read.message);
28
+ return invalidStudy({ cwd: resolvedCwd, study, warnings }, read.message);
33
29
  }
34
- return parseResolvedLab({
30
+ return parseResolvedStudy({
35
31
  cwd: resolvedCwd,
36
- lab,
32
+ study,
37
33
  origin: "explicit",
38
34
  path: requestedPath,
39
35
  warnings,
40
36
  contents: read.contents,
41
37
  });
42
38
  }
43
- const candidates = [
44
- { origin: "committed", relativePath: path.join(committedLabsDir, `${lab}.yaml`) },
45
- { origin: "committed", relativePath: path.join(committedLabsDir, `${lab}.yml`) },
46
- ...ignoredLabsDirs.flatMap((dir) => [
47
- { origin: "ignored", relativePath: path.join(dir, `${lab}.yaml`) },
48
- { origin: "ignored", relativePath: path.join(dir, `${lab}.yml`) },
49
- ]),
50
- ];
51
- for (const candidate of candidates) {
52
- const requestedPath = path.join(resolvedCwd, candidate.relativePath);
39
+ // The studies/ directories are read in order. A name found only under a labs/ directory is
40
+ // refused with what to do about it, so the user is not told the study does not exist.
41
+ for (const candidate of studyFileCandidates(study)) {
53
42
  const read = await readManagedManifest(projectRoot, candidate.relativePath);
54
43
  if (read.status === "missing") {
55
44
  continue;
56
45
  }
57
46
  if (read.status === "unsafe") {
58
- return invalidLab({ cwd: resolvedCwd, lab, warnings }, read.message);
47
+ return invalidStudy({ cwd: resolvedCwd, study, warnings }, read.message);
59
48
  }
60
- return parseResolvedLab({
49
+ return parseResolvedStudy({
61
50
  cwd: resolvedCwd,
62
- lab,
63
- origin: candidate.origin,
64
- path: requestedPath,
51
+ study,
52
+ origin: candidate.directory.origin,
53
+ path: path.join(resolvedCwd, candidate.relativePath),
65
54
  warnings,
66
55
  contents: read.contents,
56
+ retiredDirectory: candidate.directory.family === "labs",
67
57
  });
68
58
  }
69
- return labNotFound(resolvedCwd, lab, warnings);
59
+ return studyNotFound(resolvedCwd, study, warnings);
70
60
  }
71
- export async function listLabManifests(cwd) {
61
+ export async function listStudyManifests(cwd) {
72
62
  const resolvedCwd = path.resolve(cwd);
73
63
  const warnings = [];
74
- const labs = new Map();
64
+ const retired = [];
65
+ const listed = new Map();
75
66
  const projectRoot = await bindProjectRoot(resolvedCwd);
76
67
  if (!projectRoot) {
77
68
  return {
78
- schema: LAB_LIST_SCHEMA,
69
+ schema: STUDY_LIST_SCHEMA,
79
70
  ok: true,
80
71
  cwd: resolvedCwd,
81
- labs: [],
82
- warnings: ["Project root failed containment validation; managed lab manifests were skipped."],
72
+ studies: [],
73
+ retired: [],
74
+ warnings: ["Project root failed containment validation; study files were skipped."],
83
75
  };
84
76
  }
85
- const dirs = [
86
- { origin: "committed", relativeDir: committedLabsDir },
87
- ...ignoredLabsDirs.map((relativeDir) => ({ origin: "ignored", relativeDir })),
88
- ];
89
- for (const entry of dirs) {
77
+ for (const entry of STUDY_DIRECTORIES) {
90
78
  const directory = await bindManagedDirectory(projectRoot, entry.relativeDir);
91
79
  if (directory.status === "missing") {
92
80
  continue;
@@ -101,39 +89,49 @@ export async function listLabManifests(cwd) {
101
89
  await assertManagedDirectoryBinding(projectRoot, entry.relativeDir, directory.binding);
102
90
  }
103
91
  catch {
104
- warnings.push(`${entry.relativeDir}: unsafe managed lab directory; skipped.`);
92
+ warnings.push(`${entry.relativeDir}: unsafe managed study directory; skipped.`);
105
93
  continue;
106
94
  }
107
95
  for (const name of names.filter((value) => value.endsWith(".yaml") || value.endsWith(".yml"))) {
108
96
  let relativePath;
109
97
  try {
110
- assertSafeOutputPathSegment(name, "Lab manifest name");
98
+ assertSafeOutputPathSegment(name, "Study file name");
111
99
  relativePath = path.join(entry.relativeDir, name);
112
100
  }
113
101
  catch {
114
- warnings.push(`${entry.relativeDir}: unsafe lab manifest name; skipped.`);
102
+ warnings.push(`${entry.relativeDir}: unsafe study file name; skipped.`);
115
103
  continue;
116
104
  }
117
105
  const requestedPath = path.join(resolvedCwd, relativePath);
118
106
  const read = await readManagedManifest(projectRoot, relativePath);
119
107
  if (read.status !== "ok") {
120
- warnings.push(`${relativeToCwd(resolvedCwd, requestedPath)}: ${read.status === "unsafe" ? read.message : "manifest changed while it was listed; skipped."}`);
108
+ warnings.push(`${relativeToCwd(resolvedCwd, requestedPath)}: ${read.status === "unsafe" ? read.message : "study file changed while it was listed; skipped."}`);
121
109
  continue;
122
110
  }
123
- const parsed = parseResolvedLab({
111
+ const parsed = parseResolvedStudy({
124
112
  cwd: resolvedCwd,
125
- lab: name.replace(/\.(?:ya?ml)$/i, ""),
113
+ study: name.replace(/\.(?:ya?ml)$/i, ""),
126
114
  origin: entry.origin,
127
115
  path: requestedPath,
128
116
  warnings: [],
129
117
  contents: read.contents,
118
+ retiredDirectory: entry.family === "labs",
130
119
  });
131
120
  if (!parsed.ok) {
132
- warnings.push(`${relativeToCwd(resolvedCwd, requestedPath)}: ${parsed.error.message}`);
121
+ const { code, message } = parsed.error;
122
+ if (code === "HUMANISH_STUDY_V2_UNSUPPORTED" ||
123
+ code === "HUMANISH_STUDY_RETIRED_DIRECTORY") {
124
+ // The message already starts with the file's path.
125
+ retired.push({ path: relativeToCwd(resolvedCwd, requestedPath), code, message });
126
+ warnings.push(message);
127
+ }
128
+ else {
129
+ warnings.push(`${relativeToCwd(resolvedCwd, requestedPath)}: ${message}`);
130
+ }
133
131
  continue;
134
132
  }
135
133
  const key = `${parsed.config.id}:${entry.origin}:${relativeToCwd(resolvedCwd, requestedPath)}`;
136
- labs.set(key, {
134
+ listed.set(key, {
137
135
  id: parsed.config.id,
138
136
  source: parsed.config.subject.source,
139
137
  origin: entry.origin,
@@ -147,71 +145,76 @@ export async function listLabManifests(cwd) {
147
145
  }
148
146
  }
149
147
  return {
150
- schema: LAB_LIST_SCHEMA,
148
+ schema: STUDY_LIST_SCHEMA,
151
149
  ok: true,
152
150
  cwd: resolvedCwd,
153
- labs: [...labs.values()].sort((left, right) => `${left.origin}:${left.id}`.localeCompare(`${right.origin}:${right.id}`)),
151
+ studies: [...listed.values()].sort((left, right) => `${left.origin}:${left.id}`.localeCompare(`${right.origin}:${right.id}`)),
152
+ retired,
154
153
  warnings,
155
154
  };
156
155
  }
157
- export async function inspectLabManifest(cwd, lab) {
158
- const resolved = await resolveLabManifest(cwd, lab);
156
+ export async function inspectStudyManifest(cwd, study) {
157
+ const resolved = await resolveStudyManifest(cwd, study);
159
158
  if (!resolved.ok) {
160
159
  return {
161
- schema: LAB_INSPECT_SCHEMA,
160
+ schema: STUDY_SHOW_SCHEMA,
162
161
  ok: false,
163
162
  cwd: resolved.cwd,
164
- lab,
163
+ study,
165
164
  error: resolved.error,
166
165
  warnings: resolved.warnings,
167
166
  };
168
167
  }
169
168
  let personaResolution;
170
169
  try {
171
- personaResolution = await resolveCommittedPersonasForCwd(cwd, labPersonaIds(resolved.config));
170
+ personaResolution = await resolveCommittedPersonasForCwd(cwd, studyPersonaIds(resolved.config));
172
171
  }
173
172
  catch (error) {
174
173
  if (!(error instanceof PersonaConfigError))
175
174
  throw error;
176
175
  return {
177
- schema: LAB_INSPECT_SCHEMA,
176
+ schema: STUDY_SHOW_SCHEMA,
178
177
  ok: false,
179
178
  cwd: path.resolve(cwd),
180
- lab,
181
- error: { code: "HUMANISH_LAB_INVALID", message: error.message },
179
+ study,
180
+ error: { code: "HUMANISH_STUDY_INVALID", message: error.message },
182
181
  warnings: resolved.warnings,
183
182
  };
184
183
  }
185
184
  return {
186
- schema: LAB_INSPECT_SCHEMA,
187
- personas: labPersonaIds(resolved.config).map((id) => {
185
+ schema: STUDY_SHOW_SCHEMA,
186
+ personas: studyPersonaIds(resolved.config).map((id) => {
188
187
  const persona = personaResolution.personas.get(id);
189
188
  return { id, resolved: !!persona, ...(persona ? { brief: personaBrief(persona) } : {}) };
190
189
  }),
191
190
  ok: true,
192
191
  cwd: path.resolve(cwd),
193
- lab,
192
+ study,
194
193
  config: resolved.config,
195
194
  origin: resolved.origin,
196
195
  path: resolved.path,
197
196
  warnings: [...resolved.warnings, ...personaResolution.warnings],
198
197
  };
199
198
  }
200
- function parseResolvedLab(args) {
199
+ function parseResolvedStudy(args) {
201
200
  let raw;
202
201
  try {
203
202
  raw = parse(args.contents);
204
203
  }
205
204
  catch (error) {
206
- return invalidLab(args, error instanceof Error ? error.message : "Lab YAML could not be parsed.");
205
+ return invalidStudy(args, error instanceof Error ? error.message : "The study file's YAML could not be parsed.");
206
+ }
207
+ const refusal = retiredStudyRefusal(relativeToCwd(args.cwd, args.path).replace(/\\/g, "/"), raw, args.retiredDirectory === true);
208
+ if (refusal !== undefined) {
209
+ return { ok: false, cwd: args.cwd, study: args.study, error: refusal, warnings: args.warnings };
207
210
  }
208
- const parsed = parseLabConfig(raw);
211
+ const parsed = parseStudy(raw);
209
212
  if (!parsed.ok) {
210
- return invalidLab(args, parsed.error.message);
213
+ return invalidStudy(args, parsed.error.message);
211
214
  }
212
215
  const warnings = [...args.warnings, ...parsed.warnings];
213
216
  if (args.path.endsWith(".yml")) {
214
- warnings.push("Prefer .yaml for humanish-authored lab source; .yml is accepted for compatibility only.");
217
+ warnings.push("Prefer .yaml for study files; .yml is accepted for compatibility only.");
215
218
  }
216
219
  return {
217
220
  ok: true,
@@ -221,6 +224,39 @@ function parseResolvedLab(args) {
221
224
  warnings,
222
225
  };
223
226
  }
227
+ /**
228
+ * Why humanish refuses this file, or undefined. A humanish.lab.v2 file is refused wherever it is,
229
+ * and `humanish migrate` converts it (and moves it out of a labs/ directory). A v3 file is refused
230
+ * only when it was found by name in a labs/ directory; an explicit path to it still runs.
231
+ */
232
+ function retiredStudyRefusal(relativePath, raw, retiredDirectory) {
233
+ const directory = path.posix.dirname(relativePath);
234
+ const studies = directory.replace(/labs$/, "studies");
235
+ // migrate moves a v2 file out of a labs/ directory however the file was named.
236
+ const inStudies = STUDY_DIRECTORIES.some((entry) => entry.family === "labs" && entry.relativeDir.replace(/\\/g, "/") === directory);
237
+ // migrate refuses a path outside its --cwd, so a file outside the project gets its own directory.
238
+ const migrate = path.isAbsolute(relativePath)
239
+ ? `humanish migrate --cwd ${shellPath(path.dirname(relativePath))} ${shellPath(path.basename(relativePath))}`
240
+ : `humanish migrate ${shellPath(relativePath)}`;
241
+ if (typeof raw === "object" && raw !== null && raw.schema === V2_SCHEMA)
242
+ return {
243
+ code: "HUMANISH_STUDY_V2_UNSUPPORTED",
244
+ message: inStudies
245
+ ? `${relativePath} is a humanish.lab.v2 file in ${directory}/, which humanish no longer reads. Run ${migrate} to convert it and move it to ${studies}/.`
246
+ : `${relativePath} is a humanish.lab.v2 file, which humanish no longer reads. Run ${migrate} to convert it.`,
247
+ };
248
+ if (retiredDirectory)
249
+ return {
250
+ code: "HUMANISH_STUDY_RETIRED_DIRECTORY",
251
+ message: `${relativePath} is in ${directory}/, which humanish no longer reads. Move it to ${studies}/.`,
252
+ };
253
+ return undefined;
254
+ }
255
+ /** A path as one shell argument: quoted when the shell would split or expand it, never an option. */
256
+ function shellPath(value) {
257
+ const arg = value.startsWith("-") ? `./${value}` : value;
258
+ return /^[\w@%+=:,./-]+$/.test(arg) ? arg : `'${arg.replace(/'/g, "'\\''")}'`;
259
+ }
224
260
  async function bindProjectRoot(cwd) {
225
261
  try {
226
262
  const lexical = await lstat(cwd);
@@ -242,7 +278,7 @@ async function readManagedManifest(projectRoot, relativePath) {
242
278
  if (!contents) {
243
279
  return {
244
280
  status: "unsafe",
245
- message: "Managed lab manifest changed or failed containment validation.",
281
+ message: "The study file changed or failed containment validation.",
246
282
  };
247
283
  }
248
284
  return { status: "ok", contents: contents.toString("utf8") };
@@ -264,7 +300,7 @@ async function readExplicitManifest(projectRoot, requestedPath) {
264
300
  if (!before.isFile() || before.isSymbolicLink() || before.nlink !== 1n) {
265
301
  return {
266
302
  status: "unsafe",
267
- message: "Explicit lab manifest must resolve to a single-link regular file.",
303
+ message: "The study file path must resolve to a single-link regular file.",
268
304
  };
269
305
  }
270
306
  const handle = await open(physicalPath, constants.O_RDONLY | constants.O_NOFOLLOW);
@@ -276,7 +312,7 @@ async function readExplicitManifest(projectRoot, requestedPath) {
276
312
  opened.ino !== before.ino) {
277
313
  return {
278
314
  status: "unsafe",
279
- message: "Explicit lab manifest changed before it could be read safely.",
315
+ message: "The study file changed before it could be read safely.",
280
316
  };
281
317
  }
282
318
  const contents = await handle.readFile();
@@ -293,7 +329,7 @@ async function readExplicitManifest(projectRoot, requestedPath) {
293
329
  after.ino !== before.ino) {
294
330
  return {
295
331
  status: "unsafe",
296
- message: "Explicit lab manifest changed while it was being read.",
332
+ message: "The study file changed while it was being read.",
297
333
  };
298
334
  }
299
335
  return { status: "ok", contents: contents.toString("utf8") };
@@ -303,7 +339,7 @@ async function readExplicitManifest(projectRoot, requestedPath) {
303
339
  }
304
340
  }
305
341
  catch {
306
- return { status: "unsafe", message: "Explicit lab manifest failed containment validation." };
342
+ return { status: "unsafe", message: "The study file path failed containment validation." };
307
343
  }
308
344
  }
309
345
  async function bindManagedDirectory(projectRoot, relativePath) {
@@ -327,7 +363,7 @@ async function inspectManagedPath(projectRoot, relativePath, expectedKind) {
327
363
  const segments = relativePath.replace(/\\/g, "/").split("/");
328
364
  let current = projectRoot.physicalPath;
329
365
  for (const [index, segment] of segments.entries()) {
330
- assertSafeOutputPathSegment(segment, "Managed lab path segment");
366
+ assertSafeOutputPathSegment(segment, "Study file path segment");
331
367
  current = path.join(current, segment);
332
368
  let stats;
333
369
  try {
@@ -341,18 +377,21 @@ async function inspectManagedPath(projectRoot, relativePath, expectedKind) {
341
377
  }
342
378
  const leaf = index === segments.length - 1;
343
379
  if (stats.isSymbolicLink()) {
344
- return { status: "unsafe", message: "Managed lab paths must not contain symbolic links." };
380
+ return {
381
+ status: "unsafe",
382
+ message: "Study directory paths must not contain symbolic links.",
383
+ };
345
384
  }
346
385
  if (!leaf && !stats.isDirectory()) {
347
- return { status: "unsafe", message: "Managed lab path parents must be directories." };
386
+ return { status: "unsafe", message: "Study file path parents must be directories." };
348
387
  }
349
388
  if (leaf && expectedKind === "directory" && !stats.isDirectory()) {
350
- return { status: "unsafe", message: "Managed lab directory has an unsafe file type." };
389
+ return { status: "unsafe", message: "A study directory has an unsafe file type." };
351
390
  }
352
391
  if (leaf && expectedKind === "file" && (!stats.isFile() || stats.nlink !== 1n)) {
353
392
  return {
354
393
  status: "unsafe",
355
- message: "Managed lab manifest must be a single-link regular file.",
394
+ message: "A study file must be a single-link regular file.",
356
395
  };
357
396
  }
358
397
  if (leaf) {
@@ -368,7 +407,7 @@ async function inspectManagedPath(projectRoot, relativePath, expectedKind) {
368
407
  }
369
408
  }
370
409
  catch {
371
- return { status: "unsafe", message: "Managed lab path failed containment validation." };
410
+ return { status: "unsafe", message: "A study file path failed containment validation." };
372
411
  }
373
412
  return { status: "missing" };
374
413
  }
@@ -380,39 +419,39 @@ async function assertManagedDirectoryBinding(projectRoot, relativePath, binding)
380
419
  current.birthtimeNs !== binding.birthtimeNs ||
381
420
  current.dev !== binding.dev ||
382
421
  current.ino !== binding.ino) {
383
- throw new Error("Managed lab directory identity changed after it was bound.");
422
+ throw new Error("Managed study directory identity changed after it was bound.");
384
423
  }
385
424
  }
386
- function invalidLab(args, message) {
425
+ function invalidStudy(args, message) {
387
426
  return {
388
427
  ok: false,
389
428
  cwd: args.cwd,
390
- lab: args.lab,
429
+ study: args.study,
391
430
  error: {
392
- code: "HUMANISH_LAB_INVALID",
431
+ code: "HUMANISH_STUDY_INVALID",
393
432
  message,
394
433
  },
395
434
  warnings: args.warnings,
396
435
  };
397
436
  }
398
- function labNotFound(cwd, lab, warnings) {
437
+ function studyNotFound(cwd, study, warnings) {
399
438
  return {
400
439
  ok: false,
401
440
  cwd,
402
- lab,
441
+ study,
403
442
  error: {
404
- code: "HUMANISH_LAB_NOT_FOUND",
405
- message: `Lab not found: ${lab}. Look in humanish/labs/ or pass a .yaml path.`,
443
+ code: "HUMANISH_STUDY_NOT_FOUND",
444
+ message: `Study not found: ${study}. Look in humanish/studies/, or pass a .yaml path.`,
406
445
  },
407
446
  warnings,
408
447
  };
409
448
  }
410
- function labLooksLikePath(lab) {
411
- return (lab.endsWith(".yaml") ||
412
- lab.endsWith(".yml") ||
413
- lab.includes("/") ||
414
- lab.includes("\\") ||
415
- lab.startsWith("."));
449
+ function studyLooksLikePath(study) {
450
+ return (study.endsWith(".yaml") ||
451
+ study.endsWith(".yml") ||
452
+ study.includes("/") ||
453
+ study.includes("\\") ||
454
+ study.startsWith("."));
416
455
  }
417
456
  function relativeToCwd(cwd, filePath) {
418
457
  const relative = path.relative(cwd, filePath);
@@ -1,12 +1,12 @@
1
1
  import { type LocalRuntimeStatus } from "../substrates/local/runtime.js";
2
- import type { LabConfig } from "./types.js";
2
+ import type { StudyConfig } from "./types.js";
3
3
  import type { PlanResult } from "./plan-types.js";
4
4
  import type { DetectedLocalAgent } from "../actors/local-agent/cli.js";
5
5
  import type { ReasoningEffort } from "../actors/reasoning-effort.js";
6
- import type { DoctorResult } from "../cli/doctor.js";
7
- import { type CodexInstallation } from "../actors/codex/qualified-versions.js";
6
+ import type { DoctorCheckDraft } from "../cli/doctor.js";
7
+ import { type CodexInstallation } from "../actors/codex/codex-admission.js";
8
8
  import type { RefusedCodexExecutable } from "../actors/codex/restricted-executable.js";
9
- type Check = DoctorResult["checks"][number];
9
+ type Check = DoctorCheckDraft;
10
10
  /**
11
11
  * Read-only Codex account readiness. An unadmitted CLI also reports the release it found, and an
12
12
  * unavailable one the file humanish found and turned down.
@@ -31,7 +31,7 @@ type HostedCodexReadiness = CodexReadiness & {
31
31
  };
32
32
  /**
33
33
  * The hosted participant check: the operator-auth launch to an ephemeral thread, with no turn,
34
- * using the lab's declared model and reasoning effort as a run would.
34
+ * using the study's declared model and reasoning effort as a run would.
35
35
  */
36
36
  declare function hostedCodexReadiness(env: NodeJS.ProcessEnv, actor: {
37
37
  model?: string;
@@ -42,9 +42,9 @@ export declare function localCodexParticipantCheck(args: {
42
42
  env: NodeJS.ProcessEnv;
43
43
  readiness?: (env: NodeJS.ProcessEnv) => Promise<CodexReadiness>;
44
44
  }): Promise<Check>;
45
- export interface LabSetupCheckArgs {
45
+ export interface StudySetupCheckArgs {
46
46
  cwd: string;
47
- lab: string;
47
+ study: string;
48
48
  env: NodeJS.ProcessEnv;
49
49
  agents: DetectedLocalAgent[];
50
50
  keyPresent: (name: string) => boolean;
@@ -56,19 +56,26 @@ export interface LabSetupCheckArgs {
56
56
  }
57
57
  /**
58
58
  * Setup checks only: no model turn, browser or desktop creation. CLI startup may use the network.
59
- * `keys` are the keys a live run requires. `reads` are the provider keys the lab is known to read,
60
- * required or not; it is undefined when that is unknown: the lab does not plan, or a declared
59
+ * `keys` are the keys a live run requires. `reads` are the provider keys the study is known to read,
60
+ * required or not; it is undefined when that is unknown: the study does not plan, or a declared
61
61
  * scorer's host code may read any key.
62
62
  */
63
- export declare function labSetupChecks(args: LabSetupCheckArgs): Promise<{
63
+ export declare function studySetupChecks(args: StudySetupCheckArgs): Promise<{
64
64
  desktop: boolean;
65
65
  keys: string[];
66
66
  reads?: ReadonlySet<string>;
67
67
  checks: Check[];
68
68
  }>;
69
69
  /**
70
- * The lab planned with no run options, so its own scenario mode decides dry or live. Doctor and the
70
+ * The ids of the project's labs that need each provider key for a live run, from the same plan
71
+ * `doctor --study` reads. Each listed manifest resolves by its path, since a file name need not match
72
+ * the id inside. A study that runs dry, that the plain CLI cannot run, or that does not plan needs
73
+ * none.
74
+ */
75
+ export declare function studiesByRequiredKey(cwd: string, keyPresent: (name: string) => boolean): Promise<Map<string, string[]>>;
76
+ /**
77
+ * The study planned with no run options, so its own scenario mode decides dry or live. Doctor and the
71
78
  * TUI read a live run's keys and subject env from this plan's requirements.
72
79
  */
73
- export declare function planCliRun(config: LabConfig, cwd: string): Promise<PlanResult>;
80
+ export declare function planCliRun(config: StudyConfig, cwd: string): Promise<PlanResult>;
74
81
  export {};