pi-agent-browser-native 0.9.3 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. package/CHANGELOG.md +106 -5
  2. package/README.md +58 -791
  3. package/dist/extensions/agent-browser/index.js +43101 -2031
  4. package/dist/extensions/agent-browser/lib/argv-descriptor.js +49 -26
  5. package/dist/extensions/agent-browser/lib/argv-grammar.js +82 -93
  6. package/dist/extensions/agent-browser/lib/bash-guard.js +129 -126
  7. package/dist/extensions/agent-browser/lib/batch-lifecycle.js +112 -51
  8. package/dist/extensions/agent-browser/lib/browser-execution-claim-codec.js +61 -0
  9. package/dist/extensions/agent-browser/lib/browser-execution-claim-storage.js +232 -0
  10. package/dist/extensions/agent-browser/lib/browser-execution-claims.js +202 -0
  11. package/dist/extensions/agent-browser/lib/browser-execution-identity.js +77 -0
  12. package/dist/extensions/agent-browser/lib/browser-journal-branch.js +98 -0
  13. package/dist/extensions/agent-browser/lib/browser-journal-contracts.js +1 -0
  14. package/dist/extensions/agent-browser/lib/browser-journal-projection.js +221 -0
  15. package/dist/extensions/agent-browser/lib/browser-journal-reader.js +89 -0
  16. package/dist/extensions/agent-browser/lib/browser-journal-replay.js +246 -0
  17. package/dist/extensions/agent-browser/lib/browser-journal.js +103 -394
  18. package/dist/extensions/agent-browser/lib/browser-legacy-pages.js +220 -0
  19. package/dist/extensions/agent-browser/lib/browser-legacy-projection.js +282 -0
  20. package/dist/extensions/agent-browser/lib/browser-legacy-types.js +1 -0
  21. package/dist/extensions/agent-browser/lib/browser-session-conversion-stream.js +217 -0
  22. package/dist/extensions/agent-browser/lib/browser-session-conversion.js +80 -335
  23. package/dist/extensions/agent-browser/lib/browser-transcript-contracts.js +35 -0
  24. package/dist/extensions/agent-browser/lib/browser-transcript-validation.js +166 -0
  25. package/dist/extensions/agent-browser/lib/browser-transcript.js +137 -82
  26. package/dist/extensions/agent-browser/lib/browser-value-parsing.js +15 -0
  27. package/dist/extensions/agent-browser/lib/command-capabilities.js +340 -0
  28. package/dist/extensions/agent-browser/lib/command-policy.js +107 -88
  29. package/dist/extensions/agent-browser/lib/command-taxonomy.js +49 -322
  30. package/dist/extensions/agent-browser/lib/config-policy.js +138 -343
  31. package/dist/extensions/agent-browser/lib/config-providers.js +71 -0
  32. package/dist/extensions/agent-browser/lib/config-validation.js +231 -0
  33. package/dist/extensions/agent-browser/lib/config.js +20 -8
  34. package/dist/extensions/agent-browser/lib/electron/cdp.js +20 -8
  35. package/dist/extensions/agent-browser/lib/electron/cleanup.js +128 -83
  36. package/dist/extensions/agent-browser/lib/electron/discovery-darwin.js +109 -0
  37. package/dist/extensions/agent-browser/lib/electron/discovery-desktop.js +136 -0
  38. package/dist/extensions/agent-browser/lib/electron/discovery-evidence.js +90 -0
  39. package/dist/extensions/agent-browser/lib/electron/discovery-linux.js +93 -0
  40. package/dist/extensions/agent-browser/lib/electron/discovery-packages.js +162 -0
  41. package/dist/extensions/agent-browser/lib/electron/discovery-types.js +2 -0
  42. package/dist/extensions/agent-browser/lib/electron/discovery.js +140 -549
  43. package/dist/extensions/agent-browser/lib/electron/launch-monitor.js +102 -0
  44. package/dist/extensions/agent-browser/lib/electron/launch-process.js +209 -0
  45. package/dist/extensions/agent-browser/lib/electron/launch-types.js +2 -0
  46. package/dist/extensions/agent-browser/lib/electron/launch.js +261 -355
  47. package/dist/extensions/agent-browser/lib/executable-path.js +21 -12
  48. package/dist/extensions/agent-browser/lib/execution-cwd.js +35 -18
  49. package/dist/extensions/agent-browser/lib/fs-utils.js +1 -9
  50. package/dist/extensions/agent-browser/lib/input-modes/electron.js +162 -121
  51. package/dist/extensions/agent-browser/lib/input-modes/job.js +123 -317
  52. package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +116 -0
  53. package/dist/extensions/agent-browser/lib/input-modes/lookup-plan.js +132 -0
  54. package/dist/extensions/agent-browser/lib/input-modes/lookup-redaction.js +57 -0
  55. package/dist/extensions/agent-browser/lib/input-modes/lookup-source-evidence.js +151 -0
  56. package/dist/extensions/agent-browser/lib/input-modes/lookup-workspace.js +142 -0
  57. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +58 -412
  58. package/dist/extensions/agent-browser/lib/input-modes/params.js +86 -40
  59. package/dist/extensions/agent-browser/lib/input-modes/qa-analysis.js +268 -0
  60. package/dist/extensions/agent-browser/lib/input-modes/qa-presentation.js +117 -0
  61. package/dist/extensions/agent-browser/lib/input-modes/script-child.js +396 -0
  62. package/dist/extensions/agent-browser/lib/input-modes/script-protocol.js +86 -0
  63. package/dist/extensions/agent-browser/lib/input-modes/script-types.js +1 -0
  64. package/dist/extensions/agent-browser/lib/input-modes/script-validation.js +60 -0
  65. package/dist/extensions/agent-browser/lib/input-modes/script.js +60 -409
  66. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +218 -128
  67. package/dist/extensions/agent-browser/lib/input-modes/shared.js +15 -4
  68. package/dist/extensions/agent-browser/lib/input-modes/types.js +56 -7
  69. package/dist/extensions/agent-browser/lib/json-schema.js +22 -10
  70. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +17 -5
  71. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +92 -425
  72. package/dist/extensions/agent-browser/lib/managed-session-posix-storage.js +58 -0
  73. package/dist/extensions/agent-browser/lib/managed-session-project-identity.js +244 -0
  74. package/dist/extensions/agent-browser/lib/managed-session-restore-context.js +84 -0
  75. package/dist/extensions/agent-browser/lib/managed-session-restore-policy.js +119 -0
  76. package/dist/extensions/agent-browser/lib/managed-session-restore-state.js +83 -0
  77. package/dist/extensions/agent-browser/lib/managed-session-restore.js +168 -300
  78. package/dist/extensions/agent-browser/lib/managed-session-snapshot-records.js +277 -0
  79. package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +128 -305
  80. package/dist/extensions/agent-browser/lib/managed-session-storage.js +56 -253
  81. package/dist/extensions/agent-browser/lib/native-confirmation.js +140 -0
  82. package/dist/extensions/agent-browser/lib/native-output.js +43 -9
  83. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +106 -59
  84. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-merge.js +14 -6
  85. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +109 -57
  86. package/dist/extensions/agent-browser/lib/orchestration/browser-run/browser-observation-result.js +82 -0
  87. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +164 -60
  88. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostic-values.js +31 -0
  89. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +152 -781
  90. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-observation.js +203 -0
  91. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-text-diagnostics.js +109 -0
  92. package/dist/extensions/agent-browser/lib/orchestration/browser-run/fill-diagnostics.js +119 -0
  93. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-action-recovery.js +147 -0
  94. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-actions.js +144 -0
  95. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-content.js +123 -0
  96. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-contracts.js +1 -0
  97. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-details.js +156 -0
  98. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-electron.js +187 -0
  99. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-evidence.js +39 -0
  100. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-missing-binary.js +89 -0
  101. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-recovery.js +97 -0
  102. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-redaction.js +106 -0
  103. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-timeout.js +110 -0
  104. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +41 -538
  105. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +199 -154
  106. package/dist/extensions/agent-browser/lib/orchestration/browser-run/interaction-diagnostics.js +290 -0
  107. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-close.js +167 -0
  108. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-inspection.js +108 -0
  109. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +127 -205
  110. package/dist/extensions/agent-browser/lib/orchestration/browser-run/native-helper-observation.js +65 -0
  111. package/dist/extensions/agent-browser/lib/orchestration/browser-run/observation-types.js +1 -0
  112. package/dist/extensions/agent-browser/lib/orchestration/browser-run/overlay-diagnostics.js +120 -0
  113. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +113 -30
  114. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +109 -28
  115. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter-data.js +150 -0
  116. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +147 -253
  117. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-rendered-text.js +147 -0
  118. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +59 -24
  119. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-artifacts.js +159 -0
  120. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-command.js +131 -0
  121. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-contracts.js +1 -0
  122. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-daemon.js +93 -0
  123. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-failure.js +42 -0
  124. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-guards.js +242 -0
  125. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-input.js +75 -0
  126. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-observations.js +92 -0
  127. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-selection.js +254 -0
  128. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-state.js +121 -0
  129. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-refs.js +130 -0
  130. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-resources.js +114 -0
  131. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-semantic.js +121 -0
  132. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-session-plan.js +222 -0
  133. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-timeouts.js +68 -0
  134. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +176 -1123
  135. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-analysis.js +191 -0
  136. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-confirmation.js +152 -0
  137. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-diagnostics.js +182 -0
  138. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-electron.js +150 -0
  139. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-contracts.js +1 -0
  140. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase-contracts.js +1 -0
  141. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase.js +115 -0
  142. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle.js +256 -0
  143. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed-contracts.js +1 -0
  144. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed.js +256 -0
  145. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase-contracts.js +1 -0
  146. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase.js +93 -0
  147. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native.js +113 -0
  148. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation-contracts.js +1 -0
  149. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation.js +316 -0
  150. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-ownership.js +28 -0
  151. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase-contracts.js +1 -0
  152. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase.js +142 -0
  153. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation-contracts.js +1 -0
  154. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation.js +333 -0
  155. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase-contracts.js +1 -0
  156. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase.js +71 -0
  157. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication.js +201 -0
  158. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-receipts.js +183 -0
  159. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-refs.js +200 -0
  160. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-tabs.js +142 -0
  161. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +18 -968
  162. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +23 -13
  163. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-receipt-reconciliation.js +198 -0
  164. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-contracts.js +1 -0
  165. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-presentation.js +154 -0
  166. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery.js +68 -151
  167. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-capture.js +14 -0
  168. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-observation.js +169 -46
  169. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-commands.js +130 -0
  170. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-electron.js +212 -0
  171. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-observations.js +61 -0
  172. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-outcomes.js +187 -0
  173. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-refs.js +169 -0
  174. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-tabs.js +228 -0
  175. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +77 -765
  176. package/dist/extensions/agent-browser/lib/orchestration/browser-run/text-visibility-diagnostics.js +182 -0
  177. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-diagnostics.js +256 -0
  178. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-progress.js +108 -0
  179. package/dist/extensions/agent-browser/lib/orchestration/code-artifact-observation.js +39 -0
  180. package/dist/extensions/agent-browser/lib/orchestration/code-image-observation.js +119 -0
  181. package/dist/extensions/agent-browser/lib/orchestration/electron-host/branch.js +93 -0
  182. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup-result.js +58 -0
  183. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup.js +78 -0
  184. package/dist/extensions/agent-browser/lib/orchestration/electron-host/contracts.js +1 -0
  185. package/dist/extensions/agent-browser/lib/orchestration/electron-host/discovery.js +106 -0
  186. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +48 -821
  187. package/dist/extensions/agent-browser/lib/orchestration/electron-host/policy.js +86 -0
  188. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-collection.js +68 -0
  189. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +169 -0
  190. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +182 -0
  191. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe.js +161 -0
  192. package/dist/extensions/agent-browser/lib/orchestration/electron-host/status.js +167 -0
  193. package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +22 -10
  194. package/dist/extensions/agent-browser/lib/orchestration/extension-artifact-preflight.js +211 -0
  195. package/dist/extensions/agent-browser/lib/orchestration/extension-artifacts.js +23 -0
  196. package/dist/extensions/agent-browser/lib/orchestration/extension-attachment-replay.js +99 -0
  197. package/dist/extensions/agent-browser/lib/orchestration/extension-branch-restore.js +275 -0
  198. package/dist/extensions/agent-browser/lib/orchestration/extension-code.js +280 -0
  199. package/dist/extensions/agent-browser/lib/orchestration/extension-command-admission.js +303 -0
  200. package/dist/extensions/agent-browser/lib/orchestration/extension-command-output.js +36 -0
  201. package/dist/extensions/agent-browser/lib/orchestration/extension-command-result.js +335 -0
  202. package/dist/extensions/agent-browser/lib/orchestration/extension-command-run.js +227 -0
  203. package/dist/extensions/agent-browser/lib/orchestration/extension-command-state.js +1 -0
  204. package/dist/extensions/agent-browser/lib/orchestration/extension-electron-ownership.js +204 -0
  205. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-locks.js +139 -0
  206. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-queue.js +24 -0
  207. package/dist/extensions/agent-browser/lib/orchestration/extension-host-coordination.js +98 -0
  208. package/dist/extensions/agent-browser/lib/orchestration/extension-host-run.js +295 -0
  209. package/dist/extensions/agent-browser/lib/orchestration/extension-intent-replay.js +41 -0
  210. package/dist/extensions/agent-browser/lib/orchestration/extension-invocation.js +7 -0
  211. package/dist/extensions/agent-browser/lib/orchestration/extension-lifecycle.js +102 -0
  212. package/dist/extensions/agent-browser/lib/orchestration/extension-managed-ownership.js +133 -0
  213. package/dist/extensions/agent-browser/lib/orchestration/extension-observation.js +120 -0
  214. package/dist/extensions/agent-browser/lib/orchestration/extension-prompt.js +180 -0
  215. package/dist/extensions/agent-browser/lib/orchestration/extension-recording.js +290 -0
  216. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-contracts.js +1 -0
  217. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-replay.js +269 -0
  218. package/dist/extensions/agent-browser/lib/orchestration/extension-result-state.js +113 -0
  219. package/dist/extensions/agent-browser/lib/orchestration/extension-runtime.js +146 -0
  220. package/dist/extensions/agent-browser/lib/orchestration/extension-script-leases.js +58 -0
  221. package/dist/extensions/agent-browser/lib/orchestration/extension-tool-boundary.js +62 -0
  222. package/dist/extensions/agent-browser/lib/orchestration/extension-version-check.js +54 -0
  223. package/dist/extensions/agent-browser/lib/orchestration/input-plan-types.js +1 -0
  224. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +261 -185
  225. package/dist/extensions/agent-browser/lib/orchestration/input-redaction.js +62 -0
  226. package/dist/extensions/agent-browser/lib/orchestration/native-config.js +144 -0
  227. package/dist/extensions/agent-browser/lib/orchestration/native-root-launch.js +77 -0
  228. package/dist/extensions/agent-browser/lib/orchestration/native-session-defaults.js +210 -157
  229. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  230. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +197 -99
  231. package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +199 -96
  232. package/dist/extensions/agent-browser/lib/owned-managed-session-context.js +55 -0
  233. package/dist/extensions/agent-browser/lib/page-target-batch.js +118 -0
  234. package/dist/extensions/agent-browser/lib/page-target-guards.js +50 -0
  235. package/dist/extensions/agent-browser/lib/page-target-navigation.js +104 -0
  236. package/dist/extensions/agent-browser/lib/page-target-validation.js +55 -246
  237. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  238. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +133 -68
  239. package/dist/extensions/agent-browser/lib/playbook.js +16 -12
  240. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  241. package/dist/extensions/agent-browser/lib/process-environment.js +13 -6
  242. package/dist/extensions/agent-browser/lib/process-errors.js +23 -0
  243. package/dist/extensions/agent-browser/lib/process-identity.js +47 -15
  244. package/dist/extensions/agent-browser/lib/process-socket-storage.js +256 -0
  245. package/dist/extensions/agent-browser/lib/process-stdout.js +74 -0
  246. package/dist/extensions/agent-browser/lib/process.js +145 -536
  247. package/dist/extensions/agent-browser/lib/prompt-artifacts.js +287 -0
  248. package/dist/extensions/agent-browser/lib/prompt-policy.js +15 -194
  249. package/dist/extensions/agent-browser/lib/read-command.js +41 -0
  250. package/dist/extensions/agent-browser/lib/read-confirmation.js +131 -68
  251. package/dist/extensions/agent-browser/lib/recording-reservations.js +118 -45
  252. package/dist/extensions/agent-browser/lib/redaction-fields.js +75 -0
  253. package/dist/extensions/agent-browser/lib/redaction-json.js +149 -0
  254. package/dist/extensions/agent-browser/lib/redaction-url.js +88 -0
  255. package/dist/extensions/agent-browser/lib/results/action-contracts.js +1 -0
  256. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +28 -271
  257. package/dist/extensions/agent-browser/lib/results/artifact-contracts.js +1 -0
  258. package/dist/extensions/agent-browser/lib/results/artifact-manifest-validation.js +133 -0
  259. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +96 -94
  260. package/dist/extensions/agent-browser/lib/results/artifact-recommendations.js +73 -0
  261. package/dist/extensions/agent-browser/lib/results/categories.js +111 -54
  262. package/dist/extensions/agent-browser/lib/results/confirmation.js +29 -13
  263. package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +62 -27
  264. package/dist/extensions/agent-browser/lib/results/electron-recommendations.js +83 -0
  265. package/dist/extensions/agent-browser/lib/results/envelope-decoding.js +48 -0
  266. package/dist/extensions/agent-browser/lib/results/envelope.js +90 -67
  267. package/dist/extensions/agent-browser/lib/results/evidence-contracts.js +1 -0
  268. package/dist/extensions/agent-browser/lib/results/failure-recommendations.js +180 -0
  269. package/dist/extensions/agent-browser/lib/results/network-routes.js +86 -45
  270. package/dist/extensions/agent-browser/lib/results/network.js +35 -12
  271. package/dist/extensions/agent-browser/lib/results/next-actions.js +49 -19
  272. package/dist/extensions/agent-browser/lib/results/presentation/artifact-files.js +320 -0
  273. package/dist/extensions/agent-browser/lib/results/presentation/artifact-format.js +138 -0
  274. package/dist/extensions/agent-browser/lib/results/presentation/artifact-images.js +113 -0
  275. package/dist/extensions/agent-browser/lib/results/presentation/artifact-verification.js +145 -0
  276. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +99 -555
  277. package/dist/extensions/agent-browser/lib/results/presentation/batch-contracts.js +1 -0
  278. package/dist/extensions/agent-browser/lib/results/presentation/batch-recording.js +118 -0
  279. package/dist/extensions/agent-browser/lib/results/presentation/batch-redaction.js +68 -0
  280. package/dist/extensions/agent-browser/lib/results/presentation/batch-rendering.js +135 -0
  281. package/dist/extensions/agent-browser/lib/results/presentation/batch-step.js +227 -0
  282. package/dist/extensions/agent-browser/lib/results/presentation/batch-summary.js +91 -0
  283. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +91 -460
  284. package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +9 -5
  285. package/dist/extensions/agent-browser/lib/results/presentation/command-presenters.js +216 -0
  286. package/dist/extensions/agent-browser/lib/results/presentation/common.js +26 -9
  287. package/dist/extensions/agent-browser/lib/results/presentation/content.js +86 -29
  288. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-a11y.js +67 -0
  289. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-health.js +79 -0
  290. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-identity.js +199 -0
  291. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-logs.js +75 -0
  292. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network-actions.js +216 -0
  293. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network.js +124 -0
  294. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-redaction.js +64 -0
  295. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-storage.js +209 -0
  296. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-stream.js +69 -0
  297. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-summary.js +222 -0
  298. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +103 -1052
  299. package/dist/extensions/agent-browser/lib/results/presentation/early-result.js +70 -0
  300. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +130 -60
  301. package/dist/extensions/agent-browser/lib/results/presentation/input-contracts.js +1 -0
  302. package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +60 -145
  303. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +147 -88
  304. package/dist/extensions/agent-browser/lib/results/presentation/notices.js +75 -0
  305. package/dist/extensions/agent-browser/lib/results/presentation/observation-contracts.js +1 -0
  306. package/dist/extensions/agent-browser/lib/results/presentation/observation-rendering.js +127 -0
  307. package/dist/extensions/agent-browser/lib/results/presentation/outcomes.js +120 -0
  308. package/dist/extensions/agent-browser/lib/results/presentation/output-completion.js +77 -0
  309. package/dist/extensions/agent-browser/lib/results/presentation/output-spill.js +51 -0
  310. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +116 -240
  311. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +35 -21
  312. package/dist/extensions/agent-browser/lib/results/presentation/skills.js +109 -73
  313. package/dist/extensions/agent-browser/lib/results/presentation/source.js +109 -0
  314. package/dist/extensions/agent-browser/lib/results/presentation.js +17 -261
  315. package/dist/extensions/agent-browser/lib/results/recommendation-contracts.js +1 -0
  316. package/dist/extensions/agent-browser/lib/results/recording.js +52 -14
  317. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +14 -5
  318. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +30 -22
  319. package/dist/extensions/agent-browser/lib/results/selector-recovery-target.js +83 -0
  320. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +119 -119
  321. package/dist/extensions/agent-browser/lib/results/snapshot-compact.js +266 -0
  322. package/dist/extensions/agent-browser/lib/results/snapshot-content.js +32 -0
  323. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +104 -71
  324. package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +31 -11
  325. package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +125 -66
  326. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +26 -7
  327. package/dist/extensions/agent-browser/lib/results/snapshot.js +28 -248
  328. package/dist/extensions/agent-browser/lib/results/text.js +16 -5
  329. package/dist/extensions/agent-browser/lib/runtime-args-validation.js +133 -0
  330. package/dist/extensions/agent-browser/lib/runtime-compatibility.js +81 -0
  331. package/dist/extensions/agent-browser/lib/runtime-contracts.js +1 -0
  332. package/dist/extensions/agent-browser/lib/runtime-redaction.js +118 -0
  333. package/dist/extensions/agent-browser/lib/runtime-replay-events.js +144 -0
  334. package/dist/extensions/agent-browser/lib/runtime-session-identity.js +76 -0
  335. package/dist/extensions/agent-browser/lib/runtime-session-plan.js +114 -0
  336. package/dist/extensions/agent-browser/lib/runtime-session-replay.js +123 -0
  337. package/dist/extensions/agent-browser/lib/runtime-tab-correction.js +65 -0
  338. package/dist/extensions/agent-browser/lib/runtime-timeouts.js +28 -0
  339. package/dist/extensions/agent-browser/lib/runtime.js +137 -1041
  340. package/dist/extensions/agent-browser/lib/session-identity.js +51 -0
  341. package/dist/extensions/agent-browser/lib/session-page-observation.js +357 -0
  342. package/dist/extensions/agent-browser/lib/session-page-state.js +178 -333
  343. package/dist/extensions/agent-browser/lib/session-page-types.js +1 -0
  344. package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +81 -0
  345. package/dist/extensions/agent-browser/lib/temp-mutation-queue.js +7 -0
  346. package/dist/extensions/agent-browser/lib/temp-root-ownership.js +234 -0
  347. package/dist/extensions/agent-browser/lib/temp-root.js +211 -0
  348. package/dist/extensions/agent-browser/lib/temp.js +33 -446
  349. package/dist/extensions/agent-browser/lib/tool-surface.js +94 -24
  350. package/dist/extensions/agent-browser/lib/upstream-version.js +3 -2
  351. package/dist/extensions/agent-browser/lib/web-search-providers.js +193 -0
  352. package/dist/extensions/agent-browser/lib/web-search-request.js +102 -0
  353. package/dist/extensions/agent-browser/lib/web-search-results.js +281 -0
  354. package/dist/extensions/agent-browser/lib/web-search-schema.js +82 -0
  355. package/dist/extensions/agent-browser/lib/web-search.js +124 -614
  356. package/dist/extensions/agent-browser/lib/webmcp-observation.js +13 -6
  357. package/dist/extensions/agent-browser/lib/windows-stock-launcher.js +63 -37
  358. package/dist/extensions/agent-browser/script-worker.js +80 -43
  359. package/dist/scripts/agent-browser-target.mjs +4 -2
  360. package/docs/ARCHITECTURE.md +19 -6
  361. package/docs/CODE_QUALITY.md +267 -0
  362. package/docs/COMMAND_REFERENCE.md +272 -241
  363. package/docs/ELECTRON.md +77 -46
  364. package/docs/REFERENCE.md +869 -0
  365. package/docs/RELEASE.md +25 -22
  366. package/docs/REQUIREMENTS.md +2 -1
  367. package/docs/SUPPORT_MATRIX.md +81 -79
  368. package/docs/TOOL_CONTRACT.md +158 -125
  369. package/docs/platform-smoke.md +8 -8
  370. package/package.json +144 -120
  371. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  372. package/scripts/agent-browser-target.mjs +6 -2
  373. package/scripts/build.mjs +37 -8
  374. package/scripts/capability-core-commands.mjs +193 -0
  375. package/scripts/capability-options.mjs +283 -0
  376. package/scripts/capability-samples.mjs +133 -0
  377. package/scripts/capability-section.mjs +11 -0
  378. package/scripts/config.mjs +235 -132
  379. package/scripts/convert-browser-session.mjs +30 -9
  380. package/scripts/doctor-sources.mjs +195 -0
  381. package/scripts/doctor.mjs +94 -249
  382. package/scripts/platform-smoke/artifacts.mjs +38 -11
  383. package/scripts/platform-smoke/commands.mjs +104 -0
  384. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  385. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  386. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  387. package/scripts/platform-smoke/doctor.mjs +212 -320
  388. package/scripts/platform-smoke/lease-evidence.mjs +132 -0
  389. package/scripts/platform-smoke/linux-image/Dockerfile +8 -2
  390. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  391. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  392. package/scripts/platform-smoke/targets.mjs +154 -472
  393. package/scripts/platform-smoke.mjs +55 -40
  394. package/scripts/prepare.mjs +16 -7
@@ -1,19 +1,28 @@
1
1
  import { constants as fsConstants } from "node:fs";
2
2
  import { access, stat } from "node:fs/promises";
3
3
  import { delimiter, join } from "node:path";
4
+ async function isExecutableFile(candidate) {
5
+ try {
6
+ await access(candidate, fsConstants.X_OK);
7
+ return (await stat(candidate)).isFile();
8
+ }
9
+ catch {
10
+ return false;
11
+ }
12
+ }
4
13
  export async function executableExistsOnPath(command) {
5
- const extensions = process.platform === "win32" ? (process.env.PATHEXT ?? ".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean) : [""];
6
- for (const directory of (process.env.PATH ?? "").split(delimiter).filter(Boolean)) {
7
- for (const extension of extensions) {
8
- try {
9
- const candidate = join(directory, `${command}${extension}`);
10
- await access(candidate, fsConstants.X_OK);
11
- if ((await stat(candidate)).isFile())
12
- return true;
13
- }
14
- catch {
15
- // Try the next PATH candidate.
16
- }
14
+ const extensions = process.platform === "win32"
15
+ ? (process.env.PATHEXT ?? ".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean)
16
+ : [""];
17
+ const candidates = (process.env.PATH ?? "")
18
+ .split(delimiter)
19
+ .filter(Boolean)
20
+ .flatMap((directory) => extensions.map((extension) => join(directory, `${command}${extension}`)));
21
+ for (const candidate of candidates) {
22
+ // Respect PATH/PATHEXT precedence and stop probing after the first executable.
23
+ // oxlint-disable-next-line no-await-in-loop
24
+ if (await isExecutableFile(candidate)) {
25
+ return true;
17
26
  }
18
27
  }
19
28
  return false;
@@ -2,49 +2,66 @@ import { readFileSync, statSync } from "node:fs";
2
2
  import { dirname, isAbsolute, join } from "node:path";
3
3
  import { isRecord } from "./parsing.js";
4
4
  function isDirectoryOwner(source) {
5
- if (/^(?:npm:pi-change-working-dir|git:github\.com\/fitchmultz\/pi-change-working-dir(?:\.git)?)(?:@.+)?$/.test(source.source))
5
+ if (/^(?:npm:pi-change-working-dir|git:github\.com\/fitchmultz\/pi-change-working-dir(?:\.git)?)(?:@.+)?$/.test(source.source)) {
6
6
  return true;
7
+ }
7
8
  const directories = [source.baseDir, isAbsolute(source.path) ? dirname(source.path) : undefined];
8
- return directories.some(directory => {
9
- if (!directory || !isAbsolute(directory))
9
+ return directories.some((directory) => {
10
+ if (directory === undefined || directory.length === 0 || !isAbsolute(directory)) {
10
11
  return false;
12
+ }
11
13
  try {
12
- return JSON.parse(readFileSync(join(directory, "package.json"), "utf8")).name === "pi-change-working-dir";
14
+ const manifest = JSON.parse(readFileSync(join(directory, "package.json"), "utf8"));
15
+ return isRecord(manifest) && manifest.name === "pi-change-working-dir";
13
16
  }
14
17
  catch {
15
18
  return false;
16
19
  }
17
20
  });
18
21
  }
22
+ function validateDirectoryReply(result) {
23
+ const invalid = "pi-change-working-dir returned an invalid execution directory. Update the extension and restart Pi.";
24
+ if (!isRecord(result) || Array.isArray(result)) {
25
+ throw new Error(invalid);
26
+ }
27
+ if (result.error !== undefined) {
28
+ throw new Error(typeof result.error === "string" && result.error.length > 0 ? result.error : invalid);
29
+ }
30
+ if (typeof result.cwd !== "string" || !isAbsolute(result.cwd) || result.cwd.includes("\0")) {
31
+ throw new Error(invalid);
32
+ }
33
+ return result.cwd;
34
+ }
19
35
  /** The synchronous owner reply is captured before any browser policy, queue, or child await. */
20
36
  export function resolveExecutionCwd(pi, ctx) {
21
- const request = { sessionManager: ctx.sessionManager };
37
+ const request = {
38
+ sessionManager: ctx.sessionManager,
39
+ };
22
40
  pi.events.emit("pi-change-working-dir:resolve-execution-cwd", request);
23
41
  const result = request.result;
24
42
  if (result !== undefined) {
25
- const invalid = "pi-change-working-dir returned an invalid execution directory. Update the extension and restart Pi.";
26
- if (!isRecord(result) || Array.isArray(result))
27
- throw new Error(invalid);
28
- if (result.error !== undefined)
29
- throw new Error(typeof result.error === "string" && result.error.length > 0 ? result.error : invalid);
30
- if (typeof result.cwd !== "string" || !isAbsolute(result.cwd) || result.cwd.includes("\0"))
31
- throw new Error(invalid);
32
- return result.cwd;
33
- }
34
- if (pi.getAllTools().some(tool => tool.name === "change_dir" && isDirectoryOwner(tool.sourceInfo))
35
- || pi.getCommands().some(command => /^cwd(?::\d+)?$/.test(command.name) && isDirectoryOwner(command.sourceInfo))) {
43
+ return validateDirectoryReply(result);
44
+ }
45
+ if (pi
46
+ .getAllTools()
47
+ .some((tool) => tool.name === "change_dir" && isDirectoryOwner(tool.sourceInfo)) ||
48
+ pi
49
+ .getCommands()
50
+ .some((command) => /^cwd(?::\d+)?$/.test(command.name) && isDirectoryOwner(command.sourceInfo))) {
36
51
  throw new Error("Update pi-change-working-dir and restart Pi to use agent_browser with the selected working directory.");
37
52
  }
38
53
  return ctx.cwd;
39
54
  }
40
55
  export function getBrowserCwdError(cwd) {
41
56
  try {
42
- if (statSync(cwd).isDirectory())
57
+ if (statSync(cwd).isDirectory()) {
43
58
  return undefined;
59
+ }
44
60
  }
45
61
  catch (error) {
46
- if (!["ENOENT", "ENOTDIR"].includes(error.code ?? ""))
62
+ if (!isRecord(error) || (error.code !== "ENOENT" && error.code !== "ENOTDIR")) {
47
63
  throw error;
64
+ }
48
65
  }
49
66
  return `Browser launch directory is unavailable: ${cwd}. Restore that directory, or explicitly use sessionMode: "fresh" without --session, or --config from the selected execution directory. The existing browser was left untouched.`;
50
67
  }
@@ -1,4 +1,4 @@
1
- import { access, stat } from "node:fs/promises";
1
+ import { access } from "node:fs/promises";
2
2
  export async function pathExists(path) {
3
3
  try {
4
4
  await access(path);
@@ -8,11 +8,3 @@ export async function pathExists(path) {
8
8
  return false;
9
9
  }
10
10
  }
11
- export async function directoryExists(path) {
12
- try {
13
- return (await stat(path)).isDirectory();
14
- }
15
- catch {
16
- return false;
17
- }
18
- }
@@ -1,160 +1,201 @@
1
1
  import { isRecord } from "../parsing.js";
2
+ import { isStringArray } from "./shared.js";
2
3
  import { AGENT_BROWSER_ELECTRON_ACTIONS, AGENT_BROWSER_ELECTRON_HANDOFFS, AGENT_BROWSER_ELECTRON_LIST_FIELDS, AGENT_BROWSER_ELECTRON_PROBE_FIELDS, AGENT_BROWSER_ELECTRON_RESERVED_APP_ARGS, AGENT_BROWSER_ELECTRON_TARGET_TYPES, } from "./types.js";
3
- function validateOptionalNonEmptyString(input, fieldName) {
4
+ function optionalString(input, fieldName) {
4
5
  const value = input[fieldName];
5
- if (value === undefined)
6
+ if (value === undefined) {
6
7
  return {};
8
+ }
7
9
  if (typeof value !== "string" || value.trim().length === 0) {
8
10
  return { error: `electron.${fieldName} must be a non-empty string when provided.` };
9
11
  }
10
12
  return { value: value.trim() };
11
13
  }
12
- function validateOptionalElectronStringArray(input, fieldName) {
14
+ function optionalInteger(input, fieldName) {
13
15
  const value = input[fieldName];
14
- if (value === undefined)
16
+ if (value === undefined) {
17
+ return {};
18
+ }
19
+ if (typeof value !== "number" || !Number.isInteger(value) || value <= 0) {
20
+ return { error: `electron.${fieldName} must be a positive integer when provided.` };
21
+ }
22
+ return { value };
23
+ }
24
+ function stringArray(value) {
25
+ if (!isStringArray(value)) {
15
26
  return undefined;
16
- if (!Array.isArray(value) || value.some((item) => typeof item !== "string" || item.trim().length === 0)) {
17
- return `electron.${fieldName} must be an array of non-empty strings when provided.`;
18
27
  }
19
- return undefined;
28
+ return value.map((item) => item.trim());
20
29
  }
21
- function validateOptionalElectronEnum(input, fieldName, values) {
30
+ function arrayError(input, fieldName) {
22
31
  const value = input[fieldName];
23
- if (value === undefined)
32
+ if (value === undefined) {
24
33
  return undefined;
25
- if (typeof value !== "string" || !values.includes(value)) {
26
- return `electron.${fieldName} must be one of: ${values.join(", ")}.`;
27
34
  }
28
- return undefined;
29
- }
30
- function getReservedElectronAppArg(appArgs) {
31
- return appArgs?.find((arg) => {
32
- const trimmed = arg.trim();
33
- return trimmed === "--" || AGENT_BROWSER_ELECTRON_RESERVED_APP_ARGS.some((reserved) => trimmed === reserved || trimmed.startsWith(`${reserved}=`));
34
- });
35
- }
36
- function validateElectronLaunchAppArgs(appArgs) {
37
- const reservedArg = getReservedElectronAppArg(appArgs);
38
- return reservedArg
39
- ? `electron.appArgs must not include wrapper-owned launch flag ${reservedArg}.`
35
+ const parsed = stringArray(value);
36
+ return parsed === undefined || parsed.some((item) => item.length === 0)
37
+ ? `electron.${fieldName} must be an array of non-empty strings when provided.`
40
38
  : undefined;
41
39
  }
42
- function validateOptionalElectronPositiveInteger(input, fieldName) {
40
+ function enumError(input, fieldName, values) {
43
41
  const value = input[fieldName];
44
- if (value === undefined)
45
- return {};
46
- if (typeof value !== "number" || !Number.isInteger(value) || value <= 0) {
47
- return { error: `electron.${fieldName} must be a positive integer when provided.` };
42
+ if (value === undefined) {
43
+ return undefined;
48
44
  }
49
- return { value };
50
- }
51
- function onlyAllowedElectronFields(input, action, allowedFields) {
52
- return Object.keys(input).find((fieldName) => !allowedFields.has(fieldName))
53
- ? `electron.${action} does not support electron.${Object.keys(input).find((fieldName) => !allowedFields.has(fieldName))}.`
45
+ return typeof value !== "string" || !values.includes(value)
46
+ ? `electron.${fieldName} must be one of: ${values.join(", ")}.`
54
47
  : undefined;
55
48
  }
56
- export function compileAgentBrowserElectron(input) {
57
- if (!isRecord(input))
58
- return { error: "electron must be an object." };
59
- const action = input.action;
60
- if (typeof action !== "string" || !AGENT_BROWSER_ELECTRON_ACTIONS.includes(action)) {
61
- return { error: `electron.action must be one of: ${AGENT_BROWSER_ELECTRON_ACTIONS.join(", ")}.` };
62
- }
63
- for (const fieldName of ["query", "appPath", "appName", "bundleId", "executablePath", "launchId"]) {
64
- const validation = validateOptionalNonEmptyString(input, fieldName);
65
- if (validation.error)
66
- return { error: validation.error };
67
- }
68
- for (const fieldName of ["appArgs", "allow", "deny"]) {
69
- const error = validateOptionalElectronStringArray(input, fieldName);
70
- if (error)
71
- return { error };
72
- }
73
- const handoffError = validateOptionalElectronEnum(input, "handoff", AGENT_BROWSER_ELECTRON_HANDOFFS);
74
- if (handoffError)
75
- return { error: handoffError };
76
- const targetTypeError = validateOptionalElectronEnum(input, "targetType", AGENT_BROWSER_ELECTRON_TARGET_TYPES);
77
- if (targetTypeError)
78
- return { error: targetTypeError };
79
- for (const fieldName of ["maxResults", "timeoutMs"]) {
80
- const validation = validateOptionalElectronPositiveInteger(input, fieldName);
81
- if (validation.error)
82
- return { error: validation.error };
83
- }
84
- if (input.all !== undefined && input.all !== true) {
85
- return { error: "electron.all must be true when provided." };
86
- }
87
- if (action === "list") {
88
- const unsupportedListField = Object.keys(input).find((fieldName) => !AGENT_BROWSER_ELECTRON_LIST_FIELDS.has(fieldName));
89
- if (unsupportedListField) {
90
- return { error: `electron.list only supports query and maxResults; remove electron.${unsupportedListField}.` };
49
+ function commonError(input) {
50
+ for (const field of ["query", "appPath", "appName", "bundleId", "executablePath", "launchId"]) {
51
+ const error = optionalString(input, field).error;
52
+ if (error !== undefined) {
53
+ return error;
54
+ }
55
+ }
56
+ for (const field of ["appArgs", "allow", "deny"]) {
57
+ const error = arrayError(input, field);
58
+ if (error !== undefined) {
59
+ return error;
91
60
  }
92
- return {
93
- compiled: {
94
- action: "list",
95
- maxResults: validateOptionalElectronPositiveInteger(input, "maxResults").value,
96
- query: validateOptionalNonEmptyString(input, "query").value,
97
- },
98
- };
99
61
  }
100
- if (action === "probe") {
101
- const unsupportedProbeField = Object.keys(input).find((fieldName) => !AGENT_BROWSER_ELECTRON_PROBE_FIELDS.has(fieldName));
102
- if (unsupportedProbeField) {
103
- return { error: `electron.probe only supports action, launchId, and timeoutMs; remove electron.${unsupportedProbeField}.` };
62
+ return (enumError(input, "handoff", AGENT_BROWSER_ELECTRON_HANDOFFS) ??
63
+ enumError(input, "targetType", AGENT_BROWSER_ELECTRON_TARGET_TYPES) ??
64
+ numericError(input));
65
+ }
66
+ function numericError(input) {
67
+ for (const field of ["maxResults", "timeoutMs"]) {
68
+ const error = optionalInteger(input, field).error;
69
+ if (error !== undefined) {
70
+ return error;
104
71
  }
105
- const launchId = validateOptionalNonEmptyString(input, "launchId").value;
106
- const timeoutMs = validateOptionalElectronPositiveInteger(input, "timeoutMs").value;
72
+ }
73
+ return input.all !== undefined && input.all !== true
74
+ ? "electron.all must be true when provided."
75
+ : undefined;
76
+ }
77
+ function unsupportedField(input, allowed) {
78
+ return Object.keys(input).find((field) => !allowed.includes(field));
79
+ }
80
+ function allowedFieldError(input, action, allowed) {
81
+ const field = unsupportedField(input, allowed);
82
+ return field === undefined ? undefined : `electron.${action} does not support electron.${field}.`;
83
+ }
84
+ function compileLaunch(input) {
85
+ const fieldError = allowedFieldError(input, "launch", [
86
+ "action",
87
+ "allow",
88
+ "appArgs",
89
+ "appName",
90
+ "appPath",
91
+ "bundleId",
92
+ "deny",
93
+ "executablePath",
94
+ "handoff",
95
+ "targetType",
96
+ "timeoutMs",
97
+ ]);
98
+ if (fieldError !== undefined) {
99
+ return { error: fieldError };
100
+ }
101
+ const appArgs = stringArray(input.appArgs);
102
+ const reservedArg = appArgs?.find((arg) => arg === "--" ||
103
+ AGENT_BROWSER_ELECTRON_RESERVED_APP_ARGS.some((reserved) => arg === reserved || arg.startsWith(`${reserved}=`)));
104
+ if (reservedArg !== undefined) {
105
+ return { error: `electron.appArgs must not include wrapper-owned launch flag ${reservedArg}.` };
106
+ }
107
+ const providedTargets = ["appPath", "appName", "bundleId", "executablePath"].filter((field) => input[field] !== undefined);
108
+ if (providedTargets.length !== 1) {
107
109
  return {
108
- compiled: {
109
- action: "probe",
110
- ...(launchId ? { launchId } : {}),
111
- ...(timeoutMs ? { timeoutMs } : {}),
112
- },
110
+ error: "electron.launch requires exactly one of appPath, appName, bundleId, or executablePath.",
113
111
  };
114
112
  }
115
- if (action === "launch") {
116
- const allowedFields = new Set(["action", "allow", "appArgs", "appName", "appPath", "bundleId", "deny", "executablePath", "handoff", "targetType", "timeoutMs"]);
117
- const unsupportedFieldError = onlyAllowedElectronFields(input, action, allowedFields);
118
- if (unsupportedFieldError)
119
- return { error: unsupportedFieldError };
120
- const appArgs = input.appArgs?.map((item) => item.trim());
121
- const appArgsError = validateElectronLaunchAppArgs(appArgs);
122
- if (appArgsError)
123
- return { error: appArgsError };
124
- const targetFields = ["appPath", "appName", "bundleId", "executablePath"];
125
- const providedTargets = targetFields.filter((fieldName) => input[fieldName] !== undefined);
126
- if (providedTargets.length !== 1) {
127
- return { error: "electron.launch requires exactly one of appPath, appName, bundleId, or executablePath." };
128
- }
113
+ return {
114
+ compiled: {
115
+ action: "launch",
116
+ allow: stringArray(input.allow),
117
+ appArgs,
118
+ deny: stringArray(input.deny),
119
+ appName: optionalString(input, "appName").value,
120
+ appPath: optionalString(input, "appPath").value,
121
+ bundleId: optionalString(input, "bundleId").value,
122
+ executablePath: optionalString(input, "executablePath").value,
123
+ handoff: AGENT_BROWSER_ELECTRON_HANDOFFS.find((value) => value === input.handoff) ?? "snapshot",
124
+ targetType: AGENT_BROWSER_ELECTRON_TARGET_TYPES.find((value) => value === input.targetType) ?? "page",
125
+ timeoutMs: optionalInteger(input, "timeoutMs").value,
126
+ },
127
+ };
128
+ }
129
+ function compileList(input) {
130
+ const field = unsupportedField(input, AGENT_BROWSER_ELECTRON_LIST_FIELDS);
131
+ if (field !== undefined) {
132
+ return { error: `electron.list only supports query and maxResults; remove electron.${field}.` };
133
+ }
134
+ return {
135
+ compiled: {
136
+ action: "list",
137
+ maxResults: optionalInteger(input, "maxResults").value,
138
+ query: optionalString(input, "query").value,
139
+ },
140
+ };
141
+ }
142
+ function compileProbe(input) {
143
+ const field = unsupportedField(input, AGENT_BROWSER_ELECTRON_PROBE_FIELDS);
144
+ if (field !== undefined) {
129
145
  return {
130
- compiled: {
131
- action: "launch",
132
- allow: input.allow?.map((item) => item.trim()),
133
- appArgs,
134
- deny: input.deny?.map((item) => item.trim()),
135
- appName: validateOptionalNonEmptyString(input, "appName").value,
136
- appPath: validateOptionalNonEmptyString(input, "appPath").value,
137
- bundleId: validateOptionalNonEmptyString(input, "bundleId").value,
138
- executablePath: validateOptionalNonEmptyString(input, "executablePath").value,
139
- handoff: input.handoff ?? "snapshot",
140
- targetType: input.targetType ?? "page",
141
- timeoutMs: validateOptionalElectronPositiveInteger(input, "timeoutMs").value,
142
- },
146
+ error: `electron.probe only supports action, launchId, and timeoutMs; remove electron.${field}.`,
143
147
  };
144
148
  }
145
- const allowedFields = new Set(["action", "all", "launchId", "timeoutMs"]);
146
- const unsupportedFieldError = onlyAllowedElectronFields(input, action, allowedFields);
147
- if (unsupportedFieldError)
148
- return { error: unsupportedFieldError };
149
+ const launchId = optionalString(input, "launchId").value;
150
+ const timeoutMs = optionalInteger(input, "timeoutMs").value;
151
+ return {
152
+ compiled: {
153
+ action: "probe",
154
+ ...(launchId !== undefined ? { launchId } : {}),
155
+ ...(timeoutMs !== undefined ? { timeoutMs } : {}),
156
+ },
157
+ };
158
+ }
159
+ function compileStatusOrCleanup(input, action) {
160
+ const error = allowedFieldError(input, action, ["action", "all", "launchId", "timeoutMs"]);
161
+ if (error !== undefined) {
162
+ return { error };
163
+ }
149
164
  if (input.all === true && input.launchId !== undefined) {
150
165
  return { error: `electron.${action} accepts launchId or all, not both.` };
151
166
  }
152
167
  return {
153
168
  compiled: {
154
- action: action,
155
- all: input.all === true || undefined,
156
- launchId: validateOptionalNonEmptyString(input, "launchId").value,
157
- timeoutMs: validateOptionalElectronPositiveInteger(input, "timeoutMs").value,
169
+ action,
170
+ all: input.all === true ? true : undefined,
171
+ launchId: optionalString(input, "launchId").value,
172
+ timeoutMs: optionalInteger(input, "timeoutMs").value,
158
173
  },
159
174
  };
160
175
  }
176
+ export function compileAgentBrowserElectron(input) {
177
+ if (!isRecord(input)) {
178
+ return { error: "electron must be an object." };
179
+ }
180
+ const action = AGENT_BROWSER_ELECTRON_ACTIONS.find((value) => value === input.action);
181
+ if (action === undefined) {
182
+ return {
183
+ error: `electron.action must be one of: ${AGENT_BROWSER_ELECTRON_ACTIONS.join(", ")}.`,
184
+ };
185
+ }
186
+ const error = commonError(input);
187
+ if (error !== undefined) {
188
+ return { error };
189
+ }
190
+ switch (action) {
191
+ case "launch":
192
+ return compileLaunch(input);
193
+ case "list":
194
+ return compileList(input);
195
+ case "probe":
196
+ return compileProbe(input);
197
+ case "status":
198
+ case "cleanup":
199
+ return compileStatusOrCleanup(input, action);
200
+ }
201
+ }