pi-agent-browser-native 0.9.3 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/CHANGELOG.md +77 -5
  2. package/README.md +103 -81
  3. package/dist/extensions/agent-browser/index.js +43057 -2031
  4. package/dist/extensions/agent-browser/lib/argv-descriptor.js +49 -26
  5. package/dist/extensions/agent-browser/lib/argv-grammar.js +82 -93
  6. package/dist/extensions/agent-browser/lib/bash-guard.js +129 -126
  7. package/dist/extensions/agent-browser/lib/batch-lifecycle.js +112 -51
  8. package/dist/extensions/agent-browser/lib/browser-execution-claim-codec.js +61 -0
  9. package/dist/extensions/agent-browser/lib/browser-execution-claim-storage.js +232 -0
  10. package/dist/extensions/agent-browser/lib/browser-execution-claims.js +202 -0
  11. package/dist/extensions/agent-browser/lib/browser-execution-identity.js +77 -0
  12. package/dist/extensions/agent-browser/lib/browser-journal-branch.js +98 -0
  13. package/dist/extensions/agent-browser/lib/browser-journal-contracts.js +1 -0
  14. package/dist/extensions/agent-browser/lib/browser-journal-projection.js +221 -0
  15. package/dist/extensions/agent-browser/lib/browser-journal-reader.js +89 -0
  16. package/dist/extensions/agent-browser/lib/browser-journal-replay.js +246 -0
  17. package/dist/extensions/agent-browser/lib/browser-journal.js +103 -394
  18. package/dist/extensions/agent-browser/lib/browser-legacy-pages.js +220 -0
  19. package/dist/extensions/agent-browser/lib/browser-legacy-projection.js +282 -0
  20. package/dist/extensions/agent-browser/lib/browser-legacy-types.js +1 -0
  21. package/dist/extensions/agent-browser/lib/browser-session-conversion-stream.js +217 -0
  22. package/dist/extensions/agent-browser/lib/browser-session-conversion.js +80 -335
  23. package/dist/extensions/agent-browser/lib/browser-transcript-contracts.js +35 -0
  24. package/dist/extensions/agent-browser/lib/browser-transcript-validation.js +166 -0
  25. package/dist/extensions/agent-browser/lib/browser-transcript.js +137 -82
  26. package/dist/extensions/agent-browser/lib/browser-value-parsing.js +15 -0
  27. package/dist/extensions/agent-browser/lib/command-capabilities.js +340 -0
  28. package/dist/extensions/agent-browser/lib/command-policy.js +107 -88
  29. package/dist/extensions/agent-browser/lib/command-taxonomy.js +49 -322
  30. package/dist/extensions/agent-browser/lib/config-policy.js +138 -343
  31. package/dist/extensions/agent-browser/lib/config-providers.js +71 -0
  32. package/dist/extensions/agent-browser/lib/config-validation.js +218 -0
  33. package/dist/extensions/agent-browser/lib/config.js +19 -7
  34. package/dist/extensions/agent-browser/lib/electron/cdp.js +15 -7
  35. package/dist/extensions/agent-browser/lib/electron/cleanup.js +134 -55
  36. package/dist/extensions/agent-browser/lib/electron/discovery-darwin.js +109 -0
  37. package/dist/extensions/agent-browser/lib/electron/discovery-desktop.js +136 -0
  38. package/dist/extensions/agent-browser/lib/electron/discovery-evidence.js +89 -0
  39. package/dist/extensions/agent-browser/lib/electron/discovery-linux.js +93 -0
  40. package/dist/extensions/agent-browser/lib/electron/discovery-packages.js +162 -0
  41. package/dist/extensions/agent-browser/lib/electron/discovery-types.js +2 -0
  42. package/dist/extensions/agent-browser/lib/electron/discovery.js +140 -549
  43. package/dist/extensions/agent-browser/lib/electron/launch-monitor.js +102 -0
  44. package/dist/extensions/agent-browser/lib/electron/launch-process.js +209 -0
  45. package/dist/extensions/agent-browser/lib/electron/launch-types.js +2 -0
  46. package/dist/extensions/agent-browser/lib/electron/launch.js +249 -354
  47. package/dist/extensions/agent-browser/lib/executable-path.js +21 -12
  48. package/dist/extensions/agent-browser/lib/execution-cwd.js +35 -18
  49. package/dist/extensions/agent-browser/lib/input-modes/electron.js +162 -121
  50. package/dist/extensions/agent-browser/lib/input-modes/job.js +116 -313
  51. package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +104 -0
  52. package/dist/extensions/agent-browser/lib/input-modes/lookup-plan.js +132 -0
  53. package/dist/extensions/agent-browser/lib/input-modes/lookup-redaction.js +57 -0
  54. package/dist/extensions/agent-browser/lib/input-modes/lookup-source-evidence.js +151 -0
  55. package/dist/extensions/agent-browser/lib/input-modes/lookup-workspace.js +142 -0
  56. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +57 -412
  57. package/dist/extensions/agent-browser/lib/input-modes/params.js +63 -17
  58. package/dist/extensions/agent-browser/lib/input-modes/qa-analysis.js +268 -0
  59. package/dist/extensions/agent-browser/lib/input-modes/qa-presentation.js +117 -0
  60. package/dist/extensions/agent-browser/lib/input-modes/script-child.js +396 -0
  61. package/dist/extensions/agent-browser/lib/input-modes/script-protocol.js +86 -0
  62. package/dist/extensions/agent-browser/lib/input-modes/script-types.js +1 -0
  63. package/dist/extensions/agent-browser/lib/input-modes/script-validation.js +60 -0
  64. package/dist/extensions/agent-browser/lib/input-modes/script.js +60 -409
  65. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +218 -128
  66. package/dist/extensions/agent-browser/lib/input-modes/shared.js +15 -4
  67. package/dist/extensions/agent-browser/lib/input-modes/types.js +56 -7
  68. package/dist/extensions/agent-browser/lib/json-schema.js +22 -10
  69. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +17 -5
  70. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +92 -425
  71. package/dist/extensions/agent-browser/lib/managed-session-posix-storage.js +58 -0
  72. package/dist/extensions/agent-browser/lib/managed-session-project-identity.js +244 -0
  73. package/dist/extensions/agent-browser/lib/managed-session-restore-context.js +84 -0
  74. package/dist/extensions/agent-browser/lib/managed-session-restore-policy.js +119 -0
  75. package/dist/extensions/agent-browser/lib/managed-session-restore-state.js +83 -0
  76. package/dist/extensions/agent-browser/lib/managed-session-restore.js +168 -300
  77. package/dist/extensions/agent-browser/lib/managed-session-snapshot-records.js +277 -0
  78. package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +128 -305
  79. package/dist/extensions/agent-browser/lib/managed-session-storage.js +56 -253
  80. package/dist/extensions/agent-browser/lib/native-confirmation.js +140 -0
  81. package/dist/extensions/agent-browser/lib/native-output.js +43 -9
  82. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +106 -59
  83. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-merge.js +14 -6
  84. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +109 -57
  85. package/dist/extensions/agent-browser/lib/orchestration/browser-run/browser-observation-result.js +82 -0
  86. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +164 -60
  87. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostic-values.js +31 -0
  88. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +152 -781
  89. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-observation.js +202 -0
  90. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-text-diagnostics.js +109 -0
  91. package/dist/extensions/agent-browser/lib/orchestration/browser-run/fill-diagnostics.js +119 -0
  92. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-action-recovery.js +147 -0
  93. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-actions.js +144 -0
  94. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-content.js +123 -0
  95. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-contracts.js +1 -0
  96. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-details.js +156 -0
  97. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-electron.js +179 -0
  98. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-evidence.js +39 -0
  99. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-missing-binary.js +89 -0
  100. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-recovery.js +97 -0
  101. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-redaction.js +106 -0
  102. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-timeout.js +110 -0
  103. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +41 -538
  104. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +199 -154
  105. package/dist/extensions/agent-browser/lib/orchestration/browser-run/interaction-diagnostics.js +290 -0
  106. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-close.js +167 -0
  107. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-inspection.js +108 -0
  108. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +127 -205
  109. package/dist/extensions/agent-browser/lib/orchestration/browser-run/native-helper-observation.js +65 -0
  110. package/dist/extensions/agent-browser/lib/orchestration/browser-run/observation-types.js +1 -0
  111. package/dist/extensions/agent-browser/lib/orchestration/browser-run/overlay-diagnostics.js +120 -0
  112. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +113 -30
  113. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +109 -28
  114. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter-data.js +150 -0
  115. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +138 -253
  116. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-rendered-text.js +147 -0
  117. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +59 -24
  118. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-artifacts.js +159 -0
  119. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-command.js +131 -0
  120. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-contracts.js +1 -0
  121. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-daemon.js +93 -0
  122. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-failure.js +42 -0
  123. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-guards.js +242 -0
  124. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-input.js +75 -0
  125. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-observations.js +92 -0
  126. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-selection.js +254 -0
  127. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-state.js +121 -0
  128. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-refs.js +130 -0
  129. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-resources.js +114 -0
  130. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-semantic.js +121 -0
  131. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-session-plan.js +222 -0
  132. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-timeouts.js +68 -0
  133. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +176 -1123
  134. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-analysis.js +191 -0
  135. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-confirmation.js +152 -0
  136. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-diagnostics.js +182 -0
  137. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-electron.js +150 -0
  138. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-contracts.js +1 -0
  139. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase-contracts.js +1 -0
  140. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase.js +115 -0
  141. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle.js +256 -0
  142. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed-contracts.js +1 -0
  143. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed.js +256 -0
  144. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase-contracts.js +1 -0
  145. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase.js +93 -0
  146. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native.js +113 -0
  147. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation-contracts.js +1 -0
  148. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation.js +316 -0
  149. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-ownership.js +28 -0
  150. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase-contracts.js +1 -0
  151. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase.js +142 -0
  152. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation-contracts.js +1 -0
  153. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation.js +333 -0
  154. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase-contracts.js +1 -0
  155. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase.js +71 -0
  156. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication.js +201 -0
  157. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-receipts.js +183 -0
  158. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-refs.js +200 -0
  159. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-tabs.js +142 -0
  160. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +18 -968
  161. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +23 -13
  162. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-receipt-reconciliation.js +198 -0
  163. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-contracts.js +1 -0
  164. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-presentation.js +154 -0
  165. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery.js +68 -151
  166. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-capture.js +14 -0
  167. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-observation.js +169 -46
  168. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-commands.js +130 -0
  169. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-electron.js +210 -0
  170. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-observations.js +61 -0
  171. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-outcomes.js +187 -0
  172. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-refs.js +171 -0
  173. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-tabs.js +228 -0
  174. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +77 -765
  175. package/dist/extensions/agent-browser/lib/orchestration/browser-run/text-visibility-diagnostics.js +182 -0
  176. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-diagnostics.js +256 -0
  177. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-progress.js +108 -0
  178. package/dist/extensions/agent-browser/lib/orchestration/code-artifact-observation.js +39 -0
  179. package/dist/extensions/agent-browser/lib/orchestration/code-image-observation.js +119 -0
  180. package/dist/extensions/agent-browser/lib/orchestration/electron-host/branch.js +92 -0
  181. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup-result.js +58 -0
  182. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup.js +78 -0
  183. package/dist/extensions/agent-browser/lib/orchestration/electron-host/contracts.js +1 -0
  184. package/dist/extensions/agent-browser/lib/orchestration/electron-host/discovery.js +106 -0
  185. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +48 -821
  186. package/dist/extensions/agent-browser/lib/orchestration/electron-host/policy.js +86 -0
  187. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-collection.js +69 -0
  188. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +167 -0
  189. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +164 -0
  190. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe.js +161 -0
  191. package/dist/extensions/agent-browser/lib/orchestration/electron-host/status.js +165 -0
  192. package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +21 -9
  193. package/dist/extensions/agent-browser/lib/orchestration/extension-artifact-preflight.js +211 -0
  194. package/dist/extensions/agent-browser/lib/orchestration/extension-artifacts.js +23 -0
  195. package/dist/extensions/agent-browser/lib/orchestration/extension-attachment-replay.js +99 -0
  196. package/dist/extensions/agent-browser/lib/orchestration/extension-branch-restore.js +275 -0
  197. package/dist/extensions/agent-browser/lib/orchestration/extension-code.js +280 -0
  198. package/dist/extensions/agent-browser/lib/orchestration/extension-command-admission.js +303 -0
  199. package/dist/extensions/agent-browser/lib/orchestration/extension-command-output.js +36 -0
  200. package/dist/extensions/agent-browser/lib/orchestration/extension-command-result.js +335 -0
  201. package/dist/extensions/agent-browser/lib/orchestration/extension-command-run.js +227 -0
  202. package/dist/extensions/agent-browser/lib/orchestration/extension-command-state.js +1 -0
  203. package/dist/extensions/agent-browser/lib/orchestration/extension-electron-ownership.js +204 -0
  204. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-locks.js +139 -0
  205. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-queue.js +24 -0
  206. package/dist/extensions/agent-browser/lib/orchestration/extension-host-coordination.js +98 -0
  207. package/dist/extensions/agent-browser/lib/orchestration/extension-host-run.js +295 -0
  208. package/dist/extensions/agent-browser/lib/orchestration/extension-intent-replay.js +41 -0
  209. package/dist/extensions/agent-browser/lib/orchestration/extension-invocation.js +7 -0
  210. package/dist/extensions/agent-browser/lib/orchestration/extension-lifecycle.js +102 -0
  211. package/dist/extensions/agent-browser/lib/orchestration/extension-managed-ownership.js +133 -0
  212. package/dist/extensions/agent-browser/lib/orchestration/extension-observation.js +120 -0
  213. package/dist/extensions/agent-browser/lib/orchestration/extension-prompt.js +180 -0
  214. package/dist/extensions/agent-browser/lib/orchestration/extension-recording.js +290 -0
  215. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-contracts.js +1 -0
  216. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-replay.js +269 -0
  217. package/dist/extensions/agent-browser/lib/orchestration/extension-result-state.js +113 -0
  218. package/dist/extensions/agent-browser/lib/orchestration/extension-runtime.js +146 -0
  219. package/dist/extensions/agent-browser/lib/orchestration/extension-script-leases.js +58 -0
  220. package/dist/extensions/agent-browser/lib/orchestration/extension-tool-boundary.js +62 -0
  221. package/dist/extensions/agent-browser/lib/orchestration/extension-version-check.js +54 -0
  222. package/dist/extensions/agent-browser/lib/orchestration/input-plan-types.js +1 -0
  223. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +261 -185
  224. package/dist/extensions/agent-browser/lib/orchestration/input-redaction.js +62 -0
  225. package/dist/extensions/agent-browser/lib/orchestration/native-config.js +144 -0
  226. package/dist/extensions/agent-browser/lib/orchestration/native-root-launch.js +77 -0
  227. package/dist/extensions/agent-browser/lib/orchestration/native-session-defaults.js +210 -157
  228. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  229. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +197 -99
  230. package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +199 -96
  231. package/dist/extensions/agent-browser/lib/owned-managed-session-context.js +55 -0
  232. package/dist/extensions/agent-browser/lib/page-target-batch.js +118 -0
  233. package/dist/extensions/agent-browser/lib/page-target-guards.js +50 -0
  234. package/dist/extensions/agent-browser/lib/page-target-navigation.js +104 -0
  235. package/dist/extensions/agent-browser/lib/page-target-validation.js +55 -246
  236. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  237. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +133 -68
  238. package/dist/extensions/agent-browser/lib/playbook.js +16 -12
  239. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  240. package/dist/extensions/agent-browser/lib/process-environment.js +13 -6
  241. package/dist/extensions/agent-browser/lib/process-errors.js +23 -0
  242. package/dist/extensions/agent-browser/lib/process-identity.js +47 -15
  243. package/dist/extensions/agent-browser/lib/process-socket-storage.js +256 -0
  244. package/dist/extensions/agent-browser/lib/process-stdout.js +74 -0
  245. package/dist/extensions/agent-browser/lib/process.js +145 -536
  246. package/dist/extensions/agent-browser/lib/prompt-artifacts.js +287 -0
  247. package/dist/extensions/agent-browser/lib/prompt-policy.js +15 -194
  248. package/dist/extensions/agent-browser/lib/read-command.js +41 -0
  249. package/dist/extensions/agent-browser/lib/read-confirmation.js +131 -68
  250. package/dist/extensions/agent-browser/lib/recording-reservations.js +118 -45
  251. package/dist/extensions/agent-browser/lib/redaction-fields.js +75 -0
  252. package/dist/extensions/agent-browser/lib/redaction-json.js +149 -0
  253. package/dist/extensions/agent-browser/lib/redaction-url.js +88 -0
  254. package/dist/extensions/agent-browser/lib/results/action-contracts.js +1 -0
  255. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +28 -271
  256. package/dist/extensions/agent-browser/lib/results/artifact-contracts.js +1 -0
  257. package/dist/extensions/agent-browser/lib/results/artifact-manifest-validation.js +133 -0
  258. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +96 -94
  259. package/dist/extensions/agent-browser/lib/results/artifact-recommendations.js +73 -0
  260. package/dist/extensions/agent-browser/lib/results/categories.js +111 -54
  261. package/dist/extensions/agent-browser/lib/results/confirmation.js +29 -13
  262. package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +62 -27
  263. package/dist/extensions/agent-browser/lib/results/electron-recommendations.js +83 -0
  264. package/dist/extensions/agent-browser/lib/results/envelope-decoding.js +48 -0
  265. package/dist/extensions/agent-browser/lib/results/envelope.js +90 -67
  266. package/dist/extensions/agent-browser/lib/results/evidence-contracts.js +1 -0
  267. package/dist/extensions/agent-browser/lib/results/failure-recommendations.js +180 -0
  268. package/dist/extensions/agent-browser/lib/results/network-routes.js +86 -45
  269. package/dist/extensions/agent-browser/lib/results/network.js +35 -12
  270. package/dist/extensions/agent-browser/lib/results/next-actions.js +49 -19
  271. package/dist/extensions/agent-browser/lib/results/presentation/artifact-files.js +320 -0
  272. package/dist/extensions/agent-browser/lib/results/presentation/artifact-format.js +138 -0
  273. package/dist/extensions/agent-browser/lib/results/presentation/artifact-images.js +113 -0
  274. package/dist/extensions/agent-browser/lib/results/presentation/artifact-verification.js +145 -0
  275. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +99 -555
  276. package/dist/extensions/agent-browser/lib/results/presentation/batch-contracts.js +1 -0
  277. package/dist/extensions/agent-browser/lib/results/presentation/batch-recording.js +118 -0
  278. package/dist/extensions/agent-browser/lib/results/presentation/batch-redaction.js +68 -0
  279. package/dist/extensions/agent-browser/lib/results/presentation/batch-rendering.js +135 -0
  280. package/dist/extensions/agent-browser/lib/results/presentation/batch-step.js +227 -0
  281. package/dist/extensions/agent-browser/lib/results/presentation/batch-summary.js +91 -0
  282. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +91 -460
  283. package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +9 -5
  284. package/dist/extensions/agent-browser/lib/results/presentation/command-presenters.js +216 -0
  285. package/dist/extensions/agent-browser/lib/results/presentation/common.js +26 -9
  286. package/dist/extensions/agent-browser/lib/results/presentation/content.js +86 -29
  287. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-a11y.js +67 -0
  288. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-health.js +79 -0
  289. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-identity.js +199 -0
  290. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-logs.js +75 -0
  291. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network-actions.js +216 -0
  292. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network.js +124 -0
  293. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-redaction.js +64 -0
  294. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-storage.js +209 -0
  295. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-stream.js +69 -0
  296. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-summary.js +222 -0
  297. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +103 -1052
  298. package/dist/extensions/agent-browser/lib/results/presentation/early-result.js +70 -0
  299. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +130 -60
  300. package/dist/extensions/agent-browser/lib/results/presentation/input-contracts.js +1 -0
  301. package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +60 -145
  302. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +147 -88
  303. package/dist/extensions/agent-browser/lib/results/presentation/notices.js +75 -0
  304. package/dist/extensions/agent-browser/lib/results/presentation/observation-contracts.js +1 -0
  305. package/dist/extensions/agent-browser/lib/results/presentation/observation-rendering.js +127 -0
  306. package/dist/extensions/agent-browser/lib/results/presentation/outcomes.js +120 -0
  307. package/dist/extensions/agent-browser/lib/results/presentation/output-completion.js +77 -0
  308. package/dist/extensions/agent-browser/lib/results/presentation/output-spill.js +51 -0
  309. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +116 -240
  310. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +35 -21
  311. package/dist/extensions/agent-browser/lib/results/presentation/skills.js +104 -73
  312. package/dist/extensions/agent-browser/lib/results/presentation/source.js +109 -0
  313. package/dist/extensions/agent-browser/lib/results/presentation.js +17 -261
  314. package/dist/extensions/agent-browser/lib/results/recommendation-contracts.js +1 -0
  315. package/dist/extensions/agent-browser/lib/results/recording.js +52 -14
  316. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +14 -5
  317. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +30 -22
  318. package/dist/extensions/agent-browser/lib/results/selector-recovery-target.js +83 -0
  319. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +119 -119
  320. package/dist/extensions/agent-browser/lib/results/snapshot-compact.js +266 -0
  321. package/dist/extensions/agent-browser/lib/results/snapshot-content.js +32 -0
  322. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +104 -71
  323. package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +31 -11
  324. package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +125 -66
  325. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +26 -7
  326. package/dist/extensions/agent-browser/lib/results/snapshot.js +28 -248
  327. package/dist/extensions/agent-browser/lib/results/text.js +16 -5
  328. package/dist/extensions/agent-browser/lib/runtime-args-validation.js +133 -0
  329. package/dist/extensions/agent-browser/lib/runtime-compatibility.js +81 -0
  330. package/dist/extensions/agent-browser/lib/runtime-contracts.js +1 -0
  331. package/dist/extensions/agent-browser/lib/runtime-redaction.js +118 -0
  332. package/dist/extensions/agent-browser/lib/runtime-replay-events.js +144 -0
  333. package/dist/extensions/agent-browser/lib/runtime-session-identity.js +76 -0
  334. package/dist/extensions/agent-browser/lib/runtime-session-plan.js +114 -0
  335. package/dist/extensions/agent-browser/lib/runtime-session-replay.js +123 -0
  336. package/dist/extensions/agent-browser/lib/runtime-tab-correction.js +65 -0
  337. package/dist/extensions/agent-browser/lib/runtime-timeouts.js +28 -0
  338. package/dist/extensions/agent-browser/lib/runtime.js +137 -1041
  339. package/dist/extensions/agent-browser/lib/session-identity.js +51 -0
  340. package/dist/extensions/agent-browser/lib/session-page-observation.js +357 -0
  341. package/dist/extensions/agent-browser/lib/session-page-state.js +178 -333
  342. package/dist/extensions/agent-browser/lib/session-page-types.js +1 -0
  343. package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +78 -0
  344. package/dist/extensions/agent-browser/lib/temp-mutation-queue.js +7 -0
  345. package/dist/extensions/agent-browser/lib/temp-root-ownership.js +234 -0
  346. package/dist/extensions/agent-browser/lib/temp-root.js +207 -0
  347. package/dist/extensions/agent-browser/lib/temp.js +33 -446
  348. package/dist/extensions/agent-browser/lib/tool-surface.js +94 -24
  349. package/dist/extensions/agent-browser/lib/upstream-version.js +3 -2
  350. package/dist/extensions/agent-browser/lib/web-search-providers.js +229 -0
  351. package/dist/extensions/agent-browser/lib/web-search-request.js +108 -0
  352. package/dist/extensions/agent-browser/lib/web-search-results.js +281 -0
  353. package/dist/extensions/agent-browser/lib/web-search-schema.js +82 -0
  354. package/dist/extensions/agent-browser/lib/web-search.js +109 -617
  355. package/dist/extensions/agent-browser/lib/webmcp-observation.js +13 -6
  356. package/dist/extensions/agent-browser/lib/windows-stock-launcher.js +63 -37
  357. package/dist/extensions/agent-browser/script-worker.js +80 -43
  358. package/dist/scripts/agent-browser-target.mjs +4 -2
  359. package/docs/ARCHITECTURE.md +17 -5
  360. package/docs/CODE_QUALITY.md +242 -0
  361. package/docs/COMMAND_REFERENCE.md +251 -220
  362. package/docs/ELECTRON.md +53 -44
  363. package/docs/RELEASE.md +18 -15
  364. package/docs/REQUIREMENTS.md +1 -0
  365. package/docs/SUPPORT_MATRIX.md +76 -75
  366. package/docs/TOOL_CONTRACT.md +145 -116
  367. package/docs/platform-smoke.md +5 -5
  368. package/package.json +143 -120
  369. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  370. package/scripts/agent-browser-target.mjs +6 -2
  371. package/scripts/build.mjs +37 -8
  372. package/scripts/capability-core-commands.mjs +193 -0
  373. package/scripts/capability-options.mjs +283 -0
  374. package/scripts/capability-samples.mjs +133 -0
  375. package/scripts/capability-section.mjs +11 -0
  376. package/scripts/config.mjs +213 -114
  377. package/scripts/convert-browser-session.mjs +30 -9
  378. package/scripts/doctor-sources.mjs +195 -0
  379. package/scripts/doctor.mjs +92 -247
  380. package/scripts/platform-smoke/artifacts.mjs +38 -11
  381. package/scripts/platform-smoke/commands.mjs +104 -0
  382. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  383. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  384. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  385. package/scripts/platform-smoke/doctor.mjs +212 -320
  386. package/scripts/platform-smoke/lease-evidence.mjs +134 -0
  387. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  388. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  389. package/scripts/platform-smoke/targets.mjs +158 -472
  390. package/scripts/platform-smoke.mjs +55 -40
  391. package/scripts/prepare.mjs +16 -7
@@ -2,97 +2,46 @@
2
2
  import { existsSync, readFileSync } from "node:fs";
3
3
  import { homedir } from "node:os";
4
4
  import { join, resolve } from "node:path";
5
- /** @typedef {"explicit-only" | "authenticated-only" | "always"} BrowserDefaultProfilePolicy */
5
+ import { DEFAULT_WEB_SEARCH_PROVIDER, WEB_SEARCH_PROVIDERS, getWebSearchProviderDescriptor, getWebSearchProviderEnvVar, } from "./config-providers.js";
6
+ import { parseAgentBrowserConfigLayer, describeUnknownError } from "./config-validation.js";
7
+ export * from "./config-providers.js";
8
+ export { parseAgentBrowserConfigLayer, validateAgentBrowserConfig, validateWebSearchProvider, } from "./config-validation.js";
9
+ /** @typedef {import("./config-providers.js").WebSearchProvider} WebSearchProvider */
10
+ /** @typedef {import("./config-providers.js").ExaSearchType} ExaSearchType */
11
+ /** @typedef {import("./config-providers.js").WebSearchProviderConfigKey} WebSearchProviderConfigKey */
12
+ /** @typedef {import("./config-providers.js").WebSearchProviderDescriptor} WebSearchProviderDescriptor */
13
+ /** @typedef {import("./config-validation.js").BrowserDefaultProfilePolicy} BrowserDefaultProfilePolicy */
14
+ /** @typedef {import("./config-validation.js").BrowserDefaultProfileConfig} BrowserDefaultProfileConfig */
15
+ /** @typedef {import("./config-validation.js").BrowserConfig} BrowserConfig */
16
+ /** @typedef {import("./config-validation.js").WebSearchConfig} WebSearchConfig */
17
+ /** @typedef {import("./config-validation.js").ConfigLayerScope} ConfigLayerScope */
18
+ /** @typedef {import("./config-validation.js").AgentBrowserConfig} AgentBrowserConfig */
19
+ /** @typedef {import("./config-validation.js").ConfigLayer} ConfigLayer */
6
20
  /** @typedef {"global" | "project" | "override" | "env-fallback"} AgentBrowserConfigScope */
7
- /** @typedef {"global" | "project" | "override"} ConfigLayerScope */
8
21
  /** @typedef {"literal" | "env" | "command"} CredentialSourceKind */
9
- /** @typedef {"exa" | "brave"} WebSearchProvider */
10
- /** @typedef {"auto" | "fast" | "instant" | "deep-lite" | "deep" | "deep-reasoning"} ExaSearchType */
11
- /** @typedef {"exaApiKey" | "braveApiKey"} WebSearchProviderConfigKey */
12
- /** @typedef {{ provider: WebSearchProvider; apiKeyEnv: string; configKey: WebSearchProviderConfigKey; label: string }} WebSearchProviderDescriptor */
13
- /** @typedef {{ name: string; policy?: BrowserDefaultProfilePolicy }} BrowserDefaultProfileConfig */
14
- /** @typedef {{ enabled?: boolean; preferredProvider?: WebSearchProvider; defaultSearchType?: ExaSearchType; braveApiKey?: string; exaApiKey?: string }} WebSearchConfig */
15
- /** @typedef {{ defaultProfile?: BrowserDefaultProfileConfig; executablePath?: string }} BrowserConfig */
16
- /** @typedef {{ version?: 1; webSearch?: WebSearchConfig; browser?: BrowserConfig }} AgentBrowserConfig */
17
- /** @typedef {{ config: AgentBrowserConfig; path: string; scope: ConfigLayerScope }} ConfigLayer */
18
- /** @typedef {{ kind: CredentialSourceKind; provider?: WebSearchProvider; rawValue: string; scope: AgentBrowserConfigScope }} CredentialSource */
19
- /** @typedef {{ global: string; project: string; override?: string }} AgentBrowserConfigPaths */
20
- /** @typedef {{ cwd?: string; env?: NodeJS.ProcessEnv; includeProjectConfig?: boolean }} AgentBrowserConfigLoadOptions */
21
- /** @typedef {{ browserDefaultProfile?: Required<BrowserDefaultProfileConfig>; browserDefaultProfileScope?: ConfigLayerScope; browserExecutablePath?: string; browserExecutablePathScope?: ConfigLayerScope; trustedBrowserDefaultProfile?: Required<BrowserDefaultProfileConfig>; trustedBrowserDefaultProfileScope?: ConfigLayerScope; trustedBrowserExecutablePath?: string; trustedBrowserExecutablePathScope?: ConfigLayerScope; config: AgentBrowserConfig; webSearchCredentialSources: Partial<Record<WebSearchProvider, CredentialSource>>; webSearchEnabled: boolean; webSearchPreferredProvider: WebSearchProvider; errors: string[]; layers: ConfigLayer[]; paths: AgentBrowserConfigPaths; projectConfigIncluded: boolean; warnings: string[] }} AgentBrowserConfigState */
22
- /** @typedef {{ scope: string; path: string; exists: boolean }} ConfigFileSummary */
22
+ /** @typedef {{ readonly kind: CredentialSourceKind; readonly provider?: WebSearchProvider; readonly rawValue: string; readonly scope: AgentBrowserConfigScope }} CredentialSource */
23
+ /** @typedef {{ readonly global: string; readonly project: string; readonly override?: string }} AgentBrowserConfigPaths */
24
+ /** @typedef {{ readonly cwd?: string; readonly env?: NodeJS.ProcessEnv; readonly includeProjectConfig?: boolean }} AgentBrowserConfigLoadOptions */
25
+ /** @typedef {{ readonly browserDefaultProfile?: Required<BrowserDefaultProfileConfig>; readonly browserDefaultProfileScope?: ConfigLayerScope; readonly browserExecutablePath?: string; readonly browserExecutablePathScope?: ConfigLayerScope; readonly trustedBrowserDefaultProfile?: Required<BrowserDefaultProfileConfig>; readonly trustedBrowserDefaultProfileScope?: ConfigLayerScope; readonly trustedBrowserExecutablePath?: string; readonly trustedBrowserExecutablePathScope?: ConfigLayerScope; readonly config: AgentBrowserConfig; readonly webSearchCredentialSources: Readonly<Partial<Record<WebSearchProvider, CredentialSource>>>; readonly webSearchEnabled: boolean; readonly webSearchPreferredProvider: WebSearchProvider; readonly errors: readonly string[]; readonly layers: readonly ConfigLayer[]; readonly paths: AgentBrowserConfigPaths; readonly projectConfigIncluded: boolean; readonly warnings: readonly string[] }} AgentBrowserConfigState */
26
+ /** @typedef {{ readonly scope: string; readonly path: string; readonly exists: boolean }} ConfigFileSummary */
23
27
  const CONFIG_DIR_NAME = ".pi";
24
28
  export const AGENT_BROWSER_CONFIG_ENV = "PI_AGENT_BROWSER_CONFIG";
25
- export const BRAVE_API_KEY_ENV = "BRAVE_API_KEY";
26
- export const EXA_API_KEY_ENV = "EXA_API_KEY";
27
- export const CONFIG_RELATIVE_PATH = /** @type {const} */ ([CONFIG_DIR_NAME, "config", "pi-agent-browser-native", "config.json"]);
28
- export const GLOBAL_CONFIG_RELATIVE_PATH = /** @type {const} */ ([CONFIG_DIR_NAME, "config", "pi-agent-browser-native", "config.json"]);
29
+ export const CONFIG_RELATIVE_PATH = /** @type {const} */ ([
30
+ CONFIG_DIR_NAME,
31
+ "config",
32
+ "pi-agent-browser-native",
33
+ "config.json",
34
+ ]);
35
+ export const GLOBAL_CONFIG_RELATIVE_PATH = /** @type {const} */ ([
36
+ CONFIG_DIR_NAME,
37
+ "config",
38
+ "pi-agent-browser-native",
39
+ "config.json",
40
+ ]);
29
41
  export const SECRET_COMMAND_TIMEOUT_MS = 15_000;
30
- /** @type {Readonly<Record<WebSearchProvider, WebSearchProviderDescriptor>>} */
31
- export const WEB_SEARCH_PROVIDER_DESCRIPTORS = Object.freeze({
32
- exa: Object.freeze({
33
- provider: "exa",
34
- apiKeyEnv: EXA_API_KEY_ENV,
35
- configKey: "exaApiKey",
36
- label: "Exa",
37
- }),
38
- brave: Object.freeze({
39
- provider: "brave",
40
- apiKeyEnv: BRAVE_API_KEY_ENV,
41
- configKey: "braveApiKey",
42
- label: "Brave Search",
43
- }),
44
- });
45
- /** @type {readonly WebSearchProvider[]} */
46
- export const WEB_SEARCH_PROVIDERS = Object.freeze(["exa", "brave"]);
47
- /** @type {WebSearchProvider} */
48
- export const DEFAULT_WEB_SEARCH_PROVIDER = "exa";
49
- /** @type {readonly ExaSearchType[]} */
50
- export const EXA_SEARCH_TYPES = Object.freeze(["auto", "fast", "instant", "deep-lite", "deep", "deep-reasoning"]);
51
- /** @type {Readonly<Record<WebSearchProvider, WebSearchProviderConfigKey>>} */
52
- export const WEB_SEARCH_PROVIDER_CONFIG_KEYS = Object.freeze({
53
- exa: WEB_SEARCH_PROVIDER_DESCRIPTORS.exa.configKey,
54
- brave: WEB_SEARCH_PROVIDER_DESCRIPTORS.brave.configKey,
55
- });
56
- /** @type {Readonly<Record<WebSearchProvider, string>>} */
57
- export const WEB_SEARCH_PROVIDER_ENV_VARS = Object.freeze({
58
- exa: WEB_SEARCH_PROVIDER_DESCRIPTORS.exa.apiKeyEnv,
59
- brave: WEB_SEARCH_PROVIDER_DESCRIPTORS.brave.apiKeyEnv,
60
- });
61
- /**
62
- * @param {unknown} value
63
- * @returns {value is WebSearchProvider}
64
- */
65
- export function isWebSearchProvider(value) {
66
- return typeof value === "string" && WEB_SEARCH_PROVIDERS.includes(/** @type {WebSearchProvider} */ (value));
67
- }
68
- /**
69
- * @param {WebSearchProvider} provider
70
- * @returns {WebSearchProviderDescriptor}
71
- */
72
- export function getWebSearchProviderDescriptor(provider) {
73
- const descriptor = WEB_SEARCH_PROVIDER_DESCRIPTORS[provider];
74
- if (!descriptor)
75
- throw new Error(`Unknown web-search provider: ${String(provider)}`);
76
- return descriptor;
77
- }
78
- /** @param {WebSearchProvider} provider */
79
- export function getWebSearchProviderLabel(provider) {
80
- return getWebSearchProviderDescriptor(provider).label;
81
- }
82
- /** @param {WebSearchProvider} provider */
83
- export function getWebSearchProviderEnvVar(provider) {
84
- return getWebSearchProviderDescriptor(provider).apiKeyEnv;
85
- }
86
- /**
87
- * @param {WebSearchProvider} provider
88
- * @returns {WebSearchProviderConfigKey}
89
- */
90
- export function getWebSearchProviderConfigKey(provider) {
91
- return getWebSearchProviderDescriptor(provider).configKey;
92
- }
93
42
  /** @param {NodeJS.ProcessEnv} [env] */
94
43
  export function getGlobalAgentBrowserConfigPath(env = process.env) {
95
- const home = env.HOME?.trim() || env.USERPROFILE?.trim() || homedir();
44
+ const home = [env.HOME?.trim(), env.USERPROFILE?.trim()].find((value) => value !== undefined && value.length > 0) ?? homedir();
96
45
  return join(home, ...GLOBAL_CONFIG_RELATIVE_PATH);
97
46
  }
98
47
  /** @param {string} [cwd] */
@@ -100,7 +49,7 @@ export function getProjectAgentBrowserConfigPath(cwd = process.cwd()) {
100
49
  return resolve(cwd, ...CONFIG_RELATIVE_PATH);
101
50
  }
102
51
  /**
103
- * @param {{ cwd?: string; env?: NodeJS.ProcessEnv }} [options]
52
+ * @param {{ readonly cwd?: string; readonly env?: NodeJS.ProcessEnv }} [options]
104
53
  * @returns {AgentBrowserConfigPaths}
105
54
  */
106
55
  export function getAgentBrowserConfigPaths(options = {}) {
@@ -109,7 +58,7 @@ export function getAgentBrowserConfigPaths(options = {}) {
109
58
  return {
110
59
  global: getGlobalAgentBrowserConfigPath(env),
111
60
  project: getProjectAgentBrowserConfigPath(options.cwd),
112
- ...(override ? { override: resolve(override) } : {}),
61
+ ...(override !== undefined && override.length > 0 ? { override: resolve(override) } : {}),
113
62
  };
114
63
  }
115
64
  /**
@@ -122,200 +71,16 @@ export function mergeAgentBrowserConfig(base, override) {
122
71
  ...base,
123
72
  ...override,
124
73
  browser: {
125
- ...(base.browser ?? {}),
126
- ...(override.browser ?? {}),
74
+ ...base.browser,
75
+ ...override.browser,
127
76
  defaultProfile: override.browser?.defaultProfile ?? base.browser?.defaultProfile,
128
77
  },
129
78
  webSearch: {
130
- ...(base.webSearch ?? {}),
131
- ...(override.webSearch ?? {}),
79
+ ...base.webSearch,
80
+ ...override.webSearch,
132
81
  },
133
82
  };
134
83
  }
135
- /**
136
- * @param {unknown} value
137
- * @returns {value is Record<string, unknown>}
138
- */
139
- function isRecord(value) {
140
- return typeof value === "object" && value !== null && !Array.isArray(value);
141
- }
142
- /**
143
- * @param {unknown} value
144
- * @param {string} path
145
- * @param {string[]} errors
146
- */
147
- function validateString(value, path, errors) {
148
- if (value === undefined)
149
- return undefined;
150
- if (typeof value !== "string") {
151
- errors.push(`${path} must be a string.`);
152
- return undefined;
153
- }
154
- return value;
155
- }
156
- /**
157
- * @param {unknown} value
158
- * @param {string} path
159
- * @param {string[]} errors
160
- */
161
- function validateBoolean(value, path, errors) {
162
- if (value === undefined)
163
- return undefined;
164
- if (typeof value !== "boolean") {
165
- errors.push(`${path} must be a boolean.`);
166
- return undefined;
167
- }
168
- return value;
169
- }
170
- /**
171
- * @param {unknown} value
172
- * @param {string} path
173
- * @param {string[]} errors
174
- * @returns {WebSearchProvider | undefined}
175
- */
176
- export function validateWebSearchProvider(value, path, errors) {
177
- if (value === undefined)
178
- return undefined;
179
- const provider = validateString(value, path, errors)?.trim();
180
- if (provider === undefined)
181
- return undefined;
182
- if (!isWebSearchProvider(provider)) {
183
- errors.push(`${path} must be one of ${WEB_SEARCH_PROVIDERS.join(", ")}.`);
184
- return undefined;
185
- }
186
- return provider;
187
- }
188
- /**
189
- * @param {unknown} value
190
- * @param {string} path
191
- * @param {string[]} errors
192
- * @returns {ExaSearchType | undefined}
193
- */
194
- function validateExaSearchType(value, path, errors) {
195
- if (value === undefined)
196
- return undefined;
197
- const searchType = validateString(value, path, errors)?.trim();
198
- if (searchType === undefined)
199
- return undefined;
200
- if (!EXA_SEARCH_TYPES.includes(/** @type {ExaSearchType} */ (searchType))) {
201
- errors.push(`${path} must be one of ${EXA_SEARCH_TYPES.join(", ")}.`);
202
- return undefined;
203
- }
204
- return /** @type {ExaSearchType} */ (searchType);
205
- }
206
- /**
207
- * @param {unknown} value
208
- * @param {string} path
209
- * @param {string[]} errors
210
- * @returns {BrowserDefaultProfileConfig | undefined}
211
- */
212
- function validateBrowserDefaultProfile(value, path, errors) {
213
- if (value === undefined)
214
- return undefined;
215
- if (!isRecord(value)) {
216
- errors.push(`${path} must be an object.`);
217
- return undefined;
218
- }
219
- const name = validateString(value.name, `${path}.name`, errors)?.trim();
220
- if (!name) {
221
- errors.push(`${path}.name must not be blank.`);
222
- return undefined;
223
- }
224
- const rawPolicy = validateString(value.policy, `${path}.policy`, errors);
225
- const policy = rawPolicy ?? "authenticated-only";
226
- if (!["explicit-only", "authenticated-only", "always"].includes(policy)) {
227
- errors.push(`${path}.policy must be one of explicit-only, authenticated-only, always.`);
228
- return undefined;
229
- }
230
- return { name, policy: /** @type {BrowserDefaultProfilePolicy} */ (policy) };
231
- }
232
- /**
233
- * @param {unknown} value
234
- * @param {string} path
235
- * @param {string[]} errors
236
- * @param {string[]} warnings
237
- * @returns {AgentBrowserConfig | undefined}
238
- */
239
- export function validateAgentBrowserConfig(value, path, errors, warnings) {
240
- if (!isRecord(value)) {
241
- errors.push(`${path} must contain a JSON object.`);
242
- return undefined;
243
- }
244
- if (value.version !== undefined && value.version !== 1) {
245
- errors.push(`${path}.version must be 1 when present.`);
246
- }
247
- /** @type {AgentBrowserConfig} */
248
- const config = value.version === 1 ? { version: 1 } : {};
249
- if (value.webSearch !== undefined) {
250
- if (!isRecord(value.webSearch)) {
251
- errors.push(`${path}.webSearch must be an object.`);
252
- }
253
- else {
254
- /** @type {NonNullable<AgentBrowserConfig["webSearch"]>} */
255
- const webSearch = {};
256
- const enabled = validateBoolean(value.webSearch.enabled, `${path}.webSearch.enabled`, errors);
257
- if (enabled !== undefined)
258
- webSearch.enabled = enabled;
259
- const preferredProvider = validateWebSearchProvider(value.webSearch.preferredProvider, `${path}.webSearch.preferredProvider`, errors);
260
- if (preferredProvider)
261
- webSearch.preferredProvider = preferredProvider;
262
- const defaultSearchType = validateExaSearchType(value.webSearch.defaultSearchType, `${path}.webSearch.defaultSearchType`, errors);
263
- if (defaultSearchType)
264
- webSearch.defaultSearchType = defaultSearchType;
265
- for (const provider of WEB_SEARCH_PROVIDERS) {
266
- const descriptor = getWebSearchProviderDescriptor(provider);
267
- const apiKey = validateString(value.webSearch[descriptor.configKey], `${path}.webSearch.${descriptor.configKey}`, errors);
268
- if (apiKey !== undefined) {
269
- webSearch[descriptor.configKey] = apiKey;
270
- }
271
- }
272
- if (Object.keys(webSearch).length > 0)
273
- config.webSearch = webSearch;
274
- }
275
- }
276
- if (value.browser !== undefined) {
277
- if (!isRecord(value.browser)) {
278
- errors.push(`${path}.browser must be an object.`);
279
- }
280
- else {
281
- config.browser = {};
282
- const defaultProfile = validateBrowserDefaultProfile(value.browser.defaultProfile, `${path}.browser.defaultProfile`, errors);
283
- if (defaultProfile) {
284
- config.browser.defaultProfile = defaultProfile;
285
- }
286
- const executablePath = validateString(value.browser.executablePath, `${path}.browser.executablePath`, errors)?.trim();
287
- if (executablePath) {
288
- config.browser.executablePath = executablePath;
289
- }
290
- }
291
- }
292
- for (const key of Object.keys(value)) {
293
- if (!["version", "webSearch", "browser"].includes(key)) {
294
- warnings.push(`${path}.${key} is not a recognized pi-agent-browser-native config field and was ignored.`);
295
- }
296
- }
297
- return config;
298
- }
299
- /**
300
- * @param {string} raw
301
- * @param {string} path
302
- * @param {ConfigLayerScope} scope
303
- * @param {string[]} errors
304
- * @param {string[]} warnings
305
- * @returns {ConfigLayer | undefined}
306
- */
307
- export function parseAgentBrowserConfigLayer(raw, path, scope, errors, warnings) {
308
- let parsed;
309
- try {
310
- parsed = JSON.parse(raw);
311
- }
312
- catch (error) {
313
- errors.push(`Could not parse ${scope} config ${path}: ${error instanceof Error ? error.message : String(error)}`);
314
- return undefined;
315
- }
316
- const config = validateAgentBrowserConfig(parsed, path, errors, warnings);
317
- return config ? { config, path, scope } : undefined;
318
- }
319
84
  /**
320
85
  * @param {string} rawValue
321
86
  * @param {AgentBrowserConfigScope} scope
@@ -324,12 +89,15 @@ export function parseAgentBrowserConfigLayer(raw, path, scope, errors, warnings)
324
89
  */
325
90
  export function classifyCredentialSource(rawValue, scope, provider) {
326
91
  const trimmed = rawValue.trim();
327
- if (!trimmed)
328
- return undefined;
329
- if (trimmed.startsWith("!"))
92
+ if (trimmed.length === 0) {
93
+ return;
94
+ }
95
+ if (trimmed.startsWith("!")) {
330
96
  return { kind: "command", provider, rawValue: trimmed, scope };
331
- if (trimmed.includes("$"))
97
+ }
98
+ if (trimmed.includes("$")) {
332
99
  return { kind: "env", provider, rawValue: trimmed, scope };
100
+ }
333
101
  return { kind: "literal", provider, rawValue: trimmed, scope };
334
102
  }
335
103
  /**
@@ -338,84 +106,92 @@ export function classifyCredentialSource(rawValue, scope, provider) {
338
106
  */
339
107
  function getBrowserDefaultProfile(config) {
340
108
  const profile = config.browser?.defaultProfile;
341
- if (!profile?.name.trim())
342
- return undefined;
109
+ if (!profile || profile.name.trim().length === 0) {
110
+ return;
111
+ }
343
112
  return { name: profile.name.trim(), policy: profile.policy ?? "authenticated-only" };
344
113
  }
345
114
  /** @param {AgentBrowserConfig} config */
346
115
  function getBrowserExecutablePath(config) {
347
116
  const executablePath = config.browser?.executablePath?.trim();
348
- return executablePath || undefined;
117
+ return executablePath !== undefined && executablePath.length > 0 ? executablePath : undefined;
349
118
  }
350
119
  /**
351
- * @param {ConfigLayer[]} layers
120
+ * @param {readonly ConfigLayer[]} layers
352
121
  * @returns {ConfigLayerScope | undefined}
353
122
  */
354
123
  function getBrowserDefaultProfileScope(layers) {
355
124
  for (let index = layers.length - 1; index >= 0; index -= 1) {
356
- const layer = layers[index];
357
- if (layer?.config.browser?.defaultProfile !== undefined)
125
+ const layer = layers.at(index);
126
+ if (layer?.config.browser?.defaultProfile !== undefined) {
358
127
  return layer.scope;
128
+ }
359
129
  }
360
- return undefined;
130
+ return;
361
131
  }
362
132
  /**
363
- * @param {ConfigLayer[]} layers
133
+ * @param {readonly ConfigLayer[]} layers
364
134
  * @returns {ConfigLayerScope | undefined}
365
135
  */
366
136
  function getBrowserExecutablePathScope(layers) {
367
137
  for (let index = layers.length - 1; index >= 0; index -= 1) {
368
- const layer = layers[index];
369
- if (layer?.config.browser?.executablePath !== undefined)
138
+ const layer = layers.at(index);
139
+ if (layer?.config.browser?.executablePath !== undefined) {
370
140
  return layer.scope;
141
+ }
371
142
  }
372
- return undefined;
143
+ return;
373
144
  }
374
145
  /**
375
- * @param {ConfigLayer[]} layers
146
+ * @param {readonly ConfigLayer[]} layers
376
147
  * @returns {{ profile: Required<BrowserDefaultProfileConfig>; scope: ConfigLayerScope } | undefined}
377
148
  */
378
149
  function getTrustedBrowserDefaultProfile(layers) {
379
150
  for (let index = layers.length - 1; index >= 0; index -= 1) {
380
- const layer = layers[index];
381
- if (!layer)
151
+ const layer = layers.at(index);
152
+ if (!layer) {
382
153
  continue;
154
+ }
383
155
  const profile = getBrowserDefaultProfile(layer.config);
384
- if (profile)
156
+ if (profile) {
385
157
  return { profile, scope: layer.scope };
158
+ }
386
159
  }
387
- return undefined;
160
+ return;
388
161
  }
389
162
  /**
390
- * @param {ConfigLayer[]} layers
163
+ * @param {readonly ConfigLayer[]} layers
391
164
  * @returns {{ executablePath: string; scope: ConfigLayerScope } | undefined}
392
165
  */
393
166
  function getTrustedBrowserExecutablePath(layers) {
394
167
  for (let index = layers.length - 1; index >= 0; index -= 1) {
395
- const layer = layers[index];
396
- if (!layer)
168
+ const layer = layers.at(index);
169
+ if (!layer) {
397
170
  continue;
171
+ }
398
172
  const executablePath = getBrowserExecutablePath(layer.config);
399
- if (executablePath)
173
+ if (executablePath !== undefined && executablePath.length > 0) {
400
174
  return { executablePath, scope: layer.scope };
175
+ }
401
176
  }
402
- return undefined;
177
+ return;
403
178
  }
404
179
  /**
405
- * @param {ConfigLayer[]} layers
180
+ * @param {readonly ConfigLayer[]} layers
406
181
  * @param {WebSearchProviderConfigKey} key
407
182
  * @returns {AgentBrowserConfigScope}
408
183
  */
409
184
  function getWebSearchCredentialScope(layers, key) {
410
185
  for (let index = layers.length - 1; index >= 0; index -= 1) {
411
- const layer = layers[index];
412
- if (layer?.config.webSearch?.[key] !== undefined)
186
+ const layer = layers.at(index);
187
+ if (layer?.config.webSearch?.[key] !== undefined) {
413
188
  return layer.scope;
189
+ }
414
190
  }
415
191
  return "global";
416
192
  }
417
193
  /**
418
- * @param {{ env: NodeJS.ProcessEnv; layers: ConfigLayer[]; mergedConfig: AgentBrowserConfig }} options
194
+ * @param {{ readonly env: NodeJS.ProcessEnv; readonly layers: readonly ConfigLayer[]; readonly mergedConfig: AgentBrowserConfig }} options
419
195
  * @returns {Partial<Record<WebSearchProvider, CredentialSource>>}
420
196
  */
421
197
  export function buildWebSearchCredentialSources(options) {
@@ -427,14 +203,19 @@ export function buildWebSearchCredentialSources(options) {
427
203
  if (apiKey !== undefined) {
428
204
  sources[provider] = classifyCredentialSource(apiKey, getWebSearchCredentialScope(options.layers, descriptor.configKey), provider);
429
205
  }
430
- if (!sources[provider] && options.env[descriptor.apiKeyEnv]?.trim()) {
431
- sources[provider] = { kind: "literal", provider, rawValue: options.env[descriptor.apiKeyEnv] ?? "", scope: "env-fallback" };
206
+ if (!sources[provider] && (options.env[descriptor.apiKeyEnv]?.trim().length ?? 0) > 0) {
207
+ sources[provider] = {
208
+ kind: "literal",
209
+ provider,
210
+ rawValue: options.env[descriptor.apiKeyEnv] ?? "",
211
+ scope: "env-fallback",
212
+ };
432
213
  }
433
214
  }
434
215
  return sources;
435
216
  }
436
217
  /**
437
- * @param {{ env: NodeJS.ProcessEnv; layers: ConfigLayer[]; mergedConfig: AgentBrowserConfig; paths: AgentBrowserConfigPaths; errors: string[]; warnings: string[]; projectConfigIncluded?: boolean }} options
218
+ * @param {{ readonly env: NodeJS.ProcessEnv; readonly layers: readonly ConfigLayer[]; readonly mergedConfig: AgentBrowserConfig; readonly paths: AgentBrowserConfigPaths; readonly errors: readonly string[]; readonly warnings: readonly string[]; readonly projectConfigIncluded?: boolean }} options
438
219
  * @returns {AgentBrowserConfigState}
439
220
  */
440
221
  export function buildAgentBrowserConfigState(options) {
@@ -464,8 +245,8 @@ export function buildAgentBrowserConfigState(options) {
464
245
  /**
465
246
  * @param {string} path
466
247
  * @param {ConfigLayerScope} scope
467
- * @param {string[]} errors
468
- * @param {string[]} warnings
248
+ * @param {import("./config-validation.js").ConfigDiagnostics} errors
249
+ * @param {import("./config-validation.js").ConfigDiagnostics} warnings
469
250
  * @returns {ConfigLayer | undefined}
470
251
  */
471
252
  function readConfigLayerSync(path, scope, errors, warnings) {
@@ -474,10 +255,11 @@ function readConfigLayerSync(path, scope, errors, warnings) {
474
255
  raw = readFileSync(path, "utf8");
475
256
  }
476
257
  catch (error) {
477
- if (error && typeof error === "object" && "code" in error && error.code === "ENOENT")
478
- return undefined;
479
- errors.push(`Could not read ${scope} config ${path}: ${error instanceof Error ? error.message : String(error)}`);
480
- return undefined;
258
+ if (error !== null && typeof error === "object" && "code" in error && error.code === "ENOENT") {
259
+ return;
260
+ }
261
+ errors.push(`Could not read ${scope} config ${path}: ${error instanceof Error ? error.message : describeUnknownError(error)}`);
262
+ return;
481
263
  }
482
264
  return parseAgentBrowserConfigLayer(raw, path, scope, errors, warnings);
483
265
  }
@@ -494,19 +276,22 @@ export function loadAgentBrowserConfigStateSync(options = {}) {
494
276
  /** @type {string[]} */
495
277
  const warnings = [];
496
278
  /** @type {Array<{ path: string; scope: ConfigLayerScope }>} */
497
- const layerCandidates = [
498
- { path: paths.global, scope: "global" },
499
- ...(includeProjectConfig ? [{ path: paths.project, scope: /** @type {ConfigLayerScope} */ ("project") }] : []),
500
- ...(paths.override ? [{ path: paths.override, scope: /** @type {ConfigLayerScope} */ ("override") }] : []),
501
- ];
279
+ const layerCandidates = [{ path: paths.global, scope: "global" }];
280
+ if (includeProjectConfig) {
281
+ layerCandidates.push({ path: paths.project, scope: "project" });
282
+ }
283
+ if (paths.override !== undefined && paths.override.length > 0) {
284
+ layerCandidates.push({ path: paths.override, scope: "override" });
285
+ }
502
286
  /** @type {ConfigLayer[]} */
503
287
  const layers = [];
504
288
  /** @type {AgentBrowserConfig} */
505
289
  let mergedConfig = {};
506
290
  for (const candidate of layerCandidates) {
507
291
  const layer = readConfigLayerSync(candidate.path, candidate.scope, errors, warnings);
508
- if (!layer)
292
+ if (!layer) {
509
293
  continue;
294
+ }
510
295
  layers.push(layer);
511
296
  mergedConfig = mergeAgentBrowserConfig(mergedConfig, layer.config);
512
297
  }
@@ -533,21 +318,17 @@ export function resolveEnvInterpolations(rawValue, env) {
533
318
  continue;
534
319
  }
535
320
  const next = rawValue[index + 1];
536
- if (next === "$") {
537
- output += "$";
538
- index += 1;
539
- continue;
540
- }
541
- if (next === "!") {
542
- output += "!";
321
+ if (next === "$" || next === "!") {
322
+ output += next;
543
323
  index += 1;
544
324
  continue;
545
325
  }
546
326
  let name = "";
547
327
  if (next === "{") {
548
328
  const end = rawValue.indexOf("}", index + 2);
549
- if (end === -1)
550
- return undefined;
329
+ if (end === -1) {
330
+ return;
331
+ }
551
332
  name = rawValue.slice(index + 2, end);
552
333
  index = end;
553
334
  }
@@ -557,14 +338,16 @@ export function resolveEnvInterpolations(rawValue, env) {
557
338
  output += "$";
558
339
  continue;
559
340
  }
560
- name = match[1] ?? "";
341
+ name = match[1];
561
342
  index += name.length;
562
343
  }
563
- if (!name)
564
- return undefined;
344
+ if (name.length === 0) {
345
+ return;
346
+ }
565
347
  const value = env[name];
566
- if (value === undefined)
567
- return undefined;
348
+ if (value === undefined) {
349
+ return;
350
+ }
568
351
  output += value;
569
352
  }
570
353
  return output;
@@ -575,8 +358,9 @@ export function resolveEnvInterpolations(rawValue, env) {
575
358
  * @returns {WebSearchProvider[]}
576
359
  */
577
360
  export function getWebSearchProviderOrder(state, requestedProvider) {
578
- if (requestedProvider && requestedProvider !== "auto")
361
+ if (requestedProvider !== undefined && requestedProvider !== "auto") {
579
362
  return [requestedProvider];
363
+ }
580
364
  const preferred = state.webSearchPreferredProvider;
581
365
  return [preferred, ...WEB_SEARCH_PROVIDERS.filter((provider) => provider !== preferred)];
582
366
  }
@@ -592,12 +376,15 @@ export function getWebSearchCredentialSource(state, provider) {
592
376
  * @param {NodeJS.ProcessEnv} env
593
377
  */
594
378
  export function hasPotentialCredentialSource(source, env) {
595
- if (!source)
379
+ if (!source) {
596
380
  return false;
597
- if (source.kind === "command")
381
+ }
382
+ if (source.kind === "command") {
598
383
  return true;
599
- if (source.kind === "env")
384
+ }
385
+ if (source.kind === "env") {
600
386
  return Boolean(resolveEnvInterpolations(source.rawValue, env)?.trim());
387
+ }
601
388
  return Boolean(source.rawValue.trim());
602
389
  }
603
390
  /**
@@ -605,8 +392,9 @@ export function hasPotentialCredentialSource(source, env) {
605
392
  * @param {NodeJS.ProcessEnv} [env]
606
393
  */
607
394
  export function canRegisterWebSearchTool(state, env = process.env) {
608
- if (!state.webSearchEnabled || state.errors.length > 0)
395
+ if (!state.webSearchEnabled || state.errors.length > 0) {
609
396
  return false;
397
+ }
610
398
  return WEB_SEARCH_PROVIDERS.some((provider) => hasPotentialCredentialSource(state.webSearchCredentialSources[provider], env));
611
399
  }
612
400
  /**
@@ -614,12 +402,15 @@ export function canRegisterWebSearchTool(state, env = process.env) {
614
402
  * @param {WebSearchProvider} [provider]
615
403
  */
616
404
  export function getCredentialSourceSummary(source, provider) {
617
- if (!source)
405
+ if (!source) {
618
406
  return "not configured";
619
- if (source.kind === "command")
407
+ }
408
+ if (source.kind === "command") {
620
409
  return `configured via command (${source.scope})`;
621
- if (source.kind === "env")
410
+ }
411
+ if (source.kind === "env") {
622
412
  return `configured via environment interpolation (${source.scope})`;
413
+ }
623
414
  if (source.scope === "env-fallback") {
624
415
  return `configured via ${getWebSearchProviderEnvVar(provider ?? source.provider ?? DEFAULT_WEB_SEARCH_PROVIDER)} environment fallback`;
625
416
  }
@@ -628,16 +419,18 @@ export function getCredentialSourceSummary(source, provider) {
628
419
  /** @param {AgentBrowserConfigState} state */
629
420
  export function formatBrowserProfileStatus(state) {
630
421
  const profile = state.browserDefaultProfile;
631
- if (!profile)
422
+ if (!profile) {
632
423
  return "not configured";
424
+ }
633
425
  const scope = state.browserDefaultProfileScope ?? "unknown";
634
426
  return `${profile.name} (policy: ${profile.policy}; ${scope})`;
635
427
  }
636
428
  /** @param {AgentBrowserConfigState} state */
637
429
  export function formatBrowserExecutableStatus(state) {
638
430
  const executablePath = state.browserExecutablePath;
639
- if (!executablePath)
431
+ if (executablePath === undefined || executablePath.length === 0) {
640
432
  return "not configured";
433
+ }
641
434
  const scope = state.browserExecutablePathScope ?? "unknown";
642
435
  return `${executablePath} (${scope})`;
643
436
  }
@@ -650,6 +443,8 @@ export function summarizeConfigFiles(state, exists = existsSync) {
650
443
  return [
651
444
  ["global", state.paths.global],
652
445
  ["project", state.paths.project],
653
- ...(state.paths.override ? [["override", state.paths.override]] : []),
446
+ ...(state.paths.override !== undefined && state.paths.override.length > 0
447
+ ? [["override", state.paths.override]]
448
+ : []),
654
449
  ].map(([scope, path]) => ({ scope, path, exists: exists(path) }));
655
450
  }