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,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Manager - Manages orchestration state for Chrome-Sisyphus
|
|
3
|
+
* Provides file-based scratchpad management for workers
|
|
4
|
+
*/
|
|
5
|
+
export interface WorkerState {
|
|
6
|
+
workerId: string;
|
|
7
|
+
workerName: string;
|
|
8
|
+
tabId: string;
|
|
9
|
+
status: 'INIT' | 'IN_PROGRESS' | 'SUCCESS' | 'PARTIAL' | 'FAIL';
|
|
10
|
+
iteration: number;
|
|
11
|
+
maxIterations: number;
|
|
12
|
+
startedAt: number;
|
|
13
|
+
lastUpdatedAt: number;
|
|
14
|
+
task: string;
|
|
15
|
+
progressLog: ProgressEntry[];
|
|
16
|
+
extractedData: unknown;
|
|
17
|
+
errors: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface ProgressEntry {
|
|
20
|
+
iteration: number;
|
|
21
|
+
timestamp: string;
|
|
22
|
+
action: string;
|
|
23
|
+
result: 'SUCCESS' | 'FAIL' | 'IN_PROGRESS';
|
|
24
|
+
error?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface OrchestrationState {
|
|
27
|
+
orchestrationId: string;
|
|
28
|
+
status: 'INIT' | 'RUNNING' | 'COMPLETED' | 'PARTIAL' | 'FAILED';
|
|
29
|
+
createdAt: number;
|
|
30
|
+
updatedAt: number;
|
|
31
|
+
task: string;
|
|
32
|
+
workers: WorkerSummary[];
|
|
33
|
+
completedWorkers: number;
|
|
34
|
+
failedWorkers: number;
|
|
35
|
+
}
|
|
36
|
+
export interface WorkerSummary {
|
|
37
|
+
workerId: string;
|
|
38
|
+
workerName: string;
|
|
39
|
+
status: WorkerState['status'];
|
|
40
|
+
resultSummary?: string;
|
|
41
|
+
}
|
|
42
|
+
export declare class OrchestrationStateManager {
|
|
43
|
+
private baseDir;
|
|
44
|
+
constructor(baseDir?: string);
|
|
45
|
+
/**
|
|
46
|
+
* Ensure the orchestration directory exists
|
|
47
|
+
*/
|
|
48
|
+
ensureDirectory(): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Initialize orchestration state
|
|
51
|
+
*/
|
|
52
|
+
initOrchestration(orchestrationId: string, task: string, workers: Array<{
|
|
53
|
+
workerId: string;
|
|
54
|
+
workerName: string;
|
|
55
|
+
tabId: string;
|
|
56
|
+
task: string;
|
|
57
|
+
}>): Promise<OrchestrationState>;
|
|
58
|
+
/**
|
|
59
|
+
* Initialize worker scratchpad
|
|
60
|
+
*/
|
|
61
|
+
initWorkerState(workerId: string, workerName: string, tabId: string, task: string): Promise<WorkerState | null>;
|
|
62
|
+
/**
|
|
63
|
+
* Update worker state
|
|
64
|
+
*/
|
|
65
|
+
updateWorkerState(workerName: string, update: Partial<WorkerState>): Promise<WorkerState | null>;
|
|
66
|
+
/**
|
|
67
|
+
* Add progress entry
|
|
68
|
+
* Note: Progress log is limited to MAX_PROGRESS_LOG_ENTRIES to prevent unbounded growth
|
|
69
|
+
*/
|
|
70
|
+
addProgressEntry(workerName: string, action: string, result: ProgressEntry['result'], error?: string): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Read worker state from scratchpad
|
|
73
|
+
*/
|
|
74
|
+
readWorkerState(workerName: string): Promise<WorkerState | null>;
|
|
75
|
+
/**
|
|
76
|
+
* Write worker state to scratchpad (markdown format)
|
|
77
|
+
*/
|
|
78
|
+
writeWorkerState(workerName: string, state: WorkerState): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Format worker state as markdown
|
|
81
|
+
*/
|
|
82
|
+
private formatWorkerMarkdown;
|
|
83
|
+
/**
|
|
84
|
+
* Read orchestration state
|
|
85
|
+
*/
|
|
86
|
+
readOrchestrationState(): Promise<OrchestrationState | null>;
|
|
87
|
+
/**
|
|
88
|
+
* Write orchestration state
|
|
89
|
+
*/
|
|
90
|
+
writeOrchestrationState(state: OrchestrationState): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Update orchestration state
|
|
93
|
+
*/
|
|
94
|
+
updateOrchestrationState(update: Partial<OrchestrationState>): Promise<OrchestrationState | null>;
|
|
95
|
+
/**
|
|
96
|
+
* Format orchestration state as markdown
|
|
97
|
+
*/
|
|
98
|
+
private formatOrchestrationMarkdown;
|
|
99
|
+
/**
|
|
100
|
+
* Get all worker states
|
|
101
|
+
*/
|
|
102
|
+
getAllWorkerStates(): Promise<WorkerState[]>;
|
|
103
|
+
/**
|
|
104
|
+
* Get worker scratchpad path
|
|
105
|
+
*/
|
|
106
|
+
getWorkerPath(workerName: string): string;
|
|
107
|
+
/**
|
|
108
|
+
* Get orchestration state path
|
|
109
|
+
*/
|
|
110
|
+
getOrchestrationPath(): string;
|
|
111
|
+
/**
|
|
112
|
+
* Clean up orchestration files
|
|
113
|
+
*/
|
|
114
|
+
cleanup(): Promise<void>;
|
|
115
|
+
}
|
|
116
|
+
export declare function getOrchestrationStateManager(baseDir?: string): OrchestrationStateManager;
|
|
117
|
+
//# sourceMappingURL=state-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-manager.d.ts","sourceRoot":"","sources":["../../src/orchestration/state-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* State Manager - Manages orchestration state for Chrome-Sisyphus
|
|
4
|
+
* Provides file-based scratchpad management for workers
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.OrchestrationStateManager = void 0;
|
|
41
|
+
exports.getOrchestrationStateManager = getOrchestrationStateManager;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
// Constants for safety limits
|
|
45
|
+
const MAX_PROGRESS_LOG_ENTRIES = 500;
|
|
46
|
+
const MAX_WORKER_NAME_LENGTH = 100;
|
|
47
|
+
// Pattern for valid worker names (alphanumeric, dashes, underscores, and common unicode)
|
|
48
|
+
// Note: This is a simplified pattern that allows common characters without ES6 unicode regex
|
|
49
|
+
const VALID_WORKER_NAME_PATTERN = /^[a-zA-Z0-9_\-\u3131-\uD79D\u4E00-\u9FFF\u0400-\u04FF\u0600-\u06FF]+$/;
|
|
50
|
+
/**
|
|
51
|
+
* Validate worker name for security and safety
|
|
52
|
+
* Prevents path traversal and other injection attacks
|
|
53
|
+
*/
|
|
54
|
+
function validateWorkerName(workerName) {
|
|
55
|
+
if (!workerName || typeof workerName !== 'string') {
|
|
56
|
+
return { valid: false, error: 'Worker name must be a non-empty string' };
|
|
57
|
+
}
|
|
58
|
+
if (workerName.length > MAX_WORKER_NAME_LENGTH) {
|
|
59
|
+
return { valid: false, error: `Worker name exceeds maximum length of ${MAX_WORKER_NAME_LENGTH}` };
|
|
60
|
+
}
|
|
61
|
+
// Check for path traversal patterns
|
|
62
|
+
if (workerName.includes('..') || workerName.includes('/') || workerName.includes('\\')) {
|
|
63
|
+
return { valid: false, error: 'Worker name contains invalid path characters' };
|
|
64
|
+
}
|
|
65
|
+
// Check for null bytes and control characters
|
|
66
|
+
if (/[\x00-\x1f]/.test(workerName)) {
|
|
67
|
+
return { valid: false, error: 'Worker name contains control characters' };
|
|
68
|
+
}
|
|
69
|
+
// Validate against allowed pattern
|
|
70
|
+
if (!VALID_WORKER_NAME_PATTERN.test(workerName)) {
|
|
71
|
+
return { valid: false, error: 'Worker name contains invalid characters' };
|
|
72
|
+
}
|
|
73
|
+
return { valid: true };
|
|
74
|
+
}
|
|
75
|
+
class OrchestrationStateManager {
|
|
76
|
+
baseDir;
|
|
77
|
+
constructor(baseDir = '.agent/chrome-sisyphus') {
|
|
78
|
+
this.baseDir = baseDir;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Ensure the orchestration directory exists
|
|
82
|
+
*/
|
|
83
|
+
async ensureDirectory() {
|
|
84
|
+
const fullPath = path.resolve(this.baseDir);
|
|
85
|
+
if (!fs.existsSync(fullPath)) {
|
|
86
|
+
fs.mkdirSync(fullPath, { recursive: true });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Initialize orchestration state
|
|
91
|
+
*/
|
|
92
|
+
async initOrchestration(orchestrationId, task, workers) {
|
|
93
|
+
await this.ensureDirectory();
|
|
94
|
+
const state = {
|
|
95
|
+
orchestrationId,
|
|
96
|
+
status: 'INIT',
|
|
97
|
+
createdAt: Date.now(),
|
|
98
|
+
updatedAt: Date.now(),
|
|
99
|
+
task,
|
|
100
|
+
workers: workers.map(w => ({
|
|
101
|
+
workerId: w.workerId,
|
|
102
|
+
workerName: w.workerName,
|
|
103
|
+
status: 'INIT',
|
|
104
|
+
})),
|
|
105
|
+
completedWorkers: 0,
|
|
106
|
+
failedWorkers: 0,
|
|
107
|
+
};
|
|
108
|
+
// Initialize worker scratchpads
|
|
109
|
+
for (const worker of workers) {
|
|
110
|
+
await this.initWorkerState(worker.workerId, worker.workerName, worker.tabId, worker.task);
|
|
111
|
+
}
|
|
112
|
+
// Write orchestration state
|
|
113
|
+
await this.writeOrchestrationState(state);
|
|
114
|
+
return state;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Initialize worker scratchpad
|
|
118
|
+
*/
|
|
119
|
+
async initWorkerState(workerId, workerName, tabId, task) {
|
|
120
|
+
// Validate worker name for security
|
|
121
|
+
const validation = validateWorkerName(workerName);
|
|
122
|
+
if (!validation.valid) {
|
|
123
|
+
console.error(`[StateManager] Invalid worker name "${workerName}": ${validation.error}`);
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
await this.ensureDirectory();
|
|
127
|
+
const state = {
|
|
128
|
+
workerId,
|
|
129
|
+
workerName,
|
|
130
|
+
tabId,
|
|
131
|
+
status: 'INIT',
|
|
132
|
+
iteration: 0,
|
|
133
|
+
maxIterations: 5,
|
|
134
|
+
startedAt: Date.now(),
|
|
135
|
+
lastUpdatedAt: Date.now(),
|
|
136
|
+
task,
|
|
137
|
+
progressLog: [],
|
|
138
|
+
extractedData: null,
|
|
139
|
+
errors: [],
|
|
140
|
+
};
|
|
141
|
+
await this.writeWorkerState(workerName, state);
|
|
142
|
+
return state;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Update worker state
|
|
146
|
+
*/
|
|
147
|
+
async updateWorkerState(workerName, update) {
|
|
148
|
+
// Validate worker name before updating
|
|
149
|
+
const validation = validateWorkerName(workerName);
|
|
150
|
+
if (!validation.valid) {
|
|
151
|
+
console.error(`[StateManager] Cannot update worker state: invalid name "${workerName}": ${validation.error}`);
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
const current = await this.readWorkerState(workerName);
|
|
155
|
+
if (!current) {
|
|
156
|
+
console.error(`[StateManager] Cannot update worker state: worker "${workerName}" not found`);
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
const updated = {
|
|
160
|
+
...current,
|
|
161
|
+
...update,
|
|
162
|
+
lastUpdatedAt: Date.now(),
|
|
163
|
+
};
|
|
164
|
+
await this.writeWorkerState(workerName, updated);
|
|
165
|
+
return updated;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Add progress entry
|
|
169
|
+
* Note: Progress log is limited to MAX_PROGRESS_LOG_ENTRIES to prevent unbounded growth
|
|
170
|
+
*/
|
|
171
|
+
async addProgressEntry(workerName, action, result, error) {
|
|
172
|
+
const current = await this.readWorkerState(workerName);
|
|
173
|
+
if (!current) {
|
|
174
|
+
console.error(`[StateManager] Cannot add progress entry: worker "${workerName}" not found`);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const entry = {
|
|
178
|
+
iteration: current.iteration,
|
|
179
|
+
timestamp: new Date().toISOString(),
|
|
180
|
+
action,
|
|
181
|
+
result,
|
|
182
|
+
error,
|
|
183
|
+
};
|
|
184
|
+
current.progressLog.push(entry);
|
|
185
|
+
// Limit progress log size to prevent unbounded growth
|
|
186
|
+
if (current.progressLog.length > MAX_PROGRESS_LOG_ENTRIES) {
|
|
187
|
+
// Keep the most recent entries, remove oldest
|
|
188
|
+
const removed = current.progressLog.length - MAX_PROGRESS_LOG_ENTRIES;
|
|
189
|
+
current.progressLog = current.progressLog.slice(removed);
|
|
190
|
+
console.error(`[StateManager] Progress log truncated for worker "${workerName}": removed ${removed} oldest entries`);
|
|
191
|
+
}
|
|
192
|
+
current.lastUpdatedAt = Date.now();
|
|
193
|
+
await this.writeWorkerState(workerName, current);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Read worker state from scratchpad
|
|
197
|
+
*/
|
|
198
|
+
async readWorkerState(workerName) {
|
|
199
|
+
// Validate worker name before reading
|
|
200
|
+
const validation = validateWorkerName(workerName);
|
|
201
|
+
if (!validation.valid) {
|
|
202
|
+
console.error(`[StateManager] Cannot read worker state: invalid name "${workerName}": ${validation.error}`);
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
const filePath = this.getWorkerPath(workerName);
|
|
206
|
+
if (!fs.existsSync(filePath)) {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
211
|
+
// Try to parse JSON from markdown code block
|
|
212
|
+
// Note: There may be multiple JSON blocks (extracted data + raw state)
|
|
213
|
+
// We need the last one which contains the full state object
|
|
214
|
+
const regex = /```json\n([\s\S]*?)\n```/g;
|
|
215
|
+
let lastMatch = null;
|
|
216
|
+
let match;
|
|
217
|
+
while ((match = regex.exec(content)) !== null) {
|
|
218
|
+
lastMatch = match;
|
|
219
|
+
}
|
|
220
|
+
if (lastMatch) {
|
|
221
|
+
// Get the last match (raw state)
|
|
222
|
+
return JSON.parse(lastMatch[1]);
|
|
223
|
+
}
|
|
224
|
+
// Fallback: try parsing entire file as JSON
|
|
225
|
+
return JSON.parse(content);
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
console.error(`[StateManager] Failed to parse worker state for "${workerName}": ${error instanceof Error ? error.message : String(error)}`);
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Write worker state to scratchpad (markdown format)
|
|
234
|
+
*/
|
|
235
|
+
async writeWorkerState(workerName, state) {
|
|
236
|
+
// Validate worker name before writing
|
|
237
|
+
const validation = validateWorkerName(workerName);
|
|
238
|
+
if (!validation.valid) {
|
|
239
|
+
console.error(`[StateManager] Cannot write worker state: invalid name "${workerName}": ${validation.error}`);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const filePath = this.getWorkerPath(workerName);
|
|
243
|
+
try {
|
|
244
|
+
const markdown = this.formatWorkerMarkdown(state);
|
|
245
|
+
fs.writeFileSync(filePath, markdown, 'utf-8');
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
console.error(`[StateManager] Failed to write worker state for "${workerName}": ${error instanceof Error ? error.message : String(error)}`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Format worker state as markdown
|
|
253
|
+
*/
|
|
254
|
+
formatWorkerMarkdown(state) {
|
|
255
|
+
const progressRows = state.progressLog.map(p => {
|
|
256
|
+
const time = p.timestamp.split('T')[1]?.split('.')[0] || p.timestamp;
|
|
257
|
+
const error = p.error || '-';
|
|
258
|
+
return `| ${p.iteration} | ${time} | ${p.action} | ${p.result} | ${error} |`;
|
|
259
|
+
});
|
|
260
|
+
const progressTable = progressRows.length > 0
|
|
261
|
+
? progressRows.join('\n')
|
|
262
|
+
: '| - | - | - | - | - |';
|
|
263
|
+
const errorList = state.errors.length > 0
|
|
264
|
+
? state.errors.map(e => `- ${e}`).join('\n')
|
|
265
|
+
: '(none)';
|
|
266
|
+
const lastUpdated = new Date(state.lastUpdatedAt).toISOString();
|
|
267
|
+
const extractedJson = JSON.stringify(state.extractedData, null, 2);
|
|
268
|
+
const stateJson = JSON.stringify(state, null, 2);
|
|
269
|
+
return `## Worker: ${state.workerName}
|
|
270
|
+
### Last Updated: ${lastUpdated}
|
|
271
|
+
|
|
272
|
+
### Meta
|
|
273
|
+
- Worker ID: ${state.workerId}
|
|
274
|
+
- Tab ID: ${state.tabId}
|
|
275
|
+
- Status: ${state.status}
|
|
276
|
+
- Iteration: ${state.iteration}/${state.maxIterations}
|
|
277
|
+
|
|
278
|
+
### Task
|
|
279
|
+
${state.task}
|
|
280
|
+
|
|
281
|
+
### Progress Log
|
|
282
|
+
| Iter | Time | Action | Result | Error |
|
|
283
|
+
|------|------|--------|--------|-------|
|
|
284
|
+
${progressTable}
|
|
285
|
+
|
|
286
|
+
### Extracted Data
|
|
287
|
+
\`\`\`json
|
|
288
|
+
${extractedJson}
|
|
289
|
+
\`\`\`
|
|
290
|
+
|
|
291
|
+
### Errors
|
|
292
|
+
${errorList}
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
<!-- Raw State (for parsing) -->
|
|
296
|
+
\`\`\`json
|
|
297
|
+
${stateJson}
|
|
298
|
+
\`\`\`
|
|
299
|
+
`;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Read orchestration state
|
|
303
|
+
*/
|
|
304
|
+
async readOrchestrationState() {
|
|
305
|
+
const filePath = this.getOrchestrationPath();
|
|
306
|
+
if (!fs.existsSync(filePath)) {
|
|
307
|
+
return null;
|
|
308
|
+
}
|
|
309
|
+
try {
|
|
310
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
311
|
+
// Get the last JSON code block (the raw state)
|
|
312
|
+
const regex = /```json\n([\s\S]*?)\n```/g;
|
|
313
|
+
let lastMatch = null;
|
|
314
|
+
let match;
|
|
315
|
+
while ((match = regex.exec(content)) !== null) {
|
|
316
|
+
lastMatch = match;
|
|
317
|
+
}
|
|
318
|
+
if (lastMatch) {
|
|
319
|
+
return JSON.parse(lastMatch[1]);
|
|
320
|
+
}
|
|
321
|
+
return JSON.parse(content);
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
console.error(`[StateManager] Failed to parse orchestration state: ${error instanceof Error ? error.message : String(error)}`);
|
|
325
|
+
return null;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Write orchestration state
|
|
330
|
+
*/
|
|
331
|
+
async writeOrchestrationState(state) {
|
|
332
|
+
const filePath = this.getOrchestrationPath();
|
|
333
|
+
const markdown = this.formatOrchestrationMarkdown(state);
|
|
334
|
+
fs.writeFileSync(filePath, markdown, 'utf-8');
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Update orchestration state
|
|
338
|
+
*/
|
|
339
|
+
async updateOrchestrationState(update) {
|
|
340
|
+
const current = await this.readOrchestrationState();
|
|
341
|
+
if (!current)
|
|
342
|
+
return null;
|
|
343
|
+
const updated = {
|
|
344
|
+
...current,
|
|
345
|
+
...update,
|
|
346
|
+
updatedAt: Date.now(),
|
|
347
|
+
};
|
|
348
|
+
await this.writeOrchestrationState(updated);
|
|
349
|
+
return updated;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Format orchestration state as markdown
|
|
353
|
+
*/
|
|
354
|
+
formatOrchestrationMarkdown(state) {
|
|
355
|
+
const workerLines = state.workers.map(w => {
|
|
356
|
+
let icon = '⏳';
|
|
357
|
+
if (w.status === 'SUCCESS')
|
|
358
|
+
icon = '✅';
|
|
359
|
+
else if (w.status === 'FAIL')
|
|
360
|
+
icon = '❌';
|
|
361
|
+
const summary = w.resultSummary ? ` - ${w.resultSummary}` : '';
|
|
362
|
+
return `- ${icon} ${w.workerName}: ${w.status}${summary}`;
|
|
363
|
+
});
|
|
364
|
+
const workerList = workerLines.join('\n');
|
|
365
|
+
const lastUpdated = new Date(state.updatedAt).toISOString();
|
|
366
|
+
const stateJson = JSON.stringify(state, null, 2);
|
|
367
|
+
return `## Chrome-Sisyphus Orchestration
|
|
368
|
+
### Last Updated: ${lastUpdated}
|
|
369
|
+
|
|
370
|
+
### Status: ${state.status}
|
|
371
|
+
|
|
372
|
+
### Task
|
|
373
|
+
${state.task}
|
|
374
|
+
|
|
375
|
+
### Workers (${state.completedWorkers}/${state.workers.length} complete, ${state.failedWorkers} failed)
|
|
376
|
+
${workerList}
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
<!-- Raw State (for parsing) -->
|
|
380
|
+
\`\`\`json
|
|
381
|
+
${stateJson}
|
|
382
|
+
\`\`\`
|
|
383
|
+
`;
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Get all worker states
|
|
387
|
+
*/
|
|
388
|
+
async getAllWorkerStates() {
|
|
389
|
+
const states = [];
|
|
390
|
+
const orch = await this.readOrchestrationState();
|
|
391
|
+
if (orch) {
|
|
392
|
+
for (const worker of orch.workers) {
|
|
393
|
+
const state = await this.readWorkerState(worker.workerName);
|
|
394
|
+
if (state) {
|
|
395
|
+
states.push(state);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
return states;
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Get worker scratchpad path
|
|
403
|
+
*/
|
|
404
|
+
getWorkerPath(workerName) {
|
|
405
|
+
return path.resolve(this.baseDir, `worker-${workerName}.md`);
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Get orchestration state path
|
|
409
|
+
*/
|
|
410
|
+
getOrchestrationPath() {
|
|
411
|
+
return path.resolve(this.baseDir, 'orchestration.md');
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Clean up orchestration files
|
|
415
|
+
*/
|
|
416
|
+
async cleanup() {
|
|
417
|
+
const fullPath = path.resolve(this.baseDir);
|
|
418
|
+
if (fs.existsSync(fullPath)) {
|
|
419
|
+
const files = fs.readdirSync(fullPath);
|
|
420
|
+
for (const file of files) {
|
|
421
|
+
fs.unlinkSync(path.join(fullPath, file));
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
exports.OrchestrationStateManager = OrchestrationStateManager;
|
|
427
|
+
// Singleton instance
|
|
428
|
+
let stateManagerInstance = null;
|
|
429
|
+
function getOrchestrationStateManager(baseDir) {
|
|
430
|
+
if (!stateManagerInstance) {
|
|
431
|
+
stateManagerInstance = new OrchestrationStateManager(baseDir);
|
|
432
|
+
}
|
|
433
|
+
return stateManagerInstance;
|
|
434
|
+
}
|
|
435
|
+
//# sourceMappingURL=state-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../../src/orchestration/state-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Engine - Executes parallel browser workflows
|
|
3
|
+
* Manages worker lifecycle and result aggregation
|
|
4
|
+
*/
|
|
5
|
+
import { OrchestrationState, WorkerState } from './state-manager';
|
|
6
|
+
export interface WorkflowStep {
|
|
7
|
+
workerId: string;
|
|
8
|
+
workerName: string;
|
|
9
|
+
url: string;
|
|
10
|
+
task: string;
|
|
11
|
+
successCriteria: string;
|
|
12
|
+
}
|
|
13
|
+
export interface WorkflowDefinition {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
steps: WorkflowStep[];
|
|
17
|
+
parallel: boolean;
|
|
18
|
+
maxRetries: number;
|
|
19
|
+
timeout: number;
|
|
20
|
+
}
|
|
21
|
+
export interface WorkerResult {
|
|
22
|
+
workerId: string;
|
|
23
|
+
workerName: string;
|
|
24
|
+
tabId: string;
|
|
25
|
+
status: 'SUCCESS' | 'PARTIAL' | 'FAIL';
|
|
26
|
+
resultSummary: string;
|
|
27
|
+
dataExtracted: unknown;
|
|
28
|
+
iterations: number;
|
|
29
|
+
errors: string[];
|
|
30
|
+
}
|
|
31
|
+
export interface WorkflowResult {
|
|
32
|
+
orchestrationId: string;
|
|
33
|
+
status: 'COMPLETED' | 'PARTIAL' | 'FAILED';
|
|
34
|
+
workerResults: WorkerResult[];
|
|
35
|
+
completedCount: number;
|
|
36
|
+
failedCount: number;
|
|
37
|
+
duration: number;
|
|
38
|
+
}
|
|
39
|
+
export declare class WorkflowEngine {
|
|
40
|
+
private sessionManager;
|
|
41
|
+
private stateManager;
|
|
42
|
+
/**
|
|
43
|
+
* Initialize a new workflow
|
|
44
|
+
* Creates workers, tabs, and scratchpads
|
|
45
|
+
*/
|
|
46
|
+
initWorkflow(sessionId: string, workflow: WorkflowDefinition): Promise<{
|
|
47
|
+
orchestrationId: string;
|
|
48
|
+
workers: Array<{
|
|
49
|
+
workerId: string;
|
|
50
|
+
workerName: string;
|
|
51
|
+
tabId: string;
|
|
52
|
+
}>;
|
|
53
|
+
}>;
|
|
54
|
+
/**
|
|
55
|
+
* Update worker progress
|
|
56
|
+
*/
|
|
57
|
+
updateWorkerProgress(workerName: string, update: {
|
|
58
|
+
status?: WorkerState['status'];
|
|
59
|
+
iteration?: number;
|
|
60
|
+
action?: string;
|
|
61
|
+
result?: 'SUCCESS' | 'FAIL' | 'IN_PROGRESS';
|
|
62
|
+
extractedData?: unknown;
|
|
63
|
+
error?: string;
|
|
64
|
+
}): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Mark worker as complete
|
|
67
|
+
* Note: This method prevents double-counting by checking the previous worker status
|
|
68
|
+
*/
|
|
69
|
+
completeWorker(workerName: string, status: 'SUCCESS' | 'PARTIAL' | 'FAIL', resultSummary: string, extractedData: unknown): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Get current orchestration status
|
|
72
|
+
*/
|
|
73
|
+
getOrchestrationStatus(): Promise<OrchestrationState | null>;
|
|
74
|
+
/**
|
|
75
|
+
* Get all worker states
|
|
76
|
+
*/
|
|
77
|
+
getAllWorkerStates(): Promise<WorkerState[]>;
|
|
78
|
+
/**
|
|
79
|
+
* Get worker state by name
|
|
80
|
+
*/
|
|
81
|
+
getWorkerState(workerName: string): Promise<WorkerState | null>;
|
|
82
|
+
/**
|
|
83
|
+
* Collect final results from all workers
|
|
84
|
+
*/
|
|
85
|
+
collectResults(): Promise<WorkflowResult | null>;
|
|
86
|
+
/**
|
|
87
|
+
* Cleanup workflow resources
|
|
88
|
+
*/
|
|
89
|
+
cleanupWorkflow(sessionId: string): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Generate worker agent prompt for Background Task
|
|
92
|
+
*/
|
|
93
|
+
generateWorkerPrompt(workerId: string, workerName: string, tabId: string, task: string, successCriteria: string): string;
|
|
94
|
+
}
|
|
95
|
+
export declare function getWorkflowEngine(): WorkflowEngine;
|
|
96
|
+
//# sourceMappingURL=workflow-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-engine.d.ts","sourceRoot":"","sources":["../../src/orchestration/workflow-engine.ts"],"names":[],"mappings":"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"}
|