pi-agent-browser-native 0.9.3 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. package/CHANGELOG.md +106 -5
  2. package/README.md +58 -791
  3. package/dist/extensions/agent-browser/index.js +43101 -2031
  4. package/dist/extensions/agent-browser/lib/argv-descriptor.js +49 -26
  5. package/dist/extensions/agent-browser/lib/argv-grammar.js +82 -93
  6. package/dist/extensions/agent-browser/lib/bash-guard.js +129 -126
  7. package/dist/extensions/agent-browser/lib/batch-lifecycle.js +112 -51
  8. package/dist/extensions/agent-browser/lib/browser-execution-claim-codec.js +61 -0
  9. package/dist/extensions/agent-browser/lib/browser-execution-claim-storage.js +232 -0
  10. package/dist/extensions/agent-browser/lib/browser-execution-claims.js +202 -0
  11. package/dist/extensions/agent-browser/lib/browser-execution-identity.js +77 -0
  12. package/dist/extensions/agent-browser/lib/browser-journal-branch.js +98 -0
  13. package/dist/extensions/agent-browser/lib/browser-journal-contracts.js +1 -0
  14. package/dist/extensions/agent-browser/lib/browser-journal-projection.js +221 -0
  15. package/dist/extensions/agent-browser/lib/browser-journal-reader.js +89 -0
  16. package/dist/extensions/agent-browser/lib/browser-journal-replay.js +246 -0
  17. package/dist/extensions/agent-browser/lib/browser-journal.js +103 -394
  18. package/dist/extensions/agent-browser/lib/browser-legacy-pages.js +220 -0
  19. package/dist/extensions/agent-browser/lib/browser-legacy-projection.js +282 -0
  20. package/dist/extensions/agent-browser/lib/browser-legacy-types.js +1 -0
  21. package/dist/extensions/agent-browser/lib/browser-session-conversion-stream.js +217 -0
  22. package/dist/extensions/agent-browser/lib/browser-session-conversion.js +80 -335
  23. package/dist/extensions/agent-browser/lib/browser-transcript-contracts.js +35 -0
  24. package/dist/extensions/agent-browser/lib/browser-transcript-validation.js +166 -0
  25. package/dist/extensions/agent-browser/lib/browser-transcript.js +137 -82
  26. package/dist/extensions/agent-browser/lib/browser-value-parsing.js +15 -0
  27. package/dist/extensions/agent-browser/lib/command-capabilities.js +340 -0
  28. package/dist/extensions/agent-browser/lib/command-policy.js +107 -88
  29. package/dist/extensions/agent-browser/lib/command-taxonomy.js +49 -322
  30. package/dist/extensions/agent-browser/lib/config-policy.js +138 -343
  31. package/dist/extensions/agent-browser/lib/config-providers.js +71 -0
  32. package/dist/extensions/agent-browser/lib/config-validation.js +231 -0
  33. package/dist/extensions/agent-browser/lib/config.js +20 -8
  34. package/dist/extensions/agent-browser/lib/electron/cdp.js +20 -8
  35. package/dist/extensions/agent-browser/lib/electron/cleanup.js +128 -83
  36. package/dist/extensions/agent-browser/lib/electron/discovery-darwin.js +109 -0
  37. package/dist/extensions/agent-browser/lib/electron/discovery-desktop.js +136 -0
  38. package/dist/extensions/agent-browser/lib/electron/discovery-evidence.js +90 -0
  39. package/dist/extensions/agent-browser/lib/electron/discovery-linux.js +93 -0
  40. package/dist/extensions/agent-browser/lib/electron/discovery-packages.js +162 -0
  41. package/dist/extensions/agent-browser/lib/electron/discovery-types.js +2 -0
  42. package/dist/extensions/agent-browser/lib/electron/discovery.js +140 -549
  43. package/dist/extensions/agent-browser/lib/electron/launch-monitor.js +102 -0
  44. package/dist/extensions/agent-browser/lib/electron/launch-process.js +209 -0
  45. package/dist/extensions/agent-browser/lib/electron/launch-types.js +2 -0
  46. package/dist/extensions/agent-browser/lib/electron/launch.js +261 -355
  47. package/dist/extensions/agent-browser/lib/executable-path.js +21 -12
  48. package/dist/extensions/agent-browser/lib/execution-cwd.js +35 -18
  49. package/dist/extensions/agent-browser/lib/fs-utils.js +1 -9
  50. package/dist/extensions/agent-browser/lib/input-modes/electron.js +162 -121
  51. package/dist/extensions/agent-browser/lib/input-modes/job.js +123 -317
  52. package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +116 -0
  53. package/dist/extensions/agent-browser/lib/input-modes/lookup-plan.js +132 -0
  54. package/dist/extensions/agent-browser/lib/input-modes/lookup-redaction.js +57 -0
  55. package/dist/extensions/agent-browser/lib/input-modes/lookup-source-evidence.js +151 -0
  56. package/dist/extensions/agent-browser/lib/input-modes/lookup-workspace.js +142 -0
  57. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +58 -412
  58. package/dist/extensions/agent-browser/lib/input-modes/params.js +86 -40
  59. package/dist/extensions/agent-browser/lib/input-modes/qa-analysis.js +268 -0
  60. package/dist/extensions/agent-browser/lib/input-modes/qa-presentation.js +117 -0
  61. package/dist/extensions/agent-browser/lib/input-modes/script-child.js +396 -0
  62. package/dist/extensions/agent-browser/lib/input-modes/script-protocol.js +86 -0
  63. package/dist/extensions/agent-browser/lib/input-modes/script-types.js +1 -0
  64. package/dist/extensions/agent-browser/lib/input-modes/script-validation.js +60 -0
  65. package/dist/extensions/agent-browser/lib/input-modes/script.js +60 -409
  66. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +218 -128
  67. package/dist/extensions/agent-browser/lib/input-modes/shared.js +15 -4
  68. package/dist/extensions/agent-browser/lib/input-modes/types.js +56 -7
  69. package/dist/extensions/agent-browser/lib/json-schema.js +22 -10
  70. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +17 -5
  71. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +92 -425
  72. package/dist/extensions/agent-browser/lib/managed-session-posix-storage.js +58 -0
  73. package/dist/extensions/agent-browser/lib/managed-session-project-identity.js +244 -0
  74. package/dist/extensions/agent-browser/lib/managed-session-restore-context.js +84 -0
  75. package/dist/extensions/agent-browser/lib/managed-session-restore-policy.js +119 -0
  76. package/dist/extensions/agent-browser/lib/managed-session-restore-state.js +83 -0
  77. package/dist/extensions/agent-browser/lib/managed-session-restore.js +168 -300
  78. package/dist/extensions/agent-browser/lib/managed-session-snapshot-records.js +277 -0
  79. package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +128 -305
  80. package/dist/extensions/agent-browser/lib/managed-session-storage.js +56 -253
  81. package/dist/extensions/agent-browser/lib/native-confirmation.js +140 -0
  82. package/dist/extensions/agent-browser/lib/native-output.js +43 -9
  83. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +106 -59
  84. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-merge.js +14 -6
  85. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +109 -57
  86. package/dist/extensions/agent-browser/lib/orchestration/browser-run/browser-observation-result.js +82 -0
  87. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +164 -60
  88. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostic-values.js +31 -0
  89. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +152 -781
  90. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-observation.js +203 -0
  91. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-text-diagnostics.js +109 -0
  92. package/dist/extensions/agent-browser/lib/orchestration/browser-run/fill-diagnostics.js +119 -0
  93. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-action-recovery.js +147 -0
  94. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-actions.js +144 -0
  95. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-content.js +123 -0
  96. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-contracts.js +1 -0
  97. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-details.js +156 -0
  98. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-electron.js +187 -0
  99. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-evidence.js +39 -0
  100. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-missing-binary.js +89 -0
  101. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-recovery.js +97 -0
  102. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-redaction.js +106 -0
  103. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-timeout.js +110 -0
  104. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +41 -538
  105. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +199 -154
  106. package/dist/extensions/agent-browser/lib/orchestration/browser-run/interaction-diagnostics.js +290 -0
  107. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-close.js +167 -0
  108. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-inspection.js +108 -0
  109. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +127 -205
  110. package/dist/extensions/agent-browser/lib/orchestration/browser-run/native-helper-observation.js +65 -0
  111. package/dist/extensions/agent-browser/lib/orchestration/browser-run/observation-types.js +1 -0
  112. package/dist/extensions/agent-browser/lib/orchestration/browser-run/overlay-diagnostics.js +120 -0
  113. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +113 -30
  114. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +109 -28
  115. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter-data.js +150 -0
  116. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +147 -253
  117. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-rendered-text.js +147 -0
  118. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +59 -24
  119. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-artifacts.js +159 -0
  120. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-command.js +131 -0
  121. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-contracts.js +1 -0
  122. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-daemon.js +93 -0
  123. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-failure.js +42 -0
  124. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-guards.js +242 -0
  125. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-input.js +75 -0
  126. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-observations.js +92 -0
  127. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-selection.js +254 -0
  128. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-state.js +121 -0
  129. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-refs.js +130 -0
  130. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-resources.js +114 -0
  131. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-semantic.js +121 -0
  132. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-session-plan.js +222 -0
  133. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-timeouts.js +68 -0
  134. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +176 -1123
  135. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-analysis.js +191 -0
  136. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-confirmation.js +152 -0
  137. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-diagnostics.js +182 -0
  138. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-electron.js +150 -0
  139. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-contracts.js +1 -0
  140. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase-contracts.js +1 -0
  141. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase.js +115 -0
  142. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle.js +256 -0
  143. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed-contracts.js +1 -0
  144. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed.js +256 -0
  145. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase-contracts.js +1 -0
  146. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase.js +93 -0
  147. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native.js +113 -0
  148. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation-contracts.js +1 -0
  149. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation.js +316 -0
  150. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-ownership.js +28 -0
  151. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase-contracts.js +1 -0
  152. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase.js +142 -0
  153. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation-contracts.js +1 -0
  154. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation.js +333 -0
  155. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase-contracts.js +1 -0
  156. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase.js +71 -0
  157. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication.js +201 -0
  158. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-receipts.js +183 -0
  159. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-refs.js +200 -0
  160. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-tabs.js +142 -0
  161. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +18 -968
  162. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +23 -13
  163. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-receipt-reconciliation.js +198 -0
  164. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-contracts.js +1 -0
  165. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-presentation.js +154 -0
  166. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery.js +68 -151
  167. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-capture.js +14 -0
  168. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-observation.js +169 -46
  169. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-commands.js +130 -0
  170. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-electron.js +212 -0
  171. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-observations.js +61 -0
  172. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-outcomes.js +187 -0
  173. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-refs.js +169 -0
  174. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-tabs.js +228 -0
  175. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +77 -765
  176. package/dist/extensions/agent-browser/lib/orchestration/browser-run/text-visibility-diagnostics.js +182 -0
  177. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-diagnostics.js +256 -0
  178. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-progress.js +108 -0
  179. package/dist/extensions/agent-browser/lib/orchestration/code-artifact-observation.js +39 -0
  180. package/dist/extensions/agent-browser/lib/orchestration/code-image-observation.js +119 -0
  181. package/dist/extensions/agent-browser/lib/orchestration/electron-host/branch.js +93 -0
  182. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup-result.js +58 -0
  183. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup.js +78 -0
  184. package/dist/extensions/agent-browser/lib/orchestration/electron-host/contracts.js +1 -0
  185. package/dist/extensions/agent-browser/lib/orchestration/electron-host/discovery.js +106 -0
  186. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +48 -821
  187. package/dist/extensions/agent-browser/lib/orchestration/electron-host/policy.js +86 -0
  188. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-collection.js +68 -0
  189. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +169 -0
  190. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +182 -0
  191. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe.js +161 -0
  192. package/dist/extensions/agent-browser/lib/orchestration/electron-host/status.js +167 -0
  193. package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +22 -10
  194. package/dist/extensions/agent-browser/lib/orchestration/extension-artifact-preflight.js +211 -0
  195. package/dist/extensions/agent-browser/lib/orchestration/extension-artifacts.js +23 -0
  196. package/dist/extensions/agent-browser/lib/orchestration/extension-attachment-replay.js +99 -0
  197. package/dist/extensions/agent-browser/lib/orchestration/extension-branch-restore.js +275 -0
  198. package/dist/extensions/agent-browser/lib/orchestration/extension-code.js +280 -0
  199. package/dist/extensions/agent-browser/lib/orchestration/extension-command-admission.js +303 -0
  200. package/dist/extensions/agent-browser/lib/orchestration/extension-command-output.js +36 -0
  201. package/dist/extensions/agent-browser/lib/orchestration/extension-command-result.js +335 -0
  202. package/dist/extensions/agent-browser/lib/orchestration/extension-command-run.js +227 -0
  203. package/dist/extensions/agent-browser/lib/orchestration/extension-command-state.js +1 -0
  204. package/dist/extensions/agent-browser/lib/orchestration/extension-electron-ownership.js +204 -0
  205. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-locks.js +139 -0
  206. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-queue.js +24 -0
  207. package/dist/extensions/agent-browser/lib/orchestration/extension-host-coordination.js +98 -0
  208. package/dist/extensions/agent-browser/lib/orchestration/extension-host-run.js +295 -0
  209. package/dist/extensions/agent-browser/lib/orchestration/extension-intent-replay.js +41 -0
  210. package/dist/extensions/agent-browser/lib/orchestration/extension-invocation.js +7 -0
  211. package/dist/extensions/agent-browser/lib/orchestration/extension-lifecycle.js +102 -0
  212. package/dist/extensions/agent-browser/lib/orchestration/extension-managed-ownership.js +133 -0
  213. package/dist/extensions/agent-browser/lib/orchestration/extension-observation.js +120 -0
  214. package/dist/extensions/agent-browser/lib/orchestration/extension-prompt.js +180 -0
  215. package/dist/extensions/agent-browser/lib/orchestration/extension-recording.js +290 -0
  216. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-contracts.js +1 -0
  217. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-replay.js +269 -0
  218. package/dist/extensions/agent-browser/lib/orchestration/extension-result-state.js +113 -0
  219. package/dist/extensions/agent-browser/lib/orchestration/extension-runtime.js +146 -0
  220. package/dist/extensions/agent-browser/lib/orchestration/extension-script-leases.js +58 -0
  221. package/dist/extensions/agent-browser/lib/orchestration/extension-tool-boundary.js +62 -0
  222. package/dist/extensions/agent-browser/lib/orchestration/extension-version-check.js +54 -0
  223. package/dist/extensions/agent-browser/lib/orchestration/input-plan-types.js +1 -0
  224. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +261 -185
  225. package/dist/extensions/agent-browser/lib/orchestration/input-redaction.js +62 -0
  226. package/dist/extensions/agent-browser/lib/orchestration/native-config.js +144 -0
  227. package/dist/extensions/agent-browser/lib/orchestration/native-root-launch.js +77 -0
  228. package/dist/extensions/agent-browser/lib/orchestration/native-session-defaults.js +210 -157
  229. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  230. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +197 -99
  231. package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +199 -96
  232. package/dist/extensions/agent-browser/lib/owned-managed-session-context.js +55 -0
  233. package/dist/extensions/agent-browser/lib/page-target-batch.js +118 -0
  234. package/dist/extensions/agent-browser/lib/page-target-guards.js +50 -0
  235. package/dist/extensions/agent-browser/lib/page-target-navigation.js +104 -0
  236. package/dist/extensions/agent-browser/lib/page-target-validation.js +55 -246
  237. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  238. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +133 -68
  239. package/dist/extensions/agent-browser/lib/playbook.js +16 -12
  240. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  241. package/dist/extensions/agent-browser/lib/process-environment.js +13 -6
  242. package/dist/extensions/agent-browser/lib/process-errors.js +23 -0
  243. package/dist/extensions/agent-browser/lib/process-identity.js +47 -15
  244. package/dist/extensions/agent-browser/lib/process-socket-storage.js +256 -0
  245. package/dist/extensions/agent-browser/lib/process-stdout.js +74 -0
  246. package/dist/extensions/agent-browser/lib/process.js +145 -536
  247. package/dist/extensions/agent-browser/lib/prompt-artifacts.js +287 -0
  248. package/dist/extensions/agent-browser/lib/prompt-policy.js +15 -194
  249. package/dist/extensions/agent-browser/lib/read-command.js +41 -0
  250. package/dist/extensions/agent-browser/lib/read-confirmation.js +131 -68
  251. package/dist/extensions/agent-browser/lib/recording-reservations.js +118 -45
  252. package/dist/extensions/agent-browser/lib/redaction-fields.js +75 -0
  253. package/dist/extensions/agent-browser/lib/redaction-json.js +149 -0
  254. package/dist/extensions/agent-browser/lib/redaction-url.js +88 -0
  255. package/dist/extensions/agent-browser/lib/results/action-contracts.js +1 -0
  256. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +28 -271
  257. package/dist/extensions/agent-browser/lib/results/artifact-contracts.js +1 -0
  258. package/dist/extensions/agent-browser/lib/results/artifact-manifest-validation.js +133 -0
  259. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +96 -94
  260. package/dist/extensions/agent-browser/lib/results/artifact-recommendations.js +73 -0
  261. package/dist/extensions/agent-browser/lib/results/categories.js +111 -54
  262. package/dist/extensions/agent-browser/lib/results/confirmation.js +29 -13
  263. package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +62 -27
  264. package/dist/extensions/agent-browser/lib/results/electron-recommendations.js +83 -0
  265. package/dist/extensions/agent-browser/lib/results/envelope-decoding.js +48 -0
  266. package/dist/extensions/agent-browser/lib/results/envelope.js +90 -67
  267. package/dist/extensions/agent-browser/lib/results/evidence-contracts.js +1 -0
  268. package/dist/extensions/agent-browser/lib/results/failure-recommendations.js +180 -0
  269. package/dist/extensions/agent-browser/lib/results/network-routes.js +86 -45
  270. package/dist/extensions/agent-browser/lib/results/network.js +35 -12
  271. package/dist/extensions/agent-browser/lib/results/next-actions.js +49 -19
  272. package/dist/extensions/agent-browser/lib/results/presentation/artifact-files.js +320 -0
  273. package/dist/extensions/agent-browser/lib/results/presentation/artifact-format.js +138 -0
  274. package/dist/extensions/agent-browser/lib/results/presentation/artifact-images.js +113 -0
  275. package/dist/extensions/agent-browser/lib/results/presentation/artifact-verification.js +145 -0
  276. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +99 -555
  277. package/dist/extensions/agent-browser/lib/results/presentation/batch-contracts.js +1 -0
  278. package/dist/extensions/agent-browser/lib/results/presentation/batch-recording.js +118 -0
  279. package/dist/extensions/agent-browser/lib/results/presentation/batch-redaction.js +68 -0
  280. package/dist/extensions/agent-browser/lib/results/presentation/batch-rendering.js +135 -0
  281. package/dist/extensions/agent-browser/lib/results/presentation/batch-step.js +227 -0
  282. package/dist/extensions/agent-browser/lib/results/presentation/batch-summary.js +91 -0
  283. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +91 -460
  284. package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +9 -5
  285. package/dist/extensions/agent-browser/lib/results/presentation/command-presenters.js +216 -0
  286. package/dist/extensions/agent-browser/lib/results/presentation/common.js +26 -9
  287. package/dist/extensions/agent-browser/lib/results/presentation/content.js +86 -29
  288. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-a11y.js +67 -0
  289. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-health.js +79 -0
  290. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-identity.js +199 -0
  291. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-logs.js +75 -0
  292. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network-actions.js +216 -0
  293. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network.js +124 -0
  294. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-redaction.js +64 -0
  295. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-storage.js +209 -0
  296. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-stream.js +69 -0
  297. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-summary.js +222 -0
  298. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +103 -1052
  299. package/dist/extensions/agent-browser/lib/results/presentation/early-result.js +70 -0
  300. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +130 -60
  301. package/dist/extensions/agent-browser/lib/results/presentation/input-contracts.js +1 -0
  302. package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +60 -145
  303. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +147 -88
  304. package/dist/extensions/agent-browser/lib/results/presentation/notices.js +75 -0
  305. package/dist/extensions/agent-browser/lib/results/presentation/observation-contracts.js +1 -0
  306. package/dist/extensions/agent-browser/lib/results/presentation/observation-rendering.js +127 -0
  307. package/dist/extensions/agent-browser/lib/results/presentation/outcomes.js +120 -0
  308. package/dist/extensions/agent-browser/lib/results/presentation/output-completion.js +77 -0
  309. package/dist/extensions/agent-browser/lib/results/presentation/output-spill.js +51 -0
  310. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +116 -240
  311. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +35 -21
  312. package/dist/extensions/agent-browser/lib/results/presentation/skills.js +109 -73
  313. package/dist/extensions/agent-browser/lib/results/presentation/source.js +109 -0
  314. package/dist/extensions/agent-browser/lib/results/presentation.js +17 -261
  315. package/dist/extensions/agent-browser/lib/results/recommendation-contracts.js +1 -0
  316. package/dist/extensions/agent-browser/lib/results/recording.js +52 -14
  317. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +14 -5
  318. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +30 -22
  319. package/dist/extensions/agent-browser/lib/results/selector-recovery-target.js +83 -0
  320. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +119 -119
  321. package/dist/extensions/agent-browser/lib/results/snapshot-compact.js +266 -0
  322. package/dist/extensions/agent-browser/lib/results/snapshot-content.js +32 -0
  323. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +104 -71
  324. package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +31 -11
  325. package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +125 -66
  326. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +26 -7
  327. package/dist/extensions/agent-browser/lib/results/snapshot.js +28 -248
  328. package/dist/extensions/agent-browser/lib/results/text.js +16 -5
  329. package/dist/extensions/agent-browser/lib/runtime-args-validation.js +133 -0
  330. package/dist/extensions/agent-browser/lib/runtime-compatibility.js +81 -0
  331. package/dist/extensions/agent-browser/lib/runtime-contracts.js +1 -0
  332. package/dist/extensions/agent-browser/lib/runtime-redaction.js +118 -0
  333. package/dist/extensions/agent-browser/lib/runtime-replay-events.js +144 -0
  334. package/dist/extensions/agent-browser/lib/runtime-session-identity.js +76 -0
  335. package/dist/extensions/agent-browser/lib/runtime-session-plan.js +114 -0
  336. package/dist/extensions/agent-browser/lib/runtime-session-replay.js +123 -0
  337. package/dist/extensions/agent-browser/lib/runtime-tab-correction.js +65 -0
  338. package/dist/extensions/agent-browser/lib/runtime-timeouts.js +28 -0
  339. package/dist/extensions/agent-browser/lib/runtime.js +137 -1041
  340. package/dist/extensions/agent-browser/lib/session-identity.js +51 -0
  341. package/dist/extensions/agent-browser/lib/session-page-observation.js +357 -0
  342. package/dist/extensions/agent-browser/lib/session-page-state.js +178 -333
  343. package/dist/extensions/agent-browser/lib/session-page-types.js +1 -0
  344. package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +81 -0
  345. package/dist/extensions/agent-browser/lib/temp-mutation-queue.js +7 -0
  346. package/dist/extensions/agent-browser/lib/temp-root-ownership.js +234 -0
  347. package/dist/extensions/agent-browser/lib/temp-root.js +211 -0
  348. package/dist/extensions/agent-browser/lib/temp.js +33 -446
  349. package/dist/extensions/agent-browser/lib/tool-surface.js +94 -24
  350. package/dist/extensions/agent-browser/lib/upstream-version.js +3 -2
  351. package/dist/extensions/agent-browser/lib/web-search-providers.js +193 -0
  352. package/dist/extensions/agent-browser/lib/web-search-request.js +102 -0
  353. package/dist/extensions/agent-browser/lib/web-search-results.js +281 -0
  354. package/dist/extensions/agent-browser/lib/web-search-schema.js +82 -0
  355. package/dist/extensions/agent-browser/lib/web-search.js +124 -614
  356. package/dist/extensions/agent-browser/lib/webmcp-observation.js +13 -6
  357. package/dist/extensions/agent-browser/lib/windows-stock-launcher.js +63 -37
  358. package/dist/extensions/agent-browser/script-worker.js +80 -43
  359. package/dist/scripts/agent-browser-target.mjs +4 -2
  360. package/docs/ARCHITECTURE.md +19 -6
  361. package/docs/CODE_QUALITY.md +267 -0
  362. package/docs/COMMAND_REFERENCE.md +272 -241
  363. package/docs/ELECTRON.md +77 -46
  364. package/docs/REFERENCE.md +869 -0
  365. package/docs/RELEASE.md +25 -22
  366. package/docs/REQUIREMENTS.md +2 -1
  367. package/docs/SUPPORT_MATRIX.md +81 -79
  368. package/docs/TOOL_CONTRACT.md +158 -125
  369. package/docs/platform-smoke.md +8 -8
  370. package/package.json +144 -120
  371. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  372. package/scripts/agent-browser-target.mjs +6 -2
  373. package/scripts/build.mjs +37 -8
  374. package/scripts/capability-core-commands.mjs +193 -0
  375. package/scripts/capability-options.mjs +283 -0
  376. package/scripts/capability-samples.mjs +133 -0
  377. package/scripts/capability-section.mjs +11 -0
  378. package/scripts/config.mjs +235 -132
  379. package/scripts/convert-browser-session.mjs +30 -9
  380. package/scripts/doctor-sources.mjs +195 -0
  381. package/scripts/doctor.mjs +94 -249
  382. package/scripts/platform-smoke/artifacts.mjs +38 -11
  383. package/scripts/platform-smoke/commands.mjs +104 -0
  384. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  385. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  386. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  387. package/scripts/platform-smoke/doctor.mjs +212 -320
  388. package/scripts/platform-smoke/lease-evidence.mjs +132 -0
  389. package/scripts/platform-smoke/linux-image/Dockerfile +8 -2
  390. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  391. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  392. package/scripts/platform-smoke/targets.mjs +154 -472
  393. package/scripts/platform-smoke.mjs +55 -40
  394. package/scripts/prepare.mjs +16 -7
@@ -1,550 +1,53 @@
1
- import { cleanupElectronLaunchResources } from "../../electron/cleanup.js";
2
- import { getCompiledSemanticActionCommandIndex, getCompiledSemanticActionSessionPrefix, isCompiledSemanticActionFindCommand } from "../../input-modes/semantic-action.js";
3
- import { redactNetworkSourceLookupSurface } from "../../input-modes/lookups.js";
4
- import { buildAgentBrowserNextActions } from "../../results/action-recommendations.js";
5
- import { buildAgentBrowserResultCategoryDetails } from "../../results/categories.js";
6
- import { extractAgentBrowserLifecycle } from "../../results/presentation/common.js";
7
- import { projectAgentBrowserObservation } from "../../results/presentation/content.js";
8
- import { formatSessionArtifactRetentionSummary } from "../../results/artifact-manifest.js";
9
- import { alignPageChangeSummaryNextActionIds, appendUniqueAgentBrowserNextActions, applyNamespaceToNextActions, isStandaloneSnapshotNextAction, withOptionalSessionArgs, } from "../../results/next-actions.js";
10
- import { buildConnectedSessionNextActions, buildNoActivePageNextActions, buildPendingWebMcpNextActions, buildSessionAwareStaleRefNextActions, buildSessionTabRecoveryNextActions, } from "../../results/recovery-next-actions.js";
11
- import { buildRichInputRecoveryDiagnostic, buildRichInputRecoveryNextActions, buildVisibleRefFallbackNextActions, formatRichInputRecoveryText, formatVisibleRefFallbackText, sanitizeVisibleRefFallbackDiagnostic, } from "../../results/selector-recovery.js";
12
- import { buildNoActivePageRefSnapshotInvalidation, isNoActivePageSnapshotFailure, } from "../../session-page-state.js";
13
- import { extractExplicitSessionName } from "../../argv-grammar.js";
14
- import { redactInvocationArgs, redactSensitiveText, redactSensitiveValue } from "../../runtime.js";
1
+ import { redactNetworkSourceLookupSurface, redactNetworkSourceLookupUrl, } from "../../input-modes/lookups.js";
15
2
  import { isRecord } from "../../parsing.js";
16
- import { buildClickDispatchNextActions, formatClickDispatchDiagnosticText } from "./click-dispatch.js";
17
- import { buildComboboxFocusNextActions, buildElectronBroadGetTextScopeNextActions, buildFillVerificationNextActions, buildOverlayBlockerNextActions, buildScrollNoopNextActions, buildSelectorTextVisibilityNextActions, buildSourceLookupElectronNextActions, collectVisibleRefFallbackDiagnostic, formatArtifactCleanupGuidanceText, formatComboboxFocusDiagnosticText, formatElectronBroadGetTextScopeText, formatEvalResultWarningText, formatEvalStdinHintText, formatFillVerificationText, formatOverlayBlockerText, formatRecordingDependencyWarningText, formatScrollNoopDiagnosticText, formatSelectorTextVisibilityText, formatTimeoutPartialProgressText, } from "./diagnostics.js";
18
- import { buildElectronIdentifiers, buildElectronLifecycleNextActions, buildElectronMismatchNextActions, buildElectronRefFreshnessNextActions, buildManagedSessionFreshFailureNextActions, buildManagedSessionOutcome, buildSessionDetailFields, getSessionContextKey, formatElectronRefFreshnessText, formatManagedSessionOutcomeText, } from "./session-state.js";
19
- export function buildMissingBinaryMessage() {
20
- return [
21
- "agent-browser is required but was not found on PATH.",
22
- "This project does not bundle agent-browser.",
23
- "Run `pi-agent-browser-doctor` for package/PATH diagnostics, then install agent-browser using the upstream docs:",
24
- "- https://agent-browser.dev/",
25
- "- https://github.com/vercel-labs/agent-browser",
26
- ].join("\n");
27
- }
28
- const SEMANTIC_ACTION_CANDIDATE_ACTION_IDS = new Set(["try-button-name-candidate", "try-link-name-candidate"]);
29
- function formatSemanticActionCandidateText(actions) {
30
- const candidateActions = actions.filter((action) => SEMANTIC_ACTION_CANDIDATE_ACTION_IDS.has(action.id) && action.params?.args);
31
- if (candidateActions.length === 0)
32
- return undefined;
33
- return ["Agent-browser candidate fallbacks:", ...candidateActions.map((action) => `- ${action.id}: agent_browser ${JSON.stringify({ args: action.params?.args })} — ${action.reason}`)].join("\n");
34
- }
35
- function buildSemanticActionCandidateActions(compiled) {
36
- const commandIndex = getCompiledSemanticActionCommandIndex(compiled);
37
- if (commandIndex < 0 || compiled.args[commandIndex] !== "find")
38
- return [];
39
- const locator = compiled.args[commandIndex + 1];
40
- const value = compiled.args[commandIndex + 2];
41
- if (!locator || !value)
42
- return [];
43
- const sessionPrefix = getCompiledSemanticActionSessionPrefix(compiled);
44
- const buildRoleCandidate = (role, id, reason) => {
45
- const args = [...sessionPrefix, "find", "role", role, compiled.action];
46
- args.push("--name", value);
47
- return { id, params: { args: redactInvocationArgs(args) }, reason, safety: "Candidate locator fallback only; inspect the page if multiple elements could match the same accessible name.", tool: "agent_browser" };
48
- };
49
- if (locator === "text" && compiled.action === "click") {
50
- return [
51
- buildRoleCandidate("button", "try-button-name-candidate", "Retry against a button with the same accessible name when text lookup misses."),
52
- buildRoleCandidate("link", "try-link-name-candidate", "Retry against a link with the same accessible name when text lookup misses."),
53
- ];
54
- }
55
- return [];
56
- }
3
+ import { applyNamespaceToNextActions } from "../../results/next-actions.js";
4
+ import { extractAgentBrowserLifecycle } from "../../results/presentation/common.js";
5
+ import { buildResultNextActions } from "./final-result-actions.js";
6
+ import { buildFinalResultContent } from "./final-result-content.js";
7
+ import { buildAgentBrowserResultDetails } from "./final-result-details.js";
8
+ import { buildBrowserWindowStatus } from "./final-result-evidence.js";
9
+ import { redactToolDetails } from "./final-result-redaction.js";
10
+ export { buildMissingBinaryMessage, isMissingAgentBrowserBinary, buildMissingBinaryFailureResult, } from "./final-result-missing-binary.js";
11
+ export { buildElectronHostFailureResult, getElectronLaunchFailureCategory, formatElectronLaunchText, formatElectronTargetLines, } from "./final-result-electron.js";
12
+ export { buildJsonVisibleContent, buildRedactedPresentationContent, redactExactSensitiveText, redactExactSensitiveValue, redactToolDetails, redactRecoveryHint, } from "./final-result-redaction.js";
13
+ export { prepareFinalResultRecoveryState } from "./final-result-recovery.js";
14
+ export { formatAgentBrowserNextActionsText } from "./final-result-content.js";
57
15
  export function buildWrapperRecoveryHint(options) {
58
- if (!options.sessionTabCorrection)
59
- return undefined;
60
- return "Wrapper recovery hint: this call used session tab correction. Inspect details.effectiveArgs and details.sessionTabCorrection; if the selected tab looks wrong, run tab list for the same session before retrying.";
61
- }
62
- export function redactExactSensitiveText(text, sensitiveValues) {
63
- let redacted = text;
64
- for (const value of sensitiveValues)
65
- redacted = redacted.split(value).join("[REDACTED]");
66
- return redacted;
67
- }
68
- export function redactExactSensitiveValue(value, sensitiveValues) {
69
- if (sensitiveValues.length === 0)
70
- return value;
71
- if (typeof value === "string")
72
- return redactExactSensitiveText(value, sensitiveValues);
73
- if (Array.isArray(value))
74
- return value.map((item) => redactExactSensitiveValue(item, sensitiveValues));
75
- if (!isRecord(value))
76
- return value;
77
- return Object.fromEntries(Object.entries(value).map(([key, entryValue]) => [key, redactExactSensitiveValue(entryValue, sensitiveValues)]));
78
- }
79
- export function redactToolDetails(details, sensitiveValues) {
80
- return redactSensitiveValue(redactExactSensitiveValue(details, sensitiveValues));
81
- }
82
- export function redactRecoveryHint(recoveryHint) {
83
- if (!recoveryHint)
84
- return undefined;
85
- const exampleArgs = redactInvocationArgs(recoveryHint.exampleArgs);
86
- return { ...recoveryHint, exampleArgs, exampleParams: { ...recoveryHint.exampleParams, args: exampleArgs } };
87
- }
88
- export function buildJsonVisibleContent(options) {
89
- const { error, presentation, succeeded, warnings } = options;
90
- const payload = projectAgentBrowserObservation({ ...presentation, ...options.details, error, warnings: warnings && warnings.length > 0 ? warnings : undefined }, succeeded);
91
- const images = presentation.content.filter((item) => item.type === "image");
92
- return [{ type: "text", text: JSON.stringify(payload, null, 2) }, ...images];
93
- }
94
- export function getElectronLaunchFailureCategory(failure) {
95
- if (failure.reason === "aborted")
96
- return "aborted";
97
- if (failure.reason === "policy-blocked")
98
- return "policy-blocked";
99
- if (failure.reason === "timeout")
100
- return "timeout";
101
- if (failure.reason === "non-electron-target")
102
- return "validation-error";
103
- return "upstream-error";
104
- }
105
- function formatElectronLaunchFailureDiagnostics(failure) {
106
- const diagnostics = failure?.diagnostics;
107
- if (!diagnostics)
108
- return undefined;
109
- const lines = ["Electron launch diagnostics:"];
110
- if (diagnostics.pid !== undefined)
111
- lines.push(`- PID: ${diagnostics.pid} (${diagnostics.pidAlive === undefined ? "state unknown" : diagnostics.pidAlive ? "alive before cleanup" : "not alive before cleanup"}).`);
112
- if (diagnostics.exitCode !== undefined || diagnostics.exitSignal !== undefined) {
113
- const exitParts = [diagnostics.exitCode !== undefined ? `code ${diagnostics.exitCode}` : undefined, diagnostics.exitSignal ? `signal ${diagnostics.exitSignal}` : undefined].filter(Boolean).join(", ");
114
- lines.push(`- Process exit: ${exitParts || "not observed before cleanup"}.`);
115
- }
116
- if (diagnostics.userDataDir)
117
- lines.push(`- Wrapper profile: ${diagnostics.userDataDir}`);
118
- if (diagnostics.devToolsActivePort) {
119
- const activePort = diagnostics.devToolsActivePort;
120
- const state = activePort.port ? `found port ${activePort.port}` : activePort.found ? `found but invalid${activePort.error ? ` (${activePort.error})` : ""}` : `missing${activePort.error ? ` (${activePort.error})` : ""}`;
121
- lines.push(`- DevToolsActivePort: ${state} at ${activePort.path}.`);
122
- }
123
- if (diagnostics.cdpVersionReached === false)
124
- lines.push("- CDP /json/version: did not return a valid payload before timeout.");
125
- if (diagnostics.timeoutMs !== undefined || diagnostics.elapsedMs !== undefined)
126
- lines.push(`- Timing: ${diagnostics.elapsedMs ?? "unknown"}ms elapsed${diagnostics.timeoutMs !== undefined ? ` of ${diagnostics.timeoutMs}ms timeout` : ""}.`);
127
- if (diagnostics.outputCaptured === false)
128
- lines.push("- App stdout/stderr: not captured by this wrapper launch path.");
129
- if (failure?.reason !== "aborted")
130
- lines.push("Retry guidance: increase electron.timeoutMs, try targetType:'any', pass an explicit appPath/executablePath, quit any already-running singleton instance, then retry launch.");
131
- return lines.join("\n");
132
- }
133
- export function buildElectronHostFailureResult(options) {
134
- const text = [options.errorText, formatElectronLaunchFailureDiagnostics(options.launchFailure), options.launchFailure?.cleanupError ? `Electron launch cleanup warning: ${options.launchFailure.cleanupError}` : undefined].filter((item) => item !== undefined && item.length > 0).join("\n");
135
- const details = { args: [], compiledElectron: options.compiledElectron, electron: { action: options.compiledElectron.action, error: options.errorText, failure: options.launchFailure, status: options.status ?? "failed" }, managedSessionOutcome: options.managedSessionOutcome, ...buildAgentBrowserResultCategoryDetails({ args: [], errorText: options.errorText, failureCategory: options.failureCategory, succeeded: false, timedOut: options.failureCategory === "timeout" }), summary: options.errorText };
136
- return { content: [{ type: "text", text: redactSensitiveText(text) }], details: redactToolDetails(details, []), isError: true };
137
- }
138
- export function formatElectronTargetLines(targets, limit = 8) {
139
- const shownTargets = targets.slice(0, limit);
140
- const lines = shownTargets.map((target) => {
141
- const label = [target.type, target.title].filter(Boolean).join(" ") || target.id || "target";
142
- return `- ${label}${target.url ? ` — ${target.url}` : ""}`;
143
- });
144
- if (targets.length > shownTargets.length)
145
- lines.push(`- ... ${targets.length - shownTargets.length} more target(s) omitted`);
146
- return lines;
147
- }
148
- const ELECTRON_PROFILE_ISOLATION_NOTE = "Profile note: electron.launch starts an isolated temporary profile; it does not reuse the app's normal signed-in profile or attach to an already-running authenticated app.";
149
- const ELECTRON_EXISTING_AUTH_GUIDANCE = "For already-authenticated desktop app content, do not stop here: if host tools are allowed and the app is not running, launch the normal app with --remote-debugging-port=<port>, verify the port, then run agent_browser connect <port>; if it is already running without a debug port, ask before relaunching it.";
150
- export function formatElectronLaunchText(options) {
151
- const lines = [`Electron launch: ${options.record.appName} attached as ${options.record.sessionName ?? "managed session"} (launchId ${options.record.launchId}, port ${options.record.port}).`, `Identifiers: launchId ${options.record.launchId} for electron.status/electron.cleanup/electron.probe; sessionName ${options.record.sessionName ?? "not attached"} for browser snapshot/tab commands.`, ELECTRON_PROFILE_ISOLATION_NOTE, ELECTRON_EXISTING_AUTH_GUIDANCE, ...formatElectronTargetLines(options.targets)];
152
- if (options.handoff?.handoff === "snapshot")
153
- lines.push(options.handoff.refSnapshot && options.handoff.refSnapshot.refIds.length > 0 ? `Snapshot handoff: ${options.handoff.refSnapshot.refIds.length} interactive ref(s)${options.handoff.snapshotRetryCount ? ` after ${options.handoff.snapshotRetryCount} retry attempt(s)` : ""}.` : "Snapshot handoff: no interactive refs returned after a short readiness retry; run snapshot -i once more before assuming the Electron UI is unusable.");
154
- else if (options.handoff?.handoff === "tabs")
155
- lines.push("Tabs handoff completed: safer diagnostic starting point; no interactive refs were captured.");
156
- else if (options.handoff?.handoff === "connect")
157
- lines.push("Connect handoff completed: run snapshot -i before using interactive refs.");
158
- lines.push(`Cleanup: use details.nextActions cleanup-electron-launch or call electron.cleanup with launchId ${options.record.launchId} when finished.`);
159
- if (options.handoff?.error)
160
- lines.push(`Handoff warning: ${options.handoff.error}`);
161
- if (options.upstreamText.trim().length > 0)
162
- lines.push("", options.upstreamText.trim());
163
- return lines.join("\n");
16
+ return options.sessionTabCorrection
17
+ ? "Wrapper recovery hint: this call used session tab correction. Inspect details.effectiveArgs and details.sessionTabCorrection; if the selected tab looks wrong, run tab list for the same session before retrying."
18
+ : undefined;
164
19
  }
165
- export function buildRedactedPresentationContent(options) {
166
- const { exactSensitiveValues, plainTextInspection, presentation, presentationEnvelope, succeeded, userRequestedJson, warningText } = options;
167
- const contentWithSessionWarnings = userRequestedJson && !plainTextInspection ? buildJsonVisibleContent({ error: presentationEnvelope?.error, presentation, succeeded, warnings: warningText ? [warningText] : undefined }) : warningText ? [...presentation.content] : presentation.content;
168
- if (warningText && !userRequestedJson) {
169
- if (contentWithSessionWarnings[0]?.type === "text")
170
- contentWithSessionWarnings[0] = { ...contentWithSessionWarnings[0], text: `${warningText}\n\n${contentWithSessionWarnings[0].text}` };
171
- else
172
- contentWithSessionWarnings.unshift({ type: "text", text: warningText });
20
+ function redactNetworkLookupResult(result) {
21
+ const details = redactNetworkSourceLookupSurface(result.details);
22
+ if (!isRecord(details)) {
23
+ throw new Error("Network lookup result details must remain an object after redaction.");
173
24
  }
174
- return contentWithSessionWarnings.map((item) => {
175
- if (item.type !== "text")
176
- return item;
177
- if (userRequestedJson && !plainTextInspection)
178
- return { ...item, text: JSON.stringify(redactExactSensitiveValue(JSON.parse(item.text), exactSensitiveValues), null, 2) };
179
- return { ...item, text: redactSensitiveText(redactExactSensitiveText(item.text, exactSensitiveValues)) };
180
- });
181
- }
182
- export async function prepareFinalResultRecoveryState(options) {
183
- let { currentRefSnapshot, currentRefSnapshotInvalidation } = options;
184
- const categoryDetails = buildAgentBrowserResultCategoryDetails({ artifacts: options.presentation.artifacts, args: options.redactedProcessArgs, command: options.executionPlan.commandInfo.command, confirmationRequired: options.presentation.summary.startsWith("Confirmation required"), errorText: options.errorText ?? options.presentation.summary, failureCategory: options.presentation.failureCategory ?? options.presentation.batchFailure?.failedStep.failureCategory ?? (options.electronPostCommandHealth ? "tab-drift" : undefined), inspection: options.plainTextInspection, parseError: options.parseError, savedFile: options.presentation.savedFile, spawnError: options.processResult.spawnError?.message, succeeded: options.succeeded, tabDrift: !options.succeeded && (options.aboutBlankSessionMismatch !== undefined || options.electronPostCommandHealth !== undefined || options.sessionTabCorrection !== undefined), timedOut: options.processResult.timedOut, validationError: undefined });
185
- let visibleRefFallbackDiagnostic;
186
- const visibleRefFallbackSessionName = options.executionPlan.sessionName ?? extractExplicitSessionName(options.runtimeToolArgs);
187
- if (categoryDetails.failureCategory === "selector-not-found") {
188
- const selectorRecoveryCommandTokens = options.presentation.batchFailure?.failedStep.command ?? options.commandTokens;
189
- visibleRefFallbackDiagnostic = await collectVisibleRefFallbackDiagnostic({ commandTokens: selectorRecoveryCommandTokens, compiledSemanticAction: options.compiledSemanticAction, cwd: options.cwd, namespace: options.executionPlan.namespace, sessionName: visibleRefFallbackSessionName, signal: options.signal });
190
- const visibleRefFallbackSessionKey = getSessionContextKey(visibleRefFallbackSessionName, options.executionPlan.namespace);
191
- if (visibleRefFallbackDiagnostic && visibleRefFallbackSessionKey) {
192
- const refUpdate = options.sessionPageState.applyRefSnapshot({ fallbackTarget: options.currentSessionTabTarget, sessionName: visibleRefFallbackSessionKey, snapshot: visibleRefFallbackDiagnostic.snapshot, update: options.sessionPageStateUpdate });
193
- currentRefSnapshot = refUpdate.refSnapshot;
194
- currentRefSnapshotInvalidation = refUpdate.refSnapshotInvalidation;
25
+ const content = result.content.map((item) => {
26
+ if (item.type === "text") {
27
+ return { type: "text", text: redactNetworkSourceLookupUrl(item.text) ?? item.text };
195
28
  }
196
- }
197
- const richInputRecoveryDiagnostic = buildRichInputRecoveryDiagnostic(visibleRefFallbackDiagnostic);
198
- const noActivePageSnapshotFailure = categoryDetails.resultCategory === "failure" && (isNoActivePageSnapshotFailure(options.executionPlan.commandInfo.command, options.errorText ?? options.presentation.summary) || options.batchRefSnapshotState?.invalidation?.reason === "no-active-page");
199
- const executionSessionKey = getSessionContextKey(options.executionPlan.sessionName, options.executionPlan.namespace);
200
- if (noActivePageSnapshotFailure && executionSessionKey) {
201
- const refUpdate = options.sessionPageState.applyRefSnapshotInvalidation({ invalidation: buildNoActivePageRefSnapshotInvalidation(), sessionName: executionSessionKey, update: options.sessionPageStateUpdate });
202
- currentRefSnapshot = refUpdate.refSnapshot;
203
- currentRefSnapshotInvalidation = refUpdate.refSnapshotInvalidation;
204
- }
205
- return { categoryDetails, currentRefSnapshot, currentRefSnapshotInvalidation, noActivePageSnapshotFailure, richInputRecoveryDiagnostic, visibleRefFallbackDiagnostic, visibleRefFallbackSessionName };
206
- }
207
- function buildTimeoutPartialProgressNextActions(options) {
208
- if (options.executionPlan.commandInfo.command === "session" && options.executionPlan.commandInfo.subcommand === "info")
209
- return [];
210
- const retry = options.timeoutPartialProgress?.retryStep?.retry;
211
- const stepIndex = options.timeoutPartialProgress?.retryStep?.index;
212
- const freshSessionAbandoned = options.sessionMode === "fresh" && options.timeoutPartialProgress?.liveUrlRecovered !== true;
213
- if (options.currentSessionTabTargetUnknown && !freshSessionAbandoned && options.executionPlan.sessionName) {
214
- return [{
215
- id: "verify-page-target-after-timeout",
216
- params: {
217
- args: withOptionalSessionArgs(options.executionPlan.sessionName, ["batch", "--bail"]),
218
- stdin: JSON.stringify([["get", "url"], ["snapshot", "-i"]]),
219
- },
220
- reason: `Verify the current URL, then inspect the page after timeout${stepIndex === undefined ? "" : ` before considering a retry of step ${stepIndex}`}.`,
221
- safety: "Fail-fast read-only recovery: snapshot runs only after get url succeeds, satisfying the wrapper page-target guard without trusting the planned URL.",
222
- tool: "agent_browser",
223
- }];
224
- }
225
- if (retry) {
226
- return [{
227
- id: "retry-timeout-step",
228
- params: freshSessionAbandoned
229
- ? { ...retry, sessionMode: "fresh" }
230
- : { ...retry, args: withOptionalSessionArgs(options.executionPlan.sessionName, retry.args) },
231
- reason: freshSessionAbandoned
232
- ? `Consider retrying the single timed-out step${stepIndex === undefined ? "" : ` ${stepIndex}`} in a fresh browser session because the timed-out fresh session was not proven live.`
233
- : `Consider retrying the single timed-out step${stepIndex === undefined ? "" : ` ${stepIndex}`} against the current browser session.`,
234
- safety: "Only read-only or idempotent timeout steps get executable retry args; inspect current page/artifact state before using the action.",
235
- tool: "agent_browser",
236
- }];
237
- }
238
- if (!options.timeoutPartialProgress || freshSessionAbandoned || !options.executionPlan.sessionName)
239
- return [];
240
- return [{
241
- id: "inspect-current-page-after-timeout",
242
- params: { args: withOptionalSessionArgs(options.executionPlan.sessionName, ["snapshot", "-i"]) },
243
- reason: `Inspect the current page after timeout before deciding how to resume${stepIndex === undefined ? "" : ` with step ${stepIndex}`}.`,
244
- safety: "Read details.timeoutPartialProgress first. Do not blindly retry mutating steps such as clicks, fills, key presses, selects, or checks; split the remaining flow into shorter batches around the next navigation or DOM mutation boundary.",
245
- tool: "agent_browser",
246
- }];
247
- }
248
- function buildDialogTimeoutNextActions(options) {
249
- if (options.command !== "dialog" && options.command !== "click" && options.command !== "tap" && options.command !== "find" && options.command !== "eval")
250
- return [];
251
- return [
252
- {
253
- id: "inspect-dialog-after-timeout",
254
- params: { args: withOptionalSessionArgs(options.sessionName, ["dialog", "status"]) },
255
- reason: "Check whether a blocking JavaScript dialog is pending after the timed-out interaction.",
256
- safety: "Read-only dialog status; this wrapper bounds dialog commands so recovery attempts do not wait for the full default watchdog.",
257
- tool: "agent_browser",
258
- },
259
- {
260
- id: "dismiss-dialog-after-timeout",
261
- params: { args: withOptionalSessionArgs(options.sessionName, ["dialog", "dismiss"]) },
262
- reason: "Dismiss a pending alert/confirm/prompt when the workflow can safely abandon the dialog.",
263
- safety: "Only run when dismissing/canceling the dialog is acceptable for the user flow.",
264
- tool: "agent_browser",
265
- },
266
- {
267
- id: "recover-fresh-session-after-dialog-timeout",
268
- params: { args: ["open", "about:blank"], sessionMode: "fresh" },
269
- reason: "Start a clean browser session if the current session remains blocked behind a JavaScript dialog.",
270
- safety: "Replace about:blank with the intended recovery URL; this abandons the blocked managed session.",
271
- tool: "agent_browser",
272
- },
273
- ];
274
- }
275
- function buildResultNextActions(options) {
276
- if (options.presentation.recordingRecovery || options.presentation.readConfirmation)
277
- return options.presentation.nextActions;
278
- let nextActions = options.presentation.nextActions ? [...options.presentation.nextActions] : [];
279
- const append = (actions) => {
280
- if (actions && actions.length > 0)
281
- nextActions.push(...actions);
282
- };
283
- const appendUnique = (actions) => {
284
- appendUniqueAgentBrowserNextActions(nextActions, actions);
285
- };
286
- if (options.unsettledWebMcpMutation && options.currentSessionTabTargetUnknown) {
287
- nextActions = nextActions.filter((action) => !isStandaloneSnapshotNextAction(action));
288
- appendUnique(buildPendingWebMcpNextActions(options.executionPlan.sessionName));
289
- }
290
- if (options.categoryDetails.resultCategory === "success" && options.executionPlan.commandInfo.command === "connect" && !options.electronLaunchRecord)
291
- appendUnique(buildConnectedSessionNextActions(options.executionPlan.sessionName));
292
- if (options.noActivePageSnapshotFailure)
293
- appendUnique(buildNoActivePageNextActions(options.executionPlan.sessionName));
294
- if (options.aboutBlankSessionMismatch) {
295
- appendUnique(buildSessionTabRecoveryNextActions({ kind: "about-blank", recoveryApplied: options.aboutBlankSessionMismatch.recoveryApplied, sessionName: options.executionPlan.sessionName, tabCorrection: options.aboutBlankSessionMismatch.recoveryApplied ? options.sessionTabCorrection : undefined, target: { title: options.aboutBlankSessionMismatch.targetTitle, url: options.aboutBlankSessionMismatch.targetUrl } }));
296
- if (!options.aboutBlankSessionMismatch.recoveryApplied)
297
- nextActions = nextActions.filter((action) => !isStandaloneSnapshotNextAction(action));
298
- }
299
- else if (options.categoryDetails.resultCategory === "success" && (options.sessionTabCorrection || options.openResultTabCorrection))
300
- appendUnique(buildSessionTabRecoveryNextActions({ kind: "tab-drift", recoveryApplied: true, sessionName: options.executionPlan.sessionName, tabCorrection: options.sessionTabCorrection ?? options.openResultTabCorrection, target: options.currentSessionTabTarget ?? options.priorSessionTabTarget }));
301
- if (options.categoryDetails.failureCategory === "stale-ref")
302
- nextActions = [...buildSessionAwareStaleRefNextActions(options.executionPlan.sessionName)];
303
- if (options.visibleRefFallbackDiagnostic)
304
- append(buildVisibleRefFallbackNextActions({ diagnostic: options.visibleRefFallbackDiagnostic, sessionName: options.visibleRefFallbackSessionName }));
305
- if (options.richInputRecoveryDiagnostic)
306
- append(buildRichInputRecoveryNextActions({ diagnostic: options.richInputRecoveryDiagnostic, sessionName: options.visibleRefFallbackSessionName }));
307
- if (options.electronPostCommandHealth) {
308
- const electronRecord = options.electronLaunchRecords.get(options.electronPostCommandHealth.launchId);
309
- if (electronRecord)
310
- appendUnique(buildElectronLifecycleNextActions(electronRecord));
311
- }
312
- if (options.electronSessionMismatch) {
313
- const electronRecord = options.electronLaunchRecords.get(options.electronSessionMismatch.launchId);
314
- if (electronRecord)
315
- appendUnique(buildElectronMismatchNextActions(electronRecord, options.electronSessionMismatch.liveTarget));
316
- }
317
- if (options.categoryDetails.failureCategory === "selector-not-found" && options.redactedCompiledSemanticAction) {
318
- const candidateActions = buildSemanticActionCandidateActions(options.redactedCompiledSemanticAction);
319
- if (candidateActions.length > 0)
320
- append(candidateActions);
321
- }
322
- if (options.overlayBlockerDiagnostic)
323
- append(buildOverlayBlockerNextActions({ diagnostic: options.overlayBlockerDiagnostic, sessionName: options.executionPlan.sessionName }));
324
- if (options.fillVerificationDiagnostic)
325
- appendUnique(buildFillVerificationNextActions(options.fillVerificationDiagnostic, options.executionPlan.sessionName));
326
- if (options.electronRefFreshnessDiagnostic)
327
- appendUnique(buildElectronRefFreshnessNextActions(options.executionPlan.sessionName));
328
- if (options.selectorTextVisibilityDiagnostics.length > 0)
329
- append(buildSelectorTextVisibilityNextActions({ diagnostics: options.selectorTextVisibilityDiagnostics, sessionName: options.executionPlan.sessionName }));
330
- if (options.electronBroadGetTextScopeDiagnostics.length > 0)
331
- append(buildElectronBroadGetTextScopeNextActions({ diagnostics: options.electronBroadGetTextScopeDiagnostics, sessionName: options.executionPlan.sessionName }));
332
- if (options.sourceLookup?.electronContext)
333
- appendUnique(buildSourceLookupElectronNextActions(options.sourceLookup));
334
- if (options.clickDispatchDiagnostic)
335
- append(buildClickDispatchNextActions({ commandTokens: options.commandTokens, diagnostic: options.clickDispatchDiagnostic, sessionName: options.executionPlan.sessionName }));
336
- if (options.scrollNoopDiagnostic)
337
- append(buildScrollNoopNextActions(options.executionPlan.sessionName));
338
- if (options.comboboxFocusDiagnostic)
339
- append(buildComboboxFocusNextActions(options.executionPlan.sessionName));
340
- if (options.managedSessionOutcome)
341
- appendUnique(buildManagedSessionFreshFailureNextActions(options.managedSessionOutcome));
342
- if (options.currentSessionTabTargetUnknown && ["aborted", "parse-failure"].includes(options.categoryDetails.failureCategory ?? "")) {
343
- nextActions = nextActions.filter(action => !isStandaloneSnapshotNextAction(action));
344
- appendUnique([{ id: "verify-page-target-after-interruption", tool: "agent_browser", params: { args: withOptionalSessionArgs(options.executionPlan.sessionName, ["batch", "--bail"]), stdin: JSON.stringify([["get", "url"], ["snapshot", "-i"]]) }, reason: "Verify the current URL and inspect the page after an interrupted operation.", safety: "Read-only recovery. The mutation may already have happened; inspect before deciding whether to retry." }]);
345
- }
346
- if (options.categoryDetails.failureCategory === "timeout" && options.processResult.timedOut) {
347
- if (options.currentSessionTabTargetUnknown)
348
- nextActions = nextActions.filter((action) => !isStandaloneSnapshotNextAction(action));
349
- appendUnique(buildTimeoutPartialProgressNextActions(options));
350
- appendUnique(buildDialogTimeoutNextActions({ command: options.executionPlan.commandInfo.command, sessionName: options.executionPlan.sessionName }));
351
- }
352
- if (options.categoryDetails.failureCategory === "stale-ref" && options.redactedCompiledSemanticAction && isCompiledSemanticActionFindCommand(options.compiledSemanticAction))
353
- append([{ id: "retry-semantic-action-after-stale-ref", params: { args: options.redactedCompiledSemanticAction.args }, reason: "Retry the same semantic target via its compiled find command after the upstream stale-ref failure proves the prior action did not execute.", safety: "Use only for the same intended target; direct stale @refs still require a fresh snapshot or stable locator before retrying.", tool: "agent_browser" }]);
354
- if (options.electronLaunchRecord)
355
- append(buildAgentBrowserNextActions({ electron: { launchId: options.electronLaunchRecord.launchId, sessionName: options.electronLaunchRecord.sessionName, status: options.electronLaunchRecord.cleanupState }, failureCategory: options.categoryDetails.failureCategory, resultCategory: options.categoryDetails.resultCategory, successCategory: options.categoryDetails.successCategory }));
356
- return nextActions.length > 0 ? nextActions : undefined;
357
- }
358
- export function formatAgentBrowserNextActionsText(nextActions) {
359
- if (!nextActions || nextActions.length === 0)
360
- return undefined;
361
- const lines = nextActions.map((action) => {
362
- const payload = action.artifactPath ? { artifactPath: action.artifactPath } : action.params;
363
- return `- ${action.id}${payload ? ` ${redactSensitiveText(JSON.stringify(payload))}` : ""}: ${redactSensitiveText(action.reason)}`;
29
+ return {
30
+ type: "image",
31
+ data: redactNetworkSourceLookupUrl(item.data) ?? item.data,
32
+ mimeType: redactNetworkSourceLookupUrl(item.mimeType) ?? item.mimeType,
33
+ };
364
34
  });
365
- return ["Next actions:", ...lines].join("\n");
366
- }
367
- function formatFailureNextActionsText(options, nextActions) {
368
- return options.categoryDetails.resultCategory === "failure" ? formatAgentBrowserNextActionsText(nextActions) : undefined;
369
- }
370
- function getReadSource(options) {
371
- return options.executionPlan.commandInfo.command === "read" && isRecord(options.presentationEnvelope?.data) && typeof options.presentationEnvelope.data.source === "string"
372
- ? options.presentationEnvelope.data.source
373
- : undefined;
374
- }
375
- function formatReadExecutionText(options, lifecycle) {
376
- const source = getReadSource(options);
377
- if (!source)
378
- return undefined;
379
- return `Read execution: source ${source}; CLI started: ${options.processResult.agentBrowserStarted ? "yes" : "no"}; reported browserLaunched: ${lifecycle ? String(lifecycle.effectiveLaunch.browserLaunched) : "unknown"}; managed session outcome: ${options.managedSessionOutcome?.status ?? "not managed"}. An HTTP read does not establish shared-browser liveness; use session info for that.`;
380
- }
381
- function buildBrowserWindowStatus(options, lifecycle) {
382
- if (!options.headedLaunch || options.preserveAttachedBrowserSession || options.providerLaunch || !options.succeeded || lifecycle?.effectiveLaunch.browserLaunched !== true || !options.executionPlan.managedSessionName || !options.managedSessionOutcome || !["created", "replaced"].includes(options.managedSessionOutcome.status))
383
- return undefined;
384
- return { mode: "headed", ownership: "wrapper-managed", sessionName: options.executionPlan.managedSessionName, visibility: "unverified" };
385
- }
386
- function formatBrowserWindowText(browserWindow) {
387
- if (!browserWindow)
388
- return undefined;
389
- return "Headed browser handoff: wrapper-managed headed window requested; desktop visibility unverified. If login is needed, ask the user to confirm they can see the window and finish signing in there, then continue with sessionMode auto.";
390
- }
391
- function buildAgentBrowserResultDetails(options, nextActions) {
392
- const lifecycle = extractAgentBrowserLifecycle(options.presentationEnvelope?.data);
393
- const browserWindow = buildBrowserWindowStatus(options, lifecycle);
394
- const publicVisibleRefFallbackDiagnostic = options.visibleRefFallbackDiagnostic ? sanitizeVisibleRefFallbackDiagnostic(options.visibleRefFallbackDiagnostic) : undefined;
395
- const rawPageChangeSummary = (options.scrollNoopDiagnostic || options.comboboxFocusDiagnostic) && options.presentation.pageChangeSummary ? { ...options.presentation.pageChangeSummary, nextActionIds: nextActions?.map((action) => action.id) } : options.presentation.pageChangeSummary;
396
- const pageChangeSummary = alignPageChangeSummaryNextActionIds(rawPageChangeSummary, nextActions);
397
- return {
398
- args: options.redactedArgs,
399
- compiledElectron: options.redactedCompiledElectron,
400
- compiledJob: options.redactedCompiledJob,
401
- compiledQaPreset: options.redactedCompiledQaPreset,
402
- compiledSourceLookup: options.redactedCompiledSourceLookup,
403
- compiledNetworkSourceLookup: options.redactedCompiledNetworkSourceLookup,
404
- artifactManifest: options.resultArtifactManifest,
405
- artifactRetentionSummary: options.presentation.artifactRetentionSummary ?? (options.resultArtifactManifest ? formatSessionArtifactRetentionSummary(options.resultArtifactManifest) : undefined),
406
- artifactCleanup: options.artifactCleanup,
407
- artifactVerification: options.presentation.artifactVerification,
408
- artifacts: options.presentation.artifacts,
409
- batchFailure: options.presentation.batchFailure,
410
- batchSteps: options.presentation.batchSteps,
411
- command: options.executionPlan.commandInfo.command,
412
- compiledSemanticAction: options.redactedCompiledSemanticAction,
413
- compatibilityWorkaround: options.compatibilityWorkaround,
414
- subcommand: options.executionPlan.commandInfo.subcommand,
415
- data: options.presentation.data,
416
- error: options.plainTextInspection ? undefined : options.presentationEnvelope?.error,
417
- inspection: options.plainTextInspection || undefined,
418
- navigationSummary: options.navigationSummary,
419
- electron: options.electronLaunchRecord ? { action: "launch", cleanup: options.electronFailedConnectCleanup, handoff: options.electronHandoff, identifiers: buildElectronIdentifiers(options.electronLaunchRecord), launch: options.electronLaunchRecord, profileIsolation: options.electronProfileIsolationDetails, status: options.succeeded ? "succeeded" : "failed", targets: options.electronLaunch?.targets, version: options.electronLaunch?.version } : undefined,
420
- ...options.categoryDetails,
421
- agentBrowserStarted: options.processResult.agentBrowserStarted,
422
- browserWindow,
423
- lifecycle,
424
- readSource: getReadSource(options),
425
- recordingRecovery: options.presentation.recordingRecovery,
426
- readConfirmation: options.presentation.readConfirmation,
427
- aboutBlankSessionMismatch: options.aboutBlankSessionMismatch,
428
- electronPostCommandHealth: options.electronPostCommandHealth,
429
- electronRefFreshness: options.electronRefFreshnessDiagnostic,
430
- electronSessionMismatch: options.electronSessionMismatch,
431
- openResultTabCorrection: options.openResultTabCorrection,
432
- effectiveArgs: options.redactedProcessArgs,
433
- exitCode: options.processResult.exitCode,
434
- fullOutputPath: options.parseFailureOutput.fullOutputPath ?? options.presentation.fullOutputPath,
435
- fullOutputPaths: options.presentation.fullOutputPaths,
436
- fullOutputUnavailable: options.parseFailureOutput.fullOutputUnavailable,
437
- managedSessionHeadedAutosaveDisabled: options.managedSessionHeadedAutosaveDisabled,
438
- managedSessionHeadedAutosaveInterval: options.managedSessionHeadedAutosaveInterval,
439
- managedSessionOutcome: options.managedSessionOutcome,
440
- imagePath: options.presentation.imagePath,
441
- imagePaths: options.presentation.imagePaths,
442
- imageObservations: options.presentation.imageObservations,
443
- nextActions,
444
- pageChangeSummary,
445
- clickDispatch: options.clickDispatchDiagnostic,
446
- overlayBlockers: options.overlayBlockerDiagnostic,
447
- fillVerification: options.fillVerificationDiagnostic,
448
- visibleRefFallback: publicVisibleRefFallbackDiagnostic,
449
- richInputRecovery: options.richInputRecoveryDiagnostic,
450
- comboboxFocus: options.comboboxFocusDiagnostic,
451
- recordingDependencyWarning: options.recordingDependencyWarning,
452
- scrollNoop: options.scrollNoopDiagnostic,
453
- qaPreset: options.qaPreset,
454
- qaAttachedTarget: options.qaAttachedTarget,
455
- electronGetTextScopeWarning: options.electronBroadGetTextScopeDiagnostics[0],
456
- electronGetTextScopeWarnings: options.electronBroadGetTextScopeDiagnostics.length > 1 ? options.electronBroadGetTextScopeDiagnostics : undefined,
457
- selectorTextVisibility: options.selectorTextVisibilityDiagnostics[0],
458
- selectorTextVisibilityAll: options.selectorTextVisibilityDiagnostics.length > 1 ? options.selectorTextVisibilityDiagnostics : undefined,
459
- evalStdinHint: options.evalStdinHint,
460
- evalResultWarning: options.evalResultWarning,
461
- timeoutPartialProgress: options.timeoutPartialProgress,
462
- parseError: options.plainTextInspection ? undefined : options.parseError,
463
- savedFile: options.presentation.savedFile,
464
- savedFilePath: options.presentation.savedFilePath,
465
- sourceLookup: options.sourceLookup,
466
- networkSourceLookup: options.networkSourceLookup,
467
- networkRouteDiagnostics: options.presentation.networkRouteDiagnostics,
468
- sessionMode: options.sessionMode,
469
- sessionTabCorrection: options.sessionTabCorrection,
470
- sessionTabTarget: options.currentSessionTabTarget,
471
- sessionTabTargetUnknown: options.currentSessionTabTargetUnknown,
472
- refSnapshot: options.currentRefSnapshot,
473
- refSnapshotInvalidation: options.currentRefSnapshotInvalidation,
474
- namespace: options.executionPlan.namespace,
475
- ...buildSessionDetailFields(options.executionPlan.sessionName, options.executionPlan.usedImplicitSession, options.executionPlan.namespace, options.managedSessionRestoreDisabled),
476
- sessionRecoveryHint: options.redactedRecoveryHint,
477
- startupScopedFlags: options.executionPlan.startupScopedFlags,
478
- stderr: options.processResult.stderr,
479
- stdout: options.plainTextInspection ? options.inspectionText ?? "" : undefined,
480
- summary: options.presentation.summary,
481
- timedOut: options.processResult.timedOut || undefined,
482
- timeoutMs: options.processResult.timeoutMs,
483
- };
35
+ return { content, details, isError: result.isError };
484
36
  }
485
37
  export function buildFinalAgentBrowserToolResult(options) {
486
38
  const nextActions = applyNamespaceToNextActions(buildResultNextActions(options), options.executionPlan.namespace);
487
39
  const lifecycle = extractAgentBrowserLifecycle(options.presentationEnvelope?.data);
488
40
  const browserWindow = buildBrowserWindowStatus(options, lifecycle);
489
- const details = buildAgentBrowserResultDetails(options, nextActions);
490
- if (options.modelVisible === false) {
491
- const result = { content: [], details: redactToolDetails(details, options.exactSensitiveValues), isError: !options.succeeded };
492
- return options.compiledNetworkSourceLookup ? redactNetworkSourceLookupSurface(result) : result;
493
- }
494
- const visibleRefFallbackText = formatVisibleRefFallbackText(options.visibleRefFallbackDiagnostic);
495
- const richInputRecoveryText = formatRichInputRecoveryText(options.richInputRecoveryDiagnostic);
496
- const semanticActionCandidateText = nextActions ? formatSemanticActionCandidateText(nextActions) : undefined;
497
- const clickDispatchText = options.clickDispatchDiagnostic ? formatClickDispatchDiagnosticText(options.clickDispatchDiagnostic) : undefined;
498
- const overlayBlockerText = options.overlayBlockerDiagnostic ? formatOverlayBlockerText(options.overlayBlockerDiagnostic) : undefined;
499
- const fillVerificationText = formatFillVerificationText(options.fillVerificationDiagnostic);
500
- const electronRefFreshnessText = formatElectronRefFreshnessText(options.electronRefFreshnessDiagnostic);
501
- const selectorTextVisibilityText = formatSelectorTextVisibilityText(options.selectorTextVisibilityDiagnostics);
502
- const electronBroadGetTextScopeText = formatElectronBroadGetTextScopeText(options.electronBroadGetTextScopeDiagnostics);
503
- const scrollNoopDiagnosticText = formatScrollNoopDiagnosticText(options.scrollNoopDiagnostic);
504
- const comboboxFocusDiagnosticText = formatComboboxFocusDiagnosticText(options.comboboxFocusDiagnostic);
505
- const recordingDependencyWarningText = formatRecordingDependencyWarningText(options.recordingDependencyWarning);
506
- const evalStdinHintText = formatEvalStdinHintText(options.evalStdinHint);
507
- const evalResultWarningText = formatEvalResultWarningText(options.evalResultWarning);
508
- const artifactCleanupText = formatArtifactCleanupGuidanceText(options.artifactCleanup);
509
- const timeoutPartialProgressText = options.timeoutPartialProgress ? formatTimeoutPartialProgressText(options.timeoutPartialProgress, options.currentSessionTabTargetUnknown === true && !(options.sessionMode === "fresh" && options.timeoutPartialProgress.liveUrlRecovered !== true)) : undefined;
510
- const managedSessionOutcomeText = formatManagedSessionOutcomeText(options.managedSessionOutcome);
511
- const readExecutionText = formatReadExecutionText(options, lifecycle);
512
- const browserWindowText = formatBrowserWindowText(browserWindow);
513
- const failureNextActionsText = formatFailureNextActionsText(options, nextActions);
514
- const rawAppendedDiagnosticText = [visibleRefFallbackText, richInputRecoveryText, semanticActionCandidateText, clickDispatchText, overlayBlockerText, fillVerificationText, electronRefFreshnessText, selectorTextVisibilityText, electronBroadGetTextScopeText, scrollNoopDiagnosticText, comboboxFocusDiagnosticText, recordingDependencyWarningText, evalStdinHintText, evalResultWarningText, artifactCleanupText, timeoutPartialProgressText, managedSessionOutcomeText, readExecutionText, browserWindowText, failureNextActionsText].filter((item) => item !== undefined).join("\n\n");
515
- const appendedDiagnosticText = redactSensitiveText(redactExactSensitiveText(rawAppendedDiagnosticText, options.exactSensitiveValues));
516
- const shouldAppendDiagnosticText = appendedDiagnosticText.length > 0 && (!options.userRequestedJson || options.plainTextInspection);
517
- let content = shouldAppendDiagnosticText && options.redactedContent[0]?.type === "text" ? [{ ...options.redactedContent[0], text: `${options.redactedContent[0].text}\n\n${appendedDiagnosticText}` }, ...options.redactedContent.slice(1)] : options.redactedContent;
518
- if (options.electronLaunchRecord && options.succeeded && !options.userRequestedJson && content[0]?.type === "text") {
519
- content = [{ ...content[0], text: redactSensitiveText(formatElectronLaunchText({ handoff: options.electronHandoff, record: options.electronLaunchRecord, targets: options.electronLaunch?.targets ?? [], upstreamText: content[0].text })) }, ...content.slice(1)];
520
- }
521
- const redactedDetails = redactToolDetails(details, options.exactSensitiveValues);
522
- if (options.userRequestedJson && !options.plainTextInspection) {
523
- const prior = options.redactedContent[0]?.type === "text" ? JSON.parse(options.redactedContent[0].text) : undefined;
524
- if (Array.isArray(prior?.warnings))
525
- redactedDetails.warnings = prior.warnings;
526
- content = buildJsonVisibleContent({ error: redactedDetails.error, details: redactedDetails, presentation: options.presentation, succeeded: options.succeeded, warnings: prior?.warnings });
527
- }
528
- const result = { content, details: redactedDetails, isError: !options.succeeded };
529
- return options.compiledNetworkSourceLookup ? redactNetworkSourceLookupSurface(result) : result;
530
- }
531
- export function isMissingAgentBrowserBinary(processResult) {
532
- return processResult.spawnError?.message.includes("ENOENT") === true;
533
- }
534
- export async function buildMissingBinaryFailureResult(options) {
535
- if (!isMissingAgentBrowserBinary(options.processResult))
536
- return undefined;
537
- const spawnError = options.processResult.spawnError.message;
538
- const errorText = buildMissingBinaryMessage();
539
- const managedSessionOutcome = buildManagedSessionOutcome({ activeAfter: options.managedSessionActive, activeBefore: options.managedSessionActive, attemptedSessionName: options.executionPlan.managedSessionName, command: options.executionPlan.commandInfo.command, currentSessionName: options.managedSessionName, currentSessionNamespace: options.managedSessionNamespace, previousSessionName: options.managedSessionName, sessionMode: options.sessionMode, succeeded: false });
540
- const managedSessionOutcomeText = formatManagedSessionOutcomeText(managedSessionOutcome);
541
- const managedSessionRecoveryNextActions = applyNamespaceToNextActions(buildManagedSessionFreshFailureNextActions(managedSessionOutcome), options.executionPlan.namespace) ?? [];
542
- let missingBinaryElectronCleanup;
543
- let missingBinaryElectronRecord;
544
- if (options.electronLaunch) {
545
- missingBinaryElectronCleanup = await cleanupElectronLaunchResources({ child: options.electronLaunch.child, record: options.electronLaunch.record, timeoutMs: options.implicitSessionCloseTimeoutMs });
546
- missingBinaryElectronRecord = missingBinaryElectronCleanup.record;
547
- }
548
- const textParts = [errorText, managedSessionOutcomeText, missingBinaryElectronCleanup ? `Electron cleanup after failed attach: ${missingBinaryElectronCleanup.summary}` : undefined].filter((part) => part !== undefined && part.length > 0);
549
- return { content: [{ type: "text", text: textParts.join("\n\n") }], details: { agentBrowserStarted: options.processResult.agentBrowserStarted, args: options.redactedArgs, compatibilityWorkaround: options.compatibilityWorkaround, effectiveArgs: options.redactedProcessArgs, electron: missingBinaryElectronRecord ? { action: "launch", cleanup: missingBinaryElectronCleanup, launch: missingBinaryElectronRecord, status: "failed", targets: options.electronLaunch?.targets, version: options.electronLaunch?.version } : undefined, managedSessionOutcome, namespace: options.executionPlan.namespace, nextActions: managedSessionRecoveryNextActions.length > 0 ? managedSessionRecoveryNextActions : undefined, sessionMode: options.sessionMode, sessionTabCorrection: options.sessionTabCorrection, ...buildAgentBrowserResultCategoryDetails({ args: options.redactedProcessArgs, command: options.executionPlan.commandInfo.command, errorText, failureCategory: "missing-binary", spawnError, succeeded: false }), spawnError }, isError: true };
41
+ const details = redactToolDetails(buildAgentBrowserResultDetails(options, nextActions, lifecycle, browserWindow), options.exactSensitiveValues);
42
+ const rendered = options.modelVisible === false
43
+ ? { content: [] }
44
+ : buildFinalResultContent(options, details, nextActions, { lifecycle, browserWindow });
45
+ const result = {
46
+ content: rendered.content,
47
+ details: "warnings" in rendered && rendered.warnings !== undefined
48
+ ? { ...details, warnings: rendered.warnings }
49
+ : details,
50
+ isError: !options.succeeded,
51
+ };
52
+ return options.compiledNetworkSourceLookup ? redactNetworkLookupResult(result) : result;
550
53
  }