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
package/dist/run-lab.js CHANGED
@@ -6,10 +6,9 @@
6
6
  // refusal before it loads a declared review scorer.
7
7
  import { computerUseInput, scriptedInput, sharedWorldInput, terminalInput, } from "./lab/route-inputs.js";
8
8
  import { planLab, resolveLabDryRun, routeOf } from "./lab/plan.js";
9
- import { normalizeRunLabOptions, optionRefusalOutcome, } from "./lab/run-lab-options.js";
9
+ import { normalizeRunLabOptions, optionRefusalOutcome, removedOptionRefusal, } from "./lab/run-lab-options.js";
10
10
  import {} from "./lab/types.js";
11
11
  import { admitComputerUsePlan, computerUseLabRefusal } from "./routes/computer-use/route.js";
12
- import { participantDesktopOf } from "./routes/computer-use/participant-desktop.js";
13
12
  import {} from "./routes/computer-use/types.js";
14
13
  import { admitPreviewPlan, previewLabRefusal } from "./routes/preview.js";
15
14
  import { admitScriptedPlan, scriptedLabRefusal } from "./routes/scripted/route.js";
@@ -19,48 +18,57 @@ import {} from "./routes/shared-world/types.js";
19
18
  import { admitTerminalPlan, terminalLabRefusal } from "./routes/terminal/route.js";
20
19
  import {} from "./routes/terminal/types.js";
21
20
  import {} from "./run/bundle.js";
22
- import {} from "./run/results.js";
23
- import {} from "./run/status.js";
24
21
  import { isLocalBrowserLab, localBrowserDefaults } from "./substrates/local/runtime-config.js";
25
22
  /**
26
23
  * Runs a lab on its route. The options are checked against the route and mapped into the route's
27
24
  * hook bags before anything runs. Each route closes the run it started on every exit through its
28
25
  * own run scope (`src/run/run.ts`).
29
26
  */
30
- export async function runLab(config, options) {
31
- const prepared = await prepareLab(config, options);
27
+ export async function runLab(config, options, deps = {}) {
28
+ const prepared = await prepareLab(config, options, deps);
32
29
  return prepared.ok ? prepared.run() : prepared.outcome;
33
30
  }
31
+ /**
32
+ * runLab as the package exports it (`src/index.ts`): the public options only. A JavaScript caller
33
+ * that passes a field RunLabOptions no longer has is refused in the route's own result envelope
34
+ * before anything runs.
35
+ */
36
+ export async function runPackageLab(config, options) {
37
+ const removed = removedOptionRefusal(options);
38
+ if (removed === undefined)
39
+ return runLab(config, options);
40
+ const lab = localBrowserDefaults(config);
41
+ return optionRefusalOutcome(lab, routeOf(lab), options, removed);
42
+ }
34
43
  /**
35
44
  * Normalizes the options and plans the lab once, so a caller can present a refusal before it loads
36
- * anything the run needs. A local browser study's desktop lane and provider are bound first, so the
37
- * plan is made with them; with createDesktopLane the caller provides the desktop, and with
38
- * buildExecutor it drives the app in process and needs none.
45
+ * anything the run needs. A local browser study's provider is bound first, so the plan is made with
46
+ * it, and its desktop goes to the computer-use run as `localVm`; with inProcess the caller drives
47
+ * the app in process and needs no desktop.
39
48
  */
40
- export async function prepareLab(config, options) {
49
+ export async function prepareLab(config, options, deps = {}) {
41
50
  const lab = localBrowserDefaults(config);
42
51
  const route = routeOf(lab);
43
52
  const normalized = normalizeRunLabOptions(lab, route, options);
44
53
  if (!normalized.ok)
45
54
  return { ok: false, outcome: optionRefusalOutcome(lab, route, options, normalized) };
46
- const hooks = normalized.options.cuaHooks;
47
- const localVm = isLocalBrowserLab(lab) &&
48
- (hooks === undefined || participantDesktopOf(hooks) === undefined) &&
49
- hooks?.buildExecutor === undefined
50
- ? (await import("./routes/computer-use/local-vm.js")).prepareLocalVmStudy
55
+ // An in-process executor needs no desktop, and a caller that already prepared the study passes
56
+ // its localVm, which a second study would replace.
57
+ const prepareLocalVm = isLocalBrowserLab(lab) && options.inProcess === undefined && options.localVm === undefined
58
+ ? (await import("./routes/computer-use/local-vm.js")).prepareLocalVmRun
51
59
  : undefined;
52
- const study = localVm?.({ ...normalized.options, config: lab });
53
- const planning = study?.options ?? normalized.options;
54
- const planned = planLab(lab, planning);
60
+ const vm = prepareLocalVm?.({ ...normalized.options, config: lab });
61
+ const planning = vm === undefined ? normalized.options : { ...vm.options, localVm: vm.localVm };
62
+ const planned = planLab(lab, planning, deps);
55
63
  if (!planned.ok) {
56
- await study?.close();
57
- const outcome = await refusalOutcome(lab, planning, planned.refusal);
64
+ await vm?.close();
65
+ const outcome = await refusalOutcome(lab, planning, planned.refusal, deps, normalized.emit);
58
66
  outcome.result.warnings.push(...normalized.warnings);
59
67
  return { ok: false, outcome };
60
68
  }
61
- const admitted = await admitPlan(lab, planning, planned.planned.plan);
69
+ const admitted = await admitPlan(lab, planning, planned.planned.plan, deps, normalized.emit);
62
70
  if (!admitted.ok) {
63
- await study?.close();
71
+ await vm?.close();
64
72
  admitted.outcome.result.warnings.push(...normalized.warnings);
65
73
  return { ok: false, outcome: admitted.outcome };
66
74
  }
@@ -88,61 +96,55 @@ export async function prepareLab(config, options) {
88
96
  return outcome;
89
97
  }
90
98
  finally {
91
- await study?.close();
99
+ await vm?.close();
92
100
  }
93
101
  },
94
102
  };
95
103
  }
96
104
  /** The route's admit function for a plan, with the route's input from the run's options. */
97
- async function admitPlan(config, options, plan) {
105
+ async function admitPlan(config, options, plan, deps, emit) {
98
106
  switch (plan.route) {
99
107
  case "preview":
100
108
  return admitPreviewPlan(plan, options);
101
109
  case "computer-use":
102
- return admitComputerUsePlan(plan, computerUseInput(options), config);
110
+ return admitComputerUsePlan(plan, computerUseInput(options, deps, emit), config);
103
111
  case "scripted":
104
- return admitScriptedPlan(plan, scriptedInput(options));
112
+ return admitScriptedPlan(plan, scriptedInput(options, deps, emit));
105
113
  case "terminal":
106
- return admitTerminalPlan(plan, terminalInput(options));
114
+ return admitTerminalPlan(plan, terminalInput(options, deps, emit));
107
115
  case "shared-world":
108
- return admitSharedWorldPlan(plan, sharedWorldInput(options), config);
116
+ return admitSharedWorldPlan(plan, sharedWorldInput(options, deps, emit), config);
109
117
  }
110
118
  }
111
119
  /** The refused route's own result, with the envelope and analysis record its runner returns. */
112
- async function refusalOutcome(config, options, refusal) {
120
+ async function refusalOutcome(config, options, refusal, deps, emit) {
113
121
  // Spend-safe default: a lab goes live only when the config (or CLI) says so.
114
122
  const dryRun = resolveLabDryRun(config, options.dryRun, true) ?? true;
115
- const lab = options.lab === undefined ? {} : { lab: options.lab };
116
123
  switch (refusal.route) {
117
124
  case "preview":
118
125
  return {
119
126
  route: "preview",
120
- backend: "synthetic",
121
- result: previewLabRefusal(options.cwd, refusal),
127
+ result: previewLabRefusal(options.cwd, config.id, refusal),
122
128
  };
123
129
  case "computer-use":
124
130
  return {
125
131
  route: "computer-use",
126
- backend: "cua",
127
- result: await computerUseLabRefusal({ ...computerUseInput(options), ...lab, config, dryRun }, refusal),
132
+ result: await computerUseLabRefusal({ ...computerUseInput(options, deps, emit), config, dryRun }, refusal),
128
133
  };
129
134
  case "scripted":
130
135
  return {
131
136
  route: "scripted",
132
- backend: "scripted",
133
- result: await scriptedLabRefusal({ ...scriptedInput(options), ...lab, config, dryRun }, refusal),
137
+ result: await scriptedLabRefusal({ ...scriptedInput(options, deps, emit), config, dryRun }, refusal),
134
138
  };
135
139
  case "terminal":
136
140
  return {
137
141
  route: "terminal",
138
- backend: "terminal",
139
- result: await terminalLabRefusal({ ...terminalInput(options), ...lab, config, dryRun }, refusal),
142
+ result: await terminalLabRefusal({ ...terminalInput(options, deps, emit), config, dryRun }, refusal),
140
143
  };
141
144
  case "shared-world":
142
145
  return {
143
146
  route: "shared-world",
144
- backend: "concurrent-shared-world",
145
- result: await sharedWorldLabRefusal({ ...sharedWorldInput(options), ...lab, config, dryRun }, refusal),
147
+ result: await sharedWorldLabRefusal({ ...sharedWorldInput(options, deps, emit), config, dryRun }, refusal),
146
148
  };
147
149
  }
148
150
  }
@@ -0,0 +1,33 @@
1
+ import type { StudyRoute } from "../lab/parse/study-v3.js";
2
+ /** A key the conversion moved, by its v2 path and its v3 path. */
3
+ export interface MovedKey {
4
+ readonly from: string;
5
+ readonly to: string;
6
+ }
7
+ /** A key the conversion dropped because the study's route never reads it. */
8
+ export interface DroppedKey {
9
+ readonly path: string;
10
+ readonly value: unknown;
11
+ /** The comments that sat on the dropped key, which the v3 file no longer has. */
12
+ readonly comments?: string;
13
+ }
14
+ /** A v2 file converted to v3. */
15
+ interface StudyConversion {
16
+ readonly text: string;
17
+ readonly route: StudyRoute;
18
+ readonly moved: readonly MovedKey[];
19
+ readonly dropped: readonly DroppedKey[];
20
+ }
21
+ /** The conversion, or why the file cannot be converted as it stands. */
22
+ export type StudyConversionResult = {
23
+ readonly ok: true;
24
+ readonly conversion: StudyConversion;
25
+ } | {
26
+ readonly ok: false;
27
+ readonly reason: string;
28
+ };
29
+ /** Whether a parsed YAML value is a v3 study file. */
30
+ export declare function isStudyV3(raw: unknown): boolean;
31
+ /** Convert one v2 file's text. `cwd` is the project the plan check plans in. */
32
+ export declare function convertStudyText(text: string, cwd: string): StudyConversionResult;
33
+ export {};
@@ -0,0 +1,432 @@
1
+ // Convert a humanish.lab.v2 study file to humanish.study.v3. It edits the parsed YAML document in
2
+ // place and moves each pair node, so the comments on a moved key move with it. The result lists
3
+ // every key it moved and every key it dropped. It refuses a file whose v3 form would parse or plan
4
+ // differently from the v2 source with the dropped keys removed.
5
+ import { isAlias, isMap, isScalar, isSeq, LineCounter, Pair, parseDocument, Scalar, visit, YAMLMap, YAMLSeq, } from "yaml";
6
+ import { parseLabConfig } from "../lab/config.js";
7
+ import { focusOf } from "../lab/parse/actors.js";
8
+ import { posInt } from "../lab/parse/values.js";
9
+ import { planLab } from "../lab/plan.js";
10
+ import { routeOf } from "../lab/routing.js";
11
+ import { LAB_CONFIG_SCHEMA, STUDY_SCHEMA } from "../lab/types.js";
12
+ import { inertFieldPaths } from "../lab/warnings.js";
13
+ import { deleteNodeFieldPath, deletePlainFieldPath, pairIndex, readFieldPath, } from "./field-paths.js";
14
+ function isPlainRecord(value) {
15
+ return typeof value === "object" && value !== null && !Array.isArray(value);
16
+ }
17
+ function refuse(reason) {
18
+ return { ok: false, reason };
19
+ }
20
+ /** Whether a parsed YAML value is a v3 study file. */
21
+ export function isStudyV3(raw) {
22
+ return isPlainRecord(raw) && raw.schema === STUDY_SCHEMA;
23
+ }
24
+ /** Convert one v2 file's text. `cwd` is the project the plan check plans in. */
25
+ export function convertStudyText(text, cwd) {
26
+ const lineCounter = new LineCounter();
27
+ const doc = parseDocument(text, { lineCounter });
28
+ if (doc.errors.length > 0)
29
+ return refuse(`it is not valid YAML: ${doc.errors[0].message}`);
30
+ const anchorLine = firstAnchorLine(doc, lineCounter);
31
+ if (anchorLine !== undefined) {
32
+ return refuse(`line ${anchorLine} uses a YAML anchor or alias. Write the value out in full, then migrate.`);
33
+ }
34
+ const raw = doc.toJS();
35
+ if (!isPlainRecord(raw) || !isMap(doc.contents))
36
+ return refuse("it is not a YAML mapping.");
37
+ if (raw.schema !== LAB_CONFIG_SCHEMA)
38
+ return refuse(`its schema is not ${LAB_CONFIG_SCHEMA}.`);
39
+ const source = parseLabConfig(raw);
40
+ if (!source.ok)
41
+ return refuse(`it does not parse: ${source.error.message}`);
42
+ const route = routeOf(source.config);
43
+ const actorRaw = Array.isArray(raw.actors) ? raw.actors[0] : undefined;
44
+ if (route === "terminal" && isPlainRecord(actorRaw)) {
45
+ for (const key of ["count", "laneFocus"]) {
46
+ if (actorRaw[key] !== undefined) {
47
+ return refuse(`actors[0].${key} does nothing on the terminal route, and a v3 terminal study has no participants. Remove it, then migrate.`);
48
+ }
49
+ }
50
+ }
51
+ const root = doc.contents;
52
+ const dropped = [];
53
+ for (const path of droppedPaths(source.config, route, raw)) {
54
+ const value = readFieldPath(raw, path);
55
+ const pairs = deleteNodeFieldPath(root, path);
56
+ if (value === undefined || pairs.length === 0)
57
+ continue;
58
+ const comments = pairComments(pairs);
59
+ dropped.push({ path, value, ...(comments === undefined ? {} : { comments }) });
60
+ }
61
+ const moved = [];
62
+ // v2 reads some laneFocus values as no focus at all ({}, a valueless key, valueless fields).
63
+ const focused = focusOf(source.config.actors[0]) !== undefined;
64
+ const converted = convertDocument(root, route, focused, moved);
65
+ if (!converted.ok)
66
+ return converted;
67
+ const out = doc.toString({ lineWidth: foldWidth(text), flowCollectionPadding: false });
68
+ // Fail closed: a comment the conversion did not carry over or report stops it.
69
+ const lost = lostComment(text, out, dropped);
70
+ if (lost !== undefined)
71
+ return refuse(`it would lose the comment "${lost}".`);
72
+ const check = samePlans(raw, dropped.map((key) => key.path), out, cwd);
73
+ if (!check.ok)
74
+ return check;
75
+ return { ok: true, conversion: { text: out, route, moved, dropped } };
76
+ }
77
+ // Every comment line in a YAML text, trimmed.
78
+ function commentLinesOf(text) {
79
+ const doc = parseDocument(text);
80
+ const found = [doc.commentBefore ?? "", doc.comment ?? ""];
81
+ visit(doc, (_key, node) => {
82
+ // An implicit empty value, as `id` in `{id, instruction: x}`, is a null node.
83
+ if (typeof node !== "object" || node === null)
84
+ return;
85
+ const commented = node;
86
+ found.push(commented.commentBefore ?? "", commented.comment ?? "");
87
+ });
88
+ return found
89
+ .flatMap((comment) => comment.split("\n"))
90
+ .map((line) => line.trim())
91
+ .filter(Boolean);
92
+ }
93
+ // The first comment line of the source that is neither in the output nor in a dropped key's report.
94
+ function lostComment(source, output, dropped) {
95
+ const kept = new Map();
96
+ const reported = dropped.flatMap((key) => (key.comments ?? "").split("\n"));
97
+ for (const line of [...commentLinesOf(output), ...reported.map((line) => line.trim())])
98
+ if (line)
99
+ kept.set(line, (kept.get(line) ?? 0) + 1);
100
+ for (const line of commentLinesOf(source)) {
101
+ const left = kept.get(line) ?? 0;
102
+ if (left === 0)
103
+ return line;
104
+ kept.set(line, left - 1);
105
+ }
106
+ return undefined;
107
+ }
108
+ // The inert-field table's paths for the route, plus terminal `execution.timeoutMs`, which no
109
+ // terminal code reads. Parents come before their children, so a child under a dropped parent is
110
+ // reported with the parent.
111
+ function droppedPaths(config, route, raw) {
112
+ const paths = inertFieldPaths(config);
113
+ if (route === "terminal" && readFieldPath(raw, "execution.timeoutMs") !== undefined)
114
+ paths.push("execution.timeoutMs");
115
+ const depth = (path) => path.split(".").length;
116
+ return [...new Set(paths)].sort((left, right) => depth(left) - depth(right));
117
+ }
118
+ // Folded text is folded again on output. Most of a file's long lines end near the width its author
119
+ // folded at, so the 90th percentile of their lengths stands for it, between 80 and 120.
120
+ function foldWidth(text) {
121
+ const long = text
122
+ .split("\n")
123
+ .map((line) => line.length)
124
+ .filter((length) => length > 60)
125
+ .sort((left, right) => left - right);
126
+ if (long.length === 0)
127
+ return 80;
128
+ const width = long[Math.min(long.length - 1, Math.floor(long.length * 0.9))];
129
+ return Math.min(120, Math.max(80, width));
130
+ }
131
+ function firstAnchorLine(doc, lineCounter) {
132
+ let line;
133
+ visit(doc, (_key, node) => {
134
+ const anchored = isAlias(node) ||
135
+ (typeof node === "object" &&
136
+ node !== null &&
137
+ "anchor" in node &&
138
+ Boolean(node.anchor));
139
+ if (!anchored)
140
+ return undefined;
141
+ const offset = node.range?.[0] ?? 0;
142
+ line = lineCounter.linePos(offset).line;
143
+ return visit.BREAK;
144
+ });
145
+ return line;
146
+ }
147
+ // Every comment on a node and everything under it.
148
+ function subtreeComments(node, found) {
149
+ if (typeof node !== "object" || node === null)
150
+ return;
151
+ const commented = node;
152
+ if (commented.commentBefore)
153
+ found.push(commented.commentBefore);
154
+ if (commented.comment)
155
+ found.push(commented.comment);
156
+ if (isMap(node) || isSeq(node)) {
157
+ for (const item of node.items) {
158
+ if (item instanceof Pair) {
159
+ subtreeComments(item.key, found);
160
+ subtreeComments(item.value, found);
161
+ }
162
+ else
163
+ subtreeComments(item, found);
164
+ }
165
+ }
166
+ }
167
+ function pairComments(pairs) {
168
+ const found = [];
169
+ for (const pair of pairs) {
170
+ subtreeComments(pair.key, found);
171
+ subtreeComments(pair.value, found);
172
+ }
173
+ const text = found
174
+ .flatMap((comment) => comment.split("\n"))
175
+ .map((line) => line.trim())
176
+ .filter(Boolean)
177
+ .join("\n");
178
+ return text.length > 0 ? text : undefined;
179
+ }
180
+ function keyNode(pair) {
181
+ return pair.key;
182
+ }
183
+ function rename(pair, key) {
184
+ keyNode(pair).value = key;
185
+ }
186
+ function addCommentBefore(pair, comment) {
187
+ if (!comment)
188
+ return;
189
+ const key = keyNode(pair);
190
+ key.commentBefore = key.commentBefore ? `${comment}\n${key.commentBefore}` : comment;
191
+ }
192
+ // Remove `key` from a mapping. A comment the mapping holds above its first key belongs to that key.
193
+ function take(map, key) {
194
+ if (!isMap(map))
195
+ return undefined;
196
+ const index = pairIndex(map, key);
197
+ if (index < 0)
198
+ return undefined;
199
+ const [pair] = map.items.splice(index, 1);
200
+ if (index === 0 && map.commentBefore) {
201
+ addCommentBefore(pair, map.commentBefore);
202
+ map.commentBefore = null;
203
+ }
204
+ return pair;
205
+ }
206
+ function insertAfter(map, anchors, ...pairs) {
207
+ const anchor = anchors.map((key) => pairIndex(map, key)).find((index) => index >= 0);
208
+ map.items.splice(anchor === undefined ? 0 : anchor + 1, 0, ...pairs);
209
+ }
210
+ // A removed section's trailing comment goes above the pair that followed the section, which is
211
+ // where it sat in the file, or to the end of the file when nothing followed.
212
+ function keepTrailingComment(root, next, comment) {
213
+ if (!comment)
214
+ return;
215
+ if (next !== undefined)
216
+ addCommentBefore(next, comment);
217
+ else
218
+ root.comment = root.comment ? `${root.comment}\n${comment}` : comment;
219
+ }
220
+ // Remove a key from a top-level section, and the section with it once it is empty. The section's
221
+ // own comments move to the promoted key.
222
+ function promote(root, section, key) {
223
+ const index = pairIndex(root, section);
224
+ if (index < 0)
225
+ return undefined;
226
+ const container = root.items[index];
227
+ const pair = take(container.value, key);
228
+ if (pair === undefined)
229
+ return undefined;
230
+ if (isMap(container.value) && container.value.items.length === 0) {
231
+ const next = root.items[index + 1];
232
+ root.items.splice(index, 1);
233
+ addCommentBefore(pair, keyNode(container).commentBefore);
234
+ keepTrailingComment(root, next, container.value.comment);
235
+ }
236
+ return pair;
237
+ }
238
+ function convertDocument(root, route, focused, moved) {
239
+ const schema = root.items[pairIndex(root, "schema")];
240
+ if (schema && isScalar(schema.value))
241
+ schema.value.value = STUDY_SCHEMA;
242
+ // actors[0] becomes actor, at the same position.
243
+ const actorsPair = root.items[pairIndex(root, "actors")];
244
+ if (!actorsPair || !isSeq(actorsPair.value) || !isMap(actorsPair.value.items[0]))
245
+ return refuse("its actors list does not hold one actor mapping.");
246
+ const list = actorsPair.value;
247
+ const actor = list.items[0];
248
+ if (list.commentBefore)
249
+ actor.commentBefore = [list.commentBefore, actor.commentBefore].filter(Boolean).join("\n");
250
+ if (list.comment)
251
+ actor.comment = [actor.comment, list.comment].filter(Boolean).join("\n");
252
+ rename(actorsPair, "actor");
253
+ actorsPair.value = actor;
254
+ moved.push({ from: "actors[0]", to: "actor" });
255
+ let after = "actor";
256
+ const participants = participantsPair(actor, route, focused, moved);
257
+ if (participants !== undefined) {
258
+ insertAfter(root, [after], participants);
259
+ after = String(keyNode(participants).value);
260
+ }
261
+ const capsSection = route === "terminal" ? "scenario" : "execution";
262
+ const caps = promote(root, capsSection, "caps");
263
+ if (caps !== undefined) {
264
+ insertAfter(root, [after], caps);
265
+ moved.push({ from: `${capsSection}.caps`, to: "caps" });
266
+ }
267
+ // scenario.ref becomes scenario, a string, where scenario was; scenario.mode becomes mode.
268
+ let mode;
269
+ const scenarioIndex = pairIndex(root, "scenario");
270
+ if (scenarioIndex >= 0) {
271
+ const scenario = root.items[scenarioIndex];
272
+ mode = take(scenario.value, "mode");
273
+ const ref = take(scenario.value, "ref");
274
+ if (isMap(scenario.value) && scenario.value.items.length > 0) {
275
+ return refuse(`scenario still holds ${scenario.value.items.map((pair) => String(keyNode(pair).value)).join(", ")} after conversion.`);
276
+ }
277
+ const next = root.items[scenarioIndex + 1];
278
+ root.items.splice(scenarioIndex, 1);
279
+ const promoted = mode ?? ref;
280
+ // A comment on the `scenario:` line sits on the section's value, a mapping or an empty scalar,
281
+ // when nothing took it.
282
+ const value = scenario.value;
283
+ const note = [keyNode(scenario).commentBefore, value?.commentBefore].filter(Boolean).join("\n");
284
+ if (promoted !== undefined)
285
+ addCommentBefore(promoted, note);
286
+ else
287
+ keepTrailingComment(root, next, note);
288
+ keepTrailingComment(root, next, value?.comment);
289
+ if (ref !== undefined) {
290
+ rename(ref, "scenario");
291
+ root.items.splice(scenarioIndex, 0, ref);
292
+ moved.push({ from: "scenario.ref", to: "scenario" });
293
+ }
294
+ if (mode !== undefined)
295
+ moved.push({ from: "scenario.mode", to: "mode" });
296
+ }
297
+ const routePair = new Pair(new Scalar("route"), new Scalar(route));
298
+ // subject.topology says shared-world; route says it now, and takes its comments.
299
+ const subject = root.items[pairIndex(root, "subject")];
300
+ const topology = route === "shared-world" && subject ? take(subject.value, "topology") : undefined;
301
+ if (topology !== undefined) {
302
+ addCommentBefore(routePair, keyNode(topology).commentBefore);
303
+ const value = topology.value;
304
+ addCommentBefore(routePair, value?.commentBefore);
305
+ if (value?.comment)
306
+ routePair.value.comment = value.comment;
307
+ moved.push({ from: "subject.topology", to: "route" });
308
+ }
309
+ insertAfter(root, ["description", "title", "id"], ...[routePair, mode].filter((pair) => pair !== undefined));
310
+ return { ok: true };
311
+ }
312
+ // The participant keys leave the actor for `participants`, or `surfaces` on the scripted route.
313
+ function participantsPair(actor, route, focused, moved) {
314
+ const count = take(actor, "count");
315
+ const entries = take(actor, "lanes");
316
+ const roster = take(actor, "roster");
317
+ let focus = take(actor, "laneFocus");
318
+ // A `laneFocus` v2 reads as no focus converts as if absent. Every comment in it goes above the
319
+ // count, or to the end of the actor.
320
+ if (focus !== undefined && !focused) {
321
+ const found = [];
322
+ subtreeComments(focus.key, found);
323
+ subtreeComments(focus.value, found);
324
+ const notes = found.join("\n");
325
+ if (count !== undefined)
326
+ addCommentBefore(count, notes);
327
+ else if (notes)
328
+ actor.comment = [actor.comment, notes].filter(Boolean).join("\n");
329
+ focus = undefined;
330
+ }
331
+ if (route === "scripted") {
332
+ if (count === undefined)
333
+ return undefined;
334
+ const surfaces = new YAMLSeq();
335
+ surfaces.flow = true;
336
+ const two = isScalar(count.value) && Number(count.value.value) === 2;
337
+ surfaces.items.push(new Scalar("desktop"), ...(two ? [new Scalar("mobile")] : []));
338
+ if (isScalar(count.value) && count.value.comment)
339
+ surfaces.comment = count.value.comment;
340
+ if (isScalar(count.value))
341
+ addCommentBefore(count, count.value.commentBefore);
342
+ rename(count, "surfaces");
343
+ count.value = surfaces;
344
+ moved.push({ from: "actors[0].count", to: "surfaces" });
345
+ return count;
346
+ }
347
+ const list = entries ?? roster;
348
+ if (list !== undefined) {
349
+ if (isSeq(list.value))
350
+ for (const item of list.value.items)
351
+ if (isMap(item))
352
+ numericCount(item.items[pairIndex(item, "count")]);
353
+ rename(list, "participants");
354
+ moved.push({ from: `actors[0].${entries ? "lanes" : "roster"}`, to: "participants" });
355
+ return list;
356
+ }
357
+ if (focus !== undefined) {
358
+ const instruction = take(focus.value, "instruction");
359
+ const homogeneous = new YAMLMap();
360
+ // laneFocus's mapping, or the empty scalar a valueless `laneFocus:` holds, carries its comments.
361
+ const focusValue = focus.value;
362
+ if (focusValue?.comment)
363
+ homogeneous.comment = focusValue.comment;
364
+ if (focusValue?.commentBefore)
365
+ homogeneous.commentBefore = focusValue.commentBefore;
366
+ // Fields v2 read as unset (`id: null`) go with the old mapping; their comments stay.
367
+ const rest = [];
368
+ if (isMap(focus.value))
369
+ for (const item of focus.value.items) {
370
+ subtreeComments(item.key, rest);
371
+ subtreeComments(item.value, rest);
372
+ }
373
+ if (rest.length > 0)
374
+ homogeneous.comment = [homogeneous.comment, ...rest].filter(Boolean).join("\n");
375
+ numericCount(count);
376
+ if (count !== undefined)
377
+ homogeneous.items.push(count);
378
+ if (instruction !== undefined)
379
+ homogeneous.items.push(instruction);
380
+ rename(focus, "participants");
381
+ focus.value = homogeneous;
382
+ moved.push({ from: "actors[0].laneFocus", to: "participants" });
383
+ if (count !== undefined)
384
+ moved.push({ from: "actors[0].count", to: "participants.count" });
385
+ return focus;
386
+ }
387
+ if (count !== undefined) {
388
+ numericCount(count);
389
+ rename(count, "participants");
390
+ moved.push({ from: "actors[0].count", to: "participants" });
391
+ return count;
392
+ }
393
+ return undefined;
394
+ }
395
+ // v2 reads a count written as a digit string, such as "2"; v3 takes a number, so write the number.
396
+ function numericCount(pair) {
397
+ if (pair === undefined || !isScalar(pair.value) || typeof pair.value.value !== "string")
398
+ return;
399
+ const count = posInt(pair.value.value);
400
+ if (count === undefined)
401
+ return;
402
+ pair.value.value = count;
403
+ pair.value.type = Scalar.PLAIN;
404
+ }
405
+ // JSON drops undefined fields, so two configs built through different branches compare by value.
406
+ function plain(value) {
407
+ return JSON.parse(JSON.stringify(value));
408
+ }
409
+ function samePlans(raw, dropped, text, cwd) {
410
+ const projected = structuredClone(raw);
411
+ for (const path of dropped)
412
+ deletePlainFieldPath(projected, path);
413
+ const before = parseLabConfig(projected);
414
+ if (!before.ok) {
415
+ return refuse(`it does not parse once the unread keys are dropped: ${before.error.message}`);
416
+ }
417
+ const after = parseLabConfig(parseDocument(text).toJS());
418
+ if (!after.ok)
419
+ return refuse(`its v3 form does not parse: ${after.error.message}`);
420
+ if (JSON.stringify(plain({ ...after.config, schema: LAB_CONFIG_SCHEMA })) !==
421
+ JSON.stringify(plain(before.config))) {
422
+ return refuse("its v3 form parses to a different study.");
423
+ }
424
+ for (const dryRun of [true, false]) {
425
+ const v2 = plain(planLab(before.config, { cwd, dryRun }));
426
+ const v3 = plain(planLab(after.config, { cwd, dryRun }));
427
+ if (JSON.stringify(v2) !== JSON.stringify(v3)) {
428
+ return refuse(`its v3 form plans a different ${dryRun ? "dry" : "live"} run.`);
429
+ }
430
+ }
431
+ return { ok: true };
432
+ }
@@ -0,0 +1,12 @@
1
+ import { type Pair, type YAMLMap } from "yaml";
2
+ /** The value at `path`, or for a `[]` segment the values found in each item; undefined if none. */
3
+ export declare function readFieldPath(root: unknown, path: string): unknown;
4
+ /** Delete `path` from a parsed object. Returns whether anything was deleted. */
5
+ export declare function deletePlainFieldPath(root: unknown, path: string): boolean;
6
+ /** The index of `key`'s pair in a YAML mapping, or -1. */
7
+ export declare function pairIndex(map: YAMLMap, key: string): number;
8
+ /**
9
+ * Delete `path` from a YAML document's root mapping. Returns the deleted pairs, including the
10
+ * mappings a deletion left empty, so the caller can report their comments.
11
+ */
12
+ export declare function deleteNodeFieldPath(root: unknown, path: string): Pair[];