@colbymchenry/codegraph 0.2.9 → 0.4.8

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.

Potentially problematic release.


This version of @colbymchenry/codegraph might be problematic. Click here for more details.

Files changed (113) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +647 -641
  3. package/dist/bin/codegraph.d.ts +7 -2
  4. package/dist/bin/codegraph.d.ts.map +1 -1
  5. package/dist/bin/codegraph.js +360 -140
  6. package/dist/bin/codegraph.js.map +1 -1
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +8 -1
  9. package/dist/config.js.map +1 -1
  10. package/dist/context/index.d.ts +17 -4
  11. package/dist/context/index.d.ts.map +1 -1
  12. package/dist/context/index.js +182 -15
  13. package/dist/context/index.js.map +1 -1
  14. package/dist/db/index.d.ts.map +1 -1
  15. package/dist/db/index.js +16 -0
  16. package/dist/db/index.js.map +1 -1
  17. package/dist/db/migrations.d.ts +1 -1
  18. package/dist/db/migrations.d.ts.map +1 -1
  19. package/dist/db/migrations.js +11 -12
  20. package/dist/db/migrations.js.map +1 -1
  21. package/dist/db/queries.d.ts +19 -0
  22. package/dist/db/queries.d.ts.map +1 -1
  23. package/dist/db/queries.js +221 -107
  24. package/dist/db/queries.js.map +1 -1
  25. package/dist/db/schema.sql +154 -149
  26. package/dist/directory.d.ts +13 -1
  27. package/dist/directory.d.ts.map +1 -1
  28. package/dist/directory.js +62 -19
  29. package/dist/directory.js.map +1 -1
  30. package/dist/errors.d.ts +1 -1
  31. package/dist/errors.d.ts.map +1 -1
  32. package/dist/errors.js +7 -1
  33. package/dist/errors.js.map +1 -1
  34. package/dist/extraction/grammars.d.ts +9 -4
  35. package/dist/extraction/grammars.d.ts.map +1 -1
  36. package/dist/extraction/grammars.js +133 -65
  37. package/dist/extraction/grammars.js.map +1 -1
  38. package/dist/extraction/index.d.ts.map +1 -1
  39. package/dist/extraction/index.js +119 -7
  40. package/dist/extraction/index.js.map +1 -1
  41. package/dist/extraction/tree-sitter.d.ts +62 -0
  42. package/dist/extraction/tree-sitter.d.ts.map +1 -1
  43. package/dist/extraction/tree-sitter.js +937 -34
  44. package/dist/extraction/tree-sitter.js.map +1 -1
  45. package/dist/graph/traversal.d.ts.map +1 -1
  46. package/dist/graph/traversal.js +6 -2
  47. package/dist/graph/traversal.js.map +1 -1
  48. package/dist/index.d.ts +6 -38
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +85 -74
  51. package/dist/index.js.map +1 -1
  52. package/dist/installer/banner.js +7 -7
  53. package/dist/installer/claude-md-template.js +32 -32
  54. package/dist/installer/config-writer.d.ts +9 -0
  55. package/dist/installer/config-writer.d.ts.map +1 -1
  56. package/dist/installer/config-writer.js +78 -0
  57. package/dist/installer/config-writer.js.map +1 -1
  58. package/dist/installer/index.d.ts.map +1 -1
  59. package/dist/installer/index.js +28 -16
  60. package/dist/installer/index.js.map +1 -1
  61. package/dist/mcp/index.d.ts +14 -3
  62. package/dist/mcp/index.d.ts.map +1 -1
  63. package/dist/mcp/index.js +109 -29
  64. package/dist/mcp/index.js.map +1 -1
  65. package/dist/mcp/tools.d.ts +62 -1
  66. package/dist/mcp/tools.d.ts.map +1 -1
  67. package/dist/mcp/tools.js +414 -43
  68. package/dist/mcp/tools.js.map +1 -1
  69. package/dist/mcp/transport.d.ts.map +1 -1
  70. package/dist/mcp/transport.js +2 -0
  71. package/dist/mcp/transport.js.map +1 -1
  72. package/dist/resolution/frameworks/index.d.ts +1 -0
  73. package/dist/resolution/frameworks/index.d.ts.map +1 -1
  74. package/dist/resolution/frameworks/index.js +5 -1
  75. package/dist/resolution/frameworks/index.js.map +1 -1
  76. package/dist/resolution/frameworks/svelte.d.ts +9 -0
  77. package/dist/resolution/frameworks/svelte.d.ts.map +1 -0
  78. package/dist/resolution/frameworks/svelte.js +268 -0
  79. package/dist/resolution/frameworks/svelte.js.map +1 -0
  80. package/dist/resolution/index.d.ts +11 -2
  81. package/dist/resolution/index.d.ts.map +1 -1
  82. package/dist/resolution/index.js +94 -13
  83. package/dist/resolution/index.js.map +1 -1
  84. package/dist/sentry.d.ts +22 -0
  85. package/dist/sentry.d.ts.map +1 -0
  86. package/dist/sentry.js +159 -0
  87. package/dist/sentry.js.map +1 -0
  88. package/dist/sync/index.d.ts +4 -2
  89. package/dist/sync/index.d.ts.map +1 -1
  90. package/dist/sync/index.js +3 -5
  91. package/dist/sync/index.js.map +1 -1
  92. package/dist/types.d.ts +5 -1
  93. package/dist/types.d.ts.map +1 -1
  94. package/dist/types.js +11 -0
  95. package/dist/types.js.map +1 -1
  96. package/dist/utils.d.ts +45 -2
  97. package/dist/utils.d.ts.map +1 -1
  98. package/dist/utils.js +114 -3
  99. package/dist/utils.js.map +1 -1
  100. package/dist/vectors/embedder.d.ts +1 -1
  101. package/dist/vectors/embedder.d.ts.map +1 -1
  102. package/dist/vectors/embedder.js +5 -2
  103. package/dist/vectors/embedder.js.map +1 -1
  104. package/dist/vectors/search.d.ts.map +1 -1
  105. package/dist/vectors/search.js +33 -32
  106. package/dist/vectors/search.js.map +1 -1
  107. package/package.json +72 -65
  108. package/scripts/patch-tree-sitter-dart.js +112 -0
  109. package/scripts/postinstall.js +71 -0
  110. package/dist/sync/git-hooks.d.ts +0 -66
  111. package/dist/sync/git-hooks.d.ts.map +0 -1
  112. package/dist/sync/git-hooks.js +0 -281
  113. package/dist/sync/git-hooks.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ import Database from 'better-sqlite3';
7
7
  /**
8
8
  * Current schema version
9
9
  */
10
- export declare const CURRENT_SCHEMA_VERSION = 1;
10
+ export declare const CURRENT_SCHEMA_VERSION = 2;
11
11
  /**
12
12
  * Migration definition
13
13
  */
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC;;GAEG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;GAEG;AACH,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC;CACrC;AAsBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAU/D;AAWD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAiB9E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAG7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,SAAS,EAAE,CAKvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GACpB,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAU3E"}
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC;;GAEG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;GAEG;AACH,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC;CACrC;AAqBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAU/D;AAWD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAiB9E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAG7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,SAAS,EAAE,CAKvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GACpB,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAU3E"}
@@ -14,7 +14,7 @@ exports.getMigrationHistory = getMigrationHistory;
14
14
  /**
15
15
  * Current schema version
16
16
  */
17
- exports.CURRENT_SCHEMA_VERSION = 1;
17
+ exports.CURRENT_SCHEMA_VERSION = 2;
18
18
  /**
19
19
  * All migrations in order
20
20
  *
@@ -22,17 +22,16 @@ exports.CURRENT_SCHEMA_VERSION = 1;
22
22
  * Future migrations go here.
23
23
  */
24
24
  const migrations = [
25
- // Example migration for version 2 (when needed):
26
- // {
27
- // version: 2,
28
- // description: 'Add support for module resolution',
29
- // up: (db) => {
30
- // db.exec(`
31
- // ALTER TABLE nodes ADD COLUMN module_path TEXT;
32
- // CREATE INDEX idx_nodes_module_path ON nodes(module_path);
33
- // `);
34
- // },
35
- // },
25
+ {
26
+ version: 2,
27
+ description: 'Add filePath and language to unresolved_refs for performance',
28
+ up: (db) => {
29
+ db.exec(`
30
+ ALTER TABLE unresolved_refs ADD COLUMN file_path TEXT;
31
+ ALTER TABLE unresolved_refs ADD COLUMN language TEXT;
32
+ `);
33
+ },
34
+ },
36
35
  ];
37
36
  /**
38
37
  * Get the current schema version from the database
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"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"}
@@ -54,6 +54,10 @@ export declare class QueryBuilder {
54
54
  * Get all nodes of a specific kind
55
55
  */
56
56
  getNodesByKind(kind: NodeKind): Node[];
57
+ /**
58
+ * Get all nodes in the database
59
+ */
60
+ getAllNodes(): Node[];
57
61
  /**
58
62
  * Search nodes by name using FTS with fallback to LIKE for better matching
59
63
  *
@@ -72,6 +76,17 @@ export declare class QueryBuilder {
72
76
  * Useful for camelCase matching (e.g., "signIn" finds "signInWithGoogle")
73
77
  */
74
78
  private searchNodesLike;
79
+ /**
80
+ * Find nodes by exact name match
81
+ *
82
+ * Used for hybrid search - looks up symbols by exact name or case-insensitive match.
83
+ * Returns high-confidence matches for known symbol names extracted from query.
84
+ *
85
+ * @param names - Array of symbol names to look up
86
+ * @param options - Search options (kinds, languages, limit)
87
+ * @returns SearchResult array with exact matches scored at 1.0
88
+ */
89
+ findNodesByExactName(names: string[], options?: SearchOptions): SearchResult[];
75
90
  /**
76
91
  * Insert a new edge
77
92
  */
@@ -116,6 +131,10 @@ export declare class QueryBuilder {
116
131
  * Insert an unresolved reference
117
132
  */
118
133
  insertUnresolvedRef(ref: UnresolvedReference): void;
134
+ /**
135
+ * Insert multiple unresolved references in a single transaction
136
+ */
137
+ insertUnresolvedRefsBatch(refs: UnresolvedReference[]): void;
119
138
  /**
120
139
  * Delete unresolved references from a node
121
140
  */
@@ -1 +1 @@
1
- {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.QueryBuilder = void 0;
9
+ const utils_1 = require("../utils");
9
10
  /**
10
11
  * Convert database row to Node object
11
12
  */
@@ -28,8 +29,8 @@ function rowToNode(row) {
28
29
  isAsync: row.is_async === 1,
29
30
  isStatic: row.is_static === 1,
30
31
  isAbstract: row.is_abstract === 1,
31
- decorators: row.decorators ? JSON.parse(row.decorators) : undefined,
32
- typeParameters: row.type_parameters ? JSON.parse(row.type_parameters) : undefined,
32
+ decorators: row.decorators ? (0, utils_1.safeJsonParse)(row.decorators, undefined) : undefined,
33
+ typeParameters: row.type_parameters ? (0, utils_1.safeJsonParse)(row.type_parameters, undefined) : undefined,
33
34
  updatedAt: row.updated_at,
34
35
  };
35
36
  }
@@ -41,7 +42,7 @@ function rowToEdge(row) {
41
42
  source: row.source,
42
43
  target: row.target,
43
44
  kind: row.kind,
44
- metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
45
+ metadata: row.metadata ? (0, utils_1.safeJsonParse)(row.metadata, undefined) : undefined,
45
46
  line: row.line ?? undefined,
46
47
  column: row.col ?? undefined,
47
48
  };
@@ -58,7 +59,7 @@ function rowToFileRecord(row) {
58
59
  modifiedAt: row.modified_at,
59
60
  indexedAt: row.indexed_at,
60
61
  nodeCount: row.node_count,
61
- errors: row.errors ? JSON.parse(row.errors) : undefined,
62
+ errors: row.errors ? (0, utils_1.safeJsonParse)(row.errors, undefined) : undefined,
62
63
  };
63
64
  }
64
65
  /**
@@ -82,44 +83,70 @@ class QueryBuilder {
82
83
  */
83
84
  insertNode(node) {
84
85
  if (!this.stmts.insertNode) {
85
- this.stmts.insertNode = this.db.prepare(`
86
- INSERT INTO nodes (
87
- id, kind, name, qualified_name, file_path, language,
88
- start_line, end_line, start_column, end_column,
89
- docstring, signature, visibility,
90
- is_exported, is_async, is_static, is_abstract,
91
- decorators, type_parameters, updated_at
92
- ) VALUES (
93
- @id, @kind, @name, @qualifiedName, @filePath, @language,
94
- @startLine, @endLine, @startColumn, @endColumn,
95
- @docstring, @signature, @visibility,
96
- @isExported, @isAsync, @isStatic, @isAbstract,
97
- @decorators, @typeParameters, @updatedAt
98
- )
86
+ this.stmts.insertNode = this.db.prepare(`
87
+ INSERT OR REPLACE INTO nodes (
88
+ id, kind, name, qualified_name, file_path, language,
89
+ start_line, end_line, start_column, end_column,
90
+ docstring, signature, visibility,
91
+ is_exported, is_async, is_static, is_abstract,
92
+ decorators, type_parameters, updated_at
93
+ ) VALUES (
94
+ @id, @kind, @name, @qualifiedName, @filePath, @language,
95
+ @startLine, @endLine, @startColumn, @endColumn,
96
+ @docstring, @signature, @visibility,
97
+ @isExported, @isAsync, @isStatic, @isAbstract,
98
+ @decorators, @typeParameters, @updatedAt
99
+ )
99
100
  `);
100
101
  }
101
- this.stmts.insertNode.run({
102
- id: node.id,
103
- kind: node.kind,
104
- name: node.name,
105
- qualifiedName: node.qualifiedName,
106
- filePath: node.filePath,
107
- language: node.language,
108
- startLine: node.startLine,
109
- endLine: node.endLine,
110
- startColumn: node.startColumn,
111
- endColumn: node.endColumn,
112
- docstring: node.docstring ?? null,
113
- signature: node.signature ?? null,
114
- visibility: node.visibility ?? null,
115
- isExported: node.isExported ? 1 : 0,
116
- isAsync: node.isAsync ? 1 : 0,
117
- isStatic: node.isStatic ? 1 : 0,
118
- isAbstract: node.isAbstract ? 1 : 0,
119
- decorators: node.decorators ? JSON.stringify(node.decorators) : null,
120
- typeParameters: node.typeParameters ? JSON.stringify(node.typeParameters) : null,
121
- updatedAt: node.updatedAt,
122
- });
102
+ // Validate required fields to prevent SQLite bind errors
103
+ if (!node.id || !node.kind || !node.name || !node.filePath || !node.language) {
104
+ console.error('[CodeGraph] Skipping node with missing required fields:', {
105
+ id: node.id,
106
+ kind: node.kind,
107
+ name: node.name,
108
+ filePath: node.filePath,
109
+ language: node.language,
110
+ });
111
+ return;
112
+ }
113
+ try {
114
+ this.stmts.insertNode.run({
115
+ id: node.id,
116
+ kind: node.kind,
117
+ name: node.name,
118
+ qualifiedName: node.qualifiedName ?? node.name,
119
+ filePath: node.filePath,
120
+ language: node.language,
121
+ startLine: node.startLine ?? 0,
122
+ endLine: node.endLine ?? 0,
123
+ startColumn: node.startColumn ?? 0,
124
+ endColumn: node.endColumn ?? 0,
125
+ docstring: node.docstring ?? null,
126
+ signature: node.signature ?? null,
127
+ visibility: node.visibility ?? null,
128
+ isExported: node.isExported ? 1 : 0,
129
+ isAsync: node.isAsync ? 1 : 0,
130
+ isStatic: node.isStatic ? 1 : 0,
131
+ isAbstract: node.isAbstract ? 1 : 0,
132
+ decorators: node.decorators ? JSON.stringify(node.decorators) : null,
133
+ typeParameters: node.typeParameters ? JSON.stringify(node.typeParameters) : null,
134
+ updatedAt: node.updatedAt ?? Date.now(),
135
+ });
136
+ }
137
+ catch (error) {
138
+ const { captureException } = require('../sentry');
139
+ captureException(error, {
140
+ operation: 'insertNode',
141
+ nodeId: node.id,
142
+ nodeKind: node.kind,
143
+ nodeName: node.name,
144
+ filePath: node.filePath,
145
+ language: node.language,
146
+ startLine: node.startLine,
147
+ });
148
+ throw error;
149
+ }
123
150
  }
124
151
  /**
125
152
  * Insert multiple nodes in a transaction
@@ -136,43 +163,48 @@ class QueryBuilder {
136
163
  */
137
164
  updateNode(node) {
138
165
  if (!this.stmts.updateNode) {
139
- this.stmts.updateNode = this.db.prepare(`
140
- UPDATE nodes SET
141
- kind = @kind,
142
- name = @name,
143
- qualified_name = @qualifiedName,
144
- file_path = @filePath,
145
- language = @language,
146
- start_line = @startLine,
147
- end_line = @endLine,
148
- start_column = @startColumn,
149
- end_column = @endColumn,
150
- docstring = @docstring,
151
- signature = @signature,
152
- visibility = @visibility,
153
- is_exported = @isExported,
154
- is_async = @isAsync,
155
- is_static = @isStatic,
156
- is_abstract = @isAbstract,
157
- decorators = @decorators,
158
- type_parameters = @typeParameters,
159
- updated_at = @updatedAt
160
- WHERE id = @id
166
+ this.stmts.updateNode = this.db.prepare(`
167
+ UPDATE nodes SET
168
+ kind = @kind,
169
+ name = @name,
170
+ qualified_name = @qualifiedName,
171
+ file_path = @filePath,
172
+ language = @language,
173
+ start_line = @startLine,
174
+ end_line = @endLine,
175
+ start_column = @startColumn,
176
+ end_column = @endColumn,
177
+ docstring = @docstring,
178
+ signature = @signature,
179
+ visibility = @visibility,
180
+ is_exported = @isExported,
181
+ is_async = @isAsync,
182
+ is_static = @isStatic,
183
+ is_abstract = @isAbstract,
184
+ decorators = @decorators,
185
+ type_parameters = @typeParameters,
186
+ updated_at = @updatedAt
187
+ WHERE id = @id
161
188
  `);
162
189
  }
163
190
  // Invalidate cache before update
164
191
  this.nodeCache.delete(node.id);
192
+ // Validate required fields
193
+ if (!node.id || !node.kind || !node.name || !node.filePath || !node.language) {
194
+ console.error('[CodeGraph] Skipping node update with missing required fields:', node.id);
195
+ return;
196
+ }
165
197
  this.stmts.updateNode.run({
166
198
  id: node.id,
167
199
  kind: node.kind,
168
200
  name: node.name,
169
- qualifiedName: node.qualifiedName,
201
+ qualifiedName: node.qualifiedName ?? node.name,
170
202
  filePath: node.filePath,
171
203
  language: node.language,
172
- startLine: node.startLine,
173
- endLine: node.endLine,
174
- startColumn: node.startColumn,
175
- endColumn: node.endColumn,
204
+ startLine: node.startLine ?? 0,
205
+ endLine: node.endLine ?? 0,
206
+ startColumn: node.startColumn ?? 0,
207
+ endColumn: node.endColumn ?? 0,
176
208
  docstring: node.docstring ?? null,
177
209
  signature: node.signature ?? null,
178
210
  visibility: node.visibility ?? null,
@@ -182,7 +214,7 @@ class QueryBuilder {
182
214
  isAbstract: node.isAbstract ? 1 : 0,
183
215
  decorators: node.decorators ? JSON.stringify(node.decorators) : null,
184
216
  typeParameters: node.typeParameters ? JSON.stringify(node.typeParameters) : null,
185
- updatedAt: node.updatedAt,
217
+ updatedAt: node.updatedAt ?? Date.now(),
186
218
  });
187
219
  }
188
220
  /**
@@ -273,6 +305,13 @@ class QueryBuilder {
273
305
  const rows = this.stmts.getNodesByKind.all(kind);
274
306
  return rows.map(rowToNode);
275
307
  }
308
+ /**
309
+ * Get all nodes in the database
310
+ */
311
+ getAllNodes() {
312
+ const rows = this.db.prepare('SELECT * FROM nodes').all();
313
+ return rows.map(rowToNode);
314
+ }
276
315
  /**
277
316
  * Search nodes by name using FTS with fallback to LIKE for better matching
278
317
  *
@@ -307,11 +346,11 @@ class QueryBuilder {
307
346
  if (!ftsQuery) {
308
347
  return [];
309
348
  }
310
- let sql = `
311
- SELECT nodes.*, bm25(nodes_fts) as score
312
- FROM nodes_fts
313
- JOIN nodes ON nodes_fts.id = nodes.id
314
- WHERE nodes_fts MATCH ?
349
+ let sql = `
350
+ SELECT nodes.*, bm25(nodes_fts) as score
351
+ FROM nodes_fts
352
+ JOIN nodes ON nodes_fts.id = nodes.id
353
+ WHERE nodes_fts MATCH ?
315
354
  `;
316
355
  const params = [ftsQuery];
317
356
  if (kinds && kinds.length > 0) {
@@ -342,21 +381,21 @@ class QueryBuilder {
342
381
  */
343
382
  searchNodesLike(query, options) {
344
383
  const { kinds, languages, limit = 100, offset = 0 } = options;
345
- let sql = `
346
- SELECT nodes.*,
347
- CASE
348
- WHEN name = ? THEN 1.0
349
- WHEN name LIKE ? THEN 0.9
350
- WHEN name LIKE ? THEN 0.8
351
- WHEN qualified_name LIKE ? THEN 0.7
352
- ELSE 0.5
353
- END as score
354
- FROM nodes
355
- WHERE (
356
- name LIKE ? OR
357
- qualified_name LIKE ? OR
358
- name LIKE ?
359
- )
384
+ let sql = `
385
+ SELECT nodes.*,
386
+ CASE
387
+ WHEN name = ? THEN 1.0
388
+ WHEN name LIKE ? THEN 0.9
389
+ WHEN name LIKE ? THEN 0.8
390
+ WHEN qualified_name LIKE ? THEN 0.7
391
+ ELSE 0.5
392
+ END as score
393
+ FROM nodes
394
+ WHERE (
395
+ name LIKE ? OR
396
+ qualified_name LIKE ? OR
397
+ name LIKE ?
398
+ )
360
399
  `;
361
400
  // Pattern variants for better matching
362
401
  const exactMatch = query;
@@ -387,6 +426,48 @@ class QueryBuilder {
387
426
  score: row.score,
388
427
  }));
389
428
  }
429
+ /**
430
+ * Find nodes by exact name match
431
+ *
432
+ * Used for hybrid search - looks up symbols by exact name or case-insensitive match.
433
+ * Returns high-confidence matches for known symbol names extracted from query.
434
+ *
435
+ * @param names - Array of symbol names to look up
436
+ * @param options - Search options (kinds, languages, limit)
437
+ * @returns SearchResult array with exact matches scored at 1.0
438
+ */
439
+ findNodesByExactName(names, options = {}) {
440
+ if (names.length === 0)
441
+ return [];
442
+ const { kinds, languages, limit = 50 } = options;
443
+ // Build query with exact matches (case-insensitive)
444
+ let sql = `
445
+ SELECT nodes.*,
446
+ CASE
447
+ WHEN name COLLATE NOCASE IN (${names.map(() => '?').join(',')}) THEN 1.0
448
+ ELSE 0.9
449
+ END as score
450
+ FROM nodes
451
+ WHERE name COLLATE NOCASE IN (${names.map(() => '?').join(',')})
452
+ `;
453
+ // Duplicate names for both SELECT and WHERE clauses
454
+ const params = [...names, ...names];
455
+ if (kinds && kinds.length > 0) {
456
+ sql += ` AND kind IN (${kinds.map(() => '?').join(',')})`;
457
+ params.push(...kinds);
458
+ }
459
+ if (languages && languages.length > 0) {
460
+ sql += ` AND language IN (${languages.map(() => '?').join(',')})`;
461
+ params.push(...languages);
462
+ }
463
+ sql += ' ORDER BY score DESC, length(name) ASC LIMIT ?';
464
+ params.push(limit);
465
+ const rows = this.db.prepare(sql).all(...params);
466
+ return rows.map((row) => ({
467
+ node: rowToNode(row),
468
+ score: row.score,
469
+ }));
470
+ }
390
471
  // ===========================================================================
391
472
  // Edge Operations
392
473
  // ===========================================================================
@@ -395,9 +476,9 @@ class QueryBuilder {
395
476
  */
396
477
  insertEdge(edge) {
397
478
  if (!this.stmts.insertEdge) {
398
- this.stmts.insertEdge = this.db.prepare(`
399
- INSERT INTO edges (source, target, kind, metadata, line, col)
400
- VALUES (@source, @target, @kind, @metadata, @line, @col)
479
+ this.stmts.insertEdge = this.db.prepare(`
480
+ INSERT OR IGNORE INTO edges (source, target, kind, metadata, line, col)
481
+ VALUES (@source, @target, @kind, @metadata, @line, @col)
401
482
  `);
402
483
  }
403
484
  this.stmts.insertEdge.run({
@@ -466,17 +547,17 @@ class QueryBuilder {
466
547
  */
467
548
  upsertFile(file) {
468
549
  if (!this.stmts.upsertFile) {
469
- this.stmts.upsertFile = this.db.prepare(`
470
- INSERT INTO files (path, content_hash, language, size, modified_at, indexed_at, node_count, errors)
471
- VALUES (@path, @contentHash, @language, @size, @modifiedAt, @indexedAt, @nodeCount, @errors)
472
- ON CONFLICT(path) DO UPDATE SET
473
- content_hash = @contentHash,
474
- language = @language,
475
- size = @size,
476
- modified_at = @modifiedAt,
477
- indexed_at = @indexedAt,
478
- node_count = @nodeCount,
479
- errors = @errors
550
+ this.stmts.upsertFile = this.db.prepare(`
551
+ INSERT INTO files (path, content_hash, language, size, modified_at, indexed_at, node_count, errors)
552
+ VALUES (@path, @contentHash, @language, @size, @modifiedAt, @indexedAt, @nodeCount, @errors)
553
+ ON CONFLICT(path) DO UPDATE SET
554
+ content_hash = @contentHash,
555
+ language = @language,
556
+ size = @size,
557
+ modified_at = @modifiedAt,
558
+ indexed_at = @indexedAt,
559
+ node_count = @nodeCount,
560
+ errors = @errors
480
561
  `);
481
562
  }
482
563
  this.stmts.upsertFile.run({
@@ -540,9 +621,9 @@ class QueryBuilder {
540
621
  */
541
622
  insertUnresolvedRef(ref) {
542
623
  if (!this.stmts.insertUnresolved) {
543
- this.stmts.insertUnresolved = this.db.prepare(`
544
- INSERT INTO unresolved_refs (from_node_id, reference_name, reference_kind, line, col, candidates)
545
- VALUES (@fromNodeId, @referenceName, @referenceKind, @line, @col, @candidates)
624
+ this.stmts.insertUnresolved = this.db.prepare(`
625
+ INSERT INTO unresolved_refs (from_node_id, reference_name, reference_kind, line, col, file_path, language, candidates)
626
+ VALUES (@fromNodeId, @referenceName, @referenceKind, @line, @col, @filePath, @language, @candidates)
546
627
  `);
547
628
  }
548
629
  this.stmts.insertUnresolved.run({
@@ -551,9 +632,38 @@ class QueryBuilder {
551
632
  referenceKind: ref.referenceKind,
552
633
  line: ref.line,
553
634
  col: ref.column,
635
+ filePath: ref.filePath ?? null,
636
+ language: ref.language ?? null,
554
637
  candidates: ref.candidates ? JSON.stringify(ref.candidates) : null,
555
638
  });
556
639
  }
640
+ /**
641
+ * Insert multiple unresolved references in a single transaction
642
+ */
643
+ insertUnresolvedRefsBatch(refs) {
644
+ if (refs.length === 0)
645
+ return;
646
+ if (!this.stmts.insertUnresolved) {
647
+ this.stmts.insertUnresolved = this.db.prepare(`
648
+ INSERT INTO unresolved_refs (from_node_id, reference_name, reference_kind, line, col, file_path, language, candidates)
649
+ VALUES (@fromNodeId, @referenceName, @referenceKind, @line, @col, @filePath, @language, @candidates)
650
+ `);
651
+ }
652
+ this.db.transaction(() => {
653
+ for (const ref of refs) {
654
+ this.stmts.insertUnresolved.run({
655
+ fromNodeId: ref.fromNodeId,
656
+ referenceName: ref.referenceName,
657
+ referenceKind: ref.referenceKind,
658
+ line: ref.line,
659
+ col: ref.column,
660
+ filePath: ref.filePath ?? null,
661
+ language: ref.language ?? null,
662
+ candidates: ref.candidates ? JSON.stringify(ref.candidates) : null,
663
+ });
664
+ }
665
+ })();
666
+ }
557
667
  /**
558
668
  * Delete unresolved references from a node
559
669
  */
@@ -577,7 +687,9 @@ class QueryBuilder {
577
687
  referenceKind: row.reference_kind,
578
688
  line: row.line,
579
689
  column: row.col,
580
- candidates: row.candidates ? JSON.parse(row.candidates) : undefined,
690
+ filePath: row.file_path ?? undefined,
691
+ language: row.language ?? undefined,
692
+ candidates: row.candidates ? (0, utils_1.safeJsonParse)(row.candidates, []) : undefined,
581
693
  }));
582
694
  }
583
695
  /**
@@ -591,7 +703,9 @@ class QueryBuilder {
591
703
  referenceKind: row.reference_kind,
592
704
  line: row.line,
593
705
  column: row.col,
594
- candidates: row.candidates ? JSON.parse(row.candidates) : undefined,
706
+ filePath: row.file_path ?? undefined,
707
+ language: row.language ?? undefined,
708
+ candidates: row.candidates ? (0, utils_1.safeJsonParse)(row.candidates, []) : undefined,
595
709
  }));
596
710
  }
597
711
  /**