lance-context 0.1.0 → 1.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 (237) hide show
  1. package/README.md +232 -23
  2. package/dist/__tests__/ast-chunker.test.d.ts +2 -0
  3. package/dist/__tests__/ast-chunker.test.d.ts.map +1 -0
  4. package/dist/__tests__/ast-chunker.test.js +307 -0
  5. package/dist/__tests__/ast-chunker.test.js.map +1 -0
  6. package/dist/__tests__/config.test.d.ts +2 -0
  7. package/dist/__tests__/config.test.d.ts.map +1 -0
  8. package/dist/__tests__/config.test.js +242 -0
  9. package/dist/__tests__/config.test.js.map +1 -0
  10. package/dist/__tests__/dashboard/beads.test.d.ts +2 -0
  11. package/dist/__tests__/dashboard/beads.test.d.ts.map +1 -0
  12. package/dist/__tests__/dashboard/beads.test.js +151 -0
  13. package/dist/__tests__/dashboard/beads.test.js.map +1 -0
  14. package/dist/__tests__/dashboard/index.test.d.ts +2 -0
  15. package/dist/__tests__/dashboard/index.test.d.ts.map +1 -0
  16. package/dist/__tests__/dashboard/index.test.js +116 -0
  17. package/dist/__tests__/dashboard/index.test.js.map +1 -0
  18. package/dist/__tests__/dashboard/routes.test.d.ts +2 -0
  19. package/dist/__tests__/dashboard/routes.test.d.ts.map +1 -0
  20. package/dist/__tests__/dashboard/routes.test.js +125 -0
  21. package/dist/__tests__/dashboard/routes.test.js.map +1 -0
  22. package/dist/__tests__/dashboard/server.test.d.ts +2 -0
  23. package/dist/__tests__/dashboard/server.test.d.ts.map +1 -0
  24. package/dist/__tests__/dashboard/server.test.js +75 -0
  25. package/dist/__tests__/dashboard/server.test.js.map +1 -0
  26. package/dist/__tests__/dashboard/state.test.d.ts +2 -0
  27. package/dist/__tests__/dashboard/state.test.d.ts.map +1 -0
  28. package/dist/__tests__/dashboard/state.test.js +124 -0
  29. package/dist/__tests__/dashboard/state.test.js.map +1 -0
  30. package/dist/__tests__/embeddings/factory.test.d.ts +2 -0
  31. package/dist/__tests__/embeddings/factory.test.d.ts.map +1 -0
  32. package/dist/__tests__/embeddings/factory.test.js +100 -0
  33. package/dist/__tests__/embeddings/factory.test.js.map +1 -0
  34. package/dist/__tests__/embeddings/jina.test.d.ts +2 -0
  35. package/dist/__tests__/embeddings/jina.test.d.ts.map +1 -0
  36. package/dist/__tests__/embeddings/jina.test.js +156 -0
  37. package/dist/__tests__/embeddings/jina.test.js.map +1 -0
  38. package/dist/__tests__/embeddings/ollama.test.d.ts +2 -0
  39. package/dist/__tests__/embeddings/ollama.test.d.ts.map +1 -0
  40. package/dist/__tests__/embeddings/ollama.test.js +172 -0
  41. package/dist/__tests__/embeddings/ollama.test.js.map +1 -0
  42. package/dist/__tests__/embeddings/rate-limiter.test.d.ts +2 -0
  43. package/dist/__tests__/embeddings/rate-limiter.test.d.ts.map +1 -0
  44. package/dist/__tests__/embeddings/rate-limiter.test.js +163 -0
  45. package/dist/__tests__/embeddings/rate-limiter.test.js.map +1 -0
  46. package/dist/__tests__/embeddings/retry.test.d.ts +2 -0
  47. package/dist/__tests__/embeddings/retry.test.d.ts.map +1 -0
  48. package/dist/__tests__/embeddings/retry.test.js +260 -0
  49. package/dist/__tests__/embeddings/retry.test.js.map +1 -0
  50. package/dist/__tests__/embeddings/types.test.d.ts +2 -0
  51. package/dist/__tests__/embeddings/types.test.d.ts.map +1 -0
  52. package/dist/__tests__/embeddings/types.test.js +31 -0
  53. package/dist/__tests__/embeddings/types.test.js.map +1 -0
  54. package/dist/__tests__/mocks/embedding-backend.mock.d.ts +10 -0
  55. package/dist/__tests__/mocks/embedding-backend.mock.d.ts.map +1 -0
  56. package/dist/__tests__/mocks/embedding-backend.mock.js +39 -0
  57. package/dist/__tests__/mocks/embedding-backend.mock.js.map +1 -0
  58. package/dist/__tests__/mocks/fetch.mock.d.ts +38 -0
  59. package/dist/__tests__/mocks/fetch.mock.d.ts.map +1 -0
  60. package/dist/__tests__/mocks/fetch.mock.js +74 -0
  61. package/dist/__tests__/mocks/fetch.mock.js.map +1 -0
  62. package/dist/__tests__/mocks/lancedb.mock.d.ts +38 -0
  63. package/dist/__tests__/mocks/lancedb.mock.d.ts.map +1 -0
  64. package/dist/__tests__/mocks/lancedb.mock.js +63 -0
  65. package/dist/__tests__/mocks/lancedb.mock.js.map +1 -0
  66. package/dist/__tests__/search/clustering.test.d.ts +2 -0
  67. package/dist/__tests__/search/clustering.test.d.ts.map +1 -0
  68. package/dist/__tests__/search/clustering.test.js +230 -0
  69. package/dist/__tests__/search/clustering.test.js.map +1 -0
  70. package/dist/__tests__/search/hybrid-search.test.d.ts +2 -0
  71. package/dist/__tests__/search/hybrid-search.test.d.ts.map +1 -0
  72. package/dist/__tests__/search/hybrid-search.test.js +186 -0
  73. package/dist/__tests__/search/hybrid-search.test.js.map +1 -0
  74. package/dist/__tests__/search/indexer.test.d.ts +2 -0
  75. package/dist/__tests__/search/indexer.test.d.ts.map +1 -0
  76. package/dist/__tests__/search/indexer.test.js +878 -0
  77. package/dist/__tests__/search/indexer.test.js.map +1 -0
  78. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts +2 -0
  79. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts.map +1 -0
  80. package/dist/__tests__/search/tree-sitter-chunker.test.js +228 -0
  81. package/dist/__tests__/search/tree-sitter-chunker.test.js.map +1 -0
  82. package/dist/__tests__/setup.d.ts +2 -0
  83. package/dist/__tests__/setup.d.ts.map +1 -0
  84. package/dist/__tests__/setup.js +11 -0
  85. package/dist/__tests__/setup.js.map +1 -0
  86. package/dist/__tests__/utils/concurrency.test.d.ts +2 -0
  87. package/dist/__tests__/utils/concurrency.test.d.ts.map +1 -0
  88. package/dist/__tests__/utils/concurrency.test.js +83 -0
  89. package/dist/__tests__/utils/concurrency.test.js.map +1 -0
  90. package/dist/__tests__/utils/errors.test.d.ts +2 -0
  91. package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
  92. package/dist/__tests__/utils/errors.test.js +136 -0
  93. package/dist/__tests__/utils/errors.test.js.map +1 -0
  94. package/dist/__tests__/utils/type-guards.test.d.ts +2 -0
  95. package/dist/__tests__/utils/type-guards.test.d.ts.map +1 -0
  96. package/dist/__tests__/utils/type-guards.test.js +80 -0
  97. package/dist/__tests__/utils/type-guards.test.js.map +1 -0
  98. package/dist/__tests__/worktree/worktree-manager.test.d.ts +2 -0
  99. package/dist/__tests__/worktree/worktree-manager.test.d.ts.map +1 -0
  100. package/dist/__tests__/worktree/worktree-manager.test.js +403 -0
  101. package/dist/__tests__/worktree/worktree-manager.test.js.map +1 -0
  102. package/dist/config.d.ts +122 -0
  103. package/dist/config.d.ts.map +1 -0
  104. package/dist/config.js +508 -0
  105. package/dist/config.js.map +1 -0
  106. package/dist/dashboard/beads.d.ts +35 -0
  107. package/dist/dashboard/beads.d.ts.map +1 -0
  108. package/dist/dashboard/beads.js +102 -0
  109. package/dist/dashboard/beads.js.map +1 -0
  110. package/dist/dashboard/events.d.ts +46 -0
  111. package/dist/dashboard/events.d.ts.map +1 -0
  112. package/dist/dashboard/events.js +141 -0
  113. package/dist/dashboard/events.js.map +1 -0
  114. package/dist/dashboard/index.d.ts +67 -0
  115. package/dist/dashboard/index.d.ts.map +1 -0
  116. package/dist/dashboard/index.js +90 -0
  117. package/dist/dashboard/index.js.map +1 -0
  118. package/dist/dashboard/routes.d.ts +6 -0
  119. package/dist/dashboard/routes.d.ts.map +1 -0
  120. package/dist/dashboard/routes.js +244 -0
  121. package/dist/dashboard/routes.js.map +1 -0
  122. package/dist/dashboard/server.d.ts +27 -0
  123. package/dist/dashboard/server.d.ts.map +1 -0
  124. package/dist/dashboard/server.js +72 -0
  125. package/dist/dashboard/server.js.map +1 -0
  126. package/dist/dashboard/state.d.ts +116 -0
  127. package/dist/dashboard/state.d.ts.map +1 -0
  128. package/dist/dashboard/state.js +251 -0
  129. package/dist/dashboard/state.js.map +1 -0
  130. package/dist/dashboard/ui.d.ts +6 -0
  131. package/dist/dashboard/ui.d.ts.map +1 -0
  132. package/dist/dashboard/ui.js +1407 -0
  133. package/dist/dashboard/ui.js.map +1 -0
  134. package/dist/embeddings/index.d.ts +20 -2
  135. package/dist/embeddings/index.d.ts.map +1 -1
  136. package/dist/embeddings/index.js +49 -6
  137. package/dist/embeddings/index.js.map +1 -1
  138. package/dist/embeddings/jina.d.ts +9 -0
  139. package/dist/embeddings/jina.d.ts.map +1 -1
  140. package/dist/embeddings/jina.js +42 -2
  141. package/dist/embeddings/jina.js.map +1 -1
  142. package/dist/embeddings/ollama.d.ts +2 -0
  143. package/dist/embeddings/ollama.d.ts.map +1 -1
  144. package/dist/embeddings/ollama.js +21 -5
  145. package/dist/embeddings/ollama.js.map +1 -1
  146. package/dist/embeddings/rate-limiter.d.ts +75 -0
  147. package/dist/embeddings/rate-limiter.d.ts.map +1 -0
  148. package/dist/embeddings/rate-limiter.js +145 -0
  149. package/dist/embeddings/rate-limiter.js.map +1 -0
  150. package/dist/embeddings/retry.d.ts +14 -0
  151. package/dist/embeddings/retry.d.ts.map +1 -0
  152. package/dist/embeddings/retry.js +89 -0
  153. package/dist/embeddings/retry.js.map +1 -0
  154. package/dist/embeddings/types.d.ts +56 -2
  155. package/dist/embeddings/types.d.ts.map +1 -1
  156. package/dist/embeddings/types.js +16 -0
  157. package/dist/embeddings/types.js.map +1 -1
  158. package/dist/index.js +1870 -44
  159. package/dist/index.js.map +1 -1
  160. package/dist/memory/index.d.ts +63 -0
  161. package/dist/memory/index.d.ts.map +1 -0
  162. package/dist/memory/index.js +168 -0
  163. package/dist/memory/index.js.map +1 -0
  164. package/dist/search/ast-chunker.d.ts +34 -0
  165. package/dist/search/ast-chunker.d.ts.map +1 -0
  166. package/dist/search/ast-chunker.js +261 -0
  167. package/dist/search/ast-chunker.js.map +1 -0
  168. package/dist/search/clustering.d.ts +77 -0
  169. package/dist/search/clustering.d.ts.map +1 -0
  170. package/dist/search/clustering.js +455 -0
  171. package/dist/search/clustering.js.map +1 -0
  172. package/dist/search/indexer.d.ts +239 -3
  173. package/dist/search/indexer.d.ts.map +1 -1
  174. package/dist/search/indexer.js +941 -45
  175. package/dist/search/indexer.js.map +1 -1
  176. package/dist/search/tree-sitter-chunker.d.ts +69 -0
  177. package/dist/search/tree-sitter-chunker.d.ts.map +1 -0
  178. package/dist/search/tree-sitter-chunker.js +436 -0
  179. package/dist/search/tree-sitter-chunker.js.map +1 -0
  180. package/dist/symbols/index.d.ts +14 -0
  181. package/dist/symbols/index.d.ts.map +1 -0
  182. package/dist/symbols/index.js +19 -0
  183. package/dist/symbols/index.js.map +1 -0
  184. package/dist/symbols/name-path.d.ts +113 -0
  185. package/dist/symbols/name-path.d.ts.map +1 -0
  186. package/dist/symbols/name-path.js +194 -0
  187. package/dist/symbols/name-path.js.map +1 -0
  188. package/dist/symbols/pattern-search.d.ts +14 -0
  189. package/dist/symbols/pattern-search.d.ts.map +1 -0
  190. package/dist/symbols/pattern-search.js +224 -0
  191. package/dist/symbols/pattern-search.js.map +1 -0
  192. package/dist/symbols/reference-finder.d.ts +38 -0
  193. package/dist/symbols/reference-finder.d.ts.map +1 -0
  194. package/dist/symbols/reference-finder.js +376 -0
  195. package/dist/symbols/reference-finder.js.map +1 -0
  196. package/dist/symbols/symbol-editor.d.ts +81 -0
  197. package/dist/symbols/symbol-editor.d.ts.map +1 -0
  198. package/dist/symbols/symbol-editor.js +257 -0
  199. package/dist/symbols/symbol-editor.js.map +1 -0
  200. package/dist/symbols/symbol-extractor.d.ts +49 -0
  201. package/dist/symbols/symbol-extractor.d.ts.map +1 -0
  202. package/dist/symbols/symbol-extractor.js +593 -0
  203. package/dist/symbols/symbol-extractor.js.map +1 -0
  204. package/dist/symbols/symbol-renamer.d.ts +81 -0
  205. package/dist/symbols/symbol-renamer.d.ts.map +1 -0
  206. package/dist/symbols/symbol-renamer.js +204 -0
  207. package/dist/symbols/symbol-renamer.js.map +1 -0
  208. package/dist/symbols/types.d.ts +234 -0
  209. package/dist/symbols/types.d.ts.map +1 -0
  210. package/dist/symbols/types.js +106 -0
  211. package/dist/symbols/types.js.map +1 -0
  212. package/dist/utils/concurrency.d.ts +32 -0
  213. package/dist/utils/concurrency.d.ts.map +1 -0
  214. package/dist/utils/concurrency.js +57 -0
  215. package/dist/utils/concurrency.js.map +1 -0
  216. package/dist/utils/errors.d.ts +36 -0
  217. package/dist/utils/errors.d.ts.map +1 -0
  218. package/dist/utils/errors.js +91 -0
  219. package/dist/utils/errors.js.map +1 -0
  220. package/dist/utils/type-guards.d.ts +17 -0
  221. package/dist/utils/type-guards.d.ts.map +1 -0
  222. package/dist/utils/type-guards.js +25 -0
  223. package/dist/utils/type-guards.js.map +1 -0
  224. package/dist/worktree/index.d.ts +6 -0
  225. package/dist/worktree/index.d.ts.map +1 -0
  226. package/dist/worktree/index.js +6 -0
  227. package/dist/worktree/index.js.map +1 -0
  228. package/dist/worktree/types.d.ts +101 -0
  229. package/dist/worktree/types.d.ts.map +1 -0
  230. package/dist/worktree/types.js +6 -0
  231. package/dist/worktree/types.js.map +1 -0
  232. package/dist/worktree/worktree-manager.d.ts +80 -0
  233. package/dist/worktree/worktree-manager.d.ts.map +1 -0
  234. package/dist/worktree/worktree-manager.js +407 -0
  235. package/dist/worktree/worktree-manager.js.map +1 -0
  236. package/package.json +39 -5
  237. package/scripts/postinstall.js +48 -0
@@ -0,0 +1,230 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { kMeansClustering, cosineSimilarity, euclideanDistance, assignToCluster, calculateSilhouetteScore, } from '../../search/clustering.js';
3
+ describe('clustering', () => {
4
+ describe('cosineSimilarity', () => {
5
+ it('should return 1 for identical vectors', () => {
6
+ const v = [1, 2, 3, 4, 5];
7
+ expect(cosineSimilarity(v, v)).toBeCloseTo(1, 5);
8
+ });
9
+ it('should return 0 for orthogonal vectors', () => {
10
+ const v1 = [1, 0, 0];
11
+ const v2 = [0, 1, 0];
12
+ expect(cosineSimilarity(v1, v2)).toBeCloseTo(0, 5);
13
+ });
14
+ it('should return -1 for opposite vectors', () => {
15
+ const v1 = [1, 0, 0];
16
+ const v2 = [-1, 0, 0];
17
+ expect(cosineSimilarity(v1, v2)).toBeCloseTo(-1, 5);
18
+ });
19
+ it('should throw for vectors of different lengths', () => {
20
+ expect(() => cosineSimilarity([1, 2], [1, 2, 3])).toThrow('Vectors must have same length');
21
+ });
22
+ it('should handle zero vectors', () => {
23
+ const v1 = [0, 0, 0];
24
+ const v2 = [1, 2, 3];
25
+ expect(cosineSimilarity(v1, v2)).toBe(0);
26
+ });
27
+ });
28
+ describe('euclideanDistance', () => {
29
+ it('should return 0 for identical vectors', () => {
30
+ const v = [1, 2, 3, 4, 5];
31
+ expect(euclideanDistance(v, v)).toBe(0);
32
+ });
33
+ it('should calculate correct distance', () => {
34
+ const v1 = [0, 0];
35
+ const v2 = [3, 4];
36
+ expect(euclideanDistance(v1, v2)).toBe(5); // 3-4-5 triangle
37
+ });
38
+ it('should throw for vectors of different lengths', () => {
39
+ expect(() => euclideanDistance([1, 2], [1, 2, 3])).toThrow('Vectors must have same length');
40
+ });
41
+ });
42
+ describe('kMeansClustering', () => {
43
+ it('should return empty result for empty input', () => {
44
+ const result = kMeansClustering([]);
45
+ expect(result.clusterCount).toBe(0);
46
+ expect(result.clusters).toHaveLength(0);
47
+ expect(result.assignments.size).toBe(0);
48
+ });
49
+ it('should create single cluster for single chunk', () => {
50
+ const chunks = [
51
+ {
52
+ id: 'test.ts:1-10',
53
+ content: 'function test() {}',
54
+ filepath: 'test.ts',
55
+ embedding: [1, 0, 0],
56
+ },
57
+ ];
58
+ const result = kMeansClustering(chunks);
59
+ expect(result.clusterCount).toBe(1);
60
+ expect(result.assignments.get('test.ts:1-10')).toBe(0);
61
+ });
62
+ it('should cluster similar vectors together', () => {
63
+ // Create two groups of clearly separated vectors
64
+ const chunks = [
65
+ // Group 1: vectors near [1, 0, 0]
66
+ { id: 'a1', content: 'a1', filepath: 'a.ts', embedding: [1, 0.1, 0] },
67
+ { id: 'a2', content: 'a2', filepath: 'a.ts', embedding: [0.9, 0.1, 0.1] },
68
+ { id: 'a3', content: 'a3', filepath: 'a.ts', embedding: [1, 0, 0.1] },
69
+ // Group 2: vectors near [0, 1, 0]
70
+ { id: 'b1', content: 'b1', filepath: 'b.ts', embedding: [0, 1, 0.1] },
71
+ { id: 'b2', content: 'b2', filepath: 'b.ts', embedding: [0.1, 0.9, 0] },
72
+ { id: 'b3', content: 'b3', filepath: 'b.ts', embedding: [0.1, 1, 0.1] },
73
+ ];
74
+ const result = kMeansClustering(chunks, { numClusters: 2 });
75
+ expect(result.clusterCount).toBe(2);
76
+ expect(result.clusters.length).toBe(2);
77
+ // Check that each group is in the same cluster
78
+ const clusterA1 = result.assignments.get('a1');
79
+ const clusterA2 = result.assignments.get('a2');
80
+ const clusterA3 = result.assignments.get('a3');
81
+ expect(clusterA1).toBe(clusterA2);
82
+ expect(clusterA2).toBe(clusterA3);
83
+ const clusterB1 = result.assignments.get('b1');
84
+ const clusterB2 = result.assignments.get('b2');
85
+ const clusterB3 = result.assignments.get('b3');
86
+ expect(clusterB1).toBe(clusterB2);
87
+ expect(clusterB2).toBe(clusterB3);
88
+ // Different groups should be in different clusters
89
+ expect(clusterA1).not.toBe(clusterB1);
90
+ });
91
+ it('should respect numClusters option', () => {
92
+ const chunks = Array(20)
93
+ .fill(null)
94
+ .map((_, i) => ({
95
+ id: `chunk${i}`,
96
+ content: `content ${i}`,
97
+ filepath: `file${i}.ts`,
98
+ embedding: Array(10)
99
+ .fill(0)
100
+ .map(() => Math.random()),
101
+ }));
102
+ const result = kMeansClustering(chunks, { numClusters: 5 });
103
+ expect(result.clusterCount).toBeLessThanOrEqual(5);
104
+ });
105
+ it('should generate labels from symbol types', () => {
106
+ const chunks = [
107
+ {
108
+ id: 'a',
109
+ content: 'fn',
110
+ filepath: 'src/utils/helper.ts',
111
+ embedding: [1, 0],
112
+ symbolType: 'function',
113
+ },
114
+ {
115
+ id: 'b',
116
+ content: 'fn',
117
+ filepath: 'src/utils/util.ts',
118
+ embedding: [0.9, 0.1],
119
+ symbolType: 'function',
120
+ },
121
+ {
122
+ id: 'c',
123
+ content: 'fn',
124
+ filepath: 'src/utils/tools.ts',
125
+ embedding: [1, 0.1],
126
+ symbolType: 'function',
127
+ },
128
+ ];
129
+ const result = kMeansClustering(chunks, { numClusters: 1 });
130
+ expect(result.clusters[0].label).toContain('utils');
131
+ });
132
+ it('should extract keywords from content', () => {
133
+ const chunks = [
134
+ {
135
+ id: 'a',
136
+ content: 'function authenticate(user: User) { return validateUser(user); }',
137
+ filepath: 'auth.ts',
138
+ embedding: [1, 0, 0],
139
+ symbolName: 'authenticate',
140
+ },
141
+ ];
142
+ const result = kMeansClustering(chunks, { numClusters: 1 });
143
+ expect(result.clusters[0].keywords.length).toBeGreaterThan(0);
144
+ });
145
+ it('should store representative chunks', () => {
146
+ const chunks = Array(10)
147
+ .fill(null)
148
+ .map((_, i) => ({
149
+ id: `chunk${i}`,
150
+ content: `content ${i}`,
151
+ filepath: `file${i}.ts`,
152
+ embedding: [1, i * 0.01, 0],
153
+ }));
154
+ const result = kMeansClustering(chunks, { numClusters: 1, numRepresentatives: 3 });
155
+ expect(result.clusters[0].representativeChunks.length).toBe(3);
156
+ });
157
+ });
158
+ describe('assignToCluster', () => {
159
+ it('should assign embedding to nearest cluster', () => {
160
+ const clusters = [
161
+ {
162
+ id: 0,
163
+ label: 'Cluster A',
164
+ size: 5,
165
+ representativeChunks: [],
166
+ centroid: [1, 0, 0],
167
+ keywords: [],
168
+ },
169
+ {
170
+ id: 1,
171
+ label: 'Cluster B',
172
+ size: 5,
173
+ representativeChunks: [],
174
+ centroid: [0, 1, 0],
175
+ keywords: [],
176
+ },
177
+ ];
178
+ // Embedding closer to cluster A
179
+ expect(assignToCluster([0.9, 0.1, 0], clusters)).toBe(0);
180
+ // Embedding closer to cluster B
181
+ expect(assignToCluster([0.1, 0.9, 0], clusters)).toBe(1);
182
+ });
183
+ });
184
+ describe('calculateSilhouetteScore', () => {
185
+ it('should return 0 for single cluster', () => {
186
+ const chunks = [
187
+ { id: 'a', content: '', filepath: '', embedding: [1, 0, 0] },
188
+ { id: 'b', content: '', filepath: '', embedding: [0.9, 0.1, 0] },
189
+ ];
190
+ const assignments = new Map([
191
+ ['a', 0],
192
+ ['b', 0],
193
+ ]);
194
+ const clusters = [
195
+ {
196
+ id: 0,
197
+ label: '',
198
+ size: 2,
199
+ representativeChunks: [],
200
+ centroid: [0.95, 0.05, 0],
201
+ keywords: [],
202
+ },
203
+ ];
204
+ const score = calculateSilhouetteScore(chunks, assignments, clusters);
205
+ expect(score).toBe(0);
206
+ });
207
+ it('should return higher score for well-separated clusters', () => {
208
+ // Create two well-separated clusters
209
+ const chunks = [
210
+ { id: 'a1', content: '', filepath: '', embedding: [1, 0, 0] },
211
+ { id: 'a2', content: '', filepath: '', embedding: [0.99, 0.01, 0] },
212
+ { id: 'b1', content: '', filepath: '', embedding: [0, 1, 0] },
213
+ { id: 'b2', content: '', filepath: '', embedding: [0.01, 0.99, 0] },
214
+ ];
215
+ const assignments = new Map([
216
+ ['a1', 0],
217
+ ['a2', 0],
218
+ ['b1', 1],
219
+ ['b2', 1],
220
+ ]);
221
+ const clusters = [
222
+ { id: 0, label: '', size: 2, representativeChunks: [], centroid: [1, 0, 0], keywords: [] },
223
+ { id: 1, label: '', size: 2, representativeChunks: [], centroid: [0, 1, 0], keywords: [] },
224
+ ];
225
+ const score = calculateSilhouetteScore(chunks, assignments, clusters);
226
+ expect(score).toBeGreaterThan(0.5);
227
+ });
228
+ });
229
+ });
230
+ //# sourceMappingURL=clustering.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clustering.test.js","sourceRoot":"","sources":["../../../src/__tests__/search/clustering.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,wBAAwB,GAGzB,MAAM,4BAA4B,CAAC;AAEpC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1B,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrB,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrB,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrB,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrB,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1B,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClB,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClB,MAAM,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,MAAM,GAAyB;gBACnC;oBACE,EAAE,EAAE,cAAc;oBAClB,OAAO,EAAE,oBAAoB;oBAC7B,QAAQ,EAAE,SAAS;oBACnB,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;iBACrB;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,iDAAiD;YACjD,MAAM,MAAM,GAAyB;gBACnC,kCAAkC;gBAClC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE;gBACrE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;gBACzE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;gBACrE,kCAAkC;gBAClC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;gBACrE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE;gBACvE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;aACxE,CAAC;YAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;YAE5D,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEvC,+CAA+C;YAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAElC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAElC,mDAAmD;YACnD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,MAAM,GAAyB,KAAK,CAAC,EAAE,CAAC;iBAC3C,IAAI,CAAC,IAAI,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACd,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,OAAO,EAAE,WAAW,CAAC,EAAE;gBACvB,QAAQ,EAAE,OAAO,CAAC,KAAK;gBACvB,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;qBACjB,IAAI,CAAC,CAAC,CAAC;qBACP,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;aAC5B,CAAC,CAAC,CAAC;YAEN,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,MAAM,GAAyB;gBACnC;oBACE,EAAE,EAAE,GAAG;oBACP,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,qBAAqB;oBAC/B,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;oBACjB,UAAU,EAAE,UAAU;iBACvB;gBACD;oBACE,EAAE,EAAE,GAAG;oBACP,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,mBAAmB;oBAC7B,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;oBACrB,UAAU,EAAE,UAAU;iBACvB;gBACD;oBACE,EAAE,EAAE,GAAG;oBACP,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,oBAAoB;oBAC9B,SAAS,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC;oBACnB,UAAU,EAAE,UAAU;iBACvB;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;YAE5D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,MAAM,GAAyB;gBACnC;oBACE,EAAE,EAAE,GAAG;oBACP,OAAO,EAAE,kEAAkE;oBAC3E,QAAQ,EAAE,SAAS;oBACnB,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACpB,UAAU,EAAE,cAAc;iBAC3B;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,MAAM,GAAyB,KAAK,CAAC,EAAE,CAAC;iBAC3C,IAAI,CAAC,IAAI,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACd,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,OAAO,EAAE,WAAW,CAAC,EAAE;gBACvB,QAAQ,EAAE,OAAO,CAAC,KAAK;gBACvB,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;aAC5B,CAAC,CAAC,CAAC;YAEN,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAC,CAAC;YACnF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,QAAQ,GAAqB;gBACjC;oBACE,EAAE,EAAE,CAAC;oBACL,KAAK,EAAE,WAAW;oBAClB,IAAI,EAAE,CAAC;oBACP,oBAAoB,EAAE,EAAE;oBACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACnB,QAAQ,EAAE,EAAE;iBACb;gBACD;oBACE,EAAE,EAAE,CAAC;oBACL,KAAK,EAAE,WAAW;oBAClB,IAAI,EAAE,CAAC;oBACP,oBAAoB,EAAE,EAAE;oBACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACnB,QAAQ,EAAE,EAAE;iBACb;aACF,CAAC;YAEF,gCAAgC;YAChC,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzD,gCAAgC;YAChC,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,MAAM,GAAyB;gBACnC,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;gBAC5D,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE;aACjE,CAAC;YACF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;gBAC1B,CAAC,GAAG,EAAE,CAAC,CAAC;gBACR,CAAC,GAAG,EAAE,CAAC,CAAC;aACT,CAAC,CAAC;YACH,MAAM,QAAQ,GAAqB;gBACjC;oBACE,EAAE,EAAE,CAAC;oBACL,KAAK,EAAE,EAAE;oBACT,IAAI,EAAE,CAAC;oBACP,oBAAoB,EAAE,EAAE;oBACxB,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;oBACzB,QAAQ,EAAE,EAAE;iBACb;aACF,CAAC;YAEF,MAAM,KAAK,GAAG,wBAAwB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;YACtE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,qCAAqC;YACrC,MAAM,MAAM,GAAyB;gBACnC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;gBAC7D,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;gBACnE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;gBAC7D,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;aACpE,CAAC;YACF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;gBAC1B,CAAC,IAAI,EAAE,CAAC,CAAC;gBACT,CAAC,IAAI,EAAE,CAAC,CAAC;gBACT,CAAC,IAAI,EAAE,CAAC,CAAC;gBACT,CAAC,IAAI,EAAE,CAAC,CAAC;aACV,CAAC,CAAC;YACH,MAAM,QAAQ,GAAqB;gBACjC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,oBAAoB,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;gBAC1F,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,oBAAoB,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;aAC3F,CAAC;YAEF,MAAM,KAAK,GAAG,wBAAwB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;YACtE,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hybrid-search.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-search.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/search/hybrid-search.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,186 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ /**
3
+ * Tests for keyword scoring logic used in hybrid search.
4
+ * These tests verify the calculateKeywordScore algorithm behavior.
5
+ */
6
+ // Recreate the scoring logic for testing (extracted from indexer.ts)
7
+ function calculateKeywordScore(query, content, filepath) {
8
+ const queryTerms = query
9
+ .toLowerCase()
10
+ .split(/\s+/)
11
+ .filter((t) => t.length > 2);
12
+ if (queryTerms.length === 0)
13
+ return 0;
14
+ const contentLower = content.toLowerCase();
15
+ const filepathLower = filepath.toLowerCase();
16
+ let matchCount = 0;
17
+ let exactMatchBonus = 0;
18
+ for (const term of queryTerms) {
19
+ // Check content matches
20
+ if (contentLower.includes(term)) {
21
+ matchCount++;
22
+ // Bonus for exact word match (not just substring)
23
+ const wordBoundaryRegex = new RegExp(`\\b${term}\\b`, 'i');
24
+ if (wordBoundaryRegex.test(content)) {
25
+ exactMatchBonus += 0.5;
26
+ }
27
+ }
28
+ // Bonus for filename/path match
29
+ if (filepathLower.includes(term)) {
30
+ matchCount += 0.5;
31
+ }
32
+ }
33
+ // Normalize score to 0-1 range
34
+ const baseScore = matchCount / queryTerms.length;
35
+ const bonusScore = Math.min(exactMatchBonus / queryTerms.length, 0.5);
36
+ return Math.min(baseScore + bonusScore, 1);
37
+ }
38
+ describe('calculateKeywordScore', () => {
39
+ describe('basic term matching', () => {
40
+ it('should return 0 when no terms match', () => {
41
+ const score = calculateKeywordScore('hello world', 'foo bar', 'test.ts');
42
+ expect(score).toBe(0);
43
+ });
44
+ it('should return 1 when all terms match exactly', () => {
45
+ const score = calculateKeywordScore('hello world', 'hello world function', 'test.ts');
46
+ expect(score).toBe(1);
47
+ });
48
+ it('should return partial score when some terms match', () => {
49
+ const score = calculateKeywordScore('hello world', 'hello foo', 'test.ts');
50
+ expect(score).toBeGreaterThan(0);
51
+ expect(score).toBeLessThan(1);
52
+ });
53
+ it('should filter terms shorter than 3 characters', () => {
54
+ const score = calculateKeywordScore('a ab abc', 'abc only', 'test.ts');
55
+ // Only 'abc' should be considered
56
+ expect(score).toBe(1); // abc matches exactly
57
+ });
58
+ it('should return 0 when all terms are too short', () => {
59
+ const score = calculateKeywordScore('a ab', 'a ab', 'test.ts');
60
+ expect(score).toBe(0);
61
+ });
62
+ });
63
+ describe('word boundary matching', () => {
64
+ it('should give bonus for exact word match', () => {
65
+ // These variables demonstrate the concept even though not directly asserted
66
+ const _substringOnlyScore = calculateKeywordScore('user', 'username', 'test.ts');
67
+ const _exactScore = calculateKeywordScore('user', 'user data', 'test.ts');
68
+ // Exact match should score higher due to word boundary bonus (0.5 extra)
69
+ // substringOnlyScore: 1/1 = 1 (base) + 0 (no word boundary) = 1
70
+ // exactScore: 1/1 = 1 (base) + 0.5 (word boundary) = 1.5, capped at 1
71
+ // Since both cap at 1, we need different test
72
+ // Actually substring match in 'username' still gives base score of 1
73
+ // Let's test with a term that doesn't substring match at all vs exact match
74
+ const noMatch = calculateKeywordScore('auth', 'user data', 'test.ts');
75
+ const withExactMatch = calculateKeywordScore('auth', 'auth data', 'test.ts');
76
+ expect(withExactMatch).toBeGreaterThan(noMatch);
77
+ });
78
+ it('should recognize word boundaries with punctuation', () => {
79
+ const score = calculateKeywordScore('test', 'const test = 1;', 'test.ts');
80
+ // Should get exact match bonus
81
+ expect(score).toBeGreaterThan(0.5);
82
+ });
83
+ it('should handle camelCase boundaries', () => {
84
+ // Note: the regex uses \b which may not split camelCase
85
+ const score = calculateKeywordScore('user', 'getUserData', 'test.ts');
86
+ // Substring match, no word boundary bonus
87
+ expect(score).toBeGreaterThan(0);
88
+ });
89
+ });
90
+ describe('filename/path bonus', () => {
91
+ it('should add bonus when term matches filepath', () => {
92
+ const _noPathMatch = calculateKeywordScore('auth', 'authentication code', 'utils.ts');
93
+ const withPathMatch = calculateKeywordScore('auth', 'code here', 'auth.ts');
94
+ // Both should have some score, path match gives 0.5 bonus per term
95
+ expect(withPathMatch).toBeGreaterThan(0);
96
+ });
97
+ it('should add bonus for directory match', () => {
98
+ const score = calculateKeywordScore('auth', 'some code', 'src/auth/login.ts');
99
+ expect(score).toBeGreaterThan(0);
100
+ });
101
+ it('should combine content and path matches', () => {
102
+ const contentOnly = calculateKeywordScore('auth', 'auth function', 'utils.ts');
103
+ const pathOnly = calculateKeywordScore('auth', 'function here', 'auth.ts');
104
+ const both = calculateKeywordScore('auth', 'auth function', 'auth.ts');
105
+ // contentOnly: 1 (content match) + 0.5 (word boundary) = 1.5, capped at 1
106
+ // pathOnly: 0.5 (path match only) / 1 = 0.5
107
+ // both: 1 + 0.5 (content+boundary) + 0.5 (path) = 2, capped at 1
108
+ expect(both).toBeGreaterThanOrEqual(contentOnly);
109
+ expect(both).toBeGreaterThan(pathOnly);
110
+ });
111
+ });
112
+ describe('score normalization', () => {
113
+ it('should never exceed 1', () => {
114
+ // Many matches, should still cap at 1
115
+ const score = calculateKeywordScore('auth user login', 'auth user login authentication', 'auth-user-login.ts');
116
+ expect(score).toBeLessThanOrEqual(1);
117
+ });
118
+ it('should scale with number of matching terms', () => {
119
+ const oneMatch = calculateKeywordScore('auth user login', 'auth only', 'test.ts');
120
+ const twoMatches = calculateKeywordScore('auth user login', 'auth user only', 'test.ts');
121
+ const threeMatches = calculateKeywordScore('auth user login', 'auth user login', 'test.ts');
122
+ // oneMatch: 1 match of 3 terms = 0.33 base + 0.5/3 word boundary bonus = ~0.5
123
+ // twoMatches: 2 matches of 3 terms = 0.66 base + 1.0/3 word boundary bonus = ~0.99
124
+ // threeMatches: 3 matches of 3 terms = 1.0 base + 0.5 word boundary (capped) = 1.0
125
+ expect(threeMatches).toBeGreaterThanOrEqual(twoMatches);
126
+ expect(twoMatches).toBeGreaterThan(oneMatch);
127
+ });
128
+ });
129
+ describe('case insensitivity', () => {
130
+ it('should match regardless of case', () => {
131
+ const lowerScore = calculateKeywordScore('auth', 'auth function', 'test.ts');
132
+ const upperScore = calculateKeywordScore('AUTH', 'auth function', 'test.ts');
133
+ const mixedScore = calculateKeywordScore('Auth', 'AUTH function', 'test.ts');
134
+ expect(lowerScore).toBeGreaterThan(0);
135
+ expect(upperScore).toBeGreaterThan(0);
136
+ expect(mixedScore).toBeGreaterThan(0);
137
+ });
138
+ });
139
+ describe('edge cases', () => {
140
+ it('should handle empty query', () => {
141
+ const score = calculateKeywordScore('', 'some content', 'test.ts');
142
+ expect(score).toBe(0);
143
+ });
144
+ it('should handle empty content', () => {
145
+ const score = calculateKeywordScore('hello world', '', 'test.ts');
146
+ expect(score).toBe(0);
147
+ });
148
+ it('should handle special regex characters in query', () => {
149
+ // Should not throw
150
+ const score = calculateKeywordScore('file.test', 'file.test content', 'test.ts');
151
+ expect(score).toBeGreaterThan(0);
152
+ });
153
+ });
154
+ });
155
+ describe('hybrid search scoring', () => {
156
+ // Test the combined 70/30 semantic/keyword formula
157
+ describe('combined score calculation', () => {
158
+ it('should weight semantic score at 70%', () => {
159
+ const semanticScore = 1.0;
160
+ const keywordScore = 0.0;
161
+ const combinedScore = 0.7 * semanticScore + 0.3 * keywordScore;
162
+ expect(combinedScore).toBe(0.7);
163
+ });
164
+ it('should weight keyword score at 30%', () => {
165
+ const semanticScore = 0.0;
166
+ const keywordScore = 1.0;
167
+ const combinedScore = 0.7 * semanticScore + 0.3 * keywordScore;
168
+ expect(combinedScore).toBe(0.3);
169
+ });
170
+ it('should sum to 1 when both scores are 1', () => {
171
+ const semanticScore = 1.0;
172
+ const keywordScore = 1.0;
173
+ const combinedScore = 0.7 * semanticScore + 0.3 * keywordScore;
174
+ expect(combinedScore).toBe(1.0);
175
+ });
176
+ it('should allow keyword boost to reorder results', () => {
177
+ // Scenario: result A has high semantic, low keyword
178
+ // Result B has medium semantic, high keyword
179
+ const resultA = 0.7 * 0.9 + 0.3 * 0.1; // 0.63 + 0.03 = 0.66
180
+ const resultB = 0.7 * 0.7 + 0.3 * 1.0; // 0.49 + 0.30 = 0.79
181
+ // B should rank higher despite lower semantic score
182
+ expect(resultB).toBeGreaterThan(resultA);
183
+ });
184
+ });
185
+ });
186
+ //# sourceMappingURL=hybrid-search.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-search.test.js","sourceRoot":"","sources":["../../../src/__tests__/search/hybrid-search.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=indexer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/search/indexer.test.ts"],"names":[],"mappings":""}