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.
Files changed (210) hide show
  1. package/README.md +179 -203
  2. package/dist/adapters/llm/anthropic.d.ts +27 -0
  3. package/dist/adapters/llm/anthropic.d.ts.map +1 -0
  4. package/dist/adapters/llm/anthropic.js +287 -0
  5. package/dist/adapters/llm/anthropic.js.map +1 -0
  6. package/dist/adapters/llm/base.d.ts +62 -0
  7. package/dist/adapters/llm/base.d.ts.map +1 -0
  8. package/dist/adapters/llm/base.js +140 -0
  9. package/dist/adapters/llm/base.js.map +1 -0
  10. package/dist/adapters/llm/deepseek.d.ts +24 -0
  11. package/dist/adapters/llm/deepseek.d.ts.map +1 -0
  12. package/dist/adapters/llm/deepseek.js +228 -0
  13. package/dist/adapters/llm/deepseek.js.map +1 -0
  14. package/dist/adapters/llm/groq.d.ts +25 -0
  15. package/dist/adapters/llm/groq.d.ts.map +1 -0
  16. package/dist/adapters/llm/groq.js +265 -0
  17. package/dist/adapters/llm/groq.js.map +1 -0
  18. package/dist/adapters/llm/index.d.ts +62 -0
  19. package/dist/adapters/llm/index.d.ts.map +1 -0
  20. package/dist/adapters/llm/index.js +380 -0
  21. package/dist/adapters/llm/index.js.map +1 -0
  22. package/dist/adapters/llm/ollama.d.ts +23 -0
  23. package/dist/adapters/llm/ollama.d.ts.map +1 -0
  24. package/dist/adapters/llm/ollama.js +261 -0
  25. package/dist/adapters/llm/ollama.js.map +1 -0
  26. package/dist/adapters/llm/openai.d.ts +22 -0
  27. package/dist/adapters/llm/openai.d.ts.map +1 -0
  28. package/dist/adapters/llm/openai.js +232 -0
  29. package/dist/adapters/llm/openai.js.map +1 -0
  30. package/dist/adapters/llm/openrouter.d.ts +27 -0
  31. package/dist/adapters/llm/openrouter.d.ts.map +1 -0
  32. package/dist/adapters/llm/openrouter.js +305 -0
  33. package/dist/adapters/llm/openrouter.js.map +1 -0
  34. package/dist/adapters/vector/index.d.ts.map +1 -1
  35. package/dist/adapters/vector/index.js +8 -0
  36. package/dist/adapters/vector/index.js.map +1 -1
  37. package/dist/adapters/vector/redis-native.d.ts +35 -0
  38. package/dist/adapters/vector/redis-native.d.ts.map +1 -0
  39. package/dist/adapters/vector/redis-native.js +170 -0
  40. package/dist/adapters/vector/redis-native.js.map +1 -0
  41. package/dist/cli/commands/chat.d.ts +4 -0
  42. package/dist/cli/commands/chat.d.ts.map +1 -0
  43. package/dist/cli/commands/chat.js +374 -0
  44. package/dist/cli/commands/chat.js.map +1 -0
  45. package/dist/cli/commands/maintenance.d.ts +4 -0
  46. package/dist/cli/commands/maintenance.d.ts.map +1 -0
  47. package/dist/cli/commands/maintenance.js +237 -0
  48. package/dist/cli/commands/maintenance.js.map +1 -0
  49. package/dist/cli/commands/rules.d.ts +9 -0
  50. package/dist/cli/commands/rules.d.ts.map +1 -0
  51. package/dist/cli/commands/rules.js +639 -0
  52. package/dist/cli/commands/rules.js.map +1 -0
  53. package/dist/cli/commands/setup.js +5 -4
  54. package/dist/cli/commands/setup.js.map +1 -1
  55. package/dist/cli/index.js +6 -0
  56. package/dist/cli/index.js.map +1 -1
  57. package/dist/config/memoryConfig.d.ts +427 -0
  58. package/dist/config/memoryConfig.d.ts.map +1 -0
  59. package/dist/config/memoryConfig.js +258 -0
  60. package/dist/config/memoryConfig.js.map +1 -0
  61. package/dist/config/rulesConfig.d.ts +486 -0
  62. package/dist/config/rulesConfig.d.ts.map +1 -0
  63. package/dist/config/rulesConfig.js +345 -0
  64. package/dist/config/rulesConfig.js.map +1 -0
  65. package/dist/dashboard/coreTools.d.ts +14 -0
  66. package/dist/dashboard/coreTools.d.ts.map +1 -0
  67. package/dist/dashboard/coreTools.js +413 -0
  68. package/dist/dashboard/coreTools.js.map +1 -0
  69. package/dist/dashboard/public/index.html +1982 -13
  70. package/dist/dashboard/server.d.ts +1 -8
  71. package/dist/dashboard/server.d.ts.map +1 -1
  72. package/dist/dashboard/server.js +846 -13
  73. package/dist/dashboard/server.js.map +1 -1
  74. package/dist/dashboard/toolRegistry.d.ts +192 -0
  75. package/dist/dashboard/toolRegistry.d.ts.map +1 -0
  76. package/dist/dashboard/toolRegistry.js +322 -0
  77. package/dist/dashboard/toolRegistry.js.map +1 -0
  78. package/dist/proxy/index.d.ts +1 -1
  79. package/dist/proxy/index.d.ts.map +1 -1
  80. package/dist/proxy/index.js +9 -6
  81. package/dist/proxy/index.js.map +1 -1
  82. package/dist/server/index.js +21 -0
  83. package/dist/server/index.js.map +1 -1
  84. package/dist/server/tools/crawl.d.ts.map +1 -1
  85. package/dist/server/tools/crawl.js +8 -0
  86. package/dist/server/tools/crawl.js.map +1 -1
  87. package/dist/server/tools/index.d.ts.map +1 -1
  88. package/dist/server/tools/index.js +19 -1
  89. package/dist/server/tools/index.js.map +1 -1
  90. package/dist/server/tools/ingest.d.ts.map +1 -1
  91. package/dist/server/tools/ingest.js +5 -0
  92. package/dist/server/tools/ingest.js.map +1 -1
  93. package/dist/server/tools/memory.d.ts +250 -0
  94. package/dist/server/tools/memory.d.ts.map +1 -0
  95. package/dist/server/tools/memory.js +472 -0
  96. package/dist/server/tools/memory.js.map +1 -0
  97. package/dist/server/tools/recursive-query.d.ts.map +1 -1
  98. package/dist/server/tools/recursive-query.js +6 -0
  99. package/dist/server/tools/recursive-query.js.map +1 -1
  100. package/dist/server/tools/search.d.ts.map +1 -1
  101. package/dist/server/tools/search.js +6 -0
  102. package/dist/server/tools/search.js.map +1 -1
  103. package/dist/services/activity-log.d.ts +10 -0
  104. package/dist/services/activity-log.d.ts.map +1 -0
  105. package/dist/services/activity-log.js +53 -0
  106. package/dist/services/activity-log.js.map +1 -0
  107. package/dist/services/categoryManager.d.ts +110 -0
  108. package/dist/services/categoryManager.d.ts.map +1 -0
  109. package/dist/services/categoryManager.js +549 -0
  110. package/dist/services/categoryManager.js.map +1 -0
  111. package/dist/services/contextEnvironment.d.ts +206 -0
  112. package/dist/services/contextEnvironment.d.ts.map +1 -0
  113. package/dist/services/contextEnvironment.js +481 -0
  114. package/dist/services/contextEnvironment.js.map +1 -0
  115. package/dist/services/conversationProcessor.d.ts +99 -0
  116. package/dist/services/conversationProcessor.d.ts.map +1 -0
  117. package/dist/services/conversationProcessor.js +311 -0
  118. package/dist/services/conversationProcessor.js.map +1 -0
  119. package/dist/services/cursorChatReader.d.ts +129 -0
  120. package/dist/services/cursorChatReader.d.ts.map +1 -0
  121. package/dist/services/cursorChatReader.js +419 -0
  122. package/dist/services/cursorChatReader.js.map +1 -0
  123. package/dist/services/decayCalculator.d.ts +85 -0
  124. package/dist/services/decayCalculator.d.ts.map +1 -0
  125. package/dist/services/decayCalculator.js +182 -0
  126. package/dist/services/decayCalculator.js.map +1 -0
  127. package/dist/services/enhancedVectorStore.d.ts +102 -0
  128. package/dist/services/enhancedVectorStore.d.ts.map +1 -0
  129. package/dist/services/enhancedVectorStore.js +245 -0
  130. package/dist/services/enhancedVectorStore.js.map +1 -0
  131. package/dist/services/hybridScorer.d.ts +120 -0
  132. package/dist/services/hybridScorer.d.ts.map +1 -0
  133. package/dist/services/hybridScorer.js +334 -0
  134. package/dist/services/hybridScorer.js.map +1 -0
  135. package/dist/services/knowledgeExtractor.d.ts +45 -0
  136. package/dist/services/knowledgeExtractor.d.ts.map +1 -0
  137. package/dist/services/knowledgeExtractor.js +436 -0
  138. package/dist/services/knowledgeExtractor.js.map +1 -0
  139. package/dist/services/knowledgeStorage.d.ts +102 -0
  140. package/dist/services/knowledgeStorage.d.ts.map +1 -0
  141. package/dist/services/knowledgeStorage.js +383 -0
  142. package/dist/services/knowledgeStorage.js.map +1 -0
  143. package/dist/services/maintenanceScheduler.d.ts +89 -0
  144. package/dist/services/maintenanceScheduler.d.ts.map +1 -0
  145. package/dist/services/maintenanceScheduler.js +479 -0
  146. package/dist/services/maintenanceScheduler.js.map +1 -0
  147. package/dist/services/memoryMetadataStore.d.ts +62 -0
  148. package/dist/services/memoryMetadataStore.d.ts.map +1 -0
  149. package/dist/services/memoryMetadataStore.js +570 -0
  150. package/dist/services/memoryMetadataStore.js.map +1 -0
  151. package/dist/services/recursiveRetrieval.d.ts +122 -0
  152. package/dist/services/recursiveRetrieval.d.ts.map +1 -0
  153. package/dist/services/recursiveRetrieval.js +443 -0
  154. package/dist/services/recursiveRetrieval.js.map +1 -0
  155. package/dist/services/relationshipGraph.d.ts +77 -0
  156. package/dist/services/relationshipGraph.d.ts.map +1 -0
  157. package/dist/services/relationshipGraph.js +411 -0
  158. package/dist/services/relationshipGraph.js.map +1 -0
  159. package/dist/services/rlmSafeguards.d.ts +273 -0
  160. package/dist/services/rlmSafeguards.d.ts.map +1 -0
  161. package/dist/services/rlmSafeguards.js +705 -0
  162. package/dist/services/rlmSafeguards.js.map +1 -0
  163. package/dist/services/rulesAnalyzer.d.ts +119 -0
  164. package/dist/services/rulesAnalyzer.d.ts.map +1 -0
  165. package/dist/services/rulesAnalyzer.js +768 -0
  166. package/dist/services/rulesAnalyzer.js.map +1 -0
  167. package/dist/services/rulesMerger.d.ts +75 -0
  168. package/dist/services/rulesMerger.d.ts.map +1 -0
  169. package/dist/services/rulesMerger.js +404 -0
  170. package/dist/services/rulesMerger.js.map +1 -0
  171. package/dist/services/rulesParser.d.ts +127 -0
  172. package/dist/services/rulesParser.d.ts.map +1 -0
  173. package/dist/services/rulesParser.js +594 -0
  174. package/dist/services/rulesParser.js.map +1 -0
  175. package/dist/services/smartChunker.d.ts +110 -0
  176. package/dist/services/smartChunker.d.ts.map +1 -0
  177. package/dist/services/smartChunker.js +520 -0
  178. package/dist/services/smartChunker.js.map +1 -0
  179. package/dist/types/categories.d.ts +105 -0
  180. package/dist/types/categories.d.ts.map +1 -0
  181. package/dist/types/categories.js +108 -0
  182. package/dist/types/categories.js.map +1 -0
  183. package/dist/types/extractedKnowledge.d.ts +233 -0
  184. package/dist/types/extractedKnowledge.d.ts.map +1 -0
  185. package/dist/types/extractedKnowledge.js +56 -0
  186. package/dist/types/extractedKnowledge.js.map +1 -0
  187. package/dist/types/index.d.ts +9 -2
  188. package/dist/types/index.d.ts.map +1 -1
  189. package/dist/types/index.js +12 -1
  190. package/dist/types/index.js.map +1 -1
  191. package/dist/types/llmProvider.d.ts +282 -0
  192. package/dist/types/llmProvider.d.ts.map +1 -0
  193. package/dist/types/llmProvider.js +48 -0
  194. package/dist/types/llmProvider.js.map +1 -0
  195. package/dist/types/memory.d.ts +227 -0
  196. package/dist/types/memory.d.ts.map +1 -0
  197. package/dist/types/memory.js +76 -0
  198. package/dist/types/memory.js.map +1 -0
  199. package/dist/types/relationships.d.ts +167 -0
  200. package/dist/types/relationships.d.ts.map +1 -0
  201. package/dist/types/relationships.js +106 -0
  202. package/dist/types/relationships.js.map +1 -0
  203. package/dist/types/rulesOptimizer.d.ts +345 -0
  204. package/dist/types/rulesOptimizer.d.ts.map +1 -0
  205. package/dist/types/rulesOptimizer.js +22 -0
  206. package/dist/types/rulesOptimizer.js.map +1 -0
  207. package/docs/cursor-recursive-rag-memory-spec.md +4569 -0
  208. package/docs/cursor-recursive-rag-tasks.md +1355 -0
  209. package/package.json +6 -3
  210. 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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"}