pi-agent-browser-native 0.9.3 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. package/CHANGELOG.md +106 -5
  2. package/README.md +58 -791
  3. package/dist/extensions/agent-browser/index.js +43101 -2031
  4. package/dist/extensions/agent-browser/lib/argv-descriptor.js +49 -26
  5. package/dist/extensions/agent-browser/lib/argv-grammar.js +82 -93
  6. package/dist/extensions/agent-browser/lib/bash-guard.js +129 -126
  7. package/dist/extensions/agent-browser/lib/batch-lifecycle.js +112 -51
  8. package/dist/extensions/agent-browser/lib/browser-execution-claim-codec.js +61 -0
  9. package/dist/extensions/agent-browser/lib/browser-execution-claim-storage.js +232 -0
  10. package/dist/extensions/agent-browser/lib/browser-execution-claims.js +202 -0
  11. package/dist/extensions/agent-browser/lib/browser-execution-identity.js +77 -0
  12. package/dist/extensions/agent-browser/lib/browser-journal-branch.js +98 -0
  13. package/dist/extensions/agent-browser/lib/browser-journal-contracts.js +1 -0
  14. package/dist/extensions/agent-browser/lib/browser-journal-projection.js +221 -0
  15. package/dist/extensions/agent-browser/lib/browser-journal-reader.js +89 -0
  16. package/dist/extensions/agent-browser/lib/browser-journal-replay.js +246 -0
  17. package/dist/extensions/agent-browser/lib/browser-journal.js +103 -394
  18. package/dist/extensions/agent-browser/lib/browser-legacy-pages.js +220 -0
  19. package/dist/extensions/agent-browser/lib/browser-legacy-projection.js +282 -0
  20. package/dist/extensions/agent-browser/lib/browser-legacy-types.js +1 -0
  21. package/dist/extensions/agent-browser/lib/browser-session-conversion-stream.js +217 -0
  22. package/dist/extensions/agent-browser/lib/browser-session-conversion.js +80 -335
  23. package/dist/extensions/agent-browser/lib/browser-transcript-contracts.js +35 -0
  24. package/dist/extensions/agent-browser/lib/browser-transcript-validation.js +166 -0
  25. package/dist/extensions/agent-browser/lib/browser-transcript.js +137 -82
  26. package/dist/extensions/agent-browser/lib/browser-value-parsing.js +15 -0
  27. package/dist/extensions/agent-browser/lib/command-capabilities.js +340 -0
  28. package/dist/extensions/agent-browser/lib/command-policy.js +107 -88
  29. package/dist/extensions/agent-browser/lib/command-taxonomy.js +49 -322
  30. package/dist/extensions/agent-browser/lib/config-policy.js +138 -343
  31. package/dist/extensions/agent-browser/lib/config-providers.js +71 -0
  32. package/dist/extensions/agent-browser/lib/config-validation.js +231 -0
  33. package/dist/extensions/agent-browser/lib/config.js +20 -8
  34. package/dist/extensions/agent-browser/lib/electron/cdp.js +20 -8
  35. package/dist/extensions/agent-browser/lib/electron/cleanup.js +128 -83
  36. package/dist/extensions/agent-browser/lib/electron/discovery-darwin.js +109 -0
  37. package/dist/extensions/agent-browser/lib/electron/discovery-desktop.js +136 -0
  38. package/dist/extensions/agent-browser/lib/electron/discovery-evidence.js +90 -0
  39. package/dist/extensions/agent-browser/lib/electron/discovery-linux.js +93 -0
  40. package/dist/extensions/agent-browser/lib/electron/discovery-packages.js +162 -0
  41. package/dist/extensions/agent-browser/lib/electron/discovery-types.js +2 -0
  42. package/dist/extensions/agent-browser/lib/electron/discovery.js +140 -549
  43. package/dist/extensions/agent-browser/lib/electron/launch-monitor.js +102 -0
  44. package/dist/extensions/agent-browser/lib/electron/launch-process.js +209 -0
  45. package/dist/extensions/agent-browser/lib/electron/launch-types.js +2 -0
  46. package/dist/extensions/agent-browser/lib/electron/launch.js +261 -355
  47. package/dist/extensions/agent-browser/lib/executable-path.js +21 -12
  48. package/dist/extensions/agent-browser/lib/execution-cwd.js +35 -18
  49. package/dist/extensions/agent-browser/lib/fs-utils.js +1 -9
  50. package/dist/extensions/agent-browser/lib/input-modes/electron.js +162 -121
  51. package/dist/extensions/agent-browser/lib/input-modes/job.js +123 -317
  52. package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +116 -0
  53. package/dist/extensions/agent-browser/lib/input-modes/lookup-plan.js +132 -0
  54. package/dist/extensions/agent-browser/lib/input-modes/lookup-redaction.js +57 -0
  55. package/dist/extensions/agent-browser/lib/input-modes/lookup-source-evidence.js +151 -0
  56. package/dist/extensions/agent-browser/lib/input-modes/lookup-workspace.js +142 -0
  57. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +58 -412
  58. package/dist/extensions/agent-browser/lib/input-modes/params.js +86 -40
  59. package/dist/extensions/agent-browser/lib/input-modes/qa-analysis.js +268 -0
  60. package/dist/extensions/agent-browser/lib/input-modes/qa-presentation.js +117 -0
  61. package/dist/extensions/agent-browser/lib/input-modes/script-child.js +396 -0
  62. package/dist/extensions/agent-browser/lib/input-modes/script-protocol.js +86 -0
  63. package/dist/extensions/agent-browser/lib/input-modes/script-types.js +1 -0
  64. package/dist/extensions/agent-browser/lib/input-modes/script-validation.js +60 -0
  65. package/dist/extensions/agent-browser/lib/input-modes/script.js +60 -409
  66. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +218 -128
  67. package/dist/extensions/agent-browser/lib/input-modes/shared.js +15 -4
  68. package/dist/extensions/agent-browser/lib/input-modes/types.js +56 -7
  69. package/dist/extensions/agent-browser/lib/json-schema.js +22 -10
  70. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +17 -5
  71. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +92 -425
  72. package/dist/extensions/agent-browser/lib/managed-session-posix-storage.js +58 -0
  73. package/dist/extensions/agent-browser/lib/managed-session-project-identity.js +244 -0
  74. package/dist/extensions/agent-browser/lib/managed-session-restore-context.js +84 -0
  75. package/dist/extensions/agent-browser/lib/managed-session-restore-policy.js +119 -0
  76. package/dist/extensions/agent-browser/lib/managed-session-restore-state.js +83 -0
  77. package/dist/extensions/agent-browser/lib/managed-session-restore.js +168 -300
  78. package/dist/extensions/agent-browser/lib/managed-session-snapshot-records.js +277 -0
  79. package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +128 -305
  80. package/dist/extensions/agent-browser/lib/managed-session-storage.js +56 -253
  81. package/dist/extensions/agent-browser/lib/native-confirmation.js +140 -0
  82. package/dist/extensions/agent-browser/lib/native-output.js +43 -9
  83. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +106 -59
  84. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-merge.js +14 -6
  85. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +109 -57
  86. package/dist/extensions/agent-browser/lib/orchestration/browser-run/browser-observation-result.js +82 -0
  87. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +164 -60
  88. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostic-values.js +31 -0
  89. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +152 -781
  90. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-observation.js +203 -0
  91. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-text-diagnostics.js +109 -0
  92. package/dist/extensions/agent-browser/lib/orchestration/browser-run/fill-diagnostics.js +119 -0
  93. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-action-recovery.js +147 -0
  94. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-actions.js +144 -0
  95. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-content.js +123 -0
  96. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-contracts.js +1 -0
  97. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-details.js +156 -0
  98. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-electron.js +187 -0
  99. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-evidence.js +39 -0
  100. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-missing-binary.js +89 -0
  101. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-recovery.js +97 -0
  102. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-redaction.js +106 -0
  103. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-timeout.js +110 -0
  104. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +41 -538
  105. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +199 -154
  106. package/dist/extensions/agent-browser/lib/orchestration/browser-run/interaction-diagnostics.js +290 -0
  107. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-close.js +167 -0
  108. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-inspection.js +108 -0
  109. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +127 -205
  110. package/dist/extensions/agent-browser/lib/orchestration/browser-run/native-helper-observation.js +65 -0
  111. package/dist/extensions/agent-browser/lib/orchestration/browser-run/observation-types.js +1 -0
  112. package/dist/extensions/agent-browser/lib/orchestration/browser-run/overlay-diagnostics.js +120 -0
  113. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +113 -30
  114. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +109 -28
  115. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter-data.js +150 -0
  116. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +147 -253
  117. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-rendered-text.js +147 -0
  118. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +59 -24
  119. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-artifacts.js +159 -0
  120. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-command.js +131 -0
  121. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-contracts.js +1 -0
  122. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-daemon.js +93 -0
  123. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-failure.js +42 -0
  124. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-guards.js +242 -0
  125. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-input.js +75 -0
  126. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-observations.js +92 -0
  127. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-selection.js +254 -0
  128. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-state.js +121 -0
  129. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-refs.js +130 -0
  130. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-resources.js +114 -0
  131. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-semantic.js +121 -0
  132. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-session-plan.js +222 -0
  133. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-timeouts.js +68 -0
  134. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +176 -1123
  135. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-analysis.js +191 -0
  136. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-confirmation.js +152 -0
  137. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-diagnostics.js +182 -0
  138. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-electron.js +150 -0
  139. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-contracts.js +1 -0
  140. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase-contracts.js +1 -0
  141. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase.js +115 -0
  142. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle.js +256 -0
  143. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed-contracts.js +1 -0
  144. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed.js +256 -0
  145. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase-contracts.js +1 -0
  146. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase.js +93 -0
  147. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native.js +113 -0
  148. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation-contracts.js +1 -0
  149. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation.js +316 -0
  150. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-ownership.js +28 -0
  151. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase-contracts.js +1 -0
  152. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase.js +142 -0
  153. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation-contracts.js +1 -0
  154. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation.js +333 -0
  155. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase-contracts.js +1 -0
  156. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase.js +71 -0
  157. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication.js +201 -0
  158. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-receipts.js +183 -0
  159. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-refs.js +200 -0
  160. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-tabs.js +142 -0
  161. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +18 -968
  162. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +23 -13
  163. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-receipt-reconciliation.js +198 -0
  164. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-contracts.js +1 -0
  165. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-presentation.js +154 -0
  166. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery.js +68 -151
  167. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-capture.js +14 -0
  168. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-observation.js +169 -46
  169. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-commands.js +130 -0
  170. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-electron.js +212 -0
  171. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-observations.js +61 -0
  172. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-outcomes.js +187 -0
  173. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-refs.js +169 -0
  174. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-tabs.js +228 -0
  175. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +77 -765
  176. package/dist/extensions/agent-browser/lib/orchestration/browser-run/text-visibility-diagnostics.js +182 -0
  177. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-diagnostics.js +256 -0
  178. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-progress.js +108 -0
  179. package/dist/extensions/agent-browser/lib/orchestration/code-artifact-observation.js +39 -0
  180. package/dist/extensions/agent-browser/lib/orchestration/code-image-observation.js +119 -0
  181. package/dist/extensions/agent-browser/lib/orchestration/electron-host/branch.js +93 -0
  182. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup-result.js +58 -0
  183. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup.js +78 -0
  184. package/dist/extensions/agent-browser/lib/orchestration/electron-host/contracts.js +1 -0
  185. package/dist/extensions/agent-browser/lib/orchestration/electron-host/discovery.js +106 -0
  186. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +48 -821
  187. package/dist/extensions/agent-browser/lib/orchestration/electron-host/policy.js +86 -0
  188. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-collection.js +68 -0
  189. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +169 -0
  190. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +182 -0
  191. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe.js +161 -0
  192. package/dist/extensions/agent-browser/lib/orchestration/electron-host/status.js +167 -0
  193. package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +22 -10
  194. package/dist/extensions/agent-browser/lib/orchestration/extension-artifact-preflight.js +211 -0
  195. package/dist/extensions/agent-browser/lib/orchestration/extension-artifacts.js +23 -0
  196. package/dist/extensions/agent-browser/lib/orchestration/extension-attachment-replay.js +99 -0
  197. package/dist/extensions/agent-browser/lib/orchestration/extension-branch-restore.js +275 -0
  198. package/dist/extensions/agent-browser/lib/orchestration/extension-code.js +280 -0
  199. package/dist/extensions/agent-browser/lib/orchestration/extension-command-admission.js +303 -0
  200. package/dist/extensions/agent-browser/lib/orchestration/extension-command-output.js +36 -0
  201. package/dist/extensions/agent-browser/lib/orchestration/extension-command-result.js +335 -0
  202. package/dist/extensions/agent-browser/lib/orchestration/extension-command-run.js +227 -0
  203. package/dist/extensions/agent-browser/lib/orchestration/extension-command-state.js +1 -0
  204. package/dist/extensions/agent-browser/lib/orchestration/extension-electron-ownership.js +204 -0
  205. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-locks.js +139 -0
  206. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-queue.js +24 -0
  207. package/dist/extensions/agent-browser/lib/orchestration/extension-host-coordination.js +98 -0
  208. package/dist/extensions/agent-browser/lib/orchestration/extension-host-run.js +295 -0
  209. package/dist/extensions/agent-browser/lib/orchestration/extension-intent-replay.js +41 -0
  210. package/dist/extensions/agent-browser/lib/orchestration/extension-invocation.js +7 -0
  211. package/dist/extensions/agent-browser/lib/orchestration/extension-lifecycle.js +102 -0
  212. package/dist/extensions/agent-browser/lib/orchestration/extension-managed-ownership.js +133 -0
  213. package/dist/extensions/agent-browser/lib/orchestration/extension-observation.js +120 -0
  214. package/dist/extensions/agent-browser/lib/orchestration/extension-prompt.js +180 -0
  215. package/dist/extensions/agent-browser/lib/orchestration/extension-recording.js +290 -0
  216. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-contracts.js +1 -0
  217. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-replay.js +269 -0
  218. package/dist/extensions/agent-browser/lib/orchestration/extension-result-state.js +113 -0
  219. package/dist/extensions/agent-browser/lib/orchestration/extension-runtime.js +146 -0
  220. package/dist/extensions/agent-browser/lib/orchestration/extension-script-leases.js +58 -0
  221. package/dist/extensions/agent-browser/lib/orchestration/extension-tool-boundary.js +62 -0
  222. package/dist/extensions/agent-browser/lib/orchestration/extension-version-check.js +54 -0
  223. package/dist/extensions/agent-browser/lib/orchestration/input-plan-types.js +1 -0
  224. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +261 -185
  225. package/dist/extensions/agent-browser/lib/orchestration/input-redaction.js +62 -0
  226. package/dist/extensions/agent-browser/lib/orchestration/native-config.js +144 -0
  227. package/dist/extensions/agent-browser/lib/orchestration/native-root-launch.js +77 -0
  228. package/dist/extensions/agent-browser/lib/orchestration/native-session-defaults.js +210 -157
  229. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  230. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +197 -99
  231. package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +199 -96
  232. package/dist/extensions/agent-browser/lib/owned-managed-session-context.js +55 -0
  233. package/dist/extensions/agent-browser/lib/page-target-batch.js +118 -0
  234. package/dist/extensions/agent-browser/lib/page-target-guards.js +50 -0
  235. package/dist/extensions/agent-browser/lib/page-target-navigation.js +104 -0
  236. package/dist/extensions/agent-browser/lib/page-target-validation.js +55 -246
  237. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  238. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +133 -68
  239. package/dist/extensions/agent-browser/lib/playbook.js +16 -12
  240. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  241. package/dist/extensions/agent-browser/lib/process-environment.js +13 -6
  242. package/dist/extensions/agent-browser/lib/process-errors.js +23 -0
  243. package/dist/extensions/agent-browser/lib/process-identity.js +47 -15
  244. package/dist/extensions/agent-browser/lib/process-socket-storage.js +256 -0
  245. package/dist/extensions/agent-browser/lib/process-stdout.js +74 -0
  246. package/dist/extensions/agent-browser/lib/process.js +145 -536
  247. package/dist/extensions/agent-browser/lib/prompt-artifacts.js +287 -0
  248. package/dist/extensions/agent-browser/lib/prompt-policy.js +15 -194
  249. package/dist/extensions/agent-browser/lib/read-command.js +41 -0
  250. package/dist/extensions/agent-browser/lib/read-confirmation.js +131 -68
  251. package/dist/extensions/agent-browser/lib/recording-reservations.js +118 -45
  252. package/dist/extensions/agent-browser/lib/redaction-fields.js +75 -0
  253. package/dist/extensions/agent-browser/lib/redaction-json.js +149 -0
  254. package/dist/extensions/agent-browser/lib/redaction-url.js +88 -0
  255. package/dist/extensions/agent-browser/lib/results/action-contracts.js +1 -0
  256. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +28 -271
  257. package/dist/extensions/agent-browser/lib/results/artifact-contracts.js +1 -0
  258. package/dist/extensions/agent-browser/lib/results/artifact-manifest-validation.js +133 -0
  259. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +96 -94
  260. package/dist/extensions/agent-browser/lib/results/artifact-recommendations.js +73 -0
  261. package/dist/extensions/agent-browser/lib/results/categories.js +111 -54
  262. package/dist/extensions/agent-browser/lib/results/confirmation.js +29 -13
  263. package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +62 -27
  264. package/dist/extensions/agent-browser/lib/results/electron-recommendations.js +83 -0
  265. package/dist/extensions/agent-browser/lib/results/envelope-decoding.js +48 -0
  266. package/dist/extensions/agent-browser/lib/results/envelope.js +90 -67
  267. package/dist/extensions/agent-browser/lib/results/evidence-contracts.js +1 -0
  268. package/dist/extensions/agent-browser/lib/results/failure-recommendations.js +180 -0
  269. package/dist/extensions/agent-browser/lib/results/network-routes.js +86 -45
  270. package/dist/extensions/agent-browser/lib/results/network.js +35 -12
  271. package/dist/extensions/agent-browser/lib/results/next-actions.js +49 -19
  272. package/dist/extensions/agent-browser/lib/results/presentation/artifact-files.js +320 -0
  273. package/dist/extensions/agent-browser/lib/results/presentation/artifact-format.js +138 -0
  274. package/dist/extensions/agent-browser/lib/results/presentation/artifact-images.js +113 -0
  275. package/dist/extensions/agent-browser/lib/results/presentation/artifact-verification.js +145 -0
  276. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +99 -555
  277. package/dist/extensions/agent-browser/lib/results/presentation/batch-contracts.js +1 -0
  278. package/dist/extensions/agent-browser/lib/results/presentation/batch-recording.js +118 -0
  279. package/dist/extensions/agent-browser/lib/results/presentation/batch-redaction.js +68 -0
  280. package/dist/extensions/agent-browser/lib/results/presentation/batch-rendering.js +135 -0
  281. package/dist/extensions/agent-browser/lib/results/presentation/batch-step.js +227 -0
  282. package/dist/extensions/agent-browser/lib/results/presentation/batch-summary.js +91 -0
  283. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +91 -460
  284. package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +9 -5
  285. package/dist/extensions/agent-browser/lib/results/presentation/command-presenters.js +216 -0
  286. package/dist/extensions/agent-browser/lib/results/presentation/common.js +26 -9
  287. package/dist/extensions/agent-browser/lib/results/presentation/content.js +86 -29
  288. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-a11y.js +67 -0
  289. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-health.js +79 -0
  290. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-identity.js +199 -0
  291. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-logs.js +75 -0
  292. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network-actions.js +216 -0
  293. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network.js +124 -0
  294. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-redaction.js +64 -0
  295. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-storage.js +209 -0
  296. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-stream.js +69 -0
  297. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-summary.js +222 -0
  298. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +103 -1052
  299. package/dist/extensions/agent-browser/lib/results/presentation/early-result.js +70 -0
  300. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +130 -60
  301. package/dist/extensions/agent-browser/lib/results/presentation/input-contracts.js +1 -0
  302. package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +60 -145
  303. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +147 -88
  304. package/dist/extensions/agent-browser/lib/results/presentation/notices.js +75 -0
  305. package/dist/extensions/agent-browser/lib/results/presentation/observation-contracts.js +1 -0
  306. package/dist/extensions/agent-browser/lib/results/presentation/observation-rendering.js +127 -0
  307. package/dist/extensions/agent-browser/lib/results/presentation/outcomes.js +120 -0
  308. package/dist/extensions/agent-browser/lib/results/presentation/output-completion.js +77 -0
  309. package/dist/extensions/agent-browser/lib/results/presentation/output-spill.js +51 -0
  310. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +116 -240
  311. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +35 -21
  312. package/dist/extensions/agent-browser/lib/results/presentation/skills.js +109 -73
  313. package/dist/extensions/agent-browser/lib/results/presentation/source.js +109 -0
  314. package/dist/extensions/agent-browser/lib/results/presentation.js +17 -261
  315. package/dist/extensions/agent-browser/lib/results/recommendation-contracts.js +1 -0
  316. package/dist/extensions/agent-browser/lib/results/recording.js +52 -14
  317. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +14 -5
  318. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +30 -22
  319. package/dist/extensions/agent-browser/lib/results/selector-recovery-target.js +83 -0
  320. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +119 -119
  321. package/dist/extensions/agent-browser/lib/results/snapshot-compact.js +266 -0
  322. package/dist/extensions/agent-browser/lib/results/snapshot-content.js +32 -0
  323. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +104 -71
  324. package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +31 -11
  325. package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +125 -66
  326. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +26 -7
  327. package/dist/extensions/agent-browser/lib/results/snapshot.js +28 -248
  328. package/dist/extensions/agent-browser/lib/results/text.js +16 -5
  329. package/dist/extensions/agent-browser/lib/runtime-args-validation.js +133 -0
  330. package/dist/extensions/agent-browser/lib/runtime-compatibility.js +81 -0
  331. package/dist/extensions/agent-browser/lib/runtime-contracts.js +1 -0
  332. package/dist/extensions/agent-browser/lib/runtime-redaction.js +118 -0
  333. package/dist/extensions/agent-browser/lib/runtime-replay-events.js +144 -0
  334. package/dist/extensions/agent-browser/lib/runtime-session-identity.js +76 -0
  335. package/dist/extensions/agent-browser/lib/runtime-session-plan.js +114 -0
  336. package/dist/extensions/agent-browser/lib/runtime-session-replay.js +123 -0
  337. package/dist/extensions/agent-browser/lib/runtime-tab-correction.js +65 -0
  338. package/dist/extensions/agent-browser/lib/runtime-timeouts.js +28 -0
  339. package/dist/extensions/agent-browser/lib/runtime.js +137 -1041
  340. package/dist/extensions/agent-browser/lib/session-identity.js +51 -0
  341. package/dist/extensions/agent-browser/lib/session-page-observation.js +357 -0
  342. package/dist/extensions/agent-browser/lib/session-page-state.js +178 -333
  343. package/dist/extensions/agent-browser/lib/session-page-types.js +1 -0
  344. package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +81 -0
  345. package/dist/extensions/agent-browser/lib/temp-mutation-queue.js +7 -0
  346. package/dist/extensions/agent-browser/lib/temp-root-ownership.js +234 -0
  347. package/dist/extensions/agent-browser/lib/temp-root.js +211 -0
  348. package/dist/extensions/agent-browser/lib/temp.js +33 -446
  349. package/dist/extensions/agent-browser/lib/tool-surface.js +94 -24
  350. package/dist/extensions/agent-browser/lib/upstream-version.js +3 -2
  351. package/dist/extensions/agent-browser/lib/web-search-providers.js +193 -0
  352. package/dist/extensions/agent-browser/lib/web-search-request.js +102 -0
  353. package/dist/extensions/agent-browser/lib/web-search-results.js +281 -0
  354. package/dist/extensions/agent-browser/lib/web-search-schema.js +82 -0
  355. package/dist/extensions/agent-browser/lib/web-search.js +124 -614
  356. package/dist/extensions/agent-browser/lib/webmcp-observation.js +13 -6
  357. package/dist/extensions/agent-browser/lib/windows-stock-launcher.js +63 -37
  358. package/dist/extensions/agent-browser/script-worker.js +80 -43
  359. package/dist/scripts/agent-browser-target.mjs +4 -2
  360. package/docs/ARCHITECTURE.md +19 -6
  361. package/docs/CODE_QUALITY.md +267 -0
  362. package/docs/COMMAND_REFERENCE.md +272 -241
  363. package/docs/ELECTRON.md +77 -46
  364. package/docs/REFERENCE.md +869 -0
  365. package/docs/RELEASE.md +25 -22
  366. package/docs/REQUIREMENTS.md +2 -1
  367. package/docs/SUPPORT_MATRIX.md +81 -79
  368. package/docs/TOOL_CONTRACT.md +158 -125
  369. package/docs/platform-smoke.md +8 -8
  370. package/package.json +144 -120
  371. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  372. package/scripts/agent-browser-target.mjs +6 -2
  373. package/scripts/build.mjs +37 -8
  374. package/scripts/capability-core-commands.mjs +193 -0
  375. package/scripts/capability-options.mjs +283 -0
  376. package/scripts/capability-samples.mjs +133 -0
  377. package/scripts/capability-section.mjs +11 -0
  378. package/scripts/config.mjs +235 -132
  379. package/scripts/convert-browser-session.mjs +30 -9
  380. package/scripts/doctor-sources.mjs +195 -0
  381. package/scripts/doctor.mjs +94 -249
  382. package/scripts/platform-smoke/artifacts.mjs +38 -11
  383. package/scripts/platform-smoke/commands.mjs +104 -0
  384. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  385. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  386. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  387. package/scripts/platform-smoke/doctor.mjs +212 -320
  388. package/scripts/platform-smoke/lease-evidence.mjs +132 -0
  389. package/scripts/platform-smoke/linux-image/Dockerfile +8 -2
  390. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  391. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  392. package/scripts/platform-smoke/targets.mjs +154 -472
  393. package/scripts/platform-smoke.mjs +55 -40
  394. package/scripts/prepare.mjs +16 -7
@@ -0,0 +1,86 @@
1
+ import { buildOwnedManagedSessionRestoreContext, withOwnedManagedSessionContext, } from "../../managed-session-restore.js";
2
+ import { withAgentBrowserProcessEnvironment } from "../../process-environment.js";
3
+ import { normalizeProcessError } from "../../process-errors.js";
4
+ import { collectElectronManagedSessionTarget } from "../browser-run/diagnostics.js";
5
+ import { acquireOwnedManagedSessionDaemonPolicy, getRunningHeadedAutosavePolicyChangeError, } from "../browser-run/managed-session-daemon-policy.js";
6
+ export class ElectronManagedSessionPolicyError extends Error {
7
+ }
8
+ async function acquireElectronPolicy(options, context) {
9
+ try {
10
+ return await acquireOwnedManagedSessionDaemonPolicy({
11
+ context,
12
+ electronLaunchRecord: options.electronLaunchRecord,
13
+ electronVerificationTimeoutMs: options.timeoutMs,
14
+ signal: options.signal,
15
+ });
16
+ }
17
+ catch (error) {
18
+ throw new ElectronManagedSessionPolicyError(normalizeProcessError(error).message, {
19
+ cause: error,
20
+ });
21
+ }
22
+ }
23
+ function requirePolicyLock(policy, signal) {
24
+ if (policy.error !== undefined && policy.error.length > 0) {
25
+ throw new ElectronManagedSessionPolicyError(policy.error);
26
+ }
27
+ if (!policy.lock) {
28
+ throw new ElectronManagedSessionPolicyError(signal?.aborted === true
29
+ ? "Electron helper was aborted."
30
+ : "Electron helper could not acquire managed-session policy coordination.");
31
+ }
32
+ return policy.lock;
33
+ }
34
+ export async function withOwnedElectronManagedSessionPolicy(options, run) {
35
+ return withAgentBrowserProcessEnvironment({ AGENT_BROWSER_CONFIRM_ACTIONS: options.confirmActions }, async () => {
36
+ const autosavePolicyChangeError = getRunningHeadedAutosavePolicyChangeError(options.headedManagedAutosaveInterval);
37
+ if (autosavePolicyChangeError !== undefined && autosavePolicyChangeError.length > 0) {
38
+ throw new ElectronManagedSessionPolicyError(autosavePolicyChangeError);
39
+ }
40
+ const context = buildOwnedManagedSessionRestoreContext({
41
+ args: [
42
+ "--namespace",
43
+ options.namespace ?? "",
44
+ "--session",
45
+ options.sessionName,
46
+ ...options.args,
47
+ ],
48
+ cwd: options.cwd,
49
+ headedManagedAutosaveDisabled: options.headedManagedAutosaveDisabled,
50
+ headedManagedAutosaveInterval: options.headedManagedAutosaveInterval,
51
+ managedSessionName: options.sessionName,
52
+ namespace: options.namespace,
53
+ restoreState: options.restoreState,
54
+ });
55
+ if (!context) {
56
+ throw new ElectronManagedSessionPolicyError("Electron helper could not establish wrapper ownership for its managed session.");
57
+ }
58
+ const policy = await acquireElectronPolicy(options, context);
59
+ try {
60
+ requirePolicyLock(policy, options.signal);
61
+ return await withOwnedManagedSessionContext(context, run);
62
+ }
63
+ finally {
64
+ await policy.lock?.release();
65
+ }
66
+ });
67
+ }
68
+ export async function collectOwnedElectronManagedSessionTarget(options) {
69
+ try {
70
+ const target = (await withOwnedElectronManagedSessionPolicy({ ...options, args: ["get", "url"] }, () => collectElectronManagedSessionTarget({
71
+ cwd: options.cwd,
72
+ namespace: options.namespace,
73
+ sessionName: options.sessionName,
74
+ signal: options.signal,
75
+ timeoutMs: options.timeoutMs,
76
+ }))) ?? { sessionName: options.sessionName };
77
+ return { ...target, namespace: options.namespace };
78
+ }
79
+ catch (error) {
80
+ return {
81
+ error: normalizeProcessError(error).message,
82
+ namespace: options.namespace,
83
+ sessionName: options.sessionName,
84
+ };
85
+ }
86
+ }
@@ -0,0 +1,68 @@
1
+ import { boundElectronProbeString } from "../../electron/cdp.js";
2
+ import { normalizeProcessError } from "../../process-errors.js";
3
+ import { extractStringResultField, runSessionCommandData } from "../browser-run/session-state.js";
4
+ import { ELECTRON_FOCUSED_ELEMENT_EVAL, extractElectronFocusedElement, extractElectronProbeTabs, summarizeElectronProbeSnapshot, getElectronProbeSummary, } from "./probe-data.js";
5
+ async function runElectronProbeCommandData(options) {
6
+ try {
7
+ return {
8
+ data: await runSessionCommandData({ ...options, pinNamespace: true, throwOnFailure: true }),
9
+ };
10
+ }
11
+ catch (error) {
12
+ return { error: normalizeProcessError(error).message };
13
+ }
14
+ }
15
+ function probeCommandError(result, label) {
16
+ return result.error !== undefined && result.error.length > 0
17
+ ? `${label}: ${result.error}`
18
+ : undefined;
19
+ }
20
+ export async function collectElectronProbe(options) {
21
+ // Each read completes before the next: native session commands share a pending
22
+ // slot, and the final snapshot owns the refs published by this probe.
23
+ const urlResult = await runElectronProbeCommandData({ ...options, args: ["get", "url"] });
24
+ const urlError = probeCommandError(urlResult, "get url");
25
+ if (urlError !== undefined) {
26
+ throw new Error(urlError);
27
+ }
28
+ const url = extractStringResultField(urlResult.data, "result") ??
29
+ extractStringResultField(urlResult.data, "url");
30
+ if (url === undefined || url.trim().length === 0) {
31
+ throw new Error("get url returned no active page URL.");
32
+ }
33
+ const titleResult = await runElectronProbeCommandData({ ...options, args: ["get", "title"] });
34
+ const focusedResult = await runElectronProbeCommandData({
35
+ ...options,
36
+ args: ["eval", "--stdin"],
37
+ stdin: ELECTRON_FOCUSED_ELEMENT_EVAL,
38
+ });
39
+ const tabsResult = await runElectronProbeCommandData({ ...options, args: ["tab", "list"] });
40
+ const snapshotResult = await runElectronProbeCommandData({
41
+ ...options,
42
+ args: ["snapshot", "-i"],
43
+ });
44
+ const errors = [
45
+ probeCommandError(titleResult, "get title"),
46
+ probeCommandError(focusedResult, "focused element"),
47
+ probeCommandError(tabsResult, "tab list"),
48
+ probeCommandError(snapshotResult, "snapshot"),
49
+ ]
50
+ .filter((item) => item !== undefined)
51
+ .map((error) => boundElectronProbeString(error, 240) ?? "probe command failed");
52
+ const { activeTab, tabs } = extractElectronProbeTabs(tabsResult.data);
53
+ const { refSnapshot, snapshot } = summarizeElectronProbeSnapshot(snapshotResult.data);
54
+ const probe = {
55
+ activeTab,
56
+ focusedElement: extractElectronFocusedElement(focusedResult.data),
57
+ errors: errors.length > 0 ? errors : undefined,
58
+ refSnapshot,
59
+ sessionName: options.sessionName,
60
+ snapshot,
61
+ status: errors.length === 0 ? "succeeded" : "partial",
62
+ tabs,
63
+ title: boundElectronProbeString(extractStringResultField(titleResult.data, "result") ??
64
+ extractStringResultField(titleResult.data, "title"), 160),
65
+ url,
66
+ };
67
+ return { ...probe, summary: getElectronProbeSummary(probe) };
68
+ }
@@ -0,0 +1,169 @@
1
+ import { boundElectronProbeString } from "../../electron/cdp.js";
2
+ import { isRecord } from "../../parsing.js";
3
+ import { extractRefSnapshotFromData } from "../../session-page-state.js";
4
+ export const ELECTRON_FOCUSED_ELEMENT_EVAL = `(() => {
5
+ const clean = (value, max = 80) => {
6
+ if (typeof value !== "string") return undefined;
7
+ const normalized = value.replace(/\\s+/g, " ").trim();
8
+ if (!normalized) return undefined;
9
+ return normalized.length > max ? normalized.slice(0, max - 3) + "..." : normalized;
10
+ };
11
+ const describeElement = (element) => {
12
+ if (!element || !(element instanceof Element)) return undefined;
13
+ const tagName = element.tagName.toLowerCase();
14
+ const inputLike = element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement;
15
+ const contentEditable = element instanceof HTMLElement && element.isContentEditable;
16
+ const containerLike = tagName === "body" || tagName === "html";
17
+ const rawText = element.textContent || "";
18
+ const exposeText = !inputLike && !contentEditable && !containerLike;
19
+ const text = exposeText ? clean(rawText) : undefined;
20
+ return {
21
+ tagName: clean(tagName, 40),
22
+ role: clean(element.getAttribute("role") || "", 60),
23
+ name: clean(element.getAttribute("aria-label") || element.getAttribute("title") || text || "", 80),
24
+ id: clean(element.id || "", 80),
25
+ type: clean(element.getAttribute("type") || "", 40),
26
+ placeholder: clean(element.getAttribute("placeholder") || "", 80),
27
+ ariaLabel: clean(element.getAttribute("aria-label") || "", 80),
28
+ title: clean(element.getAttribute("title") || "", 80),
29
+ textLength: !exposeText && rawText ? rawText.length : undefined,
30
+ textPreview: text,
31
+ valueLength: inputLike && typeof element.value === "string" ? element.value.length : undefined,
32
+ isContentEditable: contentEditable || undefined,
33
+ };
34
+ };
35
+ return { focusedElement: describeElement(document.activeElement) };
36
+ })()`;
37
+ const ELECTRON_PROBE_MAX_TABS = 6;
38
+ const ELECTRON_PROBE_MAX_REF_IDS = 20;
39
+ const ELECTRON_PROBE_MAX_SNAPSHOT_LINES = 12;
40
+ const ELECTRON_PROBE_MAX_SNAPSHOT_CHARS = 1_600;
41
+ function getTrimmedString(value) {
42
+ return typeof value === "string" ? boundElectronProbeString(value) : undefined;
43
+ }
44
+ function getOptionalBoolean(value) {
45
+ return typeof value === "boolean" ? value : undefined;
46
+ }
47
+ function getOptionalNumber(value) {
48
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
49
+ }
50
+ function focusedElementPayload(data) {
51
+ const payload = isRecord(data) && isRecord(data.result) ? data.result : data;
52
+ if (!isRecord(payload)) {
53
+ return;
54
+ }
55
+ return isRecord(payload.focusedElement) ? payload.focusedElement : payload;
56
+ }
57
+ export function extractElectronFocusedElement(data) {
58
+ const raw = focusedElementPayload(data);
59
+ if (!raw) {
60
+ return;
61
+ }
62
+ const focusedElement = {
63
+ ariaLabel: getTrimmedString(raw.ariaLabel),
64
+ id: getTrimmedString(raw.id),
65
+ isContentEditable: getOptionalBoolean(raw.isContentEditable),
66
+ name: getTrimmedString(raw.name),
67
+ placeholder: getTrimmedString(raw.placeholder),
68
+ role: getTrimmedString(raw.role),
69
+ tagName: getTrimmedString(raw.tagName),
70
+ textLength: getOptionalNumber(raw.textLength),
71
+ textPreview: getTrimmedString(raw.textPreview),
72
+ title: getTrimmedString(raw.title),
73
+ type: getTrimmedString(raw.type),
74
+ valueLength: getOptionalNumber(raw.valueLength),
75
+ };
76
+ return Object.values(focusedElement).some((value) => value !== undefined)
77
+ ? focusedElement
78
+ : undefined;
79
+ }
80
+ function rawProbeTabs(data) {
81
+ if (isRecord(data) && Array.isArray(data.tabs)) {
82
+ return data.tabs;
83
+ }
84
+ return Array.isArray(data) ? data : [];
85
+ }
86
+ export function extractElectronProbeTabs(data) {
87
+ const allTabs = rawProbeTabs(data)
88
+ .filter(isRecord)
89
+ .map((tab, index) => ({
90
+ active: getOptionalBoolean(tab.active),
91
+ index: typeof tab.index === "number" && Number.isInteger(tab.index) ? tab.index : index,
92
+ tabId: getTrimmedString(tab.tabId) ?? getTrimmedString(tab.id),
93
+ title: getTrimmedString(tab.title) ?? getTrimmedString(tab.label),
94
+ type: getTrimmedString(tab.type),
95
+ url: typeof tab.url === "string" ? tab.url : undefined,
96
+ }));
97
+ if (allTabs.length === 0) {
98
+ return {};
99
+ }
100
+ const shown = allTabs.slice(0, ELECTRON_PROBE_MAX_TABS);
101
+ return {
102
+ activeTab: allTabs.find((tab) => tab.active === true) ?? allTabs[0],
103
+ tabs: {
104
+ omittedCount: allTabs.length > shown.length ? allTabs.length - shown.length : undefined,
105
+ shown,
106
+ total: allTabs.length,
107
+ },
108
+ };
109
+ }
110
+ function truncateElectronProbeSnapshotText(snapshotText) {
111
+ if (snapshotText === undefined || snapshotText.length === 0) {
112
+ return { lineCount: 0 };
113
+ }
114
+ const lines = snapshotText.split(/\r?\n/);
115
+ const shownLines = [];
116
+ let usedChars = 0;
117
+ for (const line of lines) {
118
+ if (shownLines.length >= ELECTRON_PROBE_MAX_SNAPSHOT_LINES) {
119
+ break;
120
+ }
121
+ const nextLength = usedChars + line.length + (shownLines.length > 0 ? 1 : 0);
122
+ if (nextLength > ELECTRON_PROBE_MAX_SNAPSHOT_CHARS) {
123
+ if (shownLines.length === 0) {
124
+ shownLines.push(`${line.slice(0, ELECTRON_PROBE_MAX_SNAPSHOT_CHARS - 3)}...`);
125
+ }
126
+ break;
127
+ }
128
+ shownLines.push(line);
129
+ usedChars = nextLength;
130
+ }
131
+ return {
132
+ lineCount: lines.length,
133
+ omittedLineCount: lines.length > shownLines.length ? lines.length - shownLines.length : undefined,
134
+ text: shownLines.length > 0 ? shownLines.join("\n") : undefined,
135
+ };
136
+ }
137
+ export function summarizeElectronProbeSnapshot(data) {
138
+ const refSnapshot = extractRefSnapshotFromData(data);
139
+ const rawSnapshotText = isRecord(data) ? getTrimmedString(data.snapshot) : undefined;
140
+ const truncated = truncateElectronProbeSnapshotText(rawSnapshotText);
141
+ const refIds = refSnapshot?.refIds ?? [];
142
+ const shownRefIds = refIds.slice(0, ELECTRON_PROBE_MAX_REF_IDS);
143
+ const hasSnapshot = refSnapshot !== undefined || (truncated.text !== undefined && truncated.text.length > 0);
144
+ const snapshot = hasSnapshot
145
+ ? {
146
+ lineCount: truncated.lineCount,
147
+ omittedLineCount: truncated.omittedLineCount,
148
+ omittedRefCount: refIds.length > shownRefIds.length ? refIds.length - shownRefIds.length : undefined,
149
+ refCount: refIds.length,
150
+ refIds: shownRefIds,
151
+ text: truncated.text,
152
+ }
153
+ : undefined;
154
+ return { refSnapshot, snapshot };
155
+ }
156
+ export function getElectronProbeSummary(probe) {
157
+ const parts = [
158
+ probe.title !== undefined && probe.title.length > 0 ? `title "${probe.title}"` : undefined,
159
+ probe.url !== undefined && probe.url.length > 0
160
+ ? `url ${boundElectronProbeString(probe.url, 300) ?? ""}`
161
+ : undefined,
162
+ probe.focusedElement ? "focused element" : undefined,
163
+ probe.tabs ? `${probe.tabs.total} tab(s)` : undefined,
164
+ probe.snapshot ? `${probe.snapshot.refCount} ref(s)` : undefined,
165
+ ].filter((item) => item !== undefined);
166
+ return parts.length > 0
167
+ ? `Electron probe collected ${parts.join(", ")}.`
168
+ : "Electron probe did not return current session state.";
169
+ }
@@ -0,0 +1,182 @@
1
+ import { boundElectronProbeString } from "../../electron/cdp.js";
2
+ import { buildAgentBrowserNextActions } from "../../results/action-recommendations.js";
3
+ import { buildAgentBrowserResultCategoryDetails } from "../../results/categories.js";
4
+ import { appendUniqueAgentBrowserNextActions } from "../../results/next-actions.js";
5
+ import { redactSensitiveText } from "../../runtime-redaction.js";
6
+ import { isAboutBlankUrl } from "../../session-page-state.js";
7
+ import { redactToolDetails } from "../browser-run/final-result.js";
8
+ import { buildElectronIdentifiers, buildElectronMismatchNextActions, formatElectronSessionMismatchText, getLiveElectronRendererTargets, } from "../browser-run/session-state.js";
9
+ function presentProbeTab(tab) {
10
+ return { ...tab, url: boundElectronProbeString(tab.url) };
11
+ }
12
+ function presentProbe(probe) {
13
+ return {
14
+ ...probe,
15
+ activeTab: probe.activeTab ? presentProbeTab(probe.activeTab) : undefined,
16
+ tabs: probe.tabs ? { ...probe.tabs, shown: probe.tabs.shown.map(presentProbeTab) } : undefined,
17
+ url: boundElectronProbeString(probe.url, 300),
18
+ };
19
+ }
20
+ function presentStrings(values) {
21
+ return values.filter((value) => value !== undefined && value.length > 0);
22
+ }
23
+ function formatFocusedElementAttributes(element) {
24
+ return presentStrings([
25
+ element.id !== undefined && element.id.length > 0 ? `#${element.id}` : undefined,
26
+ element.type !== undefined && element.type.length > 0 ? `type=${element.type}` : undefined,
27
+ element.valueLength !== undefined ? `valueLength=${element.valueLength}` : undefined,
28
+ element.textLength !== undefined ? `textLength=${element.textLength}` : undefined,
29
+ ]).join(", ");
30
+ }
31
+ function focusedElementLabel(element) {
32
+ return (element.name ?? element.textPreview ?? element.placeholder ?? element.ariaLabel ?? element.title);
33
+ }
34
+ function formatElectronProbeFocusedElement(element) {
35
+ if (!element) {
36
+ return;
37
+ }
38
+ const label = focusedElementLabel(element);
39
+ const descriptorText = presentStrings([element.role, element.tagName]).join("/");
40
+ const descriptor = descriptorText.length > 0 ? descriptorText : "element";
41
+ const suffix = formatFocusedElementAttributes(element);
42
+ return `Focused: ${descriptor}${label !== undefined && label.length > 0 ? ` "${label}"` : ""}${suffix.length > 0 ? ` (${suffix})` : ""}`;
43
+ }
44
+ function formatElectronProbeContextText(context) {
45
+ if (context.mode === "launchId") {
46
+ return `Probe context: wrapper launch ${context.launchId ?? "undefined"} session ${context.sessionName}.`;
47
+ }
48
+ if (context.note !== undefined && context.note.length > 0) {
49
+ return `Probe context: current managed session ${context.sessionName}; ${context.note}`;
50
+ }
51
+ if (context.launchId !== undefined && context.launchId.length > 0) {
52
+ return `Probe context: current managed session ${context.sessionName} maps to Electron launch ${context.launchId}.`;
53
+ }
54
+ return `Probe context: current managed session ${context.sessionName} only; pass electron.probe.launchId to compare wrapper-tracked launch status.`;
55
+ }
56
+ function formatElectronProbeLaunchStatusText(status, probe) {
57
+ if (!status) {
58
+ return;
59
+ }
60
+ let pidText = "";
61
+ if (status.pidAlive !== undefined) {
62
+ pidText = status.pidAlive ? ", pid alive" : ", pid dead";
63
+ }
64
+ const lines = [
65
+ `Launch status: ${status.portAlive ? "debug port alive" : "debug port dead"}${pidText}; ${status.targets.length} CDP target(s).`,
66
+ ];
67
+ if (isAboutBlankUrl(probe.url) &&
68
+ (!status.portAlive ||
69
+ status.pidAlive === false ||
70
+ getLiveElectronRendererTargets(status.targets).length === 0)) {
71
+ lines.push("Electron lifecycle warning: the browser session is on about:blank and the wrapper launch has no live renderer target to reattach. Run electron.status, cleanup if dead, or relaunch the app.");
72
+ }
73
+ return lines.join("\n");
74
+ }
75
+ function formatProbeTabs(probe) {
76
+ if (!probe.tabs) {
77
+ return;
78
+ }
79
+ const omitted = (probe.tabs.omittedCount ?? 0) !== 0 ? ` (${probe.tabs.omittedCount ?? 0} omitted)` : "";
80
+ const active = probe.activeTab;
81
+ const activeText = active
82
+ ? `; active ${active.index ?? "?"}: ${presentStrings([presentStrings([active.title, active.url]).join(" — "), active.tabId])[0] ?? "tab"}`
83
+ : "";
84
+ return `Tabs: ${probe.tabs.total} total${omitted}${activeText}`;
85
+ }
86
+ function formatProbeSnapshot(probe) {
87
+ const snapshot = probe.snapshot;
88
+ if (!snapshot) {
89
+ return [];
90
+ }
91
+ const omitted = (snapshot.omittedRefCount ?? 0) !== 0
92
+ ? ` (${snapshot.omittedRefCount ?? 0} ref id(s) omitted)`
93
+ : "";
94
+ const lines = [`Snapshot: ${snapshot.refCount} interactive ref(s)${omitted}.`];
95
+ if (snapshot.text !== undefined && snapshot.text.length > 0) {
96
+ lines.push(snapshot.text);
97
+ }
98
+ if ((snapshot.omittedLineCount ?? 0) !== 0) {
99
+ lines.push(`... ${snapshot.omittedLineCount ?? 0} snapshot line(s) omitted`);
100
+ }
101
+ return lines;
102
+ }
103
+ function formatElectronProbeVisibleText(options) {
104
+ const probe = options.probe;
105
+ const page = presentStrings([probe.title, probe.url]).join(" — ");
106
+ const lines = [
107
+ `Electron probe: ${page.length > 0 ? page : probe.sessionName}`,
108
+ formatElectronProbeContextText(options.probeContext),
109
+ ...presentStrings([
110
+ formatElectronProbeLaunchStatusText(options.status, probe),
111
+ options.mismatch ? formatElectronSessionMismatchText(options.mismatch) : undefined,
112
+ formatElectronProbeFocusedElement(probe.focusedElement),
113
+ formatProbeTabs(probe),
114
+ ]),
115
+ ...formatProbeSnapshot(probe),
116
+ ];
117
+ if (probe.status === "partial") {
118
+ lines.push("Some probe commands did not return data; use raw agent_browser commands for deeper diagnostics.");
119
+ }
120
+ if (probe.errors && probe.errors.length > 0) {
121
+ lines.push(`Probe warning: ${probe.errors.slice(0, 2).join("; ")}${probe.errors.length > 2 ? "; ..." : ""}`);
122
+ }
123
+ return lines.join("\n");
124
+ }
125
+ function probeNextActions(options) {
126
+ const base = options.record
127
+ ? (buildAgentBrowserNextActions({
128
+ electron: {
129
+ launchId: options.record.launchId,
130
+ sessionName: options.record.sessionName,
131
+ status: options.record.cleanupState,
132
+ },
133
+ resultCategory: "success",
134
+ successCategory: "completed",
135
+ }) ?? [])
136
+ : [];
137
+ const mismatch = options.mismatch && options.record
138
+ ? buildElectronMismatchNextActions(options.record, options.mismatch.liveTarget)
139
+ : [];
140
+ return options.mismatch
141
+ ? appendUniqueAgentBrowserNextActions([...mismatch], base)
142
+ : appendUniqueAgentBrowserNextActions([...base], mismatch);
143
+ }
144
+ export function buildElectronProbeResult(options) {
145
+ const probe = presentProbe(options.probe);
146
+ const { refSnapshot: _refSnapshot, ...boundedProbe } = probe;
147
+ const nextActions = probeNextActions(options);
148
+ const details = {
149
+ args: [],
150
+ compiledElectron: options.compiledElectron,
151
+ electron: {
152
+ action: "probe",
153
+ identifiers: options.record ? buildElectronIdentifiers(options.record) : undefined,
154
+ probe: boundedProbe,
155
+ probeContext: options.probeContext,
156
+ sessionMismatch: options.mismatch,
157
+ status: options.probe.status,
158
+ statusTargets: options.status?.targets,
159
+ launchStatus: options.status,
160
+ },
161
+ nextActions: nextActions.length > 0 ? nextActions : undefined,
162
+ ...buildAgentBrowserResultCategoryDetails({ args: [], succeeded: true }),
163
+ managedSessionHeadedAutosaveDisabled: options.headedManagedAutosaveDisabled === true ? true : undefined,
164
+ managedSessionHeadedAutosaveInterval: options.headedManagedAutosaveInterval,
165
+ namespace: options.namespace,
166
+ refSnapshot: options.probe.refSnapshot,
167
+ sessionName: options.probe.sessionName,
168
+ sessionTabTarget: options.sessionTabTarget,
169
+ summary: options.mismatch?.summary ?? options.probe.summary,
170
+ usedImplicitSession: options.probeContext.mode === "current-managed-session",
171
+ };
172
+ return {
173
+ content: [
174
+ {
175
+ type: "text",
176
+ text: redactSensitiveText(formatElectronProbeVisibleText({ ...options, probe })),
177
+ },
178
+ ],
179
+ details: redactToolDetails(details, []),
180
+ isError: false,
181
+ };
182
+ }
@@ -0,0 +1,161 @@
1
+ import { inspectElectronLaunchStatus } from "../../electron/cleanup.js";
2
+ import { getPageTargetValidationError } from "../../page-target-validation.js";
3
+ import { getAgentBrowserProcessEnvironment } from "../../process-environment.js";
4
+ import { normalizeProcessError } from "../../process-errors.js";
5
+ import { getSessionPageStateKey, normalizeSessionTabTarget, } from "../../session-page-state.js";
6
+ import { buildElectronHostFailureResult } from "../browser-run/final-result.js";
7
+ import { buildElectronSessionMismatch, findElectronLaunchRecordForSession, } from "../browser-run/session-state.js";
8
+ import { ElectronManagedSessionPolicyError, withOwnedElectronManagedSessionPolicy, } from "./policy.js";
9
+ import { collectElectronProbe } from "./probe-collection.js";
10
+ import { buildElectronProbeResult } from "./probe-presentation.js";
11
+ function resolveLaunchProbe(record, launchId) {
12
+ if (!record) {
13
+ return { error: `No wrapper-tracked Electron launch found for launchId ${launchId}.` };
14
+ }
15
+ if (record.sessionName === undefined || record.sessionName.length === 0) {
16
+ return {
17
+ error: `electron.probe launchId ${launchId} has no attached managed sessionName; reattach with connect or run electron.launch again.`,
18
+ };
19
+ }
20
+ return { record, namespace: record.namespace, sessionName: record.sessionName };
21
+ }
22
+ function resolveProbeIdentity(options, input) {
23
+ if (input.launchId !== undefined && input.launchId.length > 0) {
24
+ return resolveLaunchProbe(options.electronLaunchRecords.get(input.launchId), input.launchId);
25
+ }
26
+ const record = findElectronLaunchRecordForSession(options.managedSessionName, options.electronLaunchRecords, options.managedSessionNamespace);
27
+ if (!options.managedSessionActive) {
28
+ return {
29
+ error: "electron.probe requires an active attached session. Run electron.launch or connect to an Electron debug port first.",
30
+ };
31
+ }
32
+ if (options.managedSessionName.length === 0) {
33
+ return { error: "electron.probe could not resolve a managed session to inspect." };
34
+ }
35
+ return {
36
+ record,
37
+ namespace: options.managedSessionNamespace,
38
+ sessionName: options.managedSessionName,
39
+ };
40
+ }
41
+ function probeContext(identity, input, probe) {
42
+ const explicit = input.launchId !== undefined && input.launchId.length > 0;
43
+ let note;
44
+ if (!identity.record) {
45
+ note = "No wrapper-tracked Electron launch matched this current managed session.";
46
+ }
47
+ else if (!explicit &&
48
+ identity.record.sessionName !== undefined &&
49
+ identity.record.sessionName.length > 0 &&
50
+ identity.record.sessionName !== probe.sessionName) {
51
+ note = `single active Electron launch ${identity.record.launchId} uses wrapper session ${identity.record.sessionName}; pass electron.probe.launchId to inspect that launch session directly.`;
52
+ }
53
+ return {
54
+ launchId: identity.record?.launchId,
55
+ mode: explicit ? "launchId" : "current-managed-session",
56
+ note,
57
+ sessionName: probe.sessionName,
58
+ };
59
+ }
60
+ function probePageTarget(probe) {
61
+ const { title, url, activeTab, refSnapshot } = probe;
62
+ const snapshotTarget = refSnapshot?.target;
63
+ return normalizeSessionTabTarget({
64
+ title: title ?? activeTab?.title ?? snapshotTarget?.title,
65
+ url: url ?? activeTab?.url ?? snapshotTarget?.url,
66
+ });
67
+ }
68
+ function publishProbePageState(state, probe, namespace) {
69
+ const target = probePageTarget(probe);
70
+ const update = state.beginUpdate();
71
+ const key = getSessionPageStateKey(probe.sessionName, namespace) ?? probe.sessionName;
72
+ if (target) {
73
+ state.applyTabTarget({ sessionName: key, target, update });
74
+ }
75
+ if (probe.refSnapshot) {
76
+ state.applyRefSnapshot({
77
+ fallbackTarget: target,
78
+ sessionName: key,
79
+ snapshot: probe.refSnapshot,
80
+ update,
81
+ });
82
+ }
83
+ return target;
84
+ }
85
+ function resolveProbePolicy(options, identity, timeoutMs) {
86
+ const key = getSessionPageStateKey(identity.sessionName, identity.namespace) ?? identity.sessionName;
87
+ const pageState = options.sessionPageState.get(key);
88
+ const targetError = getPageTargetValidationError({
89
+ args: ["snapshot", "-i"],
90
+ currentPageUrl: pageState.tabTarget?.url,
91
+ pageUrlUnknown: pageState.tabTargetUnknown === true,
92
+ });
93
+ if (targetError !== undefined && targetError.length > 0) {
94
+ throw new ElectronManagedSessionPolicyError(targetError);
95
+ }
96
+ const owner = options.ownedManagedSessions.get(key);
97
+ return {
98
+ cwd: options.cwd,
99
+ namespace: identity.namespace,
100
+ sessionName: identity.sessionName,
101
+ signal: options.signal,
102
+ timeoutMs,
103
+ confirmActions: pageState.confirmActions ?? getAgentBrowserProcessEnvironment().AGENT_BROWSER_CONFIRM_ACTIONS,
104
+ electronLaunchRecord: identity.record,
105
+ headedManagedAutosaveDisabled: owner?.headedManagedAutosaveDisabled === true,
106
+ headedManagedAutosaveInterval: owner?.headedManagedAutosaveInterval,
107
+ restoreState: options.managedSessionRestoreState,
108
+ };
109
+ }
110
+ async function inspectProbeIdentity(options, identity, input, visibleInput) {
111
+ const status = identity.record ? await inspectElectronLaunchStatus(identity.record) : undefined;
112
+ const policy = resolveProbePolicy(options, identity, input.timeoutMs);
113
+ const probe = await withOwnedElectronManagedSessionPolicy({ ...policy, args: ["snapshot", "-i"] }, () => collectElectronProbe(policy));
114
+ const managedSession = {
115
+ sessionName: probe.sessionName,
116
+ title: probe.title ?? probe.activeTab?.title,
117
+ url: probe.url ?? probe.activeTab?.url,
118
+ };
119
+ const mismatch = identity.record && status
120
+ ? buildElectronSessionMismatch({
121
+ managedSession,
122
+ record: identity.record,
123
+ statusTargets: status.targets,
124
+ })
125
+ : undefined;
126
+ const context = probeContext(identity, input, probe);
127
+ const target = publishProbePageState(options.sessionPageState, probe, identity.namespace);
128
+ return buildElectronProbeResult({
129
+ compiledElectron: visibleInput,
130
+ headedManagedAutosaveDisabled: policy.headedManagedAutosaveDisabled,
131
+ headedManagedAutosaveInterval: policy.headedManagedAutosaveInterval,
132
+ mismatch,
133
+ namespace: identity.namespace,
134
+ probe,
135
+ probeContext: context,
136
+ record: identity.record,
137
+ sessionTabTarget: target,
138
+ status,
139
+ });
140
+ }
141
+ export async function probeElectronHost(options, compiledElectron, visibleInput) {
142
+ const identity = resolveProbeIdentity(options, compiledElectron);
143
+ if ("error" in identity) {
144
+ return buildElectronHostFailureResult({
145
+ compiledElectron: visibleInput,
146
+ errorText: identity.error,
147
+ failureCategory: "validation-error",
148
+ });
149
+ }
150
+ try {
151
+ return await inspectProbeIdentity(options, identity, compiledElectron, visibleInput);
152
+ }
153
+ catch (error) {
154
+ const errorText = normalizeProcessError(error).message;
155
+ return buildElectronHostFailureResult({
156
+ compiledElectron: visibleInput,
157
+ errorText: `Electron probe failed: ${errorText}`,
158
+ failureCategory: error instanceof ElectronManagedSessionPolicyError ? "validation-error" : "upstream-error",
159
+ });
160
+ }
161
+ }