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,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,