@@ -4,17 +4,17 @@ import type {
44 IosViewportEvidence ,
55} from '@agent-device/contracts/ios-snapshot' ;
66import type { SnapshotOptions } from '@agent-device/contracts/interactor-types' ;
7- import { normalizeType } from '@agent-device/contracts/snapshot' ;
87import {
98 IosSnapshotEngineError ,
109 presentIosRunnerSnapshot ,
10+ resolveIosViewportEvidenceFromRoots ,
11+ toIosSnapshotEngineErrorDetails ,
1112} from '@agent-device/capture-kit/ios-snapshot-engine' ;
1213import { readSnapshotQualityVerdict } from '@agent-device/capture-kit/snapshot-quality-verdict' ;
1314import {
1415 createIosSnapshotRequest ,
1516 buildIosSnapshotPresentationKey ,
1617} from '@agent-device/capture-kit/ios-snapshot-planning' ;
17- import { isPositiveFiniteRect } from '@agent-device/kernel/rect' ;
1818import { AppError } from '@agent-device/kernel/errors' ;
1919import type { RawSnapshotNode , SnapshotQualityVerdict } from '@agent-device/kernel/snapshot' ;
2020
@@ -119,36 +119,18 @@ function runnerViewportEvidence(
119119 qualityNodes : readonly RawSnapshotNode [ ] | undefined ,
120120) : IosViewportEvidence {
121121 return (
122- readReportedViewport ( qualityNodes ) ??
123- readReportedViewport ( nodes ) ?? { kind : 'missing' , reason : 'not-provided' }
122+ resolveIosViewportEvidenceFromRoots ( rootNodes ( qualityNodes ) , {
123+ fallbackToLargestRoot : true ,
124+ } ) ??
125+ resolveIosViewportEvidenceFromRoots ( rootNodes ( nodes ) , { fallbackToLargestRoot : true } ) ?? {
126+ kind : 'missing' ,
127+ reason : 'not-provided' ,
128+ }
124129 ) ;
125130}
126131
127- function readReportedViewport (
128- nodes : readonly RawSnapshotNode [ ] | undefined ,
129- ) : IosViewportEvidence | undefined {
130- const roots = nodes ?. filter ( ( node ) => node . parentIndex === undefined ) ?? [ ] ;
131- const root =
132- [ ...roots ]
133- . filter ( ( node ) => isViewportRoot ( node ) )
134- . sort ( compareRectArea )
135- . at ( 0 ) ?? [ ...roots ] . sort ( compareRectArea ) . at ( 0 ) ;
136- if ( ! root ) return undefined ;
137- if ( isPositiveFiniteRect ( root . rect ) ) return { kind : 'reported' , rect : root . rect } ;
138- return { kind : 'missing' , reason : root . rect ? 'invalid' : 'not-provided' } ;
139- }
140-
141- function isViewportRoot ( node : RawSnapshotNode ) : boolean {
142- const type = normalizeType ( node . type ?? '' ) ;
143- return type === 'application' || type === 'window' ;
144- }
145-
146- function compareRectArea ( left : RawSnapshotNode , right : RawSnapshotNode ) : number {
147- return rectArea ( right . rect ) - rectArea ( left . rect ) ;
148- }
149-
150- function rectArea ( rect : RawSnapshotNode [ 'rect' ] ) : number {
151- return rect ? rect . width * rect . height : 0 ;
132+ function rootNodes ( nodes : readonly RawSnapshotNode [ ] | undefined ) : readonly RawSnapshotNode [ ] {
133+ return nodes ?. filter ( ( node ) => node . parentIndex === undefined ) ?? [ ] ;
152134}
153135
154136function isRecord ( value : unknown ) : value is Record < string , unknown > {
@@ -160,7 +142,7 @@ function throwSnapshotEngineError(error: unknown): never {
160142 throw new AppError (
161143 'COMMAND_FAILED' ,
162144 error . message ,
163- { reason : error . reason , iosSnapshotEngine : { details : error . details } } ,
145+ toIosSnapshotEngineErrorDetails ( error ) ,
164146 error ,
165147 ) ;
166148}
0 commit comments