openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
128 lines • 4.73 kB
JavaScript
/**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import { zod } from '../third_party/index.js';
import { ToolCategory } from './categories.js';
import { definePageTool } from './ToolDefinition.js';
const FILTERABLE_RESOURCE_TYPES = [
'document',
'stylesheet',
'image',
'media',
'font',
'script',
'texttrack',
'xhr',
'fetch',
'prefetch',
'eventsource',
'websocket',
'manifest',
'signedexchange',
'ping',
'cspviolationreport',
'preflight',
'fedcm',
'other',
];
export const listNetworkRequests = definePageTool(() => ({
name: 'list_network_requests',
description: `Lists the most recent requests for the target page since the last navigation.`,
annotations: {
category: ToolCategory.NETWORK,
readOnlyHint: true,
},
schema: {
pageSize: zod
.number()
.int()
.positive()
.optional()
.describe('Maximum number of requests to return. When omitted, returns all requests.'),
pageIdx: zod
.number()
.int()
.min(0)
.optional()
.describe('Page number to return (0-based). When omitted, returns the first page.'),
resourceTypes: zod
.array(zod.enum(FILTERABLE_RESOURCE_TYPES))
.optional()
.describe('Filter requests to only return requests of the specified resource types. When omitted or empty, returns all requests.'),
includePreservedRequests: zod
.boolean()
.default(false)
.optional()
.describe('Set to true to return the preserved requests over the last 3 navigations.'),
},
blockedByDialog: false,
verifyFilesSchema: {},
handler: async (request, response) => {
const data = await request.page.getDevToolsData();
response.attachDevToolsData(data);
const reqid = data?.cdpRequestId
? request.page.resolveCdpRequestId(data.cdpRequestId)
: undefined;
response.setIncludeNetworkRequests(true, {
pageSize: request.params.pageSize,
pageIdx: request.params.pageIdx,
resourceTypes: request.params.resourceTypes,
includePreservedRequests: request.params.includePreservedRequests,
networkRequestIdInDevToolsUI: reqid,
});
},
}));
export const getNetworkRequest = definePageTool(() => ({
name: 'get_network_request',
description: `Gets a network request by an optional reqid, if omitted returns the currently selected request in the DevTools Network panel. Useful for inspecting request headers (including 'Cookie') and response headers (including 'Set-Cookie' and directives).`,
annotations: {
category: ToolCategory.NETWORK,
readOnlyHint: false,
},
schema: {
reqid: zod
.number()
.optional()
.describe('The reqid of the network request. If omitted returns the currently selected request in the DevTools Network panel.'),
requestFilePath: zod
.string()
.optional()
.describe('The absolute or relative path to a .network-request file to save the request body to. If omitted, the body is returned inline.'),
responseFilePath: zod
.string()
.optional()
.describe('The absolute or relative path to a .network-response file to save the response body to. If omitted, the body is returned inline.'),
},
blockedByDialog: true,
verifyFilesSchema: {
requestFilePath: true,
responseFilePath: true,
},
handler: async (request, response) => {
if (request.params.reqid) {
response.attachNetworkRequest(request.params.reqid, {
requestFilePath: request.params.requestFilePath,
responseFilePath: request.params.responseFilePath,
});
}
else {
const data = await request.page.getDevToolsData();
response.attachDevToolsData(data);
const reqid = data?.cdpRequestId
? request.page.resolveCdpRequestId(data.cdpRequestId)
: undefined;
if (reqid) {
response.attachNetworkRequest(reqid, {
requestFilePath: request.params.requestFilePath,
responseFilePath: request.params.responseFilePath,
});
}
else {
response.appendResponseLine(`Nothing is currently selected in the DevTools Network panel.`);
}
}
},
}));
//# sourceMappingURL=network.js.map