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
@@ -0,0 +1,133 @@
1
+ /** Audited upstream source evidence and the native help commands sampled for drift. */
2
+ export const sourceEvidence = Object.freeze({
3
+ repository: "vercel-labs/agent-browser",
4
+ upstreamHead: "aff6125c023b810ea3f2e5deec5379e9a4270bdc",
5
+ upstreamPackageVersion: "0.38.1",
6
+ inspectedSources: Object.freeze([
7
+ "agent-browser --version",
8
+ "agent-browser --help",
9
+ "selected agent-browser <command> --help output",
10
+ "agent-browser a11y --help",
11
+ "agent-browser mcp --help",
12
+ "agent-browser plugin --help",
13
+ "agent-browser skills list",
14
+ "agent-browser skills get core --full",
15
+ "agent-browser skills get derive-client --full",
16
+ "agent-browser skills get webmcp-gen --full",
17
+ "README.md",
18
+ "CHANGELOG.md",
19
+ "agent-browser.schema.json",
20
+ "bin/agent-browser.js",
21
+ "cli/src/ca_bundle.rs",
22
+ "cli/src/commands.rs",
23
+ "cli/src/mcp.rs",
24
+ "cli/src/flags.rs",
25
+ "cli/src/read.rs",
26
+ "cli/src/doctor/ffmpeg.rs",
27
+ "cli/src/doctor/webgpu.rs",
28
+ "cli/src/native/actions.rs",
29
+ "cli/src/native/a11y/mod.rs",
30
+ "cli/src/native/browser.rs",
31
+ "cli/src/native/tab_binding.rs",
32
+ "cli/src/native/daemon.rs",
33
+ "cli/src/native/element.rs",
34
+ "cli/src/native/recording.rs",
35
+ "cli/src/native/snapshot.rs",
36
+ "cli/src/native/interaction.rs",
37
+ "cli/src/native/screenshot.rs",
38
+ "cli/src/native/stream/cdp_loop.rs",
39
+ "cli/src/native/stream/dashboard.rs",
40
+ "cli/src/native/test_fixtures/webmcp_frame_probe.html",
41
+ "cli/src/native/test_fixtures/webmcp_probe.html",
42
+ "cli/src/native/webmcp.rs",
43
+ "cli/src/output.rs",
44
+ "docs/src/app/webgpu/page.mdx",
45
+ "docs/src/app/webmcp/page.mdx",
46
+ "docs/src/app/network/page.mdx",
47
+ "docs/src/app/proxy/page.mdx",
48
+ "docs/src/app/selectors/page.mdx",
49
+ "docs/src/app/skills/page.mdx",
50
+ "docs/src/app/commands/page.mdx",
51
+ "skill-data/derive-client/SKILL.md",
52
+ "skill-data/core/SKILL.md",
53
+ "skill-data/core/references/video-recording.md",
54
+ "skill-data/protected-vercel-deployments/SKILL.md",
55
+ "skill-data/webmcp-gen/SKILL.md",
56
+ "test/launcher.test.mjs",
57
+ "packages/@agent-browser/eve/README.md",
58
+ "packages/@agent-browser/eve/package.json",
59
+ "packages/@agent-browser/eve/test/extension.test.mjs",
60
+ "packages/@agent-browser/sandbox/README.md",
61
+ "packages/@agent-browser/sandbox/src/shared.ts",
62
+ "packages/@agent-browser/sandbox/src/vercel.ts",
63
+ "packages/@agent-browser/sandbox/src/eve.ts",
64
+ ]),
65
+ });
66
+
67
+ const helpCommand = (label, args) => Object.freeze({ label, args: Object.freeze(args) });
68
+ export const helpCommands = Object.freeze([
69
+ helpCommand("root help", ["--help"]),
70
+ helpCommand("skills help", ["skills", "--help"]),
71
+ helpCommand("skills list", ["skills", "list"]),
72
+ helpCommand("core skill full", ["skills", "get", "core", "--full"]),
73
+ helpCommand("vercel sandbox skill full", ["skills", "get", "vercel-sandbox", "--full"]),
74
+ helpCommand("protected Vercel deployments skill full", [
75
+ "skills",
76
+ "get",
77
+ "protected-vercel-deployments",
78
+ "--full",
79
+ ]),
80
+ helpCommand("WebMCP generation skill full", ["skills", "get", "webmcp-gen", "--full"]),
81
+ helpCommand("open help", ["open", "--help"]),
82
+ helpCommand("read help", ["read", "--help"]),
83
+ helpCommand("click help", ["click", "--help"]),
84
+ helpCommand("key help", ["key", "--help"]),
85
+ helpCommand("scroll help", ["scroll", "--help"]),
86
+ helpCommand("scrollinto help", ["scrollinto", "--help"]),
87
+ helpCommand("keydown help", ["keydown", "--help"]),
88
+ helpCommand("keyup help", ["keyup", "--help"]),
89
+ helpCommand("get help", ["get", "--help"]),
90
+ helpCommand("is help", ["is", "--help"]),
91
+ helpCommand("mouse help", ["mouse", "--help"]),
92
+ helpCommand("drag help", ["drag", "--help"]),
93
+ helpCommand("set help", ["set", "--help"]),
94
+ helpCommand("tab help", ["tab", "--help"]),
95
+ helpCommand("snapshot help", ["snapshot", "--help"]),
96
+ helpCommand("eval help", ["eval", "--help"]),
97
+ helpCommand("wait help", ["wait", "--help"]),
98
+ helpCommand("screenshot help", ["screenshot", "--help"]),
99
+ helpCommand("pdf help", ["pdf", "--help"]),
100
+ helpCommand("close help", ["close", "--help"]),
101
+ helpCommand("find help", ["find", "--help"]),
102
+ helpCommand("network help", ["network", "--help"]),
103
+ helpCommand("cookies help", ["cookies", "--help"]),
104
+ helpCommand("storage help", ["storage", "--help"]),
105
+ helpCommand("state help", ["state", "--help"]),
106
+ helpCommand("session help", ["session", "--help"]),
107
+ helpCommand("frame help", ["frame", "--help"]),
108
+ helpCommand("dialog help", ["dialog", "--help"]),
109
+ helpCommand("window help", ["window", "--help"]),
110
+ helpCommand("keyboard help", ["keyboard", "--help"]),
111
+ helpCommand("batch help", ["batch", "--help"]),
112
+ helpCommand("auth help", ["auth", "--help"]),
113
+ helpCommand("stream help", ["stream", "--help"]),
114
+ helpCommand("dashboard help", ["dashboard", "--help"]),
115
+ helpCommand("chat help", ["chat", "--help"]),
116
+ helpCommand("doctor help", ["doctor", "--help"]),
117
+ helpCommand("diff help", ["diff", "--help"]),
118
+ helpCommand("trace help", ["trace", "--help"]),
119
+ helpCommand("profiler help", ["profiler", "--help"]),
120
+ helpCommand("record help", ["record", "--help"]),
121
+ helpCommand("console help", ["console", "--help"]),
122
+ helpCommand("errors help", ["errors", "--help"]),
123
+ helpCommand("a11y help", ["a11y", "--help"]),
124
+ helpCommand("clipboard help", ["clipboard", "--help"]),
125
+ helpCommand("tap help", ["tap", "--help"]),
126
+ helpCommand("swipe help", ["swipe", "--help"]),
127
+ helpCommand("device help", ["device", "--help"]),
128
+ helpCommand("install help", ["install", "--help"]),
129
+ helpCommand("upgrade help", ["upgrade", "--help"]),
130
+ helpCommand("profiles help", ["profiles", "--help"]),
131
+ helpCommand("mcp help", ["mcp", "--help"]),
132
+ helpCommand("plugin help", ["plugin", "--help"]),
133
+ ]);
@@ -0,0 +1,11 @@
1
+ /** Immutable help/document inventory section construction for the canonical capability baseline. */
2
+ export const root = (token) => ["root help", token];
3
+ export const section = (id, title, docTokens, upstreamExpectations = []) =>
4
+ Object.freeze({
5
+ id,
6
+ title,
7
+ docTokens: Object.freeze(docTokens),
8
+ upstreamExpectations: Object.freeze(
9
+ upstreamExpectations.map(([help, token]) => Object.freeze({ help, token })),
10
+ ),
11
+ });
@@ -10,8 +10,13 @@ import { dirname } from "node:path";
10
10
  import process from "node:process";
11
11
 
12
12
  async function loadConfigPolicyModule() {
13
- const sourcePolicyUrl = new URL("../extensions/agent-browser/lib/config-policy.js", import.meta.url);
14
- if (existsSync(sourcePolicyUrl)) return import(sourcePolicyUrl.href);
13
+ const sourcePolicyUrl = new URL(
14
+ "../extensions/agent-browser/lib/config-policy.js",
15
+ import.meta.url,
16
+ );
17
+ if (existsSync(sourcePolicyUrl)) {
18
+ return import(sourcePolicyUrl.href);
19
+ }
15
20
  return import("../dist/extensions/agent-browser/lib/config-policy.js");
16
21
  }
17
22
 
@@ -81,27 +86,35 @@ function parseArgs(argv) {
81
86
  positional.push(arg);
82
87
  continue;
83
88
  }
84
- if (arg === "--global" || arg === "--project" || arg === "--stdin" || arg === "--help") {
89
+ if (["--global", "--project", "--stdin", "--help"].includes(arg)) {
85
90
  flags.set(arg, true);
86
91
  continue;
87
92
  }
88
93
  if (arg === "--policy" || arg === "--provider") {
89
94
  const value = argv[index + 1];
90
- if (!value || value.startsWith("--")) throw new UsageError(`${arg} requires a value.`);
95
+ if (!value || value.startsWith("--")) {
96
+ throw new UsageError(`${arg} requires a value.`);
97
+ }
91
98
  flags.set(arg, value);
92
99
  index += 1;
93
100
  continue;
94
101
  }
95
102
  throw new UsageError(`Unknown option: ${arg}`);
96
103
  }
97
- if (flags.get("--global") && flags.get("--project")) throw new UsageError("Use only one of --global or --project.");
104
+ if (flags.get("--global") && flags.get("--project")) {
105
+ throw new UsageError("Use only one of --global or --project.");
106
+ }
98
107
  return { flags, positional };
99
108
  }
100
109
 
101
110
  function readConfig(path) {
102
- if (!existsSync(path)) return { ...DEFAULT_CONFIG };
111
+ if (!existsSync(path)) {
112
+ return { ...DEFAULT_CONFIG };
113
+ }
103
114
  const parsed = JSON.parse(readFileSync(path, "utf8"));
104
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) throw new Error(`${path} must contain a JSON object.`);
115
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
116
+ throw new Error(`${path} must contain a JSON object.`);
117
+ }
105
118
  return { ...DEFAULT_CONFIG, ...parsed };
106
119
  }
107
120
 
@@ -118,36 +131,60 @@ function writeConfig(path, config) {
118
131
 
119
132
  function selectWritePath(flags) {
120
133
  const paths = getAgentBrowserConfigPaths();
121
- if (flags.get("--project")) return { path: paths.project, scope: "project" };
134
+ if (flags.get("--project")) {
135
+ return { path: paths.project, scope: "project" };
136
+ }
122
137
  return { path: paths.global, scope: "global" };
123
138
  }
124
139
 
125
140
  function validateWebSearchProviderArg(provider, { allowAll = false } = {}) {
126
- if (isWebSearchProvider(provider) || (allowAll && provider === "all")) return provider;
127
- throw new UsageError(`--provider must be one of ${allowAll ? `${WEB_SEARCH_PROVIDERS.join(", ")}, all` : WEB_SEARCH_PROVIDERS.join(", ")}.`);
141
+ if (isWebSearchProvider(provider) || (allowAll && provider === "all")) {
142
+ return provider;
143
+ }
144
+ throw new UsageError(
145
+ `--provider must be one of ${allowAll ? `${WEB_SEARCH_PROVIDERS.join(", ")}, all` : WEB_SEARCH_PROVIDERS.join(", ")}.`,
146
+ );
128
147
  }
129
148
 
130
149
  function inferWebSearchProviderFromEnvName(envName) {
131
150
  for (const provider of WEB_SEARCH_PROVIDERS) {
132
- if (envName === getWebSearchProviderEnvVar(provider)) return provider;
151
+ if (envName === getWebSearchProviderEnvVar(provider)) {
152
+ return provider;
153
+ }
133
154
  }
134
- return undefined;
155
+ return;
135
156
  }
136
157
 
137
158
  function getWebSearchProvider(flags, options = {}) {
138
159
  const configured = flags.get("--provider");
139
- if (configured) return validateWebSearchProviderArg(configured, options);
160
+ if (configured) {
161
+ return validateWebSearchProviderArg(configured, options);
162
+ }
140
163
  const inferred = options.envName ? inferWebSearchProviderFromEnvName(options.envName) : undefined;
141
- if (inferred) return inferred;
142
- throw new UsageError(options.allowAll ? "--provider is required and must be exa, brave, or all." : "--provider is required and must be exa or brave.");
164
+ if (inferred) {
165
+ return inferred;
166
+ }
167
+ throw new UsageError(
168
+ options.allowAll
169
+ ? "--provider is required and must be exa, brave, or all."
170
+ : "--provider is required and must be exa or brave.",
171
+ );
143
172
  }
144
173
 
145
174
  function setWebSearchCredential(config, provider, value) {
146
- config.webSearch = { ...(config.webSearch ?? {}), [getWebSearchProviderConfigKey(provider)]: value };
175
+ return {
176
+ ...config,
177
+ webSearch: { ...config.webSearch, [getWebSearchProviderConfigKey(provider)]: value },
178
+ };
147
179
  }
148
180
 
149
181
  function clearWebSearchCredential(config, provider) {
150
- if (config.webSearch) delete config.webSearch[getWebSearchProviderConfigKey(provider)];
182
+ if (!config.webSearch) {
183
+ return config;
184
+ }
185
+ const webSearch = { ...config.webSearch };
186
+ delete webSearch[getWebSearchProviderConfigKey(provider)];
187
+ return { ...config, webSearch };
151
188
  }
152
189
 
153
190
  function printPaths() {
@@ -168,171 +205,233 @@ function printStatus() {
168
205
  console.log("");
169
206
  console.log("Effective config:");
170
207
  console.log(` webSearch.enabled: ${state.webSearchEnabled ? "true" : "false"}`);
171
- console.log(` webSearch.preferredProvider: ${state.config.webSearch?.preferredProvider ?? `auto (default ${DEFAULT_WEB_SEARCH_PROVIDER})`}`);
172
- console.log(` webSearch.defaultSearchType: ${state.config.webSearch?.defaultSearchType ?? "not configured (Exa auto)"}`);
208
+ console.log(
209
+ ` webSearch.preferredProvider: ${state.config.webSearch?.preferredProvider ?? `auto (default ${DEFAULT_WEB_SEARCH_PROVIDER})`}`,
210
+ );
211
+ console.log(
212
+ ` webSearch.defaultSearchType: ${state.config.webSearch?.defaultSearchType ?? "not configured (Exa auto)"}`,
213
+ );
173
214
  for (const provider of WEB_SEARCH_PROVIDERS) {
174
215
  const field = getWebSearchProviderConfigKey(provider);
175
- console.log(` webSearch.${field}: ${getCredentialSourceSummary(state.webSearchCredentialSources[provider], provider)}`);
216
+ console.log(
217
+ ` webSearch.${field}: ${getCredentialSourceSummary(state.webSearchCredentialSources[provider], provider)}`,
218
+ );
176
219
  }
177
220
  console.log(` browser.defaultProfile: ${formatBrowserProfileStatus(state)}`);
178
221
  console.log(` browser.executablePath: ${formatBrowserExecutableStatus(state)}`);
179
- if (state.layers.length === 0) console.log(" layers: none");
180
- if (state.warnings.length > 0) {
181
- console.log("");
182
- console.log("Warnings:");
183
- for (const warning of state.warnings) console.log(` - ${warning}`);
222
+ if (state.layers.length === 0) {
223
+ console.log(" layers: none");
184
224
  }
185
- if (state.errors.length > 0) {
225
+ printDiagnostics("Warnings", state.warnings);
226
+ printDiagnostics("Validation errors", state.errors);
227
+ }
228
+
229
+ function printDiagnostics(label, diagnostics) {
230
+ if (diagnostics.length > 0) {
186
231
  console.log("");
187
- console.log("Validation errors:");
188
- for (const error of state.errors) console.log(` - ${error}`);
232
+ console.log(`${label}:`);
233
+ for (const diagnostic of diagnostics) {
234
+ console.log(` - ${diagnostic}`);
235
+ }
189
236
  }
190
237
  }
191
238
 
192
239
  async function readSecretFromStdin(useStdin) {
193
- if (!useStdin) throw new UsageError("set-key requires --stdin so the key is not passed through argv or an echoed prompt.");
240
+ if (!useStdin) {
241
+ throw new UsageError(
242
+ "set-key requires --stdin so the key is not passed through argv or an echoed prompt.",
243
+ );
244
+ }
194
245
  let input = "";
195
- for await (const chunk of process.stdin) input += chunk;
246
+ for await (const chunk of process.stdin) {
247
+ input += chunk;
248
+ }
196
249
  const value = input.trim();
197
- if (!value) throw new UsageError("No key was provided on stdin.");
250
+ if (!value) {
251
+ throw new UsageError("No key was provided on stdin.");
252
+ }
198
253
  return value;
199
254
  }
200
255
 
201
256
  function mutateConfig(path, mutate) {
202
257
  const config = readConfig(path);
203
- mutate(config);
204
- writeConfig(path, config);
258
+ writeConfig(path, mutate(config));
205
259
  }
206
260
 
207
261
  async function handleWebSearch(args, flags) {
208
262
  const action = args[0];
263
+ if (action === "prefer" || action === "enable" || action === "disable") {
264
+ handleWebSearchPreference(action, args, flags);
265
+ return;
266
+ }
209
267
  if (action === "status") {
210
268
  printStatus();
211
269
  return;
212
270
  }
271
+ if (action === "clear") {
272
+ clearWebSearch(flags);
273
+ return;
274
+ }
275
+ await handleWebSearchCredential(action, args, flags);
276
+ }
277
+
278
+ async function handleWebSearchCredential(action, args, flags) {
213
279
  if (action === "set-key") {
214
280
  const provider = getWebSearchProvider(flags);
215
281
  const key = await readSecretFromStdin(Boolean(flags.get("--stdin")));
216
282
  const { path, scope } = selectWritePath(flags);
217
- mutateConfig(path, (config) => {
218
- setWebSearchCredential(config, provider, key);
219
- });
283
+ mutateConfig(path, (config) => setWebSearchCredential(config, provider, key));
220
284
  console.log(`Saved ${getWebSearchProviderLabel(provider)} key to ${scope} config: ${path}`);
221
285
  return;
222
286
  }
223
287
  if (action === "set-env") {
224
288
  const envName = args[1];
225
- if (!envName || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(envName)) throw new UsageError("set-env requires a valid environment variable name.");
289
+ if (!envName || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(envName)) {
290
+ throw new UsageError("set-env requires a valid environment variable name.");
291
+ }
226
292
  const provider = getWebSearchProvider(flags, { envName });
227
293
  const envReference = `$${envName}`;
228
294
  const { path, scope } = selectWritePath(flags);
229
- mutateConfig(path, (config) => {
230
- setWebSearchCredential(config, provider, envReference);
231
- });
295
+ mutateConfig(path, (config) => setWebSearchCredential(config, provider, envReference));
232
296
  console.log(`Saved ${getWebSearchProviderLabel(provider)} ${scope} env reference to: ${path}`);
233
297
  return;
234
298
  }
235
299
  if (action === "set-command") {
236
300
  const provider = getWebSearchProvider(flags);
237
301
  const command = args.slice(1).join(" ").trim();
238
- if (!command) throw new UsageError("set-command requires a command string.");
302
+ if (!command) {
303
+ throw new UsageError("set-command requires a command string.");
304
+ }
239
305
  const { path, scope } = selectWritePath(flags);
240
- mutateConfig(path, (config) => {
241
- setWebSearchCredential(config, provider, `!${command}`);
242
- });
306
+ mutateConfig(path, (config) => setWebSearchCredential(config, provider, `!${command}`));
243
307
  console.log(`Saved ${getWebSearchProviderLabel(provider)} ${scope} command source to: ${path}`);
244
308
  return;
245
309
  }
246
- if (action === "clear") {
247
- const provider = getWebSearchProvider(flags, { allowAll: true });
248
- const { path, scope } = selectWritePath(flags);
249
- mutateConfig(path, (config) => {
250
- if (provider === "all") {
251
- for (const entry of WEB_SEARCH_PROVIDERS) clearWebSearchCredential(config, entry);
252
- } else {
253
- clearWebSearchCredential(config, provider);
254
- }
255
- });
256
- console.log(`Cleared ${provider === "all" ? "all web-search" : getWebSearchProviderLabel(provider)} credential source in ${scope} config: ${path}`);
257
- return;
258
- }
310
+ throw new UsageError(`Unsupported web-search action: ${action ?? ""}`);
311
+ }
312
+
313
+ function clearWebSearch(flags) {
314
+ const provider = getWebSearchProvider(flags, { allowAll: true });
315
+ const { path, scope } = selectWritePath(flags);
316
+ mutateConfig(path, (config) => {
317
+ const providers = provider === "all" ? WEB_SEARCH_PROVIDERS : [provider];
318
+ return providers.reduce(clearWebSearchCredential, config);
319
+ });
320
+ console.log(
321
+ `Cleared ${provider === "all" ? "all web-search" : getWebSearchProviderLabel(provider)} credential source in ${scope} config: ${path}`,
322
+ );
323
+ }
324
+
325
+ function handleWebSearchPreference(action, args, flags) {
259
326
  if (action === "prefer") {
260
327
  const provider = args[1];
261
- if (!provider || (!isWebSearchProvider(provider) && provider !== "auto")) throw new UsageError("prefer requires exa, brave, or auto.");
328
+ if (!provider || (!isWebSearchProvider(provider) && provider !== "auto")) {
329
+ throw new UsageError("prefer requires exa, brave, or auto.");
330
+ }
262
331
  const { path, scope } = selectWritePath(flags);
263
332
  mutateConfig(path, (config) => {
264
- config.webSearch = { ...(config.webSearch ?? {}) };
265
- if (provider === "auto") delete config.webSearch.preferredProvider;
266
- else config.webSearch.preferredProvider = provider;
333
+ const webSearch = { ...config.webSearch };
334
+ if (provider === "auto") {
335
+ delete webSearch.preferredProvider;
336
+ } else {
337
+ webSearch.preferredProvider = provider;
338
+ }
339
+ return { ...config, webSearch };
267
340
  });
268
- console.log(`${provider === "auto" ? "Cleared" : "Saved"} web-search preferred provider in ${scope} config: ${path}`);
341
+ console.log(
342
+ `${provider === "auto" ? "Cleared" : "Saved"} web-search preferred provider in ${scope} config: ${path}`,
343
+ );
269
344
  return;
270
345
  }
271
346
  if (action === "enable" || action === "disable") {
272
347
  const { path, scope } = selectWritePath(flags);
273
- mutateConfig(path, (config) => {
274
- config.webSearch = { ...(config.webSearch ?? {}), enabled: action === "enable" };
275
- });
276
- console.log(`${action === "enable" ? "Enabled" : "Disabled"} agent_browser_web_search in ${scope} config: ${path}`);
348
+ mutateConfig(path, (config) => ({
349
+ ...config,
350
+ webSearch: { ...config.webSearch, enabled: action === "enable" },
351
+ }));
352
+ console.log(
353
+ `${action === "enable" ? "Enabled" : "Disabled"} agent_browser_web_search in ${scope} config: ${path}`,
354
+ );
277
355
  return;
278
356
  }
279
357
  throw new UsageError(`Unsupported web-search action: ${action ?? ""}`);
280
358
  }
281
359
 
282
- function handleBrowser(args, flags) {
283
- const target = args[0];
360
+ function clearBrowserSetting(config, key) {
361
+ if (!config.browser) {
362
+ return config;
363
+ }
364
+ const browser = { ...config.browser };
365
+ delete browser[key];
366
+ return { ...config, browser };
367
+ }
368
+
369
+ function handleBrowserProfile(args, flags) {
284
370
  const action = args[1];
285
- if (target === "profile") {
286
- if (action === "status") {
287
- printStatus();
288
- return;
371
+ if (action === "status") {
372
+ printStatus();
373
+ return;
374
+ }
375
+ if (action === "set") {
376
+ const name = args.slice(2).join(" ").trim();
377
+ if (!name) {
378
+ throw new UsageError(
379
+ "browser profile set requires a profile name or profile directory path.",
380
+ );
289
381
  }
290
- if (action === "set") {
291
- const name = args.slice(2).join(" ").trim();
292
- if (!name) throw new UsageError("browser profile set requires a profile name or profile directory path.");
293
- const policy = flags.get("--policy") || "authenticated-only";
294
- if (!["explicit-only", "authenticated-only", "always"].includes(policy)) throw new UsageError("Invalid --policy value.");
295
- const { path, scope } = selectWritePath(flags);
296
- mutateConfig(path, (config) => {
297
- config.browser = { ...(config.browser ?? {}), defaultProfile: { name, policy } };
298
- });
299
- console.log(`Saved browser default profile in ${scope} config: ${path}`);
300
- return;
382
+ const policy = flags.get("--policy") || "authenticated-only";
383
+ if (!["explicit-only", "authenticated-only", "always"].includes(policy)) {
384
+ throw new UsageError("Invalid --policy value.");
301
385
  }
302
- if (action === "clear") {
303
- const { path, scope } = selectWritePath(flags);
304
- mutateConfig(path, (config) => {
305
- if (config.browser) delete config.browser.defaultProfile;
306
- });
307
- console.log(`Cleared browser default profile in ${scope} config: ${path}`);
308
- return;
386
+ const { path, scope } = selectWritePath(flags);
387
+ mutateConfig(path, (config) => ({
388
+ ...config,
389
+ browser: { ...config.browser, defaultProfile: { name, policy } },
390
+ }));
391
+ console.log(`Saved browser default profile in ${scope} config: ${path}`);
392
+ return;
393
+ }
394
+ if (action === "clear") {
395
+ const { path, scope } = selectWritePath(flags);
396
+ mutateConfig(path, (config) => clearBrowserSetting(config, "defaultProfile"));
397
+ console.log(`Cleared browser default profile in ${scope} config: ${path}`);
398
+ return;
399
+ }
400
+ throw new UsageError(`Unsupported browser profile action: ${action ?? ""}`);
401
+ }
402
+
403
+ function handleBrowserExecutable(args, flags) {
404
+ const action = args[1];
405
+ if (action === "status") {
406
+ printStatus();
407
+ return;
408
+ }
409
+ if (action === "set") {
410
+ const executablePath = args.slice(2).join(" ").trim();
411
+ if (!executablePath) {
412
+ throw new UsageError("browser executable set requires a browser executable path.");
309
413
  }
310
- throw new UsageError(`Unsupported browser profile action: ${action ?? ""}`);
414
+ const { path, scope } = selectWritePath(flags);
415
+ mutateConfig(path, (config) => ({ ...config, browser: { ...config.browser, executablePath } }));
416
+ console.log(`Saved browser executable path in ${scope} config: ${path}`);
417
+ return;
418
+ }
419
+ if (action === "clear") {
420
+ const { path, scope } = selectWritePath(flags);
421
+ mutateConfig(path, (config) => clearBrowserSetting(config, "executablePath"));
422
+ console.log(`Cleared browser executable path in ${scope} config: ${path}`);
423
+ return;
424
+ }
425
+ throw new UsageError(`Unsupported browser executable action: ${action ?? ""}`);
426
+ }
427
+
428
+ function handleBrowser(args, flags) {
429
+ const target = args[0];
430
+ if (target === "profile") {
431
+ return handleBrowserProfile(args, flags);
311
432
  }
312
433
  if (target === "executable") {
313
- if (action === "status") {
314
- printStatus();
315
- return;
316
- }
317
- if (action === "set") {
318
- const executablePath = args.slice(2).join(" ").trim();
319
- if (!executablePath) throw new UsageError("browser executable set requires a browser executable path.");
320
- const { path, scope } = selectWritePath(flags);
321
- mutateConfig(path, (config) => {
322
- config.browser = { ...(config.browser ?? {}), executablePath };
323
- });
324
- console.log(`Saved browser executable path in ${scope} config: ${path}`);
325
- return;
326
- }
327
- if (action === "clear") {
328
- const { path, scope } = selectWritePath(flags);
329
- mutateConfig(path, (config) => {
330
- if (config.browser) delete config.browser.executablePath;
331
- });
332
- console.log(`Cleared browser executable path in ${scope} config: ${path}`);
333
- return;
334
- }
335
- throw new UsageError(`Unsupported browser executable action: ${action ?? ""}`);
434
+ return handleBrowserExecutable(args, flags);
336
435
  }
337
436
  throw new UsageError(`Unsupported browser action: ${target ?? ""}`);
338
437
  }
@@ -2,19 +2,40 @@
2
2
  import { writeFile } from "node:fs/promises";
3
3
  import { parseArgs } from "node:util";
4
4
 
5
- const { values } = parseArgs({ options: {
6
- source: { type: "string" }, output: { type: "string" }, receipt: { type: "string" },
7
- "confirm-stopped": { type: "boolean" }, help: { type: "boolean", short: "h" },
8
- } });
5
+ const { values } = parseArgs({
6
+ options: {
7
+ source: { type: "string" },
8
+ output: { type: "string" },
9
+ receipt: { type: "string" },
10
+ "confirm-stopped": { type: "boolean" },
11
+ help: { type: "boolean", short: "h" },
12
+ },
13
+ });
9
14
  if (values.help) {
10
- console.log("Usage: pi-agent-browser-convert --source <retained.jsonl> --output <private-archive/copy.jsonl> --confirm-stopped [--receipt <new.json>]\nStop/quiesce the exact writer first. This offline command never starts Pi, a provider or a browser, never edits the source, and publishes only a separate private copy. Keep the destination outside automatic session discovery until explicitly selected. The receipt and each converted record identify the retained source checksum/byte range.");
15
+ console.log(
16
+ "Usage: pi-agent-browser-convert --source <retained.jsonl> --output <private-archive/copy.jsonl> --confirm-stopped [--receipt <new.json>]\nStop/quiesce the exact writer first. This offline command never starts Pi, a provider or a browser, never edits the source, and publishes only a separate private copy. Keep the destination outside automatic session discovery until explicitly selected. The receipt and each converted record identify the retained source checksum/byte range.",
17
+ );
11
18
  } else {
12
19
  try {
13
- if (!values.source || !values.output) throw new Error("--source and --output are required; use --help for the stopped-writer workflow.");
14
- const { convertBrowserSession } = await import("../dist/extensions/agent-browser/lib/browser-session-conversion.js");
15
- const receipt = await convertBrowserSession({ source: values.source, destination: values.output, confirmedStopped: values["confirm-stopped"] === true });
20
+ if (!values.source || !values.output) {
21
+ throw new Error(
22
+ "--source and --output are required; use --help for the stopped-writer workflow.",
23
+ );
24
+ }
25
+ const { convertBrowserSession } =
26
+ await import("../dist/extensions/agent-browser/lib/browser-session-conversion.js");
27
+ const receipt = await convertBrowserSession({
28
+ source: values.source,
29
+ destination: values.output,
30
+ confirmedStopped: values["confirm-stopped"] === true,
31
+ });
16
32
  console.log(JSON.stringify(receipt, null, 2));
17
- if (values.receipt) await writeFile(values.receipt, `${JSON.stringify(receipt, null, 2)}\n`, { flag: "wx", mode: 0o600 });
33
+ if (values.receipt) {
34
+ await writeFile(values.receipt, `${JSON.stringify(receipt, null, 2)}\n`, {
35
+ flag: "wx",
36
+ mode: 0o600,
37
+ });
38
+ }
18
39
  } catch (error) {
19
40
  console.error(error instanceof Error ? error.message : String(error));
20
41
  process.exitCode = 1;