pi-agent-browser-native 0.9.3 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. package/CHANGELOG.md +106 -5
  2. package/README.md +58 -791
  3. package/dist/extensions/agent-browser/index.js +43101 -2031
  4. package/dist/extensions/agent-browser/lib/argv-descriptor.js +49 -26
  5. package/dist/extensions/agent-browser/lib/argv-grammar.js +82 -93
  6. package/dist/extensions/agent-browser/lib/bash-guard.js +129 -126
  7. package/dist/extensions/agent-browser/lib/batch-lifecycle.js +112 -51
  8. package/dist/extensions/agent-browser/lib/browser-execution-claim-codec.js +61 -0
  9. package/dist/extensions/agent-browser/lib/browser-execution-claim-storage.js +232 -0
  10. package/dist/extensions/agent-browser/lib/browser-execution-claims.js +202 -0
  11. package/dist/extensions/agent-browser/lib/browser-execution-identity.js +77 -0
  12. package/dist/extensions/agent-browser/lib/browser-journal-branch.js +98 -0
  13. package/dist/extensions/agent-browser/lib/browser-journal-contracts.js +1 -0
  14. package/dist/extensions/agent-browser/lib/browser-journal-projection.js +221 -0
  15. package/dist/extensions/agent-browser/lib/browser-journal-reader.js +89 -0
  16. package/dist/extensions/agent-browser/lib/browser-journal-replay.js +246 -0
  17. package/dist/extensions/agent-browser/lib/browser-journal.js +103 -394
  18. package/dist/extensions/agent-browser/lib/browser-legacy-pages.js +220 -0
  19. package/dist/extensions/agent-browser/lib/browser-legacy-projection.js +282 -0
  20. package/dist/extensions/agent-browser/lib/browser-legacy-types.js +1 -0
  21. package/dist/extensions/agent-browser/lib/browser-session-conversion-stream.js +217 -0
  22. package/dist/extensions/agent-browser/lib/browser-session-conversion.js +80 -335
  23. package/dist/extensions/agent-browser/lib/browser-transcript-contracts.js +35 -0
  24. package/dist/extensions/agent-browser/lib/browser-transcript-validation.js +166 -0
  25. package/dist/extensions/agent-browser/lib/browser-transcript.js +137 -82
  26. package/dist/extensions/agent-browser/lib/browser-value-parsing.js +15 -0
  27. package/dist/extensions/agent-browser/lib/command-capabilities.js +340 -0
  28. package/dist/extensions/agent-browser/lib/command-policy.js +107 -88
  29. package/dist/extensions/agent-browser/lib/command-taxonomy.js +49 -322
  30. package/dist/extensions/agent-browser/lib/config-policy.js +138 -343
  31. package/dist/extensions/agent-browser/lib/config-providers.js +71 -0
  32. package/dist/extensions/agent-browser/lib/config-validation.js +231 -0
  33. package/dist/extensions/agent-browser/lib/config.js +20 -8
  34. package/dist/extensions/agent-browser/lib/electron/cdp.js +20 -8
  35. package/dist/extensions/agent-browser/lib/electron/cleanup.js +128 -83
  36. package/dist/extensions/agent-browser/lib/electron/discovery-darwin.js +109 -0
  37. package/dist/extensions/agent-browser/lib/electron/discovery-desktop.js +136 -0
  38. package/dist/extensions/agent-browser/lib/electron/discovery-evidence.js +90 -0
  39. package/dist/extensions/agent-browser/lib/electron/discovery-linux.js +93 -0
  40. package/dist/extensions/agent-browser/lib/electron/discovery-packages.js +162 -0
  41. package/dist/extensions/agent-browser/lib/electron/discovery-types.js +2 -0
  42. package/dist/extensions/agent-browser/lib/electron/discovery.js +140 -549
  43. package/dist/extensions/agent-browser/lib/electron/launch-monitor.js +102 -0
  44. package/dist/extensions/agent-browser/lib/electron/launch-process.js +209 -0
  45. package/dist/extensions/agent-browser/lib/electron/launch-types.js +2 -0
  46. package/dist/extensions/agent-browser/lib/electron/launch.js +261 -355
  47. package/dist/extensions/agent-browser/lib/executable-path.js +21 -12
  48. package/dist/extensions/agent-browser/lib/execution-cwd.js +35 -18
  49. package/dist/extensions/agent-browser/lib/fs-utils.js +1 -9
  50. package/dist/extensions/agent-browser/lib/input-modes/electron.js +162 -121
  51. package/dist/extensions/agent-browser/lib/input-modes/job.js +123 -317
  52. package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +116 -0
  53. package/dist/extensions/agent-browser/lib/input-modes/lookup-plan.js +132 -0
  54. package/dist/extensions/agent-browser/lib/input-modes/lookup-redaction.js +57 -0
  55. package/dist/extensions/agent-browser/lib/input-modes/lookup-source-evidence.js +151 -0
  56. package/dist/extensions/agent-browser/lib/input-modes/lookup-workspace.js +142 -0
  57. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +58 -412
  58. package/dist/extensions/agent-browser/lib/input-modes/params.js +86 -40
  59. package/dist/extensions/agent-browser/lib/input-modes/qa-analysis.js +268 -0
  60. package/dist/extensions/agent-browser/lib/input-modes/qa-presentation.js +117 -0
  61. package/dist/extensions/agent-browser/lib/input-modes/script-child.js +396 -0
  62. package/dist/extensions/agent-browser/lib/input-modes/script-protocol.js +86 -0
  63. package/dist/extensions/agent-browser/lib/input-modes/script-types.js +1 -0
  64. package/dist/extensions/agent-browser/lib/input-modes/script-validation.js +60 -0
  65. package/dist/extensions/agent-browser/lib/input-modes/script.js +60 -409
  66. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +218 -128
  67. package/dist/extensions/agent-browser/lib/input-modes/shared.js +15 -4
  68. package/dist/extensions/agent-browser/lib/input-modes/types.js +56 -7
  69. package/dist/extensions/agent-browser/lib/json-schema.js +22 -10
  70. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +17 -5
  71. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +92 -425
  72. package/dist/extensions/agent-browser/lib/managed-session-posix-storage.js +58 -0
  73. package/dist/extensions/agent-browser/lib/managed-session-project-identity.js +244 -0
  74. package/dist/extensions/agent-browser/lib/managed-session-restore-context.js +84 -0
  75. package/dist/extensions/agent-browser/lib/managed-session-restore-policy.js +119 -0
  76. package/dist/extensions/agent-browser/lib/managed-session-restore-state.js +83 -0
  77. package/dist/extensions/agent-browser/lib/managed-session-restore.js +168 -300
  78. package/dist/extensions/agent-browser/lib/managed-session-snapshot-records.js +277 -0
  79. package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +128 -305
  80. package/dist/extensions/agent-browser/lib/managed-session-storage.js +56 -253
  81. package/dist/extensions/agent-browser/lib/native-confirmation.js +140 -0
  82. package/dist/extensions/agent-browser/lib/native-output.js +43 -9
  83. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +106 -59
  84. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-merge.js +14 -6
  85. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +109 -57
  86. package/dist/extensions/agent-browser/lib/orchestration/browser-run/browser-observation-result.js +82 -0
  87. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +164 -60
  88. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostic-values.js +31 -0
  89. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +152 -781
  90. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-observation.js +203 -0
  91. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-text-diagnostics.js +109 -0
  92. package/dist/extensions/agent-browser/lib/orchestration/browser-run/fill-diagnostics.js +119 -0
  93. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-action-recovery.js +147 -0
  94. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-actions.js +144 -0
  95. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-content.js +123 -0
  96. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-contracts.js +1 -0
  97. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-details.js +156 -0
  98. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-electron.js +187 -0
  99. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-evidence.js +39 -0
  100. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-missing-binary.js +89 -0
  101. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-recovery.js +97 -0
  102. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-redaction.js +106 -0
  103. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-timeout.js +110 -0
  104. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +41 -538
  105. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +199 -154
  106. package/dist/extensions/agent-browser/lib/orchestration/browser-run/interaction-diagnostics.js +290 -0
  107. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-close.js +167 -0
  108. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-inspection.js +108 -0
  109. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +127 -205
  110. package/dist/extensions/agent-browser/lib/orchestration/browser-run/native-helper-observation.js +65 -0
  111. package/dist/extensions/agent-browser/lib/orchestration/browser-run/observation-types.js +1 -0
  112. package/dist/extensions/agent-browser/lib/orchestration/browser-run/overlay-diagnostics.js +120 -0
  113. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +113 -30
  114. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +109 -28
  115. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter-data.js +150 -0
  116. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +147 -253
  117. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-rendered-text.js +147 -0
  118. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +59 -24
  119. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-artifacts.js +159 -0
  120. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-command.js +131 -0
  121. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-contracts.js +1 -0
  122. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-daemon.js +93 -0
  123. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-failure.js +42 -0
  124. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-guards.js +242 -0
  125. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-input.js +75 -0
  126. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-observations.js +92 -0
  127. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-selection.js +254 -0
  128. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-state.js +121 -0
  129. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-refs.js +130 -0
  130. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-resources.js +114 -0
  131. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-semantic.js +121 -0
  132. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-session-plan.js +222 -0
  133. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-timeouts.js +68 -0
  134. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +176 -1123
  135. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-analysis.js +191 -0
  136. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-confirmation.js +152 -0
  137. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-diagnostics.js +182 -0
  138. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-electron.js +150 -0
  139. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-contracts.js +1 -0
  140. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase-contracts.js +1 -0
  141. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase.js +115 -0
  142. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle.js +256 -0
  143. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed-contracts.js +1 -0
  144. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed.js +256 -0
  145. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase-contracts.js +1 -0
  146. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase.js +93 -0
  147. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native.js +113 -0
  148. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation-contracts.js +1 -0
  149. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation.js +316 -0
  150. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-ownership.js +28 -0
  151. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase-contracts.js +1 -0
  152. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase.js +142 -0
  153. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation-contracts.js +1 -0
  154. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation.js +333 -0
  155. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase-contracts.js +1 -0
  156. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase.js +71 -0
  157. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication.js +201 -0
  158. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-receipts.js +183 -0
  159. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-refs.js +200 -0
  160. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-tabs.js +142 -0
  161. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +18 -968
  162. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +23 -13
  163. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-receipt-reconciliation.js +198 -0
  164. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-contracts.js +1 -0
  165. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-presentation.js +154 -0
  166. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery.js +68 -151
  167. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-capture.js +14 -0
  168. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-observation.js +169 -46
  169. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-commands.js +130 -0
  170. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-electron.js +212 -0
  171. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-observations.js +61 -0
  172. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-outcomes.js +187 -0
  173. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-refs.js +169 -0
  174. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-tabs.js +228 -0
  175. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +77 -765
  176. package/dist/extensions/agent-browser/lib/orchestration/browser-run/text-visibility-diagnostics.js +182 -0
  177. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-diagnostics.js +256 -0
  178. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-progress.js +108 -0
  179. package/dist/extensions/agent-browser/lib/orchestration/code-artifact-observation.js +39 -0
  180. package/dist/extensions/agent-browser/lib/orchestration/code-image-observation.js +119 -0
  181. package/dist/extensions/agent-browser/lib/orchestration/electron-host/branch.js +93 -0
  182. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup-result.js +58 -0
  183. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup.js +78 -0
  184. package/dist/extensions/agent-browser/lib/orchestration/electron-host/contracts.js +1 -0
  185. package/dist/extensions/agent-browser/lib/orchestration/electron-host/discovery.js +106 -0
  186. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +48 -821
  187. package/dist/extensions/agent-browser/lib/orchestration/electron-host/policy.js +86 -0
  188. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-collection.js +68 -0
  189. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +169 -0
  190. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +182 -0
  191. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe.js +161 -0
  192. package/dist/extensions/agent-browser/lib/orchestration/electron-host/status.js +167 -0
  193. package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +22 -10
  194. package/dist/extensions/agent-browser/lib/orchestration/extension-artifact-preflight.js +211 -0
  195. package/dist/extensions/agent-browser/lib/orchestration/extension-artifacts.js +23 -0
  196. package/dist/extensions/agent-browser/lib/orchestration/extension-attachment-replay.js +99 -0
  197. package/dist/extensions/agent-browser/lib/orchestration/extension-branch-restore.js +275 -0
  198. package/dist/extensions/agent-browser/lib/orchestration/extension-code.js +280 -0
  199. package/dist/extensions/agent-browser/lib/orchestration/extension-command-admission.js +303 -0
  200. package/dist/extensions/agent-browser/lib/orchestration/extension-command-output.js +36 -0
  201. package/dist/extensions/agent-browser/lib/orchestration/extension-command-result.js +335 -0
  202. package/dist/extensions/agent-browser/lib/orchestration/extension-command-run.js +227 -0
  203. package/dist/extensions/agent-browser/lib/orchestration/extension-command-state.js +1 -0
  204. package/dist/extensions/agent-browser/lib/orchestration/extension-electron-ownership.js +204 -0
  205. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-locks.js +139 -0
  206. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-queue.js +24 -0
  207. package/dist/extensions/agent-browser/lib/orchestration/extension-host-coordination.js +98 -0
  208. package/dist/extensions/agent-browser/lib/orchestration/extension-host-run.js +295 -0
  209. package/dist/extensions/agent-browser/lib/orchestration/extension-intent-replay.js +41 -0
  210. package/dist/extensions/agent-browser/lib/orchestration/extension-invocation.js +7 -0
  211. package/dist/extensions/agent-browser/lib/orchestration/extension-lifecycle.js +102 -0
  212. package/dist/extensions/agent-browser/lib/orchestration/extension-managed-ownership.js +133 -0
  213. package/dist/extensions/agent-browser/lib/orchestration/extension-observation.js +120 -0
  214. package/dist/extensions/agent-browser/lib/orchestration/extension-prompt.js +180 -0
  215. package/dist/extensions/agent-browser/lib/orchestration/extension-recording.js +290 -0
  216. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-contracts.js +1 -0
  217. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-replay.js +269 -0
  218. package/dist/extensions/agent-browser/lib/orchestration/extension-result-state.js +113 -0
  219. package/dist/extensions/agent-browser/lib/orchestration/extension-runtime.js +146 -0
  220. package/dist/extensions/agent-browser/lib/orchestration/extension-script-leases.js +58 -0
  221. package/dist/extensions/agent-browser/lib/orchestration/extension-tool-boundary.js +62 -0
  222. package/dist/extensions/agent-browser/lib/orchestration/extension-version-check.js +54 -0
  223. package/dist/extensions/agent-browser/lib/orchestration/input-plan-types.js +1 -0
  224. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +261 -185
  225. package/dist/extensions/agent-browser/lib/orchestration/input-redaction.js +62 -0
  226. package/dist/extensions/agent-browser/lib/orchestration/native-config.js +144 -0
  227. package/dist/extensions/agent-browser/lib/orchestration/native-root-launch.js +77 -0
  228. package/dist/extensions/agent-browser/lib/orchestration/native-session-defaults.js +210 -157
  229. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  230. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +197 -99
  231. package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +199 -96
  232. package/dist/extensions/agent-browser/lib/owned-managed-session-context.js +55 -0
  233. package/dist/extensions/agent-browser/lib/page-target-batch.js +118 -0
  234. package/dist/extensions/agent-browser/lib/page-target-guards.js +50 -0
  235. package/dist/extensions/agent-browser/lib/page-target-navigation.js +104 -0
  236. package/dist/extensions/agent-browser/lib/page-target-validation.js +55 -246
  237. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  238. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +133 -68
  239. package/dist/extensions/agent-browser/lib/playbook.js +16 -12
  240. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  241. package/dist/extensions/agent-browser/lib/process-environment.js +13 -6
  242. package/dist/extensions/agent-browser/lib/process-errors.js +23 -0
  243. package/dist/extensions/agent-browser/lib/process-identity.js +47 -15
  244. package/dist/extensions/agent-browser/lib/process-socket-storage.js +256 -0
  245. package/dist/extensions/agent-browser/lib/process-stdout.js +74 -0
  246. package/dist/extensions/agent-browser/lib/process.js +145 -536
  247. package/dist/extensions/agent-browser/lib/prompt-artifacts.js +287 -0
  248. package/dist/extensions/agent-browser/lib/prompt-policy.js +15 -194
  249. package/dist/extensions/agent-browser/lib/read-command.js +41 -0
  250. package/dist/extensions/agent-browser/lib/read-confirmation.js +131 -68
  251. package/dist/extensions/agent-browser/lib/recording-reservations.js +118 -45
  252. package/dist/extensions/agent-browser/lib/redaction-fields.js +75 -0
  253. package/dist/extensions/agent-browser/lib/redaction-json.js +149 -0
  254. package/dist/extensions/agent-browser/lib/redaction-url.js +88 -0
  255. package/dist/extensions/agent-browser/lib/results/action-contracts.js +1 -0
  256. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +28 -271
  257. package/dist/extensions/agent-browser/lib/results/artifact-contracts.js +1 -0
  258. package/dist/extensions/agent-browser/lib/results/artifact-manifest-validation.js +133 -0
  259. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +96 -94
  260. package/dist/extensions/agent-browser/lib/results/artifact-recommendations.js +73 -0
  261. package/dist/extensions/agent-browser/lib/results/categories.js +111 -54
  262. package/dist/extensions/agent-browser/lib/results/confirmation.js +29 -13
  263. package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +62 -27
  264. package/dist/extensions/agent-browser/lib/results/electron-recommendations.js +83 -0
  265. package/dist/extensions/agent-browser/lib/results/envelope-decoding.js +48 -0
  266. package/dist/extensions/agent-browser/lib/results/envelope.js +90 -67
  267. package/dist/extensions/agent-browser/lib/results/evidence-contracts.js +1 -0
  268. package/dist/extensions/agent-browser/lib/results/failure-recommendations.js +180 -0
  269. package/dist/extensions/agent-browser/lib/results/network-routes.js +86 -45
  270. package/dist/extensions/agent-browser/lib/results/network.js +35 -12
  271. package/dist/extensions/agent-browser/lib/results/next-actions.js +49 -19
  272. package/dist/extensions/agent-browser/lib/results/presentation/artifact-files.js +320 -0
  273. package/dist/extensions/agent-browser/lib/results/presentation/artifact-format.js +138 -0
  274. package/dist/extensions/agent-browser/lib/results/presentation/artifact-images.js +113 -0
  275. package/dist/extensions/agent-browser/lib/results/presentation/artifact-verification.js +145 -0
  276. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +99 -555
  277. package/dist/extensions/agent-browser/lib/results/presentation/batch-contracts.js +1 -0
  278. package/dist/extensions/agent-browser/lib/results/presentation/batch-recording.js +118 -0
  279. package/dist/extensions/agent-browser/lib/results/presentation/batch-redaction.js +68 -0
  280. package/dist/extensions/agent-browser/lib/results/presentation/batch-rendering.js +135 -0
  281. package/dist/extensions/agent-browser/lib/results/presentation/batch-step.js +227 -0
  282. package/dist/extensions/agent-browser/lib/results/presentation/batch-summary.js +91 -0
  283. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +91 -460
  284. package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +9 -5
  285. package/dist/extensions/agent-browser/lib/results/presentation/command-presenters.js +216 -0
  286. package/dist/extensions/agent-browser/lib/results/presentation/common.js +26 -9
  287. package/dist/extensions/agent-browser/lib/results/presentation/content.js +86 -29
  288. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-a11y.js +67 -0
  289. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-health.js +79 -0
  290. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-identity.js +199 -0
  291. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-logs.js +75 -0
  292. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network-actions.js +216 -0
  293. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network.js +124 -0
  294. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-redaction.js +64 -0
  295. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-storage.js +209 -0
  296. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-stream.js +69 -0
  297. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-summary.js +222 -0
  298. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +103 -1052
  299. package/dist/extensions/agent-browser/lib/results/presentation/early-result.js +70 -0
  300. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +130 -60
  301. package/dist/extensions/agent-browser/lib/results/presentation/input-contracts.js +1 -0
  302. package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +60 -145
  303. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +147 -88
  304. package/dist/extensions/agent-browser/lib/results/presentation/notices.js +75 -0
  305. package/dist/extensions/agent-browser/lib/results/presentation/observation-contracts.js +1 -0
  306. package/dist/extensions/agent-browser/lib/results/presentation/observation-rendering.js +127 -0
  307. package/dist/extensions/agent-browser/lib/results/presentation/outcomes.js +120 -0
  308. package/dist/extensions/agent-browser/lib/results/presentation/output-completion.js +77 -0
  309. package/dist/extensions/agent-browser/lib/results/presentation/output-spill.js +51 -0
  310. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +116 -240
  311. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +35 -21
  312. package/dist/extensions/agent-browser/lib/results/presentation/skills.js +109 -73
  313. package/dist/extensions/agent-browser/lib/results/presentation/source.js +109 -0
  314. package/dist/extensions/agent-browser/lib/results/presentation.js +17 -261
  315. package/dist/extensions/agent-browser/lib/results/recommendation-contracts.js +1 -0
  316. package/dist/extensions/agent-browser/lib/results/recording.js +52 -14
  317. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +14 -5
  318. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +30 -22
  319. package/dist/extensions/agent-browser/lib/results/selector-recovery-target.js +83 -0
  320. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +119 -119
  321. package/dist/extensions/agent-browser/lib/results/snapshot-compact.js +266 -0
  322. package/dist/extensions/agent-browser/lib/results/snapshot-content.js +32 -0
  323. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +104 -71
  324. package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +31 -11
  325. package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +125 -66
  326. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +26 -7
  327. package/dist/extensions/agent-browser/lib/results/snapshot.js +28 -248
  328. package/dist/extensions/agent-browser/lib/results/text.js +16 -5
  329. package/dist/extensions/agent-browser/lib/runtime-args-validation.js +133 -0
  330. package/dist/extensions/agent-browser/lib/runtime-compatibility.js +81 -0
  331. package/dist/extensions/agent-browser/lib/runtime-contracts.js +1 -0
  332. package/dist/extensions/agent-browser/lib/runtime-redaction.js +118 -0
  333. package/dist/extensions/agent-browser/lib/runtime-replay-events.js +144 -0
  334. package/dist/extensions/agent-browser/lib/runtime-session-identity.js +76 -0
  335. package/dist/extensions/agent-browser/lib/runtime-session-plan.js +114 -0
  336. package/dist/extensions/agent-browser/lib/runtime-session-replay.js +123 -0
  337. package/dist/extensions/agent-browser/lib/runtime-tab-correction.js +65 -0
  338. package/dist/extensions/agent-browser/lib/runtime-timeouts.js +28 -0
  339. package/dist/extensions/agent-browser/lib/runtime.js +137 -1041
  340. package/dist/extensions/agent-browser/lib/session-identity.js +51 -0
  341. package/dist/extensions/agent-browser/lib/session-page-observation.js +357 -0
  342. package/dist/extensions/agent-browser/lib/session-page-state.js +178 -333
  343. package/dist/extensions/agent-browser/lib/session-page-types.js +1 -0
  344. package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +81 -0
  345. package/dist/extensions/agent-browser/lib/temp-mutation-queue.js +7 -0
  346. package/dist/extensions/agent-browser/lib/temp-root-ownership.js +234 -0
  347. package/dist/extensions/agent-browser/lib/temp-root.js +211 -0
  348. package/dist/extensions/agent-browser/lib/temp.js +33 -446
  349. package/dist/extensions/agent-browser/lib/tool-surface.js +94 -24
  350. package/dist/extensions/agent-browser/lib/upstream-version.js +3 -2
  351. package/dist/extensions/agent-browser/lib/web-search-providers.js +193 -0
  352. package/dist/extensions/agent-browser/lib/web-search-request.js +102 -0
  353. package/dist/extensions/agent-browser/lib/web-search-results.js +281 -0
  354. package/dist/extensions/agent-browser/lib/web-search-schema.js +82 -0
  355. package/dist/extensions/agent-browser/lib/web-search.js +124 -614
  356. package/dist/extensions/agent-browser/lib/webmcp-observation.js +13 -6
  357. package/dist/extensions/agent-browser/lib/windows-stock-launcher.js +63 -37
  358. package/dist/extensions/agent-browser/script-worker.js +80 -43
  359. package/dist/scripts/agent-browser-target.mjs +4 -2
  360. package/docs/ARCHITECTURE.md +19 -6
  361. package/docs/CODE_QUALITY.md +267 -0
  362. package/docs/COMMAND_REFERENCE.md +272 -241
  363. package/docs/ELECTRON.md +77 -46
  364. package/docs/REFERENCE.md +869 -0
  365. package/docs/RELEASE.md +25 -22
  366. package/docs/REQUIREMENTS.md +2 -1
  367. package/docs/SUPPORT_MATRIX.md +81 -79
  368. package/docs/TOOL_CONTRACT.md +158 -125
  369. package/docs/platform-smoke.md +8 -8
  370. package/package.json +144 -120
  371. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  372. package/scripts/agent-browser-target.mjs +6 -2
  373. package/scripts/build.mjs +37 -8
  374. package/scripts/capability-core-commands.mjs +193 -0
  375. package/scripts/capability-options.mjs +283 -0
  376. package/scripts/capability-samples.mjs +133 -0
  377. package/scripts/capability-section.mjs +11 -0
  378. package/scripts/config.mjs +235 -132
  379. package/scripts/convert-browser-session.mjs +30 -9
  380. package/scripts/doctor-sources.mjs +195 -0
  381. package/scripts/doctor.mjs +94 -249
  382. package/scripts/platform-smoke/artifacts.mjs +38 -11
  383. package/scripts/platform-smoke/commands.mjs +104 -0
  384. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  385. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  386. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  387. package/scripts/platform-smoke/doctor.mjs +212 -320
  388. package/scripts/platform-smoke/lease-evidence.mjs +132 -0
  389. package/scripts/platform-smoke/linux-image/Dockerfile +8 -2
  390. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  391. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  392. package/scripts/platform-smoke/targets.mjs +154 -472
  393. package/scripts/platform-smoke.mjs +55 -40
  394. package/scripts/prepare.mjs +16 -7
@@ -1,267 +1,10 @@
1
- import { randomUUID } from "node:crypto";
2
- import { extractUpstreamCommandTokens } from "./argv-descriptor.js";
3
- import { getAgentBrowserSessionIdentityKey, isAgentBrowserSessionIdentityKeyInNamespace } from "./argv-grammar.js";
4
- import { getBrowserRecord, snapshotFromDefinition } from "./browser-transcript.js";
5
- import { isCloseCommand, isOpenNavigationCommand, isReadOnlyDiagnosticSessionTargetCommand, isRecordPageTransitionCommand, isUnverifiedPageTransitionCommand, isWebMcpPageMutationCommand, isWindowOrDiffPageTransitionCommand } from "./command-taxonomy.js";
6
1
  import { isRecord } from "./parsing.js";
7
- import { detectConfirmationRequired } from "./results/confirmation.js";
8
- import { findReadConfirmation as findPendingReadConfirmation, isSuccessfulNativeConfirmedClose, parseReadConfirmation } from "./read-confirmation.js";
9
- import { getEditableRefEvidence } from "./results/editable-ref-evidence.js";
10
- import { enrichSnapshotRefEntries, getFullSnapshotData, getSnapshotRefEntries } from "./results/snapshot-refs.js";
11
- import { parseSnapshotLines } from "./results/snapshot-segments.js";
12
- export function normalizeComparableUrl(url) {
13
- const normalizedUrl = url?.trim();
14
- if (!normalizedUrl) {
15
- return undefined;
16
- }
17
- try {
18
- const parsedUrl = new URL(normalizedUrl);
19
- parsedUrl.hash = "";
20
- return parsedUrl.toString();
21
- }
22
- catch {
23
- return undefined;
24
- }
25
- }
26
- export function normalizeSessionTabTarget(target) {
27
- if (!target) {
28
- return undefined;
29
- }
30
- const url = target.url?.trim();
31
- if (!url || normalizeComparableUrl(url) === undefined) {
32
- return undefined;
33
- }
34
- const title = target.title?.trim();
35
- return { ...(target.targetId?.trim() ? { targetId: target.targetId.trim() } : {}), title: title && title.length > 0 ? title : undefined, url };
36
- }
37
- export function isAboutBlankUrl(url) {
38
- return normalizeComparableUrl(url) === "about:blank";
39
- }
40
- export function isAboutBlankSessionTabTarget(target) {
41
- return isAboutBlankUrl(target?.url);
42
- }
43
- export function commandExplicitlyTargetsAboutBlank(commandTokens) {
44
- return (commandTokens[0] === "window" && commandTokens[1] === "new") || commandTokens.some((token) => isAboutBlankUrl(token));
45
- }
46
- export function targetsMatch(left, right) {
47
- if (!left || !right)
48
- return true;
49
- return normalizeComparableUrl(left.url) === normalizeComparableUrl(right.url);
50
- }
51
- function extractStringResultField(data, fieldName) {
52
- if (typeof data === "string") {
53
- if (fieldName === "value")
54
- return data;
55
- const text = data.trim();
56
- return text.length > 0 ? text : undefined;
57
- }
58
- if (!isRecord(data) || typeof data[fieldName] !== "string") {
59
- return undefined;
60
- }
61
- if (fieldName === "value")
62
- return data[fieldName];
63
- const text = data[fieldName].trim();
64
- return text.length > 0 ? text : undefined;
65
- }
66
- function extractSessionTabTargetFromData(data) {
67
- const directTarget = normalizeSessionTabTarget({
68
- targetId: isRecord(data) && typeof data.targetId === "string" ? data.targetId : undefined,
69
- title: extractStringResultField(data, "title"),
70
- url: extractStringResultField(data, "url"),
71
- });
72
- if (directTarget) {
73
- return directTarget;
74
- }
75
- if (isRecord(data) && typeof data.origin === "string") {
76
- return normalizeSessionTabTarget({ url: data.origin });
77
- }
78
- return undefined;
79
- }
80
- function extractBatchResultCommand(item) {
81
- return Array.isArray(item.command) ? item.command.filter((token) => typeof token === "string") : [];
82
- }
83
- export function extractSessionTabTargetFromCommandData(commandTokens, data) {
84
- const [command, subcommand] = commandTokens;
85
- if (command === "confirm" && isRecord(data) && data.confirmed === true && ["navigate", "url"].includes(String(data.action))
86
- && isRecord(data.result) && data.result.success === true && !detectConfirmationRequired(data)) {
87
- return extractSessionTabTargetFromData(data.result.data);
88
- }
89
- if (command === "get" && subcommand === "url") {
90
- return normalizeSessionTabTarget({ url: extractStringResultField(data, "url") ?? extractStringResultField(data, "result") });
91
- }
92
- return isReadOnlyDiagnosticSessionTargetCommand(command, subcommand) ? undefined : extractSessionTabTargetFromData(data);
93
- }
94
- export function extractSessionTabTargetFromBatchResults(data) {
95
- if (!Array.isArray(data)) {
96
- return undefined;
97
- }
98
- let currentTarget;
99
- let pendingTitle;
100
- for (const item of data) {
101
- if (!isRecord(item) || detectConfirmationRequired(item.result))
102
- continue;
103
- // Only this row's native identity can describe the active tab after it ran.
104
- if (currentTarget?.targetId)
105
- currentTarget = normalizeSessionTabTarget({ title: currentTarget.title, url: currentTarget.url });
106
- const commandTokens = extractUpstreamCommandTokens(extractBatchResultCommand(item));
107
- const [name, subcommand] = commandTokens;
108
- if (isOpenNavigationCommand(name) || isUnverifiedPageTransitionCommand(name, subcommand)
109
- || (name === "click" && commandTokens.includes("--new-tab"))) {
110
- currentTarget = undefined;
111
- pendingTitle = undefined;
112
- }
113
- if (item.success === false)
114
- continue;
115
- const result = item.result;
116
- if (isCloseCommand(name) || isSuccessfulNativeConfirmedClose(commandTokens, result)) {
117
- currentTarget = undefined;
118
- pendingTitle = undefined;
119
- continue;
120
- }
121
- if (name === "get" && subcommand === "title") {
122
- pendingTitle = extractStringResultField(result, "title");
123
- continue;
124
- }
125
- if (name === "get" && subcommand === "url") {
126
- const url = extractStringResultField(result, "url");
127
- const target = normalizeSessionTabTarget({ title: pendingTitle, url });
128
- if (target) {
129
- currentTarget = target;
130
- }
131
- pendingTitle = undefined;
132
- continue;
133
- }
134
- const resultTarget = extractSessionTabTargetFromCommandData([name, subcommand].filter((token) => token !== undefined), result);
135
- if (resultTarget) {
136
- currentTarget = resultTarget;
137
- }
138
- pendingTitle = undefined;
139
- }
140
- return currentTarget;
141
- }
142
- export function deriveSessionTabTarget(options) {
143
- if (isCloseCommand(options.command)) {
144
- return undefined;
145
- }
146
- const commandDataTarget = extractSessionTabTargetFromCommandData([options.command, options.subcommand].filter((token) => token !== undefined), options.data);
147
- const observedTarget = normalizeSessionTabTarget(options.navigationSummary)
148
- ?? extractSessionTabTargetFromBatchResults(options.data)
149
- ?? commandDataTarget;
150
- if (observedTarget || !isUnverifiedPageTransitionCommand(options.command, options.subcommand))
151
- return observedTarget ?? options.previousTarget;
152
- return undefined;
153
- }
154
- function extractRefSnapshotRefs(data) {
155
- if (!isRecord(data) || !isRecord(data.refs))
156
- return undefined;
157
- const snapshotLines = typeof data.snapshot === "string" ? parseSnapshotLines(data.snapshot) : [];
158
- const lineByRef = new Map(snapshotLines.flatMap((line) => line.ref ? [[line.ref, line.raw]] : []));
159
- const entries = enrichSnapshotRefEntries(getSnapshotRefEntries(data), snapshotLines);
160
- const refs = Object.fromEntries(entries.flatMap((entry) => {
161
- if (!/^e\d+$/.test(entry.id) || entry.role.length === 0)
162
- return [];
163
- const isContentEditable = getEditableRefEvidence({ ref: entry.refData, text: lineByRef.get(entry.id) });
164
- return [[entry.id, { ...(isContentEditable === true ? { isContentEditable: true } : {}), ...(entry.isEditable !== undefined ? { isEditable: entry.isEditable } : {}), name: entry.name, role: entry.role }]];
165
- }));
166
- return Object.keys(refs).length > 0 ? refs : undefined;
167
- }
168
- export function extractRefSnapshotFromData(value) {
169
- if (detectConfirmationRequired(value))
170
- return undefined;
171
- const data = getFullSnapshotData(value);
172
- if (!data)
173
- return undefined;
174
- const refs = extractRefSnapshotRefs(data);
175
- return {
176
- refIds: isRecord(data.refs) ? Object.keys(data.refs).filter((refId) => /^e\d+$/.test(refId)) : [],
177
- ...(refs ? { refs } : {}),
178
- target: extractSessionTabTargetFromData(data),
179
- };
180
- }
181
- function getBatchResultFailureText(item) {
182
- const result = isRecord(item.result) ? item.result : undefined;
183
- const parts = [item.error, result?.error, typeof item.result === "string" ? item.result : undefined]
184
- .filter((part) => typeof part === "string" && part.trim().length > 0);
185
- return parts.length > 0 ? parts.join("\n") : undefined;
186
- }
187
- export function buildNoActivePageRefSnapshotInvalidation() {
188
- return {
189
- reason: "no-active-page",
190
- summary: "The latest snapshot for this session reported No active page. Old page-scoped refs are invalid until snapshot -i succeeds.",
191
- };
192
- }
193
- export function buildPageTransitionRefSnapshotInvalidation(summary) {
194
- return {
195
- reason: "page-transition",
196
- summary: summary ?? "Recording starts and URL-bearing restarts conservatively invalidate earlier page-scoped refs. Run snapshot -i before using refs; this is not evidence of a page change.",
197
- };
198
- }
199
- export function getCommandRefSnapshotInvalidation(commandTokens) {
200
- if (isRecordPageTransitionCommand(commandTokens))
201
- return buildPageTransitionRefSnapshotInvalidation();
202
- if (isWindowOrDiffPageTransitionCommand(commandTokens[0], commandTokens[1])) {
203
- return buildPageTransitionRefSnapshotInvalidation("A window new or diff url command replaced or navigated the active page and invalidated prior refs. Run snapshot -i before using page-scoped refs.");
204
- }
205
- if (isWebMcpPageMutationCommand(commandTokens)) {
206
- return buildPageTransitionRefSnapshotInvalidation("A WebMCP invoke, result, or cancel command can mutate, rerender, or navigate the page, so the prior snapshot refs were invalidated. Run snapshot -i before using page-scoped refs.");
207
- }
208
- return undefined;
209
- }
210
- export function isNoActivePageSnapshotFailure(command, text) {
211
- return command === "snapshot" && /\bno active page\b/i.test(text ?? "");
212
- }
213
- export function extractLatestRefSnapshotStateFromBatchResults(data) {
214
- if (!Array.isArray(data))
215
- return undefined;
216
- let latestState;
217
- for (const item of data) {
218
- if (!isRecord(item))
219
- continue;
220
- const commandTokens = extractUpstreamCommandTokens(extractBatchResultCommand(item));
221
- const [name] = commandTokens;
222
- if (item.success !== false && !detectConfirmationRequired(item.result) && (isCloseCommand(name) || isSuccessfulNativeConfirmedClose(commandTokens, item.result))) {
223
- latestState = undefined;
224
- continue;
225
- }
226
- const transitionInvalidation = getCommandRefSnapshotInvalidation(commandTokens);
227
- if (transitionInvalidation) {
228
- latestState = { invalidation: transitionInvalidation };
229
- continue;
230
- }
231
- if (name !== "snapshot")
232
- continue;
233
- if (item.success === false) {
234
- if (isNoActivePageSnapshotFailure(name, getBatchResultFailureText(item))) {
235
- latestState = { invalidation: buildNoActivePageRefSnapshotInvalidation() };
236
- }
237
- continue;
238
- }
239
- const snapshot = extractRefSnapshotFromData(item.result);
240
- if (snapshot) {
241
- latestState = { snapshot };
242
- }
243
- else if (isRecord(item.result) && isRecord(item.result.snapshot)) {
244
- latestState = { refreshArgs: commandTokens.filter((token) => token !== "--delta" && token !== "--full") };
245
- }
246
- }
247
- return latestState;
248
- }
249
- function shouldApplyTabTargetUpdate(current, unknownOrder, updateOrder) {
250
- return updateOrder >= Math.max(current?.order ?? 0, unknownOrder ?? 0);
251
- }
252
- function shouldApplyRefStateUpdate(options) {
253
- const currentOrder = Math.max(options.currentSnapshot?.order ?? 0, options.currentInvalidation?.order ?? 0);
254
- return options.updateOrder >= currentOrder;
255
- }
256
- function stripRefSnapshotOrder(snapshot) {
257
- return snapshot ? { ...(snapshot.snapshotId ? { snapshotId: snapshot.snapshotId } : {}), ...(snapshot.generation ? { generation: snapshot.generation } : {}), refIds: snapshot.refIds, ...(snapshot.refs ? { refs: snapshot.refs } : {}), target: snapshot.target } : undefined;
258
- }
259
- function stripRefSnapshotInvalidationOrder(invalidation) {
260
- return invalidation ? { reason: invalidation.reason, summary: invalidation.summary } : undefined;
261
- }
262
- export function getSessionPageStateKey(sessionName, namespace) {
263
- return sessionName ? getAgentBrowserSessionIdentityKey(sessionName, namespace) : undefined;
264
- }
2
+ import { randomUUID } from "node:crypto";
3
+ import { getAgentBrowserSessionIdentityKey, isAgentBrowserSessionIdentityKeyInNamespace, } from "./argv-grammar.js";
4
+ import { getBrowserRecord, snapshotFromDefinition, } from "./browser-transcript.js";
5
+ import { findReadConfirmation as findPendingReadConfirmation, parseReadConfirmation, } from "./read-confirmation.js";
6
+ import { buildPageTransitionRefSnapshotInvalidation, stripRefSnapshotOrder, stripRefSnapshotInvalidationOrder, shouldApplyTabTargetUpdate, shouldApplyRefStateUpdate, } from "./session-page-observation.js";
7
+ export * from "./session-page-observation.js";
265
8
  export class SessionPageState {
266
9
  confirmActions = new Map();
267
10
  readConfirmations = new Map();
@@ -277,11 +20,13 @@ export class SessionPageState {
277
20
  const state = new SessionPageState();
278
21
  for (const entry of branch) {
279
22
  const record = getBrowserRecord(entry);
280
- if (record)
23
+ if (record) {
281
24
  state.applyBrowserRecord(record);
25
+ }
282
26
  }
283
- for (const key of state.tabTargets.keys())
27
+ for (const key of state.tabTargets.keys()) {
284
28
  state.tabPinningReasons.set(key, "restore");
29
+ }
285
30
  return state;
286
31
  }
287
32
  /** A command operates on its admitted state while the committed view is unavailable. */
@@ -300,73 +45,142 @@ export class SessionPageState {
300
45
  return state;
301
46
  }
302
47
  views() {
303
- return new Map([...new Set([...this.confirmActions.keys(), ...this.tabTargets.keys(), ...this.tabTargetUnknownOrders.keys(), ...this.refSnapshots.keys(), ...this.refSnapshotInvalidations.keys()])].map(key => [key, this.get(key)]));
48
+ return new Map([
49
+ ...new Set([
50
+ ...this.confirmActions.keys(),
51
+ ...this.tabTargets.keys(),
52
+ ...this.tabTargetUnknownOrders.keys(),
53
+ ...this.refSnapshots.keys(),
54
+ ...this.refSnapshotInvalidations.keys(),
55
+ ]),
56
+ ].map((key) => [key, this.get(key)]));
304
57
  }
305
58
  /** The same reducer commits live observations and replays selected journal envelopes. */
306
59
  applyBrowserRecord({ event, snapshot }) {
307
60
  const update = this.beginUpdate();
308
61
  const confirmation = parseReadConfirmation(event.state.readConfirmation);
309
62
  for (const page of event.pages ?? []) {
310
- const key = page.key;
311
- if (page.clear) {
312
- this.clearSession(key);
313
- continue;
314
- }
315
- const pending = this.pending.get(key);
316
- if (event.phase === "finish" && pending && pending.operationId !== event.operationId)
317
- continue;
318
- if (page.confirmActions !== undefined)
319
- this.setConfirmActions(key, page.confirmActions ?? undefined);
320
- if (event.phase === "begin") {
321
- this.pending.set(key, { operationId: event.operationId, snapshot: this.refSnapshots.get(key) ?? this.pending.get(key)?.snapshot });
322
- this.markTabTargetUnknown({ sessionName: key, update });
323
- this.applyRefSnapshotInvalidation({ sessionName: key, update, invalidation: buildPageTransitionRefSnapshotInvalidation("This browser operation has no persisted finish. Inspect the current URL and take a fresh snapshot before using refs; changes may already have happened.") });
324
- continue;
325
- }
326
- if (page.unknown || page.refs.kind === "unknown") {
327
- this.markTabTargetUnknown({ sessionName: key, update });
328
- this.applyRefSnapshotInvalidation({ sessionName: key, update, invalidation: page.refs.kind === "unknown" && page.refs.invalidation
329
- ? page.refs.invalidation : buildPageTransitionRefSnapshotInvalidation("The browser target or operation outcome is unknown. Verify the current URL and take a fresh snapshot before using refs.") });
330
- continue;
63
+ this.applyPageRecord({ page, event, snapshot, update });
64
+ }
65
+ if (confirmation) {
66
+ this.applyReadConfirmation(confirmation, update);
67
+ }
68
+ }
69
+ applyPageRecord(options) {
70
+ const { page, event, snapshot, update } = options;
71
+ const key = page.key;
72
+ if (page.clear === true) {
73
+ this.clearSession(key);
74
+ return;
75
+ }
76
+ const pending = this.pending.get(key);
77
+ if (event.phase === "finish" && pending && pending.operationId !== event.operationId) {
78
+ return;
79
+ }
80
+ if (page.confirmActions !== undefined) {
81
+ this.setConfirmActions(key, page.confirmActions ?? undefined);
82
+ }
83
+ if (this.applyUnknownPageRecord(page, event, update)) {
84
+ return;
85
+ }
86
+ this.applyPageTargetRecord(page, update);
87
+ this.applyPageRefsRecord({
88
+ page,
89
+ snapshot,
90
+ candidate: pending?.snapshot ?? this.refSnapshots.get(key),
91
+ update,
92
+ });
93
+ this.pending.delete(key);
94
+ }
95
+ applyUnknownPageRecord(page, event, update) {
96
+ const key = page.key;
97
+ if (event.phase === "begin") {
98
+ this.pending.set(key, {
99
+ operationId: event.operationId,
100
+ snapshot: this.refSnapshots.get(key) ?? this.pending.get(key)?.snapshot,
101
+ });
102
+ this.invalidateUnknownPage(key, update, buildPageTransitionRefSnapshotInvalidation("This browser operation has no persisted finish. Inspect the current URL and take a fresh snapshot before using refs; changes may already have happened."));
103
+ return true;
104
+ }
105
+ if (page.unknown === true || page.refs.kind === "unknown") {
106
+ this.invalidateUnknownPage(key, update, page.refs.kind === "unknown" && page.refs.invalidation
107
+ ? page.refs.invalidation
108
+ : buildPageTransitionRefSnapshotInvalidation("The browser target or operation outcome is unknown. Verify the current URL and take a fresh snapshot before using refs."));
109
+ return true;
110
+ }
111
+ return false;
112
+ }
113
+ invalidateUnknownPage(key, update, invalidation) {
114
+ this.markTabTargetUnknown({ sessionName: key, update });
115
+ this.applyRefSnapshotInvalidation({ sessionName: key, update, invalidation });
116
+ }
117
+ applyPageTargetRecord(page, update) {
118
+ if (page.target) {
119
+ this.applyTabTarget({ sessionName: page.key, target: page.target, update });
120
+ }
121
+ else {
122
+ this.tabTargets.delete(page.key);
123
+ this.tabTargetUnknownOrders.delete(page.key);
124
+ }
125
+ if (page.reopenPending !== undefined) {
126
+ this.setTabReopenPending({ pending: page.reopenPending, sessionName: page.key, update });
127
+ }
128
+ if (page.pinningReason !== undefined) {
129
+ this.markPinning(page.key, page.pinningReason);
130
+ }
131
+ else {
132
+ this.tabPinningReasons.delete(page.key);
133
+ }
134
+ }
135
+ applyPageRefsRecord(options) {
136
+ const { page, snapshot, candidate, update } = options;
137
+ const key = page.key;
138
+ if (page.refs.kind === "replace") {
139
+ const definition = isRecord(snapshot) && snapshot.id === page.refs.snapshotId && Boolean(snapshot.refs)
140
+ ? snapshotFromDefinition(snapshot)
141
+ : { snapshotId: page.refs.snapshotId, refIds: [] };
142
+ this.applyRefSnapshot({
143
+ sessionName: key,
144
+ snapshot: definition,
145
+ fallbackTarget: page.target,
146
+ update,
147
+ });
148
+ }
149
+ else if (page.refs.kind === "reuse") {
150
+ if (candidate?.snapshotId === page.refs.snapshotId) {
151
+ this.applyRefSnapshot({
152
+ sessionName: key,
153
+ snapshot: candidate,
154
+ fallbackTarget: page.target,
155
+ update,
156
+ });
331
157
  }
332
- if (page.target)
333
- this.applyTabTarget({ sessionName: key, target: page.target, update });
334
158
  else {
335
- this.tabTargets.delete(key);
336
- this.tabTargetUnknownOrders.delete(key);
337
- }
338
- if (page.reopenPending !== undefined)
339
- this.setTabReopenPending({ pending: page.reopenPending, sessionName: key, update });
340
- if (page.pinningReason)
341
- this.markPinning(key, page.pinningReason);
342
- else
343
- this.tabPinningReasons.delete(key);
344
- if (page.refs.kind === "replace") {
345
- const definition = snapshot?.id === page.refs.snapshotId && snapshot.refs ? snapshotFromDefinition(snapshot)
346
- : { snapshotId: page.refs.snapshotId, refIds: [] };
347
- this.applyRefSnapshot({ sessionName: key, snapshot: definition, fallbackTarget: page.target, update });
159
+ this.applyRefSnapshotInvalidation({
160
+ sessionName: key,
161
+ update,
162
+ invalidation: buildPageTransitionRefSnapshotInvalidation("The ancestral snapshot definition is unavailable. Take a new complete snapshot before using refs."),
163
+ });
348
164
  }
349
- else if (page.refs.kind === "reuse") {
350
- const candidate = pending?.snapshot ?? this.refSnapshots.get(key);
351
- if (candidate?.snapshotId === page.refs.snapshotId)
352
- this.applyRefSnapshot({ sessionName: key, snapshot: candidate, fallbackTarget: page.target, update });
353
- else
354
- this.applyRefSnapshotInvalidation({ sessionName: key, update, invalidation: buildPageTransitionRefSnapshotInvalidation("The ancestral snapshot definition is unavailable. Take a new complete snapshot before using refs.") });
165
+ }
166
+ else {
167
+ this.refSnapshots.delete(key);
168
+ if (page.refs.invalidation) {
169
+ this.applyRefSnapshotInvalidation({
170
+ sessionName: key,
171
+ invalidation: page.refs.invalidation,
172
+ update,
173
+ });
355
174
  }
356
175
  else {
357
- this.refSnapshots.delete(key);
358
- if (page.refs.invalidation)
359
- this.applyRefSnapshotInvalidation({ sessionName: key, invalidation: page.refs.invalidation, update });
360
- else
361
- this.refSnapshotInvalidations.delete(key);
176
+ this.refSnapshotInvalidations.delete(key);
362
177
  }
363
- this.pending.delete(key);
364
178
  }
365
- if (confirmation)
366
- this.applyReadConfirmation(confirmation, update);
367
179
  }
368
180
  beginUpdate() {
369
181
  this.updateOrder += 1;
182
+ // This sole constructor brands the privately incremented numeric order without changing runtime comparison semantics.
183
+ // oxlint-disable-next-line typescript/no-unsafe-type-assertion
370
184
  return this.updateOrder;
371
185
  }
372
186
  reset() {
@@ -382,12 +196,17 @@ export class SessionPageState {
382
196
  this.updateOrder = 0;
383
197
  }
384
198
  get(sessionName) {
385
- if (!sessionName)
199
+ if (sessionName === undefined || sessionName.length === 0) {
386
200
  return {};
201
+ }
387
202
  return {
388
- ...(this.confirmActions.has(sessionName) ? { confirmActions: this.confirmActions.get(sessionName) } : {}),
203
+ ...(this.confirmActions.has(sessionName)
204
+ ? { confirmActions: this.confirmActions.get(sessionName) }
205
+ : {}),
389
206
  pinningReason: this.tabPinningReasons.get(sessionName),
390
- ...(this.tabTargets.get(sessionName)?.reopenPending !== undefined ? { tabReopenPending: this.tabTargets.get(sessionName)?.reopenPending } : {}),
207
+ ...(this.tabTargets.get(sessionName)?.reopenPending !== undefined
208
+ ? { tabReopenPending: this.tabTargets.get(sessionName)?.reopenPending }
209
+ : {}),
391
210
  refSnapshot: stripRefSnapshotOrder(this.refSnapshots.get(sessionName)),
392
211
  refSnapshotInvalidation: stripRefSnapshotInvalidationOrder(this.refSnapshotInvalidations.get(sessionName)),
393
212
  ...(this.tabTargetUnknownOrders.has(sessionName) ? { tabTargetUnknown: true } : {}),
@@ -395,21 +214,24 @@ export class SessionPageState {
395
214
  };
396
215
  }
397
216
  findReadConfirmation(args, namespace, stdin) {
398
- return findPendingReadConfirmation(args, [...this.readConfirmations.values()].map(entry => entry.value), namespace, stdin);
217
+ return findPendingReadConfirmation(args, [...this.readConfirmations.values()].map((entry) => entry.value), namespace, stdin);
399
218
  }
400
219
  setConfirmActions(sessionName, value) {
401
- if (value !== undefined)
220
+ if (value !== undefined) {
402
221
  this.confirmActions.set(sessionName, value);
403
- else
222
+ }
223
+ else {
404
224
  this.confirmActions.delete(sessionName);
225
+ }
405
226
  }
406
227
  getReadConfirmation(sessionKey) {
407
228
  return this.readConfirmations.get(sessionKey)?.value;
408
229
  }
409
230
  applyReadConfirmation(value, update) {
410
231
  const key = getAgentBrowserSessionIdentityKey(value.sessionName, value.namespace);
411
- if (update >= (this.readConfirmations.get(key)?.order ?? 0))
232
+ if (update >= (this.readConfirmations.get(key)?.order ?? 0)) {
412
233
  this.readConfirmations.set(key, { value, order: update });
234
+ }
413
235
  }
414
236
  applyTabTarget(options) {
415
237
  const current = this.tabTargets.get(options.sessionName);
@@ -417,14 +239,24 @@ export class SessionPageState {
417
239
  return { ...this.get(options.sessionName), applied: false, stale: true };
418
240
  }
419
241
  this.tabTargetUnknownOrders.delete(options.sessionName);
420
- this.tabTargets.set(options.sessionName, { order: options.update, reopenPending: current?.reopenPending, target: options.target });
242
+ this.tabTargets.set(options.sessionName, {
243
+ order: options.update,
244
+ reopenPending: current?.reopenPending,
245
+ target: options.target,
246
+ });
421
247
  return { ...this.get(options.sessionName), applied: true };
422
248
  }
423
249
  setTabReopenPending(options) {
424
250
  const current = this.tabTargets.get(options.sessionName);
425
- if (!current || !shouldApplyTabTargetUpdate(current, this.tabTargetUnknownOrders.get(options.sessionName), options.update))
251
+ if (!current ||
252
+ !shouldApplyTabTargetUpdate(current, this.tabTargetUnknownOrders.get(options.sessionName), options.update)) {
426
253
  return;
427
- this.tabTargets.set(options.sessionName, { ...current, order: options.update, reopenPending: options.pending });
254
+ }
255
+ this.tabTargets.set(options.sessionName, {
256
+ ...current,
257
+ order: options.update,
258
+ reopenPending: options.pending,
259
+ });
428
260
  }
429
261
  applyRefSnapshot(options) {
430
262
  if (!shouldApplyRefStateUpdate({
@@ -434,19 +266,27 @@ export class SessionPageState {
434
266
  })) {
435
267
  return { ...this.get(options.sessionName), applied: false, stale: true };
436
268
  }
437
- const snapshot = { ...options.snapshot, generation: options.snapshot.generation ?? this.nativeGenerations.get(options.sessionName), snapshotId: options.snapshot.snapshotId ?? randomUUID(), target: options.snapshot.target ?? options.fallbackTarget };
269
+ const snapshot = {
270
+ ...options.snapshot,
271
+ generation: options.snapshot.generation ?? this.nativeGenerations.get(options.sessionName),
272
+ snapshotId: options.snapshot.snapshotId ?? randomUUID(),
273
+ target: options.snapshot.target ?? options.fallbackTarget,
274
+ };
438
275
  this.refSnapshotInvalidations.delete(options.sessionName);
439
276
  this.refSnapshots.set(options.sessionName, { ...snapshot, order: options.update });
440
277
  return { ...this.get(options.sessionName), applied: true };
441
278
  }
442
279
  bindSnapshotGeneration(sessionName, generation) {
443
- if (generation)
280
+ if (generation !== undefined && generation.length > 0) {
444
281
  this.nativeGenerations.set(sessionName, generation);
445
- else
282
+ }
283
+ else {
446
284
  this.nativeGenerations.delete(sessionName);
285
+ }
447
286
  const snapshot = this.refSnapshots.get(sessionName);
448
- if (snapshot)
287
+ if (snapshot) {
449
288
  this.refSnapshots.set(sessionName, { ...snapshot, generation });
289
+ }
450
290
  }
451
291
  applyRefSnapshotInvalidation(options) {
452
292
  if (!shouldApplyRefStateUpdate({
@@ -457,13 +297,17 @@ export class SessionPageState {
457
297
  return { ...this.get(options.sessionName), applied: false, stale: true };
458
298
  }
459
299
  this.refSnapshots.delete(options.sessionName);
460
- this.refSnapshotInvalidations.set(options.sessionName, { ...options.invalidation, order: options.update });
300
+ this.refSnapshotInvalidations.set(options.sessionName, {
301
+ ...options.invalidation,
302
+ order: options.update,
303
+ });
461
304
  return { ...this.get(options.sessionName), applied: true };
462
305
  }
463
306
  markTabTargetUnknown(options) {
464
307
  const current = this.tabTargets.get(options.sessionName);
465
- if (!shouldApplyTabTargetUpdate(current, this.tabTargetUnknownOrders.get(options.sessionName), options.update))
308
+ if (!shouldApplyTabTargetUpdate(current, this.tabTargetUnknownOrders.get(options.sessionName), options.update)) {
466
309
  return { ...this.get(options.sessionName), applied: false, stale: true };
310
+ }
467
311
  this.refSnapshotInvalidations.delete(options.sessionName);
468
312
  this.refSnapshots.delete(options.sessionName);
469
313
  this.tabPinningReasons.delete(options.sessionName);
@@ -493,8 +337,9 @@ export class SessionPageState {
493
337
  ...this.tabTargets.keys(),
494
338
  ]);
495
339
  for (const sessionKey of sessionKeys) {
496
- if (isAgentBrowserSessionIdentityKeyInNamespace(sessionKey, namespace))
340
+ if (isAgentBrowserSessionIdentityKeyInNamespace(sessionKey, namespace)) {
497
341
  this.clearSession(sessionKey);
342
+ }
498
343
  }
499
344
  }
500
345
  markPinning(sessionName, reason) {