@openclaw/firecrawl-plugin 2026.11.1 → 2026.11.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,5 @@
1
1
  import { resolveSiteName } from "openclaw/plugin-sdk/provider-web-search";
2
+ import { hash } from "node:crypto";
2
3
  import { asNonNegativeFiniteNumber, asPositiveFiniteNumber, parseDateStringTimestampMs, parseFiniteNumber, resolveIntegerOption } from "openclaw/plugin-sdk/number-runtime";
3
4
  import { ProviderHttpError, readProviderJsonObjectResponse } from "openclaw/plugin-sdk/provider-http";
4
5
  import { DEFAULT_CACHE_TTL_MINUTES, markdownToText, normalizeCacheKey, readCache, readResponseText, resolveCacheTtlMs, resolvePositiveTimeoutSeconds, withSelfHostedWebToolsEndpoint, withStrictWebToolsEndpoint, writeCache } from "openclaw/plugin-sdk/provider-web-fetch";
@@ -7,7 +8,7 @@ import { truncateSanitizedExternalContent, wrapExternalContent, wrapWebContent }
7
8
  import { SsrFBlockedError, isBlockedHostnameOrIp, isPrivateIpAddress, resolvePinnedHostnameWithPolicy } from "openclaw/plugin-sdk/ssrf-runtime";
8
9
  import { asBoolean, asOptionalObjectRecord, asOptionalRecord, asRecord, normalizeOptionalString, readStringField } from "openclaw/plugin-sdk/string-coerce-runtime";
9
10
  import { resolveReadOnlyEnvSecretRef } from "openclaw/plugin-sdk/secret-ref-readonly";
10
- // \0rolldown/runtime.js
11
+ //#region \0rolldown/runtime.js
11
12
  var __defProp = Object.defineProperty;
12
13
  var __exportAll = (all, no_symbols) => {
13
14
  let target = {};
@@ -39,29 +40,19 @@ function resolveConfiguredSecret(value, path, cfg) {
39
40
  normalizeValue: normalizeSecretInput
40
41
  });
41
42
  }
42
- function resolveFirecrawlApiKey(cfg) {
43
- const pluginConfig = cfg?.plugins?.entries?.firecrawl?.config;
44
- const search = resolveFirecrawlSearchConfig(cfg);
45
- const configuredCandidates = [{
46
- value: pluginConfig?.webFetch?.apiKey,
47
- path: "plugins.entries.firecrawl.config.webFetch.apiKey"
48
- }, {
49
- value: search?.apiKey,
50
- path: "plugins.entries.firecrawl.config.webSearch.apiKey"
51
- }];
52
- let blockedConfiguredSecret = false;
53
- for (const candidate of configuredCandidates) {
54
- const resolved = resolveConfiguredSecret(candidate.value, candidate.path, cfg);
55
- if (resolved.status === "available") return resolved.value;
56
- if (resolved.status === "blocked") blockedConfiguredSecret = true;
57
- }
58
- if (blockedConfiguredSecret) return;
59
- return normalizeSecretInput(process.env[FIRECRAWL_API_KEY_ENV_VAR]) || void 0;
60
- }
61
- function resolveFirecrawlBaseUrl(cfg) {
62
- const search = resolveFirecrawlSearchConfig(cfg);
63
- const fetch = resolveFirecrawlFetchConfig(cfg);
64
- return normalizeOptionalString(search?.baseUrl) || normalizeOptionalString(fetch?.baseUrl) || normalizeSecretInput(process.env.FIRECRAWL_BASE_URL) || "https://api.firecrawl.dev";
43
+ function resolveFirecrawlConnection(cfg, scope) {
44
+ const scopes = {
45
+ webSearch: resolveFirecrawlSearchConfig(cfg),
46
+ webFetch: resolveFirecrawlFetchConfig(cfg)
47
+ };
48
+ const primary = scopes[scope];
49
+ const selectedScope = primary?.apiKey === void 0 && !normalizeOptionalString(primary?.baseUrl) ? scope === "webSearch" ? "webFetch" : "webSearch" : scope;
50
+ const connection = scopes[selectedScope];
51
+ const resolved = resolveConfiguredSecret(connection?.apiKey, `plugins.entries.firecrawl.config.${selectedScope}.apiKey`, cfg);
52
+ return {
53
+ apiKey: resolved.status === "available" ? resolved.value : resolved.status === "blocked" ? void 0 : normalizeSecretInput(process.env[FIRECRAWL_API_KEY_ENV_VAR]) || void 0,
54
+ baseUrl: normalizeOptionalString(connection?.baseUrl) || normalizeSecretInput(process.env.FIRECRAWL_BASE_URL) || "https://api.firecrawl.dev"
55
+ };
65
56
  }
66
57
  function resolveFirecrawlOnlyMainContent(cfg, override) {
67
58
  return asBoolean(override) ?? asBoolean(resolveFirecrawlFetchConfig(cfg)?.onlyMainContent) ?? true;
@@ -76,7 +67,8 @@ function resolveFirecrawlScrapeTimeoutSeconds(cfg, override) {
76
67
  function resolveFirecrawlSearchTimeoutSeconds(override) {
77
68
  return resolvePositiveTimeoutSeconds(override, DEFAULT_FIRECRAWL_SEARCH_TIMEOUT_SECONDS);
78
69
  }
79
- // extensions/firecrawl/src/firecrawl-client.ts
70
+ //#endregion
71
+ //#region extensions/firecrawl/src/firecrawl-client.ts
80
72
  var firecrawl_client_exports = /* @__PURE__ */ __exportAll({
81
73
  assertFirecrawlScrapeTargetAllowed: () => assertFirecrawlScrapeTargetAllowed,
82
74
  parseFirecrawlScrapePayload: () => parseFirecrawlScrapePayload,
@@ -239,7 +231,8 @@ async function runFirecrawlSearch(params) {
239
231
  params.signal?.throwIfAborted();
240
232
  const keyless = params.access === "keyless";
241
233
  const providerId = keyless ? "firecrawl-free" : "firecrawl";
242
- const apiKey = keyless ? void 0 : resolveFirecrawlApiKey(params.cfg);
234
+ const connection = resolveFirecrawlConnection(params.cfg, "webSearch");
235
+ const apiKey = keyless ? void 0 : connection.apiKey;
243
236
  if (!apiKey && !keyless) throw new Error("web_search (firecrawl) needs a Firecrawl API key. Set FIRECRAWL_API_KEY in the Gateway environment, or configure plugins.entries.firecrawl.config.webSearch.apiKey.");
244
237
  const count = resolveIntegerOption(params.count, DEFAULT_SEARCH_COUNT, {
245
238
  min: 1,
@@ -255,10 +248,11 @@ async function runFirecrawlSearch(params) {
255
248
  const tbs = normalizeOptionalString(params.tbs);
256
249
  const location = normalizeOptionalString(params.location);
257
250
  const country = normalizeOptionalString(params.country);
258
- const baseUrl = resolveFirecrawlBaseUrl(params.cfg);
251
+ const baseUrl = connection.baseUrl;
259
252
  const cacheKey = normalizeCacheKey(JSON.stringify({
260
253
  type: "firecrawl-search",
261
254
  provider: providerId,
255
+ credential: apiKey ? hash("sha256", apiKey, "hex") : void 0,
262
256
  q: params.query,
263
257
  count,
264
258
  baseUrl,
@@ -391,9 +385,8 @@ function parseFirecrawlScrapePayload(params) {
391
385
  async function runFirecrawlScrape(params) {
392
386
  params.signal?.throwIfAborted();
393
387
  assertFirecrawlScrapeTargetAllowed(params.url);
394
- const apiKey = resolveFirecrawlApiKey(params.cfg);
388
+ const { apiKey, baseUrl } = resolveFirecrawlConnection(params.cfg, "webFetch");
395
389
  if (!apiKey && params.access !== "keyless") throw new Error("firecrawl_scrape needs a Firecrawl API key. Set FIRECRAWL_API_KEY in the Gateway environment, or configure plugins.entries.firecrawl.config.webFetch.apiKey.");
396
- const baseUrl = resolveFirecrawlBaseUrl(params.cfg);
397
390
  const timeoutSeconds = resolveFirecrawlScrapeTimeoutSeconds(params.cfg, params.timeoutSeconds);
398
391
  const onlyMainContent = resolveFirecrawlOnlyMainContent(params.cfg, params.onlyMainContent);
399
392
  const maxAgeMs = resolveFirecrawlMaxAgeMs(params.cfg, params.maxAgeMs);
@@ -437,4 +430,5 @@ const testing = {
437
430
  resolveEndpoint,
438
431
  resolveSearchItems
439
432
  };
433
+ //#endregion
440
434
  export { runFirecrawlScrape as n, runFirecrawlSearch as r, firecrawl_client_exports as t };
@@ -1,7 +1,7 @@
1
1
  import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
2
2
  import { readPositiveIntegerParam } from "openclaw/plugin-sdk/param-readers";
3
3
  import { enablePluginInConfig } from "openclaw/plugin-sdk/provider-web-fetch-contract";
4
- // extensions/firecrawl/src/firecrawl-fetch-provider-shared.ts
4
+ //#region extensions/firecrawl/src/firecrawl-fetch-provider-shared.ts
5
5
  function ensureRecord(target, key) {
6
6
  const current = target[key];
7
7
  if (current && typeof current === "object" && !Array.isArray(current)) return current;
@@ -49,8 +49,9 @@ const FIRECRAWL_WEB_FETCH_PROVIDER_SHARED = {
49
49
  webFetch.apiKey = value;
50
50
  }
51
51
  };
52
- // extensions/firecrawl/src/firecrawl-fetch-provider.ts
53
- const loadFirecrawlClientModule = createLazyRuntimeModule(() => import("./firecrawl-client-Dk_bi5M_.mjs").then((n) => n.t));
52
+ //#endregion
53
+ //#region extensions/firecrawl/src/firecrawl-fetch-provider.ts
54
+ const loadFirecrawlClientModule = createLazyRuntimeModule(() => import("./firecrawl-client--j4MjwgU.mjs").then((n) => n.t));
54
55
  function createFirecrawlWebFetchProvider() {
55
56
  return {
56
57
  ...FIRECRAWL_WEB_FETCH_PROVIDER_SHARED,
@@ -80,4 +81,5 @@ function createFirecrawlWebFetchProvider() {
80
81
  })
81
82
  };
82
83
  }
84
+ //#endregion
83
85
  export { createFirecrawlWebFetchProvider as t };
@@ -2,9 +2,9 @@ import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
2
2
  import { readPositiveIntegerParam } from "openclaw/plugin-sdk/param-readers";
3
3
  import { asOptionalRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
4
4
  import { createWebSearchProviderContractFields, enablePluginInConfig } from "openclaw/plugin-sdk/provider-web-search-contract";
5
- // extensions/firecrawl/src/firecrawl-search-provider.ts
5
+ //#region extensions/firecrawl/src/firecrawl-search-provider.ts
6
6
  const FIRECRAWL_CREDENTIAL_PATH = "plugins.entries.firecrawl.config.webSearch.apiKey";
7
- const loadFirecrawlClientModule = createLazyRuntimeModule(() => import("./firecrawl-client-Dk_bi5M_.mjs").then((n) => n.t));
7
+ const loadFirecrawlClientModule = createLazyRuntimeModule(() => import("./firecrawl-client--j4MjwgU.mjs").then((n) => n.t));
8
8
  const GenericFirecrawlSearchSchema = {
9
9
  type: "object",
10
10
  properties: {
@@ -106,4 +106,5 @@ function createFirecrawlWebSearchProvider() {
106
106
  function createFirecrawlFreeWebSearchProvider() {
107
107
  return createFirecrawlSearchProvider(true);
108
108
  }
109
+ //#endregion
109
110
  export { createFirecrawlWebSearchProvider as n, createFirecrawlFreeWebSearchProvider as t };
package/dist/api.js CHANGED
@@ -1,5 +1,5 @@
1
- import { n as runFirecrawlScrape } from "./.setup/firecrawl-client-Dk_bi5M_.mjs";
2
- // extensions/firecrawl/api.ts
1
+ import { n as runFirecrawlScrape } from "./.setup/firecrawl-client--j4MjwgU.mjs";
2
+ //#region extensions/firecrawl/api.ts
3
3
  async function fetchFirecrawlContent(params) {
4
4
  const cfg = { plugins: { entries: { firecrawl: {
5
5
  enabled: true,
@@ -30,4 +30,5 @@ async function fetchFirecrawlContent(params) {
30
30
  warning: result.warning
31
31
  };
32
32
  }
33
+ //#endregion
33
34
  export { fetchFirecrawlContent };
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
- import { n as runFirecrawlScrape, r as runFirecrawlSearch } from "./.setup/firecrawl-client-Dk_bi5M_.mjs";
2
- import { t as createFirecrawlWebFetchProvider } from "./.setup/firecrawl-fetch-provider-EP1XFhDE.mjs";
3
- import { n as createFirecrawlWebSearchProvider, t as createFirecrawlFreeWebSearchProvider } from "./.setup/firecrawl-search-provider-Dg-_xx_m.mjs";
1
+ import { n as runFirecrawlScrape, r as runFirecrawlSearch } from "./.setup/firecrawl-client--j4MjwgU.mjs";
2
+ import { t as createFirecrawlWebFetchProvider } from "./.setup/firecrawl-fetch-provider-Br32KRpR.mjs";
3
+ import { n as createFirecrawlWebSearchProvider, t as createFirecrawlFreeWebSearchProvider } from "./.setup/firecrawl-search-provider-D_gyroLO.mjs";
4
4
  import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
5
5
  import { optionalStringEnum } from "openclaw/plugin-sdk/channel-actions";
6
6
  import { jsonResult, readNonNegativeIntegerParam, readPositiveIntegerParam, readStringArrayParam, readStringParam } from "openclaw/plugin-sdk/provider-web-search";
7
7
  import { Type } from "typebox";
8
- // extensions/firecrawl/src/firecrawl-scrape-tool.ts
8
+ //#region extensions/firecrawl/src/firecrawl-scrape-tool.ts
9
9
  const FirecrawlScrapeToolSchema = Type.Object({
10
10
  url: Type.String({ description: "HTTP or HTTPS URL to scrape via Firecrawl." }),
11
11
  extractMode: optionalStringEnum(["markdown", "text"], { description: "Extraction mode (\"markdown\" or \"text\"). Default: markdown." }),
@@ -62,7 +62,8 @@ function createFirecrawlScrapeTool(api) {
62
62
  }
63
63
  };
64
64
  }
65
- // extensions/firecrawl/src/firecrawl-search-tool.ts
65
+ //#endregion
66
+ //#region extensions/firecrawl/src/firecrawl-search-tool.ts
66
67
  const FirecrawlSearchToolSchema = Type.Object({
67
68
  query: Type.String({ description: "Search query string." }),
68
69
  count: Type.Optional(Type.Integer({
@@ -113,7 +114,8 @@ function createFirecrawlSearchTool(api) {
113
114
  }
114
115
  };
115
116
  }
116
- // extensions/firecrawl/index.ts
117
+ //#endregion
118
+ //#region extensions/firecrawl/index.ts
117
119
  var firecrawl_default = definePluginEntry({
118
120
  id: "firecrawl",
119
121
  name: "Firecrawl Plugin",
@@ -126,4 +128,5 @@ var firecrawl_default = definePluginEntry({
126
128
  api.registerTool(createFirecrawlScrapeTool(api));
127
129
  }
128
130
  });
131
+ //#endregion
129
132
  export { firecrawl_default as default };
@@ -1,2 +1,3 @@
1
- export { t as createFirecrawlWebFetchProvider } from "./.setup/firecrawl-fetch-provider-EP1XFhDE.mjs";
1
+ import { t as createFirecrawlWebFetchProvider } from "./.setup/firecrawl-fetch-provider-Br32KRpR.mjs";
2
2
  import "./web-fetch-provider.js";
3
+ export { createFirecrawlWebFetchProvider };
@@ -1 +1,2 @@
1
- export { t as createFirecrawlWebFetchProvider } from "./.setup/firecrawl-fetch-provider-EP1XFhDE.mjs";
1
+ import { t as createFirecrawlWebFetchProvider } from "./.setup/firecrawl-fetch-provider-Br32KRpR.mjs";
2
+ export { createFirecrawlWebFetchProvider };
@@ -1,2 +1,3 @@
1
- export { t as createFirecrawlFreeWebSearchProvider, n as createFirecrawlWebSearchProvider } from "./.setup/firecrawl-search-provider-Dg-_xx_m.mjs";
1
+ import { n as createFirecrawlWebSearchProvider, t as createFirecrawlFreeWebSearchProvider } from "./.setup/firecrawl-search-provider-D_gyroLO.mjs";
2
2
  import "./web-search-provider.js";
3
+ export { createFirecrawlFreeWebSearchProvider, createFirecrawlWebSearchProvider };
@@ -1 +1,2 @@
1
- export { t as createFirecrawlFreeWebSearchProvider, n as createFirecrawlWebSearchProvider } from "./.setup/firecrawl-search-provider-Dg-_xx_m.mjs";
1
+ import { n as createFirecrawlWebSearchProvider, t as createFirecrawlFreeWebSearchProvider } from "./.setup/firecrawl-search-provider-D_gyroLO.mjs";
2
+ export { createFirecrawlFreeWebSearchProvider, createFirecrawlWebSearchProvider };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/firecrawl-plugin",
3
- "version": "2026.11.1",
3
+ "version": "2026.11.3",
4
4
  "description": "OpenClaw Firecrawl plugin.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -21,10 +21,10 @@
21
21
  "minHostVersion": ">=2026.6.8"
22
22
  },
23
23
  "compat": {
24
- "pluginApi": ">=2026.11.1"
24
+ "pluginApi": ">=2026.11.3"
25
25
  },
26
26
  "build": {
27
- "openclawVersion": "2026.11.1",
27
+ "openclawVersion": "2026.11.3",
28
28
  "bundledDist": false
29
29
  },
30
30
  "release": {
@@ -43,7 +43,7 @@
43
43
  "assets/activity.svg"
44
44
  ],
45
45
  "peerDependencies": {
46
- "openclaw": ">=2026.11.1"
46
+ "openclaw": ">=2026.11.3"
47
47
  },
48
48
  "peerDependenciesMeta": {
49
49
  "openclaw": {
@@ -1 +0,0 @@
1
- {"version":3,"entries":[{"output":"api.js","source":"extensions/firecrawl/api.ts"},{"output":"index.js","source":"extensions/firecrawl/index.ts"},{"output":"web-fetch-contract-api.js","source":"extensions/firecrawl/web-fetch-contract-api.ts"},{"output":"web-fetch-provider.js","source":"extensions/firecrawl/web-fetch-provider.ts"},{"output":"web-search-contract-api.js","source":"extensions/firecrawl/web-search-contract-api.ts"},{"output":"web-search-provider.js","source":"extensions/firecrawl/web-search-provider.ts"}],"chunks":[{"output":".setup/firecrawl-client-Dk_bi5M_.mjs","sha256":"774b38239e4f578c2149ec27ef91f46ebf99354db4e16243e6f83209aaaed717","facadeSource":null,"sources":["extensions/firecrawl/src/config.ts","extensions/firecrawl/src/firecrawl-client.ts"]},{"output":".setup/firecrawl-fetch-provider-EP1XFhDE.mjs","sha256":"81a0a868cda6386f992e84287f96e973374877e9299337698d5f1db4a23ea537","facadeSource":null,"sources":["extensions/firecrawl/src/firecrawl-fetch-provider-shared.ts","extensions/firecrawl/src/firecrawl-fetch-provider.ts"]},{"output":".setup/firecrawl-search-provider-Dg-_xx_m.mjs","sha256":"13f6a7f2b72fa874d55f7afdb6378b76f36710c5bb52674a8b770456d2c1f4dd","facadeSource":null,"sources":["extensions/firecrawl/src/firecrawl-search-provider.ts"]},{"output":"api.js","sha256":"e28d050266697b2e5c369142ced5af70472bd93fec74a8e69897eac82f961dcc","facadeSource":"extensions/firecrawl/api.ts","sources":["extensions/firecrawl/api.ts"]},{"output":"index.js","sha256":"7391b6054e3a1882899054dac3303ff5d66cdcdf0242f0ca29949c280d6dcd31","facadeSource":"extensions/firecrawl/index.ts","sources":["extensions/firecrawl/index.ts","extensions/firecrawl/src/firecrawl-scrape-tool.ts","extensions/firecrawl/src/firecrawl-search-tool.ts"]},{"output":"web-fetch-contract-api.js","sha256":"6dd17949a8c79a884ebb5bb2003a1f970df8388242fd0f09734fd83fd577a864","facadeSource":"extensions/firecrawl/web-fetch-contract-api.ts","sources":[]},{"output":"web-fetch-provider.js","sha256":"283c5b3182c3a3f605ede1a44accdcb85f8a5409ab0356127bf7d2223d955ecf","facadeSource":"extensions/firecrawl/web-fetch-provider.ts","sources":[]},{"output":"web-search-contract-api.js","sha256":"f54c73b6596a5f879bfeb9d06f969652d4943e30d1ad7b94ec5568f6495e3e83","facadeSource":"extensions/firecrawl/web-search-contract-api.ts","sources":[]},{"output":"web-search-provider.js","sha256":"c3ad8cd2e10fe23a708f81b1b5e5b5257d17f8e59cf40e407be3812016986ce4","facadeSource":"extensions/firecrawl/web-search-provider.ts","sources":[]}],"unrenderedSources":["extensions/firecrawl/web-fetch-contract-api.ts","extensions/firecrawl/web-fetch-provider.ts","extensions/firecrawl/web-search-contract-api.ts","extensions/firecrawl/web-search-provider.ts"]}