pi-agent-browser-native 0.9.2 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. package/CHANGELOG.md +91 -5
  2. package/README.md +120 -86
  3. package/dist/extensions/agent-browser/index.js +43065 -2016
  4. package/dist/extensions/agent-browser/lib/argv-descriptor.js +49 -26
  5. package/dist/extensions/agent-browser/lib/argv-grammar.js +82 -93
  6. package/dist/extensions/agent-browser/lib/bash-guard.js +129 -126
  7. package/dist/extensions/agent-browser/lib/batch-lifecycle.js +113 -49
  8. package/dist/extensions/agent-browser/lib/browser-execution-claim-codec.js +61 -0
  9. package/dist/extensions/agent-browser/lib/browser-execution-claim-storage.js +232 -0
  10. package/dist/extensions/agent-browser/lib/browser-execution-claims.js +202 -0
  11. package/dist/extensions/agent-browser/lib/browser-execution-identity.js +77 -0
  12. package/dist/extensions/agent-browser/lib/browser-journal-branch.js +98 -0
  13. package/dist/extensions/agent-browser/lib/browser-journal-contracts.js +1 -0
  14. package/dist/extensions/agent-browser/lib/browser-journal-projection.js +221 -0
  15. package/dist/extensions/agent-browser/lib/browser-journal-reader.js +89 -0
  16. package/dist/extensions/agent-browser/lib/browser-journal-replay.js +246 -0
  17. package/dist/extensions/agent-browser/lib/browser-journal.js +103 -394
  18. package/dist/extensions/agent-browser/lib/browser-legacy-pages.js +220 -0
  19. package/dist/extensions/agent-browser/lib/browser-legacy-projection.js +282 -0
  20. package/dist/extensions/agent-browser/lib/browser-legacy-types.js +1 -0
  21. package/dist/extensions/agent-browser/lib/browser-session-conversion-stream.js +217 -0
  22. package/dist/extensions/agent-browser/lib/browser-session-conversion.js +80 -335
  23. package/dist/extensions/agent-browser/lib/browser-transcript-contracts.js +35 -0
  24. package/dist/extensions/agent-browser/lib/browser-transcript-validation.js +166 -0
  25. package/dist/extensions/agent-browser/lib/browser-transcript.js +137 -81
  26. package/dist/extensions/agent-browser/lib/browser-value-parsing.js +15 -0
  27. package/dist/extensions/agent-browser/lib/command-capabilities.js +340 -0
  28. package/dist/extensions/agent-browser/lib/command-policy.js +107 -88
  29. package/dist/extensions/agent-browser/lib/command-taxonomy.js +49 -322
  30. package/dist/extensions/agent-browser/lib/config-policy.js +138 -343
  31. package/dist/extensions/agent-browser/lib/config-providers.js +71 -0
  32. package/dist/extensions/agent-browser/lib/config-validation.js +218 -0
  33. package/dist/extensions/agent-browser/lib/config.js +19 -7
  34. package/dist/extensions/agent-browser/lib/electron/cdp.js +15 -7
  35. package/dist/extensions/agent-browser/lib/electron/cleanup.js +134 -55
  36. package/dist/extensions/agent-browser/lib/electron/discovery-darwin.js +109 -0
  37. package/dist/extensions/agent-browser/lib/electron/discovery-desktop.js +136 -0
  38. package/dist/extensions/agent-browser/lib/electron/discovery-evidence.js +89 -0
  39. package/dist/extensions/agent-browser/lib/electron/discovery-linux.js +93 -0
  40. package/dist/extensions/agent-browser/lib/electron/discovery-packages.js +162 -0
  41. package/dist/extensions/agent-browser/lib/electron/discovery-types.js +2 -0
  42. package/dist/extensions/agent-browser/lib/electron/discovery.js +140 -549
  43. package/dist/extensions/agent-browser/lib/electron/launch-monitor.js +102 -0
  44. package/dist/extensions/agent-browser/lib/electron/launch-process.js +209 -0
  45. package/dist/extensions/agent-browser/lib/electron/launch-types.js +2 -0
  46. package/dist/extensions/agent-browser/lib/electron/launch.js +249 -354
  47. package/dist/extensions/agent-browser/lib/executable-path.js +21 -12
  48. package/dist/extensions/agent-browser/lib/execution-cwd.js +35 -18
  49. package/dist/extensions/agent-browser/lib/input-modes/electron.js +162 -121
  50. package/dist/extensions/agent-browser/lib/input-modes/job.js +116 -313
  51. package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +104 -0
  52. package/dist/extensions/agent-browser/lib/input-modes/lookup-plan.js +132 -0
  53. package/dist/extensions/agent-browser/lib/input-modes/lookup-redaction.js +57 -0
  54. package/dist/extensions/agent-browser/lib/input-modes/lookup-source-evidence.js +151 -0
  55. package/dist/extensions/agent-browser/lib/input-modes/lookup-workspace.js +142 -0
  56. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +57 -412
  57. package/dist/extensions/agent-browser/lib/input-modes/params.js +63 -17
  58. package/dist/extensions/agent-browser/lib/input-modes/qa-analysis.js +268 -0
  59. package/dist/extensions/agent-browser/lib/input-modes/qa-presentation.js +117 -0
  60. package/dist/extensions/agent-browser/lib/input-modes/script-child.js +396 -0
  61. package/dist/extensions/agent-browser/lib/input-modes/script-protocol.js +86 -0
  62. package/dist/extensions/agent-browser/lib/input-modes/script-types.js +1 -0
  63. package/dist/extensions/agent-browser/lib/input-modes/script-validation.js +60 -0
  64. package/dist/extensions/agent-browser/lib/input-modes/script.js +60 -409
  65. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +218 -128
  66. package/dist/extensions/agent-browser/lib/input-modes/shared.js +15 -4
  67. package/dist/extensions/agent-browser/lib/input-modes/types.js +56 -7
  68. package/dist/extensions/agent-browser/lib/json-schema.js +22 -10
  69. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +17 -5
  70. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +92 -425
  71. package/dist/extensions/agent-browser/lib/managed-session-posix-storage.js +58 -0
  72. package/dist/extensions/agent-browser/lib/managed-session-project-identity.js +244 -0
  73. package/dist/extensions/agent-browser/lib/managed-session-restore-context.js +84 -0
  74. package/dist/extensions/agent-browser/lib/managed-session-restore-policy.js +119 -0
  75. package/dist/extensions/agent-browser/lib/managed-session-restore-state.js +83 -0
  76. package/dist/extensions/agent-browser/lib/managed-session-restore.js +168 -300
  77. package/dist/extensions/agent-browser/lib/managed-session-snapshot-records.js +277 -0
  78. package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +128 -305
  79. package/dist/extensions/agent-browser/lib/managed-session-storage.js +56 -253
  80. package/dist/extensions/agent-browser/lib/native-confirmation.js +140 -0
  81. package/dist/extensions/agent-browser/lib/native-output.js +44 -9
  82. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +107 -66
  83. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-merge.js +14 -6
  84. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +109 -57
  85. package/dist/extensions/agent-browser/lib/orchestration/browser-run/browser-observation-result.js +82 -0
  86. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +171 -57
  87. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostic-values.js +31 -0
  88. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +152 -781
  89. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-observation.js +202 -0
  90. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-text-diagnostics.js +109 -0
  91. package/dist/extensions/agent-browser/lib/orchestration/browser-run/fill-diagnostics.js +119 -0
  92. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-action-recovery.js +147 -0
  93. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-actions.js +144 -0
  94. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-content.js +123 -0
  95. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-contracts.js +1 -0
  96. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-details.js +156 -0
  97. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-electron.js +179 -0
  98. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-evidence.js +39 -0
  99. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-missing-binary.js +89 -0
  100. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-recovery.js +97 -0
  101. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-redaction.js +106 -0
  102. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-timeout.js +110 -0
  103. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +41 -538
  104. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +204 -108
  105. package/dist/extensions/agent-browser/lib/orchestration/browser-run/interaction-diagnostics.js +290 -0
  106. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-close.js +167 -0
  107. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-inspection.js +108 -0
  108. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +127 -199
  109. package/dist/extensions/agent-browser/lib/orchestration/browser-run/native-helper-observation.js +65 -0
  110. package/dist/extensions/agent-browser/lib/orchestration/browser-run/observation-types.js +1 -0
  111. package/dist/extensions/agent-browser/lib/orchestration/browser-run/overlay-diagnostics.js +120 -0
  112. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +113 -30
  113. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +109 -28
  114. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter-data.js +150 -0
  115. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +138 -253
  116. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-rendered-text.js +147 -0
  117. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +59 -24
  118. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-artifacts.js +159 -0
  119. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-command.js +131 -0
  120. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-contracts.js +1 -0
  121. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-daemon.js +93 -0
  122. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-failure.js +42 -0
  123. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-guards.js +242 -0
  124. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-input.js +75 -0
  125. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-observations.js +92 -0
  126. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-selection.js +254 -0
  127. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-state.js +121 -0
  128. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-refs.js +130 -0
  129. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-resources.js +114 -0
  130. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-semantic.js +121 -0
  131. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-session-plan.js +222 -0
  132. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-timeouts.js +68 -0
  133. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +176 -1114
  134. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-analysis.js +191 -0
  135. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-confirmation.js +152 -0
  136. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-diagnostics.js +182 -0
  137. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-electron.js +150 -0
  138. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-contracts.js +1 -0
  139. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase-contracts.js +1 -0
  140. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase.js +115 -0
  141. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle.js +256 -0
  142. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed-contracts.js +1 -0
  143. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed.js +256 -0
  144. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase-contracts.js +1 -0
  145. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase.js +93 -0
  146. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native.js +113 -0
  147. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation-contracts.js +1 -0
  148. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation.js +316 -0
  149. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-ownership.js +28 -0
  150. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase-contracts.js +1 -0
  151. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase.js +142 -0
  152. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation-contracts.js +1 -0
  153. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation.js +333 -0
  154. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase-contracts.js +1 -0
  155. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase.js +71 -0
  156. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication.js +201 -0
  157. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-receipts.js +183 -0
  158. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-refs.js +200 -0
  159. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-tabs.js +142 -0
  160. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +18 -910
  161. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +23 -13
  162. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-receipt-reconciliation.js +198 -0
  163. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-contracts.js +1 -0
  164. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-presentation.js +154 -0
  165. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery.js +68 -151
  166. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-capture.js +14 -0
  167. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-observation.js +169 -46
  168. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-commands.js +130 -0
  169. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-electron.js +210 -0
  170. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-observations.js +61 -0
  171. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-outcomes.js +187 -0
  172. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-refs.js +171 -0
  173. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-tabs.js +228 -0
  174. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +77 -753
  175. package/dist/extensions/agent-browser/lib/orchestration/browser-run/text-visibility-diagnostics.js +182 -0
  176. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-diagnostics.js +256 -0
  177. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-progress.js +108 -0
  178. package/dist/extensions/agent-browser/lib/orchestration/code-artifact-observation.js +39 -0
  179. package/dist/extensions/agent-browser/lib/orchestration/code-image-observation.js +119 -0
  180. package/dist/extensions/agent-browser/lib/orchestration/electron-host/branch.js +92 -0
  181. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup-result.js +58 -0
  182. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup.js +78 -0
  183. package/dist/extensions/agent-browser/lib/orchestration/electron-host/contracts.js +1 -0
  184. package/dist/extensions/agent-browser/lib/orchestration/electron-host/discovery.js +106 -0
  185. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +48 -816
  186. package/dist/extensions/agent-browser/lib/orchestration/electron-host/policy.js +86 -0
  187. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-collection.js +69 -0
  188. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +167 -0
  189. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +164 -0
  190. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe.js +161 -0
  191. package/dist/extensions/agent-browser/lib/orchestration/electron-host/status.js +165 -0
  192. package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +21 -9
  193. package/dist/extensions/agent-browser/lib/orchestration/extension-artifact-preflight.js +211 -0
  194. package/dist/extensions/agent-browser/lib/orchestration/extension-artifacts.js +23 -0
  195. package/dist/extensions/agent-browser/lib/orchestration/extension-attachment-replay.js +99 -0
  196. package/dist/extensions/agent-browser/lib/orchestration/extension-branch-restore.js +275 -0
  197. package/dist/extensions/agent-browser/lib/orchestration/extension-code.js +280 -0
  198. package/dist/extensions/agent-browser/lib/orchestration/extension-command-admission.js +303 -0
  199. package/dist/extensions/agent-browser/lib/orchestration/extension-command-output.js +36 -0
  200. package/dist/extensions/agent-browser/lib/orchestration/extension-command-result.js +335 -0
  201. package/dist/extensions/agent-browser/lib/orchestration/extension-command-run.js +227 -0
  202. package/dist/extensions/agent-browser/lib/orchestration/extension-command-state.js +1 -0
  203. package/dist/extensions/agent-browser/lib/orchestration/extension-electron-ownership.js +204 -0
  204. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-locks.js +139 -0
  205. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-queue.js +24 -0
  206. package/dist/extensions/agent-browser/lib/orchestration/extension-host-coordination.js +98 -0
  207. package/dist/extensions/agent-browser/lib/orchestration/extension-host-run.js +295 -0
  208. package/dist/extensions/agent-browser/lib/orchestration/extension-intent-replay.js +41 -0
  209. package/dist/extensions/agent-browser/lib/orchestration/extension-invocation.js +7 -0
  210. package/dist/extensions/agent-browser/lib/orchestration/extension-lifecycle.js +102 -0
  211. package/dist/extensions/agent-browser/lib/orchestration/extension-managed-ownership.js +133 -0
  212. package/dist/extensions/agent-browser/lib/orchestration/extension-observation.js +120 -0
  213. package/dist/extensions/agent-browser/lib/orchestration/extension-prompt.js +180 -0
  214. package/dist/extensions/agent-browser/lib/orchestration/extension-recording.js +290 -0
  215. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-contracts.js +1 -0
  216. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-replay.js +269 -0
  217. package/dist/extensions/agent-browser/lib/orchestration/extension-result-state.js +113 -0
  218. package/dist/extensions/agent-browser/lib/orchestration/extension-runtime.js +146 -0
  219. package/dist/extensions/agent-browser/lib/orchestration/extension-script-leases.js +58 -0
  220. package/dist/extensions/agent-browser/lib/orchestration/extension-tool-boundary.js +62 -0
  221. package/dist/extensions/agent-browser/lib/orchestration/extension-version-check.js +54 -0
  222. package/dist/extensions/agent-browser/lib/orchestration/input-plan-types.js +1 -0
  223. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +261 -185
  224. package/dist/extensions/agent-browser/lib/orchestration/input-redaction.js +62 -0
  225. package/dist/extensions/agent-browser/lib/orchestration/native-config.js +144 -0
  226. package/dist/extensions/agent-browser/lib/orchestration/native-root-launch.js +77 -0
  227. package/dist/extensions/agent-browser/lib/orchestration/native-session-defaults.js +210 -139
  228. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  229. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +198 -98
  230. package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +199 -96
  231. package/dist/extensions/agent-browser/lib/owned-managed-session-context.js +55 -0
  232. package/dist/extensions/agent-browser/lib/page-target-batch.js +118 -0
  233. package/dist/extensions/agent-browser/lib/page-target-guards.js +50 -0
  234. package/dist/extensions/agent-browser/lib/page-target-navigation.js +104 -0
  235. package/dist/extensions/agent-browser/lib/page-target-validation.js +59 -243
  236. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  237. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +134 -68
  238. package/dist/extensions/agent-browser/lib/playbook.js +18 -14
  239. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  240. package/dist/extensions/agent-browser/lib/process-environment.js +22 -6
  241. package/dist/extensions/agent-browser/lib/process-errors.js +23 -0
  242. package/dist/extensions/agent-browser/lib/process-identity.js +47 -15
  243. package/dist/extensions/agent-browser/lib/process-socket-storage.js +256 -0
  244. package/dist/extensions/agent-browser/lib/process-stdout.js +74 -0
  245. package/dist/extensions/agent-browser/lib/process.js +146 -537
  246. package/dist/extensions/agent-browser/lib/prompt-artifacts.js +287 -0
  247. package/dist/extensions/agent-browser/lib/prompt-policy.js +15 -194
  248. package/dist/extensions/agent-browser/lib/read-command.js +41 -0
  249. package/dist/extensions/agent-browser/lib/read-confirmation.js +138 -35
  250. package/dist/extensions/agent-browser/lib/recording-reservations.js +118 -45
  251. package/dist/extensions/agent-browser/lib/redaction-fields.js +75 -0
  252. package/dist/extensions/agent-browser/lib/redaction-json.js +149 -0
  253. package/dist/extensions/agent-browser/lib/redaction-url.js +88 -0
  254. package/dist/extensions/agent-browser/lib/results/action-contracts.js +1 -0
  255. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +28 -271
  256. package/dist/extensions/agent-browser/lib/results/artifact-contracts.js +1 -0
  257. package/dist/extensions/agent-browser/lib/results/artifact-manifest-validation.js +133 -0
  258. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +96 -94
  259. package/dist/extensions/agent-browser/lib/results/artifact-recommendations.js +73 -0
  260. package/dist/extensions/agent-browser/lib/results/categories.js +111 -54
  261. package/dist/extensions/agent-browser/lib/results/confirmation.js +29 -10
  262. package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +62 -27
  263. package/dist/extensions/agent-browser/lib/results/electron-recommendations.js +83 -0
  264. package/dist/extensions/agent-browser/lib/results/envelope-decoding.js +48 -0
  265. package/dist/extensions/agent-browser/lib/results/envelope.js +93 -66
  266. package/dist/extensions/agent-browser/lib/results/evidence-contracts.js +1 -0
  267. package/dist/extensions/agent-browser/lib/results/failure-recommendations.js +180 -0
  268. package/dist/extensions/agent-browser/lib/results/network-routes.js +86 -45
  269. package/dist/extensions/agent-browser/lib/results/network.js +35 -12
  270. package/dist/extensions/agent-browser/lib/results/next-actions.js +49 -19
  271. package/dist/extensions/agent-browser/lib/results/presentation/artifact-files.js +320 -0
  272. package/dist/extensions/agent-browser/lib/results/presentation/artifact-format.js +138 -0
  273. package/dist/extensions/agent-browser/lib/results/presentation/artifact-images.js +113 -0
  274. package/dist/extensions/agent-browser/lib/results/presentation/artifact-verification.js +145 -0
  275. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +99 -552
  276. package/dist/extensions/agent-browser/lib/results/presentation/batch-contracts.js +1 -0
  277. package/dist/extensions/agent-browser/lib/results/presentation/batch-recording.js +118 -0
  278. package/dist/extensions/agent-browser/lib/results/presentation/batch-redaction.js +68 -0
  279. package/dist/extensions/agent-browser/lib/results/presentation/batch-rendering.js +135 -0
  280. package/dist/extensions/agent-browser/lib/results/presentation/batch-step.js +227 -0
  281. package/dist/extensions/agent-browser/lib/results/presentation/batch-summary.js +91 -0
  282. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +91 -460
  283. package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +9 -5
  284. package/dist/extensions/agent-browser/lib/results/presentation/command-presenters.js +216 -0
  285. package/dist/extensions/agent-browser/lib/results/presentation/common.js +26 -9
  286. package/dist/extensions/agent-browser/lib/results/presentation/content.js +86 -29
  287. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-a11y.js +67 -0
  288. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-health.js +79 -0
  289. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-identity.js +199 -0
  290. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-logs.js +75 -0
  291. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network-actions.js +216 -0
  292. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network.js +124 -0
  293. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-redaction.js +64 -0
  294. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-storage.js +209 -0
  295. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-stream.js +69 -0
  296. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-summary.js +222 -0
  297. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +103 -1019
  298. package/dist/extensions/agent-browser/lib/results/presentation/early-result.js +70 -0
  299. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +130 -60
  300. package/dist/extensions/agent-browser/lib/results/presentation/input-contracts.js +1 -0
  301. package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +60 -145
  302. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +147 -88
  303. package/dist/extensions/agent-browser/lib/results/presentation/notices.js +75 -0
  304. package/dist/extensions/agent-browser/lib/results/presentation/observation-contracts.js +1 -0
  305. package/dist/extensions/agent-browser/lib/results/presentation/observation-rendering.js +127 -0
  306. package/dist/extensions/agent-browser/lib/results/presentation/outcomes.js +120 -0
  307. package/dist/extensions/agent-browser/lib/results/presentation/output-completion.js +77 -0
  308. package/dist/extensions/agent-browser/lib/results/presentation/output-spill.js +51 -0
  309. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +117 -237
  310. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +35 -21
  311. package/dist/extensions/agent-browser/lib/results/presentation/skills.js +104 -73
  312. package/dist/extensions/agent-browser/lib/results/presentation/source.js +109 -0
  313. package/dist/extensions/agent-browser/lib/results/presentation.js +17 -248
  314. package/dist/extensions/agent-browser/lib/results/recommendation-contracts.js +1 -0
  315. package/dist/extensions/agent-browser/lib/results/recording.js +52 -14
  316. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +14 -5
  317. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +30 -22
  318. package/dist/extensions/agent-browser/lib/results/selector-recovery-target.js +83 -0
  319. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +123 -123
  320. package/dist/extensions/agent-browser/lib/results/snapshot-compact.js +266 -0
  321. package/dist/extensions/agent-browser/lib/results/snapshot-content.js +32 -0
  322. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +104 -71
  323. package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +31 -11
  324. package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +125 -66
  325. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +26 -7
  326. package/dist/extensions/agent-browser/lib/results/snapshot.js +28 -248
  327. package/dist/extensions/agent-browser/lib/results/text.js +16 -5
  328. package/dist/extensions/agent-browser/lib/runtime-args-validation.js +133 -0
  329. package/dist/extensions/agent-browser/lib/runtime-compatibility.js +81 -0
  330. package/dist/extensions/agent-browser/lib/runtime-contracts.js +1 -0
  331. package/dist/extensions/agent-browser/lib/runtime-redaction.js +118 -0
  332. package/dist/extensions/agent-browser/lib/runtime-replay-events.js +144 -0
  333. package/dist/extensions/agent-browser/lib/runtime-session-identity.js +76 -0
  334. package/dist/extensions/agent-browser/lib/runtime-session-plan.js +114 -0
  335. package/dist/extensions/agent-browser/lib/runtime-session-replay.js +123 -0
  336. package/dist/extensions/agent-browser/lib/runtime-tab-correction.js +65 -0
  337. package/dist/extensions/agent-browser/lib/runtime-timeouts.js +28 -0
  338. package/dist/extensions/agent-browser/lib/runtime.js +137 -1037
  339. package/dist/extensions/agent-browser/lib/session-identity.js +51 -0
  340. package/dist/extensions/agent-browser/lib/session-page-observation.js +357 -0
  341. package/dist/extensions/agent-browser/lib/session-page-state.js +188 -324
  342. package/dist/extensions/agent-browser/lib/session-page-types.js +1 -0
  343. package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +78 -0
  344. package/dist/extensions/agent-browser/lib/temp-mutation-queue.js +7 -0
  345. package/dist/extensions/agent-browser/lib/temp-root-ownership.js +234 -0
  346. package/dist/extensions/agent-browser/lib/temp-root.js +207 -0
  347. package/dist/extensions/agent-browser/lib/temp.js +33 -446
  348. package/dist/extensions/agent-browser/lib/tool-surface.js +94 -24
  349. package/dist/extensions/agent-browser/lib/upstream-version.js +3 -2
  350. package/dist/extensions/agent-browser/lib/web-search-providers.js +229 -0
  351. package/dist/extensions/agent-browser/lib/web-search-request.js +108 -0
  352. package/dist/extensions/agent-browser/lib/web-search-results.js +281 -0
  353. package/dist/extensions/agent-browser/lib/web-search-schema.js +82 -0
  354. package/dist/extensions/agent-browser/lib/web-search.js +109 -617
  355. package/dist/extensions/agent-browser/lib/webmcp-observation.js +13 -6
  356. package/dist/extensions/agent-browser/lib/windows-stock-launcher.js +63 -37
  357. package/dist/extensions/agent-browser/script-worker.js +80 -43
  358. package/dist/scripts/agent-browser-target.mjs +4 -2
  359. package/docs/ARCHITECTURE.md +22 -10
  360. package/docs/CODE_QUALITY.md +242 -0
  361. package/docs/COMMAND_REFERENCE.md +264 -229
  362. package/docs/ELECTRON.md +53 -44
  363. package/docs/RELEASE.md +21 -17
  364. package/docs/REQUIREMENTS.md +2 -0
  365. package/docs/SESSION_STORAGE.md +1 -1
  366. package/docs/SUPPORT_MATRIX.md +84 -77
  367. package/docs/TOOL_CONTRACT.md +165 -130
  368. package/docs/platform-smoke.md +5 -5
  369. package/package.json +143 -120
  370. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  371. package/scripts/agent-browser-target.mjs +6 -2
  372. package/scripts/build.mjs +37 -8
  373. package/scripts/capability-core-commands.mjs +193 -0
  374. package/scripts/capability-options.mjs +283 -0
  375. package/scripts/capability-samples.mjs +133 -0
  376. package/scripts/capability-section.mjs +11 -0
  377. package/scripts/config.mjs +213 -114
  378. package/scripts/convert-browser-session.mjs +30 -9
  379. package/scripts/doctor-sources.mjs +195 -0
  380. package/scripts/doctor.mjs +92 -247
  381. package/scripts/platform-smoke/artifacts.mjs +38 -11
  382. package/scripts/platform-smoke/commands.mjs +104 -0
  383. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  384. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  385. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  386. package/scripts/platform-smoke/doctor.mjs +212 -320
  387. package/scripts/platform-smoke/lease-evidence.mjs +134 -0
  388. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  389. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  390. package/scripts/platform-smoke/targets.mjs +158 -472
  391. package/scripts/platform-smoke.mjs +55 -40
  392. package/scripts/prepare.mjs +16 -7
@@ -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,265 +1,145 @@
1
1
  import { isRecord } from "../../parsing.js";
2
- import { detectConfirmationRequired } from "../confirmation.js";
3
- import { formatRawSnapshotText, formatSnapshotSummary } from "../snapshot.js";
4
- import { getPageSummary, omitUpstreamLifecycle, redactModelFacingText, stringifyModelFacing } from "./common.js";
5
- import { formatDiagnosticSummary, formatDiagnosticText, formatProfilesText, getStreamSummary, getTabSummary } from "./diagnostics.js";
6
- import { getScreenshotSummary } from "./artifacts.js";
7
- import { formatSkillsText } from "./skills.js";
2
+ import { getNativeTabContinuationGuidance } from "../../read-confirmation.js";
3
+ import { detectConfirmationRequired, } from "../confirmation.js";
4
+ import { getPageSummary, omitUpstreamLifecycle, redactModelFacingText, stringifyModelFacing, } from "./common.js";
5
+ import { formatDiagnosticSummary, formatDiagnosticText } from "./diagnostics.js";
8
6
  import { formatExtractionSummary, formatExtractionText, formatNavigationActionResult, formatNavigationSummary, getNavigationSummary, isNavigationObservableCommand, } from "./navigation.js";
9
7
  import { formatSemanticActionPresentationSummary, formatSemanticActionPresentationText, resolvePresentationCommandInfo, } from "./semantic-action.js";
10
- function formatConfirmationRequiredSummary(confirmation) {
11
- return `Confirmation required: ${confirmation.id}`;
12
- }
13
- const SIMPLE_ACTION_RESULTS = {
14
- check: { field: "checked", label: "Checked" },
15
- click: { field: "clicked", label: "Clicked" },
16
- fill: { field: "filled", label: "Filled" },
17
- focus: { field: "focused", label: "Focused" },
18
- hover: { field: "hovered", label: "Hovered" },
19
- press: { field: "pressed", label: "Pressed" },
20
- select: { field: "selected", label: "Selected" },
21
- type: { field: "typed", label: "Typed" },
22
- uncheck: { field: "unchecked", label: "Unchecked" },
23
- };
24
- function formatSimpleActionResult(command, data) {
25
- if (!isRecord(data))
26
- return undefined;
27
- if (command === "click" && getNavigationSummary(data))
28
- return undefined;
29
- const definition = SIMPLE_ACTION_RESULTS[command];
30
- if (!definition)
31
- return undefined;
32
- const value = data[definition.field];
33
- if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean")
34
- return undefined;
35
- 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");
36
16
  }
37
- function formatWaitResult(data) {
38
- if (!isRecord(data))
17
+ function formatBatchSummary(data) {
18
+ if (!Array.isArray(data)) {
39
19
  return undefined;
40
- if (data.waited === "timeout")
41
- return "Fixed wait elapsed; no page condition was verified.";
42
- for (const field of ["selector", "text", "url", "state", "waited"]) {
43
- const value = data[field];
44
- if (typeof value === "string" && value.length > 0)
45
- return `Wait completed: ${redactModelFacingText(value)}`;
46
20
  }
47
- return undefined;
48
- }
49
- function formatCloseResult(data) {
50
- 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`;
51
25
  }
52
- const VITALS_METRICS = ["lcp", "fcp", "ttfb", "inp", "cls"];
53
- function coerceVitalsMetricValue(value) {
54
- if (typeof value === "number" && Number.isFinite(value))
55
- return value;
56
- if (isRecord(value)) {
57
- for (const nestedKey of ["value", "duration", "startTime", "score"]) {
58
- const nestedValue = value[nestedKey];
59
- if (typeof nestedValue === "number" && Number.isFinite(nestedValue))
60
- 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;
61
31
  }
62
32
  }
63
33
  return undefined;
64
34
  }
65
- function getVitalsMetric(data, key) {
66
- const metrics = isRecord(data.metrics) ? data.metrics : undefined;
67
- return coerceVitalsMetricValue(data[key] ?? data[key.toUpperCase()] ?? metrics?.[key] ?? metrics?.[key.toUpperCase()]);
68
- }
69
- function formatVitalsMetric(key, value) {
70
- return key === "cls" ? `${key.toUpperCase()}: ${value}` : `${key.toUpperCase()}: ${Math.round(value)}ms`;
71
- }
72
- function getVitalsMetrics(data) {
73
- return VITALS_METRICS.flatMap((key) => {
74
- const value = getVitalsMetric(data, key);
75
- return value === undefined ? [] : [formatVitalsMetric(key, value)];
76
- });
77
- }
78
- function getVitalsUnavailableReason(data) {
79
- for (const key of ["reason", "message", "error", "status"]) {
80
- const value = data[key];
81
- if (typeof value === "string" && value.trim().length > 0)
82
- 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;
39
+ }
40
+ const text = formatNavigationSummary(navigation);
41
+ if (text === undefined || text.length === 0) {
42
+ return undefined;
83
43
  }
84
- return "No Core Web Vitals metric fields were present in the upstream result.";
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}`;
85
51
  }
86
- function formatVitalsText(data) {
87
- const url = typeof data.url === "string" && data.url.trim().length > 0 ? redactModelFacingText(data.url.trim()) : undefined;
88
- const metrics = getVitalsMetrics(data);
89
- const lines = [url ? `Vitals for ${url}` : "Vitals result"];
90
- if (metrics.length > 0)
91
- lines.push(...metrics.map((metric) => `- ${metric}`));
92
- else
93
- lines.push(`Metrics unavailable: ${getVitalsUnavailableReason(data)}`);
94
- 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);
95
63
  }
96
- function formatVitalsSummary(data) {
97
- const metrics = getVitalsMetrics(data);
98
- if (metrics.length > 0)
99
- return `Vitals: ${metrics.join(", ")}`;
100
- 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;
101
78
  }
102
- function formatConfirmationRequiredText(confirmation) {
103
- const lines = [
104
- "Confirmation required.",
105
- `Pending confirmation id: ${confirmation.id}`,
106
- ];
107
- if (confirmation.actionText)
108
- lines.push(`Action: ${confirmation.actionText}`);
109
- lines.push("", "Next steps:", `- Approve: { "args": ["confirm", "${confirmation.id}"] }`, `- Deny: { "args": ["deny", "${confirmation.id}"] }`);
110
- 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));
111
85
  }
112
- const COMMAND_PRESENTERS = {
113
- ...Object.fromEntries(Object.keys(SIMPLE_ACTION_RESULTS).map((command) => [command, {
114
- summary: (_commandInfo, data) => formatSimpleActionResult(command, data),
115
- text: (_commandInfo, data) => formatSimpleActionResult(command, data),
116
- }])),
117
- close: { summary: (_commandInfo, data) => formatCloseResult(data), text: (_commandInfo, data) => formatCloseResult(data) },
118
- exit: { summary: (_commandInfo, data) => formatCloseResult(data), text: (_commandInfo, data) => formatCloseResult(data) },
119
- quit: { summary: (_commandInfo, data) => formatCloseResult(data), text: (_commandInfo, data) => formatCloseResult(data) },
120
- wait: { summary: (_commandInfo, data) => formatWaitResult(data), text: (_commandInfo, data) => formatWaitResult(data) },
121
- profiles: {
122
- summary: (_commandInfo, data) => Array.isArray(data) ? `Chrome profiles: ${data.length}` : undefined,
123
- text: (_commandInfo, data) => Array.isArray(data) ? formatProfilesText(data, "Chrome profiles") : undefined,
124
- },
125
- read: {
126
- summary: (_commandInfo, data) => isRecord(data) && typeof (data.finalUrl ?? data.url) === "string" ? `Read: ${data.finalUrl ?? data.url}` : undefined,
127
- text: (_commandInfo, data) => isRecord(data) && typeof data.content === "string" ? redactModelFacingText(data.content) : undefined,
128
- },
129
- screenshot: {
130
- summary: (_commandInfo, data) => isRecord(data) && data.changed === false ? getScreenshotSummary(data) : isRecord(data) && typeof data.path === "string" ? `Screenshot saved: ${data.path}` : undefined,
131
- text: (_commandInfo, data) => isRecord(data) ? getScreenshotSummary(data) : undefined,
132
- },
133
- skills: {
134
- summary: (commandInfo, data) => {
135
- if (Array.isArray(data) && commandInfo.subcommand === "list")
136
- return `agent-browser skills: ${data.length}`;
137
- if (commandInfo.subcommand === "get")
138
- return "agent-browser skill loaded";
139
- if (commandInfo.subcommand === "path")
140
- return "agent-browser skill path";
141
- return undefined;
142
- },
143
- text: formatSkillsText,
144
- },
145
- snapshot: {
146
- summary: (_commandInfo, data) => isRecord(data) ? formatSnapshotSummary(data) : undefined,
147
- text: (_commandInfo, data) => isRecord(data) ? formatRawSnapshotText(data) : undefined,
148
- },
149
- stream: {
150
- summary: (commandInfo, data) => {
151
- if (!isRecord(data) || commandInfo.subcommand !== "status")
152
- return undefined;
153
- const port = typeof data.port === "number" ? ` on port ${data.port}` : "";
154
- return `Stream ${data.enabled === true ? "enabled" : "disabled"}${port}`;
155
- },
156
- text: (commandInfo, data) => isRecord(data) && commandInfo.subcommand === "status" ? getStreamSummary(data) : undefined,
157
- },
158
- tab: {
159
- summary: (_commandInfo, data) => isRecord(data) && Array.isArray(data.tabs)
160
- ? `Tabs: ${data.tabs.length}`
161
- : isRecord(data) && data.closed === true ? "Tab closed" : undefined,
162
- text: (_commandInfo, data) => isRecord(data) && data.closed === true
163
- ? `Tab closed${typeof data.tabId === "string" ? `: ${redactModelFacingText(data.tabId)}` : "."}`
164
- : isRecord(data) ? getTabSummary(data) : undefined,
165
- },
166
- vitals: {
167
- summary: (_commandInfo, data) => isRecord(data) ? formatVitalsSummary(data) : undefined,
168
- text: (_commandInfo, data) => isRecord(data) ? formatVitalsText(data) : undefined,
169
- },
170
- "web-vitals": {
171
- summary: (_commandInfo, data) => isRecord(data) ? formatVitalsSummary(data) : undefined,
172
- text: (_commandInfo, data) => isRecord(data) ? formatVitalsText(data) : undefined,
173
- },
174
- };
175
- function formatBatchSummary(data) {
176
- if (!Array.isArray(data))
177
- return undefined;
178
- const successCount = data.filter((item) => isRecord(item) && item.success !== false).length;
179
- return successCount === data.length
180
- ? `Batch: ${successCount}/${data.length} succeeded`
181
- : `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);
182
90
  }
183
- export function formatPresentationSummary(commandInfo, data, compiledSemanticAction) {
184
- const confirmationRequired = detectConfirmationRequired(data);
185
- if (confirmationRequired)
186
- return formatConfirmationRequiredSummary(confirmationRequired);
187
- const presentationCommandInfo = resolvePresentationCommandInfo(commandInfo, compiledSemanticAction);
188
- if (commandInfo.command === "batch") {
189
- const batchSummary = formatBatchSummary(data);
190
- if (batchSummary)
191
- 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;
192
103
  }
193
104
  if (isRecord(data)) {
194
- if (compiledSemanticAction) {
195
- const semanticSummary = formatSemanticActionPresentationSummary(compiledSemanticAction, data);
196
- if (semanticSummary)
197
- return semanticSummary;
198
- }
199
- const navigationSummary = getNavigationSummary(data);
200
- if (navigationSummary && isNavigationObservableCommand(presentationCommandInfo.command, presentationCommandInfo.subcommand)) {
201
- const navigationText = formatNavigationSummary(navigationSummary);
202
- if (navigationText) {
203
- return `${presentationCommandInfo.command ?? "navigation"} → ${navigationText.split("\n", 1)[0] ?? navigationText}`;
204
- }
105
+ const fallback = formatPageFallback("summary", command, data);
106
+ if (fallback !== undefined) {
107
+ return fallback;
205
108
  }
206
109
  }
207
- const presenterSummary = commandInfo.command ? COMMAND_PRESENTERS[commandInfo.command]?.summary?.(commandInfo, data) : undefined;
208
- if (presenterSummary)
209
- return presenterSummary;
210
- if (isRecord(data)) {
211
- const diagnosticSummary = formatDiagnosticSummary(commandInfo, data);
212
- if (diagnosticSummary)
213
- return diagnosticSummary;
214
- const extractionSummary = formatExtractionSummary(commandInfo, data);
215
- if (extractionSummary)
216
- return extractionSummary;
217
- const pageSummary = getPageSummary(data);
218
- if (pageSummary)
219
- 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;
220
112
  }
221
- if (typeof data === "string" && data.length > 0)
222
- return data.split("\n", 1)[0] ?? data;
223
- return `${presentationCommandInfo.command ?? commandInfo.command ?? "agent-browser"} completed`;
113
+ return `${resolvePresentationCommandInfo(command, compiled).command ?? command.command ?? "agent-browser"} completed`;
224
114
  }
225
- export function formatPresentationContentText(commandInfo, data, compiledSemanticAction) {
226
- const confirmationRequired = detectConfirmationRequired(data);
227
- if (confirmationRequired)
228
- return formatConfirmationRequiredText(confirmationRequired);
229
- const presenterText = commandInfo.command ? COMMAND_PRESENTERS[commandInfo.command]?.text?.(commandInfo, data) : undefined;
230
- if (presenterText)
231
- return presenterText;
232
- 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") {
233
123
  return redactModelFacingText(data);
234
- if (typeof data === "number" || typeof data === "boolean")
124
+ }
125
+ if (typeof data === "number" || typeof data === "boolean") {
235
126
  return String(data);
236
- if (!isRecord(data))
237
- return stringifyModelFacing(data);
238
- if (compiledSemanticAction) {
239
- const semanticText = formatSemanticActionPresentationText(compiledSemanticAction, data);
240
- if (semanticText)
241
- return semanticText;
242
127
  }
243
- const presentationCommandInfo = resolvePresentationCommandInfo(commandInfo, compiledSemanticAction);
244
- const navigationSummary = getNavigationSummary(data);
245
- if (navigationSummary && isNavigationObservableCommand(presentationCommandInfo.command, presentationCommandInfo.subcommand)) {
246
- const navigationText = formatNavigationSummary(navigationSummary);
247
- if (navigationText) {
248
- const actionText = formatNavigationActionResult(data);
249
- return actionText ? `${actionText}\n\nCurrent page:\n${navigationText}` : `Current page:\n${navigationText}`;
250
- }
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;
251
143
  }
252
- const extractionText = formatExtractionText(commandInfo, data);
253
- if (extractionText)
254
- return extractionText;
255
- const diagnosticText = formatDiagnosticText(commandInfo, data);
256
- if (diagnosticText)
257
- return diagnosticText;
258
- const pageSummary = getPageSummary(data);
259
- if (pageSummary)
260
- return redactModelFacingText(pageSummary);
261
- const { navigationSummary: _navigationSummary, ...pageData } = omitUpstreamLifecycle(data);
262
- if (Object.keys(pageData).length > 0)
263
- return stringifyModelFacing(pageData);
264
- return `${presentationCommandInfo.command ?? commandInfo.command ?? "agent-browser"} completed`;
144
+ return isRecord(data) ? formatPageResultText(command, data, compiled) : formatContentValue(data);
265
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
  }