glancey 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +435 -0
- package/dist/__tests__/ast-chunker.test.d.ts +2 -0
- package/dist/__tests__/ast-chunker.test.d.ts.map +1 -0
- package/dist/__tests__/ast-chunker.test.js +307 -0
- package/dist/__tests__/ast-chunker.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +242 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/dashboard/beads.test.d.ts +2 -0
- package/dist/__tests__/dashboard/beads.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/beads.test.js +151 -0
- package/dist/__tests__/dashboard/beads.test.js.map +1 -0
- package/dist/__tests__/dashboard/index.test.d.ts +2 -0
- package/dist/__tests__/dashboard/index.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/index.test.js +116 -0
- package/dist/__tests__/dashboard/index.test.js.map +1 -0
- package/dist/__tests__/dashboard/routes.test.d.ts +2 -0
- package/dist/__tests__/dashboard/routes.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/routes.test.js +125 -0
- package/dist/__tests__/dashboard/routes.test.js.map +1 -0
- package/dist/__tests__/dashboard/server.test.d.ts +2 -0
- package/dist/__tests__/dashboard/server.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/server.test.js +75 -0
- package/dist/__tests__/dashboard/server.test.js.map +1 -0
- package/dist/__tests__/dashboard/state.test.d.ts +2 -0
- package/dist/__tests__/dashboard/state.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/state.test.js +124 -0
- package/dist/__tests__/dashboard/state.test.js.map +1 -0
- package/dist/__tests__/dashboard/token-tracking.test.d.ts +2 -0
- package/dist/__tests__/dashboard/token-tracking.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/token-tracking.test.js +315 -0
- package/dist/__tests__/dashboard/token-tracking.test.js.map +1 -0
- package/dist/__tests__/embeddings/factory.test.d.ts +2 -0
- package/dist/__tests__/embeddings/factory.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/factory.test.js +157 -0
- package/dist/__tests__/embeddings/factory.test.js.map +1 -0
- package/dist/__tests__/embeddings/gemini.test.d.ts +2 -0
- package/dist/__tests__/embeddings/gemini.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/gemini.test.js +178 -0
- package/dist/__tests__/embeddings/gemini.test.js.map +1 -0
- package/dist/__tests__/embeddings/ollama.test.d.ts +2 -0
- package/dist/__tests__/embeddings/ollama.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/ollama.test.js +273 -0
- package/dist/__tests__/embeddings/ollama.test.js.map +1 -0
- package/dist/__tests__/embeddings/rate-limiter.test.d.ts +2 -0
- package/dist/__tests__/embeddings/rate-limiter.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/rate-limiter.test.js +163 -0
- package/dist/__tests__/embeddings/rate-limiter.test.js.map +1 -0
- package/dist/__tests__/embeddings/retry.test.d.ts +2 -0
- package/dist/__tests__/embeddings/retry.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/retry.test.js +334 -0
- package/dist/__tests__/embeddings/retry.test.js.map +1 -0
- package/dist/__tests__/embeddings/types.test.d.ts +2 -0
- package/dist/__tests__/embeddings/types.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/types.test.js +31 -0
- package/dist/__tests__/embeddings/types.test.js.map +1 -0
- package/dist/__tests__/mocks/embedding-backend.mock.d.ts +10 -0
- package/dist/__tests__/mocks/embedding-backend.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/embedding-backend.mock.js +39 -0
- package/dist/__tests__/mocks/embedding-backend.mock.js.map +1 -0
- package/dist/__tests__/mocks/fetch.mock.d.ts +49 -0
- package/dist/__tests__/mocks/fetch.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/fetch.mock.js +102 -0
- package/dist/__tests__/mocks/fetch.mock.js.map +1 -0
- package/dist/__tests__/mocks/lancedb.mock.d.ts +38 -0
- package/dist/__tests__/mocks/lancedb.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/lancedb.mock.js +63 -0
- package/dist/__tests__/mocks/lancedb.mock.js.map +1 -0
- package/dist/__tests__/search/clustering.test.d.ts +2 -0
- package/dist/__tests__/search/clustering.test.d.ts.map +1 -0
- package/dist/__tests__/search/clustering.test.js +230 -0
- package/dist/__tests__/search/clustering.test.js.map +1 -0
- package/dist/__tests__/search/hybrid-search.test.d.ts +2 -0
- package/dist/__tests__/search/hybrid-search.test.d.ts.map +1 -0
- package/dist/__tests__/search/hybrid-search.test.js +279 -0
- package/dist/__tests__/search/hybrid-search.test.js.map +1 -0
- package/dist/__tests__/search/indexer.test.d.ts +2 -0
- package/dist/__tests__/search/indexer.test.d.ts.map +1 -0
- package/dist/__tests__/search/indexer.test.js +1305 -0
- package/dist/__tests__/search/indexer.test.js.map +1 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.d.ts +2 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.d.ts.map +1 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.js +228 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.js.map +1 -0
- package/dist/__tests__/setup.d.ts +2 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +11 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/__tests__/tools/clustering-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/clustering-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/clustering-handlers.test.js +286 -0
- package/dist/__tests__/tools/clustering-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/commit-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/commit-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/commit-handlers.test.js +153 -0
- package/dist/__tests__/tools/commit-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/index-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/index-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/index-handlers.test.js +184 -0
- package/dist/__tests__/tools/index-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/instructions-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/instructions-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/instructions-handlers.test.js +53 -0
- package/dist/__tests__/tools/instructions-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/memory-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/memory-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/memory-handlers.test.js +175 -0
- package/dist/__tests__/tools/memory-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/search-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/search-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/search-handlers.test.js +229 -0
- package/dist/__tests__/tools/search-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/symbol-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/symbol-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/symbol-handlers.test.js +348 -0
- package/dist/__tests__/tools/symbol-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/worktree-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/worktree-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/worktree-handlers.test.js +297 -0
- package/dist/__tests__/tools/worktree-handlers.test.js.map +1 -0
- package/dist/__tests__/utils/cache.test.d.ts +2 -0
- package/dist/__tests__/utils/cache.test.d.ts.map +1 -0
- package/dist/__tests__/utils/cache.test.js +147 -0
- package/dist/__tests__/utils/cache.test.js.map +1 -0
- package/dist/__tests__/utils/concurrency.test.d.ts +2 -0
- package/dist/__tests__/utils/concurrency.test.d.ts.map +1 -0
- package/dist/__tests__/utils/concurrency.test.js +83 -0
- package/dist/__tests__/utils/concurrency.test.js.map +1 -0
- package/dist/__tests__/utils/errors.test.d.ts +2 -0
- package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
- package/dist/__tests__/utils/errors.test.js +136 -0
- package/dist/__tests__/utils/errors.test.js.map +1 -0
- package/dist/__tests__/utils/logger.test.d.ts +2 -0
- package/dist/__tests__/utils/logger.test.d.ts.map +1 -0
- package/dist/__tests__/utils/logger.test.js +131 -0
- package/dist/__tests__/utils/logger.test.js.map +1 -0
- package/dist/__tests__/utils/type-guards.test.d.ts +2 -0
- package/dist/__tests__/utils/type-guards.test.d.ts.map +1 -0
- package/dist/__tests__/utils/type-guards.test.js +80 -0
- package/dist/__tests__/utils/type-guards.test.js.map +1 -0
- package/dist/__tests__/worktree/worktree-manager.test.d.ts +2 -0
- package/dist/__tests__/worktree/worktree-manager.test.d.ts.map +1 -0
- package/dist/__tests__/worktree/worktree-manager.test.js +403 -0
- package/dist/__tests__/worktree/worktree-manager.test.js.map +1 -0
- package/dist/config.d.ts +191 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +788 -0
- package/dist/config.js.map +1 -0
- package/dist/dashboard/beads.d.ts +35 -0
- package/dist/dashboard/beads.d.ts.map +1 -0
- package/dist/dashboard/beads.js +102 -0
- package/dist/dashboard/beads.js.map +1 -0
- package/dist/dashboard/events.d.ts +64 -0
- package/dist/dashboard/events.d.ts.map +1 -0
- package/dist/dashboard/events.js +211 -0
- package/dist/dashboard/events.js.map +1 -0
- package/dist/dashboard/index.d.ts +69 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +93 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/routes.d.ts +6 -0
- package/dist/dashboard/routes.d.ts.map +1 -0
- package/dist/dashboard/routes.js +505 -0
- package/dist/dashboard/routes.js.map +1 -0
- package/dist/dashboard/server.d.ts +27 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +72 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/dashboard/state.d.ts +172 -0
- package/dist/dashboard/state.d.ts.map +1 -0
- package/dist/dashboard/state.js +362 -0
- package/dist/dashboard/state.js.map +1 -0
- package/dist/dashboard/token-tracking.d.ts +143 -0
- package/dist/dashboard/token-tracking.d.ts.map +1 -0
- package/dist/dashboard/token-tracking.js +363 -0
- package/dist/dashboard/token-tracking.js.map +1 -0
- package/dist/dashboard/ui.d.ts +6 -0
- package/dist/dashboard/ui.d.ts.map +1 -0
- package/dist/dashboard/ui.js +2710 -0
- package/dist/dashboard/ui.js.map +1 -0
- package/dist/embeddings/gemini.d.ts +28 -0
- package/dist/embeddings/gemini.d.ts.map +1 -0
- package/dist/embeddings/gemini.js +165 -0
- package/dist/embeddings/gemini.js.map +1 -0
- package/dist/embeddings/index.d.ts +34 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +120 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/ollama.d.ts +22 -0
- package/dist/embeddings/ollama.d.ts.map +1 -0
- package/dist/embeddings/ollama.js +179 -0
- package/dist/embeddings/ollama.js.map +1 -0
- package/dist/embeddings/rate-limiter.d.ts +75 -0
- package/dist/embeddings/rate-limiter.d.ts.map +1 -0
- package/dist/embeddings/rate-limiter.js +145 -0
- package/dist/embeddings/rate-limiter.js.map +1 -0
- package/dist/embeddings/retry.d.ts +20 -0
- package/dist/embeddings/retry.d.ts.map +1 -0
- package/dist/embeddings/retry.js +227 -0
- package/dist/embeddings/retry.js.map +1 -0
- package/dist/embeddings/types.d.ts +103 -0
- package/dist/embeddings/types.d.ts.map +1 -0
- package/dist/embeddings/types.js +23 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2028 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +63 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +168 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/search/ast-chunker.d.ts +29 -0
- package/dist/search/ast-chunker.d.ts.map +1 -0
- package/dist/search/ast-chunker.js +236 -0
- package/dist/search/ast-chunker.js.map +1 -0
- package/dist/search/chunk-utils.d.ts +24 -0
- package/dist/search/chunk-utils.d.ts.map +1 -0
- package/dist/search/chunk-utils.js +41 -0
- package/dist/search/chunk-utils.js.map +1 -0
- package/dist/search/clustering.d.ts +77 -0
- package/dist/search/clustering.d.ts.map +1 -0
- package/dist/search/clustering.js +455 -0
- package/dist/search/clustering.js.map +1 -0
- package/dist/search/indexer.d.ts +377 -0
- package/dist/search/indexer.d.ts.map +1 -0
- package/dist/search/indexer.js +1557 -0
- package/dist/search/indexer.js.map +1 -0
- package/dist/search/tree-sitter-chunker.d.ts +64 -0
- package/dist/search/tree-sitter-chunker.d.ts.map +1 -0
- package/dist/search/tree-sitter-chunker.js +412 -0
- package/dist/search/tree-sitter-chunker.js.map +1 -0
- package/dist/symbols/index.d.ts +14 -0
- package/dist/symbols/index.d.ts.map +1 -0
- package/dist/symbols/index.js +19 -0
- package/dist/symbols/index.js.map +1 -0
- package/dist/symbols/name-path.d.ts +113 -0
- package/dist/symbols/name-path.d.ts.map +1 -0
- package/dist/symbols/name-path.js +194 -0
- package/dist/symbols/name-path.js.map +1 -0
- package/dist/symbols/pattern-search.d.ts +14 -0
- package/dist/symbols/pattern-search.d.ts.map +1 -0
- package/dist/symbols/pattern-search.js +224 -0
- package/dist/symbols/pattern-search.js.map +1 -0
- package/dist/symbols/reference-finder.d.ts +38 -0
- package/dist/symbols/reference-finder.d.ts.map +1 -0
- package/dist/symbols/reference-finder.js +376 -0
- package/dist/symbols/reference-finder.js.map +1 -0
- package/dist/symbols/symbol-editor.d.ts +81 -0
- package/dist/symbols/symbol-editor.d.ts.map +1 -0
- package/dist/symbols/symbol-editor.js +257 -0
- package/dist/symbols/symbol-editor.js.map +1 -0
- package/dist/symbols/symbol-extractor.d.ts +49 -0
- package/dist/symbols/symbol-extractor.d.ts.map +1 -0
- package/dist/symbols/symbol-extractor.js +593 -0
- package/dist/symbols/symbol-extractor.js.map +1 -0
- package/dist/symbols/symbol-renamer.d.ts +81 -0
- package/dist/symbols/symbol-renamer.d.ts.map +1 -0
- package/dist/symbols/symbol-renamer.js +204 -0
- package/dist/symbols/symbol-renamer.js.map +1 -0
- package/dist/symbols/types.d.ts +234 -0
- package/dist/symbols/types.d.ts.map +1 -0
- package/dist/symbols/types.js +106 -0
- package/dist/symbols/types.js.map +1 -0
- package/dist/tools/clustering-handlers.d.ts +70 -0
- package/dist/tools/clustering-handlers.d.ts.map +1 -0
- package/dist/tools/clustering-handlers.js +150 -0
- package/dist/tools/clustering-handlers.js.map +1 -0
- package/dist/tools/commit-handlers.d.ts +77 -0
- package/dist/tools/commit-handlers.d.ts.map +1 -0
- package/dist/tools/commit-handlers.js +251 -0
- package/dist/tools/commit-handlers.js.map +1 -0
- package/dist/tools/index-handlers.d.ts +31 -0
- package/dist/tools/index-handlers.d.ts.map +1 -0
- package/dist/tools/index-handlers.js +53 -0
- package/dist/tools/index-handlers.js.map +1 -0
- package/dist/tools/instructions-handlers.d.ts +25 -0
- package/dist/tools/instructions-handlers.d.ts.map +1 -0
- package/dist/tools/instructions-handlers.js +36 -0
- package/dist/tools/instructions-handlers.js.map +1 -0
- package/dist/tools/memory-handlers.d.ts +95 -0
- package/dist/tools/memory-handlers.d.ts.map +1 -0
- package/dist/tools/memory-handlers.js +126 -0
- package/dist/tools/memory-handlers.js.map +1 -0
- package/dist/tools/search-handlers.d.ts +51 -0
- package/dist/tools/search-handlers.d.ts.map +1 -0
- package/dist/tools/search-handlers.js +128 -0
- package/dist/tools/search-handlers.js.map +1 -0
- package/dist/tools/symbol-handlers.d.ts +171 -0
- package/dist/tools/symbol-handlers.d.ts.map +1 -0
- package/dist/tools/symbol-handlers.js +456 -0
- package/dist/tools/symbol-handlers.js.map +1 -0
- package/dist/tools/types.d.ts +32 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +17 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/worktree-handlers.d.ts +96 -0
- package/dist/tools/worktree-handlers.d.ts.map +1 -0
- package/dist/tools/worktree-handlers.js +186 -0
- package/dist/tools/worktree-handlers.js.map +1 -0
- package/dist/utils/cache.d.ts +77 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +134 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/concurrency.d.ts +32 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +57 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/errors.d.ts +36 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +91 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +37 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +114 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/type-guards.d.ts +17 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +25 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/dist/worktree/index.d.ts +6 -0
- package/dist/worktree/index.d.ts.map +1 -0
- package/dist/worktree/index.js +6 -0
- package/dist/worktree/index.js.map +1 -0
- package/dist/worktree/types.d.ts +101 -0
- package/dist/worktree/types.d.ts.map +1 -0
- package/dist/worktree/types.js +6 -0
- package/dist/worktree/types.js.map +1 -0
- package/dist/worktree/worktree-manager.d.ts +80 -0
- package/dist/worktree/worktree-manager.d.ts.map +1 -0
- package/dist/worktree/worktree-manager.js +407 -0
- package/dist/worktree/worktree-manager.js.map +1 -0
- package/package.json +87 -0
- package/scripts/postinstall.js +48 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for code chunking.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Base interface for code chunks.
|
|
6
|
+
* Both ASTChunk and TreeSitterChunk share this structure.
|
|
7
|
+
*/
|
|
8
|
+
export interface BaseChunk {
|
|
9
|
+
content: string;
|
|
10
|
+
startLine: number;
|
|
11
|
+
endLine: number;
|
|
12
|
+
type: 'function' | 'class' | 'method' | 'interface' | 'type' | 'variable' | 'import' | 'other';
|
|
13
|
+
name?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Split a large chunk into smaller pieces.
|
|
17
|
+
*
|
|
18
|
+
* @param chunk - The chunk to split
|
|
19
|
+
* @param maxLines - Maximum lines per chunk
|
|
20
|
+
* @param minLines - Minimum lines for a chunk (avoid tiny fragments)
|
|
21
|
+
* @returns Array of smaller chunks
|
|
22
|
+
*/
|
|
23
|
+
export declare function splitLargeChunk<T extends BaseChunk>(chunk: T, maxLines: number, minLines: number): T[];
|
|
24
|
+
//# sourceMappingURL=chunk-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-utils.d.ts","sourceRoot":"","sources":["../../src/search/chunk-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC/F,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,SAAS,EACjD,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,CAAC,EAAE,CA+BL"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for code chunking.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Split a large chunk into smaller pieces.
|
|
6
|
+
*
|
|
7
|
+
* @param chunk - The chunk to split
|
|
8
|
+
* @param maxLines - Maximum lines per chunk
|
|
9
|
+
* @param minLines - Minimum lines for a chunk (avoid tiny fragments)
|
|
10
|
+
* @returns Array of smaller chunks
|
|
11
|
+
*/
|
|
12
|
+
export function splitLargeChunk(chunk, maxLines, minLines) {
|
|
13
|
+
const chunkLines = chunk.content.split('\n');
|
|
14
|
+
const totalLines = chunkLines.length;
|
|
15
|
+
const chunks = [];
|
|
16
|
+
// Split into roughly equal parts, each under maxLines
|
|
17
|
+
const numParts = Math.ceil(totalLines / maxLines);
|
|
18
|
+
const linesPerPart = Math.ceil(totalLines / numParts);
|
|
19
|
+
for (let i = 0; i < numParts; i++) {
|
|
20
|
+
const startIdx = i * linesPerPart;
|
|
21
|
+
const endIdx = Math.min((i + 1) * linesPerPart, totalLines);
|
|
22
|
+
const partLines = chunkLines.slice(startIdx, endIdx);
|
|
23
|
+
if (partLines.length < minLines && chunks.length > 0) {
|
|
24
|
+
// Merge with previous chunk if too small
|
|
25
|
+
const lastChunk = chunks[chunks.length - 1];
|
|
26
|
+
lastChunk.content += '\n' + partLines.join('\n');
|
|
27
|
+
lastChunk.endLine = chunk.startLine + endIdx - 1;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
chunks.push({
|
|
31
|
+
...chunk,
|
|
32
|
+
content: partLines.join('\n'),
|
|
33
|
+
startLine: chunk.startLine + startIdx,
|
|
34
|
+
endLine: chunk.startLine + endIdx - 1,
|
|
35
|
+
name: chunk.name ? `${chunk.name} (part ${i + 1})` : undefined,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return chunks;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=chunk-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-utils.js","sourceRoot":"","sources":["../../src/search/chunk-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAQ,EACR,QAAgB,EAChB,QAAgB;IAEhB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;IACrC,MAAM,MAAM,GAAQ,EAAE,CAAC;IAEvB,sDAAsD;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;IAEtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,CAAC,GAAG,YAAY,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,EAAE,UAAU,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAErD,IAAI,SAAS,CAAC,MAAM,GAAG,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,yCAAyC;YACzC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC5C,SAAS,CAAC,OAAO,IAAI,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,KAAK;gBACR,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC7B,SAAS,EAAE,KAAK,CAAC,SAAS,GAAG,QAAQ;gBACrC,OAAO,EAAE,KAAK,CAAC,SAAS,GAAG,MAAM,GAAG,CAAC;gBACrC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;aAC1D,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
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
|
+
* Represents a discovered concept cluster
|
|
7
|
+
*/
|
|
8
|
+
export interface ConceptCluster {
|
|
9
|
+
/** Unique cluster identifier (0-indexed) */
|
|
10
|
+
id: number;
|
|
11
|
+
/** Human-readable label derived from representative chunks */
|
|
12
|
+
label: string;
|
|
13
|
+
/** Number of code chunks in this cluster */
|
|
14
|
+
size: number;
|
|
15
|
+
/** Representative chunk IDs for this cluster */
|
|
16
|
+
representativeChunks: string[];
|
|
17
|
+
/** Centroid vector for this cluster */
|
|
18
|
+
centroid: number[];
|
|
19
|
+
/** Keywords extracted from representative chunks */
|
|
20
|
+
keywords: string[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Result of clustering operation
|
|
24
|
+
*/
|
|
25
|
+
export interface ClusteringResult {
|
|
26
|
+
/** Total number of clusters created */
|
|
27
|
+
clusterCount: number;
|
|
28
|
+
/** All discovered concept clusters */
|
|
29
|
+
clusters: ConceptCluster[];
|
|
30
|
+
/** Mapping from chunk ID to cluster ID */
|
|
31
|
+
assignments: Map<string, number>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Options for clustering operation
|
|
35
|
+
*/
|
|
36
|
+
export interface ClusteringOptions {
|
|
37
|
+
/** Target number of clusters (default: auto-determined based on chunk count) */
|
|
38
|
+
numClusters?: number;
|
|
39
|
+
/** Maximum iterations for k-means (default: 100) */
|
|
40
|
+
maxIterations?: number;
|
|
41
|
+
/** Convergence threshold (default: 0.001) */
|
|
42
|
+
convergenceThreshold?: number;
|
|
43
|
+
/** Number of representative chunks to store per cluster (default: 3) */
|
|
44
|
+
numRepresentatives?: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Chunk data needed for clustering
|
|
48
|
+
*/
|
|
49
|
+
export interface ChunkForClustering {
|
|
50
|
+
id: string;
|
|
51
|
+
content: string;
|
|
52
|
+
filepath: string;
|
|
53
|
+
embedding: number[];
|
|
54
|
+
symbolName?: string;
|
|
55
|
+
symbolType?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Calculate cosine similarity between two vectors
|
|
59
|
+
*/
|
|
60
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
61
|
+
/**
|
|
62
|
+
* Calculate Euclidean distance between two vectors
|
|
63
|
+
*/
|
|
64
|
+
export declare function euclideanDistance(a: number[], b: number[]): number;
|
|
65
|
+
/**
|
|
66
|
+
* Perform k-means clustering on embeddings
|
|
67
|
+
*/
|
|
68
|
+
export declare function kMeansClustering(chunks: ChunkForClustering[], options?: ClusteringOptions): ClusteringResult;
|
|
69
|
+
/**
|
|
70
|
+
* Find the cluster ID for a given embedding (nearest centroid)
|
|
71
|
+
*/
|
|
72
|
+
export declare function assignToCluster(embedding: number[], clusters: ConceptCluster[]): number;
|
|
73
|
+
/**
|
|
74
|
+
* Calculate silhouette score for clustering quality assessment
|
|
75
|
+
*/
|
|
76
|
+
export declare function calculateSilhouetteScore(chunks: ChunkForClustering[], assignments: Map<string, number>, clusters: ConceptCluster[]): number;
|
|
77
|
+
//# sourceMappingURL=clustering.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clustering.d.ts","sourceRoot":"","sources":["../../src/search/clustering.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,uCAAuC;IACvC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,0CAA0C;IAC1C,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6CAA6C;IAC7C,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wEAAwE;IACxE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAuBjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAYlE;AAwED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,kBAAkB,EAAE,EAC5B,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CAqLlB;AA4JD;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAavF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,kBAAkB,EAAE,EAC5B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,QAAQ,EAAE,cAAc,EAAE,GACzB,MAAM,CA6DR"}
|
|
@@ -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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"}
|