@timmeck/brain 1.1.1 → 1.8.0
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 +225 -50
- package/dist/api/server.d.ts +19 -0
- package/dist/api/server.js +281 -0
- package/dist/api/server.js.map +1 -0
- package/dist/brain.d.ts +3 -0
- package/dist/brain.js +45 -8
- package/dist/brain.js.map +1 -1
- package/dist/cli/commands/dashboard.js +2 -0
- package/dist/cli/commands/dashboard.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.js +118 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/explain.d.ts +2 -0
- package/dist/cli/commands/explain.js +76 -0
- package/dist/cli/commands/explain.js.map +1 -0
- package/dist/cli/commands/projects.d.ts +2 -0
- package/dist/cli/commands/projects.js +36 -0
- package/dist/cli/commands/projects.js.map +1 -0
- package/dist/code/analyzer.d.ts +6 -0
- package/dist/code/analyzer.js +35 -0
- package/dist/code/analyzer.js.map +1 -1
- package/dist/code/matcher.d.ts +11 -1
- package/dist/code/matcher.js +49 -0
- package/dist/code/matcher.js.map +1 -1
- package/dist/code/scorer.d.ts +1 -0
- package/dist/code/scorer.js +15 -1
- package/dist/code/scorer.js.map +1 -1
- package/dist/config.js +31 -0
- package/dist/config.js.map +1 -1
- package/dist/dashboard/server.d.ts +15 -0
- package/dist/dashboard/server.js +124 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/db/migrations/007_feedback.d.ts +2 -0
- package/dist/db/migrations/007_feedback.js +12 -0
- package/dist/db/migrations/007_feedback.js.map +1 -0
- package/dist/db/migrations/008_git_integration.d.ts +2 -0
- package/dist/db/migrations/008_git_integration.js +37 -0
- package/dist/db/migrations/008_git_integration.js.map +1 -0
- package/dist/db/migrations/009_embeddings.d.ts +2 -0
- package/dist/db/migrations/009_embeddings.js +7 -0
- package/dist/db/migrations/009_embeddings.js.map +1 -0
- package/dist/db/migrations/index.js +6 -0
- package/dist/db/migrations/index.js.map +1 -1
- package/dist/db/repositories/code-module.repository.d.ts +16 -0
- package/dist/db/repositories/code-module.repository.js +42 -0
- package/dist/db/repositories/code-module.repository.js.map +1 -1
- package/dist/db/repositories/error.repository.d.ts +5 -0
- package/dist/db/repositories/error.repository.js +27 -0
- package/dist/db/repositories/error.repository.js.map +1 -1
- package/dist/db/repositories/insight.repository.d.ts +2 -0
- package/dist/db/repositories/insight.repository.js +13 -0
- package/dist/db/repositories/insight.repository.js.map +1 -1
- package/dist/embeddings/engine.d.ts +42 -0
- package/dist/embeddings/engine.js +166 -0
- package/dist/embeddings/engine.js.map +1 -0
- package/dist/hooks/post-tool-use.js +2 -0
- package/dist/hooks/post-tool-use.js.map +1 -1
- package/dist/hooks/post-write.js +11 -0
- package/dist/hooks/post-write.js.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/ipc/router.d.ts +2 -0
- package/dist/ipc/router.js +15 -0
- package/dist/ipc/router.js.map +1 -1
- package/dist/learning/confidence-scorer.d.ts +16 -0
- package/dist/learning/confidence-scorer.js +20 -0
- package/dist/learning/confidence-scorer.js.map +1 -1
- package/dist/learning/learning-engine.js +12 -5
- package/dist/learning/learning-engine.js.map +1 -1
- package/dist/matching/error-matcher.d.ts +9 -1
- package/dist/matching/error-matcher.js +50 -5
- package/dist/matching/error-matcher.js.map +1 -1
- package/dist/mcp/http-server.d.ts +14 -0
- package/dist/mcp/http-server.js +117 -0
- package/dist/mcp/http-server.js.map +1 -0
- package/dist/mcp/tools.d.ts +4 -0
- package/dist/mcp/tools.js +41 -14
- package/dist/mcp/tools.js.map +1 -1
- package/dist/services/analytics.service.d.ts +39 -0
- package/dist/services/analytics.service.js +111 -0
- package/dist/services/analytics.service.js.map +1 -1
- package/dist/services/code.service.d.ts +10 -0
- package/dist/services/code.service.js +73 -4
- package/dist/services/code.service.js.map +1 -1
- package/dist/services/error.service.d.ts +17 -1
- package/dist/services/error.service.js +90 -12
- package/dist/services/error.service.js.map +1 -1
- package/dist/services/git.service.d.ts +49 -0
- package/dist/services/git.service.js +112 -0
- package/dist/services/git.service.js.map +1 -0
- package/dist/services/prevention.service.d.ts +7 -0
- package/dist/services/prevention.service.js +38 -0
- package/dist/services/prevention.service.js.map +1 -1
- package/dist/services/research.service.d.ts +1 -0
- package/dist/services/research.service.js +4 -0
- package/dist/services/research.service.js.map +1 -1
- package/dist/services/solution.service.d.ts +10 -0
- package/dist/services/solution.service.js +48 -0
- package/dist/services/solution.service.js.map +1 -1
- package/dist/types/config.types.d.ts +21 -0
- package/dist/types/synapse.types.d.ts +1 -1
- package/package.json +8 -3
- package/src/api/server.ts +321 -0
- package/src/brain.ts +50 -8
- package/src/cli/commands/dashboard.ts +2 -0
- package/src/cli/commands/doctor.ts +118 -0
- package/src/cli/commands/explain.ts +83 -0
- package/src/cli/commands/projects.ts +42 -0
- package/src/code/analyzer.ts +40 -0
- package/src/code/matcher.ts +67 -2
- package/src/code/scorer.ts +13 -1
- package/src/config.ts +24 -0
- package/src/dashboard/server.ts +142 -0
- package/src/db/migrations/007_feedback.ts +13 -0
- package/src/db/migrations/008_git_integration.ts +38 -0
- package/src/db/migrations/009_embeddings.ts +8 -0
- package/src/db/migrations/index.ts +6 -0
- package/src/db/repositories/code-module.repository.ts +53 -0
- package/src/db/repositories/error.repository.ts +40 -0
- package/src/db/repositories/insight.repository.ts +21 -0
- package/src/embeddings/engine.ts +217 -0
- package/src/hooks/post-tool-use.ts +2 -0
- package/src/hooks/post-write.ts +12 -0
- package/src/index.ts +7 -1
- package/src/ipc/router.ts +19 -0
- package/src/learning/confidence-scorer.ts +33 -0
- package/src/learning/learning-engine.ts +13 -5
- package/src/matching/error-matcher.ts +55 -4
- package/src/mcp/http-server.ts +137 -0
- package/src/mcp/tools.ts +52 -14
- package/src/services/analytics.service.ts +136 -0
- package/src/services/code.service.ts +99 -4
- package/src/services/error.service.ts +114 -13
- package/src/services/git.service.ts +132 -0
- package/src/services/prevention.service.ts +40 -0
- package/src/services/research.service.ts +5 -0
- package/src/services/solution.service.ts +58 -0
- package/src/types/config.types.ts +24 -0
- package/src/types/synapse.types.ts +1 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import { getEventBus } from '../utils/events.js';
|
|
3
|
+
import { getLogger } from '../utils/logger.js';
|
|
4
|
+
export class DashboardServer {
|
|
5
|
+
options;
|
|
6
|
+
server = null;
|
|
7
|
+
clients = new Set();
|
|
8
|
+
logger = getLogger();
|
|
9
|
+
constructor(options) {
|
|
10
|
+
this.options = options;
|
|
11
|
+
}
|
|
12
|
+
start() {
|
|
13
|
+
const { port, getDashboardHtml, getStats } = this.options;
|
|
14
|
+
const bus = getEventBus();
|
|
15
|
+
this.server = http.createServer((req, res) => {
|
|
16
|
+
const url = new URL(req.url ?? '/', `http://localhost:${port}`);
|
|
17
|
+
// CORS
|
|
18
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
19
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS');
|
|
20
|
+
if (req.method === 'OPTIONS') {
|
|
21
|
+
res.writeHead(204);
|
|
22
|
+
res.end();
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (url.pathname === '/events') {
|
|
26
|
+
// SSE endpoint
|
|
27
|
+
res.writeHead(200, {
|
|
28
|
+
'Content-Type': 'text/event-stream',
|
|
29
|
+
'Cache-Control': 'no-cache',
|
|
30
|
+
'Connection': 'keep-alive',
|
|
31
|
+
});
|
|
32
|
+
res.write('data: {"type":"connected"}\n\n');
|
|
33
|
+
this.clients.add(res);
|
|
34
|
+
req.on('close', () => this.clients.delete(res));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (url.pathname === '/api/stats') {
|
|
38
|
+
const stats = getStats();
|
|
39
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
40
|
+
res.end(JSON.stringify(stats));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (url.pathname === '/' || url.pathname === '/dashboard') {
|
|
44
|
+
const html = getDashboardHtml();
|
|
45
|
+
// Inject SSE script into the dashboard
|
|
46
|
+
const sseScript = `
|
|
47
|
+
<script>
|
|
48
|
+
(function(){
|
|
49
|
+
const evtSource = new EventSource('/events');
|
|
50
|
+
evtSource.onmessage = function(e) {
|
|
51
|
+
try {
|
|
52
|
+
const data = JSON.parse(e.data);
|
|
53
|
+
if (data.type === 'stats_update') {
|
|
54
|
+
// Update stat cards
|
|
55
|
+
document.querySelectorAll('.stat-number').forEach(el => {
|
|
56
|
+
const key = el.parentElement?.querySelector('.stat-label')?.textContent?.toLowerCase();
|
|
57
|
+
if (key && data.stats[key] !== undefined) {
|
|
58
|
+
el.textContent = Number(data.stats[key]).toLocaleString();
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
if (data.type === 'event') {
|
|
63
|
+
// Flash the activity dot
|
|
64
|
+
const dot = document.querySelector('.activity-dot');
|
|
65
|
+
if (dot) { dot.style.background = '#ff5577'; setTimeout(() => dot.style.background = '', 500); }
|
|
66
|
+
}
|
|
67
|
+
} catch {}
|
|
68
|
+
};
|
|
69
|
+
evtSource.onerror = function() { setTimeout(() => location.reload(), 5000); };
|
|
70
|
+
})();
|
|
71
|
+
</script>`;
|
|
72
|
+
const liveHtml = html.replace('</body>', sseScript + '</body>');
|
|
73
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
74
|
+
res.end(liveHtml);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
78
|
+
res.end('Not Found');
|
|
79
|
+
});
|
|
80
|
+
// Forward Brain events to SSE clients
|
|
81
|
+
const eventNames = [
|
|
82
|
+
'error:reported', 'error:resolved', 'solution:applied',
|
|
83
|
+
'solution:created', 'module:registered', 'module:updated',
|
|
84
|
+
'synapse:created', 'synapse:strengthened',
|
|
85
|
+
'insight:created', 'rule:learned',
|
|
86
|
+
];
|
|
87
|
+
for (const eventName of eventNames) {
|
|
88
|
+
bus.on(eventName, (data) => {
|
|
89
|
+
this.broadcast({ type: 'event', event: eventName, data });
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// Periodic stats broadcast (every 30s)
|
|
93
|
+
setInterval(() => {
|
|
94
|
+
if (this.clients.size > 0) {
|
|
95
|
+
const stats = getStats();
|
|
96
|
+
this.broadcast({ type: 'stats_update', stats });
|
|
97
|
+
}
|
|
98
|
+
}, 30_000);
|
|
99
|
+
this.server.listen(port, () => {
|
|
100
|
+
this.logger.info(`Dashboard server started on http://localhost:${port}`);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
stop() {
|
|
104
|
+
for (const client of this.clients) {
|
|
105
|
+
client.end();
|
|
106
|
+
}
|
|
107
|
+
this.clients.clear();
|
|
108
|
+
this.server?.close();
|
|
109
|
+
this.server = null;
|
|
110
|
+
this.logger.info('Dashboard server stopped');
|
|
111
|
+
}
|
|
112
|
+
broadcast(data) {
|
|
113
|
+
const msg = `data: ${JSON.stringify(data)}\n\n`;
|
|
114
|
+
for (const client of this.clients) {
|
|
115
|
+
try {
|
|
116
|
+
client.write(msg);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
this.clients.delete(client);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function up(db) {
|
|
2
|
+
db.exec(`
|
|
3
|
+
ALTER TABLE insights ADD COLUMN rating INTEGER DEFAULT NULL;
|
|
4
|
+
ALTER TABLE insights ADD COLUMN rating_comment TEXT DEFAULT NULL;
|
|
5
|
+
ALTER TABLE insights ADD COLUMN rated_at TEXT DEFAULT NULL;
|
|
6
|
+
|
|
7
|
+
ALTER TABLE rules ADD COLUMN rating INTEGER DEFAULT NULL;
|
|
8
|
+
ALTER TABLE rules ADD COLUMN rating_comment TEXT DEFAULT NULL;
|
|
9
|
+
ALTER TABLE rules ADD COLUMN rated_at TEXT DEFAULT NULL;
|
|
10
|
+
`);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=007_feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"007_feedback.js","sourceRoot":"","sources":["../../../src/db/migrations/007_feedback.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,EAAE,CAAC,EAAqB;IACtC,EAAE,CAAC,IAAI,CAAC;;;;;;;;GAQP,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export function up(db) {
|
|
2
|
+
db.exec(`
|
|
3
|
+
CREATE TABLE IF NOT EXISTS git_commits (
|
|
4
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
5
|
+
project_id INTEGER NOT NULL,
|
|
6
|
+
commit_hash TEXT NOT NULL,
|
|
7
|
+
message TEXT NOT NULL,
|
|
8
|
+
author TEXT,
|
|
9
|
+
timestamp TEXT NOT NULL,
|
|
10
|
+
files_changed INTEGER NOT NULL DEFAULT 0,
|
|
11
|
+
insertions INTEGER NOT NULL DEFAULT 0,
|
|
12
|
+
deletions INTEGER NOT NULL DEFAULT 0,
|
|
13
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
14
|
+
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
|
15
|
+
UNIQUE(project_id, commit_hash)
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
CREATE TABLE IF NOT EXISTS error_commits (
|
|
19
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
20
|
+
error_id INTEGER NOT NULL,
|
|
21
|
+
commit_hash TEXT NOT NULL,
|
|
22
|
+
relationship TEXT NOT NULL DEFAULT 'introduced_by',
|
|
23
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
24
|
+
FOREIGN KEY (error_id) REFERENCES errors(id) ON DELETE CASCADE,
|
|
25
|
+
UNIQUE(error_id, commit_hash, relationship)
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
ALTER TABLE errors ADD COLUMN git_diff TEXT DEFAULT NULL;
|
|
29
|
+
ALTER TABLE errors ADD COLUMN git_branch TEXT DEFAULT NULL;
|
|
30
|
+
|
|
31
|
+
CREATE INDEX IF NOT EXISTS idx_git_commits_project ON git_commits(project_id);
|
|
32
|
+
CREATE INDEX IF NOT EXISTS idx_git_commits_hash ON git_commits(commit_hash);
|
|
33
|
+
CREATE INDEX IF NOT EXISTS idx_error_commits_error ON error_commits(error_id);
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_error_commits_hash ON error_commits(commit_hash);
|
|
35
|
+
`);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=008_git_integration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"008_git_integration.js","sourceRoot":"","sources":["../../../src/db/migrations/008_git_integration.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,EAAE,CAAC,EAAqB;IACtC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCP,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"009_embeddings.js","sourceRoot":"","sources":["../../../src/db/migrations/009_embeddings.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,EAAE,CAAC,EAAqB;IACtC,EAAE,CAAC,IAAI,CAAC;;;GAGP,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -5,6 +5,9 @@ import { up as codeSchema } from './003_code_schema.js';
|
|
|
5
5
|
import { up as synapsesSchema } from './004_synapses_schema.js';
|
|
6
6
|
import { up as ftsIndexes } from './005_fts_indexes.js';
|
|
7
7
|
import { up as synapsesPhase3 } from './006_synapses_phase3.js';
|
|
8
|
+
import { up as feedbackSchema } from './007_feedback.js';
|
|
9
|
+
import { up as gitIntegration } from './008_git_integration.js';
|
|
10
|
+
import { up as embeddings } from './009_embeddings.js';
|
|
8
11
|
const migrations = [
|
|
9
12
|
{ version: 1, name: '001_core_schema', up: coreSchema },
|
|
10
13
|
{ version: 2, name: '002_learning_schema', up: learningSchema },
|
|
@@ -12,6 +15,9 @@ const migrations = [
|
|
|
12
15
|
{ version: 4, name: '004_synapses_schema', up: synapsesSchema },
|
|
13
16
|
{ version: 5, name: '005_fts_indexes', up: ftsIndexes },
|
|
14
17
|
{ version: 6, name: '006_synapses_phase3', up: synapsesPhase3 },
|
|
18
|
+
{ version: 7, name: '007_feedback', up: feedbackSchema },
|
|
19
|
+
{ version: 8, name: '008_git_integration', up: gitIntegration },
|
|
20
|
+
{ version: 9, name: '009_embeddings', up: embeddings },
|
|
15
21
|
];
|
|
16
22
|
function ensureMigrationsTable(db) {
|
|
17
23
|
db.exec(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/migrations/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/migrations/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,5 +16,21 @@ export declare class CodeModuleRepository {
|
|
|
16
16
|
search(query: string): CodeModuleRecord[];
|
|
17
17
|
findAll(limit?: number): CodeModuleRecord[];
|
|
18
18
|
countAll(): number;
|
|
19
|
+
upsertSimilarity(moduleAId: number, moduleBId: number, score: number): void;
|
|
20
|
+
findSimilarModules(moduleId: number, limit?: number): Array<{
|
|
21
|
+
module_id: number;
|
|
22
|
+
similarity_score: number;
|
|
23
|
+
name: string;
|
|
24
|
+
file_path: string;
|
|
25
|
+
}>;
|
|
26
|
+
findHighSimilarityPairs(minScore?: number, limit?: number): Array<{
|
|
27
|
+
module_a_id: number;
|
|
28
|
+
module_b_id: number;
|
|
29
|
+
similarity_score: number;
|
|
30
|
+
a_name: string;
|
|
31
|
+
a_path: string;
|
|
32
|
+
b_name: string;
|
|
33
|
+
b_path: string;
|
|
34
|
+
}>;
|
|
19
35
|
}
|
|
20
36
|
export {};
|
|
@@ -19,6 +19,33 @@ export class CodeModuleRepository {
|
|
|
19
19
|
JOIN code_modules_fts fts ON cm.id = fts.rowid
|
|
20
20
|
WHERE code_modules_fts MATCH ?
|
|
21
21
|
ORDER BY rank
|
|
22
|
+
`),
|
|
23
|
+
upsertSimilarity: db.prepare(`
|
|
24
|
+
INSERT INTO module_similarities (module_a_id, module_b_id, similarity_score)
|
|
25
|
+
VALUES (@module_a_id, @module_b_id, @similarity_score)
|
|
26
|
+
ON CONFLICT(module_a_id, module_b_id)
|
|
27
|
+
DO UPDATE SET similarity_score = @similarity_score, computed_at = datetime('now')
|
|
28
|
+
`),
|
|
29
|
+
findSimilarModules: db.prepare(`
|
|
30
|
+
SELECT ms.*, cm.name, cm.file_path, cm.language, cm.reusability_score
|
|
31
|
+
FROM module_similarities ms
|
|
32
|
+
JOIN code_modules cm ON (
|
|
33
|
+
CASE WHEN ms.module_a_id = ? THEN ms.module_b_id ELSE ms.module_a_id END
|
|
34
|
+
) = cm.id
|
|
35
|
+
WHERE ms.module_a_id = ? OR ms.module_b_id = ?
|
|
36
|
+
ORDER BY ms.similarity_score DESC
|
|
37
|
+
LIMIT ?
|
|
38
|
+
`),
|
|
39
|
+
findHighSimilarityPairs: db.prepare(`
|
|
40
|
+
SELECT ms.*,
|
|
41
|
+
a.name as a_name, a.file_path as a_path,
|
|
42
|
+
b.name as b_name, b.file_path as b_path
|
|
43
|
+
FROM module_similarities ms
|
|
44
|
+
JOIN code_modules a ON ms.module_a_id = a.id
|
|
45
|
+
JOIN code_modules b ON ms.module_b_id = b.id
|
|
46
|
+
WHERE ms.similarity_score >= ?
|
|
47
|
+
ORDER BY ms.similarity_score DESC
|
|
48
|
+
LIMIT ?
|
|
22
49
|
`),
|
|
23
50
|
};
|
|
24
51
|
}
|
|
@@ -68,5 +95,20 @@ export class CodeModuleRepository {
|
|
|
68
95
|
countAll() {
|
|
69
96
|
return this.stmts.countAll.get().count;
|
|
70
97
|
}
|
|
98
|
+
upsertSimilarity(moduleAId, moduleBId, score) {
|
|
99
|
+
// Always store with smaller id first for consistency
|
|
100
|
+
const [a, b] = moduleAId < moduleBId ? [moduleAId, moduleBId] : [moduleBId, moduleAId];
|
|
101
|
+
this.stmts.upsertSimilarity.run({
|
|
102
|
+
module_a_id: a,
|
|
103
|
+
module_b_id: b,
|
|
104
|
+
similarity_score: score,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
findSimilarModules(moduleId, limit = 10) {
|
|
108
|
+
return this.stmts.findSimilarModules.all(moduleId, moduleId, moduleId, limit);
|
|
109
|
+
}
|
|
110
|
+
findHighSimilarityPairs(minScore = 0.75, limit = 50) {
|
|
111
|
+
return this.stmts.findHighSimilarityPairs.all(minScore, limit);
|
|
112
|
+
}
|
|
71
113
|
}
|
|
72
114
|
//# sourceMappingURL=code-module.repository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-module.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/code-module.repository.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"code-module.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/code-module.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,5 +16,10 @@ export declare class ErrorRepository {
|
|
|
16
16
|
countSince(since: string, projectId?: number): number;
|
|
17
17
|
search(query: string): ErrorRecord[];
|
|
18
18
|
incrementOccurrence(id: number): void;
|
|
19
|
+
createChain(parentErrorId: number, childErrorId: number, relationship?: string): void;
|
|
20
|
+
findChainChildren(errorId: number): ErrorRecord[];
|
|
21
|
+
findChainParents(errorId: number): ErrorRecord[];
|
|
22
|
+
findRecentByProject(projectId: number, since: string, limit?: number): ErrorRecord[];
|
|
23
|
+
findAll(limit?: number, offset?: number): ErrorRecord[];
|
|
19
24
|
}
|
|
20
25
|
export {};
|
|
@@ -8,6 +8,14 @@ export class ErrorRepository {
|
|
|
8
8
|
INSERT INTO errors (project_id, terminal_id, fingerprint, type, message, raw_output, context, file_path, line_number, column_number)
|
|
9
9
|
VALUES (@project_id, @terminal_id, @fingerprint, @type, @message, @raw_output, @context, @file_path, @line_number, @column_number)
|
|
10
10
|
`),
|
|
11
|
+
createChain: this.db.prepare(`
|
|
12
|
+
INSERT OR IGNORE INTO error_chains (parent_error_id, child_error_id, relationship)
|
|
13
|
+
VALUES (@parent_error_id, @child_error_id, @relationship)
|
|
14
|
+
`),
|
|
15
|
+
findChainChildren: this.db.prepare('SELECT e.* FROM errors e JOIN error_chains ec ON e.id = ec.child_error_id WHERE ec.parent_error_id = ?'),
|
|
16
|
+
findChainParents: this.db.prepare('SELECT e.* FROM errors e JOIN error_chains ec ON e.id = ec.parent_error_id WHERE ec.child_error_id = ?'),
|
|
17
|
+
findRecentByProject: this.db.prepare('SELECT * FROM errors WHERE project_id = ? AND first_seen >= ? ORDER BY first_seen DESC LIMIT ?'),
|
|
18
|
+
findAllPaginated: this.db.prepare('SELECT * FROM errors ORDER BY last_seen DESC LIMIT ? OFFSET ?'),
|
|
11
19
|
getById: this.db.prepare(`
|
|
12
20
|
SELECT * FROM errors WHERE id = ?
|
|
13
21
|
`),
|
|
@@ -130,5 +138,24 @@ export class ErrorRepository {
|
|
|
130
138
|
incrementOccurrence(id) {
|
|
131
139
|
this.stmts.incrementOccurrence.run(id);
|
|
132
140
|
}
|
|
141
|
+
createChain(parentErrorId, childErrorId, relationship = 'caused_by_fix') {
|
|
142
|
+
this.stmts.createChain.run({
|
|
143
|
+
parent_error_id: parentErrorId,
|
|
144
|
+
child_error_id: childErrorId,
|
|
145
|
+
relationship,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
findChainChildren(errorId) {
|
|
149
|
+
return this.stmts.findChainChildren.all(errorId);
|
|
150
|
+
}
|
|
151
|
+
findChainParents(errorId) {
|
|
152
|
+
return this.stmts.findChainParents.all(errorId);
|
|
153
|
+
}
|
|
154
|
+
findRecentByProject(projectId, since, limit = 10) {
|
|
155
|
+
return this.stmts.findRecentByProject.all(projectId, since, limit);
|
|
156
|
+
}
|
|
157
|
+
findAll(limit = 100, offset = 0) {
|
|
158
|
+
return this.stmts.findAllPaginated.all(limit, offset);
|
|
159
|
+
}
|
|
133
160
|
}
|
|
134
161
|
//# sourceMappingURL=error.repository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/error.repository.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"error.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/error.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,5 +14,7 @@ export declare class InsightRepository {
|
|
|
14
14
|
findByType(type: string): InsightRecord[];
|
|
15
15
|
findByPriority(minPriority: number): InsightRecord[];
|
|
16
16
|
expire(): number;
|
|
17
|
+
rate(id: number, rating: number, comment?: string): boolean;
|
|
18
|
+
findRated(minRating?: number): InsightRecord[];
|
|
17
19
|
}
|
|
18
20
|
export {};
|
|
@@ -53,5 +53,18 @@ export class InsightRepository {
|
|
|
53
53
|
const result = this.stmts.expire.run();
|
|
54
54
|
return result.changes;
|
|
55
55
|
}
|
|
56
|
+
rate(id, rating, comment) {
|
|
57
|
+
const stmt = this.db.prepare(`UPDATE insights SET rating = ?, rating_comment = ?, rated_at = datetime('now') WHERE id = ?`);
|
|
58
|
+
const result = stmt.run(rating, comment ?? null, id);
|
|
59
|
+
return result.changes > 0;
|
|
60
|
+
}
|
|
61
|
+
findRated(minRating) {
|
|
62
|
+
if (minRating !== undefined) {
|
|
63
|
+
const stmt = this.db.prepare('SELECT * FROM insights WHERE rating IS NOT NULL AND rating >= ? ORDER BY rating DESC');
|
|
64
|
+
return stmt.all(minRating);
|
|
65
|
+
}
|
|
66
|
+
const stmt = this.db.prepare('SELECT * FROM insights WHERE rating IS NOT NULL ORDER BY rating DESC');
|
|
67
|
+
return stmt.all();
|
|
68
|
+
}
|
|
56
69
|
}
|
|
57
70
|
//# sourceMappingURL=insight.repository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insight.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/insight.repository.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,iBAAiB;IAGR;IAFZ,KAAK,CAA4B;IAEzC,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;QACvC,IAAI,CAAC,KAAK,GAAG;YACX,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC;;;OAGlB,CAAC;YACF,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC;YAC1D,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC;YACvD,aAAa,EAAE,EAAE,CAAC,OAAO,CACvB,iFAAiF,CAClF;YACD,mBAAmB,EAAE,EAAE,CAAC,OAAO,CAC7B,oGAAoG,CACrG;YACD,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,8DAA8D,CAAC;YACtF,cAAc,EAAE,EAAE,CAAC,OAAO,CACxB,oFAAoF,CACrF;YACD,MAAM,EAAE,EAAE,CAAC,OAAO,CAChB,6GAA6G,CAC9G;SACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAAmB;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC,eAAyB,CAAC;IAC1C,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAA8B,CAAC;IACjE,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,IAAmB;QACpC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAE,IAAgC,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC;QACvG,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEtC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,OAAO,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uBAAuB,UAAU,iBAAiB,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,EAAU;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,UAAU,CAAC,SAAkB;QAC3B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAoB,CAAC;QAC1E,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,EAAqB,CAAC;IAC3D,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAoB,CAAC;IAC5D,CAAC;IAED,cAAc,CAAC,WAAmB;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAoB,CAAC;IACvE,CAAC;IAED,MAAM;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"insight.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/insight.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
export interface EmbeddingConfig {
|
|
3
|
+
enabled: boolean;
|
|
4
|
+
modelName: string;
|
|
5
|
+
cacheDir: string;
|
|
6
|
+
sweepIntervalMs: number;
|
|
7
|
+
batchSize: number;
|
|
8
|
+
}
|
|
9
|
+
export declare class EmbeddingEngine {
|
|
10
|
+
private config;
|
|
11
|
+
private db;
|
|
12
|
+
private pipeline;
|
|
13
|
+
private ready;
|
|
14
|
+
private loading;
|
|
15
|
+
private logger;
|
|
16
|
+
private sweepTimer;
|
|
17
|
+
constructor(config: EmbeddingConfig, db: Database.Database);
|
|
18
|
+
initialize(): Promise<void>;
|
|
19
|
+
/** Start background embedding sweep */
|
|
20
|
+
start(): void;
|
|
21
|
+
stop(): void;
|
|
22
|
+
isReady(): boolean;
|
|
23
|
+
/** Generate embedding for a single text */
|
|
24
|
+
embed(text: string): Promise<Float32Array | null>;
|
|
25
|
+
/** Generate embeddings for a batch of texts */
|
|
26
|
+
embedBatch(texts: string[]): Promise<(Float32Array | null)[]>;
|
|
27
|
+
/** Compute and store embeddings for entries that don't have them yet */
|
|
28
|
+
sweep(): Promise<{
|
|
29
|
+
errors: number;
|
|
30
|
+
modules: number;
|
|
31
|
+
}>;
|
|
32
|
+
/** Load vector scores for error matching (sync - reads pre-computed embeddings from DB) */
|
|
33
|
+
computeErrorVectorScores(errorId: number, projectId: number): Map<number, number>;
|
|
34
|
+
/** Load vector scores for code module matching (sync) */
|
|
35
|
+
computeModuleVectorScores(query: string, language?: string): Map<number, number>;
|
|
36
|
+
/** Serialize Float32Array to Buffer for SQLite BLOB storage */
|
|
37
|
+
static serialize(embedding: Float32Array): Buffer;
|
|
38
|
+
/** Deserialize SQLite BLOB to Float32Array */
|
|
39
|
+
static deserialize(buffer: Buffer): Float32Array;
|
|
40
|
+
/** Cosine similarity (embeddings are L2-normalized, so dot product = cosine) */
|
|
41
|
+
static similarity(a: Float32Array, b: Float32Array): number;
|
|
42
|
+
}
|