@sudu-cli/fronted-preview-mcp 1.0.0-beta.4 → 1.0.0-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +24 -0
  2. package/dist/handlers/autoFixLoop.d.ts +3 -10
  3. package/dist/handlers/autoFixLoop.js +10 -49
  4. package/dist/handlers/autoFixLoop.js.map +1 -1
  5. package/dist/handlers/click.d.ts +9 -0
  6. package/dist/handlers/click.js +93 -0
  7. package/dist/handlers/click.js.map +1 -0
  8. package/dist/handlers/fill.d.ts +10 -0
  9. package/dist/handlers/fill.js +129 -0
  10. package/dist/handlers/fill.js.map +1 -0
  11. package/dist/handlers/inspect.d.ts +11 -0
  12. package/dist/handlers/inspect.js +138 -0
  13. package/dist/handlers/inspect.js.map +1 -0
  14. package/dist/handlers/screenshot.d.ts +10 -0
  15. package/dist/handlers/screenshot.js +135 -0
  16. package/dist/handlers/screenshot.js.map +1 -0
  17. package/dist/handlers/typescriptDiagnostics.d.ts +9 -0
  18. package/dist/index.js +215 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/navigate.d.ts +9 -0
  21. package/dist/navigate.js +78 -0
  22. package/dist/navigate.js.map +1 -0
  23. package/dist/strategies/baseStrategy.d.ts +27 -0
  24. package/dist/strategies/baseStrategy.js +23 -0
  25. package/dist/strategies/baseStrategy.js.map +1 -0
  26. package/dist/strategies/index.d.ts +9 -0
  27. package/dist/strategies/index.js +22 -0
  28. package/dist/strategies/index.js.map +1 -0
  29. package/dist/strategies/missingImport.d.ts +16 -0
  30. package/dist/strategies/missingImport.js +156 -0
  31. package/dist/strategies/missingImport.js.map +1 -0
  32. package/dist/strategies/missingProperty.d.ts +13 -0
  33. package/dist/strategies/missingProperty.js +134 -0
  34. package/dist/strategies/missingProperty.js.map +1 -0
  35. package/dist/strategies/networkError.d.ts +10 -0
  36. package/dist/strategies/networkError.js +56 -0
  37. package/dist/strategies/networkError.js.map +1 -0
  38. package/dist/strategies/nullCheckInsertion.d.ts +14 -0
  39. package/dist/strategies/nullCheckInsertion.js +138 -0
  40. package/dist/strategies/nullCheckInsertion.js.map +1 -0
  41. package/dist/strategies/typeAssignment.d.ts +13 -0
  42. package/dist/strategies/typeAssignment.js +121 -0
  43. package/dist/strategies/typeAssignment.js.map +1 -0
  44. package/dist/strategies/unusedImportRemoval.d.ts +11 -0
  45. package/dist/strategies/unusedImportRemoval.js +138 -0
  46. package/dist/strategies/unusedImportRemoval.js.map +1 -0
  47. package/dist/types.d.ts +1 -1
  48. package/dist/types.js.map +1 -1
  49. package/package.json +2 -2
package/README.md CHANGED
@@ -26,19 +26,43 @@ npx @sudu-cli/fronted-preview-mcp --help
26
26
 
27
27
  | 工具 | 说明 |
28
28
  |------|------|
29
+ | **项目管理** | |
29
30
  | `quick_preview` | **推荐**。检测框架 + 启动 dev server,一步完成 |
30
31
  | `get_project_info` | 仅检测项目框架信息 |
31
32
  | `start_dev_server` | 仅启动 dev server |
32
33
  | `stop_dev_server` | 停止 dev server |
34
+ | **浏览器自动化** | |
35
+ | `navigate` | 导航到指定URL,等待页面加载 |
36
+ | `click` | 点击页面元素(支持多种点击方式) |
37
+ | `fill` | 填充表单输入字段 |
38
+ | `screenshot` | 截图功能(支持全页面、元素截图) |
39
+ | `inspect` | 元素检查和分析(详细属性、样式、结构) |
40
+ | **错误检测** | |
41
+ | `check_page_errors` | 检查页面console错误和网络失败 |
42
+ | `get_typescript_diagnostics` | TypeScript类型错误检查 |
43
+ | `auto_fix_loop` | 自动检测和修复前端错误的迭代循环 |
33
44
 
34
45
  ### 推荐工作流
35
46
 
47
+ #### 基础预览工作流
36
48
  调用 `quick_preview` 后,按顺序执行:
37
49
 
38
50
  1. **chrome-devtools** `navigate_page(url)` — 打开页面
39
51
  2. **chrome-devtools** `list_console_messages()` — 检查 console 错误
40
52
  3. **chrome-devtools** `take_snapshot()` — 分析页面结构
41
53
 
54
+ #### 自动化测试工作流
55
+ 1. **frontend-preview** `navigate(url)` — 导航到目标页面
56
+ 2. **frontend-preview** `fill(selector, value)` — 填充表单
57
+ 3. **frontend-preview** `click(selector)` — 点击按钮
58
+ 4. **frontend-preview** `check_page_errors()` — 检查错误
59
+ 5. **frontend-preview** `screenshot()` — 截图验证
60
+
61
+ #### 元素检查工作流
62
+ 1. **frontend-preview** `navigate(url)` — 导航到页面
63
+ 2. **frontend-preview** `inspect(selector)` — 检查元素详情
64
+ 3. **frontend-preview** `screenshot(selector)` — 截取元素截图
65
+
42
66
  ## 配置
43
67
 
44
68
  `npx @sudu-cli/fronted-preview-mcp init` 会生成:
@@ -2,7 +2,8 @@ import { ToolContext } from '../types.js';
2
2
  export interface FixStrategy {
3
3
  errorType: 'typescript' | 'console' | 'network';
4
4
  pattern: RegExp;
5
- fix: (context: ToolContext, error: ConsoleError | TSDiagnostic) => Promise<FixResult>;
5
+ canFix(error: any): boolean;
6
+ fix(context: any, error: any): Promise<FixResult>;
6
7
  }
7
8
  export interface FixResult {
8
9
  success: boolean;
@@ -29,20 +30,12 @@ export interface AutoFixResult {
29
30
  errors: string[];
30
31
  fixesApplied: FixResult[];
31
32
  }
32
- interface ConsoleError {
33
+ export interface ConsoleError {
33
34
  type: string;
34
35
  message: string;
35
36
  url?: string;
36
37
  lineNumber?: number;
37
38
  stackTrace?: string;
38
39
  }
39
- interface TSDiagnostic {
40
- message: string;
41
- severity: string;
42
- file?: string;
43
- line?: number;
44
- column?: number;
45
- }
46
40
  export declare function autoFixLoop(context: ToolContext, options?: AutoFixOptions): Promise<AutoFixResult>;
47
41
  export declare function handleAutoFixLoop(context: ToolContext, options?: AutoFixOptions): Promise<AutoFixResult>;
48
- export {};
@@ -1,6 +1,8 @@
1
1
  import { handleCheckPageErrors } from './checkPageErrors.js';
2
2
  import { handleGetTypeScriptDiagnostics } from './typescriptDiagnostics.js';
3
3
  import { TIMEOUTS } from '../constants.js';
4
+ import { createFixContext, defaultFixStrategies } from '../strategies/index.js';
5
+ import * as path from 'node:path';
4
6
  function parseCheckPageErrorsResponse(response) {
5
7
  try {
6
8
  const text = response.content[0]?.text || '{}';
@@ -38,58 +40,13 @@ export async function autoFixLoop(context, options = {}) {
38
40
  errors: [],
39
41
  fixesApplied: []
40
42
  };
41
- // Default fix strategies for common errors
42
- const defaultStrategies = [
43
- {
44
- errorType: 'typescript',
45
- pattern: /Unused variable|unused import/i,
46
- fix: async (ctx, error) => {
47
- // Remove unused imports/variables via ts-morph
48
- return { success: false, message: 'Unused import removal requires ts-morph integration' };
49
- }
50
- },
51
- {
52
- errorType: 'typescript',
53
- pattern: /Property '(.+)' does not exist on type/i,
54
- fix: async (ctx, error) => {
55
- // Suggest adding missing property or type assertion
56
- return { success: false, message: 'Missing property fix requires AST manipulation' };
57
- }
58
- },
59
- {
60
- errorType: 'typescript',
61
- pattern: /Type '(.+)' is not assignable to type/i,
62
- fix: async (ctx, error) => {
63
- return { success: false, message: 'Type assignment fix requires type inference' };
64
- }
65
- },
66
- {
67
- errorType: 'console',
68
- pattern: /Cannot read propert(?:y|ies) of (?:null|undefined)/i,
69
- fix: async (ctx, error) => {
70
- return { success: false, message: 'Null check insertion requires AST analysis' };
71
- }
72
- },
73
- {
74
- errorType: 'console',
75
- pattern: /is not defined/i,
76
- fix: async (ctx, error) => {
77
- return { success: false, message: 'Missing import/definition fix requires module analysis' };
78
- }
79
- },
80
- {
81
- errorType: 'network',
82
- pattern: /Failed to fetch|Network Error|ECONNREFUSED/i,
83
- fix: async (ctx, error) => {
84
- return { success: false, message: 'Network errors typically require backend/server fixes' };
85
- }
86
- }
87
- ];
43
+ // Use real fix strategies instead of stubs
44
+ const defaultStrategies = defaultFixStrategies;
88
45
  const strategies = [...defaultStrategies, ...fixStrategies];
89
46
  // Helper to find matching strategy
90
47
  const findStrategy = (error) => {
91
48
  const errorMsg = error.message || String(error);
92
- return strategies.find(s => s.pattern.test(errorMsg));
49
+ return strategies.find(s => s.pattern.test(errorMsg) && s.canFix(error));
93
50
  };
94
51
  // Helper to apply fix strategies
95
52
  const applyFixes = async (errors) => {
@@ -98,7 +55,11 @@ export async function autoFixLoop(context, options = {}) {
98
55
  const strategy = findStrategy(error);
99
56
  if (strategy && fixAction !== 'none') {
100
57
  try {
101
- const fixResult = await strategy.fix(context, error);
58
+ // Create fix context for ts-morph strategies
59
+ const projectDir = context.projectDir || process.cwd();
60
+ const tsConfigPath = path.resolve(projectDir, 'tsconfig.json');
61
+ const fixContext = createFixContext(projectDir, tsConfigPath);
62
+ const fixResult = await strategy.fix(fixContext, error);
102
63
  fixes.push(fixResult);
103
64
  if (fixResult.success) {
104
65
  result.messages.push(`✅ Fixed: ${fixResult.message}`);
@@ -1 +1 @@
1
- {"version":3,"file":"autoFixLoop.js","sourceRoot":"","sources":["../../src/handlers/autoFixLoop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"autoFixLoop.js","sourceRoot":"","sources":["../../src/handlers/autoFixLoop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { MCPToolResponse } from '../types.js';
2
+ interface ClickArgs {
3
+ selector: string;
4
+ timeout?: number;
5
+ button?: 'left' | 'right' | 'middle';
6
+ clickCount?: number;
7
+ }
8
+ export declare function handleClick(args: ClickArgs): Promise<MCPToolResponse>;
9
+ export {};
@@ -0,0 +1,93 @@
1
+ import { CDPConnectionManager } from '../cdp/connectionManager.js';
2
+ import { createMCPError, createMCPSuccess } from '../types.js';
3
+ export async function handleClick(args) {
4
+ const { selector, timeout = 5000, button = 'left', clickCount = 1 } = args;
5
+ const cdpManager = CDPConnectionManager.getInstance();
6
+ try {
7
+ // Connect to CDP if not already connected
8
+ const connection = await cdpManager.getConnection(9222);
9
+ // Wait for element to be available
10
+ const startTime = Date.now();
11
+ let elementFound = false;
12
+ while (Date.now() - startTime < timeout) {
13
+ const element = await connection.send('Runtime.evaluate', {
14
+ expression: `document.querySelector('${selector}')`
15
+ });
16
+ if (element.result && element.result.value && element.result.value !== null) {
17
+ elementFound = true;
18
+ break;
19
+ }
20
+ await new Promise(resolve => setTimeout(resolve, 100, undefined));
21
+ }
22
+ if (!elementFound) {
23
+ return createMCPError('ELEMENT_NOT_FOUND', `Element not found with selector: ${selector}`);
24
+ }
25
+ // Get element info for debugging
26
+ const elementInfo = await connection.send('Runtime.evaluate', {
27
+ expression: `
28
+ const element = document.querySelector('${selector}');
29
+ const getXPath = (node) => {
30
+ if (node.id) return '//*[@id=\'' + node.id + '\']';
31
+ if (node === document.body) return '/html/body';
32
+ const siblings = node.parentNode ? node.parentNode.childNodes : [];
33
+ let idx = siblings.indexOf(node);
34
+ if (idx === -1) return '';
35
+ const tagName = node.tagName || '';
36
+ const path = getXPath(node.parentNode);
37
+ return path + '/' + tagName + '[' + (idx + 1) + ']';
38
+ };
39
+ {
40
+ tagName: element.tagName,
41
+ id: element.id,
42
+ classes: Array.from(element.classList),
43
+ text: element.textContent?.trim() || '',
44
+ xpath: getXPath(element)
45
+ }
46
+ `,
47
+ returnByValue: true
48
+ });
49
+ // Check if element is clickable
50
+ const clickableCheck = await connection.send('Runtime.evaluate', {
51
+ expression: `
52
+ const element = document.querySelector('${selector}');
53
+ const rect = element.getBoundingClientRect();
54
+ const isVisible = rect.width > 0 && rect.height > 0;
55
+ const isNotHidden = window.getComputedStyle(element).visibility !== 'hidden';
56
+ const isDisplayed = window.getComputedStyle(element).display !== 'none';
57
+ isVisible && isNotHidden && isDisplayed;
58
+ `
59
+ });
60
+ if (!clickableCheck.result.value) {
61
+ return createMCPError('ELEMENT_NOT_CLICKABLE', `Element found but not clickable: ${selector}`);
62
+ }
63
+ // Perform the click using Runtime.evaluate
64
+ await connection.send('Runtime.evaluate', {
65
+ expression: `
66
+ const element = document.querySelector('${selector}');
67
+ const event = new MouseEvent('click', {
68
+ view: window,
69
+ bubbles: true,
70
+ cancelable: true,
71
+ button: ${button === 'left' ? 0 : button === 'right' ? 2 : 1},
72
+ detail: ${clickCount}
73
+ });
74
+ element.dispatchEvent(event);
75
+ `
76
+ });
77
+ // Wait a bit for any potential page changes
78
+ await new Promise(resolve => setTimeout(resolve, 500));
79
+ const result = {
80
+ elementFound: true,
81
+ elementClickable: true,
82
+ clickSuccess: true,
83
+ elementInfo: elementInfo.result.value,
84
+ timestamp: new Date().toISOString()
85
+ };
86
+ return createMCPSuccess({ message: 'Element clicked successfully', ...result });
87
+ }
88
+ catch (error) {
89
+ console.error('Click error:', error);
90
+ return createMCPError('CLICK_ERROR', `Failed to click element: ${error instanceof Error ? error.message : String(error)}`, undefined, 'Check if Chrome is running with --remote-debugging-port=9222');
91
+ }
92
+ }
93
+ //# sourceMappingURL=click.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"click.js","sourceRoot":"","sources":["../../src/handlers/click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAwB/D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAe;IAC/C,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;IAE3E,MAAM,UAAU,GAAG,oBAAoB,CAAC,WAAW,EAAE,CAAC;IAEtD,IAAI,CAAC;QACH,0CAA0C;QAC1C,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAExD,mCAAmC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBACxD,UAAU,EAAE,2BAA2B,QAAQ,IAAI;aACpD,CAAC,CAAC;YAEH,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC5E,YAAY,GAAG,IAAI,CAAC;gBACpB,MAAM;YACR,CAAC;YAED,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,cAAc,CAAC,mBAAmB,EAAE,oCAAoC,QAAQ,EAAE,CAAC,CAAC;QAC7F,CAAC;QAED,iCAAiC;QACjC,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAC5D,UAAU,EAAE;kDACgC,QAAQ;;;;;;;;;;;;;;;;;;OAkBnD;YACD,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QAEH,gCAAgC;QAChC,MAAM,cAAc,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAC/D,UAAU,EAAE;kDACgC,QAAQ;;;;;;OAMnD;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACjC,OAAO,cAAc,CAAC,uBAAuB,EAAE,oCAAoC,QAAQ,EAAE,CAAC,CAAC;QACjG,CAAC;QAED,2CAA2C;QAC3C,MAAM,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE;YACxC,UAAU,EAAE;kDACgC,QAAQ;;;;;oBAKtC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClD,UAAU;;;OAGvB;SACF,CAAC,CAAC;QAEH,4CAA4C;QAC5C,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAgB;YAC1B,YAAY,EAAE,IAAI;YAClB,gBAAgB,EAAE,IAAI;YACtB,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK;YACrC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,OAAO,gBAAgB,CAAC,EAAE,OAAO,EAAE,8BAA8B,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAElF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,cAAc,CAAC,aAAa,EAAE,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,8DAA8D,CAAC,CAAC;IACxM,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { MCPToolResponse } from '../types.js';
2
+ interface FillArgs {
3
+ selector: string;
4
+ value: string;
5
+ timeout?: number;
6
+ clearFirst?: boolean;
7
+ delay?: number;
8
+ }
9
+ export declare function handleFill(args: FillArgs): Promise<MCPToolResponse>;
10
+ export {};
@@ -0,0 +1,129 @@
1
+ import { CDPConnectionManager } from '../cdp/connectionManager.js';
2
+ import { createMCPError, createMCPSuccess } from '../types.js';
3
+ export async function handleFill(args) {
4
+ const { selector, value, timeout = 5000, clearFirst = true, delay = 100 } = args;
5
+ const cdpManager = CDPConnectionManager.getInstance();
6
+ try {
7
+ // Connect to CDP if not already connected
8
+ const connection = await cdpManager.getConnection(9222);
9
+ // Wait for element to be available
10
+ const startTime = Date.now();
11
+ let elementFound = false;
12
+ while (Date.now() - startTime < timeout) {
13
+ const element = await connection.send('Runtime.evaluate', {
14
+ expression: `document.querySelector('${selector}')`
15
+ });
16
+ if (element.result && element.result.value && element.result.value !== null) {
17
+ elementFound = true;
18
+ break;
19
+ }
20
+ await new Promise(resolve => setTimeout(resolve, 100, undefined));
21
+ }
22
+ if (!elementFound) {
23
+ return createMCPError('ELEMENT_NOT_FOUND', `Element not found with selector: ${selector}`);
24
+ }
25
+ // Get element info for debugging
26
+ const elementInfo = await connection.send('Runtime.evaluate', {
27
+ expression: `
28
+ const element = document.querySelector('${selector}');
29
+ {
30
+ tagName: element.tagName,
31
+ type: element.type,
32
+ id: element.id,
33
+ name: element.name,
34
+ placeholder: element.placeholder || '',
35
+ isInput: element.tagName === 'INPUT' || element.tagName === 'TEXTAREA' || element.tagName === 'SELECT'
36
+ }
37
+ `,
38
+ returnByValue: true
39
+ });
40
+ const elementInfoData = elementInfo.result.value;
41
+ // Check if element is an input field
42
+ if (!elementInfoData.isInput) {
43
+ return createMCPError('ELEMENT_NOT_INPUT', `Element is not an input field: ${selector}`);
44
+ }
45
+ // Clear the field first if requested
46
+ if (clearFirst) {
47
+ await connection.send('Runtime.evaluate', {
48
+ expression: `
49
+ const element = document.querySelector('${selector}');
50
+ if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA') {
51
+ element.value = '';
52
+ } else if (element.tagName === 'SELECT') {
53
+ for (let i = 0; i < element.options.length; i++) {
54
+ element.options[i].selected = false;
55
+ }
56
+ }
57
+ `
58
+ });
59
+ }
60
+ // Set the value based on input type
61
+ if (elementInfoData.tagName === 'INPUT' || elementInfoData.tagName === 'TEXTAREA') {
62
+ await connection.send('Runtime.evaluate', {
63
+ expression: `
64
+ const element = document.querySelector('${selector}');
65
+ element.value = '${value.replace(/'/g, "\\'")}';
66
+ // Trigger input events to ensure React/Vue reactivity
67
+ element.dispatchEvent(new Event('input', { bubbles: true }));
68
+ element.dispatchEvent(new Event('change', { bubbles: true }));
69
+ `
70
+ });
71
+ }
72
+ else if (elementInfoData.tagName === 'SELECT') {
73
+ // Find option by value or text
74
+ await connection.send('Runtime.evaluate', {
75
+ expression: `
76
+ const element = document.querySelector('${selector}');
77
+ const options = element.options;
78
+ let found = false;
79
+ for (let i = 0; i < options.length; i++) {
80
+ if (options[i].value === '${value}' || options[i].textContent === '${value}') {
81
+ options[i].selected = true;
82
+ found = true;
83
+ break;
84
+ }
85
+ }
86
+ if (found) {
87
+ element.dispatchEvent(new Event('change', { bubbles: true }));
88
+ }
89
+ `
90
+ });
91
+ }
92
+ // Add delay if specified
93
+ if (delay > 0) {
94
+ await new Promise(resolve => setTimeout(resolve, delay));
95
+ }
96
+ // Verify the value was set
97
+ const verifyResult = await connection.send('Runtime.evaluate', {
98
+ expression: `
99
+ const element = document.querySelector('${selector}');
100
+ if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA') {
101
+ return element.value;
102
+ } else if (element.tagName === 'SELECT') {
103
+ const selected = element.options[element.selectedIndex];
104
+ return selected ? selected.value || selected.textContent : '';
105
+ }
106
+ return '';
107
+ `
108
+ });
109
+ const actualValue = verifyResult.result.value;
110
+ const valueSetCorrectly = actualValue === value;
111
+ const result = {
112
+ elementFound: true,
113
+ elementInputType: true,
114
+ fillSuccess: valueSetCorrectly,
115
+ elementInfo: elementInfoData,
116
+ timestamp: new Date().toISOString()
117
+ };
118
+ if (!valueSetCorrectly) {
119
+ result.fillSuccess = false;
120
+ return createMCPError('VALUE_SET_FAILED', `Value set but verification failed. Expected: ${value}, Actual: ${actualValue}`);
121
+ }
122
+ return createMCPSuccess({ message: 'Field filled successfully', ...result });
123
+ }
124
+ catch (error) {
125
+ console.error('Fill error:', error);
126
+ return createMCPError('FILL_ERROR', `Failed to fill field: ${error instanceof Error ? error.message : String(error)}`, undefined, 'Check if Chrome is running with --remote-debugging-port=9222');
127
+ }
128
+ }
129
+ //# sourceMappingURL=fill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fill.js","sourceRoot":"","sources":["../../src/handlers/fill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { MCPToolResponse } from '../types.js';
2
+ interface InspectArgs {
3
+ selector: string;
4
+ timeout?: number;
5
+ includeStyles?: boolean;
6
+ includeAttributes?: boolean;
7
+ includeChildren?: boolean;
8
+ maxDepth?: number;
9
+ }
10
+ export declare function handleInspect(args: InspectArgs): Promise<MCPToolResponse>;
11
+ export {};
@@ -0,0 +1,138 @@
1
+ import { CDPConnectionManager } from '../cdp/connectionManager.js';
2
+ import { createMCPError, createMCPSuccess } from '../types.js';
3
+ export async function handleInspect(args) {
4
+ const { selector, timeout = 5000, includeStyles = true, includeAttributes = true, includeChildren = false, maxDepth = 2 } = args;
5
+ const cdpManager = CDPConnectionManager.getInstance();
6
+ try {
7
+ // Connect to CDP if not already connected
8
+ const connection = await cdpManager.getConnection(9222);
9
+ // Wait for element to be available
10
+ const startTime = Date.now();
11
+ let elementFound = false;
12
+ while (Date.now() - startTime < timeout) {
13
+ const element = await connection.send('Runtime.evaluate', {
14
+ expression: `document.querySelector('${selector}')`
15
+ });
16
+ if (element.result && element.result.value && element.result.value !== null) {
17
+ elementFound = true;
18
+ break;
19
+ }
20
+ await new Promise(resolve => setTimeout(resolve, 100, undefined));
21
+ }
22
+ if (!elementFound) {
23
+ return createMCPError('ELEMENT_NOT_FOUND', `Element not found with selector: ${selector}`);
24
+ }
25
+ // Get comprehensive element information
26
+ const elementInfo = await connection.send('Runtime.evaluate', {
27
+ expression: `
28
+ const element = document.querySelector('${selector}');
29
+ const getStyles = (el) => {
30
+ const computed = window.getComputedStyle(el);
31
+ const styles = {};
32
+ for (let i = 0; i < computed.length; i++) {
33
+ const prop = computed[i];
34
+ styles[prop] = computed.getPropertyValue(prop);
35
+ }
36
+ return styles;
37
+ };
38
+
39
+ const getAttributes = (el) => {
40
+ const attrs = {};
41
+ for (let i = 0; i < el.attributes.length; i++) {
42
+ const attr = el.attributes[i];
43
+ attrs[attr.name] = attr.value;
44
+ }
45
+ return attrs;
46
+ };
47
+
48
+ const getChildren = (el, depth, maxDepth) => {
49
+ if (depth >= maxDepth) return [];
50
+ const children = [];
51
+ for (let i = 0; i < el.children.length; i++) {
52
+ const child = el.children[i];
53
+ children.push({
54
+ tagName: child.tagName,
55
+ id: child.id,
56
+ classes: Array.from(child.classList),
57
+ text: child.textContent?.trim() || '',
58
+ value: child.value,
59
+ type: child.type,
60
+ name: child.name,
61
+ boundingRect: child.getBoundingClientRect(),
62
+ children: getChildren(child, depth + 1, maxDepth)
63
+ });
64
+ }
65
+ return children;
66
+ };
67
+
68
+ const getXPath = (node) => {
69
+ if (node.id) return '//*[@id=\'' + node.id + '\']';
70
+ if (node === document.body) return '/html/body';
71
+ const siblings = node.parentNode ? node.parentNode.childNodes : [];
72
+ let idx = siblings.indexOf(node);
73
+ if (idx === -1) return '';
74
+ const tagName = node.tagName || '';
75
+ const path = getXPath(node.parentNode);
76
+ return path + '/' + tagName + '[' + (idx + 1) + ']';
77
+ };
78
+
79
+ const getCssPath = (node) => {
80
+ if (node.id) return '#' + node.id;
81
+ if (node.className) {
82
+ const classes = node.className.split(' ').join('.');
83
+ return node.tagName.toLowerCase() + '.' + classes;
84
+ }
85
+ const siblings = node.parentNode ? node.parentNode.children : [];
86
+ let idx = Array.from(siblings).indexOf(node);
87
+ if (idx === -1) return node.tagName.toLowerCase();
88
+ return node.tagName.toLowerCase() + ':nth-child(' + (idx + 1) + ')';
89
+ };
90
+
91
+ const rect = element.getBoundingClientRect();
92
+
93
+ {
94
+ tagName: element.tagName,
95
+ id: element.id,
96
+ classes: Array.from(element.classList),
97
+ text: element.textContent?.trim() || '',
98
+ value: element.value,
99
+ type: element.type,
100
+ name: element.name,
101
+ placeholder: element.placeholder || '',
102
+ src: element.src,
103
+ href: element.href,
104
+ disabled: element.disabled,
105
+ readonly: element.readOnly,
106
+ required: element.required,
107
+ checked: element.checked,
108
+ selected: element.selected,
109
+ visible: rect.width > 0 && rect.height > 0,
110
+ boundingRect: {
111
+ x: rect.left,
112
+ y: rect.top,
113
+ width: rect.width,
114
+ height: rect.height
115
+ },
116
+ ${includeStyles ? 'styles: getStyles(element),' : ''}
117
+ ${includeAttributes ? 'attributes: getAttributes(element),' : ''}
118
+ ${includeChildren ? 'children: getChildren(element, 0, ${maxDepth}),' : ''}
119
+ xpath: getXPath(element),
120
+ cssPath: getCssPath(element)
121
+ }
122
+ `,
123
+ returnByValue: true
124
+ });
125
+ const elementInfoData = elementInfo.result.value;
126
+ const result = {
127
+ elementFound: true,
128
+ elementInfo: elementInfoData,
129
+ timestamp: new Date().toISOString()
130
+ };
131
+ return createMCPSuccess({ message: 'Element inspection completed successfully', ...result });
132
+ }
133
+ catch (error) {
134
+ console.error('Element inspection error:', error);
135
+ return createMCPError('INSPECTION_ERROR', `Failed to inspect element: ${error instanceof Error ? error.message : String(error)}`, undefined, 'Check if Chrome is running with --remote-debugging-port=9222');
136
+ }
137
+ }
138
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/handlers/inspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAgD/D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAiB;IACnD,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,IAAI,EAAE,iBAAiB,GAAG,IAAI,EAAE,eAAe,GAAG,KAAK,EAAE,QAAQ,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;IAEjI,MAAM,UAAU,GAAG,oBAAoB,CAAC,WAAW,EAAE,CAAC;IAEtD,IAAI,CAAC;QACH,0CAA0C;QAC1C,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAExD,mCAAmC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBACxD,UAAU,EAAE,2BAA2B,QAAQ,IAAI;aACpD,CAAC,CAAC;YAEH,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC5E,YAAY,GAAG,IAAI,CAAC;gBACpB,MAAM;YACR,CAAC;YAED,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,cAAc,CAAC,mBAAmB,EAAE,oCAAoC,QAAQ,EAAE,CAAC,CAAC;QAC7F,CAAC;QAED,wCAAwC;QACxC,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAC5D,UAAU,EAAE;kDACgC,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAwF9C,aAAa,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE;YAClD,iBAAiB,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,EAAE;YAC9D,eAAe,CAAC,CAAC,CAAC,iDAAiD,CAAC,CAAC,CAAC,EAAE;;;;OAI7E;YACD,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;QAEjD,MAAM,MAAM,GAAkB;YAC5B,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE,eAAe;YAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,OAAO,gBAAgB,CAAC,EAAE,OAAO,EAAE,2CAA2C,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAE/F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO,cAAc,CAAC,kBAAkB,EAAE,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,8DAA8D,CAAC,CAAC;IAC/M,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { MCPToolResponse } from '../types.js';
2
+ interface ScreenshotArgs {
3
+ selector?: string;
4
+ format?: 'png' | 'jpeg' | 'webp';
5
+ quality?: number;
6
+ fullPage?: boolean;
7
+ timeout?: number;
8
+ }
9
+ export declare function handleScreenshot(args: ScreenshotArgs): Promise<MCPToolResponse>;
10
+ export {};