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
@@ -0,0 +1,182 @@
1
+ import { isRecord } from "../../parsing.js";
2
+ import { withOptionalSessionArgs } from "../../results/next-actions.js";
3
+ import { redactSensitiveText } from "../../runtime-redaction.js";
4
+ import { extractBatchResultCommand, extractStringResultField, runSessionCommandData, } from "./session-state.js";
5
+ import { rawNumberField, rawStringField } from "./diagnostic-values.js";
6
+ const SELECTOR_TEXT_VISIBILITY_CANDIDATE_LIMIT = 8;
7
+ function buildVisibleTextProbeScript(selector) {
8
+ return `(() => {\n const selector = ${JSON.stringify(selector)};\n const isVisible = (element) => {\n const style = window.getComputedStyle(element);\n if (!style || style.display === 'none' || style.visibility === 'hidden' || style.visibility === 'collapse' || Number(style.opacity) === 0) return false;\n return Array.from(element.getClientRects()).some((rect) => rect.width > 0 && rect.height > 0);\n };\n let matches = [];\n try {\n matches = Array.from(document.querySelectorAll(selector));\n } catch (error) {\n return JSON.stringify({ selector, error: error instanceof Error ? error.message : String(error) });\n }\n const visible = matches.filter(isVisible);\n const trim = (value) => typeof value === 'string' ? value.trim().replace(/\\s+/g, ' ').slice(0, 200) : undefined;\n const describeCandidate = (element) => {\n const index = matches.indexOf(element);\n const role = element.getAttribute('role');\n const candidate = { index, tagName: element.tagName.toLowerCase(), textPreview: trim(element.textContent) };\n if (role) candidate.role = role;\n return candidate;\n };\n const visibleCandidates = visible.slice(0, ${SELECTOR_TEXT_VISIBILITY_CANDIDATE_LIMIT}).map(describeCandidate);\n return JSON.stringify({ selector, matchCount: matches.length, visibleCount: visible.length, firstMatchVisible: matches[0] ? isVisible(matches[0]) : undefined, firstTextPreview: trim(matches[0]?.textContent), firstVisibleTextPreview: trim(visible[0]?.textContent), visibleCandidates });\n})()`;
9
+ }
10
+ function parseVisibleTextCandidate(entry) {
11
+ if (!isRecord(entry) || typeof entry.index !== "number" || typeof entry.tagName !== "string") {
12
+ return [];
13
+ }
14
+ const role = rawStringField(entry, "role");
15
+ const text = rawStringField(entry, "textPreview");
16
+ const textPreview = text !== undefined && text !== "" ? redactSensitiveText(text) : undefined;
17
+ return [
18
+ {
19
+ index: entry.index,
20
+ tagName: entry.tagName,
21
+ ...(role !== undefined && role !== "" ? { role } : {}),
22
+ ...(textPreview !== undefined && textPreview !== "" ? { textPreview } : {}),
23
+ },
24
+ ];
25
+ }
26
+ function parseSelectorTextVisibilityCandidates(value) {
27
+ if (!Array.isArray(value)) {
28
+ return undefined;
29
+ }
30
+ const candidates = value.flatMap(parseVisibleTextCandidate);
31
+ return candidates.length > 0 ? candidates : undefined;
32
+ }
33
+ function parseSelectorTextVisibilityProbe(data, selector) {
34
+ const result = extractStringResultField(data, "result");
35
+ if (result === undefined) {
36
+ return undefined;
37
+ }
38
+ let parsed;
39
+ try {
40
+ parsed = JSON.parse(result);
41
+ }
42
+ catch {
43
+ return undefined;
44
+ }
45
+ if (!isRecord(parsed) || typeof parsed.error === "string") {
46
+ return undefined;
47
+ }
48
+ const matchCount = rawNumberField(parsed, "matchCount");
49
+ const visibleCount = rawNumberField(parsed, "visibleCount");
50
+ if (matchCount === undefined || visibleCount === undefined) {
51
+ return undefined;
52
+ }
53
+ const preview = rawStringField(parsed, "firstVisibleTextPreview");
54
+ return {
55
+ firstMatchVisible: typeof parsed.firstMatchVisible === "boolean" ? parsed.firstMatchVisible : undefined,
56
+ firstVisibleTextPreview: preview !== undefined && preview !== "" ? redactSensitiveText(preview) : undefined,
57
+ matchCount,
58
+ selector,
59
+ visibleCandidates: parseSelectorTextVisibilityCandidates(parsed.visibleCandidates),
60
+ visibleCount,
61
+ };
62
+ }
63
+ export function selectorMayExposeSensitiveLiteral(selector) {
64
+ return (redactSensitiveText(selector) !== selector ||
65
+ /\[[^\]]*[~|^$*]?=\s*(?:"[^"]*"|'[^']*'|[^\]\s]+)\s*(?:[is]\s*)?\]/.test(selector));
66
+ }
67
+ function canProbeVisibleText(selector) {
68
+ return (selector !== undefined &&
69
+ selector !== "" &&
70
+ !/^@e\d+$/.test(selector) &&
71
+ !/^#[A-Za-z_][\w-]*$/.test(selector) &&
72
+ !selectorMayExposeSensitiveLiteral(selector));
73
+ }
74
+ function selectorVisibilitySummary(parsed) {
75
+ const visibleMatchNoun = `visible match${parsed.visibleCount === 1 ? "" : "es"}`;
76
+ const visibleMatchVerb = parsed.visibleCount === 1 ? "exists" : "exist";
77
+ return parsed.firstMatchVisible === false
78
+ ? `Selector ${JSON.stringify(parsed.selector)} matched ${parsed.matchCount} elements; the first match is hidden while ${parsed.visibleCount} ${visibleMatchNoun} ${visibleMatchVerb}.`
79
+ : `Selector ${JSON.stringify(parsed.selector)} matched ${parsed.matchCount} elements; get text reads the first upstream match, which may not be the intended visible tab/panel.`;
80
+ }
81
+ async function collectSelectorTextVisibilityDiagnosticForSelector(options) {
82
+ const { selector } = options;
83
+ if (!canProbeVisibleText(selector)) {
84
+ return undefined;
85
+ }
86
+ const probe = await runSessionCommandData({
87
+ args: ["eval", "--stdin"],
88
+ cwd: options.cwd,
89
+ namespace: options.namespace,
90
+ sessionName: options.sessionName,
91
+ signal: options.signal,
92
+ stdin: buildVisibleTextProbeScript(selector),
93
+ });
94
+ const parsed = parseSelectorTextVisibilityProbe(probe, selector);
95
+ if (!parsed ||
96
+ (parsed.matchCount <= 1 && parsed.firstMatchVisible !== false) ||
97
+ parsed.visibleCount === 0) {
98
+ return undefined;
99
+ }
100
+ return { ...parsed, summary: selectorVisibilitySummary(parsed) };
101
+ }
102
+ function getBatchGetTextSelectors(data) {
103
+ if (!Array.isArray(data)) {
104
+ return [];
105
+ }
106
+ return data.flatMap((item) => {
107
+ if (!isRecord(item) || item.success === false) {
108
+ return [];
109
+ }
110
+ const tokens = extractBatchResultCommand(item);
111
+ const selector = tokens.at(2);
112
+ return tokens[0] === "get" && tokens[1] === "text" && selector !== undefined && selector !== ""
113
+ ? [selector]
114
+ : [];
115
+ });
116
+ }
117
+ export function getSuccessfulGetTextSelectors(options) {
118
+ if (options.commandInfo.command === "get" && options.commandInfo.subcommand === "text") {
119
+ return [options.commandTokens.at(2)].filter((selector) => typeof selector === "string" && selector.length > 0);
120
+ }
121
+ return options.commandInfo.command === "batch" ? getBatchGetTextSelectors(options.data) : [];
122
+ }
123
+ export async function collectSelectorTextVisibilityDiagnostics(options) {
124
+ const selectors = getSuccessfulGetTextSelectors(options);
125
+ const diagnostics = [];
126
+ for (const selector of selectors) {
127
+ // Native helper decisions and selector observations must remain in session order.
128
+ // oxlint-disable-next-line no-await-in-loop
129
+ const diagnostic = await collectSelectorTextVisibilityDiagnosticForSelector({
130
+ cwd: options.cwd,
131
+ namespace: options.namespace,
132
+ selector,
133
+ sessionName: options.sessionName,
134
+ signal: options.signal,
135
+ });
136
+ if (diagnostic) {
137
+ diagnostics.push(diagnostic);
138
+ }
139
+ }
140
+ return diagnostics.sort((left, right) => Number(right.firstMatchVisible === false) - Number(left.firstMatchVisible === false));
141
+ }
142
+ function formatVisibleCandidate(candidate) {
143
+ const role = candidate.role !== undefined && candidate.role !== "" ? ` role=${candidate.role}` : "";
144
+ const preview = candidate.textPreview !== undefined && candidate.textPreview !== ""
145
+ ? `: ${JSON.stringify(candidate.textPreview)}`
146
+ : "";
147
+ return `- [${candidate.index}] ${candidate.tagName}${role}${preview}`;
148
+ }
149
+ function formatSelectorVisibilityDiagnostic(diagnostic, index) {
150
+ const actionId = index === 0
151
+ ? "inspect-visible-text-candidates"
152
+ : `inspect-visible-text-candidates-${index + 1}`;
153
+ const lines = [`Selector text visibility warning: ${diagnostic.summary}`];
154
+ if (diagnostic.firstVisibleTextPreview !== undefined &&
155
+ diagnostic.firstVisibleTextPreview !== "") {
156
+ lines.push(`First visible text preview: ${JSON.stringify(diagnostic.firstVisibleTextPreview)}`);
157
+ }
158
+ if (diagnostic.visibleCandidates && diagnostic.visibleCandidates.length > 0) {
159
+ lines.push(`Visible candidates (${diagnostic.visibleCandidates.length} shown, querySelectorAll index):`, ...diagnostic.visibleCandidates.map(formatVisibleCandidate));
160
+ }
161
+ lines.push(`Next action: use details.nextActions ${actionId} before trusting this selector text.`);
162
+ return lines;
163
+ }
164
+ export function formatSelectorTextVisibilityText(diagnostics) {
165
+ return diagnostics.length === 0
166
+ ? undefined
167
+ : diagnostics.flatMap(formatSelectorVisibilityDiagnostic).join("\n");
168
+ }
169
+ export function buildSelectorTextVisibilityNextActions(options) {
170
+ return options.diagnostics.map((diagnostic, index) => ({
171
+ id: index === 0
172
+ ? "inspect-visible-text-candidates"
173
+ : `inspect-visible-text-candidates-${index + 1}`,
174
+ params: {
175
+ args: withOptionalSessionArgs(options.sessionName, ["eval", "--stdin"]),
176
+ stdin: buildVisibleTextProbeScript(diagnostic.selector),
177
+ },
178
+ reason: "Inspect selector match count and visible text before trusting get text on tabbed or hidden DOM content.",
179
+ safety: "Read-only DOM inspection; use a more specific visible selector or current @ref before acting on hidden-tab text.",
180
+ tool: "agent_browser",
181
+ }));
182
+ }
@@ -0,0 +1,256 @@
1
+ import { stat } from "node:fs/promises";
2
+ import { isAbsolute, resolve } from "node:path";
3
+ import { setTimeout as sleepMs } from "node:timers/promises";
4
+ import { isOpenNavigationCommand } from "../../command-taxonomy.js";
5
+ import { isBrowserIndependentRead } from "../../command-policy.js";
6
+ import { redactInvocationArgs, redactSensitiveText } from "../../runtime-redaction.js";
7
+ import { getUpstreamEffectiveBatchSteps } from "../batch-stdin.js";
8
+ import { getExplicitArtifactDestination } from "./artifact-paths.js";
9
+ import { extractStringResultField, runSessionCommandData } from "./session-state.js";
10
+ import { redactSensitivePathSegmentsForDiagnostic, sanitizeCurrentPageUrlForTimeoutDiagnostic, } from "./timeout-progress.js";
11
+ function getTimeoutProgressSteps(options) {
12
+ if (options.compiledJob) {
13
+ return options.compiledJob.steps.map((step, index) => ({
14
+ args: step.args,
15
+ generatedFrom: step.generatedFrom,
16
+ index: index + 1,
17
+ status: "unknown",
18
+ reason: "Upstream did not report this step's outcome before timeout.",
19
+ }));
20
+ }
21
+ return getUpstreamEffectiveBatchSteps(options.commandTokens, options.stdin).map((args, index) => ({
22
+ args,
23
+ index: index + 1,
24
+ status: "unknown",
25
+ reason: "Upstream did not report this step's outcome before timeout.",
26
+ }));
27
+ }
28
+ function getLastPositionalToken(args, startIndex = 1) {
29
+ for (let index = args.length - 1; index >= startIndex; index -= 1) {
30
+ const token = args[index];
31
+ if (token !== "" && !token.startsWith("-")) {
32
+ return token;
33
+ }
34
+ }
35
+ return undefined;
36
+ }
37
+ function getTimeoutStepArtifactPath(commandTokens) {
38
+ return ["screenshot", "pdf", "download", "wait"].includes(commandTokens[0])
39
+ ? getExplicitArtifactDestination(commandTokens)
40
+ : undefined;
41
+ }
42
+ async function statTimeoutArtifactPath(absolutePath) {
43
+ for (let attempt = 0; attempt < 3; attempt += 1) {
44
+ try {
45
+ // Retries observe a still-finishing native writer only after the prior stat settles.
46
+ // oxlint-disable-next-line no-await-in-loop
47
+ const stats = await stat(absolutePath);
48
+ return { exists: true, sizeBytes: stats.size };
49
+ }
50
+ catch {
51
+ if (attempt < 2) {
52
+ // Backoff must complete before the next artifact observation.
53
+ // oxlint-disable-next-line no-await-in-loop
54
+ await sleepMs(25);
55
+ }
56
+ }
57
+ }
58
+ return { exists: false };
59
+ }
60
+ async function collectTimeoutArtifactEvidence(cwd, steps) {
61
+ const evidence = [];
62
+ for (const step of steps) {
63
+ const path = getTimeoutStepArtifactPath(step.args);
64
+ if (path === undefined || path === "") {
65
+ continue;
66
+ }
67
+ const absolutePath = isAbsolute(path) ? path : resolve(cwd, path);
68
+ // Preserve each declared path's retry window before observing the next native step's output.
69
+ // oxlint-disable-next-line no-await-in-loop
70
+ const artifact = await statTimeoutArtifactPath(absolutePath);
71
+ evidence.push({
72
+ absolutePath,
73
+ exists: artifact.exists,
74
+ path,
75
+ ...(artifact.exists ? { sizeBytes: artifact.sizeBytes } : {}),
76
+ state: artifact.exists ? "verified" : "missing",
77
+ stepIndex: step.index,
78
+ });
79
+ }
80
+ return evidence;
81
+ }
82
+ function getPlannedCurrentPageUrl(steps) {
83
+ for (let index = steps.length - 1; index >= 0; index -= 1) {
84
+ const args = steps.at(index)?.args ?? [];
85
+ if (isOpenNavigationCommand(args[0]) || args[0] === "pushstate") {
86
+ return getLastPositionalToken(args);
87
+ }
88
+ }
89
+ return undefined;
90
+ }
91
+ const TIMEOUT_RETRYABLE_COMMANDS = new Set([
92
+ "console",
93
+ "diff",
94
+ "errors",
95
+ "get",
96
+ "goto",
97
+ "navigate",
98
+ "network",
99
+ "open",
100
+ "pdf",
101
+ "pushstate",
102
+ "screenshot",
103
+ "snapshot",
104
+ "tab",
105
+ "vitals",
106
+ "wait",
107
+ ]);
108
+ function getTimeoutStepRetry(step) {
109
+ const command = step.args.at(0);
110
+ return command !== undefined && command !== "" && TIMEOUT_RETRYABLE_COMMANDS.has(command)
111
+ ? { args: ["batch"], stdin: JSON.stringify([step.args]) }
112
+ : undefined;
113
+ }
114
+ function timeoutRetryStep(steps) {
115
+ const singleStep = steps.length === 1 ? steps.at(0) : undefined;
116
+ const retry = singleStep ? getTimeoutStepRetry(singleStep) : undefined;
117
+ return singleStep && retry ? { ...singleStep, retry } : undefined;
118
+ }
119
+ function currentPageSource(recoveredUrl, plannedUrl, title) {
120
+ if ((recoveredUrl ?? "") !== "") {
121
+ return "live";
122
+ }
123
+ if ((plannedUrl ?? "") !== "") {
124
+ return "planned";
125
+ }
126
+ return (title ?? "") !== "" ? "live" : undefined;
127
+ }
128
+ async function probeTimeoutPage(options) {
129
+ const urlData = await runSessionCommandData({
130
+ args: ["get", "url"],
131
+ cwd: options.cwd,
132
+ namespace: options.namespace,
133
+ sessionName: options.sessionName,
134
+ });
135
+ const recoveredUrl = extractStringResultField(urlData, "result") ?? extractStringResultField(urlData, "url");
136
+ const titleData = (recoveredUrl ?? "") !== ""
137
+ ? await runSessionCommandData({
138
+ args: ["get", "title"],
139
+ cwd: options.cwd,
140
+ namespace: options.namespace,
141
+ sessionName: options.sessionName,
142
+ })
143
+ : undefined;
144
+ const title = extractStringResultField(titleData, "result") ?? extractStringResultField(titleData, "title");
145
+ return { recoveredUrl, title };
146
+ }
147
+ function timeoutPageSummary(recoveredUrl, title, plannedUrl) {
148
+ if ((recoveredUrl ?? "") !== "" || (title ?? "") !== "") {
149
+ return " and current page state";
150
+ }
151
+ return (plannedUrl ?? "") !== "" ? " and planned page URL" : "";
152
+ }
153
+ function buildTimeoutPage(observed, steps) {
154
+ const { recoveredUrl, title } = observed;
155
+ const plannedUrl = (recoveredUrl ?? "") !== "" ? undefined : getPlannedCurrentPageUrl(steps);
156
+ const url = recoveredUrl ?? plannedUrl;
157
+ const source = currentPageSource(recoveredUrl, plannedUrl, title);
158
+ return {
159
+ currentPage: (url ?? "") !== "" || (title ?? "") !== "" ? { source, title, url } : undefined,
160
+ liveUrlRecovered: recoveredUrl !== undefined,
161
+ summary: timeoutPageSummary(recoveredUrl, title, plannedUrl),
162
+ };
163
+ }
164
+ function formatTimeoutSummary(stepCount, artifacts, pageSummary) {
165
+ const foundArtifacts = artifacts.filter((artifact) => artifact.exists).length;
166
+ return `Timed out before upstream returned final results; ${stepCount} planned step outcome${stepCount === 1 ? " is" : "s are"} unknown. Found ${foundArtifacts}/${artifacts.length} declared artifact path${artifacts.length === 1 ? "" : "s"}${pageSummary}; these observations do not prove step execution.`;
167
+ }
168
+ export async function collectTimeoutPartialProgress(options) {
169
+ if ((options.commandTokens[0] === "session" && options.commandTokens[1] === "info") ||
170
+ isBrowserIndependentRead(options.commandTokens, options.stdin)) {
171
+ return undefined;
172
+ }
173
+ const rawSteps = getTimeoutProgressSteps(options);
174
+ const artifacts = await collectTimeoutArtifactEvidence(options.operationCwd ?? options.cwd, rawSteps);
175
+ const page = buildTimeoutPage(await probeTimeoutPage(options), rawSteps);
176
+ if (rawSteps.length === 0 && artifacts.length === 0 && !page.currentPage) {
177
+ return undefined;
178
+ }
179
+ // A matching URL or existing file is current state, not an execution receipt.
180
+ const steps = rawSteps;
181
+ return {
182
+ artifacts,
183
+ currentPage: page.currentPage,
184
+ liveUrlRecovered: page.liveUrlRecovered,
185
+ retryStep: timeoutRetryStep(steps),
186
+ steps: steps.length > 0 ? steps : undefined,
187
+ summary: formatTimeoutSummary(steps.length, artifacts, page.summary),
188
+ };
189
+ }
190
+ function formatTimeoutSteps(steps) {
191
+ if (!steps || steps.length === 0) {
192
+ return [];
193
+ }
194
+ const shownSteps = steps.slice(0, 6);
195
+ const lines = [
196
+ "Planned steps:",
197
+ ...shownSteps.map((step) => {
198
+ const commandText = redactSensitivePathSegmentsForDiagnostic(redactInvocationArgs(step.args).join(" "));
199
+ const generatedFrom = step.generatedFrom !== undefined && step.generatedFrom !== ""
200
+ ? `, generated from ${step.generatedFrom}`
201
+ : "";
202
+ const reason = step.reason !== undefined && step.reason !== ""
203
+ ? ` — ${redactSensitivePathSegmentsForDiagnostic(redactSensitiveText(step.reason))}`
204
+ : "";
205
+ return `- Step ${step.index} [${step.status}${generatedFrom}]: ${commandText}${reason}`;
206
+ }),
207
+ ];
208
+ if (steps.length > shownSteps.length) {
209
+ lines.push(`- ... ${steps.length - shownSteps.length} more step${steps.length - shownSteps.length === 1 ? "" : "s"} omitted`);
210
+ }
211
+ return lines;
212
+ }
213
+ function formatTimeoutRetry(step, pageTargetUnknown) {
214
+ if (!step?.retry) {
215
+ return undefined;
216
+ }
217
+ const payload = JSON.stringify({
218
+ ...step.retry,
219
+ stdin: JSON.stringify([redactInvocationArgs(step.args)]),
220
+ });
221
+ return pageTargetUnknown
222
+ ? `Retry candidate for step ${step.index}: ${payload}. Verify the current URL before running it.`
223
+ : `Retry candidate for step ${step.index} (outcome unknown): ${payload}`;
224
+ }
225
+ function formatTimeoutArtifact(artifact) {
226
+ const size = typeof artifact.sizeBytes === "number" ? `, ${artifact.sizeBytes} bytes` : "";
227
+ const state = artifact.exists ? `exists${size}` : "missing";
228
+ return `Artifact from step ${artifact.stepIndex}: ${redactSensitivePathSegmentsForDiagnostic(artifact.path)} (${state})`;
229
+ }
230
+ function formatTimeoutCurrentPage(page) {
231
+ if (!page) {
232
+ return undefined;
233
+ }
234
+ const title = page.title ?? "";
235
+ const url = page.url ?? "";
236
+ if (title === "" && url === "") {
237
+ return undefined;
238
+ }
239
+ const currentPageTitle = title !== "" ? redactSensitivePathSegmentsForDiagnostic(redactSensitiveText(title)) : undefined;
240
+ const currentPageUrl = url !== "" ? sanitizeCurrentPageUrlForTimeoutDiagnostic(url) : undefined;
241
+ return `Current page: ${[currentPageTitle, currentPageUrl].filter(Boolean).join(" — ")}`;
242
+ }
243
+ export function formatTimeoutPartialProgressText(progress, pageTargetUnknown = false) {
244
+ const lines = [`Timeout partial progress: ${progress.summary}`];
245
+ const currentPage = formatTimeoutCurrentPage(progress.currentPage);
246
+ if (currentPage !== undefined) {
247
+ lines.push(currentPage);
248
+ }
249
+ lines.push(...formatTimeoutSteps(progress.steps));
250
+ const retry = formatTimeoutRetry(progress.retryStep, pageTargetUnknown);
251
+ if (retry !== undefined) {
252
+ lines.push(retry);
253
+ }
254
+ lines.push(...progress.artifacts.map(formatTimeoutArtifact));
255
+ return lines.join("\n");
256
+ }
@@ -0,0 +1,108 @@
1
+ import { isRecord } from "../../parsing.js";
2
+ import { redactSensitiveText } from "../../runtime-redaction.js";
3
+ function isStringList(value) {
4
+ return Array.isArray(value) && value.every((item) => typeof item === "string");
5
+ }
6
+ function optionalStringFields(value, fields) {
7
+ return fields.every((field) => value[field] === undefined || typeof value[field] === "string");
8
+ }
9
+ function isTimeoutArtifact(value) {
10
+ return (isRecord(value) &&
11
+ typeof value.absolutePath === "string" &&
12
+ typeof value.exists === "boolean" &&
13
+ typeof value.path === "string" &&
14
+ (value.sizeBytes === undefined || typeof value.sizeBytes === "number") &&
15
+ (value.state === "missing" || value.state === "verified") &&
16
+ typeof value.stepIndex === "number");
17
+ }
18
+ function isTimeoutRetry(value) {
19
+ return (value === undefined ||
20
+ (isRecord(value) && isStringList(value.args) && typeof value.stdin === "string"));
21
+ }
22
+ function isTimeoutStep(value) {
23
+ return (isRecord(value) &&
24
+ isStringList(value.args) &&
25
+ typeof value.index === "number" &&
26
+ value.status === "unknown" &&
27
+ optionalStringFields(value, ["generatedFrom", "reason"]) &&
28
+ isTimeoutRetry(value.retry));
29
+ }
30
+ function isTimeoutCurrentPage(value) {
31
+ return (value === undefined ||
32
+ (isRecord(value) &&
33
+ (value.source === undefined || value.source === "live" || value.source === "planned") &&
34
+ optionalStringFields(value, ["title", "url"])));
35
+ }
36
+ function isTimeoutSteps(value) {
37
+ return value === undefined || (Array.isArray(value) && value.every(isTimeoutStep));
38
+ }
39
+ export function isTimeoutPartialProgress(value) {
40
+ if (!isRecord(value) ||
41
+ !Array.isArray(value.artifacts) ||
42
+ !value.artifacts.every(isTimeoutArtifact)) {
43
+ return false;
44
+ }
45
+ return (typeof value.summary === "string" &&
46
+ isTimeoutCurrentPage(value.currentPage) &&
47
+ (value.liveUrlRecovered === undefined || typeof value.liveUrlRecovered === "boolean") &&
48
+ (value.retryStep === undefined || isTimeoutStep(value.retryStep)) &&
49
+ isTimeoutSteps(value.steps));
50
+ }
51
+ export function redactSensitivePathSegmentsForDiagnostic(path) {
52
+ return path
53
+ .split(/([/\\]+)/)
54
+ .map((segment) => {
55
+ if (segment === "/" || segment === "\\" || /^[/\\]+$/.test(segment)) {
56
+ return segment;
57
+ }
58
+ return redactSensitiveText(segment) !== segment ||
59
+ /(?:secret|token|password|passwd|credential|auth|api[-_]?key|bearer)/i.test(segment)
60
+ ? "[REDACTED]"
61
+ : segment;
62
+ })
63
+ .join("");
64
+ }
65
+ export function sanitizeCurrentPageUrlForTimeoutDiagnostic(url) {
66
+ try {
67
+ const parsedUrl = new URL(url);
68
+ parsedUrl.pathname = parsedUrl.pathname
69
+ .split("/")
70
+ .map(redactSensitivePathSegmentsForDiagnostic)
71
+ .join("/");
72
+ for (const [key, value] of parsedUrl.searchParams.entries()) {
73
+ if (redactSensitiveText(key) !== key ||
74
+ redactSensitiveText(value) !== value ||
75
+ /(?:secret|token|password|passwd|credential|auth|api[-_]?key|bearer)/i.test(`${key} ${value}`)) {
76
+ parsedUrl.searchParams.set(key, "[REDACTED]");
77
+ }
78
+ }
79
+ if (parsedUrl.hash !== "") {
80
+ parsedUrl.hash = redactSensitivePathSegmentsForDiagnostic(redactSensitiveText(parsedUrl.hash));
81
+ }
82
+ return redactSensitiveText(parsedUrl.toString());
83
+ }
84
+ catch {
85
+ return redactSensitivePathSegmentsForDiagnostic(redactSensitiveText(url));
86
+ }
87
+ }
88
+ function redactProgressValue(value) {
89
+ if (typeof value === "string") {
90
+ return /^https?:\/\//i.test(value)
91
+ ? sanitizeCurrentPageUrlForTimeoutDiagnostic(value)
92
+ : redactSensitivePathSegmentsForDiagnostic(redactSensitiveText(value));
93
+ }
94
+ if (Array.isArray(value)) {
95
+ return value.map(redactProgressValue);
96
+ }
97
+ if (isRecord(value)) {
98
+ return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, redactProgressValue(item)]));
99
+ }
100
+ return value;
101
+ }
102
+ export function redactTimeoutPartialProgress(progress) {
103
+ const redacted = redactProgressValue(progress);
104
+ if (!isTimeoutPartialProgress(redacted)) {
105
+ throw new Error("Invalid timeout partial-progress evidence.");
106
+ }
107
+ return redacted;
108
+ }
@@ -0,0 +1,39 @@
1
+ import { isRecord } from "../parsing.js";
2
+ export function collectCodeArtifactReceipts(value) {
3
+ if (!isRecord(value) || !Array.isArray(value.artifacts)) {
4
+ return [];
5
+ }
6
+ const entries = [];
7
+ for (const entry of value.artifacts) {
8
+ if (!isRecord(entry) || typeof entry.path !== "string") {
9
+ continue;
10
+ }
11
+ const states = [
12
+ "missing",
13
+ "pending",
14
+ "unverified",
15
+ "verified",
16
+ ];
17
+ const state = states.find((candidate) => candidate === entry.state);
18
+ if (state === undefined) {
19
+ continue;
20
+ }
21
+ entries.push({
22
+ ...entry,
23
+ path: entry.path,
24
+ state,
25
+ absolutePath: typeof entry.absolutePath === "string" ? entry.absolutePath : undefined,
26
+ });
27
+ }
28
+ return entries;
29
+ }
30
+ export function collectCodeFileArtifacts(value) {
31
+ if (!Array.isArray(value)) {
32
+ return [];
33
+ }
34
+ return value
35
+ .filter(isRecord)
36
+ .flatMap((entry) => typeof entry.absolutePath === "string"
37
+ ? [{ ...entry, absolutePath: entry.absolutePath }]
38
+ : []);
39
+ }