@timmeck/brain 3.36.12 → 3.36.14

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 (36) hide show
  1. package/dist/brain.js +100 -4
  2. package/dist/brain.js.map +1 -1
  3. package/dist/cli/commands/missions.d.ts +2 -0
  4. package/dist/cli/commands/missions.js +113 -0
  5. package/dist/cli/commands/missions.js.map +1 -0
  6. package/dist/hooks/__tests__/prompt-submit.test.d.ts +1 -0
  7. package/dist/hooks/__tests__/prompt-submit.test.js +202 -0
  8. package/dist/hooks/__tests__/prompt-submit.test.js.map +1 -0
  9. package/dist/hooks/prompt-submit.js +70 -58
  10. package/dist/hooks/prompt-submit.js.map +1 -1
  11. package/dist/index.js +2 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/ipc/__tests__/notification-bridge.test.d.ts +1 -0
  14. package/dist/ipc/__tests__/notification-bridge.test.js +155 -0
  15. package/dist/ipc/__tests__/notification-bridge.test.js.map +1 -0
  16. package/dist/ipc/router.d.ts +5 -0
  17. package/dist/ipc/router.js +82 -1
  18. package/dist/ipc/router.js.map +1 -1
  19. package/dist/learning/__tests__/confidence-scorer.test.d.ts +1 -0
  20. package/dist/learning/__tests__/confidence-scorer.test.js +75 -0
  21. package/dist/learning/__tests__/confidence-scorer.test.js.map +1 -0
  22. package/dist/learning/confidence-scorer.js +3 -3
  23. package/dist/learning/confidence-scorer.js.map +1 -1
  24. package/dist/mcp/http-server.js +4 -0
  25. package/dist/mcp/http-server.js.map +1 -1
  26. package/dist/mcp/llm-tools.js +89 -19
  27. package/dist/mcp/llm-tools.js.map +1 -1
  28. package/dist/mcp/mission-tools.d.ts +5 -0
  29. package/dist/mcp/mission-tools.js +72 -0
  30. package/dist/mcp/mission-tools.js.map +1 -0
  31. package/dist/mcp/server.js +4 -0
  32. package/dist/mcp/server.js.map +1 -1
  33. package/dist/mcp/techradar-tools.d.ts +7 -0
  34. package/dist/mcp/techradar-tools.js +138 -0
  35. package/dist/mcp/techradar-tools.js.map +1 -0
  36. package/package.json +1 -1
@@ -0,0 +1,202 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ // Mock IpcClient before importing
3
+ const mockRequest = vi.fn();
4
+ const mockConnect = vi.fn();
5
+ const mockDisconnect = vi.fn();
6
+ vi.mock('@timmeck/brain-core', () => ({
7
+ IpcClient: vi.fn().mockImplementation(() => ({
8
+ connect: mockConnect,
9
+ request: mockRequest,
10
+ disconnect: mockDisconnect,
11
+ })),
12
+ }));
13
+ vi.mock('../../utils/paths.js', () => ({
14
+ getPipeName: () => '\\\\.\\pipe\\brain-test',
15
+ }));
16
+ // Mirror the formatTag / formatNotification logic from prompt-submit.ts for unit testing
17
+ function formatTag(type, title) {
18
+ const event = title ?? '';
19
+ if (event.includes('position') || event.includes('paper'))
20
+ return 'trade';
21
+ if (event.includes('selfmod') || event.includes('improvement'))
22
+ return 'self';
23
+ if (event.includes('post:') || event.includes('campaign'))
24
+ return 'mktg';
25
+ if (event.includes('insight'))
26
+ return 'insight';
27
+ if (event.includes('rule') || event.includes('learn') || event.includes('calibrat'))
28
+ return 'learn';
29
+ if (event.includes('tech') || event.includes('radar'))
30
+ return 'tech';
31
+ if (type.includes('trading') || type.includes('position') || type.includes('paper'))
32
+ return 'trade';
33
+ if (type.includes('selfmod') || type.includes('self-mod') || type.includes('improvement'))
34
+ return 'self';
35
+ if (type.includes('marketing') || type.includes('post:') || type.includes('campaign'))
36
+ return 'mktg';
37
+ if (type.includes('insight'))
38
+ return 'insight';
39
+ if (type.includes('rule') || type.includes('learn') || type.includes('calibrat'))
40
+ return 'learn';
41
+ if (type.includes('tech') || type.includes('radar'))
42
+ return 'tech';
43
+ return 'info';
44
+ }
45
+ function formatNotification(n) {
46
+ const tag = formatTag(n.type, n.title);
47
+ let detail = n.title;
48
+ try {
49
+ const data = JSON.parse(n.message);
50
+ if (data.summary) {
51
+ detail = data.summary;
52
+ }
53
+ else if (data.pnl !== undefined) {
54
+ const pnlStr = data.pnl >= 0 ? `+$${data.pnl.toFixed(2)}` : `-$${Math.abs(data.pnl).toFixed(2)}`;
55
+ const pctStr = data.pnlPct !== undefined ? ` (${data.pnlPct >= 0 ? '+' : ''}${data.pnlPct.toFixed(1)}%)` : '';
56
+ detail = `${n.title}: ${pnlStr}${pctStr}`;
57
+ }
58
+ else if (data.pattern) {
59
+ detail = `${n.title}: "${data.pattern}"`;
60
+ }
61
+ else {
62
+ detail = n.title;
63
+ }
64
+ }
65
+ catch {
66
+ detail = n.title;
67
+ }
68
+ return ` [${tag}] ${detail}`;
69
+ }
70
+ describe('prompt-submit hook', () => {
71
+ beforeEach(() => {
72
+ vi.clearAllMocks();
73
+ mockConnect.mockResolvedValue(undefined);
74
+ mockDisconnect.mockReturnValue(undefined);
75
+ });
76
+ describe('formatTag', () => {
77
+ it('maps trade-related types to "trade"', () => {
78
+ expect(formatTag('cross-brain:trading-brain', 'position:closed')).toBe('trade');
79
+ expect(formatTag('position:closed')).toBe('trade');
80
+ expect(formatTag('paper_trade')).toBe('trade');
81
+ });
82
+ it('maps learning types to "learn"', () => {
83
+ expect(formatTag('cross-brain:trading-brain', 'rule:learned')).toBe('learn');
84
+ expect(formatTag('calibration', 'updated')).toBe('learn');
85
+ });
86
+ it('maps selfmod types to "self"', () => {
87
+ expect(formatTag('selfmod')).toBe('self');
88
+ expect(formatTag('self-modification')).toBe('self');
89
+ expect(formatTag('selfmod', 'Self-improvement suggestion')).toBe('self');
90
+ });
91
+ it('maps insight types', () => {
92
+ expect(formatTag('cross-brain:trading-brain', 'insight:created')).toBe('insight');
93
+ });
94
+ it('maps marketing types to "mktg"', () => {
95
+ expect(formatTag('cross-brain:marketing-brain', 'post:published')).toBe('mktg');
96
+ expect(formatTag('campaign', 'campaign:created')).toBe('mktg');
97
+ // rule:learned from marketing-brain maps to 'learn' (event > source)
98
+ expect(formatTag('cross-brain:marketing-brain', 'rule:learned')).toBe('learn');
99
+ });
100
+ it('maps tech radar types', () => {
101
+ expect(formatTag('techradar:scan')).toBe('tech');
102
+ });
103
+ it('defaults to "info"', () => {
104
+ expect(formatTag('unknown')).toBe('info');
105
+ });
106
+ });
107
+ describe('formatNotification', () => {
108
+ it('formats trade close with P&L', () => {
109
+ const n = {
110
+ id: 1,
111
+ type: 'cross-brain:trading-brain',
112
+ title: 'position:closed',
113
+ message: JSON.stringify({ pnl: 42.5, pnlPct: 2.1, symbol: 'BTC/USDT' }),
114
+ priority: 0,
115
+ created_at: '2026-03-06T12:00:00Z',
116
+ };
117
+ const result = formatNotification(n);
118
+ expect(result).toContain('[trade]');
119
+ expect(result).toContain('+$42.50');
120
+ expect(result).toContain('+2.1%');
121
+ });
122
+ it('formats negative P&L correctly', () => {
123
+ const n = {
124
+ id: 2,
125
+ type: 'cross-brain:trading-brain',
126
+ title: 'position:closed',
127
+ message: JSON.stringify({ pnl: -15.30, pnlPct: -1.5 }),
128
+ priority: 0,
129
+ created_at: '2026-03-06T12:00:00Z',
130
+ };
131
+ const result = formatNotification(n);
132
+ expect(result).toContain('[trade]');
133
+ expect(result).toContain('-$15.30');
134
+ expect(result).toContain('-1.5%');
135
+ });
136
+ it('formats rule with pattern', () => {
137
+ const n = {
138
+ id: 3,
139
+ type: 'cross-brain:trading-brain',
140
+ title: 'rule:learned',
141
+ message: JSON.stringify({ pattern: 'RSI<30 + MACD cross' }),
142
+ priority: 0,
143
+ created_at: '2026-03-06T12:00:00Z',
144
+ };
145
+ const result = formatNotification(n);
146
+ expect(result).toContain('[learn]');
147
+ expect(result).toContain('"RSI<30 + MACD cross"');
148
+ });
149
+ it('formats notification with summary', () => {
150
+ const n = {
151
+ id: 4,
152
+ type: 'selfmod',
153
+ title: 'Self-improvement suggestion',
154
+ message: JSON.stringify({ summary: 'Extract common IPC patterns' }),
155
+ priority: 0,
156
+ created_at: '2026-03-06T12:00:00Z',
157
+ };
158
+ const result = formatNotification(n);
159
+ expect(result).toContain('[self]');
160
+ expect(result).toContain('Extract common IPC patterns');
161
+ });
162
+ it('falls back to title for unparseable message', () => {
163
+ const n = {
164
+ id: 5,
165
+ type: 'info',
166
+ title: 'Something happened',
167
+ message: 'not json',
168
+ priority: 0,
169
+ created_at: '2026-03-06T12:00:00Z',
170
+ };
171
+ const result = formatNotification(n);
172
+ expect(result).toContain('[info]');
173
+ expect(result).toContain('Something happened');
174
+ });
175
+ });
176
+ describe('IPC integration', () => {
177
+ it('does nothing when no pending notifications', async () => {
178
+ mockRequest.mockResolvedValue([]);
179
+ const { IpcClient } = await import('@timmeck/brain-core');
180
+ const client = new IpcClient('\\\\.\\pipe\\test', 3000);
181
+ await client.connect();
182
+ const pending = await client.request('notification.pending');
183
+ expect(pending).toEqual([]);
184
+ });
185
+ it('calls notification.pending and notification.ackAll', async () => {
186
+ const notifications = [
187
+ { id: 1, type: 'selfmod', title: 'Test', message: '{}', priority: 0, created_at: '' },
188
+ ];
189
+ mockRequest
190
+ .mockResolvedValueOnce(notifications) // notification.pending
191
+ .mockResolvedValueOnce({ acknowledged: 1 }); // notification.ackAll
192
+ const { IpcClient } = await import('@timmeck/brain-core');
193
+ const client = new IpcClient('\\\\.\\pipe\\test', 3000);
194
+ await client.connect();
195
+ const pending = await client.request('notification.pending');
196
+ expect(pending).toEqual(notifications);
197
+ const ack = await client.request('notification.ackAll');
198
+ expect(ack).toEqual({ acknowledged: 1 });
199
+ });
200
+ });
201
+ });
202
+ //# sourceMappingURL=prompt-submit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-submit.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/prompt-submit.test.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,9 @@
1
1
  #!/usr/bin/env node
2
- // UserPromptSubmit hook — injects Brain's self-improvement suggestions into Claude's context
3
- // Brain writes improvement requests to ~/.brain/improvement-requests.md during feedback cycles.
4
- // This hook checks for new entries and shows them to Claude automatically.
5
- import fs from 'node:fs';
6
- import path from 'node:path';
7
- import os from 'node:os';
8
- const IMPROVEMENTS_FILE = path.join(os.homedir(), '.brain', 'improvement-requests.md');
9
- const STATE_FILE = path.join(os.homedir(), '.brain', '.improvement-hook-state');
2
+ // UserPromptSubmit hook — injects Brain's pending notifications into Claude's context.
3
+ // Connects to Brain daemon via IPC, fetches unread notifications, prints them to stdout,
4
+ // then acknowledges them so they don't appear again.
5
+ import { IpcClient } from '@timmeck/brain-core';
6
+ import { getPipeName } from '../utils/paths.js';
10
7
  function readStdin() {
11
8
  return new Promise((resolve) => {
12
9
  let data = '';
@@ -15,69 +12,84 @@ function readStdin() {
15
12
  process.stdin.on('end', () => resolve(data));
16
13
  });
17
14
  }
18
- function getLastSeenSize() {
19
- try {
20
- const state = fs.readFileSync(STATE_FILE, 'utf-8').trim();
21
- return parseInt(state, 10) || 0;
22
- }
23
- catch {
24
- return 0;
25
- }
15
+ function formatTag(type, title) {
16
+ // For cross-brain types, derive category from the event title first
17
+ const event = title ?? '';
18
+ if (event.includes('position') || event.includes('paper'))
19
+ return 'trade';
20
+ if (event.includes('selfmod') || event.includes('improvement'))
21
+ return 'self';
22
+ if (event.includes('post:') || event.includes('campaign'))
23
+ return 'mktg';
24
+ if (event.includes('insight'))
25
+ return 'insight';
26
+ if (event.includes('rule') || event.includes('learn') || event.includes('calibrat'))
27
+ return 'learn';
28
+ if (event.includes('tech') || event.includes('radar'))
29
+ return 'tech';
30
+ // Fallback: check type itself
31
+ if (type.includes('trading') || type.includes('position') || type.includes('paper'))
32
+ return 'trade';
33
+ if (type.includes('selfmod') || type.includes('self-mod') || type.includes('improvement'))
34
+ return 'self';
35
+ if (type.includes('marketing') || type.includes('post:') || type.includes('campaign'))
36
+ return 'mktg';
37
+ if (type.includes('insight'))
38
+ return 'insight';
39
+ if (type.includes('rule') || type.includes('learn') || type.includes('calibrat'))
40
+ return 'learn';
41
+ if (type.includes('tech') || type.includes('radar'))
42
+ return 'tech';
43
+ return 'info';
26
44
  }
27
- function saveSeenSize(size) {
45
+ function formatNotification(n) {
46
+ const tag = formatTag(n.type, n.title);
47
+ // Try to extract a meaningful one-liner from message JSON
48
+ let detail = n.title;
28
49
  try {
29
- fs.mkdirSync(path.dirname(STATE_FILE), { recursive: true });
30
- fs.writeFileSync(STATE_FILE, String(size));
50
+ const data = JSON.parse(n.message);
51
+ if (data.summary) {
52
+ detail = data.summary;
53
+ }
54
+ else if (data.pnl !== undefined) {
55
+ const pnlStr = data.pnl >= 0 ? `+$${data.pnl.toFixed(2)}` : `-$${Math.abs(data.pnl).toFixed(2)}`;
56
+ const pctStr = data.pnlPct !== undefined ? ` (${data.pnlPct >= 0 ? '+' : ''}${data.pnlPct.toFixed(1)}%)` : '';
57
+ detail = `${n.title}: ${pnlStr}${pctStr}`;
58
+ }
59
+ else if (data.pattern) {
60
+ detail = `${n.title}: "${data.pattern}"`;
61
+ }
62
+ else {
63
+ detail = n.title;
64
+ }
31
65
  }
32
66
  catch {
33
- // best effort
67
+ detail = n.title;
34
68
  }
69
+ return ` [${tag}] ${detail}`;
35
70
  }
36
71
  async function main() {
37
72
  await readStdin(); // consume stdin (required by hook protocol)
38
- if (!fs.existsSync(IMPROVEMENTS_FILE))
39
- return;
40
- let content;
73
+ const client = new IpcClient(getPipeName(), 3000);
41
74
  try {
42
- content = fs.readFileSync(IMPROVEMENTS_FILE, 'utf-8');
75
+ await client.connect();
76
+ const pending = await client.request('notification.pending');
77
+ if (!pending || pending.length === 0)
78
+ return;
79
+ // Print notifications to stdout — injected into Claude's context
80
+ console.log(`\u{1F9E0} Brain (${pending.length} new):`);
81
+ for (const n of pending) {
82
+ console.log(formatNotification(n));
83
+ }
84
+ // Acknowledge all so they don't repeat
85
+ await client.request('notification.ackAll');
43
86
  }
44
87
  catch {
45
- return;
46
- }
47
- const currentSize = content.length;
48
- const lastSeenSize = getLastSeenSize();
49
- // File was rewritten/shrunk — reset state and scan from beginning
50
- if (currentSize < lastSeenSize) {
51
- saveSeenSize(0);
52
- }
53
- // No new content since last check
54
- if (currentSize <= lastSeenSize)
55
- return;
56
- // Extract only the new part (or full content if file was reset)
57
- const effectiveLastSeen = currentSize < lastSeenSize ? 0 : lastSeenSize;
58
- const newContent = content.slice(effectiveLastSeen).trim();
59
- if (!newContent)
60
- return;
61
- // Extract "Tell Claude:" lines from new content
62
- const suggestions = newContent
63
- .split('\n')
64
- .filter(line => line.includes('Tell Claude:'))
65
- .map(line => line.replace(/^\d+\.\s*/, '').replace('Tell Claude: ', '').trim())
66
- .filter(Boolean);
67
- if (suggestions.length === 0) {
68
- // Still update state even if no actionable suggestions
69
- saveSeenSize(currentSize);
70
- return;
88
+ // Brain daemon not running or unreachable — silent, never block workflow
71
89
  }
72
- // Deduplicate
73
- const unique = [...new Set(suggestions)];
74
- // Output to stdout — this gets injected into Claude's context
75
- console.log(`🧠 Brain Self-Improvement Request (${unique.length} new suggestion${unique.length > 1 ? 's' : ''}):`);
76
- for (const s of unique) {
77
- console.log(` → ${s}`);
90
+ finally {
91
+ client.disconnect();
78
92
  }
79
- // Update state
80
- saveSeenSize(currentSize);
81
93
  }
82
94
  main();
83
95
  //# sourceMappingURL=prompt-submit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-submit.js","sourceRoot":"","sources":["../../src/hooks/prompt-submit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt-submit.js","sourceRoot":"","sources":["../../src/hooks/prompt-submit.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -37,6 +37,7 @@ import { peersCommand } from './cli/commands/peers.js';
37
37
  import { setupCommand } from './cli/commands/setup.js';
38
38
  import { rulesCommand } from './cli/commands/rules.js';
39
39
  import { synapsesCommand } from './cli/commands/synapses.js';
40
+ import { missionsCommand } from './cli/commands/missions.js';
40
41
  import { getCurrentVersion } from './cli/update-check.js';
41
42
  const program = new Command();
42
43
  program
@@ -62,6 +63,7 @@ program.addCommand(peersCommand());
62
63
  program.addCommand(setupCommand());
63
64
  program.addCommand(rulesCommand());
64
65
  program.addCommand(synapsesCommand());
66
+ program.addCommand(missionsCommand());
65
67
  // Hidden command: run MCP server (called by Claude Code)
66
68
  program
67
69
  .command('mcp-server')
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,sDAAsD;AACtD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7H,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClD,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,EAAE,GAAG,CAAC;YAAE,SAAS;QACrB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAChD,CAAC;AACH,CAAC;AAED,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,0DAA0D,CAAC;KACvE,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAEhC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;AAEtC,yDAAyD;AACzD,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC3D,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL,qEAAqE;AACrE,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;IAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,155 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ // Minimal mock services for the IpcRouter
3
+ function createMockNotificationService() {
4
+ const store = [];
5
+ let nextId = 1;
6
+ return {
7
+ create(input) {
8
+ const id = nextId++;
9
+ store.push({
10
+ id,
11
+ type: input.type,
12
+ title: input.title,
13
+ message: input.message,
14
+ priority: input.priority ?? 0,
15
+ acknowledged: false,
16
+ });
17
+ return id;
18
+ },
19
+ list() {
20
+ return store.filter(n => !n.acknowledged);
21
+ },
22
+ acknowledge(id) {
23
+ const n = store.find(s => s.id === id);
24
+ if (n)
25
+ n.acknowledged = true;
26
+ },
27
+ getById(id) {
28
+ return store.find(s => s.id === id);
29
+ },
30
+ _store: store,
31
+ };
32
+ }
33
+ describe('notification bridge IPC routes', () => {
34
+ let notificationService;
35
+ beforeEach(() => {
36
+ notificationService = createMockNotificationService();
37
+ });
38
+ describe('notification.pending', () => {
39
+ it('returns empty array when no notifications', () => {
40
+ const pending = notificationService.list();
41
+ expect(pending).toEqual([]);
42
+ });
43
+ it('returns unacknowledged notifications', () => {
44
+ notificationService.create({ type: 'selfmod', title: 'Test', message: '{}' });
45
+ notificationService.create({ type: 'cross-brain:trading-brain', title: 'trade', message: '{}' });
46
+ const pending = notificationService.list();
47
+ expect(pending).toHaveLength(2);
48
+ expect(pending[0].type).toBe('selfmod');
49
+ expect(pending[1].type).toBe('cross-brain:trading-brain');
50
+ });
51
+ it('does not return acknowledged notifications', () => {
52
+ const id = notificationService.create({ type: 'selfmod', title: 'Test', message: '{}' });
53
+ notificationService.acknowledge(id);
54
+ const pending = notificationService.list();
55
+ expect(pending).toHaveLength(0);
56
+ });
57
+ });
58
+ describe('notification.ackAll', () => {
59
+ it('acknowledges all pending notifications', () => {
60
+ notificationService.create({ type: 'selfmod', title: 'A', message: '{}' });
61
+ notificationService.create({ type: 'selfmod', title: 'B', message: '{}' });
62
+ notificationService.create({ type: 'selfmod', title: 'C', message: '{}' });
63
+ // Simulate ackAll route logic
64
+ const pending = notificationService.list();
65
+ for (const n of pending) {
66
+ notificationService.acknowledge(n.id);
67
+ }
68
+ expect(notificationService.list()).toHaveLength(0);
69
+ expect(notificationService._store.every(n => n.acknowledged)).toBe(true);
70
+ });
71
+ it('returns acknowledged count', () => {
72
+ notificationService.create({ type: 'a', title: 'A', message: '{}' });
73
+ notificationService.create({ type: 'b', title: 'B', message: '{}' });
74
+ const pending = notificationService.list();
75
+ for (const n of pending) {
76
+ notificationService.acknowledge(n.id);
77
+ }
78
+ expect(pending.length).toBe(2);
79
+ });
80
+ });
81
+ describe('cross-brain.notify → notification storage', () => {
82
+ it('stores cross-brain notifications with proper type prefix', () => {
83
+ // Simulate cross-brain.notify handler
84
+ const params = {
85
+ source: 'trading-brain',
86
+ event: 'position:closed',
87
+ data: { pnl: 42.5, pnlPct: 2.1, symbol: 'BTC/USDT' },
88
+ timestamp: new Date().toISOString(),
89
+ };
90
+ notificationService.create({
91
+ type: `cross-brain:${params.source}`,
92
+ title: params.event,
93
+ message: JSON.stringify(params.data ?? {}),
94
+ priority: params.data?.priority ?? 0,
95
+ });
96
+ const pending = notificationService.list();
97
+ expect(pending).toHaveLength(1);
98
+ expect(pending[0].type).toBe('cross-brain:trading-brain');
99
+ expect(pending[0].title).toBe('position:closed');
100
+ const msg = JSON.parse(pending[0].message);
101
+ expect(msg.pnl).toBe(42.5);
102
+ expect(msg.symbol).toBe('BTC/USDT');
103
+ });
104
+ it('stores marketing-brain notifications', () => {
105
+ const params = {
106
+ source: 'marketing-brain',
107
+ event: 'rule:learned',
108
+ data: { ruleId: 5, pattern: 'post at 9am', summary: 'New marketing rule: "post at 9am"' },
109
+ timestamp: new Date().toISOString(),
110
+ };
111
+ notificationService.create({
112
+ type: `cross-brain:${params.source}`,
113
+ title: params.event,
114
+ message: JSON.stringify(params.data ?? {}),
115
+ });
116
+ const pending = notificationService.list();
117
+ expect(pending).toHaveLength(1);
118
+ expect(pending[0].type).toBe('cross-brain:marketing-brain');
119
+ const msg = JSON.parse(pending[0].message);
120
+ expect(msg.pattern).toBe('post at 9am');
121
+ });
122
+ it('handles data with priority', () => {
123
+ notificationService.create({
124
+ type: 'cross-brain:trading-brain',
125
+ title: 'urgent:alert',
126
+ message: JSON.stringify({ priority: 5, msg: 'Flash crash' }),
127
+ priority: 5,
128
+ });
129
+ const pending = notificationService.list();
130
+ expect(pending[0].priority).toBe(5);
131
+ });
132
+ });
133
+ describe('selfmod → notification flow', () => {
134
+ it('creates notifications from self-improvement suggestions', () => {
135
+ const suggestions = [
136
+ 'Tell Claude: Extract common IPC patterns into shared helper',
137
+ 'Tell Claude: Add retry logic to price fetcher',
138
+ ];
139
+ // Simulate the onSuggestion callback from brain.ts
140
+ for (const s of suggestions) {
141
+ notificationService.create({
142
+ type: 'selfmod',
143
+ title: 'Self-improvement suggestion',
144
+ message: JSON.stringify({ summary: s }),
145
+ });
146
+ }
147
+ const pending = notificationService.list();
148
+ expect(pending).toHaveLength(2);
149
+ expect(pending[0].type).toBe('selfmod');
150
+ const msg0 = JSON.parse(pending[0].message);
151
+ expect(msg0.summary).toContain('Extract common IPC patterns');
152
+ });
153
+ });
154
+ });
155
+ //# sourceMappingURL=notification-bridge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-bridge.test.js","sourceRoot":"","sources":["../../../src/ipc/__tests__/notification-bridge.test.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,8 @@ import type { ThoughtStream, ConsciousnessServer } from '@timmeck/brain-core';
38
38
  import type { PredictionEngine } from '@timmeck/brain-core';
39
39
  import type { ResearchOrchestrator } from '@timmeck/brain-core';
40
40
  import type { SignalScanner } from '@timmeck/brain-core';
41
+ import type { TechRadarEngine } from '@timmeck/brain-core';
42
+ import type { NotificationService as MultiChannelNotificationService } from '@timmeck/brain-core';
41
43
  import type { CodeGenerator } from '@timmeck/brain-core';
42
44
  import type { CodeMiner } from '@timmeck/brain-core';
43
45
  import type { PatternExtractor } from '@timmeck/brain-core';
@@ -85,6 +87,8 @@ export interface Services {
85
87
  predictionEngine?: PredictionEngine;
86
88
  orchestrator?: ResearchOrchestrator;
87
89
  signalScanner?: SignalScanner;
90
+ techRadar?: TechRadarEngine;
91
+ multiChannelNotifications?: MultiChannelNotificationService;
88
92
  codeGenerator?: CodeGenerator;
89
93
  codeMiner?: CodeMiner;
90
94
  patternExtractor?: PatternExtractor;
@@ -113,6 +117,7 @@ export interface Services {
113
117
  conceptAbstraction?: import('@timmeck/brain-core').ConceptAbstraction;
114
118
  peerNetwork?: import('@timmeck/brain-core').PeerNetwork;
115
119
  llmService?: import('@timmeck/brain-core').LLMService;
120
+ missionEngine?: import('@timmeck/brain-core').ResearchMissionEngine;
116
121
  projectScanner?: ProjectScanner;
117
122
  reposignalImporter?: ReposignalImporter;
118
123
  }