@minded-ai/mindedjs 2.0.25-beta.7 → 2.0.26-beta.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"executeBrowserTask.d.ts","sourceRoot":"","sources":["../../src/browserTask/executeBrowserTask.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,4BAA4B,EAC5B,yBAAyB,EAIzB,6BAA6B,EAC9B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAKpE,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,CAiCvC,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,CA2BxC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,SAAS,wBAAwB,KAAG,OAAO,CAAC,yBAAyB,CAgK5G,CAAC"}
1
+ {"version":3,"file":"executeBrowserTask.d.ts","sourceRoot":"","sources":["../../src/browserTask/executeBrowserTask.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,4BAA4B,EAC5B,yBAAyB,EAIzB,6BAA6B,EAC9B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAiFpE,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,CAsDvC,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,CAiL5G,CAAC"}
@@ -14,11 +14,102 @@ const localBrowserTask_1 = require("./localBrowserTask");
14
14
  const types_1 = require("./types");
15
15
  const localOperatorSetup_1 = require("../cli/localOperatorSetup");
16
16
  const config_1 = require("../platform/config");
17
+ const chrome_remote_interface_1 = __importDefault(require("chrome-remote-interface"));
18
+ const CookieStore_1 = require("./CookieStore");
19
+ // Map to track sessionId to instanceId for local browser sessions
20
+ const localSessionInstances = new Map();
21
+ // Map to track CDP clients for cookie management
22
+ const cdpClients = new Map();
23
+ // Initialize cookie store
24
+ const cookieStore = new CookieStore_1.CookieStore(path_1.default.join(process.cwd(), 'local_storage', 'cookies'));
25
+ // Helper function to extract port from CDP URL
26
+ const extractPortFromCdpUrl = (cdpUrl) => {
27
+ try {
28
+ const match = cdpUrl.match(/:(\d+)/);
29
+ return match ? parseInt(match[1], 10) : null;
30
+ }
31
+ catch (_a) {
32
+ return null;
33
+ }
34
+ };
35
+ // Helper function to load cookies for a session
36
+ const loadCookiesForSession = async (sessionId) => {
37
+ const stored = await cookieStore.load();
38
+ if (!stored || stored.length === 0) {
39
+ logger_1.logger.info({ message: 'No stored cookies to load', sessionId });
40
+ return;
41
+ }
42
+ const cdp = cdpClients.get(sessionId);
43
+ if (!cdp) {
44
+ logger_1.logger.warn({ message: 'No CDP client found for session', sessionId });
45
+ return;
46
+ }
47
+ try {
48
+ await cdp.Network.setCookies({ cookies: stored });
49
+ logger_1.logger.info({ message: 'Loaded cookies into browser session', sessionId, count: stored.length });
50
+ }
51
+ catch (error) {
52
+ logger_1.logger.warn({ message: 'Failed to set cookies via CDP', sessionId, error });
53
+ }
54
+ };
55
+ // Helper function to save cookies for a session
56
+ const saveCookiesForSession = async (sessionId) => {
57
+ try {
58
+ const cdp = cdpClients.get(sessionId);
59
+ if (!cdp) {
60
+ logger_1.logger.warn({ message: 'No CDP client found for session', sessionId });
61
+ return;
62
+ }
63
+ const result = await cdp.Network.getAllCookies();
64
+ if (result) {
65
+ await cookieStore.save(result.cookies);
66
+ logger_1.logger.info({ message: 'Saved cookies from browser session', sessionId, count: result.cookies.length });
67
+ }
68
+ else {
69
+ logger_1.logger.warn({ message: 'No cookies found in browser session', sessionId });
70
+ }
71
+ }
72
+ catch (error) {
73
+ logger_1.logger.warn({ message: 'Failed to get/save cookies from session', sessionId, error: JSON.stringify(error) });
74
+ }
75
+ };
76
+ // Helper function to cleanup CDP client
77
+ const cleanupCdpClient = async (sessionId) => {
78
+ const cdp = cdpClients.get(sessionId);
79
+ if (cdp) {
80
+ try {
81
+ await cdp.close();
82
+ }
83
+ catch (error) {
84
+ logger_1.logger.warn({ message: 'Failed to close CDP client', sessionId, error });
85
+ }
86
+ cdpClients.delete(sessionId);
87
+ }
88
+ };
17
89
  // Socket-based browser task functions
18
90
  const createBrowserSession = async ({ sessionId, proxy, browserTaskMode, }) => {
19
91
  logger_1.logger.debug({ msg: 'Creating browser session via socket', proxy });
20
92
  if (browserTaskMode === types_1.BrowserTaskMode.LOCAL) {
21
- const { cdpUrl } = await (0, localBrowserTask_1.getOrStartLocalCDP)({ headless: false });
93
+ const { cdpUrl, instanceId } = await (0, localBrowserTask_1.getOrStartLocalCDP)({ headless: false });
94
+ // Store the mapping for cleanup later
95
+ localSessionInstances.set(sessionId, instanceId);
96
+ const port = extractPortFromCdpUrl(cdpUrl);
97
+ if (!port) {
98
+ logger_1.logger.warn({ message: 'Failed to extract port from CDP URL', sessionId, cdpUrl });
99
+ }
100
+ else {
101
+ const cdp = await (0, chrome_remote_interface_1.default)({ host: 'localhost', port });
102
+ await cdp.Network.enable();
103
+ cdpClients.set(sessionId, cdp);
104
+ logger_1.logger.info({ message: 'Created CDP client for session', sessionId, port });
105
+ }
106
+ // Load cookies for this session (best-effort)
107
+ try {
108
+ await loadCookiesForSession(sessionId);
109
+ }
110
+ catch (error) {
111
+ logger_1.logger.warn({ message: 'Failed to load cookies for session', sessionId, error });
112
+ }
22
113
  return {
23
114
  sessionId,
24
115
  cdpUrl,
@@ -43,8 +134,18 @@ const createBrowserSession = async ({ sessionId, proxy, browserTaskMode, }) => {
43
134
  exports.createBrowserSession = createBrowserSession;
44
135
  const destroyBrowserSession = async ({ sessionId, onPrem, localRun, }) => {
45
136
  logger_1.logger.debug({ msg: 'Destroying browser session via socket', sessionId, onPrem });
46
- if (localRun) {
47
- await (0, localBrowserTask_1.kill)();
137
+ if (localRun || process.env.BROWSER_TASK_MODE === types_1.BrowserTaskMode.LOCAL) {
138
+ // Kill specific instance if we have the mapping
139
+ const instanceId = localSessionInstances.get(sessionId);
140
+ if (instanceId) {
141
+ await (0, localBrowserTask_1.kill)(instanceId);
142
+ localSessionInstances.delete(sessionId);
143
+ }
144
+ else {
145
+ // Fallback to killing all if no specific instance found
146
+ logger_1.logger.warn({ msg: 'No instance ID found for session, killing all instances', sessionId });
147
+ await (0, localBrowserTask_1.kill)();
148
+ }
48
149
  return {
49
150
  success: true,
50
151
  };
@@ -65,7 +166,7 @@ exports.destroyBrowserSession = destroyBrowserSession;
65
166
  const invokeBrowserTask = async (options) => {
66
167
  var _a, _b, _c;
67
168
  try {
68
- const { sessionId, cdpUrl, task, keepAlive, hooks, browserTaskMode, toolSchemas, outputSchema } = options;
169
+ const { sessionId, cdpUrl, task, keepAlive, hooks, browserTaskMode, toolSchemas, outputSchema, screenshotConfig, toolCallId } = options;
69
170
  const { isDeployed } = (0, config_1.getConfig)();
70
171
  if (browserTaskMode === types_1.BrowserTaskMode.LOCAL) {
71
172
  if (!isDeployed) {
@@ -75,7 +176,10 @@ const invokeBrowserTask = async (options) => {
75
176
  // Calculate folder path for downloads
76
177
  const folderPath = path_1.default.join(__dirname, `downloads_${sessionId}`);
77
178
  const args = ['run', pythonScriptPath];
78
- logger_1.logger.info({ message: 'Spawning Python process', args });
179
+ logger_1.logger.info({
180
+ message: 'Spawning Python process',
181
+ args,
182
+ });
79
183
  const child = (0, node_child_process_1.spawn)('uv', args, {
80
184
  stdio: ['pipe', 'pipe', 'pipe'],
81
185
  env: (0, localOperatorSetup_1.isLocalOperatorSetup)()
@@ -93,7 +197,9 @@ const invokeBrowserTask = async (options) => {
93
197
  task,
94
198
  outputSchema,
95
199
  otpSecret: process.env.TOTP_SECRET,
200
+ screenshotConfig,
96
201
  folderPath,
202
+ toolCallId,
97
203
  };
98
204
  // Write JSON payload to stdin
99
205
  child.stdin.write(JSON.stringify(payload));
@@ -146,13 +252,24 @@ const invokeBrowserTask = async (options) => {
146
252
  if ((0, fs_1.existsSync)(folderPath)) {
147
253
  try {
148
254
  const files = (0, fs_1.readdirSync)(folderPath);
149
- downloadedFiles = files.map(file => path_1.default.join(folderPath, file));
255
+ downloadedFiles = files.map((file) => path_1.default.join(folderPath, file));
150
256
  logger_1.logger.debug({ message: 'Found downloaded files', count: downloadedFiles.length, files: downloadedFiles });
151
257
  }
152
258
  catch (error) {
153
259
  logger_1.logger.error({ message: 'Failed to read downloads folder', error });
154
260
  }
155
261
  }
262
+ // Save cookies after task completes (best-effort)
263
+ try {
264
+ await saveCookiesForSession(sessionId);
265
+ }
266
+ catch (error) {
267
+ logger_1.logger.warn({ message: 'Failed to save cookies after task completion', sessionId, error });
268
+ }
269
+ // If not keeping alive, cleanup CDP client
270
+ if (!keepAlive) {
271
+ await cleanupCdpClient(sessionId);
272
+ }
156
273
  return {
157
274
  result,
158
275
  steps: [],
@@ -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,10 @@
1
+ """
2
+ Browser Task Executor with Screenshot Capture Support
3
+
4
+ This script runs browser automation tasks using browser-use and can capture
5
+ screenshots at the end of each step, uploading them to S3 when configured.
6
+ """
7
+
1
8
  import asyncio
2
9
  import json
3
10
  from typing import List, Optional, Dict, Any, TypedDict
@@ -7,10 +14,18 @@ from browser_use.browser import BrowserProfile, BrowserSession
7
14
  from browser_use.llm import ChatOpenAI
8
15
  import os
9
16
  import sys
17
+ import logging
18
+ import base64
19
+ from datetime import datetime
20
+ from pathlib import Path
10
21
  from dotenv import load_dotenv
11
22
 
12
23
  load_dotenv()
13
24
 
25
+ # Configure logging
26
+ logging.basicConfig(level=logging.INFO)
27
+ logger = logging.getLogger(__name__)
28
+
14
29
  class OutputSchemaItemRequired(TypedDict):
15
30
  name: str
16
31
  type: str # 'string' | 'number'
@@ -20,6 +35,227 @@ class OutputSchemaItem(OutputSchemaItemRequired, total=False):
20
35
  required: bool
21
36
 
22
37
 
38
+ class ScreenshotCapture:
39
+ """Simple screenshot capture class that takes screenshots at step end and uploads to S3"""
40
+
41
+ def __init__(self, config: Optional[Dict[str, Any]] = None):
42
+ self.config = config or {}
43
+
44
+ # Import boto3 only when screenshot capture is needed
45
+ try:
46
+ import boto3
47
+ from botocore.exceptions import ClientError
48
+ self.boto3 = boto3
49
+ self.ClientError = ClientError
50
+ except ImportError:
51
+ raise ImportError(
52
+ "boto3 is required for screenshot capture. "
53
+ "Please install it with: uv pip install boto3 "
54
+ "or run: npx minded setup-local-operator"
55
+ )
56
+
57
+ # S3 configuration with defaults
58
+ self.s3_bucket = self.config.get('s3_bucket')
59
+ self.s3_prefix = self.config.get('s3_prefix')
60
+
61
+ # AWS region configuration
62
+ self.aws_region = self.config.get('aws_region')
63
+
64
+ # Ensure prefix ends with slash
65
+ if not self.s3_prefix.endswith('/'):
66
+ self.s3_prefix += '/'
67
+
68
+ # Get session ID from config or generate one
69
+ self.session_id = self.config.get('session_id', datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:-3])
70
+
71
+ # Initialize S3 client with region
72
+ self.s3_client = self.boto3.client('s3', region_name=self.aws_region)
73
+
74
+ # Track step counter
75
+ self.step_counter = 0
76
+
77
+ logger.info(f"📸 Screenshot capture ENABLED - will capture at end of each step")
78
+ logger.info(f" S3 destination: s3://{self.s3_bucket}/{self.s3_prefix}")
79
+ logger.info(f" Session ID: {self.session_id}")
80
+ logger.info(f" AWS Region: {self.aws_region}")
81
+
82
+ async def capture_screenshot(self, agent: Any) -> None:
83
+ """Capture screenshot at step end and upload to S3"""
84
+ try:
85
+ # Get current page
86
+ page = await agent.browser_session.get_current_page()
87
+
88
+ # Get current URL for logging (browser-use might use method instead of property)
89
+ try:
90
+ current_url = page.url if hasattr(page, 'url') else page.url()
91
+ except:
92
+ current_url = "unknown"
93
+
94
+ # Update step counter
95
+ step_number = self.step_counter
96
+ self.step_counter += 1
97
+
98
+ logger.info(f"📸 Capturing screenshot #{step_number} at: {current_url}")
99
+
100
+ # Take screenshot - browser-use takes viewport by default
101
+ screenshot_data = await page.screenshot()
102
+
103
+ # Ensure we have bytes - browser-use might return base64 string or bytes
104
+ if isinstance(screenshot_data, bytes):
105
+ screenshot_bytes = screenshot_data
106
+ elif isinstance(screenshot_data, str):
107
+ # If it's base64 encoded string, decode it
108
+ screenshot_bytes = base64.b64decode(screenshot_data)
109
+ else:
110
+ # Try to get bytes from whatever format it is
111
+ screenshot_bytes = bytes(screenshot_data)
112
+
113
+ # Generate filename with metadata
114
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:-3]
115
+ filename = f"{self.session_id}/step_{step_number:04d}_{timestamp}.png"
116
+
117
+ # Upload to S3
118
+ s3_key = f"{self.s3_prefix}{filename}"
119
+
120
+ try:
121
+ # Verify we have valid data before uploading
122
+ if not screenshot_bytes or len(screenshot_bytes) == 0:
123
+ logger.error(f"❌ Screenshot bytes are empty!")
124
+ return
125
+
126
+ # Upload to S3 with KMS encryption
127
+ self.s3_client.put_object(
128
+ Bucket=self.s3_bucket,
129
+ Key=s3_key,
130
+ Body=screenshot_bytes,
131
+ ContentType='image/png',
132
+ ServerSideEncryption='aws:kms',
133
+ Tagging='retention=30d'
134
+ )
135
+
136
+ s3_url = f"s3://{self.s3_bucket}/{s3_key}"
137
+ logger.info(f"✅ Screenshot uploaded: {s3_url} (step {step_number}, size: {len(screenshot_bytes)} bytes)")
138
+
139
+ except self.ClientError as e:
140
+ logger.error(f"❌ Failed to upload screenshot #{step_number} to S3")
141
+ logger.error(f" Error: {str(e)}")
142
+ logger.error(f" Bucket: {self.s3_bucket}, Key: {s3_key}")
143
+ # Continue execution even if screenshot upload fails
144
+
145
+ except Exception as e:
146
+ step_num = getattr(self, 'step_counter', 'unknown')
147
+ logger.error(f"❌ Error capturing screenshot #{step_num}: {str(e)}")
148
+ # Don't raise - continue execution
149
+
150
+
151
+ class LogsCapture:
152
+ """Logs capture class that saves browser-use history logs to S3"""
153
+
154
+ def __init__(self, config: Optional[Dict[str, Any]] = None):
155
+ self.config = config or {}
156
+
157
+ # Import boto3 only when logs capture is needed
158
+ try:
159
+ import boto3
160
+ from botocore.exceptions import ClientError
161
+ self.boto3 = boto3
162
+ self.ClientError = ClientError
163
+ except ImportError:
164
+ raise ImportError(
165
+ "boto3 is required for logs capture. "
166
+ "Please install it with: uv pip install boto3 "
167
+ "or run: npx minded setup-local-operator"
168
+ )
169
+
170
+ # S3 configuration
171
+ self.s3_bucket = self.config.get('s3_bucket')
172
+ self.s3_prefix = self.config.get('s3_prefix')
173
+
174
+ # AWS region configuration
175
+ self.aws_region = self.config.get('aws_region')
176
+
177
+ # Ensure prefix ends with slash
178
+ if not self.s3_prefix.endswith('/'):
179
+ self.s3_prefix += '/'
180
+
181
+ # Get session ID and tool call ID from config
182
+ self.session_id = self.config.get('session_id', datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:-3])
183
+ self.tool_call_id = self.config.get('tool_call_id', 'unknown')
184
+
185
+ # Initialize S3 client with region
186
+ self.s3_client = self.boto3.client('s3', region_name=self.aws_region)
187
+
188
+ # Track accumulated logs
189
+ self.log_entries: List[str] = []
190
+ self.step_counter = 0
191
+
192
+ logger.info(f"📝 Logs capture ENABLED - will save history logs periodically")
193
+ logger.info(f" S3 destination: s3://{self.s3_bucket}/{self.s3_prefix}")
194
+ logger.info(f" Session ID: {self.session_id}")
195
+ logger.info(f" Tool Call ID: {self.tool_call_id}")
196
+ logger.info(f" AWS Region: {self.aws_region}")
197
+
198
+ async def capture_logs(self, agent: Any) -> None:
199
+ """Capture logs at step end and upload to S3"""
200
+ try:
201
+ step_number = self.step_counter
202
+ self.step_counter += 1
203
+
204
+ # Get history object from agent
205
+ history = agent.history
206
+
207
+ # Extract model outputs if available
208
+ try:
209
+ model_outputs = history.model_outputs() if hasattr(history, 'model_outputs') else []
210
+ for model_output in model_outputs:
211
+ print(f"model_output")
212
+ if hasattr(model_output, 'current_state'):
213
+ print(f"model_output.current_state")
214
+ if model_output.current_state.thinking:
215
+ self.log_entries.append('💡 Thinking: ' + model_output.current_state.thinking)
216
+ if model_output.current_state.memory:
217
+ self.log_entries.append('🧠 Memory: ' + model_output.current_state.memory)
218
+ if model_output.current_state.next_goal:
219
+ self.log_entries.append('🎯 Next goal: ' + model_output.current_state.next_goal)
220
+ print("Finished adding log entries")
221
+ except Exception as e:
222
+ logger.warning(f"Could not extract model outputs: {e}")
223
+
224
+ print(f"self.log_entries count: {len(self.log_entries)}")
225
+
226
+ # Upload to S3
227
+ s3_key = f"{self.s3_prefix}{self.session_id}/{self.tool_call_id}/operator.log"
228
+
229
+ try:
230
+ # Convert logs to JSON string
231
+ logs_json = json.dumps(self.log_entries, indent=2, default=str)
232
+ logs_bytes = logs_json.encode('utf-8')
233
+
234
+ # Upload to S3 with KMS encryption
235
+ self.s3_client.put_object(
236
+ Bucket=self.s3_bucket,
237
+ Key=s3_key,
238
+ Body=logs_bytes,
239
+ ContentType='application/json',
240
+ ServerSideEncryption='aws:kms',
241
+ Tagging='retention=30d'
242
+ )
243
+
244
+ s3_url = f"s3://{self.s3_bucket}/{s3_key}"
245
+ logger.info(f"✅ Logs uploaded: {s3_url} (step {step_number}, size: {len(logs_bytes)} bytes, total entries: {len(self.log_entries)})")
246
+
247
+ except self.ClientError as e:
248
+ logger.error(f"❌ Failed to upload logs for step #{step_number} to S3")
249
+ logger.error(f" Error: {str(e)}")
250
+ logger.error(f" Bucket: {self.s3_bucket}, Key: {s3_key}")
251
+ # Continue execution even if logs upload fails
252
+
253
+ except Exception as e:
254
+ step_num = getattr(self, 'step_counter', 'unknown')
255
+ logger.error(f"❌ Error capturing logs #{step_num}: {str(e)}")
256
+ # Don't raise - continue execution
257
+
258
+
23
259
  def create_pydantic_model_from_schema(output_schema: Optional[List[Dict[str, Any]]]) -> Optional[type[BaseModel]]:
24
260
  if not output_schema:
25
261
  return None
@@ -43,7 +279,8 @@ def create_pydantic_model_from_schema(output_schema: Optional[List[Dict[str, Any
43
279
  return None
44
280
 
45
281
 
46
- async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Optional[str] = None, otp_secret: Optional[str] = None, folder_path: str = None):
282
+ async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Optional[str] = None,
283
+ otp_secret: Optional[str] = None, screenshot_config: Optional[Dict[str, Any]] = None, folder_path: str = None, tool_call_id: Optional[str] = None):
47
284
  llm = ChatOpenAI(
48
285
  model="gpt-4.1",
49
286
  api_key=os.getenv("OPENAI_API_KEY"),
@@ -59,6 +296,48 @@ async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Opt
59
296
  browser_profile=BrowserProfile(downloads_path=folder_path),
60
297
  cdp_url=cdp_url
61
298
  )
299
+
300
+ # Initialize screenshot capture if enabled
301
+ screenshot_capture = None
302
+ logs_capture = None
303
+ on_step_end_hook = None
304
+
305
+ if screenshot_config:
306
+ logger.info("-" * 50)
307
+ logger.info("🎯 Initializing screenshot capture for browser task")
308
+ logger.info(f" Session: {session_id}")
309
+ logger.info("-" * 50)
310
+
311
+ # Add session_id to config
312
+ screenshot_config['session_id'] = session_id
313
+ screenshot_capture = ScreenshotCapture(screenshot_config)
314
+ else:
315
+ logger.info("📷 Screenshot capture is DISABLED for this browser task")
316
+
317
+ # Initialize logs capture if enabled (independent from screenshots)
318
+ if screenshot_config:
319
+ logger.info("-" * 50)
320
+ logger.info("🎯 Initializing logs capture for browser task")
321
+ logger.info(f" Session: {session_id}")
322
+ logger.info(f" Tool Call ID: {tool_call_id}")
323
+ logger.info("-" * 50)
324
+
325
+ # Add session_id and tool_call_id to config
326
+ screenshot_config['session_id'] = session_id
327
+ screenshot_config['tool_call_id'] = tool_call_id
328
+ logs_capture = LogsCapture(screenshot_config)
329
+ else:
330
+ logger.info("📝 Logs capture is DISABLED for this browser task")
331
+
332
+ # Create composite hook function for step end
333
+ if screenshot_capture or logs_capture:
334
+ async def on_step_end(agent: Any) -> None:
335
+ if screenshot_capture:
336
+ await screenshot_capture.capture_screenshot(agent)
337
+ if logs_capture:
338
+ await logs_capture.capture_logs(agent)
339
+
340
+ on_step_end_hook = on_step_end
62
341
 
63
342
  output_schema = None
64
343
  if output_schema_json:
@@ -98,7 +377,11 @@ async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Opt
98
377
  available_file_paths=available_files,
99
378
  browser_session=browser_session,
100
379
  )
101
- history = await agent.run()
380
+
381
+ # Run agent with screenshot hook if configured
382
+ history = await agent.run(
383
+ on_step_end=on_step_end_hook
384
+ )
102
385
  final_result = history.final_result()
103
386
 
104
387
  # Parse result with output model if provided
@@ -142,12 +425,14 @@ if __name__ == '__main__':
142
425
  task = payload.get('task')
143
426
  output_schema = payload.get('outputSchema')
144
427
  otp_secret = payload.get('otpSecret')
428
+ screenshot_config = payload.get('screenshotConfig')
145
429
  folder_path = payload.get('folderPath')
430
+ tool_call_id = payload.get('toolCallId')
146
431
 
147
432
  if not session_id or not cdp_url or not task or not folder_path:
148
433
  raise SystemExit("Missing required fields in JSON payload: sessionId, cdpUrl, task, folderPath")
149
434
 
150
435
  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, folder_path))
436
+ asyncio.run(main(session_id, cdp_url, task, output_schema_json, otp_secret, screenshot_config, folder_path, tool_call_id))
152
437
  else:
153
438
  raise SystemExit("Usage: uv run executeBrowserTask.py; send a JSON payload via stdin")
@@ -1,3 +1,11 @@
1
+ import { ChildProcess } from 'child_process';
2
+ interface BrowserInstance {
3
+ id: string;
4
+ cdpUrl: string;
5
+ proc: ChildProcess;
6
+ port: number;
7
+ profileDir?: string;
8
+ }
1
9
  export type StartChromiumOptions = {
2
10
  /** Headless by default. Set to false to see a window. */
3
11
  headless?: boolean;
@@ -9,14 +17,33 @@ export type StartChromiumOptions = {
9
17
  env?: NodeJS.ProcessEnv;
10
18
  /** How long to wait for the DevTools port to come up (ms). Default: 10000 */
11
19
  timeoutMs?: number;
20
+ /** Instance ID to reuse an existing browser instance. If not provided, a new instance will be created. */
21
+ instanceId?: string;
22
+ /** Preferred port to use. If not available, will find another available port. */
23
+ preferredPort?: number;
12
24
  };
13
25
  /**
14
- * Launch Chromium with --remote-debugging-port=0 and return the CDP ws URL.
26
+ * Launch Chromium with dynamic port allocation and return the CDP ws URL.
27
+ * Supports multiple concurrent instances.
15
28
  * Works with Chrome/Chromium/Chrome for Testing.
16
29
  */
17
30
  export declare function getOrStartLocalCDP(opts: StartChromiumOptions): Promise<{
18
31
  cdpUrl: string;
32
+ instanceId: string;
19
33
  }>;
20
- export declare function isLocalBrowserRunning(): boolean;
21
- export declare function kill(): Promise<void>;
34
+ export declare function isLocalBrowserRunning(instanceId?: string): boolean;
35
+ /**
36
+ * Get all running browser instances
37
+ */
38
+ export declare function getAllBrowserInstances(): Map<string, BrowserInstance>;
39
+ /**
40
+ * Get a specific browser instance
41
+ */
42
+ export declare function getBrowserInstance(instanceId: string): BrowserInstance | undefined;
43
+ /**
44
+ * Kill a specific browser instance or all instances
45
+ * @param instanceId - Optional instance ID to kill. If not provided, kills all instances.
46
+ */
47
+ export declare function kill(instanceId?: string): Promise<void>;
48
+ export {};
22
49
  //# sourceMappingURL=localBrowserTask.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"localBrowserTask.d.ts","sourceRoot":"","sources":["../../src/browserTask/localBrowserTask.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,oBAAoB,GAAG;IACjC,yDAAyD;IACzD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,0GAA0G;IAC1G,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAiK7B;AAwBD,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED,wBAAsB,IAAI,kBAOzB"}
1
+ {"version":3,"file":"localBrowserTask.d.ts","sourceRoot":"","sources":["../../src/browserTask/localBrowserTask.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,YAAY,EAAE,MAAM,eAAe,CAAC;AASpD,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAkDD,MAAM,MAAM,oBAAoB,GAAG;IACjC,yDAAyD;IACzD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,0GAA0G;IAC1G,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0GAA0G;IAC1G,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAiLpH;AAwBD,wBAAgB,qBAAqB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAKlE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAErE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAElF;AAED;;;GAGG;AACH,wBAAsB,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,iBA6B7C"}