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.
Files changed (247) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +410 -0
  3. package/build/cli/auth.d.ts +3 -0
  4. package/build/cli/auth.d.ts.map +1 -0
  5. package/build/cli/auth.js +44 -0
  6. package/build/cli/auth.js.map +1 -0
  7. package/build/cli/setup.d.ts +2 -0
  8. package/build/cli/setup.d.ts.map +1 -0
  9. package/build/cli/setup.js +150 -0
  10. package/build/cli/setup.js.map +1 -0
  11. package/build/cli/source-manager.d.ts +3 -0
  12. package/build/cli/source-manager.d.ts.map +1 -0
  13. package/build/cli/source-manager.js +117 -0
  14. package/build/cli/source-manager.js.map +1 -0
  15. package/build/config/creators.d.ts +11 -0
  16. package/build/config/creators.d.ts.map +1 -0
  17. package/build/config/creators.js +32 -0
  18. package/build/config/creators.js.map +1 -0
  19. package/build/config/sources.d.ts +91 -0
  20. package/build/config/sources.d.ts.map +1 -0
  21. package/build/config/sources.js +231 -0
  22. package/build/config/sources.js.map +1 -0
  23. package/build/config/sources.test.d.ts +2 -0
  24. package/build/config/sources.test.d.ts.map +1 -0
  25. package/build/config/sources.test.js +199 -0
  26. package/build/config/sources.test.js.map +1 -0
  27. package/build/config/swift-keywords.d.ts +29 -0
  28. package/build/config/swift-keywords.d.ts.map +1 -0
  29. package/build/config/swift-keywords.js +77 -0
  30. package/build/config/swift-keywords.js.map +1 -0
  31. package/build/index.d.ts +3 -0
  32. package/build/index.d.ts.map +1 -0
  33. package/build/index.js +181 -0
  34. package/build/index.js.map +1 -0
  35. package/build/integration/cache-behavior.test.d.ts +2 -0
  36. package/build/integration/cache-behavior.test.d.ts.map +1 -0
  37. package/build/integration/cache-behavior.test.js +521 -0
  38. package/build/integration/cache-behavior.test.js.map +1 -0
  39. package/build/integration/mcp-client.test.d.ts +2 -0
  40. package/build/integration/mcp-client.test.d.ts.map +1 -0
  41. package/build/integration/mcp-client.test.js +82 -0
  42. package/build/integration/mcp-client.test.js.map +1 -0
  43. package/build/integration/response-quality.test.d.ts +2 -0
  44. package/build/integration/response-quality.test.d.ts.map +1 -0
  45. package/build/integration/response-quality.test.js +230 -0
  46. package/build/integration/response-quality.test.js.map +1 -0
  47. package/build/integration/test-client.d.ts +25 -0
  48. package/build/integration/test-client.d.ts.map +1 -0
  49. package/build/integration/test-client.js +93 -0
  50. package/build/integration/test-client.js.map +1 -0
  51. package/build/sources/free/nilcoalescing.d.ts +8 -0
  52. package/build/sources/free/nilcoalescing.d.ts.map +1 -0
  53. package/build/sources/free/nilcoalescing.js +26 -0
  54. package/build/sources/free/nilcoalescing.js.map +1 -0
  55. package/build/sources/free/nilcoalescing.test.d.ts +2 -0
  56. package/build/sources/free/nilcoalescing.test.d.ts.map +1 -0
  57. package/build/sources/free/nilcoalescing.test.js +63 -0
  58. package/build/sources/free/nilcoalescing.test.js.map +1 -0
  59. package/build/sources/free/pointfree.d.ts +15 -0
  60. package/build/sources/free/pointfree.d.ts.map +1 -0
  61. package/build/sources/free/pointfree.js +175 -0
  62. package/build/sources/free/pointfree.js.map +1 -0
  63. package/build/sources/free/pointfree.test.d.ts +2 -0
  64. package/build/sources/free/pointfree.test.d.ts.map +1 -0
  65. package/build/sources/free/pointfree.test.js +86 -0
  66. package/build/sources/free/pointfree.test.js.map +1 -0
  67. package/build/sources/free/rssPatternSource.d.ts +42 -0
  68. package/build/sources/free/rssPatternSource.d.ts.map +1 -0
  69. package/build/sources/free/rssPatternSource.js +109 -0
  70. package/build/sources/free/rssPatternSource.js.map +1 -0
  71. package/build/sources/free/rssPatternSource.test.d.ts +2 -0
  72. package/build/sources/free/rssPatternSource.test.d.ts.map +1 -0
  73. package/build/sources/free/rssPatternSource.test.js +89 -0
  74. package/build/sources/free/rssPatternSource.test.js.map +1 -0
  75. package/build/sources/free/sundell.d.ts +8 -0
  76. package/build/sources/free/sundell.d.ts.map +1 -0
  77. package/build/sources/free/sundell.js +17 -0
  78. package/build/sources/free/sundell.js.map +1 -0
  79. package/build/sources/free/sundell.test.d.ts +2 -0
  80. package/build/sources/free/sundell.test.d.ts.map +1 -0
  81. package/build/sources/free/sundell.test.js +63 -0
  82. package/build/sources/free/sundell.test.js.map +1 -0
  83. package/build/sources/free/vanderlee.d.ts +8 -0
  84. package/build/sources/free/vanderlee.d.ts.map +1 -0
  85. package/build/sources/free/vanderlee.js +63 -0
  86. package/build/sources/free/vanderlee.js.map +1 -0
  87. package/build/sources/free/vanderlee.test.d.ts +2 -0
  88. package/build/sources/free/vanderlee.test.d.ts.map +1 -0
  89. package/build/sources/free/vanderlee.test.js +77 -0
  90. package/build/sources/free/vanderlee.test.js.map +1 -0
  91. package/build/sources/premium/patreon-dl.d.ts +45 -0
  92. package/build/sources/premium/patreon-dl.d.ts.map +1 -0
  93. package/build/sources/premium/patreon-dl.js +189 -0
  94. package/build/sources/premium/patreon-dl.js.map +1 -0
  95. package/build/sources/premium/patreon-fetch.d.ts +3 -0
  96. package/build/sources/premium/patreon-fetch.d.ts.map +1 -0
  97. package/build/sources/premium/patreon-fetch.js +18 -0
  98. package/build/sources/premium/patreon-fetch.js.map +1 -0
  99. package/build/sources/premium/patreon-oauth.d.ts +24 -0
  100. package/build/sources/premium/patreon-oauth.d.ts.map +1 -0
  101. package/build/sources/premium/patreon-oauth.js +208 -0
  102. package/build/sources/premium/patreon-oauth.js.map +1 -0
  103. package/build/sources/premium/patreon-zip.d.ts +17 -0
  104. package/build/sources/premium/patreon-zip.d.ts.map +1 -0
  105. package/build/sources/premium/patreon-zip.js +127 -0
  106. package/build/sources/premium/patreon-zip.js.map +1 -0
  107. package/build/sources/premium/patreon.d.ts +48 -0
  108. package/build/sources/premium/patreon.d.ts.map +1 -0
  109. package/build/sources/premium/patreon.js +221 -0
  110. package/build/sources/premium/patreon.js.map +1 -0
  111. package/build/sources/premium/youtube.d.ts +14 -0
  112. package/build/sources/premium/youtube.d.ts.map +1 -0
  113. package/build/sources/premium/youtube.js +92 -0
  114. package/build/sources/premium/youtube.js.map +1 -0
  115. package/build/tools/extract-cookie.d.ts +2 -0
  116. package/build/tools/extract-cookie.d.ts.map +1 -0
  117. package/build/tools/extract-cookie.js +40 -0
  118. package/build/tools/extract-cookie.js.map +1 -0
  119. package/build/tools/handlers/enableSource.d.ts +3 -0
  120. package/build/tools/handlers/enableSource.d.ts.map +1 -0
  121. package/build/tools/handlers/enableSource.js +25 -0
  122. package/build/tools/handlers/enableSource.js.map +1 -0
  123. package/build/tools/handlers/getPatreonPatterns.d.ts +3 -0
  124. package/build/tools/handlers/getPatreonPatterns.d.ts.map +1 -0
  125. package/build/tools/handlers/getPatreonPatterns.js +43 -0
  126. package/build/tools/handlers/getPatreonPatterns.js.map +1 -0
  127. package/build/tools/handlers/getSwiftPattern.d.ts +3 -0
  128. package/build/tools/handlers/getSwiftPattern.d.ts.map +1 -0
  129. package/build/tools/handlers/getSwiftPattern.js +72 -0
  130. package/build/tools/handlers/getSwiftPattern.js.map +1 -0
  131. package/build/tools/handlers/handlers.test.d.ts +2 -0
  132. package/build/tools/handlers/handlers.test.d.ts.map +1 -0
  133. package/build/tools/handlers/handlers.test.js +359 -0
  134. package/build/tools/handlers/handlers.test.js.map +1 -0
  135. package/build/tools/handlers/listContentSources.d.ts +3 -0
  136. package/build/tools/handlers/listContentSources.d.ts.map +1 -0
  137. package/build/tools/handlers/listContentSources.js +34 -0
  138. package/build/tools/handlers/listContentSources.js.map +1 -0
  139. package/build/tools/handlers/searchSwiftContent.d.ts +3 -0
  140. package/build/tools/handlers/searchSwiftContent.d.ts.map +1 -0
  141. package/build/tools/handlers/searchSwiftContent.js +121 -0
  142. package/build/tools/handlers/searchSwiftContent.js.map +1 -0
  143. package/build/tools/handlers/setupPatreon.d.ts +3 -0
  144. package/build/tools/handlers/setupPatreon.d.ts.map +1 -0
  145. package/build/tools/handlers/setupPatreon.js +40 -0
  146. package/build/tools/handlers/setupPatreon.js.map +1 -0
  147. package/build/tools/index.d.ts +3 -0
  148. package/build/tools/index.d.ts.map +1 -0
  149. package/build/tools/index.js +18 -0
  150. package/build/tools/index.js.map +1 -0
  151. package/build/tools/registry.d.ts +14 -0
  152. package/build/tools/registry.d.ts.map +1 -0
  153. package/build/tools/registry.js +21 -0
  154. package/build/tools/registry.js.map +1 -0
  155. package/build/tools/registry.test.d.ts +2 -0
  156. package/build/tools/registry.test.d.ts.map +1 -0
  157. package/build/tools/registry.test.js +54 -0
  158. package/build/tools/registry.test.js.map +1 -0
  159. package/build/tools/types.d.ts +67 -0
  160. package/build/tools/types.d.ts.map +1 -0
  161. package/build/tools/types.js +3 -0
  162. package/build/tools/types.js.map +1 -0
  163. package/build/utils/cache.d.ts +20 -0
  164. package/build/utils/cache.d.ts.map +1 -0
  165. package/build/utils/cache.js +186 -0
  166. package/build/utils/cache.js.map +1 -0
  167. package/build/utils/concurrency.d.ts +13 -0
  168. package/build/utils/concurrency.d.ts.map +1 -0
  169. package/build/utils/concurrency.js +33 -0
  170. package/build/utils/concurrency.js.map +1 -0
  171. package/build/utils/errors.d.ts +19 -0
  172. package/build/utils/errors.d.ts.map +1 -0
  173. package/build/utils/errors.js +35 -0
  174. package/build/utils/errors.js.map +1 -0
  175. package/build/utils/fetch.d.ts +6 -0
  176. package/build/utils/fetch.d.ts.map +1 -0
  177. package/build/utils/fetch.js +6 -0
  178. package/build/utils/fetch.js.map +1 -0
  179. package/build/utils/http.d.ts +21 -0
  180. package/build/utils/http.d.ts.map +1 -0
  181. package/build/utils/http.js +53 -0
  182. package/build/utils/http.js.map +1 -0
  183. package/build/utils/intent-cache.d.ts +94 -0
  184. package/build/utils/intent-cache.d.ts.map +1 -0
  185. package/build/utils/intent-cache.js +164 -0
  186. package/build/utils/intent-cache.js.map +1 -0
  187. package/build/utils/intent-cache.test.d.ts +2 -0
  188. package/build/utils/intent-cache.test.d.ts.map +1 -0
  189. package/build/utils/intent-cache.test.js +290 -0
  190. package/build/utils/intent-cache.test.js.map +1 -0
  191. package/build/utils/logger.d.ts +4 -0
  192. package/build/utils/logger.d.ts.map +1 -0
  193. package/build/utils/logger.js +9 -0
  194. package/build/utils/logger.js.map +1 -0
  195. package/build/utils/paths.d.ts +27 -0
  196. package/build/utils/paths.d.ts.map +1 -0
  197. package/build/utils/paths.js +43 -0
  198. package/build/utils/paths.js.map +1 -0
  199. package/build/utils/pattern-formatter.d.ts +40 -0
  200. package/build/utils/pattern-formatter.d.ts.map +1 -0
  201. package/build/utils/pattern-formatter.js +124 -0
  202. package/build/utils/pattern-formatter.js.map +1 -0
  203. package/build/utils/response-helpers.d.ts +17 -0
  204. package/build/utils/response-helpers.d.ts.map +1 -0
  205. package/build/utils/response-helpers.js +34 -0
  206. package/build/utils/response-helpers.js.map +1 -0
  207. package/build/utils/search-terms.d.ts +17 -0
  208. package/build/utils/search-terms.d.ts.map +1 -0
  209. package/build/utils/search-terms.js +71 -0
  210. package/build/utils/search-terms.js.map +1 -0
  211. package/build/utils/search-terms.test.d.ts +2 -0
  212. package/build/utils/search-terms.test.d.ts.map +1 -0
  213. package/build/utils/search-terms.test.js +107 -0
  214. package/build/utils/search-terms.test.js.map +1 -0
  215. package/build/utils/search.d.ts +48 -0
  216. package/build/utils/search.d.ts.map +1 -0
  217. package/build/utils/search.js +158 -0
  218. package/build/utils/search.js.map +1 -0
  219. package/build/utils/search.test.d.ts +2 -0
  220. package/build/utils/search.test.d.ts.map +1 -0
  221. package/build/utils/search.test.js +199 -0
  222. package/build/utils/search.test.js.map +1 -0
  223. package/build/utils/semantic-recall.d.ts +38 -0
  224. package/build/utils/semantic-recall.d.ts.map +1 -0
  225. package/build/utils/semantic-recall.js +134 -0
  226. package/build/utils/semantic-recall.js.map +1 -0
  227. package/build/utils/semantic-recall.test.d.ts +2 -0
  228. package/build/utils/semantic-recall.test.d.ts.map +1 -0
  229. package/build/utils/semantic-recall.test.js +326 -0
  230. package/build/utils/semantic-recall.test.js.map +1 -0
  231. package/build/utils/source-registry.d.ts +45 -0
  232. package/build/utils/source-registry.d.ts.map +1 -0
  233. package/build/utils/source-registry.js +113 -0
  234. package/build/utils/source-registry.js.map +1 -0
  235. package/build/utils/source-registry.test.d.ts +2 -0
  236. package/build/utils/source-registry.test.d.ts.map +1 -0
  237. package/build/utils/source-registry.test.js +206 -0
  238. package/build/utils/source-registry.test.js.map +1 -0
  239. package/build/utils/swift-analysis.d.ts +61 -0
  240. package/build/utils/swift-analysis.d.ts.map +1 -0
  241. package/build/utils/swift-analysis.js +339 -0
  242. package/build/utils/swift-analysis.js.map +1 -0
  243. package/build/utils/swift-analysis.test.d.ts +2 -0
  244. package/build/utils/swift-analysis.test.d.ts.map +1 -0
  245. package/build/utils/swift-analysis.test.js +473 -0
  246. package/build/utils/swift-analysis.test.js.map +1 -0
  247. 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":"AAAA,oCAAoC;AAEpC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3E,qEAAqE;AACrE,EAAE,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI,EAAE,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,wCAAwC;KACrG,CAAC,CAAC;IACH,GAAG,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE;CACjC,CAAC,CAAC,CAAC;AAEJ,mBAAmB;AACnB,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,UAAU,EAAE;QACV,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAe,EAAE,CAAe,EAAE,EAAE;YACjD,0DAA0D;YAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC;QAC5B,CAAC,CAAC;KACH;CACF,CAAC,CAAC,CAAC;AAEJ,iCAAiC;AACjC,SAAS,iBAAiB,CAAC,YAAkC,EAAE;IAC7D,OAAO;QACL,EAAE,EAAE,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QACxD,KAAK,EAAE,cAAc;QACrB,GAAG,EAAE,0BAA0B;QAC/B,WAAW,EAAE,YAAY;QACzB,OAAO,EAAE,yCAAyC;QAClD,OAAO,EAAE,sBAAsB;QAC/B,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;QAC5B,cAAc,EAAE,EAAE;QAClB,OAAO,EAAE,IAAI;QACb,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAChD,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACnF,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC;gBACpC,OAAO,EAAE,IAAI;gBACb,eAAe,EAAE,IAAI;gBACrB,iBAAiB,EAAE,EAAE;aACtB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG;gBACf,iBAAiB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;gBAC9E,iBAAiB,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;gBAC5E,iBAAiB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;aACjF,CAAC;YAEF,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAE5B,kDAAkD;YAClD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAE/C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC;gBACpC,OAAO,EAAE,IAAI;gBACb,eAAe,EAAE,IAAI;gBACrB,iBAAiB,EAAE,EAAE;aACtB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG;gBACf,iBAAiB,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;gBAC1D,iBAAiB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;aACxD,CAAC;YAEF,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC5B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAE/C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,KAAK,GAAG,IAAI,mBAAmB,EAAE,CAAC;YAExC,MAAM,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAEtB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC;gBACpC,OAAO,EAAE,IAAI;gBACb,eAAe,EAAE,IAAI;gBACrB,iBAAiB,EAAE,EAAE;aACtB,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,iBAAiB,CAAC;gBAChC,EAAE,EAAE,QAAQ;gBACZ,KAAK,EAAE,kBAAkB;gBACzB,OAAO,EAAE,sCAAsC;gBAC/C,OAAO,EAAE,kDAAkD;gBAC3D,cAAc,EAAE,EAAE;aACnB,CAAC,CAAC;YAEH,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAElD,iDAAiD;YACjD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC;gBACpC,OAAO,EAAE,IAAI;gBACb,eAAe,EAAE,IAAI;gBACrB,iBAAiB,EAAE,EAAE;aACtB,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,iBAAiB,CAAC;gBAChC,EAAE,EAAE,YAAY;gBAChB,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,mBAAmB;gBAC5B,cAAc,EAAE,EAAE;aACnB,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC;gBACpC,OAAO,EAAE,IAAI;gBACb,eAAe,EAAE,IAAI;gBACrB,iBAAiB,EAAE,EAAE;aACtB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG;gBACf,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;gBACvE,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;gBACvE,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;gBACvE,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;aACxE,CAAC;YAEF,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC5B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAE9C,2BAA2B;YAC3B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,KAAK,GAAG,IAAI,mBAAmB,EAAE,CAAC;YAExC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAE/C,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC;gBACpC,OAAO,EAAE,IAAI;gBACb,eAAe,EAAE,IAAI;gBACrB,iBAAiB,EAAE,EAAE;aACtB,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,iBAAiB,CAAC;gBAChC,EAAE,EAAE,MAAM;gBACV,KAAK,EAAE,MAAM;gBACb,cAAc,EAAE,EAAE;aACnB,CAAC,CAAC;YAEH,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAE7B,kEAAkE;YAClE,+DAA+D;YAC/D,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;YAErE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC;gBACpC,OAAO,EAAE,IAAI;gBACb,eAAe,EAAE,IAAI;gBACrB,iBAAiB,EAAE,EAAE;aACtB,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,iBAAiB,CAAC;gBAChC,EAAE,EAAE,YAAY;gBAChB,KAAK,EAAE,oBAAoB;gBAC3B,OAAO,EAAE,oBAAoB;gBAC7B,cAAc,EAAE,EAAE;aACnB,CAAC,CAAC;YAEH,yCAAyC;YACzC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAE7B,6CAA6C;YAC7C,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAE7B,8CAA8C;YAC9C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAChD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC7E,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC;gBACpC,OAAO,EAAE,IAAI;gBACb,eAAe,EAAE,IAAI;gBACrB,iBAAiB,EAAE,EAAE;aACtB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,iBAAiB,CAAC;gBACjC,EAAE,EAAE,SAAS;gBACb,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,WAAW;gBACpB,cAAc,EAAE,EAAE;aACnB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,iBAAiB,CAAC;gBACjC,EAAE,EAAE,SAAS;gBACb,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,WAAW;gBACpB,cAAc,EAAE,EAAE;aACnB,CAAC,CAAC;YAEH,2CAA2C;YAC3C,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9B,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE9B,0CAA0C;YAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC;gBACpC,OAAO,EAAE,IAAI;gBACb,eAAe,EAAE,IAAI;gBACrB,iBAAiB,EAAE,EAAE;aACtB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,iBAAiB,CAAC;gBACjC,EAAE,EAAE,WAAW;gBACf,KAAK,EAAE,mBAAmB;gBAC1B,OAAO,EAAE,yBAAyB;gBAClC,cAAc,EAAE,EAAE;aACnB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,iBAAiB,CAAC;gBACjC,EAAE,EAAE,WAAW;gBACf,KAAK,EAAE,iBAAiB;gBACxB,OAAO,EAAE,mBAAmB;gBAC5B,cAAc,EAAE,EAAE;aACnB,CAAC,CAAC;YAEH,oCAAoC;YACpC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE3B,4DAA4D;YAC5D,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE3B,8DAA8D;YAC9D,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE3B,iCAAiC;YACjC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACpD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC;gBACpC,OAAO,EAAE,IAAI;gBACb,eAAe,EAAE,IAAI;gBACrB,iBAAiB,EAAE,EAAE;aACtB,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,iBAAiB,CAAC;gBAChC,EAAE,EAAE,aAAa;gBACjB,KAAK,EAAE,YAAY;gBACnB,OAAO,EAAE,cAAc;gBACvB,cAAc,EAAE,EAAE;gBAClB,MAAM,EAAE,CAAC,UAAU,CAAC;aACrB,CAAC,CAAC;YAEH,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAE7B,oFAAoF;YACpF,MAAM,cAAc,GAAG,iBAAiB,CAAC;gBACvC,EAAE,EAAE,aAAa;gBACjB,KAAK,EAAE,YAAY;gBACnB,OAAO,EAAE,cAAc;gBACvB,cAAc,EAAE,EAAE;gBAClB,MAAM,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC;aACjC,CAAC,CAAC;YAEH,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;YAEpC,2CAA2C;YAC3C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE3B,sCAAsC;YACtC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAE1C,8CAA8C;QAC9C,MAAM,OAAO,GAAG,KAAK,CAAC;QACtB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QAED,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,MAAM,GAAG;YACb,OAAO,EAAE,IAAI;YACb,eAAe,EAAE,IAAI;YACrB,iBAAiB,EAAE,EAAE;SACtB,CAAC;QAEF,yDAAyD;QACzD,MAAM,YAAY,GAAG,EAAE,GAAG,GAAG,CAAC;QAC9B,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAE1D,2DAA2D;QAC3D,MAAM,cAAc,GAAG,EAAE,GAAG,GAAG,CAAC;QAChC,MAAM,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,cAAc,GAAG;YACrB,iBAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YAC1C,iBAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;SAC3C,CAAC;QAEF,MAAM,eAAe,GAAG;YACtB,iBAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YAC1C,iBAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;SAC3C,CAAC;QAEF,8BAA8B;QAC9B,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3D,MAAM,kBAAkB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,CAAC,GAAG,cAAc,EAAE,GAAG,kBAAkB,CAAC,CAAC;QAE1D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,MAAM,GAAG;YACb,iBAAiB,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;YACrD,iBAAiB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;SACrD,CAAC;QAEF,MAAM,iBAAiB,GAAG,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,IAAI,iBAAiB,CAAC,CAAC;QAE3E,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=source-registry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-registry.test.d.ts","sourceRoot":"","sources":["../../src/utils/source-registry.test.ts"],"names":[],"mappings":""}