@timmeck/brain 3.0.2 → 3.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 (33) hide show
  1. package/Dockerfile +32 -5
  2. package/dist/brain.js +5 -0
  3. package/dist/brain.js.map +1 -1
  4. package/dist/ipc/router.d.ts +2 -0
  5. package/dist/ipc/router.js +6 -0
  6. package/dist/ipc/router.js.map +1 -1
  7. package/dist/mcp/__tests__/prompts.test.d.ts +1 -0
  8. package/dist/mcp/__tests__/prompts.test.js +419 -0
  9. package/dist/mcp/__tests__/prompts.test.js.map +1 -0
  10. package/dist/mcp/http-server.js +5 -1
  11. package/dist/mcp/http-server.js.map +1 -1
  12. package/dist/mcp/prompts.d.ts +7 -0
  13. package/dist/mcp/prompts.js +262 -0
  14. package/dist/mcp/prompts.js.map +1 -0
  15. package/dist/mcp/server.js +3 -1
  16. package/dist/mcp/server.js.map +1 -1
  17. package/dist/mcp/tools.js +33 -0
  18. package/dist/mcp/tools.js.map +1 -1
  19. package/dist/services/__tests__/auto-resolution.service.test.d.ts +1 -0
  20. package/dist/services/__tests__/auto-resolution.service.test.js +838 -0
  21. package/dist/services/__tests__/auto-resolution.service.test.js.map +1 -0
  22. package/dist/services/__tests__/error.service.auto-resolution.test.d.ts +1 -0
  23. package/dist/services/__tests__/error.service.auto-resolution.test.js +320 -0
  24. package/dist/services/__tests__/error.service.auto-resolution.test.js.map +1 -0
  25. package/dist/services/auto-resolution.service.d.ts +60 -0
  26. package/dist/services/auto-resolution.service.js +190 -0
  27. package/dist/services/auto-resolution.service.js.map +1 -0
  28. package/dist/services/error.service.d.ts +4 -0
  29. package/dist/services/error.service.js +15 -3
  30. package/dist/services/error.service.js.map +1 -1
  31. package/dist/utils/events.d.ts +6 -0
  32. package/dist/utils/events.js.map +1 -1
  33. package/package.json +1 -1
@@ -0,0 +1,419 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
3
+ import { registerPromptsDirect } from '../prompts.js';
4
+ describe('MCP Prompts (registerPromptsDirect)', () => {
5
+ let registeredPrompts;
6
+ let mockServer;
7
+ let mockRouter;
8
+ beforeEach(() => {
9
+ vi.clearAllMocks();
10
+ registeredPrompts = {};
11
+ mockServer = {
12
+ prompt: vi.fn((...args) => {
13
+ // The prompt method can have 3 or 4 args before the callback
14
+ const name = args[0];
15
+ const cb = args[args.length - 1];
16
+ registeredPrompts[name] = cb;
17
+ }),
18
+ };
19
+ mockRouter = {
20
+ handle: vi.fn(),
21
+ };
22
+ });
23
+ it('registers all 4 prompts on the server', () => {
24
+ registerPromptsDirect(mockServer, mockRouter);
25
+ expect(mockServer.prompt).toHaveBeenCalledTimes(4);
26
+ expect(registeredPrompts).toHaveProperty('brain-investigate-error');
27
+ expect(registeredPrompts).toHaveProperty('brain-before-code-change');
28
+ expect(registeredPrompts).toHaveProperty('brain-project-overview');
29
+ expect(registeredPrompts).toHaveProperty('brain-review-solution');
30
+ });
31
+ describe('brain-investigate-error', () => {
32
+ beforeEach(() => {
33
+ registerPromptsDirect(mockServer, mockRouter);
34
+ });
35
+ it('calls error.report and returns structured response', async () => {
36
+ mockRouter.handle
37
+ .mockImplementation((method) => {
38
+ if (method === 'error.report') {
39
+ return {
40
+ errorId: 1,
41
+ isNew: true,
42
+ matches: [],
43
+ crossProjectMatches: [],
44
+ };
45
+ }
46
+ if (method === 'synapse.context') {
47
+ return { preventionRules: [], relevantModules: [] };
48
+ }
49
+ return {};
50
+ });
51
+ const result = await registeredPrompts['brain-investigate-error']({
52
+ error_output: 'TypeError: cannot read property of undefined',
53
+ });
54
+ expect(mockRouter.handle).toHaveBeenCalledWith('error.report', {
55
+ project: 'default',
56
+ errorOutput: 'TypeError: cannot read property of undefined',
57
+ });
58
+ expect(mockRouter.handle).toHaveBeenCalledWith('synapse.context', { errorId: 1 });
59
+ expect(result.messages).toHaveLength(1);
60
+ expect(result.messages[0].role).toBe('user');
61
+ expect(result.messages[0].content.type).toBe('text');
62
+ expect(result.messages[0].content.text).toContain('Error #1');
63
+ expect(result.messages[0].content.text).toContain('NEW');
64
+ });
65
+ it('includes suggestions when available', async () => {
66
+ mockRouter.handle
67
+ .mockImplementation((method) => {
68
+ if (method === 'error.report') {
69
+ return {
70
+ errorId: 5,
71
+ isNew: true,
72
+ matches: [{ errorId: 2, score: 0.95, isStrong: true, signals: [] }],
73
+ crossProjectMatches: [],
74
+ suggestions: {
75
+ errorId: 5,
76
+ suggestions: [
77
+ {
78
+ category: 'auto',
79
+ score: 0.92,
80
+ solution: {
81
+ id: 10,
82
+ description: 'Install missing dependency',
83
+ commands: 'npm install lodash',
84
+ code_change: null,
85
+ },
86
+ reasoning: 'Matched error #2 (95% similar). 100% success rate.',
87
+ },
88
+ ],
89
+ autoApply: {
90
+ category: 'auto',
91
+ score: 0.92,
92
+ solution: { id: 10, description: 'Install missing dependency' },
93
+ },
94
+ totalConsidered: 1,
95
+ },
96
+ };
97
+ }
98
+ if (method === 'synapse.context') {
99
+ return { preventionRules: [], relevantModules: [] };
100
+ }
101
+ return {};
102
+ });
103
+ const result = await registeredPrompts['brain-investigate-error']({
104
+ error_output: 'ModuleNotFoundError: lodash',
105
+ });
106
+ const text = result.messages[0].content.text;
107
+ expect(text).toContain('Solution Suggestions');
108
+ expect(text).toContain('[AUTO]');
109
+ expect(text).toContain('Solution #10');
110
+ expect(text).toContain('92%');
111
+ expect(text).toContain('Install missing dependency');
112
+ expect(text).toContain('npm install lodash');
113
+ expect(text).toContain('RECOMMENDED');
114
+ });
115
+ it('includes similar errors and cross-project matches', async () => {
116
+ mockRouter.handle
117
+ .mockImplementation((method) => {
118
+ if (method === 'error.report') {
119
+ return {
120
+ errorId: 3,
121
+ isNew: true,
122
+ matches: [
123
+ { errorId: 7, score: 0.88, isStrong: true, signals: [] },
124
+ ],
125
+ crossProjectMatches: [
126
+ { errorId: 15, score: 0.72, isStrong: false, signals: [] },
127
+ ],
128
+ };
129
+ }
130
+ if (method === 'synapse.context') {
131
+ return { preventionRules: [], relevantModules: [] };
132
+ }
133
+ return {};
134
+ });
135
+ const result = await registeredPrompts['brain-investigate-error']({
136
+ error_output: 'SyntaxError: unexpected token',
137
+ });
138
+ const text = result.messages[0].content.text;
139
+ expect(text).toContain('Similar Errors');
140
+ expect(text).toContain('Error #7');
141
+ expect(text).toContain('88%');
142
+ expect(text).toContain('STRONG');
143
+ expect(text).toContain('Cross-Project Matches');
144
+ expect(text).toContain('Error #15');
145
+ });
146
+ it('includes prevention rules and related modules from synapse context', async () => {
147
+ mockRouter.handle
148
+ .mockImplementation((method) => {
149
+ if (method === 'error.report') {
150
+ return {
151
+ errorId: 1,
152
+ isNew: true,
153
+ matches: [],
154
+ crossProjectMatches: [],
155
+ };
156
+ }
157
+ if (method === 'synapse.context') {
158
+ return {
159
+ preventionRules: [{ id: 1 }, { id: 2 }],
160
+ relevantModules: [{ id: 10 }],
161
+ };
162
+ }
163
+ return {};
164
+ });
165
+ const result = await registeredPrompts['brain-investigate-error']({
166
+ error_output: 'Error: test',
167
+ });
168
+ const text = result.messages[0].content.text;
169
+ expect(text).toContain('Prevention Rules');
170
+ expect(text).toContain('2 prevention rules');
171
+ expect(text).toContain('Related Code Modules');
172
+ expect(text).toContain('1 code modules');
173
+ });
174
+ it('handles synapse.context failure gracefully', async () => {
175
+ mockRouter.handle
176
+ .mockImplementation((method) => {
177
+ if (method === 'error.report') {
178
+ return {
179
+ errorId: 1,
180
+ isNew: false,
181
+ matches: [],
182
+ crossProjectMatches: [],
183
+ };
184
+ }
185
+ if (method === 'synapse.context') {
186
+ throw new Error('Synapse not available');
187
+ }
188
+ return {};
189
+ });
190
+ const result = await registeredPrompts['brain-investigate-error']({
191
+ error_output: 'Error: test',
192
+ });
193
+ // Should still return a valid result despite synapse error
194
+ expect(result.messages).toHaveLength(1);
195
+ expect(result.messages[0].content.text).toContain('Error #1');
196
+ expect(result.messages[0].content.text).toContain('SEEN BEFORE');
197
+ });
198
+ });
199
+ describe('brain-before-code-change', () => {
200
+ beforeEach(() => {
201
+ registerPromptsDirect(mockServer, mockRouter);
202
+ });
203
+ it('returns file advisory with errors and changes', async () => {
204
+ mockRouter.handle
205
+ .mockImplementation((method) => {
206
+ if (method === 'error.query') {
207
+ return [
208
+ { id: 1, type: 'TypeError', message: 'cannot read property x', resolved: false },
209
+ { id: 2, type: 'RangeError', message: 'index out of bounds', resolved: true },
210
+ ];
211
+ }
212
+ if (method === 'changelog.query') {
213
+ return [
214
+ { change_type: 'refactor', summary: 'Extracted helper function', reason: 'DRY principle' },
215
+ ];
216
+ }
217
+ if (method === 'rule.list') {
218
+ return [{ id: 1 }, { id: 2 }, { id: 3 }];
219
+ }
220
+ if (method === 'decision.query') {
221
+ return [
222
+ { title: 'Use async/await', description: 'Decided to use async/await instead of callbacks for all new code in this module for consistency.' },
223
+ ];
224
+ }
225
+ return [];
226
+ });
227
+ const result = await registeredPrompts['brain-before-code-change']({
228
+ file_path: 'src/services/auth.ts',
229
+ });
230
+ const text = result.messages[0].content.text;
231
+ expect(text).toContain('Brain Advisory: src/services/auth.ts');
232
+ expect(text).toContain('Known Errors');
233
+ expect(text).toContain('2 total');
234
+ expect(text).toContain('1 unresolved');
235
+ expect(text).toContain('#1');
236
+ expect(text).toContain('UNRESOLVED');
237
+ expect(text).toContain('Recent Changes');
238
+ expect(text).toContain('Extracted helper function');
239
+ expect(text).toContain('DRY principle');
240
+ expect(text).toContain('Active Prevention Rules');
241
+ expect(text).toContain('3 learned rules');
242
+ expect(text).toContain('Related Decisions');
243
+ expect(text).toContain('Use async/await');
244
+ });
245
+ it('calls correct IPC methods with file_path', async () => {
246
+ mockRouter.handle.mockResolvedValue([]);
247
+ await registeredPrompts['brain-before-code-change']({
248
+ file_path: 'src/index.ts',
249
+ });
250
+ expect(mockRouter.handle).toHaveBeenCalledWith('error.query', { search: 'src/index.ts' });
251
+ expect(mockRouter.handle).toHaveBeenCalledWith('changelog.query', { filePath: 'src/index.ts', limit: 5 });
252
+ expect(mockRouter.handle).toHaveBeenCalledWith('rule.list', {});
253
+ expect(mockRouter.handle).toHaveBeenCalledWith('decision.query', { query: 'src/index.ts', limit: 3 });
254
+ });
255
+ it('shows fallback message when no prior knowledge exists', async () => {
256
+ mockRouter.handle
257
+ .mockImplementation((method) => {
258
+ if (method === 'error.query')
259
+ return [];
260
+ if (method === 'changelog.query')
261
+ return [];
262
+ if (method === 'rule.list')
263
+ return [];
264
+ if (method === 'decision.query')
265
+ return [];
266
+ return [];
267
+ });
268
+ const result = await registeredPrompts['brain-before-code-change']({
269
+ file_path: 'brand-new-file.ts',
270
+ });
271
+ const text = result.messages[0].content.text;
272
+ expect(text).toContain('No prior knowledge about this file');
273
+ });
274
+ it('handles all IPC calls failing gracefully', async () => {
275
+ mockRouter.handle.mockImplementation(() => {
276
+ throw new Error('Service unavailable');
277
+ });
278
+ const result = await registeredPrompts['brain-before-code-change']({
279
+ file_path: 'src/broken.ts',
280
+ });
281
+ // Should still produce valid output — fallback message
282
+ expect(result.messages).toHaveLength(1);
283
+ expect(result.messages[0].content.text).toContain('No prior knowledge about this file');
284
+ });
285
+ });
286
+ describe('brain-project-overview', () => {
287
+ beforeEach(() => {
288
+ registerPromptsDirect(mockServer, mockRouter);
289
+ });
290
+ it('returns health overview with stats', async () => {
291
+ mockRouter.handle
292
+ .mockImplementation((method) => {
293
+ if (method === 'analytics.summary') {
294
+ return {
295
+ errors: { total: 42, unresolved: 5 },
296
+ solutions: { total: 15 },
297
+ rules: { active: 8 },
298
+ modules: { total: 120 },
299
+ insights: { active: 3 },
300
+ };
301
+ }
302
+ if (method === 'synapse.stats') {
303
+ return { totalSynapses: 200, totalNodes: 50, avgWeight: 0.456 };
304
+ }
305
+ if (method === 'synapse.list') {
306
+ return [
307
+ { sourceType: 'error', sourceId: 1, targetType: 'module', targetId: 5, weight: 0.95, type: 'similar_to' },
308
+ ];
309
+ }
310
+ if (method === 'task.list') {
311
+ return [
312
+ { priority: 1, title: 'Fix auth bug' },
313
+ ];
314
+ }
315
+ if (method === 'research.insights') {
316
+ return [
317
+ { type: 'pattern', title: 'Null checks missing', description: 'Multiple modules lack null checks on API responses.' },
318
+ ];
319
+ }
320
+ return {};
321
+ });
322
+ const result = await registeredPrompts['brain-project-overview']({ project: 'my-app' });
323
+ const text = result.messages[0].content.text;
324
+ expect(text).toContain('Brain Project Intelligence: my-app');
325
+ expect(text).toContain('Health Overview');
326
+ expect(text).toContain('42 total');
327
+ expect(text).toContain('5 unresolved');
328
+ expect(text).toContain('15 recorded');
329
+ expect(text).toContain('8 active learned rules');
330
+ expect(text).toContain('120 indexed');
331
+ expect(text).toContain('3 active');
332
+ expect(text).toContain('Synapse Network');
333
+ expect(text).toContain('200');
334
+ expect(text).toContain('50 nodes');
335
+ expect(text).toContain('0.456');
336
+ expect(text).toContain('Strongest Connections');
337
+ expect(text).toContain('error:1');
338
+ expect(text).toContain('module:5');
339
+ expect(text).toContain('Active Tasks');
340
+ expect(text).toContain('Fix auth bug');
341
+ expect(text).toContain('Recent Insights');
342
+ expect(text).toContain('Null checks missing');
343
+ });
344
+ it('works without project name', async () => {
345
+ mockRouter.handle.mockImplementation(() => {
346
+ throw new Error('Not found');
347
+ });
348
+ const result = await registeredPrompts['brain-project-overview']({});
349
+ const text = result.messages[0].content.text;
350
+ expect(text).toContain('Brain Project Intelligence');
351
+ expect(text).not.toContain(':');
352
+ });
353
+ });
354
+ describe('brain-review-solution', () => {
355
+ beforeEach(() => {
356
+ registerPromptsDirect(mockServer, mockRouter);
357
+ });
358
+ it('returns solution details', async () => {
359
+ mockRouter.handle
360
+ .mockImplementation((method) => {
361
+ if (method === 'solution.query') {
362
+ return [{
363
+ id: 7,
364
+ description: 'Add null check before accessing property',
365
+ commands: 'npm run lint --fix',
366
+ code_change: '- obj.prop\n+ obj?.prop',
367
+ source: 'human',
368
+ confidence: 0.88,
369
+ success_count: 5,
370
+ fail_count: 1,
371
+ }];
372
+ }
373
+ if (method === 'solution.efficiency') {
374
+ return {
375
+ avgDurationMs: 1200,
376
+ successRateOverall: 0.83,
377
+ totalAttempts: 6,
378
+ };
379
+ }
380
+ return {};
381
+ });
382
+ const result = await registeredPrompts['brain-review-solution']({
383
+ solution_id: '7',
384
+ });
385
+ const text = result.messages[0].content.text;
386
+ expect(text).toContain('Solution Review');
387
+ expect(text).toContain('Solution #7');
388
+ expect(text).toContain('Add null check before accessing property');
389
+ expect(text).toContain('npm run lint --fix');
390
+ expect(text).toContain('obj?.prop');
391
+ expect(text).toContain('human');
392
+ expect(text).toContain('88%');
393
+ expect(text).toContain('5 successes');
394
+ expect(text).toContain('1 failures');
395
+ expect(text).toContain('Overall Solution Statistics');
396
+ expect(text).toContain('1200');
397
+ expect(text).toContain('83%');
398
+ expect(text).toContain('6');
399
+ });
400
+ it('calls solution.query with parsed integer errorId', async () => {
401
+ mockRouter.handle.mockImplementation(() => {
402
+ throw new Error('Not found');
403
+ });
404
+ await registeredPrompts['brain-review-solution']({ solution_id: '42' });
405
+ expect(mockRouter.handle).toHaveBeenCalledWith('solution.query', { errorId: 42 });
406
+ });
407
+ it('handles missing solution gracefully', async () => {
408
+ mockRouter.handle.mockImplementation(() => {
409
+ throw new Error('Solution not found');
410
+ });
411
+ const result = await registeredPrompts['brain-review-solution']({
412
+ solution_id: '999',
413
+ });
414
+ const text = result.messages[0].content.text;
415
+ expect(text).toContain('Could not retrieve solution details');
416
+ });
417
+ });
418
+ });
419
+ //# sourceMappingURL=prompts.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.test.js","sourceRoot":"","sources":["../../../src/mcp/__tests__/prompts.test.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,13 @@
1
1
  import { McpHttpServer as CoreMcpHttpServer } from '@timmeck/brain-core';
2
2
  import { registerToolsDirect } from './tools.js';
3
+ import { registerPromptsDirect } from './prompts.js';
3
4
  export class McpHttpServer {
4
5
  inner;
5
6
  constructor(port, router) {
6
- this.inner = new CoreMcpHttpServer(port, router, { name: 'brain', version: '2.0.0' }, (server, _r) => registerToolsDirect(server, router));
7
+ this.inner = new CoreMcpHttpServer(port, router, { name: 'brain', version: '3.1.0' }, (server, _r) => {
8
+ registerToolsDirect(server, router);
9
+ registerPromptsDirect(server, router);
10
+ });
7
11
  }
8
12
  start() { this.inner.start(); }
9
13
  stop() { this.inner.stop(); }
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/mcp/http-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,OAAO,aAAa;IAChB,KAAK,CAAoB;IAEjC,YAAY,IAAY,EAAE,MAAiB;QACzC,IAAI,CAAC,KAAK,GAAG,IAAI,iBAAiB,CAChC,IAAI,EACJ,MAAM,EACN,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EACnC,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CACpD,CAAC;IACJ,CAAC;IAED,KAAK,KAAW,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACrC,IAAI,KAAW,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnC,cAAc,KAAa,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;CACjE"}
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/mcp/http-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,OAAO,aAAa;IAChB,KAAK,CAAoB;IAEjC,YAAY,IAAY,EAAE,MAAiB;QACzC,IAAI,CAAC,KAAK,GAAG,IAAI,iBAAiB,CAChC,IAAI,EACJ,MAAM,EACN,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EACnC,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE;YACb,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACpC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxC,CAAC,CACF,CAAC;IACJ,CAAC;IAED,KAAK,KAAW,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACrC,IAAI,KAAW,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnC,cAAc,KAAa,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;CACjE"}
@@ -0,0 +1,7 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { IpcClient } from '@timmeck/brain-core';
3
+ import type { IpcRouter } from '../ipc/router.js';
4
+ /** Register MCP prompts using IPC client (for stdio MCP transport) */
5
+ export declare function registerPrompts(server: McpServer, ipc: IpcClient): void;
6
+ /** Register MCP prompts using router directly (for HTTP MCP transport inside daemon) */
7
+ export declare function registerPromptsDirect(server: McpServer, router: IpcRouter): void;