cursor-recursive-rag 0.2.0-alpha.2 → 0.2.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/README.md +179 -203
- package/dist/adapters/llm/anthropic.d.ts +27 -0
- package/dist/adapters/llm/anthropic.d.ts.map +1 -0
- package/dist/adapters/llm/anthropic.js +287 -0
- package/dist/adapters/llm/anthropic.js.map +1 -0
- package/dist/adapters/llm/base.d.ts +62 -0
- package/dist/adapters/llm/base.d.ts.map +1 -0
- package/dist/adapters/llm/base.js +140 -0
- package/dist/adapters/llm/base.js.map +1 -0
- package/dist/adapters/llm/deepseek.d.ts +24 -0
- package/dist/adapters/llm/deepseek.d.ts.map +1 -0
- package/dist/adapters/llm/deepseek.js +228 -0
- package/dist/adapters/llm/deepseek.js.map +1 -0
- package/dist/adapters/llm/groq.d.ts +25 -0
- package/dist/adapters/llm/groq.d.ts.map +1 -0
- package/dist/adapters/llm/groq.js +265 -0
- package/dist/adapters/llm/groq.js.map +1 -0
- package/dist/adapters/llm/index.d.ts +62 -0
- package/dist/adapters/llm/index.d.ts.map +1 -0
- package/dist/adapters/llm/index.js +380 -0
- package/dist/adapters/llm/index.js.map +1 -0
- package/dist/adapters/llm/ollama.d.ts +23 -0
- package/dist/adapters/llm/ollama.d.ts.map +1 -0
- package/dist/adapters/llm/ollama.js +261 -0
- package/dist/adapters/llm/ollama.js.map +1 -0
- package/dist/adapters/llm/openai.d.ts +22 -0
- package/dist/adapters/llm/openai.d.ts.map +1 -0
- package/dist/adapters/llm/openai.js +232 -0
- package/dist/adapters/llm/openai.js.map +1 -0
- package/dist/adapters/llm/openrouter.d.ts +27 -0
- package/dist/adapters/llm/openrouter.d.ts.map +1 -0
- package/dist/adapters/llm/openrouter.js +305 -0
- package/dist/adapters/llm/openrouter.js.map +1 -0
- package/dist/adapters/vector/index.d.ts.map +1 -1
- package/dist/adapters/vector/index.js +8 -0
- package/dist/adapters/vector/index.js.map +1 -1
- package/dist/adapters/vector/redis-native.d.ts +35 -0
- package/dist/adapters/vector/redis-native.d.ts.map +1 -0
- package/dist/adapters/vector/redis-native.js +170 -0
- package/dist/adapters/vector/redis-native.js.map +1 -0
- package/dist/cli/commands/chat.d.ts +4 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +374 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/maintenance.d.ts +4 -0
- package/dist/cli/commands/maintenance.d.ts.map +1 -0
- package/dist/cli/commands/maintenance.js +237 -0
- package/dist/cli/commands/maintenance.js.map +1 -0
- package/dist/cli/commands/rules.d.ts +9 -0
- package/dist/cli/commands/rules.d.ts.map +1 -0
- package/dist/cli/commands/rules.js +639 -0
- package/dist/cli/commands/rules.js.map +1 -0
- package/dist/cli/commands/setup.js +5 -4
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/index.js +6 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/memoryConfig.d.ts +427 -0
- package/dist/config/memoryConfig.d.ts.map +1 -0
- package/dist/config/memoryConfig.js +258 -0
- package/dist/config/memoryConfig.js.map +1 -0
- package/dist/config/rulesConfig.d.ts +486 -0
- package/dist/config/rulesConfig.d.ts.map +1 -0
- package/dist/config/rulesConfig.js +345 -0
- package/dist/config/rulesConfig.js.map +1 -0
- package/dist/dashboard/coreTools.d.ts +14 -0
- package/dist/dashboard/coreTools.d.ts.map +1 -0
- package/dist/dashboard/coreTools.js +413 -0
- package/dist/dashboard/coreTools.js.map +1 -0
- package/dist/dashboard/public/index.html +1982 -13
- package/dist/dashboard/server.d.ts +1 -8
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +846 -13
- package/dist/dashboard/server.js.map +1 -1
- package/dist/dashboard/toolRegistry.d.ts +192 -0
- package/dist/dashboard/toolRegistry.d.ts.map +1 -0
- package/dist/dashboard/toolRegistry.js +322 -0
- package/dist/dashboard/toolRegistry.js.map +1 -0
- package/dist/proxy/index.d.ts +1 -1
- package/dist/proxy/index.d.ts.map +1 -1
- package/dist/proxy/index.js +9 -6
- package/dist/proxy/index.js.map +1 -1
- package/dist/server/index.js +21 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/tools/crawl.d.ts.map +1 -1
- package/dist/server/tools/crawl.js +8 -0
- package/dist/server/tools/crawl.js.map +1 -1
- package/dist/server/tools/index.d.ts.map +1 -1
- package/dist/server/tools/index.js +19 -1
- package/dist/server/tools/index.js.map +1 -1
- package/dist/server/tools/ingest.d.ts.map +1 -1
- package/dist/server/tools/ingest.js +5 -0
- package/dist/server/tools/ingest.js.map +1 -1
- package/dist/server/tools/memory.d.ts +250 -0
- package/dist/server/tools/memory.d.ts.map +1 -0
- package/dist/server/tools/memory.js +472 -0
- package/dist/server/tools/memory.js.map +1 -0
- package/dist/server/tools/recursive-query.d.ts.map +1 -1
- package/dist/server/tools/recursive-query.js +6 -0
- package/dist/server/tools/recursive-query.js.map +1 -1
- package/dist/server/tools/search.d.ts.map +1 -1
- package/dist/server/tools/search.js +6 -0
- package/dist/server/tools/search.js.map +1 -1
- package/dist/services/activity-log.d.ts +10 -0
- package/dist/services/activity-log.d.ts.map +1 -0
- package/dist/services/activity-log.js +53 -0
- package/dist/services/activity-log.js.map +1 -0
- package/dist/services/categoryManager.d.ts +110 -0
- package/dist/services/categoryManager.d.ts.map +1 -0
- package/dist/services/categoryManager.js +549 -0
- package/dist/services/categoryManager.js.map +1 -0
- package/dist/services/contextEnvironment.d.ts +206 -0
- package/dist/services/contextEnvironment.d.ts.map +1 -0
- package/dist/services/contextEnvironment.js +481 -0
- package/dist/services/contextEnvironment.js.map +1 -0
- package/dist/services/conversationProcessor.d.ts +99 -0
- package/dist/services/conversationProcessor.d.ts.map +1 -0
- package/dist/services/conversationProcessor.js +311 -0
- package/dist/services/conversationProcessor.js.map +1 -0
- package/dist/services/cursorChatReader.d.ts +129 -0
- package/dist/services/cursorChatReader.d.ts.map +1 -0
- package/dist/services/cursorChatReader.js +419 -0
- package/dist/services/cursorChatReader.js.map +1 -0
- package/dist/services/decayCalculator.d.ts +85 -0
- package/dist/services/decayCalculator.d.ts.map +1 -0
- package/dist/services/decayCalculator.js +182 -0
- package/dist/services/decayCalculator.js.map +1 -0
- package/dist/services/enhancedVectorStore.d.ts +102 -0
- package/dist/services/enhancedVectorStore.d.ts.map +1 -0
- package/dist/services/enhancedVectorStore.js +245 -0
- package/dist/services/enhancedVectorStore.js.map +1 -0
- package/dist/services/hybridScorer.d.ts +120 -0
- package/dist/services/hybridScorer.d.ts.map +1 -0
- package/dist/services/hybridScorer.js +334 -0
- package/dist/services/hybridScorer.js.map +1 -0
- package/dist/services/knowledgeExtractor.d.ts +45 -0
- package/dist/services/knowledgeExtractor.d.ts.map +1 -0
- package/dist/services/knowledgeExtractor.js +436 -0
- package/dist/services/knowledgeExtractor.js.map +1 -0
- package/dist/services/knowledgeStorage.d.ts +102 -0
- package/dist/services/knowledgeStorage.d.ts.map +1 -0
- package/dist/services/knowledgeStorage.js +383 -0
- package/dist/services/knowledgeStorage.js.map +1 -0
- package/dist/services/maintenanceScheduler.d.ts +89 -0
- package/dist/services/maintenanceScheduler.d.ts.map +1 -0
- package/dist/services/maintenanceScheduler.js +479 -0
- package/dist/services/maintenanceScheduler.js.map +1 -0
- package/dist/services/memoryMetadataStore.d.ts +62 -0
- package/dist/services/memoryMetadataStore.d.ts.map +1 -0
- package/dist/services/memoryMetadataStore.js +570 -0
- package/dist/services/memoryMetadataStore.js.map +1 -0
- package/dist/services/recursiveRetrieval.d.ts +122 -0
- package/dist/services/recursiveRetrieval.d.ts.map +1 -0
- package/dist/services/recursiveRetrieval.js +443 -0
- package/dist/services/recursiveRetrieval.js.map +1 -0
- package/dist/services/relationshipGraph.d.ts +77 -0
- package/dist/services/relationshipGraph.d.ts.map +1 -0
- package/dist/services/relationshipGraph.js +411 -0
- package/dist/services/relationshipGraph.js.map +1 -0
- package/dist/services/rlmSafeguards.d.ts +273 -0
- package/dist/services/rlmSafeguards.d.ts.map +1 -0
- package/dist/services/rlmSafeguards.js +705 -0
- package/dist/services/rlmSafeguards.js.map +1 -0
- package/dist/services/rulesAnalyzer.d.ts +119 -0
- package/dist/services/rulesAnalyzer.d.ts.map +1 -0
- package/dist/services/rulesAnalyzer.js +768 -0
- package/dist/services/rulesAnalyzer.js.map +1 -0
- package/dist/services/rulesMerger.d.ts +75 -0
- package/dist/services/rulesMerger.d.ts.map +1 -0
- package/dist/services/rulesMerger.js +404 -0
- package/dist/services/rulesMerger.js.map +1 -0
- package/dist/services/rulesParser.d.ts +127 -0
- package/dist/services/rulesParser.d.ts.map +1 -0
- package/dist/services/rulesParser.js +594 -0
- package/dist/services/rulesParser.js.map +1 -0
- package/dist/services/smartChunker.d.ts +110 -0
- package/dist/services/smartChunker.d.ts.map +1 -0
- package/dist/services/smartChunker.js +520 -0
- package/dist/services/smartChunker.js.map +1 -0
- package/dist/types/categories.d.ts +105 -0
- package/dist/types/categories.d.ts.map +1 -0
- package/dist/types/categories.js +108 -0
- package/dist/types/categories.js.map +1 -0
- package/dist/types/extractedKnowledge.d.ts +233 -0
- package/dist/types/extractedKnowledge.d.ts.map +1 -0
- package/dist/types/extractedKnowledge.js +56 -0
- package/dist/types/extractedKnowledge.js.map +1 -0
- package/dist/types/index.d.ts +9 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +12 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/llmProvider.d.ts +282 -0
- package/dist/types/llmProvider.d.ts.map +1 -0
- package/dist/types/llmProvider.js +48 -0
- package/dist/types/llmProvider.js.map +1 -0
- package/dist/types/memory.d.ts +227 -0
- package/dist/types/memory.d.ts.map +1 -0
- package/dist/types/memory.js +76 -0
- package/dist/types/memory.js.map +1 -0
- package/dist/types/relationships.d.ts +167 -0
- package/dist/types/relationships.d.ts.map +1 -0
- package/dist/types/relationships.js +106 -0
- package/dist/types/relationships.js.map +1 -0
- package/dist/types/rulesOptimizer.d.ts +345 -0
- package/dist/types/rulesOptimizer.d.ts.map +1 -0
- package/dist/types/rulesOptimizer.js +22 -0
- package/dist/types/rulesOptimizer.js.map +1 -0
- package/docs/cursor-recursive-rag-memory-spec.md +4569 -0
- package/docs/cursor-recursive-rag-tasks.md +1355 -0
- package/package.json +6 -3
- package/restart-rag.sh +16 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Chunking Strategies
|
|
3
|
+
*
|
|
4
|
+
* Based on RLM paper observations about how models chunk context:
|
|
5
|
+
* - Uniform chunking by size/count
|
|
6
|
+
* - Semantic chunking by topic similarity
|
|
7
|
+
* - Keyword-based chunking with pattern matching
|
|
8
|
+
* - Structural chunking by source file/section
|
|
9
|
+
* - Adaptive chunking that chooses strategy based on content/query
|
|
10
|
+
*/
|
|
11
|
+
import type { EnhancedChunk } from '../types/memory.js';
|
|
12
|
+
export type ChunkingStrategy = 'uniform' | 'semantic' | 'keyword' | 'structural' | 'adaptive';
|
|
13
|
+
export interface ChunkingResult {
|
|
14
|
+
strategy: ChunkingStrategy;
|
|
15
|
+
groups: Map<string, EnhancedChunk[]>;
|
|
16
|
+
metadata?: {
|
|
17
|
+
totalChunks: number;
|
|
18
|
+
groupCount: number;
|
|
19
|
+
avgGroupSize: number;
|
|
20
|
+
processingTimeMs?: number;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface ChunkingOptions {
|
|
24
|
+
batchSize?: number;
|
|
25
|
+
targetGroups?: number;
|
|
26
|
+
keywords?: string[];
|
|
27
|
+
overlap?: number;
|
|
28
|
+
minGroupSize?: number;
|
|
29
|
+
maxGroupSize?: number;
|
|
30
|
+
}
|
|
31
|
+
export declare const DEFAULT_CHUNKING_OPTIONS: ChunkingOptions;
|
|
32
|
+
/**
|
|
33
|
+
* Smart Chunker for RLM-style context processing
|
|
34
|
+
*/
|
|
35
|
+
export declare class SmartChunker {
|
|
36
|
+
private options;
|
|
37
|
+
constructor(options?: Partial<ChunkingOptions>);
|
|
38
|
+
/**
|
|
39
|
+
* Uniform chunking - split by count
|
|
40
|
+
* Simple strategy that divides items into equal-sized batches
|
|
41
|
+
*/
|
|
42
|
+
uniformChunk<T>(items: T[], batchSize?: number): T[][];
|
|
43
|
+
/**
|
|
44
|
+
* Uniform chunk with result as ChunkingResult
|
|
45
|
+
*/
|
|
46
|
+
uniformChunkEnhanced(chunks: EnhancedChunk[], batchSize?: number): ChunkingResult;
|
|
47
|
+
/**
|
|
48
|
+
* Character-based chunking with overlap
|
|
49
|
+
* Useful for splitting large text content
|
|
50
|
+
*/
|
|
51
|
+
charChunk(text: string, chunkSize: number, overlap?: number): string[];
|
|
52
|
+
/**
|
|
53
|
+
* Semantic chunking - group by topic similarity using embeddings
|
|
54
|
+
* RLM pattern: models benefit from semantically coherent chunks
|
|
55
|
+
*/
|
|
56
|
+
semanticChunk(chunks: EnhancedChunk[], targetGroups?: number): ChunkingResult;
|
|
57
|
+
/**
|
|
58
|
+
* Keyword-based chunking - group by shared keywords/patterns
|
|
59
|
+
* RLM pattern: filter by regex, then process matching chunks together
|
|
60
|
+
*/
|
|
61
|
+
keywordChunk(chunks: EnhancedChunk[], keywords?: string[]): ChunkingResult;
|
|
62
|
+
/**
|
|
63
|
+
* Structural chunking - group by source file or section
|
|
64
|
+
* Useful when context comes from multiple files/documents
|
|
65
|
+
*/
|
|
66
|
+
structuralChunk(chunks: EnhancedChunk[]): ChunkingResult;
|
|
67
|
+
/**
|
|
68
|
+
* Type-based chunking - group by chunk type
|
|
69
|
+
* Useful for separating solutions, patterns, documentation, etc.
|
|
70
|
+
*/
|
|
71
|
+
typeChunk(chunks: EnhancedChunk[]): ChunkingResult;
|
|
72
|
+
/**
|
|
73
|
+
* Importance-based chunking - group by importance levels
|
|
74
|
+
* High importance chunks processed first
|
|
75
|
+
*/
|
|
76
|
+
importanceChunk(chunks: EnhancedChunk[], thresholds?: number[]): ChunkingResult;
|
|
77
|
+
/**
|
|
78
|
+
* Adaptive chunking - choose strategy based on content and query
|
|
79
|
+
* Analyzes the chunks and query to select the best chunking approach
|
|
80
|
+
*/
|
|
81
|
+
adaptiveChunk(chunks: EnhancedChunk[], query: string): ChunkingResult;
|
|
82
|
+
/**
|
|
83
|
+
* Get recommended strategy based on content analysis
|
|
84
|
+
*/
|
|
85
|
+
recommendStrategy(chunks: EnhancedChunk[], query?: string): ChunkingStrategy;
|
|
86
|
+
/**
|
|
87
|
+
* K-means clustering implementation for semantic chunking
|
|
88
|
+
*/
|
|
89
|
+
private kMeansClustering;
|
|
90
|
+
/**
|
|
91
|
+
* Calculate Euclidean distance between two vectors
|
|
92
|
+
*/
|
|
93
|
+
private euclideanDistance;
|
|
94
|
+
/**
|
|
95
|
+
* Normalize source path for grouping
|
|
96
|
+
*/
|
|
97
|
+
private normalizeSource;
|
|
98
|
+
/**
|
|
99
|
+
* Update options
|
|
100
|
+
*/
|
|
101
|
+
updateOptions(options: Partial<ChunkingOptions>): void;
|
|
102
|
+
/**
|
|
103
|
+
* Get current options
|
|
104
|
+
*/
|
|
105
|
+
getOptions(): ChunkingOptions;
|
|
106
|
+
}
|
|
107
|
+
export declare function createSmartChunker(options?: Partial<ChunkingOptions>): SmartChunker;
|
|
108
|
+
export declare function getSmartChunker(options?: Partial<ChunkingOptions>): SmartChunker;
|
|
109
|
+
export declare function resetSmartChunker(): void;
|
|
110
|
+
//# sourceMappingURL=smartChunker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smartChunker.d.ts","sourceRoot":"","sources":["../../src/services/smartChunker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,CAAC;AAE9F,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IACrC,QAAQ,CAAC,EAAE;QACT,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,wBAAwB,EAAE,eAMtC,CAAC;AAEF;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAkB;gBAErB,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAO9C;;;OAGG;IACH,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE;IAWtD;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc;IAqBjF;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAmBtE;;;OAGG;IACH,aAAa,CACX,MAAM,EAAE,aAAa,EAAE,EACvB,YAAY,CAAC,EAAE,MAAM,GACpB,cAAc;IAmDjB;;;OAGG;IACH,YAAY,CACV,MAAM,EAAE,aAAa,EAAE,EACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,cAAc;IAsDjB;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,cAAc;IAyBxD;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,cAAc;IAyBlD;;;OAGG;IACH,eAAe,CACb,MAAM,EAAE,aAAa,EAAE,EACvB,UAAU,GAAE,MAAM,EAAe,GAChC,cAAc;IA0CjB;;;OAGG;IACH,aAAa,CACX,MAAM,EAAE,aAAa,EAAE,EACvB,KAAK,EAAE,MAAM,GACZ,cAAc;IA8EjB;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB;IAmB5E;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoHxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAavB;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IAOtD;;OAEG;IACH,UAAU,IAAI,eAAe;CAG9B;AAID,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,YAAY,CAEnF;AAED,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,YAAY,CAKhF;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Chunking Strategies
|
|
3
|
+
*
|
|
4
|
+
* Based on RLM paper observations about how models chunk context:
|
|
5
|
+
* - Uniform chunking by size/count
|
|
6
|
+
* - Semantic chunking by topic similarity
|
|
7
|
+
* - Keyword-based chunking with pattern matching
|
|
8
|
+
* - Structural chunking by source file/section
|
|
9
|
+
* - Adaptive chunking that chooses strategy based on content/query
|
|
10
|
+
*/
|
|
11
|
+
import { ChunkType } from '../types/memory.js';
|
|
12
|
+
export const DEFAULT_CHUNKING_OPTIONS = {
|
|
13
|
+
batchSize: 10,
|
|
14
|
+
targetGroups: 5,
|
|
15
|
+
overlap: 100,
|
|
16
|
+
minGroupSize: 1,
|
|
17
|
+
maxGroupSize: 50,
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Smart Chunker for RLM-style context processing
|
|
21
|
+
*/
|
|
22
|
+
export class SmartChunker {
|
|
23
|
+
options;
|
|
24
|
+
constructor(options) {
|
|
25
|
+
this.options = {
|
|
26
|
+
...DEFAULT_CHUNKING_OPTIONS,
|
|
27
|
+
...options,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Uniform chunking - split by count
|
|
32
|
+
* Simple strategy that divides items into equal-sized batches
|
|
33
|
+
*/
|
|
34
|
+
uniformChunk(items, batchSize) {
|
|
35
|
+
const size = batchSize ?? this.options.batchSize ?? 10;
|
|
36
|
+
const batches = [];
|
|
37
|
+
for (let i = 0; i < items.length; i += size) {
|
|
38
|
+
batches.push(items.slice(i, i + size));
|
|
39
|
+
}
|
|
40
|
+
return batches;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Uniform chunk with result as ChunkingResult
|
|
44
|
+
*/
|
|
45
|
+
uniformChunkEnhanced(chunks, batchSize) {
|
|
46
|
+
const startTime = Date.now();
|
|
47
|
+
const batches = this.uniformChunk(chunks, batchSize);
|
|
48
|
+
const groups = new Map();
|
|
49
|
+
batches.forEach((batch, i) => {
|
|
50
|
+
groups.set(`batch_${i}`, batch);
|
|
51
|
+
});
|
|
52
|
+
return {
|
|
53
|
+
strategy: 'uniform',
|
|
54
|
+
groups,
|
|
55
|
+
metadata: {
|
|
56
|
+
totalChunks: chunks.length,
|
|
57
|
+
groupCount: groups.size,
|
|
58
|
+
avgGroupSize: chunks.length / groups.size,
|
|
59
|
+
processingTimeMs: Date.now() - startTime,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Character-based chunking with overlap
|
|
65
|
+
* Useful for splitting large text content
|
|
66
|
+
*/
|
|
67
|
+
charChunk(text, chunkSize, overlap) {
|
|
68
|
+
const overlapSize = overlap ?? this.options.overlap ?? 100;
|
|
69
|
+
const chunks = [];
|
|
70
|
+
let start = 0;
|
|
71
|
+
while (start < text.length) {
|
|
72
|
+
const end = Math.min(start + chunkSize, text.length);
|
|
73
|
+
chunks.push(text.substring(start, end));
|
|
74
|
+
if (end >= text.length)
|
|
75
|
+
break;
|
|
76
|
+
start = end - overlapSize;
|
|
77
|
+
if (start < 0)
|
|
78
|
+
start = 0;
|
|
79
|
+
if (start >= end)
|
|
80
|
+
break; // Prevent infinite loop
|
|
81
|
+
}
|
|
82
|
+
return chunks;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Semantic chunking - group by topic similarity using embeddings
|
|
86
|
+
* RLM pattern: models benefit from semantically coherent chunks
|
|
87
|
+
*/
|
|
88
|
+
semanticChunk(chunks, targetGroups) {
|
|
89
|
+
const startTime = Date.now();
|
|
90
|
+
const k = targetGroups ?? this.options.targetGroups ?? 5;
|
|
91
|
+
if (chunks.length === 0) {
|
|
92
|
+
return {
|
|
93
|
+
strategy: 'semantic',
|
|
94
|
+
groups: new Map(),
|
|
95
|
+
metadata: {
|
|
96
|
+
totalChunks: 0,
|
|
97
|
+
groupCount: 0,
|
|
98
|
+
avgGroupSize: 0,
|
|
99
|
+
processingTimeMs: Date.now() - startTime,
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// Check if chunks have embeddings
|
|
104
|
+
const hasEmbeddings = chunks.some(c => c.embedding && c.embedding.length > 0);
|
|
105
|
+
if (!hasEmbeddings) {
|
|
106
|
+
// Fall back to uniform chunking if no embeddings
|
|
107
|
+
return this.uniformChunkEnhanced(chunks, Math.ceil(chunks.length / k));
|
|
108
|
+
}
|
|
109
|
+
// Use k-means clustering on embeddings
|
|
110
|
+
const embeddings = chunks.map(c => c.embedding);
|
|
111
|
+
const clusterAssignments = this.kMeansClustering(embeddings, Math.min(k, chunks.length));
|
|
112
|
+
// Group chunks by cluster
|
|
113
|
+
const groups = new Map();
|
|
114
|
+
clusterAssignments.forEach((clusterIdx, chunkIdx) => {
|
|
115
|
+
const key = `topic_${clusterIdx}`;
|
|
116
|
+
if (!groups.has(key)) {
|
|
117
|
+
groups.set(key, []);
|
|
118
|
+
}
|
|
119
|
+
groups.get(key).push(chunks[chunkIdx]);
|
|
120
|
+
});
|
|
121
|
+
return {
|
|
122
|
+
strategy: 'semantic',
|
|
123
|
+
groups,
|
|
124
|
+
metadata: {
|
|
125
|
+
totalChunks: chunks.length,
|
|
126
|
+
groupCount: groups.size,
|
|
127
|
+
avgGroupSize: chunks.length / groups.size,
|
|
128
|
+
processingTimeMs: Date.now() - startTime,
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Keyword-based chunking - group by shared keywords/patterns
|
|
134
|
+
* RLM pattern: filter by regex, then process matching chunks together
|
|
135
|
+
*/
|
|
136
|
+
keywordChunk(chunks, keywords) {
|
|
137
|
+
const startTime = Date.now();
|
|
138
|
+
const patterns = keywords ?? this.options.keywords ?? [];
|
|
139
|
+
if (patterns.length === 0) {
|
|
140
|
+
// No keywords provided, return all as single group
|
|
141
|
+
return {
|
|
142
|
+
strategy: 'keyword',
|
|
143
|
+
groups: new Map([['all', chunks]]),
|
|
144
|
+
metadata: {
|
|
145
|
+
totalChunks: chunks.length,
|
|
146
|
+
groupCount: 1,
|
|
147
|
+
avgGroupSize: chunks.length,
|
|
148
|
+
processingTimeMs: Date.now() - startTime,
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
const groups = new Map();
|
|
153
|
+
const matched = new Set();
|
|
154
|
+
for (const keyword of patterns) {
|
|
155
|
+
try {
|
|
156
|
+
const pattern = new RegExp(keyword, 'i');
|
|
157
|
+
const matching = chunks.filter(c => pattern.test(c.content));
|
|
158
|
+
if (matching.length > 0) {
|
|
159
|
+
groups.set(keyword, matching);
|
|
160
|
+
matching.forEach(c => matched.add(c.id));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Invalid regex, skip
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Add unmatched chunks to 'other' group
|
|
169
|
+
const unmatched = chunks.filter(c => !matched.has(c.id));
|
|
170
|
+
if (unmatched.length > 0) {
|
|
171
|
+
groups.set('_other', unmatched);
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
strategy: 'keyword',
|
|
175
|
+
groups,
|
|
176
|
+
metadata: {
|
|
177
|
+
totalChunks: chunks.length,
|
|
178
|
+
groupCount: groups.size,
|
|
179
|
+
avgGroupSize: chunks.length / Math.max(1, groups.size),
|
|
180
|
+
processingTimeMs: Date.now() - startTime,
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Structural chunking - group by source file or section
|
|
186
|
+
* Useful when context comes from multiple files/documents
|
|
187
|
+
*/
|
|
188
|
+
structuralChunk(chunks) {
|
|
189
|
+
const startTime = Date.now();
|
|
190
|
+
const groups = new Map();
|
|
191
|
+
for (const chunk of chunks) {
|
|
192
|
+
const source = this.normalizeSource(chunk.source || '_unknown');
|
|
193
|
+
if (!groups.has(source)) {
|
|
194
|
+
groups.set(source, []);
|
|
195
|
+
}
|
|
196
|
+
groups.get(source).push(chunk);
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
strategy: 'structural',
|
|
200
|
+
groups,
|
|
201
|
+
metadata: {
|
|
202
|
+
totalChunks: chunks.length,
|
|
203
|
+
groupCount: groups.size,
|
|
204
|
+
avgGroupSize: chunks.length / Math.max(1, groups.size),
|
|
205
|
+
processingTimeMs: Date.now() - startTime,
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Type-based chunking - group by chunk type
|
|
211
|
+
* Useful for separating solutions, patterns, documentation, etc.
|
|
212
|
+
*/
|
|
213
|
+
typeChunk(chunks) {
|
|
214
|
+
const startTime = Date.now();
|
|
215
|
+
const groups = new Map();
|
|
216
|
+
for (const chunk of chunks) {
|
|
217
|
+
const type = chunk.chunkType || 'unknown';
|
|
218
|
+
if (!groups.has(type)) {
|
|
219
|
+
groups.set(type, []);
|
|
220
|
+
}
|
|
221
|
+
groups.get(type).push(chunk);
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
strategy: 'structural',
|
|
225
|
+
groups,
|
|
226
|
+
metadata: {
|
|
227
|
+
totalChunks: chunks.length,
|
|
228
|
+
groupCount: groups.size,
|
|
229
|
+
avgGroupSize: chunks.length / Math.max(1, groups.size),
|
|
230
|
+
processingTimeMs: Date.now() - startTime,
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Importance-based chunking - group by importance levels
|
|
236
|
+
* High importance chunks processed first
|
|
237
|
+
*/
|
|
238
|
+
importanceChunk(chunks, thresholds = [0.7, 0.4]) {
|
|
239
|
+
const startTime = Date.now();
|
|
240
|
+
const groups = new Map();
|
|
241
|
+
// Sort thresholds descending
|
|
242
|
+
const sortedThresholds = [...thresholds].sort((a, b) => b - a);
|
|
243
|
+
for (const chunk of chunks) {
|
|
244
|
+
let assigned = false;
|
|
245
|
+
for (let i = 0; i < sortedThresholds.length; i++) {
|
|
246
|
+
if (chunk.importance >= sortedThresholds[i]) {
|
|
247
|
+
const key = i === 0 ? 'high' : i === 1 ? 'medium' : `level_${i}`;
|
|
248
|
+
if (!groups.has(key)) {
|
|
249
|
+
groups.set(key, []);
|
|
250
|
+
}
|
|
251
|
+
groups.get(key).push(chunk);
|
|
252
|
+
assigned = true;
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (!assigned) {
|
|
257
|
+
if (!groups.has('low')) {
|
|
258
|
+
groups.set('low', []);
|
|
259
|
+
}
|
|
260
|
+
groups.get('low').push(chunk);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return {
|
|
264
|
+
strategy: 'structural',
|
|
265
|
+
groups,
|
|
266
|
+
metadata: {
|
|
267
|
+
totalChunks: chunks.length,
|
|
268
|
+
groupCount: groups.size,
|
|
269
|
+
avgGroupSize: chunks.length / Math.max(1, groups.size),
|
|
270
|
+
processingTimeMs: Date.now() - startTime,
|
|
271
|
+
},
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Adaptive chunking - choose strategy based on content and query
|
|
276
|
+
* Analyzes the chunks and query to select the best chunking approach
|
|
277
|
+
*/
|
|
278
|
+
adaptiveChunk(chunks, query) {
|
|
279
|
+
const startTime = Date.now();
|
|
280
|
+
if (chunks.length === 0) {
|
|
281
|
+
return {
|
|
282
|
+
strategy: 'adaptive',
|
|
283
|
+
groups: new Map(),
|
|
284
|
+
metadata: {
|
|
285
|
+
totalChunks: 0,
|
|
286
|
+
groupCount: 0,
|
|
287
|
+
avgGroupSize: 0,
|
|
288
|
+
processingTimeMs: Date.now() - startTime,
|
|
289
|
+
},
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
// Analyze content characteristics
|
|
293
|
+
const hasCodeContent = chunks.some(c => c.chunkType === ChunkType.CODE || /```[\s\S]*```/.test(c.content));
|
|
294
|
+
const uniqueSources = new Set(chunks.map(c => this.normalizeSource(c.source)));
|
|
295
|
+
const hasMultipleSources = uniqueSources.size > 1;
|
|
296
|
+
const uniqueTypes = new Set(chunks.map(c => c.chunkType));
|
|
297
|
+
const hasMultipleTypes = uniqueTypes.size > 1;
|
|
298
|
+
const hasEmbeddings = chunks.some(c => c.embedding && c.embedding.length > 0);
|
|
299
|
+
// Analyze query patterns
|
|
300
|
+
const queryLower = query.toLowerCase();
|
|
301
|
+
const needsAggregation = /how many|count|list|all|every|total|compare/i.test(queryLower);
|
|
302
|
+
const needsSpecific = /error|fix|bug|issue|problem/i.test(queryLower);
|
|
303
|
+
const needsPattern = /pattern|example|how to|best practice/i.test(queryLower);
|
|
304
|
+
const needsCode = /code|implement|function|class|method/i.test(queryLower);
|
|
305
|
+
// Choose strategy based on analysis
|
|
306
|
+
let result;
|
|
307
|
+
if (hasCodeContent && hasMultipleSources && needsCode) {
|
|
308
|
+
// Code from multiple files - use structural chunking
|
|
309
|
+
result = this.structuralChunk(chunks);
|
|
310
|
+
result.strategy = 'adaptive';
|
|
311
|
+
}
|
|
312
|
+
else if (needsAggregation) {
|
|
313
|
+
// Aggregation query - uniform chunks for parallel processing
|
|
314
|
+
const batchSize = Math.max(5, Math.ceil(chunks.length / 10));
|
|
315
|
+
result = this.uniformChunkEnhanced(chunks, batchSize);
|
|
316
|
+
result.strategy = 'adaptive';
|
|
317
|
+
}
|
|
318
|
+
else if (needsSpecific && hasMultipleTypes) {
|
|
319
|
+
// Looking for specific solutions/patterns - group by type
|
|
320
|
+
result = this.typeChunk(chunks);
|
|
321
|
+
result.strategy = 'adaptive';
|
|
322
|
+
}
|
|
323
|
+
else if (needsPattern) {
|
|
324
|
+
// Looking for patterns - use keyword-based with pattern keywords
|
|
325
|
+
result = this.keywordChunk(chunks, ['pattern', 'example', 'best practice', 'recommended']);
|
|
326
|
+
result.strategy = 'adaptive';
|
|
327
|
+
}
|
|
328
|
+
else if (hasEmbeddings && chunks.length > 10) {
|
|
329
|
+
// Default to semantic chunking for large sets with embeddings
|
|
330
|
+
result = this.semanticChunk(chunks, this.options.targetGroups);
|
|
331
|
+
result.strategy = 'adaptive';
|
|
332
|
+
}
|
|
333
|
+
else if (hasMultipleSources) {
|
|
334
|
+
// Multiple sources without specific need - structural
|
|
335
|
+
result = this.structuralChunk(chunks);
|
|
336
|
+
result.strategy = 'adaptive';
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
// Default to uniform chunking
|
|
340
|
+
result = this.uniformChunkEnhanced(chunks);
|
|
341
|
+
result.strategy = 'adaptive';
|
|
342
|
+
}
|
|
343
|
+
// Update processing time
|
|
344
|
+
if (result.metadata) {
|
|
345
|
+
result.metadata.processingTimeMs = Date.now() - startTime;
|
|
346
|
+
}
|
|
347
|
+
return result;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Get recommended strategy based on content analysis
|
|
351
|
+
*/
|
|
352
|
+
recommendStrategy(chunks, query) {
|
|
353
|
+
if (chunks.length === 0)
|
|
354
|
+
return 'uniform';
|
|
355
|
+
const hasEmbeddings = chunks.some(c => c.embedding && c.embedding.length > 0);
|
|
356
|
+
const uniqueSources = new Set(chunks.map(c => this.normalizeSource(c.source)));
|
|
357
|
+
const hasMultipleSources = uniqueSources.size > 1;
|
|
358
|
+
if (query) {
|
|
359
|
+
const queryLower = query.toLowerCase();
|
|
360
|
+
if (/how many|count|list|all|every/.test(queryLower))
|
|
361
|
+
return 'uniform';
|
|
362
|
+
if (/error|fix|bug|specific/.test(queryLower))
|
|
363
|
+
return 'keyword';
|
|
364
|
+
}
|
|
365
|
+
if (hasMultipleSources)
|
|
366
|
+
return 'structural';
|
|
367
|
+
if (hasEmbeddings && chunks.length > 5)
|
|
368
|
+
return 'semantic';
|
|
369
|
+
return 'uniform';
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* K-means clustering implementation for semantic chunking
|
|
373
|
+
*/
|
|
374
|
+
kMeansClustering(embeddings, k, maxIterations = 50) {
|
|
375
|
+
if (embeddings.length === 0)
|
|
376
|
+
return [];
|
|
377
|
+
if (embeddings.length <= k) {
|
|
378
|
+
return embeddings.map((_, i) => i % k);
|
|
379
|
+
}
|
|
380
|
+
// Filter out empty embeddings
|
|
381
|
+
const validIndices = [];
|
|
382
|
+
const validEmbeddings = [];
|
|
383
|
+
embeddings.forEach((emb, i) => {
|
|
384
|
+
if (emb && emb.length > 0) {
|
|
385
|
+
validIndices.push(i);
|
|
386
|
+
validEmbeddings.push(emb);
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
if (validEmbeddings.length === 0) {
|
|
390
|
+
return embeddings.map((_, i) => i % k);
|
|
391
|
+
}
|
|
392
|
+
const dim = validEmbeddings[0].length;
|
|
393
|
+
const actualK = Math.min(k, validEmbeddings.length);
|
|
394
|
+
// Initialize centroids using k-means++ style selection
|
|
395
|
+
const centroids = [];
|
|
396
|
+
const usedIndices = new Set();
|
|
397
|
+
// First centroid is random
|
|
398
|
+
const firstIdx = Math.floor(Math.random() * validEmbeddings.length);
|
|
399
|
+
centroids.push([...validEmbeddings[firstIdx]]);
|
|
400
|
+
usedIndices.add(firstIdx);
|
|
401
|
+
// Select remaining centroids based on distance
|
|
402
|
+
while (centroids.length < actualK) {
|
|
403
|
+
let maxDist = -1;
|
|
404
|
+
let bestIdx = 0;
|
|
405
|
+
for (let i = 0; i < validEmbeddings.length; i++) {
|
|
406
|
+
if (usedIndices.has(i))
|
|
407
|
+
continue;
|
|
408
|
+
const minDistToCentroid = Math.min(...centroids.map(c => this.euclideanDistance(validEmbeddings[i], c)));
|
|
409
|
+
if (minDistToCentroid > maxDist) {
|
|
410
|
+
maxDist = minDistToCentroid;
|
|
411
|
+
bestIdx = i;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
centroids.push([...validEmbeddings[bestIdx]]);
|
|
415
|
+
usedIndices.add(bestIdx);
|
|
416
|
+
}
|
|
417
|
+
// Run k-means iterations
|
|
418
|
+
let assignments = new Array(validEmbeddings.length).fill(0);
|
|
419
|
+
for (let iter = 0; iter < maxIterations; iter++) {
|
|
420
|
+
// Assign points to nearest centroid
|
|
421
|
+
const newAssignments = validEmbeddings.map(emb => {
|
|
422
|
+
let minDist = Infinity;
|
|
423
|
+
let closest = 0;
|
|
424
|
+
for (let c = 0; c < centroids.length; c++) {
|
|
425
|
+
const dist = this.euclideanDistance(emb, centroids[c]);
|
|
426
|
+
if (dist < minDist) {
|
|
427
|
+
minDist = dist;
|
|
428
|
+
closest = c;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return closest;
|
|
432
|
+
});
|
|
433
|
+
// Check for convergence
|
|
434
|
+
const changed = newAssignments.some((a, i) => a !== assignments[i]);
|
|
435
|
+
assignments = newAssignments;
|
|
436
|
+
if (!changed)
|
|
437
|
+
break;
|
|
438
|
+
// Update centroids
|
|
439
|
+
for (let c = 0; c < centroids.length; c++) {
|
|
440
|
+
const members = validEmbeddings.filter((_, i) => assignments[i] === c);
|
|
441
|
+
if (members.length > 0) {
|
|
442
|
+
centroids[c] = new Array(dim).fill(0);
|
|
443
|
+
for (const member of members) {
|
|
444
|
+
for (let d = 0; d < dim; d++) {
|
|
445
|
+
centroids[c][d] += member[d] / members.length;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
// Map back to original indices
|
|
452
|
+
const result = new Array(embeddings.length).fill(0);
|
|
453
|
+
validIndices.forEach((origIdx, validIdx) => {
|
|
454
|
+
result[origIdx] = assignments[validIdx];
|
|
455
|
+
});
|
|
456
|
+
// Assign invalid embeddings to cluster 0
|
|
457
|
+
embeddings.forEach((emb, i) => {
|
|
458
|
+
if (!emb || emb.length === 0) {
|
|
459
|
+
result[i] = 0;
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
return result;
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Calculate Euclidean distance between two vectors
|
|
466
|
+
*/
|
|
467
|
+
euclideanDistance(a, b) {
|
|
468
|
+
if (a.length !== b.length)
|
|
469
|
+
return Infinity;
|
|
470
|
+
let sum = 0;
|
|
471
|
+
for (let i = 0; i < a.length; i++) {
|
|
472
|
+
const diff = a[i] - b[i];
|
|
473
|
+
sum += diff * diff;
|
|
474
|
+
}
|
|
475
|
+
return Math.sqrt(sum);
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Normalize source path for grouping
|
|
479
|
+
*/
|
|
480
|
+
normalizeSource(source) {
|
|
481
|
+
if (!source)
|
|
482
|
+
return '_unknown';
|
|
483
|
+
// Extract filename or last path component
|
|
484
|
+
const parts = source.split(/[\/\\]/);
|
|
485
|
+
const filename = parts[parts.length - 1] || source;
|
|
486
|
+
// Remove common prefixes
|
|
487
|
+
return filename
|
|
488
|
+
.replace(/^(cursor-chat:|extracted:|url:)/, '')
|
|
489
|
+
.replace(/\?.*$/, ''); // Remove query strings
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Update options
|
|
493
|
+
*/
|
|
494
|
+
updateOptions(options) {
|
|
495
|
+
this.options = {
|
|
496
|
+
...this.options,
|
|
497
|
+
...options,
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Get current options
|
|
502
|
+
*/
|
|
503
|
+
getOptions() {
|
|
504
|
+
return { ...this.options };
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
let instance = null;
|
|
508
|
+
export function createSmartChunker(options) {
|
|
509
|
+
return new SmartChunker(options);
|
|
510
|
+
}
|
|
511
|
+
export function getSmartChunker(options) {
|
|
512
|
+
if (!instance) {
|
|
513
|
+
instance = new SmartChunker(options);
|
|
514
|
+
}
|
|
515
|
+
return instance;
|
|
516
|
+
}
|
|
517
|
+
export function resetSmartChunker() {
|
|
518
|
+
instance = null;
|
|
519
|
+
}
|
|
520
|
+
//# sourceMappingURL=smartChunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smartChunker.js","sourceRoot":"","sources":["../../src/services/smartChunker.ts"],"names":[],"mappings":"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"}
|