@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.
- package/.claude/settings.local.json +10 -0
- package/.env.example +7 -0
- package/.eslintrc.json +20 -0
- package/.github/workflows/build.yml +39 -0
- package/.github/workflows/release.yml +34 -0
- package/.github/workflows/test.yml +35 -0
- package/.mcp-config.json +14 -0
- package/.prettierrc.json +10 -0
- package/LICENSE +17 -0
- package/Makefile +26 -0
- package/README.md +57 -172
- package/config.example.json +8 -0
- package/dist/backend/api/search-engine.d.ts +40 -0
- package/dist/backend/api/search-engine.d.ts.map +1 -0
- package/dist/backend/api/search-engine.js +227 -0
- package/dist/backend/api/search-engine.js.map +1 -0
- package/dist/backend/core/block-impl.d.ts +32 -0
- package/dist/backend/core/block-impl.d.ts.map +1 -0
- package/dist/backend/core/block-impl.js +33 -0
- package/dist/backend/core/block-impl.js.map +1 -0
- package/dist/backend/core/config-loader.d.ts +68 -0
- package/dist/backend/core/config-loader.d.ts.map +1 -0
- package/dist/backend/core/config-loader.js +234 -0
- package/dist/backend/core/config-loader.js.map +1 -0
- package/dist/backend/core/constants.d.ts +39 -0
- package/dist/backend/core/constants.d.ts.map +1 -0
- package/dist/backend/core/constants.js +57 -0
- package/dist/backend/core/constants.js.map +1 -0
- package/dist/backend/core/enums.d.ts +54 -0
- package/dist/backend/core/enums.d.ts.map +1 -0
- package/dist/backend/core/enums.js +61 -0
- package/dist/backend/core/enums.js.map +1 -0
- package/dist/backend/core/errors.d.ts +83 -0
- package/dist/backend/core/errors.d.ts.map +1 -0
- package/dist/backend/core/errors.js +151 -0
- package/dist/backend/core/errors.js.map +1 -0
- package/dist/backend/core/logger.d.ts +68 -0
- package/dist/backend/core/logger.d.ts.map +1 -0
- package/dist/backend/core/logger.js +151 -0
- package/dist/backend/core/logger.js.map +1 -0
- package/dist/backend/core/models.d.ts +332 -0
- package/dist/backend/core/models.d.ts.map +1 -0
- package/dist/backend/core/models.js +6 -0
- package/dist/backend/core/models.js.map +1 -0
- package/dist/backend/core/service-types.d.ts +184 -0
- package/dist/backend/core/service-types.d.ts.map +1 -0
- package/dist/backend/core/service-types.js +7 -0
- package/dist/backend/core/service-types.js.map +1 -0
- package/dist/backend/core/types.d.ts +219 -0
- package/dist/backend/core/types.d.ts.map +1 -0
- package/dist/backend/core/types.js +109 -0
- package/dist/backend/core/types.js.map +1 -0
- package/dist/backend/index.d.ts +5 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +13 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/indexing/block-extractor.d.ts +22 -0
- package/dist/backend/indexing/block-extractor.d.ts.map +1 -0
- package/dist/backend/indexing/block-extractor.js +52 -0
- package/dist/backend/indexing/block-extractor.js.map +1 -0
- package/dist/backend/indexing/index-builder.d.ts +26 -0
- package/dist/backend/indexing/index-builder.d.ts.map +1 -0
- package/dist/backend/indexing/index-builder.js +71 -0
- package/dist/backend/indexing/index-builder.js.map +1 -0
- package/dist/backend/parsers/base-file-parser.d.ts +134 -0
- package/dist/backend/parsers/base-file-parser.d.ts.map +1 -0
- package/dist/backend/parsers/base-file-parser.js +149 -0
- package/dist/backend/parsers/base-file-parser.js.map +1 -0
- package/dist/backend/parsers/javascript-parser.d.ts +36 -0
- package/dist/backend/parsers/javascript-parser.d.ts.map +1 -0
- package/dist/backend/parsers/javascript-parser.js +194 -0
- package/dist/backend/parsers/javascript-parser.js.map +1 -0
- package/dist/backend/parsers/json-parser.d.ts +15 -0
- package/dist/backend/parsers/json-parser.d.ts.map +1 -0
- package/dist/backend/parsers/json-parser.js +75 -0
- package/dist/backend/parsers/json-parser.js.map +1 -0
- package/dist/backend/parsers/markdown-parser.d.ts +17 -0
- package/dist/backend/parsers/markdown-parser.d.ts.map +1 -0
- package/dist/backend/parsers/markdown-parser.js +94 -0
- package/dist/backend/parsers/markdown-parser.js.map +1 -0
- package/dist/backend/parsers/parser-factory.d.ts +43 -0
- package/dist/backend/parsers/parser-factory.d.ts.map +1 -0
- package/dist/backend/parsers/parser-factory.js +149 -0
- package/dist/backend/parsers/parser-factory.js.map +1 -0
- package/dist/backend/parsers/python-parser.d.ts +21 -0
- package/dist/backend/parsers/python-parser.d.ts.map +1 -0
- package/dist/backend/parsers/python-parser.js +185 -0
- package/dist/backend/parsers/python-parser.js.map +1 -0
- package/dist/backend/parsers/yaml-parser.d.ts +16 -0
- package/dist/backend/parsers/yaml-parser.d.ts.map +1 -0
- package/dist/backend/parsers/yaml-parser.js +81 -0
- package/dist/backend/parsers/yaml-parser.js.map +1 -0
- package/dist/backend/repositories/implementations/lancedb-block-repository.d.ts +125 -0
- package/dist/backend/repositories/implementations/lancedb-block-repository.d.ts.map +1 -0
- package/dist/backend/repositories/implementations/lancedb-block-repository.js +505 -0
- package/dist/backend/repositories/implementations/lancedb-block-repository.js.map +1 -0
- package/dist/backend/repositories/implementations/lancedb-metadata-repository.d.ts +107 -0
- package/dist/backend/repositories/implementations/lancedb-metadata-repository.d.ts.map +1 -0
- package/dist/backend/repositories/implementations/lancedb-metadata-repository.js +275 -0
- package/dist/backend/repositories/implementations/lancedb-metadata-repository.js.map +1 -0
- package/dist/backend/repositories/implementations/memory-cache.d.ts +18 -0
- package/dist/backend/repositories/implementations/memory-cache.d.ts.map +1 -0
- package/dist/backend/repositories/implementations/memory-cache.js +53 -0
- package/dist/backend/repositories/implementations/memory-cache.js.map +1 -0
- package/dist/backend/repositories/repository.interface.d.ts +334 -0
- package/dist/backend/repositories/repository.interface.d.ts.map +1 -0
- package/dist/backend/repositories/repository.interface.js +7 -0
- package/dist/backend/repositories/repository.interface.js.map +1 -0
- package/dist/backend/search/context-extractor.d.ts +29 -0
- package/dist/backend/search/context-extractor.d.ts.map +1 -0
- package/dist/backend/search/context-extractor.js +106 -0
- package/dist/backend/search/context-extractor.js.map +1 -0
- package/dist/backend/search/multi-index-searcher.d.ts +28 -0
- package/dist/backend/search/multi-index-searcher.d.ts.map +1 -0
- package/dist/backend/search/multi-index-searcher.js +81 -0
- package/dist/backend/search/multi-index-searcher.js.map +1 -0
- package/dist/backend/search/query-parser.d.ts +37 -0
- package/dist/backend/search/query-parser.d.ts.map +1 -0
- package/dist/backend/search/query-parser.js +145 -0
- package/dist/backend/search/query-parser.js.map +1 -0
- package/dist/backend/search/ranking-engine.d.ts +31 -0
- package/dist/backend/search/ranking-engine.d.ts.map +1 -0
- package/dist/backend/search/ranking-engine.js +165 -0
- package/dist/backend/search/ranking-engine.js.map +1 -0
- package/dist/backend/search/result-formatter.d.ts +29 -0
- package/dist/backend/search/result-formatter.d.ts.map +1 -0
- package/dist/backend/search/result-formatter.js +70 -0
- package/dist/backend/search/result-formatter.js.map +1 -0
- package/dist/backend/service-types.d.ts +184 -0
- package/dist/backend/service-types.d.ts.map +1 -0
- package/dist/backend/service-types.js +7 -0
- package/dist/backend/service-types.js.map +1 -0
- package/dist/backend/services/embedding-service.d.ts +75 -0
- package/dist/backend/services/embedding-service.d.ts.map +1 -0
- package/dist/backend/services/embedding-service.js +298 -0
- package/dist/backend/services/embedding-service.js.map +1 -0
- package/dist/backend/services/file-watcher.d.ts +17 -0
- package/dist/backend/services/file-watcher.d.ts.map +1 -0
- package/dist/backend/services/file-watcher.js +92 -0
- package/dist/backend/services/file-watcher.js.map +1 -0
- package/dist/backend/services/index-information-service.d.ts +114 -0
- package/dist/backend/services/index-information-service.d.ts.map +1 -0
- package/dist/backend/services/index-information-service.js +104 -0
- package/dist/backend/services/index-information-service.js.map +1 -0
- package/dist/backend/services/ngao-search-service.d.ts +107 -0
- package/dist/backend/services/ngao-search-service.d.ts.map +1 -0
- package/dist/backend/services/ngao-search-service.js +384 -0
- package/dist/backend/services/ngao-search-service.js.map +1 -0
- package/dist/backend/services/quantization-service.d.ts +53 -0
- package/dist/backend/services/quantization-service.d.ts.map +1 -0
- package/dist/backend/services/quantization-service.js +84 -0
- package/dist/backend/services/quantization-service.js.map +1 -0
- package/dist/backend/services/reindex-manager.d.ts +25 -0
- package/dist/backend/services/reindex-manager.d.ts.map +1 -0
- package/dist/backend/services/reindex-manager.js +78 -0
- package/dist/backend/services/reindex-manager.js.map +1 -0
- package/dist/backend/services/session-manager.d.ts +115 -0
- package/dist/backend/services/session-manager.d.ts.map +1 -0
- package/dist/backend/services/session-manager.js +150 -0
- package/dist/backend/services/session-manager.js.map +1 -0
- package/dist/backend/services/vector-search-service.d.ts +81 -0
- package/dist/backend/services/vector-search-service.d.ts.map +1 -0
- package/dist/backend/services/vector-search-service.js +143 -0
- package/dist/backend/services/vector-search-service.js.map +1 -0
- package/dist/backend/utils/file-utils.d.ts +92 -0
- package/dist/backend/utils/file-utils.d.ts.map +1 -0
- package/dist/backend/utils/file-utils.js +247 -0
- package/dist/backend/utils/file-utils.js.map +1 -0
- package/dist/cli/setup.d.ts +4 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +138 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +14 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +7 -67075
- package/dist/main.js.map +1 -0
- package/dist/mcp/tool-schemas.d.ts +205 -0
- package/dist/mcp/tool-schemas.d.ts.map +1 -0
- package/dist/mcp/tool-schemas.js +391 -0
- package/dist/mcp/tool-schemas.js.map +1 -0
- package/dist/server/logger.d.ts +50 -0
- package/dist/server/logger.d.ts.map +1 -0
- package/dist/server/logger.js +77 -0
- package/dist/server/logger.js.map +1 -0
- package/dist/server/tool-registry.d.ts +64 -0
- package/dist/server/tool-registry.d.ts.map +1 -0
- package/dist/server/tool-registry.js +93 -0
- package/dist/server/tool-registry.js.map +1 -0
- package/dist/server/transports/mcp-transport.d.ts +31 -0
- package/dist/server/transports/mcp-transport.d.ts.map +1 -0
- package/dist/server/transports/mcp-transport.js +331 -0
- package/dist/server/transports/mcp-transport.js.map +1 -0
- package/dist/server/transports/rest-transport.d.ts +36 -0
- package/dist/server/transports/rest-transport.d.ts.map +1 -0
- package/dist/server/transports/rest-transport.js +250 -0
- package/dist/server/transports/rest-transport.js.map +1 -0
- package/docs/API.md +116 -0
- package/docs/ARCHITECTURE.md +101 -0
- package/docs/FILE_WATCHING.md +120 -0
- package/docs/INSTALLATION.md +87 -0
- package/docs/MCP_INTEGRATION.md +108 -0
- package/docs/README.md +288 -0
- package/docs/USAGE.md +123 -0
- package/docs/architecture-design-standards/01_ARCHITECTURE.md +863 -0
- package/docs/architecture-design-standards/02_SEARCH_ENGINE_DESIGN.md +958 -0
- package/docs/architecture-design-standards/03_DATAFLOW.md +1000 -0
- package/docs/architecture-design-standards/04_VISUAL_GUIDE.md +922 -0
- package/docs/architecture-design-standards/05_REPOSITORY_PATTERN_GUIDE.md +503 -0
- package/docs/architecture-design-standards/06_IMPLEMENTATION_PATTERNS.md +1026 -0
- package/docs/architecture-design-standards/07_TYPESCRIPT_GUIDE.md +1027 -0
- package/docs/architecture-design-standards/08_CODING_STANDARDS.md +1274 -0
- package/docs/reference/01_START_HERE.md +108 -0
- package/docs/reference/02_QUICK_REFERENCE.md +363 -0
- package/docs/reference/03_DOCUMENTATION_INDEX.md +293 -0
- package/docs/reference/04_DELIVERY_SUMMARY.md +463 -0
- package/docs/reference/05_IMPLEMENTATION_OVERVIEW.md +319 -0
- package/docs/reference/06_RESEARCH_SUMMARY.md +519 -0
- package/docs/tracking/03_IMPLEMENTATION_ROADMAP.md +788 -0
- package/jest.config.json +12 -0
- package/package.json +46 -53
- package/prepend-shebang.js +18 -0
- package/scripts/setup-mcp.sh +66 -0
- package/src/backend/index.ts +5 -0
- package/src/backend/service-types.ts +219 -0
- package/src/backend/services/file-watcher.ts +79 -0
- package/src/backend/services/ngao-search-service.ts +430 -0
- package/src/backend/services/reindex-manager.ts +90 -0
- package/src/backend/services/session-manager.ts +214 -0
- package/src/cli/setup.ts +122 -0
- package/src/index.ts +6 -0
- package/src/main.ts +225 -0
- package/src/mcp/tool-schemas.ts +439 -0
- package/src/server/logger.ts +88 -0
- package/src/server/tool-registry.ts +117 -0
- package/src/server/transports/mcp-transport.ts +374 -0
- package/src/server/transports/rest-transport.ts +258 -0
- package/tests/unit/agent-tools.test.ts +454 -0
- package/tests/unit/file-watcher.test.d.ts +2 -0
- package/tests/unit/file-watcher.test.d.ts.map +1 -0
- package/tests/unit/file-watcher.test.js +9 -0
- package/tests/unit/file-watcher.test.js.map +1 -0
- package/tests/unit/file-watcher.test.ts +7 -0
- package/tests/unit/search-integration.test.ts +256 -0
- package/tests/unit/services.test.d.ts +2 -0
- package/tests/unit/services.test.d.ts.map +1 -0
- package/tests/unit/services.test.js +9 -0
- package/tests/unit/services.test.js.map +1 -0
- package/tests/unit/services.test.ts +7 -0
- package/tsconfig.json +23 -0
- package/webpack.backend.config.js +60 -0
- package/webpack.config.js +34 -0
- package/models/Xenova/all-MiniLM-L6-v2/config.json +0 -25
- package/models/Xenova/all-MiniLM-L6-v2/onnx/model_quantized.onnx +0 -0
- package/models/Xenova/all-MiniLM-L6-v2/tokenizer.json +0 -30686
- 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 @@
|
|
|
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"}
|