Files
openclaw/extensions/xai/web-search.ts
Peter Steinberger c83dcc2bc0 fix(security): harden network tool output at canonical owner boundaries (#118984)
* fix(security): bound external tool content at its canonical owner boundary

* fix(plugin-sdk): document supported security boundary and restore facade parity
2026-08-03 15:34:33 -07:00

50 lines
1.7 KiB
TypeScript

import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
// Xai plugin module implements web search behavior.
import type {
WebSearchProviderPlugin,
WebSearchProviderSetupContext,
} from "openclaw/plugin-sdk/provider-web-search-config-contract";
import { buildXaiWebSearchProviderBase } from "./web-search-provider-shared.js";
const loadXaiWebSearchProviderRuntime = createLazyRuntimeModule(
() => import("./src/web-search-provider.runtime.js"),
);
const GenericXaiSearchSchema = {
type: "object",
properties: {
query: { type: "string", description: "Search query string." },
count: {
type: "number",
description: "Number of results to return (1-10).",
minimum: 1,
maximum: 10,
},
},
additionalProperties: false,
} satisfies Record<string, unknown>;
async function runXaiSearchProviderSetup(
ctx: WebSearchProviderSetupContext,
): Promise<WebSearchProviderSetupContext["config"]> {
const runtime = await loadXaiWebSearchProviderRuntime();
return await runtime.runXaiSearchProviderSetup(ctx);
}
export function createXaiWebSearchProvider(): WebSearchProviderPlugin {
return {
...buildXaiWebSearchProviderBase(),
runSetup: runXaiSearchProviderSetup,
createTool: (ctx) => ({
description:
"Search the web using xAI Grok. Returns AI-synthesized answers with citations from real-time web search.",
parameters: GenericXaiSearchSchema,
execute: async (args, executionContext) => {
executionContext?.signal?.throwIfAborted();
const { executeXaiWebSearchProviderTool } = await loadXaiWebSearchProviderRuntime();
return await executeXaiWebSearchProviderTool(ctx, args, executionContext);
},
}),
};
}