@nahisaho/musubix-codegraph 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +187 -0
  2. package/dist/codegraph.d.ts +218 -0
  3. package/dist/codegraph.d.ts.map +1 -0
  4. package/dist/codegraph.js +429 -0
  5. package/dist/codegraph.js.map +1 -0
  6. package/dist/events/event-emitter.d.ts +93 -0
  7. package/dist/events/event-emitter.d.ts.map +1 -0
  8. package/dist/events/event-emitter.js +152 -0
  9. package/dist/events/event-emitter.js.map +1 -0
  10. package/dist/events/index.d.ts +8 -0
  11. package/dist/events/index.d.ts.map +1 -0
  12. package/dist/events/index.js +8 -0
  13. package/dist/events/index.js.map +1 -0
  14. package/dist/graph/graph-engine.d.ts +97 -0
  15. package/dist/graph/graph-engine.d.ts.map +1 -0
  16. package/dist/graph/graph-engine.js +341 -0
  17. package/dist/graph/graph-engine.js.map +1 -0
  18. package/dist/graph/index.d.ts +8 -0
  19. package/dist/graph/index.d.ts.map +1 -0
  20. package/dist/graph/index.js +8 -0
  21. package/dist/graph/index.js.map +1 -0
  22. package/dist/graphrag/graphrag-search.d.ts +67 -0
  23. package/dist/graphrag/graphrag-search.d.ts.map +1 -0
  24. package/dist/graphrag/graphrag-search.js +297 -0
  25. package/dist/graphrag/graphrag-search.js.map +1 -0
  26. package/dist/graphrag/index.d.ts +8 -0
  27. package/dist/graphrag/index.d.ts.map +1 -0
  28. package/dist/graphrag/index.js +8 -0
  29. package/dist/graphrag/index.js.map +1 -0
  30. package/dist/index.d.ts +18 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +20 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/indexer/index.d.ts +8 -0
  35. package/dist/indexer/index.d.ts.map +1 -0
  36. package/dist/indexer/index.js +8 -0
  37. package/dist/indexer/index.js.map +1 -0
  38. package/dist/indexer/indexer.d.ts +58 -0
  39. package/dist/indexer/indexer.d.ts.map +1 -0
  40. package/dist/indexer/indexer.js +206 -0
  41. package/dist/indexer/indexer.js.map +1 -0
  42. package/dist/parser/ast-parser.d.ts +79 -0
  43. package/dist/parser/ast-parser.d.ts.map +1 -0
  44. package/dist/parser/ast-parser.js +489 -0
  45. package/dist/parser/ast-parser.js.map +1 -0
  46. package/dist/parser/index.d.ts +8 -0
  47. package/dist/parser/index.d.ts.map +1 -0
  48. package/dist/parser/index.js +8 -0
  49. package/dist/parser/index.js.map +1 -0
  50. package/dist/storage/index.d.ts +9 -0
  51. package/dist/storage/index.d.ts.map +1 -0
  52. package/dist/storage/index.js +10 -0
  53. package/dist/storage/index.js.map +1 -0
  54. package/dist/storage/memory-storage.d.ts +102 -0
  55. package/dist/storage/memory-storage.d.ts.map +1 -0
  56. package/dist/storage/memory-storage.js +263 -0
  57. package/dist/storage/memory-storage.js.map +1 -0
  58. package/dist/storage/sqlite-storage.d.ts +90 -0
  59. package/dist/storage/sqlite-storage.d.ts.map +1 -0
  60. package/dist/storage/sqlite-storage.js +344 -0
  61. package/dist/storage/sqlite-storage.js.map +1 -0
  62. package/dist/types.d.ts +539 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +99 -0
  65. package/dist/types.js.map +1 -0
  66. package/package.json +85 -0
@@ -0,0 +1,429 @@
1
+ /**
2
+ * @nahisaho/musubix-codegraph - CodeGraph Facade
3
+ *
4
+ * Main entry point for code graph analysis
5
+ *
6
+ * @packageDocumentation
7
+ * @module @nahisaho/musubix-codegraph
8
+ *
9
+ * @see REQ-CG-API-001
10
+ * @see REQ-CG-API-002
11
+ * @see REQ-CG-API-003
12
+ * @see DES-CG-001
13
+ */
14
+ import { DEFAULT_CODEGRAPH_OPTIONS } from './types.js';
15
+ import { CodeGraphEventEmitter } from './events/index.js';
16
+ /**
17
+ * CodeGraph - Main facade for code graph analysis
18
+ *
19
+ * Provides a unified API for:
20
+ * - AST parsing and entity extraction
21
+ * - Graph construction and querying
22
+ * - Dependency and call graph analysis
23
+ * - GraphRAG-based semantic search
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * // Basic usage
28
+ * const codeGraph = new CodeGraph({ storage: 'memory' });
29
+ * await codeGraph.index('/path/to/repo');
30
+ *
31
+ * const deps = await codeGraph.findDependencies('UserService');
32
+ * const callers = await codeGraph.findCallers('authenticate');
33
+ * const results = await codeGraph.globalSearch('authentication');
34
+ * ```
35
+ *
36
+ * @see REQ-CG-API-001 - Library as standalone
37
+ * @see REQ-CG-API-002 - Programmatic API
38
+ */
39
+ export class CodeGraph extends CodeGraphEventEmitter {
40
+ options;
41
+ storage = null;
42
+ initialized = false;
43
+ /**
44
+ * Create a new CodeGraph instance
45
+ *
46
+ * @param options - Configuration options
47
+ */
48
+ constructor(options = {}) {
49
+ super();
50
+ this.options = {
51
+ ...options,
52
+ parser: { ...DEFAULT_CODEGRAPH_OPTIONS.parser, ...options.parser },
53
+ graph: { ...DEFAULT_CODEGRAPH_OPTIONS.graph, ...options.graph },
54
+ indexer: { ...DEFAULT_CODEGRAPH_OPTIONS.indexer, ...options.indexer },
55
+ graphrag: { ...DEFAULT_CODEGRAPH_OPTIONS.graphrag, ...options.graphrag },
56
+ };
57
+ }
58
+ // =========================================================================
59
+ // Event handler shortcuts
60
+ // =========================================================================
61
+ /**
62
+ * Register a handler for indexing start events
63
+ */
64
+ onIndexingStart(handler) {
65
+ this.on('indexing:start', (data) => handler(data.path));
66
+ return this;
67
+ }
68
+ /**
69
+ * Register a handler for indexing complete events
70
+ */
71
+ onIndexingComplete(handler) {
72
+ this.on('indexing:complete', handler);
73
+ return this;
74
+ }
75
+ /**
76
+ * Register a handler for indexing progress events
77
+ */
78
+ onIndexingProgress(handler) {
79
+ this.on('indexing:progress', (data) => handler(data.processed, data.total, data.currentFile));
80
+ return this;
81
+ }
82
+ /**
83
+ * Register a handler for indexing error events
84
+ */
85
+ onIndexingError(handler) {
86
+ this.on('indexing:error', (data) => handler(data.error, data.file));
87
+ return this;
88
+ }
89
+ /**
90
+ * Register a handler for query start events
91
+ */
92
+ onQueryStart(handler) {
93
+ this.on('query:start', (data) => handler(data.query));
94
+ return this;
95
+ }
96
+ /**
97
+ * Register a handler for query complete events
98
+ */
99
+ onQueryComplete(handler) {
100
+ this.on('query:complete', (data) => handler(data.result, data.durationMs));
101
+ return this;
102
+ }
103
+ /**
104
+ * Initialize the CodeGraph instance
105
+ *
106
+ * @internal
107
+ */
108
+ async ensureInitialized() {
109
+ if (this.initialized)
110
+ return;
111
+ // Initialize storage
112
+ this.storage = await this.createStorage();
113
+ await this.storage.initialize();
114
+ this.initialized = true;
115
+ }
116
+ /**
117
+ * Create storage adapter based on options
118
+ *
119
+ * @internal
120
+ */
121
+ async createStorage() {
122
+ const storageOption = this.options.storage ?? 'memory';
123
+ if (typeof storageOption === 'object') {
124
+ // Custom storage adapter provided
125
+ return storageOption;
126
+ }
127
+ // Lazy import storage implementations
128
+ switch (storageOption) {
129
+ case 'memory': {
130
+ const { MemoryStorage } = await import('./storage/memory-storage.js');
131
+ return new MemoryStorage();
132
+ }
133
+ case 'sqlite': {
134
+ const { SQLiteStorage } = await import('./storage/sqlite-storage.js');
135
+ return new SQLiteStorage(this.options.sqlitePath ?? '.codegraph/index.db');
136
+ }
137
+ default:
138
+ throw new Error(`Unknown storage type: ${storageOption}`);
139
+ }
140
+ }
141
+ // =========================================================================
142
+ // Indexing Methods
143
+ // =========================================================================
144
+ /**
145
+ * Index a repository or directory
146
+ *
147
+ * @param path - Path to repository or directory
148
+ * @returns Index result with statistics
149
+ *
150
+ * @see REQ-CG-IDX-001
151
+ *
152
+ * @example
153
+ * ```typescript
154
+ * const result = await codeGraph.index('/path/to/repo');
155
+ * console.log(`Indexed ${result.entitiesIndexed} entities`);
156
+ * ```
157
+ */
158
+ async index(path) {
159
+ await this.ensureInitialized();
160
+ this.emitIndexingStart(path);
161
+ try {
162
+ const { Indexer } = await import('./indexer/index.js');
163
+ const { ASTParser } = await import('./parser/index.js');
164
+ const { GraphEngine } = await import('./graph/index.js');
165
+ const parser = new ASTParser(this.options.parser);
166
+ const graph = new GraphEngine(this.storage, this.options.graph);
167
+ const indexer = new Indexer(parser, graph, this.options.indexer);
168
+ // Set up progress tracking
169
+ indexer.onProgress((progress) => {
170
+ this.emitIndexingProgress(progress.processed, progress.total, progress.currentFile);
171
+ });
172
+ const result = await indexer.indexRepository(path);
173
+ this.emitIndexingComplete(result);
174
+ return result;
175
+ }
176
+ catch (error) {
177
+ const err = error instanceof Error ? error : new Error(String(error));
178
+ this.emitIndexingError(err);
179
+ throw err;
180
+ }
181
+ }
182
+ /**
183
+ * Reindex a repository (clear and index fresh)
184
+ *
185
+ * @param path - Path to repository or directory
186
+ * @returns Index result with statistics
187
+ */
188
+ async reindex(path) {
189
+ await this.ensureInitialized();
190
+ await this.storage.clear();
191
+ return this.index(path);
192
+ }
193
+ // =========================================================================
194
+ // Query Methods
195
+ // =========================================================================
196
+ /**
197
+ * Query the code graph
198
+ *
199
+ * @param query - Search query string or query object
200
+ * @returns Query result with matching entities
201
+ *
202
+ * @see REQ-CG-GRF-003
203
+ */
204
+ async query(query) {
205
+ await this.ensureInitialized();
206
+ const graphQuery = typeof query === 'string'
207
+ ? { textSearch: query }
208
+ : query;
209
+ this.emitQueryStart(graphQuery);
210
+ const startTime = Date.now();
211
+ const { GraphEngine } = await import('./graph/index.js');
212
+ const graph = new GraphEngine(this.storage, this.options.graph);
213
+ const result = await graph.query(graphQuery);
214
+ const durationMs = Date.now() - startTime;
215
+ this.emitQueryComplete(result, durationMs);
216
+ return result;
217
+ }
218
+ /**
219
+ * Find dependencies of an entity
220
+ *
221
+ * @param entityName - Name or ID of the entity
222
+ * @param options - Dependency analysis options
223
+ * @returns List of dependent entities
224
+ *
225
+ * @see REQ-CG-GRF-004
226
+ */
227
+ async findDependencies(entityName, options) {
228
+ await this.ensureInitialized();
229
+ const { GraphEngine } = await import('./graph/index.js');
230
+ const graph = new GraphEngine(this.storage, this.options.graph);
231
+ return graph.findDependencies(entityName, options?.depth ?? 3);
232
+ }
233
+ /**
234
+ * Find callers of a function or method
235
+ *
236
+ * @param entityName - Name or ID of the function/method
237
+ * @returns List of call paths
238
+ *
239
+ * @see REQ-CG-GRF-005
240
+ */
241
+ async findCallers(entityName) {
242
+ await this.ensureInitialized();
243
+ const { GraphEngine } = await import('./graph/index.js');
244
+ const graph = new GraphEngine(this.storage, this.options.graph);
245
+ return graph.findCallers(entityName);
246
+ }
247
+ /**
248
+ * Find callees of a function or method
249
+ *
250
+ * @param entityName - Name or ID of the function/method
251
+ * @returns List of call paths
252
+ *
253
+ * @see REQ-CG-GRF-005
254
+ */
255
+ async findCallees(entityName) {
256
+ await this.ensureInitialized();
257
+ const { GraphEngine } = await import('./graph/index.js');
258
+ const graph = new GraphEngine(this.storage, this.options.graph);
259
+ return graph.findCallees(entityName);
260
+ }
261
+ /**
262
+ * Find implementations of an interface
263
+ *
264
+ * @param interfaceName - Name or ID of the interface
265
+ * @returns List of implementing entities
266
+ */
267
+ async findImplementations(interfaceName) {
268
+ await this.ensureInitialized();
269
+ const { GraphEngine } = await import('./graph/index.js');
270
+ const graph = new GraphEngine(this.storage, this.options.graph);
271
+ return graph.findImplementations(interfaceName);
272
+ }
273
+ /**
274
+ * Analyze module structure
275
+ *
276
+ * @param path - Path to module/file
277
+ * @returns Module analysis result
278
+ */
279
+ async analyzeModule(path) {
280
+ await this.ensureInitialized();
281
+ const { GraphEngine } = await import('./graph/index.js');
282
+ const graph = new GraphEngine(this.storage, this.options.graph);
283
+ return graph.analyzeModule(path);
284
+ }
285
+ // =========================================================================
286
+ // Code Retrieval Methods
287
+ // =========================================================================
288
+ /**
289
+ * Get source code snippet for an entity
290
+ *
291
+ * @param entityId - Entity ID
292
+ * @returns Code snippet with context
293
+ */
294
+ async getSnippet(entityId) {
295
+ await this.ensureInitialized();
296
+ const entity = await this.storage.getEntity(entityId);
297
+ if (!entity) {
298
+ throw new Error(`Entity not found: ${entityId}`);
299
+ }
300
+ return {
301
+ entityId,
302
+ code: entity.sourceCode ?? '',
303
+ language: entity.language ?? 'typescript',
304
+ filePath: entity.filePath ?? '',
305
+ startLine: entity.startLine ?? 0,
306
+ endLine: entity.endLine ?? 0,
307
+ };
308
+ }
309
+ /**
310
+ * Get file structure overview
311
+ *
312
+ * @param path - File path
313
+ * @returns File structure with entities
314
+ */
315
+ async getFileStructure(path) {
316
+ await this.ensureInitialized();
317
+ const entities = await this.storage.queryEntities({
318
+ filePath: path,
319
+ });
320
+ const imports = entities.filter(e => e.type === 'import');
321
+ const exports = entities.filter(e => e.type === 'export');
322
+ return {
323
+ filePath: path,
324
+ language: entities[0]?.language ?? 'typescript',
325
+ entities,
326
+ linesOfCode: Math.max(...entities.map(e => e.endLine ?? 0), 0),
327
+ importCount: imports.length,
328
+ exportCount: exports.length,
329
+ };
330
+ }
331
+ // =========================================================================
332
+ // GraphRAG Methods
333
+ // =========================================================================
334
+ /**
335
+ * Global search across all code communities
336
+ *
337
+ * @param query - Search query
338
+ * @param options - Search options
339
+ * @returns Search results with relevance scores
340
+ *
341
+ * @see REQ-CG-RAG-002
342
+ */
343
+ async globalSearch(query, options) {
344
+ await this.ensureInitialized();
345
+ const { GraphRAGSearch } = await import('./graphrag/index.js');
346
+ const { GraphEngine } = await import('./graph/index.js');
347
+ const graph = new GraphEngine(this.storage, this.options.graph);
348
+ const search = new GraphRAGSearch(graph, this.options.graphrag);
349
+ return search.globalSearch(query, options);
350
+ }
351
+ /**
352
+ * Local search in entity neighborhood
353
+ *
354
+ * @param entityName - Entity name or ID
355
+ * @param options - Search options
356
+ * @returns Search results from entity neighborhood
357
+ *
358
+ * @see REQ-CG-RAG-003
359
+ */
360
+ async localSearch(entityName, options) {
361
+ await this.ensureInitialized();
362
+ const { GraphRAGSearch } = await import('./graphrag/index.js');
363
+ const { GraphEngine } = await import('./graph/index.js');
364
+ const graph = new GraphEngine(this.storage, this.options.graph);
365
+ const search = new GraphRAGSearch(graph, this.options.graphrag);
366
+ return search.localSearch(entityName, options);
367
+ }
368
+ // =========================================================================
369
+ // Statistics Methods
370
+ // =========================================================================
371
+ /**
372
+ * Get graph statistics
373
+ *
374
+ * @returns Graph statistics
375
+ */
376
+ async getStats() {
377
+ await this.ensureInitialized();
378
+ const storageStats = await this.storage.getStats();
379
+ // Get entity type distribution
380
+ const entities = await this.storage.queryEntities({});
381
+ const entitiesByType = {};
382
+ const languages = new Set();
383
+ for (const entity of entities) {
384
+ entitiesByType[entity.type] = (entitiesByType[entity.type] ?? 0) + 1;
385
+ if (entity.language) {
386
+ languages.add(entity.language);
387
+ }
388
+ }
389
+ return {
390
+ entityCount: storageStats.entityCount,
391
+ relationCount: storageStats.relationCount,
392
+ fileCount: storageStats.fileCount,
393
+ communityCount: 0, // Will be populated by GraphRAG
394
+ entitiesByType: entitiesByType,
395
+ relationsByType: {},
396
+ languages: Array.from(languages),
397
+ };
398
+ }
399
+ // =========================================================================
400
+ // Lifecycle Methods
401
+ // =========================================================================
402
+ /**
403
+ * Close the CodeGraph instance and release resources
404
+ */
405
+ async close() {
406
+ if (this.storage) {
407
+ await this.storage.close();
408
+ this.storage = null;
409
+ }
410
+ this.initialized = false;
411
+ this.removeAllListeners();
412
+ }
413
+ /**
414
+ * Check if instance is initialized
415
+ */
416
+ isInitialized() {
417
+ return this.initialized;
418
+ }
419
+ }
420
+ /**
421
+ * Create a new CodeGraph instance
422
+ *
423
+ * @param options - Configuration options
424
+ * @returns CodeGraph instance
425
+ */
426
+ export function createCodeGraph(options) {
427
+ return new CodeGraph(options);
428
+ }
429
+ //# sourceMappingURL=codegraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegraph.js","sourceRoot":"","sources":["../src/codegraph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * @nahisaho/musubix-codegraph - Event System
3
+ *
4
+ * Type-safe event emitter for CodeGraph events
5
+ *
6
+ * @packageDocumentation
7
+ * @module @nahisaho/musubix-codegraph/events
8
+ *
9
+ * @see REQ-CG-API-006
10
+ * @see DES-CG-001
11
+ */
12
+ import type { CodeGraphEvents } from '../types.js';
13
+ /**
14
+ * Type-safe event emitter for CodeGraph
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const emitter = new TypedEventEmitter<CodeGraphEvents>();
19
+ *
20
+ * emitter.on('indexing:progress', (data) => {
21
+ * console.log(`Progress: ${data.processed}/${data.total}`);
22
+ * });
23
+ *
24
+ * emitter.emit('indexing:progress', { processed: 10, total: 100, currentFile: 'src/index.ts' });
25
+ * ```
26
+ */
27
+ export declare class TypedEventEmitter<TEvents extends Record<string, unknown>> {
28
+ private emitter;
29
+ constructor();
30
+ /**
31
+ * Register an event listener
32
+ */
33
+ on<K extends keyof TEvents>(event: K, listener: (data: TEvents[K]) => void): this;
34
+ /**
35
+ * Register a one-time event listener
36
+ */
37
+ once<K extends keyof TEvents>(event: K, listener: (data: TEvents[K]) => void): this;
38
+ /**
39
+ * Remove an event listener
40
+ */
41
+ off<K extends keyof TEvents>(event: K, listener: (data: TEvents[K]) => void): this;
42
+ /**
43
+ * Remove all listeners for an event
44
+ */
45
+ removeAllListeners<K extends keyof TEvents>(event?: K): this;
46
+ /**
47
+ * Emit an event
48
+ */
49
+ emit<K extends keyof TEvents>(event: K, data: TEvents[K]): boolean;
50
+ /**
51
+ * Get listener count for an event
52
+ */
53
+ listenerCount<K extends keyof TEvents>(event: K): number;
54
+ /**
55
+ * Get all listeners for an event
56
+ */
57
+ listeners<K extends keyof TEvents>(event: K): ((data: TEvents[K]) => void)[];
58
+ /**
59
+ * Wait for an event (Promise-based)
60
+ */
61
+ waitFor<K extends keyof TEvents>(event: K, timeout?: number): Promise<TEvents[K]>;
62
+ }
63
+ /**
64
+ * CodeGraph event emitter with pre-defined event types
65
+ */
66
+ export declare class CodeGraphEventEmitter extends TypedEventEmitter<CodeGraphEvents> {
67
+ /**
68
+ * Emit indexing start event
69
+ */
70
+ emitIndexingStart(path: string): void;
71
+ /**
72
+ * Emit indexing progress event
73
+ */
74
+ emitIndexingProgress(processed: number, total: number, currentFile: string): void;
75
+ /**
76
+ * Emit indexing complete event
77
+ */
78
+ emitIndexingComplete(result: CodeGraphEvents['indexing:complete']): void;
79
+ /**
80
+ * Emit indexing error event
81
+ */
82
+ emitIndexingError(error: Error, file?: string): void;
83
+ /**
84
+ * Emit query start event
85
+ */
86
+ emitQueryStart(query: CodeGraphEvents['query:start']['query']): void;
87
+ /**
88
+ * Emit query complete event
89
+ */
90
+ emitQueryComplete(result: CodeGraphEvents['query:complete']['result'], durationMs: number): void;
91
+ }
92
+ export declare function createEventEmitter(): CodeGraphEventEmitter;
93
+ //# sourceMappingURL=event-emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../src/events/event-emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;;;;;;;;;;;GAaG;AACH,qBAAa,iBAAiB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACpE,OAAO,CAAC,OAAO,CAAe;;IAQ9B;;OAEG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAKjF;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAKnF;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAKlF;;OAEG;IACH,kBAAkB,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI;IAS5D;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO;IAIlE;;OAEG;IACH,aAAa,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM;IAIxD;;OAEG;IACH,SAAS,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE;IAI5E;;OAEG;IACH,OAAO,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CAqBlF;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,iBAAiB,CAAC,eAAe,CAAC;IAC3E;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAIjF;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAIxE;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAIpD;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI;IAIpE;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;CAGjG;AAGD,wBAAgB,kBAAkB,IAAI,qBAAqB,CAE1D"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * @nahisaho/musubix-codegraph - Event System
3
+ *
4
+ * Type-safe event emitter for CodeGraph events
5
+ *
6
+ * @packageDocumentation
7
+ * @module @nahisaho/musubix-codegraph/events
8
+ *
9
+ * @see REQ-CG-API-006
10
+ * @see DES-CG-001
11
+ */
12
+ import { EventEmitter } from 'events';
13
+ /**
14
+ * Type-safe event emitter for CodeGraph
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const emitter = new TypedEventEmitter<CodeGraphEvents>();
19
+ *
20
+ * emitter.on('indexing:progress', (data) => {
21
+ * console.log(`Progress: ${data.processed}/${data.total}`);
22
+ * });
23
+ *
24
+ * emitter.emit('indexing:progress', { processed: 10, total: 100, currentFile: 'src/index.ts' });
25
+ * ```
26
+ */
27
+ export class TypedEventEmitter {
28
+ emitter;
29
+ constructor() {
30
+ this.emitter = new EventEmitter();
31
+ // Increase max listeners for complex applications
32
+ this.emitter.setMaxListeners(50);
33
+ }
34
+ /**
35
+ * Register an event listener
36
+ */
37
+ on(event, listener) {
38
+ this.emitter.on(event, listener);
39
+ return this;
40
+ }
41
+ /**
42
+ * Register a one-time event listener
43
+ */
44
+ once(event, listener) {
45
+ this.emitter.once(event, listener);
46
+ return this;
47
+ }
48
+ /**
49
+ * Remove an event listener
50
+ */
51
+ off(event, listener) {
52
+ this.emitter.off(event, listener);
53
+ return this;
54
+ }
55
+ /**
56
+ * Remove all listeners for an event
57
+ */
58
+ removeAllListeners(event) {
59
+ if (event) {
60
+ this.emitter.removeAllListeners(event);
61
+ }
62
+ else {
63
+ this.emitter.removeAllListeners();
64
+ }
65
+ return this;
66
+ }
67
+ /**
68
+ * Emit an event
69
+ */
70
+ emit(event, data) {
71
+ return this.emitter.emit(event, data);
72
+ }
73
+ /**
74
+ * Get listener count for an event
75
+ */
76
+ listenerCount(event) {
77
+ return this.emitter.listenerCount(event);
78
+ }
79
+ /**
80
+ * Get all listeners for an event
81
+ */
82
+ listeners(event) {
83
+ return this.emitter.listeners(event);
84
+ }
85
+ /**
86
+ * Wait for an event (Promise-based)
87
+ */
88
+ waitFor(event, timeout) {
89
+ return new Promise((resolve, reject) => {
90
+ let timeoutId;
91
+ const listener = (data) => {
92
+ if (timeoutId) {
93
+ clearTimeout(timeoutId);
94
+ }
95
+ resolve(data);
96
+ };
97
+ this.once(event, listener);
98
+ if (timeout) {
99
+ timeoutId = setTimeout(() => {
100
+ this.off(event, listener);
101
+ reject(new Error(`Timeout waiting for event: ${String(event)}`));
102
+ }, timeout);
103
+ }
104
+ });
105
+ }
106
+ }
107
+ /**
108
+ * CodeGraph event emitter with pre-defined event types
109
+ */
110
+ export class CodeGraphEventEmitter extends TypedEventEmitter {
111
+ /**
112
+ * Emit indexing start event
113
+ */
114
+ emitIndexingStart(path) {
115
+ this.emit('indexing:start', { path, timestamp: new Date() });
116
+ }
117
+ /**
118
+ * Emit indexing progress event
119
+ */
120
+ emitIndexingProgress(processed, total, currentFile) {
121
+ this.emit('indexing:progress', { processed, total, currentFile });
122
+ }
123
+ /**
124
+ * Emit indexing complete event
125
+ */
126
+ emitIndexingComplete(result) {
127
+ this.emit('indexing:complete', result);
128
+ }
129
+ /**
130
+ * Emit indexing error event
131
+ */
132
+ emitIndexingError(error, file) {
133
+ this.emit('indexing:error', { error, file });
134
+ }
135
+ /**
136
+ * Emit query start event
137
+ */
138
+ emitQueryStart(query) {
139
+ this.emit('query:start', { query });
140
+ }
141
+ /**
142
+ * Emit query complete event
143
+ */
144
+ emitQueryComplete(result, durationMs) {
145
+ this.emit('query:complete', { result, durationMs });
146
+ }
147
+ }
148
+ // Export default instance factory
149
+ export function createEventEmitter() {
150
+ return new CodeGraphEventEmitter();
151
+ }
152
+ //# sourceMappingURL=event-emitter.js.map