@openclaw/exa-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,6 +1,6 @@
1
1
  import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
2
2
  import { createWebSearchProviderContractFields } from "openclaw/plugin-sdk/provider-web-search-contract";
3
- // extensions/exa/src/exa-web-search-provider.ts
3
+ //#region extensions/exa/src/exa-web-search-provider.ts
4
4
  const EXA_CREDENTIAL_PATH = "plugins.entries.exa.config.webSearch.apiKey";
5
5
  const EXA_SEARCH_TYPES = [
6
6
  "auto",
@@ -17,7 +17,7 @@ const EXA_FRESHNESS_VALUES = [
17
17
  "year"
18
18
  ];
19
19
  const EXA_MAX_SEARCH_COUNT = 100;
20
- const loadExaWebSearchRuntime = createLazyRuntimeModule(() => import("./exa-web-search-provider.runtime-Dw_U6tcp.mjs"));
20
+ const loadExaWebSearchRuntime = createLazyRuntimeModule(() => import("./exa-web-search-provider.runtime-C73kkrxv.mjs"));
21
21
  const ExaSearchSchema = {
22
22
  type: "object",
23
23
  properties: {
@@ -94,4 +94,5 @@ function createExaWebSearchProvider() {
94
94
  })
95
95
  };
96
96
  }
97
+ //#endregion
97
98
  export { createExaWebSearchProvider as t };
@@ -1,9 +1,10 @@
1
+ import { createHash } from "node:crypto";
1
2
  import { parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime";
2
- import { ProviderHttpError, readResponseTextLimited } from "openclaw/plugin-sdk/provider-http";
3
+ import { ProviderHttpError, readProviderResponseErrorText, redactProviderResponseErrorText } from "openclaw/plugin-sdk/provider-http";
3
4
  import { DEFAULT_SEARCH_COUNT, buildSearchCacheKey, mergeScopedSearchConfig, parseIsoDateRange, readCachedSearchPayload, readConfiguredSecretString, readPositiveIntegerParam, readProviderEnvValue, readStringParam, resolveProviderWebSearchPluginConfig, resolveSearchCacheTtlMs, resolveSearchTimeoutSeconds, resolveSiteName, withTrustedWebSearchEndpoint, wrapWebContent, writeCachedSearchPayload } from "openclaw/plugin-sdk/provider-web-search";
4
5
  import { readResponseWithLimit } from "openclaw/plugin-sdk/response-limit-runtime";
5
6
  import { asOptionalObjectRecord, asOptionalRecord, isRecord, normalizeOptionalLowercaseString, normalizeOptionalString, normalizeTrimmedStringList } from "openclaw/plugin-sdk/string-coerce-runtime";
6
- // extensions/exa/src/exa-web-search-provider.runtime.ts
7
+ //#region extensions/exa/src/exa-web-search-provider.runtime.ts
7
8
  const EXA_SEARCH_ENDPOINT = "https://api.exa.ai/search";
8
9
  const EXA_SEARCH_TYPES = [
9
10
  "auto",
@@ -183,6 +184,7 @@ async function executeExaWebSearchProviderTool(ctx, args, signal) {
183
184
  const resolvedCount = Math.min(EXA_MAX_SEARCH_COUNT, parseStrictPositiveInteger(count) ?? DEFAULT_SEARCH_COUNT);
184
185
  const cacheKey = buildSearchCacheKey([
185
186
  "exa",
187
+ createHash("sha256").update(apiKey).digest("hex"),
186
188
  endpoint,
187
189
  type,
188
190
  query,
@@ -206,24 +208,25 @@ async function executeExaWebSearchProviderTool(ctx, args, signal) {
206
208
  if (dateAfter) body.startPublishedDate = dateAfter;
207
209
  else if (freshness) body.startPublishedDate = resolveFreshnessStartDate(freshness);
208
210
  if (dateBefore) body.endPublishedDate = dateBefore;
211
+ const headers = {
212
+ Accept: "application/json",
213
+ "Content-Type": "application/json",
214
+ "x-api-key": apiKey,
215
+ "x-exa-integration": "openclaw"
216
+ };
209
217
  const results = await withTrustedWebSearchEndpoint({
210
218
  url: endpoint,
211
219
  timeoutSeconds,
212
220
  signal,
213
221
  init: {
214
222
  method: "POST",
215
- headers: {
216
- Accept: "application/json",
217
- "Content-Type": "application/json",
218
- "x-api-key": apiKey,
219
- "x-exa-integration": "openclaw"
220
- },
223
+ headers,
221
224
  body: JSON.stringify(body)
222
225
  }
223
226
  }, async (res) => {
224
227
  if (!res.ok) {
225
- const detail = await readResponseTextLimited(res, EXA_ERROR_BODY_LIMIT_BYTES);
226
- throw new ProviderHttpError(`Exa API error (${res.status}): ${detail || res.statusText}`, { status: res.status });
228
+ const detail = await readProviderResponseErrorText(res, EXA_ERROR_BODY_LIMIT_BYTES, headers, signal);
229
+ throw new ProviderHttpError(`Exa API error (${res.status}): ${detail || redactProviderResponseErrorText(res.statusText, headers)}`, { status: res.status });
227
230
  }
228
231
  return (await readExaSearchResults(res)).slice(0, resolvedCount);
229
232
  });
@@ -258,4 +261,5 @@ async function executeExaWebSearchProviderTool(ctx, args, signal) {
258
261
  writeCachedSearchPayload(cacheKey, payload, cacheTtlMs);
259
262
  return payload;
260
263
  }
264
+ //#endregion
261
265
  export { executeExaWebSearchProviderTool };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { t as createExaWebSearchProvider } from "./.setup/exa-web-search-provider-BFa1BlUM.mjs";
1
+ import { t as createExaWebSearchProvider } from "./.setup/exa-web-search-provider-UdcmLdNp.mjs";
2
2
  import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
3
- // extensions/exa/index.ts
3
+ //#region extensions/exa/index.ts
4
4
  var exa_default = definePluginEntry({
5
5
  id: "exa",
6
6
  name: "Exa Plugin",
@@ -9,4 +9,5 @@ var exa_default = definePluginEntry({
9
9
  api.registerWebSearchProvider(createExaWebSearchProvider());
10
10
  }
11
11
  });
12
+ //#endregion
12
13
  export { exa_default as default };
@@ -1,2 +1,3 @@
1
- export { t as createExaWebSearchProvider } from "./.setup/exa-web-search-provider-BFa1BlUM.mjs";
1
+ import { t as createExaWebSearchProvider } from "./.setup/exa-web-search-provider-UdcmLdNp.mjs";
2
2
  import "./web-search-provider.js";
3
+ export { createExaWebSearchProvider };
@@ -1 +1,2 @@
1
- export { t as createExaWebSearchProvider } from "./.setup/exa-web-search-provider-BFa1BlUM.mjs";
1
+ import { t as createExaWebSearchProvider } from "./.setup/exa-web-search-provider-UdcmLdNp.mjs";
2
+ export { createExaWebSearchProvider };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/exa-plugin",
3
- "version": "2026.11.1",
3
+ "version": "2026.11.3",
4
4
  "description": "OpenClaw Exa plugin.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -18,10 +18,10 @@
18
18
  "minHostVersion": ">=2026.6.8"
19
19
  },
20
20
  "compat": {
21
- "pluginApi": ">=2026.11.1"
21
+ "pluginApi": ">=2026.11.3"
22
22
  },
23
23
  "build": {
24
- "openclawVersion": "2026.11.1",
24
+ "openclawVersion": "2026.11.3",
25
25
  "bundledDist": false
26
26
  },
27
27
  "release": {
@@ -40,7 +40,7 @@
40
40
  "assets/activity.svg"
41
41
  ],
42
42
  "peerDependencies": {
43
- "openclaw": ">=2026.11.1"
43
+ "openclaw": ">=2026.11.3"
44
44
  },
45
45
  "peerDependenciesMeta": {
46
46
  "openclaw": {
@@ -1 +0,0 @@
1
- {"version":3,"entries":[{"output":"index.js","source":"extensions/exa/index.ts"},{"output":"web-search-contract-api.js","source":"extensions/exa/web-search-contract-api.ts"},{"output":"web-search-provider.js","source":"extensions/exa/web-search-provider.ts"}],"chunks":[{"output":".setup/exa-web-search-provider-BFa1BlUM.mjs","sha256":"7301a599c9b6d5eb245e7353b56a4b894772cae0514126c243180a4dbaf2b0f8","facadeSource":null,"sources":["extensions/exa/src/exa-web-search-provider.ts"]},{"output":".setup/exa-web-search-provider.runtime-Dw_U6tcp.mjs","sha256":"072b491558d684763e0a547f9e38fddd6e313062a1d28f72535beea852895ad8","facadeSource":"extensions/exa/src/exa-web-search-provider.runtime.ts","sources":["extensions/exa/src/exa-web-search-provider.runtime.ts"]},{"output":"index.js","sha256":"879fc6b5409d1763d469bf18035fa97d7df18d5066e2c3e8592a287e8e94b6c6","facadeSource":"extensions/exa/index.ts","sources":["extensions/exa/index.ts"]},{"output":"web-search-contract-api.js","sha256":"93f1c7d694e0cfccfd8839c2c2ef525a9c32a68f70b7c12f2f729199726382d0","facadeSource":"extensions/exa/web-search-contract-api.ts","sources":[]},{"output":"web-search-provider.js","sha256":"56b68cf40d95fc9fe392356ffbf6ee837f37768553515cda70f26a3442871943","facadeSource":"extensions/exa/web-search-provider.ts","sources":[]}],"unrenderedSources":["extensions/exa/web-search-contract-api.ts","extensions/exa/web-search-provider.ts"]}