@openclaw/exa-plugin 2026.7.2-beta.5 → 2026.8.1-beta.2

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.
@@ -16,7 +16,7 @@ const EXA_FRESHNESS_VALUES = [
16
16
  "year"
17
17
  ];
18
18
  const EXA_MAX_SEARCH_COUNT = 100;
19
- const loadExaWebSearchRuntime = createLazyRuntimeModule(() => import("./exa-web-search-provider.runtime-BaZ9zZ4q.js"));
19
+ const loadExaWebSearchRuntime = createLazyRuntimeModule(() => import("./exa-web-search-provider.runtime-Uysj-tWk.js"));
20
20
  const ExaSearchSchema = {
21
21
  type: "object",
22
22
  properties: {
@@ -66,9 +66,10 @@ function createExaWebSearchProvider() {
66
66
  createTool: (ctx) => ({
67
67
  description: "Search the web using Exa AI. Supports neural or keyword search, publication date filters, and optional highlights or text extraction.",
68
68
  parameters: ExaSearchSchema,
69
- execute: async (args) => {
69
+ execute: async (args, context) => {
70
+ context?.signal?.throwIfAborted();
70
71
  const { executeExaWebSearchProviderTool } = await loadExaWebSearchRuntime();
71
- return await executeExaWebSearchProviderTool(ctx, args);
72
+ return await executeExaWebSearchProviderTool(ctx, args, context?.signal);
72
73
  }
73
74
  })
74
75
  };
@@ -25,7 +25,7 @@ const EXA_SEARCH_JSON_MAX_BYTES = 16 * 1024 * 1024;
25
25
  async function readExaSearchResults(response, opts) {
26
26
  const bytes = await readResponseWithLimit(response, opts?.maxBytes ?? EXA_SEARCH_JSON_MAX_BYTES, { onOverflow: ({ maxBytes: maxBytesLocal }) => /* @__PURE__ */ new Error(`Exa API response exceeds ${maxBytesLocal} bytes`) });
27
27
  try {
28
- return normalizeExaResults(JSON.parse(new TextDecoder().decode(bytes)));
28
+ return normalizeExaResults(JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes)));
29
29
  } catch (cause) {
30
30
  throw new Error("Exa API returned malformed JSON", { cause });
31
31
  }
@@ -203,6 +203,7 @@ async function runExaSearch(params) {
203
203
  return withTrustedWebSearchEndpoint({
204
204
  url: params.endpoint,
205
205
  timeoutSeconds: params.timeoutSeconds,
206
+ signal: params.signal,
206
207
  init: {
207
208
  method: "POST",
208
209
  headers: {
@@ -242,7 +243,7 @@ function buildExaCacheKey(params) {
242
243
  JSON.stringify(contents)
243
244
  ]);
244
245
  }
245
- async function executeExaWebSearchProviderTool(ctx, args) {
246
+ async function executeExaWebSearchProviderTool(ctx, args, signal) {
246
247
  const searchConfig = mergeScopedSearchConfig(ctx.searchConfig, "exa", resolveProviderWebSearchPluginConfig(ctx.config, "exa"));
247
248
  const params = args;
248
249
  const exaConfig = resolveExaConfig(searchConfig);
@@ -308,8 +309,10 @@ async function executeExaWebSearchProviderTool(ctx, args) {
308
309
  dateBefore,
309
310
  type,
310
311
  contents,
311
- timeoutSeconds: resolveSearchTimeoutSeconds(searchConfig)
312
+ timeoutSeconds: resolveSearchTimeoutSeconds(searchConfig),
313
+ signal
312
314
  });
315
+ signal?.throwIfAborted();
313
316
  const payload = {
314
317
  query,
315
318
  provider: "exa",
@@ -341,12 +344,9 @@ async function executeExaWebSearchProviderTool(ctx, args) {
341
344
  return payload;
342
345
  }
343
346
  const testing = {
344
- normalizeExaResults,
345
- normalizeExaFreshness,
346
347
  parseExaContents,
347
348
  buildExaCacheKey,
348
349
  resolveExaApiKey,
349
- resolveExaConfig,
350
350
  resolveExaDescription,
351
351
  resolveExaSearchCount,
352
352
  resolveExaSearchEndpoint,
@@ -355,4 +355,4 @@ const testing = {
355
355
  readExaSearchResults
356
356
  };
357
357
  //#endregion
358
- export { testing as __testing, testing, executeExaWebSearchProviderTool };
358
+ export { executeExaWebSearchProviderTool, testing };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as createExaWebSearchProvider } from "./exa-web-search-provider-ChlfbLIJ.js";
1
+ import { t as createExaWebSearchProvider } from "./exa-web-search-provider-BJD3zsL0.js";
2
2
  import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
3
3
  //#region extensions/exa/index.ts
4
4
  var exa_default = definePluginEntry({
@@ -1,2 +1,2 @@
1
- import { t as createExaWebSearchProvider } from "./exa-web-search-provider-ChlfbLIJ.js";
1
+ import { t as createExaWebSearchProvider } from "./exa-web-search-provider-BJD3zsL0.js";
2
2
  export { createExaWebSearchProvider };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/exa-plugin",
3
- "version": "2026.7.2-beta.5",
3
+ "version": "2026.8.1-beta.2",
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.7.2-beta.5"
21
+ "pluginApi": ">=2026.8.1-beta.2"
22
22
  },
23
23
  "build": {
24
- "openclawVersion": "2026.7.2-beta.5",
24
+ "openclawVersion": "2026.8.1-beta.2",
25
25
  "bundledDist": false
26
26
  },
27
27
  "release": {
@@ -38,7 +38,7 @@
38
38
  "README.md"
39
39
  ],
40
40
  "peerDependencies": {
41
- "openclaw": ">=2026.7.2-beta.5"
41
+ "openclaw": ">=2026.8.1-beta.2"
42
42
  },
43
43
  "peerDependenciesMeta": {
44
44
  "openclaw": {