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

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.
Files changed (58) hide show
  1. package/dist/browserTask/executeBrowserTask.d.ts.map +1 -1
  2. package/dist/browserTask/executeBrowserTask.js +128 -11
  3. package/dist/browserTask/executeBrowserTask.js.map +1 -1
  4. package/dist/browserTask/executeBrowserTask.py +293 -3
  5. package/dist/browserTask/localBrowserTask.d.ts +30 -3
  6. package/dist/browserTask/localBrowserTask.d.ts.map +1 -1
  7. package/dist/browserTask/localBrowserTask.js +190 -132
  8. package/dist/browserTask/localBrowserTask.js.map +1 -1
  9. package/dist/browserTask/types.d.ts +9 -0
  10. package/dist/browserTask/types.d.ts.map +1 -1
  11. package/dist/cli/index.js +0 -0
  12. package/dist/cli/localOperatorSetup.d.ts.map +1 -1
  13. package/dist/cli/localOperatorSetup.js +0 -5
  14. package/dist/cli/localOperatorSetup.js.map +1 -1
  15. package/dist/nodes/addAppToolNode.d.ts.map +1 -1
  16. package/dist/nodes/addAppToolNode.js +21 -1
  17. package/dist/nodes/addAppToolNode.js.map +1 -1
  18. package/dist/nodes/addBrowserTaskRunNode.d.ts.map +1 -1
  19. package/dist/nodes/addBrowserTaskRunNode.js +36 -0
  20. package/dist/nodes/addBrowserTaskRunNode.js.map +1 -1
  21. package/package.json +4 -2
  22. package/src/browserTask/CookieStore.ts +49 -0
  23. package/src/browserTask/executeBrowserTask.py +293 -3
  24. package/src/browserTask/executeBrowserTask.ts +138 -17
  25. package/src/browserTask/localBrowserTask.ts +219 -150
  26. package/src/browserTask/types.ts +11 -1
  27. package/src/cli/localOperatorSetup.ts +0 -5
  28. package/src/nodes/addAppToolNode.ts +22 -1
  29. package/src/nodes/addBrowserTaskRunNode.ts +44 -0
  30. package/dist/browserTask/cdp.d.ts +0 -23
  31. package/dist/browserTask/cdp.d.ts.map +0 -1
  32. package/dist/browserTask/cdp.js +0 -162
  33. package/dist/browserTask/cdp.js.map +0 -1
  34. package/dist/browserTask/cookieStore.py +0 -108
  35. package/dist/guidelines/guidelinesManager.d.ts +0 -37
  36. package/dist/guidelines/guidelinesManager.d.ts.map +0 -1
  37. package/dist/guidelines/guidelinesManager.js +0 -172
  38. package/dist/guidelines/guidelinesManager.js.map +0 -1
  39. package/dist/internalTools/retell.d.ts +0 -12
  40. package/dist/internalTools/retell.d.ts.map +0 -1
  41. package/dist/internalTools/retell.js +0 -54
  42. package/dist/internalTools/retell.js.map +0 -1
  43. package/dist/internalTools/sendPlaceholderMessage.d.ts +0 -14
  44. package/dist/internalTools/sendPlaceholderMessage.d.ts.map +0 -1
  45. package/dist/internalTools/sendPlaceholderMessage.js +0 -61
  46. package/dist/internalTools/sendPlaceholderMessage.js.map +0 -1
  47. package/dist/platform/mindedChatOpenAI.d.ts +0 -5
  48. package/dist/platform/mindedChatOpenAI.d.ts.map +0 -1
  49. package/dist/platform/mindedChatOpenAI.js +0 -23
  50. package/dist/platform/mindedChatOpenAI.js.map +0 -1
  51. package/dist/utils/extractStateMemoryResponse.d.ts +0 -5
  52. package/dist/utils/extractStateMemoryResponse.d.ts.map +0 -1
  53. package/dist/utils/extractStateMemoryResponse.js +0 -91
  54. package/dist/utils/extractStateMemoryResponse.js.map +0 -1
  55. package/dist/utils/extractToolMemoryResponse.d.ts +0 -4
  56. package/dist/utils/extractToolMemoryResponse.d.ts.map +0 -1
  57. package/dist/utils/extractToolMemoryResponse.js +0 -16
  58. package/dist/utils/extractToolMemoryResponse.js.map +0 -1
@@ -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;AAgFpE,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,CAgL5G,CAAC"}
@@ -13,12 +13,102 @@ const mindedConnectionTypes_1 = require("../platform/mindedConnectionTypes");
13
13
  const localBrowserTask_1 = require("./localBrowserTask");
14
14
  const types_1 = require("./types");
15
15
  const localOperatorSetup_1 = require("../cli/localOperatorSetup");
16
- const config_1 = require("../platform/config");
16
+ const chrome_remote_interface_1 = __importDefault(require("chrome-remote-interface"));
17
+ const CookieStore_1 = require("./CookieStore");
18
+ // Map to track sessionId to instanceId for local browser sessions
19
+ const localSessionInstances = new Map();
20
+ // Map to track CDP clients for cookie management
21
+ const cdpClients = new Map();
22
+ // Initialize cookie store
23
+ const cookieStore = new CookieStore_1.CookieStore(path_1.default.join(process.cwd(), 'local_storage', 'cookies'));
24
+ // Helper function to extract port from CDP URL
25
+ const extractPortFromCdpUrl = (cdpUrl) => {
26
+ try {
27
+ const match = cdpUrl.match(/:(\d+)/);
28
+ return match ? parseInt(match[1], 10) : null;
29
+ }
30
+ catch (_a) {
31
+ return null;
32
+ }
33
+ };
34
+ // Helper function to load cookies for a session
35
+ const loadCookiesForSession = async (sessionId) => {
36
+ const stored = await cookieStore.load();
37
+ if (!stored || stored.length === 0) {
38
+ logger_1.logger.info({ message: 'No stored cookies to load', sessionId });
39
+ return;
40
+ }
41
+ const cdp = cdpClients.get(sessionId);
42
+ if (!cdp) {
43
+ logger_1.logger.warn({ message: 'No CDP client found for session', sessionId });
44
+ return;
45
+ }
46
+ try {
47
+ await cdp.Network.setCookies({ cookies: stored });
48
+ logger_1.logger.info({ message: 'Loaded cookies into browser session', sessionId, count: stored.length });
49
+ }
50
+ catch (error) {
51
+ logger_1.logger.warn({ message: 'Failed to set cookies via CDP', sessionId, error });
52
+ }
53
+ };
54
+ // Helper function to save cookies for a session
55
+ const saveCookiesForSession = async (sessionId) => {
56
+ try {
57
+ const cdp = cdpClients.get(sessionId);
58
+ if (!cdp) {
59
+ logger_1.logger.warn({ message: 'No CDP client found for session', sessionId });
60
+ return;
61
+ }
62
+ const result = await cdp.Network.getAllCookies();
63
+ if (result) {
64
+ await cookieStore.save(result.cookies);
65
+ logger_1.logger.info({ message: 'Saved cookies from browser session', sessionId, count: result.cookies.length });
66
+ }
67
+ else {
68
+ logger_1.logger.warn({ message: 'No cookies found in browser session', sessionId });
69
+ }
70
+ }
71
+ catch (error) {
72
+ logger_1.logger.warn({ message: 'Failed to get/save cookies from session', sessionId, error: JSON.stringify(error) });
73
+ }
74
+ };
75
+ // Helper function to cleanup CDP client
76
+ const cleanupCdpClient = async (sessionId) => {
77
+ const cdp = cdpClients.get(sessionId);
78
+ if (cdp) {
79
+ try {
80
+ await cdp.close();
81
+ }
82
+ catch (error) {
83
+ logger_1.logger.warn({ message: 'Failed to close CDP client', sessionId, error });
84
+ }
85
+ cdpClients.delete(sessionId);
86
+ }
87
+ };
17
88
  // Socket-based browser task functions
18
89
  const createBrowserSession = async ({ sessionId, proxy, browserTaskMode, }) => {
19
90
  logger_1.logger.debug({ msg: 'Creating browser session via socket', proxy });
20
91
  if (browserTaskMode === types_1.BrowserTaskMode.LOCAL) {
21
- const { cdpUrl } = await (0, localBrowserTask_1.getOrStartLocalCDP)({ headless: false });
92
+ const { cdpUrl, instanceId } = await (0, localBrowserTask_1.getOrStartLocalCDP)({ headless: false });
93
+ // Store the mapping for cleanup later
94
+ localSessionInstances.set(sessionId, instanceId);
95
+ const port = extractPortFromCdpUrl(cdpUrl);
96
+ if (!port) {
97
+ logger_1.logger.warn({ message: 'Failed to extract port from CDP URL', sessionId, cdpUrl });
98
+ }
99
+ else {
100
+ const cdp = await (0, chrome_remote_interface_1.default)({ host: 'localhost', port });
101
+ await cdp.Network.enable();
102
+ cdpClients.set(sessionId, cdp);
103
+ logger_1.logger.info({ message: 'Created CDP client for session', sessionId, port });
104
+ }
105
+ // Load cookies for this session (best-effort)
106
+ try {
107
+ await loadCookiesForSession(sessionId);
108
+ }
109
+ catch (error) {
110
+ logger_1.logger.warn({ message: 'Failed to load cookies for session', sessionId, error });
111
+ }
22
112
  return {
23
113
  sessionId,
24
114
  cdpUrl,
@@ -43,8 +133,18 @@ const createBrowserSession = async ({ sessionId, proxy, browserTaskMode, }) => {
43
133
  exports.createBrowserSession = createBrowserSession;
44
134
  const destroyBrowserSession = async ({ sessionId, onPrem, localRun, }) => {
45
135
  logger_1.logger.debug({ msg: 'Destroying browser session via socket', sessionId, onPrem });
46
- if (localRun) {
47
- await (0, localBrowserTask_1.kill)();
136
+ if (localRun || process.env.BROWSER_TASK_MODE === types_1.BrowserTaskMode.LOCAL) {
137
+ // Kill specific instance if we have the mapping
138
+ const instanceId = localSessionInstances.get(sessionId);
139
+ if (instanceId) {
140
+ await (0, localBrowserTask_1.kill)(instanceId);
141
+ localSessionInstances.delete(sessionId);
142
+ }
143
+ else {
144
+ // Fallback to killing all if no specific instance found
145
+ logger_1.logger.warn({ msg: 'No instance ID found for session, killing all instances', sessionId });
146
+ await (0, localBrowserTask_1.kill)();
147
+ }
48
148
  return {
49
149
  success: true,
50
150
  };
@@ -65,17 +165,19 @@ exports.destroyBrowserSession = destroyBrowserSession;
65
165
  const invokeBrowserTask = async (options) => {
66
166
  var _a, _b, _c;
67
167
  try {
68
- const { sessionId, cdpUrl, task, keepAlive, hooks, browserTaskMode, toolSchemas, outputSchema } = options;
69
- const { isDeployed } = (0, config_1.getConfig)();
168
+ const { sessionId, cdpUrl, task, keepAlive, hooks, browserTaskMode, toolSchemas, outputSchema, screenshotConfig, toolCallId } = options;
70
169
  if (browserTaskMode === types_1.BrowserTaskMode.LOCAL) {
71
- if (!isDeployed) {
72
- (0, localOperatorSetup_1.validateLocalOperatorSetup)();
73
- }
170
+ (0, localOperatorSetup_1.validateLocalOperatorSetup)();
74
171
  const pythonScriptPath = path_1.default.resolve(__dirname, 'executeBrowserTask.py');
75
172
  // Calculate folder path for downloads
76
173
  const folderPath = path_1.default.join(__dirname, `downloads_${sessionId}`);
77
174
  const args = ['run', pythonScriptPath];
78
- logger_1.logger.info({ message: 'Spawning Python process', args });
175
+ logger_1.logger.info({
176
+ message: 'Spawning Python process',
177
+ args,
178
+ enableScreenshotCaptureToS3: (screenshotConfig === null || screenshotConfig === void 0 ? void 0 : screenshotConfig.enableScreenshotCaptureToS3) || false,
179
+ enableLogsCaptureToS3: (screenshotConfig === null || screenshotConfig === void 0 ? void 0 : screenshotConfig.enableLogsCaptureToS3) || false,
180
+ });
79
181
  const child = (0, node_child_process_1.spawn)('uv', args, {
80
182
  stdio: ['pipe', 'pipe', 'pipe'],
81
183
  env: (0, localOperatorSetup_1.isLocalOperatorSetup)()
@@ -93,7 +195,9 @@ const invokeBrowserTask = async (options) => {
93
195
  task,
94
196
  outputSchema,
95
197
  otpSecret: process.env.TOTP_SECRET,
198
+ screenshotConfig,
96
199
  folderPath,
200
+ toolCallId,
97
201
  };
98
202
  // Write JSON payload to stdin
99
203
  child.stdin.write(JSON.stringify(payload));
@@ -146,13 +250,24 @@ const invokeBrowserTask = async (options) => {
146
250
  if ((0, fs_1.existsSync)(folderPath)) {
147
251
  try {
148
252
  const files = (0, fs_1.readdirSync)(folderPath);
149
- downloadedFiles = files.map(file => path_1.default.join(folderPath, file));
253
+ downloadedFiles = files.map((file) => path_1.default.join(folderPath, file));
150
254
  logger_1.logger.debug({ message: 'Found downloaded files', count: downloadedFiles.length, files: downloadedFiles });
151
255
  }
152
256
  catch (error) {
153
257
  logger_1.logger.error({ message: 'Failed to read downloads folder', error });
154
258
  }
155
259
  }
260
+ // Save cookies after task completes (best-effort)
261
+ try {
262
+ await saveCookiesForSession(sessionId);
263
+ }
264
+ catch (error) {
265
+ logger_1.logger.warn({ message: 'Failed to save cookies after task completion', sessionId, error });
266
+ }
267
+ // If not keeping alive, cleanup CDP client
268
+ if (!keepAlive) {
269
+ await cleanupCdpClient(sessionId);
270
+ }
156
271
  return {
157
272
  result,
158
273
  steps: [],
@@ -168,6 +283,8 @@ const invokeBrowserTask = async (options) => {
168
283
  hooksCount: (hooks === null || hooks === void 0 ? void 0 : hooks.length) || 0,
169
284
  onPrem: browserTaskMode === types_1.BrowserTaskMode.ON_PREM,
170
285
  outputSchemaFields: (outputSchema === null || outputSchema === void 0 ? void 0 : outputSchema.length) || 0,
286
+ enableScreenshotCaptureToS3: (screenshotConfig === null || screenshotConfig === void 0 ? void 0 : screenshotConfig.enableScreenshotCaptureToS3) || false,
287
+ enableLogsCaptureToS3: (screenshotConfig === null || screenshotConfig === void 0 ? void 0 : screenshotConfig.enableLogsCaptureToS3) || false,
171
288
  });
172
289
  const response = await mindedConnection_1.mindedConnection.awaitEmit(mindedConnectionTypes_1.mindedConnectionSocketMessageType.INVOKE_BROWSER_TASK, {
173
290
  type: mindedConnectionTypes_1.mindedConnectionSocketMessageType.INVOKE_BROWSER_TASK,
@@ -1 +1 @@
1
- {"version":3,"file":"executeBrowserTask.js","sourceRoot":"","sources":["../../src/browserTask/executeBrowserTask.ts"],"names":[],"mappings":";;;;;;AAAA,2DAA2C;AAC3C,4CAAyC;AACzC,mEAAgE;AAChE,gDAAwB;AACxB,2BAA6C;AAC7C,6EAQ2C;AAC3C,yDAAqF;AACrF,mCAAoE;AACpE,kEAA6F;AAC7F,+CAA+C;AAE/C,sCAAsC;AAC/B,MAAM,oBAAoB,GAAG,KAAK,EAAE,EACzC,SAAS,EACT,KAAK,EACL,eAAe,GAKhB,EAAyC,EAAE;IAC1C,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,qCAAqC,EAAE,KAAK,EAAE,CAAC,CAAC;IAEpE,IAAI,eAAe,KAAK,uBAAe,CAAC,KAAK,EAAE,CAAC;QAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,qCAAkB,EAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACjE,OAAO;YACL,SAAS;YACT,MAAM;SACP,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,mCAAgB,CAAC,SAAS,CAC/C,yDAAiC,CAAC,sBAAsB,EACxD;QACE,IAAI,EAAE,yDAAiC,CAAC,sBAAsB;QAC9D,KAAK;QACL,MAAM,EAAE,eAAe,KAAK,uBAAe,CAAC,OAAO;KACpD,EACD,KAAK,CACN,CAAC;IAEF,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,kCAAkC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QACjF,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,eAAM,CAAC,KAAK,CAAC;QACX,GAAG,EAAE,sCAAsC;QAC3C,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW;KACnC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAzCW,QAAA,oBAAoB,wBAyC/B;AAEK,MAAM,qBAAqB,GAAG,KAAK,EAAE,EAC1C,SAAS,EACT,MAAM,EACN,QAAQ,GAKT,EAA0C,EAAE;IAC3C,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,uCAAuC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IAElF,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,IAAA,uBAAI,GAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,mCAAgB,CAAC,SAAS,CAC/C,yDAAiC,CAAC,uBAAuB,EACzD;QACE,IAAI,EAAE,yDAAiC,CAAC,uBAAuB;QAC/D,SAAS;QACT,MAAM;KACP,EACD,KAAK,CACN,CAAC;IAEF,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,mCAAmC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7F,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,wCAAwC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3E,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAnCW,QAAA,qBAAqB,yBAmChC;AAEK,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAAiC,EAAsC,EAAE;;IAC/G,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;QAC1G,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,kBAAS,GAAE,CAAC;QAEnC,IAAI,eAAe,KAAK,uBAAe,CAAC,KAAK,EAAE,CAAC;YAE9C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,IAAA,+CAA0B,GAAE,CAAC;YAC/B,CAAC;YAED,MAAM,gBAAgB,GAAG,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;YAE1E,sCAAsC;YACtC,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,SAAS,EAAE,CAAC,CAAC;YAElE,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;YACvC,eAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,CAAC;YAE1D,MAAM,KAAK,GAAG,IAAA,0BAAK,EAAC,IAAI,EAAE,IAAI,EAAE;gBAC9B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC/B,GAAG,EAAE,IAAA,yCAAoB,GAAE;oBACzB,CAAC,CAAC;wBACA,GAAG,OAAO,CAAC,GAAG;wBACd,WAAW,EAAE,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC;wBAC9C,IAAI,EAAE,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE;qBACxE;oBACD,CAAC,CAAC,OAAO,CAAC,GAAG;aAChB,CAAC,CAAC;YAEH,mCAAmC;YACnC,MAAM,OAAO,GAAG;gBACd,SAAS;gBACT,MAAM;gBACN,IAAI;gBACJ,YAAY;gBACZ,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;gBAClC,UAAU;aACX,CAAC;YAEF,8BAA8B;YAC9B,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3C,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAElB,IAAI,YAAY,GAAG,EAAE,CAAC;YACtB,IAAI,YAAY,GAAG,EAAE,CAAC;YAEtB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7B,YAAY,IAAI,IAAI,CAAC;gBACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7B,YAAY,IAAI,IAAI,CAAC;gBACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;gBAChC,4CAA4C;gBAC5C,IAAI,CAAC,IAAA,wCAAqB,GAAE,EAAE,CAAC;oBAC7B,eAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,6DAA6D,EAAE,CAAC,CAAC;oBACzF,KAAK,CAAC,IAAI,EAAE,CAAC;oBACb,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,CAAC;YAET,sEAAsE;YACtE,UAAU,CAAC,GAAG,EAAE;gBACd,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC1B,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa;YAE1B,MAAM,QAAQ,GAAW,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC7D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBACxC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,CAAC,CAAC,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;YAEH,aAAa,CAAC,QAAQ,CAAC,CAAC;YAExB,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACnB,eAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;gBAC7E,MAAM,IAAI,KAAK,CAAC,4CAA4C,QAAQ,EAAE,CAAC,CAAC;YAC1E,CAAC;YAED,eAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAE9C,IAAI,MAAM,GAAG,CAAA,MAAA,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,0CAAE,IAAI,EAAE,KAAI,YAAY,CAAC;YAC3E,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC9B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,eAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;YAED,wCAAwC;YACxC,IAAI,eAAe,GAAa,EAAE,CAAC;YACnC,IAAI,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,IAAA,gBAAW,EAAC,UAAU,CAAC,CAAC;oBACtC,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;oBACjE,eAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,KAAK,EAAE,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;gBAC7G,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,eAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,iCAAiC,EAAE,KAAK,EAAE,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;YAED,OAAO;gBACL,MAAM;gBACN,KAAK,EAAE,EAAE;gBACT,UAAU,EAAE,EAAE;gBACd,eAAe;aAChB,CAAC;QACJ,CAAC;QAED,eAAM,CAAC,KAAK,CAAC;YACX,GAAG,EAAE,kCAAkC;YACvC,SAAS;YACT,UAAU,EAAE,IAAI,CAAC,MAAM;YACvB,SAAS;YACT,UAAU,EAAE,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAM,KAAI,CAAC;YAC9B,MAAM,EAAE,eAAe,KAAK,uBAAe,CAAC,OAAO;YACnD,kBAAkB,EAAE,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,KAAI,CAAC;SAC9C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,mCAAgB,CAAC,SAAS,CAC/C,yDAAiC,CAAC,mBAAmB,EACrD;YACE,IAAI,EAAE,yDAAiC,CAAC,mBAAmB;YAC3D,MAAM;YACN,IAAI;YACJ,SAAS;YACT,SAAS;YACT,KAAK;YACL,MAAM,EAAE,eAAe,KAAK,uBAAe,CAAC,OAAO;YACnD,WAAW;YACX,YAAY;SACb,EACD,MAAM,CACP,CAAC;QAEF,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,+BAA+B,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9E,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QAED,eAAM,CAAC,KAAK,CAAC;YACX,GAAG,EAAE,qCAAqC;YAC1C,SAAS;YACT,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM;YAC5B,SAAS,EAAE,CAAA,MAAA,QAAQ,CAAC,KAAK,0CAAE,MAAM,KAAI,CAAC;YACtC,cAAc,EAAE,CAAA,MAAA,QAAQ,CAAC,UAAU,0CAAE,MAAM,KAAI,CAAC;SACjD,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9D,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAhKW,QAAA,iBAAiB,qBAgK5B"}
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', os.getenv('SCREENSHOT_S3_BUCKET', 'bucket-not-set'))
59
+ self.s3_prefix = self.config.get('s3_prefix', os.getenv('SCREENSHOT_S3_PREFIX', 'browser-use-runs-screenshots/'))
60
+
61
+ # AWS region configuration
62
+ self.aws_region = self.config.get('aws_region', os.getenv('AWS_REGION', 'us-east-1'))
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 with defaults
171
+ self.s3_bucket = self.config.get('s3_bucket', os.getenv('SCREENSHOT_S3_BUCKET', 'bucket-not-set'))
172
+ self.s3_prefix = self.config.get('s3_prefix', os.getenv('SCREENSHOT_S3_PREFIX', 'browser-use-runs-logs/'))
173
+
174
+ # AWS region configuration
175
+ self.aws_region = self.config.get('aws_region', os.getenv('AWS_REGION', 'us-east-1'))
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,53 @@ 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
+ # Check if screenshots are enabled
306
+ enable_screenshot_capture_to_s3 = screenshot_config and screenshot_config.get('enableScreenshotCaptureToS3', False)
307
+
308
+ if enable_screenshot_capture_to_s3:
309
+ logger.info("-" * 50)
310
+ logger.info("🎯 Initializing screenshot capture for browser task")
311
+ logger.info(f" Session: {session_id}")
312
+ logger.info("-" * 50)
313
+
314
+ # Add session_id to config
315
+ screenshot_config['session_id'] = session_id
316
+ screenshot_capture = ScreenshotCapture(screenshot_config)
317
+ else:
318
+ logger.info("📷 Screenshot capture is DISABLED for this browser task")
319
+
320
+ # Initialize logs capture if enabled (independent from screenshots)
321
+ enable_logs_capture_to_s3 = screenshot_config and screenshot_config.get('enableLogsCaptureToS3', False)
322
+
323
+ if enable_logs_capture_to_s3:
324
+ logger.info("-" * 50)
325
+ logger.info("🎯 Initializing logs capture for browser task")
326
+ logger.info(f" Session: {session_id}")
327
+ logger.info(f" Tool Call ID: {tool_call_id}")
328
+ logger.info("-" * 50)
329
+
330
+ # Add session_id and tool_call_id to config
331
+ screenshot_config['session_id'] = session_id
332
+ screenshot_config['tool_call_id'] = tool_call_id
333
+ logs_capture = LogsCapture(screenshot_config)
334
+ else:
335
+ logger.info("📝 Logs capture is DISABLED for this browser task")
336
+
337
+ # Create composite hook function for step end
338
+ if screenshot_capture or logs_capture:
339
+ async def on_step_end(agent: Any) -> None:
340
+ if screenshot_capture:
341
+ await screenshot_capture.capture_screenshot(agent)
342
+ if logs_capture:
343
+ await logs_capture.capture_logs(agent)
344
+
345
+ on_step_end_hook = on_step_end
62
346
 
63
347
  output_schema = None
64
348
  if output_schema_json:
@@ -98,7 +382,11 @@ async def main(session_id: str, cdp_url: str, task: str, output_schema_json: Opt
98
382
  available_file_paths=available_files,
99
383
  browser_session=browser_session,
100
384
  )
101
- history = await agent.run()
385
+
386
+ # Run agent with screenshot hook if configured
387
+ history = await agent.run(
388
+ on_step_end=on_step_end_hook
389
+ )
102
390
  final_result = history.final_result()
103
391
 
104
392
  # Parse result with output model if provided
@@ -142,12 +430,14 @@ if __name__ == '__main__':
142
430
  task = payload.get('task')
143
431
  output_schema = payload.get('outputSchema')
144
432
  otp_secret = payload.get('otpSecret')
433
+ screenshot_config = payload.get('screenshotConfig')
145
434
  folder_path = payload.get('folderPath')
435
+ tool_call_id = payload.get('toolCallId')
146
436
 
147
437
  if not session_id or not cdp_url or not task or not folder_path:
148
438
  raise SystemExit("Missing required fields in JSON payload: sessionId, cdpUrl, task, folderPath")
149
439
 
150
440
  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))
441
+ asyncio.run(main(session_id, cdp_url, task, output_schema_json, otp_secret, screenshot_config, folder_path, tool_call_id))
152
442
  else:
153
443
  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;AAQpD,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,CAsIpH;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"}