pi-agent-browser-native 0.9.3 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/CHANGELOG.md +77 -5
  2. package/README.md +103 -81
  3. package/dist/extensions/agent-browser/index.js +43057 -2031
  4. package/dist/extensions/agent-browser/lib/argv-descriptor.js +49 -26
  5. package/dist/extensions/agent-browser/lib/argv-grammar.js +82 -93
  6. package/dist/extensions/agent-browser/lib/bash-guard.js +129 -126
  7. package/dist/extensions/agent-browser/lib/batch-lifecycle.js +112 -51
  8. package/dist/extensions/agent-browser/lib/browser-execution-claim-codec.js +61 -0
  9. package/dist/extensions/agent-browser/lib/browser-execution-claim-storage.js +232 -0
  10. package/dist/extensions/agent-browser/lib/browser-execution-claims.js +202 -0
  11. package/dist/extensions/agent-browser/lib/browser-execution-identity.js +77 -0
  12. package/dist/extensions/agent-browser/lib/browser-journal-branch.js +98 -0
  13. package/dist/extensions/agent-browser/lib/browser-journal-contracts.js +1 -0
  14. package/dist/extensions/agent-browser/lib/browser-journal-projection.js +221 -0
  15. package/dist/extensions/agent-browser/lib/browser-journal-reader.js +89 -0
  16. package/dist/extensions/agent-browser/lib/browser-journal-replay.js +246 -0
  17. package/dist/extensions/agent-browser/lib/browser-journal.js +103 -394
  18. package/dist/extensions/agent-browser/lib/browser-legacy-pages.js +220 -0
  19. package/dist/extensions/agent-browser/lib/browser-legacy-projection.js +282 -0
  20. package/dist/extensions/agent-browser/lib/browser-legacy-types.js +1 -0
  21. package/dist/extensions/agent-browser/lib/browser-session-conversion-stream.js +217 -0
  22. package/dist/extensions/agent-browser/lib/browser-session-conversion.js +80 -335
  23. package/dist/extensions/agent-browser/lib/browser-transcript-contracts.js +35 -0
  24. package/dist/extensions/agent-browser/lib/browser-transcript-validation.js +166 -0
  25. package/dist/extensions/agent-browser/lib/browser-transcript.js +137 -82
  26. package/dist/extensions/agent-browser/lib/browser-value-parsing.js +15 -0
  27. package/dist/extensions/agent-browser/lib/command-capabilities.js +340 -0
  28. package/dist/extensions/agent-browser/lib/command-policy.js +107 -88
  29. package/dist/extensions/agent-browser/lib/command-taxonomy.js +49 -322
  30. package/dist/extensions/agent-browser/lib/config-policy.js +138 -343
  31. package/dist/extensions/agent-browser/lib/config-providers.js +71 -0
  32. package/dist/extensions/agent-browser/lib/config-validation.js +218 -0
  33. package/dist/extensions/agent-browser/lib/config.js +19 -7
  34. package/dist/extensions/agent-browser/lib/electron/cdp.js +15 -7
  35. package/dist/extensions/agent-browser/lib/electron/cleanup.js +134 -55
  36. package/dist/extensions/agent-browser/lib/electron/discovery-darwin.js +109 -0
  37. package/dist/extensions/agent-browser/lib/electron/discovery-desktop.js +136 -0
  38. package/dist/extensions/agent-browser/lib/electron/discovery-evidence.js +89 -0
  39. package/dist/extensions/agent-browser/lib/electron/discovery-linux.js +93 -0
  40. package/dist/extensions/agent-browser/lib/electron/discovery-packages.js +162 -0
  41. package/dist/extensions/agent-browser/lib/electron/discovery-types.js +2 -0
  42. package/dist/extensions/agent-browser/lib/electron/discovery.js +140 -549
  43. package/dist/extensions/agent-browser/lib/electron/launch-monitor.js +102 -0
  44. package/dist/extensions/agent-browser/lib/electron/launch-process.js +209 -0
  45. package/dist/extensions/agent-browser/lib/electron/launch-types.js +2 -0
  46. package/dist/extensions/agent-browser/lib/electron/launch.js +249 -354
  47. package/dist/extensions/agent-browser/lib/executable-path.js +21 -12
  48. package/dist/extensions/agent-browser/lib/execution-cwd.js +35 -18
  49. package/dist/extensions/agent-browser/lib/input-modes/electron.js +162 -121
  50. package/dist/extensions/agent-browser/lib/input-modes/job.js +116 -313
  51. package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +104 -0
  52. package/dist/extensions/agent-browser/lib/input-modes/lookup-plan.js +132 -0
  53. package/dist/extensions/agent-browser/lib/input-modes/lookup-redaction.js +57 -0
  54. package/dist/extensions/agent-browser/lib/input-modes/lookup-source-evidence.js +151 -0
  55. package/dist/extensions/agent-browser/lib/input-modes/lookup-workspace.js +142 -0
  56. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +57 -412
  57. package/dist/extensions/agent-browser/lib/input-modes/params.js +63 -17
  58. package/dist/extensions/agent-browser/lib/input-modes/qa-analysis.js +268 -0
  59. package/dist/extensions/agent-browser/lib/input-modes/qa-presentation.js +117 -0
  60. package/dist/extensions/agent-browser/lib/input-modes/script-child.js +396 -0
  61. package/dist/extensions/agent-browser/lib/input-modes/script-protocol.js +86 -0
  62. package/dist/extensions/agent-browser/lib/input-modes/script-types.js +1 -0
  63. package/dist/extensions/agent-browser/lib/input-modes/script-validation.js +60 -0
  64. package/dist/extensions/agent-browser/lib/input-modes/script.js +60 -409
  65. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +218 -128
  66. package/dist/extensions/agent-browser/lib/input-modes/shared.js +15 -4
  67. package/dist/extensions/agent-browser/lib/input-modes/types.js +56 -7
  68. package/dist/extensions/agent-browser/lib/json-schema.js +22 -10
  69. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +17 -5
  70. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +92 -425
  71. package/dist/extensions/agent-browser/lib/managed-session-posix-storage.js +58 -0
  72. package/dist/extensions/agent-browser/lib/managed-session-project-identity.js +244 -0
  73. package/dist/extensions/agent-browser/lib/managed-session-restore-context.js +84 -0
  74. package/dist/extensions/agent-browser/lib/managed-session-restore-policy.js +119 -0
  75. package/dist/extensions/agent-browser/lib/managed-session-restore-state.js +83 -0
  76. package/dist/extensions/agent-browser/lib/managed-session-restore.js +168 -300
  77. package/dist/extensions/agent-browser/lib/managed-session-snapshot-records.js +277 -0
  78. package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +128 -305
  79. package/dist/extensions/agent-browser/lib/managed-session-storage.js +56 -253
  80. package/dist/extensions/agent-browser/lib/native-confirmation.js +140 -0
  81. package/dist/extensions/agent-browser/lib/native-output.js +43 -9
  82. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +106 -59
  83. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-merge.js +14 -6
  84. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +109 -57
  85. package/dist/extensions/agent-browser/lib/orchestration/browser-run/browser-observation-result.js +82 -0
  86. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +164 -60
  87. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostic-values.js +31 -0
  88. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +152 -781
  89. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-observation.js +202 -0
  90. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-text-diagnostics.js +109 -0
  91. package/dist/extensions/agent-browser/lib/orchestration/browser-run/fill-diagnostics.js +119 -0
  92. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-action-recovery.js +147 -0
  93. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-actions.js +144 -0
  94. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-content.js +123 -0
  95. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-contracts.js +1 -0
  96. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-details.js +156 -0
  97. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-electron.js +179 -0
  98. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-evidence.js +39 -0
  99. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-missing-binary.js +89 -0
  100. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-recovery.js +97 -0
  101. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-redaction.js +106 -0
  102. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-timeout.js +110 -0
  103. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +41 -538
  104. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +199 -154
  105. package/dist/extensions/agent-browser/lib/orchestration/browser-run/interaction-diagnostics.js +290 -0
  106. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-close.js +167 -0
  107. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-inspection.js +108 -0
  108. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +127 -205
  109. package/dist/extensions/agent-browser/lib/orchestration/browser-run/native-helper-observation.js +65 -0
  110. package/dist/extensions/agent-browser/lib/orchestration/browser-run/observation-types.js +1 -0
  111. package/dist/extensions/agent-browser/lib/orchestration/browser-run/overlay-diagnostics.js +120 -0
  112. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +113 -30
  113. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +109 -28
  114. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter-data.js +150 -0
  115. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +138 -253
  116. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-rendered-text.js +147 -0
  117. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +59 -24
  118. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-artifacts.js +159 -0
  119. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-command.js +131 -0
  120. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-contracts.js +1 -0
  121. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-daemon.js +93 -0
  122. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-failure.js +42 -0
  123. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-guards.js +242 -0
  124. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-input.js +75 -0
  125. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-observations.js +92 -0
  126. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-selection.js +254 -0
  127. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-state.js +121 -0
  128. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-refs.js +130 -0
  129. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-resources.js +114 -0
  130. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-semantic.js +121 -0
  131. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-session-plan.js +222 -0
  132. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-timeouts.js +68 -0
  133. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +176 -1123
  134. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-analysis.js +191 -0
  135. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-confirmation.js +152 -0
  136. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-diagnostics.js +182 -0
  137. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-electron.js +150 -0
  138. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-contracts.js +1 -0
  139. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase-contracts.js +1 -0
  140. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase.js +115 -0
  141. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle.js +256 -0
  142. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed-contracts.js +1 -0
  143. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed.js +256 -0
  144. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase-contracts.js +1 -0
  145. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase.js +93 -0
  146. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native.js +113 -0
  147. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation-contracts.js +1 -0
  148. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation.js +316 -0
  149. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-ownership.js +28 -0
  150. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase-contracts.js +1 -0
  151. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase.js +142 -0
  152. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation-contracts.js +1 -0
  153. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation.js +333 -0
  154. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase-contracts.js +1 -0
  155. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase.js +71 -0
  156. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication.js +201 -0
  157. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-receipts.js +183 -0
  158. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-refs.js +200 -0
  159. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-tabs.js +142 -0
  160. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +18 -968
  161. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +23 -13
  162. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-receipt-reconciliation.js +198 -0
  163. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-contracts.js +1 -0
  164. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-presentation.js +154 -0
  165. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery.js +68 -151
  166. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-capture.js +14 -0
  167. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-observation.js +169 -46
  168. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-commands.js +130 -0
  169. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-electron.js +210 -0
  170. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-observations.js +61 -0
  171. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-outcomes.js +187 -0
  172. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-refs.js +171 -0
  173. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-tabs.js +228 -0
  174. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +77 -765
  175. package/dist/extensions/agent-browser/lib/orchestration/browser-run/text-visibility-diagnostics.js +182 -0
  176. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-diagnostics.js +256 -0
  177. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-progress.js +108 -0
  178. package/dist/extensions/agent-browser/lib/orchestration/code-artifact-observation.js +39 -0
  179. package/dist/extensions/agent-browser/lib/orchestration/code-image-observation.js +119 -0
  180. package/dist/extensions/agent-browser/lib/orchestration/electron-host/branch.js +92 -0
  181. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup-result.js +58 -0
  182. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup.js +78 -0
  183. package/dist/extensions/agent-browser/lib/orchestration/electron-host/contracts.js +1 -0
  184. package/dist/extensions/agent-browser/lib/orchestration/electron-host/discovery.js +106 -0
  185. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +48 -821
  186. package/dist/extensions/agent-browser/lib/orchestration/electron-host/policy.js +86 -0
  187. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-collection.js +69 -0
  188. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +167 -0
  189. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +164 -0
  190. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe.js +161 -0
  191. package/dist/extensions/agent-browser/lib/orchestration/electron-host/status.js +165 -0
  192. package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +21 -9
  193. package/dist/extensions/agent-browser/lib/orchestration/extension-artifact-preflight.js +211 -0
  194. package/dist/extensions/agent-browser/lib/orchestration/extension-artifacts.js +23 -0
  195. package/dist/extensions/agent-browser/lib/orchestration/extension-attachment-replay.js +99 -0
  196. package/dist/extensions/agent-browser/lib/orchestration/extension-branch-restore.js +275 -0
  197. package/dist/extensions/agent-browser/lib/orchestration/extension-code.js +280 -0
  198. package/dist/extensions/agent-browser/lib/orchestration/extension-command-admission.js +303 -0
  199. package/dist/extensions/agent-browser/lib/orchestration/extension-command-output.js +36 -0
  200. package/dist/extensions/agent-browser/lib/orchestration/extension-command-result.js +335 -0
  201. package/dist/extensions/agent-browser/lib/orchestration/extension-command-run.js +227 -0
  202. package/dist/extensions/agent-browser/lib/orchestration/extension-command-state.js +1 -0
  203. package/dist/extensions/agent-browser/lib/orchestration/extension-electron-ownership.js +204 -0
  204. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-locks.js +139 -0
  205. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-queue.js +24 -0
  206. package/dist/extensions/agent-browser/lib/orchestration/extension-host-coordination.js +98 -0
  207. package/dist/extensions/agent-browser/lib/orchestration/extension-host-run.js +295 -0
  208. package/dist/extensions/agent-browser/lib/orchestration/extension-intent-replay.js +41 -0
  209. package/dist/extensions/agent-browser/lib/orchestration/extension-invocation.js +7 -0
  210. package/dist/extensions/agent-browser/lib/orchestration/extension-lifecycle.js +102 -0
  211. package/dist/extensions/agent-browser/lib/orchestration/extension-managed-ownership.js +133 -0
  212. package/dist/extensions/agent-browser/lib/orchestration/extension-observation.js +120 -0
  213. package/dist/extensions/agent-browser/lib/orchestration/extension-prompt.js +180 -0
  214. package/dist/extensions/agent-browser/lib/orchestration/extension-recording.js +290 -0
  215. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-contracts.js +1 -0
  216. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-replay.js +269 -0
  217. package/dist/extensions/agent-browser/lib/orchestration/extension-result-state.js +113 -0
  218. package/dist/extensions/agent-browser/lib/orchestration/extension-runtime.js +146 -0
  219. package/dist/extensions/agent-browser/lib/orchestration/extension-script-leases.js +58 -0
  220. package/dist/extensions/agent-browser/lib/orchestration/extension-tool-boundary.js +62 -0
  221. package/dist/extensions/agent-browser/lib/orchestration/extension-version-check.js +54 -0
  222. package/dist/extensions/agent-browser/lib/orchestration/input-plan-types.js +1 -0
  223. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +261 -185
  224. package/dist/extensions/agent-browser/lib/orchestration/input-redaction.js +62 -0
  225. package/dist/extensions/agent-browser/lib/orchestration/native-config.js +144 -0
  226. package/dist/extensions/agent-browser/lib/orchestration/native-root-launch.js +77 -0
  227. package/dist/extensions/agent-browser/lib/orchestration/native-session-defaults.js +210 -157
  228. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  229. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +197 -99
  230. package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +199 -96
  231. package/dist/extensions/agent-browser/lib/owned-managed-session-context.js +55 -0
  232. package/dist/extensions/agent-browser/lib/page-target-batch.js +118 -0
  233. package/dist/extensions/agent-browser/lib/page-target-guards.js +50 -0
  234. package/dist/extensions/agent-browser/lib/page-target-navigation.js +104 -0
  235. package/dist/extensions/agent-browser/lib/page-target-validation.js +55 -246
  236. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  237. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +133 -68
  238. package/dist/extensions/agent-browser/lib/playbook.js +16 -12
  239. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  240. package/dist/extensions/agent-browser/lib/process-environment.js +13 -6
  241. package/dist/extensions/agent-browser/lib/process-errors.js +23 -0
  242. package/dist/extensions/agent-browser/lib/process-identity.js +47 -15
  243. package/dist/extensions/agent-browser/lib/process-socket-storage.js +256 -0
  244. package/dist/extensions/agent-browser/lib/process-stdout.js +74 -0
  245. package/dist/extensions/agent-browser/lib/process.js +145 -536
  246. package/dist/extensions/agent-browser/lib/prompt-artifacts.js +287 -0
  247. package/dist/extensions/agent-browser/lib/prompt-policy.js +15 -194
  248. package/dist/extensions/agent-browser/lib/read-command.js +41 -0
  249. package/dist/extensions/agent-browser/lib/read-confirmation.js +131 -68
  250. package/dist/extensions/agent-browser/lib/recording-reservations.js +118 -45
  251. package/dist/extensions/agent-browser/lib/redaction-fields.js +75 -0
  252. package/dist/extensions/agent-browser/lib/redaction-json.js +149 -0
  253. package/dist/extensions/agent-browser/lib/redaction-url.js +88 -0
  254. package/dist/extensions/agent-browser/lib/results/action-contracts.js +1 -0
  255. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +28 -271
  256. package/dist/extensions/agent-browser/lib/results/artifact-contracts.js +1 -0
  257. package/dist/extensions/agent-browser/lib/results/artifact-manifest-validation.js +133 -0
  258. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +96 -94
  259. package/dist/extensions/agent-browser/lib/results/artifact-recommendations.js +73 -0
  260. package/dist/extensions/agent-browser/lib/results/categories.js +111 -54
  261. package/dist/extensions/agent-browser/lib/results/confirmation.js +29 -13
  262. package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +62 -27
  263. package/dist/extensions/agent-browser/lib/results/electron-recommendations.js +83 -0
  264. package/dist/extensions/agent-browser/lib/results/envelope-decoding.js +48 -0
  265. package/dist/extensions/agent-browser/lib/results/envelope.js +90 -67
  266. package/dist/extensions/agent-browser/lib/results/evidence-contracts.js +1 -0
  267. package/dist/extensions/agent-browser/lib/results/failure-recommendations.js +180 -0
  268. package/dist/extensions/agent-browser/lib/results/network-routes.js +86 -45
  269. package/dist/extensions/agent-browser/lib/results/network.js +35 -12
  270. package/dist/extensions/agent-browser/lib/results/next-actions.js +49 -19
  271. package/dist/extensions/agent-browser/lib/results/presentation/artifact-files.js +320 -0
  272. package/dist/extensions/agent-browser/lib/results/presentation/artifact-format.js +138 -0
  273. package/dist/extensions/agent-browser/lib/results/presentation/artifact-images.js +113 -0
  274. package/dist/extensions/agent-browser/lib/results/presentation/artifact-verification.js +145 -0
  275. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +99 -555
  276. package/dist/extensions/agent-browser/lib/results/presentation/batch-contracts.js +1 -0
  277. package/dist/extensions/agent-browser/lib/results/presentation/batch-recording.js +118 -0
  278. package/dist/extensions/agent-browser/lib/results/presentation/batch-redaction.js +68 -0
  279. package/dist/extensions/agent-browser/lib/results/presentation/batch-rendering.js +135 -0
  280. package/dist/extensions/agent-browser/lib/results/presentation/batch-step.js +227 -0
  281. package/dist/extensions/agent-browser/lib/results/presentation/batch-summary.js +91 -0
  282. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +91 -460
  283. package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +9 -5
  284. package/dist/extensions/agent-browser/lib/results/presentation/command-presenters.js +216 -0
  285. package/dist/extensions/agent-browser/lib/results/presentation/common.js +26 -9
  286. package/dist/extensions/agent-browser/lib/results/presentation/content.js +86 -29
  287. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-a11y.js +67 -0
  288. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-health.js +79 -0
  289. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-identity.js +199 -0
  290. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-logs.js +75 -0
  291. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network-actions.js +216 -0
  292. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network.js +124 -0
  293. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-redaction.js +64 -0
  294. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-storage.js +209 -0
  295. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-stream.js +69 -0
  296. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-summary.js +222 -0
  297. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +103 -1052
  298. package/dist/extensions/agent-browser/lib/results/presentation/early-result.js +70 -0
  299. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +130 -60
  300. package/dist/extensions/agent-browser/lib/results/presentation/input-contracts.js +1 -0
  301. package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +60 -145
  302. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +147 -88
  303. package/dist/extensions/agent-browser/lib/results/presentation/notices.js +75 -0
  304. package/dist/extensions/agent-browser/lib/results/presentation/observation-contracts.js +1 -0
  305. package/dist/extensions/agent-browser/lib/results/presentation/observation-rendering.js +127 -0
  306. package/dist/extensions/agent-browser/lib/results/presentation/outcomes.js +120 -0
  307. package/dist/extensions/agent-browser/lib/results/presentation/output-completion.js +77 -0
  308. package/dist/extensions/agent-browser/lib/results/presentation/output-spill.js +51 -0
  309. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +116 -240
  310. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +35 -21
  311. package/dist/extensions/agent-browser/lib/results/presentation/skills.js +104 -73
  312. package/dist/extensions/agent-browser/lib/results/presentation/source.js +109 -0
  313. package/dist/extensions/agent-browser/lib/results/presentation.js +17 -261
  314. package/dist/extensions/agent-browser/lib/results/recommendation-contracts.js +1 -0
  315. package/dist/extensions/agent-browser/lib/results/recording.js +52 -14
  316. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +14 -5
  317. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +30 -22
  318. package/dist/extensions/agent-browser/lib/results/selector-recovery-target.js +83 -0
  319. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +119 -119
  320. package/dist/extensions/agent-browser/lib/results/snapshot-compact.js +266 -0
  321. package/dist/extensions/agent-browser/lib/results/snapshot-content.js +32 -0
  322. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +104 -71
  323. package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +31 -11
  324. package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +125 -66
  325. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +26 -7
  326. package/dist/extensions/agent-browser/lib/results/snapshot.js +28 -248
  327. package/dist/extensions/agent-browser/lib/results/text.js +16 -5
  328. package/dist/extensions/agent-browser/lib/runtime-args-validation.js +133 -0
  329. package/dist/extensions/agent-browser/lib/runtime-compatibility.js +81 -0
  330. package/dist/extensions/agent-browser/lib/runtime-contracts.js +1 -0
  331. package/dist/extensions/agent-browser/lib/runtime-redaction.js +118 -0
  332. package/dist/extensions/agent-browser/lib/runtime-replay-events.js +144 -0
  333. package/dist/extensions/agent-browser/lib/runtime-session-identity.js +76 -0
  334. package/dist/extensions/agent-browser/lib/runtime-session-plan.js +114 -0
  335. package/dist/extensions/agent-browser/lib/runtime-session-replay.js +123 -0
  336. package/dist/extensions/agent-browser/lib/runtime-tab-correction.js +65 -0
  337. package/dist/extensions/agent-browser/lib/runtime-timeouts.js +28 -0
  338. package/dist/extensions/agent-browser/lib/runtime.js +137 -1041
  339. package/dist/extensions/agent-browser/lib/session-identity.js +51 -0
  340. package/dist/extensions/agent-browser/lib/session-page-observation.js +357 -0
  341. package/dist/extensions/agent-browser/lib/session-page-state.js +178 -333
  342. package/dist/extensions/agent-browser/lib/session-page-types.js +1 -0
  343. package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +78 -0
  344. package/dist/extensions/agent-browser/lib/temp-mutation-queue.js +7 -0
  345. package/dist/extensions/agent-browser/lib/temp-root-ownership.js +234 -0
  346. package/dist/extensions/agent-browser/lib/temp-root.js +207 -0
  347. package/dist/extensions/agent-browser/lib/temp.js +33 -446
  348. package/dist/extensions/agent-browser/lib/tool-surface.js +94 -24
  349. package/dist/extensions/agent-browser/lib/upstream-version.js +3 -2
  350. package/dist/extensions/agent-browser/lib/web-search-providers.js +229 -0
  351. package/dist/extensions/agent-browser/lib/web-search-request.js +108 -0
  352. package/dist/extensions/agent-browser/lib/web-search-results.js +281 -0
  353. package/dist/extensions/agent-browser/lib/web-search-schema.js +82 -0
  354. package/dist/extensions/agent-browser/lib/web-search.js +109 -617
  355. package/dist/extensions/agent-browser/lib/webmcp-observation.js +13 -6
  356. package/dist/extensions/agent-browser/lib/windows-stock-launcher.js +63 -37
  357. package/dist/extensions/agent-browser/script-worker.js +80 -43
  358. package/dist/scripts/agent-browser-target.mjs +4 -2
  359. package/docs/ARCHITECTURE.md +17 -5
  360. package/docs/CODE_QUALITY.md +242 -0
  361. package/docs/COMMAND_REFERENCE.md +251 -220
  362. package/docs/ELECTRON.md +53 -44
  363. package/docs/RELEASE.md +18 -15
  364. package/docs/REQUIREMENTS.md +1 -0
  365. package/docs/SUPPORT_MATRIX.md +76 -75
  366. package/docs/TOOL_CONTRACT.md +145 -116
  367. package/docs/platform-smoke.md +5 -5
  368. package/package.json +143 -120
  369. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  370. package/scripts/agent-browser-target.mjs +6 -2
  371. package/scripts/build.mjs +37 -8
  372. package/scripts/capability-core-commands.mjs +193 -0
  373. package/scripts/capability-options.mjs +283 -0
  374. package/scripts/capability-samples.mjs +133 -0
  375. package/scripts/capability-section.mjs +11 -0
  376. package/scripts/config.mjs +213 -114
  377. package/scripts/convert-browser-session.mjs +30 -9
  378. package/scripts/doctor-sources.mjs +195 -0
  379. package/scripts/doctor.mjs +92 -247
  380. package/scripts/platform-smoke/artifacts.mjs +38 -11
  381. package/scripts/platform-smoke/commands.mjs +104 -0
  382. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  383. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  384. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  385. package/scripts/platform-smoke/doctor.mjs +212 -320
  386. package/scripts/platform-smoke/lease-evidence.mjs +134 -0
  387. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  388. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  389. package/scripts/platform-smoke/targets.mjs +158 -472
  390. package/scripts/platform-smoke.mjs +55 -40
  391. package/scripts/prepare.mjs +16 -7
@@ -0,0 +1,221 @@
1
+ import { Readable, Writable } from "node:stream";
2
+ import { pipeline } from "node:stream/promises";
3
+ import { isRecord } from "./parsing.js";
4
+ import { normalizeProcessError } from "./process-errors.js";
5
+ const ENVELOPE_MAX_BYTES = 16 * 1024 * 1024;
6
+ function matches(field, key) {
7
+ return field === key || (field === "*" && typeof key === "number");
8
+ }
9
+ function selectedPath(path, fields) {
10
+ return fields.some((field) => field.every((key, index) => matches(key, path[index])) ||
11
+ path.every((key, index) => matches(field[index], key)));
12
+ }
13
+ /** Own only selected JSON values; discarded token streams still receive full syntax validation. */
14
+ class JsonProjection {
15
+ fields;
16
+ maxBytes;
17
+ stack = [];
18
+ root;
19
+ literal;
20
+ inKey = false;
21
+ keyText = "";
22
+ bytes = 0;
23
+ constructor(fields, maxBytes) {
24
+ this.fields = fields;
25
+ this.maxBytes = maxBytes;
26
+ }
27
+ result() {
28
+ return isRecord(this.root) ? this.root : undefined;
29
+ }
30
+ reserve(size) {
31
+ this.bytes += size;
32
+ if (this.bytes > this.maxBytes) {
33
+ throw new Error("Selected journal envelope exceeds its bounded read size.");
34
+ }
35
+ }
36
+ path() {
37
+ const frame = this.stack.at(-1);
38
+ return frame ? [...frame.path, frame.key ?? frame.index] : [];
39
+ }
40
+ excluded() {
41
+ const frame = this.stack.at(-1);
42
+ return frame !== undefined && frame.value === undefined;
43
+ }
44
+ frame() {
45
+ const frame = this.stack.at(-1);
46
+ if (!frame) {
47
+ throw new Error("Journal JSON container is missing.");
48
+ }
49
+ return frame;
50
+ }
51
+ put(value) {
52
+ const parent = this.stack.at(-1);
53
+ if (!parent) {
54
+ this.root = value;
55
+ return;
56
+ }
57
+ if (parent.value && value !== undefined) {
58
+ if (Array.isArray(parent.value)) {
59
+ parent.value[parent.index] = value;
60
+ }
61
+ else {
62
+ if (parent.key === undefined) {
63
+ throw new Error("Journal object key is missing.");
64
+ }
65
+ Object.defineProperty(parent.value, parent.key, {
66
+ value,
67
+ writable: true,
68
+ enumerable: true,
69
+ configurable: true,
70
+ });
71
+ }
72
+ }
73
+ parent.key = undefined;
74
+ parent.index += 1;
75
+ }
76
+ consume(token) {
77
+ if (token.name === "startKey") {
78
+ this.inKey = true;
79
+ this.keyText = "";
80
+ return;
81
+ }
82
+ if (token.name === "endKey") {
83
+ this.inKey = false;
84
+ this.frame().key = this.keyText;
85
+ return;
86
+ }
87
+ if (this.inKey) {
88
+ this.consumeKey(token);
89
+ return;
90
+ }
91
+ switch (token.name) {
92
+ case "startObject":
93
+ case "startArray":
94
+ this.startContainer(token.name);
95
+ break;
96
+ case "endObject":
97
+ case "endArray": {
98
+ const frame = this.stack.pop();
99
+ if (!frame) {
100
+ throw new Error("Journal JSON container is missing.");
101
+ }
102
+ this.put(frame.value);
103
+ break;
104
+ }
105
+ case "startString":
106
+ case "startNumber":
107
+ this.literal = {
108
+ value: "",
109
+ selected: !this.excluded() && selectedPath(this.path(), this.fields),
110
+ number: token.name === "startNumber",
111
+ };
112
+ break;
113
+ case "stringChunk":
114
+ case "numberChunk":
115
+ this.consumeLiteral(token.value);
116
+ break;
117
+ case "endString":
118
+ case "endNumber":
119
+ this.endLiteral();
120
+ break;
121
+ case "trueValue":
122
+ case "falseValue":
123
+ case "nullValue":
124
+ this.consumeConstant(token.name);
125
+ break;
126
+ case "keyValue":
127
+ case "numberValue":
128
+ case "stringValue":
129
+ case "whitespace":
130
+ // The unpacked tokenizer emits chunk events; packed/whitespace tokens need no projection.
131
+ break;
132
+ }
133
+ }
134
+ consumeKey(token) {
135
+ if (token.name !== "stringChunk" || this.excluded()) {
136
+ return;
137
+ }
138
+ const path = this.frame().path;
139
+ const wholeContainer = this.fields.some((field) => field.every((key, index) => matches(key, path[index])));
140
+ if (wholeContainer || this.keyText.length <= 1024) {
141
+ if (wholeContainer) {
142
+ this.reserve(Buffer.byteLength(token.value));
143
+ }
144
+ this.keyText += token.value;
145
+ }
146
+ }
147
+ startContainer(name) {
148
+ if (this.stack.length >= 1024) {
149
+ throw new Error("Journal JSON nesting exceeds 1024 levels.");
150
+ }
151
+ // Excluded containers cannot contain a requested descendant; don't allocate their keys/paths.
152
+ const currentPath = this.excluded() ? [] : this.path();
153
+ const selected = !this.excluded() && selectedPath(currentPath, this.fields);
154
+ if (selected) {
155
+ this.reserve(32);
156
+ }
157
+ let value;
158
+ if (selected) {
159
+ value = name === "startObject" ? {} : [];
160
+ }
161
+ this.stack.push({ path: currentPath, index: 0, value });
162
+ }
163
+ consumeLiteral(value) {
164
+ if (this.literal?.selected === true) {
165
+ this.reserve(Buffer.byteLength(value));
166
+ this.literal.value += value;
167
+ }
168
+ }
169
+ endLiteral() {
170
+ const literal = this.literal;
171
+ let value;
172
+ if (literal?.selected === true) {
173
+ value = literal.number ? Number(literal.value) : literal.value;
174
+ }
175
+ this.put(value);
176
+ this.literal = undefined;
177
+ }
178
+ consumeConstant(name) {
179
+ const selected = !this.excluded() && selectedPath(this.path(), this.fields);
180
+ if (selected) {
181
+ this.reserve(8);
182
+ }
183
+ let value;
184
+ if (selected) {
185
+ value = name === "nullValue" ? null : name === "trueValue";
186
+ }
187
+ this.put(value);
188
+ }
189
+ }
190
+ /** Validate discarded values too; the parser never packs their strings or numbers. */
191
+ export async function projectJson(
192
+ // The native async iterator owns a mutable cursor; this reader consumes bytes without mutating them.
193
+ // oxlint-disable-next-line typescript/prefer-readonly-parameter-types
194
+ input, fields, maxBytes = ENVELOPE_MAX_BYTES) {
195
+ const { parser } = await import("stream-json/parser.js");
196
+ async function* decode() {
197
+ const decoder = new TextDecoder("utf-8", { fatal: true });
198
+ for await (const chunk of input) {
199
+ yield decoder.decode(chunk, { stream: true });
200
+ }
201
+ const tail = decoder.decode();
202
+ if (tail.length > 0) {
203
+ yield tail;
204
+ }
205
+ }
206
+ const projection = new JsonProjection(fields, maxBytes);
207
+ const sink = new Writable({
208
+ objectMode: true,
209
+ write(token, _encoding, done) {
210
+ try {
211
+ projection.consume(token);
212
+ done();
213
+ }
214
+ catch (error) {
215
+ done(normalizeProcessError(error));
216
+ }
217
+ },
218
+ });
219
+ await pipeline(Readable.from(decode()), parser.asStream({ packValues: false, streamValues: true }), sink);
220
+ return projection.result();
221
+ }
@@ -0,0 +1,89 @@
1
+ import { projectJson } from "./browser-journal-projection.js";
2
+ export { projectJson } from "./browser-journal-projection.js";
3
+ const CHUNK_BYTES = 64 * 1024;
4
+ export async function* readRange(file, range) {
5
+ let position = range.offset;
6
+ const end = range.offset + range.length;
7
+ while (position < end) {
8
+ const buffer = Buffer.allocUnsafe(Math.min(CHUNK_BYTES, end - position));
9
+ // The next range read depends on the bytes actually returned by this read.
10
+ // oxlint-disable-next-line no-await-in-loop
11
+ const { bytesRead } = await file.read(buffer, 0, buffer.length, position);
12
+ if (bytesRead === 0) {
13
+ throw new Error("Journal changed or truncated during read.");
14
+ }
15
+ position += bytesRead;
16
+ yield buffer.subarray(0, bytesRead);
17
+ }
18
+ }
19
+ /** Byte framing, not readline: even one discarded value can exceed V8's string limit. */
20
+ class JournalLineFramer {
21
+ start;
22
+ nonblank = false;
23
+ constructor(offset) {
24
+ this.start = offset;
25
+ }
26
+ *accept(buffer, position) {
27
+ for (let index = 0; index < buffer.length; index++) {
28
+ const byte = buffer[index];
29
+ if (byte === 10) {
30
+ if (this.nonblank) {
31
+ yield { offset: this.start, length: position + index + 1 - this.start };
32
+ }
33
+ this.start = position + index + 1;
34
+ this.nonblank = false;
35
+ }
36
+ else if (![9, 13, 32].includes(byte)) {
37
+ this.nonblank = true;
38
+ }
39
+ }
40
+ }
41
+ final(end, sealed) {
42
+ return this.nonblank && sealed ? { offset: this.start, length: end - this.start } : undefined;
43
+ }
44
+ }
45
+ export async function* journalRanges(file, end, sealed = false, offset = 0) {
46
+ let position = offset;
47
+ const framer = new JournalLineFramer(offset);
48
+ while (position < end) {
49
+ const buffer = Buffer.allocUnsafe(Math.min(CHUNK_BYTES, end - position));
50
+ // Byte offsets and line framing depend on the preceding read's actual length.
51
+ // oxlint-disable-next-line no-await-in-loop
52
+ const { bytesRead } = await file.read(buffer, 0, buffer.length, position);
53
+ if (bytesRead === 0) {
54
+ throw new Error("Journal truncated during read.");
55
+ }
56
+ yield* framer.accept(buffer.subarray(0, bytesRead), position);
57
+ position += bytesRead;
58
+ }
59
+ const final = framer.final(end, sealed);
60
+ if (final) {
61
+ yield final;
62
+ }
63
+ }
64
+ const STRUCTURAL_FIELDS = [
65
+ ["type"],
66
+ ["id"],
67
+ ["parentId"],
68
+ ["timestamp"],
69
+ ["version"],
70
+ ["customType"],
71
+ ["data", "event", "version"],
72
+ ["data", "snapshot", "id"],
73
+ ["message", "toolName"],
74
+ ["message", "details", "browserEventVersion"],
75
+ ["message", "details", "sessionName"],
76
+ ["message", "details", "artifactManifest", "version"],
77
+ ["message", "details", "electron", "action"],
78
+ ];
79
+ export async function scanJournalMetadata(file, end, sealed = false) {
80
+ const entries = [];
81
+ for await (const range of journalRanges(file, end, sealed)) {
82
+ const value = await projectJson(readRange(file, range), STRUCTURAL_FIELDS);
83
+ if (!value) {
84
+ throw new Error(`Expected a journal object at byte ${range.offset}.`);
85
+ }
86
+ entries.push({ ...range, value });
87
+ }
88
+ return entries;
89
+ }
@@ -0,0 +1,246 @@
1
+ import { constants } from "node:fs";
2
+ import { open, stat } from "node:fs/promises";
3
+ import { BROWSER_TRANSITION_ENTRY, BROWSER_RESULT_TOOLS, applyArtifactChanges, getBrowserRecord, snapshotFromDefinition, } from "./browser-transcript.js";
4
+ import { isRecord } from "./parsing.js";
5
+ import { getErrorCode } from "./process-errors.js";
6
+ import { projectJson, readRange, scanJournalMetadata, } from "./browser-journal-reader.js";
7
+ const REPLAY_CUSTOM_TYPES = new Set([
8
+ BROWSER_TRANSITION_ENTRY,
9
+ "agent-browser-recording-reservation",
10
+ "agent-browser-script-session",
11
+ ]);
12
+ function branchEntries(entries, selectedLeaf) {
13
+ const byId = new Map();
14
+ for (const entry of entries) {
15
+ const id = entry.value.id;
16
+ if (typeof id !== "string" || byId.has(id)) {
17
+ throw new Error("Journal has a missing or duplicate native entry identity.");
18
+ }
19
+ byId.set(id, entry);
20
+ }
21
+ const branch = [];
22
+ const seen = new Set();
23
+ let leaf = selectedLeaf;
24
+ while (leaf !== null) {
25
+ if (seen.has(leaf)) {
26
+ throw new Error("Journal ancestry contains a cycle.");
27
+ }
28
+ seen.add(leaf);
29
+ const entry = byId.get(leaf);
30
+ if (!entry) {
31
+ throw new Error(`Selected journal entry ${leaf} is not persisted; browser work requires a committed conversation.`);
32
+ }
33
+ const parent = entry.value.parentId;
34
+ if (parent !== null && typeof parent !== "string") {
35
+ throw new Error("Invalid journal parent identity.");
36
+ }
37
+ branch.push(entry);
38
+ leaf = parent;
39
+ }
40
+ return branch.reverse();
41
+ }
42
+ function canonicalVersion(entry) {
43
+ return isRecord(entry.data) && isRecord(entry.data.event) && entry.data.event.version === 1;
44
+ }
45
+ function legacyCustom(entry) {
46
+ return (entry.type === "custom" &&
47
+ (entry.customType === BROWSER_TRANSITION_ENTRY ||
48
+ entry.customType === "agent-browser-script-session") &&
49
+ !canonicalVersion(entry));
50
+ }
51
+ function browserMessage(entry) {
52
+ const message = isRecord(entry.message) ? entry.message : undefined;
53
+ return message &&
54
+ typeof message.toolName === "string" &&
55
+ BROWSER_RESULT_TOOLS.has(message.toolName)
56
+ ? message
57
+ : undefined;
58
+ }
59
+ function legacyBrowserResult(entry) {
60
+ const message = browserMessage(entry);
61
+ if (!message ||
62
+ !isRecord(message.details) ||
63
+ message.details.browserEventVersion === 1 ||
64
+ canonicalVersion(entry)) {
65
+ return false;
66
+ }
67
+ return (message.details.sessionName !== undefined ||
68
+ message.details.artifactManifest !== undefined ||
69
+ message.details.electron !== undefined);
70
+ }
71
+ function validateMemoryEntry(entry) {
72
+ if (!isRecord(entry)) {
73
+ return;
74
+ }
75
+ if (legacyCustom(entry) && !getBrowserRecord(entry)) {
76
+ throw new Error("Legacy browser records require stopped separate-copy conversion before replay.");
77
+ }
78
+ const message = browserMessage(entry);
79
+ if (entry.type === "message" &&
80
+ message &&
81
+ isRecord(message.details) &&
82
+ message.details.browserEventVersion !== 1 &&
83
+ !getBrowserRecord(entry)) {
84
+ throw new Error("Legacy browser observations require stopped separate-copy conversion before replay.");
85
+ }
86
+ }
87
+ function inMemoryEntries(manager, physical) {
88
+ const entries = physical ? manager.getEntries() : [];
89
+ if (!physical) {
90
+ const seen = new Set();
91
+ let leaf = manager.getLeafId();
92
+ while (leaf !== null) {
93
+ if (seen.has(leaf)) {
94
+ throw new Error("In-memory journal ancestry contains a cycle.");
95
+ }
96
+ seen.add(leaf);
97
+ const entry = manager.getEntry(leaf);
98
+ if (!isRecord(entry) || (entry.parentId !== null && typeof entry.parentId !== "string")) {
99
+ throw new Error("In-memory journal ancestry is incomplete.");
100
+ }
101
+ entries.push(entry);
102
+ leaf = entry.parentId;
103
+ }
104
+ entries.reverse();
105
+ }
106
+ for (const entry of entries) {
107
+ validateMemoryEntry(entry);
108
+ }
109
+ return entries;
110
+ }
111
+ class PublishedJournalReplay {
112
+ file;
113
+ projected = [];
114
+ definitions = new Map();
115
+ constructor(file) {
116
+ this.file = file;
117
+ }
118
+ async project(entries) {
119
+ for (const entry of entries) {
120
+ // Preserve journal order and bound selected envelope memory during replay.
121
+ // oxlint-disable-next-line no-await-in-loop
122
+ await this.projectEntry(entry);
123
+ }
124
+ }
125
+ async projectEntry(entry) {
126
+ const { value } = entry;
127
+ const definition = isRecord(value.data) && isRecord(value.data.snapshot) ? value.data.snapshot.id : undefined;
128
+ if (typeof definition === "string") {
129
+ if (this.definitions.has(definition)) {
130
+ throw new Error("Browser snapshot identity is defined more than once on this ancestry.");
131
+ }
132
+ this.definitions.set(definition, entry);
133
+ }
134
+ if (legacyCustom(value) || legacyBrowserResult(value)) {
135
+ throw new Error("This session contains legacy browser records. Convert a stopped separate copy with npm exec --package pi-agent-browser-native -- pi-agent-browser-convert before resuming browser work; the original journal is retained.");
136
+ }
137
+ if (!replayRelevant(value, definition)) {
138
+ return;
139
+ }
140
+ const fields = value.customType === BROWSER_TRANSITION_ENTRY || value.type === "message"
141
+ ? [
142
+ ["data", "event"],
143
+ ["data", "snapshot", "id"],
144
+ ]
145
+ : [["data"]];
146
+ const body = await projectJson(readRange(this.file, entry), fields);
147
+ this.projected.push({ ...value, ...body });
148
+ }
149
+ async resolveWinningDefinitions(physical) {
150
+ const { SessionPageState } = await import("./session-page-state.js");
151
+ const reduced = SessionPageState.fromBranch(this.projected);
152
+ const winners = new Set((physical ? [] : [...reduced.views().values()]).flatMap((page) => page.refSnapshot?.snapshotId !== undefined && page.refSnapshot.snapshotId.length > 0
153
+ ? [page.refSnapshot.snapshotId]
154
+ : []));
155
+ for (const id of winners) {
156
+ // Each winning snapshot is materialized once, without retaining unrelated historical ref maps.
157
+ // oxlint-disable-next-line no-await-in-loop
158
+ await this.resolveDefinition(id);
159
+ }
160
+ let manifest;
161
+ for (const entry of this.projected) {
162
+ manifest = applyArtifactChanges(manifest, getBrowserRecord(entry)?.event.artifacts);
163
+ }
164
+ return this.projected;
165
+ }
166
+ async resolveDefinition(id) {
167
+ const entry = this.definitions.get(id);
168
+ if (!entry) {
169
+ throw new Error(`Browser snapshot ${id} has no ancestral definition; inspect and take a fresh snapshot.`);
170
+ }
171
+ // ponytail: a requested individual snapshot must fit the consumer's memory; upgrade with native per-value paging if needed.
172
+ const body = await projectJson(readRange(this.file, entry), [["data", "snapshot"]], Infinity);
173
+ const destination = this.projected.find((candidate) => isRecord(candidate) && candidate.id === entry.value.id);
174
+ if (!isRecord(destination) || !isRecord(destination.data) || !isRecord(body?.data)) {
175
+ throw new Error("Winning browser snapshot could not be read.");
176
+ }
177
+ destination.data.snapshot = body.data.snapshot;
178
+ if (!isRecord(body.data.snapshot) || body.data.snapshot.id !== id) {
179
+ throw new Error("Winning browser snapshot identity is invalid.");
180
+ }
181
+ snapshotFromDefinition(body.data.snapshot);
182
+ }
183
+ }
184
+ function replayRelevant(value, definition) {
185
+ return ((value.type === "custom" &&
186
+ typeof value.customType === "string" &&
187
+ REPLAY_CUSTOM_TYPES.has(value.customType)) ||
188
+ (isRecord(value.data) && isRecord(value.data.event)) ||
189
+ definition !== undefined);
190
+ }
191
+ async function verifyCapturedFile(file, path, captured) {
192
+ const current = await file.stat();
193
+ const currentPath = await stat(path);
194
+ if (current.dev !== captured.dev ||
195
+ current.ino !== captured.ino ||
196
+ current.size < captured.size ||
197
+ currentPath.dev !== captured.dev ||
198
+ currentPath.ino !== captured.ino) {
199
+ throw new Error("Pi journal replaced or truncated during replay.");
200
+ }
201
+ }
202
+ function validateJournalHeader(metadata, sessionId) {
203
+ const header = metadata.find((entry) => entry.value.type === "session");
204
+ if (header?.value.id !== sessionId) {
205
+ throw new Error("Pi session journal identity does not match the active session.");
206
+ }
207
+ }
208
+ async function openPublishedJournal(path) {
209
+ try {
210
+ return await open(path, constants.O_RDONLY);
211
+ }
212
+ catch (error) {
213
+ if (getErrorCode(error) === "ENOENT") {
214
+ return undefined;
215
+ }
216
+ throw error;
217
+ }
218
+ }
219
+ export async function readBrowserEntries(manager, physical = false) {
220
+ const path = manager.getSessionFile();
221
+ if (path === undefined || path.length === 0) {
222
+ return inMemoryEntries(manager, physical);
223
+ }
224
+ const leaf = physical ? null : manager.getLeafId();
225
+ const file = await openPublishedJournal(path);
226
+ if (!file) {
227
+ return inMemoryEntries(manager, physical);
228
+ }
229
+ try {
230
+ const captured = await file.stat();
231
+ if (!captured.isFile()) {
232
+ throw new Error("Pi session journal is not a regular file.");
233
+ }
234
+ const metadata = await scanJournalMetadata(file, captured.size);
235
+ validateJournalHeader(metadata, manager.getHeader()?.id ?? manager.getSessionId());
236
+ const records = metadata.filter((entry) => entry.value.type !== "session");
237
+ const replay = new PublishedJournalReplay(file);
238
+ await replay.project(physical ? records : branchEntries(records, leaf));
239
+ const entries = await replay.resolveWinningDefinitions(physical);
240
+ await verifyCapturedFile(file, path, captured);
241
+ return entries;
242
+ }
243
+ finally {
244
+ await file.close();
245
+ }
246
+ }