claude-chrome-parallel 2.2.2 → 3.0.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 +352 -45
- package/dist/cdp/client.d.ts +30 -3
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +75 -6
- package/dist/cdp/client.js.map +1 -1
- package/dist/cdp/connection-pool.d.ts +5 -1
- package/dist/cdp/connection-pool.d.ts.map +1 -1
- package/dist/cdp/connection-pool.js +7 -1
- package/dist/cdp/connection-pool.js.map +1 -1
- package/dist/chrome/launcher.d.ts +2 -0
- package/dist/chrome/launcher.d.ts.map +1 -1
- package/dist/chrome/launcher.js +13 -0
- package/dist/chrome/launcher.js.map +1 -1
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/global.d.ts +18 -0
- package/dist/config/global.d.ts.map +1 -0
- package/dist/config/global.js +24 -0
- package/dist/config/global.js.map +1 -0
- package/dist/config/index.d.ts +1 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -0
- package/dist/config/index.js.map +1 -1
- package/dist/index.js +20 -1
- package/dist/index.js.map +1 -1
- package/dist/orchestration/state-manager.d.ts +117 -0
- package/dist/orchestration/state-manager.d.ts.map +1 -0
- package/dist/orchestration/state-manager.js +435 -0
- package/dist/orchestration/state-manager.js.map +1 -0
- package/dist/orchestration/workflow-engine.d.ts +96 -0
- package/dist/orchestration/workflow-engine.d.ts.map +1 -0
- package/dist/orchestration/workflow-engine.js +326 -0
- package/dist/orchestration/workflow-engine.js.map +1 -0
- package/dist/session-manager.d.ts +62 -18
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +274 -100
- package/dist/session-manager.js.map +1 -1
- package/dist/tools/computer.d.ts.map +1 -1
- package/dist/tools/computer.js +49 -3
- package/dist/tools/computer.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +13 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/navigate.d.ts.map +1 -1
- package/dist/tools/navigate.js +91 -8
- package/dist/tools/navigate.js.map +1 -1
- package/dist/tools/orchestration.d.ts +6 -0
- package/dist/tools/orchestration.d.ts.map +1 -0
- package/dist/tools/orchestration.js +436 -0
- package/dist/tools/orchestration.js.map +1 -0
- package/dist/tools/tabs-context.d.ts.map +1 -1
- package/dist/tools/tabs-context.js +42 -23
- package/dist/tools/tabs-context.js.map +1 -1
- package/dist/tools/tabs-create.d.ts +1 -1
- package/dist/tools/tabs-create.d.ts.map +1 -1
- package/dist/tools/tabs-create.js +30 -6
- package/dist/tools/tabs-create.js.map +1 -1
- package/dist/tools/worker-create.d.ts +7 -0
- package/dist/tools/worker-create.d.ts.map +1 -0
- package/dist/tools/worker-create.js +62 -0
- package/dist/tools/worker-create.js.map +1 -0
- package/dist/tools/worker-delete.d.ts +6 -0
- package/dist/tools/worker-delete.d.ts.map +1 -0
- package/dist/tools/worker-delete.js +80 -0
- package/dist/tools/worker-delete.js.map +1 -0
- package/dist/tools/worker-list.d.ts +6 -0
- package/dist/tools/worker-list.d.ts.map +1 -0
- package/dist/tools/worker-list.js +67 -0
- package/dist/tools/worker-list.js.map +1 -0
- package/dist/types/session.d.ts +35 -2
- package/dist/types/session.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Workflow Engine - Executes parallel browser workflows
|
|
4
|
+
* Manages worker lifecycle and result aggregation
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.WorkflowEngine = void 0;
|
|
8
|
+
exports.getWorkflowEngine = getWorkflowEngine;
|
|
9
|
+
const session_manager_1 = require("../session-manager");
|
|
10
|
+
const state_manager_1 = require("./state-manager");
|
|
11
|
+
class WorkflowEngine {
|
|
12
|
+
sessionManager = (0, session_manager_1.getSessionManager)();
|
|
13
|
+
stateManager = (0, state_manager_1.getOrchestrationStateManager)();
|
|
14
|
+
/**
|
|
15
|
+
* Initialize a new workflow
|
|
16
|
+
* Creates workers, tabs, and scratchpads
|
|
17
|
+
*/
|
|
18
|
+
async initWorkflow(sessionId, workflow) {
|
|
19
|
+
const orchestrationId = `orch-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
20
|
+
const workers = [];
|
|
21
|
+
// Create workers and tabs for each step
|
|
22
|
+
for (const step of workflow.steps) {
|
|
23
|
+
// Create isolated worker
|
|
24
|
+
const worker = await this.sessionManager.createWorker(sessionId, {
|
|
25
|
+
id: step.workerId,
|
|
26
|
+
name: step.workerName,
|
|
27
|
+
});
|
|
28
|
+
// Create tab in worker context
|
|
29
|
+
const { targetId } = await this.sessionManager.createTarget(sessionId, step.url, worker.id);
|
|
30
|
+
workers.push({
|
|
31
|
+
workerId: worker.id,
|
|
32
|
+
workerName: step.workerName,
|
|
33
|
+
tabId: targetId,
|
|
34
|
+
task: step.task,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
// Initialize orchestration state
|
|
38
|
+
await this.stateManager.initOrchestration(orchestrationId, workflow.name, workers);
|
|
39
|
+
console.error(`[WorkflowEngine] Initialized workflow ${orchestrationId} with ${workers.length} workers`);
|
|
40
|
+
return {
|
|
41
|
+
orchestrationId,
|
|
42
|
+
workers: workers.map(w => ({
|
|
43
|
+
workerId: w.workerId,
|
|
44
|
+
workerName: w.workerName,
|
|
45
|
+
tabId: w.tabId,
|
|
46
|
+
})),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Update worker progress
|
|
51
|
+
*/
|
|
52
|
+
async updateWorkerProgress(workerName, update) {
|
|
53
|
+
if (update.status || update.iteration !== undefined || update.extractedData !== undefined) {
|
|
54
|
+
await this.stateManager.updateWorkerState(workerName, {
|
|
55
|
+
status: update.status,
|
|
56
|
+
iteration: update.iteration,
|
|
57
|
+
extractedData: update.extractedData,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
if (update.action && update.result) {
|
|
61
|
+
await this.stateManager.addProgressEntry(workerName, update.action, update.result, update.error);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Mark worker as complete
|
|
66
|
+
* Note: This method prevents double-counting by checking the previous worker status
|
|
67
|
+
*/
|
|
68
|
+
async completeWorker(workerName, status, resultSummary, extractedData) {
|
|
69
|
+
await this.stateManager.updateWorkerState(workerName, {
|
|
70
|
+
status,
|
|
71
|
+
extractedData,
|
|
72
|
+
});
|
|
73
|
+
// Update orchestration state
|
|
74
|
+
const orch = await this.stateManager.readOrchestrationState();
|
|
75
|
+
if (orch) {
|
|
76
|
+
const workerIdx = orch.workers.findIndex(w => w.workerName === workerName);
|
|
77
|
+
if (workerIdx !== -1) {
|
|
78
|
+
const previousStatus = orch.workers[workerIdx].status;
|
|
79
|
+
const wasAlreadyCompleted = previousStatus === 'SUCCESS' || previousStatus === 'PARTIAL' || previousStatus === 'FAIL';
|
|
80
|
+
orch.workers[workerIdx].status = status;
|
|
81
|
+
orch.workers[workerIdx].resultSummary = resultSummary;
|
|
82
|
+
// Only update counters if the worker wasn't already in a completed state
|
|
83
|
+
// This prevents double-counting when completeWorker is called multiple times
|
|
84
|
+
if (!wasAlreadyCompleted) {
|
|
85
|
+
if (status === 'SUCCESS' || status === 'PARTIAL') {
|
|
86
|
+
orch.completedWorkers++;
|
|
87
|
+
}
|
|
88
|
+
if (status === 'FAIL') {
|
|
89
|
+
orch.failedWorkers++;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// If status changed from one completed state to another, adjust counters
|
|
94
|
+
const wasCompleted = previousStatus === 'SUCCESS' || previousStatus === 'PARTIAL';
|
|
95
|
+
const wasFailed = previousStatus === 'FAIL';
|
|
96
|
+
const isNowCompleted = status === 'SUCCESS' || status === 'PARTIAL';
|
|
97
|
+
const isNowFailed = status === 'FAIL';
|
|
98
|
+
if (wasCompleted && isNowFailed) {
|
|
99
|
+
orch.completedWorkers--;
|
|
100
|
+
orch.failedWorkers++;
|
|
101
|
+
}
|
|
102
|
+
else if (wasFailed && isNowCompleted) {
|
|
103
|
+
orch.failedWorkers--;
|
|
104
|
+
orch.completedWorkers++;
|
|
105
|
+
}
|
|
106
|
+
// If both were completed or both were failed, no change needed
|
|
107
|
+
}
|
|
108
|
+
// Check if all workers are done
|
|
109
|
+
const allDone = orch.workers.every(w => w.status === 'SUCCESS' || w.status === 'PARTIAL' || w.status === 'FAIL');
|
|
110
|
+
if (allDone) {
|
|
111
|
+
if (orch.failedWorkers === orch.workers.length) {
|
|
112
|
+
orch.status = 'FAILED';
|
|
113
|
+
}
|
|
114
|
+
else if (orch.failedWorkers > 0) {
|
|
115
|
+
orch.status = 'PARTIAL';
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
orch.status = 'COMPLETED';
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
orch.status = 'RUNNING';
|
|
123
|
+
}
|
|
124
|
+
await this.stateManager.writeOrchestrationState(orch);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get current orchestration status
|
|
130
|
+
*/
|
|
131
|
+
async getOrchestrationStatus() {
|
|
132
|
+
return this.stateManager.readOrchestrationState();
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get all worker states
|
|
136
|
+
*/
|
|
137
|
+
async getAllWorkerStates() {
|
|
138
|
+
return this.stateManager.getAllWorkerStates();
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get worker state by name
|
|
142
|
+
*/
|
|
143
|
+
async getWorkerState(workerName) {
|
|
144
|
+
return this.stateManager.readWorkerState(workerName);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Collect final results from all workers
|
|
148
|
+
*/
|
|
149
|
+
async collectResults() {
|
|
150
|
+
const orch = await this.stateManager.readOrchestrationState();
|
|
151
|
+
if (!orch)
|
|
152
|
+
return null;
|
|
153
|
+
const workerResults = [];
|
|
154
|
+
const workerStates = await this.stateManager.getAllWorkerStates();
|
|
155
|
+
for (const state of workerStates) {
|
|
156
|
+
workerResults.push({
|
|
157
|
+
workerId: state.workerId,
|
|
158
|
+
workerName: state.workerName,
|
|
159
|
+
tabId: state.tabId,
|
|
160
|
+
status: state.status === 'SUCCESS' ? 'SUCCESS'
|
|
161
|
+
: state.status === 'PARTIAL' ? 'PARTIAL'
|
|
162
|
+
: 'FAIL',
|
|
163
|
+
resultSummary: `${state.status}: ${state.iteration} iterations`,
|
|
164
|
+
dataExtracted: state.extractedData,
|
|
165
|
+
iterations: state.iteration,
|
|
166
|
+
errors: state.errors,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
const completedCount = workerResults.filter(r => r.status === 'SUCCESS' || r.status === 'PARTIAL').length;
|
|
170
|
+
const failedCount = workerResults.filter(r => r.status === 'FAIL').length;
|
|
171
|
+
const duration = Date.now() - orch.createdAt;
|
|
172
|
+
return {
|
|
173
|
+
orchestrationId: orch.orchestrationId,
|
|
174
|
+
status: orch.status === 'COMPLETED' ? 'COMPLETED'
|
|
175
|
+
: orch.status === 'PARTIAL' ? 'PARTIAL'
|
|
176
|
+
: 'FAILED',
|
|
177
|
+
workerResults,
|
|
178
|
+
completedCount,
|
|
179
|
+
failedCount,
|
|
180
|
+
duration,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Cleanup workflow resources
|
|
185
|
+
*/
|
|
186
|
+
async cleanupWorkflow(sessionId) {
|
|
187
|
+
// Get all workers from orchestration state
|
|
188
|
+
const orch = await this.stateManager.readOrchestrationState();
|
|
189
|
+
if (!orch)
|
|
190
|
+
return;
|
|
191
|
+
// Delete workers (which closes tabs and contexts)
|
|
192
|
+
for (const worker of orch.workers) {
|
|
193
|
+
try {
|
|
194
|
+
await this.sessionManager.deleteWorker(sessionId, worker.workerId);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// Worker might already be deleted
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Cleanup state files
|
|
201
|
+
await this.stateManager.cleanup();
|
|
202
|
+
console.error(`[WorkflowEngine] Cleaned up workflow resources`);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Generate worker agent prompt for Background Task
|
|
206
|
+
*/
|
|
207
|
+
generateWorkerPrompt(workerId, workerName, tabId, task, successCriteria) {
|
|
208
|
+
return `## Chrome-Sisyphus Worker Agent
|
|
209
|
+
|
|
210
|
+
You are an autonomous browser automation worker. Execute your assigned task completely before returning.
|
|
211
|
+
|
|
212
|
+
### Configuration
|
|
213
|
+
- Worker ID: ${workerId}
|
|
214
|
+
- Worker Name: ${workerName}
|
|
215
|
+
- Tab ID: ${tabId}
|
|
216
|
+
- Scratchpad: .agent/chrome-sisyphus/worker-${workerName}.md
|
|
217
|
+
|
|
218
|
+
### Your Task
|
|
219
|
+
${task}
|
|
220
|
+
|
|
221
|
+
### Success Criteria
|
|
222
|
+
${successCriteria}
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## CRITICAL RULES
|
|
227
|
+
|
|
228
|
+
1. **ALWAYS include tabId="${tabId}" in EVERY MCP tool call**
|
|
229
|
+
2. **Update scratchpad after EVERY action using Write tool**
|
|
230
|
+
3. **Maximum 5 iterations**
|
|
231
|
+
4. **Return compressed result only - NO screenshots or full DOM**
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Available MCP Tools
|
|
236
|
+
|
|
237
|
+
### Navigation
|
|
238
|
+
mcp__chrome-parallel__navigate
|
|
239
|
+
- url: string (required)
|
|
240
|
+
- tabId: "${tabId}" (required)
|
|
241
|
+
|
|
242
|
+
### Interaction
|
|
243
|
+
mcp__chrome-parallel__computer
|
|
244
|
+
- action: "left_click" | "type" | "screenshot" | "scroll" | "key"
|
|
245
|
+
- tabId: "${tabId}" (required)
|
|
246
|
+
- coordinate: [x, y] (for clicks)
|
|
247
|
+
- text: string (for typing)
|
|
248
|
+
|
|
249
|
+
### Page Reading
|
|
250
|
+
mcp__chrome-parallel__read_page
|
|
251
|
+
- tabId: "${tabId}" (required)
|
|
252
|
+
- filter: "interactive" | "all"
|
|
253
|
+
|
|
254
|
+
### Element Finding
|
|
255
|
+
mcp__chrome-parallel__find
|
|
256
|
+
- query: string (natural language)
|
|
257
|
+
- tabId: "${tabId}" (required)
|
|
258
|
+
|
|
259
|
+
### Form Input
|
|
260
|
+
mcp__chrome-parallel__form_input
|
|
261
|
+
- ref: string (element reference from find/read_page)
|
|
262
|
+
- value: string | boolean | number
|
|
263
|
+
- tabId: "${tabId}" (required)
|
|
264
|
+
|
|
265
|
+
### JavaScript Execution
|
|
266
|
+
mcp__chrome-parallel__javascript_tool
|
|
267
|
+
- action: "javascript_exec"
|
|
268
|
+
- text: string (JS code)
|
|
269
|
+
- tabId: "${tabId}" (required)
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Execution Algorithm (Ralph Loop)
|
|
274
|
+
|
|
275
|
+
for iteration in 1..5:
|
|
276
|
+
1. Assess current state (read page or check scratchpad)
|
|
277
|
+
2. Decide next action
|
|
278
|
+
3. Execute MCP tool with tabId="${tabId}"
|
|
279
|
+
4. Update scratchpad with Write tool
|
|
280
|
+
5. Check if success criteria met -> if yes, return SUCCESS
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## Final Output Format
|
|
285
|
+
|
|
286
|
+
When done, your LAST message MUST contain:
|
|
287
|
+
|
|
288
|
+
---RESULT---
|
|
289
|
+
{
|
|
290
|
+
"status": "SUCCESS" | "PARTIAL" | "FAIL",
|
|
291
|
+
"workerName": "${workerName}",
|
|
292
|
+
"resultSummary": "Brief summary (max 100 chars)",
|
|
293
|
+
"dataExtracted": {
|
|
294
|
+
// Your extracted data here
|
|
295
|
+
},
|
|
296
|
+
"scratchpadPath": ".agent/chrome-sisyphus/worker-${workerName}.md",
|
|
297
|
+
"iterations": 3,
|
|
298
|
+
"errors": [],
|
|
299
|
+
"EXIT_SIGNAL": true
|
|
300
|
+
}
|
|
301
|
+
---END---
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## Error Handling
|
|
306
|
+
|
|
307
|
+
| Error | Strategy |
|
|
308
|
+
|-------|----------|
|
|
309
|
+
| Element not found | Try find with different query |
|
|
310
|
+
| Page timeout | Refresh and retry |
|
|
311
|
+
| Captcha | Report FAIL |
|
|
312
|
+
| Network error | Wait 2s, retry |
|
|
313
|
+
|
|
314
|
+
Now begin your task. Navigate to the target site and complete the assigned work.`;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
exports.WorkflowEngine = WorkflowEngine;
|
|
318
|
+
// Singleton instance
|
|
319
|
+
let workflowEngineInstance = null;
|
|
320
|
+
function getWorkflowEngine() {
|
|
321
|
+
if (!workflowEngineInstance) {
|
|
322
|
+
workflowEngineInstance = new WorkflowEngine();
|
|
323
|
+
}
|
|
324
|
+
return workflowEngineInstance;
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=workflow-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-engine.js","sourceRoot":"","sources":["../../src/orchestration/workflow-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Session Manager - Manages lifecycle of parallel Claude Code sessions
|
|
3
|
+
* Supports multiple Workers within a single session for parallel browser operations
|
|
3
4
|
*/
|
|
4
5
|
import { Page } from 'puppeteer-core';
|
|
5
|
-
import { Session, SessionInfo, SessionCreateOptions, SessionEvent } from './types/session';
|
|
6
|
+
import { Session, SessionInfo, SessionCreateOptions, SessionEvent, Worker, WorkerInfo, WorkerCreateOptions } from './types/session';
|
|
6
7
|
import { CDPClient } from './cdp/client';
|
|
7
8
|
import { PoolStats } from './cdp/connection-pool';
|
|
8
9
|
export interface SessionManagerConfig {
|
|
@@ -14,12 +15,15 @@ export interface SessionManagerConfig {
|
|
|
14
15
|
autoCleanup?: boolean;
|
|
15
16
|
/** Maximum number of sessions (default: 100) */
|
|
16
17
|
maxSessions?: number;
|
|
17
|
-
/**
|
|
18
|
+
/** Maximum workers per session (default: 20) */
|
|
19
|
+
maxWorkersPerSession?: number;
|
|
20
|
+
/** Use connection pool for page management (default: false for worker isolation) */
|
|
18
21
|
useConnectionPool?: boolean;
|
|
19
22
|
}
|
|
20
23
|
export interface SessionManagerStats {
|
|
21
24
|
activeSessions: number;
|
|
22
25
|
totalTargets: number;
|
|
26
|
+
totalWorkers: number;
|
|
23
27
|
totalSessionsCreated: number;
|
|
24
28
|
totalSessionsCleaned: number;
|
|
25
29
|
uptime: number;
|
|
@@ -29,7 +33,7 @@ export interface SessionManagerStats {
|
|
|
29
33
|
}
|
|
30
34
|
export declare class SessionManager {
|
|
31
35
|
private sessions;
|
|
32
|
-
private
|
|
36
|
+
private targetToWorker;
|
|
33
37
|
private cdpClient;
|
|
34
38
|
private connectionPool;
|
|
35
39
|
private queueManager;
|
|
@@ -66,7 +70,7 @@ export declare class SessionManager {
|
|
|
66
70
|
*/
|
|
67
71
|
ensureConnected(): Promise<void>;
|
|
68
72
|
/**
|
|
69
|
-
* Create a new session
|
|
73
|
+
* Create a new session with a default worker
|
|
70
74
|
*/
|
|
71
75
|
createSession(options?: SessionCreateOptions): Promise<Session>;
|
|
72
76
|
/**
|
|
@@ -82,7 +86,7 @@ export declare class SessionManager {
|
|
|
82
86
|
*/
|
|
83
87
|
touchSession(sessionId: string): void;
|
|
84
88
|
/**
|
|
85
|
-
* Delete a session and clean up
|
|
89
|
+
* Delete a session and clean up all workers
|
|
86
90
|
*/
|
|
87
91
|
deleteSession(sessionId: string): Promise<void>;
|
|
88
92
|
/**
|
|
@@ -94,36 +98,80 @@ export declare class SessionManager {
|
|
|
94
98
|
*/
|
|
95
99
|
cleanupAllSessions(): Promise<number>;
|
|
96
100
|
/**
|
|
97
|
-
* Create a new
|
|
101
|
+
* Create a new worker within a session
|
|
102
|
+
* Each worker has its own isolated browser context (cookies, localStorage, etc.)
|
|
98
103
|
*/
|
|
99
|
-
|
|
104
|
+
createWorker(sessionId: string, options?: WorkerCreateOptions): Promise<Worker>;
|
|
105
|
+
/**
|
|
106
|
+
* Get a worker by ID
|
|
107
|
+
*/
|
|
108
|
+
getWorker(sessionId: string, workerId: string): Worker | undefined;
|
|
109
|
+
/**
|
|
110
|
+
* Get or create a worker
|
|
111
|
+
*/
|
|
112
|
+
getOrCreateWorker(sessionId: string, workerId?: string): Promise<Worker>;
|
|
113
|
+
/**
|
|
114
|
+
* List all workers in a session
|
|
115
|
+
*/
|
|
116
|
+
getWorkers(sessionId: string): WorkerInfo[];
|
|
117
|
+
/**
|
|
118
|
+
* Delete a worker and its resources
|
|
119
|
+
*/
|
|
120
|
+
deleteWorker(sessionId: string, workerId: string): Promise<void>;
|
|
121
|
+
/**
|
|
122
|
+
* Internal worker deletion (also used for cleanup)
|
|
123
|
+
*/
|
|
124
|
+
private deleteWorkerInternal;
|
|
125
|
+
/**
|
|
126
|
+
* Create a new page/target for a worker
|
|
127
|
+
* @param sessionId Session ID
|
|
128
|
+
* @param url Optional URL to navigate to
|
|
129
|
+
* @param workerId Optional worker ID (uses default worker if not specified)
|
|
130
|
+
*/
|
|
131
|
+
createTarget(sessionId: string, url?: string, workerId?: string): Promise<{
|
|
100
132
|
targetId: string;
|
|
101
133
|
page: Page;
|
|
134
|
+
workerId: string;
|
|
102
135
|
}>;
|
|
136
|
+
/**
|
|
137
|
+
* Check if a target is still valid (page not closed)
|
|
138
|
+
*/
|
|
139
|
+
isTargetValid(targetId: string): Promise<boolean>;
|
|
103
140
|
/**
|
|
104
141
|
* Get page for a target
|
|
142
|
+
* @param sessionId Session ID
|
|
143
|
+
* @param targetId Target/Tab ID
|
|
144
|
+
* @param workerId Optional worker ID for validation
|
|
105
145
|
*/
|
|
106
|
-
getPage(sessionId: string, targetId: string): Promise<Page | null>;
|
|
146
|
+
getPage(sessionId: string, targetId: string, workerId?: string): Promise<Page | null>;
|
|
107
147
|
/**
|
|
108
|
-
* Get all pages for a
|
|
148
|
+
* Get all pages for a worker
|
|
109
149
|
*/
|
|
110
|
-
|
|
150
|
+
getWorkerPages(sessionId: string, workerId: string): Promise<Page[]>;
|
|
111
151
|
/**
|
|
112
|
-
* Get target IDs for a session
|
|
152
|
+
* Get target IDs for a session (all workers)
|
|
113
153
|
*/
|
|
114
154
|
getSessionTargetIds(sessionId: string): string[];
|
|
115
155
|
/**
|
|
116
|
-
*
|
|
156
|
+
* Get target IDs for a specific worker
|
|
157
|
+
*/
|
|
158
|
+
getWorkerTargetIds(sessionId: string, workerId: string): string[];
|
|
159
|
+
/**
|
|
160
|
+
* Validate target ownership (legacy method, checks session only)
|
|
117
161
|
*/
|
|
118
162
|
validateTargetOwnership(sessionId: string, targetId: string): boolean;
|
|
163
|
+
/**
|
|
164
|
+
* Get the worker ID that owns a target
|
|
165
|
+
*/
|
|
166
|
+
getTargetWorkerId(targetId: string): string | undefined;
|
|
119
167
|
/**
|
|
120
168
|
* Execute a CDP command through the session's queue
|
|
121
169
|
*/
|
|
122
170
|
executeCDP<T = unknown>(sessionId: string, targetId: string, method: string, params?: Record<string, unknown>): Promise<T>;
|
|
123
171
|
/**
|
|
124
|
-
*
|
|
172
|
+
* Handle target closed event
|
|
125
173
|
*/
|
|
126
|
-
|
|
174
|
+
onTargetClosed(targetId: string): void;
|
|
127
175
|
/**
|
|
128
176
|
* Get session info (for serialization)
|
|
129
177
|
*/
|
|
@@ -132,10 +180,6 @@ export declare class SessionManager {
|
|
|
132
180
|
* Get all session infos
|
|
133
181
|
*/
|
|
134
182
|
getAllSessionInfos(): SessionInfo[];
|
|
135
|
-
/**
|
|
136
|
-
* Handle target closed event
|
|
137
|
-
*/
|
|
138
|
-
onTargetClosed(targetId: string): void;
|
|
139
183
|
/**
|
|
140
184
|
* Add event listener
|
|
141
185
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"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"}
|