webfox 4.9.0 → 4.11.0

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.
Files changed (47) hide show
  1. package/README.md +4 -12
  2. package/dist/{adapter-UIFBJKKF.js → adapter-44ZBIK47.js} +4 -6
  3. package/dist/{adapter-HTMXAJTU.js → adapter-57MELLYI.js} +2 -8
  4. package/dist/{adapter-VMMS4YQG.js → adapter-BZO5UEI6.js} +3 -15
  5. package/dist/{adapter-OK2PTP6R.js → adapter-D4EXZEDL.js} +16 -48
  6. package/dist/{adapter-G3I7JEO5.js → adapter-DJCTEEOA.js} +3 -5
  7. package/dist/{adapter-764OQFKY.js → adapter-DLNMW34W.js} +8 -35
  8. package/dist/{adapter-HRI5ZMGK.js → adapter-GFXYSHKP.js} +9 -43
  9. package/dist/{adapter-2UVAARTV.js → adapter-GJOUFE2U.js} +1 -1
  10. package/dist/{adapter-C2VZHFUB.js → adapter-MZ7USB6Q.js} +3 -4
  11. package/dist/adapter-ODDFBGJG.js +167 -0
  12. package/dist/{adapter-K6AMSUCR.js → adapter-QQZFHUOP.js} +14 -37
  13. package/dist/{adapter-AUYLTDPM.js → adapter-RR55EZAW.js} +1 -1
  14. package/dist/adapter-SZMVKAMC.js +91 -0
  15. package/dist/{adapter-6EZAIE65.js → adapter-VXT4C6RZ.js} +16 -66
  16. package/dist/{adapter-L6BFKWGX.js → adapter-WXEVTCM3.js} +7 -14
  17. package/dist/{adapter-VW4FMMJC.js → adapter-XSQX3GAI.js} +13 -5
  18. package/dist/{adapter-QIP32KA4.js → adapter-XU2APKPC.js} +3 -3
  19. package/dist/{adapter-A5WYGGZI.js → adapter-YVZ4YBK5.js} +8 -16
  20. package/dist/chunk-6RQGO727.js +71 -0
  21. package/dist/{chunk-HCYQF24V.js → chunk-KMUCUJVN.js} +3 -3
  22. package/dist/{chunk-EF4VMDZL.js → chunk-LDVDVA4Z.js} +1 -4
  23. package/dist/{chunk-GPACLYNT.js → chunk-NENL6L6N.js} +2 -0
  24. package/dist/{chunk-LTJOWNI2.js → chunk-PVNWACMT.js} +199 -17
  25. package/dist/{chunk-YZXM4U2C.js → chunk-TYJ6RHKB.js} +10 -0
  26. package/dist/{chunk-QZFN2747.js → chunk-YILOS4E7.js} +23 -9
  27. package/dist/cli.js +5 -5
  28. package/dist/config.schema.json +299 -0
  29. package/dist/contents.d.ts +5 -0
  30. package/dist/document-schema.d.ts +17 -5
  31. package/dist/domain.d.ts +14 -2
  32. package/dist/durable.js +5 -5
  33. package/dist/index.js +4 -4
  34. package/dist/pi.js +33 -14
  35. package/dist/providers/contract.d.ts +12 -1
  36. package/dist/providers/keenable/adapter.d.ts +5 -0
  37. package/dist/providers/keenable/definition.d.ts +1 -0
  38. package/dist/providers/keenable/types.d.ts +4 -0
  39. package/dist/providers/registry.d.ts +2 -0
  40. package/dist/providers/sofya/adapter.d.ts +8 -0
  41. package/dist/providers/sofya/definition.d.ts +1 -0
  42. package/dist/providers/sofya/types.d.ts +4 -0
  43. package/dist/render.d.ts +8 -2
  44. package/docs/provider.md +44 -0
  45. package/examples/custom/README.md +9 -3
  46. package/package.json +1 -1
  47. package/dist/chunk-BTWECET5.js +0 -31
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  CAPABILITIES
3
- } from "./chunk-GPACLYNT.js";
3
+ } from "./chunk-NENL6L6N.js";
4
4
  import {
5
5
  WebfoxError
6
6
  } from "./chunk-U4BLULLV.js";
@@ -504,7 +504,7 @@ var braveProvider = defineProvider({
504
504
  retrySafe: false
505
505
  }
506
506
  },
507
- load: async () => (await import("./adapter-A5WYGGZI.js")).adapter
507
+ load: async () => (await import("./adapter-YVZ4YBK5.js")).adapter
508
508
  });
509
509
 
510
510
  // src/providers/cloudflare/definition.ts
@@ -606,7 +606,7 @@ var cloudflareProvider = defineProvider({
606
606
  retrySafe: true
607
607
  }
608
608
  },
609
- load: async () => (await import("./adapter-AUYLTDPM.js")).adapter
609
+ load: async () => (await import("./adapter-RR55EZAW.js")).adapter
610
610
  });
611
611
 
612
612
  // src/providers/custom/definition.ts
@@ -633,7 +633,7 @@ var customProvider = defineProvider({
633
633
  retrySafe: false
634
634
  }
635
635
  },
636
- load: async () => (await import("./adapter-VW4FMMJC.js")).adapter
636
+ load: async () => (await import("./adapter-XSQX3GAI.js")).adapter
637
637
  });
638
638
 
639
639
  // src/providers/exa/definition.ts
@@ -944,7 +944,7 @@ var exaProvider = defineProvider({
944
944
  retrySafe: false
945
945
  }
946
946
  },
947
- load: async () => (await import("./adapter-HRI5ZMGK.js")).adapter
947
+ load: async () => (await import("./adapter-GFXYSHKP.js")).adapter
948
948
  });
949
949
 
950
950
  // src/providers/firecrawl/definition.ts
@@ -1150,7 +1150,7 @@ var firecrawlProvider = defineProvider({
1150
1150
  retrySafe: false
1151
1151
  }
1152
1152
  },
1153
- load: async () => (await import("./adapter-L6BFKWGX.js")).adapter
1153
+ load: async () => (await import("./adapter-WXEVTCM3.js")).adapter
1154
1154
  });
1155
1155
 
1156
1156
  // src/providers/gemini/definition.ts
@@ -1275,7 +1275,74 @@ var geminiProvider = defineProvider({
1275
1275
  retrySafe: false
1276
1276
  }
1277
1277
  },
1278
- load: async () => (await import("./adapter-6EZAIE65.js")).adapter
1278
+ load: async () => (await import("./adapter-VXT4C6RZ.js")).adapter
1279
+ });
1280
+
1281
+ // src/providers/keenable/definition.ts
1282
+ var timeFilter = (description) => ({
1283
+ type: "string",
1284
+ minLength: 1,
1285
+ description: `${description} Accepts YYYY-MM-DD, an ISO 8601 timestamp, or a relative delta such as 7d, 12h, or 30min.`
1286
+ });
1287
+ var keenableProvider = defineProvider({
1288
+ id: "keenable",
1289
+ label: "Keenable",
1290
+ docsUrl: "https://docs.keenable.ai/api-reference/search",
1291
+ local: false,
1292
+ credentials: [{ name: "api", environmentVariable: "KEENABLE_API_KEY" }],
1293
+ fields: ["credentials", "baseUrl", "options"],
1294
+ defaults: {},
1295
+ credentialDefaults: {},
1296
+ capabilities: {
1297
+ search: {
1298
+ options: {
1299
+ type: "object",
1300
+ properties: {
1301
+ mode: {
1302
+ type: "string",
1303
+ enum: ["pro", "realtime"],
1304
+ description: "Search mode: 'pro' (default) for deeper retrieval, 'realtime' for the fastest results. Each mode is billed separately."
1305
+ },
1306
+ site: {
1307
+ type: "string",
1308
+ minLength: 1,
1309
+ description: "Restrict results to one site, e.g. 'techcrunch.com'."
1310
+ },
1311
+ published_after: timeFilter(
1312
+ "Only pages published at or after this time."
1313
+ ),
1314
+ published_before: timeFilter(
1315
+ "Only pages published at or before this time."
1316
+ ),
1317
+ acquired_after: timeFilter(
1318
+ "Only pages indexed at or after this time."
1319
+ ),
1320
+ acquired_before: timeFilter(
1321
+ "Only pages indexed at or before this time."
1322
+ ),
1323
+ query_time: {
1324
+ type: "string",
1325
+ minLength: 1,
1326
+ description: "Search the index as it stood at this date or ISO 8601 timestamp; relative time filters resolve against it."
1327
+ },
1328
+ snippet_max_length: {
1329
+ type: "integer",
1330
+ minimum: 180,
1331
+ maximum: 1e4,
1332
+ description: "Maximum characters of the excerpt per result."
1333
+ }
1334
+ },
1335
+ description: "Keenable search options."
1336
+ },
1337
+ promptGuidelines: [
1338
+ "Keenable returns ranked web results with page excerpts; use web_contents to read selected sources in full.",
1339
+ "Use Keenable site to restrict results to one domain, and published_after/published_before (e.g. '7d') for recent or date-bounded results.",
1340
+ "Use Keenable mode='realtime' only when latency matters more than retrieval depth."
1341
+ ],
1342
+ retrySafe: true
1343
+ }
1344
+ },
1345
+ load: async () => (await import("./adapter-SZMVKAMC.js")).adapter
1279
1346
  });
1280
1347
 
1281
1348
  // src/providers/linkup/definition.ts
@@ -1473,7 +1540,7 @@ var linkupProvider = defineProvider({
1473
1540
  retrySafe: false
1474
1541
  }
1475
1542
  },
1476
- load: async () => (await import("./adapter-K6AMSUCR.js")).adapter
1543
+ load: async () => (await import("./adapter-QQZFHUOP.js")).adapter
1477
1544
  });
1478
1545
 
1479
1546
  // src/providers/ollama/definition.ts
@@ -1502,7 +1569,7 @@ var ollamaProvider = defineProvider({
1502
1569
  retrySafe: true
1503
1570
  }
1504
1571
  },
1505
- load: async () => (await import("./adapter-HTMXAJTU.js")).adapter
1572
+ load: async () => (await import("./adapter-57MELLYI.js")).adapter
1506
1573
  });
1507
1574
 
1508
1575
  // src/providers/openai/definition.ts
@@ -1610,7 +1677,7 @@ var openaiProvider = defineProvider({
1610
1677
  retrySafe: false
1611
1678
  }
1612
1679
  },
1613
- load: async () => (await import("./adapter-VMMS4YQG.js")).adapter
1680
+ load: async () => (await import("./adapter-BZO5UEI6.js")).adapter
1614
1681
  });
1615
1682
 
1616
1683
  // src/providers/parallel/definition.ts
@@ -1769,7 +1836,7 @@ var parallelProvider = defineProvider({
1769
1836
  retrySafe: true
1770
1837
  }
1771
1838
  },
1772
- load: async () => (await import("./adapter-G3I7JEO5.js")).adapter
1839
+ load: async () => (await import("./adapter-DJCTEEOA.js")).adapter
1773
1840
  });
1774
1841
 
1775
1842
  // src/providers/perplexity/definition.ts
@@ -1890,7 +1957,7 @@ var perplexityProvider = defineProvider({
1890
1957
  answer: { options: chatOptions, retrySafe: false },
1891
1958
  research: { options: chatOptions, retrySafe: false }
1892
1959
  },
1893
- load: async () => (await import("./adapter-OK2PTP6R.js")).adapter
1960
+ load: async () => (await import("./adapter-D4EXZEDL.js")).adapter
1894
1961
  });
1895
1962
 
1896
1963
  // src/providers/serpbase/definition.ts
@@ -1991,7 +2058,7 @@ var serpbaseProvider = defineProvider({
1991
2058
  retrySafe: true
1992
2059
  }
1993
2060
  },
1994
- load: async () => (await import("./adapter-QIP32KA4.js")).adapter
2061
+ load: async () => (await import("./adapter-XU2APKPC.js")).adapter
1995
2062
  });
1996
2063
 
1997
2064
  // src/providers/serper/definition.ts
@@ -2131,7 +2198,120 @@ var serperProvider = defineProvider({
2131
2198
  retrySafe: true
2132
2199
  }
2133
2200
  },
2134
- load: async () => (await import("./adapter-C2VZHFUB.js")).adapter
2201
+ load: async () => (await import("./adapter-MZ7USB6Q.js")).adapter
2202
+ });
2203
+
2204
+ // src/providers/sofya/definition.ts
2205
+ var filters = {
2206
+ topic: {
2207
+ type: "string",
2208
+ enum: ["general", "news"],
2209
+ description: "'news' for news articles, 'general' (default) for web search."
2210
+ },
2211
+ freshness: {
2212
+ type: "string",
2213
+ pattern: "^(day|week|month|year|\\d{4}-\\d{2}-\\d{2}:\\d{4}-\\d{2}-\\d{2})$",
2214
+ description: "Recency filter: day, week, month, year, or a YYYY-MM-DD:YYYY-MM-DD range."
2215
+ }
2216
+ };
2217
+ var domainFilters = {
2218
+ include_domains: {
2219
+ type: "array",
2220
+ items: { type: "string", minLength: 1 },
2221
+ maxItems: 10,
2222
+ description: "Only return results from these domains, e.g. 'github.com'."
2223
+ },
2224
+ exclude_domains: {
2225
+ type: "array",
2226
+ items: { type: "string", minLength: 1 },
2227
+ maxItems: 10,
2228
+ description: "Exclude results from these domains."
2229
+ }
2230
+ };
2231
+ var searchDepth = {
2232
+ type: "string",
2233
+ enum: ["snippets", "basic"],
2234
+ description: "'snippets' (1 credit) returns search snippets; 'basic' (2 credits) also reads each page and returns its text in metadata.content."
2235
+ };
2236
+ var sofyaProvider = defineProvider({
2237
+ id: "sofya",
2238
+ label: "Sofya",
2239
+ docsUrl: "https://sofya.co/docs",
2240
+ local: false,
2241
+ credentials: [{ name: "api", environmentVariable: "SOFYA_API_KEY" }],
2242
+ fields: ["credentials", "baseUrl", "options"],
2243
+ defaults: { search: { search_depth: "snippets" } },
2244
+ credentialDefaults: {},
2245
+ capabilities: {
2246
+ search: {
2247
+ // Sofya calls can take up to 60 seconds; allow headroom.
2248
+ defaultTimeoutMs: 9e4,
2249
+ options: {
2250
+ type: "object",
2251
+ properties: {
2252
+ search_depth: searchDepth,
2253
+ ...filters,
2254
+ ...domainFilters
2255
+ },
2256
+ description: "Sofya search options."
2257
+ },
2258
+ promptGuidelines: [
2259
+ "Sofya search returns ranked results with snippets; use web_contents to read selected sources in full.",
2260
+ "Use Sofya topic='news' and freshness (e.g. 'week') for recent events, and include_domains to restrict results to specific sites."
2261
+ ],
2262
+ retrySafe: true
2263
+ },
2264
+ contents: {
2265
+ defaultTimeoutMs: 9e4,
2266
+ options: {
2267
+ type: "object",
2268
+ properties: {
2269
+ include_raw_html: {
2270
+ type: "boolean",
2271
+ description: "Include the raw HTML source in metadata.raw_html."
2272
+ }
2273
+ },
2274
+ description: "Sofya contents options."
2275
+ },
2276
+ retrySafe: true
2277
+ },
2278
+ answer: {
2279
+ defaultTimeoutMs: 9e4,
2280
+ options: {
2281
+ type: "object",
2282
+ properties: {
2283
+ search_depth: searchDepth,
2284
+ max_results: {
2285
+ type: "integer",
2286
+ minimum: 1,
2287
+ maximum: 20,
2288
+ description: "Search results the answer is grounded in."
2289
+ },
2290
+ ...filters,
2291
+ ...domainFilters
2292
+ },
2293
+ description: "Sofya answer options."
2294
+ },
2295
+ retrySafe: false
2296
+ },
2297
+ research: {
2298
+ options: {
2299
+ type: "object",
2300
+ properties: {
2301
+ ...filters,
2302
+ max_sources: {
2303
+ type: "integer",
2304
+ minimum: 5,
2305
+ maximum: 30,
2306
+ description: "Maximum sources to read (default 20)."
2307
+ }
2308
+ },
2309
+ description: "Sofya research options."
2310
+ },
2311
+ retrySafe: false
2312
+ }
2313
+ },
2314
+ load: async () => (await import("./adapter-ODDFBGJG.js")).adapter
2135
2315
  });
2136
2316
 
2137
2317
  // src/providers/tavily/definition.ts
@@ -2326,7 +2506,7 @@ var tavilyProvider = defineProvider({
2326
2506
  retrySafe: true
2327
2507
  }
2328
2508
  },
2329
- load: async () => (await import("./adapter-UIFBJKKF.js")).adapter
2509
+ load: async () => (await import("./adapter-44ZBIK47.js")).adapter
2330
2510
  });
2331
2511
 
2332
2512
  // src/providers/valyu/definition.ts
@@ -2794,7 +2974,7 @@ var valyuProvider = defineProvider({
2794
2974
  retrySafe: false
2795
2975
  }
2796
2976
  },
2797
- load: async () => (await import("./adapter-764OQFKY.js")).adapter
2977
+ load: async () => (await import("./adapter-DLNMW34W.js")).adapter
2798
2978
  });
2799
2979
 
2800
2980
  // src/providers/youcom/definition.ts
@@ -2985,7 +3165,7 @@ var youcomProvider = defineProvider({
2985
3165
  retrySafe: true
2986
3166
  }
2987
3167
  },
2988
- load: async () => (await import("./adapter-2UVAARTV.js")).adapter
3168
+ load: async () => (await import("./adapter-GJOUFE2U.js")).adapter
2989
3169
  });
2990
3170
 
2991
3171
  // src/providers/registry.ts
@@ -2996,6 +3176,7 @@ var providers = {
2996
3176
  exa: exaProvider,
2997
3177
  firecrawl: firecrawlProvider,
2998
3178
  gemini: geminiProvider,
3179
+ keenable: keenableProvider,
2999
3180
  linkup: linkupProvider,
3000
3181
  ollama: ollamaProvider,
3001
3182
  openai: openaiProvider,
@@ -3003,6 +3184,7 @@ var providers = {
3003
3184
  perplexity: perplexityProvider,
3004
3185
  serpbase: serpbaseProvider,
3005
3186
  serper: serperProvider,
3187
+ sofya: sofyaProvider,
3006
3188
  tavily: tavilyProvider,
3007
3189
  valyu: valyuProvider,
3008
3190
  youcom: youcomProvider
@@ -3,6 +3,15 @@ import {
3
3
  } from "./chunk-U4BLULLV.js";
4
4
 
5
5
  // src/contents.ts
6
+ function omittedContents(url) {
7
+ return {
8
+ url,
9
+ error: new WebfoxError(
10
+ "PROVIDER_FAILURE",
11
+ "The provider omitted a result for this URL."
12
+ ).toJSON()
13
+ };
14
+ }
6
15
  function orderedContents(response) {
7
16
  return {
8
17
  provider: response.provider,
@@ -17,5 +26,6 @@ function orderedContents(response) {
17
26
  }
18
27
 
19
28
  export {
29
+ omittedContents,
20
30
  orderedContents
21
31
  };
@@ -6,21 +6,21 @@ import {
6
6
  } from "./chunk-WCTOYZVB.js";
7
7
  import {
8
8
  configurationSchema
9
- } from "./chunk-HCYQF24V.js";
9
+ } from "./chunk-KMUCUJVN.js";
10
10
  import {
11
11
  effectiveOptions,
12
12
  optionSchema,
13
13
  providers,
14
14
  selectProvider,
15
15
  validateConfiguredOptions
16
- } from "./chunk-LTJOWNI2.js";
16
+ } from "./chunk-PVNWACMT.js";
17
17
  import {
18
18
  cancelProcessGroup,
19
19
  killProcessGroup
20
20
  } from "./chunk-ZVTVERW5.js";
21
21
  import {
22
22
  CAPABILITIES
23
- } from "./chunk-GPACLYNT.js";
23
+ } from "./chunk-NENL6L6N.js";
24
24
  import {
25
25
  WebfoxError,
26
26
  asWebfoxError
@@ -442,7 +442,13 @@ var ExecutionRuntime = class {
442
442
  throw new WebfoxError(answer.error.code, answer.error.message, {
443
443
  retryable: answer.error.retryable
444
444
  });
445
- const { inputIndex: _index, error: _error, ...value2 } = answer;
445
+ const {
446
+ inputIndex: _index,
447
+ error: _error,
448
+ content,
449
+ ...rest
450
+ } = answer;
451
+ const value2 = content?.trim() ? { ...rest, content } : rest;
446
452
  return { input, ok: true, value: value2 };
447
453
  }
448
454
  const operation = capability === "search" ? {
@@ -459,10 +465,7 @@ var ExecutionRuntime = class {
459
465
  context
460
466
  );
461
467
  const value = capability === "search" ? {
462
- results: result.results.slice(
463
- 0,
464
- plan.maxResults
465
- )
468
+ results: result.results.slice(0, plan.maxResults).map(searchValue)
466
469
  } : textValue(result);
467
470
  return { input, ok: true, value };
468
471
  } catch (error) {
@@ -546,13 +549,24 @@ var ExecutionRuntime = class {
546
549
  }
547
550
  }
548
551
  };
552
+ function searchValue({ title, ...result }) {
553
+ const trimmed = title?.trim();
554
+ return trimmed ? { title: trimmed, ...result } : result;
555
+ }
549
556
  function textValue(value) {
557
+ const sources = value.sources?.flatMap(sourceValue);
550
558
  return {
551
559
  text: value.text,
552
- ...value.itemCount === void 0 ? {} : { itemCount: value.itemCount },
560
+ ...sources === void 0 ? {} : { sources, itemCount: sources.length },
553
561
  ...value.metadata === void 0 ? {} : { metadata: value.metadata }
554
562
  };
555
563
  }
564
+ function sourceValue(source) {
565
+ const url = typeof source.url === "string" ? source.url.trim() : "";
566
+ const title = typeof source.title === "string" ? source.title.trim() : "";
567
+ if (url) return [title ? { url, title } : { url }];
568
+ return title ? [{ title }] : [];
569
+ }
556
570
 
557
571
  // src/application.ts
558
572
  function createWebfox(options = {}) {
package/dist/cli.js CHANGED
@@ -4,26 +4,26 @@ import {
4
4
  } from "./chunk-I2UIACY3.js";
5
5
  import {
6
6
  renderTextDocument
7
- } from "./chunk-BTWECET5.js";
7
+ } from "./chunk-6RQGO727.js";
8
8
  import {
9
9
  createWebfox,
10
10
  loadConfig,
11
11
  redactConfig,
12
12
  resolveConfigPath,
13
13
  setCapabilityDefault
14
- } from "./chunk-QZFN2747.js";
14
+ } from "./chunk-YILOS4E7.js";
15
15
  import "./chunk-WCTOYZVB.js";
16
16
  import {
17
17
  PACKAGE_VERSION
18
- } from "./chunk-HCYQF24V.js";
18
+ } from "./chunk-KMUCUJVN.js";
19
19
  import {
20
20
  validateConfiguredOptions
21
- } from "./chunk-LTJOWNI2.js";
21
+ } from "./chunk-PVNWACMT.js";
22
22
  import "./chunk-ZVTVERW5.js";
23
23
  import {
24
24
  CAPABILITIES,
25
25
  PROVIDER_IDS
26
- } from "./chunk-GPACLYNT.js";
26
+ } from "./chunk-NENL6L6N.js";
27
27
  import {
28
28
  WebfoxError
29
29
  } from "./chunk-U4BLULLV.js";