agentic-qe 3.6.3 → 3.6.4
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/.claude/helpers/statusline-v3.cjs +4 -3
- package/.claude/skills/release/SKILL.md +33 -2
- package/.claude/skills/skills-manifest.json +1 -1
- package/package.json +1 -1
- package/v3/CHANGELOG.md +25 -0
- package/v3/dist/adapters/a2a/auth/oauth-provider.d.ts +8 -0
- package/v3/dist/adapters/a2a/auth/oauth-provider.d.ts.map +1 -1
- package/v3/dist/adapters/a2a/auth/oauth-provider.js +32 -7
- package/v3/dist/adapters/a2a/auth/oauth-provider.js.map +1 -1
- package/v3/dist/adapters/claude-flow/detect.d.ts +38 -0
- package/v3/dist/adapters/claude-flow/detect.d.ts.map +1 -0
- package/v3/dist/adapters/claude-flow/detect.js +154 -0
- package/v3/dist/adapters/claude-flow/detect.js.map +1 -0
- package/v3/dist/adapters/claude-flow/index.d.ts +2 -0
- package/v3/dist/adapters/claude-flow/index.d.ts.map +1 -1
- package/v3/dist/adapters/claude-flow/index.js +1 -0
- package/v3/dist/adapters/claude-flow/index.js.map +1 -1
- package/v3/dist/adapters/claude-flow/model-router-bridge.d.ts +1 -1
- package/v3/dist/adapters/claude-flow/model-router-bridge.d.ts.map +1 -1
- package/v3/dist/adapters/claude-flow/model-router-bridge.js +5 -15
- package/v3/dist/adapters/claude-flow/model-router-bridge.js.map +1 -1
- package/v3/dist/adapters/claude-flow/pretrain-bridge.d.ts +1 -1
- package/v3/dist/adapters/claude-flow/pretrain-bridge.d.ts.map +1 -1
- package/v3/dist/adapters/claude-flow/pretrain-bridge.js +6 -16
- package/v3/dist/adapters/claude-flow/pretrain-bridge.js.map +1 -1
- package/v3/dist/adapters/claude-flow/trajectory-bridge.d.ts +1 -1
- package/v3/dist/adapters/claude-flow/trajectory-bridge.d.ts.map +1 -1
- package/v3/dist/adapters/claude-flow/trajectory-bridge.js +6 -16
- package/v3/dist/adapters/claude-flow/trajectory-bridge.js.map +1 -1
- package/v3/dist/cli/bundle.js +73696 -71841
- package/v3/dist/cli/commands/claude-flow-setup.d.ts.map +1 -1
- package/v3/dist/cli/commands/claude-flow-setup.js +42 -80
- package/v3/dist/cli/commands/claude-flow-setup.js.map +1 -1
- package/v3/dist/cli/commands/hooks.d.ts.map +1 -1
- package/v3/dist/cli/commands/hooks.js +170 -0
- package/v3/dist/cli/commands/hooks.js.map +1 -1
- package/v3/dist/cli/commands/learning.d.ts.map +1 -1
- package/v3/dist/cli/commands/learning.js +296 -0
- package/v3/dist/cli/commands/learning.js.map +1 -1
- package/v3/dist/cli/handlers/init-handler.d.ts.map +1 -1
- package/v3/dist/cli/handlers/init-handler.js +9 -1
- package/v3/dist/cli/handlers/init-handler.js.map +1 -1
- package/v3/dist/coordination/mincut/mincut-calculator.d.ts +7 -0
- package/v3/dist/coordination/mincut/mincut-calculator.d.ts.map +1 -1
- package/v3/dist/coordination/mincut/mincut-calculator.js +66 -7
- package/v3/dist/coordination/mincut/mincut-calculator.js.map +1 -1
- package/v3/dist/domains/contract-testing/services/contract-validator.d.ts.map +1 -1
- package/v3/dist/domains/contract-testing/services/contract-validator.js +10 -13
- package/v3/dist/domains/contract-testing/services/contract-validator.js.map +1 -1
- package/v3/dist/domains/contract-testing/services/schema-validator.d.ts.map +1 -1
- package/v3/dist/domains/contract-testing/services/schema-validator.js +4 -2
- package/v3/dist/domains/contract-testing/services/schema-validator.js.map +1 -1
- package/v3/dist/governance/deterministic-gateway-integration.d.ts.map +1 -1
- package/v3/dist/governance/deterministic-gateway-integration.js +3 -1
- package/v3/dist/governance/deterministic-gateway-integration.js.map +1 -1
- package/v3/dist/init/enhancements/claude-flow-adapter.d.ts +1 -1
- package/v3/dist/init/enhancements/claude-flow-adapter.d.ts.map +1 -1
- package/v3/dist/init/enhancements/claude-flow-adapter.js +15 -34
- package/v3/dist/init/enhancements/claude-flow-adapter.js.map +1 -1
- package/v3/dist/init/enhancements/detector.d.ts.map +1 -1
- package/v3/dist/init/enhancements/detector.js +7 -34
- package/v3/dist/init/enhancements/detector.js.map +1 -1
- package/v3/dist/init/phases/06-code-intelligence.d.ts +8 -0
- package/v3/dist/init/phases/06-code-intelligence.d.ts.map +1 -1
- package/v3/dist/init/phases/06-code-intelligence.js +118 -24
- package/v3/dist/init/phases/06-code-intelligence.js.map +1 -1
- package/v3/dist/kernel/unified-memory-migration.d.ts.map +1 -1
- package/v3/dist/kernel/unified-memory-migration.js +4 -3
- package/v3/dist/kernel/unified-memory-migration.js.map +1 -1
- package/v3/dist/kernel/unified-memory.d.ts +3 -1
- package/v3/dist/kernel/unified-memory.d.ts.map +1 -1
- package/v3/dist/kernel/unified-memory.js +119 -44
- package/v3/dist/kernel/unified-memory.js.map +1 -1
- package/v3/dist/learning/dream/concept-graph.d.ts +13 -2
- package/v3/dist/learning/dream/concept-graph.d.ts.map +1 -1
- package/v3/dist/learning/dream/concept-graph.js +69 -7
- package/v3/dist/learning/dream/concept-graph.js.map +1 -1
- package/v3/dist/learning/dream/dream-engine.d.ts +5 -0
- package/v3/dist/learning/dream/dream-engine.d.ts.map +1 -1
- package/v3/dist/learning/dream/dream-engine.js +54 -3
- package/v3/dist/learning/dream/dream-engine.js.map +1 -1
- package/v3/dist/learning/dream/spreading-activation.d.ts.map +1 -1
- package/v3/dist/learning/dream/spreading-activation.js +74 -6
- package/v3/dist/learning/dream/spreading-activation.js.map +1 -1
- package/v3/dist/learning/pattern-store.d.ts.map +1 -1
- package/v3/dist/learning/pattern-store.js +9 -8
- package/v3/dist/learning/pattern-store.js.map +1 -1
- package/v3/dist/learning/qe-patterns.d.ts +2 -0
- package/v3/dist/learning/qe-patterns.d.ts.map +1 -1
- package/v3/dist/learning/qe-patterns.js.map +1 -1
- package/v3/dist/learning/qe-reasoning-bank.d.ts +16 -0
- package/v3/dist/learning/qe-reasoning-bank.d.ts.map +1 -1
- package/v3/dist/learning/qe-reasoning-bank.js +709 -0
- package/v3/dist/learning/qe-reasoning-bank.js.map +1 -1
- package/v3/dist/mcp/bundle.js +1501 -217
- package/v3/dist/mcp/connection-pool.d.ts +1 -1
- package/v3/dist/mcp/connection-pool.d.ts.map +1 -1
- package/v3/dist/mcp/connection-pool.js +27 -13
- package/v3/dist/mcp/connection-pool.js.map +1 -1
- package/v3/dist/mcp/handlers/handler-factory.d.ts +2 -0
- package/v3/dist/mcp/handlers/handler-factory.d.ts.map +1 -1
- package/v3/dist/mcp/handlers/handler-factory.js +52 -4
- package/v3/dist/mcp/handlers/handler-factory.js.map +1 -1
- package/v3/dist/mcp/http-server.d.ts.map +1 -1
- package/v3/dist/mcp/http-server.js +2 -1
- package/v3/dist/mcp/http-server.js.map +1 -1
- package/v3/dist/mcp/security/oauth21-provider.d.ts.map +1 -1
- package/v3/dist/mcp/security/oauth21-provider.js +25 -15
- package/v3/dist/mcp/security/oauth21-provider.js.map +1 -1
- package/v3/dist/mcp/security/rate-limiter.d.ts.map +1 -1
- package/v3/dist/mcp/security/rate-limiter.js +5 -4
- package/v3/dist/mcp/security/rate-limiter.js.map +1 -1
- package/v3/dist/mcp/security/schema-validator.d.ts.map +1 -1
- package/v3/dist/mcp/security/schema-validator.js +13 -9
- package/v3/dist/mcp/security/schema-validator.js.map +1 -1
- package/v3/dist/mcp/tools/contract-testing/validate.d.ts.map +1 -1
- package/v3/dist/mcp/tools/contract-testing/validate.js +3 -2
- package/v3/dist/mcp/tools/contract-testing/validate.js.map +1 -1
- package/v3/dist/mcp/transport/sse/connection-manager.d.ts +1 -0
- package/v3/dist/mcp/transport/sse/connection-manager.d.ts.map +1 -1
- package/v3/dist/mcp/transport/sse/connection-manager.js +31 -10
- package/v3/dist/mcp/transport/sse/connection-manager.js.map +1 -1
- package/v3/dist/mcp/transport/sse/sse-transport.d.ts.map +1 -1
- package/v3/dist/mcp/transport/sse/sse-transport.js +2 -1
- package/v3/dist/mcp/transport/sse/sse-transport.js.map +1 -1
- package/v3/dist/mcp/transport/stdio.d.ts.map +1 -1
- package/v3/dist/mcp/transport/stdio.js +2 -1
- package/v3/dist/mcp/transport/stdio.js.map +1 -1
- package/v3/dist/mcp/transport/websocket/websocket-transport.d.ts.map +1 -1
- package/v3/dist/mcp/transport/websocket/websocket-transport.js +2 -1
- package/v3/dist/mcp/transport/websocket/websocket-transport.js.map +1 -1
- package/v3/dist/performance/optimizer.d.ts.map +1 -1
- package/v3/dist/performance/optimizer.js +19 -3
- package/v3/dist/performance/optimizer.js.map +1 -1
- package/v3/dist/shared/sql-safety.d.ts +18 -0
- package/v3/dist/shared/sql-safety.d.ts.map +1 -0
- package/v3/dist/shared/sql-safety.js +44 -0
- package/v3/dist/shared/sql-safety.js.map +1 -0
- package/v3/dist/sync/embeddings/sync-embedding-generator.d.ts.map +1 -1
- package/v3/dist/sync/embeddings/sync-embedding-generator.js +9 -7
- package/v3/dist/sync/embeddings/sync-embedding-generator.js.map +1 -1
- package/v3/dist/sync/interfaces.js +5 -5
- package/v3/dist/sync/interfaces.js.map +1 -1
- package/v3/dist/sync/readers/sqlite-reader.d.ts.map +1 -1
- package/v3/dist/sync/readers/sqlite-reader.js +5 -4
- package/v3/dist/sync/readers/sqlite-reader.js.map +1 -1
- package/v3/package.json +2 -2
|
@@ -6,10 +6,41 @@
|
|
|
6
6
|
* so QE agents can use it later to reduce token consumption via
|
|
7
7
|
* semantic code search instead of full file reads.
|
|
8
8
|
*/
|
|
9
|
-
import { existsSync } from 'fs';
|
|
9
|
+
import { existsSync, statSync } from 'fs';
|
|
10
10
|
import { join } from 'path';
|
|
11
11
|
import { BasePhase, } from './phase-interface.js';
|
|
12
12
|
import { createMemoryBackend } from '../../kernel/memory-factory.js';
|
|
13
|
+
/** Patterns to exclude from code intelligence scanning */
|
|
14
|
+
const SCAN_IGNORE_PATTERNS = [
|
|
15
|
+
'**/node_modules/**',
|
|
16
|
+
'**/dist/**',
|
|
17
|
+
'**/build/**',
|
|
18
|
+
'**/out/**',
|
|
19
|
+
'**/coverage/**',
|
|
20
|
+
'**/.agentic-qe/**',
|
|
21
|
+
'**/.git/**',
|
|
22
|
+
'**/.next/**',
|
|
23
|
+
'**/.nuxt/**',
|
|
24
|
+
'**/.output/**',
|
|
25
|
+
'**/__pycache__/**',
|
|
26
|
+
'**/.pytest_cache/**',
|
|
27
|
+
'**/target/**',
|
|
28
|
+
'**/vendor/**',
|
|
29
|
+
'**/.venv/**',
|
|
30
|
+
'**/venv/**',
|
|
31
|
+
'**/.tox/**',
|
|
32
|
+
'**/*.min.js',
|
|
33
|
+
'**/*.min.css',
|
|
34
|
+
'**/*.bundle.js',
|
|
35
|
+
'**/*.map',
|
|
36
|
+
'**/package-lock.json',
|
|
37
|
+
'**/yarn.lock',
|
|
38
|
+
'**/pnpm-lock.yaml',
|
|
39
|
+
'**/Pipfile.lock',
|
|
40
|
+
'**/poetry.lock',
|
|
41
|
+
'**/.env',
|
|
42
|
+
'**/.env.*',
|
|
43
|
+
];
|
|
13
44
|
/**
|
|
14
45
|
* Code Intelligence phase - builds knowledge graph
|
|
15
46
|
*/
|
|
@@ -21,16 +52,26 @@ export class CodeIntelligencePhase extends BasePhase {
|
|
|
21
52
|
requiresPhases = ['database'];
|
|
22
53
|
async run(context) {
|
|
23
54
|
const { projectRoot } = context;
|
|
24
|
-
// Check for existing index
|
|
25
55
|
const hasIndex = await this.checkCodeIntelligenceIndex(projectRoot);
|
|
26
|
-
if (hasIndex) {
|
|
56
|
+
if (!hasIndex) {
|
|
57
|
+
context.services.log(' Building knowledge graph...');
|
|
58
|
+
return await this.runCodeIntelligenceScan(projectRoot, context, false);
|
|
59
|
+
}
|
|
60
|
+
// Delta scan: check for files modified since last index
|
|
61
|
+
const lastIndexedAt = await this.getLastIndexedAt(projectRoot);
|
|
62
|
+
if (!lastIndexedAt) {
|
|
27
63
|
const entryCount = await this.getKGEntryCount(projectRoot);
|
|
28
64
|
context.services.log(` Using existing index (${entryCount} entries)`);
|
|
29
65
|
return { status: 'existing', entries: entryCount };
|
|
30
66
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
67
|
+
const changedFiles = await this.findChangedFiles(projectRoot, lastIndexedAt);
|
|
68
|
+
if (changedFiles.length === 0) {
|
|
69
|
+
const entryCount = await this.getKGEntryCount(projectRoot);
|
|
70
|
+
context.services.log(` Index up to date (${entryCount} entries)`);
|
|
71
|
+
return { status: 'existing', entries: entryCount };
|
|
72
|
+
}
|
|
73
|
+
context.services.log(` Delta scan: ${changedFiles.length} files changed since last index...`);
|
|
74
|
+
return await this.runCodeIntelligenceScan(projectRoot, context, true, changedFiles);
|
|
34
75
|
}
|
|
35
76
|
/**
|
|
36
77
|
* Check if code intelligence index exists
|
|
@@ -83,12 +124,9 @@ export class CodeIntelligencePhase extends BasePhase {
|
|
|
83
124
|
* - Test target discovery (what tests cover what code)
|
|
84
125
|
* - Token reduction (search KG instead of reading entire files)
|
|
85
126
|
*/
|
|
86
|
-
async runCodeIntelligenceScan(projectRoot, context) {
|
|
127
|
+
async runCodeIntelligenceScan(projectRoot, context, incremental, changedFiles) {
|
|
87
128
|
try {
|
|
88
|
-
// Import knowledge graph service
|
|
89
129
|
const { KnowledgeGraphService } = await import('../../domains/code-intelligence/services/knowledge-graph.js');
|
|
90
|
-
// FIXED: Use SQLite backend for PERSISTENCE instead of InMemoryBackend
|
|
91
|
-
// This ensures KG data survives init and is available to QE agents
|
|
92
130
|
const dbPath = join(projectRoot, '.agentic-qe', 'memory.db');
|
|
93
131
|
const memoryConfig = {
|
|
94
132
|
type: 'sqlite',
|
|
@@ -102,27 +140,31 @@ export class CodeIntelligencePhase extends BasePhase {
|
|
|
102
140
|
namespace: 'code-intelligence:kg',
|
|
103
141
|
enableVectorEmbeddings: true,
|
|
104
142
|
});
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
143
|
+
let filesToIndex;
|
|
144
|
+
if (changedFiles) {
|
|
145
|
+
filesToIndex = changedFiles;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
const glob = await import('fast-glob');
|
|
149
|
+
const files = await glob.default([
|
|
150
|
+
'**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx', '**/*.py'
|
|
151
|
+
], {
|
|
152
|
+
cwd: projectRoot,
|
|
153
|
+
ignore: SCAN_IGNORE_PATTERNS,
|
|
154
|
+
});
|
|
155
|
+
filesToIndex = files.map(f => join(projectRoot, f));
|
|
156
|
+
}
|
|
114
157
|
const result = await kgService.index({
|
|
115
|
-
paths:
|
|
116
|
-
incremental
|
|
158
|
+
paths: filesToIndex,
|
|
159
|
+
incremental,
|
|
117
160
|
includeTests: true,
|
|
118
161
|
});
|
|
119
|
-
// Clear caches but keep persisted data
|
|
120
162
|
kgService.destroy();
|
|
121
|
-
// Dispose memory backend to flush writes
|
|
122
163
|
await memory.dispose();
|
|
123
164
|
if (result.success) {
|
|
124
165
|
const entries = result.value.nodesCreated + result.value.edgesCreated;
|
|
125
|
-
|
|
166
|
+
const label = incremental ? 'Delta indexed' : 'Indexed';
|
|
167
|
+
context.services.log(` ${label} ${entries} entries to ${dbPath}`);
|
|
126
168
|
return { status: 'indexed', entries };
|
|
127
169
|
}
|
|
128
170
|
return { status: 'error', entries: 0 };
|
|
@@ -132,6 +174,58 @@ export class CodeIntelligencePhase extends BasePhase {
|
|
|
132
174
|
return { status: 'skipped', entries: 0 };
|
|
133
175
|
}
|
|
134
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* Read the indexedAt timestamp from KG metadata
|
|
179
|
+
*/
|
|
180
|
+
async getLastIndexedAt(projectRoot) {
|
|
181
|
+
const dbPath = join(projectRoot, '.agentic-qe', 'memory.db');
|
|
182
|
+
try {
|
|
183
|
+
const Database = (await import('better-sqlite3')).default;
|
|
184
|
+
const db = new Database(dbPath);
|
|
185
|
+
const row = db.prepare(`
|
|
186
|
+
SELECT value FROM kv_store
|
|
187
|
+
WHERE namespace = 'code-intelligence:kg'
|
|
188
|
+
AND key = 'metadata:index'
|
|
189
|
+
`).get();
|
|
190
|
+
db.close();
|
|
191
|
+
if (!row)
|
|
192
|
+
return null;
|
|
193
|
+
const metadata = JSON.parse(row.value);
|
|
194
|
+
if (!metadata.indexedAt)
|
|
195
|
+
return null;
|
|
196
|
+
const date = new Date(metadata.indexedAt);
|
|
197
|
+
return isNaN(date.getTime()) ? null : date;
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Find files modified since the given date
|
|
205
|
+
*/
|
|
206
|
+
async findChangedFiles(projectRoot, since) {
|
|
207
|
+
const glob = await import('fast-glob');
|
|
208
|
+
const files = await glob.default([
|
|
209
|
+
'**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx', '**/*.py'
|
|
210
|
+
], {
|
|
211
|
+
cwd: projectRoot,
|
|
212
|
+
ignore: SCAN_IGNORE_PATTERNS,
|
|
213
|
+
});
|
|
214
|
+
const sinceMs = since.getTime();
|
|
215
|
+
const changed = [];
|
|
216
|
+
for (const file of files) {
|
|
217
|
+
const fullPath = join(projectRoot, file);
|
|
218
|
+
try {
|
|
219
|
+
if (statSync(fullPath).mtimeMs > sinceMs) {
|
|
220
|
+
changed.push(fullPath);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// File may have been deleted between glob and stat
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return changed;
|
|
228
|
+
}
|
|
135
229
|
}
|
|
136
230
|
// Instance exported from index.ts
|
|
137
231
|
//# sourceMappingURL=06-code-intelligence.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"06-code-intelligence.js","sourceRoot":"","sources":["../../../src/init/phases/06-code-intelligence.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"06-code-intelligence.js","sourceRoot":"","sources":["../../../src/init/phases/06-code-intelligence.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unified-memory-migration.d.ts","sourceRoot":"","sources":["../../src/kernel/unified-memory-migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"unified-memory-migration.d.ts","sourceRoot":"","sources":["../../src/kernel/unified-memory-migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,aAAa,EAAE,OAAO,CAAC;IACvB,qDAAqD;IACrD,0BAA0B,EAAE,OAAO,CAAC;IACpC,yDAAyD;IACzD,MAAM,EAAE,OAAO,CAAC;CACjB;AASD;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAClC,OAAO,CAAC,eAAe,CAAC,CA2N1B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,MAAsB,GAAG,OAAO,CAGxE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,MAAsB,GAAG;IACnE,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;CACvB,CAaA"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
import Database from 'better-sqlite3';
|
|
11
11
|
import * as fs from 'fs';
|
|
12
12
|
import * as path from 'path';
|
|
13
|
+
import { validateTableName } from '../shared/sql-safety.js';
|
|
13
14
|
const DEFAULT_OPTIONS = {
|
|
14
15
|
baseDir: '.agentic-qe',
|
|
15
16
|
createBackups: true,
|
|
@@ -95,7 +96,7 @@ export async function migrateToUnifiedMemory(options) {
|
|
|
95
96
|
continue;
|
|
96
97
|
}
|
|
97
98
|
// Count rows
|
|
98
|
-
const countRow = sourceDb.prepare(`SELECT COUNT(*) as count FROM ${tableName}`).get();
|
|
99
|
+
const countRow = sourceDb.prepare(`SELECT COUNT(*) as count FROM ${validateTableName(tableName)}`).get();
|
|
99
100
|
const rowCount = countRow.count;
|
|
100
101
|
if (rowCount === 0) {
|
|
101
102
|
continue;
|
|
@@ -112,12 +113,12 @@ export async function migrateToUnifiedMemory(options) {
|
|
|
112
113
|
`).get(tableName);
|
|
113
114
|
targetDb.exec(schemaRow.sql);
|
|
114
115
|
// Copy data
|
|
115
|
-
const rows = sourceDb.prepare(`SELECT * FROM ${tableName}`).all();
|
|
116
|
+
const rows = sourceDb.prepare(`SELECT * FROM ${validateTableName(tableName)}`).all();
|
|
116
117
|
if (rows.length > 0) {
|
|
117
118
|
const columns = Object.keys(rows[0]);
|
|
118
119
|
const placeholders = columns.map(() => '?').join(', ');
|
|
119
120
|
const insertStmt = targetDb.prepare(`
|
|
120
|
-
INSERT OR REPLACE INTO ${tableName} (${columns.join(', ')})
|
|
121
|
+
INSERT OR REPLACE INTO ${validateTableName(tableName)} (${columns.join(', ')})
|
|
121
122
|
VALUES (${placeholders})
|
|
122
123
|
`);
|
|
123
124
|
const insertMany = targetDb.transaction((items) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unified-memory-migration.js","sourceRoot":"","sources":["../../src/kernel/unified-memory-migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,QAA2C,MAAM,gBAAgB,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"unified-memory-migration.js","sourceRoot":"","sources":["../../src/kernel/unified-memory-migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* - No confusion about where data lives
|
|
18
18
|
*/
|
|
19
19
|
import { type Database as DatabaseType, type Statement } from 'better-sqlite3';
|
|
20
|
+
export { validateTableName, ALLOWED_TABLE_NAMES } from '../shared/sql-safety.js';
|
|
20
21
|
import { type CRDTStore, type CRDTStoreState, type CRDTStoreDelta } from '../memory/crdt/index.js';
|
|
21
22
|
/**
|
|
22
23
|
* Find the project root by walking up the directory tree.
|
|
@@ -172,7 +173,8 @@ export declare class UnifiedMemoryManager {
|
|
|
172
173
|
*/
|
|
173
174
|
vectorDelete(id: string): Promise<boolean>;
|
|
174
175
|
/**
|
|
175
|
-
* Search for similar vectors
|
|
176
|
+
* Search for similar vectors.
|
|
177
|
+
* Uses batch SQL query instead of N+1 individual queries for metadata enrichment.
|
|
176
178
|
*/
|
|
177
179
|
vectorSearch(query: number[], k?: number, namespace?: string): Promise<Array<{
|
|
178
180
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unified-memory.d.ts","sourceRoot":"","sources":["../../src/kernel/unified-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAiB,EAAE,KAAK,QAAQ,IAAI,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"unified-memory.d.ts","sourceRoot":"","sources":["../../src/kernel/unified-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,12 @@ import * as path from 'path';
|
|
|
22
22
|
import { cosineSimilarity } from '../shared/utils/vector-math.js';
|
|
23
23
|
import { HYPERGRAPH_SCHEMA } from '../migrations/20260120_add_hypergraph_tables.js';
|
|
24
24
|
import { MEMORY_CONSTANTS, HNSW_CONSTANTS } from './constants.js';
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// SQL Table Name Allowlist (defense-in-depth against SQL injection)
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// Re-export from shared module for backward compatibility
|
|
29
|
+
export { validateTableName, ALLOWED_TABLE_NAMES } from '../shared/sql-safety.js';
|
|
30
|
+
import { validateTableName } from '../shared/sql-safety.js';
|
|
25
31
|
// CRDT imports for distributed state synchronization
|
|
26
32
|
import { createCRDTStore, } from '../memory/crdt/index.js';
|
|
27
33
|
// ============================================================================
|
|
@@ -591,6 +597,74 @@ const SONA_PATTERNS_SCHEMA = `
|
|
|
591
597
|
CREATE INDEX IF NOT EXISTS idx_sona_patterns_confidence ON sona_patterns(confidence DESC);
|
|
592
598
|
CREATE INDEX IF NOT EXISTS idx_sona_patterns_updated ON sona_patterns(updated_at DESC);
|
|
593
599
|
`;
|
|
600
|
+
// ============================================================================
|
|
601
|
+
// In-Memory HNSW Index for Fast Vector Search
|
|
602
|
+
// ============================================================================
|
|
603
|
+
/**
|
|
604
|
+
* Binary min/max heap for O(log n) insertion and extraction.
|
|
605
|
+
* Replaces sorted arrays with O(n) splice in HNSW beam search.
|
|
606
|
+
*/
|
|
607
|
+
class BinaryHeap {
|
|
608
|
+
data = [];
|
|
609
|
+
compareFn;
|
|
610
|
+
constructor(compareFn) {
|
|
611
|
+
this.compareFn = compareFn;
|
|
612
|
+
}
|
|
613
|
+
push(item) {
|
|
614
|
+
this.data.push(item);
|
|
615
|
+
this.bubbleUp(this.data.length - 1);
|
|
616
|
+
}
|
|
617
|
+
pop() {
|
|
618
|
+
if (this.data.length === 0)
|
|
619
|
+
return undefined;
|
|
620
|
+
const top = this.data[0];
|
|
621
|
+
const last = this.data.pop();
|
|
622
|
+
if (this.data.length > 0) {
|
|
623
|
+
this.data[0] = last;
|
|
624
|
+
this.sinkDown(0);
|
|
625
|
+
}
|
|
626
|
+
return top;
|
|
627
|
+
}
|
|
628
|
+
peek() {
|
|
629
|
+
return this.data[0];
|
|
630
|
+
}
|
|
631
|
+
size() {
|
|
632
|
+
return this.data.length;
|
|
633
|
+
}
|
|
634
|
+
bubbleUp(i) {
|
|
635
|
+
while (i > 0) {
|
|
636
|
+
const parent = (i - 1) >> 1;
|
|
637
|
+
if (this.compareFn(this.data[i], this.data[parent]) < 0) {
|
|
638
|
+
[this.data[i], this.data[parent]] = [this.data[parent], this.data[i]];
|
|
639
|
+
i = parent;
|
|
640
|
+
}
|
|
641
|
+
else {
|
|
642
|
+
break;
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
sinkDown(i) {
|
|
647
|
+
const n = this.data.length;
|
|
648
|
+
while (true) {
|
|
649
|
+
let smallest = i;
|
|
650
|
+
const left = 2 * i + 1;
|
|
651
|
+
const right = 2 * i + 2;
|
|
652
|
+
if (left < n && this.compareFn(this.data[left], this.data[smallest]) < 0) {
|
|
653
|
+
smallest = left;
|
|
654
|
+
}
|
|
655
|
+
if (right < n && this.compareFn(this.data[right], this.data[smallest]) < 0) {
|
|
656
|
+
smallest = right;
|
|
657
|
+
}
|
|
658
|
+
if (smallest !== i) {
|
|
659
|
+
[this.data[i], this.data[smallest]] = [this.data[smallest], this.data[i]];
|
|
660
|
+
i = smallest;
|
|
661
|
+
}
|
|
662
|
+
else {
|
|
663
|
+
break;
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
}
|
|
594
668
|
/**
|
|
595
669
|
* In-memory HNSW (Hierarchical Navigable Small World) index built from
|
|
596
670
|
* SQLite vectors on startup. Provides O(log n) approximate nearest
|
|
@@ -657,23 +731,30 @@ class InMemoryHNSWIndex {
|
|
|
657
731
|
/**
|
|
658
732
|
* Beam search at a single layer: starting from an entry point, explore
|
|
659
733
|
* up to `ef` candidates and return the `ef` closest found.
|
|
660
|
-
* Uses a
|
|
661
|
-
*
|
|
734
|
+
* Uses a max-heap for candidates and a min-heap for results to achieve
|
|
735
|
+
* O(log n) insertion instead of O(n) Array.splice.
|
|
736
|
+
* Returns results sorted by descending similarity.
|
|
662
737
|
*/
|
|
663
738
|
searchLayerBeam(query, entryIds, level, ef) {
|
|
664
739
|
const visited = new Set(entryIds);
|
|
665
|
-
|
|
666
|
-
const candidates = entryIds
|
|
740
|
+
const initial = entryIds
|
|
667
741
|
.filter(id => this.nodes.has(id))
|
|
668
742
|
.map(id => ({ id, score: this.similarity(query, id) }));
|
|
669
|
-
candidates
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
743
|
+
// Max-heap for candidates (best score = highest priority)
|
|
744
|
+
const candidateHeap = new BinaryHeap((a, b) => b.score - a.score // max-heap: highest score first
|
|
745
|
+
);
|
|
746
|
+
// Min-heap for results (worst score at top for fast eviction)
|
|
747
|
+
const resultHeap = new BinaryHeap((a, b) => a.score - b.score // min-heap: lowest score first
|
|
748
|
+
);
|
|
749
|
+
for (const entry of initial) {
|
|
750
|
+
candidateHeap.push(entry);
|
|
751
|
+
resultHeap.push(entry);
|
|
752
|
+
}
|
|
753
|
+
while (candidateHeap.size() > 0) {
|
|
754
|
+
const closest = candidateHeap.pop();
|
|
674
755
|
// If the closest candidate is worse than the worst in results
|
|
675
756
|
// and we already have ef results, stop
|
|
676
|
-
if (
|
|
757
|
+
if (resultHeap.size() >= ef && closest.score < resultHeap.peek().score) {
|
|
677
758
|
break;
|
|
678
759
|
}
|
|
679
760
|
const node = this.nodes.get(closest.id);
|
|
@@ -687,38 +768,24 @@ class InMemoryHNSWIndex {
|
|
|
687
768
|
if (!this.nodes.has(neighborId))
|
|
688
769
|
continue;
|
|
689
770
|
const score = this.similarity(query, neighborId);
|
|
690
|
-
const worstResult =
|
|
691
|
-
if (
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
inserted = true;
|
|
699
|
-
break;
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
if (!inserted)
|
|
703
|
-
candidates.push(candidateEntry);
|
|
704
|
-
// Insert into results in sorted position
|
|
705
|
-
inserted = false;
|
|
706
|
-
for (let i = 0; i < results.length; i++) {
|
|
707
|
-
if (score > results[i].score) {
|
|
708
|
-
results.splice(i, 0, candidateEntry);
|
|
709
|
-
inserted = true;
|
|
710
|
-
break;
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
if (!inserted)
|
|
714
|
-
results.push(candidateEntry);
|
|
715
|
-
// Trim results to ef
|
|
716
|
-
if (results.length > ef) {
|
|
717
|
-
results.pop();
|
|
771
|
+
const worstResult = resultHeap.size() >= ef ? resultHeap.peek().score : -Infinity;
|
|
772
|
+
if (resultHeap.size() < ef || score > worstResult) {
|
|
773
|
+
const entry = { id: neighborId, score };
|
|
774
|
+
candidateHeap.push(entry);
|
|
775
|
+
resultHeap.push(entry);
|
|
776
|
+
// Evict worst result if over capacity
|
|
777
|
+
if (resultHeap.size() > ef) {
|
|
778
|
+
resultHeap.pop();
|
|
718
779
|
}
|
|
719
780
|
}
|
|
720
781
|
}
|
|
721
782
|
}
|
|
783
|
+
// Drain result heap into array sorted descending by score
|
|
784
|
+
const results = [];
|
|
785
|
+
while (resultHeap.size() > 0) {
|
|
786
|
+
results.push(resultHeap.pop());
|
|
787
|
+
}
|
|
788
|
+
results.reverse(); // min-heap drains ascending, reverse for descending
|
|
722
789
|
return results;
|
|
723
790
|
}
|
|
724
791
|
/**
|
|
@@ -1087,7 +1154,8 @@ export class UnifiedMemoryManager {
|
|
|
1087
1154
|
if (!this.db)
|
|
1088
1155
|
return false;
|
|
1089
1156
|
try {
|
|
1090
|
-
const
|
|
1157
|
+
const safeName = validateTableName(tableName);
|
|
1158
|
+
const info = this.db.prepare(`PRAGMA table_info(${safeName})`).all();
|
|
1091
1159
|
return info.some(col => col.name === columnName);
|
|
1092
1160
|
}
|
|
1093
1161
|
catch {
|
|
@@ -1123,7 +1191,7 @@ export class UnifiedMemoryManager {
|
|
|
1123
1191
|
if (tableExists && !this.columnExists(table, requiredColumn)) {
|
|
1124
1192
|
console.log(`[UnifiedMemory] Upgrading v2 table: ${table} (missing ${requiredColumn})`);
|
|
1125
1193
|
// Drop the old table - will be recreated with v3 schema
|
|
1126
|
-
this.db.exec(`DROP TABLE IF EXISTS ${table}`);
|
|
1194
|
+
this.db.exec(`DROP TABLE IF EXISTS ${validateTableName(table)}`);
|
|
1127
1195
|
}
|
|
1128
1196
|
}
|
|
1129
1197
|
}
|
|
@@ -1314,17 +1382,24 @@ export class UnifiedMemoryManager {
|
|
|
1314
1382
|
return result.changes > 0;
|
|
1315
1383
|
}
|
|
1316
1384
|
/**
|
|
1317
|
-
* Search for similar vectors
|
|
1385
|
+
* Search for similar vectors.
|
|
1386
|
+
* Uses batch SQL query instead of N+1 individual queries for metadata enrichment.
|
|
1318
1387
|
*/
|
|
1319
1388
|
async vectorSearch(query, k = 10, namespace) {
|
|
1320
1389
|
this.ensureInitialized();
|
|
1321
1390
|
// Use in-memory HNSW index for fast search
|
|
1322
1391
|
const results = this.vectorIndex.search(query, k * 2); // Get extra for namespace filtering
|
|
1323
|
-
|
|
1392
|
+
if (results.length === 0)
|
|
1393
|
+
return [];
|
|
1394
|
+
// Batch fetch metadata for all result IDs in a single query (fixes N+1)
|
|
1395
|
+
const ids = results.map(r => r.id);
|
|
1396
|
+
const placeholders = ids.map(() => '?').join(',');
|
|
1397
|
+
const rows = this.db.prepare(`SELECT id, namespace, metadata FROM vectors WHERE id IN (${placeholders})`).all(...ids);
|
|
1398
|
+
const metadataMap = new Map(rows.map(row => [row.id, row]));
|
|
1324
1399
|
if (namespace) {
|
|
1325
1400
|
const filteredResults = [];
|
|
1326
1401
|
for (const result of results) {
|
|
1327
|
-
const row =
|
|
1402
|
+
const row = metadataMap.get(result.id);
|
|
1328
1403
|
if (row && row.namespace === namespace) {
|
|
1329
1404
|
filteredResults.push({
|
|
1330
1405
|
id: result.id,
|
|
@@ -1339,7 +1414,7 @@ export class UnifiedMemoryManager {
|
|
|
1339
1414
|
}
|
|
1340
1415
|
// No namespace filter, just enrich with metadata
|
|
1341
1416
|
return results.slice(0, k).map(result => {
|
|
1342
|
-
const row =
|
|
1417
|
+
const row = metadataMap.get(result.id);
|
|
1343
1418
|
return {
|
|
1344
1419
|
id: result.id,
|
|
1345
1420
|
score: result.score,
|