pi-agent-browser-native 0.9.2 → 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 (392) hide show
  1. package/CHANGELOG.md +91 -5
  2. package/README.md +120 -86
  3. package/dist/extensions/agent-browser/index.js +43065 -2016
  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 +113 -49
  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 -81
  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 +44 -9
  82. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +107 -66
  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 +171 -57
  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 +204 -108
  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 -199
  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 -1114
  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 -910
  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 -753
  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 -816
  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 -139
  228. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  229. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +198 -98
  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 +59 -243
  236. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  237. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +134 -68
  238. package/dist/extensions/agent-browser/lib/playbook.js +18 -14
  239. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  240. package/dist/extensions/agent-browser/lib/process-environment.js +22 -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 +146 -537
  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 +138 -35
  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 -10
  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 +93 -66
  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 -552
  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 -1019
  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 +117 -237
  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 -248
  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 +123 -123
  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 -1037
  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 +188 -324
  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 +22 -10
  360. package/docs/CODE_QUALITY.md +242 -0
  361. package/docs/COMMAND_REFERENCE.md +264 -229
  362. package/docs/ELECTRON.md +53 -44
  363. package/docs/RELEASE.md +21 -17
  364. package/docs/REQUIREMENTS.md +2 -0
  365. package/docs/SESSION_STORAGE.md +1 -1
  366. package/docs/SUPPORT_MATRIX.md +84 -77
  367. package/docs/TOOL_CONTRACT.md +165 -130
  368. package/docs/platform-smoke.md +5 -5
  369. package/package.json +143 -120
  370. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  371. package/scripts/agent-browser-target.mjs +6 -2
  372. package/scripts/build.mjs +37 -8
  373. package/scripts/capability-core-commands.mjs +193 -0
  374. package/scripts/capability-options.mjs +283 -0
  375. package/scripts/capability-samples.mjs +133 -0
  376. package/scripts/capability-section.mjs +11 -0
  377. package/scripts/config.mjs +213 -114
  378. package/scripts/convert-browser-session.mjs +30 -9
  379. package/scripts/doctor-sources.mjs +195 -0
  380. package/scripts/doctor.mjs +92 -247
  381. package/scripts/platform-smoke/artifacts.mjs +38 -11
  382. package/scripts/platform-smoke/commands.mjs +104 -0
  383. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  384. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  385. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  386. package/scripts/platform-smoke/doctor.mjs +212 -320
  387. package/scripts/platform-smoke/lease-evidence.mjs +134 -0
  388. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  389. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  390. package/scripts/platform-smoke/targets.mjs +158 -472
  391. package/scripts/platform-smoke.mjs +55 -40
  392. package/scripts/prepare.mjs +16 -7
@@ -1,32 +1,21 @@
1
1
  import { AsyncLocalStorage } from "node:async_hooks";
2
- import { spawn } from "node:child_process";
3
- import { lstat, mkdir, readdir, readlink, stat } from "node:fs/promises";
4
- import { dirname, isAbsolute, join } from "node:path";
5
- import { env as processEnv, platform as processPlatform } from "node:process";
6
- import { spawn as crossSpawn } from "cross-spawn";
7
- import { parseArgvDescriptor } from "./argv-descriptor.js";
8
- import { extractExplicitSessionName, resolveAgentBrowserNamespace, scanUpstreamGlobalFlagOccurrences } from "./argv-grammar.js";
2
+ import { env as processEnv } from "node:process";
3
+ import { runBrowserChild } from "./process-child.js";
4
+ export { resolveSpawnedChildExitCode } from "./process-child.js";
5
+ import { scanUpstreamGlobalFlagOccurrences } from "./argv-grammar.js";
9
6
  import { commitManagedSessionRestoreSuppression, getManagedSessionRestoreEnv, getManagedSessionRestoreProtectedEnv, getOwnedManagedSessionCompatibilityEnv, getOwnedManagedSessionNamespaceEnv, isOwnedManagedSessionTarget, validateManagedSessionRestoreContextForSpawn, } from "./managed-session-restore.js";
10
- import { getPageTargetValidationError, } from "./page-target-validation.js";
11
- import { getImplicitSessionIdleTimeoutMs } from "./runtime.js";
12
- import { getAgentBrowserProcessEnvironment } from "./process-environment.js";
13
- import { openSecureTempFile, writeSecureTempChunk } from "./temp.js";
7
+ import { getPageTargetValidationError } from "./page-target-validation.js";
8
+ import { getImplicitSessionIdleTimeoutMs } from "./runtime-timeouts.js";
9
+ import { getAgentBrowserProcessArgs, getAgentBrowserProcessEnvironment, } from "./process-environment.js";
14
10
  import { resolveWindowsStockLauncher } from "./windows-stock-launcher.js";
15
- const MAX_BUFFERED_STDOUT_BYTES = 512 * 1_024;
16
- const MAX_BUFFERED_STDERR_CHARS = 32_000;
17
- const MAX_BUFFERED_STDOUT_TAIL_CHARS = 32_000;
18
- const PROCESS_STDOUT_SPILL_FILE_PREFIX = "process-stdout";
19
11
  const AGENT_BROWSER_SOCKET_DIR_ENV = "AGENT_BROWSER_SOCKET_DIR";
20
12
  const AGENT_BROWSER_DEFAULT_TIMEOUT_ENV = "AGENT_BROWSER_DEFAULT_TIMEOUT";
21
13
  const AGENT_BROWSER_IDLE_TIMEOUT_ENV = "AGENT_BROWSER_IDLE_TIMEOUT_MS";
22
14
  const PI_AGENT_BROWSER_PROCESS_TIMEOUT_ENV = "PI_AGENT_BROWSER_PROCESS_TIMEOUT_MS";
23
- const PI_AGENT_BROWSER_SOCKET_DIR_ENV = "PI_AGENT_BROWSER_SOCKET_DIR";
24
- const DEFAULT_AGENT_BROWSER_SOCKET_DIR_PREFIX = "/tmp/piab";
25
- const TERMUX_PACKAGE_NAME_PATTERN = /^[A-Za-z0-9_]+(?:\.[A-Za-z0-9_]+)+$/;
15
+ import { getAgentBrowserSocketDirValidationError, getAgentBrowserSocketPathValidationError, resolveAgentBrowserSocketDir, } from "./process-socket-storage.js";
16
+ export { getAgentBrowserSocketDir, getAgentBrowserSocketDirValidationError, getAgentBrowserSocketPathValidationError, isTrustedAndroidAppDataRoot, isTrustedSocketDirAncestor, resolveAgentBrowserSocketDir, } from "./process-socket-storage.js";
26
17
  export const SAFE_AGENT_BROWSER_OPERATION_TIMEOUT_MS = 25_000;
27
18
  const DEFAULT_AGENT_BROWSER_PROCESS_TIMEOUT_MS = 35_000;
28
- /** Grace period after `exit` before resolving when `close` is delayed by inherited stdio handles. */
29
- const EXIT_STDIO_GRACE_MS = 100;
30
19
  const attachedBrowserSessionContext = new AsyncLocalStorage();
31
20
  const chromeStartupArgsContext = new AsyncLocalStorage();
32
21
  export function withChromeStartupArgs(args, run) {
@@ -35,102 +24,26 @@ export function withChromeStartupArgs(args, run) {
35
24
  export function withAttachedBrowserSessionContext(preserve, run) {
36
25
  return attachedBrowserSessionContext.run(preserve || attachedBrowserSessionContext.getStore() === true, run);
37
26
  }
38
- function appendTail(text, addition, maxChars) {
39
- const combined = text + addition;
40
- return combined.length <= maxChars ? combined : combined.slice(combined.length - maxChars);
41
- }
42
27
  export function prepareAgentBrowserSpawnArgs(args, wrapperCompatibilityUserAgent, preserveAttachedBrowserSession = false, startupArgs) {
43
- if (preserveAttachedBrowserSession)
28
+ if (preserveAttachedBrowserSession) {
44
29
  return args;
30
+ }
45
31
  const occurrence = scanUpstreamGlobalFlagOccurrences(args, "--args").at(-1);
46
- const customArgs = wrapperCompatibilityUserAgent && !occurrence
47
- ? `${startupArgs ?? "--no-startup-window"},--user-agent=${wrapperCompatibilityUserAgent.replaceAll(/[\r\n,]/g, "")}` : startupArgs;
48
- if (customArgs === undefined)
32
+ const customArgs = wrapperCompatibilityUserAgent !== undefined &&
33
+ wrapperCompatibilityUserAgent.length > 0 &&
34
+ !occurrence
35
+ ? `${startupArgs ?? "--no-startup-window"},--user-agent=${wrapperCompatibilityUserAgent.replaceAll(/[\r\n,]/g, "")}`
36
+ : startupArgs;
37
+ if (customArgs === undefined) {
49
38
  return args;
50
- if (!occurrence)
39
+ }
40
+ if (!occurrence) {
51
41
  return ["--args", customArgs, ...args];
42
+ }
52
43
  const normalized = [...args];
53
44
  normalized[occurrence.index + 1] = customArgs;
54
45
  return normalized;
55
46
  }
56
- async function terminateSpawnedChild(child, signal) {
57
- if (processPlatform === "win32" && child.pid) {
58
- // Keep the shell alive until taskkill has traversed its descendants, and
59
- // observe the killer before allowing the browser call to finish.
60
- const killed = await new Promise((resolve) => {
61
- const killer = spawn("taskkill.exe", ["/PID", String(child.pid), "/T", "/F"], { stdio: "ignore" });
62
- killer.once("error", () => resolve(false));
63
- killer.once("close", (code) => resolve(code === 0));
64
- });
65
- if (killed)
66
- return;
67
- }
68
- child.kill(signal);
69
- }
70
- /** Exported for unit tests that lock subprocess exit-code precedence. */
71
- export function resolveSpawnedChildExitCode(input) {
72
- // Precedence: observed `close` code when present, then wrapper timeout (124), then
73
- // post-`exit` fallback when inherited stdio delays `close`, then spawn failure (127).
74
- if (input.closeCode !== null && input.closeCode !== undefined) {
75
- return input.closeCode;
76
- }
77
- if (input.timedOut) {
78
- return 124;
79
- }
80
- if (input.useExitFallback && input.exitCode !== null && input.exitCode !== undefined) {
81
- return input.exitCode;
82
- }
83
- return input.spawnError ? 127 : 0;
84
- }
85
- function watchSpawnedChildCompletion(child, options) {
86
- let exited = false;
87
- let exitCode = null;
88
- let postExitTimer;
89
- // `completed` suppresses duplicate exit/close callbacks; `settled` in `finish` guards async spill cleanup.
90
- let completed = false;
91
- const complete = (closeCode) => {
92
- if (completed)
93
- return;
94
- completed = true;
95
- if (postExitTimer) {
96
- clearTimeout(postExitTimer);
97
- postExitTimer = undefined;
98
- }
99
- const context = options.getContext();
100
- options.onComplete(resolveSpawnedChildExitCode({
101
- closeCode,
102
- exitCode,
103
- useExitFallback: exited,
104
- timedOut: context.timedOut,
105
- spawnError: context.spawnError,
106
- }));
107
- };
108
- child.once("exit", (code) => {
109
- exited = true;
110
- exitCode = code;
111
- postExitTimer = setTimeout(() => {
112
- destroySpawnedChildStreams(child);
113
- complete(undefined);
114
- }, options.graceMs);
115
- postExitTimer.unref?.();
116
- });
117
- child.once("close", (code) => {
118
- complete(code);
119
- });
120
- return {
121
- clear: () => {
122
- if (postExitTimer) {
123
- clearTimeout(postExitTimer);
124
- postExitTimer = undefined;
125
- }
126
- },
127
- };
128
- }
129
- function destroySpawnedChildStreams(child) {
130
- child.stdin?.destroy();
131
- child.stdout?.destroy();
132
- child.stderr?.destroy();
133
- }
134
47
  function parsePositiveIntegerEnv(value) {
135
48
  if (value === undefined || !/^\d+$/.test(value.trim())) {
136
49
  return undefined;
@@ -138,184 +51,16 @@ function parsePositiveIntegerEnv(value) {
138
51
  const parsed = Number(value.trim());
139
52
  return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined;
140
53
  }
141
- function clampUpstreamDefaultTimeout(childEnv) {
142
- const requestedTimeout = parsePositiveIntegerEnv(childEnv[AGENT_BROWSER_DEFAULT_TIMEOUT_ENV]);
143
- if (requestedTimeout === undefined || requestedTimeout > SAFE_AGENT_BROWSER_OPERATION_TIMEOUT_MS) {
144
- childEnv[AGENT_BROWSER_DEFAULT_TIMEOUT_ENV] = String(SAFE_AGENT_BROWSER_OPERATION_TIMEOUT_MS);
145
- }
146
- }
147
54
  export function getAgentBrowserProcessTimeoutMs(env = processEnv) {
148
- return parsePositiveIntegerEnv(env[PI_AGENT_BROWSER_PROCESS_TIMEOUT_ENV]) ?? DEFAULT_AGENT_BROWSER_PROCESS_TIMEOUT_MS;
55
+ return (parsePositiveIntegerEnv(env[PI_AGENT_BROWSER_PROCESS_TIMEOUT_ENV]) ??
56
+ DEFAULT_AGENT_BROWSER_PROCESS_TIMEOUT_MS);
149
57
  }
150
- export function getAgentBrowserSocketDir(platform = processPlatform, uid = typeof process.getuid === "function" ? process.getuid() : undefined, termuxPackageName = processEnv.TERMUX_APP__PACKAGE_NAME) {
151
- if (platform === "win32") {
152
- return undefined;
153
- }
154
- const termuxAppRoot = platform === "android" && termuxPackageName && TERMUX_PACKAGE_NAME_PATTERN.test(termuxPackageName);
155
- const prefix = platform === "darwin"
156
- ? "/private/tmp/piab"
157
- : termuxAppRoot
158
- ? `/data/data/${termuxPackageName}/piab`
159
- : DEFAULT_AGENT_BROWSER_SOCKET_DIR_PREFIX;
160
- return `${prefix}${!termuxAppRoot && typeof uid === "number" ? `-${uid}` : ""}`;
161
- }
162
- export function resolveAgentBrowserSocketDir(options = {}) {
163
- const parentEnv = options.parentEnv ?? getAgentBrowserProcessEnvironment();
164
- return options.env?.[AGENT_BROWSER_SOCKET_DIR_ENV] ?? parentEnv[PI_AGENT_BROWSER_SOCKET_DIR_ENV]
165
- ?? (!options.ownedManagedSession ? parentEnv[AGENT_BROWSER_SOCKET_DIR_ENV] : undefined) ?? getAgentBrowserSocketDir();
166
- }
167
- export function isTrustedAndroidAppDataRoot(path, metadata, uid, platform = processPlatform) {
168
- if (platform !== "android" || metadata.uid !== uid || metadata.isSymbolicLink() || !metadata.isDirectory() || (metadata.mode & 0o777) !== 0o700)
169
- return false;
170
- const parent = dirname(path);
171
- return parent === "/data/data" || /^\/data\/user\/\d+$/.test(parent);
172
- }
173
- export function isTrustedSocketDirAncestor(metadata, uid, platform = processPlatform) {
174
- if (metadata.isSymbolicLink())
175
- return metadata.uid === 0;
176
- if (!metadata.isDirectory())
177
- return false;
178
- const mode = metadata.mode & 0o7777;
179
- if (platform === "android" && uid !== 0 && metadata.uid === uid && metadata.gid === uid)
180
- return (mode & 0o002) === 0;
181
- if (metadata.uid === uid && uid !== 0)
182
- return (mode & 0o022) === 0;
183
- return metadata.uid === 0 && ((mode & 0o022) === 0 || (mode & 0o1000) !== 0);
184
- }
185
- async function hasTrustedSocketDirAncestry(socketDir, uid, visited = new Set()) {
186
- for (let current = dirname(socketDir);;) {
187
- current = current.replace(/\/+$/, "") || "/";
188
- if (visited.has(current))
189
- return true;
190
- visited.add(current);
191
- const metadata = await lstat(current);
192
- // The operating environment supplies /; its reported owner may be unmapped in a user namespace.
193
- if (current === "/" && metadata.isDirectory() && (metadata.mode & 0o022) === 0)
194
- return true;
195
- if (isTrustedAndroidAppDataRoot(current, metadata, uid))
196
- return true;
197
- if (!isTrustedSocketDirAncestor(metadata, uid))
198
- return false;
199
- if (metadata.isSymbolicLink()) {
200
- // Native stat rejects broken/cyclic links before walking their destination ancestry.
201
- if (!isTrustedSocketDirAncestor(await stat(current), uid))
202
- return false;
203
- const target = await readlink(current);
204
- const targetPath = isAbsolute(target) ? target : `${dirname(current)}/${target}`;
205
- // Keep '..' after symlinks intact; '/.' includes the target itself in the parent walk.
206
- if (!await hasTrustedSocketDirAncestry(`${targetPath}/.`, uid, visited))
207
- return false;
208
- }
209
- const parent = dirname(current);
210
- if (parent === current)
211
- return true;
212
- current = parent;
213
- }
214
- }
215
- async function socketDirEntriesAreOwned(socketDir, uid, visited = { count: 0 }) {
216
- for (const name of await readdir(socketDir)) {
217
- if ((visited.count += 1) > 16_384)
218
- return false;
219
- try {
220
- const path = join(socketDir, name);
221
- const metadata = await lstat(path);
222
- if (metadata.uid !== uid || metadata.isSymbolicLink())
223
- return false;
224
- if (metadata.isDirectory()) {
225
- if (!await socketDirEntriesAreOwned(path, uid, visited))
226
- return false;
227
- }
228
- else if (!metadata.isFile() && !metadata.isSocket()) {
229
- return false;
230
- }
231
- }
232
- catch (error) {
233
- if (error.code !== "ENOENT")
234
- return false;
235
- }
236
- }
237
- return true;
238
- }
239
- export async function getAgentBrowserSocketDirValidationError(socketDir, uid = typeof process.getuid === "function" ? process.getuid() : undefined, platform = processPlatform) {
240
- if (!isAbsolute(socketDir))
241
- return "the path is not absolute";
242
- // Windows uses native ACLs and named pipes, not POSIX uid/mode metadata.
243
- // Still require a real directory; never accept a file or a redirected root.
244
- if (platform === "win32") {
245
- try {
246
- try {
247
- await mkdir(socketDir);
248
- }
249
- catch (error) {
250
- if (error.code !== "EEXIST")
251
- throw error;
252
- }
253
- const metadata = await lstat(socketDir);
254
- if (metadata.isSymbolicLink())
255
- return "the directory is a symlink";
256
- return metadata.isDirectory() ? undefined : "the path is not a directory";
257
- }
258
- catch (error) {
259
- return `the directory could not be inspected (${error.code ?? "unknown error"})`;
260
- }
261
- }
262
- if (typeof uid !== "number")
263
- return "POSIX ownership metadata is unavailable";
264
- try {
265
- if (!await hasTrustedSocketDirAncestry(socketDir, uid))
266
- return "an ancestor is writable, foreign-owned, a non-directory, or an untrusted symlink";
267
- try {
268
- await mkdir(socketDir, { mode: 0o700 });
269
- }
270
- catch (error) {
271
- if (error.code !== "EEXIST")
272
- return `the directory could not be created (${error.code ?? "unknown error"})`;
273
- }
274
- const metadata = await lstat(socketDir);
275
- if (!metadata.isDirectory())
276
- return "the path is not a directory";
277
- if (metadata.isSymbolicLink())
278
- return "the directory is a symlink";
279
- if (metadata.uid !== uid)
280
- return `the directory is owned by uid ${metadata.uid}, not uid ${uid}`;
281
- if ((metadata.mode & 0o777) !== 0o700)
282
- return `the directory mode is ${(metadata.mode & 0o777).toString(8)}, not 700`;
283
- if (!await hasTrustedSocketDirAncestry(socketDir, uid))
284
- return "an ancestor became untrusted during validation";
285
- if (!await socketDirEntriesAreOwned(socketDir, uid))
286
- return "the directory contains a foreign-owned, symlink, special, or excessively deep entry";
287
- return undefined;
288
- }
289
- catch (error) {
290
- return `the directory could not be inspected (${error.code ?? "unknown error"})`;
291
- }
292
- }
293
- export function getAgentBrowserSocketPathValidationError(options) {
294
- if ((options.platform ?? processPlatform) === "win32")
295
- return undefined;
296
- const descriptor = parseArgvDescriptor(options.args);
297
- const { command } = descriptor.commandInfo;
298
- // Preflight commands that can start or navigate a browser. Follow-up reads and
299
- // cleanup may target a daemon created by an earlier wrapper version, so let
300
- // upstream inspect those identities instead of rejecting them from path math.
301
- if (!command || !["batch", "connect", "goto", "navigate", "open", "visit"].includes(command))
302
- return undefined;
303
- const sessionName = extractExplicitSessionName(options.args);
304
- if (!sessionName)
305
- return undefined;
306
- const namespace = resolveAgentBrowserNamespace(options.args, options.env?.AGENT_BROWSER_NAMESPACE);
307
- const socketRoot = namespace ? join(options.socketDir, "namespaces", namespace, "run") : options.socketDir;
308
- const socketPath = join(socketRoot, `${sessionName}.sock`);
309
- const pathBytes = Buffer.byteLength(socketPath);
310
- if (pathBytes <= 103)
311
- return undefined;
312
- return `Agent-browser Unix socket path would be ${pathBytes} bytes (max 103) for session ${JSON.stringify(sessionName)} under ${JSON.stringify(options.socketDir)}. Set PI_AGENT_BROWSER_SOCKET_DIR to a shorter absolute private directory such as /tmp/piab-<uid> with mode 0700; retrying sessionMode \"fresh\" cannot shorten this configured root.`;
313
- }
314
- export function buildAgentBrowserProcessEnv(baseEnv = processEnv, overrides = undefined) {
58
+ export function buildAgentBrowserProcessEnv(baseEnv = processEnv, overrides) {
315
59
  const childEnv = {};
316
60
  for (const [name, value] of Object.entries(baseEnv)) {
317
- if (value !== undefined)
61
+ if (value !== undefined) {
318
62
  childEnv[name] = value;
63
+ }
319
64
  }
320
65
  for (const [name, value] of Object.entries(overrides ?? {})) {
321
66
  if (value === undefined) {
@@ -325,15 +70,20 @@ export function buildAgentBrowserProcessEnv(baseEnv = processEnv, overrides = un
325
70
  childEnv[name] = value;
326
71
  }
327
72
  }
328
- clampUpstreamDefaultTimeout(childEnv);
73
+ const requestedTimeout = parsePositiveIntegerEnv(childEnv[AGENT_BROWSER_DEFAULT_TIMEOUT_ENV]);
74
+ if (requestedTimeout === undefined ||
75
+ requestedTimeout > SAFE_AGENT_BROWSER_OPERATION_TIMEOUT_MS) {
76
+ childEnv[AGENT_BROWSER_DEFAULT_TIMEOUT_ENV] = String(SAFE_AGENT_BROWSER_OPERATION_TIMEOUT_MS);
77
+ }
329
78
  return childEnv;
330
79
  }
331
- function getManagedPreSpawnPolicyError(options, currentPageUrl, pageUrlUnknown = false, browserIndependentReadConfirmation = false) {
80
+ function getManagedPreSpawnPolicyError(options, currentPageUrl, pageUrlUnknown = false, nativeConfirmationDecision = false) {
332
81
  if (!validateManagedSessionRestoreContextForSpawn(options)) {
333
82
  return "Managed session restore policy, storage, or checkout identity changed after planning; refusing to start agent-browser.";
334
83
  }
335
- if (browserIndependentReadConfirmation)
84
+ if (nativeConfirmationDecision) {
336
85
  return undefined;
86
+ }
337
87
  return getPageTargetValidationError({
338
88
  args: options.args,
339
89
  currentPageUrl,
@@ -341,267 +91,126 @@ function getManagedPreSpawnPolicyError(options, currentPageUrl, pageUrlUnknown =
341
91
  stdin: options.stdin,
342
92
  });
343
93
  }
344
- export async function runAgentBrowserProcess(options) {
345
- const { cwd, env, managedSessionRestoreState, managedStateCurrentPageUrl, managedStatePageUrlUnknown, signal, stdin } = options;
346
- const preserveAttachedBrowserSession = options.preserveAttachedBrowserSession === true || attachedBrowserSessionContext.getStore() === true;
347
- const ownedManagedSession = options.ownedManagedSession === true || isOwnedManagedSessionTarget(options.args);
348
- const args = options.args;
349
- const timeoutMs = options.timeoutMs ?? getAgentBrowserProcessTimeoutMs();
350
- const deadlineExpired = () => signal?.reason instanceof Error && signal.reason.name === "TimeoutError";
351
- const cancelledResult = () => ({ aborted: !deadlineExpired(), agentBrowserStarted: false, exitCode: deadlineExpired() ? 124 : 1, stderr: "", stdout: "", timedOut: deadlineExpired(), timeoutMs: deadlineExpired() ? timeoutMs : undefined });
352
- if (signal?.aborted)
353
- return cancelledResult();
354
- const parentEnv = getAgentBrowserProcessEnvironment();
355
- const managedSessionRestoreOptions = {
356
- args,
357
- cwd,
358
- env,
359
- ownedManagedSession,
360
- parentEnv,
361
- restoreState: managedSessionRestoreState,
362
- stdin,
94
+ function failureResult(error) {
95
+ return {
96
+ aborted: false,
97
+ agentBrowserStarted: false,
98
+ exitCode: 1,
99
+ spawnError: new Error(error),
100
+ stderr: "",
101
+ stdout: "",
102
+ timedOut: false,
363
103
  };
364
- const planningPolicyError = getManagedPreSpawnPolicyError(managedSessionRestoreOptions, managedStateCurrentPageUrl, managedStatePageUrlUnknown, options.browserIndependentReadConfirmation);
365
- if (planningPolicyError) {
366
- return {
367
- aborted: false,
368
- agentBrowserStarted: false,
369
- exitCode: 1,
370
- spawnError: new Error(planningPolicyError),
371
- stderr: "",
372
- stdout: "",
373
- timedOut: false,
374
- };
375
- }
376
- const managedSessionRestoreEnv = getManagedSessionRestoreEnv(managedSessionRestoreOptions);
377
- const ownedManagedSessionCompatibilityEnv = getOwnedManagedSessionCompatibilityEnv(managedSessionRestoreOptions);
378
- const processOverrides = {
379
- ...(ownedManagedSession ? { [AGENT_BROWSER_IDLE_TIMEOUT_ENV]: String(getImplicitSessionIdleTimeoutMs()) } : {}),
380
- ...managedSessionRestoreEnv,
381
- ...env,
382
- ...getManagedSessionRestoreProtectedEnv(managedSessionRestoreOptions, managedSessionRestoreEnv),
383
- ...getOwnedManagedSessionNamespaceEnv(managedSessionRestoreOptions),
384
- ...ownedManagedSessionCompatibilityEnv,
104
+ }
105
+ async function prepareProcessEnvironment(options) {
106
+ const restoreEnv = getManagedSessionRestoreEnv(options);
107
+ const compatibilityEnv = getOwnedManagedSessionCompatibilityEnv(options);
108
+ const overrides = {
109
+ ...(options.ownedManagedSession === true
110
+ ? { [AGENT_BROWSER_IDLE_TIMEOUT_ENV]: String(getImplicitSessionIdleTimeoutMs()) }
111
+ : {}),
112
+ ...restoreEnv,
113
+ ...options.env,
114
+ ...getManagedSessionRestoreProtectedEnv(options, restoreEnv),
115
+ ...getOwnedManagedSessionNamespaceEnv(options),
116
+ ...compatibilityEnv,
385
117
  };
386
- const explicitSocketDir = processOverrides[AGENT_BROWSER_SOCKET_DIR_ENV];
387
- let effectiveEnv = explicitSocketDir === undefined ? { ...processOverrides, [AGENT_BROWSER_SOCKET_DIR_ENV]: undefined } : processOverrides;
388
- const requestedSocketDir = resolveAgentBrowserSocketDir({ env: processOverrides, ownedManagedSession, parentEnv });
389
- if (requestedSocketDir !== undefined) {
390
- const socketDirError = requestedSocketDir.length > 0
391
- ? await getAgentBrowserSocketDirValidationError(requestedSocketDir)
118
+ let effectiveEnv = overrides[AGENT_BROWSER_SOCKET_DIR_ENV] === undefined
119
+ ? { ...overrides, [AGENT_BROWSER_SOCKET_DIR_ENV]: undefined }
120
+ : overrides;
121
+ const socketDir = resolveAgentBrowserSocketDir({
122
+ env: overrides,
123
+ ownedManagedSession: options.ownedManagedSession,
124
+ parentEnv: options.parentEnv,
125
+ });
126
+ if (socketDir !== undefined) {
127
+ const directoryError = socketDir.length > 0
128
+ ? await getAgentBrowserSocketDirValidationError(socketDir)
392
129
  : "the configured path is empty";
393
- if (signal?.aborted)
394
- return cancelledResult();
395
- const socketPathError = socketDirError ? undefined : getAgentBrowserSocketPathValidationError({ args, env: effectiveEnv, socketDir: requestedSocketDir });
396
- if (socketDirError || socketPathError) {
130
+ const pathError = directoryError === undefined
131
+ ? getAgentBrowserSocketPathValidationError({
132
+ args: options.args,
133
+ env: effectiveEnv,
134
+ socketDir,
135
+ })
136
+ : undefined;
137
+ if (directoryError !== undefined || pathError !== undefined) {
397
138
  return {
398
- aborted: false,
399
- agentBrowserStarted: false,
400
- exitCode: 1,
401
- spawnError: new Error(socketPathError ?? `Agent-browser socket storage ${JSON.stringify(requestedSocketDir)} is unusable: ${socketDirError}. Use an absolute directory owned by the current uid with mode 0700 and remove foreign, symlink, or special entries.`),
402
- stderr: "",
403
- stdout: "",
404
- timedOut: false,
139
+ env: effectiveEnv,
140
+ error: pathError ??
141
+ `Agent-browser socket storage ${JSON.stringify(socketDir)} is unusable: ${directoryError ?? "unknown error"}. Use an absolute directory owned by the current uid with mode 0700 and remove foreign, symlink, or special entries.`,
405
142
  };
406
143
  }
407
- effectiveEnv = { ...effectiveEnv, [AGENT_BROWSER_SOCKET_DIR_ENV]: requestedSocketDir };
144
+ effectiveEnv = { ...effectiveEnv, [AGENT_BROWSER_SOCKET_DIR_ENV]: socketDir };
408
145
  }
409
- const childEnv = buildAgentBrowserProcessEnv(parentEnv, effectiveEnv);
410
- const stockLauncher = resolveWindowsStockLauncher(cwd, childEnv);
411
- if (signal?.aborted)
146
+ return {
147
+ env: buildAgentBrowserProcessEnv(options.parentEnv, effectiveEnv),
148
+ userAgent: compatibilityEnv.AGENT_BROWSER_USER_AGENT,
149
+ };
150
+ }
151
+ function restoreOptionsForProcess(options) {
152
+ return {
153
+ args: options.args,
154
+ cwd: options.cwd,
155
+ env: options.env,
156
+ ownedManagedSession: options.ownedManagedSession === true || isOwnedManagedSessionTarget(options.args),
157
+ parentEnv: getAgentBrowserProcessEnvironment(),
158
+ restoreState: options.managedSessionRestoreState,
159
+ stdin: options.stdin,
160
+ };
161
+ }
162
+ function effectiveBrowserSpawnArgs(args, userAgent, preserveAttached) {
163
+ return prepareAgentBrowserSpawnArgs(getAgentBrowserProcessArgs(args), userAgent, preserveAttached === true || attachedBrowserSessionContext.getStore() === true, chromeStartupArgsContext.getStore());
164
+ }
165
+ export async function runAgentBrowserProcess(options) {
166
+ const { signal } = options;
167
+ const timeoutMs = options.timeoutMs ?? getAgentBrowserProcessTimeoutMs();
168
+ const deadlineExpired = () => signal?.reason instanceof Error && signal.reason.name === "TimeoutError";
169
+ const cancelledResult = () => ({
170
+ aborted: !deadlineExpired(),
171
+ agentBrowserStarted: false,
172
+ exitCode: deadlineExpired() ? 124 : 1,
173
+ stderr: "",
174
+ stdout: "",
175
+ timedOut: deadlineExpired(),
176
+ timeoutMs: deadlineExpired() ? timeoutMs : undefined,
177
+ });
178
+ if (signal?.aborted === true) {
412
179
  return cancelledResult();
413
- return await new Promise((resolve) => {
414
- let aborted = false;
415
- let agentBrowserStarted = false;
416
- let settled = false;
417
- let spawnError;
418
- let stderr = "";
419
- let stdoutBuffers = [];
420
- let stdoutBufferedBytes = 0;
421
- let stdoutTail = "";
422
- let stdoutSpillHandle;
423
- let stdoutSpillPath;
424
- let stdoutSpillPending = false;
425
- let pendingStdoutWrite = Promise.resolve();
426
- let stdoutSpillError;
427
- let pendingTermination;
428
- let killTimer;
429
- let timeoutTimer;
430
- let abortListener;
431
- let timedOut = false;
432
- let completionWatcher;
433
- const queueStdoutChunk = (buffer) => {
434
- stdoutTail = appendTail(stdoutTail, buffer.toString("utf8"), MAX_BUFFERED_STDOUT_TAIL_CHARS);
435
- if (stdoutSpillError)
436
- return;
437
- if (!stdoutSpillPending && !stdoutSpillPath && stdoutBufferedBytes + buffer.length <= MAX_BUFFERED_STDOUT_BYTES) {
438
- stdoutBuffers.push(buffer);
439
- stdoutBufferedBytes += buffer.length;
440
- return;
441
- }
442
- stdoutSpillPending = true;
443
- pendingStdoutWrite = pendingStdoutWrite
444
- .then(async () => {
445
- if (stdoutSpillError)
446
- return;
447
- if (!stdoutSpillHandle || !stdoutSpillPath) {
448
- const tempFile = await openSecureTempFile(PROCESS_STDOUT_SPILL_FILE_PREFIX, ".json");
449
- stdoutSpillHandle = tempFile.fileHandle;
450
- stdoutSpillPath = tempFile.path;
451
- if (stdoutBuffers.length > 0) {
452
- await writeSecureTempChunk({
453
- content: Buffer.concat(stdoutBuffers),
454
- fileHandle: stdoutSpillHandle,
455
- path: stdoutSpillPath,
456
- });
457
- stdoutBuffers = [];
458
- stdoutBufferedBytes = 0;
459
- }
460
- }
461
- await writeSecureTempChunk({ content: buffer, fileHandle: stdoutSpillHandle, path: stdoutSpillPath });
462
- })
463
- .catch((error) => {
464
- stdoutSpillError = error instanceof Error ? error : new Error(String(error));
465
- });
466
- };
467
- const removeAbortListener = () => {
468
- if (!signal || !abortListener)
469
- return;
470
- signal.removeEventListener("abort", abortListener);
471
- abortListener = undefined;
472
- };
473
- const finish = (exitCode) => {
474
- if (settled)
475
- return;
476
- settled = true;
477
- removeAbortListener();
478
- if (killTimer) {
479
- clearTimeout(killTimer);
480
- }
481
- if (timeoutTimer) {
482
- clearTimeout(timeoutTimer);
483
- }
484
- completionWatcher?.clear();
485
- void pendingStdoutWrite.finally(async () => {
486
- await pendingTermination;
487
- if (stdoutSpillHandle) {
488
- await stdoutSpillHandle.close().catch(() => undefined);
489
- }
490
- if (processPlatform === "win32" && !spawnError) {
491
- agentBrowserStarted = true;
492
- commitManagedSessionRestoreSuppression(managedSessionRestoreOptions);
493
- }
494
- if (!spawnError && stdoutSpillError) {
495
- spawnError = stdoutSpillError;
496
- }
497
- // Idempotent teardown: streams may already be destroyed by the post-`exit` fallback.
498
- destroySpawnedChildStreams(child);
499
- resolve({
500
- aborted,
501
- agentBrowserStarted,
502
- exitCode,
503
- spawnError,
504
- stderr,
505
- stdout: stdoutSpillPath ? stdoutTail : Buffer.concat(stdoutBuffers).toString("utf8"),
506
- stdoutSpillPath,
507
- timedOut,
508
- timeoutMs: timedOut ? timeoutMs : undefined,
509
- });
510
- });
511
- };
512
- const spawnPolicyError = getManagedPreSpawnPolicyError(managedSessionRestoreOptions, managedStateCurrentPageUrl, managedStatePageUrlUnknown, options.browserIndependentReadConfirmation);
513
- if (spawnPolicyError) {
514
- resolve({ aborted: false, agentBrowserStarted: false, exitCode: 1, spawnError: new Error(spawnPolicyError), stderr: "", stdout: "", timedOut: false });
515
- return;
516
- }
517
- const spawnBrowser = processPlatform === "win32" && !stockLauncher ? crossSpawn : spawn;
518
- const child = spawnBrowser(stockLauncher ?? "agent-browser", prepareAgentBrowserSpawnArgs(args, ownedManagedSessionCompatibilityEnv.AGENT_BROWSER_USER_AGENT, preserveAttachedBrowserSession, chromeStartupArgsContext.getStore()), {
519
- cwd,
520
- env: childEnv,
521
- stdio: ["pipe", "pipe", "pipe"],
522
- });
523
- if (processPlatform !== "win32") {
524
- child.once("spawn", () => {
525
- agentBrowserStarted = true;
526
- commitManagedSessionRestoreSuppression(managedSessionRestoreOptions);
527
- });
528
- }
529
- const terminateChild = (reason) => {
530
- if (settled)
531
- return;
532
- if (reason === "abort") {
533
- aborted = true;
534
- }
535
- else {
536
- timedOut = true;
537
- }
538
- if (pendingTermination)
539
- return;
540
- pendingTermination = terminateSpawnedChild(child, "SIGTERM");
541
- // Windows taskkill already forces the entire tree. A concurrent direct
542
- // kill would remove its root before traversal finishes.
543
- if (processPlatform !== "win32") {
544
- killTimer = setTimeout(() => {
545
- pendingTermination = terminateSpawnedChild(child, "SIGKILL");
546
- }, 2_000);
547
- }
548
- };
549
- const recordStdinError = (error) => {
550
- const stdinError = error instanceof Error ? error : new Error(String(error));
551
- const errorCode = stdinError.code;
552
- if (errorCode === "EPIPE" || errorCode === "EOF" || errorCode === "ERR_STREAM_DESTROYED") {
553
- return;
554
- }
555
- if (!spawnError) {
556
- spawnError = stdinError;
557
- }
558
- };
559
- const writeChildStdin = () => {
560
- if (aborted || signal?.aborted) {
561
- child.stdin.destroy();
562
- return;
563
- }
564
- try {
565
- if (stdin) {
566
- child.stdin.write(stdin);
567
- }
568
- child.stdin.end();
569
- }
570
- catch (error) {
571
- recordStdinError(error);
572
- child.stdin.destroy();
573
- }
574
- };
575
- child.stdin.on("error", recordStdinError);
576
- child.once("error", (error) => {
577
- spawnError = error instanceof Error ? error : new Error(String(error));
578
- finish(resolveSpawnedChildExitCode({
579
- useExitFallback: false,
580
- timedOut,
581
- spawnError,
582
- }));
583
- });
584
- completionWatcher = watchSpawnedChildCompletion(child, {
585
- graceMs: EXIT_STDIO_GRACE_MS,
586
- onComplete: finish,
587
- getContext: () => ({ timedOut, spawnError }),
588
- });
589
- child.stdout.on("data", (chunk) => {
590
- queueStdoutChunk(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
591
- });
592
- child.stderr.on("data", (chunk) => {
593
- stderr = appendTail(stderr, chunk.toString(), MAX_BUFFERED_STDERR_CHARS);
594
- });
595
- if (timeoutMs > 0) {
596
- timeoutTimer = setTimeout(() => terminateChild("timeout"), timeoutMs);
597
- timeoutTimer.unref?.();
598
- }
599
- if (signal) {
600
- abortListener = () => terminateChild(deadlineExpired() ? "timeout" : "abort");
601
- signal.addEventListener("abort", abortListener, { once: true });
602
- if (signal.aborted)
603
- abortListener();
604
- }
605
- writeChildStdin();
180
+ }
181
+ const restoreOptions = restoreOptionsForProcess(options);
182
+ const policyError = () => getManagedPreSpawnPolicyError(restoreOptions, options.managedStateCurrentPageUrl, options.managedStatePageUrlUnknown, options.nativeConfirmationDecision);
183
+ const planningError = policyError();
184
+ if (planningError !== undefined) {
185
+ return failureResult(planningError);
186
+ }
187
+ const prepared = await prepareProcessEnvironment(restoreOptions);
188
+ // Cancellation can arrive while filesystem validation is suspended.
189
+ // oxlint-disable-next-line typescript/no-unnecessary-condition
190
+ if (signal && signal.aborted) {
191
+ return cancelledResult();
192
+ }
193
+ if (prepared.error !== undefined) {
194
+ return failureResult(prepared.error);
195
+ }
196
+ const stockLauncher = resolveWindowsStockLauncher(options.cwd, prepared.env);
197
+ // A reentrant launch/environment observer can cancel during synchronous launch preparation.
198
+ // oxlint-disable-next-line typescript/no-unnecessary-condition
199
+ if (signal && signal.aborted) {
200
+ return cancelledResult();
201
+ }
202
+ return await runBrowserChild({
203
+ args: effectiveBrowserSpawnArgs(options.args, prepared.userAgent, options.preserveAttachedBrowserSession),
204
+ cwd: options.cwd,
205
+ env: prepared.env,
206
+ stockLauncher,
207
+ signal,
208
+ stdin: options.stdin,
209
+ timeoutMs,
210
+ deadlineExpired,
211
+ policyError,
212
+ onStarted: () => {
213
+ commitManagedSessionRestoreSuppression(restoreOptions);
214
+ },
606
215
  });
607
216
  }