@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.
- package/dist/__tests__/integration.test.d.ts +8 -0
- package/dist/__tests__/integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration.test.js +233 -0
- package/dist/__tests__/integration.test.js.map +1 -0
- package/dist/budget/__tests__/budget.test.d.ts +2 -0
- package/dist/budget/__tests__/budget.test.d.ts.map +1 -0
- package/dist/budget/__tests__/budget.test.js +238 -0
- package/dist/budget/__tests__/budget.test.js.map +1 -0
- package/dist/budget/__tests__/token-tracker.test.d.ts +2 -0
- package/dist/budget/__tests__/token-tracker.test.d.ts.map +1 -0
- package/dist/budget/__tests__/token-tracker.test.js +292 -0
- package/dist/budget/__tests__/token-tracker.test.js.map +1 -0
- package/dist/budget/index.d.ts +38 -0
- package/dist/budget/index.d.ts.map +1 -0
- package/dist/budget/index.js +192 -0
- package/dist/budget/index.js.map +1 -0
- package/dist/budget/token-tracker.d.ts +62 -0
- package/dist/budget/token-tracker.d.ts.map +1 -0
- package/dist/budget/token-tracker.js +152 -0
- package/dist/budget/token-tracker.js.map +1 -0
- package/dist/budget/types.d.ts +41 -0
- package/dist/budget/types.d.ts.map +1 -0
- package/dist/budget/types.js +5 -0
- package/dist/budget/types.js.map +1 -0
- package/dist/confidence/__tests__/confidence.test.d.ts +2 -0
- package/dist/confidence/__tests__/confidence.test.d.ts.map +1 -0
- package/dist/confidence/__tests__/confidence.test.js +336 -0
- package/dist/confidence/__tests__/confidence.test.js.map +1 -0
- package/dist/confidence/erosion.d.ts +33 -0
- package/dist/confidence/erosion.d.ts.map +1 -0
- package/dist/confidence/erosion.js +42 -0
- package/dist/confidence/erosion.js.map +1 -0
- package/dist/confidence/index.d.ts +42 -0
- package/dist/confidence/index.d.ts.map +1 -0
- package/dist/confidence/index.js +168 -0
- package/dist/confidence/index.js.map +1 -0
- package/dist/confidence/types.d.ts +29 -0
- package/dist/confidence/types.d.ts.map +1 -0
- package/dist/confidence/types.js +5 -0
- package/dist/confidence/types.js.map +1 -0
- package/dist/curiosity/__tests__/curiosity.test.d.ts +2 -0
- package/dist/curiosity/__tests__/curiosity.test.d.ts.map +1 -0
- package/dist/curiosity/__tests__/curiosity.test.js +280 -0
- package/dist/curiosity/__tests__/curiosity.test.js.map +1 -0
- package/dist/curiosity/dedup.d.ts +29 -0
- package/dist/curiosity/dedup.d.ts.map +1 -0
- package/dist/curiosity/dedup.js +64 -0
- package/dist/curiosity/dedup.js.map +1 -0
- package/dist/curiosity/index.d.ts +56 -0
- package/dist/curiosity/index.d.ts.map +1 -0
- package/dist/curiosity/index.js +163 -0
- package/dist/curiosity/index.js.map +1 -0
- package/dist/curiosity/types.d.ts +29 -0
- package/dist/curiosity/types.d.ts.map +1 -0
- package/dist/curiosity/types.js +5 -0
- package/dist/curiosity/types.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +7 -0
- package/dist/index.test.js.map +1 -0
- package/dist/init.d.ts +17 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +153 -0
- package/dist/init.js.map +1 -0
- package/dist/knowledge-tree/__tests__/knowledge-tree.test.d.ts +2 -0
- package/dist/knowledge-tree/__tests__/knowledge-tree.test.d.ts.map +1 -0
- package/dist/knowledge-tree/__tests__/knowledge-tree.test.js +317 -0
- package/dist/knowledge-tree/__tests__/knowledge-tree.test.js.map +1 -0
- package/dist/knowledge-tree/format.d.ts +17 -0
- package/dist/knowledge-tree/format.d.ts.map +1 -0
- package/dist/knowledge-tree/format.js +48 -0
- package/dist/knowledge-tree/format.js.map +1 -0
- package/dist/knowledge-tree/index.d.ts +33 -0
- package/dist/knowledge-tree/index.d.ts.map +1 -0
- package/dist/knowledge-tree/index.js +182 -0
- package/dist/knowledge-tree/index.js.map +1 -0
- package/dist/knowledge-tree/types.d.ts +37 -0
- package/dist/knowledge-tree/types.d.ts.map +1 -0
- package/dist/knowledge-tree/types.js +5 -0
- package/dist/knowledge-tree/types.js.map +1 -0
- package/dist/metadata/__tests__/metadata.test.d.ts +2 -0
- package/dist/metadata/__tests__/metadata.test.d.ts.map +1 -0
- package/dist/metadata/__tests__/metadata.test.js +196 -0
- package/dist/metadata/__tests__/metadata.test.js.map +1 -0
- package/dist/metadata/__tests__/search.test.d.ts +2 -0
- package/dist/metadata/__tests__/search.test.d.ts.map +1 -0
- package/dist/metadata/__tests__/search.test.js +227 -0
- package/dist/metadata/__tests__/search.test.js.map +1 -0
- package/dist/metadata/index.d.ts +29 -0
- package/dist/metadata/index.d.ts.map +1 -0
- package/dist/metadata/index.js +108 -0
- package/dist/metadata/index.js.map +1 -0
- package/dist/metadata/schema.d.ts +8 -0
- package/dist/metadata/schema.d.ts.map +1 -0
- package/dist/metadata/schema.js +31 -0
- package/dist/metadata/schema.js.map +1 -0
- package/dist/metadata/search.d.ts +27 -0
- package/dist/metadata/search.d.ts.map +1 -0
- package/dist/metadata/search.js +57 -0
- package/dist/metadata/search.js.map +1 -0
- package/dist/metadata/types.d.ts +17 -0
- package/dist/metadata/types.d.ts.map +1 -0
- package/dist/metadata/types.js +5 -0
- package/dist/metadata/types.js.map +1 -0
- package/dist/orchestrator/__tests__/orchestrator.test.d.ts +2 -0
- package/dist/orchestrator/__tests__/orchestrator.test.d.ts.map +1 -0
- package/dist/orchestrator/__tests__/orchestrator.test.js +354 -0
- package/dist/orchestrator/__tests__/orchestrator.test.js.map +1 -0
- package/dist/orchestrator/index.d.ts +23 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +302 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/scheduler.d.ts +32 -0
- package/dist/orchestrator/scheduler.d.ts.map +1 -0
- package/dist/orchestrator/scheduler.js +102 -0
- package/dist/orchestrator/scheduler.js.map +1 -0
- package/dist/orchestrator/types.d.ts +90 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/orchestrator/types.js +5 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/pipeline/__tests__/pipeline.test.d.ts +2 -0
- package/dist/pipeline/__tests__/pipeline.test.d.ts.map +1 -0
- package/dist/pipeline/__tests__/pipeline.test.js +320 -0
- package/dist/pipeline/__tests__/pipeline.test.js.map +1 -0
- package/dist/pipeline/index.d.ts +23 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +212 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/types.d.ts +41 -0
- package/dist/pipeline/types.d.ts.map +1 -0
- package/dist/pipeline/types.js +5 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/providers/__tests__/providers.test.d.ts +2 -0
- package/dist/providers/__tests__/providers.test.d.ts.map +1 -0
- package/dist/providers/__tests__/providers.test.js +195 -0
- package/dist/providers/__tests__/providers.test.js.map +1 -0
- package/dist/providers/claude-model.d.ts +17 -0
- package/dist/providers/claude-model.d.ts.map +1 -0
- package/dist/providers/claude-model.js +119 -0
- package/dist/providers/claude-model.js.map +1 -0
- package/dist/providers/index.d.ts +22 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +38 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai-search.d.ts +14 -0
- package/dist/providers/openai-search.d.ts.map +1 -0
- package/dist/providers/openai-search.js +97 -0
- package/dist/providers/openai-search.js.map +1 -0
- package/dist/providers/types.d.ts +42 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +5 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/types.d.ts +122 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/vetter/__tests__/vetter.test.d.ts +2 -0
- package/dist/vetter/__tests__/vetter.test.d.ts.map +1 -0
- package/dist/vetter/__tests__/vetter.test.js +224 -0
- package/dist/vetter/__tests__/vetter.test.js.map +1 -0
- package/dist/vetter/index.d.ts +23 -0
- package/dist/vetter/index.d.ts.map +1 -0
- package/dist/vetter/index.js +177 -0
- package/dist/vetter/index.js.map +1 -0
- package/dist/vetter/resource-tracker.d.ts +49 -0
- package/dist/vetter/resource-tracker.d.ts.map +1 -0
- package/dist/vetter/resource-tracker.js +183 -0
- package/dist/vetter/resource-tracker.js.map +1 -0
- package/dist/vetter/types.d.ts +44 -0
- package/dist/vetter/types.d.ts.map +1 -0
- package/dist/vetter/types.js +5 -0
- package/dist/vetter/types.js.map +1 -0
- 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":"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"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|