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
@@ -0,0 +1,77 @@
1
+ import { getScreenshotCapture } from "../../orchestration/browser-run/screenshot-capture.js";
2
+ import { isRecord } from "../../parsing.js";
3
+ import { applyArtifactManifest, attachInlineImage, buildArtifactVerificationSummary, buildManifestEntriesForFileArtifacts, extractFileArtifacts, extractImagePath, isManifestFileArtifact, } from "./artifacts.js";
4
+ import { getPresentationPaths } from "./content.js";
5
+ import { compactLargePresentationOutput } from "./large-output.js";
6
+ export async function extractPresentationArtifacts(options, source) {
7
+ return extractFileArtifacts({
8
+ artifactManifest: options.artifactManifest,
9
+ artifactMaxUpdatedAtMs: options.artifactMaxUpdatedAtMs,
10
+ artifactMinUpdatedAtMs: options.artifactMinUpdatedAtMs,
11
+ artifactRequest: options.artifactRequest,
12
+ commandInfo: source.presentationCommandInfo,
13
+ cwd: options.cwd,
14
+ data: source.data,
15
+ namespace: options.namespace,
16
+ recordingOutcome: source.recordingCommand ? options.envelope?.success : undefined,
17
+ recordingPending: options.recordingPending,
18
+ previousRecordingContactSheetPath: options.previousRecordingContactSheetPath,
19
+ sessionName: options.sessionName,
20
+ });
21
+ }
22
+ function getAttachableImage(options, source, artifacts) {
23
+ const path = getImagePath(options, source, artifacts);
24
+ if (path === undefined ||
25
+ path.length === 0 ||
26
+ (isRecord(source.data) && source.data.changed === false)) {
27
+ return undefined;
28
+ }
29
+ return artifacts.some((artifact) => artifact.absolutePath === path &&
30
+ ["missing", "stale", "failed"].includes(artifact.status ?? ""))
31
+ ? undefined
32
+ : path;
33
+ }
34
+ function getImagePath(options, source, artifacts) {
35
+ return (options.artifactRequest?.absolutePath ??
36
+ extractImagePath(options.commandInfo, options.cwd, source.data) ??
37
+ (source.recordingCommand
38
+ ? artifacts.find((artifact) => artifact.kind === "image" && artifact.status === "saved")
39
+ ?.absolutePath
40
+ : undefined));
41
+ }
42
+ async function attachPresentationImage(draft, options, source, artifacts) {
43
+ const imagePath = getAttachableImage(options, source, artifacts);
44
+ const withImage = imagePath === undefined
45
+ ? draft
46
+ : await attachInlineImage(draft, imagePath, options.modelVisible);
47
+ if (options.commandInfo.command === "screenshot" && withImage.imageObservations) {
48
+ const capture = getScreenshotCapture(source.commandInfo.commandTokens ?? []).kind;
49
+ withImage.imageObservations = withImage.imageObservations.map((image) => Object.assign({}, image, { capture }));
50
+ }
51
+ return withImage;
52
+ }
53
+ export async function completePresentationOutput(draft, options, source, artifacts) {
54
+ if (artifacts.length > 0 && !draft.artifacts) {
55
+ draft.artifacts = artifacts;
56
+ }
57
+ draft.artifactVerification ??= buildArtifactVerificationSummary(artifacts);
58
+ const withImage = await attachPresentationImage(draft, options, source, artifacts);
59
+ const compacted = options.modelVisible === false
60
+ ? withImage
61
+ : await compactLargePresentationOutput({
62
+ artifactManifest: options.artifactManifest,
63
+ commandInfo: options.commandInfo,
64
+ data: source.presentationData,
65
+ persistentArtifactStore: options.persistentArtifactStore,
66
+ presentation: withImage,
67
+ });
68
+ const withManifest = applyArtifactManifest(compacted, compacted.artifactManifest ?? options.artifactManifest, buildManifestEntriesForFileArtifacts(artifacts.filter(isManifestFileArtifact)));
69
+ const currentSpillPaths = new Set(getPresentationPaths({
70
+ primaryPath: withManifest.fullOutputPath,
71
+ secondaryPaths: withManifest.fullOutputPaths,
72
+ }));
73
+ withManifest.artifactVerification =
74
+ buildArtifactVerificationSummary(artifacts, withManifest.artifactManifest, currentSpillPaths) ??
75
+ withManifest.artifactVerification;
76
+ return withManifest;
77
+ }
@@ -0,0 +1,51 @@
1
+ import { writePersistentSessionArtifactFile, writeSecureTempFile, } from "../../temp.js";
2
+ import { buildEvictedSessionArtifactEntries } from "../artifact-manifest.js";
3
+ import { redactModelFacingText, stringifyModelFacing } from "./common.js";
4
+ function serializePayload(data, text) {
5
+ if (typeof data === "string") {
6
+ return redactModelFacingText(data);
7
+ }
8
+ if (typeof data === "number" || typeof data === "boolean") {
9
+ return String(data);
10
+ }
11
+ return data === undefined ? redactModelFacingText(text) : stringifyModelFacing(data);
12
+ }
13
+ export async function writeLargeOutputSpillFile(options) {
14
+ const isStructured = typeof options.data !== "string" &&
15
+ typeof options.data !== "number" &&
16
+ typeof options.data !== "boolean";
17
+ const fileOptions = {
18
+ content: serializePayload(options.data, options.text),
19
+ prefix: "pi-agent-browser-output",
20
+ suffix: isStructured ? ".json" : ".txt",
21
+ };
22
+ if (options.persistentArtifactStore) {
23
+ return {
24
+ ...(await writePersistentSessionArtifactFile({
25
+ ...fileOptions,
26
+ store: options.persistentArtifactStore,
27
+ })),
28
+ storageScope: "persistent-session",
29
+ };
30
+ }
31
+ return {
32
+ evictedArtifacts: [],
33
+ path: await writeSecureTempFile(fileOptions),
34
+ storageScope: "process-temp",
35
+ };
36
+ }
37
+ export function buildSpillArtifactEntries(options) {
38
+ const nowMs = Date.now();
39
+ return [
40
+ {
41
+ command: options.commandInfo.command,
42
+ createdAtMs: nowMs,
43
+ kind: "spill",
44
+ path: options.path,
45
+ retentionState: options.storageScope === "persistent-session" ? "live" : "ephemeral",
46
+ storageScope: options.storageScope,
47
+ subcommand: options.commandInfo.subcommand,
48
+ },
49
+ ...buildEvictedSessionArtifactEntries(options.evictedArtifacts, nowMs),
50
+ ];
51
+ }
@@ -1,269 +1,145 @@
1
1
  import { isRecord } from "../../parsing.js";
2
2
  import { getNativeTabContinuationGuidance } from "../../read-confirmation.js";
3
- import { detectConfirmationRequired } from "../confirmation.js";
4
- import { formatRawSnapshotText, formatSnapshotSummary } from "../snapshot.js";
5
- import { getPageSummary, omitUpstreamLifecycle, redactModelFacingText, stringifyModelFacing } from "./common.js";
6
- import { formatDiagnosticSummary, formatDiagnosticText, formatProfilesText, getStreamSummary, getTabSummary } from "./diagnostics.js";
7
- import { getScreenshotSummary } from "./artifacts.js";
8
- import { formatSkillsText } from "./skills.js";
3
+ import { detectConfirmationRequired, } from "../confirmation.js";
4
+ import { getPageSummary, omitUpstreamLifecycle, redactModelFacingText, stringifyModelFacing, } from "./common.js";
5
+ import { formatDiagnosticSummary, formatDiagnosticText } from "./diagnostics.js";
9
6
  import { formatExtractionSummary, formatExtractionText, formatNavigationActionResult, formatNavigationSummary, getNavigationSummary, isNavigationObservableCommand, } from "./navigation.js";
10
7
  import { formatSemanticActionPresentationSummary, formatSemanticActionPresentationText, resolvePresentationCommandInfo, } from "./semantic-action.js";
11
- function formatConfirmationRequiredSummary(confirmation) {
12
- return `Confirmation required: ${confirmation.id}`;
13
- }
14
- const SIMPLE_ACTION_RESULTS = {
15
- check: { field: "checked", label: "Checked" },
16
- click: { field: "clicked", label: "Clicked" },
17
- fill: { field: "filled", label: "Filled" },
18
- focus: { field: "focused", label: "Focused" },
19
- hover: { field: "hovered", label: "Hovered" },
20
- press: { field: "pressed", label: "Pressed" },
21
- select: { field: "selected", label: "Selected" },
22
- type: { field: "typed", label: "Typed" },
23
- uncheck: { field: "unchecked", label: "Unchecked" },
24
- };
25
- function formatSimpleActionResult(command, data) {
26
- if (!isRecord(data))
27
- return undefined;
28
- if (command === "click" && getNavigationSummary(data))
29
- return undefined;
30
- const definition = SIMPLE_ACTION_RESULTS[command];
31
- if (!definition)
32
- return undefined;
33
- const value = data[definition.field];
34
- if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean")
35
- return undefined;
36
- return `${definition.label}: ${redactModelFacingText(String(value))}`;
8
+ import { COMMAND_PRESENTERS } from "./command-presenters.js";
9
+ function formatConfirmationRequiredText(confirmation) {
10
+ const lines = ["Confirmation required.", `Pending confirmation id: ${confirmation.id}`];
11
+ if (confirmation.actionText !== undefined && confirmation.actionText.length > 0) {
12
+ lines.push(`Action: ${confirmation.actionText}`);
13
+ }
14
+ lines.push("", "Next steps:", `- Approve: { "args": ["confirm", "${confirmation.id}"] }`, `- Deny: { "args": ["deny", "${confirmation.id}"] }`);
15
+ return lines.join("\n");
37
16
  }
38
- function formatWaitResult(data) {
39
- if (!isRecord(data))
17
+ function formatBatchSummary(data) {
18
+ if (!Array.isArray(data)) {
40
19
  return undefined;
41
- if (data.waited === "timeout")
42
- return "Fixed wait elapsed; no page condition was verified.";
43
- for (const field of ["selector", "text", "url", "state", "waited"]) {
44
- const value = data[field];
45
- if (typeof value === "string" && value.length > 0)
46
- return `Wait completed: ${redactModelFacingText(value)}`;
47
20
  }
48
- return undefined;
49
- }
50
- function formatCloseResult(data) {
51
- return isRecord(data) && data.closed === true ? "Browser session closed." : undefined;
21
+ const count = data.filter((item) => isRecord(item) && item.success !== false).length;
22
+ return count === data.length
23
+ ? `Batch: ${count}/${data.length} succeeded`
24
+ : `Batch failed: ${count}/${data.length} succeeded`;
52
25
  }
53
- const VITALS_METRICS = ["lcp", "fcp", "ttfb", "inp", "cls"];
54
- function coerceVitalsMetricValue(value) {
55
- if (typeof value === "number" && Number.isFinite(value))
56
- return value;
57
- if (isRecord(value)) {
58
- for (const nestedKey of ["value", "duration", "startTime", "score"]) {
59
- const nestedValue = value[nestedKey];
60
- if (typeof nestedValue === "number" && Number.isFinite(nestedValue))
61
- return nestedValue;
26
+ function firstNonemptyResult(formatters) {
27
+ for (const format of formatters) {
28
+ const result = format();
29
+ if (result !== undefined && result.length > 0) {
30
+ return result;
62
31
  }
63
32
  }
64
33
  return undefined;
65
34
  }
66
- function getVitalsMetric(data, key) {
67
- const metrics = isRecord(data.metrics) ? data.metrics : undefined;
68
- return coerceVitalsMetricValue(data[key] ?? data[key.toUpperCase()] ?? metrics?.[key] ?? metrics?.[key.toUpperCase()]);
69
- }
70
- function formatVitalsMetric(key, value) {
71
- return key === "cls" ? `${key.toUpperCase()}: ${value}` : `${key.toUpperCase()}: ${Math.round(value)}ms`;
72
- }
73
- function getVitalsMetrics(data) {
74
- return VITALS_METRICS.flatMap((key) => {
75
- const value = getVitalsMetric(data, key);
76
- return value === undefined ? [] : [formatVitalsMetric(key, value)];
77
- });
78
- }
79
- function getVitalsUnavailableReason(data) {
80
- for (const key of ["reason", "message", "error", "status"]) {
81
- const value = data[key];
82
- if (typeof value === "string" && value.trim().length > 0)
83
- return redactModelFacingText(value.trim());
35
+ function formatObservedNavigation(mode, command, data) {
36
+ const navigation = getNavigationSummary(data);
37
+ if (!navigation || !isNavigationObservableCommand(command.command, command.subcommand)) {
38
+ return undefined;
84
39
  }
85
- return "No Core Web Vitals metric fields were present in the upstream result.";
40
+ const text = formatNavigationSummary(navigation);
41
+ if (text === undefined || text.length === 0) {
42
+ return undefined;
43
+ }
44
+ if (mode === "summary") {
45
+ return `${command.command ?? "navigation"} → ${text.split("\n", 1).at(0) ?? text}`;
46
+ }
47
+ const action = formatNavigationActionResult(data);
48
+ return action !== undefined && action.length > 0
49
+ ? `${action}\n\nCurrent page:\n${text}`
50
+ : `Current page:\n${text}`;
86
51
  }
87
- function formatVitalsText(data) {
88
- const url = typeof data.url === "string" && data.url.trim().length > 0 ? redactModelFacingText(data.url.trim()) : undefined;
89
- const metrics = getVitalsMetrics(data);
90
- const lines = [url ? `Vitals for ${url}` : "Vitals result"];
91
- if (metrics.length > 0)
92
- lines.push(...metrics.map((metric) => `- ${metric}`));
93
- else
94
- lines.push(`Metrics unavailable: ${getVitalsUnavailableReason(data)}`);
95
- return lines.join("\n");
52
+ function formatPageAction(mode, command, data, compiled) {
53
+ if (compiled) {
54
+ const format = mode === "summary"
55
+ ? formatSemanticActionPresentationSummary
56
+ : formatSemanticActionPresentationText;
57
+ const text = format(compiled, data);
58
+ if (text !== undefined && text.length > 0) {
59
+ return text;
60
+ }
61
+ }
62
+ return formatObservedNavigation(mode, resolvePresentationCommandInfo(command, compiled), data);
96
63
  }
97
- function formatVitalsSummary(data) {
98
- const metrics = getVitalsMetrics(data);
99
- if (metrics.length > 0)
100
- return `Vitals: ${metrics.join(", ")}`;
101
- return "Vitals: metrics unavailable";
64
+ function formatPageContentFallback(mode, data) {
65
+ const page = getPageSummary(data);
66
+ if (page !== undefined && page.length > 0) {
67
+ return mode === "summary"
68
+ ? (page.split("\n", 1).at(0) ?? "agent-browser result")
69
+ : redactModelFacingText(page);
70
+ }
71
+ if (mode === "text") {
72
+ const { navigationSummary: _navigationSummary, ...content } = omitUpstreamLifecycle(data);
73
+ if (Object.keys(content).length > 0) {
74
+ return stringifyModelFacing(content);
75
+ }
76
+ }
77
+ return undefined;
102
78
  }
103
- function formatConfirmationRequiredText(confirmation) {
104
- const lines = [
105
- "Confirmation required.",
106
- `Pending confirmation id: ${confirmation.id}`,
107
- ];
108
- if (confirmation.actionText)
109
- lines.push(`Action: ${confirmation.actionText}`);
110
- lines.push("", "Next steps:", `- Approve: { "args": ["confirm", "${confirmation.id}"] }`, `- Deny: { "args": ["deny", "${confirmation.id}"] }`);
111
- return lines.join("\n");
79
+ function formatPageFallback(mode, command, data) {
80
+ const diagnostic = mode === "summary" ? formatDiagnosticSummary : formatDiagnosticText;
81
+ const extraction = mode === "summary" ? formatExtractionSummary : formatExtractionText;
82
+ const formatters = mode === "summary" ? [diagnostic, extraction] : [extraction, diagnostic];
83
+ return (firstNonemptyResult(formatters.map((format) => () => format(command, data))) ??
84
+ formatPageContentFallback(mode, data));
112
85
  }
113
- const COMMAND_PRESENTERS = {
114
- ...Object.fromEntries(Object.keys(SIMPLE_ACTION_RESULTS).map((command) => [command, {
115
- summary: (_commandInfo, data) => formatSimpleActionResult(command, data),
116
- text: (_commandInfo, data) => formatSimpleActionResult(command, data),
117
- }])),
118
- close: { summary: (_commandInfo, data) => formatCloseResult(data), text: (_commandInfo, data) => formatCloseResult(data) },
119
- exit: { summary: (_commandInfo, data) => formatCloseResult(data), text: (_commandInfo, data) => formatCloseResult(data) },
120
- quit: { summary: (_commandInfo, data) => formatCloseResult(data), text: (_commandInfo, data) => formatCloseResult(data) },
121
- wait: { summary: (_commandInfo, data) => formatWaitResult(data), text: (_commandInfo, data) => formatWaitResult(data) },
122
- profiles: {
123
- summary: (_commandInfo, data) => Array.isArray(data) ? `Chrome profiles: ${data.length}` : undefined,
124
- text: (_commandInfo, data) => Array.isArray(data) ? formatProfilesText(data, "Chrome profiles") : undefined,
125
- },
126
- read: {
127
- summary: (_commandInfo, data) => isRecord(data) && typeof (data.finalUrl ?? data.url) === "string" ? `Read: ${data.finalUrl ?? data.url}` : undefined,
128
- text: (_commandInfo, data) => isRecord(data) && typeof data.content === "string" ? redactModelFacingText(data.content) : undefined,
129
- },
130
- screenshot: {
131
- summary: (_commandInfo, data) => isRecord(data) && data.changed === false ? getScreenshotSummary(data) : isRecord(data) && typeof data.path === "string" ? `Screenshot saved: ${data.path}` : undefined,
132
- text: (_commandInfo, data) => isRecord(data) ? getScreenshotSummary(data) : undefined,
133
- },
134
- skills: {
135
- summary: (commandInfo, data) => {
136
- if (Array.isArray(data) && commandInfo.subcommand === "list")
137
- return `agent-browser skills: ${data.length}`;
138
- if (commandInfo.subcommand === "get")
139
- return "agent-browser skill loaded";
140
- if (commandInfo.subcommand === "path")
141
- return "agent-browser skill path";
142
- return undefined;
143
- },
144
- text: formatSkillsText,
145
- },
146
- snapshot: {
147
- summary: (_commandInfo, data) => isRecord(data) ? formatSnapshotSummary(data) : undefined,
148
- text: (_commandInfo, data) => isRecord(data) ? formatRawSnapshotText(data) : undefined,
149
- },
150
- stream: {
151
- summary: (commandInfo, data) => {
152
- if (!isRecord(data) || commandInfo.subcommand !== "status")
153
- return undefined;
154
- const port = typeof data.port === "number" ? ` on port ${data.port}` : "";
155
- return `Stream ${data.enabled === true ? "enabled" : "disabled"}${port}`;
156
- },
157
- text: (commandInfo, data) => isRecord(data) && commandInfo.subcommand === "status" ? getStreamSummary(data) : undefined,
158
- },
159
- tab: {
160
- summary: (_commandInfo, data) => isRecord(data) && Array.isArray(data.tabs)
161
- ? `Tabs: ${data.tabs.length}`
162
- : isRecord(data) && data.closed === true ? "Tab closed" : undefined,
163
- text: (_commandInfo, data) => isRecord(data) && data.closed === true
164
- ? `Tab closed${typeof data.tabId === "string" ? `: ${redactModelFacingText(data.tabId)}` : "."}`
165
- : isRecord(data) ? getTabSummary(data) : undefined,
166
- },
167
- vitals: {
168
- summary: (_commandInfo, data) => isRecord(data) ? formatVitalsSummary(data) : undefined,
169
- text: (_commandInfo, data) => isRecord(data) ? formatVitalsText(data) : undefined,
170
- },
171
- "web-vitals": {
172
- summary: (_commandInfo, data) => isRecord(data) ? formatVitalsSummary(data) : undefined,
173
- text: (_commandInfo, data) => isRecord(data) ? formatVitalsText(data) : undefined,
174
- },
175
- };
176
- function formatBatchSummary(data) {
177
- if (!Array.isArray(data))
178
- return undefined;
179
- const successCount = data.filter((item) => isRecord(item) && item.success !== false).length;
180
- return successCount === data.length
181
- ? `Batch: ${successCount}/${data.length} succeeded`
182
- : `Batch failed: ${successCount}/${data.length} succeeded`;
86
+ function formatNativeCommand(mode, command, data) {
87
+ const presenter = command.command !== undefined ? COMMAND_PRESENTERS[command.command] : undefined;
88
+ const format = mode === "summary" ? presenter?.summary : presenter?.text;
89
+ return format?.(command, data);
183
90
  }
184
- export function formatPresentationSummary(commandInfo, data, compiledSemanticAction) {
185
- const confirmationRequired = detectConfirmationRequired(data);
186
- if (confirmationRequired)
187
- return formatConfirmationRequiredSummary(confirmationRequired);
188
- const presentationCommandInfo = resolvePresentationCommandInfo(commandInfo, compiledSemanticAction);
189
- if (commandInfo.command === "batch") {
190
- const batchSummary = formatBatchSummary(data);
191
- if (batchSummary)
192
- return batchSummary;
91
+ export function formatPresentationSummary(command, data, compiled) {
92
+ const confirmation = detectConfirmationRequired(data);
93
+ if (confirmation) {
94
+ return `Confirmation required: ${confirmation.id}`;
95
+ }
96
+ const text = firstNonemptyResult([
97
+ () => (command.command === "batch" ? formatBatchSummary(data) : undefined),
98
+ () => (isRecord(data) ? formatPageAction("summary", command, data, compiled) : undefined),
99
+ () => formatNativeCommand("summary", command, data),
100
+ ]);
101
+ if (text !== undefined) {
102
+ return text;
193
103
  }
194
104
  if (isRecord(data)) {
195
- if (compiledSemanticAction) {
196
- const semanticSummary = formatSemanticActionPresentationSummary(compiledSemanticAction, data);
197
- if (semanticSummary)
198
- return semanticSummary;
199
- }
200
- const navigationSummary = getNavigationSummary(data);
201
- if (navigationSummary && isNavigationObservableCommand(presentationCommandInfo.command, presentationCommandInfo.subcommand)) {
202
- const navigationText = formatNavigationSummary(navigationSummary);
203
- if (navigationText) {
204
- return `${presentationCommandInfo.command ?? "navigation"} → ${navigationText.split("\n", 1)[0] ?? navigationText}`;
205
- }
105
+ const fallback = formatPageFallback("summary", command, data);
106
+ if (fallback !== undefined) {
107
+ return fallback;
206
108
  }
207
109
  }
208
- const presenterSummary = commandInfo.command ? COMMAND_PRESENTERS[commandInfo.command]?.summary?.(commandInfo, data) : undefined;
209
- if (presenterSummary)
210
- return presenterSummary;
211
- if (isRecord(data)) {
212
- const diagnosticSummary = formatDiagnosticSummary(commandInfo, data);
213
- if (diagnosticSummary)
214
- return diagnosticSummary;
215
- const extractionSummary = formatExtractionSummary(commandInfo, data);
216
- if (extractionSummary)
217
- return extractionSummary;
218
- const pageSummary = getPageSummary(data);
219
- if (pageSummary)
220
- return pageSummary.split("\n", 1)[0] ?? "agent-browser result";
110
+ if (typeof data === "string" && data.length > 0) {
111
+ return data.split("\n", 1).at(0) ?? data;
221
112
  }
222
- if (typeof data === "string" && data.length > 0)
223
- return data.split("\n", 1)[0] ?? data;
224
- return `${presentationCommandInfo.command ?? commandInfo.command ?? "agent-browser"} completed`;
113
+ return `${resolvePresentationCommandInfo(command, compiled).command ?? command.command ?? "agent-browser"} completed`;
225
114
  }
226
- export function formatPresentationContentText(commandInfo, data, compiledSemanticAction) {
227
- const confirmationRequired = detectConfirmationRequired(data);
228
- if (confirmationRequired)
229
- return [
230
- formatConfirmationRequiredText(confirmationRequired),
231
- getNativeTabContinuationGuidance(commandInfo.commandTokens ?? [], data),
232
- ].filter(Boolean).join("\n\n");
233
- const presenterText = commandInfo.command ? COMMAND_PRESENTERS[commandInfo.command]?.text?.(commandInfo, data) : undefined;
234
- if (presenterText)
235
- return presenterText;
236
- if (typeof data === "string")
115
+ function formatPageResultText(command, data, compiled) {
116
+ const action = formatPageAction("text", command, data, compiled);
117
+ const text = action !== undefined && action.length > 0 ? action : formatPageFallback("text", command, data);
118
+ return (text ??
119
+ `${resolvePresentationCommandInfo(command, compiled).command ?? command.command ?? "agent-browser"} completed`);
120
+ }
121
+ function formatContentValue(data) {
122
+ if (typeof data === "string") {
237
123
  return redactModelFacingText(data);
238
- if (typeof data === "number" || typeof data === "boolean")
124
+ }
125
+ if (typeof data === "number" || typeof data === "boolean") {
239
126
  return String(data);
240
- if (!isRecord(data))
241
- return stringifyModelFacing(data);
242
- if (compiledSemanticAction) {
243
- const semanticText = formatSemanticActionPresentationText(compiledSemanticAction, data);
244
- if (semanticText)
245
- return semanticText;
246
127
  }
247
- const presentationCommandInfo = resolvePresentationCommandInfo(commandInfo, compiledSemanticAction);
248
- const navigationSummary = getNavigationSummary(data);
249
- if (navigationSummary && isNavigationObservableCommand(presentationCommandInfo.command, presentationCommandInfo.subcommand)) {
250
- const navigationText = formatNavigationSummary(navigationSummary);
251
- if (navigationText) {
252
- const actionText = formatNavigationActionResult(data);
253
- return actionText ? `${actionText}\n\nCurrent page:\n${navigationText}` : `Current page:\n${navigationText}`;
254
- }
128
+ return stringifyModelFacing(data);
129
+ }
130
+ export function formatPresentationContentText(command, data, compiled) {
131
+ const confirmation = detectConfirmationRequired(data);
132
+ if (confirmation) {
133
+ return [
134
+ formatConfirmationRequiredText(confirmation),
135
+ getNativeTabContinuationGuidance(command.commandTokens ?? [], data),
136
+ ]
137
+ .filter(Boolean)
138
+ .join("\n\n");
139
+ }
140
+ const native = formatNativeCommand("text", command, data);
141
+ if (native !== undefined && native.length > 0) {
142
+ return native;
255
143
  }
256
- const extractionText = formatExtractionText(commandInfo, data);
257
- if (extractionText)
258
- return extractionText;
259
- const diagnosticText = formatDiagnosticText(commandInfo, data);
260
- if (diagnosticText)
261
- return diagnosticText;
262
- const pageSummary = getPageSummary(data);
263
- if (pageSummary)
264
- return redactModelFacingText(pageSummary);
265
- const { navigationSummary: _navigationSummary, ...pageData } = omitUpstreamLifecycle(data);
266
- if (Object.keys(pageData).length > 0)
267
- return stringifyModelFacing(pageData);
268
- return `${presentationCommandInfo.command ?? commandInfo.command ?? "agent-browser"} completed`;
144
+ return isRecord(data) ? formatPageResultText(command, data, compiled) : formatContentValue(data);
269
145
  }
@@ -4,20 +4,25 @@ import { formatNavigationSummary, getNavigationSummary, isNavigationObservableCo
4
4
  import { getPageSummary, redactModelFacingText } from "./common.js";
5
5
  const SEMANTIC_NAVIGATION_PROBE_ACTIONS = new Set(["check", "click"]);
6
6
  const SEMANTIC_PRESENTATION_ACTIONS = new Set(["check", "click", "fill", "select"]);
7
+ function formatSemanticSelectTarget(compiled) {
8
+ const selector = compiled.selector ?? "selector";
9
+ const values = compiled.values !== undefined && compiled.values.length > 0 ? compiled.values.join(", ") : "";
10
+ return values.length > 0 ? `${selector} → ${values}` : selector;
11
+ }
7
12
  function formatSemanticActionTarget(compiled) {
8
13
  if (compiled.action === "select") {
9
- const selector = compiled.selector ?? "selector";
10
- const values = compiled.values?.length ? compiled.values.join(", ") : "";
11
- return values ? `${selector} → ${values}` : selector;
14
+ return formatSemanticSelectTarget(compiled);
12
15
  }
13
16
  const commandIndex = getCompiledSemanticActionCommandIndex(compiled);
14
- const locator = compiled.locator ?? compiled.args[commandIndex + 1] ?? "locator";
15
- const locatorValue = compiled.args[commandIndex + 2];
17
+ const locator = compiled.locator ?? compiled.args.at(commandIndex + 1) ?? "locator";
18
+ const locatorValue = compiled.args.at(commandIndex + 2);
16
19
  const nameIndex = compiled.args.indexOf("--name");
17
- const name = nameIndex >= 0 ? compiled.args[nameIndex + 1] : undefined;
20
+ const name = nameIndex >= 0 ? compiled.args.at(nameIndex + 1) : undefined;
18
21
  const quotedValue = JSON.stringify(locatorValue ?? "");
19
22
  const target = `${locator} ${quotedValue}`;
20
- return name ? `${target} (name ${JSON.stringify(name)})` : target;
23
+ return name !== undefined && name.length > 0
24
+ ? `${target} (name ${JSON.stringify(name)})`
25
+ : target;
21
26
  }
22
27
  function formatSemanticActionCompactLine(compiled) {
23
28
  const target = formatSemanticActionTarget(compiled);
@@ -30,61 +35,70 @@ function formatSemanticActionCompactLine(compiled) {
30
35
  return `Checked: ${target}`;
31
36
  case "select":
32
37
  return `Selected: ${target}`;
33
- default:
34
- return `${compiled.action}: ${target}`;
35
38
  }
36
39
  }
37
40
  function resolveSemanticPresentationCommand(compiled) {
38
- if (!compiled || !SEMANTIC_PRESENTATION_ACTIONS.has(compiled.action))
41
+ if (!compiled || !SEMANTIC_PRESENTATION_ACTIONS.has(compiled.action)) {
39
42
  return undefined;
40
- if (compiled.action === "select")
43
+ }
44
+ if (compiled.action === "select") {
41
45
  return "select";
42
- if (isCompiledSemanticActionFindCommand(compiled))
46
+ }
47
+ if (isCompiledSemanticActionFindCommand(compiled)) {
43
48
  return compiled.action;
49
+ }
44
50
  return undefined;
45
51
  }
46
52
  export function resolvePresentationCommandInfo(commandInfo, compiledSemanticAction) {
47
53
  const presentationCommand = resolveSemanticPresentationCommand(compiledSemanticAction);
48
- if (!presentationCommand)
54
+ if (presentationCommand === undefined) {
49
55
  return commandInfo;
56
+ }
50
57
  return { ...commandInfo, command: presentationCommand };
51
58
  }
52
59
  export function shouldCaptureSemanticActionNavigationSummary(compiled, data) {
53
- if (!compiled || !SEMANTIC_NAVIGATION_PROBE_ACTIONS.has(compiled.action))
60
+ if (!compiled || !SEMANTIC_NAVIGATION_PROBE_ACTIONS.has(compiled.action)) {
54
61
  return false;
55
- if (!isCompiledSemanticActionFindCommand(compiled))
62
+ }
63
+ if (!isCompiledSemanticActionFindCommand(compiled)) {
56
64
  return false;
65
+ }
57
66
  return !isRecord(data) || (typeof data.title !== "string" && typeof data.url !== "string");
58
67
  }
59
68
  export function formatSemanticActionPresentationText(compiled, data) {
60
69
  const presentationCommand = resolveSemanticPresentationCommand(compiled);
61
- if (!presentationCommand)
70
+ if (presentationCommand === undefined) {
62
71
  return undefined;
72
+ }
63
73
  const actionLine = formatSemanticActionCompactLine(compiled);
64
74
  const navigationSummary = getNavigationSummary(data);
65
75
  if (navigationSummary && isNavigationObservableCommand(presentationCommand)) {
66
76
  const navigationText = formatNavigationSummary(navigationSummary);
67
- if (navigationText)
77
+ if (navigationText !== undefined && navigationText.length > 0) {
68
78
  return `${actionLine}\n\nCurrent page:\n${navigationText}`;
79
+ }
69
80
  }
70
81
  const pageSummary = getPageSummary(data);
71
- if (pageSummary)
82
+ if (pageSummary !== undefined && pageSummary.length > 0) {
72
83
  return `${actionLine}\n\nCurrent page:\n${redactModelFacingText(pageSummary)}`;
84
+ }
73
85
  return actionLine;
74
86
  }
75
87
  export function formatSemanticActionPresentationSummary(compiled, data) {
76
88
  const presentationCommand = resolveSemanticPresentationCommand(compiled);
77
- if (!presentationCommand)
89
+ if (presentationCommand === undefined) {
78
90
  return undefined;
91
+ }
79
92
  const navigationSummary = getNavigationSummary(data);
80
93
  if (navigationSummary && isNavigationObservableCommand(presentationCommand)) {
81
94
  const navigationText = formatNavigationSummary(navigationSummary);
82
- if (navigationText) {
95
+ if (navigationText !== undefined && navigationText.length > 0) {
83
96
  return `${presentationCommand} → ${navigationText.split("\n", 1)[0] ?? navigationText}`;
84
97
  }
85
98
  }
86
99
  const pageSummary = getPageSummary(data);
87
- if (pageSummary)
100
+ if (pageSummary !== undefined && pageSummary.length > 0) {
88
101
  return `${presentationCommand} → ${pageSummary.split("\n", 1)[0] ?? pageSummary}`;
102
+ }
89
103
  return `${presentationCommand} → ${formatSemanticActionTarget(compiled)}`;
90
104
  }