humanish 0.105.0 → 0.106.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 (1408) hide show
  1. package/AGENTS.md +89 -94
  2. package/ARCHITECTURE.md +146 -0
  3. package/CHANGELOG.md +502 -0
  4. package/CONTEXT.md +51 -0
  5. package/CONTRIBUTING.md +111 -9
  6. package/README.md +213 -124
  7. package/SECURITY.md +1 -1
  8. package/TELEMETRY.md +112 -0
  9. package/dist/actors/affordance.d.ts +56 -0
  10. package/dist/actors/affordance.js +155 -0
  11. package/dist/actors/agent-session.js +42 -0
  12. package/dist/actors/codex/app-server-actor-trace.d.ts +11 -0
  13. package/dist/actors/codex/app-server-actor-trace.js +211 -0
  14. package/dist/actors/codex/app-server-client.d.ts +39 -0
  15. package/dist/actors/codex/app-server-client.js +116 -0
  16. package/dist/actors/codex/app-server-trace.d.ts +154 -0
  17. package/dist/actors/codex/app-server-trace.js +424 -0
  18. package/dist/actors/codex/app-server-ui.d.ts +40 -0
  19. package/dist/actors/codex/app-server-ui.js +328 -0
  20. package/dist/actors/codex/app-server.d.ts +44 -0
  21. package/dist/actors/codex/app-server.js +268 -0
  22. package/dist/actors/codex/qualified-versions.d.ts +45 -0
  23. package/dist/actors/codex/qualified-versions.js +87 -0
  24. package/dist/actors/codex/restricted-executable.d.ts +17 -0
  25. package/dist/actors/codex/restricted-executable.js +147 -0
  26. package/dist/actors/codex/restricted-launch.d.ts +116 -0
  27. package/dist/actors/codex/restricted-launch.js +222 -0
  28. package/dist/actors/codex/restricted-participant-policy.d.ts +46 -0
  29. package/dist/actors/codex/restricted-participant-policy.js +82 -0
  30. package/dist/actors/codex/restricted-participant.d.ts +20 -0
  31. package/dist/actors/codex/restricted-participant.js +432 -0
  32. package/dist/actors/codex/restricted-policy.d.ts +70 -0
  33. package/dist/actors/codex/restricted-policy.js +326 -0
  34. package/dist/actors/codex/restricted-session.d.ts +65 -0
  35. package/dist/actors/codex/restricted-session.js +432 -0
  36. package/dist/actors/codex/restricted-transport.d.ts +73 -0
  37. package/dist/actors/codex/restricted-transport.js +335 -0
  38. package/dist/actors/codex/restricted-turn.d.ts +62 -0
  39. package/dist/actors/codex/restricted-turn.js +284 -0
  40. package/dist/actors/computer-use/actor.d.ts +77 -0
  41. package/dist/actors/computer-use/actor.js +78 -0
  42. package/dist/actors/computer-use/admission-limit.d.ts +12 -0
  43. package/dist/actors/computer-use/admission-limit.js +19 -0
  44. package/dist/actors/computer-use/executor-error.js +48 -0
  45. package/dist/actors/computer-use/loop/actions.d.ts +26 -0
  46. package/dist/actors/computer-use/loop/actions.js +245 -0
  47. package/dist/actors/computer-use/loop/backstop.d.ts +42 -0
  48. package/dist/actors/computer-use/loop/backstop.js +202 -0
  49. package/dist/actors/computer-use/loop/debrief.d.ts +19 -0
  50. package/dist/actors/computer-use/loop/debrief.js +164 -0
  51. package/dist/actors/computer-use/loop/ending.d.ts +86 -0
  52. package/dist/actors/computer-use/loop/ending.js +316 -0
  53. package/dist/actors/computer-use/loop/observation.d.ts +55 -0
  54. package/dist/actors/computer-use/loop/observation.js +246 -0
  55. package/dist/actors/computer-use/loop/output-limit.d.ts +11 -0
  56. package/dist/actors/computer-use/loop/output-limit.js +21 -0
  57. package/dist/actors/computer-use/loop/provider-call.d.ts +19 -0
  58. package/dist/actors/computer-use/loop/provider-call.js +208 -0
  59. package/dist/actors/computer-use/loop/race.d.ts +34 -0
  60. package/dist/actors/computer-use/loop/race.js +79 -0
  61. package/dist/actors/computer-use/loop/session.d.ts +77 -0
  62. package/dist/actors/computer-use/loop/session.js +135 -0
  63. package/dist/actors/computer-use/loop/spend.d.ts +30 -0
  64. package/dist/actors/computer-use/loop/spend.js +85 -0
  65. package/dist/actors/computer-use/loop/trace.d.ts +35 -0
  66. package/dist/actors/computer-use/loop/trace.js +140 -0
  67. package/dist/actors/computer-use/loop/types.d.ts +404 -0
  68. package/dist/actors/computer-use/loop/types.js +1 -0
  69. package/dist/actors/computer-use/loop/usage.d.ts +102 -0
  70. package/dist/actors/computer-use/loop/usage.js +355 -0
  71. package/dist/actors/computer-use/loop.d.ts +11 -0
  72. package/dist/actors/computer-use/loop.js +248 -0
  73. package/dist/actors/computer-use/openai-provider.d.ts +107 -0
  74. package/dist/actors/computer-use/openai-provider.js +472 -0
  75. package/dist/actors/computer-use/openai-requests.d.ts +35 -0
  76. package/dist/actors/computer-use/openai-requests.js +74 -0
  77. package/dist/actors/computer-use/openai-wire.d.ts +67 -0
  78. package/dist/actors/computer-use/openai-wire.js +365 -0
  79. package/dist/actors/computer-use/provider-error.d.ts +27 -0
  80. package/dist/actors/computer-use/provider-error.js +86 -0
  81. package/dist/actors/computer-use/speech.js +6 -0
  82. package/dist/actors/contract.d.ts +315 -0
  83. package/dist/actors/contract.js +201 -0
  84. package/dist/actors/goal-source.js +38 -0
  85. package/dist/actors/local-agent/claude-session.d.ts +43 -0
  86. package/dist/actors/local-agent/claude-session.js +370 -0
  87. package/dist/actors/local-agent/cli.d.ts +115 -0
  88. package/dist/actors/local-agent/cli.js +413 -0
  89. package/dist/actors/local-agent/readiness.d.ts +31 -0
  90. package/dist/actors/local-agent/readiness.js +45 -0
  91. package/dist/actors/openai-endpoint.d.ts +2 -0
  92. package/dist/actors/openai-endpoint.js +2 -0
  93. package/dist/actors/output-token-limit.js +4 -0
  94. package/dist/actors/reasoning-effort.js +33 -0
  95. package/dist/actors/registry.d.ts +59 -0
  96. package/dist/actors/registry.js +89 -0
  97. package/dist/actors/scripted-browser/actor.d.ts +49 -0
  98. package/dist/actors/scripted-browser/actor.js +428 -0
  99. package/dist/actors/scripted-browser/browser-command.d.ts +1 -0
  100. package/dist/actors/scripted-browser/browser-command.js +48 -0
  101. package/dist/actors/scripted-browser/journey.d.ts +9 -0
  102. package/dist/actors/scripted-browser/journey.js +171 -0
  103. package/dist/actors/scripted-browser/steps.d.ts +60 -0
  104. package/dist/actors/scripted-browser/steps.js +384 -0
  105. package/dist/actors/scripted-browser/types.d.ts +135 -0
  106. package/dist/actors/scripted-browser/types.js +26 -0
  107. package/dist/actors/stop-cause.d.ts +9 -0
  108. package/dist/actors/stop-cause.js +42 -0
  109. package/dist/actors/stop-conditions.d.ts +40 -0
  110. package/dist/actors/stop-conditions.js +65 -0
  111. package/dist/analysis/automatic-completion.d.ts +38 -0
  112. package/dist/analysis/automatic-completion.js +90 -0
  113. package/dist/analysis/automatic-config.d.ts +41 -0
  114. package/dist/analysis/automatic-config.js +135 -0
  115. package/dist/analysis/automatic.d.ts +17 -0
  116. package/dist/analysis/automatic.js +279 -0
  117. package/dist/analysis/codex-config.d.ts +8 -0
  118. package/dist/analysis/codex-config.js +69 -0
  119. package/dist/analysis/evidence-sources.d.ts +23 -0
  120. package/dist/analysis/evidence-sources.js +251 -0
  121. package/dist/analysis/evidence.d.ts +18 -0
  122. package/dist/analysis/evidence.js +482 -0
  123. package/dist/analysis/execute.d.ts +52 -0
  124. package/dist/analysis/execute.js +504 -0
  125. package/dist/analysis/image-tokens.d.ts +1 -0
  126. package/dist/analysis/image-tokens.js +41 -0
  127. package/dist/analysis/job.d.ts +97 -0
  128. package/dist/analysis/job.js +311 -0
  129. package/dist/analysis/load.d.ts +3 -0
  130. package/dist/analysis/load.js +11 -0
  131. package/dist/analysis/provider.d.ts +57 -0
  132. package/dist/analysis/provider.js +227 -0
  133. package/dist/analysis/restricted-codex.d.ts +19 -0
  134. package/dist/analysis/restricted-codex.js +23 -0
  135. package/dist/analysis/service.d.ts +72 -0
  136. package/dist/analysis/service.js +399 -0
  137. package/dist/analysis/sharing.d.ts +11 -0
  138. package/dist/analysis/sharing.js +44 -0
  139. package/dist/analysis/store-executions.d.ts +27 -0
  140. package/dist/analysis/store-executions.js +224 -0
  141. package/dist/analysis/store.d.ts +31 -0
  142. package/dist/analysis/store.js +315 -0
  143. package/dist/analysis/types.d.ts +217 -0
  144. package/dist/analysis/types.js +12 -0
  145. package/dist/analysis/validation.d.ts +225 -0
  146. package/dist/analysis/validation.js +562 -0
  147. package/dist/browser-control/client.d.ts +18 -0
  148. package/dist/browser-control/client.js +239 -0
  149. package/dist/browser-control/dispatcher.d.ts +19 -0
  150. package/dist/browser-control/dispatcher.js +221 -0
  151. package/dist/browser-control/protocol.d.ts +492 -0
  152. package/dist/browser-control/protocol.js +360 -0
  153. package/dist/browser-control/recording-transfer.d.ts +3 -0
  154. package/dist/browser-control/recording-transfer.js +48 -0
  155. package/dist/browser-control/transport.d.ts +27 -0
  156. package/dist/browser-control/transport.js +189 -0
  157. package/dist/cli/commands/analysis-signals.d.ts +7 -0
  158. package/dist/cli/commands/analysis-signals.js +25 -0
  159. package/dist/cli/commands/analyze.d.ts +3 -0
  160. package/dist/cli/commands/analyze.js +212 -0
  161. package/dist/cli/commands/codex.d.ts +3 -0
  162. package/dist/cli/commands/codex.js +145 -0
  163. package/dist/cli/commands/comms.d.ts +3 -0
  164. package/dist/cli/commands/comms.js +225 -0
  165. package/dist/cli/commands/feedback.d.ts +3 -0
  166. package/dist/cli/commands/feedback.js +138 -0
  167. package/dist/cli/commands/lab-format.d.ts +8 -0
  168. package/dist/cli/commands/lab-format.js +105 -0
  169. package/dist/cli/commands/lab-route-computer-use.d.ts +20 -0
  170. package/dist/cli/commands/lab-route-computer-use.js +251 -0
  171. package/dist/cli/commands/lab-route-open.d.ts +27 -0
  172. package/dist/cli/commands/lab-route-open.js +37 -0
  173. package/dist/cli/commands/lab-route-preview.d.ts +20 -0
  174. package/dist/cli/commands/lab-route-preview.js +74 -0
  175. package/dist/cli/commands/lab-route-run.d.ts +17 -0
  176. package/dist/cli/commands/lab-route-run.js +31 -0
  177. package/dist/cli/commands/lab-route-scripted.d.ts +19 -0
  178. package/dist/cli/commands/lab-route-scripted.js +50 -0
  179. package/dist/cli/commands/lab-route-shared-world.d.ts +20 -0
  180. package/dist/cli/commands/lab-route-shared-world.js +135 -0
  181. package/dist/cli/commands/lab-route-terminal.d.ts +19 -0
  182. package/dist/cli/commands/lab-route-terminal.js +49 -0
  183. package/dist/cli/commands/lab-run.d.ts +9 -0
  184. package/dist/cli/commands/lab-run.js +166 -0
  185. package/dist/cli/commands/lab-scorer.d.ts +30 -0
  186. package/dist/cli/commands/lab-scorer.js +17 -0
  187. package/dist/cli/commands/lab.d.ts +3 -0
  188. package/dist/cli/commands/lab.js +193 -0
  189. package/dist/cli/commands/observe.d.ts +4 -0
  190. package/dist/cli/commands/observe.js +345 -0
  191. package/dist/cli/commands/runs.d.ts +11 -0
  192. package/dist/cli/commands/runs.js +314 -0
  193. package/dist/cli/commands/setup.d.ts +11 -0
  194. package/dist/cli/commands/setup.js +325 -0
  195. package/dist/cli/commands/tui.d.ts +32 -0
  196. package/dist/cli/commands/tui.js +305 -0
  197. package/dist/cli/commands/watch.d.ts +3 -0
  198. package/dist/cli/commands/watch.js +245 -0
  199. package/dist/cli/doctor.d.ts +39 -0
  200. package/dist/cli/doctor.js +263 -0
  201. package/dist/cli/first-run-path.d.ts +67 -0
  202. package/dist/cli/first-run-path.js +150 -0
  203. package/dist/cli/io.d.ts +85 -0
  204. package/dist/cli/io.js +232 -0
  205. package/dist/cli/observer-follow.d.ts +56 -0
  206. package/dist/cli/observer-follow.js +160 -0
  207. package/dist/cli/orientation.d.ts +30 -0
  208. package/dist/cli/orientation.js +114 -0
  209. package/dist/cli/program.d.ts +15 -0
  210. package/dist/cli/program.js +338 -0
  211. package/dist/cli/secret-prompt.js +39 -0
  212. package/dist/cli/telemetry.js +351 -0
  213. package/dist/cli.js +2 -4
  214. package/dist/comms/agentmail.d.ts +29 -0
  215. package/dist/comms/agentmail.js +568 -0
  216. package/dist/comms/capture-surface.d.ts +54 -0
  217. package/dist/comms/capture-surface.js +468 -0
  218. package/dist/comms/catch-host.d.ts +52 -0
  219. package/dist/comms/catch-host.js +192 -0
  220. package/dist/comms/connections.d.ts +20 -0
  221. package/dist/comms/connections.js +116 -0
  222. package/dist/comms/email-catch.d.ts +49 -0
  223. package/dist/comms/email-catch.js +236 -0
  224. package/dist/comms/extract.d.ts +7 -0
  225. package/dist/comms/extract.js +65 -0
  226. package/dist/comms/fake-inbox.d.ts +39 -0
  227. package/dist/comms/fake-inbox.js +136 -0
  228. package/dist/comms/images.d.ts +7 -0
  229. package/dist/comms/images.js +53 -0
  230. package/dist/comms/lease-store.d.ts +91 -0
  231. package/dist/comms/lease-store.js +600 -0
  232. package/dist/comms/providers.d.ts +30 -0
  233. package/dist/comms/providers.js +24 -0
  234. package/dist/comms/receiving-common.d.ts +17 -0
  235. package/dist/comms/receiving-common.js +82 -0
  236. package/dist/comms/receiving-evidence.d.ts +4 -0
  237. package/dist/comms/receiving-evidence.js +59 -0
  238. package/dist/comms/receiving-recovery.d.ts +22 -0
  239. package/dist/comms/receiving-recovery.js +100 -0
  240. package/dist/comms/receiving-render.d.ts +16 -0
  241. package/dist/comms/receiving-render.js +409 -0
  242. package/dist/comms/receiving-runtime.d.ts +41 -0
  243. package/dist/comms/receiving-runtime.js +66 -0
  244. package/dist/comms/receiving-surface.d.ts +8 -0
  245. package/dist/comms/receiving-surface.js +156 -0
  246. package/dist/comms/receiving-types.d.ts +122 -0
  247. package/dist/comms/receiving-types.js +3 -0
  248. package/dist/comms/receiving.d.ts +33 -0
  249. package/dist/comms/receiving.js +508 -0
  250. package/dist/comms/sandbox-catch-script.d.ts +16 -0
  251. package/dist/comms/sandbox-catch-script.js +331 -0
  252. package/dist/comms/sandbox-catch.d.ts +214 -0
  253. package/dist/comms/sandbox-catch.js +451 -0
  254. package/dist/comms/setup.d.ts +65 -0
  255. package/dist/comms/setup.js +259 -0
  256. package/dist/comms/thread-evidence.d.ts +28 -0
  257. package/dist/comms/thread-evidence.js +30 -0
  258. package/dist/comms/types.d.ts +76 -0
  259. package/dist/comms/types.js +8 -0
  260. package/dist/deprecated.d.ts +90 -0
  261. package/dist/deprecated.js +106 -0
  262. package/dist/evidence/browser-hygiene.js +42 -0
  263. package/dist/evidence/desktop-recorder.d.ts +39 -0
  264. package/dist/evidence/desktop-recorder.js +340 -0
  265. package/dist/evidence/desktop-recording-artifact.d.ts +5 -0
  266. package/dist/evidence/desktop-recording-artifact.js +53 -0
  267. package/dist/evidence/desktop-recording-types.d.ts +27 -0
  268. package/dist/evidence/desktop-recording-types.js +16 -0
  269. package/dist/evidence/encoded-text.d.ts +27 -0
  270. package/dist/evidence/encoded-text.js +243 -0
  271. package/dist/evidence/frame-signature.d.ts +17 -0
  272. package/dist/evidence/frame-signature.js +111 -0
  273. package/dist/evidence/image.d.ts +24 -0
  274. package/dist/evidence/image.js +170 -0
  275. package/dist/evidence/plain-text.d.ts +8 -0
  276. package/dist/evidence/plain-text.js +16 -0
  277. package/dist/evidence/redaction.d.ts +110 -0
  278. package/dist/evidence/redaction.js +329 -0
  279. package/dist/feedback/draft.d.ts +58 -0
  280. package/dist/feedback/draft.js +309 -0
  281. package/dist/feedback/export-bundle.d.ts +6 -0
  282. package/dist/feedback/export-bundle.js +585 -0
  283. package/dist/feedback/export.d.ts +50 -0
  284. package/dist/feedback/export.js +392 -0
  285. package/dist/feedback/feedback.d.ts +37 -0
  286. package/dist/feedback/feedback.js +282 -0
  287. package/dist/feedback/proof.d.ts +8 -0
  288. package/dist/feedback/proof.js +56 -0
  289. package/dist/guest/bootstrap.d.ts +55 -0
  290. package/dist/guest/bootstrap.js +348 -0
  291. package/dist/guest/browser-tools.d.ts +8 -0
  292. package/dist/guest/browser-tools.js +72 -0
  293. package/dist/guest/chromium-text.d.ts +62 -0
  294. package/dist/guest/chromium-text.js +386 -0
  295. package/dist/guest/desktop-executor.d.ts +57 -0
  296. package/dist/guest/desktop-executor.js +256 -0
  297. package/dist/guest/desktop-keys.d.ts +8 -0
  298. package/dist/guest/desktop-keys.js +89 -0
  299. package/dist/guest/desktop-media.d.ts +70 -0
  300. package/dist/guest/desktop-media.js +385 -0
  301. package/dist/guest/desktop-native.d.ts +14 -0
  302. package/dist/guest/desktop-native.js +156 -0
  303. package/dist/guest/media-config.d.ts +15 -0
  304. package/dist/guest/media-config.js +16 -0
  305. package/dist/guest/runtime-desktop.d.ts +45 -0
  306. package/dist/guest/runtime-desktop.js +420 -0
  307. package/dist/guest/runtime-processes.d.ts +28 -0
  308. package/dist/guest/runtime-processes.js +94 -0
  309. package/dist/guest/runtime.d.ts +31 -0
  310. package/dist/guest/runtime.js +124 -0
  311. package/dist/guest-media-worker.js +184 -48
  312. package/dist/guest-runtime-main.js +23 -10
  313. package/dist/guest-runtime-revision.js +1 -1
  314. package/dist/index.d.ts +32 -83
  315. package/dist/index.js +21 -42
  316. package/dist/keys/env-file.d.ts +15 -0
  317. package/dist/keys/env-file.js +109 -0
  318. package/dist/keys/key-resolution.d.ts +58 -0
  319. package/dist/keys/key-resolution.js +389 -0
  320. package/dist/lab/adapter-extension.d.ts +75 -0
  321. package/dist/lab/adapter-extension.js +253 -0
  322. package/dist/lab/adapter-scorer-loader.d.ts +43 -0
  323. package/dist/lab/adapter-scorer-loader.js +130 -0
  324. package/dist/lab/bag-overrides.d.ts +18 -0
  325. package/dist/lab/bag-overrides.js +121 -0
  326. package/dist/lab/composition-rules.d.ts +5 -0
  327. package/dist/lab/composition-rules.js +283 -0
  328. package/dist/lab/config.d.ts +7 -0
  329. package/dist/lab/config.js +208 -0
  330. package/dist/lab/device-presets.d.ts +97 -0
  331. package/dist/lab/device-presets.js +87 -0
  332. package/dist/lab/discover.d.ts +65 -0
  333. package/dist/lab/discover.js +422 -0
  334. package/dist/lab/doctor.d.ts +39 -0
  335. package/dist/lab/doctor.js +233 -0
  336. package/dist/lab/init-paths.d.ts +5 -0
  337. package/dist/lab/init-paths.js +89 -0
  338. package/dist/lab/init-plan.d.ts +20 -0
  339. package/dist/lab/init-plan.js +163 -0
  340. package/dist/lab/init-templates.d.ts +28 -0
  341. package/dist/lab/init-templates.js +416 -0
  342. package/dist/lab/init.d.ts +39 -0
  343. package/dist/lab/init.js +287 -0
  344. package/dist/lab/keys.d.ts +2 -0
  345. package/dist/lab/keys.js +264 -0
  346. package/dist/lab/parse/actors.d.ts +14 -0
  347. package/dist/lab/parse/actors.js +453 -0
  348. package/dist/lab/parse/comms.d.ts +12 -0
  349. package/dist/lab/parse/comms.js +246 -0
  350. package/dist/lab/parse/execution.d.ts +19 -0
  351. package/dist/lab/parse/execution.js +356 -0
  352. package/dist/lab/parse/subject-state.d.ts +30 -0
  353. package/dist/lab/parse/subject-state.js +179 -0
  354. package/dist/lab/parse/subject.d.ts +9 -0
  355. package/dist/lab/parse/subject.js +420 -0
  356. package/dist/lab/parse/values.d.ts +17 -0
  357. package/dist/lab/parse/values.js +65 -0
  358. package/dist/lab/participant-assignment.d.ts +12 -0
  359. package/dist/lab/participant-assignment.js +19 -0
  360. package/dist/lab/persona-resolve.d.ts +39 -0
  361. package/dist/lab/persona-resolve.js +118 -0
  362. package/dist/lab/persona.d.ts +39 -0
  363. package/dist/lab/persona.js +192 -0
  364. package/dist/lab/plan-base.d.ts +24 -0
  365. package/dist/lab/plan-base.js +113 -0
  366. package/dist/lab/plan-participants.d.ts +81 -0
  367. package/dist/lab/plan-participants.js +92 -0
  368. package/dist/lab/plan-types.d.ts +269 -0
  369. package/dist/lab/plan-types.js +5 -0
  370. package/dist/lab/plan.d.ts +27 -0
  371. package/dist/lab/plan.js +156 -0
  372. package/dist/lab/preflight-probes.d.ts +3 -0
  373. package/dist/lab/preflight-probes.js +312 -0
  374. package/dist/lab/preflight-result.d.ts +7 -0
  375. package/dist/lab/preflight-result.js +43 -0
  376. package/dist/lab/preflight.d.ts +95 -0
  377. package/dist/lab/preflight.js +117 -0
  378. package/dist/lab/route-inputs.d.ts +17 -0
  379. package/dist/lab/route-inputs.js +95 -0
  380. package/dist/lab/routing.d.ts +81 -0
  381. package/dist/lab/routing.js +214 -0
  382. package/dist/lab/run-lab-events.d.ts +69 -0
  383. package/dist/lab/run-lab-events.js +95 -0
  384. package/dist/lab/run-lab-options.d.ts +82 -0
  385. package/dist/lab/run-lab-options.js +399 -0
  386. package/dist/lab/summary.d.ts +60 -0
  387. package/dist/lab/summary.js +168 -0
  388. package/dist/lab/tasks.d.ts +91 -0
  389. package/dist/lab/tasks.js +139 -0
  390. package/dist/lab/types.d.ts +813 -0
  391. package/dist/lab/types.js +6 -0
  392. package/dist/lab/validation.d.ts +67 -0
  393. package/dist/lab/validation.js +387 -0
  394. package/dist/lab/warnings.d.ts +2 -0
  395. package/dist/lab/warnings.js +338 -0
  396. package/dist/observer/artifact.d.ts +23 -0
  397. package/dist/observer/artifact.js +235 -0
  398. package/dist/observer/data.d.ts +115 -0
  399. package/dist/observer/data.js +258 -0
  400. package/dist/observer/exposure.d.ts +64 -0
  401. package/dist/observer/exposure.js +143 -0
  402. package/dist/observer/http.js +50 -0
  403. package/dist/observer/library.js +190 -0
  404. package/dist/observer/listen.js +85 -0
  405. package/dist/observer/live.d.ts +9 -0
  406. package/dist/observer/live.js +25 -0
  407. package/dist/observer/pinned-files.d.ts +30 -0
  408. package/dist/observer/pinned-files.js +160 -0
  409. package/dist/observer/render.d.ts +69 -0
  410. package/dist/observer/render.js +350 -0
  411. package/dist/observer/run-inventory.d.ts +35 -0
  412. package/dist/observer/run-inventory.js +95 -0
  413. package/dist/observer/run-routes.d.ts +37 -0
  414. package/dist/observer/run-routes.js +373 -0
  415. package/dist/observer/serve.d.ts +97 -0
  416. package/dist/observer/serve.js +305 -0
  417. package/dist/observer/static.js +369 -0
  418. package/dist/observer/tunnel.js +112 -0
  419. package/dist/observer-app.html +9 -20
  420. package/dist/routes/computer-use/bundle-parts.d.ts +50 -0
  421. package/dist/routes/computer-use/bundle-parts.js +177 -0
  422. package/dist/routes/computer-use/bundle.d.ts +56 -0
  423. package/dist/routes/computer-use/bundle.js +184 -0
  424. package/dist/routes/computer-use/diagnostics.d.ts +38 -0
  425. package/dist/routes/computer-use/diagnostics.js +94 -0
  426. package/dist/routes/computer-use/e2b-desktop/comms.d.ts +65 -0
  427. package/dist/routes/computer-use/e2b-desktop/comms.js +225 -0
  428. package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +3 -0
  429. package/dist/routes/computer-use/e2b-desktop/desktop.js +91 -0
  430. package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +65 -0
  431. package/dist/routes/computer-use/e2b-desktop/fidelity.js +156 -0
  432. package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +18 -0
  433. package/dist/routes/computer-use/e2b-desktop/prepare.js +198 -0
  434. package/dist/routes/computer-use/e2b-desktop/start.d.ts +14 -0
  435. package/dist/routes/computer-use/e2b-desktop/start.js +193 -0
  436. package/dist/routes/computer-use/e2b-desktop/state.d.ts +65 -0
  437. package/dist/routes/computer-use/e2b-desktop/state.js +69 -0
  438. package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +6 -0
  439. package/dist/routes/computer-use/e2b-desktop/teardown.js +152 -0
  440. package/dist/routes/computer-use/external-comms.d.ts +20 -0
  441. package/dist/routes/computer-use/external-comms.js +55 -0
  442. package/dist/routes/computer-use/fanout-bundle.d.ts +11 -0
  443. package/dist/routes/computer-use/fanout-bundle.js +274 -0
  444. package/dist/routes/computer-use/fanout-lanes.d.ts +15 -0
  445. package/dist/routes/computer-use/fanout-lanes.js +302 -0
  446. package/dist/routes/computer-use/in-process-desktop.d.ts +17 -0
  447. package/dist/routes/computer-use/in-process-desktop.js +40 -0
  448. package/dist/routes/computer-use/lanes.d.ts +35 -0
  449. package/dist/routes/computer-use/lanes.js +321 -0
  450. package/dist/routes/computer-use/legacy-lane-spec.d.ts +62 -0
  451. package/dist/routes/computer-use/legacy-lane-spec.js +39 -0
  452. package/dist/routes/computer-use/live-flush.d.ts +42 -0
  453. package/dist/routes/computer-use/live-flush.js +154 -0
  454. package/dist/routes/computer-use/local-tree-pack.d.ts +27 -0
  455. package/dist/routes/computer-use/local-tree-pack.js +47 -0
  456. package/dist/routes/computer-use/local-vm.d.ts +20 -0
  457. package/dist/routes/computer-use/local-vm.js +218 -0
  458. package/dist/routes/computer-use/participant-desktop.d.ts +63 -0
  459. package/dist/routes/computer-use/participant-desktop.js +33 -0
  460. package/dist/routes/computer-use/participant-facts.d.ts +6 -0
  461. package/dist/routes/computer-use/participant-facts.js +22 -0
  462. package/dist/routes/computer-use/participant-model.d.ts +30 -0
  463. package/dist/routes/computer-use/participant-model.js +222 -0
  464. package/dist/routes/computer-use/participant-prompt.d.ts +53 -0
  465. package/dist/routes/computer-use/participant-prompt.js +87 -0
  466. package/dist/routes/computer-use/participant-runs.d.ts +67 -0
  467. package/dist/routes/computer-use/participant-runs.js +255 -0
  468. package/dist/routes/computer-use/plan.d.ts +56 -0
  469. package/dist/routes/computer-use/plan.js +308 -0
  470. package/dist/routes/computer-use/preflight.d.ts +26 -0
  471. package/dist/routes/computer-use/preflight.js +85 -0
  472. package/dist/routes/computer-use/rerun-selection.d.ts +19 -0
  473. package/dist/routes/computer-use/rerun-selection.js +121 -0
  474. package/dist/routes/computer-use/result.d.ts +7 -0
  475. package/dist/routes/computer-use/result.js +292 -0
  476. package/dist/routes/computer-use/route.d.ts +33 -0
  477. package/dist/routes/computer-use/route.js +145 -0
  478. package/dist/routes/computer-use/run-lanes.d.ts +59 -0
  479. package/dist/routes/computer-use/run-lanes.js +135 -0
  480. package/dist/routes/computer-use/self-report.d.ts +21 -0
  481. package/dist/routes/computer-use/self-report.js +231 -0
  482. package/dist/routes/computer-use/setup.d.ts +136 -0
  483. package/dist/routes/computer-use/setup.js +371 -0
  484. package/dist/routes/computer-use/single-bundle.d.ts +97 -0
  485. package/dist/routes/computer-use/single-bundle.js +393 -0
  486. package/dist/routes/computer-use/subject-projection.d.ts +51 -0
  487. package/dist/routes/computer-use/subject-projection.js +159 -0
  488. package/dist/routes/computer-use/types.d.ts +539 -0
  489. package/dist/routes/computer-use/types.js +37 -0
  490. package/dist/routes/preview.d.ts +13 -0
  491. package/dist/routes/preview.js +36 -0
  492. package/dist/routes/scripted/bundle.d.ts +47 -0
  493. package/dist/routes/scripted/bundle.js +195 -0
  494. package/dist/routes/scripted/plan.d.ts +30 -0
  495. package/dist/routes/scripted/plan.js +95 -0
  496. package/dist/routes/scripted/result.d.ts +48 -0
  497. package/dist/routes/scripted/result.js +176 -0
  498. package/dist/routes/scripted/route.d.ts +28 -0
  499. package/dist/routes/scripted/route.js +218 -0
  500. package/dist/routes/scripted/scenario.d.ts +21 -0
  501. package/dist/routes/scripted/scenario.js +102 -0
  502. package/dist/routes/scripted/session-result.d.ts +8 -0
  503. package/dist/routes/scripted/session-result.js +60 -0
  504. package/dist/routes/scripted/setup.d.ts +45 -0
  505. package/dist/routes/scripted/setup.js +126 -0
  506. package/dist/routes/scripted/subject.d.ts +49 -0
  507. package/dist/routes/scripted/subject.js +156 -0
  508. package/dist/routes/scripted/surface-records.d.ts +26 -0
  509. package/dist/routes/scripted/surface-records.js +88 -0
  510. package/dist/routes/scripted/surface-sessions.d.ts +13 -0
  511. package/dist/routes/scripted/surface-sessions.js +40 -0
  512. package/dist/routes/scripted/types.d.ts +88 -0
  513. package/dist/routes/scripted/types.js +3 -0
  514. package/dist/routes/shared-world/bundle.d.ts +20 -0
  515. package/dist/routes/shared-world/bundle.js +446 -0
  516. package/dist/routes/shared-world/checkpoints.d.ts +25 -0
  517. package/dist/routes/shared-world/checkpoints.js +46 -0
  518. package/dist/routes/shared-world/comms.d.ts +68 -0
  519. package/dist/routes/shared-world/comms.js +176 -0
  520. package/dist/routes/shared-world/external-public.d.ts +21 -0
  521. package/dist/routes/shared-world/external-public.js +130 -0
  522. package/dist/routes/shared-world/handoff.d.ts +62 -0
  523. package/dist/routes/shared-world/handoff.js +348 -0
  524. package/dist/routes/shared-world/lobby-code.d.ts +25 -0
  525. package/dist/routes/shared-world/lobby-code.js +152 -0
  526. package/dist/routes/shared-world/plan.d.ts +27 -0
  527. package/dist/routes/shared-world/plan.js +174 -0
  528. package/dist/routes/shared-world/provenance.d.ts +27 -0
  529. package/dist/routes/shared-world/provenance.js +65 -0
  530. package/dist/routes/shared-world/provisioned.d.ts +57 -0
  531. package/dist/routes/shared-world/provisioned.js +505 -0
  532. package/dist/routes/shared-world/result.d.ts +18 -0
  533. package/dist/routes/shared-world/result.js +327 -0
  534. package/dist/routes/shared-world/route.d.ts +21 -0
  535. package/dist/routes/shared-world/route.js +277 -0
  536. package/dist/routes/shared-world/seat-records.d.ts +20 -0
  537. package/dist/routes/shared-world/seat-records.js +213 -0
  538. package/dist/routes/shared-world/seats.d.ts +38 -0
  539. package/dist/routes/shared-world/seats.js +208 -0
  540. package/dist/routes/shared-world/setup.d.ts +48 -0
  541. package/dist/routes/shared-world/setup.js +200 -0
  542. package/dist/routes/shared-world/types.d.ts +354 -0
  543. package/dist/routes/shared-world/types.js +29 -0
  544. package/dist/routes/terminal/adapter.d.ts +37 -0
  545. package/dist/routes/terminal/adapter.js +201 -0
  546. package/dist/routes/terminal/bundle.d.ts +79 -0
  547. package/dist/routes/terminal/bundle.js +305 -0
  548. package/dist/routes/terminal/credentials.d.ts +34 -0
  549. package/dist/routes/terminal/credentials.js +102 -0
  550. package/dist/routes/terminal/dry-run.d.ts +24 -0
  551. package/dist/routes/terminal/dry-run.js +157 -0
  552. package/dist/routes/terminal/encoding.js +79 -0
  553. package/dist/routes/terminal/ledger.d.ts +49 -0
  554. package/dist/routes/terminal/ledger.js +170 -0
  555. package/dist/routes/terminal/lifetime.d.ts +10 -0
  556. package/dist/routes/terminal/lifetime.js +22 -0
  557. package/dist/routes/terminal/live-finish.d.ts +31 -0
  558. package/dist/routes/terminal/live-finish.js +215 -0
  559. package/dist/routes/terminal/live-sandbox.d.ts +69 -0
  560. package/dist/routes/terminal/live-sandbox.js +452 -0
  561. package/dist/routes/terminal/persona.d.ts +20 -0
  562. package/dist/routes/terminal/persona.js +34 -0
  563. package/dist/routes/terminal/plan.d.ts +21 -0
  564. package/dist/routes/terminal/plan.js +115 -0
  565. package/dist/routes/terminal/recorder.d.ts +23 -0
  566. package/dist/routes/terminal/recorder.js +77 -0
  567. package/dist/routes/terminal/result.d.ts +47 -0
  568. package/dist/routes/terminal/result.js +114 -0
  569. package/dist/routes/terminal/route.d.ts +23 -0
  570. package/dist/routes/terminal/route.js +170 -0
  571. package/dist/routes/terminal/runtime-auth.d.ts +12 -0
  572. package/dist/routes/terminal/runtime-auth.js +23 -0
  573. package/dist/routes/terminal/runtime.d.ts +14 -0
  574. package/dist/routes/terminal/runtime.js +47 -0
  575. package/dist/routes/terminal/sandbox.d.ts +35 -0
  576. package/dist/routes/terminal/sandbox.js +126 -0
  577. package/dist/routes/terminal/session.d.ts +25 -0
  578. package/dist/routes/terminal/session.js +199 -0
  579. package/dist/routes/terminal/token-usage.d.ts +15 -0
  580. package/dist/routes/terminal/token-usage.js +93 -0
  581. package/dist/routes/terminal/trace.d.ts +40 -0
  582. package/dist/routes/terminal/trace.js +172 -0
  583. package/dist/routes/terminal/types.d.ts +342 -0
  584. package/dist/routes/terminal/types.js +31 -0
  585. package/dist/run/bundle-shape.d.ts +7 -0
  586. package/dist/run/bundle-shape.js +369 -0
  587. package/dist/run/bundle.d.ts +547 -0
  588. package/dist/run/bundle.js +44 -0
  589. package/dist/run/concurrency.js +24 -0
  590. package/dist/run/contained-output.d.ts +50 -0
  591. package/dist/run/contained-output.js +351 -0
  592. package/dist/run/cost-summary.d.ts +28 -0
  593. package/dist/run/cost-summary.js +213 -0
  594. package/dist/run/costs.js +140 -0
  595. package/dist/run/detail.d.ts +62 -0
  596. package/dist/run/detail.js +139 -0
  597. package/dist/run/dry-run-inputs.d.ts +9 -0
  598. package/dist/run/dry-run-inputs.js +90 -0
  599. package/dist/run/dry-run.d.ts +6 -0
  600. package/dist/run/dry-run.js +362 -0
  601. package/dist/run/feedback-shape.d.ts +7 -0
  602. package/dist/run/feedback-shape.js +89 -0
  603. package/dist/run/git-state.d.ts +35 -0
  604. package/dist/run/git-state.js +316 -0
  605. package/dist/run/git-workspace.d.ts +32 -0
  606. package/dist/run/git-workspace.js +450 -0
  607. package/dist/run/judge.d.ts +210 -0
  608. package/dist/run/judge.js +240 -0
  609. package/dist/run/locate.d.ts +22 -0
  610. package/dist/run/locate.js +122 -0
  611. package/dist/run/outcomes.d.ts +31 -0
  612. package/dist/run/outcomes.js +210 -0
  613. package/dist/run/participant-records.d.ts +28 -0
  614. package/dist/run/participant-records.js +63 -0
  615. package/dist/run/participant.d.ts +29 -0
  616. package/dist/run/participant.js +12 -0
  617. package/dist/run/paths.d.ts +79 -0
  618. package/dist/run/paths.js +356 -0
  619. package/dist/run/preflight-receipts.d.ts +46 -0
  620. package/dist/run/preflight-receipts.js +173 -0
  621. package/dist/run/pricing.d.ts +124 -0
  622. package/dist/run/pricing.js +298 -0
  623. package/dist/run/project.d.ts +8 -0
  624. package/dist/run/project.js +103 -0
  625. package/dist/run/projection.d.ts +184 -0
  626. package/dist/run/projection.js +356 -0
  627. package/dist/run/reclaim.d.ts +41 -0
  628. package/dist/run/reclaim.js +183 -0
  629. package/dist/run/results.d.ts +88 -0
  630. package/dist/run/results.js +3 -0
  631. package/dist/run/run-index.d.ts +107 -0
  632. package/dist/run/run-index.js +243 -0
  633. package/dist/run/run.d.ts +103 -0
  634. package/dist/run/run.js +199 -0
  635. package/dist/run/sandbox-receipts.d.ts +31 -0
  636. package/dist/run/sandbox-receipts.js +49 -0
  637. package/dist/run/shared-world-evidence.d.ts +220 -0
  638. package/dist/run/shared-world-evidence.js +49 -0
  639. package/dist/run/shared-world-shape.d.ts +26 -0
  640. package/dist/run/shared-world-shape.js +181 -0
  641. package/dist/run/stats.d.ts +82 -0
  642. package/dist/run/stats.js +258 -0
  643. package/dist/run/status.d.ts +111 -0
  644. package/dist/run/status.js +176 -0
  645. package/dist/run/stored-runs.d.ts +38 -0
  646. package/dist/run/stored-runs.js +273 -0
  647. package/dist/run/stream-shape.d.ts +4 -0
  648. package/dist/run/stream-shape.js +160 -0
  649. package/dist/run/streams.d.ts +257 -0
  650. package/dist/run/streams.js +12 -0
  651. package/dist/run/study-files.d.ts +35 -0
  652. package/dist/run/study-files.js +164 -0
  653. package/dist/run/terminal-contract.d.ts +25 -0
  654. package/dist/run/terminal-contract.js +47 -0
  655. package/dist/run/text.d.ts +2 -0
  656. package/dist/run/text.js +4 -0
  657. package/dist/run/transient-comms-secrets.js +72 -0
  658. package/dist/run/type-guards.d.ts +6 -0
  659. package/dist/run/type-guards.js +18 -0
  660. package/dist/run-lab.d.ts +110 -0
  661. package/dist/run-lab.js +148 -0
  662. package/dist/subject/clone.d.ts +37 -0
  663. package/dist/subject/clone.js +62 -0
  664. package/dist/subject/desktop-cli.d.ts +17 -0
  665. package/dist/subject/desktop-cli.js +51 -0
  666. package/dist/subject/local-tree-archive.d.ts +82 -0
  667. package/dist/subject/local-tree-archive.js +431 -0
  668. package/dist/subject/local-tree.d.ts +28 -0
  669. package/dist/subject/local-tree.js +58 -0
  670. package/dist/subject/node-bootstrap.d.ts +12 -0
  671. package/dist/subject/node-bootstrap.js +66 -0
  672. package/dist/subject/runtime.d.ts +13 -0
  673. package/dist/subject/runtime.js +50 -0
  674. package/dist/subject/serve.d.ts +39 -0
  675. package/dist/subject/serve.js +249 -0
  676. package/dist/subject/state.d.ts +23 -0
  677. package/dist/subject/state.js +58 -0
  678. package/dist/subject/steps.d.ts +37 -0
  679. package/dist/subject/steps.js +39 -0
  680. package/dist/substrates/command-failure.d.ts +23 -0
  681. package/dist/substrates/command-failure.js +45 -0
  682. package/dist/substrates/desktop-session.d.ts +41 -0
  683. package/dist/substrates/desktop-session.js +59 -0
  684. package/dist/substrates/detached.d.ts +55 -0
  685. package/dist/substrates/detached.js +139 -0
  686. package/dist/substrates/e2b/cdp-probe.d.ts +99 -0
  687. package/dist/substrates/e2b/cdp-probe.js +556 -0
  688. package/dist/substrates/e2b/desktop-browser.d.ts +81 -0
  689. package/dist/substrates/e2b/desktop-browser.js +410 -0
  690. package/dist/substrates/e2b/desktop-cdp.d.ts +77 -0
  691. package/dist/substrates/e2b/desktop-cdp.js +211 -0
  692. package/dist/substrates/e2b/desktop-executor.d.ts +92 -0
  693. package/dist/substrates/e2b/desktop-executor.js +302 -0
  694. package/dist/substrates/e2b/desktop-geometry.d.ts +83 -0
  695. package/dist/substrates/e2b/desktop-geometry.js +331 -0
  696. package/dist/substrates/e2b/desktop-media.d.ts +29 -0
  697. package/dist/substrates/e2b/desktop-media.js +151 -0
  698. package/dist/substrates/e2b/desktop-recording.d.ts +18 -0
  699. package/dist/substrates/e2b/desktop-recording.js +238 -0
  700. package/dist/substrates/e2b/desktop-resources.d.ts +11 -0
  701. package/dist/substrates/e2b/desktop-resources.js +35 -0
  702. package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +15 -0
  703. package/dist/substrates/e2b/desktop-screenshot-cleanup.js +66 -0
  704. package/dist/substrates/e2b/lifetime.d.ts +12 -0
  705. package/dist/substrates/e2b/lifetime.js +18 -0
  706. package/dist/substrates/e2b/sandbox.d.ts +102 -0
  707. package/dist/substrates/e2b/sandbox.js +202 -0
  708. package/dist/substrates/e2b/sdk.d.ts +194 -0
  709. package/dist/substrates/e2b/sdk.js +168 -0
  710. package/dist/substrates/e2b/shell.d.ts +10 -0
  711. package/dist/substrates/e2b/shell.js +61 -0
  712. package/dist/substrates/local/captured-inbox.d.ts +6 -0
  713. package/dist/substrates/local/captured-inbox.js +87 -0
  714. package/dist/substrates/local/firecracker-desktop.d.ts +25 -0
  715. package/dist/substrates/local/firecracker-desktop.js +315 -0
  716. package/dist/substrates/local/runtime-config.d.ts +6 -0
  717. package/dist/substrates/local/runtime-config.js +91 -0
  718. package/dist/substrates/local/runtime-host.d.ts +30 -0
  719. package/dist/substrates/local/runtime-host.js +143 -0
  720. package/dist/substrates/local/runtime-release.d.ts +5 -0
  721. package/dist/substrates/local/runtime-release.js +32 -0
  722. package/dist/substrates/local/runtime-ssh.d.ts +9 -0
  723. package/dist/substrates/local/runtime-ssh.js +129 -0
  724. package/dist/substrates/local/runtime.d.ts +25 -0
  725. package/dist/substrates/local/runtime.js +190 -0
  726. package/dist/substrates/shell.d.ts +44 -0
  727. package/dist/substrates/shell.js +22 -0
  728. package/dist/tui/actions.d.ts +39 -0
  729. package/dist/tui/actions.js +203 -0
  730. package/dist/tui/contract.d.ts +144 -0
  731. package/dist/tui/contract.js +52 -0
  732. package/dist/tui/launch.js +172 -0
  733. package/dist/tui/project.d.ts +10 -0
  734. package/dist/tui/project.js +17 -0
  735. package/dist/tui-app.js +125 -125
  736. package/dist/verify/actor.d.ts +27 -0
  737. package/dist/verify/actor.js +292 -0
  738. package/dist/verify/artifacts.d.ts +47 -0
  739. package/dist/verify/artifacts.js +373 -0
  740. package/dist/verify/costs.d.ts +30 -0
  741. package/dist/verify/costs.js +129 -0
  742. package/dist/verify/liveness.d.ts +7 -0
  743. package/dist/verify/liveness.js +72 -0
  744. package/dist/verify/rerun.d.ts +3 -0
  745. package/dist/verify/rerun.js +46 -0
  746. package/dist/verify/shared-world-concurrent.d.ts +11 -0
  747. package/dist/verify/shared-world-concurrent.js +346 -0
  748. package/dist/verify/shared-world.d.ts +8 -0
  749. package/dist/verify/shared-world.js +295 -0
  750. package/dist/verify/subject.d.ts +17 -0
  751. package/dist/verify/subject.js +123 -0
  752. package/dist/verify/verify.d.ts +34 -0
  753. package/dist/verify/verify.js +333 -0
  754. package/docs/README.md +67 -0
  755. package/docs/architecture/actor-contract.md +215 -174
  756. package/docs/architecture/browser-control.md +51 -37
  757. package/docs/architecture/comms-inbox.md +8 -8
  758. package/docs/architecture/desktop-recording.md +2 -2
  759. package/docs/architecture/desktop-sessions.md +33 -21
  760. package/docs/architecture/external-public-shared-world.md +80 -64
  761. package/docs/architecture/github-feedback-loop.md +40 -27
  762. package/docs/architecture/guest-desktop.md +22 -10
  763. package/docs/architecture/local-browser-runtime.md +30 -21
  764. package/docs/architecture/observer-review.md +9 -9
  765. package/docs/architecture/observer.md +53 -57
  766. package/docs/architecture/participant-media.md +3 -3
  767. package/docs/architecture/project-layout.md +33 -137
  768. package/docs/architecture/real-email-receiving.md +7 -6
  769. package/docs/architecture/restricted-codex-analysis.md +211 -25
  770. package/docs/architecture/serve.md +89 -87
  771. package/docs/architecture/state-driven-executor.md +79 -64
  772. package/docs/architecture/task-protocol-support.md +18 -18
  773. package/docs/architecture/terminal-product-lane.md +92 -86
  774. package/docs/contracts/adapter-admission.md +8 -4
  775. package/docs/contracts/adapter-fixtures.md +6 -6
  776. package/docs/contracts/core.md +22 -24
  777. package/docs/contracts/feedback.md +33 -23
  778. package/docs/contracts/policy.md +28 -31
  779. package/docs/contracts/run-bundle.md +168 -82
  780. package/docs/contracts/schemas.md +563 -379
  781. package/docs/contracts/study-analysis.md +2 -2
  782. package/docs/contracts/study-costs.md +12 -12
  783. package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +36 -0
  784. package/docs/decisions/0002-observer-is-one-self-contained-file.md +30 -0
  785. package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +35 -0
  786. package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +31 -0
  787. package/docs/decisions/README.md +16 -0
  788. package/docs/goals/current.md +22 -50
  789. package/docs/principles/actor-fidelity.md +37 -40
  790. package/docs/principles/engineering.md +81 -0
  791. package/docs/principles/invariants-and-defaults.md +48 -45
  792. package/docs/principles/self-driving-harness.md +11 -10
  793. package/docs/principles/three-roles.md +12 -13
  794. package/docs/product/automatic-analysis.md +39 -9
  795. package/docs/product/lobby-trivia-3player-external-public.md +14 -13
  796. package/docs/product/open-source-install-experience.md +34 -38
  797. package/docs/ramp/README.md +91 -218
  798. package/docs/release/open-source-readiness.md +5 -2
  799. package/docs/release/public-readiness-standard.md +1 -1
  800. package/examples/README.md +11 -0
  801. package/examples/participant/README.md +80 -0
  802. package/examples/participant/app.mjs +55 -0
  803. package/examples/participant/run.mjs +116 -0
  804. package/examples/scorer/README.md +29 -0
  805. package/examples/scorer/run.mjs +63 -0
  806. package/examples/scorer/scorer.mjs +20 -0
  807. package/package.json +61 -57
  808. package/skills/humanish/SKILL.md +72 -60
  809. package/skills/humanish/agents/openai.yaml +2 -2
  810. package/dist/actor-contract.d.ts +0 -296
  811. package/dist/actor-contract.js +0 -340
  812. package/dist/actor-contract.js.map +0 -1
  813. package/dist/actor-goal-source.js +0 -32
  814. package/dist/actor-goal-source.js.map +0 -1
  815. package/dist/actor-registry.d.ts +0 -77
  816. package/dist/actor-registry.js +0 -106
  817. package/dist/actor-registry.js.map +0 -1
  818. package/dist/actor-stop-cause.d.ts +0 -9
  819. package/dist/actor-stop-cause.js +0 -42
  820. package/dist/actor-stop-cause.js.map +0 -1
  821. package/dist/adapter-extension.d.ts +0 -76
  822. package/dist/adapter-extension.js +0 -273
  823. package/dist/adapter-extension.js.map +0 -1
  824. package/dist/adapter-scorer-loader.d.ts +0 -42
  825. package/dist/adapter-scorer-loader.js +0 -129
  826. package/dist/adapter-scorer-loader.js.map +0 -1
  827. package/dist/affordance.d.ts +0 -53
  828. package/dist/affordance.js +0 -145
  829. package/dist/affordance.js.map +0 -1
  830. package/dist/agent-session.js +0 -43
  831. package/dist/agent-session.js.map +0 -1
  832. package/dist/argv.d.ts +0 -1
  833. package/dist/argv.js +0 -8
  834. package/dist/argv.js.map +0 -1
  835. package/dist/artifact-reference.d.ts +0 -22
  836. package/dist/artifact-reference.js +0 -47
  837. package/dist/artifact-reference.js.map +0 -1
  838. package/dist/automatic-analysis-completion.d.ts +0 -25
  839. package/dist/automatic-analysis-completion.js +0 -56
  840. package/dist/automatic-analysis-completion.js.map +0 -1
  841. package/dist/automatic-analysis-config.d.ts +0 -38
  842. package/dist/automatic-analysis-config.js +0 -68
  843. package/dist/automatic-analysis-config.js.map +0 -1
  844. package/dist/automatic-study-analysis.d.ts +0 -17
  845. package/dist/automatic-study-analysis.js +0 -195
  846. package/dist/automatic-study-analysis.js.map +0 -1
  847. package/dist/browser-control-client.d.ts +0 -18
  848. package/dist/browser-control-client.js +0 -176
  849. package/dist/browser-control-client.js.map +0 -1
  850. package/dist/browser-control-dispatcher.d.ts +0 -19
  851. package/dist/browser-control-dispatcher.js +0 -147
  852. package/dist/browser-control-dispatcher.js.map +0 -1
  853. package/dist/browser-control-protocol.d.ts +0 -472
  854. package/dist/browser-control-protocol.js +0 -185
  855. package/dist/browser-control-protocol.js.map +0 -1
  856. package/dist/browser-control-recording-transfer.d.ts +0 -4
  857. package/dist/browser-control-recording-transfer.js +0 -42
  858. package/dist/browser-control-recording-transfer.js.map +0 -1
  859. package/dist/browser-control-transport.d.ts +0 -27
  860. package/dist/browser-control-transport.js +0 -177
  861. package/dist/browser-control-transport.js.map +0 -1
  862. package/dist/browser-evidence-hygiene.js +0 -43
  863. package/dist/browser-evidence-hygiene.js.map +0 -1
  864. package/dist/chrome-cdp-probe.d.ts +0 -97
  865. package/dist/chrome-cdp-probe.js +0 -536
  866. package/dist/chrome-cdp-probe.js.map +0 -1
  867. package/dist/claude-agent-sdk.d.ts +0 -94
  868. package/dist/claude-agent-sdk.js +0 -367
  869. package/dist/claude-agent-sdk.js.map +0 -1
  870. package/dist/cli.js.map +0 -1
  871. package/dist/codex-app-server-ui.d.ts +0 -39
  872. package/dist/codex-app-server-ui.js +0 -357
  873. package/dist/codex-app-server-ui.js.map +0 -1
  874. package/dist/codex-app-server.d.ts +0 -144
  875. package/dist/codex-app-server.js +0 -754
  876. package/dist/codex-app-server.js.map +0 -1
  877. package/dist/command-failure.d.ts +0 -43
  878. package/dist/command-failure.js +0 -73
  879. package/dist/command-failure.js.map +0 -1
  880. package/dist/comms-agentmail.d.ts +0 -25
  881. package/dist/comms-agentmail.js +0 -418
  882. package/dist/comms-agentmail.js.map +0 -1
  883. package/dist/comms-catch-host.d.ts +0 -52
  884. package/dist/comms-catch-host.js +0 -178
  885. package/dist/comms-catch-host.js.map +0 -1
  886. package/dist/comms-connections.d.ts +0 -52
  887. package/dist/comms-connections.js +0 -123
  888. package/dist/comms-connections.js.map +0 -1
  889. package/dist/comms-email-catch.d.ts +0 -54
  890. package/dist/comms-email-catch.js +0 -212
  891. package/dist/comms-email-catch.js.map +0 -1
  892. package/dist/comms-evidence.d.ts +0 -27
  893. package/dist/comms-evidence.js +0 -31
  894. package/dist/comms-evidence.js.map +0 -1
  895. package/dist/comms-fake-inbox.d.ts +0 -45
  896. package/dist/comms-fake-inbox.js +0 -184
  897. package/dist/comms-fake-inbox.js.map +0 -1
  898. package/dist/comms-images.d.ts +0 -7
  899. package/dist/comms-images.js +0 -39
  900. package/dist/comms-images.js.map +0 -1
  901. package/dist/comms-inbox.d.ts +0 -66
  902. package/dist/comms-inbox.js +0 -389
  903. package/dist/comms-inbox.js.map +0 -1
  904. package/dist/comms-lease-store.d.ts +0 -91
  905. package/dist/comms-lease-store.js +0 -495
  906. package/dist/comms-lease-store.js.map +0 -1
  907. package/dist/comms-receiving-evidence.d.ts +0 -46
  908. package/dist/comms-receiving-evidence.js +0 -35
  909. package/dist/comms-receiving-evidence.js.map +0 -1
  910. package/dist/comms-receiving-inbox.d.ts +0 -16
  911. package/dist/comms-receiving-inbox.js +0 -410
  912. package/dist/comms-receiving-inbox.js.map +0 -1
  913. package/dist/comms-receiving-runtime.d.ts +0 -25
  914. package/dist/comms-receiving-runtime.js +0 -45
  915. package/dist/comms-receiving-runtime.js.map +0 -1
  916. package/dist/comms-receiving-types.d.ts +0 -98
  917. package/dist/comms-receiving-types.js +0 -2
  918. package/dist/comms-receiving-types.js.map +0 -1
  919. package/dist/comms-receiving.d.ts +0 -58
  920. package/dist/comms-receiving.js +0 -554
  921. package/dist/comms-receiving.js.map +0 -1
  922. package/dist/comms-sandbox-catch.d.ts +0 -229
  923. package/dist/comms-sandbox-catch.js +0 -737
  924. package/dist/comms-sandbox-catch.js.map +0 -1
  925. package/dist/comms-setup.d.ts +0 -40
  926. package/dist/comms-setup.js +0 -121
  927. package/dist/comms-setup.js.map +0 -1
  928. package/dist/comms-types.d.ts +0 -72
  929. package/dist/comms-types.js +0 -10
  930. package/dist/comms-types.js.map +0 -1
  931. package/dist/computer-use-actor.d.ts +0 -76
  932. package/dist/computer-use-actor.js +0 -68
  933. package/dist/computer-use-actor.js.map +0 -1
  934. package/dist/computer-use.d.ts +0 -429
  935. package/dist/computer-use.js +0 -1751
  936. package/dist/computer-use.js.map +0 -1
  937. package/dist/concurrency.js +0 -27
  938. package/dist/concurrency.js.map +0 -1
  939. package/dist/concurrent-shared-world-lab.d.ts +0 -186
  940. package/dist/concurrent-shared-world-lab.js +0 -2181
  941. package/dist/concurrent-shared-world-lab.js.map +0 -1
  942. package/dist/core/git-state.d.ts +0 -33
  943. package/dist/core/git-state.js +0 -277
  944. package/dist/core/git-state.js.map +0 -1
  945. package/dist/core/git-workspace.d.ts +0 -31
  946. package/dist/core/git-workspace.js +0 -447
  947. package/dist/core/git-workspace.js.map +0 -1
  948. package/dist/core/index.d.ts +0 -4
  949. package/dist/core/index.js +0 -3
  950. package/dist/core/index.js.map +0 -1
  951. package/dist/core/run-primitives.d.ts +0 -66
  952. package/dist/core/run-primitives.js +0 -120
  953. package/dist/core/run-primitives.js.map +0 -1
  954. package/dist/cua-actor-lab.d.ts +0 -855
  955. package/dist/cua-actor-lab.js +0 -3543
  956. package/dist/cua-actor-lab.js.map +0 -1
  957. package/dist/cua-admission-limit.d.ts +0 -12
  958. package/dist/cua-admission-limit.js +0 -20
  959. package/dist/cua-admission-limit.js.map +0 -1
  960. package/dist/cua-desktop-lane.d.ts +0 -35
  961. package/dist/cua-desktop-lane.js +0 -13
  962. package/dist/cua-desktop-lane.js.map +0 -1
  963. package/dist/cua-diagnostics.d.ts +0 -38
  964. package/dist/cua-diagnostics.js +0 -68
  965. package/dist/cua-diagnostics.js.map +0 -1
  966. package/dist/cua-executor-error.js +0 -48
  967. package/dist/cua-executor-error.js.map +0 -1
  968. package/dist/cua-provider-error.d.ts +0 -16
  969. package/dist/cua-provider-error.js +0 -35
  970. package/dist/cua-provider-error.js.map +0 -1
  971. package/dist/cua-speech.js +0 -2
  972. package/dist/cua-speech.js.map +0 -1
  973. package/dist/desktop-recorder.d.ts +0 -39
  974. package/dist/desktop-recorder.js +0 -226
  975. package/dist/desktop-recorder.js.map +0 -1
  976. package/dist/desktop-recording-artifact.d.ts +0 -5
  977. package/dist/desktop-recording-artifact.js +0 -54
  978. package/dist/desktop-recording-artifact.js.map +0 -1
  979. package/dist/desktop-recording-types.d.ts +0 -24
  980. package/dist/desktop-recording-types.js +0 -14
  981. package/dist/desktop-recording-types.js.map +0 -1
  982. package/dist/desktop-session.d.ts +0 -41
  983. package/dist/desktop-session.js +0 -47
  984. package/dist/desktop-session.js.map +0 -1
  985. package/dist/device-presets.d.ts +0 -67
  986. package/dist/device-presets.js +0 -55
  987. package/dist/device-presets.js.map +0 -1
  988. package/dist/doctor-lab.d.ts +0 -38
  989. package/dist/doctor-lab.js +0 -126
  990. package/dist/doctor-lab.js.map +0 -1
  991. package/dist/e2b-cua-desktop.d.ts +0 -3
  992. package/dist/e2b-cua-desktop.js +0 -708
  993. package/dist/e2b-cua-desktop.js.map +0 -1
  994. package/dist/e2b-cua-provisioning.d.ts +0 -314
  995. package/dist/e2b-cua-provisioning.js +0 -1219
  996. package/dist/e2b-cua-provisioning.js.map +0 -1
  997. package/dist/e2b-desktop-executor.d.ts +0 -101
  998. package/dist/e2b-desktop-executor.js +0 -297
  999. package/dist/e2b-desktop-executor.js.map +0 -1
  1000. package/dist/e2b-desktop-launch.d.ts +0 -243
  1001. package/dist/e2b-desktop-launch.js +0 -234
  1002. package/dist/e2b-desktop-launch.js.map +0 -1
  1003. package/dist/e2b-desktop-media.d.ts +0 -14
  1004. package/dist/e2b-desktop-media.js +0 -58
  1005. package/dist/e2b-desktop-media.js.map +0 -1
  1006. package/dist/e2b-desktop-recording.d.ts +0 -16
  1007. package/dist/e2b-desktop-recording.js +0 -162
  1008. package/dist/e2b-desktop-recording.js.map +0 -1
  1009. package/dist/e2b-desktop-resources.d.ts +0 -11
  1010. package/dist/e2b-desktop-resources.js +0 -33
  1011. package/dist/e2b-desktop-resources.js.map +0 -1
  1012. package/dist/e2b-desktop-screenshot-cleanup.d.ts +0 -15
  1013. package/dist/e2b-desktop-screenshot-cleanup.js +0 -67
  1014. package/dist/e2b-desktop-screenshot-cleanup.js.map +0 -1
  1015. package/dist/e2b-desktop-session.d.ts +0 -7
  1016. package/dist/e2b-desktop-session.js +0 -29
  1017. package/dist/e2b-desktop-session.js.map +0 -1
  1018. package/dist/e2b-detached.d.ts +0 -53
  1019. package/dist/e2b-detached.js +0 -130
  1020. package/dist/e2b-detached.js.map +0 -1
  1021. package/dist/e2b-terminal-lab.d.ts +0 -383
  1022. package/dist/e2b-terminal-lab.js +0 -2000
  1023. package/dist/e2b-terminal-lab.js.map +0 -1
  1024. package/dist/env-file.d.ts +0 -14
  1025. package/dist/env-file.js +0 -108
  1026. package/dist/env-file.js.map +0 -1
  1027. package/dist/export-bundle.d.ts +0 -7
  1028. package/dist/export-bundle.js +0 -441
  1029. package/dist/export-bundle.js.map +0 -1
  1030. package/dist/export.d.ts +0 -49
  1031. package/dist/export.js +0 -308
  1032. package/dist/export.js.map +0 -1
  1033. package/dist/feedback-proof.d.ts +0 -8
  1034. package/dist/feedback-proof.js +0 -44
  1035. package/dist/feedback-proof.js.map +0 -1
  1036. package/dist/feedback.d.ts +0 -76
  1037. package/dist/feedback.js +0 -496
  1038. package/dist/feedback.js.map +0 -1
  1039. package/dist/first-run-path.d.ts +0 -55
  1040. package/dist/first-run-path.js +0 -136
  1041. package/dist/first-run-path.js.map +0 -1
  1042. package/dist/frame-signature.d.ts +0 -24
  1043. package/dist/frame-signature.js +0 -128
  1044. package/dist/frame-signature.js.map +0 -1
  1045. package/dist/guest-bootstrap.d.ts +0 -55
  1046. package/dist/guest-bootstrap.js +0 -285
  1047. package/dist/guest-bootstrap.js.map +0 -1
  1048. package/dist/guest-browser-tools.d.ts +0 -8
  1049. package/dist/guest-browser-tools.js +0 -66
  1050. package/dist/guest-browser-tools.js.map +0 -1
  1051. package/dist/guest-chromium-text.d.ts +0 -27
  1052. package/dist/guest-chromium-text.js +0 -281
  1053. package/dist/guest-chromium-text.js.map +0 -1
  1054. package/dist/guest-desktop-executor.d.ts +0 -22
  1055. package/dist/guest-desktop-executor.js +0 -178
  1056. package/dist/guest-desktop-executor.js.map +0 -1
  1057. package/dist/guest-desktop-media.d.ts +0 -33
  1058. package/dist/guest-desktop-media.js +0 -281
  1059. package/dist/guest-desktop-media.js.map +0 -1
  1060. package/dist/guest-desktop-native.d.ts +0 -14
  1061. package/dist/guest-desktop-native.js +0 -131
  1062. package/dist/guest-desktop-native.js.map +0 -1
  1063. package/dist/guest-media-config.d.ts +0 -15
  1064. package/dist/guest-media-config.js +0 -8
  1065. package/dist/guest-media-config.js.map +0 -1
  1066. package/dist/guest-media-worker.js.map +0 -1
  1067. package/dist/guest-runtime-desktop.d.ts +0 -42
  1068. package/dist/guest-runtime-desktop.js +0 -314
  1069. package/dist/guest-runtime-desktop.js.map +0 -1
  1070. package/dist/guest-runtime-main.js.map +0 -1
  1071. package/dist/guest-runtime-revision.js.map +0 -1
  1072. package/dist/guest-runtime.d.ts +0 -31
  1073. package/dist/guest-runtime.js +0 -99
  1074. package/dist/guest-runtime.js.map +0 -1
  1075. package/dist/image-evidence.d.ts +0 -2
  1076. package/dist/image-evidence.js +0 -47
  1077. package/dist/image-evidence.js.map +0 -1
  1078. package/dist/index.js.map +0 -1
  1079. package/dist/init-templates.d.ts +0 -25
  1080. package/dist/init-templates.js +0 -541
  1081. package/dist/init-templates.js.map +0 -1
  1082. package/dist/init.d.ts +0 -38
  1083. package/dist/init.js +0 -532
  1084. package/dist/init.js.map +0 -1
  1085. package/dist/key-resolution.d.ts +0 -67
  1086. package/dist/key-resolution.js +0 -375
  1087. package/dist/key-resolution.js.map +0 -1
  1088. package/dist/lab-app-runner.d.ts +0 -78
  1089. package/dist/lab-app-runner.js +0 -403
  1090. package/dist/lab-app-runner.js.map +0 -1
  1091. package/dist/lab-config.d.ts +0 -968
  1092. package/dist/lab-config.js +0 -2714
  1093. package/dist/lab-config.js.map +0 -1
  1094. package/dist/lab-engine.d.ts +0 -97
  1095. package/dist/lab-engine.js +0 -285
  1096. package/dist/lab-engine.js.map +0 -1
  1097. package/dist/lab-preflight.d.ts +0 -70
  1098. package/dist/lab-preflight.js +0 -388
  1099. package/dist/lab-preflight.js.map +0 -1
  1100. package/dist/lab-summary.d.ts +0 -57
  1101. package/dist/lab-summary.js +0 -126
  1102. package/dist/lab-summary.js.map +0 -1
  1103. package/dist/labs.d.ts +0 -66
  1104. package/dist/labs.js +0 -401
  1105. package/dist/labs.js.map +0 -1
  1106. package/dist/listen.js +0 -84
  1107. package/dist/listen.js.map +0 -1
  1108. package/dist/local-agent-claude-session.d.ts +0 -45
  1109. package/dist/local-agent-claude-session.js +0 -203
  1110. package/dist/local-agent-claude-session.js.map +0 -1
  1111. package/dist/local-agent-cli.d.ts +0 -121
  1112. package/dist/local-agent-cli.js +0 -427
  1113. package/dist/local-agent-cli.js.map +0 -1
  1114. package/dist/local-captured-inbox.d.ts +0 -6
  1115. package/dist/local-captured-inbox.js +0 -65
  1116. package/dist/local-captured-inbox.js.map +0 -1
  1117. package/dist/local-firecracker-desktop.d.ts +0 -23
  1118. package/dist/local-firecracker-desktop.js +0 -191
  1119. package/dist/local-firecracker-desktop.js.map +0 -1
  1120. package/dist/local-firecracker-study.d.ts +0 -9
  1121. package/dist/local-firecracker-study.js +0 -135
  1122. package/dist/local-firecracker-study.js.map +0 -1
  1123. package/dist/local-runtime-config.d.ts +0 -6
  1124. package/dist/local-runtime-config.js +0 -60
  1125. package/dist/local-runtime-config.js.map +0 -1
  1126. package/dist/local-runtime-host.d.ts +0 -31
  1127. package/dist/local-runtime-host.js +0 -128
  1128. package/dist/local-runtime-host.js.map +0 -1
  1129. package/dist/local-runtime-release.d.ts +0 -7
  1130. package/dist/local-runtime-release.js +0 -33
  1131. package/dist/local-runtime-release.js.map +0 -1
  1132. package/dist/local-runtime-ssh.d.ts +0 -27
  1133. package/dist/local-runtime-ssh.js +0 -91
  1134. package/dist/local-runtime-ssh.js.map +0 -1
  1135. package/dist/local-runtime.d.ts +0 -25
  1136. package/dist/local-runtime.js +0 -133
  1137. package/dist/local-runtime.js.map +0 -1
  1138. package/dist/observer-data.d.ts +0 -114
  1139. package/dist/observer-data.js +0 -224
  1140. package/dist/observer-data.js.map +0 -1
  1141. package/dist/observer-library.js +0 -191
  1142. package/dist/observer-library.js.map +0 -1
  1143. package/dist/observer-serve.d.ts +0 -99
  1144. package/dist/observer-serve.js +0 -284
  1145. package/dist/observer-serve.js.map +0 -1
  1146. package/dist/observer-static.js +0 -357
  1147. package/dist/observer-static.js.map +0 -1
  1148. package/dist/observer.d.ts +0 -118
  1149. package/dist/observer.js +0 -947
  1150. package/dist/observer.js.map +0 -1
  1151. package/dist/openai-responses-cu.d.ts +0 -158
  1152. package/dist/openai-responses-cu.js +0 -714
  1153. package/dist/openai-responses-cu.js.map +0 -1
  1154. package/dist/orientation.d.ts +0 -29
  1155. package/dist/orientation.js +0 -95
  1156. package/dist/orientation.js.map +0 -1
  1157. package/dist/oss-lab.d.ts +0 -55
  1158. package/dist/oss-lab.js +0 -344
  1159. package/dist/oss-lab.js.map +0 -1
  1160. package/dist/oss-meta-lab-scoring.d.ts +0 -15
  1161. package/dist/oss-meta-lab-scoring.js +0 -145
  1162. package/dist/oss-meta-lab-scoring.js.map +0 -1
  1163. package/dist/oss-meta-lab.d.ts +0 -287
  1164. package/dist/oss-meta-lab.js +0 -4551
  1165. package/dist/oss-meta-lab.js.map +0 -1
  1166. package/dist/oss-remote-telemetry.d.ts +0 -77
  1167. package/dist/oss-remote-telemetry.js +0 -403
  1168. package/dist/oss-remote-telemetry.js.map +0 -1
  1169. package/dist/output-token-limit.js +0 -5
  1170. package/dist/output-token-limit.js.map +0 -1
  1171. package/dist/participant-assignment.d.ts +0 -12
  1172. package/dist/participant-assignment.js +0 -15
  1173. package/dist/participant-assignment.js.map +0 -1
  1174. package/dist/persona-resolve.d.ts +0 -44
  1175. package/dist/persona-resolve.js +0 -99
  1176. package/dist/persona-resolve.js.map +0 -1
  1177. package/dist/persona.d.ts +0 -39
  1178. package/dist/persona.js +0 -144
  1179. package/dist/persona.js.map +0 -1
  1180. package/dist/pi-agent-core.d.ts +0 -77
  1181. package/dist/pi-agent-core.js +0 -207
  1182. package/dist/pi-agent-core.js.map +0 -1
  1183. package/dist/pricing.d.ts +0 -145
  1184. package/dist/pricing.js +0 -277
  1185. package/dist/pricing.js.map +0 -1
  1186. package/dist/program.d.ts +0 -96
  1187. package/dist/program.js +0 -4030
  1188. package/dist/program.js.map +0 -1
  1189. package/dist/reasoning-effort.js +0 -26
  1190. package/dist/reasoning-effort.js.map +0 -1
  1191. package/dist/reclaim.d.ts +0 -31
  1192. package/dist/reclaim.js +0 -90
  1193. package/dist/reclaim.js.map +0 -1
  1194. package/dist/redaction.d.ts +0 -90
  1195. package/dist/redaction.js +0 -294
  1196. package/dist/redaction.js.map +0 -1
  1197. package/dist/restricted-codex-analysis.d.ts +0 -15
  1198. package/dist/restricted-codex-analysis.js +0 -13
  1199. package/dist/restricted-codex-analysis.js.map +0 -1
  1200. package/dist/restricted-codex-participant-policy.d.ts +0 -44
  1201. package/dist/restricted-codex-participant-policy.js +0 -43
  1202. package/dist/restricted-codex-participant-policy.js.map +0 -1
  1203. package/dist/restricted-codex-participant-run.d.ts +0 -20
  1204. package/dist/restricted-codex-participant-run.js +0 -79
  1205. package/dist/restricted-codex-participant-run.js.map +0 -1
  1206. package/dist/restricted-codex-participant.d.ts +0 -20
  1207. package/dist/restricted-codex-participant.js +0 -250
  1208. package/dist/restricted-codex-participant.js.map +0 -1
  1209. package/dist/restricted-codex-policy.d.ts +0 -64
  1210. package/dist/restricted-codex-policy.js +0 -176
  1211. package/dist/restricted-codex-policy.js.map +0 -1
  1212. package/dist/restricted-codex-session.d.ts +0 -44
  1213. package/dist/restricted-codex-session.js +0 -657
  1214. package/dist/restricted-codex-session.js.map +0 -1
  1215. package/dist/restricted-codex-transport.d.ts +0 -69
  1216. package/dist/restricted-codex-transport.js +0 -296
  1217. package/dist/restricted-codex-transport.js.map +0 -1
  1218. package/dist/run-detail.d.ts +0 -61
  1219. package/dist/run-detail.js +0 -137
  1220. package/dist/run-detail.js.map +0 -1
  1221. package/dist/run-index.d.ts +0 -71
  1222. package/dist/run-index.js +0 -206
  1223. package/dist/run-index.js.map +0 -1
  1224. package/dist/run-narration-secrets.js +0 -68
  1225. package/dist/run-narration-secrets.js.map +0 -1
  1226. package/dist/run-paths.d.ts +0 -56
  1227. package/dist/run-paths.js +0 -355
  1228. package/dist/run-paths.js.map +0 -1
  1229. package/dist/run-projection.d.ts +0 -186
  1230. package/dist/run-projection.js +0 -350
  1231. package/dist/run-projection.js.map +0 -1
  1232. package/dist/run-status.d.ts +0 -139
  1233. package/dist/run-status.js +0 -218
  1234. package/dist/run-status.js.map +0 -1
  1235. package/dist/run.d.ts +0 -1255
  1236. package/dist/run.js +0 -5949
  1237. package/dist/run.js.map +0 -1
  1238. package/dist/sandbox-receipts.d.ts +0 -19
  1239. package/dist/sandbox-receipts.js +0 -51
  1240. package/dist/sandbox-receipts.js.map +0 -1
  1241. package/dist/screenshot-image.d.ts +0 -11
  1242. package/dist/screenshot-image.js +0 -26
  1243. package/dist/screenshot-image.js.map +0 -1
  1244. package/dist/scripted-browser-actor.d.ts +0 -297
  1245. package/dist/scripted-browser-actor.js +0 -1399
  1246. package/dist/scripted-browser-actor.js.map +0 -1
  1247. package/dist/scripted-browser-lab.d.ts +0 -121
  1248. package/dist/scripted-browser-lab.js +0 -852
  1249. package/dist/scripted-browser-lab.js.map +0 -1
  1250. package/dist/secret-prompt.js +0 -36
  1251. package/dist/secret-prompt.js.map +0 -1
  1252. package/dist/selected-output-paths.d.ts +0 -52
  1253. package/dist/selected-output-paths.js +0 -366
  1254. package/dist/selected-output-paths.js.map +0 -1
  1255. package/dist/serve-exposure.d.ts +0 -62
  1256. package/dist/serve-exposure.js +0 -129
  1257. package/dist/serve-exposure.js.map +0 -1
  1258. package/dist/serve-http.js +0 -45
  1259. package/dist/serve-http.js.map +0 -1
  1260. package/dist/serve-tunnel.js +0 -113
  1261. package/dist/serve-tunnel.js.map +0 -1
  1262. package/dist/shared-world-lab.d.ts +0 -269
  1263. package/dist/shared-world-lab.js +0 -1424
  1264. package/dist/shared-world-lab.js.map +0 -1
  1265. package/dist/source-archive.d.ts +0 -82
  1266. package/dist/source-archive.js +0 -408
  1267. package/dist/source-archive.js.map +0 -1
  1268. package/dist/stats.d.ts +0 -82
  1269. package/dist/stats.js +0 -219
  1270. package/dist/stats.js.map +0 -1
  1271. package/dist/stop-conditions.d.ts +0 -39
  1272. package/dist/stop-conditions.js +0 -66
  1273. package/dist/stop-conditions.js.map +0 -1
  1274. package/dist/study-analysis-codex-config.d.ts +0 -11
  1275. package/dist/study-analysis-codex-config.js +0 -34
  1276. package/dist/study-analysis-codex-config.js.map +0 -1
  1277. package/dist/study-analysis-engine.d.ts +0 -47
  1278. package/dist/study-analysis-engine.js +0 -327
  1279. package/dist/study-analysis-engine.js.map +0 -1
  1280. package/dist/study-analysis-evidence.d.ts +0 -27
  1281. package/dist/study-analysis-evidence.js +0 -660
  1282. package/dist/study-analysis-evidence.js.map +0 -1
  1283. package/dist/study-analysis-job.d.ts +0 -97
  1284. package/dist/study-analysis-job.js +0 -214
  1285. package/dist/study-analysis-job.js.map +0 -1
  1286. package/dist/study-analysis-provider.d.ts +0 -40
  1287. package/dist/study-analysis-provider.js +0 -170
  1288. package/dist/study-analysis-provider.js.map +0 -1
  1289. package/dist/study-analysis-service.d.ts +0 -59
  1290. package/dist/study-analysis-service.js +0 -257
  1291. package/dist/study-analysis-service.js.map +0 -1
  1292. package/dist/study-analysis-sharing.d.ts +0 -11
  1293. package/dist/study-analysis-sharing.js +0 -35
  1294. package/dist/study-analysis-sharing.js.map +0 -1
  1295. package/dist/study-analysis-store.d.ts +0 -47
  1296. package/dist/study-analysis-store.js +0 -493
  1297. package/dist/study-analysis-store.js.map +0 -1
  1298. package/dist/study-analysis-validation.d.ts +0 -618
  1299. package/dist/study-analysis-validation.js +0 -384
  1300. package/dist/study-analysis-validation.js.map +0 -1
  1301. package/dist/study-analysis.d.ts +0 -206
  1302. package/dist/study-analysis.js +0 -4
  1303. package/dist/study-analysis.js.map +0 -1
  1304. package/dist/study-costs.js +0 -114
  1305. package/dist/study-costs.js.map +0 -1
  1306. package/dist/subject-runtime.d.ts +0 -23
  1307. package/dist/subject-runtime.js +0 -70
  1308. package/dist/subject-runtime.js.map +0 -1
  1309. package/dist/tasks.d.ts +0 -90
  1310. package/dist/tasks.js +0 -144
  1311. package/dist/tasks.js.map +0 -1
  1312. package/dist/telemetry.js +0 -324
  1313. package/dist/telemetry.js.map +0 -1
  1314. package/dist/terminal-agent-actor.d.ts +0 -41
  1315. package/dist/terminal-agent-actor.js +0 -25
  1316. package/dist/terminal-agent-actor.js.map +0 -1
  1317. package/dist/terminal-encoding.js +0 -80
  1318. package/dist/terminal-encoding.js.map +0 -1
  1319. package/dist/terminal-node-bootstrap.d.ts +0 -4
  1320. package/dist/terminal-node-bootstrap.js +0 -58
  1321. package/dist/terminal-node-bootstrap.js.map +0 -1
  1322. package/dist/terminal-participant-activity.d.ts +0 -6
  1323. package/dist/terminal-participant-activity.js +0 -34
  1324. package/dist/terminal-participant-activity.js.map +0 -1
  1325. package/dist/terminal-runtime-auth.d.ts +0 -13
  1326. package/dist/terminal-runtime-auth.js +0 -24
  1327. package/dist/terminal-runtime-auth.js.map +0 -1
  1328. package/dist/terminal-runtime.d.ts +0 -16
  1329. package/dist/terminal-runtime.js +0 -42
  1330. package/dist/terminal-runtime.js.map +0 -1
  1331. package/dist/terminal-token-usage.d.ts +0 -15
  1332. package/dist/terminal-token-usage.js +0 -94
  1333. package/dist/terminal-token-usage.js.map +0 -1
  1334. package/dist/tui-actions.d.ts +0 -39
  1335. package/dist/tui-actions.js +0 -178
  1336. package/dist/tui-actions.js.map +0 -1
  1337. package/dist/tui-contract.d.ts +0 -141
  1338. package/dist/tui-contract.js +0 -54
  1339. package/dist/tui-contract.js.map +0 -1
  1340. package/dist/tui-launch.js +0 -167
  1341. package/dist/tui-launch.js.map +0 -1
  1342. package/dist/tui-project.d.ts +0 -9
  1343. package/dist/tui-project.js +0 -18
  1344. package/dist/tui-project.js.map +0 -1
  1345. package/docs/architecture/examples/state-driven-local-app/README.md +0 -80
  1346. package/docs/architecture/examples/state-driven-local-app/app.mjs +0 -48
  1347. package/docs/architecture/examples/state-driven-local-app/runner.mjs +0 -105
  1348. package/docs/architecture/local-codex-tui-actor.md +0 -213
  1349. package/docs/architecture/oss-lab-poc.md +0 -250
  1350. package/docs/architecture/runtime-broker-core.md +0 -30
  1351. package/docs/release/0.100.0-local-setup.md +0 -31
  1352. package/docs/release/0.100.1-participant-continuity.md +0 -20
  1353. package/docs/release/0.101.0-codex-ui-tools.md +0 -28
  1354. package/docs/release/0.102.0-participant-media.md +0 -43
  1355. package/docs/release/0.103.0-desktop-recording.md +0 -29
  1356. package/docs/release/0.103.1-analysis-capture-allocation.md +0 -18
  1357. package/docs/release/0.103.2-analysis-ending-context.md +0 -21
  1358. package/docs/release/0.104.0-local-captured-inboxes.md +0 -29
  1359. package/docs/release/0.104.1-recording-startup.md +0 -24
  1360. package/docs/release/0.104.2-recording-timestamps.md +0 -32
  1361. package/docs/release/0.104.3-local-smtp-catch.md +0 -15
  1362. package/docs/release/0.105.0-participant-backgrounds.md +0 -50
  1363. package/docs/release/0.20.0-external-public-shared-world.md +0 -43
  1364. package/docs/release/0.84.0-redacted-evidence.md +0 -42
  1365. package/docs/release/0.84.1-portable-feedback.md +0 -20
  1366. package/docs/release/0.85.0-observer-review.md +0 -56
  1367. package/docs/release/0.85.1-observer-continuity.md +0 -20
  1368. package/docs/release/0.86.0-participant-evidence.md +0 -50
  1369. package/docs/release/0.86.1-task-preflight-saved-recordings.md +0 -40
  1370. package/docs/release/0.87.0-participant-endings-and-phone-review.md +0 -64
  1371. package/docs/release/0.88.0-study-diagnostics.md +0 -43
  1372. package/docs/release/0.88.1-completion-evidence-and-local-app.md +0 -79
  1373. package/docs/release/0.88.2-sequential-study-budgets.md +0 -57
  1374. package/docs/release/0.89.0-study-findings.md +0 -79
  1375. package/docs/release/0.89.1-analysis-finished-notice.md +0 -24
  1376. package/docs/release/0.90.0-automatic-analysis.md +0 -21
  1377. package/docs/release/0.91.0-analysis-quality-and-defaults.md +0 -33
  1378. package/docs/release/0.91.1-study-review-polish.md +0 -28
  1379. package/docs/release/0.92.0-grid-playback.md +0 -22
  1380. package/docs/release/0.93.0-global-playback.md +0 -26
  1381. package/docs/release/0.93.1-observer-review-controls.md +0 -24
  1382. package/docs/release/0.94.0-reliability.md +0 -48
  1383. package/docs/release/0.95.0-connections-setup.md +0 -38
  1384. package/docs/release/0.96.0-real-email-receiving.md +0 -47
  1385. package/docs/release/0.96.1-browser-navigation.md +0 -22
  1386. package/docs/release/0.97.0-codex-account-analysis.md +0 -45
  1387. package/docs/release/0.98.0-local-browser-studies.md +0 -31
  1388. package/docs/release/0.99.0-local-browser-mac.md +0 -34
  1389. package/docs/release/0.99.1-action-recovery.md +0 -19
  1390. /package/dist/{agent-session.d.ts → actors/agent-session.d.ts} +0 -0
  1391. /package/dist/{cua-executor-error.d.ts → actors/computer-use/executor-error.d.ts} +0 -0
  1392. /package/dist/{cua-speech.d.ts → actors/computer-use/speech.d.ts} +0 -0
  1393. /package/dist/{actor-goal-source.d.ts → actors/goal-source.d.ts} +0 -0
  1394. /package/dist/{output-token-limit.d.ts → actors/output-token-limit.d.ts} +0 -0
  1395. /package/dist/{reasoning-effort.d.ts → actors/reasoning-effort.d.ts} +0 -0
  1396. /package/dist/{secret-prompt.d.ts → cli/secret-prompt.d.ts} +0 -0
  1397. /package/dist/{telemetry.d.ts → cli/telemetry.d.ts} +0 -0
  1398. /package/dist/{browser-evidence-hygiene.d.ts → evidence/browser-hygiene.d.ts} +0 -0
  1399. /package/dist/{serve-http.d.ts → observer/http.d.ts} +0 -0
  1400. /package/dist/{observer-library.d.ts → observer/library.d.ts} +0 -0
  1401. /package/dist/{listen.d.ts → observer/listen.d.ts} +0 -0
  1402. /package/dist/{observer-static.d.ts → observer/static.d.ts} +0 -0
  1403. /package/dist/{serve-tunnel.d.ts → observer/tunnel.d.ts} +0 -0
  1404. /package/dist/{terminal-encoding.d.ts → routes/terminal/encoding.d.ts} +0 -0
  1405. /package/dist/{concurrency.d.ts → run/concurrency.d.ts} +0 -0
  1406. /package/dist/{study-costs.d.ts → run/costs.d.ts} +0 -0
  1407. /package/dist/{run-narration-secrets.d.ts → run/transient-comms-secrets.d.ts} +0 -0
  1408. /package/dist/{tui-launch.d.ts → tui/launch.d.ts} +0 -0
@@ -1,1424 +0,0 @@
1
- import { scrubPersonaBrief } from "./persona.js";
2
- // The shared-world lab backend (#164): the SEQUENTIAL deterministic proof-of-concept of the
3
- // shared-world topology. ONE sandbox provisions a mutable service plane ONCE (clone or packed
4
- // working tree + serve + seed), then N role SEATS take turns IN DECLARED ORDER (each an isolated browser
5
- // profile + identity) against the shared loopback app. A read-only state
6
- // CHECKPOINT (digest probe) runs at baseline + after each role's turn, producing a
7
- // harness-clocked timeline that PROVES role B acted on a world already containing role A's
8
- // mutation (the checkpoint after A strictly precedes B's turn in one clock).
9
- //
10
- // Doctrine (docs/goals/shared-world-topology/goal.md): the bundle declares a VERIFIED, weaker
11
- // `attributionClass: shared-world` + a `humanish.shared-world.v1` block whose `attributionLimits`
12
- // pin the attribution ceiling (sequential-only, no-concurrent-races,
13
- // delta-attributed-to-turn-not-action). verifyRun fails closed on any overclaim.
14
- //
15
- // Safety rails (same as the fan-out packet + the 2026-06-16 prod incident): ONE Sandbox.create;
16
- // ONE teardown BY exact sandboxId in a finally — NEVER Sandbox.list (account-wide ops are
17
- // forbidden). Provisioned values are literal-scrubbed before any error/log persists; checkpoints
18
- // persist DIGEST-ONLY. The concurrent (getHost) topology, a handoff/barrier grammar, an onTurn
19
- // hook, and real per-role login are named NON-GOALS (PR2+).
20
- //
21
- // FIDELITY NOTE: one sandbox has ONE screen geometry, so a role's `device` is a PROMPT SIGNAL
22
- // (composed into its persona context) — physical per-role screen geometry is the concurrent
23
- // topology's job. Each role records its measured browser viewport separately from that screen.
24
- import { resolveAutomaticAnalysis } from "./automatic-analysis-config.js";
25
- import { completeAutomaticAnalysis, markFinalizedStudyResult } from "./automatic-analysis-completion.js";
26
- import { desktopMediaValidationReason, taskProtocolValidationReason } from "./lab-config.js";
27
- import { randomBytes } from "node:crypto";
28
- import { describeMissingKeys } from "./key-resolution.js";
29
- import { beginRunStatus, withRunStatusScope } from "./run-status.js";
30
- import path from "node:path";
31
- import { runDesktopCommandOrThrow, toErrorMessage } from "./command-failure.js";
32
- import { adapterScoreFailureMessage, applyBrowserAdapterHooks } from "./adapter-extension.js";
33
- import { actorRegistry, isCuaActorDescriptor } from "./actor-registry.js";
34
- import { CHROMIUM_EVIDENCE_HYGIENE_FLAGS, chromiumEvidenceProfilePreferencesJson } from "./browser-evidence-hygiene.js";
35
- import { labPersonaIds, resolveCommittedPersonasForCwd } from "./persona-resolve.js";
36
- import { commandDigestOf, buildCuaCostSummary, makeCuaRunBudget, composeLaneInstructions, defaultPackLocalTree, makeChromeBrowserStateObserver, captureDesktopBrowserGeometry, inspectDesktopScreenGeometry, makeLaneWriteScreenshot, provisionCloneSubject, provisionLocalTreeSubject, resolveLaneDevice, resolveSubjectState, SUBJECT_DIR, desktopBrowserFamily } from "./cua-actor-lab.js";
37
- import { createDesktopSandbox, loadE2BDesktopModule } from "./e2b-desktop-launch.js";
38
- import { runDetachedStep } from "./e2b-detached.js";
39
- import { resolveSeatUrl, sharedWorldValidationReason, outputTokenLimitValidationReason } from "./lab-config.js";
40
- import { renderObserver } from "./observer.js";
41
- import { redactText } from "./redaction.js";
42
- import { participantAssignment } from "./participant-assignment.js";
43
- import { prepareRunArtifactPaths, validatePreparedRunArtifactPaths } from "./run-paths.js";
44
- import { writeContainedOutputFile, writePreparedRunLatestPointer } from "./selected-output-paths.js";
45
- import { buildRunSource, PUBLIC_TARGET_CWD, REVIEW_SCHEMA, RUN_BUNDLE_SCHEMA, SHARED_WORLD_SCHEMA } from "./run.js";
46
- import { appendSandboxReceipt } from "./sandbox-receipts.js";
47
- import { estimateActorCost, estimateActorCostForExecution, MODEL_RATES, round6 } from "./pricing.js";
48
- import { DEFAULT_OPENAI_CU_MODEL } from "./openai-responses-cu.js";
49
- export const SHARED_WORLD_LAB_SCHEMA = "humanish.shared-world-lab-result.v1";
50
- export const SHARED_WORLD_LAB_PROVIDER_METADATA = {
51
- mode: "shared-world-lab",
52
- tool: "humanish"
53
- };
54
- // The DEFAULT per-role session budget is DERIVED, not flat: every role's turn shares ONE sandbox
55
- // on this route, so the sandbox deadline is timeoutMs x roleCount plus provisioning, seeding, and
56
- // the teardown buffer — and E2B refuses a sandbox over one hour. A flat raise here would make the
57
- // derived deadline overflow the cap and fail at create. The derivation hands each role the most
58
- // the cap allows (capped at 15 minutes; floored at the historical 300s so a seed-heavy lab never
59
- // gets LESS room than it always had). An explicit execution.timeoutMs is never adjusted.
60
- const MAX_SANDBOX_MS = 60 * 60_000;
61
- const MAX_DERIVED_ROLE_SESSION_MS = 15 * 60_000;
62
- const MIN_DERIVED_ROLE_SESSION_MS = 300_000;
63
- function defaultRoleSessionTimeoutMs(config, roleCount) {
64
- const stateBudgetMs = (config.subject.state?.seed ?? []).reduce((sum, step) => sum + (step.timeoutMs ?? DEFAULT_STATE_STEP_TIMEOUT_MS), 0);
65
- const room = Math.floor((MAX_SANDBOX_MS - SUBJECT_PROVISION_BUDGET_MS - stateBudgetMs - SANDBOX_TIMEOUT_BUFFER_MS)
66
- / Math.max(1, roleCount));
67
- return Math.max(MIN_DERIVED_ROLE_SESSION_MS, Math.min(MAX_DERIVED_ROLE_SESSION_MS, room));
68
- }
69
- // Settle after opening a seat's browser, before the session's first screenshot.
70
- const BROWSER_SETTLE_MS = 8_000;
71
- // In-sandbox budget for ending one seat's browser at turn end (TERM, short wait, KILL).
72
- const SEAT_BROWSER_TERMINATION_TIMEOUT_MS = 15_000;
73
- // Server-side reclamation buffer past the loop's own wall-clock stop.
74
- const SANDBOX_TIMEOUT_BUFFER_MS = 10 * 60_000;
75
- // Room for the one-time clone/install/build/start/probe + the sequential per-role sessions.
76
- const SUBJECT_PROVISION_BUDGET_MS = 30 * 60_000;
77
- // Per-checkpoint probe budget (read-only aggregate probes are fast).
78
- const CHECKPOINT_TIMEOUT_MS = 60_000;
79
- const DEFAULT_STATE_STEP_TIMEOUT_MS = 5 * 60_000;
80
- const DEFAULT_MISSION = "You are testing a shared web application other roles also use. The browser is already open at your entry URL. Accomplish what your role asks, then stop.";
81
- function readPositiveInt(value, fallback) {
82
- if (value === undefined)
83
- return fallback;
84
- const parsed = Number.parseInt(value, 10);
85
- return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : fallback;
86
- }
87
- function makeSharedWorldRunId() {
88
- const stamp = new Date().toISOString().replace(/[:.]/g, "-");
89
- return `shared-world-${stamp}-${randomBytes(4).toString("hex")}`;
90
- }
91
- /** Single-quote a value for safe interpolation into the seat-launch shell command. */
92
- function shellQuote(value) {
93
- return `'${value.replaceAll("'", "'\\''")}'`;
94
- }
95
- /**
96
- * Launch ONE seat's browser with its OWN isolated profile — the shared-world topology needs a
97
- * fresh browser identity boundary per role (cookies/session isolated per seat). Absent/default
98
- * preserves the historical shared-world opener (Chrome best-effort). A concrete preference is
99
- * fail-closed and records the resolved in-sandbox command.
100
- */
101
- async function launchSeatBrowser(desktop, args) {
102
- const requested = args.browserPreference ?? "default";
103
- const chromiumFlags = CHROMIUM_EVIDENCE_HYGIENE_FLAGS.map(shellQuote).join(" ");
104
- const command = [
105
- "set -euo pipefail",
106
- `browser_preference=${shellQuote(requested)}`,
107
- `profile_dir=${shellQuote(args.profileDir)}`,
108
- `seat_url=${shellQuote(args.seatUrl)}`,
109
- `chrome_preferences_json=${shellQuote(chromiumEvidenceProfilePreferencesJson())}`,
110
- 'mkdir -p "$profile_dir"',
111
- "chrome_debug_flags=(" + chromiumFlags + ")",
112
- "prepare_chrome_profile() {",
113
- " mkdir -p \"$profile_dir/Default\"",
114
- " printf '%s\\n' \"$chrome_preferences_json\" > \"$profile_dir/Default/Preferences\"",
115
- "}",
116
- "launch_chrome() {",
117
- " local label=\"$1\"",
118
- " local binary=\"$2\"",
119
- " if ! command -v \"$binary\" >/dev/null 2>&1; then return 127; fi",
120
- " prepare_chrome_profile",
121
- " rm -f \"$profile_dir/DevToolsActivePort\"",
122
- " setsid \"$binary\" --new-window --remote-debugging-address=127.0.0.1 --remote-debugging-port=0 --user-data-dir=\"$profile_dir\" \"${chrome_debug_flags[@]}\" \"$seat_url\" > /dev/null 2>&1 < /dev/null &",
123
- " local launch_pid=$!",
124
- " echo \"HUMANISH_BROWSER_RESOLVED=$label\"",
125
- " echo \"HUMANISH_BROWSER_PID=$launch_pid\"",
126
- " for _ in $(seq 1 30); do",
127
- " if [ -s \"$profile_dir/DevToolsActivePort\" ]; then",
128
- " head -n 1 \"$profile_dir/DevToolsActivePort\" | sed 's/^/HUMANISH_BROWSER_CDP_PORT=/'",
129
- " break",
130
- " fi",
131
- " sleep 0.1",
132
- " done",
133
- "}",
134
- "launch_firefox() {",
135
- " if ! command -v firefox >/dev/null 2>&1; then return 127; fi",
136
- " setsid firefox --new-instance --no-remote --new-window --profile \"$profile_dir\" \"$seat_url\" > /dev/null 2>&1 < /dev/null &",
137
- " local launch_pid=$!",
138
- " echo \"HUMANISH_BROWSER_RESOLVED=firefox\"",
139
- " echo \"HUMANISH_BROWSER_PID=$launch_pid\"",
140
- " echo \"HUMANISH_BROWSER_PROFILE_DIR=$profile_dir\"",
141
- "}",
142
- "case \"$browser_preference\" in",
143
- " chrome)",
144
- " launch_chrome google-chrome google-chrome || launch_chrome google-chrome-stable google-chrome-stable",
145
- " ;;",
146
- " chromium)",
147
- " launch_chrome chromium chromium || launch_chrome chromium-browser chromium-browser",
148
- " ;;",
149
- " firefox)",
150
- " launch_firefox",
151
- " ;;",
152
- " default)",
153
- " launch_chrome google-chrome google-chrome || true",
154
- " ;;",
155
- "esac"
156
- ].join("\n");
157
- const result = await runDesktopCommandOrThrow(() => desktop.commands.run(command, { requestTimeoutMs: args.requestTimeoutMs }), (_info, error) => args.browserPreference !== undefined && args.browserPreference !== "default"
158
- ? new Error(`requested desktop browser "${args.browserPreference}" could not be launched for shared-world seat`)
159
- : error);
160
- if (args.browserPreference !== undefined && args.browserPreference !== "default" && result.exitCode !== undefined && result.exitCode !== 0) {
161
- throw new Error(`requested desktop browser "${args.browserPreference}" could not be launched for shared-world seat`);
162
- }
163
- const resolved = (result.stdout ?? "").match(/^HUMANISH_BROWSER_RESOLVED=(\S+)$/m)?.[1];
164
- const processId = (result.stdout ?? "").match(/^HUMANISH_BROWSER_PID=(\d+)$/m)?.[1];
165
- const profileDir = (result.stdout ?? "").match(/^HUMANISH_BROWSER_PROFILE_DIR=(\S+)$/m)?.[1] ?? args.profileDir;
166
- const cdpPortRaw = (result.stdout ?? "").match(/^HUMANISH_BROWSER_CDP_PORT=(\d+)$/m)?.[1];
167
- const cdpPort = cdpPortRaw === undefined ? undefined : Number(cdpPortRaw);
168
- return {
169
- family: desktopBrowserFamily(resolved ?? requested),
170
- ...(processId === undefined
171
- ? {}
172
- : { identity: { processId, profileDir, targetUrl: args.seatUrl, ...(cdpPort === undefined ? {} : { cdpPort }) } }),
173
- ...(args.browserPreference === undefined
174
- ? {}
175
- : { evidence: { requested, ...(resolved === undefined ? {} : { resolved }) } })
176
- };
177
- }
178
- /**
179
- * Self-match-proof pkill/pgrep -f pattern for a seat's unique profile dir: bracket the first
180
- * character so the in-sandbox shell running the termination script (whose own command line
181
- * carries this pattern) can never match itself. Exported (pure) for contract tests.
182
- */
183
- export function seatProfilePkillPattern(profileDir) {
184
- const head = profileDir.slice(0, 1);
185
- const tail = profileDir.slice(1).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
186
- return `[${head}]${tail}`;
187
- }
188
- /**
189
- * Build the in-sandbox command that ends ONE seat's browser when its turn ends (pure; exported
190
- * for contract tests). All roles share the ONE desktop, so a prior seat's browser left alive
191
- * could keep polling/holding websockets and mutating the shared plane during a later role's
192
- * turn, with its authenticated window one Alt-Tab away from the current actor. The recorded
193
- * launch PID (a setsid session leader) is the primary kill (its process group takes the whole
194
- * browser tree); pkill -f on the seat's unique profile dir is the fallback; a short bounded
195
- * wait escalates to SIGKILL. Exit is always 0: a termination failure degrades to the caller's
196
- * warning, never a failed run.
197
- */
198
- export function buildSeatBrowserTerminationCommand(processId, profileDir) {
199
- return [
200
- "set -u",
201
- `launch_pid=${shellQuote(processId ?? "")}`,
202
- `profile_pattern=${shellQuote(seatProfilePkillPattern(profileDir))}`,
203
- 'if [ -n "$launch_pid" ]; then',
204
- ' kill -TERM -- "-$launch_pid" 2>/dev/null || kill -TERM "$launch_pid" 2>/dev/null || true',
205
- "fi",
206
- 'pkill -TERM -f "$profile_pattern" 2>/dev/null || true',
207
- "for _ in $(seq 1 20); do",
208
- ' if ! pgrep -f "$profile_pattern" >/dev/null 2>&1; then',
209
- " exit 0",
210
- " fi",
211
- " sleep 0.1",
212
- "done",
213
- 'pkill -KILL -f "$profile_pattern" 2>/dev/null || true',
214
- "exit 0"
215
- ].join("\n");
216
- }
217
- /** Combine a snapshot's per-probe digests into ONE sha256-16 (digest-only; no raw value). */
218
- export function combineCheckpointDigest(parts) {
219
- return commandDigestOf(parts.join("\n"));
220
- }
221
- /**
222
- * Run ONE checkpoint snapshot LIVE: each declared probe runs read-only via the detached
223
- * primitive; its stdout is literal-scrubbed (provisioned values + the probe's declared redact
224
- * literals, folded into `scrub`) then pattern-redacted, then digested. Only the COMBINED digest
225
- * persists — never the raw value (the seed-step lockdown). Unique step names per snapshot prevent
226
- * stale-status reuse across snapshots.
227
- */
228
- export async function runCheckpointSnapshot(args) {
229
- const parts = [];
230
- for (const probe of args.checkpoints) {
231
- const result = await runDetachedStep(args.desktop, {
232
- name: `checkpoint-${args.snapshotIndex}-${probe.name}`,
233
- command: probe.command,
234
- cwd: SUBJECT_DIR,
235
- timeoutMs: CHECKPOINT_TIMEOUT_MS,
236
- requestTimeoutMs: args.requestTimeoutMs,
237
- ...args.timers
238
- });
239
- const scrubbed = redactText(args.scrub(result.logTail));
240
- parts.push(`${probe.name}=${commandDigestOf(scrubbed)}`);
241
- }
242
- const digest = combineCheckpointDigest(parts);
243
- return {
244
- kind: "checkpoint",
245
- name: args.name,
246
- digest,
247
- deltaFromPrev: args.prevDigest !== undefined && digest !== args.prevDigest
248
- };
249
- }
250
- /** The DECLARED (dry-run) checkpoint snapshot: digest the probe RECIPE (command digests), no run. */
251
- export function declaredCheckpointSnapshot(name, checkpoints) {
252
- const parts = checkpoints.map((probe) => `${probe.name}=${commandDigestOf(probe.command)}`);
253
- return { kind: "checkpoint", name, digest: combineCheckpointDigest(parts), deltaFromPrev: false };
254
- }
255
- /** sha256-16 over the ordered seed-step command digests — the seeded-state RECIPE identity. */
256
- export function seedRecipeDigest(config) {
257
- const seed = config.subject.state?.seed ?? [];
258
- return commandDigestOf(seed.map((step) => `${step.name}:${commandDigestOf(step.command)}`).join("\n"));
259
- }
260
- /** Build the resolved role roster from actors[0].lanes (the role roster). */
261
- function buildRoleSpecs(config, serveUrl, personas) {
262
- const actor = config.actors[0];
263
- const mission = actor?.mission ?? DEFAULT_MISSION;
264
- const roster = actor?.lanes ?? [];
265
- return roster.map((lane, i) => {
266
- const roleId = lane.id ?? `role-${String(i + 1).padStart(2, "0")}`;
267
- const device = resolveLaneDevice(config, lane);
268
- const resolvedPersona = lane.persona === undefined ? undefined : personas.get(lane.persona);
269
- const composed = composeLaneInstructions({
270
- mission,
271
- ...(lane.persona === undefined ? {} : { persona: lane.persona }),
272
- ...(resolvedPersona === undefined ? {} : { resolvedPersona }),
273
- ...(lane.instruction === undefined ? {} : { instruction: lane.instruction }),
274
- device: { name: device.name, preset: device.preset }
275
- });
276
- return {
277
- roleId,
278
- roleIndex: i,
279
- simId: `sim-${String(i + 1).padStart(3, "0")}`,
280
- streamId: `stream-${String(i + 1).padStart(3, "0")}`,
281
- persona: composed.persona,
282
- instructions: composed.instructions,
283
- assignment: { mission, ...(lane.instruction === undefined ? {} : { focus: lane.instruction }) },
284
- deviceName: device.name,
285
- ...((lane.reasoningEffort ?? actor?.reasoningEffort) === undefined
286
- ? {}
287
- : { reasoningEffort: (lane.reasoningEffort ?? actor?.reasoningEffort) }),
288
- ...((lane.stopWhen ?? actor?.stopWhen) === undefined ? {} : { stopWhen: (lane.stopWhen ?? actor?.stopWhen) }),
289
- ...((lane.dwell ?? actor?.dwell) === undefined ? {} : { dwell: (lane.dwell ?? actor?.dwell) }),
290
- ...(lane.entry === undefined ? {} : { entry: lane.entry }),
291
- seatUrl: resolveSeatUrl(serveUrl, lane.entry) ?? serveUrl,
292
- screenshotDir: roleId,
293
- traceArtifactPath: `actors/${`stream-${String(i + 1).padStart(3, "0")}`}.json`,
294
- profileDir: `/tmp/seat-${roleId}`
295
- };
296
- });
297
- }
298
- /**
299
- * Wrapped so a DIRECT library caller gets the same status-record lifetime the CLI does: returning
300
- * from this function finalizes any record the run opened, whichever of its fail-closed exits it
301
- * took. `runLab` establishes a scope too and nesting is harmless — the inner scope owns what it
302
- * opened. Without this a test or an adopter calling the backend directly leaves the 5s cadence
303
- * ticking into a directory something else is deleting, which surfaces as an unrelated ENOTEMPTY.
304
- */
305
- export async function runSharedWorldLab(options) {
306
- const analysis = resolveAutomaticAnalysis(options.config.review?.analysis);
307
- const result = await withRunStatusScope(() => runSharedWorldLabInScope(options));
308
- return completeAutomaticAnalysis(result, analysis.ok ? analysis.config : undefined, options.automaticAnalysis, options.config.review?.analysis === undefined ? "default" : "explicit", analysis.ok && analysis.preferLargerOutput === true);
309
- }
310
- async function runSharedWorldLabInScope(options) {
311
- const { config, dryRun } = options;
312
- const cwd = path.resolve(options.cwd);
313
- const hooks = options.hooks ?? {};
314
- const env = hooks.env ?? process.env;
315
- const render = hooks.renderObserverFn ?? renderObserver;
316
- const actorType = config.actors[0]?.type ?? "";
317
- const fail = (code, message, actorLabel) => ({
318
- schema: SHARED_WORLD_LAB_SCHEMA,
319
- ok: false,
320
- cwd,
321
- labId: config.id,
322
- actor: actorLabel ?? actorType,
323
- topology: "shared-world",
324
- roleCount: config.actors[0]?.lanes?.length ?? 0,
325
- sequence: [],
326
- dryRun,
327
- runId: options.runId ?? "not-created",
328
- roles: [],
329
- warnings: [],
330
- error: { code, message }
331
- });
332
- // Direct library entrypoints must reject declarations this backend cannot execute.
333
- if (String(config.comms?.email?.kind) === "real") {
334
- return fail("HUMANISH_SHARED_WORLD_LAB_INVALID", "Real email receiving is unsupported on the sequential shared-world backend. Use a supported concurrent or independent hosted computer-use study.");
335
- }
336
- // Resolve the actor through the registry — the parser validated this, but the engine fails closed
337
- // rather than trusting a config that arrived through the library door (this fn is npm surface).
338
- const mediaReason = desktopMediaValidationReason(config, false);
339
- if (mediaReason)
340
- return fail("HUMANISH_SHARED_WORLD_LAB_INVALID", mediaReason);
341
- const analysis = resolveAutomaticAnalysis(config.review?.analysis);
342
- if (!analysis.ok)
343
- return fail("HUMANISH_LAB_ANALYSIS_INVALID", analysis.message);
344
- const tasksReason = taskProtocolValidationReason(config, false);
345
- if (tasksReason)
346
- return fail("HUMANISH_LAB_TASKS_UNSUPPORTED", tasksReason);
347
- const descriptor = actorRegistry[actorType];
348
- if (!descriptor || !isCuaActorDescriptor(descriptor)) {
349
- return fail("HUMANISH_SHARED_WORLD_LAB_ACTOR_UNSUPPORTED", `actors[0].type "${actorType}" is not a registered computer-use actor.`);
350
- }
351
- // Re-enforce the shared-world cross-validation (library API surface).
352
- const invalidReason = outputTokenLimitValidationReason(config) ?? sharedWorldValidationReason(config);
353
- if (invalidReason) {
354
- return fail("HUMANISH_SHARED_WORLD_LAB_INVALID", invalidReason, descriptor.id);
355
- }
356
- if (config.actors[0]?.maxOutputTokens !== undefined && hooks.runSession) {
357
- return fail("HUMANISH_SHARED_WORLD_LAB_INVALID", "maxOutputTokens cannot be enforced by a custom runSession.", descriptor.id);
358
- }
359
- const caps = config.execution?.caps;
360
- const capModelId = config.actors[0]?.model ?? DEFAULT_OPENAI_CU_MODEL;
361
- const invalidCap = ["maxUsd", "maxTotalUsd"].find(key => caps?.[key] !== undefined && (!Number.isFinite(caps[key]) || caps[key] < 0));
362
- if (invalidCap)
363
- return fail("HUMANISH_SHARED_WORLD_LAB_INVALID", `execution.caps.${invalidCap} must be a finite nonnegative number.`, descriptor.id);
364
- if (!dryRun && (caps?.maxUsd !== undefined || caps?.maxTotalUsd !== undefined)
365
- && !Object.hasOwn(MODEL_RATES, capModelId.trim().toLowerCase())) {
366
- return fail("HUMANISH_SHARED_WORLD_LAB_INVALID", `The declared spend cap cannot be enforced for unpriced model "${capModelId}".`, descriptor.id);
367
- }
368
- const runBudget = !dryRun && caps?.maxTotalUsd !== undefined ? makeCuaRunBudget(caps.maxTotalUsd) : undefined;
369
- let budgetBlockedReason;
370
- const noteModelEstimate = (roleId, estimate) => {
371
- if (!runBudget)
372
- return undefined;
373
- const total = runBudget.note(roleId, estimate);
374
- return total > runBudget.maxTotalUsd
375
- ? `study budget reached: estimated model spend $${round6(total)} crossed execution.caps.maxTotalUsd=${runBudget.maxTotalUsd}; subsequent sequential participants will not start`
376
- : undefined;
377
- };
378
- const serve = config.subject.serve;
379
- const localTreeRoute = config.subject.source === "local-tree";
380
- const subjectRepo = config.subject.repos?.[0] ?? "";
381
- const subjectEnvNames = config.subject.env ?? [];
382
- const checkpoints = config.subject.state?.checkpoint ?? [];
383
- // Compile committed personas so each seat's prompt carries real behavioral directives (#381).
384
- const personaResolution = await resolveCommittedPersonasForCwd(cwd, labPersonaIds(config));
385
- const roleSpecs = buildRoleSpecs(config, serve.url, personaResolution.personas);
386
- const roleCount = roleSpecs.length;
387
- const runSession = hooks.runSession ?? descriptor.runSession;
388
- // Read keys once into locals (names only; values never logged or persisted).
389
- const openaiApiKey = env.OPENAI_API_KEY?.trim() ?? "";
390
- const e2bApiKey = env.E2B_API_KEY?.trim() ?? "";
391
- // Literal scrubber for every known provisioned value (no secret "shape" to pattern-match):
392
- // provider/E2B keys, subject env values, AND each checkpoint's declared redact literals.
393
- const knownSecretValues = [
394
- openaiApiKey,
395
- e2bApiKey,
396
- ...subjectEnvNames.map((name) => env[name] ?? ""),
397
- ...checkpoints.flatMap((probe) => probe.redact ?? [])
398
- ].filter((value) => value.length >= 4);
399
- const scrubKnownValues = (text) => knownSecretValues.reduce((current, value) => current.split(value).join("[REDACTED_SECRET]"), text);
400
- for (const spec of roleSpecs) {
401
- if (spec.assignment)
402
- spec.assignment = participantAssignment(spec.assignment, scrubKnownValues);
403
- spec.evidenceInstructions = redactText(scrubKnownValues(spec.instructions));
404
- spec.persona = scrubPersonaBrief(spec.persona, scrubKnownValues);
405
- }
406
- const redactRepoLabel = config.policies?.redactRepos ?? subjectEnvNames.includes("GITHUB_TOKEN");
407
- const publicRepo = redactRepoLabel ? "repo-01" : subjectRepo;
408
- const hasGithubToken = subjectEnvNames.includes("GITHUB_TOKEN");
409
- if (!dryRun) {
410
- const missingKeys = [
411
- ...(openaiApiKey ? [] : ["OPENAI_API_KEY"]),
412
- ...(e2bApiKey ? [] : ["E2B_API_KEY"])
413
- ];
414
- if (missingKeys.length > 0) {
415
- return fail("HUMANISH_SHARED_WORLD_LAB_KEYS_MISSING", `Live shared-world labs need ${missingKeys.join(" and ")} in the environment (values are never persisted). ${describeMissingKeys(missingKeys, env)}`, descriptor.id);
416
- }
417
- const missingSubjectEnv = subjectEnvNames.filter((name) => !env[name]?.trim());
418
- if (missingSubjectEnv.length > 0) {
419
- return fail("HUMANISH_SHARED_WORLD_LAB_SUBJECT_ENV_MISSING", `subject.env declares ${missingSubjectEnv.join(", ")} but the environment does not provide ${missingSubjectEnv.length === 1 ? "it" : "them"} (pass via --env-file; values are never persisted).`, descriptor.id);
420
- }
421
- }
422
- const runId = options.runId ?? makeSharedWorldRunId();
423
- const runPaths = await prepareRunArtifactPaths(cwd, runId);
424
- // Identity + liveness on disk (#455): every backend writes this, so a watcher can classify any
425
- // run without parsing bundles and without depending on the interactive-observer path.
426
- const runStatus = beginRunStatus(runPaths, {
427
- runId,
428
- mode: dryRun ? "dry-run" : "live",
429
- ...(options.lab === undefined ? {} : { lab: options.lab })
430
- });
431
- const physicalArtifactRoot = runPaths.physicalRunRoot;
432
- const createdAt = new Date().toISOString();
433
- const timeoutMs = config.execution?.timeoutMs ?? defaultRoleSessionTimeoutMs(config, roleCount);
434
- const requestTimeoutMs = readPositiveInt(env.HUMANISH_E2B_REQUEST_TIMEOUT_MS, 60_000);
435
- const redactScreenshots = config.policies?.redactScreenshots === true;
436
- const timers = hooks.detachedTimers ?? {};
437
- // ONE sandbox geometry for the shared desktop (run-wide; per-role device is a prompt signal).
438
- const sandboxDevice = resolveLaneDevice(config, undefined);
439
- const sandboxResolution = sandboxDevice.resolution;
440
- const sandboxPreset = sandboxDevice.preset;
441
- const perRunSandboxMs = config.execution?.desktop?.sandboxTimeoutMs
442
- ?? timeoutMs * Math.max(1, roleCount)
443
- + SUBJECT_PROVISION_BUDGET_MS
444
- + (config.subject.state?.seed ?? []).reduce((sum, step) => sum + (step.timeoutMs ?? DEFAULT_STATE_STEP_TIMEOUT_MS), 0)
445
- + SANDBOX_TIMEOUT_BUFFER_MS;
446
- // The provider caps a sandbox at MAX_SANDBOX_MS and refuses a longer request at create, after
447
- // nothing but a paid API call; on 2026-09-04 an explicit 15-minute execution.timeoutMs for two
448
- // seats did exactly that ("400: Timeout cannot be greater than 1 hours") and the refusal
449
- // surfaced as a bundle that failed verification. Say the arithmetic here, before any call.
450
- if (perRunSandboxMs > MAX_SANDBOX_MS) {
451
- const perRoleCeilingMs = Math.floor((MAX_SANDBOX_MS - SUBJECT_PROVISION_BUDGET_MS - SANDBOX_TIMEOUT_BUFFER_MS
452
- - (config.subject.state?.seed ?? []).reduce((sum, step) => sum + (step.timeoutMs ?? DEFAULT_STATE_STEP_TIMEOUT_MS), 0))
453
- / Math.max(1, roleCount));
454
- throw new Error(`the sequential shared-world sandbox would need ${Math.round(perRunSandboxMs / 60_000)} minutes `
455
- + `(${roleCount} role(s) x ${Math.round(timeoutMs / 1000)} s of session budget, plus ${SUBJECT_PROVISION_BUDGET_MS / 60_000} minutes of provisioning `
456
- + `and a ${SANDBOX_TIMEOUT_BUFFER_MS / 60_000}-minute reclamation buffer), over the provider's ${MAX_SANDBOX_MS / 60_000}-minute sandbox cap; `
457
- + `set execution.timeoutMs to at most ${perRoleCeilingMs} ms per role, or execution.desktop.sandboxTimeoutMs explicitly`);
458
- }
459
- const source = await buildRunSource({ capturedAt: createdAt, cwd, humanishSource: "present", packageName: "humanish" });
460
- const warnings = [];
461
- const stateStepRecords = [];
462
- const roleOutcomes = [];
463
- const baselineDeclared = declaredCheckpointSnapshot("cp-baseline", checkpoints);
464
- let baselineCheckpoint = baselineDeclared;
465
- let subjectCommit;
466
- let sandboxId;
467
- let killed = false;
468
- let failFastReason;
469
- let sharedScreenGeometry = {
470
- screen: { requested: { width: sandboxResolution[0], height: sandboxResolution[1] } }
471
- };
472
- // Pack the working tree ONCE per run, on the host, BEFORE any sandbox is created (mirrors the
473
- // cua route's ordering): a packing failure fails the run closed here, never spending sandbox
474
- // cost. Dry-run packs nothing (no fs side effects; the contract bundle carries no archiveSha256).
475
- let localTreeArchive;
476
- let localTreeArchiveBuffer;
477
- if (localTreeRoute && !dryRun) {
478
- const packLocalTree = hooks.packLocalTree ?? defaultPackLocalTree;
479
- try {
480
- const packed = await packLocalTree({
481
- root: cwd,
482
- ...(config.subject.localTree?.exclude === undefined ? {} : { extraExclude: config.subject.localTree.exclude }),
483
- ...(config.subject.localTree?.maxArchiveBytes === undefined ? {} : { maxArchiveBytes: config.subject.localTree.maxArchiveBytes })
484
- });
485
- localTreeArchive = packed.archive;
486
- localTreeArchiveBuffer = packed.buffer;
487
- process.stderr.write(`humanish shared-world local-tree: packed ${packed.archive.fileCount} entries, ${packed.archive.totalBytes} bytes, archiveSha256 ${packed.archive.archiveSha256}`
488
- + `${packed.archive.git ? ` (commit ${packed.archive.git.commit.slice(0, 12)}, ${packed.archive.git.dirty ? "dirty" : "clean"} working tree)` : " (not a git work tree)"}\n`);
489
- }
490
- catch (error) {
491
- return fail("HUMANISH_SHARED_WORLD_LAB_FAILED", `local-tree packing failed: ${redactText(scrubKnownValues(toErrorMessage(error)))}`, descriptor.id);
492
- }
493
- }
494
- if (!dryRun) {
495
- let desktopModule;
496
- let desktop;
497
- let runFailed = false;
498
- try {
499
- desktopModule = await (hooks.loadDesktopModule ?? loadE2BDesktopModule)();
500
- // ONE Sandbox.create for the whole run (metadata.topology + roleCount; the SUBJECT env is
501
- // provisioned here on the clone route — the ACTOR key never enters the sandbox). An optional
502
- // custom desktop template (image) selects Sandbox.create(template, opts); absent keeps the
503
- // byte-stable Sandbox.create(opts) default.
504
- desktop = await createDesktopSandbox(desktopModule, {
505
- apiKey: e2bApiKey,
506
- requestTimeoutMs,
507
- timeoutMs: perRunSandboxMs,
508
- metadata: {
509
- ...SHARED_WORLD_LAB_PROVIDER_METADATA,
510
- labId: config.id,
511
- topology: "shared-world",
512
- roleCount: String(roleCount)
513
- },
514
- ...(subjectEnvNames.length > 0
515
- ? { envs: Object.fromEntries(subjectEnvNames.map((name) => [name, env[name]])) }
516
- : {}),
517
- resolution: sandboxResolution,
518
- dpi: 96,
519
- lifecycle: { onTimeout: "kill" }
520
- }, config.execution?.desktop?.template);
521
- sandboxId = desktop.sandboxId;
522
- // #358 salvage: durable id receipt the moment the plane sandbox exists.
523
- await appendSandboxReceipt(runPaths, { at: new Date().toISOString(), laneId: "subject", sandboxId });
524
- if (hooks.prepareDesktop) {
525
- await hooks.prepareDesktop(desktop);
526
- }
527
- const screenGeometry = await inspectDesktopScreenGeometry({
528
- desktop,
529
- laneId: "shared-world",
530
- requestedScreen: sandboxResolution,
531
- requestTimeoutMs
532
- });
533
- if (screenGeometry.verified) {
534
- sharedScreenGeometry = {
535
- screen: { ...sharedScreenGeometry.screen, verified: screenGeometry.verified }
536
- };
537
- }
538
- if (screenGeometry.warning) {
539
- warnings.push(screenGeometry.warning);
540
- sharedScreenGeometry = { ...sharedScreenGeometry, warnings: [screenGeometry.warning] };
541
- }
542
- if (screenGeometry.error)
543
- throw new Error(screenGeometry.error);
544
- // Provision the shared plane ONCE: clone + install/build + seed + serve + readiness probe
545
- // (clone route), or upload/extract the once-per-run packed archive + the SAME shared serve
546
- // pipeline (local-tree route). One stderr line per phase boundary by default; hooks.onPhase
547
- // (DI seam, mirrors CuaActorLabHooks) overrides it so tests capture instead of writing to
548
- // real stderr.
549
- const onSubjectPhase = hooks.onPhase ?? ((event) => {
550
- process.stderr.write(`humanish shared-world: ${event.message}${event.durationMs === undefined ? "" : ` (${event.durationMs}ms)`}\n`);
551
- });
552
- if (localTreeRoute) {
553
- await provisionLocalTreeSubject(desktop, {
554
- archiveBuffer: localTreeArchiveBuffer,
555
- serve,
556
- ...(config.subject.state === undefined ? {} : { state: config.subject.state }),
557
- requestTimeoutMs,
558
- scrub: scrubKnownValues,
559
- onStateStep: (record) => { stateStepRecords.push(record); },
560
- onPhase: onSubjectPhase,
561
- ...timers
562
- });
563
- }
564
- else {
565
- subjectCommit = await provisionCloneSubject(desktop, {
566
- repo: subjectRepo,
567
- depth: config.subject.clone?.depth ?? 1,
568
- serve,
569
- ...(config.subject.state === undefined ? {} : { state: config.subject.state }),
570
- hasGithubToken,
571
- requestTimeoutMs,
572
- scrub: scrubKnownValues,
573
- onCommit: (commit) => { subjectCommit = commit; },
574
- onStateStep: (record) => { stateStepRecords.push(record); },
575
- onPhase: onSubjectPhase,
576
- ...timers
577
- });
578
- }
579
- // Baseline checkpoint (before any role acts).
580
- baselineCheckpoint = await runCheckpointSnapshot({
581
- desktop,
582
- snapshotIndex: 0,
583
- name: "cp-baseline",
584
- checkpoints,
585
- prevDigest: undefined,
586
- scrub: scrubKnownValues,
587
- requestTimeoutMs,
588
- timers
589
- });
590
- let prevDigest = baselineCheckpoint.digest;
591
- // Sequential per-role loop (DECLARED order). A HARNESS error blocks the REMAINING roles
592
- // (the shared-state premise is broken); a MISSION failure is data, never trips fail-fast.
593
- for (const [index, spec] of roleSpecs.entries()) {
594
- if (failFastReason || budgetBlockedReason) {
595
- roleOutcomes.push({
596
- spec,
597
- screenshots: [],
598
- skippedReason: `skipped: ${failFastReason ?? budgetBlockedReason}`,
599
- noEngagement: false,
600
- harnessError: false
601
- });
602
- continue;
603
- }
604
- const screenshots = [];
605
- const writeScreenshot = makeLaneWriteScreenshot(runPaths, { screenshotDir: spec.screenshotDir }, screenshots);
606
- let session;
607
- let sessionError;
608
- let desktopBrowser;
609
- let launchedBrowserFamily = "unknown";
610
- let browserLaunchIdentity;
611
- let browserLaunched = false;
612
- let initialBrowserGeometry;
613
- let browserWindowId;
614
- let browserTargetId;
615
- let desktopGeometry = sharedScreenGeometry;
616
- try {
617
- // Fresh isolated browser profile per seat, opened at the role's same-origin loopback entry.
618
- const browserLaunch = await launchSeatBrowser(desktop, {
619
- ...(config.execution?.desktop?.browser === undefined ? {} : { browserPreference: config.execution.desktop.browser }),
620
- profileDir: spec.profileDir,
621
- seatUrl: spec.seatUrl,
622
- requestTimeoutMs
623
- });
624
- desktopBrowser = browserLaunch.evidence;
625
- launchedBrowserFamily = browserLaunch.family;
626
- browserLaunchIdentity = browserLaunch.identity;
627
- browserLaunched = true;
628
- await desktop.wait(BROWSER_SETTLE_MS).catch(() => undefined);
629
- const browserGeometry = await captureDesktopBrowserGeometry({
630
- desktop,
631
- browserFamily: launchedBrowserFamily,
632
- ...(browserLaunchIdentity === undefined ? {} : { launchIdentity: browserLaunchIdentity }),
633
- laneId: spec.roleId,
634
- targetUrl: spec.seatUrl,
635
- requestedScreen: sandboxResolution,
636
- requestTimeoutMs
637
- });
638
- initialBrowserGeometry = browserGeometry;
639
- browserWindowId = browserGeometry.browserWindowId;
640
- browserTargetId = browserGeometry.browserTargetId;
641
- if (browserGeometry.unusable !== undefined) {
642
- throw new Error(`HUMANISH_CUA_LAB_DEVICE_GEOMETRY: ${browserGeometry.unusable} Participant actions were not started.`);
643
- }
644
- const sessionOptions = {
645
- ...(caps?.maxUsd === undefined ? {} : {
646
- maxUsd: caps.maxUsd,
647
- estimateTurnCostUsd: (usage) => estimateActorCost(usage, capModelId).estimatedCostUsd
648
- }),
649
- ...(caps?.maxUsd === undefined && runBudget === undefined ? {} : { requireReportedUsageForSpendCap: true }),
650
- ...(runBudget === undefined ? {} : {
651
- overRunBudget: (usage) => noteModelEstimate(spec.roleId, estimateActorCost(usage, capModelId).estimatedCostUsd) ?? null
652
- }),
653
- instructions: spec.instructions,
654
- persona: spec.persona,
655
- timeoutMs,
656
- openai: {
657
- apiKey: openaiApiKey,
658
- ...(config.actors[0]?.model ? { model: config.actors[0].model } : {}),
659
- ...(spec.reasoningEffort === undefined ? {} : { reasoningEffort: spec.reasoningEffort }),
660
- ...(config.actors[0]?.maxOutputTokens === undefined ? {} : { maxOutputTokens: config.actors[0].maxOutputTokens })
661
- },
662
- desktop: desktop,
663
- ...(launchedBrowserFamily === "chromium"
664
- ? {
665
- executorOptions: {
666
- observeBrowserState: makeChromeBrowserStateObserver(desktop, requestTimeoutMs, {
667
- ...(browserLaunchIdentity?.cdpPort === undefined ? {} : { cdpPort: browserLaunchIdentity.cdpPort }),
668
- ...(browserLaunchIdentity?.profileDir === undefined ? {} : { profileDir: browserLaunchIdentity.profileDir }),
669
- targetUrl: spec.seatUrl
670
- }, browserTargetId)
671
- }
672
- }
673
- : {}),
674
- redactScreenshots,
675
- scrubText: scrubKnownValues,
676
- writeScreenshot,
677
- ...(spec.stopWhen === undefined ? {} : { stopWhen: spec.stopWhen }),
678
- ...(spec.dwell === undefined ? {} : { dwell: spec.dwell })
679
- };
680
- session = await runSession(sessionOptions);
681
- }
682
- catch (error) {
683
- sessionError = redactText(scrubKnownValues(toErrorMessage(error)));
684
- }
685
- if (browserLaunched) {
686
- const finalGeometry = await captureDesktopBrowserGeometry({
687
- desktop,
688
- browserFamily: launchedBrowserFamily,
689
- ...(browserLaunchIdentity === undefined ? {} : { launchIdentity: browserLaunchIdentity }),
690
- ...(browserWindowId === undefined ? {} : { browserWindowId }),
691
- ...(browserTargetId === undefined ? {} : { browserTargetId }),
692
- laneId: spec.roleId,
693
- targetUrl: spec.seatUrl,
694
- requestedScreen: sandboxResolution,
695
- requestTimeoutMs,
696
- pagePreference: "active",
697
- resize: false
698
- }).catch((error) => ({
699
- warnings: [`Final browser geometry measurement failed for lane ${spec.roleId}: ${redactText(scrubKnownValues(toErrorMessage(error)))}`]
700
- }));
701
- // Chosen capture rule (mirrors runCuaLane): seat-end-if-it-measured-anything, else
702
- // seat-open. A seat-end capture that measured EITHER field wins whole, so a partial
703
- // seat-end capture omits fields the seat-open capture had (honest omission); only a
704
- // seat-end capture that measured NOTHING falls back to the seat-open capture.
705
- const chosenGeometry = finalGeometry.browserWindow !== undefined || finalGeometry.viewport !== undefined
706
- ? finalGeometry
707
- : initialBrowserGeometry ?? finalGeometry;
708
- const geometryWarnings = [...new Set([...(initialBrowserGeometry?.warnings ?? []), ...chosenGeometry.warnings].map((warning) => scrubKnownValues(warning)))];
709
- warnings.push(...geometryWarnings);
710
- desktopGeometry = {
711
- ...sharedScreenGeometry,
712
- ...(chosenGeometry.browserWindow === undefined ? {} : { browserWindow: chosenGeometry.browserWindow }),
713
- ...(chosenGeometry.viewport === undefined ? {} : { viewport: chosenGeometry.viewport }),
714
- ...((sharedScreenGeometry.warnings?.length ?? 0) + geometryWarnings.length === 0
715
- ? {}
716
- : { warnings: [...(sharedScreenGeometry.warnings ?? []), ...geometryWarnings] })
717
- };
718
- // End THIS seat's browser now that its turn (and its final geometry capture) is done:
719
- // every role shares the ONE desktop, so this is the per-seat identity boundary. Runs
720
- // after the final seat too. Bounded + best-effort: a failure degrades to an explicit
721
- // warning (the run continues), never a hang.
722
- try {
723
- await desktop.commands.run(buildSeatBrowserTerminationCommand(browserLaunchIdentity?.processId, spec.profileDir), { requestTimeoutMs, timeoutMs: SEAT_BROWSER_TERMINATION_TIMEOUT_MS });
724
- }
725
- catch (error) {
726
- warnings.push(`Seat browser termination failed for role ${spec.roleId} (run continues; the seat's browser may remain open on the shared desktop): ${redactText(scrubKnownValues(toErrorMessage(error)))}`);
727
- }
728
- }
729
- if (session) {
730
- session.trace.estimatedCost = estimateActorCostForExecution(session.trace.tokenUsage, session.trace.ids.model, session.trace.executionProfile);
731
- // A per-seat stop can occur before the shared callback. Closing-report usage is also
732
- // part of this participant's total, so reconcile the final trace before admitting a seat.
733
- budgetBlockedReason = noteModelEstimate(spec.roleId, session.trace.estimatedCost.estimatedCostUsd);
734
- if ((caps?.maxUsd !== undefined || runBudget !== undefined)
735
- && session.trace.ids.model?.trim().toLowerCase() !== capModelId.trim().toLowerCase()) {
736
- // A custom session owns its provider. We cannot retrospectively enforce the declared
737
- // rate against a different model, or rewrite its already-recorded participant outcome.
738
- sessionError = `Role "${spec.roleId}" returned a model identity that differs from the declared cap model; model-spend enforcement cannot be established. The original participant trace and its returned-model estimate are retained; later participants will not start.`;
739
- warnings.push(sessionError);
740
- }
741
- if (runBudget && (session.trace.estimatedCost.estimatedCostUsd === null
742
- || session.trace.interactionUsageIncomplete === true || session.trace.debrief?.usageReported === false)) {
743
- budgetBlockedReason = `study model budget is unknown after role "${spec.roleId}" because provider usage was unavailable; subsequent sequential participants will not start`;
744
- }
745
- await writeContainedOutputFile(runPaths, spec.traceArtifactPath, `${JSON.stringify(session.trace, null, 2)}\n`, "utf8");
746
- if (session.trace.redaction.screenshots === "raw") {
747
- warnings.push("Screenshots are full-fidelity (raw) for local use — the bundle stays in gitignored .humanish and nothing scans these pixels; review them before sharing anywhere. Set policies.redactScreenshots: true to blur a share-as-is bundle.");
748
- }
749
- }
750
- const noEngagement = session !== undefined
751
- && session.completionReason === "goal_satisfied"
752
- && (session.trace.counts.actions ?? 0) === 0
753
- && (session.trace.counts.messages ?? 0) === 0;
754
- if (noEngagement) {
755
- warnings.push(`Role ${spec.roleId} returned goal_satisfied with ZERO actions and ZERO messages — likely a blank/still-loading screen; NOT counted as a pass.`);
756
- }
757
- const harnessError = sessionError !== undefined || session?.completionReason === "harness_error";
758
- // Checkpoint AFTER this role's turn (the interaction-proof snapshot). Runs even on a
759
- // harness-errored turn (the probe is read-only state, independent of the browser seat).
760
- const afterCheckpoint = await runCheckpointSnapshot({
761
- desktop,
762
- snapshotIndex: index + 1,
763
- name: `cp-after-${spec.roleId}`,
764
- checkpoints,
765
- prevDigest,
766
- scrub: scrubKnownValues,
767
- requestTimeoutMs,
768
- timers
769
- });
770
- prevDigest = afterCheckpoint.digest;
771
- roleOutcomes.push({
772
- spec,
773
- ...(session ? { session } : {}),
774
- ...(sessionError === undefined ? {} : { sessionError }),
775
- screenshots,
776
- ...(desktopBrowser === undefined ? {} : { desktopBrowser }),
777
- desktopGeometry,
778
- noEngagement,
779
- harnessError,
780
- afterCheckpoint
781
- });
782
- if (harnessError && !failFastReason) {
783
- failFastReason = sessionError ?? `role "${spec.roleId}" ended in a harness error — the shared-state premise is broken (fail-fast)`;
784
- }
785
- }
786
- }
787
- catch (error) {
788
- runFailed = true;
789
- warnings.push(`Shared-world run failed before completion: ${redactText(scrubKnownValues(toErrorMessage(error)))}`);
790
- }
791
- finally {
792
- // ONE teardown BY exact sandboxId — NEVER Sandbox.list (the 2026-06-16 prod-incident rail).
793
- if (desktop && desktopModule) {
794
- const anyRoleFailed = runFailed
795
- || failFastReason !== undefined
796
- || roleOutcomes.some((outcome) => outcome.harnessError || outcome.sessionError !== undefined);
797
- // Each route's own keep flag gates its own run only: a clone.keep can never leak into a
798
- // local-tree run's teardown decision, and vice versa (mirrors runCuaLane's keepReason).
799
- const keepReason = config.subject.clone?.keep === true
800
- ? "subject.clone.keep"
801
- : config.subject.localTree?.keep === true
802
- ? "subject.localTree.keep"
803
- : undefined;
804
- const keepForDebug = keepReason !== undefined && anyRoleFailed;
805
- if (keepForDebug) {
806
- warnings.push(`Sandbox ${desktop.sandboxId} kept for debugging (${keepReason} on failure); reclaim it via E2B or it will be killed on its server-side timeout.`);
807
- }
808
- else if (typeof desktopModule.Sandbox.kill === "function") {
809
- try {
810
- await desktopModule.Sandbox.kill(desktop.sandboxId, { requestTimeoutMs: 60_000 });
811
- killed = true;
812
- }
813
- catch (error) {
814
- warnings.push(`Sandbox teardown failed (server-side kill-on-timeout will reclaim it): ${redactText(scrubKnownValues(toErrorMessage(error)))}`);
815
- }
816
- }
817
- else {
818
- warnings.push("Installed @e2b/desktop SDK does not expose Sandbox.kill; server-side kill-on-timeout will reclaim the sandbox.");
819
- }
820
- }
821
- }
822
- }
823
- // Subject provenance (invariant 5): the ONE shared plane. Local-tree carries archiveSha256 (the
824
- // pin - one archive, so no per-lane unanimity math is needed, unlike the cua fan-out route) plus
825
- // the host-side commit/dirty when the packed root was a git work tree; clone carries repo/commit
826
- // as before. Mirrors laneSubjectProjection's local-tree branch in cua-actor-lab.ts.
827
- const subjectState = resolveSubjectState({
828
- declared: config.subject.state,
829
- dryRun,
830
- executed: stateStepRecords
831
- });
832
- const planeCommit = localTreeRoute ? localTreeArchive?.git?.commit : subjectCommit;
833
- const subject = localTreeRoute
834
- ? {
835
- source: "local-tree",
836
- ...(localTreeArchive === undefined ? {} : { archiveSha256: localTreeArchive.archiveSha256 }),
837
- ...(planeCommit === undefined ? {} : { commit: planeCommit }),
838
- ...(localTreeArchive?.git === undefined ? {} : { dirty: localTreeArchive.git.dirty }),
839
- envNames: subjectEnvNames,
840
- state: subjectState
841
- }
842
- : {
843
- source: "clone",
844
- repo: publicRepo,
845
- ...(subjectCommit === undefined ? {} : { commit: subjectCommit }),
846
- envNames: subjectEnvNames,
847
- state: subjectState
848
- };
849
- const bundle = buildSharedWorldBundle({
850
- ...(options.lab === undefined ? {} : { lab: options.lab }),
851
- config,
852
- descriptor,
853
- createdAt,
854
- dryRun,
855
- runId,
856
- source,
857
- roleSpecs,
858
- roleOutcomes,
859
- desktopAllocated: sandboxId !== undefined,
860
- desktopLifetimeComplete: killed,
861
- baselineCheckpoint,
862
- subject,
863
- sandboxResolution,
864
- sandboxPreset,
865
- desktopGeometry: sharedScreenGeometry,
866
- seedDigest: seedRecipeDigest(config),
867
- ...(planeCommit === undefined ? {} : { subjectCommit: planeCommit }),
868
- ...(failFastReason === undefined ? {} : { failFastReason })
869
- });
870
- const adapterWarnings = [];
871
- const scorerResult = await applyBrowserAdapterHooks({
872
- hooks,
873
- bundle,
874
- context: {
875
- bundle,
876
- runDir: physicalArtifactRoot,
877
- labId: config.id,
878
- runId,
879
- actor: descriptor.id,
880
- backend: "shared-world",
881
- dryRun,
882
- laneCount: roleSpecs.length
883
- },
884
- sanitize: (text) => redactText(scrubKnownValues(text)),
885
- warnings: adapterWarnings,
886
- hookLabel: "sharedWorldHooks",
887
- ...(options.scorerProvenance === undefined ? {} : { scorerProvenance: options.scorerProvenance })
888
- });
889
- await validatePreparedRunArtifactPaths(runPaths);
890
- await writeContainedOutputFile(runPaths, "run.json", `${JSON.stringify(bundle, null, 2)}\n`, "utf8");
891
- // Finalize identity+liveness from the bundle just written; a throw before this leaves the record
892
- // stale, which reads as interrupted rather than as a false outcome (#455).
893
- await runStatus.finish({
894
- ...(bundle.review?.verdict === undefined ? {} : { verdict: bundle.review.verdict }),
895
- ...(bundle.review?.participants === undefined
896
- ? {}
897
- : {
898
- participants: {
899
- total: bundle.review.participants.total,
900
- reachedGoal: bundle.review.participants.reachedGoal,
901
- ...(bundle.review.participants.reportedFriction === undefined
902
- ? {}
903
- : { reportedFriction: bundle.review.participants.reportedFriction })
904
- }
905
- }),
906
- ...(bundle.cost?.estimatedTotalUsd === undefined ? {} : { estimatedCostUsd: bundle.cost.estimatedTotalUsd })
907
- });
908
- await writeContainedOutputFile(runPaths, "review.json", `${JSON.stringify(bundle.review, null, 2)}\n`, "utf8");
909
- await writeContainedOutputFile(runPaths, "review.md", renderSharedWorldReviewMarkdown(bundle), "utf8");
910
- await writeContainedOutputFile(runPaths, "events.ndjson", `${bundle.events.map((event) => JSON.stringify(event)).join("\n")}\n`, "utf8");
911
- await writePreparedRunLatestPointer(runPaths, `${JSON.stringify({ schema: "humanish.latest-run.v1", runId, path: runPaths.relativeRunRoot, updatedAt: createdAt }, null, 2)}\n`, "utf8");
912
- const observer = await render(cwd, runId, { open: options.open === true });
913
- const roleOk = (outcome) => {
914
- return sharedWorldRoleOutcomeOk(outcome, dryRun);
915
- };
916
- const allRolesOk = roleSpecs.every((_, index) => roleOk(roleOutcomes[index]));
917
- const adapterFailure = adapterScoreFailureMessage(bundle);
918
- const ok = observer.ok && allRolesOk && failFastReason === undefined && adapterFailure === undefined && scorerResult.declaredVerdictFailure === undefined;
919
- const allWarnings = [...warnings, ...adapterWarnings, ...observer.warnings];
920
- const roles = roleSpecs.map((spec, index) => {
921
- const outcome = roleOutcomes[index];
922
- const base = { id: spec.roleId, index: spec.roleIndex + 1, persona: spec.persona.id, profileDir: spec.profileDir };
923
- if (dryRun || !outcome) {
924
- return { ...base, status: "contract_proof_only", ok: dryRun };
925
- }
926
- if (outcome.skippedReason !== undefined) {
927
- return {
928
- ...base,
929
- status: "blocked",
930
- ok: false,
931
- skippedReason: outcome.skippedReason,
932
- error: { code: "HUMANISH_SHARED_WORLD_LAB_FAILED", message: outcome.skippedReason }
933
- };
934
- }
935
- const session = outcome.session;
936
- const thisOk = roleOk(outcome);
937
- return {
938
- ...base,
939
- status: session ? session.status : "failed",
940
- ok: thisOk,
941
- ...(session
942
- ? { session: { status: session.status, completionReason: session.completionReason, reason: session.reason, screenshots: outcome.screenshots.length } }
943
- : {}),
944
- ...(thisOk
945
- ? {}
946
- : {
947
- error: {
948
- code: "HUMANISH_SHARED_WORLD_LAB_FAILED",
949
- message: outcome.sessionError
950
- ?? (outcome.noEngagement
951
- ? "Role took no actions and produced no message (likely a blank/still-loading screen); not a credible goal_satisfied."
952
- : session?.completionReason === "harness_error"
953
- ? `Role seat ended with a harness error: ${session.reason}`
954
- : "Role did not produce a terminal session.")
955
- }
956
- })
957
- };
958
- });
959
- const sequence = roleOutcomes
960
- .filter((outcome) => outcome.skippedReason === undefined && outcome.afterCheckpoint !== undefined)
961
- .map((outcome) => outcome.spec.roleId);
962
- const errorResult = (() => {
963
- if (ok)
964
- return undefined;
965
- if (!observer.ok) {
966
- return { code: "HUMANISH_SHARED_WORLD_LAB_FAILED", message: observer.error?.message ?? "Observer failed for the shared-world run." };
967
- }
968
- if (adapterFailure !== undefined) {
969
- return { code: "HUMANISH_SHARED_WORLD_LAB_FAILED", message: adapterFailure };
970
- }
971
- const passed = roles.filter((role) => role.ok).length;
972
- return {
973
- code: "HUMANISH_SHARED_WORLD_LAB_FAILED",
974
- message: `Shared-world run failed: ${passed}/${roleCount} role(s) passed${failFastReason ? ` (fail-fast: ${failFastReason})` : ""}.`
975
- };
976
- })();
977
- return markFinalizedStudyResult({
978
- schema: SHARED_WORLD_LAB_SCHEMA,
979
- ok,
980
- cwd,
981
- labId: config.id,
982
- actor: descriptor.id,
983
- topology: "shared-world",
984
- roleCount,
985
- sequence,
986
- dryRun,
987
- runId,
988
- ...(sandboxId === undefined ? {} : { sandbox: { sandboxId, killed } }),
989
- subject,
990
- roles,
991
- observer,
992
- warnings: allWarnings,
993
- ...(errorResult === undefined ? {} : { error: errorResult })
994
- }, runPaths);
995
- }
996
- /** Project the shared-world run into a humanish.run-bundle.v1 with the sharedWorld evidence block. */
997
- export function buildSharedWorldBundle(args) {
998
- const { config, descriptor, createdAt, dryRun, roleSpecs, roleOutcomes } = args;
999
- const simulations = [];
1000
- const streams = [];
1001
- const events = [];
1002
- const appUrl = config.subject.serve?.url ?? "";
1003
- events.push({
1004
- id: "event-000-created",
1005
- at: createdAt,
1006
- level: "info",
1007
- type: "shared-world.run.created",
1008
- message: `Created shared-world run for ${config.id} (actor ${descriptor.id}, ${roleSpecs.length} role(s), ONE shared plane, sequential turns).`
1009
- });
1010
- // Human-readable plane label, byte-stable for the clone route: "clone of <repo>[@<commit>]".
1011
- // The local-tree route has no repo slug, so it labels the packed archive instead (archiveSha256
1012
- // + dirty/clean when the packed root was a git work tree).
1013
- const dryRunPlaneLabel = args.subject.source === "local-tree"
1014
- ? "packed working tree"
1015
- : `clone of ${args.subject.repo}`;
1016
- const livePlaneLabel = args.subject.source === "local-tree"
1017
- ? (args.subject.archiveSha256
1018
- ? `packed working tree (archiveSha256 ${args.subject.archiveSha256}${args.subject.dirty === true ? ", dirty working tree" : args.subject.dirty === false ? ", clean working tree" : ""})`
1019
- : "packed working tree (archive digest unresolved; provisioning failed before resolution)")
1020
- : `clone of ${args.subject.repo}${args.subjectCommit ? `@${args.subjectCommit}` : ""}`;
1021
- events.push({
1022
- id: "event-001-plane",
1023
- at: createdAt,
1024
- level: "info",
1025
- type: "shared-world.plane.provenance",
1026
- message: dryRun
1027
- ? `Shared plane declared: ${dryRunPlaneLabel}, served at ${appUrl} in-sandbox (dry-run contract; nothing ${args.subject.source === "local-tree" ? "packed" : "cloned"}). Seed recipe ${args.seedDigest}; env names: ${args.subject.envNames?.join(", ") || "none"} (values never persisted).`
1028
- : `Shared plane: ${livePlaneLabel}, served at ${appUrl} in-sandbox; seed recipe ${args.seedDigest}; env names: ${args.subject.envNames?.join(", ") || "none"} (values never persisted).`,
1029
- simId: roleSpecs[0]?.simId ?? "sim-001",
1030
- streamId: roleSpecs[0]?.streamId ?? "stream-001"
1031
- });
1032
- let eventSeq = 2;
1033
- const nextEventId = (suffix) => `event-${String(eventSeq++).padStart(3, "0")}-${suffix}`;
1034
- roleSpecs.forEach((spec, index) => {
1035
- const outcome = roleOutcomes[index];
1036
- const session = outcome?.session;
1037
- const desktopGeometry = outcome?.desktopGeometry ?? args.desktopGeometry ?? {
1038
- screen: { requested: { width: args.sandboxResolution[0], height: args.sandboxResolution[1] } }
1039
- };
1040
- const screenshots = outcome?.screenshots ?? [];
1041
- const lastScreenshot = screenshots[screenshots.length - 1];
1042
- const status = outcome?.skippedReason !== undefined
1043
- ? "blocked"
1044
- : session
1045
- ? session.status
1046
- : outcome?.sessionError
1047
- ? "failed"
1048
- : "contract_proof_only";
1049
- const reason = outcome?.skippedReason
1050
- ?? session?.reason
1051
- ?? outcome?.sessionError
1052
- ?? "Contract role only: dry-run produced the evidence shape without launching a desktop or spending provider tokens.";
1053
- const traceScreenshotMode = session?.trace.redaction.screenshots;
1054
- const screenshotMode = traceScreenshotMode === "raw" || traceScreenshotMode === "blurred"
1055
- ? traceScreenshotMode
1056
- : config.policies?.redactScreenshots === true ? "blurred" : "raw";
1057
- simulations.push({
1058
- id: spec.simId,
1059
- index: index + 1,
1060
- personaId: spec.persona.id,
1061
- scenarioId: `shared-world-${config.id}`,
1062
- status,
1063
- streamKind: "browser",
1064
- mode: "browser-sim",
1065
- progress: 100,
1066
- currentStep: reason,
1067
- summary: session
1068
- ? `Role ${spec.roleId} (${spec.persona.id}): session ended with ${session.completionReason}.`
1069
- : outcome?.skippedReason !== undefined
1070
- ? `Role ${spec.roleId} ${outcome.skippedReason}.`
1071
- : outcome?.sessionError
1072
- ? `Role ${spec.roleId} failed before a terminal session verdict: ${outcome.sessionError}`
1073
- : `Contract role ${spec.roleId} (${spec.persona.id}) for ${descriptor.id} against the shared plane at ${appUrl}.`,
1074
- streamIds: [spec.streamId],
1075
- startedAt: createdAt,
1076
- updatedAt: createdAt
1077
- });
1078
- streams.push({
1079
- id: spec.streamId,
1080
- simId: spec.simId,
1081
- ...(spec.assignment === undefined ? {} : { assignment: participantAssignment(spec.assignment) }),
1082
- kind: "browser",
1083
- label: `Shared-world role ${spec.roleId} — ${config.id}`,
1084
- status,
1085
- transport: "snapshot",
1086
- updatedAt: createdAt,
1087
- embed: lastScreenshot
1088
- ? { kind: "screenshot", url: lastScreenshot, title: `Shared desktop, role ${spec.roleId} (${screenshotMode})` }
1089
- : { kind: "placeholder", title: `Shared desktop, role ${spec.roleId}` },
1090
- ...(desktopGeometry.viewport === undefined
1091
- ? {}
1092
- : {
1093
- viewport: {
1094
- width: desktopGeometry.viewport.width,
1095
- height: desktopGeometry.viewport.height,
1096
- deviceScaleFactor: desktopGeometry.viewport.deviceScaleFactor,
1097
- isMobile: args.sandboxPreset.isMobile
1098
- }
1099
- }),
1100
- desktopGeometry,
1101
- ui: {
1102
- route: spec.seatUrl,
1103
- intent: `Watch role ${spec.roleId} (${spec.persona.id}) drive the SHARED app (one plane; sequential turn).`,
1104
- state: reason,
1105
- ...(session ? { actorStatus: session.status } : {}),
1106
- ...(lastScreenshot ? { screenshotUrl: lastScreenshot } : {})
1107
- },
1108
- ...(session ? { actor: session.trace } : {}),
1109
- artifacts: [
1110
- { label: "run bundle", path: "run.json", kind: "bundle" },
1111
- { label: "review", path: "review.md", kind: "review" },
1112
- { label: "events", path: "events.ndjson", kind: "events" },
1113
- ...(session
1114
- ? [{ label: `role ${spec.roleId} actor trace`, path: spec.traceArtifactPath, kind: "trace" }]
1115
- : []),
1116
- ...screenshots.map((screenshot, screenshotIndex) => ({
1117
- label: `role ${spec.roleId} screenshot ${String(screenshotIndex + 1).padStart(2, "0")} (${screenshotMode})`,
1118
- path: screenshot,
1119
- kind: "screenshot"
1120
- }))
1121
- ]
1122
- });
1123
- // Per-role session event.
1124
- if (session) {
1125
- events.push({
1126
- id: nextEventId(`session-${spec.roleId}`),
1127
- at: createdAt,
1128
- level: session.status === "passed" ? "info" : "warn",
1129
- type: `shared-world.session.${session.completionReason}`,
1130
- message: `Role ${spec.roleId}: ${session.status} — ${session.reason}`,
1131
- simId: spec.simId,
1132
- streamId: spec.streamId
1133
- });
1134
- }
1135
- else if (outcome?.skippedReason !== undefined) {
1136
- events.push({
1137
- id: nextEventId(`blocked-${spec.roleId}`),
1138
- at: createdAt,
1139
- level: "warn",
1140
- type: "shared-world.session.blocked",
1141
- message: `Role ${spec.roleId} ${outcome.skippedReason}.`,
1142
- simId: spec.simId,
1143
- streamId: spec.streamId
1144
- });
1145
- }
1146
- else if (outcome?.sessionError) {
1147
- events.push({
1148
- id: nextEventId(`session-error-${spec.roleId}`),
1149
- at: createdAt,
1150
- level: "error",
1151
- type: "shared-world.session.error",
1152
- message: `Role ${spec.roleId}: ${outcome.sessionError}`,
1153
- simId: spec.simId,
1154
- streamId: spec.streamId
1155
- });
1156
- }
1157
- else {
1158
- events.push({
1159
- id: nextEventId(`contract-${spec.roleId}`),
1160
- at: createdAt,
1161
- level: "info",
1162
- type: "shared-world.contract.ready",
1163
- message: `Role ${spec.roleId}: dry-run contract role ready; switch scenario.mode to live for a real shared-world session.`,
1164
- simId: spec.simId,
1165
- streamId: spec.streamId
1166
- });
1167
- }
1168
- // A custom session can return a valid actor trace while orchestration fails (for example,
1169
- // a capped model mismatch). Preserve the actor and record the wrapper failure separately.
1170
- if (session && outcome?.sessionError) {
1171
- events.push({
1172
- id: nextEventId(`session-error-${spec.roleId}`), at: createdAt, level: "error",
1173
- type: "shared-world.session.error", message: outcome.sessionError,
1174
- simId: spec.simId, streamId: spec.streamId
1175
- });
1176
- }
1177
- for (const warning of desktopGeometry.warnings ?? []) {
1178
- events.push({
1179
- id: nextEventId(`geometry-warning-${spec.roleId}`),
1180
- at: createdAt,
1181
- level: "warn",
1182
- type: "shared-world.geometry.warning",
1183
- message: warning,
1184
- simId: spec.simId,
1185
- streamId: spec.streamId
1186
- });
1187
- }
1188
- });
1189
- // Build the shared-world evidence block (the timeline + plane + attribution ceiling).
1190
- const seedDigest = args.seedDigest;
1191
- const planeCommit = dryRun ? undefined : args.subjectCommit;
1192
- const timeline = [args.baselineCheckpoint];
1193
- const sequence = [];
1194
- if (dryRun) {
1195
- // Declared (contract) timeline: every role would take a turn; recipe-digest checkpoints, no delta.
1196
- roleSpecs.forEach((spec) => {
1197
- timeline.push({
1198
- kind: "turn",
1199
- roleId: spec.roleId,
1200
- simId: spec.simId,
1201
- streamId: spec.streamId,
1202
- seedDigest
1203
- });
1204
- timeline.push(declaredCheckpointSnapshot(`cp-after-${spec.roleId}`, config.subject.state?.checkpoint ?? []));
1205
- sequence.push(spec.roleId);
1206
- });
1207
- }
1208
- else {
1209
- // Executed timeline: only roles that took a turn (skipped roles contribute nothing).
1210
- for (const outcome of roleOutcomes) {
1211
- if (outcome.skippedReason !== undefined || outcome.afterCheckpoint === undefined) {
1212
- continue;
1213
- }
1214
- timeline.push({
1215
- kind: "turn",
1216
- roleId: outcome.spec.roleId,
1217
- simId: outcome.spec.simId,
1218
- streamId: outcome.spec.streamId,
1219
- ...(planeCommit === undefined ? {} : { commit: planeCommit }),
1220
- seedDigest
1221
- });
1222
- timeline.push(outcome.afterCheckpoint);
1223
- sequence.push(outcome.spec.roleId);
1224
- }
1225
- }
1226
- const sharedWorld = {
1227
- schema: SHARED_WORLD_SCHEMA,
1228
- topology: "shared-world",
1229
- topologyMode: "sequential",
1230
- roleCount: roleSpecs.length,
1231
- plane: {
1232
- ...(planeCommit === undefined ? {} : { commit: planeCommit }),
1233
- seedDigest,
1234
- envNames: args.subject.envNames ?? []
1235
- },
1236
- sequence,
1237
- timeline,
1238
- attributionLimits: ["sequential-only", "no-concurrent-races", "delta-attributed-to-turn-not-action"]
1239
- };
1240
- const firstSkipped = roleOutcomes.findIndex(outcome => outcome.skippedReason !== undefined);
1241
- const blocker = roleOutcomes[firstSkipped - 1];
1242
- if (!dryRun && firstSkipped > 0 && blocker?.afterCheckpoint) {
1243
- const actor = blocker.session?.trace;
1244
- const cause = blocker.sessionError !== undefined ? "session_error"
1245
- : actor?.interactionUsageIncomplete === true || actor?.debrief?.usageReported === false ? "usage_unreported"
1246
- : blocker.harnessError ? "harness_error"
1247
- : actor?.estimatedCost?.estimatedCostUsd === null ? "usage_unreported" : "study_spend_limit";
1248
- sharedWorld.skippedTail = {
1249
- afterRoleId: blocker.spec.roleId,
1250
- roles: roleOutcomes.slice(firstSkipped).map(({ spec }) => ({
1251
- roleId: spec.roleId, simId: spec.simId, streamId: spec.streamId
1252
- })),
1253
- cause,
1254
- ...(cause === "study_spend_limit" ? {
1255
- maxTotalUsd: config.execution.caps.maxTotalUsd,
1256
- estimatedTotalUsd: roleOutcomes.slice(0, firstSkipped)
1257
- .reduce((total, outcome) => total + (outcome.session?.trace.estimatedCost?.estimatedCostUsd ?? 0), 0)
1258
- } : {})
1259
- };
1260
- }
1261
- events.push({
1262
- id: nextEventId("timeline"),
1263
- at: createdAt,
1264
- level: "info",
1265
- type: "shared-world.timeline",
1266
- message: `Interaction timeline: ${timeline.length} entries (${sequence.length} turn(s) interleaved with checkpoints); deltas observed on ${timeline.filter((entry) => entry.kind === "checkpoint" && entry.deltaFromPrev).map((entry) => entry.name).join(", ") || "none"}. Attribution ceiling: ${sharedWorld.attributionLimits.join(", ")}.`
1267
- });
1268
- if (args.failFastReason) {
1269
- events.push({
1270
- id: nextEventId("fail-fast"),
1271
- at: createdAt,
1272
- level: "warn",
1273
- type: "shared-world.fail-fast",
1274
- message: `Fail-fast: ${args.failFastReason}. Remaining roles were blocked; completed evidence is retained.`
1275
- });
1276
- }
1277
- // Worst-of review verdict across roles.
1278
- const verdict = dryRun
1279
- ? "contract_proof_only"
1280
- : (() => {
1281
- const allPassed = roleOutcomes.length === roleSpecs.length
1282
- && roleOutcomes.every((outcome) => sharedWorldRoleOutcomeOk(outcome, false));
1283
- if (allPassed)
1284
- return "pass";
1285
- const anyFail = roleOutcomes.some((outcome) => outcome.skippedReason !== undefined
1286
- || outcome.harnessError
1287
- || outcome.noEngagement
1288
- || outcome.sessionError !== undefined
1289
- || outcome.session === undefined
1290
- || outcome.session.status === "failed"
1291
- || outcome.session.status === "blocked");
1292
- if (anyFail)
1293
- return "fail";
1294
- if (roleOutcomes.some((outcome) => outcome.session?.status === "timed_out"))
1295
- return "timed_out";
1296
- return "fail";
1297
- })();
1298
- const passedRoles = roleOutcomes.filter((outcome) => sharedWorldRoleOutcomeOk(outcome, dryRun)).length;
1299
- const configuredBrowser = config.execution?.desktop?.browser;
1300
- const resolvedBrowsers = roleOutcomes
1301
- .map((outcome) => outcome.desktopBrowser?.resolved)
1302
- .filter((value) => value !== undefined);
1303
- const unanimousResolvedBrowser = resolvedBrowsers.length > 0 && new Set(resolvedBrowsers).size === 1
1304
- ? resolvedBrowsers[0]
1305
- : undefined;
1306
- const review = {
1307
- schema: REVIEW_SCHEMA,
1308
- verdict,
1309
- summary: dryRun
1310
- ? `Dry-run shared-world contract: ${roleSpecs.length} role(s) declared against ONE plane (${descriptor.id}) at ${appUrl}; no desktop launched, $0 spend.`
1311
- : `Shared-world run (ONE plane, sequential): ${passedRoles}/${roleSpecs.length} role(s) reached a terminal, engaged verdict; ${timeline.filter((entry) => entry.kind === "checkpoint" && entry.deltaFromPrev).length} checkpoint delta(s) observed.`,
1312
- gaps: dryRun
1313
- ? ["Live shared-world session not yet run (dry-run contract only)."]
1314
- : roleOutcomes
1315
- .filter((outcome) => outcome.skippedReason !== undefined
1316
- || outcome.sessionError !== undefined
1317
- || outcome.noEngagement
1318
- || outcome.session === undefined
1319
- || outcome.session.status !== "passed")
1320
- .map((outcome) => `${outcome.spec.roleId}: ${outcome.skippedReason ?? outcome.sessionError ?? outcome.session?.reason ?? "did not pass"}`)
1321
- };
1322
- const anyRaw = roleOutcomes.some((outcome) => outcome.session?.trace.redaction.screenshots === "raw");
1323
- const ranLive = roleOutcomes.some((outcome) => outcome.session !== undefined || outcome.sessionError !== undefined);
1324
- // Sequential studies now retain model estimates. Desktop resources/lifetime have no measured
1325
- // cost on this route; include an unknown line so a model subtotal is never labeled a full total.
1326
- const cost = buildCuaCostSummary({
1327
- lanes: roleOutcomes.flatMap((outcome) => outcome.session
1328
- ? [{ laneId: outcome.spec.roleId, trace: outcome.session.trace }] : []),
1329
- ...(args.desktopAllocated ? { desktops: [{ minutes: undefined, observation: undefined,
1330
- lifetimeComplete: args.desktopLifetimeComplete === true }] } : {})
1331
- });
1332
- return {
1333
- schema: RUN_BUNDLE_SCHEMA,
1334
- runId: args.runId,
1335
- mode: dryRun ? "dry-run" : "live",
1336
- simCount: roleSpecs.length,
1337
- createdAt,
1338
- cwd: PUBLIC_TARGET_CWD,
1339
- ...(args.lab === undefined ? {} : { lab: args.lab }),
1340
- artifactRoot: path.join(".humanish", "runs", args.runId),
1341
- source: args.source,
1342
- persona: {
1343
- id: roleSpecs[0]?.persona.id ?? "shared-world-role",
1344
- name: `Shared-world roster (${roleSpecs.length} roles)`,
1345
- source: `lab:${config.id}`,
1346
- sourceDigest: roleSpecs[0]?.persona.promptDigest ?? seedDigest
1347
- },
1348
- scenario: {
1349
- id: `shared-world-${config.id}`,
1350
- title: config.title ?? `Shared-world: ${config.id}`,
1351
- goal: redactText(roleSpecs[0]?.evidenceInstructions ?? roleSpecs[0]?.instructions ?? "Shared-world sequential interaction."),
1352
- source: `lab:${config.id}`,
1353
- sourceDigest: roleSpecs[0]?.persona.promptDigest ?? seedDigest
1354
- },
1355
- lifecycle: [
1356
- {
1357
- at: createdAt,
1358
- event: "shared-world.run.created",
1359
- message: `Created shared-world run with ONE shared plane and ${roleSpecs.length} sequential role seats (actor ${descriptor.id}).`
1360
- }
1361
- ],
1362
- simulations,
1363
- streams,
1364
- events,
1365
- redaction: {
1366
- status: "passed",
1367
- notes: ranLive
1368
- ? anyRaw
1369
- ? "Typed text recorded as length only and reasoning/messages pass through text redaction. Some roles captured FULL-FIDELITY (raw) screenshots, retained for local use — NOT redacted for publishing; set policies.redactScreenshots: true to blur a share-as-is bundle. Checkpoints persist digest-only."
1370
- : "Typed text recorded as length only and reasoning/messages pass through text redaction. Screenshots are blurred at capture (policies.redactScreenshots: true) for a share-as-is bundle. Checkpoints persist digest-only."
1371
- : "Dry-run shared-world contract bundle: no desktop launched and no screenshots captured. Typed text is recorded as length only and reasoning/messages pass through text redaction whenever a session runs. Checkpoints persist digest-only."
1372
- },
1373
- artifacts: {
1374
- run: "run.json",
1375
- reviewJson: "review.json",
1376
- reviewMarkdown: "review.md",
1377
- observerData: "observer/observer-data.json",
1378
- events: "events.ndjson"
1379
- },
1380
- review,
1381
- ...(cost === undefined ? {} : { cost }),
1382
- feedbackCandidates: [],
1383
- // Custom desktop image provenance (the ONE shared plane launched on it); omitted on the default.
1384
- ...(config.execution?.desktop?.template === undefined ? {} : { desktopTemplate: config.execution.desktop.template }),
1385
- ...(configuredBrowser === undefined
1386
- ? {}
1387
- : { desktopBrowser: { requested: configuredBrowser, ...(unanimousResolvedBrowser === undefined ? {} : { resolved: unanimousResolvedBrowser }) } }),
1388
- subject: args.subject,
1389
- attributionClass: "shared-world",
1390
- sharedWorld
1391
- };
1392
- }
1393
- function sharedWorldRoleOutcomeOk(outcome, dryRun) {
1394
- if (dryRun)
1395
- return true;
1396
- if (!outcome || outcome.skippedReason !== undefined)
1397
- return false;
1398
- return outcome.session !== undefined
1399
- && outcome.session.status === "passed"
1400
- && outcome.session.completionReason !== "harness_error"
1401
- && outcome.sessionError === undefined
1402
- && !outcome.noEngagement;
1403
- }
1404
- function renderSharedWorldReviewMarkdown(bundle) {
1405
- const plane = bundle.events.find((event) => event.type === "shared-world.plane.provenance");
1406
- const timeline = bundle.events.find((event) => event.type === "shared-world.timeline");
1407
- return [
1408
- `# ${bundle.scenario.title}`,
1409
- "",
1410
- `- run: ${bundle.runId}`,
1411
- `- mode: ${bundle.mode}`,
1412
- `- attribution class: ${bundle.attributionClass ?? "isolated"}`,
1413
- `- topology: ${bundle.sharedWorld?.topology ?? "(none)"}`,
1414
- `- roles: ${bundle.sharedWorld?.roleCount ?? 0}; sequence: ${(bundle.sharedWorld?.sequence ?? []).join(" → ") || "(none)"}`,
1415
- `- verdict: ${bundle.review.verdict}`,
1416
- `- summary: ${bundle.review.summary}`,
1417
- ...(plane ? [`- plane: ${plane.message}`] : []),
1418
- ...(timeline ? [`- timeline: ${timeline.message}`] : []),
1419
- ...(bundle.sharedWorld ? [`- attribution limits: ${bundle.sharedWorld.attributionLimits.join(", ")}`] : []),
1420
- ...(bundle.review.gaps.length > 0 ? ["", "## Gaps", ...bundle.review.gaps.map((gap) => `- ${gap}`)] : []),
1421
- ""
1422
- ].join("\n");
1423
- }
1424
- //# sourceMappingURL=shared-world-lab.js.map