pi-agent-browser-native 0.9.2 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. package/CHANGELOG.md +91 -5
  2. package/README.md +120 -86
  3. package/dist/extensions/agent-browser/index.js +43065 -2016
  4. package/dist/extensions/agent-browser/lib/argv-descriptor.js +49 -26
  5. package/dist/extensions/agent-browser/lib/argv-grammar.js +82 -93
  6. package/dist/extensions/agent-browser/lib/bash-guard.js +129 -126
  7. package/dist/extensions/agent-browser/lib/batch-lifecycle.js +113 -49
  8. package/dist/extensions/agent-browser/lib/browser-execution-claim-codec.js +61 -0
  9. package/dist/extensions/agent-browser/lib/browser-execution-claim-storage.js +232 -0
  10. package/dist/extensions/agent-browser/lib/browser-execution-claims.js +202 -0
  11. package/dist/extensions/agent-browser/lib/browser-execution-identity.js +77 -0
  12. package/dist/extensions/agent-browser/lib/browser-journal-branch.js +98 -0
  13. package/dist/extensions/agent-browser/lib/browser-journal-contracts.js +1 -0
  14. package/dist/extensions/agent-browser/lib/browser-journal-projection.js +221 -0
  15. package/dist/extensions/agent-browser/lib/browser-journal-reader.js +89 -0
  16. package/dist/extensions/agent-browser/lib/browser-journal-replay.js +246 -0
  17. package/dist/extensions/agent-browser/lib/browser-journal.js +103 -394
  18. package/dist/extensions/agent-browser/lib/browser-legacy-pages.js +220 -0
  19. package/dist/extensions/agent-browser/lib/browser-legacy-projection.js +282 -0
  20. package/dist/extensions/agent-browser/lib/browser-legacy-types.js +1 -0
  21. package/dist/extensions/agent-browser/lib/browser-session-conversion-stream.js +217 -0
  22. package/dist/extensions/agent-browser/lib/browser-session-conversion.js +80 -335
  23. package/dist/extensions/agent-browser/lib/browser-transcript-contracts.js +35 -0
  24. package/dist/extensions/agent-browser/lib/browser-transcript-validation.js +166 -0
  25. package/dist/extensions/agent-browser/lib/browser-transcript.js +137 -81
  26. package/dist/extensions/agent-browser/lib/browser-value-parsing.js +15 -0
  27. package/dist/extensions/agent-browser/lib/command-capabilities.js +340 -0
  28. package/dist/extensions/agent-browser/lib/command-policy.js +107 -88
  29. package/dist/extensions/agent-browser/lib/command-taxonomy.js +49 -322
  30. package/dist/extensions/agent-browser/lib/config-policy.js +138 -343
  31. package/dist/extensions/agent-browser/lib/config-providers.js +71 -0
  32. package/dist/extensions/agent-browser/lib/config-validation.js +218 -0
  33. package/dist/extensions/agent-browser/lib/config.js +19 -7
  34. package/dist/extensions/agent-browser/lib/electron/cdp.js +15 -7
  35. package/dist/extensions/agent-browser/lib/electron/cleanup.js +134 -55
  36. package/dist/extensions/agent-browser/lib/electron/discovery-darwin.js +109 -0
  37. package/dist/extensions/agent-browser/lib/electron/discovery-desktop.js +136 -0
  38. package/dist/extensions/agent-browser/lib/electron/discovery-evidence.js +89 -0
  39. package/dist/extensions/agent-browser/lib/electron/discovery-linux.js +93 -0
  40. package/dist/extensions/agent-browser/lib/electron/discovery-packages.js +162 -0
  41. package/dist/extensions/agent-browser/lib/electron/discovery-types.js +2 -0
  42. package/dist/extensions/agent-browser/lib/electron/discovery.js +140 -549
  43. package/dist/extensions/agent-browser/lib/electron/launch-monitor.js +102 -0
  44. package/dist/extensions/agent-browser/lib/electron/launch-process.js +209 -0
  45. package/dist/extensions/agent-browser/lib/electron/launch-types.js +2 -0
  46. package/dist/extensions/agent-browser/lib/electron/launch.js +249 -354
  47. package/dist/extensions/agent-browser/lib/executable-path.js +21 -12
  48. package/dist/extensions/agent-browser/lib/execution-cwd.js +35 -18
  49. package/dist/extensions/agent-browser/lib/input-modes/electron.js +162 -121
  50. package/dist/extensions/agent-browser/lib/input-modes/job.js +116 -313
  51. package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +104 -0
  52. package/dist/extensions/agent-browser/lib/input-modes/lookup-plan.js +132 -0
  53. package/dist/extensions/agent-browser/lib/input-modes/lookup-redaction.js +57 -0
  54. package/dist/extensions/agent-browser/lib/input-modes/lookup-source-evidence.js +151 -0
  55. package/dist/extensions/agent-browser/lib/input-modes/lookup-workspace.js +142 -0
  56. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +57 -412
  57. package/dist/extensions/agent-browser/lib/input-modes/params.js +63 -17
  58. package/dist/extensions/agent-browser/lib/input-modes/qa-analysis.js +268 -0
  59. package/dist/extensions/agent-browser/lib/input-modes/qa-presentation.js +117 -0
  60. package/dist/extensions/agent-browser/lib/input-modes/script-child.js +396 -0
  61. package/dist/extensions/agent-browser/lib/input-modes/script-protocol.js +86 -0
  62. package/dist/extensions/agent-browser/lib/input-modes/script-types.js +1 -0
  63. package/dist/extensions/agent-browser/lib/input-modes/script-validation.js +60 -0
  64. package/dist/extensions/agent-browser/lib/input-modes/script.js +60 -409
  65. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +218 -128
  66. package/dist/extensions/agent-browser/lib/input-modes/shared.js +15 -4
  67. package/dist/extensions/agent-browser/lib/input-modes/types.js +56 -7
  68. package/dist/extensions/agent-browser/lib/json-schema.js +22 -10
  69. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +17 -5
  70. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +92 -425
  71. package/dist/extensions/agent-browser/lib/managed-session-posix-storage.js +58 -0
  72. package/dist/extensions/agent-browser/lib/managed-session-project-identity.js +244 -0
  73. package/dist/extensions/agent-browser/lib/managed-session-restore-context.js +84 -0
  74. package/dist/extensions/agent-browser/lib/managed-session-restore-policy.js +119 -0
  75. package/dist/extensions/agent-browser/lib/managed-session-restore-state.js +83 -0
  76. package/dist/extensions/agent-browser/lib/managed-session-restore.js +168 -300
  77. package/dist/extensions/agent-browser/lib/managed-session-snapshot-records.js +277 -0
  78. package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +128 -305
  79. package/dist/extensions/agent-browser/lib/managed-session-storage.js +56 -253
  80. package/dist/extensions/agent-browser/lib/native-confirmation.js +140 -0
  81. package/dist/extensions/agent-browser/lib/native-output.js +44 -9
  82. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +107 -66
  83. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-merge.js +14 -6
  84. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +109 -57
  85. package/dist/extensions/agent-browser/lib/orchestration/browser-run/browser-observation-result.js +82 -0
  86. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +171 -57
  87. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostic-values.js +31 -0
  88. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +152 -781
  89. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-observation.js +202 -0
  90. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-text-diagnostics.js +109 -0
  91. package/dist/extensions/agent-browser/lib/orchestration/browser-run/fill-diagnostics.js +119 -0
  92. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-action-recovery.js +147 -0
  93. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-actions.js +144 -0
  94. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-content.js +123 -0
  95. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-contracts.js +1 -0
  96. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-details.js +156 -0
  97. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-electron.js +179 -0
  98. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-evidence.js +39 -0
  99. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-missing-binary.js +89 -0
  100. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-recovery.js +97 -0
  101. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-redaction.js +106 -0
  102. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-timeout.js +110 -0
  103. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +41 -538
  104. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +204 -108
  105. package/dist/extensions/agent-browser/lib/orchestration/browser-run/interaction-diagnostics.js +290 -0
  106. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-close.js +167 -0
  107. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-inspection.js +108 -0
  108. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +127 -199
  109. package/dist/extensions/agent-browser/lib/orchestration/browser-run/native-helper-observation.js +65 -0
  110. package/dist/extensions/agent-browser/lib/orchestration/browser-run/observation-types.js +1 -0
  111. package/dist/extensions/agent-browser/lib/orchestration/browser-run/overlay-diagnostics.js +120 -0
  112. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +113 -30
  113. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +109 -28
  114. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter-data.js +150 -0
  115. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +138 -253
  116. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-rendered-text.js +147 -0
  117. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +59 -24
  118. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-artifacts.js +159 -0
  119. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-command.js +131 -0
  120. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-contracts.js +1 -0
  121. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-daemon.js +93 -0
  122. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-failure.js +42 -0
  123. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-guards.js +242 -0
  124. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-input.js +75 -0
  125. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-observations.js +92 -0
  126. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-selection.js +254 -0
  127. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-state.js +121 -0
  128. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-refs.js +130 -0
  129. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-resources.js +114 -0
  130. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-semantic.js +121 -0
  131. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-session-plan.js +222 -0
  132. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-timeouts.js +68 -0
  133. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +176 -1114
  134. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-analysis.js +191 -0
  135. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-confirmation.js +152 -0
  136. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-diagnostics.js +182 -0
  137. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-electron.js +150 -0
  138. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-contracts.js +1 -0
  139. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase-contracts.js +1 -0
  140. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase.js +115 -0
  141. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle.js +256 -0
  142. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed-contracts.js +1 -0
  143. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed.js +256 -0
  144. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase-contracts.js +1 -0
  145. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase.js +93 -0
  146. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native.js +113 -0
  147. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation-contracts.js +1 -0
  148. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation.js +316 -0
  149. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-ownership.js +28 -0
  150. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase-contracts.js +1 -0
  151. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase.js +142 -0
  152. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation-contracts.js +1 -0
  153. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation.js +333 -0
  154. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase-contracts.js +1 -0
  155. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase.js +71 -0
  156. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication.js +201 -0
  157. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-receipts.js +183 -0
  158. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-refs.js +200 -0
  159. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-tabs.js +142 -0
  160. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +18 -910
  161. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +23 -13
  162. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-receipt-reconciliation.js +198 -0
  163. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-contracts.js +1 -0
  164. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-presentation.js +154 -0
  165. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery.js +68 -151
  166. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-capture.js +14 -0
  167. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-observation.js +169 -46
  168. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-commands.js +130 -0
  169. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-electron.js +210 -0
  170. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-observations.js +61 -0
  171. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-outcomes.js +187 -0
  172. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-refs.js +171 -0
  173. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-tabs.js +228 -0
  174. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +77 -753
  175. package/dist/extensions/agent-browser/lib/orchestration/browser-run/text-visibility-diagnostics.js +182 -0
  176. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-diagnostics.js +256 -0
  177. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-progress.js +108 -0
  178. package/dist/extensions/agent-browser/lib/orchestration/code-artifact-observation.js +39 -0
  179. package/dist/extensions/agent-browser/lib/orchestration/code-image-observation.js +119 -0
  180. package/dist/extensions/agent-browser/lib/orchestration/electron-host/branch.js +92 -0
  181. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup-result.js +58 -0
  182. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup.js +78 -0
  183. package/dist/extensions/agent-browser/lib/orchestration/electron-host/contracts.js +1 -0
  184. package/dist/extensions/agent-browser/lib/orchestration/electron-host/discovery.js +106 -0
  185. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +48 -816
  186. package/dist/extensions/agent-browser/lib/orchestration/electron-host/policy.js +86 -0
  187. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-collection.js +69 -0
  188. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +167 -0
  189. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +164 -0
  190. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe.js +161 -0
  191. package/dist/extensions/agent-browser/lib/orchestration/electron-host/status.js +165 -0
  192. package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +21 -9
  193. package/dist/extensions/agent-browser/lib/orchestration/extension-artifact-preflight.js +211 -0
  194. package/dist/extensions/agent-browser/lib/orchestration/extension-artifacts.js +23 -0
  195. package/dist/extensions/agent-browser/lib/orchestration/extension-attachment-replay.js +99 -0
  196. package/dist/extensions/agent-browser/lib/orchestration/extension-branch-restore.js +275 -0
  197. package/dist/extensions/agent-browser/lib/orchestration/extension-code.js +280 -0
  198. package/dist/extensions/agent-browser/lib/orchestration/extension-command-admission.js +303 -0
  199. package/dist/extensions/agent-browser/lib/orchestration/extension-command-output.js +36 -0
  200. package/dist/extensions/agent-browser/lib/orchestration/extension-command-result.js +335 -0
  201. package/dist/extensions/agent-browser/lib/orchestration/extension-command-run.js +227 -0
  202. package/dist/extensions/agent-browser/lib/orchestration/extension-command-state.js +1 -0
  203. package/dist/extensions/agent-browser/lib/orchestration/extension-electron-ownership.js +204 -0
  204. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-locks.js +139 -0
  205. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-queue.js +24 -0
  206. package/dist/extensions/agent-browser/lib/orchestration/extension-host-coordination.js +98 -0
  207. package/dist/extensions/agent-browser/lib/orchestration/extension-host-run.js +295 -0
  208. package/dist/extensions/agent-browser/lib/orchestration/extension-intent-replay.js +41 -0
  209. package/dist/extensions/agent-browser/lib/orchestration/extension-invocation.js +7 -0
  210. package/dist/extensions/agent-browser/lib/orchestration/extension-lifecycle.js +102 -0
  211. package/dist/extensions/agent-browser/lib/orchestration/extension-managed-ownership.js +133 -0
  212. package/dist/extensions/agent-browser/lib/orchestration/extension-observation.js +120 -0
  213. package/dist/extensions/agent-browser/lib/orchestration/extension-prompt.js +180 -0
  214. package/dist/extensions/agent-browser/lib/orchestration/extension-recording.js +290 -0
  215. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-contracts.js +1 -0
  216. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-replay.js +269 -0
  217. package/dist/extensions/agent-browser/lib/orchestration/extension-result-state.js +113 -0
  218. package/dist/extensions/agent-browser/lib/orchestration/extension-runtime.js +146 -0
  219. package/dist/extensions/agent-browser/lib/orchestration/extension-script-leases.js +58 -0
  220. package/dist/extensions/agent-browser/lib/orchestration/extension-tool-boundary.js +62 -0
  221. package/dist/extensions/agent-browser/lib/orchestration/extension-version-check.js +54 -0
  222. package/dist/extensions/agent-browser/lib/orchestration/input-plan-types.js +1 -0
  223. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +261 -185
  224. package/dist/extensions/agent-browser/lib/orchestration/input-redaction.js +62 -0
  225. package/dist/extensions/agent-browser/lib/orchestration/native-config.js +144 -0
  226. package/dist/extensions/agent-browser/lib/orchestration/native-root-launch.js +77 -0
  227. package/dist/extensions/agent-browser/lib/orchestration/native-session-defaults.js +210 -139
  228. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  229. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +198 -98
  230. package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +199 -96
  231. package/dist/extensions/agent-browser/lib/owned-managed-session-context.js +55 -0
  232. package/dist/extensions/agent-browser/lib/page-target-batch.js +118 -0
  233. package/dist/extensions/agent-browser/lib/page-target-guards.js +50 -0
  234. package/dist/extensions/agent-browser/lib/page-target-navigation.js +104 -0
  235. package/dist/extensions/agent-browser/lib/page-target-validation.js +59 -243
  236. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  237. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +134 -68
  238. package/dist/extensions/agent-browser/lib/playbook.js +18 -14
  239. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  240. package/dist/extensions/agent-browser/lib/process-environment.js +22 -6
  241. package/dist/extensions/agent-browser/lib/process-errors.js +23 -0
  242. package/dist/extensions/agent-browser/lib/process-identity.js +47 -15
  243. package/dist/extensions/agent-browser/lib/process-socket-storage.js +256 -0
  244. package/dist/extensions/agent-browser/lib/process-stdout.js +74 -0
  245. package/dist/extensions/agent-browser/lib/process.js +146 -537
  246. package/dist/extensions/agent-browser/lib/prompt-artifacts.js +287 -0
  247. package/dist/extensions/agent-browser/lib/prompt-policy.js +15 -194
  248. package/dist/extensions/agent-browser/lib/read-command.js +41 -0
  249. package/dist/extensions/agent-browser/lib/read-confirmation.js +138 -35
  250. package/dist/extensions/agent-browser/lib/recording-reservations.js +118 -45
  251. package/dist/extensions/agent-browser/lib/redaction-fields.js +75 -0
  252. package/dist/extensions/agent-browser/lib/redaction-json.js +149 -0
  253. package/dist/extensions/agent-browser/lib/redaction-url.js +88 -0
  254. package/dist/extensions/agent-browser/lib/results/action-contracts.js +1 -0
  255. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +28 -271
  256. package/dist/extensions/agent-browser/lib/results/artifact-contracts.js +1 -0
  257. package/dist/extensions/agent-browser/lib/results/artifact-manifest-validation.js +133 -0
  258. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +96 -94
  259. package/dist/extensions/agent-browser/lib/results/artifact-recommendations.js +73 -0
  260. package/dist/extensions/agent-browser/lib/results/categories.js +111 -54
  261. package/dist/extensions/agent-browser/lib/results/confirmation.js +29 -10
  262. package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +62 -27
  263. package/dist/extensions/agent-browser/lib/results/electron-recommendations.js +83 -0
  264. package/dist/extensions/agent-browser/lib/results/envelope-decoding.js +48 -0
  265. package/dist/extensions/agent-browser/lib/results/envelope.js +93 -66
  266. package/dist/extensions/agent-browser/lib/results/evidence-contracts.js +1 -0
  267. package/dist/extensions/agent-browser/lib/results/failure-recommendations.js +180 -0
  268. package/dist/extensions/agent-browser/lib/results/network-routes.js +86 -45
  269. package/dist/extensions/agent-browser/lib/results/network.js +35 -12
  270. package/dist/extensions/agent-browser/lib/results/next-actions.js +49 -19
  271. package/dist/extensions/agent-browser/lib/results/presentation/artifact-files.js +320 -0
  272. package/dist/extensions/agent-browser/lib/results/presentation/artifact-format.js +138 -0
  273. package/dist/extensions/agent-browser/lib/results/presentation/artifact-images.js +113 -0
  274. package/dist/extensions/agent-browser/lib/results/presentation/artifact-verification.js +145 -0
  275. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +99 -552
  276. package/dist/extensions/agent-browser/lib/results/presentation/batch-contracts.js +1 -0
  277. package/dist/extensions/agent-browser/lib/results/presentation/batch-recording.js +118 -0
  278. package/dist/extensions/agent-browser/lib/results/presentation/batch-redaction.js +68 -0
  279. package/dist/extensions/agent-browser/lib/results/presentation/batch-rendering.js +135 -0
  280. package/dist/extensions/agent-browser/lib/results/presentation/batch-step.js +227 -0
  281. package/dist/extensions/agent-browser/lib/results/presentation/batch-summary.js +91 -0
  282. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +91 -460
  283. package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +9 -5
  284. package/dist/extensions/agent-browser/lib/results/presentation/command-presenters.js +216 -0
  285. package/dist/extensions/agent-browser/lib/results/presentation/common.js +26 -9
  286. package/dist/extensions/agent-browser/lib/results/presentation/content.js +86 -29
  287. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-a11y.js +67 -0
  288. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-health.js +79 -0
  289. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-identity.js +199 -0
  290. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-logs.js +75 -0
  291. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network-actions.js +216 -0
  292. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network.js +124 -0
  293. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-redaction.js +64 -0
  294. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-storage.js +209 -0
  295. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-stream.js +69 -0
  296. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-summary.js +222 -0
  297. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +103 -1019
  298. package/dist/extensions/agent-browser/lib/results/presentation/early-result.js +70 -0
  299. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +130 -60
  300. package/dist/extensions/agent-browser/lib/results/presentation/input-contracts.js +1 -0
  301. package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +60 -145
  302. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +147 -88
  303. package/dist/extensions/agent-browser/lib/results/presentation/notices.js +75 -0
  304. package/dist/extensions/agent-browser/lib/results/presentation/observation-contracts.js +1 -0
  305. package/dist/extensions/agent-browser/lib/results/presentation/observation-rendering.js +127 -0
  306. package/dist/extensions/agent-browser/lib/results/presentation/outcomes.js +120 -0
  307. package/dist/extensions/agent-browser/lib/results/presentation/output-completion.js +77 -0
  308. package/dist/extensions/agent-browser/lib/results/presentation/output-spill.js +51 -0
  309. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +117 -237
  310. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +35 -21
  311. package/dist/extensions/agent-browser/lib/results/presentation/skills.js +104 -73
  312. package/dist/extensions/agent-browser/lib/results/presentation/source.js +109 -0
  313. package/dist/extensions/agent-browser/lib/results/presentation.js +17 -248
  314. package/dist/extensions/agent-browser/lib/results/recommendation-contracts.js +1 -0
  315. package/dist/extensions/agent-browser/lib/results/recording.js +52 -14
  316. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +14 -5
  317. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +30 -22
  318. package/dist/extensions/agent-browser/lib/results/selector-recovery-target.js +83 -0
  319. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +123 -123
  320. package/dist/extensions/agent-browser/lib/results/snapshot-compact.js +266 -0
  321. package/dist/extensions/agent-browser/lib/results/snapshot-content.js +32 -0
  322. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +104 -71
  323. package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +31 -11
  324. package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +125 -66
  325. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +26 -7
  326. package/dist/extensions/agent-browser/lib/results/snapshot.js +28 -248
  327. package/dist/extensions/agent-browser/lib/results/text.js +16 -5
  328. package/dist/extensions/agent-browser/lib/runtime-args-validation.js +133 -0
  329. package/dist/extensions/agent-browser/lib/runtime-compatibility.js +81 -0
  330. package/dist/extensions/agent-browser/lib/runtime-contracts.js +1 -0
  331. package/dist/extensions/agent-browser/lib/runtime-redaction.js +118 -0
  332. package/dist/extensions/agent-browser/lib/runtime-replay-events.js +144 -0
  333. package/dist/extensions/agent-browser/lib/runtime-session-identity.js +76 -0
  334. package/dist/extensions/agent-browser/lib/runtime-session-plan.js +114 -0
  335. package/dist/extensions/agent-browser/lib/runtime-session-replay.js +123 -0
  336. package/dist/extensions/agent-browser/lib/runtime-tab-correction.js +65 -0
  337. package/dist/extensions/agent-browser/lib/runtime-timeouts.js +28 -0
  338. package/dist/extensions/agent-browser/lib/runtime.js +137 -1037
  339. package/dist/extensions/agent-browser/lib/session-identity.js +51 -0
  340. package/dist/extensions/agent-browser/lib/session-page-observation.js +357 -0
  341. package/dist/extensions/agent-browser/lib/session-page-state.js +188 -324
  342. package/dist/extensions/agent-browser/lib/session-page-types.js +1 -0
  343. package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +78 -0
  344. package/dist/extensions/agent-browser/lib/temp-mutation-queue.js +7 -0
  345. package/dist/extensions/agent-browser/lib/temp-root-ownership.js +234 -0
  346. package/dist/extensions/agent-browser/lib/temp-root.js +207 -0
  347. package/dist/extensions/agent-browser/lib/temp.js +33 -446
  348. package/dist/extensions/agent-browser/lib/tool-surface.js +94 -24
  349. package/dist/extensions/agent-browser/lib/upstream-version.js +3 -2
  350. package/dist/extensions/agent-browser/lib/web-search-providers.js +229 -0
  351. package/dist/extensions/agent-browser/lib/web-search-request.js +108 -0
  352. package/dist/extensions/agent-browser/lib/web-search-results.js +281 -0
  353. package/dist/extensions/agent-browser/lib/web-search-schema.js +82 -0
  354. package/dist/extensions/agent-browser/lib/web-search.js +109 -617
  355. package/dist/extensions/agent-browser/lib/webmcp-observation.js +13 -6
  356. package/dist/extensions/agent-browser/lib/windows-stock-launcher.js +63 -37
  357. package/dist/extensions/agent-browser/script-worker.js +80 -43
  358. package/dist/scripts/agent-browser-target.mjs +4 -2
  359. package/docs/ARCHITECTURE.md +22 -10
  360. package/docs/CODE_QUALITY.md +242 -0
  361. package/docs/COMMAND_REFERENCE.md +264 -229
  362. package/docs/ELECTRON.md +53 -44
  363. package/docs/RELEASE.md +21 -17
  364. package/docs/REQUIREMENTS.md +2 -0
  365. package/docs/SESSION_STORAGE.md +1 -1
  366. package/docs/SUPPORT_MATRIX.md +84 -77
  367. package/docs/TOOL_CONTRACT.md +165 -130
  368. package/docs/platform-smoke.md +5 -5
  369. package/package.json +143 -120
  370. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  371. package/scripts/agent-browser-target.mjs +6 -2
  372. package/scripts/build.mjs +37 -8
  373. package/scripts/capability-core-commands.mjs +193 -0
  374. package/scripts/capability-options.mjs +283 -0
  375. package/scripts/capability-samples.mjs +133 -0
  376. package/scripts/capability-section.mjs +11 -0
  377. package/scripts/config.mjs +213 -114
  378. package/scripts/convert-browser-session.mjs +30 -9
  379. package/scripts/doctor-sources.mjs +195 -0
  380. package/scripts/doctor.mjs +92 -247
  381. package/scripts/platform-smoke/artifacts.mjs +38 -11
  382. package/scripts/platform-smoke/commands.mjs +104 -0
  383. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  384. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  385. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  386. package/scripts/platform-smoke/doctor.mjs +212 -320
  387. package/scripts/platform-smoke/lease-evidence.mjs +134 -0
  388. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  389. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  390. package/scripts/platform-smoke/targets.mjs +158 -472
  391. package/scripts/platform-smoke.mjs +55 -40
  392. package/scripts/prepare.mjs +16 -7
@@ -1,381 +1,126 @@
1
- import { createHash, randomUUID } from "node:crypto";
1
+ import { randomUUID } from "node:crypto";
2
2
  import { constants } from "node:fs";
3
3
  import { link, lstat, mkdir, open, unlink } from "node:fs/promises";
4
4
  import { dirname, resolve } from "node:path";
5
- import { Readable } from "node:stream";
6
- import { pipeline } from "node:stream/promises";
7
- import parser from "stream-json/parser.js";
8
- import ignore from "stream-json/filters/ignore.js";
9
- import stringer from "stream-json/stringer.js";
10
- import disassembler from "stream-json/disassembler.js";
11
- import { extractUpstreamCommandTokens } from "./argv-descriptor.js";
12
- import { getAgentBrowserSessionIdentityKey, isAgentBrowserSessionIdentityKeyInNamespace } from "./argv-grammar.js";
13
- import { batchHasSuccessfulCloseAll, getSuccessfulBatchCloseLifecycle } from "./batch-lifecycle.js";
14
- import { BROWSER_RESULT_TOOLS, BROWSER_STATE_FIELDS, BROWSER_TRANSITION_ENTRY, applyArtifactChanges, artifactChanges, browserStateEffects, getBrowserRecord, snapshotDefinition } from "./browser-transcript.js";
15
- import { projectJson, readRange, scanJournalMetadata } from "./browser-journal.js";
16
- import { isCloseAllCommand, isCloseCommand, isReadOnlyDiagnosticSessionTargetCommand } from "./command-taxonomy.js";
17
- import { isRecord } from "./parsing.js";
18
- import { isSessionArtifactManifest } from "./results/artifact-manifest.js";
19
- import { buildNoActivePageRefSnapshotInvalidation, extractSessionTabTargetFromBatchResults, isNoActivePageSnapshotFailure, normalizeSessionTabTarget } from "./session-page-state.js";
20
- const emptyProjection = () => ({ pages: new Map(), nextIndex: 0 });
21
- function legacyTarget(value) {
22
- return normalizeSessionTabTarget({
23
- url: typeof value.url === "string" ? value.url : undefined,
24
- title: typeof value.title === "string" ? value.title : undefined,
25
- targetId: typeof value.targetId === "string" ? value.targetId : undefined,
26
- });
27
- }
28
- function legacyMessage(entry) {
29
- if (entry.type === "custom" && entry.customType === BROWSER_TRANSITION_ENTRY && isRecord(entry.data) && isRecord(entry.data.details))
30
- return entry.data;
31
- const message = entry.type === "message" && isRecord(entry.message) ? entry.message : undefined;
32
- return message && typeof message.toolName === "string" && BROWSER_RESULT_TOOLS.has(message.toolName) && isRecord(message.details)
33
- && message.details.browserEventVersion !== 1 ? message : undefined;
34
- }
35
- function legacySnapshot(value, id) {
36
- if (!isRecord(value) || !Array.isArray(value.refIds))
37
- return undefined;
38
- const refIds = value.refIds.filter((ref) => typeof ref === "string" && /^e\d+$/.test(ref));
39
- const sourceRefs = isRecord(value.refs) ? value.refs : {};
40
- const snapshot = {
41
- snapshotId: typeof value.snapshotId === "string" ? value.snapshotId : id, refIds,
42
- generation: typeof value.generation === "string" ? value.generation : undefined,
43
- refs: Object.fromEntries(refIds.flatMap(refId => {
44
- const ref = sourceRefs[refId];
45
- if (!isRecord(ref) || typeof ref.name !== "string" || typeof ref.role !== "string")
46
- return [];
47
- return [[refId, { name: ref.name, role: ref.role, ...(typeof ref.isEditable === "boolean" ? { isEditable: ref.isEditable } : {}), ...(typeof ref.isContentEditable === "boolean" ? { isContentEditable: ref.isContentEditable } : {}) }]];
48
- })),
49
- target: isRecord(value.target) ? legacyTarget(value.target) : undefined,
50
- };
51
- return snapshotDefinition(snapshot);
52
- }
53
- /** Offline only: normalize old receipts along their actual parent ancestry, never physical-order equality. */
54
- export function convertLegacyBrowserEntry(entry, parent = emptyProjection(), ownerSessionId) {
55
- const current = { pages: new Map(parent.pages), manifest: parent.manifest, nextIndex: parent.nextIndex };
56
- const nativeId = typeof entry.id === "string" ? entry.id : randomUUID();
57
- const canonical = getBrowserRecord(entry);
58
- if (canonical) {
59
- current.manifest = applyArtifactChanges(parent.manifest, canonical.event.artifacts);
60
- for (const page of canonical.event.pages ?? []) {
61
- const prior = current.pages.get(page.key) ?? {};
62
- if (page.clear) {
63
- current.pages.delete(page.key);
64
- continue;
65
- }
66
- const definition = canonical.snapshot;
67
- const digest = definition?.refs ? createHash("sha256").update(JSON.stringify({ refs: definition.refs, target: definition.target, generation: definition.generation })).digest("hex") : prior.snapshot?.digest ?? "";
68
- current.pages.set(page.key, { target: page.target, unknown: page.unknown, reopenPending: page.reopenPending,
69
- snapshot: page.refs.kind === "replace" || page.refs.kind === "reuse" ? { id: page.refs.snapshotId, digest, usable: true, candidate: false }
70
- : prior.snapshot ? { ...prior.snapshot, usable: false, candidate: canonical.event.phase === "begin" } : undefined,
71
- pending: canonical.event.phase === "begin" ? { operationId: canonical.event.operationId, toolCallId: canonical.event.toolCallId, index: canonical.event.commandIndex } : undefined });
72
- }
73
- return { projection: current };
74
- }
75
- if (entry.type === "custom" && entry.customType === "agent-browser-script-session" && isRecord(entry.data)) {
76
- return { record: { event: { version: 1, phase: "state", operationId: `legacy-${nativeId}`, toolCallId: `legacy-${nativeId}`, commandIndex: 0, isError: entry.data.cleanup !== "closed", state: { scriptLease: { ...entry.data, ownerSessionId: entry.data.ownerSessionId ?? ownerSessionId } } } }, projection: current };
5
+ import { scanJournalMetadata } from "./browser-journal-reader.js";
6
+ import { getErrorCode } from "./process-errors.js";
7
+ import { BrowserConversionWriter, sourceChecksum } from "./browser-session-conversion-stream.js";
8
+ export { convertLegacyBrowserEntry, convertBrowserEntries } from "./browser-legacy-projection.js";
9
+ async function validateConversionPaths(options) {
10
+ if (!options.confirmedStopped) {
11
+ throw new Error("Stop/quiesce the exact session writer first, then pass --confirm-stopped. Conversion never stops a session.");
77
12
  }
78
- const message = legacyMessage(entry);
79
- if (!message || !isRecord(message.details))
80
- return { projection: parent };
81
- const details = message.details;
82
- const sessionName = typeof details.sessionName === "string" ? details.sessionName : undefined;
83
- const namespace = typeof details.namespace === "string" ? details.namespace : undefined;
84
- const key = sessionName ? getAgentBrowserSessionIdentityKey(sessionName, namespace) : undefined;
85
- const args = Array.isArray(details.args) ? details.args.filter((arg) => typeof arg === "string") : [];
86
- const tokens = extractUpstreamCommandTokens(args);
87
- const command = typeof details.command === "string" ? details.command : tokens[0];
88
- const subcommand = typeof details.subcommand === "string" ? details.subcommand : tokens[1];
89
- const isError = message.isError === true;
90
- const toolCallId = typeof message.toolCallId === "string" ? message.toolCallId : `legacy-${nativeId}`;
91
- const prior = key ? current.pages.get(key) ?? {} : {};
92
- const begin = entry.type === "custom" && details.sessionTabTargetUnknown === true && details.command === undefined && details.exitCode === undefined && details.agentBrowserStarted === undefined;
93
- const pending = prior.pending?.toolCallId === toolCallId ? prior.pending : undefined;
94
- const phase = begin ? "begin" : pending ? "finish" : "state";
95
- const commandIndex = begin ? current.nextIndex++ : pending?.index ?? 0;
96
- const operationId = pending?.operationId ?? `legacy-${nativeId}`;
97
- const pages = [];
98
- const closeLifecycle = getSuccessfulBatchCloseLifecycle(details.batchSteps);
99
- const closeAll = details.closeAllApplied === true || (!isError && isCloseAllCommand(tokens)) || batchHasSuccessfulCloseAll(details.batchSteps);
100
- const lifecycleReset = !isError && isCloseCommand(command) || closeLifecycle !== undefined;
101
- if (closeAll) {
102
- for (const pageKey of current.pages.keys())
103
- if (isAgentBrowserSessionIdentityKeyInNamespace(pageKey, namespace)) {
104
- current.pages.delete(pageKey);
105
- pages.push({ key: pageKey, clear: true, refs: { kind: "invalidate" } });
106
- }
13
+ const source = resolve(options.source);
14
+ const destination = resolve(options.destination);
15
+ if (source === destination) {
16
+ throw new Error("Conversion requires a separate destination; originals are never rewritten.");
107
17
  }
108
- else if (key && lifecycleReset) {
109
- current.pages.delete(key);
110
- pages.push({ key, clear: true, refs: { kind: "invalidate" } });
18
+ const sourceStat = await lstat(source);
19
+ if (!sourceStat.isFile() || sourceStat.isSymbolicLink()) {
20
+ throw new Error("Conversion source must be a regular file, not a symlink.");
111
21
  }
112
- let definition;
113
- const hasPageEffects = begin || ["sessionTabTargetUnknown", "sessionTabTarget", "sessionTabReopenPending", "refSnapshot", "refSnapshotInvalidation"].some(field => details[field] !== undefined)
114
- || command === "batch" && Array.isArray(details.data);
115
- if (key && hasPageEffects && !((closeAll || lifecycleReset) && (isCloseCommand(command) || closeLifecycle?.endsClosed === true))) {
116
- const page = { ...(current.pages.get(key) ?? {}) };
117
- if (begin) {
118
- page.target = undefined;
119
- page.unknown = true;
120
- page.snapshot = prior.snapshot ? { ...prior.snapshot, usable: false, candidate: true } : undefined;
121
- page.pending = { toolCallId, operationId, index: commandIndex };
122
- pages.push({ key, refs: { kind: "unknown" }, unknown: true });
123
- }
124
- else if (details.sessionTabTargetUnknown === true) {
125
- page.target = undefined;
126
- page.unknown = true;
127
- page.pending = undefined;
128
- page.snapshot = page.snapshot ? { ...page.snapshot, usable: false, candidate: false } : undefined;
129
- pages.push({ key, refs: { kind: "unknown", invalidation: isRecord(details.refSnapshotInvalidation) ? details.refSnapshotInvalidation : undefined }, unknown: true });
130
- }
131
- else {
132
- if (!isRecord(details.compiledNetworkSourceLookup) && !isReadOnlyDiagnosticSessionTargetCommand(command, subcommand) && isRecord(details.sessionTabTarget))
133
- page.target = legacyTarget(details.sessionTabTarget) ?? page.target;
134
- else if (command === "batch" && !isRecord(details.compiledNetworkSourceLookup))
135
- page.target = extractSessionTabTargetFromBatchResults(details.data) ?? page.target;
136
- if (page.target)
137
- page.unknown = undefined;
138
- if (typeof details.sessionTabReopenPending === "boolean")
139
- page.reopenPending = details.sessionTabReopenPending;
140
- const invalidation = isRecord(details.refSnapshotInvalidation) && ["no-active-page", "page-transition"].includes(String(details.refSnapshotInvalidation.reason))
141
- ? details.refSnapshotInvalidation
142
- : isNoActivePageSnapshotFailure(command, typeof details.error === "string" ? details.error : typeof details.summary === "string" ? details.summary : undefined) ? buildNoActivePageRefSnapshotInvalidation() : undefined;
143
- const candidate = invalidation ? undefined : legacySnapshot(details.refSnapshot, `snapshot-${nativeId}`);
144
- let refs;
145
- if (candidate) {
146
- const digest = createHash("sha256").update(JSON.stringify({ refs: candidate.refs, target: candidate.target, generation: candidate.generation })).digest("hex");
147
- if (page.snapshot?.digest === digest && (page.snapshot.usable || page.snapshot.candidate)
148
- && (!isRecord(details.refSnapshot) || typeof details.refSnapshot.snapshotId !== "string" || details.refSnapshot.snapshotId === page.snapshot.id))
149
- refs = { kind: "reuse", snapshotId: page.snapshot.id };
150
- else {
151
- definition = candidate;
152
- refs = { kind: "replace", snapshotId: candidate.id };
153
- }
154
- page.snapshot = { id: refs.snapshotId, digest, usable: true, candidate: false };
155
- }
156
- else if (invalidation) {
157
- refs = { kind: "invalidate", invalidation: { reason: invalidation.reason, summary: typeof invalidation.summary === "string" ? invalidation.summary : "The prior refs were invalidated; take a fresh snapshot." } };
158
- page.snapshot = page.snapshot ? { ...page.snapshot, usable: false, candidate: false } : undefined;
159
- }
160
- else
161
- refs = page.snapshot?.usable ? { kind: "reuse", snapshotId: page.snapshot.id } : { kind: "invalidate" };
162
- page.pending = undefined;
163
- pages.push({ key, target: page.target, unknown: page.unknown, reopenPending: page.reopenPending, refs });
164
- }
165
- current.pages.set(key, page);
22
+ const directory = dirname(destination);
23
+ await mkdir(directory, { mode: 0o700, recursive: true });
24
+ await validateDestination(directory, destination);
25
+ return { source, destination, directory, sourceStat };
26
+ }
27
+ async function validateDestination(directory, destination) {
28
+ const entry = await lstat(directory);
29
+ if (!entry.isDirectory() ||
30
+ entry.isSymbolicLink() ||
31
+ (process.platform !== "win32" &&
32
+ (entry.uid !== process.getuid?.() || (entry.mode & 0o077) !== 0))) {
33
+ throw new Error("Conversion destination must be a private current-user directory (0700 on POSIX), without symlinks.");
166
34
  }
167
- if (isSessionArtifactManifest(details.artifactManifest) && (!parent.manifest || details.artifactManifest.updatedAtMs >= parent.manifest.updatedAtMs))
168
- current.manifest = details.artifactManifest;
169
- const artifacts = artifactChanges(parent.manifest, current.manifest);
170
- if (!artifacts)
171
- current.manifest = parent.manifest;
172
- const state = browserStateEffects(details);
173
- if (isRecord(state.electron)) {
174
- const stamp = (value) => isRecord(value) ? { ...value, ownerSessionId: value.ownerSessionId ?? ownerSessionId } : value;
175
- const cleanup = isRecord(state.electron.cleanup) ? state.electron.cleanup : undefined;
176
- state.electron = { ...state.electron, launch: stamp(state.electron.launch), ...(cleanup ? { cleanup: {
177
- ...cleanup, records: Array.isArray(cleanup.records) ? cleanup.records.map(stamp) : cleanup.records,
178
- results: Array.isArray(cleanup.results) ? cleanup.results.map(row => isRecord(row) ? { ...row, record: stamp(row.record) } : row) : cleanup.results,
179
- } } : {}) };
35
+ try {
36
+ await lstat(destination);
37
+ throw new Error("Conversion destination is occupied.");
180
38
  }
181
- return { record: { event: { version: 1, phase, operationId, toolCallId, commandIndex, isError, state, pages, artifacts }, ...(definition ? { snapshot: definition } : {}) }, projection: current };
182
- }
183
- /** Explicit archive/in-memory conversion. Runtime restoration never invokes the legacy decoder. */
184
- export function convertBrowserEntries(entries, ownerSessionId) {
185
- const states = new Map();
186
- let linear = emptyProjection();
187
- return entries.map((value, index) => {
188
- if (!isRecord(value))
189
- return value;
190
- const entry = { ...value, id: typeof value.id === "string" ? value.id : `archive-${index}`, parentId: value.parentId ?? null };
191
- const parent = typeof value.parentId === "string" ? states.get(value.parentId) ?? emptyProjection() : Object.hasOwn(value, "parentId") ? emptyProjection() : linear;
192
- const converted = convertLegacyBrowserEntry(entry, parent, ownerSessionId);
193
- states.set(entry.id, converted.projection);
194
- linear = converted.projection;
195
- return converted.record ? { ...entry, ...(entry.type === "custom" ? { customType: BROWSER_TRANSITION_ENTRY } : {}), data: converted.record } : entry;
196
- });
197
- }
198
- const LEGACY_DETAILS_FIELDS = [...BROWSER_STATE_FIELDS, "browserEventVersion", "electron", "compiledNetworkSourceLookup", "sessionTabTarget", "sessionTabTargetUnknown", "sessionTabReopenPending", "refSnapshot", "refSnapshotInvalidation", "artifactManifest", "error", "summary"];
199
- const LEGACY_FIELDS = [
200
- ["data", "event"], ["data", "snapshot"], ["data", "cleanup"], ["data", "sessionName"], ["data", "closeCommandArgs"], ["data", "launchAttempted"],
201
- ["data", "toolCallId"], ["data", "isError"], ["message", "toolName"], ["message", "toolCallId"], ["message", "isError"],
202
- ...["data", "message"].flatMap(root => LEGACY_DETAILS_FIELDS.map(field => [root, "details", field])),
203
- ...["data", "message"].flatMap(root => [
204
- ...["command", "success", "lifecycle"].map(field => [root, "details", "batchSteps", "*", field]),
205
- ...[["data", "lifecycle"], ["result", "lifecycle"]].map(field => [root, "details", "batchSteps", "*", ...field]),
206
- ]),
207
- ...["data", "message"].flatMap(root => [
208
- ...[["command"], ["success"], ["error"]].map(field => [root, "details", "data", "*", ...field]),
209
- ...["url", "title", "origin", "targetId"].map(field => [root, "details", "data", "*", "result", field]),
210
- ]),
211
- ];
212
- async function sourceChecksum(file, size) {
213
- const hash = createHash("sha256");
214
- for await (const chunk of readRange(file, { offset: 0, length: size }))
215
- hash.update(chunk);
216
- return hash.digest("hex");
217
- }
218
- async function writeBytes(file, chunks) {
219
- for await (const chunk of chunks) {
220
- const buffer = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
221
- let offset = 0;
222
- while (offset < buffer.length) {
223
- const { bytesWritten } = await file.write(buffer, offset, buffer.length - offset);
224
- if (!bytesWritten)
225
- throw new Error("Could not write converted journal.");
226
- offset += bytesWritten;
39
+ catch (error) {
40
+ if (getErrorCode(error) !== "ENOENT") {
41
+ throw error;
227
42
  }
228
43
  }
229
44
  }
230
- async function rewriteMessage(file, range, destination, record) {
231
- async function* decode() {
232
- const decoder = new TextDecoder("utf-8", { fatal: true });
233
- for await (const bytes of readRange(file, range))
234
- yield decoder.decode(bytes, { stream: true });
235
- const tail = decoder.decode();
236
- if (tail)
237
- yield tail;
238
- }
239
- const tokenizer = parser.asStream({ packValues: false, packKeys: true, streamKeys: false });
240
- const filter = ignore.asStream({ filter: /^(?:data|message\.details\.(?:refSnapshot|artifactManifest|browserEventVersion))$/ });
241
- async function* inject(tokens) {
242
- let depth = 0;
243
- for await (const token of tokens) {
244
- if (token.name === "startObject" || token.name === "startArray")
245
- depth++;
246
- if (token.name === "endObject" || token.name === "endArray") {
247
- depth--;
248
- if (depth === 0) {
249
- yield { name: "keyValue", value: "data" };
250
- yield* disassembler({ packValues: false, packKeys: true, streamKeys: false })(record);
251
- }
252
- }
253
- yield token;
254
- }
45
+ async function verifySourceUnchanged(file, source, initial, checksum) {
46
+ const final = await file.stat();
47
+ const finalPath = await lstat(source);
48
+ if (final.dev !== initial.dev ||
49
+ final.ino !== initial.ino ||
50
+ final.size !== initial.size ||
51
+ final.mtimeMs !== initial.mtimeMs ||
52
+ finalPath.dev !== initial.dev ||
53
+ finalPath.ino !== initial.ino ||
54
+ (await sourceChecksum(file, initial.size)) !== checksum) {
55
+ throw new Error("Conversion source changed; no destination was published.");
255
56
  }
256
- const output = stringer.asStream({ useKeyValues: true });
257
- const processing = pipeline(Readable.from(decode()), tokenizer, filter, inject, output);
57
+ }
58
+ async function syncPublishedDirectory(directory) {
59
+ const parent = await open(directory, constants.O_RDONLY);
258
60
  try {
259
- await writeBytes(destination, output);
260
- await processing;
61
+ await parent.sync();
261
62
  }
262
63
  finally {
263
- tokenizer.destroy();
264
- filter.destroy();
265
- output.destroy();
64
+ await parent.close();
266
65
  }
267
- await destination.write("\n");
268
66
  }
269
67
  /** Separate-copy publication only. The operator must quiesce the exact writer first. */
270
68
  export async function convertBrowserSession(options) {
271
- if (!options.confirmedStopped)
272
- throw new Error("Stop/quiesce the exact session writer first, then pass --confirm-stopped. Conversion never stops a session.");
273
- const source = resolve(options.source);
274
- const destination = resolve(options.destination);
275
- if (source === destination)
276
- throw new Error("Conversion requires a separate destination; originals are never rewritten.");
277
- const sourcePathStat = await lstat(source);
278
- if (!sourcePathStat.isFile() || sourcePathStat.isSymbolicLink())
279
- throw new Error("Conversion source must be a regular file, not a symlink.");
280
- const directory = dirname(destination);
281
- await mkdir(directory, { mode: 0o700, recursive: true });
282
- const directoryStat = await lstat(directory);
283
- if (!directoryStat.isDirectory() || directoryStat.isSymbolicLink() || process.platform !== "win32" && (directoryStat.uid !== process.getuid?.() || (directoryStat.mode & 0o077) !== 0))
284
- throw new Error("Conversion destination must be a private current-user directory (0700 on POSIX), without symlinks.");
285
- try {
286
- await lstat(destination);
287
- throw new Error("Conversion destination is occupied.");
288
- }
289
- catch (error) {
290
- if (error.code !== "ENOENT")
291
- throw error;
292
- }
293
- const file = await open(source, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
69
+ const { source, destination, directory, sourceStat } = await validateConversionPaths(options);
70
+ const file = await open(source, constants.O_RDONLY | constants.O_NOFOLLOW);
294
71
  const stagePath = `${destination}.${randomUUID()}.tmp`;
295
72
  let stage;
296
73
  let published = false;
297
74
  try {
298
75
  const initial = await file.stat();
299
- if (initial.dev !== sourcePathStat.dev || initial.ino !== sourcePathStat.ino)
76
+ if (initial.dev !== sourceStat.dev || initial.ino !== sourceStat.ino) {
300
77
  throw new Error("Conversion source changed before capture.");
78
+ }
301
79
  const checksum = await sourceChecksum(file, initial.size);
302
80
  const metadata = await scanJournalMetadata(file, initial.size, true);
303
- const header = metadata[0];
304
- if (header?.value.type !== "session" || typeof header.value.id !== "string")
81
+ const header = metadata.at(0);
82
+ if (header === undefined ||
83
+ header.value.type !== "session" ||
84
+ typeof header.value.id !== "string") {
305
85
  throw new Error("Conversion source has no native session header.");
306
- const ids = new Set();
307
- const states = new Map();
86
+ }
308
87
  stage = await open(stagePath, "wx+", 0o600);
309
- let convertedRecords = 0;
310
- let snapshotDefinitions = 0;
88
+ const writer = new BrowserConversionWriter(file, stage, header.value.id, checksum);
311
89
  for (const entry of metadata) {
312
- let record;
313
- if (entry.value.type !== "session") {
314
- if (typeof entry.value.id !== "string" || ids.has(entry.value.id))
315
- throw new Error("Conversion source contains a missing or duplicate native entry ID.");
316
- if (entry.value.parentId !== null && (typeof entry.value.parentId !== "string" || !ids.has(entry.value.parentId)))
317
- throw new Error("Conversion source contains a missing or forward parent.");
318
- ids.add(entry.value.id);
319
- const parent = typeof entry.value.parentId === "string" ? states.get(entry.value.parentId) ?? emptyProjection() : emptyProjection();
320
- const relevant = entry.value.type === "custom" && [BROWSER_TRANSITION_ENTRY, "agent-browser-script-session"].includes(String(entry.value.customType))
321
- || isRecord(entry.value.message) && BROWSER_RESULT_TOOLS.has(String(entry.value.message.toolName));
322
- if (relevant) {
323
- const details = await projectJson(readRange(file, entry), LEGACY_FIELDS, Infinity);
324
- const conversion = convertLegacyBrowserEntry({ ...entry.value, ...details }, parent, header.value.id);
325
- record = conversion.record;
326
- states.set(entry.value.id, conversion.projection);
327
- }
328
- else
329
- states.set(entry.value.id, parent);
330
- }
331
- if (record) {
332
- const data = { ...record, archive: { sourceSha256: checksum, offset: entry.offset, length: entry.length } };
333
- if (entry.value.type === "message")
334
- await rewriteMessage(file, entry, stage, data);
335
- else
336
- await stage.write(`${JSON.stringify({ ...entry.value, customType: BROWSER_TRANSITION_ENTRY, data })}\n`);
337
- convertedRecords++;
338
- if (record.snapshot)
339
- snapshotDefinitions++;
340
- }
341
- else {
342
- await writeBytes(stage, readRange(file, entry));
343
- if (entry.offset + entry.length === initial.size) {
344
- const lastByte = Buffer.alloc(1);
345
- await file.read(lastByte, 0, 1, initial.size - 1);
346
- if (lastByte[0] !== 10)
347
- await stage.write("\n");
348
- }
349
- }
90
+ // Native ancestry and output byte ordering require each entry to finish before the next.
91
+ // oxlint-disable-next-line no-await-in-loop
92
+ await writer.write(entry, initial.size);
350
93
  }
351
94
  await stage.sync();
352
95
  const output = await stage.stat();
353
96
  const destinationSha256 = await sourceChecksum(stage, output.size);
354
- const final = await file.stat();
355
- const finalPath = await lstat(source);
356
- if (final.dev !== initial.dev || final.ino !== initial.ino || final.size !== initial.size || final.mtimeMs !== initial.mtimeMs
357
- || finalPath.dev !== initial.dev || finalPath.ino !== initial.ino || await sourceChecksum(file, initial.size) !== checksum)
358
- throw new Error("Conversion source changed; no destination was published.");
97
+ await verifySourceUnchanged(file, source, initial, checksum);
359
98
  await stage.close();
360
99
  stage = undefined;
361
100
  await link(stagePath, destination); // Exclusive publication; never overwrite an existing destination.
362
101
  published = true;
363
- return { version: 1, source, destination, sessionId: header.value.id, sourceSha256: checksum, destinationSha256, entryCount: ids.size,
364
- convertedRecords, snapshotDefinitions, sourceBytes: initial.size, destinationBytes: output.size };
102
+ return {
103
+ version: 1,
104
+ source,
105
+ destination,
106
+ sessionId: header.value.id,
107
+ sourceSha256: checksum,
108
+ destinationSha256,
109
+ ...writer.counts,
110
+ sourceBytes: initial.size,
111
+ destinationBytes: output.size,
112
+ };
365
113
  }
366
114
  finally {
367
115
  await stage?.close();
368
116
  await file.close();
369
- await unlink(stagePath).catch(error => { if (error.code !== "ENOENT")
370
- throw error; });
371
- if (published && process.platform !== "win32") {
372
- const parent = await open(directory, constants.O_RDONLY);
373
- try {
374
- await parent.sync();
375
- }
376
- finally {
377
- await parent.close();
117
+ await unlink(stagePath).catch((error) => {
118
+ if (getErrorCode(error) !== "ENOENT") {
119
+ throw error;
378
120
  }
121
+ });
122
+ if (published && process.platform !== "win32") {
123
+ await syncPublishedDirectory(directory);
379
124
  }
380
125
  }
381
126
  }
@@ -0,0 +1,35 @@
1
+ export const BROWSER_TRANSITION_ENTRY = "agent-browser-transition";
2
+ export const BROWSER_RESULT_TOOLS = new Set([
3
+ "agent_browser",
4
+ "agent_browser_code",
5
+ "agent_browser_action",
6
+ "agent_browser_qa",
7
+ "agent_browser_electron",
8
+ "agent_browser_source",
9
+ "agent_browser_network_source",
10
+ ]);
11
+ export const BROWSER_STATE_FIELDS = [
12
+ "args",
13
+ "command",
14
+ "subcommand",
15
+ "sessionName",
16
+ "namespace",
17
+ "sessionMode",
18
+ "usedImplicitSession",
19
+ "managedSessionSocketDir",
20
+ "managedSessionDaemon",
21
+ "ownerSessionId",
22
+ "agentBrowserStarted",
23
+ "resultCategory",
24
+ "exitCode",
25
+ "closeAllApplied",
26
+ "attachedBrowserSession",
27
+ "readConfirmation",
28
+ "compatibilityWorkaround",
29
+ "managedSessionHeadedAutosaveDisabled",
30
+ "managedSessionHeadedAutosaveInterval",
31
+ "managedSessionOutcome",
32
+ "managedSessionCwd",
33
+ "managedSessionRestoreDisabled",
34
+ "nativeSucceeded",
35
+ ];