sdlc-agent-4-enterprise-server 1.8.2 → 1.9.1
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 +1 -1
- package/dist/engine/context/curated-context-service.js +2 -2
- package/dist/engine/context/curated-context-service.js.map +1 -1
- package/dist/engine/context/curated-helpers.d.ts +1 -1
- package/dist/engine/context/curated-helpers.js +2 -2
- package/dist/engine/context/curated-helpers.js.map +1 -1
- package/dist/engine/context/types.d.ts +2 -0
- package/dist/engine/database/graph-repository.d.ts +4 -4
- package/dist/engine/database/graph-repository.js +16 -12
- package/dist/engine/database/graph-repository.js.map +1 -1
- package/dist/engine/db/__tests__/migration-v5.test.d.ts +7 -0
- package/dist/engine/db/__tests__/migration-v5.test.js +103 -0
- package/dist/engine/db/__tests__/migration-v5.test.js.map +1 -0
- package/dist/engine/db/database-manager.d.ts +7 -1
- package/dist/engine/db/database-manager.js +9 -2
- package/dist/engine/db/database-manager.js.map +1 -1
- package/dist/engine/db/migration-v5.d.ts +15 -0
- package/dist/engine/db/migration-v5.js +131 -0
- package/dist/engine/db/migration-v5.js.map +1 -0
- package/dist/engine/db/migrations.d.ts +7 -1
- package/dist/engine/db/migrations.js +24 -2
- package/dist/engine/db/migrations.js.map +1 -1
- package/dist/engine/db/schema.d.ts +1 -1
- package/dist/engine/db/schema.js +26 -4
- package/dist/engine/db/schema.js.map +1 -1
- package/dist/engine/graph/__tests__/graph-sync-service.test.d.ts +5 -0
- package/dist/engine/graph/__tests__/graph-sync-service.test.js +75 -0
- package/dist/engine/graph/__tests__/graph-sync-service.test.js.map +1 -0
- package/dist/engine/graph/graph-sync-service.d.ts +20 -0
- package/dist/engine/graph/graph-sync-service.js +71 -0
- package/dist/engine/graph/graph-sync-service.js.map +1 -0
- package/dist/engine/indexer/index-helper.d.ts +8 -7
- package/dist/engine/indexer/index-helper.js +17 -16
- package/dist/engine/indexer/index-helper.js.map +1 -1
- package/dist/engine/indexer/index-scope.d.ts +14 -0
- package/dist/engine/indexer/index-scope.js +14 -0
- package/dist/engine/indexer/index-scope.js.map +1 -0
- package/dist/engine/indexer/indexing-engine.d.ts +5 -2
- package/dist/engine/indexer/indexing-engine.js +57 -35
- package/dist/engine/indexer/indexing-engine.js.map +1 -1
- package/dist/engine/indexer/module-helper.d.ts +4 -4
- package/dist/engine/indexer/module-helper.js +17 -17
- package/dist/engine/indexer/module-helper.js.map +1 -1
- package/dist/engine/parsers/indexer/storage.d.ts +3 -3
- package/dist/engine/parsers/indexer/storage.js +22 -18
- package/dist/engine/parsers/indexer/storage.js.map +1 -1
- package/dist/engine/parsers/tree-sitter-indexer.d.ts +2 -2
- package/dist/engine/parsers/tree-sitter-indexer.js +9 -9
- package/dist/engine/parsers/tree-sitter-indexer.js.map +1 -1
- package/dist/engine/query/__tests__/code-intel-isolation.test.d.ts +4 -0
- package/dist/engine/query/__tests__/code-intel-isolation.test.js +37 -0
- package/dist/engine/query/__tests__/code-intel-isolation.test.js.map +1 -0
- package/dist/engine/query/__tests__/query-isolation.test.d.ts +5 -0
- package/dist/engine/query/__tests__/query-isolation.test.js +83 -0
- package/dist/engine/query/__tests__/query-isolation.test.js.map +1 -0
- package/dist/engine/query/code-intel-isolation.d.ts +24 -0
- package/dist/engine/query/code-intel-isolation.js +28 -0
- package/dist/engine/query/code-intel-isolation.js.map +1 -0
- package/dist/engine/query/query-layer.d.ts +12 -11
- package/dist/engine/query/query-layer.js +49 -58
- package/dist/engine/query/query-layer.js.map +1 -1
- package/dist/engine/tools/ai-context-tools.d.ts +1 -1
- package/dist/engine/tools/ai-context-tools.js +3 -2
- package/dist/engine/tools/ai-context-tools.js.map +1 -1
- package/dist/engine/tools/code-context.js +7 -6
- package/dist/engine/tools/code-context.js.map +1 -1
- package/dist/engine/tools/code-index-status.js +5 -4
- package/dist/engine/tools/code-index-status.js.map +1 -1
- package/dist/engine/tools/code-kb-export.js +3 -2
- package/dist/engine/tools/code-kb-export.js.map +1 -1
- package/dist/engine/tools/code-modules.js +3 -2
- package/dist/engine/tools/code-modules.js.map +1 -1
- package/dist/engine/tools/code-search.js +3 -2
- package/dist/engine/tools/code-search.js.map +1 -1
- package/dist/engine/tools/code-symbols.js +4 -3
- package/dist/engine/tools/code-symbols.js.map +1 -1
- package/dist/engine/tools/register-tools.d.ts +1 -1
- package/dist/engine/tools/register-tools.js +20 -20
- package/dist/engine/tools/register-tools.js.map +1 -1
- package/dist/index.js +9 -5
- package/dist/index.js.map +1 -1
- package/dist/modules/code-intel/CodeIntelModule.js +4 -2
- package/dist/modules/code-intel/CodeIntelModule.js.map +1 -1
- package/dist/modules/memory/__tests__/MemoryToolDispatcher.test.js +8 -7
- package/dist/modules/memory/__tests__/MemoryToolDispatcher.test.js.map +1 -1
- package/dist/modules/memory/dispatchers/sync-code.js +5 -3
- package/dist/modules/memory/dispatchers/sync-code.js.map +1 -1
- package/dist/modules/orchestration/OrchestrationModule.d.ts +1 -0
- package/dist/modules/orchestration/OrchestrationModule.js +9 -0
- package/dist/modules/orchestration/OrchestrationModule.js.map +1 -1
- package/dist/modules/orchestration/reindex/McpToolsRepository.d.ts +32 -0
- package/dist/modules/orchestration/reindex/McpToolsRepository.js +93 -0
- package/dist/modules/orchestration/reindex/McpToolsRepository.js.map +1 -0
- package/dist/modules/orchestration/reindex/PerServerTaskQueue.d.ts +22 -0
- package/dist/modules/orchestration/reindex/PerServerTaskQueue.js +60 -0
- package/dist/modules/orchestration/reindex/PerServerTaskQueue.js.map +1 -0
- package/dist/modules/orchestration/reindex/ReindexActionMapper.d.ts +9 -0
- package/dist/modules/orchestration/reindex/ReindexActionMapper.js +10 -0
- package/dist/modules/orchestration/reindex/ReindexActionMapper.js.map +1 -0
- package/dist/modules/orchestration/reindex/ReindexService.d.ts +25 -0
- package/dist/modules/orchestration/reindex/ReindexService.js +109 -0
- package/dist/modules/orchestration/reindex/ReindexService.js.map +1 -0
- package/dist/modules/orchestration/reindex/ReindexSubscriber.d.ts +27 -0
- package/dist/modules/orchestration/reindex/ReindexSubscriber.js +47 -0
- package/dist/modules/orchestration/reindex/ReindexSubscriber.js.map +1 -0
- package/dist/modules/orchestration/reindex/ReindexSubscriberFactory.d.ts +10 -0
- package/dist/modules/orchestration/reindex/ReindexSubscriberFactory.js +21 -0
- package/dist/modules/orchestration/reindex/ReindexSubscriberFactory.js.map +1 -0
- package/dist/modules/orchestration/reindex/__tests__/McpToolsRepository.test.d.ts +1 -0
- package/dist/modules/orchestration/reindex/__tests__/McpToolsRepository.test.js +103 -0
- package/dist/modules/orchestration/reindex/__tests__/McpToolsRepository.test.js.map +1 -0
- package/dist/modules/orchestration/reindex/__tests__/PerServerTaskQueue.test.d.ts +1 -0
- package/dist/modules/orchestration/reindex/__tests__/PerServerTaskQueue.test.js +82 -0
- package/dist/modules/orchestration/reindex/__tests__/PerServerTaskQueue.test.js.map +1 -0
- package/dist/modules/orchestration/reindex/__tests__/ReindexActionMapper.test.d.ts +1 -0
- package/dist/modules/orchestration/reindex/__tests__/ReindexActionMapper.test.js +24 -0
- package/dist/modules/orchestration/reindex/__tests__/ReindexActionMapper.test.js.map +1 -0
- package/dist/modules/orchestration/reindex/__tests__/ReindexService.test.d.ts +1 -0
- package/dist/modules/orchestration/reindex/__tests__/ReindexService.test.js +76 -0
- package/dist/modules/orchestration/reindex/__tests__/ReindexService.test.js.map +1 -0
- package/dist/modules/orchestration/reindex/__tests__/ReindexSubscriber.test.d.ts +1 -0
- package/dist/modules/orchestration/reindex/__tests__/ReindexSubscriber.test.js +117 -0
- package/dist/modules/orchestration/reindex/__tests__/ReindexSubscriber.test.js.map +1 -0
- package/dist/modules/orchestration/reindex/__tests__/reindex-fakes.d.ts +30 -0
- package/dist/modules/orchestration/reindex/__tests__/reindex-fakes.js +64 -0
- package/dist/modules/orchestration/reindex/__tests__/reindex-fakes.js.map +1 -0
- package/dist/modules/orchestration/reindex/__tests__/reindex.pbt.test.d.ts +1 -0
- package/dist/modules/orchestration/reindex/__tests__/reindex.pbt.test.js +124 -0
- package/dist/modules/orchestration/reindex/__tests__/reindex.pbt.test.js.map +1 -0
- package/dist/modules/orchestration/reindex/models/PreparedTool.d.ts +11 -0
- package/dist/modules/orchestration/reindex/models/PreparedTool.js +2 -0
- package/dist/modules/orchestration/reindex/models/PreparedTool.js.map +1 -0
- package/dist/modules/orchestration/reindex/models/ReindexAction.d.ts +4 -0
- package/dist/modules/orchestration/reindex/models/ReindexAction.js +2 -0
- package/dist/modules/orchestration/reindex/models/ReindexAction.js.map +1 -0
- package/dist/modules/orchestration/reindex/models/ReindexResult.d.ts +9 -0
- package/dist/modules/orchestration/reindex/models/ReindexResult.js +2 -0
- package/dist/modules/orchestration/reindex/models/ReindexResult.js.map +1 -0
- package/dist/modules/orchestration/reindex/models/ports.d.ts +22 -0
- package/dist/modules/orchestration/reindex/models/ports.js +2 -0
- package/dist/modules/orchestration/reindex/models/ports.js.map +1 -0
- package/dist/modules/orchestration/reindex/safeError.d.ts +6 -0
- package/dist/modules/orchestration/reindex/safeError.js +10 -0
- package/dist/modules/orchestration/reindex/safeError.js.map +1 -0
- package/dist/server/routes/admin/kb-graph-spatial.js +4 -2
- package/dist/server/routes/admin/kb-graph-spatial.js.map +1 -1
- package/dist/server/routes/api.js +56 -5
- package/dist/server/routes/api.js.map +1 -1
- package/package.json +1 -1
- package/src/engine/context/curated-context-service.ts +3 -2
- package/src/engine/context/curated-helpers.ts +3 -2
- package/src/engine/context/types.ts +2 -0
- package/src/engine/database/graph-repository.ts +17 -12
- package/src/engine/db/__tests__/migration-v5.test.ts +113 -0
- package/src/engine/db/database-manager.ts +9 -2
- package/src/engine/db/migration-v5.ts +136 -0
- package/src/engine/db/migrations.ts +27 -2
- package/src/engine/db/schema.ts +26 -4
- package/src/engine/graph/__tests__/graph-sync-service.test.ts +84 -0
- package/src/engine/graph/graph-sync-service.ts +88 -0
- package/src/engine/indexer/index-helper.ts +19 -18
- package/src/engine/indexer/index-scope.ts +24 -0
- package/src/engine/indexer/indexing-engine.ts +56 -34
- package/src/engine/indexer/module-helper.ts +18 -18
- package/src/engine/parsers/indexer/storage.ts +23 -17
- package/src/engine/parsers/tree-sitter-indexer.ts +9 -9
- package/src/engine/query/__tests__/code-intel-isolation.test.ts +43 -0
- package/src/engine/query/__tests__/query-isolation.test.ts +98 -0
- package/src/engine/query/code-intel-isolation.ts +35 -0
- package/src/engine/query/query-layer.ts +55 -69
- package/src/engine/tools/ai-context-tools.ts +4 -2
- package/src/engine/tools/code-context.ts +7 -6
- package/src/engine/tools/code-index-status.ts +5 -4
- package/src/engine/tools/code-kb-export.ts +3 -2
- package/src/engine/tools/code-modules.ts +3 -2
- package/src/engine/tools/code-search.ts +3 -2
- package/src/engine/tools/code-symbols.ts +4 -3
- package/src/engine/tools/register-tools.ts +21 -20
- package/src/index.ts +11 -5
- package/src/modules/code-intel/CodeIntelModule.ts +4 -2
- package/src/modules/memory/__tests__/MemoryToolDispatcher.test.ts +8 -7
- package/src/modules/memory/dispatchers/sync-code.ts +5 -3
- package/src/modules/orchestration/OrchestrationModule.ts +10 -0
- package/src/modules/orchestration/reindex/McpToolsRepository.ts +107 -0
- package/src/modules/orchestration/reindex/PerServerTaskQueue.ts +76 -0
- package/src/modules/orchestration/reindex/ReindexActionMapper.ts +14 -0
- package/src/modules/orchestration/reindex/ReindexService.ts +131 -0
- package/src/modules/orchestration/reindex/ReindexSubscriber.ts +54 -0
- package/src/modules/orchestration/reindex/ReindexSubscriberFactory.ts +34 -0
- package/src/modules/orchestration/reindex/__tests__/McpToolsRepository.test.ts +118 -0
- package/src/modules/orchestration/reindex/__tests__/PerServerTaskQueue.test.ts +84 -0
- package/src/modules/orchestration/reindex/__tests__/ReindexActionMapper.test.ts +25 -0
- package/src/modules/orchestration/reindex/__tests__/ReindexService.test.ts +85 -0
- package/src/modules/orchestration/reindex/__tests__/ReindexSubscriber.test.ts +131 -0
- package/src/modules/orchestration/reindex/__tests__/reindex-fakes.ts +74 -0
- package/src/modules/orchestration/reindex/__tests__/reindex.pbt.test.ts +155 -0
- package/src/modules/orchestration/reindex/models/PreparedTool.ts +11 -0
- package/src/modules/orchestration/reindex/models/ReindexAction.ts +4 -0
- package/src/modules/orchestration/reindex/models/ReindexResult.ts +9 -0
- package/src/modules/orchestration/reindex/models/ports.ts +26 -0
- package/src/modules/orchestration/reindex/safeError.ts +9 -0
- package/src/server/routes/admin/kb-graph-spatial.ts +4 -2
- package/src/server/routes/api.ts +59 -5
- package/tests/e2e/reindex.e2e.test.ts +161 -0
- package/tests/integration/migration-v5-upgrade.it.test.ts +84 -0
- package/tests/integration/reindex.it.test.ts +250 -0
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
</p>
|
|
7
7
|
|
|
8
8
|
<p align="center">
|
|
9
|
-
<img src="https://img.shields.io/badge/version-1.
|
|
9
|
+
<img src="https://img.shields.io/badge/version-1.9.0-blue?style=for-the-badge" alt="Version">
|
|
10
10
|
<img src="https://img.shields.io/badge/tools-66+-teal?style=for-the-badge" alt="Tools">
|
|
11
11
|
<img src="https://img.shields.io/badge/node-%3E%3D18-green?style=for-the-badge" alt="Node">
|
|
12
12
|
</p>
|
|
@@ -25,10 +25,10 @@ export class CuratedContextService {
|
|
|
25
25
|
/** Execute curated context search with NL query. */
|
|
26
26
|
async getContext(params) {
|
|
27
27
|
const startTime = Date.now();
|
|
28
|
-
const { query, max_tokens = 4000, include_source = true, include_memory = true, include_graph = true, source_weights } = params;
|
|
28
|
+
const { query, max_tokens = 4000, include_source = true, include_memory = true, include_graph = true, source_weights, projectId } = params;
|
|
29
29
|
const analysis = this.analyzer.analyze(query);
|
|
30
30
|
const [codeResults, memoryResults] = await Promise.all([
|
|
31
|
-
include_source ? searchCode(analysis, this.queryLayer, this.resolver) : Promise.resolve({ source: 'code', results: [] }),
|
|
31
|
+
include_source ? searchCode(analysis, this.queryLayer, this.resolver, projectId) : Promise.resolve({ source: 'code', results: [] }),
|
|
32
32
|
include_memory ? searchMemory(analysis, this.db) : Promise.resolve({ source: 'memory', results: [] })
|
|
33
33
|
]);
|
|
34
34
|
let graphResults = { source: 'graph', results: [] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curated-context-service.js","sourceRoot":"","sources":["../../../src/engine/context/curated-context-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAKxD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE7F,MAAM,OAAO,qBAAqB;IACxB,QAAQ,CAAgB;IACxB,MAAM,CAAY;IAClB,SAAS,CAAkB;IAC3B,EAAE,CAAoB;IACtB,UAAU,CAAa;IACvB,SAAS,CAAiB;IAC1B,QAAQ,CAAiB;IAEjC,YACE,EAAqB,EACrB,UAAsB,EACtB,SAAyB,EACzB,QAAwB;QAExB,IAAI,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;QACvC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,UAAU,CAAC,MAA4B;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,EACJ,KAAK,EACL,UAAU,GAAG,IAAI,EACjB,cAAc,GAAG,IAAI,EACrB,cAAc,GAAG,IAAI,EACrB,aAAa,GAAG,IAAI,EACpB,cAAc,
|
|
1
|
+
{"version":3,"file":"curated-context-service.js","sourceRoot":"","sources":["../../../src/engine/context/curated-context-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { ContextSection } from './types.js';
|
|
|
7
7
|
export declare function searchCode(analysis: {
|
|
8
8
|
ftsQuery: string;
|
|
9
9
|
symbolCandidates: string[];
|
|
10
|
-
}, queryLayer: QueryLayer, resolver: SymbolResolver): Promise<{
|
|
10
|
+
}, queryLayer: QueryLayer, resolver: SymbolResolver, projectId?: string): Promise<{
|
|
11
11
|
source: string;
|
|
12
12
|
results: any[];
|
|
13
13
|
}>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export async function searchCode(analysis, queryLayer, resolver) {
|
|
1
|
+
export async function searchCode(analysis, queryLayer, resolver, projectId) {
|
|
2
2
|
try {
|
|
3
|
-
const ftsResults = queryLayer.searchCode(analysis.ftsQuery, 30);
|
|
3
|
+
const ftsResults = queryLayer.searchCode(projectId, analysis.ftsQuery, 30);
|
|
4
4
|
const symbolResults = [];
|
|
5
5
|
for (const candidate of analysis.symbolCandidates.slice(0, 5)) {
|
|
6
6
|
const resolved = resolver.resolve(candidate);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curated-helpers.js","sourceRoot":"","sources":["../../../src/engine/context/curated-helpers.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAA0D,EAC1D,UAAsB,EACtB,QAAwB;
|
|
1
|
+
{"version":3,"file":"curated-helpers.js","sourceRoot":"","sources":["../../../src/engine/context/curated-helpers.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAA0D,EAC1D,UAAsB,EACtB,QAAwB,EACxB,SAAkB;IAElB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAE3E,MAAM,aAAa,GAAU,EAAE,CAAC;QAChC,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC9D,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC7C,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACvC,aAAa,CAAC,IAAI,CAAC;oBACjB,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI;oBAC1C,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI;iBACpD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CACtB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ;YAC3D,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI;SAC7D,CAAC,CAAC,EACH,aAAa,CACd,CAAC;QAEF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAkD,EAClD,EAAqB;IAErB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;KAQvB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAU,CAAC;QAEvB,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACtB,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,OAAO;gBACzD,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,QAAQ;gBACxB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;gBAClD,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS;aACjC,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAiB,EAAE,SAAyB;IAC5E,MAAM,QAAQ,GAAU,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACrD,IAAI,CAAC,SAAS;gBAAE,SAAS;YAEzB,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE;gBAC5C,SAAS,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC;gBAC3C,SAAS,EAAE,EAAE;gBACb,SAAS,EAAE,MAAM;gBACjB,QAAQ,EAAE,CAAC;gBACX,UAAU,EAAE,CAAC;aACd,CAAC,CAAC;YAEH,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAEd,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;oBACnD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS;oBAC7C,YAAY,EAAE,GAAG,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE;iBAC7C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAY,EAAE,KAAY;IAChD,MAAM,CAAC,GAAG,EAAE,CAAC;IACb,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwC,CAAC;IAE/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;SAC/B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAA4B;IACzD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;IAElD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAgC,CAAC;QAC5E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAEpD,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI;YAClE,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM;YACpD,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY;SACvD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,MAAM,QAAQ,GAA2B;QACvC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,iBAAiB;KACzE,CAAC;IAEF,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC;YACZ,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM;YACjC,MAAM,EAAE,MAAqC;YAC7C,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -92,6 +92,8 @@ export interface CuratedContextParams {
|
|
|
92
92
|
include_memory?: boolean;
|
|
93
93
|
include_graph?: boolean;
|
|
94
94
|
source_weights?: SourceWeights;
|
|
95
|
+
/** SA4E-41: tenant scope for code/graph branches (fail-closed when absent). */
|
|
96
|
+
projectId?: string;
|
|
95
97
|
}
|
|
96
98
|
export interface SourceWeights {
|
|
97
99
|
code: number;
|
|
@@ -36,14 +36,14 @@ export declare class GraphRepository {
|
|
|
36
36
|
constructor(db: Database.Database);
|
|
37
37
|
/** Insert a batch of relationships within a transaction. */
|
|
38
38
|
insertRelationships(relationships: RelationshipInput[]): void;
|
|
39
|
-
/** Delete all relationships originating from a file. */
|
|
40
|
-
deleteFileRelationships(filePath: string): void;
|
|
39
|
+
/** Delete all relationships originating from a file (optionally tenant-scoped). */
|
|
40
|
+
deleteFileRelationships(filePath: string, projectId?: string): void;
|
|
41
41
|
/** Find direct callers of a symbol by name. */
|
|
42
42
|
findCallers(symbolName: string, kind?: string, limit?: number): CallerResult[];
|
|
43
43
|
/** Find direct callees of a symbol by ID. */
|
|
44
44
|
findCallees(symbolId: number, kind?: string, limit?: number): CalleeResult[];
|
|
45
|
-
/** Resolve target_symbol_id for unresolved relationships (batch). */
|
|
46
|
-
resolveTargets(batchSize?: number): number;
|
|
45
|
+
/** Resolve target_symbol_id for unresolved relationships (batch), tenant-scoped. */
|
|
46
|
+
resolveTargets(batchSize?: number, projectId?: string): number;
|
|
47
47
|
/** Get total relationship count. */
|
|
48
48
|
getRelationshipCount(): number;
|
|
49
49
|
/** Get relationship statistics by kind. */
|
|
@@ -18,8 +18,12 @@ export class GraphRepository {
|
|
|
18
18
|
});
|
|
19
19
|
transaction(relationships);
|
|
20
20
|
}
|
|
21
|
-
/** Delete all relationships originating from a file. */
|
|
22
|
-
deleteFileRelationships(filePath) {
|
|
21
|
+
/** Delete all relationships originating from a file (optionally tenant-scoped). */
|
|
22
|
+
deleteFileRelationships(filePath, projectId) {
|
|
23
|
+
if (projectId) {
|
|
24
|
+
this.db.prepare('DELETE FROM relationships WHERE file_path = ? AND project_id = ?').run(filePath, projectId);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
23
27
|
this.stmts.deleteFileRelationships.run(filePath);
|
|
24
28
|
}
|
|
25
29
|
/** Find direct callers of a symbol by name. */
|
|
@@ -30,19 +34,19 @@ export class GraphRepository {
|
|
|
30
34
|
findCallees(symbolId, kind = 'calls', limit = 20) {
|
|
31
35
|
return this.stmts.findCallees.all(symbolId, kind, limit);
|
|
32
36
|
}
|
|
33
|
-
/** Resolve target_symbol_id for unresolved relationships (batch). */
|
|
34
|
-
resolveTargets(batchSize = 1000) {
|
|
35
|
-
const unresolved =
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
WHERE r.target_symbol_id IS NULL
|
|
39
|
-
LIMIT ?
|
|
40
|
-
`).all(batchSize);
|
|
37
|
+
/** Resolve target_symbol_id for unresolved relationships (batch), tenant-scoped. */
|
|
38
|
+
resolveTargets(batchSize = 1000, projectId) {
|
|
39
|
+
const unresolved = (projectId
|
|
40
|
+
? this.db.prepare('SELECT r.id, r.target_symbol FROM relationships r WHERE r.target_symbol_id IS NULL AND r.project_id = ? LIMIT ?').all(projectId, batchSize)
|
|
41
|
+
: this.db.prepare('SELECT r.id, r.target_symbol FROM relationships r WHERE r.target_symbol_id IS NULL LIMIT ?').all(batchSize));
|
|
41
42
|
let resolved = 0;
|
|
42
|
-
|
|
43
|
+
// Resolve targets only within the same tenant to avoid cross-project matches.
|
|
44
|
+
const findTarget = projectId
|
|
45
|
+
? this.db.prepare('SELECT id FROM symbols WHERE name = ? AND project_id = ? LIMIT 1')
|
|
46
|
+
: this.db.prepare('SELECT id FROM symbols WHERE name = ? LIMIT 1');
|
|
43
47
|
const transaction = this.db.transaction(() => {
|
|
44
48
|
for (const row of unresolved) {
|
|
45
|
-
const target = findTarget.get(row.target_symbol);
|
|
49
|
+
const target = (projectId ? findTarget.get(row.target_symbol, projectId) : findTarget.get(row.target_symbol));
|
|
46
50
|
if (target) {
|
|
47
51
|
this.stmts.resolveTarget.run(target.id, row.id);
|
|
48
52
|
resolved++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-repository.js","sourceRoot":"","sources":["../../../src/engine/database/graph-repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkCH,MAAM,OAAO,eAAe;IAClB,EAAE,CAAoB;IACtB,KAAK,CAOX;IAEF,YAAY,EAAqB;QAC/B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED,4DAA4D;IAC5D,mBAAmB,CAAC,aAAkC;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,IAAyB,EAAE,EAAE;YACpE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAC/B,GAAG,CAAC,cAAc,EAClB,GAAG,CAAC,YAAY,EAChB,GAAG,CAAC,cAAc,IAAI,IAAI,EAC1B,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,QAAQ,EACZ,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CACnD,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QACH,WAAW,CAAC,aAAa,CAAC,CAAC;IAC7B,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"graph-repository.js","sourceRoot":"","sources":["../../../src/engine/database/graph-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SA4E-41 Migration test — apply V5 on a pre-V5 (schema_version 4) database.
|
|
3
|
+
* Verifies: project_id added everywhere, backfilled to legacy id, FTS still
|
|
4
|
+
* returns results, counts unchanged, composite UNIQUE enforced.
|
|
5
|
+
* Runs on an isolated in-memory DB (never the live index.db).
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SA4E-41 Migration test — apply V5 on a pre-V5 (schema_version 4) database.
|
|
3
|
+
* Verifies: project_id added everywhere, backfilled to legacy id, FTS still
|
|
4
|
+
* returns results, counts unchanged, composite UNIQUE enforced.
|
|
5
|
+
* Runs on an isolated in-memory DB (never the live index.db).
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
8
|
+
import Database from 'better-sqlite3';
|
|
9
|
+
import { applyMigrationV5 } from '../migration-v5.js';
|
|
10
|
+
const LEGACY = 'legacy12345x';
|
|
11
|
+
/** Build the pre-V5 schema (no project_id anywhere). */
|
|
12
|
+
const PRE_V5_SCHEMA = `
|
|
13
|
+
CREATE TABLE schema_version (version INTEGER PRIMARY KEY, applied_at TEXT DEFAULT (datetime('now')));
|
|
14
|
+
CREATE TABLE files (
|
|
15
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, path TEXT NOT NULL UNIQUE, relative_path TEXT NOT NULL,
|
|
16
|
+
language TEXT NOT NULL, module TEXT, content_hash TEXT NOT NULL, size_bytes INTEGER NOT NULL,
|
|
17
|
+
last_indexed TEXT NOT NULL DEFAULT (datetime('now')), line_count INTEGER NOT NULL DEFAULT 0
|
|
18
|
+
);
|
|
19
|
+
CREATE TABLE symbols (
|
|
20
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, file_id INTEGER NOT NULL, name TEXT NOT NULL, kind TEXT NOT NULL,
|
|
21
|
+
signature TEXT, start_line INTEGER NOT NULL, end_line INTEGER NOT NULL, parent_symbol TEXT,
|
|
22
|
+
visibility TEXT, doc_comment TEXT, complexity INTEGER, is_exported INTEGER DEFAULT 0
|
|
23
|
+
);
|
|
24
|
+
CREATE VIRTUAL TABLE symbols_fts USING fts5(name, signature, doc_comment, kind, content=symbols, content_rowid=id, tokenize='porter unicode61');
|
|
25
|
+
CREATE TRIGGER symbols_ai AFTER INSERT ON symbols BEGIN
|
|
26
|
+
INSERT INTO symbols_fts(rowid, name, signature, doc_comment, kind) VALUES (new.id, new.name, new.signature, new.doc_comment, new.kind);
|
|
27
|
+
END;
|
|
28
|
+
CREATE TABLE modules (
|
|
29
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE, root_path TEXT NOT NULL,
|
|
30
|
+
language TEXT, description TEXT, file_count INTEGER NOT NULL DEFAULT 0, symbol_count INTEGER NOT NULL DEFAULT 0,
|
|
31
|
+
di_style TEXT, error_handling TEXT, naming_convention TEXT, logging_framework TEXT, testing_framework TEXT, purpose TEXT
|
|
32
|
+
);
|
|
33
|
+
CREATE TABLE embeddings (
|
|
34
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, symbol_id INTEGER, file_id INTEGER, vector BLOB NOT NULL,
|
|
35
|
+
model TEXT NOT NULL, created_at TEXT DEFAULT (datetime('now'))
|
|
36
|
+
);
|
|
37
|
+
CREATE TABLE relationships (
|
|
38
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, source_symbol_id INTEGER NOT NULL, target_symbol TEXT NOT NULL,
|
|
39
|
+
target_symbol_id INTEGER, kind TEXT NOT NULL, file_path TEXT NOT NULL, line INTEGER NOT NULL, metadata TEXT
|
|
40
|
+
);
|
|
41
|
+
CREATE TABLE body_embeddings (
|
|
42
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, symbol_id INTEGER NOT NULL, chunk_index INTEGER NOT NULL DEFAULT 0,
|
|
43
|
+
embedding BLOB NOT NULL, token_count INTEGER NOT NULL, created_at TEXT DEFAULT (datetime('now')),
|
|
44
|
+
UNIQUE(symbol_id, chunk_index)
|
|
45
|
+
);
|
|
46
|
+
`;
|
|
47
|
+
function seedPreV5(db) {
|
|
48
|
+
db.exec(PRE_V5_SCHEMA);
|
|
49
|
+
db.prepare('INSERT INTO schema_version (version) VALUES (4)').run();
|
|
50
|
+
db.prepare(`INSERT INTO files (id, path, relative_path, language, module, content_hash, size_bytes) VALUES
|
|
51
|
+
(1, '/w/src/a.ts', 'src/a.ts', 'typescript', 'src', 'h1', 100),
|
|
52
|
+
(2, '/w/src/b.ts', 'src/b.ts', 'typescript', 'src', 'h2', 200)`).run();
|
|
53
|
+
db.prepare(`INSERT INTO symbols (id, file_id, name, kind, signature, start_line, end_line, is_exported, complexity) VALUES
|
|
54
|
+
(1, 1, 'doAuth', 'function', 'sig', 1, 5, 1, 3),
|
|
55
|
+
(2, 2, 'doLogout', 'function', 'sig', 1, 5, 1, 2)`).run();
|
|
56
|
+
db.prepare(`INSERT INTO modules (name, root_path, language, file_count, symbol_count) VALUES ('src', 'src', 'typescript', 2, 2)`).run();
|
|
57
|
+
db.prepare(`INSERT INTO relationships (source_symbol_id, target_symbol, kind, file_path, line) VALUES (1, 'doLogout', 'calls', 'src/a.ts', 3)`).run();
|
|
58
|
+
db.prepare(`INSERT INTO body_embeddings (symbol_id, chunk_index, embedding, token_count) VALUES (1, 0, X'00', 5)`).run();
|
|
59
|
+
db.prepare(`INSERT INTO embeddings (symbol_id, file_id, vector, model) VALUES (1, 1, X'00', 'test')`).run();
|
|
60
|
+
}
|
|
61
|
+
function columnNames(db, table) {
|
|
62
|
+
return db.pragma(`table_info(${table})`).map(r => r.name);
|
|
63
|
+
}
|
|
64
|
+
describe('SA4E-41 Migration V5', () => {
|
|
65
|
+
let db;
|
|
66
|
+
beforeEach(() => { db = new Database(':memory:'); seedPreV5(db); });
|
|
67
|
+
afterEach(() => db.close());
|
|
68
|
+
it('adds project_id to all code-intel tables', () => {
|
|
69
|
+
applyMigrationV5(db, LEGACY);
|
|
70
|
+
for (const t of ['files', 'symbols', 'modules', 'embeddings', 'relationships', 'body_embeddings']) {
|
|
71
|
+
expect(columnNames(db, t)).toContain('project_id');
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
it('backfills every row to the legacy project id', () => {
|
|
75
|
+
applyMigrationV5(db, LEGACY);
|
|
76
|
+
const distinct = (t) => db.prepare(`SELECT DISTINCT project_id FROM ${t}`).all();
|
|
77
|
+
for (const t of ['files', 'symbols', 'modules', 'relationships', 'body_embeddings', 'embeddings']) {
|
|
78
|
+
expect(distinct(t)).toEqual([{ project_id: LEGACY }]);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
it('preserves row counts and FTS still returns results', () => {
|
|
82
|
+
applyMigrationV5(db, LEGACY);
|
|
83
|
+
expect(db.prepare('SELECT COUNT(*) c FROM files').get().c).toBe(2);
|
|
84
|
+
expect(db.prepare('SELECT COUNT(*) c FROM symbols').get().c).toBe(2);
|
|
85
|
+
const fts = db.prepare(`SELECT s.name FROM symbols_fts JOIN symbols s ON symbols_fts.rowid = s.id WHERE symbols_fts MATCH 'doAuth'`).all();
|
|
86
|
+
expect(fts.map(r => r.name)).toContain('doAuth');
|
|
87
|
+
});
|
|
88
|
+
it('bumps schema_version to 5 and is idempotent', () => {
|
|
89
|
+
applyMigrationV5(db, LEGACY);
|
|
90
|
+
expect(db.prepare('SELECT MAX(version) v FROM schema_version').get().v).toBe(5);
|
|
91
|
+
// Re-run must not throw or change data.
|
|
92
|
+
expect(() => applyMigrationV5(db, LEGACY)).not.toThrow();
|
|
93
|
+
expect(db.prepare('SELECT COUNT(*) c FROM symbols').get().c).toBe(2);
|
|
94
|
+
});
|
|
95
|
+
it('enforces composite UNIQUE(project_id, path) on files', () => {
|
|
96
|
+
applyMigrationV5(db, LEGACY);
|
|
97
|
+
// Same path under a different project is allowed.
|
|
98
|
+
expect(() => db.prepare(`INSERT INTO files (project_id, path, relative_path, language, content_hash, size_bytes) VALUES ('other', '/w/src/a.ts', 'src/a.ts', 'typescript', 'h', 1)`).run()).not.toThrow();
|
|
99
|
+
// Duplicate (project_id, path) is rejected.
|
|
100
|
+
expect(() => db.prepare(`INSERT INTO files (project_id, path, relative_path, language, content_hash, size_bytes) VALUES (?, '/w/src/a.ts', 'src/a.ts', 'typescript', 'h', 1)`).run(LEGACY)).toThrow();
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=migration-v5.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-v5.test.js","sourceRoot":"","sources":["../../../../src/engine/db/__tests__/migration-v5.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,10 +6,16 @@ import Database from 'better-sqlite3';
|
|
|
6
6
|
export declare class DatabaseManager {
|
|
7
7
|
private db;
|
|
8
8
|
private readonly dbPath;
|
|
9
|
+
private readonly projectId;
|
|
9
10
|
private static resolvedBinding;
|
|
10
11
|
private static sharedDb;
|
|
11
12
|
private static initPromise;
|
|
12
|
-
|
|
13
|
+
/**
|
|
14
|
+
* @param dbPath Path to the SQLite index.db file.
|
|
15
|
+
* @param projectId Booting workspace's derived project id (SA4E-41) — used as
|
|
16
|
+
* the legacy backfill value for the V5 multi-tenant migration.
|
|
17
|
+
*/
|
|
18
|
+
constructor(dbPath: string, projectId?: string);
|
|
13
19
|
/**
|
|
14
20
|
* Pre-resolve native binding (async). Call once at server startup before initialize().
|
|
15
21
|
* Downloads prebuilt binary if needed (standalone mode).
|
|
@@ -12,11 +12,18 @@ const logger = pino({ name: 'database-manager' });
|
|
|
12
12
|
export class DatabaseManager {
|
|
13
13
|
db = null;
|
|
14
14
|
dbPath;
|
|
15
|
+
projectId;
|
|
15
16
|
static resolvedBinding = null; // null = not yet resolved
|
|
16
17
|
static sharedDb = null;
|
|
17
18
|
static initPromise = null;
|
|
18
|
-
|
|
19
|
+
/**
|
|
20
|
+
* @param dbPath Path to the SQLite index.db file.
|
|
21
|
+
* @param projectId Booting workspace's derived project id (SA4E-41) — used as
|
|
22
|
+
* the legacy backfill value for the V5 multi-tenant migration.
|
|
23
|
+
*/
|
|
24
|
+
constructor(dbPath, projectId = 'default') {
|
|
19
25
|
this.dbPath = dbPath;
|
|
26
|
+
this.projectId = projectId;
|
|
20
27
|
}
|
|
21
28
|
/**
|
|
22
29
|
* Pre-resolve native binding (async). Call once at server startup before initialize().
|
|
@@ -45,7 +52,7 @@ export class DatabaseManager {
|
|
|
45
52
|
this.db = new Database(this.dbPath);
|
|
46
53
|
}
|
|
47
54
|
this.configureDatabase();
|
|
48
|
-
runMigrations(this.db);
|
|
55
|
+
runMigrations(this.db, this.projectId);
|
|
49
56
|
DatabaseManager.sharedDb = this.db;
|
|
50
57
|
logger.error(`[db] Initialized at ${this.dbPath}`);
|
|
51
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-manager.js","sourceRoot":"","sources":["../../../src/engine/db/database-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAErF,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;AAElD,MAAM,OAAO,eAAe;IAClB,EAAE,GAA6B,IAAI,CAAC;IAC3B,MAAM,CAAS;
|
|
1
|
+
{"version":3,"file":"database-manager.js","sourceRoot":"","sources":["../../../src/engine/db/database-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SA4E-41 Migration V5 — Multi-tenant isolation for Code Intelligence.
|
|
3
|
+
*
|
|
4
|
+
* Adds `project_id` to files/symbols/modules/embeddings/relationships/body_embeddings.
|
|
5
|
+
* - files/modules are RECREATED (composite UNIQUE constraint change).
|
|
6
|
+
* - symbols/embeddings/relationships/body_embeddings use additive ALTER ADD COLUMN
|
|
7
|
+
* so the FTS5 external-content mapping (symbols_fts → symbols.id) is preserved.
|
|
8
|
+
* Idempotent: each step checks PRAGMA table_info before acting.
|
|
9
|
+
*/
|
|
10
|
+
import type Database from 'better-sqlite3';
|
|
11
|
+
/**
|
|
12
|
+
* Apply V5 multi-tenant migration. `legacyProjectId` is the booting workspace's
|
|
13
|
+
* derived project id; existing rows are backfilled to it. Idempotent + fail-safe.
|
|
14
|
+
*/
|
|
15
|
+
export declare function applyMigrationV5(db: Database.Database, legacyProjectId: string): void;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SA4E-41 Migration V5 — Multi-tenant isolation for Code Intelligence.
|
|
3
|
+
*
|
|
4
|
+
* Adds `project_id` to files/symbols/modules/embeddings/relationships/body_embeddings.
|
|
5
|
+
* - files/modules are RECREATED (composite UNIQUE constraint change).
|
|
6
|
+
* - symbols/embeddings/relationships/body_embeddings use additive ALTER ADD COLUMN
|
|
7
|
+
* so the FTS5 external-content mapping (symbols_fts → symbols.id) is preserved.
|
|
8
|
+
* Idempotent: each step checks PRAGMA table_info before acting.
|
|
9
|
+
*/
|
|
10
|
+
import pino from 'pino';
|
|
11
|
+
const logger = pino({ name: 'migration-v5' });
|
|
12
|
+
/** Get set of column names for a table via PRAGMA. */
|
|
13
|
+
function columns(db, table) {
|
|
14
|
+
const rows = db.pragma(`table_info(${table})`);
|
|
15
|
+
return new Set(rows.map(r => r.name));
|
|
16
|
+
}
|
|
17
|
+
function hasProjectId(db, table) {
|
|
18
|
+
return columns(db, table).has('project_id');
|
|
19
|
+
}
|
|
20
|
+
/** Recreate `files` with UNIQUE(project_id, path); preserves id for FK integrity. */
|
|
21
|
+
function recreateFiles(db, legacyProjectId) {
|
|
22
|
+
if (hasProjectId(db, 'files'))
|
|
23
|
+
return;
|
|
24
|
+
db.exec(`CREATE TABLE files_new (
|
|
25
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
26
|
+
project_id TEXT NOT NULL,
|
|
27
|
+
path TEXT NOT NULL,
|
|
28
|
+
relative_path TEXT NOT NULL,
|
|
29
|
+
language TEXT NOT NULL,
|
|
30
|
+
module TEXT,
|
|
31
|
+
content_hash TEXT NOT NULL,
|
|
32
|
+
size_bytes INTEGER NOT NULL,
|
|
33
|
+
last_indexed TEXT NOT NULL DEFAULT (datetime('now')),
|
|
34
|
+
line_count INTEGER NOT NULL DEFAULT 0,
|
|
35
|
+
UNIQUE(project_id, path)
|
|
36
|
+
);`);
|
|
37
|
+
db.prepare(`INSERT INTO files_new (id, project_id, path, relative_path, language, module,
|
|
38
|
+
content_hash, size_bytes, last_indexed, line_count)
|
|
39
|
+
SELECT id, ?, path, relative_path, language, module,
|
|
40
|
+
content_hash, size_bytes, last_indexed, line_count FROM files`).run(legacyProjectId);
|
|
41
|
+
db.exec('DROP TABLE files; ALTER TABLE files_new RENAME TO files;');
|
|
42
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_files_path ON files(relative_path);
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_files_module ON files(module);
|
|
44
|
+
CREATE INDEX IF NOT EXISTS idx_files_language ON files(language);`);
|
|
45
|
+
}
|
|
46
|
+
/** Recreate `modules` with UNIQUE(project_id, name); preserves all pattern columns. */
|
|
47
|
+
function recreateModules(db, legacyProjectId) {
|
|
48
|
+
if (hasProjectId(db, 'modules'))
|
|
49
|
+
return;
|
|
50
|
+
db.exec(`CREATE TABLE modules_new (
|
|
51
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
52
|
+
project_id TEXT NOT NULL,
|
|
53
|
+
name TEXT NOT NULL,
|
|
54
|
+
root_path TEXT NOT NULL,
|
|
55
|
+
language TEXT,
|
|
56
|
+
description TEXT,
|
|
57
|
+
file_count INTEGER NOT NULL DEFAULT 0,
|
|
58
|
+
symbol_count INTEGER NOT NULL DEFAULT 0,
|
|
59
|
+
di_style TEXT DEFAULT NULL,
|
|
60
|
+
error_handling TEXT DEFAULT NULL,
|
|
61
|
+
naming_convention TEXT DEFAULT NULL,
|
|
62
|
+
logging_framework TEXT DEFAULT NULL,
|
|
63
|
+
testing_framework TEXT DEFAULT NULL,
|
|
64
|
+
purpose TEXT DEFAULT NULL,
|
|
65
|
+
UNIQUE(project_id, name)
|
|
66
|
+
);`);
|
|
67
|
+
db.prepare(`INSERT INTO modules_new (id, project_id, name, root_path, language, description,
|
|
68
|
+
file_count, symbol_count, di_style, error_handling, naming_convention,
|
|
69
|
+
logging_framework, testing_framework, purpose)
|
|
70
|
+
SELECT id, ?, name, root_path, language, description,
|
|
71
|
+
file_count, symbol_count, di_style, error_handling, naming_convention,
|
|
72
|
+
logging_framework, testing_framework, purpose FROM modules`).run(legacyProjectId);
|
|
73
|
+
db.exec('DROP TABLE modules; ALTER TABLE modules_new RENAME TO modules;');
|
|
74
|
+
}
|
|
75
|
+
/** Additively add project_id to a table (FTS-safe for symbols). */
|
|
76
|
+
function addProjectIdColumn(db, table) {
|
|
77
|
+
if (hasProjectId(db, table))
|
|
78
|
+
return;
|
|
79
|
+
db.exec(`ALTER TABLE ${table} ADD COLUMN project_id TEXT NOT NULL DEFAULT ''`);
|
|
80
|
+
}
|
|
81
|
+
/** Backfill scope from each row's parent; orphans fall back to legacyProjectId. */
|
|
82
|
+
function backfillScopes(db, legacy) {
|
|
83
|
+
db.prepare(`UPDATE symbols SET project_id =
|
|
84
|
+
COALESCE((SELECT f.project_id FROM files f WHERE f.id = symbols.file_id), ?)
|
|
85
|
+
WHERE project_id = ''`).run(legacy);
|
|
86
|
+
db.prepare(`UPDATE relationships SET project_id =
|
|
87
|
+
COALESCE((SELECT s.project_id FROM symbols s WHERE s.id = relationships.source_symbol_id), ?)
|
|
88
|
+
WHERE project_id = ''`).run(legacy);
|
|
89
|
+
db.prepare(`UPDATE body_embeddings SET project_id =
|
|
90
|
+
COALESCE((SELECT s.project_id FROM symbols s WHERE s.id = body_embeddings.symbol_id), ?)
|
|
91
|
+
WHERE project_id = ''`).run(legacy);
|
|
92
|
+
db.prepare(`UPDATE embeddings SET project_id = COALESCE(
|
|
93
|
+
(SELECT s.project_id FROM symbols s WHERE s.id = embeddings.symbol_id),
|
|
94
|
+
(SELECT f.project_id FROM files f WHERE f.id = embeddings.file_id), ?)
|
|
95
|
+
WHERE project_id = ''`).run(legacy);
|
|
96
|
+
}
|
|
97
|
+
/** Create per-tenant scope indexes (idempotent). */
|
|
98
|
+
function createScopeIndexes(db) {
|
|
99
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_symbols_project ON symbols(project_id);
|
|
100
|
+
CREATE INDEX IF NOT EXISTS idx_symbols_proj_kind ON symbols(project_id, kind);
|
|
101
|
+
CREATE INDEX IF NOT EXISTS idx_files_project ON files(project_id);
|
|
102
|
+
CREATE INDEX IF NOT EXISTS idx_modules_project ON modules(project_id);
|
|
103
|
+
CREATE INDEX IF NOT EXISTS idx_rel_project ON relationships(project_id);`);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Apply V5 multi-tenant migration. `legacyProjectId` is the booting workspace's
|
|
107
|
+
* derived project id; existing rows are backfilled to it. Idempotent + fail-safe.
|
|
108
|
+
*/
|
|
109
|
+
export function applyMigrationV5(db, legacyProjectId) {
|
|
110
|
+
const legacy = legacyProjectId || 'default';
|
|
111
|
+
try {
|
|
112
|
+
db.exec('PRAGMA foreign_keys=OFF;');
|
|
113
|
+
recreateFiles(db, legacy);
|
|
114
|
+
recreateModules(db, legacy);
|
|
115
|
+
for (const t of ['symbols', 'embeddings', 'relationships', 'body_embeddings']) {
|
|
116
|
+
addProjectIdColumn(db, t);
|
|
117
|
+
}
|
|
118
|
+
backfillScopes(db, legacy);
|
|
119
|
+
createScopeIndexes(db);
|
|
120
|
+
db.prepare('INSERT OR REPLACE INTO schema_version (version) VALUES (?)').run(5);
|
|
121
|
+
logger.error(`[migrations] V5: multi-tenant project_id applied (legacy=${legacy})`);
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
logger.error({ err }, '[migrations] V5 error:');
|
|
125
|
+
throw err;
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
db.exec('PRAGMA foreign_keys=ON;');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=migration-v5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-v5.js","sourceRoot":"","sources":["../../../src/engine/db/migration-v5.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,4 +6,10 @@ import Database from 'better-sqlite3';
|
|
|
6
6
|
/** Get current schema version from database. */
|
|
7
7
|
export declare function getCurrentVersion(db: Database.Database): number;
|
|
8
8
|
/** Run all pending migrations sequentially. */
|
|
9
|
-
export declare function runMigrations(db: Database.Database): void;
|
|
9
|
+
export declare function runMigrations(db: Database.Database, legacyProjectId?: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* SA4E-42 — add the `server` scoping column to `mcp_tools` for existing DBs.
|
|
12
|
+
* Uses a PRAGMA table_info probe (F-02) instead of a swallow-all catch, so a
|
|
13
|
+
* genuine migration failure surfaces rather than being silently ignored.
|
|
14
|
+
*/
|
|
15
|
+
export declare function migrateAddMcpToolsServerColumn(db: Database.Database): void;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import pino from 'pino';
|
|
6
6
|
import { SCHEMA_V1 } from './schema.js';
|
|
7
7
|
import { runGraphMigrations } from '../database/migrator.js';
|
|
8
|
+
import { applyMigrationV5 } from './migration-v5.js';
|
|
8
9
|
const logger = pino({ name: 'migrations' });
|
|
9
10
|
function applyMemorySchema(db) {
|
|
10
11
|
try {
|
|
@@ -37,12 +38,16 @@ export function getCurrentVersion(db) {
|
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
40
|
/** Run all pending migrations sequentially. */
|
|
40
|
-
export function runMigrations(db) {
|
|
41
|
+
export function runMigrations(db, legacyProjectId = 'default') {
|
|
41
42
|
// Idempotent memory schema execution
|
|
42
43
|
applyMemorySchema(db);
|
|
44
|
+
// SA4E-42 (PT-01): additive `server` column on mcp_tools. Idempotent (PRAGMA probe),
|
|
45
|
+
// so it MUST run on every startup BEFORE the early-return below — existing v5 DBs
|
|
46
|
+
// (left by SA4E-41) would otherwise skip it and crash on the scoped INSERT.
|
|
47
|
+
migrateAddMcpToolsServerColumn(db);
|
|
43
48
|
const current = getCurrentVersion(db);
|
|
44
49
|
const pending = MIGRATIONS.filter(m => m.version > current);
|
|
45
|
-
if (pending.length === 0 && current >=
|
|
50
|
+
if (pending.length === 0 && current >= 5) {
|
|
46
51
|
logger.error('[migrations] Schema up to date');
|
|
47
52
|
return;
|
|
48
53
|
}
|
|
@@ -67,6 +72,23 @@ export function runMigrations(db) {
|
|
|
67
72
|
if (current < 4) {
|
|
68
73
|
applyMigrationV4(db);
|
|
69
74
|
}
|
|
75
|
+
// Run V5 multi-tenant isolation (SA4E-41) — idempotent, backfills legacyProjectId
|
|
76
|
+
if (current < 5) {
|
|
77
|
+
applyMigrationV5(db, legacyProjectId);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* SA4E-42 — add the `server` scoping column to `mcp_tools` for existing DBs.
|
|
82
|
+
* Uses a PRAGMA table_info probe (F-02) instead of a swallow-all catch, so a
|
|
83
|
+
* genuine migration failure surfaces rather than being silently ignored.
|
|
84
|
+
*/
|
|
85
|
+
export function migrateAddMcpToolsServerColumn(db) {
|
|
86
|
+
const existing = getExistingColumns(db, 'mcp_tools');
|
|
87
|
+
if (!existing.has('server')) {
|
|
88
|
+
db.exec('ALTER TABLE mcp_tools ADD COLUMN server TEXT');
|
|
89
|
+
logger.error('[migrations] SA4E-42: added mcp_tools.server column');
|
|
90
|
+
}
|
|
91
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_mcp_tools_server ON mcp_tools(server)');
|
|
70
92
|
}
|
|
71
93
|
function applyMigrationV4(db) {
|
|
72
94
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../src/engine/db/migrations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../src/engine/db/migrations.ts"],"names":[],"mappings":"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"}
|