swift-skills 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/LICENSE +21 -0
- package/README.md +410 -0
- package/build/cli/auth.d.ts +3 -0
- package/build/cli/auth.d.ts.map +1 -0
- package/build/cli/auth.js +44 -0
- package/build/cli/auth.js.map +1 -0
- package/build/cli/setup.d.ts +2 -0
- package/build/cli/setup.d.ts.map +1 -0
- package/build/cli/setup.js +150 -0
- package/build/cli/setup.js.map +1 -0
- package/build/cli/source-manager.d.ts +3 -0
- package/build/cli/source-manager.d.ts.map +1 -0
- package/build/cli/source-manager.js +117 -0
- package/build/cli/source-manager.js.map +1 -0
- package/build/config/creators.d.ts +11 -0
- package/build/config/creators.d.ts.map +1 -0
- package/build/config/creators.js +32 -0
- package/build/config/creators.js.map +1 -0
- package/build/config/sources.d.ts +91 -0
- package/build/config/sources.d.ts.map +1 -0
- package/build/config/sources.js +231 -0
- package/build/config/sources.js.map +1 -0
- package/build/config/sources.test.d.ts +2 -0
- package/build/config/sources.test.d.ts.map +1 -0
- package/build/config/sources.test.js +199 -0
- package/build/config/sources.test.js.map +1 -0
- package/build/config/swift-keywords.d.ts +29 -0
- package/build/config/swift-keywords.d.ts.map +1 -0
- package/build/config/swift-keywords.js +77 -0
- package/build/config/swift-keywords.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +181 -0
- package/build/index.js.map +1 -0
- package/build/integration/cache-behavior.test.d.ts +2 -0
- package/build/integration/cache-behavior.test.d.ts.map +1 -0
- package/build/integration/cache-behavior.test.js +521 -0
- package/build/integration/cache-behavior.test.js.map +1 -0
- package/build/integration/mcp-client.test.d.ts +2 -0
- package/build/integration/mcp-client.test.d.ts.map +1 -0
- package/build/integration/mcp-client.test.js +82 -0
- package/build/integration/mcp-client.test.js.map +1 -0
- package/build/integration/response-quality.test.d.ts +2 -0
- package/build/integration/response-quality.test.d.ts.map +1 -0
- package/build/integration/response-quality.test.js +230 -0
- package/build/integration/response-quality.test.js.map +1 -0
- package/build/integration/test-client.d.ts +25 -0
- package/build/integration/test-client.d.ts.map +1 -0
- package/build/integration/test-client.js +93 -0
- package/build/integration/test-client.js.map +1 -0
- package/build/sources/free/nilcoalescing.d.ts +8 -0
- package/build/sources/free/nilcoalescing.d.ts.map +1 -0
- package/build/sources/free/nilcoalescing.js +26 -0
- package/build/sources/free/nilcoalescing.js.map +1 -0
- package/build/sources/free/nilcoalescing.test.d.ts +2 -0
- package/build/sources/free/nilcoalescing.test.d.ts.map +1 -0
- package/build/sources/free/nilcoalescing.test.js +63 -0
- package/build/sources/free/nilcoalescing.test.js.map +1 -0
- package/build/sources/free/pointfree.d.ts +15 -0
- package/build/sources/free/pointfree.d.ts.map +1 -0
- package/build/sources/free/pointfree.js +175 -0
- package/build/sources/free/pointfree.js.map +1 -0
- package/build/sources/free/pointfree.test.d.ts +2 -0
- package/build/sources/free/pointfree.test.d.ts.map +1 -0
- package/build/sources/free/pointfree.test.js +86 -0
- package/build/sources/free/pointfree.test.js.map +1 -0
- package/build/sources/free/rssPatternSource.d.ts +42 -0
- package/build/sources/free/rssPatternSource.d.ts.map +1 -0
- package/build/sources/free/rssPatternSource.js +109 -0
- package/build/sources/free/rssPatternSource.js.map +1 -0
- package/build/sources/free/rssPatternSource.test.d.ts +2 -0
- package/build/sources/free/rssPatternSource.test.d.ts.map +1 -0
- package/build/sources/free/rssPatternSource.test.js +89 -0
- package/build/sources/free/rssPatternSource.test.js.map +1 -0
- package/build/sources/free/sundell.d.ts +8 -0
- package/build/sources/free/sundell.d.ts.map +1 -0
- package/build/sources/free/sundell.js +17 -0
- package/build/sources/free/sundell.js.map +1 -0
- package/build/sources/free/sundell.test.d.ts +2 -0
- package/build/sources/free/sundell.test.d.ts.map +1 -0
- package/build/sources/free/sundell.test.js +63 -0
- package/build/sources/free/sundell.test.js.map +1 -0
- package/build/sources/free/vanderlee.d.ts +8 -0
- package/build/sources/free/vanderlee.d.ts.map +1 -0
- package/build/sources/free/vanderlee.js +63 -0
- package/build/sources/free/vanderlee.js.map +1 -0
- package/build/sources/free/vanderlee.test.d.ts +2 -0
- package/build/sources/free/vanderlee.test.d.ts.map +1 -0
- package/build/sources/free/vanderlee.test.js +77 -0
- package/build/sources/free/vanderlee.test.js.map +1 -0
- package/build/sources/premium/patreon-dl.d.ts +45 -0
- package/build/sources/premium/patreon-dl.d.ts.map +1 -0
- package/build/sources/premium/patreon-dl.js +189 -0
- package/build/sources/premium/patreon-dl.js.map +1 -0
- package/build/sources/premium/patreon-fetch.d.ts +3 -0
- package/build/sources/premium/patreon-fetch.d.ts.map +1 -0
- package/build/sources/premium/patreon-fetch.js +18 -0
- package/build/sources/premium/patreon-fetch.js.map +1 -0
- package/build/sources/premium/patreon-oauth.d.ts +24 -0
- package/build/sources/premium/patreon-oauth.d.ts.map +1 -0
- package/build/sources/premium/patreon-oauth.js +208 -0
- package/build/sources/premium/patreon-oauth.js.map +1 -0
- package/build/sources/premium/patreon-zip.d.ts +17 -0
- package/build/sources/premium/patreon-zip.d.ts.map +1 -0
- package/build/sources/premium/patreon-zip.js +127 -0
- package/build/sources/premium/patreon-zip.js.map +1 -0
- package/build/sources/premium/patreon.d.ts +48 -0
- package/build/sources/premium/patreon.d.ts.map +1 -0
- package/build/sources/premium/patreon.js +221 -0
- package/build/sources/premium/patreon.js.map +1 -0
- package/build/sources/premium/youtube.d.ts +14 -0
- package/build/sources/premium/youtube.d.ts.map +1 -0
- package/build/sources/premium/youtube.js +92 -0
- package/build/sources/premium/youtube.js.map +1 -0
- package/build/tools/extract-cookie.d.ts +2 -0
- package/build/tools/extract-cookie.d.ts.map +1 -0
- package/build/tools/extract-cookie.js +40 -0
- package/build/tools/extract-cookie.js.map +1 -0
- package/build/tools/handlers/enableSource.d.ts +3 -0
- package/build/tools/handlers/enableSource.d.ts.map +1 -0
- package/build/tools/handlers/enableSource.js +25 -0
- package/build/tools/handlers/enableSource.js.map +1 -0
- package/build/tools/handlers/getPatreonPatterns.d.ts +3 -0
- package/build/tools/handlers/getPatreonPatterns.d.ts.map +1 -0
- package/build/tools/handlers/getPatreonPatterns.js +43 -0
- package/build/tools/handlers/getPatreonPatterns.js.map +1 -0
- package/build/tools/handlers/getSwiftPattern.d.ts +3 -0
- package/build/tools/handlers/getSwiftPattern.d.ts.map +1 -0
- package/build/tools/handlers/getSwiftPattern.js +72 -0
- package/build/tools/handlers/getSwiftPattern.js.map +1 -0
- package/build/tools/handlers/handlers.test.d.ts +2 -0
- package/build/tools/handlers/handlers.test.d.ts.map +1 -0
- package/build/tools/handlers/handlers.test.js +359 -0
- package/build/tools/handlers/handlers.test.js.map +1 -0
- package/build/tools/handlers/listContentSources.d.ts +3 -0
- package/build/tools/handlers/listContentSources.d.ts.map +1 -0
- package/build/tools/handlers/listContentSources.js +34 -0
- package/build/tools/handlers/listContentSources.js.map +1 -0
- package/build/tools/handlers/searchSwiftContent.d.ts +3 -0
- package/build/tools/handlers/searchSwiftContent.d.ts.map +1 -0
- package/build/tools/handlers/searchSwiftContent.js +121 -0
- package/build/tools/handlers/searchSwiftContent.js.map +1 -0
- package/build/tools/handlers/setupPatreon.d.ts +3 -0
- package/build/tools/handlers/setupPatreon.d.ts.map +1 -0
- package/build/tools/handlers/setupPatreon.js +40 -0
- package/build/tools/handlers/setupPatreon.js.map +1 -0
- package/build/tools/index.d.ts +3 -0
- package/build/tools/index.d.ts.map +1 -0
- package/build/tools/index.js +18 -0
- package/build/tools/index.js.map +1 -0
- package/build/tools/registry.d.ts +14 -0
- package/build/tools/registry.d.ts.map +1 -0
- package/build/tools/registry.js +21 -0
- package/build/tools/registry.js.map +1 -0
- package/build/tools/registry.test.d.ts +2 -0
- package/build/tools/registry.test.d.ts.map +1 -0
- package/build/tools/registry.test.js +54 -0
- package/build/tools/registry.test.js.map +1 -0
- package/build/tools/types.d.ts +67 -0
- package/build/tools/types.d.ts.map +1 -0
- package/build/tools/types.js +3 -0
- package/build/tools/types.js.map +1 -0
- package/build/utils/cache.d.ts +20 -0
- package/build/utils/cache.d.ts.map +1 -0
- package/build/utils/cache.js +186 -0
- package/build/utils/cache.js.map +1 -0
- package/build/utils/concurrency.d.ts +13 -0
- package/build/utils/concurrency.d.ts.map +1 -0
- package/build/utils/concurrency.js +33 -0
- package/build/utils/concurrency.js.map +1 -0
- package/build/utils/errors.d.ts +19 -0
- package/build/utils/errors.d.ts.map +1 -0
- package/build/utils/errors.js +35 -0
- package/build/utils/errors.js.map +1 -0
- package/build/utils/fetch.d.ts +6 -0
- package/build/utils/fetch.d.ts.map +1 -0
- package/build/utils/fetch.js +6 -0
- package/build/utils/fetch.js.map +1 -0
- package/build/utils/http.d.ts +21 -0
- package/build/utils/http.d.ts.map +1 -0
- package/build/utils/http.js +53 -0
- package/build/utils/http.js.map +1 -0
- package/build/utils/intent-cache.d.ts +94 -0
- package/build/utils/intent-cache.d.ts.map +1 -0
- package/build/utils/intent-cache.js +164 -0
- package/build/utils/intent-cache.js.map +1 -0
- package/build/utils/intent-cache.test.d.ts +2 -0
- package/build/utils/intent-cache.test.d.ts.map +1 -0
- package/build/utils/intent-cache.test.js +290 -0
- package/build/utils/intent-cache.test.js.map +1 -0
- package/build/utils/logger.d.ts +4 -0
- package/build/utils/logger.d.ts.map +1 -0
- package/build/utils/logger.js +9 -0
- package/build/utils/logger.js.map +1 -0
- package/build/utils/paths.d.ts +27 -0
- package/build/utils/paths.d.ts.map +1 -0
- package/build/utils/paths.js +43 -0
- package/build/utils/paths.js.map +1 -0
- package/build/utils/pattern-formatter.d.ts +40 -0
- package/build/utils/pattern-formatter.d.ts.map +1 -0
- package/build/utils/pattern-formatter.js +124 -0
- package/build/utils/pattern-formatter.js.map +1 -0
- package/build/utils/response-helpers.d.ts +17 -0
- package/build/utils/response-helpers.d.ts.map +1 -0
- package/build/utils/response-helpers.js +34 -0
- package/build/utils/response-helpers.js.map +1 -0
- package/build/utils/search-terms.d.ts +17 -0
- package/build/utils/search-terms.d.ts.map +1 -0
- package/build/utils/search-terms.js +71 -0
- package/build/utils/search-terms.js.map +1 -0
- package/build/utils/search-terms.test.d.ts +2 -0
- package/build/utils/search-terms.test.d.ts.map +1 -0
- package/build/utils/search-terms.test.js +107 -0
- package/build/utils/search-terms.test.js.map +1 -0
- package/build/utils/search.d.ts +48 -0
- package/build/utils/search.d.ts.map +1 -0
- package/build/utils/search.js +158 -0
- package/build/utils/search.js.map +1 -0
- package/build/utils/search.test.d.ts +2 -0
- package/build/utils/search.test.d.ts.map +1 -0
- package/build/utils/search.test.js +199 -0
- package/build/utils/search.test.js.map +1 -0
- package/build/utils/semantic-recall.d.ts +38 -0
- package/build/utils/semantic-recall.d.ts.map +1 -0
- package/build/utils/semantic-recall.js +134 -0
- package/build/utils/semantic-recall.js.map +1 -0
- package/build/utils/semantic-recall.test.d.ts +2 -0
- package/build/utils/semantic-recall.test.d.ts.map +1 -0
- package/build/utils/semantic-recall.test.js +326 -0
- package/build/utils/semantic-recall.test.js.map +1 -0
- package/build/utils/source-registry.d.ts +45 -0
- package/build/utils/source-registry.d.ts.map +1 -0
- package/build/utils/source-registry.js +113 -0
- package/build/utils/source-registry.js.map +1 -0
- package/build/utils/source-registry.test.d.ts +2 -0
- package/build/utils/source-registry.test.d.ts.map +1 -0
- package/build/utils/source-registry.test.js +206 -0
- package/build/utils/source-registry.test.js.map +1 -0
- package/build/utils/swift-analysis.d.ts +61 -0
- package/build/utils/swift-analysis.d.ts.map +1 -0
- package/build/utils/swift-analysis.js +339 -0
- package/build/utils/swift-analysis.js.map +1 -0
- package/build/utils/swift-analysis.test.d.ts +2 -0
- package/build/utils/swift-analysis.test.d.ts.map +1 -0
- package/build/utils/swift-analysis.test.js +473 -0
- package/build/utils/swift-analysis.test.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
// src/utils/semantic-recall.test.ts
|
|
2
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
3
|
+
import { SemanticRecallIndex, DEFAULT_CONFIG } from './semantic-recall.js';
|
|
4
|
+
// Mock the transformer pipeline to avoid slow model loading in tests
|
|
5
|
+
vi.mock('@xenova/transformers', () => ({
|
|
6
|
+
pipeline: vi.fn().mockResolvedValue(async (text) => ({
|
|
7
|
+
data: new Float32Array(384).fill(0.1 + text.length / 1000), // Mock embedding varying by text length
|
|
8
|
+
})),
|
|
9
|
+
env: { allowLocalModels: false },
|
|
10
|
+
}));
|
|
11
|
+
// Mock ml-distance
|
|
12
|
+
vi.mock('ml-distance', () => ({
|
|
13
|
+
similarity: {
|
|
14
|
+
cosine: vi.fn((a, b) => {
|
|
15
|
+
// Simple mock: higher similarity for more similar lengths
|
|
16
|
+
const lenDiff = Math.abs(a.length - b.length);
|
|
17
|
+
return 1 - lenDiff / 1000;
|
|
18
|
+
}),
|
|
19
|
+
},
|
|
20
|
+
}));
|
|
21
|
+
// Helper to create mock patterns
|
|
22
|
+
function createMockPattern(overrides = {}) {
|
|
23
|
+
return {
|
|
24
|
+
id: `pattern-${Math.random().toString(36).substr(2, 9)}`,
|
|
25
|
+
title: 'Test Pattern',
|
|
26
|
+
url: 'https://example.com/test',
|
|
27
|
+
publishDate: '2024-01-01',
|
|
28
|
+
excerpt: 'A test excerpt about Swift programming.',
|
|
29
|
+
content: 'Full content here...',
|
|
30
|
+
topics: ['swift', 'testing'],
|
|
31
|
+
relevanceScore: 75,
|
|
32
|
+
hasCode: true,
|
|
33
|
+
...overrides,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
describe('SemanticRecallIndex', () => {
|
|
37
|
+
describe('Config defaults', () => {
|
|
38
|
+
it('should have enabled = false by default', () => {
|
|
39
|
+
expect(DEFAULT_CONFIG.enabled).toBe(false);
|
|
40
|
+
});
|
|
41
|
+
it('should have minLexicalScore = 0.35 by default', () => {
|
|
42
|
+
expect(DEFAULT_CONFIG.minLexicalScore).toBe(0.35);
|
|
43
|
+
});
|
|
44
|
+
it('should have minRelevanceScore = 70 by default', () => {
|
|
45
|
+
expect(DEFAULT_CONFIG.minRelevanceScore).toBe(70);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('Pattern filtering during index()', () => {
|
|
49
|
+
it('should only index patterns with relevanceScore >= minRelevanceScore', async () => {
|
|
50
|
+
const index = new SemanticRecallIndex({
|
|
51
|
+
enabled: true,
|
|
52
|
+
minLexicalScore: 0.35,
|
|
53
|
+
minRelevanceScore: 70,
|
|
54
|
+
});
|
|
55
|
+
const patterns = [
|
|
56
|
+
createMockPattern({ id: 'high-1', relevanceScore: 85, title: 'High Quality' }),
|
|
57
|
+
createMockPattern({ id: 'low-1', relevanceScore: 65, title: 'Low Quality' }),
|
|
58
|
+
createMockPattern({ id: 'high-2', relevanceScore: 72, title: 'High Quality 2' }),
|
|
59
|
+
];
|
|
60
|
+
await index.index(patterns);
|
|
61
|
+
// Search should only return high-quality patterns
|
|
62
|
+
const results = await index.search('test', 10);
|
|
63
|
+
const ids = results.map(p => p.id);
|
|
64
|
+
expect(ids).toContain('high-1');
|
|
65
|
+
expect(ids).toContain('high-2');
|
|
66
|
+
expect(ids).not.toContain('low-1');
|
|
67
|
+
});
|
|
68
|
+
it('should skip patterns below threshold', async () => {
|
|
69
|
+
const index = new SemanticRecallIndex({
|
|
70
|
+
enabled: true,
|
|
71
|
+
minLexicalScore: 0.35,
|
|
72
|
+
minRelevanceScore: 80,
|
|
73
|
+
});
|
|
74
|
+
const patterns = [
|
|
75
|
+
createMockPattern({ id: 'very-high', relevanceScore: 90 }),
|
|
76
|
+
createMockPattern({ id: 'medium', relevanceScore: 75 }),
|
|
77
|
+
];
|
|
78
|
+
await index.index(patterns);
|
|
79
|
+
const results = await index.search('test', 10);
|
|
80
|
+
expect(results.length).toBe(1);
|
|
81
|
+
expect(results[0].id).toBe('very-high');
|
|
82
|
+
});
|
|
83
|
+
it('should handle empty pattern array', async () => {
|
|
84
|
+
const index = new SemanticRecallIndex();
|
|
85
|
+
await index.index([]);
|
|
86
|
+
const results = await index.search('test', 10);
|
|
87
|
+
expect(results).toEqual([]);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
describe('Content extraction', () => {
|
|
91
|
+
it('should extract title and excerpt only', async () => {
|
|
92
|
+
const index = new SemanticRecallIndex({
|
|
93
|
+
enabled: true,
|
|
94
|
+
minLexicalScore: 0.35,
|
|
95
|
+
minRelevanceScore: 70,
|
|
96
|
+
});
|
|
97
|
+
const pattern = createMockPattern({
|
|
98
|
+
id: 'test-1',
|
|
99
|
+
title: 'SwiftUI Patterns',
|
|
100
|
+
excerpt: 'Learn about SwiftUI state management',
|
|
101
|
+
content: 'This is a very long article with many details...',
|
|
102
|
+
relevanceScore: 75,
|
|
103
|
+
});
|
|
104
|
+
await index.index([pattern]);
|
|
105
|
+
const results = await index.search('SwiftUI', 10);
|
|
106
|
+
// Should find the pattern based on title/excerpt
|
|
107
|
+
expect(results.length).toBeGreaterThan(0);
|
|
108
|
+
});
|
|
109
|
+
it('should handle missing excerpt gracefully', async () => {
|
|
110
|
+
const index = new SemanticRecallIndex({
|
|
111
|
+
enabled: true,
|
|
112
|
+
minLexicalScore: 0.35,
|
|
113
|
+
minRelevanceScore: 70,
|
|
114
|
+
});
|
|
115
|
+
const pattern = createMockPattern({
|
|
116
|
+
id: 'no-excerpt',
|
|
117
|
+
title: 'Test Pattern',
|
|
118
|
+
excerpt: '',
|
|
119
|
+
content: 'Some content here',
|
|
120
|
+
relevanceScore: 75,
|
|
121
|
+
});
|
|
122
|
+
await expect(index.index([pattern])).resolves.not.toThrow();
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
describe('Search behavior', () => {
|
|
126
|
+
it('should return top-K patterns by similarity', async () => {
|
|
127
|
+
const index = new SemanticRecallIndex({
|
|
128
|
+
enabled: true,
|
|
129
|
+
minLexicalScore: 0.35,
|
|
130
|
+
minRelevanceScore: 70,
|
|
131
|
+
});
|
|
132
|
+
const patterns = [
|
|
133
|
+
createMockPattern({ id: 'p1', title: 'Pattern 1', relevanceScore: 75 }),
|
|
134
|
+
createMockPattern({ id: 'p2', title: 'Pattern 2', relevanceScore: 80 }),
|
|
135
|
+
createMockPattern({ id: 'p3', title: 'Pattern 3', relevanceScore: 85 }),
|
|
136
|
+
createMockPattern({ id: 'p4', title: 'Pattern 4', relevanceScore: 90 }),
|
|
137
|
+
];
|
|
138
|
+
await index.index(patterns);
|
|
139
|
+
const results = await index.search('test', 2);
|
|
140
|
+
// Should return only top 2
|
|
141
|
+
expect(results.length).toBe(2);
|
|
142
|
+
});
|
|
143
|
+
it('should return empty array when no patterns indexed', async () => {
|
|
144
|
+
const index = new SemanticRecallIndex();
|
|
145
|
+
const results = await index.search('test', 10);
|
|
146
|
+
expect(results).toEqual([]);
|
|
147
|
+
});
|
|
148
|
+
it('should handle query with no matches', async () => {
|
|
149
|
+
const index = new SemanticRecallIndex({
|
|
150
|
+
enabled: true,
|
|
151
|
+
minLexicalScore: 0.35,
|
|
152
|
+
minRelevanceScore: 70,
|
|
153
|
+
});
|
|
154
|
+
const pattern = createMockPattern({
|
|
155
|
+
id: 'test',
|
|
156
|
+
title: 'Test',
|
|
157
|
+
relevanceScore: 75,
|
|
158
|
+
});
|
|
159
|
+
await index.index([pattern]);
|
|
160
|
+
// Even with no "match", semantic search returns similarity scores
|
|
161
|
+
// So this should still return results (just with lower scores)
|
|
162
|
+
const results = await index.search('completely different query', 10);
|
|
163
|
+
expect(Array.isArray(results)).toBe(true);
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
describe('Embedding caching', () => {
|
|
167
|
+
it('should cache embeddings keyed by pattern.id + contentHash', async () => {
|
|
168
|
+
const index = new SemanticRecallIndex({
|
|
169
|
+
enabled: true,
|
|
170
|
+
minLexicalScore: 0.35,
|
|
171
|
+
minRelevanceScore: 70,
|
|
172
|
+
});
|
|
173
|
+
const pattern = createMockPattern({
|
|
174
|
+
id: 'cache-test',
|
|
175
|
+
title: 'Cache Test Pattern',
|
|
176
|
+
excerpt: 'This tests caching',
|
|
177
|
+
relevanceScore: 75,
|
|
178
|
+
});
|
|
179
|
+
// First index - should compute embedding
|
|
180
|
+
await index.index([pattern]);
|
|
181
|
+
// Second index - should use cached embedding
|
|
182
|
+
await index.index([pattern]);
|
|
183
|
+
// Verify it doesn't throw and returns results
|
|
184
|
+
const results = await index.search('cache', 10);
|
|
185
|
+
expect(results.length).toBeGreaterThan(0);
|
|
186
|
+
});
|
|
187
|
+
it('should handle different content producing different cache key', async () => {
|
|
188
|
+
const index = new SemanticRecallIndex({
|
|
189
|
+
enabled: true,
|
|
190
|
+
minLexicalScore: 0.35,
|
|
191
|
+
minRelevanceScore: 70,
|
|
192
|
+
});
|
|
193
|
+
const pattern1 = createMockPattern({
|
|
194
|
+
id: 'same-id',
|
|
195
|
+
title: 'Title 1',
|
|
196
|
+
excerpt: 'Content 1',
|
|
197
|
+
relevanceScore: 75,
|
|
198
|
+
});
|
|
199
|
+
const pattern2 = createMockPattern({
|
|
200
|
+
id: 'same-id',
|
|
201
|
+
title: 'Title 2',
|
|
202
|
+
excerpt: 'Content 2',
|
|
203
|
+
relevanceScore: 75,
|
|
204
|
+
});
|
|
205
|
+
// Index with different content but same ID
|
|
206
|
+
await index.index([pattern1]);
|
|
207
|
+
await index.index([pattern2]);
|
|
208
|
+
// Should not throw - different cache keys
|
|
209
|
+
expect(true).toBe(true);
|
|
210
|
+
});
|
|
211
|
+
it('should use incremental indexing (skip unchanged patterns)', async () => {
|
|
212
|
+
const index = new SemanticRecallIndex({
|
|
213
|
+
enabled: true,
|
|
214
|
+
minLexicalScore: 0.35,
|
|
215
|
+
minRelevanceScore: 70,
|
|
216
|
+
});
|
|
217
|
+
const pattern1 = createMockPattern({
|
|
218
|
+
id: 'pattern-1',
|
|
219
|
+
title: 'Unchanged Pattern',
|
|
220
|
+
excerpt: 'This will stay the same',
|
|
221
|
+
relevanceScore: 75,
|
|
222
|
+
});
|
|
223
|
+
const pattern2 = createMockPattern({
|
|
224
|
+
id: 'pattern-2',
|
|
225
|
+
title: 'Another Pattern',
|
|
226
|
+
excerpt: 'Different content',
|
|
227
|
+
relevanceScore: 80,
|
|
228
|
+
});
|
|
229
|
+
// First index - both patterns added
|
|
230
|
+
await index.index([pattern1, pattern2]);
|
|
231
|
+
expect(index.size).toBe(2);
|
|
232
|
+
// Second index with same patterns - should skip recomputing
|
|
233
|
+
await index.index([pattern1, pattern2]);
|
|
234
|
+
expect(index.size).toBe(2);
|
|
235
|
+
// Third index with only pattern1 - pattern2 should be removed
|
|
236
|
+
await index.index([pattern1]);
|
|
237
|
+
expect(index.size).toBe(1);
|
|
238
|
+
// Verify correct pattern remains
|
|
239
|
+
const results = await index.search('unchanged', 10);
|
|
240
|
+
expect(results.length).toBe(1);
|
|
241
|
+
expect(results[0].id).toBe('pattern-1');
|
|
242
|
+
});
|
|
243
|
+
it('should update pattern metadata while keeping same embedding', async () => {
|
|
244
|
+
const index = new SemanticRecallIndex({
|
|
245
|
+
enabled: true,
|
|
246
|
+
minLexicalScore: 0.35,
|
|
247
|
+
minRelevanceScore: 70,
|
|
248
|
+
});
|
|
249
|
+
const pattern = createMockPattern({
|
|
250
|
+
id: 'update-test',
|
|
251
|
+
title: 'Same Title',
|
|
252
|
+
excerpt: 'Same Excerpt',
|
|
253
|
+
relevanceScore: 75,
|
|
254
|
+
topics: ['original'],
|
|
255
|
+
});
|
|
256
|
+
await index.index([pattern]);
|
|
257
|
+
// Update pattern with different metadata but same title/excerpt (same content hash)
|
|
258
|
+
const updatedPattern = createMockPattern({
|
|
259
|
+
id: 'update-test',
|
|
260
|
+
title: 'Same Title',
|
|
261
|
+
excerpt: 'Same Excerpt',
|
|
262
|
+
relevanceScore: 85,
|
|
263
|
+
topics: ['updated', 'new-topic'],
|
|
264
|
+
});
|
|
265
|
+
await index.index([updatedPattern]);
|
|
266
|
+
// Should still have only 1 indexed pattern
|
|
267
|
+
expect(index.size).toBe(1);
|
|
268
|
+
// Pattern reference should be updated
|
|
269
|
+
const results = await index.search('same', 10);
|
|
270
|
+
expect(results[0].relevanceScore).toBe(85);
|
|
271
|
+
expect(results[0].topics).toEqual(['updated', 'new-topic']);
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
describe('Semantic recall fallback integration', () => {
|
|
276
|
+
it('should not activate when disabled', async () => {
|
|
277
|
+
const index = new SemanticRecallIndex({ ...DEFAULT_CONFIG, enabled: false });
|
|
278
|
+
const indexSpy = vi.spyOn(index, 'index');
|
|
279
|
+
// Simulate handler logic with disabled config
|
|
280
|
+
const enabled = false;
|
|
281
|
+
if (enabled) {
|
|
282
|
+
await index.index([]);
|
|
283
|
+
}
|
|
284
|
+
expect(indexSpy).not.toHaveBeenCalled();
|
|
285
|
+
});
|
|
286
|
+
it('should activate only when lexical score is below threshold', () => {
|
|
287
|
+
const config = {
|
|
288
|
+
enabled: true,
|
|
289
|
+
minLexicalScore: 0.35,
|
|
290
|
+
minRelevanceScore: 70,
|
|
291
|
+
};
|
|
292
|
+
// Simulate weak lexical results (max score 30/100 = 0.3)
|
|
293
|
+
const weakMaxScore = 30 / 100;
|
|
294
|
+
expect(weakMaxScore).toBeLessThan(config.minLexicalScore);
|
|
295
|
+
// Simulate strong lexical results (max score 80/100 = 0.8)
|
|
296
|
+
const strongMaxScore = 80 / 100;
|
|
297
|
+
expect(strongMaxScore).toBeGreaterThan(config.minLexicalScore);
|
|
298
|
+
});
|
|
299
|
+
it('should merge results conservatively (no duplicates)', () => {
|
|
300
|
+
const lexicalResults = [
|
|
301
|
+
createMockPattern({ id: 'A', title: 'A' }),
|
|
302
|
+
createMockPattern({ id: 'B', title: 'B' }),
|
|
303
|
+
];
|
|
304
|
+
const semanticResults = [
|
|
305
|
+
createMockPattern({ id: 'B', title: 'B' }),
|
|
306
|
+
createMockPattern({ id: 'C', title: 'C' }),
|
|
307
|
+
];
|
|
308
|
+
// Simulate conservative merge
|
|
309
|
+
const existingIds = new Set(lexicalResults.map(p => p.id));
|
|
310
|
+
const newSemanticResults = semanticResults.filter(p => !existingIds.has(p.id));
|
|
311
|
+
const merged = [...lexicalResults, ...newSemanticResults];
|
|
312
|
+
expect(merged.length).toBe(3);
|
|
313
|
+
expect(merged.map(p => p.id)).toEqual(['A', 'B', 'C']);
|
|
314
|
+
});
|
|
315
|
+
it('should filter out low-relevance patterns after merge', () => {
|
|
316
|
+
const merged = [
|
|
317
|
+
createMockPattern({ id: 'high', relevanceScore: 80 }),
|
|
318
|
+
createMockPattern({ id: 'low', relevanceScore: 60 }),
|
|
319
|
+
];
|
|
320
|
+
const minRelevanceScore = 70;
|
|
321
|
+
const filtered = merged.filter(p => p.relevanceScore >= minRelevanceScore);
|
|
322
|
+
expect(filtered.length).toBe(1);
|
|
323
|
+
expect(filtered[0].id).toBe('high');
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
//# sourceMappingURL=semantic-recall.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-recall.test.js","sourceRoot":"","sources":["../../src/utils/semantic-recall.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized source registry to eliminate duplication in handlers
|
|
3
|
+
*/
|
|
4
|
+
import type { BasePattern } from '../sources/free/rssPatternSource.js';
|
|
5
|
+
export type FreeSourceName = 'sundell' | 'vanderlee' | 'nilcoalescing' | 'pointfree';
|
|
6
|
+
export interface FreeSource {
|
|
7
|
+
searchPatterns(query: string): Promise<BasePattern[]>;
|
|
8
|
+
fetchPatterns(): Promise<BasePattern[]>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Get a source instance by name (singleton)
|
|
12
|
+
*/
|
|
13
|
+
export declare function getSource(name: FreeSourceName): FreeSource;
|
|
14
|
+
/**
|
|
15
|
+
* Get all free source instances
|
|
16
|
+
*/
|
|
17
|
+
export declare function getAllFreeSources(): FreeSource[];
|
|
18
|
+
/**
|
|
19
|
+
* Get source instances by name(s)
|
|
20
|
+
* @param sourceNames - Array of source names, or 'all' for all sources
|
|
21
|
+
*/
|
|
22
|
+
export declare function getSources(sourceNames: FreeSourceName | 'all' | FreeSourceName[]): FreeSource[];
|
|
23
|
+
/**
|
|
24
|
+
* Get source names for a given source parameter
|
|
25
|
+
* Used for intent cache key generation
|
|
26
|
+
*/
|
|
27
|
+
export declare function getSourceNames(sourceNames: FreeSourceName | 'all' | FreeSourceName[]): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Search multiple sources and combine results
|
|
30
|
+
* Uses Promise.allSettled to collect partial results even if some sources fail
|
|
31
|
+
*/
|
|
32
|
+
export declare function searchMultipleSources(query: string, sourceNames?: FreeSourceName | 'all' | FreeSourceName[]): Promise<BasePattern[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Prefetch all sources to warm up caches and search indexes
|
|
35
|
+
* Call this on startup when prefetchSources is enabled
|
|
36
|
+
* @returns Results of prefetch operations for all sources
|
|
37
|
+
*/
|
|
38
|
+
export declare function prefetchAllSources(): Promise<PromiseSettledResult<BasePattern[]>[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Fetch all patterns from specified sources.
|
|
41
|
+
* Uses Promise.allSettled to collect partial results even if some sources fail.
|
|
42
|
+
* @param sourceIds - Optional array of source IDs to fetch from. Defaults to all sources.
|
|
43
|
+
*/
|
|
44
|
+
export declare function fetchAllPatterns(sourceIds?: FreeSourceName[]): Promise<BasePattern[]>;
|
|
45
|
+
//# sourceMappingURL=source-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-registry.d.ts","sourceRoot":"","sources":["../../src/utils/source-registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAMvE,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,eAAe,GAAG,WAAW,CAAC;AAErF,MAAM,WAAW,UAAU;IACzB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACtD,aAAa,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CACzC;AAkBD;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,CAQ1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,UAAU,EAAE,CAEhD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,cAAc,GAAG,KAAK,GAAG,cAAc,EAAE,GAAG,UAAU,EAAE,CAU/F;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,cAAc,GAAG,KAAK,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAU/F;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,cAAc,GAAG,KAAK,GAAG,cAAc,EAAU,GAC7D,OAAO,CAAC,WAAW,EAAE,CAAC,CAUxB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,oBAAoB,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAsBzF;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,CAAC,EAAE,cAAc,EAAE,GAC3B,OAAO,CAAC,WAAW,EAAE,CAAC,CAYxB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized source registry to eliminate duplication in handlers
|
|
3
|
+
*/
|
|
4
|
+
import SundellSource from '../sources/free/sundell.js';
|
|
5
|
+
import VanderLeeSource from '../sources/free/vanderlee.js';
|
|
6
|
+
import NilCoalescingSource from '../sources/free/nilcoalescing.js';
|
|
7
|
+
import PointFreeSource from '../sources/free/pointfree.js';
|
|
8
|
+
/**
|
|
9
|
+
* Map of source names to their classes
|
|
10
|
+
*/
|
|
11
|
+
const SOURCE_CLASSES = {
|
|
12
|
+
sundell: SundellSource,
|
|
13
|
+
vanderlee: VanderLeeSource,
|
|
14
|
+
nilcoalescing: NilCoalescingSource,
|
|
15
|
+
pointfree: PointFreeSource,
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Singleton cache for source instances
|
|
19
|
+
* Keeps search indexes warm across calls
|
|
20
|
+
*/
|
|
21
|
+
const sourceInstanceCache = new Map();
|
|
22
|
+
/**
|
|
23
|
+
* Get a source instance by name (singleton)
|
|
24
|
+
*/
|
|
25
|
+
export function getSource(name) {
|
|
26
|
+
const cached = sourceInstanceCache.get(name);
|
|
27
|
+
if (cached)
|
|
28
|
+
return cached;
|
|
29
|
+
const SourceClass = SOURCE_CLASSES[name];
|
|
30
|
+
const instance = new SourceClass();
|
|
31
|
+
sourceInstanceCache.set(name, instance);
|
|
32
|
+
return instance;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get all free source instances
|
|
36
|
+
*/
|
|
37
|
+
export function getAllFreeSources() {
|
|
38
|
+
return Object.keys(SOURCE_CLASSES).map(name => getSource(name));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get source instances by name(s)
|
|
42
|
+
* @param sourceNames - Array of source names, or 'all' for all sources
|
|
43
|
+
*/
|
|
44
|
+
export function getSources(sourceNames) {
|
|
45
|
+
if (sourceNames === 'all') {
|
|
46
|
+
return getAllFreeSources();
|
|
47
|
+
}
|
|
48
|
+
if (Array.isArray(sourceNames)) {
|
|
49
|
+
return sourceNames.map(name => getSource(name));
|
|
50
|
+
}
|
|
51
|
+
return [getSource(sourceNames)];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get source names for a given source parameter
|
|
55
|
+
* Used for intent cache key generation
|
|
56
|
+
*/
|
|
57
|
+
export function getSourceNames(sourceNames) {
|
|
58
|
+
if (sourceNames === 'all') {
|
|
59
|
+
return Object.keys(SOURCE_CLASSES);
|
|
60
|
+
}
|
|
61
|
+
if (Array.isArray(sourceNames)) {
|
|
62
|
+
return sourceNames;
|
|
63
|
+
}
|
|
64
|
+
return [sourceNames];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Search multiple sources and combine results
|
|
68
|
+
* Uses Promise.allSettled to collect partial results even if some sources fail
|
|
69
|
+
*/
|
|
70
|
+
export async function searchMultipleSources(query, sourceNames = 'all') {
|
|
71
|
+
const sources = getSources(sourceNames);
|
|
72
|
+
const results = await Promise.allSettled(sources.map(source => source.searchPatterns(query)));
|
|
73
|
+
// Collect successful results, skip failed sources
|
|
74
|
+
return results
|
|
75
|
+
.filter((result) => result.status === 'fulfilled')
|
|
76
|
+
.flatMap(result => result.value);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Prefetch all sources to warm up caches and search indexes
|
|
80
|
+
* Call this on startup when prefetchSources is enabled
|
|
81
|
+
* @returns Results of prefetch operations for all sources
|
|
82
|
+
*/
|
|
83
|
+
export async function prefetchAllSources() {
|
|
84
|
+
const sources = getAllFreeSources();
|
|
85
|
+
const sourceNames = Object.keys(SOURCE_CLASSES);
|
|
86
|
+
const results = await Promise.allSettled(sources.map(source => source.fetchPatterns()));
|
|
87
|
+
// Log summary of results
|
|
88
|
+
const successful = results.filter(r => r.status === 'fulfilled').length;
|
|
89
|
+
const failed = results.filter(r => r.status === 'rejected').length;
|
|
90
|
+
console.log(`Prefetch complete: ${successful} succeeded, ${failed} failed`);
|
|
91
|
+
// Log failed sources for debugging
|
|
92
|
+
results.forEach((result, index) => {
|
|
93
|
+
if (result.status === 'rejected') {
|
|
94
|
+
console.error(`Failed to prefetch ${sourceNames[index]}:`, result.reason);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
return results;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Fetch all patterns from specified sources.
|
|
101
|
+
* Uses Promise.allSettled to collect partial results even if some sources fail.
|
|
102
|
+
* @param sourceIds - Optional array of source IDs to fetch from. Defaults to all sources.
|
|
103
|
+
*/
|
|
104
|
+
export async function fetchAllPatterns(sourceIds) {
|
|
105
|
+
const sources = sourceIds
|
|
106
|
+
? sourceIds.map(id => getSource(id))
|
|
107
|
+
: getAllFreeSources();
|
|
108
|
+
const results = await Promise.allSettled(sources.map(source => source.fetchPatterns()));
|
|
109
|
+
return results
|
|
110
|
+
.filter((r) => r.status === 'fulfilled')
|
|
111
|
+
.flatMap(r => r.value);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=source-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-registry.js","sourceRoot":"","sources":["../../src/utils/source-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-registry.test.d.ts","sourceRoot":"","sources":["../../src/utils/source-registry.test.ts"],"names":[],"mappings":""}
|