@ngao/search 0.1.0 → 0.1.2

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 (259) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/.env.example +7 -0
  3. package/.eslintrc.json +20 -0
  4. package/.github/workflows/build.yml +39 -0
  5. package/.github/workflows/release.yml +34 -0
  6. package/.github/workflows/test.yml +35 -0
  7. package/.mcp-config.json +14 -0
  8. package/.prettierrc.json +10 -0
  9. package/LICENSE +17 -0
  10. package/Makefile +26 -0
  11. package/README.md +57 -172
  12. package/config.example.json +8 -0
  13. package/dist/backend/api/search-engine.d.ts +40 -0
  14. package/dist/backend/api/search-engine.d.ts.map +1 -0
  15. package/dist/backend/api/search-engine.js +227 -0
  16. package/dist/backend/api/search-engine.js.map +1 -0
  17. package/dist/backend/core/block-impl.d.ts +32 -0
  18. package/dist/backend/core/block-impl.d.ts.map +1 -0
  19. package/dist/backend/core/block-impl.js +33 -0
  20. package/dist/backend/core/block-impl.js.map +1 -0
  21. package/dist/backend/core/config-loader.d.ts +68 -0
  22. package/dist/backend/core/config-loader.d.ts.map +1 -0
  23. package/dist/backend/core/config-loader.js +234 -0
  24. package/dist/backend/core/config-loader.js.map +1 -0
  25. package/dist/backend/core/constants.d.ts +39 -0
  26. package/dist/backend/core/constants.d.ts.map +1 -0
  27. package/dist/backend/core/constants.js +57 -0
  28. package/dist/backend/core/constants.js.map +1 -0
  29. package/dist/backend/core/enums.d.ts +54 -0
  30. package/dist/backend/core/enums.d.ts.map +1 -0
  31. package/dist/backend/core/enums.js +61 -0
  32. package/dist/backend/core/enums.js.map +1 -0
  33. package/dist/backend/core/errors.d.ts +83 -0
  34. package/dist/backend/core/errors.d.ts.map +1 -0
  35. package/dist/backend/core/errors.js +151 -0
  36. package/dist/backend/core/errors.js.map +1 -0
  37. package/dist/backend/core/logger.d.ts +68 -0
  38. package/dist/backend/core/logger.d.ts.map +1 -0
  39. package/dist/backend/core/logger.js +151 -0
  40. package/dist/backend/core/logger.js.map +1 -0
  41. package/dist/backend/core/models.d.ts +332 -0
  42. package/dist/backend/core/models.d.ts.map +1 -0
  43. package/dist/backend/core/models.js +6 -0
  44. package/dist/backend/core/models.js.map +1 -0
  45. package/dist/backend/core/service-types.d.ts +184 -0
  46. package/dist/backend/core/service-types.d.ts.map +1 -0
  47. package/dist/backend/core/service-types.js +7 -0
  48. package/dist/backend/core/service-types.js.map +1 -0
  49. package/dist/backend/core/types.d.ts +219 -0
  50. package/dist/backend/core/types.d.ts.map +1 -0
  51. package/dist/backend/core/types.js +109 -0
  52. package/dist/backend/core/types.js.map +1 -0
  53. package/dist/backend/index.d.ts +5 -0
  54. package/dist/backend/index.d.ts.map +1 -0
  55. package/dist/backend/index.js +13 -0
  56. package/dist/backend/index.js.map +1 -0
  57. package/dist/backend/indexing/block-extractor.d.ts +22 -0
  58. package/dist/backend/indexing/block-extractor.d.ts.map +1 -0
  59. package/dist/backend/indexing/block-extractor.js +52 -0
  60. package/dist/backend/indexing/block-extractor.js.map +1 -0
  61. package/dist/backend/indexing/index-builder.d.ts +26 -0
  62. package/dist/backend/indexing/index-builder.d.ts.map +1 -0
  63. package/dist/backend/indexing/index-builder.js +71 -0
  64. package/dist/backend/indexing/index-builder.js.map +1 -0
  65. package/dist/backend/parsers/base-file-parser.d.ts +134 -0
  66. package/dist/backend/parsers/base-file-parser.d.ts.map +1 -0
  67. package/dist/backend/parsers/base-file-parser.js +149 -0
  68. package/dist/backend/parsers/base-file-parser.js.map +1 -0
  69. package/dist/backend/parsers/javascript-parser.d.ts +36 -0
  70. package/dist/backend/parsers/javascript-parser.d.ts.map +1 -0
  71. package/dist/backend/parsers/javascript-parser.js +194 -0
  72. package/dist/backend/parsers/javascript-parser.js.map +1 -0
  73. package/dist/backend/parsers/json-parser.d.ts +15 -0
  74. package/dist/backend/parsers/json-parser.d.ts.map +1 -0
  75. package/dist/backend/parsers/json-parser.js +75 -0
  76. package/dist/backend/parsers/json-parser.js.map +1 -0
  77. package/dist/backend/parsers/markdown-parser.d.ts +17 -0
  78. package/dist/backend/parsers/markdown-parser.d.ts.map +1 -0
  79. package/dist/backend/parsers/markdown-parser.js +94 -0
  80. package/dist/backend/parsers/markdown-parser.js.map +1 -0
  81. package/dist/backend/parsers/parser-factory.d.ts +43 -0
  82. package/dist/backend/parsers/parser-factory.d.ts.map +1 -0
  83. package/dist/backend/parsers/parser-factory.js +149 -0
  84. package/dist/backend/parsers/parser-factory.js.map +1 -0
  85. package/dist/backend/parsers/python-parser.d.ts +21 -0
  86. package/dist/backend/parsers/python-parser.d.ts.map +1 -0
  87. package/dist/backend/parsers/python-parser.js +185 -0
  88. package/dist/backend/parsers/python-parser.js.map +1 -0
  89. package/dist/backend/parsers/yaml-parser.d.ts +16 -0
  90. package/dist/backend/parsers/yaml-parser.d.ts.map +1 -0
  91. package/dist/backend/parsers/yaml-parser.js +81 -0
  92. package/dist/backend/parsers/yaml-parser.js.map +1 -0
  93. package/dist/backend/repositories/implementations/lancedb-block-repository.d.ts +125 -0
  94. package/dist/backend/repositories/implementations/lancedb-block-repository.d.ts.map +1 -0
  95. package/dist/backend/repositories/implementations/lancedb-block-repository.js +505 -0
  96. package/dist/backend/repositories/implementations/lancedb-block-repository.js.map +1 -0
  97. package/dist/backend/repositories/implementations/lancedb-metadata-repository.d.ts +107 -0
  98. package/dist/backend/repositories/implementations/lancedb-metadata-repository.d.ts.map +1 -0
  99. package/dist/backend/repositories/implementations/lancedb-metadata-repository.js +275 -0
  100. package/dist/backend/repositories/implementations/lancedb-metadata-repository.js.map +1 -0
  101. package/dist/backend/repositories/implementations/memory-cache.d.ts +18 -0
  102. package/dist/backend/repositories/implementations/memory-cache.d.ts.map +1 -0
  103. package/dist/backend/repositories/implementations/memory-cache.js +53 -0
  104. package/dist/backend/repositories/implementations/memory-cache.js.map +1 -0
  105. package/dist/backend/repositories/repository.interface.d.ts +334 -0
  106. package/dist/backend/repositories/repository.interface.d.ts.map +1 -0
  107. package/dist/backend/repositories/repository.interface.js +7 -0
  108. package/dist/backend/repositories/repository.interface.js.map +1 -0
  109. package/dist/backend/search/context-extractor.d.ts +29 -0
  110. package/dist/backend/search/context-extractor.d.ts.map +1 -0
  111. package/dist/backend/search/context-extractor.js +106 -0
  112. package/dist/backend/search/context-extractor.js.map +1 -0
  113. package/dist/backend/search/multi-index-searcher.d.ts +28 -0
  114. package/dist/backend/search/multi-index-searcher.d.ts.map +1 -0
  115. package/dist/backend/search/multi-index-searcher.js +81 -0
  116. package/dist/backend/search/multi-index-searcher.js.map +1 -0
  117. package/dist/backend/search/query-parser.d.ts +37 -0
  118. package/dist/backend/search/query-parser.d.ts.map +1 -0
  119. package/dist/backend/search/query-parser.js +145 -0
  120. package/dist/backend/search/query-parser.js.map +1 -0
  121. package/dist/backend/search/ranking-engine.d.ts +31 -0
  122. package/dist/backend/search/ranking-engine.d.ts.map +1 -0
  123. package/dist/backend/search/ranking-engine.js +165 -0
  124. package/dist/backend/search/ranking-engine.js.map +1 -0
  125. package/dist/backend/search/result-formatter.d.ts +29 -0
  126. package/dist/backend/search/result-formatter.d.ts.map +1 -0
  127. package/dist/backend/search/result-formatter.js +70 -0
  128. package/dist/backend/search/result-formatter.js.map +1 -0
  129. package/dist/backend/service-types.d.ts +184 -0
  130. package/dist/backend/service-types.d.ts.map +1 -0
  131. package/dist/backend/service-types.js +7 -0
  132. package/dist/backend/service-types.js.map +1 -0
  133. package/dist/backend/services/embedding-service.d.ts +75 -0
  134. package/dist/backend/services/embedding-service.d.ts.map +1 -0
  135. package/dist/backend/services/embedding-service.js +298 -0
  136. package/dist/backend/services/embedding-service.js.map +1 -0
  137. package/dist/backend/services/file-watcher.d.ts +17 -0
  138. package/dist/backend/services/file-watcher.d.ts.map +1 -0
  139. package/dist/backend/services/file-watcher.js +92 -0
  140. package/dist/backend/services/file-watcher.js.map +1 -0
  141. package/dist/backend/services/index-information-service.d.ts +114 -0
  142. package/dist/backend/services/index-information-service.d.ts.map +1 -0
  143. package/dist/backend/services/index-information-service.js +104 -0
  144. package/dist/backend/services/index-information-service.js.map +1 -0
  145. package/dist/backend/services/ngao-search-service.d.ts +107 -0
  146. package/dist/backend/services/ngao-search-service.d.ts.map +1 -0
  147. package/dist/backend/services/ngao-search-service.js +384 -0
  148. package/dist/backend/services/ngao-search-service.js.map +1 -0
  149. package/dist/backend/services/quantization-service.d.ts +53 -0
  150. package/dist/backend/services/quantization-service.d.ts.map +1 -0
  151. package/dist/backend/services/quantization-service.js +84 -0
  152. package/dist/backend/services/quantization-service.js.map +1 -0
  153. package/dist/backend/services/reindex-manager.d.ts +25 -0
  154. package/dist/backend/services/reindex-manager.d.ts.map +1 -0
  155. package/dist/backend/services/reindex-manager.js +78 -0
  156. package/dist/backend/services/reindex-manager.js.map +1 -0
  157. package/dist/backend/services/session-manager.d.ts +115 -0
  158. package/dist/backend/services/session-manager.d.ts.map +1 -0
  159. package/dist/backend/services/session-manager.js +150 -0
  160. package/dist/backend/services/session-manager.js.map +1 -0
  161. package/dist/backend/services/vector-search-service.d.ts +81 -0
  162. package/dist/backend/services/vector-search-service.d.ts.map +1 -0
  163. package/dist/backend/services/vector-search-service.js +143 -0
  164. package/dist/backend/services/vector-search-service.js.map +1 -0
  165. package/dist/backend/utils/file-utils.d.ts +92 -0
  166. package/dist/backend/utils/file-utils.d.ts.map +1 -0
  167. package/dist/backend/utils/file-utils.js +247 -0
  168. package/dist/backend/utils/file-utils.js.map +1 -0
  169. package/dist/cli/setup.d.ts +4 -0
  170. package/dist/cli/setup.d.ts.map +1 -0
  171. package/dist/cli/setup.js +138 -0
  172. package/dist/cli/setup.js.map +1 -0
  173. package/dist/index.d.ts +6 -0
  174. package/dist/index.d.ts.map +1 -0
  175. package/dist/index.js +22 -0
  176. package/dist/index.js.map +1 -0
  177. package/dist/main.d.ts +14 -0
  178. package/dist/main.d.ts.map +1 -0
  179. package/dist/main.js +7 -67075
  180. package/dist/main.js.map +1 -0
  181. package/dist/mcp/tool-schemas.d.ts +205 -0
  182. package/dist/mcp/tool-schemas.d.ts.map +1 -0
  183. package/dist/mcp/tool-schemas.js +391 -0
  184. package/dist/mcp/tool-schemas.js.map +1 -0
  185. package/dist/server/logger.d.ts +50 -0
  186. package/dist/server/logger.d.ts.map +1 -0
  187. package/dist/server/logger.js +77 -0
  188. package/dist/server/logger.js.map +1 -0
  189. package/dist/server/tool-registry.d.ts +64 -0
  190. package/dist/server/tool-registry.d.ts.map +1 -0
  191. package/dist/server/tool-registry.js +93 -0
  192. package/dist/server/tool-registry.js.map +1 -0
  193. package/dist/server/transports/mcp-transport.d.ts +31 -0
  194. package/dist/server/transports/mcp-transport.d.ts.map +1 -0
  195. package/dist/server/transports/mcp-transport.js +331 -0
  196. package/dist/server/transports/mcp-transport.js.map +1 -0
  197. package/dist/server/transports/rest-transport.d.ts +36 -0
  198. package/dist/server/transports/rest-transport.d.ts.map +1 -0
  199. package/dist/server/transports/rest-transport.js +250 -0
  200. package/dist/server/transports/rest-transport.js.map +1 -0
  201. package/docs/API.md +116 -0
  202. package/docs/ARCHITECTURE.md +101 -0
  203. package/docs/FILE_WATCHING.md +120 -0
  204. package/docs/INSTALLATION.md +87 -0
  205. package/docs/MCP_INTEGRATION.md +108 -0
  206. package/docs/README.md +288 -0
  207. package/docs/USAGE.md +123 -0
  208. package/docs/architecture-design-standards/01_ARCHITECTURE.md +863 -0
  209. package/docs/architecture-design-standards/02_SEARCH_ENGINE_DESIGN.md +958 -0
  210. package/docs/architecture-design-standards/03_DATAFLOW.md +1000 -0
  211. package/docs/architecture-design-standards/04_VISUAL_GUIDE.md +922 -0
  212. package/docs/architecture-design-standards/05_REPOSITORY_PATTERN_GUIDE.md +503 -0
  213. package/docs/architecture-design-standards/06_IMPLEMENTATION_PATTERNS.md +1026 -0
  214. package/docs/architecture-design-standards/07_TYPESCRIPT_GUIDE.md +1027 -0
  215. package/docs/architecture-design-standards/08_CODING_STANDARDS.md +1274 -0
  216. package/docs/reference/01_START_HERE.md +108 -0
  217. package/docs/reference/02_QUICK_REFERENCE.md +363 -0
  218. package/docs/reference/03_DOCUMENTATION_INDEX.md +293 -0
  219. package/docs/reference/04_DELIVERY_SUMMARY.md +463 -0
  220. package/docs/reference/05_IMPLEMENTATION_OVERVIEW.md +319 -0
  221. package/docs/reference/06_RESEARCH_SUMMARY.md +519 -0
  222. package/docs/tracking/03_IMPLEMENTATION_ROADMAP.md +788 -0
  223. package/jest.config.json +12 -0
  224. package/package.json +46 -53
  225. package/prepend-shebang.js +18 -0
  226. package/scripts/setup-mcp.sh +66 -0
  227. package/src/backend/index.ts +5 -0
  228. package/src/backend/service-types.ts +219 -0
  229. package/src/backend/services/file-watcher.ts +79 -0
  230. package/src/backend/services/ngao-search-service.ts +430 -0
  231. package/src/backend/services/reindex-manager.ts +90 -0
  232. package/src/backend/services/session-manager.ts +214 -0
  233. package/src/cli/setup.ts +122 -0
  234. package/src/index.ts +6 -0
  235. package/src/main.ts +225 -0
  236. package/src/mcp/tool-schemas.ts +439 -0
  237. package/src/server/logger.ts +88 -0
  238. package/src/server/tool-registry.ts +117 -0
  239. package/src/server/transports/mcp-transport.ts +374 -0
  240. package/src/server/transports/rest-transport.ts +258 -0
  241. package/tests/unit/agent-tools.test.ts +454 -0
  242. package/tests/unit/file-watcher.test.d.ts +2 -0
  243. package/tests/unit/file-watcher.test.d.ts.map +1 -0
  244. package/tests/unit/file-watcher.test.js +9 -0
  245. package/tests/unit/file-watcher.test.js.map +1 -0
  246. package/tests/unit/file-watcher.test.ts +7 -0
  247. package/tests/unit/search-integration.test.ts +256 -0
  248. package/tests/unit/services.test.d.ts +2 -0
  249. package/tests/unit/services.test.d.ts.map +1 -0
  250. package/tests/unit/services.test.js +9 -0
  251. package/tests/unit/services.test.js.map +1 -0
  252. package/tests/unit/services.test.ts +7 -0
  253. package/tsconfig.json +23 -0
  254. package/webpack.backend.config.js +60 -0
  255. package/webpack.config.js +34 -0
  256. package/models/Xenova/all-MiniLM-L6-v2/config.json +0 -25
  257. package/models/Xenova/all-MiniLM-L6-v2/onnx/model_quantized.onnx +0 -0
  258. package/models/Xenova/all-MiniLM-L6-v2/tokenizer.json +0 -30686
  259. package/models/Xenova/all-MiniLM-L6-v2/tokenizer_config.json +0 -15
@@ -0,0 +1,334 @@
1
+ /**
2
+ * Repository Pattern Interfaces
3
+ * Abstracts data access layer for flexibility and testability
4
+ */
5
+ import { Block } from '../core/models';
6
+ import { FilePath, SearchTerm, FileContent, FileHash } from '../core/types';
7
+ /**
8
+ * Generic repository interface
9
+ * All repositories should implement this contract
10
+ */
11
+ export interface IRepository<T, ID> {
12
+ /**
13
+ * Find entity by ID
14
+ *
15
+ * @param id - Entity identifier
16
+ * @returns Entity or null if not found
17
+ */
18
+ findById(id: ID): Promise<T | null>;
19
+ /**
20
+ * Find all entities
21
+ *
22
+ * @returns Array of all entities
23
+ */
24
+ findAll(): Promise<T[]>;
25
+ /**
26
+ * Save entity (create or update)
27
+ *
28
+ * @param entity - Entity to save
29
+ * @returns Saved entity
30
+ */
31
+ save(entity: T): Promise<T>;
32
+ /**
33
+ * Delete entity by ID
34
+ *
35
+ * @param id - Entity identifier
36
+ * @returns true if deleted, false if not found
37
+ */
38
+ delete(id: ID): Promise<boolean>;
39
+ /**
40
+ * Check if entity exists
41
+ *
42
+ * @param id - Entity identifier
43
+ * @returns true if exists
44
+ */
45
+ exists(id: ID): Promise<boolean>;
46
+ /**
47
+ * Delete all entities
48
+ *
49
+ * @returns Promise that resolves when clear is complete
50
+ */
51
+ clear(): Promise<void>;
52
+ }
53
+ /**
54
+ * Search criteria for block queries
55
+ */
56
+ export interface BlockSearchCriteria {
57
+ /** Filter by file path */
58
+ filePath?: FilePath;
59
+ /** Filter by item type */
60
+ itemType?: string;
61
+ /** Filter by scope hierarchy */
62
+ scope?: string[];
63
+ /** Filter by keyword */
64
+ keyword?: SearchTerm;
65
+ /** Filter by public status */
66
+ isPublic?: boolean;
67
+ }
68
+ /**
69
+ * Block repository interface
70
+ * Extends generic repository with block-specific queries
71
+ */
72
+ export interface IBlockRepository extends IRepository<Block, string> {
73
+ /**
74
+ * Save multiple blocks in batch (optimized for indexing)
75
+ *
76
+ * @param blocks - Array of blocks to save
77
+ * @returns Array of saved blocks
78
+ */
79
+ saveMany(blocks: Block[]): Promise<Block[]>;
80
+ /**
81
+ * Find blocks by file path
82
+ *
83
+ * @param filePath - File path to search
84
+ * @returns Array of blocks from file
85
+ */
86
+ findByFilePath(filePath: FilePath): Promise<Block[]>;
87
+ /**
88
+ * Find blocks by scope hierarchy
89
+ *
90
+ * @param scope - Scope path (e.g., ['ClassName', 'methodName'])
91
+ * @returns Array of blocks in scope
92
+ */
93
+ findByScope(scope: string[]): Promise<Block[]>;
94
+ /**
95
+ * Search blocks by keyword
96
+ *
97
+ * @param keyword - Search keyword
98
+ * @returns Array of matching blocks
99
+ */
100
+ searchByKeyword(keyword: SearchTerm): Promise<Block[]>;
101
+ /**
102
+ * Search blocks by content
103
+ *
104
+ * @param content - Content to search
105
+ * @returns Array of matching blocks
106
+ */
107
+ searchByContent(content: FileContent): Promise<Block[]>;
108
+ /**
109
+ * Get blocks matching multiple criteria
110
+ *
111
+ * @param criteria - Search criteria
112
+ * @returns Array of matching blocks
113
+ */
114
+ findByCriteria(criteria: BlockSearchCriteria): Promise<Block[]>;
115
+ /**
116
+ * Delete all blocks from file
117
+ *
118
+ * @param filePath - File path
119
+ * @returns Number of deleted blocks
120
+ */
121
+ deleteByFilePath(filePath: FilePath): Promise<number>;
122
+ /**
123
+ * Get total block count
124
+ *
125
+ * @returns Total number of blocks
126
+ */
127
+ count(): Promise<number>;
128
+ /**
129
+ * Find blocks with pagination
130
+ *
131
+ * @param offset - Number of results to skip
132
+ * @param limit - Maximum results to return
133
+ * @returns Array of blocks
134
+ */
135
+ findPaginated(offset: number, limit: number): Promise<Block[]>;
136
+ }
137
+ /**
138
+ * Inverted index entry
139
+ */
140
+ export interface InvertedIndexEntry {
141
+ /** The search term */
142
+ term: string;
143
+ /** Block IDs containing this term */
144
+ blockIds: string[];
145
+ /** Total occurrences */
146
+ occurrenceCount: number;
147
+ }
148
+ /**
149
+ * Index repository interface
150
+ */
151
+ export interface IIndexRepository {
152
+ /**
153
+ * Save inverted index
154
+ *
155
+ * @param index - Index data as map
156
+ * @returns Promise that resolves when save is complete
157
+ */
158
+ saveInvertedIndex(index: Map<string, InvertedIndexEntry[]>): Promise<void>;
159
+ /**
160
+ * Load inverted index
161
+ *
162
+ * @returns Inverted index map
163
+ */
164
+ loadInvertedIndex(): Promise<Map<string, InvertedIndexEntry[]>>;
165
+ /**
166
+ * Update a single index entry
167
+ *
168
+ * @param term - Search term
169
+ * @param entries - Index entries for this term
170
+ * @returns Promise that resolves when update is complete
171
+ */
172
+ updateIndexEntry(term: string, entries: InvertedIndexEntry[]): Promise<void>;
173
+ /**
174
+ * Get index size in bytes
175
+ *
176
+ * @returns Size estimation
177
+ */
178
+ getIndexSize(): Promise<number>;
179
+ /**
180
+ * Clear all index data
181
+ *
182
+ * @returns Promise that resolves when clear is complete
183
+ */
184
+ clear(): Promise<void>;
185
+ }
186
+ /**
187
+ * File metadata for change detection
188
+ */
189
+ export interface FileMetadata {
190
+ /** File path */
191
+ filePath: FilePath;
192
+ /** SHA256 hash of file content */
193
+ fileHash: FileHash;
194
+ /** Last indexed timestamp */
195
+ lastIndexedAt: number;
196
+ }
197
+ /**
198
+ * Metadata repository interface
199
+ */
200
+ export interface IMetadataRepository {
201
+ /**
202
+ * Get file hash
203
+ *
204
+ * @param filePath - File path
205
+ * @returns File hash or null if not found
206
+ */
207
+ getFileHash(filePath: FilePath): Promise<FileHash | null>;
208
+ /**
209
+ * Update file hash
210
+ *
211
+ * @param filePath - File path
212
+ * @param hash - New file hash
213
+ * @returns Promise that resolves when update is complete
214
+ */
215
+ updateFileHash(filePath: FilePath, hash: FileHash): Promise<void>;
216
+ /**
217
+ * Get last indexed time for file
218
+ *
219
+ * @param filePath - File path
220
+ * @returns Timestamp or null if not indexed
221
+ */
222
+ getLastIndexedTime(filePath: FilePath): Promise<number | null>;
223
+ /**
224
+ * Update last indexed time
225
+ *
226
+ * @param filePath - File path
227
+ * @param timestamp - Timestamp
228
+ * @returns Promise that resolves when update is complete
229
+ */
230
+ updateLastIndexedTime(filePath: FilePath, timestamp: number): Promise<void>;
231
+ /**
232
+ * Get all indexed files
233
+ *
234
+ * @returns Array of file paths
235
+ */
236
+ getIndexedFiles(): Promise<FilePath[]>;
237
+ /**
238
+ * Get all indexed directories
239
+ *
240
+ * @returns Array of directory paths
241
+ */
242
+ getIndexedDirectories(): Promise<string[]>;
243
+ /**
244
+ * Get file metadata for a specific file
245
+ *
246
+ * @param filePath - File path
247
+ * @returns File metadata or null if not found
248
+ */
249
+ getFileMetadata(filePath: FilePath): Promise<{
250
+ filePath: FilePath;
251
+ fileType: string;
252
+ fileHash: FileHash;
253
+ fileSizeBytes: number;
254
+ indexedAt: number;
255
+ blockCount: number;
256
+ blocksByType: Record<string, number>;
257
+ embeddingPresent: boolean;
258
+ } | null>;
259
+ /**
260
+ * Get all file metadata
261
+ *
262
+ * @returns Array of file metadata
263
+ */
264
+ getAllFileMetadata(): Promise<Array<{
265
+ filePath: FilePath;
266
+ fileType: string;
267
+ fileHash: FileHash;
268
+ fileSizeBytes: number;
269
+ indexedAt: number;
270
+ blockCount: number;
271
+ blocksByType: Record<string, number>;
272
+ embeddingPresent: boolean;
273
+ }>>;
274
+ /**
275
+ * Update reindex metadata
276
+ *
277
+ * @param dirPath - Directory path
278
+ * @param stats - Reindex statistics
279
+ * @returns Promise that resolves when update is complete
280
+ */
281
+ updateReindexMetadata(dirPath: string, stats: {
282
+ lastReindexedAt: number;
283
+ reindexCount: number;
284
+ averageReindexTimeMs: number;
285
+ }): Promise<void>;
286
+ /**
287
+ * Clear all metadata
288
+ *
289
+ * @returns Promise that resolves when clear is complete
290
+ */
291
+ clear(): Promise<void>;
292
+ }
293
+ /**
294
+ * Generic cache interface
295
+ */
296
+ export interface ICache {
297
+ /**
298
+ * Get value from cache
299
+ *
300
+ * @param key - Cache key
301
+ * @returns Cached value or null if not found or expired
302
+ */
303
+ get<T>(key: string): Promise<T | null>;
304
+ /**
305
+ * Set value in cache
306
+ *
307
+ * @param key - Cache key
308
+ * @param value - Value to cache
309
+ * @param ttlSeconds - Time to live in seconds
310
+ * @returns Promise that resolves when set is complete
311
+ */
312
+ set<T>(key: string, value: T, ttlSeconds?: number): Promise<void>;
313
+ /**
314
+ * Check if key exists in cache
315
+ *
316
+ * @param key - Cache key
317
+ * @returns true if exists and not expired
318
+ */
319
+ has(key: string): Promise<boolean>;
320
+ /**
321
+ * Delete value from cache
322
+ *
323
+ * @param key - Cache key
324
+ * @returns true if deleted, false if not found
325
+ */
326
+ delete(key: string): Promise<boolean>;
327
+ /**
328
+ * Clear entire cache
329
+ *
330
+ * @returns Promise that resolves when clear is complete
331
+ */
332
+ clear(): Promise<void>;
333
+ }
334
+ //# sourceMappingURL=repository.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.interface.d.ts","sourceRoot":"","sources":["../../../src/backend/repositories/repository.interface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * Repository Pattern Interfaces
4
+ * Abstracts data access layer for flexibility and testability
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=repository.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.interface.js","sourceRoot":"","sources":["../../../src/backend/repositories/repository.interface.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Context Extractor
3
+ * Extracts surrounding context for search results
4
+ */
5
+ import { Block } from '../core/models';
6
+ import { ILogger } from '../core/types';
7
+ /**
8
+ * Extracts context snippets around matching blocks
9
+ */
10
+ export declare class ContextExtractor {
11
+ private _contextLines;
12
+ private _logger;
13
+ constructor(logger?: ILogger, contextLines?: number);
14
+ /**
15
+ * Extract context snippet for a block
16
+ *
17
+ * @param block - Block to extract context for
18
+ * @returns Context snippet with surrounding lines
19
+ */
20
+ extractContext(block: Block): Promise<string>;
21
+ /**
22
+ * Extract and format context with line numbers
23
+ *
24
+ * @param block - Block to extract context for
25
+ * @returns Formatted context with line numbers
26
+ */
27
+ extractFormattedContext(block: Block): Promise<string>;
28
+ }
29
+ //# sourceMappingURL=context-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-extractor.d.ts","sourceRoot":"","sources":["../../../src/backend/search/context-extractor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAU;gBAEN,MAAM,CAAC,EAAE,OAAO,EAAE,YAAY,GAAE,MAA8B;IAKjF;;;;;OAKG;IACU,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAsC1D;;;;;OAKG;IACU,uBAAuB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;CAyBpE"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ /**
3
+ * Context Extractor
4
+ * Extracts surrounding context for search results
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || function (mod) {
23
+ if (mod && mod.__esModule) return mod;
24
+ var result = {};
25
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
26
+ __setModuleDefault(result, mod);
27
+ return result;
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.ContextExtractor = void 0;
31
+ const fs = __importStar(require("fs"));
32
+ const constants_1 = require("../core/constants");
33
+ const logger_1 = require("../core/logger");
34
+ /**
35
+ * Extracts context snippets around matching blocks
36
+ */
37
+ class ContextExtractor {
38
+ constructor(logger, contextLines = constants_1.DEFAULT_CONTEXT_LINES) {
39
+ this._contextLines = contextLines;
40
+ this._logger = logger || new logger_1.NoOpLogger();
41
+ }
42
+ /**
43
+ * Extract context snippet for a block
44
+ *
45
+ * @param block - Block to extract context for
46
+ * @returns Context snippet with surrounding lines
47
+ */
48
+ async extractContext(block) {
49
+ try {
50
+ this._logger.debug('Extracting context', {
51
+ filePath: block.filePath,
52
+ blockName: block.name,
53
+ startLine: block.location.startLine,
54
+ endLine: block.location.endLine
55
+ });
56
+ const content = await fs.promises.readFile(block.filePath, 'utf-8');
57
+ const lines = content.split('\n');
58
+ // Calculate context window
59
+ const startLine = Math.max(0, block.location.startLine - 1 - this._contextLines);
60
+ const endLine = Math.min(lines.length, block.location.endLine + this._contextLines);
61
+ // Extract lines
62
+ const contextLines = lines.slice(startLine, endLine);
63
+ const snippet = contextLines.join('\n');
64
+ this._logger.debug('Context extracted successfully', {
65
+ contextLinesCount: contextLines.length
66
+ });
67
+ return snippet;
68
+ }
69
+ catch (error) {
70
+ // If file can't be read, return block content
71
+ this._logger.warn('Failed to read file for context', {
72
+ filePath: block.filePath,
73
+ error: String(error)
74
+ });
75
+ return block.content;
76
+ }
77
+ }
78
+ /**
79
+ * Extract and format context with line numbers
80
+ *
81
+ * @param block - Block to extract context for
82
+ * @returns Formatted context with line numbers
83
+ */
84
+ async extractFormattedContext(block) {
85
+ try {
86
+ const content = await fs.promises.readFile(block.filePath, 'utf-8');
87
+ const lines = content.split('\n');
88
+ const startLine = Math.max(0, block.location.startLine - 1 - this._contextLines);
89
+ const endLine = Math.min(lines.length, block.location.endLine + this._contextLines);
90
+ // Extract lines with line numbers
91
+ const contextLines = [];
92
+ for (let i = startLine; i < endLine; i++) {
93
+ const lineNum = i + 1;
94
+ const marker = lineNum >= block.location.startLine && lineNum <= block.location.endLine ? '>' : ' ';
95
+ contextLines.push(`${marker} ${String(lineNum).padStart(4)} | ${lines[i]}`);
96
+ }
97
+ return contextLines.join('\n');
98
+ }
99
+ catch {
100
+ // If file can't be read, return block content
101
+ return block.content;
102
+ }
103
+ }
104
+ }
105
+ exports.ContextExtractor = ContextExtractor;
106
+ //# sourceMappingURL=context-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-extractor.js","sourceRoot":"","sources":["../../../src/backend/search/context-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Multi-Index Searcher
3
+ * Searches across inverted index and block repository
4
+ */
5
+ import { Block } from '../core/models';
6
+ import { IBlockRepository } from '../repositories/repository.interface';
7
+ import { Query } from '../core/models';
8
+ import { ILogger } from '../core/types';
9
+ /**
10
+ * Searches blocks using inverted index
11
+ */
12
+ export declare class MultiIndexSearcher {
13
+ private _blockRepository;
14
+ private _logger;
15
+ constructor(_blockRepository: IBlockRepository, logger?: ILogger);
16
+ /**
17
+ * Search blocks by query
18
+ *
19
+ * @param query - Parsed search query
20
+ * @returns Matching blocks
21
+ */
22
+ search(query: Query): Promise<Block[]>;
23
+ /**
24
+ * Check if block matches query criteria
25
+ */
26
+ private _blockMatches;
27
+ }
28
+ //# sourceMappingURL=multi-index-searcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-index-searcher.d.ts","sourceRoot":"","sources":["../../../src/backend/search/multi-index-searcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC;;GAEG;AACH,qBAAa,kBAAkB;IAGV,OAAO,CAAC,gBAAgB;IAF3C,OAAO,CAAC,OAAO,CAAU;gBAEE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,OAAO;IAI/E;;;;;OAKG;IACU,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAoCnD;;OAEG;IACH,OAAO,CAAC,aAAa;CA4BtB"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ /**
3
+ * Multi-Index Searcher
4
+ * Searches across inverted index and block repository
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.MultiIndexSearcher = void 0;
8
+ const logger_1 = require("../core/logger");
9
+ /**
10
+ * Searches blocks using inverted index
11
+ */
12
+ class MultiIndexSearcher {
13
+ constructor(_blockRepository, logger) {
14
+ this._blockRepository = _blockRepository;
15
+ this._logger = logger || new logger_1.NoOpLogger();
16
+ }
17
+ /**
18
+ * Search blocks by query
19
+ *
20
+ * @param query - Parsed search query
21
+ * @returns Matching blocks
22
+ */
23
+ async search(query) {
24
+ this._logger.debug('Starting block search', {
25
+ terms: query.terms.length,
26
+ hasFileTypeFilter: (query.fileTypeFilters?.length ?? 0) > 0,
27
+ hasScopeFilter: (query.scopeFilters?.length ?? 0) > 0,
28
+ hasItemTypeFilter: (query.itemTypeFilters?.length ?? 0) > 0
29
+ });
30
+ const matchingBlocks = new Map();
31
+ if (query.terms.length === 0) {
32
+ this._logger.warn('Search performed with no terms');
33
+ return [];
34
+ }
35
+ // Get all blocks
36
+ const allBlocks = await this._blockRepository.findAll();
37
+ this._logger.debug('Retrieved blocks from repository', { blockCount: allBlocks.length });
38
+ // Filter blocks based on query
39
+ for (const block of allBlocks) {
40
+ if (this._blockMatches(block, query)) {
41
+ matchingBlocks.set(block.id, block);
42
+ }
43
+ }
44
+ const result = Array.from(matchingBlocks.values());
45
+ this._logger.debug('Block search completed', {
46
+ matchCount: result.length,
47
+ totalBlocks: allBlocks.length,
48
+ matchPercentage: allBlocks.length > 0 ? ((result.length / allBlocks.length) * 100).toFixed(2) : '0'
49
+ });
50
+ return result;
51
+ }
52
+ /**
53
+ * Check if block matches query criteria
54
+ */
55
+ _blockMatches(block, query) {
56
+ // Check file type filters
57
+ if (query.fileTypeFilters && query.fileTypeFilters.length > 0) {
58
+ // Would need file type in block - skipping for now
59
+ }
60
+ // Check item type filters
61
+ if (query.itemTypeFilters && query.itemTypeFilters.length > 0) {
62
+ if (!query.itemTypeFilters.includes(block.itemType)) {
63
+ return false;
64
+ }
65
+ }
66
+ // Check scope filters
67
+ if (query.scopeFilters && query.scopeFilters.length > 0) {
68
+ const blockScopeStr = block.scopeHierarchy.join('.');
69
+ const matchesScope = query.scopeFilters.some((scope) => blockScopeStr.includes(scope));
70
+ if (!matchesScope) {
71
+ return false;
72
+ }
73
+ }
74
+ // Check if block contains any query terms
75
+ const blockText = `${block.name} ${block.content} ${block.docstring || ''}`.toLowerCase();
76
+ const hasMatch = query.terms.some((term) => blockText.includes(term));
77
+ return hasMatch;
78
+ }
79
+ }
80
+ exports.MultiIndexSearcher = MultiIndexSearcher;
81
+ //# sourceMappingURL=multi-index-searcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-index-searcher.js","sourceRoot":"","sources":["../../../src/backend/search/multi-index-searcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Query Parser
3
+ * Parses search queries into structured format
4
+ */
5
+ import { Query } from '../core/models';
6
+ import { ILogger } from '../core/types';
7
+ /**
8
+ * Parses search queries and extracts structured information
9
+ */
10
+ export declare class QueryParser {
11
+ private _logger;
12
+ constructor(logger?: ILogger);
13
+ /**
14
+ * Parse raw query string into structured Query object
15
+ *
16
+ * @param rawQuery - Raw query string from user
17
+ * @returns Parsed query object
18
+ * @throws Error if query fails validation
19
+ */
20
+ parse(rawQuery: string): Query;
21
+ /**
22
+ * Tokenize query string into terms
23
+ *
24
+ * @param query - Query string
25
+ * @returns Array of tokens
26
+ */
27
+ tokenize(query: string): string[];
28
+ /**
29
+ * Validate query length to prevent ReDoS and DoS attacks
30
+ *
31
+ * @param query - Query string to validate
32
+ * @throws Error if query violates constraints
33
+ */
34
+ private _validateQueryLength;
35
+ private _splitQuery;
36
+ }
37
+ //# sourceMappingURL=query-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-parser.d.ts","sourceRoot":"","sources":["../../../src/backend/search/query-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,OAAO,EAAE,OAAO,EAAoB,MAAM,eAAe,CAAC;AAY1D;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAU;gBAEN,MAAM,CAAC,EAAE,OAAO;IAInC;;;;;;OAMG;IACI,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK;IA8DrC;;;;;OAKG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAOxC;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,WAAW;CA0BpB"}