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,104 @@
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 YEP_API = "https://platform.yep.com/api/search";
6
+ let _yepApiKey;
7
+ function yepApiKey() {
8
+ if (_yepApiKey === undefined)
9
+ _yepApiKey = getEnvVar("yep", "_API_KEY");
10
+ return _yepApiKey;
11
+ }
12
+ async function search(query, options) {
13
+ const apiKey = yepApiKey();
14
+ if (!apiKey)
15
+ throw new Error("INFOBROKER_YEP_API_KEY not set");
16
+ const body = {
17
+ query,
18
+ type: "highlights",
19
+ limit: options?.max_results ?? 10,
20
+ };
21
+ if (options?.region)
22
+ body.location = options.region;
23
+ if (options?.safe_search === "strict")
24
+ body.safe_search = true;
25
+ if (options?.content_type && options.content_type !== "all") {
26
+ body.content_type = mapContentType(options.content_type);
27
+ }
28
+ if (options?.time_range) {
29
+ body.start_published_date = mapTimeRange(options.time_range);
30
+ }
31
+ const resp = await infobrokerFetch(YEP_API, {
32
+ providerSlug: "yep",
33
+ method: "POST",
34
+ headers: {
35
+ "Authorization": `Bearer ${apiKey}`,
36
+ "Content-Type": "application/json",
37
+ },
38
+ body: JSON.stringify(body),
39
+ });
40
+ if (resp.status === 402)
41
+ throw new RetryableError("Yep returned HTTP 402 (insufficient balance)", 402);
42
+ if (!resp.ok)
43
+ throw new RetryableError(`Yep returned HTTP ${resp.status}`, resp.status);
44
+ const data = (await resp.json());
45
+ const raw = (data.results || []).map((item) => ({
46
+ title: item.title,
47
+ url: item.url,
48
+ snippet: item.description || item.highlights?.join(" ") || "",
49
+ published_date: item.published_date,
50
+ source_type: "web_search",
51
+ }));
52
+ return normalize(raw, "yep");
53
+ }
54
+ async function health() {
55
+ const apiKey = yepApiKey();
56
+ if (!apiKey)
57
+ return { status: "inactive", avgLatencyMs: 0 };
58
+ const start = Date.now();
59
+ try {
60
+ const resp = await infobrokerFetch(YEP_API, {
61
+ providerSlug: "yep",
62
+ method: "POST",
63
+ headers: {
64
+ "Authorization": `Bearer ${apiKey}`,
65
+ "Content-Type": "application/json",
66
+ },
67
+ body: JSON.stringify({ query: "test", type: "basic", limit: 1 }),
68
+ });
69
+ const elapsed = Date.now() - start;
70
+ if (resp.ok)
71
+ return { status: "active", avgLatencyMs: elapsed };
72
+ return { status: "degraded", avgLatencyMs: elapsed };
73
+ }
74
+ catch {
75
+ return { status: "inactive", avgLatencyMs: Date.now() - start };
76
+ }
77
+ }
78
+ const YEP_CONTENT_TYPES = {
79
+ docs: "Document",
80
+ blog: "Article",
81
+ issue: "User_Generated_Content",
82
+ spec: "Document",
83
+ changelog: "Article",
84
+ };
85
+ function mapContentType(ct) {
86
+ return YEP_CONTENT_TYPES[ct] ?? "Article";
87
+ }
88
+ function mapTimeRange(range) {
89
+ const map = {
90
+ day: new Date(Date.now() - 86400000).toISOString().slice(0, 10),
91
+ week: new Date(Date.now() - 7 * 86400000).toISOString().slice(0, 10),
92
+ month: new Date(Date.now() - 30 * 86400000).toISOString().slice(0, 10),
93
+ year: new Date(Date.now() - 365 * 86400000).toISOString().slice(0, 10),
94
+ };
95
+ return map[range] || "";
96
+ }
97
+ export const provider = {
98
+ slug: "yep",
99
+ tier: "keyed_http",
100
+ capabilities: ["web_search", "semantic", "synthesis"],
101
+ search,
102
+ health,
103
+ };
104
+ //# sourceMappingURL=yep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yep.js","sourceRoot":"","sources":["../../src/providers/yep.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ interface QuotaCounter {
2
+ daily: {
3
+ count: number;
4
+ resetAt: string;
5
+ };
6
+ monthly: {
7
+ count: number;
8
+ resetAt: string;
9
+ };
10
+ }
11
+ export declare function loadQuotaState(): void;
12
+ export declare function getOrCreateCounter(slug: string): QuotaCounter;
13
+ export interface QuotaReport {
14
+ exhausted: boolean;
15
+ warning: boolean;
16
+ daily: {
17
+ used: number;
18
+ remaining: number;
19
+ resetAt: string;
20
+ };
21
+ monthly: {
22
+ used: number;
23
+ remaining: number;
24
+ resetAt: string;
25
+ };
26
+ }
27
+ export declare function increment(slug: string, limits?: {
28
+ per_day?: number;
29
+ per_month?: number;
30
+ }): QuotaReport;
31
+ export declare function checkQuota(slug: string, limits?: {
32
+ per_day?: number;
33
+ per_month?: number;
34
+ }): QuotaReport;
35
+ export declare function getQuotaStatePath(): string;
36
+ export declare function getCounter(slug: string): QuotaCounter | undefined;
37
+ export {};
package/dist/quota.js ADDED
@@ -0,0 +1,116 @@
1
+ // @implements REQ-033 REQ-034
2
+ import { mkdirSync, readFileSync, writeFileSync, existsSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { tmpdir } from "node:os";
5
+ const QUOTA_DIR = join(tmpdir(), "infobroker");
6
+ const QUOTA_FILE = join(QUOTA_DIR, "quota.json");
7
+ let quotaState = { providers: {} };
8
+ let writeTimer = null;
9
+ const WRITE_INTERVAL_MS = 30_000;
10
+ function ensureDir() {
11
+ if (!existsSync(QUOTA_DIR)) {
12
+ mkdirSync(QUOTA_DIR, { recursive: true });
13
+ }
14
+ }
15
+ function scheduleWrite() {
16
+ if (writeTimer)
17
+ return;
18
+ writeTimer = setTimeout(() => {
19
+ writeTimer = null;
20
+ saveQuotaState();
21
+ }, WRITE_INTERVAL_MS);
22
+ }
23
+ function flushWrite() {
24
+ if (writeTimer) {
25
+ clearTimeout(writeTimer);
26
+ writeTimer = null;
27
+ saveQuotaState();
28
+ }
29
+ }
30
+ process.on("beforeExit", () => flushWrite());
31
+ function getDailyReset() {
32
+ const now = new Date();
33
+ const reset = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() + 1));
34
+ return reset.toISOString();
35
+ }
36
+ function getMonthlyReset() {
37
+ const now = new Date();
38
+ const reset = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth() + 1, 1));
39
+ return reset.toISOString();
40
+ }
41
+ function isExpired(resetAt) {
42
+ return new Date(resetAt) < new Date(Date.now() - 30_000);
43
+ }
44
+ export function loadQuotaState() {
45
+ ensureDir();
46
+ try {
47
+ if (existsSync(QUOTA_FILE)) {
48
+ const raw = readFileSync(QUOTA_FILE, "utf-8");
49
+ quotaState = JSON.parse(raw);
50
+ }
51
+ }
52
+ catch {
53
+ quotaState = { providers: {} };
54
+ }
55
+ }
56
+ function saveQuotaState() {
57
+ ensureDir();
58
+ writeFileSync(QUOTA_FILE, JSON.stringify(quotaState, null, 2));
59
+ }
60
+ export function getOrCreateCounter(slug) {
61
+ let counter = quotaState.providers[slug];
62
+ if (!counter) {
63
+ counter = {
64
+ daily: { count: 0, resetAt: getDailyReset() },
65
+ monthly: { count: 0, resetAt: getMonthlyReset() },
66
+ };
67
+ quotaState.providers[slug] = counter;
68
+ }
69
+ if (isExpired(counter.daily.resetAt)) {
70
+ counter.daily = { count: 0, resetAt: getDailyReset() };
71
+ }
72
+ if (isExpired(counter.monthly.resetAt)) {
73
+ counter.monthly = { count: 0, resetAt: getMonthlyReset() };
74
+ }
75
+ return counter;
76
+ }
77
+ function buildReport(counter, limits) {
78
+ const dailyCap = limits?.per_day ?? Infinity;
79
+ const monthlyCap = limits?.per_month ?? Infinity;
80
+ const dailyUsed = counter.daily.count;
81
+ const monthlyUsed = counter.monthly.count;
82
+ const dailyPct = dailyUsed / dailyCap;
83
+ const monthlyPct = monthlyUsed / monthlyCap;
84
+ return {
85
+ exhausted: dailyUsed >= dailyCap || monthlyUsed >= monthlyCap,
86
+ warning: dailyPct >= 0.8 || monthlyPct >= 0.8,
87
+ daily: {
88
+ used: dailyUsed,
89
+ remaining: dailyCap < Infinity ? dailyCap - dailyUsed : Infinity,
90
+ resetAt: counter.daily.resetAt,
91
+ },
92
+ monthly: {
93
+ used: monthlyUsed,
94
+ remaining: monthlyCap < Infinity ? monthlyCap - monthlyUsed : Infinity,
95
+ resetAt: counter.monthly.resetAt,
96
+ },
97
+ };
98
+ }
99
+ export function increment(slug, limits) {
100
+ const counter = getOrCreateCounter(slug);
101
+ counter.daily.count++;
102
+ counter.monthly.count++;
103
+ scheduleWrite();
104
+ return buildReport(counter, limits);
105
+ }
106
+ export function checkQuota(slug, limits) {
107
+ const counter = getOrCreateCounter(slug);
108
+ return buildReport(counter, limits);
109
+ }
110
+ export function getQuotaStatePath() {
111
+ return QUOTA_FILE;
112
+ }
113
+ export function getCounter(slug) {
114
+ return quotaState.providers[slug];
115
+ }
116
+ //# sourceMappingURL=quota.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota.js","sourceRoot":"","sources":["../src/quota.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Config } from "./types.js";
2
+ export declare function configureProviderRateLimit(slug: string, config: {
3
+ per_second?: number;
4
+ }): void;
5
+ export declare function configureAllProviders(config: Config): void;
6
+ export declare function throttle(slug: string): Promise<void>;
7
+ export declare function removeProvider(slug: string): void;
@@ -0,0 +1,37 @@
1
+ const limits = new Map();
2
+ export function configureProviderRateLimit(slug, config) {
3
+ const perSecond = config.per_second;
4
+ if (!perSecond || perSecond <= 0)
5
+ return;
6
+ limits.set(slug, {
7
+ perSecond,
8
+ lastCall: 0,
9
+ });
10
+ }
11
+ export function configureAllProviders(config) {
12
+ for (const [slug, provider] of Object.entries(config.providers)) {
13
+ if (provider.enabled) {
14
+ configureProviderRateLimit(slug, provider.rate_limit);
15
+ }
16
+ }
17
+ }
18
+ export async function throttle(slug) {
19
+ const limit = limits.get(slug);
20
+ if (!limit || limit.perSecond <= 0)
21
+ return;
22
+ const now = Date.now();
23
+ const elapsed = now - limit.lastCall;
24
+ const minInterval = 1000 / limit.perSecond;
25
+ if (elapsed < minInterval) {
26
+ const delay = minInterval - elapsed;
27
+ await sleep(delay);
28
+ }
29
+ limits.set(slug, { ...limit, lastCall: now });
30
+ }
31
+ function sleep(ms) {
32
+ return new Promise((resolve) => setTimeout(resolve, ms));
33
+ }
34
+ export function removeProvider(slug) {
35
+ limits.delete(slug);
36
+ }
37
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,GAA2B,IAAI,GAAG,EAAE,CAAC;AAEjD,MAAM,UAAU,0BAA0B,CACxC,IAAY,EACZ,MAA+B;IAE/B,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;IACpC,IAAI,CAAC,SAAS,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO;IACzC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE;QACf,SAAS;QACT,QAAQ,EAAE,CAAC;KACZ,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAChE,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,0BAA0B,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC;QAAE,OAAO;IAE3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC;IACrC,MAAM,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC;IAE3C,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,WAAW,GAAG,OAAO,CAAC;QACpC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare class RetryableError extends Error {
2
+ status: number;
3
+ constructor(message: string, status: number);
4
+ }
5
+ export declare class ParseError extends Error {
6
+ constructor(message: string);
7
+ }
8
+ export declare function retryWithBackoff<T>(fn: () => Promise<T>, retryConfig?: {
9
+ retry_count?: number;
10
+ retry_backoff_ms?: number;
11
+ }): Promise<T>;
package/dist/retry.js ADDED
@@ -0,0 +1,51 @@
1
+ // @implements REQ-032
2
+ const DEFAULT_BASE_DELAY = 1000;
3
+ const DEFAULT_RETRY_COUNT = 3;
4
+ export class RetryableError extends Error {
5
+ status;
6
+ constructor(message, status) {
7
+ super(message);
8
+ this.status = status;
9
+ this.name = "RetryableError";
10
+ }
11
+ }
12
+ export class ParseError extends Error {
13
+ constructor(message) {
14
+ super(message);
15
+ this.name = "ParseError";
16
+ }
17
+ }
18
+ export async function retryWithBackoff(fn, retryConfig) {
19
+ const baseDelay = retryConfig?.retry_backoff_ms ?? DEFAULT_BASE_DELAY;
20
+ const maxRetries = retryConfig?.retry_count ?? DEFAULT_RETRY_COUNT;
21
+ const delays = [];
22
+ for (let i = 0; i < maxRetries; i++) {
23
+ delays.push(baseDelay * Math.pow(2, i));
24
+ }
25
+ let lastError = null;
26
+ for (let attempt = 0; attempt <= delays.length; attempt++) {
27
+ try {
28
+ return await fn();
29
+ }
30
+ catch (e) {
31
+ lastError = e instanceof Error ? e : new Error(String(e));
32
+ if (!isRetryable(lastError))
33
+ throw lastError;
34
+ if (attempt < delays.length) {
35
+ await sleep(delays[attempt] * (0.5 + Math.random() * 0.5));
36
+ }
37
+ }
38
+ }
39
+ throw lastError;
40
+ }
41
+ function isRetryable(e) {
42
+ if (e instanceof RetryableError) {
43
+ return e.status === 429 || e.status === 503;
44
+ }
45
+ const msg = e.message;
46
+ return /\b429\b|\b503\b|rate.?limit|too many requests|service unavailable/i.test(msg);
47
+ }
48
+ function sleep(ms) {
49
+ return new Promise((r) => setTimeout(r, ms));
50
+ }
51
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA,sBAAsB;AAEtB,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,MAAM,CAAS;IACf,YAAY,OAAe,EAAE,MAAc;QACzC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAoB,EACpB,WAAiE;IAEjE,MAAM,SAAS,GAAG,WAAW,EAAE,gBAAgB,IAAI,kBAAkB,CAAC;IACtE,MAAM,UAAU,GAAG,WAAW,EAAE,WAAW,IAAI,mBAAmB,CAAC;IACnE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,SAAS,GAAiB,IAAI,CAAC;IAEnC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QAC1D,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,SAAS,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;gBAAE,MAAM,SAAS,CAAC;YAC7C,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC5B,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,SAAU,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,CAAQ;IAC3B,IAAI,CAAC,YAAY,cAAc,EAAE,CAAC;QAChC,OAAO,CAAC,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC;IAC9C,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC;IACtB,OAAO,oEAAoE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,231 @@
1
+ export interface SearchResult {
2
+ title: string;
3
+ url: string;
4
+ snippet: string;
5
+ published_date?: string;
6
+ source_type?: string;
7
+ original_source?: string;
8
+ }
9
+ export interface ProviderConfig {
10
+ tier: "builtin" | "free_http" | "self_hosted_http" | "keyed_http" | "generic_http";
11
+ capabilities: string[];
12
+ rate_limit: {
13
+ per_second?: number;
14
+ per_day?: number;
15
+ per_month?: number;
16
+ };
17
+ auth_env?: string;
18
+ url_env?: string;
19
+ enabled: boolean;
20
+ priority: number;
21
+ timeout?: number;
22
+ retry_count?: number;
23
+ retry_backoff_ms?: number;
24
+ endpoint?: string;
25
+ query_param?: string;
26
+ results_path?: string;
27
+ field_map?: {
28
+ title?: string;
29
+ url?: string;
30
+ snippet?: string;
31
+ published_date?: string;
32
+ source_type?: string;
33
+ original_source?: string;
34
+ };
35
+ }
36
+ export interface Config {
37
+ providers: Record<string, ProviderConfig>;
38
+ dispatch: Record<string, string[]>;
39
+ defaults?: {
40
+ timeout?: number;
41
+ retry_count?: number;
42
+ retry_backoff_ms?: number;
43
+ };
44
+ corroboration: {
45
+ max_iterations: number;
46
+ max_http_calls: number;
47
+ confidence_threshold: number;
48
+ first_pass_max_results: number;
49
+ similarity_threshold: number;
50
+ authority_weights?: Record<string, number>;
51
+ archive_sources?: boolean;
52
+ };
53
+ output: {
54
+ max_chars: number;
55
+ latency_window_size: number;
56
+ verbose?: boolean;
57
+ fallback_depth: number;
58
+ max_redirect_hops: number;
59
+ };
60
+ fetch?: {
61
+ allow_private_urls?: boolean;
62
+ };
63
+ kb?: KbConfig;
64
+ }
65
+ export interface HealthReport {
66
+ status: "active" | "inactive" | "degraded" | "exhausted";
67
+ slug: string;
68
+ tier: string;
69
+ capabilities: string[];
70
+ quota_used?: number;
71
+ quota_remaining?: number;
72
+ quota_reset_at?: string;
73
+ avg_latency_ms?: number;
74
+ last_error?: string;
75
+ last_success?: string;
76
+ auth_ok: boolean;
77
+ }
78
+ export interface ToolMeta {
79
+ query_time_ms: number;
80
+ fallback_used: boolean;
81
+ quota_remaining?: number;
82
+ }
83
+ export interface ToolOkResponse {
84
+ status: "ok";
85
+ provider: string;
86
+ results: SearchResult[];
87
+ meta?: ToolMeta;
88
+ truncated?: boolean;
89
+ output_path?: string;
90
+ }
91
+ export interface ToolErrorResponse {
92
+ status: "error";
93
+ provider: string;
94
+ error: {
95
+ code: string;
96
+ message: string;
97
+ remediation: string;
98
+ details?: Record<string, unknown>;
99
+ };
100
+ }
101
+ export type ToolResponse = ToolOkResponse | ToolErrorResponse;
102
+ export interface CorroborationFinding {
103
+ topic: string;
104
+ claim: string;
105
+ confidence: number;
106
+ verdict: "confirmed" | "contested" | "unverified";
107
+ sources: Array<{
108
+ title: string;
109
+ url: string;
110
+ snippet: string;
111
+ claim: string;
112
+ source_type?: string;
113
+ archived_url?: string;
114
+ original_source?: string;
115
+ }>;
116
+ perspectives?: string[];
117
+ }
118
+ export interface CorroborationResult {
119
+ findings: CorroborationFinding[];
120
+ agreement_map: {
121
+ green: string[];
122
+ yellow: string[];
123
+ red: string[];
124
+ };
125
+ synthesis: string;
126
+ iteration_count: number;
127
+ providers_used: string[];
128
+ total_sources: number;
129
+ corroboration: "complete" | "partial";
130
+ provenance?: CorroborationProvenance;
131
+ }
132
+ export interface CorroborationProvenance {
133
+ tool: string;
134
+ version: string;
135
+ max_iterations: number;
136
+ confidence_threshold: number;
137
+ source_types: Record<string, number>;
138
+ }
139
+ export interface Provider {
140
+ slug: string;
141
+ tier: "builtin" | "free_http" | "self_hosted_http" | "keyed_http" | "generic_http";
142
+ capabilities: string[];
143
+ health(): Promise<{
144
+ status: string;
145
+ avgLatencyMs: number;
146
+ }>;
147
+ search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
148
+ fetchPage?(url: string): Promise<string>;
149
+ suggest?(query: string): Promise<string[]>;
150
+ }
151
+ export interface SearchOptions {
152
+ max_results?: number;
153
+ safe_search?: "on" | "off" | "strict";
154
+ time_range?: "day" | "week" | "month" | "year";
155
+ page?: number;
156
+ content_type?: string;
157
+ region?: string;
158
+ }
159
+ export interface KbConfig {
160
+ storage_path: string;
161
+ embedding_model: string;
162
+ chunk_size: number;
163
+ chunk_overlap: number;
164
+ auto_index: boolean;
165
+ default_collection: string;
166
+ max_results: number;
167
+ expiry?: Record<string, number>;
168
+ reports_dir?: string;
169
+ default_save_destination?: "kb" | "disk" | "both";
170
+ freshness?: {
171
+ tiers: Record<string, {
172
+ decay_hours: number;
173
+ expiry_hours: number;
174
+ }>;
175
+ auto_classify: boolean;
176
+ default_tier: string;
177
+ };
178
+ kb_first_relevance_threshold: number;
179
+ kb_first_confidence_threshold: number;
180
+ maintenance_interval_minutes: number;
181
+ encryption?: KbEncryptionConfig;
182
+ }
183
+ export interface KbEncryptionConfig {
184
+ enabled: boolean;
185
+ key_file?: string;
186
+ }
187
+ export interface KbChunk {
188
+ id: string;
189
+ text: string;
190
+ embedding: number[];
191
+ source_url: string;
192
+ chunk_index: number;
193
+ title: string;
194
+ provider: string;
195
+ collection: string;
196
+ source_type: string;
197
+ freshness_tier: string;
198
+ ingested_at: number;
199
+ }
200
+ export interface KbSearchResult {
201
+ score: number;
202
+ freshness_score: number;
203
+ freshness_tier: string;
204
+ source_url: string;
205
+ title: string;
206
+ snippet: string;
207
+ collection: string;
208
+ provider: string;
209
+ source_type: string;
210
+ ingested_at: number;
211
+ }
212
+ export interface KbListEntry {
213
+ source_url: string;
214
+ title: string;
215
+ collection: string;
216
+ source_type: string;
217
+ freshness_tier: string;
218
+ chunk_count: number;
219
+ ingested_at: number;
220
+ }
221
+ export interface KbStats {
222
+ chunk_count: number;
223
+ collections: Record<string, number>;
224
+ freshness_tiers?: Record<string, number>;
225
+ storage_size_bytes: number;
226
+ last_ingestion: string | null;
227
+ model_available: boolean;
228
+ model_name: string;
229
+ events: string[];
230
+ encryption?: "enabled" | "disabled" | "locked";
231
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}