@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,143 @@
1
+ "use strict";
2
+ /**
3
+ * Vector Search Service
4
+ * High-level API for semantic similarity search
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.VectorSearchService = void 0;
8
+ const logger_1 = require("../core/logger");
9
+ const embedding_service_1 = require("./embedding-service");
10
+ /**
11
+ * Vector search service for semantic similarity
12
+ */
13
+ class VectorSearchService {
14
+ constructor(blockRepository, embeddingService, logger) {
15
+ this._blockRepository = blockRepository;
16
+ this._embeddingService = embeddingService || new embedding_service_1.EmbeddingService(logger);
17
+ this._logger = logger || new logger_1.NoOpLogger();
18
+ }
19
+ /**
20
+ * Initialize services
21
+ */
22
+ async initialize() {
23
+ await this._embeddingService.initialize();
24
+ this._logger.info('Vector search service initialized');
25
+ }
26
+ /**
27
+ * Search by semantic similarity
28
+ *
29
+ * @param queryText - Query text
30
+ * @param options - Search options
31
+ * @returns Array of similar blocks with similarity scores
32
+ */
33
+ async search(queryText, options = {}) {
34
+ try {
35
+ const limit = options.limit || 10;
36
+ const minSimilarity = options.minSimilarity || 0.3;
37
+ this._logger.debug('Vector search initiated', { queryText, limit, minSimilarity });
38
+ // Generate embedding for query
39
+ const queryEmbedding = await this._embeddingService.generate(queryText);
40
+ // Search in block repository
41
+ const results = await this._blockRepository.searchByVector(queryEmbedding, limit * 2, // Get more results for filtering
42
+ minSimilarity);
43
+ // Apply optional filters
44
+ let filtered = results;
45
+ if (options.filePathFilter) {
46
+ filtered = filtered.filter((r) => r.block.filePath.includes(options.filePathFilter));
47
+ }
48
+ if (options.itemTypeFilter) {
49
+ filtered = filtered.filter((r) => r.block.itemType === options.itemTypeFilter);
50
+ }
51
+ // Limit results
52
+ const final = filtered.slice(0, limit);
53
+ this._logger.debug('Vector search completed', { resultCount: final.length });
54
+ return final;
55
+ }
56
+ catch (error) {
57
+ this._logger.error('Error in vector search', error);
58
+ return [];
59
+ }
60
+ }
61
+ /**
62
+ * Search with pre-generated embedding
63
+ * (Useful if you already have an embedding)
64
+ */
65
+ async searchByEmbedding(embedding, options = {}) {
66
+ try {
67
+ const limit = options.limit || 10;
68
+ const minSimilarity = options.minSimilarity || 0.3;
69
+ this._logger.debug('Vector search by embedding', { limit, minSimilarity });
70
+ // Search in block repository
71
+ const results = await this._blockRepository.searchByVector(embedding, limit * 2, minSimilarity);
72
+ // Apply optional filters
73
+ let filtered = results;
74
+ if (options.filePathFilter) {
75
+ filtered = filtered.filter((r) => r.block.filePath.includes(options.filePathFilter));
76
+ }
77
+ if (options.itemTypeFilter) {
78
+ filtered = filtered.filter((r) => r.block.itemType === options.itemTypeFilter);
79
+ }
80
+ // Limit results
81
+ const final = filtered.slice(0, limit);
82
+ this._logger.debug('Vector search completed', { resultCount: final.length });
83
+ return final;
84
+ }
85
+ catch (error) {
86
+ this._logger.error('Error in vector search', error);
87
+ return [];
88
+ }
89
+ }
90
+ /**
91
+ * Find blocks similar to a given block
92
+ * (Useful for "similar items" feature)
93
+ */
94
+ async findSimilarBlocks(blockId, options = {}) {
95
+ try {
96
+ // Find the reference block
97
+ const refBlock = await this._blockRepository.findById(blockId);
98
+ if (!refBlock || !refBlock.embedding) {
99
+ this._logger.warn('Reference block not found or has no embedding', { blockId });
100
+ return [];
101
+ }
102
+ this._logger.debug('Finding similar blocks', { blockId, limit: options.limit });
103
+ // Search using block's embedding
104
+ const results = await this.searchByEmbedding(Array.from(refBlock.embedding), options);
105
+ // Filter out the reference block itself
106
+ const filtered = results.filter((r) => r.block.id !== blockId);
107
+ return filtered;
108
+ }
109
+ catch (error) {
110
+ this._logger.error('Error finding similar blocks', error);
111
+ return [];
112
+ }
113
+ }
114
+ /**
115
+ * Get embedding dimension
116
+ */
117
+ getDimension() {
118
+ return this._embeddingService.getDimension();
119
+ }
120
+ /**
121
+ * Get model information
122
+ */
123
+ getModelInfo() {
124
+ return {
125
+ name: this._embeddingService.getModelName(),
126
+ dimension: this._embeddingService.getDimension(),
127
+ };
128
+ }
129
+ /**
130
+ * Check if service is ready
131
+ */
132
+ isReady() {
133
+ return this._embeddingService.isInitialized();
134
+ }
135
+ /**
136
+ * Validate similarity score
137
+ */
138
+ validateSimilarityScore(score) {
139
+ return score >= 0 && score <= 1;
140
+ }
141
+ }
142
+ exports.VectorSearchService = VectorSearchService;
143
+ //# sourceMappingURL=vector-search-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-search-service.js","sourceRoot":"","sources":["../../../src/backend/services/vector-search-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Utility Functions for File Operations
3
+ */
4
+ /**
5
+ * File utility functions
6
+ */
7
+ export declare class FileUtils {
8
+ /**
9
+ * Read file content asynchronously
10
+ *
11
+ * @param filePath - Path to file
12
+ * @returns File content as string
13
+ */
14
+ static readFile(filePath: string): Promise<string>;
15
+ /**
16
+ * Check if file exists
17
+ *
18
+ * @param filePath - Path to file
19
+ * @returns true if file exists
20
+ */
21
+ static fileExists(filePath: string): boolean;
22
+ /**
23
+ * Get file size in bytes
24
+ *
25
+ * @param filePath - Path to file
26
+ * @returns File size
27
+ */
28
+ static getFileSize(filePath: string): number;
29
+ /**
30
+ * Compute SHA256 hash of file
31
+ *
32
+ * @param filePath - Path to file
33
+ * @returns File hash
34
+ */
35
+ static computeFileHash(filePath: string): Promise<string>;
36
+ /**
37
+ * Find all files matching pattern recursively
38
+ *
39
+ * @param dirPath - Directory path
40
+ * @param extensions - File extensions to match (e.g., ['.py', '.md'])
41
+ * @param includePaths - Glob patterns to include (e.g., ['**\/*.ts', 'src/**'])
42
+ * @param excludePaths - Glob patterns to exclude (e.g., ['node_modules/**', 'dist/**'])
43
+ * @returns Array of matching file paths
44
+ * @throws SecurityError if path traversal attempt is detected
45
+ */
46
+ static findFiles(dirPath: string, extensions: string[], includePaths?: string[], excludePaths?: string[]): string[];
47
+ /**
48
+ * Check if a path matches any of the given glob patterns
49
+ *
50
+ * @param filePath - Relative file path
51
+ * @param patterns - Array of glob patterns
52
+ * @returns true if path matches any pattern
53
+ */
54
+ private static _matchesAnyPattern;
55
+ /**
56
+ * Check if a path matches a glob pattern
57
+ * Supports: *, **, and literal paths
58
+ *
59
+ * @param filePath - Normalized relative file path
60
+ * @param pattern - Glob pattern
61
+ * @returns true if path matches pattern
62
+ */
63
+ private static _matchesGlobPattern;
64
+ /**
65
+ * Validate that a path is safe and doesn't contain traversal attempts
66
+ *
67
+ * @param dirPath - Directory path to validate
68
+ * @throws SecurityError if path traversal is detected
69
+ */
70
+ private static _validatePathSafety;
71
+ }
72
+ /**
73
+ * Path utility functions
74
+ */
75
+ export declare class PathUtils {
76
+ /**
77
+ * Normalize path to use forward slashes
78
+ *
79
+ * @param filePath - Path to normalize
80
+ * @returns Normalized path
81
+ */
82
+ static normalize(filePath: string): string;
83
+ /**
84
+ * Get relative path from base directory
85
+ *
86
+ * @param filePath - Absolute file path
87
+ * @param basePath - Base directory path
88
+ * @returns Relative path
89
+ */
90
+ static getRelativePath(filePath: string, basePath: string): string;
91
+ }
92
+ //# sourceMappingURL=file-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../../src/backend/utils/file-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH;;GAEG;AACH,qBAAa,SAAS;IACpB;;;;;OAKG;WACiB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI/D;;;;;OAKG;WACW,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAInD;;;;;OAKG;WACW,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IASnD;;;;;OAKG;WACiB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKtE;;;;;;;;;OASG;WACW,SAAS,CACrB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAAE,EACpB,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,MAAM,EAAE;IAyCX;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAajC;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAmDlC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;CAoBnC;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB;;;;;OAKG;WACW,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIjD;;;;;;OAMG;WACW,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;CAG1E"}
@@ -0,0 +1,247 @@
1
+ "use strict";
2
+ /**
3
+ * Utility Functions for File Operations
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || function (mod) {
22
+ if (mod && mod.__esModule) return mod;
23
+ var result = {};
24
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
25
+ __setModuleDefault(result, mod);
26
+ return result;
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.PathUtils = exports.FileUtils = void 0;
30
+ const fs = __importStar(require("fs"));
31
+ const path = __importStar(require("path"));
32
+ const crypto = __importStar(require("crypto"));
33
+ /**
34
+ * Custom error for security violations
35
+ */
36
+ class SecurityError extends Error {
37
+ constructor(message) {
38
+ super(message);
39
+ this.name = 'SecurityError';
40
+ Object.setPrototypeOf(this, SecurityError.prototype);
41
+ }
42
+ }
43
+ /**
44
+ * File utility functions
45
+ */
46
+ class FileUtils {
47
+ /**
48
+ * Read file content asynchronously
49
+ *
50
+ * @param filePath - Path to file
51
+ * @returns File content as string
52
+ */
53
+ static async readFile(filePath) {
54
+ return fs.promises.readFile(filePath, 'utf-8');
55
+ }
56
+ /**
57
+ * Check if file exists
58
+ *
59
+ * @param filePath - Path to file
60
+ * @returns true if file exists
61
+ */
62
+ static fileExists(filePath) {
63
+ return fs.existsSync(filePath);
64
+ }
65
+ /**
66
+ * Get file size in bytes
67
+ *
68
+ * @param filePath - Path to file
69
+ * @returns File size
70
+ */
71
+ static getFileSize(filePath) {
72
+ try {
73
+ const stats = fs.statSync(filePath);
74
+ return stats.size;
75
+ }
76
+ catch {
77
+ return 0;
78
+ }
79
+ }
80
+ /**
81
+ * Compute SHA256 hash of file
82
+ *
83
+ * @param filePath - Path to file
84
+ * @returns File hash
85
+ */
86
+ static async computeFileHash(filePath) {
87
+ const content = await this.readFile(filePath);
88
+ return crypto.createHash('sha256').update(content).digest('hex');
89
+ }
90
+ /**
91
+ * Find all files matching pattern recursively
92
+ *
93
+ * @param dirPath - Directory path
94
+ * @param extensions - File extensions to match (e.g., ['.py', '.md'])
95
+ * @param includePaths - Glob patterns to include (e.g., ['**\/*.ts', 'src/**'])
96
+ * @param excludePaths - Glob patterns to exclude (e.g., ['node_modules/**', 'dist/**'])
97
+ * @returns Array of matching file paths
98
+ * @throws SecurityError if path traversal attempt is detected
99
+ */
100
+ static findFiles(dirPath, extensions, includePaths, excludePaths) {
101
+ const results = [];
102
+ if (!fs.existsSync(dirPath)) {
103
+ return results;
104
+ }
105
+ // Security check: Prevent path traversal attacks
106
+ this._validatePathSafety(dirPath);
107
+ const entries = fs.readdirSync(dirPath, { withFileTypes: true });
108
+ for (const entry of entries) {
109
+ const fullPath = path.join(dirPath, entry.name);
110
+ const relativePath = path.relative(dirPath, fullPath);
111
+ // Check if path should be excluded
112
+ if (excludePaths && this._matchesAnyPattern(relativePath, excludePaths)) {
113
+ continue;
114
+ }
115
+ if (entry.isDirectory()) {
116
+ // Recursively search subdirectories
117
+ results.push(...this.findFiles(fullPath, extensions, includePaths, excludePaths));
118
+ }
119
+ else if (entry.isFile()) {
120
+ const ext = path.extname(entry.name);
121
+ // Check if file matches extension or include patterns
122
+ const matchesExtension = extensions.includes(ext);
123
+ const matchesInclude = !includePaths || includePaths.length === 0 || this._matchesAnyPattern(relativePath, includePaths);
124
+ if (matchesExtension && matchesInclude) {
125
+ results.push(fullPath);
126
+ }
127
+ }
128
+ }
129
+ return results;
130
+ }
131
+ /**
132
+ * Check if a path matches any of the given glob patterns
133
+ *
134
+ * @param filePath - Relative file path
135
+ * @param patterns - Array of glob patterns
136
+ * @returns true if path matches any pattern
137
+ */
138
+ static _matchesAnyPattern(filePath, patterns) {
139
+ // Normalize path to use forward slashes for consistency
140
+ const normalizedPath = filePath.replace(/\\/g, '/');
141
+ for (const pattern of patterns) {
142
+ if (this._matchesGlobPattern(normalizedPath, pattern)) {
143
+ return true;
144
+ }
145
+ }
146
+ return false;
147
+ }
148
+ /**
149
+ * Check if a path matches a glob pattern
150
+ * Supports: *, **, and literal paths
151
+ *
152
+ * @param filePath - Normalized relative file path
153
+ * @param pattern - Glob pattern
154
+ * @returns true if path matches pattern
155
+ */
156
+ static _matchesGlobPattern(filePath, pattern) {
157
+ const normalizedPattern = pattern.replace(/\\/g, '/');
158
+ // Handle ** (recursive wildcard)
159
+ if (normalizedPattern.includes('**')) {
160
+ // Pattern like "node_modules/**" or "**/dist"
161
+ if (normalizedPattern.endsWith('/**')) {
162
+ const prefix = normalizedPattern.slice(0, -3);
163
+ return filePath === prefix || filePath.startsWith(prefix + '/');
164
+ }
165
+ // Pattern like "**/node_modules" or "**/dist/..." or "**/*.ts"
166
+ if (normalizedPattern.startsWith('**/')) {
167
+ const suffix = normalizedPattern.slice(3);
168
+ // For patterns like "**/*.ts", match suffix against the filename
169
+ if (suffix.includes('*')) {
170
+ const lastSlash = filePath.lastIndexOf('/');
171
+ const filename = lastSlash === -1 ? filePath : filePath.substring(lastSlash + 1);
172
+ return this._matchesGlobPattern(filename, suffix);
173
+ }
174
+ // For literal suffixes like "**/node_modules"
175
+ return (filePath === suffix ||
176
+ filePath.endsWith('/' + suffix) ||
177
+ filePath.includes('/' + suffix + '/') ||
178
+ (filePath.includes('/') && this._matchesGlobPattern(filePath.slice(filePath.indexOf('/') + 1), pattern)));
179
+ }
180
+ // Pattern is just "**"
181
+ if (normalizedPattern === '**') {
182
+ return true;
183
+ }
184
+ }
185
+ // Handle * (single level wildcard)
186
+ if (normalizedPattern.includes('*') && !normalizedPattern.includes('**')) {
187
+ // Convert glob pattern to regex: * matches anything except /
188
+ const regexPattern = normalizedPattern
189
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&') // Escape regex special chars
190
+ .replace(/\*/g, '[^/]*'); // * matches anything except /
191
+ return new RegExp(`^${regexPattern}$`).test(filePath);
192
+ }
193
+ // Literal match or exact match
194
+ return filePath === normalizedPattern || filePath.endsWith('/' + normalizedPattern);
195
+ }
196
+ /**
197
+ * Validate that a path is safe and doesn't contain traversal attempts
198
+ *
199
+ * @param dirPath - Directory path to validate
200
+ * @throws SecurityError if path traversal is detected
201
+ */
202
+ static _validatePathSafety(dirPath) {
203
+ // Resolve to absolute path to prevent traversal
204
+ const resolved = path.resolve(dirPath);
205
+ const normalized = path.normalize(resolved);
206
+ // Check for null bytes (path traversal technique)
207
+ if (normalized.includes('\0')) {
208
+ throw new SecurityError('Path contains null bytes - potential security violation');
209
+ }
210
+ // Detect common traversal patterns
211
+ if (normalized.includes('..') || normalized.includes('~')) {
212
+ // Allow only if they're part of a legitimate resolved path
213
+ // Re-verify after resolution to ensure safety
214
+ const testPath = path.resolve(resolved);
215
+ if (!testPath.startsWith(path.resolve(resolved))) {
216
+ throw new SecurityError('Path traversal detected in directory path');
217
+ }
218
+ }
219
+ }
220
+ }
221
+ exports.FileUtils = FileUtils;
222
+ /**
223
+ * Path utility functions
224
+ */
225
+ class PathUtils {
226
+ /**
227
+ * Normalize path to use forward slashes
228
+ *
229
+ * @param filePath - Path to normalize
230
+ * @returns Normalized path
231
+ */
232
+ static normalize(filePath) {
233
+ return filePath.replace(/\\/g, '/');
234
+ }
235
+ /**
236
+ * Get relative path from base directory
237
+ *
238
+ * @param filePath - Absolute file path
239
+ * @param basePath - Base directory path
240
+ * @returns Relative path
241
+ */
242
+ static getRelativePath(filePath, basePath) {
243
+ return path.relative(basePath, filePath);
244
+ }
245
+ }
246
+ exports.PathUtils = PathUtils;
247
+ //# sourceMappingURL=file-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../../src/backend/utils/file-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function setupMCP(): Promise<{
2
+ projectDir: string;
3
+ }>;
4
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAqBA,wBAAsB,QAAQ,IAAI,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAmGhE"}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.setupMCP = void 0;
27
+ const fs = __importStar(require("fs"));
28
+ const path = __importStar(require("path"));
29
+ const readline = __importStar(require("readline"));
30
+ const child_process_1 = require("child_process");
31
+ const uuid_1 = require("uuid");
32
+ const ngao_search_service_1 = require("../backend/services/ngao-search-service");
33
+ const rl = readline.createInterface({
34
+ input: process.stdin,
35
+ output: process.stdout,
36
+ });
37
+ function question(prompt) {
38
+ return new Promise((resolve) => {
39
+ rl.question(prompt, (answer) => {
40
+ resolve(answer);
41
+ });
42
+ });
43
+ }
44
+ async function setupMCP() {
45
+ console.log('\nšŸ”§ NGAO Search - MCP Setup for Claude Code\n');
46
+ // Ask for project directory
47
+ const projectDir = await question('šŸ“ Enter your project directory path (or press Enter for current): ');
48
+ const resolvedProjectDir = projectDir.trim() || process.cwd();
49
+ // Create .ngao-search config in project
50
+ const projectConfigPath = path.join(resolvedProjectDir, '.ngao-search.json');
51
+ if (!fs.existsSync(projectConfigPath)) {
52
+ // Generate UUID for this project to isolate its database
53
+ const projectUUID = (0, uuid_1.v4)();
54
+ const projectConfig = {
55
+ projectId: projectUUID,
56
+ includePaths: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx', '**/*.py', '**/*.md'],
57
+ excludePaths: ['node_modules/**', 'dist/**', '.git/**'],
58
+ };
59
+ fs.writeFileSync(projectConfigPath, JSON.stringify(projectConfig, null, 2));
60
+ console.log(`āœ… Project config created: ${projectConfigPath}`);
61
+ console.log(`šŸ“‹ Project ID: ${projectUUID}`);
62
+ }
63
+ // Create .mcp-config.json in project for reference
64
+ const mcpConfigPath = path.join(resolvedProjectDir, '.mcp-config.json');
65
+ const mcpConfig = {
66
+ mcpServers: {
67
+ 'ngao-search': {
68
+ command: 'npx',
69
+ args: ['ngao-search'],
70
+ env: {
71
+ NGAO_SEARCH_PROJECT: resolvedProjectDir,
72
+ MCP_TRANSPORT: 'stdio',
73
+ },
74
+ },
75
+ },
76
+ };
77
+ fs.writeFileSync(mcpConfigPath, JSON.stringify(mcpConfig, null, 2));
78
+ console.log(`āœ… MCP config created: ${mcpConfigPath}`);
79
+ // Register with Claude Code CLI using `claude mcp add`
80
+ try {
81
+ console.log('\nšŸ“” Registering with Claude Code CLI...');
82
+ (0, child_process_1.execSync)(`cd "${resolvedProjectDir}" && claude mcp add -e NGAO_SEARCH_PROJECT="${resolvedProjectDir}" -e MCP_TRANSPORT=stdio -- ngao-search npx ngao-search`, { stdio: 'pipe' });
83
+ console.log('āœ… MCP server registered with Claude Code CLI');
84
+ }
85
+ catch (error) {
86
+ console.log('āš ļø Could not auto-register with Claude Code CLI.');
87
+ console.log(' Please run this command manually in your project directory:');
88
+ console.log(`\n cd "${resolvedProjectDir}"`);
89
+ console.log(' claude mcp add -e NGAO_SEARCH_PROJECT="' + resolvedProjectDir + '" -e MCP_TRANSPORT=stdio -- ngao-search npx ngao-search\n');
90
+ }
91
+ // Initialize database (embedding model will lazy-load on first search)
92
+ console.log('\nāš™ļø Initializing database...');
93
+ let searchService = null;
94
+ try {
95
+ searchService = new ngao_search_service_1.NgaoSearchService(resolvedProjectDir);
96
+ await searchService.ensureInitialized();
97
+ console.log('āœ… Database initialized');
98
+ console.log(' Embedding model will load on first search');
99
+ }
100
+ catch (error) {
101
+ console.warn('āš ļø Warning: Could not initialize database');
102
+ console.warn(` Error: ${String(error)}`);
103
+ console.log(' Database will be initialized on first use instead.\n');
104
+ }
105
+ // Auto-index the project directory
106
+ if (searchService) {
107
+ console.log('\nšŸ“‘ Auto-indexing project directory...');
108
+ try {
109
+ const indexResult = await searchService.autoIndexProjectDirectory(resolvedProjectDir);
110
+ if (indexResult.success && indexResult.stats) {
111
+ console.log('āœ… Auto-indexing completed');
112
+ console.log(` šŸ“Š Indexed ${indexResult.stats.totalFiles} files with ${indexResult.stats.totalBlocks} code blocks`);
113
+ }
114
+ else {
115
+ console.warn(`āš ļø Auto-indexing encountered issues: ${indexResult.error || 'Unknown error'}`);
116
+ console.log(' You can manually index later using the search tools\n');
117
+ }
118
+ }
119
+ catch (error) {
120
+ console.warn('āš ļø Warning: Could not auto-index project directory');
121
+ console.warn(` Error: ${String(error)}`);
122
+ console.log(' You can manually index later using the search tools\n');
123
+ }
124
+ }
125
+ // Show setup instructions
126
+ console.log('\nšŸ“ Setup Complete!\n');
127
+ console.log('✨ NGAO Search is now integrated with Claude Code');
128
+ console.log('\nā„¹ļø Configuration Details:');
129
+ console.log('šŸ“ Project directory: ' + resolvedProjectDir);
130
+ console.log('šŸ”Œ Server port: Automatically assigned');
131
+ console.log('šŸ“Œ Project config: ' + projectConfigPath);
132
+ console.log('šŸ“Œ MCP config: ' + mcpConfigPath + '\n');
133
+ console.log('šŸš€ You can now use NGAO Search in Claude Code!\n');
134
+ rl.close();
135
+ return { projectDir: resolvedProjectDir };
136
+ }
137
+ exports.setupMCP = setupMCP;
138
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * NGAO Search - Main Entry Point
3
+ * Re-exports from backend for backward compatibility
4
+ */
5
+ export * from './backend';
6
+ //# sourceMappingURL=index.d.ts.map