pi-agent-browser-native 0.9.3 → 0.9.4

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 (391) hide show
  1. package/CHANGELOG.md +77 -5
  2. package/README.md +103 -81
  3. package/dist/extensions/agent-browser/index.js +43057 -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 +218 -0
  33. package/dist/extensions/agent-browser/lib/config.js +19 -7
  34. package/dist/extensions/agent-browser/lib/electron/cdp.js +15 -7
  35. package/dist/extensions/agent-browser/lib/electron/cleanup.js +134 -55
  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 +89 -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 +249 -354
  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/input-modes/electron.js +162 -121
  50. package/dist/extensions/agent-browser/lib/input-modes/job.js +116 -313
  51. package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +104 -0
  52. package/dist/extensions/agent-browser/lib/input-modes/lookup-plan.js +132 -0
  53. package/dist/extensions/agent-browser/lib/input-modes/lookup-redaction.js +57 -0
  54. package/dist/extensions/agent-browser/lib/input-modes/lookup-source-evidence.js +151 -0
  55. package/dist/extensions/agent-browser/lib/input-modes/lookup-workspace.js +142 -0
  56. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +57 -412
  57. package/dist/extensions/agent-browser/lib/input-modes/params.js +63 -17
  58. package/dist/extensions/agent-browser/lib/input-modes/qa-analysis.js +268 -0
  59. package/dist/extensions/agent-browser/lib/input-modes/qa-presentation.js +117 -0
  60. package/dist/extensions/agent-browser/lib/input-modes/script-child.js +396 -0
  61. package/dist/extensions/agent-browser/lib/input-modes/script-protocol.js +86 -0
  62. package/dist/extensions/agent-browser/lib/input-modes/script-types.js +1 -0
  63. package/dist/extensions/agent-browser/lib/input-modes/script-validation.js +60 -0
  64. package/dist/extensions/agent-browser/lib/input-modes/script.js +60 -409
  65. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +218 -128
  66. package/dist/extensions/agent-browser/lib/input-modes/shared.js +15 -4
  67. package/dist/extensions/agent-browser/lib/input-modes/types.js +56 -7
  68. package/dist/extensions/agent-browser/lib/json-schema.js +22 -10
  69. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +17 -5
  70. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +92 -425
  71. package/dist/extensions/agent-browser/lib/managed-session-posix-storage.js +58 -0
  72. package/dist/extensions/agent-browser/lib/managed-session-project-identity.js +244 -0
  73. package/dist/extensions/agent-browser/lib/managed-session-restore-context.js +84 -0
  74. package/dist/extensions/agent-browser/lib/managed-session-restore-policy.js +119 -0
  75. package/dist/extensions/agent-browser/lib/managed-session-restore-state.js +83 -0
  76. package/dist/extensions/agent-browser/lib/managed-session-restore.js +168 -300
  77. package/dist/extensions/agent-browser/lib/managed-session-snapshot-records.js +277 -0
  78. package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +128 -305
  79. package/dist/extensions/agent-browser/lib/managed-session-storage.js +56 -253
  80. package/dist/extensions/agent-browser/lib/native-confirmation.js +140 -0
  81. package/dist/extensions/agent-browser/lib/native-output.js +43 -9
  82. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +106 -59
  83. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-merge.js +14 -6
  84. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +109 -57
  85. package/dist/extensions/agent-browser/lib/orchestration/browser-run/browser-observation-result.js +82 -0
  86. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +164 -60
  87. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostic-values.js +31 -0
  88. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +152 -781
  89. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-observation.js +202 -0
  90. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-text-diagnostics.js +109 -0
  91. package/dist/extensions/agent-browser/lib/orchestration/browser-run/fill-diagnostics.js +119 -0
  92. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-action-recovery.js +147 -0
  93. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-actions.js +144 -0
  94. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-content.js +123 -0
  95. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-contracts.js +1 -0
  96. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-details.js +156 -0
  97. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-electron.js +179 -0
  98. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-evidence.js +39 -0
  99. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-missing-binary.js +89 -0
  100. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-recovery.js +97 -0
  101. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-redaction.js +106 -0
  102. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-timeout.js +110 -0
  103. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +41 -538
  104. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +199 -154
  105. package/dist/extensions/agent-browser/lib/orchestration/browser-run/interaction-diagnostics.js +290 -0
  106. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-close.js +167 -0
  107. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-inspection.js +108 -0
  108. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +127 -205
  109. package/dist/extensions/agent-browser/lib/orchestration/browser-run/native-helper-observation.js +65 -0
  110. package/dist/extensions/agent-browser/lib/orchestration/browser-run/observation-types.js +1 -0
  111. package/dist/extensions/agent-browser/lib/orchestration/browser-run/overlay-diagnostics.js +120 -0
  112. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +113 -30
  113. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +109 -28
  114. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter-data.js +150 -0
  115. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +138 -253
  116. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-rendered-text.js +147 -0
  117. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +59 -24
  118. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-artifacts.js +159 -0
  119. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-command.js +131 -0
  120. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-contracts.js +1 -0
  121. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-daemon.js +93 -0
  122. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-failure.js +42 -0
  123. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-guards.js +242 -0
  124. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-input.js +75 -0
  125. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-observations.js +92 -0
  126. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-selection.js +254 -0
  127. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-state.js +121 -0
  128. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-refs.js +130 -0
  129. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-resources.js +114 -0
  130. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-semantic.js +121 -0
  131. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-session-plan.js +222 -0
  132. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-timeouts.js +68 -0
  133. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +176 -1123
  134. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-analysis.js +191 -0
  135. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-confirmation.js +152 -0
  136. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-diagnostics.js +182 -0
  137. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-electron.js +150 -0
  138. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-contracts.js +1 -0
  139. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase-contracts.js +1 -0
  140. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase.js +115 -0
  141. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle.js +256 -0
  142. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed-contracts.js +1 -0
  143. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed.js +256 -0
  144. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase-contracts.js +1 -0
  145. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase.js +93 -0
  146. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native.js +113 -0
  147. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation-contracts.js +1 -0
  148. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation.js +316 -0
  149. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-ownership.js +28 -0
  150. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase-contracts.js +1 -0
  151. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase.js +142 -0
  152. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation-contracts.js +1 -0
  153. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation.js +333 -0
  154. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase-contracts.js +1 -0
  155. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase.js +71 -0
  156. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication.js +201 -0
  157. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-receipts.js +183 -0
  158. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-refs.js +200 -0
  159. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-tabs.js +142 -0
  160. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +18 -968
  161. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +23 -13
  162. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-receipt-reconciliation.js +198 -0
  163. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-contracts.js +1 -0
  164. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-presentation.js +154 -0
  165. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery.js +68 -151
  166. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-capture.js +14 -0
  167. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-observation.js +169 -46
  168. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-commands.js +130 -0
  169. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-electron.js +210 -0
  170. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-observations.js +61 -0
  171. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-outcomes.js +187 -0
  172. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-refs.js +171 -0
  173. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-tabs.js +228 -0
  174. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +77 -765
  175. package/dist/extensions/agent-browser/lib/orchestration/browser-run/text-visibility-diagnostics.js +182 -0
  176. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-diagnostics.js +256 -0
  177. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-progress.js +108 -0
  178. package/dist/extensions/agent-browser/lib/orchestration/code-artifact-observation.js +39 -0
  179. package/dist/extensions/agent-browser/lib/orchestration/code-image-observation.js +119 -0
  180. package/dist/extensions/agent-browser/lib/orchestration/electron-host/branch.js +92 -0
  181. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup-result.js +58 -0
  182. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup.js +78 -0
  183. package/dist/extensions/agent-browser/lib/orchestration/electron-host/contracts.js +1 -0
  184. package/dist/extensions/agent-browser/lib/orchestration/electron-host/discovery.js +106 -0
  185. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +48 -821
  186. package/dist/extensions/agent-browser/lib/orchestration/electron-host/policy.js +86 -0
  187. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-collection.js +69 -0
  188. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +167 -0
  189. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +164 -0
  190. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe.js +161 -0
  191. package/dist/extensions/agent-browser/lib/orchestration/electron-host/status.js +165 -0
  192. package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +21 -9
  193. package/dist/extensions/agent-browser/lib/orchestration/extension-artifact-preflight.js +211 -0
  194. package/dist/extensions/agent-browser/lib/orchestration/extension-artifacts.js +23 -0
  195. package/dist/extensions/agent-browser/lib/orchestration/extension-attachment-replay.js +99 -0
  196. package/dist/extensions/agent-browser/lib/orchestration/extension-branch-restore.js +275 -0
  197. package/dist/extensions/agent-browser/lib/orchestration/extension-code.js +280 -0
  198. package/dist/extensions/agent-browser/lib/orchestration/extension-command-admission.js +303 -0
  199. package/dist/extensions/agent-browser/lib/orchestration/extension-command-output.js +36 -0
  200. package/dist/extensions/agent-browser/lib/orchestration/extension-command-result.js +335 -0
  201. package/dist/extensions/agent-browser/lib/orchestration/extension-command-run.js +227 -0
  202. package/dist/extensions/agent-browser/lib/orchestration/extension-command-state.js +1 -0
  203. package/dist/extensions/agent-browser/lib/orchestration/extension-electron-ownership.js +204 -0
  204. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-locks.js +139 -0
  205. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-queue.js +24 -0
  206. package/dist/extensions/agent-browser/lib/orchestration/extension-host-coordination.js +98 -0
  207. package/dist/extensions/agent-browser/lib/orchestration/extension-host-run.js +295 -0
  208. package/dist/extensions/agent-browser/lib/orchestration/extension-intent-replay.js +41 -0
  209. package/dist/extensions/agent-browser/lib/orchestration/extension-invocation.js +7 -0
  210. package/dist/extensions/agent-browser/lib/orchestration/extension-lifecycle.js +102 -0
  211. package/dist/extensions/agent-browser/lib/orchestration/extension-managed-ownership.js +133 -0
  212. package/dist/extensions/agent-browser/lib/orchestration/extension-observation.js +120 -0
  213. package/dist/extensions/agent-browser/lib/orchestration/extension-prompt.js +180 -0
  214. package/dist/extensions/agent-browser/lib/orchestration/extension-recording.js +290 -0
  215. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-contracts.js +1 -0
  216. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-replay.js +269 -0
  217. package/dist/extensions/agent-browser/lib/orchestration/extension-result-state.js +113 -0
  218. package/dist/extensions/agent-browser/lib/orchestration/extension-runtime.js +146 -0
  219. package/dist/extensions/agent-browser/lib/orchestration/extension-script-leases.js +58 -0
  220. package/dist/extensions/agent-browser/lib/orchestration/extension-tool-boundary.js +62 -0
  221. package/dist/extensions/agent-browser/lib/orchestration/extension-version-check.js +54 -0
  222. package/dist/extensions/agent-browser/lib/orchestration/input-plan-types.js +1 -0
  223. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +261 -185
  224. package/dist/extensions/agent-browser/lib/orchestration/input-redaction.js +62 -0
  225. package/dist/extensions/agent-browser/lib/orchestration/native-config.js +144 -0
  226. package/dist/extensions/agent-browser/lib/orchestration/native-root-launch.js +77 -0
  227. package/dist/extensions/agent-browser/lib/orchestration/native-session-defaults.js +210 -157
  228. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  229. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +197 -99
  230. package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +199 -96
  231. package/dist/extensions/agent-browser/lib/owned-managed-session-context.js +55 -0
  232. package/dist/extensions/agent-browser/lib/page-target-batch.js +118 -0
  233. package/dist/extensions/agent-browser/lib/page-target-guards.js +50 -0
  234. package/dist/extensions/agent-browser/lib/page-target-navigation.js +104 -0
  235. package/dist/extensions/agent-browser/lib/page-target-validation.js +55 -246
  236. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  237. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +133 -68
  238. package/dist/extensions/agent-browser/lib/playbook.js +16 -12
  239. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  240. package/dist/extensions/agent-browser/lib/process-environment.js +13 -6
  241. package/dist/extensions/agent-browser/lib/process-errors.js +23 -0
  242. package/dist/extensions/agent-browser/lib/process-identity.js +47 -15
  243. package/dist/extensions/agent-browser/lib/process-socket-storage.js +256 -0
  244. package/dist/extensions/agent-browser/lib/process-stdout.js +74 -0
  245. package/dist/extensions/agent-browser/lib/process.js +145 -536
  246. package/dist/extensions/agent-browser/lib/prompt-artifacts.js +287 -0
  247. package/dist/extensions/agent-browser/lib/prompt-policy.js +15 -194
  248. package/dist/extensions/agent-browser/lib/read-command.js +41 -0
  249. package/dist/extensions/agent-browser/lib/read-confirmation.js +131 -68
  250. package/dist/extensions/agent-browser/lib/recording-reservations.js +118 -45
  251. package/dist/extensions/agent-browser/lib/redaction-fields.js +75 -0
  252. package/dist/extensions/agent-browser/lib/redaction-json.js +149 -0
  253. package/dist/extensions/agent-browser/lib/redaction-url.js +88 -0
  254. package/dist/extensions/agent-browser/lib/results/action-contracts.js +1 -0
  255. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +28 -271
  256. package/dist/extensions/agent-browser/lib/results/artifact-contracts.js +1 -0
  257. package/dist/extensions/agent-browser/lib/results/artifact-manifest-validation.js +133 -0
  258. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +96 -94
  259. package/dist/extensions/agent-browser/lib/results/artifact-recommendations.js +73 -0
  260. package/dist/extensions/agent-browser/lib/results/categories.js +111 -54
  261. package/dist/extensions/agent-browser/lib/results/confirmation.js +29 -13
  262. package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +62 -27
  263. package/dist/extensions/agent-browser/lib/results/electron-recommendations.js +83 -0
  264. package/dist/extensions/agent-browser/lib/results/envelope-decoding.js +48 -0
  265. package/dist/extensions/agent-browser/lib/results/envelope.js +90 -67
  266. package/dist/extensions/agent-browser/lib/results/evidence-contracts.js +1 -0
  267. package/dist/extensions/agent-browser/lib/results/failure-recommendations.js +180 -0
  268. package/dist/extensions/agent-browser/lib/results/network-routes.js +86 -45
  269. package/dist/extensions/agent-browser/lib/results/network.js +35 -12
  270. package/dist/extensions/agent-browser/lib/results/next-actions.js +49 -19
  271. package/dist/extensions/agent-browser/lib/results/presentation/artifact-files.js +320 -0
  272. package/dist/extensions/agent-browser/lib/results/presentation/artifact-format.js +138 -0
  273. package/dist/extensions/agent-browser/lib/results/presentation/artifact-images.js +113 -0
  274. package/dist/extensions/agent-browser/lib/results/presentation/artifact-verification.js +145 -0
  275. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +99 -555
  276. package/dist/extensions/agent-browser/lib/results/presentation/batch-contracts.js +1 -0
  277. package/dist/extensions/agent-browser/lib/results/presentation/batch-recording.js +118 -0
  278. package/dist/extensions/agent-browser/lib/results/presentation/batch-redaction.js +68 -0
  279. package/dist/extensions/agent-browser/lib/results/presentation/batch-rendering.js +135 -0
  280. package/dist/extensions/agent-browser/lib/results/presentation/batch-step.js +227 -0
  281. package/dist/extensions/agent-browser/lib/results/presentation/batch-summary.js +91 -0
  282. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +91 -460
  283. package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +9 -5
  284. package/dist/extensions/agent-browser/lib/results/presentation/command-presenters.js +216 -0
  285. package/dist/extensions/agent-browser/lib/results/presentation/common.js +26 -9
  286. package/dist/extensions/agent-browser/lib/results/presentation/content.js +86 -29
  287. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-a11y.js +67 -0
  288. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-health.js +79 -0
  289. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-identity.js +199 -0
  290. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-logs.js +75 -0
  291. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network-actions.js +216 -0
  292. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network.js +124 -0
  293. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-redaction.js +64 -0
  294. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-storage.js +209 -0
  295. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-stream.js +69 -0
  296. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-summary.js +222 -0
  297. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +103 -1052
  298. package/dist/extensions/agent-browser/lib/results/presentation/early-result.js +70 -0
  299. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +130 -60
  300. package/dist/extensions/agent-browser/lib/results/presentation/input-contracts.js +1 -0
  301. package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +60 -145
  302. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +147 -88
  303. package/dist/extensions/agent-browser/lib/results/presentation/notices.js +75 -0
  304. package/dist/extensions/agent-browser/lib/results/presentation/observation-contracts.js +1 -0
  305. package/dist/extensions/agent-browser/lib/results/presentation/observation-rendering.js +127 -0
  306. package/dist/extensions/agent-browser/lib/results/presentation/outcomes.js +120 -0
  307. package/dist/extensions/agent-browser/lib/results/presentation/output-completion.js +77 -0
  308. package/dist/extensions/agent-browser/lib/results/presentation/output-spill.js +51 -0
  309. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +116 -240
  310. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +35 -21
  311. package/dist/extensions/agent-browser/lib/results/presentation/skills.js +104 -73
  312. package/dist/extensions/agent-browser/lib/results/presentation/source.js +109 -0
  313. package/dist/extensions/agent-browser/lib/results/presentation.js +17 -261
  314. package/dist/extensions/agent-browser/lib/results/recommendation-contracts.js +1 -0
  315. package/dist/extensions/agent-browser/lib/results/recording.js +52 -14
  316. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +14 -5
  317. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +30 -22
  318. package/dist/extensions/agent-browser/lib/results/selector-recovery-target.js +83 -0
  319. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +119 -119
  320. package/dist/extensions/agent-browser/lib/results/snapshot-compact.js +266 -0
  321. package/dist/extensions/agent-browser/lib/results/snapshot-content.js +32 -0
  322. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +104 -71
  323. package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +31 -11
  324. package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +125 -66
  325. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +26 -7
  326. package/dist/extensions/agent-browser/lib/results/snapshot.js +28 -248
  327. package/dist/extensions/agent-browser/lib/results/text.js +16 -5
  328. package/dist/extensions/agent-browser/lib/runtime-args-validation.js +133 -0
  329. package/dist/extensions/agent-browser/lib/runtime-compatibility.js +81 -0
  330. package/dist/extensions/agent-browser/lib/runtime-contracts.js +1 -0
  331. package/dist/extensions/agent-browser/lib/runtime-redaction.js +118 -0
  332. package/dist/extensions/agent-browser/lib/runtime-replay-events.js +144 -0
  333. package/dist/extensions/agent-browser/lib/runtime-session-identity.js +76 -0
  334. package/dist/extensions/agent-browser/lib/runtime-session-plan.js +114 -0
  335. package/dist/extensions/agent-browser/lib/runtime-session-replay.js +123 -0
  336. package/dist/extensions/agent-browser/lib/runtime-tab-correction.js +65 -0
  337. package/dist/extensions/agent-browser/lib/runtime-timeouts.js +28 -0
  338. package/dist/extensions/agent-browser/lib/runtime.js +137 -1041
  339. package/dist/extensions/agent-browser/lib/session-identity.js +51 -0
  340. package/dist/extensions/agent-browser/lib/session-page-observation.js +357 -0
  341. package/dist/extensions/agent-browser/lib/session-page-state.js +178 -333
  342. package/dist/extensions/agent-browser/lib/session-page-types.js +1 -0
  343. package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +78 -0
  344. package/dist/extensions/agent-browser/lib/temp-mutation-queue.js +7 -0
  345. package/dist/extensions/agent-browser/lib/temp-root-ownership.js +234 -0
  346. package/dist/extensions/agent-browser/lib/temp-root.js +207 -0
  347. package/dist/extensions/agent-browser/lib/temp.js +33 -446
  348. package/dist/extensions/agent-browser/lib/tool-surface.js +94 -24
  349. package/dist/extensions/agent-browser/lib/upstream-version.js +3 -2
  350. package/dist/extensions/agent-browser/lib/web-search-providers.js +229 -0
  351. package/dist/extensions/agent-browser/lib/web-search-request.js +108 -0
  352. package/dist/extensions/agent-browser/lib/web-search-results.js +281 -0
  353. package/dist/extensions/agent-browser/lib/web-search-schema.js +82 -0
  354. package/dist/extensions/agent-browser/lib/web-search.js +109 -617
  355. package/dist/extensions/agent-browser/lib/webmcp-observation.js +13 -6
  356. package/dist/extensions/agent-browser/lib/windows-stock-launcher.js +63 -37
  357. package/dist/extensions/agent-browser/script-worker.js +80 -43
  358. package/dist/scripts/agent-browser-target.mjs +4 -2
  359. package/docs/ARCHITECTURE.md +17 -5
  360. package/docs/CODE_QUALITY.md +242 -0
  361. package/docs/COMMAND_REFERENCE.md +251 -220
  362. package/docs/ELECTRON.md +53 -44
  363. package/docs/RELEASE.md +18 -15
  364. package/docs/REQUIREMENTS.md +1 -0
  365. package/docs/SUPPORT_MATRIX.md +76 -75
  366. package/docs/TOOL_CONTRACT.md +145 -116
  367. package/docs/platform-smoke.md +5 -5
  368. package/package.json +143 -120
  369. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  370. package/scripts/agent-browser-target.mjs +6 -2
  371. package/scripts/build.mjs +37 -8
  372. package/scripts/capability-core-commands.mjs +193 -0
  373. package/scripts/capability-options.mjs +283 -0
  374. package/scripts/capability-samples.mjs +133 -0
  375. package/scripts/capability-section.mjs +11 -0
  376. package/scripts/config.mjs +213 -114
  377. package/scripts/convert-browser-session.mjs +30 -9
  378. package/scripts/doctor-sources.mjs +195 -0
  379. package/scripts/doctor.mjs +92 -247
  380. package/scripts/platform-smoke/artifacts.mjs +38 -11
  381. package/scripts/platform-smoke/commands.mjs +104 -0
  382. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  383. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  384. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  385. package/scripts/platform-smoke/doctor.mjs +212 -320
  386. package/scripts/platform-smoke/lease-evidence.mjs +134 -0
  387. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  388. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  389. package/scripts/platform-smoke/targets.mjs +158 -472
  390. package/scripts/platform-smoke.mjs +55 -40
  391. 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
+ }