@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,256 @@
1
+ import { NgaoSearchService } from '../../src/backend/services/ngao-search-service';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import * as os from 'os';
5
+
6
+ describe('Search Integration Tests', () => {
7
+ let service: NgaoSearchService;
8
+ let testProjectDir: string;
9
+ let testCacheDir: string;
10
+
11
+ beforeAll(async () => {
12
+ // Create a temporary test project directory
13
+ testProjectDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ngao-search-test-'));
14
+ testCacheDir = path.join(testProjectDir, '.ngao');
15
+
16
+ // Create test files to index
17
+ const srcDir = path.join(testProjectDir, 'src');
18
+ fs.mkdirSync(srcDir, { recursive: true });
19
+
20
+ // Create a sample TypeScript file
21
+ fs.writeFileSync(
22
+ path.join(srcDir, 'example.ts'),
23
+ `
24
+ export function calculateSum(a: number, b: number): number {
25
+ return a + b;
26
+ }
27
+
28
+ export class Calculator {
29
+ multiply(x: number, y: number): number {
30
+ return x * y;
31
+ }
32
+
33
+ divide(x: number, y: number): number {
34
+ if (y === 0) throw new Error('Division by zero');
35
+ return x / y;
36
+ }
37
+ }
38
+
39
+ export const PI = 3.14159;
40
+ `
41
+ );
42
+
43
+ // Create a sample JavaScript file
44
+ fs.writeFileSync(
45
+ path.join(srcDir, 'utils.js'),
46
+ `
47
+ function greet(name) {
48
+ return \`Hello, \${name}!\`;
49
+ }
50
+
51
+ function farewell(name) {
52
+ return \`Goodbye, \${name}!\`;
53
+ }
54
+
55
+ module.exports = { greet, farewell };
56
+ `
57
+ );
58
+
59
+ // Create a sample Markdown file
60
+ fs.writeFileSync(
61
+ path.join(srcDir, 'README.md'),
62
+ `
63
+ # Test Project
64
+
65
+ This is a test project for ngao-search integration testing.
66
+
67
+ ## Features
68
+
69
+ - Fast semantic search
70
+ - Multi-language support
71
+ - Indexing with embeddings
72
+
73
+ ## Usage
74
+
75
+ \`\`\`typescript
76
+ const service = new NgaoSearchService();
77
+ await service.index('./src');
78
+ const results = await service.search({ query: 'calculate' });
79
+ \`\`\`
80
+ `
81
+ );
82
+
83
+ // Create service instance with test project
84
+ service = new NgaoSearchService(testProjectDir);
85
+ });
86
+
87
+ afterAll(() => {
88
+ // Clean up test files
89
+ if (fs.existsSync(testProjectDir)) {
90
+ fs.rmSync(testProjectDir, { recursive: true, force: true });
91
+ }
92
+ });
93
+
94
+ describe('Index and Search Workflow', () => {
95
+ it('should index a directory and return stats', async () => {
96
+ const indexResult = await service.index({
97
+ dirPath: path.join(testProjectDir, 'src'),
98
+ });
99
+
100
+ expect(indexResult.success).toBe(true);
101
+ if (indexResult.success) {
102
+ expect(indexResult.stats).toBeDefined();
103
+ expect(indexResult.stats.totalFiles).toBeGreaterThan(0);
104
+ expect(indexResult.stats.totalBlocks).toBeGreaterThan(0);
105
+ }
106
+ });
107
+
108
+ it('should search for indexed content after indexing', async () => {
109
+ // First ensure index is populated
110
+ await service.index({
111
+ dirPath: path.join(testProjectDir, 'src'),
112
+ });
113
+
114
+ // Search for something that should be indexed
115
+ const searchResult = await service.search({
116
+ query: 'calculate',
117
+ maxResults: 5,
118
+ });
119
+
120
+ expect(searchResult.success).toBe(true);
121
+ if (searchResult.success) {
122
+ expect(searchResult.resultCount).toBeGreaterThanOrEqual(0);
123
+ expect(searchResult.results).toBeDefined();
124
+ expect(Array.isArray(searchResult.results)).toBe(true);
125
+ }
126
+ });
127
+
128
+ it('should return results with expected structure', async () => {
129
+ await service.index({
130
+ dirPath: path.join(testProjectDir, 'src'),
131
+ });
132
+
133
+ const searchResult = await service.search({
134
+ query: 'function',
135
+ maxResults: 10,
136
+ });
137
+
138
+ if (searchResult.success && searchResult.results && searchResult.results.length > 0) {
139
+ const result = searchResult.results[0];
140
+ expect(result).toHaveProperty('rank');
141
+ expect(result).toHaveProperty('score');
142
+ expect(result).toHaveProperty('type');
143
+ expect(result).toHaveProperty('name');
144
+ expect(result).toHaveProperty('file');
145
+ expect(result).toHaveProperty('lineRange');
146
+ expect(result).toHaveProperty('scope');
147
+ expect(result).toHaveProperty('content');
148
+ }
149
+ });
150
+
151
+ it('should get statistics about indexed content', async () => {
152
+ await service.index({
153
+ dirPath: path.join(testProjectDir, 'src'),
154
+ });
155
+
156
+ const stats = await service.getStats();
157
+
158
+ expect(stats.success).toBe(true);
159
+ if (stats.success) {
160
+ expect(stats.stats).toBeDefined();
161
+ expect(stats.stats.totalFiles).toBeGreaterThan(0);
162
+ expect(stats.stats.totalBlocks).toBeGreaterThan(0);
163
+ expect(stats.stats.lastUpdated).toBeDefined();
164
+ }
165
+ });
166
+
167
+ it('should create a session and track search history', () => {
168
+ const sessionResponse = service.createSession();
169
+
170
+ expect(sessionResponse.sessionId).toBeDefined();
171
+ expect(typeof sessionResponse.sessionId).toBe('string');
172
+ expect(sessionResponse.sessionId.length).toBeGreaterThan(0);
173
+ });
174
+
175
+ it('should track searches in session history', async () => {
176
+ await service.index({
177
+ dirPath: path.join(testProjectDir, 'src'),
178
+ });
179
+
180
+ // Create a session
181
+ const sessionResponse = service.createSession();
182
+ const sessionId = sessionResponse.sessionId;
183
+
184
+ // Perform a search with session ID
185
+ const searchResult = await service.search({
186
+ query: 'test',
187
+ sessionId,
188
+ });
189
+
190
+ expect(searchResult.success).toBe(true);
191
+
192
+ // Get search history
193
+ const historyResult = service.getSearchHistory({ sessionId });
194
+
195
+ expect(historyResult.success).toBe(true);
196
+ if (historyResult.success && historyResult.data) {
197
+ expect(Array.isArray(historyResult.data)).toBe(true);
198
+ expect((historyResult.data as any[]).length).toBeGreaterThan(0);
199
+ }
200
+ });
201
+
202
+ it('should handle searches with no results gracefully', async () => {
203
+ await service.index({
204
+ dirPath: path.join(testProjectDir, 'src'),
205
+ });
206
+
207
+ const searchResult = await service.search({
208
+ query: 'xyzabc123nonexistentquery',
209
+ maxResults: 5,
210
+ });
211
+
212
+ expect(searchResult.success).toBe(true);
213
+ if (searchResult.success) {
214
+ expect(searchResult.resultCount).toBe(0);
215
+ expect(Array.isArray(searchResult.results)).toBe(true);
216
+ }
217
+ });
218
+
219
+ it('should list indexed directories', async () => {
220
+ await service.index({
221
+ dirPath: path.join(testProjectDir, 'src'),
222
+ });
223
+
224
+ const listResult = await service.listIndexedDirs();
225
+
226
+ expect(listResult.success).toBe(true);
227
+ if (listResult.success && listResult.data) {
228
+ expect(Array.isArray(listResult.data)).toBe(true);
229
+ }
230
+ });
231
+
232
+ it('should get index information', async () => {
233
+ await service.index({
234
+ dirPath: path.join(testProjectDir, 'src'),
235
+ });
236
+
237
+ const infoResult = await service.getIndexInfo();
238
+
239
+ expect(infoResult.success).toBe(true);
240
+ if (infoResult.success) {
241
+ expect(infoResult.data).toBeDefined();
242
+ }
243
+ });
244
+ });
245
+
246
+ describe('Cache Management', () => {
247
+ it('should use cache directory for indexed data', async () => {
248
+ await service.index({
249
+ dirPath: path.join(testProjectDir, 'src'),
250
+ });
251
+
252
+ // Check that cache directory was created
253
+ expect(fs.existsSync(testCacheDir)).toBe(true);
254
+ });
255
+ });
256
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=services.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.test.d.ts","sourceRoot":"","sources":["services.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const ngao_search_service_1 = require("../../src/backend/services/ngao-search-service");
4
+ describe('NgaoSearchService', () => {
5
+ it('should be defined', () => {
6
+ expect(ngao_search_service_1.NgaoSearchService).toBeDefined();
7
+ });
8
+ });
9
+ //# sourceMappingURL=services.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.test.js","sourceRoot":"","sources":["services.test.ts"],"names":[],"mappings":";;AAAA,wFAAkF;AAElF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,uCAAiB,CAAC,CAAC,WAAW,EAAE,CAAA;IACzC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { NgaoSearchService } from '../../src/backend/services/ngao-search-service'
2
+
3
+ describe('NgaoSearchService', () => {
4
+ it('should be defined', () => {
5
+ expect(NgaoSearchService).toBeDefined()
6
+ })
7
+ })
package/tsconfig.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "commonjs",
5
+ "lib": ["ES2020", "DOM"],
6
+ "types": ["node", "jest"],
7
+ "outDir": "./dist",
8
+ "rootDir": "./src",
9
+ "declaration": true,
10
+ "declarationMap": true,
11
+ "sourceMap": true,
12
+ "strict": true,
13
+ "esModuleInterop": true,
14
+ "skipLibCheck": true,
15
+ "forceConsistentCasingInFileNames": true,
16
+ "resolveJsonModule": true,
17
+ "moduleResolution": "node",
18
+ "experimentalDecorators": true,
19
+ "emitDecoratorMetadata": true
20
+ },
21
+ "include": ["src"],
22
+ "exclude": ["node_modules", "dist"]
23
+ }
@@ -0,0 +1,60 @@
1
+ const path = require('path');
2
+ const nodeExternals = require('webpack-node-externals');
3
+
4
+ const baseConfig = {
5
+ target: 'node',
6
+ entry: './src/main.ts',
7
+ resolve: {
8
+ extensions: ['.ts', '.tsx', '.js', '.jsx'],
9
+ alias: {
10
+ '@': path.resolve(__dirname, 'src'),
11
+ },
12
+ },
13
+ module: {
14
+ rules: [
15
+ {
16
+ test: /\.tsx?$/,
17
+ use: [
18
+ {
19
+ loader: 'ts-loader',
20
+ options: {
21
+ configFile: 'tsconfig.json',
22
+ },
23
+ },
24
+ ],
25
+ exclude: /node_modules/,
26
+ },
27
+ ],
28
+ },
29
+ devtool: process.env.NODE_ENV === 'production' ? false : 'source-map',
30
+ optimization: {
31
+ minimize: process.env.NODE_ENV === 'production',
32
+ },
33
+ };
34
+
35
+ // MCP CLI build - all dependencies included (except native modules)
36
+ const config = {
37
+ ...baseConfig,
38
+ mode: 'production',
39
+ output: {
40
+ path: path.resolve(__dirname, 'dist'),
41
+ filename: 'main.js',
42
+ libraryTarget: 'commonjs2',
43
+ },
44
+ externals: [
45
+ // Keep external native binary modules that can't be bundled
46
+ ({ request }, callback) => {
47
+ // Allow .node files to be loaded at runtime
48
+ if (request && request.endsWith('.node')) {
49
+ return callback(null, `commonjs ${request}`);
50
+ }
51
+ // Keep native module packages external
52
+ if (request && /^(@xenova\/transformers|onnxruntime-node|sharp|@lancedb\/lancedb)/.test(request)) {
53
+ return callback(null, `commonjs ${request}`);
54
+ }
55
+ callback();
56
+ },
57
+ ],
58
+ };
59
+
60
+ module.exports = config;
@@ -0,0 +1,34 @@
1
+ const path = require('path');
2
+
3
+ module.exports = {
4
+ entry: './src/main.ts',
5
+ target: 'node',
6
+ mode: 'production',
7
+ module: {
8
+ rules: [
9
+ {
10
+ test: /\.ts$/,
11
+ use: 'ts-loader',
12
+ exclude: /node_modules/,
13
+ },
14
+ {
15
+ test: /\.node$/,
16
+ loader: 'node-loader',
17
+ },
18
+ ],
19
+ },
20
+ resolve: {
21
+ extensions: ['.ts', '.js', '.node'],
22
+ },
23
+ output: {
24
+ filename: 'main.js',
25
+ path: path.resolve(__dirname, 'dist'),
26
+ },
27
+ externals: {
28
+ '@ngao/search-core': 'commonjs @ngao/search-core',
29
+ '@modelcontextprotocol/sdk': 'commonjs @modelcontextprotocol/sdk',
30
+ '@lancedb/lancedb': 'commonjs @lancedb/lancedb',
31
+ 'express': 'commonjs express',
32
+ 'chokidar': 'commonjs chokidar',
33
+ },
34
+ };
@@ -1,25 +0,0 @@
1
- {
2
- "_name_or_path": "sentence-transformers/all-MiniLM-L6-v2",
3
- "architectures": [
4
- "BertModel"
5
- ],
6
- "attention_probs_dropout_prob": 0.1,
7
- "classifier_dropout": null,
8
- "gradient_checkpointing": false,
9
- "hidden_act": "gelu",
10
- "hidden_dropout_prob": 0.1,
11
- "hidden_size": 384,
12
- "initializer_range": 0.02,
13
- "intermediate_size": 1536,
14
- "layer_norm_eps": 1e-12,
15
- "max_position_embeddings": 512,
16
- "model_type": "bert",
17
- "num_attention_heads": 12,
18
- "num_hidden_layers": 6,
19
- "pad_token_id": 0,
20
- "position_embedding_type": "absolute",
21
- "transformers_version": "4.29.2",
22
- "type_vocab_size": 2,
23
- "use_cache": true,
24
- "vocab_size": 30522
25
- }