Skip to content

Commit cf31953

Browse files
committed
refactor: tighten snapshot timeout evidence payload
1 parent a35861a commit cf31953

1 file changed

Lines changed: 41 additions & 22 deletions

File tree

src/daemon/android-snapshot-timeout-evidence.ts

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,38 @@ import type { DaemonResponse, SessionState } from './types.ts';
55
import { dispatchCommand } from '../core/dispatch.ts';
66
import { emitDiagnostic } from '../utils/diagnostics.ts';
77
import { normalizeError, type NormalizedError } from '../utils/errors.ts';
8+
import type { ScreenshotOverlayRef } from '../utils/snapshot.ts';
89
import { contextFromFlags } from './context.ts';
910
import { 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+
2340
export 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

137154
function 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

145164
function isAndroidSnapshotTimeoutError(error: unknown): boolean {

0 commit comments

Comments
 (0)