openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
124 lines (123 loc) • 5.57 kB
JavaScript
import { b as readStringParam, g as readPositiveIntegerParam, l as jsonResult, m as readNonNegativeIntegerParam, v as readStringArrayParam } from "../../common-C4yy9V-D.js";
import { o as optionalStringEnum } from "../../typebox-DCO1JbMn.js";
import { t as definePluginEntry } from "../../plugin-entry-C7DUzV0e.js";
import "../../channel-actions-BOfvC-Gl.js";
import "../../provider-web-search-9G87vZMY.js";
import { i as runFirecrawlSearch, r as runFirecrawlScrape } from "../../firecrawl-client-Dj3JHV0L.js";
import { t as createFirecrawlWebFetchProvider } from "../../firecrawl-fetch-provider-ncsAOBVQ.js";
import { t as createFirecrawlWebSearchProvider } from "../../firecrawl-search-provider-BfiXmvB6.js";
import { Type } from "typebox";
//#region extensions/firecrawl/src/firecrawl-scrape-tool.ts
const FirecrawlScrapeToolSchema = Type.Object({
url: Type.String({ description: "HTTP or HTTPS URL to scrape via Firecrawl." }),
extractMode: optionalStringEnum(["markdown", "text"], { description: "Extraction mode (\"markdown\" or \"text\"). Default: markdown." }),
maxChars: Type.Optional(Type.Integer({
description: "Maximum characters to return.",
minimum: 100
})),
onlyMainContent: Type.Optional(Type.Boolean({ description: "Keep only main content when Firecrawl supports it." })),
maxAgeMs: Type.Optional(Type.Integer({
description: "Maximum Firecrawl cache age in milliseconds.",
minimum: 0
})),
proxy: optionalStringEnum([
"auto",
"basic",
"stealth"
], { description: "Firecrawl proxy mode (\"auto\", \"basic\", or \"stealth\")." }),
storeInCache: Type.Optional(Type.Boolean({ description: "Whether Firecrawl should store the scrape in its cache." })),
timeoutSeconds: Type.Optional(Type.Integer({
description: "Timeout in seconds for the Firecrawl scrape request.",
minimum: 1
}))
}, { additionalProperties: false });
function createFirecrawlScrapeTool(api) {
return {
name: "firecrawl_scrape",
label: "Firecrawl Scrape",
description: "Scrape a page using Firecrawl v2/scrape. Useful for JS-heavy or bot-protected pages where plain web_fetch is weak.",
parameters: FirecrawlScrapeToolSchema,
execute: async (_toolCallId, rawParams) => {
const url = readStringParam(rawParams, "url", { required: true });
const extractMode = readStringParam(rawParams, "extractMode") === "text" ? "text" : "markdown";
const maxChars = readPositiveIntegerParam(rawParams, "maxChars");
const maxAgeMs = readNonNegativeIntegerParam(rawParams, "maxAgeMs");
const timeoutSeconds = readPositiveIntegerParam(rawParams, "timeoutSeconds");
const proxyRaw = readStringParam(rawParams, "proxy");
const proxy = proxyRaw === "basic" || proxyRaw === "stealth" || proxyRaw === "auto" ? proxyRaw : void 0;
const onlyMainContent = typeof rawParams.onlyMainContent === "boolean" ? rawParams.onlyMainContent : void 0;
const storeInCache = typeof rawParams.storeInCache === "boolean" ? rawParams.storeInCache : void 0;
return jsonResult(await runFirecrawlScrape({
cfg: api.config,
url,
extractMode,
maxChars,
onlyMainContent,
maxAgeMs,
proxy,
storeInCache,
timeoutSeconds
}));
}
};
}
//#endregion
//#region extensions/firecrawl/src/firecrawl-search-tool.ts
const FirecrawlSearchToolSchema = Type.Object({
query: Type.String({ description: "Search query string." }),
count: Type.Optional(Type.Integer({
description: "Number of results to return (1-10).",
minimum: 1,
maximum: 10
})),
sources: Type.Optional(Type.Array(Type.String(), { description: "Optional sources list, for example [\"web\"], [\"news\"], or [\"images\"]." })),
categories: Type.Optional(Type.Array(Type.String(), { description: "Optional Firecrawl categories, for example [\"github\"] or [\"research\"]." })),
scrapeResults: Type.Optional(Type.Boolean({ description: "Include scraped result content when Firecrawl returns it." })),
timeoutSeconds: Type.Optional(Type.Integer({
description: "Timeout in seconds for the Firecrawl Search request.",
minimum: 1
}))
}, { additionalProperties: false });
function createFirecrawlSearchTool(api) {
return {
name: "firecrawl_search",
label: "Firecrawl Search",
description: "Search the web using Firecrawl v2/search. Can optionally include scraped content from result pages.",
parameters: FirecrawlSearchToolSchema,
execute: async (_toolCallId, rawParams) => {
const query = readStringParam(rawParams, "query", { required: true });
const count = readPositiveIntegerParam(rawParams, "count", {
max: 10,
message: "count must be an integer from 1 to 10"
});
const timeoutSeconds = readPositiveIntegerParam(rawParams, "timeoutSeconds");
const sources = readStringArrayParam(rawParams, "sources");
const categories = readStringArrayParam(rawParams, "categories");
const scrapeResults = rawParams.scrapeResults === true;
return jsonResult(await runFirecrawlSearch({
cfg: api.config,
query,
count,
timeoutSeconds,
sources,
categories,
scrapeResults
}));
}
};
}
//#endregion
//#region extensions/firecrawl/index.ts
var firecrawl_default = definePluginEntry({
id: "firecrawl",
name: "Firecrawl Plugin",
description: "Bundled Firecrawl search and scrape plugin",
register(api) {
api.registerWebFetchProvider(createFirecrawlWebFetchProvider());
api.registerWebSearchProvider(createFirecrawlWebSearchProvider());
api.registerTool(createFirecrawlSearchTool(api));
api.registerTool(createFirecrawlScrapeTool(api));
}
});
//#endregion
export { firecrawl_default as default };