openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
84 lines • 3.29 kB
JavaScript
/**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*
*/
import { zod, PredefinedNetworkConditions } from '../third_party/index.js';
import { ToolCategory } from './categories.js';
import { definePageTool, geolocationTransform, viewportTransform, } from './ToolDefinition.js';
function headerStringTransform(value) {
if (value === undefined) {
return undefined;
}
if (value === '') {
return {};
}
try {
const parsed = JSON.parse(value);
if (typeof parsed !== 'object' ||
parsed === null ||
Array.isArray(parsed)) {
throw new Error('Headers must be a JSON object');
}
return parsed;
}
catch (error) {
throw new Error(`Invalid JSON for headers: ${error instanceof Error ? error.message : String(error)}`);
}
}
const throttlingOptions = [
'Offline',
...Object.keys(PredefinedNetworkConditions),
];
export const emulate = definePageTool({
name: 'emulate',
description: `Emulates various features on the target page.`,
annotations: {
category: ToolCategory.EMULATION,
readOnlyHint: false,
},
schema: {
networkConditions: zod
.enum(throttlingOptions)
.optional()
.describe(`Throttle network. Omit to disable throttling.`),
cpuThrottlingRate: zod
.number()
.min(1)
.max(20)
.optional()
.describe('Represents the CPU slowdown factor. Omit or set the rate to 1 to disable throttling'),
geolocation: zod
.string()
.optional()
.transform(geolocationTransform)
.describe('Geolocation (`<latitude>,<longitude>`) to emulate. Latitude between -90 and 90. Longitude between -180 and 180. Omit to clear the geolocation override.'),
userAgent: zod
.string()
.optional()
.describe('User agent to emulate. Set to empty string to clear the user agent override.'),
colorScheme: zod
.enum(['dark', 'light', 'auto'])
.optional()
.describe('Emulate the dark or the light mode. Set to "auto" to reset to the default.'),
viewport: zod
.string()
.optional()
.transform(viewportTransform)
.describe(`Emulate device viewports '<width>x<height>x<devicePixelRatio>[,mobile][,touch][,landscape]'. 'touch' and 'mobile' to emulate mobile devices. 'landscape' to emulate landscape mode.`),
extraHttpHeaders: zod
.string()
.optional()
.transform(headerStringTransform)
.describe('Extra HTTP headers as a JSON string object, e.g. {"X-Custom": "value", "Authorization": "Bearer token"}. Headers are included into every HTTP request originating from the page and persist across navigations until cleared. Pass an empty string to clear all extra headers.'),
},
blockedByDialog: true,
verifyFilesSchema: {},
handler: async (request, response) => {
const page = request.page;
await page.emulate(request.params);
response.appendResponseLine('Emulation configured successfully');
},
});
//# sourceMappingURL=emulation.js.map