pi-agent-browser-native 0.9.3 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. package/CHANGELOG.md +106 -5
  2. package/README.md +58 -791
  3. package/dist/extensions/agent-browser/index.js +43101 -2031
  4. package/dist/extensions/agent-browser/lib/argv-descriptor.js +49 -26
  5. package/dist/extensions/agent-browser/lib/argv-grammar.js +82 -93
  6. package/dist/extensions/agent-browser/lib/bash-guard.js +129 -126
  7. package/dist/extensions/agent-browser/lib/batch-lifecycle.js +112 -51
  8. package/dist/extensions/agent-browser/lib/browser-execution-claim-codec.js +61 -0
  9. package/dist/extensions/agent-browser/lib/browser-execution-claim-storage.js +232 -0
  10. package/dist/extensions/agent-browser/lib/browser-execution-claims.js +202 -0
  11. package/dist/extensions/agent-browser/lib/browser-execution-identity.js +77 -0
  12. package/dist/extensions/agent-browser/lib/browser-journal-branch.js +98 -0
  13. package/dist/extensions/agent-browser/lib/browser-journal-contracts.js +1 -0
  14. package/dist/extensions/agent-browser/lib/browser-journal-projection.js +221 -0
  15. package/dist/extensions/agent-browser/lib/browser-journal-reader.js +89 -0
  16. package/dist/extensions/agent-browser/lib/browser-journal-replay.js +246 -0
  17. package/dist/extensions/agent-browser/lib/browser-journal.js +103 -394
  18. package/dist/extensions/agent-browser/lib/browser-legacy-pages.js +220 -0
  19. package/dist/extensions/agent-browser/lib/browser-legacy-projection.js +282 -0
  20. package/dist/extensions/agent-browser/lib/browser-legacy-types.js +1 -0
  21. package/dist/extensions/agent-browser/lib/browser-session-conversion-stream.js +217 -0
  22. package/dist/extensions/agent-browser/lib/browser-session-conversion.js +80 -335
  23. package/dist/extensions/agent-browser/lib/browser-transcript-contracts.js +35 -0
  24. package/dist/extensions/agent-browser/lib/browser-transcript-validation.js +166 -0
  25. package/dist/extensions/agent-browser/lib/browser-transcript.js +137 -82
  26. package/dist/extensions/agent-browser/lib/browser-value-parsing.js +15 -0
  27. package/dist/extensions/agent-browser/lib/command-capabilities.js +340 -0
  28. package/dist/extensions/agent-browser/lib/command-policy.js +107 -88
  29. package/dist/extensions/agent-browser/lib/command-taxonomy.js +49 -322
  30. package/dist/extensions/agent-browser/lib/config-policy.js +138 -343
  31. package/dist/extensions/agent-browser/lib/config-providers.js +71 -0
  32. package/dist/extensions/agent-browser/lib/config-validation.js +231 -0
  33. package/dist/extensions/agent-browser/lib/config.js +20 -8
  34. package/dist/extensions/agent-browser/lib/electron/cdp.js +20 -8
  35. package/dist/extensions/agent-browser/lib/electron/cleanup.js +128 -83
  36. package/dist/extensions/agent-browser/lib/electron/discovery-darwin.js +109 -0
  37. package/dist/extensions/agent-browser/lib/electron/discovery-desktop.js +136 -0
  38. package/dist/extensions/agent-browser/lib/electron/discovery-evidence.js +90 -0
  39. package/dist/extensions/agent-browser/lib/electron/discovery-linux.js +93 -0
  40. package/dist/extensions/agent-browser/lib/electron/discovery-packages.js +162 -0
  41. package/dist/extensions/agent-browser/lib/electron/discovery-types.js +2 -0
  42. package/dist/extensions/agent-browser/lib/electron/discovery.js +140 -549
  43. package/dist/extensions/agent-browser/lib/electron/launch-monitor.js +102 -0
  44. package/dist/extensions/agent-browser/lib/electron/launch-process.js +209 -0
  45. package/dist/extensions/agent-browser/lib/electron/launch-types.js +2 -0
  46. package/dist/extensions/agent-browser/lib/electron/launch.js +261 -355
  47. package/dist/extensions/agent-browser/lib/executable-path.js +21 -12
  48. package/dist/extensions/agent-browser/lib/execution-cwd.js +35 -18
  49. package/dist/extensions/agent-browser/lib/fs-utils.js +1 -9
  50. package/dist/extensions/agent-browser/lib/input-modes/electron.js +162 -121
  51. package/dist/extensions/agent-browser/lib/input-modes/job.js +123 -317
  52. package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +116 -0
  53. package/dist/extensions/agent-browser/lib/input-modes/lookup-plan.js +132 -0
  54. package/dist/extensions/agent-browser/lib/input-modes/lookup-redaction.js +57 -0
  55. package/dist/extensions/agent-browser/lib/input-modes/lookup-source-evidence.js +151 -0
  56. package/dist/extensions/agent-browser/lib/input-modes/lookup-workspace.js +142 -0
  57. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +58 -412
  58. package/dist/extensions/agent-browser/lib/input-modes/params.js +86 -40
  59. package/dist/extensions/agent-browser/lib/input-modes/qa-analysis.js +268 -0
  60. package/dist/extensions/agent-browser/lib/input-modes/qa-presentation.js +117 -0
  61. package/dist/extensions/agent-browser/lib/input-modes/script-child.js +396 -0
  62. package/dist/extensions/agent-browser/lib/input-modes/script-protocol.js +86 -0
  63. package/dist/extensions/agent-browser/lib/input-modes/script-types.js +1 -0
  64. package/dist/extensions/agent-browser/lib/input-modes/script-validation.js +60 -0
  65. package/dist/extensions/agent-browser/lib/input-modes/script.js +60 -409
  66. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +218 -128
  67. package/dist/extensions/agent-browser/lib/input-modes/shared.js +15 -4
  68. package/dist/extensions/agent-browser/lib/input-modes/types.js +56 -7
  69. package/dist/extensions/agent-browser/lib/json-schema.js +22 -10
  70. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +17 -5
  71. package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +92 -425
  72. package/dist/extensions/agent-browser/lib/managed-session-posix-storage.js +58 -0
  73. package/dist/extensions/agent-browser/lib/managed-session-project-identity.js +244 -0
  74. package/dist/extensions/agent-browser/lib/managed-session-restore-context.js +84 -0
  75. package/dist/extensions/agent-browser/lib/managed-session-restore-policy.js +119 -0
  76. package/dist/extensions/agent-browser/lib/managed-session-restore-state.js +83 -0
  77. package/dist/extensions/agent-browser/lib/managed-session-restore.js +168 -300
  78. package/dist/extensions/agent-browser/lib/managed-session-snapshot-records.js +277 -0
  79. package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +128 -305
  80. package/dist/extensions/agent-browser/lib/managed-session-storage.js +56 -253
  81. package/dist/extensions/agent-browser/lib/native-confirmation.js +140 -0
  82. package/dist/extensions/agent-browser/lib/native-output.js +43 -9
  83. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +106 -59
  84. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-merge.js +14 -6
  85. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +109 -57
  86. package/dist/extensions/agent-browser/lib/orchestration/browser-run/browser-observation-result.js +82 -0
  87. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +164 -60
  88. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostic-values.js +31 -0
  89. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +152 -781
  90. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-observation.js +203 -0
  91. package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-text-diagnostics.js +109 -0
  92. package/dist/extensions/agent-browser/lib/orchestration/browser-run/fill-diagnostics.js +119 -0
  93. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-action-recovery.js +147 -0
  94. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-actions.js +144 -0
  95. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-content.js +123 -0
  96. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-contracts.js +1 -0
  97. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-details.js +156 -0
  98. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-electron.js +187 -0
  99. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-evidence.js +39 -0
  100. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-missing-binary.js +89 -0
  101. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-recovery.js +97 -0
  102. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-redaction.js +106 -0
  103. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-timeout.js +110 -0
  104. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +41 -538
  105. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +199 -154
  106. package/dist/extensions/agent-browser/lib/orchestration/browser-run/interaction-diagnostics.js +290 -0
  107. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-close.js +167 -0
  108. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-inspection.js +108 -0
  109. package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +127 -205
  110. package/dist/extensions/agent-browser/lib/orchestration/browser-run/native-helper-observation.js +65 -0
  111. package/dist/extensions/agent-browser/lib/orchestration/browser-run/observation-types.js +1 -0
  112. package/dist/extensions/agent-browser/lib/orchestration/browser-run/overlay-diagnostics.js +120 -0
  113. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +113 -30
  114. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +109 -28
  115. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter-data.js +150 -0
  116. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +147 -253
  117. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-rendered-text.js +147 -0
  118. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +59 -24
  119. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-artifacts.js +159 -0
  120. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-command.js +131 -0
  121. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-contracts.js +1 -0
  122. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-daemon.js +93 -0
  123. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-failure.js +42 -0
  124. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-guards.js +242 -0
  125. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-input.js +75 -0
  126. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-observations.js +92 -0
  127. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-selection.js +254 -0
  128. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-state.js +121 -0
  129. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-refs.js +130 -0
  130. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-resources.js +114 -0
  131. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-semantic.js +121 -0
  132. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-session-plan.js +222 -0
  133. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-timeouts.js +68 -0
  134. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +176 -1123
  135. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-analysis.js +191 -0
  136. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-confirmation.js +152 -0
  137. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-diagnostics.js +182 -0
  138. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-electron.js +150 -0
  139. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-contracts.js +1 -0
  140. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase-contracts.js +1 -0
  141. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase.js +115 -0
  142. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle.js +256 -0
  143. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed-contracts.js +1 -0
  144. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed.js +256 -0
  145. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase-contracts.js +1 -0
  146. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase.js +93 -0
  147. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native.js +113 -0
  148. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation-contracts.js +1 -0
  149. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation.js +316 -0
  150. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-ownership.js +28 -0
  151. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase-contracts.js +1 -0
  152. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase.js +142 -0
  153. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation-contracts.js +1 -0
  154. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation.js +333 -0
  155. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase-contracts.js +1 -0
  156. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase.js +71 -0
  157. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication.js +201 -0
  158. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-receipts.js +183 -0
  159. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-refs.js +200 -0
  160. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-tabs.js +142 -0
  161. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +18 -968
  162. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +23 -13
  163. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-receipt-reconciliation.js +198 -0
  164. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-contracts.js +1 -0
  165. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-presentation.js +154 -0
  166. package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery.js +68 -151
  167. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-capture.js +14 -0
  168. package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-observation.js +169 -46
  169. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-commands.js +130 -0
  170. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-electron.js +212 -0
  171. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-observations.js +61 -0
  172. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-outcomes.js +187 -0
  173. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-refs.js +169 -0
  174. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-tabs.js +228 -0
  175. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +77 -765
  176. package/dist/extensions/agent-browser/lib/orchestration/browser-run/text-visibility-diagnostics.js +182 -0
  177. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-diagnostics.js +256 -0
  178. package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-progress.js +108 -0
  179. package/dist/extensions/agent-browser/lib/orchestration/code-artifact-observation.js +39 -0
  180. package/dist/extensions/agent-browser/lib/orchestration/code-image-observation.js +119 -0
  181. package/dist/extensions/agent-browser/lib/orchestration/electron-host/branch.js +93 -0
  182. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup-result.js +58 -0
  183. package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup.js +78 -0
  184. package/dist/extensions/agent-browser/lib/orchestration/electron-host/contracts.js +1 -0
  185. package/dist/extensions/agent-browser/lib/orchestration/electron-host/discovery.js +106 -0
  186. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +48 -821
  187. package/dist/extensions/agent-browser/lib/orchestration/electron-host/policy.js +86 -0
  188. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-collection.js +68 -0
  189. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +169 -0
  190. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +182 -0
  191. package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe.js +161 -0
  192. package/dist/extensions/agent-browser/lib/orchestration/electron-host/status.js +167 -0
  193. package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +22 -10
  194. package/dist/extensions/agent-browser/lib/orchestration/extension-artifact-preflight.js +211 -0
  195. package/dist/extensions/agent-browser/lib/orchestration/extension-artifacts.js +23 -0
  196. package/dist/extensions/agent-browser/lib/orchestration/extension-attachment-replay.js +99 -0
  197. package/dist/extensions/agent-browser/lib/orchestration/extension-branch-restore.js +275 -0
  198. package/dist/extensions/agent-browser/lib/orchestration/extension-code.js +280 -0
  199. package/dist/extensions/agent-browser/lib/orchestration/extension-command-admission.js +303 -0
  200. package/dist/extensions/agent-browser/lib/orchestration/extension-command-output.js +36 -0
  201. package/dist/extensions/agent-browser/lib/orchestration/extension-command-result.js +335 -0
  202. package/dist/extensions/agent-browser/lib/orchestration/extension-command-run.js +227 -0
  203. package/dist/extensions/agent-browser/lib/orchestration/extension-command-state.js +1 -0
  204. package/dist/extensions/agent-browser/lib/orchestration/extension-electron-ownership.js +204 -0
  205. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-locks.js +139 -0
  206. package/dist/extensions/agent-browser/lib/orchestration/extension-execution-queue.js +24 -0
  207. package/dist/extensions/agent-browser/lib/orchestration/extension-host-coordination.js +98 -0
  208. package/dist/extensions/agent-browser/lib/orchestration/extension-host-run.js +295 -0
  209. package/dist/extensions/agent-browser/lib/orchestration/extension-intent-replay.js +41 -0
  210. package/dist/extensions/agent-browser/lib/orchestration/extension-invocation.js +7 -0
  211. package/dist/extensions/agent-browser/lib/orchestration/extension-lifecycle.js +102 -0
  212. package/dist/extensions/agent-browser/lib/orchestration/extension-managed-ownership.js +133 -0
  213. package/dist/extensions/agent-browser/lib/orchestration/extension-observation.js +120 -0
  214. package/dist/extensions/agent-browser/lib/orchestration/extension-prompt.js +180 -0
  215. package/dist/extensions/agent-browser/lib/orchestration/extension-recording.js +290 -0
  216. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-contracts.js +1 -0
  217. package/dist/extensions/agent-browser/lib/orchestration/extension-resource-replay.js +269 -0
  218. package/dist/extensions/agent-browser/lib/orchestration/extension-result-state.js +113 -0
  219. package/dist/extensions/agent-browser/lib/orchestration/extension-runtime.js +146 -0
  220. package/dist/extensions/agent-browser/lib/orchestration/extension-script-leases.js +58 -0
  221. package/dist/extensions/agent-browser/lib/orchestration/extension-tool-boundary.js +62 -0
  222. package/dist/extensions/agent-browser/lib/orchestration/extension-version-check.js +54 -0
  223. package/dist/extensions/agent-browser/lib/orchestration/input-plan-types.js +1 -0
  224. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +261 -185
  225. package/dist/extensions/agent-browser/lib/orchestration/input-redaction.js +62 -0
  226. package/dist/extensions/agent-browser/lib/orchestration/native-config.js +144 -0
  227. package/dist/extensions/agent-browser/lib/orchestration/native-root-launch.js +77 -0
  228. package/dist/extensions/agent-browser/lib/orchestration/native-session-defaults.js +210 -157
  229. package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
  230. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +197 -99
  231. package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +199 -96
  232. package/dist/extensions/agent-browser/lib/owned-managed-session-context.js +55 -0
  233. package/dist/extensions/agent-browser/lib/page-target-batch.js +118 -0
  234. package/dist/extensions/agent-browser/lib/page-target-guards.js +50 -0
  235. package/dist/extensions/agent-browser/lib/page-target-navigation.js +104 -0
  236. package/dist/extensions/agent-browser/lib/page-target-validation.js +55 -246
  237. package/dist/extensions/agent-browser/lib/parsing.js +13 -4
  238. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +133 -68
  239. package/dist/extensions/agent-browser/lib/playbook.js +16 -12
  240. package/dist/extensions/agent-browser/lib/process-child.js +284 -0
  241. package/dist/extensions/agent-browser/lib/process-environment.js +13 -6
  242. package/dist/extensions/agent-browser/lib/process-errors.js +23 -0
  243. package/dist/extensions/agent-browser/lib/process-identity.js +47 -15
  244. package/dist/extensions/agent-browser/lib/process-socket-storage.js +256 -0
  245. package/dist/extensions/agent-browser/lib/process-stdout.js +74 -0
  246. package/dist/extensions/agent-browser/lib/process.js +145 -536
  247. package/dist/extensions/agent-browser/lib/prompt-artifacts.js +287 -0
  248. package/dist/extensions/agent-browser/lib/prompt-policy.js +15 -194
  249. package/dist/extensions/agent-browser/lib/read-command.js +41 -0
  250. package/dist/extensions/agent-browser/lib/read-confirmation.js +131 -68
  251. package/dist/extensions/agent-browser/lib/recording-reservations.js +118 -45
  252. package/dist/extensions/agent-browser/lib/redaction-fields.js +75 -0
  253. package/dist/extensions/agent-browser/lib/redaction-json.js +149 -0
  254. package/dist/extensions/agent-browser/lib/redaction-url.js +88 -0
  255. package/dist/extensions/agent-browser/lib/results/action-contracts.js +1 -0
  256. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +28 -271
  257. package/dist/extensions/agent-browser/lib/results/artifact-contracts.js +1 -0
  258. package/dist/extensions/agent-browser/lib/results/artifact-manifest-validation.js +133 -0
  259. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +96 -94
  260. package/dist/extensions/agent-browser/lib/results/artifact-recommendations.js +73 -0
  261. package/dist/extensions/agent-browser/lib/results/categories.js +111 -54
  262. package/dist/extensions/agent-browser/lib/results/confirmation.js +29 -13
  263. package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +62 -27
  264. package/dist/extensions/agent-browser/lib/results/electron-recommendations.js +83 -0
  265. package/dist/extensions/agent-browser/lib/results/envelope-decoding.js +48 -0
  266. package/dist/extensions/agent-browser/lib/results/envelope.js +90 -67
  267. package/dist/extensions/agent-browser/lib/results/evidence-contracts.js +1 -0
  268. package/dist/extensions/agent-browser/lib/results/failure-recommendations.js +180 -0
  269. package/dist/extensions/agent-browser/lib/results/network-routes.js +86 -45
  270. package/dist/extensions/agent-browser/lib/results/network.js +35 -12
  271. package/dist/extensions/agent-browser/lib/results/next-actions.js +49 -19
  272. package/dist/extensions/agent-browser/lib/results/presentation/artifact-files.js +320 -0
  273. package/dist/extensions/agent-browser/lib/results/presentation/artifact-format.js +138 -0
  274. package/dist/extensions/agent-browser/lib/results/presentation/artifact-images.js +113 -0
  275. package/dist/extensions/agent-browser/lib/results/presentation/artifact-verification.js +145 -0
  276. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +99 -555
  277. package/dist/extensions/agent-browser/lib/results/presentation/batch-contracts.js +1 -0
  278. package/dist/extensions/agent-browser/lib/results/presentation/batch-recording.js +118 -0
  279. package/dist/extensions/agent-browser/lib/results/presentation/batch-redaction.js +68 -0
  280. package/dist/extensions/agent-browser/lib/results/presentation/batch-rendering.js +135 -0
  281. package/dist/extensions/agent-browser/lib/results/presentation/batch-step.js +227 -0
  282. package/dist/extensions/agent-browser/lib/results/presentation/batch-summary.js +91 -0
  283. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +91 -460
  284. package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +9 -5
  285. package/dist/extensions/agent-browser/lib/results/presentation/command-presenters.js +216 -0
  286. package/dist/extensions/agent-browser/lib/results/presentation/common.js +26 -9
  287. package/dist/extensions/agent-browser/lib/results/presentation/content.js +86 -29
  288. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-a11y.js +67 -0
  289. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-health.js +79 -0
  290. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-identity.js +199 -0
  291. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-logs.js +75 -0
  292. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network-actions.js +216 -0
  293. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network.js +124 -0
  294. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-redaction.js +64 -0
  295. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-storage.js +209 -0
  296. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-stream.js +69 -0
  297. package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-summary.js +222 -0
  298. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +103 -1052
  299. package/dist/extensions/agent-browser/lib/results/presentation/early-result.js +70 -0
  300. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +130 -60
  301. package/dist/extensions/agent-browser/lib/results/presentation/input-contracts.js +1 -0
  302. package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +60 -145
  303. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +147 -88
  304. package/dist/extensions/agent-browser/lib/results/presentation/notices.js +75 -0
  305. package/dist/extensions/agent-browser/lib/results/presentation/observation-contracts.js +1 -0
  306. package/dist/extensions/agent-browser/lib/results/presentation/observation-rendering.js +127 -0
  307. package/dist/extensions/agent-browser/lib/results/presentation/outcomes.js +120 -0
  308. package/dist/extensions/agent-browser/lib/results/presentation/output-completion.js +77 -0
  309. package/dist/extensions/agent-browser/lib/results/presentation/output-spill.js +51 -0
  310. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +116 -240
  311. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +35 -21
  312. package/dist/extensions/agent-browser/lib/results/presentation/skills.js +109 -73
  313. package/dist/extensions/agent-browser/lib/results/presentation/source.js +109 -0
  314. package/dist/extensions/agent-browser/lib/results/presentation.js +17 -261
  315. package/dist/extensions/agent-browser/lib/results/recommendation-contracts.js +1 -0
  316. package/dist/extensions/agent-browser/lib/results/recording.js +52 -14
  317. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +14 -5
  318. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +30 -22
  319. package/dist/extensions/agent-browser/lib/results/selector-recovery-target.js +83 -0
  320. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +119 -119
  321. package/dist/extensions/agent-browser/lib/results/snapshot-compact.js +266 -0
  322. package/dist/extensions/agent-browser/lib/results/snapshot-content.js +32 -0
  323. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +104 -71
  324. package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +31 -11
  325. package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +125 -66
  326. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +26 -7
  327. package/dist/extensions/agent-browser/lib/results/snapshot.js +28 -248
  328. package/dist/extensions/agent-browser/lib/results/text.js +16 -5
  329. package/dist/extensions/agent-browser/lib/runtime-args-validation.js +133 -0
  330. package/dist/extensions/agent-browser/lib/runtime-compatibility.js +81 -0
  331. package/dist/extensions/agent-browser/lib/runtime-contracts.js +1 -0
  332. package/dist/extensions/agent-browser/lib/runtime-redaction.js +118 -0
  333. package/dist/extensions/agent-browser/lib/runtime-replay-events.js +144 -0
  334. package/dist/extensions/agent-browser/lib/runtime-session-identity.js +76 -0
  335. package/dist/extensions/agent-browser/lib/runtime-session-plan.js +114 -0
  336. package/dist/extensions/agent-browser/lib/runtime-session-replay.js +123 -0
  337. package/dist/extensions/agent-browser/lib/runtime-tab-correction.js +65 -0
  338. package/dist/extensions/agent-browser/lib/runtime-timeouts.js +28 -0
  339. package/dist/extensions/agent-browser/lib/runtime.js +137 -1041
  340. package/dist/extensions/agent-browser/lib/session-identity.js +51 -0
  341. package/dist/extensions/agent-browser/lib/session-page-observation.js +357 -0
  342. package/dist/extensions/agent-browser/lib/session-page-state.js +178 -333
  343. package/dist/extensions/agent-browser/lib/session-page-types.js +1 -0
  344. package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +81 -0
  345. package/dist/extensions/agent-browser/lib/temp-mutation-queue.js +7 -0
  346. package/dist/extensions/agent-browser/lib/temp-root-ownership.js +234 -0
  347. package/dist/extensions/agent-browser/lib/temp-root.js +211 -0
  348. package/dist/extensions/agent-browser/lib/temp.js +33 -446
  349. package/dist/extensions/agent-browser/lib/tool-surface.js +94 -24
  350. package/dist/extensions/agent-browser/lib/upstream-version.js +3 -2
  351. package/dist/extensions/agent-browser/lib/web-search-providers.js +193 -0
  352. package/dist/extensions/agent-browser/lib/web-search-request.js +102 -0
  353. package/dist/extensions/agent-browser/lib/web-search-results.js +281 -0
  354. package/dist/extensions/agent-browser/lib/web-search-schema.js +82 -0
  355. package/dist/extensions/agent-browser/lib/web-search.js +124 -614
  356. package/dist/extensions/agent-browser/lib/webmcp-observation.js +13 -6
  357. package/dist/extensions/agent-browser/lib/windows-stock-launcher.js +63 -37
  358. package/dist/extensions/agent-browser/script-worker.js +80 -43
  359. package/dist/scripts/agent-browser-target.mjs +4 -2
  360. package/docs/ARCHITECTURE.md +19 -6
  361. package/docs/CODE_QUALITY.md +267 -0
  362. package/docs/COMMAND_REFERENCE.md +272 -241
  363. package/docs/ELECTRON.md +77 -46
  364. package/docs/REFERENCE.md +869 -0
  365. package/docs/RELEASE.md +25 -22
  366. package/docs/REQUIREMENTS.md +2 -1
  367. package/docs/SUPPORT_MATRIX.md +81 -79
  368. package/docs/TOOL_CONTRACT.md +158 -125
  369. package/docs/platform-smoke.md +8 -8
  370. package/package.json +144 -120
  371. package/scripts/agent-browser-capability-baseline.mjs +361 -957
  372. package/scripts/agent-browser-target.mjs +6 -2
  373. package/scripts/build.mjs +37 -8
  374. package/scripts/capability-core-commands.mjs +193 -0
  375. package/scripts/capability-options.mjs +283 -0
  376. package/scripts/capability-samples.mjs +133 -0
  377. package/scripts/capability-section.mjs +11 -0
  378. package/scripts/config.mjs +235 -132
  379. package/scripts/convert-browser-session.mjs +30 -9
  380. package/scripts/doctor-sources.mjs +195 -0
  381. package/scripts/doctor.mjs +94 -249
  382. package/scripts/platform-smoke/artifacts.mjs +38 -11
  383. package/scripts/platform-smoke/commands.mjs +104 -0
  384. package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
  385. package/scripts/platform-smoke/doctor-support.mjs +157 -0
  386. package/scripts/platform-smoke/doctor-windows.mjs +230 -0
  387. package/scripts/platform-smoke/doctor.mjs +212 -320
  388. package/scripts/platform-smoke/lease-evidence.mjs +132 -0
  389. package/scripts/platform-smoke/linux-image/Dockerfile +8 -2
  390. package/scripts/platform-smoke/suite-checks.mjs +98 -0
  391. package/scripts/platform-smoke/suite-evidence.mjs +281 -0
  392. package/scripts/platform-smoke/targets.mjs +154 -472
  393. package/scripts/platform-smoke.mjs +55 -40
  394. package/scripts/prepare.mjs +16 -7
@@ -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
+ }
@@ -0,0 +1,230 @@
1
+ /** Disposable Windows/Parallels doctor probes with native lease cleanup receipts. */
2
+ import { execFileSync } from "node:child_process";
3
+ import { buildTargetBaseArgs } from "./crabbox-runner.mjs";
4
+ import { commandPath, setting, shell } from "./doctor-support.mjs";
5
+
6
+ function crabbox(cbox, args, timeout = 300_000) {
7
+ try {
8
+ return {
9
+ ok: true,
10
+ stdout: execFileSync(cbox, args, {
11
+ timeout,
12
+ stdio: "pipe",
13
+ env: { ...process.env, CRABBOX_SYNC_GIT_SEED: "false" },
14
+ }).toString(),
15
+ stderr: "",
16
+ };
17
+ } catch (error) {
18
+ return {
19
+ ok: false,
20
+ stdout: error.stdout?.toString?.() ?? "",
21
+ stderr: error.stderr?.toString?.() ?? error.message,
22
+ };
23
+ }
24
+ }
25
+
26
+ const PROBE_SCRIPT = `$ErrorActionPreference = "Stop"
27
+ $cmd = Get-Command "agent-browser.cmd" -ErrorAction SilentlyContinue | Select-Object -First 1
28
+ if (-not $cmd) { throw "agent-browser.cmd missing" }
29
+ $version = & $cmd.Source --version
30
+ Write-Output "PLATFORM_DOCTOR_AGENT_BROWSER_PATH=$($cmd.Source)"
31
+ Write-Output "PLATFORM_DOCTOR_AGENT_BROWSER_VERSION=$version"
32
+ $roots = @((Join-Path $env:USERPROFILE ".agent-browser\\browsers"), "C:\\WINDOWS\\system32\\config\\systemprofile\\.agent-browser\\browsers")
33
+ $chrome = Get-ChildItem -Path $roots -Recurse -Filter chrome.exe -ErrorAction SilentlyContinue | Select-Object -First 1
34
+ if (-not $chrome) { throw "agent-browser browser cache missing chrome.exe" }
35
+ Write-Output "PLATFORM_DOCTOR_AGENT_BROWSER_CHROME=$($chrome.FullName)"`;
36
+
37
+ function probeOutcome(run, expectedVersion) {
38
+ if (!run.ok) {
39
+ return { ok: false, message: `probe failed: ${(run.stderr || run.stdout).slice(-700)}` };
40
+ }
41
+ const output = run.stdout;
42
+ const marker = (name) =>
43
+ output.match(new RegExp(`^PLATFORM_DOCTOR_AGENT_BROWSER_${name}=(.*)$`, "m"))?.[1]?.trim() ??
44
+ "";
45
+ const versionLine = marker("VERSION");
46
+ const pathLine = marker("PATH");
47
+ const chromeLine = marker("CHROME");
48
+ if (versionLine !== `agent-browser ${expectedVersion}`) {
49
+ return {
50
+ ok: false,
51
+ message: `expected agent-browser ${expectedVersion}, got ${versionLine || "missing version"}`,
52
+ };
53
+ }
54
+ if (!pathLine || !chromeLine) {
55
+ return { ok: false, message: "agent-browser path or browser cache marker missing" };
56
+ }
57
+ return { ok: true, message: `${versionLine} | ${pathLine} | ${chromeLine}` };
58
+ }
59
+
60
+ function leaseIdFromWarmup(warm, fallback) {
61
+ const text = `${warm.stdout}\n${warm.stderr}`;
62
+ return text.match(/\bleased\s+(\S+)/)?.[1] ?? text.match(/\blease=(\S+)/)?.[1] ?? fallback;
63
+ }
64
+
65
+ export function disposableWindowsAgentBrowserProbe(cbox, config, expectedVersion) {
66
+ const slug = "piab-doctor-agent-browser";
67
+ const baseArgs = buildTargetBaseArgs("windows-native", config);
68
+ const warm = crabbox(
69
+ cbox,
70
+ ["warmup", ...baseArgs, "--slug", slug, "--keep", "--reclaim"],
71
+ 300_000,
72
+ );
73
+ const leaseId = leaseIdFromWarmup(warm, slug);
74
+ if (!warm.ok) {
75
+ return { ok: false, message: `warmup failed: ${(warm.stderr || warm.stdout).slice(-500)}` };
76
+ }
77
+ let outcome;
78
+ try {
79
+ const probeCommand = `powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -EncodedCommand ${Buffer.from(PROBE_SCRIPT, "utf16le").toString("base64")}`;
80
+ outcome = probeOutcome(
81
+ crabbox(
82
+ cbox,
83
+ ["run", ...baseArgs, "--id", leaseId, "--no-sync", "--shell", probeCommand],
84
+ 180_000,
85
+ ),
86
+ expectedVersion,
87
+ );
88
+ } finally {
89
+ const stop = crabbox(cbox, ["stop", ...baseArgs, "--id", leaseId], 90_000);
90
+ if (!stop.ok) {
91
+ const prior = outcome?.ok === false ? `; prior result: ${outcome.message}` : "";
92
+ outcome = {
93
+ ok: false,
94
+ message: `cleanup failed: ${(stop.stderr || stop.stdout).slice(-500)}${prior}`,
95
+ };
96
+ }
97
+ }
98
+ return outcome;
99
+ }
100
+
101
+ function checkSnapshot(vmName, snapshot, report) {
102
+ const snapshotsJson = shell(
103
+ `prlctl snapshot-list "${vmName.replace(/"/g, '\\"')}" -j 2>/dev/null`,
104
+ );
105
+ let snapshotMatch = null;
106
+ try {
107
+ const snapshots = JSON.parse(snapshotsJson ?? "{}");
108
+ snapshotMatch = Object.entries(snapshots).find(
109
+ ([id, data]) => id === snapshot || data?.name === snapshot,
110
+ );
111
+ } catch {
112
+ // Invalid native snapshot output falls through to the explicit failure below.
113
+ }
114
+ if (!snapshotMatch) {
115
+ report.fail(`snapshot ${snapshot} not found on ${vmName}`);
116
+ return;
117
+ }
118
+ report.ok(`snapshot ${snapshot} found`);
119
+ const snapshotState = snapshotMatch[1]?.state ?? "unknown";
120
+ if (snapshotState === "poweroff") {
121
+ report.ok(`snapshot ${snapshot} state is poweroff`);
122
+ } else {
123
+ report.fail(`snapshot ${snapshot} must be poweroff; current snapshot state: ${snapshotState}`);
124
+ }
125
+ }
126
+
127
+ function windowsSettings(config, packageName) {
128
+ return {
129
+ sourceVm: setting(
130
+ "PLATFORM_SMOKE_WINDOWS_VM",
131
+ config?.windowsParallels?.sourceVm,
132
+ "pi-extension-windows-template",
133
+ ),
134
+ snapshot: setting(
135
+ "PLATFORM_SMOKE_WINDOWS_SNAPSHOT",
136
+ config?.windowsParallels?.snapshot,
137
+ "crabbox-ready",
138
+ ),
139
+ user: setting(
140
+ "PLATFORM_SMOKE_WINDOWS_USER",
141
+ config?.windowsParallels?.user,
142
+ process.env.USER ?? "",
143
+ ),
144
+ workRoot: setting(
145
+ "PLATFORM_SMOKE_WINDOWS_WORK_ROOT",
146
+ config?.windowsParallels?.workRoot,
147
+ `C:\\crabbox\\${packageName}`,
148
+ ),
149
+ };
150
+ }
151
+
152
+ function checkWindowsTemplate(windows, report) {
153
+ const vmName = windows.sourceVm;
154
+ const list = shell("prlctl list -a --no-header 2>/dev/null");
155
+ if (!list) {
156
+ report.fail("prlctl list returned no VMs");
157
+ return false;
158
+ }
159
+ if (!list.includes(vmName)) {
160
+ report.fail(`Windows VM ${vmName} not found`);
161
+ return false;
162
+ }
163
+ report.ok(`Windows VM ${vmName} found`);
164
+ const status = shell(`prlctl status "${vmName.replace(/"/g, '\\"')}" 2>/dev/null`);
165
+ if (/\bstopped\b/i.test(status ?? "")) {
166
+ report.ok(`Windows source VM ${vmName} is stopped`);
167
+ } else {
168
+ report.fail(
169
+ `Windows source VM ${vmName} must be stopped for forkable snapshot use; current status: ${status ?? "unknown"}`,
170
+ );
171
+ }
172
+ checkSnapshot(vmName, windows.snapshot, report);
173
+ return true;
174
+ }
175
+
176
+ export function checkWindows({
177
+ cbox,
178
+ config,
179
+ packageName,
180
+ agentBrowserVersion,
181
+ report,
182
+ checkCrabboxProvider,
183
+ }) {
184
+ console.log("\n── Windows native / Parallels ──");
185
+ if (!(config?.requiredTargets ?? []).includes("windows-native")) {
186
+ report.warn("windows-native is not listed in requiredTargets for this configuration");
187
+ return;
188
+ }
189
+ if (!commandPath("prlctl")) {
190
+ report.fail("prlctl not found");
191
+ return;
192
+ }
193
+ report.ok("prlctl found");
194
+ const windows = windowsSettings(config, packageName);
195
+ const vmName = windows.sourceVm;
196
+ if (!checkWindowsTemplate(windows, report)) {
197
+ return;
198
+ }
199
+ checkCrabboxProvider(
200
+ cbox,
201
+ [
202
+ "--provider",
203
+ "parallels",
204
+ "--target",
205
+ "windows",
206
+ "--windows-mode",
207
+ "normal",
208
+ "--parallels-source",
209
+ vmName,
210
+ "--parallels-source-snapshot",
211
+ windows.snapshot,
212
+ "--parallels-user",
213
+ windows.user,
214
+ "--parallels-work-root",
215
+ windows.workRoot,
216
+ ],
217
+ "windows parallels",
218
+ report,
219
+ );
220
+ const probe = disposableWindowsAgentBrowserProbe(
221
+ cbox,
222
+ { ...config, windowsParallels: { ...config?.windowsParallels, ...windows } },
223
+ agentBrowserVersion,
224
+ );
225
+ if (probe.ok) {
226
+ report.ok(`Windows disposable agent-browser: ${probe.message}`);
227
+ } else {
228
+ report.fail(`Windows disposable agent-browser probe failed: ${probe.message}`);
229
+ }
230
+ }