pi-agent-browser-native 0.9.3 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. package/CHANGELOG.md +106 -5
  2. package/README.md +58 -791
  3. package/dist/extensions/agent-browser/index.js +43101 -2031
  4. package/dist/extensions/agent-browser/lib/argv-descriptor.js +49 -26
  5. package/dist/extensions/agent-browser/lib/argv-grammar.js +82 -93
  6. package/dist/extensions/agent-browser/lib/bash-guard.js +129 -126
  7. package/dist/extensions/agent-browser/lib/batch-lifecycle.js +112 -51
  8. package/dist/extensions/agent-browser/lib/browser-execution-claim-codec.js +61 -0
  9. package/dist/extensions/agent-browser/lib/browser-execution-claim-storage.js +232 -0
  10. package/dist/extensions/agent-browser/lib/browser-execution-claims.js +202 -0
  11. package/dist/extensions/agent-browser/lib/browser-execution-identity.js +77 -0
  12. package/dist/extensions/agent-browser/lib/browser-journal-branch.js +98 -0
  13. package/dist/extensions/agent-browser/lib/browser-journal-contracts.js +1 -0
  14. package/dist/extensions/agent-browser/lib/browser-journal-projection.js +221 -0
  15. package/dist/extensions/agent-browser/lib/browser-journal-reader.js +89 -0
  16. package/dist/extensions/agent-browser/lib/browser-journal-replay.js +246 -0
  17. package/dist/extensions/agent-browser/lib/browser-journal.js +103 -394
  18. package/dist/extensions/agent-browser/lib/browser-legacy-pages.js +220 -0
  19. package/dist/extensions/agent-browser/lib/browser-legacy-projection.js +282 -0
  20. package/dist/extensions/agent-browser/lib/browser-legacy-types.js +1 -0
  21. package/dist/extensions/agent-browser/lib/browser-session-conversion-stream.js +217 -0
  22. package/dist/extensions/agent-browser/lib/browser-session-conversion.js +80 -335
  23. package/dist/extensions/agent-browser/lib/browser-transcript-contracts.js +35 -0
  24. package/dist/extensions/agent-browser/lib/browser-transcript-validation.js +166 -0
  25. package/dist/extensions/agent-browser/lib/browser-transcript.js +137 -82
  26. package/dist/extensions/agent-browser/lib/browser-value-parsing.js +15 -0
  27. package/dist/extensions/agent-browser/lib/command-capabilities.js +340 -0
  28. package/dist/extensions/agent-browser/lib/command-policy.js +107 -88
  29. package/dist/extensions/agent-browser/lib/command-taxonomy.js +49 -322
  30. package/dist/extensions/agent-browser/lib/config-policy.js +138 -343
  31. package/dist/extensions/agent-browser/lib/config-providers.js +71 -0
  32. package/dist/extensions/agent-browser/lib/config-validation.js +231 -0
  33. package/dist/extensions/agent-browser/lib/config.js +20 -8
  34. package/dist/extensions/agent-browser/lib/electron/cdp.js +20 -8
  35. package/dist/extensions/agent-browser/lib/electron/cleanup.js +128 -83
  36. package/dist/extensions/agent-browser/lib/electron/discovery-darwin.js +109 -0
  37. package/dist/extensions/agent-browser/lib/electron/discovery-desktop.js +136 -0
  38. package/dist/extensions/agent-browser/lib/electron/discovery-evidence.js +90 -0
  39. package/dist/extensions/agent-browser/lib/electron/discovery-linux.js +93 -0
  40. package/dist/extensions/agent-browser/lib/electron/discovery-packages.js +162 -0
  41. package/dist/extensions/agent-browser/lib/electron/discovery-types.js +2 -0
  42. package/dist/extensions/agent-browser/lib/electron/discovery.js +140 -549
  43. package/dist/extensions/agent-browser/lib/electron/launch-monitor.js +102 -0
  44. package/dist/extensions/agent-browser/lib/electron/launch-process.js +209 -0
  45. package/dist/extensions/agent-browser/lib/electron/launch-types.js +2 -0
  46. package/dist/extensions/agent-browser/lib/electron/launch.js +261 -355
  47. package/dist/extensions/agent-browser/lib/executable-path.js +21 -12
  48. package/dist/extensions/agent-browser/lib/execution-cwd.js +35 -18
  49. package/dist/extensions/agent-browser/lib/fs-utils.js +1 -9
  50. package/dist/extensions/agent-browser/lib/input-modes/electron.js +162 -121
  51. package/dist/extensions/agent-browser/lib/input-modes/job.js +123 -317
  52. package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +116 -0
  53. package/dist/extensions/agent-browser/lib/input-modes/lookup-plan.js +132 -0
  54. package/dist/extensions/agent-browser/lib/input-modes/lookup-redaction.js +57 -0
  55. package/dist/extensions/agent-browser/lib/input-modes/lookup-source-evidence.js +151 -0
  56. package/dist/extensions/agent-browser/lib/input-modes/lookup-workspace.js +142 -0
  57. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +58 -412
  58. package/dist/extensions/agent-browser/lib/input-modes/params.js +86 -40
  59. package/dist/extensions/agent-browser/lib/input-modes/qa-analysis.js +268 -0
  60. package/dist/extensions/agent-browser/lib/input-modes/qa-presentation.js +117 -0
  61. package/dist/extensions/agent-browser/lib/input-modes/script-child.js +396 -0
  62. package/dist/extensions/agent-browser/lib/input-modes/script-protocol.js +86 -0
  63. package/dist/extensions/agent-browser/lib/input-modes/script-types.js +1 -0
  64. package/dist/extensions/agent-browser/lib/input-modes/script-validation.js +60 -0
  65. package/dist/extensions/agent-browser/lib/input-modes/script.js +60 -409
  66. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +218 -128
  67. package/dist/extensions/agent-browser/lib/input-modes/shared.js +15 -4
  68. package/dist/extensions/agent-browser/lib/input-modes/types.js +56 -7
  69. package/dist/extensions/agent-browser/lib/json-schema.js +22 -10
  70. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +17 -5
  71. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +92 -425
  72. package/dist/extensions/agent-browser/lib/managed-session-posix-storage.js +58 -0
  73. package/dist/extensions/agent-browser/lib/managed-session-project-identity.js +244 -0
  74. package/dist/extensions/agent-browser/lib/managed-session-restore-context.js +84 -0
  75. package/dist/extensions/agent-browser/lib/managed-session-restore-policy.js +119 -0
  76. package/dist/extensions/agent-browser/lib/managed-session-restore-state.js +83 -0
  77. package/dist/extensions/agent-browser/lib/managed-session-restore.js +168 -300
  78. package/dist/extensions/agent-browser/lib/managed-session-snapshot-records.js +277 -0
  79. package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +128 -305
  80. package/dist/extensions/agent-browser/lib/managed-session-storage.js +56 -253
  81. package/dist/extensions/agent-browser/lib/native-confirmation.js +140 -0
  82. package/dist/extensions/agent-browser/lib/native-output.js +43 -9
  83. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +106 -59
  84. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-merge.js +14 -6
  85. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +109 -57
  86. package/dist/extensions/agent-browser/lib/orchestration/browser-run/browser-observation-result.js +82 -0
  87. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +164 -60
  88. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostic-values.js +31 -0
  89. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +152 -781
  90. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-observation.js +203 -0
  91. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-text-diagnostics.js +109 -0
  92. package/dist/extensions/agent-browser/lib/orchestration/browser-run/fill-diagnostics.js +119 -0
  93. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-action-recovery.js +147 -0
  94. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-actions.js +144 -0
  95. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-content.js +123 -0
  96. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-contracts.js +1 -0
  97. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-details.js +156 -0
  98. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-electron.js +187 -0
  99. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-evidence.js +39 -0
  100. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-missing-binary.js +89 -0
  101. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-recovery.js +97 -0
  102. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-redaction.js +106 -0
  103. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-timeout.js +110 -0
  104. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +41 -538
  105. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +199 -154
  106. package/dist/extensions/agent-browser/lib/orchestration/browser-run/interaction-diagnostics.js +290 -0
  107. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-close.js +167 -0
  108. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-inspection.js +108 -0
  109. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +127 -205
  110. package/dist/extensions/agent-browser/lib/orchestration/browser-run/native-helper-observation.js +65 -0
  111. package/dist/extensions/agent-browser/lib/orchestration/browser-run/observation-types.js +1 -0
  112. package/dist/extensions/agent-browser/lib/orchestration/browser-run/overlay-diagnostics.js +120 -0
  113. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +113 -30
  114. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +109 -28
  115. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter-data.js +150 -0
  116. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +147 -253
  117. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-rendered-text.js +147 -0
  118. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +59 -24
  119. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-artifacts.js +159 -0
  120. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-command.js +131 -0
  121. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-contracts.js +1 -0
  122. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-daemon.js +93 -0
  123. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-failure.js +42 -0
  124. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-guards.js +242 -0
  125. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-input.js +75 -0
  126. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-observations.js +92 -0
  127. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-selection.js +254 -0
  128. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-state.js +121 -0
  129. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-refs.js +130 -0
  130. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-resources.js +114 -0
  131. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-semantic.js +121 -0
  132. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-session-plan.js +222 -0
  133. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-timeouts.js +68 -0
  134. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +176 -1123
  135. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-analysis.js +191 -0
  136. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-confirmation.js +152 -0
  137. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-diagnostics.js +182 -0
  138. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-electron.js +150 -0
  139. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-contracts.js +1 -0
  140. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase-contracts.js +1 -0
  141. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase.js +115 -0
  142. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle.js +256 -0
  143. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed-contracts.js +1 -0
  144. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed.js +256 -0
  145. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase-contracts.js +1 -0
  146. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase.js +93 -0
  147. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native.js +113 -0
  148. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation-contracts.js +1 -0
  149. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation.js +316 -0
  150. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-ownership.js +28 -0
  151. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase-contracts.js +1 -0
  152. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase.js +142 -0
  153. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation-contracts.js +1 -0
  154. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation.js +333 -0
  155. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase-contracts.js +1 -0
  156. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase.js +71 -0
  157. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication.js +201 -0
  158. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-receipts.js +183 -0
  159. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-refs.js +200 -0
  160. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-tabs.js +142 -0
  161. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +18 -968
  162. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +23 -13
  163. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-receipt-reconciliation.js +198 -0
  164. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-contracts.js +1 -0
  165. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-presentation.js +154 -0
  166. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery.js +68 -151
  167. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-capture.js +14 -0
  168. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-observation.js +169 -46
  169. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-commands.js +130 -0
  170. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-electron.js +212 -0
  171. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-observations.js +61 -0
  172. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-outcomes.js +187 -0
  173. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-refs.js +169 -0
  174. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-tabs.js +228 -0
  175. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +77 -765
  176. package/dist/extensions/agent-browser/lib/orchestration/browser-run/text-visibility-diagnostics.js +182 -0
  177. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-diagnostics.js +256 -0
  178. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-progress.js +108 -0
  179. package/dist/extensions/agent-browser/lib/orchestration/code-artifact-observation.js +39 -0
  180. package/dist/extensions/agent-browser/lib/orchestration/code-image-observation.js +119 -0
  181. package/dist/extensions/agent-browser/lib/orchestration/electron-host/branch.js +93 -0
  182. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup-result.js +58 -0
  183. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup.js +78 -0
  184. package/dist/extensions/agent-browser/lib/orchestration/electron-host/contracts.js +1 -0
  185. package/dist/extensions/agent-browser/lib/orchestration/electron-host/discovery.js +106 -0
  186. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +48 -821
  187. package/dist/extensions/agent-browser/lib/orchestration/electron-host/policy.js +86 -0
  188. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-collection.js +68 -0
  189. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +169 -0
  190. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +182 -0
  191. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe.js +161 -0
  192. package/dist/extensions/agent-browser/lib/orchestration/electron-host/status.js +167 -0
  193. package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +22 -10
  194. package/dist/extensions/agent-browser/lib/orchestration/extension-artifact-preflight.js +211 -0
  195. package/dist/extensions/agent-browser/lib/orchestration/extension-artifacts.js +23 -0
  196. package/dist/extensions/agent-browser/lib/orchestration/extension-attachment-replay.js +99 -0
  197. package/dist/extensions/agent-browser/lib/orchestration/extension-branch-restore.js +275 -0
  198. package/dist/extensions/agent-browser/lib/orchestration/extension-code.js +280 -0
  199. package/dist/extensions/agent-browser/lib/orchestration/extension-command-admission.js +303 -0
  200. package/dist/extensions/agent-browser/lib/orchestration/extension-command-output.js +36 -0
  201. package/dist/extensions/agent-browser/lib/orchestration/extension-command-result.js +335 -0
  202. package/dist/extensions/agent-browser/lib/orchestration/extension-command-run.js +227 -0
  203. package/dist/extensions/agent-browser/lib/orchestration/extension-command-state.js +1 -0
  204. package/dist/extensions/agent-browser/lib/orchestration/extension-electron-ownership.js +204 -0
  205. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-locks.js +139 -0
  206. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-queue.js +24 -0
  207. package/dist/extensions/agent-browser/lib/orchestration/extension-host-coordination.js +98 -0
  208. package/dist/extensions/agent-browser/lib/orchestration/extension-host-run.js +295 -0
  209. package/dist/extensions/agent-browser/lib/orchestration/extension-intent-replay.js +41 -0
  210. package/dist/extensions/agent-browser/lib/orchestration/extension-invocation.js +7 -0
  211. package/dist/extensions/agent-browser/lib/orchestration/extension-lifecycle.js +102 -0
  212. package/dist/extensions/agent-browser/lib/orchestration/extension-managed-ownership.js +133 -0
  213. package/dist/extensions/agent-browser/lib/orchestration/extension-observation.js +120 -0
  214. package/dist/extensions/agent-browser/lib/orchestration/extension-prompt.js +180 -0
  215. package/dist/extensions/agent-browser/lib/orchestration/extension-recording.js +290 -0
  216. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-contracts.js +1 -0
  217. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-replay.js +269 -0
  218. package/dist/extensions/agent-browser/lib/orchestration/extension-result-state.js +113 -0
  219. package/dist/extensions/agent-browser/lib/orchestration/extension-runtime.js +146 -0
  220. package/dist/extensions/agent-browser/lib/orchestration/extension-script-leases.js +58 -0
  221. package/dist/extensions/agent-browser/lib/orchestration/extension-tool-boundary.js +62 -0
  222. package/dist/extensions/agent-browser/lib/orchestration/extension-version-check.js +54 -0
  223. package/dist/extensions/agent-browser/lib/orchestration/input-plan-types.js +1 -0
  224. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +261 -185
  225. package/dist/extensions/agent-browser/lib/orchestration/input-redaction.js +62 -0
  226. package/dist/extensions/agent-browser/lib/orchestration/native-config.js +144 -0
  227. package/dist/extensions/agent-browser/lib/orchestration/native-root-launch.js +77 -0
  228. package/dist/extensions/agent-browser/lib/orchestration/native-session-defaults.js +210 -157
  229. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  230. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +197 -99
  231. package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +199 -96
  232. package/dist/extensions/agent-browser/lib/owned-managed-session-context.js +55 -0
  233. package/dist/extensions/agent-browser/lib/page-target-batch.js +118 -0
  234. package/dist/extensions/agent-browser/lib/page-target-guards.js +50 -0
  235. package/dist/extensions/agent-browser/lib/page-target-navigation.js +104 -0
  236. package/dist/extensions/agent-browser/lib/page-target-validation.js +55 -246
  237. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  238. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +133 -68
  239. package/dist/extensions/agent-browser/lib/playbook.js +16 -12
  240. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  241. package/dist/extensions/agent-browser/lib/process-environment.js +13 -6
  242. package/dist/extensions/agent-browser/lib/process-errors.js +23 -0
  243. package/dist/extensions/agent-browser/lib/process-identity.js +47 -15
  244. package/dist/extensions/agent-browser/lib/process-socket-storage.js +256 -0
  245. package/dist/extensions/agent-browser/lib/process-stdout.js +74 -0
  246. package/dist/extensions/agent-browser/lib/process.js +145 -536
  247. package/dist/extensions/agent-browser/lib/prompt-artifacts.js +287 -0
  248. package/dist/extensions/agent-browser/lib/prompt-policy.js +15 -194
  249. package/dist/extensions/agent-browser/lib/read-command.js +41 -0
  250. package/dist/extensions/agent-browser/lib/read-confirmation.js +131 -68
  251. package/dist/extensions/agent-browser/lib/recording-reservations.js +118 -45
  252. package/dist/extensions/agent-browser/lib/redaction-fields.js +75 -0
  253. package/dist/extensions/agent-browser/lib/redaction-json.js +149 -0
  254. package/dist/extensions/agent-browser/lib/redaction-url.js +88 -0
  255. package/dist/extensions/agent-browser/lib/results/action-contracts.js +1 -0
  256. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +28 -271
  257. package/dist/extensions/agent-browser/lib/results/artifact-contracts.js +1 -0
  258. package/dist/extensions/agent-browser/lib/results/artifact-manifest-validation.js +133 -0
  259. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +96 -94
  260. package/dist/extensions/agent-browser/lib/results/artifact-recommendations.js +73 -0
  261. package/dist/extensions/agent-browser/lib/results/categories.js +111 -54
  262. package/dist/extensions/agent-browser/lib/results/confirmation.js +29 -13
  263. package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +62 -27
  264. package/dist/extensions/agent-browser/lib/results/electron-recommendations.js +83 -0
  265. package/dist/extensions/agent-browser/lib/results/envelope-decoding.js +48 -0
  266. package/dist/extensions/agent-browser/lib/results/envelope.js +90 -67
  267. package/dist/extensions/agent-browser/lib/results/evidence-contracts.js +1 -0
  268. package/dist/extensions/agent-browser/lib/results/failure-recommendations.js +180 -0
  269. package/dist/extensions/agent-browser/lib/results/network-routes.js +86 -45
  270. package/dist/extensions/agent-browser/lib/results/network.js +35 -12
  271. package/dist/extensions/agent-browser/lib/results/next-actions.js +49 -19
  272. package/dist/extensions/agent-browser/lib/results/presentation/artifact-files.js +320 -0
  273. package/dist/extensions/agent-browser/lib/results/presentation/artifact-format.js +138 -0
  274. package/dist/extensions/agent-browser/lib/results/presentation/artifact-images.js +113 -0
  275. package/dist/extensions/agent-browser/lib/results/presentation/artifact-verification.js +145 -0
  276. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +99 -555
  277. package/dist/extensions/agent-browser/lib/results/presentation/batch-contracts.js +1 -0
  278. package/dist/extensions/agent-browser/lib/results/presentation/batch-recording.js +118 -0
  279. package/dist/extensions/agent-browser/lib/results/presentation/batch-redaction.js +68 -0
  280. package/dist/extensions/agent-browser/lib/results/presentation/batch-rendering.js +135 -0
  281. package/dist/extensions/agent-browser/lib/results/presentation/batch-step.js +227 -0
  282. package/dist/extensions/agent-browser/lib/results/presentation/batch-summary.js +91 -0
  283. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +91 -460
  284. package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +9 -5
  285. package/dist/extensions/agent-browser/lib/results/presentation/command-presenters.js +216 -0
  286. package/dist/extensions/agent-browser/lib/results/presentation/common.js +26 -9
  287. package/dist/extensions/agent-browser/lib/results/presentation/content.js +86 -29
  288. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-a11y.js +67 -0
  289. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-health.js +79 -0
  290. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-identity.js +199 -0
  291. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-logs.js +75 -0
  292. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network-actions.js +216 -0
  293. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network.js +124 -0
  294. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-redaction.js +64 -0
  295. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-storage.js +209 -0
  296. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-stream.js +69 -0
  297. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-summary.js +222 -0
  298. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +103 -1052
  299. package/dist/extensions/agent-browser/lib/results/presentation/early-result.js +70 -0
  300. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +130 -60
  301. package/dist/extensions/agent-browser/lib/results/presentation/input-contracts.js +1 -0
  302. package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +60 -145
  303. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +147 -88
  304. package/dist/extensions/agent-browser/lib/results/presentation/notices.js +75 -0
  305. package/dist/extensions/agent-browser/lib/results/presentation/observation-contracts.js +1 -0
  306. package/dist/extensions/agent-browser/lib/results/presentation/observation-rendering.js +127 -0
  307. package/dist/extensions/agent-browser/lib/results/presentation/outcomes.js +120 -0
  308. package/dist/extensions/agent-browser/lib/results/presentation/output-completion.js +77 -0
  309. package/dist/extensions/agent-browser/lib/results/presentation/output-spill.js +51 -0
  310. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +116 -240
  311. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +35 -21
  312. package/dist/extensions/agent-browser/lib/results/presentation/skills.js +109 -73
  313. package/dist/extensions/agent-browser/lib/results/presentation/source.js +109 -0
  314. package/dist/extensions/agent-browser/lib/results/presentation.js +17 -261
  315. package/dist/extensions/agent-browser/lib/results/recommendation-contracts.js +1 -0
  316. package/dist/extensions/agent-browser/lib/results/recording.js +52 -14
  317. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +14 -5
  318. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +30 -22
  319. package/dist/extensions/agent-browser/lib/results/selector-recovery-target.js +83 -0
  320. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +119 -119
  321. package/dist/extensions/agent-browser/lib/results/snapshot-compact.js +266 -0
  322. package/dist/extensions/agent-browser/lib/results/snapshot-content.js +32 -0
  323. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +104 -71
  324. package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +31 -11
  325. package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +125 -66
  326. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +26 -7
  327. package/dist/extensions/agent-browser/lib/results/snapshot.js +28 -248
  328. package/dist/extensions/agent-browser/lib/results/text.js +16 -5
  329. package/dist/extensions/agent-browser/lib/runtime-args-validation.js +133 -0
  330. package/dist/extensions/agent-browser/lib/runtime-compatibility.js +81 -0
  331. package/dist/extensions/agent-browser/lib/runtime-contracts.js +1 -0
  332. package/dist/extensions/agent-browser/lib/runtime-redaction.js +118 -0
  333. package/dist/extensions/agent-browser/lib/runtime-replay-events.js +144 -0
  334. package/dist/extensions/agent-browser/lib/runtime-session-identity.js +76 -0
  335. package/dist/extensions/agent-browser/lib/runtime-session-plan.js +114 -0
  336. package/dist/extensions/agent-browser/lib/runtime-session-replay.js +123 -0
  337. package/dist/extensions/agent-browser/lib/runtime-tab-correction.js +65 -0
  338. package/dist/extensions/agent-browser/lib/runtime-timeouts.js +28 -0
  339. package/dist/extensions/agent-browser/lib/runtime.js +137 -1041
  340. package/dist/extensions/agent-browser/lib/session-identity.js +51 -0
  341. package/dist/extensions/agent-browser/lib/session-page-observation.js +357 -0
  342. package/dist/extensions/agent-browser/lib/session-page-state.js +178 -333
  343. package/dist/extensions/agent-browser/lib/session-page-types.js +1 -0
  344. package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +81 -0
  345. package/dist/extensions/agent-browser/lib/temp-mutation-queue.js +7 -0
  346. package/dist/extensions/agent-browser/lib/temp-root-ownership.js +234 -0
  347. package/dist/extensions/agent-browser/lib/temp-root.js +211 -0
  348. package/dist/extensions/agent-browser/lib/temp.js +33 -446
  349. package/dist/extensions/agent-browser/lib/tool-surface.js +94 -24
  350. package/dist/extensions/agent-browser/lib/upstream-version.js +3 -2
  351. package/dist/extensions/agent-browser/lib/web-search-providers.js +193 -0
  352. package/dist/extensions/agent-browser/lib/web-search-request.js +102 -0
  353. package/dist/extensions/agent-browser/lib/web-search-results.js +281 -0
  354. package/dist/extensions/agent-browser/lib/web-search-schema.js +82 -0
  355. package/dist/extensions/agent-browser/lib/web-search.js +124 -614
  356. package/dist/extensions/agent-browser/lib/webmcp-observation.js +13 -6
  357. package/dist/extensions/agent-browser/lib/windows-stock-launcher.js +63 -37
  358. package/dist/extensions/agent-browser/script-worker.js +80 -43
  359. package/dist/scripts/agent-browser-target.mjs +4 -2
  360. package/docs/ARCHITECTURE.md +19 -6
  361. package/docs/CODE_QUALITY.md +267 -0
  362. package/docs/COMMAND_REFERENCE.md +272 -241
  363. package/docs/ELECTRON.md +77 -46
  364. package/docs/REFERENCE.md +869 -0
  365. package/docs/RELEASE.md +25 -22
  366. package/docs/REQUIREMENTS.md +2 -1
  367. package/docs/SUPPORT_MATRIX.md +81 -79
  368. package/docs/TOOL_CONTRACT.md +158 -125
  369. package/docs/platform-smoke.md +8 -8
  370. package/package.json +144 -120
  371. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  372. package/scripts/agent-browser-target.mjs +6 -2
  373. package/scripts/build.mjs +37 -8
  374. package/scripts/capability-core-commands.mjs +193 -0
  375. package/scripts/capability-options.mjs +283 -0
  376. package/scripts/capability-samples.mjs +133 -0
  377. package/scripts/capability-section.mjs +11 -0
  378. package/scripts/config.mjs +235 -132
  379. package/scripts/convert-browser-session.mjs +30 -9
  380. package/scripts/doctor-sources.mjs +195 -0
  381. package/scripts/doctor.mjs +94 -249
  382. package/scripts/platform-smoke/artifacts.mjs +38 -11
  383. package/scripts/platform-smoke/commands.mjs +104 -0
  384. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  385. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  386. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  387. package/scripts/platform-smoke/doctor.mjs +212 -320
  388. package/scripts/platform-smoke/lease-evidence.mjs +132 -0
  389. package/scripts/platform-smoke/linux-image/Dockerfile +8 -2
  390. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  391. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  392. package/scripts/platform-smoke/targets.mjs +154 -472
  393. package/scripts/platform-smoke.mjs +55 -40
  394. package/scripts/prepare.mjs +16 -7
@@ -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
+ }