@timmeck/brain-core 2.36.12 → 2.36.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/command-center.html +955 -0
- package/dist/cross-brain/__tests__/borg-sync-engine.test.d.ts +1 -0
- package/dist/cross-brain/__tests__/borg-sync-engine.test.js +240 -0
- package/dist/cross-brain/__tests__/borg-sync-engine.test.js.map +1 -0
- package/dist/cross-brain/borg-sync-engine.d.ts +62 -0
- package/dist/cross-brain/borg-sync-engine.js +215 -0
- package/dist/cross-brain/borg-sync-engine.js.map +1 -0
- package/dist/cross-brain/borg-types.d.ts +37 -0
- package/dist/cross-brain/borg-types.js +9 -0
- package/dist/cross-brain/borg-types.js.map +1 -0
- package/dist/dashboard/__tests__/command-center-server.test.d.ts +1 -0
- package/dist/dashboard/__tests__/command-center-server.test.js +298 -0
- package/dist/dashboard/__tests__/command-center-server.test.js.map +1 -0
- package/dist/dashboard/command-center-server.d.ts +38 -0
- package/dist/dashboard/command-center-server.js +289 -0
- package/dist/dashboard/command-center-server.js.map +1 -0
- package/dist/embeddings/engine.js +2 -1
- package/dist/embeddings/engine.js.map +1 -1
- package/dist/index.d.ts +20 -1
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/llm/__tests__/anthropic-provider.test.d.ts +1 -0
- package/dist/llm/__tests__/anthropic-provider.test.js +121 -0
- package/dist/llm/__tests__/anthropic-provider.test.js.map +1 -0
- package/dist/llm/__tests__/llm-service.test.js +181 -40
- package/dist/llm/__tests__/llm-service.test.js.map +1 -1
- package/dist/llm/__tests__/ollama-embedding.test.d.ts +1 -0
- package/dist/llm/__tests__/ollama-embedding.test.js +128 -0
- package/dist/llm/__tests__/ollama-embedding.test.js.map +1 -0
- package/dist/llm/__tests__/ollama-provider.test.d.ts +1 -0
- package/dist/llm/__tests__/ollama-provider.test.js +213 -0
- package/dist/llm/__tests__/ollama-provider.test.js.map +1 -0
- package/dist/llm/__tests__/provider.test.d.ts +1 -0
- package/dist/llm/__tests__/provider.test.js +126 -0
- package/dist/llm/__tests__/provider.test.js.map +1 -0
- package/dist/llm/anthropic-provider.d.ts +41 -0
- package/dist/llm/anthropic-provider.js +86 -0
- package/dist/llm/anthropic-provider.js.map +1 -0
- package/dist/llm/index.d.ts +9 -1
- package/dist/llm/index.js +4 -0
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/llm-service.d.ts +55 -7
- package/dist/llm/llm-service.js +184 -82
- package/dist/llm/llm-service.js.map +1 -1
- package/dist/llm/ollama-embedding.d.ts +46 -0
- package/dist/llm/ollama-embedding.js +93 -0
- package/dist/llm/ollama-embedding.js.map +1 -0
- package/dist/llm/ollama-provider.d.ts +80 -0
- package/dist/llm/ollama-provider.js +178 -0
- package/dist/llm/ollama-provider.js.map +1 -0
- package/dist/llm/provider.d.ts +120 -0
- package/dist/llm/provider.js +104 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/missions/mission-engine.d.ts +4 -0
- package/dist/missions/mission-engine.js +30 -8
- package/dist/missions/mission-engine.js.map +1 -1
- package/dist/notifications/__tests__/notification-service.test.d.ts +1 -0
- package/dist/notifications/__tests__/notification-service.test.js +176 -0
- package/dist/notifications/__tests__/notification-service.test.js.map +1 -0
- package/dist/notifications/discord-provider.d.ts +30 -0
- package/dist/notifications/discord-provider.js +89 -0
- package/dist/notifications/discord-provider.js.map +1 -0
- package/dist/notifications/email-provider.d.ts +41 -0
- package/dist/notifications/email-provider.js +101 -0
- package/dist/notifications/email-provider.js.map +1 -0
- package/dist/notifications/index.d.ts +8 -0
- package/dist/notifications/index.js +5 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/notification-provider.d.ts +75 -0
- package/dist/notifications/notification-provider.js +47 -0
- package/dist/notifications/notification-provider.js.map +1 -0
- package/dist/notifications/notification-service.d.ts +85 -0
- package/dist/notifications/notification-service.js +184 -0
- package/dist/notifications/notification-service.js.map +1 -0
- package/dist/notifications/telegram-provider.d.ts +30 -0
- package/dist/notifications/telegram-provider.js +78 -0
- package/dist/notifications/telegram-provider.js.map +1 -0
- package/dist/plugin/__tests__/plugin-registry.test.d.ts +1 -0
- package/dist/plugin/__tests__/plugin-registry.test.js +166 -0
- package/dist/plugin/__tests__/plugin-registry.test.js.map +1 -0
- package/dist/plugin/plugin-registry.d.ts +38 -0
- package/dist/plugin/plugin-registry.js +185 -0
- package/dist/plugin/plugin-registry.js.map +1 -0
- package/dist/plugin/types.d.ts +59 -0
- package/dist/plugin/types.js +2 -0
- package/dist/plugin/types.js.map +1 -0
- package/dist/research/adapters/__tests__/web-adapters.test.d.ts +1 -0
- package/dist/research/adapters/__tests__/web-adapters.test.js +106 -0
- package/dist/research/adapters/__tests__/web-adapters.test.js.map +1 -0
- package/dist/research/adapters/firecrawl-adapter.d.ts +57 -0
- package/dist/research/adapters/firecrawl-adapter.js +137 -0
- package/dist/research/adapters/firecrawl-adapter.js.map +1 -0
- package/dist/research/adapters/index.d.ts +3 -0
- package/dist/research/adapters/index.js +2 -0
- package/dist/research/adapters/index.js.map +1 -1
- package/dist/research/adapters/playwright-adapter.d.ts +54 -0
- package/dist/research/adapters/playwright-adapter.js +130 -0
- package/dist/research/adapters/playwright-adapter.js.map +1 -0
- package/dist/research/research-orchestrator.d.ts +3 -0
- package/dist/research/research-orchestrator.js +19 -1
- package/dist/research/research-orchestrator.js.map +1 -1
- package/dist/techradar/__tests__/techradar-engine.test.d.ts +1 -0
- package/dist/techradar/__tests__/techradar-engine.test.js +246 -0
- package/dist/techradar/__tests__/techradar-engine.test.js.map +1 -0
- package/dist/techradar/daily-digest.d.ts +18 -0
- package/dist/techradar/daily-digest.js +100 -0
- package/dist/techradar/daily-digest.js.map +1 -0
- package/dist/techradar/index.d.ts +5 -0
- package/dist/techradar/index.js +5 -0
- package/dist/techradar/index.js.map +1 -0
- package/dist/techradar/relevance-scorer.d.ts +29 -0
- package/dist/techradar/relevance-scorer.js +139 -0
- package/dist/techradar/relevance-scorer.js.map +1 -0
- package/dist/techradar/repo-watcher.d.ts +24 -0
- package/dist/techradar/repo-watcher.js +87 -0
- package/dist/techradar/repo-watcher.js.map +1 -0
- package/dist/techradar/techradar-engine.d.ts +69 -0
- package/dist/techradar/techradar-engine.js +382 -0
- package/dist/techradar/techradar-engine.js.map +1 -0
- package/dist/techradar/types.d.ts +87 -0
- package/dist/techradar/types.js +5 -0
- package/dist/techradar/types.js.map +1 -0
- package/dist/watchdog/__tests__/watchdog-service.test.d.ts +1 -0
- package/dist/watchdog/__tests__/watchdog-service.test.js +113 -0
- package/dist/watchdog/__tests__/watchdog-service.test.js.map +1 -0
- package/dist/watchdog/watchdog-service.d.ts +60 -0
- package/dist/watchdog/watchdog-service.js +275 -0
- package/dist/watchdog/watchdog-service.js.map +1 -0
- package/dist/watchdog/windows-service.d.ts +39 -0
- package/dist/watchdog/windows-service.js +179 -0
- package/dist/watchdog/windows-service.js.map +1 -0
- package/package.json +20 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { BorgSyncEngine } from '../borg-sync-engine.js';
|
|
3
|
+
// Mock CrossBrainClient
|
|
4
|
+
function createMockClient() {
|
|
5
|
+
return {
|
|
6
|
+
broadcast: vi.fn().mockResolvedValue([]),
|
|
7
|
+
query: vi.fn().mockResolvedValue(null),
|
|
8
|
+
getAvailablePeers: vi.fn().mockResolvedValue([]),
|
|
9
|
+
getPeerNames: vi.fn().mockReturnValue(['trading-brain', 'marketing-brain']),
|
|
10
|
+
addPeer: vi.fn(),
|
|
11
|
+
removePeer: vi.fn(),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function createMockProvider(items = []) {
|
|
15
|
+
return {
|
|
16
|
+
getShareableItems: vi.fn().mockReturnValue(items),
|
|
17
|
+
importItems: vi.fn().mockReturnValue(0),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function makeItem(overrides = {}) {
|
|
21
|
+
return {
|
|
22
|
+
type: 'rule',
|
|
23
|
+
id: 'r1',
|
|
24
|
+
title: 'Test Rule',
|
|
25
|
+
content: 'Always test your code',
|
|
26
|
+
confidence: 0.8,
|
|
27
|
+
source: 'brain',
|
|
28
|
+
createdAt: new Date().toISOString(),
|
|
29
|
+
...overrides,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
describe('BorgSyncEngine', () => {
|
|
33
|
+
let client;
|
|
34
|
+
let provider;
|
|
35
|
+
beforeEach(() => {
|
|
36
|
+
client = createMockClient();
|
|
37
|
+
provider = createMockProvider();
|
|
38
|
+
vi.useFakeTimers();
|
|
39
|
+
});
|
|
40
|
+
it('starts disabled by default', () => {
|
|
41
|
+
const engine = new BorgSyncEngine('brain', client, provider);
|
|
42
|
+
const status = engine.getStatus();
|
|
43
|
+
expect(status.enabled).toBe(false);
|
|
44
|
+
expect(status.totalSyncs).toBe(0);
|
|
45
|
+
});
|
|
46
|
+
it('getConfig returns config copy', () => {
|
|
47
|
+
const engine = new BorgSyncEngine('brain', client, provider, { enabled: true });
|
|
48
|
+
const config = engine.getConfig();
|
|
49
|
+
expect(config.enabled).toBe(true);
|
|
50
|
+
expect(config.mode).toBe('selective');
|
|
51
|
+
expect(config.minConfidence).toBe(0.6);
|
|
52
|
+
});
|
|
53
|
+
it('setEnabled toggles borg mode', () => {
|
|
54
|
+
const engine = new BorgSyncEngine('brain', client, provider);
|
|
55
|
+
expect(engine.getConfig().enabled).toBe(false);
|
|
56
|
+
engine.setEnabled(true);
|
|
57
|
+
expect(engine.getConfig().enabled).toBe(true);
|
|
58
|
+
engine.setEnabled(false);
|
|
59
|
+
expect(engine.getConfig().enabled).toBe(false);
|
|
60
|
+
engine.stop(); // cleanup
|
|
61
|
+
});
|
|
62
|
+
it('updateConfig merges partial config', () => {
|
|
63
|
+
const engine = new BorgSyncEngine('brain', client, provider);
|
|
64
|
+
engine.updateConfig({ minConfidence: 0.9, mode: 'full' });
|
|
65
|
+
const config = engine.getConfig();
|
|
66
|
+
expect(config.minConfidence).toBe(0.9);
|
|
67
|
+
expect(config.mode).toBe('full');
|
|
68
|
+
});
|
|
69
|
+
it('filterOutgoing respects minConfidence', async () => {
|
|
70
|
+
const items = [
|
|
71
|
+
makeItem({ id: 'r1', confidence: 0.8 }),
|
|
72
|
+
makeItem({ id: 'r2', confidence: 0.3 }), // below threshold
|
|
73
|
+
];
|
|
74
|
+
provider = createMockProvider(items);
|
|
75
|
+
const engine = new BorgSyncEngine('brain', client, provider, { enabled: true });
|
|
76
|
+
client.broadcast.mockResolvedValue([
|
|
77
|
+
{ name: 'trading-brain', result: { accepted: 1, rejected: 0 } },
|
|
78
|
+
]);
|
|
79
|
+
await engine.syncCycle();
|
|
80
|
+
// Should have broadcast only the high-confidence item
|
|
81
|
+
expect(client.broadcast).toHaveBeenCalledWith('cross-brain.borgSync', expect.objectContaining({
|
|
82
|
+
items: expect.arrayContaining([
|
|
83
|
+
expect.objectContaining({ id: 'r1' }),
|
|
84
|
+
]),
|
|
85
|
+
}));
|
|
86
|
+
// The low-confidence item should not be included
|
|
87
|
+
const broadcastCall = client.broadcast.mock.calls[0];
|
|
88
|
+
const packet = broadcastCall[1];
|
|
89
|
+
expect(packet.items).toHaveLength(1);
|
|
90
|
+
expect(packet.items[0].id).toBe('r1');
|
|
91
|
+
engine.stop();
|
|
92
|
+
});
|
|
93
|
+
it('filterOutgoing in selective mode only shares configured types', async () => {
|
|
94
|
+
const items = [
|
|
95
|
+
makeItem({ id: 'r1', type: 'rule', confidence: 0.9 }),
|
|
96
|
+
makeItem({ id: 'p1', type: 'pattern', confidence: 0.9 }), // not in default shareTypes
|
|
97
|
+
];
|
|
98
|
+
provider = createMockProvider(items);
|
|
99
|
+
const engine = new BorgSyncEngine('brain', client, provider, {
|
|
100
|
+
enabled: true,
|
|
101
|
+
shareTypes: ['rule', 'insight'], // pattern not included
|
|
102
|
+
});
|
|
103
|
+
client.broadcast.mockResolvedValue([]);
|
|
104
|
+
await engine.syncCycle();
|
|
105
|
+
const call = client.broadcast.mock.calls[0];
|
|
106
|
+
const packet = call[1];
|
|
107
|
+
expect(packet.items).toHaveLength(1);
|
|
108
|
+
expect(packet.items[0].type).toBe('rule');
|
|
109
|
+
engine.stop();
|
|
110
|
+
});
|
|
111
|
+
it('filterOutgoing in full mode shares all types', async () => {
|
|
112
|
+
const items = [
|
|
113
|
+
makeItem({ id: 'r1', type: 'rule', confidence: 0.9 }),
|
|
114
|
+
makeItem({ id: 'p1', type: 'pattern', confidence: 0.9 }),
|
|
115
|
+
makeItem({ id: 'm1', type: 'memory', confidence: 0.9 }),
|
|
116
|
+
];
|
|
117
|
+
provider = createMockProvider(items);
|
|
118
|
+
const engine = new BorgSyncEngine('brain', client, provider, {
|
|
119
|
+
enabled: true,
|
|
120
|
+
mode: 'full',
|
|
121
|
+
});
|
|
122
|
+
client.broadcast.mockResolvedValue([]);
|
|
123
|
+
await engine.syncCycle();
|
|
124
|
+
const call = client.broadcast.mock.calls[0];
|
|
125
|
+
const packet = call[1];
|
|
126
|
+
expect(packet.items).toHaveLength(3);
|
|
127
|
+
engine.stop();
|
|
128
|
+
});
|
|
129
|
+
it('handleIncomingSync filters by relevanceThreshold and rejects own items', () => {
|
|
130
|
+
const engine = new BorgSyncEngine('brain', client, provider, {
|
|
131
|
+
enabled: true,
|
|
132
|
+
relevanceThreshold: 0.5,
|
|
133
|
+
});
|
|
134
|
+
provider.importItems.mockReturnValue(1);
|
|
135
|
+
const result = engine.handleIncomingSync({
|
|
136
|
+
source: 'trading-brain',
|
|
137
|
+
timestamp: new Date().toISOString(),
|
|
138
|
+
items: [
|
|
139
|
+
makeItem({ id: 'r1', source: 'trading-brain', confidence: 0.8 }), // accept
|
|
140
|
+
makeItem({ id: 'r2', source: 'brain', confidence: 0.9 }), // reject (own)
|
|
141
|
+
makeItem({ id: 'r3', source: 'trading-brain', confidence: 0.2 }), // reject (low confidence)
|
|
142
|
+
],
|
|
143
|
+
});
|
|
144
|
+
// importItems should be called with only the first item
|
|
145
|
+
expect(provider.importItems).toHaveBeenCalledWith([expect.objectContaining({ id: 'r1' })], 'trading-brain');
|
|
146
|
+
expect(result.accepted).toBe(1);
|
|
147
|
+
engine.stop();
|
|
148
|
+
});
|
|
149
|
+
it('handleIncomingSync returns all rejected when disabled', () => {
|
|
150
|
+
const engine = new BorgSyncEngine('brain', client, provider);
|
|
151
|
+
// Default: disabled
|
|
152
|
+
const result = engine.handleIncomingSync({
|
|
153
|
+
source: 'trading-brain',
|
|
154
|
+
timestamp: new Date().toISOString(),
|
|
155
|
+
items: [makeItem(), makeItem({ id: 'r2' })],
|
|
156
|
+
});
|
|
157
|
+
expect(result.accepted).toBe(0);
|
|
158
|
+
expect(result.rejected).toBe(2);
|
|
159
|
+
expect(provider.importItems).not.toHaveBeenCalled();
|
|
160
|
+
});
|
|
161
|
+
it('handleExportRequest returns shareable items when enabled', () => {
|
|
162
|
+
const items = [makeItem({ id: 'r1', confidence: 0.9 })];
|
|
163
|
+
provider = createMockProvider(items);
|
|
164
|
+
const engine = new BorgSyncEngine('brain', client, provider, { enabled: true });
|
|
165
|
+
const packet = engine.handleExportRequest();
|
|
166
|
+
expect(packet.source).toBe('brain');
|
|
167
|
+
expect(packet.items).toHaveLength(1);
|
|
168
|
+
expect(packet.items[0].id).toBe('r1');
|
|
169
|
+
});
|
|
170
|
+
it('handleExportRequest returns empty when disabled', () => {
|
|
171
|
+
const items = [makeItem({ id: 'r1', confidence: 0.9 })];
|
|
172
|
+
provider = createMockProvider(items);
|
|
173
|
+
const engine = new BorgSyncEngine('brain', client, provider);
|
|
174
|
+
const packet = engine.handleExportRequest();
|
|
175
|
+
expect(packet.items).toHaveLength(0);
|
|
176
|
+
});
|
|
177
|
+
it('tracks sync history', () => {
|
|
178
|
+
const engine = new BorgSyncEngine('brain', client, provider, { enabled: true });
|
|
179
|
+
engine.handleIncomingSync({
|
|
180
|
+
source: 'trading-brain',
|
|
181
|
+
timestamp: new Date().toISOString(),
|
|
182
|
+
items: [makeItem({ source: 'trading-brain' })],
|
|
183
|
+
});
|
|
184
|
+
const history = engine.getHistory();
|
|
185
|
+
expect(history).toHaveLength(1);
|
|
186
|
+
expect(history[0].direction).toBe('received');
|
|
187
|
+
expect(history[0].peer).toBe('trading-brain');
|
|
188
|
+
});
|
|
189
|
+
it('getStatus returns summary', () => {
|
|
190
|
+
const engine = new BorgSyncEngine('brain', client, provider, { enabled: true });
|
|
191
|
+
engine.handleIncomingSync({
|
|
192
|
+
source: 'trading-brain',
|
|
193
|
+
timestamp: new Date().toISOString(),
|
|
194
|
+
items: [makeItem({ source: 'trading-brain' })],
|
|
195
|
+
});
|
|
196
|
+
const status = engine.getStatus();
|
|
197
|
+
expect(status.enabled).toBe(true);
|
|
198
|
+
expect(status.mode).toBe('selective');
|
|
199
|
+
expect(status.totalSyncs).toBe(1);
|
|
200
|
+
expect(status.lastSync).toBeTruthy();
|
|
201
|
+
});
|
|
202
|
+
it('syncCycle does nothing when disabled', async () => {
|
|
203
|
+
const engine = new BorgSyncEngine('brain', client, provider);
|
|
204
|
+
await engine.syncCycle();
|
|
205
|
+
expect(client.broadcast).not.toHaveBeenCalled();
|
|
206
|
+
});
|
|
207
|
+
it('syncCycle pulls from peers and imports', async () => {
|
|
208
|
+
const items = [makeItem({ id: 'local1', confidence: 0.9 })];
|
|
209
|
+
provider = createMockProvider(items);
|
|
210
|
+
provider.importItems.mockReturnValue(2);
|
|
211
|
+
const engine = new BorgSyncEngine('brain', client, provider, { enabled: true });
|
|
212
|
+
// First broadcast call (borgSync) returns empty
|
|
213
|
+
// Second broadcast call (borgExport) returns peer data
|
|
214
|
+
client.broadcast
|
|
215
|
+
.mockResolvedValueOnce([{ name: 'trading-brain', result: { accepted: 1, rejected: 0 } }])
|
|
216
|
+
.mockResolvedValueOnce([{
|
|
217
|
+
name: 'trading-brain',
|
|
218
|
+
result: {
|
|
219
|
+
source: 'trading-brain',
|
|
220
|
+
timestamp: new Date().toISOString(),
|
|
221
|
+
items: [
|
|
222
|
+
makeItem({ id: 'peer1', source: 'trading-brain', confidence: 0.7 }),
|
|
223
|
+
makeItem({ id: 'peer2', source: 'trading-brain', confidence: 0.8 }),
|
|
224
|
+
],
|
|
225
|
+
},
|
|
226
|
+
}]);
|
|
227
|
+
await engine.syncCycle();
|
|
228
|
+
// Should have called broadcast twice: borgSync and borgExport
|
|
229
|
+
expect(client.broadcast).toHaveBeenCalledTimes(2);
|
|
230
|
+
expect(client.broadcast).toHaveBeenCalledWith('cross-brain.borgSync', expect.any(Object));
|
|
231
|
+
expect(client.broadcast).toHaveBeenCalledWith('cross-brain.borgExport', expect.any(Object));
|
|
232
|
+
// Should have imported peer items
|
|
233
|
+
expect(provider.importItems).toHaveBeenCalledWith(expect.arrayContaining([
|
|
234
|
+
expect.objectContaining({ id: 'peer1' }),
|
|
235
|
+
expect.objectContaining({ id: 'peer2' }),
|
|
236
|
+
]), 'trading-brain');
|
|
237
|
+
engine.stop();
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
//# sourceMappingURL=borg-sync-engine.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"borg-sync-engine.test.js","sourceRoot":"","sources":["../../../src/cross-brain/__tests__/borg-sync-engine.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { CrossBrainClient } from './client.js';
|
|
2
|
+
import type { BorgConfig, SyncPacket, SyncItem, SyncHistoryEntry } from './borg-types.js';
|
|
3
|
+
export interface BorgDataProvider {
|
|
4
|
+
/** Return local items available for sharing. */
|
|
5
|
+
getShareableItems(): SyncItem[];
|
|
6
|
+
/** Import items received from a peer. Return count of accepted items. */
|
|
7
|
+
importItems(items: SyncItem[], source: string): number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* BorgSyncEngine — collective knowledge synchronization between brains.
|
|
11
|
+
*
|
|
12
|
+
* Opt-in. When enabled, periodically broadcasts local knowledge (rules, insights,
|
|
13
|
+
* patterns, memories) to peer brains and imports their knowledge back.
|
|
14
|
+
* Filtering by type, confidence, and relevance threshold.
|
|
15
|
+
*/
|
|
16
|
+
export declare class BorgSyncEngine {
|
|
17
|
+
private brainName;
|
|
18
|
+
private crossBrain;
|
|
19
|
+
private dataProvider;
|
|
20
|
+
private logger;
|
|
21
|
+
private config;
|
|
22
|
+
private timer;
|
|
23
|
+
private history;
|
|
24
|
+
private maxHistory;
|
|
25
|
+
constructor(brainName: string, crossBrain: CrossBrainClient, dataProvider: BorgDataProvider, config?: Partial<BorgConfig>);
|
|
26
|
+
/** Start the periodic sync loop (if enabled). */
|
|
27
|
+
start(): void;
|
|
28
|
+
/** Stop the sync loop. */
|
|
29
|
+
stop(): void;
|
|
30
|
+
/** Enable or disable Borg mode at runtime. */
|
|
31
|
+
setEnabled(enabled: boolean): void;
|
|
32
|
+
/** Update config at runtime. */
|
|
33
|
+
updateConfig(partial: Partial<BorgConfig>): void;
|
|
34
|
+
/** Get current config. */
|
|
35
|
+
getConfig(): BorgConfig;
|
|
36
|
+
/** Get sync history. */
|
|
37
|
+
getHistory(limit?: number): SyncHistoryEntry[];
|
|
38
|
+
/** Get status summary. */
|
|
39
|
+
getStatus(): {
|
|
40
|
+
enabled: boolean;
|
|
41
|
+
mode: string;
|
|
42
|
+
syncIntervalMs: number;
|
|
43
|
+
totalSyncs: number;
|
|
44
|
+
totalSent: number;
|
|
45
|
+
totalReceived: number;
|
|
46
|
+
lastSync: string | null;
|
|
47
|
+
};
|
|
48
|
+
/** Run one sync cycle: broadcast own knowledge, then pull from peers. */
|
|
49
|
+
syncCycle(): Promise<void>;
|
|
50
|
+
/** Handle incoming borgSync from a peer. */
|
|
51
|
+
handleIncomingSync(packet: SyncPacket): {
|
|
52
|
+
accepted: number;
|
|
53
|
+
rejected: number;
|
|
54
|
+
};
|
|
55
|
+
/** Handle borgExport request — return our shareable items as a SyncPacket. */
|
|
56
|
+
handleExportRequest(): SyncPacket;
|
|
57
|
+
/** Filter items before sending: apply mode, type, and confidence filters. */
|
|
58
|
+
private filterOutgoing;
|
|
59
|
+
/** Filter items before importing: apply relevance threshold. */
|
|
60
|
+
private filterIncoming;
|
|
61
|
+
private addHistory;
|
|
62
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { getLogger } from '../utils/logger.js';
|
|
2
|
+
import { DEFAULT_BORG_CONFIG } from './borg-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* BorgSyncEngine — collective knowledge synchronization between brains.
|
|
5
|
+
*
|
|
6
|
+
* Opt-in. When enabled, periodically broadcasts local knowledge (rules, insights,
|
|
7
|
+
* patterns, memories) to peer brains and imports their knowledge back.
|
|
8
|
+
* Filtering by type, confidence, and relevance threshold.
|
|
9
|
+
*/
|
|
10
|
+
export class BorgSyncEngine {
|
|
11
|
+
brainName;
|
|
12
|
+
crossBrain;
|
|
13
|
+
dataProvider;
|
|
14
|
+
logger = getLogger();
|
|
15
|
+
config;
|
|
16
|
+
timer = null;
|
|
17
|
+
history = [];
|
|
18
|
+
maxHistory = 200;
|
|
19
|
+
constructor(brainName, crossBrain, dataProvider, config) {
|
|
20
|
+
this.brainName = brainName;
|
|
21
|
+
this.crossBrain = crossBrain;
|
|
22
|
+
this.dataProvider = dataProvider;
|
|
23
|
+
this.config = { ...DEFAULT_BORG_CONFIG, ...config };
|
|
24
|
+
}
|
|
25
|
+
/** Start the periodic sync loop (if enabled). */
|
|
26
|
+
start() {
|
|
27
|
+
if (!this.config.enabled) {
|
|
28
|
+
this.logger.debug('Borg sync disabled — skipping');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this.logger.info(`Borg sync started (mode: ${this.config.mode}, interval: ${this.config.syncIntervalMs}ms)`);
|
|
32
|
+
this.timer = setInterval(() => {
|
|
33
|
+
this.syncCycle().catch(err => {
|
|
34
|
+
this.logger.error(`Borg sync cycle error: ${err.message}`);
|
|
35
|
+
});
|
|
36
|
+
}, this.config.syncIntervalMs);
|
|
37
|
+
// Initial sync after short delay
|
|
38
|
+
setTimeout(() => {
|
|
39
|
+
this.syncCycle().catch(() => { });
|
|
40
|
+
}, 5000);
|
|
41
|
+
}
|
|
42
|
+
/** Stop the sync loop. */
|
|
43
|
+
stop() {
|
|
44
|
+
if (this.timer) {
|
|
45
|
+
clearInterval(this.timer);
|
|
46
|
+
this.timer = null;
|
|
47
|
+
this.logger.info('Borg sync stopped');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Enable or disable Borg mode at runtime. */
|
|
51
|
+
setEnabled(enabled) {
|
|
52
|
+
const wasEnabled = this.config.enabled;
|
|
53
|
+
this.config.enabled = enabled;
|
|
54
|
+
if (enabled && !wasEnabled) {
|
|
55
|
+
this.start();
|
|
56
|
+
}
|
|
57
|
+
else if (!enabled && wasEnabled) {
|
|
58
|
+
this.stop();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** Update config at runtime. */
|
|
62
|
+
updateConfig(partial) {
|
|
63
|
+
const wasEnabled = this.config.enabled;
|
|
64
|
+
this.config = { ...this.config, ...partial };
|
|
65
|
+
// Restart timer if interval changed and was running
|
|
66
|
+
if (wasEnabled && this.config.enabled && this.timer) {
|
|
67
|
+
this.stop();
|
|
68
|
+
this.start();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Get current config. */
|
|
72
|
+
getConfig() {
|
|
73
|
+
return { ...this.config };
|
|
74
|
+
}
|
|
75
|
+
/** Get sync history. */
|
|
76
|
+
getHistory(limit = 50) {
|
|
77
|
+
return this.history.slice(-limit);
|
|
78
|
+
}
|
|
79
|
+
/** Get status summary. */
|
|
80
|
+
getStatus() {
|
|
81
|
+
const sent = this.history.filter(h => h.direction === 'sent');
|
|
82
|
+
const received = this.history.filter(h => h.direction === 'received');
|
|
83
|
+
return {
|
|
84
|
+
enabled: this.config.enabled,
|
|
85
|
+
mode: this.config.mode,
|
|
86
|
+
syncIntervalMs: this.config.syncIntervalMs,
|
|
87
|
+
totalSyncs: this.history.length,
|
|
88
|
+
totalSent: sent.reduce((s, h) => s + h.itemCount, 0),
|
|
89
|
+
totalReceived: received.reduce((s, h) => s + h.accepted, 0),
|
|
90
|
+
lastSync: this.history.length > 0 ? this.history[this.history.length - 1].timestamp : null,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** Run one sync cycle: broadcast own knowledge, then pull from peers. */
|
|
94
|
+
async syncCycle() {
|
|
95
|
+
if (!this.config.enabled)
|
|
96
|
+
return;
|
|
97
|
+
// 1. Gather local items to share
|
|
98
|
+
const allItems = this.dataProvider.getShareableItems();
|
|
99
|
+
const filtered = this.filterOutgoing(allItems);
|
|
100
|
+
if (filtered.length > 0) {
|
|
101
|
+
const packet = {
|
|
102
|
+
source: this.brainName,
|
|
103
|
+
timestamp: new Date().toISOString(),
|
|
104
|
+
items: filtered,
|
|
105
|
+
};
|
|
106
|
+
// Broadcast to all peers
|
|
107
|
+
try {
|
|
108
|
+
const results = await this.crossBrain.broadcast('cross-brain.borgSync', packet);
|
|
109
|
+
for (const r of results) {
|
|
110
|
+
const res = r.result;
|
|
111
|
+
this.addHistory({
|
|
112
|
+
timestamp: new Date().toISOString(),
|
|
113
|
+
direction: 'sent',
|
|
114
|
+
peer: r.name,
|
|
115
|
+
itemCount: filtered.length,
|
|
116
|
+
accepted: res?.accepted ?? 0,
|
|
117
|
+
rejected: res?.rejected ?? 0,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
this.logger.debug('Borg broadcast failed (peers may be offline)');
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// 2. Pull from peers
|
|
126
|
+
try {
|
|
127
|
+
const peerResults = await this.crossBrain.broadcast('cross-brain.borgExport', {
|
|
128
|
+
requester: this.brainName,
|
|
129
|
+
});
|
|
130
|
+
for (const r of peerResults) {
|
|
131
|
+
const packet = r.result;
|
|
132
|
+
if (!packet?.items?.length)
|
|
133
|
+
continue;
|
|
134
|
+
const incoming = this.filterIncoming(packet.items);
|
|
135
|
+
const accepted = this.dataProvider.importItems(incoming, r.name);
|
|
136
|
+
this.addHistory({
|
|
137
|
+
timestamp: new Date().toISOString(),
|
|
138
|
+
direction: 'received',
|
|
139
|
+
peer: r.name,
|
|
140
|
+
itemCount: packet.items.length,
|
|
141
|
+
accepted,
|
|
142
|
+
rejected: incoming.length - accepted,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
this.logger.debug('Borg pull failed (peers may be offline)');
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/** Handle incoming borgSync from a peer. */
|
|
151
|
+
handleIncomingSync(packet) {
|
|
152
|
+
if (!this.config.enabled) {
|
|
153
|
+
return { accepted: 0, rejected: packet.items?.length ?? 0 };
|
|
154
|
+
}
|
|
155
|
+
const items = this.filterIncoming(packet.items ?? []);
|
|
156
|
+
const accepted = this.dataProvider.importItems(items, packet.source);
|
|
157
|
+
this.addHistory({
|
|
158
|
+
timestamp: new Date().toISOString(),
|
|
159
|
+
direction: 'received',
|
|
160
|
+
peer: packet.source,
|
|
161
|
+
itemCount: packet.items?.length ?? 0,
|
|
162
|
+
accepted,
|
|
163
|
+
rejected: (packet.items?.length ?? 0) - accepted,
|
|
164
|
+
});
|
|
165
|
+
return { accepted, rejected: (packet.items?.length ?? 0) - accepted };
|
|
166
|
+
}
|
|
167
|
+
/** Handle borgExport request — return our shareable items as a SyncPacket. */
|
|
168
|
+
handleExportRequest() {
|
|
169
|
+
const items = this.config.enabled
|
|
170
|
+
? this.filterOutgoing(this.dataProvider.getShareableItems())
|
|
171
|
+
: [];
|
|
172
|
+
return {
|
|
173
|
+
source: this.brainName,
|
|
174
|
+
timestamp: new Date().toISOString(),
|
|
175
|
+
items,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/** Filter items before sending: apply mode, type, and confidence filters. */
|
|
179
|
+
filterOutgoing(items) {
|
|
180
|
+
return items.filter(item => {
|
|
181
|
+
// Confidence gate
|
|
182
|
+
if (item.confidence < this.config.minConfidence)
|
|
183
|
+
return false;
|
|
184
|
+
// Selective mode: only share configured types
|
|
185
|
+
if (this.config.mode === 'selective') {
|
|
186
|
+
return this.config.shareTypes.includes(item.type);
|
|
187
|
+
}
|
|
188
|
+
// Full mode: share everything
|
|
189
|
+
return true;
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
/** Filter items before importing: apply relevance threshold. */
|
|
193
|
+
filterIncoming(items) {
|
|
194
|
+
return items.filter(item => {
|
|
195
|
+
// Don't import our own items back
|
|
196
|
+
if (item.source === this.brainName)
|
|
197
|
+
return false;
|
|
198
|
+
// Confidence must meet our threshold
|
|
199
|
+
if (item.confidence < this.config.relevanceThreshold)
|
|
200
|
+
return false;
|
|
201
|
+
// Selective mode: only accept configured types
|
|
202
|
+
if (this.config.mode === 'selective') {
|
|
203
|
+
return this.config.shareTypes.includes(item.type);
|
|
204
|
+
}
|
|
205
|
+
return true;
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
addHistory(entry) {
|
|
209
|
+
this.history.push(entry);
|
|
210
|
+
if (this.history.length > this.maxHistory) {
|
|
211
|
+
this.history = this.history.slice(-this.maxHistory);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=borg-sync-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"borg-sync-engine.js","sourceRoot":"","sources":["../../src/cross-brain/borg-sync-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface BorgConfig {
|
|
2
|
+
enabled: boolean;
|
|
3
|
+
/** 'selective' = only shareTypes, 'full' = everything */
|
|
4
|
+
mode: 'selective' | 'full';
|
|
5
|
+
/** Sync interval in milliseconds. */
|
|
6
|
+
syncIntervalMs: number;
|
|
7
|
+
/** Only share these types in selective mode. */
|
|
8
|
+
shareTypes: string[];
|
|
9
|
+
/** Minimum confidence to share a rule/insight. */
|
|
10
|
+
minConfidence: number;
|
|
11
|
+
/** Minimum relevance score (0-1) to import from peers. */
|
|
12
|
+
relevanceThreshold: number;
|
|
13
|
+
}
|
|
14
|
+
export declare const DEFAULT_BORG_CONFIG: BorgConfig;
|
|
15
|
+
export interface SyncPacket {
|
|
16
|
+
source: string;
|
|
17
|
+
timestamp: string;
|
|
18
|
+
items: SyncItem[];
|
|
19
|
+
}
|
|
20
|
+
export interface SyncItem {
|
|
21
|
+
type: 'rule' | 'insight' | 'pattern' | 'memory';
|
|
22
|
+
id: string;
|
|
23
|
+
title: string;
|
|
24
|
+
content: string;
|
|
25
|
+
confidence: number;
|
|
26
|
+
source: string;
|
|
27
|
+
createdAt: string;
|
|
28
|
+
metadata?: Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
export interface SyncHistoryEntry {
|
|
31
|
+
timestamp: string;
|
|
32
|
+
direction: 'sent' | 'received';
|
|
33
|
+
peer: string;
|
|
34
|
+
itemCount: number;
|
|
35
|
+
accepted: number;
|
|
36
|
+
rejected: number;
|
|
37
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"borg-types.js","sourceRoot":"","sources":["../../src/cross-brain/borg-types.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,WAAW;IACjB,cAAc,EAAE,MAAM;IACtB,UAAU,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;IAC/B,aAAa,EAAE,GAAG;IAClB,kBAAkB,EAAE,GAAG;CACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|