pi-agent-browser-native 0.9.3 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/CHANGELOG.md +77 -5
  2. package/README.md +103 -81
  3. package/dist/extensions/agent-browser/index.js +43057 -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 +218 -0
  33. package/dist/extensions/agent-browser/lib/config.js +19 -7
  34. package/dist/extensions/agent-browser/lib/electron/cdp.js +15 -7
  35. package/dist/extensions/agent-browser/lib/electron/cleanup.js +134 -55
  36. package/dist/extensions/agent-browser/lib/electron/discovery-darwin.js +109 -0
  37. package/dist/extensions/agent-browser/lib/electron/discovery-desktop.js +136 -0
  38. package/dist/extensions/agent-browser/lib/electron/discovery-evidence.js +89 -0
  39. package/dist/extensions/agent-browser/lib/electron/discovery-linux.js +93 -0
  40. package/dist/extensions/agent-browser/lib/electron/discovery-packages.js +162 -0
  41. package/dist/extensions/agent-browser/lib/electron/discovery-types.js +2 -0
  42. package/dist/extensions/agent-browser/lib/electron/discovery.js +140 -549
  43. package/dist/extensions/agent-browser/lib/electron/launch-monitor.js +102 -0
  44. package/dist/extensions/agent-browser/lib/electron/launch-process.js +209 -0
  45. package/dist/extensions/agent-browser/lib/electron/launch-types.js +2 -0
  46. package/dist/extensions/agent-browser/lib/electron/launch.js +249 -354
  47. package/dist/extensions/agent-browser/lib/executable-path.js +21 -12
  48. package/dist/extensions/agent-browser/lib/execution-cwd.js +35 -18
  49. package/dist/extensions/agent-browser/lib/input-modes/electron.js +162 -121
  50. package/dist/extensions/agent-browser/lib/input-modes/job.js +116 -313
  51. package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +104 -0
  52. package/dist/extensions/agent-browser/lib/input-modes/lookup-plan.js +132 -0
  53. package/dist/extensions/agent-browser/lib/input-modes/lookup-redaction.js +57 -0
  54. package/dist/extensions/agent-browser/lib/input-modes/lookup-source-evidence.js +151 -0
  55. package/dist/extensions/agent-browser/lib/input-modes/lookup-workspace.js +142 -0
  56. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +57 -412
  57. package/dist/extensions/agent-browser/lib/input-modes/params.js +63 -17
  58. package/dist/extensions/agent-browser/lib/input-modes/qa-analysis.js +268 -0
  59. package/dist/extensions/agent-browser/lib/input-modes/qa-presentation.js +117 -0
  60. package/dist/extensions/agent-browser/lib/input-modes/script-child.js +396 -0
  61. package/dist/extensions/agent-browser/lib/input-modes/script-protocol.js +86 -0
  62. package/dist/extensions/agent-browser/lib/input-modes/script-types.js +1 -0
  63. package/dist/extensions/agent-browser/lib/input-modes/script-validation.js +60 -0
  64. package/dist/extensions/agent-browser/lib/input-modes/script.js +60 -409
  65. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +218 -128
  66. package/dist/extensions/agent-browser/lib/input-modes/shared.js +15 -4
  67. package/dist/extensions/agent-browser/lib/input-modes/types.js +56 -7
  68. package/dist/extensions/agent-browser/lib/json-schema.js +22 -10
  69. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +17 -5
  70. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +92 -425
  71. package/dist/extensions/agent-browser/lib/managed-session-posix-storage.js +58 -0
  72. package/dist/extensions/agent-browser/lib/managed-session-project-identity.js +244 -0
  73. package/dist/extensions/agent-browser/lib/managed-session-restore-context.js +84 -0
  74. package/dist/extensions/agent-browser/lib/managed-session-restore-policy.js +119 -0
  75. package/dist/extensions/agent-browser/lib/managed-session-restore-state.js +83 -0
  76. package/dist/extensions/agent-browser/lib/managed-session-restore.js +168 -300
  77. package/dist/extensions/agent-browser/lib/managed-session-snapshot-records.js +277 -0
  78. package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +128 -305
  79. package/dist/extensions/agent-browser/lib/managed-session-storage.js +56 -253
  80. package/dist/extensions/agent-browser/lib/native-confirmation.js +140 -0
  81. package/dist/extensions/agent-browser/lib/native-output.js +43 -9
  82. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +106 -59
  83. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-merge.js +14 -6
  84. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +109 -57
  85. package/dist/extensions/agent-browser/lib/orchestration/browser-run/browser-observation-result.js +82 -0
  86. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +164 -60
  87. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostic-values.js +31 -0
  88. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +152 -781
  89. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-observation.js +202 -0
  90. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-text-diagnostics.js +109 -0
  91. package/dist/extensions/agent-browser/lib/orchestration/browser-run/fill-diagnostics.js +119 -0
  92. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-action-recovery.js +147 -0
  93. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-actions.js +144 -0
  94. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-content.js +123 -0
  95. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-contracts.js +1 -0
  96. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-details.js +156 -0
  97. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-electron.js +179 -0
  98. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-evidence.js +39 -0
  99. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-missing-binary.js +89 -0
  100. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-recovery.js +97 -0
  101. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-redaction.js +106 -0
  102. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-timeout.js +110 -0
  103. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +41 -538
  104. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +199 -154
  105. package/dist/extensions/agent-browser/lib/orchestration/browser-run/interaction-diagnostics.js +290 -0
  106. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-close.js +167 -0
  107. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-inspection.js +108 -0
  108. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +127 -205
  109. package/dist/extensions/agent-browser/lib/orchestration/browser-run/native-helper-observation.js +65 -0
  110. package/dist/extensions/agent-browser/lib/orchestration/browser-run/observation-types.js +1 -0
  111. package/dist/extensions/agent-browser/lib/orchestration/browser-run/overlay-diagnostics.js +120 -0
  112. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +113 -30
  113. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +109 -28
  114. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter-data.js +150 -0
  115. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +138 -253
  116. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-rendered-text.js +147 -0
  117. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +59 -24
  118. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-artifacts.js +159 -0
  119. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-command.js +131 -0
  120. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-contracts.js +1 -0
  121. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-daemon.js +93 -0
  122. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-failure.js +42 -0
  123. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-guards.js +242 -0
  124. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-input.js +75 -0
  125. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-observations.js +92 -0
  126. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-selection.js +254 -0
  127. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-state.js +121 -0
  128. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-refs.js +130 -0
  129. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-resources.js +114 -0
  130. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-semantic.js +121 -0
  131. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-session-plan.js +222 -0
  132. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-timeouts.js +68 -0
  133. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +176 -1123
  134. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-analysis.js +191 -0
  135. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-confirmation.js +152 -0
  136. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-diagnostics.js +182 -0
  137. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-electron.js +150 -0
  138. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-contracts.js +1 -0
  139. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase-contracts.js +1 -0
  140. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase.js +115 -0
  141. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle.js +256 -0
  142. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed-contracts.js +1 -0
  143. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed.js +256 -0
  144. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase-contracts.js +1 -0
  145. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase.js +93 -0
  146. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native.js +113 -0
  147. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation-contracts.js +1 -0
  148. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation.js +316 -0
  149. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-ownership.js +28 -0
  150. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase-contracts.js +1 -0
  151. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase.js +142 -0
  152. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation-contracts.js +1 -0
  153. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation.js +333 -0
  154. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase-contracts.js +1 -0
  155. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase.js +71 -0
  156. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication.js +201 -0
  157. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-receipts.js +183 -0
  158. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-refs.js +200 -0
  159. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-tabs.js +142 -0
  160. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +18 -968
  161. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +23 -13
  162. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-receipt-reconciliation.js +198 -0
  163. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-contracts.js +1 -0
  164. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-presentation.js +154 -0
  165. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery.js +68 -151
  166. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-capture.js +14 -0
  167. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-observation.js +169 -46
  168. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-commands.js +130 -0
  169. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-electron.js +210 -0
  170. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-observations.js +61 -0
  171. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-outcomes.js +187 -0
  172. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-refs.js +171 -0
  173. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-tabs.js +228 -0
  174. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +77 -765
  175. package/dist/extensions/agent-browser/lib/orchestration/browser-run/text-visibility-diagnostics.js +182 -0
  176. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-diagnostics.js +256 -0
  177. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-progress.js +108 -0
  178. package/dist/extensions/agent-browser/lib/orchestration/code-artifact-observation.js +39 -0
  179. package/dist/extensions/agent-browser/lib/orchestration/code-image-observation.js +119 -0
  180. package/dist/extensions/agent-browser/lib/orchestration/electron-host/branch.js +92 -0
  181. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup-result.js +58 -0
  182. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup.js +78 -0
  183. package/dist/extensions/agent-browser/lib/orchestration/electron-host/contracts.js +1 -0
  184. package/dist/extensions/agent-browser/lib/orchestration/electron-host/discovery.js +106 -0
  185. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +48 -821
  186. package/dist/extensions/agent-browser/lib/orchestration/electron-host/policy.js +86 -0
  187. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-collection.js +69 -0
  188. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +167 -0
  189. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +164 -0
  190. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe.js +161 -0
  191. package/dist/extensions/agent-browser/lib/orchestration/electron-host/status.js +165 -0
  192. package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +21 -9
  193. package/dist/extensions/agent-browser/lib/orchestration/extension-artifact-preflight.js +211 -0
  194. package/dist/extensions/agent-browser/lib/orchestration/extension-artifacts.js +23 -0
  195. package/dist/extensions/agent-browser/lib/orchestration/extension-attachment-replay.js +99 -0
  196. package/dist/extensions/agent-browser/lib/orchestration/extension-branch-restore.js +275 -0
  197. package/dist/extensions/agent-browser/lib/orchestration/extension-code.js +280 -0
  198. package/dist/extensions/agent-browser/lib/orchestration/extension-command-admission.js +303 -0
  199. package/dist/extensions/agent-browser/lib/orchestration/extension-command-output.js +36 -0
  200. package/dist/extensions/agent-browser/lib/orchestration/extension-command-result.js +335 -0
  201. package/dist/extensions/agent-browser/lib/orchestration/extension-command-run.js +227 -0
  202. package/dist/extensions/agent-browser/lib/orchestration/extension-command-state.js +1 -0
  203. package/dist/extensions/agent-browser/lib/orchestration/extension-electron-ownership.js +204 -0
  204. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-locks.js +139 -0
  205. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-queue.js +24 -0
  206. package/dist/extensions/agent-browser/lib/orchestration/extension-host-coordination.js +98 -0
  207. package/dist/extensions/agent-browser/lib/orchestration/extension-host-run.js +295 -0
  208. package/dist/extensions/agent-browser/lib/orchestration/extension-intent-replay.js +41 -0
  209. package/dist/extensions/agent-browser/lib/orchestration/extension-invocation.js +7 -0
  210. package/dist/extensions/agent-browser/lib/orchestration/extension-lifecycle.js +102 -0
  211. package/dist/extensions/agent-browser/lib/orchestration/extension-managed-ownership.js +133 -0
  212. package/dist/extensions/agent-browser/lib/orchestration/extension-observation.js +120 -0
  213. package/dist/extensions/agent-browser/lib/orchestration/extension-prompt.js +180 -0
  214. package/dist/extensions/agent-browser/lib/orchestration/extension-recording.js +290 -0
  215. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-contracts.js +1 -0
  216. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-replay.js +269 -0
  217. package/dist/extensions/agent-browser/lib/orchestration/extension-result-state.js +113 -0
  218. package/dist/extensions/agent-browser/lib/orchestration/extension-runtime.js +146 -0
  219. package/dist/extensions/agent-browser/lib/orchestration/extension-script-leases.js +58 -0
  220. package/dist/extensions/agent-browser/lib/orchestration/extension-tool-boundary.js +62 -0
  221. package/dist/extensions/agent-browser/lib/orchestration/extension-version-check.js +54 -0
  222. package/dist/extensions/agent-browser/lib/orchestration/input-plan-types.js +1 -0
  223. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +261 -185
  224. package/dist/extensions/agent-browser/lib/orchestration/input-redaction.js +62 -0
  225. package/dist/extensions/agent-browser/lib/orchestration/native-config.js +144 -0
  226. package/dist/extensions/agent-browser/lib/orchestration/native-root-launch.js +77 -0
  227. package/dist/extensions/agent-browser/lib/orchestration/native-session-defaults.js +210 -157
  228. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  229. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +197 -99
  230. package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +199 -96
  231. package/dist/extensions/agent-browser/lib/owned-managed-session-context.js +55 -0
  232. package/dist/extensions/agent-browser/lib/page-target-batch.js +118 -0
  233. package/dist/extensions/agent-browser/lib/page-target-guards.js +50 -0
  234. package/dist/extensions/agent-browser/lib/page-target-navigation.js +104 -0
  235. package/dist/extensions/agent-browser/lib/page-target-validation.js +55 -246
  236. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  237. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +133 -68
  238. package/dist/extensions/agent-browser/lib/playbook.js +16 -12
  239. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  240. package/dist/extensions/agent-browser/lib/process-environment.js +13 -6
  241. package/dist/extensions/agent-browser/lib/process-errors.js +23 -0
  242. package/dist/extensions/agent-browser/lib/process-identity.js +47 -15
  243. package/dist/extensions/agent-browser/lib/process-socket-storage.js +256 -0
  244. package/dist/extensions/agent-browser/lib/process-stdout.js +74 -0
  245. package/dist/extensions/agent-browser/lib/process.js +145 -536
  246. package/dist/extensions/agent-browser/lib/prompt-artifacts.js +287 -0
  247. package/dist/extensions/agent-browser/lib/prompt-policy.js +15 -194
  248. package/dist/extensions/agent-browser/lib/read-command.js +41 -0
  249. package/dist/extensions/agent-browser/lib/read-confirmation.js +131 -68
  250. package/dist/extensions/agent-browser/lib/recording-reservations.js +118 -45
  251. package/dist/extensions/agent-browser/lib/redaction-fields.js +75 -0
  252. package/dist/extensions/agent-browser/lib/redaction-json.js +149 -0
  253. package/dist/extensions/agent-browser/lib/redaction-url.js +88 -0
  254. package/dist/extensions/agent-browser/lib/results/action-contracts.js +1 -0
  255. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +28 -271
  256. package/dist/extensions/agent-browser/lib/results/artifact-contracts.js +1 -0
  257. package/dist/extensions/agent-browser/lib/results/artifact-manifest-validation.js +133 -0
  258. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +96 -94
  259. package/dist/extensions/agent-browser/lib/results/artifact-recommendations.js +73 -0
  260. package/dist/extensions/agent-browser/lib/results/categories.js +111 -54
  261. package/dist/extensions/agent-browser/lib/results/confirmation.js +29 -13
  262. package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +62 -27
  263. package/dist/extensions/agent-browser/lib/results/electron-recommendations.js +83 -0
  264. package/dist/extensions/agent-browser/lib/results/envelope-decoding.js +48 -0
  265. package/dist/extensions/agent-browser/lib/results/envelope.js +90 -67
  266. package/dist/extensions/agent-browser/lib/results/evidence-contracts.js +1 -0
  267. package/dist/extensions/agent-browser/lib/results/failure-recommendations.js +180 -0
  268. package/dist/extensions/agent-browser/lib/results/network-routes.js +86 -45
  269. package/dist/extensions/agent-browser/lib/results/network.js +35 -12
  270. package/dist/extensions/agent-browser/lib/results/next-actions.js +49 -19
  271. package/dist/extensions/agent-browser/lib/results/presentation/artifact-files.js +320 -0
  272. package/dist/extensions/agent-browser/lib/results/presentation/artifact-format.js +138 -0
  273. package/dist/extensions/agent-browser/lib/results/presentation/artifact-images.js +113 -0
  274. package/dist/extensions/agent-browser/lib/results/presentation/artifact-verification.js +145 -0
  275. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +99 -555
  276. package/dist/extensions/agent-browser/lib/results/presentation/batch-contracts.js +1 -0
  277. package/dist/extensions/agent-browser/lib/results/presentation/batch-recording.js +118 -0
  278. package/dist/extensions/agent-browser/lib/results/presentation/batch-redaction.js +68 -0
  279. package/dist/extensions/agent-browser/lib/results/presentation/batch-rendering.js +135 -0
  280. package/dist/extensions/agent-browser/lib/results/presentation/batch-step.js +227 -0
  281. package/dist/extensions/agent-browser/lib/results/presentation/batch-summary.js +91 -0
  282. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +91 -460
  283. package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +9 -5
  284. package/dist/extensions/agent-browser/lib/results/presentation/command-presenters.js +216 -0
  285. package/dist/extensions/agent-browser/lib/results/presentation/common.js +26 -9
  286. package/dist/extensions/agent-browser/lib/results/presentation/content.js +86 -29
  287. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-a11y.js +67 -0
  288. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-health.js +79 -0
  289. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-identity.js +199 -0
  290. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-logs.js +75 -0
  291. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network-actions.js +216 -0
  292. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network.js +124 -0
  293. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-redaction.js +64 -0
  294. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-storage.js +209 -0
  295. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-stream.js +69 -0
  296. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-summary.js +222 -0
  297. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +103 -1052
  298. package/dist/extensions/agent-browser/lib/results/presentation/early-result.js +70 -0
  299. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +130 -60
  300. package/dist/extensions/agent-browser/lib/results/presentation/input-contracts.js +1 -0
  301. package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +60 -145
  302. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +147 -88
  303. package/dist/extensions/agent-browser/lib/results/presentation/notices.js +75 -0
  304. package/dist/extensions/agent-browser/lib/results/presentation/observation-contracts.js +1 -0
  305. package/dist/extensions/agent-browser/lib/results/presentation/observation-rendering.js +127 -0
  306. package/dist/extensions/agent-browser/lib/results/presentation/outcomes.js +120 -0
  307. package/dist/extensions/agent-browser/lib/results/presentation/output-completion.js +77 -0
  308. package/dist/extensions/agent-browser/lib/results/presentation/output-spill.js +51 -0
  309. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +116 -240
  310. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +35 -21
  311. package/dist/extensions/agent-browser/lib/results/presentation/skills.js +104 -73
  312. package/dist/extensions/agent-browser/lib/results/presentation/source.js +109 -0
  313. package/dist/extensions/agent-browser/lib/results/presentation.js +17 -261
  314. package/dist/extensions/agent-browser/lib/results/recommendation-contracts.js +1 -0
  315. package/dist/extensions/agent-browser/lib/results/recording.js +52 -14
  316. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +14 -5
  317. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +30 -22
  318. package/dist/extensions/agent-browser/lib/results/selector-recovery-target.js +83 -0
  319. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +119 -119
  320. package/dist/extensions/agent-browser/lib/results/snapshot-compact.js +266 -0
  321. package/dist/extensions/agent-browser/lib/results/snapshot-content.js +32 -0
  322. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +104 -71
  323. package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +31 -11
  324. package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +125 -66
  325. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +26 -7
  326. package/dist/extensions/agent-browser/lib/results/snapshot.js +28 -248
  327. package/dist/extensions/agent-browser/lib/results/text.js +16 -5
  328. package/dist/extensions/agent-browser/lib/runtime-args-validation.js +133 -0
  329. package/dist/extensions/agent-browser/lib/runtime-compatibility.js +81 -0
  330. package/dist/extensions/agent-browser/lib/runtime-contracts.js +1 -0
  331. package/dist/extensions/agent-browser/lib/runtime-redaction.js +118 -0
  332. package/dist/extensions/agent-browser/lib/runtime-replay-events.js +144 -0
  333. package/dist/extensions/agent-browser/lib/runtime-session-identity.js +76 -0
  334. package/dist/extensions/agent-browser/lib/runtime-session-plan.js +114 -0
  335. package/dist/extensions/agent-browser/lib/runtime-session-replay.js +123 -0
  336. package/dist/extensions/agent-browser/lib/runtime-tab-correction.js +65 -0
  337. package/dist/extensions/agent-browser/lib/runtime-timeouts.js +28 -0
  338. package/dist/extensions/agent-browser/lib/runtime.js +137 -1041
  339. package/dist/extensions/agent-browser/lib/session-identity.js +51 -0
  340. package/dist/extensions/agent-browser/lib/session-page-observation.js +357 -0
  341. package/dist/extensions/agent-browser/lib/session-page-state.js +178 -333
  342. package/dist/extensions/agent-browser/lib/session-page-types.js +1 -0
  343. package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +78 -0
  344. package/dist/extensions/agent-browser/lib/temp-mutation-queue.js +7 -0
  345. package/dist/extensions/agent-browser/lib/temp-root-ownership.js +234 -0
  346. package/dist/extensions/agent-browser/lib/temp-root.js +207 -0
  347. package/dist/extensions/agent-browser/lib/temp.js +33 -446
  348. package/dist/extensions/agent-browser/lib/tool-surface.js +94 -24
  349. package/dist/extensions/agent-browser/lib/upstream-version.js +3 -2
  350. package/dist/extensions/agent-browser/lib/web-search-providers.js +229 -0
  351. package/dist/extensions/agent-browser/lib/web-search-request.js +108 -0
  352. package/dist/extensions/agent-browser/lib/web-search-results.js +281 -0
  353. package/dist/extensions/agent-browser/lib/web-search-schema.js +82 -0
  354. package/dist/extensions/agent-browser/lib/web-search.js +109 -617
  355. package/dist/extensions/agent-browser/lib/webmcp-observation.js +13 -6
  356. package/dist/extensions/agent-browser/lib/windows-stock-launcher.js +63 -37
  357. package/dist/extensions/agent-browser/script-worker.js +80 -43
  358. package/dist/scripts/agent-browser-target.mjs +4 -2
  359. package/docs/ARCHITECTURE.md +17 -5
  360. package/docs/CODE_QUALITY.md +242 -0
  361. package/docs/COMMAND_REFERENCE.md +251 -220
  362. package/docs/ELECTRON.md +53 -44
  363. package/docs/RELEASE.md +18 -15
  364. package/docs/REQUIREMENTS.md +1 -0
  365. package/docs/SUPPORT_MATRIX.md +76 -75
  366. package/docs/TOOL_CONTRACT.md +145 -116
  367. package/docs/platform-smoke.md +5 -5
  368. package/package.json +143 -120
  369. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  370. package/scripts/agent-browser-target.mjs +6 -2
  371. package/scripts/build.mjs +37 -8
  372. package/scripts/capability-core-commands.mjs +193 -0
  373. package/scripts/capability-options.mjs +283 -0
  374. package/scripts/capability-samples.mjs +133 -0
  375. package/scripts/capability-section.mjs +11 -0
  376. package/scripts/config.mjs +213 -114
  377. package/scripts/convert-browser-session.mjs +30 -9
  378. package/scripts/doctor-sources.mjs +195 -0
  379. package/scripts/doctor.mjs +92 -247
  380. package/scripts/platform-smoke/artifacts.mjs +38 -11
  381. package/scripts/platform-smoke/commands.mjs +104 -0
  382. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  383. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  384. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  385. package/scripts/platform-smoke/doctor.mjs +212 -320
  386. package/scripts/platform-smoke/lease-evidence.mjs +134 -0
  387. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  388. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  389. package/scripts/platform-smoke/targets.mjs +158 -472
  390. package/scripts/platform-smoke.mjs +55 -40
  391. package/scripts/prepare.mjs +16 -7
@@ -18,7 +18,10 @@ export function writeExitCode(dir, code, signal) {
18
18
  }
19
19
 
20
20
  export function writeSummary(dir, data) {
21
- writeFileSync(resolve(dir, "summary.json"), JSON.stringify({ ...data, writtenAt: new Date().toISOString() }, null, 2));
21
+ writeFileSync(
22
+ resolve(dir, "summary.json"),
23
+ JSON.stringify({ ...data, writtenAt: new Date().toISOString() }, null, 2),
24
+ );
22
25
  }
23
26
 
24
27
  export function writeManifest(dir, expectedFiles) {
@@ -26,11 +29,16 @@ export function writeManifest(dir, expectedFiles) {
26
29
  function walk(current) {
27
30
  for (const entry of readdirSync(current, { withFileTypes: true })) {
28
31
  const path = resolve(current, entry.name);
29
- if (entry.isDirectory()) walk(path);
30
- else if (entry.isFile()) present.push(relative(dir, path));
32
+ if (entry.isDirectory()) {
33
+ walk(path);
34
+ } else if (entry.isFile()) {
35
+ present.push(relative(dir, path));
36
+ }
31
37
  }
32
38
  }
33
- if (existsSync(dir)) walk(dir);
39
+ if (existsSync(dir)) {
40
+ walk(dir);
41
+ }
34
42
  const allPresent = [...new Set([...present, "artifact-manifest.json"])].sort();
35
43
  const manifest = {
36
44
  expected: expectedFiles,
@@ -43,7 +51,13 @@ export function writeManifest(dir, expectedFiles) {
43
51
  }
44
52
 
45
53
  export function collectSecretValues(envNames, env = process.env) {
46
- return [...new Set(envNames.map((name) => env[name]).filter((value) => typeof value === "string" && value.length >= 8))];
54
+ return [
55
+ ...new Set(
56
+ envNames
57
+ .map((name) => env[name])
58
+ .filter((value) => typeof value === "string" && value.length >= 8),
59
+ ),
60
+ ];
47
61
  }
48
62
 
49
63
  export function redactSecrets(text, secretValues = []) {
@@ -58,14 +72,21 @@ export function scanForSecrets(text, secretValues = []) {
58
72
  const content = String(text ?? "");
59
73
  const violations = [];
60
74
  for (const secret of secretValues) {
61
- if (secret && content.includes(secret)) violations.push("raw forwarded secret value");
75
+ if (secret && content.includes(secret)) {
76
+ violations.push("raw forwarded secret value");
77
+ }
62
78
  }
63
79
  for (const [pattern, label] of [
64
80
  [/bearer\s+[A-Za-z0-9\-._~+/]{20,}=*/gi, "bearer token"],
65
81
  [/Authorization:\s*Bearer\s+[A-Za-z0-9\-._~+/]{20,}=*/gi, "authorization header"],
66
- [/(?:api[_-]?key|access[_-]?token|refresh[_-]?token|cookie)\s*[:=]\s*["']?[A-Za-z0-9_./+\-=]{20,}/gi, "token-like field"],
82
+ [
83
+ /(?:api[_-]?key|access[_-]?token|refresh[_-]?token|cookie)\s*[:=]\s*["']?[A-Za-z0-9_./+\-=]{20,}/gi,
84
+ "token-like field",
85
+ ],
67
86
  ]) {
68
- if (pattern.test(content)) violations.push(label);
87
+ if (pattern.test(content)) {
88
+ violations.push(label);
89
+ }
69
90
  }
70
91
  return [...new Set(violations)];
71
92
  }
@@ -79,11 +100,17 @@ export function scanArtifactTextFiles(dir, secretValues = []) {
79
100
  walk(path);
80
101
  continue;
81
102
  }
82
- if (!entry.isFile()) continue;
83
- if (!/\.(?:txt|json|jsonl|md|log|ps1|mjs|js)$/i.test(entry.name)) continue;
103
+ if (!entry.isFile()) {
104
+ continue;
105
+ }
106
+ if (!/\.(?:txt|json|jsonl|md|log|ps1|mjs|js)$/i.test(entry.name)) {
107
+ continue;
108
+ }
84
109
  try {
85
110
  const text = readFileSync(path, "utf8");
86
- for (const violation of scanForSecrets(text, secretValues)) findings.push({ file: relative(dir, path), violation });
111
+ for (const violation of scanForSecrets(text, secretValues)) {
112
+ findings.push({ file: relative(dir, path), violation });
113
+ }
87
114
  } catch {
88
115
  // Ignore unreadable or non-text files.
89
116
  }
@@ -0,0 +1,104 @@
1
+ /** Native POSIX/PowerShell platform command rendering; every required gate contributes to the final exit. */
2
+ import { CAPABILITY_BASELINE } from "../agent-browser-capability-baseline.mjs";
3
+ import { platformFor } from "./suite-evidence.mjs";
4
+
5
+ function shellQuote(value) {
6
+ return `'${String(value).replace(/'/g, `'\\''`)}'`;
7
+ }
8
+
9
+ function psSingleQuote(value) {
10
+ return `'${String(value).replace(/'/g, "''")}'`;
11
+ }
12
+
13
+ export function buildPlatformBuildCommand(targetName, packageName, nodeValidationVersion) {
14
+ if (platformFor(targetName) === "powershell") {
15
+ return `powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File .\\scripts\\platform-smoke\\platform-build-windows.ps1 -PackageName ${psSingleQuote(packageName)} -NodeValidationVersion ${psSingleQuote(nodeValidationVersion)}`;
16
+ }
17
+ return [
18
+ `echo "Starting platform-build in $(pwd) at $(date -u +%Y-%m-%dT%H:%M:%SZ)"`,
19
+ `RUN_ROOT=".platform-smoke-runs/platform-build-$(date -u +%Y%m%dT%H%M%SZ)-$$"`,
20
+ `SOURCE_ROOT="$(pwd)"`,
21
+ `PACK_DIR="$SOURCE_ROOT/$RUN_ROOT/pack"`,
22
+ `PI_PROJECT="$SOURCE_ROOT/$RUN_ROOT/pi-project"`,
23
+ `mkdir -p "$PACK_DIR" "$PI_PROJECT"`,
24
+ `echo "PLATFORM_RUN_ROOT=$RUN_ROOT"`,
25
+ `NODE_VERSION=$(node --version)`,
26
+ `echo "PLATFORM_NODE_VERSION=$NODE_VERSION"`,
27
+ `if node -e 'process.exit(process.versions.node.localeCompare(process.argv[1], undefined, { numeric: true }) < 0 ? 1 : 0)' ${shellQuote(nodeValidationVersion)}; then NODE_VERSION_EXIT=0; else NODE_VERSION_EXIT=1; fi`,
28
+ `echo "PLATFORM_NODE_VERSION_EXIT=$NODE_VERSION_EXIT"`,
29
+ `npm ci 2>&1`,
30
+ `NPM_CI_EXIT=$?`,
31
+ `echo "PLATFORM_NPM_CI_EXIT=$NPM_CI_EXIT"`,
32
+ `npm run verify -- platform-target 2>&1`,
33
+ `VERIFY_EXIT=$?`,
34
+ `echo "PLATFORM_VERIFY_EXIT=$VERIFY_EXIT"`,
35
+ `PACK_TARBALL=$(npm pack --silent --pack-destination "$PACK_DIR" 2>"$PACK_DIR/npm-pack.stderr.txt")`,
36
+ `PACK_EXIT=$?`,
37
+ `cat "$PACK_DIR/npm-pack.stderr.txt"`,
38
+ `PACK_FILE="$PACK_DIR/$PACK_TARBALL"`,
39
+ `echo "PLATFORM_NPM_PACK_EXIT=$PACK_EXIT"`,
40
+ `echo "PLATFORM_PACKED_TARBALL=$PACK_FILE"`,
41
+ `PI_CLI="$SOURCE_ROOT/node_modules/.bin/pi"`,
42
+ `if [ ! -x "$PI_CLI" ]; then PI_CLI="$(command -v pi || true)"; fi`,
43
+ `echo "PLATFORM_PI_CLI=$PI_CLI"`,
44
+ `if [ -n "$PACK_TARBALL" ] && [ -f "$PACK_FILE" ]; then (cd "$PI_PROJECT" && npm init -y >"$PACK_DIR/packed-node-install.stdout.txt" 2>"$PACK_DIR/packed-node-install.stderr.txt" && npm install --no-save "$PACK_FILE" >>"$PACK_DIR/packed-node-install.stdout.txt" 2>>"$PACK_DIR/packed-node-install.stderr.txt"); PACKED_NODE_INSTALL_EXIT=$?; else echo "missing tarball" >"$PACK_DIR/packed-node-install.stderr.txt"; PACKED_NODE_INSTALL_EXIT=1; fi`,
45
+ `echo "PLATFORM_PACKED_NODE_INSTALL_EXIT=$PACKED_NODE_INSTALL_EXIT"`,
46
+ `echo "--- PACKED_NODE_INSTALL_STDOUT START ---"; cat "$PACK_DIR/packed-node-install.stdout.txt" 2>/dev/null || true; echo "--- PACKED_NODE_INSTALL_STDOUT END ---"`,
47
+ `echo "--- PACKED_NODE_INSTALL_STDERR START ---"; cat "$PACK_DIR/packed-node-install.stderr.txt" 2>/dev/null || true; echo "--- PACKED_NODE_INSTALL_STDERR END ---"`,
48
+ `if [ "$PACKED_NODE_INSTALL_EXIT" -eq 0 ] && [ -n "$PI_CLI" ]; then (cd "$PI_PROJECT" && PI_OFFLINE=1 "$PI_CLI" install -l --approve ./node_modules/${packageName} >"$PACK_DIR/pi-install.stdout.txt" 2>"$PACK_DIR/pi-install.stderr.txt"); PI_INSTALL_EXIT=$?; else echo "missing pi cli or packed install" >"$PACK_DIR/pi-install.stderr.txt"; PI_INSTALL_EXIT=1; fi`,
49
+ `echo "PLATFORM_PI_INSTALL_EXIT=$PI_INSTALL_EXIT"`,
50
+ `echo "--- PI_INSTALL_STDOUT START ---"; cat "$PACK_DIR/pi-install.stdout.txt" 2>/dev/null || true; echo "--- PI_INSTALL_STDOUT END ---"`,
51
+ `echo "--- PI_INSTALL_STDERR START ---"; cat "$PACK_DIR/pi-install.stderr.txt" 2>/dev/null || true; echo "--- PI_INSTALL_STDERR END ---"`,
52
+ `if [ -n "$PI_CLI" ]; then (cd "$PI_PROJECT" && PI_OFFLINE=1 "$PI_CLI" list --approve >"$PACK_DIR/pi-list.stdout.txt" 2>"$PACK_DIR/pi-list.stderr.txt"); PI_LIST_EXIT=$?; else echo "missing pi cli" >"$PACK_DIR/pi-list.stderr.txt"; PI_LIST_EXIT=1; fi`,
53
+ `echo "PLATFORM_PI_LIST_EXIT=$PI_LIST_EXIT"`,
54
+ `echo "--- PI_LIST_STDOUT START ---"; cat "$PACK_DIR/pi-list.stdout.txt" 2>/dev/null || true; echo "--- PI_LIST_STDOUT END ---"`,
55
+ `echo "--- PI_LIST_STDERR START ---"; cat "$PACK_DIR/pi-list.stderr.txt" 2>/dev/null || true; echo "--- PI_LIST_STDERR END ---"`,
56
+ `if [ "$NODE_VERSION_EXIT" -ne 0 ] || [ "$NPM_CI_EXIT" -ne 0 ] || [ "$VERIFY_EXIT" -ne 0 ] || [ "$PACK_EXIT" -ne 0 ] || [ "$PACKED_NODE_INSTALL_EXIT" -ne 0 ] || [ "$PI_INSTALL_EXIT" -ne 0 ] || [ "$PI_LIST_EXIT" -ne 0 ]; then echo "PLATFORM_BUILD_FAILED"; exit 1; fi`,
57
+ `echo "PLATFORM_BUILD_OK"`,
58
+ ].join("\n");
59
+ }
60
+
61
+ export function buildBrowserDogfoodCommand(
62
+ targetName,
63
+ agentBrowserVersion = CAPABILITY_BASELINE.targetVersion,
64
+ dependenciesReady = false,
65
+ ) {
66
+ if (platformFor(targetName) === "powershell") {
67
+ return `powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File .\\scripts\\platform-smoke\\browser-dogfood-windows.ps1 -AgentBrowserVersion ${psSingleQuote(agentBrowserVersion)}${dependenciesReady ? " -SkipNpmCi" : ""}`;
68
+ }
69
+ return [
70
+ `echo "Starting browser-dogfood-smoke in $(pwd) at $(date -u +%Y-%m-%dT%H:%M:%SZ)"`,
71
+ `RUN_ROOT=".platform-smoke-runs/browser-dogfood-$(date -u +%Y%m%dT%H%M%SZ)-$$"`,
72
+ `SOURCE_ROOT="$(pwd)"`,
73
+ `DOGFOOD_DIR="$SOURCE_ROOT/$RUN_ROOT/dogfood"`,
74
+ `DOGFOOD_ARTIFACT_DIR="$DOGFOOD_DIR/artifacts"`,
75
+ `mkdir -p "$DOGFOOD_ARTIFACT_DIR"`,
76
+ `echo "PLATFORM_RUN_ROOT=$RUN_ROOT"`,
77
+ `echo "PLATFORM_DOGFOOD_ARTIFACT_DIR=$DOGFOOD_ARTIFACT_DIR"`,
78
+ `NODE_VERSION=$(node --version)`,
79
+ `NODE_MAJOR="${"${NODE_VERSION#v}"}"`,
80
+ `NODE_MAJOR="${"${NODE_MAJOR%%.*}"}"`,
81
+ `echo "PLATFORM_NODE_VERSION=$NODE_VERSION"`,
82
+ `EXPECTED_AGENT_BROWSER_VERSION=${shellQuote(`agent-browser ${agentBrowserVersion}`)}`,
83
+ `AGENT_BROWSER_VERSION_OUTPUT=$(agent-browser --version 2>&1)`,
84
+ `AGENT_BROWSER_VERSION_COMMAND_EXIT=$?`,
85
+ `echo "PLATFORM_AGENT_BROWSER_VERSION=$AGENT_BROWSER_VERSION_OUTPUT"`,
86
+ `if [ "$AGENT_BROWSER_VERSION_COMMAND_EXIT" -eq 0 ] && [ "$AGENT_BROWSER_VERSION_OUTPUT" = "$EXPECTED_AGENT_BROWSER_VERSION" ]; then AGENT_BROWSER_READY_EXIT=0; else AGENT_BROWSER_READY_EXIT=1; fi`,
87
+ `echo "PLATFORM_AGENT_BROWSER_READY_EXIT=$AGENT_BROWSER_READY_EXIT"`,
88
+ ...(dependenciesReady
89
+ ? [
90
+ `if [ -d node_modules ]; then echo "PLATFORM_NPM_CI_SKIPPED=1"; NPM_CI_EXIT=0; else npm ci 2>&1; NPM_CI_EXIT=$?; fi`,
91
+ ]
92
+ : [`npm ci 2>&1`, `NPM_CI_EXIT=$?`]),
93
+ `echo "PLATFORM_NPM_CI_EXIT=$NPM_CI_EXIT"`,
94
+ `TSX_CLI="$SOURCE_ROOT/node_modules/.bin/tsx"`,
95
+ `if [ ! -x "$TSX_CLI" ]; then TSX_CLI="$(command -v tsx || true)"; fi`,
96
+ `echo "PLATFORM_TSX_CLI=$TSX_CLI"`,
97
+ `if [ "$NPM_CI_EXIT" -eq 0 ] && [ "$AGENT_BROWSER_READY_EXIT" -eq 0 ] && [ -n "$TSX_CLI" ]; then "$TSX_CLI" scripts/verify-agent-browser-dogfood.ts --artifact-dir "$DOGFOOD_ARTIFACT_DIR" --json >"$DOGFOOD_DIR/dogfood.stdout.txt" 2>"$DOGFOOD_DIR/dogfood.stderr.txt"; DOGFOOD_EXIT=$?; else echo "missing tsx, npm ci failed, or agent-browser baseline mismatch" >"$DOGFOOD_DIR/dogfood.stderr.txt"; DOGFOOD_EXIT=1; fi`,
98
+ `echo "PLATFORM_DOGFOOD_EXIT=$DOGFOOD_EXIT"`,
99
+ `echo "--- DOGFOOD_STDOUT START ---"; cat "$DOGFOOD_DIR/dogfood.stdout.txt" 2>/dev/null || true; echo "--- DOGFOOD_STDOUT END ---"`,
100
+ `echo "--- DOGFOOD_STDERR START ---"; cat "$DOGFOOD_DIR/dogfood.stderr.txt" 2>/dev/null || true; echo "--- DOGFOOD_STDERR END ---"`,
101
+ `if [ "$NPM_CI_EXIT" -ne 0 ] || [ "$AGENT_BROWSER_READY_EXIT" -ne 0 ] || [ "$DOGFOOD_EXIT" -ne 0 ]; then echo "PLATFORM_BROWSER_DOGFOOD_FAILED"; exit 1; fi`,
102
+ `echo "PLATFORM_BROWSER_DOGFOOD_OK"`,
103
+ ].join("\n");
104
+ }
@@ -18,68 +18,110 @@ function packageSlug(config = {}) {
18
18
  return process.env.PLATFORM_SMOKE_PACKAGE_SLUG || config.packageName || "pi-agent-browser-native";
19
19
  }
20
20
 
21
- export function describeTarget(targetName, config = {}) {
21
+ function targetSetting(name, configured, fallback) {
22
+ return env(name) || configured || fallback;
23
+ }
24
+
25
+ function describeMacTarget(config) {
22
26
  const slug = packageSlug(config);
27
+ const user = env("PLATFORM_SMOKE_MAC_USER") || env("USER");
28
+ const host = targetSetting("PLATFORM_SMOKE_MAC_HOST", config.macos?.host, "localhost");
29
+ const port = String(targetSetting("PLATFORM_SMOKE_MAC_PORT", config.macos?.port, 22));
30
+ const workRoot =
31
+ env("PLATFORM_SMOKE_MAC_WORK_ROOT") ||
32
+ config.macos?.workRoot ||
33
+ `/Users/${user}/crabbox/${slug}`;
34
+ return {
35
+ provider: "ssh",
36
+ crabboxTarget: "macos",
37
+ shell: "posix",
38
+ workRoot,
39
+ args: [
40
+ "--provider",
41
+ "ssh",
42
+ "--target",
43
+ "macos",
44
+ "--static-host",
45
+ host,
46
+ "--static-user",
47
+ user,
48
+ "--static-port",
49
+ port,
50
+ "--static-work-root",
51
+ workRoot,
52
+ ],
53
+ };
54
+ }
55
+
56
+ function describeUbuntuTarget(config) {
57
+ const image =
58
+ env("PLATFORM_SMOKE_UBUNTU_IMAGE") || config.ubuntuContainerImage || DEFAULT_UBUNTU_IMAGE;
59
+ return {
60
+ provider: "local-container",
61
+ crabboxTarget: "linux",
62
+ shell: "posix",
63
+ image,
64
+ workRoot: config.localContainer?.workRoot || "/work/crabbox",
65
+ args: ["--provider", "local-container", "--target", "linux", "--local-container-image", image],
66
+ };
67
+ }
68
+
69
+ function describeWindowsTarget(config) {
70
+ const slug = packageSlug(config);
71
+ const vm = targetSetting(
72
+ "PLATFORM_SMOKE_WINDOWS_VM",
73
+ config.windowsParallels?.sourceVm,
74
+ "pi-extension-windows-template",
75
+ );
76
+ const snapshot = targetSetting(
77
+ "PLATFORM_SMOKE_WINDOWS_SNAPSHOT",
78
+ config.windowsParallels?.snapshot,
79
+ "crabbox-ready",
80
+ );
81
+ const user = targetSetting(
82
+ "PLATFORM_SMOKE_WINDOWS_USER",
83
+ config.windowsParallels?.user,
84
+ env("USER"),
85
+ );
86
+ const workRoot =
87
+ env("PLATFORM_SMOKE_WINDOWS_WORK_ROOT") ||
88
+ config.windowsParallels?.workRoot ||
89
+ `C:\\crabbox\\${slug}`;
90
+ return {
91
+ provider: "parallels",
92
+ crabboxTarget: "windows",
93
+ shell: "powershell",
94
+ workRoot,
95
+ windowsMode: "normal",
96
+ sourceVm: vm,
97
+ snapshot,
98
+ args: [
99
+ "--provider",
100
+ "parallels",
101
+ "--target",
102
+ "windows",
103
+ "--windows-mode",
104
+ "normal",
105
+ "--parallels-source",
106
+ vm,
107
+ "--parallels-source-snapshot",
108
+ snapshot,
109
+ "--parallels-user",
110
+ user,
111
+ "--parallels-work-root",
112
+ workRoot,
113
+ ],
114
+ };
115
+ }
116
+
117
+ export function describeTarget(targetName, config = {}) {
23
118
  switch (targetName) {
24
- case "macos": {
25
- const user = env("PLATFORM_SMOKE_MAC_USER") || env("USER");
26
- const host = env("PLATFORM_SMOKE_MAC_HOST") || config.macos?.host || "localhost";
27
- const port = String(env("PLATFORM_SMOKE_MAC_PORT") || config.macos?.port || 22);
28
- const workRoot = env("PLATFORM_SMOKE_MAC_WORK_ROOT") || config.macos?.workRoot || `/Users/${user}/crabbox/${slug}`;
29
- return {
30
- provider: "ssh",
31
- crabboxTarget: "macos",
32
- shell: "posix",
33
- workRoot,
34
- args: [
35
- "--provider", "ssh",
36
- "--target", "macos",
37
- "--static-host", host,
38
- "--static-user", user,
39
- "--static-port", port,
40
- "--static-work-root", workRoot,
41
- ],
42
- };
43
- }
44
- case "ubuntu": {
45
- const image = env("PLATFORM_SMOKE_UBUNTU_IMAGE") || config.ubuntuContainerImage || DEFAULT_UBUNTU_IMAGE;
46
- return {
47
- provider: "local-container",
48
- crabboxTarget: "linux",
49
- shell: "posix",
50
- image,
51
- workRoot: config.localContainer?.workRoot || "/work/crabbox",
52
- args: [
53
- "--provider", "local-container",
54
- "--target", "linux",
55
- "--local-container-image", image,
56
- ],
57
- };
58
- }
59
- case "windows-native": {
60
- const vm = env("PLATFORM_SMOKE_WINDOWS_VM") || config.windowsParallels?.sourceVm || "pi-extension-windows-template";
61
- const snapshot = env("PLATFORM_SMOKE_WINDOWS_SNAPSHOT") || config.windowsParallels?.snapshot || "crabbox-ready";
62
- const user = env("PLATFORM_SMOKE_WINDOWS_USER") || config.windowsParallels?.user || env("USER");
63
- const workRoot = env("PLATFORM_SMOKE_WINDOWS_WORK_ROOT") || config.windowsParallels?.workRoot || `C:\\crabbox\\${slug}`;
64
- return {
65
- provider: "parallels",
66
- crabboxTarget: "windows",
67
- shell: "powershell",
68
- workRoot,
69
- windowsMode: "normal",
70
- sourceVm: vm,
71
- snapshot,
72
- args: [
73
- "--provider", "parallels",
74
- "--target", "windows",
75
- "--windows-mode", "normal",
76
- "--parallels-source", vm,
77
- "--parallels-source-snapshot", snapshot,
78
- "--parallels-user", user,
79
- "--parallels-work-root", workRoot,
80
- ],
81
- };
82
- }
119
+ case "macos":
120
+ return describeMacTarget(config);
121
+ case "ubuntu":
122
+ return describeUbuntuTarget(config);
123
+ case "windows-native":
124
+ return describeWindowsTarget(config);
83
125
  default:
84
126
  throw new Error(`unknown platform smoke target: ${targetName}`);
85
127
  }
@@ -90,14 +132,14 @@ export function buildTargetBaseArgs(targetName, config = {}) {
90
132
  }
91
133
 
92
134
  export function leaseIdFor(targetName, slug) {
93
- if (targetName === "macos") return "static_localhost";
135
+ if (targetName === "macos") {
136
+ return "static_localhost";
137
+ }
94
138
  return slug;
95
139
  }
96
140
 
97
141
  function parseLeaseId(text) {
98
- return text.match(/\bleased\s+(\S+)/)?.[1]
99
- ?? text.match(/\blease=(\S+)/)?.[1]
100
- ?? null;
142
+ return text.match(/\bleased\s+(\S+)/)?.[1] ?? text.match(/\blease=(\S+)/)?.[1] ?? null;
101
143
  }
102
144
 
103
145
  export function execCrabbox(args, options = {}) {
@@ -112,31 +154,63 @@ export function execCrabbox(args, options = {}) {
112
154
  let killTimeout;
113
155
  if (options.timeout) {
114
156
  timeout = setTimeout(() => {
115
- stderr.push(Buffer.from(`\n[platform-smoke] crabbox timed out after ${options.timeout}ms\n`));
116
- try { child.kill("SIGTERM"); } catch {}
157
+ stderr.push(
158
+ Buffer.from(`\n[platform-smoke] crabbox timed out after ${options.timeout}ms\n`),
159
+ );
160
+ try {
161
+ child.kill("SIGTERM");
162
+ } catch {
163
+ // A concurrently exited child needs no signal; its close/error receipt settles the run.
164
+ }
117
165
  killTimeout = setTimeout(() => {
118
- try { child.kill("SIGKILL"); } catch {}
166
+ try {
167
+ child.kill("SIGKILL");
168
+ } catch {
169
+ // A concurrently exited child needs no signal; its close/error receipt settles the run.
170
+ }
119
171
  }, 10_000);
120
172
  }, options.timeout);
121
173
  }
122
174
  child.stdout.on("data", (chunk) => stdout.push(chunk));
123
175
  child.stderr.on("data", (chunk) => stderr.push(chunk));
124
176
  child.on("error", (error) => {
125
- if (timeout) clearTimeout(timeout);
126
- if (killTimeout) clearTimeout(killTimeout);
127
- resolvePromise({ stdout: Buffer.concat(stdout).toString(), stderr: `${Buffer.concat(stderr).toString()}${error.message}\n`, code: 1, signal: null });
177
+ if (timeout) {
178
+ clearTimeout(timeout);
179
+ }
180
+ if (killTimeout) {
181
+ clearTimeout(killTimeout);
182
+ }
183
+ resolvePromise({
184
+ stdout: Buffer.concat(stdout).toString(),
185
+ stderr: `${Buffer.concat(stderr).toString()}${error.message}\n`,
186
+ code: 1,
187
+ signal: null,
188
+ });
128
189
  });
129
190
  child.on("close", (code, signal) => {
130
- if (timeout) clearTimeout(timeout);
131
- if (killTimeout) clearTimeout(killTimeout);
132
- resolvePromise({ stdout: Buffer.concat(stdout).toString(), stderr: Buffer.concat(stderr).toString(), code: code ?? (signal ? 1 : 0), signal });
191
+ if (timeout) {
192
+ clearTimeout(timeout);
193
+ }
194
+ if (killTimeout) {
195
+ clearTimeout(killTimeout);
196
+ }
197
+ resolvePromise({
198
+ stdout: Buffer.concat(stdout).toString(),
199
+ stderr: Buffer.concat(stderr).toString(),
200
+ code: code ?? (signal ? 1 : 0),
201
+ signal,
202
+ });
133
203
  });
134
204
  });
135
205
  }
136
206
 
137
207
  function isRetryableWarmupFailure(targetName, result) {
138
- if (targetName !== "windows-native" || result.code === 0) return false;
139
- return /Could not create a linked clone of the virtual hard disk|due to an internal error|context canceled|timed out after 300000ms/i.test(`${result.stdout}\n${result.stderr}`);
208
+ if (targetName !== "windows-native" || result.code === 0) {
209
+ return false;
210
+ }
211
+ return /Could not create a linked clone of the virtual hard disk|due to an internal error|context canceled|timed out after 300000ms/i.test(
212
+ `${result.stdout}\n${result.stderr}`,
213
+ );
140
214
  }
141
215
 
142
216
  export async function warmupLease(targetName, slug, config = {}) {
@@ -144,8 +218,14 @@ export async function warmupLease(targetName, slug, config = {}) {
144
218
  let result;
145
219
  for (let attempt = 1; attempt <= 2; attempt += 1) {
146
220
  console.log(` [crabbox] ${args.join(" ")}${attempt > 1 ? ` (retry ${attempt})` : ""}`);
221
+ // The retry depends on the prior warmup receipt and its completed stale-lease cleanup.
222
+ // oxlint-disable-next-line no-await-in-loop
147
223
  result = await execCrabbox(args, { timeout: 300_000 });
148
- if (!isRetryableWarmupFailure(targetName, result)) break;
224
+ if (!isRetryableWarmupFailure(targetName, result)) {
225
+ break;
226
+ }
227
+ // Stop stale target resources before a retry can acquire another lease.
228
+ // oxlint-disable-next-line no-await-in-loop
149
229
  await cleanupStaleTargetState(targetName, config);
150
230
  }
151
231
  return {
@@ -160,10 +240,15 @@ export async function runOnLease(targetName, leaseId, command, options = {}) {
160
240
  for (const name of options.allowEnv ?? []) {
161
241
  args.push("--allow-env", name);
162
242
  }
163
- if (options.sync === false) args.push("--no-sync");
164
- else args.push("--fresh-sync");
243
+ if (options.sync === false) {
244
+ args.push("--no-sync");
245
+ } else {
246
+ args.push("--fresh-sync");
247
+ }
165
248
  args.push("--shell", command);
166
- console.log(` [crabbox] run ${targetName} ${options.sync === false ? "--no-sync" : "--fresh-sync"}`);
249
+ console.log(
250
+ ` [crabbox] run ${targetName} ${options.sync === false ? "--no-sync" : "--fresh-sync"}`,
251
+ );
167
252
  return execCrabbox(args, { timeout: options.timeout ?? 900_000 });
168
253
  }
169
254
 
@@ -174,7 +259,9 @@ export async function stopLease(targetName, leaseId, config = {}) {
174
259
  }
175
260
 
176
261
  export async function cleanupStaleTargetState(targetName, config = {}) {
177
- if (targetName === "macos") return null;
262
+ if (targetName === "macos") {
263
+ return null;
264
+ }
178
265
  const args = ["cleanup", ...buildTargetBaseArgs(targetName, config)];
179
266
  console.log(` [crabbox] ${args.join(" ")}`);
180
267
  return execCrabbox(args, { timeout: 120_000 });
@@ -0,0 +1,157 @@
1
+ /** Read-only host/process inspection and platform-doctor report ownership. */
2
+ import { execFileSync, execSync } from "node:child_process";
3
+ import { mkdirSync, unlinkSync, writeFileSync } from "node:fs";
4
+ import { resolve } from "node:path";
5
+
6
+ export function env(name) {
7
+ return process.env[name] ?? "";
8
+ }
9
+ export function setting(name, configured, fallback) {
10
+ return env(name) || configured || fallback;
11
+ }
12
+
13
+ export function createReporter() {
14
+ let count = 0;
15
+ return {
16
+ ok(label) {
17
+ console.log(` ✓ ${label}`);
18
+ },
19
+ warn(label) {
20
+ console.log(` ⚠ ${label}`);
21
+ },
22
+ fail(label) {
23
+ console.error(` ✗ ${label}`);
24
+ count += 1;
25
+ },
26
+ get count() {
27
+ return count;
28
+ },
29
+ };
30
+ }
31
+
32
+ export function silent(cmd, args, options = {}) {
33
+ try {
34
+ return execFileSync(cmd, args, { timeout: 20_000, stdio: "pipe", ...options })
35
+ .toString()
36
+ .trim();
37
+ } catch {
38
+ return null;
39
+ }
40
+ }
41
+ export function shell(command, options = {}) {
42
+ try {
43
+ return execSync(command, { timeout: 20_000, stdio: "pipe", ...options })
44
+ .toString()
45
+ .trim();
46
+ } catch {
47
+ return null;
48
+ }
49
+ }
50
+ export function commandPath(name) {
51
+ return silent("which", [name]);
52
+ }
53
+
54
+ function parseVersion(version) {
55
+ const match = String(version).match(/\d+(?:\.\d+){0,2}/);
56
+ return match ? match[0].split(".").map((part) => Number(part)) : null;
57
+ }
58
+ export function versionAtLeast(actual, minimum) {
59
+ const a = parseVersion(actual);
60
+ const b = parseVersion(minimum);
61
+ if (!a || !b) {
62
+ return false;
63
+ }
64
+ for (let index = 0; index < Math.max(a.length, b.length); index += 1) {
65
+ const left = a[index] ?? 0;
66
+ const right = b[index] ?? 0;
67
+ if (left > right) {
68
+ return true;
69
+ }
70
+ if (left < right) {
71
+ return false;
72
+ }
73
+ }
74
+ return true;
75
+ }
76
+
77
+ function isForbiddenProjectPath(path) {
78
+ return (
79
+ /(^|\/)\.env(?:\..*)?$/.test(path) ||
80
+ /(^|\/)[^/]+\.tgz$/.test(path) ||
81
+ /(^|\/)\.artifacts(?:\/|$)/.test(path) ||
82
+ /(^|\/)\.crabbox(?:\/|$)/.test(path) ||
83
+ /(^|\/)\.debug(?:\/|$)/.test(path) ||
84
+ /(^|\/)\.platform-smoke-runs(?:\/|$)/.test(path)
85
+ );
86
+ }
87
+ function npmPackFiles() {
88
+ const output = silent("npm", ["pack", "--dry-run", "--json"]);
89
+ if (!output) {
90
+ return null;
91
+ }
92
+ try {
93
+ return JSON.parse(output)[0]?.files?.map((file) => file.path) ?? [];
94
+ } catch {
95
+ return null;
96
+ }
97
+ }
98
+
99
+ export function checkForbiddenProjectFiles(report) {
100
+ const tracked = shell("git ls-files")?.split(/\r?\n/).filter(Boolean) ?? [];
101
+ const trackedForbidden = tracked.filter(isForbiddenProjectPath);
102
+ if (trackedForbidden.length === 0) {
103
+ report.ok("tracked source files exclude forbidden local artifacts");
104
+ } else {
105
+ report.fail(`forbidden tracked source path(s): ${trackedForbidden.join(", ")}`);
106
+ }
107
+ const localForbidden =
108
+ shell(
109
+ "find . -maxdepth 2 \\( -name '.env' -o -name '.env.*' -o -name '*.tgz' \\) -not -path './node_modules/*' 2>/dev/null",
110
+ )
111
+ ?.split(/\r?\n/)
112
+ .filter(Boolean) ?? [];
113
+ if (localForbidden.length === 0) {
114
+ report.ok("no local .env or package tarball artifacts at repo top level");
115
+ } else {
116
+ report.fail(`forbidden local artifact(s): ${localForbidden.join(", ")}`);
117
+ }
118
+ const packFiles = npmPackFiles();
119
+ if (!packFiles) {
120
+ report.fail("could not inspect npm pack contents");
121
+ return;
122
+ }
123
+ const packedForbidden = packFiles.filter(isForbiddenProjectPath);
124
+ if (packedForbidden.length === 0) {
125
+ report.ok("npm package excludes forbidden local artifacts");
126
+ } else {
127
+ report.fail(`forbidden npm package path(s): ${packedForbidden.join(", ")}`);
128
+ }
129
+ }
130
+
131
+ export function checkArtifactRoot(artifactRoot, report) {
132
+ console.log("\n── Artifact root ──");
133
+ const artRoot = resolve(process.cwd(), artifactRoot);
134
+ try {
135
+ mkdirSync(artRoot, { recursive: true });
136
+ const probe = resolve(artRoot, ".doctor-write-test");
137
+ writeFileSync(probe, "ok");
138
+ unlinkSync(probe);
139
+ report.ok(`writable: ${artRoot}`);
140
+ } catch (error) {
141
+ report.fail(`artifact root not writable: ${error.message}`);
142
+ }
143
+ }
144
+
145
+ export function checkAgentBrowserVersion(expectedVersion, report, command = "agent-browser") {
146
+ const version = shell(`${command} --version`);
147
+ if (!version) {
148
+ report.fail(`${command} not found or did not report a version`);
149
+ return;
150
+ }
151
+ const firstLine = version.split(/\r?\n/)[0];
152
+ if (!expectedVersion || firstLine.includes(expectedVersion)) {
153
+ report.ok(`${command}: ${firstLine}`);
154
+ } else {
155
+ report.fail(`${command} version ${firstLine} does not match expected ${expectedVersion}`);
156
+ }
157
+ }