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
@@ -1,65 +1,25 @@
1
- import { createHash, randomUUID } from "node:crypto";
2
- import { linkSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, statSync, unlinkSync, writeFileSync } from "node:fs";
1
+ import { lstatSync, mkdirSync, readdirSync, realpathSync } from "node:fs";
3
2
  import { homedir } from "node:os";
4
- import { dirname, isAbsolute, join, parse, resolve, win32 } from "node:path";
3
+ import { isAbsolute, join, win32 } from "node:path";
5
4
  import { canonicalizeAgentBrowserNamespace } from "./argv-grammar.js";
6
- const MANAGED_SESSION_RESTORE_KEY_PATTERN = /^piab-r2-[a-f\d]{32}$/i;
7
- const MANAGED_SESSION_NAME_PREFIX = "piab-r2-";
8
- export function isManagedSessionRestoreKey(value) {
9
- return typeof value === "string" && MANAGED_SESSION_RESTORE_KEY_PATTERN.test(value);
10
- }
11
- const MANAGED_SESSION_FRESH_SUFFIX_PATTERN = /-fresh-[a-f\d]{10}$/i;
12
- const MANAGED_SESSION_RESTORE_KEY_HASH_LENGTH = 32;
13
- const PROJECT_GENERATION_MARKER_NAME = "pi-agent-browser-project-generation-v1.json";
14
- const PROJECT_GENERATION_MARKER_MAX_BYTES = 1_024;
15
- const projectGenerationCache = new Map();
16
- function isAbsoluteHome(path, platform) {
17
- return platform === "win32" ? win32.isAbsolute(path) : isAbsolute(path);
18
- }
19
- function currentUid() {
20
- return typeof process.getuid === "function" ? process.getuid() : undefined;
21
- }
22
- function isTrustedPosixDirectory(path, requireCurrentOwner, platform = process.platform) {
23
- const uid = currentUid();
24
- if (uid === undefined)
25
- return false;
26
- const root = parse(path).root;
27
- let cursor = root;
28
- for (const component of path.slice(root.length).split("/").filter(Boolean)) {
29
- cursor = join(cursor, component);
30
- let entry;
31
- try {
32
- entry = lstatSync(cursor);
33
- }
34
- catch {
35
- return false;
36
- }
37
- if (entry.isSymbolicLink() || !entry.isDirectory())
38
- return false;
39
- const androidSystemAncestor = platform === "android" && (cursor === "/data" || cursor === "/data/data") && entry.uid === 1000 && (entry.mode & 0o002) === 0;
40
- const androidAppDirectory = platform === "android" && entry.uid === uid && entry.gid === uid && (entry.mode & 0o002) === 0;
41
- if (!androidSystemAncestor && entry.uid !== 0 && entry.uid !== uid)
42
- return false;
43
- const writableByOthers = (entry.mode & 0o022) !== 0;
44
- const rootOwnedStickyDirectory = entry.uid === 0 && (entry.mode & 0o1000) !== 0;
45
- if (writableByOthers && !rootOwnedStickyDirectory && !androidSystemAncestor && !androidAppDirectory)
46
- return false;
47
- }
48
- try {
49
- const leaf = lstatSync(path);
50
- return !requireCurrentOwner || leaf.uid === uid;
51
- }
52
- catch {
53
- return false;
54
- }
5
+ import { isTrustedPosixDirectory } from "./managed-session-posix-storage.js";
6
+ import { getCurrentProcessUid } from "./process-identity.js";
7
+ import { getErrorCode } from "./process-errors.js";
8
+ export { isManagedSessionRestoreKey, createManagedSessionRestoreKey, getManagedSessionRestoreScope, hasManagedSessionRestoreProjectIdentity, resolveManagedSessionRestoreCheckoutRoot, } from "./managed-session-project-identity.js";
9
+ function validHomeCandidate(candidate, platform) {
10
+ return (candidate.length > 0 &&
11
+ candidate.trim() === candidate &&
12
+ (platform === "win32" ? win32.isAbsolute(candidate) : isAbsolute(candidate)));
55
13
  }
56
14
  export function resolveManagedSessionRestoreHome(parentEnv, platform = process.platform) {
57
15
  const configuredHome = platform === "win32" ? parentEnv.USERPROFILE : parentEnv.HOME;
58
16
  const candidate = configuredHome ?? homedir();
59
- if (!candidate || candidate.trim() !== candidate || !isAbsoluteHome(candidate, platform))
17
+ if (!validHomeCandidate(candidate, platform)) {
60
18
  return undefined;
61
- if (platform === "win32")
19
+ }
20
+ if (platform === "win32") {
62
21
  return candidate;
22
+ }
63
23
  try {
64
24
  const canonical = realpathSync(candidate);
65
25
  return isTrustedPosixDirectory(canonical, true, platform) ? canonical : undefined;
@@ -74,15 +34,18 @@ export function ensureOwnerOnlyDirectory(path, platform = process.platform) {
74
34
  mkdirSync(path, { mode: 0o700 });
75
35
  }
76
36
  catch (error) {
77
- if (error.code !== "EEXIST")
37
+ if (getErrorCode(error) !== "EEXIST") {
78
38
  return false;
39
+ }
79
40
  }
80
41
  const entry = lstatSync(path);
81
- if (entry.isSymbolicLink() || !entry.isDirectory())
42
+ if (entry.isSymbolicLink() || !entry.isDirectory()) {
82
43
  return false;
83
- if (platform === "win32")
44
+ }
45
+ if (platform === "win32") {
84
46
  return true;
85
- const uid = currentUid();
47
+ }
48
+ const uid = getCurrentProcessUid();
86
49
  return uid !== undefined && entry.uid === uid && (entry.mode & 0o077) === 0;
87
50
  }
88
51
  catch {
@@ -97,225 +60,65 @@ export function directoryContainsSymlink(path) {
97
60
  return true;
98
61
  }
99
62
  }
100
- function resolveGitCheckout(cwd, platform) {
101
- let directory = cwd;
102
- while (true) {
103
- const dotGit = join(directory, ".git");
104
- try {
105
- const entry = lstatSync(dotGit);
106
- if (entry.isDirectory() && !entry.isSymbolicLink())
107
- return { gitDirectory: realpathSync(dotGit), worktreeDirectory: realpathSync(directory) };
108
- if (!entry.isFile() || entry.isSymbolicLink() || entry.size > PROJECT_GENERATION_MARKER_MAX_BYTES)
109
- return undefined;
110
- if (platform !== "win32") {
111
- const uid = currentUid();
112
- if (uid === undefined || entry.uid !== uid || (entry.mode & 0o022) !== 0)
113
- return undefined;
114
- }
115
- const match = /^gitdir:\s*(.+)\s*$/i.exec(readFileSync(dotGit, "utf8"));
116
- if (!match?.[1])
117
- return undefined;
118
- return { gitDirectory: realpathSync(resolve(directory, match[1])), worktreeDirectory: realpathSync(directory) };
119
- }
120
- catch (error) {
121
- if (error.code !== "ENOENT")
122
- return undefined;
123
- }
124
- const parent = dirname(directory);
125
- if (parent === directory)
126
- return undefined;
127
- directory = parent;
128
- }
129
- }
130
- function readProjectGenerationMarker(path, platform) {
131
- try {
132
- const entry = lstatSync(path);
133
- if (entry.isSymbolicLink() || !entry.isFile() || entry.size > PROJECT_GENERATION_MARKER_MAX_BYTES)
134
- return undefined;
135
- if (platform !== "win32") {
136
- const uid = currentUid();
137
- if (uid === undefined || entry.uid !== uid || (entry.mode & 0o177) !== 0)
138
- return undefined;
139
- }
140
- const parsed = JSON.parse(readFileSync(path, "utf8"));
141
- return parsed.version === 1 && typeof parsed.id === "string" && /^[a-f\d]{8}(?:-[a-f\d]{4}){3}-[a-f\d]{12}$/i.test(parsed.id) ? parsed.id : undefined;
142
- }
143
- catch {
144
- return undefined;
145
- }
146
- }
147
- function getDirectoryFilesystemIdentity(path, platform) {
148
- try {
149
- const entry = statSync(path, { bigint: true });
150
- if (!entry.isDirectory() || entry.dev <= 0n || entry.ino <= 0n)
151
- return undefined;
152
- // ponytail: Android reports mutable ctime as birthtime; use statx birthtime/inode generation when Node exposes either reliably.
153
- return platform === "android"
154
- ? `${entry.dev}:${entry.ino}`
155
- : entry.birthtimeNs > 0n ? `${entry.dev}:${entry.ino}:${entry.birthtimeNs}` : undefined;
156
- }
157
- catch {
158
- return undefined;
159
- }
160
- }
161
- function resolveManagedSessionRestoreProjectCheckout(cwd, platform) {
162
- let canonicalCwd;
163
- try {
164
- canonicalCwd = realpathSync(cwd);
165
- }
166
- catch {
167
- return undefined;
168
- }
169
- if (platform !== "win32" && !isTrustedPosixDirectory(canonicalCwd, false, platform))
170
- return undefined;
171
- const checkout = resolveGitCheckout(canonicalCwd, platform);
172
- if (!checkout)
173
- return undefined;
174
- if (platform !== "win32" && (!isTrustedPosixDirectory(checkout.worktreeDirectory, true, platform)
175
- || !isTrustedPosixDirectory(checkout.gitDirectory, true, platform)))
176
- return undefined;
177
- return { canonicalCwd, ...checkout };
178
- }
179
- export function resolveManagedSessionRestoreCheckoutRoot(cwd, platform = process.platform) {
180
- return resolveManagedSessionRestoreProjectCheckout(cwd, platform)?.worktreeDirectory;
181
- }
182
- function resolveProjectGenerationIdentity(cwd, platform = process.platform) {
183
- const checkout = resolveManagedSessionRestoreProjectCheckout(cwd, platform);
184
- if (!checkout)
185
- return undefined;
186
- const { canonicalCwd } = checkout;
187
- const gitFilesystemIdentity = getDirectoryFilesystemIdentity(checkout.gitDirectory, platform);
188
- const worktreeFilesystemIdentity = getDirectoryFilesystemIdentity(checkout.worktreeDirectory, platform);
189
- if (!gitFilesystemIdentity || !worktreeFilesystemIdentity)
190
- return undefined;
191
- const markerPath = join(checkout.gitDirectory, PROJECT_GENERATION_MARKER_NAME);
192
- let marker = readProjectGenerationMarker(markerPath, platform);
193
- const cached = projectGenerationCache.get(canonicalCwd);
194
- if (cached
195
- && cached.gitDirectory === checkout.gitDirectory
196
- && cached.worktreeDirectory === checkout.worktreeDirectory
197
- && cached.gitFilesystemIdentity === gitFilesystemIdentity
198
- && cached.worktreeFilesystemIdentity === worktreeFilesystemIdentity
199
- && cached.marker === marker)
200
- return cached.identity;
201
- projectGenerationCache.delete(canonicalCwd);
202
- try {
203
- if (!marker) {
204
- const content = JSON.stringify({ id: randomUUID(), version: 1 });
205
- if (platform === "android") {
206
- // ponytail: Android denies hard links in app storage; use renameat2(RENAME_NOREPLACE) if Node exposes it.
207
- try {
208
- writeFileSync(markerPath, content, { encoding: "utf8", flag: "wx", mode: 0o600 });
209
- }
210
- catch (error) {
211
- if (error.code !== "EEXIST")
212
- return undefined;
213
- }
214
- }
215
- else {
216
- const candidatePath = `${markerPath}.candidate-${process.pid}-${randomUUID()}`;
217
- try {
218
- writeFileSync(candidatePath, content, { encoding: "utf8", flag: "wx", mode: 0o600 });
219
- try {
220
- linkSync(candidatePath, markerPath);
221
- }
222
- catch (error) {
223
- if (error.code !== "EEXIST")
224
- return undefined;
225
- }
226
- }
227
- finally {
228
- try {
229
- unlinkSync(candidatePath);
230
- }
231
- catch { }
232
- }
233
- }
234
- marker = readProjectGenerationMarker(markerPath, platform);
235
- }
236
- if (!marker)
237
- return undefined;
238
- const identity = `${platform}:${worktreeFilesystemIdentity}:${gitFilesystemIdentity}:${marker}`;
239
- projectGenerationCache.set(canonicalCwd, {
240
- gitDirectory: checkout.gitDirectory,
241
- gitFilesystemIdentity,
242
- identity,
243
- marker,
244
- worktreeDirectory: checkout.worktreeDirectory,
245
- worktreeFilesystemIdentity,
246
- });
247
- return identity;
248
- }
249
- catch {
250
- return undefined;
251
- }
252
- }
253
- export function hasManagedSessionRestoreProjectIdentity(cwd) {
254
- return resolveProjectGenerationIdentity(cwd) !== undefined;
255
- }
256
- /** Keep fresh rotations from one Pi transcript in one private upstream restore pool. */
257
- export function getManagedSessionRestoreScope(sessionName) {
258
- return sessionName.replace(MANAGED_SESSION_FRESH_SUFFIX_PATTERN, "");
259
- }
260
- /** Stable for one Pi transcript and checkout generation; isolated from other concurrent transcripts. */
261
- export function createManagedSessionRestoreKey(cwd, restoreScope = "", platform = process.platform) {
262
- let canonicalCwd = resolve(cwd);
263
- try {
264
- canonicalCwd = realpathSync(canonicalCwd);
265
- }
266
- catch { }
267
- const identity = resolveProjectGenerationIdentity(canonicalCwd, platform);
268
- const material = identity ?? `unavailable:${canonicalCwd}`;
269
- const digest = createHash("sha256")
270
- .update(`restore-v3:${material}:scope:${restoreScope}`)
271
- .digest("hex")
272
- .slice(0, MANAGED_SESSION_RESTORE_KEY_HASH_LENGTH);
273
- return `${MANAGED_SESSION_NAME_PREFIX}${digest}`;
274
- }
275
63
  function hasValidEncryptionKey(parentEnv) {
276
64
  const value = parentEnv.AGENT_BROWSER_ENCRYPTION_KEY;
277
65
  return typeof value === "string" && /^[a-f\d]{64}$/i.test(value);
278
66
  }
279
67
  export function getManagedRestoreSessionsDirectory(home, namespace) {
280
68
  const canonicalNamespace = canonicalizeAgentBrowserNamespace(namespace);
281
- return canonicalNamespace
69
+ return canonicalNamespace !== undefined && canonicalNamespace.length > 0
282
70
  ? join(home, ".agent-browser", "namespaces", canonicalNamespace, "state", "sessions")
283
71
  : join(home, ".agent-browser", "sessions");
284
72
  }
285
- /** Require the upstream 256-bit key format and secure every directory that can receive restore snapshots. */
73
+ function ensureRestoreStateDirectory(root, namespace, platform) {
74
+ const canonicalNamespace = canonicalizeAgentBrowserNamespace(namespace);
75
+ const components = canonicalNamespace !== undefined && canonicalNamespace.length > 0
76
+ ? ["namespaces", canonicalNamespace, "state", "sessions"]
77
+ : ["sessions"];
78
+ let path = root;
79
+ for (const component of components) {
80
+ path = join(path, component);
81
+ if (!ensureOwnerOnlyDirectory(path, platform)) {
82
+ return undefined;
83
+ }
84
+ }
85
+ return path;
86
+ }
87
+ /** Require the native 256-bit key format and secure each automatic restore storage directory. */
286
88
  export function ensureManagedSessionRestoreStorageIsSecure(parentEnv = process.env, platform = process.platform, namespace) {
287
- const encryptionKey = parentEnv.AGENT_BROWSER_ENCRYPTION_KEY;
288
- if (encryptionKey !== undefined && !hasValidEncryptionKey(parentEnv))
89
+ if (parentEnv.AGENT_BROWSER_ENCRYPTION_KEY !== undefined && !hasValidEncryptionKey(parentEnv)) {
289
90
  return false;
290
- if (platform === "win32")
91
+ }
92
+ if (platform === "win32") {
291
93
  return hasValidEncryptionKey(parentEnv);
94
+ }
292
95
  const home = resolveManagedSessionRestoreHome(parentEnv, platform);
293
- if (!home)
96
+ if (home === undefined) {
294
97
  return false;
98
+ }
295
99
  const root = join(home, ".agent-browser");
296
- if (!ensureOwnerOnlyDirectory(root, platform))
100
+ if (!ensureOwnerOnlyDirectory(root, platform)) {
297
101
  return false;
298
- const canonicalNamespace = canonicalizeAgentBrowserNamespace(namespace);
299
- const stateComponents = canonicalNamespace
300
- ? ["namespaces", canonicalNamespace, "state", "sessions"]
301
- : ["sessions"];
302
- let path = root;
303
- for (const component of stateComponents) {
304
- path = join(path, component);
305
- if (!ensureOwnerOnlyDirectory(path, platform))
306
- return false;
307
102
  }
308
- if (directoryContainsSymlink(path))
103
+ const path = ensureRestoreStateDirectory(root, namespace, platform);
104
+ if (path === undefined || directoryContainsSymlink(path)) {
309
105
  return false;
106
+ }
107
+ return secureRestoreTemporaryDirectory(path, platform);
108
+ }
109
+ function secureRestoreTemporaryDirectory(path, platform) {
310
110
  const temporaryDirectory = join(path, ".tmp");
311
- return ensureOwnerOnlyDirectory(temporaryDirectory, platform) && !directoryContainsSymlink(temporaryDirectory);
111
+ return (ensureOwnerOnlyDirectory(temporaryDirectory, platform) &&
112
+ !directoryContainsSymlink(temporaryDirectory));
312
113
  }
313
114
  export function getManagedSessionRestoreProtectedStorageEnv(restoreEnabled, parentEnv, platform = process.platform) {
314
- if (!restoreEnabled)
115
+ if (!restoreEnabled) {
315
116
  return {};
117
+ }
316
118
  const home = resolveManagedSessionRestoreHome(parentEnv, platform);
317
- if (!home)
119
+ if (home === undefined) {
318
120
  return {};
121
+ }
319
122
  return {
320
123
  AGENT_BROWSER_ENCRYPTION_KEY: parentEnv.AGENT_BROWSER_ENCRYPTION_KEY,
321
124
  ...(platform === "win32" ? { USERPROFILE: home } : { HOME: home }),
@@ -0,0 +1,140 @@
1
+ import { getExplicitNavigationTarget } from "./page-target-navigation.js";
2
+ import { isRecord } from "./parsing.js";
3
+ function isNonemptyString(value) {
4
+ return typeof value === "string" && value.length > 0;
5
+ }
6
+ function confirmationIdentity(value) {
7
+ if (!isNonemptyString(value.id) ||
8
+ !isNonemptyString(value.sessionName) ||
9
+ (value.namespace !== undefined && typeof value.namespace !== "string")) {
10
+ return undefined;
11
+ }
12
+ return { id: value.id, sessionName: value.sessionName, namespace: value.namespace };
13
+ }
14
+ function guardedProvenance(value) {
15
+ if (!isNonemptyString(value.command) || !isNonemptyString(value.action)) {
16
+ return undefined;
17
+ }
18
+ const fresh = value.state === "cleared" &&
19
+ value.command === "snapshot" &&
20
+ value.action === "snapshot" &&
21
+ value.refSnapshotFresh === true;
22
+ return {
23
+ command: value.command,
24
+ action: value.action,
25
+ ...(fresh ? { refSnapshotFresh: true } : {}),
26
+ };
27
+ }
28
+ function explicitReadCapabilities(value) {
29
+ return isRecord(value) && value.readRequiresConfirmation === true
30
+ ? { readRequiresConfirmation: true }
31
+ : undefined;
32
+ }
33
+ export function parseReadConfirmation(value) {
34
+ if (!isRecord(value) ||
35
+ (value.source !== "native-explicit-url-read" && value.source !== "native-guarded-action") ||
36
+ (value.state !== "pending" && value.state !== "cleared")) {
37
+ return undefined;
38
+ }
39
+ const identity = confirmationIdentity(value);
40
+ if (identity === undefined) {
41
+ return undefined;
42
+ }
43
+ if (value.source === "native-explicit-url-read") {
44
+ const capabilities = explicitReadCapabilities(value.capabilities);
45
+ return {
46
+ ...identity,
47
+ source: value.source,
48
+ state: value.state,
49
+ ...(capabilities !== undefined ? { capabilities } : {}),
50
+ };
51
+ }
52
+ const provenance = guardedProvenance(value);
53
+ return provenance === undefined
54
+ ? undefined
55
+ : { ...identity, ...provenance, source: value.source, state: value.state };
56
+ }
57
+ function parsePendingControl(value) {
58
+ if (!isRecord(value) ||
59
+ value.confirmation_required !== true ||
60
+ !isNonemptyString(value.confirmation_id) ||
61
+ !isNonemptyString(value.action)) {
62
+ return undefined;
63
+ }
64
+ return {
65
+ id: value.confirmation_id,
66
+ action: value.action,
67
+ capabilities: explicitReadCapabilities(value.capabilities),
68
+ };
69
+ }
70
+ const TAB_TRANSPORT_KEYS = new Set([
71
+ "confirmation_required",
72
+ "confirmation_id",
73
+ "action",
74
+ "capabilities",
75
+ "after_confirmation",
76
+ "guidance",
77
+ ]);
78
+ function matchesTabContinuation(after, commandTokens) {
79
+ return (Array.isArray(after) &&
80
+ after.length === 2 &&
81
+ after[0] === "open" &&
82
+ isNonemptyString(after[1]) &&
83
+ after[1] === getExplicitNavigationTarget(commandTokens));
84
+ }
85
+ export function getNativeTabContinuationGuidance(commandTokens, data) {
86
+ if (commandTokens[0] !== "tab" || commandTokens[1] !== "new" || !isRecord(data)) {
87
+ return undefined;
88
+ }
89
+ const pending = parsePendingControl(data);
90
+ if (pending?.action !== "tab_new" ||
91
+ !Object.keys(data).every((key) => TAB_TRANSPORT_KEYS.has(key))) {
92
+ return undefined;
93
+ }
94
+ if (!matchesTabContinuation(data.after_confirmation, commandTokens)) {
95
+ return undefined;
96
+ }
97
+ // Transport prose only: approval creates the tab; the continuation is never stored or executed.
98
+ return typeof data.guidance === "string" && data.guidance.trim().length > 0
99
+ ? data.guidance
100
+ : undefined;
101
+ }
102
+ export function getNativePendingControl(commandTokens, data) {
103
+ if (!isRecord(data)) {
104
+ return undefined;
105
+ }
106
+ // Only native control fields and validated tab transport. Page output is never provenance.
107
+ const controlKeys = new Set([
108
+ "confirmation_required",
109
+ "confirmation_id",
110
+ "action",
111
+ "capabilities",
112
+ ]);
113
+ if (!Object.keys(data).every((key) => controlKeys.has(key)) &&
114
+ getNativeTabContinuationGuidance(commandTokens, data) === undefined) {
115
+ return undefined;
116
+ }
117
+ return parsePendingControl(data);
118
+ }
119
+ export function getConfirmedNativeResult(data, current) {
120
+ const action = current.source === "native-explicit-url-read" ? "read" : current.action;
121
+ return isRecord(data) &&
122
+ data.confirmed === true &&
123
+ data.action === action &&
124
+ isRecord(data.result)
125
+ ? data.result
126
+ : undefined;
127
+ }
128
+ export function isSuccessfulNativeConfirmedClose(commandTokens, data) {
129
+ if (commandTokens[0] !== "confirm" ||
130
+ commandTokens.length !== 2 ||
131
+ !isRecord(data) ||
132
+ data.confirmed !== true ||
133
+ data.action !== "close") {
134
+ return false;
135
+ }
136
+ return (isRecord(data.result) &&
137
+ data.result.success === true &&
138
+ isRecord(data.result.data) &&
139
+ data.result.data.closed === true);
140
+ }
@@ -3,7 +3,8 @@ import { isRecord } from "./parsing.js";
3
3
  import { isBooleanFlagEnabled } from "./argv-grammar.js";
4
4
  import { finalizeAgentBrowserFailure } from "./pi-tool-rendering.js";
5
5
  import { isPlainTextInspectionArgs } from "./runtime.js";
6
- import { projectAgentBrowserObservation, OBSERVATION_INLINE_MAX_CHARS } from "./results/presentation/content.js";
6
+ import { projectAgentBrowserObservation, OBSERVATION_INLINE_MAX_CHARS, isStringArray, } from "./results/presentation/content.js";
7
+ import { renderAgentBrowserObservation } from "./results/presentation/large-output.js";
7
8
  export const AGENT_BROWSER_NAMESPACE = {
8
9
  name: "browser",
9
10
  description: "Browser commands, bounded browser code, advanced UI checks, Electron, and optional web search.",
@@ -11,37 +12,70 @@ export const AGENT_BROWSER_NAMESPACE = {
11
12
  };
12
13
  export const AGENT_BROWSER_OUTPUT_SCHEMA = JsonSchema.Object({
13
14
  success: JsonSchema.Boolean(),
14
- resultCategory: JsonSchema.Union([JsonSchema.Literal("success"), JsonSchema.Literal("failure")]),
15
+ resultCategory: JsonSchema.Union([
16
+ JsonSchema.Literal("success"),
17
+ JsonSchema.Literal("failure"),
18
+ ]),
15
19
  data: JsonSchema.Optional(JsonSchema.Unsafe({})),
16
20
  error: JsonSchema.Optional(JsonSchema.Unsafe({})),
17
21
  summary: JsonSchema.Optional(JsonSchema.String()),
18
22
  nextActions: JsonSchema.Optional(JsonSchema.Array(JsonSchema.Object({}))),
19
23
  }, { additionalProperties: true });
24
+ function inputArgs(input) {
25
+ return isRecord(input) && isStringArray(input.args) ? input.args : undefined;
26
+ }
27
+ function isJsonRequest(input) {
28
+ return (isRecord(input) && ("code" in input || isBooleanFlagEnabled(inputArgs(input) ?? [], "--json")));
29
+ }
30
+ function isJsonValue(value) {
31
+ if (value === null ||
32
+ typeof value === "string" ||
33
+ typeof value === "number" ||
34
+ typeof value === "boolean") {
35
+ return true;
36
+ }
37
+ if (Array.isArray(value)) {
38
+ return value.every(isJsonValue);
39
+ }
40
+ return isRecord(value) && Object.values(value).every(isJsonValue);
41
+ }
42
+ function serializedObservation(value) {
43
+ // Serialization keeps native JSON omission/coercion semantics; validate the decoded unknown boundary.
44
+ const decoded = JSON.parse(JSON.stringify(value));
45
+ if (!isJsonValue(decoded)) {
46
+ throw new Error("Browser observation did not serialize to a JSON value.");
47
+ }
48
+ return decoded;
49
+ }
20
50
  /** Final public boundary, after execution, persistence, and any requested output export. */
21
51
  export async function finalizeAgentBrowserNativeResult(result, input) {
22
52
  const finalized = finalizeAgentBrowserFailure(result, input);
23
53
  // Native help/version stays plain text; the entrypoint intentionally skips observation rendering for it.
24
- if (isRecord(input) && Array.isArray(input.args) && isPlainTextInspectionArgs(input.args))
54
+ if (isPlainTextInspectionArgs(inputArgs(input) ?? [])) {
25
55
  return finalized;
56
+ }
26
57
  const succeeded = finalized.isError !== true;
27
58
  // The normal entrypoint supplies the exact bounded projection, including its complete spill.
28
- if (isRecord(result.structuredContent) && result.structuredContent.success === succeeded)
59
+ if (isRecord(result.structuredContent) && result.structuredContent.success === succeeded) {
29
60
  return finalized;
61
+ }
30
62
  const details = isRecord(result.details) ? result.details : {};
31
63
  const observation = projectAgentBrowserObservation(details, succeeded);
32
64
  if (JSON.stringify(observation).length > OBSERVATION_INLINE_MAX_CHARS) {
33
- const { renderAgentBrowserObservation } = await import("./results/presentation/large-output.js");
34
65
  const rendered = await renderAgentBrowserObservation({
35
- content: finalized.content, details, succeeded,
36
- json: isRecord(input) && ("code" in input || Array.isArray(input.args) && isBooleanFlagEnabled(input.args, "--json")),
66
+ content: finalized.content,
67
+ details,
68
+ succeeded,
69
+ json: isJsonRequest(input),
37
70
  // The caller's exact visible output stays inline (for example formatted search results); only the structured field is bounded.
38
71
  preserveContent: true,
39
72
  });
40
73
  const { artifactManifest, ...renderedResult } = rendered;
41
74
  return finalizeAgentBrowserFailure({
42
- ...finalized, ...renderedResult,
75
+ ...finalized,
76
+ ...renderedResult,
43
77
  details: artifactManifest ? { ...details, artifactManifest } : details,
44
78
  }, input);
45
79
  }
46
- return { ...finalized, structuredContent: JSON.parse(JSON.stringify(observation)) };
80
+ return { ...finalized, structuredContent: serializedObservation(observation) };
47
81
  }