@debriefer/core 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +86 -0
  2. package/dist/__tests__/base-source.test.d.ts +2 -0
  3. package/dist/__tests__/base-source.test.d.ts.map +1 -0
  4. package/dist/__tests__/base-source.test.js +333 -0
  5. package/dist/__tests__/base-source.test.js.map +1 -0
  6. package/dist/__tests__/batch-runner.test.d.ts +2 -0
  7. package/dist/__tests__/batch-runner.test.d.ts.map +1 -0
  8. package/dist/__tests__/batch-runner.test.js +217 -0
  9. package/dist/__tests__/batch-runner.test.js.map +1 -0
  10. package/dist/__tests__/cache.test.d.ts +2 -0
  11. package/dist/__tests__/cache.test.d.ts.map +1 -0
  12. package/dist/__tests__/cache.test.js +127 -0
  13. package/dist/__tests__/cache.test.js.map +1 -0
  14. package/dist/__tests__/confidence.test.d.ts +2 -0
  15. package/dist/__tests__/confidence.test.d.ts.map +1 -0
  16. package/dist/__tests__/confidence.test.js +81 -0
  17. package/dist/__tests__/confidence.test.js.map +1 -0
  18. package/dist/__tests__/cost-tracker.test.d.ts +2 -0
  19. package/dist/__tests__/cost-tracker.test.d.ts.map +1 -0
  20. package/dist/__tests__/cost-tracker.test.js +149 -0
  21. package/dist/__tests__/cost-tracker.test.js.map +1 -0
  22. package/dist/__tests__/orchestrator.test.d.ts +2 -0
  23. package/dist/__tests__/orchestrator.test.d.ts.map +1 -0
  24. package/dist/__tests__/orchestrator.test.js +751 -0
  25. package/dist/__tests__/orchestrator.test.js.map +1 -0
  26. package/dist/__tests__/rate-limiter.test.d.ts +2 -0
  27. package/dist/__tests__/rate-limiter.test.d.ts.map +1 -0
  28. package/dist/__tests__/rate-limiter.test.js +83 -0
  29. package/dist/__tests__/rate-limiter.test.js.map +1 -0
  30. package/dist/__tests__/reliability.test.d.ts +2 -0
  31. package/dist/__tests__/reliability.test.d.ts.map +1 -0
  32. package/dist/__tests__/reliability.test.js +207 -0
  33. package/dist/__tests__/reliability.test.js.map +1 -0
  34. package/dist/__tests__/synthesizer.test.d.ts +2 -0
  35. package/dist/__tests__/synthesizer.test.d.ts.map +1 -0
  36. package/dist/__tests__/synthesizer.test.js +50 -0
  37. package/dist/__tests__/synthesizer.test.js.map +1 -0
  38. package/dist/__tests__/telemetry.test.d.ts +2 -0
  39. package/dist/__tests__/telemetry.test.d.ts.map +1 -0
  40. package/dist/__tests__/telemetry.test.js +81 -0
  41. package/dist/__tests__/telemetry.test.js.map +1 -0
  42. package/dist/__tests__/types.test.d.ts +2 -0
  43. package/dist/__tests__/types.test.d.ts.map +1 -0
  44. package/dist/__tests__/types.test.js +708 -0
  45. package/dist/__tests__/types.test.js.map +1 -0
  46. package/dist/base-source.d.ts +91 -0
  47. package/dist/base-source.d.ts.map +1 -0
  48. package/dist/base-source.js +144 -0
  49. package/dist/base-source.js.map +1 -0
  50. package/dist/batch-runner.d.ts +40 -0
  51. package/dist/batch-runner.d.ts.map +1 -0
  52. package/dist/batch-runner.js +65 -0
  53. package/dist/batch-runner.js.map +1 -0
  54. package/dist/cache/in-memory.d.ts +26 -0
  55. package/dist/cache/in-memory.d.ts.map +1 -0
  56. package/dist/cache/in-memory.js +51 -0
  57. package/dist/cache/in-memory.js.map +1 -0
  58. package/dist/confidence.d.ts +13 -0
  59. package/dist/confidence.d.ts.map +1 -0
  60. package/dist/confidence.js +29 -0
  61. package/dist/confidence.js.map +1 -0
  62. package/dist/cost-tracker.d.ts +37 -0
  63. package/dist/cost-tracker.d.ts.map +1 -0
  64. package/dist/cost-tracker.js +62 -0
  65. package/dist/cost-tracker.js.map +1 -0
  66. package/dist/index.d.ts +25 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +28 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/orchestrator.d.ts +92 -0
  71. package/dist/orchestrator.d.ts.map +1 -0
  72. package/dist/orchestrator.js +373 -0
  73. package/dist/orchestrator.js.map +1 -0
  74. package/dist/rate-limiter.d.ts +31 -0
  75. package/dist/rate-limiter.d.ts.map +1 -0
  76. package/dist/rate-limiter.js +79 -0
  77. package/dist/rate-limiter.js.map +1 -0
  78. package/dist/reliability.d.ts +49 -0
  79. package/dist/reliability.d.ts.map +1 -0
  80. package/dist/reliability.js +67 -0
  81. package/dist/reliability.js.map +1 -0
  82. package/dist/synthesizer.d.ts +31 -0
  83. package/dist/synthesizer.d.ts.map +1 -0
  84. package/dist/synthesizer.js +47 -0
  85. package/dist/synthesizer.js.map +1 -0
  86. package/dist/telemetry/console.d.ts +7 -0
  87. package/dist/telemetry/console.d.ts.map +1 -0
  88. package/dist/telemetry/console.js +21 -0
  89. package/dist/telemetry/console.js.map +1 -0
  90. package/dist/telemetry/noop.d.ts +7 -0
  91. package/dist/telemetry/noop.d.ts.map +1 -0
  92. package/dist/telemetry/noop.js +12 -0
  93. package/dist/telemetry/noop.js.map +1 -0
  94. package/dist/types.d.ts +417 -0
  95. package/dist/types.d.ts.map +1 -0
  96. package/dist/types.js +102 -0
  97. package/dist/types.js.map +1 -0
  98. package/package.json +46 -0
package/README.md ADDED
@@ -0,0 +1,86 @@
1
+ # @debriefer/core
2
+
3
+ Multi-source research orchestration engine with reliability scoring, phase-based execution, and AI synthesis.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @debriefer/core @debriefer/sources
9
+ ```
10
+
11
+ To use `ClaudeSynthesizer`, also install the optional peer dependency:
12
+
13
+ ```bash
14
+ npm install @anthropic-ai/sdk
15
+ ```
16
+
17
+ ## Quick Start
18
+
19
+ ```typescript
20
+ import { ResearchOrchestrator, NoopSynthesizer } from "@debriefer/core"
21
+ import { wikipedia, wikidata, openLibrary } from "@debriefer/sources"
22
+
23
+ const orchestrator = new ResearchOrchestrator(
24
+ [{ phase: 1, name: "Free Sources", sources: [wikidata(), wikipedia(), openLibrary()] }],
25
+ new NoopSynthesizer()
26
+ )
27
+
28
+ const result = await orchestrator.debrief({ id: "nm0000030", name: "Audrey Hepburn" })
29
+
30
+ console.log(`${result.findings.length} findings from ${result.sourcesSucceeded} sources`)
31
+ for (const finding of result.findings) {
32
+ console.log(`[${finding.sourceName}] (reliability: ${finding.reliabilityScore}) ${finding.url}`)
33
+ }
34
+ // 3 findings from 3 sources
35
+ // [Wikidata] (reliability: 1) https://www.wikidata.org/wiki/Q41282
36
+ // [Wikipedia] (reliability: 0.85) https://en.wikipedia.org/wiki/Audrey_Hepburn
37
+ // [Open Library] (reliability: 0.85) https://openlibrary.org/search?q=Audrey+Hepburn
38
+ ```
39
+
40
+ ## Key Exports
41
+
42
+ **Engine**
43
+
44
+ - `ResearchOrchestrator` — phased execution, early stopping, batch processing, lifecycle hooks
45
+ - `BaseResearchSource` — abstract base class for all source implementations
46
+
47
+ **Synthesis**
48
+
49
+ - `ClaudeSynthesizer` — AI synthesis via Anthropic SDK; produces typed, cited output
50
+ - `NoopSynthesizer` — returns raw findings without synthesis
51
+
52
+ **Reliability Scoring**
53
+
54
+ - `ReliabilityTier` — 12-tier enum based on Wikipedia's Reliable Sources Perennial list (0.35–1.0)
55
+ - `RELIABILITY_SCORES`, `getReliabilityScore`, `meetsReliabilityThreshold`
56
+
57
+ **Infrastructure**
58
+
59
+ - `InMemoryCache` — TTL cache with optional FIFO eviction (`maxSize`)
60
+ - `SourceRateLimiter` — per-domain async queue
61
+ - `BatchCostTracker` — per-subject and total cost limits
62
+ - `ParallelBatchRunner` — concurrency-limited batch processor
63
+ - `ConsoleTelemetry`, `NoopTelemetry` — pluggable observability
64
+ - `calculateConfidence` — keyword-based confidence scoring
65
+
66
+ **Types**
67
+
68
+ - `ResearchSubject`, `RawFinding`, `ScoredFinding`, `DebriefResult`, `ResearchConfig`
69
+ - `Synthesizer`, `CacheProvider`, `TelemetryProvider`, `LifecycleHooks`
70
+ - `CostLimitExceededError`, `SourceTimeoutError`, `SourceAccessBlockedError`
71
+
72
+ ## Dependencies
73
+
74
+ One hard dependency: [`p-limit`](https://github.com/sindresorhus/p-limit).
75
+
76
+ `@anthropic-ai/sdk` is an optional peer dependency — only required when using `ClaudeSynthesizer`. Consumers using a custom synthesizer do not need it.
77
+
78
+ All other infrastructure (cache backends, telemetry, rate limiting) is injected via interfaces.
79
+
80
+ ## Documentation
81
+
82
+ See the [monorepo README](https://github.com/chenders/debriefer) for full documentation, integration examples, reliability tier reference, and source catalog.
83
+
84
+ ## License
85
+
86
+ [MIT](https://github.com/chenders/debriefer/blob/main/LICENSE)
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=base-source.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-source.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/base-source.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,333 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { BaseResearchSource } from "../base-source.js";
3
+ import { ReliabilityTier } from "../reliability.js";
4
+ // ============================================================================
5
+ // Test Fixtures
6
+ // ============================================================================
7
+ const testSubject = {
8
+ id: 42,
9
+ name: "John Wayne",
10
+ context: { deathday: "1979-06-11" },
11
+ };
12
+ function makeFinding(overrides = {}) {
13
+ return {
14
+ text: "John Wayne died of stomach cancer in 1979.",
15
+ url: "https://example.com/john-wayne",
16
+ confidence: 0.8,
17
+ costUsd: 0,
18
+ ...overrides,
19
+ };
20
+ }
21
+ function makeCache() {
22
+ return {
23
+ get: vi.fn().mockResolvedValue(null),
24
+ set: vi.fn().mockResolvedValue(undefined),
25
+ delete: vi.fn().mockResolvedValue(undefined),
26
+ };
27
+ }
28
+ function makeRateLimiter() {
29
+ return {
30
+ acquire: vi.fn().mockResolvedValue(undefined),
31
+ };
32
+ }
33
+ function makeSpan() {
34
+ return {
35
+ end: vi.fn(),
36
+ setAttributes: vi.fn(),
37
+ };
38
+ }
39
+ function makeTelemetry() {
40
+ const span = makeSpan();
41
+ return {
42
+ recordEvent: vi.fn(),
43
+ startSpan: vi.fn().mockReturnValue(span),
44
+ recordError: vi.fn(),
45
+ };
46
+ }
47
+ // ============================================================================
48
+ // Concrete Test Source
49
+ // ============================================================================
50
+ class TestSource extends BaseResearchSource {
51
+ name = "TestSource";
52
+ type = "test_source";
53
+ reliabilityTier = ReliabilityTier.TIER_1_NEWS;
54
+ domain = "test.example.com";
55
+ isFree = true;
56
+ estimatedCostPerQuery = 0;
57
+ fixedResult;
58
+ constructor(result = makeFinding(), options = {}) {
59
+ super(options);
60
+ this.fixedResult = result;
61
+ }
62
+ async fetchResult(_subject, _signal) {
63
+ return this.fixedResult;
64
+ }
65
+ }
66
+ class FailingSource extends BaseResearchSource {
67
+ name = "FailingSource";
68
+ type = "failing_source";
69
+ reliabilityTier = ReliabilityTier.UNRELIABLE_UGC;
70
+ domain = "failing.example.com";
71
+ isFree = true;
72
+ estimatedCostPerQuery = 0;
73
+ async fetchResult() {
74
+ throw new Error("Source fetch failed");
75
+ }
76
+ }
77
+ // ============================================================================
78
+ // Tests
79
+ // ============================================================================
80
+ describe("BaseResearchSource", () => {
81
+ let abortController;
82
+ beforeEach(() => {
83
+ abortController = new AbortController();
84
+ });
85
+ // Test 1: lookup returns the finding from fetchResult
86
+ it("returns the finding from fetchResult", async () => {
87
+ const finding = makeFinding();
88
+ const source = new TestSource(finding);
89
+ const result = await source.lookup(testSubject, abortController.signal);
90
+ expect(result).toEqual(finding);
91
+ });
92
+ // Test 2: lookup checks cache first (cache hit returns cached value)
93
+ it("returns cached value on cache hit", async () => {
94
+ const cachedFinding = makeFinding({ text: "cached result" });
95
+ const cache = makeCache();
96
+ cache.get.mockResolvedValue(JSON.stringify(cachedFinding));
97
+ const source = new TestSource(makeFinding({ text: "fresh result" }));
98
+ source.setCache(cache);
99
+ const result = await source.lookup(testSubject, abortController.signal);
100
+ expect(result).toEqual(cachedFinding);
101
+ expect(cache.get).toHaveBeenCalledWith(expect.stringContaining("debriefer:test_source:42:"));
102
+ });
103
+ // Test 3: lookup populates cache after successful fetch
104
+ it("populates cache after successful fetch", async () => {
105
+ const finding = makeFinding();
106
+ const cache = makeCache();
107
+ const source = new TestSource(finding);
108
+ source.setCache(cache);
109
+ await source.lookup(testSubject, abortController.signal);
110
+ expect(cache.set).toHaveBeenCalledWith(expect.stringContaining("debriefer:test_source:42:"), JSON.stringify(finding), 86400);
111
+ });
112
+ // Test 4: lookup respects ignoreCache option
113
+ it("skips cache when ignoreCache is true", async () => {
114
+ const cache = makeCache();
115
+ cache.get.mockResolvedValue(JSON.stringify(makeFinding({ text: "stale" })));
116
+ const freshFinding = makeFinding({ text: "fresh" });
117
+ const source = new TestSource(freshFinding, { ignoreCache: true });
118
+ source.setCache(cache);
119
+ const result = await source.lookup(testSubject, abortController.signal);
120
+ expect(cache.get).not.toHaveBeenCalled();
121
+ expect(result).toEqual(freshFinding);
122
+ });
123
+ // Test 5: rate limiter acquire is called with correct domain and delay
124
+ it("calls rate limiter with correct domain and delay", async () => {
125
+ const rateLimiter = makeRateLimiter();
126
+ const source = new TestSource(makeFinding(), { rateLimitMs: 500 });
127
+ source.setRateLimiter(rateLimiter);
128
+ await source.lookup(testSubject, abortController.signal);
129
+ expect(rateLimiter.acquire).toHaveBeenCalledWith("test.example.com", 500);
130
+ });
131
+ // Test 6: telemetry span is started and ended
132
+ it("starts and ends telemetry span", async () => {
133
+ const telemetry = makeTelemetry();
134
+ const source = new TestSource(makeFinding());
135
+ source.setTelemetry(telemetry);
136
+ await source.lookup(testSubject, abortController.signal);
137
+ expect(telemetry.startSpan).toHaveBeenCalledWith("source:TestSource");
138
+ const span = telemetry.startSpan.mock.results[0]?.value;
139
+ expect(span.end).toHaveBeenCalled();
140
+ });
141
+ // Test 7: telemetry recordError is called on fetch failure
142
+ it("records error via telemetry on fetch failure", async () => {
143
+ const telemetry = makeTelemetry();
144
+ const source = new FailingSource();
145
+ source.setTelemetry(telemetry);
146
+ await source.lookup(testSubject, abortController.signal);
147
+ expect(telemetry.recordError).toHaveBeenCalledWith(expect.objectContaining({ message: "Source fetch failed" }), { source: "FailingSource", subject: "John Wayne" });
148
+ });
149
+ // Test 8: lookup returns null on fetch error (doesn't throw)
150
+ it("returns null on fetch error instead of throwing", async () => {
151
+ const source = new FailingSource();
152
+ const result = await source.lookup(testSubject, abortController.signal);
153
+ expect(result).toBeNull();
154
+ });
155
+ // Test 9: isAvailable defaults to true
156
+ it("isAvailable defaults to true", () => {
157
+ const source = new TestSource();
158
+ expect(source.isAvailable()).toBe(true);
159
+ });
160
+ // Test 10: reliabilityScore is derived from reliabilityTier
161
+ it("derives reliabilityScore from reliabilityTier", () => {
162
+ const source = new TestSource();
163
+ // TIER_1_NEWS has score 0.95
164
+ expect(source.reliabilityScore).toBe(0.95);
165
+ });
166
+ // Test 11: buildQuery defaults to subject.name
167
+ it("buildQuery defaults to subject.name", () => {
168
+ const source = new TestSource();
169
+ expect(source.buildQuery(testSubject)).toBe("John Wayne");
170
+ });
171
+ // Test 12: confidence is calculated when result.confidence is -1 and keywords provided
172
+ it("calculates confidence when result.confidence is -1 and keywords provided", async () => {
173
+ const finding = makeFinding({
174
+ text: "John Wayne died of stomach cancer in 1979.",
175
+ confidence: -1,
176
+ });
177
+ const source = new TestSource(finding, {
178
+ requiredKeywords: ["died", "death"],
179
+ bonusKeywords: ["cancer", "heart attack", "accident"],
180
+ });
181
+ const result = await source.lookup(testSubject, abortController.signal);
182
+ expect(result).not.toBeNull();
183
+ // "died" is a required keyword match -> base 0.5
184
+ // "cancer" is 1 of 3 bonus keywords -> 0.5 * (1/3) bonus
185
+ expect(result.confidence).toBeGreaterThan(0);
186
+ expect(result.confidence).not.toBe(-1);
187
+ });
188
+ // Test 13: timeout signal is combined with caller signal
189
+ it("combines caller signal with timeout signal", async () => {
190
+ // We verify that aborting the caller signal causes the lookup to
191
+ // handle the abort. We do this by creating a source that checks
192
+ // the combined signal.
193
+ let receivedSignal = null;
194
+ class SignalCapturingSource extends BaseResearchSource {
195
+ name = "SignalCapture";
196
+ type = "signal_capture";
197
+ reliabilityTier = ReliabilityTier.TIER_1_NEWS;
198
+ domain = "signal.example.com";
199
+ isFree = true;
200
+ estimatedCostPerQuery = 0;
201
+ async fetchResult(_subject, signal) {
202
+ receivedSignal = signal;
203
+ return makeFinding();
204
+ }
205
+ }
206
+ const source = new SignalCapturingSource({ timeoutMs: 30000 });
207
+ await source.lookup(testSubject, abortController.signal);
208
+ // The received signal should NOT be the raw caller signal — it should
209
+ // be a combined signal (AbortSignal.any creates a new signal)
210
+ expect(receivedSignal).not.toBeNull();
211
+ expect(receivedSignal).not.toBe(abortController.signal);
212
+ });
213
+ // Additional edge cases
214
+ it("does not cache null results", async () => {
215
+ const cache = makeCache();
216
+ const source = new TestSource(null);
217
+ source.setCache(cache);
218
+ const result = await source.lookup(testSubject, abortController.signal);
219
+ expect(result).toBeNull();
220
+ expect(cache.set).not.toHaveBeenCalled();
221
+ });
222
+ it("handles invalid cached JSON gracefully", async () => {
223
+ const cache = makeCache();
224
+ cache.get.mockResolvedValue("not valid json {{{");
225
+ const freshFinding = makeFinding({ text: "fresh" });
226
+ const source = new TestSource(freshFinding);
227
+ source.setCache(cache);
228
+ const result = await source.lookup(testSubject, abortController.signal);
229
+ // Should fall through to fresh fetch
230
+ expect(result).toEqual(freshFinding);
231
+ });
232
+ it("does not calculate confidence when result.confidence is not -1", async () => {
233
+ const finding = makeFinding({
234
+ text: "No keywords here at all",
235
+ confidence: 0.9,
236
+ });
237
+ const source = new TestSource(finding, {
238
+ requiredKeywords: ["nonexistent"],
239
+ });
240
+ const result = await source.lookup(testSubject, abortController.signal);
241
+ // Confidence should remain as set, not recalculated to 0
242
+ expect(result.confidence).toBe(0.9);
243
+ });
244
+ it("uses default options when none provided", () => {
245
+ const source = new TestSource(makeFinding());
246
+ // Access protected options via lookup behavior — rate limiter default is 1000ms
247
+ const rateLimiter = makeRateLimiter();
248
+ source.setRateLimiter(rateLimiter);
249
+ source.lookup(testSubject, abortController.signal);
250
+ // Should use default rateLimitMs of 1000
251
+ expect(rateLimiter.acquire).toHaveBeenCalledWith("test.example.com", 1000);
252
+ });
253
+ it("span.end is called even when fetchResult throws", async () => {
254
+ const telemetry = makeTelemetry();
255
+ const source = new FailingSource();
256
+ source.setTelemetry(telemetry);
257
+ await source.lookup(testSubject, abortController.signal);
258
+ const span = telemetry.startSpan.mock.results[0]?.value;
259
+ expect(span.end).toHaveBeenCalled();
260
+ });
261
+ it("cache key includes source type and subject id", async () => {
262
+ const cache = makeCache();
263
+ const source = new TestSource(makeFinding());
264
+ source.setCache(cache);
265
+ await source.lookup(testSubject, abortController.signal);
266
+ const cacheKey = cache.get.mock.calls[0]?.[0];
267
+ expect(cacheKey).toContain("debriefer:");
268
+ expect(cacheKey).toContain("test_source");
269
+ expect(cacheKey).toContain("42");
270
+ });
271
+ // confidenceScorer callback tests
272
+ it("uses confidenceScorer callback when result.confidence is -1", async () => {
273
+ const finding = makeFinding({ text: "Marie Curie won two Nobel Prizes.", confidence: -1 });
274
+ const scorer = vi.fn().mockResolvedValue(0.92);
275
+ const source = new TestSource(finding, { confidenceScorer: scorer });
276
+ const result = await source.lookup(testSubject, abortController.signal);
277
+ expect(scorer).toHaveBeenCalledWith("Marie Curie won two Nobel Prizes.", testSubject);
278
+ expect(result.confidence).toBe(0.92);
279
+ });
280
+ it("confidenceScorer takes precedence over keyword heuristics", async () => {
281
+ const finding = makeFinding({ text: "John Wayne died in 1979.", confidence: -1 });
282
+ const scorer = vi.fn().mockReturnValue(0.99);
283
+ const source = new TestSource(finding, {
284
+ confidenceScorer: scorer,
285
+ requiredKeywords: ["died"],
286
+ bonusKeywords: ["cancer"],
287
+ });
288
+ const result = await source.lookup(testSubject, abortController.signal);
289
+ expect(scorer).toHaveBeenCalled();
290
+ expect(result.confidence).toBe(0.99);
291
+ });
292
+ it("does not call confidenceScorer when confidence is already set", async () => {
293
+ const finding = makeFinding({ text: "Some text", confidence: 0.7 });
294
+ const scorer = vi.fn().mockReturnValue(0.99);
295
+ const source = new TestSource(finding, { confidenceScorer: scorer });
296
+ const result = await source.lookup(testSubject, abortController.signal);
297
+ expect(scorer).not.toHaveBeenCalled();
298
+ expect(result.confidence).toBe(0.7);
299
+ });
300
+ it("supports synchronous confidenceScorer", async () => {
301
+ const finding = makeFinding({ text: "Test text", confidence: -1 });
302
+ const scorer = vi.fn().mockReturnValue(0.75);
303
+ const source = new TestSource(finding, { confidenceScorer: scorer });
304
+ const result = await source.lookup(testSubject, abortController.signal);
305
+ expect(result.confidence).toBe(0.75);
306
+ });
307
+ it("falls through to keyword heuristics when confidenceScorer throws", async () => {
308
+ const finding = makeFinding({ text: "John Wayne died in 1979.", confidence: -1 });
309
+ const scorer = vi.fn().mockRejectedValue(new Error("Scorer failed"));
310
+ const telemetry = makeTelemetry();
311
+ const source = new TestSource(finding, {
312
+ confidenceScorer: scorer,
313
+ requiredKeywords: ["died"],
314
+ });
315
+ source.setTelemetry(telemetry);
316
+ const result = await source.lookup(testSubject, abortController.signal);
317
+ // Result is preserved, confidence set by keyword heuristics
318
+ expect(result).not.toBeNull();
319
+ expect(result.confidence).toBeGreaterThan(0);
320
+ // Scorer error recorded via telemetry
321
+ expect(telemetry.recordError).toHaveBeenCalledWith(expect.objectContaining({ message: "Scorer failed" }), expect.objectContaining({ phase: "confidenceScorer" }));
322
+ });
323
+ it("preserves result with confidence -1 when scorer throws and no keywords", async () => {
324
+ const finding = makeFinding({ text: "Test text", confidence: -1 });
325
+ const scorer = vi.fn().mockRejectedValue(new Error("Scorer failed"));
326
+ const source = new TestSource(finding, { confidenceScorer: scorer });
327
+ const result = await source.lookup(testSubject, abortController.signal);
328
+ // Result preserved but confidence stays -1 (no fallback available)
329
+ expect(result).not.toBeNull();
330
+ expect(result.confidence).toBe(-1);
331
+ });
332
+ });
333
+ //# sourceMappingURL=base-source.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-source.test.js","sourceRoot":"","sources":["../../src/__tests__/base-source.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=batch-runner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-runner.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/batch-runner.test.ts"],"names":[],"mappings":""}