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,24 +1,40 @@
1
1
  import { Text } from "@earendil-works/pi-tui";
2
2
  import { formatAgentBrowserRenderCall } from "./pi-tool-rendering.js";
3
3
  import { JsonSchema } from "./json-schema.js";
4
- import { AGENT_BROWSER_NAMESPACE, AGENT_BROWSER_OUTPUT_SCHEMA, finalizeAgentBrowserNativeResult } from "./native-output.js";
4
+ import { AGENT_BROWSER_NAMESPACE, AGENT_BROWSER_OUTPUT_SCHEMA, finalizeAgentBrowserNativeResult, } from "./native-output.js";
5
5
  import { AGENT_BROWSER_PARAMS, AGENT_BROWSER_CODE_PARAMS, AGENT_BROWSER_ACTION_PARAMS, AGENT_BROWSER_QA_PARAMS, AGENT_BROWSER_ELECTRON_PARAMS, AGENT_BROWSER_SOURCE_PARAMS, AGENT_BROWSER_NETWORK_SOURCE_PARAMS, AGENT_BROWSER_TOOLS_PARAMS, } from "./input-modes/params.js";
6
6
  export const AGENT_BROWSER_TOOL_INVENTORY = {
7
- action: { name: "agent_browser_action", description: "Click, check, fill, or select a unique accessible target using stable locators or current refs." },
8
- qa: { name: "agent_browser_qa", description: "Check a URL or attached page with visible assertions and a diagnostic pass/fail verdict." },
9
- electron: { name: "agent_browser_electron", description: "Discover, launch, probe, and clean up owned Electron desktop applications." },
10
- source: { name: "agent_browser_source", description: "Find experimental DOM/React/local-source candidates with a bounded workspace scan." },
11
- network: { name: "agent_browser_network_source", description: "Correlate failed requests with initiator and local-source candidates." },
7
+ action: {
8
+ name: "agent_browser_action",
9
+ description: "Click, check, fill, or select a unique accessible target using stable locators or current refs.",
10
+ },
11
+ qa: {
12
+ name: "agent_browser_qa",
13
+ description: "Check a URL or attached page with visible assertions and a diagnostic pass/fail verdict.",
14
+ },
15
+ electron: {
16
+ name: "agent_browser_electron",
17
+ description: "Discover, launch, probe, and clean up owned Electron desktop applications.",
18
+ },
19
+ source: {
20
+ name: "agent_browser_source",
21
+ description: "Find experimental DOM/React/local-source candidates with a bounded workspace scan.",
22
+ },
23
+ network: {
24
+ name: "agent_browser_network_source",
25
+ description: "Correlate failed requests with initiator and local-source candidates.",
26
+ },
12
27
  };
13
28
  export const AGENT_BROWSER_INSTRUCTION_GROUP = {
14
29
  name: "browser",
15
30
  description: "Search the web, browse and interact with pages, verify browser UI, and inspect Electron apps.",
16
31
  };
17
32
  const advancedNames = new Set(Object.values(AGENT_BROWSER_TOOL_INVENTORY).map(({ name }) => name));
18
- /** Register once; advanced calls adapt only their input shape and reuse the ordinary executor. */
19
- export function registerAgentBrowserToolSurface(pi, options) {
20
- const execute = async (id, params, signal, onUpdate, ctx) => finalizeAgentBrowserNativeResult(await options.execute(id, params, signal, onUpdate, ctx), params);
21
- const nativeOutput = { namespace: AGENT_BROWSER_NAMESPACE, outputSchema: AGENT_BROWSER_OUTPUT_SCHEMA };
33
+ const nativeOutput = {
34
+ namespace: AGENT_BROWSER_NAMESPACE,
35
+ outputSchema: AGENT_BROWSER_OUTPUT_SCHEMA,
36
+ };
37
+ function registerCoreTools(pi, options, execute) {
22
38
  pi.registerTool({
23
39
  name: "agent_browser",
24
40
  ...nativeOutput,
@@ -47,6 +63,8 @@ export function registerAgentBrowserToolSurface(pi, options) {
47
63
  },
48
64
  renderResult: options.renderResult,
49
65
  });
66
+ }
67
+ function registerActionTool(pi, options, execute) {
50
68
  pi.registerTool({
51
69
  ...AGENT_BROWSER_TOOL_INVENTORY.action,
52
70
  ...nativeOutput,
@@ -59,6 +77,8 @@ export function registerAgentBrowserToolSurface(pi, options) {
59
77
  return execute(id, { semanticAction, outputPath, timeoutMs }, signal, onUpdate, ctx);
60
78
  },
61
79
  });
80
+ }
81
+ function registerQaTool(pi, options, execute) {
62
82
  pi.registerTool({
63
83
  ...AGENT_BROWSER_TOOL_INVENTORY.qa,
64
84
  ...nativeOutput,
@@ -71,6 +91,8 @@ export function registerAgentBrowserToolSurface(pi, options) {
71
91
  return execute(id, { qa, outputPath, timeoutMs, sessionMode }, signal, onUpdate, ctx);
72
92
  },
73
93
  });
94
+ }
95
+ function registerElectronTool(pi, options, execute) {
74
96
  pi.registerTool({
75
97
  ...AGENT_BROWSER_TOOL_INVENTORY.electron,
76
98
  ...nativeOutput,
@@ -83,6 +105,8 @@ export function registerAgentBrowserToolSurface(pi, options) {
83
105
  return execute(id, { electron, outputPath }, signal, onUpdate, ctx);
84
106
  },
85
107
  });
108
+ }
109
+ function registerSourceTools(pi, options, execute) {
86
110
  pi.registerTool({
87
111
  ...AGENT_BROWSER_TOOL_INVENTORY.source,
88
112
  ...nativeOutput,
@@ -107,13 +131,24 @@ export function registerAgentBrowserToolSurface(pi, options) {
107
131
  return execute(id, { networkSourceLookup, outputPath, timeoutMs, sessionMode }, signal, onUpdate, ctx);
108
132
  },
109
133
  });
134
+ }
135
+ function toolStatus(available, active) {
136
+ if (!available) {
137
+ return "unavailable in this Pi tool selection";
138
+ }
139
+ return active ? "active" : "inactive";
140
+ }
141
+ function registerToolLoader(pi) {
110
142
  pi.registerTool({
111
143
  name: "agent_browser_tools",
112
144
  namespace: AGENT_BROWSER_NAMESPACE,
113
145
  outputSchema: JsonSchema.Object({
114
146
  inventory: JsonSchema.Array(JsonSchema.Object({
115
- key: JsonSchema.String(), name: JsonSchema.String(), description: JsonSchema.String(),
116
- available: JsonSchema.Boolean(), active: JsonSchema.Boolean(),
147
+ key: JsonSchema.String(),
148
+ name: JsonSchema.String(),
149
+ description: JsonSchema.String(),
150
+ available: JsonSchema.Boolean(),
151
+ active: JsonSchema.Boolean(),
117
152
  })),
118
153
  added: JsonSchema.Array(JsonSchema.String()),
119
154
  }),
@@ -124,46 +159,81 @@ export function registerAgentBrowserToolSurface(pi, options) {
124
159
  async execute(_id, params) {
125
160
  const available = new Set(pi.getAllTools().map(({ name }) => name));
126
161
  const active = new Set(pi.getActiveTools());
127
- const added = (params.enable ?? []).map((key) => AGENT_BROWSER_TOOL_INVENTORY[key].name)
162
+ const added = (params.enable ?? [])
163
+ .map((key) => AGENT_BROWSER_TOOL_INVENTORY[key].name)
128
164
  .filter((name) => available.has(name) && !active.has(name));
129
- if (added.length > 0)
165
+ if (added.length > 0) {
130
166
  pi.setActiveTools([...new Set([...active, ...added])]);
167
+ }
131
168
  const current = new Set(pi.getActiveTools());
132
169
  const inventory = Object.entries(AGENT_BROWSER_TOOL_INVENTORY).map(([key, tool]) => ({
133
- key, ...tool, available: available.has(tool.name), active: current.has(tool.name),
170
+ key,
171
+ name: tool.name,
172
+ description: tool.description,
173
+ available: available.has(tool.name),
174
+ active: current.has(tool.name),
134
175
  }));
135
176
  return {
136
- content: [{ type: "text", text: inventory.map((tool) => `${tool.key}: ${tool.name} (${!tool.available ? "unavailable in this Pi tool selection" : tool.active ? "active" : "inactive"}) — ${tool.description}`).join("\n") }],
177
+ content: [
178
+ {
179
+ type: "text",
180
+ text: inventory
181
+ .map((tool) => `${tool.key}: ${tool.name} (${toolStatus(tool.available, tool.active)}) — ${tool.description}`)
182
+ .join("\n"),
183
+ },
184
+ ],
137
185
  details: { inventory, added: [...new Set(added)] },
138
186
  structuredContent: { inventory, added: [...new Set(added)] },
139
187
  };
140
188
  },
141
189
  });
190
+ }
191
+ function hasExplicitToolSelection() {
192
+ const argv = process.argv.slice(2);
193
+ const delimiter = argv.indexOf("--");
194
+ return (delimiter < 0 ? argv : argv.slice(0, delimiter)).some((arg) => arg === "--tools" || arg === "-t");
195
+ }
196
+ function registerAdvancedToolReplay(pi) {
142
197
  pi.on("session_start", async (_event, ctx) => {
143
198
  // ponytail: official 1.0 SDK supplies initialActiveToolNames on resume, bypassing
144
199
  // native transcript restoration. Remove this additive fallback once the supported SDK restores it.
145
- const argv = process.argv.slice(2);
146
- const delimiter = argv.indexOf("--");
147
- if ((delimiter < 0 ? argv : argv.slice(0, delimiter)).some((arg) => arg === "--tools" || arg === "-t"))
200
+ if (hasExplicitToolSelection()) {
148
201
  return;
202
+ }
149
203
  // A host-filtered catalog is an explicit selection, not our default surface.
150
204
  const available = new Set(pi.getAllTools().map(({ name }) => name));
151
- if (!["agent_browser", "agent_browser_code", "agent_browser_tools", ...advancedNames].every(name => available.has(name)))
205
+ if (!["agent_browser", "agent_browser_code", "agent_browser_tools", ...advancedNames].every((name) => available.has(name))) {
152
206
  return;
207
+ }
153
208
  // Native dynamic imports bypass Pi's host-package aliases in consumer installs.
154
209
  // Only tool names are needed; replay native deltas without requiring the optional pi-ai peer.
155
210
  const restored = new Set();
156
211
  for (const message of ctx.sessionManager.buildSessionProjection().messages) {
157
- if (message.role !== "system")
212
+ if (message.role !== "system") {
158
213
  continue;
159
- for (const removed of message.toolsRemoved ?? [])
214
+ }
215
+ for (const removed of message.toolsRemoved ?? []) {
160
216
  restored.delete(removed.name);
161
- for (const added of message.toolsAdded ?? [])
217
+ }
218
+ for (const added of message.toolsAdded ?? []) {
162
219
  restored.add(added.name);
220
+ }
163
221
  }
164
222
  const active = new Set(pi.getActiveTools());
165
223
  const added = [...restored].filter((name) => advancedNames.has(name) && available.has(name) && !active.has(name));
166
- if (added.length > 0)
224
+ if (added.length > 0) {
167
225
  pi.setActiveTools([...active, ...added]);
226
+ }
168
227
  });
169
228
  }
229
+ /** Register once; adapters retain native execution, output, activation, and replay contracts. */
230
+ export function registerAgentBrowserToolSurface(pi, options) {
231
+ const execute = async (id, params, signal, onUpdate, ctx) => finalizeAgentBrowserNativeResult(await options.execute(id, params, signal, onUpdate, ctx), params);
232
+ registerCoreTools(pi, options, execute);
233
+ registerActionTool(pi, options, execute);
234
+ registerQaTool(pi, options, execute);
235
+ registerElectronTool(pi, options, execute);
236
+ registerSourceTools(pi, options, execute);
237
+ registerToolLoader(pi);
238
+ registerAdvancedToolReplay(pi);
239
+ }
@@ -6,9 +6,10 @@ export function parseAgentBrowserVersionOutput(stdout) {
6
6
  }
7
7
  export function getAgentBrowserVersionValidationError(stdout) {
8
8
  const observed = parseAgentBrowserVersionOutput(stdout);
9
- if (observed && isSupportedAgentBrowserVersion(observed))
9
+ if (observed !== undefined && isSupportedAgentBrowserVersion(observed)) {
10
10
  return undefined;
11
- return observed
11
+ }
12
+ return observed !== undefined
12
13
  ? `Installed agent-browser ${observed} is unsupported; stable versions must be at least ${MINIMUM_AGENT_BROWSER_VERSION_LABEL}. Install ${TARGET_AGENT_BROWSER_VERSION_LABEL} (recommended), run pi-agent-browser-doctor, then reload Pi.`
13
14
  : `agent-browser --version returned an unrecognized value; expected ${SUPPORTED_AGENT_BROWSER_VERSION_LABEL}. Run pi-agent-browser-doctor and install a supported upstream version.`;
14
15
  }
@@ -0,0 +1,193 @@
1
+ import { isRecord } from "./parsing.js";
2
+ import { fetchSearchJson, SEARCH_REQUEST_TIMEOUT_MS } from "./web-search-request.js";
3
+ import { cleanSearchText, normalizeBraveSearchResult, normalizeExaSearchResult, parseBraveSearchResponse, parseExaSearchResponse, } from "./web-search-results.js";
4
+ const BRAVE_SEARCH_ENDPOINT = "https://api.search.brave.com/res/v1/web/search";
5
+ const EXA_SEARCH_ENDPOINT = "https://api.exa.ai/search";
6
+ const EXA_DYNAMIC_HIGHLIGHTS_BETA = "dynamic-highlights-2026-08-28";
7
+ export const EXA_SEARCH_SYSTEM_PROMPT = "Prefer primary, official sources. Respect any requested version or date. Avoid duplicate or equivalent results.";
8
+ /** Local validation/config failures, not provider outages; reported as `validation-error`. */
9
+ export class WebSearchLocalError extends Error {
10
+ }
11
+ export function buildBraveSearchUrl(params) {
12
+ const url = new URL(BRAVE_SEARCH_ENDPOINT);
13
+ url.searchParams.set("q", params.query);
14
+ url.searchParams.set("count", String(params.count));
15
+ url.searchParams.set("offset", String(params.offset));
16
+ if (params.country !== undefined && params.country.length > 0) {
17
+ url.searchParams.set("country", params.country.toUpperCase());
18
+ }
19
+ if (params.searchLang !== undefined && params.searchLang.length > 0) {
20
+ url.searchParams.set("search_lang", params.searchLang);
21
+ }
22
+ if (params.safesearch !== undefined) {
23
+ url.searchParams.set("safesearch", params.safesearch);
24
+ }
25
+ if (params.freshness !== undefined) {
26
+ url.searchParams.set("freshness", params.freshness);
27
+ }
28
+ return url;
29
+ }
30
+ const FRESHNESS_DAYS = { pd: 1, pw: 7, pm: 31, py: 365 };
31
+ function getStartPublishedDate(freshness, now) {
32
+ if (freshness === undefined) {
33
+ return;
34
+ }
35
+ return new Date(now().getTime() - FRESHNESS_DAYS[freshness] * 24 * 60 * 60 * 1000).toISOString();
36
+ }
37
+ function hasEntries(values) {
38
+ return values !== undefined && values.length > 0;
39
+ }
40
+ function validateExaFilters(params, searchType) {
41
+ if (hasEntries(params.additionalQueries) && !searchType.startsWith("deep")) {
42
+ throw new WebSearchLocalError(`additionalQueries requires deep-lite, deep, or deep-reasoning; received ${searchType}.`);
43
+ }
44
+ if ((params.category === "company" || params.category === "people") &&
45
+ (params.freshness !== undefined || hasEntries(params.excludeDomains))) {
46
+ throw new WebSearchLocalError(`category ${params.category} cannot be combined with freshness or excludeDomains.`);
47
+ }
48
+ }
49
+ function exaContentFilters(params) {
50
+ return {
51
+ ...(hasEntries(params.includeDomains) ? { includeDomains: params.includeDomains } : {}),
52
+ ...(hasEntries(params.excludeDomains) ? { excludeDomains: params.excludeDomains } : {}),
53
+ ...(hasEntries(params.additionalQueries)
54
+ ? { additionalQueries: params.additionalQueries }
55
+ : {}),
56
+ ...(params.safesearch !== undefined && params.safesearch !== "off" ? { moderation: true } : {}),
57
+ };
58
+ }
59
+ export function buildExaSearchRequestBody(params, now = () => new Date()) {
60
+ const searchType = params.searchType ?? "auto";
61
+ validateExaFilters(params, searchType);
62
+ const startPublishedDate = getStartPublishedDate(params.freshness, now);
63
+ return {
64
+ query: params.query,
65
+ type: searchType,
66
+ numResults: Math.min(params.count + params.offset, 100),
67
+ contents: { highlights: params.highlightsDynamic === true ? { dynamic: true } : true },
68
+ systemPrompt: EXA_SEARCH_SYSTEM_PROMPT,
69
+ ...(params.category !== undefined ? { category: params.category } : {}),
70
+ ...(params.country !== undefined && params.country.length > 0
71
+ ? { userLocation: params.country.toUpperCase() }
72
+ : {}),
73
+ ...exaContentFilters(params),
74
+ ...(startPublishedDate !== undefined ? { startPublishedDate } : {}),
75
+ };
76
+ }
77
+ export async function fetchBraveSearchJson(url, apiKey, signal) {
78
+ const data = await fetchSearchJson({
79
+ cancelMessage: "Brave search cancelled",
80
+ init: { headers: { Accept: "application/json", "X-Subscription-Token": apiKey } },
81
+ invalidJsonMessage: "Brave search returned invalid JSON",
82
+ provider: "brave",
83
+ request: url,
84
+ signal,
85
+ timeoutMessage: "Brave search timed out",
86
+ timeoutMs: SEARCH_REQUEST_TIMEOUT_MS,
87
+ });
88
+ return parseBraveSearchResponse(data);
89
+ }
90
+ function getExaRequestTimeoutMs(searchType) {
91
+ switch (searchType) {
92
+ case "deep-lite":
93
+ return 45_000;
94
+ case "deep":
95
+ return 60_000;
96
+ case "deep-reasoning":
97
+ return 90_000;
98
+ case "auto":
99
+ case "fast":
100
+ case "instant":
101
+ case undefined:
102
+ return SEARCH_REQUEST_TIMEOUT_MS;
103
+ }
104
+ }
105
+ function usesDynamicHighlights(body) {
106
+ const contents = body.contents;
107
+ return (isRecord(contents) &&
108
+ !Array.isArray(contents) &&
109
+ isRecord(contents.highlights) &&
110
+ !Array.isArray(contents.highlights) &&
111
+ contents.highlights.dynamic === true);
112
+ }
113
+ export async function fetchExaSearchJson(body, apiKey, signal, timeoutMs = SEARCH_REQUEST_TIMEOUT_MS) {
114
+ const data = await fetchSearchJson({
115
+ cancelMessage: "Exa search cancelled",
116
+ init: {
117
+ body: JSON.stringify(body),
118
+ headers: {
119
+ Accept: "application/json",
120
+ "Content-Type": "application/json",
121
+ "x-api-key": apiKey,
122
+ ...(usesDynamicHighlights(body) ? { "Exa-Beta": EXA_DYNAMIC_HIGHLIGHTS_BETA } : {}),
123
+ },
124
+ method: "POST",
125
+ },
126
+ invalidJsonMessage: "Exa search returned invalid JSON",
127
+ provider: "exa",
128
+ request: EXA_SEARCH_ENDPOINT,
129
+ signal,
130
+ timeoutMessage: "Exa search timed out",
131
+ timeoutMs,
132
+ });
133
+ return parseExaSearchResponse(data);
134
+ }
135
+ const BRAVE_WEB_SEARCH_ADAPTER = {
136
+ provider: "brave",
137
+ buildRequest(params) {
138
+ // Brave offsets count pages; fetch the prefix and slice by result like Exa.
139
+ return buildBraveSearchUrl({ ...params, count: params.count + params.offset, offset: 0 });
140
+ },
141
+ fetchJson: fetchBraveSearchJson,
142
+ normalizeResponse(response, params) {
143
+ return {
144
+ results: (response.web?.results ?? [])
145
+ .map(normalizeBraveSearchResult)
146
+ .filter((result) => result !== undefined)
147
+ .slice(params.offset, params.offset + params.count),
148
+ returnedQuery: cleanSearchText(response.query?.altered, 300) ??
149
+ cleanSearchText(response.query?.original, 300) ??
150
+ params.query,
151
+ };
152
+ },
153
+ };
154
+ const EXA_WEB_SEARCH_ADAPTER = {
155
+ provider: "exa",
156
+ buildRequest(params) {
157
+ return {
158
+ body: buildExaSearchRequestBody(params),
159
+ timeoutMs: getExaRequestTimeoutMs(params.searchType ?? "auto"),
160
+ };
161
+ },
162
+ fetchJson(request, apiKey, signal) {
163
+ return fetchExaSearchJson(request.body, apiKey, signal, request.timeoutMs);
164
+ },
165
+ normalizeResponse(response, params) {
166
+ return {
167
+ extraDetails: {
168
+ requestId: cleanSearchText(response.requestId, 120),
169
+ searchType: params.searchType ?? "auto",
170
+ },
171
+ results: (response.results ?? [])
172
+ .map(normalizeExaSearchResult)
173
+ .filter((result) => result !== undefined)
174
+ .slice(params.offset, params.offset + params.count),
175
+ returnedQuery: params.query,
176
+ };
177
+ },
178
+ };
179
+ /** Build before queueing so local validation fails without consuming a request slot. */
180
+ export function prepareWebSearchRequest(provider, params, apiKey, signal) {
181
+ if (provider === "exa") {
182
+ const request = EXA_WEB_SEARCH_ADAPTER.buildRequest(params);
183
+ return async () => {
184
+ const response = await EXA_WEB_SEARCH_ADAPTER.fetchJson(request, apiKey, signal);
185
+ return EXA_WEB_SEARCH_ADAPTER.normalizeResponse(response, params);
186
+ };
187
+ }
188
+ const request = BRAVE_WEB_SEARCH_ADAPTER.buildRequest(params);
189
+ return async () => {
190
+ const response = await BRAVE_WEB_SEARCH_ADAPTER.fetchJson(request, apiKey, signal);
191
+ return BRAVE_WEB_SEARCH_ADAPTER.normalizeResponse(response, params);
192
+ };
193
+ }
@@ -0,0 +1,102 @@
1
+ import { getProviderLabel } from "./web-search-results.js";
2
+ export const SEARCH_REQUEST_TIMEOUT_MS = 15_000;
3
+ export const WEB_SEARCH_MIN_REQUEST_INTERVAL_MS = 1_100;
4
+ function sleepWithAbort(ms, signal) {
5
+ if (ms <= 0) {
6
+ return Promise.resolve();
7
+ }
8
+ if (signal?.aborted === true) {
9
+ const reason = signal.reason;
10
+ // A caller-owned abort reason may be non-Error; preserve the original reason.
11
+ // oxlint-disable-next-line typescript/prefer-promise-reject-errors
12
+ return Promise.reject(reason ?? new Error("Web search cancelled"));
13
+ }
14
+ return new Promise((resolve, reject) => {
15
+ const cleanup = () => signal?.removeEventListener("abort", abort);
16
+ const timeout = setTimeout(() => {
17
+ cleanup();
18
+ resolve();
19
+ }, ms);
20
+ const abort = () => {
21
+ clearTimeout(timeout);
22
+ cleanup();
23
+ const reason = signal?.reason;
24
+ // A caller-owned abort reason may be non-Error; preserve the original reason.
25
+ // oxlint-disable-next-line typescript/prefer-promise-reject-errors
26
+ reject(reason ?? new Error("Web search cancelled"));
27
+ };
28
+ signal?.addEventListener("abort", abort, { once: true });
29
+ });
30
+ }
31
+ export class WebSearchRequestGate {
32
+ lastRequestStartedAt = 0;
33
+ tail = Promise.resolve();
34
+ run(signal, task) {
35
+ const runTask = async () => {
36
+ const elapsedMs = this.lastRequestStartedAt === 0
37
+ ? WEB_SEARCH_MIN_REQUEST_INTERVAL_MS
38
+ : Date.now() - this.lastRequestStartedAt;
39
+ const waitMs = Math.max(0, WEB_SEARCH_MIN_REQUEST_INTERVAL_MS - elapsedMs);
40
+ if (waitMs > 0) {
41
+ await sleepWithAbort(waitMs, signal);
42
+ }
43
+ if (signal?.aborted === true) {
44
+ signal.throwIfAborted();
45
+ }
46
+ this.lastRequestStartedAt = Date.now();
47
+ return task();
48
+ };
49
+ const result = this.tail.then(runTask, runTask);
50
+ this.tail = result.catch(() => {
51
+ /* Failed requests release the queue; callers retain the original rejection. */
52
+ });
53
+ return result;
54
+ }
55
+ }
56
+ function formatSearchHttpError(options) {
57
+ const { provider, status } = options;
58
+ const providerLabel = getProviderLabel(provider);
59
+ if (status === 429) {
60
+ return `${providerLabel} search rate limit exceeded (HTTP 429). Do not issue parallel or repeated agent_browser_web_search calls; use one high-signal query, inspect those results, then wait before retrying or ask the user to adjust their ${providerLabel} API plan/limits.`;
61
+ }
62
+ if (status === 401 || status === 403) {
63
+ return `${providerLabel} search failed with HTTP ${status}: Check your API credential and permissions.`;
64
+ }
65
+ if (status >= 500) {
66
+ return `${providerLabel} search failed with HTTP ${status}: Provider unavailable; retry later.`;
67
+ }
68
+ return `${providerLabel} search failed with HTTP ${status}: Request rejected; check the search parameters.`;
69
+ }
70
+ export async function fetchSearchJson(options) {
71
+ if (options.signal?.aborted === true) {
72
+ options.signal.throwIfAborted();
73
+ }
74
+ const controller = new AbortController();
75
+ const timeout = setTimeout(() => controller.abort(new Error(options.timeoutMessage)), options.timeoutMs);
76
+ const abort = () => controller.abort(options.signal?.reason ?? new Error(options.cancelMessage));
77
+ options.signal?.addEventListener("abort", abort, { once: true });
78
+ try {
79
+ const response = await fetch(options.request, { ...options.init, signal: controller.signal });
80
+ if (!response.ok) {
81
+ await response.body?.cancel().catch(() => {
82
+ // Disposal errors must not replace the source-free HTTP diagnostic.
83
+ });
84
+ throw new Error(formatSearchHttpError({
85
+ provider: options.provider,
86
+ status: response.status,
87
+ }));
88
+ }
89
+ const text = await response.text();
90
+ try {
91
+ return JSON.parse(text);
92
+ }
93
+ catch {
94
+ // Parser messages and causes can include partial credentials from the response body.
95
+ throw new Error(options.invalidJsonMessage);
96
+ }
97
+ }
98
+ finally {
99
+ clearTimeout(timeout);
100
+ options.signal?.removeEventListener("abort", abort);
101
+ }
102
+ }