pi-agent-browser-native 0.9.2 → 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 (392) hide show
  1. package/CHANGELOG.md +91 -5
  2. package/README.md +120 -86
  3. package/dist/extensions/agent-browser/index.js +43065 -2016
  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 +113 -49
  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 -81
  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 +44 -9
  82. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +107 -66
  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 +171 -57
  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 +204 -108
  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 -199
  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 -1114
  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 -910
  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 -753
  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 -816
  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 -139
  228. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  229. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +198 -98
  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 +59 -243
  236. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  237. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +134 -68
  238. package/dist/extensions/agent-browser/lib/playbook.js +18 -14
  239. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  240. package/dist/extensions/agent-browser/lib/process-environment.js +22 -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 +146 -537
  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 +138 -35
  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 -10
  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 +93 -66
  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 -552
  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 -1019
  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 +117 -237
  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 -248
  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 +123 -123
  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 -1037
  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 +188 -324
  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 +22 -10
  360. package/docs/CODE_QUALITY.md +242 -0
  361. package/docs/COMMAND_REFERENCE.md +264 -229
  362. package/docs/ELECTRON.md +53 -44
  363. package/docs/RELEASE.md +21 -17
  364. package/docs/REQUIREMENTS.md +2 -0
  365. package/docs/SESSION_STORAGE.md +1 -1
  366. package/docs/SUPPORT_MATRIX.md +84 -77
  367. package/docs/TOOL_CONTRACT.md +165 -130
  368. package/docs/platform-smoke.md +5 -5
  369. package/package.json +143 -120
  370. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  371. package/scripts/agent-browser-target.mjs +6 -2
  372. package/scripts/build.mjs +37 -8
  373. package/scripts/capability-core-commands.mjs +193 -0
  374. package/scripts/capability-options.mjs +283 -0
  375. package/scripts/capability-samples.mjs +133 -0
  376. package/scripts/capability-section.mjs +11 -0
  377. package/scripts/config.mjs +213 -114
  378. package/scripts/convert-browser-session.mjs +30 -9
  379. package/scripts/doctor-sources.mjs +195 -0
  380. package/scripts/doctor.mjs +92 -247
  381. package/scripts/platform-smoke/artifacts.mjs +38 -11
  382. package/scripts/platform-smoke/commands.mjs +104 -0
  383. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  384. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  385. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  386. package/scripts/platform-smoke/doctor.mjs +212 -320
  387. package/scripts/platform-smoke/lease-evidence.mjs +134 -0
  388. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  389. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  390. package/scripts/platform-smoke/targets.mjs +158 -472
  391. package/scripts/platform-smoke.mjs +55 -40
  392. package/scripts/prepare.mjs +16 -7
@@ -1,263 +1,12 @@
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 { findReadConfirmation as findPendingReadConfirmation, parseReadConfirmation } from "./read-confirmation.js";
8
- import { getEditableRefEvidence } from "./results/editable-ref-evidence.js";
9
- import { enrichSnapshotRefEntries, getFullSnapshotData, getSnapshotRefEntries } from "./results/snapshot-refs.js";
10
- import { parseSnapshotLines } from "./results/snapshot-segments.js";
11
- export function normalizeComparableUrl(url) {
12
- const normalizedUrl = url?.trim();
13
- if (!normalizedUrl) {
14
- return undefined;
15
- }
16
- try {
17
- const parsedUrl = new URL(normalizedUrl);
18
- parsedUrl.hash = "";
19
- return parsedUrl.toString();
20
- }
21
- catch {
22
- return undefined;
23
- }
24
- }
25
- export function normalizeSessionTabTarget(target) {
26
- if (!target) {
27
- return undefined;
28
- }
29
- const url = target.url?.trim();
30
- if (!url || normalizeComparableUrl(url) === undefined) {
31
- return undefined;
32
- }
33
- const title = target.title?.trim();
34
- return { ...(target.targetId?.trim() ? { targetId: target.targetId.trim() } : {}), title: title && title.length > 0 ? title : undefined, url };
35
- }
36
- export function isAboutBlankUrl(url) {
37
- return normalizeComparableUrl(url) === "about:blank";
38
- }
39
- export function isAboutBlankSessionTabTarget(target) {
40
- return isAboutBlankUrl(target?.url);
41
- }
42
- export function commandExplicitlyTargetsAboutBlank(commandTokens) {
43
- return (commandTokens[0] === "window" && commandTokens[1] === "new") || commandTokens.some((token) => isAboutBlankUrl(token));
44
- }
45
- export function targetsMatch(left, right) {
46
- if (!left || !right)
47
- return true;
48
- return normalizeComparableUrl(left.url) === normalizeComparableUrl(right.url);
49
- }
50
- function extractStringResultField(data, fieldName) {
51
- if (typeof data === "string") {
52
- if (fieldName === "value")
53
- return data;
54
- const text = data.trim();
55
- return text.length > 0 ? text : undefined;
56
- }
57
- if (!isRecord(data) || typeof data[fieldName] !== "string") {
58
- return undefined;
59
- }
60
- if (fieldName === "value")
61
- return data[fieldName];
62
- const text = data[fieldName].trim();
63
- return text.length > 0 ? text : undefined;
64
- }
65
- function extractSessionTabTargetFromData(data) {
66
- const directTarget = normalizeSessionTabTarget({
67
- targetId: isRecord(data) && typeof data.targetId === "string" ? data.targetId : undefined,
68
- title: extractStringResultField(data, "title"),
69
- url: extractStringResultField(data, "url"),
70
- });
71
- if (directTarget) {
72
- return directTarget;
73
- }
74
- if (isRecord(data) && typeof data.origin === "string") {
75
- return normalizeSessionTabTarget({ url: data.origin });
76
- }
77
- return undefined;
78
- }
79
- function extractBatchResultCommand(item) {
80
- return Array.isArray(item.command) ? item.command.filter((token) => typeof token === "string") : [];
81
- }
82
- export function extractSessionTabTargetFromCommandData(commandTokens, data) {
83
- const [command, subcommand] = commandTokens;
84
- if (command === "get" && subcommand === "url") {
85
- return normalizeSessionTabTarget({ url: extractStringResultField(data, "url") ?? extractStringResultField(data, "result") });
86
- }
87
- return isReadOnlyDiagnosticSessionTargetCommand(command, subcommand) ? undefined : extractSessionTabTargetFromData(data);
88
- }
89
- export function extractSessionTabTargetFromBatchResults(data) {
90
- if (!Array.isArray(data)) {
91
- return undefined;
92
- }
93
- let currentTarget;
94
- let pendingTitle;
95
- for (const item of data) {
96
- if (!isRecord(item))
97
- continue;
98
- // Only this row's native identity can describe the active tab after it ran.
99
- if (currentTarget?.targetId)
100
- currentTarget = normalizeSessionTabTarget({ title: currentTarget.title, url: currentTarget.url });
101
- const commandTokens = extractUpstreamCommandTokens(extractBatchResultCommand(item));
102
- const [name, subcommand] = commandTokens;
103
- if (isOpenNavigationCommand(name) || isUnverifiedPageTransitionCommand(name, subcommand)
104
- || (name === "click" && commandTokens.includes("--new-tab"))) {
105
- currentTarget = undefined;
106
- pendingTitle = undefined;
107
- }
108
- if (item.success === false)
109
- continue;
110
- const result = item.result;
111
- if (isCloseCommand(name)) {
112
- currentTarget = undefined;
113
- pendingTitle = undefined;
114
- continue;
115
- }
116
- if (name === "get" && subcommand === "title") {
117
- pendingTitle = extractStringResultField(result, "title");
118
- continue;
119
- }
120
- if (name === "get" && subcommand === "url") {
121
- const url = extractStringResultField(result, "url");
122
- const target = normalizeSessionTabTarget({ title: pendingTitle, url });
123
- if (target) {
124
- currentTarget = target;
125
- }
126
- pendingTitle = undefined;
127
- continue;
128
- }
129
- const resultTarget = extractSessionTabTargetFromCommandData([name, subcommand].filter((token) => token !== undefined), result);
130
- if (resultTarget) {
131
- currentTarget = resultTarget;
132
- }
133
- pendingTitle = undefined;
134
- }
135
- return currentTarget;
136
- }
137
- export function deriveSessionTabTarget(options) {
138
- if (isCloseCommand(options.command)) {
139
- return undefined;
140
- }
141
- const commandDataTarget = isReadOnlyDiagnosticSessionTargetCommand(options.command, options.subcommand)
142
- ? undefined
143
- : extractSessionTabTargetFromData(options.data);
144
- const observedTarget = normalizeSessionTabTarget(options.navigationSummary)
145
- ?? extractSessionTabTargetFromBatchResults(options.data)
146
- ?? commandDataTarget;
147
- if (observedTarget || !isUnverifiedPageTransitionCommand(options.command, options.subcommand))
148
- return observedTarget ?? options.previousTarget;
149
- return undefined;
150
- }
151
- function extractRefSnapshotRefs(data) {
152
- if (!isRecord(data) || !isRecord(data.refs))
153
- return undefined;
154
- const snapshotLines = typeof data.snapshot === "string" ? parseSnapshotLines(data.snapshot) : [];
155
- const lineByRef = new Map(snapshotLines.flatMap((line) => line.ref ? [[line.ref, line.raw]] : []));
156
- const entries = enrichSnapshotRefEntries(getSnapshotRefEntries(data), snapshotLines);
157
- const refs = Object.fromEntries(entries.flatMap((entry) => {
158
- if (!/^e\d+$/.test(entry.id) || entry.role.length === 0)
159
- return [];
160
- const isContentEditable = getEditableRefEvidence({ ref: entry.refData, text: lineByRef.get(entry.id) });
161
- return [[entry.id, { ...(isContentEditable === true ? { isContentEditable: true } : {}), ...(entry.isEditable !== undefined ? { isEditable: entry.isEditable } : {}), name: entry.name, role: entry.role }]];
162
- }));
163
- return Object.keys(refs).length > 0 ? refs : undefined;
164
- }
165
- export function extractRefSnapshotFromData(value) {
166
- const data = getFullSnapshotData(value);
167
- if (!data)
168
- return undefined;
169
- const refs = extractRefSnapshotRefs(data);
170
- return {
171
- refIds: isRecord(data.refs) ? Object.keys(data.refs).filter((refId) => /^e\d+$/.test(refId)) : [],
172
- ...(refs ? { refs } : {}),
173
- target: extractSessionTabTargetFromData(data),
174
- };
175
- }
176
- function getBatchResultFailureText(item) {
177
- const result = isRecord(item.result) ? item.result : undefined;
178
- const parts = [item.error, result?.error, typeof item.result === "string" ? item.result : undefined]
179
- .filter((part) => typeof part === "string" && part.trim().length > 0);
180
- return parts.length > 0 ? parts.join("\n") : undefined;
181
- }
182
- export function buildNoActivePageRefSnapshotInvalidation() {
183
- return {
184
- reason: "no-active-page",
185
- summary: "The latest snapshot for this session reported No active page. Old page-scoped refs are invalid until snapshot -i succeeds.",
186
- };
187
- }
188
- export function buildPageTransitionRefSnapshotInvalidation(summary) {
189
- return {
190
- reason: "page-transition",
191
- 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.",
192
- };
193
- }
194
- export function getCommandRefSnapshotInvalidation(commandTokens) {
195
- if (isRecordPageTransitionCommand(commandTokens))
196
- return buildPageTransitionRefSnapshotInvalidation();
197
- if (isWindowOrDiffPageTransitionCommand(commandTokens[0], commandTokens[1])) {
198
- 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.");
199
- }
200
- if (isWebMcpPageMutationCommand(commandTokens)) {
201
- 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.");
202
- }
203
- return undefined;
204
- }
205
- export function isNoActivePageSnapshotFailure(command, text) {
206
- return command === "snapshot" && /\bno active page\b/i.test(text ?? "");
207
- }
208
- export function extractLatestRefSnapshotStateFromBatchResults(data) {
209
- if (!Array.isArray(data))
210
- return undefined;
211
- let latestState;
212
- for (const item of data) {
213
- if (!isRecord(item))
214
- continue;
215
- const commandTokens = extractUpstreamCommandTokens(extractBatchResultCommand(item));
216
- const [name] = commandTokens;
217
- if (item.success !== false && isCloseCommand(name)) {
218
- latestState = undefined;
219
- continue;
220
- }
221
- const transitionInvalidation = getCommandRefSnapshotInvalidation(commandTokens);
222
- if (transitionInvalidation) {
223
- latestState = { invalidation: transitionInvalidation };
224
- continue;
225
- }
226
- if (name !== "snapshot")
227
- continue;
228
- if (item.success === false) {
229
- if (isNoActivePageSnapshotFailure(name, getBatchResultFailureText(item))) {
230
- latestState = { invalidation: buildNoActivePageRefSnapshotInvalidation() };
231
- }
232
- continue;
233
- }
234
- const snapshot = extractRefSnapshotFromData(item.result);
235
- if (snapshot) {
236
- latestState = { snapshot };
237
- }
238
- else if (isRecord(item.result) && isRecord(item.result.snapshot)) {
239
- latestState = { refreshArgs: commandTokens.filter((token) => token !== "--delta" && token !== "--full") };
240
- }
241
- }
242
- return latestState;
243
- }
244
- function shouldApplyTabTargetUpdate(current, unknownOrder, updateOrder) {
245
- return updateOrder >= Math.max(current?.order ?? 0, unknownOrder ?? 0);
246
- }
247
- function shouldApplyRefStateUpdate(options) {
248
- const currentOrder = Math.max(options.currentSnapshot?.order ?? 0, options.currentInvalidation?.order ?? 0);
249
- return options.updateOrder >= currentOrder;
250
- }
251
- function stripRefSnapshotOrder(snapshot) {
252
- return snapshot ? { ...(snapshot.snapshotId ? { snapshotId: snapshot.snapshotId } : {}), ...(snapshot.generation ? { generation: snapshot.generation } : {}), refIds: snapshot.refIds, ...(snapshot.refs ? { refs: snapshot.refs } : {}), target: snapshot.target } : undefined;
253
- }
254
- function stripRefSnapshotInvalidationOrder(invalidation) {
255
- return invalidation ? { reason: invalidation.reason, summary: invalidation.summary } : undefined;
256
- }
257
- export function getSessionPageStateKey(sessionName, namespace) {
258
- return sessionName ? getAgentBrowserSessionIdentityKey(sessionName, namespace) : undefined;
259
- }
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";
260
8
  export class SessionPageState {
9
+ confirmActions = new Map();
261
10
  readConfirmations = new Map();
262
11
  refSnapshotInvalidations = new Map();
263
12
  refSnapshots = new Map();
@@ -271,16 +20,19 @@ export class SessionPageState {
271
20
  const state = new SessionPageState();
272
21
  for (const entry of branch) {
273
22
  const record = getBrowserRecord(entry);
274
- if (record)
23
+ if (record) {
275
24
  state.applyBrowserRecord(record);
25
+ }
276
26
  }
277
- for (const key of state.tabTargets.keys())
27
+ for (const key of state.tabTargets.keys()) {
278
28
  state.tabPinningReasons.set(key, "restore");
29
+ }
279
30
  return state;
280
31
  }
281
32
  /** A command operates on its admitted state while the committed view is unavailable. */
282
33
  fork() {
283
34
  const state = new SessionPageState();
35
+ state.confirmActions = new Map(this.confirmActions);
284
36
  state.readConfirmations = new Map(this.readConfirmations);
285
37
  state.refSnapshotInvalidations = new Map(this.refSnapshotInvalidations);
286
38
  state.refSnapshots = new Map(this.refSnapshots);
@@ -293,74 +45,146 @@ export class SessionPageState {
293
45
  return state;
294
46
  }
295
47
  views() {
296
- return new Map([...new Set([...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)]));
297
57
  }
298
58
  /** The same reducer commits live observations and replays selected journal envelopes. */
299
59
  applyBrowserRecord({ event, snapshot }) {
300
60
  const update = this.beginUpdate();
301
61
  const confirmation = parseReadConfirmation(event.state.readConfirmation);
302
62
  for (const page of event.pages ?? []) {
303
- const key = page.key;
304
- if (event.phase === "begin") {
305
- this.pending.set(key, { operationId: event.operationId, snapshot: this.refSnapshots.get(key) ?? this.pending.get(key)?.snapshot });
306
- this.markTabTargetUnknown({ sessionName: key, update });
307
- 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.") });
308
- continue;
309
- }
310
- if (page.clear) {
311
- this.clearSession(key);
312
- continue;
313
- }
314
- const pending = this.pending.get(key);
315
- if (event.phase === "finish" && pending && pending.operationId !== event.operationId)
316
- continue;
317
- if (page.unknown || page.refs.kind === "unknown") {
318
- this.markTabTargetUnknown({ sessionName: key, update });
319
- this.applyRefSnapshotInvalidation({ sessionName: key, update, invalidation: page.refs.kind === "unknown" && page.refs.invalidation
320
- ? page.refs.invalidation : buildPageTransitionRefSnapshotInvalidation("The browser target or operation outcome is unknown. Verify the current URL and take a fresh snapshot before using refs.") });
321
- 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
+ });
322
157
  }
323
- if (page.target)
324
- this.applyTabTarget({ sessionName: key, target: page.target, update });
325
158
  else {
326
- this.tabTargets.delete(key);
327
- this.tabTargetUnknownOrders.delete(key);
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
+ });
328
164
  }
329
- if (page.reopenPending !== undefined)
330
- this.setTabReopenPending({ pending: page.reopenPending, sessionName: key, update });
331
- if (page.pinningReason)
332
- this.markPinning(key, page.pinningReason);
333
- else
334
- this.tabPinningReasons.delete(key);
335
- if (page.refs.kind === "replace") {
336
- const definition = snapshot?.id === page.refs.snapshotId && snapshot.refs ? snapshotFromDefinition(snapshot)
337
- : { snapshotId: page.refs.snapshotId, refIds: [] };
338
- this.applyRefSnapshot({ sessionName: key, snapshot: definition, fallbackTarget: page.target, update });
339
- }
340
- else if (page.refs.kind === "reuse") {
341
- const candidate = pending?.snapshot ?? this.refSnapshots.get(key);
342
- if (candidate?.snapshotId === page.refs.snapshotId)
343
- this.applyRefSnapshot({ sessionName: key, snapshot: candidate, fallbackTarget: page.target, update });
344
- else
345
- 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
+ });
346
174
  }
347
175
  else {
348
- this.refSnapshots.delete(key);
349
- if (page.refs.invalidation)
350
- this.applyRefSnapshotInvalidation({ sessionName: key, invalidation: page.refs.invalidation, update });
351
- else
352
- this.refSnapshotInvalidations.delete(key);
176
+ this.refSnapshotInvalidations.delete(key);
353
177
  }
354
- this.pending.delete(key);
355
178
  }
356
- if (confirmation)
357
- this.applyReadConfirmation(confirmation, update);
358
179
  }
359
180
  beginUpdate() {
360
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
361
184
  return this.updateOrder;
362
185
  }
363
186
  reset() {
187
+ this.confirmActions.clear();
364
188
  this.readConfirmations.clear();
365
189
  this.pending.clear();
366
190
  this.nativeGenerations.clear();
@@ -372,27 +196,42 @@ export class SessionPageState {
372
196
  this.updateOrder = 0;
373
197
  }
374
198
  get(sessionName) {
375
- if (!sessionName)
199
+ if (sessionName === undefined || sessionName.length === 0) {
376
200
  return {};
201
+ }
377
202
  return {
203
+ ...(this.confirmActions.has(sessionName)
204
+ ? { confirmActions: this.confirmActions.get(sessionName) }
205
+ : {}),
378
206
  pinningReason: this.tabPinningReasons.get(sessionName),
379
- ...(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
+ : {}),
380
210
  refSnapshot: stripRefSnapshotOrder(this.refSnapshots.get(sessionName)),
381
211
  refSnapshotInvalidation: stripRefSnapshotInvalidationOrder(this.refSnapshotInvalidations.get(sessionName)),
382
212
  ...(this.tabTargetUnknownOrders.has(sessionName) ? { tabTargetUnknown: true } : {}),
383
213
  tabTarget: this.tabTargets.get(sessionName)?.target,
384
214
  };
385
215
  }
386
- findReadConfirmation(args, namespace) {
387
- return findPendingReadConfirmation(args, [...this.readConfirmations.values()].map(entry => entry.value), namespace);
216
+ findReadConfirmation(args, namespace, stdin) {
217
+ return findPendingReadConfirmation(args, [...this.readConfirmations.values()].map((entry) => entry.value), namespace, stdin);
218
+ }
219
+ setConfirmActions(sessionName, value) {
220
+ if (value !== undefined) {
221
+ this.confirmActions.set(sessionName, value);
222
+ }
223
+ else {
224
+ this.confirmActions.delete(sessionName);
225
+ }
388
226
  }
389
227
  getReadConfirmation(sessionKey) {
390
228
  return this.readConfirmations.get(sessionKey)?.value;
391
229
  }
392
230
  applyReadConfirmation(value, update) {
393
231
  const key = getAgentBrowserSessionIdentityKey(value.sessionName, value.namespace);
394
- if (update >= (this.readConfirmations.get(key)?.order ?? 0))
232
+ if (update >= (this.readConfirmations.get(key)?.order ?? 0)) {
395
233
  this.readConfirmations.set(key, { value, order: update });
234
+ }
396
235
  }
397
236
  applyTabTarget(options) {
398
237
  const current = this.tabTargets.get(options.sessionName);
@@ -400,14 +239,24 @@ export class SessionPageState {
400
239
  return { ...this.get(options.sessionName), applied: false, stale: true };
401
240
  }
402
241
  this.tabTargetUnknownOrders.delete(options.sessionName);
403
- 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
+ });
404
247
  return { ...this.get(options.sessionName), applied: true };
405
248
  }
406
249
  setTabReopenPending(options) {
407
250
  const current = this.tabTargets.get(options.sessionName);
408
- if (!current || !shouldApplyTabTargetUpdate(current, this.tabTargetUnknownOrders.get(options.sessionName), options.update))
251
+ if (!current ||
252
+ !shouldApplyTabTargetUpdate(current, this.tabTargetUnknownOrders.get(options.sessionName), options.update)) {
409
253
  return;
410
- 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
+ });
411
260
  }
412
261
  applyRefSnapshot(options) {
413
262
  if (!shouldApplyRefStateUpdate({
@@ -417,19 +266,27 @@ export class SessionPageState {
417
266
  })) {
418
267
  return { ...this.get(options.sessionName), applied: false, stale: true };
419
268
  }
420
- 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
+ };
421
275
  this.refSnapshotInvalidations.delete(options.sessionName);
422
276
  this.refSnapshots.set(options.sessionName, { ...snapshot, order: options.update });
423
277
  return { ...this.get(options.sessionName), applied: true };
424
278
  }
425
279
  bindSnapshotGeneration(sessionName, generation) {
426
- if (generation)
280
+ if (generation !== undefined && generation.length > 0) {
427
281
  this.nativeGenerations.set(sessionName, generation);
428
- else
282
+ }
283
+ else {
429
284
  this.nativeGenerations.delete(sessionName);
285
+ }
430
286
  const snapshot = this.refSnapshots.get(sessionName);
431
- if (snapshot)
287
+ if (snapshot) {
432
288
  this.refSnapshots.set(sessionName, { ...snapshot, generation });
289
+ }
433
290
  }
434
291
  applyRefSnapshotInvalidation(options) {
435
292
  if (!shouldApplyRefStateUpdate({
@@ -440,13 +297,17 @@ export class SessionPageState {
440
297
  return { ...this.get(options.sessionName), applied: false, stale: true };
441
298
  }
442
299
  this.refSnapshots.delete(options.sessionName);
443
- this.refSnapshotInvalidations.set(options.sessionName, { ...options.invalidation, order: options.update });
300
+ this.refSnapshotInvalidations.set(options.sessionName, {
301
+ ...options.invalidation,
302
+ order: options.update,
303
+ });
444
304
  return { ...this.get(options.sessionName), applied: true };
445
305
  }
446
306
  markTabTargetUnknown(options) {
447
307
  const current = this.tabTargets.get(options.sessionName);
448
- if (!shouldApplyTabTargetUpdate(current, this.tabTargetUnknownOrders.get(options.sessionName), options.update))
308
+ if (!shouldApplyTabTargetUpdate(current, this.tabTargetUnknownOrders.get(options.sessionName), options.update)) {
449
309
  return { ...this.get(options.sessionName), applied: false, stale: true };
310
+ }
450
311
  this.refSnapshotInvalidations.delete(options.sessionName);
451
312
  this.refSnapshots.delete(options.sessionName);
452
313
  this.tabPinningReasons.delete(options.sessionName);
@@ -455,6 +316,7 @@ export class SessionPageState {
455
316
  return { ...this.get(options.sessionName), applied: true };
456
317
  }
457
318
  clearSession(sessionName) {
319
+ this.confirmActions.delete(sessionName);
458
320
  this.pending.delete(sessionName);
459
321
  this.nativeGenerations.delete(sessionName);
460
322
  this.readConfirmations.delete(sessionName);
@@ -466,6 +328,7 @@ export class SessionPageState {
466
328
  }
467
329
  clearNamespace(namespace) {
468
330
  const sessionKeys = new Set([
331
+ ...this.confirmActions.keys(),
469
332
  ...this.readConfirmations.keys(),
470
333
  ...this.refSnapshotInvalidations.keys(),
471
334
  ...this.refSnapshots.keys(),
@@ -474,8 +337,9 @@ export class SessionPageState {
474
337
  ...this.tabTargets.keys(),
475
338
  ]);
476
339
  for (const sessionKey of sessionKeys) {
477
- if (isAgentBrowserSessionIdentityKeyInNamespace(sessionKey, namespace))
340
+ if (isAgentBrowserSessionIdentityKeyInNamespace(sessionKey, namespace)) {
478
341
  this.clearSession(sessionKey);
342
+ }
479
343
  }
480
344
  }
481
345
  markPinning(sessionName, reason) {