pi-agent-browser-native 0.9.2 → 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 (392) hide show
  1. package/CHANGELOG.md +91 -5
  2. package/README.md +120 -86
  3. package/dist/extensions/agent-browser/index.js +43065 -2016
  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 +113 -49
  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 -81
  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 +44 -9
  82. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +107 -66
  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 +171 -57
  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 +204 -108
  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 -199
  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 -1114
  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 -910
  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 -753
  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 -816
  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 -139
  228. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  229. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +198 -98
  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 +59 -243
  236. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  237. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +134 -68
  238. package/dist/extensions/agent-browser/lib/playbook.js +18 -14
  239. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  240. package/dist/extensions/agent-browser/lib/process-environment.js +22 -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 +146 -537
  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 +138 -35
  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 -10
  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 +93 -66
  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 -552
  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 -1019
  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 +117 -237
  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 -248
  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 +123 -123
  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 -1037
  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 +188 -324
  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 +22 -10
  360. package/docs/CODE_QUALITY.md +242 -0
  361. package/docs/COMMAND_REFERENCE.md +264 -229
  362. package/docs/ELECTRON.md +53 -44
  363. package/docs/RELEASE.md +21 -17
  364. package/docs/REQUIREMENTS.md +2 -0
  365. package/docs/SESSION_STORAGE.md +1 -1
  366. package/docs/SUPPORT_MATRIX.md +84 -77
  367. package/docs/TOOL_CONTRACT.md +165 -130
  368. package/docs/platform-smoke.md +5 -5
  369. package/package.json +143 -120
  370. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  371. package/scripts/agent-browser-target.mjs +6 -2
  372. package/scripts/build.mjs +37 -8
  373. package/scripts/capability-core-commands.mjs +193 -0
  374. package/scripts/capability-options.mjs +283 -0
  375. package/scripts/capability-samples.mjs +133 -0
  376. package/scripts/capability-section.mjs +11 -0
  377. package/scripts/config.mjs +213 -114
  378. package/scripts/convert-browser-session.mjs +30 -9
  379. package/scripts/doctor-sources.mjs +195 -0
  380. package/scripts/doctor.mjs +92 -247
  381. package/scripts/platform-smoke/artifacts.mjs +38 -11
  382. package/scripts/platform-smoke/commands.mjs +104 -0
  383. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  384. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  385. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  386. package/scripts/platform-smoke/doctor.mjs +212 -320
  387. package/scripts/platform-smoke/lease-evidence.mjs +134 -0
  388. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  389. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  390. package/scripts/platform-smoke/targets.mjs +158 -472
  391. package/scripts/platform-smoke.mjs +55 -40
  392. package/scripts/prepare.mjs +16 -7
@@ -1,264 +1,44 @@
1
1
  import { isRecord } from "../parsing.js";
2
- import { isHighValueControlEntry, selectHighValueControlEntries } from "./snapshot-high-value-controls.js";
3
- import { buildFallbackSnapshotOutline, buildRefLineOrderMap, buildSegmentPreview, buildSnapshotSegments, canUseStructuredSnapshotPreview, chooseAdditionalSegments, choosePrimarySegment, getMeaningfulSegmentLines, getSnapshotRolePriority, isChromeSectionName, isNoiseName, parseSnapshotLines, } from "./snapshot-segments.js";
4
- import { applySnapshotArtifactManifest, writeSnapshotSpillFile } from "./snapshot-spill.js";
5
- import { enrichSnapshotRefEntries, getFullSnapshotData, getSnapshotRefEntries, } from "./snapshot-refs.js";
6
- import { compareRefIds, countLines, truncateText } from "./text.js";
7
- const SNAPSHOT_INLINE_MAX_CHARS = 6_000;
8
- const SNAPSHOT_INLINE_MAX_LINES = 80;
9
- const SNAPSHOT_INLINE_MAX_REFS = 60;
10
- const SNAPSHOT_PRIMARY_PREVIEW_LINES = 8;
11
- const SNAPSHOT_SECTION_PREVIEW_LINES = 2;
12
- const SNAPSHOT_KEY_REF_MAX_LINES = 8;
13
- const SNAPSHOT_OTHER_REF_MAX_LINES = 4;
14
- const SNAPSHOT_HIGH_VALUE_REF_MAX_LINES = 10;
15
- const SNAPSHOT_ROLE_COUNT_MAX_ENTRIES = 4;
16
- const SNAPSHOT_NAME_MAX_CHARS = 96;
17
- function getSnapshotText(data) {
18
- const full = getFullSnapshotData(data);
19
- return typeof full?.snapshot === "string" ? full.snapshot : isRecord(data.snapshot) ? JSON.stringify(data.snapshot) : undefined;
20
- }
21
- function getSnapshotOrigin(data) {
22
- return typeof data.origin === "string" ? data.origin : "(unknown origin)";
23
- }
24
- function getSnapshotRoleCounts(refEntries) {
25
- const counts = {};
26
- for (const entry of refEntries) {
27
- counts[entry.role] = (counts[entry.role] ?? 0) + 1;
28
- }
29
- return counts;
30
- }
31
- function formatRoleCounts(roleCounts) {
32
- const entries = Object.entries(roleCounts);
33
- if (entries.length === 0)
34
- return undefined;
35
- const ordered = entries.sort((left, right) => {
36
- if (right[1] !== left[1])
37
- return right[1] - left[1];
38
- return getSnapshotRolePriority(left[0]) - getSnapshotRolePriority(right[0]);
39
- });
40
- const visibleEntries = ordered.slice(0, SNAPSHOT_ROLE_COUNT_MAX_ENTRIES).map(([role, count]) => `${role} ${count}`);
41
- const omittedEntries = Math.max(0, ordered.length - visibleEntries.length);
42
- if (omittedEntries > 0) {
43
- visibleEntries.push(`+${omittedEntries} more`);
44
- }
45
- return visibleEntries.join(", ");
46
- }
47
- function rankRefEntries(refEntries, previewRefIds, focusRefIds, lineOrderByRef) {
48
- return [...refEntries].sort((left, right) => {
49
- const leftBucket = previewRefIds.has(left.id) ? 0 : focusRefIds.has(left.id) ? 1 : 2;
50
- const rightBucket = previewRefIds.has(right.id) ? 0 : focusRefIds.has(right.id) ? 1 : 2;
51
- if (leftBucket !== rightBucket)
52
- return leftBucket - rightBucket;
53
- const rolePriority = getSnapshotRolePriority(left.role) - getSnapshotRolePriority(right.role);
54
- if (rolePriority !== 0)
55
- return rolePriority;
56
- const leftHasName = left.name.length > 0 ? 0 : 1;
57
- const rightHasName = right.name.length > 0 ? 0 : 1;
58
- if (leftHasName !== rightHasName)
59
- return leftHasName - rightHasName;
60
- const leftLineOrder = lineOrderByRef.get(left.id) ?? Number.MAX_SAFE_INTEGER;
61
- const rightLineOrder = lineOrderByRef.get(right.id) ?? Number.MAX_SAFE_INTEGER;
62
- if (leftLineOrder !== rightLineOrder)
63
- return leftLineOrder - rightLineOrder;
64
- return compareRefIds(left.id, right.id);
65
- });
66
- }
67
- function formatCompactRef(entry) {
68
- const suffix = entry.name.length > 0 ? ` "${truncateText(entry.name, SNAPSHOT_NAME_MAX_CHARS)}"` : "";
69
- return `- ${entry.id} ${entry.role}${suffix}`;
70
- }
2
+ import { buildCompactSnapshotView } from "./snapshot-compact.js";
3
+ import { formatRawSnapshotText, formatSnapshotSummary, getSnapshotText, } from "./snapshot-content.js";
4
+ import { getSnapshotRefEntries } from "./snapshot-refs.js";
5
+ import { applySnapshotArtifactManifest, writeSnapshotSpillFile, } from "./snapshot-spill.js";
6
+ import { countLines, stringifyUnknown } from "./text.js";
7
+ export { formatRawSnapshotText, formatSnapshotSummary } from "./snapshot-content.js";
71
8
  function shouldCompactSnapshot(rawText, data) {
72
- const snapshot = getSnapshotText(data) ?? "";
73
- const refEntries = getSnapshotRefEntries(data);
74
- return (rawText.length > SNAPSHOT_INLINE_MAX_CHARS ||
75
- countLines(snapshot) > SNAPSHOT_INLINE_MAX_LINES ||
76
- refEntries.length > SNAPSHOT_INLINE_MAX_REFS);
77
- }
78
- export function formatSnapshotSummary(data) {
79
- const origin = typeof data.origin === "string" ? data.origin : "page";
80
- if (isRecord(data.snapshot) && data.snapshot.kind !== "full")
81
- return `Snapshot ${data.snapshot.kind}: revision ${data.snapshot.revision} on ${origin}`;
82
- const refs = getSnapshotRefEntries(data).length;
83
- return `Snapshot: ${refs} refs on ${origin}`;
84
- }
85
- export function formatRawSnapshotText(data) {
86
- const origin = getSnapshotOrigin(data);
87
- const refs = getSnapshotRefEntries(data).length;
88
- const snapshot = getSnapshotText(data);
89
- if (isRecord(data.snapshot) && data.snapshot.kind !== "full")
90
- return `Origin: ${origin}\n${formatSnapshotSummary(data)}\n\n${snapshot}`;
91
- if (!snapshot) {
92
- return `Origin: ${origin}\nRefs: ${refs}\n\n(no interactive elements)`;
93
- }
94
- return `Origin: ${origin}\nRefs: ${refs}\n\n${snapshot}`;
9
+ return (rawText.length > 6_000 ||
10
+ countLines(getSnapshotText(data) ?? "") > 80 ||
11
+ getSnapshotRefEntries(data).length > 60);
95
12
  }
96
- export async function buildSnapshotPresentation(data, persistentArtifactStore = undefined, artifactManifest = undefined) {
97
- const summary = formatSnapshotSummary(data);
98
- const rawText = formatRawSnapshotText(data);
99
- // Native partials are already compact patches, not accessibility trees.
100
- // The ordinary large-output presenter handles truly oversized patches.
101
- if ((isRecord(data.snapshot) && data.snapshot.kind !== "full") || !shouldCompactSnapshot(rawText, data)) {
102
- return {
103
- content: [{ type: "text", text: rawText }],
104
- data,
105
- summary,
106
- };
107
- }
108
- let fullOutputPath;
109
- let spill;
110
- let spillErrorText;
13
+ async function getSnapshotSpill(data, store) {
111
14
  try {
112
- spill = await writeSnapshotSpillFile(data, persistentArtifactStore);
113
- fullOutputPath = spill.path;
15
+ const spill = await writeSnapshotSpillFile(data, store);
16
+ return { spill, fullOutputPath: spill.path };
114
17
  }
115
18
  catch (error) {
116
- spillErrorText = error instanceof Error ? error.message : String(error);
117
- }
118
- const snapshot = getSnapshotText(data) ?? "(no interactive elements)";
119
- const snapshotLines = parseSnapshotLines(snapshot);
120
- const refEntries = enrichSnapshotRefEntries(getSnapshotRefEntries(data), snapshotLines);
121
- const roleCounts = getSnapshotRoleCounts(refEntries);
122
- const roleCountsText = formatRoleCounts(roleCounts);
123
- const useStructuredPreview = canUseStructuredSnapshotPreview(snapshotLines, refEntries);
124
- const snapshotSegments = useStructuredPreview ? buildSnapshotSegments(snapshotLines) : [];
125
- const primarySegment = useStructuredPreview ? choosePrimarySegment(snapshotSegments) : undefined;
126
- const additionalSegments = useStructuredPreview ? chooseAdditionalSegments(snapshotSegments, primarySegment) : [];
127
- const additionalSegmentCount = useStructuredPreview && primarySegment ? Math.max(0, snapshotSegments.length - 1) : 0;
128
- const omittedAdditionalSectionCount = Math.max(0, additionalSegmentCount - additionalSegments.length);
129
- const primaryPreview = primarySegment ? buildSegmentPreview(primarySegment, SNAPSHOT_PRIMARY_PREVIEW_LINES) : undefined;
130
- const additionalPreviews = additionalSegments
131
- .map((segment) => ({
132
- preview: buildSegmentPreview(segment, SNAPSHOT_SECTION_PREVIEW_LINES),
133
- segment,
134
- }))
135
- .filter(({ preview }) => preview.lines.length > 0);
136
- const fallbackPreview = !useStructuredPreview || !primaryPreview || primaryPreview.lines.length === 0 ? buildFallbackSnapshotOutline(snapshotLines) : undefined;
137
- const previewRefIds = new Set([
138
- ...(primaryPreview?.refIds ?? []),
139
- ...additionalPreviews.flatMap(({ preview }) => preview.refIds),
140
- ...(fallbackPreview?.refIds ?? []),
141
- ]);
142
- const focusRefIds = new Set([
143
- ...(useStructuredPreview && primarySegment
144
- ? getMeaningfulSegmentLines(primarySegment).flatMap((line) => (line.ref ? [line.ref] : []))
145
- : []),
146
- ...(useStructuredPreview
147
- ? additionalSegments.flatMap((segment) => getMeaningfulSegmentLines(segment).flatMap((line) => (line.ref ? [line.ref] : [])))
148
- : []),
149
- ...(fallbackPreview?.refIds ?? []),
150
- ]);
151
- const lineOrderByRef = useStructuredPreview ? buildRefLineOrderMap(snapshotLines) : new Map();
152
- const rankedRefEntries = rankRefEntries(refEntries, previewRefIds, focusRefIds, lineOrderByRef);
153
- const visibleRankedRefEntries = rankedRefEntries.filter((entry) => !isNoiseName(entry.name) && !isChromeSectionName(entry.name) && !(entry.role === "heading" && entry.name.length <= 2));
154
- const keyRefEntries = visibleRankedRefEntries.slice(0, SNAPSHOT_KEY_REF_MAX_LINES);
155
- const keyRefIdSet = new Set(keyRefEntries.map((entry) => entry.id));
156
- const otherRefEntries = visibleRankedRefEntries
157
- .filter((entry) => !keyRefIdSet.has(entry.id))
158
- .slice(0, SNAPSHOT_OTHER_REF_MAX_LINES);
159
- const displayedRefIdSet = new Set([...keyRefEntries, ...otherRefEntries].map((entry) => entry.id));
160
- const omittedRefEntries = visibleRankedRefEntries.filter((entry) => !displayedRefIdSet.has(entry.id));
161
- const highValueControlEntries = omittedRefEntries.filter((entry) => isHighValueControlEntry(entry) && !isNoiseName(entry.name) && !isChromeSectionName(entry.name));
162
- const visibleHighValueControlEntries = selectHighValueControlEntries(highValueControlEntries, SNAPSHOT_HIGH_VALUE_REF_MAX_LINES);
163
- const omittedHighValueControls = Math.max(0, highValueControlEntries.length - visibleHighValueControlEntries.length);
164
- const omittedNonHighlightedRefs = Math.max(0, omittedRefEntries.length - highValueControlEntries.length);
165
- const origin = getSnapshotOrigin(data);
166
- const lines = [
167
- `Origin: ${origin}`,
168
- `Refs: ${refEntries.length}`,
169
- ...(roleCountsText ? [`Top roles: ${roleCountsText}`] : []),
170
- "",
171
- "Compact snapshot view.",
172
- "Viewport note: compact snapshots are DOM/signal-prioritized, not guaranteed to start with the currently scrolled viewport; use the full redacted snapshot, a screenshot, or listed high-value refs when viewport context matters.",
173
- ];
174
- if (fallbackPreview) {
175
- lines.push("", "Compact outline:", ...(fallbackPreview.lines.length > 0 ? fallbackPreview.lines : ["(no interactive elements)"]));
176
- if (fallbackPreview.omittedCount > 0) {
177
- lines.push(`- ... (${fallbackPreview.omittedCount} additional snapshot lines omitted; ${fullOutputPath ? `full output path: ${fullOutputPath}` : "the full redacted snapshot was omitted"})`);
178
- }
179
- }
180
- else {
181
- lines.push("", "Primary content:", ...(primaryPreview?.lines ?? ["(no interactive elements)"]));
182
- if ((primaryPreview?.omittedCount ?? 0) > 0) {
183
- lines.push(`- ... (${primaryPreview?.omittedCount} more lines in this section)`);
184
- }
185
- if (additionalPreviews.length > 0) {
186
- lines.push("", "Additional sections:");
187
- additionalPreviews.forEach(({ preview }, index) => {
188
- if (index > 0)
189
- lines.push("");
190
- lines.push(...preview.lines);
191
- if (preview.omittedCount > 0) {
192
- lines.push(`- ... (${preview.omittedCount} more lines in this section)`);
193
- }
194
- });
195
- if (omittedAdditionalSectionCount > 0) {
196
- lines.push(`- ... (${omittedAdditionalSectionCount} more sections omitted)`);
197
- }
198
- }
19
+ return { spillErrorText: error instanceof Error ? error.message : stringifyUnknown(error) };
199
20
  }
200
- lines.push("", "Key refs:", ...(keyRefEntries.length > 0 ? keyRefEntries.map(formatCompactRef) : ["(no refs)"]));
201
- if (otherRefEntries.length > 0) {
202
- lines.push("", "Other refs:", ...otherRefEntries.map(formatCompactRef));
203
- }
204
- if (omittedNonHighlightedRefs > 0) {
205
- lines.push(`- ... (${omittedNonHighlightedRefs} additional refs omitted)`);
206
- }
207
- if (visibleHighValueControlEntries.length > 0) {
208
- lines.push("", "Omitted high-value controls:", ...visibleHighValueControlEntries.map(formatCompactRef));
209
- if (omittedHighValueControls > 0) {
210
- lines.push(`- ... (${omittedHighValueControls} additional high-value controls omitted)`);
211
- }
21
+ }
22
+ export async function buildSnapshotPresentation(data, persistentArtifactStore, artifactManifest) {
23
+ const summary = formatSnapshotSummary(data);
24
+ const rawText = formatRawSnapshotText(data);
25
+ // Native partials are patches, not accessibility trees; large-output owns oversized patches.
26
+ if ((isRecord(data.snapshot) && data.snapshot.kind !== "full") ||
27
+ !shouldCompactSnapshot(rawText, data)) {
28
+ return { content: [{ type: "text", text: rawText }], data, summary };
212
29
  }
213
- lines.push("", fullOutputPath
214
- ? `Full redacted snapshot path: ${fullOutputPath}`
215
- : `Full redacted snapshot unavailable: ${spillErrorText ?? "temp spill file could not be created."}`);
30
+ const { spill, fullOutputPath, spillErrorText } = await getSnapshotSpill(data, persistentArtifactStore);
31
+ const compact = buildCompactSnapshotView(data, fullOutputPath, spillErrorText);
216
32
  const manifestFields = applySnapshotArtifactManifest({
217
33
  baseManifest: artifactManifest,
218
34
  command: "snapshot",
219
35
  fullOutputPath,
220
36
  spill,
221
37
  });
222
- if (manifestFields.artifactRetentionSummary) {
223
- lines.push("", manifestFields.artifactRetentionSummary);
38
+ const notice = manifestFields.artifactRetentionSummary;
39
+ const text = compact.content.at(0);
40
+ if (notice !== undefined && notice.length > 0 && text?.type === "text") {
41
+ compact.content[0] = { type: "text", text: `${text.text}\n\n${notice}` };
224
42
  }
225
- return {
226
- ...manifestFields,
227
- content: [{ type: "text", text: lines.join("\n") }],
228
- data: {
229
- compacted: true,
230
- fullOutputPath,
231
- origin,
232
- previewMode: fallbackPreview ? "outline" : "structured",
233
- viewportOrdering: "dom-signal-prioritized",
234
- spillError: spillErrorText,
235
- previewRefIds: [...previewRefIds],
236
- highValueControlRefIds: visibleHighValueControlEntries.map((entry) => entry.id),
237
- additionalSectionsOmitted: omittedAdditionalSectionCount,
238
- previewSections: [
239
- ...(primarySegment
240
- ? [
241
- {
242
- linesShown: primaryPreview?.lines.length ?? 0,
243
- omittedLines: primaryPreview?.omittedCount ?? 0,
244
- role: primarySegment.root.role,
245
- title: primarySegment.root.name,
246
- },
247
- ]
248
- : []),
249
- ...additionalPreviews.map(({ preview, segment }) => ({
250
- linesShown: preview.lines.length,
251
- omittedLines: preview.omittedCount,
252
- role: segment.root.role,
253
- title: segment.root.name,
254
- })),
255
- ],
256
- refCount: refEntries.length,
257
- roleCounts,
258
- snapshotLineCount: countLines(snapshot),
259
- structuredPreviewUsed: !fallbackPreview,
260
- },
261
- fullOutputPath,
262
- summary: `${summary} (compact)`,
263
- };
43
+ return { ...manifestFields, ...compact, fullOutputPath, summary: `${summary} (compact)` };
264
44
  }
@@ -1,16 +1,26 @@
1
1
  export function stringifyUnknown(value) {
2
- if (typeof value === "string")
2
+ if (typeof value === "string") {
3
3
  return value;
4
- if (typeof value === "number" || typeof value === "boolean")
4
+ }
5
+ if (typeof value === "number" || typeof value === "boolean") {
5
6
  return String(value);
6
- if (value === null || value === undefined)
7
+ }
8
+ if (value === null || value === undefined) {
7
9
  return "";
10
+ }
8
11
  try {
9
- return JSON.stringify(value, null, 2);
12
+ const serialized = JSON.stringify(value, null, 2);
13
+ return typeof serialized === "string" ? serialized : "";
10
14
  }
11
15
  catch {
16
+ return stringifyFallback(value);
17
+ }
18
+ }
19
+ function stringifyFallback(value) {
20
+ if (typeof value === "bigint" || typeof value === "symbol" || typeof value === "function") {
12
21
  return String(value);
13
22
  }
23
+ return Object.prototype.toString.call(value);
14
24
  }
15
25
  export function countLines(text) {
16
26
  return text.length === 0 ? 0 : text.split("\n").length;
@@ -19,8 +29,9 @@ export function normalizeWhitespace(text) {
19
29
  return text.replace(/\s+/g, " ").trim();
20
30
  }
21
31
  export function truncateText(text, maxChars) {
22
- if (text.length <= maxChars)
32
+ if (text.length <= maxChars) {
23
33
  return text;
34
+ }
24
35
  return `${text.slice(0, Math.max(1, maxChars - 1))}…`;
25
36
  }
26
37
  export function compareRefIds(left, right) {
@@ -0,0 +1,133 @@
1
+ import { parseArgvDescriptor } from "./argv-descriptor.js";
2
+ import { GLOBAL_BOOLEAN_FLAGS_WITH_OPTIONAL_VALUES, GLOBAL_VALUE_FLAGS_ALLOWING_DASH_VALUE, PREVALIDATED_VALUE_FLAGS, stripUpstreamGlobalFlags, } from "./argv-grammar.js";
3
+ import { isOpenNavigationCommand } from "./command-taxonomy.js";
4
+ import { TARGET_AGENT_BROWSER_VERSION } from "./upstream-version.js";
5
+ const INSPECTION_FLAGS = new Set(["--help", "-h", "--version", "-V"]);
6
+ const SHELL_OPERATOR_TOKENS = new Set(["&&", "||", "|", ";", ">", ">>", "<"]);
7
+ export function isPlainTextInspectionArgs(args) {
8
+ return args.some((token) => INSPECTION_FLAGS.has(token));
9
+ }
10
+ function getSingleKeyCommandValidationError(args) {
11
+ const { commandInfo, upstreamCommandTokens: tokens } = parseArgvDescriptor(args);
12
+ const command = commandInfo.command;
13
+ if (!["press", "key", "keydown", "keyup"].includes(command ?? "") || tokens.length === 2) {
14
+ return;
15
+ }
16
+ const label = command === "key" ? "key/press" : command;
17
+ return `agent-browser ${label ?? ""} accepts exactly one key argument. Do not pass a selector or ref to ${label ?? ""}; focus or click the target first, then run ${command ?? ""} <key> (for example: focus @e1, then press Enter).`;
18
+ }
19
+ function getBareMcpValidationError(args) {
20
+ const { commandInfo, upstreamCommandTokens: tokens } = parseArgvDescriptor(args);
21
+ if (commandInfo.command !== "mcp" || tokens.includes("--help") || tokens.includes("-h")) {
22
+ return;
23
+ }
24
+ return "agent-browser mcp starts a stdio MCP server for external MCP clients, not a one-shot native agent_browser tool workflow. Use the native agent_browser tool modes directly, or configure an MCP client to launch `agent-browser mcp`. Use `mcp --help` for help.";
25
+ }
26
+ function getUnsupportedInlineWaitDownloadError(args) {
27
+ const descriptor = parseArgvDescriptor(args);
28
+ if (descriptor.commandInfo.command !== "wait" ||
29
+ !descriptor.upstreamCommandTokens.some((token) => token.startsWith("--download="))) {
30
+ return;
31
+ }
32
+ return `agent-browser ${TARGET_AGENT_BROWSER_VERSION} does not support \`wait --download=<path>\`. Pass the optional path as a separate argument: \`wait --download <path>\` (or \`wait -d <path>\`).`;
33
+ }
34
+ function getBareNoSandboxValidationError(args, batchStep) {
35
+ // Native batch rows skip global parsing; --args is effective only on the outer CLI call.
36
+ const tokens = batchStep ? args : stripUpstreamGlobalFlags(args);
37
+ const command = tokens[0];
38
+ const leading = command === "--no-sandbox";
39
+ if (!leading &&
40
+ (!isOpenNavigationCommand(command) || !tokens.slice(1).includes("--no-sandbox"))) {
41
+ return;
42
+ }
43
+ const explanation = leading
44
+ ? "`--no-sandbox` is not an agent-browser command."
45
+ : `\`--no-sandbox\` is ignored as an option by \`${command}\`.`;
46
+ return `${explanation} It is a Chromium launch argument. Put it in top-level \`--args\` and start a fresh session: { args: ["--args", "--no-sandbox", "open", "https://example.com"], sessionMode: "fresh" }. For batch, put --args before batch, not inside a step.`;
47
+ }
48
+ function getForbiddenToolTokenError(args) {
49
+ const shellOperator = args.find((token) => SHELL_OPERATOR_TOKENS.has(token));
50
+ if (shellOperator !== undefined) {
51
+ return `Do not pass shell operators like \`${shellOperator}\`. Pass exact agent-browser CLI arguments only.`;
52
+ }
53
+ if (args.some((token) => token === "--session-mode" || token.startsWith("--session-mode="))) {
54
+ return 'Do not pass `--session-mode` in args. Use the top-level agent_browser `sessionMode` field instead, for example { args: ["--profile", "Default", "open", "https://example.com"], sessionMode: "fresh" }.';
55
+ }
56
+ return;
57
+ }
58
+ export function validateToolArgs(args, options = {}) {
59
+ if (args.length === 0) {
60
+ return "`args` must contain at least one agent-browser command token.";
61
+ }
62
+ const forbidden = getForbiddenToolTokenError(args);
63
+ if (forbidden !== undefined) {
64
+ return forbidden;
65
+ }
66
+ return getNativeCommandShapeError(args, options.batchStep === true);
67
+ }
68
+ function getNativeCommandShapeError(args, batchStep) {
69
+ const inspection = !batchStep && isPlainTextInspectionArgs(args);
70
+ const invalidValueFlag = inspection ? undefined : getInvalidValueFlagDetails(args, !batchStep);
71
+ if (invalidValueFlag?.reason === "unsupported-assignment") {
72
+ return formatInvalidValueFlagError(invalidValueFlag, batchStep);
73
+ }
74
+ return ((inspection ? undefined : getBareNoSandboxValidationError(args, batchStep)) ??
75
+ getBareMcpValidationError(args) ??
76
+ getSingleKeyCommandValidationError(args) ??
77
+ getUnsupportedInlineWaitDownloadError(args));
78
+ }
79
+ function unsupportedAssignment(token, flag, allowRestoreAssignment) {
80
+ return (token.includes("=") &&
81
+ (PREVALIDATED_VALUE_FLAGS.has(flag) ||
82
+ GLOBAL_BOOLEAN_FLAGS_WITH_OPTIONAL_VALUES.has(flag) ||
83
+ (!allowRestoreAssignment && flag === "--restore")));
84
+ }
85
+ function valueFlagProblem(flag, receivedToken) {
86
+ if (receivedToken === undefined || (flag === "--args" && receivedToken.length === 0)) {
87
+ return "missing-value";
88
+ }
89
+ if (receivedToken.startsWith("-") && !GLOBAL_VALUE_FLAGS_ALLOWING_DASH_VALUE.has(flag)) {
90
+ return "unexpected-flag";
91
+ }
92
+ return;
93
+ }
94
+ export function getInvalidValueFlagDetails(args, allowRestoreAssignment = true) {
95
+ for (let index = 0; index < args.length; index += 1) {
96
+ const token = args[index];
97
+ if (!token.startsWith("-")) {
98
+ continue;
99
+ }
100
+ const flag = token.split("=", 1)[0] ?? token;
101
+ if (unsupportedAssignment(token, flag, allowRestoreAssignment)) {
102
+ return { flag, index, reason: "unsupported-assignment" };
103
+ }
104
+ if (!PREVALIDATED_VALUE_FLAGS.has(flag)) {
105
+ continue;
106
+ }
107
+ const receivedToken = args.at(index + 1);
108
+ const reason = valueFlagProblem(flag, receivedToken);
109
+ if (reason !== undefined) {
110
+ return reason === "unexpected-flag"
111
+ ? { flag, index, reason, receivedToken }
112
+ : { flag, index, reason };
113
+ }
114
+ index += 1;
115
+ }
116
+ return;
117
+ }
118
+ export function formatInvalidValueFlagError(details, batchStep = false) {
119
+ if (details.reason === "unsupported-assignment") {
120
+ if (batchStep) {
121
+ return details.flag === "--restore"
122
+ ? "Global `--restore=<key>` belongs before `batch` in top-level args, not inside a batch step."
123
+ : `Global \`${details.flag}=<value>\` is not supported inside a batch step. Move \`${details.flag}\` and its value before \`batch\` as separate top-level args.`;
124
+ }
125
+ return `agent-browser ${TARGET_AGENT_BROWSER_VERSION} does not support \`${details.flag}=<value>\`. Pass \`${details.flag}\` and its value as separate arguments.`;
126
+ }
127
+ if (details.reason === "unexpected-flag" &&
128
+ details.receivedToken !== undefined &&
129
+ details.receivedToken.length > 0) {
130
+ return `Flag \`${details.flag}\` requires a value, but received \`${details.receivedToken}\` instead. Pass a non-flag value immediately after \`${details.flag}\`.`;
131
+ }
132
+ return `Flag \`${details.flag}\` requires a value immediately after it. Pass a non-flag token like \`${details.flag} demo\`.`;
133
+ }
@@ -0,0 +1,81 @@
1
+ import { getBooleanFlagValue, isUpstreamEnvFlagEnabled, scanUpstreamGlobalFlagOccurrences, } from "./argv-grammar.js";
2
+ import { isOpenNavigationCommand } from "./command-taxonomy.js";
3
+ import { getAgentBrowserProcessEnvironment } from "./process-environment.js";
4
+ const OPENAI_HOSTS = new Set(["chat.com", "chat.openai.com", "chatgpt.com"]);
5
+ const DEFAULT_USER_AGENT_BY_PLATFORM = {
6
+ darwin: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
7
+ linux: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
8
+ win32: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
9
+ };
10
+ const FALLBACK_USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";
11
+ export function getDefaultHeadlessCompatUserAgent(platform = process.platform) {
12
+ return DEFAULT_USER_AGENT_BY_PLATFORM[platform] ?? FALLBACK_USER_AGENT;
13
+ }
14
+ function hasLaunchOverride(args, env) {
15
+ const flags = ["--user-agent", "--args", "--cdp", "--provider", "-p"];
16
+ return (flags.some((flag) => args.some((token) => token === flag || token.startsWith(`${flag}=`))) ||
17
+ [
18
+ env.AGENT_BROWSER_SESSION,
19
+ env.AGENT_BROWSER_USER_AGENT,
20
+ env.AGENT_BROWSER_ARGS,
21
+ env.AGENT_BROWSER_CDP,
22
+ env.AGENT_BROWSER_PROVIDER,
23
+ ].some((value) => value !== undefined));
24
+ }
25
+ function hasInteractiveLaunchMode(args, env) {
26
+ const modes = [
27
+ ["--headed", env.AGENT_BROWSER_HEADED],
28
+ ["--auto-connect", env.AGENT_BROWSER_AUTO_CONNECT],
29
+ ];
30
+ return modes.some(([flag, value]) => getBooleanFlagValue(args, flag) ?? isUpstreamEnvFlagEnabled(value));
31
+ }
32
+ export function canUseHeadlessCompatibilityUserAgent(args, env = getAgentBrowserProcessEnvironment()) {
33
+ if (hasLaunchOverride(args, env)) {
34
+ return false;
35
+ }
36
+ if (hasInteractiveLaunchMode(args, env)) {
37
+ return false;
38
+ }
39
+ const engine = scanUpstreamGlobalFlagOccurrences(args, "--engine").at(-1)?.value ?? env.AGENT_BROWSER_ENGINE;
40
+ return (engine ?? "chrome") === "chrome" || engine === "";
41
+ }
42
+ function parseNavigationUrl(url) {
43
+ if (url === undefined || url.length === 0) {
44
+ return;
45
+ }
46
+ try {
47
+ return new URL(url);
48
+ }
49
+ catch {
50
+ try {
51
+ return new URL(`https://${url}`);
52
+ }
53
+ catch {
54
+ return;
55
+ }
56
+ }
57
+ }
58
+ export function getCompatibilityWorkaround(args, commandInfo) {
59
+ if (!isOpenNavigationCommand(commandInfo.command) ||
60
+ !canUseHeadlessCompatibilityUserAgent(args)) {
61
+ return;
62
+ }
63
+ const target = parseNavigationUrl(commandInfo.subcommand);
64
+ if (!target || !["http:", "https:"].includes(target.protocol)) {
65
+ return;
66
+ }
67
+ const hostname = target.hostname.toLowerCase();
68
+ if (hostname === "dash.cloudflare.com") {
69
+ return {
70
+ id: "cloudflare-headless-user-agent",
71
+ reason: "Cloudflare Dashboard challenges the default headless Chrome user agent; inject a normal Chrome user agent so authenticated headless browsing reaches the dashboard instead of Turnstile.",
72
+ };
73
+ }
74
+ if (!OPENAI_HOSTS.has(hostname)) {
75
+ return;
76
+ }
77
+ return {
78
+ id: "chatgpt-headless-user-agent",
79
+ reason: "OpenAI web properties currently challenge the default headless Chrome user agent; inject a normal Chrome user agent to preserve the default headless workflow without requiring headed mode or auto-connect.",
80
+ };
81
+ }