@bubblelab/bubble-core 0.1.11 → 0.1.12
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/bubble-bundle.d.ts +164 -121
- package/dist/bubble-factory.d.ts.map +1 -1
- package/dist/bubble-factory.js +5 -0
- package/dist/bubble-factory.js.map +1 -1
- package/dist/bubbles/service-bubble/ai-agent.d.ts +30 -30
- package/dist/bubbles/service-bubble/ai-agent.d.ts.map +1 -1
- package/dist/bubbles/service-bubble/ai-agent.js +3 -6
- package/dist/bubbles/service-bubble/ai-agent.js.map +1 -1
- package/dist/bubbles/service-bubble/apify/apify.d.ts +5 -5
- package/dist/bubbles/service-bubble/apify/apify.d.ts.map +1 -1
- package/dist/bubbles/service-bubble/apify/apify.js +20 -8
- package/dist/bubbles/service-bubble/apify/apify.js.map +1 -1
- package/dist/bubbles/service-bubble/browserbase/browserbase.d.ts +542 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.integration.flow.d.ts +37 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.integration.flow.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.integration.flow.js +203 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.integration.flow.js.map +1 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.js +593 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.js.map +1 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.schema.d.ts +518 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.schema.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.schema.js +311 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.schema.js.map +1 -0
- package/dist/bubbles/service-bubble/browserbase/index.d.ts +3 -0
- package/dist/bubbles/service-bubble/browserbase/index.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/browserbase/index.js +3 -0
- package/dist/bubbles/service-bubble/browserbase/index.js.map +1 -0
- package/dist/bubbles/service-bubble/crustdata/crustdata.d.ts +1358 -0
- package/dist/bubbles/service-bubble/crustdata/crustdata.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/crustdata/crustdata.js +219 -0
- package/dist/bubbles/service-bubble/crustdata/crustdata.js.map +1 -0
- package/dist/bubbles/service-bubble/crustdata/crustdata.schema.d.ts +1604 -0
- package/dist/bubbles/service-bubble/crustdata/crustdata.schema.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/crustdata/crustdata.schema.js +194 -0
- package/dist/bubbles/service-bubble/crustdata/crustdata.schema.js.map +1 -0
- package/dist/bubbles/service-bubble/crustdata/index.d.ts +3 -0
- package/dist/bubbles/service-bubble/crustdata/index.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/crustdata/index.js +3 -0
- package/dist/bubbles/service-bubble/crustdata/index.js.map +1 -0
- package/dist/bubbles/service-bubble/firecrawl.d.ts +4 -4
- package/dist/bubbles/service-bubble/firecrawl.js +1 -1
- package/dist/bubbles/service-bubble/firecrawl.js.map +1 -1
- package/dist/bubbles/service-bubble/github.d.ts +0 -6
- package/dist/bubbles/service-bubble/github.d.ts.map +1 -1
- package/dist/bubbles/service-bubble/github.js +1 -7
- package/dist/bubbles/service-bubble/github.js.map +1 -1
- package/dist/bubbles/service-bubble/gmail.d.ts +84 -84
- package/dist/bubbles/service-bubble/google-drive.d.ts +32 -32
- package/dist/bubbles/service-bubble/http.d.ts +13 -1
- package/dist/bubbles/service-bubble/http.d.ts.map +1 -1
- package/dist/bubbles/service-bubble/http.integration.flow.d.ts +49 -0
- package/dist/bubbles/service-bubble/http.integration.flow.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/http.integration.flow.js +425 -0
- package/dist/bubbles/service-bubble/http.integration.flow.js.map +1 -0
- package/dist/bubbles/service-bubble/http.js +40 -4
- package/dist/bubbles/service-bubble/http.js.map +1 -1
- package/dist/bubbles/service-bubble/resend.d.ts +4 -4
- package/dist/bubbles/service-bubble/slack.d.ts +978 -35
- package/dist/bubbles/service-bubble/slack.d.ts.map +1 -1
- package/dist/bubbles/service-bubble/slack.js +320 -26
- package/dist/bubbles/service-bubble/slack.js.map +1 -1
- package/dist/bubbles/service-bubble/storage.d.ts +1 -1
- package/dist/bubbles/service-bubble/storage.d.ts.map +1 -1
- package/dist/bubbles/service-bubble/storage.js +2 -2
- package/dist/bubbles/service-bubble/storage.js.map +1 -1
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.d.ts +494 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.integration.flow.d.ts +31 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.integration.flow.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.integration.flow.js +100 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.integration.flow.js.map +1 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.js +1301 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.schema.d.ts +473 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.schema.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.schema.js +230 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.schema.js.map +1 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/index.d.ts +3 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/index.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/index.js +3 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/index.js.map +1 -0
- package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.d.ts +8 -8
- package/dist/bubbles/tool-bubble/company-enrichment-tool.d.ts +740 -0
- package/dist/bubbles/tool-bubble/company-enrichment-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/company-enrichment-tool.js +350 -0
- package/dist/bubbles/tool-bubble/company-enrichment-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/google-maps-tool.d.ts.map +1 -1
- package/dist/bubbles/tool-bubble/google-maps-tool.js +1 -0
- package/dist/bubbles/tool-bubble/google-maps-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/instagram-tool.d.ts.map +1 -1
- package/dist/bubbles/tool-bubble/instagram-tool.js +2 -0
- package/dist/bubbles/tool-bubble/instagram-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/linkedin-tool.d.ts +6 -6
- package/dist/bubbles/tool-bubble/linkedin-tool.d.ts.map +1 -1
- package/dist/bubbles/tool-bubble/linkedin-tool.js +6 -4
- package/dist/bubbles/tool-bubble/linkedin-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/research-agent-tool.d.ts.map +1 -1
- package/dist/bubbles/tool-bubble/research-agent-tool.js +6 -1
- package/dist/bubbles/tool-bubble/research-agent-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/tiktok-tool.d.ts +8 -8
- package/dist/bubbles/tool-bubble/twitter-tool.d.ts +10 -10
- package/dist/bubbles/tool-bubble/twitter-tool.d.ts.map +1 -1
- package/dist/bubbles/tool-bubble/twitter-tool.js +3 -0
- package/dist/bubbles/tool-bubble/twitter-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts +6 -6
- package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts.map +1 -1
- package/dist/bubbles/tool-bubble/web-scrape-tool.js +4 -1
- package/dist/bubbles/tool-bubble/web-scrape-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/youtube-tool.d.ts.map +1 -1
- package/dist/bubbles/tool-bubble/youtube-tool.js +3 -0
- package/dist/bubbles/tool-bubble/youtube-tool.js.map +1 -1
- package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts +24 -24
- package/dist/bubbles/workflow-bubble/slack-formatter-agent.d.ts +8 -8
- package/dist/bubbles.json +50 -15
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/logging/BubbleLogger.d.ts +10 -0
- package/dist/logging/BubbleLogger.d.ts.map +1 -1
- package/dist/logging/BubbleLogger.js +14 -0
- package/dist/logging/BubbleLogger.js.map +1 -1
- package/dist/logging/StreamingBubbleLogger.d.ts +8 -0
- package/dist/logging/StreamingBubbleLogger.d.ts.map +1 -1
- package/dist/logging/StreamingBubbleLogger.js +29 -0
- package/dist/logging/StreamingBubbleLogger.js.map +1 -1
- package/dist/types/available-tools.d.ts +1 -1
- package/dist/types/available-tools.d.ts.map +1 -1
- package/dist/types/available-tools.js +6 -0
- package/dist/types/available-tools.js.map +1 -1
- package/dist/types/base-bubble-class.d.ts.map +1 -1
- package/dist/types/base-bubble-class.js +0 -8
- package/dist/types/base-bubble-class.js.map +1 -1
- package/dist/types/tool-bubble-class.d.ts.map +1 -1
- package/dist/types/tool-bubble-class.js +58 -8
- package/dist/types/tool-bubble-class.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,593 @@
|
|
|
1
|
+
import puppeteer from 'puppeteer-core';
|
|
2
|
+
import { ServiceBubble } from '../../../types/service-bubble-class.js';
|
|
3
|
+
import { CredentialType } from '@bubblelab/shared-schemas';
|
|
4
|
+
import { BrowserBaseParamsSchema, BrowserBaseResultSchema, BrowserSessionDataSchema, } from './browserbase.schema.js';
|
|
5
|
+
/**
|
|
6
|
+
* BrowserBase Service Bubble
|
|
7
|
+
*
|
|
8
|
+
* Provides browser automation capabilities using BrowserBase cloud browsers.
|
|
9
|
+
* Supports session management, navigation, clicking, typing, JavaScript
|
|
10
|
+
* execution, content extraction, screenshots, and cookie management.
|
|
11
|
+
*
|
|
12
|
+
* Features:
|
|
13
|
+
* - Cloud-based browser sessions (BrowserBase)
|
|
14
|
+
* - Session persistence via context IDs
|
|
15
|
+
* - Cookie injection for authenticated sessions
|
|
16
|
+
* - Full page automation (click, type, evaluate)
|
|
17
|
+
* - Screenshot and content extraction
|
|
18
|
+
*
|
|
19
|
+
* Use cases:
|
|
20
|
+
* - Automated shopping workflows (Amazon, etc.)
|
|
21
|
+
* - Web scraping with authentication
|
|
22
|
+
* - Form automation and submission
|
|
23
|
+
* - Browser-based testing
|
|
24
|
+
*
|
|
25
|
+
* Security Features:
|
|
26
|
+
* - Sessions are isolated in BrowserBase cloud
|
|
27
|
+
* - Credentials are handled securely
|
|
28
|
+
* - Sessions are properly closed and cleaned up
|
|
29
|
+
*/
|
|
30
|
+
export class BrowserBaseBubble extends ServiceBubble {
|
|
31
|
+
static type = 'service';
|
|
32
|
+
static service = 'browserbase';
|
|
33
|
+
static authType = 'apikey';
|
|
34
|
+
static bubbleName = 'browserbase';
|
|
35
|
+
static schema = BrowserBaseParamsSchema;
|
|
36
|
+
static resultSchema = BrowserBaseResultSchema;
|
|
37
|
+
static shortDescription = 'Browser automation service using BrowserBase cloud browsers';
|
|
38
|
+
static longDescription = `
|
|
39
|
+
BrowserBase service integration for cloud-based browser automation.
|
|
40
|
+
|
|
41
|
+
Features:
|
|
42
|
+
- Cloud-based browser sessions
|
|
43
|
+
- Session persistence via context IDs
|
|
44
|
+
- Cookie injection for authenticated sessions
|
|
45
|
+
- Full page automation (click, type, evaluate)
|
|
46
|
+
- Screenshot and content extraction
|
|
47
|
+
- Cross-browser support
|
|
48
|
+
|
|
49
|
+
Use cases:
|
|
50
|
+
- Automated shopping workflows (Amazon, etc.)
|
|
51
|
+
- Web scraping with authentication
|
|
52
|
+
- Form automation and submission
|
|
53
|
+
- Browser-based testing
|
|
54
|
+
|
|
55
|
+
Security Features:
|
|
56
|
+
- Sessions are isolated in BrowserBase cloud
|
|
57
|
+
- Credentials are handled securely
|
|
58
|
+
- Sessions are properly closed and cleaned up
|
|
59
|
+
`;
|
|
60
|
+
static alias = 'browser';
|
|
61
|
+
// Static session store shared across instances
|
|
62
|
+
static activeSessions = new Map();
|
|
63
|
+
constructor(params = {
|
|
64
|
+
operation: 'start_session',
|
|
65
|
+
}, context, instanceId) {
|
|
66
|
+
super(params, context, instanceId);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get BrowserBase configuration from environment
|
|
70
|
+
*/
|
|
71
|
+
getConfig() {
|
|
72
|
+
const apiKey = process.env.BROWSERBASE_API_KEY;
|
|
73
|
+
const projectId = process.env.BROWSERBASE_PROJECT_ID;
|
|
74
|
+
if (!apiKey || !projectId) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
apiKey,
|
|
79
|
+
projectId,
|
|
80
|
+
baseUrl: 'https://api.browserbase.com/v1',
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Make an API request to BrowserBase
|
|
85
|
+
*/
|
|
86
|
+
async browserbaseApi(endpoint, method = 'GET', body) {
|
|
87
|
+
const config = this.getConfig();
|
|
88
|
+
if (!config) {
|
|
89
|
+
throw new Error('BrowserBase not configured');
|
|
90
|
+
}
|
|
91
|
+
const url = `${config.baseUrl}${endpoint}`;
|
|
92
|
+
const headers = {
|
|
93
|
+
'x-bb-api-key': config.apiKey,
|
|
94
|
+
'Content-Type': 'application/json',
|
|
95
|
+
};
|
|
96
|
+
const requestInit = { method, headers };
|
|
97
|
+
if (body) {
|
|
98
|
+
requestInit.body = JSON.stringify(body);
|
|
99
|
+
}
|
|
100
|
+
const response = await fetch(url, requestInit);
|
|
101
|
+
if (!response.ok) {
|
|
102
|
+
const errorText = await response.text();
|
|
103
|
+
throw new Error(`BrowserBase API error: ${response.status} ${response.statusText} - ${errorText}`);
|
|
104
|
+
}
|
|
105
|
+
return (await response.json());
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Parse browser session credential data (cookies + contextId)
|
|
109
|
+
* Credential is base64-encoded JSON to avoid escaping issues
|
|
110
|
+
*/
|
|
111
|
+
parseBrowserSessionCredential(credentialValue) {
|
|
112
|
+
try {
|
|
113
|
+
// Credential is base64-encoded JSON
|
|
114
|
+
const jsonString = Buffer.from(credentialValue, 'base64').toString('utf-8');
|
|
115
|
+
const parsed = JSON.parse(jsonString);
|
|
116
|
+
const validated = BrowserSessionDataSchema.safeParse(parsed);
|
|
117
|
+
if (validated.success) {
|
|
118
|
+
return validated.data;
|
|
119
|
+
}
|
|
120
|
+
console.error('[BrowserBaseBubble] Invalid credential format:', validated.error);
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
console.error('[BrowserBaseBubble] Failed to parse credential:', error);
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async testCredential() {
|
|
129
|
+
const config = this.getConfig();
|
|
130
|
+
if (!config) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
// Test by listing projects (simple API call)
|
|
135
|
+
await this.browserbaseApi('/projects');
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async performAction(context) {
|
|
143
|
+
void context;
|
|
144
|
+
const { operation } = this.params;
|
|
145
|
+
const parsedParams = this.params;
|
|
146
|
+
try {
|
|
147
|
+
const result = await (async () => {
|
|
148
|
+
switch (operation) {
|
|
149
|
+
case 'start_session':
|
|
150
|
+
return await this.startSession(parsedParams);
|
|
151
|
+
case 'navigate':
|
|
152
|
+
return await this.navigate(parsedParams);
|
|
153
|
+
case 'click':
|
|
154
|
+
return await this.click(parsedParams);
|
|
155
|
+
case 'type':
|
|
156
|
+
return await this.typeText(parsedParams);
|
|
157
|
+
case 'evaluate':
|
|
158
|
+
return await this.evaluate(parsedParams);
|
|
159
|
+
case 'get_content':
|
|
160
|
+
return await this.getContent(parsedParams);
|
|
161
|
+
case 'screenshot':
|
|
162
|
+
return await this.screenshot(parsedParams);
|
|
163
|
+
case 'wait':
|
|
164
|
+
return await this.waitFor(parsedParams);
|
|
165
|
+
case 'get_cookies':
|
|
166
|
+
return await this.getCookies(parsedParams);
|
|
167
|
+
case 'end_session':
|
|
168
|
+
return await this.endSession(parsedParams);
|
|
169
|
+
default:
|
|
170
|
+
throw new Error(`Unsupported operation: ${operation}`);
|
|
171
|
+
}
|
|
172
|
+
})();
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
return {
|
|
177
|
+
operation,
|
|
178
|
+
success: false,
|
|
179
|
+
error: error instanceof Error ? error.message : 'Unknown error occurred',
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Start a new browser session
|
|
185
|
+
*/
|
|
186
|
+
async startSession(params) {
|
|
187
|
+
const config = this.getConfig();
|
|
188
|
+
if (!config) {
|
|
189
|
+
return {
|
|
190
|
+
operation: 'start_session',
|
|
191
|
+
success: false,
|
|
192
|
+
error: 'BrowserBase not configured - set BROWSERBASE_API_KEY and BROWSERBASE_PROJECT_ID',
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
let contextId = params.context_id;
|
|
196
|
+
let cookiesToInject = params.cookies;
|
|
197
|
+
const hasExistingContext = !!contextId;
|
|
198
|
+
// Try to get contextId from credentials if not provided
|
|
199
|
+
if (!contextId && params.credentials) {
|
|
200
|
+
const amazonCred = params.credentials[CredentialType.AMAZON_CRED];
|
|
201
|
+
if (amazonCred) {
|
|
202
|
+
const sessionData = this.parseBrowserSessionCredential(amazonCred);
|
|
203
|
+
if (sessionData) {
|
|
204
|
+
contextId = sessionData.contextId;
|
|
205
|
+
// Only use cookies as fallback if no contextId from credential
|
|
206
|
+
if (!contextId && sessionData.cookies) {
|
|
207
|
+
cookiesToInject = sessionData.cookies;
|
|
208
|
+
}
|
|
209
|
+
if (contextId) {
|
|
210
|
+
console.log(`[BrowserBaseBubble] Using contextId from AMAZON_CRED: ${contextId}`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const contextFromCredential = !hasExistingContext && !!contextId;
|
|
216
|
+
// Create new context if none provided
|
|
217
|
+
if (!contextId) {
|
|
218
|
+
const contextResponse = await this.browserbaseApi('/contexts', 'POST', { projectId: config.projectId });
|
|
219
|
+
contextId = contextResponse.id;
|
|
220
|
+
console.log(`[BrowserBaseBubble] Created new context: ${contextId}`);
|
|
221
|
+
}
|
|
222
|
+
// Create session with context
|
|
223
|
+
const sessionResponse = await this.browserbaseApi('/sessions', 'POST', {
|
|
224
|
+
projectId: config.projectId,
|
|
225
|
+
browserSettings: {
|
|
226
|
+
context: { id: contextId, persist: true },
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
const sessionId = sessionResponse.id;
|
|
230
|
+
const connectUrl = sessionResponse.connectUrl;
|
|
231
|
+
console.log(`[BrowserBaseBubble] Session created: ${sessionId}`);
|
|
232
|
+
// Connect via Puppeteer
|
|
233
|
+
const browser = await puppeteer.connect({
|
|
234
|
+
browserWSEndpoint: connectUrl,
|
|
235
|
+
defaultViewport: {
|
|
236
|
+
width: params.viewport_width || 1280,
|
|
237
|
+
height: params.viewport_height || 900,
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
const pages = await browser.pages();
|
|
241
|
+
const page = pages[0] || (await browser.newPage());
|
|
242
|
+
// Only inject cookies if we created a new context (no existing contextId from param or credential)
|
|
243
|
+
// When contextId exists, BrowserBase context handles cookie persistence automatically
|
|
244
|
+
if (!hasExistingContext &&
|
|
245
|
+
!contextFromCredential &&
|
|
246
|
+
cookiesToInject &&
|
|
247
|
+
cookiesToInject.length > 0) {
|
|
248
|
+
const client = await page.createCDPSession();
|
|
249
|
+
for (const cookie of cookiesToInject) {
|
|
250
|
+
await client.send('Network.setCookie', {
|
|
251
|
+
name: cookie.name,
|
|
252
|
+
value: cookie.value,
|
|
253
|
+
domain: cookie.domain,
|
|
254
|
+
path: cookie.path,
|
|
255
|
+
expires: cookie.expires,
|
|
256
|
+
httpOnly: cookie.httpOnly,
|
|
257
|
+
secure: cookie.secure,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
console.log(`[BrowserBaseBubble] Injected ${cookiesToInject.length} cookies (no context)`);
|
|
261
|
+
}
|
|
262
|
+
// Get debug URL
|
|
263
|
+
const debugResponse = await this.browserbaseApi(`/sessions/${sessionId}/debug`);
|
|
264
|
+
// Store session
|
|
265
|
+
BrowserBaseBubble.activeSessions.set(sessionId, {
|
|
266
|
+
sessionId,
|
|
267
|
+
contextId,
|
|
268
|
+
browser,
|
|
269
|
+
page,
|
|
270
|
+
connectUrl,
|
|
271
|
+
});
|
|
272
|
+
// Emit browser session start event for live viewing in UI
|
|
273
|
+
if (this.context?.logger) {
|
|
274
|
+
this.context.logger.logBrowserSessionStart(sessionId, debugResponse.debuggerFullscreenUrl, this.context.variableId);
|
|
275
|
+
}
|
|
276
|
+
return {
|
|
277
|
+
operation: 'start_session',
|
|
278
|
+
success: true,
|
|
279
|
+
session_id: sessionId,
|
|
280
|
+
context_id: contextId,
|
|
281
|
+
debug_url: debugResponse.debuggerFullscreenUrl,
|
|
282
|
+
error: '',
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Navigate to a URL
|
|
287
|
+
*/
|
|
288
|
+
async navigate(params) {
|
|
289
|
+
const session = BrowserBaseBubble.activeSessions.get(params.session_id);
|
|
290
|
+
if (!session) {
|
|
291
|
+
return {
|
|
292
|
+
operation: 'navigate',
|
|
293
|
+
success: false,
|
|
294
|
+
error: 'Session not found. Call start_session first.',
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
await session.page.goto(params.url, {
|
|
298
|
+
waitUntil: params.wait_until,
|
|
299
|
+
timeout: params.timeout,
|
|
300
|
+
});
|
|
301
|
+
return {
|
|
302
|
+
operation: 'navigate',
|
|
303
|
+
success: true,
|
|
304
|
+
url: session.page.url(),
|
|
305
|
+
error: '',
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Click an element
|
|
310
|
+
*/
|
|
311
|
+
async click(params) {
|
|
312
|
+
const session = BrowserBaseBubble.activeSessions.get(params.session_id);
|
|
313
|
+
if (!session) {
|
|
314
|
+
return {
|
|
315
|
+
operation: 'click',
|
|
316
|
+
success: false,
|
|
317
|
+
error: 'Session not found. Call start_session first.',
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
await session.page.waitForSelector(params.selector, {
|
|
321
|
+
timeout: params.timeout,
|
|
322
|
+
});
|
|
323
|
+
if (params.wait_for_navigation) {
|
|
324
|
+
await Promise.all([
|
|
325
|
+
session.page.waitForNavigation({
|
|
326
|
+
waitUntil: 'domcontentloaded',
|
|
327
|
+
timeout: params.timeout,
|
|
328
|
+
}),
|
|
329
|
+
session.page.click(params.selector),
|
|
330
|
+
]);
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
await session.page.click(params.selector);
|
|
334
|
+
}
|
|
335
|
+
return {
|
|
336
|
+
operation: 'click',
|
|
337
|
+
success: true,
|
|
338
|
+
error: '',
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Type text into an element
|
|
343
|
+
*/
|
|
344
|
+
async typeText(params) {
|
|
345
|
+
const session = BrowserBaseBubble.activeSessions.get(params.session_id);
|
|
346
|
+
if (!session) {
|
|
347
|
+
return {
|
|
348
|
+
operation: 'type',
|
|
349
|
+
success: false,
|
|
350
|
+
error: 'Session not found. Call start_session first.',
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
await session.page.waitForSelector(params.selector);
|
|
354
|
+
if (params.clear_first) {
|
|
355
|
+
await session.page.click(params.selector, { clickCount: 3 });
|
|
356
|
+
await session.page.keyboard.press('Backspace');
|
|
357
|
+
}
|
|
358
|
+
await session.page.type(params.selector, params.text, {
|
|
359
|
+
delay: params.delay,
|
|
360
|
+
});
|
|
361
|
+
return {
|
|
362
|
+
operation: 'type',
|
|
363
|
+
success: true,
|
|
364
|
+
error: '',
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Execute JavaScript in page context
|
|
369
|
+
*/
|
|
370
|
+
async evaluate(params) {
|
|
371
|
+
const session = BrowserBaseBubble.activeSessions.get(params.session_id);
|
|
372
|
+
if (!session) {
|
|
373
|
+
return {
|
|
374
|
+
operation: 'evaluate',
|
|
375
|
+
success: false,
|
|
376
|
+
error: 'Session not found. Call start_session first.',
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
// Wrap script in an async function for safety
|
|
380
|
+
const result = await session.page.evaluate(params.script);
|
|
381
|
+
return {
|
|
382
|
+
operation: 'evaluate',
|
|
383
|
+
success: true,
|
|
384
|
+
result,
|
|
385
|
+
error: '',
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Get page or element content
|
|
390
|
+
*/
|
|
391
|
+
async getContent(params) {
|
|
392
|
+
const session = BrowserBaseBubble.activeSessions.get(params.session_id);
|
|
393
|
+
if (!session) {
|
|
394
|
+
return {
|
|
395
|
+
operation: 'get_content',
|
|
396
|
+
success: false,
|
|
397
|
+
error: 'Session not found. Call start_session first.',
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
let content;
|
|
401
|
+
const selector = params.selector || 'body';
|
|
402
|
+
if (params.content_type === 'html') {
|
|
403
|
+
content = await session.page.$eval(selector, (el) => el.innerHTML);
|
|
404
|
+
}
|
|
405
|
+
else if (params.content_type === 'outer_html') {
|
|
406
|
+
content = await session.page.$eval(selector, (el) => el.outerHTML);
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
content = await session.page.$eval(selector, (el) => el.textContent || '');
|
|
410
|
+
}
|
|
411
|
+
return {
|
|
412
|
+
operation: 'get_content',
|
|
413
|
+
success: true,
|
|
414
|
+
content,
|
|
415
|
+
error: '',
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Take a screenshot
|
|
420
|
+
*/
|
|
421
|
+
async screenshot(params) {
|
|
422
|
+
const session = BrowserBaseBubble.activeSessions.get(params.session_id);
|
|
423
|
+
if (!session) {
|
|
424
|
+
return {
|
|
425
|
+
operation: 'screenshot',
|
|
426
|
+
success: false,
|
|
427
|
+
error: 'Session not found. Call start_session first.',
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
const options = {
|
|
431
|
+
encoding: 'base64',
|
|
432
|
+
fullPage: params.full_page,
|
|
433
|
+
type: params.format || 'png',
|
|
434
|
+
};
|
|
435
|
+
if (params.quality &&
|
|
436
|
+
(params.format === 'jpeg' || params.format === 'webp')) {
|
|
437
|
+
options.quality = params.quality;
|
|
438
|
+
}
|
|
439
|
+
let data;
|
|
440
|
+
if (params.selector) {
|
|
441
|
+
const element = await session.page.$(params.selector);
|
|
442
|
+
if (!element) {
|
|
443
|
+
return {
|
|
444
|
+
operation: 'screenshot',
|
|
445
|
+
success: false,
|
|
446
|
+
error: `Element not found: ${params.selector}`,
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
data = (await element.screenshot(options));
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
data = (await session.page.screenshot(options));
|
|
453
|
+
}
|
|
454
|
+
return {
|
|
455
|
+
operation: 'screenshot',
|
|
456
|
+
success: true,
|
|
457
|
+
data,
|
|
458
|
+
format: params.format || 'png',
|
|
459
|
+
error: '',
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Wait for a condition
|
|
464
|
+
*/
|
|
465
|
+
async waitFor(params) {
|
|
466
|
+
const session = BrowserBaseBubble.activeSessions.get(params.session_id);
|
|
467
|
+
if (!session) {
|
|
468
|
+
return {
|
|
469
|
+
operation: 'wait',
|
|
470
|
+
success: false,
|
|
471
|
+
error: 'Session not found. Call start_session first.',
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
switch (params.wait_type) {
|
|
475
|
+
case 'selector':
|
|
476
|
+
if (!params.selector) {
|
|
477
|
+
return {
|
|
478
|
+
operation: 'wait',
|
|
479
|
+
success: false,
|
|
480
|
+
error: 'Selector required for selector wait type',
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
await session.page.waitForSelector(params.selector, {
|
|
484
|
+
timeout: params.timeout,
|
|
485
|
+
});
|
|
486
|
+
break;
|
|
487
|
+
case 'timeout':
|
|
488
|
+
await new Promise((resolve) => setTimeout(resolve, params.timeout));
|
|
489
|
+
break;
|
|
490
|
+
case 'navigation':
|
|
491
|
+
await session.page.waitForNavigation({
|
|
492
|
+
timeout: params.timeout,
|
|
493
|
+
waitUntil: 'domcontentloaded',
|
|
494
|
+
});
|
|
495
|
+
break;
|
|
496
|
+
}
|
|
497
|
+
return {
|
|
498
|
+
operation: 'wait',
|
|
499
|
+
success: true,
|
|
500
|
+
error: '',
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* Get cookies from the browser
|
|
505
|
+
*/
|
|
506
|
+
async getCookies(params) {
|
|
507
|
+
const session = BrowserBaseBubble.activeSessions.get(params.session_id);
|
|
508
|
+
if (!session) {
|
|
509
|
+
return {
|
|
510
|
+
operation: 'get_cookies',
|
|
511
|
+
success: false,
|
|
512
|
+
error: 'Session not found. Call start_session first.',
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
const client = await session.page.createCDPSession();
|
|
516
|
+
const { cookies } = (await client.send('Network.getAllCookies'));
|
|
517
|
+
let filteredCookies = cookies;
|
|
518
|
+
if (params.domain_filter) {
|
|
519
|
+
filteredCookies = cookies.filter((c) => c.domain.includes(params.domain_filter));
|
|
520
|
+
}
|
|
521
|
+
return {
|
|
522
|
+
operation: 'get_cookies',
|
|
523
|
+
success: true,
|
|
524
|
+
cookies: filteredCookies,
|
|
525
|
+
error: '',
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* End a browser session
|
|
530
|
+
*/
|
|
531
|
+
async endSession(params) {
|
|
532
|
+
const session = BrowserBaseBubble.activeSessions.get(params.session_id);
|
|
533
|
+
if (!session) {
|
|
534
|
+
return {
|
|
535
|
+
operation: 'end_session',
|
|
536
|
+
success: false,
|
|
537
|
+
error: 'Session not found',
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
try {
|
|
541
|
+
// Emit browser session end event before closing
|
|
542
|
+
if (this.context?.logger) {
|
|
543
|
+
this.context.logger.logBrowserSessionEnd(params.session_id, this.context.variableId);
|
|
544
|
+
}
|
|
545
|
+
// Disconnect browser
|
|
546
|
+
await session.browser.disconnect();
|
|
547
|
+
// Release session via API
|
|
548
|
+
await this.browserbaseApi(`/sessions/${params.session_id}`, 'POST', {
|
|
549
|
+
projectId: this.getConfig()?.projectId,
|
|
550
|
+
status: 'REQUEST_RELEASE',
|
|
551
|
+
});
|
|
552
|
+
// Remove from active sessions
|
|
553
|
+
BrowserBaseBubble.activeSessions.delete(params.session_id);
|
|
554
|
+
console.log(`[BrowserBaseBubble] Session ${params.session_id} closed`);
|
|
555
|
+
return {
|
|
556
|
+
operation: 'end_session',
|
|
557
|
+
success: true,
|
|
558
|
+
error: '',
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
catch (error) {
|
|
562
|
+
return {
|
|
563
|
+
operation: 'end_session',
|
|
564
|
+
success: false,
|
|
565
|
+
error: error instanceof Error
|
|
566
|
+
? error.message
|
|
567
|
+
: 'Unknown error closing session',
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
chooseCredential() {
|
|
572
|
+
const { credentials } = this.params;
|
|
573
|
+
if (!credentials || typeof credentials !== 'object') {
|
|
574
|
+
return undefined;
|
|
575
|
+
}
|
|
576
|
+
// BrowserBase bubble can use AMAZON_CRED (or other browser session creds)
|
|
577
|
+
// to get contextId and cookies for session initialization
|
|
578
|
+
return credentials[CredentialType.AMAZON_CRED];
|
|
579
|
+
}
|
|
580
|
+
/**
|
|
581
|
+
* Get an active session by ID (for use by other bubbles)
|
|
582
|
+
*/
|
|
583
|
+
static getSession(sessionId) {
|
|
584
|
+
return BrowserBaseBubble.activeSessions.get(sessionId);
|
|
585
|
+
}
|
|
586
|
+
/**
|
|
587
|
+
* Check if a session is active
|
|
588
|
+
*/
|
|
589
|
+
static hasSession(sessionId) {
|
|
590
|
+
return BrowserBaseBubble.activeSessions.has(sessionId);
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
//# sourceMappingURL=browserbase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browserbase.js","sourceRoot":"","sources":["../../../../src/bubbles/service-bubble/browserbase/browserbase.ts"],"names":[],"mappings":"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"}
|