autokap 1.0.0
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.
- package/assets/chrome/ios-statusbar-comparison-reference.jpg +0 -0
- package/assets/chrome/ios-statusbar-dark-reference.jpg +0 -0
- package/assets/chrome/ios-statusbar-light-reference.jpg +0 -0
- package/assets/devices/ipad-pro-11-m4.json +52 -0
- package/assets/devices/iphone-16-pro.json +53 -0
- package/assets/devices/macbook-air-13.json +45 -0
- package/assets/frames/MacBook Air 13.svg +242 -0
- package/assets/frames/Status bar - iPhone.png +0 -0
- Menu bar- iPad.png +0 -0
- package/assets/frames/iPad Pro M4 11_.png +0 -0
- package/assets/frames/iPhone 16 Pro.png +0 -0
- package/assets/icons/Cellular Connection.svg +3 -0
- package/assets/icons/Union.svg +6 -0
- package/assets/icons/Wifi.svg +3 -0
- package/assets/icons/battery.svg +5 -0
- package/assets/icons/battery_charging.svg +8 -0
- package/assets/skill/SKILL.md +575 -0
- package/dist/abort.d.ts +5 -0
- package/dist/abort.js +44 -0
- package/dist/agent.d.ts +142 -0
- package/dist/agent.js +4504 -0
- package/dist/browser-bar.d.ts +40 -0
- package/dist/browser-bar.js +147 -0
- package/dist/browser-pool.d.ts +34 -0
- package/dist/browser-pool.js +122 -0
- package/dist/browser.d.ts +279 -0
- package/dist/browser.js +2902 -0
- package/dist/cli-utils.d.ts +25 -0
- package/dist/cli-utils.js +80 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +365 -0
- package/dist/clip-orchestrator.d.ts +148 -0
- package/dist/clip-orchestrator.js +950 -0
- package/dist/clip-postprocess.d.ts +42 -0
- package/dist/clip-postprocess.js +192 -0
- package/dist/cookie-dismiss.d.ts +5 -0
- package/dist/cookie-dismiss.js +172 -0
- package/dist/credential-templates.d.ts +5 -0
- package/dist/credential-templates.js +60 -0
- package/dist/element-capture.d.ts +53 -0
- package/dist/element-capture.js +766 -0
- package/dist/hybrid-navigator.d.ts +138 -0
- package/dist/hybrid-navigator.js +468 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +11 -0
- package/dist/llm-usage.d.ts +17 -0
- package/dist/llm-usage.js +45 -0
- package/dist/logger.d.ts +46 -0
- package/dist/logger.js +79 -0
- package/dist/mockup-html.d.ts +119 -0
- package/dist/mockup-html.js +253 -0
- package/dist/mockup.d.ts +94 -0
- package/dist/mockup.js +604 -0
- package/dist/mouse-animation.d.ts +46 -0
- package/dist/mouse-animation.js +100 -0
- package/dist/overlay-utils.d.ts +14 -0
- package/dist/overlay-utils.js +13 -0
- package/dist/posthog.d.ts +4 -0
- package/dist/posthog.js +26 -0
- package/dist/prompt-cache.d.ts +10 -0
- package/dist/prompt-cache.js +24 -0
- package/dist/prompts.d.ts +167 -0
- package/dist/prompts.js +1165 -0
- package/dist/security.d.ts +20 -0
- package/dist/security.js +569 -0
- package/dist/session-profile.d.ts +86 -0
- package/dist/session-profile.js +1471 -0
- package/dist/sf-pro-fonts.d.ts +4 -0
- package/dist/sf-pro-fonts.js +7 -0
- package/dist/status-bar-l10n.d.ts +14 -0
- package/dist/status-bar-l10n.js +177 -0
- package/dist/status-bar.d.ts +44 -0
- package/dist/status-bar.js +336 -0
- package/dist/tools.d.ts +4 -0
- package/dist/tools.js +578 -0
- package/dist/types.d.ts +796 -0
- package/dist/types.js +2 -0
- package/dist/video-agent.d.ts +143 -0
- package/dist/video-agent.js +4783 -0
- package/dist/video-observation.d.ts +36 -0
- package/dist/video-observation.js +192 -0
- package/dist/video-planner.d.ts +12 -0
- package/dist/video-planner.js +500 -0
- package/dist/video-prompts.d.ts +37 -0
- package/dist/video-prompts.js +554 -0
- package/dist/video-tools.d.ts +3 -0
- package/dist/video-tools.js +59 -0
- package/dist/video-variant-state.d.ts +29 -0
- package/dist/video-variant-state.js +80 -0
- package/dist/vision-model.d.ts +17 -0
- package/dist/vision-model.js +74 -0
- package/package.json +165 -0
- package/readme.md +61 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,796 @@
|
|
|
1
|
+
import type { BrowserContextOptions } from 'playwright';
|
|
2
|
+
export type BrowserStorageState = Exclude<BrowserContextOptions['storageState'], undefined>;
|
|
3
|
+
export type BrowserSessionStorageState = Record<string, Record<string, string>>;
|
|
4
|
+
export type SessionProfileAuthState = 'authenticated' | 'login_required' | 'unknown';
|
|
5
|
+
export type SessionProfileValidationStatus = 'valid' | 'repaired' | 'invalid' | 'unknown';
|
|
6
|
+
export type SessionProfileSource = 'run_shared_auth' | 'persisted_variant' | 'live_variant_state' | 'sequential_handoff' | 'none';
|
|
7
|
+
export type SessionValidationDiagnosticOutcome = 'match' | 'mismatch' | 'ambiguous';
|
|
8
|
+
export type SessionValidationDiagnosticConfidence = 'low' | 'medium' | 'high';
|
|
9
|
+
export interface SessionValidationDiagnostic {
|
|
10
|
+
outcome: SessionValidationDiagnosticOutcome;
|
|
11
|
+
confidence: SessionValidationDiagnosticConfidence;
|
|
12
|
+
reasons: string[];
|
|
13
|
+
}
|
|
14
|
+
export interface ValidatedSessionProfile {
|
|
15
|
+
storageState?: BrowserStorageState;
|
|
16
|
+
sessionStorage?: BrowserSessionStorageState;
|
|
17
|
+
authState: SessionProfileAuthState;
|
|
18
|
+
accountLabel?: string | null;
|
|
19
|
+
detectedLang?: string | null;
|
|
20
|
+
detectedTheme?: 'light' | 'dark' | null;
|
|
21
|
+
validatedStartUrl?: string | null;
|
|
22
|
+
lastKnownUrl?: string | null;
|
|
23
|
+
summary?: string | null;
|
|
24
|
+
validationStatus: SessionProfileValidationStatus;
|
|
25
|
+
lastUsedAt?: string | null;
|
|
26
|
+
profileVersion?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface AgentRunHint {
|
|
29
|
+
key: string;
|
|
30
|
+
message: string;
|
|
31
|
+
severity: 'high' | 'medium' | 'low';
|
|
32
|
+
source: 'agent_error' | 'session_profile';
|
|
33
|
+
}
|
|
34
|
+
export type CapturePageIdentityKind = 'gallery' | 'modal_selection' | 'modal_configuration' | 'editor_route' | 'detail_route' | 'unknown';
|
|
35
|
+
export interface CapturePageIdentity {
|
|
36
|
+
kind: CapturePageIdentityKind;
|
|
37
|
+
summary: string;
|
|
38
|
+
subjectTokens: string[];
|
|
39
|
+
dialogTarget: boolean;
|
|
40
|
+
dedicatedRoute: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface VariantValidatedCapture {
|
|
43
|
+
pageId: string;
|
|
44
|
+
prompt: string;
|
|
45
|
+
url: string;
|
|
46
|
+
assessment: string;
|
|
47
|
+
fingerprint?: string | null;
|
|
48
|
+
identity?: CapturePageIdentity | null;
|
|
49
|
+
}
|
|
50
|
+
export type VariantCaptureStatus = 'pending' | 'in_progress' | 'completed' | 'blocked';
|
|
51
|
+
export type CaptureRunPhase = 'bootstrap_variant' | 'prepare_variant' | 'reach_capture_state' | 'stabilize' | 'capture' | 'checkpoint' | 'recover' | 'complete';
|
|
52
|
+
export type CaptureObjective = 'capture' | 'repair';
|
|
53
|
+
export type CaptureRepairCause = 'lang' | 'theme' | 'auth' | 'navigation' | 'overlay' | 'readiness';
|
|
54
|
+
export type RepairAuthTarget = 'authenticated' | 'login_screen' | 'neutral';
|
|
55
|
+
export type CaptureActionOrigin = 'main_plan' | 'repair_subplan' | 'deterministic' | 'replay' | 'preflight';
|
|
56
|
+
export interface CaptureCursor {
|
|
57
|
+
variantId: string;
|
|
58
|
+
pageId: string;
|
|
59
|
+
targetId: string;
|
|
60
|
+
phase: CaptureRunPhase;
|
|
61
|
+
resumeFromActionIndex: number;
|
|
62
|
+
lastVerifiedCheckpointId?: string | null;
|
|
63
|
+
resumeUrl?: string | null;
|
|
64
|
+
}
|
|
65
|
+
export interface RepairTicket {
|
|
66
|
+
id: string;
|
|
67
|
+
cause: CaptureRepairCause;
|
|
68
|
+
status: 'pending' | 'in_progress' | 'resolved' | 'failed';
|
|
69
|
+
summary: string;
|
|
70
|
+
cursor: CaptureCursor;
|
|
71
|
+
expectedState: {
|
|
72
|
+
lang?: string | null;
|
|
73
|
+
theme?: 'light' | 'dark' | null;
|
|
74
|
+
authState?: SessionProfileAuthState;
|
|
75
|
+
authTarget?: RepairAuthTarget;
|
|
76
|
+
url?: string | null;
|
|
77
|
+
pageId?: string | null;
|
|
78
|
+
pageIdentity?: CapturePageIdentity | null;
|
|
79
|
+
blockingReason?: string | null;
|
|
80
|
+
};
|
|
81
|
+
retries: {
|
|
82
|
+
deterministicRemaining: number;
|
|
83
|
+
memoryRemaining: number;
|
|
84
|
+
agentRemaining: number;
|
|
85
|
+
};
|
|
86
|
+
attempts: number;
|
|
87
|
+
createdAt: string;
|
|
88
|
+
updatedAt: string;
|
|
89
|
+
}
|
|
90
|
+
export interface CaptureCheckpoint {
|
|
91
|
+
id: string;
|
|
92
|
+
variantId: string;
|
|
93
|
+
pageId: string;
|
|
94
|
+
targetId: string;
|
|
95
|
+
summary: string;
|
|
96
|
+
url?: string | null;
|
|
97
|
+
canonicalUrl?: string | null;
|
|
98
|
+
resumeUrl?: string | null;
|
|
99
|
+
pageIdentity?: CapturePageIdentity | null;
|
|
100
|
+
verifiedAt: string;
|
|
101
|
+
}
|
|
102
|
+
export interface VariantCaptureRepairRecord {
|
|
103
|
+
ticketId: string;
|
|
104
|
+
pageId: string;
|
|
105
|
+
cause: CaptureRepairCause;
|
|
106
|
+
status: 'resolved' | 'failed';
|
|
107
|
+
summary: string;
|
|
108
|
+
checkpointId?: string | null;
|
|
109
|
+
attemptedAt: string;
|
|
110
|
+
}
|
|
111
|
+
export interface CaptureTimelineEvent {
|
|
112
|
+
type: 'phase_transition' | 'repair_started' | 'repair_resolved' | 'repair_failed' | 'memory_hit' | 'memory_stale' | 'checkpoint_saved' | 'capture_completed' | 'capture_blocked';
|
|
113
|
+
timestamp: number;
|
|
114
|
+
variantId: string;
|
|
115
|
+
pageId?: string;
|
|
116
|
+
targetId?: string;
|
|
117
|
+
phase?: CaptureRunPhase;
|
|
118
|
+
objective?: CaptureObjective;
|
|
119
|
+
message: string;
|
|
120
|
+
repairTicketId?: string;
|
|
121
|
+
cause?: CaptureRepairCause;
|
|
122
|
+
checkpointId?: string;
|
|
123
|
+
metadata?: Record<string, string | number | boolean | null>;
|
|
124
|
+
}
|
|
125
|
+
export interface CaptureRunState {
|
|
126
|
+
variantId: string;
|
|
127
|
+
phase: CaptureRunPhase;
|
|
128
|
+
objective: CaptureObjective;
|
|
129
|
+
cursor: CaptureCursor;
|
|
130
|
+
activeRepairTicket?: RepairTicket | null;
|
|
131
|
+
checkpoints: CaptureCheckpoint[];
|
|
132
|
+
timeline: CaptureTimelineEvent[];
|
|
133
|
+
}
|
|
134
|
+
export interface VariantCaptureManifest {
|
|
135
|
+
expectedPageIds: string[];
|
|
136
|
+
currentPageId?: string | null;
|
|
137
|
+
currentPageIdentity?: CapturePageIdentity | null;
|
|
138
|
+
completedPages: string[];
|
|
139
|
+
remainingPages: string[];
|
|
140
|
+
previousValidatedCaptures: VariantValidatedCapture[];
|
|
141
|
+
captureStatuses?: Record<string, VariantCaptureStatus>;
|
|
142
|
+
lastCheckpointId?: string | null;
|
|
143
|
+
blockedReason?: string | null;
|
|
144
|
+
recoveryAttempts?: Record<string, number>;
|
|
145
|
+
repairHistory?: VariantCaptureRepairRecord[];
|
|
146
|
+
}
|
|
147
|
+
export interface CaptureHandoffContext {
|
|
148
|
+
previousPageId?: string | null;
|
|
149
|
+
previousPrompt?: string;
|
|
150
|
+
currentUrl: string;
|
|
151
|
+
pageTitle?: string | null;
|
|
152
|
+
authState: SessionProfileAuthState;
|
|
153
|
+
accountLabel?: string | null;
|
|
154
|
+
currentLang?: string | null;
|
|
155
|
+
currentTheme?: 'light' | 'dark' | null;
|
|
156
|
+
summary: string;
|
|
157
|
+
selectorHints?: string[];
|
|
158
|
+
navigationHints?: string[];
|
|
159
|
+
selectorMemory?: Record<string, string[]>;
|
|
160
|
+
}
|
|
161
|
+
export interface BrowserOptions {
|
|
162
|
+
headed: boolean;
|
|
163
|
+
viewport: {
|
|
164
|
+
width: number;
|
|
165
|
+
height: number;
|
|
166
|
+
};
|
|
167
|
+
/** Emulated device pixel ratio (CSS px -> physical px). */
|
|
168
|
+
deviceScaleFactor?: number;
|
|
169
|
+
/** BCP-47 language tag (e.g. "fr", "fr-FR"). Sets browser locale and Accept-Language. */
|
|
170
|
+
lang?: string;
|
|
171
|
+
/** Color scheme for the browser context. */
|
|
172
|
+
colorScheme?: 'light' | 'dark';
|
|
173
|
+
/** Optional persisted cookies/localStorage captured during preparation. */
|
|
174
|
+
storageState?: BrowserStorageState;
|
|
175
|
+
}
|
|
176
|
+
export interface OutscaleConfig {
|
|
177
|
+
/** Uniform padding on all 4 sides (pixels). */
|
|
178
|
+
padding?: number;
|
|
179
|
+
/** Per-side overrides (pixels). Take priority over padding. */
|
|
180
|
+
paddingTop?: number;
|
|
181
|
+
paddingRight?: number;
|
|
182
|
+
paddingBottom?: number;
|
|
183
|
+
paddingLeft?: number;
|
|
184
|
+
/** Percentage-based padding relative to element dimensions (0–100). */
|
|
185
|
+
paddingPercent?: number;
|
|
186
|
+
/** Clamp the capture zone to document bounds. Default: true. */
|
|
187
|
+
clampToViewport?: boolean;
|
|
188
|
+
/** Background fill color when capture zone exceeds rendered content. Default: transparent. */
|
|
189
|
+
backgroundColor?: string;
|
|
190
|
+
}
|
|
191
|
+
export interface IsolatedElement {
|
|
192
|
+
name: string;
|
|
193
|
+
description: string;
|
|
194
|
+
/**
|
|
195
|
+
* Optional source page id. When provided, isolated element capture is performed
|
|
196
|
+
* from that validated named page instead of the variant's final page.
|
|
197
|
+
*/
|
|
198
|
+
sourcePageId?: string;
|
|
199
|
+
/** @deprecated Use outscale.padding instead. Kept for backward compatibility. */
|
|
200
|
+
padding?: number;
|
|
201
|
+
outscale?: OutscaleConfig;
|
|
202
|
+
}
|
|
203
|
+
export type VideoStepType = 'navigate' | 'dismiss_overlays' | 'click' | 'type' | 'select_option' | 'scroll' | 'wait' | 'hover' | 'drag' | 'key' | 'highlight' | 'assert_url' | 'assert_text' | 'assert_element' | 'assert_page';
|
|
204
|
+
export type VideoAssertMatchMode = 'equals' | 'contains' | 'regex';
|
|
205
|
+
export type VideoAssertElementState = 'visible' | 'attached';
|
|
206
|
+
export type VideoRecordingIntent = 'visible' | 'prepare_only';
|
|
207
|
+
export type VideoTargetLabelMatchMode = 'exact' | 'contains' | 'token_overlap';
|
|
208
|
+
export interface VideoPageExpectation {
|
|
209
|
+
urlPatterns?: string[];
|
|
210
|
+
titlePatterns?: string[];
|
|
211
|
+
textPatterns?: string[];
|
|
212
|
+
navPatterns?: string[];
|
|
213
|
+
breadcrumbPatterns?: string[];
|
|
214
|
+
selectors?: string[];
|
|
215
|
+
locale?: string;
|
|
216
|
+
theme?: 'light' | 'dark';
|
|
217
|
+
pageIdentity?: CapturePageIdentity | null;
|
|
218
|
+
minConfidence?: number;
|
|
219
|
+
}
|
|
220
|
+
export interface VideoStepTarget {
|
|
221
|
+
selector?: string;
|
|
222
|
+
selectorAlternates?: string[];
|
|
223
|
+
href?: string;
|
|
224
|
+
label?: string;
|
|
225
|
+
labelMatchMode?: VideoTargetLabelMatchMode;
|
|
226
|
+
tag?: string;
|
|
227
|
+
role?: string;
|
|
228
|
+
containerLabel?: string;
|
|
229
|
+
containerSelector?: string;
|
|
230
|
+
coordinates?: {
|
|
231
|
+
x: number;
|
|
232
|
+
y: number;
|
|
233
|
+
};
|
|
234
|
+
/**
|
|
235
|
+
* Snapshot-scoped index hint. Only reliable when paired with the originating coherence key.
|
|
236
|
+
* It must never be treated as a stable persisted selector by itself.
|
|
237
|
+
*/
|
|
238
|
+
index?: number;
|
|
239
|
+
coherenceKey?: string;
|
|
240
|
+
}
|
|
241
|
+
export interface VideoObservationSnapshot {
|
|
242
|
+
coherenceKey?: string;
|
|
243
|
+
interactiveElements: InteractiveElement[];
|
|
244
|
+
pageSignals: VideoPageSignals;
|
|
245
|
+
pageIdentity?: CapturePageIdentity | null;
|
|
246
|
+
}
|
|
247
|
+
export interface VideoVariantOption {
|
|
248
|
+
label: string;
|
|
249
|
+
value?: string | null;
|
|
250
|
+
selected?: boolean;
|
|
251
|
+
}
|
|
252
|
+
export interface VideoVariantControl {
|
|
253
|
+
kind: 'locale' | 'theme' | 'unknown';
|
|
254
|
+
mechanism: 'select' | 'button' | 'link' | 'toggle' | 'menuitem' | 'radio' | 'custom';
|
|
255
|
+
selector: string;
|
|
256
|
+
label: string;
|
|
257
|
+
value?: string | null;
|
|
258
|
+
href?: string | null;
|
|
259
|
+
tag: string;
|
|
260
|
+
role: string;
|
|
261
|
+
options?: VideoVariantOption[];
|
|
262
|
+
}
|
|
263
|
+
export interface VideoStorageHint {
|
|
264
|
+
storage: 'localStorage' | 'sessionStorage';
|
|
265
|
+
key: string;
|
|
266
|
+
kind: 'locale' | 'theme' | 'unknown';
|
|
267
|
+
valueSample: string;
|
|
268
|
+
}
|
|
269
|
+
export interface VideoChromeThemeSample {
|
|
270
|
+
area: 'body' | 'header' | 'nav' | 'aside' | 'toolbar';
|
|
271
|
+
selector: string;
|
|
272
|
+
background: string | null;
|
|
273
|
+
color: string | null;
|
|
274
|
+
luminance: number | null;
|
|
275
|
+
}
|
|
276
|
+
export interface VideoAuthHints {
|
|
277
|
+
hasPasswordField: boolean;
|
|
278
|
+
hasEmailField: boolean;
|
|
279
|
+
hasAuthForm: boolean;
|
|
280
|
+
loginButtons: string[];
|
|
281
|
+
logoutButtons: string[];
|
|
282
|
+
accountMenuLabels: string[];
|
|
283
|
+
accountLikeText: string[];
|
|
284
|
+
}
|
|
285
|
+
export interface VideoPageSignals {
|
|
286
|
+
url: string;
|
|
287
|
+
title: string;
|
|
288
|
+
htmlLang: string | null;
|
|
289
|
+
canonicalUrl: string | null;
|
|
290
|
+
hreflangs: string[];
|
|
291
|
+
headings: string[];
|
|
292
|
+
navLabels: string[];
|
|
293
|
+
breadcrumbLabels: string[];
|
|
294
|
+
visibleText: string;
|
|
295
|
+
localeHints: string[];
|
|
296
|
+
detectedTheme: 'light' | 'dark' | null;
|
|
297
|
+
preferredColorScheme: 'light' | 'dark';
|
|
298
|
+
themeRootHints?: string[];
|
|
299
|
+
chromeThemeSamples?: VideoChromeThemeSample[];
|
|
300
|
+
authHints?: VideoAuthHints;
|
|
301
|
+
variantControls: VideoVariantControl[];
|
|
302
|
+
storageHints: VideoStorageHint[];
|
|
303
|
+
}
|
|
304
|
+
export type VideoStepStrategy = 'primary' | 'wait_short' | 'scroll_target' | 'selector_fallback' | 'retry';
|
|
305
|
+
export interface VideoStepAttemptTrace {
|
|
306
|
+
stepId: string;
|
|
307
|
+
stepIndex: number;
|
|
308
|
+
attemptIndex: number;
|
|
309
|
+
strategy: VideoStepStrategy;
|
|
310
|
+
selector?: string;
|
|
311
|
+
resolvedTargetSummary?: string;
|
|
312
|
+
success: boolean;
|
|
313
|
+
reason?: string;
|
|
314
|
+
}
|
|
315
|
+
export interface VideoStepArtifact {
|
|
316
|
+
runId?: string;
|
|
317
|
+
variantId?: string;
|
|
318
|
+
stepId: string;
|
|
319
|
+
stepIndex: number;
|
|
320
|
+
attemptIndex: number;
|
|
321
|
+
phase: 'dry_run' | 'recording';
|
|
322
|
+
strategy: VideoStepStrategy;
|
|
323
|
+
urlBefore: string;
|
|
324
|
+
urlAfter: string;
|
|
325
|
+
selectorUsed?: string;
|
|
326
|
+
resolvedTargetSummary?: string;
|
|
327
|
+
reason?: string;
|
|
328
|
+
beforeScreenshot?: Buffer;
|
|
329
|
+
afterScreenshot?: Buffer;
|
|
330
|
+
}
|
|
331
|
+
export interface VideoSelectorMemoryUpdate {
|
|
332
|
+
stepSignature: string;
|
|
333
|
+
selector: string;
|
|
334
|
+
target?: VideoStepTarget;
|
|
335
|
+
source: 'deterministic' | 'llm_fix' | 'manual';
|
|
336
|
+
success: boolean;
|
|
337
|
+
}
|
|
338
|
+
export type VideoDebugArtifactsMode = 'off' | 'failed_only' | 'all_dry_run';
|
|
339
|
+
export type VideoCursorTheme = 'minimal' | 'macos' | 'windows';
|
|
340
|
+
export interface VideoRunOptions {
|
|
341
|
+
enableMp4?: boolean;
|
|
342
|
+
burnedMockup?: boolean;
|
|
343
|
+
debugArtifacts?: VideoDebugArtifactsMode;
|
|
344
|
+
cursorTheme?: VideoCursorTheme;
|
|
345
|
+
preflightRequired?: boolean;
|
|
346
|
+
}
|
|
347
|
+
export interface VideoStep {
|
|
348
|
+
id: string;
|
|
349
|
+
type: VideoStepType;
|
|
350
|
+
description: string;
|
|
351
|
+
recordingIntent?: VideoRecordingIntent;
|
|
352
|
+
url?: string;
|
|
353
|
+
urlPattern?: string;
|
|
354
|
+
target?: VideoStepTarget;
|
|
355
|
+
selector?: string;
|
|
356
|
+
scopeSelector?: string;
|
|
357
|
+
coordinates?: {
|
|
358
|
+
x: number;
|
|
359
|
+
y: number;
|
|
360
|
+
};
|
|
361
|
+
toTarget?: VideoStepTarget;
|
|
362
|
+
toSelector?: string;
|
|
363
|
+
toCoordinates?: {
|
|
364
|
+
x: number;
|
|
365
|
+
y: number;
|
|
366
|
+
};
|
|
367
|
+
text?: string;
|
|
368
|
+
optionLabel?: string;
|
|
369
|
+
optionValue?: string;
|
|
370
|
+
optionIndex?: number;
|
|
371
|
+
matchMode?: VideoAssertMatchMode;
|
|
372
|
+
state?: VideoAssertElementState;
|
|
373
|
+
direction?: 'up' | 'down' | 'left' | 'right';
|
|
374
|
+
amount?: number;
|
|
375
|
+
key?: string;
|
|
376
|
+
/** Optional drag animation duration */
|
|
377
|
+
durationMs?: number;
|
|
378
|
+
/** Timeout for assertion steps */
|
|
379
|
+
timeoutMs?: number;
|
|
380
|
+
/** Multi-signal page verification for robust route/locale/state checks. */
|
|
381
|
+
pageExpectation?: VideoPageExpectation;
|
|
382
|
+
/** Runtime post-condition for actions that must land on a specific page/state. */
|
|
383
|
+
expectedPageAfter?: VideoPageExpectation;
|
|
384
|
+
/** Milliseconds to wait before executing this step */
|
|
385
|
+
waitMs?: number;
|
|
386
|
+
/** Milliseconds to pause after executing this step (for pacing in recording) */
|
|
387
|
+
postStepWaitMs?: number;
|
|
388
|
+
}
|
|
389
|
+
export interface VideoPlan {
|
|
390
|
+
title: string;
|
|
391
|
+
estimatedDurationSec: number;
|
|
392
|
+
steps: VideoStep[];
|
|
393
|
+
startUrl: string;
|
|
394
|
+
}
|
|
395
|
+
export type VideoPhase = 'planning' | 'dry_run' | 'recording' | 'done' | 'failed';
|
|
396
|
+
export interface VideoAgentConfig {
|
|
397
|
+
url: string;
|
|
398
|
+
script: string;
|
|
399
|
+
viewport: {
|
|
400
|
+
width: number;
|
|
401
|
+
height: number;
|
|
402
|
+
};
|
|
403
|
+
/** Emulated device pixel ratio for this variant recording/capture. */
|
|
404
|
+
outputScale?: number;
|
|
405
|
+
model: string;
|
|
406
|
+
apiKey: string;
|
|
407
|
+
/** Pipeline mode. 'clip' constrains the planner to micro-interactions (1-4 steps). */
|
|
408
|
+
mode?: 'video' | 'clip';
|
|
409
|
+
runId?: string;
|
|
410
|
+
variantId?: string;
|
|
411
|
+
projectId?: string;
|
|
412
|
+
presetId?: string;
|
|
413
|
+
theme?: 'light' | 'dark';
|
|
414
|
+
lang?: string;
|
|
415
|
+
langInstructions?: string;
|
|
416
|
+
themeInstructions?: string;
|
|
417
|
+
navigationInstructions?: string;
|
|
418
|
+
credentials?: LoginCredentials;
|
|
419
|
+
maxPlanRetries?: number;
|
|
420
|
+
maxStepRetries?: number;
|
|
421
|
+
selectorMemory?: Record<string, string[]>;
|
|
422
|
+
targetMemory?: Record<string, VideoStepTarget[]>;
|
|
423
|
+
preparedStartUrl?: string;
|
|
424
|
+
preparedStorageState?: BrowserStorageState;
|
|
425
|
+
preparedSessionStorage?: BrowserSessionStorageState;
|
|
426
|
+
preparedObservationSummary?: string;
|
|
427
|
+
preparedObservationSnapshot?: VideoObservationSnapshot;
|
|
428
|
+
preparedActions?: ExecutedAction[];
|
|
429
|
+
preparedReplayActions?: ExecutedAction[];
|
|
430
|
+
preparedCoherenceKey?: string;
|
|
431
|
+
videoOptions?: VideoRunOptions;
|
|
432
|
+
/** Send a page screenshot to the planner LLM for visual grounding. Off by default. */
|
|
433
|
+
enablePlannerVision?: boolean;
|
|
434
|
+
analyticsId?: string;
|
|
435
|
+
/** Internal phase budget propagated by the clip orchestrator. */
|
|
436
|
+
internalPhaseTimeoutMs?: number;
|
|
437
|
+
internalPhaseStartedAt?: number;
|
|
438
|
+
abortSignal?: AbortSignal;
|
|
439
|
+
/** Fallback model used when the primary model fails to produce tool calls (e.g. in repair lane). */
|
|
440
|
+
fallbackModel?: string;
|
|
441
|
+
/** When true, the recording phase skips confirmPreparedVariantState because the dry-run already confirmed it. */
|
|
442
|
+
dryRunVariantConfirmed?: boolean;
|
|
443
|
+
}
|
|
444
|
+
export interface VideoAgentResult {
|
|
445
|
+
success: boolean;
|
|
446
|
+
plan: VideoPlan | null;
|
|
447
|
+
videoPath: string | null;
|
|
448
|
+
thumbnailBuffer: Buffer | null;
|
|
449
|
+
durationMs: number;
|
|
450
|
+
stepsExecuted: number;
|
|
451
|
+
assessment: string;
|
|
452
|
+
usage: StepUsage[];
|
|
453
|
+
}
|
|
454
|
+
export interface ClipDefinition {
|
|
455
|
+
/** Unique slug — identifies this clip in results and storage */
|
|
456
|
+
id: string;
|
|
457
|
+
/** Display name shown in the UI */
|
|
458
|
+
name: string;
|
|
459
|
+
/**
|
|
460
|
+
* Natural-language description of the interaction to capture (the recording part).
|
|
461
|
+
* When `navigationScript` is also provided, this field describes ONLY what should
|
|
462
|
+
* be recorded — not how to get there.
|
|
463
|
+
* When `navigationScript` is omitted, this field is used for both navigation and recording
|
|
464
|
+
* (legacy behavior).
|
|
465
|
+
*/
|
|
466
|
+
script: string;
|
|
467
|
+
/**
|
|
468
|
+
* Optional per-clip navigation instructions: describes WHERE to navigate before recording.
|
|
469
|
+
* Examples: "Navigate to the Acme Inc project Presets page", "Open the Settings tab".
|
|
470
|
+
*
|
|
471
|
+
* When provided, the navigation agent uses this to reach the correct page/state,
|
|
472
|
+
* and `script` is used exclusively for planning the recorded interaction.
|
|
473
|
+
* This separation eliminates ambiguity about what is navigation vs what is the recording.
|
|
474
|
+
*/
|
|
475
|
+
navigationScript?: string;
|
|
476
|
+
/** Optional URL override — only needed when this clip starts at a different URL than the preset root */
|
|
477
|
+
url?: string;
|
|
478
|
+
/** Seconds to freeze the last frame before the GIF loops. 0–10. Default: 0. */
|
|
479
|
+
holdLastFrameSec?: number;
|
|
480
|
+
}
|
|
481
|
+
export interface ClipOptions {
|
|
482
|
+
/** Preferred delivery format. Studio still persists MP4 alongside GIF for editing/playback. */
|
|
483
|
+
format?: 'gif' | 'mp4' | 'both';
|
|
484
|
+
/** Max duration in seconds. Default: 8. Clips are trimmed if they exceed this. */
|
|
485
|
+
maxDurationSec?: number;
|
|
486
|
+
/** GIF framerate. Default: 15. Lower = smaller file, less smooth. */
|
|
487
|
+
gifFps?: number;
|
|
488
|
+
/** GIF max width in pixels. Default: 800. Downscaled from capture resolution for file size. */
|
|
489
|
+
gifMaxWidth?: number;
|
|
490
|
+
/** Enable cursor animation in clips. Default: true. */
|
|
491
|
+
showCursor?: boolean;
|
|
492
|
+
/** Cursor style. Default: 'minimal'. */
|
|
493
|
+
cursorTheme?: VideoCursorTheme;
|
|
494
|
+
/** Whether to loop GIF output. Default: true. */
|
|
495
|
+
loop?: boolean;
|
|
496
|
+
/** Add padding frames at start/end for smoother loop. Default: true. */
|
|
497
|
+
loopPadding?: boolean;
|
|
498
|
+
/** Seconds to freeze the last frame before the GIF loops. 0–10. Default: 0. */
|
|
499
|
+
holdLastFrameSec?: number;
|
|
500
|
+
/** Seconds to trim from the start of the recording (setup phase). Auto-calculated. */
|
|
501
|
+
trimStartSec?: number;
|
|
502
|
+
}
|
|
503
|
+
/** Usage metadata from a single OpenRouter API call */
|
|
504
|
+
export interface StepUsage {
|
|
505
|
+
stepNumber: number;
|
|
506
|
+
stepType: 'agent_iteration' | 'verification' | 'element_capture' | 'video_planning' | 'video_variant_classification' | 'video_step_verification' | 'video_step_fix' | 'assistant_chat' | 'mock_data_generation' | 'page_identity_classification';
|
|
507
|
+
generationId: string | null;
|
|
508
|
+
modelRequested: string;
|
|
509
|
+
modelUsed: string | null;
|
|
510
|
+
promptTokens: number | null;
|
|
511
|
+
completionTokens: number | null;
|
|
512
|
+
totalTokens: number | null;
|
|
513
|
+
imagesInPrompt: number;
|
|
514
|
+
/** Prompt composition telemetry (optional, for cost optimization tracking) */
|
|
515
|
+
systemPromptChars?: number;
|
|
516
|
+
toolSchemaChars?: number;
|
|
517
|
+
userPayloadChars?: number;
|
|
518
|
+
accessibilityChars?: number;
|
|
519
|
+
interactiveElementCount?: number;
|
|
520
|
+
actionHistoryCount?: number;
|
|
521
|
+
elementsChars?: number;
|
|
522
|
+
sessionSummaryChars?: number;
|
|
523
|
+
selectorMemoryChars?: number;
|
|
524
|
+
agentContextChars?: number;
|
|
525
|
+
profileValidationStatus?: SessionProfileValidationStatus;
|
|
526
|
+
sessionProfileSource?: SessionProfileSource;
|
|
527
|
+
repairPathUsed?: string | null;
|
|
528
|
+
evaluatorUsed?: boolean;
|
|
529
|
+
cacheReadTokens?: number | null;
|
|
530
|
+
cacheWriteTokens?: number | null;
|
|
531
|
+
reasoningTokens?: number | null;
|
|
532
|
+
sessionProfileReused?: boolean;
|
|
533
|
+
actionReplayUsed?: boolean;
|
|
534
|
+
}
|
|
535
|
+
export interface VerificationResult {
|
|
536
|
+
verified: boolean;
|
|
537
|
+
reason?: string;
|
|
538
|
+
usage: StepUsage | null;
|
|
539
|
+
fatal?: boolean;
|
|
540
|
+
matchedPageId?: string | null;
|
|
541
|
+
duplicateOfPageId?: string | null;
|
|
542
|
+
blockingReason?: string;
|
|
543
|
+
pageFingerprint?: string | null;
|
|
544
|
+
mode?: 'deterministic' | 'vision' | 'text_fallback' | 'bailout';
|
|
545
|
+
}
|
|
546
|
+
export interface SelectorValidationResult {
|
|
547
|
+
matchCount: number;
|
|
548
|
+
boundingBox: {
|
|
549
|
+
x: number;
|
|
550
|
+
y: number;
|
|
551
|
+
width: number;
|
|
552
|
+
height: number;
|
|
553
|
+
} | null;
|
|
554
|
+
visible: boolean;
|
|
555
|
+
error?: 'no_match' | 'ambiguous' | 'invisible' | 'zero_size';
|
|
556
|
+
errorMessage?: string;
|
|
557
|
+
}
|
|
558
|
+
export interface ElementCaptureResult {
|
|
559
|
+
element: IsolatedElement;
|
|
560
|
+
success: boolean;
|
|
561
|
+
buffer: Buffer;
|
|
562
|
+
assessment: string;
|
|
563
|
+
matchedIndex?: number;
|
|
564
|
+
confidence?: number;
|
|
565
|
+
capturedRegion?: {
|
|
566
|
+
x: number;
|
|
567
|
+
y: number;
|
|
568
|
+
width: number;
|
|
569
|
+
height: number;
|
|
570
|
+
};
|
|
571
|
+
capturedSelector?: string;
|
|
572
|
+
validation?: SelectorValidationResult;
|
|
573
|
+
usage: StepUsage[];
|
|
574
|
+
}
|
|
575
|
+
export interface LoginCredentials {
|
|
576
|
+
loginUrl?: string;
|
|
577
|
+
email?: string;
|
|
578
|
+
password?: string;
|
|
579
|
+
}
|
|
580
|
+
export interface ObservedRequest {
|
|
581
|
+
url: string;
|
|
582
|
+
method: string;
|
|
583
|
+
status: number;
|
|
584
|
+
responseBody: unknown;
|
|
585
|
+
}
|
|
586
|
+
export interface ResolvedMock {
|
|
587
|
+
urlPattern: string;
|
|
588
|
+
method?: string;
|
|
589
|
+
status: number;
|
|
590
|
+
contentType: string;
|
|
591
|
+
responseBody: unknown;
|
|
592
|
+
}
|
|
593
|
+
export interface AgentContextEntry {
|
|
594
|
+
error_type: string;
|
|
595
|
+
message: string;
|
|
596
|
+
user_response: string | null;
|
|
597
|
+
created_at: string;
|
|
598
|
+
}
|
|
599
|
+
export interface AgentConfig {
|
|
600
|
+
url: string;
|
|
601
|
+
prompt: string;
|
|
602
|
+
dark: boolean;
|
|
603
|
+
langs: string[];
|
|
604
|
+
outputDir: string;
|
|
605
|
+
headed: boolean;
|
|
606
|
+
viewport: {
|
|
607
|
+
width: number;
|
|
608
|
+
height: number;
|
|
609
|
+
};
|
|
610
|
+
maxIterations: number;
|
|
611
|
+
model: string;
|
|
612
|
+
fallbackModel?: string;
|
|
613
|
+
/**
|
|
614
|
+
* Optional dedicated vision model for screenshot analysis (dual-model architecture).
|
|
615
|
+
* When set, screenshots are analyzed by this cheap vision model, and the main model
|
|
616
|
+
* receives only text observations — eliminating image tokens from the main context.
|
|
617
|
+
*/
|
|
618
|
+
visionModel?: string;
|
|
619
|
+
/** OpenRouter provider routing preferences per model ID. Looked up by model at call time. */
|
|
620
|
+
providerPreferences?: Record<string, {
|
|
621
|
+
order?: string[];
|
|
622
|
+
require?: string[];
|
|
623
|
+
disallow?: string[];
|
|
624
|
+
}>;
|
|
625
|
+
credentials?: LoginCredentials;
|
|
626
|
+
langInstructions?: string;
|
|
627
|
+
themeInstructions?: string;
|
|
628
|
+
currentLang?: string;
|
|
629
|
+
currentTheme?: 'light' | 'dark';
|
|
630
|
+
viewports?: Array<{
|
|
631
|
+
width: number;
|
|
632
|
+
height: number;
|
|
633
|
+
}>;
|
|
634
|
+
/** Language for the agent's reasoning/thinking output (e.g. "fr", "en") */
|
|
635
|
+
reasoningLocale?: string;
|
|
636
|
+
/** OpenRouter reasoning effort for compatible models (e.g. Grok). "off" disables. Default: "medium". */
|
|
637
|
+
reasoningEffort?: 'low' | 'medium' | 'high' | 'off';
|
|
638
|
+
/** Past errors and user corrections, compressed into actionable hints. */
|
|
639
|
+
runHints?: AgentRunHint[];
|
|
640
|
+
/** Known selectors from previous successful runs, keyed by step signature */
|
|
641
|
+
selectorMemory?: Record<string, string[]>;
|
|
642
|
+
/** Validated persisted browser session/profile for this run, if available. */
|
|
643
|
+
sessionProfile?: ValidatedSessionProfile;
|
|
644
|
+
/** Live browser state carried over from the previous capture in the same run. */
|
|
645
|
+
handoffContext?: CaptureHandoffContext;
|
|
646
|
+
/** Multi-page manifest for the current variant/page. */
|
|
647
|
+
variantManifest?: VariantCaptureManifest;
|
|
648
|
+
/** Internal run mode that tunes verification and replay behavior. */
|
|
649
|
+
runMode?: 'capture' | 'language_preflight' | 'repair' | 'video_navigation_preflight';
|
|
650
|
+
/** Explicit runtime objective for the current agent loop. */
|
|
651
|
+
currentObjective?: CaptureObjective;
|
|
652
|
+
/** Current backend-owned cursor for the capture pipeline. */
|
|
653
|
+
captureCursor?: CaptureCursor;
|
|
654
|
+
/** Active repair ticket when the agent is running as a focused repair sub-plan. */
|
|
655
|
+
activeRepairTicket?: RepairTicket | null;
|
|
656
|
+
/** Remaining canonical capture queue, ordered and non-reorderable. */
|
|
657
|
+
remainingCaptureQueue?: string[];
|
|
658
|
+
/** Internal kill switches for rollout/debugging. */
|
|
659
|
+
enableDeterministicRecovery?: boolean;
|
|
660
|
+
enableRecoveryEvaluator?: boolean;
|
|
661
|
+
enableSalienceCompression?: boolean;
|
|
662
|
+
/** Reference from variant 1's successful capture — used to guide subsequent variants
|
|
663
|
+
* when cross-variant replay fails, so the LLM knows exactly what state to replicate. */
|
|
664
|
+
variantReference?: {
|
|
665
|
+
finalUrl: string;
|
|
666
|
+
assessment: string;
|
|
667
|
+
pageTitle: string;
|
|
668
|
+
/** Full action sequence from variant 1 — enables smarter cross-variant replay. */
|
|
669
|
+
actions?: ExecutedAction[];
|
|
670
|
+
};
|
|
671
|
+
/** Isolated elements to capture after the page is ready */
|
|
672
|
+
elements?: IsolatedElement[];
|
|
673
|
+
/** Analytics distinct ID to use for PostHog events (overrides the default machine-based ID) */
|
|
674
|
+
analyticsId?: string;
|
|
675
|
+
abortSignal?: AbortSignal;
|
|
676
|
+
/**
|
|
677
|
+
* Called at each iteration boundary. If the user has requested a pause,
|
|
678
|
+
* this callback awaits until guidance is submitted, then returns the message.
|
|
679
|
+
* Returns null if no pause is pending.
|
|
680
|
+
*/
|
|
681
|
+
guidanceCallback?: () => Promise<string | null>;
|
|
682
|
+
/**
|
|
683
|
+
* Optional callback to upload a screenshot buffer to external storage and return a public URL.
|
|
684
|
+
* When provided, image messages use HTTPS URLs instead of base64 data URIs — improving
|
|
685
|
+
* compatibility with providers (e.g. xAI, Mistral) that reject data URIs.
|
|
686
|
+
* Falls back to base64 if the callback throws.
|
|
687
|
+
*/
|
|
688
|
+
uploadImage?: (buffer: Buffer, mimeType: 'image/jpeg' | 'image/png') => Promise<string>;
|
|
689
|
+
}
|
|
690
|
+
export interface InteractiveElement {
|
|
691
|
+
index: number;
|
|
692
|
+
tag: string;
|
|
693
|
+
role: string;
|
|
694
|
+
text: string;
|
|
695
|
+
ariaLabel: string | null;
|
|
696
|
+
/** HTML title attribute — important for icon buttons that have no visible text. */
|
|
697
|
+
title?: string | null;
|
|
698
|
+
ariaControls?: string | null;
|
|
699
|
+
ariaExpanded?: string | null;
|
|
700
|
+
ariaHasPopup?: string | null;
|
|
701
|
+
href: string | null;
|
|
702
|
+
inputType: string | null;
|
|
703
|
+
boundingBox: {
|
|
704
|
+
x: number;
|
|
705
|
+
y: number;
|
|
706
|
+
width: number;
|
|
707
|
+
height: number;
|
|
708
|
+
} | null;
|
|
709
|
+
selector: string;
|
|
710
|
+
visible: boolean;
|
|
711
|
+
visibilityState: 'full' | 'partial' | 'offscreen';
|
|
712
|
+
}
|
|
713
|
+
export interface PageState {
|
|
714
|
+
cleanScreenshot: Buffer;
|
|
715
|
+
screenshot: Buffer;
|
|
716
|
+
accessibilityTree: string;
|
|
717
|
+
interactiveElements: InteractiveElement[];
|
|
718
|
+
/** Simplified DOM: clean HTML structure without scripts/styles/classes, budget-capped. */
|
|
719
|
+
simplifiedDOM: string;
|
|
720
|
+
scrollInfo: {
|
|
721
|
+
scrollY: number;
|
|
722
|
+
scrollHeight: number;
|
|
723
|
+
viewportHeight: number;
|
|
724
|
+
};
|
|
725
|
+
}
|
|
726
|
+
/** Lightweight page state without screenshots — used when vision is not needed. */
|
|
727
|
+
export interface PageStateLite {
|
|
728
|
+
accessibilityTree: string;
|
|
729
|
+
interactiveElements: InteractiveElement[];
|
|
730
|
+
simplifiedDOM: string;
|
|
731
|
+
scrollInfo: {
|
|
732
|
+
scrollY: number;
|
|
733
|
+
scrollHeight: number;
|
|
734
|
+
viewportHeight: number;
|
|
735
|
+
};
|
|
736
|
+
}
|
|
737
|
+
export type ActionType = 'click' | 'type_text' | 'select_option' | 'scroll' | 'press_key' | 'wait' | 'dismiss_overlays' | 'search_text' | 'resize_viewport' | 'navigate_to' | 'analyze_screenshot' | 'take_screenshot' | 'ready_to_capture' | 'give_up' | 'note' | 'begin_subgoal' | 'capture_by_selector' | 'hover' | 'safe_expand' | 'scroll_to_element';
|
|
738
|
+
export interface ExecutedAction {
|
|
739
|
+
iteration: number;
|
|
740
|
+
action: ActionType;
|
|
741
|
+
params: Record<string, unknown>;
|
|
742
|
+
success: boolean;
|
|
743
|
+
error?: string;
|
|
744
|
+
outcome?: string;
|
|
745
|
+
stateChanged?: boolean;
|
|
746
|
+
origin?: CaptureActionOrigin;
|
|
747
|
+
phase?: CaptureRunPhase;
|
|
748
|
+
checkpointId?: string | null;
|
|
749
|
+
}
|
|
750
|
+
export interface WorkflowScreenshot {
|
|
751
|
+
index: number;
|
|
752
|
+
iteration: number;
|
|
753
|
+
label: string;
|
|
754
|
+
buffer: Buffer;
|
|
755
|
+
path: string | null;
|
|
756
|
+
}
|
|
757
|
+
export interface WorkflowScreenshotEntry {
|
|
758
|
+
index: number;
|
|
759
|
+
iteration: number;
|
|
760
|
+
label: string;
|
|
761
|
+
filename: string;
|
|
762
|
+
}
|
|
763
|
+
export interface DiagnosticState {
|
|
764
|
+
screenshot: Buffer;
|
|
765
|
+
url: string;
|
|
766
|
+
interactiveElements: InteractiveElement[];
|
|
767
|
+
accessibilityTreeSnippet: string;
|
|
768
|
+
giveUpReason: string;
|
|
769
|
+
}
|
|
770
|
+
export interface AgentResult {
|
|
771
|
+
success: boolean;
|
|
772
|
+
screenshotPath: string | null;
|
|
773
|
+
screenshots: WorkflowScreenshot[];
|
|
774
|
+
iterations: number;
|
|
775
|
+
actions: ExecutedAction[];
|
|
776
|
+
assessment: string;
|
|
777
|
+
diagnostic?: DiagnosticState;
|
|
778
|
+
usage: StepUsage[];
|
|
779
|
+
runtimeStrategy?: 'full_llm' | 'action_replay' | 'action_replay_fallback' | 'preverified_handoff';
|
|
780
|
+
deterministicRecoveryUsed?: boolean;
|
|
781
|
+
evaluatorUsed?: boolean;
|
|
782
|
+
verification?: VerificationResult;
|
|
783
|
+
}
|
|
784
|
+
export interface CaptureManifest {
|
|
785
|
+
url: string;
|
|
786
|
+
prompt: string;
|
|
787
|
+
timestamp: string;
|
|
788
|
+
captures: CaptureEntry[];
|
|
789
|
+
}
|
|
790
|
+
export interface CaptureEntry {
|
|
791
|
+
theme: 'light' | 'dark';
|
|
792
|
+
lang: string;
|
|
793
|
+
filename: string;
|
|
794
|
+
screenshots: WorkflowScreenshotEntry[];
|
|
795
|
+
result: AgentResult;
|
|
796
|
+
}
|