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,94 +1,147 @@
1
- import { rm } from "node:fs/promises";
2
1
  import { getAgentBrowserSessionIdentityKey } from "../../argv-grammar.js";
3
2
  import { inspectElectronLaunchStatus } from "../../electron/cleanup.js";
4
- import { acquireManagedSessionPolicyLock } from "../../managed-session-policy-lock.js";
5
- import { pruneOwnedManagedSessionRestoreSnapshots, resolveExplicitAutosaveInterval, withOwnedManagedSessionContext, } from "../../managed-session-restore.js";
6
- import { isManagedSessionRestoreKey } from "../../managed-session-storage.js";
3
+ import { acquireManagedSessionPolicyLock, } from "../../managed-session-policy-lock.js";
4
+ import { withOwnedManagedSessionContext, } from "../../managed-session-restore.js";
7
5
  import { isRecord } from "../../parsing.js";
8
- import { readProcessStartIdentity } from "../../process-identity.js";
9
- import { getAgentBrowserProcessEnvironment, withAgentBrowserProcessEnvironment } from "../../process-environment.js";
10
- import { runAgentBrowserProcess, withAttachedBrowserSessionContext } from "../../process.js";
11
- import { getAgentBrowserErrorText, parseAgentBrowserEnvelope } from "../../results/envelope.js";
12
- import { detectConfirmationRequired } from "../../results/confirmation.js";
13
- import { redactInvocationArgs } from "../../runtime.js";
6
+ import { withAttachedBrowserSessionContext } from "../../process.js";
14
7
  import { runSessionCommandData } from "./session-state.js";
15
- const MANAGED_SESSION_DAEMON_INSPECTION_TIMEOUT_MS = 35_000;
16
- const RUNNING_HEADED_AUTOSAVE_POLICY_CHANGE_ERROR = "AGENT_BROWSER_AUTOSAVE_INTERVAL_MS cannot change a running wrapper-owned headed session's launch-time periodic autosave interval. Close that session first, then retry with sessionMode: \"fresh\" so the new daemon starts with the requested interval.";
17
- export function getRunningHeadedAutosavePolicyChangeError(recordedInterval, closeCommand = false) {
18
- const explicitInterval = resolveExplicitAutosaveInterval(getAgentBrowserProcessEnvironment().AGENT_BROWSER_AUTOSAVE_INTERVAL_MS);
19
- return recordedInterval !== undefined && !closeCommand && explicitInterval !== undefined && explicitInterval !== recordedInterval
20
- ? RUNNING_HEADED_AUTOSAVE_POLICY_CHANGE_ERROR
21
- : undefined;
8
+ import { getHeadedManagedAutosaveEnv, inspectManagedSessionDaemon, } from "./managed-session-daemon-inspection.js";
9
+ export { closeManagedSession } from "./managed-session-close.js";
10
+ export { getRunningHeadedAutosavePolicyChangeError, inspectManagedSessionDaemon, } from "./managed-session-daemon-inspection.js";
11
+ function hasElectronAttachmentIdentity(record) {
12
+ return (record.webSocketDebuggerUrl !== undefined &&
13
+ record.webSocketDebuggerUrl !== "" &&
14
+ record.sessionName !== undefined &&
15
+ record.sessionName !== "");
22
16
  }
23
- function getHeadedManagedAutosaveEnv(interval) {
24
- return interval !== undefined ? { AGENT_BROWSER_AUTOSAVE_INTERVAL_MS: interval } : undefined;
25
- }
26
- export async function inspectManagedSessionDaemon(options) {
27
- const processResult = await runAgentBrowserProcess({
28
- args: ["--json", "--namespace", options.namespace ?? "", "--session", options.sessionName, "session", "info"],
29
- cwd: options.cwd,
30
- env: getHeadedManagedAutosaveEnv(options.headedManagedAutosaveInterval),
31
- preserveAttachedBrowserSession: options.preserveAttachedBrowserSession,
32
- signal: options.signal,
33
- timeoutMs: options.timeoutMs ?? MANAGED_SESSION_DAEMON_INSPECTION_TIMEOUT_MS,
34
- });
35
- try {
36
- if (processResult.spawnError?.code === "ENOENT")
37
- return { status: "missing-binary" };
38
- if (processResult.aborted || processResult.spawnError || processResult.exitCode !== 0)
39
- return { status: "unknown" };
40
- const parsed = await parseAgentBrowserEnvelope({ stdout: processResult.stdout, stdoutPath: processResult.stdoutSpillPath });
41
- const data = parsed.parseError || parsed.envelope?.success === false ? undefined : parsed.envelope?.data;
42
- if (!isRecord(data) || typeof data.active !== "boolean")
43
- return { status: "unknown" };
44
- if (!data.active)
45
- return { status: "inactive" };
46
- if (!isRecord(data.runtime))
47
- return { status: "unknown" };
48
- let generation;
49
- if (options.includeGeneration && Number.isSafeInteger(data.runtime.backgroundPid) && Number(data.runtime.backgroundPid) > 0
50
- && typeof data.runtime.socketDir === "string" && data.runtime.browserLaunched !== false) {
51
- const start = await readProcessStartIdentity(Number(data.runtime.backgroundPid), process.platform, { signal: options.signal, deadline: Date.now() + (options.timeoutMs ?? 5_000) });
52
- if (start)
53
- generation = JSON.stringify({ pid: data.runtime.backgroundPid, start, socketDir: data.runtime.socketDir });
54
- }
55
- if (typeof data.runtime.restoreKey === "string" && data.runtime.restoreKey.length > 0)
56
- return { restoreKey: data.runtime.restoreKey, status: "active", generation };
57
- return data.runtime.restoreKey === null ? { restoreKey: null, status: "active", generation } : { status: "unknown" };
17
+ function restoredAttachmentTarget(context, record) {
18
+ const cwd = context.cwd;
19
+ if (cwd === undefined || cwd === "" || !record || !hasElectronAttachmentIdentity(record)) {
20
+ return undefined;
58
21
  }
59
- finally {
60
- if (processResult.stdoutSpillPath)
61
- await rm(processResult.stdoutSpillPath, { force: true }).catch(() => undefined);
22
+ if (record.cleanupState === "cleaned" ||
23
+ getAgentBrowserSessionIdentityKey(record.sessionName ?? "", record.namespace) !==
24
+ getAgentBrowserSessionIdentityKey(context.sessionName, context.namespace)) {
25
+ return undefined;
62
26
  }
27
+ return { cwd, record };
63
28
  }
64
- async function verifyRestoredElectronAttachment(context, record, signal, timeoutMs) {
65
- const cwd = context.cwd;
66
- if (!cwd || !record?.webSocketDebuggerUrl || !record.sessionName || record.cleanupState === "cleaned"
67
- || getAgentBrowserSessionIdentityKey(record.sessionName, record.namespace) !== getAgentBrowserSessionIdentityKey(context.sessionName, context.namespace))
29
+ function attachmentStatusMatches(record, status) {
30
+ return (status.pidAlive === true &&
31
+ status.userDataDirState === "present" &&
32
+ status.version?.webSocketDebuggerUrl === record.webSocketDebuggerUrl);
33
+ }
34
+ function attachmentConnectionMatches(connection, record, status) {
35
+ return (isRecord(connection) &&
36
+ typeof connection.cdpUrl === "string" &&
37
+ (connection.cdpUrl === record.webSocketDebuggerUrl ||
38
+ status.targets.some((target) => target.webSocketDebuggerUrl === connection.cdpUrl)));
39
+ }
40
+ async function verifyRestoredElectronAttachment(options) {
41
+ const { context, signal } = options;
42
+ const attachment = restoredAttachmentTarget(context, options.electronLaunchRecord);
43
+ if (!attachment) {
68
44
  return false;
69
- const status = await inspectElectronLaunchStatus(record, signal);
70
- if (signal?.aborted || status.pidAlive !== true || status.userDataDirState !== "present"
71
- || status.version?.webSocketDebuggerUrl !== record.webSocketDebuggerUrl)
45
+ }
46
+ const status = await inspectElectronLaunchStatus(attachment.record, signal);
47
+ if (signal?.aborted === true || !attachmentStatusMatches(attachment.record, status)) {
72
48
  return false;
49
+ }
73
50
  // This metadata probe must not grant daemon provenance just by spawning.
74
51
  const connection = await withAttachedBrowserSessionContext(true, () => withOwnedManagedSessionContext(undefined, () => runSessionCommandData({
75
- args: ["get", "cdp-url"], cwd, env: getHeadedManagedAutosaveEnv(context.headedManagedAutosaveInterval), namespace: context.namespace, pinNamespace: true,
76
- sessionName: context.sessionName, signal, timeoutMs,
52
+ args: ["get", "cdp-url"],
53
+ cwd: attachment.cwd,
54
+ env: getHeadedManagedAutosaveEnv(context.headedManagedAutosaveInterval),
55
+ namespace: context.namespace,
56
+ pinNamespace: true,
57
+ sessionName: context.sessionName,
58
+ signal,
59
+ timeoutMs: options.electronVerificationTimeoutMs,
77
60
  })));
78
- return !signal?.aborted && isRecord(connection) && typeof connection.cdpUrl === "string"
79
- && (connection.cdpUrl === record.webSocketDebuggerUrl || status.targets.some((target) => target.webSocketDebuggerUrl === connection.cdpUrl));
61
+ return (
62
+ // The abort callback can change this signal during the awaited CDP read; static narrowing does not model it.
63
+ // oxlint-disable-next-line typescript/no-unnecessary-condition
64
+ !(signal?.aborted ?? false) &&
65
+ attachmentConnectionMatches(connection, attachment.record, status));
66
+ }
67
+ function reconcileDaemonReceipt(context, daemon, receipt) {
68
+ if (daemon.status === "inactive") {
69
+ context.restoreState.forgetDaemonRestoreKey(context.sessionName, context.namespace);
70
+ }
71
+ if (daemon.status !== "active" ||
72
+ receipt === undefined ||
73
+ context.restoreState.hasDaemonRestoreKey(context.sessionName, context.namespace)) {
74
+ return;
75
+ }
76
+ if (daemon.generation === receipt.generation && daemon.restoreKey === receipt.restoreKey) {
77
+ context.restoreState.recordDaemonRestoreKey(context.sessionName, context.namespace, daemon.restoreKey, daemon.generation);
78
+ }
79
+ else {
80
+ context.restoreState.forgetDaemonRestoreKey(context.sessionName, context.namespace);
81
+ }
82
+ }
83
+ function daemonPolicyMismatch(daemon, restoreDisabledPolicyNeedsProvenance, hasKnownDaemonRestoreKey) {
84
+ return {
85
+ cleanupOnlyReason: daemon.status === "active" &&
86
+ restoreDisabledPolicyNeedsProvenance &&
87
+ !hasKnownDaemonRestoreKey
88
+ ? "restore-disabled-daemon-without-provenance"
89
+ : undefined,
90
+ daemonStatus: daemon.status,
91
+ error: [
92
+ "This wrapper-owned session's live daemon does not match the requested managed-restore policy.",
93
+ 'Close that session first, retry with sessionMode: "fresh", or use a distinct explicit --session.',
94
+ ].join(" "),
95
+ };
96
+ }
97
+ async function validateReusableDaemonPolicy(options, daemon) {
98
+ const { context } = options;
99
+ const stickyDisabled = context.restoreState.isDisabled(context.sessionName, context.namespace);
100
+ let hasKnownDaemonRestoreKey = context.restoreState.hasDaemonRestoreKey(context.sessionName, context.namespace);
101
+ const knownDaemonRestoreKey = context.restoreState.getDaemonRestoreKey(context.sessionName, context.namespace);
102
+ const requestedDaemonRestoreKey = context.restoreDecision === "enabled" && stickyDisabled
103
+ ? (knownDaemonRestoreKey ?? null)
104
+ : context.expectedDaemonRestoreKey;
105
+ if (daemon.status === "unknown") {
106
+ return {
107
+ error: 'The wrapper could not verify this managed session\'s live daemon restore policy. Retry, close that session, or use sessionMode: "fresh".',
108
+ };
109
+ }
110
+ const restoreDisabledPolicyNeedsProvenance = stickyDisabled || context.restoreDecision !== "enabled";
111
+ if (daemon.status === "active" &&
112
+ restoreDisabledPolicyNeedsProvenance &&
113
+ !hasKnownDaemonRestoreKey &&
114
+ daemon.restoreKey === requestedDaemonRestoreKey) {
115
+ hasKnownDaemonRestoreKey = await verifyRestoredElectronAttachment(options);
116
+ }
117
+ return finishReusableDaemonPolicy(context, daemon, {
118
+ restoreDisabledPolicyNeedsProvenance,
119
+ requestedDaemonRestoreKey,
120
+ }, hasKnownDaemonRestoreKey);
121
+ }
122
+ function finishReusableDaemonPolicy(context, daemon, policy, hasKnownDaemonRestoreKey) {
123
+ const activePolicyMatches = daemon.status === "active" &&
124
+ (!policy.restoreDisabledPolicyNeedsProvenance || hasKnownDaemonRestoreKey) &&
125
+ daemon.restoreKey === policy.requestedDaemonRestoreKey;
126
+ if (activePolicyMatches) {
127
+ context.restoreState.recordDaemonRestoreKey(context.sessionName, context.namespace, daemon.restoreKey);
128
+ }
129
+ return !["inactive", "missing-binary"].includes(daemon.status) && !activePolicyMatches
130
+ ? daemonPolicyMismatch(daemon, policy.restoreDisabledPolicyNeedsProvenance, hasKnownDaemonRestoreKey)
131
+ : { daemonStatus: daemon.status };
80
132
  }
81
133
  export async function acquireOwnedManagedSessionDaemonPolicy(options) {
82
134
  const { context, signal } = options;
83
- if (!context.cwd)
135
+ if (context.cwd === undefined || context.cwd === "") {
84
136
  return { error: "Managed-session policy validation requires the wrapper-owned session cwd." };
137
+ }
85
138
  const lock = await acquireManagedSessionPolicyLock({
86
139
  namespace: context.namespace,
87
140
  sessionName: context.sessionName,
88
141
  signal,
89
142
  });
90
143
  if (!lock) {
91
- return signal?.aborted
144
+ return signal?.aborted === true
92
145
  ? {}
93
146
  : {
94
147
  error: "Managed-session policy coordination is unavailable or busy. Retry after the current operation finishes, repair the private policy-lock directory, and on POSIX verify that /bin/ps, /usr/bin/ps, or ps through PATH is available.",
@@ -98,155 +151,24 @@ export async function acquireOwnedManagedSessionDaemonPolicy(options) {
98
151
  const receipt = context.restoreState.getDaemonReceipt(context.sessionName, context.namespace);
99
152
  const daemon = await inspectManagedSessionDaemon({
100
153
  cwd: context.cwd,
101
- includeGeneration: receipt !== undefined && !context.restoreState.hasDaemonRestoreKey(context.sessionName, context.namespace),
154
+ includeGeneration: receipt !== undefined &&
155
+ !context.restoreState.hasDaemonRestoreKey(context.sessionName, context.namespace),
102
156
  headedManagedAutosaveInterval: context.headedManagedAutosaveInterval,
103
157
  namespace: context.namespace,
104
158
  sessionName: context.sessionName,
105
159
  signal,
106
160
  });
107
- if (daemon.status === "inactive")
108
- context.restoreState.forgetDaemonRestoreKey(context.sessionName, context.namespace);
109
- if (daemon.status === "active" && receipt && !context.restoreState.hasDaemonRestoreKey(context.sessionName, context.namespace)) {
110
- if (daemon.generation === receipt.generation && daemon.restoreKey === receipt.restoreKey) {
111
- context.restoreState.recordDaemonRestoreKey(context.sessionName, context.namespace, daemon.restoreKey, daemon.generation);
112
- }
113
- else
114
- context.restoreState.forgetDaemonRestoreKey(context.sessionName, context.namespace);
115
- }
161
+ reconcileDaemonReceipt(context, daemon, receipt);
116
162
  if (options.mode === "close") {
117
- if (daemon.status === "active")
163
+ if (daemon.status === "active") {
118
164
  context.restoreState.recordDaemonRestoreKey(context.sessionName, context.namespace, daemon.restoreKey);
165
+ }
119
166
  return { daemonStatus: daemon.status, lock };
120
167
  }
121
- const stickyDisabled = context.restoreState.isDisabled(context.sessionName, context.namespace);
122
- let hasKnownDaemonRestoreKey = context.restoreState.hasDaemonRestoreKey(context.sessionName, context.namespace);
123
- const knownDaemonRestoreKey = context.restoreState.getDaemonRestoreKey(context.sessionName, context.namespace);
124
- const requestedDaemonRestoreKey = context.restoreDecision === "enabled" && stickyDisabled
125
- ? knownDaemonRestoreKey ?? null
126
- : context.expectedDaemonRestoreKey;
127
- if (daemon.status === "unknown") {
128
- return {
129
- error: "The wrapper could not verify this managed session's live daemon restore policy. Retry, close that session, or use sessionMode: \"fresh\".",
130
- lock,
131
- };
132
- }
133
- const restoreDisabledPolicyNeedsProvenance = stickyDisabled || context.restoreDecision !== "enabled";
134
- if (daemon.status === "active" && restoreDisabledPolicyNeedsProvenance && !hasKnownDaemonRestoreKey && daemon.restoreKey === requestedDaemonRestoreKey) {
135
- hasKnownDaemonRestoreKey = await verifyRestoredElectronAttachment(context, options.electronLaunchRecord, signal, options.electronVerificationTimeoutMs);
136
- }
137
- const activePolicyMatches = daemon.status === "active"
138
- && (!restoreDisabledPolicyNeedsProvenance || hasKnownDaemonRestoreKey)
139
- && daemon.restoreKey === requestedDaemonRestoreKey;
140
- if (activePolicyMatches)
141
- context.restoreState.recordDaemonRestoreKey(context.sessionName, context.namespace, daemon.restoreKey);
142
- return !["inactive", "missing-binary"].includes(daemon.status) && !activePolicyMatches
143
- ? {
144
- cleanupOnlyReason: daemon.status === "active" && restoreDisabledPolicyNeedsProvenance && !hasKnownDaemonRestoreKey
145
- ? "restore-disabled-daemon-without-provenance"
146
- : undefined,
147
- daemonStatus: daemon.status,
148
- error: [
149
- "This wrapper-owned session's live daemon does not match the requested managed-restore policy.",
150
- "Close that session first, retry with sessionMode: \"fresh\", or use a distinct explicit --session.",
151
- ].join(" "),
152
- lock,
153
- }
154
- : { daemonStatus: daemon.status, lock };
168
+ return { ...(await validateReusableDaemonPolicy(options, daemon)), lock };
155
169
  }
156
170
  catch (error) {
157
171
  await lock.release();
158
172
  throw error;
159
173
  }
160
174
  }
161
- export async function closeManagedSession(options) {
162
- return withAgentBrowserProcessEnvironment({ AGENT_BROWSER_CONFIRM_ACTIONS: options.confirmActions, ...(options.socketDir ? { PI_AGENT_BROWSER_SOCKET_DIR: options.socketDir } : {}) }, async () => {
163
- const controller = new AbortController();
164
- let phase = "policy coordination";
165
- let phaseStartedAt = Date.now();
166
- let timeoutError;
167
- const timer = setTimeout(() => {
168
- timeoutError = `Managed-session cleanup timed out after ${options.timeoutMs} ms during ${phase} (${Date.now() - phaseStartedAt} ms in this phase).`;
169
- controller.abort();
170
- }, options.timeoutMs);
171
- let stdoutSpillPath;
172
- const closeArgs = [...(options.namespace !== undefined ? ["--namespace", options.namespace] : []), "--session", options.sessionName, "close"];
173
- const policyLock = options.policyLock ?? await acquireManagedSessionPolicyLock({
174
- namespace: options.namespace,
175
- sessionName: options.sessionName,
176
- signal: controller.signal,
177
- timeoutMs: Math.min(options.timeoutMs, 1_000),
178
- });
179
- if (!policyLock) {
180
- clearTimeout(timer);
181
- return timeoutError ?? "Managed-session policy coordination is unavailable or busy; cleanup did not run. Retry after the current operation finishes or repair the private policy-lock directory.";
182
- }
183
- try {
184
- phase = "daemon inspection";
185
- phaseStartedAt = Date.now();
186
- const daemon = await inspectManagedSessionDaemon({
187
- cwd: options.cwd,
188
- headedManagedAutosaveInterval: options.headedManagedAutosaveInterval,
189
- namespace: options.namespace,
190
- preserveAttachedBrowserSession: options.preserveAttachedBrowserSession,
191
- sessionName: options.sessionName,
192
- signal: controller.signal,
193
- timeoutMs: Math.min(options.timeoutMs, 2_000),
194
- });
195
- if (daemon.status === "active")
196
- options.restoreState.recordDaemonRestoreKey(options.sessionName, options.namespace, daemon.restoreKey);
197
- const daemonRestoreKey = options.restoreState.getDaemonRestoreKey(options.sessionName, options.namespace);
198
- const ownedRestoreKey = !options.restoreState.isDisabled(options.sessionName, options.namespace)
199
- && isManagedSessionRestoreKey(daemonRestoreKey) ? daemonRestoreKey : null;
200
- phase = "native close";
201
- phaseStartedAt = Date.now();
202
- const processResult = await runAgentBrowserProcess({
203
- args: closeArgs,
204
- cwd: options.cwd,
205
- env: { AGENT_BROWSER_JSON: "1", ...getHeadedManagedAutosaveEnv(options.headedManagedAutosaveInterval) },
206
- managedSessionRestoreState: options.restoreState,
207
- ownedManagedSession: true,
208
- preserveAttachedBrowserSession: options.preserveAttachedBrowserSession,
209
- signal: controller.signal,
210
- });
211
- clearTimeout(timer);
212
- stdoutSpillPath = processResult.stdoutSpillPath;
213
- const parsed = await parseAgentBrowserEnvelope({ stdout: processResult.stdout, stdoutPath: processResult.stdoutSpillPath });
214
- if (!processResult.aborted && !processResult.spawnError && processResult.exitCode === 0) {
215
- const data = parsed.envelope?.success === true && isRecord(parsed.envelope.data) && parsed.envelope.data.closed === true ? parsed.envelope.data : undefined;
216
- if (data) {
217
- options.restoreState.clear(options.sessionName, options.namespace);
218
- pruneOwnedManagedSessionRestoreSnapshots({
219
- cwd: options.cwd,
220
- namespace: options.namespace,
221
- restoreKey: ownedRestoreKey,
222
- statePath: typeof data.statePath === "string" ? data.statePath : undefined,
223
- });
224
- }
225
- }
226
- const pending = detectConfirmationRequired(parsed.envelope?.data);
227
- return timeoutError ?? (pending ? `Native close requires confirmation (${pending.id}); the session remains wrapper-owned.` : getAgentBrowserErrorText({
228
- aborted: processResult.aborted,
229
- command: "close",
230
- effectiveArgs: redactInvocationArgs(closeArgs),
231
- envelope: parsed.envelope,
232
- exitCode: processResult.exitCode,
233
- parseError: parsed.parseError,
234
- plainTextInspection: false,
235
- spawnError: processResult.spawnError,
236
- stderr: processResult.stderr,
237
- timedOut: processResult.timedOut,
238
- timeoutMs: processResult.timeoutMs,
239
- }));
240
- }
241
- catch (error) {
242
- return timeoutError ?? (error instanceof Error ? error.message : String(error));
243
- }
244
- finally {
245
- clearTimeout(timer);
246
- if (stdoutSpillPath)
247
- await rm(stdoutSpillPath, { force: true }).catch(() => undefined);
248
- if (!options.policyLock)
249
- await policyLock.release();
250
- }
251
- });
252
- }
@@ -0,0 +1,65 @@
1
+ import { getAgentBrowserSessionIdentityKey, resolveAgentBrowserNamespace, } from "../../argv-grammar.js";
2
+ import { parseArgvDescriptor } from "../../argv-descriptor.js";
3
+ import { isBrowserIndependentRead, needsManagedSession } from "../../command-policy.js";
4
+ import { getAgentBrowserProcessEnvironment } from "../../process-environment.js";
5
+ import { nextReadConfirmation, parseReadConfirmation } from "../../read-confirmation.js";
6
+ import { nativePolicyDefinitelyUnestablished, } from "./session-state.js";
7
+ function helperNamespace(helper) {
8
+ return resolveAgentBrowserNamespace([], helper.namespace ?? getAgentBrowserProcessEnvironment().AGENT_BROWSER_NAMESPACE);
9
+ }
10
+ function helperMayRun(helper, effects) {
11
+ const pending = parseReadConfirmation(effects?.readConfirmation);
12
+ return ((!needsManagedSession(parseArgvDescriptor(helper.args), helper.stdin) &&
13
+ !isBrowserIndependentRead(helper.args, helper.stdin)) ||
14
+ pending?.state !== "pending" ||
15
+ getAgentBrowserSessionIdentityKey(helper.sessionName ?? "default", helperNamespace(helper)) !==
16
+ getAgentBrowserSessionIdentityKey(pending.sessionName, pending.namespace));
17
+ }
18
+ function helperSucceeded(observation) {
19
+ return (observation.envelope?.success === true &&
20
+ observation.processResult.exitCode === 0 &&
21
+ !observation.processResult.aborted &&
22
+ !observation.processResult.timedOut);
23
+ }
24
+ function markPendingOpenTargetUnknown(state, update, key) {
25
+ const invalidation = state.sessionPageState.get(key).refSnapshotInvalidation;
26
+ state.sessionPageState.markTabTargetUnknown({ sessionName: key, update });
27
+ if (invalidation) {
28
+ state.sessionPageState.applyRefSnapshotInvalidation({ sessionName: key, update, invalidation });
29
+ }
30
+ }
31
+ function applyHelperConfirmation(state, update, observation) {
32
+ const { helper, envelope, processResult } = observation;
33
+ const namespace = helperNamespace(helper);
34
+ const sessionName = helper.sessionName ?? "default";
35
+ const key = getAgentBrowserSessionIdentityKey(sessionName, namespace);
36
+ if (key === state.confirmationPolicyIdentity &&
37
+ !nativePolicyDefinitelyUnestablished(processResult, envelope, helper.args)) {
38
+ state.confirmationPolicyMayBeEstablished = true;
39
+ }
40
+ const confirmation = nextReadConfirmation({
41
+ commandTokens: helper.args,
42
+ current: state.sessionPageState.getReadConfirmation(key),
43
+ data: envelope?.data,
44
+ namespace,
45
+ sessionName,
46
+ succeeded: helperSucceeded(observation),
47
+ });
48
+ if (!confirmation) {
49
+ return;
50
+ }
51
+ state.sessionPageState.applyReadConfirmation(confirmation, update);
52
+ if (helper.args[0] === "open" && confirmation.state === "pending") {
53
+ markPendingOpenTargetUnknown(state, update, key);
54
+ }
55
+ state.observedBrowserEffects = {
56
+ ...state.observedBrowserEffects,
57
+ readConfirmation: confirmation,
58
+ };
59
+ }
60
+ export function createNativeHelperObserver(state, update) {
61
+ return {
62
+ allow: (helper) => helperMayRun(helper, state.observedBrowserEffects),
63
+ observe: (helper, processResult, envelope) => applyHelperConfirmation(state, update, { helper, processResult, envelope }),
64
+ };
65
+ }
@@ -0,0 +1,120 @@
1
+ import { isRecord } from "../../parsing.js";
2
+ import { buildInspectOverlayStateAction, withOptionalSessionArgs, } from "../../results/next-actions.js";
3
+ import { extractRefSnapshotFromData, normalizeComparableUrl, } from "../../session-page-state.js";
4
+ import { rawStringField } from "./diagnostic-values.js";
5
+ import { runSessionCommandData } from "./session-state.js";
6
+ const OVERLAY_CLOSE_NAME_PATTERN = /(?:\b(?:close|dismiss|no thanks|not now|maybe later|hide|skip|continue without|x)\b|^\s*×\s*$)/i;
7
+ const OVERLAY_CONTEXT_ROLES = new Set(["alertdialog", "dialog"]);
8
+ const OVERLAY_ACTION_ROLES = new Set(["button", "link", "menuitem"]);
9
+ const OVERLAY_BLOCKER_CANDIDATE_LIMIT = 3;
10
+ function overlayBlockerCandidate(ref, entry) {
11
+ if (!/^e\d+$/.test(ref) || !isRecord(entry)) {
12
+ return undefined;
13
+ }
14
+ const role = rawStringField(entry, "role");
15
+ const name = rawStringField(entry, "name");
16
+ if (role === undefined ||
17
+ role === "" ||
18
+ !OVERLAY_ACTION_ROLES.has(role.toLowerCase()) ||
19
+ name === undefined ||
20
+ name === "" ||
21
+ !OVERLAY_CLOSE_NAME_PATTERN.test(name)) {
22
+ return undefined;
23
+ }
24
+ return {
25
+ args: ["click", `@${ref}`],
26
+ name,
27
+ reason: `Visible ${role} ${JSON.stringify(name)} appears in a snapshot that also contains overlay/banner/dialog context.`,
28
+ ref: `@${ref}`,
29
+ role,
30
+ };
31
+ }
32
+ function getOverlayBlockerCandidates(snapshotData) {
33
+ const refs = isRecord(snapshotData) && isRecord(snapshotData.refs) ? snapshotData.refs : undefined;
34
+ if (!refs ||
35
+ !Object.values(refs).some((entry) => isRecord(entry) &&
36
+ OVERLAY_CONTEXT_ROLES.has((rawStringField(entry, "role") ?? "").toLowerCase()))) {
37
+ return [];
38
+ }
39
+ const candidates = [];
40
+ for (const [ref, entry] of Object.entries(refs)) {
41
+ const candidate = overlayBlockerCandidate(ref, entry);
42
+ if (candidate) {
43
+ candidates.push(candidate);
44
+ }
45
+ if (candidates.length >= OVERLAY_BLOCKER_CANDIDATE_LIMIT) {
46
+ break;
47
+ }
48
+ }
49
+ return candidates;
50
+ }
51
+ export function formatOverlayBlockerText(diagnostic) {
52
+ return [
53
+ "Possible overlay blockers:",
54
+ ...diagnostic.candidates.map((candidate) => {
55
+ const role = candidate.role !== undefined && candidate.role !== "" ? ` ${candidate.role}` : "";
56
+ const name = candidate.name !== undefined && candidate.name !== ""
57
+ ? ` ${JSON.stringify(candidate.name)}`
58
+ : "";
59
+ return `- ${candidate.ref}${role}${name}: ${candidate.reason}`;
60
+ }),
61
+ ].join("\n");
62
+ }
63
+ export function buildOverlayBlockerNextActions(options) {
64
+ return [
65
+ buildInspectOverlayStateAction(options.sessionName),
66
+ ...options.diagnostic.candidates.map((candidate, index) => ({
67
+ id: `try-overlay-blocker-candidate-${index + 1}`,
68
+ params: { args: withOptionalSessionArgs(options.sessionName, candidate.args) },
69
+ reason: candidate.reason,
70
+ safety: "Only click this if the candidate is clearly a close/dismiss control for an overlay that blocks the intended workflow.",
71
+ tool: "agent_browser",
72
+ })),
73
+ ];
74
+ }
75
+ export function collectSnapshotOverlayBlockerDiagnostic(data) {
76
+ const candidates = getOverlayBlockerCandidates(data);
77
+ const snapshot = extractRefSnapshotFromData(data);
78
+ return candidates.length === 0 || !snapshot
79
+ ? undefined
80
+ : {
81
+ candidates,
82
+ snapshot,
83
+ summary: "Snapshot contains dialog/modal context plus likely close or dismiss controls; treat covered controls as potentially obstructed until the overlay state is resolved.",
84
+ };
85
+ }
86
+ function isSnapshotRefClick(data) {
87
+ return (isRecord(data) &&
88
+ typeof data.clicked === "string" &&
89
+ (data.clicked.startsWith("@") || data.clicked.startsWith("ref=")));
90
+ }
91
+ function stationaryRefClickUrl(options) {
92
+ if (options.command !== "click" || !isSnapshotRefClick(options.data)) {
93
+ return undefined;
94
+ }
95
+ const priorUrl = normalizeComparableUrl(options.priorTarget?.url);
96
+ const currentUrl = normalizeComparableUrl(options.navigationSummary?.url);
97
+ return currentUrl !== undefined && currentUrl !== "" && currentUrl === priorUrl
98
+ ? currentUrl
99
+ : undefined;
100
+ }
101
+ export async function collectOverlayBlockerDiagnostic(options) {
102
+ const currentUrl = stationaryRefClickUrl(options);
103
+ if (currentUrl === undefined) {
104
+ return undefined;
105
+ }
106
+ const snapshotData = await runSessionCommandData({
107
+ args: ["snapshot", "-i"],
108
+ cwd: options.cwd,
109
+ namespace: options.namespace,
110
+ sessionName: options.sessionName,
111
+ signal: options.signal,
112
+ });
113
+ const diagnostic = collectSnapshotOverlayBlockerDiagnostic(snapshotData);
114
+ return diagnostic
115
+ ? {
116
+ ...diagnostic,
117
+ summary: `Click completed but the page stayed on ${currentUrl}; a fresh snapshot contains likely overlay close/dismiss controls.`,
118
+ }
119
+ : undefined;
120
+ }