pi-agent-browser-native 0.9.3 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/CHANGELOG.md +77 -5
  2. package/README.md +103 -81
  3. package/dist/extensions/agent-browser/index.js +43057 -2031
  4. package/dist/extensions/agent-browser/lib/argv-descriptor.js +49 -26
  5. package/dist/extensions/agent-browser/lib/argv-grammar.js +82 -93
  6. package/dist/extensions/agent-browser/lib/bash-guard.js +129 -126
  7. package/dist/extensions/agent-browser/lib/batch-lifecycle.js +112 -51
  8. package/dist/extensions/agent-browser/lib/browser-execution-claim-codec.js +61 -0
  9. package/dist/extensions/agent-browser/lib/browser-execution-claim-storage.js +232 -0
  10. package/dist/extensions/agent-browser/lib/browser-execution-claims.js +202 -0
  11. package/dist/extensions/agent-browser/lib/browser-execution-identity.js +77 -0
  12. package/dist/extensions/agent-browser/lib/browser-journal-branch.js +98 -0
  13. package/dist/extensions/agent-browser/lib/browser-journal-contracts.js +1 -0
  14. package/dist/extensions/agent-browser/lib/browser-journal-projection.js +221 -0
  15. package/dist/extensions/agent-browser/lib/browser-journal-reader.js +89 -0
  16. package/dist/extensions/agent-browser/lib/browser-journal-replay.js +246 -0
  17. package/dist/extensions/agent-browser/lib/browser-journal.js +103 -394
  18. package/dist/extensions/agent-browser/lib/browser-legacy-pages.js +220 -0
  19. package/dist/extensions/agent-browser/lib/browser-legacy-projection.js +282 -0
  20. package/dist/extensions/agent-browser/lib/browser-legacy-types.js +1 -0
  21. package/dist/extensions/agent-browser/lib/browser-session-conversion-stream.js +217 -0
  22. package/dist/extensions/agent-browser/lib/browser-session-conversion.js +80 -335
  23. package/dist/extensions/agent-browser/lib/browser-transcript-contracts.js +35 -0
  24. package/dist/extensions/agent-browser/lib/browser-transcript-validation.js +166 -0
  25. package/dist/extensions/agent-browser/lib/browser-transcript.js +137 -82
  26. package/dist/extensions/agent-browser/lib/browser-value-parsing.js +15 -0
  27. package/dist/extensions/agent-browser/lib/command-capabilities.js +340 -0
  28. package/dist/extensions/agent-browser/lib/command-policy.js +107 -88
  29. package/dist/extensions/agent-browser/lib/command-taxonomy.js +49 -322
  30. package/dist/extensions/agent-browser/lib/config-policy.js +138 -343
  31. package/dist/extensions/agent-browser/lib/config-providers.js +71 -0
  32. package/dist/extensions/agent-browser/lib/config-validation.js +218 -0
  33. package/dist/extensions/agent-browser/lib/config.js +19 -7
  34. package/dist/extensions/agent-browser/lib/electron/cdp.js +15 -7
  35. package/dist/extensions/agent-browser/lib/electron/cleanup.js +134 -55
  36. package/dist/extensions/agent-browser/lib/electron/discovery-darwin.js +109 -0
  37. package/dist/extensions/agent-browser/lib/electron/discovery-desktop.js +136 -0
  38. package/dist/extensions/agent-browser/lib/electron/discovery-evidence.js +89 -0
  39. package/dist/extensions/agent-browser/lib/electron/discovery-linux.js +93 -0
  40. package/dist/extensions/agent-browser/lib/electron/discovery-packages.js +162 -0
  41. package/dist/extensions/agent-browser/lib/electron/discovery-types.js +2 -0
  42. package/dist/extensions/agent-browser/lib/electron/discovery.js +140 -549
  43. package/dist/extensions/agent-browser/lib/electron/launch-monitor.js +102 -0
  44. package/dist/extensions/agent-browser/lib/electron/launch-process.js +209 -0
  45. package/dist/extensions/agent-browser/lib/electron/launch-types.js +2 -0
  46. package/dist/extensions/agent-browser/lib/electron/launch.js +249 -354
  47. package/dist/extensions/agent-browser/lib/executable-path.js +21 -12
  48. package/dist/extensions/agent-browser/lib/execution-cwd.js +35 -18
  49. package/dist/extensions/agent-browser/lib/input-modes/electron.js +162 -121
  50. package/dist/extensions/agent-browser/lib/input-modes/job.js +116 -313
  51. package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +104 -0
  52. package/dist/extensions/agent-browser/lib/input-modes/lookup-plan.js +132 -0
  53. package/dist/extensions/agent-browser/lib/input-modes/lookup-redaction.js +57 -0
  54. package/dist/extensions/agent-browser/lib/input-modes/lookup-source-evidence.js +151 -0
  55. package/dist/extensions/agent-browser/lib/input-modes/lookup-workspace.js +142 -0
  56. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +57 -412
  57. package/dist/extensions/agent-browser/lib/input-modes/params.js +63 -17
  58. package/dist/extensions/agent-browser/lib/input-modes/qa-analysis.js +268 -0
  59. package/dist/extensions/agent-browser/lib/input-modes/qa-presentation.js +117 -0
  60. package/dist/extensions/agent-browser/lib/input-modes/script-child.js +396 -0
  61. package/dist/extensions/agent-browser/lib/input-modes/script-protocol.js +86 -0
  62. package/dist/extensions/agent-browser/lib/input-modes/script-types.js +1 -0
  63. package/dist/extensions/agent-browser/lib/input-modes/script-validation.js +60 -0
  64. package/dist/extensions/agent-browser/lib/input-modes/script.js +60 -409
  65. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +218 -128
  66. package/dist/extensions/agent-browser/lib/input-modes/shared.js +15 -4
  67. package/dist/extensions/agent-browser/lib/input-modes/types.js +56 -7
  68. package/dist/extensions/agent-browser/lib/json-schema.js +22 -10
  69. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +17 -5
  70. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +92 -425
  71. package/dist/extensions/agent-browser/lib/managed-session-posix-storage.js +58 -0
  72. package/dist/extensions/agent-browser/lib/managed-session-project-identity.js +244 -0
  73. package/dist/extensions/agent-browser/lib/managed-session-restore-context.js +84 -0
  74. package/dist/extensions/agent-browser/lib/managed-session-restore-policy.js +119 -0
  75. package/dist/extensions/agent-browser/lib/managed-session-restore-state.js +83 -0
  76. package/dist/extensions/agent-browser/lib/managed-session-restore.js +168 -300
  77. package/dist/extensions/agent-browser/lib/managed-session-snapshot-records.js +277 -0
  78. package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +128 -305
  79. package/dist/extensions/agent-browser/lib/managed-session-storage.js +56 -253
  80. package/dist/extensions/agent-browser/lib/native-confirmation.js +140 -0
  81. package/dist/extensions/agent-browser/lib/native-output.js +43 -9
  82. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +106 -59
  83. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-merge.js +14 -6
  84. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +109 -57
  85. package/dist/extensions/agent-browser/lib/orchestration/browser-run/browser-observation-result.js +82 -0
  86. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +164 -60
  87. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostic-values.js +31 -0
  88. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +152 -781
  89. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-observation.js +202 -0
  90. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-text-diagnostics.js +109 -0
  91. package/dist/extensions/agent-browser/lib/orchestration/browser-run/fill-diagnostics.js +119 -0
  92. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-action-recovery.js +147 -0
  93. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-actions.js +144 -0
  94. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-content.js +123 -0
  95. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-contracts.js +1 -0
  96. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-details.js +156 -0
  97. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-electron.js +179 -0
  98. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-evidence.js +39 -0
  99. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-missing-binary.js +89 -0
  100. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-recovery.js +97 -0
  101. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-redaction.js +106 -0
  102. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-timeout.js +110 -0
  103. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +41 -538
  104. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +199 -154
  105. package/dist/extensions/agent-browser/lib/orchestration/browser-run/interaction-diagnostics.js +290 -0
  106. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-close.js +167 -0
  107. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-inspection.js +108 -0
  108. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +127 -205
  109. package/dist/extensions/agent-browser/lib/orchestration/browser-run/native-helper-observation.js +65 -0
  110. package/dist/extensions/agent-browser/lib/orchestration/browser-run/observation-types.js +1 -0
  111. package/dist/extensions/agent-browser/lib/orchestration/browser-run/overlay-diagnostics.js +120 -0
  112. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +113 -30
  113. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +109 -28
  114. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter-data.js +150 -0
  115. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +138 -253
  116. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-rendered-text.js +147 -0
  117. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +59 -24
  118. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-artifacts.js +159 -0
  119. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-command.js +131 -0
  120. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-contracts.js +1 -0
  121. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-daemon.js +93 -0
  122. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-failure.js +42 -0
  123. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-guards.js +242 -0
  124. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-input.js +75 -0
  125. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-observations.js +92 -0
  126. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-selection.js +254 -0
  127. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-state.js +121 -0
  128. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-refs.js +130 -0
  129. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-resources.js +114 -0
  130. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-semantic.js +121 -0
  131. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-session-plan.js +222 -0
  132. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-timeouts.js +68 -0
  133. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +176 -1123
  134. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-analysis.js +191 -0
  135. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-confirmation.js +152 -0
  136. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-diagnostics.js +182 -0
  137. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-electron.js +150 -0
  138. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-contracts.js +1 -0
  139. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase-contracts.js +1 -0
  140. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase.js +115 -0
  141. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle.js +256 -0
  142. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed-contracts.js +1 -0
  143. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed.js +256 -0
  144. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase-contracts.js +1 -0
  145. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase.js +93 -0
  146. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native.js +113 -0
  147. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation-contracts.js +1 -0
  148. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation.js +316 -0
  149. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-ownership.js +28 -0
  150. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase-contracts.js +1 -0
  151. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase.js +142 -0
  152. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation-contracts.js +1 -0
  153. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation.js +333 -0
  154. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase-contracts.js +1 -0
  155. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase.js +71 -0
  156. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication.js +201 -0
  157. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-receipts.js +183 -0
  158. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-refs.js +200 -0
  159. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-tabs.js +142 -0
  160. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +18 -968
  161. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +23 -13
  162. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-receipt-reconciliation.js +198 -0
  163. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-contracts.js +1 -0
  164. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-presentation.js +154 -0
  165. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery.js +68 -151
  166. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-capture.js +14 -0
  167. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-observation.js +169 -46
  168. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-commands.js +130 -0
  169. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-electron.js +210 -0
  170. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-observations.js +61 -0
  171. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-outcomes.js +187 -0
  172. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-refs.js +171 -0
  173. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-tabs.js +228 -0
  174. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +77 -765
  175. package/dist/extensions/agent-browser/lib/orchestration/browser-run/text-visibility-diagnostics.js +182 -0
  176. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-diagnostics.js +256 -0
  177. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-progress.js +108 -0
  178. package/dist/extensions/agent-browser/lib/orchestration/code-artifact-observation.js +39 -0
  179. package/dist/extensions/agent-browser/lib/orchestration/code-image-observation.js +119 -0
  180. package/dist/extensions/agent-browser/lib/orchestration/electron-host/branch.js +92 -0
  181. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup-result.js +58 -0
  182. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup.js +78 -0
  183. package/dist/extensions/agent-browser/lib/orchestration/electron-host/contracts.js +1 -0
  184. package/dist/extensions/agent-browser/lib/orchestration/electron-host/discovery.js +106 -0
  185. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +48 -821
  186. package/dist/extensions/agent-browser/lib/orchestration/electron-host/policy.js +86 -0
  187. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-collection.js +69 -0
  188. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +167 -0
  189. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +164 -0
  190. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe.js +161 -0
  191. package/dist/extensions/agent-browser/lib/orchestration/electron-host/status.js +165 -0
  192. package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +21 -9
  193. package/dist/extensions/agent-browser/lib/orchestration/extension-artifact-preflight.js +211 -0
  194. package/dist/extensions/agent-browser/lib/orchestration/extension-artifacts.js +23 -0
  195. package/dist/extensions/agent-browser/lib/orchestration/extension-attachment-replay.js +99 -0
  196. package/dist/extensions/agent-browser/lib/orchestration/extension-branch-restore.js +275 -0
  197. package/dist/extensions/agent-browser/lib/orchestration/extension-code.js +280 -0
  198. package/dist/extensions/agent-browser/lib/orchestration/extension-command-admission.js +303 -0
  199. package/dist/extensions/agent-browser/lib/orchestration/extension-command-output.js +36 -0
  200. package/dist/extensions/agent-browser/lib/orchestration/extension-command-result.js +335 -0
  201. package/dist/extensions/agent-browser/lib/orchestration/extension-command-run.js +227 -0
  202. package/dist/extensions/agent-browser/lib/orchestration/extension-command-state.js +1 -0
  203. package/dist/extensions/agent-browser/lib/orchestration/extension-electron-ownership.js +204 -0
  204. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-locks.js +139 -0
  205. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-queue.js +24 -0
  206. package/dist/extensions/agent-browser/lib/orchestration/extension-host-coordination.js +98 -0
  207. package/dist/extensions/agent-browser/lib/orchestration/extension-host-run.js +295 -0
  208. package/dist/extensions/agent-browser/lib/orchestration/extension-intent-replay.js +41 -0
  209. package/dist/extensions/agent-browser/lib/orchestration/extension-invocation.js +7 -0
  210. package/dist/extensions/agent-browser/lib/orchestration/extension-lifecycle.js +102 -0
  211. package/dist/extensions/agent-browser/lib/orchestration/extension-managed-ownership.js +133 -0
  212. package/dist/extensions/agent-browser/lib/orchestration/extension-observation.js +120 -0
  213. package/dist/extensions/agent-browser/lib/orchestration/extension-prompt.js +180 -0
  214. package/dist/extensions/agent-browser/lib/orchestration/extension-recording.js +290 -0
  215. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-contracts.js +1 -0
  216. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-replay.js +269 -0
  217. package/dist/extensions/agent-browser/lib/orchestration/extension-result-state.js +113 -0
  218. package/dist/extensions/agent-browser/lib/orchestration/extension-runtime.js +146 -0
  219. package/dist/extensions/agent-browser/lib/orchestration/extension-script-leases.js +58 -0
  220. package/dist/extensions/agent-browser/lib/orchestration/extension-tool-boundary.js +62 -0
  221. package/dist/extensions/agent-browser/lib/orchestration/extension-version-check.js +54 -0
  222. package/dist/extensions/agent-browser/lib/orchestration/input-plan-types.js +1 -0
  223. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +261 -185
  224. package/dist/extensions/agent-browser/lib/orchestration/input-redaction.js +62 -0
  225. package/dist/extensions/agent-browser/lib/orchestration/native-config.js +144 -0
  226. package/dist/extensions/agent-browser/lib/orchestration/native-root-launch.js +77 -0
  227. package/dist/extensions/agent-browser/lib/orchestration/native-session-defaults.js +210 -157
  228. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  229. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +197 -99
  230. package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +199 -96
  231. package/dist/extensions/agent-browser/lib/owned-managed-session-context.js +55 -0
  232. package/dist/extensions/agent-browser/lib/page-target-batch.js +118 -0
  233. package/dist/extensions/agent-browser/lib/page-target-guards.js +50 -0
  234. package/dist/extensions/agent-browser/lib/page-target-navigation.js +104 -0
  235. package/dist/extensions/agent-browser/lib/page-target-validation.js +55 -246
  236. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  237. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +133 -68
  238. package/dist/extensions/agent-browser/lib/playbook.js +16 -12
  239. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  240. package/dist/extensions/agent-browser/lib/process-environment.js +13 -6
  241. package/dist/extensions/agent-browser/lib/process-errors.js +23 -0
  242. package/dist/extensions/agent-browser/lib/process-identity.js +47 -15
  243. package/dist/extensions/agent-browser/lib/process-socket-storage.js +256 -0
  244. package/dist/extensions/agent-browser/lib/process-stdout.js +74 -0
  245. package/dist/extensions/agent-browser/lib/process.js +145 -536
  246. package/dist/extensions/agent-browser/lib/prompt-artifacts.js +287 -0
  247. package/dist/extensions/agent-browser/lib/prompt-policy.js +15 -194
  248. package/dist/extensions/agent-browser/lib/read-command.js +41 -0
  249. package/dist/extensions/agent-browser/lib/read-confirmation.js +131 -68
  250. package/dist/extensions/agent-browser/lib/recording-reservations.js +118 -45
  251. package/dist/extensions/agent-browser/lib/redaction-fields.js +75 -0
  252. package/dist/extensions/agent-browser/lib/redaction-json.js +149 -0
  253. package/dist/extensions/agent-browser/lib/redaction-url.js +88 -0
  254. package/dist/extensions/agent-browser/lib/results/action-contracts.js +1 -0
  255. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +28 -271
  256. package/dist/extensions/agent-browser/lib/results/artifact-contracts.js +1 -0
  257. package/dist/extensions/agent-browser/lib/results/artifact-manifest-validation.js +133 -0
  258. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +96 -94
  259. package/dist/extensions/agent-browser/lib/results/artifact-recommendations.js +73 -0
  260. package/dist/extensions/agent-browser/lib/results/categories.js +111 -54
  261. package/dist/extensions/agent-browser/lib/results/confirmation.js +29 -13
  262. package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +62 -27
  263. package/dist/extensions/agent-browser/lib/results/electron-recommendations.js +83 -0
  264. package/dist/extensions/agent-browser/lib/results/envelope-decoding.js +48 -0
  265. package/dist/extensions/agent-browser/lib/results/envelope.js +90 -67
  266. package/dist/extensions/agent-browser/lib/results/evidence-contracts.js +1 -0
  267. package/dist/extensions/agent-browser/lib/results/failure-recommendations.js +180 -0
  268. package/dist/extensions/agent-browser/lib/results/network-routes.js +86 -45
  269. package/dist/extensions/agent-browser/lib/results/network.js +35 -12
  270. package/dist/extensions/agent-browser/lib/results/next-actions.js +49 -19
  271. package/dist/extensions/agent-browser/lib/results/presentation/artifact-files.js +320 -0
  272. package/dist/extensions/agent-browser/lib/results/presentation/artifact-format.js +138 -0
  273. package/dist/extensions/agent-browser/lib/results/presentation/artifact-images.js +113 -0
  274. package/dist/extensions/agent-browser/lib/results/presentation/artifact-verification.js +145 -0
  275. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +99 -555
  276. package/dist/extensions/agent-browser/lib/results/presentation/batch-contracts.js +1 -0
  277. package/dist/extensions/agent-browser/lib/results/presentation/batch-recording.js +118 -0
  278. package/dist/extensions/agent-browser/lib/results/presentation/batch-redaction.js +68 -0
  279. package/dist/extensions/agent-browser/lib/results/presentation/batch-rendering.js +135 -0
  280. package/dist/extensions/agent-browser/lib/results/presentation/batch-step.js +227 -0
  281. package/dist/extensions/agent-browser/lib/results/presentation/batch-summary.js +91 -0
  282. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +91 -460
  283. package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +9 -5
  284. package/dist/extensions/agent-browser/lib/results/presentation/command-presenters.js +216 -0
  285. package/dist/extensions/agent-browser/lib/results/presentation/common.js +26 -9
  286. package/dist/extensions/agent-browser/lib/results/presentation/content.js +86 -29
  287. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-a11y.js +67 -0
  288. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-health.js +79 -0
  289. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-identity.js +199 -0
  290. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-logs.js +75 -0
  291. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network-actions.js +216 -0
  292. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network.js +124 -0
  293. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-redaction.js +64 -0
  294. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-storage.js +209 -0
  295. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-stream.js +69 -0
  296. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-summary.js +222 -0
  297. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +103 -1052
  298. package/dist/extensions/agent-browser/lib/results/presentation/early-result.js +70 -0
  299. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +130 -60
  300. package/dist/extensions/agent-browser/lib/results/presentation/input-contracts.js +1 -0
  301. package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +60 -145
  302. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +147 -88
  303. package/dist/extensions/agent-browser/lib/results/presentation/notices.js +75 -0
  304. package/dist/extensions/agent-browser/lib/results/presentation/observation-contracts.js +1 -0
  305. package/dist/extensions/agent-browser/lib/results/presentation/observation-rendering.js +127 -0
  306. package/dist/extensions/agent-browser/lib/results/presentation/outcomes.js +120 -0
  307. package/dist/extensions/agent-browser/lib/results/presentation/output-completion.js +77 -0
  308. package/dist/extensions/agent-browser/lib/results/presentation/output-spill.js +51 -0
  309. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +116 -240
  310. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +35 -21
  311. package/dist/extensions/agent-browser/lib/results/presentation/skills.js +104 -73
  312. package/dist/extensions/agent-browser/lib/results/presentation/source.js +109 -0
  313. package/dist/extensions/agent-browser/lib/results/presentation.js +17 -261
  314. package/dist/extensions/agent-browser/lib/results/recommendation-contracts.js +1 -0
  315. package/dist/extensions/agent-browser/lib/results/recording.js +52 -14
  316. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +14 -5
  317. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +30 -22
  318. package/dist/extensions/agent-browser/lib/results/selector-recovery-target.js +83 -0
  319. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +119 -119
  320. package/dist/extensions/agent-browser/lib/results/snapshot-compact.js +266 -0
  321. package/dist/extensions/agent-browser/lib/results/snapshot-content.js +32 -0
  322. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +104 -71
  323. package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +31 -11
  324. package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +125 -66
  325. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +26 -7
  326. package/dist/extensions/agent-browser/lib/results/snapshot.js +28 -248
  327. package/dist/extensions/agent-browser/lib/results/text.js +16 -5
  328. package/dist/extensions/agent-browser/lib/runtime-args-validation.js +133 -0
  329. package/dist/extensions/agent-browser/lib/runtime-compatibility.js +81 -0
  330. package/dist/extensions/agent-browser/lib/runtime-contracts.js +1 -0
  331. package/dist/extensions/agent-browser/lib/runtime-redaction.js +118 -0
  332. package/dist/extensions/agent-browser/lib/runtime-replay-events.js +144 -0
  333. package/dist/extensions/agent-browser/lib/runtime-session-identity.js +76 -0
  334. package/dist/extensions/agent-browser/lib/runtime-session-plan.js +114 -0
  335. package/dist/extensions/agent-browser/lib/runtime-session-replay.js +123 -0
  336. package/dist/extensions/agent-browser/lib/runtime-tab-correction.js +65 -0
  337. package/dist/extensions/agent-browser/lib/runtime-timeouts.js +28 -0
  338. package/dist/extensions/agent-browser/lib/runtime.js +137 -1041
  339. package/dist/extensions/agent-browser/lib/session-identity.js +51 -0
  340. package/dist/extensions/agent-browser/lib/session-page-observation.js +357 -0
  341. package/dist/extensions/agent-browser/lib/session-page-state.js +178 -333
  342. package/dist/extensions/agent-browser/lib/session-page-types.js +1 -0
  343. package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +78 -0
  344. package/dist/extensions/agent-browser/lib/temp-mutation-queue.js +7 -0
  345. package/dist/extensions/agent-browser/lib/temp-root-ownership.js +234 -0
  346. package/dist/extensions/agent-browser/lib/temp-root.js +207 -0
  347. package/dist/extensions/agent-browser/lib/temp.js +33 -446
  348. package/dist/extensions/agent-browser/lib/tool-surface.js +94 -24
  349. package/dist/extensions/agent-browser/lib/upstream-version.js +3 -2
  350. package/dist/extensions/agent-browser/lib/web-search-providers.js +229 -0
  351. package/dist/extensions/agent-browser/lib/web-search-request.js +108 -0
  352. package/dist/extensions/agent-browser/lib/web-search-results.js +281 -0
  353. package/dist/extensions/agent-browser/lib/web-search-schema.js +82 -0
  354. package/dist/extensions/agent-browser/lib/web-search.js +109 -617
  355. package/dist/extensions/agent-browser/lib/webmcp-observation.js +13 -6
  356. package/dist/extensions/agent-browser/lib/windows-stock-launcher.js +63 -37
  357. package/dist/extensions/agent-browser/script-worker.js +80 -43
  358. package/dist/scripts/agent-browser-target.mjs +4 -2
  359. package/docs/ARCHITECTURE.md +17 -5
  360. package/docs/CODE_QUALITY.md +242 -0
  361. package/docs/COMMAND_REFERENCE.md +251 -220
  362. package/docs/ELECTRON.md +53 -44
  363. package/docs/RELEASE.md +18 -15
  364. package/docs/REQUIREMENTS.md +1 -0
  365. package/docs/SUPPORT_MATRIX.md +76 -75
  366. package/docs/TOOL_CONTRACT.md +145 -116
  367. package/docs/platform-smoke.md +5 -5
  368. package/package.json +143 -120
  369. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  370. package/scripts/agent-browser-target.mjs +6 -2
  371. package/scripts/build.mjs +37 -8
  372. package/scripts/capability-core-commands.mjs +193 -0
  373. package/scripts/capability-options.mjs +283 -0
  374. package/scripts/capability-samples.mjs +133 -0
  375. package/scripts/capability-section.mjs +11 -0
  376. package/scripts/config.mjs +213 -114
  377. package/scripts/convert-browser-session.mjs +30 -9
  378. package/scripts/doctor-sources.mjs +195 -0
  379. package/scripts/doctor.mjs +92 -247
  380. package/scripts/platform-smoke/artifacts.mjs +38 -11
  381. package/scripts/platform-smoke/commands.mjs +104 -0
  382. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  383. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  384. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  385. package/scripts/platform-smoke/doctor.mjs +212 -320
  386. package/scripts/platform-smoke/lease-evidence.mjs +134 -0
  387. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  388. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  389. package/scripts/platform-smoke/targets.mjs +158 -472
  390. package/scripts/platform-smoke.mjs +55 -40
  391. package/scripts/prepare.mjs +16 -7
@@ -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
+ }