humanish 0.108.0 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (455) hide show
  1. package/ARCHITECTURE.md +58 -59
  2. package/CHANGELOG.md +13 -0
  3. package/CONTEXT.md +44 -44
  4. package/README.md +3 -3
  5. package/TELEMETRY.md +2 -2
  6. package/dist/actors/codex/app-server-trace.js +2 -1
  7. package/dist/actors/codex/restricted-participant.js +12 -12
  8. package/dist/actors/codex/restricted-session.d.ts +2 -2
  9. package/dist/actors/computer-use/actor.d.ts +6 -6
  10. package/dist/actors/computer-use/actor.js +2 -2
  11. package/dist/actors/computer-use/admission-limit.d.ts +2 -2
  12. package/dist/actors/computer-use/admission-limit.js +3 -3
  13. package/dist/actors/computer-use/executor-error.d.ts +2 -2
  14. package/dist/actors/computer-use/executor-error.js +3 -3
  15. package/dist/actors/computer-use/loop/actions.js +5 -5
  16. package/dist/actors/computer-use/loop/debrief.js +2 -2
  17. package/dist/actors/computer-use/loop/ending.d.ts +1 -1
  18. package/dist/actors/computer-use/loop/ending.js +12 -11
  19. package/dist/actors/computer-use/loop/observation.js +6 -5
  20. package/dist/actors/computer-use/loop/provider-call.js +11 -11
  21. package/dist/actors/computer-use/loop/session.d.ts +4 -4
  22. package/dist/actors/computer-use/loop/session.js +2 -2
  23. package/dist/actors/computer-use/loop/trace.js +3 -2
  24. package/dist/actors/computer-use/loop/types.d.ts +24 -24
  25. package/dist/actors/computer-use/loop/usage.d.ts +2 -2
  26. package/dist/actors/computer-use/loop.d.ts +6 -1
  27. package/dist/actors/computer-use/loop.js +26 -4
  28. package/dist/actors/computer-use/openai-provider.d.ts +2 -2
  29. package/dist/actors/computer-use/openai-provider.js +8 -8
  30. package/dist/actors/computer-use/provider-error.d.ts +4 -4
  31. package/dist/actors/computer-use/provider-error.js +6 -6
  32. package/dist/actors/contract.d.ts +4 -4
  33. package/dist/actors/contract.js +1 -1
  34. package/dist/actors/local-agent/claude-session.js +3 -3
  35. package/dist/actors/local-agent/cli.d.ts +1 -1
  36. package/dist/actors/local-agent/cli.js +1 -1
  37. package/dist/actors/reasoning-effort.js +3 -3
  38. package/dist/actors/registry.d.ts +2 -2
  39. package/dist/actors/registry.js +3 -3
  40. package/dist/actors/scripted-browser/actor.d.ts +2 -2
  41. package/dist/actors/scripted-browser/actor.js +1 -1
  42. package/dist/analysis/automatic-completion.d.ts +7 -7
  43. package/dist/analysis/automatic-completion.js +1 -1
  44. package/dist/analysis/automatic-config.d.ts +6 -6
  45. package/dist/analysis/automatic-config.js +1 -1
  46. package/dist/analysis/execute.d.ts +1 -1
  47. package/dist/analysis/execute.js +1 -1
  48. package/dist/analysis/types.d.ts +6 -0
  49. package/dist/browser-control/client.js +16 -16
  50. package/dist/browser-control/dispatcher.js +4 -4
  51. package/dist/browser-control/protocol.js +14 -14
  52. package/dist/browser-control/recording-transfer.js +4 -4
  53. package/dist/browser-control/transport.js +7 -7
  54. package/dist/cli/commands/analysis-signals.d.ts +2 -2
  55. package/dist/cli/commands/comms.js +14 -22
  56. package/dist/cli/commands/observe.d.ts +0 -1
  57. package/dist/cli/commands/observe.js +0 -15
  58. package/dist/cli/commands/run-command.d.ts +2 -2
  59. package/dist/cli/commands/run-command.js +3 -3
  60. package/dist/cli/commands/runs.js +3 -5
  61. package/dist/cli/commands/setup.js +5 -7
  62. package/dist/cli/commands/study-format.d.ts +9 -0
  63. package/dist/cli/commands/{lab-format.js → study-format.js} +5 -5
  64. package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
  65. package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +12 -12
  66. package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
  67. package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
  68. package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
  69. package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +3 -3
  70. package/dist/cli/commands/study-route-run.d.ts +19 -0
  71. package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
  72. package/dist/cli/commands/study-route-scripted.d.ts +17 -0
  73. package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
  74. package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
  75. package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +7 -7
  76. package/dist/cli/commands/study-route-terminal.d.ts +17 -0
  77. package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
  78. package/dist/cli/commands/study-run.d.ts +9 -0
  79. package/dist/cli/commands/{lab-run.js → study-run.js} +34 -34
  80. package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +5 -5
  81. package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +1 -1
  82. package/dist/cli/commands/study.js +13 -49
  83. package/dist/cli/commands/tui.js +12 -12
  84. package/dist/cli/commands/watch.js +30 -65
  85. package/dist/cli/deprecations.d.ts +1 -13
  86. package/dist/cli/deprecations.js +0 -30
  87. package/dist/cli/doctor.d.ts +3 -3
  88. package/dist/cli/doctor.js +16 -16
  89. package/dist/cli/first-run-path.d.ts +4 -4
  90. package/dist/cli/first-run-path.js +7 -7
  91. package/dist/cli/io.d.ts +3 -3
  92. package/dist/cli/io.js +2 -2
  93. package/dist/cli/observer-follow.d.ts +2 -2
  94. package/dist/cli/observer-follow.js +2 -2
  95. package/dist/cli/orientation.d.ts +4 -4
  96. package/dist/cli/orientation.js +58 -20
  97. package/dist/cli/program.js +3 -4
  98. package/dist/cli/telemetry.d.ts +1 -1
  99. package/dist/cli/telemetry.js +14 -20
  100. package/dist/comms/catch-host.d.ts +1 -1
  101. package/dist/comms/catch-host.js +3 -3
  102. package/dist/comms/connections.d.ts +1 -1
  103. package/dist/comms/connections.js +2 -2
  104. package/dist/comms/external-evidence.d.ts +5 -5
  105. package/dist/comms/external-evidence.js +4 -3
  106. package/dist/comms/fake-inbox.d.ts +2 -2
  107. package/dist/comms/fake-inbox.js +2 -2
  108. package/dist/comms/receiving-runtime.d.ts +4 -4
  109. package/dist/comms/sandbox-catch.d.ts +2 -2
  110. package/dist/comms/sandbox-catch.js +2 -2
  111. package/dist/comms/setup.d.ts +2 -2
  112. package/dist/comms/setup.js +29 -32
  113. package/dist/feedback/draft.js +2 -2
  114. package/dist/feedback/export.js +3 -2
  115. package/dist/feedback/proof.d.ts +1 -1
  116. package/dist/feedback/proof.js +2 -2
  117. package/dist/guest/bootstrap.js +6 -6
  118. package/dist/guest/browser-tools.js +8 -8
  119. package/dist/guest/chromium-text.js +17 -17
  120. package/dist/guest/desktop-executor.d.ts +2 -2
  121. package/dist/guest/desktop-executor.js +20 -20
  122. package/dist/guest/desktop-keys.js +4 -4
  123. package/dist/guest/desktop-media.d.ts +2 -2
  124. package/dist/guest/desktop-media.js +16 -16
  125. package/dist/guest/desktop-native.js +10 -10
  126. package/dist/guest/runtime-desktop.js +2 -2
  127. package/dist/guest/runtime-processes.d.ts +2 -2
  128. package/dist/guest/runtime-processes.js +2 -2
  129. package/dist/guest/runtime.js +5 -5
  130. package/dist/index.d.ts +13 -15
  131. package/dist/index.js +6 -8
  132. package/dist/observer/artifact.d.ts +1 -1
  133. package/dist/observer/artifact.js +1 -1
  134. package/dist/observer/data.d.ts +1 -1
  135. package/dist/observer/library.d.ts +2 -0
  136. package/dist/observer/library.js +4 -1
  137. package/dist/observer/render.js +7 -1
  138. package/dist/observer/run-routes.d.ts +1 -0
  139. package/dist/observer/run-routes.js +37 -12
  140. package/dist/observer/serve.d.ts +1 -1
  141. package/dist/observer-app.html +1 -1
  142. package/dist/routes/computer-use/bundle-parts.js +3 -2
  143. package/dist/routes/computer-use/bundle.d.ts +2 -2
  144. package/dist/routes/computer-use/bundle.js +7 -6
  145. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +5 -5
  146. package/dist/routes/computer-use/e2b-desktop/comms.js +5 -4
  147. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +1 -1
  148. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
  149. package/dist/routes/computer-use/e2b-desktop/prepare.js +3 -3
  150. package/dist/routes/computer-use/e2b-desktop/start.js +3 -4
  151. package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
  152. package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -3
  153. package/dist/routes/computer-use/external-comms.d.ts +3 -3
  154. package/dist/routes/computer-use/fanout-bundle.js +11 -10
  155. package/dist/routes/computer-use/fanout-records.js +2 -2
  156. package/dist/routes/computer-use/live-flush.d.ts +3 -3
  157. package/dist/routes/computer-use/live-phase.d.ts +2 -3
  158. package/dist/routes/computer-use/live-phase.js +3 -3
  159. package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
  160. package/dist/routes/computer-use/local-tree-pack.js +1 -1
  161. package/dist/routes/computer-use/local-vm.d.ts +8 -8
  162. package/dist/routes/computer-use/local-vm.js +2 -2
  163. package/dist/routes/computer-use/participant-desktop.d.ts +3 -3
  164. package/dist/routes/computer-use/participant-desktop.js +1 -1
  165. package/dist/routes/computer-use/participant-execution.js +1 -1
  166. package/dist/routes/computer-use/participant-model.js +3 -3
  167. package/dist/routes/computer-use/participant-prompt.d.ts +5 -5
  168. package/dist/routes/computer-use/participant-prompt.js +3 -3
  169. package/dist/routes/computer-use/participant-runs.d.ts +10 -10
  170. package/dist/routes/computer-use/participant-runs.js +14 -13
  171. package/dist/routes/computer-use/plan.d.ts +12 -12
  172. package/dist/routes/computer-use/plan.js +24 -24
  173. package/dist/routes/computer-use/preflight.d.ts +5 -5
  174. package/dist/routes/computer-use/preflight.js +5 -5
  175. package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
  176. package/dist/routes/computer-use/rerun-selection.js +3 -2
  177. package/dist/routes/computer-use/result.d.ts +4 -4
  178. package/dist/routes/computer-use/result.js +13 -12
  179. package/dist/routes/computer-use/route.d.ts +12 -12
  180. package/dist/routes/computer-use/route.js +19 -19
  181. package/dist/routes/computer-use/self-report.js +1 -1
  182. package/dist/routes/computer-use/setup.d.ts +22 -22
  183. package/dist/routes/computer-use/setup.js +15 -15
  184. package/dist/routes/computer-use/single-bundle.d.ts +4 -4
  185. package/dist/routes/computer-use/single-bundle.js +14 -13
  186. package/dist/routes/computer-use/subject-projection.d.ts +3 -3
  187. package/dist/routes/computer-use/types.d.ts +34 -34
  188. package/dist/routes/computer-use/types.js +3 -3
  189. package/dist/routes/preview.d.ts +6 -6
  190. package/dist/routes/preview.js +5 -5
  191. package/dist/routes/scripted/bundle.d.ts +6 -6
  192. package/dist/routes/scripted/bundle.js +10 -9
  193. package/dist/routes/scripted/plan.d.ts +7 -7
  194. package/dist/routes/scripted/plan.js +6 -6
  195. package/dist/routes/scripted/result.d.ts +3 -3
  196. package/dist/routes/scripted/result.js +9 -9
  197. package/dist/routes/scripted/route.d.ts +9 -9
  198. package/dist/routes/scripted/route.js +11 -11
  199. package/dist/routes/scripted/scenario.d.ts +1 -1
  200. package/dist/routes/scripted/scenario.js +3 -3
  201. package/dist/routes/scripted/setup.d.ts +6 -6
  202. package/dist/routes/scripted/setup.js +4 -4
  203. package/dist/routes/scripted/subject.d.ts +5 -5
  204. package/dist/routes/scripted/subject.js +3 -3
  205. package/dist/routes/scripted/surface-records.d.ts +1 -1
  206. package/dist/routes/scripted/surface-records.js +2 -2
  207. package/dist/routes/scripted/surface-sessions.d.ts +3 -3
  208. package/dist/routes/scripted/types.d.ts +17 -17
  209. package/dist/routes/scripted/types.js +1 -1
  210. package/dist/routes/shared-world/bundle-records.js +3 -3
  211. package/dist/routes/shared-world/bundle.js +15 -14
  212. package/dist/routes/shared-world/checkpoints.d.ts +3 -3
  213. package/dist/routes/shared-world/checkpoints.js +1 -1
  214. package/dist/routes/shared-world/comms.d.ts +9 -9
  215. package/dist/routes/shared-world/comms.js +6 -5
  216. package/dist/routes/shared-world/participant-specs.d.ts +3 -3
  217. package/dist/routes/shared-world/participant-specs.js +7 -7
  218. package/dist/routes/shared-world/plan.d.ts +9 -9
  219. package/dist/routes/shared-world/plan.js +9 -9
  220. package/dist/routes/shared-world/provisioned.d.ts +8 -8
  221. package/dist/routes/shared-world/provisioned.js +4 -4
  222. package/dist/routes/shared-world/result.d.ts +6 -6
  223. package/dist/routes/shared-world/result.js +11 -10
  224. package/dist/routes/shared-world/route.d.ts +11 -11
  225. package/dist/routes/shared-world/route.js +19 -19
  226. package/dist/routes/shared-world/setup.d.ts +13 -13
  227. package/dist/routes/shared-world/setup.js +19 -19
  228. package/dist/routes/shared-world/types.d.ts +27 -27
  229. package/dist/routes/terminal/adapter.d.ts +2 -2
  230. package/dist/routes/terminal/adapter.js +4 -4
  231. package/dist/routes/terminal/bundle.d.ts +11 -11
  232. package/dist/routes/terminal/bundle.js +12 -12
  233. package/dist/routes/terminal/credentials.d.ts +4 -4
  234. package/dist/routes/terminal/credentials.js +5 -5
  235. package/dist/routes/terminal/dry-run.d.ts +4 -4
  236. package/dist/routes/terminal/dry-run.js +9 -9
  237. package/dist/routes/terminal/ledger.d.ts +2 -2
  238. package/dist/routes/terminal/lifetime.d.ts +1 -1
  239. package/dist/routes/terminal/lifetime.js +1 -1
  240. package/dist/routes/terminal/live-finish.d.ts +2 -2
  241. package/dist/routes/terminal/live-finish.js +7 -7
  242. package/dist/routes/terminal/live-sandbox.d.ts +2 -2
  243. package/dist/routes/terminal/live-sandbox.js +3 -2
  244. package/dist/routes/terminal/participant-text.js +2 -1
  245. package/dist/routes/terminal/persona.d.ts +2 -2
  246. package/dist/routes/terminal/persona.js +2 -2
  247. package/dist/routes/terminal/plan.d.ts +7 -7
  248. package/dist/routes/terminal/plan.js +5 -5
  249. package/dist/routes/terminal/result.d.ts +5 -5
  250. package/dist/routes/terminal/result.js +7 -7
  251. package/dist/routes/terminal/route.d.ts +9 -9
  252. package/dist/routes/terminal/route.js +14 -14
  253. package/dist/routes/terminal/session.d.ts +5 -5
  254. package/dist/routes/terminal/session.js +7 -7
  255. package/dist/routes/terminal/trace.d.ts +2 -2
  256. package/dist/routes/terminal/types.d.ts +24 -24
  257. package/dist/routes/terminal/types.js +2 -2
  258. package/dist/run/bundle.d.ts +7 -7
  259. package/dist/run/bundle.js +2 -2
  260. package/dist/run/costs.d.ts +23 -0
  261. package/dist/run/costs.js +72 -43
  262. package/dist/run/dry-run-inputs.d.ts +1 -1
  263. package/dist/run/dry-run-inputs.js +1 -1
  264. package/dist/run/dry-run.js +2 -2
  265. package/dist/run/outcomes.d.ts +1 -1
  266. package/dist/run/participant.d.ts +1 -1
  267. package/dist/run/preflight-receipts.js +1 -1
  268. package/dist/run/pricing.js +2 -2
  269. package/dist/run/projection.d.ts +32 -32
  270. package/dist/run/projection.js +44 -44
  271. package/dist/run/reclaim.d.ts +1 -1
  272. package/dist/run/reclaim.js +1 -1
  273. package/dist/run/results.d.ts +2 -2
  274. package/dist/run/run-cost.d.ts +53 -0
  275. package/dist/run/run-cost.js +105 -0
  276. package/dist/run/run-index-analysis.d.ts +15 -0
  277. package/dist/run/run-index-analysis.js +77 -0
  278. package/dist/run/run-index.d.ts +11 -1
  279. package/dist/run/run-index.js +63 -49
  280. package/dist/run/run.d.ts +3 -3
  281. package/dist/run/run.js +2 -2
  282. package/dist/run/shared-world-evidence.d.ts +1 -1
  283. package/dist/run/shared-world-shape.js +1 -1
  284. package/dist/run/stats.d.ts +3 -3
  285. package/dist/run/stats.js +14 -14
  286. package/dist/run/status.d.ts +10 -2
  287. package/dist/run/status.js +6 -3
  288. package/dist/run/streams.d.ts +2 -2
  289. package/dist/run/study-provenance.d.ts +4 -2
  290. package/dist/run/study-provenance.js +7 -4
  291. package/dist/run/study-result.d.ts +0 -5
  292. package/dist/run/study-result.js +1 -1
  293. package/dist/run-study.d.ts +112 -0
  294. package/dist/{run-lab.js → run-study.js} +52 -45
  295. package/dist/{lab → study}/adapter-extension.d.ts +8 -20
  296. package/dist/{lab → study}/adapter-extension.js +2 -14
  297. package/dist/{lab → study}/adapter-scorer-loader.d.ts +10 -10
  298. package/dist/{lab → study}/adapter-scorer-loader.js +3 -3
  299. package/dist/study/composition-rules.d.ts +7 -0
  300. package/dist/{lab → study}/composition-rules.js +12 -12
  301. package/dist/study/config.d.ts +15 -0
  302. package/dist/{lab → study}/config.js +37 -20
  303. package/dist/study/convert.d.ts +1 -1
  304. package/dist/study/convert.js +15 -15
  305. package/dist/{lab → study}/device-presets.d.ts +2 -2
  306. package/dist/{lab → study}/discover.d.ts +29 -23
  307. package/dist/{lab → study}/discover.js +97 -118
  308. package/dist/{lab → study}/doctor.d.ts +11 -11
  309. package/dist/{lab → study}/doctor.js +18 -18
  310. package/dist/study/files.d.ts +2 -2
  311. package/dist/study/files.js +6 -5
  312. package/dist/{lab → study}/init-templates.d.ts +2 -2
  313. package/dist/{lab → study}/init-templates.js +16 -11
  314. package/dist/{lab → study}/init.d.ts +1 -1
  315. package/dist/{lab → study}/init.js +7 -4
  316. package/dist/{lab → study}/keys.d.ts +2 -2
  317. package/dist/{lab → study}/keys.js +10 -10
  318. package/dist/study/migrate.d.ts +1 -1
  319. package/dist/{lab → study}/parse/actors.d.ts +5 -5
  320. package/dist/{lab → study}/parse/actors.js +5 -5
  321. package/dist/study/parse/comms.d.ts +12 -0
  322. package/dist/study/parse/execution.d.ts +19 -0
  323. package/dist/{lab → study}/parse/study-v3.d.ts +3 -5
  324. package/dist/{lab → study}/parse/study-v3.js +3 -3
  325. package/dist/{lab → study}/parse/subject-state.d.ts +8 -8
  326. package/dist/{lab → study}/parse/subject-state.js +4 -4
  327. package/dist/{lab → study}/parse/subject.d.ts +3 -3
  328. package/dist/{lab → study}/parse/subject.js +8 -8
  329. package/dist/{lab → study}/parse/values.d.ts +2 -2
  330. package/dist/{lab → study}/persona-resolve.d.ts +4 -4
  331. package/dist/{lab → study}/persona-resolve.js +2 -2
  332. package/dist/{lab → study}/plan-base.d.ts +7 -7
  333. package/dist/{lab → study}/plan-base.js +1 -1
  334. package/dist/{lab → study}/plan-participants.d.ts +10 -10
  335. package/dist/{lab → study}/plan-participants.js +4 -4
  336. package/dist/{lab → study}/plan-types.d.ts +28 -28
  337. package/dist/{lab → study}/plan-types.js +2 -2
  338. package/dist/study/plan.d.ts +13 -0
  339. package/dist/{lab → study}/plan.js +20 -20
  340. package/dist/study/preflight-probes.d.ts +3 -0
  341. package/dist/{lab → study}/preflight-probes.js +9 -8
  342. package/dist/study/preflight-result.d.ts +8 -0
  343. package/dist/{lab → study}/preflight-result.js +3 -3
  344. package/dist/{lab → study}/preflight.d.ts +31 -31
  345. package/dist/{lab → study}/preflight.js +8 -8
  346. package/dist/{lab → study}/requirements.d.ts +3 -3
  347. package/dist/{lab → study}/requirements.js +1 -1
  348. package/dist/study/route-inputs.d.ts +28 -0
  349. package/dist/{lab → study}/route-inputs.js +1 -1
  350. package/dist/{lab → study}/routing.d.ts +12 -12
  351. package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -10
  352. package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -3
  353. package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +8 -17
  354. package/dist/study/run-study-homes.js +3 -0
  355. package/dist/study/run-study-options.d.ts +28 -0
  356. package/dist/{lab/run-lab-options.js → study/run-study-options.js} +13 -12
  357. package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +2 -2
  358. package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
  359. package/dist/{lab → study}/summary.d.ts +10 -10
  360. package/dist/{lab → study}/summary.js +15 -15
  361. package/dist/{lab → study}/tasks.d.ts +3 -3
  362. package/dist/{lab → study}/tasks.js +1 -1
  363. package/dist/{lab → study}/types.d.ts +104 -104
  364. package/dist/{lab → study}/types.js +1 -1
  365. package/dist/{lab → study}/validation.d.ts +19 -19
  366. package/dist/{lab → study}/validation.js +13 -13
  367. package/dist/{lab → study}/warnings.d.ts +4 -4
  368. package/dist/{lab → study}/warnings.js +1 -1
  369. package/dist/subject/clone.d.ts +6 -6
  370. package/dist/subject/clone.js +2 -2
  371. package/dist/subject/local-tree-archive.d.ts +2 -2
  372. package/dist/subject/local-tree-archive.js +3 -3
  373. package/dist/subject/local-tree.d.ts +3 -3
  374. package/dist/subject/runtime.js +2 -2
  375. package/dist/subject/serve.d.ts +4 -4
  376. package/dist/subject/state.d.ts +3 -3
  377. package/dist/subject/state.js +1 -1
  378. package/dist/subject/steps.d.ts +1 -1
  379. package/dist/subject/steps.js +1 -1
  380. package/dist/substrates/desktop-session.js +2 -2
  381. package/dist/substrates/detached.d.ts +1 -1
  382. package/dist/substrates/e2b/desktop-browser.d.ts +4 -4
  383. package/dist/substrates/e2b/desktop-browser.js +1 -1
  384. package/dist/substrates/e2b/desktop-cdp.d.ts +1 -1
  385. package/dist/substrates/e2b/desktop-cdp.js +1 -1
  386. package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
  387. package/dist/substrates/e2b/desktop-executor.js +12 -12
  388. package/dist/substrates/e2b/desktop-geometry.d.ts +1 -1
  389. package/dist/substrates/e2b/desktop-geometry.js +1 -1
  390. package/dist/substrates/e2b/desktop-media.d.ts +3 -3
  391. package/dist/substrates/e2b/lifetime.js +1 -1
  392. package/dist/substrates/e2b/sandbox.d.ts +3 -3
  393. package/dist/substrates/e2b/sandbox.js +1 -1
  394. package/dist/substrates/e2b/sdk.d.ts +1 -1
  395. package/dist/substrates/e2b/sdk.js +1 -1
  396. package/dist/substrates/local/runtime-config.d.ts +4 -4
  397. package/dist/substrates/local/runtime-config.js +4 -4
  398. package/dist/tui/contract.d.ts +8 -8
  399. package/dist/tui/contract.js +2 -2
  400. package/dist/tui/launch.d.ts +3 -3
  401. package/dist/tui/launch.js +22 -16
  402. package/dist/tui-app.js +139 -139
  403. package/dist/verify/subject.d.ts +1 -1
  404. package/dist/verify/subject.js +1 -1
  405. package/dist/verify/verify.js +2 -1
  406. package/docs/architecture/actor-contract.md +5 -5
  407. package/docs/architecture/browser-control.md +1 -1
  408. package/docs/architecture/external-public-shared-world.md +8 -7
  409. package/docs/architecture/github-feedback-loop.md +1 -1
  410. package/docs/architecture/task-protocol-support.md +1 -1
  411. package/docs/architecture/terminal-product-route.md +18 -18
  412. package/docs/contracts/adapter-fixtures.md +2 -2
  413. package/docs/contracts/errors.md +8 -8
  414. package/docs/contracts/run-bundle.md +1 -4
  415. package/docs/contracts/schemas.md +61 -42
  416. package/docs/contracts/study-analysis.md +4 -1
  417. package/docs/contracts/study-costs.md +17 -2
  418. package/examples/README.md +1 -1
  419. package/examples/scorer/scorer.mjs +3 -3
  420. package/package.json +1 -1
  421. package/skills/humanish/SKILL.md +8 -6
  422. package/skills/humanish/agents/openai.yaml +1 -1
  423. package/dist/cli/commands/lab-format.d.ts +0 -9
  424. package/dist/cli/commands/lab-route-run.d.ts +0 -19
  425. package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
  426. package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
  427. package/dist/cli/commands/lab-run.d.ts +0 -9
  428. package/dist/lab/composition-rules.d.ts +0 -7
  429. package/dist/lab/config.d.ts +0 -7
  430. package/dist/lab/deprecated-fields.d.ts +0 -10
  431. package/dist/lab/deprecated-fields.js +0 -24
  432. package/dist/lab/parse/comms.d.ts +0 -12
  433. package/dist/lab/parse/execution.d.ts +0 -19
  434. package/dist/lab/plan.d.ts +0 -13
  435. package/dist/lab/preflight-probes.d.ts +0 -3
  436. package/dist/lab/preflight-result.d.ts +0 -8
  437. package/dist/lab/route-inputs.d.ts +0 -28
  438. package/dist/lab/run-lab-homes.js +0 -7
  439. package/dist/lab/run-lab-options.d.ts +0 -28
  440. package/dist/library-aliases.d.ts +0 -56
  441. package/dist/library-aliases.js +0 -22
  442. package/dist/run-lab.d.ts +0 -112
  443. /package/dist/{lab → study}/device-presets.js +0 -0
  444. /package/dist/{lab → study}/init-paths.d.ts +0 -0
  445. /package/dist/{lab → study}/init-paths.js +0 -0
  446. /package/dist/{lab → study}/init-plan.d.ts +0 -0
  447. /package/dist/{lab → study}/init-plan.js +0 -0
  448. /package/dist/{lab → study}/parse/comms.js +0 -0
  449. /package/dist/{lab → study}/parse/execution.js +0 -0
  450. /package/dist/{lab → study}/parse/values.js +0 -0
  451. /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
  452. /package/dist/{lab → study}/participant-assignment.js +0 -0
  453. /package/dist/{lab → study}/persona.d.ts +0 -0
  454. /package/dist/{lab → study}/persona.js +0 -0
  455. /package/dist/{lab → study}/routing.js +0 -0
@@ -8,11 +8,10 @@ import { discoverProviderKeys, listUserKeys, probeKeySources, } from "../keys/ke
8
8
  import { COMMS_PROVIDERS, commsProviderLabel, DEFAULT_COMMS_PROVIDER, } from "./providers.js";
9
9
  import { createReceivingAdapter } from "./receiving-runtime.js";
10
10
  import { RECEIVING_SCOPE_UNSUPPORTED } from "./receiving-types.js";
11
- import { parseLabConfig } from "../lab/config.js";
12
- import { resolveLabManifest } from "../lab/discover.js";
11
+ import { parseStudy } from "../study/config.js";
12
+ import { resolveStudyManifest } from "../study/discover.js";
13
13
  import { assertPreparedSelectedOutputDirectory, prepareManagedHumanishOutputDirectory, prepareSelectedOutputDirectory, readContainedRegularFile, writeContainedOutputFile, } from "../run/contained-output.js";
14
14
  import { otherStudyFiles } from "../study/files.js";
15
- import { convertStudyText, isStudyV3 } from "../study/convert.js";
16
15
  import { isNodeError } from "../run/type-guards.js";
17
16
  export async function checkCommsConnection(args) {
18
17
  const base = {
@@ -109,65 +108,63 @@ export async function receivingRequiredKey(cwd, connectionName) {
109
108
  }
110
109
  }
111
110
  /** Save a local copy, never rewrite a committed manifest or silently shadow it by handle. */
112
- export async function configureCommsLab(args) {
111
+ export async function configureCommsStudy(args) {
113
112
  const base = { schema: "humanish.comms-configure.v1", ok: false, applied: false };
114
113
  try {
115
114
  const connection = (await readCommsConnections(args.cwd)).connections[args.connection];
116
115
  if (!connection)
117
116
  return { ...base, message: "Save the selected connection first." };
118
- const source = await resolveLabManifest(args.cwd, args.lab);
119
- if (!source.ok)
120
- return { ...base, message: "The selected lab could not be read safely." };
117
+ const source = await resolveStudyManifest(args.cwd, args.study);
118
+ if (!source.ok) {
119
+ // A v2 source or a labs/ file gets discovery's refusal, which names the fix.
120
+ const named = source.error.code === "HUMANISH_STUDY_V2_UNSUPPORTED" ||
121
+ source.error.code === "HUMANISH_STUDY_RETIRED_DIRECTORY";
122
+ return {
123
+ ...base,
124
+ message: named ? source.error.message : "The selected study could not be read safely.",
125
+ };
126
+ }
121
127
  const root = await prepareSelectedOutputDirectory(args.cwd, args.cwd);
122
128
  const rel = path
123
129
  .relative(root.requestedPath, path.resolve(args.cwd, source.path))
124
130
  .replace(/\\/g, "/");
125
131
  const bytes = await readContainedRegularFile(root, rel);
126
132
  if (!bytes || bytes.length > 1024 * 1024)
127
- return { ...base, message: "The lab is missing or too large." };
133
+ return { ...base, message: "The study file is missing or too large." };
128
134
  const text = bytes.toString("utf8");
129
135
  const raw = parse(text);
130
136
  if (!raw || typeof raw !== "object" || Array.isArray(raw))
131
- return { ...base, message: "The lab must be a mapping." };
132
- const lab = raw;
133
- const existing = lab.comms;
137
+ return { ...base, message: "The study file must be a mapping." };
138
+ const studyRecord = raw;
139
+ const existing = studyRecord.comms;
134
140
  if (existing?.email && existing.email.connection === undefined)
135
141
  return {
136
142
  ...base,
137
- message: "This lab uses local capture. Preserve it or make a separate lab before selecting real email.",
143
+ message: "This study uses local capture. Preserve it or make a separate study before selecting real email.",
138
144
  };
139
- // The copy is a v3 study. A v2 source is converted first, so the copy keeps its comments.
140
- let studyText = text;
141
- if (!isStudyV3(raw)) {
142
- const converted = convertStudyText(text, args.cwd);
143
- if (!converted.ok)
144
- return {
145
- ...base,
146
- message: `This lab could not be converted to a v3 study: ${converted.reason}`,
147
- };
148
- studyText = converted.conversion.text;
149
- }
150
- const study = parseDocument(studyText);
145
+ // Discovery resolved the source, so it is a v3 study, and the copy keeps its comments.
146
+ const study = parseDocument(text);
151
147
  study.setIn(["comms", "email", "connection"], args.connection);
152
- const validated = parseLabConfig(study.toJS());
148
+ const validated = parseStudy(study.toJS());
153
149
  if (!validated.ok)
154
150
  return {
155
151
  ...base,
156
- message: "This lab does not support real email receiving. Use a hosted computer-use app-url, clone or local-tree route; shared-world must be concurrent.",
152
+ message: "This study does not support real email receiving. Use a hosted computer-use app-url, clone or local-tree route; shared-world must be concurrent.",
157
153
  };
158
154
  const filename = path
159
155
  .basename(source.path)
160
156
  .replace(/\.ya?ml$/, "")
161
157
  .replace(/-receiving$/, "") + "-receiving.yaml";
162
158
  if (!/^[A-Za-z0-9_][A-Za-z0-9._-]{0,110}\.yaml$/.test(filename))
163
- return { ...base, message: "Use a simple lab filename before configuring email." };
159
+ return { ...base, message: "Use a simple study filename before configuring email." };
164
160
  const destination = `.humanish/local/studies/${filename}`;
165
161
  if (path.basename(rel) === filename)
166
162
  return {
167
163
  ...base,
168
- message: "This is already the local receiving copy. Select its original lab to configure a separate copy, or edit this manifest directly.",
164
+ message: "This is already the local receiving copy. Select its original study to configure a separate copy, or edit this study file directly.",
169
165
  };
170
- // A second file with this name in another study directory would make discovery refuse both.
166
+ // A second file with this name in another study directory would shadow it, or take the name
167
+ // migrate needs to move a labs/ file.
171
168
  const stem = filename.replace(/\.yaml$/, "");
172
169
  const others = await otherStudyFiles(stem,
173
170
  // Any directory entry counts, a dangling symbolic link included: discovery would see it too.
@@ -215,7 +212,7 @@ export async function configureCommsLab(args) {
215
212
  if (args.planToken !== undefined && args.planToken !== token)
216
213
  return {
217
214
  ...base,
218
- message: "The lab or destination changed since preview. Preview again before saving.",
215
+ message: "The study or destination changed since preview. Preview again before saving.",
219
216
  };
220
217
  const directory = await prepareManagedHumanishOutputDirectory(args.cwd, "local", "studies");
221
218
  const lockPath = path.join(directory.physicalPath, ".comms-configure.lock");
@@ -239,13 +236,13 @@ export async function configureCommsLab(args) {
239
236
  return {
240
237
  ...plan,
241
238
  applied: true,
242
- message: `Saved ${destination}. Start that exact lab path; the original manifest was preserved.`,
239
+ message: `Saved ${destination}. Start that exact study path; the original file was preserved.`,
243
240
  };
244
241
  }
245
242
  catch {
246
243
  return {
247
244
  ...base,
248
- message: "Could not configure this lab safely. Check configuration, paths and permissions; no provider resources were created.",
245
+ message: "Could not configure this study safely. Check configuration, paths and permissions; no provider resources were created.",
249
246
  };
250
247
  }
251
248
  }
@@ -100,7 +100,7 @@ export function buildDraft(bundle, bundlePath, candidateId) {
100
100
  proposed_next_state: "study-quality-review",
101
101
  acceptance_proof: [
102
102
  feedbackProofCommands(bundle.runId).verify,
103
- feedbackProofCommands(bundle.runId).watch,
103
+ feedbackProofCommands(bundle.runId).observe,
104
104
  ],
105
105
  };
106
106
  }
@@ -192,7 +192,7 @@ export async function buildAnalysisDraft(context, options) {
192
192
  proposed_next_state: "study-quality-review",
193
193
  acceptance_proof: [
194
194
  feedbackProofCommands(bundle.runId).verify,
195
- feedbackProofCommands(bundle.runId).watch,
195
+ feedbackProofCommands(bundle.runId).observe,
196
196
  ],
197
197
  };
198
198
  }
@@ -23,6 +23,7 @@ import { analysisSharingProblems } from "../analysis/sharing.js";
23
23
  import { EVIDENCE_LIMITS, validateAnalysisEvidence } from "../analysis/evidence.js";
24
24
  import { readBoundedFile } from "../run/evidence-files.js";
25
25
  import { shellQuote } from "../substrates/shell.js";
26
+ import { plural } from "../run/text.js";
26
27
  const EXPORT_SCHEMA = "humanish.export-result.v1";
27
28
  /** Past this the file stops being a thing you attach to an email. Declared, never silent. */
28
29
  export const DEFAULT_EXPORT_MAX_BYTES = 25 * 1024 * 1024;
@@ -361,7 +362,7 @@ export function formatExportHuman(result) {
361
362
  if (result.format === "bundle") {
362
363
  return [
363
364
  `humanish export ${result.runId}`,
364
- `workspace: ${result.path} (${(result.bytes / 1024).toFixed(0)} KB, ${result.embeddedImages} blurred image(s))`,
365
+ `workspace: ${result.path} (${(result.bytes / 1024).toFixed(0)} KB, ${plural(result.embeddedImages, "blurred image")})`,
365
366
  `share safety: ${result.shareSafety.status}`,
366
367
  `verify: humanish verify --cwd ${shellQuote(result.path)} --run ${shellQuote(result.runId)}`,
367
368
  `feedback: humanish feedback draft --cwd ${shellQuote(result.path)} --run ${shellQuote(result.runId)}`,
@@ -371,7 +372,7 @@ export function formatExportHuman(result) {
371
372
  }
372
373
  const lines = [
373
374
  `humanish export ${result.runId}`,
374
- `file: ${result.path} (${(result.bytes / 1024).toFixed(0)} KB, ${result.embeddedImages} image(s) embedded)`,
375
+ `file: ${result.path} (${(result.bytes / 1024).toFixed(0)} KB, ${plural(result.embeddedImages, "image")} embedded)`,
375
376
  `share safety: ${result.shareSafety.status}${result.watermarked ? " (watermarked: local only)" : ""}`,
376
377
  ...result.warnings.map((warning) => `warning: ${warning}`),
377
378
  ];
@@ -2,7 +2,7 @@ import type { RunBundle, RunFeedbackCandidate } from "../run/bundle.js";
2
2
  /** Commands run from the evidence workspace using an installed humanish CLI. */
3
3
  export declare function feedbackProofCommands(runId: string): {
4
4
  verify: string;
5
- watch: string;
5
+ observe: string;
6
6
  };
7
7
  /** Legacy command compatibility belongs in the draft, never in the source receipt. */
8
8
  export declare function projectFeedbackAcceptanceProof(bundle: RunBundle, candidate: RunFeedbackCandidate): string[];
@@ -5,7 +5,7 @@ export function feedbackProofCommands(runId) {
5
5
  const argument = /^[a-z0-9][a-z0-9._-]*$/i.test(runId) ? runId : shellQuote(runId);
6
6
  return {
7
7
  verify: `humanish verify --run ${argument} --json`,
8
- watch: `humanish watch --run ${argument} --no-open`,
8
+ observe: `humanish observe --run ${argument} --no-open`,
9
9
  };
10
10
  }
11
11
  /** Legacy command compatibility belongs in the draft, never in the source receipt. */
@@ -17,7 +17,7 @@ export function projectFeedbackAcceptanceProof(bundle, candidate) {
17
17
  if (instruction === `pnpm humanish -- verify --run ${bundle.runId} --json`)
18
18
  return commands.verify;
19
19
  if (instruction === `pnpm humanish -- watch --run ${bundle.runId} --no-open`)
20
- return commands.watch;
20
+ return commands.observe;
21
21
  return instruction;
22
22
  });
23
23
  }
@@ -1,6 +1,6 @@
1
1
  import { desktopRecordingConfigSchema, } from "../evidence/desktop-recording-types.js";
2
2
  import { validateBrowserControlIdentity, sameBrowserControlIdentity, } from "../browser-control/protocol.js";
3
- import { CuaExecutorError } from "../actors/computer-use/executor-error.js";
3
+ import { ComputerUseExecutorError } from "../actors/computer-use/executor-error.js";
4
4
  import { createBrowserControlClient } from "../browser-control/client.js";
5
5
  import { guestMediaConfigSchema } from "./media-config.js";
6
6
  export const GUEST_BOOTSTRAP_VERSION = 1;
@@ -15,7 +15,7 @@ export const GUEST_BOOTSTRAP_LIMITS = Object.freeze({
15
15
  connectMs: 3000,
16
16
  port: 5251,
17
17
  });
18
- const refused = () => new CuaExecutorError("protocol_mismatch", "not_dispatched");
18
+ const refused = () => new ComputerUseExecutorError("protocol_mismatch", "not_dispatched");
19
19
  /** Same entry authority as the local desktop's opaque app-port forward. */
20
20
  export function validateGuestInitialUrl(value) {
21
21
  try {
@@ -223,7 +223,7 @@ export class GuestBootstrapReader {
223
223
  return;
224
224
  this.terminal = true;
225
225
  this.release();
226
- this.reject(new CuaExecutorError(code, "not_dispatched"));
226
+ this.reject(new ComputerUseExecutorError(code, "not_dispatched"));
227
227
  this.stream.destroy();
228
228
  this.onFailure();
229
229
  }
@@ -249,7 +249,7 @@ export async function connectGuestBootstrap(stream, identity, signal, initialUrl
249
249
  const request = encodeGuestBootstrap(identity, false, initialUrl, media, recording);
250
250
  await new Promise((resolve, reject) => {
251
251
  let bytes = Buffer.alloc(0), done = false;
252
- const timer = setTimeout(() => finish(new CuaExecutorError("deadline_exceeded", "not_dispatched")), GUEST_BOOTSTRAP_LIMITS.connectMs);
252
+ const timer = setTimeout(() => finish(new ComputerUseExecutorError("deadline_exceeded", "not_dispatched")), GUEST_BOOTSTRAP_LIMITS.connectMs);
253
253
  const finish = (error) => {
254
254
  if (done)
255
255
  return;
@@ -277,9 +277,9 @@ export async function connectGuestBootstrap(stream, identity, signal, initialUrl
277
277
  const end = () => {
278
278
  if (done)
279
279
  stream.destroy();
280
- finish(new CuaExecutorError("transport_failed", "not_dispatched"));
280
+ finish(new ComputerUseExecutorError("transport_failed", "not_dispatched"));
281
281
  };
282
- const abort = () => finish(new CuaExecutorError("session_revoked", "not_dispatched"));
282
+ const abort = () => finish(new ComputerUseExecutorError("session_revoked", "not_dispatched"));
283
283
  const data = (chunk) => {
284
284
  if (!Buffer.isBuffer(chunk) || bytes.length + chunk.length > 64 + 1028) {
285
285
  finish(refused());
@@ -1,5 +1,5 @@
1
1
  import { BROWSER_CONTROL_LIMITS } from "../browser-control/protocol.js";
2
- import { CuaExecutorError, isCuaExecutorError } from "../actors/computer-use/executor-error.js";
2
+ import { ComputerUseExecutorError, isComputerUseExecutorError, } from "../actors/computer-use/executor-error.js";
3
3
  /** Owner-only composition for a single headed Chromium page. Never an actor API. */
4
4
  export function createGuestBrowserTools(native, content) {
5
5
  let addressBarArmed = false;
@@ -11,7 +11,7 @@ export function createGuestBrowserTools(native, content) {
11
11
  const inputGeneration = ++generation;
12
12
  await native.input(args, signal);
13
13
  if (signal.aborted || inputGeneration !== generation)
14
- throw new CuaExecutorError("session_revoked", "outcome_uncertain");
14
+ throw new ComputerUseExecutorError("session_revoked", "outcome_uncertain");
15
15
  // Positive navigation intent, not an inference from document.hasFocus().
16
16
  addressBarArmed =
17
17
  args.length === 3 &&
@@ -28,15 +28,15 @@ export function createGuestBrowserTools(native, content) {
28
28
  // separate qualification. Do not silently switch routes or transliterate.
29
29
  if (!/^[\x20-\x7e]+$/.test(text) ||
30
30
  Buffer.byteLength(text) > BROWSER_CONTROL_LIMITS.textBytes) {
31
- throw new CuaExecutorError("action_rejected", "not_dispatched");
31
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
32
32
  }
33
33
  const preparedGeneration = generation;
34
34
  let used = false;
35
35
  function check() {
36
36
  if (signal.aborted)
37
- throw new CuaExecutorError("session_revoked", "not_dispatched");
37
+ throw new ComputerUseExecutorError("session_revoked", "not_dispatched");
38
38
  if (used || preparedGeneration !== generation)
39
- throw new CuaExecutorError("action_rejected", "not_dispatched");
39
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
40
40
  }
41
41
  check();
42
42
  await content.assertReady(signal);
@@ -52,15 +52,15 @@ export function createGuestBrowserTools(native, content) {
52
52
  try {
53
53
  await native.input(["key", "--clearmodifiers", "ctrl+l"], signal);
54
54
  if (signal.aborted)
55
- throw new CuaExecutorError("session_revoked", "outcome_uncertain");
55
+ throw new ComputerUseExecutorError("session_revoked", "outcome_uncertain");
56
56
  await content.assertReady(signal);
57
57
  if (signal.aborted || preparedGeneration !== generation)
58
- throw new CuaExecutorError("session_revoked", "outcome_uncertain");
58
+ throw new ComputerUseExecutorError("session_revoked", "outcome_uncertain");
59
59
  await native.typeAscii(text, signal);
60
60
  }
61
61
  catch (error) {
62
62
  // Ctrl+L itself is input. No content fallback after that dispatch.
63
- throw new CuaExecutorError(isCuaExecutorError(error) ? error.code : "execution_failed", "outcome_uncertain");
63
+ throw new ComputerUseExecutorError(isComputerUseExecutorError(error) ? error.code : "execution_failed", "outcome_uncertain");
64
64
  }
65
65
  },
66
66
  async close() {
@@ -1,5 +1,5 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { CuaExecutorError, isCuaExecutorError } from "../actors/computer-use/executor-error.js";
2
+ import { ComputerUseExecutorError, isComputerUseExecutorError, } from "../actors/computer-use/executor-error.js";
3
3
  const DEADLINE_MS = 5_000;
4
4
  // These expressions execute only in this port's isolated world. Actor text is
5
5
  // never interpolated into JavaScript, a selector, a world name, or a CDP method.
@@ -103,16 +103,16 @@ function unwatchTargetEvents(settings, handlers) {
103
103
  function checkScope(settings, state, expected) {
104
104
  const { context, page } = settings;
105
105
  if (state.closed || state.unusable)
106
- throw new CuaExecutorError("executor_closed", "not_dispatched");
106
+ throw new ComputerUseExecutorError("executor_closed", "not_dispatched");
107
107
  if (state.generation !== expected)
108
- throw new CuaExecutorError("session_revoked", "not_dispatched");
108
+ throw new ComputerUseExecutorError("session_revoked", "not_dispatched");
109
109
  const pages = context.pages();
110
110
  if (state.dialogSeen ||
111
111
  page.isClosed() ||
112
112
  page.context() !== context ||
113
113
  pages.length !== 1 ||
114
114
  pages[0] !== page)
115
- throw new CuaExecutorError("action_rejected", "not_dispatched");
115
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
116
116
  }
117
117
  /**
118
118
  * One bounded operation: a 5 s deadline, the caller's abort, and any interrupt race every step.
@@ -133,7 +133,7 @@ async function runOperation(settings, state, signal, expected, body) {
133
133
  return;
134
134
  stopped = code;
135
135
  controller.abort();
136
- rejectStop(new CuaExecutorError(code, dispatched ? "outcome_uncertain" : "not_dispatched"));
136
+ rejectStop(new ComputerUseExecutorError(code, dispatched ? "outcome_uncertain" : "not_dispatched"));
137
137
  };
138
138
  const abort = () => interrupt("cancelled");
139
139
  const timer = setTimeout(() => interrupt("deadline_exceeded"), DEADLINE_MS);
@@ -143,7 +143,7 @@ async function runOperation(settings, state, signal, expected, body) {
143
143
  if (signal.aborted)
144
144
  abort();
145
145
  if (stopped)
146
- throw new CuaExecutorError(stopped, dispatched ? "outcome_uncertain" : "not_dispatched");
146
+ throw new ComputerUseExecutorError(stopped, dispatched ? "outcome_uncertain" : "not_dispatched");
147
147
  checkScope(settings, state, expected);
148
148
  };
149
149
  try {
@@ -165,8 +165,8 @@ async function runOperation(settings, state, signal, expected, body) {
165
165
  controller.abort();
166
166
  if (dispatched)
167
167
  state.unusable = true;
168
- const code = stopped ?? (isCuaExecutorError(error) ? error.code : "transport_failed");
169
- throw new CuaExecutorError(code, dispatched ? "outcome_uncertain" : "not_dispatched");
168
+ const code = stopped ?? (isComputerUseExecutorError(error) ? error.code : "transport_failed");
169
+ throw new ComputerUseExecutorError(code, dispatched ? "outcome_uncertain" : "not_dispatched");
170
170
  }
171
171
  finally {
172
172
  clearTimeout(timer);
@@ -187,13 +187,13 @@ function sessionDetacher(state) {
187
187
  await Promise.race([
188
188
  session.detach(),
189
189
  new Promise((_resolve, reject) => {
190
- timer = setTimeout(() => reject(new CuaExecutorError("deadline_exceeded", "not_dispatched")), DEADLINE_MS);
190
+ timer = setTimeout(() => reject(new ComputerUseExecutorError("deadline_exceeded", "not_dispatched")), DEADLINE_MS);
191
191
  }),
192
192
  ]);
193
193
  }
194
194
  catch {
195
195
  state.unusable = true;
196
- throw new CuaExecutorError("transport_failed", "not_dispatched");
196
+ throw new ComputerUseExecutorError("transport_failed", "not_dispatched");
197
197
  }
198
198
  finally {
199
199
  clearTimeout(timer);
@@ -215,7 +215,7 @@ async function assertOwnerReady(settings, op) {
215
215
  async function probeElement(op, session, contextId, expression) {
216
216
  const result = await op.step(() => session.send("Runtime.evaluate", evaluateParams(expression, contextId)));
217
217
  if (!probeAccepted(result))
218
- throw new CuaExecutorError("action_rejected", "not_dispatched");
218
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
219
219
  }
220
220
  /**
221
221
  * Preparation: the owner check, a CDP session (recorded on the handle as soon as it exists, so
@@ -233,14 +233,14 @@ async function acquireIsolatedWorld(settings, state, detach, prepared, op) {
233
233
  const tree = await op.step(() => prepared.session.send("Page.getFrameTree"));
234
234
  const frameId = ownedFrameId(tree);
235
235
  if (frameId === undefined)
236
- throw new CuaExecutorError("invalid_response", "not_dispatched");
236
+ throw new ComputerUseExecutorError("invalid_response", "not_dispatched");
237
237
  const world = await op.step(() => prepared.session.send("Page.createIsolatedWorld", {
238
238
  frameId,
239
239
  worldName: settings.worldName,
240
240
  }));
241
241
  prepared.contextId = world.executionContextId;
242
242
  if (!isExecutionContextId(prepared.contextId))
243
- throw new CuaExecutorError("invalid_response", "not_dispatched");
243
+ throw new ComputerUseExecutorError("invalid_response", "not_dispatched");
244
244
  await probeElement(op, prepared.session, prepared.contextId, PREPARE);
245
245
  }
246
246
  /** Disposes a prepared handle once: aborts its lifetime, detaches its session, releases busy. */
@@ -255,7 +255,7 @@ function disposePrepared(state, detach, prepared, self) {
255
255
  await detach(prepared.session);
256
256
  }
257
257
  catch (error) {
258
- throw new CuaExecutorError(isCuaExecutorError(error) ? error.code : "transport_failed", prepared.dispatchedText ? "outcome_uncertain" : "not_dispatched");
258
+ throw new ComputerUseExecutorError(isComputerUseExecutorError(error) ? error.code : "transport_failed", prepared.dispatchedText ? "outcome_uncertain" : "not_dispatched");
259
259
  }
260
260
  finally {
261
261
  state.busy = false;
@@ -274,7 +274,7 @@ function preparedHandle(settings, state, prepared, dispose) {
274
274
  return {
275
275
  async paste() {
276
276
  if (prepared.used || prepared.disposed)
277
- throw new CuaExecutorError("action_rejected", "not_dispatched");
277
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
278
278
  prepared.used = true; // A failed attempt cannot be retried through this handle.
279
279
  await runOperation(settings, state, prepared.lifetime.signal, prepared.expected, async (op) => {
280
280
  await assertOwnerReady(settings, op);
@@ -345,10 +345,10 @@ export function createGuestChromiumText(options) {
345
345
  },
346
346
  async prepareText(text, signal) {
347
347
  if (!isAdmissibleText(text))
348
- throw new CuaExecutorError("invalid_request", "not_dispatched");
348
+ throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
349
349
  checkScope(settings, state, state.generation);
350
350
  if (state.busy)
351
- throw new CuaExecutorError("executor_busy", "not_dispatched");
351
+ throw new ComputerUseExecutorError("executor_busy", "not_dispatched");
352
352
  state.busy = true;
353
353
  const expected = state.generation;
354
354
  const lifetime = new AbortController();
@@ -1,5 +1,5 @@
1
1
  import type { CuaAction, CuaExecutor } from "../actors/computer-use/loop.js";
2
- import { CuaExecutorError } from "../actors/computer-use/executor-error.js";
2
+ import { ComputerUseExecutorError } from "../actors/computer-use/executor-error.js";
3
3
  /** Internal guest port. Implementations recheck signal synchronously before native dispatch. */
4
4
  export interface GuestDesktopTools {
5
5
  capture(signal: AbortSignal): Promise<Buffer>;
@@ -48,7 +48,7 @@ export declare function failureEndsSession(progress: Pick<ActionProgress, "prepa
48
48
  * session_revoked when the signal aborted, then the executor's own error or execution_failed. It
49
49
  * reads signal.aborted only for an undispatched failure, as the inline mapping did.
50
50
  */
51
- export declare function failureError(dispatched: boolean, error: unknown, signal: Pick<AbortSignal, "aborted">): CuaExecutorError;
51
+ export declare function failureError(dispatched: boolean, error: unknown, signal: Pick<AbortSignal, "aborted">): ComputerUseExecutorError;
52
52
  /**
53
53
  * The native commands for an action, wrapped in keydown/keyup when it holds modifiers. It throws
54
54
  * the refusal for an action the desktop cannot take, before anything is sent.
@@ -1,13 +1,13 @@
1
1
  import { perceptualSignature } from "../evidence/frame-signature.js";
2
2
  import { setTimeout as delay } from "node:timers/promises";
3
3
  import { BROWSER_CONTROL_LIMITS, validateBrowserControlAction, validateBrowserControlPng, } from "../browser-control/protocol.js";
4
- import { CuaExecutorError, isCuaExecutorError } from "../actors/computer-use/executor-error.js";
4
+ import { ComputerUseExecutorError, isComputerUseExecutorError, } from "../actors/computer-use/executor-error.js";
5
5
  import { xdotoolChord, xdotoolHeldModifiers } from "./desktop-keys.js";
6
6
  /** Headed X11 input and full-frame captures. Browser metadata is deliberately absent. */
7
7
  export function createGuestDesktopExecutor(options) {
8
8
  const { width, height, tools, authoritySignal } = options;
9
9
  if (!isValidFrameSize(width, height))
10
- throw new CuaExecutorError("invalid_request", "not_dispatched");
10
+ throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
11
11
  const context = {
12
12
  width,
13
13
  height,
@@ -40,12 +40,12 @@ function terminate(state, context) {
40
40
  }
41
41
  function assertOpen(state, signal, dispatched = false) {
42
42
  if (state.terminal || signal.aborted)
43
- throw new CuaExecutorError("session_revoked", dispatched ? "outcome_uncertain" : "not_dispatched");
43
+ throw new ComputerUseExecutorError("session_revoked", dispatched ? "outcome_uncertain" : "not_dispatched");
44
44
  }
45
45
  function begin(state, signal) {
46
46
  assertOpen(state, signal);
47
47
  if (state.busy)
48
- throw new CuaExecutorError("executor_busy", "not_dispatched");
48
+ throw new ComputerUseExecutorError("executor_busy", "not_dispatched");
49
49
  state.busy = true;
50
50
  }
51
51
  /** Captures one full frame and checks it is a PNG of the executor's size. */
@@ -57,15 +57,15 @@ async function observeFrame(context, state) {
57
57
  assertOpen(state, authoritySignal);
58
58
  validateBrowserControlPng(screenshot);
59
59
  if (screenshot.readUInt32BE(16) !== width || screenshot.readUInt32BE(20) !== height) {
60
- throw new CuaExecutorError("invalid_response", "not_dispatched");
60
+ throw new ComputerUseExecutorError("invalid_response", "not_dispatched");
61
61
  }
62
62
  return { screenshot, stateSignature: perceptualSignature(screenshot) };
63
63
  }
64
64
  catch (error) {
65
65
  terminate(state, context);
66
- throw isCuaExecutorError(error)
66
+ throw isComputerUseExecutorError(error)
67
67
  ? error
68
- : new CuaExecutorError("execution_failed", "not_dispatched");
68
+ : new ComputerUseExecutorError("execution_failed", "not_dispatched");
69
69
  }
70
70
  finally {
71
71
  state.busy = false;
@@ -99,7 +99,7 @@ async function executeAction(context, state, value, callerSignal) {
99
99
  catch (error) {
100
100
  // This transaction has no earlier input. Its private bridge can
101
101
  // prove that no insertion or native input was sent.
102
- if (isCuaExecutorError(error) && error.disposition === "not_dispatched")
102
+ if (isComputerUseExecutorError(error) && error.disposition === "not_dispatched")
103
103
  progress.dispatched = false;
104
104
  throw error;
105
105
  }
@@ -143,7 +143,7 @@ async function executeAction(context, state, value, callerSignal) {
143
143
  catch {
144
144
  terminate(state, context);
145
145
  // oxlint-disable-next-line no-unsafe-finally -- a text channel that fails to close makes the action outcome unknowable
146
- throw new CuaExecutorError("execution_failed", progress.dispatched ? "outcome_uncertain" : "not_dispatched");
146
+ throw new ComputerUseExecutorError("execution_failed", progress.dispatched ? "outcome_uncertain" : "not_dispatched");
147
147
  }
148
148
  finally {
149
149
  state.busy = false;
@@ -157,12 +157,12 @@ async function executeAction(context, state, value, callerSignal) {
157
157
  */
158
158
  export function failureEndsSession(progress, error, signal) {
159
159
  return ((progress.preparing &&
160
- !(isCuaExecutorError(error) &&
160
+ !(isComputerUseExecutorError(error) &&
161
161
  error.code === "action_rejected" &&
162
162
  error.disposition === "not_dispatched")) ||
163
163
  progress.dispatched ||
164
164
  signal.aborted ||
165
- !isCuaExecutorError(error));
165
+ !isComputerUseExecutorError(error));
166
166
  }
167
167
  /**
168
168
  * The error a failed action throws: outcome_uncertain once anything was dispatched, then
@@ -171,12 +171,12 @@ export function failureEndsSession(progress, error, signal) {
171
171
  */
172
172
  export function failureError(dispatched, error, signal) {
173
173
  if (dispatched)
174
- return new CuaExecutorError(isCuaExecutorError(error) ? error.code : "execution_failed", "outcome_uncertain");
174
+ return new ComputerUseExecutorError(isComputerUseExecutorError(error) ? error.code : "execution_failed", "outcome_uncertain");
175
175
  if (signal.aborted)
176
- return new CuaExecutorError("session_revoked", "not_dispatched");
177
- return isCuaExecutorError(error)
176
+ return new ComputerUseExecutorError("session_revoked", "not_dispatched");
177
+ return isComputerUseExecutorError(error)
178
178
  ? error
179
- : new CuaExecutorError("execution_failed", "not_dispatched");
179
+ : new ComputerUseExecutorError("execution_failed", "not_dispatched");
180
180
  }
181
181
  /**
182
182
  * The native commands for an action, wrapped in keydown/keyup when it holds modifiers. It throws
@@ -194,7 +194,7 @@ function framePoint(frame, x, y) {
194
194
  const { width, height } = frame;
195
195
  // Reject out-of-frame input instead of clicking a clamped, unintended target.
196
196
  if (x < 0 || y < 0 || x >= width || y >= height)
197
- throw new CuaExecutorError("action_rejected", "not_dispatched");
197
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
198
198
  return [String(Math.min(width - 1, Math.round(x))), String(Math.min(height - 1, Math.round(y)))];
199
199
  }
200
200
  /** The native commands for an action, before any held modifiers. */
@@ -219,13 +219,13 @@ function actionCommands(frame, action) {
219
219
  // must be refused instead of silently changing the requested text.
220
220
  if (action.text.includes("\0") ||
221
221
  Buffer.from(action.text, "utf8").toString("utf8") !== action.text)
222
- throw new CuaExecutorError("action_rejected", "not_dispatched");
222
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
223
223
  return [];
224
224
  }
225
225
  case "drag": {
226
226
  const points = action.path.map((p) => framePoint(frame, p.x, p.y));
227
227
  if (points.length < 2)
228
- throw new CuaExecutorError("action_rejected", "not_dispatched");
228
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
229
229
  return [
230
230
  ["mousemove", ...points[0]],
231
231
  ["mousedown", "1"],
@@ -238,7 +238,7 @@ function actionCommands(frame, action) {
238
238
  // Native X11 wheel steps do not promise exact pixel scroll distances.
239
239
  const horizontal = Math.ceil(Math.abs(action.dx) / 120), vertical = Math.ceil(Math.abs(action.dy) / 120);
240
240
  if (horizontal + vertical > 100)
241
- throw new CuaExecutorError("action_rejected", "not_dispatched");
241
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
242
242
  return horizontal + vertical === 0
243
243
  ? []
244
244
  : [
@@ -251,6 +251,6 @@ function actionCommands(frame, action) {
251
251
  case "screenshot":
252
252
  return [];
253
253
  case "speak":
254
- throw new CuaExecutorError("action_rejected", "not_dispatched");
254
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
255
255
  }
256
256
  }
@@ -1,4 +1,4 @@
1
- import { CuaExecutorError } from "../actors/computer-use/executor-error.js";
1
+ import { ComputerUseExecutorError } from "../actors/computer-use/executor-error.js";
2
2
  // Key names for the xdotool-driven desktops: the guest's headed display and the E2B sandbox. Both
3
3
  // hand these strings to xdotool, which has a command language, so only names from these tables
4
4
  // ever reach it. The guest runtime ships this module, so it lives in src/guest/, which CI's
@@ -56,7 +56,7 @@ function lookup(table, key) {
56
56
  }
57
57
  function chord(names) {
58
58
  if (new Set(names).size !== names.length)
59
- throw new CuaExecutorError("action_rejected", "not_dispatched");
59
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
60
60
  return names.join("+");
61
61
  }
62
62
  /** A keypress chord in xdotool syntax. Unknown or repeated keys are refused before dispatch. */
@@ -68,7 +68,7 @@ export function xdotoolChord(keys) {
68
68
  return key.toUpperCase();
69
69
  const name = lookup(keyNames, key);
70
70
  if (!name)
71
- throw new CuaExecutorError("action_rejected", "not_dispatched");
71
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
72
72
  return name;
73
73
  }));
74
74
  }
@@ -83,7 +83,7 @@ export function xdotoolHeldModifiers(keys) {
83
83
  return chord(keys.map((key) => {
84
84
  const name = lookup(modifierNames, key);
85
85
  if (!name)
86
- throw new CuaExecutorError("action_rejected", "not_dispatched");
86
+ throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
87
87
  return name;
88
88
  }));
89
89
  }
@@ -1,6 +1,6 @@
1
1
  import type { CuaExecutor } from "../actors/computer-use/loop.js";
2
2
  import { type HeardSpeech } from "../actors/computer-use/speech.js";
3
- import { CuaExecutorError } from "../actors/computer-use/executor-error.js";
3
+ import { ComputerUseExecutorError } from "../actors/computer-use/executor-error.js";
4
4
  interface GuestDesktopMediaDeclaration {
5
5
  camera?: {
6
6
  source: string;
@@ -64,7 +64,7 @@ export declare function classifyWorkerMessage(value: unknown, ready: boolean): W
64
64
  /** Once a speak command is written, its outcome is unknown unless the worker replies. */
65
65
  export declare function dispositionAfterWrite(written: boolean): "outcome_uncertain" | "not_dispatched";
66
66
  /** A failed speak keeps its own executor error; anything else is an execution failure. */
67
- export declare function speakFailure(error: unknown, written: boolean): CuaExecutorError;
67
+ export declare function speakFailure(error: unknown, written: boolean): ComputerUseExecutorError;
68
68
  /** Starts optional native guest media before Chromium and later decorates its finite executor. */
69
69
  export declare function startDesktopMedia(options: GuestDesktopMediaOptions): Promise<GuestDesktopMedia>;
70
70
  export {};