@sudu-cli/fronted-preview-mcp 1.0.0-beta.0 → 1.0.0-beta.2

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.
@@ -0,0 +1,413 @@
1
+ import { detectFramework } from '../detectors/frameworkDetector.js';
2
+ import { startServer } from '../serverManager.js';
3
+ import CDP from 'chrome-remote-interface';
4
+ async function handlePickElement(args) {
5
+ const projectDir = args.projectDir || process.cwd();
6
+ const cdpPort = args.cdpPort || 9222;
7
+ const waitForLoadMs = args.waitForLoadMs || 3000;
8
+ let client = null;
9
+ try {
10
+ // Step 1: Detect framework and start/get dev server
11
+ const info = await detectFramework(projectDir);
12
+ if (!info.devScript) {
13
+ return {
14
+ content: [
15
+ {
16
+ type: 'text',
17
+ text: JSON.stringify({
18
+ error: 'No dev script found',
19
+ availableScripts: Object.keys(info.npmScripts),
20
+ projectDir,
21
+ }, null, 2),
22
+ },
23
+ ],
24
+ isError: true,
25
+ };
26
+ }
27
+ // Step 2: Start dev server (or reuse existing)
28
+ const port = args.customPort || info.port;
29
+ const command = `npm run ${info.devScript}`;
30
+ const status = await startServer(projectDir, command, port);
31
+ const pageUrl = status.url;
32
+ // Step 3: Connect to Chrome via CDP
33
+ const cdpOptions = { port: cdpPort };
34
+ try {
35
+ client = await CDP(cdpOptions);
36
+ }
37
+ catch (cdpErr) {
38
+ return {
39
+ content: [
40
+ {
41
+ type: 'text',
42
+ text: JSON.stringify({
43
+ error: `Failed to connect to Chrome DevTools Protocol on port ${cdpPort}. Ensure Chrome is running with --remote-debugging-port=${cdpPort}`,
44
+ details: cdpErr instanceof Error ? cdpErr.message : String(cdpErr),
45
+ pageUrl,
46
+ suggestion: 'Start Chrome with: chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug',
47
+ }, null, 2),
48
+ },
49
+ ],
50
+ isError: true,
51
+ };
52
+ }
53
+ if (!client) {
54
+ return {
55
+ content: [
56
+ {
57
+ type: 'text',
58
+ text: JSON.stringify({
59
+ error: 'Failed to create CDP client',
60
+ pageUrl,
61
+ }, null, 2),
62
+ },
63
+ ],
64
+ isError: true,
65
+ };
66
+ }
67
+ // Enable required domains
68
+ const { Page, DOM, Overlay, Runtime, CSS } = client;
69
+ await Promise.all([
70
+ Page.enable(),
71
+ DOM.enable(),
72
+ Overlay.enable(),
73
+ Runtime.enable(),
74
+ CSS.enable(),
75
+ ]);
76
+ // Step 4: Navigate to the page
77
+ await Page.navigate({ url: pageUrl });
78
+ // Wait for page load
79
+ await new Promise((resolve) => {
80
+ const timeout = setTimeout(resolve, waitForLoadMs);
81
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
82
+ const handler = (params) => {
83
+ clearTimeout(timeout);
84
+ resolve();
85
+ };
86
+ client.on('Page.loadEventFired', handler);
87
+ });
88
+ // Give a bit more time for hydration
89
+ await new Promise((resolve) => setTimeout(resolve, 1000));
90
+ let element = null;
91
+ if (args.selector) {
92
+ // Direct selector mode: find element by selector
93
+ element = await pickBySelector(client, args.selector);
94
+ }
95
+ else {
96
+ // Inspection mode: let user pick element via Overlay
97
+ element = await pickByInspection(client);
98
+ }
99
+ const report = {
100
+ pageUrl,
101
+ framework: info.framework,
102
+ port: status.port,
103
+ element,
104
+ timestamp: new Date().toISOString(),
105
+ };
106
+ return {
107
+ content: [
108
+ {
109
+ type: 'text',
110
+ text: JSON.stringify(report, null, 2),
111
+ },
112
+ ],
113
+ };
114
+ }
115
+ catch (err) {
116
+ const errorMessage = err instanceof Error ? err.message : String(err);
117
+ return {
118
+ content: [{ type: 'text', text: JSON.stringify({ error: errorMessage }, null, 2) }],
119
+ isError: true,
120
+ };
121
+ }
122
+ finally {
123
+ if (client) {
124
+ try {
125
+ await client.close();
126
+ }
127
+ catch {
128
+ // Ignore cleanup errors
129
+ }
130
+ }
131
+ }
132
+ }
133
+ // Pick element by CSS selector
134
+ async function pickBySelector(client, selector) {
135
+ const { DOM, Runtime, CSS } = client;
136
+ // Find node by selector
137
+ const document = await DOM.getDocument({ depth: -1, pierce: true });
138
+ const nodeId = await DOM.querySelector({
139
+ nodeId: document.root.nodeId,
140
+ selector,
141
+ });
142
+ if (!nodeId || nodeId.nodeId === 0) {
143
+ return null;
144
+ }
145
+ return await extractElementInfo(client, nodeId.nodeId);
146
+ }
147
+ // Pick element via Overlay inspection mode
148
+ async function pickByInspection(client) {
149
+ const { Overlay, DOM } = client;
150
+ return new Promise((resolve) => {
151
+ // Enable inspection mode with highlight
152
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
153
+ Overlay.setInspectMode({
154
+ mode: 'search',
155
+ highlightConfig: {
156
+ showInfo: true,
157
+ showStyles: true,
158
+ showRulers: true,
159
+ showExtensionLines: true,
160
+ contentColor: { r: 66, g: 133, b: 244, a: 0.66 },
161
+ paddingColor: { r: 255, g: 193, b: 7, a: 0.66 },
162
+ borderColor: { r: 66, g: 133, b: 244, a: 0.66 },
163
+ marginColor: { r: 255, g: 193, b: 7, a: 0.66 },
164
+ eventTargetColor: { r: 255, g: 193, b: 7, a: 0.66 },
165
+ shapeColor: { r: 66, g: 133, b: 244, a: 0.66 },
166
+ shapeMarginColor: { r: 255, g: 193, b: 7, a: 0.66 },
167
+ },
168
+ });
169
+ // Listen for element selection
170
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
171
+ const handler = async (params) => {
172
+ // Disable inspection mode
173
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
174
+ Overlay.setInspectMode({ mode: 'none' });
175
+ // Remove listener
176
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
177
+ client.off('Overlay.inspectNodeRequested', handler);
178
+ // Resolve node and extract info
179
+ const node = await DOM.resolveNode({ backendNodeId: params.backendNodeId });
180
+ if (node.object && node.object.objectId) {
181
+ const element = await extractElementInfoByObjectId(client, node.object.objectId);
182
+ resolve(element);
183
+ }
184
+ else {
185
+ resolve(null);
186
+ }
187
+ };
188
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
189
+ client.on('Overlay.inspectNodeRequested', handler);
190
+ // Timeout after 60 seconds
191
+ setTimeout(() => {
192
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
193
+ Overlay.setInspectMode({ mode: 'none' });
194
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
195
+ client.off('Overlay.inspectNodeRequested', handler);
196
+ resolve(null);
197
+ }, 60000);
198
+ });
199
+ }
200
+ // Extract element info from nodeId
201
+ async function extractElementInfo(client, nodeId) {
202
+ const { DOM, CSS, Runtime } = client;
203
+ // Get node details
204
+ const node = await DOM.describeNode({ nodeId, depth: 0 });
205
+ const boxModel = await DOM.getBoxModel({ nodeId }).catch(() => null);
206
+ const computedStyles = await CSS.getComputedStyleForNode({ nodeId }).catch(() => []);
207
+ const outerHTML = await DOM.getOuterHTML({ nodeId }).catch(() => ({ outerHTML: '' }));
208
+ // Get unique selector
209
+ const selector = await getUniqueSelector(client, nodeId);
210
+ // Get XPath
211
+ const xpath = await getXPath(client, nodeId);
212
+ // Get attributes
213
+ const attributes = {};
214
+ if (node.node.attributes) {
215
+ for (let i = 0; i < node.node.attributes.length; i += 2) {
216
+ attributes[node.node.attributes[i]] = node.node.attributes[i + 1];
217
+ }
218
+ }
219
+ // Try to detect React/Vue component
220
+ const componentInfo = await detectComponent(client, nodeId);
221
+ // Parse computed styles
222
+ const styles = {};
223
+ if (Array.isArray(computedStyles)) {
224
+ for (const style of computedStyles) {
225
+ if (style.name && style.value) {
226
+ styles[style.name] = style.value;
227
+ }
228
+ }
229
+ }
230
+ return {
231
+ selector,
232
+ xpath,
233
+ tagName: node.node.localName || 'unknown',
234
+ id: attributes.id,
235
+ className: attributes.class,
236
+ attributes,
237
+ computedStyles: styles,
238
+ boundingBox: boxModel ? {
239
+ x: boxModel.model.content[0],
240
+ y: boxModel.model.content[1],
241
+ width: boxModel.model.width,
242
+ height: boxModel.model.height,
243
+ } : null,
244
+ outerHTML: outerHTML.outerHTML || '',
245
+ innerText: node.node.nodeValue || '',
246
+ ...componentInfo,
247
+ };
248
+ }
249
+ // Extract element info from objectId (for inspection mode)
250
+ async function extractElementInfoByObjectId(client, objectId) {
251
+ const { DOM, CSS, Runtime } = client;
252
+ // Get nodeId from objectId
253
+ const node = await DOM.requestNode({ objectId });
254
+ const nodeId = node.nodeId;
255
+ return await extractElementInfo(client, nodeId);
256
+ }
257
+ // Generate unique CSS selector for element
258
+ async function getUniqueSelector(client, nodeId) {
259
+ const { DOM } = client;
260
+ try {
261
+ // Try to get CSS selector path
262
+ const path = await DOM.getNodeStackTraces({ nodeId }).catch(() => null);
263
+ // Fallback: build selector manually
264
+ return await buildSelector(client, nodeId);
265
+ }
266
+ catch {
267
+ return await buildSelector(client, nodeId);
268
+ }
269
+ }
270
+ // Build CSS selector by walking up the tree
271
+ async function buildSelector(client, nodeId) {
272
+ const { DOM } = client;
273
+ const parts = [];
274
+ let currentId = nodeId;
275
+ let depth = 0;
276
+ const maxDepth = 15;
277
+ while (currentId && depth < maxDepth) {
278
+ const node = await DOM.describeNode({ nodeId: currentId, depth: 0 });
279
+ const attrs = node.node.attributes || [];
280
+ let part = node.node.localName || 'unknown';
281
+ // Add ID if present
282
+ for (let i = 0; i < attrs.length; i += 2) {
283
+ if (attrs[i] === 'id') {
284
+ part += `#${attrs[i + 1]}`;
285
+ parts.unshift(part);
286
+ return parts.join(' > ');
287
+ }
288
+ }
289
+ // Add classes if present
290
+ for (let i = 0; i < attrs.length; i += 2) {
291
+ if (attrs[i] === 'class') {
292
+ const classes = attrs[i + 1].split(' ').filter(c => c && !c.startsWith('__') && !c.includes(':')).slice(0, 3);
293
+ if (classes.length > 0) {
294
+ part += `.${classes.join('.')}`;
295
+ break;
296
+ }
297
+ }
298
+ }
299
+ // Add nth-child if needed
300
+ const parent = await DOM.describeNode({ nodeId: currentId, depth: 1 });
301
+ if (parent.node.parentId) {
302
+ const siblings = await DOM.querySelectorAll({
303
+ nodeId: parent.node.parentId,
304
+ selector: part.split('.')[0],
305
+ }).catch(() => ({ nodeIds: [] }));
306
+ if (siblings.nodeIds && siblings.nodeIds.length > 1) {
307
+ const index = siblings.nodeIds.indexOf(currentId);
308
+ if (index >= 0) {
309
+ part += `:nth-child(${index + 1})`;
310
+ }
311
+ }
312
+ }
313
+ parts.unshift(part);
314
+ currentId = node.node.parentId || 0;
315
+ depth++;
316
+ }
317
+ return parts.join(' > ');
318
+ }
319
+ // Get XPath for element
320
+ async function getXPath(client, nodeId) {
321
+ const { DOM } = client;
322
+ const parts = [];
323
+ let currentId = nodeId;
324
+ let depth = 0;
325
+ const maxDepth = 15;
326
+ while (currentId && depth < maxDepth) {
327
+ const node = await DOM.describeNode({ nodeId: currentId, depth: 0 });
328
+ const tagName = node.node.localName || 'unknown';
329
+ // Check siblings for position
330
+ let position = 1;
331
+ if (node.node.parentId) {
332
+ const parent = await DOM.describeNode({ nodeId: node.node.parentId, depth: 1 });
333
+ // This is simplified - in reality would need to query siblings
334
+ }
335
+ parts.unshift(`${tagName}[${position}]`);
336
+ currentId = node.node.parentId || 0;
337
+ depth++;
338
+ }
339
+ return '/' + parts.join('/');
340
+ }
341
+ // Detect React/Vue component info
342
+ async function detectComponent(client, nodeId) {
343
+ const { Runtime, DOM } = client;
344
+ try {
345
+ // Get the fiber/instance from React DevTools or Vue DevTools
346
+ // This is a best-effort attempt using common patterns
347
+ const node = await DOM.resolveNode({ nodeId });
348
+ if (node.object && node.object.objectId) {
349
+ // Try to get React fiber
350
+ const fiberResult = await Runtime.callFunctionOn({
351
+ objectId: node.object.objectId,
352
+ functionDeclaration: `function() {
353
+ // React 18+
354
+ let fiber = this._reactRootContainer?._internalRoot?.current;
355
+ if (!fiber) {
356
+ // React 17 and earlier
357
+ for (const key of Object.keys(this)) {
358
+ if (key.startsWith('__reactFiber') || key.startsWith('__reactInternalInstance')) {
359
+ fiber = this[key];
360
+ break;
361
+ }
362
+ }
363
+ }
364
+ return fiber ? {
365
+ type: fiber.type?.name || fiber.type?.displayName || 'Unknown',
366
+ props: fiber.memoizedProps
367
+ } : null;
368
+ }`,
369
+ returnByValue: true,
370
+ }).catch(() => ({ result: { value: null } }));
371
+ if (fiberResult.result?.value?.type) {
372
+ return {
373
+ componentName: fiberResult.result.value.type,
374
+ componentProps: fiberResult.result.value.props,
375
+ };
376
+ }
377
+ // Try Vue component
378
+ const vueResult = await Runtime.callFunctionOn({
379
+ objectId: node.object.objectId,
380
+ functionDeclaration: `function() {
381
+ // Vue 3
382
+ if (this.__vueParentComponent) {
383
+ return {
384
+ type: this.__vueParentComponent.type?.name || this.__vueParentComponent.type?.displayName || 'Unknown',
385
+ props: this.__vueParentComponent.props
386
+ };
387
+ }
388
+ // Vue 2
389
+ if (this.__vue__) {
390
+ return {
391
+ type: this.__vue__.$options?.name || this.__vue__.$options?._componentTag || 'Unknown',
392
+ props: this.__vue__.$props
393
+ };
394
+ }
395
+ return null;
396
+ }`,
397
+ returnByValue: true,
398
+ }).catch(() => ({ result: { value: null } }));
399
+ if (vueResult.result?.value?.type) {
400
+ return {
401
+ componentName: vueResult.result.value.type,
402
+ componentProps: vueResult.result.value.props,
403
+ };
404
+ }
405
+ }
406
+ }
407
+ catch {
408
+ // Ignore component detection errors
409
+ }
410
+ return {};
411
+ }
412
+ export { handlePickElement };
413
+ //# sourceMappingURL=pickElement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickElement.js","sourceRoot":"","sources":["../../src/handlers/pickElement.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Client } from 'chrome-remote-interface';
2
+ import { ToolContext } from '../types.js';
3
+ export interface ScreenshotOptions {
4
+ format?: 'png' | 'jpeg' | 'webp';
5
+ quality?: number;
6
+ fullPage?: boolean;
7
+ selector?: string;
8
+ }
9
+ export interface ScreenshotResult {
10
+ success: boolean;
11
+ message?: string;
12
+ dataUrl?: string;
13
+ filePath?: string;
14
+ error?: string;
15
+ }
16
+ export declare function takeScreenshot(client: Client, options?: ScreenshotOptions): Promise<ScreenshotResult>;
17
+ export declare function handleTakeScreenshot(context: ToolContext, options?: ScreenshotOptions): Promise<ScreenshotResult>;
@@ -0,0 +1,83 @@
1
+ export async function takeScreenshot(client, options = {}) {
2
+ const { Page } = client;
3
+ const { format = 'png', quality = 80, fullPage = false, selector } = options;
4
+ try {
5
+ // If selector is provided, scroll to element first
6
+ if (selector) {
7
+ await scrollToElement(client, selector);
8
+ }
9
+ // Capture screenshot
10
+ const screenshotParams = {
11
+ format,
12
+ quality: quality > 100 ? 100 : quality < 0 ? 0 : quality
13
+ };
14
+ // If fullPage is requested, we need to capture the entire page
15
+ if (fullPage) {
16
+ screenshotParams.captureBeyondViewport = true;
17
+ }
18
+ const result = await Page.captureScreenshot(screenshotParams);
19
+ // Return data URL or save to file
20
+ if (result.data) {
21
+ return {
22
+ success: true,
23
+ dataUrl: `data:image/${format};base64,${result.data}`
24
+ };
25
+ }
26
+ else {
27
+ return {
28
+ success: false,
29
+ error: 'No screenshot data returned'
30
+ };
31
+ }
32
+ }
33
+ catch (error) {
34
+ return {
35
+ success: false,
36
+ error: error instanceof Error ? error.message : 'Unknown error taking screenshot'
37
+ };
38
+ }
39
+ }
40
+ // Helper function to scroll to element
41
+ async function scrollToElement(client, selector) {
42
+ const { DOM, Page } = client;
43
+ try {
44
+ // Find element by selector
45
+ const result = await DOM.querySelector({
46
+ selector: selector
47
+ });
48
+ if (!result.nodeId) {
49
+ throw new Error(`Element not found with selector: ${selector}`);
50
+ }
51
+ // Scroll element into view
52
+ await DOM.scrollIntoView({
53
+ nodeId: result.nodeId,
54
+ block: 'center',
55
+ inline: 'center'
56
+ });
57
+ }
58
+ catch (error) {
59
+ // If DOM operations fail, try JavaScript approach
60
+ await Page.evaluate({
61
+ expression: `
62
+ (function() {
63
+ const element = document.querySelector('${selector.replace(/'/g, "\\'")}');
64
+ if (element) {
65
+ element.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
66
+ }
67
+ })();
68
+ `
69
+ });
70
+ }
71
+ }
72
+ // MCP tool handler
73
+ export async function handleTakeScreenshot(context, options) {
74
+ const { chromeClient } = context;
75
+ if (!chromeClient) {
76
+ return {
77
+ success: false,
78
+ error: 'Chrome client not connected. Please connect to Chrome first.'
79
+ };
80
+ }
81
+ return await takeScreenshot(chromeClient, options);
82
+ }
83
+ //# sourceMappingURL=takeScreenshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"takeScreenshot.js","sourceRoot":"","sources":["../../src/handlers/takeScreenshot.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,UAA6B,EAAE;IAE/B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IACxB,MAAM,EACJ,MAAM,GAAG,KAAK,EACd,OAAO,GAAG,EAAE,EACZ,QAAQ,GAAG,KAAK,EAChB,QAAQ,EACT,GAAG,OAAO,CAAC;IAEZ,IAAI,CAAC;QACH,mDAAmD;QACnD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,qBAAqB;QACrB,MAAM,gBAAgB,GAAQ;YAC5B,MAAM;YACN,OAAO,EAAE,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;SACzD,CAAC;QAEF,+DAA+D;QAC/D,IAAI,QAAQ,EAAE,CAAC;YACb,gBAAgB,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAChD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;QAE9D,kCAAkC;QAClC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,cAAc,MAAM,WAAW,MAAM,CAAC,IAAI,EAAE;aACtD,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,6BAA6B;aACrC,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC;SAClF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,uCAAuC;AACvC,KAAK,UAAU,eAAe,CAAC,MAAc,EAAE,QAAgB;IAC7D,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAE7B,IAAI,CAAC;QACH,2BAA2B;QAC3B,MAAM,MAAM,GAAG,MAAO,GAAW,CAAC,aAAa,CAAC;YAC9C,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,2BAA2B;QAC3B,MAAO,GAAW,CAAC,cAAc,CAAC;YAChC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kDAAkD;QAClD,MAAO,IAAY,CAAC,QAAQ,CAAC;YAC3B,UAAU,EAAE;;oDAEkC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;;;;;OAK1E;SACF,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,mBAAmB;AACnB,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAoB,EACpB,OAA2B;IAE3B,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAEjC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,8DAA8D;SACtE,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { MCPToolResponse } from '../types.js';
2
+ interface GetTypeScriptDiagnosticsArgs {
3
+ projectDir?: string;
4
+ tsConfigPath?: string;
5
+ files?: string[];
6
+ includeWarnings?: boolean;
7
+ }
8
+ declare function handleGetTypeScriptDiagnostics(args: GetTypeScriptDiagnosticsArgs): Promise<MCPToolResponse>;
9
+ export { handleGetTypeScriptDiagnostics };