@@ -12,7 +12,8 @@ import { browserAssertionsSummary, browserStepRecord, executeBrowserInteractionS
1212import { browserCommandLivenessPolicy , isBrowserCommandLivenessError , withBrowserCommandLiveness } from "./browser-liveness.js"
1313import { serializeBrowserError } from "./browser-metrics.js"
1414import { executeBrowserObservationAssertion } from "./browser-observation-assertions.js"
15- import { browserPreviewNetworkPolicyIsActive , browserPreviewNetworkPolicySummary , browserPreviewNeedsContextRouting , browserPreviewReadinessError , browserPreviewTopology , resolveBrowserPreviewUrl , routeBrowserPreviewContextNetwork } from "./browser-preview-routing.js"
15+ import { browserPreviewNetworkPolicyIsActive , browserPreviewNetworkPolicySummary , browserPreviewNeedsContextRouting , browserPreviewReadinessError , browserPreviewTopology , closeBrowserAndDrainPreviewRoutes , createBrowserPreviewRouteTracker , resolveBrowserPreviewUrl , routeBrowserPreviewContextNetwork } from "./browser-preview-routing.js"
16+ import { browserCommandResult } from "./browser-result-sanitization.js"
1617import { BROWSER_PROBE_STATE_INIT_SCRIPT , browserProbeReplayability , browserProbeViewport } from "./browser-probe.js"
1718import { runBrowserProbeCommand , type BrowserProbeRunPlan } from "./browser-probe-runner.js"
1819import { browserActionTargetUrls , browserAuthRequest , browserProbeWaterfallArtifact , browserProbeWebSocketArtifact , browserProbeWebSocketSummary , browserRedirectDiagnosticsArtifact , browserRequestCoverageArtifact , browserStorageStateAuthSummary , browserStorageStateImportFromArgs , browserWordPressDiagnosticsArtifact , createBrowserProbeProgressTracker , fileSha256 , installBrowserWordPressDiagnostics , installWordPressAdminAuthCookies , livenessRemainingWallTimeMs , normalizeBrowserProbeScriptCheckpoint , type BrowserCommandProgressEvent , type BrowserStorageStateImport } from "./browser-probe-support.js"
@@ -127,6 +128,7 @@ export async function runBrowserActionsCommand({
127128 const browser = await launchChromiumBrowser ( )
128129 const topology = browserPreviewTopology ( args , runtimeSpec , server . serverUrl , server . previewProxyDiagnostics ?. targetOrigin )
129130 const { preview, networkPolicy } = topology
131+ const routeTracker = createBrowserPreviewRouteTracker ( )
130132 let requestedUrl = initialUrl ? topology . resolveUrl ( initialUrl ) : preview . effectiveOrigin
131133 let finalUrl = requestedUrl
132134 let htmlSha256 : string | undefined
@@ -153,7 +155,7 @@ export async function runBrowserActionsCommand({
153155 ...( storageStateImport ? { storageState : storageStateImport . storageState } : { } ) ,
154156 } ) : null
155157 if ( context ) {
156- await routeBrowserPreviewContextNetwork ( context , networkPolicy , topology . origins . localProxyOrigin )
158+ await routeBrowserPreviewContextNetwork ( context , networkPolicy , topology . origins . localProxyOrigin , routeTracker )
157159 }
158160 const page = context ? await context . newPage ( ) : await browser . newPage ( )
159161 if ( onProgress ) {
@@ -418,8 +420,11 @@ export async function runBrowserActionsCommand({
418420 pendingError = error instanceof Error ? error : new Error ( String ( error ) )
419421 errors . push ( serializeBrowserError ( "probe-error" , error ) )
420422 } finally {
421- await settleBrowserNetworkTasks ( networkTasks , livenessPolicy . networkSettleTimeoutMs )
422- await browser . close ( )
423+ await settleBrowserNetworkTasks ( networkTasks , livenessPolicy . networkSettleTimeoutMs ) . catch ( ( error ) => errors . push ( serializeBrowserError ( "probe-error" , error ) ) )
424+ for ( const routeError of await closeBrowserAndDrainPreviewRoutes ( browser , routeTracker ) ) {
425+ errors . push ( serializeBrowserError ( "probe-error" , routeError ) )
426+ pendingError ??= routeError
427+ }
423428 if ( capture . has ( "steps" ) ) {
424429 await artifactSession . writeJsonLines ( "steps" , "steps.jsonl" , stepRecords )
425430 }
@@ -555,9 +560,7 @@ export async function runBrowserActionsCommand({
555560 throw new Error ( "wordpress.browser-actions did not produce a browser artifact" )
556561 }
557562
558- return {
559- artifact,
560- output : `${ JSON . stringify ( {
563+ return browserCommandResult ( artifact , {
561564 command : "wordpress.browser-actions" ,
562565 requestedUrl,
563566 preview,
@@ -566,8 +569,7 @@ export async function runBrowserActionsCommand({
566569 files : artifact . files ,
567570 summary : artifact . summary ,
568571 steps : stepRecords ,
569- } , null , 2 ) } \n`,
570- }
572+ } )
571573}
572574
573575export function browserToolVerifierUnsupportedResult ( step : BrowserInteractionStep , index : number , startedAt : string ) : BrowserToolVerifierResult {
@@ -952,17 +954,14 @@ export async function runBrowserScenarioCommand({
952954 throw new BrowserCommandArtifactError ( `wordpress.browser-scenario failed: ${ pendingError . message } ` , artifact )
953955 }
954956
955- return {
956- artifact,
957- output : `${ JSON . stringify ( {
957+ return browserCommandResult ( artifact , {
958958 command : "wordpress.browser-scenario" ,
959959 requestedUrl : artifact . requestedUrl ,
960960 finalUrl,
961961 files : artifact . files ,
962962 summary : artifact . summary ,
963963 scenario : scenarioSummary ,
964- } , null , 2 ) } \n`,
965- }
964+ } )
966965}
967966
968967async function browserScenarioFromArgs ( args : string [ ] ) : Promise < BrowserScenarioInput > {
0 commit comments