pi-agent-browser-native 0.9.3 → 0.9.5

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