pi-agent-browser-native 0.9.3 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. package/CHANGELOG.md +106 -5
  2. package/README.md +58 -791
  3. package/dist/extensions/agent-browser/index.js +43101 -2031
  4. package/dist/extensions/agent-browser/lib/argv-descriptor.js +49 -26
  5. package/dist/extensions/agent-browser/lib/argv-grammar.js +82 -93
  6. package/dist/extensions/agent-browser/lib/bash-guard.js +129 -126
  7. package/dist/extensions/agent-browser/lib/batch-lifecycle.js +112 -51
  8. package/dist/extensions/agent-browser/lib/browser-execution-claim-codec.js +61 -0
  9. package/dist/extensions/agent-browser/lib/browser-execution-claim-storage.js +232 -0
  10. package/dist/extensions/agent-browser/lib/browser-execution-claims.js +202 -0
  11. package/dist/extensions/agent-browser/lib/browser-execution-identity.js +77 -0
  12. package/dist/extensions/agent-browser/lib/browser-journal-branch.js +98 -0
  13. package/dist/extensions/agent-browser/lib/browser-journal-contracts.js +1 -0
  14. package/dist/extensions/agent-browser/lib/browser-journal-projection.js +221 -0
  15. package/dist/extensions/agent-browser/lib/browser-journal-reader.js +89 -0
  16. package/dist/extensions/agent-browser/lib/browser-journal-replay.js +246 -0
  17. package/dist/extensions/agent-browser/lib/browser-journal.js +103 -394
  18. package/dist/extensions/agent-browser/lib/browser-legacy-pages.js +220 -0
  19. package/dist/extensions/agent-browser/lib/browser-legacy-projection.js +282 -0
  20. package/dist/extensions/agent-browser/lib/browser-legacy-types.js +1 -0
  21. package/dist/extensions/agent-browser/lib/browser-session-conversion-stream.js +217 -0
  22. package/dist/extensions/agent-browser/lib/browser-session-conversion.js +80 -335
  23. package/dist/extensions/agent-browser/lib/browser-transcript-contracts.js +35 -0
  24. package/dist/extensions/agent-browser/lib/browser-transcript-validation.js +166 -0
  25. package/dist/extensions/agent-browser/lib/browser-transcript.js +137 -82
  26. package/dist/extensions/agent-browser/lib/browser-value-parsing.js +15 -0
  27. package/dist/extensions/agent-browser/lib/command-capabilities.js +340 -0
  28. package/dist/extensions/agent-browser/lib/command-policy.js +107 -88
  29. package/dist/extensions/agent-browser/lib/command-taxonomy.js +49 -322
  30. package/dist/extensions/agent-browser/lib/config-policy.js +138 -343
  31. package/dist/extensions/agent-browser/lib/config-providers.js +71 -0
  32. package/dist/extensions/agent-browser/lib/config-validation.js +231 -0
  33. package/dist/extensions/agent-browser/lib/config.js +20 -8
  34. package/dist/extensions/agent-browser/lib/electron/cdp.js +20 -8
  35. package/dist/extensions/agent-browser/lib/electron/cleanup.js +128 -83
  36. package/dist/extensions/agent-browser/lib/electron/discovery-darwin.js +109 -0
  37. package/dist/extensions/agent-browser/lib/electron/discovery-desktop.js +136 -0
  38. package/dist/extensions/agent-browser/lib/electron/discovery-evidence.js +90 -0
  39. package/dist/extensions/agent-browser/lib/electron/discovery-linux.js +93 -0
  40. package/dist/extensions/agent-browser/lib/electron/discovery-packages.js +162 -0
  41. package/dist/extensions/agent-browser/lib/electron/discovery-types.js +2 -0
  42. package/dist/extensions/agent-browser/lib/electron/discovery.js +140 -549
  43. package/dist/extensions/agent-browser/lib/electron/launch-monitor.js +102 -0
  44. package/dist/extensions/agent-browser/lib/electron/launch-process.js +209 -0
  45. package/dist/extensions/agent-browser/lib/electron/launch-types.js +2 -0
  46. package/dist/extensions/agent-browser/lib/electron/launch.js +261 -355
  47. package/dist/extensions/agent-browser/lib/executable-path.js +21 -12
  48. package/dist/extensions/agent-browser/lib/execution-cwd.js +35 -18
  49. package/dist/extensions/agent-browser/lib/fs-utils.js +1 -9
  50. package/dist/extensions/agent-browser/lib/input-modes/electron.js +162 -121
  51. package/dist/extensions/agent-browser/lib/input-modes/job.js +123 -317
  52. package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +116 -0
  53. package/dist/extensions/agent-browser/lib/input-modes/lookup-plan.js +132 -0
  54. package/dist/extensions/agent-browser/lib/input-modes/lookup-redaction.js +57 -0
  55. package/dist/extensions/agent-browser/lib/input-modes/lookup-source-evidence.js +151 -0
  56. package/dist/extensions/agent-browser/lib/input-modes/lookup-workspace.js +142 -0
  57. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +58 -412
  58. package/dist/extensions/agent-browser/lib/input-modes/params.js +86 -40
  59. package/dist/extensions/agent-browser/lib/input-modes/qa-analysis.js +268 -0
  60. package/dist/extensions/agent-browser/lib/input-modes/qa-presentation.js +117 -0
  61. package/dist/extensions/agent-browser/lib/input-modes/script-child.js +396 -0
  62. package/dist/extensions/agent-browser/lib/input-modes/script-protocol.js +86 -0
  63. package/dist/extensions/agent-browser/lib/input-modes/script-types.js +1 -0
  64. package/dist/extensions/agent-browser/lib/input-modes/script-validation.js +60 -0
  65. package/dist/extensions/agent-browser/lib/input-modes/script.js +60 -409
  66. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +218 -128
  67. package/dist/extensions/agent-browser/lib/input-modes/shared.js +15 -4
  68. package/dist/extensions/agent-browser/lib/input-modes/types.js +56 -7
  69. package/dist/extensions/agent-browser/lib/json-schema.js +22 -10
  70. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +17 -5
  71. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +92 -425
  72. package/dist/extensions/agent-browser/lib/managed-session-posix-storage.js +58 -0
  73. package/dist/extensions/agent-browser/lib/managed-session-project-identity.js +244 -0
  74. package/dist/extensions/agent-browser/lib/managed-session-restore-context.js +84 -0
  75. package/dist/extensions/agent-browser/lib/managed-session-restore-policy.js +119 -0
  76. package/dist/extensions/agent-browser/lib/managed-session-restore-state.js +83 -0
  77. package/dist/extensions/agent-browser/lib/managed-session-restore.js +168 -300
  78. package/dist/extensions/agent-browser/lib/managed-session-snapshot-records.js +277 -0
  79. package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +128 -305
  80. package/dist/extensions/agent-browser/lib/managed-session-storage.js +56 -253
  81. package/dist/extensions/agent-browser/lib/native-confirmation.js +140 -0
  82. package/dist/extensions/agent-browser/lib/native-output.js +43 -9
  83. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +106 -59
  84. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-merge.js +14 -6
  85. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +109 -57
  86. package/dist/extensions/agent-browser/lib/orchestration/browser-run/browser-observation-result.js +82 -0
  87. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +164 -60
  88. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostic-values.js +31 -0
  89. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +152 -781
  90. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-observation.js +203 -0
  91. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-text-diagnostics.js +109 -0
  92. package/dist/extensions/agent-browser/lib/orchestration/browser-run/fill-diagnostics.js +119 -0
  93. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-action-recovery.js +147 -0
  94. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-actions.js +144 -0
  95. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-content.js +123 -0
  96. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-contracts.js +1 -0
  97. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-details.js +156 -0
  98. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-electron.js +187 -0
  99. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-evidence.js +39 -0
  100. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-missing-binary.js +89 -0
  101. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-recovery.js +97 -0
  102. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-redaction.js +106 -0
  103. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-timeout.js +110 -0
  104. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +41 -538
  105. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +199 -154
  106. package/dist/extensions/agent-browser/lib/orchestration/browser-run/interaction-diagnostics.js +290 -0
  107. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-close.js +167 -0
  108. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-inspection.js +108 -0
  109. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +127 -205
  110. package/dist/extensions/agent-browser/lib/orchestration/browser-run/native-helper-observation.js +65 -0
  111. package/dist/extensions/agent-browser/lib/orchestration/browser-run/observation-types.js +1 -0
  112. package/dist/extensions/agent-browser/lib/orchestration/browser-run/overlay-diagnostics.js +120 -0
  113. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +113 -30
  114. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +109 -28
  115. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter-data.js +150 -0
  116. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +147 -253
  117. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-rendered-text.js +147 -0
  118. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +59 -24
  119. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-artifacts.js +159 -0
  120. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-command.js +131 -0
  121. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-contracts.js +1 -0
  122. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-daemon.js +93 -0
  123. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-failure.js +42 -0
  124. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-guards.js +242 -0
  125. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-input.js +75 -0
  126. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-observations.js +92 -0
  127. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-selection.js +254 -0
  128. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-state.js +121 -0
  129. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-refs.js +130 -0
  130. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-resources.js +114 -0
  131. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-semantic.js +121 -0
  132. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-session-plan.js +222 -0
  133. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-timeouts.js +68 -0
  134. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +176 -1123
  135. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-analysis.js +191 -0
  136. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-confirmation.js +152 -0
  137. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-diagnostics.js +182 -0
  138. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-electron.js +150 -0
  139. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-contracts.js +1 -0
  140. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase-contracts.js +1 -0
  141. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase.js +115 -0
  142. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle.js +256 -0
  143. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed-contracts.js +1 -0
  144. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed.js +256 -0
  145. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase-contracts.js +1 -0
  146. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase.js +93 -0
  147. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native.js +113 -0
  148. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation-contracts.js +1 -0
  149. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation.js +316 -0
  150. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-ownership.js +28 -0
  151. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase-contracts.js +1 -0
  152. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase.js +142 -0
  153. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation-contracts.js +1 -0
  154. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation.js +333 -0
  155. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase-contracts.js +1 -0
  156. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase.js +71 -0
  157. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication.js +201 -0
  158. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-receipts.js +183 -0
  159. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-refs.js +200 -0
  160. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-tabs.js +142 -0
  161. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +18 -968
  162. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +23 -13
  163. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-receipt-reconciliation.js +198 -0
  164. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-contracts.js +1 -0
  165. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-presentation.js +154 -0
  166. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery.js +68 -151
  167. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-capture.js +14 -0
  168. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-observation.js +169 -46
  169. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-commands.js +130 -0
  170. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-electron.js +212 -0
  171. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-observations.js +61 -0
  172. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-outcomes.js +187 -0
  173. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-refs.js +169 -0
  174. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-tabs.js +228 -0
  175. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +77 -765
  176. package/dist/extensions/agent-browser/lib/orchestration/browser-run/text-visibility-diagnostics.js +182 -0
  177. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-diagnostics.js +256 -0
  178. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-progress.js +108 -0
  179. package/dist/extensions/agent-browser/lib/orchestration/code-artifact-observation.js +39 -0
  180. package/dist/extensions/agent-browser/lib/orchestration/code-image-observation.js +119 -0
  181. package/dist/extensions/agent-browser/lib/orchestration/electron-host/branch.js +93 -0
  182. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup-result.js +58 -0
  183. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup.js +78 -0
  184. package/dist/extensions/agent-browser/lib/orchestration/electron-host/contracts.js +1 -0
  185. package/dist/extensions/agent-browser/lib/orchestration/electron-host/discovery.js +106 -0
  186. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +48 -821
  187. package/dist/extensions/agent-browser/lib/orchestration/electron-host/policy.js +86 -0
  188. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-collection.js +68 -0
  189. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +169 -0
  190. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +182 -0
  191. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe.js +161 -0
  192. package/dist/extensions/agent-browser/lib/orchestration/electron-host/status.js +167 -0
  193. package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +22 -10
  194. package/dist/extensions/agent-browser/lib/orchestration/extension-artifact-preflight.js +211 -0
  195. package/dist/extensions/agent-browser/lib/orchestration/extension-artifacts.js +23 -0
  196. package/dist/extensions/agent-browser/lib/orchestration/extension-attachment-replay.js +99 -0
  197. package/dist/extensions/agent-browser/lib/orchestration/extension-branch-restore.js +275 -0
  198. package/dist/extensions/agent-browser/lib/orchestration/extension-code.js +280 -0
  199. package/dist/extensions/agent-browser/lib/orchestration/extension-command-admission.js +303 -0
  200. package/dist/extensions/agent-browser/lib/orchestration/extension-command-output.js +36 -0
  201. package/dist/extensions/agent-browser/lib/orchestration/extension-command-result.js +335 -0
  202. package/dist/extensions/agent-browser/lib/orchestration/extension-command-run.js +227 -0
  203. package/dist/extensions/agent-browser/lib/orchestration/extension-command-state.js +1 -0
  204. package/dist/extensions/agent-browser/lib/orchestration/extension-electron-ownership.js +204 -0
  205. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-locks.js +139 -0
  206. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-queue.js +24 -0
  207. package/dist/extensions/agent-browser/lib/orchestration/extension-host-coordination.js +98 -0
  208. package/dist/extensions/agent-browser/lib/orchestration/extension-host-run.js +295 -0
  209. package/dist/extensions/agent-browser/lib/orchestration/extension-intent-replay.js +41 -0
  210. package/dist/extensions/agent-browser/lib/orchestration/extension-invocation.js +7 -0
  211. package/dist/extensions/agent-browser/lib/orchestration/extension-lifecycle.js +102 -0
  212. package/dist/extensions/agent-browser/lib/orchestration/extension-managed-ownership.js +133 -0
  213. package/dist/extensions/agent-browser/lib/orchestration/extension-observation.js +120 -0
  214. package/dist/extensions/agent-browser/lib/orchestration/extension-prompt.js +180 -0
  215. package/dist/extensions/agent-browser/lib/orchestration/extension-recording.js +290 -0
  216. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-contracts.js +1 -0
  217. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-replay.js +269 -0
  218. package/dist/extensions/agent-browser/lib/orchestration/extension-result-state.js +113 -0
  219. package/dist/extensions/agent-browser/lib/orchestration/extension-runtime.js +146 -0
  220. package/dist/extensions/agent-browser/lib/orchestration/extension-script-leases.js +58 -0
  221. package/dist/extensions/agent-browser/lib/orchestration/extension-tool-boundary.js +62 -0
  222. package/dist/extensions/agent-browser/lib/orchestration/extension-version-check.js +54 -0
  223. package/dist/extensions/agent-browser/lib/orchestration/input-plan-types.js +1 -0
  224. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +261 -185
  225. package/dist/extensions/agent-browser/lib/orchestration/input-redaction.js +62 -0
  226. package/dist/extensions/agent-browser/lib/orchestration/native-config.js +144 -0
  227. package/dist/extensions/agent-browser/lib/orchestration/native-root-launch.js +77 -0
  228. package/dist/extensions/agent-browser/lib/orchestration/native-session-defaults.js +210 -157
  229. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  230. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +197 -99
  231. package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +199 -96
  232. package/dist/extensions/agent-browser/lib/owned-managed-session-context.js +55 -0
  233. package/dist/extensions/agent-browser/lib/page-target-batch.js +118 -0
  234. package/dist/extensions/agent-browser/lib/page-target-guards.js +50 -0
  235. package/dist/extensions/agent-browser/lib/page-target-navigation.js +104 -0
  236. package/dist/extensions/agent-browser/lib/page-target-validation.js +55 -246
  237. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  238. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +133 -68
  239. package/dist/extensions/agent-browser/lib/playbook.js +16 -12
  240. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  241. package/dist/extensions/agent-browser/lib/process-environment.js +13 -6
  242. package/dist/extensions/agent-browser/lib/process-errors.js +23 -0
  243. package/dist/extensions/agent-browser/lib/process-identity.js +47 -15
  244. package/dist/extensions/agent-browser/lib/process-socket-storage.js +256 -0
  245. package/dist/extensions/agent-browser/lib/process-stdout.js +74 -0
  246. package/dist/extensions/agent-browser/lib/process.js +145 -536
  247. package/dist/extensions/agent-browser/lib/prompt-artifacts.js +287 -0
  248. package/dist/extensions/agent-browser/lib/prompt-policy.js +15 -194
  249. package/dist/extensions/agent-browser/lib/read-command.js +41 -0
  250. package/dist/extensions/agent-browser/lib/read-confirmation.js +131 -68
  251. package/dist/extensions/agent-browser/lib/recording-reservations.js +118 -45
  252. package/dist/extensions/agent-browser/lib/redaction-fields.js +75 -0
  253. package/dist/extensions/agent-browser/lib/redaction-json.js +149 -0
  254. package/dist/extensions/agent-browser/lib/redaction-url.js +88 -0
  255. package/dist/extensions/agent-browser/lib/results/action-contracts.js +1 -0
  256. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +28 -271
  257. package/dist/extensions/agent-browser/lib/results/artifact-contracts.js +1 -0
  258. package/dist/extensions/agent-browser/lib/results/artifact-manifest-validation.js +133 -0
  259. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +96 -94
  260. package/dist/extensions/agent-browser/lib/results/artifact-recommendations.js +73 -0
  261. package/dist/extensions/agent-browser/lib/results/categories.js +111 -54
  262. package/dist/extensions/agent-browser/lib/results/confirmation.js +29 -13
  263. package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +62 -27
  264. package/dist/extensions/agent-browser/lib/results/electron-recommendations.js +83 -0
  265. package/dist/extensions/agent-browser/lib/results/envelope-decoding.js +48 -0
  266. package/dist/extensions/agent-browser/lib/results/envelope.js +90 -67
  267. package/dist/extensions/agent-browser/lib/results/evidence-contracts.js +1 -0
  268. package/dist/extensions/agent-browser/lib/results/failure-recommendations.js +180 -0
  269. package/dist/extensions/agent-browser/lib/results/network-routes.js +86 -45
  270. package/dist/extensions/agent-browser/lib/results/network.js +35 -12
  271. package/dist/extensions/agent-browser/lib/results/next-actions.js +49 -19
  272. package/dist/extensions/agent-browser/lib/results/presentation/artifact-files.js +320 -0
  273. package/dist/extensions/agent-browser/lib/results/presentation/artifact-format.js +138 -0
  274. package/dist/extensions/agent-browser/lib/results/presentation/artifact-images.js +113 -0
  275. package/dist/extensions/agent-browser/lib/results/presentation/artifact-verification.js +145 -0
  276. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +99 -555
  277. package/dist/extensions/agent-browser/lib/results/presentation/batch-contracts.js +1 -0
  278. package/dist/extensions/agent-browser/lib/results/presentation/batch-recording.js +118 -0
  279. package/dist/extensions/agent-browser/lib/results/presentation/batch-redaction.js +68 -0
  280. package/dist/extensions/agent-browser/lib/results/presentation/batch-rendering.js +135 -0
  281. package/dist/extensions/agent-browser/lib/results/presentation/batch-step.js +227 -0
  282. package/dist/extensions/agent-browser/lib/results/presentation/batch-summary.js +91 -0
  283. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +91 -460
  284. package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +9 -5
  285. package/dist/extensions/agent-browser/lib/results/presentation/command-presenters.js +216 -0
  286. package/dist/extensions/agent-browser/lib/results/presentation/common.js +26 -9
  287. package/dist/extensions/agent-browser/lib/results/presentation/content.js +86 -29
  288. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-a11y.js +67 -0
  289. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-health.js +79 -0
  290. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-identity.js +199 -0
  291. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-logs.js +75 -0
  292. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network-actions.js +216 -0
  293. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network.js +124 -0
  294. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-redaction.js +64 -0
  295. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-storage.js +209 -0
  296. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-stream.js +69 -0
  297. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-summary.js +222 -0
  298. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +103 -1052
  299. package/dist/extensions/agent-browser/lib/results/presentation/early-result.js +70 -0
  300. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +130 -60
  301. package/dist/extensions/agent-browser/lib/results/presentation/input-contracts.js +1 -0
  302. package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +60 -145
  303. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +147 -88
  304. package/dist/extensions/agent-browser/lib/results/presentation/notices.js +75 -0
  305. package/dist/extensions/agent-browser/lib/results/presentation/observation-contracts.js +1 -0
  306. package/dist/extensions/agent-browser/lib/results/presentation/observation-rendering.js +127 -0
  307. package/dist/extensions/agent-browser/lib/results/presentation/outcomes.js +120 -0
  308. package/dist/extensions/agent-browser/lib/results/presentation/output-completion.js +77 -0
  309. package/dist/extensions/agent-browser/lib/results/presentation/output-spill.js +51 -0
  310. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +116 -240
  311. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +35 -21
  312. package/dist/extensions/agent-browser/lib/results/presentation/skills.js +109 -73
  313. package/dist/extensions/agent-browser/lib/results/presentation/source.js +109 -0
  314. package/dist/extensions/agent-browser/lib/results/presentation.js +17 -261
  315. package/dist/extensions/agent-browser/lib/results/recommendation-contracts.js +1 -0
  316. package/dist/extensions/agent-browser/lib/results/recording.js +52 -14
  317. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +14 -5
  318. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +30 -22
  319. package/dist/extensions/agent-browser/lib/results/selector-recovery-target.js +83 -0
  320. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +119 -119
  321. package/dist/extensions/agent-browser/lib/results/snapshot-compact.js +266 -0
  322. package/dist/extensions/agent-browser/lib/results/snapshot-content.js +32 -0
  323. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +104 -71
  324. package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +31 -11
  325. package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +125 -66
  326. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +26 -7
  327. package/dist/extensions/agent-browser/lib/results/snapshot.js +28 -248
  328. package/dist/extensions/agent-browser/lib/results/text.js +16 -5
  329. package/dist/extensions/agent-browser/lib/runtime-args-validation.js +133 -0
  330. package/dist/extensions/agent-browser/lib/runtime-compatibility.js +81 -0
  331. package/dist/extensions/agent-browser/lib/runtime-contracts.js +1 -0
  332. package/dist/extensions/agent-browser/lib/runtime-redaction.js +118 -0
  333. package/dist/extensions/agent-browser/lib/runtime-replay-events.js +144 -0
  334. package/dist/extensions/agent-browser/lib/runtime-session-identity.js +76 -0
  335. package/dist/extensions/agent-browser/lib/runtime-session-plan.js +114 -0
  336. package/dist/extensions/agent-browser/lib/runtime-session-replay.js +123 -0
  337. package/dist/extensions/agent-browser/lib/runtime-tab-correction.js +65 -0
  338. package/dist/extensions/agent-browser/lib/runtime-timeouts.js +28 -0
  339. package/dist/extensions/agent-browser/lib/runtime.js +137 -1041
  340. package/dist/extensions/agent-browser/lib/session-identity.js +51 -0
  341. package/dist/extensions/agent-browser/lib/session-page-observation.js +357 -0
  342. package/dist/extensions/agent-browser/lib/session-page-state.js +178 -333
  343. package/dist/extensions/agent-browser/lib/session-page-types.js +1 -0
  344. package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +81 -0
  345. package/dist/extensions/agent-browser/lib/temp-mutation-queue.js +7 -0
  346. package/dist/extensions/agent-browser/lib/temp-root-ownership.js +234 -0
  347. package/dist/extensions/agent-browser/lib/temp-root.js +211 -0
  348. package/dist/extensions/agent-browser/lib/temp.js +33 -446
  349. package/dist/extensions/agent-browser/lib/tool-surface.js +94 -24
  350. package/dist/extensions/agent-browser/lib/upstream-version.js +3 -2
  351. package/dist/extensions/agent-browser/lib/web-search-providers.js +193 -0
  352. package/dist/extensions/agent-browser/lib/web-search-request.js +102 -0
  353. package/dist/extensions/agent-browser/lib/web-search-results.js +281 -0
  354. package/dist/extensions/agent-browser/lib/web-search-schema.js +82 -0
  355. package/dist/extensions/agent-browser/lib/web-search.js +124 -614
  356. package/dist/extensions/agent-browser/lib/webmcp-observation.js +13 -6
  357. package/dist/extensions/agent-browser/lib/windows-stock-launcher.js +63 -37
  358. package/dist/extensions/agent-browser/script-worker.js +80 -43
  359. package/dist/scripts/agent-browser-target.mjs +4 -2
  360. package/docs/ARCHITECTURE.md +19 -6
  361. package/docs/CODE_QUALITY.md +267 -0
  362. package/docs/COMMAND_REFERENCE.md +272 -241
  363. package/docs/ELECTRON.md +77 -46
  364. package/docs/REFERENCE.md +869 -0
  365. package/docs/RELEASE.md +25 -22
  366. package/docs/REQUIREMENTS.md +2 -1
  367. package/docs/SUPPORT_MATRIX.md +81 -79
  368. package/docs/TOOL_CONTRACT.md +158 -125
  369. package/docs/platform-smoke.md +8 -8
  370. package/package.json +144 -120
  371. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  372. package/scripts/agent-browser-target.mjs +6 -2
  373. package/scripts/build.mjs +37 -8
  374. package/scripts/capability-core-commands.mjs +193 -0
  375. package/scripts/capability-options.mjs +283 -0
  376. package/scripts/capability-samples.mjs +133 -0
  377. package/scripts/capability-section.mjs +11 -0
  378. package/scripts/config.mjs +235 -132
  379. package/scripts/convert-browser-session.mjs +30 -9
  380. package/scripts/doctor-sources.mjs +195 -0
  381. package/scripts/doctor.mjs +94 -249
  382. package/scripts/platform-smoke/artifacts.mjs +38 -11
  383. package/scripts/platform-smoke/commands.mjs +104 -0
  384. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  385. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  386. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  387. package/scripts/platform-smoke/doctor.mjs +212 -320
  388. package/scripts/platform-smoke/lease-evidence.mjs +132 -0
  389. package/scripts/platform-smoke/linux-image/Dockerfile +8 -2
  390. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  391. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  392. package/scripts/platform-smoke/targets.mjs +154 -472
  393. package/scripts/platform-smoke.mjs +55 -40
  394. package/scripts/prepare.mjs +16 -7
@@ -0,0 +1,266 @@
1
+ import { getSnapshotOrigin, getSnapshotText } from "./snapshot-content.js";
2
+ import { isHighValueControlEntry, selectHighValueControlEntries, } from "./snapshot-high-value-controls.js";
3
+ import { enrichSnapshotRefEntries, getSnapshotRefEntries, } from "./snapshot-refs.js";
4
+ import { buildFallbackSnapshotOutline, buildRefLineOrderMap, buildSegmentPreview, buildSnapshotSegments, canUseStructuredSnapshotPreview, chooseAdditionalSegments, choosePrimarySegment, getMeaningfulSegmentLines, getSnapshotRolePriority, isChromeSectionName, isNoiseName, parseSnapshotLines, } from "./snapshot-segments.js";
5
+ import { compareRefIds, countLines, truncateText } from "./text.js";
6
+ const PRIMARY_PREVIEW_LINES = 8;
7
+ const SECTION_PREVIEW_LINES = 2;
8
+ const KEY_REF_MAX_LINES = 8;
9
+ const OTHER_REF_MAX_LINES = 4;
10
+ const HIGH_VALUE_REF_MAX_LINES = 10;
11
+ function getSnapshotRoleCounts(entries) {
12
+ const counts = {};
13
+ for (const entry of entries) {
14
+ counts[entry.role] = (counts[entry.role] ?? 0) + 1;
15
+ }
16
+ return counts;
17
+ }
18
+ function formatRoleCounts(counts) {
19
+ const entries = Object.entries(counts);
20
+ if (entries.length === 0) {
21
+ return undefined;
22
+ }
23
+ const ordered = entries.sort((left, right) => right[1] !== left[1]
24
+ ? right[1] - left[1]
25
+ : getSnapshotRolePriority(left[0]) - getSnapshotRolePriority(right[0]));
26
+ const visible = ordered.slice(0, 4).map(([role, count]) => `${role} ${count}`);
27
+ const omitted = Math.max(0, ordered.length - visible.length);
28
+ if (omitted > 0) {
29
+ visible.push(`+${omitted} more`);
30
+ }
31
+ return visible.join(", ");
32
+ }
33
+ function rankRefEntries(entries, preview, focus, lines) {
34
+ const previewIds = new Set(preview);
35
+ const focusIds = new Set(focus);
36
+ const order = buildRefLineOrderMap(lines);
37
+ const refBucket = (id) => {
38
+ if (previewIds.has(id)) {
39
+ return 0;
40
+ }
41
+ return focusIds.has(id) ? 1 : 2;
42
+ };
43
+ return [...entries].sort((left, right) => {
44
+ const bucketDifference = refBucket(left.id) - refBucket(right.id);
45
+ if (bucketDifference !== 0) {
46
+ return bucketDifference;
47
+ }
48
+ const roleDifference = getSnapshotRolePriority(left.role) - getSnapshotRolePriority(right.role);
49
+ if (roleDifference !== 0) {
50
+ return roleDifference;
51
+ }
52
+ const nameDifference = Number(left.name.length === 0) - Number(right.name.length === 0);
53
+ if (nameDifference !== 0) {
54
+ return nameDifference;
55
+ }
56
+ const lineDifference = (order.get(left.id) ?? Number.MAX_SAFE_INTEGER) -
57
+ (order.get(right.id) ?? Number.MAX_SAFE_INTEGER);
58
+ return lineDifference !== 0 ? lineDifference : compareRefIds(left.id, right.id);
59
+ });
60
+ }
61
+ function getFallbackPreview(lines, structured, primary) {
62
+ return !structured || !primary || primary.lines.length === 0
63
+ ? buildFallbackSnapshotOutline(lines)
64
+ : undefined;
65
+ }
66
+ function buildPagePreview(lines, entries) {
67
+ const useStructured = canUseStructuredSnapshotPreview(lines, entries);
68
+ const segments = useStructured ? buildSnapshotSegments(lines) : [];
69
+ const primarySegment = useStructured ? choosePrimarySegment(segments) : undefined;
70
+ const additionalSegments = useStructured
71
+ ? chooseAdditionalSegments(segments, primarySegment)
72
+ : [];
73
+ const additionalSegmentCount = primarySegment ? Math.max(0, segments.length - 1) : 0;
74
+ const primaryPreview = primarySegment
75
+ ? buildSegmentPreview(primarySegment, PRIMARY_PREVIEW_LINES)
76
+ : undefined;
77
+ return {
78
+ useStructured,
79
+ primarySegment,
80
+ primaryPreview,
81
+ additionalSegments,
82
+ additionalPreviews: additionalSegments
83
+ .map((segment) => ({ segment, preview: buildSegmentPreview(segment, SECTION_PREVIEW_LINES) }))
84
+ .filter(({ preview }) => preview.lines.length > 0),
85
+ fallbackPreview: getFallbackPreview(lines, useStructured, primaryPreview),
86
+ omittedAdditionalSectionCount: Math.max(0, additionalSegmentCount - additionalSegments.length),
87
+ };
88
+ }
89
+ function getPreviewRefIds(page) {
90
+ return [
91
+ ...new Set([
92
+ ...(page.primaryPreview?.refIds ?? []),
93
+ ...page.additionalPreviews.flatMap(({ preview }) => preview.refIds),
94
+ ...(page.fallbackPreview?.refIds ?? []),
95
+ ]),
96
+ ];
97
+ }
98
+ function getFocusRefIds(page) {
99
+ const primary = page.useStructured && page.primarySegment ? getMeaningfulSegmentLines(page.primarySegment) : [];
100
+ const additional = page.useStructured
101
+ ? page.additionalSegments.flatMap(getMeaningfulSegmentLines)
102
+ : [];
103
+ return [
104
+ ...new Set([...primary, ...additional]
105
+ .flatMap((line) => (line.ref !== undefined && line.ref.length > 0 ? [line.ref] : []))
106
+ .concat(page.fallbackPreview?.refIds ?? [])),
107
+ ];
108
+ }
109
+ function selectCompactRefs(entries) {
110
+ const visible = entries.filter((entry) => !isNoiseName(entry.name) &&
111
+ !isChromeSectionName(entry.name) &&
112
+ !(entry.role === "heading" && entry.name.length <= 2));
113
+ const key = visible.slice(0, KEY_REF_MAX_LINES);
114
+ const keyIds = new Set(key.map((entry) => entry.id));
115
+ const other = visible.filter((entry) => !keyIds.has(entry.id)).slice(0, OTHER_REF_MAX_LINES);
116
+ const displayedIds = new Set([...key, ...other].map((entry) => entry.id));
117
+ const omitted = visible.filter((entry) => !displayedIds.has(entry.id));
118
+ const highValueCandidates = omitted.filter((entry) => isHighValueControlEntry(entry) &&
119
+ !isNoiseName(entry.name) &&
120
+ !isChromeSectionName(entry.name));
121
+ const highValue = selectHighValueControlEntries(highValueCandidates, HIGH_VALUE_REF_MAX_LINES);
122
+ return {
123
+ key,
124
+ other,
125
+ highValue,
126
+ omittedHighValueControls: Math.max(0, highValueCandidates.length - highValue.length),
127
+ omittedNonHighlightedRefs: Math.max(0, omitted.length - highValueCandidates.length),
128
+ };
129
+ }
130
+ function formatCompactRef(entry) {
131
+ const suffix = entry.name.length > 0 ? ` "${truncateText(entry.name, 96)}"` : "";
132
+ return `- ${entry.id} ${entry.role}${suffix}`;
133
+ }
134
+ function formatAdditionalPreviews(page) {
135
+ if (page.additionalPreviews.length === 0) {
136
+ return [];
137
+ }
138
+ const lines = ["", "Additional sections:"];
139
+ page.additionalPreviews.forEach(({ preview }, index) => {
140
+ if (index > 0) {
141
+ lines.push("");
142
+ }
143
+ lines.push(...preview.lines);
144
+ if (preview.omittedCount > 0) {
145
+ lines.push(`- ... (${preview.omittedCount} more lines in this section)`);
146
+ }
147
+ });
148
+ if (page.omittedAdditionalSectionCount > 0) {
149
+ lines.push(`- ... (${page.omittedAdditionalSectionCount} more sections omitted)`);
150
+ }
151
+ return lines;
152
+ }
153
+ function formatFallbackPreview(preview, fullOutputPath) {
154
+ const lines = [
155
+ "",
156
+ "Compact outline:",
157
+ ...(preview.lines.length > 0 ? preview.lines : ["(no interactive elements)"]),
158
+ ];
159
+ if (preview.omittedCount > 0) {
160
+ const source = fullOutputPath !== undefined && fullOutputPath.length > 0
161
+ ? `full output path: ${fullOutputPath}`
162
+ : "the full redacted snapshot was omitted";
163
+ lines.push(`- ... (${preview.omittedCount} additional snapshot lines omitted; ${source})`);
164
+ }
165
+ return lines;
166
+ }
167
+ function formatPagePreview(page, fullOutputPath) {
168
+ if (page.fallbackPreview) {
169
+ return formatFallbackPreview(page.fallbackPreview, fullOutputPath);
170
+ }
171
+ const lines = [
172
+ "",
173
+ "Primary content:",
174
+ ...(page.primaryPreview?.lines ?? ["(no interactive elements)"]),
175
+ ];
176
+ if ((page.primaryPreview?.omittedCount ?? 0) > 0) {
177
+ lines.push(`- ... (${page.primaryPreview?.omittedCount ?? "undefined"} more lines in this section)`);
178
+ }
179
+ return [...lines, ...formatAdditionalPreviews(page)];
180
+ }
181
+ function formatRefSelection(selection) {
182
+ const lines = [
183
+ "",
184
+ "Key refs:",
185
+ ...(selection.key.length > 0 ? selection.key.map(formatCompactRef) : ["(no refs)"]),
186
+ ];
187
+ if (selection.other.length > 0) {
188
+ lines.push("", "Other refs:", ...selection.other.map(formatCompactRef));
189
+ }
190
+ if (selection.omittedNonHighlightedRefs > 0) {
191
+ lines.push(`- ... (${selection.omittedNonHighlightedRefs} additional refs omitted)`);
192
+ }
193
+ if (selection.highValue.length > 0) {
194
+ lines.push("", "Omitted high-value controls:", ...selection.highValue.map(formatCompactRef));
195
+ if (selection.omittedHighValueControls > 0) {
196
+ lines.push(`- ... (${selection.omittedHighValueControls} additional high-value controls omitted)`);
197
+ }
198
+ }
199
+ return lines;
200
+ }
201
+ function getPreviewSections(page) {
202
+ const primary = page.primarySegment
203
+ ? [
204
+ {
205
+ linesShown: page.primaryPreview?.lines.length ?? 0,
206
+ omittedLines: page.primaryPreview?.omittedCount ?? 0,
207
+ role: page.primarySegment.root.role,
208
+ title: page.primarySegment.root.name,
209
+ },
210
+ ]
211
+ : [];
212
+ return [
213
+ ...primary,
214
+ ...page.additionalPreviews.map(({ preview, segment }) => ({
215
+ linesShown: preview.lines.length,
216
+ omittedLines: preview.omittedCount,
217
+ role: segment.root.role,
218
+ title: segment.root.name,
219
+ })),
220
+ ];
221
+ }
222
+ export function buildCompactSnapshotView(data, fullOutputPath, spillErrorText) {
223
+ const snapshot = getSnapshotText(data) ?? "(no interactive elements)";
224
+ const snapshotLines = parseSnapshotLines(snapshot);
225
+ const refEntries = enrichSnapshotRefEntries(getSnapshotRefEntries(data), snapshotLines);
226
+ const roleCounts = getSnapshotRoleCounts(refEntries);
227
+ const roleCountsText = formatRoleCounts(roleCounts);
228
+ const page = buildPagePreview(snapshotLines, refEntries);
229
+ const previewRefIds = getPreviewRefIds(page);
230
+ const ranked = rankRefEntries(refEntries, previewRefIds, getFocusRefIds(page), page.useStructured ? snapshotLines : []);
231
+ const refs = selectCompactRefs(ranked);
232
+ const origin = getSnapshotOrigin(data);
233
+ const lines = [
234
+ `Origin: ${origin}`,
235
+ `Refs: ${refEntries.length}`,
236
+ ...(roleCountsText !== undefined ? [`Top roles: ${roleCountsText}`] : []),
237
+ "",
238
+ "Compact snapshot view.",
239
+ "Viewport note: compact snapshots are DOM/signal-prioritized, not guaranteed to start with the currently scrolled viewport; use the full redacted snapshot, a screenshot, or listed high-value refs when viewport context matters.",
240
+ ...formatPagePreview(page, fullOutputPath),
241
+ ...formatRefSelection(refs),
242
+ "",
243
+ fullOutputPath !== undefined && fullOutputPath.length > 0
244
+ ? `Full redacted snapshot path: ${fullOutputPath}`
245
+ : `Full redacted snapshot unavailable: ${spillErrorText ?? "temp spill file could not be created."}`,
246
+ ];
247
+ return {
248
+ content: [{ type: "text", text: lines.join("\n") }],
249
+ data: {
250
+ compacted: true,
251
+ fullOutputPath,
252
+ origin,
253
+ previewMode: page.fallbackPreview ? "outline" : "structured",
254
+ viewportOrdering: "dom-signal-prioritized",
255
+ spillError: spillErrorText,
256
+ previewRefIds,
257
+ highValueControlRefIds: refs.highValue.map((entry) => entry.id),
258
+ additionalSectionsOmitted: page.omittedAdditionalSectionCount,
259
+ previewSections: getPreviewSections(page),
260
+ refCount: refEntries.length,
261
+ roleCounts,
262
+ snapshotLineCount: countLines(snapshot),
263
+ structuredPreviewUsed: !page.fallbackPreview,
264
+ },
265
+ };
266
+ }
@@ -0,0 +1,32 @@
1
+ import { isRecord } from "../parsing.js";
2
+ import { getFullSnapshotData, getSnapshotRefEntries } from "./snapshot-refs.js";
3
+ import { stringifyUnknown } from "./text.js";
4
+ export function getSnapshotText(data) {
5
+ const full = getFullSnapshotData(data);
6
+ if (typeof full?.snapshot === "string") {
7
+ return full.snapshot;
8
+ }
9
+ return isRecord(data.snapshot) ? JSON.stringify(data.snapshot) : undefined;
10
+ }
11
+ export function getSnapshotOrigin(data) {
12
+ return typeof data.origin === "string" ? data.origin : "(unknown origin)";
13
+ }
14
+ export function formatSnapshotSummary(data) {
15
+ const origin = typeof data.origin === "string" ? data.origin : "page";
16
+ if (isRecord(data.snapshot) && data.snapshot.kind !== "full") {
17
+ return `Snapshot ${stringifyUnknown(data.snapshot.kind)}: revision ${stringifyUnknown(data.snapshot.revision)} on ${origin}`;
18
+ }
19
+ return `Snapshot: ${getSnapshotRefEntries(data).length} refs on ${origin}`;
20
+ }
21
+ export function formatRawSnapshotText(data) {
22
+ const origin = getSnapshotOrigin(data);
23
+ const refs = getSnapshotRefEntries(data).length;
24
+ const snapshot = getSnapshotText(data);
25
+ if (isRecord(data.snapshot) && data.snapshot.kind !== "full") {
26
+ return `Origin: ${origin}\n${formatSnapshotSummary(data)}\n\n${snapshot ?? "undefined"}`;
27
+ }
28
+ if (snapshot === undefined || snapshot.length === 0) {
29
+ return `Origin: ${origin}\nRefs: ${refs}\n\n(no interactive elements)`;
30
+ }
31
+ return `Origin: ${origin}\nRefs: ${refs}\n\n${snapshot}`;
32
+ }
@@ -36,22 +36,28 @@ const SNAPSHOT_PRIMARY_ACTION_BUTTON_NAME_PATTERNS = [
36
36
  /^(?:add|apply|ask|confirm|connect|continue|create|launch|new|open|refresh|retry|run|save|search|send|start|submit)\b/i,
37
37
  ];
38
38
  function getHighValueControlRole(entry) {
39
- return entry.isEditable === true && (entry.role === "unknown" || entry.role === "generic") ? "textbox" : entry.role;
39
+ return entry.isEditable === true && (entry.role === "unknown" || entry.role === "generic")
40
+ ? "textbox"
41
+ : entry.role;
40
42
  }
41
43
  function isEditableControlRef(entry) {
42
- if (entry.isEditable === false)
44
+ if (entry.isEditable === false) {
43
45
  return false;
46
+ }
44
47
  const role = getHighValueControlRole(entry);
45
- return entry.isEditable === true || role === "searchbox" || role === "textbox" || role === "combobox";
48
+ return (entry.isEditable === true || role === "searchbox" || role === "textbox" || role === "combobox");
46
49
  }
47
50
  function isNamedSurfaceControlRef(entry) {
48
- if (entry.name.length === 0)
51
+ if (entry.name.length === 0) {
49
52
  return false;
53
+ }
50
54
  const role = getHighValueControlRole(entry);
51
- if (role === "tab")
55
+ if (role === "tab") {
52
56
  return true;
53
- if (role !== "button" && role !== "menuitem" && role !== "option")
57
+ }
58
+ if (role !== "button" && role !== "menuitem" && role !== "option") {
54
59
  return false;
60
+ }
55
61
  return SNAPSHOT_SURFACE_CONTROL_NAME_PATTERNS.some((pattern) => pattern.test(entry.name));
56
62
  }
57
63
  function isPrimaryActionButtonRef(entry) {
@@ -100,24 +106,30 @@ function isNamedActionLinkRef(entry) {
100
106
  }
101
107
  export function isHighValueControlEntry(entry) {
102
108
  const role = getHighValueControlRole(entry);
103
- if (!SNAPSHOT_HIGH_VALUE_CONTROL_ROLES.has(role))
109
+ if (!SNAPSHOT_HIGH_VALUE_CONTROL_ROLES.has(role)) {
104
110
  return false;
105
- if (role === "link")
111
+ }
112
+ if (role === "link") {
106
113
  return isNamedActionLinkRef(entry);
107
- if (entry.isEditable === false && (role === "searchbox" || role === "textbox" || role === "combobox"))
114
+ }
115
+ if (entry.isEditable === false &&
116
+ (role === "searchbox" || role === "textbox" || role === "combobox")) {
108
117
  return false;
118
+ }
109
119
  return entry.name.length > 0 || isEditableControlRef(entry);
110
120
  }
111
121
  function getHighValueControlCategoryRule(entry, role) {
112
122
  return SNAPSHOT_HIGH_VALUE_CONTROL_CATEGORY_RULES.find((rule) => rule.matches(entry, role));
113
123
  }
114
124
  function classifyHighValueControlRef(entry) {
115
- if (!isHighValueControlEntry(entry))
125
+ if (!isHighValueControlEntry(entry)) {
116
126
  return undefined;
127
+ }
117
128
  const role = getHighValueControlRole(entry);
118
129
  const rule = getHighValueControlCategoryRule(entry, role);
119
- if (!rule)
130
+ if (!rule) {
120
131
  return undefined;
132
+ }
121
133
  return {
122
134
  entry,
123
135
  score: {
@@ -134,74 +146,95 @@ function classifyHighValueControlRef(entry) {
134
146
  };
135
147
  }
136
148
  function compareHighValueControlCandidates(left, right) {
137
- return (left.score.categoryPriority - right.score.categoryPriority ||
138
- left.score.rolePriority - right.score.rolePriority ||
139
- left.score.namePriority - right.score.namePriority ||
140
- left.score.lineIndex - right.score.lineIndex ||
149
+ const differences = [
150
+ left.score.categoryPriority - right.score.categoryPriority,
151
+ left.score.rolePriority - right.score.rolePriority,
152
+ left.score.namePriority - right.score.namePriority,
153
+ left.score.lineIndex - right.score.lineIndex,
154
+ ];
155
+ return (differences.find((difference) => difference !== 0 && !Number.isNaN(difference)) ??
141
156
  compareRefIds(left.score.refId, right.score.refId));
142
157
  }
143
- function takeHighValueCandidate(candidate, selected, selectedIds) {
144
- selected.push(candidate);
145
- selectedIds.add(candidate.entry.id);
146
- }
147
- function takeFirstPerDiversityBucket(candidates, selected, selectedIds, limit) {
148
- const seenBuckets = new Set();
149
- for (const candidate of candidates) {
150
- if (selected.length >= limit)
151
- break;
152
- if (seenBuckets.has(candidate.score.diversityBucketKey))
153
- continue;
154
- seenBuckets.add(candidate.score.diversityBucketKey);
155
- takeHighValueCandidate(candidate, selected, selectedIds);
158
+ class HighValueSelection {
159
+ selected = [];
160
+ selectedIds = new Set();
161
+ candidates;
162
+ limit;
163
+ constructor(candidates, limit) {
164
+ this.candidates = candidates;
165
+ this.limit = limit;
156
166
  }
157
- }
158
- function topUpHighValueCategory(candidates, selected, selectedIds, category, target, limit) {
159
- let count = selected.filter((candidate) => candidate.score.category === category).length;
160
- for (const candidate of candidates) {
161
- if (selected.length >= limit || count >= target)
162
- break;
163
- if (selectedIds.has(candidate.entry.id) || candidate.score.category !== category)
164
- continue;
165
- takeHighValueCandidate(candidate, selected, selectedIds);
166
- count += 1;
167
+ take(candidate) {
168
+ this.selected.push(candidate);
169
+ this.selectedIds.add(candidate.entry.id);
167
170
  }
168
- }
169
- function buildRemainingHighValueBuckets(candidates, selectedIds) {
170
- const buckets = new Map();
171
- for (const candidate of candidates) {
172
- if (selectedIds.has(candidate.entry.id))
173
- continue;
174
- const bucket = buckets.get(candidate.score.roundRobinBucketKey);
175
- if (bucket)
176
- bucket.push(candidate);
177
- else
178
- buckets.set(candidate.score.roundRobinBucketKey, [candidate]);
179
- }
180
- return [...buckets.values()].sort((left, right) => compareHighValueControlCandidates(left[0], right[0]));
181
- }
182
- function roundRobinHighValueBuckets(buckets, selected, selectedIds, limit) {
183
- let bucketIndex = 0;
184
- while (selected.length < limit && buckets.some((bucket) => bucket.length > 0)) {
185
- const bucket = buckets[bucketIndex % buckets.length];
186
- const candidate = bucket.shift();
187
- if (candidate)
188
- takeHighValueCandidate(candidate, selected, selectedIds);
189
- bucketIndex += 1;
171
+ takeFirstPerDiversityBucket() {
172
+ const seenBuckets = new Set();
173
+ for (const candidate of this.candidates) {
174
+ if (this.selected.length >= this.limit) {
175
+ break;
176
+ }
177
+ if (!seenBuckets.has(candidate.score.diversityBucketKey)) {
178
+ seenBuckets.add(candidate.score.diversityBucketKey);
179
+ this.take(candidate);
180
+ }
181
+ }
182
+ }
183
+ topUp(category, target) {
184
+ let count = this.selected.filter((candidate) => candidate.score.category === category).length;
185
+ for (const candidate of this.candidates) {
186
+ if (this.selected.length >= this.limit || count >= target) {
187
+ break;
188
+ }
189
+ if (!this.selectedIds.has(candidate.entry.id) && candidate.score.category === category) {
190
+ this.take(candidate);
191
+ count += 1;
192
+ }
193
+ }
194
+ }
195
+ buildRemainingBuckets() {
196
+ const buckets = new Map();
197
+ for (const candidate of this.candidates) {
198
+ if (this.selectedIds.has(candidate.entry.id)) {
199
+ continue;
200
+ }
201
+ const key = candidate.score.roundRobinBucketKey;
202
+ const bucket = buckets.get(key);
203
+ if (bucket) {
204
+ bucket.push(candidate);
205
+ }
206
+ else {
207
+ buckets.set(key, [candidate]);
208
+ }
209
+ }
210
+ return [...buckets.values()].sort((left, right) => compareHighValueControlCandidates(left[0], right[0]));
211
+ }
212
+ fillRemaining() {
213
+ const buckets = this.buildRemainingBuckets();
214
+ let bucketIndex = 0;
215
+ while (this.selected.length < this.limit && buckets.some((bucket) => bucket.length > 0)) {
216
+ const candidate = buckets[bucketIndex % buckets.length].shift();
217
+ if (candidate) {
218
+ this.take(candidate);
219
+ }
220
+ bucketIndex += 1;
221
+ }
222
+ }
223
+ select() {
224
+ this.takeFirstPerDiversityBucket();
225
+ for (const rule of SNAPSHOT_HIGH_VALUE_CONTROL_CATEGORY_RULES) {
226
+ if (rule.fillTarget !== undefined) {
227
+ this.topUp(rule.id, rule.fillTarget);
228
+ }
229
+ }
230
+ this.fillRemaining();
231
+ return this.selected.map((candidate) => candidate.entry);
190
232
  }
191
233
  }
192
234
  export function selectHighValueControlEntries(entries, limit) {
193
235
  const candidates = entries
194
236
  .map(classifyHighValueControlRef)
195
- .filter((candidate) => Boolean(candidate))
237
+ .filter((candidate) => candidate !== undefined)
196
238
  .sort(compareHighValueControlCandidates);
197
- const selected = [];
198
- const selectedIds = new Set();
199
- takeFirstPerDiversityBucket(candidates, selected, selectedIds, limit);
200
- for (const rule of SNAPSHOT_HIGH_VALUE_CONTROL_CATEGORY_RULES) {
201
- if (rule.fillTarget === undefined)
202
- continue;
203
- topUpHighValueCategory(candidates, selected, selectedIds, rule.id, rule.fillTarget, limit);
204
- }
205
- roundRobinHighValueBuckets(buildRemainingHighValueBuckets(candidates, selectedIds), selected, selectedIds, limit);
206
- return selected.map((candidate) => candidate.entry);
239
+ return new HighValueSelection(candidates, limit).select();
207
240
  }
@@ -3,10 +3,12 @@ import { getEditableRefEvidence } from "./editable-ref-evidence.js";
3
3
  import { compareRefIds, normalizeWhitespace } from "./text.js";
4
4
  /** Project native delta full responses onto the ordinary snapshot shape for local readers. */
5
5
  export function getFullSnapshotData(data) {
6
- if (!isRecord(data))
6
+ if (!isRecord(data)) {
7
7
  return undefined;
8
- if (!isRecord(data.snapshot))
8
+ }
9
+ if (!isRecord(data.snapshot)) {
9
10
  return data;
11
+ }
10
12
  return data.snapshot.kind === "full"
11
13
  ? { ...data, snapshot: data.snapshot.tree, refs: data.snapshot.refs }
12
14
  : undefined;
@@ -21,16 +23,18 @@ export function getSnapshotLineTextByRef(data) {
21
23
  const lineByRef = new Map();
22
24
  for (const line of snapshot.split("\n")) {
23
25
  const ref = line.match(/\bref=([^,\]\s]+)/)?.[1];
24
- if (!ref || lineByRef.has(ref))
26
+ if (ref === undefined || ref.length === 0 || lineByRef.has(ref)) {
25
27
  continue;
28
+ }
26
29
  lineByRef.set(ref, line);
27
30
  }
28
31
  return lineByRef;
29
32
  }
30
33
  export function getSnapshotRefEntries(data) {
31
34
  const refs = getSnapshotRefRecord(data);
32
- if (!refs)
35
+ if (!refs) {
33
36
  return [];
37
+ }
34
38
  return Object.entries(refs)
35
39
  .map(([id, value]) => {
36
40
  if (!isRecord(value)) {
@@ -45,9 +49,12 @@ export function getSnapshotRefEntries(data) {
45
49
  }
46
50
  function isEditableSnapshotLine(line) {
47
51
  const editableEvidence = getEditableRefEvidence({ text: line.raw });
48
- if (editableEvidence !== undefined)
52
+ if (editableEvidence !== undefined) {
49
53
  return editableEvidence;
50
- return line.role === "searchbox" || line.role === "textbox" || line.role === "combobox" ? true : undefined;
54
+ }
55
+ return line.role === "searchbox" || line.role === "textbox" || line.role === "combobox"
56
+ ? true
57
+ : undefined;
51
58
  }
52
59
  export function getSnapshotRefRole(entry, editableEvidence) {
53
60
  const rawRole = typeof entry.role === "string" && entry.role.length > 0 ? entry.role : "unknown";
@@ -57,20 +64,33 @@ export function getSnapshotRefRole(entry, editableEvidence) {
57
64
  }
58
65
  return rawRole;
59
66
  }
67
+ function getSnapshotRefFallbackRole(role, line) {
68
+ if (role !== "unknown" && role !== "generic") {
69
+ return role;
70
+ }
71
+ return line && line.role !== "unknown" ? line.role : role;
72
+ }
73
+ function resolveSnapshotRefEditableEvidence(evidence, line) {
74
+ if (evidence !== undefined) {
75
+ return evidence;
76
+ }
77
+ return (line !== undefined &&
78
+ isEditableSnapshotLine(line) === true &&
79
+ !["unknown", "generic"].includes(line.role));
80
+ }
60
81
  export function enrichSnapshotRefEntries(refEntries, snapshotLines) {
61
82
  const lineByRef = new Map();
62
83
  for (const line of snapshotLines) {
63
- if (!line.ref || lineByRef.has(line.ref))
84
+ if (line.ref === undefined || line.ref.length === 0 || lineByRef.has(line.ref)) {
64
85
  continue;
86
+ }
65
87
  lineByRef.set(line.ref, line);
66
88
  }
67
89
  return refEntries.map((entry) => {
68
90
  const line = lineByRef.get(entry.id);
69
- const lineRole = line && line.role !== "unknown" ? line.role : undefined;
70
91
  const editableEvidence = getEditableRefEvidence({ ref: entry.refData, text: line?.raw });
71
- const hasEditableRole = line ? isEditableSnapshotLine(line) === true && !["unknown", "generic"].includes(line.role) : false;
72
- const isEditable = editableEvidence === true || (editableEvidence !== false && hasEditableRole);
73
- const roleFromRefOrLine = entry.role !== "unknown" && entry.role !== "generic" ? entry.role : lineRole ?? entry.role;
92
+ const isEditable = resolveSnapshotRefEditableEvidence(editableEvidence, line);
93
+ const roleFromRefOrLine = getSnapshotRefFallbackRole(entry.role, line);
74
94
  const role = getSnapshotRefRole({ role: roleFromRefOrLine }, isEditable);
75
95
  return {
76
96
  ...entry,