@optave/codegraph 3.9.1 → 3.9.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/README.md +12 -14
- package/dist/cli/commands/batch.d.ts.map +1 -1
- package/dist/cli/commands/batch.js +5 -17
- package/dist/cli/commands/batch.js.map +1 -1
- package/dist/cli/commands/structure.d.ts.map +1 -1
- package/dist/cli/commands/structure.js +18 -1
- package/dist/cli/commands/structure.js.map +1 -1
- package/dist/db/connection.d.ts +2 -0
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +2 -2
- package/dist/db/connection.js.map +1 -1
- package/dist/db/index.d.ts +1 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +1 -1
- package/dist/db/index.js.map +1 -1
- package/dist/domain/analysis/context.d.ts.map +1 -1
- package/dist/domain/analysis/context.js +5 -15
- package/dist/domain/analysis/context.js.map +1 -1
- package/dist/domain/analysis/dependencies.d.ts +5 -5
- package/dist/domain/analysis/dependencies.d.ts.map +1 -1
- package/dist/domain/analysis/dependencies.js +6 -16
- package/dist/domain/analysis/dependencies.js.map +1 -1
- package/dist/domain/analysis/fn-impact.js +2 -2
- package/dist/domain/analysis/fn-impact.js.map +1 -1
- package/dist/domain/analysis/implementations.d.ts.map +1 -1
- package/dist/domain/analysis/implementations.js +3 -13
- package/dist/domain/analysis/implementations.js.map +1 -1
- package/dist/domain/graph/builder/context.d.ts +4 -0
- package/dist/domain/graph/builder/context.d.ts.map +1 -1
- package/dist/domain/graph/builder/context.js +4 -0
- package/dist/domain/graph/builder/context.js.map +1 -1
- package/dist/domain/graph/builder/native-db-proxy.d.ts +24 -0
- package/dist/domain/graph/builder/native-db-proxy.d.ts.map +1 -0
- package/dist/domain/graph/builder/native-db-proxy.js +87 -0
- package/dist/domain/graph/builder/native-db-proxy.js.map +1 -0
- package/dist/domain/graph/builder/pipeline.d.ts.map +1 -1
- package/dist/domain/graph/builder/pipeline.js +133 -69
- package/dist/domain/graph/builder/pipeline.js.map +1 -1
- package/dist/domain/graph/builder/stages/build-edges.d.ts.map +1 -1
- package/dist/domain/graph/builder/stages/build-edges.js +15 -2
- package/dist/domain/graph/builder/stages/build-edges.js.map +1 -1
- package/dist/domain/graph/builder/stages/build-structure.js +2 -2
- package/dist/domain/graph/builder/stages/build-structure.js.map +1 -1
- package/dist/domain/graph/builder/stages/detect-changes.d.ts.map +1 -1
- package/dist/domain/graph/builder/stages/detect-changes.js +6 -28
- package/dist/domain/graph/builder/stages/detect-changes.js.map +1 -1
- package/dist/domain/graph/builder/stages/finalize.js +1 -1
- package/dist/domain/graph/builder/stages/finalize.js.map +1 -1
- package/dist/domain/graph/builder/stages/insert-nodes.d.ts.map +1 -1
- package/dist/domain/graph/builder/stages/insert-nodes.js +16 -12
- package/dist/domain/graph/builder/stages/insert-nodes.js.map +1 -1
- package/dist/domain/graph/builder/stages/resolve-imports.d.ts.map +1 -1
- package/dist/domain/graph/builder/stages/resolve-imports.js +2 -3
- package/dist/domain/graph/builder/stages/resolve-imports.js.map +1 -1
- package/dist/domain/parser.d.ts.map +1 -1
- package/dist/domain/parser.js +5 -2
- package/dist/domain/parser.js.map +1 -1
- package/dist/domain/queries.d.ts +1 -1
- package/dist/domain/queries.d.ts.map +1 -1
- package/dist/domain/queries.js +1 -1
- package/dist/domain/queries.js.map +1 -1
- package/dist/features/audit.d.ts.map +1 -1
- package/dist/features/audit.js +3 -2
- package/dist/features/audit.js.map +1 -1
- package/dist/features/boundaries.d.ts.map +1 -1
- package/dist/features/boundaries.js +3 -5
- package/dist/features/boundaries.js.map +1 -1
- package/dist/features/branch-compare.d.ts.map +1 -1
- package/dist/features/branch-compare.js +2 -1
- package/dist/features/branch-compare.js.map +1 -1
- package/dist/features/flow.d.ts.map +1 -1
- package/dist/features/flow.js +2 -1
- package/dist/features/flow.js.map +1 -1
- package/dist/features/manifesto.d.ts.map +1 -1
- package/dist/features/manifesto.js +15 -1
- package/dist/features/manifesto.js.map +1 -1
- package/dist/infrastructure/config.d.ts +1 -0
- package/dist/infrastructure/config.d.ts.map +1 -1
- package/dist/infrastructure/config.js +1 -0
- package/dist/infrastructure/config.js.map +1 -1
- package/dist/presentation/batch.d.ts.map +1 -1
- package/dist/presentation/batch.js +1 -0
- package/dist/presentation/batch.js.map +1 -1
- package/dist/presentation/structure.d.ts +1 -1
- package/dist/presentation/structure.d.ts.map +1 -1
- package/dist/presentation/structure.js +1 -1
- package/dist/presentation/structure.js.map +1 -1
- package/dist/shared/normalize.d.ts +12 -0
- package/dist/shared/normalize.d.ts.map +1 -1
- package/dist/shared/normalize.js +4 -0
- package/dist/shared/normalize.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/cli/commands/batch.ts +5 -26
- package/src/cli/commands/structure.ts +21 -1
- package/src/db/connection.ts +2 -2
- package/src/db/index.ts +2 -0
- package/src/domain/analysis/context.ts +5 -15
- package/src/domain/analysis/dependencies.ts +6 -16
- package/src/domain/analysis/fn-impact.ts +2 -2
- package/src/domain/analysis/implementations.ts +3 -13
- package/src/domain/graph/builder/context.ts +4 -0
- package/src/domain/graph/builder/native-db-proxy.ts +98 -0
- package/src/domain/graph/builder/pipeline.ts +135 -67
- package/src/domain/graph/builder/stages/build-edges.ts +15 -2
- package/src/domain/graph/builder/stages/build-structure.ts +2 -2
- package/src/domain/graph/builder/stages/detect-changes.ts +11 -33
- package/src/domain/graph/builder/stages/finalize.ts +1 -1
- package/src/domain/graph/builder/stages/insert-nodes.ts +17 -14
- package/src/domain/graph/builder/stages/resolve-imports.ts +2 -3
- package/src/domain/parser.ts +6 -2
- package/src/domain/queries.ts +1 -1
- package/src/features/audit.ts +3 -2
- package/src/features/boundaries.ts +3 -5
- package/src/features/branch-compare.ts +2 -3
- package/src/features/flow.ts +2 -1
- package/src/features/manifesto.ts +15 -1
- package/src/infrastructure/config.ts +1 -0
- package/src/presentation/batch.ts +1 -0
- package/src/presentation/structure.ts +2 -2
- package/src/shared/normalize.ts +10 -0
- package/src/types.ts +1 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Repository, SqliteRepository } from '../../db/index.js';
|
|
2
2
|
import { isTestFile } from '../../infrastructure/test-filter.js';
|
|
3
|
-
import { normalizeSymbol } from '../../shared/normalize.js';
|
|
3
|
+
import { normalizeSymbol, toSymbolRef } from '../../shared/normalize.js';
|
|
4
4
|
import { paginateResult } from '../../shared/paginate.js';
|
|
5
5
|
import { resolveAnalysisOpts, withRepo } from './query-helpers.js';
|
|
6
6
|
import { findMatchingNodes } from './symbol-lookup.js';
|
|
@@ -72,7 +72,7 @@ export function bfsTransitiveCallers(dbOrRepo, startId, { noTests = false, maxDe
|
|
|
72
72
|
nextFrontier.push(c.id);
|
|
73
73
|
if (!levels[d])
|
|
74
74
|
levels[d] = [];
|
|
75
|
-
levels[d].push(
|
|
75
|
+
levels[d].push(toSymbolRef(c));
|
|
76
76
|
if (onVisit)
|
|
77
77
|
onVisit(c, fid, d);
|
|
78
78
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fn-impact.js","sourceRoot":"","sources":["../../../src/domain/analysis/fn-impact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"fn-impact.js","sourceRoot":"","sources":["../../../src/domain/analysis/fn-impact.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"implementations.d.ts","sourceRoot":"","sources":["../../../src/domain/analysis/implementations.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"implementations.d.ts","sourceRoot":"","sources":["../../../src/domain/analysis/implementations.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO;;;;;;;;;;;;;;;;;;;EA6BhG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO;;;;;;;;;;;;;;;;;;;EA6BhG"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isTestFile } from '../../infrastructure/test-filter.js';
|
|
2
2
|
import { CORE_SYMBOL_KINDS } from '../../shared/kinds.js';
|
|
3
|
-
import { normalizeSymbol } from '../../shared/normalize.js';
|
|
3
|
+
import { normalizeSymbol, toSymbolRef } from '../../shared/normalize.js';
|
|
4
4
|
import { paginateResult } from '../../shared/paginate.js';
|
|
5
5
|
import { withRepo } from './query-helpers.js';
|
|
6
6
|
import { findMatchingNodes } from './symbol-lookup.js';
|
|
@@ -26,12 +26,7 @@ export function implementationsData(name, customDbPath, opts = {}) {
|
|
|
26
26
|
implementors = implementors.filter((n) => !isTestFile(n.file));
|
|
27
27
|
return {
|
|
28
28
|
...normalizeSymbol(node, repo, hc),
|
|
29
|
-
implementors: implementors.map(
|
|
30
|
-
name: impl.name,
|
|
31
|
-
kind: impl.kind,
|
|
32
|
-
file: impl.file,
|
|
33
|
-
line: impl.line,
|
|
34
|
-
})),
|
|
29
|
+
implementors: implementors.map(toSymbolRef),
|
|
35
30
|
};
|
|
36
31
|
});
|
|
37
32
|
const base = { name, results };
|
|
@@ -60,12 +55,7 @@ export function interfacesData(name, customDbPath, opts = {}) {
|
|
|
60
55
|
interfaces = interfaces.filter((n) => !isTestFile(n.file));
|
|
61
56
|
return {
|
|
62
57
|
...normalizeSymbol(node, repo, hc),
|
|
63
|
-
interfaces: interfaces.map(
|
|
64
|
-
name: iface.name,
|
|
65
|
-
kind: iface.kind,
|
|
66
|
-
file: iface.file,
|
|
67
|
-
line: iface.line,
|
|
68
|
-
})),
|
|
58
|
+
interfaces: interfaces.map(toSymbolRef),
|
|
69
59
|
};
|
|
70
60
|
});
|
|
71
61
|
const base = { name, results };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"implementations.js","sourceRoot":"","sources":["../../../src/domain/analysis/implementations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"implementations.js","sourceRoot":"","sources":["../../../src/domain/analysis/implementations.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,10 @@ export declare class PipelineContext {
|
|
|
19
19
|
forceFullRebuild: boolean;
|
|
20
20
|
schemaVersion: number;
|
|
21
21
|
nativeDb?: NativeDatabase;
|
|
22
|
+
/** Whether native engine is available (deferred — DB opened only when needed). */
|
|
23
|
+
nativeAvailable: boolean;
|
|
24
|
+
/** True when ctx.db is a NativeDbProxy — single rusqlite connection for the entire pipeline. */
|
|
25
|
+
nativeFirstProxy: boolean;
|
|
22
26
|
allFiles: string[];
|
|
23
27
|
discoveredDirs: Set<string>;
|
|
24
28
|
isFullBuild: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../src/domain/graph/builder/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EACV,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,UAAU,EACV,eAAe,EACf,WAAW,EACX,cAAc,EACd,cAAc,EACd,OAAO,EACP,WAAW,EACX,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,eAAe;IAE1B,OAAO,EAAG,MAAM,CAAC;IACjB,EAAE,EAAG,qBAAqB,CAAC;IAC3B,MAAM,EAAG,MAAM,CAAC;IAChB,MAAM,EAAG,eAAe,CAAC;IACzB,IAAI,EAAG,cAAc,CAAC;IACtB,UAAU,EAAG,UAAU,CAAC;IACxB,UAAU,EAAG,QAAQ,GAAG,MAAM,CAAC;IAC/B,aAAa,EAAG,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAG,WAAW,CAAC;IACtB,WAAW,EAAG,OAAO,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAS;IAClC,aAAa,EAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../src/domain/graph/builder/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EACV,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,UAAU,EACV,eAAe,EACf,WAAW,EACX,cAAc,EACd,cAAc,EACd,OAAO,EACP,WAAW,EACX,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,eAAe;IAE1B,OAAO,EAAG,MAAM,CAAC;IACjB,EAAE,EAAG,qBAAqB,CAAC;IAC3B,MAAM,EAAG,MAAM,CAAC;IAChB,MAAM,EAAG,eAAe,CAAC;IACzB,IAAI,EAAG,cAAc,CAAC;IACtB,UAAU,EAAG,UAAU,CAAC;IACxB,UAAU,EAAG,QAAQ,GAAG,MAAM,CAAC;IAC/B,aAAa,EAAG,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAG,WAAW,CAAC;IACtB,WAAW,EAAG,OAAO,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAS;IAClC,aAAa,EAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,kFAAkF;IAClF,eAAe,EAAE,OAAO,CAAS;IACjC,gGAAgG;IAChG,gBAAgB,EAAE,OAAO,CAAS;IAGlC,QAAQ,EAAG,MAAM,EAAE,CAAC;IACpB,cAAc,EAAG,GAAG,CAAC,MAAM,CAAC,CAAC;IAG7B,WAAW,EAAG,OAAO,CAAC;IACtB,YAAY,EAAG,WAAW,EAAE,CAAC;IAC7B,eAAe,EAAG,cAAc,EAAE,CAAC;IACnC,OAAO,EAAG,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,OAAO,CAAS;IAG3B,UAAU,EAAG,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC1C,WAAW,EAAG,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC3C,YAAY,EAAG,WAAW,EAAE,CAAC;IAG7B,aAAa,EAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC3C,WAAW,EAAG,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACrC,eAAe,EAAG,GAAG,CAAC,MAAM,CAAC,CAAC;IAG9B,WAAW,EAAG,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACrC,kBAAkB,EAAG,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAG5C,aAAa,EAAE,OAAO,CAAS;IAC/B,YAAY,EAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAGnC,MAAM,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KACnC,CAAM;IACP,UAAU,EAAG,MAAM,CAAC;CACrB"}
|
|
@@ -13,6 +13,10 @@ export class PipelineContext {
|
|
|
13
13
|
forceFullRebuild = false;
|
|
14
14
|
schemaVersion;
|
|
15
15
|
nativeDb;
|
|
16
|
+
/** Whether native engine is available (deferred — DB opened only when needed). */
|
|
17
|
+
nativeAvailable = false;
|
|
18
|
+
/** True when ctx.db is a NativeDbProxy — single rusqlite connection for the entire pipeline. */
|
|
19
|
+
nativeFirstProxy = false;
|
|
16
20
|
// ── File collection (set by collectFiles stage) ────────────────────
|
|
17
21
|
allFiles;
|
|
18
22
|
discoveredDirs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/domain/graph/builder/context.ts"],"names":[],"mappings":"AAoBA,MAAM,OAAO,eAAe;IAC1B,sEAAsE;IACtE,OAAO,CAAU;IACjB,EAAE,CAAyB;IAC3B,MAAM,CAAU;IAChB,MAAM,CAAmB;IACzB,IAAI,CAAkB;IACtB,UAAU,CAAc;IACxB,UAAU,CAAqB;IAC/B,aAAa,CAAiB;IAC9B,OAAO,CAAe;IACtB,WAAW,CAAW;IACtB,gBAAgB,GAAY,KAAK,CAAC;IAClC,aAAa,CAAU;IACvB,QAAQ,CAAkB;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/domain/graph/builder/context.ts"],"names":[],"mappings":"AAoBA,MAAM,OAAO,eAAe;IAC1B,sEAAsE;IACtE,OAAO,CAAU;IACjB,EAAE,CAAyB;IAC3B,MAAM,CAAU;IAChB,MAAM,CAAmB;IACzB,IAAI,CAAkB;IACtB,UAAU,CAAc;IACxB,UAAU,CAAqB;IAC/B,aAAa,CAAiB;IAC9B,OAAO,CAAe;IACtB,WAAW,CAAW;IACtB,gBAAgB,GAAY,KAAK,CAAC;IAClC,aAAa,CAAU;IACvB,QAAQ,CAAkB;IAC1B,kFAAkF;IAClF,eAAe,GAAY,KAAK,CAAC;IACjC,gGAAgG;IAChG,gBAAgB,GAAY,KAAK,CAAC;IAElC,sEAAsE;IACtE,QAAQ,CAAY;IACpB,cAAc,CAAe;IAE7B,sEAAsE;IACtE,WAAW,CAAW;IACtB,YAAY,CAAiB;IAC7B,eAAe,CAAoB;IACnC,OAAO,CAAY;IACnB,SAAS,GAAY,KAAK,CAAC;IAE3B,sEAAsE;IACtE,UAAU,CAAgC;IAC1C,WAAW,CAAgC;IAC3C,YAAY,CAAiB;IAE7B,sEAAsE;IACtE,aAAa,CAA8B;IAC3C,WAAW,CAA0B;IACrC,eAAe,CAAe;IAE9B,sEAAsE;IACtE,WAAW,CAA0B;IACrC,kBAAkB,CAA0B;IAE5C,sEAAsE;IACtE,aAAa,GAAY,KAAK,CAAC;IAC/B,YAAY,CAAuB;IAEnC,sEAAsE;IACtE,MAAM,GAcF,EAAE,CAAC;IACP,UAAU,CAAU;CACrB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NativeDbProxy — wraps a NativeDatabase (rusqlite via napi-rs) to satisfy the
|
|
3
|
+
* BetterSqlite3Database interface. When the native addon is available, the
|
|
4
|
+
* build pipeline uses this proxy as `ctx.db` so that every stage operates on a
|
|
5
|
+
* single rusqlite connection — no dual-connection WAL corruption, no
|
|
6
|
+
* open/close/reopen dance.
|
|
7
|
+
*
|
|
8
|
+
* When native is unavailable, the pipeline falls back to real better-sqlite3.
|
|
9
|
+
*/
|
|
10
|
+
import type { BetterSqlite3Database, NativeDatabase, SqliteStatement } from '../../../types.js';
|
|
11
|
+
export declare class NativeDbProxy implements BetterSqlite3Database {
|
|
12
|
+
#private;
|
|
13
|
+
/** Advisory lock path — set by the pipeline so closeDb() can release it. */
|
|
14
|
+
__lockPath?: string;
|
|
15
|
+
constructor(nativeDb: NativeDatabase);
|
|
16
|
+
prepare<TRow = unknown>(sql: string): SqliteStatement<TRow>;
|
|
17
|
+
exec(sql: string): this;
|
|
18
|
+
pragma(sql: string): unknown;
|
|
19
|
+
close(): void;
|
|
20
|
+
get open(): boolean;
|
|
21
|
+
get name(): string;
|
|
22
|
+
transaction<F extends (...args: any[]) => any>(fn: F): (...args: F extends (...a: infer A) => unknown ? A : never) => ReturnType<F>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=native-db-proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-db-proxy.d.ts","sourceRoot":"","sources":["../../../../src/domain/graph/builder/native-db-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAQhG,qBAAa,aAAc,YAAW,qBAAqB;;IAEzD,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;gBAER,QAAQ,EAAE,cAAc;IAIpC,OAAO,CAAC,IAAI,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC;IA0B3D,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKvB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,WAAW,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC3C,EAAE,EAAE,CAAC,GACJ,CAAC,GAAG,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,OAAO,GAAG,CAAC,GAAG,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC;CAoBhF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NativeDbProxy — wraps a NativeDatabase (rusqlite via napi-rs) to satisfy the
|
|
3
|
+
* BetterSqlite3Database interface. When the native addon is available, the
|
|
4
|
+
* build pipeline uses this proxy as `ctx.db` so that every stage operates on a
|
|
5
|
+
* single rusqlite connection — no dual-connection WAL corruption, no
|
|
6
|
+
* open/close/reopen dance.
|
|
7
|
+
*
|
|
8
|
+
* When native is unavailable, the pipeline falls back to real better-sqlite3.
|
|
9
|
+
*/
|
|
10
|
+
/** Sanitize params for napi-rs: better-sqlite3 treats `undefined` as NULL,
|
|
11
|
+
* but serde_json cannot represent `undefined`. Replace with `null`. */
|
|
12
|
+
function sanitize(params) {
|
|
13
|
+
return params.map((p) => (p === undefined ? null : p));
|
|
14
|
+
}
|
|
15
|
+
export class NativeDbProxy {
|
|
16
|
+
#ndb;
|
|
17
|
+
/** Advisory lock path — set by the pipeline so closeDb() can release it. */
|
|
18
|
+
__lockPath;
|
|
19
|
+
constructor(nativeDb) {
|
|
20
|
+
this.#ndb = nativeDb;
|
|
21
|
+
}
|
|
22
|
+
prepare(sql) {
|
|
23
|
+
const ndb = this.#ndb;
|
|
24
|
+
const stmt = {
|
|
25
|
+
all(...params) {
|
|
26
|
+
return ndb.queryAll(sql, sanitize(params));
|
|
27
|
+
},
|
|
28
|
+
get(...params) {
|
|
29
|
+
return (ndb.queryGet(sql, sanitize(params)) ?? undefined);
|
|
30
|
+
},
|
|
31
|
+
run(...params) {
|
|
32
|
+
ndb.queryAll(sql, sanitize(params));
|
|
33
|
+
// Retrieve last_insert_rowid via SQLite scalar function so callers
|
|
34
|
+
// that depend on it (e.g. CFG block edge mapping) get correct values.
|
|
35
|
+
const row = ndb.queryGet('SELECT last_insert_rowid() AS rid', []);
|
|
36
|
+
return { changes: 0, lastInsertRowid: row?.rid ?? 0 };
|
|
37
|
+
},
|
|
38
|
+
iterate() {
|
|
39
|
+
throw new Error('iterate() is not supported via NativeDbProxy');
|
|
40
|
+
},
|
|
41
|
+
raw() {
|
|
42
|
+
return stmt; // no-op — .raw() is not used in the build pipeline
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
return stmt;
|
|
46
|
+
}
|
|
47
|
+
exec(sql) {
|
|
48
|
+
this.#ndb.exec(sql);
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
pragma(sql) {
|
|
52
|
+
return this.#ndb.pragma(sql);
|
|
53
|
+
}
|
|
54
|
+
close() {
|
|
55
|
+
// No-op: the pipeline manages the NativeDatabase lifecycle directly.
|
|
56
|
+
// closeDbPair() calls nativeDb.close() separately.
|
|
57
|
+
}
|
|
58
|
+
get open() {
|
|
59
|
+
return this.#ndb.isOpen;
|
|
60
|
+
}
|
|
61
|
+
get name() {
|
|
62
|
+
return this.#ndb.dbPath;
|
|
63
|
+
}
|
|
64
|
+
transaction(fn) {
|
|
65
|
+
const ndb = this.#ndb;
|
|
66
|
+
return ((...args) => {
|
|
67
|
+
// NOTE: nested transactions (savepoints) are not supported — ensure callers
|
|
68
|
+
// do not invoke a transaction() wrapper from within an existing transaction.
|
|
69
|
+
ndb.exec('BEGIN');
|
|
70
|
+
try {
|
|
71
|
+
const result = fn(...args);
|
|
72
|
+
ndb.exec('COMMIT');
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
try {
|
|
77
|
+
ndb.exec('ROLLBACK');
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Ignore rollback errors — the original error is more important
|
|
81
|
+
}
|
|
82
|
+
throw e;
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=native-db-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-db-proxy.js","sourceRoot":"","sources":["../../../../src/domain/graph/builder/native-db-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;wEACwE;AACxE,SAAS,QAAQ,CAAC,MAAiB;IACjC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAkC,CAAC;AAC1F,CAAC;AAED,MAAM,OAAO,aAAa;IACf,IAAI,CAAiB;IAC9B,4EAA4E;IAC5E,UAAU,CAAU;IAEpB,YAAY,QAAwB;QAClC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;IACvB,CAAC;IAED,OAAO,CAAiB,GAAW;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,MAAM,IAAI,GAA0B;YAClC,GAAG,CAAC,GAAG,MAAiB;gBACtB,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAW,CAAC;YACvD,CAAC;YACD,GAAG,CAAC,GAAG,MAAiB;gBACtB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,SAAS,CAAqB,CAAC;YAChF,CAAC;YACD,GAAG,CAAC,GAAG,MAAiB;gBACtB,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBACpC,mEAAmE;gBACnE,sEAAsE;gBACtE,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,mCAAmC,EAAE,EAAE,CAA2B,CAAC;gBAC5F,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACxD,CAAC;YACD,OAAO;gBACL,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;YACD,GAAG;gBACD,OAAO,IAAI,CAAC,CAAC,mDAAmD;YAClE,CAAC;SACF,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,GAAW;QACd,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK;QACH,qEAAqE;QACrE,mDAAmD;IACrD,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,WAAW,CACT,EAAK;QAEL,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,OAAO,CAAC,CAAC,GAAG,IAAe,EAAE,EAAE;YAC7B,4EAA4E;YAC5E,6EAA6E;YAC7E,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC3B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACnB,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC;oBACH,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACvB,CAAC;gBAAC,MAAM,CAAC;oBACP,gEAAgE;gBAClE,CAAC;gBACD,MAAM,CAAC,CAAC;YACV,CAAC;QACH,CAAC,CAAQ,CAAC;IACZ,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/domain/graph/builder/pipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/domain/graph/builder/pipeline.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAA+B,MAAM,mBAAmB,CAAC;AA2uBlG;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAiClC"}
|
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
* This is the heart of the builder refactor (ROADMAP 3.9): the monolithic buildGraph()
|
|
5
5
|
* is decomposed into independently testable stages that communicate via PipelineContext.
|
|
6
6
|
*/
|
|
7
|
+
import fs from 'node:fs';
|
|
7
8
|
import path from 'node:path';
|
|
8
9
|
import { performance } from 'node:perf_hooks';
|
|
9
|
-
import { closeDbPair, getBuildMeta, initSchema, MIGRATIONS, openDb, setBuildMeta, } from '../../../db/index.js';
|
|
10
|
+
import { acquireAdvisoryLock, closeDbPair, getBuildMeta, initSchema, MIGRATIONS, openDb, releaseAdvisoryLock, setBuildMeta, } from '../../../db/index.js';
|
|
10
11
|
import { detectWorkspaces, loadConfig } from '../../../infrastructure/config.js';
|
|
11
12
|
import { debug, info, warn } from '../../../infrastructure/logger.js';
|
|
12
13
|
import { loadNative } from '../../../infrastructure/native.js';
|
|
@@ -17,6 +18,7 @@ import { getActiveEngine } from '../../parser.js';
|
|
|
17
18
|
import { setWorkspaces } from '../resolve.js';
|
|
18
19
|
import { PipelineContext } from './context.js';
|
|
19
20
|
import { loadPathAliases } from './helpers.js';
|
|
21
|
+
import { NativeDbProxy } from './native-db-proxy.js';
|
|
20
22
|
import { buildEdges } from './stages/build-edges.js';
|
|
21
23
|
import { buildStructure } from './stages/build-structure.js';
|
|
22
24
|
// Pipeline stages
|
|
@@ -33,28 +35,11 @@ function initializeEngine(ctx) {
|
|
|
33
35
|
engine: ctx.opts.engine || 'auto',
|
|
34
36
|
dataflow: ctx.opts.dataflow !== false,
|
|
35
37
|
ast: ctx.opts.ast !== false,
|
|
36
|
-
nativeDb
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
// After native writes, resumeJsDb checkpoints through rusqlite so
|
|
42
|
-
// better-sqlite3 never reads WAL frames from a different SQLite library.
|
|
43
|
-
suspendJsDb: ctx.nativeDb
|
|
44
|
-
? () => {
|
|
45
|
-
ctx.db.pragma('wal_checkpoint(TRUNCATE)');
|
|
46
|
-
}
|
|
47
|
-
: undefined,
|
|
48
|
-
resumeJsDb: ctx.nativeDb
|
|
49
|
-
? () => {
|
|
50
|
-
try {
|
|
51
|
-
ctx.nativeDb?.exec('PRAGMA wal_checkpoint(TRUNCATE)');
|
|
52
|
-
}
|
|
53
|
-
catch (e) {
|
|
54
|
-
debug(`resumeJsDb: WAL checkpoint failed (nativeDb may already be closed): ${toErrorMessage(e)}`);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
: undefined,
|
|
38
|
+
// nativeDb and WAL callbacks are set later when NativeDatabase is opened
|
|
39
|
+
// (deferred to skip overhead on no-op rebuilds).
|
|
40
|
+
nativeDb: undefined,
|
|
41
|
+
suspendJsDb: undefined,
|
|
42
|
+
resumeJsDb: undefined,
|
|
58
43
|
};
|
|
59
44
|
const { name: engineName, version: engineVersion } = getActiveEngine(ctx.engineOpts);
|
|
60
45
|
ctx.engineName = engineName;
|
|
@@ -67,10 +52,10 @@ function checkEngineSchemaMismatch(ctx) {
|
|
|
67
52
|
ctx.forceFullRebuild = false;
|
|
68
53
|
if (!ctx.incremental)
|
|
69
54
|
return;
|
|
70
|
-
//
|
|
71
|
-
//
|
|
72
|
-
|
|
73
|
-
const meta = (key) =>
|
|
55
|
+
// NativeDatabase is deferred until after change detection, so always use
|
|
56
|
+
// better-sqlite3 for metadata reads here. Reads are safe — WAL conflicts
|
|
57
|
+
// only arise from concurrent writes.
|
|
58
|
+
const meta = (key) => getBuildMeta(ctx.db, key);
|
|
74
59
|
const prevEngine = meta('engine');
|
|
75
60
|
if (prevEngine && prevEngine !== ctx.engineName) {
|
|
76
61
|
info(`Engine changed (${prevEngine} → ${ctx.engineName}), promoting to full rebuild.`);
|
|
@@ -107,36 +92,46 @@ function loadAliases(ctx) {
|
|
|
107
92
|
function setupPipeline(ctx) {
|
|
108
93
|
ctx.rootDir = path.resolve(ctx.rootDir);
|
|
109
94
|
ctx.dbPath = path.join(ctx.rootDir, '.codegraph', 'graph.db');
|
|
110
|
-
|
|
111
|
-
// Use NativeDatabase for schema init when native engine is available (Phase 6.13).
|
|
112
|
-
// better-sqlite3 (ctx.db) is still always opened — needed for queries and stages
|
|
113
|
-
// that haven't been migrated to rusqlite yet.
|
|
114
|
-
// Skip native DB entirely when user explicitly requested --engine wasm.
|
|
95
|
+
// Detect whether native engine is available.
|
|
115
96
|
const enginePref = ctx.opts.engine || 'auto';
|
|
116
97
|
const native = enginePref !== 'wasm' ? loadNative() : null;
|
|
117
|
-
|
|
98
|
+
ctx.nativeAvailable = !!native?.NativeDatabase;
|
|
99
|
+
// Native-first: use only rusqlite for the entire pipeline (no better-sqlite3).
|
|
100
|
+
// This eliminates the dual-connection WAL corruption problem and enables all
|
|
101
|
+
// native fast-paths (bulkInsertNodes, classifyRolesFull, etc.).
|
|
102
|
+
// Fallback: if native is unavailable or FORCE_JS is set, use better-sqlite3.
|
|
103
|
+
if (ctx.nativeAvailable &&
|
|
104
|
+
native?.NativeDatabase &&
|
|
105
|
+
process.env.CODEGRAPH_FORCE_JS_PIPELINE !== '1') {
|
|
118
106
|
try {
|
|
107
|
+
const dir = path.dirname(ctx.dbPath);
|
|
108
|
+
if (!fs.existsSync(dir))
|
|
109
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
110
|
+
acquireAdvisoryLock(ctx.dbPath);
|
|
119
111
|
ctx.nativeDb = native.NativeDatabase.openReadWrite(ctx.dbPath);
|
|
120
112
|
ctx.nativeDb.initSchema();
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
ctx.
|
|
113
|
+
const proxy = new NativeDbProxy(ctx.nativeDb);
|
|
114
|
+
proxy.__lockPath = `${ctx.dbPath}.lock`;
|
|
115
|
+
ctx.db = proxy;
|
|
116
|
+
ctx.nativeFirstProxy = true;
|
|
124
117
|
}
|
|
125
118
|
catch (err) {
|
|
126
|
-
warn(`NativeDatabase setup failed, falling back to
|
|
119
|
+
warn(`NativeDatabase setup failed, falling back to better-sqlite3: ${toErrorMessage(err)}`);
|
|
127
120
|
try {
|
|
128
121
|
ctx.nativeDb?.close();
|
|
129
122
|
}
|
|
130
|
-
catch
|
|
131
|
-
|
|
123
|
+
catch {
|
|
124
|
+
/* ignore */
|
|
132
125
|
}
|
|
133
126
|
ctx.nativeDb = undefined;
|
|
127
|
+
ctx.nativeFirstProxy = false;
|
|
128
|
+
releaseAdvisoryLock(`${ctx.dbPath}.lock`);
|
|
129
|
+
ctx.db = openDb(ctx.dbPath);
|
|
130
|
+
initSchema(ctx.db);
|
|
134
131
|
}
|
|
135
|
-
// Always run JS initSchema so better-sqlite3 sees the schema —
|
|
136
|
-
// nativeDb is closed during pipeline stages and reopened for analyses.
|
|
137
|
-
initSchema(ctx.db);
|
|
138
132
|
}
|
|
139
133
|
else {
|
|
134
|
+
ctx.db = openDb(ctx.dbPath);
|
|
140
135
|
initSchema(ctx.db);
|
|
141
136
|
}
|
|
142
137
|
ctx.config = loadConfig(ctx.rootDir);
|
|
@@ -234,7 +229,10 @@ function shouldSkipNativeOrchestrator(ctx) {
|
|
|
234
229
|
return 'CODEGRAPH_FORCE_JS_PIPELINE=1';
|
|
235
230
|
if (ctx.forceFullRebuild)
|
|
236
231
|
return 'forceFullRebuild';
|
|
237
|
-
|
|
232
|
+
// v3.9.0 addon had buggy incremental purge (wrong SQL on analysis tables,
|
|
233
|
+
// scoped removal over-detection). Fixed in v3.9.1 by PR #865. Gate on
|
|
234
|
+
// < 3.9.1 so v3.9.1+ uses the fast Rust orchestrator path.
|
|
235
|
+
const orchestratorBuggy = !!ctx.engineVersion && semverCompare(ctx.engineVersion, '3.9.1') < 0;
|
|
238
236
|
if (orchestratorBuggy)
|
|
239
237
|
return `buggy addon ${ctx.engineVersion}`;
|
|
240
238
|
if (ctx.engineName !== 'native')
|
|
@@ -382,20 +380,25 @@ async function runPostNativeAnalysis(ctx, allFileSymbols, changedFiles) {
|
|
|
382
380
|
else {
|
|
383
381
|
analysisFileSymbols = allFileSymbols;
|
|
384
382
|
}
|
|
385
|
-
//
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
ctx.engineOpts
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
ctx.engineOpts
|
|
383
|
+
// In native-first mode, nativeDb is already open — no reopen needed.
|
|
384
|
+
if (!ctx.nativeFirstProxy) {
|
|
385
|
+
const native = loadNative();
|
|
386
|
+
if (native?.NativeDatabase) {
|
|
387
|
+
try {
|
|
388
|
+
ctx.nativeDb = native.NativeDatabase.openReadWrite(ctx.dbPath);
|
|
389
|
+
if (ctx.engineOpts)
|
|
390
|
+
ctx.engineOpts.nativeDb = ctx.nativeDb;
|
|
391
|
+
}
|
|
392
|
+
catch {
|
|
393
|
+
ctx.nativeDb = undefined;
|
|
394
|
+
if (ctx.engineOpts)
|
|
395
|
+
ctx.engineOpts.nativeDb = undefined;
|
|
396
|
+
}
|
|
397
397
|
}
|
|
398
398
|
}
|
|
399
|
+
else if (ctx.engineOpts) {
|
|
400
|
+
ctx.engineOpts.nativeDb = ctx.nativeDb;
|
|
401
|
+
}
|
|
399
402
|
try {
|
|
400
403
|
const { runAnalyses: runAnalysesFn } = await import('../../../ast-analysis/engine.js');
|
|
401
404
|
const result = await runAnalysesFn(ctx.db, analysisFileSymbols, ctx.rootDir, ctx.opts, ctx.engineOpts);
|
|
@@ -407,8 +410,8 @@ async function runPostNativeAnalysis(ctx, allFileSymbols, changedFiles) {
|
|
|
407
410
|
catch (err) {
|
|
408
411
|
warn(`Analysis phases failed after native build: ${toErrorMessage(err)}`);
|
|
409
412
|
}
|
|
410
|
-
// Close nativeDb after analyses
|
|
411
|
-
if (ctx.nativeDb) {
|
|
413
|
+
// Close nativeDb after analyses (skip in native-first — single connection stays open)
|
|
414
|
+
if (ctx.nativeDb && !ctx.nativeFirstProxy) {
|
|
412
415
|
try {
|
|
413
416
|
ctx.nativeDb.exec('PRAGMA wal_checkpoint(TRUNCATE)');
|
|
414
417
|
}
|
|
@@ -453,6 +456,28 @@ async function tryNativeOrchestrator(ctx) {
|
|
|
453
456
|
debug(`Skipping native orchestrator: ${skipReason}`);
|
|
454
457
|
return undefined;
|
|
455
458
|
}
|
|
459
|
+
// In native-first mode, nativeDb is already open from setupPipeline.
|
|
460
|
+
// Otherwise, open it on demand (deferred to skip overhead on no-op rebuilds).
|
|
461
|
+
if (!ctx.nativeDb && ctx.nativeAvailable) {
|
|
462
|
+
const native = loadNative();
|
|
463
|
+
if (native?.NativeDatabase) {
|
|
464
|
+
try {
|
|
465
|
+
ctx.nativeDb = native.NativeDatabase.openReadWrite(ctx.dbPath);
|
|
466
|
+
ctx.nativeDb.initSchema();
|
|
467
|
+
ctx.nativeDb.exec('PRAGMA wal_checkpoint(TRUNCATE)');
|
|
468
|
+
}
|
|
469
|
+
catch (err) {
|
|
470
|
+
warn(`NativeDatabase setup failed, falling back to JS: ${toErrorMessage(err)}`);
|
|
471
|
+
try {
|
|
472
|
+
ctx.nativeDb?.close();
|
|
473
|
+
}
|
|
474
|
+
catch (e) {
|
|
475
|
+
debug(`tryNativeOrchestrator: close failed during fallback: ${toErrorMessage(e)}`);
|
|
476
|
+
}
|
|
477
|
+
ctx.nativeDb = undefined;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
}
|
|
456
481
|
if (!ctx.nativeDb?.buildGraph)
|
|
457
482
|
return undefined;
|
|
458
483
|
const resultJson = ctx.nativeDb.buildGraph(ctx.rootDir, JSON.stringify(ctx.config), JSON.stringify(ctx.aliases), JSON.stringify(ctx.opts));
|
|
@@ -492,7 +517,8 @@ async function tryNativeOrchestrator(ctx) {
|
|
|
492
517
|
// skipped structure, we must run the JS fallback.
|
|
493
518
|
const needsStructure = !result.structureHandled;
|
|
494
519
|
if (needsAnalysis || needsStructure) {
|
|
495
|
-
|
|
520
|
+
// In native-first mode the proxy is already wired — no WAL handoff needed.
|
|
521
|
+
if (!ctx.nativeFirstProxy && !handoffWalAfterNativeBuild(ctx)) {
|
|
496
522
|
// DB reopen failed — return partial result
|
|
497
523
|
return formatNativeTimingResult(p, 0, analysisTiming);
|
|
498
524
|
}
|
|
@@ -513,12 +539,34 @@ async function tryNativeOrchestrator(ctx) {
|
|
|
513
539
|
}
|
|
514
540
|
// ── Pipeline stages execution ───────────────────────────────────────────
|
|
515
541
|
async function runPipelineStages(ctx) {
|
|
516
|
-
//
|
|
517
|
-
//
|
|
518
|
-
//
|
|
519
|
-
//
|
|
520
|
-
|
|
521
|
-
|
|
542
|
+
// ── Native-first mode ────────────────────────────────────────────────
|
|
543
|
+
// When ctx.nativeFirstProxy is true, ctx.db is a NativeDbProxy backed by
|
|
544
|
+
// the single rusqlite connection (ctx.nativeDb). No dual-connection WAL
|
|
545
|
+
// dance is needed — every stage uses the same connection transparently.
|
|
546
|
+
if (ctx.nativeFirstProxy) {
|
|
547
|
+
// Ensure engineOpts.nativeDb is set so stages can use dedicated native methods.
|
|
548
|
+
if (ctx.engineOpts) {
|
|
549
|
+
ctx.engineOpts.nativeDb = ctx.nativeDb;
|
|
550
|
+
}
|
|
551
|
+
await collectFiles(ctx);
|
|
552
|
+
await detectChanges(ctx);
|
|
553
|
+
if (ctx.earlyExit)
|
|
554
|
+
return;
|
|
555
|
+
await parseFiles(ctx);
|
|
556
|
+
await insertNodes(ctx);
|
|
557
|
+
await resolveImports(ctx);
|
|
558
|
+
await buildEdges(ctx);
|
|
559
|
+
await buildStructure(ctx);
|
|
560
|
+
await runAnalyses(ctx);
|
|
561
|
+
await finalize(ctx);
|
|
562
|
+
return;
|
|
563
|
+
}
|
|
564
|
+
// ── Legacy dual-connection mode (WASM / fallback) ────────────────────
|
|
565
|
+
// NativeDatabase is deferred — not opened during setup. collectFiles and
|
|
566
|
+
// detectChanges only need better-sqlite3. If no files changed, we exit
|
|
567
|
+
// early without ever opening the native connection, saving ~5ms.
|
|
568
|
+
// If nativeDb was opened by tryNativeOrchestrator (which fell through),
|
|
569
|
+
// suspend it now to avoid dual-connection WAL corruption during stages.
|
|
522
570
|
if (ctx.db && ctx.nativeDb) {
|
|
523
571
|
suspendNativeDb(ctx, 'pre-collect');
|
|
524
572
|
}
|
|
@@ -527,10 +575,12 @@ async function runPipelineStages(ctx) {
|
|
|
527
575
|
if (ctx.earlyExit)
|
|
528
576
|
return;
|
|
529
577
|
await parseFiles(ctx);
|
|
530
|
-
//
|
|
531
|
-
//
|
|
532
|
-
//
|
|
533
|
-
|
|
578
|
+
// For small incremental builds (≤smallFilesThreshold files), skip the nativeDb open/close
|
|
579
|
+
// cycle for insertNodes — the WAL checkpoint + connection churn (~5-10ms)
|
|
580
|
+
// exceeds the napi bulk-insert savings on a handful of files. The JS
|
|
581
|
+
// fallback path inside insertNodes handles this case efficiently.
|
|
582
|
+
const smallIncremental = !ctx.isFullBuild && ctx.allSymbols.size <= ctx.config.build.smallFilesThreshold;
|
|
583
|
+
if (ctx.nativeAvailable && ctx.engineName === 'native' && !smallIncremental) {
|
|
534
584
|
reopenNativeDb(ctx, 'insertNodes');
|
|
535
585
|
}
|
|
536
586
|
await insertNodes(ctx);
|
|
@@ -544,13 +594,27 @@ async function runPipelineStages(ctx) {
|
|
|
544
594
|
await buildStructure(ctx);
|
|
545
595
|
// Reopen nativeDb for feature modules (ast, cfg, complexity, dataflow)
|
|
546
596
|
// which use suspendJsDb/resumeJsDb WAL checkpoint before native writes.
|
|
547
|
-
|
|
597
|
+
// Skip for small incremental builds — same rationale as insertNodes above.
|
|
598
|
+
if (ctx.nativeAvailable && !smallIncremental) {
|
|
548
599
|
reopenNativeDb(ctx, 'analyses');
|
|
549
600
|
if (ctx.nativeDb && ctx.engineOpts) {
|
|
550
601
|
ctx.engineOpts.nativeDb = ctx.nativeDb;
|
|
602
|
+
ctx.engineOpts.suspendJsDb = () => {
|
|
603
|
+
ctx.db.pragma('wal_checkpoint(TRUNCATE)');
|
|
604
|
+
};
|
|
605
|
+
ctx.engineOpts.resumeJsDb = () => {
|
|
606
|
+
try {
|
|
607
|
+
ctx.nativeDb?.exec('PRAGMA wal_checkpoint(TRUNCATE)');
|
|
608
|
+
}
|
|
609
|
+
catch (e) {
|
|
610
|
+
debug(`resumeJsDb: WAL checkpoint failed (nativeDb may already be closed): ${toErrorMessage(e)}`);
|
|
611
|
+
}
|
|
612
|
+
};
|
|
551
613
|
}
|
|
552
614
|
if (!ctx.nativeDb && ctx.engineOpts) {
|
|
553
615
|
ctx.engineOpts.nativeDb = undefined;
|
|
616
|
+
ctx.engineOpts.suspendJsDb = undefined;
|
|
617
|
+
ctx.engineOpts.resumeJsDb = undefined;
|
|
554
618
|
}
|
|
555
619
|
}
|
|
556
620
|
await runAnalyses(ctx);
|