@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.
Files changed (139) hide show
  1. package/README.md +225 -50
  2. package/dist/api/server.d.ts +19 -0
  3. package/dist/api/server.js +281 -0
  4. package/dist/api/server.js.map +1 -0
  5. package/dist/brain.d.ts +3 -0
  6. package/dist/brain.js +45 -8
  7. package/dist/brain.js.map +1 -1
  8. package/dist/cli/commands/dashboard.js +2 -0
  9. package/dist/cli/commands/dashboard.js.map +1 -1
  10. package/dist/cli/commands/doctor.d.ts +2 -0
  11. package/dist/cli/commands/doctor.js +118 -0
  12. package/dist/cli/commands/doctor.js.map +1 -0
  13. package/dist/cli/commands/explain.d.ts +2 -0
  14. package/dist/cli/commands/explain.js +76 -0
  15. package/dist/cli/commands/explain.js.map +1 -0
  16. package/dist/cli/commands/projects.d.ts +2 -0
  17. package/dist/cli/commands/projects.js +36 -0
  18. package/dist/cli/commands/projects.js.map +1 -0
  19. package/dist/code/analyzer.d.ts +6 -0
  20. package/dist/code/analyzer.js +35 -0
  21. package/dist/code/analyzer.js.map +1 -1
  22. package/dist/code/matcher.d.ts +11 -1
  23. package/dist/code/matcher.js +49 -0
  24. package/dist/code/matcher.js.map +1 -1
  25. package/dist/code/scorer.d.ts +1 -0
  26. package/dist/code/scorer.js +15 -1
  27. package/dist/code/scorer.js.map +1 -1
  28. package/dist/config.js +31 -0
  29. package/dist/config.js.map +1 -1
  30. package/dist/dashboard/server.d.ts +15 -0
  31. package/dist/dashboard/server.js +124 -0
  32. package/dist/dashboard/server.js.map +1 -0
  33. package/dist/db/migrations/007_feedback.d.ts +2 -0
  34. package/dist/db/migrations/007_feedback.js +12 -0
  35. package/dist/db/migrations/007_feedback.js.map +1 -0
  36. package/dist/db/migrations/008_git_integration.d.ts +2 -0
  37. package/dist/db/migrations/008_git_integration.js +37 -0
  38. package/dist/db/migrations/008_git_integration.js.map +1 -0
  39. package/dist/db/migrations/009_embeddings.d.ts +2 -0
  40. package/dist/db/migrations/009_embeddings.js +7 -0
  41. package/dist/db/migrations/009_embeddings.js.map +1 -0
  42. package/dist/db/migrations/index.js +6 -0
  43. package/dist/db/migrations/index.js.map +1 -1
  44. package/dist/db/repositories/code-module.repository.d.ts +16 -0
  45. package/dist/db/repositories/code-module.repository.js +42 -0
  46. package/dist/db/repositories/code-module.repository.js.map +1 -1
  47. package/dist/db/repositories/error.repository.d.ts +5 -0
  48. package/dist/db/repositories/error.repository.js +27 -0
  49. package/dist/db/repositories/error.repository.js.map +1 -1
  50. package/dist/db/repositories/insight.repository.d.ts +2 -0
  51. package/dist/db/repositories/insight.repository.js +13 -0
  52. package/dist/db/repositories/insight.repository.js.map +1 -1
  53. package/dist/embeddings/engine.d.ts +42 -0
  54. package/dist/embeddings/engine.js +166 -0
  55. package/dist/embeddings/engine.js.map +1 -0
  56. package/dist/hooks/post-tool-use.js +2 -0
  57. package/dist/hooks/post-tool-use.js.map +1 -1
  58. package/dist/hooks/post-write.js +11 -0
  59. package/dist/hooks/post-write.js.map +1 -1
  60. package/dist/index.js +7 -1
  61. package/dist/index.js.map +1 -1
  62. package/dist/ipc/router.d.ts +2 -0
  63. package/dist/ipc/router.js +15 -0
  64. package/dist/ipc/router.js.map +1 -1
  65. package/dist/learning/confidence-scorer.d.ts +16 -0
  66. package/dist/learning/confidence-scorer.js +20 -0
  67. package/dist/learning/confidence-scorer.js.map +1 -1
  68. package/dist/learning/learning-engine.js +12 -5
  69. package/dist/learning/learning-engine.js.map +1 -1
  70. package/dist/matching/error-matcher.d.ts +9 -1
  71. package/dist/matching/error-matcher.js +50 -5
  72. package/dist/matching/error-matcher.js.map +1 -1
  73. package/dist/mcp/http-server.d.ts +14 -0
  74. package/dist/mcp/http-server.js +117 -0
  75. package/dist/mcp/http-server.js.map +1 -0
  76. package/dist/mcp/tools.d.ts +4 -0
  77. package/dist/mcp/tools.js +41 -14
  78. package/dist/mcp/tools.js.map +1 -1
  79. package/dist/services/analytics.service.d.ts +39 -0
  80. package/dist/services/analytics.service.js +111 -0
  81. package/dist/services/analytics.service.js.map +1 -1
  82. package/dist/services/code.service.d.ts +10 -0
  83. package/dist/services/code.service.js +73 -4
  84. package/dist/services/code.service.js.map +1 -1
  85. package/dist/services/error.service.d.ts +17 -1
  86. package/dist/services/error.service.js +90 -12
  87. package/dist/services/error.service.js.map +1 -1
  88. package/dist/services/git.service.d.ts +49 -0
  89. package/dist/services/git.service.js +112 -0
  90. package/dist/services/git.service.js.map +1 -0
  91. package/dist/services/prevention.service.d.ts +7 -0
  92. package/dist/services/prevention.service.js +38 -0
  93. package/dist/services/prevention.service.js.map +1 -1
  94. package/dist/services/research.service.d.ts +1 -0
  95. package/dist/services/research.service.js +4 -0
  96. package/dist/services/research.service.js.map +1 -1
  97. package/dist/services/solution.service.d.ts +10 -0
  98. package/dist/services/solution.service.js +48 -0
  99. package/dist/services/solution.service.js.map +1 -1
  100. package/dist/types/config.types.d.ts +21 -0
  101. package/dist/types/synapse.types.d.ts +1 -1
  102. package/package.json +8 -3
  103. package/src/api/server.ts +321 -0
  104. package/src/brain.ts +50 -8
  105. package/src/cli/commands/dashboard.ts +2 -0
  106. package/src/cli/commands/doctor.ts +118 -0
  107. package/src/cli/commands/explain.ts +83 -0
  108. package/src/cli/commands/projects.ts +42 -0
  109. package/src/code/analyzer.ts +40 -0
  110. package/src/code/matcher.ts +67 -2
  111. package/src/code/scorer.ts +13 -1
  112. package/src/config.ts +24 -0
  113. package/src/dashboard/server.ts +142 -0
  114. package/src/db/migrations/007_feedback.ts +13 -0
  115. package/src/db/migrations/008_git_integration.ts +38 -0
  116. package/src/db/migrations/009_embeddings.ts +8 -0
  117. package/src/db/migrations/index.ts +6 -0
  118. package/src/db/repositories/code-module.repository.ts +53 -0
  119. package/src/db/repositories/error.repository.ts +40 -0
  120. package/src/db/repositories/insight.repository.ts +21 -0
  121. package/src/embeddings/engine.ts +217 -0
  122. package/src/hooks/post-tool-use.ts +2 -0
  123. package/src/hooks/post-write.ts +12 -0
  124. package/src/index.ts +7 -1
  125. package/src/ipc/router.ts +19 -0
  126. package/src/learning/confidence-scorer.ts +33 -0
  127. package/src/learning/learning-engine.ts +13 -5
  128. package/src/matching/error-matcher.ts +55 -4
  129. package/src/mcp/http-server.ts +137 -0
  130. package/src/mcp/tools.ts +52 -14
  131. package/src/services/analytics.service.ts +136 -0
  132. package/src/services/code.service.ts +99 -4
  133. package/src/services/error.service.ts +114 -13
  134. package/src/services/git.service.ts +132 -0
  135. package/src/services/prevention.service.ts +40 -0
  136. package/src/services/research.service.ts +5 -0
  137. package/src/services/solution.service.ts +58 -0
  138. package/src/types/config.types.ts +24 -0
  139. 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,2 @@
1
+ import type Database from 'better-sqlite3';
2
+ export declare function up(db: Database.Database): void;
@@ -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,2 @@
1
+ import type Database from 'better-sqlite3';
2
+ export declare function up(db: Database.Database): void;
@@ -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,2 @@
1
+ import type Database from 'better-sqlite3';
2
+ export declare function up(db: Database.Database): void;
@@ -0,0 +1,7 @@
1
+ export function up(db) {
2
+ db.exec(`
3
+ ALTER TABLE errors ADD COLUMN embedding BLOB DEFAULT NULL;
4
+ ALTER TABLE code_modules ADD COLUMN embedding BLOB DEFAULT NULL;
5
+ `);
6
+ }
7
+ //# sourceMappingURL=009_embeddings.js.map
@@ -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;AAQhE,MAAM,UAAU,GAAgB;IAC9B,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,UAAU,EAAE;IACvD,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,cAAc,EAAE;IAC/D,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,UAAU,EAAE;IACvD,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,cAAc,EAAE;IAC/D,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,UAAU,EAAE;IACvD,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,cAAc,EAAE;CAChE,CAAC;AAEF,SAAS,qBAAqB,CAAC,EAAqB;IAClD,EAAE,CAAC,IAAI,CAAC;;;;;;GAMP,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAqB;IAC9C,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,EAA4C,CAAC;IACzH,OAAO,GAAG,EAAE,OAAO,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAqB;IACjD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAE1B,MAAM,cAAc,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,cAAc,CAAC,CAAC;IAEnE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,MAAM,8BAA8B,cAAc,EAAE,CAAC,CAAC;IAErF,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QACjC,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,sBAAsB,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YACpD,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACjB,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC;IACT,MAAM,CAAC,IAAI,CAAC,uCAAuC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,OAAO,EAAE,CAAC,CAAC;AAC7F,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
+ }