@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.
- package/README.md +86 -0
- package/dist/__tests__/base-source.test.d.ts +2 -0
- package/dist/__tests__/base-source.test.d.ts.map +1 -0
- package/dist/__tests__/base-source.test.js +333 -0
- package/dist/__tests__/base-source.test.js.map +1 -0
- package/dist/__tests__/batch-runner.test.d.ts +2 -0
- package/dist/__tests__/batch-runner.test.d.ts.map +1 -0
- package/dist/__tests__/batch-runner.test.js +217 -0
- package/dist/__tests__/batch-runner.test.js.map +1 -0
- package/dist/__tests__/cache.test.d.ts +2 -0
- package/dist/__tests__/cache.test.d.ts.map +1 -0
- package/dist/__tests__/cache.test.js +127 -0
- package/dist/__tests__/cache.test.js.map +1 -0
- package/dist/__tests__/confidence.test.d.ts +2 -0
- package/dist/__tests__/confidence.test.d.ts.map +1 -0
- package/dist/__tests__/confidence.test.js +81 -0
- package/dist/__tests__/confidence.test.js.map +1 -0
- package/dist/__tests__/cost-tracker.test.d.ts +2 -0
- package/dist/__tests__/cost-tracker.test.d.ts.map +1 -0
- package/dist/__tests__/cost-tracker.test.js +149 -0
- package/dist/__tests__/cost-tracker.test.js.map +1 -0
- package/dist/__tests__/orchestrator.test.d.ts +2 -0
- package/dist/__tests__/orchestrator.test.d.ts.map +1 -0
- package/dist/__tests__/orchestrator.test.js +751 -0
- package/dist/__tests__/orchestrator.test.js.map +1 -0
- package/dist/__tests__/rate-limiter.test.d.ts +2 -0
- package/dist/__tests__/rate-limiter.test.d.ts.map +1 -0
- package/dist/__tests__/rate-limiter.test.js +83 -0
- package/dist/__tests__/rate-limiter.test.js.map +1 -0
- package/dist/__tests__/reliability.test.d.ts +2 -0
- package/dist/__tests__/reliability.test.d.ts.map +1 -0
- package/dist/__tests__/reliability.test.js +207 -0
- package/dist/__tests__/reliability.test.js.map +1 -0
- package/dist/__tests__/synthesizer.test.d.ts +2 -0
- package/dist/__tests__/synthesizer.test.d.ts.map +1 -0
- package/dist/__tests__/synthesizer.test.js +50 -0
- package/dist/__tests__/synthesizer.test.js.map +1 -0
- package/dist/__tests__/telemetry.test.d.ts +2 -0
- package/dist/__tests__/telemetry.test.d.ts.map +1 -0
- package/dist/__tests__/telemetry.test.js +81 -0
- package/dist/__tests__/telemetry.test.js.map +1 -0
- package/dist/__tests__/types.test.d.ts +2 -0
- package/dist/__tests__/types.test.d.ts.map +1 -0
- package/dist/__tests__/types.test.js +708 -0
- package/dist/__tests__/types.test.js.map +1 -0
- package/dist/base-source.d.ts +91 -0
- package/dist/base-source.d.ts.map +1 -0
- package/dist/base-source.js +144 -0
- package/dist/base-source.js.map +1 -0
- package/dist/batch-runner.d.ts +40 -0
- package/dist/batch-runner.d.ts.map +1 -0
- package/dist/batch-runner.js +65 -0
- package/dist/batch-runner.js.map +1 -0
- package/dist/cache/in-memory.d.ts +26 -0
- package/dist/cache/in-memory.d.ts.map +1 -0
- package/dist/cache/in-memory.js +51 -0
- package/dist/cache/in-memory.js.map +1 -0
- package/dist/confidence.d.ts +13 -0
- package/dist/confidence.d.ts.map +1 -0
- package/dist/confidence.js +29 -0
- package/dist/confidence.js.map +1 -0
- package/dist/cost-tracker.d.ts +37 -0
- package/dist/cost-tracker.d.ts.map +1 -0
- package/dist/cost-tracker.js +62 -0
- package/dist/cost-tracker.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator.d.ts +92 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +373 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/rate-limiter.d.ts +31 -0
- package/dist/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limiter.js +79 -0
- package/dist/rate-limiter.js.map +1 -0
- package/dist/reliability.d.ts +49 -0
- package/dist/reliability.d.ts.map +1 -0
- package/dist/reliability.js +67 -0
- package/dist/reliability.js.map +1 -0
- package/dist/synthesizer.d.ts +31 -0
- package/dist/synthesizer.d.ts.map +1 -0
- package/dist/synthesizer.js +47 -0
- package/dist/synthesizer.js.map +1 -0
- package/dist/telemetry/console.d.ts +7 -0
- package/dist/telemetry/console.d.ts.map +1 -0
- package/dist/telemetry/console.js +21 -0
- package/dist/telemetry/console.js.map +1 -0
- package/dist/telemetry/noop.d.ts +7 -0
- package/dist/telemetry/noop.d.ts.map +1 -0
- package/dist/telemetry/noop.js +12 -0
- package/dist/telemetry/noop.js.map +1 -0
- package/dist/types.d.ts +417 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +102 -0
- package/dist/types.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"batch-runner.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/batch-runner.test.ts"],"names":[],"mappings":""}
|