@timmeck/brain-core 2.36.62 → 2.36.63
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/dist/guardrails/guardrail-engine.d.ts +2 -0
- package/dist/guardrails/guardrail-engine.js +17 -9
- package/dist/guardrails/guardrail-engine.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/memory-watchdog.d.ts +33 -0
- package/dist/utils/memory-watchdog.js +88 -0
- package/dist/utils/memory-watchdog.js.map +1 -0
- package/package.json +1 -1
- package/dist/action/__tests__/action-bridge.test.d.ts +0 -1
- package/dist/action/__tests__/action-bridge.test.js +0 -175
- package/dist/action/__tests__/action-bridge.test.js.map +0 -1
- package/dist/action/__tests__/adjust-parameter-handler.test.d.ts +0 -1
- package/dist/action/__tests__/adjust-parameter-handler.test.js +0 -138
- package/dist/action/__tests__/adjust-parameter-handler.test.js.map +0 -1
- package/dist/action/__tests__/content-handler.test.d.ts +0 -1
- package/dist/action/__tests__/content-handler.test.js +0 -100
- package/dist/action/__tests__/content-handler.test.js.map +0 -1
- package/dist/action/__tests__/creative-seed-handler.test.d.ts +0 -1
- package/dist/action/__tests__/creative-seed-handler.test.js +0 -96
- package/dist/action/__tests__/creative-seed-handler.test.js.map +0 -1
- package/dist/action/__tests__/trade-handler.test.d.ts +0 -1
- package/dist/action/__tests__/trade-handler.test.js +0 -165
- package/dist/action/__tests__/trade-handler.test.js.map +0 -1
- package/dist/active-learning/__tests__/active-learning.test.d.ts +0 -1
- package/dist/active-learning/__tests__/active-learning.test.js +0 -132
- package/dist/active-learning/__tests__/active-learning.test.js.map +0 -1
- package/dist/agent-training/__tests__/agent-trainer.test.d.ts +0 -1
- package/dist/agent-training/__tests__/agent-trainer.test.js +0 -158
- package/dist/agent-training/__tests__/agent-trainer.test.js.map +0 -1
- package/dist/agent-training/__tests__/sub-agent-factory.test.d.ts +0 -1
- package/dist/agent-training/__tests__/sub-agent-factory.test.js +0 -100
- package/dist/agent-training/__tests__/sub-agent-factory.test.js.map +0 -1
- package/dist/agent-training/__tests__/sub-agent.test.d.ts +0 -1
- package/dist/agent-training/__tests__/sub-agent.test.js +0 -102
- package/dist/agent-training/__tests__/sub-agent.test.js.map +0 -1
- package/dist/chat/__tests__/chat-engine.test.d.ts +0 -1
- package/dist/chat/__tests__/chat-engine.test.js +0 -209
- package/dist/chat/__tests__/chat-engine.test.js.map +0 -1
- package/dist/checkpoint/__tests__/checkpoint-manager.test.d.ts +0 -1
- package/dist/checkpoint/__tests__/checkpoint-manager.test.js +0 -160
- package/dist/checkpoint/__tests__/checkpoint-manager.test.js.map +0 -1
- package/dist/code-health/__tests__/code-health.test.d.ts +0 -1
- package/dist/code-health/__tests__/code-health.test.js +0 -123
- package/dist/code-health/__tests__/code-health.test.js.map +0 -1
- package/dist/codegen/__tests__/code-forge.test.d.ts +0 -1
- package/dist/codegen/__tests__/code-forge.test.js +0 -105
- package/dist/codegen/__tests__/code-forge.test.js.map +0 -1
- package/dist/config/__tests__/loader.test.d.ts +0 -1
- package/dist/config/__tests__/loader.test.js +0 -86
- package/dist/config/__tests__/loader.test.js.map +0 -1
- package/dist/consciousness/__tests__/thought-stream.test.d.ts +0 -1
- package/dist/consciousness/__tests__/thought-stream.test.js +0 -62
- package/dist/consciousness/__tests__/thought-stream.test.js.map +0 -1
- package/dist/consensus/__tests__/consensus.test.d.ts +0 -1
- package/dist/consensus/__tests__/consensus.test.js +0 -159
- package/dist/consensus/__tests__/consensus.test.js.map +0 -1
- package/dist/content/__tests__/auto-publisher.test.d.ts +0 -1
- package/dist/content/__tests__/auto-publisher.test.js +0 -125
- package/dist/content/__tests__/auto-publisher.test.js.map +0 -1
- package/dist/content/__tests__/content-forge.test.d.ts +0 -1
- package/dist/content/__tests__/content-forge.test.js +0 -117
- package/dist/content/__tests__/content-forge.test.js.map +0 -1
- package/dist/creative/__tests__/creative-engine.test.d.ts +0 -1
- package/dist/creative/__tests__/creative-engine.test.js +0 -229
- package/dist/creative/__tests__/creative-engine.test.js.map +0 -1
- package/dist/cross-brain/__tests__/borg-sync-engine.test.d.ts +0 -1
- package/dist/cross-brain/__tests__/borg-sync-engine.test.js +0 -240
- package/dist/cross-brain/__tests__/borg-sync-engine.test.js.map +0 -1
- package/dist/cross-brain/__tests__/client.test.d.ts +0 -1
- package/dist/cross-brain/__tests__/client.test.js +0 -31
- package/dist/cross-brain/__tests__/client.test.js.map +0 -1
- package/dist/cross-brain/__tests__/notifications.test.d.ts +0 -1
- package/dist/cross-brain/__tests__/notifications.test.js +0 -52
- package/dist/cross-brain/__tests__/notifications.test.js.map +0 -1
- package/dist/cross-brain/__tests__/signal-router.test.d.ts +0 -1
- package/dist/cross-brain/__tests__/signal-router.test.js +0 -218
- package/dist/cross-brain/__tests__/signal-router.test.js.map +0 -1
- package/dist/cross-brain/__tests__/subscription.test.d.ts +0 -1
- package/dist/cross-brain/__tests__/subscription.test.js +0 -75
- package/dist/cross-brain/__tests__/subscription.test.js.map +0 -1
- package/dist/dashboard/__tests__/command-center-server.test.d.ts +0 -1
- package/dist/dashboard/__tests__/command-center-server.test.js +0 -522
- package/dist/dashboard/__tests__/command-center-server.test.js.map +0 -1
- package/dist/dashboard/__tests__/server.test.d.ts +0 -1
- package/dist/dashboard/__tests__/server.test.js +0 -105
- package/dist/dashboard/__tests__/server.test.js.map +0 -1
- package/dist/db/__tests__/connection.test.d.ts +0 -1
- package/dist/db/__tests__/connection.test.js +0 -135
- package/dist/db/__tests__/connection.test.js.map +0 -1
- package/dist/dream/__tests__/dream-engine.test.d.ts +0 -1
- package/dist/dream/__tests__/dream-engine.test.js +0 -184
- package/dist/dream/__tests__/dream-engine.test.js.map +0 -1
- package/dist/embeddings/__tests__/engine.test.d.ts +0 -1
- package/dist/embeddings/__tests__/engine.test.js +0 -82
- package/dist/embeddings/__tests__/engine.test.js.map +0 -1
- package/dist/feedback/__tests__/feedback-engine.test.d.ts +0 -1
- package/dist/feedback/__tests__/feedback-engine.test.js +0 -156
- package/dist/feedback/__tests__/feedback-engine.test.js.map +0 -1
- package/dist/feedback/__tests__/feedback-router.test.d.ts +0 -1
- package/dist/feedback/__tests__/feedback-router.test.js +0 -173
- package/dist/feedback/__tests__/feedback-router.test.js.map +0 -1
- package/dist/goals/__tests__/goal-engine.test.d.ts +0 -1
- package/dist/goals/__tests__/goal-engine.test.js +0 -203
- package/dist/goals/__tests__/goal-engine.test.js.map +0 -1
- package/dist/guardrails/__tests__/guardrail-engine.test.d.ts +0 -1
- package/dist/guardrails/__tests__/guardrail-engine.test.js +0 -343
- package/dist/guardrails/__tests__/guardrail-engine.test.js.map +0 -1
- package/dist/ipc/__tests__/integration.test.d.ts +0 -1
- package/dist/ipc/__tests__/integration.test.js +0 -352
- package/dist/ipc/__tests__/integration.test.js.map +0 -1
- package/dist/ipc/__tests__/protocol.test.d.ts +0 -1
- package/dist/ipc/__tests__/protocol.test.js +0 -69
- package/dist/ipc/__tests__/protocol.test.js.map +0 -1
- package/dist/knowledge-graph/__tests__/contradiction-resolver.test.d.ts +0 -1
- package/dist/knowledge-graph/__tests__/contradiction-resolver.test.js +0 -114
- package/dist/knowledge-graph/__tests__/contradiction-resolver.test.js.map +0 -1
- package/dist/knowledge-graph/__tests__/knowledge-graph.test.d.ts +0 -1
- package/dist/knowledge-graph/__tests__/knowledge-graph.test.js +0 -215
- package/dist/knowledge-graph/__tests__/knowledge-graph.test.js.map +0 -1
- package/dist/learning/__tests__/base-engine.test.d.ts +0 -1
- package/dist/learning/__tests__/base-engine.test.js +0 -49
- package/dist/learning/__tests__/base-engine.test.js.map +0 -1
- package/dist/llm/__tests__/anthropic-provider.test.d.ts +0 -1
- package/dist/llm/__tests__/anthropic-provider.test.js +0 -121
- package/dist/llm/__tests__/anthropic-provider.test.js.map +0 -1
- package/dist/llm/__tests__/llm-service.test.d.ts +0 -1
- package/dist/llm/__tests__/llm-service.test.js +0 -507
- package/dist/llm/__tests__/llm-service.test.js.map +0 -1
- package/dist/llm/__tests__/ollama-embedding.test.d.ts +0 -1
- package/dist/llm/__tests__/ollama-embedding.test.js +0 -128
- package/dist/llm/__tests__/ollama-embedding.test.js.map +0 -1
- package/dist/llm/__tests__/ollama-provider.test.d.ts +0 -1
- package/dist/llm/__tests__/ollama-provider.test.js +0 -213
- package/dist/llm/__tests__/ollama-provider.test.js.map +0 -1
- package/dist/llm/__tests__/provider.test.d.ts +0 -1
- package/dist/llm/__tests__/provider.test.js +0 -126
- package/dist/llm/__tests__/provider.test.js.map +0 -1
- package/dist/math/__tests__/time-decay.test.d.ts +0 -1
- package/dist/math/__tests__/time-decay.test.js +0 -37
- package/dist/math/__tests__/time-decay.test.js.map +0 -1
- package/dist/math/__tests__/wilson-score.test.d.ts +0 -1
- package/dist/math/__tests__/wilson-score.test.js +0 -43
- package/dist/math/__tests__/wilson-score.test.js.map +0 -1
- package/dist/memory/__tests__/base-memory-engine.test.d.ts +0 -1
- package/dist/memory/__tests__/base-memory-engine.test.js +0 -233
- package/dist/memory/__tests__/base-memory-engine.test.js.map +0 -1
- package/dist/metacognition/__tests__/auto-experiment-engine.test.d.ts +0 -1
- package/dist/metacognition/__tests__/auto-experiment-engine.test.js +0 -218
- package/dist/metacognition/__tests__/auto-experiment-engine.test.js.map +0 -1
- package/dist/metacognition/__tests__/evolution-engine.test.d.ts +0 -1
- package/dist/metacognition/__tests__/evolution-engine.test.js +0 -473
- package/dist/metacognition/__tests__/evolution-engine.test.js.map +0 -1
- package/dist/metacognition/__tests__/parameter-registry.test.d.ts +0 -1
- package/dist/metacognition/__tests__/parameter-registry.test.js +0 -223
- package/dist/metacognition/__tests__/parameter-registry.test.js.map +0 -1
- package/dist/missions/__tests__/mission-engine.test.d.ts +0 -1
- package/dist/missions/__tests__/mission-engine.test.js +0 -67
- package/dist/missions/__tests__/mission-engine.test.js.map +0 -1
- package/dist/notifications/__tests__/notification-service.test.d.ts +0 -1
- package/dist/notifications/__tests__/notification-service.test.js +0 -176
- package/dist/notifications/__tests__/notification-service.test.js.map +0 -1
- package/dist/plugin/__tests__/plugin-registry.test.d.ts +0 -1
- package/dist/plugin/__tests__/plugin-registry.test.js +0 -166
- package/dist/plugin/__tests__/plugin-registry.test.js.map +0 -1
- package/dist/prediction/__tests__/prediction-engine.test.d.ts +0 -1
- package/dist/prediction/__tests__/prediction-engine.test.js +0 -252
- package/dist/prediction/__tests__/prediction-engine.test.js.map +0 -1
- package/dist/proactive/__tests__/proactive-engine.test.d.ts +0 -1
- package/dist/proactive/__tests__/proactive-engine.test.js +0 -183
- package/dist/proactive/__tests__/proactive-engine.test.js.map +0 -1
- package/dist/rag/__tests__/rag-engine.test.d.ts +0 -1
- package/dist/rag/__tests__/rag-engine.test.js +0 -235
- package/dist/rag/__tests__/rag-engine.test.js.map +0 -1
- package/dist/research/__tests__/autonomy-features.test.d.ts +0 -1
- package/dist/research/__tests__/autonomy-features.test.js +0 -155
- package/dist/research/__tests__/autonomy-features.test.js.map +0 -1
- package/dist/research/__tests__/base-engine.test.d.ts +0 -1
- package/dist/research/__tests__/base-engine.test.js +0 -56
- package/dist/research/__tests__/base-engine.test.js.map +0 -1
- package/dist/research/__tests__/semantic-compressor.test.d.ts +0 -1
- package/dist/research/__tests__/semantic-compressor.test.js +0 -153
- package/dist/research/__tests__/semantic-compressor.test.js.map +0 -1
- package/dist/research/adapters/__tests__/playwright-adapter.test.d.ts +0 -1
- package/dist/research/adapters/__tests__/playwright-adapter.test.js +0 -64
- package/dist/research/adapters/__tests__/playwright-adapter.test.js.map +0 -1
- package/dist/research/adapters/__tests__/web-adapters.test.d.ts +0 -1
- package/dist/research/adapters/__tests__/web-adapters.test.js +0 -106
- package/dist/research/adapters/__tests__/web-adapters.test.js.map +0 -1
- package/dist/sandbox/__tests__/code-sandbox.test.d.ts +0 -1
- package/dist/sandbox/__tests__/code-sandbox.test.js +0 -182
- package/dist/sandbox/__tests__/code-sandbox.test.js.map +0 -1
- package/dist/scanner/__tests__/signal-scanner.test.d.ts +0 -1
- package/dist/scanner/__tests__/signal-scanner.test.js +0 -142
- package/dist/scanner/__tests__/signal-scanner.test.js.map +0 -1
- package/dist/self-modification/__tests__/self-modification-engine.test.d.ts +0 -1
- package/dist/self-modification/__tests__/self-modification-engine.test.js +0 -313
- package/dist/self-modification/__tests__/self-modification-engine.test.js.map +0 -1
- package/dist/strategy/__tests__/strategy-forge.test.d.ts +0 -1
- package/dist/strategy/__tests__/strategy-forge.test.js +0 -190
- package/dist/strategy/__tests__/strategy-forge.test.js.map +0 -1
- package/dist/strategy/__tests__/strategy-mutator.test.d.ts +0 -1
- package/dist/strategy/__tests__/strategy-mutator.test.js +0 -141
- package/dist/strategy/__tests__/strategy-mutator.test.js.map +0 -1
- package/dist/synapses/__tests__/activation.test.d.ts +0 -1
- package/dist/synapses/__tests__/activation.test.js +0 -87
- package/dist/synapses/__tests__/activation.test.js.map +0 -1
- package/dist/synapses/__tests__/decay.test.d.ts +0 -1
- package/dist/synapses/__tests__/decay.test.js +0 -73
- package/dist/synapses/__tests__/decay.test.js.map +0 -1
- package/dist/synapses/__tests__/hebbian.test.d.ts +0 -1
- package/dist/synapses/__tests__/hebbian.test.js +0 -95
- package/dist/synapses/__tests__/hebbian.test.js.map +0 -1
- package/dist/synapses/__tests__/pathfinder.test.d.ts +0 -1
- package/dist/synapses/__tests__/pathfinder.test.js +0 -74
- package/dist/synapses/__tests__/pathfinder.test.js.map +0 -1
- package/dist/synapses/__tests__/synapse-manager.test.d.ts +0 -1
- package/dist/synapses/__tests__/synapse-manager.test.js +0 -94
- package/dist/synapses/__tests__/synapse-manager.test.js.map +0 -1
- package/dist/teaching/__tests__/teaching.test.d.ts +0 -1
- package/dist/teaching/__tests__/teaching.test.js +0 -252
- package/dist/teaching/__tests__/teaching.test.js.map +0 -1
- package/dist/techradar/__tests__/techradar-engine.test.d.ts +0 -1
- package/dist/techradar/__tests__/techradar-engine.test.js +0 -246
- package/dist/techradar/__tests__/techradar-engine.test.js.map +0 -1
- package/dist/tool-learning/__tests__/tool-learning.test.d.ts +0 -1
- package/dist/tool-learning/__tests__/tool-learning.test.js +0 -187
- package/dist/tool-learning/__tests__/tool-learning.test.js.map +0 -1
- package/dist/user-model/__tests__/user-model.test.d.ts +0 -1
- package/dist/user-model/__tests__/user-model.test.js +0 -142
- package/dist/user-model/__tests__/user-model.test.js.map +0 -1
- package/dist/utils/__tests__/batch-queue.test.d.ts +0 -1
- package/dist/utils/__tests__/batch-queue.test.js +0 -85
- package/dist/utils/__tests__/batch-queue.test.js.map +0 -1
- package/dist/utils/__tests__/events.test.d.ts +0 -1
- package/dist/utils/__tests__/events.test.js +0 -38
- package/dist/utils/__tests__/events.test.js.map +0 -1
- package/dist/utils/__tests__/hash.test.d.ts +0 -1
- package/dist/utils/__tests__/hash.test.js +0 -25
- package/dist/utils/__tests__/hash.test.js.map +0 -1
- package/dist/utils/__tests__/logger.test.d.ts +0 -1
- package/dist/utils/__tests__/logger.test.js +0 -55
- package/dist/utils/__tests__/logger.test.js.map +0 -1
- package/dist/utils/__tests__/paths.test.d.ts +0 -1
- package/dist/utils/__tests__/paths.test.js +0 -50
- package/dist/utils/__tests__/paths.test.js.map +0 -1
- package/dist/utils/__tests__/retry.test.d.ts +0 -1
- package/dist/utils/__tests__/retry.test.js +0 -91
- package/dist/utils/__tests__/retry.test.js.map +0 -1
- package/dist/watchdog/__tests__/watchdog-service.test.d.ts +0 -1
- package/dist/watchdog/__tests__/watchdog-service.test.js +0 -113
- package/dist/watchdog/__tests__/watchdog-service.test.js.map +0 -1
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
-
import Database from 'better-sqlite3';
|
|
3
|
-
vi.mock('../../utils/logger.js', () => ({
|
|
4
|
-
getLogger: () => ({ info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() }),
|
|
5
|
-
}));
|
|
6
|
-
import { ContentForge, runContentForgeMigration } from '../content-forge.js';
|
|
7
|
-
describe('ContentForge', () => {
|
|
8
|
-
let db;
|
|
9
|
-
beforeEach(() => { db = new Database(':memory:'); });
|
|
10
|
-
afterEach(() => { db.close(); });
|
|
11
|
-
it('generates content from an insight', () => {
|
|
12
|
-
const forge = new ContentForge(db, { brainName: 'test' });
|
|
13
|
-
const piece = forge.generateFromInsight({ id: 1, insight: 'Cross-domain patterns emerge between trading and marketing signals', noveltyScore: 0.8 });
|
|
14
|
-
expect(piece.id).toBeGreaterThan(0);
|
|
15
|
-
expect(piece.sourceType).toBe('insight');
|
|
16
|
-
expect(piece.status).toBe('draft');
|
|
17
|
-
expect(piece.platform).toBe('bluesky');
|
|
18
|
-
});
|
|
19
|
-
it('generates content from a mission', () => {
|
|
20
|
-
const forge = new ContentForge(db, { brainName: 'test' });
|
|
21
|
-
const piece = forge.generateFromMission({ id: 5, topic: 'AI agent architectures', summary: 'Survey of modern agent designs' });
|
|
22
|
-
expect(piece.sourceType).toBe('mission');
|
|
23
|
-
expect(piece.title).toContain('Research');
|
|
24
|
-
});
|
|
25
|
-
it('generates content from a trend', () => {
|
|
26
|
-
const forge = new ContentForge(db, { brainName: 'test' });
|
|
27
|
-
const piece = forge.generateFromTrend({ name: 'WebAssembly', description: 'WASM growing in backend usage', category: 'infrastructure' });
|
|
28
|
-
expect(piece.sourceType).toBe('trend');
|
|
29
|
-
expect(piece.title).toContain('Trend');
|
|
30
|
-
});
|
|
31
|
-
it('generates content from a principle', () => {
|
|
32
|
-
const forge = new ContentForge(db, { brainName: 'test' });
|
|
33
|
-
const piece = forge.generateFromPrinciple({ id: 3, statement: 'Early feedback loops reduce cascading failures', domain: 'engineering' });
|
|
34
|
-
expect(piece.sourceType).toBe('principle');
|
|
35
|
-
});
|
|
36
|
-
it('schedules content for later', () => {
|
|
37
|
-
const forge = new ContentForge(db, { brainName: 'test' });
|
|
38
|
-
const piece = forge.generateFromInsight({ insight: 'Test insight', noveltyScore: 0.5 });
|
|
39
|
-
forge.schedule(piece.id, '2026-03-15T10:00:00Z');
|
|
40
|
-
const scheduled = forge.getSchedule();
|
|
41
|
-
expect(scheduled).toHaveLength(1);
|
|
42
|
-
expect(scheduled[0].scheduledFor).toBe('2026-03-15T10:00:00Z');
|
|
43
|
-
expect(scheduled[0].status).toBe('scheduled');
|
|
44
|
-
});
|
|
45
|
-
it('publishes content via social service', async () => {
|
|
46
|
-
const forge = new ContentForge(db, { brainName: 'test' });
|
|
47
|
-
forge.setSocialService({ post: vi.fn().mockResolvedValue({ id: 'post-123' }) });
|
|
48
|
-
const piece = forge.generateFromInsight({ insight: 'Publish me', noveltyScore: 0.9 });
|
|
49
|
-
const result = await forge.publishNow(piece.id);
|
|
50
|
-
expect(result.success).toBe(true);
|
|
51
|
-
expect(result.postId).toBe('post-123');
|
|
52
|
-
const updated = forge.getPiece(piece.id);
|
|
53
|
-
expect(updated?.status).toBe('published');
|
|
54
|
-
});
|
|
55
|
-
it('handles publish failure', async () => {
|
|
56
|
-
const forge = new ContentForge(db, { brainName: 'test' });
|
|
57
|
-
forge.setSocialService({ post: vi.fn().mockRejectedValue(new Error('Rate limited')) });
|
|
58
|
-
const piece = forge.generateFromInsight({ insight: 'Fail publish', noveltyScore: 0.5 });
|
|
59
|
-
const result = await forge.publishNow(piece.id);
|
|
60
|
-
expect(result.success).toBe(false);
|
|
61
|
-
const updated = forge.getPiece(piece.id);
|
|
62
|
-
expect(updated?.status).toBe('failed');
|
|
63
|
-
});
|
|
64
|
-
it('returns failure when no social service', async () => {
|
|
65
|
-
const forge = new ContentForge(db, { brainName: 'test' });
|
|
66
|
-
const piece = forge.generateFromInsight({ insight: 'No service', noveltyScore: 0.5 });
|
|
67
|
-
const result = await forge.publishNow(piece.id);
|
|
68
|
-
expect(result.success).toBe(false);
|
|
69
|
-
});
|
|
70
|
-
it('records engagement metrics', () => {
|
|
71
|
-
const forge = new ContentForge(db, { brainName: 'test' });
|
|
72
|
-
forge.setSocialService({ post: vi.fn().mockResolvedValue({ id: 'p1' }) });
|
|
73
|
-
const piece = forge.generateFromInsight({ insight: 'Engage me', noveltyScore: 0.7 });
|
|
74
|
-
forge.recordEngagement(piece.id, { likes: 42, reposts: 10, replies: 5 });
|
|
75
|
-
const updated = forge.getPiece(piece.id);
|
|
76
|
-
expect(updated?.engagement?.likes).toBe(42);
|
|
77
|
-
});
|
|
78
|
-
it('gets best performing content', async () => {
|
|
79
|
-
const forge = new ContentForge(db, { brainName: 'test' });
|
|
80
|
-
forge.setSocialService({ post: vi.fn().mockResolvedValue({ id: 'p1' }) });
|
|
81
|
-
const p1 = forge.generateFromInsight({ insight: 'Popular', noveltyScore: 0.9 });
|
|
82
|
-
const p2 = forge.generateFromInsight({ insight: 'Less popular', noveltyScore: 0.5 });
|
|
83
|
-
await forge.publishNow(p1.id);
|
|
84
|
-
await forge.publishNow(p2.id);
|
|
85
|
-
forge.recordEngagement(p1.id, { likes: 100, reposts: 50, replies: 20 });
|
|
86
|
-
forge.recordEngagement(p2.id, { likes: 5, reposts: 1, replies: 0 });
|
|
87
|
-
const best = forge.getBestPerforming(2);
|
|
88
|
-
expect(best).toHaveLength(2);
|
|
89
|
-
expect(best[0].engagement?.likes).toBe(100);
|
|
90
|
-
});
|
|
91
|
-
it('returns optimal posting time', () => {
|
|
92
|
-
const forge = new ContentForge(db, { brainName: 'test' });
|
|
93
|
-
expect(forge.getOptimalTime('bluesky')).toBe('10:00');
|
|
94
|
-
expect(forge.getOptimalTime('reddit')).toBe('08:00');
|
|
95
|
-
});
|
|
96
|
-
it('getStatus returns overview', () => {
|
|
97
|
-
const forge = new ContentForge(db, { brainName: 'test' });
|
|
98
|
-
forge.generateFromInsight({ insight: 'Draft 1', noveltyScore: 0.5 });
|
|
99
|
-
forge.generateFromInsight({ insight: 'Draft 2', noveltyScore: 0.6 });
|
|
100
|
-
const status = forge.getStatus();
|
|
101
|
-
expect(status.drafts).toBe(2);
|
|
102
|
-
expect(status.published).toBe(0);
|
|
103
|
-
});
|
|
104
|
-
it('migration is idempotent', () => {
|
|
105
|
-
const forge = new ContentForge(db, { brainName: 'test' });
|
|
106
|
-
forge.generateFromInsight({ insight: 'Survives', noveltyScore: 0.5 });
|
|
107
|
-
runContentForgeMigration(db);
|
|
108
|
-
const pieces = forge.getByStatus('draft');
|
|
109
|
-
expect(pieces).toHaveLength(1);
|
|
110
|
-
});
|
|
111
|
-
it('uses custom platform', () => {
|
|
112
|
-
const forge = new ContentForge(db, { brainName: 'test' });
|
|
113
|
-
const piece = forge.generateFromInsight({ insight: 'Reddit post', noveltyScore: 0.7 }, 'reddit');
|
|
114
|
-
expect(piece.platform).toBe('reddit');
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
//# sourceMappingURL=content-forge.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"content-forge.test.js","sourceRoot":"","sources":["../../../src/content/__tests__/content-forge.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
-
import Database from 'better-sqlite3';
|
|
3
|
-
vi.mock('../../utils/logger.js', () => ({
|
|
4
|
-
getLogger: () => ({ info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() }),
|
|
5
|
-
}));
|
|
6
|
-
import { CreativeEngine, runCreativeMigration } from '../creative-engine.js';
|
|
7
|
-
describe('CreativeEngine', () => {
|
|
8
|
-
let db;
|
|
9
|
-
beforeEach(() => { db = new Database(':memory:'); });
|
|
10
|
-
afterEach(() => { db.close(); });
|
|
11
|
-
it('creates an instance without errors', () => {
|
|
12
|
-
const engine = new CreativeEngine(db, { brainName: 'test' });
|
|
13
|
-
expect(engine).toBeDefined();
|
|
14
|
-
});
|
|
15
|
-
it('getStatus returns initial empty state', () => {
|
|
16
|
-
const engine = new CreativeEngine(db, { brainName: 'test' });
|
|
17
|
-
const status = engine.getStatus();
|
|
18
|
-
expect(status.totalInsights).toBe(0);
|
|
19
|
-
expect(status.byType).toEqual({});
|
|
20
|
-
expect(status.byStatus).toEqual({});
|
|
21
|
-
expect(status.topInsights).toEqual([]);
|
|
22
|
-
});
|
|
23
|
-
it('crossPollinate returns empty array without distiller', () => {
|
|
24
|
-
const engine = new CreativeEngine(db, { brainName: 'test' });
|
|
25
|
-
const result = engine.crossPollinate();
|
|
26
|
-
expect(result).toEqual([]);
|
|
27
|
-
});
|
|
28
|
-
it('crossPollinate returns insights when distiller provides multi-domain principles', () => {
|
|
29
|
-
const engine = new CreativeEngine(db, { brainName: 'test', overlapThreshold: 1.0 });
|
|
30
|
-
engine.setKnowledgeDistiller({
|
|
31
|
-
distill: () => ({
|
|
32
|
-
principles: [
|
|
33
|
-
{ statement: 'caching improves performance significantly', domain: 'engineering' },
|
|
34
|
-
{ statement: 'diversification reduces portfolio variance', domain: 'finance' },
|
|
35
|
-
{ statement: 'redundancy prevents catastrophic system failure', domain: 'engineering' },
|
|
36
|
-
{ statement: 'hedging minimizes downside exposure risk', domain: 'finance' },
|
|
37
|
-
],
|
|
38
|
-
}),
|
|
39
|
-
});
|
|
40
|
-
const insights = engine.crossPollinate();
|
|
41
|
-
expect(insights.length).toBeGreaterThan(0);
|
|
42
|
-
expect(insights[0].type).toBe('cross_pollination');
|
|
43
|
-
expect(insights[0].status).toBe('raw');
|
|
44
|
-
expect(insights[0].noveltyScore).toBeGreaterThan(0);
|
|
45
|
-
expect(insights[0].id).toBeGreaterThan(0);
|
|
46
|
-
// Verify stored in DB
|
|
47
|
-
const status = engine.getStatus();
|
|
48
|
-
expect(status.totalInsights).toBe(insights.length);
|
|
49
|
-
expect(status.byType['cross_pollination']).toBe(insights.length);
|
|
50
|
-
});
|
|
51
|
-
it('crossPollinate with single domain returns insights via fallback grouping', () => {
|
|
52
|
-
const engine = new CreativeEngine(db, { brainName: 'test', overlapThreshold: 1.0 });
|
|
53
|
-
engine.setKnowledgeDistiller({
|
|
54
|
-
distill: () => ({
|
|
55
|
-
principles: [
|
|
56
|
-
{ statement: 'caching improves performance significantly', domain: 'brain' },
|
|
57
|
-
{ statement: 'monitoring detects anomalies before failures', domain: 'brain' },
|
|
58
|
-
{ statement: 'validation prevents corrupted data entry', domain: 'brain' },
|
|
59
|
-
{ statement: 'abstraction reduces cognitive complexity', domain: 'brain' },
|
|
60
|
-
],
|
|
61
|
-
}),
|
|
62
|
-
});
|
|
63
|
-
const insights = engine.crossPollinate();
|
|
64
|
-
// With fallback, single domain should still produce insights
|
|
65
|
-
expect(insights.length).toBeGreaterThan(0);
|
|
66
|
-
});
|
|
67
|
-
it('crossPollinate with 2+ domains works as before', () => {
|
|
68
|
-
const engine = new CreativeEngine(db, { brainName: 'test', overlapThreshold: 1.0 });
|
|
69
|
-
engine.setKnowledgeDistiller({
|
|
70
|
-
distill: () => ({
|
|
71
|
-
principles: [
|
|
72
|
-
{ statement: 'caching improves response times', domain: 'engineering' },
|
|
73
|
-
{ statement: 'diversification reduces risk exposure', domain: 'finance' },
|
|
74
|
-
],
|
|
75
|
-
}),
|
|
76
|
-
});
|
|
77
|
-
const insights = engine.crossPollinate();
|
|
78
|
-
expect(insights.length).toBeGreaterThan(0);
|
|
79
|
-
expect(insights[0].type).toBe('cross_pollination');
|
|
80
|
-
});
|
|
81
|
-
it('fallback grouping produces at least 2 groups from single domain', () => {
|
|
82
|
-
const engine = new CreativeEngine(db, { brainName: 'test', overlapThreshold: 1.0 });
|
|
83
|
-
engine.setKnowledgeDistiller({
|
|
84
|
-
distill: () => ({
|
|
85
|
-
principles: [
|
|
86
|
-
{ statement: 'first principle about something important', domain: 'brain' },
|
|
87
|
-
{ statement: 'second principle about another topic entirely', domain: 'brain' },
|
|
88
|
-
{ statement: 'third principle about different matters', domain: 'brain' },
|
|
89
|
-
{ statement: 'fourth principle covering new ground here', domain: 'brain' },
|
|
90
|
-
],
|
|
91
|
-
}),
|
|
92
|
-
});
|
|
93
|
-
// crossPollinate internally groups and should get insights
|
|
94
|
-
const insights = engine.crossPollinate();
|
|
95
|
-
// If it didn't crash and returned results, fallback worked
|
|
96
|
-
expect(Array.isArray(insights)).toBe(true);
|
|
97
|
-
});
|
|
98
|
-
it('crossPollinate with < 4 single-domain principles still generates insights', () => {
|
|
99
|
-
const engine = new CreativeEngine(db, { brainName: 'test', overlapThreshold: 1.0 });
|
|
100
|
-
engine.setKnowledgeDistiller({
|
|
101
|
-
distill: () => ({
|
|
102
|
-
principles: [
|
|
103
|
-
{ statement: 'caching dramatically improves latency', domain: 'brain' },
|
|
104
|
-
{ statement: 'monitoring catches failures early', domain: 'brain' },
|
|
105
|
-
],
|
|
106
|
-
}),
|
|
107
|
-
});
|
|
108
|
-
const insights = engine.crossPollinate();
|
|
109
|
-
// With only 2 same-domain principles, direct pair-building should kick in
|
|
110
|
-
expect(insights.length).toBeGreaterThan(0);
|
|
111
|
-
expect(insights[0].type).toBe('cross_pollination');
|
|
112
|
-
});
|
|
113
|
-
it('getDebugInfo returns principles count and domain distribution', () => {
|
|
114
|
-
const engine = new CreativeEngine(db, { brainName: 'test' });
|
|
115
|
-
engine.setKnowledgeDistiller({
|
|
116
|
-
distill: () => ({
|
|
117
|
-
principles: [
|
|
118
|
-
{ statement: 'principle A', domain: 'domA' },
|
|
119
|
-
{ statement: 'principle B', domain: 'domA' },
|
|
120
|
-
{ statement: 'principle C', domain: 'domB' },
|
|
121
|
-
],
|
|
122
|
-
}),
|
|
123
|
-
});
|
|
124
|
-
const debug = engine.getDebugInfo();
|
|
125
|
-
expect(debug.principlesCount).toBe(3);
|
|
126
|
-
expect(debug.domains).toEqual({ domA: 2, domB: 1 });
|
|
127
|
-
expect(debug.distillerAvailable).toBe(true);
|
|
128
|
-
});
|
|
129
|
-
it('findAnalogies returns empty array without distiller', () => {
|
|
130
|
-
const engine = new CreativeEngine(db, { brainName: 'test' });
|
|
131
|
-
const result = engine.findAnalogies('some concept');
|
|
132
|
-
expect(result).toEqual([]);
|
|
133
|
-
});
|
|
134
|
-
it('findAnalogies finds structurally similar principles', () => {
|
|
135
|
-
const engine = new CreativeEngine(db, { brainName: 'test' });
|
|
136
|
-
engine.setKnowledgeDistiller({
|
|
137
|
-
distill: () => ({
|
|
138
|
-
principles: [
|
|
139
|
-
{ statement: 'caching improves response times significantly', domain: 'engineering' },
|
|
140
|
-
{ statement: 'caching improves database query performance', domain: 'databases' },
|
|
141
|
-
{ statement: 'something completely unrelated', domain: 'art' },
|
|
142
|
-
],
|
|
143
|
-
}),
|
|
144
|
-
});
|
|
145
|
-
const analogies = engine.findAnalogies('caching improves application performance');
|
|
146
|
-
expect(analogies.length).toBeGreaterThan(0);
|
|
147
|
-
for (const a of analogies) {
|
|
148
|
-
expect(a.concept).toBe('caching improves application performance');
|
|
149
|
-
expect(a.similarity).toBeGreaterThan(0.1);
|
|
150
|
-
expect(a.similarity).toBeLessThan(0.6);
|
|
151
|
-
expect(a.explanation).toContain('Shared concepts');
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
it('getInsights returns empty list initially', () => {
|
|
155
|
-
const engine = new CreativeEngine(db, { brainName: 'test' });
|
|
156
|
-
const insights = engine.getInsights();
|
|
157
|
-
expect(insights).toEqual([]);
|
|
158
|
-
});
|
|
159
|
-
it('getInsights returns stored insights after crossPollinate', () => {
|
|
160
|
-
const engine = new CreativeEngine(db, { brainName: 'test', overlapThreshold: 1.0 });
|
|
161
|
-
engine.setKnowledgeDistiller({
|
|
162
|
-
distill: () => ({
|
|
163
|
-
principles: [
|
|
164
|
-
{ statement: 'parallel processing speeds computation', domain: 'computing' },
|
|
165
|
-
{ statement: 'teamwork divides workload effectively', domain: 'management' },
|
|
166
|
-
],
|
|
167
|
-
}),
|
|
168
|
-
});
|
|
169
|
-
engine.crossPollinate();
|
|
170
|
-
const insights = engine.getInsights();
|
|
171
|
-
expect(insights.length).toBeGreaterThan(0);
|
|
172
|
-
expect(insights[0].id).toBeDefined();
|
|
173
|
-
expect(insights[0].createdAt).toBeDefined();
|
|
174
|
-
expect(insights[0].sourceA.domain).toBeDefined();
|
|
175
|
-
expect(insights[0].sourceB.domain).toBeDefined();
|
|
176
|
-
});
|
|
177
|
-
it('getInsights filters by status', () => {
|
|
178
|
-
const engine = new CreativeEngine(db, { brainName: 'test', overlapThreshold: 1.0 });
|
|
179
|
-
engine.setKnowledgeDistiller({
|
|
180
|
-
distill: () => ({
|
|
181
|
-
principles: [
|
|
182
|
-
{ statement: 'abstraction hides complexity behind interfaces', domain: 'software' },
|
|
183
|
-
{ statement: 'delegation assigns responsibility to subordinates', domain: 'leadership' },
|
|
184
|
-
],
|
|
185
|
-
}),
|
|
186
|
-
});
|
|
187
|
-
engine.crossPollinate();
|
|
188
|
-
const raw = engine.getInsights(20, 'raw');
|
|
189
|
-
expect(raw.length).toBeGreaterThan(0);
|
|
190
|
-
const tested = engine.getInsights(20, 'tested');
|
|
191
|
-
expect(tested).toEqual([]);
|
|
192
|
-
});
|
|
193
|
-
it('migration is idempotent', () => {
|
|
194
|
-
const engine = new CreativeEngine(db, { brainName: 'test', overlapThreshold: 1.0 });
|
|
195
|
-
engine.setKnowledgeDistiller({
|
|
196
|
-
distill: () => ({
|
|
197
|
-
principles: [
|
|
198
|
-
{ statement: 'monitoring detects anomalies early', domain: 'ops' },
|
|
199
|
-
{ statement: 'early diagnosis improves treatment outcomes', domain: 'medicine' },
|
|
200
|
-
],
|
|
201
|
-
}),
|
|
202
|
-
});
|
|
203
|
-
engine.crossPollinate();
|
|
204
|
-
// Running migration again should not destroy data
|
|
205
|
-
runCreativeMigration(db);
|
|
206
|
-
const status = engine.getStatus();
|
|
207
|
-
expect(status.totalInsights).toBeGreaterThan(0);
|
|
208
|
-
});
|
|
209
|
-
it('getStatus reflects insights by type and status', () => {
|
|
210
|
-
const engine = new CreativeEngine(db, { brainName: 'test' });
|
|
211
|
-
// Manually insert insights of different types
|
|
212
|
-
db.prepare(`
|
|
213
|
-
INSERT INTO creative_insights (type, source_a_domain, source_a_principle, source_b_domain, source_b_principle, insight, novelty_score, plausibility, status)
|
|
214
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
215
|
-
`).run('cross_pollination', 'domA', 'prinA', 'domB', 'prinB', 'insight1', 0.8, 0.5, 'raw');
|
|
216
|
-
db.prepare(`
|
|
217
|
-
INSERT INTO creative_insights (type, source_a_domain, source_a_principle, source_b_domain, source_b_principle, insight, novelty_score, plausibility, status)
|
|
218
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
219
|
-
`).run('imagination', 'domC', 'prinC', 'domD', 'prinD', 'insight2', 0.9, 0.6, 'tested');
|
|
220
|
-
const status = engine.getStatus();
|
|
221
|
-
expect(status.totalInsights).toBe(2);
|
|
222
|
-
expect(status.byType['cross_pollination']).toBe(1);
|
|
223
|
-
expect(status.byType['imagination']).toBe(1);
|
|
224
|
-
expect(status.byStatus['raw']).toBe(1);
|
|
225
|
-
expect(status.byStatus['tested']).toBe(1);
|
|
226
|
-
expect(status.topInsights.length).toBe(2);
|
|
227
|
-
});
|
|
228
|
-
});
|
|
229
|
-
//# sourceMappingURL=creative-engine.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"creative-engine.test.js","sourceRoot":"","sources":["../../../src/creative/__tests__/creative-engine.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,240 +0,0 @@
|
|
|
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
|