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,287 @@
1
+ const PATH_PATTERN = /(?:^|[\s"'`(:])((?:\/[^\s"'`),;]+|[A-Za-z]:[\\/][^\s"'`),;]+|\.{1,2}[\\/][^\s"'`),;]+|[^\s"'`()[\],;:\\/]+(?:[\\/][^\s"'`()[\],;\\/]+)+|[^\s"'`()[\],;:\\/]+)\.(?:png|jpe?g|webp|gif|webm|mp4|har|pdf|trace|json))(?=[\s"'`),;.!?]|$)/gi;
2
+ const COLON_OUTPUT_INTENT_PATTERN = /\b(?:capture|create|export|generate|output|record|render|save|screenshot|start|take|write)\s+(?:(?:a|an|another|the)\s+)?(?:short\s+)?(?:(?:full[- ]page|page|screen)\s+)?(?:image|page|recordings?|screenshots?|screen|video)\s*:\s*$/i;
3
+ const OUTPUT_INTENT_PATTERN = /\b(?:capture|create|export|generate|output|record|render|save|screenshot|start|take|write)\s+(?:(?:a|an|another|the|this)\s+)?(?:short\s+)?(?:(?:full[- ]page|page|screen)\s+)?(?:image|page|recordings?|screenshots?|screen|video)\s+(?:directly\s+)?(?:\b(?:at|as|to)\b\s*[:=-]?|\bhere\b(?:\s+(?:if|when)\s+(?:recordings?\s+)?(?:(?:are|is)\s+)?available)?\s*[:=-]?)\s*$|\b(?:export|output|save|write)\s+(?:it\s+)?(?:at|as|to)\s*[:=-]?\s*$/i;
4
+ const UNSAFE_OUTPUT_PREFIX_PATTERN = /n['’]t\b|\b(?:cannot|disallowed|forbidden|maybe|needed|never|no|not|optional(?:ly)?|perhaps|prohibited|rather|refrain|unable|without)\b|\b(?:he|i|it|she|they|we|you)\s+(?:can|could|may|might)\b/i;
5
+ const AFFIRMATIVE_PREFIX_PATTERN = /^(?:(?:and(?:\s+then)?|then)(?:\s+please)?|please|you|(?:be|make)\s+sure\s+to|(?:can|could|will|would)\s+you(?:\s+please)?|(?:i|we)\s+(?:need|want)\s+you\s+to|you\s+(?:must|should))$/i;
6
+ const AFFIRMATIVE_LEAD_IN_PATTERN = /^(?:please\s+)?(?:capture|create|export|generate|output|record|render|save|screenshot|start|take|write)\b.*(?:[,\-:–—]|\b(?:and|then))\s*$/i;
7
+ const LIST_CONNECTOR_PATTERN = /^[\s"'`()[\]{},;:.*!?/&+>-]*(?:(?:and|or)[\s"'`()[\]{},;:.*!?/&+>-]*)?$/i;
8
+ const LIST_PREFIX_PATTERN = /^\s*(?:(?:[-*+]|\d+[.)])\s*)/;
9
+ const OPTIONAL_RECORDING_PATTERN = /\b(?:if|when)\s+(?:recordings?\s+)?(?:(?:are|is)\s+)?available\b/i;
10
+ const STANDALONE_OPTIONAL_RECORDING_PATTERN = /^\s*(?:if|when)\s+(?:recordings?\s+)?(?:(?:are|is)\s+)?available[.:;]?\s*$/i;
11
+ const EXPLICIT_OPTIONAL_PATTERN = /\b(?:optionally|if\s+(?:convenient|desired|needed|possible|you\s+can|you\s+want\s+to)|when\s+(?:convenient|desired|needed|possible)|only\s+if\s+you\s+(?:can|want\s+to))\b/i;
12
+ const REFERENCE_INTENT_PATTERN = /\btake\s+the\s+(?:image|recording|screenshot|video)\s+(?:at|from)\b/i;
13
+ const CLAUSE_BOUNDARY_PATTERN = /(?:[;.!?](?:\s|$)|\b(?:but|instead)\b)/i;
14
+ function artifactKind(path) {
15
+ if (/\.(?:webm|mp4)$/i.test(path)) {
16
+ return "recording";
17
+ }
18
+ if (/\.(?:png|jpe?g|webp|gif)$/i.test(path)) {
19
+ return "screenshot";
20
+ }
21
+ return undefined;
22
+ }
23
+ function intentClause(context) {
24
+ return context.split(CLAUSE_BOUNDARY_PATTERN).at(-1) ?? context;
25
+ }
26
+ function trailingClause(context) {
27
+ return context.split(CLAUSE_BOUNDARY_PATTERN)[0] ?? context;
28
+ }
29
+ function hasOutputIntent(context) {
30
+ const clause = intentClause(context)
31
+ .replace(/\[[^\]\r\n]*\]\(\s*$/, "")
32
+ .replace(/[([{"'`]+\s*$/, "");
33
+ const match = clause.match(OUTPUT_INTENT_PATTERN) ?? clause.match(COLON_OUTPUT_INTENT_PATTERN);
34
+ if (!match) {
35
+ return false;
36
+ }
37
+ const prefix = clause.slice(0, match.index ?? 0);
38
+ const governingPrefix = prefix.split(/\b(?:before|unless|until)\b/i).at(-1) ?? prefix;
39
+ if (UNSAFE_OUTPUT_PREFIX_PATTERN.test(governingPrefix)) {
40
+ return false;
41
+ }
42
+ return (governingPrefix.trim().length === 0 ||
43
+ AFFIRMATIVE_PREFIX_PATTERN.test(governingPrefix.trim()) ||
44
+ AFFIRMATIVE_LEAD_IN_PATTERN.test(governingPrefix));
45
+ }
46
+ function stripListPrefix(context) {
47
+ return context.replace(LIST_PREFIX_PATTERN, "");
48
+ }
49
+ function pathMatches(line) {
50
+ PATH_PATTERN.lastIndex = 0;
51
+ const matches = [];
52
+ for (const match of line.matchAll(PATH_PATTERN)) {
53
+ const rawPath = match.at(1)?.trim();
54
+ if (rawPath === undefined || rawPath.length === 0) {
55
+ continue;
56
+ }
57
+ const path = rawPath.replace(/^[([{]+/, "");
58
+ if (path.length === 0) {
59
+ continue;
60
+ }
61
+ const start = match.index + match[0].indexOf(rawPath) + rawPath.indexOf(path);
62
+ matches.push({ end: start + path.length, path, start });
63
+ }
64
+ return matches;
65
+ }
66
+ /** Groups output candidates and optionality on one line; it owns no cross-line state. */
67
+ class ArtifactCandidateLine {
68
+ input;
69
+ candidates = [];
70
+ isPathList;
71
+ groupOptional = new Map();
72
+ remainder;
73
+ nextGroup = 0;
74
+ previousGroup;
75
+ previousKind;
76
+ previousPathEnd = 0;
77
+ constructor(input) {
78
+ this.input = input;
79
+ const pathless = stripListPrefix(input.line.replace(PATH_PATTERN, ""));
80
+ this.remainder = pathless.replace(/[\s"'`()[\],;:.*!?>-]+/g, "").toLowerCase();
81
+ const syntax = pathless
82
+ .replace(OPTIONAL_RECORDING_PATTERN, "")
83
+ .replace(EXPLICIT_OPTIONAL_PATTERN, "");
84
+ this.isPathList = input.matches.length > 0 && LIST_CONNECTOR_PATTERN.test(syntax);
85
+ for (let index = 0; index < input.matches.length; index += 1) {
86
+ this.collectCandidate(index);
87
+ }
88
+ this.applyTrailingOptionality();
89
+ }
90
+ candidateContext(index, localContext) {
91
+ if (index === 0 &&
92
+ (this.isPathList ||
93
+ this.remainder.length === 0 ||
94
+ ["file", "output", "path"].includes(this.remainder))) {
95
+ return `${this.input.previousLine}\n${localContext}`;
96
+ }
97
+ return localContext;
98
+ }
99
+ selectGroup(direct, priorLine, context) {
100
+ if (direct) {
101
+ const group = this.nextGroup++;
102
+ this.groupOptional.set(group, this.input.recordingOptional || OPTIONAL_RECORDING_PATTERN.test(intentClause(context)));
103
+ return group;
104
+ }
105
+ if (priorLine) {
106
+ const group = this.nextGroup++;
107
+ this.groupOptional.set(group, this.input.continuation?.required === false);
108
+ return group;
109
+ }
110
+ return undefined;
111
+ }
112
+ excludesCandidate(path, context, trailing, direct) {
113
+ if (/(?:^|[\\/])pi-(?:attachment|clipboard|paste|upload)-/i.test(path)) {
114
+ return true;
115
+ }
116
+ return (direct &&
117
+ (REFERENCE_INTENT_PATTERN.test(intentClause(context)) ||
118
+ EXPLICIT_OPTIONAL_PATTERN.test(intentClause(context)) ||
119
+ EXPLICIT_OPTIONAL_PATTERN.test(trailing)));
120
+ }
121
+ continuesPriorLine(index, kind, context) {
122
+ return (index === 0 &&
123
+ this.isPathList &&
124
+ kind === this.input.continuation?.kind &&
125
+ LIST_CONNECTOR_PATTERN.test(context));
126
+ }
127
+ continuesSameLine(kind, context) {
128
+ return (kind === this.previousKind &&
129
+ this.previousGroup !== undefined &&
130
+ LIST_CONNECTOR_PATTERN.test(context));
131
+ }
132
+ collectCandidate(index) {
133
+ const { end, path, start } = this.input.matches[index];
134
+ const localContext = stripListPrefix(this.input.line.slice(this.previousPathEnd, start));
135
+ const context = this.candidateContext(index, localContext);
136
+ const kind = artifactKind(path);
137
+ const direct = hasOutputIntent(context);
138
+ const sameLine = this.continuesSameLine(kind, localContext);
139
+ const priorLine = this.continuesPriorLine(index, kind, localContext);
140
+ const group = !direct && sameLine ? this.previousGroup : this.selectGroup(direct, priorLine, context);
141
+ const trailing = trailingClause(this.input.line.slice(end, this.input.matches[index + 1]?.start ?? this.input.line.length));
142
+ this.previousPathEnd = end;
143
+ if (kind === undefined ||
144
+ group === undefined ||
145
+ this.excludesCandidate(path, context, trailing, direct)) {
146
+ this.previousGroup = undefined;
147
+ this.previousKind = undefined;
148
+ return;
149
+ }
150
+ this.candidates.push({
151
+ continuedFromPriorLine: priorLine && !direct,
152
+ group,
153
+ kind,
154
+ matchIndex: index,
155
+ path,
156
+ });
157
+ this.previousGroup = group;
158
+ this.previousKind = kind;
159
+ }
160
+ applyTrailingOptionality() {
161
+ for (const candidate of this.candidates) {
162
+ const match = this.input.matches[candidate.matchIndex];
163
+ const nextStart = this.input.matches[candidate.matchIndex + 1]?.start ?? this.input.line.length;
164
+ if (OPTIONAL_RECORDING_PATTERN.test(trailingClause(this.input.line.slice(match.end, nextStart)))) {
165
+ this.groupOptional.set(candidate.group, true);
166
+ }
167
+ }
168
+ }
169
+ result() {
170
+ const candidates = [];
171
+ for (const candidate of this.candidates) {
172
+ candidates.push({
173
+ ...candidate,
174
+ required: candidate.kind === "screenshot" || this.groupOptional.get(candidate.group) !== true,
175
+ });
176
+ }
177
+ return { candidates, isPathList: this.isPathList };
178
+ }
179
+ }
180
+ /** Owns deduplication and list/fence state for one prompt; no parser state survives the call. */
181
+ class PromptArtifactCollector {
182
+ artifacts = [];
183
+ seen = new Map();
184
+ inCodeFence = false;
185
+ listArtifactIndexes = [];
186
+ continuation;
187
+ pendingRecordingAvailability = false;
188
+ resetList() {
189
+ this.listArtifactIndexes = [];
190
+ this.continuation = undefined;
191
+ }
192
+ applyRecordingAvailability() {
193
+ if (this.continuation?.kind !== "recording") {
194
+ this.pendingRecordingAvailability = true;
195
+ return;
196
+ }
197
+ for (const index of this.listArtifactIndexes) {
198
+ const artifact = this.artifacts[index];
199
+ if (artifact.kind === "recording") {
200
+ this.artifacts[index] = { ...artifact, required: false };
201
+ }
202
+ }
203
+ this.continuation = { ...this.continuation, required: false };
204
+ }
205
+ skipLine(line, matches) {
206
+ if (matches.length > 0) {
207
+ return false;
208
+ }
209
+ if (STANDALONE_OPTIONAL_RECORDING_PATTERN.test(line)) {
210
+ this.applyRecordingAvailability();
211
+ return true;
212
+ }
213
+ return (this.pendingRecordingAvailability && /\brecordings?\b/i.test(line) && hasOutputIntent(line));
214
+ }
215
+ storeCandidates(analysis) {
216
+ const indexes = [];
217
+ for (const candidate of analysis.candidates) {
218
+ const required = candidate.required;
219
+ const key = `${candidate.kind}:${candidate.path}`;
220
+ let index = this.seen.get(key);
221
+ if (index === undefined) {
222
+ index = this.artifacts.length;
223
+ this.seen.set(key, index);
224
+ this.artifacts.push({ kind: candidate.kind, path: candidate.path, required });
225
+ }
226
+ else if (required) {
227
+ this.artifacts[index] = { ...this.artifacts[index], required: true };
228
+ }
229
+ indexes.push(index);
230
+ }
231
+ return indexes;
232
+ }
233
+ updateContinuation(analysis, indexes, matchCount) {
234
+ const lastCandidate = analysis.candidates.at(-1);
235
+ const lastIndex = indexes.at(-1);
236
+ if (!analysis.isPathList ||
237
+ lastCandidate?.matchIndex !== matchCount - 1 ||
238
+ lastIndex === undefined) {
239
+ this.resetList();
240
+ return;
241
+ }
242
+ const lastArtifact = this.artifacts[lastIndex];
243
+ this.continuation = { kind: lastArtifact.kind, required: lastArtifact.required };
244
+ if (analysis.candidates[0]?.continuedFromPriorLine) {
245
+ this.listArtifactIndexes.push(...indexes);
246
+ }
247
+ else {
248
+ this.listArtifactIndexes = [...indexes];
249
+ }
250
+ }
251
+ collectLine(line, previousLine) {
252
+ if (/^\s*(?:`{3,}|~{3,})/.test(line)) {
253
+ this.inCodeFence = !this.inCodeFence;
254
+ this.resetList();
255
+ this.pendingRecordingAvailability = false;
256
+ return;
257
+ }
258
+ if (this.inCodeFence) {
259
+ return;
260
+ }
261
+ const matches = pathMatches(line);
262
+ if (this.skipLine(line, matches)) {
263
+ return;
264
+ }
265
+ const recordingOptional = matches.length > 0 && this.pendingRecordingAvailability;
266
+ this.pendingRecordingAvailability = false;
267
+ const analysis = new ArtifactCandidateLine({
268
+ line,
269
+ previousLine,
270
+ matches,
271
+ continuation: this.continuation,
272
+ recordingOptional,
273
+ }).result();
274
+ const indexes = this.storeCandidates(analysis);
275
+ this.updateContinuation(analysis, indexes, matches.length);
276
+ }
277
+ collect(prompt) {
278
+ const lines = prompt.split(/\r?\n/);
279
+ for (let index = 0; index < lines.length; index += 1) {
280
+ this.collectLine(lines[index] ?? "", lines[index - 1] ?? "");
281
+ }
282
+ return this.artifacts;
283
+ }
284
+ }
285
+ export function extractPromptRequestedArtifacts(prompt) {
286
+ return new PromptArtifactCollector().collect(prompt);
287
+ }
@@ -1,3 +1,5 @@
1
+ import { extractPromptRequestedArtifacts, } from "./prompt-artifacts.js";
2
+ import { isRecord } from "./parsing.js";
1
3
  const LEGACY_BASH_ALLOW_PATTERNS = [
2
4
  /\b(?:bash-oriented workflow|bash workflow)\b/i,
3
5
  /\b(?:use|via|through|with)\s+bash\b/i,
@@ -5,194 +7,6 @@ const LEGACY_BASH_ALLOW_PATTERNS = [
5
7
  /\bagent-browser\s+--(?:help|version)\b/i,
6
8
  /\bdebug(?:ging)?\b.*\b(?:agent[_ -]?browser|agent_browser|browser integration)\b/i,
7
9
  ];
8
- const PROMPT_ARTIFACT_PATH_PATTERN = /(?:^|[\s"'`(:])((?:\/[^\s"'`),;]+|[A-Za-z]:[\\/][^\s"'`),;]+|\.{1,2}[\\/][^\s"'`),;]+|[^\s"'`()[\],;:\\/]+(?:[\\/][^\s"'`()[\],;\\/]+)+|[^\s"'`()[\],;:\\/]+)\.(?:png|jpe?g|webp|gif|webm|mp4|har|pdf|trace|json))(?=[\s"'`),;.!?]|$)/gi;
9
- const PROMPT_ARTIFACT_COLON_OUTPUT_INTENT_PATTERN = /\b(?:capture|create|export|generate|output|record|render|save|screenshot|start|take|write)\s+(?:(?:a|an|another|the)\s+)?(?:short\s+)?(?:(?:full[- ]page|page|screen)\s+)?(?:image|page|recordings?|screenshots?|screen|video)\s*:\s*$/i;
10
- const PROMPT_ARTIFACT_OUTPUT_INTENT_PATTERN = /\b(?:capture|create|export|generate|output|record|render|save|screenshot|start|take|write)\s+(?:(?:a|an|another|the|this)\s+)?(?:short\s+)?(?:(?:full[- ]page|page|screen)\s+)?(?:image|page|recordings?|screenshots?|screen|video)\s+(?:directly\s+)?(?:\b(?:at|as|to)\b\s*[:=-]?|\bhere\b(?:\s+(?:if|when)\s+(?:recordings?\s+)?(?:(?:are|is)\s+)?available)?\s*[:=-]?)\s*$|\b(?:export|output|save|write)\s+(?:it\s+)?(?:at|as|to)\s*[:=-]?\s*$/i;
11
- const PROMPT_ARTIFACT_UNSAFE_OUTPUT_PREFIX_PATTERN = /n['’]t\b|\b(?:cannot|disallowed|forbidden|maybe|needed|never|no|not|optional(?:ly)?|perhaps|prohibited|rather|refrain|unable|without)\b|\b(?:he|i|it|she|they|we|you)\s+(?:can|could|may|might)\b/i;
12
- const PROMPT_ARTIFACT_AFFIRMATIVE_PREFIX_PATTERN = /^(?:(?:and(?:\s+then)?|then)(?:\s+please)?|please|you|(?:be|make)\s+sure\s+to|(?:can|could|will|would)\s+you(?:\s+please)?|(?:i|we)\s+(?:need|want)\s+you\s+to|you\s+(?:must|should))$/i;
13
- const PROMPT_ARTIFACT_AFFIRMATIVE_LEAD_IN_PATTERN = /^(?:please\s+)?(?:capture|create|export|generate|output|record|render|save|screenshot|start|take|write)\b.*(?:[,\-:–—]|\b(?:and|then))\s*$/i;
14
- const PROMPT_ARTIFACT_LIST_CONNECTOR_PATTERN = /^[\s"'`()\[\]{},;:.*!?\/&+>-]*(?:(?:and|or)[\s"'`()\[\]{},;:.*!?\/&+>-]*)?$/i;
15
- const PROMPT_ARTIFACT_LIST_PREFIX_PATTERN = /^\s*(?:(?:[-*+]|\d+[.)])\s*)/;
16
- const PROMPT_ARTIFACT_OPTIONAL_RECORDING_PATTERN = /\b(?:if|when)\s+(?:recordings?\s+)?(?:(?:are|is)\s+)?available\b/i;
17
- const PROMPT_ARTIFACT_STANDALONE_OPTIONAL_RECORDING_PATTERN = /^\s*(?:if|when)\s+(?:recordings?\s+)?(?:(?:are|is)\s+)?available[.:;]?\s*$/i;
18
- const PROMPT_ARTIFACT_EXPLICIT_OPTIONAL_PATTERN = /\b(?:optionally|if\s+(?:convenient|desired|needed|possible|you\s+can|you\s+want\s+to)|when\s+(?:convenient|desired|needed|possible)|only\s+if\s+you\s+(?:can|want\s+to))\b/i;
19
- const PROMPT_ARTIFACT_REFERENCE_INTENT_PATTERN = /\btake\s+the\s+(?:image|recording|screenshot|video)\s+(?:at|from)\b/i;
20
- const PROMPT_ARTIFACT_CLAUSE_BOUNDARY_PATTERN = /(?:[;.!?](?:\s|$)|\b(?:but|instead)\b)/i;
21
- function getPromptArtifactKind(path) {
22
- const lowerPath = path.toLowerCase();
23
- if (/\.(?:webm|mp4)$/.test(lowerPath))
24
- return "recording";
25
- if (/\.(?:png|jpe?g|webp|gif)$/.test(lowerPath))
26
- return "screenshot";
27
- return undefined;
28
- }
29
- function getPromptArtifactIntentClause(context) {
30
- return context.split(PROMPT_ARTIFACT_CLAUSE_BOUNDARY_PATTERN).at(-1) ?? context;
31
- }
32
- function getPromptArtifactTrailingClause(context) {
33
- return context.split(PROMPT_ARTIFACT_CLAUSE_BOUNDARY_PATTERN)[0] ?? context;
34
- }
35
- function hasPromptArtifactOutputIntent(context) {
36
- const clause = getPromptArtifactIntentClause(context)
37
- .replace(/\[[^\]\r\n]*\]\(\s*$/, "")
38
- .replace(/[([{\"'`]+\s*$/, "");
39
- const intentMatch = clause.match(PROMPT_ARTIFACT_OUTPUT_INTENT_PATTERN) ?? clause.match(PROMPT_ARTIFACT_COLON_OUTPUT_INTENT_PATTERN);
40
- if (!intentMatch)
41
- return false;
42
- const prefix = clause.slice(0, intentMatch.index ?? 0);
43
- const governingPrefix = prefix.split(/\b(?:before|unless|until)\b/i).at(-1) ?? prefix;
44
- if (PROMPT_ARTIFACT_UNSAFE_OUTPUT_PREFIX_PATTERN.test(governingPrefix))
45
- return false;
46
- const normalizedPrefix = governingPrefix.trim();
47
- return normalizedPrefix.length === 0
48
- || PROMPT_ARTIFACT_AFFIRMATIVE_PREFIX_PATTERN.test(normalizedPrefix)
49
- || PROMPT_ARTIFACT_AFFIRMATIVE_LEAD_IN_PATTERN.test(governingPrefix);
50
- }
51
- function stripPromptArtifactListPrefix(context) {
52
- return context.replace(PROMPT_ARTIFACT_LIST_PREFIX_PATTERN, "");
53
- }
54
- function normalizePromptArtifactPath(path) {
55
- return path.replace(/^[([{]+/, "");
56
- }
57
- function isLikelyInboundPromptArtifact(path) {
58
- return /(?:^|[\\/])pi-(?:attachment|clipboard|paste|upload)-/i.test(path);
59
- }
60
- function extractPromptRequestedArtifacts(prompt) {
61
- const artifacts = [];
62
- const seen = new Map();
63
- const lines = prompt.split(/\r?\n/);
64
- let inCodeFence = false;
65
- let listArtifactIndexes = [];
66
- let listContinuation;
67
- let pendingRecordingAvailability = false;
68
- for (let lineIndex = 0; lineIndex < lines.length; lineIndex += 1) {
69
- const line = lines[lineIndex] ?? "";
70
- if (/^\s*(?:`{3,}|~{3,})/.test(line)) {
71
- inCodeFence = !inCodeFence;
72
- listArtifactIndexes = [];
73
- listContinuation = undefined;
74
- pendingRecordingAvailability = false;
75
- continue;
76
- }
77
- if (inCodeFence)
78
- continue;
79
- PROMPT_ARTIFACT_PATH_PATTERN.lastIndex = 0;
80
- const pathMatches = [];
81
- for (const match of line.matchAll(PROMPT_ARTIFACT_PATH_PATTERN)) {
82
- const rawPath = match[1]?.trim();
83
- const path = rawPath ? normalizePromptArtifactPath(rawPath) : undefined;
84
- if (!path || !rawPath)
85
- continue;
86
- const start = (match.index ?? 0) + match[0].indexOf(rawPath) + rawPath.indexOf(path);
87
- pathMatches.push({ end: start + path.length, path, start });
88
- }
89
- if (pathMatches.length === 0 && PROMPT_ARTIFACT_STANDALONE_OPTIONAL_RECORDING_PATTERN.test(line)) {
90
- if (listContinuation?.kind === "recording") {
91
- for (const artifactIndex of listArtifactIndexes) {
92
- if (artifacts[artifactIndex]?.kind === "recording")
93
- artifacts[artifactIndex].required = false;
94
- }
95
- listContinuation = { ...listContinuation, required: false };
96
- }
97
- else {
98
- pendingRecordingAvailability = true;
99
- }
100
- continue;
101
- }
102
- if (pathMatches.length === 0 && pendingRecordingAvailability && /\brecordings?\b/i.test(line) && hasPromptArtifactOutputIntent(line))
103
- continue;
104
- const pendingRecordingAvailabilityForLine = pathMatches.length > 0 && pendingRecordingAvailability;
105
- pendingRecordingAvailability = false;
106
- const pathlessLine = stripPromptArtifactListPrefix(line.replace(PROMPT_ARTIFACT_PATH_PATTERN, ""));
107
- const remainder = pathlessLine.replace(/[\s"'`()\[\],;:.*!?>-]+/g, "").toLowerCase();
108
- const listSyntax = pathlessLine
109
- .replace(PROMPT_ARTIFACT_OPTIONAL_RECORDING_PATTERN, "")
110
- .replace(PROMPT_ARTIFACT_EXPLICIT_OPTIONAL_PATTERN, "");
111
- const isPathList = pathMatches.length > 0 && PROMPT_ARTIFACT_LIST_CONNECTOR_PATTERN.test(listSyntax);
112
- const groupOptional = new Map();
113
- const candidates = [];
114
- let nextGroup = 0;
115
- let previousGroup;
116
- let previousKind;
117
- let previousPathEnd = 0;
118
- for (let matchIndex = 0; matchIndex < pathMatches.length; matchIndex += 1) {
119
- const { end, path, start } = pathMatches[matchIndex];
120
- const localContext = stripPromptArtifactListPrefix(line.slice(previousPathEnd, start));
121
- const intentContext = matchIndex === 0 && (isPathList || !remainder || ["file", "output", "path"].includes(remainder))
122
- ? `${lines[lineIndex - 1] ?? ""}\n${localContext}`
123
- : localContext;
124
- const kind = getPromptArtifactKind(path);
125
- const directIntent = hasPromptArtifactOutputIntent(intentContext);
126
- const sameLineContinuation = kind === previousKind && previousGroup !== undefined && PROMPT_ARTIFACT_LIST_CONNECTOR_PATTERN.test(localContext);
127
- const priorLineContinuation = matchIndex === 0 && isPathList && kind === listContinuation?.kind && PROMPT_ARTIFACT_LIST_CONNECTOR_PATTERN.test(localContext);
128
- let group;
129
- if (directIntent) {
130
- group = nextGroup++;
131
- groupOptional.set(group, pendingRecordingAvailabilityForLine || PROMPT_ARTIFACT_OPTIONAL_RECORDING_PATTERN.test(getPromptArtifactIntentClause(intentContext)));
132
- }
133
- else if (sameLineContinuation) {
134
- group = previousGroup;
135
- }
136
- else if (priorLineContinuation) {
137
- group = nextGroup++;
138
- groupOptional.set(group, listContinuation?.required === false);
139
- }
140
- const referenceReading = directIntent && PROMPT_ARTIFACT_REFERENCE_INTENT_PATTERN.test(getPromptArtifactIntentClause(intentContext));
141
- const trailingContext = getPromptArtifactTrailingClause(line.slice(end, pathMatches[matchIndex + 1]?.start ?? line.length));
142
- const explicitlyOptional = directIntent && (PROMPT_ARTIFACT_EXPLICIT_OPTIONAL_PATTERN.test(getPromptArtifactIntentClause(intentContext))
143
- || PROMPT_ARTIFACT_EXPLICIT_OPTIONAL_PATTERN.test(trailingContext));
144
- if (!kind || group === undefined || referenceReading || explicitlyOptional || isLikelyInboundPromptArtifact(path)) {
145
- previousGroup = undefined;
146
- previousKind = undefined;
147
- previousPathEnd = end;
148
- continue;
149
- }
150
- candidates.push({ continuedFromPriorLine: priorLineContinuation && !directIntent, group, kind, matchIndex, path });
151
- previousGroup = group;
152
- previousKind = kind;
153
- previousPathEnd = end;
154
- }
155
- for (const candidate of candidates) {
156
- const match = pathMatches[candidate.matchIndex];
157
- const nextStart = pathMatches[candidate.matchIndex + 1]?.start ?? line.length;
158
- if (PROMPT_ARTIFACT_OPTIONAL_RECORDING_PATTERN.test(getPromptArtifactTrailingClause(line.slice(match.end, nextStart)))) {
159
- groupOptional.set(candidate.group, true);
160
- }
161
- }
162
- const lineArtifactIndexes = [];
163
- for (const candidate of candidates) {
164
- const required = candidate.kind === "screenshot" || groupOptional.get(candidate.group) !== true;
165
- const key = `${candidate.kind}:${candidate.path}`;
166
- let artifactIndex = seen.get(key);
167
- if (artifactIndex === undefined) {
168
- artifactIndex = artifacts.length;
169
- seen.set(key, artifactIndex);
170
- artifacts.push({ kind: candidate.kind, path: candidate.path, required });
171
- }
172
- else if (required) {
173
- artifacts[artifactIndex].required = true;
174
- }
175
- lineArtifactIndexes.push(artifactIndex);
176
- }
177
- const lastCandidate = candidates.at(-1);
178
- if (isPathList && lastCandidate?.matchIndex === pathMatches.length - 1) {
179
- const lastArtifact = artifacts[lineArtifactIndexes.at(-1)];
180
- listContinuation = { kind: lastArtifact.kind, required: lastArtifact.required };
181
- if (candidates[0]?.continuedFromPriorLine) {
182
- for (const artifactIndex of lineArtifactIndexes)
183
- listArtifactIndexes.push(artifactIndex);
184
- }
185
- else {
186
- listArtifactIndexes = lineArtifactIndexes;
187
- }
188
- }
189
- else {
190
- listArtifactIndexes = [];
191
- listContinuation = undefined;
192
- }
193
- }
194
- return artifacts;
195
- }
196
10
  export function buildPromptPolicy(prompt) {
197
11
  return {
198
12
  allowLegacyAgentBrowserBash: LEGACY_BASH_ALLOW_PATTERNS.some((pattern) => pattern.test(prompt)),
@@ -200,14 +14,17 @@ export function buildPromptPolicy(prompt) {
200
14
  };
201
15
  }
202
16
  export function getMessageText(content) {
203
- if (typeof content === "string")
17
+ if (typeof content === "string") {
204
18
  return content;
205
- if (!Array.isArray(content))
19
+ }
20
+ if (!Array.isArray(content)) {
206
21
  return "";
22
+ }
207
23
  return content
208
24
  .map((item) => {
209
- if (typeof item !== "object" || item === null)
25
+ if (!isRecord(item)) {
210
26
  return "";
27
+ }
211
28
  return item.type === "text" && typeof item.text === "string" ? item.text : "";
212
29
  })
213
30
  .filter((text) => text.length > 0)
@@ -218,15 +35,19 @@ export function getLatestUserMessage(manager) {
218
35
  let id = manager.getLeafId();
219
36
  const seen = new Set();
220
37
  while (id !== null) {
221
- if (typeof id !== "string" || seen.has(id))
38
+ if (typeof id !== "string" || seen.has(id)) {
222
39
  throw new Error("Latest user prompt ancestry is invalid or cyclic.");
40
+ }
223
41
  seen.add(id);
224
42
  const entry = manager.getEntry(id);
225
- if (!entry || entry.id !== id || entry.parentId !== null && typeof entry.parentId !== "string") {
43
+ if (!entry ||
44
+ entry.id !== id ||
45
+ (entry.parentId !== null && typeof entry.parentId !== "string")) {
226
46
  throw new Error("Latest user prompt ancestry is incomplete.");
227
47
  }
228
- if (entry.type === "message" && entry.message.role === "user")
48
+ if (entry.type === "message" && entry.message.role === "user") {
229
49
  return entry.message;
50
+ }
230
51
  id = entry.parentId;
231
52
  }
232
53
  return undefined;
@@ -0,0 +1,41 @@
1
+ const READ_VALUE_OPTIONS = new Set(["--filter", "--llms", "--timeout"]);
2
+ const READ_BOOLEAN_OPTIONS = new Set(["--raw", "--require-md", "--outline", "--json"]);
3
+ function validReadOption(flag, value) {
4
+ if (value === undefined) {
5
+ return false;
6
+ }
7
+ if (flag === "--llms") {
8
+ return ["index", "full"].includes(value);
9
+ }
10
+ if (flag === "--timeout") {
11
+ return /^\+?\d+$/.test(value) && BigInt(value) > 0n && BigInt(value) <= 18446744073709551615n;
12
+ }
13
+ return true;
14
+ }
15
+ // undefined is a valid DOM read; null is invalid native syntax, which must not trigger page helpers.
16
+ export function getExplicitReadUrl(commandTokens) {
17
+ if (commandTokens[0] !== "read") {
18
+ return undefined;
19
+ }
20
+ let url;
21
+ const options = new Set();
22
+ for (let index = 1; index < commandTokens.length; index += 1) {
23
+ const token = commandTokens[index];
24
+ if (READ_VALUE_OPTIONS.has(token)) {
25
+ if (!validReadOption(token, commandTokens.at(++index))) {
26
+ return null;
27
+ }
28
+ options.add(token);
29
+ }
30
+ else if (READ_BOOLEAN_OPTIONS.has(token)) {
31
+ options.add(token);
32
+ }
33
+ else if (token.startsWith("--") || url !== undefined) {
34
+ return null;
35
+ }
36
+ else {
37
+ url = token;
38
+ }
39
+ }
40
+ return options.has("--llms") && options.has("--outline") ? null : url;
41
+ }