@minded-ai/mindedjs 1.0.0-ec2-beta-1 → 1.0.0-ec2-beta-3
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/browserTask/executeBrowserTask.d.ts.map +1 -1
- package/dist/browserTask/executeBrowserTask.js +8 -2
- package/dist/browserTask/executeBrowserTask.js.map +1 -1
- package/dist/browserTask/executeBrowserTask.py +135 -3
- package/dist/browserTask/types.d.ts +7 -0
- package/dist/browserTask/types.d.ts.map +1 -1
- package/dist/cli/localOperatorSetup.js +7 -7
- package/dist/cli/localOperatorSetup.js.map +1 -1
- package/dist/nodes/addBrowserTaskRunNode.d.ts.map +1 -1
- package/dist/nodes/addBrowserTaskRunNode.js +30 -0
- package/dist/nodes/addBrowserTaskRunNode.js.map +1 -1
- package/package.json +1 -1
- package/src/browserTask/executeBrowserTask.py +135 -3
- package/src/browserTask/executeBrowserTask.ts +8 -2
- package/src/browserTask/types.ts +9 -1
- package/src/cli/localOperatorSetup.ts +7 -7
- package/src/nodes/addBrowserTaskRunNode.ts +38 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeBrowserTask.d.ts","sourceRoot":"","sources":["../../src/browserTask/executeBrowserTask.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,4BAA4B,EAC5B,yBAAyB,EAIzB,6BAA6B,EAC9B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAOpE,eAAO,MAAM,oBAAoB,GAAU,wCAIxC;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,eAAe,CAAC;CAClC,KAAG,OAAO,CAAC,4BAA4B,CAqCvC,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAU,kCAIzC;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,KAAG,OAAO,CAAC,6BAA6B,CAoCxC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,SAAS,wBAAwB,KAAG,OAAO,CAAC,yBAAyB,
|
|
1
|
+
{"version":3,"file":"executeBrowserTask.d.ts","sourceRoot":"","sources":["../../src/browserTask/executeBrowserTask.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,4BAA4B,EAC5B,yBAAyB,EAIzB,6BAA6B,EAC9B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAOpE,eAAO,MAAM,oBAAoB,GAAU,wCAIxC;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,eAAe,CAAC;CAClC,KAAG,OAAO,CAAC,4BAA4B,CAqCvC,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAU,kCAIzC;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,KAAG,OAAO,CAAC,6BAA6B,CAoCxC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,SAAS,wBAAwB,KAAG,OAAO,CAAC,yBAAyB,CAgJ5G,CAAC"}
|
|
@@ -77,12 +77,16 @@ exports.destroyBrowserSession = destroyBrowserSession;
|
|
|
77
77
|
const invokeBrowserTask = async (options) => {
|
|
78
78
|
var _a, _b, _c;
|
|
79
79
|
try {
|
|
80
|
-
const { sessionId, cdpUrl, task, keepAlive, hooks, browserTaskMode, toolSchemas, outputSchema } = options;
|
|
80
|
+
const { sessionId, cdpUrl, task, keepAlive, hooks, browserTaskMode, toolSchemas, outputSchema, screenshotConfig } = options;
|
|
81
81
|
if (browserTaskMode === types_1.BrowserTaskMode.LOCAL) {
|
|
82
82
|
(0, localOperatorSetup_1.validateLocalOperatorSetup)();
|
|
83
83
|
const pythonScriptPath = path_1.default.resolve(__dirname, 'executeBrowserTask.py');
|
|
84
84
|
const args = ['run', pythonScriptPath];
|
|
85
|
-
logger_1.logger.info({
|
|
85
|
+
logger_1.logger.info({
|
|
86
|
+
message: 'Spawning Python process',
|
|
87
|
+
args,
|
|
88
|
+
screenshotEnabled: (screenshotConfig === null || screenshotConfig === void 0 ? void 0 : screenshotConfig.enabled) || false,
|
|
89
|
+
});
|
|
86
90
|
const child = (0, node_child_process_1.spawn)('uv', args, {
|
|
87
91
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
88
92
|
env: (0, localOperatorSetup_1.isLocalOperatorSetup)()
|
|
@@ -100,6 +104,7 @@ const invokeBrowserTask = async (options) => {
|
|
|
100
104
|
task,
|
|
101
105
|
outputSchema,
|
|
102
106
|
otpSecret: process.env.OTP_SECRET,
|
|
107
|
+
screenshotConfig,
|
|
103
108
|
};
|
|
104
109
|
// Write JSON payload to stdin
|
|
105
110
|
child.stdin.write(JSON.stringify(payload));
|
|
@@ -161,6 +166,7 @@ const invokeBrowserTask = async (options) => {
|
|
|
161
166
|
hooksCount: (hooks === null || hooks === void 0 ? void 0 : hooks.length) || 0,
|
|
162
167
|
onPrem: browserTaskMode === types_1.BrowserTaskMode.ON_PREM,
|
|
163
168
|
outputSchemaFields: (outputSchema === null || outputSchema === void 0 ? void 0 : outputSchema.length) || 0,
|
|
169
|
+
screenshotEnabled: (screenshotConfig === null || screenshotConfig === void 0 ? void 0 : screenshotConfig.enabled) || false,
|
|
164
170
|
});
|
|
165
171
|
const response = await mindedConnection_1.mindedConnection.awaitEmit(mindedConnectionTypes_1.mindedConnectionSocketMessageType.INVOKE_BROWSER_TASK, {
|
|
166
172
|
type: mindedConnectionTypes_1.mindedConnectionSocketMessageType.INVOKE_BROWSER_TASK,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeBrowserTask.js","sourceRoot":"","sources":["../../src/browserTask/executeBrowserTask.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"executeBrowserTask.js","sourceRoot":"","sources":["../../src/browserTask/executeBrowserTask.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Browser Task Executor with Screenshot Capture Support
|
|
3
|
+
|
|
4
|
+
This script runs browser automation tasks using browser-use and automatically captures
|
|
5
|
+
screenshots at the end of each step, uploading them to S3.
|
|
6
|
+
|
|
7
|
+
Environment Variables for Screenshots:
|
|
8
|
+
- SCREENSHOT_S3_BUCKET: S3 bucket name (default: 'global-development-agentsforce')
|
|
9
|
+
- SCREENSHOT_S3_PREFIX: S3 key prefix (default: 'browser-use-runs-screenshots/')
|
|
10
|
+
- AWS_REGION: AWS region for S3 (default: 'us-east-1')
|
|
11
|
+
|
|
12
|
+
AWS credentials should be configured via standard AWS SDK methods.
|
|
13
|
+
"""
|
|
14
|
+
|
|
1
15
|
import asyncio
|
|
2
16
|
import json
|
|
3
17
|
from typing import List, Optional, Dict, Any, TypedDict
|
|
@@ -7,10 +21,17 @@ from browser_use.browser import BrowserProfile, BrowserSession
|
|
|
7
21
|
from browser_use.llm import ChatOpenAI
|
|
8
22
|
import os
|
|
9
23
|
import sys
|
|
24
|
+
import logging
|
|
25
|
+
from datetime import datetime
|
|
26
|
+
from pathlib import Path
|
|
10
27
|
from dotenv import load_dotenv
|
|
11
28
|
|
|
12
29
|
load_dotenv()
|
|
13
30
|
|
|
31
|
+
# Configure logging
|
|
32
|
+
logging.basicConfig(level=logging.INFO)
|
|
33
|
+
logger = logging.getLogger(__name__)
|
|
34
|
+
|
|
14
35
|
class OutputSchemaItemRequired(TypedDict):
|
|
15
36
|
name: str
|
|
16
37
|
type: str # 'string' | 'number'
|
|
@@ -20,6 +41,95 @@ class OutputSchemaItem(OutputSchemaItemRequired, total=False):
|
|
|
20
41
|
required: bool
|
|
21
42
|
|
|
22
43
|
|
|
44
|
+
class ScreenshotCapture:
|
|
45
|
+
"""Simple screenshot capture class that takes screenshots at step end and uploads to S3"""
|
|
46
|
+
|
|
47
|
+
def __init__(self, config: Optional[Dict[str, Any]] = None):
|
|
48
|
+
self.config = config or {}
|
|
49
|
+
|
|
50
|
+
# Import boto3 only when screenshot capture is needed
|
|
51
|
+
try:
|
|
52
|
+
import boto3
|
|
53
|
+
from botocore.exceptions import ClientError
|
|
54
|
+
self.boto3 = boto3
|
|
55
|
+
self.ClientError = ClientError
|
|
56
|
+
except ImportError:
|
|
57
|
+
raise ImportError(
|
|
58
|
+
"boto3 is required for screenshot capture. "
|
|
59
|
+
"Please install it with: uv pip install boto3 "
|
|
60
|
+
"or run: npx minded setup-local-operator"
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
# S3 configuration with defaults
|
|
64
|
+
self.s3_bucket = self.config.get('s3_bucket', os.getenv('SCREENSHOT_S3_BUCKET', 'global-development-agentsforce'))
|
|
65
|
+
self.s3_prefix = self.config.get('s3_prefix', os.getenv('SCREENSHOT_S3_PREFIX', 'browser-use-runs-screenshots/'))
|
|
66
|
+
|
|
67
|
+
# AWS region configuration
|
|
68
|
+
self.aws_region = self.config.get('aws_region', os.getenv('AWS_REGION', 'us-east-1'))
|
|
69
|
+
|
|
70
|
+
# Ensure prefix ends with slash
|
|
71
|
+
if not self.s3_prefix.endswith('/'):
|
|
72
|
+
self.s3_prefix += '/'
|
|
73
|
+
|
|
74
|
+
# Get session ID from config or generate one
|
|
75
|
+
self.session_id = self.config.get('session_id', datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:-3])
|
|
76
|
+
|
|
77
|
+
# Initialize S3 client with region
|
|
78
|
+
self.s3_client = self.boto3.client('s3', region_name=self.aws_region)
|
|
79
|
+
|
|
80
|
+
# Track step counter
|
|
81
|
+
self.step_counter = 0
|
|
82
|
+
|
|
83
|
+
logger.info(f"📸 Screenshot capture initialized - S3: s3://{self.s3_bucket}/{self.s3_prefix}")
|
|
84
|
+
logger.info(f" Session ID: {self.session_id}, Region: {self.aws_region}")
|
|
85
|
+
|
|
86
|
+
async def capture_screenshot(self, agent: Any) -> None:
|
|
87
|
+
"""Capture screenshot at step end and upload to S3"""
|
|
88
|
+
try:
|
|
89
|
+
# Get current page
|
|
90
|
+
page = await agent.browser_session.get_current_page()
|
|
91
|
+
|
|
92
|
+
# Get current URL for context
|
|
93
|
+
current_url = page.url
|
|
94
|
+
logger.info(f"📸 Taking step_end screenshot at: {current_url}")
|
|
95
|
+
|
|
96
|
+
# Update step counter
|
|
97
|
+
step_number = self.step_counter
|
|
98
|
+
self.step_counter += 1
|
|
99
|
+
|
|
100
|
+
# Take screenshot (viewport only)
|
|
101
|
+
screenshot_bytes = await page.screenshot(full_page=False)
|
|
102
|
+
|
|
103
|
+
# Generate filename with metadata
|
|
104
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:-3]
|
|
105
|
+
filename = f"{self.session_id}/step_{step_number:04d}_{timestamp}.png"
|
|
106
|
+
|
|
107
|
+
# Upload to S3
|
|
108
|
+
s3_key = f"{self.s3_prefix}{filename}"
|
|
109
|
+
|
|
110
|
+
try:
|
|
111
|
+
# Upload with KMS encryption if required by bucket
|
|
112
|
+
self.s3_client.put_object(
|
|
113
|
+
Bucket=self.s3_bucket,
|
|
114
|
+
Key=s3_key,
|
|
115
|
+
Body=screenshot_bytes,
|
|
116
|
+
ContentType='image/png',
|
|
117
|
+
ServerSideEncryption='aws:kms',
|
|
118
|
+
Tagging='retention=30d'
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
s3_url = f"s3://{self.s3_bucket}/{s3_key}"
|
|
122
|
+
logger.info(f"✅ Screenshot uploaded: {s3_url}")
|
|
123
|
+
|
|
124
|
+
except self.ClientError as e:
|
|
125
|
+
logger.error(f"❌ Failed to upload screenshot to S3: {str(e)}")
|
|
126
|
+
# Continue execution even if screenshot upload fails
|
|
127
|
+
|
|
128
|
+
except Exception as e:
|
|
129
|
+
logger.error(f"❌ Error capturing screenshot: {str(e)}")
|
|
130
|
+
# Don't raise - continue execution
|
|
131
|
+
|
|
132
|
+
|
|
23
133
|
def create_pydantic_model_from_schema(output_schema: Optional[List[Dict[str, Any]]]) -> Optional[type[BaseModel]]:
|
|
24
134
|
if not output_schema:
|
|
25
135
|
return None
|
|
@@ -43,7 +153,8 @@ def create_pydantic_model_from_schema(output_schema: Optional[List[Dict[str, Any
|
|
|
43
153
|
return None
|
|
44
154
|
|
|
45
155
|
|
|
46
|
-
async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Optional[str] = None,
|
|
156
|
+
async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Optional[str] = None,
|
|
157
|
+
otp_secret: Optional[str] = None, screenshot_config: Optional[Dict[str, Any]] = None):
|
|
47
158
|
llm = ChatOpenAI(
|
|
48
159
|
model="gpt-4.1",
|
|
49
160
|
api_key=os.getenv("OPENAI_API_KEY"),
|
|
@@ -60,6 +171,22 @@ async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Opt
|
|
|
60
171
|
browser_profile=BrowserProfile(downloads_path=folder_path),
|
|
61
172
|
cdp_url=cdp_url
|
|
62
173
|
)
|
|
174
|
+
|
|
175
|
+
# Initialize screenshot capture if enabled
|
|
176
|
+
screenshot_capture = None
|
|
177
|
+
on_step_end_hook = None
|
|
178
|
+
|
|
179
|
+
if screenshot_config and screenshot_config.get('enabled', False):
|
|
180
|
+
logger.info("📸 Screenshot capture enabled (captures at step end)")
|
|
181
|
+
# Add session_id to config
|
|
182
|
+
screenshot_config['session_id'] = session_id
|
|
183
|
+
screenshot_capture = ScreenshotCapture(screenshot_config)
|
|
184
|
+
|
|
185
|
+
# Create hook function for step end only
|
|
186
|
+
async def on_step_end(agent: Any) -> None:
|
|
187
|
+
await screenshot_capture.capture_screenshot(agent)
|
|
188
|
+
|
|
189
|
+
on_step_end_hook = on_step_end
|
|
63
190
|
|
|
64
191
|
output_schema = None
|
|
65
192
|
if output_schema_json:
|
|
@@ -99,7 +226,11 @@ async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Opt
|
|
|
99
226
|
available_file_paths=available_files,
|
|
100
227
|
browser_session=browser_session,
|
|
101
228
|
)
|
|
102
|
-
|
|
229
|
+
|
|
230
|
+
# Run agent with screenshot hook if configured
|
|
231
|
+
history = await agent.run(
|
|
232
|
+
on_step_end=on_step_end_hook
|
|
233
|
+
)
|
|
103
234
|
final_result = history.final_result()
|
|
104
235
|
|
|
105
236
|
# Parse result with output model if provided
|
|
@@ -143,11 +274,12 @@ if __name__ == '__main__':
|
|
|
143
274
|
task = payload.get('task')
|
|
144
275
|
output_schema = payload.get('outputSchema')
|
|
145
276
|
otp_secret = payload.get('otpSecret')
|
|
277
|
+
screenshot_config = payload.get('screenshotConfig')
|
|
146
278
|
|
|
147
279
|
if not session_id or not cdp_url or not task:
|
|
148
280
|
raise SystemExit("Missing required fields in JSON payload: sessionId, cdpUrl, task")
|
|
149
281
|
|
|
150
282
|
output_schema_json = json.dumps(output_schema) if output_schema is not None else None
|
|
151
|
-
asyncio.run(main(session_id, cdp_url, task, output_schema_json, otp_secret))
|
|
283
|
+
asyncio.run(main(session_id, cdp_url, task, output_schema_json, otp_secret, screenshot_config))
|
|
152
284
|
else:
|
|
153
285
|
raise SystemExit("Usage: uv run executeBrowserTask.py; send a JSON payload via stdin")
|
|
@@ -22,6 +22,12 @@ export type ToolSchema = {
|
|
|
22
22
|
required?: boolean;
|
|
23
23
|
}>;
|
|
24
24
|
};
|
|
25
|
+
export type ScreenshotConfig = {
|
|
26
|
+
enabled: boolean;
|
|
27
|
+
s3_bucket?: string;
|
|
28
|
+
s3_prefix?: string;
|
|
29
|
+
aws_region?: string;
|
|
30
|
+
};
|
|
25
31
|
export interface InvokeBrowserTaskOptions {
|
|
26
32
|
sessionId: string;
|
|
27
33
|
cdpUrl: string;
|
|
@@ -31,5 +37,6 @@ export interface InvokeBrowserTaskOptions {
|
|
|
31
37
|
browserTaskMode: BrowserTaskMode;
|
|
32
38
|
toolSchemas?: ToolSchema[];
|
|
33
39
|
outputSchema?: OutputSchemaField[];
|
|
40
|
+
screenshotConfig?: ScreenshotConfig;
|
|
34
41
|
}
|
|
35
42
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/browserTask/types.ts"],"names":[],"mappings":"AAAA,oBAAY,eAAe;IACzB,OAAO,WAAW;IAClB,KAAK,aAAa;IAClB,KAAK,UAAU;CAChB;AAGD,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,KAAK,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;QAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;CACJ,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;IAC1B,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/browserTask/types.ts"],"names":[],"mappings":"AAAA,oBAAY,eAAe;IACzB,OAAO,WAAW;IAClB,KAAK,aAAa;IAClB,KAAK,UAAU;CAChB;AAGD,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,KAAK,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;QAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;CACJ,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;IAC1B,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACnC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC"}
|
|
@@ -58,9 +58,9 @@ const REQUIRED_PACKAGES = [
|
|
|
58
58
|
checkCommand: 'python3.12 --version',
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
|
-
name: 'browser-use',
|
|
62
|
-
description: 'Browser automation library',
|
|
63
|
-
command: 'uv pip install browser-use',
|
|
61
|
+
name: 'browser-use & boto3',
|
|
62
|
+
description: 'Browser automation library and AWS S3 SDK for screenshots',
|
|
63
|
+
command: 'uv pip install browser-use boto3',
|
|
64
64
|
},
|
|
65
65
|
{
|
|
66
66
|
name: 'Playwright Chromium',
|
|
@@ -211,12 +211,12 @@ async function setupLocalOperator(skipPrompt = false) {
|
|
|
211
211
|
console.log('Creating Python virtual environment...');
|
|
212
212
|
(0, child_process_1.execSync)(`uv venv --python 3.12 ${VENV_DIR}`, { stdio: 'inherit' });
|
|
213
213
|
console.log('✓ Virtual environment created');
|
|
214
|
-
// Install browser-use in the venv
|
|
215
|
-
console.log('Installing browser-use
|
|
216
|
-
(0, child_process_1.execSync)(`uv pip install --python ${path.join(process.cwd(), VENV_DIR, 'bin', 'python')} browser-use`, {
|
|
214
|
+
// Install browser-use and boto3 in the venv
|
|
215
|
+
console.log('Installing browser-use and boto3 packages...');
|
|
216
|
+
(0, child_process_1.execSync)(`uv pip install --python ${path.join(process.cwd(), VENV_DIR, 'bin', 'python')} browser-use boto3`, {
|
|
217
217
|
stdio: 'inherit',
|
|
218
218
|
});
|
|
219
|
-
console.log('✓ browser-use installed');
|
|
219
|
+
console.log('✓ browser-use and boto3 installed');
|
|
220
220
|
// Install Playwright Chromium
|
|
221
221
|
console.log('Installing Playwright Chromium browser...');
|
|
222
222
|
(0, child_process_1.execSync)(`uvx playwright install chromium --with-deps`, { stdio: 'inherit' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localOperatorSetup.js","sourceRoot":"","sources":["../../src/cli/localOperatorSetup.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,oDAMC;AA+FD,gDAsJC;AAED,gEAMC;AAED,kCAEC;AAED,wCAEC;AAnTD,uCAAyB;AACzB,2CAA6B;AAC7B,iDAAgD;AAChD,mDAAqC;AAErC,MAAM,QAAQ,GAAG,OAAO,CAAC;AACzB,MAAM,iBAAiB,GAAG,8BAA8B,CAAC;AASzD,MAAM,iBAAiB,GAAmB;IACxC;QACE,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,yDAAyD;QACtE,OAAO,EAAE,iDAAiD;QAC1D,YAAY,EAAE,cAAc;KAC7B;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,uCAAuC;QACpD,OAAO,EAAE,sBAAsB;QAC/B,YAAY,EAAE,sBAAsB;KACrC;IACD;QACE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"localOperatorSetup.js","sourceRoot":"","sources":["../../src/cli/localOperatorSetup.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,oDAMC;AA+FD,gDAsJC;AAED,gEAMC;AAED,kCAEC;AAED,wCAEC;AAnTD,uCAAyB;AACzB,2CAA6B;AAC7B,iDAAgD;AAChD,mDAAqC;AAErC,MAAM,QAAQ,GAAG,OAAO,CAAC;AACzB,MAAM,iBAAiB,GAAG,8BAA8B,CAAC;AASzD,MAAM,iBAAiB,GAAmB;IACxC;QACE,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,yDAAyD;QACtE,OAAO,EAAE,iDAAiD;QAC1D,YAAY,EAAE,cAAc;KAC7B;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,uCAAuC;QACpD,OAAO,EAAE,sBAAsB;QAC/B,YAAY,EAAE,sBAAsB;KACrC;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,2DAA2D;QACxE,OAAO,EAAE,kCAAkC;KAC5C;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,iCAAiC;QAC9C,OAAO,EAAE,6CAA6C;KACvD;CACF,CAAC;AAEF,SAAgB,oBAAoB;IAClC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IAEpD,yDAAyD;IACzD,OAAO,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB;IAClC,4CAA4C;IAC5C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;QAC/F,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YAClC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,yCAAyC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC9D,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,oBAAoB;QAE/B,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAEzC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,GAAG,CAAC,CAAC;YAE1C,EAAE,CAAC,KAAK,EAAE,CAAC;YAEX,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;YAE3C,OAAO,CAAC,SAAS,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,mCAAmC;QACnC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACvB,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACzE,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,WAAmB;IAC5D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,cAAc,WAAW,KAAK,CAAC,CAAC;QAE5C,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEzE,IAAI,gBAAgB,EAAE,CAAC;YACrB,mDAAmD;YACnD,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;gBACzC,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC1B,OAAO,CAAC,KAAK,CAAC,qBAAqB,WAAW,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClE,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,yBAAyB,CAAC,CAAC;oBACvD,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,oCAAoC;YACpC,IAAI,CAAC;gBACH,IAAA,wBAAQ,EAAC,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,yBAAyB,CAAC,CAAC;gBACvD,OAAO,EAAE,CAAC;YACZ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,WAAW,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC1D,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,aAAsB,KAAK;IAClE,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAElD,yBAAyB;IACzB,IAAI,oBAAoB,EAAE,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,iCAAiC;IACjC,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;IACxF,iBAAiB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,sCAAsC;IACtC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,uDAAuD,CAAC,CAAC;QAC5F,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,iCAAiC;QACjC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,MAAM,UAAU,CAAC,iDAAiD,EAAE,IAAI,CAAC,CAAC;YAE1E,qCAAqC;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAC3C,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;QAED,6BAA6B;QAC7B,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,IAAA,wBAAQ,EAAC,yBAAyB,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAE7C,4CAA4C;QAC5C,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC5D,IAAA,wBAAQ,EAAC,2BAA2B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,oBAAoB,EAAE;YAC3G,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QAEjD,8BAA8B;QAC9B,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,IAAA,wBAAQ,EAAC,6CAA6C,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAE/C,2BAA2B;QAC3B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG;YAChB,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,QAAQ,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9C,QAAQ,EAAE,QAAQ;SACnB,CAAC;QACF,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEtE,yCAAyC;QACzC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;QAC7D,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACjC,MAAM,gBAAgB,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YAChE,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;YAClE,MAAM,UAAU,GAAa,EAAE,CAAC;YAEhC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC7B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,EAAE,GAAG,+BAA+B,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;gBAC/G,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,kBAAkB,GAAG,4BAA4B,CAAC;QAExD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAEpD,4CAA4C;YAC5C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC9C,+BAA+B;gBAC/B,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,kBAAkB,GAAG,IAAI,CAAC;gBAC9E,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC5D,CAAC;iBAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAAE,CAAC;gBAC9D,+DAA+D;gBAC/D,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC,wBAAwB,EAAE,kBAAkB,CAAC,CAAC;gBAC3F,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,uBAAuB;YACvB,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAEnC,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACtF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAEtC,gCAAgC;QAChC,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;gBACtD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAAC,WAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAgB,0BAA0B;IACxC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,SAAgB,WAAW;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED,SAAgB,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addBrowserTaskRunNode.d.ts","sourceRoot":"","sources":["../../src/nodes/addBrowserTaskRunNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAmB,MAAM,0BAA0B,CAAC;AAE7E,OAAO,EAAiC,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEtF,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"addBrowserTaskRunNode.d.ts","sourceRoot":"","sources":["../../src/nodes/addBrowserTaskRunNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAmB,MAAM,0BAA0B,CAAC;AAE7E,OAAO,EAAiC,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEtF,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAWjC,KAAK,2BAA2B,GAAG;IACjC,KAAK,EAAE,gBAAgB,CAAC;IACxB,eAAe,EAAE,eAAe,CAAC;IACjC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,2BAA2B,GAAI,UAAU,MAAM,WAAyD,CAAC;AAEtH,eAAO,MAAM,qBAAqB,GAAU,uDAAuD,2BAA2B,kBA2M7H,CAAC"}
|
|
@@ -41,6 +41,35 @@ const addBrowserTaskRunNode = async ({ graph, browserTaskNode, attachedToNodeNam
|
|
|
41
41
|
// We compile the env variables to avoid having to pass them to the platform in the tool input
|
|
42
42
|
const promptCompiledWithEnv = (0, compilePrompt_1.compilePrompt)(prompt, { env: process.env });
|
|
43
43
|
const { browserTaskMode } = (0, config_1.getConfig)();
|
|
44
|
+
// Build screenshot config conditionally based on environment variables
|
|
45
|
+
const screenshotConfig = (() => {
|
|
46
|
+
// Only enable screenshots if S3 bucket is configured or explicitly enabled
|
|
47
|
+
const screenshotEnabled = process.env.ENABLE_BROWSER_SCREENSHOTS === 'true' || !!process.env.SCREENSHOT_S3_BUCKET;
|
|
48
|
+
if (!screenshotEnabled) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
// Screenshots enabled - build config
|
|
52
|
+
const config = {
|
|
53
|
+
enabled: true,
|
|
54
|
+
};
|
|
55
|
+
// Add optional S3 configuration if provided
|
|
56
|
+
if (process.env.SCREENSHOT_S3_BUCKET) {
|
|
57
|
+
config.s3_bucket = process.env.SCREENSHOT_S3_BUCKET;
|
|
58
|
+
}
|
|
59
|
+
if (process.env.SCREENSHOT_S3_PREFIX) {
|
|
60
|
+
config.s3_prefix = process.env.SCREENSHOT_S3_PREFIX;
|
|
61
|
+
}
|
|
62
|
+
if (process.env.AWS_REGION) {
|
|
63
|
+
config.aws_region = process.env.AWS_REGION;
|
|
64
|
+
}
|
|
65
|
+
logger_1.logger.debug({
|
|
66
|
+
msg: 'Screenshot configuration enabled',
|
|
67
|
+
bucket: config.s3_bucket || 'default',
|
|
68
|
+
prefix: config.s3_prefix || 'default',
|
|
69
|
+
region: config.aws_region || 'default',
|
|
70
|
+
});
|
|
71
|
+
return config;
|
|
72
|
+
})();
|
|
44
73
|
// Invoke browser task via socket
|
|
45
74
|
const result = await (0, executeBrowserTask_1.invokeBrowserTask)({
|
|
46
75
|
sessionId,
|
|
@@ -51,6 +80,7 @@ const addBrowserTaskRunNode = async ({ graph, browserTaskNode, attachedToNodeNam
|
|
|
51
80
|
browserTaskMode,
|
|
52
81
|
toolSchemas,
|
|
53
82
|
outputSchema,
|
|
83
|
+
screenshotConfig,
|
|
54
84
|
});
|
|
55
85
|
logger_1.logger.debug({
|
|
56
86
|
msg: 'Browser task completed',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addBrowserTaskRunNode.js","sourceRoot":"","sources":["../../src/nodes/addBrowserTaskRunNode.ts"],"names":[],"mappings":";;;AAEA,sDAAsF;AACtF,uDAAkE;AAElE,4CAAyC;AACzC,8CAAqD;AAErD,+BAAoC;AACpC,0EAAsE;
|
|
1
|
+
{"version":3,"file":"addBrowserTaskRunNode.js","sourceRoot":"","sources":["../../src/nodes/addBrowserTaskRunNode.ts"],"names":[],"mappings":";;;AAEA,sDAAsF;AACtF,uDAAkE;AAElE,4CAAyC;AACzC,8CAAqD;AAErD,+BAAoC;AACpC,0EAAsE;AAEtE,mDAA4D;AAC5D,+CAA+C;AAC/C,mDAAgD;AASzC,MAAM,2BAA2B,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,GAAG,QAAQ,GAAG,iCAAmB,CAAC,gBAAgB,EAAE,CAAC;AAAzG,QAAA,2BAA2B,+BAA8E;AAE/G,MAAM,qBAAqB,GAAG,KAAK,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,KAAK,EAA+B,EAAE,EAAE;IAChI,MAAM,QAAQ,GAAiB,KAAK,EAAE,KAAmC,EAAE,EAAE;;QAC3E,eAAM,CAAC,IAAI,CAAC,uCAAuC,eAAe,CAAC,WAAW,EAAE,CAAC,CAAC;QAElF,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAQ,CAAC;QACrE,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,sBAAsB,GAAG,MAAA,WAAW,CAAC,iBAAiB,0CAAE,cAAc,CAAC;QAC7E,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;QACjD,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,sBAAsB,CAAC;QAErF,IAAI,CAAC;YACH,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;YAED,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAC/E,CAAC;YAED,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK;iBAC5B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB,KAAK,IAAI,CAAC;iBACtD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACd,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,WAAW,EAAE,IAAA,yBAAiB,EAAC,IAAI,CAAC,KAAK,CAAC;aAC3C,CAAC,CAAC,CAAC;YAEN,8FAA8F;YAC9F,MAAM,qBAAqB,GAAG,IAAA,6BAAa,EAAC,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAE1E,MAAM,EAAE,eAAe,EAAE,GAAG,IAAA,kBAAS,GAAE,CAAC;YAExC,uEAAuE;YACvE,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE;gBAC7B,2EAA2E;gBAC3E,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;gBAElH,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACvB,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAED,qCAAqC;gBACrC,MAAM,MAAM,GAAqB;oBAC/B,OAAO,EAAE,IAAI;iBACd,CAAC;gBAEF,4CAA4C;gBAC5C,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC;oBACrC,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;gBACtD,CAAC;gBACD,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC;oBACrC,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;gBACtD,CAAC;gBACD,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;oBAC3B,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;gBAC7C,CAAC;gBAED,eAAM,CAAC,KAAK,CAAC;oBACX,GAAG,EAAE,kCAAkC;oBACvC,MAAM,EAAE,MAAM,CAAC,SAAS,IAAI,SAAS;oBACrC,MAAM,EAAE,MAAM,CAAC,SAAS,IAAI,SAAS;oBACrC,MAAM,EAAE,MAAM,CAAC,UAAU,IAAI,SAAS;iBACvC,CAAC,CAAC;gBAEH,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC,EAAE,CAAC;YAEL,iCAAiC;YACjC,MAAM,MAAM,GAAG,MAAM,IAAA,sCAAiB,EAAC;gBACrC,SAAS;gBACT,MAAM;gBACN,IAAI,EAAE,qBAAqB;gBAC3B,SAAS;gBACT,KAAK;gBACL,eAAe;gBACf,WAAW;gBACX,YAAY;gBACZ,gBAAgB;aACjB,CAAC,CAAC;YAEH,eAAM,CAAC,KAAK,CAAC;gBACX,GAAG,EAAE,wBAAwB;gBAC7B,SAAS;gBACT,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM;gBAC1B,SAAS,EAAE,CAAA,MAAA,MAAM,CAAC,KAAK,0CAAE,MAAM,KAAI,CAAC;gBACpC,cAAc,EAAE,CAAA,MAAA,MAAM,CAAC,UAAU,0CAAE,MAAM,KAAI,CAAC;aAC/C,CAAC,CAAC;YAEH,sCAAsC;YACtC,MAAM,WAAW,GAAG,IAAI,sBAAW,CAAC;gBAClC,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;oBACtB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,gCAAgC;oBACzD,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;oBACzB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;oBACnC,WAAW,EAAE,WAAW;iBACzB,CAAC;gBACF,IAAI,EAAE,cAAc;gBACpB,YAAY,EAAE,QAAQ,CAAC,EAAE;gBACzB,MAAM,EAAE,SAAS;gBACjB,iBAAiB,EAAE;oBACjB,cAAc,EAAE;wBACd,QAAQ,EAAE,sBAAQ,CAAC,YAAY;wBAC/B,eAAe,EAAE,eAAe,CAAC,WAAW;wBAC5C,SAAS;wBACT,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,UAAU,EAAE,MAAM,CAAC,UAAU;wBAC7B,WAAW,EAAE,WAAW;qBACzB;iBACF;aACF,CAAC,CAAC;YAEH,qEAAqE;YACrE,MAAM,gBAAgB,GAAG,IAAI,oBAAS,CAAC;gBACrC,EAAE,EAAE,WAAW,CAAC,EAAE;gBAClB,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,UAAU,EAAE,WAAW,CAAC,UAAU;gBAClC,iBAAiB,EAAE;oBACjB,GAAG,WAAW,CAAC,iBAAiB;oBAChC,cAAc,EAAE;wBACd,GAAG,MAAA,WAAW,CAAC,iBAAiB,0CAAE,cAAc;wBAChD,eAAe,EAAE,eAAe,CAAC,WAAW;wBAC5C,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,UAAU,EAAE,MAAM,CAAC,UAAU;wBAC7B,MAAM,EAAE,WAAW;qBACpB;oBACD,MAAM,EAAE,IAAI,EAAE,mEAAmE;iBAClF;aACF,CAAC,CAAC;YAEH,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YACrB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YACnD,KAAK,CAAC,OAAO,CAAC,IAAI,CAChB,IAAA,2BAAiB,EAAc,KAAK,CAAC,OAAO,EAAE;gBAC5C,IAAI,EAAE,sBAAQ,CAAC,YAAY;gBAC3B,MAAM,EAAE,eAAe,CAAC,IAAI;gBAC5B,eAAe,EAAE,eAAe,CAAC,WAAW;gBAC5C,GAAG,EAAE,MAAM;gBACX,UAAU,EAAE,CAAC,WAAW,CAAC,EAAG,CAAC;aAC9B,CAAC,CACH,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,uCAAuC,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAExF,MAAM,gBAAgB,GAAG,IAAI,sBAAW,CAAC;gBACvC,EAAE,EAAE,IAAA,SAAM,GAAE;gBACZ,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;oBACtB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE;oBAChE,WAAW,EAAE,WAAW;oBACxB,OAAO,EAAE,gCAAgC;iBAC1C,CAAC;gBACF,MAAM,EAAE,OAAO;gBACf,IAAI,EAAE,cAAc;gBACpB,YAAY,EAAE,QAAQ,CAAC,EAAE;gBACzB,iBAAiB,EAAE;oBACjB,cAAc,EAAE;wBACd,QAAQ,EAAE,sBAAQ,CAAC,YAAY;wBAC/B,eAAe,EAAE,eAAe,CAAC,WAAW;wBAC5C,SAAS;wBACT,KAAK,EAAE,KAAK,CAAC,OAAO;wBACpB,WAAW,EAAE,WAAW;qBACzB;iBACF;aACF,CAAC,CAAC;YAEH,0CAA0C;YAC1C,MAAM,gBAAgB,GAAG,IAAI,oBAAS,CAAC;gBACrC,EAAE,EAAE,WAAW,CAAC,EAAE;gBAClB,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,UAAU,EAAE,WAAW,CAAC,UAAU;gBAClC,iBAAiB,EAAE;oBACjB,GAAG,WAAW,CAAC,iBAAiB;oBAChC,cAAc,EAAE;wBACd,GAAG,MAAA,WAAW,CAAC,iBAAiB,0CAAE,cAAc;wBAChD,eAAe,EAAE,eAAe,CAAC,WAAW;wBAC5C,MAAM,EAAE,QAAQ;wBAChB,KAAK,EAAE,KAAK,CAAC,OAAO;qBACrB;oBACD,MAAM,EAAE,IAAI;iBACb;aACF,CAAC,CAAC;YAEH,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YACrB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;YACxD,KAAK,CAAC,OAAO,CAAC,IAAI,CAChB,IAAA,2BAAiB,EAAc,KAAK,CAAC,OAAO,EAAE;gBAC5C,IAAI,EAAE,sBAAQ,CAAC,YAAY;gBAC3B,MAAM,EAAE,eAAe,CAAC,IAAI;gBAC5B,eAAe,EAAE,eAAe,CAAC,WAAW;gBAC5C,GAAG,EAAE,KAAK;gBACV,UAAU,EAAE,EAAE;aACf,CAAC,CACH,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,IAAA,mCAA2B,EAAC,kBAAkB,CAAC,EAAE,QAAQ,CAAC,CAAC;IACzE,KAAK,CAAC,OAAO,CAAC,kBAAyB,EAAE,IAAA,mCAA2B,EAAC,kBAAkB,CAAQ,CAAC,CAAC;AACnG,CAAC,CAAC;AA3MW,QAAA,qBAAqB,yBA2MhC"}
|
package/package.json
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Browser Task Executor with Screenshot Capture Support
|
|
3
|
+
|
|
4
|
+
This script runs browser automation tasks using browser-use and automatically captures
|
|
5
|
+
screenshots at the end of each step, uploading them to S3.
|
|
6
|
+
|
|
7
|
+
Environment Variables for Screenshots:
|
|
8
|
+
- SCREENSHOT_S3_BUCKET: S3 bucket name (default: 'global-development-agentsforce')
|
|
9
|
+
- SCREENSHOT_S3_PREFIX: S3 key prefix (default: 'browser-use-runs-screenshots/')
|
|
10
|
+
- AWS_REGION: AWS region for S3 (default: 'us-east-1')
|
|
11
|
+
|
|
12
|
+
AWS credentials should be configured via standard AWS SDK methods.
|
|
13
|
+
"""
|
|
14
|
+
|
|
1
15
|
import asyncio
|
|
2
16
|
import json
|
|
3
17
|
from typing import List, Optional, Dict, Any, TypedDict
|
|
@@ -7,10 +21,17 @@ from browser_use.browser import BrowserProfile, BrowserSession
|
|
|
7
21
|
from browser_use.llm import ChatOpenAI
|
|
8
22
|
import os
|
|
9
23
|
import sys
|
|
24
|
+
import logging
|
|
25
|
+
from datetime import datetime
|
|
26
|
+
from pathlib import Path
|
|
10
27
|
from dotenv import load_dotenv
|
|
11
28
|
|
|
12
29
|
load_dotenv()
|
|
13
30
|
|
|
31
|
+
# Configure logging
|
|
32
|
+
logging.basicConfig(level=logging.INFO)
|
|
33
|
+
logger = logging.getLogger(__name__)
|
|
34
|
+
|
|
14
35
|
class OutputSchemaItemRequired(TypedDict):
|
|
15
36
|
name: str
|
|
16
37
|
type: str # 'string' | 'number'
|
|
@@ -20,6 +41,95 @@ class OutputSchemaItem(OutputSchemaItemRequired, total=False):
|
|
|
20
41
|
required: bool
|
|
21
42
|
|
|
22
43
|
|
|
44
|
+
class ScreenshotCapture:
|
|
45
|
+
"""Simple screenshot capture class that takes screenshots at step end and uploads to S3"""
|
|
46
|
+
|
|
47
|
+
def __init__(self, config: Optional[Dict[str, Any]] = None):
|
|
48
|
+
self.config = config or {}
|
|
49
|
+
|
|
50
|
+
# Import boto3 only when screenshot capture is needed
|
|
51
|
+
try:
|
|
52
|
+
import boto3
|
|
53
|
+
from botocore.exceptions import ClientError
|
|
54
|
+
self.boto3 = boto3
|
|
55
|
+
self.ClientError = ClientError
|
|
56
|
+
except ImportError:
|
|
57
|
+
raise ImportError(
|
|
58
|
+
"boto3 is required for screenshot capture. "
|
|
59
|
+
"Please install it with: uv pip install boto3 "
|
|
60
|
+
"or run: npx minded setup-local-operator"
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
# S3 configuration with defaults
|
|
64
|
+
self.s3_bucket = self.config.get('s3_bucket', os.getenv('SCREENSHOT_S3_BUCKET', 'global-development-agentsforce'))
|
|
65
|
+
self.s3_prefix = self.config.get('s3_prefix', os.getenv('SCREENSHOT_S3_PREFIX', 'browser-use-runs-screenshots/'))
|
|
66
|
+
|
|
67
|
+
# AWS region configuration
|
|
68
|
+
self.aws_region = self.config.get('aws_region', os.getenv('AWS_REGION', 'us-east-1'))
|
|
69
|
+
|
|
70
|
+
# Ensure prefix ends with slash
|
|
71
|
+
if not self.s3_prefix.endswith('/'):
|
|
72
|
+
self.s3_prefix += '/'
|
|
73
|
+
|
|
74
|
+
# Get session ID from config or generate one
|
|
75
|
+
self.session_id = self.config.get('session_id', datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:-3])
|
|
76
|
+
|
|
77
|
+
# Initialize S3 client with region
|
|
78
|
+
self.s3_client = self.boto3.client('s3', region_name=self.aws_region)
|
|
79
|
+
|
|
80
|
+
# Track step counter
|
|
81
|
+
self.step_counter = 0
|
|
82
|
+
|
|
83
|
+
logger.info(f"📸 Screenshot capture initialized - S3: s3://{self.s3_bucket}/{self.s3_prefix}")
|
|
84
|
+
logger.info(f" Session ID: {self.session_id}, Region: {self.aws_region}")
|
|
85
|
+
|
|
86
|
+
async def capture_screenshot(self, agent: Any) -> None:
|
|
87
|
+
"""Capture screenshot at step end and upload to S3"""
|
|
88
|
+
try:
|
|
89
|
+
# Get current page
|
|
90
|
+
page = await agent.browser_session.get_current_page()
|
|
91
|
+
|
|
92
|
+
# Get current URL for context
|
|
93
|
+
current_url = page.url
|
|
94
|
+
logger.info(f"📸 Taking step_end screenshot at: {current_url}")
|
|
95
|
+
|
|
96
|
+
# Update step counter
|
|
97
|
+
step_number = self.step_counter
|
|
98
|
+
self.step_counter += 1
|
|
99
|
+
|
|
100
|
+
# Take screenshot (viewport only)
|
|
101
|
+
screenshot_bytes = await page.screenshot(full_page=False)
|
|
102
|
+
|
|
103
|
+
# Generate filename with metadata
|
|
104
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:-3]
|
|
105
|
+
filename = f"{self.session_id}/step_{step_number:04d}_{timestamp}.png"
|
|
106
|
+
|
|
107
|
+
# Upload to S3
|
|
108
|
+
s3_key = f"{self.s3_prefix}{filename}"
|
|
109
|
+
|
|
110
|
+
try:
|
|
111
|
+
# Upload with KMS encryption if required by bucket
|
|
112
|
+
self.s3_client.put_object(
|
|
113
|
+
Bucket=self.s3_bucket,
|
|
114
|
+
Key=s3_key,
|
|
115
|
+
Body=screenshot_bytes,
|
|
116
|
+
ContentType='image/png',
|
|
117
|
+
ServerSideEncryption='aws:kms',
|
|
118
|
+
Tagging='retention=30d'
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
s3_url = f"s3://{self.s3_bucket}/{s3_key}"
|
|
122
|
+
logger.info(f"✅ Screenshot uploaded: {s3_url}")
|
|
123
|
+
|
|
124
|
+
except self.ClientError as e:
|
|
125
|
+
logger.error(f"❌ Failed to upload screenshot to S3: {str(e)}")
|
|
126
|
+
# Continue execution even if screenshot upload fails
|
|
127
|
+
|
|
128
|
+
except Exception as e:
|
|
129
|
+
logger.error(f"❌ Error capturing screenshot: {str(e)}")
|
|
130
|
+
# Don't raise - continue execution
|
|
131
|
+
|
|
132
|
+
|
|
23
133
|
def create_pydantic_model_from_schema(output_schema: Optional[List[Dict[str, Any]]]) -> Optional[type[BaseModel]]:
|
|
24
134
|
if not output_schema:
|
|
25
135
|
return None
|
|
@@ -43,7 +153,8 @@ def create_pydantic_model_from_schema(output_schema: Optional[List[Dict[str, Any
|
|
|
43
153
|
return None
|
|
44
154
|
|
|
45
155
|
|
|
46
|
-
async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Optional[str] = None,
|
|
156
|
+
async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Optional[str] = None,
|
|
157
|
+
otp_secret: Optional[str] = None, screenshot_config: Optional[Dict[str, Any]] = None):
|
|
47
158
|
llm = ChatOpenAI(
|
|
48
159
|
model="gpt-4.1",
|
|
49
160
|
api_key=os.getenv("OPENAI_API_KEY"),
|
|
@@ -60,6 +171,22 @@ async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Opt
|
|
|
60
171
|
browser_profile=BrowserProfile(downloads_path=folder_path),
|
|
61
172
|
cdp_url=cdp_url
|
|
62
173
|
)
|
|
174
|
+
|
|
175
|
+
# Initialize screenshot capture if enabled
|
|
176
|
+
screenshot_capture = None
|
|
177
|
+
on_step_end_hook = None
|
|
178
|
+
|
|
179
|
+
if screenshot_config and screenshot_config.get('enabled', False):
|
|
180
|
+
logger.info("📸 Screenshot capture enabled (captures at step end)")
|
|
181
|
+
# Add session_id to config
|
|
182
|
+
screenshot_config['session_id'] = session_id
|
|
183
|
+
screenshot_capture = ScreenshotCapture(screenshot_config)
|
|
184
|
+
|
|
185
|
+
# Create hook function for step end only
|
|
186
|
+
async def on_step_end(agent: Any) -> None:
|
|
187
|
+
await screenshot_capture.capture_screenshot(agent)
|
|
188
|
+
|
|
189
|
+
on_step_end_hook = on_step_end
|
|
63
190
|
|
|
64
191
|
output_schema = None
|
|
65
192
|
if output_schema_json:
|
|
@@ -99,7 +226,11 @@ async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Opt
|
|
|
99
226
|
available_file_paths=available_files,
|
|
100
227
|
browser_session=browser_session,
|
|
101
228
|
)
|
|
102
|
-
|
|
229
|
+
|
|
230
|
+
# Run agent with screenshot hook if configured
|
|
231
|
+
history = await agent.run(
|
|
232
|
+
on_step_end=on_step_end_hook
|
|
233
|
+
)
|
|
103
234
|
final_result = history.final_result()
|
|
104
235
|
|
|
105
236
|
# Parse result with output model if provided
|
|
@@ -143,11 +274,12 @@ if __name__ == '__main__':
|
|
|
143
274
|
task = payload.get('task')
|
|
144
275
|
output_schema = payload.get('outputSchema')
|
|
145
276
|
otp_secret = payload.get('otpSecret')
|
|
277
|
+
screenshot_config = payload.get('screenshotConfig')
|
|
146
278
|
|
|
147
279
|
if not session_id or not cdp_url or not task:
|
|
148
280
|
raise SystemExit("Missing required fields in JSON payload: sessionId, cdpUrl, task")
|
|
149
281
|
|
|
150
282
|
output_schema_json = json.dumps(output_schema) if output_schema is not None else None
|
|
151
|
-
asyncio.run(main(session_id, cdp_url, task, output_schema_json, otp_secret))
|
|
283
|
+
asyncio.run(main(session_id, cdp_url, task, output_schema_json, otp_secret, screenshot_config))
|
|
152
284
|
else:
|
|
153
285
|
raise SystemExit("Usage: uv run executeBrowserTask.py; send a JSON payload via stdin")
|
|
@@ -114,14 +114,18 @@ export const destroyBrowserSession = async ({
|
|
|
114
114
|
|
|
115
115
|
export const invokeBrowserTask = async (options: InvokeBrowserTaskOptions): Promise<InvokeBrowserTaskResponse> => {
|
|
116
116
|
try {
|
|
117
|
-
const { sessionId, cdpUrl, task, keepAlive, hooks, browserTaskMode, toolSchemas, outputSchema } = options;
|
|
117
|
+
const { sessionId, cdpUrl, task, keepAlive, hooks, browserTaskMode, toolSchemas, outputSchema, screenshotConfig } = options;
|
|
118
118
|
|
|
119
119
|
if (browserTaskMode === BrowserTaskMode.LOCAL) {
|
|
120
120
|
validateLocalOperatorSetup();
|
|
121
121
|
const pythonScriptPath = path.resolve(__dirname, 'executeBrowserTask.py');
|
|
122
122
|
|
|
123
123
|
const args = ['run', pythonScriptPath];
|
|
124
|
-
logger.info({
|
|
124
|
+
logger.info({
|
|
125
|
+
message: 'Spawning Python process',
|
|
126
|
+
args,
|
|
127
|
+
screenshotEnabled: screenshotConfig?.enabled || false,
|
|
128
|
+
});
|
|
125
129
|
|
|
126
130
|
const child = spawn('uv', args, {
|
|
127
131
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
@@ -141,6 +145,7 @@ export const invokeBrowserTask = async (options: InvokeBrowserTaskOptions): Prom
|
|
|
141
145
|
task,
|
|
142
146
|
outputSchema,
|
|
143
147
|
otpSecret: process.env.OTP_SECRET,
|
|
148
|
+
screenshotConfig,
|
|
144
149
|
};
|
|
145
150
|
|
|
146
151
|
// Write JSON payload to stdin
|
|
@@ -214,6 +219,7 @@ export const invokeBrowserTask = async (options: InvokeBrowserTaskOptions): Prom
|
|
|
214
219
|
hooksCount: hooks?.length || 0,
|
|
215
220
|
onPrem: browserTaskMode === BrowserTaskMode.ON_PREM,
|
|
216
221
|
outputSchemaFields: outputSchema?.length || 0,
|
|
222
|
+
screenshotEnabled: screenshotConfig?.enabled || false,
|
|
217
223
|
});
|
|
218
224
|
|
|
219
225
|
const response = await mindedConnection.awaitEmit<InvokeBrowserTaskRequest, InvokeBrowserTaskResponse>(
|
package/src/browserTask/types.ts
CHANGED
|
@@ -25,6 +25,13 @@ export type ToolSchema = {
|
|
|
25
25
|
}>;
|
|
26
26
|
};
|
|
27
27
|
|
|
28
|
+
export type ScreenshotConfig = {
|
|
29
|
+
enabled: boolean;
|
|
30
|
+
s3_bucket?: string;
|
|
31
|
+
s3_prefix?: string;
|
|
32
|
+
aws_region?: string;
|
|
33
|
+
};
|
|
34
|
+
|
|
28
35
|
export interface InvokeBrowserTaskOptions {
|
|
29
36
|
sessionId: string;
|
|
30
37
|
cdpUrl: string;
|
|
@@ -34,4 +41,5 @@ export interface InvokeBrowserTaskOptions {
|
|
|
34
41
|
browserTaskMode: BrowserTaskMode;
|
|
35
42
|
toolSchemas?: ToolSchema[];
|
|
36
43
|
outputSchema?: OutputSchemaField[];
|
|
37
|
-
|
|
44
|
+
screenshotConfig?: ScreenshotConfig;
|
|
45
|
+
}
|
|
@@ -27,9 +27,9 @@ const REQUIRED_PACKAGES: SetupPackage[] = [
|
|
|
27
27
|
checkCommand: 'python3.12 --version',
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
|
-
name: 'browser-use',
|
|
31
|
-
description: 'Browser automation library',
|
|
32
|
-
command: 'uv pip install browser-use',
|
|
30
|
+
name: 'browser-use & boto3',
|
|
31
|
+
description: 'Browser automation library and AWS S3 SDK for screenshots',
|
|
32
|
+
command: 'uv pip install browser-use boto3',
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
35
|
name: 'Playwright Chromium',
|
|
@@ -200,12 +200,12 @@ export async function setupLocalOperator(skipPrompt: boolean = false): Promise<v
|
|
|
200
200
|
execSync(`uv venv --python 3.12 ${VENV_DIR}`, { stdio: 'inherit' });
|
|
201
201
|
console.log('✓ Virtual environment created');
|
|
202
202
|
|
|
203
|
-
// Install browser-use in the venv
|
|
204
|
-
console.log('Installing browser-use
|
|
205
|
-
execSync(`uv pip install --python ${path.join(process.cwd(), VENV_DIR, 'bin', 'python')} browser-use`, {
|
|
203
|
+
// Install browser-use and boto3 in the venv
|
|
204
|
+
console.log('Installing browser-use and boto3 packages...');
|
|
205
|
+
execSync(`uv pip install --python ${path.join(process.cwd(), VENV_DIR, 'bin', 'python')} browser-use boto3`, {
|
|
206
206
|
stdio: 'inherit',
|
|
207
207
|
});
|
|
208
|
-
console.log('✓ browser-use installed');
|
|
208
|
+
console.log('✓ browser-use and boto3 installed');
|
|
209
209
|
|
|
210
210
|
// Install Playwright Chromium
|
|
211
211
|
console.log('Installing Playwright Chromium browser...');
|
|
@@ -8,6 +8,7 @@ import { createHistoryStep } from '../utils/history';
|
|
|
8
8
|
import { HistoryStep } from '../types/Agent.types';
|
|
9
9
|
import { v4 as uuidv4 } from 'uuid';
|
|
10
10
|
import { invokeBrowserTask } from '../browserTask/executeBrowserTask';
|
|
11
|
+
import { ScreenshotConfig } from '../browserTask/types';
|
|
11
12
|
import { zodSchemaToParams } from '../platform/utils/tools';
|
|
12
13
|
import { getConfig } from '../platform/config';
|
|
13
14
|
import { compilePrompt } from './compilePrompt';
|
|
@@ -55,6 +56,42 @@ export const addBrowserTaskRunNode = async ({ graph, browserTaskNode, attachedTo
|
|
|
55
56
|
const promptCompiledWithEnv = compilePrompt(prompt, { env: process.env });
|
|
56
57
|
|
|
57
58
|
const { browserTaskMode } = getConfig();
|
|
59
|
+
|
|
60
|
+
// Build screenshot config conditionally based on environment variables
|
|
61
|
+
const screenshotConfig = (() => {
|
|
62
|
+
// Only enable screenshots if S3 bucket is configured or explicitly enabled
|
|
63
|
+
const screenshotEnabled = process.env.ENABLE_BROWSER_SCREENSHOTS === 'true' || !!process.env.SCREENSHOT_S3_BUCKET;
|
|
64
|
+
|
|
65
|
+
if (!screenshotEnabled) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Screenshots enabled - build config
|
|
70
|
+
const config: ScreenshotConfig = {
|
|
71
|
+
enabled: true,
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// Add optional S3 configuration if provided
|
|
75
|
+
if (process.env.SCREENSHOT_S3_BUCKET) {
|
|
76
|
+
config.s3_bucket = process.env.SCREENSHOT_S3_BUCKET;
|
|
77
|
+
}
|
|
78
|
+
if (process.env.SCREENSHOT_S3_PREFIX) {
|
|
79
|
+
config.s3_prefix = process.env.SCREENSHOT_S3_PREFIX;
|
|
80
|
+
}
|
|
81
|
+
if (process.env.AWS_REGION) {
|
|
82
|
+
config.aws_region = process.env.AWS_REGION;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
logger.debug({
|
|
86
|
+
msg: 'Screenshot configuration enabled',
|
|
87
|
+
bucket: config.s3_bucket || 'default',
|
|
88
|
+
prefix: config.s3_prefix || 'default',
|
|
89
|
+
region: config.aws_region || 'default',
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
return config;
|
|
93
|
+
})();
|
|
94
|
+
|
|
58
95
|
// Invoke browser task via socket
|
|
59
96
|
const result = await invokeBrowserTask({
|
|
60
97
|
sessionId,
|
|
@@ -65,6 +102,7 @@ export const addBrowserTaskRunNode = async ({ graph, browserTaskNode, attachedTo
|
|
|
65
102
|
browserTaskMode,
|
|
66
103
|
toolSchemas,
|
|
67
104
|
outputSchema,
|
|
105
|
+
screenshotConfig,
|
|
68
106
|
});
|
|
69
107
|
|
|
70
108
|
logger.debug({
|