lance-context 0.1.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +69 -0
  115. package/dist/dashboard/index.d.ts.map +1 -0
  116. package/dist/dashboard/index.js +93 -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 +245 -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 +125 -0
  127. package/dist/dashboard/state.d.ts.map +1 -0
  128. package/dist/dashboard/state.js +264 -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 +1421 -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 +1871 -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,455 @@
1
+ /**
2
+ * K-means clustering for semantic code grouping.
3
+ * Groups code chunks by similarity to discover concept areas in the codebase.
4
+ */
5
+ /**
6
+ * Calculate cosine similarity between two vectors
7
+ */
8
+ export function cosineSimilarity(a, b) {
9
+ if (a.length !== b.length) {
10
+ throw new Error('Vectors must have same length');
11
+ }
12
+ let dotProduct = 0;
13
+ let normA = 0;
14
+ let normB = 0;
15
+ for (let i = 0; i < a.length; i++) {
16
+ dotProduct += a[i] * b[i];
17
+ normA += a[i] * a[i];
18
+ normB += b[i] * b[i];
19
+ }
20
+ normA = Math.sqrt(normA);
21
+ normB = Math.sqrt(normB);
22
+ if (normA === 0 || normB === 0) {
23
+ return 0;
24
+ }
25
+ return dotProduct / (normA * normB);
26
+ }
27
+ /**
28
+ * Calculate Euclidean distance between two vectors
29
+ */
30
+ export function euclideanDistance(a, b) {
31
+ if (a.length !== b.length) {
32
+ throw new Error('Vectors must have same length');
33
+ }
34
+ let sum = 0;
35
+ for (let i = 0; i < a.length; i++) {
36
+ const diff = a[i] - b[i];
37
+ sum += diff * diff;
38
+ }
39
+ return Math.sqrt(sum);
40
+ }
41
+ /**
42
+ * Calculate centroid (mean) of a set of vectors
43
+ */
44
+ function calculateCentroid(vectors) {
45
+ if (vectors.length === 0) {
46
+ throw new Error('Cannot calculate centroid of empty set');
47
+ }
48
+ const dimensions = vectors[0].length;
49
+ const centroid = new Array(dimensions).fill(0);
50
+ for (const vec of vectors) {
51
+ for (let i = 0; i < dimensions; i++) {
52
+ centroid[i] += vec[i];
53
+ }
54
+ }
55
+ for (let i = 0; i < dimensions; i++) {
56
+ centroid[i] /= vectors.length;
57
+ }
58
+ return centroid;
59
+ }
60
+ /**
61
+ * Initialize centroids using k-means++ algorithm for better initial placement
62
+ */
63
+ function initializeCentroidsKMeansPP(embeddings, k) {
64
+ const centroids = [];
65
+ const n = embeddings.length;
66
+ // Pick first centroid randomly
67
+ const firstIdx = Math.floor(Math.random() * n);
68
+ centroids.push([...embeddings[firstIdx]]);
69
+ // Pick remaining centroids with probability proportional to squared distance
70
+ for (let c = 1; c < k; c++) {
71
+ const distances = [];
72
+ let totalDist = 0;
73
+ for (let i = 0; i < n; i++) {
74
+ // Find minimum distance to existing centroids
75
+ let minDist = Infinity;
76
+ for (const centroid of centroids) {
77
+ const dist = euclideanDistance(embeddings[i], centroid);
78
+ if (dist < minDist) {
79
+ minDist = dist;
80
+ }
81
+ }
82
+ distances.push(minDist * minDist); // Square the distance
83
+ totalDist += minDist * minDist;
84
+ }
85
+ // Weighted random selection
86
+ let rand = Math.random() * totalDist;
87
+ let selectedIdx = 0;
88
+ for (let i = 0; i < n; i++) {
89
+ rand -= distances[i];
90
+ if (rand <= 0) {
91
+ selectedIdx = i;
92
+ break;
93
+ }
94
+ }
95
+ centroids.push([...embeddings[selectedIdx]]);
96
+ }
97
+ return centroids;
98
+ }
99
+ /**
100
+ * Perform k-means clustering on embeddings
101
+ */
102
+ export function kMeansClustering(chunks, options = {}) {
103
+ const { numClusters = Math.max(3, Math.min(20, Math.ceil(Math.sqrt(chunks.length / 2)))), maxIterations = 100, convergenceThreshold = 0.001, numRepresentatives = 3, } = options;
104
+ if (chunks.length === 0) {
105
+ return {
106
+ clusterCount: 0,
107
+ clusters: [],
108
+ assignments: new Map(),
109
+ };
110
+ }
111
+ // Handle edge case where we have fewer chunks than requested clusters
112
+ const k = Math.min(numClusters, chunks.length);
113
+ if (k <= 1) {
114
+ // Single cluster case
115
+ const allEmbeddings = chunks.map((c) => c.embedding);
116
+ const centroid = calculateCentroid(allEmbeddings);
117
+ const assignments = new Map();
118
+ for (const chunk of chunks) {
119
+ assignments.set(chunk.id, 0);
120
+ }
121
+ return {
122
+ clusterCount: 1,
123
+ clusters: [
124
+ {
125
+ id: 0,
126
+ label: generateClusterLabel(chunks, chunks.slice(0, numRepresentatives)),
127
+ size: chunks.length,
128
+ representativeChunks: chunks.slice(0, numRepresentatives).map((c) => c.id),
129
+ centroid,
130
+ keywords: extractKeywords(chunks),
131
+ },
132
+ ],
133
+ assignments,
134
+ };
135
+ }
136
+ const embeddings = chunks.map((c) => c.embedding);
137
+ // Initialize centroids using k-means++
138
+ let centroids = initializeCentroidsKMeansPP(embeddings, k);
139
+ // Assignments array: index = chunk index, value = cluster index
140
+ let clusterAssignments = new Array(chunks.length).fill(0);
141
+ for (let iteration = 0; iteration < maxIterations; iteration++) {
142
+ // Assignment step: assign each point to nearest centroid
143
+ const newAssignments = new Array(chunks.length).fill(0);
144
+ for (let i = 0; i < chunks.length; i++) {
145
+ let minDist = Infinity;
146
+ let nearestCluster = 0;
147
+ for (let c = 0; c < k; c++) {
148
+ const dist = euclideanDistance(embeddings[i], centroids[c]);
149
+ if (dist < minDist) {
150
+ minDist = dist;
151
+ nearestCluster = c;
152
+ }
153
+ }
154
+ newAssignments[i] = nearestCluster;
155
+ }
156
+ // Check for convergence
157
+ let changed = false;
158
+ for (let i = 0; i < chunks.length; i++) {
159
+ if (newAssignments[i] !== clusterAssignments[i]) {
160
+ changed = true;
161
+ break;
162
+ }
163
+ }
164
+ clusterAssignments = newAssignments;
165
+ if (!changed) {
166
+ break;
167
+ }
168
+ // Update step: recalculate centroids
169
+ const newCentroids = [];
170
+ let maxShift = 0;
171
+ for (let c = 0; c < k; c++) {
172
+ const clusterVectors = [];
173
+ for (let i = 0; i < chunks.length; i++) {
174
+ if (clusterAssignments[i] === c) {
175
+ clusterVectors.push(embeddings[i]);
176
+ }
177
+ }
178
+ if (clusterVectors.length > 0) {
179
+ const newCentroid = calculateCentroid(clusterVectors);
180
+ const shift = euclideanDistance(centroids[c], newCentroid);
181
+ maxShift = Math.max(maxShift, shift);
182
+ newCentroids.push(newCentroid);
183
+ }
184
+ else {
185
+ // Empty cluster - reinitialize with random point
186
+ const randomIdx = Math.floor(Math.random() * chunks.length);
187
+ newCentroids.push([...embeddings[randomIdx]]);
188
+ }
189
+ }
190
+ centroids = newCentroids;
191
+ // Check for convergence based on centroid shift
192
+ if (maxShift < convergenceThreshold) {
193
+ break;
194
+ }
195
+ }
196
+ // Build cluster results
197
+ const clusterChunks = Array(k)
198
+ .fill(null)
199
+ .map(() => []);
200
+ for (let i = 0; i < chunks.length; i++) {
201
+ clusterChunks[clusterAssignments[i]].push(chunks[i]);
202
+ }
203
+ const assignments = new Map();
204
+ for (let i = 0; i < chunks.length; i++) {
205
+ assignments.set(chunks[i].id, clusterAssignments[i]);
206
+ }
207
+ // Create cluster objects with labels and representatives
208
+ const clusters = [];
209
+ for (let c = 0; c < k; c++) {
210
+ const chunksInCluster = clusterChunks[c];
211
+ if (chunksInCluster.length === 0)
212
+ continue;
213
+ // Find representative chunks (closest to centroid)
214
+ const sortedByDistance = [...chunksInCluster].sort((a, b) => {
215
+ const distA = euclideanDistance(a.embedding, centroids[c]);
216
+ const distB = euclideanDistance(b.embedding, centroids[c]);
217
+ return distA - distB;
218
+ });
219
+ const representatives = sortedByDistance.slice(0, numRepresentatives);
220
+ const label = generateClusterLabel(chunksInCluster, representatives);
221
+ const keywords = extractKeywords(chunksInCluster);
222
+ clusters.push({
223
+ id: c,
224
+ label,
225
+ size: chunksInCluster.length,
226
+ representativeChunks: representatives.map((r) => r.id),
227
+ centroid: centroids[c],
228
+ keywords,
229
+ });
230
+ }
231
+ // Sort clusters by size (largest first)
232
+ clusters.sort((a, b) => b.size - a.size);
233
+ // Renumber cluster IDs after sorting
234
+ const idMapping = new Map();
235
+ clusters.forEach((cluster, newId) => {
236
+ idMapping.set(cluster.id, newId);
237
+ cluster.id = newId;
238
+ });
239
+ // Update assignments with new IDs
240
+ for (const [chunkId, oldClusterId] of assignments) {
241
+ const newClusterId = idMapping.get(oldClusterId);
242
+ if (newClusterId !== undefined) {
243
+ assignments.set(chunkId, newClusterId);
244
+ }
245
+ }
246
+ return {
247
+ clusterCount: clusters.length,
248
+ clusters,
249
+ assignments,
250
+ };
251
+ }
252
+ /**
253
+ * Generate a human-readable label for a cluster based on its contents
254
+ */
255
+ function generateClusterLabel(allChunks, representatives) {
256
+ // Try to derive label from symbol types and file paths
257
+ const symbolTypes = new Map();
258
+ const dirPaths = new Map();
259
+ for (const chunk of allChunks) {
260
+ if (chunk.symbolType) {
261
+ symbolTypes.set(chunk.symbolType, (symbolTypes.get(chunk.symbolType) || 0) + 1);
262
+ }
263
+ // Extract directory from filepath
264
+ const parts = chunk.filepath.split('/');
265
+ if (parts.length > 1) {
266
+ const dir = parts.slice(0, -1).join('/');
267
+ dirPaths.set(dir, (dirPaths.get(dir) || 0) + 1);
268
+ }
269
+ }
270
+ // Find dominant symbol type
271
+ let dominantType = '';
272
+ let maxTypeCount = 0;
273
+ for (const [type, count] of symbolTypes) {
274
+ if (count > maxTypeCount) {
275
+ maxTypeCount = count;
276
+ dominantType = type;
277
+ }
278
+ }
279
+ // Find dominant directory
280
+ let dominantDir = '';
281
+ let maxDirCount = 0;
282
+ for (const [dir, count] of dirPaths) {
283
+ if (count > maxDirCount) {
284
+ maxDirCount = count;
285
+ dominantDir = dir;
286
+ }
287
+ }
288
+ // Build label
289
+ const parts = [];
290
+ if (dominantDir) {
291
+ // Use last directory component
292
+ const dirParts = dominantDir.split('/');
293
+ parts.push(dirParts[dirParts.length - 1]);
294
+ }
295
+ if (dominantType) {
296
+ parts.push(`${dominantType}s`);
297
+ }
298
+ if (parts.length === 0) {
299
+ // Fallback: use keywords from representatives
300
+ const keywords = extractKeywords(representatives);
301
+ if (keywords.length > 0) {
302
+ return keywords.slice(0, 2).join(' & ');
303
+ }
304
+ return 'Code';
305
+ }
306
+ return parts.join(' ');
307
+ }
308
+ /**
309
+ * Extract keywords from chunk contents for labeling
310
+ */
311
+ function extractKeywords(chunks) {
312
+ const wordFreq = new Map();
313
+ // Common words to exclude
314
+ const stopWords = new Set([
315
+ 'function',
316
+ 'const',
317
+ 'let',
318
+ 'var',
319
+ 'return',
320
+ 'if',
321
+ 'else',
322
+ 'for',
323
+ 'while',
324
+ 'import',
325
+ 'export',
326
+ 'from',
327
+ 'class',
328
+ 'interface',
329
+ 'type',
330
+ 'async',
331
+ 'await',
332
+ 'new',
333
+ 'this',
334
+ 'true',
335
+ 'false',
336
+ 'null',
337
+ 'undefined',
338
+ 'public',
339
+ 'private',
340
+ 'static',
341
+ 'void',
342
+ 'string',
343
+ 'number',
344
+ 'boolean',
345
+ 'any',
346
+ 'def',
347
+ 'self',
348
+ 'none',
349
+ 'pass',
350
+ 'try',
351
+ 'except',
352
+ 'catch',
353
+ 'throw',
354
+ 'throws',
355
+ 'extends',
356
+ 'implements',
357
+ 'default',
358
+ 'case',
359
+ 'break',
360
+ 'continue',
361
+ ]);
362
+ for (const chunk of chunks) {
363
+ // Extract identifier-like words
364
+ const words = chunk.content.match(/[a-zA-Z][a-zA-Z0-9_]*[a-zA-Z0-9]/g) || [];
365
+ for (const word of words) {
366
+ const lower = word.toLowerCase();
367
+ if (lower.length >= 4 && !stopWords.has(lower)) {
368
+ wordFreq.set(lower, (wordFreq.get(lower) || 0) + 1);
369
+ }
370
+ }
371
+ // Add symbol name with higher weight
372
+ if (chunk.symbolName) {
373
+ const symbolWords = chunk.symbolName.match(/[A-Z]?[a-z]+/g) || [];
374
+ for (const word of symbolWords) {
375
+ const lower = word.toLowerCase();
376
+ if (lower.length >= 4 && !stopWords.has(lower)) {
377
+ wordFreq.set(lower, (wordFreq.get(lower) || 0) + 3);
378
+ }
379
+ }
380
+ }
381
+ }
382
+ // Sort by frequency and return top keywords
383
+ const sorted = [...wordFreq.entries()].sort((a, b) => b[1] - a[1]);
384
+ return sorted.slice(0, 10).map(([word]) => word);
385
+ }
386
+ /**
387
+ * Find the cluster ID for a given embedding (nearest centroid)
388
+ */
389
+ export function assignToCluster(embedding, clusters) {
390
+ let minDist = Infinity;
391
+ let nearestCluster = 0;
392
+ for (const cluster of clusters) {
393
+ const dist = euclideanDistance(embedding, cluster.centroid);
394
+ if (dist < minDist) {
395
+ minDist = dist;
396
+ nearestCluster = cluster.id;
397
+ }
398
+ }
399
+ return nearestCluster;
400
+ }
401
+ /**
402
+ * Calculate silhouette score for clustering quality assessment
403
+ */
404
+ export function calculateSilhouetteScore(chunks, assignments, clusters) {
405
+ if (clusters.length <= 1 || chunks.length <= 1) {
406
+ return 0;
407
+ }
408
+ let totalScore = 0;
409
+ let count = 0;
410
+ for (const chunk of chunks) {
411
+ const clusterId = assignments.get(chunk.id);
412
+ if (clusterId === undefined)
413
+ continue;
414
+ // Calculate a(i): average distance to other points in same cluster
415
+ let intraClusterDist = 0;
416
+ let intraCount = 0;
417
+ for (const other of chunks) {
418
+ if (other.id === chunk.id)
419
+ continue;
420
+ if (assignments.get(other.id) === clusterId) {
421
+ intraClusterDist += euclideanDistance(chunk.embedding, other.embedding);
422
+ intraCount++;
423
+ }
424
+ }
425
+ const a = intraCount > 0 ? intraClusterDist / intraCount : 0;
426
+ // Calculate b(i): minimum average distance to points in other clusters
427
+ let minInterClusterDist = Infinity;
428
+ for (const otherCluster of clusters) {
429
+ if (otherCluster.id === clusterId)
430
+ continue;
431
+ let interDist = 0;
432
+ let interCount = 0;
433
+ for (const other of chunks) {
434
+ if (assignments.get(other.id) === otherCluster.id) {
435
+ interDist += euclideanDistance(chunk.embedding, other.embedding);
436
+ interCount++;
437
+ }
438
+ }
439
+ if (interCount > 0) {
440
+ const avgDist = interDist / interCount;
441
+ if (avgDist < minInterClusterDist) {
442
+ minInterClusterDist = avgDist;
443
+ }
444
+ }
445
+ }
446
+ const b = minInterClusterDist === Infinity ? 0 : minInterClusterDist;
447
+ // Silhouette coefficient for this point
448
+ const maxAB = Math.max(a, b);
449
+ const s = maxAB > 0 ? (b - a) / maxAB : 0;
450
+ totalScore += s;
451
+ count++;
452
+ }
453
+ return count > 0 ? totalScore / count : 0;
454
+ }
455
+ //# sourceMappingURL=clustering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clustering.js","sourceRoot":"","sources":["../../src/search/clustering.ts"],"names":[],"mappings":"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"}