@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.
Files changed (253) hide show
  1. package/dist/guardrails/guardrail-engine.d.ts +2 -0
  2. package/dist/guardrails/guardrail-engine.js +17 -9
  3. package/dist/guardrails/guardrail-engine.js.map +1 -1
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.js +1 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/utils/memory-watchdog.d.ts +33 -0
  8. package/dist/utils/memory-watchdog.js +88 -0
  9. package/dist/utils/memory-watchdog.js.map +1 -0
  10. package/package.json +1 -1
  11. package/dist/action/__tests__/action-bridge.test.d.ts +0 -1
  12. package/dist/action/__tests__/action-bridge.test.js +0 -175
  13. package/dist/action/__tests__/action-bridge.test.js.map +0 -1
  14. package/dist/action/__tests__/adjust-parameter-handler.test.d.ts +0 -1
  15. package/dist/action/__tests__/adjust-parameter-handler.test.js +0 -138
  16. package/dist/action/__tests__/adjust-parameter-handler.test.js.map +0 -1
  17. package/dist/action/__tests__/content-handler.test.d.ts +0 -1
  18. package/dist/action/__tests__/content-handler.test.js +0 -100
  19. package/dist/action/__tests__/content-handler.test.js.map +0 -1
  20. package/dist/action/__tests__/creative-seed-handler.test.d.ts +0 -1
  21. package/dist/action/__tests__/creative-seed-handler.test.js +0 -96
  22. package/dist/action/__tests__/creative-seed-handler.test.js.map +0 -1
  23. package/dist/action/__tests__/trade-handler.test.d.ts +0 -1
  24. package/dist/action/__tests__/trade-handler.test.js +0 -165
  25. package/dist/action/__tests__/trade-handler.test.js.map +0 -1
  26. package/dist/active-learning/__tests__/active-learning.test.d.ts +0 -1
  27. package/dist/active-learning/__tests__/active-learning.test.js +0 -132
  28. package/dist/active-learning/__tests__/active-learning.test.js.map +0 -1
  29. package/dist/agent-training/__tests__/agent-trainer.test.d.ts +0 -1
  30. package/dist/agent-training/__tests__/agent-trainer.test.js +0 -158
  31. package/dist/agent-training/__tests__/agent-trainer.test.js.map +0 -1
  32. package/dist/agent-training/__tests__/sub-agent-factory.test.d.ts +0 -1
  33. package/dist/agent-training/__tests__/sub-agent-factory.test.js +0 -100
  34. package/dist/agent-training/__tests__/sub-agent-factory.test.js.map +0 -1
  35. package/dist/agent-training/__tests__/sub-agent.test.d.ts +0 -1
  36. package/dist/agent-training/__tests__/sub-agent.test.js +0 -102
  37. package/dist/agent-training/__tests__/sub-agent.test.js.map +0 -1
  38. package/dist/chat/__tests__/chat-engine.test.d.ts +0 -1
  39. package/dist/chat/__tests__/chat-engine.test.js +0 -209
  40. package/dist/chat/__tests__/chat-engine.test.js.map +0 -1
  41. package/dist/checkpoint/__tests__/checkpoint-manager.test.d.ts +0 -1
  42. package/dist/checkpoint/__tests__/checkpoint-manager.test.js +0 -160
  43. package/dist/checkpoint/__tests__/checkpoint-manager.test.js.map +0 -1
  44. package/dist/code-health/__tests__/code-health.test.d.ts +0 -1
  45. package/dist/code-health/__tests__/code-health.test.js +0 -123
  46. package/dist/code-health/__tests__/code-health.test.js.map +0 -1
  47. package/dist/codegen/__tests__/code-forge.test.d.ts +0 -1
  48. package/dist/codegen/__tests__/code-forge.test.js +0 -105
  49. package/dist/codegen/__tests__/code-forge.test.js.map +0 -1
  50. package/dist/config/__tests__/loader.test.d.ts +0 -1
  51. package/dist/config/__tests__/loader.test.js +0 -86
  52. package/dist/config/__tests__/loader.test.js.map +0 -1
  53. package/dist/consciousness/__tests__/thought-stream.test.d.ts +0 -1
  54. package/dist/consciousness/__tests__/thought-stream.test.js +0 -62
  55. package/dist/consciousness/__tests__/thought-stream.test.js.map +0 -1
  56. package/dist/consensus/__tests__/consensus.test.d.ts +0 -1
  57. package/dist/consensus/__tests__/consensus.test.js +0 -159
  58. package/dist/consensus/__tests__/consensus.test.js.map +0 -1
  59. package/dist/content/__tests__/auto-publisher.test.d.ts +0 -1
  60. package/dist/content/__tests__/auto-publisher.test.js +0 -125
  61. package/dist/content/__tests__/auto-publisher.test.js.map +0 -1
  62. package/dist/content/__tests__/content-forge.test.d.ts +0 -1
  63. package/dist/content/__tests__/content-forge.test.js +0 -117
  64. package/dist/content/__tests__/content-forge.test.js.map +0 -1
  65. package/dist/creative/__tests__/creative-engine.test.d.ts +0 -1
  66. package/dist/creative/__tests__/creative-engine.test.js +0 -229
  67. package/dist/creative/__tests__/creative-engine.test.js.map +0 -1
  68. package/dist/cross-brain/__tests__/borg-sync-engine.test.d.ts +0 -1
  69. package/dist/cross-brain/__tests__/borg-sync-engine.test.js +0 -240
  70. package/dist/cross-brain/__tests__/borg-sync-engine.test.js.map +0 -1
  71. package/dist/cross-brain/__tests__/client.test.d.ts +0 -1
  72. package/dist/cross-brain/__tests__/client.test.js +0 -31
  73. package/dist/cross-brain/__tests__/client.test.js.map +0 -1
  74. package/dist/cross-brain/__tests__/notifications.test.d.ts +0 -1
  75. package/dist/cross-brain/__tests__/notifications.test.js +0 -52
  76. package/dist/cross-brain/__tests__/notifications.test.js.map +0 -1
  77. package/dist/cross-brain/__tests__/signal-router.test.d.ts +0 -1
  78. package/dist/cross-brain/__tests__/signal-router.test.js +0 -218
  79. package/dist/cross-brain/__tests__/signal-router.test.js.map +0 -1
  80. package/dist/cross-brain/__tests__/subscription.test.d.ts +0 -1
  81. package/dist/cross-brain/__tests__/subscription.test.js +0 -75
  82. package/dist/cross-brain/__tests__/subscription.test.js.map +0 -1
  83. package/dist/dashboard/__tests__/command-center-server.test.d.ts +0 -1
  84. package/dist/dashboard/__tests__/command-center-server.test.js +0 -522
  85. package/dist/dashboard/__tests__/command-center-server.test.js.map +0 -1
  86. package/dist/dashboard/__tests__/server.test.d.ts +0 -1
  87. package/dist/dashboard/__tests__/server.test.js +0 -105
  88. package/dist/dashboard/__tests__/server.test.js.map +0 -1
  89. package/dist/db/__tests__/connection.test.d.ts +0 -1
  90. package/dist/db/__tests__/connection.test.js +0 -135
  91. package/dist/db/__tests__/connection.test.js.map +0 -1
  92. package/dist/dream/__tests__/dream-engine.test.d.ts +0 -1
  93. package/dist/dream/__tests__/dream-engine.test.js +0 -184
  94. package/dist/dream/__tests__/dream-engine.test.js.map +0 -1
  95. package/dist/embeddings/__tests__/engine.test.d.ts +0 -1
  96. package/dist/embeddings/__tests__/engine.test.js +0 -82
  97. package/dist/embeddings/__tests__/engine.test.js.map +0 -1
  98. package/dist/feedback/__tests__/feedback-engine.test.d.ts +0 -1
  99. package/dist/feedback/__tests__/feedback-engine.test.js +0 -156
  100. package/dist/feedback/__tests__/feedback-engine.test.js.map +0 -1
  101. package/dist/feedback/__tests__/feedback-router.test.d.ts +0 -1
  102. package/dist/feedback/__tests__/feedback-router.test.js +0 -173
  103. package/dist/feedback/__tests__/feedback-router.test.js.map +0 -1
  104. package/dist/goals/__tests__/goal-engine.test.d.ts +0 -1
  105. package/dist/goals/__tests__/goal-engine.test.js +0 -203
  106. package/dist/goals/__tests__/goal-engine.test.js.map +0 -1
  107. package/dist/guardrails/__tests__/guardrail-engine.test.d.ts +0 -1
  108. package/dist/guardrails/__tests__/guardrail-engine.test.js +0 -343
  109. package/dist/guardrails/__tests__/guardrail-engine.test.js.map +0 -1
  110. package/dist/ipc/__tests__/integration.test.d.ts +0 -1
  111. package/dist/ipc/__tests__/integration.test.js +0 -352
  112. package/dist/ipc/__tests__/integration.test.js.map +0 -1
  113. package/dist/ipc/__tests__/protocol.test.d.ts +0 -1
  114. package/dist/ipc/__tests__/protocol.test.js +0 -69
  115. package/dist/ipc/__tests__/protocol.test.js.map +0 -1
  116. package/dist/knowledge-graph/__tests__/contradiction-resolver.test.d.ts +0 -1
  117. package/dist/knowledge-graph/__tests__/contradiction-resolver.test.js +0 -114
  118. package/dist/knowledge-graph/__tests__/contradiction-resolver.test.js.map +0 -1
  119. package/dist/knowledge-graph/__tests__/knowledge-graph.test.d.ts +0 -1
  120. package/dist/knowledge-graph/__tests__/knowledge-graph.test.js +0 -215
  121. package/dist/knowledge-graph/__tests__/knowledge-graph.test.js.map +0 -1
  122. package/dist/learning/__tests__/base-engine.test.d.ts +0 -1
  123. package/dist/learning/__tests__/base-engine.test.js +0 -49
  124. package/dist/learning/__tests__/base-engine.test.js.map +0 -1
  125. package/dist/llm/__tests__/anthropic-provider.test.d.ts +0 -1
  126. package/dist/llm/__tests__/anthropic-provider.test.js +0 -121
  127. package/dist/llm/__tests__/anthropic-provider.test.js.map +0 -1
  128. package/dist/llm/__tests__/llm-service.test.d.ts +0 -1
  129. package/dist/llm/__tests__/llm-service.test.js +0 -507
  130. package/dist/llm/__tests__/llm-service.test.js.map +0 -1
  131. package/dist/llm/__tests__/ollama-embedding.test.d.ts +0 -1
  132. package/dist/llm/__tests__/ollama-embedding.test.js +0 -128
  133. package/dist/llm/__tests__/ollama-embedding.test.js.map +0 -1
  134. package/dist/llm/__tests__/ollama-provider.test.d.ts +0 -1
  135. package/dist/llm/__tests__/ollama-provider.test.js +0 -213
  136. package/dist/llm/__tests__/ollama-provider.test.js.map +0 -1
  137. package/dist/llm/__tests__/provider.test.d.ts +0 -1
  138. package/dist/llm/__tests__/provider.test.js +0 -126
  139. package/dist/llm/__tests__/provider.test.js.map +0 -1
  140. package/dist/math/__tests__/time-decay.test.d.ts +0 -1
  141. package/dist/math/__tests__/time-decay.test.js +0 -37
  142. package/dist/math/__tests__/time-decay.test.js.map +0 -1
  143. package/dist/math/__tests__/wilson-score.test.d.ts +0 -1
  144. package/dist/math/__tests__/wilson-score.test.js +0 -43
  145. package/dist/math/__tests__/wilson-score.test.js.map +0 -1
  146. package/dist/memory/__tests__/base-memory-engine.test.d.ts +0 -1
  147. package/dist/memory/__tests__/base-memory-engine.test.js +0 -233
  148. package/dist/memory/__tests__/base-memory-engine.test.js.map +0 -1
  149. package/dist/metacognition/__tests__/auto-experiment-engine.test.d.ts +0 -1
  150. package/dist/metacognition/__tests__/auto-experiment-engine.test.js +0 -218
  151. package/dist/metacognition/__tests__/auto-experiment-engine.test.js.map +0 -1
  152. package/dist/metacognition/__tests__/evolution-engine.test.d.ts +0 -1
  153. package/dist/metacognition/__tests__/evolution-engine.test.js +0 -473
  154. package/dist/metacognition/__tests__/evolution-engine.test.js.map +0 -1
  155. package/dist/metacognition/__tests__/parameter-registry.test.d.ts +0 -1
  156. package/dist/metacognition/__tests__/parameter-registry.test.js +0 -223
  157. package/dist/metacognition/__tests__/parameter-registry.test.js.map +0 -1
  158. package/dist/missions/__tests__/mission-engine.test.d.ts +0 -1
  159. package/dist/missions/__tests__/mission-engine.test.js +0 -67
  160. package/dist/missions/__tests__/mission-engine.test.js.map +0 -1
  161. package/dist/notifications/__tests__/notification-service.test.d.ts +0 -1
  162. package/dist/notifications/__tests__/notification-service.test.js +0 -176
  163. package/dist/notifications/__tests__/notification-service.test.js.map +0 -1
  164. package/dist/plugin/__tests__/plugin-registry.test.d.ts +0 -1
  165. package/dist/plugin/__tests__/plugin-registry.test.js +0 -166
  166. package/dist/plugin/__tests__/plugin-registry.test.js.map +0 -1
  167. package/dist/prediction/__tests__/prediction-engine.test.d.ts +0 -1
  168. package/dist/prediction/__tests__/prediction-engine.test.js +0 -252
  169. package/dist/prediction/__tests__/prediction-engine.test.js.map +0 -1
  170. package/dist/proactive/__tests__/proactive-engine.test.d.ts +0 -1
  171. package/dist/proactive/__tests__/proactive-engine.test.js +0 -183
  172. package/dist/proactive/__tests__/proactive-engine.test.js.map +0 -1
  173. package/dist/rag/__tests__/rag-engine.test.d.ts +0 -1
  174. package/dist/rag/__tests__/rag-engine.test.js +0 -235
  175. package/dist/rag/__tests__/rag-engine.test.js.map +0 -1
  176. package/dist/research/__tests__/autonomy-features.test.d.ts +0 -1
  177. package/dist/research/__tests__/autonomy-features.test.js +0 -155
  178. package/dist/research/__tests__/autonomy-features.test.js.map +0 -1
  179. package/dist/research/__tests__/base-engine.test.d.ts +0 -1
  180. package/dist/research/__tests__/base-engine.test.js +0 -56
  181. package/dist/research/__tests__/base-engine.test.js.map +0 -1
  182. package/dist/research/__tests__/semantic-compressor.test.d.ts +0 -1
  183. package/dist/research/__tests__/semantic-compressor.test.js +0 -153
  184. package/dist/research/__tests__/semantic-compressor.test.js.map +0 -1
  185. package/dist/research/adapters/__tests__/playwright-adapter.test.d.ts +0 -1
  186. package/dist/research/adapters/__tests__/playwright-adapter.test.js +0 -64
  187. package/dist/research/adapters/__tests__/playwright-adapter.test.js.map +0 -1
  188. package/dist/research/adapters/__tests__/web-adapters.test.d.ts +0 -1
  189. package/dist/research/adapters/__tests__/web-adapters.test.js +0 -106
  190. package/dist/research/adapters/__tests__/web-adapters.test.js.map +0 -1
  191. package/dist/sandbox/__tests__/code-sandbox.test.d.ts +0 -1
  192. package/dist/sandbox/__tests__/code-sandbox.test.js +0 -182
  193. package/dist/sandbox/__tests__/code-sandbox.test.js.map +0 -1
  194. package/dist/scanner/__tests__/signal-scanner.test.d.ts +0 -1
  195. package/dist/scanner/__tests__/signal-scanner.test.js +0 -142
  196. package/dist/scanner/__tests__/signal-scanner.test.js.map +0 -1
  197. package/dist/self-modification/__tests__/self-modification-engine.test.d.ts +0 -1
  198. package/dist/self-modification/__tests__/self-modification-engine.test.js +0 -313
  199. package/dist/self-modification/__tests__/self-modification-engine.test.js.map +0 -1
  200. package/dist/strategy/__tests__/strategy-forge.test.d.ts +0 -1
  201. package/dist/strategy/__tests__/strategy-forge.test.js +0 -190
  202. package/dist/strategy/__tests__/strategy-forge.test.js.map +0 -1
  203. package/dist/strategy/__tests__/strategy-mutator.test.d.ts +0 -1
  204. package/dist/strategy/__tests__/strategy-mutator.test.js +0 -141
  205. package/dist/strategy/__tests__/strategy-mutator.test.js.map +0 -1
  206. package/dist/synapses/__tests__/activation.test.d.ts +0 -1
  207. package/dist/synapses/__tests__/activation.test.js +0 -87
  208. package/dist/synapses/__tests__/activation.test.js.map +0 -1
  209. package/dist/synapses/__tests__/decay.test.d.ts +0 -1
  210. package/dist/synapses/__tests__/decay.test.js +0 -73
  211. package/dist/synapses/__tests__/decay.test.js.map +0 -1
  212. package/dist/synapses/__tests__/hebbian.test.d.ts +0 -1
  213. package/dist/synapses/__tests__/hebbian.test.js +0 -95
  214. package/dist/synapses/__tests__/hebbian.test.js.map +0 -1
  215. package/dist/synapses/__tests__/pathfinder.test.d.ts +0 -1
  216. package/dist/synapses/__tests__/pathfinder.test.js +0 -74
  217. package/dist/synapses/__tests__/pathfinder.test.js.map +0 -1
  218. package/dist/synapses/__tests__/synapse-manager.test.d.ts +0 -1
  219. package/dist/synapses/__tests__/synapse-manager.test.js +0 -94
  220. package/dist/synapses/__tests__/synapse-manager.test.js.map +0 -1
  221. package/dist/teaching/__tests__/teaching.test.d.ts +0 -1
  222. package/dist/teaching/__tests__/teaching.test.js +0 -252
  223. package/dist/teaching/__tests__/teaching.test.js.map +0 -1
  224. package/dist/techradar/__tests__/techradar-engine.test.d.ts +0 -1
  225. package/dist/techradar/__tests__/techradar-engine.test.js +0 -246
  226. package/dist/techradar/__tests__/techradar-engine.test.js.map +0 -1
  227. package/dist/tool-learning/__tests__/tool-learning.test.d.ts +0 -1
  228. package/dist/tool-learning/__tests__/tool-learning.test.js +0 -187
  229. package/dist/tool-learning/__tests__/tool-learning.test.js.map +0 -1
  230. package/dist/user-model/__tests__/user-model.test.d.ts +0 -1
  231. package/dist/user-model/__tests__/user-model.test.js +0 -142
  232. package/dist/user-model/__tests__/user-model.test.js.map +0 -1
  233. package/dist/utils/__tests__/batch-queue.test.d.ts +0 -1
  234. package/dist/utils/__tests__/batch-queue.test.js +0 -85
  235. package/dist/utils/__tests__/batch-queue.test.js.map +0 -1
  236. package/dist/utils/__tests__/events.test.d.ts +0 -1
  237. package/dist/utils/__tests__/events.test.js +0 -38
  238. package/dist/utils/__tests__/events.test.js.map +0 -1
  239. package/dist/utils/__tests__/hash.test.d.ts +0 -1
  240. package/dist/utils/__tests__/hash.test.js +0 -25
  241. package/dist/utils/__tests__/hash.test.js.map +0 -1
  242. package/dist/utils/__tests__/logger.test.d.ts +0 -1
  243. package/dist/utils/__tests__/logger.test.js +0 -55
  244. package/dist/utils/__tests__/logger.test.js.map +0 -1
  245. package/dist/utils/__tests__/paths.test.d.ts +0 -1
  246. package/dist/utils/__tests__/paths.test.js +0 -50
  247. package/dist/utils/__tests__/paths.test.js.map +0 -1
  248. package/dist/utils/__tests__/retry.test.d.ts +0 -1
  249. package/dist/utils/__tests__/retry.test.js +0 -91
  250. package/dist/utils/__tests__/retry.test.js.map +0 -1
  251. package/dist/watchdog/__tests__/watchdog-service.test.d.ts +0 -1
  252. package/dist/watchdog/__tests__/watchdog-service.test.js +0 -113
  253. 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