@timmeck/brain-core 2.36.62 → 2.36.64

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 (270) hide show
  1. package/dist/action/handlers/index.d.ts +2 -0
  2. package/dist/action/handlers/index.js +1 -0
  3. package/dist/action/handlers/index.js.map +1 -1
  4. package/dist/action/handlers/mission-handler.d.ts +17 -0
  5. package/dist/action/handlers/mission-handler.js +49 -0
  6. package/dist/action/handlers/mission-handler.js.map +1 -0
  7. package/dist/action/index.d.ts +2 -2
  8. package/dist/action/index.js +1 -1
  9. package/dist/action/index.js.map +1 -1
  10. package/dist/guardrails/guardrail-engine.d.ts +2 -0
  11. package/dist/guardrails/guardrail-engine.js +17 -9
  12. package/dist/guardrails/guardrail-engine.js.map +1 -1
  13. package/dist/index.d.ts +3 -1
  14. package/dist/index.js +2 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/metacognition/evolution-engine.d.ts +3 -0
  17. package/dist/metacognition/evolution-engine.js +25 -1
  18. package/dist/metacognition/evolution-engine.js.map +1 -1
  19. package/dist/narrative/narrative-engine.d.ts +4 -0
  20. package/dist/narrative/narrative-engine.js +17 -0
  21. package/dist/narrative/narrative-engine.js.map +1 -1
  22. package/dist/research/research-orchestrator.js +56 -5
  23. package/dist/research/research-orchestrator.js.map +1 -1
  24. package/dist/utils/memory-watchdog.d.ts +33 -0
  25. package/dist/utils/memory-watchdog.js +88 -0
  26. package/dist/utils/memory-watchdog.js.map +1 -0
  27. package/package.json +1 -1
  28. package/dist/action/__tests__/action-bridge.test.d.ts +0 -1
  29. package/dist/action/__tests__/action-bridge.test.js +0 -175
  30. package/dist/action/__tests__/action-bridge.test.js.map +0 -1
  31. package/dist/action/__tests__/adjust-parameter-handler.test.d.ts +0 -1
  32. package/dist/action/__tests__/adjust-parameter-handler.test.js +0 -138
  33. package/dist/action/__tests__/adjust-parameter-handler.test.js.map +0 -1
  34. package/dist/action/__tests__/content-handler.test.d.ts +0 -1
  35. package/dist/action/__tests__/content-handler.test.js +0 -100
  36. package/dist/action/__tests__/content-handler.test.js.map +0 -1
  37. package/dist/action/__tests__/creative-seed-handler.test.d.ts +0 -1
  38. package/dist/action/__tests__/creative-seed-handler.test.js +0 -96
  39. package/dist/action/__tests__/creative-seed-handler.test.js.map +0 -1
  40. package/dist/action/__tests__/trade-handler.test.d.ts +0 -1
  41. package/dist/action/__tests__/trade-handler.test.js +0 -165
  42. package/dist/action/__tests__/trade-handler.test.js.map +0 -1
  43. package/dist/active-learning/__tests__/active-learning.test.d.ts +0 -1
  44. package/dist/active-learning/__tests__/active-learning.test.js +0 -132
  45. package/dist/active-learning/__tests__/active-learning.test.js.map +0 -1
  46. package/dist/agent-training/__tests__/agent-trainer.test.d.ts +0 -1
  47. package/dist/agent-training/__tests__/agent-trainer.test.js +0 -158
  48. package/dist/agent-training/__tests__/agent-trainer.test.js.map +0 -1
  49. package/dist/agent-training/__tests__/sub-agent-factory.test.d.ts +0 -1
  50. package/dist/agent-training/__tests__/sub-agent-factory.test.js +0 -100
  51. package/dist/agent-training/__tests__/sub-agent-factory.test.js.map +0 -1
  52. package/dist/agent-training/__tests__/sub-agent.test.d.ts +0 -1
  53. package/dist/agent-training/__tests__/sub-agent.test.js +0 -102
  54. package/dist/agent-training/__tests__/sub-agent.test.js.map +0 -1
  55. package/dist/chat/__tests__/chat-engine.test.d.ts +0 -1
  56. package/dist/chat/__tests__/chat-engine.test.js +0 -209
  57. package/dist/chat/__tests__/chat-engine.test.js.map +0 -1
  58. package/dist/checkpoint/__tests__/checkpoint-manager.test.d.ts +0 -1
  59. package/dist/checkpoint/__tests__/checkpoint-manager.test.js +0 -160
  60. package/dist/checkpoint/__tests__/checkpoint-manager.test.js.map +0 -1
  61. package/dist/code-health/__tests__/code-health.test.d.ts +0 -1
  62. package/dist/code-health/__tests__/code-health.test.js +0 -123
  63. package/dist/code-health/__tests__/code-health.test.js.map +0 -1
  64. package/dist/codegen/__tests__/code-forge.test.d.ts +0 -1
  65. package/dist/codegen/__tests__/code-forge.test.js +0 -105
  66. package/dist/codegen/__tests__/code-forge.test.js.map +0 -1
  67. package/dist/config/__tests__/loader.test.d.ts +0 -1
  68. package/dist/config/__tests__/loader.test.js +0 -86
  69. package/dist/config/__tests__/loader.test.js.map +0 -1
  70. package/dist/consciousness/__tests__/thought-stream.test.d.ts +0 -1
  71. package/dist/consciousness/__tests__/thought-stream.test.js +0 -62
  72. package/dist/consciousness/__tests__/thought-stream.test.js.map +0 -1
  73. package/dist/consensus/__tests__/consensus.test.d.ts +0 -1
  74. package/dist/consensus/__tests__/consensus.test.js +0 -159
  75. package/dist/consensus/__tests__/consensus.test.js.map +0 -1
  76. package/dist/content/__tests__/auto-publisher.test.d.ts +0 -1
  77. package/dist/content/__tests__/auto-publisher.test.js +0 -125
  78. package/dist/content/__tests__/auto-publisher.test.js.map +0 -1
  79. package/dist/content/__tests__/content-forge.test.d.ts +0 -1
  80. package/dist/content/__tests__/content-forge.test.js +0 -117
  81. package/dist/content/__tests__/content-forge.test.js.map +0 -1
  82. package/dist/creative/__tests__/creative-engine.test.d.ts +0 -1
  83. package/dist/creative/__tests__/creative-engine.test.js +0 -229
  84. package/dist/creative/__tests__/creative-engine.test.js.map +0 -1
  85. package/dist/cross-brain/__tests__/borg-sync-engine.test.d.ts +0 -1
  86. package/dist/cross-brain/__tests__/borg-sync-engine.test.js +0 -240
  87. package/dist/cross-brain/__tests__/borg-sync-engine.test.js.map +0 -1
  88. package/dist/cross-brain/__tests__/client.test.d.ts +0 -1
  89. package/dist/cross-brain/__tests__/client.test.js +0 -31
  90. package/dist/cross-brain/__tests__/client.test.js.map +0 -1
  91. package/dist/cross-brain/__tests__/notifications.test.d.ts +0 -1
  92. package/dist/cross-brain/__tests__/notifications.test.js +0 -52
  93. package/dist/cross-brain/__tests__/notifications.test.js.map +0 -1
  94. package/dist/cross-brain/__tests__/signal-router.test.d.ts +0 -1
  95. package/dist/cross-brain/__tests__/signal-router.test.js +0 -218
  96. package/dist/cross-brain/__tests__/signal-router.test.js.map +0 -1
  97. package/dist/cross-brain/__tests__/subscription.test.d.ts +0 -1
  98. package/dist/cross-brain/__tests__/subscription.test.js +0 -75
  99. package/dist/cross-brain/__tests__/subscription.test.js.map +0 -1
  100. package/dist/dashboard/__tests__/command-center-server.test.d.ts +0 -1
  101. package/dist/dashboard/__tests__/command-center-server.test.js +0 -522
  102. package/dist/dashboard/__tests__/command-center-server.test.js.map +0 -1
  103. package/dist/dashboard/__tests__/server.test.d.ts +0 -1
  104. package/dist/dashboard/__tests__/server.test.js +0 -105
  105. package/dist/dashboard/__tests__/server.test.js.map +0 -1
  106. package/dist/db/__tests__/connection.test.d.ts +0 -1
  107. package/dist/db/__tests__/connection.test.js +0 -135
  108. package/dist/db/__tests__/connection.test.js.map +0 -1
  109. package/dist/dream/__tests__/dream-engine.test.d.ts +0 -1
  110. package/dist/dream/__tests__/dream-engine.test.js +0 -184
  111. package/dist/dream/__tests__/dream-engine.test.js.map +0 -1
  112. package/dist/embeddings/__tests__/engine.test.d.ts +0 -1
  113. package/dist/embeddings/__tests__/engine.test.js +0 -82
  114. package/dist/embeddings/__tests__/engine.test.js.map +0 -1
  115. package/dist/feedback/__tests__/feedback-engine.test.d.ts +0 -1
  116. package/dist/feedback/__tests__/feedback-engine.test.js +0 -156
  117. package/dist/feedback/__tests__/feedback-engine.test.js.map +0 -1
  118. package/dist/feedback/__tests__/feedback-router.test.d.ts +0 -1
  119. package/dist/feedback/__tests__/feedback-router.test.js +0 -173
  120. package/dist/feedback/__tests__/feedback-router.test.js.map +0 -1
  121. package/dist/goals/__tests__/goal-engine.test.d.ts +0 -1
  122. package/dist/goals/__tests__/goal-engine.test.js +0 -203
  123. package/dist/goals/__tests__/goal-engine.test.js.map +0 -1
  124. package/dist/guardrails/__tests__/guardrail-engine.test.d.ts +0 -1
  125. package/dist/guardrails/__tests__/guardrail-engine.test.js +0 -343
  126. package/dist/guardrails/__tests__/guardrail-engine.test.js.map +0 -1
  127. package/dist/ipc/__tests__/integration.test.d.ts +0 -1
  128. package/dist/ipc/__tests__/integration.test.js +0 -352
  129. package/dist/ipc/__tests__/integration.test.js.map +0 -1
  130. package/dist/ipc/__tests__/protocol.test.d.ts +0 -1
  131. package/dist/ipc/__tests__/protocol.test.js +0 -69
  132. package/dist/ipc/__tests__/protocol.test.js.map +0 -1
  133. package/dist/knowledge-graph/__tests__/contradiction-resolver.test.d.ts +0 -1
  134. package/dist/knowledge-graph/__tests__/contradiction-resolver.test.js +0 -114
  135. package/dist/knowledge-graph/__tests__/contradiction-resolver.test.js.map +0 -1
  136. package/dist/knowledge-graph/__tests__/knowledge-graph.test.d.ts +0 -1
  137. package/dist/knowledge-graph/__tests__/knowledge-graph.test.js +0 -215
  138. package/dist/knowledge-graph/__tests__/knowledge-graph.test.js.map +0 -1
  139. package/dist/learning/__tests__/base-engine.test.d.ts +0 -1
  140. package/dist/learning/__tests__/base-engine.test.js +0 -49
  141. package/dist/learning/__tests__/base-engine.test.js.map +0 -1
  142. package/dist/llm/__tests__/anthropic-provider.test.d.ts +0 -1
  143. package/dist/llm/__tests__/anthropic-provider.test.js +0 -121
  144. package/dist/llm/__tests__/anthropic-provider.test.js.map +0 -1
  145. package/dist/llm/__tests__/llm-service.test.d.ts +0 -1
  146. package/dist/llm/__tests__/llm-service.test.js +0 -507
  147. package/dist/llm/__tests__/llm-service.test.js.map +0 -1
  148. package/dist/llm/__tests__/ollama-embedding.test.d.ts +0 -1
  149. package/dist/llm/__tests__/ollama-embedding.test.js +0 -128
  150. package/dist/llm/__tests__/ollama-embedding.test.js.map +0 -1
  151. package/dist/llm/__tests__/ollama-provider.test.d.ts +0 -1
  152. package/dist/llm/__tests__/ollama-provider.test.js +0 -213
  153. package/dist/llm/__tests__/ollama-provider.test.js.map +0 -1
  154. package/dist/llm/__tests__/provider.test.d.ts +0 -1
  155. package/dist/llm/__tests__/provider.test.js +0 -126
  156. package/dist/llm/__tests__/provider.test.js.map +0 -1
  157. package/dist/math/__tests__/time-decay.test.d.ts +0 -1
  158. package/dist/math/__tests__/time-decay.test.js +0 -37
  159. package/dist/math/__tests__/time-decay.test.js.map +0 -1
  160. package/dist/math/__tests__/wilson-score.test.d.ts +0 -1
  161. package/dist/math/__tests__/wilson-score.test.js +0 -43
  162. package/dist/math/__tests__/wilson-score.test.js.map +0 -1
  163. package/dist/memory/__tests__/base-memory-engine.test.d.ts +0 -1
  164. package/dist/memory/__tests__/base-memory-engine.test.js +0 -233
  165. package/dist/memory/__tests__/base-memory-engine.test.js.map +0 -1
  166. package/dist/metacognition/__tests__/auto-experiment-engine.test.d.ts +0 -1
  167. package/dist/metacognition/__tests__/auto-experiment-engine.test.js +0 -218
  168. package/dist/metacognition/__tests__/auto-experiment-engine.test.js.map +0 -1
  169. package/dist/metacognition/__tests__/evolution-engine.test.d.ts +0 -1
  170. package/dist/metacognition/__tests__/evolution-engine.test.js +0 -473
  171. package/dist/metacognition/__tests__/evolution-engine.test.js.map +0 -1
  172. package/dist/metacognition/__tests__/parameter-registry.test.d.ts +0 -1
  173. package/dist/metacognition/__tests__/parameter-registry.test.js +0 -223
  174. package/dist/metacognition/__tests__/parameter-registry.test.js.map +0 -1
  175. package/dist/missions/__tests__/mission-engine.test.d.ts +0 -1
  176. package/dist/missions/__tests__/mission-engine.test.js +0 -67
  177. package/dist/missions/__tests__/mission-engine.test.js.map +0 -1
  178. package/dist/notifications/__tests__/notification-service.test.d.ts +0 -1
  179. package/dist/notifications/__tests__/notification-service.test.js +0 -176
  180. package/dist/notifications/__tests__/notification-service.test.js.map +0 -1
  181. package/dist/plugin/__tests__/plugin-registry.test.d.ts +0 -1
  182. package/dist/plugin/__tests__/plugin-registry.test.js +0 -166
  183. package/dist/plugin/__tests__/plugin-registry.test.js.map +0 -1
  184. package/dist/prediction/__tests__/prediction-engine.test.d.ts +0 -1
  185. package/dist/prediction/__tests__/prediction-engine.test.js +0 -252
  186. package/dist/prediction/__tests__/prediction-engine.test.js.map +0 -1
  187. package/dist/proactive/__tests__/proactive-engine.test.d.ts +0 -1
  188. package/dist/proactive/__tests__/proactive-engine.test.js +0 -183
  189. package/dist/proactive/__tests__/proactive-engine.test.js.map +0 -1
  190. package/dist/rag/__tests__/rag-engine.test.d.ts +0 -1
  191. package/dist/rag/__tests__/rag-engine.test.js +0 -235
  192. package/dist/rag/__tests__/rag-engine.test.js.map +0 -1
  193. package/dist/research/__tests__/autonomy-features.test.d.ts +0 -1
  194. package/dist/research/__tests__/autonomy-features.test.js +0 -155
  195. package/dist/research/__tests__/autonomy-features.test.js.map +0 -1
  196. package/dist/research/__tests__/base-engine.test.d.ts +0 -1
  197. package/dist/research/__tests__/base-engine.test.js +0 -56
  198. package/dist/research/__tests__/base-engine.test.js.map +0 -1
  199. package/dist/research/__tests__/semantic-compressor.test.d.ts +0 -1
  200. package/dist/research/__tests__/semantic-compressor.test.js +0 -153
  201. package/dist/research/__tests__/semantic-compressor.test.js.map +0 -1
  202. package/dist/research/adapters/__tests__/playwright-adapter.test.d.ts +0 -1
  203. package/dist/research/adapters/__tests__/playwright-adapter.test.js +0 -64
  204. package/dist/research/adapters/__tests__/playwright-adapter.test.js.map +0 -1
  205. package/dist/research/adapters/__tests__/web-adapters.test.d.ts +0 -1
  206. package/dist/research/adapters/__tests__/web-adapters.test.js +0 -106
  207. package/dist/research/adapters/__tests__/web-adapters.test.js.map +0 -1
  208. package/dist/sandbox/__tests__/code-sandbox.test.d.ts +0 -1
  209. package/dist/sandbox/__tests__/code-sandbox.test.js +0 -182
  210. package/dist/sandbox/__tests__/code-sandbox.test.js.map +0 -1
  211. package/dist/scanner/__tests__/signal-scanner.test.d.ts +0 -1
  212. package/dist/scanner/__tests__/signal-scanner.test.js +0 -142
  213. package/dist/scanner/__tests__/signal-scanner.test.js.map +0 -1
  214. package/dist/self-modification/__tests__/self-modification-engine.test.d.ts +0 -1
  215. package/dist/self-modification/__tests__/self-modification-engine.test.js +0 -313
  216. package/dist/self-modification/__tests__/self-modification-engine.test.js.map +0 -1
  217. package/dist/strategy/__tests__/strategy-forge.test.d.ts +0 -1
  218. package/dist/strategy/__tests__/strategy-forge.test.js +0 -190
  219. package/dist/strategy/__tests__/strategy-forge.test.js.map +0 -1
  220. package/dist/strategy/__tests__/strategy-mutator.test.d.ts +0 -1
  221. package/dist/strategy/__tests__/strategy-mutator.test.js +0 -141
  222. package/dist/strategy/__tests__/strategy-mutator.test.js.map +0 -1
  223. package/dist/synapses/__tests__/activation.test.d.ts +0 -1
  224. package/dist/synapses/__tests__/activation.test.js +0 -87
  225. package/dist/synapses/__tests__/activation.test.js.map +0 -1
  226. package/dist/synapses/__tests__/decay.test.d.ts +0 -1
  227. package/dist/synapses/__tests__/decay.test.js +0 -73
  228. package/dist/synapses/__tests__/decay.test.js.map +0 -1
  229. package/dist/synapses/__tests__/hebbian.test.d.ts +0 -1
  230. package/dist/synapses/__tests__/hebbian.test.js +0 -95
  231. package/dist/synapses/__tests__/hebbian.test.js.map +0 -1
  232. package/dist/synapses/__tests__/pathfinder.test.d.ts +0 -1
  233. package/dist/synapses/__tests__/pathfinder.test.js +0 -74
  234. package/dist/synapses/__tests__/pathfinder.test.js.map +0 -1
  235. package/dist/synapses/__tests__/synapse-manager.test.d.ts +0 -1
  236. package/dist/synapses/__tests__/synapse-manager.test.js +0 -94
  237. package/dist/synapses/__tests__/synapse-manager.test.js.map +0 -1
  238. package/dist/teaching/__tests__/teaching.test.d.ts +0 -1
  239. package/dist/teaching/__tests__/teaching.test.js +0 -252
  240. package/dist/teaching/__tests__/teaching.test.js.map +0 -1
  241. package/dist/techradar/__tests__/techradar-engine.test.d.ts +0 -1
  242. package/dist/techradar/__tests__/techradar-engine.test.js +0 -246
  243. package/dist/techradar/__tests__/techradar-engine.test.js.map +0 -1
  244. package/dist/tool-learning/__tests__/tool-learning.test.d.ts +0 -1
  245. package/dist/tool-learning/__tests__/tool-learning.test.js +0 -187
  246. package/dist/tool-learning/__tests__/tool-learning.test.js.map +0 -1
  247. package/dist/user-model/__tests__/user-model.test.d.ts +0 -1
  248. package/dist/user-model/__tests__/user-model.test.js +0 -142
  249. package/dist/user-model/__tests__/user-model.test.js.map +0 -1
  250. package/dist/utils/__tests__/batch-queue.test.d.ts +0 -1
  251. package/dist/utils/__tests__/batch-queue.test.js +0 -85
  252. package/dist/utils/__tests__/batch-queue.test.js.map +0 -1
  253. package/dist/utils/__tests__/events.test.d.ts +0 -1
  254. package/dist/utils/__tests__/events.test.js +0 -38
  255. package/dist/utils/__tests__/events.test.js.map +0 -1
  256. package/dist/utils/__tests__/hash.test.d.ts +0 -1
  257. package/dist/utils/__tests__/hash.test.js +0 -25
  258. package/dist/utils/__tests__/hash.test.js.map +0 -1
  259. package/dist/utils/__tests__/logger.test.d.ts +0 -1
  260. package/dist/utils/__tests__/logger.test.js +0 -55
  261. package/dist/utils/__tests__/logger.test.js.map +0 -1
  262. package/dist/utils/__tests__/paths.test.d.ts +0 -1
  263. package/dist/utils/__tests__/paths.test.js +0 -50
  264. package/dist/utils/__tests__/paths.test.js.map +0 -1
  265. package/dist/utils/__tests__/retry.test.d.ts +0 -1
  266. package/dist/utils/__tests__/retry.test.js +0 -91
  267. package/dist/utils/__tests__/retry.test.js.map +0 -1
  268. package/dist/watchdog/__tests__/watchdog-service.test.d.ts +0 -1
  269. package/dist/watchdog/__tests__/watchdog-service.test.js +0 -113
  270. package/dist/watchdog/__tests__/watchdog-service.test.js.map +0 -1
@@ -1,75 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- vi.mock('../../utils/logger.js', () => ({
3
- getLogger: () => ({
4
- info: vi.fn(),
5
- warn: vi.fn(),
6
- error: vi.fn(),
7
- debug: vi.fn(),
8
- }),
9
- }));
10
- vi.mock('../../ipc/client.js', () => ({
11
- IpcClient: vi.fn().mockImplementation(() => ({
12
- connect: vi.fn().mockResolvedValue(undefined),
13
- request: vi.fn().mockResolvedValue(undefined),
14
- disconnect: vi.fn(),
15
- })),
16
- }));
17
- vi.mock('../../utils/paths.js', () => ({
18
- getPipeName: vi.fn((name) => `\\\\.\\pipe\\${name}`),
19
- }));
20
- import { CrossBrainSubscriptionManager } from '../subscription.js';
21
- describe('CrossBrainSubscriptionManager', () => {
22
- let manager;
23
- beforeEach(() => {
24
- manager = new CrossBrainSubscriptionManager('brain');
25
- });
26
- describe('getSubscriptions', () => {
27
- it('returns empty array initially', () => {
28
- expect(manager.getSubscriptions()).toEqual([]);
29
- });
30
- });
31
- describe('subscribe', () => {
32
- it('stores the subscription so getSubscriptions reflects it', async () => {
33
- const callback = vi.fn();
34
- await manager.subscribe('trading-brain', ['error:reported', 'insight:created'], callback);
35
- const subs = manager.getSubscriptions();
36
- expect(subs).toHaveLength(1);
37
- expect(subs[0].peer).toBe('trading-brain');
38
- expect(subs[0].events).toEqual(['error:reported', 'insight:created']);
39
- expect(subs[0].callback).toBe(callback);
40
- });
41
- });
42
- describe('handleIncomingEvent', () => {
43
- it('calls callback for subscribed events', async () => {
44
- const callback = vi.fn();
45
- await manager.subscribe('trading-brain', ['error:reported', 'insight:created'], callback);
46
- manager.handleIncomingEvent('trading-brain', 'error:reported', { errorId: 42 });
47
- expect(callback).toHaveBeenCalledTimes(1);
48
- expect(callback).toHaveBeenCalledWith('error:reported', { errorId: 42 });
49
- });
50
- it('does NOT call callback for unsubscribed events', async () => {
51
- const callback = vi.fn();
52
- await manager.subscribe('trading-brain', ['error:reported'], callback);
53
- manager.handleIncomingEvent('trading-brain', 'some:other:event', { data: 1 });
54
- expect(callback).not.toHaveBeenCalled();
55
- });
56
- it('does NOT call callback for wrong peer', async () => {
57
- const callback = vi.fn();
58
- await manager.subscribe('trading-brain', ['error:reported'], callback);
59
- manager.handleIncomingEvent('marketing-brain', 'error:reported', { errorId: 1 });
60
- expect(callback).not.toHaveBeenCalled();
61
- });
62
- });
63
- describe('disconnectAll', () => {
64
- it('clears all subscriptions', async () => {
65
- const cb1 = vi.fn();
66
- const cb2 = vi.fn();
67
- await manager.subscribe('trading-brain', ['error:reported'], cb1);
68
- await manager.subscribe('marketing-brain', ['insight:created'], cb2);
69
- expect(manager.getSubscriptions()).toHaveLength(2);
70
- await manager.disconnectAll();
71
- expect(manager.getSubscriptions()).toEqual([]);
72
- });
73
- });
74
- });
75
- //# sourceMappingURL=subscription.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subscription.test.js","sourceRoot":"","sources":["../../../src/cross-brain/__tests__/subscription.test.ts"],"names":[],"mappings":"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"}
@@ -1,522 +0,0 @@
1
- import { describe, it, expect, vi, afterEach } from 'vitest';
2
- import http from 'node:http';
3
- vi.mock('../../utils/logger.js', () => ({
4
- getLogger: () => ({
5
- info: vi.fn(),
6
- warn: vi.fn(),
7
- error: vi.fn(),
8
- debug: vi.fn(),
9
- }),
10
- }));
11
- import { CommandCenterServer } from '../command-center-server.js';
12
- // ── Helpers ─────────────────────────────────────────────────
13
- function request(port, path, method = 'GET', body) {
14
- return new Promise((resolve, reject) => {
15
- const req = http.request({ hostname: '127.0.0.1', port, path, method, headers: body ? { 'Content-Type': 'application/json' } : {} }, (res) => {
16
- let data = '';
17
- res.on('data', (chunk) => (data += chunk));
18
- res.on('end', () => resolve({ statusCode: res.statusCode, headers: res.headers, body: data }));
19
- });
20
- req.on('error', reject);
21
- if (body)
22
- req.write(body);
23
- req.end();
24
- });
25
- }
26
- function createMockOptions(overrides = {}) {
27
- return {
28
- port: 0,
29
- selfName: 'brain',
30
- crossBrain: {
31
- broadcast: vi.fn().mockResolvedValue([]),
32
- query: vi.fn().mockResolvedValue(null),
33
- getPeerNames: vi.fn().mockReturnValue(['trading-brain', 'marketing-brain']),
34
- getAvailablePeers: vi.fn().mockResolvedValue([]),
35
- addPeer: vi.fn(),
36
- removePeer: vi.fn(),
37
- },
38
- ecosystemService: {
39
- getStatus: vi.fn().mockResolvedValue({
40
- brains: [{ name: 'brain', available: true, version: '1.0.0', uptime: 100, pid: 1234, methods: 50 }],
41
- health: { score: 85, status: 'healthy', activeBrains: 1, totalEvents: 10, correlations: 0, recentErrors: 0, recentTradeLosses: 0, alerts: [] },
42
- correlations: [],
43
- recentEvents: [],
44
- }),
45
- getAggregatedAnalytics: vi.fn().mockResolvedValue({
46
- brain: { errors: 5, solutions: 3, modules: 10 },
47
- }),
48
- getCorrelations: vi.fn().mockReturnValue([]),
49
- getTimeline: vi.fn().mockReturnValue([]),
50
- getHealth: vi.fn().mockReturnValue({ score: 85, status: 'healthy' }),
51
- },
52
- correlator: {
53
- getHealth: vi.fn().mockReturnValue({ score: 85, status: 'healthy' }),
54
- getCorrelations: vi.fn().mockReturnValue([]),
55
- getTimeline: vi.fn().mockReturnValue([]),
56
- },
57
- watchdog: null,
58
- pluginRegistry: null,
59
- borgSync: null,
60
- thoughtStream: {
61
- onThought: vi.fn().mockReturnValue(() => { }),
62
- getRecent: vi.fn().mockReturnValue([]),
63
- getByEngine: vi.fn().mockReturnValue([]),
64
- getStats: vi.fn().mockReturnValue({ totalThoughts: 0, activeEngines: [] }),
65
- },
66
- getLLMStats: vi.fn().mockReturnValue({ totalCalls: 42, totalTokens: 5000, cacheHitRate: 0.5, callsThisHour: 3 }),
67
- getLLMHistory: vi.fn().mockReturnValue([]),
68
- ...overrides,
69
- };
70
- }
71
- function startServer(overrides = {}) {
72
- return new Promise((resolve) => {
73
- const opts = createMockOptions(overrides);
74
- const server = new CommandCenterServer(opts);
75
- server.start();
76
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
77
- const internal = server.server;
78
- internal.on('listening', () => {
79
- const addr = internal.address();
80
- resolve({ server, port: addr.port });
81
- });
82
- });
83
- }
84
- // ── Tests ───────────────────────────────────────────────────
85
- describe('CommandCenterServer', () => {
86
- let server = null;
87
- afterEach(() => {
88
- server?.stop();
89
- server = null;
90
- });
91
- it('GET / returns HTML', async () => {
92
- const result = await startServer();
93
- server = result.server;
94
- const res = await request(result.port, '/');
95
- expect(res.statusCode).toBe(200);
96
- expect(res.headers['content-type']).toContain('text/html');
97
- expect(res.body).toContain('Command Center');
98
- });
99
- it('GET /api/state returns full state snapshot', async () => {
100
- const result = await startServer();
101
- server = result.server;
102
- const res = await request(result.port, '/api/state');
103
- expect(res.statusCode).toBe(200);
104
- expect(res.headers['content-type']).toContain('application/json');
105
- const data = JSON.parse(res.body);
106
- expect(data).toHaveProperty('ecosystem');
107
- expect(data).toHaveProperty('engines');
108
- expect(data).toHaveProperty('watchdog');
109
- expect(data).toHaveProperty('plugins');
110
- expect(data).toHaveProperty('analytics');
111
- expect(data).toHaveProperty('errors');
112
- expect(data).toHaveProperty('selfmod');
113
- expect(data).toHaveProperty('missions');
114
- expect(data).toHaveProperty('knowledge');
115
- expect(data.ecosystem.brains).toHaveLength(1);
116
- expect(data.ecosystem.brains[0].name).toBe('brain');
117
- });
118
- it('GET /api/ecosystem returns ecosystem status', async () => {
119
- const result = await startServer();
120
- server = result.server;
121
- const res = await request(result.port, '/api/ecosystem');
122
- expect(res.statusCode).toBe(200);
123
- const data = JSON.parse(res.body);
124
- expect(data.brains).toBeInstanceOf(Array);
125
- expect(data.health).toHaveProperty('score');
126
- });
127
- it('GET /api/engines broadcasts to peers', async () => {
128
- const mockBroadcast = vi.fn().mockResolvedValue([
129
- { name: 'brain', result: [{ engine: 'learning', thoughtCount: 5 }] },
130
- ]);
131
- const result = await startServer({
132
- crossBrain: {
133
- broadcast: mockBroadcast,
134
- getPeerNames: vi.fn().mockReturnValue([]),
135
- },
136
- });
137
- server = result.server;
138
- const res = await request(result.port, '/api/engines');
139
- expect(res.statusCode).toBe(200);
140
- expect(mockBroadcast).toHaveBeenCalledWith('consciousness.engines');
141
- const data = JSON.parse(res.body);
142
- expect(data).toHaveLength(1);
143
- expect(data[0].name).toBe('brain');
144
- });
145
- it('GET /api/watchdog returns empty array when no watchdog', async () => {
146
- const result = await startServer({ watchdog: null });
147
- server = result.server;
148
- const res = await request(result.port, '/api/watchdog');
149
- expect(res.statusCode).toBe(200);
150
- const data = JSON.parse(res.body);
151
- expect(data).toEqual([]);
152
- });
153
- it('GET /api/watchdog returns daemon status when available', async () => {
154
- const mockWatchdog = {
155
- getStatus: vi.fn().mockReturnValue([
156
- { name: 'brain', pid: 1234, running: true, healthy: true, uptime: 5000, restarts: 0, lastCrash: null },
157
- { name: 'trading-brain', pid: 5678, running: true, healthy: false, uptime: 3000, restarts: 1, lastCrash: '2026-03-06T12:00:00Z' },
158
- { name: 'marketing-brain', pid: null, running: false, healthy: false, uptime: null, restarts: 3, lastCrash: '2026-03-06T11:00:00Z' },
159
- ]),
160
- };
161
- const result = await startServer({ watchdog: mockWatchdog });
162
- server = result.server;
163
- const res = await request(result.port, '/api/watchdog');
164
- expect(res.statusCode).toBe(200);
165
- const data = JSON.parse(res.body);
166
- expect(data).toHaveLength(3);
167
- expect(data[0].name).toBe('brain');
168
- expect(data[0].running).toBe(true);
169
- expect(data[0].healthy).toBe(true);
170
- expect(data[1].healthy).toBe(false);
171
- expect(data[2].running).toBe(false);
172
- expect(data[2].pid).toBeNull();
173
- });
174
- it('GET /api/plugins returns empty array when no registry', async () => {
175
- const result = await startServer({ pluginRegistry: null });
176
- server = result.server;
177
- const res = await request(result.port, '/api/plugins');
178
- expect(res.statusCode).toBe(200);
179
- expect(JSON.parse(res.body)).toEqual([]);
180
- });
181
- it('GET /api/plugins returns plugin list when available', async () => {
182
- const mockPlugins = {
183
- list: vi.fn().mockReturnValue([
184
- { name: 'test-plugin', version: '1.0.0', description: 'A test' },
185
- ]),
186
- };
187
- const result = await startServer({ pluginRegistry: mockPlugins });
188
- server = result.server;
189
- const res = await request(result.port, '/api/plugins');
190
- expect(res.statusCode).toBe(200);
191
- const data = JSON.parse(res.body);
192
- expect(data).toHaveLength(1);
193
- expect(data[0].name).toBe('test-plugin');
194
- });
195
- it('GET /api/borg returns not available when no borgSync', async () => {
196
- const result = await startServer({ borgSync: null });
197
- server = result.server;
198
- const res = await request(result.port, '/api/borg');
199
- expect(res.statusCode).toBe(200);
200
- const data = JSON.parse(res.body);
201
- expect(data.available).toBe(false);
202
- });
203
- it('GET /api/borg returns borg status when available', async () => {
204
- const mockBorg = {
205
- getStatus: vi.fn().mockReturnValue({ enabled: true, mode: 'full', totalSyncs: 5 }),
206
- getConfig: vi.fn().mockReturnValue({ enabled: true, mode: 'full' }),
207
- getHistory: vi.fn().mockReturnValue([]),
208
- };
209
- const result = await startServer({ borgSync: mockBorg });
210
- server = result.server;
211
- const res = await request(result.port, '/api/borg');
212
- expect(res.statusCode).toBe(200);
213
- const data = JSON.parse(res.body);
214
- expect(data.status.enabled).toBe(true);
215
- expect(data.config.mode).toBe('full');
216
- });
217
- it('GET /api/analytics returns aggregated analytics', async () => {
218
- const result = await startServer();
219
- server = result.server;
220
- const res = await request(result.port, '/api/analytics');
221
- expect(res.statusCode).toBe(200);
222
- const data = JSON.parse(res.body);
223
- expect(data.brain).toEqual({ errors: 5, solutions: 3, modules: 10 });
224
- });
225
- it('POST /api/borg/toggle toggles borg sync', async () => {
226
- const mockBorg = {
227
- getStatus: vi.fn().mockReturnValue({ enabled: false }),
228
- getConfig: vi.fn().mockReturnValue({}),
229
- getHistory: vi.fn().mockReturnValue([]),
230
- setEnabled: vi.fn(),
231
- };
232
- const result = await startServer({ borgSync: mockBorg });
233
- server = result.server;
234
- const res = await request(result.port, '/api/borg/toggle', 'POST', JSON.stringify({ enabled: true }));
235
- expect(res.statusCode).toBe(200);
236
- const data = JSON.parse(res.body);
237
- expect(data.toggled).toBe(true);
238
- expect(mockBorg.setEnabled).toHaveBeenCalledWith(true);
239
- });
240
- it('POST /api/borg/toggle returns 501 when no borgSync', async () => {
241
- const result = await startServer({ borgSync: null });
242
- server = result.server;
243
- const res = await request(result.port, '/api/borg/toggle', 'POST', JSON.stringify({ enabled: true }));
244
- expect(res.statusCode).toBe(501);
245
- });
246
- it('POST /api/borg/toggle returns 400 on invalid body', async () => {
247
- const mockBorg = {
248
- getStatus: vi.fn().mockReturnValue({ enabled: false }),
249
- getConfig: vi.fn().mockReturnValue({}),
250
- getHistory: vi.fn().mockReturnValue([]),
251
- setEnabled: vi.fn(),
252
- };
253
- const result = await startServer({ borgSync: mockBorg });
254
- server = result.server;
255
- const res = await request(result.port, '/api/borg/toggle', 'POST', JSON.stringify({ foo: 'bar' }));
256
- expect(res.statusCode).toBe(400);
257
- });
258
- it('GET /events returns SSE stream', async () => {
259
- const result = await startServer();
260
- server = result.server;
261
- const sseData = await new Promise((resolve, reject) => {
262
- const req = http.request({ hostname: '127.0.0.1', port: result.port, path: '/events' }, (res) => {
263
- expect(res.statusCode).toBe(200);
264
- expect(res.headers['content-type']).toBe('text/event-stream');
265
- let data = '';
266
- res.on('data', (chunk) => {
267
- data += chunk;
268
- if (data.includes('event: connected')) {
269
- res.destroy();
270
- resolve(data);
271
- }
272
- });
273
- });
274
- req.on('error', (err) => {
275
- if (err.message.includes('socket hang up'))
276
- return;
277
- reject(err);
278
- });
279
- req.end();
280
- });
281
- expect(sseData).toContain('event: connected');
282
- });
283
- it('GET /nonexistent returns 404', async () => {
284
- const result = await startServer();
285
- server = result.server;
286
- const res = await request(result.port, '/nonexistent');
287
- expect(res.statusCode).toBe(404);
288
- expect(res.body).toBe('Not Found');
289
- });
290
- it('OPTIONS returns 204 with CORS headers', async () => {
291
- const result = await startServer();
292
- server = result.server;
293
- const res = await request(result.port, '/', 'OPTIONS');
294
- expect(res.statusCode).toBe(204);
295
- expect(res.headers['access-control-allow-origin']).toBe('*');
296
- expect(res.headers['access-control-allow-methods']).toContain('GET');
297
- });
298
- it('sets CORS headers on all responses', async () => {
299
- const result = await startServer();
300
- server = result.server;
301
- const res = await request(result.port, '/api/ecosystem');
302
- expect(res.headers['access-control-allow-origin']).toBe('*');
303
- });
304
- it('GET /api/llm returns LLM stats', async () => {
305
- const result = await startServer();
306
- server = result.server;
307
- const res = await request(result.port, '/api/llm');
308
- expect(res.statusCode).toBe(200);
309
- const data = JSON.parse(res.body);
310
- expect(data.stats).toHaveProperty('totalCalls', 42);
311
- expect(data.history).toEqual([]);
312
- });
313
- it('GET /api/thoughts returns thought list', async () => {
314
- const mockThoughts = [{ id: '1', engine: 'learning', content: 'test', timestamp: Date.now(), significance: 'routine' }];
315
- const result = await startServer({
316
- thoughtStream: {
317
- onThought: vi.fn().mockReturnValue(() => { }),
318
- getRecent: vi.fn().mockReturnValue(mockThoughts),
319
- getByEngine: vi.fn().mockReturnValue(mockThoughts),
320
- getStats: vi.fn().mockReturnValue({ totalThoughts: 1 }),
321
- },
322
- });
323
- server = result.server;
324
- const res = await request(result.port, '/api/thoughts');
325
- expect(res.statusCode).toBe(200);
326
- const data = JSON.parse(res.body);
327
- expect(data).toHaveLength(1);
328
- expect(data[0].engine).toBe('learning');
329
- });
330
- it('GET /api/thoughts?engine=x filters by engine', async () => {
331
- const mockThoughts = [{ id: '1', engine: 'hypothesis', content: 'test', timestamp: Date.now() }];
332
- const mockTS = {
333
- onThought: vi.fn().mockReturnValue(() => { }),
334
- getRecent: vi.fn().mockReturnValue([]),
335
- getByEngine: vi.fn().mockReturnValue(mockThoughts),
336
- getStats: vi.fn().mockReturnValue({ totalThoughts: 1 }),
337
- };
338
- const result = await startServer({ thoughtStream: mockTS });
339
- server = result.server;
340
- const res = await request(result.port, '/api/thoughts?engine=hypothesis');
341
- expect(res.statusCode).toBe(200);
342
- expect(mockTS.getByEngine).toHaveBeenCalledWith('hypothesis', 50);
343
- });
344
- it('GET /api/state includes all data sources', async () => {
345
- const result = await startServer({
346
- getErrors: vi.fn().mockReturnValue({ errors: [{ message: 'test', timestamp: Date.now() }] }),
347
- getSelfModStatus: vi.fn().mockReturnValue({ totalModifications: 3, byStatus: { applied: 2, failed: 1 } }),
348
- getSelfModHistory: vi.fn().mockReturnValue([{ title: 'Fix bug', status: 'applied' }]),
349
- getMissions: vi.fn().mockReturnValue({ activeMissions: 1, completedMissions: 5, totalSources: 20 }),
350
- getMissionList: vi.fn().mockReturnValue([{ topic: 'AI research', status: 'gathering' }]),
351
- getKnowledgeStats: vi.fn().mockReturnValue({ totals: { principles: 10 }, timeSeries: [] }),
352
- });
353
- server = result.server;
354
- const res = await request(result.port, '/api/state');
355
- const data = JSON.parse(res.body);
356
- expect(data).toHaveProperty('llm');
357
- expect(data).toHaveProperty('thoughts');
358
- expect(data).toHaveProperty('errors');
359
- expect(data).toHaveProperty('selfmod');
360
- expect(data).toHaveProperty('missions');
361
- expect(data).toHaveProperty('knowledge');
362
- expect(data.llm.totalCalls).toBe(42);
363
- expect(data.errors.errors).toHaveLength(1);
364
- expect(data.selfmod.status.totalModifications).toBe(3);
365
- expect(data.missions.status.activeMissions).toBe(1);
366
- expect(data.knowledge.totals.principles).toBe(10);
367
- });
368
- // ── New endpoint tests ──────────────────────────────────
369
- it('GET /api/errors returns error data when available', async () => {
370
- const mockErrors = { errors: [{ message: 'Something broke', timestamp: Date.now(), resolved: false }] };
371
- const result = await startServer({ getErrors: vi.fn().mockReturnValue(mockErrors) });
372
- server = result.server;
373
- const res = await request(result.port, '/api/errors');
374
- expect(res.statusCode).toBe(200);
375
- const data = JSON.parse(res.body);
376
- expect(data.errors).toHaveLength(1);
377
- expect(data.errors[0].message).toBe('Something broke');
378
- });
379
- it('GET /api/errors returns empty when no error source', async () => {
380
- const result = await startServer();
381
- server = result.server;
382
- const res = await request(result.port, '/api/errors');
383
- expect(res.statusCode).toBe(200);
384
- const data = JSON.parse(res.body);
385
- expect(data).toHaveProperty('errors');
386
- });
387
- it('GET /api/selfmod returns self-modification status', async () => {
388
- const result = await startServer({
389
- getSelfModStatus: vi.fn().mockReturnValue({ totalModifications: 5, byStatus: { applied: 3, failed: 2 } }),
390
- getSelfModHistory: vi.fn().mockReturnValue([
391
- { title: 'Improve caching', status: 'applied', created_at: new Date().toISOString() },
392
- ]),
393
- });
394
- server = result.server;
395
- const res = await request(result.port, '/api/selfmod');
396
- expect(res.statusCode).toBe(200);
397
- const data = JSON.parse(res.body);
398
- expect(data.status.totalModifications).toBe(5);
399
- expect(data.history).toHaveLength(1);
400
- expect(data.history[0].title).toBe('Improve caching');
401
- });
402
- it('GET /api/selfmod returns empty when no selfmod', async () => {
403
- const result = await startServer();
404
- server = result.server;
405
- const res = await request(result.port, '/api/selfmod');
406
- expect(res.statusCode).toBe(200);
407
- const data = JSON.parse(res.body);
408
- expect(data.status).toBeNull();
409
- expect(data.history).toEqual([]);
410
- });
411
- it('GET /api/missions returns mission status and list', async () => {
412
- const result = await startServer({
413
- getMissions: vi.fn().mockReturnValue({ activeMissions: 2, completedMissions: 10, totalSources: 50 }),
414
- getMissionList: vi.fn().mockReturnValue([
415
- { topic: 'Quantum computing', status: 'gathering', depth: 'deep', sourceCount: 5 },
416
- ]),
417
- });
418
- server = result.server;
419
- const res = await request(result.port, '/api/missions');
420
- expect(res.statusCode).toBe(200);
421
- const data = JSON.parse(res.body);
422
- expect(data.status.activeMissions).toBe(2);
423
- expect(data.list).toHaveLength(1);
424
- expect(data.list[0].topic).toBe('Quantum computing');
425
- });
426
- it('GET /api/missions returns empty when no mission engine', async () => {
427
- const result = await startServer();
428
- server = result.server;
429
- const res = await request(result.port, '/api/missions');
430
- expect(res.statusCode).toBe(200);
431
- const data = JSON.parse(res.body);
432
- expect(data.status).toBeNull();
433
- expect(data.list).toEqual([]);
434
- });
435
- it('GET /api/knowledge returns knowledge stats', async () => {
436
- const result = await startServer({
437
- getKnowledgeStats: vi.fn().mockReturnValue({
438
- totals: { principles: 15, hypotheses: 30, experiments: 12, solutions: 8 },
439
- timeSeries: [{ date: '2026-03-01', errors: 5, solutions: 3 }],
440
- }),
441
- });
442
- server = result.server;
443
- const res = await request(result.port, '/api/knowledge');
444
- expect(res.statusCode).toBe(200);
445
- const data = JSON.parse(res.body);
446
- expect(data.totals.principles).toBe(15);
447
- expect(data.timeSeries).toHaveLength(1);
448
- });
449
- it('GET /api/knowledge returns empty when no source', async () => {
450
- const result = await startServer();
451
- server = result.server;
452
- const res = await request(result.port, '/api/knowledge');
453
- expect(res.statusCode).toBe(200);
454
- const data = JSON.parse(res.body);
455
- expect(data).toHaveProperty('timeSeries');
456
- });
457
- it('POST /api/action triggers an action', async () => {
458
- const mockTrigger = vi.fn().mockResolvedValue({ triggered: true });
459
- const result = await startServer({ triggerAction: mockTrigger });
460
- server = result.server;
461
- const res = await request(result.port, '/api/action', 'POST', JSON.stringify({ action: 'learning-cycle' }));
462
- expect(res.statusCode).toBe(200);
463
- const data = JSON.parse(res.body);
464
- expect(data.ok).toBe(true);
465
- expect(data.action).toBe('learning-cycle');
466
- expect(mockTrigger).toHaveBeenCalledWith('learning-cycle', undefined);
467
- });
468
- it('POST /api/action returns 501 when no triggerAction', async () => {
469
- const result = await startServer();
470
- server = result.server;
471
- const res = await request(result.port, '/api/action', 'POST', JSON.stringify({ action: 'test' }));
472
- expect(res.statusCode).toBe(501);
473
- });
474
- it('POST /api/action returns 400 on missing action', async () => {
475
- const mockTrigger = vi.fn().mockResolvedValue({});
476
- const result = await startServer({ triggerAction: mockTrigger });
477
- server = result.server;
478
- const res = await request(result.port, '/api/action', 'POST', JSON.stringify({ foo: 'bar' }));
479
- expect(res.statusCode).toBe(400);
480
- });
481
- it('stop() closes the server', async () => {
482
- const result = await startServer();
483
- server = result.server;
484
- const resBefore = await request(result.port, '/api/watchdog');
485
- expect(resBefore.statusCode).toBe(200);
486
- server.stop();
487
- server = null;
488
- await expect(request(result.port, '/')).rejects.toThrow();
489
- });
490
- // ─── Session 99: Forge API ─────────────────────────────
491
- it('GET /api/forge returns forge status data', async () => {
492
- const result = await startServer({
493
- getActionBridgeStatus: () => ({ queueSize: 3, executed24h: 12, successRate: 0.85, autoExecuteEnabled: true, topSources: [] }),
494
- getContentForgeStatus: () => ({ drafts: 5, scheduled: 2, published: 10, avgEngagement: 4.5 }),
495
- getStrategyForgeStatus: () => ({ active: 2, total: 8, avgPerformance: 0.65, topStrategy: 'btc-dca' }),
496
- getSignalRouterStatus: () => ({ totalSignals: 15, byType: [{ signalType: 'trade_signal', count: 10 }], handlerCount: 2 }),
497
- });
498
- const res = await request(result.port, '/api/forge');
499
- expect(res.statusCode).toBe(200);
500
- const data = JSON.parse(res.body);
501
- expect(data.actionBridge.queueSize).toBe(3);
502
- expect(data.contentForge.published).toBe(10);
503
- expect(data.strategyForge.topStrategy).toBe('btc-dca');
504
- expect(data.signalRouter.totalSignals).toBe(15);
505
- });
506
- it('GET /api/forge returns nulls when no getters provided', async () => {
507
- const result = await startServer({});
508
- const res = await request(result.port, '/api/forge');
509
- expect(res.statusCode).toBe(200);
510
- const data = JSON.parse(res.body);
511
- expect(data.actionBridge).toBeNull();
512
- expect(data.contentForge).toBeNull();
513
- expect(data.strategyForge).toBeNull();
514
- expect(data.signalRouter).toBeNull();
515
- });
516
- it('returns 404 for unknown routes', async () => {
517
- const result = await startServer({});
518
- const res = await request(result.port, '/api/nonexistent');
519
- expect(res.statusCode).toBe(404);
520
- });
521
- });
522
- //# sourceMappingURL=command-center-server.test.js.map