first commit
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
import { createErrorResponse, ToolResult } from '@/common/tool-handler';
|
||||
import { BaseBrowserToolExecutor } from '../base-browser';
|
||||
import { TOOL_NAMES } from 'chrome-mcp-shared';
|
||||
import { TOOL_MESSAGE_TYPES } from '@/common/message-types';
|
||||
|
||||
const DEFAULT_NETWORK_REQUEST_TIMEOUT = 30000; // For sending a single request via content script
|
||||
|
||||
interface NetworkRequestToolParams {
|
||||
url: string; // URL is always required
|
||||
method?: string; // Defaults to GET
|
||||
headers?: Record<string, string>; // User-provided headers
|
||||
body?: any; // User-provided body
|
||||
timeout?: number; // Timeout for the network request itself
|
||||
}
|
||||
|
||||
/**
|
||||
* NetworkRequestTool - Sends network requests based on provided parameters.
|
||||
*/
|
||||
class NetworkRequestTool extends BaseBrowserToolExecutor {
|
||||
name = TOOL_NAMES.BROWSER.NETWORK_REQUEST;
|
||||
|
||||
async execute(args: NetworkRequestToolParams): Promise<ToolResult> {
|
||||
const {
|
||||
url,
|
||||
method = 'GET',
|
||||
headers = {},
|
||||
body,
|
||||
timeout = DEFAULT_NETWORK_REQUEST_TIMEOUT,
|
||||
} = args;
|
||||
|
||||
console.log(`NetworkRequestTool: Executing with options:`, args);
|
||||
|
||||
if (!url) {
|
||||
return createErrorResponse('URL parameter is required.');
|
||||
}
|
||||
|
||||
try {
|
||||
const tabs = await chrome.tabs.query({ active: true, currentWindow: true });
|
||||
if (!tabs[0]?.id) {
|
||||
return createErrorResponse('No active tab found or tab has no ID.');
|
||||
}
|
||||
const activeTabId = tabs[0].id;
|
||||
|
||||
// Ensure content script is available in the target tab
|
||||
await this.injectContentScript(activeTabId, ['inject-scripts/network-helper.js']);
|
||||
|
||||
console.log(
|
||||
`NetworkRequestTool: Sending to content script: URL=${url}, Method=${method}, Headers=${Object.keys(headers).join(',')}, BodyType=${typeof body}`,
|
||||
);
|
||||
|
||||
const resultFromContentScript = await this.sendMessageToTab(activeTabId, {
|
||||
action: TOOL_MESSAGE_TYPES.NETWORK_SEND_REQUEST,
|
||||
url: url,
|
||||
method: method,
|
||||
headers: headers,
|
||||
body: body,
|
||||
timeout: timeout,
|
||||
});
|
||||
|
||||
console.log(`NetworkRequestTool: Response from content script:`, resultFromContentScript);
|
||||
|
||||
return {
|
||||
content: [
|
||||
{
|
||||
type: 'text',
|
||||
text: JSON.stringify(resultFromContentScript),
|
||||
},
|
||||
],
|
||||
isError: !resultFromContentScript?.success,
|
||||
};
|
||||
} catch (error: any) {
|
||||
console.error('NetworkRequestTool: Error sending network request:', error);
|
||||
return createErrorResponse(
|
||||
`Error sending network request: ${error.message || String(error)}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const networkRequestTool = new NetworkRequestTool();
|
Reference in New Issue
Block a user