pi-agent-browser-native 0.9.3 → 0.9.4

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