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
@@ -1,5 +1,22 @@
1
1
  import { isRecord } from "../parsing.js";
2
2
  const RECORDING_QUALITY_WARNING = "Capture quality warning: repaint-driven capture, held/repeated or static frames, and late/final-state-only frames cannot establish UI smoothness. Output FPS is not captured-frame rate; inspect the recording and capture window before judging motion.";
3
+ function getRecordingOutcome(value, outcome) {
4
+ if (typeof value === "boolean" || value === null) {
5
+ return value;
6
+ }
7
+ return outcome ?? null;
8
+ }
9
+ function formatRecordingOutcome(receipt) {
10
+ let outcome = "pending/unknown";
11
+ if (receipt.success !== null) {
12
+ outcome = receipt.success ? "succeeded" : "failed";
13
+ }
14
+ const error = receipt.error !== null && receipt.error.length > 0 ? ` — ${receipt.error}` : "";
15
+ return `Native recording outcome: ${outcome}${error}`;
16
+ }
17
+ function recordOrEmpty(value) {
18
+ return isRecord(value) ? value : {};
19
+ }
3
20
  function number(value) {
4
21
  return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : null;
5
22
  }
@@ -7,34 +24,55 @@ function text(value) {
7
24
  return typeof value === "string" && value.length > 0 ? value : null;
8
25
  }
9
26
  export function getRecordingReceipt(value, outcome) {
10
- if (!isRecord(value) || typeof value.path !== "string" || !value.path)
27
+ if (!isRecord(value) || typeof value.path !== "string" || value.path.length === 0) {
11
28
  return undefined;
12
- const capture = isRecord(value.capture) ? value.capture : {};
13
- const output = isRecord(value.output) ? value.output : {};
14
- const file = isRecord(value.file) ? value.file : {};
29
+ }
30
+ const capture = recordOrEmpty(value.capture);
31
+ const output = recordOrEmpty(value.output);
32
+ const file = recordOrEmpty(value.file);
15
33
  return {
16
34
  warning: RECORDING_QUALITY_WARNING,
17
- recordingId: text(value.recordingId), path: value.path,
18
- success: typeof value.success === "boolean" ? value.success : value.success === null ? null : outcome ?? null,
19
- error: text(value.error), frames: number(value.frames), capturedFrames: number(value.capturedFrames), fps: number(value.fps),
35
+ recordingId: text(value.recordingId),
36
+ path: value.path,
37
+ success: getRecordingOutcome(value.success, outcome),
38
+ error: text(value.error),
39
+ frames: number(value.frames),
40
+ capturedFrames: number(value.capturedFrames),
41
+ fps: number(value.fps),
20
42
  capture: {
21
- startedAt: text(capture.startedAt), endedAt: text(capture.endedAt), durationMs: number(capture.durationMs),
22
- firstFrameAt: text(capture.firstFrameAt), lastFrameAt: text(capture.lastFrameAt), firstFrameAfterMs: number(capture.firstFrameAfterMs), lastFrameAfterMs: number(capture.lastFrameAfterMs),
23
- averageFps: number(capture.averageFps), maxFrameGapMs: number(capture.maxFrameGapMs), timestampSource: text(capture.timestampSource),
43
+ startedAt: text(capture.startedAt),
44
+ endedAt: text(capture.endedAt),
45
+ durationMs: number(capture.durationMs),
46
+ firstFrameAt: text(capture.firstFrameAt),
47
+ lastFrameAt: text(capture.lastFrameAt),
48
+ firstFrameAfterMs: number(capture.firstFrameAfterMs),
49
+ lastFrameAfterMs: number(capture.lastFrameAfterMs),
50
+ averageFps: number(capture.averageFps),
51
+ maxFrameGapMs: number(capture.maxFrameGapMs),
52
+ timestampSource: text(capture.timestampSource),
24
53
  },
25
54
  output: {
26
- frames: number(output.frames ?? value.frames), fps: number(output.fps ?? value.fps), encodedFrames: number(output.encodedFrames),
27
- durationMs: number(output.durationMs), durationSource: text(output.durationSource), heldFrames: number(output.heldFrames), droppedFrames: number(output.droppedFrames), skippedFrames: number(output.skippedFrames),
55
+ frames: number(output.frames ?? value.frames),
56
+ fps: number(output.fps ?? value.fps),
57
+ encodedFrames: number(output.encodedFrames),
58
+ durationMs: number(output.durationMs),
59
+ durationSource: text(output.durationSource),
60
+ heldFrames: number(output.heldFrames),
61
+ droppedFrames: number(output.droppedFrames),
62
+ skippedFrames: number(output.skippedFrames),
28
63
  encoderSucceeded: typeof output.encoderSucceeded === "boolean" ? output.encoderSucceeded : null,
29
64
  },
30
- file: { exists: typeof file.exists === "boolean" ? file.exists : null, sizeBytes: number(file.sizeBytes) },
65
+ file: {
66
+ exists: typeof file.exists === "boolean" ? file.exists : null,
67
+ sizeBytes: number(file.sizeBytes),
68
+ },
31
69
  };
32
70
  }
33
71
  export function formatRecordingReceipt(receipt) {
34
72
  const metric = (value, unit = "") => value === null ? "unknown" : `${value}${unit}`;
35
73
  return [
36
74
  `Recording ID: ${metric(receipt.recordingId)}`,
37
- `Native recording outcome: ${receipt.success === true ? "succeeded" : receipt.success === false ? "failed" : "pending/unknown"}${receipt.error ? ` — ${receipt.error}` : ""}`,
75
+ formatRecordingOutcome(receipt),
38
76
  `Capture started: ${metric(receipt.capture.startedAt)}; ended: ${metric(receipt.capture.endedAt)}`,
39
77
  `Wall-clock capture duration: ${metric(receipt.capture.durationMs, " ms")}`,
40
78
  `Captured frames (received, not pixel-unique): ${metric(receipt.capturedFrames)}`,
@@ -1,4 +1,4 @@
1
- import { buildNextToolAction, withOptionalSessionArgs } from "./next-actions.js";
1
+ import { buildNextToolAction, withOptionalSessionArgs, } from "./next-actions.js";
2
2
  export const AGENT_BROWSER_RECOVERY_NEXT_ACTION_IDS = {
3
3
  aboutBlankListTabs: "list-tabs-for-about-blank-recovery",
4
4
  connectedSessionGetUrl: "verify-connected-session-url",
@@ -29,7 +29,9 @@ export function getAgentBrowserRichInputRecoveryNextActionIds(candidateCount) {
29
29
  return ids;
30
30
  }
31
31
  function getRecoveryTargetDescription(recovery) {
32
- const target = [recovery.targetTitle, recovery.targetUrl].filter((item) => item !== undefined && item.length > 0).join(" at ");
32
+ const target = [recovery.targetTitle, recovery.targetUrl]
33
+ .filter((item) => item !== undefined && item.length > 0)
34
+ .join(" at ");
33
35
  return target.length > 0 ? target : "the intended tab";
34
36
  }
35
37
  function isStableTabId(tab) {
@@ -49,7 +51,11 @@ function buildTabSnapshotRecoveryAction(options) {
49
51
  id: options.id,
50
52
  reason: `${options.reason} The batch selects and verifies the stable tab before snapshotting.`,
51
53
  safety: `${options.safety} A failed tab selection or URL check stops before the snapshot.`,
52
- stdin: JSON.stringify([["tab", options.tabId], ["get", "url"], ["snapshot", "-i"]]),
54
+ stdin: JSON.stringify([
55
+ ["tab", options.tabId],
56
+ ["get", "url"],
57
+ ["snapshot", "-i"],
58
+ ]),
53
59
  });
54
60
  }
55
61
  export function buildRecoveryNextActions(recovery) {
@@ -83,12 +89,15 @@ export function buildRecoveryNextActions(recovery) {
83
89
  const targetDescription = getRecoveryTargetDescription(recovery);
84
90
  const listAction = buildNextToolAction({
85
91
  args: sessionArgs(["tab", "list"]),
86
- id: recovery.kind === "about-blank" ? AGENT_BROWSER_RECOVERY_NEXT_ACTION_IDS.aboutBlankListTabs : AGENT_BROWSER_RECOVERY_NEXT_ACTION_IDS.tabDriftListTabs,
92
+ id: recovery.kind === "about-blank"
93
+ ? AGENT_BROWSER_RECOVERY_NEXT_ACTION_IDS.aboutBlankListTabs
94
+ : AGENT_BROWSER_RECOVERY_NEXT_ACTION_IDS.tabDriftListTabs,
87
95
  reason: `Inspect tabs for ${targetDescription} before continuing after tab drift.`,
88
96
  safety: "Read-only tab listing; prefer stable tN tab ids over positional tab guesses.",
89
97
  });
90
- if (!isStableTabId(recovery.selectedTab))
98
+ if (!isStableTabId(recovery.selectedTab)) {
91
99
  return [listAction];
100
+ }
92
101
  return [
93
102
  listAction,
94
103
  buildNextToolAction({
@@ -1,52 +1,60 @@
1
1
  import { buildAgentBrowserNextActions } from "./action-recommendations.js";
2
2
  import { withOptionalSessionArgs } from "./next-actions.js";
3
3
  export function buildConnectedSessionNextActions(sessionName) {
4
- if (!sessionName)
4
+ if ((sessionName ?? "") === "") {
5
5
  return [];
6
- return buildAgentBrowserNextActions({
6
+ }
7
+ return (buildAgentBrowserNextActions({
7
8
  recovery: { kind: "connected-session", sessionName },
8
9
  resultCategory: "success",
9
10
  successCategory: "completed",
10
- }) ?? [];
11
+ }) ?? []);
11
12
  }
12
13
  export function buildNoActivePageNextActions(sessionName) {
13
- if (!sessionName)
14
+ if ((sessionName ?? "") === "") {
14
15
  return [];
15
- return buildAgentBrowserNextActions({
16
+ }
17
+ return (buildAgentBrowserNextActions({
16
18
  recovery: { kind: "no-active-page", sessionName },
17
19
  resultCategory: "failure",
18
- }) ?? [];
20
+ }) ?? []);
19
21
  }
20
22
  export function buildPendingWebMcpNextActions(sessionName) {
21
- return [{
23
+ return [
24
+ {
22
25
  id: "verify-page-target-after-pending-webmcp",
23
26
  params: { args: withOptionalSessionArgs(sessionName, ["get", "url"]) },
24
27
  reason: "Verify the current page target before taking a fresh snapshot; use webmcp result or cancel to settle the detached invocation.",
25
28
  safety: "Read-only URL inspection. It does not settle the pending page tool, which may still mutate or navigate later.",
26
29
  tool: "agent_browser",
27
- }];
30
+ },
31
+ ];
32
+ }
33
+ function getSessionTabRecoveryContext(options) {
34
+ return {
35
+ kind: options.kind,
36
+ recoveryApplied: options.recoveryApplied,
37
+ selectedTab: options.tabCorrection?.selectedTab,
38
+ sessionName: options.sessionName,
39
+ targetTitle: options.tabCorrection?.targetTitle ?? options.target?.title,
40
+ targetUrl: options.tabCorrection?.targetUrl ?? options.target?.url,
41
+ };
28
42
  }
29
43
  export function buildSessionTabRecoveryNextActions(options) {
30
44
  const resultCategory = options.resultCategory ?? "success";
31
- return buildAgentBrowserNextActions({
32
- recovery: {
33
- kind: options.kind,
34
- recoveryApplied: options.recoveryApplied,
35
- selectedTab: options.tabCorrection?.selectedTab,
36
- sessionName: options.sessionName,
37
- targetTitle: options.tabCorrection?.targetTitle ?? options.target?.title,
38
- targetUrl: options.tabCorrection?.targetUrl ?? options.target?.url,
39
- },
45
+ return (buildAgentBrowserNextActions({
46
+ recovery: getSessionTabRecoveryContext(options),
40
47
  resultCategory,
41
48
  successCategory: resultCategory === "success" ? "completed" : undefined,
42
- }) ?? [];
49
+ }) ?? []);
43
50
  }
44
51
  export function buildSessionAwareStaleRefNextActions(sessionName) {
45
52
  return (buildAgentBrowserNextActions({ failureCategory: "stale-ref", resultCategory: "failure" }) ?? []).map((action) => {
46
53
  const actionArgs = action.params?.args;
47
- return {
48
- ...action,
49
- params: action.params && actionArgs ? { ...action.params, args: withOptionalSessionArgs(sessionName, actionArgs) } : action.params,
50
- };
54
+ return Object.assign({}, action, {
55
+ params: action.params && actionArgs
56
+ ? { ...action.params, args: withOptionalSessionArgs(sessionName, actionArgs) }
57
+ : action.params,
58
+ });
51
59
  });
52
60
  }
@@ -0,0 +1,83 @@
1
+ const SELECTOR_RECOVERY_ACTION_NAMES = [
2
+ "check",
3
+ "click",
4
+ "fill",
5
+ "select",
6
+ "uncheck",
7
+ ];
8
+ function isSelectorRecoveryActionName(action) {
9
+ return SELECTOR_RECOVERY_ACTION_NAMES.some((name) => name === action);
10
+ }
11
+ function getFindNameFlagValue(args, startIndex) {
12
+ const index = args.indexOf("--name", startIndex);
13
+ const name = index >= 0 ? args.at(index + 1) : undefined;
14
+ return name !== undefined && name.length > 0 ? name : undefined;
15
+ }
16
+ function collectFindTrailingValues(args, startIndex) {
17
+ const values = [];
18
+ for (const token of args.slice(startIndex)) {
19
+ if (token.length === 0 || token.startsWith("-")) {
20
+ break;
21
+ }
22
+ values.push(token);
23
+ }
24
+ return values;
25
+ }
26
+ function getSelectTarget(args, index, locator, value) {
27
+ const optionValues = collectFindTrailingValues(args, index + 4);
28
+ if (locator === "role") {
29
+ if (!/^(?:combobox|listbox)$/i.test(value)) {
30
+ return undefined;
31
+ }
32
+ const targetName = getFindNameFlagValue(args, index + 4);
33
+ return targetName !== undefined
34
+ ? { action: "select", optionValues, roles: [value.toLowerCase()], targetName }
35
+ : undefined;
36
+ }
37
+ return locator === "label"
38
+ ? { action: "select", optionValues, roles: ["combobox", "listbox"], targetName: value }
39
+ : undefined;
40
+ }
41
+ function getTextTarget(action, locator, targetName, text) {
42
+ if (locator === "text" && action === "click") {
43
+ return { action, roles: ["button", "link"], targetName };
44
+ }
45
+ if ((locator === "text" || locator === "placeholder") && action === "fill") {
46
+ return { action, roles: ["searchbox", "textbox"], targetName, text };
47
+ }
48
+ return locator === "label" && action === "fill"
49
+ ? { action, roles: ["textbox"], targetName, text }
50
+ : undefined;
51
+ }
52
+ export function getFindVisibleRefFallbackTarget(args) {
53
+ const index = args[0] === "--session" ? 2 : 0;
54
+ if (args[index] !== "find") {
55
+ return undefined;
56
+ }
57
+ const locator = args.at(index + 1);
58
+ const value = args.at(index + 2);
59
+ const action = args.at(index + 3);
60
+ if (locator === undefined ||
61
+ locator.length === 0 ||
62
+ value === undefined ||
63
+ value.length === 0 ||
64
+ !isSelectorRecoveryActionName(action)) {
65
+ return undefined;
66
+ }
67
+ return getFindActionTarget(args, { index, locator, value, action });
68
+ }
69
+ function getFindActionTarget(args, command) {
70
+ const { index, locator, value, action } = command;
71
+ if (action === "select") {
72
+ return getSelectTarget(args, index, locator, value);
73
+ }
74
+ const text = action === "fill" ? args.at(index + 4) : undefined;
75
+ if (action === "fill" && (text === undefined || text.length === 0)) {
76
+ return undefined;
77
+ }
78
+ if (locator === "role") {
79
+ const targetName = getFindNameFlagValue(args, index + 4);
80
+ return targetName !== undefined ? { action, roles: [value], targetName, text } : undefined;
81
+ }
82
+ return getTextTarget(action, locator, value, text);
83
+ }
@@ -1,105 +1,70 @@
1
1
  import { isRecord } from "../parsing.js";
2
- import { extractRefSnapshotFromData } from "../session-page-state.js";
2
+ import { extractRefSnapshotFromData } from "../session-page-observation.js";
3
3
  import { getEditableRefEvidence } from "./editable-ref-evidence.js";
4
4
  import { withOptionalSessionArgs } from "./next-actions.js";
5
5
  import { getAgentBrowserRichInputRecoveryNextActionId, getAgentBrowserRichInputRecoveryNextActionIds, } from "./recovery-actions.js";
6
6
  import { getSnapshotLineTextByRef, getSnapshotRefRecord, getSnapshotRefRole, } from "./snapshot-refs.js";
7
7
  import { compareRefIds } from "./text.js";
8
- const SELECTOR_RECOVERY_ACTION_NAMES = new Set(["check", "click", "fill", "select", "uncheck"]);
8
+ import { getFindVisibleRefFallbackTarget, } from "./selector-recovery-target.js";
9
9
  const VISIBLE_REF_FALLBACK_CANDIDATE_LIMIT = 3;
10
10
  const EDITABLE_CONTROL_ROLES = new Set(["combobox", "searchbox", "textbox"]);
11
11
  const RICH_INPUT_RECOVERY_EDITABLE_ROLES = new Set(["searchbox", "textbox"]);
12
12
  const RICH_INPUT_RECOVERY_HINT = "After the editable ref is focused, use keyboard type when a framework-controlled editor requires real key events. keyboard inserttext is paste-like and needs separate application-state verification. Do not press Enter or otherwise submit unless the user flow explicitly calls for it.";
13
- function isSelectorRecoveryActionName(action) {
14
- return SELECTOR_RECOVERY_ACTION_NAMES.has(action);
15
- }
16
- function getFindNameFlagValue(args, startIndex) {
17
- const nameFlagIndex = args.indexOf("--name", startIndex);
18
- const name = nameFlagIndex >= 0 ? args[nameFlagIndex + 1] : undefined;
19
- return typeof name === "string" && name.length > 0 ? name : undefined;
20
- }
21
- function collectFindTrailingValues(args, startIndex) {
22
- const values = [];
23
- for (let index = startIndex; index < args.length; index += 1) {
24
- const token = args[index];
25
- if (!token || token.startsWith("-"))
26
- break;
27
- values.push(token);
28
- }
29
- return values;
13
+ export function getVisibleRefFallbackTarget(options) {
14
+ return (getFindVisibleRefFallbackTarget(options.commandTokens) ??
15
+ (options.compiledSemanticAction
16
+ ? getFindVisibleRefFallbackTarget(options.compiledSemanticAction.args)
17
+ : undefined));
30
18
  }
31
- function getFindVisibleRefFallbackTarget(args, options = {}) {
32
- const findIndex = args[0] === "--session" ? 2 : 0;
33
- if (args[findIndex] !== "find")
19
+ function getDirectRefFallbackArgs(target, ref) {
20
+ if (target.action === "fill") {
34
21
  return undefined;
35
- const locator = args[findIndex + 1];
36
- const value = args[findIndex + 2];
37
- const action = args[findIndex + 3];
38
- if (!locator || !value || !isSelectorRecoveryActionName(action))
39
- return undefined;
40
- if (action === "select") {
41
- const optionValues = collectFindTrailingValues(args, findIndex + 4);
42
- if (locator === "role") {
43
- if (!/^(?:combobox|listbox)$/i.test(value))
44
- return undefined;
45
- const targetName = getFindNameFlagValue(args, findIndex + 4);
46
- return targetName ? { action, optionValues, roles: [value.toLowerCase()], targetName } : undefined;
47
- }
48
- if (locator === "label") {
49
- return { action, optionValues, roles: ["combobox", "listbox"], targetName: value };
50
- }
51
- return undefined;
52
- }
53
- const text = action === "fill" ? args[findIndex + 4] : undefined;
54
- if (action === "fill" && (!text || (!options.allowLeadingDashFillText && text.startsWith("-"))))
55
- return undefined;
56
- if (locator === "role") {
57
- const targetName = getFindNameFlagValue(args, findIndex + 4);
58
- return targetName ? { action, roles: [value], targetName, text } : undefined;
59
- }
60
- if (locator === "text" && action === "click") {
61
- return { action, roles: ["button", "link"], targetName: value };
62
- }
63
- if (locator === "text" && action === "fill") {
64
- return { action, roles: ["searchbox", "textbox"], targetName: value, text };
65
- }
66
- if (locator === "label" && action === "fill") {
67
- return { action, roles: ["textbox"], targetName: value, text };
68
22
  }
69
- if (locator === "placeholder" && action === "fill") {
70
- return { action, roles: ["searchbox", "textbox"], targetName: value, text };
23
+ if (target.action === "select") {
24
+ return target.optionValues && target.optionValues.length > 0
25
+ ? ["select", `@${ref}`, ...target.optionValues]
26
+ : undefined;
71
27
  }
72
- return undefined;
28
+ return [target.action, `@${ref}`];
73
29
  }
74
- export function getVisibleRefFallbackTarget(options) {
75
- return getFindVisibleRefFallbackTarget(options.commandTokens, { allowLeadingDashFillText: true }) ?? (options.compiledSemanticAction ? getFindVisibleRefFallbackTarget(options.compiledSemanticAction.args, { allowLeadingDashFillText: true }) : undefined);
30
+ function getCandidateEditableEvidence(snapshot, ref, entry, line) {
31
+ return snapshot
32
+ ? snapshot.refs?.[ref]?.isEditable
33
+ : getEditableRefEvidence({ ref: entry, text: line });
34
+ }
35
+ function matchesFallbackName(name, targetName) {
36
+ return (name !== undefined &&
37
+ name.length > 0 &&
38
+ normalizeSemanticActionAccessibleName(name) === targetName);
39
+ }
40
+ function isDisallowedEditableFill(action, evidence, role) {
41
+ return action === "fill" && evidence === false && EDITABLE_CONTROL_ROLES.has(role.toLowerCase());
76
42
  }
77
43
  function getVisibleRefFallbackCandidates(target, snapshotData, refSnapshot) {
78
44
  const refs = refSnapshot?.refs ?? getSnapshotRefRecord(snapshotData);
79
- if (!refs)
45
+ if (!refs) {
80
46
  return [];
47
+ }
81
48
  const snapshotLineByRef = getSnapshotLineTextByRef(snapshotData);
82
49
  const roleOrder = target.roles.map((role) => role.toLowerCase());
83
50
  const targetName = normalizeSemanticActionAccessibleName(target.targetName);
84
51
  const candidates = Object.entries(refs).flatMap(([ref, entry]) => {
85
- if (!/^e\d+$/.test(ref) || !isRecord(entry))
52
+ if (!/^e\d+$/.test(ref) || !isRecord(entry)) {
86
53
  return [];
54
+ }
87
55
  const snapshotLine = snapshotLineByRef.get(ref);
88
- const editableEvidence = refSnapshot ? refSnapshot.refs?.[ref]?.isEditable : getEditableRefEvidence({ ref: entry, text: snapshotLine });
56
+ const editableEvidence = getCandidateEditableEvidence(refSnapshot, ref, entry, snapshotLine);
89
57
  const role = getSnapshotRefRole(entry, editableEvidence);
90
58
  const name = typeof entry.name === "string" ? entry.name : undefined;
91
- if (!role || !name || !roleOrder.includes(role.toLowerCase()) || normalizeSemanticActionAccessibleName(name) !== targetName)
59
+ if (!matchesFallbackName(name, targetName) || !roleOrder.includes(role.toLowerCase())) {
92
60
  return [];
93
- if (target.action === "fill" && editableEvidence === false && EDITABLE_CONTROL_ROLES.has(role.toLowerCase()))
61
+ }
62
+ if (isDisallowedEditableFill(target.action, editableEvidence, role)) {
94
63
  return [];
95
- const directRefArgs = target.action === "fill"
96
- ? undefined
97
- : target.action === "select" && target.optionValues && target.optionValues.length > 0
98
- ? ["select", `@${ref}`, ...target.optionValues]
99
- : target.action === "select"
100
- ? undefined
101
- : [target.action, `@${ref}`];
102
- return [{
64
+ }
65
+ const directRefArgs = getDirectRefFallbackArgs(target, ref);
66
+ return [
67
+ {
103
68
  action: target.action,
104
69
  ...(directRefArgs ? { args: directRefArgs } : {}),
105
70
  name,
@@ -107,34 +72,74 @@ function getVisibleRefFallbackCandidates(target, snapshotData, refSnapshot) {
107
72
  ref: `@${ref}`,
108
73
  role,
109
74
  ...(editableEvidence !== undefined ? { editableEvidence } : {}),
110
- }];
75
+ },
76
+ ];
77
+ });
78
+ candidates.sort((left, right) => {
79
+ const difference = roleOrder.indexOf(left.role.toLowerCase()) - roleOrder.indexOf(right.role.toLowerCase());
80
+ return difference !== 0 ? difference : compareRefIds(left.ref.slice(1), right.ref.slice(1));
111
81
  });
112
- candidates.sort((left, right) => roleOrder.indexOf(left.role.toLowerCase()) - roleOrder.indexOf(right.role.toLowerCase()) || compareRefIds(left.ref.slice(1), right.ref.slice(1)));
113
82
  return candidates.slice(0, VISIBLE_REF_FALLBACK_CANDIDATE_LIMIT);
114
83
  }
115
84
  export function buildVisibleRefFallbackDiagnosticFromSnapshot(options) {
116
85
  const snapshot = extractRefSnapshotFromData(options.snapshotData);
117
- if (!snapshot)
86
+ if (!snapshot) {
118
87
  return undefined;
88
+ }
119
89
  const candidates = getVisibleRefFallbackCandidates(options.target, options.snapshotData);
120
- if (candidates.length === 0)
90
+ if (candidates.length === 0) {
121
91
  return undefined;
92
+ }
122
93
  return {
123
94
  candidates,
124
95
  snapshot,
125
96
  summary: candidates.length === 1
126
97
  ? `Current snapshot has one exact visible ref match for ${options.target.action} ${JSON.stringify(options.target.targetName)}.`
127
98
  : `Current snapshot has ${candidates.length} exact visible ref matches for ${options.target.action} ${JSON.stringify(options.target.targetName)}; choose only if the intended control is unambiguous.`,
128
- target: { action: options.target.action, roles: options.target.roles, targetName: options.target.targetName },
99
+ target: {
100
+ action: options.target.action,
101
+ roles: options.target.roles,
102
+ targetName: options.target.targetName,
103
+ },
129
104
  };
130
105
  }
106
+ function resolveFillCandidateArgs(candidates, text, allowFill) {
107
+ if (allowFill !== true || candidates.length !== 1 || text === undefined) {
108
+ return undefined;
109
+ }
110
+ const candidate = candidates.at(0);
111
+ if (!candidate ||
112
+ candidate.editableEvidence === false ||
113
+ !EDITABLE_CONTROL_ROLES.has(candidate.role.toLowerCase())) {
114
+ return undefined;
115
+ }
116
+ return ["fill", candidate.ref, text];
117
+ }
118
+ function resolveSelectCandidateArgs(candidates, values) {
119
+ if (candidates.length !== 1 || !values || values.length === 0) {
120
+ return undefined;
121
+ }
122
+ const candidate = candidates.at(0);
123
+ return candidate ? ["select", candidate.ref, ...values] : undefined;
124
+ }
125
+ function resolveCandidateArgs(target, candidates, allowFill, selectValues) {
126
+ if (target.action === "fill") {
127
+ return resolveFillCandidateArgs(candidates, target.text, allowFill);
128
+ }
129
+ if (target.action === "select") {
130
+ return resolveSelectCandidateArgs(candidates, selectValues);
131
+ }
132
+ return candidates.find((candidate) => candidate.args !== undefined)?.args;
133
+ }
131
134
  export function resolveVisibleRefActionFromSnapshot(options) {
132
- const target = getFindVisibleRefFallbackTarget(options.compiledAction.args, { allowLeadingDashFillText: true });
133
- if (!target)
135
+ const target = getFindVisibleRefFallbackTarget(options.compiledAction.args);
136
+ if (!target) {
134
137
  return undefined;
138
+ }
135
139
  const snapshot = options.refSnapshot ?? extractRefSnapshotFromData(options.snapshotData);
136
- if (!snapshot)
140
+ if (!snapshot) {
137
141
  return undefined;
142
+ }
138
143
  const selectOptionValues = options.compiledAction.values && options.compiledAction.values.length > 0
139
144
  ? options.compiledAction.values
140
145
  : target.optionValues;
@@ -142,45 +147,32 @@ export function resolveVisibleRefActionFromSnapshot(options) {
142
147
  ? { ...target, optionValues: selectOptionValues }
143
148
  : target;
144
149
  const candidates = getVisibleRefFallbackCandidates(effectiveTarget, options.snapshotData, options.refSnapshot);
145
- if (effectiveTarget.action === "fill") {
146
- if (!options.allowFill || candidates.length !== 1 || effectiveTarget.text === undefined)
147
- return undefined;
148
- const [candidate] = candidates;
149
- if (!candidate || candidate.editableEvidence === false || !EDITABLE_CONTROL_ROLES.has(candidate.role.toLowerCase()))
150
- return undefined;
151
- return { args: ["fill", candidate.ref, effectiveTarget.text], snapshot };
152
- }
153
- if (effectiveTarget.action === "select") {
154
- if (candidates.length !== 1 || !selectOptionValues || selectOptionValues.length === 0)
155
- return undefined;
156
- const [candidate] = candidates;
157
- if (!candidate)
158
- return undefined;
159
- return { args: ["select", candidate.ref, ...selectOptionValues], snapshot };
160
- }
161
- const candidate = candidates.find((item) => item.args !== undefined);
162
- if (!candidate?.args)
163
- return undefined;
164
- return { args: candidate.args, snapshot };
150
+ const args = resolveCandidateArgs(effectiveTarget, candidates, options.allowFill, selectOptionValues);
151
+ return args ? { args, snapshot } : undefined;
165
152
  }
166
153
  export function buildVisibleRefFallbackNextActions(options) {
167
154
  const ambiguous = options.diagnostic.candidates.length > 1;
168
- return options.diagnostic.candidates.flatMap((candidate, index) => candidate.args ? [{
169
- id: ambiguous ? `try-current-visible-ref-${index + 1}` : "try-current-visible-ref",
170
- params: { args: withOptionalSessionArgs(options.sessionName, candidate.args) },
171
- reason: candidate.reason,
172
- safety: ambiguous
173
- ? "Several current refs share the same exact role/name. Inspect the snapshot and use only the ref that clearly matches the intended target."
174
- : "Use only while this current snapshot still represents the page; refresh refs first if the page changed.",
175
- tool: "agent_browser",
176
- }] : []);
155
+ return options.diagnostic.candidates.flatMap((candidate, index) => candidate.args
156
+ ? [
157
+ {
158
+ id: ambiguous ? `try-current-visible-ref-${index + 1}` : "try-current-visible-ref",
159
+ params: { args: withOptionalSessionArgs(options.sessionName, candidate.args) },
160
+ reason: candidate.reason,
161
+ safety: ambiguous
162
+ ? "Several current refs share the same exact role/name. Inspect the snapshot and use only the ref that clearly matches the intended target."
163
+ : "Use only while this current snapshot still represents the page; refresh refs first if the page changed.",
164
+ tool: "agent_browser",
165
+ },
166
+ ]
167
+ : []);
177
168
  }
178
169
  export function formatVisibleRefFallbackText(diagnostic) {
179
- if (!diagnostic)
170
+ if (!diagnostic) {
180
171
  return undefined;
172
+ }
181
173
  return [
182
174
  "Current snapshot ref fallback:",
183
- ...diagnostic.candidates.map((candidate) => `- ${candidate.ref}${candidate.role ? ` ${candidate.role}` : ""} ${JSON.stringify(candidate.name)}: ${candidate.reason}`),
175
+ ...diagnostic.candidates.map((candidate) => `- ${candidate.ref}${candidate.role.length > 0 ? ` ${candidate.role}` : ""} ${JSON.stringify(candidate.name)}: ${candidate.reason}`),
184
176
  ].join("\n");
185
177
  }
186
178
  export function sanitizeVisibleRefFallbackDiagnostic(diagnostic) {
@@ -192,12 +184,17 @@ export function sanitizeVisibleRefFallbackDiagnostic(diagnostic) {
192
184
  };
193
185
  }
194
186
  function isRichInputRecoveryCandidate(candidate) {
195
- return candidate.action === "fill" && candidate.editableEvidence !== false && RICH_INPUT_RECOVERY_EDITABLE_ROLES.has(candidate.role.toLowerCase());
187
+ return (candidate.action === "fill" &&
188
+ candidate.editableEvidence !== false &&
189
+ RICH_INPUT_RECOVERY_EDITABLE_ROLES.has(candidate.role.toLowerCase()));
196
190
  }
197
191
  export function buildRichInputRecoveryDiagnostic(diagnostic) {
198
- if (!diagnostic || diagnostic.target.action !== "fill")
192
+ if (!diagnostic || diagnostic.target.action !== "fill") {
199
193
  return undefined;
200
- const candidates = diagnostic.candidates.filter(isRichInputRecoveryCandidate).map((candidate) => ({
194
+ }
195
+ const candidates = diagnostic.candidates
196
+ .filter(isRichInputRecoveryCandidate)
197
+ .map((candidate) => ({
201
198
  clickArgs: ["click", candidate.ref],
202
199
  focusArgs: ["focus", candidate.ref],
203
200
  name: candidate.name,
@@ -205,8 +202,9 @@ export function buildRichInputRecoveryDiagnostic(diagnostic) {
205
202
  ref: candidate.ref,
206
203
  role: candidate.role,
207
204
  }));
208
- if (candidates.length === 0)
205
+ if (candidates.length === 0) {
209
206
  return undefined;
207
+ }
210
208
  return {
211
209
  candidates,
212
210
  inputMethodHint: RICH_INPUT_RECOVERY_HINT,
@@ -245,13 +243,15 @@ export function buildRichInputRecoveryNextActions(options) {
245
243
  });
246
244
  }
247
245
  export function formatRichInputRecoveryText(diagnostic) {
248
- if (!diagnostic)
246
+ if (!diagnostic) {
249
247
  return undefined;
248
+ }
250
249
  return [
251
250
  "Rich input recovery:",
252
251
  ...diagnostic.candidates.map((candidate, index) => {
253
- const [focusId, clickId] = diagnostic.nextActionIds.slice(index * 2, index * 2 + 2);
254
- return `- ${candidate.ref} ${candidate.role} ${JSON.stringify(candidate.name)}: use ${focusId} or ${clickId}; then use keyboard type for framework-controlled editors, or paste-like keyboard inserttext only with separate application-state verification.`;
252
+ const focusId = diagnostic.nextActionIds.at(index * 2);
253
+ const clickId = diagnostic.nextActionIds.at(index * 2 + 1);
254
+ return `- ${candidate.ref} ${candidate.role} ${JSON.stringify(candidate.name)}: use ${focusId ?? "undefined"} or ${clickId ?? "undefined"}; then use keyboard type for framework-controlled editors, or paste-like keyboard inserttext only with separate application-state verification.`;
255
255
  }),
256
256
  `- ${diagnostic.inputMethodHint}`,
257
257
  ].join("\n");