@indigoai-us/cq 0.0.1

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 (177) hide show
  1. package/dist/__tests__/integration.test.d.ts +8 -0
  2. package/dist/__tests__/integration.test.d.ts.map +1 -0
  3. package/dist/__tests__/integration.test.js +233 -0
  4. package/dist/__tests__/integration.test.js.map +1 -0
  5. package/dist/budget/__tests__/budget.test.d.ts +2 -0
  6. package/dist/budget/__tests__/budget.test.d.ts.map +1 -0
  7. package/dist/budget/__tests__/budget.test.js +238 -0
  8. package/dist/budget/__tests__/budget.test.js.map +1 -0
  9. package/dist/budget/__tests__/token-tracker.test.d.ts +2 -0
  10. package/dist/budget/__tests__/token-tracker.test.d.ts.map +1 -0
  11. package/dist/budget/__tests__/token-tracker.test.js +292 -0
  12. package/dist/budget/__tests__/token-tracker.test.js.map +1 -0
  13. package/dist/budget/index.d.ts +38 -0
  14. package/dist/budget/index.d.ts.map +1 -0
  15. package/dist/budget/index.js +192 -0
  16. package/dist/budget/index.js.map +1 -0
  17. package/dist/budget/token-tracker.d.ts +62 -0
  18. package/dist/budget/token-tracker.d.ts.map +1 -0
  19. package/dist/budget/token-tracker.js +152 -0
  20. package/dist/budget/token-tracker.js.map +1 -0
  21. package/dist/budget/types.d.ts +41 -0
  22. package/dist/budget/types.d.ts.map +1 -0
  23. package/dist/budget/types.js +5 -0
  24. package/dist/budget/types.js.map +1 -0
  25. package/dist/confidence/__tests__/confidence.test.d.ts +2 -0
  26. package/dist/confidence/__tests__/confidence.test.d.ts.map +1 -0
  27. package/dist/confidence/__tests__/confidence.test.js +336 -0
  28. package/dist/confidence/__tests__/confidence.test.js.map +1 -0
  29. package/dist/confidence/erosion.d.ts +33 -0
  30. package/dist/confidence/erosion.d.ts.map +1 -0
  31. package/dist/confidence/erosion.js +42 -0
  32. package/dist/confidence/erosion.js.map +1 -0
  33. package/dist/confidence/index.d.ts +42 -0
  34. package/dist/confidence/index.d.ts.map +1 -0
  35. package/dist/confidence/index.js +168 -0
  36. package/dist/confidence/index.js.map +1 -0
  37. package/dist/confidence/types.d.ts +29 -0
  38. package/dist/confidence/types.d.ts.map +1 -0
  39. package/dist/confidence/types.js +5 -0
  40. package/dist/confidence/types.js.map +1 -0
  41. package/dist/curiosity/__tests__/curiosity.test.d.ts +2 -0
  42. package/dist/curiosity/__tests__/curiosity.test.d.ts.map +1 -0
  43. package/dist/curiosity/__tests__/curiosity.test.js +280 -0
  44. package/dist/curiosity/__tests__/curiosity.test.js.map +1 -0
  45. package/dist/curiosity/dedup.d.ts +29 -0
  46. package/dist/curiosity/dedup.d.ts.map +1 -0
  47. package/dist/curiosity/dedup.js +64 -0
  48. package/dist/curiosity/dedup.js.map +1 -0
  49. package/dist/curiosity/index.d.ts +56 -0
  50. package/dist/curiosity/index.d.ts.map +1 -0
  51. package/dist/curiosity/index.js +163 -0
  52. package/dist/curiosity/index.js.map +1 -0
  53. package/dist/curiosity/types.d.ts +29 -0
  54. package/dist/curiosity/types.d.ts.map +1 -0
  55. package/dist/curiosity/types.js +5 -0
  56. package/dist/curiosity/types.js.map +1 -0
  57. package/dist/index.d.ts +25 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +16 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/index.test.d.ts +2 -0
  62. package/dist/index.test.d.ts.map +1 -0
  63. package/dist/index.test.js +7 -0
  64. package/dist/index.test.js.map +1 -0
  65. package/dist/init.d.ts +17 -0
  66. package/dist/init.d.ts.map +1 -0
  67. package/dist/init.js +153 -0
  68. package/dist/init.js.map +1 -0
  69. package/dist/knowledge-tree/__tests__/knowledge-tree.test.d.ts +2 -0
  70. package/dist/knowledge-tree/__tests__/knowledge-tree.test.d.ts.map +1 -0
  71. package/dist/knowledge-tree/__tests__/knowledge-tree.test.js +317 -0
  72. package/dist/knowledge-tree/__tests__/knowledge-tree.test.js.map +1 -0
  73. package/dist/knowledge-tree/format.d.ts +17 -0
  74. package/dist/knowledge-tree/format.d.ts.map +1 -0
  75. package/dist/knowledge-tree/format.js +48 -0
  76. package/dist/knowledge-tree/format.js.map +1 -0
  77. package/dist/knowledge-tree/index.d.ts +33 -0
  78. package/dist/knowledge-tree/index.d.ts.map +1 -0
  79. package/dist/knowledge-tree/index.js +182 -0
  80. package/dist/knowledge-tree/index.js.map +1 -0
  81. package/dist/knowledge-tree/types.d.ts +37 -0
  82. package/dist/knowledge-tree/types.d.ts.map +1 -0
  83. package/dist/knowledge-tree/types.js +5 -0
  84. package/dist/knowledge-tree/types.js.map +1 -0
  85. package/dist/metadata/__tests__/metadata.test.d.ts +2 -0
  86. package/dist/metadata/__tests__/metadata.test.d.ts.map +1 -0
  87. package/dist/metadata/__tests__/metadata.test.js +196 -0
  88. package/dist/metadata/__tests__/metadata.test.js.map +1 -0
  89. package/dist/metadata/__tests__/search.test.d.ts +2 -0
  90. package/dist/metadata/__tests__/search.test.d.ts.map +1 -0
  91. package/dist/metadata/__tests__/search.test.js +227 -0
  92. package/dist/metadata/__tests__/search.test.js.map +1 -0
  93. package/dist/metadata/index.d.ts +29 -0
  94. package/dist/metadata/index.d.ts.map +1 -0
  95. package/dist/metadata/index.js +108 -0
  96. package/dist/metadata/index.js.map +1 -0
  97. package/dist/metadata/schema.d.ts +8 -0
  98. package/dist/metadata/schema.d.ts.map +1 -0
  99. package/dist/metadata/schema.js +31 -0
  100. package/dist/metadata/schema.js.map +1 -0
  101. package/dist/metadata/search.d.ts +27 -0
  102. package/dist/metadata/search.d.ts.map +1 -0
  103. package/dist/metadata/search.js +57 -0
  104. package/dist/metadata/search.js.map +1 -0
  105. package/dist/metadata/types.d.ts +17 -0
  106. package/dist/metadata/types.d.ts.map +1 -0
  107. package/dist/metadata/types.js +5 -0
  108. package/dist/metadata/types.js.map +1 -0
  109. package/dist/orchestrator/__tests__/orchestrator.test.d.ts +2 -0
  110. package/dist/orchestrator/__tests__/orchestrator.test.d.ts.map +1 -0
  111. package/dist/orchestrator/__tests__/orchestrator.test.js +354 -0
  112. package/dist/orchestrator/__tests__/orchestrator.test.js.map +1 -0
  113. package/dist/orchestrator/index.d.ts +23 -0
  114. package/dist/orchestrator/index.d.ts.map +1 -0
  115. package/dist/orchestrator/index.js +302 -0
  116. package/dist/orchestrator/index.js.map +1 -0
  117. package/dist/orchestrator/scheduler.d.ts +32 -0
  118. package/dist/orchestrator/scheduler.d.ts.map +1 -0
  119. package/dist/orchestrator/scheduler.js +102 -0
  120. package/dist/orchestrator/scheduler.js.map +1 -0
  121. package/dist/orchestrator/types.d.ts +90 -0
  122. package/dist/orchestrator/types.d.ts.map +1 -0
  123. package/dist/orchestrator/types.js +5 -0
  124. package/dist/orchestrator/types.js.map +1 -0
  125. package/dist/pipeline/__tests__/pipeline.test.d.ts +2 -0
  126. package/dist/pipeline/__tests__/pipeline.test.d.ts.map +1 -0
  127. package/dist/pipeline/__tests__/pipeline.test.js +320 -0
  128. package/dist/pipeline/__tests__/pipeline.test.js.map +1 -0
  129. package/dist/pipeline/index.d.ts +23 -0
  130. package/dist/pipeline/index.d.ts.map +1 -0
  131. package/dist/pipeline/index.js +212 -0
  132. package/dist/pipeline/index.js.map +1 -0
  133. package/dist/pipeline/types.d.ts +41 -0
  134. package/dist/pipeline/types.d.ts.map +1 -0
  135. package/dist/pipeline/types.js +5 -0
  136. package/dist/pipeline/types.js.map +1 -0
  137. package/dist/providers/__tests__/providers.test.d.ts +2 -0
  138. package/dist/providers/__tests__/providers.test.d.ts.map +1 -0
  139. package/dist/providers/__tests__/providers.test.js +195 -0
  140. package/dist/providers/__tests__/providers.test.js.map +1 -0
  141. package/dist/providers/claude-model.d.ts +17 -0
  142. package/dist/providers/claude-model.d.ts.map +1 -0
  143. package/dist/providers/claude-model.js +119 -0
  144. package/dist/providers/claude-model.js.map +1 -0
  145. package/dist/providers/index.d.ts +22 -0
  146. package/dist/providers/index.d.ts.map +1 -0
  147. package/dist/providers/index.js +38 -0
  148. package/dist/providers/index.js.map +1 -0
  149. package/dist/providers/openai-search.d.ts +14 -0
  150. package/dist/providers/openai-search.d.ts.map +1 -0
  151. package/dist/providers/openai-search.js +97 -0
  152. package/dist/providers/openai-search.js.map +1 -0
  153. package/dist/providers/types.d.ts +42 -0
  154. package/dist/providers/types.d.ts.map +1 -0
  155. package/dist/providers/types.js +5 -0
  156. package/dist/providers/types.js.map +1 -0
  157. package/dist/types.d.ts +122 -0
  158. package/dist/types.d.ts.map +1 -0
  159. package/dist/types.js +5 -0
  160. package/dist/types.js.map +1 -0
  161. package/dist/vetter/__tests__/vetter.test.d.ts +2 -0
  162. package/dist/vetter/__tests__/vetter.test.d.ts.map +1 -0
  163. package/dist/vetter/__tests__/vetter.test.js +224 -0
  164. package/dist/vetter/__tests__/vetter.test.js.map +1 -0
  165. package/dist/vetter/index.d.ts +23 -0
  166. package/dist/vetter/index.d.ts.map +1 -0
  167. package/dist/vetter/index.js +177 -0
  168. package/dist/vetter/index.js.map +1 -0
  169. package/dist/vetter/resource-tracker.d.ts +49 -0
  170. package/dist/vetter/resource-tracker.d.ts.map +1 -0
  171. package/dist/vetter/resource-tracker.js +183 -0
  172. package/dist/vetter/resource-tracker.js.map +1 -0
  173. package/dist/vetter/types.d.ts +44 -0
  174. package/dist/vetter/types.d.ts.map +1 -0
  175. package/dist/vetter/types.js +5 -0
  176. package/dist/vetter/types.js.map +1 -0
  177. package/package.json +72 -0
@@ -0,0 +1,195 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { createSearchProvider, createModelProvider, OpenAISearchProvider, ClaudeModelProvider, } from "../index.js";
3
+ // ---------------------------------------------------------------------------
4
+ // Mock providers — verify interface contracts without hitting real APIs
5
+ // ---------------------------------------------------------------------------
6
+ class MockSearchProvider {
7
+ name = "mock-search";
8
+ _lastCost = 0;
9
+ _results;
10
+ constructor(results) {
11
+ this._results = results ?? [
12
+ {
13
+ title: "Test Result 1",
14
+ url: "https://example.com/1",
15
+ snippet: "First test result snippet",
16
+ },
17
+ {
18
+ title: "Test Result 2",
19
+ url: "https://example.com/2",
20
+ snippet: "Second test result snippet",
21
+ content: "Full content of second result",
22
+ },
23
+ ];
24
+ }
25
+ async search(query, maxResults = 5) {
26
+ this._lastCost = 0.01;
27
+ return this._results.slice(0, maxResults);
28
+ }
29
+ lastCallCostUsd() {
30
+ return this._lastCost;
31
+ }
32
+ }
33
+ class MockModelProvider {
34
+ name = "mock-model";
35
+ _lastCost = 0;
36
+ async synthesize(question, searchResults) {
37
+ this._lastCost = 0.002;
38
+ return {
39
+ title: `Synthesis of: ${question}`,
40
+ category: "technology",
41
+ content: `Synthesised from ${searchResults.length} results.`,
42
+ tags: ["test", "mock"],
43
+ source: searchResults[0]?.url ?? "unknown",
44
+ confidence: 0.85,
45
+ };
46
+ }
47
+ async categorize(content, categories) {
48
+ this._lastCost = 0.001;
49
+ return categories[0];
50
+ }
51
+ lastCallCostUsd() {
52
+ return this._lastCost;
53
+ }
54
+ }
55
+ // ---------------------------------------------------------------------------
56
+ // Interface contract tests (using mocks)
57
+ // ---------------------------------------------------------------------------
58
+ describe("SearchProvider interface contract", () => {
59
+ it("returns an array of WebSearchResult objects", async () => {
60
+ const provider = new MockSearchProvider();
61
+ const results = await provider.search("test query");
62
+ expect(Array.isArray(results)).toBe(true);
63
+ expect(results.length).toBeGreaterThan(0);
64
+ for (const r of results) {
65
+ expect(r).toHaveProperty("title");
66
+ expect(r).toHaveProperty("url");
67
+ expect(r).toHaveProperty("snippet");
68
+ expect(typeof r.title).toBe("string");
69
+ expect(typeof r.url).toBe("string");
70
+ expect(typeof r.snippet).toBe("string");
71
+ }
72
+ });
73
+ it("respects maxResults parameter", async () => {
74
+ const provider = new MockSearchProvider();
75
+ const results = await provider.search("test query", 1);
76
+ expect(results.length).toBe(1);
77
+ });
78
+ it("optional content field is present when provided", async () => {
79
+ const provider = new MockSearchProvider();
80
+ const results = await provider.search("test query");
81
+ const withContent = results.find((r) => r.content !== undefined);
82
+ expect(withContent).toBeDefined();
83
+ expect(typeof withContent.content).toBe("string");
84
+ });
85
+ it("tracks cost per call", async () => {
86
+ const provider = new MockSearchProvider();
87
+ expect(provider.lastCallCostUsd()).toBe(0);
88
+ await provider.search("test");
89
+ expect(provider.lastCallCostUsd()).toBeGreaterThan(0);
90
+ });
91
+ it("has a name property", () => {
92
+ const provider = new MockSearchProvider();
93
+ expect(typeof provider.name).toBe("string");
94
+ expect(provider.name.length).toBeGreaterThan(0);
95
+ });
96
+ });
97
+ describe("ModelProvider interface contract", () => {
98
+ it("synthesize returns a SynthesisResult", async () => {
99
+ const provider = new MockModelProvider();
100
+ const searchResults = [
101
+ { title: "Test", url: "https://example.com", snippet: "A test result" },
102
+ ];
103
+ const result = await provider.synthesize("What is AI?", searchResults);
104
+ expect(result).toHaveProperty("title");
105
+ expect(result).toHaveProperty("category");
106
+ expect(result).toHaveProperty("content");
107
+ expect(result).toHaveProperty("tags");
108
+ expect(result).toHaveProperty("source");
109
+ expect(result).toHaveProperty("confidence");
110
+ expect(typeof result.title).toBe("string");
111
+ expect(typeof result.category).toBe("string");
112
+ expect(typeof result.content).toBe("string");
113
+ expect(Array.isArray(result.tags)).toBe(true);
114
+ expect(typeof result.source).toBe("string");
115
+ expect(typeof result.confidence).toBe("number");
116
+ expect(result.confidence).toBeGreaterThanOrEqual(0);
117
+ expect(result.confidence).toBeLessThanOrEqual(1);
118
+ });
119
+ it("categorize returns one of the provided categories", async () => {
120
+ const provider = new MockModelProvider();
121
+ const categories = ["science", "technology", "culture"];
122
+ const result = await provider.categorize("Some AI content", categories);
123
+ expect(categories).toContain(result);
124
+ });
125
+ it("tracks cost per call", async () => {
126
+ const provider = new MockModelProvider();
127
+ expect(provider.lastCallCostUsd()).toBe(0);
128
+ await provider.synthesize("test", []);
129
+ const synthCost = provider.lastCallCostUsd();
130
+ expect(synthCost).toBeGreaterThan(0);
131
+ await provider.categorize("test", ["a"]);
132
+ const catCost = provider.lastCallCostUsd();
133
+ expect(catCost).toBeGreaterThan(0);
134
+ });
135
+ it("has a name property", () => {
136
+ const provider = new MockModelProvider();
137
+ expect(typeof provider.name).toBe("string");
138
+ expect(provider.name.length).toBeGreaterThan(0);
139
+ });
140
+ });
141
+ // ---------------------------------------------------------------------------
142
+ // Concrete provider instantiation tests
143
+ // ---------------------------------------------------------------------------
144
+ describe("OpenAISearchProvider", () => {
145
+ it("can be instantiated with an API key", () => {
146
+ const provider = new OpenAISearchProvider("test-key");
147
+ expect(provider.name).toBe("openai");
148
+ expect(provider.lastCallCostUsd()).toBe(0);
149
+ });
150
+ });
151
+ describe("ClaudeModelProvider", () => {
152
+ it("can be instantiated with an API key", () => {
153
+ const provider = new ClaudeModelProvider("test-key");
154
+ expect(provider.name).toBe("claude");
155
+ expect(provider.lastCallCostUsd()).toBe(0);
156
+ });
157
+ });
158
+ // ---------------------------------------------------------------------------
159
+ // Factory function tests
160
+ // ---------------------------------------------------------------------------
161
+ describe("createSearchProvider", () => {
162
+ it("creates an OpenAI provider by default", () => {
163
+ const provider = createSearchProvider();
164
+ expect(provider.name).toBe("openai");
165
+ });
166
+ it("creates an OpenAI provider when explicitly named", () => {
167
+ const provider = createSearchProvider("openai");
168
+ expect(provider.name).toBe("openai");
169
+ });
170
+ it("is case-insensitive", () => {
171
+ const provider = createSearchProvider("OpenAI");
172
+ expect(provider.name).toBe("openai");
173
+ });
174
+ it("throws on unknown provider", () => {
175
+ expect(() => createSearchProvider("unknown")).toThrow(/Unknown search provider/);
176
+ });
177
+ });
178
+ describe("createModelProvider", () => {
179
+ it("creates a Claude provider by default", () => {
180
+ const provider = createModelProvider();
181
+ expect(provider.name).toBe("claude");
182
+ });
183
+ it("creates a Claude provider when explicitly named", () => {
184
+ const provider = createModelProvider("claude");
185
+ expect(provider.name).toBe("claude");
186
+ });
187
+ it("is case-insensitive", () => {
188
+ const provider = createModelProvider("Claude");
189
+ expect(provider.name).toBe("claude");
190
+ });
191
+ it("throws on unknown provider", () => {
192
+ expect(() => createModelProvider("unknown")).toThrow(/Unknown model provider/);
193
+ });
194
+ });
195
+ //# sourceMappingURL=providers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.test.js","sourceRoot":"","sources":["../../../src/providers/__tests__/providers.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Claude Model Provider — uses Anthropic Messages API with claude-haiku for
3
+ * cost-efficient synthesis and categorisation.
4
+ */
5
+ import type { ModelProvider, WebSearchResult, SynthesisResult } from "./types.js";
6
+ export declare class ClaudeModelProvider implements ModelProvider {
7
+ readonly name = "claude";
8
+ private client;
9
+ private _lastCost;
10
+ constructor(apiKey?: string);
11
+ synthesize(question: string, searchResults: WebSearchResult[]): Promise<SynthesisResult>;
12
+ categorize(content: string, categories: string[]): Promise<string>;
13
+ lastCallCostUsd(): number;
14
+ private computeCost;
15
+ private parseSynthesisResponse;
16
+ }
17
+ //# sourceMappingURL=claude-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-model.d.ts","sourceRoot":"","sources":["../../src/providers/claude-model.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,eAAe,EAChB,MAAM,YAAY,CAAC;AAWpB,qBAAa,mBAAoB,YAAW,aAAa;IACvD,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,SAAS,CAAK;gBAEV,MAAM,CAAC,EAAE,MAAM;IAMrB,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,eAAe,EAAE,GAC/B,OAAO,CAAC,eAAe,CAAC;IAuCrB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IA8BxE,eAAe,IAAI,MAAM;IAQzB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,sBAAsB;CAkC/B"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Claude Model Provider — uses Anthropic Messages API with claude-haiku for
3
+ * cost-efficient synthesis and categorisation.
4
+ */
5
+ import Anthropic from "@anthropic-ai/sdk";
6
+ // ---------------------------------------------------------------------------
7
+ // Cost constants (claude-haiku-4-5-20251001)
8
+ // ---------------------------------------------------------------------------
9
+ const INPUT_COST_PER_TOKEN = 0.8 / 1_000_000; // $0.80 / 1M input tokens
10
+ const OUTPUT_COST_PER_TOKEN = 4.0 / 1_000_000; // $4.00 / 1M output tokens
11
+ const MODEL = "claude-haiku-4-5-20251001";
12
+ export class ClaudeModelProvider {
13
+ name = "claude";
14
+ client;
15
+ _lastCost = 0;
16
+ constructor(apiKey) {
17
+ this.client = new Anthropic({
18
+ apiKey: apiKey ?? process.env.ANTHROPIC_API_KEY,
19
+ });
20
+ }
21
+ async synthesize(question, searchResults) {
22
+ const sourceSummary = searchResults
23
+ .map((r, i) => `[${i + 1}] ${r.title}\n URL: ${r.url}\n ${r.snippet}${r.content ? `\n Content: ${r.content.slice(0, 1000)}` : ""}`)
24
+ .join("\n\n");
25
+ const response = await this.client.messages.create({
26
+ model: MODEL,
27
+ max_tokens: 1024,
28
+ messages: [
29
+ {
30
+ role: "user",
31
+ content: `You are a knowledge synthesiser. Given a question and web search results, produce a structured knowledge entry.
32
+
33
+ Question: ${question}
34
+
35
+ Search Results:
36
+ ${sourceSummary}
37
+
38
+ Respond with ONLY a JSON object (no markdown fences) with these fields:
39
+ - "title": concise title for the knowledge entry
40
+ - "category": a short lowercase category slug (e.g. "ai", "science", "business", "technology", "culture")
41
+ - "content": a clear, well-structured synthesis (2-4 paragraphs of markdown)
42
+ - "tags": array of 3-7 lowercase keyword tags
43
+ - "source": primary source URL or "multiple" if from several
44
+ - "confidence": 0-1 float indicating how confident you are in the accuracy`,
45
+ },
46
+ ],
47
+ });
48
+ this._lastCost = this.computeCost(response.usage);
49
+ const text = response.content[0].type === "text" ? response.content[0].text : "";
50
+ return this.parseSynthesisResponse(text);
51
+ }
52
+ async categorize(content, categories) {
53
+ const response = await this.client.messages.create({
54
+ model: MODEL,
55
+ max_tokens: 64,
56
+ messages: [
57
+ {
58
+ role: "user",
59
+ content: `Classify the following content into exactly one of these categories: ${categories.join(", ")}
60
+
61
+ Content: ${content.slice(0, 2000)}
62
+
63
+ Respond with ONLY the category name, nothing else.`,
64
+ },
65
+ ],
66
+ });
67
+ this._lastCost = this.computeCost(response.usage);
68
+ const text = response.content[0].type === "text"
69
+ ? response.content[0].text.trim().toLowerCase()
70
+ : categories[0];
71
+ // Return the best match from the provided categories
72
+ const match = categories.find((c) => c.toLowerCase() === text);
73
+ return match ?? categories[0];
74
+ }
75
+ lastCallCostUsd() {
76
+ return this._lastCost;
77
+ }
78
+ // ---------------------------------------------------------------------------
79
+ // Internal
80
+ // ---------------------------------------------------------------------------
81
+ computeCost(usage) {
82
+ return (usage.input_tokens * INPUT_COST_PER_TOKEN +
83
+ usage.output_tokens * OUTPUT_COST_PER_TOKEN);
84
+ }
85
+ parseSynthesisResponse(text) {
86
+ try {
87
+ // Strip markdown code fences if present
88
+ const cleaned = text
89
+ .replace(/^```(?:json)?\s*\n?/m, "")
90
+ .replace(/\n?```\s*$/m, "")
91
+ .trim();
92
+ const parsed = JSON.parse(cleaned);
93
+ return {
94
+ title: String(parsed.title ?? "Untitled"),
95
+ category: String(parsed.category ?? "general"),
96
+ content: String(parsed.content ?? ""),
97
+ tags: Array.isArray(parsed.tags)
98
+ ? parsed.tags.map(String)
99
+ : [],
100
+ source: String(parsed.source ?? "unknown"),
101
+ confidence: typeof parsed.confidence === "number"
102
+ ? Math.max(0, Math.min(1, parsed.confidence))
103
+ : 0.5,
104
+ };
105
+ }
106
+ catch {
107
+ // Fallback if JSON parsing fails
108
+ return {
109
+ title: "Synthesis Error",
110
+ category: "general",
111
+ content: text,
112
+ tags: [],
113
+ source: "unknown",
114
+ confidence: 0.2,
115
+ };
116
+ }
117
+ }
118
+ }
119
+ //# sourceMappingURL=claude-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-model.js","sourceRoot":"","sources":["../../src/providers/claude-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Pluggable Providers — search and model backends with factory functions.
3
+ */
4
+ export type { WebSearchResult, SynthesisResult, SearchProvider, ModelProvider, } from "./types.js";
5
+ export { OpenAISearchProvider } from "./openai-search.js";
6
+ export { ClaudeModelProvider } from "./claude-model.js";
7
+ import type { SearchProvider, ModelProvider } from "./types.js";
8
+ /**
9
+ * Create a SearchProvider by name.
10
+ *
11
+ * @param name - Provider name. Defaults to "openai".
12
+ * @returns A configured SearchProvider instance.
13
+ */
14
+ export declare function createSearchProvider(name?: string): SearchProvider;
15
+ /**
16
+ * Create a ModelProvider by name.
17
+ *
18
+ * @param name - Provider name. Defaults to "claude".
19
+ * @returns A configured ModelProvider instance.
20
+ */
21
+ export declare function createModelProvider(name?: string): ModelProvider;
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,eAAe,EACf,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAMxD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhE;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,cAAc,CAQlE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,CAQhE"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Pluggable Providers — search and model backends with factory functions.
3
+ */
4
+ export { OpenAISearchProvider } from "./openai-search.js";
5
+ export { ClaudeModelProvider } from "./claude-model.js";
6
+ import { OpenAISearchProvider } from "./openai-search.js";
7
+ import { ClaudeModelProvider } from "./claude-model.js";
8
+ /**
9
+ * Create a SearchProvider by name.
10
+ *
11
+ * @param name - Provider name. Defaults to "openai".
12
+ * @returns A configured SearchProvider instance.
13
+ */
14
+ export function createSearchProvider(name) {
15
+ const resolved = (name ?? "openai").toLowerCase();
16
+ switch (resolved) {
17
+ case "openai":
18
+ return new OpenAISearchProvider();
19
+ default:
20
+ throw new Error(`Unknown search provider: "${resolved}". Available: openai`);
21
+ }
22
+ }
23
+ /**
24
+ * Create a ModelProvider by name.
25
+ *
26
+ * @param name - Provider name. Defaults to "claude".
27
+ * @returns A configured ModelProvider instance.
28
+ */
29
+ export function createModelProvider(name) {
30
+ const resolved = (name ?? "claude").toLowerCase();
31
+ switch (resolved) {
32
+ case "claude":
33
+ return new ClaudeModelProvider();
34
+ default:
35
+ throw new Error(`Unknown model provider: "${resolved}". Available: claude`);
36
+ }
37
+ }
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAOxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,MAAM,QAAQ,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAClD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,IAAI,oBAAoB,EAAE,CAAC;QACpC;YACE,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,sBAAsB,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,MAAM,QAAQ,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAClD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,IAAI,mBAAmB,EAAE,CAAC;QACnC;YACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,sBAAsB,CAAC,CAAC;IAChF,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * OpenAI Search Provider — uses the Responses API with web_search_preview tool.
3
+ */
4
+ import type { SearchProvider, WebSearchResult } from "./types.js";
5
+ export declare class OpenAISearchProvider implements SearchProvider {
6
+ readonly name = "openai";
7
+ private client;
8
+ private _lastCost;
9
+ constructor(apiKey?: string);
10
+ search(query: string, maxResults?: number): Promise<WebSearchResult[]>;
11
+ lastCallCostUsd(): number;
12
+ private parseSearchResults;
13
+ }
14
+ //# sourceMappingURL=openai-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-search.d.ts","sourceRoot":"","sources":["../../src/providers/openai-search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAUlE,qBAAa,oBAAqB,YAAW,cAAc;IACzD,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAK;gBAEV,MAAM,CAAC,EAAE,MAAM;IAOrB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,SAAI,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAyCvE,eAAe,IAAI,MAAM;IAQzB,OAAO,CAAC,kBAAkB;CA2C3B"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * OpenAI Search Provider — uses the Responses API with web_search_preview tool.
3
+ */
4
+ import OpenAI from "openai";
5
+ // ---------------------------------------------------------------------------
6
+ // Cost tracking constants
7
+ // ---------------------------------------------------------------------------
8
+ /** Per-search-call cost estimate for web_search_preview (context-size dependent). */
9
+ const SEARCH_COST_LOW = 0.03;
10
+ const SEARCH_COST_HIGH = 0.05;
11
+ export class OpenAISearchProvider {
12
+ name = "openai";
13
+ client;
14
+ _lastCost = 0;
15
+ constructor(apiKey) {
16
+ const key = apiKey ?? process.env.OPENAI_API_KEY;
17
+ this.client = new OpenAI({
18
+ apiKey: key ?? "unset",
19
+ });
20
+ }
21
+ async search(query, maxResults = 5) {
22
+ const response = await this.client.responses.create({
23
+ model: "gpt-4.1-mini",
24
+ tools: [
25
+ {
26
+ type: "web_search_preview",
27
+ search_context_size: maxResults <= 3 ? "low" : "medium",
28
+ },
29
+ ],
30
+ input: `Search the web for: ${query}\n\nReturn the top results with titles, URLs, and brief summaries.`,
31
+ });
32
+ const results = [];
33
+ // Extract results from output items
34
+ for (const item of response.output) {
35
+ if (item.type === "web_search_call") {
36
+ // The search call itself doesn't contain results — they come in message output
37
+ continue;
38
+ }
39
+ if (item.type === "message") {
40
+ // Parse search results from the message content
41
+ for (const block of item.content) {
42
+ if (block.type === "output_text") {
43
+ const parsed = this.parseSearchResults(block.text, block.annotations ?? [], maxResults);
44
+ results.push(...parsed);
45
+ }
46
+ }
47
+ }
48
+ }
49
+ // Estimate cost based on context size
50
+ this._lastCost = maxResults <= 3 ? SEARCH_COST_LOW : SEARCH_COST_HIGH;
51
+ return results.slice(0, maxResults);
52
+ }
53
+ lastCallCostUsd() {
54
+ return this._lastCost;
55
+ }
56
+ // ---------------------------------------------------------------------------
57
+ // Internal
58
+ // ---------------------------------------------------------------------------
59
+ parseSearchResults(text, annotations, maxResults) {
60
+ const results = [];
61
+ // Extract from URL citation annotations (most reliable)
62
+ for (const ann of annotations) {
63
+ if (ann.type === "url_citation" && ann.url && ann.title) {
64
+ // Avoid duplicate URLs
65
+ if (results.some((r) => r.url === ann.url))
66
+ continue;
67
+ results.push({
68
+ title: ann.title,
69
+ url: ann.url,
70
+ snippet: "",
71
+ });
72
+ if (results.length >= maxResults)
73
+ break;
74
+ }
75
+ }
76
+ // If we got annotations, use text chunks as snippets
77
+ if (results.length > 0) {
78
+ // Split text by double-newline to get rough per-result blocks
79
+ const blocks = text.split(/\n{2,}/);
80
+ for (let i = 0; i < Math.min(blocks.length, results.length); i++) {
81
+ if (!results[i].snippet && blocks[i]) {
82
+ results[i].snippet = blocks[i].trim().slice(0, 300);
83
+ }
84
+ }
85
+ }
86
+ // Fallback: if no annotations, return text as a single result
87
+ if (results.length === 0 && text.trim()) {
88
+ results.push({
89
+ title: "Search Results",
90
+ url: "",
91
+ snippet: text.trim().slice(0, 500),
92
+ });
93
+ }
94
+ return results;
95
+ }
96
+ }
97
+ //# sourceMappingURL=openai-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-search.js","sourceRoot":"","sources":["../../src/providers/openai-search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,qFAAqF;AACrF,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,MAAM,OAAO,oBAAoB;IACtB,IAAI,GAAG,QAAQ,CAAC;IACjB,MAAM,CAAS;IACf,SAAS,GAAG,CAAC,CAAC;IAEtB,YAAY,MAAe;QACzB,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;YACvB,MAAM,EAAE,GAAG,IAAI,OAAO;SACvB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,UAAU,GAAG,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;YAClD,KAAK,EAAE,cAAc;YACrB,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,oBAA6B;oBACnC,mBAAmB,EAAE,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;iBACxD;aACF;YACD,KAAK,EAAE,uBAAuB,KAAK,oEAAoE;SACxG,CAAC,CAAC;QAEH,MAAM,OAAO,GAAsB,EAAE,CAAC;QAEtC,oCAAoC;QACpC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBACpC,+EAA+E;gBAC/E,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC5B,gDAAgD;gBAChD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACjC,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;wBACjC,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CACpC,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,WAAW,IAAI,EAAE,EACvB,UAAU,CACX,CAAC;wBACF,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;oBAC1B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC,SAAS,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAEtE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,8EAA8E;IAC9E,WAAW;IACX,8EAA8E;IAEtE,kBAAkB,CACxB,IAAY,EACZ,WAAkE,EAClE,UAAkB;QAElB,MAAM,OAAO,GAAsB,EAAE,CAAC;QAEtC,wDAAwD;QACxD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBACxD,uBAAuB;gBACvB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACrD,OAAO,CAAC,IAAI,CAAC;oBACX,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,GAAG,EAAE,GAAG,CAAC,GAAG;oBACZ,OAAO,EAAE,EAAE;iBACZ,CAAC,CAAC;gBACH,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU;oBAAE,MAAM;YAC1C,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,8DAA8D;YAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACjE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,gBAAgB;gBACvB,GAAG,EAAE,EAAE;gBACP,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Provider type definitions — pluggable interfaces for search and model backends.
3
+ */
4
+ /** A single result from a web search. */
5
+ export interface WebSearchResult {
6
+ title: string;
7
+ url: string;
8
+ snippet: string;
9
+ /** Full page content, if available. */
10
+ content?: string;
11
+ }
12
+ /** Interface that all search providers must implement. */
13
+ export interface SearchProvider {
14
+ /** Human-readable provider name (e.g. "openai"). */
15
+ readonly name: string;
16
+ /** Run a web search and return results. */
17
+ search(query: string, maxResults?: number): Promise<WebSearchResult[]>;
18
+ /** USD cost of the most recent search() call. Returns 0 before any call. */
19
+ lastCallCostUsd(): number;
20
+ }
21
+ /** The output of a synthesis operation. */
22
+ export interface SynthesisResult {
23
+ title: string;
24
+ category: string;
25
+ content: string;
26
+ tags: string[];
27
+ source: string;
28
+ /** 0–1 confidence in the synthesised output. */
29
+ confidence: number;
30
+ }
31
+ /** Interface that all model providers must implement. */
32
+ export interface ModelProvider {
33
+ /** Human-readable provider name (e.g. "claude"). */
34
+ readonly name: string;
35
+ /** Synthesise search results into a knowledge entry. */
36
+ synthesize(question: string, searchResults: WebSearchResult[]): Promise<SynthesisResult>;
37
+ /** Classify content into one of the provided categories. */
38
+ categorize(content: string, categories: string[]): Promise<string>;
39
+ /** USD cost of the most recent API call. Returns 0 before any call. */
40
+ lastCallCostUsd(): number;
41
+ }
42
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,2CAA2C;IAC3C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAEvE,4EAA4E;IAC5E,eAAe,IAAI,MAAM,CAAC;CAC3B;AAMD,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,wDAAwD;IACxD,UAAU,CACR,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,eAAe,EAAE,GAC/B,OAAO,CAAC,eAAe,CAAC,CAAC;IAE5B,4DAA4D;IAC5D,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnE,uEAAuE;IACvE,eAAe,IAAI,MAAM,CAAC;CAC3B"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Provider type definitions — pluggable interfaces for search and model backends.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}