@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.
- package/dist/browserTask/executeBrowserTask.d.ts.map +1 -1
- package/dist/browserTask/executeBrowserTask.js +128 -11
- package/dist/browserTask/executeBrowserTask.js.map +1 -1
- package/dist/browserTask/executeBrowserTask.py +293 -3
- package/dist/browserTask/localBrowserTask.d.ts +30 -3
- package/dist/browserTask/localBrowserTask.d.ts.map +1 -1
- package/dist/browserTask/localBrowserTask.js +190 -132
- package/dist/browserTask/localBrowserTask.js.map +1 -1
- package/dist/browserTask/types.d.ts +9 -0
- package/dist/browserTask/types.d.ts.map +1 -1
- package/dist/cli/index.js +0 -0
- package/dist/cli/localOperatorSetup.d.ts.map +1 -1
- package/dist/cli/localOperatorSetup.js +0 -5
- package/dist/cli/localOperatorSetup.js.map +1 -1
- package/dist/nodes/addAppToolNode.d.ts.map +1 -1
- package/dist/nodes/addAppToolNode.js +21 -1
- package/dist/nodes/addAppToolNode.js.map +1 -1
- package/dist/nodes/addBrowserTaskRunNode.d.ts.map +1 -1
- package/dist/nodes/addBrowserTaskRunNode.js +36 -0
- package/dist/nodes/addBrowserTaskRunNode.js.map +1 -1
- package/package.json +4 -2
- package/src/browserTask/CookieStore.ts +49 -0
- package/src/browserTask/executeBrowserTask.py +293 -3
- package/src/browserTask/executeBrowserTask.ts +138 -17
- package/src/browserTask/localBrowserTask.ts +219 -150
- package/src/browserTask/types.ts +11 -1
- package/src/cli/localOperatorSetup.ts +0 -5
- package/src/nodes/addAppToolNode.ts +22 -1
- package/src/nodes/addBrowserTaskRunNode.ts +44 -0
- package/dist/browserTask/cdp.d.ts +0 -23
- package/dist/browserTask/cdp.d.ts.map +0 -1
- package/dist/browserTask/cdp.js +0 -162
- package/dist/browserTask/cdp.js.map +0 -1
- package/dist/browserTask/cookieStore.py +0 -108
- package/dist/guidelines/guidelinesManager.d.ts +0 -37
- package/dist/guidelines/guidelinesManager.d.ts.map +0 -1
- package/dist/guidelines/guidelinesManager.js +0 -172
- package/dist/guidelines/guidelinesManager.js.map +0 -1
- package/dist/internalTools/retell.d.ts +0 -12
- package/dist/internalTools/retell.d.ts.map +0 -1
- package/dist/internalTools/retell.js +0 -54
- package/dist/internalTools/retell.js.map +0 -1
- package/dist/internalTools/sendPlaceholderMessage.d.ts +0 -14
- package/dist/internalTools/sendPlaceholderMessage.d.ts.map +0 -1
- package/dist/internalTools/sendPlaceholderMessage.js +0 -61
- package/dist/internalTools/sendPlaceholderMessage.js.map +0 -1
- package/dist/platform/mindedChatOpenAI.d.ts +0 -5
- package/dist/platform/mindedChatOpenAI.d.ts.map +0 -1
- package/dist/platform/mindedChatOpenAI.js +0 -23
- package/dist/platform/mindedChatOpenAI.js.map +0 -1
- package/dist/utils/extractStateMemoryResponse.d.ts +0 -5
- package/dist/utils/extractStateMemoryResponse.d.ts.map +0 -1
- package/dist/utils/extractStateMemoryResponse.js +0 -91
- package/dist/utils/extractStateMemoryResponse.js.map +0 -1
- package/dist/utils/extractToolMemoryResponse.d.ts +0 -4
- package/dist/utils/extractToolMemoryResponse.d.ts.map +0 -1
- package/dist/utils/extractToolMemoryResponse.js +0 -16
- 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;
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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({
|
|
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,
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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":"
|
|
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"}
|