infobroker 2026.8.23

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 (112) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +529 -0
  3. package/bin/infobroker.js +5 -0
  4. package/dist/chain.d.ts +14 -0
  5. package/dist/chain.js +63 -0
  6. package/dist/chain.js.map +1 -0
  7. package/dist/config.d.ts +9 -0
  8. package/dist/config.js +271 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/corroborate.d.ts +25 -0
  11. package/dist/corroborate.js +421 -0
  12. package/dist/corroborate.js.map +1 -0
  13. package/dist/http.d.ts +5 -0
  14. package/dist/http.js +25 -0
  15. package/dist/http.js.map +1 -0
  16. package/dist/index.d.ts +1 -0
  17. package/dist/index.js +909 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/kb-crypto.d.ts +43 -0
  20. package/dist/kb-crypto.js +199 -0
  21. package/dist/kb-crypto.js.map +1 -0
  22. package/dist/kb.d.ts +100 -0
  23. package/dist/kb.js +1009 -0
  24. package/dist/kb.js.map +1 -0
  25. package/dist/lib/html.d.ts +2 -0
  26. package/dist/lib/html.js +13 -0
  27. package/dist/lib/html.js.map +1 -0
  28. package/dist/lib/url-guard.d.ts +14 -0
  29. package/dist/lib/url-guard.js +75 -0
  30. package/dist/lib/url-guard.js.map +1 -0
  31. package/dist/normalizer.d.ts +2 -0
  32. package/dist/normalizer.js +53 -0
  33. package/dist/normalizer.js.map +1 -0
  34. package/dist/providers/arxiv.d.ts +2 -0
  35. package/dist/providers/arxiv.js +78 -0
  36. package/dist/providers/arxiv.js.map +1 -0
  37. package/dist/providers/brave.d.ts +2 -0
  38. package/dist/providers/brave.js +79 -0
  39. package/dist/providers/brave.js.map +1 -0
  40. package/dist/providers/core.d.ts +2 -0
  41. package/dist/providers/core.js +62 -0
  42. package/dist/providers/core.js.map +1 -0
  43. package/dist/providers/duckduckgo.d.ts +2 -0
  44. package/dist/providers/duckduckgo.js +93 -0
  45. package/dist/providers/duckduckgo.js.map +1 -0
  46. package/dist/providers/exa.d.ts +2 -0
  47. package/dist/providers/exa.js +68 -0
  48. package/dist/providers/exa.js.map +1 -0
  49. package/dist/providers/generic-http.d.ts +2 -0
  50. package/dist/providers/generic-http.js +96 -0
  51. package/dist/providers/generic-http.js.map +1 -0
  52. package/dist/providers/github.d.ts +2 -0
  53. package/dist/providers/github.js +58 -0
  54. package/dist/providers/github.js.map +1 -0
  55. package/dist/providers/index.d.ts +3 -0
  56. package/dist/providers/index.js +59 -0
  57. package/dist/providers/index.js.map +1 -0
  58. package/dist/providers/internet_archive.d.ts +2 -0
  59. package/dist/providers/internet_archive.js +59 -0
  60. package/dist/providers/internet_archive.js.map +1 -0
  61. package/dist/providers/jina.d.ts +2 -0
  62. package/dist/providers/jina.js +34 -0
  63. package/dist/providers/jina.js.map +1 -0
  64. package/dist/providers/marginalia.d.ts +2 -0
  65. package/dist/providers/marginalia.js +47 -0
  66. package/dist/providers/marginalia.js.map +1 -0
  67. package/dist/providers/mojeek.d.ts +2 -0
  68. package/dist/providers/mojeek.js +47 -0
  69. package/dist/providers/mojeek.js.map +1 -0
  70. package/dist/providers/openstreetmap.d.ts +2 -0
  71. package/dist/providers/openstreetmap.js +43 -0
  72. package/dist/providers/openstreetmap.js.map +1 -0
  73. package/dist/providers/searxng.d.ts +2 -0
  74. package/dist/providers/searxng.js +52 -0
  75. package/dist/providers/searxng.js.map +1 -0
  76. package/dist/providers/semantic_scholar.d.ts +2 -0
  77. package/dist/providers/semantic_scholar.js +54 -0
  78. package/dist/providers/semantic_scholar.js.map +1 -0
  79. package/dist/providers/stack_exchange.d.ts +2 -0
  80. package/dist/providers/stack_exchange.js +83 -0
  81. package/dist/providers/stack_exchange.js.map +1 -0
  82. package/dist/providers/tavily.d.ts +2 -0
  83. package/dist/providers/tavily.js +66 -0
  84. package/dist/providers/tavily.js.map +1 -0
  85. package/dist/providers/wiby.d.ts +2 -0
  86. package/dist/providers/wiby.js +46 -0
  87. package/dist/providers/wiby.js.map +1 -0
  88. package/dist/providers/wikidata.d.ts +2 -0
  89. package/dist/providers/wikidata.js +46 -0
  90. package/dist/providers/wikidata.js.map +1 -0
  91. package/dist/providers/wikipedia.d.ts +2 -0
  92. package/dist/providers/wikipedia.js +71 -0
  93. package/dist/providers/wikipedia.js.map +1 -0
  94. package/dist/providers/wiktionary.d.ts +2 -0
  95. package/dist/providers/wiktionary.js +48 -0
  96. package/dist/providers/wiktionary.js.map +1 -0
  97. package/dist/providers/yep.d.ts +2 -0
  98. package/dist/providers/yep.js +104 -0
  99. package/dist/providers/yep.js.map +1 -0
  100. package/dist/quota.d.ts +37 -0
  101. package/dist/quota.js +116 -0
  102. package/dist/quota.js.map +1 -0
  103. package/dist/rate-limiter.d.ts +7 -0
  104. package/dist/rate-limiter.js +37 -0
  105. package/dist/rate-limiter.js.map +1 -0
  106. package/dist/retry.d.ts +11 -0
  107. package/dist/retry.js +51 -0
  108. package/dist/retry.js.map +1 -0
  109. package/dist/types.d.ts +231 -0
  110. package/dist/types.js +2 -0
  111. package/dist/types.js.map +1 -0
  112. package/package.json +58 -0
@@ -0,0 +1,52 @@
1
+ import { normalize } from "../normalizer.js";
2
+ import { RetryableError } from "../retry.js";
3
+ import { getEnvVar } from "../config.js";
4
+ import { infobrokerFetch } from "../http.js";
5
+ let _searxngUrl;
6
+ function searxngUrl() {
7
+ if (_searxngUrl === undefined)
8
+ _searxngUrl = getEnvVar("searxng", "_URL");
9
+ return _searxngUrl;
10
+ }
11
+ async function search(query) {
12
+ const baseUrl = searxngUrl();
13
+ if (!baseUrl)
14
+ throw new Error("INFOBROKER_SEARXNG_URL not set");
15
+ const params = new URLSearchParams({ q: query, format: "json" });
16
+ const resp = await infobrokerFetch(`${baseUrl}/search?${params.toString()}`, { providerSlug: "searxng" });
17
+ if (!resp.ok)
18
+ throw new RetryableError(`SearXNG returned HTTP ${resp.status}`, resp.status);
19
+ const data = (await resp.json());
20
+ const raw = (data.results || []).slice(0, 10).map((item) => ({
21
+ title: item.title,
22
+ url: item.url,
23
+ snippet: item.content || "",
24
+ published_date: item.publishedDate,
25
+ source_type: "web_search",
26
+ }));
27
+ return normalize(raw, "searxng");
28
+ }
29
+ async function health() {
30
+ const baseUrl = searxngUrl();
31
+ if (!baseUrl)
32
+ return { status: "inactive", avgLatencyMs: 0 };
33
+ const start = Date.now();
34
+ try {
35
+ const resp = await infobrokerFetch(`${baseUrl}/search?q=test&format=json`, { providerSlug: "searxng" });
36
+ const elapsed = Date.now() - start;
37
+ if (resp.ok)
38
+ return { status: "active", avgLatencyMs: elapsed };
39
+ return { status: "degraded", avgLatencyMs: elapsed };
40
+ }
41
+ catch {
42
+ return { status: "inactive", avgLatencyMs: Date.now() - start };
43
+ }
44
+ }
45
+ export const provider = {
46
+ slug: "searxng",
47
+ tier: "self_hosted_http",
48
+ capabilities: ["web_search"],
49
+ search,
50
+ health,
51
+ };
52
+ //# sourceMappingURL=searxng.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searxng.js","sourceRoot":"","sources":["../../src/providers/searxng.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,IAAI,WAA+B,CAAC;AACpC,SAAS,UAAU;IACjB,IAAI,WAAW,KAAK,SAAS;QAAE,WAAW,GAAG,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC1E,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,KAAa;IACjC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAEhE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,OAAO,WAAW,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;IAE1G,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,cAAc,CAAC,yBAAyB,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAE5F,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAE9B,CAAC;IAEF,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3D,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;QAC3B,cAAc,EAAE,IAAI,CAAC,aAAa;QAClC,WAAW,EAAE,YAAY;KAC1B,CAAC,CAAC,CAAC;IAEJ,OAAO,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,MAAM;IACnB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IAE7D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,OAAO,4BAA4B,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;QACxG,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACnC,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;QAChE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAClE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAa;IAChC,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,kBAAkB;IACxB,YAAY,EAAE,CAAC,YAAY,CAAC;IAC5B,MAAM;IACN,MAAM;CACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Provider } from "../types.js";
2
+ export declare const provider: Provider;
@@ -0,0 +1,54 @@
1
+ import { normalize } from "../normalizer.js";
2
+ import { RetryableError } from "../retry.js";
3
+ import { getEnvVar } from "../config.js";
4
+ import { infobrokerFetch } from "../http.js";
5
+ const SS_API = "https://api.semanticscholar.org/graph/v1/paper/search";
6
+ let _ssApiKey;
7
+ function ssApiKey() {
8
+ if (_ssApiKey === undefined)
9
+ _ssApiKey = getEnvVar("semantic_scholar", "_API_KEY");
10
+ return _ssApiKey;
11
+ }
12
+ async function search(query) {
13
+ const params = new URLSearchParams({ query, limit: "10" });
14
+ const headers = {};
15
+ const key = ssApiKey();
16
+ if (key)
17
+ headers["x-api-key"] = key;
18
+ const resp = await infobrokerFetch(`${SS_API}?${params.toString()}`, {
19
+ providerSlug: "semantic_scholar",
20
+ headers,
21
+ });
22
+ if (!resp.ok)
23
+ throw new RetryableError(`Semantic Scholar returned HTTP ${resp.status}`, resp.status);
24
+ const data = (await resp.json());
25
+ const raw = (data.data || []).map((item) => ({
26
+ title: item.title,
27
+ url: `https://api.semanticscholar.org/${item.paperId}`,
28
+ snippet: item.abstract || "",
29
+ published_date: item.year ? String(item.year) : undefined,
30
+ source_type: "academic",
31
+ }));
32
+ return normalize(raw, "semantic_scholar");
33
+ }
34
+ async function health() {
35
+ const start = Date.now();
36
+ try {
37
+ const resp = await infobrokerFetch(`${SS_API}?query=test&limit=1`, { providerSlug: "semantic_scholar" });
38
+ const elapsed = Date.now() - start;
39
+ if (resp.ok)
40
+ return { status: "active", avgLatencyMs: elapsed };
41
+ return { status: "degraded", avgLatencyMs: elapsed };
42
+ }
43
+ catch {
44
+ return { status: "inactive", avgLatencyMs: Date.now() - start };
45
+ }
46
+ }
47
+ export const provider = {
48
+ slug: "semantic_scholar",
49
+ tier: "free_http",
50
+ capabilities: ["academic"],
51
+ search,
52
+ health,
53
+ };
54
+ //# sourceMappingURL=semantic_scholar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic_scholar.js","sourceRoot":"","sources":["../../src/providers/semantic_scholar.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,GAAG,uDAAuD,CAAC;AAEvE,IAAI,SAA6B,CAAC;AAClC,SAAS,QAAQ;IACf,IAAI,SAAS,KAAK,SAAS;QAAE,SAAS,GAAG,SAAS,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;IACnF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,KAAa;IACjC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3D,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IACvB,IAAI,GAAG;QAAE,OAAO,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC;IAEpC,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE;QACnE,YAAY,EAAE,kBAAkB;QAChC,OAAO;KACR,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,cAAc,CAAC,kCAAkC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAErG,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAE9B,CAAC;IAEF,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3C,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,mCAAmC,IAAI,CAAC,OAAO,EAAE;QACtD,OAAO,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;QAC5B,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QACzD,WAAW,EAAE,UAAU;KACxB,CAAC,CAAC,CAAC;IAEJ,OAAO,SAAS,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,MAAM;IACnB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,MAAM,qBAAqB,EAAE,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACzG,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACnC,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;QAChE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAClE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAa;IAChC,IAAI,EAAE,kBAAkB;IACxB,IAAI,EAAE,WAAW;IACjB,YAAY,EAAE,CAAC,UAAU,CAAC;IAC1B,MAAM;IACN,MAAM;CACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Provider } from "../types.js";
2
+ export declare const provider: Provider;
@@ -0,0 +1,83 @@
1
+ import { normalize } from "../normalizer.js";
2
+ import { RetryableError } from "../retry.js";
3
+ import { getEnvVar } from "../config.js";
4
+ import { infobrokerFetch } from "../http.js";
5
+ import { stripHtml } from "../lib/html.js";
6
+ const SE_API = "https://api.stackexchange.com/2.3/search/advanced";
7
+ let _seApiKey;
8
+ function seApiKey() {
9
+ if (_seApiKey === undefined)
10
+ _seApiKey = getEnvVar("stack_exchange", "_API_KEY");
11
+ return _seApiKey;
12
+ }
13
+ async function search(query) {
14
+ const params = new URLSearchParams({
15
+ q: query,
16
+ site: "stackoverflow",
17
+ pagesize: "10",
18
+ order: "desc",
19
+ sort: "relevance",
20
+ filter: "withbody",
21
+ });
22
+ const key = seApiKey();
23
+ if (key)
24
+ params.set("key", key);
25
+ const resp = await infobrokerFetch(`${SE_API}?${params.toString()}`, { providerSlug: "stack_exchange" });
26
+ if (!resp.ok)
27
+ throw new RetryableError(`Stack Exchange returned HTTP ${resp.status}`, resp.status);
28
+ const data = (await resp.json());
29
+ const raw = (data.items || []).map((item) => ({
30
+ title: stripHtml(item.title),
31
+ url: item.link,
32
+ snippet: stripHtml(item.body || "").slice(0, 500),
33
+ published_date: item.creation_date ? new Date(item.creation_date * 1000).toISOString() : undefined,
34
+ source_type: "code",
35
+ }));
36
+ return normalize(raw, "stack_exchange");
37
+ }
38
+ async function fetchPage(url) {
39
+ const id = extractQuestionId(url);
40
+ if (!id)
41
+ throw new Error("Could not extract Stack Exchange question ID from URL");
42
+ const params = new URLSearchParams({
43
+ site: "stackoverflow",
44
+ filter: "withbody",
45
+ });
46
+ const key = seApiKey();
47
+ if (key)
48
+ params.set("key", key);
49
+ const answersUrl = `https://api.stackexchange.com/2.3/questions/${id}/answers?${params.toString()}`;
50
+ const resp = await infobrokerFetch(answersUrl, { providerSlug: "stack_exchange" });
51
+ if (!resp.ok)
52
+ throw new RetryableError(`Stack Exchange returned HTTP ${resp.status}`, resp.status);
53
+ const data = (await resp.json());
54
+ const sorted = (data.items || []).sort((a, b) => b.score - a.score);
55
+ const topAnswers = sorted.slice(0, 3);
56
+ return topAnswers.map((a) => stripHtml(a.body || "").slice(0, 2000)).join("\n\n---\n\n");
57
+ }
58
+ async function health() {
59
+ const start = Date.now();
60
+ try {
61
+ const resp = await infobrokerFetch(`${SE_API}?q=test&site=stackoverflow&pagesize=1`, { providerSlug: "stack_exchange" });
62
+ const elapsed = Date.now() - start;
63
+ if (resp.ok)
64
+ return { status: "active", avgLatencyMs: elapsed };
65
+ return { status: "degraded", avgLatencyMs: elapsed };
66
+ }
67
+ catch {
68
+ return { status: "inactive", avgLatencyMs: Date.now() - start };
69
+ }
70
+ }
71
+ function extractQuestionId(url) {
72
+ const match = url.match(/\/(?:questions|q)\/(\d+)/);
73
+ return match ? match[1] : null;
74
+ }
75
+ export const provider = {
76
+ slug: "stack_exchange",
77
+ tier: "free_http",
78
+ capabilities: ["code", "content_fetch"],
79
+ search,
80
+ fetchPage,
81
+ health,
82
+ };
83
+ //# sourceMappingURL=stack_exchange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack_exchange.js","sourceRoot":"","sources":["../../src/providers/stack_exchange.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Provider } from "../types.js";
2
+ export declare const provider: Provider;
@@ -0,0 +1,66 @@
1
+ import { normalize } from "../normalizer.js";
2
+ import { RetryableError } from "../retry.js";
3
+ import { getEnvVar } from "../config.js";
4
+ import { infobrokerFetch } from "../http.js";
5
+ const TAVILY_API = "https://api.tavily.com/search";
6
+ let _tavilyApiKey;
7
+ function tavilyApiKey() {
8
+ if (_tavilyApiKey === undefined)
9
+ _tavilyApiKey = getEnvVar("tavily", "_API_KEY");
10
+ return _tavilyApiKey;
11
+ }
12
+ async function search(query) {
13
+ const apiKey = tavilyApiKey();
14
+ if (!apiKey)
15
+ throw new Error("INFOBROKER_TAVILY_API_KEY not set");
16
+ const resp = await infobrokerFetch(TAVILY_API, {
17
+ method: "POST",
18
+ headers: {
19
+ "Content-Type": "application/json",
20
+ },
21
+ body: JSON.stringify({ api_key: apiKey, query, max_results: 10, include_answer: false }),
22
+ providerSlug: "tavily",
23
+ });
24
+ if (!resp.ok)
25
+ throw new RetryableError(`Tavily returned HTTP ${resp.status}`, resp.status);
26
+ const data = (await resp.json());
27
+ const raw = (data.results || []).map((item) => ({
28
+ title: item.title,
29
+ url: item.url,
30
+ snippet: item.content,
31
+ published_date: item.published_date,
32
+ source_type: "synthesis",
33
+ }));
34
+ return normalize(raw, "tavily");
35
+ }
36
+ async function health() {
37
+ const apiKey = tavilyApiKey();
38
+ if (!apiKey)
39
+ return { status: "inactive", avgLatencyMs: 0 };
40
+ const start = Date.now();
41
+ try {
42
+ const resp = await infobrokerFetch(TAVILY_API, {
43
+ method: "POST",
44
+ headers: {
45
+ "Content-Type": "application/json",
46
+ },
47
+ body: JSON.stringify({ api_key: apiKey, query: "test", max_results: 1 }),
48
+ providerSlug: "tavily",
49
+ });
50
+ const elapsed = Date.now() - start;
51
+ if (resp.ok)
52
+ return { status: "active", avgLatencyMs: elapsed };
53
+ return { status: "degraded", avgLatencyMs: elapsed };
54
+ }
55
+ catch {
56
+ return { status: "inactive", avgLatencyMs: Date.now() - start };
57
+ }
58
+ }
59
+ export const provider = {
60
+ slug: "tavily",
61
+ tier: "keyed_http",
62
+ capabilities: ["web_search"],
63
+ search,
64
+ health,
65
+ };
66
+ //# sourceMappingURL=tavily.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tavily.js","sourceRoot":"","sources":["../../src/providers/tavily.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Provider } from "../types.js";
2
+ export declare const provider: Provider;
@@ -0,0 +1,46 @@
1
+ // @implements REQ-020
2
+ import * as cheerio from "cheerio";
3
+ import { normalize } from "../normalizer.js";
4
+ import { RetryableError } from "../retry.js";
5
+ import { infobrokerFetch } from "../http.js";
6
+ const WIBY_URL = "https://wiby.me/";
7
+ async function search(query) {
8
+ const resp = await infobrokerFetch(`${WIBY_URL}?q=${encodeURIComponent(query)}`, { providerSlug: "wiby" });
9
+ if (!resp.ok)
10
+ throw new RetryableError(`Wiby returned HTTP ${resp.status}`, resp.status);
11
+ const html = await resp.text();
12
+ const $ = cheerio.load(html);
13
+ const raw = [];
14
+ $("a[rel='noopener']").each((_i, el) => {
15
+ if (raw.length >= 10)
16
+ return false;
17
+ const link = $(el).attr("href") || "";
18
+ const title = $(el).text().trim();
19
+ const snippet = "";
20
+ if (title && link) {
21
+ raw.push({ title, url: link, snippet });
22
+ }
23
+ });
24
+ return normalize(raw, "wiby");
25
+ }
26
+ async function health() {
27
+ const start = Date.now();
28
+ try {
29
+ const resp = await infobrokerFetch(`${WIBY_URL}?q=test`, { providerSlug: "wiby" });
30
+ const elapsed = Date.now() - start;
31
+ if (resp.ok)
32
+ return { status: "active", avgLatencyMs: elapsed };
33
+ return { status: "degraded", avgLatencyMs: elapsed };
34
+ }
35
+ catch {
36
+ return { status: "inactive", avgLatencyMs: Date.now() - start };
37
+ }
38
+ }
39
+ export const provider = {
40
+ slug: "wiby",
41
+ tier: "builtin",
42
+ capabilities: ["web_search"],
43
+ search,
44
+ health,
45
+ };
46
+ //# sourceMappingURL=wiby.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiby.js","sourceRoot":"","sources":["../../src/providers/wiby.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,QAAQ,GAAG,kBAAkB,CAAC;AAEpC,KAAK,UAAU,MAAM,CAAC,KAAa;IACjC,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,QAAQ,MAAM,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;IAE3G,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,cAAc,CAAC,sBAAsB,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAEzF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7B,MAAM,GAAG,GAAmC,EAAE,CAAC;IAC/C,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;QACrC,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE;YAAE,OAAO,KAAK,CAAC;QACnC,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,MAAM;IACnB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,QAAQ,SAAS,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;QACnF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACnC,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;QAChE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAClE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAa;IAChC,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,SAAS;IACf,YAAY,EAAE,CAAC,YAAY,CAAC;IAC5B,MAAM;IACN,MAAM;CACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Provider } from "../types.js";
2
+ export declare const provider: Provider;
@@ -0,0 +1,46 @@
1
+ import { normalize } from "../normalizer.js";
2
+ import { RetryableError } from "../retry.js";
3
+ import { infobrokerFetch } from "../http.js";
4
+ const WIKIDATA_API = "https://www.wikidata.org/w/api.php";
5
+ async function search(query) {
6
+ const params = new URLSearchParams({
7
+ action: "wbsearchentities",
8
+ search: query,
9
+ language: "en",
10
+ limit: "10",
11
+ format: "json",
12
+ origin: "*",
13
+ });
14
+ const resp = await infobrokerFetch(`${WIKIDATA_API}?${params.toString()}`, { providerSlug: "wikidata" });
15
+ if (!resp.ok)
16
+ throw new RetryableError(`Wikidata returned HTTP ${resp.status}`, resp.status);
17
+ const data = (await resp.json());
18
+ const raw = (data.search || []).map((item) => ({
19
+ title: item.label,
20
+ url: `https://www.wikidata.org/wiki/${item.id}`,
21
+ snippet: item.description || "",
22
+ source_type: "structured_fact",
23
+ }));
24
+ return normalize(raw, "wikidata");
25
+ }
26
+ async function health() {
27
+ const start = Date.now();
28
+ try {
29
+ const resp = await infobrokerFetch(`${WIKIDATA_API}?action=wbsearchentities&search=test&language=en&format=json&origin=*`, { providerSlug: "wikidata" });
30
+ const elapsed = Date.now() - start;
31
+ if (resp.ok)
32
+ return { status: "active", avgLatencyMs: elapsed };
33
+ return { status: "degraded", avgLatencyMs: elapsed };
34
+ }
35
+ catch {
36
+ return { status: "inactive", avgLatencyMs: Date.now() - start };
37
+ }
38
+ }
39
+ export const provider = {
40
+ slug: "wikidata",
41
+ tier: "free_http",
42
+ capabilities: ["encyclopedia"],
43
+ search,
44
+ health,
45
+ };
46
+ //# sourceMappingURL=wikidata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wikidata.js","sourceRoot":"","sources":["../../src/providers/wikidata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,YAAY,GAAG,oCAAoC,CAAC;AAE1D,KAAK,UAAU,MAAM,CAAC,KAAa;IACjC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,YAAY,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC;IAEzG,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,cAAc,CAAC,0BAA0B,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAE7F,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAE9B,CAAC;IAEF,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7C,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,iCAAiC,IAAI,CAAC,EAAE,EAAE;QAC/C,OAAO,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;QAC/B,WAAW,EAAE,iBAAiB;KAC/B,CAAC,CAAC,CAAC;IAEJ,OAAO,SAAS,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,MAAM;IACnB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,eAAe,CAChC,GAAG,YAAY,uEAAuE,EACtF,EAAE,YAAY,EAAE,UAAU,EAAE,CAC7B,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACnC,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;QAChE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAClE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAa;IAChC,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,WAAW;IACjB,YAAY,EAAE,CAAC,cAAc,CAAC;IAC9B,MAAM;IACN,MAAM;CACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Provider } from "../types.js";
2
+ export declare const provider: Provider;
@@ -0,0 +1,71 @@
1
+ import { normalize } from "../normalizer.js";
2
+ import { RetryableError } from "../retry.js";
3
+ import { infobrokerFetch } from "../http.js";
4
+ import { stripHtml } from "../lib/html.js";
5
+ const WIKI_API = "https://en.wikipedia.org/w/api.php";
6
+ async function search(query, options) {
7
+ const maxResults = options?.max_results ?? 10;
8
+ const params = new URLSearchParams({
9
+ action: "query",
10
+ list: "search",
11
+ srsearch: query,
12
+ srlimit: String(maxResults),
13
+ format: "json",
14
+ origin: "*",
15
+ });
16
+ const resp = await infobrokerFetch(`${WIKI_API}?${params.toString()}`, { providerSlug: "wikipedia" });
17
+ if (!resp.ok) {
18
+ throw new RetryableError(`Wikipedia returned HTTP ${resp.status}`, resp.status);
19
+ }
20
+ const data = (await resp.json());
21
+ const raw = (data.query?.search || []).map((item) => ({
22
+ title: item.title,
23
+ url: `https://en.wikipedia.org/wiki/${encodeURIComponent(item.title.replace(/ /g, "_"))}`,
24
+ snippet: stripHtml(item.snippet || ""),
25
+ published_date: item.timestamp,
26
+ source_type: "encyclopedia",
27
+ }));
28
+ return normalize(raw, "wikipedia");
29
+ }
30
+ async function fetchPage(url) {
31
+ const title = extractTitle(url);
32
+ const params = new URLSearchParams({
33
+ action: "parse",
34
+ page: title,
35
+ prop: "text",
36
+ format: "json",
37
+ origin: "*",
38
+ });
39
+ const resp = await infobrokerFetch(`${WIKI_API}?${params.toString()}`, { providerSlug: "wikipedia" });
40
+ if (!resp.ok) {
41
+ throw new RetryableError(`Wikipedia returned HTTP ${resp.status}`, resp.status);
42
+ }
43
+ const data = (await resp.json());
44
+ return stripHtml(data.parse?.text?.["*"] || "(no content)");
45
+ }
46
+ async function health() {
47
+ const start = Date.now();
48
+ try {
49
+ const resp = await infobrokerFetch(`${WIKI_API}?action=query&list=search&srsearch=test&format=json&origin=*`, { providerSlug: "wikipedia" });
50
+ const elapsed = Date.now() - start;
51
+ if (resp.ok)
52
+ return { status: "active", avgLatencyMs: elapsed };
53
+ return { status: "degraded", avgLatencyMs: elapsed };
54
+ }
55
+ catch {
56
+ return { status: "inactive", avgLatencyMs: Date.now() - start };
57
+ }
58
+ }
59
+ function extractTitle(url) {
60
+ const match = url.match(/wiki\/([^#?]+)/);
61
+ return match ? decodeURIComponent(match[1]).replace(/_/g, " ") : url;
62
+ }
63
+ export const provider = {
64
+ slug: "wikipedia",
65
+ tier: "free_http",
66
+ capabilities: ["encyclopedia", "content_fetch"],
67
+ search,
68
+ fetchPage,
69
+ health,
70
+ };
71
+ //# sourceMappingURL=wikipedia.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wikipedia.js","sourceRoot":"","sources":["../../src/providers/wikipedia.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,QAAQ,GAAG,oCAAoC,CAAC;AAEtD,KAAK,UAAU,MAAM,CAAC,KAAa,EAAE,OAAuB;IAC1D,MAAM,UAAU,GAAG,OAAO,EAAE,WAAW,IAAI,EAAE,CAAC;IAE9C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC;QAC3B,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;IAEtG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,cAAc,CAAC,2BAA2B,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAE9B,CAAC;IAEF,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACpD,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,iCAAiC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE;QACzF,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACtC,cAAc,EAAE,IAAI,CAAC,SAAS;QAC9B,WAAW,EAAE,cAAc;KAC5B,CAAC,CAAC,CAAC;IAEJ,OAAO,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;IAEtG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,cAAc,CAAC,2BAA2B,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAE9B,CAAC;IAEF,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,CAAC;AAC9D,CAAC;AAED,KAAK,UAAU,MAAM;IACnB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,eAAe,CAChC,GAAG,QAAQ,8DAA8D,EACzE,EAAE,YAAY,EAAE,WAAW,EAAE,CAC9B,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACnC,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;QAChE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAClE,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAa;IAChC,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,WAAW;IACjB,YAAY,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC;IAC/C,MAAM;IACN,SAAS;IACT,MAAM;CACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Provider } from "../types.js";
2
+ export declare const provider: Provider;
@@ -0,0 +1,48 @@
1
+ import { normalize } from "../normalizer.js";
2
+ import { RetryableError } from "../retry.js";
3
+ import { infobrokerFetch } from "../http.js";
4
+ import { stripHtml } from "../lib/html.js";
5
+ const WIKTIONARY_API = "https://en.wiktionary.org/w/api.php";
6
+ async function search(query) {
7
+ const params = new URLSearchParams({
8
+ action: "query",
9
+ list: "search",
10
+ srsearch: query,
11
+ srlimit: "10",
12
+ format: "json",
13
+ origin: "*",
14
+ });
15
+ const resp = await infobrokerFetch(`${WIKTIONARY_API}?${params.toString()}`, { providerSlug: "wiktionary" });
16
+ if (!resp.ok)
17
+ throw new RetryableError(`Wiktionary returned HTTP ${resp.status}`, resp.status);
18
+ const data = (await resp.json());
19
+ const raw = (data.query?.search || []).map((item) => ({
20
+ title: item.title,
21
+ url: `https://en.wiktionary.org/wiki/${encodeURIComponent(item.title.replace(/ /g, "_"))}`,
22
+ snippet: stripHtml(item.snippet || ""),
23
+ published_date: item.timestamp,
24
+ source_type: "definition",
25
+ }));
26
+ return normalize(raw, "wiktionary");
27
+ }
28
+ async function health() {
29
+ const start = Date.now();
30
+ try {
31
+ const resp = await infobrokerFetch(`${WIKTIONARY_API}?action=query&list=search&srsearch=test&format=json&origin=*`, { providerSlug: "wiktionary" });
32
+ const elapsed = Date.now() - start;
33
+ if (resp.ok)
34
+ return { status: "active", avgLatencyMs: elapsed };
35
+ return { status: "degraded", avgLatencyMs: elapsed };
36
+ }
37
+ catch {
38
+ return { status: "inactive", avgLatencyMs: Date.now() - start };
39
+ }
40
+ }
41
+ export const provider = {
42
+ slug: "wiktionary",
43
+ tier: "free_http",
44
+ capabilities: ["encyclopedia"],
45
+ search,
46
+ health,
47
+ };
48
+ //# sourceMappingURL=wiktionary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiktionary.js","sourceRoot":"","sources":["../../src/providers/wiktionary.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,cAAc,GAAG,qCAAqC,CAAC;AAE7D,KAAK,UAAU,MAAM,CAAC,KAAa;IACjC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,cAAc,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;IAE7G,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,cAAc,CAAC,4BAA4B,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAE/F,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAE9B,CAAC;IAEF,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACpD,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,kCAAkC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE;QAC1F,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACtC,cAAc,EAAE,IAAI,CAAC,SAAS;QAC9B,WAAW,EAAE,YAAY;KAC1B,CAAC,CAAC,CAAC;IAEJ,OAAO,SAAS,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,MAAM;IACnB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,eAAe,CAChC,GAAG,cAAc,8DAA8D,EAC/E,EAAE,YAAY,EAAE,YAAY,EAAE,CAC/B,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACnC,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;QAChE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAClE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAa;IAChC,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,WAAW;IACjB,YAAY,EAAE,CAAC,cAAc,CAAC;IAC9B,MAAM;IACN,MAAM;CACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Provider } from "../types.js";
2
+ export declare const provider: Provider;