pi-agent-browser-native 0.9.3 → 0.9.4

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