@browserflow-ai/exploration 0.0.6
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/dist/adapters/claude-cli.d.ts +57 -0
- package/dist/adapters/claude-cli.d.ts.map +1 -0
- package/dist/adapters/claude-cli.js +195 -0
- package/dist/adapters/claude-cli.js.map +1 -0
- package/dist/adapters/claude.d.ts +54 -0
- package/dist/adapters/claude.d.ts.map +1 -0
- package/dist/adapters/claude.js +160 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/index.d.ts +6 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +4 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/types.d.ts +196 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +3 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/agent-browser-session.d.ts +62 -0
- package/dist/agent-browser-session.d.ts.map +1 -0
- package/dist/agent-browser-session.js +272 -0
- package/dist/agent-browser-session.js.map +1 -0
- package/dist/evidence.d.ts +111 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +144 -0
- package/dist/evidence.js.map +1 -0
- package/dist/explorer.d.ts +180 -0
- package/dist/explorer.d.ts.map +1 -0
- package/dist/explorer.js +393 -0
- package/dist/explorer.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/locator-candidates.d.ts +127 -0
- package/dist/locator-candidates.d.ts.map +1 -0
- package/dist/locator-candidates.js +358 -0
- package/dist/locator-candidates.js.map +1 -0
- package/dist/step-executor.d.ts +99 -0
- package/dist/step-executor.d.ts.map +1 -0
- package/dist/step-executor.js +646 -0
- package/dist/step-executor.js.map +1 -0
- package/package.json +34 -0
- package/src/adapters/claude-cli.test.ts +134 -0
- package/src/adapters/claude-cli.ts +240 -0
- package/src/adapters/claude.test.ts +195 -0
- package/src/adapters/claude.ts +190 -0
- package/src/adapters/index.ts +21 -0
- package/src/adapters/types.ts +207 -0
- package/src/agent-browser-session.test.ts +369 -0
- package/src/agent-browser-session.ts +349 -0
- package/src/evidence.test.ts +239 -0
- package/src/evidence.ts +203 -0
- package/src/explorer.test.ts +321 -0
- package/src/explorer.ts +565 -0
- package/src/index.ts +51 -0
- package/src/locator-candidates.test.ts +602 -0
- package/src/locator-candidates.ts +441 -0
- package/src/step-executor.test.ts +696 -0
- package/src/step-executor.ts +783 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents a step execution result from AI exploration
|
|
3
|
+
*/
|
|
4
|
+
export interface StepExecution {
|
|
5
|
+
status: 'completed' | 'failed' | 'skipped';
|
|
6
|
+
method: string;
|
|
7
|
+
elementRef?: string;
|
|
8
|
+
selectorUsed?: string;
|
|
9
|
+
durationMs: number;
|
|
10
|
+
error?: string | null;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Screenshots captured during a step
|
|
14
|
+
*/
|
|
15
|
+
export interface StepScreenshots {
|
|
16
|
+
before: string;
|
|
17
|
+
after: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Result of executing a single step
|
|
21
|
+
*/
|
|
22
|
+
export interface StepResult {
|
|
23
|
+
stepIndex: number;
|
|
24
|
+
specAction: Record<string, unknown>;
|
|
25
|
+
execution: StepExecution;
|
|
26
|
+
screenshots: StepScreenshots;
|
|
27
|
+
snapshotBefore?: Record<string, unknown>;
|
|
28
|
+
snapshotAfter?: Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Outcome check result
|
|
32
|
+
*/
|
|
33
|
+
export interface OutcomeCheck {
|
|
34
|
+
check: string;
|
|
35
|
+
expected: unknown;
|
|
36
|
+
actual: unknown;
|
|
37
|
+
passed: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Complete output from an exploration run
|
|
41
|
+
*/
|
|
42
|
+
export interface ExplorationOutput {
|
|
43
|
+
spec: string;
|
|
44
|
+
specPath: string;
|
|
45
|
+
specDescription?: string;
|
|
46
|
+
explorationId: string;
|
|
47
|
+
timestamp: string;
|
|
48
|
+
durationMs: number;
|
|
49
|
+
browser: string;
|
|
50
|
+
viewport: {
|
|
51
|
+
width: number;
|
|
52
|
+
height: number;
|
|
53
|
+
};
|
|
54
|
+
baseUrl: string;
|
|
55
|
+
steps: StepResult[];
|
|
56
|
+
outcomeChecks: OutcomeCheck[];
|
|
57
|
+
overallStatus: 'completed' | 'failed' | 'timeout';
|
|
58
|
+
errors: string[];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Verify check conditions
|
|
62
|
+
*/
|
|
63
|
+
export interface VerifyCheck {
|
|
64
|
+
element_visible?: string;
|
|
65
|
+
element_not_visible?: string;
|
|
66
|
+
text_contains?: string;
|
|
67
|
+
text_not_contains?: string;
|
|
68
|
+
url_contains?: string;
|
|
69
|
+
element_count?: {
|
|
70
|
+
selector: string;
|
|
71
|
+
expected: number;
|
|
72
|
+
};
|
|
73
|
+
attribute?: {
|
|
74
|
+
selector: string;
|
|
75
|
+
attribute: string;
|
|
76
|
+
equals: string;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Step definition from a spec file
|
|
81
|
+
*/
|
|
82
|
+
export interface SpecStep {
|
|
83
|
+
action: string;
|
|
84
|
+
query?: string;
|
|
85
|
+
selector?: string;
|
|
86
|
+
ref?: string;
|
|
87
|
+
url?: string;
|
|
88
|
+
to?: string;
|
|
89
|
+
value?: string;
|
|
90
|
+
for?: string;
|
|
91
|
+
text?: string;
|
|
92
|
+
contains?: string;
|
|
93
|
+
timeout?: string | number;
|
|
94
|
+
duration?: string | number;
|
|
95
|
+
checks?: VerifyCheck[];
|
|
96
|
+
name?: string;
|
|
97
|
+
description?: string;
|
|
98
|
+
why?: string;
|
|
99
|
+
option?: string;
|
|
100
|
+
checked?: boolean;
|
|
101
|
+
scrollX?: number;
|
|
102
|
+
scrollY?: number;
|
|
103
|
+
[key: string]: unknown;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Spec file structure
|
|
107
|
+
*/
|
|
108
|
+
export interface Spec {
|
|
109
|
+
name: string;
|
|
110
|
+
description?: string;
|
|
111
|
+
preconditions?: Record<string, unknown>;
|
|
112
|
+
steps: SpecStep[];
|
|
113
|
+
expectedOutcomes?: Record<string, unknown>[];
|
|
114
|
+
tags?: string[];
|
|
115
|
+
timeout?: string;
|
|
116
|
+
priority?: string;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Parameters for running an exploration
|
|
120
|
+
*/
|
|
121
|
+
export interface ExploreParams {
|
|
122
|
+
spec: Spec;
|
|
123
|
+
specPath: string;
|
|
124
|
+
baseUrl: string;
|
|
125
|
+
browser?: 'chromium' | 'firefox' | 'webkit';
|
|
126
|
+
viewport?: {
|
|
127
|
+
width: number;
|
|
128
|
+
height: number;
|
|
129
|
+
};
|
|
130
|
+
timeout?: number;
|
|
131
|
+
outputDir: string;
|
|
132
|
+
sessionId?: string;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Parameters for retrying with feedback
|
|
136
|
+
*/
|
|
137
|
+
export interface RetryParams extends ExploreParams {
|
|
138
|
+
previousExploration: ExplorationOutput;
|
|
139
|
+
reviewFeedback: ReviewFeedback;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Review feedback structure
|
|
143
|
+
*/
|
|
144
|
+
export interface ReviewFeedback {
|
|
145
|
+
explorationId: string;
|
|
146
|
+
reviewer: string;
|
|
147
|
+
steps: {
|
|
148
|
+
stepIndex: number;
|
|
149
|
+
status: 'approved' | 'rejected' | 'pending';
|
|
150
|
+
comment?: string;
|
|
151
|
+
tags?: string[];
|
|
152
|
+
}[];
|
|
153
|
+
overallNotes?: string;
|
|
154
|
+
verdict: 'approved' | 'rejected';
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Enhanced snapshot from browser - includes tree and element refs
|
|
158
|
+
*/
|
|
159
|
+
export interface EnhancedSnapshot {
|
|
160
|
+
tree: string;
|
|
161
|
+
refs: Record<string, unknown>;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Result from findElement operation
|
|
165
|
+
*/
|
|
166
|
+
export interface FindElementResult {
|
|
167
|
+
/** Element reference (e.g., "e5") or "NOT_FOUND" */
|
|
168
|
+
ref: string;
|
|
169
|
+
/** AI reasoning for why this element was selected */
|
|
170
|
+
reasoning: string;
|
|
171
|
+
/** Confidence score 0-1 */
|
|
172
|
+
confidence: number;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* AI Adapter interface - defines the contract for LLM integrations
|
|
176
|
+
*/
|
|
177
|
+
export interface AIAdapter {
|
|
178
|
+
/**
|
|
179
|
+
* Name of the adapter (e.g., 'claude', 'openai')
|
|
180
|
+
*/
|
|
181
|
+
readonly name: string;
|
|
182
|
+
/**
|
|
183
|
+
* Run exploration on a spec
|
|
184
|
+
*/
|
|
185
|
+
explore(params: ExploreParams): Promise<ExplorationOutput>;
|
|
186
|
+
/**
|
|
187
|
+
* Find element from natural language query
|
|
188
|
+
* Uses AI to interpret the query and match against snapshot elements
|
|
189
|
+
*/
|
|
190
|
+
findElement(query: string, snapshot: EnhancedSnapshot): Promise<FindElementResult>;
|
|
191
|
+
/**
|
|
192
|
+
* Retry exploration with review feedback
|
|
193
|
+
*/
|
|
194
|
+
retryWithFeedback?(params: RetryParams): Promise<ExplorationOutput>;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA,8CAA8C"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BrowserSession adapter using agent-browser's BrowserManager
|
|
3
|
+
*
|
|
4
|
+
* This adapter wraps agent-browser to provide a clean BrowserSession interface
|
|
5
|
+
* for the exploration engine.
|
|
6
|
+
*/
|
|
7
|
+
import type { BrowserSession, BrowserLaunchOptions } from './explorer';
|
|
8
|
+
import type { EnhancedSnapshot } from './adapters/types';
|
|
9
|
+
/**
|
|
10
|
+
* AgentBrowserSession implements BrowserSession using agent-browser
|
|
11
|
+
*/
|
|
12
|
+
export declare class AgentBrowserSession implements BrowserSession {
|
|
13
|
+
private browser;
|
|
14
|
+
constructor();
|
|
15
|
+
isLaunched(): boolean;
|
|
16
|
+
launch(options?: BrowserLaunchOptions): Promise<void>;
|
|
17
|
+
navigate(url: string): Promise<void>;
|
|
18
|
+
screenshot(options?: {
|
|
19
|
+
fullPage?: boolean;
|
|
20
|
+
clip?: {
|
|
21
|
+
x: number;
|
|
22
|
+
y: number;
|
|
23
|
+
width: number;
|
|
24
|
+
height: number;
|
|
25
|
+
};
|
|
26
|
+
mask?: string[];
|
|
27
|
+
quality?: number;
|
|
28
|
+
}): Promise<Buffer>;
|
|
29
|
+
getSnapshot(options?: {
|
|
30
|
+
interactive?: boolean;
|
|
31
|
+
maxDepth?: number;
|
|
32
|
+
compact?: boolean;
|
|
33
|
+
selector?: string;
|
|
34
|
+
}): Promise<EnhancedSnapshot>;
|
|
35
|
+
close(): Promise<void>;
|
|
36
|
+
click(ref: string): Promise<void>;
|
|
37
|
+
fill(ref: string, value: string): Promise<void>;
|
|
38
|
+
type(ref: string, text: string): Promise<void>;
|
|
39
|
+
select(ref: string, option: string): Promise<void>;
|
|
40
|
+
check(ref: string, checked: boolean): Promise<void>;
|
|
41
|
+
press(key: string): Promise<void>;
|
|
42
|
+
back(): Promise<void>;
|
|
43
|
+
forward(): Promise<void>;
|
|
44
|
+
refresh(): Promise<void>;
|
|
45
|
+
waitForSelector(selector: string, timeout: number): Promise<void>;
|
|
46
|
+
waitForURL(urlPattern: string, timeout: number): Promise<void>;
|
|
47
|
+
waitForText(text: string, timeout: number): Promise<void>;
|
|
48
|
+
waitForLoadState(state: 'load' | 'domcontentloaded' | 'networkidle'): Promise<void>;
|
|
49
|
+
waitForTimeout(ms: number): Promise<void>;
|
|
50
|
+
scrollIntoView(ref: string): Promise<void>;
|
|
51
|
+
scroll(x: number, y: number): Promise<void>;
|
|
52
|
+
getCurrentURL(): string;
|
|
53
|
+
/**
|
|
54
|
+
* Ensures browser is launched before performing operations
|
|
55
|
+
*/
|
|
56
|
+
private ensureLaunched;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Factory function to create a new browser session
|
|
60
|
+
*/
|
|
61
|
+
export declare function createBrowserSession(): BrowserSession;
|
|
62
|
+
//# sourceMappingURL=agent-browser-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-browser-session.d.ts","sourceRoot":"","sources":["../src/agent-browser-session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD;;GAEG;AACH,qBAAa,mBAAoB,YAAW,cAAc;IACxD,OAAO,CAAC,OAAO,CAAiB;;IAMhC,UAAU,IAAI,OAAO;IAIf,MAAM,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBrD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAapC,UAAU,CAAC,OAAO,CAAC,EAAE;QACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,IAAI,CAAC,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/D,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBb,WAAW,CAAC,OAAO,CAAC,EAAE;QAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgBvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAajC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa9C,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAalD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBnD,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAarB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAaxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAcxB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAajE,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa9D,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAazD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAanF,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa1C,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAejD,aAAa,IAAI,MAAM;IAavB;;OAEG;IACH,OAAO,CAAC,cAAc;CAKvB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAErD"}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BrowserSession adapter using agent-browser's BrowserManager
|
|
3
|
+
*
|
|
4
|
+
* This adapter wraps agent-browser to provide a clean BrowserSession interface
|
|
5
|
+
* for the exploration engine.
|
|
6
|
+
*/
|
|
7
|
+
import { BrowserManager } from 'agent-browser/dist/browser.js';
|
|
8
|
+
/**
|
|
9
|
+
* AgentBrowserSession implements BrowserSession using agent-browser
|
|
10
|
+
*/
|
|
11
|
+
export class AgentBrowserSession {
|
|
12
|
+
browser;
|
|
13
|
+
constructor() {
|
|
14
|
+
this.browser = new BrowserManager();
|
|
15
|
+
}
|
|
16
|
+
isLaunched() {
|
|
17
|
+
return this.browser.isLaunched();
|
|
18
|
+
}
|
|
19
|
+
async launch(options) {
|
|
20
|
+
const launchOptions = {
|
|
21
|
+
id: 'launch',
|
|
22
|
+
action: 'launch',
|
|
23
|
+
headless: options?.headless ?? true,
|
|
24
|
+
viewport: options?.viewport ?? { width: 1280, height: 720 },
|
|
25
|
+
browser: 'chromium',
|
|
26
|
+
};
|
|
27
|
+
try {
|
|
28
|
+
await this.browser.launch(launchOptions);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
throw new Error(`Failed to launch browser: ${error instanceof Error ? error.message : String(error)}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async navigate(url) {
|
|
35
|
+
this.ensureLaunched();
|
|
36
|
+
try {
|
|
37
|
+
const page = this.browser.getPage();
|
|
38
|
+
await page.goto(url, { waitUntil: 'load' });
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
throw new Error(`Failed to navigate to ${url}: ${error instanceof Error ? error.message : String(error)}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async screenshot(options) {
|
|
45
|
+
this.ensureLaunched();
|
|
46
|
+
try {
|
|
47
|
+
const page = this.browser.getPage();
|
|
48
|
+
const { mask, ...restOptions } = options ?? {};
|
|
49
|
+
const buffer = await page.screenshot({
|
|
50
|
+
type: 'png',
|
|
51
|
+
...restOptions,
|
|
52
|
+
...(mask && { mask: mask.map((selector) => page.locator(selector)) }),
|
|
53
|
+
});
|
|
54
|
+
return Buffer.from(buffer);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
throw new Error(`Failed to capture screenshot: ${error instanceof Error ? error.message : String(error)}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async getSnapshot(options) {
|
|
61
|
+
this.ensureLaunched();
|
|
62
|
+
try {
|
|
63
|
+
const snapshot = await this.browser.getSnapshot(options);
|
|
64
|
+
return {
|
|
65
|
+
tree: snapshot.tree,
|
|
66
|
+
refs: snapshot.refs,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
throw new Error(`Failed to get snapshot: ${error instanceof Error ? error.message : String(error)}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async close() {
|
|
74
|
+
if (this.browser.isLaunched()) {
|
|
75
|
+
try {
|
|
76
|
+
await this.browser.close();
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
// Ignore errors on close - browser might already be closed
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Interaction methods
|
|
84
|
+
async click(ref) {
|
|
85
|
+
this.ensureLaunched();
|
|
86
|
+
try {
|
|
87
|
+
const locator = this.browser.getLocator(ref);
|
|
88
|
+
await locator.click();
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
throw new Error(`Failed to click ${ref}: ${error instanceof Error ? error.message : String(error)}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async fill(ref, value) {
|
|
95
|
+
this.ensureLaunched();
|
|
96
|
+
try {
|
|
97
|
+
const locator = this.browser.getLocator(ref);
|
|
98
|
+
await locator.fill(value);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
throw new Error(`Failed to fill ${ref}: ${error instanceof Error ? error.message : String(error)}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async type(ref, text) {
|
|
105
|
+
this.ensureLaunched();
|
|
106
|
+
try {
|
|
107
|
+
const locator = this.browser.getLocator(ref);
|
|
108
|
+
await locator.pressSequentially(text);
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
throw new Error(`Failed to type into ${ref}: ${error instanceof Error ? error.message : String(error)}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async select(ref, option) {
|
|
115
|
+
this.ensureLaunched();
|
|
116
|
+
try {
|
|
117
|
+
const locator = this.browser.getLocator(ref);
|
|
118
|
+
await locator.selectOption(option);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
throw new Error(`Failed to select option in ${ref}: ${error instanceof Error ? error.message : String(error)}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async check(ref, checked) {
|
|
125
|
+
this.ensureLaunched();
|
|
126
|
+
try {
|
|
127
|
+
const locator = this.browser.getLocator(ref);
|
|
128
|
+
if (checked) {
|
|
129
|
+
await locator.check();
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
await locator.uncheck();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
throw new Error(`Failed to ${checked ? 'check' : 'uncheck'} ${ref}: ${error instanceof Error ? error.message : String(error)}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async press(key) {
|
|
140
|
+
this.ensureLaunched();
|
|
141
|
+
try {
|
|
142
|
+
const page = this.browser.getPage();
|
|
143
|
+
await page.keyboard.press(key);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
throw new Error(`Failed to press key ${key}: ${error instanceof Error ? error.message : String(error)}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Navigation methods
|
|
150
|
+
async back() {
|
|
151
|
+
this.ensureLaunched();
|
|
152
|
+
try {
|
|
153
|
+
const page = this.browser.getPage();
|
|
154
|
+
await page.goBack();
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
throw new Error(`Failed to go back: ${error instanceof Error ? error.message : String(error)}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async forward() {
|
|
161
|
+
this.ensureLaunched();
|
|
162
|
+
try {
|
|
163
|
+
const page = this.browser.getPage();
|
|
164
|
+
await page.goForward();
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
throw new Error(`Failed to go forward: ${error instanceof Error ? error.message : String(error)}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async refresh() {
|
|
171
|
+
this.ensureLaunched();
|
|
172
|
+
try {
|
|
173
|
+
const page = this.browser.getPage();
|
|
174
|
+
await page.reload();
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
throw new Error(`Failed to refresh page: ${error instanceof Error ? error.message : String(error)}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Wait methods
|
|
181
|
+
async waitForSelector(selector, timeout) {
|
|
182
|
+
this.ensureLaunched();
|
|
183
|
+
try {
|
|
184
|
+
const page = this.browser.getPage();
|
|
185
|
+
await page.waitForSelector(selector, { timeout });
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
throw new Error(`Failed to wait for selector ${selector}: ${error instanceof Error ? error.message : String(error)}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async waitForURL(urlPattern, timeout) {
|
|
192
|
+
this.ensureLaunched();
|
|
193
|
+
try {
|
|
194
|
+
const page = this.browser.getPage();
|
|
195
|
+
await page.waitForURL(urlPattern, { timeout });
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
throw new Error(`Failed to wait for URL ${urlPattern}: ${error instanceof Error ? error.message : String(error)}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
async waitForText(text, timeout) {
|
|
202
|
+
this.ensureLaunched();
|
|
203
|
+
try {
|
|
204
|
+
const page = this.browser.getPage();
|
|
205
|
+
await page.locator(`text=${text}`).waitFor({ timeout });
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
throw new Error(`Failed to wait for text "${text}": ${error instanceof Error ? error.message : String(error)}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
async waitForLoadState(state) {
|
|
212
|
+
this.ensureLaunched();
|
|
213
|
+
try {
|
|
214
|
+
const page = this.browser.getPage();
|
|
215
|
+
await page.waitForLoadState(state);
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
throw new Error(`Failed to wait for load state ${state}: ${error instanceof Error ? error.message : String(error)}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
async waitForTimeout(ms) {
|
|
222
|
+
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
223
|
+
}
|
|
224
|
+
// Scroll methods
|
|
225
|
+
async scrollIntoView(ref) {
|
|
226
|
+
this.ensureLaunched();
|
|
227
|
+
try {
|
|
228
|
+
const locator = this.browser.getLocator(ref);
|
|
229
|
+
await locator.scrollIntoViewIfNeeded();
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
throw new Error(`Failed to scroll ${ref} into view: ${error instanceof Error ? error.message : String(error)}`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
async scroll(x, y) {
|
|
236
|
+
this.ensureLaunched();
|
|
237
|
+
try {
|
|
238
|
+
const page = this.browser.getPage();
|
|
239
|
+
// Use mouse wheel for scrolling (more reliable than evaluate)
|
|
240
|
+
await page.mouse.wheel(x, y);
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
throw new Error(`Failed to scroll by (${x}, ${y}): ${error instanceof Error ? error.message : String(error)}`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// State methods
|
|
247
|
+
getCurrentURL() {
|
|
248
|
+
this.ensureLaunched();
|
|
249
|
+
try {
|
|
250
|
+
const page = this.browser.getPage();
|
|
251
|
+
return page.url();
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
throw new Error(`Failed to get current URL: ${error instanceof Error ? error.message : String(error)}`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Ensures browser is launched before performing operations
|
|
259
|
+
*/
|
|
260
|
+
ensureLaunched() {
|
|
261
|
+
if (!this.browser.isLaunched()) {
|
|
262
|
+
throw new Error('Browser is not launched. Call launch() first.');
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Factory function to create a new browser session
|
|
268
|
+
*/
|
|
269
|
+
export function createBrowserSession() {
|
|
270
|
+
return new AgentBrowserSession();
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=agent-browser-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-browser-session.js","sourceRoot":"","sources":["../src/agent-browser-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type { BrowserSession } from './explorer';
|
|
2
|
+
/**
|
|
3
|
+
* Evidence metadata
|
|
4
|
+
*/
|
|
5
|
+
export interface EvidenceMetadata {
|
|
6
|
+
timestamp: string;
|
|
7
|
+
sessionId: string;
|
|
8
|
+
stepIndex?: number;
|
|
9
|
+
type: 'screenshot' | 'trace' | 'snapshot';
|
|
10
|
+
path: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Screenshot capture options
|
|
14
|
+
*/
|
|
15
|
+
export interface ScreenshotOptions {
|
|
16
|
+
fullPage?: boolean;
|
|
17
|
+
clip?: {
|
|
18
|
+
x: number;
|
|
19
|
+
y: number;
|
|
20
|
+
width: number;
|
|
21
|
+
height: number;
|
|
22
|
+
};
|
|
23
|
+
mask?: string[];
|
|
24
|
+
quality?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Configuration for the evidence collector
|
|
28
|
+
*/
|
|
29
|
+
export interface EvidenceCollectorConfig {
|
|
30
|
+
outputDir?: string;
|
|
31
|
+
screenshotFormat?: 'png' | 'jpeg';
|
|
32
|
+
screenshotQuality?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* EvidenceCollector - Captures screenshots and traces during exploration
|
|
36
|
+
*
|
|
37
|
+
* Provides:
|
|
38
|
+
* - Screenshot capture (full page, clipped, masked)
|
|
39
|
+
* - Browser snapshot capture
|
|
40
|
+
* - Trace/HAR file generation
|
|
41
|
+
* - Evidence metadata tracking
|
|
42
|
+
*/
|
|
43
|
+
export declare class EvidenceCollector {
|
|
44
|
+
private outputDir;
|
|
45
|
+
private screenshotFormat;
|
|
46
|
+
private screenshotQuality;
|
|
47
|
+
private evidence;
|
|
48
|
+
private sessions;
|
|
49
|
+
constructor(config?: EvidenceCollectorConfig);
|
|
50
|
+
/**
|
|
51
|
+
* Register a browser session for screenshot capture
|
|
52
|
+
*
|
|
53
|
+
* @param sessionId - Unique identifier for the session
|
|
54
|
+
* @param session - Browser session instance
|
|
55
|
+
*/
|
|
56
|
+
registerSession(sessionId: string, session: BrowserSession): void;
|
|
57
|
+
/**
|
|
58
|
+
* Unregister a browser session
|
|
59
|
+
*
|
|
60
|
+
* @param sessionId - Session identifier to remove
|
|
61
|
+
*/
|
|
62
|
+
unregisterSession(sessionId: string): void;
|
|
63
|
+
/**
|
|
64
|
+
* Capture a screenshot from the browser session
|
|
65
|
+
*
|
|
66
|
+
* @param sessionId - Browser session ID
|
|
67
|
+
* @param name - Screenshot name/identifier
|
|
68
|
+
* @param options - Screenshot options
|
|
69
|
+
* @returns Promise resolving to screenshot file path
|
|
70
|
+
*/
|
|
71
|
+
captureScreenshot(sessionId: string, name: string, options?: ScreenshotOptions): Promise<string>;
|
|
72
|
+
/**
|
|
73
|
+
* Capture a browser snapshot (DOM state with element refs)
|
|
74
|
+
*
|
|
75
|
+
* @param sessionId - Browser session ID
|
|
76
|
+
* @param name - Snapshot name/identifier
|
|
77
|
+
* @returns Promise resolving to snapshot data
|
|
78
|
+
*/
|
|
79
|
+
captureSnapshot(sessionId: string, name: string): Promise<Record<string, unknown>>;
|
|
80
|
+
/**
|
|
81
|
+
* Start trace recording
|
|
82
|
+
*
|
|
83
|
+
* @param sessionId - Browser session ID
|
|
84
|
+
* @param name - Trace name/identifier
|
|
85
|
+
*/
|
|
86
|
+
startTrace(sessionId: string, name: string): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Stop trace recording and save
|
|
89
|
+
*
|
|
90
|
+
* @param sessionId - Browser session ID
|
|
91
|
+
* @returns Promise resolving to trace file path
|
|
92
|
+
*/
|
|
93
|
+
stopTrace(sessionId: string): Promise<string>;
|
|
94
|
+
/**
|
|
95
|
+
* Get all collected evidence metadata
|
|
96
|
+
*/
|
|
97
|
+
getEvidence(): EvidenceMetadata[];
|
|
98
|
+
/**
|
|
99
|
+
* Clear collected evidence metadata
|
|
100
|
+
*/
|
|
101
|
+
clearEvidence(): void;
|
|
102
|
+
/**
|
|
103
|
+
* Get the output directory
|
|
104
|
+
*/
|
|
105
|
+
getOutputDir(): string;
|
|
106
|
+
/**
|
|
107
|
+
* Set the output directory
|
|
108
|
+
*/
|
|
109
|
+
setOutputDir(dir: string): void;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,YAAY,GAAG,OAAO,GAAG,UAAU,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAiB;IACzC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,QAAQ,CAA0C;gBAE9C,MAAM,GAAE,uBAA4B;IAMhD;;;;;OAKG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAIjE;;;;OAIG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI1C;;;;;;;OAOG;IACG,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC;IA8BlB;;;;;;OAMG;IACG,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAenC;;;;;OAKG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE;;;;;OAKG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAenD;;OAEG;IACH,WAAW,IAAI,gBAAgB,EAAE;IAIjC;;OAEG;IACH,aAAa,IAAI,IAAI;IAIrB;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAGhC"}
|