claude-chrome-parallel 1.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/LICENSE +21 -0
- package/README.md +501 -0
- package/assets/demo.svg +278 -0
- package/dist/cdp/client.d.ts +218 -0
- package/dist/cdp/client.d.ts.map +1 -0
- package/dist/cdp/client.js +797 -0
- package/dist/cdp/client.js.map +1 -0
- package/dist/cdp/connection-pool.d.ts +125 -0
- package/dist/cdp/connection-pool.d.ts.map +1 -0
- package/dist/cdp/connection-pool.js +443 -0
- package/dist/cdp/connection-pool.js.map +1 -0
- package/dist/cdp/screenshot-scheduler.d.ts +54 -0
- package/dist/cdp/screenshot-scheduler.d.ts.map +1 -0
- package/dist/cdp/screenshot-scheduler.js +87 -0
- package/dist/cdp/screenshot-scheduler.js.map +1 -0
- package/dist/chrome/launcher.d.ts +55 -0
- package/dist/chrome/launcher.d.ts.map +1 -0
- package/dist/chrome/launcher.js +383 -0
- package/dist/chrome/launcher.js.map +1 -0
- package/dist/chrome/pool.d.ts +54 -0
- package/dist/chrome/pool.d.ts.map +1 -0
- package/dist/chrome/pool.js +301 -0
- package/dist/chrome/pool.js.map +1 -0
- package/dist/chrome/profile-detector.d.ts +52 -0
- package/dist/chrome/profile-detector.d.ts.map +1 -0
- package/dist/chrome/profile-detector.js +246 -0
- package/dist/chrome/profile-detector.js.map +1 -0
- package/dist/cli/claude-session.d.ts +11 -0
- package/dist/cli/claude-session.js +349 -0
- package/dist/cli/claude-session.js.map +1 -0
- package/dist/cli/index.d.ts +14 -0
- package/dist/cli/index.js +858 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/install.d.ts +16 -0
- package/dist/cli/install.js +185 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/uninstall.d.ts +7 -0
- package/dist/cli/uninstall.js +126 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/cli/update-check.d.ts +9 -0
- package/dist/cli/update-check.js +141 -0
- package/dist/cli/update-check.js.map +1 -0
- package/dist/config/config-recovery.d.ts +69 -0
- package/dist/config/config-recovery.d.ts.map +1 -0
- package/dist/config/config-recovery.js +302 -0
- package/dist/config/config-recovery.js.map +1 -0
- package/dist/config/global.d.ts +49 -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 +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +23 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/session-isolator.d.ts +76 -0
- package/dist/config/session-isolator.d.ts.map +1 -0
- package/dist/config/session-isolator.js +268 -0
- package/dist/config/session-isolator.js.map +1 -0
- package/dist/dashboard/activity-tracker.d.ts +76 -0
- package/dist/dashboard/activity-tracker.d.ts.map +1 -0
- package/dist/dashboard/activity-tracker.js +219 -0
- package/dist/dashboard/activity-tracker.js.map +1 -0
- package/dist/dashboard/ansi.d.ts +117 -0
- package/dist/dashboard/ansi.d.ts.map +1 -0
- package/dist/dashboard/ansi.js +199 -0
- package/dist/dashboard/ansi.js.map +1 -0
- package/dist/dashboard/index.d.ts +110 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +412 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/keyboard-handler.d.ts +43 -0
- package/dist/dashboard/keyboard-handler.d.ts.map +1 -0
- package/dist/dashboard/keyboard-handler.js +215 -0
- package/dist/dashboard/keyboard-handler.js.map +1 -0
- package/dist/dashboard/operation-controller.d.ts +76 -0
- package/dist/dashboard/operation-controller.d.ts.map +1 -0
- package/dist/dashboard/operation-controller.js +167 -0
- package/dist/dashboard/operation-controller.js.map +1 -0
- package/dist/dashboard/renderer.d.ts +76 -0
- package/dist/dashboard/renderer.d.ts.map +1 -0
- package/dist/dashboard/renderer.js +193 -0
- package/dist/dashboard/renderer.js.map +1 -0
- package/dist/dashboard/types.d.ts +56 -0
- package/dist/dashboard/types.d.ts.map +1 -0
- package/dist/dashboard/types.js +12 -0
- package/dist/dashboard/types.js.map +1 -0
- package/dist/dashboard/views/main-view.d.ts +23 -0
- package/dist/dashboard/views/main-view.d.ts.map +1 -0
- package/dist/dashboard/views/main-view.js +143 -0
- package/dist/dashboard/views/main-view.js.map +1 -0
- package/dist/dashboard/views/sessions-view.d.ts +22 -0
- package/dist/dashboard/views/sessions-view.d.ts.map +1 -0
- package/dist/dashboard/views/sessions-view.js +104 -0
- package/dist/dashboard/views/sessions-view.js.map +1 -0
- package/dist/dashboard/views/tabs-view.d.ts +21 -0
- package/dist/dashboard/views/tabs-view.d.ts.map +1 -0
- package/dist/dashboard/views/tabs-view.js +92 -0
- package/dist/dashboard/views/tabs-view.js.map +1 -0
- package/dist/hints/hint-engine.d.ts +77 -0
- package/dist/hints/hint-engine.d.ts.map +1 -0
- package/dist/hints/hint-engine.js +191 -0
- package/dist/hints/hint-engine.js.map +1 -0
- package/dist/hints/index.d.ts +8 -0
- package/dist/hints/index.d.ts.map +1 -0
- package/dist/hints/index.js +11 -0
- package/dist/hints/index.js.map +1 -0
- package/dist/hints/pattern-learner.d.ts +76 -0
- package/dist/hints/pattern-learner.d.ts.map +1 -0
- package/dist/hints/pattern-learner.js +254 -0
- package/dist/hints/pattern-learner.js.map +1 -0
- package/dist/hints/rules/composite-suggestions.d.ts +6 -0
- package/dist/hints/rules/composite-suggestions.d.ts.map +1 -0
- package/dist/hints/rules/composite-suggestions.js +66 -0
- package/dist/hints/rules/composite-suggestions.js.map +1 -0
- package/dist/hints/rules/error-recovery.d.ts +7 -0
- package/dist/hints/rules/error-recovery.d.ts.map +1 -0
- package/dist/hints/rules/error-recovery.js +55 -0
- package/dist/hints/rules/error-recovery.js.map +1 -0
- package/dist/hints/rules/learned-rules.d.ts +13 -0
- package/dist/hints/rules/learned-rules.d.ts.map +1 -0
- package/dist/hints/rules/learned-rules.js +27 -0
- package/dist/hints/rules/learned-rules.js.map +1 -0
- package/dist/hints/rules/repetition-detection.d.ts +7 -0
- package/dist/hints/rules/repetition-detection.d.ts.map +1 -0
- package/dist/hints/rules/repetition-detection.js +82 -0
- package/dist/hints/rules/repetition-detection.js.map +1 -0
- package/dist/hints/rules/sequence-detection.d.ts +6 -0
- package/dist/hints/rules/sequence-detection.d.ts.map +1 -0
- package/dist/hints/rules/sequence-detection.js +89 -0
- package/dist/hints/rules/sequence-detection.js.map +1 -0
- package/dist/hints/rules/success-hints.d.ts +6 -0
- package/dist/hints/rules/success-hints.d.ts.map +1 -0
- package/dist/hints/rules/success-hints.js +62 -0
- package/dist/hints/rules/success-hints.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +272 -0
- package/dist/index.js.map +1 -0
- package/dist/lightpanda/launcher.d.ts +58 -0
- package/dist/lightpanda/launcher.d.ts.map +1 -0
- package/dist/lightpanda/launcher.js +199 -0
- package/dist/lightpanda/launcher.js.map +1 -0
- package/dist/mcp-server.d.ts +129 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +641 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/memory/domain-memory.d.ts +68 -0
- package/dist/memory/domain-memory.d.ts.map +1 -0
- package/dist/memory/domain-memory.js +227 -0
- package/dist/memory/domain-memory.js.map +1 -0
- package/dist/orchestration/plan-executor.d.ts +19 -0
- package/dist/orchestration/plan-executor.d.ts.map +1 -0
- package/dist/orchestration/plan-executor.js +284 -0
- package/dist/orchestration/plan-executor.js.map +1 -0
- package/dist/orchestration/plan-registry.d.ts +55 -0
- package/dist/orchestration/plan-registry.d.ts.map +1 -0
- package/dist/orchestration/plan-registry.js +255 -0
- package/dist/orchestration/plan-registry.js.map +1 -0
- package/dist/orchestration/state-manager.d.ts +127 -0
- package/dist/orchestration/state-manager.d.ts.map +1 -0
- package/dist/orchestration/state-manager.js +438 -0
- package/dist/orchestration/state-manager.js.map +1 -0
- package/dist/orchestration/workflow-engine.d.ts +162 -0
- package/dist/orchestration/workflow-engine.d.ts.map +1 -0
- package/dist/orchestration/workflow-engine.js +731 -0
- package/dist/orchestration/workflow-engine.js.map +1 -0
- package/dist/resources/usage-guide.d.ts +13 -0
- package/dist/resources/usage-guide.d.ts.map +1 -0
- package/dist/resources/usage-guide.js +101 -0
- package/dist/resources/usage-guide.js.map +1 -0
- package/dist/router/browser-router.d.ts +51 -0
- package/dist/router/browser-router.d.ts.map +1 -0
- package/dist/router/browser-router.js +178 -0
- package/dist/router/browser-router.js.map +1 -0
- package/dist/router/cookie-sync.d.ts +48 -0
- package/dist/router/cookie-sync.d.ts.map +1 -0
- package/dist/router/cookie-sync.js +106 -0
- package/dist/router/cookie-sync.js.map +1 -0
- package/dist/router/index.d.ts +5 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +10 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/tool-routing-registry.d.ts +21 -0
- package/dist/router/tool-routing-registry.d.ts.map +1 -0
- package/dist/router/tool-routing-registry.js +90 -0
- package/dist/router/tool-routing-registry.js.map +1 -0
- package/dist/session-manager.d.ts +251 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +912 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/tools/batch-execute.d.ts +11 -0
- package/dist/tools/batch-execute.d.ts.map +1 -0
- package/dist/tools/batch-execute.js +226 -0
- package/dist/tools/batch-execute.js.map +1 -0
- package/dist/tools/click-element.d.ts +8 -0
- package/dist/tools/click-element.d.ts.map +1 -0
- package/dist/tools/click-element.js +455 -0
- package/dist/tools/click-element.js.map +1 -0
- package/dist/tools/computer.d.ts +6 -0
- package/dist/tools/computer.d.ts.map +1 -0
- package/dist/tools/computer.js +638 -0
- package/dist/tools/computer.js.map +1 -0
- package/dist/tools/console-capture.d.ts +6 -0
- package/dist/tools/console-capture.d.ts.map +1 -0
- package/dist/tools/console-capture.js +320 -0
- package/dist/tools/console-capture.js.map +1 -0
- package/dist/tools/cookies.d.ts +6 -0
- package/dist/tools/cookies.d.ts.map +1 -0
- package/dist/tools/cookies.js +263 -0
- package/dist/tools/cookies.js.map +1 -0
- package/dist/tools/drag-drop.d.ts +6 -0
- package/dist/tools/drag-drop.d.ts.map +1 -0
- package/dist/tools/drag-drop.js +252 -0
- package/dist/tools/drag-drop.js.map +1 -0
- package/dist/tools/emulate-device.d.ts +6 -0
- package/dist/tools/emulate-device.d.ts.map +1 -0
- package/dist/tools/emulate-device.js +221 -0
- package/dist/tools/emulate-device.js.map +1 -0
- package/dist/tools/file-upload.d.ts +6 -0
- package/dist/tools/file-upload.d.ts.map +1 -0
- package/dist/tools/file-upload.js +208 -0
- package/dist/tools/file-upload.js.map +1 -0
- package/dist/tools/fill-form.d.ts +8 -0
- package/dist/tools/fill-form.d.ts.map +1 -0
- package/dist/tools/fill-form.js +342 -0
- package/dist/tools/fill-form.js.map +1 -0
- package/dist/tools/find.d.ts +6 -0
- package/dist/tools/find.d.ts.map +1 -0
- package/dist/tools/find.js +330 -0
- package/dist/tools/find.js.map +1 -0
- package/dist/tools/form-input.d.ts +6 -0
- package/dist/tools/form-input.d.ts.map +1 -0
- package/dist/tools/form-input.js +181 -0
- package/dist/tools/form-input.js.map +1 -0
- package/dist/tools/geolocation.d.ts +6 -0
- package/dist/tools/geolocation.d.ts.map +1 -0
- package/dist/tools/geolocation.js +172 -0
- package/dist/tools/geolocation.js.map +1 -0
- package/dist/tools/http-auth.d.ts +6 -0
- package/dist/tools/http-auth.d.ts.map +1 -0
- package/dist/tools/http-auth.js +136 -0
- package/dist/tools/http-auth.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +104 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/javascript.d.ts +6 -0
- package/dist/tools/javascript.d.ts.map +1 -0
- package/dist/tools/javascript.js +138 -0
- package/dist/tools/javascript.js.map +1 -0
- package/dist/tools/lightweight-scroll.d.ts +11 -0
- package/dist/tools/lightweight-scroll.d.ts.map +1 -0
- package/dist/tools/lightweight-scroll.js +266 -0
- package/dist/tools/lightweight-scroll.js.map +1 -0
- package/dist/tools/memory.d.ts +10 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +141 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/navigate.d.ts +6 -0
- package/dist/tools/navigate.d.ts.map +1 -0
- package/dist/tools/navigate.js +241 -0
- package/dist/tools/navigate.js.map +1 -0
- package/dist/tools/network.d.ts +6 -0
- package/dist/tools/network.d.ts.map +1 -0
- package/dist/tools/network.js +215 -0
- package/dist/tools/network.js.map +1 -0
- package/dist/tools/orchestration.d.ts +6 -0
- package/dist/tools/orchestration.d.ts.map +1 -0
- package/dist/tools/orchestration.js +746 -0
- package/dist/tools/orchestration.js.map +1 -0
- package/dist/tools/page-content.d.ts +6 -0
- package/dist/tools/page-content.d.ts.map +1 -0
- package/dist/tools/page-content.js +120 -0
- package/dist/tools/page-content.js.map +1 -0
- package/dist/tools/page-pdf.d.ts +6 -0
- package/dist/tools/page-pdf.d.ts.map +1 -0
- package/dist/tools/page-pdf.js +245 -0
- package/dist/tools/page-pdf.js.map +1 -0
- package/dist/tools/page-reload.d.ts +6 -0
- package/dist/tools/page-reload.d.ts.map +1 -0
- package/dist/tools/page-reload.js +89 -0
- package/dist/tools/page-reload.js.map +1 -0
- package/dist/tools/performance-metrics.d.ts +6 -0
- package/dist/tools/performance-metrics.d.ts.map +1 -0
- package/dist/tools/performance-metrics.js +158 -0
- package/dist/tools/performance-metrics.js.map +1 -0
- package/dist/tools/read-page.d.ts +6 -0
- package/dist/tools/read-page.d.ts.map +1 -0
- package/dist/tools/read-page.js +287 -0
- package/dist/tools/read-page.js.map +1 -0
- package/dist/tools/request-intercept.d.ts +6 -0
- package/dist/tools/request-intercept.d.ts.map +1 -0
- package/dist/tools/request-intercept.js +439 -0
- package/dist/tools/request-intercept.js.map +1 -0
- package/dist/tools/selector-query.d.ts +6 -0
- package/dist/tools/selector-query.d.ts.map +1 -0
- package/dist/tools/selector-query.js +206 -0
- package/dist/tools/selector-query.js.map +1 -0
- package/dist/tools/shutdown.d.ts +12 -0
- package/dist/tools/shutdown.d.ts.map +1 -0
- package/dist/tools/shutdown.js +120 -0
- package/dist/tools/shutdown.js.map +1 -0
- package/dist/tools/storage.d.ts +6 -0
- package/dist/tools/storage.d.ts.map +1 -0
- package/dist/tools/storage.js +264 -0
- package/dist/tools/storage.js.map +1 -0
- package/dist/tools/tabs-close.d.ts +6 -0
- package/dist/tools/tabs-close.d.ts.map +1 -0
- package/dist/tools/tabs-close.js +124 -0
- package/dist/tools/tabs-close.js.map +1 -0
- package/dist/tools/tabs-context.d.ts +6 -0
- package/dist/tools/tabs-context.d.ts.map +1 -0
- package/dist/tools/tabs-context.js +92 -0
- package/dist/tools/tabs-context.js.map +1 -0
- package/dist/tools/tabs-create.d.ts +6 -0
- package/dist/tools/tabs-create.d.ts.map +1 -0
- package/dist/tools/tabs-create.js +73 -0
- package/dist/tools/tabs-create.js.map +1 -0
- package/dist/tools/user-agent.d.ts +6 -0
- package/dist/tools/user-agent.d.ts.map +1 -0
- package/dist/tools/user-agent.js +128 -0
- package/dist/tools/user-agent.js.map +1 -0
- package/dist/tools/wait-and-click.d.ts +8 -0
- package/dist/tools/wait-and-click.d.ts.map +1 -0
- package/dist/tools/wait-and-click.js +290 -0
- package/dist/tools/wait-and-click.js.map +1 -0
- package/dist/tools/wait-for.d.ts +6 -0
- package/dist/tools/wait-for.d.ts.map +1 -0
- package/dist/tools/wait-for.js +248 -0
- package/dist/tools/wait-for.js.map +1 -0
- 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/tools/xpath-query.d.ts +6 -0
- package/dist/tools/xpath-query.d.ts.map +1 -0
- package/dist/tools/xpath-query.js +230 -0
- package/dist/tools/xpath-query.js.map +1 -0
- package/dist/types/browser-backend.d.ts +30 -0
- package/dist/types/browser-backend.d.ts.map +1 -0
- package/dist/types/browser-backend.js +9 -0
- package/dist/types/browser-backend.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +19 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mcp.d.ts +54 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +14 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/plan-cache.d.ts +121 -0
- package/dist/types/plan-cache.d.ts.map +1 -0
- package/dist/types/plan-cache.js +9 -0
- package/dist/types/plan-cache.js.map +1 -0
- package/dist/types/profile.d.ts +76 -0
- package/dist/types/profile.d.ts.map +1 -0
- package/dist/types/profile.js +35 -0
- package/dist/types/profile.js.map +1 -0
- package/dist/types/session.d.ts +65 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +6 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/tool-manifest.d.ts +52 -0
- package/dist/types/tool-manifest.d.ts.map +1 -0
- package/dist/types/tool-manifest.js +37 -0
- package/dist/types/tool-manifest.js.map +1 -0
- package/dist/utils/atomic-file.d.ts +50 -0
- package/dist/utils/atomic-file.d.ts.map +1 -0
- package/dist/utils/atomic-file.js +217 -0
- package/dist/utils/atomic-file.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +22 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json-validator.d.ts +40 -0
- package/dist/utils/json-validator.d.ts.map +1 -0
- package/dist/utils/json-validator.js +295 -0
- package/dist/utils/json-validator.js.map +1 -0
- package/dist/utils/ref-id-manager.d.ts +26 -0
- package/dist/utils/ref-id-manager.d.ts.map +1 -0
- package/dist/utils/ref-id-manager.js +81 -0
- package/dist/utils/ref-id-manager.js.map +1 -0
- package/dist/utils/request-queue.d.ts +37 -0
- package/dist/utils/request-queue.d.ts.map +1 -0
- package/dist/utils/request-queue.js +110 -0
- package/dist/utils/request-queue.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,746 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Orchestration Tools - MCP tools for Chrome-Sisyphus workflow management
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.registerOrchestrationTools = registerOrchestrationTools;
|
|
40
|
+
const dns = __importStar(require("dns"));
|
|
41
|
+
const util_1 = require("util");
|
|
42
|
+
const mcp_server_1 = require("../mcp-server");
|
|
43
|
+
const workflow_engine_1 = require("../orchestration/workflow-engine");
|
|
44
|
+
const connection_pool_1 = require("../cdp/connection-pool");
|
|
45
|
+
const tool_manifest_1 = require("../types/tool-manifest");
|
|
46
|
+
const plan_registry_1 = require("../orchestration/plan-registry");
|
|
47
|
+
const plan_executor_1 = require("../orchestration/plan-executor");
|
|
48
|
+
const dnsResolve = (0, util_1.promisify)(dns.resolve);
|
|
49
|
+
// ============================================
|
|
50
|
+
// workflow_init - Initialize a new workflow
|
|
51
|
+
// ============================================
|
|
52
|
+
const workflowInitDefinition = {
|
|
53
|
+
name: 'workflow_init',
|
|
54
|
+
description: `Initialize a Chrome-Sisyphus workflow with multiple workers.
|
|
55
|
+
Creates isolated browser contexts for each worker and sets up scratchpad files.
|
|
56
|
+
|
|
57
|
+
Use this to prepare parallel browser operations before launching worker agents.`,
|
|
58
|
+
inputSchema: {
|
|
59
|
+
type: 'object',
|
|
60
|
+
properties: {
|
|
61
|
+
name: {
|
|
62
|
+
type: 'string',
|
|
63
|
+
description: 'Name of the workflow (e.g., "Price comparison")',
|
|
64
|
+
},
|
|
65
|
+
workers: {
|
|
66
|
+
type: 'array',
|
|
67
|
+
description: 'List of workers to create',
|
|
68
|
+
items: {
|
|
69
|
+
type: 'object',
|
|
70
|
+
properties: {
|
|
71
|
+
name: {
|
|
72
|
+
type: 'string',
|
|
73
|
+
description: 'Worker name (e.g., "coupang", "11st")',
|
|
74
|
+
},
|
|
75
|
+
url: {
|
|
76
|
+
type: 'string',
|
|
77
|
+
description: 'Initial URL to navigate to',
|
|
78
|
+
},
|
|
79
|
+
task: {
|
|
80
|
+
type: 'string',
|
|
81
|
+
description: 'Task description for the worker',
|
|
82
|
+
},
|
|
83
|
+
successCriteria: {
|
|
84
|
+
type: 'string',
|
|
85
|
+
description: 'Criteria for task completion',
|
|
86
|
+
},
|
|
87
|
+
shareCookies: {
|
|
88
|
+
type: 'boolean',
|
|
89
|
+
description: 'If true, worker shares cookies from existing Chrome session instead of isolated context (default: false)',
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
required: ['name', 'url', 'task'],
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
workerTimeoutMs: {
|
|
96
|
+
type: 'number',
|
|
97
|
+
description: 'Maximum execution time per worker in milliseconds (default: 60000). Workers exceeding this limit are force-completed with PARTIAL status.',
|
|
98
|
+
},
|
|
99
|
+
maxStaleIterations: {
|
|
100
|
+
type: 'number',
|
|
101
|
+
description: 'Maximum consecutive worker updates with no data change before circuit breaker triggers (default: 5). Prevents runaway workers stuck in retry loops.',
|
|
102
|
+
},
|
|
103
|
+
globalTimeoutMs: {
|
|
104
|
+
type: 'number',
|
|
105
|
+
description: 'Maximum total workflow execution time in milliseconds (default: 300000). All running workers are force-completed when exceeded.',
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
required: ['name', 'workers'],
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
const workflowInitHandler = async (sessionId, args) => {
|
|
112
|
+
const engine = (0, workflow_engine_1.getWorkflowEngine)();
|
|
113
|
+
const name = args.name;
|
|
114
|
+
const workerTimeoutMs = args.workerTimeoutMs;
|
|
115
|
+
const maxStaleIterations = args.maxStaleIterations;
|
|
116
|
+
const globalTimeoutMs = args.globalTimeoutMs;
|
|
117
|
+
const workerDefs = args.workers;
|
|
118
|
+
// DNS pre-resolution: resolve all worker hostnames in parallel
|
|
119
|
+
// This saves ~200ms per site by warming the DNS cache before navigation
|
|
120
|
+
const uniqueHostnames = [...new Set(workerDefs
|
|
121
|
+
.map(w => {
|
|
122
|
+
try {
|
|
123
|
+
return new URL(w.url.startsWith('http') ? w.url : `https://${w.url}`).hostname;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
})
|
|
129
|
+
.filter((h) => h !== null))];
|
|
130
|
+
if (uniqueHostnames.length > 0) {
|
|
131
|
+
await Promise.allSettled(uniqueHostnames.map(hostname => dnsResolve(hostname).catch(() => { })));
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
// Pre-warm connection pool in parallel with DNS resolution
|
|
135
|
+
const pool = (0, connection_pool_1.getCDPConnectionPool)();
|
|
136
|
+
const preWarmPromise = pool.preWarmForWorkflow(workerDefs.length).catch((err) => {
|
|
137
|
+
console.error('[Orchestration] Pool pre-warm failed (non-fatal):', err);
|
|
138
|
+
return { warmed: 0, durationMs: 0 };
|
|
139
|
+
});
|
|
140
|
+
await preWarmPromise;
|
|
141
|
+
// Create workflow definition
|
|
142
|
+
const workflow = {
|
|
143
|
+
id: `wf-${Date.now()}`,
|
|
144
|
+
name,
|
|
145
|
+
steps: workerDefs.map((w, i) => {
|
|
146
|
+
if (w.shareCookies === undefined) {
|
|
147
|
+
console.error(`[Orchestration] Worker "${w.name}": shareCookies not specified, defaulting to true (shared context for faster init)`);
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
workerId: `worker-${w.name}`,
|
|
151
|
+
workerName: w.name,
|
|
152
|
+
url: w.url,
|
|
153
|
+
task: w.task,
|
|
154
|
+
successCriteria: w.successCriteria || 'Task completed successfully',
|
|
155
|
+
shareCookies: w.shareCookies ?? true, // Default to shared cookies for faster context creation
|
|
156
|
+
};
|
|
157
|
+
}),
|
|
158
|
+
parallel: true,
|
|
159
|
+
maxRetries: 3,
|
|
160
|
+
timeout: workerTimeoutMs || 60000,
|
|
161
|
+
maxStaleIterations: maxStaleIterations || 5,
|
|
162
|
+
globalTimeoutMs: globalTimeoutMs || 300000,
|
|
163
|
+
};
|
|
164
|
+
// Initialize workflow
|
|
165
|
+
const result = await engine.initWorkflow(sessionId, workflow);
|
|
166
|
+
// Generate tool manifest for worker agents (Shared Tool Registry)
|
|
167
|
+
// Workers receive pre-loaded tool schemas so they can skip ToolSearch calls
|
|
168
|
+
let manifestTools;
|
|
169
|
+
try {
|
|
170
|
+
const mcpServer = (0, mcp_server_1.getMCPServer)();
|
|
171
|
+
const manifest = mcpServer.getToolManifest();
|
|
172
|
+
const workerToolConfig = { workerType: 'extraction' };
|
|
173
|
+
manifestTools = (0, tool_manifest_1.filterToolsForWorker)(manifest, workerToolConfig);
|
|
174
|
+
console.error(`[Orchestration] Tool manifest generated: ${manifestTools.length} tools for extraction workers (v${manifest.version})`);
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
console.error(`[Orchestration] Tool manifest generation failed (non-fatal, using fallback): ${err instanceof Error ? err.message : String(err)}`);
|
|
178
|
+
manifestTools = undefined;
|
|
179
|
+
}
|
|
180
|
+
// Generate worker prompts for reference
|
|
181
|
+
const workerPrompts = result.workers.map((w, i) => ({
|
|
182
|
+
workerName: w.workerName,
|
|
183
|
+
tabId: w.tabId,
|
|
184
|
+
prompt: engine.generateWorkerPrompt(w.workerId, w.workerName, w.tabId, workflow.steps[i].task, workflow.steps[i].successCriteria, manifestTools, workflow.steps[i].url),
|
|
185
|
+
}));
|
|
186
|
+
return {
|
|
187
|
+
content: [
|
|
188
|
+
{
|
|
189
|
+
type: 'text',
|
|
190
|
+
text: JSON.stringify({
|
|
191
|
+
orchestrationId: result.orchestrationId,
|
|
192
|
+
status: 'INITIALIZED',
|
|
193
|
+
workers: result.workers.map((w, i) => ({
|
|
194
|
+
workerId: w.workerId,
|
|
195
|
+
workerName: w.workerName,
|
|
196
|
+
tabId: w.tabId,
|
|
197
|
+
task: workflow.steps[i].task,
|
|
198
|
+
})),
|
|
199
|
+
scratchpadDir: '.agent/chrome-sisyphus',
|
|
200
|
+
message: `Workflow initialized with ${result.workers.length} workers. Launch Background Tasks for each worker using the Task tool with run_in_background: true.`,
|
|
201
|
+
workerPrompts,
|
|
202
|
+
}, null, 2),
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
return {
|
|
209
|
+
content: [
|
|
210
|
+
{
|
|
211
|
+
type: 'text',
|
|
212
|
+
text: `Error initializing workflow: ${error instanceof Error ? error.message : String(error)}`,
|
|
213
|
+
},
|
|
214
|
+
],
|
|
215
|
+
isError: true,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
// ============================================
|
|
220
|
+
// workflow_status - Get workflow status
|
|
221
|
+
// ============================================
|
|
222
|
+
const workflowStatusDefinition = {
|
|
223
|
+
name: 'workflow_status',
|
|
224
|
+
description: `Get the current status of a Chrome-Sisyphus workflow.
|
|
225
|
+
Returns orchestration state and all worker states.`,
|
|
226
|
+
inputSchema: {
|
|
227
|
+
type: 'object',
|
|
228
|
+
properties: {
|
|
229
|
+
includeWorkerDetails: {
|
|
230
|
+
type: 'boolean',
|
|
231
|
+
description: 'Include full worker scratchpad details (default: false)',
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
required: [],
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
const workflowStatusHandler = async (_sessionId, args) => {
|
|
238
|
+
const engine = (0, workflow_engine_1.getWorkflowEngine)();
|
|
239
|
+
const includeWorkerDetails = args.includeWorkerDetails ?? false;
|
|
240
|
+
try {
|
|
241
|
+
const orch = await engine.getOrchestrationStatus();
|
|
242
|
+
if (!orch) {
|
|
243
|
+
return {
|
|
244
|
+
content: [
|
|
245
|
+
{
|
|
246
|
+
type: 'text',
|
|
247
|
+
text: JSON.stringify({ status: 'NO_WORKFLOW', message: 'No active workflow found' }),
|
|
248
|
+
},
|
|
249
|
+
],
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
const result = {
|
|
253
|
+
orchestrationId: orch.orchestrationId,
|
|
254
|
+
status: orch.status,
|
|
255
|
+
task: orch.task,
|
|
256
|
+
workers: orch.workers,
|
|
257
|
+
completedWorkers: orch.completedWorkers,
|
|
258
|
+
failedWorkers: orch.failedWorkers,
|
|
259
|
+
duration: Date.now() - orch.createdAt,
|
|
260
|
+
};
|
|
261
|
+
if (includeWorkerDetails) {
|
|
262
|
+
const workerStates = await engine.getAllWorkerStates();
|
|
263
|
+
result.workerDetails = workerStates.map(w => ({
|
|
264
|
+
workerName: w.workerName,
|
|
265
|
+
status: w.status,
|
|
266
|
+
iteration: w.iteration,
|
|
267
|
+
progressLog: w.progressLog,
|
|
268
|
+
extractedData: w.extractedData,
|
|
269
|
+
errors: w.errors,
|
|
270
|
+
}));
|
|
271
|
+
}
|
|
272
|
+
return {
|
|
273
|
+
content: [
|
|
274
|
+
{
|
|
275
|
+
type: 'text',
|
|
276
|
+
text: JSON.stringify(result, null, 2),
|
|
277
|
+
},
|
|
278
|
+
],
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
return {
|
|
283
|
+
content: [
|
|
284
|
+
{
|
|
285
|
+
type: 'text',
|
|
286
|
+
text: `Error getting workflow status: ${error instanceof Error ? error.message : String(error)}`,
|
|
287
|
+
},
|
|
288
|
+
],
|
|
289
|
+
isError: true,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
// ============================================
|
|
294
|
+
// workflow_collect - Collect workflow results
|
|
295
|
+
// ============================================
|
|
296
|
+
const workflowCollectDefinition = {
|
|
297
|
+
name: 'workflow_collect',
|
|
298
|
+
description: `Collect and aggregate results from all workers in the workflow.
|
|
299
|
+
Use this after all worker Background Tasks have completed.`,
|
|
300
|
+
inputSchema: {
|
|
301
|
+
type: 'object',
|
|
302
|
+
properties: {},
|
|
303
|
+
required: [],
|
|
304
|
+
},
|
|
305
|
+
};
|
|
306
|
+
const workflowCollectHandler = async (_sessionId, _args) => {
|
|
307
|
+
const engine = (0, workflow_engine_1.getWorkflowEngine)();
|
|
308
|
+
try {
|
|
309
|
+
const results = await engine.collectResults();
|
|
310
|
+
if (!results) {
|
|
311
|
+
return {
|
|
312
|
+
content: [
|
|
313
|
+
{
|
|
314
|
+
type: 'text',
|
|
315
|
+
text: JSON.stringify({ status: 'NO_RESULTS', message: 'No workflow results found' }),
|
|
316
|
+
},
|
|
317
|
+
],
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
return {
|
|
321
|
+
content: [
|
|
322
|
+
{
|
|
323
|
+
type: 'text',
|
|
324
|
+
text: JSON.stringify(results, null, 2),
|
|
325
|
+
},
|
|
326
|
+
],
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
return {
|
|
331
|
+
content: [
|
|
332
|
+
{
|
|
333
|
+
type: 'text',
|
|
334
|
+
text: `Error collecting results: ${error instanceof Error ? error.message : String(error)}`,
|
|
335
|
+
},
|
|
336
|
+
],
|
|
337
|
+
isError: true,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
// ============================================
|
|
342
|
+
// workflow_cleanup - Cleanup workflow resources
|
|
343
|
+
// ============================================
|
|
344
|
+
const workflowCleanupDefinition = {
|
|
345
|
+
name: 'workflow_cleanup',
|
|
346
|
+
description: `Clean up workflow resources including workers, tabs, and scratchpad files.
|
|
347
|
+
Use this after workflow completion or to abort a workflow.`,
|
|
348
|
+
inputSchema: {
|
|
349
|
+
type: 'object',
|
|
350
|
+
properties: {},
|
|
351
|
+
required: [],
|
|
352
|
+
},
|
|
353
|
+
};
|
|
354
|
+
const workflowCleanupHandler = async (sessionId, _args) => {
|
|
355
|
+
const engine = (0, workflow_engine_1.getWorkflowEngine)();
|
|
356
|
+
try {
|
|
357
|
+
await engine.cleanupWorkflow(sessionId);
|
|
358
|
+
return {
|
|
359
|
+
content: [
|
|
360
|
+
{
|
|
361
|
+
type: 'text',
|
|
362
|
+
text: JSON.stringify({
|
|
363
|
+
status: 'CLEANED',
|
|
364
|
+
message: 'Workflow resources cleaned up successfully',
|
|
365
|
+
}),
|
|
366
|
+
},
|
|
367
|
+
],
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
catch (error) {
|
|
371
|
+
return {
|
|
372
|
+
content: [
|
|
373
|
+
{
|
|
374
|
+
type: 'text',
|
|
375
|
+
text: `Error cleaning up workflow: ${error instanceof Error ? error.message : String(error)}`,
|
|
376
|
+
},
|
|
377
|
+
],
|
|
378
|
+
isError: true,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
// ============================================
|
|
383
|
+
// worker_update - Update worker progress
|
|
384
|
+
// ============================================
|
|
385
|
+
const workerUpdateDefinition = {
|
|
386
|
+
name: 'worker_update',
|
|
387
|
+
description: `Update a worker's progress in the orchestration scratchpad.
|
|
388
|
+
Call this from worker agents to report progress.`,
|
|
389
|
+
inputSchema: {
|
|
390
|
+
type: 'object',
|
|
391
|
+
properties: {
|
|
392
|
+
workerName: {
|
|
393
|
+
type: 'string',
|
|
394
|
+
description: 'Name of the worker',
|
|
395
|
+
},
|
|
396
|
+
status: {
|
|
397
|
+
type: 'string',
|
|
398
|
+
enum: ['INIT', 'IN_PROGRESS', 'SUCCESS', 'PARTIAL', 'FAIL'],
|
|
399
|
+
description: 'Worker status',
|
|
400
|
+
},
|
|
401
|
+
iteration: {
|
|
402
|
+
type: 'number',
|
|
403
|
+
description: 'Current iteration number',
|
|
404
|
+
},
|
|
405
|
+
action: {
|
|
406
|
+
type: 'string',
|
|
407
|
+
description: 'Action being performed',
|
|
408
|
+
},
|
|
409
|
+
result: {
|
|
410
|
+
type: 'string',
|
|
411
|
+
enum: ['SUCCESS', 'FAIL', 'IN_PROGRESS'],
|
|
412
|
+
description: 'Result of the action',
|
|
413
|
+
},
|
|
414
|
+
extractedData: {
|
|
415
|
+
type: 'object',
|
|
416
|
+
description: 'Data extracted so far',
|
|
417
|
+
},
|
|
418
|
+
error: {
|
|
419
|
+
type: 'string',
|
|
420
|
+
description: 'Error message if any',
|
|
421
|
+
},
|
|
422
|
+
},
|
|
423
|
+
required: ['workerName'],
|
|
424
|
+
},
|
|
425
|
+
};
|
|
426
|
+
const workerUpdateHandler = async (_sessionId, args) => {
|
|
427
|
+
const engine = (0, workflow_engine_1.getWorkflowEngine)();
|
|
428
|
+
const workerName = args.workerName;
|
|
429
|
+
try {
|
|
430
|
+
await engine.updateWorkerProgress(workerName, {
|
|
431
|
+
status: args.status,
|
|
432
|
+
iteration: args.iteration,
|
|
433
|
+
action: args.action,
|
|
434
|
+
result: args.result,
|
|
435
|
+
extractedData: args.extractedData,
|
|
436
|
+
error: args.error,
|
|
437
|
+
});
|
|
438
|
+
return {
|
|
439
|
+
content: [
|
|
440
|
+
{
|
|
441
|
+
type: 'text',
|
|
442
|
+
text: JSON.stringify({
|
|
443
|
+
status: 'UPDATED',
|
|
444
|
+
workerName,
|
|
445
|
+
message: `Worker ${workerName} progress updated`,
|
|
446
|
+
}),
|
|
447
|
+
},
|
|
448
|
+
],
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
catch (error) {
|
|
452
|
+
return {
|
|
453
|
+
content: [
|
|
454
|
+
{
|
|
455
|
+
type: 'text',
|
|
456
|
+
text: `Error updating worker: ${error instanceof Error ? error.message : String(error)}`,
|
|
457
|
+
},
|
|
458
|
+
],
|
|
459
|
+
isError: true,
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
};
|
|
463
|
+
// ============================================
|
|
464
|
+
// worker_complete - Mark worker as complete
|
|
465
|
+
// ============================================
|
|
466
|
+
const workerCompleteDefinition = {
|
|
467
|
+
name: 'worker_complete',
|
|
468
|
+
description: `Mark a worker as complete with final results.
|
|
469
|
+
Call this from worker agents when task is done.`,
|
|
470
|
+
inputSchema: {
|
|
471
|
+
type: 'object',
|
|
472
|
+
properties: {
|
|
473
|
+
workerName: {
|
|
474
|
+
type: 'string',
|
|
475
|
+
description: 'Name of the worker',
|
|
476
|
+
},
|
|
477
|
+
status: {
|
|
478
|
+
type: 'string',
|
|
479
|
+
enum: ['SUCCESS', 'PARTIAL', 'FAIL'],
|
|
480
|
+
description: 'Final status',
|
|
481
|
+
},
|
|
482
|
+
resultSummary: {
|
|
483
|
+
type: 'string',
|
|
484
|
+
description: 'Brief summary of results (max 100 chars)',
|
|
485
|
+
},
|
|
486
|
+
extractedData: {
|
|
487
|
+
type: 'object',
|
|
488
|
+
description: 'Final extracted data',
|
|
489
|
+
},
|
|
490
|
+
},
|
|
491
|
+
required: ['workerName', 'status', 'resultSummary'],
|
|
492
|
+
},
|
|
493
|
+
};
|
|
494
|
+
const workerCompleteHandler = async (_sessionId, args) => {
|
|
495
|
+
const engine = (0, workflow_engine_1.getWorkflowEngine)();
|
|
496
|
+
const workerName = args.workerName;
|
|
497
|
+
const status = args.status;
|
|
498
|
+
const resultSummary = args.resultSummary;
|
|
499
|
+
const extractedData = args.extractedData;
|
|
500
|
+
try {
|
|
501
|
+
await engine.completeWorker(workerName, status, resultSummary, extractedData);
|
|
502
|
+
return {
|
|
503
|
+
content: [
|
|
504
|
+
{
|
|
505
|
+
type: 'text',
|
|
506
|
+
text: JSON.stringify({
|
|
507
|
+
status: 'COMPLETED',
|
|
508
|
+
workerName,
|
|
509
|
+
workerStatus: status,
|
|
510
|
+
message: `Worker ${workerName} marked as ${status}`,
|
|
511
|
+
}),
|
|
512
|
+
},
|
|
513
|
+
],
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
catch (error) {
|
|
517
|
+
return {
|
|
518
|
+
content: [
|
|
519
|
+
{
|
|
520
|
+
type: 'text',
|
|
521
|
+
text: `Error completing worker: ${error instanceof Error ? error.message : String(error)}`,
|
|
522
|
+
},
|
|
523
|
+
],
|
|
524
|
+
isError: true,
|
|
525
|
+
};
|
|
526
|
+
}
|
|
527
|
+
};
|
|
528
|
+
// ============================================
|
|
529
|
+
// workflow_collect_partial - Collect completed results without waiting
|
|
530
|
+
// ============================================
|
|
531
|
+
const workflowCollectPartialDefinition = {
|
|
532
|
+
name: 'workflow_collect_partial',
|
|
533
|
+
description: `Collect results from completed workers without waiting for all workers to finish.
|
|
534
|
+
Returns only workers that have already reported SUCCESS, PARTIAL, or FAIL status.
|
|
535
|
+
Use this to stream results as they become available instead of waiting for the slowest worker.`,
|
|
536
|
+
inputSchema: {
|
|
537
|
+
type: 'object',
|
|
538
|
+
properties: {
|
|
539
|
+
onlySuccessful: {
|
|
540
|
+
type: 'boolean',
|
|
541
|
+
description: 'If true, only return workers with SUCCESS or PARTIAL status (default: false)',
|
|
542
|
+
},
|
|
543
|
+
},
|
|
544
|
+
required: [],
|
|
545
|
+
},
|
|
546
|
+
};
|
|
547
|
+
const workflowCollectPartialHandler = async (_sessionId, args) => {
|
|
548
|
+
const engine = (0, workflow_engine_1.getWorkflowEngine)();
|
|
549
|
+
const onlySuccessful = args.onlySuccessful ?? false;
|
|
550
|
+
try {
|
|
551
|
+
const orch = await engine.getOrchestrationStatus();
|
|
552
|
+
if (!orch) {
|
|
553
|
+
return {
|
|
554
|
+
content: [
|
|
555
|
+
{
|
|
556
|
+
type: 'text',
|
|
557
|
+
text: JSON.stringify({ status: 'NO_WORKFLOW', message: 'No active workflow found' }),
|
|
558
|
+
},
|
|
559
|
+
],
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
// Get all worker states
|
|
563
|
+
const workerStates = await engine.getAllWorkerStates();
|
|
564
|
+
// Filter to completed workers only
|
|
565
|
+
const completedStatuses = onlySuccessful
|
|
566
|
+
? ['SUCCESS', 'PARTIAL']
|
|
567
|
+
: ['SUCCESS', 'PARTIAL', 'FAIL'];
|
|
568
|
+
const completedWorkers = workerStates.filter(w => completedStatuses.includes(w.status));
|
|
569
|
+
const pendingWorkers = workerStates.filter(w => !['SUCCESS', 'PARTIAL', 'FAIL'].includes(w.status));
|
|
570
|
+
const results = {
|
|
571
|
+
orchestrationId: orch.orchestrationId,
|
|
572
|
+
overallStatus: orch.status,
|
|
573
|
+
progress: {
|
|
574
|
+
total: orch.workers.length,
|
|
575
|
+
completed: orch.completedWorkers,
|
|
576
|
+
failed: orch.failedWorkers,
|
|
577
|
+
pending: orch.workers.length - orch.completedWorkers - orch.failedWorkers,
|
|
578
|
+
},
|
|
579
|
+
completedWorkers: completedWorkers.map(w => ({
|
|
580
|
+
workerName: w.workerName,
|
|
581
|
+
status: w.status,
|
|
582
|
+
extractedData: w.extractedData,
|
|
583
|
+
iterations: w.iteration,
|
|
584
|
+
errors: w.errors,
|
|
585
|
+
})),
|
|
586
|
+
pendingWorkerNames: pendingWorkers.map(w => w.workerName),
|
|
587
|
+
duration: Date.now() - orch.createdAt,
|
|
588
|
+
};
|
|
589
|
+
return {
|
|
590
|
+
content: [
|
|
591
|
+
{
|
|
592
|
+
type: 'text',
|
|
593
|
+
text: JSON.stringify(results, null, 2),
|
|
594
|
+
},
|
|
595
|
+
],
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
catch (error) {
|
|
599
|
+
return {
|
|
600
|
+
content: [
|
|
601
|
+
{
|
|
602
|
+
type: 'text',
|
|
603
|
+
text: `Error collecting partial results: ${error instanceof Error ? error.message : String(error)}`,
|
|
604
|
+
},
|
|
605
|
+
],
|
|
606
|
+
isError: true,
|
|
607
|
+
};
|
|
608
|
+
}
|
|
609
|
+
};
|
|
610
|
+
// ============================================
|
|
611
|
+
// execute_plan - Execute a cached compiled plan
|
|
612
|
+
// ============================================
|
|
613
|
+
const executePlanDefinition = {
|
|
614
|
+
name: 'execute_plan',
|
|
615
|
+
description: `Execute a cached compiled plan by ID, bypassing per-step agent LLM round-trips.
|
|
616
|
+
The plan's tool calls are chained internally on the server side.
|
|
617
|
+
Use this for repeated task patterns (e.g., tweet extraction) where the tool sequence is known.
|
|
618
|
+
Falls back gracefully — returns an error result if the plan fails, allowing the agent to retry manually.`,
|
|
619
|
+
inputSchema: {
|
|
620
|
+
type: 'object',
|
|
621
|
+
properties: {
|
|
622
|
+
planId: {
|
|
623
|
+
type: 'string',
|
|
624
|
+
description: 'ID of the compiled plan to execute (e.g., "x-tweet-extraction-v1")',
|
|
625
|
+
},
|
|
626
|
+
tabId: {
|
|
627
|
+
type: 'string',
|
|
628
|
+
description: 'Tab ID to execute the plan against',
|
|
629
|
+
},
|
|
630
|
+
params: {
|
|
631
|
+
type: 'object',
|
|
632
|
+
description: 'Additional runtime parameters to pass to the plan (merged with plan defaults)',
|
|
633
|
+
},
|
|
634
|
+
},
|
|
635
|
+
required: ['planId', 'tabId'],
|
|
636
|
+
},
|
|
637
|
+
};
|
|
638
|
+
const executePlanHandler = async (sessionId, args) => {
|
|
639
|
+
const planId = args.planId;
|
|
640
|
+
const tabId = args.tabId;
|
|
641
|
+
const runtimeParams = args.params || {};
|
|
642
|
+
if (!planId || !tabId) {
|
|
643
|
+
return {
|
|
644
|
+
content: [{ type: 'text', text: 'Error: planId and tabId are required' }],
|
|
645
|
+
isError: true,
|
|
646
|
+
};
|
|
647
|
+
}
|
|
648
|
+
try {
|
|
649
|
+
const registry = (0, plan_registry_1.getPlanRegistry)();
|
|
650
|
+
const entry = registry.getEntry(planId);
|
|
651
|
+
if (!entry) {
|
|
652
|
+
return {
|
|
653
|
+
content: [{
|
|
654
|
+
type: 'text',
|
|
655
|
+
text: JSON.stringify({
|
|
656
|
+
status: 'PLAN_NOT_FOUND',
|
|
657
|
+
planId,
|
|
658
|
+
availablePlans: registry.getEntries().map(e => e.id),
|
|
659
|
+
message: `No plan found with ID "${planId}". Use workflow_init for manual execution.`,
|
|
660
|
+
}),
|
|
661
|
+
}],
|
|
662
|
+
isError: true,
|
|
663
|
+
};
|
|
664
|
+
}
|
|
665
|
+
// Check confidence threshold
|
|
666
|
+
if (entry.confidence < entry.minConfidenceToUse) {
|
|
667
|
+
return {
|
|
668
|
+
content: [{
|
|
669
|
+
type: 'text',
|
|
670
|
+
text: JSON.stringify({
|
|
671
|
+
status: 'LOW_CONFIDENCE',
|
|
672
|
+
planId,
|
|
673
|
+
confidence: entry.confidence,
|
|
674
|
+
threshold: entry.minConfidenceToUse,
|
|
675
|
+
message: `Plan confidence (${entry.confidence.toFixed(2)}) is below threshold (${entry.minConfidenceToUse}). Use manual execution.`,
|
|
676
|
+
}),
|
|
677
|
+
}],
|
|
678
|
+
isError: true,
|
|
679
|
+
};
|
|
680
|
+
}
|
|
681
|
+
const plan = registry.loadPlan(entry);
|
|
682
|
+
if (!plan) {
|
|
683
|
+
return {
|
|
684
|
+
content: [{
|
|
685
|
+
type: 'text',
|
|
686
|
+
text: JSON.stringify({
|
|
687
|
+
status: 'PLAN_LOAD_FAILED',
|
|
688
|
+
planId,
|
|
689
|
+
message: `Failed to load plan file for "${planId}".`,
|
|
690
|
+
}),
|
|
691
|
+
}],
|
|
692
|
+
isError: true,
|
|
693
|
+
};
|
|
694
|
+
}
|
|
695
|
+
// Create executor with MCPServer's tool resolver
|
|
696
|
+
const mcpServer = (0, mcp_server_1.getMCPServer)();
|
|
697
|
+
const executor = new plan_executor_1.PlanExecutor((toolName) => mcpServer.getToolHandler(toolName));
|
|
698
|
+
// Execute the plan
|
|
699
|
+
const mergedParams = { tabId, ...runtimeParams };
|
|
700
|
+
const result = await executor.execute(plan, sessionId, mergedParams);
|
|
701
|
+
// Update stats
|
|
702
|
+
registry.updateStats(planId, result.success, result.durationMs);
|
|
703
|
+
return {
|
|
704
|
+
content: [{
|
|
705
|
+
type: 'text',
|
|
706
|
+
text: JSON.stringify({
|
|
707
|
+
status: result.success ? 'SUCCESS' : 'FAILED',
|
|
708
|
+
planId: result.planId,
|
|
709
|
+
stepsExecuted: result.stepsExecuted,
|
|
710
|
+
totalSteps: result.totalSteps,
|
|
711
|
+
durationMs: result.durationMs,
|
|
712
|
+
data: result.data,
|
|
713
|
+
error: result.error,
|
|
714
|
+
message: result.success
|
|
715
|
+
? `Plan "${planId}" executed successfully in ${result.durationMs}ms (${result.stepsExecuted}/${result.totalSteps} steps)`
|
|
716
|
+
: `Plan "${planId}" failed: ${result.error}. Consider manual execution.`,
|
|
717
|
+
}, null, 2),
|
|
718
|
+
}],
|
|
719
|
+
isError: !result.success,
|
|
720
|
+
};
|
|
721
|
+
}
|
|
722
|
+
catch (error) {
|
|
723
|
+
return {
|
|
724
|
+
content: [{
|
|
725
|
+
type: 'text',
|
|
726
|
+
text: `Error executing plan "${planId}": ${error instanceof Error ? error.message : String(error)}`,
|
|
727
|
+
}],
|
|
728
|
+
isError: true,
|
|
729
|
+
};
|
|
730
|
+
}
|
|
731
|
+
};
|
|
732
|
+
// ============================================
|
|
733
|
+
// Register all orchestration tools
|
|
734
|
+
// ============================================
|
|
735
|
+
function registerOrchestrationTools(server) {
|
|
736
|
+
server.registerTool('workflow_init', workflowInitHandler, workflowInitDefinition);
|
|
737
|
+
server.registerTool('workflow_status', workflowStatusHandler, workflowStatusDefinition);
|
|
738
|
+
server.registerTool('workflow_collect', workflowCollectHandler, workflowCollectDefinition);
|
|
739
|
+
server.registerTool('workflow_collect_partial', workflowCollectPartialHandler, workflowCollectPartialDefinition);
|
|
740
|
+
server.registerTool('workflow_cleanup', workflowCleanupHandler, workflowCleanupDefinition);
|
|
741
|
+
server.registerTool('worker_update', workerUpdateHandler, workerUpdateDefinition);
|
|
742
|
+
server.registerTool('worker_complete', workerCompleteHandler, workerCompleteDefinition);
|
|
743
|
+
server.registerTool('execute_plan', executePlanHandler, executePlanDefinition);
|
|
744
|
+
console.error('[Orchestration] Registered 8 orchestration tools (including execute_plan)');
|
|
745
|
+
}
|
|
746
|
+
//# sourceMappingURL=orchestration.js.map
|