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,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tabs Context Tool - Get context about browser tabs
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.registerTabsContextTool = registerTabsContextTool;
|
|
7
|
+
const session_manager_1 = require("../session-manager");
|
|
8
|
+
const definition = {
|
|
9
|
+
name: 'tabs_context_mcp',
|
|
10
|
+
description: 'Get context information about the current MCP session tabs and workers. Returns all tab IDs grouped by worker.',
|
|
11
|
+
inputSchema: {
|
|
12
|
+
type: 'object',
|
|
13
|
+
properties: {
|
|
14
|
+
workerId: {
|
|
15
|
+
type: 'string',
|
|
16
|
+
description: 'Optional: Get tabs for a specific worker only.',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
required: [],
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
const handler = async (sessionId, args) => {
|
|
23
|
+
const sessionManager = (0, session_manager_1.getSessionManager)();
|
|
24
|
+
const requestedWorkerId = args.workerId;
|
|
25
|
+
try {
|
|
26
|
+
const session = await sessionManager.getOrCreateSession(sessionId);
|
|
27
|
+
const workers = sessionManager.getWorkers(sessionId);
|
|
28
|
+
// Get tab info grouped by worker
|
|
29
|
+
const tabInfos = [];
|
|
30
|
+
const workerTabs = {};
|
|
31
|
+
for (const workerInfo of workers) {
|
|
32
|
+
// Skip if specific worker requested and this isn't it
|
|
33
|
+
if (requestedWorkerId && workerInfo.id !== requestedWorkerId) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
const targetIds = sessionManager.getWorkerTargetIds(sessionId, workerInfo.id);
|
|
37
|
+
workerTabs[workerInfo.id] = [];
|
|
38
|
+
for (const targetId of targetIds) {
|
|
39
|
+
try {
|
|
40
|
+
const page = await sessionManager.getPage(sessionId, targetId, workerInfo.id, 'tabs_context');
|
|
41
|
+
if (page) {
|
|
42
|
+
const tabInfo = {
|
|
43
|
+
tabId: targetId,
|
|
44
|
+
workerId: workerInfo.id,
|
|
45
|
+
url: page.url(),
|
|
46
|
+
title: await page.title(),
|
|
47
|
+
};
|
|
48
|
+
tabInfos.push(tabInfo);
|
|
49
|
+
workerTabs[workerInfo.id].push(tabInfo);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Target may have been closed, skip it
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
content: [
|
|
59
|
+
{
|
|
60
|
+
type: 'text',
|
|
61
|
+
text: JSON.stringify({
|
|
62
|
+
sessionId,
|
|
63
|
+
defaultWorkerId: session.defaultWorkerId,
|
|
64
|
+
workerCount: workers.length,
|
|
65
|
+
tabCount: tabInfos.length,
|
|
66
|
+
workers: workers.map((w) => ({
|
|
67
|
+
id: w.id,
|
|
68
|
+
name: w.name,
|
|
69
|
+
tabCount: workerTabs[w.id]?.length || 0,
|
|
70
|
+
tabs: workerTabs[w.id] || [],
|
|
71
|
+
})),
|
|
72
|
+
}, null, 2),
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
return {
|
|
79
|
+
content: [
|
|
80
|
+
{
|
|
81
|
+
type: 'text',
|
|
82
|
+
text: `Error getting tab context: ${error instanceof Error ? error.message : String(error)}`,
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
isError: true,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
function registerTabsContextTool(server) {
|
|
90
|
+
server.registerTool('tabs_context_mcp', handler, definition);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=tabs-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs-context.js","sourceRoot":"","sources":["../../src/tools/tabs-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs-create.d.ts","sourceRoot":"","sources":["../../src/tools/tabs-create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AA6E1C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAE9D"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tabs Create Tool - Create a new tab in the session with a specific URL
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.registerTabsCreateTool = registerTabsCreateTool;
|
|
7
|
+
const session_manager_1 = require("../session-manager");
|
|
8
|
+
const definition = {
|
|
9
|
+
name: 'tabs_create_mcp',
|
|
10
|
+
description: 'Creates a new tab with the specified URL. URL is required to prevent about:blank tab accumulation. Use workerId for parallel browser operations.',
|
|
11
|
+
inputSchema: {
|
|
12
|
+
type: 'object',
|
|
13
|
+
properties: {
|
|
14
|
+
url: {
|
|
15
|
+
type: 'string',
|
|
16
|
+
description: 'URL to open in the new tab (required)',
|
|
17
|
+
},
|
|
18
|
+
workerId: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
description: 'Worker ID for parallel operations. Uses default worker if not specified.',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
required: ['url'],
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
const handler = async (sessionId, args) => {
|
|
27
|
+
const sessionManager = (0, session_manager_1.getSessionManager)();
|
|
28
|
+
const url = args.url;
|
|
29
|
+
const workerId = args.workerId;
|
|
30
|
+
// URL is required
|
|
31
|
+
if (!url) {
|
|
32
|
+
return {
|
|
33
|
+
content: [
|
|
34
|
+
{
|
|
35
|
+
type: 'text',
|
|
36
|
+
text: 'Error: url is required. Use navigate tool without tabId to create a new tab with a URL.',
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
isError: true,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const { targetId, page, workerId: assignedWorkerId } = await sessionManager.createTarget(sessionId, url, workerId);
|
|
44
|
+
return {
|
|
45
|
+
content: [
|
|
46
|
+
{
|
|
47
|
+
type: 'text',
|
|
48
|
+
text: JSON.stringify({
|
|
49
|
+
tabId: targetId,
|
|
50
|
+
workerId: assignedWorkerId,
|
|
51
|
+
url: page.url(),
|
|
52
|
+
title: await page.title(),
|
|
53
|
+
}, null, 2),
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return {
|
|
60
|
+
content: [
|
|
61
|
+
{
|
|
62
|
+
type: 'text',
|
|
63
|
+
text: `Error creating tab: ${error instanceof Error ? error.message : String(error)}`,
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
isError: true,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
function registerTabsCreateTool(server) {
|
|
71
|
+
server.registerTool('tabs_create_mcp', handler, definition);
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=tabs-create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs-create.js","sourceRoot":"","sources":["../../src/tools/tabs-create.ts"],"names":[],"mappings":";AAAA;;GAEG;;AA+EH,wDAEC;AA7ED,wDAAuD;AAEvD,MAAM,UAAU,GAAsB;IACpC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,kJAAkJ;IAC/J,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,GAAG,EAAE;gBACH,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,uCAAuC;aACrD;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0EAA0E;aACxF;SACF;QACD,QAAQ,EAAE,CAAC,KAAK,CAAC;KAClB;CACF,CAAC;AAEF,MAAM,OAAO,GAAgB,KAAK,EAChC,SAAiB,EACjB,IAA6B,EACT,EAAE;IACtB,MAAM,cAAc,GAAG,IAAA,mCAAiB,GAAE,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAa,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAA8B,CAAC;IAErD,kBAAkB;IAClB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,yFAAyF;iBAChG;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAEnH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,KAAK,EAAE,QAAQ;wBACf,QAAQ,EAAE,gBAAgB;wBAC1B,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;wBACf,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE;qBAC1B,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,uBAAuB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBACtF;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,SAAgB,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-agent.d.ts","sourceRoot":"","sources":["../../src/tools/user-agent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AA8I1C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAE7D"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* User-Agent Tool - Change browser user agent
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.registerUserAgentTool = registerUserAgentTool;
|
|
7
|
+
const session_manager_1 = require("../session-manager");
|
|
8
|
+
// Predefined user agent strings
|
|
9
|
+
const USER_AGENT_PRESETS = {
|
|
10
|
+
'chrome-windows': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
|
11
|
+
'chrome-mac': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
|
12
|
+
'firefox-windows': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0',
|
|
13
|
+
'firefox-mac': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0',
|
|
14
|
+
'safari-mac': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15',
|
|
15
|
+
'safari-iphone': 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1',
|
|
16
|
+
'safari-ipad': 'Mozilla/5.0 (iPad; CPU OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1',
|
|
17
|
+
'chrome-android': 'Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36',
|
|
18
|
+
googlebot: 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
|
|
19
|
+
bingbot: 'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)',
|
|
20
|
+
};
|
|
21
|
+
const definition = {
|
|
22
|
+
name: 'user_agent',
|
|
23
|
+
description: `Change the browser's User-Agent string.
|
|
24
|
+
Presets: ${Object.keys(USER_AGENT_PRESETS).join(', ')}
|
|
25
|
+
Use "preset" for predefined user agents or "custom" for a custom string.`,
|
|
26
|
+
inputSchema: {
|
|
27
|
+
type: 'object',
|
|
28
|
+
properties: {
|
|
29
|
+
tabId: {
|
|
30
|
+
type: 'string',
|
|
31
|
+
description: 'Tab ID to change user agent for',
|
|
32
|
+
},
|
|
33
|
+
preset: {
|
|
34
|
+
type: 'string',
|
|
35
|
+
description: `Preset name: ${Object.keys(USER_AGENT_PRESETS).join(', ')}`,
|
|
36
|
+
enum: Object.keys(USER_AGENT_PRESETS),
|
|
37
|
+
},
|
|
38
|
+
custom: {
|
|
39
|
+
type: 'string',
|
|
40
|
+
description: 'Custom user agent string (overrides preset if provided)',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
required: ['tabId'],
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
const handler = async (sessionId, args) => {
|
|
47
|
+
const tabId = args.tabId;
|
|
48
|
+
const preset = args.preset;
|
|
49
|
+
const custom = args.custom;
|
|
50
|
+
const sessionManager = (0, session_manager_1.getSessionManager)();
|
|
51
|
+
if (!tabId) {
|
|
52
|
+
return {
|
|
53
|
+
content: [{ type: 'text', text: 'Error: tabId is required' }],
|
|
54
|
+
isError: true,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (!preset && !custom) {
|
|
58
|
+
return {
|
|
59
|
+
content: [
|
|
60
|
+
{ type: 'text', text: 'Error: Either preset or custom user agent is required' },
|
|
61
|
+
],
|
|
62
|
+
isError: true,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
const page = await sessionManager.getPage(sessionId, tabId, undefined, 'user_agent');
|
|
67
|
+
if (!page) {
|
|
68
|
+
return {
|
|
69
|
+
content: [{ type: 'text', text: `Error: Tab ${tabId} not found` }],
|
|
70
|
+
isError: true,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
let userAgent;
|
|
74
|
+
if (custom) {
|
|
75
|
+
userAgent = custom;
|
|
76
|
+
}
|
|
77
|
+
else if (preset) {
|
|
78
|
+
const presetUA = USER_AGENT_PRESETS[preset];
|
|
79
|
+
if (!presetUA) {
|
|
80
|
+
return {
|
|
81
|
+
content: [
|
|
82
|
+
{
|
|
83
|
+
type: 'text',
|
|
84
|
+
text: `Error: Unknown preset "${preset}". Available: ${Object.keys(USER_AGENT_PRESETS).join(', ')}`,
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
isError: true,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
userAgent = presetUA;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
return {
|
|
94
|
+
content: [{ type: 'text', text: 'Error: No user agent specified' }],
|
|
95
|
+
isError: true,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
await page.setUserAgent(userAgent);
|
|
99
|
+
return {
|
|
100
|
+
content: [
|
|
101
|
+
{
|
|
102
|
+
type: 'text',
|
|
103
|
+
text: JSON.stringify({
|
|
104
|
+
action: 'user_agent',
|
|
105
|
+
preset: custom ? null : preset,
|
|
106
|
+
userAgent,
|
|
107
|
+
message: `User-Agent changed to: ${userAgent.slice(0, 80)}...`,
|
|
108
|
+
}),
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
return {
|
|
115
|
+
content: [
|
|
116
|
+
{
|
|
117
|
+
type: 'text',
|
|
118
|
+
text: `User-Agent error: ${error instanceof Error ? error.message : String(error)}`,
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
isError: true,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
function registerUserAgentTool(server) {
|
|
126
|
+
server.registerTool('user_agent', handler, definition);
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=user-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-agent.js","sourceRoot":"","sources":["../../src/tools/user-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wait and Click Tool - Waits for an element to appear and then clicks it
|
|
3
|
+
*
|
|
4
|
+
* Useful for dynamic content that loads after page interaction.
|
|
5
|
+
*/
|
|
6
|
+
import { MCPServer } from '../mcp-server';
|
|
7
|
+
export declare function registerWaitAndClickTool(server: MCPServer): void;
|
|
8
|
+
//# sourceMappingURL=wait-and-click.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait-and-click.d.ts","sourceRoot":"","sources":["../../src/tools/wait-and-click.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAuU1C,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEhE"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Wait and Click Tool - Waits for an element to appear and then clicks it
|
|
4
|
+
*
|
|
5
|
+
* Useful for dynamic content that loads after page interaction.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.registerWaitAndClickTool = registerWaitAndClickTool;
|
|
9
|
+
const session_manager_1 = require("../session-manager");
|
|
10
|
+
const ref_id_manager_1 = require("../utils/ref-id-manager");
|
|
11
|
+
const definition = {
|
|
12
|
+
name: 'wait_and_click',
|
|
13
|
+
description: `Wait for an element matching the query to appear, then click it.
|
|
14
|
+
Useful for clicking elements that appear after page load or after other interactions.
|
|
15
|
+
|
|
16
|
+
Examples:
|
|
17
|
+
- wait_and_click(query: "Save Changes", timeout: 5000)
|
|
18
|
+
- wait_and_click(query: "Modal close button", timeout: 3000)
|
|
19
|
+
- wait_and_click(query: "Loading complete message")`,
|
|
20
|
+
inputSchema: {
|
|
21
|
+
type: 'object',
|
|
22
|
+
properties: {
|
|
23
|
+
tabId: {
|
|
24
|
+
type: 'string',
|
|
25
|
+
description: 'Tab ID to execute on',
|
|
26
|
+
},
|
|
27
|
+
query: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: 'Natural language description of the element to wait for and click',
|
|
30
|
+
},
|
|
31
|
+
timeout: {
|
|
32
|
+
type: 'number',
|
|
33
|
+
description: 'Maximum time to wait in milliseconds (default: 5000, max: 30000)',
|
|
34
|
+
},
|
|
35
|
+
poll_interval: {
|
|
36
|
+
type: 'number',
|
|
37
|
+
description: 'How often to check for the element in milliseconds (default: 200)',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
required: ['tabId', 'query'],
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
const handler = async (sessionId, args) => {
|
|
44
|
+
const tabId = args.tabId;
|
|
45
|
+
const query = args.query;
|
|
46
|
+
const timeout = Math.min(Math.max(args.timeout || 5000, 100), 30000);
|
|
47
|
+
const pollInterval = Math.min(Math.max(args.poll_interval || 200, 50), 2000);
|
|
48
|
+
const sessionManager = (0, session_manager_1.getSessionManager)();
|
|
49
|
+
const refIdManager = (0, ref_id_manager_1.getRefIdManager)();
|
|
50
|
+
if (!tabId) {
|
|
51
|
+
return {
|
|
52
|
+
content: [{ type: 'text', text: 'Error: tabId is required' }],
|
|
53
|
+
isError: true,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if (!query) {
|
|
57
|
+
return {
|
|
58
|
+
content: [{ type: 'text', text: 'Error: query is required' }],
|
|
59
|
+
isError: true,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const page = await sessionManager.getPage(sessionId, tabId, undefined, 'wait_and_click');
|
|
64
|
+
if (!page) {
|
|
65
|
+
return {
|
|
66
|
+
content: [{ type: 'text', text: `Error: Tab ${tabId} not found` }],
|
|
67
|
+
isError: true,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const queryLower = query.toLowerCase();
|
|
71
|
+
const queryTokens = queryLower
|
|
72
|
+
.split(/\s+/)
|
|
73
|
+
.filter(t => t.length > 1)
|
|
74
|
+
.filter(t => !['the', 'a', 'an', 'to', 'for', 'of', 'in', 'on', 'at', 'and', 'or'].includes(t));
|
|
75
|
+
const startTime = Date.now();
|
|
76
|
+
let bestMatch = null;
|
|
77
|
+
// Poll for the element
|
|
78
|
+
while (Date.now() - startTime < timeout) {
|
|
79
|
+
const result = await page.evaluate((searchQuery, tokens) => {
|
|
80
|
+
function scoreElement(el, rect) {
|
|
81
|
+
let score = 0;
|
|
82
|
+
const inputEl = el;
|
|
83
|
+
const text = el.textContent?.toLowerCase() || '';
|
|
84
|
+
const ariaLabel = el.getAttribute('aria-label')?.toLowerCase() || '';
|
|
85
|
+
const name = ariaLabel || el.getAttribute('title')?.toLowerCase() || text.slice(0, 100);
|
|
86
|
+
const role = el.getAttribute('role') ||
|
|
87
|
+
(el.tagName === 'BUTTON' ? 'button' : el.tagName === 'A' ? 'link' : el.tagName.toLowerCase());
|
|
88
|
+
const searchLower = searchQuery.toLowerCase();
|
|
89
|
+
// Exact match
|
|
90
|
+
if (name === searchLower || text.trim() === searchLower)
|
|
91
|
+
score += 100;
|
|
92
|
+
// Contains full query
|
|
93
|
+
if (name.includes(searchLower) || text.includes(searchLower))
|
|
94
|
+
score += 50;
|
|
95
|
+
if (ariaLabel.includes(searchLower))
|
|
96
|
+
score += 45;
|
|
97
|
+
// Token matching
|
|
98
|
+
const combinedText = `${name} ${text} ${ariaLabel}`;
|
|
99
|
+
for (const token of tokens) {
|
|
100
|
+
if (combinedText.includes(token))
|
|
101
|
+
score += 15;
|
|
102
|
+
}
|
|
103
|
+
// Role matching
|
|
104
|
+
if (searchLower.includes('button') && (role === 'button' || el.tagName === 'BUTTON'))
|
|
105
|
+
score += 30;
|
|
106
|
+
if (searchLower.includes('link') && (role === 'link' || el.tagName === 'A'))
|
|
107
|
+
score += 30;
|
|
108
|
+
// Interactive bonus
|
|
109
|
+
if (['button', 'link', 'menuitem', 'tab'].includes(role))
|
|
110
|
+
score += 20;
|
|
111
|
+
// Size bonus
|
|
112
|
+
if (rect.width > 50 && rect.height > 20)
|
|
113
|
+
score += 10;
|
|
114
|
+
return score;
|
|
115
|
+
}
|
|
116
|
+
const selectors = [
|
|
117
|
+
'button',
|
|
118
|
+
'[role="button"]',
|
|
119
|
+
'a',
|
|
120
|
+
'[role="link"]',
|
|
121
|
+
'input[type="submit"]',
|
|
122
|
+
'input[type="button"]',
|
|
123
|
+
'[role="menuitem"]',
|
|
124
|
+
'[role="tab"]',
|
|
125
|
+
'[onclick]',
|
|
126
|
+
];
|
|
127
|
+
let best = null;
|
|
128
|
+
// First pass: interactive elements
|
|
129
|
+
for (const selector of selectors) {
|
|
130
|
+
try {
|
|
131
|
+
for (const el of document.querySelectorAll(selector)) {
|
|
132
|
+
const rect = el.getBoundingClientRect();
|
|
133
|
+
if (rect.width === 0 || rect.height === 0)
|
|
134
|
+
continue;
|
|
135
|
+
const style = window.getComputedStyle(el);
|
|
136
|
+
if (style.visibility === 'hidden' || style.display === 'none' || style.opacity === '0')
|
|
137
|
+
continue;
|
|
138
|
+
const score = scoreElement(el, rect);
|
|
139
|
+
if (score > 20 && (!best || score > best.score)) {
|
|
140
|
+
best = { el, rect, score };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// Skip invalid selector
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Second pass: any element with matching text
|
|
149
|
+
if (!best || best.score < 50) {
|
|
150
|
+
const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT);
|
|
151
|
+
let node = walker.nextNode();
|
|
152
|
+
while (node) {
|
|
153
|
+
const el = node;
|
|
154
|
+
const rect = el.getBoundingClientRect();
|
|
155
|
+
if (rect.width > 0 && rect.height > 0) {
|
|
156
|
+
const style = window.getComputedStyle(el);
|
|
157
|
+
if (style.visibility !== 'hidden' && style.display !== 'none') {
|
|
158
|
+
const score = scoreElement(el, rect);
|
|
159
|
+
if (score > 40 && (!best || score > best.score)) {
|
|
160
|
+
best = { el, rect, score };
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
node = walker.nextNode();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (!best || best.score < 20)
|
|
168
|
+
return null;
|
|
169
|
+
// Tag the element for CDP reference
|
|
170
|
+
best.el.__waitClickTarget = true;
|
|
171
|
+
const inputEl = best.el;
|
|
172
|
+
return {
|
|
173
|
+
backendDOMNodeId: 0,
|
|
174
|
+
role: best.el.getAttribute('role') ||
|
|
175
|
+
(best.el.tagName === 'BUTTON' ? 'button' : best.el.tagName === 'A' ? 'link' : best.el.tagName.toLowerCase()),
|
|
176
|
+
name: best.el.getAttribute('aria-label') ||
|
|
177
|
+
best.el.getAttribute('title') ||
|
|
178
|
+
best.el.textContent?.trim().slice(0, 100) || '',
|
|
179
|
+
rect: {
|
|
180
|
+
x: best.rect.x + best.rect.width / 2,
|
|
181
|
+
y: best.rect.y + best.rect.height / 2,
|
|
182
|
+
width: best.rect.width,
|
|
183
|
+
height: best.rect.height,
|
|
184
|
+
},
|
|
185
|
+
score: best.score,
|
|
186
|
+
};
|
|
187
|
+
}, queryLower, queryTokens);
|
|
188
|
+
if (result && result.score >= 20) {
|
|
189
|
+
// Get backend DOM node ID
|
|
190
|
+
const cdpClient = sessionManager.getCDPClient();
|
|
191
|
+
try {
|
|
192
|
+
const { result: objResult } = await cdpClient.send(page, 'Runtime.evaluate', {
|
|
193
|
+
expression: `document.querySelectorAll('*').find(el => el.__waitClickTarget === true)`,
|
|
194
|
+
returnByValue: false,
|
|
195
|
+
});
|
|
196
|
+
if (objResult.objectId) {
|
|
197
|
+
const { node } = await cdpClient.send(page, 'DOM.describeNode', {
|
|
198
|
+
objectId: objResult.objectId,
|
|
199
|
+
});
|
|
200
|
+
result.backendDOMNodeId = node.backendNodeId;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
// Continue without backend node ID
|
|
205
|
+
}
|
|
206
|
+
bestMatch = result;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
// Wait before next poll
|
|
210
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
211
|
+
}
|
|
212
|
+
if (!bestMatch) {
|
|
213
|
+
return {
|
|
214
|
+
content: [
|
|
215
|
+
{
|
|
216
|
+
type: 'text',
|
|
217
|
+
text: `Timeout: No element matching "${query}" appeared within ${timeout}ms`,
|
|
218
|
+
},
|
|
219
|
+
],
|
|
220
|
+
isError: true,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
const waitTime = Date.now() - startTime;
|
|
224
|
+
// Scroll into view if needed
|
|
225
|
+
const cdpClient = sessionManager.getCDPClient();
|
|
226
|
+
if (bestMatch.backendDOMNodeId) {
|
|
227
|
+
try {
|
|
228
|
+
await cdpClient.send(page, 'DOM.scrollIntoViewIfNeeded', {
|
|
229
|
+
backendNodeId: bestMatch.backendDOMNodeId,
|
|
230
|
+
});
|
|
231
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
232
|
+
// Re-get position after scroll
|
|
233
|
+
const { result: posResult } = await cdpClient.send(page, 'Runtime.evaluate', {
|
|
234
|
+
expression: `(() => {
|
|
235
|
+
const el = document.querySelectorAll('*').find(el => el.__waitClickTarget === true);
|
|
236
|
+
if (!el) return null;
|
|
237
|
+
const rect = el.getBoundingClientRect();
|
|
238
|
+
return { x: rect.x + rect.width/2, y: rect.y + rect.height/2 };
|
|
239
|
+
})()`,
|
|
240
|
+
returnByValue: true,
|
|
241
|
+
});
|
|
242
|
+
if (posResult.value) {
|
|
243
|
+
bestMatch.rect.x = posResult.value.x;
|
|
244
|
+
bestMatch.rect.y = posResult.value.y;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
// Continue with original coordinates
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// Click the element
|
|
252
|
+
const clickX = Math.round(bestMatch.rect.x);
|
|
253
|
+
const clickY = Math.round(bestMatch.rect.y);
|
|
254
|
+
await page.mouse.click(clickX, clickY);
|
|
255
|
+
// Clean up marker
|
|
256
|
+
await page.evaluate(() => {
|
|
257
|
+
const el = Array.from(document.querySelectorAll('*')).find((e) => e.__waitClickTarget);
|
|
258
|
+
if (el)
|
|
259
|
+
delete el.__waitClickTarget;
|
|
260
|
+
});
|
|
261
|
+
// Generate ref
|
|
262
|
+
let refId = '';
|
|
263
|
+
if (bestMatch.backendDOMNodeId) {
|
|
264
|
+
refId = refIdManager.generateRef(sessionId, tabId, bestMatch.backendDOMNodeId, bestMatch.role, bestMatch.name);
|
|
265
|
+
}
|
|
266
|
+
return {
|
|
267
|
+
content: [
|
|
268
|
+
{
|
|
269
|
+
type: 'text',
|
|
270
|
+
text: `Waited ${waitTime}ms, then clicked ${bestMatch.role} "${bestMatch.name.slice(0, 50)}" at (${clickX}, ${clickY})${refId ? ` [${refId}]` : ''}`,
|
|
271
|
+
},
|
|
272
|
+
],
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
return {
|
|
277
|
+
content: [
|
|
278
|
+
{
|
|
279
|
+
type: 'text',
|
|
280
|
+
text: `Wait and click error: ${error instanceof Error ? error.message : String(error)}`,
|
|
281
|
+
},
|
|
282
|
+
],
|
|
283
|
+
isError: true,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
function registerWaitAndClickTool(server) {
|
|
288
|
+
server.registerTool('wait_and_click', handler, definition);
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=wait-and-click.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait-and-click.js","sourceRoot":"","sources":["../../src/tools/wait-and-click.ts"],"names":[],"mappings":"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"}
|