pi-agent-browser-native 0.9.5 → 0.9.6

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 (380) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +3 -0
  3. package/dist/extensions/agent-browser/index.js +1214 -583
  4. package/dist/packaged/lib/browser-session-conversion.js +2810 -0
  5. package/dist/packaged/lib/config-policy.js +599 -0
  6. package/dist/packaged/lib/parsing.js +34 -0
  7. package/dist/packaged/lib/playbook.js +694 -0
  8. package/dist/packaged/lib/results/snapshot.js +2671 -0
  9. package/dist/packaged/lib/runtime.js +3027 -0
  10. package/docs/ARCHITECTURE.md +11 -1
  11. package/docs/CODE_QUALITY.md +11 -0
  12. package/docs/COMMAND_REFERENCE.md +2 -2
  13. package/docs/PERFORMANCE.md +243 -0
  14. package/docs/REFERENCE.md +3 -3
  15. package/docs/SESSION_STORAGE.md +11 -3
  16. package/docs/SUPPORT_MATRIX.md +8 -4
  17. package/docs/TOOL_CONTRACT.md +4 -4
  18. package/docs/performance/2026-10-12.json +7257 -0
  19. package/package.json +13 -2
  20. package/scripts/build.mjs +16 -5
  21. package/scripts/config.mjs +1 -1
  22. package/scripts/convert-browser-session.mjs +1 -1
  23. package/dist/extensions/agent-browser/lib/argv-descriptor.js +0 -123
  24. package/dist/extensions/agent-browser/lib/argv-grammar.js +0 -320
  25. package/dist/extensions/agent-browser/lib/bash-guard.js +0 -193
  26. package/dist/extensions/agent-browser/lib/batch-lifecycle.js +0 -131
  27. package/dist/extensions/agent-browser/lib/browser-execution-claim-codec.js +0 -61
  28. package/dist/extensions/agent-browser/lib/browser-execution-claim-storage.js +0 -232
  29. package/dist/extensions/agent-browser/lib/browser-execution-claims.js +0 -202
  30. package/dist/extensions/agent-browser/lib/browser-execution-identity.js +0 -77
  31. package/dist/extensions/agent-browser/lib/browser-journal-branch.js +0 -98
  32. package/dist/extensions/agent-browser/lib/browser-journal-contracts.js +0 -1
  33. package/dist/extensions/agent-browser/lib/browser-journal-projection.js +0 -221
  34. package/dist/extensions/agent-browser/lib/browser-journal-reader.js +0 -89
  35. package/dist/extensions/agent-browser/lib/browser-journal-replay.js +0 -246
  36. package/dist/extensions/agent-browser/lib/browser-journal.js +0 -148
  37. package/dist/extensions/agent-browser/lib/browser-legacy-pages.js +0 -220
  38. package/dist/extensions/agent-browser/lib/browser-legacy-projection.js +0 -282
  39. package/dist/extensions/agent-browser/lib/browser-legacy-types.js +0 -1
  40. package/dist/extensions/agent-browser/lib/browser-session-conversion-stream.js +0 -217
  41. package/dist/extensions/agent-browser/lib/browser-session-conversion.js +0 -126
  42. package/dist/extensions/agent-browser/lib/browser-transcript-contracts.js +0 -35
  43. package/dist/extensions/agent-browser/lib/browser-transcript-validation.js +0 -166
  44. package/dist/extensions/agent-browser/lib/browser-transcript.js +0 -189
  45. package/dist/extensions/agent-browser/lib/browser-value-parsing.js +0 -15
  46. package/dist/extensions/agent-browser/lib/command-capabilities.js +0 -340
  47. package/dist/extensions/agent-browser/lib/command-policy.js +0 -155
  48. package/dist/extensions/agent-browser/lib/command-taxonomy.js +0 -105
  49. package/dist/extensions/agent-browser/lib/config-policy.js +0 -450
  50. package/dist/extensions/agent-browser/lib/config-providers.js +0 -71
  51. package/dist/extensions/agent-browser/lib/config-validation.js +0 -231
  52. package/dist/extensions/agent-browser/lib/config.js +0 -69
  53. package/dist/extensions/agent-browser/lib/electron/cdp.js +0 -62
  54. package/dist/extensions/agent-browser/lib/electron/cleanup.js +0 -274
  55. package/dist/extensions/agent-browser/lib/electron/discovery-darwin.js +0 -109
  56. package/dist/extensions/agent-browser/lib/electron/discovery-desktop.js +0 -136
  57. package/dist/extensions/agent-browser/lib/electron/discovery-evidence.js +0 -90
  58. package/dist/extensions/agent-browser/lib/electron/discovery-linux.js +0 -93
  59. package/dist/extensions/agent-browser/lib/electron/discovery-packages.js +0 -162
  60. package/dist/extensions/agent-browser/lib/electron/discovery-types.js +0 -2
  61. package/dist/extensions/agent-browser/lib/electron/discovery.js +0 -217
  62. package/dist/extensions/agent-browser/lib/electron/launch-monitor.js +0 -102
  63. package/dist/extensions/agent-browser/lib/electron/launch-process.js +0 -209
  64. package/dist/extensions/agent-browser/lib/electron/launch-types.js +0 -2
  65. package/dist/extensions/agent-browser/lib/electron/launch.js +0 -340
  66. package/dist/extensions/agent-browser/lib/executable-path.js +0 -29
  67. package/dist/extensions/agent-browser/lib/execution-cwd.js +0 -67
  68. package/dist/extensions/agent-browser/lib/fs-utils.js +0 -10
  69. package/dist/extensions/agent-browser/lib/input-modes/electron.js +0 -201
  70. package/dist/extensions/agent-browser/lib/input-modes/job.js +0 -198
  71. package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +0 -116
  72. package/dist/extensions/agent-browser/lib/input-modes/lookup-plan.js +0 -132
  73. package/dist/extensions/agent-browser/lib/input-modes/lookup-redaction.js +0 -57
  74. package/dist/extensions/agent-browser/lib/input-modes/lookup-source-evidence.js +0 -151
  75. package/dist/extensions/agent-browser/lib/input-modes/lookup-workspace.js +0 -142
  76. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +0 -84
  77. package/dist/extensions/agent-browser/lib/input-modes/params.js +0 -195
  78. package/dist/extensions/agent-browser/lib/input-modes/qa-analysis.js +0 -268
  79. package/dist/extensions/agent-browser/lib/input-modes/qa-presentation.js +0 -117
  80. package/dist/extensions/agent-browser/lib/input-modes/script-child.js +0 -396
  81. package/dist/extensions/agent-browser/lib/input-modes/script-protocol.js +0 -86
  82. package/dist/extensions/agent-browser/lib/input-modes/script-types.js +0 -1
  83. package/dist/extensions/agent-browser/lib/input-modes/script-validation.js +0 -60
  84. package/dist/extensions/agent-browser/lib/input-modes/script.js +0 -108
  85. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +0 -243
  86. package/dist/extensions/agent-browser/lib/input-modes/shared.js +0 -48
  87. package/dist/extensions/agent-browser/lib/input-modes/types.js +0 -65
  88. package/dist/extensions/agent-browser/lib/json-schema.js +0 -65
  89. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +0 -212
  90. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +0 -165
  91. package/dist/extensions/agent-browser/lib/managed-session-posix-storage.js +0 -58
  92. package/dist/extensions/agent-browser/lib/managed-session-project-identity.js +0 -244
  93. package/dist/extensions/agent-browser/lib/managed-session-restore-context.js +0 -84
  94. package/dist/extensions/agent-browser/lib/managed-session-restore-policy.js +0 -119
  95. package/dist/extensions/agent-browser/lib/managed-session-restore-state.js +0 -83
  96. package/dist/extensions/agent-browser/lib/managed-session-restore.js +0 -212
  97. package/dist/extensions/agent-browser/lib/managed-session-snapshot-records.js +0 -277
  98. package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +0 -181
  99. package/dist/extensions/agent-browser/lib/managed-session-storage.js +0 -126
  100. package/dist/extensions/agent-browser/lib/native-confirmation.js +0 -140
  101. package/dist/extensions/agent-browser/lib/native-output.js +0 -81
  102. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +0 -182
  103. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-merge.js +0 -30
  104. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +0 -188
  105. package/dist/extensions/agent-browser/lib/orchestration/browser-run/browser-observation-result.js +0 -82
  106. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +0 -406
  107. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostic-values.js +0 -31
  108. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +0 -240
  109. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-observation.js +0 -203
  110. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-text-diagnostics.js +0 -109
  111. package/dist/extensions/agent-browser/lib/orchestration/browser-run/fill-diagnostics.js +0 -119
  112. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-action-recovery.js +0 -147
  113. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-actions.js +0 -144
  114. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-content.js +0 -123
  115. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-contracts.js +0 -1
  116. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-details.js +0 -156
  117. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-electron.js +0 -187
  118. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-evidence.js +0 -39
  119. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-missing-binary.js +0 -89
  120. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-recovery.js +0 -97
  121. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-redaction.js +0 -106
  122. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-timeout.js +0 -110
  123. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +0 -53
  124. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +0 -224
  125. package/dist/extensions/agent-browser/lib/orchestration/browser-run/interaction-diagnostics.js +0 -290
  126. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-close.js +0 -167
  127. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-inspection.js +0 -108
  128. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +0 -174
  129. package/dist/extensions/agent-browser/lib/orchestration/browser-run/native-helper-observation.js +0 -65
  130. package/dist/extensions/agent-browser/lib/orchestration/browser-run/observation-types.js +0 -1
  131. package/dist/extensions/agent-browser/lib/orchestration/browser-run/overlay-diagnostics.js +0 -120
  132. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +0 -192
  133. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +0 -225
  134. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter-data.js +0 -150
  135. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +0 -174
  136. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-rendered-text.js +0 -147
  137. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +0 -145
  138. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-artifacts.js +0 -159
  139. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-command.js +0 -131
  140. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-contracts.js +0 -1
  141. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-daemon.js +0 -93
  142. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-failure.js +0 -42
  143. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-guards.js +0 -242
  144. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-input.js +0 -75
  145. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-observations.js +0 -92
  146. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-selection.js +0 -254
  147. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-state.js +0 -121
  148. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-refs.js +0 -130
  149. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-resources.js +0 -114
  150. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-semantic.js +0 -121
  151. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-session-plan.js +0 -222
  152. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-timeouts.js +0 -68
  153. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +0 -202
  154. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-analysis.js +0 -191
  155. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-confirmation.js +0 -152
  156. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-diagnostics.js +0 -182
  157. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-electron.js +0 -150
  158. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-contracts.js +0 -1
  159. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase-contracts.js +0 -1
  160. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase.js +0 -115
  161. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle.js +0 -256
  162. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed-contracts.js +0 -1
  163. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed.js +0 -256
  164. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase-contracts.js +0 -1
  165. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase.js +0 -93
  166. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native.js +0 -113
  167. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation-contracts.js +0 -1
  168. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation.js +0 -316
  169. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-ownership.js +0 -28
  170. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase-contracts.js +0 -1
  171. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase.js +0 -142
  172. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation-contracts.js +0 -1
  173. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation.js +0 -333
  174. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase-contracts.js +0 -1
  175. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase.js +0 -71
  176. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication.js +0 -201
  177. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-receipts.js +0 -183
  178. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-refs.js +0 -200
  179. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-tabs.js +0 -142
  180. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +0 -25
  181. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +0 -50
  182. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-receipt-reconciliation.js +0 -198
  183. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-contracts.js +0 -1
  184. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-presentation.js +0 -154
  185. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery.js +0 -80
  186. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-capture.js +0 -14
  187. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-observation.js +0 -206
  188. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-commands.js +0 -130
  189. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-electron.js +0 -212
  190. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-observations.js +0 -61
  191. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-outcomes.js +0 -187
  192. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-refs.js +0 -169
  193. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-tabs.js +0 -228
  194. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +0 -117
  195. package/dist/extensions/agent-browser/lib/orchestration/browser-run/text-visibility-diagnostics.js +0 -182
  196. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-diagnostics.js +0 -256
  197. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-progress.js +0 -108
  198. package/dist/extensions/agent-browser/lib/orchestration/browser-run/types.js +0 -1
  199. package/dist/extensions/agent-browser/lib/orchestration/code-artifact-observation.js +0 -39
  200. package/dist/extensions/agent-browser/lib/orchestration/code-image-observation.js +0 -119
  201. package/dist/extensions/agent-browser/lib/orchestration/electron-host/branch.js +0 -93
  202. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup-result.js +0 -58
  203. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup.js +0 -78
  204. package/dist/extensions/agent-browser/lib/orchestration/electron-host/contracts.js +0 -1
  205. package/dist/extensions/agent-browser/lib/orchestration/electron-host/discovery.js +0 -106
  206. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +0 -60
  207. package/dist/extensions/agent-browser/lib/orchestration/electron-host/policy.js +0 -86
  208. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-collection.js +0 -68
  209. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +0 -169
  210. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +0 -182
  211. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe.js +0 -161
  212. package/dist/extensions/agent-browser/lib/orchestration/electron-host/status.js +0 -167
  213. package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +0 -98
  214. package/dist/extensions/agent-browser/lib/orchestration/extension-artifact-preflight.js +0 -211
  215. package/dist/extensions/agent-browser/lib/orchestration/extension-artifacts.js +0 -23
  216. package/dist/extensions/agent-browser/lib/orchestration/extension-attachment-replay.js +0 -99
  217. package/dist/extensions/agent-browser/lib/orchestration/extension-branch-restore.js +0 -275
  218. package/dist/extensions/agent-browser/lib/orchestration/extension-code.js +0 -280
  219. package/dist/extensions/agent-browser/lib/orchestration/extension-command-admission.js +0 -303
  220. package/dist/extensions/agent-browser/lib/orchestration/extension-command-output.js +0 -36
  221. package/dist/extensions/agent-browser/lib/orchestration/extension-command-result.js +0 -335
  222. package/dist/extensions/agent-browser/lib/orchestration/extension-command-run.js +0 -227
  223. package/dist/extensions/agent-browser/lib/orchestration/extension-command-state.js +0 -1
  224. package/dist/extensions/agent-browser/lib/orchestration/extension-electron-ownership.js +0 -204
  225. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-locks.js +0 -139
  226. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-queue.js +0 -24
  227. package/dist/extensions/agent-browser/lib/orchestration/extension-host-coordination.js +0 -98
  228. package/dist/extensions/agent-browser/lib/orchestration/extension-host-run.js +0 -295
  229. package/dist/extensions/agent-browser/lib/orchestration/extension-intent-replay.js +0 -41
  230. package/dist/extensions/agent-browser/lib/orchestration/extension-invocation.js +0 -7
  231. package/dist/extensions/agent-browser/lib/orchestration/extension-lifecycle.js +0 -102
  232. package/dist/extensions/agent-browser/lib/orchestration/extension-managed-ownership.js +0 -133
  233. package/dist/extensions/agent-browser/lib/orchestration/extension-observation.js +0 -120
  234. package/dist/extensions/agent-browser/lib/orchestration/extension-prompt.js +0 -180
  235. package/dist/extensions/agent-browser/lib/orchestration/extension-recording.js +0 -290
  236. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-contracts.js +0 -1
  237. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-replay.js +0 -269
  238. package/dist/extensions/agent-browser/lib/orchestration/extension-result-state.js +0 -113
  239. package/dist/extensions/agent-browser/lib/orchestration/extension-runtime.js +0 -146
  240. package/dist/extensions/agent-browser/lib/orchestration/extension-script-leases.js +0 -58
  241. package/dist/extensions/agent-browser/lib/orchestration/extension-tool-boundary.js +0 -62
  242. package/dist/extensions/agent-browser/lib/orchestration/extension-version-check.js +0 -54
  243. package/dist/extensions/agent-browser/lib/orchestration/input-plan-types.js +0 -1
  244. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +0 -313
  245. package/dist/extensions/agent-browser/lib/orchestration/input-redaction.js +0 -62
  246. package/dist/extensions/agent-browser/lib/orchestration/native-config.js +0 -144
  247. package/dist/extensions/agent-browser/lib/orchestration/native-root-launch.js +0 -77
  248. package/dist/extensions/agent-browser/lib/orchestration/native-session-defaults.js +0 -231
  249. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +0 -142
  250. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +0 -276
  251. package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +0 -220
  252. package/dist/extensions/agent-browser/lib/owned-managed-session-context.js +0 -55
  253. package/dist/extensions/agent-browser/lib/page-target-batch.js +0 -118
  254. package/dist/extensions/agent-browser/lib/page-target-guards.js +0 -50
  255. package/dist/extensions/agent-browser/lib/page-target-navigation.js +0 -104
  256. package/dist/extensions/agent-browser/lib/page-target-validation.js +0 -90
  257. package/dist/extensions/agent-browser/lib/parsing.js +0 -30
  258. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +0 -343
  259. package/dist/extensions/agent-browser/lib/playbook.js +0 -146
  260. package/dist/extensions/agent-browser/lib/process-child.js +0 -284
  261. package/dist/extensions/agent-browser/lib/process-environment.js +0 -48
  262. package/dist/extensions/agent-browser/lib/process-errors.js +0 -23
  263. package/dist/extensions/agent-browser/lib/process-identity.js +0 -127
  264. package/dist/extensions/agent-browser/lib/process-socket-storage.js +0 -256
  265. package/dist/extensions/agent-browser/lib/process-stdout.js +0 -74
  266. package/dist/extensions/agent-browser/lib/process.js +0 -216
  267. package/dist/extensions/agent-browser/lib/prompt-artifacts.js +0 -287
  268. package/dist/extensions/agent-browser/lib/prompt-policy.js +0 -54
  269. package/dist/extensions/agent-browser/lib/read-command.js +0 -41
  270. package/dist/extensions/agent-browser/lib/read-confirmation.js +0 -162
  271. package/dist/extensions/agent-browser/lib/recording-reservations.js +0 -208
  272. package/dist/extensions/agent-browser/lib/redaction-fields.js +0 -75
  273. package/dist/extensions/agent-browser/lib/redaction-json.js +0 -149
  274. package/dist/extensions/agent-browser/lib/redaction-url.js +0 -88
  275. package/dist/extensions/agent-browser/lib/results/action-contracts.js +0 -1
  276. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +0 -38
  277. package/dist/extensions/agent-browser/lib/results/artifact-contracts.js +0 -1
  278. package/dist/extensions/agent-browser/lib/results/artifact-manifest-validation.js +0 -133
  279. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +0 -173
  280. package/dist/extensions/agent-browser/lib/results/artifact-recommendations.js +0 -73
  281. package/dist/extensions/agent-browser/lib/results/categories.js +0 -152
  282. package/dist/extensions/agent-browser/lib/results/confirmation.js +0 -75
  283. package/dist/extensions/agent-browser/lib/results/contracts.js +0 -1
  284. package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +0 -99
  285. package/dist/extensions/agent-browser/lib/results/electron-recommendations.js +0 -83
  286. package/dist/extensions/agent-browser/lib/results/envelope-decoding.js +0 -48
  287. package/dist/extensions/agent-browser/lib/results/envelope.js +0 -198
  288. package/dist/extensions/agent-browser/lib/results/evidence-contracts.js +0 -1
  289. package/dist/extensions/agent-browser/lib/results/failure-recommendations.js +0 -180
  290. package/dist/extensions/agent-browser/lib/results/network-routes.js +0 -133
  291. package/dist/extensions/agent-browser/lib/results/network.js +0 -89
  292. package/dist/extensions/agent-browser/lib/results/next-actions.js +0 -111
  293. package/dist/extensions/agent-browser/lib/results/presentation/artifact-files.js +0 -320
  294. package/dist/extensions/agent-browser/lib/results/presentation/artifact-format.js +0 -138
  295. package/dist/extensions/agent-browser/lib/results/presentation/artifact-images.js +0 -113
  296. package/dist/extensions/agent-browser/lib/results/presentation/artifact-verification.js +0 -145
  297. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +0 -165
  298. package/dist/extensions/agent-browser/lib/results/presentation/batch-contracts.js +0 -1
  299. package/dist/extensions/agent-browser/lib/results/presentation/batch-recording.js +0 -118
  300. package/dist/extensions/agent-browser/lib/results/presentation/batch-redaction.js +0 -68
  301. package/dist/extensions/agent-browser/lib/results/presentation/batch-rendering.js +0 -135
  302. package/dist/extensions/agent-browser/lib/results/presentation/batch-step.js +0 -227
  303. package/dist/extensions/agent-browser/lib/results/presentation/batch-summary.js +0 -91
  304. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +0 -123
  305. package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +0 -54
  306. package/dist/extensions/agent-browser/lib/results/presentation/command-presenters.js +0 -216
  307. package/dist/extensions/agent-browser/lib/results/presentation/common.js +0 -81
  308. package/dist/extensions/agent-browser/lib/results/presentation/content.js +0 -119
  309. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-a11y.js +0 -67
  310. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-health.js +0 -79
  311. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-identity.js +0 -199
  312. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-logs.js +0 -75
  313. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network-actions.js +0 -216
  314. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network.js +0 -124
  315. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-redaction.js +0 -64
  316. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-storage.js +0 -209
  317. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-stream.js +0 -69
  318. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-summary.js +0 -222
  319. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +0 -124
  320. package/dist/extensions/agent-browser/lib/results/presentation/early-result.js +0 -70
  321. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +0 -285
  322. package/dist/extensions/agent-browser/lib/results/presentation/input-contracts.js +0 -1
  323. package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +0 -117
  324. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +0 -231
  325. package/dist/extensions/agent-browser/lib/results/presentation/notices.js +0 -75
  326. package/dist/extensions/agent-browser/lib/results/presentation/observation-contracts.js +0 -1
  327. package/dist/extensions/agent-browser/lib/results/presentation/observation-rendering.js +0 -127
  328. package/dist/extensions/agent-browser/lib/results/presentation/outcomes.js +0 -120
  329. package/dist/extensions/agent-browser/lib/results/presentation/output-completion.js +0 -77
  330. package/dist/extensions/agent-browser/lib/results/presentation/output-spill.js +0 -51
  331. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +0 -145
  332. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +0 -104
  333. package/dist/extensions/agent-browser/lib/results/presentation/skills.js +0 -183
  334. package/dist/extensions/agent-browser/lib/results/presentation/source.js +0 -109
  335. package/dist/extensions/agent-browser/lib/results/presentation.js +0 -19
  336. package/dist/extensions/agent-browser/lib/results/recommendation-contracts.js +0 -1
  337. package/dist/extensions/agent-browser/lib/results/recording.js +0 -88
  338. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +0 -118
  339. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +0 -60
  340. package/dist/extensions/agent-browser/lib/results/selector-recovery-target.js +0 -83
  341. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +0 -261
  342. package/dist/extensions/agent-browser/lib/results/snapshot-compact.js +0 -266
  343. package/dist/extensions/agent-browser/lib/results/snapshot-content.js +0 -32
  344. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +0 -240
  345. package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +0 -103
  346. package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +0 -383
  347. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +0 -53
  348. package/dist/extensions/agent-browser/lib/results/snapshot.js +0 -44
  349. package/dist/extensions/agent-browser/lib/results/text.js +0 -44
  350. package/dist/extensions/agent-browser/lib/runtime-args-validation.js +0 -133
  351. package/dist/extensions/agent-browser/lib/runtime-compatibility.js +0 -81
  352. package/dist/extensions/agent-browser/lib/runtime-contracts.js +0 -1
  353. package/dist/extensions/agent-browser/lib/runtime-redaction.js +0 -118
  354. package/dist/extensions/agent-browser/lib/runtime-replay-events.js +0 -144
  355. package/dist/extensions/agent-browser/lib/runtime-session-identity.js +0 -76
  356. package/dist/extensions/agent-browser/lib/runtime-session-plan.js +0 -114
  357. package/dist/extensions/agent-browser/lib/runtime-session-replay.js +0 -123
  358. package/dist/extensions/agent-browser/lib/runtime-tab-correction.js +0 -65
  359. package/dist/extensions/agent-browser/lib/runtime-timeouts.js +0 -28
  360. package/dist/extensions/agent-browser/lib/runtime.js +0 -163
  361. package/dist/extensions/agent-browser/lib/session-identity.js +0 -51
  362. package/dist/extensions/agent-browser/lib/session-page-observation.js +0 -357
  363. package/dist/extensions/agent-browser/lib/session-page-state.js +0 -353
  364. package/dist/extensions/agent-browser/lib/session-page-types.js +0 -1
  365. package/dist/extensions/agent-browser/lib/string-enum-schema.js +0 -8
  366. package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +0 -81
  367. package/dist/extensions/agent-browser/lib/temp-mutation-queue.js +0 -7
  368. package/dist/extensions/agent-browser/lib/temp-root-ownership.js +0 -234
  369. package/dist/extensions/agent-browser/lib/temp-root.js +0 -211
  370. package/dist/extensions/agent-browser/lib/temp.js +0 -91
  371. package/dist/extensions/agent-browser/lib/tool-surface.js +0 -239
  372. package/dist/extensions/agent-browser/lib/upstream-version.js +0 -15
  373. package/dist/extensions/agent-browser/lib/web-search-providers.js +0 -193
  374. package/dist/extensions/agent-browser/lib/web-search-request.js +0 -102
  375. package/dist/extensions/agent-browser/lib/web-search-results.js +0 -281
  376. package/dist/extensions/agent-browser/lib/web-search-schema.js +0 -82
  377. package/dist/extensions/agent-browser/lib/web-search.js +0 -167
  378. package/dist/extensions/agent-browser/lib/webmcp-observation.js +0 -35
  379. package/dist/extensions/agent-browser/lib/windows-stock-launcher.js +0 -96
  380. package/dist/scripts/agent-browser-target.mjs +0 -23
@@ -1,193 +0,0 @@
1
- import { readFile } from "node:fs/promises";
2
- import { join } from "node:path";
3
- import { isRecord } from "./parsing.js";
4
- const DIRECT_AGENT_BROWSER_BASH_BYPASS_ENV = "PI_AGENT_BROWSER_ALLOW_DIRECT_BASH";
5
- const DIRECT_AGENT_BROWSER_EXECUTABLE_PATTERN = /^(?:[.~]|\.\.?|\/)?(?:[^\s;&|]+\/)?agent-browser$/;
6
- const HARMLESS_AGENT_BROWSER_INSPECTION_PATTERN = /^\s*(?:command\s+-v|which|type\s+-P)\s+agent-browser\s*$/;
7
- const PACKAGE_NAME = "pi-agent-browser-native";
8
- function isShellAssignmentToken(token) {
9
- return /^[A-Za-z_][A-Za-z0-9_]*=/.test(token);
10
- }
11
- function stripOuterQuotes(token) {
12
- if (token.length >= 2 &&
13
- ((token.startsWith('"') && token.endsWith('"')) ||
14
- (token.startsWith("'") && token.endsWith("'")))) {
15
- return token.slice(1, -1);
16
- }
17
- return token;
18
- }
19
- function skipAssignments(tokens, start) {
20
- let index = start;
21
- while (index < tokens.length && isShellAssignmentToken(tokens[index])) {
22
- index += 1;
23
- }
24
- return index;
25
- }
26
- function skipRunnerOptions(tokens, start) {
27
- let index = start;
28
- while (index < tokens.length && tokens[index].startsWith("-")) {
29
- index += 1;
30
- }
31
- return index;
32
- }
33
- function separatorWidth(command, index) {
34
- const char = command[index];
35
- if (char !== "\n" && char !== "|" && char !== ";" && char !== "&") {
36
- return 0;
37
- }
38
- const operator = command.slice(index, index + 2);
39
- return operator === "&&" || operator === "||" ? 2 : 1;
40
- }
41
- function segmentLaunchesAgentBrowser(tokens) {
42
- let index = skipAssignments(tokens, 0);
43
- if (index >= tokens.length) {
44
- return false;
45
- }
46
- if (tokens[index] === "env") {
47
- index = skipAssignments(tokens, index + 1);
48
- }
49
- if (tokens[index] === "npx" || tokens[index] === "bunx") {
50
- index = skipRunnerOptions(tokens, index + 1);
51
- }
52
- if (tokens[index] === "pnpm" || tokens[index] === "yarn") {
53
- if (tokens[index + 1] !== "dlx") {
54
- return false;
55
- }
56
- index = skipRunnerOptions(tokens, index + 2);
57
- }
58
- return DIRECT_AGENT_BROWSER_EXECUTABLE_PATTERN.test(tokens[index] ?? "");
59
- }
60
- /** Owns only the best-effort lexical scan, not shell execution or authorization. */
61
- class ShellLaunchScanner {
62
- currentToken = "";
63
- quoteState;
64
- awaitingHeredocDelimiter;
65
- pendingHeredoc;
66
- pendingHeredocLine = "";
67
- segmentTokens = [];
68
- flushToken() {
69
- const token = this.currentToken;
70
- this.currentToken = "";
71
- if (token.length === 0) {
72
- return;
73
- }
74
- if (this.awaitingHeredocDelimiter) {
75
- this.pendingHeredoc = {
76
- delimiter: stripOuterQuotes(token),
77
- stripTabs: this.awaitingHeredocDelimiter.stripTabs,
78
- };
79
- this.awaitingHeredocDelimiter = undefined;
80
- return;
81
- }
82
- this.segmentTokens.push(token);
83
- }
84
- flushSegment() {
85
- this.flushToken();
86
- const launches = segmentLaunchesAgentBrowser(this.segmentTokens);
87
- this.segmentTokens = [];
88
- return launches;
89
- }
90
- consumeHeredoc(char) {
91
- const heredoc = this.pendingHeredoc;
92
- if (!heredoc) {
93
- return false;
94
- }
95
- if (char !== "\n") {
96
- this.pendingHeredocLine += char;
97
- return true;
98
- }
99
- const candidate = heredoc.stripTabs
100
- ? this.pendingHeredocLine.replace(/^\t+/, "")
101
- : this.pendingHeredocLine;
102
- if (candidate === heredoc.delimiter) {
103
- this.pendingHeredoc = undefined;
104
- }
105
- this.pendingHeredocLine = "";
106
- return true;
107
- }
108
- consumeQuoted(command, index) {
109
- const char = command[index];
110
- if (this.quoteState === undefined) {
111
- return undefined;
112
- }
113
- this.currentToken += char;
114
- if (this.quoteState === "double" && char === "\\" && index + 1 < command.length) {
115
- this.currentToken += command[index + 1];
116
- return index + 1;
117
- }
118
- if ((this.quoteState === "single" && char === "'") ||
119
- (this.quoteState === "double" && char === '"')) {
120
- this.quoteState = undefined;
121
- }
122
- return index;
123
- }
124
- consumeTokenCharacter(command, index) {
125
- const char = command[index];
126
- if (char === "'" || char === '"') {
127
- this.currentToken += char;
128
- this.quoteState = char === "'" ? "single" : "double";
129
- return index;
130
- }
131
- if (char === "\\" && index + 1 < command.length) {
132
- this.currentToken += char + command[index + 1];
133
- return index + 1;
134
- }
135
- if (char !== "\n" && /\s/.test(char)) {
136
- this.flushToken();
137
- return index;
138
- }
139
- if (command.slice(index, index + 2) === "<<") {
140
- this.flushToken();
141
- const stripTabs = command[index + 2] === "-";
142
- this.awaitingHeredocDelimiter = { stripTabs };
143
- return index + (stripTabs ? 2 : 1);
144
- }
145
- return undefined;
146
- }
147
- scan(command) {
148
- for (let index = 0; index < command.length; index += 1) {
149
- if (this.consumeHeredoc(command[index])) {
150
- continue;
151
- }
152
- const consumed = this.consumeQuoted(command, index) ?? this.consumeTokenCharacter(command, index);
153
- if (consumed !== undefined) {
154
- index = consumed;
155
- continue;
156
- }
157
- const width = separatorWidth(command, index);
158
- if (width > 0) {
159
- if (this.flushSegment()) {
160
- return true;
161
- }
162
- index += width - 1;
163
- continue;
164
- }
165
- this.currentToken += command[index];
166
- }
167
- return this.flushSegment();
168
- }
169
- }
170
- // Best-effort detection for common direct launches only. This is an ergonomics guard,
171
- // not a general-purpose bash parser or security boundary.
172
- export function looksLikeDirectAgentBrowserBash(command) {
173
- return new ShellLaunchScanner().scan(command);
174
- }
175
- export function isHarmlessAgentBrowserInspectionCommand(command) {
176
- return HARMLESS_AGENT_BROWSER_INSPECTION_PATTERN.test(command);
177
- }
178
- function isTruthyEnvValue(value) {
179
- return value === "1" || value?.toLowerCase() === "true" || value?.toLowerCase() === "yes";
180
- }
181
- async function isPackageDevelopmentCwd(cwd) {
182
- try {
183
- const packageJson = JSON.parse(await readFile(join(cwd, "package.json"), "utf8"));
184
- return isRecord(packageJson) && packageJson.name === PACKAGE_NAME;
185
- }
186
- catch {
187
- return false;
188
- }
189
- }
190
- export async function isDirectAgentBrowserBashAllowed(cwd) {
191
- return (isTruthyEnvValue(process.env[DIRECT_AGENT_BROWSER_BASH_BYPASS_ENV]) ||
192
- (await isPackageDevelopmentCwd(cwd)));
193
- }
@@ -1,131 +0,0 @@
1
- import { extractUpstreamCommandTokens } from "./argv-descriptor.js";
2
- import { isCloseAllCommand, isCloseCommand } from "./command-taxonomy.js";
3
- import { isRecord } from "./parsing.js";
4
- import { isSuccessfulNativeConfirmedClose } from "./native-confirmation.js";
5
- import { detectConfirmationRequired } from "./results/confirmation.js";
6
- function rowCommand(value, fallback) {
7
- return Array.isArray(value) && value.every((token) => typeof token === "string")
8
- ? value
9
- : fallback;
10
- }
11
- function rowResult(row) {
12
- if (isRecord(row.result)) {
13
- return row.result;
14
- }
15
- return isRecord(row.data) ? row.data : undefined;
16
- }
17
- function rowBrowserLaunched(row, result) {
18
- const lifecycle = isRecord(row.lifecycle) ? row.lifecycle : result?.lifecycle;
19
- if (!isRecord(lifecycle) || !isRecord(lifecycle.effectiveLaunch)) {
20
- return undefined;
21
- }
22
- const launched = lifecycle.effectiveLaunch.browserLaunched;
23
- return typeof launched === "boolean" ? launched : undefined;
24
- }
25
- function lifecycleStep(value, fallback) {
26
- if (!isRecord(value)) {
27
- return undefined;
28
- }
29
- const result = rowResult(value);
30
- const command = rowCommand(value.command, fallback);
31
- return {
32
- result,
33
- succeeded: value.success === true,
34
- browserLaunched: rowBrowserLaunched(value, result),
35
- tokens: command === undefined ? undefined : extractUpstreamCommandTokens(command),
36
- };
37
- }
38
- export function batchHasSuccessfulCloseAll(data, fallbackCommands = []) {
39
- if (!Array.isArray(data)) {
40
- return false;
41
- }
42
- return data.some((row, index) => {
43
- if (!isRecord(row) || row.success !== true) {
44
- return false;
45
- }
46
- const command = rowCommand(row.command, fallbackCommands.at(index));
47
- return (command !== undefined &&
48
- !detectConfirmationRequired(row.result) &&
49
- isCloseAllCommand(extractUpstreamCommandTokens(command)));
50
- });
51
- }
52
- function successfulClose(step) {
53
- return (step.succeeded &&
54
- step.tokens !== undefined &&
55
- !detectConfirmationRequired(step.result) &&
56
- (isCloseCommand(step.tokens[0]) || isSuccessfulNativeConfirmedClose(step.tokens, step.result)));
57
- }
58
- function closedState(step) {
59
- const result = step.result;
60
- const closeData = step.tokens?.[0] === "confirm" && isRecord(result) && isRecord(result.result)
61
- ? result.result.data
62
- : result;
63
- return {
64
- endsClosed: true,
65
- browserActiveAfterClose: false,
66
- recordingClosedAfterBatch: true,
67
- statePath: isRecord(closeData) && typeof closeData.statePath === "string"
68
- ? closeData.statePath
69
- : undefined,
70
- };
71
- }
72
- function recordingState(state, step) {
73
- const relaunched = step.browserLaunched !== false;
74
- const browserActiveAfterClose = state.browserActiveAfterClose || relaunched;
75
- let recordingClosedAfterBatch = state.recordingClosedAfterBatch;
76
- const subcommand = step.tokens?.[1];
77
- if (step.succeeded && subcommand === "stop") {
78
- recordingClosedAfterBatch = true;
79
- }
80
- else if (step.succeeded &&
81
- browserActiveAfterClose &&
82
- (subcommand === "start" || subcommand === "restart")) {
83
- recordingClosedAfterBatch = false;
84
- }
85
- return {
86
- ...state,
87
- endsClosed: state.endsClosed && !relaunched,
88
- browserActiveAfterClose,
89
- recordingClosedAfterBatch,
90
- };
91
- }
92
- function advanceClosedState(state, step) {
93
- if (step.tokens?.[0] === "record") {
94
- return recordingState(state, step);
95
- }
96
- if (step.browserLaunched === false) {
97
- return state;
98
- }
99
- return {
100
- ...state,
101
- endsClosed: false,
102
- browserActiveAfterClose: true,
103
- recordingClosedAfterBatch: step.tokens === undefined ? false : state.recordingClosedAfterBatch,
104
- };
105
- }
106
- /** Fold in execution order. Unknown launch evidence conservatively retains active ownership, including failed rows. */
107
- export function getSuccessfulBatchCloseLifecycle(rows, fallbackCommands = []) {
108
- if (!Array.isArray(rows)) {
109
- return undefined;
110
- }
111
- let state;
112
- for (const [index, row] of rows.entries()) {
113
- const step = lifecycleStep(row, fallbackCommands.at(index));
114
- if (step === undefined) {
115
- continue;
116
- }
117
- if (successfulClose(step)) {
118
- state = closedState(step);
119
- }
120
- else if (state !== undefined) {
121
- state = advanceClosedState(state, step);
122
- }
123
- }
124
- return state === undefined
125
- ? undefined
126
- : {
127
- endsClosed: state.endsClosed,
128
- recordingClosedAfterBatch: state.recordingClosedAfterBatch,
129
- statePath: state.statePath,
130
- };
131
- }
@@ -1,61 +0,0 @@
1
- import { isRecord } from "./parsing.js";
2
- import { isBrowserStringArray } from "./browser-value-parsing.js";
3
- export const POLICY_LOCK_MAX_BYTES = 1_048_576;
4
- function claimNumber(value) {
5
- return typeof value === "number" && Number.isSafeInteger(value) && value > 0 ? value : undefined;
6
- }
7
- function claimStartIdentity(value) {
8
- return typeof value === "string" && value.length > 0 ? value : undefined;
9
- }
10
- function validClaimToken(value) {
11
- return (typeof value === "string" &&
12
- value.length > 0 &&
13
- !value.includes("/") &&
14
- !value.includes("\\") &&
15
- !value.includes("\0"));
16
- }
17
- function claimSessionNames(value) {
18
- if (value === null) {
19
- return null;
20
- }
21
- return isBrowserStringArray(value) && value.length > 0 ? value : undefined;
22
- }
23
- export function parseOwner(content) {
24
- if (Buffer.byteLength(content) > POLICY_LOCK_MAX_BYTES) {
25
- return undefined;
26
- }
27
- try {
28
- const parsed = JSON.parse(content);
29
- if (!isRecord(parsed) || parsed.version !== 4) {
30
- return undefined;
31
- }
32
- const pid = claimNumber(parsed.pid);
33
- const sessionNames = claimSessionNames(parsed.sessionNames);
34
- const startIdentity = claimStartIdentity(parsed.startIdentity);
35
- if (pid === undefined ||
36
- sessionNames === undefined ||
37
- startIdentity === undefined ||
38
- !validClaimToken(parsed.token)) {
39
- return undefined;
40
- }
41
- return { sessionNames, pid, startIdentity, token: parsed.token, version: 4 };
42
- }
43
- catch {
44
- return undefined;
45
- }
46
- }
47
- export function parseTicket(content, token) {
48
- if (Buffer.byteLength(content) > POLICY_LOCK_MAX_BYTES) {
49
- return undefined;
50
- }
51
- try {
52
- const parsed = JSON.parse(content);
53
- if (!isRecord(parsed) || parsed.version !== 4 || parsed.token !== token) {
54
- return undefined;
55
- }
56
- return claimNumber(parsed.ticket);
57
- }
58
- catch {
59
- return undefined;
60
- }
61
- }
@@ -1,232 +0,0 @@
1
- import { randomInt, randomUUID } from "node:crypto";
2
- import { lstat, readFile, readdir, rename, rm } from "node:fs/promises";
3
- import { basename, dirname, join } from "node:path";
4
- import { processStartIdentitiesMatch, readProcessStartIdentity } from "./process-identity.js";
5
- import { getErrorCode } from "./process-errors.js";
6
- import { parseOwner, parseTicket, POLICY_LOCK_MAX_BYTES, } from "./browser-execution-claim-codec.js";
7
- export const POLICY_LOCK_WAIT_MS = 1_000;
8
- export const LOCK_OWNER_FILE = "owner.json";
9
- export const LOCK_TICKET_FILE = "ticket.json";
10
- const STALE_CLAIM_MIN_AGE_MS = 30 * 60 * 1_000;
11
- const POLICY_GC_BATCH_SIZE = 8;
12
- let lastPolicyGcName;
13
- function secureEntry(entry, directory) {
14
- if (entry.isSymbolicLink() || (directory ? !entry.isDirectory() : !entry.isFile())) {
15
- return false;
16
- }
17
- if (!directory && entry.size > POLICY_LOCK_MAX_BYTES) {
18
- return false;
19
- }
20
- return secureEntryOwnership(entry, directory ? 0o077 : 0o177);
21
- }
22
- function secureEntryOwnership(entry, mask) {
23
- if (process.platform === "win32") {
24
- return true;
25
- }
26
- const uid = typeof process.getuid === "function" ? process.getuid() : undefined;
27
- return uid !== undefined && entry.uid === uid && (entry.mode & mask) === 0;
28
- }
29
- async function readClaimTicket(path, owner) {
30
- const ticketPath = join(path, LOCK_TICKET_FILE);
31
- try {
32
- if (!secureEntry(await lstat(ticketPath), false)) {
33
- return undefined;
34
- }
35
- const ticket = parseTicket(await readFile(ticketPath, "utf8"), owner.token);
36
- return ticket === undefined ? undefined : { owner, path, ticket };
37
- }
38
- catch (error) {
39
- return getErrorCode(error) === "ENOENT" ? { owner, path, ticket: null } : undefined;
40
- }
41
- }
42
- export async function readClaim(path) {
43
- try {
44
- const directory = await lstat(path);
45
- const ownerPath = join(path, LOCK_OWNER_FILE);
46
- const ownerEntry = await lstat(ownerPath);
47
- if (!secureEntry(directory, true) || !secureEntry(ownerEntry, false)) {
48
- return undefined;
49
- }
50
- const owner = parseOwner(await readFile(ownerPath, "utf8"));
51
- return owner ? await readClaimTicket(path, owner) : undefined;
52
- }
53
- catch {
54
- return undefined;
55
- }
56
- }
57
- async function claimDisappeared(path) {
58
- try {
59
- await lstat(path);
60
- return false;
61
- }
62
- catch (error) {
63
- return getErrorCode(error) === "ENOENT";
64
- }
65
- }
66
- export async function readClaims(basePath) {
67
- const directory = dirname(basePath);
68
- const prefix = `${basename(basePath)}.claim-`;
69
- let names;
70
- try {
71
- names = await readdir(directory);
72
- }
73
- catch {
74
- return undefined;
75
- }
76
- const claims = [];
77
- for (const name of names.filter((candidate) => candidate.startsWith(prefix))) {
78
- const path = join(directory, name);
79
- // Claim absence must be resolved before accepting the next contender.
80
- // oxlint-disable-next-line no-await-in-loop
81
- const claim = await readClaim(path);
82
- if (!claim) {
83
- // A disappearing immutable claim is not a corrupt contender.
84
- // oxlint-disable-next-line no-await-in-loop
85
- if (await claimDisappeared(path)) {
86
- continue;
87
- }
88
- return undefined;
89
- }
90
- if (name !== `${prefix}${claim.owner.token}`) {
91
- return undefined;
92
- }
93
- claims.push(claim);
94
- }
95
- return claims;
96
- }
97
- export async function ownerAlive(owner, budget) {
98
- try {
99
- process.kill(owner.pid, 0);
100
- }
101
- catch (error) {
102
- const code = getErrorCode(error);
103
- if (code === "ESRCH") {
104
- return false;
105
- }
106
- if (code !== "EPERM") {
107
- return undefined;
108
- }
109
- }
110
- const current = await readProcessStartIdentity(owner.pid, process.platform, budget);
111
- return current === undefined
112
- ? undefined
113
- : processStartIdentitiesMatch(owner.startIdentity, current);
114
- }
115
- export function waitForRetry(signal) {
116
- return new Promise((resolve) => {
117
- if (signal?.aborted === true) {
118
- resolve();
119
- return;
120
- }
121
- const timer = setTimeout(done, 10);
122
- function done() {
123
- clearTimeout(timer);
124
- signal?.removeEventListener("abort", done);
125
- resolve();
126
- }
127
- signal?.addEventListener("abort", done, { once: true });
128
- });
129
- }
130
- async function moveOwnedClaim(path, movedPath, token, deadline) {
131
- while (true) {
132
- // Each retry must revalidate ownership before another move attempt.
133
- // oxlint-disable-next-line no-await-in-loop
134
- if ((await readClaim(path))?.owner.token !== token) {
135
- return undefined;
136
- }
137
- try {
138
- // Windows readers may temporarily hold the directory; moves stay serialized.
139
- // oxlint-disable-next-line no-await-in-loop
140
- await rename(path, movedPath);
141
- return "moved";
142
- }
143
- catch (error) {
144
- const code = getErrorCode(error);
145
- if (code === "ENOENT") {
146
- return "absent";
147
- }
148
- if (process.platform !== "win32" || code !== "EPERM" || Date.now() >= deadline) {
149
- return undefined;
150
- }
151
- // Retry only after a bounded pause, then revalidate the same immutable owner.
152
- // oxlint-disable-next-line no-await-in-loop
153
- await waitForRetry();
154
- if (Date.now() >= deadline) {
155
- return undefined;
156
- }
157
- }
158
- }
159
- }
160
- export async function removeClaimOwnedBy(path, token, deadline = 0) {
161
- const movedPath = join(dirname(path), `.pi-agent-browser-policy-remove-${token}-${randomUUID()}`);
162
- const movement = await moveOwnedClaim(path, movedPath, token, deadline);
163
- if (movement === "absent") {
164
- return true;
165
- }
166
- if (movement !== "moved") {
167
- return false;
168
- }
169
- const moved = await readClaim(movedPath);
170
- if (moved?.owner.token !== token) {
171
- try {
172
- await rename(movedPath, path);
173
- }
174
- catch {
175
- /* An unverified moved claim remains unavailable to contenders. */
176
- }
177
- return false;
178
- }
179
- await rm(movedPath, { force: true, recursive: true });
180
- return true;
181
- }
182
- function gcBatch(names) {
183
- // ponytail: list/sort all names; stream directories if enumeration becomes the bottleneck.
184
- const candidates = names
185
- .filter((name) => name.startsWith(".pi-agent-browser-policy-remove-") ||
186
- /^\.pi-agent-browser-policy-[a-f0-9]{64}\.lock-v4\.(?:candidate|claim)-/.test(name))
187
- .sort();
188
- if (candidates.length === 0) {
189
- return [];
190
- }
191
- const previous = lastPolicyGcName;
192
- const start = previous === undefined
193
- ? randomInt(candidates.length)
194
- : Math.max(0, candidates.findIndex((name) => name > previous));
195
- const batch = Array.from({ length: Math.min(POLICY_GC_BATCH_SIZE, candidates.length) }, (_, offset) => candidates[(start + offset) % candidates.length]);
196
- lastPolicyGcName = batch.at(-1);
197
- return batch;
198
- }
199
- async function cleanDeadClaim(directory, name, budget) {
200
- const path = join(directory, name);
201
- const published = name.includes(".lock-v4.claim-");
202
- if (published) {
203
- const entry = await lstat(path).catch(() => undefined);
204
- if (!entry || entry.mtimeMs >= Date.now() - STALE_CLAIM_MIN_AGE_MS) {
205
- return;
206
- }
207
- }
208
- const claim = await readClaim(path);
209
- if (!claim || (published && !name.endsWith(`.claim-${claim.owner.token}`))) {
210
- return;
211
- }
212
- if ((await ownerAlive(claim.owner, budget)) === false) {
213
- await removeClaimOwnedBy(path, claim.owner.token).catch(() => false);
214
- }
215
- }
216
- export async function cleanDeadPolicyArtifacts(directory, budget) {
217
- let names;
218
- try {
219
- names = await readdir(directory);
220
- }
221
- catch {
222
- return;
223
- }
224
- for (const name of gcBatch(names)) {
225
- if (budget.signal?.aborted === true || Date.now() >= (budget.deadline ?? Infinity)) {
226
- return;
227
- }
228
- // Bounded GC respects the acquisition budget between native liveness probes.
229
- // oxlint-disable-next-line no-await-in-loop
230
- await cleanDeadClaim(directory, name, budget);
231
- }
232
- }