@timmeck/brain 1.9.0 → 2.1.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 (253) hide show
  1. package/README.md +33 -0
  2. package/brain.log +3876 -0
  3. package/{src/cli/commands/dashboard.ts → dashboard.html} +694 -807
  4. package/dist/api/server.d.ts +4 -18
  5. package/dist/api/server.js +4 -173
  6. package/dist/api/server.js.map +1 -1
  7. package/dist/brain.d.ts +2 -0
  8. package/dist/brain.js +15 -4
  9. package/dist/brain.js.map +1 -1
  10. package/dist/cli/colors.d.ts +4 -25
  11. package/dist/cli/colors.js +3 -89
  12. package/dist/cli/colors.js.map +1 -1
  13. package/dist/cli/commands/dashboard.js +21 -2
  14. package/dist/cli/commands/dashboard.js.map +1 -1
  15. package/dist/cli/commands/peers.d.ts +2 -0
  16. package/dist/cli/commands/peers.js +38 -0
  17. package/dist/cli/commands/peers.js.map +1 -0
  18. package/dist/cli/commands/status.js +0 -1
  19. package/dist/cli/commands/status.js.map +1 -1
  20. package/dist/config.js +2 -29
  21. package/dist/config.js.map +1 -1
  22. package/dist/db/connection.d.ts +1 -2
  23. package/dist/db/connection.js +1 -18
  24. package/dist/db/connection.js.map +1 -1
  25. package/dist/index.js +3 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/ipc/__tests__/protocol.test.d.ts +1 -0
  28. package/dist/ipc/__tests__/protocol.test.js +117 -0
  29. package/dist/ipc/__tests__/protocol.test.js.map +1 -0
  30. package/dist/ipc/client.d.ts +1 -16
  31. package/dist/ipc/client.js +1 -100
  32. package/dist/ipc/client.js.map +1 -1
  33. package/dist/ipc/protocol.d.ts +1 -8
  34. package/dist/ipc/protocol.js +1 -28
  35. package/dist/ipc/protocol.js.map +1 -1
  36. package/dist/ipc/router.d.ts +2 -0
  37. package/dist/ipc/router.js +30 -0
  38. package/dist/ipc/router.js.map +1 -1
  39. package/dist/ipc/server.d.ts +1 -22
  40. package/dist/ipc/server.js +1 -163
  41. package/dist/ipc/server.js.map +1 -1
  42. package/dist/learning/confidence-scorer.d.ts +2 -5
  43. package/dist/learning/confidence-scorer.js +4 -19
  44. package/dist/learning/confidence-scorer.js.map +1 -1
  45. package/dist/learning/decay.js +2 -3
  46. package/dist/learning/decay.js.map +1 -1
  47. package/dist/learning/learning-engine.d.ts +2 -5
  48. package/dist/learning/learning-engine.js +3 -15
  49. package/dist/learning/learning-engine.js.map +1 -1
  50. package/dist/mcp/http-server.d.ts +1 -7
  51. package/dist/mcp/http-server.js +6 -117
  52. package/dist/mcp/http-server.js.map +1 -1
  53. package/dist/mcp/server.js +5 -61
  54. package/dist/mcp/server.js.map +1 -1
  55. package/dist/mcp/tools.js +36 -0
  56. package/dist/mcp/tools.js.map +1 -1
  57. package/dist/parsing/parsers/compiler.js +1 -1
  58. package/dist/parsing/parsers/compiler.js.map +1 -1
  59. package/dist/research/research-engine.d.ts +2 -6
  60. package/dist/research/research-engine.js +3 -23
  61. package/dist/research/research-engine.js.map +1 -1
  62. package/dist/services/synapse.service.d.ts +3 -3
  63. package/dist/signals/__tests__/fingerprint.test.d.ts +1 -0
  64. package/dist/signals/__tests__/fingerprint.test.js +118 -0
  65. package/dist/signals/__tests__/fingerprint.test.js.map +1 -0
  66. package/dist/synapses/activation.d.ts +3 -13
  67. package/dist/synapses/activation.js +2 -49
  68. package/dist/synapses/activation.js.map +1 -1
  69. package/dist/synapses/decay.d.ts +2 -11
  70. package/dist/synapses/decay.js +2 -26
  71. package/dist/synapses/decay.js.map +1 -1
  72. package/dist/synapses/hebbian.d.ts +2 -13
  73. package/dist/synapses/hebbian.js +2 -35
  74. package/dist/synapses/hebbian.js.map +1 -1
  75. package/dist/synapses/pathfinder.d.ts +2 -14
  76. package/dist/synapses/pathfinder.js +2 -49
  77. package/dist/synapses/pathfinder.js.map +1 -1
  78. package/dist/synapses/synapse-manager.d.ts +7 -23
  79. package/dist/synapses/synapse-manager.js +6 -63
  80. package/dist/synapses/synapse-manager.js.map +1 -1
  81. package/dist/types/ipc.types.d.ts +1 -11
  82. package/dist/utils/__tests__/hash.test.d.ts +1 -0
  83. package/dist/utils/__tests__/hash.test.js +32 -0
  84. package/dist/utils/__tests__/hash.test.js.map +1 -0
  85. package/dist/utils/__tests__/paths.test.d.ts +1 -0
  86. package/dist/utils/__tests__/paths.test.js +75 -0
  87. package/dist/utils/__tests__/paths.test.js.map +1 -0
  88. package/dist/utils/events.d.ts +4 -8
  89. package/dist/utils/events.js +2 -14
  90. package/dist/utils/events.js.map +1 -1
  91. package/dist/utils/hash.d.ts +1 -1
  92. package/dist/utils/hash.js +1 -4
  93. package/dist/utils/hash.js.map +1 -1
  94. package/dist/utils/logger.d.ts +3 -2
  95. package/dist/utils/logger.js +8 -35
  96. package/dist/utils/logger.js.map +1 -1
  97. package/dist/utils/paths.d.ts +2 -1
  98. package/dist/utils/paths.js +4 -13
  99. package/dist/utils/paths.js.map +1 -1
  100. package/eslint.config.js +14 -0
  101. package/package.json +56 -49
  102. package/BRAIN_PLAN.md +0 -3324
  103. package/reddit_post.md +0 -45
  104. package/src/api/server.ts +0 -395
  105. package/src/brain.ts +0 -313
  106. package/src/cli/colors.ts +0 -116
  107. package/src/cli/commands/config.ts +0 -169
  108. package/src/cli/commands/doctor.ts +0 -124
  109. package/src/cli/commands/explain.ts +0 -83
  110. package/src/cli/commands/export.ts +0 -31
  111. package/src/cli/commands/import.ts +0 -199
  112. package/src/cli/commands/insights.ts +0 -65
  113. package/src/cli/commands/learn.ts +0 -24
  114. package/src/cli/commands/modules.ts +0 -53
  115. package/src/cli/commands/network.ts +0 -67
  116. package/src/cli/commands/projects.ts +0 -42
  117. package/src/cli/commands/query.ts +0 -120
  118. package/src/cli/commands/start.ts +0 -105
  119. package/src/cli/commands/status.ts +0 -75
  120. package/src/cli/commands/stop.ts +0 -34
  121. package/src/cli/ipc-helper.ts +0 -22
  122. package/src/cli/update-check.ts +0 -63
  123. package/src/code/analyzer.ts +0 -117
  124. package/src/code/fingerprint.ts +0 -87
  125. package/src/code/matcher.ts +0 -129
  126. package/src/code/parsers/generic.ts +0 -29
  127. package/src/code/parsers/python.ts +0 -54
  128. package/src/code/parsers/typescript.ts +0 -65
  129. package/src/code/registry.ts +0 -60
  130. package/src/code/scorer.ts +0 -120
  131. package/src/config.ts +0 -135
  132. package/src/dashboard/server.ts +0 -142
  133. package/src/db/connection.ts +0 -22
  134. package/src/db/migrations/001_core_schema.ts +0 -120
  135. package/src/db/migrations/002_learning_schema.ts +0 -38
  136. package/src/db/migrations/003_code_schema.ts +0 -53
  137. package/src/db/migrations/004_synapses_schema.ts +0 -57
  138. package/src/db/migrations/005_fts_indexes.ts +0 -78
  139. package/src/db/migrations/006_synapses_phase3.ts +0 -17
  140. package/src/db/migrations/007_feedback.ts +0 -13
  141. package/src/db/migrations/008_git_integration.ts +0 -38
  142. package/src/db/migrations/009_embeddings.ts +0 -8
  143. package/src/db/migrations/index.ts +0 -70
  144. package/src/db/repositories/antipattern.repository.ts +0 -66
  145. package/src/db/repositories/code-module.repository.ts +0 -142
  146. package/src/db/repositories/error.repository.ts +0 -189
  147. package/src/db/repositories/insight.repository.ts +0 -99
  148. package/src/db/repositories/notification.repository.ts +0 -66
  149. package/src/db/repositories/project.repository.ts +0 -93
  150. package/src/db/repositories/rule.repository.ts +0 -108
  151. package/src/db/repositories/solution.repository.ts +0 -154
  152. package/src/db/repositories/synapse.repository.ts +0 -163
  153. package/src/db/repositories/terminal.repository.ts +0 -101
  154. package/src/embeddings/engine.ts +0 -238
  155. package/src/hooks/post-tool-use.ts +0 -92
  156. package/src/hooks/post-write.ts +0 -129
  157. package/src/index.ts +0 -63
  158. package/src/ipc/client.ts +0 -118
  159. package/src/ipc/protocol.ts +0 -35
  160. package/src/ipc/router.ts +0 -133
  161. package/src/ipc/server.ts +0 -176
  162. package/src/learning/confidence-scorer.ts +0 -80
  163. package/src/learning/decay.ts +0 -46
  164. package/src/learning/learning-engine.ts +0 -170
  165. package/src/learning/pattern-extractor.ts +0 -90
  166. package/src/learning/rule-generator.ts +0 -74
  167. package/src/main.rs:10:5 +0 -0
  168. package/src/matching/error-matcher.ts +0 -166
  169. package/src/matching/fingerprint.ts +0 -34
  170. package/src/matching/similarity.ts +0 -61
  171. package/src/matching/tfidf.ts +0 -74
  172. package/src/matching/tokenizer.ts +0 -41
  173. package/src/mcp/auto-detect.ts +0 -93
  174. package/src/mcp/http-server.ts +0 -140
  175. package/src/mcp/server.ts +0 -73
  176. package/src/mcp/tools.ts +0 -328
  177. package/src/parsing/error-parser.ts +0 -28
  178. package/src/parsing/parsers/compiler.ts +0 -93
  179. package/src/parsing/parsers/generic.ts +0 -28
  180. package/src/parsing/parsers/go.ts +0 -97
  181. package/src/parsing/parsers/node.ts +0 -69
  182. package/src/parsing/parsers/python.ts +0 -62
  183. package/src/parsing/parsers/rust.ts +0 -50
  184. package/src/parsing/parsers/shell.ts +0 -42
  185. package/src/parsing/types.ts +0 -47
  186. package/src/research/gap-analyzer.ts +0 -135
  187. package/src/research/insight-generator.ts +0 -123
  188. package/src/research/research-engine.ts +0 -116
  189. package/src/research/synergy-detector.ts +0 -126
  190. package/src/research/template-extractor.ts +0 -130
  191. package/src/research/trend-analyzer.ts +0 -127
  192. package/src/services/analytics.service.ts +0 -226
  193. package/src/services/code.service.ts +0 -271
  194. package/src/services/error.service.ts +0 -266
  195. package/src/services/git.service.ts +0 -132
  196. package/src/services/notification.service.ts +0 -41
  197. package/src/services/prevention.service.ts +0 -159
  198. package/src/services/research.service.ts +0 -98
  199. package/src/services/solution.service.ts +0 -174
  200. package/src/services/synapse.service.ts +0 -59
  201. package/src/services/terminal.service.ts +0 -81
  202. package/src/synapses/activation.ts +0 -80
  203. package/src/synapses/decay.ts +0 -38
  204. package/src/synapses/hebbian.ts +0 -69
  205. package/src/synapses/pathfinder.ts +0 -81
  206. package/src/synapses/synapse-manager.ts +0 -113
  207. package/src/types/code.types.ts +0 -52
  208. package/src/types/config.types.ts +0 -103
  209. package/src/types/error.types.ts +0 -67
  210. package/src/types/ipc.types.ts +0 -8
  211. package/src/types/mcp.types.ts +0 -53
  212. package/src/types/research.types.ts +0 -28
  213. package/src/types/solution.types.ts +0 -30
  214. package/src/types/synapse.types.ts +0 -50
  215. package/src/utils/events.ts +0 -45
  216. package/src/utils/hash.ts +0 -5
  217. package/src/utils/logger.ts +0 -48
  218. package/src/utils/paths.ts +0 -19
  219. package/tests/e2e/test_code_intelligence.py +0 -1015
  220. package/tests/e2e/test_error_memory.py +0 -451
  221. package/tests/e2e/test_full_integration.py +0 -534
  222. package/tests/fixtures/code-modules/modules.ts +0 -83
  223. package/tests/fixtures/errors/go.ts +0 -9
  224. package/tests/fixtures/errors/node.ts +0 -24
  225. package/tests/fixtures/errors/python.ts +0 -21
  226. package/tests/fixtures/errors/rust.ts +0 -25
  227. package/tests/fixtures/errors/shell.ts +0 -15
  228. package/tests/fixtures/solutions/solutions.ts +0 -27
  229. package/tests/helpers/setup-db.ts +0 -52
  230. package/tests/integration/code-flow.test.ts +0 -86
  231. package/tests/integration/error-flow.test.ts +0 -83
  232. package/tests/integration/ipc-flow.test.ts +0 -166
  233. package/tests/integration/learning-cycle.test.ts +0 -82
  234. package/tests/integration/synapse-flow.test.ts +0 -117
  235. package/tests/unit/code/analyzer.test.ts +0 -58
  236. package/tests/unit/code/fingerprint.test.ts +0 -51
  237. package/tests/unit/code/scorer.test.ts +0 -55
  238. package/tests/unit/learning/confidence-scorer.test.ts +0 -60
  239. package/tests/unit/learning/decay.test.ts +0 -45
  240. package/tests/unit/learning/pattern-extractor.test.ts +0 -50
  241. package/tests/unit/matching/error-matcher.test.ts +0 -69
  242. package/tests/unit/matching/fingerprint.test.ts +0 -47
  243. package/tests/unit/matching/similarity.test.ts +0 -65
  244. package/tests/unit/matching/tfidf.test.ts +0 -71
  245. package/tests/unit/matching/tokenizer.test.ts +0 -83
  246. package/tests/unit/parsing/parsers.test.ts +0 -113
  247. package/tests/unit/research/gap-analyzer.test.ts +0 -45
  248. package/tests/unit/research/trend-analyzer.test.ts +0 -45
  249. package/tests/unit/synapses/activation.test.ts +0 -80
  250. package/tests/unit/synapses/decay.test.ts +0 -27
  251. package/tests/unit/synapses/hebbian.test.ts +0 -96
  252. package/tests/unit/synapses/pathfinder.test.ts +0 -72
  253. package/tsconfig.json +0 -18
@@ -1,113 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { parseError } from '../../../src/parsing/error-parser.js';
3
- import { nodeTypeError, nodeModuleNotFound, nodeReferenceError, nodeSyntaxError } from '../../fixtures/errors/node.js';
4
- import { pythonTraceback, pythonImportError, pythonTypeError } from '../../fixtures/errors/python.js';
5
- import { rustCompilerError, rustBorrowError } from '../../fixtures/errors/rust.js';
6
- import { goCompileError, goPanicError } from '../../fixtures/errors/go.js';
7
- import { shellCommandNotFound, shellPermissionDenied, npmError } from '../../fixtures/errors/shell.js';
8
-
9
- describe('Node.js Parser', () => {
10
- it('parses TypeError with stack trace', () => {
11
- const result = parseError(nodeTypeError);
12
- expect(result.errorType).toBe('TypeError');
13
- expect(result.message).toContain('Cannot read properties');
14
- expect(result.frames.length).toBeGreaterThan(0);
15
- expect(result.language).toBe('javascript');
16
- });
17
-
18
- it('parses module not found error', () => {
19
- const result = parseError(nodeModuleNotFound);
20
- expect(result.errorType).toContain('Error');
21
- expect(result.message).toContain('Cannot find module');
22
- });
23
-
24
- it('parses ReferenceError', () => {
25
- const result = parseError(nodeReferenceError);
26
- expect(result.errorType).toBe('ReferenceError');
27
- expect(result.message).toContain('process is not defined');
28
- });
29
-
30
- it('parses SyntaxError', () => {
31
- const result = parseError(nodeSyntaxError);
32
- expect(result.errorType).toBe('SyntaxError');
33
- });
34
- });
35
-
36
- describe('Python Parser', () => {
37
- it('parses Python traceback with KeyError', () => {
38
- const result = parseError(pythonTraceback);
39
- expect(result.errorType).toBe('KeyError');
40
- expect(result.frames.length).toBeGreaterThan(0);
41
- expect(result.language).toBe('python');
42
- });
43
-
44
- it('parses ModuleNotFoundError', () => {
45
- const result = parseError(pythonImportError);
46
- expect(result.errorType).toBe('ModuleNotFoundError');
47
- expect(result.message).toContain('flask');
48
- });
49
-
50
- it('parses TypeError', () => {
51
- const result = parseError(pythonTypeError);
52
- expect(result.errorType).toBe('TypeError');
53
- });
54
- });
55
-
56
- describe('Rust Parser', () => {
57
- it('parses compiler error with code', () => {
58
- const result = parseError(rustCompilerError);
59
- expect(result.errorType).toContain('E0308');
60
- expect(result.message).toContain('mismatched types');
61
- expect(result.language).toBe('rust');
62
- });
63
-
64
- it('parses borrow checker error', () => {
65
- const result = parseError(rustBorrowError);
66
- expect(result.errorType).toContain('E0502');
67
- expect(result.message).toContain('borrow');
68
- });
69
- });
70
-
71
- describe('Go Parser', () => {
72
- it('parses compile error', () => {
73
- const result = parseError(goCompileError);
74
- expect(result.errorType).toBeTruthy();
75
- expect(result.language).toBe('go');
76
- });
77
-
78
- it('parses panic', () => {
79
- const result = parseError(goPanicError);
80
- expect(result.message).toContain('index out of range');
81
- });
82
- });
83
-
84
- describe('Shell Parser', () => {
85
- it('parses command not found', () => {
86
- const result = parseError(shellCommandNotFound);
87
- expect(result.message).toContain('command not found');
88
- expect(result.language).toBe('shell');
89
- });
90
-
91
- it('parses permission denied', () => {
92
- const result = parseError(shellPermissionDenied);
93
- expect(result.message).toContain('Permission denied');
94
- });
95
-
96
- it('parses npm error', () => {
97
- const result = parseError(npmError);
98
- expect(result.message).toBeTruthy();
99
- });
100
- });
101
-
102
- describe('Generic fallback', () => {
103
- it('handles unknown error format gracefully', () => {
104
- const result = parseError('Something went wrong: unexpected token');
105
- expect(result.errorType).toBeTruthy();
106
- expect(result.message).toBeTruthy();
107
- });
108
-
109
- it('handles empty string', () => {
110
- const result = parseError('');
111
- expect(result).toBeTruthy();
112
- });
113
- });
@@ -1,45 +0,0 @@
1
- import { describe, it, expect, beforeEach } from 'vitest';
2
- import { GapAnalyzer } from '../../../src/research/gap-analyzer.js';
3
- import { createTestDb, type TestDb } from '../../helpers/setup-db.js';
4
-
5
- describe('GapAnalyzer', () => {
6
- let testDb: TestDb;
7
-
8
- beforeEach(() => {
9
- testDb = createTestDb();
10
- testDb.repos.project.create({ name: 'test-project', path: '/test' } as any);
11
-
12
- for (let i = 0; i < 8; i++) {
13
- testDb.repos.error.create({
14
- project_id: 1, terminal_id: null, fingerprint: 'same_fp', type: 'ModuleNotFoundError',
15
- message: "No module named 'missing_lib'",
16
- raw_output: `ModuleNotFoundError: No module named 'missing_lib'`,
17
- context: null, file_path: null, line_number: null, column_number: null,
18
- } as any);
19
- }
20
- });
21
-
22
- const researchConfig = {
23
- intervalMs: 3600000, initialDelayMs: 300000, minDataPoints: 3,
24
- trendWindowDays: 7, gapMinOccurrences: 5, synergyMinWeight: 0.5,
25
- templateMinAdaptations: 3, insightExpiryDays: 30,
26
- };
27
-
28
- it('creates without error', () => {
29
- const analyzer = new GapAnalyzer(
30
- testDb.repos.error, testDb.repos.solution, testDb.repos.synapse,
31
- testDb.repos.project, testDb.repos.insight, researchConfig,
32
- );
33
- expect(analyzer).toBeTruthy();
34
- });
35
-
36
- it('runs analyze without crashing', () => {
37
- const analyzer = new GapAnalyzer(
38
- testDb.repos.error, testDb.repos.solution, testDb.repos.synapse,
39
- testDb.repos.project, testDb.repos.insight, researchConfig,
40
- );
41
- const count = analyzer.analyze();
42
- expect(typeof count).toBe('number');
43
- expect(count).toBeGreaterThanOrEqual(0);
44
- });
45
- });
@@ -1,45 +0,0 @@
1
- import { describe, it, expect, beforeEach } from 'vitest';
2
- import { TrendAnalyzer } from '../../../src/research/trend-analyzer.js';
3
- import { createTestDb, type TestDb } from '../../helpers/setup-db.js';
4
-
5
- describe('TrendAnalyzer', () => {
6
- let testDb: TestDb;
7
-
8
- beforeEach(() => {
9
- testDb = createTestDb();
10
- testDb.repos.project.create({ name: 'test-project', path: '/test' } as any);
11
-
12
- for (let i = 0; i < 10; i++) {
13
- testDb.repos.error.create({
14
- project_id: 1, terminal_id: null, fingerprint: `fp${i}`, type: 'TypeError',
15
- message: `Cannot read property of undefined ${i}`,
16
- raw_output: `TypeError: test ${i}`, context: null,
17
- file_path: null, line_number: null, column_number: null,
18
- } as any);
19
- }
20
- });
21
-
22
- const researchConfig = {
23
- intervalMs: 3600000, initialDelayMs: 300000, minDataPoints: 3,
24
- trendWindowDays: 7, gapMinOccurrences: 5, synergyMinWeight: 0.5,
25
- templateMinAdaptations: 3, insightExpiryDays: 30,
26
- };
27
-
28
- it('creates without error', () => {
29
- const analyzer = new TrendAnalyzer(
30
- testDb.repos.error, testDb.repos.solution, testDb.repos.project,
31
- testDb.repos.insight, researchConfig,
32
- );
33
- expect(analyzer).toBeTruthy();
34
- });
35
-
36
- it('runs analyze without crashing', () => {
37
- const analyzer = new TrendAnalyzer(
38
- testDb.repos.error, testDb.repos.solution, testDb.repos.project,
39
- testDb.repos.insight, researchConfig,
40
- );
41
- const count = analyzer.analyze();
42
- expect(typeof count).toBe('number');
43
- expect(count).toBeGreaterThanOrEqual(0);
44
- });
45
- });
@@ -1,80 +0,0 @@
1
- import { describe, it, expect, beforeEach } from 'vitest';
2
- import { spreadingActivation } from '../../../src/synapses/activation.js';
3
- import { createTestDb, type TestDb } from '../../helpers/setup-db.js';
4
-
5
- describe('spreadingActivation', () => {
6
- let testDb: TestDb;
7
-
8
- beforeEach(() => {
9
- testDb = createTestDb();
10
- testDb.repos.project.create({ name: 'test', path: '/test' } as any);
11
- for (let i = 0; i < 3; i++) {
12
- testDb.repos.error.create({
13
- project_id: 1, terminal_id: null, fingerprint: `fp${i}`, type: 'TypeError',
14
- message: `error ${i}`, raw_output: `TypeError: ${i}`,
15
- context: null, file_path: null, line_number: null, column_number: null,
16
- } as any);
17
- }
18
-
19
- // Create synapses directly via DB: error1 → error2, error2 → error3
20
- testDb.repos.synapse.create({
21
- source_type: 'error', source_id: 1,
22
- target_type: 'error', target_id: 2,
23
- synapse_type: 'similar_to', weight: 0.8, metadata: null,
24
- } as any);
25
- testDb.repos.synapse.create({
26
- source_type: 'error', source_id: 2,
27
- target_type: 'error', target_id: 3,
28
- synapse_type: 'similar_to', weight: 0.7, metadata: null,
29
- } as any);
30
- });
31
-
32
- it('finds directly connected nodes', () => {
33
- const results = spreadingActivation(
34
- testDb.repos.synapse,
35
- { type: 'error', id: 1 },
36
- 1,
37
- );
38
- expect(results.length).toBeGreaterThan(0);
39
- });
40
-
41
- it('finds multi-hop connections', () => {
42
- const results = spreadingActivation(
43
- testDb.repos.synapse,
44
- { type: 'error', id: 1 },
45
- 2,
46
- );
47
- // Should reach error3 through error2
48
- const nodeIds = results.map(r => r.node.id);
49
- expect(nodeIds).toContain(3);
50
- });
51
-
52
- it('returns empty for isolated node', () => {
53
- // error3 has no outgoing connections (only incoming)
54
- // Add an isolated error
55
- testDb.repos.error.create({
56
- project_id: 1, terminal_id: null, fingerprint: 'fp_isolated', type: 'TypeError',
57
- message: 'isolated', raw_output: 'TypeError: isolated',
58
- context: null, file_path: null, line_number: null, column_number: null,
59
- } as any);
60
- const results = spreadingActivation(
61
- testDb.repos.synapse,
62
- { type: 'error', id: 4 },
63
- 3,
64
- );
65
- expect(results).toEqual([]);
66
- });
67
-
68
- it('activation decays with depth', () => {
69
- const results = spreadingActivation(
70
- testDb.repos.synapse,
71
- { type: 'error', id: 1 },
72
- 2,
73
- );
74
- const direct = results.find(r => r.node.id === 2);
75
- const twoHop = results.find(r => r.node.id === 3);
76
- if (direct && twoHop) {
77
- expect(direct.activation).toBeGreaterThan(twoHop.activation);
78
- }
79
- });
80
- });
@@ -1,27 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { timeDecayFactor } from '../../../src/synapses/decay.js';
3
-
4
- describe('timeDecayFactor', () => {
5
- it('returns ~1.0 for recent activation', () => {
6
- const now = new Date().toISOString();
7
- expect(timeDecayFactor(now, 45)).toBeCloseTo(1.0, 1);
8
- });
9
-
10
- it('returns ~0.5 after one half-life', () => {
11
- const halfLifeDays = 45;
12
- const past = new Date(Date.now() - halfLifeDays * 86400000).toISOString();
13
- expect(timeDecayFactor(past, halfLifeDays)).toBeCloseTo(0.5, 1);
14
- });
15
-
16
- it('returns near 0 for very old activation', () => {
17
- const veryOld = new Date(Date.now() - 500 * 86400000).toISOString();
18
- expect(timeDecayFactor(veryOld, 45)).toBeLessThan(0.01);
19
- });
20
-
21
- it('always returns between 0 and 1', () => {
22
- const past = new Date(Date.now() - 15 * 86400000).toISOString();
23
- const val = timeDecayFactor(past, 45);
24
- expect(val).toBeGreaterThanOrEqual(0);
25
- expect(val).toBeLessThanOrEqual(1);
26
- });
27
- });
@@ -1,96 +0,0 @@
1
- import { describe, it, expect, beforeEach } from 'vitest';
2
- import { strengthen, weaken } from '../../../src/synapses/hebbian.js';
3
- import { createTestDb, type TestDb } from '../../helpers/setup-db.js';
4
-
5
- describe('Hebbian Learning', () => {
6
- let testDb: TestDb;
7
-
8
- beforeEach(() => {
9
- testDb = createTestDb();
10
- testDb.repos.project.create({ name: 'test-project', path: '/test' } as any);
11
- testDb.repos.error.create({
12
- project_id: 1, terminal_id: null, fingerprint: 'fp1', type: 'TypeError',
13
- message: 'test error', raw_output: 'TypeError: test',
14
- context: null, file_path: null, line_number: null, column_number: null,
15
- } as any);
16
- testDb.repos.error.create({
17
- project_id: 1, terminal_id: null, fingerprint: 'fp2', type: 'TypeError',
18
- message: 'test error 2', raw_output: 'TypeError: test2',
19
- context: null, file_path: null, line_number: null, column_number: null,
20
- } as any);
21
- });
22
-
23
- const defaultConfig = {
24
- initialWeight: 0.1,
25
- learningRate: 0.15,
26
- decayHalfLifeDays: 45,
27
- pruneThreshold: 0.05,
28
- decayAfterDays: 14,
29
- maxDepth: 3,
30
- minActivationWeight: 0.2,
31
- };
32
-
33
- it('creates a new synapse', () => {
34
- const synapse = strengthen(
35
- testDb.repos.synapse,
36
- { type: 'error', id: 1 },
37
- { type: 'error', id: 2 },
38
- 'similar_to',
39
- defaultConfig,
40
- );
41
- expect(synapse).toBeTruthy();
42
- expect(synapse.weight).toBeCloseTo(defaultConfig.initialWeight);
43
- });
44
-
45
- it('strengthens existing synapse', () => {
46
- const first = strengthen(
47
- testDb.repos.synapse,
48
- { type: 'error', id: 1 },
49
- { type: 'error', id: 2 },
50
- 'similar_to',
51
- defaultConfig,
52
- );
53
- const second = strengthen(
54
- testDb.repos.synapse,
55
- { type: 'error', id: 1 },
56
- { type: 'error', id: 2 },
57
- 'similar_to',
58
- defaultConfig,
59
- );
60
- expect(second.weight).toBeGreaterThan(first.weight);
61
- });
62
-
63
- it('weight approaches but never exceeds 1', () => {
64
- let last: any;
65
- for (let i = 0; i < 100; i++) {
66
- last = strengthen(
67
- testDb.repos.synapse,
68
- { type: 'error', id: 1 },
69
- { type: 'error', id: 2 },
70
- 'similar_to',
71
- defaultConfig,
72
- );
73
- }
74
- expect(last.weight).toBeLessThanOrEqual(1.0);
75
- expect(last.weight).toBeGreaterThan(0.8);
76
- });
77
-
78
- it('weaken reduces weight', () => {
79
- const synapse = strengthen(
80
- testDb.repos.synapse,
81
- { type: 'error', id: 1 },
82
- { type: 'error', id: 2 },
83
- 'similar_to',
84
- defaultConfig,
85
- );
86
- weaken(testDb.repos.synapse, synapse.id, defaultConfig, 0.5);
87
- const updated = testDb.repos.synapse.getById(synapse.id);
88
- // weaken either reduces weight or deletes if below threshold
89
- if (updated) {
90
- expect(updated.weight).toBeLessThan(synapse.weight);
91
- } else {
92
- // was pruned — that counts as weakened
93
- expect(true).toBe(true);
94
- }
95
- });
96
- });
@@ -1,72 +0,0 @@
1
- import { describe, it, expect, beforeEach } from 'vitest';
2
- import { findPath } from '../../../src/synapses/pathfinder.js';
3
- import { createTestDb, type TestDb } from '../../helpers/setup-db.js';
4
-
5
- describe('findPath', () => {
6
- let testDb: TestDb;
7
-
8
- beforeEach(() => {
9
- testDb = createTestDb();
10
- testDb.repos.project.create({ name: 'test', path: '/test' } as any);
11
-
12
- for (let i = 0; i < 4; i++) {
13
- testDb.repos.error.create({
14
- project_id: 1, terminal_id: null, fingerprint: `fp${i}`, type: 'TypeError',
15
- message: `error ${i}`, raw_output: `TypeError: ${i}`,
16
- context: null, file_path: null, line_number: null, column_number: null,
17
- } as any);
18
- }
19
-
20
- // Chain: error1 → error2 → error3
21
- testDb.repos.synapse.create({
22
- source_type: 'error', source_id: 1,
23
- target_type: 'error', target_id: 2,
24
- synapse_type: 'similar_to', weight: 0.8, metadata: null,
25
- } as any);
26
- testDb.repos.synapse.create({
27
- source_type: 'error', source_id: 2,
28
- target_type: 'error', target_id: 3,
29
- synapse_type: 'similar_to', weight: 0.7, metadata: null,
30
- } as any);
31
- });
32
-
33
- it('finds direct path', () => {
34
- const path = findPath(
35
- testDb.repos.synapse,
36
- { type: 'error', id: 1 },
37
- { type: 'error', id: 2 },
38
- );
39
- expect(path).not.toBeNull();
40
- expect(path!.hops).toBe(1);
41
- });
42
-
43
- it('finds multi-hop path', () => {
44
- const path = findPath(
45
- testDb.repos.synapse,
46
- { type: 'error', id: 1 },
47
- { type: 'error', id: 3 },
48
- 3,
49
- );
50
- expect(path).not.toBeNull();
51
- expect(path!.hops).toBe(2);
52
- });
53
-
54
- it('returns null for no path', () => {
55
- const path = findPath(
56
- testDb.repos.synapse,
57
- { type: 'error', id: 1 },
58
- { type: 'error', id: 4 }, // isolated
59
- );
60
- expect(path).toBeNull();
61
- });
62
-
63
- it('respects maxDepth', () => {
64
- const path = findPath(
65
- testDb.repos.synapse,
66
- { type: 'error', id: 1 },
67
- { type: 'error', id: 3 },
68
- 1, // too shallow
69
- );
70
- expect(path).toBeNull();
71
- });
72
- });
package/tsconfig.json DELETED
@@ -1,18 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "NodeNext",
5
- "moduleResolution": "NodeNext",
6
- "strict": true,
7
- "esModuleInterop": true,
8
- "skipLibCheck": true,
9
- "forceConsistentCasingInFileNames": true,
10
- "outDir": "dist",
11
- "rootDir": "src",
12
- "declaration": true,
13
- "sourceMap": true,
14
- "resolveJsonModule": true
15
- },
16
- "include": ["src/**/*"],
17
- "exclude": ["node_modules", "dist"]
18
- }