workerclaw 0.8.2 → 0.9.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.
- package/README.md +5 -0
- package/dist/agent/agent-engine.d.ts +33 -1
- package/dist/agent/agent-engine.d.ts.map +1 -1
- package/dist/agent/agent-engine.js +278 -2
- package/dist/agent/agent-engine.js.map +1 -1
- package/dist/sandbox/browser-sandbox.d.ts +31 -4
- package/dist/sandbox/browser-sandbox.d.ts.map +1 -1
- package/dist/sandbox/browser-sandbox.js +103 -125
- package/dist/sandbox/browser-sandbox.js.map +1 -1
- package/dist/sandbox/browser-session.d.ts +87 -0
- package/dist/sandbox/browser-session.d.ts.map +1 -0
- package/dist/sandbox/browser-session.js +250 -0
- package/dist/sandbox/browser-session.js.map +1 -0
- package/dist/skills/browser-skill.d.ts +23 -2
- package/dist/skills/browser-skill.d.ts.map +1 -1
- package/dist/skills/browser-skill.js +297 -20
- package/dist/skills/browser-skill.js.map +1 -1
- package/dist/task/task-manager.d.ts.map +1 -1
- package/dist/task/task-manager.js +13 -0
- package/dist/task/task-manager.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 浏览器会话管理器
|
|
3
|
+
*
|
|
4
|
+
* 管理 Playwright Browser 实例和 BrowserContext 池,实现:
|
|
5
|
+
* - 全局共享 Browser 进程(节省 ~400MB 内存)
|
|
6
|
+
* - 按 taskId 隔离 BrowserContext(Cookie/Storage/Session 独立)
|
|
7
|
+
* - 同一任务的多次浏览器操作复用同一 Context(保持登录态)
|
|
8
|
+
* - 任务结束后自动销毁 Context 释放资源
|
|
9
|
+
* - 超时自动清理防泄漏
|
|
10
|
+
*/
|
|
11
|
+
import { createLogger } from '../core/logger.js';
|
|
12
|
+
// ==================== 会话管理器 ====================
|
|
13
|
+
export class BrowserSessionManager {
|
|
14
|
+
logger;
|
|
15
|
+
config;
|
|
16
|
+
/** 共享 Browser 实例(懒初始化) */
|
|
17
|
+
sharedBrowser = null;
|
|
18
|
+
browserInitializing = null;
|
|
19
|
+
/** 会话池:taskId → BrowserSession */
|
|
20
|
+
sessions = new Map();
|
|
21
|
+
/** 超时清理定时器 */
|
|
22
|
+
cleanupTimer = null;
|
|
23
|
+
constructor(config) {
|
|
24
|
+
this.config = {
|
|
25
|
+
maxIdleMs: config?.maxIdleMs ?? 10 * 60 * 1000, // 10 分钟
|
|
26
|
+
maxSessions: config?.maxSessions ?? 5,
|
|
27
|
+
launchArgs: config?.launchArgs ?? [
|
|
28
|
+
'--no-sandbox',
|
|
29
|
+
'--disable-setuid-sandbox',
|
|
30
|
+
'--disable-dev-shm-usage',
|
|
31
|
+
'--disable-gpu',
|
|
32
|
+
'--disable-extensions',
|
|
33
|
+
'--no-first-run',
|
|
34
|
+
'--disable-default-apps',
|
|
35
|
+
],
|
|
36
|
+
userAgent: config?.userAgent || undefined,
|
|
37
|
+
proxyUrl: config?.proxyUrl || undefined,
|
|
38
|
+
};
|
|
39
|
+
this.logger = createLogger('BrowserSession');
|
|
40
|
+
// 每 5 分钟清理一次超时会话
|
|
41
|
+
this.cleanupTimer = setInterval(() => this.cleanupIdleSessions(), 5 * 60 * 1000);
|
|
42
|
+
this.cleanupTimer.unref(); // 不阻止进程退出
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 获取或创建指定任务的浏览器会话
|
|
46
|
+
*
|
|
47
|
+
* - 如果 taskId 已有会话且未过期,直接返回(复用 Context,保持登录态)
|
|
48
|
+
* - 否则创建新 Context(全新隔离环境)
|
|
49
|
+
*/
|
|
50
|
+
async getOrCreate(taskId) {
|
|
51
|
+
// 检查已有会话
|
|
52
|
+
const existing = this.sessions.get(taskId);
|
|
53
|
+
if (existing) {
|
|
54
|
+
existing.lastUsedAt = Date.now();
|
|
55
|
+
this.logger.debug(`复用已有会话 [${taskId}]`, {
|
|
56
|
+
ageMs: Date.now() - existing.createdAt,
|
|
57
|
+
idleMs: Date.now() - existing.lastUsedAt,
|
|
58
|
+
});
|
|
59
|
+
return existing;
|
|
60
|
+
}
|
|
61
|
+
// 检查并发上限
|
|
62
|
+
if (this.sessions.size >= this.config.maxSessions) {
|
|
63
|
+
// 尝试清理最老的空闲会话
|
|
64
|
+
const evicted = await this.evictOldestIdle();
|
|
65
|
+
if (!evicted) {
|
|
66
|
+
throw new Error(`浏览器会话已满 (${this.config.maxSessions}),请等待其他任务完成后再试`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// 获取/创建共享 Browser
|
|
70
|
+
const browser = await this.getSharedBrowser();
|
|
71
|
+
// 创建新 Context(按任务隔离)
|
|
72
|
+
const contextConfig = {
|
|
73
|
+
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',
|
|
74
|
+
javaScriptEnabled: true,
|
|
75
|
+
ignoreHTTPSErrors: true,
|
|
76
|
+
viewport: { width: 1280, height: 720 },
|
|
77
|
+
};
|
|
78
|
+
if (this.config.proxyUrl) {
|
|
79
|
+
contextConfig.proxy = { server: this.config.proxyUrl };
|
|
80
|
+
}
|
|
81
|
+
const context = await browser.newContext(contextConfig);
|
|
82
|
+
const session = {
|
|
83
|
+
browser,
|
|
84
|
+
context,
|
|
85
|
+
createdAt: Date.now(),
|
|
86
|
+
lastUsedAt: Date.now(),
|
|
87
|
+
pageCount: 0,
|
|
88
|
+
};
|
|
89
|
+
this.sessions.set(taskId, session);
|
|
90
|
+
this.logger.info(`创建新浏览器会话 [${taskId}]`, {
|
|
91
|
+
totalSessions: this.sessions.size,
|
|
92
|
+
});
|
|
93
|
+
return session;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 销毁指定任务的会话
|
|
97
|
+
*/
|
|
98
|
+
async destroy(taskId) {
|
|
99
|
+
const session = this.sessions.get(taskId);
|
|
100
|
+
if (!session)
|
|
101
|
+
return;
|
|
102
|
+
try {
|
|
103
|
+
// 关闭所有 page
|
|
104
|
+
const pages = session.context.pages();
|
|
105
|
+
for (const page of pages) {
|
|
106
|
+
await page.close().catch(() => { });
|
|
107
|
+
}
|
|
108
|
+
// 关闭 context
|
|
109
|
+
await session.context.close().catch(() => { });
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
this.logger.debug(`关闭会话 context 异常 [${taskId}]`, {
|
|
113
|
+
error: err.message,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
this.sessions.delete(taskId);
|
|
117
|
+
this.logger.debug(`销毁会话 [${taskId}]`, { remaining: this.sessions.size });
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 销毁所有会话(关闭共享浏览器)
|
|
121
|
+
*/
|
|
122
|
+
async destroyAll() {
|
|
123
|
+
// 关闭所有 context
|
|
124
|
+
for (const [taskId] of this.sessions) {
|
|
125
|
+
await this.destroy(taskId);
|
|
126
|
+
}
|
|
127
|
+
// 关闭共享浏览器
|
|
128
|
+
if (this.sharedBrowser) {
|
|
129
|
+
try {
|
|
130
|
+
await this.sharedBrowser.close().catch(() => { });
|
|
131
|
+
}
|
|
132
|
+
catch { }
|
|
133
|
+
this.sharedBrowser = null;
|
|
134
|
+
}
|
|
135
|
+
// 清理定时器
|
|
136
|
+
if (this.cleanupTimer) {
|
|
137
|
+
clearInterval(this.cleanupTimer);
|
|
138
|
+
this.cleanupTimer = null;
|
|
139
|
+
}
|
|
140
|
+
this.logger.info('浏览器会话管理器已完全关闭');
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 获取当前会话统计
|
|
144
|
+
*/
|
|
145
|
+
getStats() {
|
|
146
|
+
return {
|
|
147
|
+
totalSessions: this.sessions.size,
|
|
148
|
+
maxSessions: this.config.maxSessions,
|
|
149
|
+
sessions: Array.from(this.sessions.entries()).map(([id, s]) => ({
|
|
150
|
+
taskId: id,
|
|
151
|
+
ageMs: Date.now() - s.createdAt,
|
|
152
|
+
idleMs: Date.now() - s.lastUsedAt,
|
|
153
|
+
pageCount: s.context?.pages()?.length ?? 0,
|
|
154
|
+
})),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
// ==================== 私有方法 ====================
|
|
158
|
+
/**
|
|
159
|
+
* 获取共享 Browser 实例(懒初始化,单例)
|
|
160
|
+
*/
|
|
161
|
+
async getSharedBrowser() {
|
|
162
|
+
// 已初始化
|
|
163
|
+
if (this.sharedBrowser) {
|
|
164
|
+
try {
|
|
165
|
+
// 检查是否仍然连接
|
|
166
|
+
if (this.sharedBrowser.isConnected()) {
|
|
167
|
+
return this.sharedBrowser;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// 已断开,重新初始化
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// 防止并发初始化
|
|
175
|
+
if (this.browserInitializing) {
|
|
176
|
+
return this.browserInitializing;
|
|
177
|
+
}
|
|
178
|
+
this.browserInitializing = this.launchBrowser();
|
|
179
|
+
try {
|
|
180
|
+
this.sharedBrowser = await this.browserInitializing;
|
|
181
|
+
return this.sharedBrowser;
|
|
182
|
+
}
|
|
183
|
+
finally {
|
|
184
|
+
this.browserInitializing = null;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* 启动 Chromium 浏览器
|
|
189
|
+
*/
|
|
190
|
+
async launchBrowser() {
|
|
191
|
+
let chromium;
|
|
192
|
+
try {
|
|
193
|
+
const pw = await import('playwright');
|
|
194
|
+
chromium = pw.chromium;
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
throw new Error('playwright 未安装或 Chromium 不可用。请运行: npx playwright install chromium');
|
|
198
|
+
}
|
|
199
|
+
const browser = await chromium.launch({
|
|
200
|
+
headless: true,
|
|
201
|
+
args: this.config.launchArgs,
|
|
202
|
+
});
|
|
203
|
+
this.logger.info('Chromium 浏览器已启动(共享实例)');
|
|
204
|
+
// 监听断开事件
|
|
205
|
+
browser.on('disconnected', () => {
|
|
206
|
+
this.logger.warn('Chromium 浏览器已断开连接');
|
|
207
|
+
this.sharedBrowser = null;
|
|
208
|
+
// 清理所有会话引用
|
|
209
|
+
this.sessions.clear();
|
|
210
|
+
});
|
|
211
|
+
return browser;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* 清理超时空闲会话
|
|
215
|
+
*/
|
|
216
|
+
async cleanupIdleSessions() {
|
|
217
|
+
const now = Date.now();
|
|
218
|
+
const toDestroy = [];
|
|
219
|
+
for (const [taskId, session] of this.sessions) {
|
|
220
|
+
const idleMs = now - session.lastUsedAt;
|
|
221
|
+
if (idleMs > this.config.maxIdleMs) {
|
|
222
|
+
toDestroy.push(taskId);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
for (const taskId of toDestroy) {
|
|
226
|
+
this.logger.info(`清理超时会话 [${taskId}](空闲超过 ${this.config.maxIdleMs / 1000}s)`);
|
|
227
|
+
await this.destroy(taskId);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* 驱逐最老的空闲会话(用于并发上限控制)
|
|
232
|
+
*/
|
|
233
|
+
async evictOldestIdle() {
|
|
234
|
+
let oldestTaskId = null;
|
|
235
|
+
let oldestLastUsed = Infinity;
|
|
236
|
+
for (const [taskId, session] of this.sessions) {
|
|
237
|
+
if (session.lastUsedAt < oldestLastUsed) {
|
|
238
|
+
oldestLastUsed = session.lastUsedAt;
|
|
239
|
+
oldestTaskId = taskId;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (oldestTaskId) {
|
|
243
|
+
this.logger.info(`驱逐最老空闲会话 [${oldestTaskId}]`);
|
|
244
|
+
await this.destroy(oldestTaskId);
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=browser-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-session.js","sourceRoot":"","sources":["../../src/sandbox/browser-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,17 +3,23 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 基于 Playwright 的网页浏览技能,为 Agent 提供安全上网能力。
|
|
5
5
|
*
|
|
6
|
-
* 提供
|
|
6
|
+
* 提供 6 个工具:
|
|
7
7
|
* 1. browser_navigate - 导航到 URL 并提取页面文本内容
|
|
8
8
|
* 2. browser_extract - 提取页面结构化数据(链接/图片/元数据)
|
|
9
9
|
* 3. browser_screenshot - 截取页面截图
|
|
10
|
+
* 4. browser_click - 点击页面元素
|
|
11
|
+
* 5. browser_fill - 在输入框中填写内容
|
|
12
|
+
* 6. browser_wait - 等待页面元素出现
|
|
13
|
+
*
|
|
14
|
+
* 会话隔离:
|
|
15
|
+
* - 同一 taskId 的多次操作共享 BrowserContext(保持 Cookie/登录态)
|
|
16
|
+
* - 不同 taskId 之间 Context 完全隔离
|
|
10
17
|
*
|
|
11
18
|
* 安全策略:
|
|
12
19
|
* - 权限级别:elevated(需要较高权限才能使用浏览器)
|
|
13
20
|
* - URL 验证:阻止内网/localhost/file:// 等危险地址
|
|
14
21
|
* - 页面大小限制:防止超大页面消耗资源
|
|
15
22
|
* - 截图大小限制:防止截图过大
|
|
16
|
-
* - Cookie 隔离:每次操作独立浏览器上下文
|
|
17
23
|
* - 弹窗拦截:阻止恶意弹窗
|
|
18
24
|
* - 超时控制:防止页面加载卡死
|
|
19
25
|
*/
|
|
@@ -23,6 +29,9 @@ import type { BrowserSandboxConfig } from '../core/config.js';
|
|
|
23
29
|
export declare class BrowserSkill implements Skill {
|
|
24
30
|
private logger;
|
|
25
31
|
private sandbox;
|
|
32
|
+
private sessionManager;
|
|
33
|
+
/** 每个任务的活跃 page(用于交互式操作) */
|
|
34
|
+
private activePages;
|
|
26
35
|
readonly metadata: {
|
|
27
36
|
name: string;
|
|
28
37
|
displayName: string;
|
|
@@ -41,8 +50,20 @@ export declare class BrowserSkill implements Skill {
|
|
|
41
50
|
getSystemPromptAddon(): string;
|
|
42
51
|
init(): Promise<void>;
|
|
43
52
|
dispose(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* 销毁指定任务的会话(由 AgentEngine 在任务结束时调用)
|
|
55
|
+
*/
|
|
56
|
+
destroyTaskSession(taskId: string): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* 获取或创建任务的活跃 page
|
|
59
|
+
* 用于交互式操作(click/fill/wait),需要先 navigate 才能使用
|
|
60
|
+
*/
|
|
61
|
+
private getActivePage;
|
|
44
62
|
private executeNavigate;
|
|
45
63
|
private executeExtract;
|
|
46
64
|
private executeScreenshot;
|
|
65
|
+
private executeClick;
|
|
66
|
+
private executeFill;
|
|
67
|
+
private executeWait;
|
|
47
68
|
}
|
|
48
69
|
//# sourceMappingURL=browser-skill.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-skill.d.ts","sourceRoot":"","sources":["../../src/skills/browser-skill.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"browser-skill.d.ts","sourceRoot":"","sources":["../../src/skills/browser-skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH,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;AAmI9D,qBAAa,YAAa,YAAW,KAAK;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,cAAc,CAAwB;IAE9C,4BAA4B;IAC5B,OAAO,CAAC,WAAW,CAA0B;IAE7C,QAAQ,CAAC,QAAQ;;;;;;;uBAOc,eAAe;;;MAG5C;gBAEU,aAAa,CAAC,EAAE,oBAAoB;IAMhD,QAAQ,CAAC,KAAK,mBAAiB;IAE/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAmBpD;IAEI,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAS1D,oBAAoB,IAAI,MAAM;IA2BxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAY9B;;OAEG;IACG,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAavD;;;OAGG;YACW,aAAa;YAiBb,eAAe;YAwEf,cAAc;YA2Ed,iBAAiB;YAgCjB,YAAY;YAkDZ,WAAW;YA0CX,WAAW;CAiC1B"}
|