pi-agent-browser-native 0.9.3 → 0.9.5

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 (394) hide show
  1. package/CHANGELOG.md +106 -5
  2. package/README.md +58 -791
  3. package/dist/extensions/agent-browser/index.js +43101 -2031
  4. package/dist/extensions/agent-browser/lib/argv-descriptor.js +49 -26
  5. package/dist/extensions/agent-browser/lib/argv-grammar.js +82 -93
  6. package/dist/extensions/agent-browser/lib/bash-guard.js +129 -126
  7. package/dist/extensions/agent-browser/lib/batch-lifecycle.js +112 -51
  8. package/dist/extensions/agent-browser/lib/browser-execution-claim-codec.js +61 -0
  9. package/dist/extensions/agent-browser/lib/browser-execution-claim-storage.js +232 -0
  10. package/dist/extensions/agent-browser/lib/browser-execution-claims.js +202 -0
  11. package/dist/extensions/agent-browser/lib/browser-execution-identity.js +77 -0
  12. package/dist/extensions/agent-browser/lib/browser-journal-branch.js +98 -0
  13. package/dist/extensions/agent-browser/lib/browser-journal-contracts.js +1 -0
  14. package/dist/extensions/agent-browser/lib/browser-journal-projection.js +221 -0
  15. package/dist/extensions/agent-browser/lib/browser-journal-reader.js +89 -0
  16. package/dist/extensions/agent-browser/lib/browser-journal-replay.js +246 -0
  17. package/dist/extensions/agent-browser/lib/browser-journal.js +103 -394
  18. package/dist/extensions/agent-browser/lib/browser-legacy-pages.js +220 -0
  19. package/dist/extensions/agent-browser/lib/browser-legacy-projection.js +282 -0
  20. package/dist/extensions/agent-browser/lib/browser-legacy-types.js +1 -0
  21. package/dist/extensions/agent-browser/lib/browser-session-conversion-stream.js +217 -0
  22. package/dist/extensions/agent-browser/lib/browser-session-conversion.js +80 -335
  23. package/dist/extensions/agent-browser/lib/browser-transcript-contracts.js +35 -0
  24. package/dist/extensions/agent-browser/lib/browser-transcript-validation.js +166 -0
  25. package/dist/extensions/agent-browser/lib/browser-transcript.js +137 -82
  26. package/dist/extensions/agent-browser/lib/browser-value-parsing.js +15 -0
  27. package/dist/extensions/agent-browser/lib/command-capabilities.js +340 -0
  28. package/dist/extensions/agent-browser/lib/command-policy.js +107 -88
  29. package/dist/extensions/agent-browser/lib/command-taxonomy.js +49 -322
  30. package/dist/extensions/agent-browser/lib/config-policy.js +138 -343
  31. package/dist/extensions/agent-browser/lib/config-providers.js +71 -0
  32. package/dist/extensions/agent-browser/lib/config-validation.js +231 -0
  33. package/dist/extensions/agent-browser/lib/config.js +20 -8
  34. package/dist/extensions/agent-browser/lib/electron/cdp.js +20 -8
  35. package/dist/extensions/agent-browser/lib/electron/cleanup.js +128 -83
  36. package/dist/extensions/agent-browser/lib/electron/discovery-darwin.js +109 -0
  37. package/dist/extensions/agent-browser/lib/electron/discovery-desktop.js +136 -0
  38. package/dist/extensions/agent-browser/lib/electron/discovery-evidence.js +90 -0
  39. package/dist/extensions/agent-browser/lib/electron/discovery-linux.js +93 -0
  40. package/dist/extensions/agent-browser/lib/electron/discovery-packages.js +162 -0
  41. package/dist/extensions/agent-browser/lib/electron/discovery-types.js +2 -0
  42. package/dist/extensions/agent-browser/lib/electron/discovery.js +140 -549
  43. package/dist/extensions/agent-browser/lib/electron/launch-monitor.js +102 -0
  44. package/dist/extensions/agent-browser/lib/electron/launch-process.js +209 -0
  45. package/dist/extensions/agent-browser/lib/electron/launch-types.js +2 -0
  46. package/dist/extensions/agent-browser/lib/electron/launch.js +261 -355
  47. package/dist/extensions/agent-browser/lib/executable-path.js +21 -12
  48. package/dist/extensions/agent-browser/lib/execution-cwd.js +35 -18
  49. package/dist/extensions/agent-browser/lib/fs-utils.js +1 -9
  50. package/dist/extensions/agent-browser/lib/input-modes/electron.js +162 -121
  51. package/dist/extensions/agent-browser/lib/input-modes/job.js +123 -317
  52. package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +116 -0
  53. package/dist/extensions/agent-browser/lib/input-modes/lookup-plan.js +132 -0
  54. package/dist/extensions/agent-browser/lib/input-modes/lookup-redaction.js +57 -0
  55. package/dist/extensions/agent-browser/lib/input-modes/lookup-source-evidence.js +151 -0
  56. package/dist/extensions/agent-browser/lib/input-modes/lookup-workspace.js +142 -0
  57. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +58 -412
  58. package/dist/extensions/agent-browser/lib/input-modes/params.js +86 -40
  59. package/dist/extensions/agent-browser/lib/input-modes/qa-analysis.js +268 -0
  60. package/dist/extensions/agent-browser/lib/input-modes/qa-presentation.js +117 -0
  61. package/dist/extensions/agent-browser/lib/input-modes/script-child.js +396 -0
  62. package/dist/extensions/agent-browser/lib/input-modes/script-protocol.js +86 -0
  63. package/dist/extensions/agent-browser/lib/input-modes/script-types.js +1 -0
  64. package/dist/extensions/agent-browser/lib/input-modes/script-validation.js +60 -0
  65. package/dist/extensions/agent-browser/lib/input-modes/script.js +60 -409
  66. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +218 -128
  67. package/dist/extensions/agent-browser/lib/input-modes/shared.js +15 -4
  68. package/dist/extensions/agent-browser/lib/input-modes/types.js +56 -7
  69. package/dist/extensions/agent-browser/lib/json-schema.js +22 -10
  70. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +17 -5
  71. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +92 -425
  72. package/dist/extensions/agent-browser/lib/managed-session-posix-storage.js +58 -0
  73. package/dist/extensions/agent-browser/lib/managed-session-project-identity.js +244 -0
  74. package/dist/extensions/agent-browser/lib/managed-session-restore-context.js +84 -0
  75. package/dist/extensions/agent-browser/lib/managed-session-restore-policy.js +119 -0
  76. package/dist/extensions/agent-browser/lib/managed-session-restore-state.js +83 -0
  77. package/dist/extensions/agent-browser/lib/managed-session-restore.js +168 -300
  78. package/dist/extensions/agent-browser/lib/managed-session-snapshot-records.js +277 -0
  79. package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +128 -305
  80. package/dist/extensions/agent-browser/lib/managed-session-storage.js +56 -253
  81. package/dist/extensions/agent-browser/lib/native-confirmation.js +140 -0
  82. package/dist/extensions/agent-browser/lib/native-output.js +43 -9
  83. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +106 -59
  84. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-merge.js +14 -6
  85. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +109 -57
  86. package/dist/extensions/agent-browser/lib/orchestration/browser-run/browser-observation-result.js +82 -0
  87. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +164 -60
  88. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostic-values.js +31 -0
  89. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +152 -781
  90. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-observation.js +203 -0
  91. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-text-diagnostics.js +109 -0
  92. package/dist/extensions/agent-browser/lib/orchestration/browser-run/fill-diagnostics.js +119 -0
  93. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-action-recovery.js +147 -0
  94. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-actions.js +144 -0
  95. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-content.js +123 -0
  96. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-contracts.js +1 -0
  97. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-details.js +156 -0
  98. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-electron.js +187 -0
  99. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-evidence.js +39 -0
  100. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-missing-binary.js +89 -0
  101. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-recovery.js +97 -0
  102. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-redaction.js +106 -0
  103. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-timeout.js +110 -0
  104. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +41 -538
  105. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +199 -154
  106. package/dist/extensions/agent-browser/lib/orchestration/browser-run/interaction-diagnostics.js +290 -0
  107. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-close.js +167 -0
  108. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-inspection.js +108 -0
  109. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +127 -205
  110. package/dist/extensions/agent-browser/lib/orchestration/browser-run/native-helper-observation.js +65 -0
  111. package/dist/extensions/agent-browser/lib/orchestration/browser-run/observation-types.js +1 -0
  112. package/dist/extensions/agent-browser/lib/orchestration/browser-run/overlay-diagnostics.js +120 -0
  113. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +113 -30
  114. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +109 -28
  115. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter-data.js +150 -0
  116. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +147 -253
  117. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-rendered-text.js +147 -0
  118. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +59 -24
  119. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-artifacts.js +159 -0
  120. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-command.js +131 -0
  121. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-contracts.js +1 -0
  122. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-daemon.js +93 -0
  123. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-failure.js +42 -0
  124. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-guards.js +242 -0
  125. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-input.js +75 -0
  126. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-observations.js +92 -0
  127. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-selection.js +254 -0
  128. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-state.js +121 -0
  129. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-refs.js +130 -0
  130. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-resources.js +114 -0
  131. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-semantic.js +121 -0
  132. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-session-plan.js +222 -0
  133. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-timeouts.js +68 -0
  134. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +176 -1123
  135. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-analysis.js +191 -0
  136. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-confirmation.js +152 -0
  137. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-diagnostics.js +182 -0
  138. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-electron.js +150 -0
  139. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-contracts.js +1 -0
  140. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase-contracts.js +1 -0
  141. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase.js +115 -0
  142. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle.js +256 -0
  143. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed-contracts.js +1 -0
  144. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed.js +256 -0
  145. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase-contracts.js +1 -0
  146. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase.js +93 -0
  147. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native.js +113 -0
  148. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation-contracts.js +1 -0
  149. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation.js +316 -0
  150. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-ownership.js +28 -0
  151. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase-contracts.js +1 -0
  152. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase.js +142 -0
  153. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation-contracts.js +1 -0
  154. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation.js +333 -0
  155. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase-contracts.js +1 -0
  156. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase.js +71 -0
  157. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication.js +201 -0
  158. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-receipts.js +183 -0
  159. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-refs.js +200 -0
  160. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-tabs.js +142 -0
  161. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +18 -968
  162. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +23 -13
  163. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-receipt-reconciliation.js +198 -0
  164. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-contracts.js +1 -0
  165. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-presentation.js +154 -0
  166. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery.js +68 -151
  167. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-capture.js +14 -0
  168. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-observation.js +169 -46
  169. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-commands.js +130 -0
  170. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-electron.js +212 -0
  171. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-observations.js +61 -0
  172. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-outcomes.js +187 -0
  173. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-refs.js +169 -0
  174. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-tabs.js +228 -0
  175. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +77 -765
  176. package/dist/extensions/agent-browser/lib/orchestration/browser-run/text-visibility-diagnostics.js +182 -0
  177. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-diagnostics.js +256 -0
  178. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-progress.js +108 -0
  179. package/dist/extensions/agent-browser/lib/orchestration/code-artifact-observation.js +39 -0
  180. package/dist/extensions/agent-browser/lib/orchestration/code-image-observation.js +119 -0
  181. package/dist/extensions/agent-browser/lib/orchestration/electron-host/branch.js +93 -0
  182. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup-result.js +58 -0
  183. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup.js +78 -0
  184. package/dist/extensions/agent-browser/lib/orchestration/electron-host/contracts.js +1 -0
  185. package/dist/extensions/agent-browser/lib/orchestration/electron-host/discovery.js +106 -0
  186. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +48 -821
  187. package/dist/extensions/agent-browser/lib/orchestration/electron-host/policy.js +86 -0
  188. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-collection.js +68 -0
  189. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +169 -0
  190. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +182 -0
  191. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe.js +161 -0
  192. package/dist/extensions/agent-browser/lib/orchestration/electron-host/status.js +167 -0
  193. package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +22 -10
  194. package/dist/extensions/agent-browser/lib/orchestration/extension-artifact-preflight.js +211 -0
  195. package/dist/extensions/agent-browser/lib/orchestration/extension-artifacts.js +23 -0
  196. package/dist/extensions/agent-browser/lib/orchestration/extension-attachment-replay.js +99 -0
  197. package/dist/extensions/agent-browser/lib/orchestration/extension-branch-restore.js +275 -0
  198. package/dist/extensions/agent-browser/lib/orchestration/extension-code.js +280 -0
  199. package/dist/extensions/agent-browser/lib/orchestration/extension-command-admission.js +303 -0
  200. package/dist/extensions/agent-browser/lib/orchestration/extension-command-output.js +36 -0
  201. package/dist/extensions/agent-browser/lib/orchestration/extension-command-result.js +335 -0
  202. package/dist/extensions/agent-browser/lib/orchestration/extension-command-run.js +227 -0
  203. package/dist/extensions/agent-browser/lib/orchestration/extension-command-state.js +1 -0
  204. package/dist/extensions/agent-browser/lib/orchestration/extension-electron-ownership.js +204 -0
  205. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-locks.js +139 -0
  206. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-queue.js +24 -0
  207. package/dist/extensions/agent-browser/lib/orchestration/extension-host-coordination.js +98 -0
  208. package/dist/extensions/agent-browser/lib/orchestration/extension-host-run.js +295 -0
  209. package/dist/extensions/agent-browser/lib/orchestration/extension-intent-replay.js +41 -0
  210. package/dist/extensions/agent-browser/lib/orchestration/extension-invocation.js +7 -0
  211. package/dist/extensions/agent-browser/lib/orchestration/extension-lifecycle.js +102 -0
  212. package/dist/extensions/agent-browser/lib/orchestration/extension-managed-ownership.js +133 -0
  213. package/dist/extensions/agent-browser/lib/orchestration/extension-observation.js +120 -0
  214. package/dist/extensions/agent-browser/lib/orchestration/extension-prompt.js +180 -0
  215. package/dist/extensions/agent-browser/lib/orchestration/extension-recording.js +290 -0
  216. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-contracts.js +1 -0
  217. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-replay.js +269 -0
  218. package/dist/extensions/agent-browser/lib/orchestration/extension-result-state.js +113 -0
  219. package/dist/extensions/agent-browser/lib/orchestration/extension-runtime.js +146 -0
  220. package/dist/extensions/agent-browser/lib/orchestration/extension-script-leases.js +58 -0
  221. package/dist/extensions/agent-browser/lib/orchestration/extension-tool-boundary.js +62 -0
  222. package/dist/extensions/agent-browser/lib/orchestration/extension-version-check.js +54 -0
  223. package/dist/extensions/agent-browser/lib/orchestration/input-plan-types.js +1 -0
  224. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +261 -185
  225. package/dist/extensions/agent-browser/lib/orchestration/input-redaction.js +62 -0
  226. package/dist/extensions/agent-browser/lib/orchestration/native-config.js +144 -0
  227. package/dist/extensions/agent-browser/lib/orchestration/native-root-launch.js +77 -0
  228. package/dist/extensions/agent-browser/lib/orchestration/native-session-defaults.js +210 -157
  229. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  230. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +197 -99
  231. package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +199 -96
  232. package/dist/extensions/agent-browser/lib/owned-managed-session-context.js +55 -0
  233. package/dist/extensions/agent-browser/lib/page-target-batch.js +118 -0
  234. package/dist/extensions/agent-browser/lib/page-target-guards.js +50 -0
  235. package/dist/extensions/agent-browser/lib/page-target-navigation.js +104 -0
  236. package/dist/extensions/agent-browser/lib/page-target-validation.js +55 -246
  237. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  238. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +133 -68
  239. package/dist/extensions/agent-browser/lib/playbook.js +16 -12
  240. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  241. package/dist/extensions/agent-browser/lib/process-environment.js +13 -6
  242. package/dist/extensions/agent-browser/lib/process-errors.js +23 -0
  243. package/dist/extensions/agent-browser/lib/process-identity.js +47 -15
  244. package/dist/extensions/agent-browser/lib/process-socket-storage.js +256 -0
  245. package/dist/extensions/agent-browser/lib/process-stdout.js +74 -0
  246. package/dist/extensions/agent-browser/lib/process.js +145 -536
  247. package/dist/extensions/agent-browser/lib/prompt-artifacts.js +287 -0
  248. package/dist/extensions/agent-browser/lib/prompt-policy.js +15 -194
  249. package/dist/extensions/agent-browser/lib/read-command.js +41 -0
  250. package/dist/extensions/agent-browser/lib/read-confirmation.js +131 -68
  251. package/dist/extensions/agent-browser/lib/recording-reservations.js +118 -45
  252. package/dist/extensions/agent-browser/lib/redaction-fields.js +75 -0
  253. package/dist/extensions/agent-browser/lib/redaction-json.js +149 -0
  254. package/dist/extensions/agent-browser/lib/redaction-url.js +88 -0
  255. package/dist/extensions/agent-browser/lib/results/action-contracts.js +1 -0
  256. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +28 -271
  257. package/dist/extensions/agent-browser/lib/results/artifact-contracts.js +1 -0
  258. package/dist/extensions/agent-browser/lib/results/artifact-manifest-validation.js +133 -0
  259. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +96 -94
  260. package/dist/extensions/agent-browser/lib/results/artifact-recommendations.js +73 -0
  261. package/dist/extensions/agent-browser/lib/results/categories.js +111 -54
  262. package/dist/extensions/agent-browser/lib/results/confirmation.js +29 -13
  263. package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +62 -27
  264. package/dist/extensions/agent-browser/lib/results/electron-recommendations.js +83 -0
  265. package/dist/extensions/agent-browser/lib/results/envelope-decoding.js +48 -0
  266. package/dist/extensions/agent-browser/lib/results/envelope.js +90 -67
  267. package/dist/extensions/agent-browser/lib/results/evidence-contracts.js +1 -0
  268. package/dist/extensions/agent-browser/lib/results/failure-recommendations.js +180 -0
  269. package/dist/extensions/agent-browser/lib/results/network-routes.js +86 -45
  270. package/dist/extensions/agent-browser/lib/results/network.js +35 -12
  271. package/dist/extensions/agent-browser/lib/results/next-actions.js +49 -19
  272. package/dist/extensions/agent-browser/lib/results/presentation/artifact-files.js +320 -0
  273. package/dist/extensions/agent-browser/lib/results/presentation/artifact-format.js +138 -0
  274. package/dist/extensions/agent-browser/lib/results/presentation/artifact-images.js +113 -0
  275. package/dist/extensions/agent-browser/lib/results/presentation/artifact-verification.js +145 -0
  276. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +99 -555
  277. package/dist/extensions/agent-browser/lib/results/presentation/batch-contracts.js +1 -0
  278. package/dist/extensions/agent-browser/lib/results/presentation/batch-recording.js +118 -0
  279. package/dist/extensions/agent-browser/lib/results/presentation/batch-redaction.js +68 -0
  280. package/dist/extensions/agent-browser/lib/results/presentation/batch-rendering.js +135 -0
  281. package/dist/extensions/agent-browser/lib/results/presentation/batch-step.js +227 -0
  282. package/dist/extensions/agent-browser/lib/results/presentation/batch-summary.js +91 -0
  283. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +91 -460
  284. package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +9 -5
  285. package/dist/extensions/agent-browser/lib/results/presentation/command-presenters.js +216 -0
  286. package/dist/extensions/agent-browser/lib/results/presentation/common.js +26 -9
  287. package/dist/extensions/agent-browser/lib/results/presentation/content.js +86 -29
  288. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-a11y.js +67 -0
  289. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-health.js +79 -0
  290. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-identity.js +199 -0
  291. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-logs.js +75 -0
  292. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network-actions.js +216 -0
  293. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network.js +124 -0
  294. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-redaction.js +64 -0
  295. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-storage.js +209 -0
  296. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-stream.js +69 -0
  297. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-summary.js +222 -0
  298. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +103 -1052
  299. package/dist/extensions/agent-browser/lib/results/presentation/early-result.js +70 -0
  300. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +130 -60
  301. package/dist/extensions/agent-browser/lib/results/presentation/input-contracts.js +1 -0
  302. package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +60 -145
  303. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +147 -88
  304. package/dist/extensions/agent-browser/lib/results/presentation/notices.js +75 -0
  305. package/dist/extensions/agent-browser/lib/results/presentation/observation-contracts.js +1 -0
  306. package/dist/extensions/agent-browser/lib/results/presentation/observation-rendering.js +127 -0
  307. package/dist/extensions/agent-browser/lib/results/presentation/outcomes.js +120 -0
  308. package/dist/extensions/agent-browser/lib/results/presentation/output-completion.js +77 -0
  309. package/dist/extensions/agent-browser/lib/results/presentation/output-spill.js +51 -0
  310. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +116 -240
  311. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +35 -21
  312. package/dist/extensions/agent-browser/lib/results/presentation/skills.js +109 -73
  313. package/dist/extensions/agent-browser/lib/results/presentation/source.js +109 -0
  314. package/dist/extensions/agent-browser/lib/results/presentation.js +17 -261
  315. package/dist/extensions/agent-browser/lib/results/recommendation-contracts.js +1 -0
  316. package/dist/extensions/agent-browser/lib/results/recording.js +52 -14
  317. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +14 -5
  318. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +30 -22
  319. package/dist/extensions/agent-browser/lib/results/selector-recovery-target.js +83 -0
  320. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +119 -119
  321. package/dist/extensions/agent-browser/lib/results/snapshot-compact.js +266 -0
  322. package/dist/extensions/agent-browser/lib/results/snapshot-content.js +32 -0
  323. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +104 -71
  324. package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +31 -11
  325. package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +125 -66
  326. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +26 -7
  327. package/dist/extensions/agent-browser/lib/results/snapshot.js +28 -248
  328. package/dist/extensions/agent-browser/lib/results/text.js +16 -5
  329. package/dist/extensions/agent-browser/lib/runtime-args-validation.js +133 -0
  330. package/dist/extensions/agent-browser/lib/runtime-compatibility.js +81 -0
  331. package/dist/extensions/agent-browser/lib/runtime-contracts.js +1 -0
  332. package/dist/extensions/agent-browser/lib/runtime-redaction.js +118 -0
  333. package/dist/extensions/agent-browser/lib/runtime-replay-events.js +144 -0
  334. package/dist/extensions/agent-browser/lib/runtime-session-identity.js +76 -0
  335. package/dist/extensions/agent-browser/lib/runtime-session-plan.js +114 -0
  336. package/dist/extensions/agent-browser/lib/runtime-session-replay.js +123 -0
  337. package/dist/extensions/agent-browser/lib/runtime-tab-correction.js +65 -0
  338. package/dist/extensions/agent-browser/lib/runtime-timeouts.js +28 -0
  339. package/dist/extensions/agent-browser/lib/runtime.js +137 -1041
  340. package/dist/extensions/agent-browser/lib/session-identity.js +51 -0
  341. package/dist/extensions/agent-browser/lib/session-page-observation.js +357 -0
  342. package/dist/extensions/agent-browser/lib/session-page-state.js +178 -333
  343. package/dist/extensions/agent-browser/lib/session-page-types.js +1 -0
  344. package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +81 -0
  345. package/dist/extensions/agent-browser/lib/temp-mutation-queue.js +7 -0
  346. package/dist/extensions/agent-browser/lib/temp-root-ownership.js +234 -0
  347. package/dist/extensions/agent-browser/lib/temp-root.js +211 -0
  348. package/dist/extensions/agent-browser/lib/temp.js +33 -446
  349. package/dist/extensions/agent-browser/lib/tool-surface.js +94 -24
  350. package/dist/extensions/agent-browser/lib/upstream-version.js +3 -2
  351. package/dist/extensions/agent-browser/lib/web-search-providers.js +193 -0
  352. package/dist/extensions/agent-browser/lib/web-search-request.js +102 -0
  353. package/dist/extensions/agent-browser/lib/web-search-results.js +281 -0
  354. package/dist/extensions/agent-browser/lib/web-search-schema.js +82 -0
  355. package/dist/extensions/agent-browser/lib/web-search.js +124 -614
  356. package/dist/extensions/agent-browser/lib/webmcp-observation.js +13 -6
  357. package/dist/extensions/agent-browser/lib/windows-stock-launcher.js +63 -37
  358. package/dist/extensions/agent-browser/script-worker.js +80 -43
  359. package/dist/scripts/agent-browser-target.mjs +4 -2
  360. package/docs/ARCHITECTURE.md +19 -6
  361. package/docs/CODE_QUALITY.md +267 -0
  362. package/docs/COMMAND_REFERENCE.md +272 -241
  363. package/docs/ELECTRON.md +77 -46
  364. package/docs/REFERENCE.md +869 -0
  365. package/docs/RELEASE.md +25 -22
  366. package/docs/REQUIREMENTS.md +2 -1
  367. package/docs/SUPPORT_MATRIX.md +81 -79
  368. package/docs/TOOL_CONTRACT.md +158 -125
  369. package/docs/platform-smoke.md +8 -8
  370. package/package.json +144 -120
  371. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  372. package/scripts/agent-browser-target.mjs +6 -2
  373. package/scripts/build.mjs +37 -8
  374. package/scripts/capability-core-commands.mjs +193 -0
  375. package/scripts/capability-options.mjs +283 -0
  376. package/scripts/capability-samples.mjs +133 -0
  377. package/scripts/capability-section.mjs +11 -0
  378. package/scripts/config.mjs +235 -132
  379. package/scripts/convert-browser-session.mjs +30 -9
  380. package/scripts/doctor-sources.mjs +195 -0
  381. package/scripts/doctor.mjs +94 -249
  382. package/scripts/platform-smoke/artifacts.mjs +38 -11
  383. package/scripts/platform-smoke/commands.mjs +104 -0
  384. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  385. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  386. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  387. package/scripts/platform-smoke/doctor.mjs +212 -320
  388. package/scripts/platform-smoke/lease-evidence.mjs +132 -0
  389. package/scripts/platform-smoke/linux-image/Dockerfile +8 -2
  390. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  391. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  392. package/scripts/platform-smoke/targets.mjs +154 -472
  393. package/scripts/platform-smoke.mjs +55 -40
  394. package/scripts/prepare.mjs +16 -7
@@ -6,112 +6,215 @@ import { appendBrowserTransition, getBrowserRecord } from "../browser-transcript
6
6
  import { redactSensitiveText } from "../runtime.js";
7
7
  import { attachInlineImage } from "../results/presentation/artifacts.js";
8
8
  import { projectAgentBrowserObservation } from "../results/presentation/content.js";
9
- import { redactPresentationData } from "../results/presentation/diagnostics.js";
9
+ import { redactPresentationData } from "../results/presentation/diagnostic-redaction.js";
10
+ import { collectCodeArtifactReceipts, collectCodeFileArtifacts, } from "./code-artifact-observation.js";
11
+ import { parseCodeImageObservation } from "./code-image-observation.js";
10
12
  // The offline converter retains outstanding isolated-session cleanup facts in canonical events.
11
13
  export function getScriptSessionLeasesFromBranch(branch, ownerSessionId) {
12
14
  const leases = new Map();
13
15
  for (const entry of branch) {
14
- const lease = getBrowserRecord(entry)?.event.state.scriptLease;
15
- if (!isRecord(lease))
16
- continue;
17
- if (ownerSessionId !== undefined && lease.ownerSessionId !== ownerSessionId)
18
- continue;
19
- const { cleanup, closeCommandArgs, launchAttempted, sessionName } = lease;
20
- if (!isAgentBrowserScriptSessionName(sessionName))
21
- continue;
22
- const expected = createAgentBrowserScriptCloseArgs(sessionName);
23
- if ((cleanup !== "active" && cleanup !== "closed" && cleanup !== "failed") || launchAttempted !== true
24
- || !Array.isArray(closeCommandArgs) || closeCommandArgs.length !== expected.length
25
- || !closeCommandArgs.every((token, index) => token === expected[index]))
26
- continue;
27
- leases.set(sessionName, { cleanup, closeCommandArgs: expected, launchAttempted: true, sessionName, ownerSessionId: typeof lease.ownerSessionId === "string" ? lease.ownerSessionId : undefined });
16
+ const lease = parseScriptLease(getBrowserRecord(entry)?.event.state.scriptLease, ownerSessionId);
17
+ if (lease !== undefined) {
18
+ leases.set(lease.sessionName, lease);
19
+ }
28
20
  }
29
21
  return leases;
30
22
  }
31
- export function appendScriptSessionLease(pi, sessionName, cleanup, ownerSessionId) {
32
- appendBrowserTransition(pi, { event: { version: 1, phase: "state", operationId: randomUUID(), toolCallId: "cleanup", commandIndex: 0, isError: cleanup !== "closed",
33
- state: { scriptLease: { cleanup, closeCommandArgs: createAgentBrowserScriptCloseArgs(sessionName), launchAttempted: true, sessionName, ownerSessionId } } } });
34
- }
35
- export function createBrowserCodeOutput() {
36
- const images = new Map();
37
- const selected = new Map();
38
- const receipts = new Map();
39
- const fileArtifacts = new Map();
40
- let selectedBytes = 0;
23
+ function parseScriptLease(value, ownerSessionId) {
24
+ if (!isRecord(value)) {
25
+ return undefined;
26
+ }
27
+ if (ownerSessionId !== undefined && value.ownerSessionId !== ownerSessionId) {
28
+ return undefined;
29
+ }
30
+ const { closeCommandArgs, launchAttempted, sessionName } = value;
31
+ const cleanup = ["active", "closed", "failed"].find((state) => state === value.cleanup);
32
+ if (!isAgentBrowserScriptSessionName(sessionName)) {
33
+ return undefined;
34
+ }
35
+ if (cleanup === undefined) {
36
+ return undefined;
37
+ }
38
+ const expected = createAgentBrowserScriptCloseArgs(sessionName);
39
+ if (launchAttempted !== true || !matchesCloseCommand(closeCommandArgs, expected)) {
40
+ return undefined;
41
+ }
41
42
  return {
42
- async observe(result) {
43
- const details = isRecord(result.details) ? result.details : {};
44
- const observation = projectAgentBrowserObservation(details, result.isError !== true);
45
- for (const entry of observation.artifactVerification?.artifacts ?? [])
46
- receipts.set(entry.absolutePath ?? entry.path, entry);
47
- for (const artifact of observation.artifacts ?? [])
48
- fileArtifacts.set(artifact.absolutePath, artifact);
49
- if (observation.imageObservations) {
50
- observation.imageObservations = await Promise.all(observation.imageObservations.map(async (image) => {
51
- const file = await stat(image.path);
52
- const id = `image-${images.size + 1}`;
53
- images.set(id, { observation: image, size: file.size, mtime: file.mtimeMs });
54
- return { ...image, id };
55
- }));
56
- }
57
- return observation;
58
- },
59
- async emitImage(value) {
60
- const id = isRecord(value) && typeof value.id === "string" ? value.id : undefined;
61
- const image = id ? images.get(id) : undefined;
62
- if (!id || !image)
63
- throw new Error("emitImage expects an imageObservations handle returned by browser() in this code call.");
64
- if (selected.has(id))
65
- return;
66
- if (selected.size >= 8 || selectedBytes + image.size > 20 * 1_024 * 1_024)
67
- throw new Error("Selected images exceed the code output limit (8 images / 20 MiB). Emit fewer images.");
68
- const file = await stat(image.observation.path);
69
- if (!file.isFile() || file.size !== image.size || file.mtimeMs !== image.mtime)
70
- throw new Error("The selected image changed since capture. Capture it again before emitting it.");
71
- const presentation = await attachInlineImage({ content: [], summary: "Selected browser image" }, image.observation.path);
72
- if (!presentation.content.some(item => item.type === "image")) {
73
- throw new Error(presentation.content.filter(item => item.type === "text").map(item => item.text).join("\n") || "The selected image could not be attached.");
74
- }
75
- selected.set(id, presentation.content.filter(item => item.type === "image"));
76
- selectedBytes += file.size;
43
+ cleanup,
44
+ closeCommandArgs: expected,
45
+ launchAttempted: true,
46
+ sessionName,
47
+ ownerSessionId: typeof value.ownerSessionId === "string" ? value.ownerSessionId : undefined,
48
+ };
49
+ }
50
+ function matchesCloseCommand(value, expected) {
51
+ return (Array.isArray(value) &&
52
+ value.length === expected.length &&
53
+ value.every((token, index) => token === expected[index]));
54
+ }
55
+ export function appendScriptSessionLease(pi, sessionName, cleanup, ownerSessionId) {
56
+ appendBrowserTransition(pi, {
57
+ event: {
58
+ version: 1,
59
+ phase: "state",
60
+ operationId: randomUUID(),
61
+ toolCallId: "cleanup",
62
+ commandIndex: 0,
63
+ isError: cleanup !== "closed",
64
+ state: {
65
+ scriptLease: {
66
+ cleanup,
67
+ closeCommandArgs: createAgentBrowserScriptCloseArgs(sessionName),
68
+ launchAttempted: true,
69
+ sessionName,
70
+ ownerSessionId,
71
+ },
72
+ },
77
73
  },
78
- async finish(run, sessionName, namespace) {
79
- let data;
80
- let outputError;
81
- try {
82
- data = redactPresentationData({ command: "code" }, run.data);
83
- if (data !== undefined && Buffer.byteLength(JSON.stringify(data), "utf8") > AGENT_BROWSER_SCRIPT_FINAL_OUTPUT_MAX_BYTES)
84
- throw new Error("oversized");
74
+ });
75
+ }
76
+ class BrowserCodeOutput {
77
+ images = new Map();
78
+ selected = new Map();
79
+ receipts = new Map();
80
+ fileArtifacts = new Map();
81
+ selectedBytes = 0;
82
+ observe = async (result) => {
83
+ const details = isRecord(result.details) ? result.details : {};
84
+ const observation = projectAgentBrowserObservation(details, result.isError !== true);
85
+ for (const entry of collectCodeArtifactReceipts(observation.artifactVerification)) {
86
+ this.receipts.set(entry.absolutePath ?? entry.path, entry);
87
+ }
88
+ for (const artifact of collectCodeFileArtifacts(observation.artifacts)) {
89
+ this.fileArtifacts.set(artifact.absolutePath, artifact);
90
+ }
91
+ if (observation.imageObservations === undefined) {
92
+ return { ...observation, imageObservations: undefined };
93
+ }
94
+ if (!Array.isArray(observation.imageObservations)) {
95
+ throw new Error("Browser capture returned invalid image observations.");
96
+ }
97
+ const images = await Promise.all(observation.imageObservations.map(async (value) => {
98
+ const image = parseCodeImageObservation(value);
99
+ if (image === undefined) {
100
+ throw new Error("Browser capture returned invalid image observation geometry.");
85
101
  }
86
- catch {
87
- data = undefined;
88
- outputError = "Code output could not be rendered as bounded JSON.";
102
+ const file = await stat(image.path);
103
+ const id = `image-${this.images.size + 1}`;
104
+ this.images.set(id, { observation: image, size: file.size, mtime: file.mtimeMs });
105
+ return { ...image, id };
106
+ }));
107
+ return { ...observation, imageObservations: images };
108
+ };
109
+ resolveImage(value) {
110
+ const id = isRecord(value) && typeof value.id === "string" ? value.id : undefined;
111
+ const image = id !== undefined && id.length > 0 ? this.images.get(id) : undefined;
112
+ if (id === undefined || id.length === 0 || !image) {
113
+ throw new Error("emitImage expects an imageObservations handle returned by browser() in this code call.");
114
+ }
115
+ return { id, image };
116
+ }
117
+ emitImage = async (value) => {
118
+ const { id, image } = this.resolveImage(value);
119
+ if (this.selected.has(id)) {
120
+ return;
121
+ }
122
+ if (this.selected.size >= 8 || this.selectedBytes + image.size > 20 * 1_024 * 1_024) {
123
+ throw new Error("Selected images exceed the code output limit (8 images / 20 MiB). Emit fewer images.");
124
+ }
125
+ const file = await stat(image.observation.path);
126
+ if (!file.isFile() || file.size !== image.size || file.mtimeMs !== image.mtime) {
127
+ throw new Error("The selected image changed since capture. Capture it again before emitting it.");
128
+ }
129
+ const presentation = await attachInlineImage({ content: [], summary: "Selected browser image" }, image.observation.path);
130
+ if (!presentation.content.some((item) => item.type === "image")) {
131
+ const reason = presentation.content
132
+ .filter((item) => item.type === "text")
133
+ .map((item) => item.text)
134
+ .join("\n");
135
+ throw new Error(reason.length > 0 ? reason : "The selected image could not be attached.");
136
+ }
137
+ this.selected.set(id, {
138
+ content: presentation.content.filter((item) => item.type === "image"),
139
+ observation: { ...image.observation, id },
140
+ });
141
+ this.selectedBytes += file.size;
142
+ };
143
+ artifactVerification() {
144
+ const artifacts = [...this.receipts.values()];
145
+ if (artifacts.length === 0) {
146
+ return undefined;
147
+ }
148
+ const count = (state) => artifacts.filter((entry) => entry.state === state).length;
149
+ return {
150
+ artifacts,
151
+ missingCount: count("missing"),
152
+ pendingCount: count("pending"),
153
+ unverifiedCount: count("unverified"),
154
+ verifiedCount: count("verified"),
155
+ verified: artifacts.every((entry) => entry.state === "verified"),
156
+ };
157
+ }
158
+ failureCategory(run, outputError) {
159
+ if (outputError !== undefined) {
160
+ return "validation-error";
161
+ }
162
+ return run.failureCategory ?? (run.rejectedCallCount > 0 ? "validation-error" : undefined);
163
+ }
164
+ observation(run, context, output) {
165
+ const failureCategory = this.failureCategory(run, output.error);
166
+ const success = run.ok && failureCategory === undefined;
167
+ return {
168
+ success,
169
+ resultCategory: success ? "success" : "failure",
170
+ failureCategory,
171
+ data: output.data,
172
+ error: output.error ??
173
+ (run.error !== undefined && run.error.length > 0
174
+ ? redactSensitiveText(run.error)
175
+ : undefined),
176
+ ...context,
177
+ codeRun: {
178
+ callCount: run.callCount,
179
+ emitCount: run.emitCount,
180
+ failedCallCount: run.steps.filter((step) => !step.ok).length,
181
+ rejectedCallCount: run.rejectedCallCount,
182
+ aborted: run.aborted,
183
+ timedOut: run.timedOut,
184
+ },
185
+ failures: run.failures !== undefined && run.failures.length > 0 ? run.failures : undefined,
186
+ artifactVerification: this.artifactVerification(),
187
+ artifacts: this.fileArtifacts.size > 0 ? [...this.fileArtifacts.values()] : undefined,
188
+ imageObservations: [...this.selected.values()].map((image) => image.observation),
189
+ };
190
+ }
191
+ finish = async (run, sessionName, namespace) => {
192
+ let data;
193
+ let error;
194
+ try {
195
+ data = redactPresentationData({ command: "code" }, run.data);
196
+ if (data !== undefined &&
197
+ Buffer.byteLength(JSON.stringify(data), "utf8") >
198
+ AGENT_BROWSER_SCRIPT_FINAL_OUTPUT_MAX_BYTES) {
199
+ throw new Error("oversized");
89
200
  }
90
- const failureCategory = outputError ? "validation-error" : run.failureCategory
91
- ?? (run.rejectedCallCount > 0 ? "validation-error" : undefined);
92
- const success = run.ok && failureCategory === undefined;
93
- const artifacts = [...receipts.values()];
94
- const count = (state) => artifacts.filter(entry => entry.state === state).length;
95
- const artifactVerification = artifacts.length ? {
96
- artifacts, missingCount: count("missing"), pendingCount: count("pending"), unverifiedCount: count("unverified"),
97
- verifiedCount: count("verified"), verified: artifacts.every(entry => entry.state === "verified"),
98
- } : undefined;
99
- const observation = {
100
- success, resultCategory: success ? "success" : "failure", failureCategory, data,
101
- error: outputError ?? (run.error ? redactSensitiveText(run.error) : undefined),
102
- sessionName, namespace,
103
- codeRun: { callCount: run.callCount, emitCount: run.emitCount, failedCallCount: run.steps.filter(step => !step.ok).length, rejectedCallCount: run.rejectedCallCount, aborted: run.aborted, timedOut: run.timedOut },
104
- failures: run.failures?.length ? run.failures : undefined,
105
- artifactVerification,
106
- artifacts: fileArtifacts.size ? [...fileArtifacts.values()] : undefined,
107
- imageObservations: [...selected.keys()].map(id => ({ ...images.get(id).observation, id })),
108
- };
109
- const summary = success ? `Browser code completed (${run.callCount} calls).` : "Browser code failed.";
110
- return {
111
- content: [...selected.values()].flat(),
112
- details: { ...observation, codeSteps: run.steps, summary },
113
- isError: !success,
114
- };
115
- },
201
+ }
202
+ catch {
203
+ data = undefined;
204
+ error = "Code output could not be rendered as bounded JSON.";
205
+ }
206
+ const observation = this.observation(run, { sessionName, namespace }, { data, error });
207
+ const success = observation.success === true;
208
+ const summary = success
209
+ ? `Browser code completed (${run.callCount} calls).`
210
+ : "Browser code failed.";
211
+ return {
212
+ content: [...this.selected.values()].flatMap((image) => image.content),
213
+ details: { ...observation, codeSteps: run.steps, summary },
214
+ isError: !success,
215
+ };
116
216
  };
117
217
  }
218
+ export function createBrowserCodeOutput() {
219
+ return new BrowserCodeOutput();
220
+ }
@@ -0,0 +1,55 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ import { canonicalizeAgentBrowserNamespace, extractExplicitSessionName, resolveAgentBrowserNamespace, } from "./argv-grammar.js";
3
+ const ownedManagedSessionStorage = new AsyncLocalStorage();
4
+ export async function withOwnedManagedSessionContext(context, run) {
5
+ return await ownedManagedSessionStorage.run(context, run);
6
+ }
7
+ export function resolveOwnedManagedSessionContext(options) {
8
+ const namespace = canonicalizeAgentBrowserNamespace(options.namespace);
9
+ const currentNamespace = canonicalizeAgentBrowserNamespace(options.currentManagedSessionNamespace);
10
+ const recordedNamespace = canonicalizeAgentBrowserNamespace(options.recordedOwnedSession?.namespace);
11
+ if (options.recordedOwnedSession &&
12
+ options.sessionName === options.recordedOwnedSession.sessionName &&
13
+ namespace === recordedNamespace) {
14
+ return {
15
+ cwd: options.recordedOwnedSession.cwd,
16
+ namespace,
17
+ restoreState: options.restoreState,
18
+ sessionName: options.sessionName,
19
+ };
20
+ }
21
+ if (options.managedSessionName !== undefined && options.managedSessionName.length > 0) {
22
+ return {
23
+ cwd: options.cwd,
24
+ namespace,
25
+ restoreState: options.restoreState,
26
+ sessionName: options.managedSessionName,
27
+ };
28
+ }
29
+ if (options.sessionName !== undefined &&
30
+ options.sessionName.length > 0 &&
31
+ matchesCurrentContext(options, namespace, currentNamespace)) {
32
+ return {
33
+ cwd: options.cwd,
34
+ namespace,
35
+ restoreState: options.restoreState,
36
+ sessionName: options.sessionName,
37
+ };
38
+ }
39
+ return undefined;
40
+ }
41
+ function matchesCurrentContext(options, namespace, currentNamespace) {
42
+ return (options.sessionName === options.currentManagedSessionName && namespace === currentNamespace);
43
+ }
44
+ export function ownedContextMatches(sessionName, args) {
45
+ const owned = ownedManagedSessionStorage.getStore();
46
+ return owned &&
47
+ sessionName === owned.sessionName &&
48
+ canonicalizeAgentBrowserNamespace(resolveAgentBrowserNamespace(args, owned.namespace)) ===
49
+ owned.namespace
50
+ ? owned
51
+ : undefined;
52
+ }
53
+ export function isOwnedManagedSessionTarget(args) {
54
+ return ownedContextMatches(extractExplicitSessionName(args), args) !== undefined;
55
+ }
@@ -0,0 +1,118 @@
1
+ import { parseArgvDescriptor } from "./argv-descriptor.js";
2
+ import { parseBatchCommandArgument, parseUserBatchStdin, } from "./orchestration/batch-stdin.js";
3
+ import { BATCH_UNVERIFIED_PAGE_MESSAGE, NON_BAIL_BATCH_NAVIGATION_MESSAGE, getUnverifiedPageError, } from "./page-target-guards.js";
4
+ import { commandMayChangePageTarget, commandVerifiesPageTarget, getResultingPageState, } from "./page-target-navigation.js";
5
+ export const UNSAFE_BATCH_ARGUMENT_MESSAGE = "Batch command arguments could not be inspected. Use batch stdin JSON command arrays instead.";
6
+ export const NESTED_BATCH_ARGUMENT_MESSAGE = "Nested batch commands are not supported. Flatten the batch steps instead.";
7
+ const MAX_NON_BAIL_BATCH_PAGE_STATES = 64;
8
+ function inspectBatchArguments(commands) {
9
+ const steps = [];
10
+ for (const command of commands) {
11
+ const parsed = parseBatchCommandArgument(command);
12
+ if ((parsed.error !== undefined && parsed.error.length > 0) || parsed.step === undefined) {
13
+ return { error: parsed.error ?? UNSAFE_BATCH_ARGUMENT_MESSAGE, steps: [] };
14
+ }
15
+ if (parseArgvDescriptor(parsed.step).commandInfo.command === "batch") {
16
+ return { error: NESTED_BATCH_ARGUMENT_MESSAGE, steps: [] };
17
+ }
18
+ steps.push(parsed.step);
19
+ }
20
+ return { steps };
21
+ }
22
+ export function getBatchCommandSteps(args, stdin) {
23
+ const descriptor = parseArgvDescriptor(args);
24
+ if (descriptor.commandInfo.command !== "batch") {
25
+ return { steps: [] };
26
+ }
27
+ const argumentsToParse = descriptor.upstreamCommandTokens
28
+ .slice(1)
29
+ .filter((command) => command !== "--bail");
30
+ if (argumentsToParse.length > 0) {
31
+ return inspectBatchArguments(argumentsToParse);
32
+ }
33
+ const parsed = parseUserBatchStdin(stdin);
34
+ if (parsed.error !== undefined && parsed.error.length > 0) {
35
+ return { error: parsed.error, steps: [] };
36
+ }
37
+ const steps = (parsed.steps ?? []).filter((step) => step.length > 0);
38
+ return steps.some((step) => parseArgvDescriptor(step).commandInfo.command === "batch")
39
+ ? { error: NESTED_BATCH_ARGUMENT_MESSAGE, steps: [] }
40
+ : { steps };
41
+ }
42
+ function deduplicatePossibleBatchPageStates(states) {
43
+ const deduplicated = new Map();
44
+ for (const state of states) {
45
+ const key = `${state.pageUrlUnknown ? "unknown" : "known"}\0${state.currentPageUrl ?? ""}`;
46
+ const existing = deduplicated.get(key);
47
+ deduplicated.set(key, {
48
+ ...(existing ?? state),
49
+ retainedAfterFailedNavigation: state.retainedAfterFailedNavigation || existing?.retainedAfterFailedNavigation === true,
50
+ });
51
+ }
52
+ return [...deduplicated.values()];
53
+ }
54
+ function possibleStateError(states, step, options) {
55
+ if (options.allowsConfirmation) {
56
+ return undefined;
57
+ }
58
+ let failedNavigationHazard = false;
59
+ for (const state of states) {
60
+ const error = getUnverifiedPageError({
61
+ ...options,
62
+ args: step,
63
+ pageUrlUnknown: state.pageUrlUnknown,
64
+ });
65
+ if (error === undefined || error.length === 0) {
66
+ continue;
67
+ }
68
+ if (!state.retainedAfterFailedNavigation) {
69
+ return BATCH_UNVERIFIED_PAGE_MESSAGE;
70
+ }
71
+ failedNavigationHazard = true;
72
+ }
73
+ return failedNavigationHazard ? NON_BAIL_BATCH_NAVIGATION_MESSAGE : undefined;
74
+ }
75
+ function advancePossibleStates(states, step, trustedBatchTabSelection, bail) {
76
+ const mayChangePageTarget = commandMayChangePageTarget(step, trustedBatchTabSelection);
77
+ const verifiesPageTarget = commandVerifiesPageTarget(step);
78
+ const nextStates = [];
79
+ for (const state of states) {
80
+ if (nextStates.length >= MAX_NON_BAIL_BATCH_PAGE_STATES) {
81
+ return { states: [], error: NON_BAIL_BATCH_NAVIGATION_MESSAGE };
82
+ }
83
+ nextStates.push({
84
+ ...getResultingPageState({ args: step, ...state, trustedBatchTabSelection }),
85
+ retainedAfterFailedNavigation: mayChangePageTarget || verifiesPageTarget ? false : state.retainedAfterFailedNavigation,
86
+ });
87
+ if (!bail && (mayChangePageTarget || (verifiesPageTarget && state.pageUrlUnknown))) {
88
+ nextStates.push({ ...state, retainedAfterFailedNavigation: true });
89
+ }
90
+ }
91
+ return { states: deduplicatePossibleBatchPageStates(nextStates) };
92
+ }
93
+ export function validateBatchPageTargets(steps, bail, options) {
94
+ let states = [
95
+ {
96
+ currentPageUrl: options.currentPageUrl,
97
+ pageUrlUnknown: options.pageUrlUnknown ?? false,
98
+ retainedAfterFailedNavigation: false,
99
+ },
100
+ ];
101
+ for (const [index, step] of steps.entries()) {
102
+ const trustedBatchTabSelection = options.trustedFirstBatchTabSelection === true && index === 0;
103
+ const error = possibleStateError(states, step, {
104
+ allowUnverifiedPageTransitions: options.allowUnverifiedPageTransitions,
105
+ trustedBatchTabSelection,
106
+ allowsConfirmation: options.allowFirstBatchConfirmation === true && index === 0,
107
+ });
108
+ if (error !== undefined) {
109
+ return error;
110
+ }
111
+ const next = advancePossibleStates(states, step, trustedBatchTabSelection, bail);
112
+ if (next.error !== undefined) {
113
+ return next.error;
114
+ }
115
+ states = next.states;
116
+ }
117
+ return undefined;
118
+ }
@@ -0,0 +1,50 @@
1
+ import { parseArgvDescriptor } from "./argv-descriptor.js";
2
+ import { needsManagedSession } from "./command-policy.js";
3
+ import { isUnverifiedPageTransitionCommand } from "./command-taxonomy.js";
4
+ import { getExplicitNavigationTarget } from "./page-target-navigation.js";
5
+ export const UNVERIFIED_PAGE_MESSAGE = "The active page became unverified after a tab, attachment, history, script, or state-load transition. Run get url or navigate explicitly before page-content inspection.";
6
+ export const BATCH_UNVERIFIED_PAGE_MESSAGE = `${UNVERIFIED_PAGE_MESSAGE} In a batch, put get url after the transition before later content steps, or split the batch at that boundary.`;
7
+ export const NON_BAIL_BATCH_NAVIGATION_MESSAGE = "Batches that change or re-verify the page target before page-content access must use exact batch --bail so a failed step cannot act on an unverified or prior page.";
8
+ export function isRecoveringPageTransitionCommand(command, subcommand) {
9
+ return (command !== "eval" &&
10
+ !(command === "webmcp" && subcommand === "invoke") &&
11
+ isUnverifiedPageTransitionCommand(command, subcommand));
12
+ }
13
+ function canOperateWithoutVerifiedPage(command, subcommand) {
14
+ switch (command) {
15
+ case undefined:
16
+ return false;
17
+ case "close":
18
+ case "exit":
19
+ case "quit":
20
+ return true;
21
+ case "tab":
22
+ return subcommand !== undefined && subcommand !== "new";
23
+ case "get":
24
+ return subcommand === "url";
25
+ case "webmcp":
26
+ return ["result", "cancel"].includes(subcommand ?? "");
27
+ case "record":
28
+ return subcommand === "stop";
29
+ case "dialog":
30
+ return ["status", "accept", "dismiss"].includes(subcommand ?? "");
31
+ default:
32
+ return false;
33
+ }
34
+ }
35
+ export function getUnverifiedPageError(options) {
36
+ const descriptor = parseArgvDescriptor(options.args);
37
+ if (options.pageUrlUnknown !== true || !needsManagedSession(descriptor)) {
38
+ return undefined;
39
+ }
40
+ const { command, subcommand } = descriptor.commandInfo;
41
+ if (canOperateWithoutVerifiedPage(command, subcommand)) {
42
+ return undefined;
43
+ }
44
+ const transitionsPage = options.allowUnverifiedPageTransitions === true &&
45
+ isRecoveringPageTransitionCommand(command, subcommand);
46
+ const trustedTab = options.trustedBatchTabSelection === true && command === "tab";
47
+ return transitionsPage || trustedTab || getExplicitNavigationTarget(options.args) !== undefined
48
+ ? undefined
49
+ : UNVERIFIED_PAGE_MESSAGE;
50
+ }
@@ -0,0 +1,104 @@
1
+ import { parseArgvDescriptor } from "./argv-descriptor.js";
2
+ import { GLOBAL_BOOLEAN_FLAGS_WITH_OPTIONAL_VALUES, VALUE_FLAGS } from "./argv-grammar.js";
3
+ import { isUnverifiedPageTransitionCommand } from "./command-taxonomy.js";
4
+ const EXPLICIT_NAVIGATION_COMMANDS = new Set([
5
+ "a11y",
6
+ "goto",
7
+ "navigate",
8
+ "open",
9
+ "pushstate",
10
+ "visit",
11
+ "vitals",
12
+ "web-vitals",
13
+ ]);
14
+ const POSITIONAL_VALUE_FLAGS = new Set([...VALUE_FLAGS, "--llms"]);
15
+ function isPositionalOperand(token) {
16
+ return !token.startsWith("-") || token.includes("/") || token.includes("\\");
17
+ }
18
+ function getPositionalOperands(commandTokens) {
19
+ const values = [];
20
+ for (let index = 1; index < commandTokens.length; index += 1) {
21
+ const token = commandTokens[index];
22
+ if (token.length === 0 || (token.includes("=") && token.startsWith("-"))) {
23
+ continue;
24
+ }
25
+ if (POSITIONAL_VALUE_FLAGS.has(token)) {
26
+ index += 1;
27
+ continue;
28
+ }
29
+ if (GLOBAL_BOOLEAN_FLAGS_WITH_OPTIONAL_VALUES.has(token)) {
30
+ index += ["true", "false"].includes(commandTokens[index + 1] ?? "") ? 1 : 0;
31
+ continue;
32
+ }
33
+ if (isPositionalOperand(token)) {
34
+ values.push(token);
35
+ }
36
+ }
37
+ return values;
38
+ }
39
+ export function getExplicitNavigationTarget(args) {
40
+ const descriptor = parseArgvDescriptor(args);
41
+ const positionals = getPositionalOperands(descriptor.upstreamCommandTokens);
42
+ const { command, subcommand } = descriptor.commandInfo;
43
+ if (EXPLICIT_NAVIGATION_COMMANDS.has(command ?? "")) {
44
+ return positionals[0];
45
+ }
46
+ if (command === "tab" && subcommand === "new") {
47
+ return positionals[1];
48
+ }
49
+ if (command === "window" && subcommand === "new") {
50
+ return "about:blank";
51
+ }
52
+ return command === "diff" && subcommand === "url"
53
+ ? descriptor.upstreamCommandTokens[3]
54
+ : undefined;
55
+ }
56
+ function getResultingExplicitNavigationTarget(args, currentPageUrl) {
57
+ const target = getExplicitNavigationTarget(args);
58
+ if (target === undefined || parseArgvDescriptor(args).commandInfo.command !== "pushstate") {
59
+ return target;
60
+ }
61
+ try {
62
+ return new URL(target).href;
63
+ }
64
+ catch {
65
+ if (currentPageUrl === undefined || currentPageUrl.length === 0) {
66
+ return undefined;
67
+ }
68
+ try {
69
+ return new URL(target, currentPageUrl).href;
70
+ }
71
+ catch {
72
+ return undefined;
73
+ }
74
+ }
75
+ }
76
+ export function commandMayChangePageTarget(args, trustedBatchTabSelection) {
77
+ const { command, subcommand } = parseArgvDescriptor(args).commandInfo;
78
+ return (getExplicitNavigationTarget(args) !== undefined ||
79
+ (isUnverifiedPageTransitionCommand(command, subcommand) &&
80
+ !(trustedBatchTabSelection && command === "tab")));
81
+ }
82
+ export function commandVerifiesPageTarget(args) {
83
+ const { command, subcommand } = parseArgvDescriptor(args).commandInfo;
84
+ return command === "get" && subcommand === "url";
85
+ }
86
+ export function getResultingPageState(options) {
87
+ const { command, subcommand } = parseArgvDescriptor(options.args).commandInfo;
88
+ if (command === "get" && subcommand === "url") {
89
+ return { currentPageUrl: options.currentPageUrl, pageUrlUnknown: false };
90
+ }
91
+ const rawExplicitTarget = getExplicitNavigationTarget(options.args);
92
+ const explicitTarget = getResultingExplicitNavigationTarget(options.args, options.currentPageUrl);
93
+ if (explicitTarget !== undefined) {
94
+ return { currentPageUrl: explicitTarget, pageUrlUnknown: false };
95
+ }
96
+ if (rawExplicitTarget !== undefined) {
97
+ return { pageUrlUnknown: true };
98
+ }
99
+ if (isUnverifiedPageTransitionCommand(command, subcommand) &&
100
+ !(options.trustedBatchTabSelection && command === "tab")) {
101
+ return { pageUrlUnknown: true };
102
+ }
103
+ return { currentPageUrl: options.currentPageUrl, pageUrlUnknown: options.pageUrlUnknown };
104
+ }