workerclaw 0.5.0 → 0.7.0

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.
@@ -0,0 +1,449 @@
1
+ /**
2
+ * 浏览器沙箱
3
+ *
4
+ * 封装 Playwright 无头浏览器,提供安全的网页访问能力:
5
+ * - 页面加载超时控制
6
+ * - 响应大小限制
7
+ * - 弹窗拦截
8
+ * - Cookie 隔离(每次操作独立上下文)
9
+ * - 资源限制(截图质量/大小)
10
+ * - URL 安全验证(阻止内网/危险协议)
11
+ */
12
+ import { createLogger } from '../core/logger.js';
13
+ // ==================== 默认配置 ====================
14
+ const DEFAULT_CONFIG = {
15
+ pageTimeoutMs: 30000,
16
+ maxPageSizeKB: 2048,
17
+ screenshotMaxWidth: 1280,
18
+ screenshotQuality: 0.7,
19
+ screenshotMaxSizeKB: 512,
20
+ enableJavaScript: true,
21
+ blockPopups: true,
22
+ };
23
+ // ==================== 内网地址检测 ====================
24
+ const LOCAL_HOSTNAMES = [
25
+ 'localhost', '127.0.0.1', '0.0.0.0', '::1', '[::1]',
26
+ 'metadata.google.internal', '169.254.169.254',
27
+ ];
28
+ const LOCAL_RANGES = [
29
+ /^10\./,
30
+ /^172\.(1[6-9]|2\d|3[01])\./,
31
+ /^192\.168\./,
32
+ /^127\./,
33
+ /^0\./,
34
+ /^169\.254\./,
35
+ ];
36
+ function isLocalAddress(hostname) {
37
+ const clean = hostname.replace(/^\[|\]$/g, '').toLowerCase();
38
+ if (LOCAL_HOSTNAMES.includes(clean))
39
+ return true;
40
+ for (const range of LOCAL_RANGES) {
41
+ if (range.test(clean))
42
+ return true;
43
+ }
44
+ return false;
45
+ }
46
+ // ==================== 浏览器沙箱 ====================
47
+ export class BrowserSandbox {
48
+ logger;
49
+ config;
50
+ constructor(browserConfig) {
51
+ this.config = { ...DEFAULT_CONFIG, ...browserConfig };
52
+ this.logger = createLogger('BrowserSandbox');
53
+ }
54
+ /**
55
+ * 验证 URL 安全性
56
+ */
57
+ validateUrl(url) {
58
+ let parsed;
59
+ try {
60
+ parsed = new URL(url);
61
+ }
62
+ catch {
63
+ return { allowed: false, reason: `无效的 URL: ${url.slice(0, 100)}` };
64
+ }
65
+ const { protocol, hostname } = parsed;
66
+ // 仅允许 http/https
67
+ if (!['http:', 'https:'].includes(protocol)) {
68
+ return { allowed: false, reason: `不支持的协议: ${protocol}` };
69
+ }
70
+ // 阻止内网地址
71
+ if (isLocalAddress(hostname)) {
72
+ return { allowed: false, reason: `内网地址访问被阻止: ${hostname}` };
73
+ }
74
+ return { allowed: true };
75
+ }
76
+ /**
77
+ * 导航到指定 URL 并提取页面内容
78
+ */
79
+ async navigate(url, options) {
80
+ // URL 安全验证
81
+ const urlCheck = this.validateUrl(url);
82
+ if (!urlCheck.allowed) {
83
+ return { success: false, title: '', url, content: '', error: urlCheck.reason };
84
+ }
85
+ // 动态导入 playwright
86
+ let chromium;
87
+ try {
88
+ const pw = await import('playwright');
89
+ chromium = pw.chromium;
90
+ }
91
+ catch {
92
+ return {
93
+ success: false,
94
+ title: '',
95
+ url,
96
+ content: '',
97
+ error: 'playwright 未安装或 Chromium 不可用。请运行: npx playwright install chromium',
98
+ };
99
+ }
100
+ let browser = null;
101
+ let context = null;
102
+ let page = null;
103
+ try {
104
+ // 启动浏览器(每次操作独立实例,确保隔离)
105
+ browser = await chromium.launch({
106
+ headless: true,
107
+ args: [
108
+ '--no-sandbox',
109
+ '--disable-setuid-sandbox',
110
+ '--disable-dev-shm-usage',
111
+ '--disable-gpu',
112
+ '--disable-extensions',
113
+ '--no-first-run',
114
+ '--disable-default-apps',
115
+ ],
116
+ });
117
+ context = await browser.newContext({
118
+ userAgent: this.config.userAgent || 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
119
+ javaScriptEnabled: this.config.enableJavaScript,
120
+ ignoreHTTPSErrors: true,
121
+ viewport: { width: this.config.screenshotMaxWidth, height: 720 },
122
+ proxy: this.config.proxyUrl ? { server: this.config.proxyUrl } : undefined,
123
+ });
124
+ page = await context.newPage();
125
+ // 拦截弹窗
126
+ if (this.config.blockPopups) {
127
+ context.on('page', (p) => p.close().catch(() => { }));
128
+ }
129
+ // 导航
130
+ const response = await page.goto(url, {
131
+ timeout: this.config.pageTimeoutMs,
132
+ waitUntil: 'domcontentloaded',
133
+ });
134
+ // 检查响应
135
+ if (!response) {
136
+ return { success: false, title: '', url, content: '', error: '页面无响应' };
137
+ }
138
+ const status = response.status();
139
+ if (status >= 400) {
140
+ return {
141
+ success: false,
142
+ title: '',
143
+ url,
144
+ content: '',
145
+ error: `HTTP ${status}: ${response.statusText()}`,
146
+ };
147
+ }
148
+ // 检查响应大小
149
+ const contentLength = response.headers()['content-length'];
150
+ if (contentLength && parseInt(contentLength) > this.config.maxPageSizeKB * 1024) {
151
+ return {
152
+ success: false,
153
+ title: '',
154
+ url,
155
+ content: '',
156
+ error: `页面过大 (${Math.round(parseInt(contentLength) / 1024)}KB),超过限制 ${this.config.maxPageSizeKB}KB`,
157
+ };
158
+ }
159
+ // 等待可选条件
160
+ if (options?.waitFor) {
161
+ try {
162
+ await page.waitForSelector(options.waitFor, { timeout: 5000 });
163
+ }
164
+ catch {
165
+ this.logger.debug(`等待选择器超时: ${options.waitFor}`);
166
+ }
167
+ }
168
+ // 提取内容
169
+ let content = '';
170
+ let title = '';
171
+ if (options?.extractText !== false) {
172
+ title = await page.title();
173
+ // 提取正文文本 — 用字符串形式的函数避免 TypeScript DOM 类型检查
174
+ const extractFn = `() => {
175
+ const removeSelectors = ['script', 'style', 'nav', 'header', 'footer',
176
+ 'iframe', 'noscript', '[role="navigation"]', '[role="banner"]',
177
+ '[role="contentinfo"]', '.ad', '.advertisement', '.sidebar',
178
+ '.cookie-banner', '.popup', '.modal'];
179
+ for (const sel of removeSelectors) {
180
+ for (const el of document.querySelectorAll(sel)) {
181
+ el.remove();
182
+ }
183
+ }
184
+ const main = document.querySelector('main') ||
185
+ document.querySelector('article') ||
186
+ document.querySelector('[role="main"]') ||
187
+ document.body;
188
+ if (!main) return '';
189
+ const text = main.innerText || main.textContent || '';
190
+ return text.replace(/\\n{3,}/g, '\\n\\n').replace(/[ \\t]+/g, ' ').trim();
191
+ }`;
192
+ content = await page.evaluate(extractFn);
193
+ // 截断过大内容
194
+ const maxChars = this.config.maxPageSizeKB * 512;
195
+ if (content.length > maxChars) {
196
+ content = content.slice(0, maxChars) + '\n\n[... 内容过长,已截断]';
197
+ }
198
+ }
199
+ // 截图
200
+ let screenshotPath;
201
+ if (options?.screenshot) {
202
+ const shot = await this.internalScreenshot(page, options.workDir);
203
+ if (shot.success) {
204
+ screenshotPath = shot.path;
205
+ }
206
+ }
207
+ return {
208
+ success: true,
209
+ title,
210
+ url: page.url(), // 可能重定向后的最终 URL
211
+ content,
212
+ screenshotPath,
213
+ };
214
+ }
215
+ catch (err) {
216
+ const error = err;
217
+ this.logger.error('页面导航失败', { url, error: error.message });
218
+ return {
219
+ success: false,
220
+ title: '',
221
+ url,
222
+ content: '',
223
+ error: error.message.includes('Timeout')
224
+ ? `页面加载超时 (${this.config.pageTimeoutMs}ms)`
225
+ : error.message,
226
+ };
227
+ }
228
+ finally {
229
+ // 确保清理资源
230
+ try {
231
+ if (page)
232
+ await page.close().catch(() => { });
233
+ if (context)
234
+ await context.close().catch(() => { });
235
+ if (browser)
236
+ await browser.close().catch(() => { });
237
+ }
238
+ catch {
239
+ // 清理失败不影响返回
240
+ }
241
+ }
242
+ }
243
+ /**
244
+ * 提取页面结构化数据(链接、图片、元数据)
245
+ */
246
+ async extractStructured(url) {
247
+ const urlCheck = this.validateUrl(url);
248
+ if (!urlCheck.allowed) {
249
+ return { success: false, url, title: '', text: '', links: [], images: [], meta: {}, error: urlCheck.reason };
250
+ }
251
+ let chromium;
252
+ try {
253
+ const pw = await import('playwright');
254
+ chromium = pw.chromium;
255
+ }
256
+ catch {
257
+ return { success: false, url, title: '', text: '', links: [], images: [], meta: {}, error: 'playwright 不可用' };
258
+ }
259
+ let browser = null;
260
+ let context = null;
261
+ let page = null;
262
+ try {
263
+ browser = await chromium.launch({ headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox'] });
264
+ context = await browser.newContext({
265
+ userAgent: this.config.userAgent || 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
266
+ ignoreHTTPSErrors: true,
267
+ });
268
+ page = await context.newPage();
269
+ const response = await page.goto(url, {
270
+ timeout: this.config.pageTimeoutMs,
271
+ waitUntil: 'domcontentloaded',
272
+ });
273
+ if (!response || response.status() >= 400) {
274
+ return {
275
+ success: false,
276
+ url,
277
+ title: '',
278
+ text: '',
279
+ links: [],
280
+ images: [],
281
+ meta: {},
282
+ error: `HTTP ${response?.status() || '无响应'}`,
283
+ };
284
+ }
285
+ // 提取结构化数据 — 字符串形式避免 DOM 类型问题
286
+ const extractFn = `() => {
287
+ const title = document.title || '';
288
+ const body = document.body ? document.body.innerText || '' : '';
289
+ const anchors = [...document.querySelectorAll('a[href]')]
290
+ .slice(0, 50)
291
+ .map(a => ({ text: (a.textContent || '').trim().slice(0, 100), href: a.href }))
292
+ .filter(l => l.text && l.href && !l.href.startsWith('javascript:'));
293
+ const imgs = [...document.querySelectorAll('img')]
294
+ .slice(0, 20)
295
+ .map(img => ({ alt: (img.alt || '').slice(0, 100), src: img.src || '' }))
296
+ .filter(i => i.src);
297
+ const metas = {};
298
+ for (const meta of document.querySelectorAll('meta[name], meta[property]')) {
299
+ const n = meta.getAttribute('name') || meta.getAttribute('property') || '';
300
+ const c = meta.getAttribute('content') || '';
301
+ if (n && c) metas[n] = c.slice(0, 200);
302
+ }
303
+ return { title, text: body.slice(0, 50000), links: anchors, images: imgs, metas };
304
+ }`;
305
+ const data = await page.evaluate(extractFn);
306
+ // 截断文本
307
+ const maxChars = this.config.maxPageSizeKB * 512;
308
+ const text = data.text.length > maxChars ? data.text.slice(0, maxChars) + '\n\n[...已截断]' : data.text;
309
+ return {
310
+ success: true,
311
+ url: page.url(),
312
+ title: data.title,
313
+ text,
314
+ links: data.links,
315
+ images: data.images,
316
+ meta: data.metas,
317
+ };
318
+ }
319
+ catch (err) {
320
+ const error = err;
321
+ return {
322
+ success: false,
323
+ url,
324
+ title: '',
325
+ text: '',
326
+ links: [],
327
+ images: [],
328
+ meta: {},
329
+ error: error.message,
330
+ };
331
+ }
332
+ finally {
333
+ try {
334
+ if (page)
335
+ await page.close().catch(() => { });
336
+ if (context)
337
+ await context.close().catch(() => { });
338
+ if (browser)
339
+ await browser.close().catch(() => { });
340
+ }
341
+ catch { }
342
+ }
343
+ }
344
+ /**
345
+ * 截取页面截图
346
+ */
347
+ async takeScreenshot(url, workDir, options) {
348
+ const urlCheck = this.validateUrl(url);
349
+ if (!urlCheck.allowed) {
350
+ return { success: false, path: '', width: 0, height: 0, sizeKB: 0, error: urlCheck.reason };
351
+ }
352
+ let chromium;
353
+ try {
354
+ const pw = await import('playwright');
355
+ chromium = pw.chromium;
356
+ }
357
+ catch {
358
+ return { success: false, path: '', width: 0, height: 0, sizeKB: 0, error: 'playwright 不可用' };
359
+ }
360
+ let browser = null;
361
+ let context = null;
362
+ let page = null;
363
+ try {
364
+ browser = await chromium.launch({ headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox'] });
365
+ context = await browser.newContext({
366
+ userAgent: this.config.userAgent || 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
367
+ ignoreHTTPSErrors: true,
368
+ viewport: { width: this.config.screenshotMaxWidth, height: 720 },
369
+ });
370
+ page = await context.newPage();
371
+ await page.goto(url, {
372
+ timeout: this.config.pageTimeoutMs,
373
+ waitUntil: 'domcontentloaded',
374
+ });
375
+ // 如果指定了选择器,等待该元素出现
376
+ if (options?.selector) {
377
+ try {
378
+ await page.waitForSelector(options.selector, { timeout: 5000 });
379
+ }
380
+ catch {
381
+ // 超时继续截图整个页面
382
+ }
383
+ }
384
+ return await this.internalScreenshot(page, workDir, options?.fullPage);
385
+ }
386
+ catch (err) {
387
+ const error = err;
388
+ return { success: false, path: '', width: 0, height: 0, sizeKB: 0, error: error.message };
389
+ }
390
+ finally {
391
+ try {
392
+ if (page)
393
+ await page.close().catch(() => { });
394
+ if (context)
395
+ await context.close().catch(() => { });
396
+ if (browser)
397
+ await browser.close().catch(() => { });
398
+ }
399
+ catch { }
400
+ }
401
+ }
402
+ /**
403
+ * 内部截图方法(复用已打开的 page 实例)
404
+ */
405
+ async internalScreenshot(page, workDir, fullPage) {
406
+ try {
407
+ const fs = await import('node:fs/promises');
408
+ const nodePath = await import('node:path');
409
+ const timestamp = Date.now();
410
+ const dir = workDir || './data/sandbox';
411
+ await fs.mkdir(dir, { recursive: true });
412
+ const screenshotPath = nodePath.join(dir, `screenshot-${timestamp}.jpg`);
413
+ const buffer = await page.screenshot({
414
+ type: 'jpeg',
415
+ quality: Math.round(this.config.screenshotQuality * 100),
416
+ fullPage: fullPage || false,
417
+ });
418
+ const sizeKB = Math.round(buffer.length / 1024);
419
+ // 检查大小限制
420
+ if (sizeKB > this.config.screenshotMaxSizeKB) {
421
+ // 压缩重试
422
+ const compressedBuffer = await page.screenshot({
423
+ type: 'jpeg',
424
+ quality: Math.max(20, Math.round(this.config.screenshotQuality * 50)),
425
+ fullPage: false,
426
+ });
427
+ const compressedSize = Math.round(compressedBuffer.length / 1024);
428
+ if (compressedSize <= this.config.screenshotMaxSizeKB) {
429
+ await fs.writeFile(screenshotPath, compressedBuffer);
430
+ return { success: true, path: screenshotPath, width: this.config.screenshotMaxWidth, height: 720, sizeKB: compressedSize };
431
+ }
432
+ return { success: false, path: '', width: 0, height: 0, sizeKB, error: `截图过大 (${sizeKB}KB)` };
433
+ }
434
+ await fs.writeFile(screenshotPath, buffer);
435
+ const viewport = page.viewportSize();
436
+ return {
437
+ success: true,
438
+ path: screenshotPath,
439
+ width: viewport?.width || this.config.screenshotMaxWidth,
440
+ height: viewport?.height || 720,
441
+ sizeKB,
442
+ };
443
+ }
444
+ catch (err) {
445
+ return { success: false, path: '', width: 0, height: 0, sizeKB: 0, error: err.message };
446
+ }
447
+ }
448
+ }
449
+ //# sourceMappingURL=browser-sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-sandbox.js","sourceRoot":"","sources":["../../src/sandbox/browser-sandbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * 浏览器技能 (Browser Skill)
3
+ *
4
+ * 基于 Playwright 的网页浏览技能,为 Agent 提供安全上网能力。
5
+ *
6
+ * 提供 3 个工具:
7
+ * 1. browser_navigate - 导航到 URL 并提取页面文本内容
8
+ * 2. browser_extract - 提取页面结构化数据(链接/图片/元数据)
9
+ * 3. browser_screenshot - 截取页面截图
10
+ *
11
+ * 安全策略:
12
+ * - 权限级别:elevated(需要较高权限才能使用浏览器)
13
+ * - URL 验证:阻止内网/localhost/file:// 等危险地址
14
+ * - 页面大小限制:防止超大页面消耗资源
15
+ * - 截图大小限制:防止截图过大
16
+ * - Cookie 隔离:每次操作独立浏览器上下文
17
+ * - 弹窗拦截:阻止恶意弹窗
18
+ * - 超时控制:防止页面加载卡死
19
+ */
20
+ import type { ToolDefinition, ToolExecutorFn, PermissionLevel } from '../types/agent.js';
21
+ import type { Skill, SkillContext, SkillResult } from './types.js';
22
+ import type { BrowserSandboxConfig } from '../core/config.js';
23
+ export declare class BrowserSkill implements Skill {
24
+ private logger;
25
+ private sandbox;
26
+ readonly metadata: {
27
+ name: string;
28
+ displayName: string;
29
+ description: string;
30
+ version: string;
31
+ author: string;
32
+ tags: string[];
33
+ requiredLevel: PermissionLevel;
34
+ applicableTaskTypes: never[];
35
+ requiredTools: never[];
36
+ };
37
+ constructor(browserConfig?: BrowserSandboxConfig);
38
+ readonly tools: ToolDefinition[];
39
+ readonly toolExecutors: Record<string, ToolExecutorFn>;
40
+ execute(context: SkillContext): Promise<SkillResult>;
41
+ getSystemPromptAddon(): string;
42
+ init(): Promise<void>;
43
+ dispose(): Promise<void>;
44
+ private executeNavigate;
45
+ private executeExtract;
46
+ private executeScreenshot;
47
+ }
48
+ //# sourceMappingURL=browser-skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-skill.d.ts","sourceRoot":"","sources":["../../src/skills/browser-skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAsE9D,qBAAa,YAAa,YAAW,KAAK;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAiB;IAEhC,QAAQ,CAAC,QAAQ;;;;;;;uBAOc,eAAe;;;MAG5C;gBAEU,aAAa,CAAC,EAAE,oBAAoB;IAKhD,QAAQ,CAAC,KAAK,mBAAiB;IAE/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAUpD;IAEI,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAW1D,oBAAoB,IAAI,MAAM;IAkBxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAMhB,eAAe;YA4Cf,cAAc;YA0Ed,iBAAiB;CA8BhC"}