@@ -5,21 +5,38 @@ import type { DaemonResponse, SessionState } from './types.ts';
55import { dispatchCommand } from '../core/dispatch.ts' ;
66import { emitDiagnostic } from '../utils/diagnostics.ts' ;
77import { normalizeError , type NormalizedError } from '../utils/errors.ts' ;
8+ import type { ScreenshotOverlayRef } from '../utils/snapshot.ts' ;
89import { contextFromFlags } from './context.ts' ;
910import { annotateScreenshotWithRefs } from './screenshot-overlay.ts' ;
1011
11- type AndroidSnapshotTimeoutEvidence = {
12- path ?: string ;
13- overlayRefsRequested ?: boolean ;
14- overlayRefsAnnotated ?: boolean ;
15- overlayRefCount ?: number ;
16- overlayRefSource ?: 'session-snapshot' | 'unavailable' ;
17- overlayRefs ?: unknown [ ] ;
18- overlayAnnotationError ?: string ;
19- captureFailed ?: boolean ;
20- error ?: string ;
12+ type CapturedAndroidSnapshotTimeoutEvidenceBase = {
13+ path : string ;
14+ overlayRefsRequested : true ;
2115} ;
2216
17+ type AndroidSnapshotTimeoutEvidence =
18+ | {
19+ captureFailed : true ;
20+ error : string ;
21+ }
22+ | ( CapturedAndroidSnapshotTimeoutEvidenceBase & {
23+ overlayRefSource : 'unavailable' ;
24+ overlayRefsAnnotated : false ;
25+ overlayRefCount : 0 ;
26+ } )
27+ | ( CapturedAndroidSnapshotTimeoutEvidenceBase & {
28+ overlayRefSource : 'session-snapshot' ;
29+ overlayRefsAnnotated : boolean ;
30+ overlayRefCount : number ;
31+ overlayRefs : ScreenshotOverlayRef [ ] ;
32+ } )
33+ | ( CapturedAndroidSnapshotTimeoutEvidenceBase & {
34+ overlayRefSource : 'session-snapshot' ;
35+ overlayRefsAnnotated : false ;
36+ overlayRefCount : 0 ;
37+ overlayAnnotationError : string ;
38+ } ) ;
39+
2340export async function maybeBuildAndroidSnapshotTimeoutFailure ( params : {
2441 error : unknown ;
2542 command : 'snapshot' | 'diff' ;
@@ -71,8 +88,9 @@ async function captureAndroidSnapshotTimeoutEvidence(params: {
7188 phase : 'android_snapshot_timeout_screenshot_captured' ,
7289 data : {
7390 path : resolvedPath ,
74- overlayRefCount : evidence . overlayRefCount ,
75- overlayRefsAnnotated : evidence . overlayRefsAnnotated ,
91+ overlayRefCount : 'overlayRefCount' in evidence ? evidence . overlayRefCount : undefined ,
92+ overlayRefsAnnotated :
93+ 'overlayRefsAnnotated' in evidence ? evidence . overlayRefsAnnotated : undefined ,
7694 } ,
7795 } ) ;
7896 return evidence ;
@@ -98,14 +116,12 @@ async function annotateAndroidSnapshotTimeoutEvidence(
98116 path : screenshotPath ,
99117 overlayRefsRequested : true ,
100118 overlayRefsAnnotated : false ,
119+ overlayRefSource : 'unavailable' ,
120+ overlayRefCount : 0 ,
101121 } ;
102122
103123 if ( ! session ?. snapshot ) {
104- return {
105- ...evidence ,
106- overlayRefSource : 'unavailable' ,
107- overlayRefCount : 0 ,
108- } ;
124+ return evidence ;
109125 }
110126
111127 try {
@@ -129,17 +145,20 @@ async function annotateAndroidSnapshotTimeoutEvidence(
129145 } ) ;
130146 return {
131147 ...evidence ,
148+ overlayRefSource : 'session-snapshot' ,
132149 overlayAnnotationError : normalized . message ,
133150 } ;
134151 }
135152}
136153
137154function resolveCapturedScreenshotPath ( data : unknown , fallbackPath : string ) : string {
138- return typeof data === 'object' &&
139- data !== null &&
140- typeof ( data as Record < string , unknown > ) . path === 'string'
141- ? ( ( data as Record < string , unknown > ) . path as string )
142- : fallbackPath ;
155+ return hasStringPath ( data ) ? data . path : fallbackPath ;
156+ }
157+
158+ function hasStringPath ( value : unknown ) : value is { path : string } {
159+ return (
160+ typeof value === 'object' && value !== null && 'path' in value && typeof value . path === 'string'
161+ ) ;
143162}
144163
145164function isAndroidSnapshotTimeoutError ( error : unknown ) : boolean {
0 commit comments