/**
 * @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: `List all requests for the currently selected 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.'),
    },
    handler: async (request, response, context) => {
        const data = await request.page.getDevToolsData();
        response.attachDevToolsData(data);
        const reqid = data?.cdpRequestId
            ? context.resolveCdpRequestId(request.page, 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.`,
    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.'),
    },
    handler: async (request, response, context) => {
        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
                ? context.resolveCdpRequestId(request.page, 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.`);
            }
        }
    },
});
