Add WASM fallbacks for tree-sitter and SQLite, fix installer

Replace native tree-sitter with web-tree-sitter + tree-sitter-wasms for
universal cross-platform support. Add node-sqlite3-wasm as a fallback
when better-sqlite3 native bindings aren't available. Move better-sqlite3
and sqlite-vss to optionalDependencies so installs never fail.

Fix installer to use npx fallback when global npm install fails, so MCP
config, hooks, and quick-start instructions all work without the bare
codegraph command in PATH.

Fix tests: update schema version expectation, fix db test paths and
method names, extract MAX_OUTPUT_LENGTH as module constant, normalize
Windows path separators in import resolver.
This commit is contained in:
Colby McHenry
2026-02-14 00:56:15 -06:00
parent 429359c25f
commit 8346440592
24 changed files with 707 additions and 781 deletions
+24 -24
View File
@@ -4,7 +4,7 @@
* Prepared statements for CRUD operations on the knowledge graph.
*/
import Database from 'better-sqlite3';
import { SqliteDatabase, SqliteStatement } from './sqlite-adapter';
import {
Node,
Edge,
@@ -143,7 +143,7 @@ function rowToFileRecord(row: FileRow): FileRecord {
* Query builder for the knowledge graph database
*/
export class QueryBuilder {
private db: Database.Database;
private db: SqliteDatabase;
// Node cache for frequently accessed nodes (LRU-style, max 1000 entries)
private nodeCache: Map<string, Node> = new Map();
@@ -151,30 +151,30 @@ export class QueryBuilder {
// Prepared statements (lazily initialized)
private stmts: {
insertNode?: Database.Statement;
updateNode?: Database.Statement;
deleteNode?: Database.Statement;
deleteNodesByFile?: Database.Statement;
getNodeById?: Database.Statement;
getNodesByFile?: Database.Statement;
getNodesByKind?: Database.Statement;
insertEdge?: Database.Statement;
upsertFile?: Database.Statement;
deleteEdgesBySource?: Database.Statement;
deleteEdgesByTarget?: Database.Statement;
getEdgesBySource?: Database.Statement;
getEdgesByTarget?: Database.Statement;
insertFile?: Database.Statement;
updateFile?: Database.Statement;
deleteFile?: Database.Statement;
getFileByPath?: Database.Statement;
getAllFiles?: Database.Statement;
insertUnresolved?: Database.Statement;
deleteUnresolvedByNode?: Database.Statement;
getUnresolvedByName?: Database.Statement;
insertNode?: SqliteStatement;
updateNode?: SqliteStatement;
deleteNode?: SqliteStatement;
deleteNodesByFile?: SqliteStatement;
getNodeById?: SqliteStatement;
getNodesByFile?: SqliteStatement;
getNodesByKind?: SqliteStatement;
insertEdge?: SqliteStatement;
upsertFile?: SqliteStatement;
deleteEdgesBySource?: SqliteStatement;
deleteEdgesByTarget?: SqliteStatement;
getEdgesBySource?: SqliteStatement;
getEdgesByTarget?: SqliteStatement;
insertFile?: SqliteStatement;
updateFile?: SqliteStatement;
deleteFile?: SqliteStatement;
getFileByPath?: SqliteStatement;
getAllFiles?: SqliteStatement;
insertUnresolved?: SqliteStatement;
deleteUnresolvedByNode?: SqliteStatement;
getUnresolvedByName?: SqliteStatement;
} = {};
constructor(db: Database.Database) {
constructor(db: SqliteDatabase) {
this.db = db;
}