@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.
Files changed (123) hide show
  1. package/README.md +12 -14
  2. package/dist/cli/commands/batch.d.ts.map +1 -1
  3. package/dist/cli/commands/batch.js +5 -17
  4. package/dist/cli/commands/batch.js.map +1 -1
  5. package/dist/cli/commands/structure.d.ts.map +1 -1
  6. package/dist/cli/commands/structure.js +18 -1
  7. package/dist/cli/commands/structure.js.map +1 -1
  8. package/dist/db/connection.d.ts +2 -0
  9. package/dist/db/connection.d.ts.map +1 -1
  10. package/dist/db/connection.js +2 -2
  11. package/dist/db/connection.js.map +1 -1
  12. package/dist/db/index.d.ts +1 -1
  13. package/dist/db/index.d.ts.map +1 -1
  14. package/dist/db/index.js +1 -1
  15. package/dist/db/index.js.map +1 -1
  16. package/dist/domain/analysis/context.d.ts.map +1 -1
  17. package/dist/domain/analysis/context.js +5 -15
  18. package/dist/domain/analysis/context.js.map +1 -1
  19. package/dist/domain/analysis/dependencies.d.ts +5 -5
  20. package/dist/domain/analysis/dependencies.d.ts.map +1 -1
  21. package/dist/domain/analysis/dependencies.js +6 -16
  22. package/dist/domain/analysis/dependencies.js.map +1 -1
  23. package/dist/domain/analysis/fn-impact.js +2 -2
  24. package/dist/domain/analysis/fn-impact.js.map +1 -1
  25. package/dist/domain/analysis/implementations.d.ts.map +1 -1
  26. package/dist/domain/analysis/implementations.js +3 -13
  27. package/dist/domain/analysis/implementations.js.map +1 -1
  28. package/dist/domain/graph/builder/context.d.ts +4 -0
  29. package/dist/domain/graph/builder/context.d.ts.map +1 -1
  30. package/dist/domain/graph/builder/context.js +4 -0
  31. package/dist/domain/graph/builder/context.js.map +1 -1
  32. package/dist/domain/graph/builder/native-db-proxy.d.ts +24 -0
  33. package/dist/domain/graph/builder/native-db-proxy.d.ts.map +1 -0
  34. package/dist/domain/graph/builder/native-db-proxy.js +87 -0
  35. package/dist/domain/graph/builder/native-db-proxy.js.map +1 -0
  36. package/dist/domain/graph/builder/pipeline.d.ts.map +1 -1
  37. package/dist/domain/graph/builder/pipeline.js +133 -69
  38. package/dist/domain/graph/builder/pipeline.js.map +1 -1
  39. package/dist/domain/graph/builder/stages/build-edges.d.ts.map +1 -1
  40. package/dist/domain/graph/builder/stages/build-edges.js +15 -2
  41. package/dist/domain/graph/builder/stages/build-edges.js.map +1 -1
  42. package/dist/domain/graph/builder/stages/build-structure.js +2 -2
  43. package/dist/domain/graph/builder/stages/build-structure.js.map +1 -1
  44. package/dist/domain/graph/builder/stages/detect-changes.d.ts.map +1 -1
  45. package/dist/domain/graph/builder/stages/detect-changes.js +6 -28
  46. package/dist/domain/graph/builder/stages/detect-changes.js.map +1 -1
  47. package/dist/domain/graph/builder/stages/finalize.js +1 -1
  48. package/dist/domain/graph/builder/stages/finalize.js.map +1 -1
  49. package/dist/domain/graph/builder/stages/insert-nodes.d.ts.map +1 -1
  50. package/dist/domain/graph/builder/stages/insert-nodes.js +16 -12
  51. package/dist/domain/graph/builder/stages/insert-nodes.js.map +1 -1
  52. package/dist/domain/graph/builder/stages/resolve-imports.d.ts.map +1 -1
  53. package/dist/domain/graph/builder/stages/resolve-imports.js +2 -3
  54. package/dist/domain/graph/builder/stages/resolve-imports.js.map +1 -1
  55. package/dist/domain/parser.d.ts.map +1 -1
  56. package/dist/domain/parser.js +5 -2
  57. package/dist/domain/parser.js.map +1 -1
  58. package/dist/domain/queries.d.ts +1 -1
  59. package/dist/domain/queries.d.ts.map +1 -1
  60. package/dist/domain/queries.js +1 -1
  61. package/dist/domain/queries.js.map +1 -1
  62. package/dist/features/audit.d.ts.map +1 -1
  63. package/dist/features/audit.js +3 -2
  64. package/dist/features/audit.js.map +1 -1
  65. package/dist/features/boundaries.d.ts.map +1 -1
  66. package/dist/features/boundaries.js +3 -5
  67. package/dist/features/boundaries.js.map +1 -1
  68. package/dist/features/branch-compare.d.ts.map +1 -1
  69. package/dist/features/branch-compare.js +2 -1
  70. package/dist/features/branch-compare.js.map +1 -1
  71. package/dist/features/flow.d.ts.map +1 -1
  72. package/dist/features/flow.js +2 -1
  73. package/dist/features/flow.js.map +1 -1
  74. package/dist/features/manifesto.d.ts.map +1 -1
  75. package/dist/features/manifesto.js +15 -1
  76. package/dist/features/manifesto.js.map +1 -1
  77. package/dist/infrastructure/config.d.ts +1 -0
  78. package/dist/infrastructure/config.d.ts.map +1 -1
  79. package/dist/infrastructure/config.js +1 -0
  80. package/dist/infrastructure/config.js.map +1 -1
  81. package/dist/presentation/batch.d.ts.map +1 -1
  82. package/dist/presentation/batch.js +1 -0
  83. package/dist/presentation/batch.js.map +1 -1
  84. package/dist/presentation/structure.d.ts +1 -1
  85. package/dist/presentation/structure.d.ts.map +1 -1
  86. package/dist/presentation/structure.js +1 -1
  87. package/dist/presentation/structure.js.map +1 -1
  88. package/dist/shared/normalize.d.ts +12 -0
  89. package/dist/shared/normalize.d.ts.map +1 -1
  90. package/dist/shared/normalize.js +4 -0
  91. package/dist/shared/normalize.js.map +1 -1
  92. package/dist/types.d.ts +1 -0
  93. package/dist/types.d.ts.map +1 -1
  94. package/package.json +7 -7
  95. package/src/cli/commands/batch.ts +5 -26
  96. package/src/cli/commands/structure.ts +21 -1
  97. package/src/db/connection.ts +2 -2
  98. package/src/db/index.ts +2 -0
  99. package/src/domain/analysis/context.ts +5 -15
  100. package/src/domain/analysis/dependencies.ts +6 -16
  101. package/src/domain/analysis/fn-impact.ts +2 -2
  102. package/src/domain/analysis/implementations.ts +3 -13
  103. package/src/domain/graph/builder/context.ts +4 -0
  104. package/src/domain/graph/builder/native-db-proxy.ts +98 -0
  105. package/src/domain/graph/builder/pipeline.ts +135 -67
  106. package/src/domain/graph/builder/stages/build-edges.ts +15 -2
  107. package/src/domain/graph/builder/stages/build-structure.ts +2 -2
  108. package/src/domain/graph/builder/stages/detect-changes.ts +11 -33
  109. package/src/domain/graph/builder/stages/finalize.ts +1 -1
  110. package/src/domain/graph/builder/stages/insert-nodes.ts +17 -14
  111. package/src/domain/graph/builder/stages/resolve-imports.ts +2 -3
  112. package/src/domain/parser.ts +6 -2
  113. package/src/domain/queries.ts +1 -1
  114. package/src/features/audit.ts +3 -2
  115. package/src/features/boundaries.ts +3 -5
  116. package/src/features/branch-compare.ts +2 -3
  117. package/src/features/flow.ts +2 -1
  118. package/src/features/manifesto.ts +15 -1
  119. package/src/infrastructure/config.ts +1 -0
  120. package/src/presentation/batch.ts +1 -0
  121. package/src/presentation/structure.ts +2 -2
  122. package/src/shared/normalize.ts +10 -0
  123. 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({ name: c.name, kind: c.kind, file: c.file, line: c.line });
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":"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"}
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;;;;;;;;;;;;;;;;;;;EAkChG;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;;;;;;;;;;;;;;;;;;;EAkChG"}
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((impl) => ({
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((iface) => ({
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":"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"}
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,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,YAAoB,EACpB,OAA6F,EAAE;IAE/F,OAAO,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;QACtC,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;QAErB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE;YAC1C,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB;SACjD,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAC/B,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAqB,CAAC;YACtE,IAAI,OAAO;gBAAE,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAE5E,OAAO;gBACL,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;gBAClC,YAAY,EAAE,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC;aAC5C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC/B,OAAO,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,YAAoB,EACpB,OAA6F,EAAE;IAE/F,OAAO,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;QACtC,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;QAErB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE;YAC1C,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB;SACjD,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAC/B,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAqB,CAAC;YAClE,IAAI,OAAO;gBAAE,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAExE,OAAO;gBACL,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;gBAClC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC;aACxC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC/B,OAAO,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -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;IAG1B,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"}
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;IAE1B,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"}
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":"AAsBA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAA+B,MAAM,mBAAmB,CAAC;AA0qBlG;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAiClC"}
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: ctx.nativeDb,
37
- // WAL checkpoint callbacks for dual-connection WAL guard (#696, #715).
38
- // Feature modules (ast, cfg, complexity, dataflow) receive `db` as a
39
- // parameter and cannot tolerate close/reopen (stale reference). Instead,
40
- // checkpoint the WAL so native writes start with a clean slate.
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
- // Route metadata reads through NativeDatabase only when using the native engine,
71
- // to avoid dual-SQLite WAL conflicts (rusqlite + better-sqlite3 on same file).
72
- const useNativeDb = ctx.engineName === 'native' && !!ctx.nativeDb;
73
- const meta = (key) => useNativeDb ? ctx.nativeDb.getBuildMeta(key) : getBuildMeta(ctx.db, 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
- ctx.db = openDb(ctx.dbPath);
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
- if (native?.NativeDatabase) {
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
- // Checkpoint WAL through rusqlite so better-sqlite3 sees a clean DB
122
- // with no cross-library WAL frames (#715, #717).
123
- ctx.nativeDb.exec('PRAGMA wal_checkpoint(TRUNCATE)');
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 JS: ${toErrorMessage(err)}`);
119
+ warn(`NativeDatabase setup failed, falling back to better-sqlite3: ${toErrorMessage(err)}`);
127
120
  try {
128
121
  ctx.nativeDb?.close();
129
122
  }
130
- catch (e) {
131
- debug(`setupNativeDb: close failed during fallback: ${toErrorMessage(e)}`);
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
- const orchestratorBuggy = !!ctx.engineVersion && semverCompare(ctx.engineVersion, '3.10.0') < 0;
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
- // Reopen nativeDb for analysis features (suspend/resume WAL pattern).
386
- const native = loadNative();
387
- if (native?.NativeDatabase) {
388
- try {
389
- ctx.nativeDb = native.NativeDatabase.openReadWrite(ctx.dbPath);
390
- if (ctx.engineOpts)
391
- ctx.engineOpts.nativeDb = ctx.nativeDb;
392
- }
393
- catch {
394
- ctx.nativeDb = undefined;
395
- if (ctx.engineOpts)
396
- ctx.engineOpts.nativeDb = undefined;
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
- if (!handoffWalAfterNativeBuild(ctx)) {
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
- // Prevent dual-connection WAL corruption during pipeline stages: when both
517
- // better-sqlite3 (ctx.db) and rusqlite (ctx.nativeDb) are open to the same
518
- // WAL-mode file, native writes corrupt the DB. Close nativeDb so stages
519
- // use JS fallback paths. Reopened before runAnalyses for feature modules
520
- // that use suspendJsDb/resumeJsDb WAL checkpoint pattern (#696).
521
- const hadNativeDb = !!ctx.nativeDb;
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
- // Temporarily reopen nativeDb for insertNodes it uses the WAL checkpoint
531
- // guard internally (same pattern as feature modules). Closed again before
532
- // resolveImports/buildEdges which don't yet have the guard (#709).
533
- if (hadNativeDb && ctx.engineName === 'native') {
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
- if (hadNativeDb) {
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);