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.
Files changed (72) hide show
  1. package/README.md +352 -45
  2. package/dist/cdp/client.d.ts +30 -3
  3. package/dist/cdp/client.d.ts.map +1 -1
  4. package/dist/cdp/client.js +75 -6
  5. package/dist/cdp/client.js.map +1 -1
  6. package/dist/cdp/connection-pool.d.ts +5 -1
  7. package/dist/cdp/connection-pool.d.ts.map +1 -1
  8. package/dist/cdp/connection-pool.js +7 -1
  9. package/dist/cdp/connection-pool.js.map +1 -1
  10. package/dist/chrome/launcher.d.ts +2 -0
  11. package/dist/chrome/launcher.d.ts.map +1 -1
  12. package/dist/chrome/launcher.js +13 -0
  13. package/dist/chrome/launcher.js.map +1 -1
  14. package/dist/cli/index.js +7 -0
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/config/global.d.ts +18 -0
  17. package/dist/config/global.d.ts.map +1 -0
  18. package/dist/config/global.js +24 -0
  19. package/dist/config/global.js.map +1 -0
  20. package/dist/config/index.d.ts +1 -0
  21. package/dist/config/index.d.ts.map +1 -1
  22. package/dist/config/index.js +1 -0
  23. package/dist/config/index.js.map +1 -1
  24. package/dist/index.js +20 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/orchestration/state-manager.d.ts +117 -0
  27. package/dist/orchestration/state-manager.d.ts.map +1 -0
  28. package/dist/orchestration/state-manager.js +435 -0
  29. package/dist/orchestration/state-manager.js.map +1 -0
  30. package/dist/orchestration/workflow-engine.d.ts +96 -0
  31. package/dist/orchestration/workflow-engine.d.ts.map +1 -0
  32. package/dist/orchestration/workflow-engine.js +326 -0
  33. package/dist/orchestration/workflow-engine.js.map +1 -0
  34. package/dist/session-manager.d.ts +62 -18
  35. package/dist/session-manager.d.ts.map +1 -1
  36. package/dist/session-manager.js +274 -100
  37. package/dist/session-manager.js.map +1 -1
  38. package/dist/tools/computer.d.ts.map +1 -1
  39. package/dist/tools/computer.js +49 -3
  40. package/dist/tools/computer.js.map +1 -1
  41. package/dist/tools/index.d.ts.map +1 -1
  42. package/dist/tools/index.js +13 -1
  43. package/dist/tools/index.js.map +1 -1
  44. package/dist/tools/navigate.d.ts.map +1 -1
  45. package/dist/tools/navigate.js +91 -8
  46. package/dist/tools/navigate.js.map +1 -1
  47. package/dist/tools/orchestration.d.ts +6 -0
  48. package/dist/tools/orchestration.d.ts.map +1 -0
  49. package/dist/tools/orchestration.js +436 -0
  50. package/dist/tools/orchestration.js.map +1 -0
  51. package/dist/tools/tabs-context.d.ts.map +1 -1
  52. package/dist/tools/tabs-context.js +42 -23
  53. package/dist/tools/tabs-context.js.map +1 -1
  54. package/dist/tools/tabs-create.d.ts +1 -1
  55. package/dist/tools/tabs-create.d.ts.map +1 -1
  56. package/dist/tools/tabs-create.js +30 -6
  57. package/dist/tools/tabs-create.js.map +1 -1
  58. package/dist/tools/worker-create.d.ts +7 -0
  59. package/dist/tools/worker-create.d.ts.map +1 -0
  60. package/dist/tools/worker-create.js +62 -0
  61. package/dist/tools/worker-create.js.map +1 -0
  62. package/dist/tools/worker-delete.d.ts +6 -0
  63. package/dist/tools/worker-delete.d.ts.map +1 -0
  64. package/dist/tools/worker-delete.js +80 -0
  65. package/dist/tools/worker-delete.js.map +1 -0
  66. package/dist/tools/worker-list.d.ts +6 -0
  67. package/dist/tools/worker-list.d.ts.map +1 -0
  68. package/dist/tools/worker-list.js +67 -0
  69. package/dist/tools/worker-list.js.map +1 -0
  70. package/dist/types/session.d.ts +35 -2
  71. package/dist/types/session.d.ts.map +1 -1
  72. 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":"AAAA;;;GAGG;AA4CH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,aAAa,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,yBAAyB;IACpC,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAiC;IAItD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtC;;OAEG;IACG,iBAAiB,CACrB,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,GACpF,OAAO,CAAC,kBAAkB,CAAC;IA6B9B;;OAEG;IACG,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IA6B9B;;OAEG;IACG,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAC3B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAwB9B;;;OAGG;IACG,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,EAC/B,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IA8BhB;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAqCtE;;OAEG;IACG,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB7E;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoD5B;;OAEG;IACG,sBAAsB,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IA0BlE;;OAEG;IACG,uBAAuB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvE;;OAEG;IACG,wBAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAcvG;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAgCnC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAgBlD;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAIzC;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAI9B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAS/B;AAKD,wBAAgB,4BAA4B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,yBAAyB,CAKxF"}
@@ -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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"}