humanish 0.106.1 → 0.108.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (668) hide show
  1. package/ARCHITECTURE.md +38 -32
  2. package/CHANGELOG.md +28 -0
  3. package/CONTEXT.md +51 -41
  4. package/README.md +152 -174
  5. package/SECURITY.md +16 -26
  6. package/TELEMETRY.md +8 -6
  7. package/dist/actors/affordance.d.ts +4 -4
  8. package/dist/actors/affordance.js +12 -12
  9. package/dist/actors/agent-session.d.ts +2 -2
  10. package/dist/actors/agent-session.js +7 -7
  11. package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
  12. package/dist/actors/codex/app-server-actor-trace.js +1 -1
  13. package/dist/actors/codex/app-server-client.js +2 -1
  14. package/dist/actors/codex/app-server-trace.d.ts +0 -1
  15. package/dist/actors/codex/app-server-trace.js +1 -3
  16. package/dist/actors/codex/app-server-ui.js +1 -1
  17. package/dist/actors/codex/app-server.js +2 -1
  18. package/dist/actors/codex/codex-admission.d.ts +91 -0
  19. package/dist/actors/codex/codex-admission.js +150 -0
  20. package/dist/actors/codex/protocol-compat.d.ts +27 -0
  21. package/dist/actors/codex/protocol-compat.js +357 -0
  22. package/dist/actors/codex/protocol-contract.d.ts +61 -0
  23. package/dist/actors/codex/protocol-contract.js +471 -0
  24. package/dist/actors/codex/restricted-executable.d.ts +28 -4
  25. package/dist/actors/codex/restricted-executable.js +104 -29
  26. package/dist/actors/codex/restricted-launch.d.ts +9 -2
  27. package/dist/actors/codex/restricted-launch.js +43 -4
  28. package/dist/actors/codex/restricted-notifications.d.ts +101 -0
  29. package/dist/actors/codex/restricted-notifications.js +277 -0
  30. package/dist/actors/codex/restricted-participant.d.ts +30 -0
  31. package/dist/actors/codex/restricted-participant.js +66 -6
  32. package/dist/actors/codex/restricted-policy.d.ts +11 -3
  33. package/dist/actors/codex/restricted-policy.js +2 -2
  34. package/dist/actors/codex/restricted-session.d.ts +16 -3
  35. package/dist/actors/codex/restricted-session.js +60 -22
  36. package/dist/actors/codex/restricted-transport.d.ts +29 -0
  37. package/dist/actors/codex/restricted-transport.js +139 -27
  38. package/dist/actors/codex/restricted-turn.d.ts +19 -4
  39. package/dist/actors/codex/restricted-turn.js +43 -30
  40. package/dist/actors/computer-use/actor.d.ts +17 -17
  41. package/dist/actors/computer-use/actor.js +6 -6
  42. package/dist/actors/computer-use/admission-limit.d.ts +1 -1
  43. package/dist/actors/computer-use/admission-limit.js +1 -1
  44. package/dist/actors/computer-use/loop/actions.d.ts +3 -3
  45. package/dist/actors/computer-use/loop/actions.js +10 -10
  46. package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
  47. package/dist/actors/computer-use/loop/backstop.js +15 -13
  48. package/dist/actors/computer-use/loop/ending.d.ts +7 -7
  49. package/dist/actors/computer-use/loop/ending.js +9 -9
  50. package/dist/actors/computer-use/loop/observation.d.ts +2 -2
  51. package/dist/actors/computer-use/loop/observation.js +9 -9
  52. package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
  53. package/dist/actors/computer-use/loop/provider-call.js +1 -1
  54. package/dist/actors/computer-use/loop/session.js +3 -3
  55. package/dist/actors/computer-use/loop/spend.d.ts +2 -2
  56. package/dist/actors/computer-use/loop/spend.js +4 -4
  57. package/dist/actors/computer-use/loop/trace.js +11 -10
  58. package/dist/actors/computer-use/loop/types.d.ts +37 -26
  59. package/dist/actors/computer-use/loop/usage.js +2 -2
  60. package/dist/actors/computer-use/loop.js +4 -4
  61. package/dist/actors/computer-use/openai-context.d.ts +37 -0
  62. package/dist/actors/computer-use/openai-context.js +214 -0
  63. package/dist/actors/computer-use/openai-provider.d.ts +12 -9
  64. package/dist/actors/computer-use/openai-provider.js +47 -36
  65. package/dist/actors/computer-use/openai-requests.d.ts +36 -10
  66. package/dist/actors/computer-use/openai-requests.js +82 -15
  67. package/dist/actors/computer-use/openai-wire.d.ts +19 -7
  68. package/dist/actors/computer-use/openai-wire.js +36 -34
  69. package/dist/actors/contract.d.ts +86 -49
  70. package/dist/actors/contract.js +29 -23
  71. package/dist/actors/local-agent/claude-session.d.ts +1 -1
  72. package/dist/actors/local-agent/claude-session.js +10 -9
  73. package/dist/actors/local-agent/cli.d.ts +8 -6
  74. package/dist/actors/local-agent/cli.js +24 -28
  75. package/dist/actors/local-agent/readiness.d.ts +2 -2
  76. package/dist/actors/local-agent/readiness.js +4 -4
  77. package/dist/actors/reasoning-effort.js +6 -6
  78. package/dist/actors/registry.d.ts +10 -10
  79. package/dist/actors/registry.js +18 -17
  80. package/dist/actors/scripted-browser/actor.d.ts +8 -8
  81. package/dist/actors/scripted-browser/actor.js +16 -16
  82. package/dist/actors/scripted-browser/browser-command.js +1 -1
  83. package/dist/actors/scripted-browser/journey.js +15 -4
  84. package/dist/actors/scripted-browser/steps.js +19 -1
  85. package/dist/actors/scripted-browser/types.d.ts +12 -2
  86. package/dist/actors/stop-conditions.d.ts +1 -1
  87. package/dist/actors/stop-conditions.js +1 -3
  88. package/dist/analysis/automatic-completion.d.ts +13 -8
  89. package/dist/analysis/automatic-completion.js +14 -8
  90. package/dist/analysis/automatic-config.d.ts +1 -1
  91. package/dist/analysis/automatic-config.js +2 -2
  92. package/dist/analysis/automatic.d.ts +10 -4
  93. package/dist/analysis/automatic.js +17 -13
  94. package/dist/analysis/codex-config.d.ts +6 -2
  95. package/dist/analysis/codex-config.js +22 -14
  96. package/dist/analysis/diagnostics.d.ts +23 -0
  97. package/dist/analysis/diagnostics.js +112 -0
  98. package/dist/analysis/evidence-sources.js +2 -2
  99. package/dist/analysis/evidence.js +6 -6
  100. package/dist/analysis/execute.d.ts +7 -1
  101. package/dist/analysis/execute.js +39 -12
  102. package/dist/analysis/job.d.ts +8 -5
  103. package/dist/analysis/job.js +15 -14
  104. package/dist/analysis/load.d.ts +1 -1
  105. package/dist/analysis/load.js +5 -5
  106. package/dist/analysis/provider.d.ts +9 -1
  107. package/dist/analysis/restricted-codex.d.ts +2 -0
  108. package/dist/analysis/restricted-codex.js +10 -1
  109. package/dist/analysis/service.d.ts +2 -0
  110. package/dist/analysis/service.js +35 -16
  111. package/dist/analysis/sharing.d.ts +2 -2
  112. package/dist/analysis/sharing.js +5 -5
  113. package/dist/analysis/store-executions.d.ts +5 -5
  114. package/dist/analysis/store-executions.js +12 -12
  115. package/dist/analysis/store.d.ts +4 -4
  116. package/dist/analysis/store.js +13 -13
  117. package/dist/cli/commands/analysis-signals.d.ts +2 -1
  118. package/dist/cli/commands/analysis-signals.js +4 -1
  119. package/dist/cli/commands/analyze.js +23 -18
  120. package/dist/cli/commands/codex.js +9 -9
  121. package/dist/cli/commands/comms.js +62 -34
  122. package/dist/cli/commands/feedback.js +20 -21
  123. package/dist/cli/commands/lab-format.d.ts +5 -4
  124. package/dist/cli/commands/lab-format.js +35 -23
  125. package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
  126. package/dist/cli/commands/lab-route-computer-use.js +32 -21
  127. package/dist/cli/commands/lab-route-preview.d.ts +1 -3
  128. package/dist/cli/commands/lab-route-preview.js +7 -7
  129. package/dist/cli/commands/lab-route-run.d.ts +6 -4
  130. package/dist/cli/commands/lab-route-run.js +6 -2
  131. package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
  132. package/dist/cli/commands/lab-route-scripted.js +0 -1
  133. package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
  134. package/dist/cli/commands/lab-route-shared-world.js +3 -4
  135. package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
  136. package/dist/cli/commands/lab-route-terminal.js +0 -1
  137. package/dist/cli/commands/lab-run.js +84 -54
  138. package/dist/cli/commands/lab-scorer.d.ts +2 -4
  139. package/dist/cli/commands/lab-scorer.js +1 -1
  140. package/dist/cli/commands/migrate.d.ts +4 -0
  141. package/dist/cli/commands/migrate.js +65 -0
  142. package/dist/cli/commands/observe.js +168 -107
  143. package/dist/cli/commands/run-command.d.ts +10 -0
  144. package/dist/cli/commands/run-command.js +85 -0
  145. package/dist/cli/commands/run-signals.d.ts +30 -0
  146. package/dist/cli/commands/run-signals.js +146 -0
  147. package/dist/cli/commands/runs.js +137 -136
  148. package/dist/cli/commands/setup.d.ts +2 -2
  149. package/dist/cli/commands/setup.js +26 -21
  150. package/dist/cli/commands/study.d.ts +3 -0
  151. package/dist/cli/commands/study.js +182 -0
  152. package/dist/cli/commands/tui.d.ts +4 -4
  153. package/dist/cli/commands/tui.js +21 -21
  154. package/dist/cli/commands/watch.js +64 -77
  155. package/dist/cli/deprecations.d.ts +18 -0
  156. package/dist/cli/deprecations.js +48 -0
  157. package/dist/cli/doctor.d.ts +18 -5
  158. package/dist/cli/doctor.js +111 -48
  159. package/dist/cli/first-run-path.d.ts +12 -10
  160. package/dist/cli/first-run-path.js +30 -28
  161. package/dist/cli/io.d.ts +46 -10
  162. package/dist/cli/io.js +109 -30
  163. package/dist/cli/observer-follow.d.ts +2 -2
  164. package/dist/cli/observer-follow.js +5 -6
  165. package/dist/cli/orientation.d.ts +6 -3
  166. package/dist/cli/orientation.js +43 -39
  167. package/dist/cli/product-sentence.d.ts +6 -0
  168. package/dist/cli/product-sentence.js +6 -0
  169. package/dist/cli/program.d.ts +6 -1
  170. package/dist/cli/program.js +112 -43
  171. package/dist/cli/telemetry.d.ts +17 -17
  172. package/dist/cli/telemetry.js +49 -41
  173. package/dist/cli.js +1 -1
  174. package/dist/comms/capture-surface.d.ts +14 -13
  175. package/dist/comms/capture-surface.js +23 -22
  176. package/dist/comms/catch-host.d.ts +8 -8
  177. package/dist/comms/catch-host.js +14 -14
  178. package/dist/comms/connections.js +4 -4
  179. package/dist/comms/email-catch.d.ts +3 -3
  180. package/dist/comms/email-catch.js +8 -8
  181. package/dist/comms/external-evidence.d.ts +27 -0
  182. package/dist/comms/external-evidence.js +93 -0
  183. package/dist/comms/extract.js +2 -2
  184. package/dist/comms/fake-inbox.d.ts +2 -2
  185. package/dist/comms/fake-inbox.js +2 -2
  186. package/dist/comms/lease-store.js +7 -7
  187. package/dist/comms/receiving-render.d.ts +1 -1
  188. package/dist/comms/receiving-render.js +2 -2
  189. package/dist/comms/sandbox-catch-script.d.ts +6 -6
  190. package/dist/comms/sandbox-catch-script.js +6 -6
  191. package/dist/comms/sandbox-catch.d.ts +36 -37
  192. package/dist/comms/sandbox-catch.js +34 -35
  193. package/dist/comms/setup.js +42 -8
  194. package/dist/comms/thread-evidence.d.ts +1 -1
  195. package/dist/comms/thread-evidence.js +6 -6
  196. package/dist/comms/types.d.ts +6 -6
  197. package/dist/comms/types.js +4 -4
  198. package/dist/evidence/browser-hygiene.d.ts +1 -1
  199. package/dist/evidence/browser-hygiene.js +1 -1
  200. package/dist/evidence/frame-signature.d.ts +1 -1
  201. package/dist/evidence/frame-signature.js +4 -4
  202. package/dist/evidence/redaction.d.ts +3 -3
  203. package/dist/evidence/redaction.js +5 -5
  204. package/dist/evidence/secret-scrub.d.ts +9 -0
  205. package/dist/evidence/secret-scrub.js +96 -0
  206. package/dist/feedback/draft.js +41 -85
  207. package/dist/feedback/export-bundle.js +5 -5
  208. package/dist/feedback/export.d.ts +5 -1
  209. package/dist/feedback/export.js +16 -17
  210. package/dist/feedback/feedback.d.ts +3 -3
  211. package/dist/feedback/feedback.js +21 -3
  212. package/dist/guest/chromium-text.js +2 -2
  213. package/dist/guest/desktop-native.d.ts +1 -1
  214. package/dist/guest/runtime.js +1 -1
  215. package/dist/index.d.ts +14 -15
  216. package/dist/index.js +10 -11
  217. package/dist/keys/key-resolution.d.ts +7 -5
  218. package/dist/keys/key-resolution.js +40 -38
  219. package/dist/lab/adapter-extension.d.ts +35 -13
  220. package/dist/lab/adapter-extension.js +50 -134
  221. package/dist/lab/adapter-scorer-loader.d.ts +32 -12
  222. package/dist/lab/adapter-scorer-loader.js +56 -32
  223. package/dist/lab/composition-rules.js +58 -58
  224. package/dist/lab/config.js +85 -43
  225. package/dist/lab/deprecated-fields.d.ts +10 -0
  226. package/dist/lab/deprecated-fields.js +24 -0
  227. package/dist/lab/device-presets.d.ts +10 -10
  228. package/dist/lab/device-presets.js +11 -11
  229. package/dist/lab/discover.d.ts +13 -9
  230. package/dist/lab/discover.js +118 -60
  231. package/dist/lab/doctor.d.ts +53 -11
  232. package/dist/lab/doctor.js +193 -47
  233. package/dist/lab/init-plan.js +1 -3
  234. package/dist/lab/init-templates.js +147 -147
  235. package/dist/lab/init.d.ts +1 -1
  236. package/dist/lab/init.js +41 -9
  237. package/dist/lab/keys.d.ts +2 -0
  238. package/dist/lab/keys.js +43 -9
  239. package/dist/lab/lab-deps.d.ts +80 -0
  240. package/dist/lab/lab-deps.js +4 -0
  241. package/dist/lab/parse/actors.js +17 -16
  242. package/dist/lab/parse/comms.js +8 -7
  243. package/dist/lab/parse/execution.js +15 -14
  244. package/dist/lab/parse/study-v3.d.ts +23 -0
  245. package/dist/lab/parse/study-v3.js +259 -0
  246. package/dist/lab/parse/subject-state.d.ts +7 -7
  247. package/dist/lab/parse/subject-state.js +18 -17
  248. package/dist/lab/parse/subject.js +30 -29
  249. package/dist/lab/parse/values.d.ts +1 -2
  250. package/dist/lab/parse/values.js +3 -6
  251. package/dist/lab/persona-resolve.d.ts +7 -7
  252. package/dist/lab/persona-resolve.js +8 -8
  253. package/dist/lab/persona.js +1 -3
  254. package/dist/lab/plan-base.d.ts +0 -2
  255. package/dist/lab/plan-base.js +6 -4
  256. package/dist/lab/plan-participants.d.ts +7 -7
  257. package/dist/lab/plan-participants.js +2 -2
  258. package/dist/lab/plan-types.d.ts +26 -8
  259. package/dist/lab/plan.d.ts +4 -18
  260. package/dist/lab/plan.js +24 -79
  261. package/dist/lab/preflight-probes.js +11 -11
  262. package/dist/lab/preflight-result.d.ts +2 -1
  263. package/dist/lab/preflight-result.js +5 -6
  264. package/dist/lab/preflight.d.ts +7 -8
  265. package/dist/lab/preflight.js +6 -6
  266. package/dist/lab/requirements.d.ts +20 -0
  267. package/dist/lab/requirements.js +54 -0
  268. package/dist/lab/route-inputs.d.ts +23 -12
  269. package/dist/lab/route-inputs.js +48 -51
  270. package/dist/lab/routing.d.ts +42 -41
  271. package/dist/lab/routing.js +66 -68
  272. package/dist/lab/run-lab-events.d.ts +3 -11
  273. package/dist/lab/run-lab-events.js +2 -16
  274. package/dist/lab/run-lab-homes.d.ts +76 -0
  275. package/dist/lab/run-lab-homes.js +7 -0
  276. package/dist/lab/run-lab-options.d.ts +12 -66
  277. package/dist/lab/run-lab-options.js +58 -285
  278. package/dist/lab/summary.d.ts +15 -9
  279. package/dist/lab/summary.js +24 -17
  280. package/dist/lab/tasks.d.ts +15 -15
  281. package/dist/lab/tasks.js +14 -14
  282. package/dist/lab/types.d.ts +201 -195
  283. package/dist/lab/types.js +2 -0
  284. package/dist/lab/validation.d.ts +21 -21
  285. package/dist/lab/validation.js +61 -59
  286. package/dist/lab/warnings.d.ts +10 -0
  287. package/dist/lab/warnings.js +70 -41
  288. package/dist/library-aliases.d.ts +56 -0
  289. package/dist/library-aliases.js +22 -0
  290. package/dist/observer/artifact.d.ts +2 -2
  291. package/dist/observer/artifact.js +9 -9
  292. package/dist/observer/data.d.ts +6 -6
  293. package/dist/observer/data.js +7 -6
  294. package/dist/observer/exposure.d.ts +1 -1
  295. package/dist/observer/exposure.js +11 -11
  296. package/dist/observer/http.js +1 -1
  297. package/dist/observer/library.d.ts +1 -1
  298. package/dist/observer/library.js +4 -2
  299. package/dist/observer/listen.js +5 -4
  300. package/dist/observer/render.d.ts +1 -1
  301. package/dist/observer/render.js +12 -7
  302. package/dist/observer/run-routes.d.ts +4 -4
  303. package/dist/observer/run-routes.js +6 -6
  304. package/dist/observer/serve.d.ts +17 -0
  305. package/dist/observer/serve.js +41 -6
  306. package/dist/observer/tunnel.js +1 -1
  307. package/dist/observer-app.html +4 -4
  308. package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
  309. package/dist/routes/computer-use/bundle-parts.js +24 -17
  310. package/dist/routes/computer-use/bundle.d.ts +4 -11
  311. package/dist/routes/computer-use/bundle.js +12 -18
  312. package/dist/routes/computer-use/diagnostics.d.ts +1 -1
  313. package/dist/routes/computer-use/diagnostics.js +1 -1
  314. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
  315. package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
  316. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
  317. package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
  318. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
  319. package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
  320. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
  321. package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
  322. package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
  323. package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
  324. package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
  325. package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
  326. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
  327. package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
  328. package/dist/routes/computer-use/external-comms.d.ts +4 -4
  329. package/dist/routes/computer-use/external-comms.js +19 -43
  330. package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
  331. package/dist/routes/computer-use/fanout-bundle.js +38 -42
  332. package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
  333. package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
  334. package/dist/routes/computer-use/in-process-desktop.js +3 -9
  335. package/dist/routes/computer-use/live-flush.d.ts +7 -5
  336. package/dist/routes/computer-use/live-flush.js +20 -28
  337. package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
  338. package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
  339. package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
  340. package/dist/routes/computer-use/local-tree-pack.js +4 -5
  341. package/dist/routes/computer-use/local-vm.d.ts +11 -8
  342. package/dist/routes/computer-use/local-vm.js +40 -67
  343. package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
  344. package/dist/routes/computer-use/participant-desktop.js +5 -25
  345. package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
  346. package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
  347. package/dist/routes/computer-use/participant-facts.d.ts +7 -1
  348. package/dist/routes/computer-use/participant-facts.js +12 -1
  349. package/dist/routes/computer-use/participant-model.d.ts +25 -11
  350. package/dist/routes/computer-use/participant-model.js +76 -34
  351. package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
  352. package/dist/routes/computer-use/participant-prompt.js +8 -8
  353. package/dist/routes/computer-use/participant-runs.d.ts +11 -11
  354. package/dist/routes/computer-use/participant-runs.js +18 -18
  355. package/dist/routes/computer-use/plan.d.ts +21 -29
  356. package/dist/routes/computer-use/plan.js +70 -78
  357. package/dist/routes/computer-use/preflight.d.ts +3 -5
  358. package/dist/routes/computer-use/preflight.js +40 -36
  359. package/dist/routes/computer-use/rerun-selection.js +11 -7
  360. package/dist/routes/computer-use/result.d.ts +1 -1
  361. package/dist/routes/computer-use/result.js +48 -38
  362. package/dist/routes/computer-use/route.d.ts +5 -5
  363. package/dist/routes/computer-use/route.js +36 -33
  364. package/dist/routes/computer-use/self-report.d.ts +8 -8
  365. package/dist/routes/computer-use/self-report.js +33 -33
  366. package/dist/routes/computer-use/setup.d.ts +9 -15
  367. package/dist/routes/computer-use/setup.js +106 -83
  368. package/dist/routes/computer-use/single-bundle.d.ts +13 -16
  369. package/dist/routes/computer-use/single-bundle.js +46 -53
  370. package/dist/routes/computer-use/subject-projection.d.ts +6 -8
  371. package/dist/routes/computer-use/subject-projection.js +24 -23
  372. package/dist/routes/computer-use/types.d.ts +195 -238
  373. package/dist/routes/computer-use/types.js +21 -13
  374. package/dist/routes/preview.d.ts +8 -2
  375. package/dist/routes/preview.js +8 -5
  376. package/dist/routes/scripted/bundle.d.ts +5 -8
  377. package/dist/routes/scripted/bundle.js +23 -27
  378. package/dist/routes/scripted/plan.d.ts +6 -8
  379. package/dist/routes/scripted/plan.js +15 -13
  380. package/dist/routes/scripted/result.d.ts +4 -1
  381. package/dist/routes/scripted/result.js +15 -11
  382. package/dist/routes/scripted/route.js +15 -17
  383. package/dist/routes/scripted/scenario.d.ts +1 -1
  384. package/dist/routes/scripted/scenario.js +3 -3
  385. package/dist/routes/scripted/setup.d.ts +3 -2
  386. package/dist/routes/scripted/setup.js +27 -26
  387. package/dist/routes/scripted/subject.d.ts +8 -3
  388. package/dist/routes/scripted/subject.js +10 -6
  389. package/dist/routes/scripted/surface-records.js +4 -4
  390. package/dist/routes/scripted/surface-sessions.d.ts +2 -2
  391. package/dist/routes/scripted/surface-sessions.js +4 -4
  392. package/dist/routes/scripted/types.d.ts +21 -40
  393. package/dist/routes/scripted/types.js +2 -3
  394. package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
  395. package/dist/routes/shared-world/bundle.d.ts +7 -7
  396. package/dist/routes/shared-world/bundle.js +60 -62
  397. package/dist/routes/shared-world/checkpoints.d.ts +5 -5
  398. package/dist/routes/shared-world/checkpoints.js +5 -5
  399. package/dist/routes/shared-world/comms.d.ts +8 -7
  400. package/dist/routes/shared-world/comms.js +38 -51
  401. package/dist/routes/shared-world/external-public.d.ts +6 -5
  402. package/dist/routes/shared-world/external-public.js +28 -25
  403. package/dist/routes/shared-world/handoff.d.ts +10 -9
  404. package/dist/routes/shared-world/handoff.js +89 -81
  405. package/dist/routes/shared-world/lobby-code.d.ts +7 -7
  406. package/dist/routes/shared-world/lobby-code.js +22 -22
  407. package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
  408. package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
  409. package/dist/routes/shared-world/plan.d.ts +2 -6
  410. package/dist/routes/shared-world/plan.js +8 -9
  411. package/dist/routes/shared-world/provenance.d.ts +4 -4
  412. package/dist/routes/shared-world/provenance.js +4 -4
  413. package/dist/routes/shared-world/provisioned.d.ts +3 -2
  414. package/dist/routes/shared-world/provisioned.js +55 -48
  415. package/dist/routes/shared-world/result.js +47 -36
  416. package/dist/routes/shared-world/route.js +54 -57
  417. package/dist/routes/shared-world/setup.d.ts +6 -5
  418. package/dist/routes/shared-world/setup.js +16 -18
  419. package/dist/routes/shared-world/types.d.ts +70 -141
  420. package/dist/routes/shared-world/types.js +5 -5
  421. package/dist/routes/terminal/adapter.d.ts +10 -10
  422. package/dist/routes/terminal/adapter.js +32 -129
  423. package/dist/routes/terminal/bundle.d.ts +10 -15
  424. package/dist/routes/terminal/bundle.js +43 -52
  425. package/dist/routes/terminal/credentials.d.ts +4 -4
  426. package/dist/routes/terminal/credentials.js +20 -20
  427. package/dist/routes/terminal/dry-run.d.ts +1 -1
  428. package/dist/routes/terminal/dry-run.js +13 -15
  429. package/dist/routes/terminal/encoding.d.ts +1 -1
  430. package/dist/routes/terminal/encoding.js +4 -4
  431. package/dist/routes/terminal/ledger.d.ts +8 -8
  432. package/dist/routes/terminal/ledger.js +22 -22
  433. package/dist/routes/terminal/live-finish.d.ts +1 -2
  434. package/dist/routes/terminal/live-finish.js +24 -23
  435. package/dist/routes/terminal/live-sandbox.d.ts +3 -2
  436. package/dist/routes/terminal/live-sandbox.js +31 -32
  437. package/dist/routes/terminal/participant-text.d.ts +23 -0
  438. package/dist/routes/terminal/participant-text.js +165 -0
  439. package/dist/routes/terminal/persona.js +1 -1
  440. package/dist/routes/terminal/plan.d.ts +2 -6
  441. package/dist/routes/terminal/plan.js +23 -19
  442. package/dist/routes/terminal/recorder.d.ts +6 -1
  443. package/dist/routes/terminal/recorder.js +12 -4
  444. package/dist/routes/terminal/result.js +12 -12
  445. package/dist/routes/terminal/route.js +30 -31
  446. package/dist/routes/terminal/runtime.d.ts +3 -2
  447. package/dist/routes/terminal/runtime.js +3 -3
  448. package/dist/routes/terminal/sandbox.d.ts +4 -4
  449. package/dist/routes/terminal/sandbox.js +10 -10
  450. package/dist/routes/terminal/session.js +22 -19
  451. package/dist/routes/terminal/token-usage.d.ts +1 -1
  452. package/dist/routes/terminal/token-usage.js +10 -11
  453. package/dist/routes/terminal/trace.d.ts +7 -10
  454. package/dist/routes/terminal/trace.js +11 -66
  455. package/dist/routes/terminal/types.d.ts +104 -114
  456. package/dist/routes/terminal/types.js +12 -7
  457. package/dist/run/active-runs.d.ts +13 -0
  458. package/dist/run/active-runs.js +12 -0
  459. package/dist/run/bundle-shape.d.ts +2 -1
  460. package/dist/run/bundle-shape.js +7 -7
  461. package/dist/run/bundle.d.ts +99 -92
  462. package/dist/run/bundle.js +10 -8
  463. package/dist/run/cost-summary.js +6 -5
  464. package/dist/run/costs.d.ts +6 -6
  465. package/dist/run/costs.js +17 -11
  466. package/dist/run/detail.d.ts +9 -9
  467. package/dist/run/detail.js +10 -10
  468. package/dist/run/dry-run-inputs.js +1 -1
  469. package/dist/run/dry-run.js +23 -30
  470. package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
  471. package/dist/run/{study-files.js → evidence-files.js} +5 -5
  472. package/dist/run/feedback-shape.js +1 -1
  473. package/dist/run/judge.d.ts +34 -16
  474. package/dist/run/judge.js +41 -14
  475. package/dist/run/locate.d.ts +2 -0
  476. package/dist/run/locate.js +3 -1
  477. package/dist/run/outcomes.d.ts +3 -3
  478. package/dist/run/outcomes.js +3 -3
  479. package/dist/run/participant-records.d.ts +2 -2
  480. package/dist/run/participant-records.js +2 -2
  481. package/dist/run/paths.d.ts +1 -1
  482. package/dist/run/paths.js +2 -2
  483. package/dist/run/pricing.d.ts +30 -15
  484. package/dist/run/pricing.js +49 -30
  485. package/dist/run/projection.d.ts +27 -27
  486. package/dist/run/projection.js +23 -23
  487. package/dist/run/reclaim.d.ts +6 -0
  488. package/dist/run/reclaim.js +15 -5
  489. package/dist/run/results.d.ts +5 -5
  490. package/dist/run/run-index.d.ts +9 -7
  491. package/dist/run/run-index.js +24 -25
  492. package/dist/run/run-not-found.d.ts +5 -0
  493. package/dist/run/run-not-found.js +15 -0
  494. package/dist/run/run.d.ts +7 -4
  495. package/dist/run/run.js +10 -6
  496. package/dist/run/sandbox-receipts.d.ts +5 -5
  497. package/dist/run/sandbox-receipts.js +6 -6
  498. package/dist/run/shared-world-evidence.d.ts +67 -66
  499. package/dist/run/shared-world-evidence.js +4 -4
  500. package/dist/run/shared-world-shape.d.ts +3 -3
  501. package/dist/run/shared-world-shape.js +16 -16
  502. package/dist/run/stats.d.ts +17 -11
  503. package/dist/run/stats.js +124 -66
  504. package/dist/run/status.d.ts +21 -32
  505. package/dist/run/status.js +34 -33
  506. package/dist/run/stored-runs.js +2 -1
  507. package/dist/run/stream-shape.js +1 -1
  508. package/dist/run/streams.d.ts +29 -22
  509. package/dist/run/study-provenance.d.ts +47 -0
  510. package/dist/run/study-provenance.js +63 -0
  511. package/dist/run/study-result.d.ts +16 -0
  512. package/dist/run/study-result.js +9 -0
  513. package/dist/run/terminal-contract.d.ts +5 -5
  514. package/dist/run/terminal-contract.js +4 -4
  515. package/dist/run/text.d.ts +2 -0
  516. package/dist/run/text.js +4 -0
  517. package/dist/run/transient-comms-secrets.d.ts +5 -0
  518. package/dist/run/transient-comms-secrets.js +12 -0
  519. package/dist/run-lab.d.ts +40 -38
  520. package/dist/run-lab.js +42 -40
  521. package/dist/study/convert.d.ts +33 -0
  522. package/dist/study/convert.js +432 -0
  523. package/dist/study/field-paths.d.ts +12 -0
  524. package/dist/study/field-paths.js +126 -0
  525. package/dist/study/files.d.ts +26 -0
  526. package/dist/study/files.js +43 -0
  527. package/dist/study/migrate.d.ts +48 -0
  528. package/dist/study/migrate.js +408 -0
  529. package/dist/study/owned-files.d.ts +38 -0
  530. package/dist/study/owned-files.js +182 -0
  531. package/dist/subject/clone.d.ts +1 -1
  532. package/dist/subject/desktop-cli.d.ts +2 -2
  533. package/dist/subject/desktop-cli.js +3 -3
  534. package/dist/subject/local-tree-archive.d.ts +1 -1
  535. package/dist/subject/local-tree-archive.js +5 -5
  536. package/dist/subject/local-tree.d.ts +3 -3
  537. package/dist/subject/local-tree.js +1 -1
  538. package/dist/subject/node-bootstrap.d.ts +1 -1
  539. package/dist/subject/node-bootstrap.js +4 -4
  540. package/dist/subject/runtime.js +10 -11
  541. package/dist/subject/serve.d.ts +1 -1
  542. package/dist/subject/serve.js +4 -4
  543. package/dist/subject/state.d.ts +1 -1
  544. package/dist/subject/steps.d.ts +8 -8
  545. package/dist/subject/steps.js +7 -7
  546. package/dist/substrates/command-failure.d.ts +3 -3
  547. package/dist/substrates/command-failure.js +3 -3
  548. package/dist/substrates/detached.d.ts +6 -6
  549. package/dist/substrates/detached.js +7 -7
  550. package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
  551. package/dist/substrates/e2b/cdp-probe.js +15 -18
  552. package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
  553. package/dist/substrates/e2b/desktop-browser.js +12 -12
  554. package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
  555. package/dist/substrates/e2b/desktop-cdp.js +11 -11
  556. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  557. package/dist/substrates/e2b/desktop-executor.js +1 -1
  558. package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
  559. package/dist/substrates/e2b/desktop-geometry.js +9 -9
  560. package/dist/substrates/e2b/desktop-media.d.ts +1 -1
  561. package/dist/substrates/e2b/desktop-media.js +3 -3
  562. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
  563. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
  564. package/dist/substrates/e2b/sandbox.d.ts +1 -1
  565. package/dist/substrates/e2b/sandbox.js +2 -2
  566. package/dist/substrates/e2b/sdk.d.ts +11 -11
  567. package/dist/substrates/e2b/sdk.js +8 -8
  568. package/dist/substrates/local/runtime-host.d.ts +2 -0
  569. package/dist/substrates/local/runtime-host.js +6 -0
  570. package/dist/tui/actions.d.ts +8 -6
  571. package/dist/tui/actions.js +31 -22
  572. package/dist/tui/contract.d.ts +16 -16
  573. package/dist/tui/contract.js +10 -10
  574. package/dist/tui/launch.d.ts +4 -4
  575. package/dist/tui/launch.js +18 -19
  576. package/dist/tui/project.js +5 -5
  577. package/dist/tui-app.js +83 -83
  578. package/dist/verify/actor.d.ts +14 -14
  579. package/dist/verify/actor.js +45 -45
  580. package/dist/verify/artifacts.d.ts +3 -3
  581. package/dist/verify/artifacts.js +6 -6
  582. package/dist/verify/context-growth.d.ts +9 -0
  583. package/dist/verify/context-growth.js +62 -0
  584. package/dist/verify/costs.d.ts +7 -7
  585. package/dist/verify/costs.js +9 -9
  586. package/dist/verify/liveness.d.ts +1 -1
  587. package/dist/verify/liveness.js +4 -1
  588. package/dist/verify/rerun.d.ts +1 -1
  589. package/dist/verify/rerun.js +1 -1
  590. package/dist/verify/shared-world-concurrent.d.ts +2 -2
  591. package/dist/verify/shared-world-concurrent.js +79 -76
  592. package/dist/verify/shared-world.d.ts +2 -2
  593. package/dist/verify/shared-world.js +18 -18
  594. package/dist/verify/subject.d.ts +4 -4
  595. package/dist/verify/subject.js +18 -18
  596. package/dist/verify/verify.js +98 -49
  597. package/docs/README.md +26 -33
  598. package/docs/architecture/actor-contract.md +105 -98
  599. package/docs/architecture/desktop-sessions.md +14 -14
  600. package/docs/architecture/external-public-shared-world.md +66 -59
  601. package/docs/architecture/github-feedback-loop.md +1 -4
  602. package/docs/architecture/guest-desktop.md +2 -2
  603. package/docs/architecture/observer.md +37 -37
  604. package/docs/architecture/restricted-codex-analysis.md +70 -30
  605. package/docs/architecture/serve.md +34 -37
  606. package/docs/architecture/state-driven-executor.md +55 -59
  607. package/docs/architecture/task-protocol-support.md +7 -9
  608. package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
  609. package/docs/contracts/README.md +24 -0
  610. package/docs/contracts/adapter-admission.md +3 -3
  611. package/docs/contracts/adapter-fixtures.md +2 -5
  612. package/docs/contracts/core.md +1 -3
  613. package/docs/contracts/errors.md +62 -0
  614. package/docs/contracts/feedback.md +8 -9
  615. package/docs/contracts/policy.md +7 -12
  616. package/docs/contracts/run-bundle.md +54 -51
  617. package/docs/contracts/schemas.md +505 -390
  618. package/docs/contracts/study-analysis.md +26 -2
  619. package/docs/contracts/study-costs.md +11 -7
  620. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
  621. package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
  622. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
  623. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
  624. package/docs/principles/actor-fidelity.md +4 -4
  625. package/docs/principles/engineering.md +3 -3
  626. package/docs/principles/invariants-and-defaults.md +38 -38
  627. package/docs/principles/self-driving-harness.md +1 -5
  628. package/docs/principles/three-roles.md +1 -1
  629. package/docs/product/automatic-analysis.md +8 -7
  630. package/examples/participant/README.md +5 -5
  631. package/examples/participant/run.mjs +11 -10
  632. package/examples/scorer/README.md +3 -3
  633. package/examples/scorer/run.mjs +11 -12
  634. package/package.json +16 -17
  635. package/skills/humanish/SKILL.md +63 -60
  636. package/skills/humanish/agents/openai.yaml +1 -1
  637. package/AGENTS.md +0 -99
  638. package/CONTRIBUTING.md +0 -148
  639. package/dist/actors/codex/qualified-versions.d.ts +0 -45
  640. package/dist/actors/codex/qualified-versions.js +0 -87
  641. package/dist/cli/commands/lab.d.ts +0 -3
  642. package/dist/cli/commands/lab.js +0 -193
  643. package/dist/deprecated.d.ts +0 -90
  644. package/dist/deprecated.js +0 -106
  645. package/dist/lab/bag-overrides.d.ts +0 -18
  646. package/dist/lab/bag-overrides.js +0 -121
  647. package/dist/observer/static.d.ts +0 -39
  648. package/dist/observer/static.js +0 -369
  649. package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
  650. package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
  651. package/docs/architecture/comms-inbox.md +0 -122
  652. package/docs/architecture/desktop-recording.md +0 -80
  653. package/docs/architecture/local-browser-runtime.md +0 -178
  654. package/docs/architecture/observer-review.md +0 -144
  655. package/docs/architecture/participant-media.md +0 -90
  656. package/docs/architecture/project-layout.md +0 -62
  657. package/docs/architecture/real-email-receiving.md +0 -136
  658. package/docs/assets/humanish-drawdb-hero.png +0 -0
  659. package/docs/assets/humanish-observer-hero.png +0 -0
  660. package/docs/goals/current.md +0 -207
  661. package/docs/product/lobby-trivia-3player-external-public.md +0 -77
  662. package/docs/product/open-source-install-experience.md +0 -240
  663. package/docs/ramp/README.md +0 -294
  664. package/docs/release/open-source-readiness.md +0 -222
  665. package/docs/release/public-readiness-standard.md +0 -210
  666. package/docs/roadmap/world-class-open-source-v0.md +0 -311
  667. /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
  668. /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
@@ -4,13 +4,13 @@
4
4
  * the per-line notes record where the two reference sims agree vs. diverge.
5
5
  */
6
6
  export const DEVICE_PRESETS = {
7
- // phone — both reference sims agree
7
+ // phone: both reference sims agree
8
8
  mobile: { width: 414, height: 896, isMobile: true, deviceScaleFactor: 3 },
9
- // small phone — both reference sims agree
9
+ // small phone: both reference sims agree
10
10
  "small-mobile": { width: 360, height: 740, isMobile: true, deviceScaleFactor: 3 },
11
11
  // older narrow phone
12
12
  "narrow-mobile": { width: 320, height: 700, isMobile: true, deviceScaleFactor: 2 },
13
- // tablet — both reference sims agree
13
+ // tablet: both reference sims agree
14
14
  tablet: { width: 820, height: 1180, isMobile: false, deviceScaleFactor: 2 },
15
15
  // laptop baseline (the in-house desktop screen; close to the 1440x960 dry-run surface in
16
16
  // src/run/dry-run.ts)
@@ -20,7 +20,7 @@ export const DEVICE_PRESETS = {
20
20
  };
21
21
  /**
22
22
  * Default device for a run that does not declare one. `desktop` (1440x950) is the median
23
- * first-run laptop screen — the in-house desktop default, within 10px of the 1440x960 dry-run
23
+ * first-run laptop screen, the in-house desktop default, within 10px of the 1440x960 dry-run
24
24
  * surface in src/run/dry-run.ts. `wide` (1920x1080), the most-common external monitor, is one
25
25
  * keystroke away (`execution.desktop.device: wide`) but is deliberately not the default,
26
26
  * because the median device a first-time user arrives on is a laptop, not a 1080p monitor.
@@ -36,24 +36,24 @@ export function resolveDevicePreset(name) {
36
36
  return DEVICE_PRESETS[name ?? DEFAULT_DEVICE_PRESET];
37
37
  }
38
38
  /**
39
- * The narrowest browser WINDOW Chrome/Chromium will render on the E2B desktop. Chrome refuses to
39
+ * The narrowest browser window Chrome/Chromium will render on the E2B desktop. Chrome refuses to
40
40
  * make its window narrower than this (~500 CSS px observed: a 414-wide X screen produced a 500-wide
41
- * window that OVERFLOWED it, clipping the right edge of the page off-screen). So the physically
42
- * RENDERED screen width is floored here: a sub-500 mobile preset (mobile 414, small-mobile 360,
43
- * narrow-mobile 320) gets a 500-wide screen the window fits exactly — no clip. The device PRESET keeps
41
+ * window that overflowed it, clipping the right edge of the page off-screen). So the physically
42
+ * rendered screen width is floored here: a sub-500 mobile preset (mobile 414, small-mobile 360,
43
+ * narrow-mobile 320) gets a 500-wide screen the window fits exactly, with no clip. The device preset keeps
44
44
  * its true identity (isMobile, nominal width) for the persona prompt + metadata; only the rendered
45
45
  * screen is floored. True sub-500 CSS-viewport rendering (page laid out at 414 regardless of window
46
- * width, via CDP device-metric emulation) is the separate #221 upgrade.
46
+ * width, via CDP device-metric emulation) is the separate mobileEmulation option.
47
47
  */
48
48
  export const MIN_DESKTOP_RENDER_WIDTH = 500;
49
- /** Floor a screen resolution's WIDTH to what Chrome can actually render (see MIN_DESKTOP_RENDER_WIDTH). */
49
+ /** Floor a screen resolution's width to what Chrome can actually render (see MIN_DESKTOP_RENDER_WIDTH). */
50
50
  export function floorRenderResolution(resolution) {
51
51
  return [Math.max(resolution[0], MIN_DESKTOP_RENDER_WIDTH), resolution[1]];
52
52
  }
53
53
  /**
54
54
  * Resolve a participant's device + rendered resolution (most-specific wins, exactly as the
55
55
  * single-participant path always has): a raw execution.desktop.resolution escape hatch (only legal
56
- * when no roster entry sets a device — XOR enforced at parse) → the participant's named device → the run-wide
56
+ * when no roster entry sets a device; XOR enforced at parse) → the participant's named device → the run-wide
57
57
  * execution.desktop.device → the default preset. A raw resolution is an unnamed custom desktop
58
58
  * (non-mobile, DSF 1): we never claim a named preset's mobile/DPR for hand-set geometry. The rendered
59
59
  * `resolution` is floored to MIN_DESKTOP_RENDER_WIDTH so the browser window fits its X screen (no clip);
@@ -1,7 +1,7 @@
1
1
  import type { ActorPersonaRef } from "../actors/contract.js";
2
2
  import { type LabConfig } from "./types.js";
3
- declare const LAB_LIST_SCHEMA = "humanish.lab-list.v1";
4
- declare const LAB_INSPECT_SCHEMA = "humanish.lab-inspect.v1";
3
+ declare const STUDY_LIST_SCHEMA = "humanish.study-list.v1";
4
+ declare const STUDY_SHOW_SCHEMA = "humanish.study-show.v1";
5
5
  type LabOrigin = "committed" | "ignored" | "explicit";
6
6
  interface ResolvedLabConfig {
7
7
  config: LabConfig;
@@ -12,9 +12,10 @@ interface ResolvedLabConfig {
12
12
  export interface LabResolveFailure {
13
13
  ok: false;
14
14
  cwd: string;
15
- lab: string;
15
+ /** The study the caller asked for, as given. */
16
+ study: string;
16
17
  error: {
17
- code: "HUMANISH_LAB_NOT_FOUND" | "HUMANISH_LAB_INVALID";
18
+ code: "HUMANISH_STUDY_NOT_FOUND" | "HUMANISH_STUDY_INVALID" | "HUMANISH_STUDY_AMBIGUOUS";
18
19
  message: string;
19
20
  };
20
21
  warnings: string[];
@@ -30,16 +31,18 @@ export interface LabListEntry {
30
31
  title?: string;
31
32
  /**
32
33
  * The manifest's own first sentence. The list is where someone decides which study to open, and a
33
- * list of names cannot answer "what is this one" for a project with twenty labs in it — the
34
+ * list of names cannot answer "what is this one" for a project with twenty labs in it; the
34
35
  * stakeholder feedback that added this was, verbatim, "so i know wtf they are".
35
36
  */
36
37
  description?: string;
38
+ /** Why `run` refuses this file by name: its stem also names a file in the other directory family. */
39
+ error?: string;
37
40
  }
38
41
  export interface LabListResult {
39
- schema: typeof LAB_LIST_SCHEMA;
42
+ schema: typeof STUDY_LIST_SCHEMA;
40
43
  ok: true;
41
44
  cwd: string;
42
- labs: LabListEntry[];
45
+ studies: LabListEntry[];
43
46
  warnings: string[];
44
47
  }
45
48
  export interface LabInspectResult {
@@ -49,10 +52,11 @@ export interface LabInspectResult {
49
52
  resolved: boolean;
50
53
  brief?: ActorPersonaRef["brief"];
51
54
  }>;
52
- schema: typeof LAB_INSPECT_SCHEMA;
55
+ schema: typeof STUDY_SHOW_SCHEMA;
53
56
  ok: boolean;
54
57
  cwd: string;
55
- lab: string;
58
+ /** The study the caller asked for, as given. */
59
+ study: string;
56
60
  config?: LabConfig;
57
61
  origin?: LabOrigin;
58
62
  path?: string;
@@ -5,15 +5,12 @@ import { lstat, open, readdir, realpath } from "node:fs/promises";
5
5
  import path from "node:path";
6
6
  import { parse } from "yaml";
7
7
  import { parseLabConfig } from "./config.js";
8
- import {} from "./types.js";
8
+ import { STUDY_SCHEMA } from "./types.js";
9
9
  import { assertPreparedSelectedOutputDirectory, assertSafeOutputPathSegment, prepareSelectedOutputDirectory, readContainedRegularFile, } from "../run/contained-output.js";
10
- const LAB_LIST_SCHEMA = "humanish.lab-list.v1";
11
- const LAB_INSPECT_SCHEMA = "humanish.lab-inspect.v1";
12
- const committedLabsDir = path.join("humanish", "labs");
13
- const ignoredLabsDirs = [
14
- path.join(".humanish", "labs"),
15
- path.join(".humanish", "local", "labs"),
16
- ];
10
+ import { isNodeError } from "../run/type-guards.js";
11
+ import { studyFileCandidates, studyFileStem, STUDY_DIRECTORIES } from "../study/files.js";
12
+ const STUDY_LIST_SCHEMA = "humanish.study-list.v1";
13
+ const STUDY_SHOW_SCHEMA = "humanish.study-show.v1";
17
14
  export async function resolveLabManifest(cwd, lab) {
18
15
  const resolvedCwd = path.resolve(cwd);
19
16
  const warnings = [];
@@ -39,16 +36,10 @@ export async function resolveLabManifest(cwd, lab) {
39
36
  contents: read.contents,
40
37
  });
41
38
  }
42
- const candidates = [
43
- { origin: "committed", relativePath: path.join(committedLabsDir, `${lab}.yaml`) },
44
- { origin: "committed", relativePath: path.join(committedLabsDir, `${lab}.yml`) },
45
- ...ignoredLabsDirs.flatMap((dir) => [
46
- { origin: "ignored", relativePath: path.join(dir, `${lab}.yaml`) },
47
- { origin: "ignored", relativePath: path.join(dir, `${lab}.yml`) },
48
- ]),
49
- ];
39
+ // A studies/ file wins over every labs/ file. The same stem under both families is an error, so
40
+ // neither file silently shadows the other.
41
+ const candidates = studyFileCandidates(lab);
50
42
  for (const candidate of candidates) {
51
- const requestedPath = path.join(resolvedCwd, candidate.relativePath);
52
43
  const read = await readManagedManifest(projectRoot, candidate.relativePath);
53
44
  if (read.status === "missing") {
54
45
  continue;
@@ -56,11 +47,18 @@ export async function resolveLabManifest(cwd, lab) {
56
47
  if (read.status === "unsafe") {
57
48
  return invalidLab({ cwd: resolvedCwd, lab, warnings }, read.message);
58
49
  }
50
+ if (candidate.directory.family === "studies") {
51
+ for (const other of candidates.filter((entry) => entry.directory.family === "labs")) {
52
+ const present = await inspectManagedPath(projectRoot, other.relativePath, "file");
53
+ if (present.status !== "missing")
54
+ return ambiguousStudy(resolvedCwd, lab, [candidate.relativePath, other.relativePath], warnings);
55
+ }
56
+ }
59
57
  return parseResolvedLab({
60
58
  cwd: resolvedCwd,
61
59
  lab,
62
- origin: candidate.origin,
63
- path: requestedPath,
60
+ origin: candidate.directory.origin,
61
+ path: path.join(resolvedCwd, candidate.relativePath),
64
62
  warnings,
65
63
  contents: read.contents,
66
64
  });
@@ -70,22 +68,21 @@ export async function resolveLabManifest(cwd, lab) {
70
68
  export async function listLabManifests(cwd) {
71
69
  const resolvedCwd = path.resolve(cwd);
72
70
  const warnings = [];
73
- const labs = new Map();
71
+ const listed = new Map();
74
72
  const projectRoot = await bindProjectRoot(resolvedCwd);
75
73
  if (!projectRoot) {
76
74
  return {
77
- schema: LAB_LIST_SCHEMA,
75
+ schema: STUDY_LIST_SCHEMA,
78
76
  ok: true,
79
77
  cwd: resolvedCwd,
80
- labs: [],
81
- warnings: ["Project root failed containment validation; managed lab manifests were skipped."],
78
+ studies: [],
79
+ warnings: ["Project root failed containment validation; study files were skipped."],
82
80
  };
83
81
  }
84
- const dirs = [
85
- { origin: "committed", relativeDir: committedLabsDir },
86
- ...ignoredLabsDirs.map((relativeDir) => ({ origin: "ignored", relativeDir })),
87
- ];
88
- for (const entry of dirs) {
82
+ let legacyFiles = 0;
83
+ // Each stem's files by directory family, to mark the stems that name a file in both.
84
+ const stems = new Map();
85
+ for (const entry of STUDY_DIRECTORIES) {
89
86
  const directory = await bindManagedDirectory(projectRoot, entry.relativeDir);
90
87
  if (directory.status === "missing") {
91
88
  continue;
@@ -106,13 +103,15 @@ export async function listLabManifests(cwd) {
106
103
  for (const name of names.filter((value) => value.endsWith(".yaml") || value.endsWith(".yml"))) {
107
104
  let relativePath;
108
105
  try {
109
- assertSafeOutputPathSegment(name, "Lab manifest name");
106
+ assertSafeOutputPathSegment(name, "Study file name");
110
107
  relativePath = path.join(entry.relativeDir, name);
111
108
  }
112
109
  catch {
113
- warnings.push(`${entry.relativeDir}: unsafe lab manifest name; skipped.`);
110
+ warnings.push(`${entry.relativeDir}: unsafe study file name; skipped.`);
114
111
  continue;
115
112
  }
113
+ const stem = stemSlot(stems, studyFileStem(name) ?? name);
114
+ stem[entry.family === "studies" ? "studies" : "legacy"] ??= relativeToCwd(resolvedCwd, path.join(resolvedCwd, relativePath));
116
115
  const requestedPath = path.join(resolvedCwd, relativePath);
117
116
  const read = await readManagedManifest(projectRoot, relativePath);
118
117
  if (read.status !== "ok") {
@@ -131,8 +130,11 @@ export async function listLabManifests(cwd) {
131
130
  warnings.push(`${relativeToCwd(resolvedCwd, requestedPath)}: ${parsed.error.message}`);
132
131
  continue;
133
132
  }
133
+ if (legacyStudyWarning(parsed.path, parsed.config.schema) !== undefined)
134
+ legacyFiles += 1;
134
135
  const key = `${parsed.config.id}:${entry.origin}:${relativeToCwd(resolvedCwd, requestedPath)}`;
135
- labs.set(key, {
136
+ stem.keys.push(key);
137
+ listed.set(key, {
136
138
  id: parsed.config.id,
137
139
  source: parsed.config.subject.source,
138
140
  origin: entry.origin,
@@ -145,11 +147,24 @@ export async function listLabManifests(cwd) {
145
147
  });
146
148
  }
147
149
  }
150
+ if (legacyFiles > 0) {
151
+ warnings.push(`${legacyFiles === 1 ? "One study file uses" : `${legacyFiles} study files use`} humanish.lab.v2 or a labs/ directory, which 0.109 stops reading. humanish migrate converts and moves the v2 files; humanish study show names the fix for each file.`);
152
+ }
153
+ for (const [name, stem] of stems) {
154
+ if (stem.studies === undefined || stem.legacy === undefined)
155
+ continue;
156
+ const error = `${name} names two files, ${stem.studies} and ${stem.legacy}; running it by name fails until you delete one (humanish migrate moves a kept labs/ file).`;
157
+ for (const key of stem.keys) {
158
+ const entry = listed.get(key);
159
+ if (entry)
160
+ entry.error = error;
161
+ }
162
+ }
148
163
  return {
149
- schema: LAB_LIST_SCHEMA,
164
+ schema: STUDY_LIST_SCHEMA,
150
165
  ok: true,
151
166
  cwd: resolvedCwd,
152
- labs: [...labs.values()].sort((left, right) => `${left.origin}:${left.id}`.localeCompare(`${right.origin}:${right.id}`)),
167
+ studies: [...listed.values()].sort((left, right) => `${left.origin}:${left.id}`.localeCompare(`${right.origin}:${right.id}`)),
153
168
  warnings,
154
169
  };
155
170
  }
@@ -157,10 +172,10 @@ export async function inspectLabManifest(cwd, lab) {
157
172
  const resolved = await resolveLabManifest(cwd, lab);
158
173
  if (!resolved.ok) {
159
174
  return {
160
- schema: LAB_INSPECT_SCHEMA,
175
+ schema: STUDY_SHOW_SCHEMA,
161
176
  ok: false,
162
177
  cwd: resolved.cwd,
163
- lab,
178
+ study: lab,
164
179
  error: resolved.error,
165
180
  warnings: resolved.warnings,
166
181
  };
@@ -173,23 +188,23 @@ export async function inspectLabManifest(cwd, lab) {
173
188
  if (!(error instanceof PersonaConfigError))
174
189
  throw error;
175
190
  return {
176
- schema: LAB_INSPECT_SCHEMA,
191
+ schema: STUDY_SHOW_SCHEMA,
177
192
  ok: false,
178
193
  cwd: path.resolve(cwd),
179
- lab,
180
- error: { code: "HUMANISH_LAB_INVALID", message: error.message },
194
+ study: lab,
195
+ error: { code: "HUMANISH_STUDY_INVALID", message: error.message },
181
196
  warnings: resolved.warnings,
182
197
  };
183
198
  }
184
199
  return {
185
- schema: LAB_INSPECT_SCHEMA,
200
+ schema: STUDY_SHOW_SCHEMA,
186
201
  personas: labPersonaIds(resolved.config).map((id) => {
187
202
  const persona = personaResolution.personas.get(id);
188
203
  return { id, resolved: !!persona, ...(persona ? { brief: personaBrief(persona) } : {}) };
189
204
  }),
190
205
  ok: true,
191
206
  cwd: path.resolve(cwd),
192
- lab,
207
+ study: lab,
193
208
  config: resolved.config,
194
209
  origin: resolved.origin,
195
210
  path: resolved.path,
@@ -202,13 +217,16 @@ function parseResolvedLab(args) {
202
217
  raw = parse(args.contents);
203
218
  }
204
219
  catch (error) {
205
- return invalidLab(args, error instanceof Error ? error.message : "Lab YAML could not be parsed.");
220
+ return invalidLab(args, error instanceof Error ? error.message : "The study file's YAML could not be parsed.");
206
221
  }
207
222
  const parsed = parseLabConfig(raw);
208
223
  if (!parsed.ok) {
209
224
  return invalidLab(args, parsed.error.message);
210
225
  }
211
226
  const warnings = [...args.warnings, ...parsed.warnings];
227
+ const legacy = legacyStudyWarning(relativeToCwd(args.cwd, args.path), parsed.config.schema);
228
+ if (legacy !== undefined)
229
+ warnings.push(legacy);
212
230
  if (args.path.endsWith(".yml")) {
213
231
  warnings.push("Prefer .yaml for humanish-authored lab source; .yml is accepted for compatibility only.");
214
232
  }
@@ -220,6 +238,24 @@ function parseResolvedLab(args) {
220
238
  warnings,
221
239
  };
222
240
  }
241
+ /**
242
+ * What 0.109 stops reading in this file: the humanish.lab.v2 format, a labs/ directory, or both, and
243
+ * what to run about it. Undefined for a v3 file outside the labs/ directories.
244
+ */
245
+ function legacyStudyWarning(relativePath, schema) {
246
+ const retiredDirectory = STUDY_DIRECTORIES.find((directory) => directory.family === "labs" && path.dirname(relativePath) === directory.relativeDir);
247
+ // A file discovery parsed has one of two schemas, so not v3 is v2.
248
+ const v2 = schema !== STUDY_SCHEMA;
249
+ if (retiredDirectory !== undefined) {
250
+ const studies = retiredDirectory.relativeDir.replace(/labs$/, "studies");
251
+ return v2
252
+ ? `${relativePath} is a humanish.lab.v2 file in ${retiredDirectory.relativeDir}/, and 0.109 reads neither. Run humanish migrate to convert it and move it to ${studies}/.`
253
+ : `${relativePath} is in ${retiredDirectory.relativeDir}/, which 0.109 stops reading. Move it to ${studies}/.`;
254
+ }
255
+ return v2
256
+ ? `${relativePath} is a humanish.lab.v2 file, which 0.109 stops reading. Run humanish migrate ${relativePath} to convert it.`
257
+ : undefined;
258
+ }
223
259
  async function bindProjectRoot(cwd) {
224
260
  try {
225
261
  const lexical = await lstat(cwd);
@@ -241,7 +277,7 @@ async function readManagedManifest(projectRoot, relativePath) {
241
277
  if (!contents) {
242
278
  return {
243
279
  status: "unsafe",
244
- message: "Managed lab manifest changed or failed containment validation.",
280
+ message: "The study file changed or failed containment validation.",
245
281
  };
246
282
  }
247
283
  return { status: "ok", contents: contents.toString("utf8") };
@@ -263,7 +299,7 @@ async function readExplicitManifest(projectRoot, requestedPath) {
263
299
  if (!before.isFile() || before.isSymbolicLink() || before.nlink !== 1n) {
264
300
  return {
265
301
  status: "unsafe",
266
- message: "Explicit lab manifest must resolve to a single-link regular file.",
302
+ message: "The study file path must resolve to a single-link regular file.",
267
303
  };
268
304
  }
269
305
  const handle = await open(physicalPath, constants.O_RDONLY | constants.O_NOFOLLOW);
@@ -275,7 +311,7 @@ async function readExplicitManifest(projectRoot, requestedPath) {
275
311
  opened.ino !== before.ino) {
276
312
  return {
277
313
  status: "unsafe",
278
- message: "Explicit lab manifest changed before it could be read safely.",
314
+ message: "The study file changed before it could be read safely.",
279
315
  };
280
316
  }
281
317
  const contents = await handle.readFile();
@@ -292,7 +328,7 @@ async function readExplicitManifest(projectRoot, requestedPath) {
292
328
  after.ino !== before.ino) {
293
329
  return {
294
330
  status: "unsafe",
295
- message: "Explicit lab manifest changed while it was being read.",
331
+ message: "The study file changed while it was being read.",
296
332
  };
297
333
  }
298
334
  return { status: "ok", contents: contents.toString("utf8") };
@@ -302,7 +338,7 @@ async function readExplicitManifest(projectRoot, requestedPath) {
302
338
  }
303
339
  }
304
340
  catch {
305
- return { status: "unsafe", message: "Explicit lab manifest failed containment validation." };
341
+ return { status: "unsafe", message: "The study file path failed containment validation." };
306
342
  }
307
343
  }
308
344
  async function bindManagedDirectory(projectRoot, relativePath) {
@@ -326,7 +362,7 @@ async function inspectManagedPath(projectRoot, relativePath, expectedKind) {
326
362
  const segments = relativePath.replace(/\\/g, "/").split("/");
327
363
  let current = projectRoot.physicalPath;
328
364
  for (const [index, segment] of segments.entries()) {
329
- assertSafeOutputPathSegment(segment, "Managed lab path segment");
365
+ assertSafeOutputPathSegment(segment, "Study file path segment");
330
366
  current = path.join(current, segment);
331
367
  let stats;
332
368
  try {
@@ -340,18 +376,21 @@ async function inspectManagedPath(projectRoot, relativePath, expectedKind) {
340
376
  }
341
377
  const leaf = index === segments.length - 1;
342
378
  if (stats.isSymbolicLink()) {
343
- return { status: "unsafe", message: "Managed lab paths must not contain symbolic links." };
379
+ return {
380
+ status: "unsafe",
381
+ message: "Study directory paths must not contain symbolic links.",
382
+ };
344
383
  }
345
384
  if (!leaf && !stats.isDirectory()) {
346
- return { status: "unsafe", message: "Managed lab path parents must be directories." };
385
+ return { status: "unsafe", message: "Study file path parents must be directories." };
347
386
  }
348
387
  if (leaf && expectedKind === "directory" && !stats.isDirectory()) {
349
- return { status: "unsafe", message: "Managed lab directory has an unsafe file type." };
388
+ return { status: "unsafe", message: "A study directory has an unsafe file type." };
350
389
  }
351
390
  if (leaf && expectedKind === "file" && (!stats.isFile() || stats.nlink !== 1n)) {
352
391
  return {
353
392
  status: "unsafe",
354
- message: "Managed lab manifest must be a single-link regular file.",
393
+ message: "A study file must be a single-link regular file.",
355
394
  };
356
395
  }
357
396
  if (leaf) {
@@ -367,7 +406,7 @@ async function inspectManagedPath(projectRoot, relativePath, expectedKind) {
367
406
  }
368
407
  }
369
408
  catch {
370
- return { status: "unsafe", message: "Managed lab path failed containment validation." };
409
+ return { status: "unsafe", message: "A study file path failed containment validation." };
371
410
  }
372
411
  return { status: "missing" };
373
412
  }
@@ -386,22 +425,44 @@ function invalidLab(args, message) {
386
425
  return {
387
426
  ok: false,
388
427
  cwd: args.cwd,
389
- lab: args.lab,
428
+ study: args.lab,
390
429
  error: {
391
- code: "HUMANISH_LAB_INVALID",
430
+ code: "HUMANISH_STUDY_INVALID",
392
431
  message,
393
432
  },
394
433
  warnings: args.warnings,
395
434
  };
396
435
  }
436
+ function stemSlot(stems, name) {
437
+ let slot = stems.get(name);
438
+ if (slot === undefined) {
439
+ slot = { keys: [] };
440
+ stems.set(name, slot);
441
+ }
442
+ return slot;
443
+ }
444
+ /** The same stem under a studies/ and a labs/ directory: discovery reads neither. */
445
+ function ambiguousStudy(cwd, name, paths, warnings) {
446
+ const [studiesPath, labsPath] = paths.map((entry) => entry.replace(/\\/g, "/"));
447
+ return {
448
+ ok: false,
449
+ cwd,
450
+ study: name,
451
+ error: {
452
+ code: "HUMANISH_STUDY_AMBIGUOUS",
453
+ message: `${name} names two files, ${studiesPath} and ${labsPath}. Delete the one you do not want; if you keep ${labsPath}, run humanish migrate to move it. Or pass the path of the one to run.`,
454
+ },
455
+ warnings,
456
+ };
457
+ }
397
458
  function labNotFound(cwd, lab, warnings) {
398
459
  return {
399
460
  ok: false,
400
461
  cwd,
401
- lab,
462
+ study: lab,
402
463
  error: {
403
- code: "HUMANISH_LAB_NOT_FOUND",
404
- message: `Lab not found: ${lab}. Look in humanish/labs/ or pass a .yaml path.`,
464
+ code: "HUMANISH_STUDY_NOT_FOUND",
465
+ message: `Study not found: ${lab}. Look in humanish/studies/ or humanish/labs/, or pass a .yaml path.`,
405
466
  },
406
467
  warnings,
407
468
  };
@@ -417,6 +478,3 @@ function relativeToCwd(cwd, filePath) {
417
478
  const relative = path.relative(cwd, filePath);
418
479
  return relative && !relative.startsWith("..") ? relative : filePath;
419
480
  }
420
- function isNodeError(error) {
421
- return error instanceof Error && "code" in error;
422
- }
@@ -1,21 +1,48 @@
1
1
  import { type LocalRuntimeStatus } from "../substrates/local/runtime.js";
2
2
  import type { LabConfig } from "./types.js";
3
- import type { LabRoute } from "./plan.js";
3
+ import type { PlanResult } from "./plan-types.js";
4
4
  import type { DetectedLocalAgent } from "../actors/local-agent/cli.js";
5
- import type { DoctorResult } from "../cli/doctor.js";
6
- type Check = DoctorResult["checks"][number];
7
- /** Read-only Codex account readiness. An unadmitted CLI also reports the release it found. */
5
+ import type { ReasoningEffort } from "../actors/reasoning-effort.js";
6
+ import type { DoctorCheckDraft } from "../cli/doctor.js";
7
+ import { type CodexInstallation } from "../actors/codex/codex-admission.js";
8
+ import type { RefusedCodexExecutable } from "../actors/codex/restricted-executable.js";
9
+ type Check = DoctorCheckDraft;
10
+ /**
11
+ * Read-only Codex account readiness. An unadmitted CLI also reports the release it found, and an
12
+ * unavailable one the file humanish found and turned down.
13
+ */
8
14
  type CodexReadiness = {
9
15
  ready: boolean;
10
16
  errorCode: string | null;
11
17
  detectedCliVersion?: string;
18
+ refusedExecutable?: RefusedCodexExecutable;
19
+ /** Where the `codex` on `PATH` was installed, for the command that replaces it. */
20
+ installation?: CodexInstallation;
21
+ /** How the release's app-server schema differs from the fields humanish reads. */
22
+ protocolIncompatibilities?: readonly string[];
23
+ /** Schema values beyond the baseline, recorded by a launch that passed. */
24
+ protocolAdditions?: readonly string[];
12
25
  };
26
+ /** What doctor's hosted Codex participant check found: a readiness result and what it admitted. */
27
+ type HostedCodexReadiness = CodexReadiness & {
28
+ cliVersion?: string;
29
+ resolvedModel?: string;
30
+ authentication?: "chatgpt-account" | "api-key";
31
+ };
32
+ /**
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.
35
+ */
36
+ declare function hostedCodexReadiness(env: NodeJS.ProcessEnv, actor: {
37
+ model?: string;
38
+ reasoningEffort?: ReasoningEffort;
39
+ }): Promise<HostedCodexReadiness>;
13
40
  /** Shared read-only Codex account check for local participants in doctor and the TUI. */
14
41
  export declare function localCodexParticipantCheck(args: {
15
42
  env: NodeJS.ProcessEnv;
16
43
  readiness?: (env: NodeJS.ProcessEnv) => Promise<CodexReadiness>;
17
44
  }): Promise<Check>;
18
- interface LabSetupCheckArgs {
45
+ export interface LabSetupCheckArgs {
19
46
  cwd: string;
20
47
  lab: string;
21
48
  env: NodeJS.ProcessEnv;
@@ -24,16 +51,31 @@ interface LabSetupCheckArgs {
24
51
  /** Internal read-only qualification seam; never a participant/model request. */
25
52
  localRuntimeReadiness?: () => Promise<LocalRuntimeStatus>;
26
53
  codexAnalysisReadiness?: (env: NodeJS.ProcessEnv) => Promise<CodexReadiness>;
54
+ /** The hosted Codex participant's operator handshake; tests replace it. */
55
+ codexParticipantReadiness?: typeof hostedCodexReadiness;
27
56
  }
28
- /** Setup checks only: no model turn, browser or desktop creation. CLI startup may use the network. */
57
+ /**
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
61
+ * scorer's host code may read any key.
62
+ */
29
63
  export declare function labSetupChecks(args: LabSetupCheckArgs): Promise<{
30
64
  desktop: boolean;
31
65
  keys: string[];
66
+ reads?: ReadonlySet<string>;
32
67
  checks: Check[];
33
68
  }>;
34
- /** Required participant provider keys, shared by doctor and the TUI. Optional analysis is separate. */
35
- export declare function labKeyRequirements(config: LabConfig, route: LabRoute, dryRun: boolean, keyPresent: (name: string) => boolean): {
36
- desktop: boolean;
37
- keys: string[];
38
- };
69
+ /**
70
+ * The ids of the project's labs that need each provider key for a live run, from the same plan
71
+ * `doctor --lab` reads. Each listed manifest resolves by its path, since a file name need not match
72
+ * the id inside. A lab 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 lab planned with no run options, so its own scenario mode decides dry or live. Doctor and the
78
+ * TUI read a live run's keys and subject env from this plan's requirements.
79
+ */
80
+ export declare function planCliRun(config: LabConfig, cwd: string): Promise<PlanResult>;
39
81
  export {};