@timmeck/brain-core 2.36.61 → 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 (254) hide show
  1. package/dist/guardrails/guardrail-engine.d.ts +2 -0
  2. package/dist/guardrails/guardrail-engine.js +29 -13
  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/research/adapters/playwright-adapter.js +28 -2
  8. package/dist/research/adapters/playwright-adapter.js.map +1 -1
  9. package/dist/utils/memory-watchdog.d.ts +33 -0
  10. package/dist/utils/memory-watchdog.js +88 -0
  11. package/dist/utils/memory-watchdog.js.map +1 -0
  12. package/dist/watchdog/watchdog-service.js +11 -5
  13. package/dist/watchdog/watchdog-service.js.map +1 -1
  14. package/package.json +1 -1
  15. package/dist/action/__tests__/action-bridge.test.d.ts +0 -1
  16. package/dist/action/__tests__/action-bridge.test.js +0 -175
  17. package/dist/action/__tests__/action-bridge.test.js.map +0 -1
  18. package/dist/action/__tests__/adjust-parameter-handler.test.d.ts +0 -1
  19. package/dist/action/__tests__/adjust-parameter-handler.test.js +0 -138
  20. package/dist/action/__tests__/adjust-parameter-handler.test.js.map +0 -1
  21. package/dist/action/__tests__/content-handler.test.d.ts +0 -1
  22. package/dist/action/__tests__/content-handler.test.js +0 -100
  23. package/dist/action/__tests__/content-handler.test.js.map +0 -1
  24. package/dist/action/__tests__/creative-seed-handler.test.d.ts +0 -1
  25. package/dist/action/__tests__/creative-seed-handler.test.js +0 -96
  26. package/dist/action/__tests__/creative-seed-handler.test.js.map +0 -1
  27. package/dist/action/__tests__/trade-handler.test.d.ts +0 -1
  28. package/dist/action/__tests__/trade-handler.test.js +0 -165
  29. package/dist/action/__tests__/trade-handler.test.js.map +0 -1
  30. package/dist/active-learning/__tests__/active-learning.test.d.ts +0 -1
  31. package/dist/active-learning/__tests__/active-learning.test.js +0 -132
  32. package/dist/active-learning/__tests__/active-learning.test.js.map +0 -1
  33. package/dist/agent-training/__tests__/agent-trainer.test.d.ts +0 -1
  34. package/dist/agent-training/__tests__/agent-trainer.test.js +0 -158
  35. package/dist/agent-training/__tests__/agent-trainer.test.js.map +0 -1
  36. package/dist/agent-training/__tests__/sub-agent-factory.test.d.ts +0 -1
  37. package/dist/agent-training/__tests__/sub-agent-factory.test.js +0 -100
  38. package/dist/agent-training/__tests__/sub-agent-factory.test.js.map +0 -1
  39. package/dist/agent-training/__tests__/sub-agent.test.d.ts +0 -1
  40. package/dist/agent-training/__tests__/sub-agent.test.js +0 -102
  41. package/dist/agent-training/__tests__/sub-agent.test.js.map +0 -1
  42. package/dist/chat/__tests__/chat-engine.test.d.ts +0 -1
  43. package/dist/chat/__tests__/chat-engine.test.js +0 -209
  44. package/dist/chat/__tests__/chat-engine.test.js.map +0 -1
  45. package/dist/checkpoint/__tests__/checkpoint-manager.test.d.ts +0 -1
  46. package/dist/checkpoint/__tests__/checkpoint-manager.test.js +0 -160
  47. package/dist/checkpoint/__tests__/checkpoint-manager.test.js.map +0 -1
  48. package/dist/code-health/__tests__/code-health.test.d.ts +0 -1
  49. package/dist/code-health/__tests__/code-health.test.js +0 -123
  50. package/dist/code-health/__tests__/code-health.test.js.map +0 -1
  51. package/dist/codegen/__tests__/code-forge.test.d.ts +0 -1
  52. package/dist/codegen/__tests__/code-forge.test.js +0 -105
  53. package/dist/codegen/__tests__/code-forge.test.js.map +0 -1
  54. package/dist/config/__tests__/loader.test.d.ts +0 -1
  55. package/dist/config/__tests__/loader.test.js +0 -86
  56. package/dist/config/__tests__/loader.test.js.map +0 -1
  57. package/dist/consciousness/__tests__/thought-stream.test.d.ts +0 -1
  58. package/dist/consciousness/__tests__/thought-stream.test.js +0 -62
  59. package/dist/consciousness/__tests__/thought-stream.test.js.map +0 -1
  60. package/dist/consensus/__tests__/consensus.test.d.ts +0 -1
  61. package/dist/consensus/__tests__/consensus.test.js +0 -159
  62. package/dist/consensus/__tests__/consensus.test.js.map +0 -1
  63. package/dist/content/__tests__/auto-publisher.test.d.ts +0 -1
  64. package/dist/content/__tests__/auto-publisher.test.js +0 -125
  65. package/dist/content/__tests__/auto-publisher.test.js.map +0 -1
  66. package/dist/content/__tests__/content-forge.test.d.ts +0 -1
  67. package/dist/content/__tests__/content-forge.test.js +0 -117
  68. package/dist/content/__tests__/content-forge.test.js.map +0 -1
  69. package/dist/creative/__tests__/creative-engine.test.d.ts +0 -1
  70. package/dist/creative/__tests__/creative-engine.test.js +0 -229
  71. package/dist/creative/__tests__/creative-engine.test.js.map +0 -1
  72. package/dist/cross-brain/__tests__/borg-sync-engine.test.d.ts +0 -1
  73. package/dist/cross-brain/__tests__/borg-sync-engine.test.js +0 -240
  74. package/dist/cross-brain/__tests__/borg-sync-engine.test.js.map +0 -1
  75. package/dist/cross-brain/__tests__/client.test.d.ts +0 -1
  76. package/dist/cross-brain/__tests__/client.test.js +0 -31
  77. package/dist/cross-brain/__tests__/client.test.js.map +0 -1
  78. package/dist/cross-brain/__tests__/notifications.test.d.ts +0 -1
  79. package/dist/cross-brain/__tests__/notifications.test.js +0 -52
  80. package/dist/cross-brain/__tests__/notifications.test.js.map +0 -1
  81. package/dist/cross-brain/__tests__/signal-router.test.d.ts +0 -1
  82. package/dist/cross-brain/__tests__/signal-router.test.js +0 -218
  83. package/dist/cross-brain/__tests__/signal-router.test.js.map +0 -1
  84. package/dist/cross-brain/__tests__/subscription.test.d.ts +0 -1
  85. package/dist/cross-brain/__tests__/subscription.test.js +0 -75
  86. package/dist/cross-brain/__tests__/subscription.test.js.map +0 -1
  87. package/dist/dashboard/__tests__/command-center-server.test.d.ts +0 -1
  88. package/dist/dashboard/__tests__/command-center-server.test.js +0 -522
  89. package/dist/dashboard/__tests__/command-center-server.test.js.map +0 -1
  90. package/dist/dashboard/__tests__/server.test.d.ts +0 -1
  91. package/dist/dashboard/__tests__/server.test.js +0 -105
  92. package/dist/dashboard/__tests__/server.test.js.map +0 -1
  93. package/dist/db/__tests__/connection.test.d.ts +0 -1
  94. package/dist/db/__tests__/connection.test.js +0 -135
  95. package/dist/db/__tests__/connection.test.js.map +0 -1
  96. package/dist/dream/__tests__/dream-engine.test.d.ts +0 -1
  97. package/dist/dream/__tests__/dream-engine.test.js +0 -184
  98. package/dist/dream/__tests__/dream-engine.test.js.map +0 -1
  99. package/dist/embeddings/__tests__/engine.test.d.ts +0 -1
  100. package/dist/embeddings/__tests__/engine.test.js +0 -82
  101. package/dist/embeddings/__tests__/engine.test.js.map +0 -1
  102. package/dist/feedback/__tests__/feedback-engine.test.d.ts +0 -1
  103. package/dist/feedback/__tests__/feedback-engine.test.js +0 -156
  104. package/dist/feedback/__tests__/feedback-engine.test.js.map +0 -1
  105. package/dist/feedback/__tests__/feedback-router.test.d.ts +0 -1
  106. package/dist/feedback/__tests__/feedback-router.test.js +0 -173
  107. package/dist/feedback/__tests__/feedback-router.test.js.map +0 -1
  108. package/dist/goals/__tests__/goal-engine.test.d.ts +0 -1
  109. package/dist/goals/__tests__/goal-engine.test.js +0 -203
  110. package/dist/goals/__tests__/goal-engine.test.js.map +0 -1
  111. package/dist/guardrails/__tests__/guardrail-engine.test.d.ts +0 -1
  112. package/dist/guardrails/__tests__/guardrail-engine.test.js +0 -343
  113. package/dist/guardrails/__tests__/guardrail-engine.test.js.map +0 -1
  114. package/dist/ipc/__tests__/integration.test.d.ts +0 -1
  115. package/dist/ipc/__tests__/integration.test.js +0 -352
  116. package/dist/ipc/__tests__/integration.test.js.map +0 -1
  117. package/dist/ipc/__tests__/protocol.test.d.ts +0 -1
  118. package/dist/ipc/__tests__/protocol.test.js +0 -69
  119. package/dist/ipc/__tests__/protocol.test.js.map +0 -1
  120. package/dist/knowledge-graph/__tests__/contradiction-resolver.test.d.ts +0 -1
  121. package/dist/knowledge-graph/__tests__/contradiction-resolver.test.js +0 -114
  122. package/dist/knowledge-graph/__tests__/contradiction-resolver.test.js.map +0 -1
  123. package/dist/knowledge-graph/__tests__/knowledge-graph.test.d.ts +0 -1
  124. package/dist/knowledge-graph/__tests__/knowledge-graph.test.js +0 -215
  125. package/dist/knowledge-graph/__tests__/knowledge-graph.test.js.map +0 -1
  126. package/dist/learning/__tests__/base-engine.test.d.ts +0 -1
  127. package/dist/learning/__tests__/base-engine.test.js +0 -49
  128. package/dist/learning/__tests__/base-engine.test.js.map +0 -1
  129. package/dist/llm/__tests__/anthropic-provider.test.d.ts +0 -1
  130. package/dist/llm/__tests__/anthropic-provider.test.js +0 -121
  131. package/dist/llm/__tests__/anthropic-provider.test.js.map +0 -1
  132. package/dist/llm/__tests__/llm-service.test.d.ts +0 -1
  133. package/dist/llm/__tests__/llm-service.test.js +0 -507
  134. package/dist/llm/__tests__/llm-service.test.js.map +0 -1
  135. package/dist/llm/__tests__/ollama-embedding.test.d.ts +0 -1
  136. package/dist/llm/__tests__/ollama-embedding.test.js +0 -128
  137. package/dist/llm/__tests__/ollama-embedding.test.js.map +0 -1
  138. package/dist/llm/__tests__/ollama-provider.test.d.ts +0 -1
  139. package/dist/llm/__tests__/ollama-provider.test.js +0 -213
  140. package/dist/llm/__tests__/ollama-provider.test.js.map +0 -1
  141. package/dist/llm/__tests__/provider.test.d.ts +0 -1
  142. package/dist/llm/__tests__/provider.test.js +0 -126
  143. package/dist/llm/__tests__/provider.test.js.map +0 -1
  144. package/dist/math/__tests__/time-decay.test.d.ts +0 -1
  145. package/dist/math/__tests__/time-decay.test.js +0 -37
  146. package/dist/math/__tests__/time-decay.test.js.map +0 -1
  147. package/dist/math/__tests__/wilson-score.test.d.ts +0 -1
  148. package/dist/math/__tests__/wilson-score.test.js +0 -43
  149. package/dist/math/__tests__/wilson-score.test.js.map +0 -1
  150. package/dist/memory/__tests__/base-memory-engine.test.d.ts +0 -1
  151. package/dist/memory/__tests__/base-memory-engine.test.js +0 -233
  152. package/dist/memory/__tests__/base-memory-engine.test.js.map +0 -1
  153. package/dist/metacognition/__tests__/auto-experiment-engine.test.d.ts +0 -1
  154. package/dist/metacognition/__tests__/auto-experiment-engine.test.js +0 -218
  155. package/dist/metacognition/__tests__/auto-experiment-engine.test.js.map +0 -1
  156. package/dist/metacognition/__tests__/evolution-engine.test.d.ts +0 -1
  157. package/dist/metacognition/__tests__/evolution-engine.test.js +0 -473
  158. package/dist/metacognition/__tests__/evolution-engine.test.js.map +0 -1
  159. package/dist/metacognition/__tests__/parameter-registry.test.d.ts +0 -1
  160. package/dist/metacognition/__tests__/parameter-registry.test.js +0 -223
  161. package/dist/metacognition/__tests__/parameter-registry.test.js.map +0 -1
  162. package/dist/missions/__tests__/mission-engine.test.d.ts +0 -1
  163. package/dist/missions/__tests__/mission-engine.test.js +0 -67
  164. package/dist/missions/__tests__/mission-engine.test.js.map +0 -1
  165. package/dist/notifications/__tests__/notification-service.test.d.ts +0 -1
  166. package/dist/notifications/__tests__/notification-service.test.js +0 -176
  167. package/dist/notifications/__tests__/notification-service.test.js.map +0 -1
  168. package/dist/plugin/__tests__/plugin-registry.test.d.ts +0 -1
  169. package/dist/plugin/__tests__/plugin-registry.test.js +0 -166
  170. package/dist/plugin/__tests__/plugin-registry.test.js.map +0 -1
  171. package/dist/prediction/__tests__/prediction-engine.test.d.ts +0 -1
  172. package/dist/prediction/__tests__/prediction-engine.test.js +0 -252
  173. package/dist/prediction/__tests__/prediction-engine.test.js.map +0 -1
  174. package/dist/proactive/__tests__/proactive-engine.test.d.ts +0 -1
  175. package/dist/proactive/__tests__/proactive-engine.test.js +0 -183
  176. package/dist/proactive/__tests__/proactive-engine.test.js.map +0 -1
  177. package/dist/rag/__tests__/rag-engine.test.d.ts +0 -1
  178. package/dist/rag/__tests__/rag-engine.test.js +0 -235
  179. package/dist/rag/__tests__/rag-engine.test.js.map +0 -1
  180. package/dist/research/__tests__/autonomy-features.test.d.ts +0 -1
  181. package/dist/research/__tests__/autonomy-features.test.js +0 -155
  182. package/dist/research/__tests__/autonomy-features.test.js.map +0 -1
  183. package/dist/research/__tests__/base-engine.test.d.ts +0 -1
  184. package/dist/research/__tests__/base-engine.test.js +0 -56
  185. package/dist/research/__tests__/base-engine.test.js.map +0 -1
  186. package/dist/research/__tests__/semantic-compressor.test.d.ts +0 -1
  187. package/dist/research/__tests__/semantic-compressor.test.js +0 -153
  188. package/dist/research/__tests__/semantic-compressor.test.js.map +0 -1
  189. package/dist/research/adapters/__tests__/web-adapters.test.d.ts +0 -1
  190. package/dist/research/adapters/__tests__/web-adapters.test.js +0 -106
  191. package/dist/research/adapters/__tests__/web-adapters.test.js.map +0 -1
  192. package/dist/sandbox/__tests__/code-sandbox.test.d.ts +0 -1
  193. package/dist/sandbox/__tests__/code-sandbox.test.js +0 -182
  194. package/dist/sandbox/__tests__/code-sandbox.test.js.map +0 -1
  195. package/dist/scanner/__tests__/signal-scanner.test.d.ts +0 -1
  196. package/dist/scanner/__tests__/signal-scanner.test.js +0 -142
  197. package/dist/scanner/__tests__/signal-scanner.test.js.map +0 -1
  198. package/dist/self-modification/__tests__/self-modification-engine.test.d.ts +0 -1
  199. package/dist/self-modification/__tests__/self-modification-engine.test.js +0 -313
  200. package/dist/self-modification/__tests__/self-modification-engine.test.js.map +0 -1
  201. package/dist/strategy/__tests__/strategy-forge.test.d.ts +0 -1
  202. package/dist/strategy/__tests__/strategy-forge.test.js +0 -190
  203. package/dist/strategy/__tests__/strategy-forge.test.js.map +0 -1
  204. package/dist/strategy/__tests__/strategy-mutator.test.d.ts +0 -1
  205. package/dist/strategy/__tests__/strategy-mutator.test.js +0 -141
  206. package/dist/strategy/__tests__/strategy-mutator.test.js.map +0 -1
  207. package/dist/synapses/__tests__/activation.test.d.ts +0 -1
  208. package/dist/synapses/__tests__/activation.test.js +0 -87
  209. package/dist/synapses/__tests__/activation.test.js.map +0 -1
  210. package/dist/synapses/__tests__/decay.test.d.ts +0 -1
  211. package/dist/synapses/__tests__/decay.test.js +0 -73
  212. package/dist/synapses/__tests__/decay.test.js.map +0 -1
  213. package/dist/synapses/__tests__/hebbian.test.d.ts +0 -1
  214. package/dist/synapses/__tests__/hebbian.test.js +0 -95
  215. package/dist/synapses/__tests__/hebbian.test.js.map +0 -1
  216. package/dist/synapses/__tests__/pathfinder.test.d.ts +0 -1
  217. package/dist/synapses/__tests__/pathfinder.test.js +0 -74
  218. package/dist/synapses/__tests__/pathfinder.test.js.map +0 -1
  219. package/dist/synapses/__tests__/synapse-manager.test.d.ts +0 -1
  220. package/dist/synapses/__tests__/synapse-manager.test.js +0 -94
  221. package/dist/synapses/__tests__/synapse-manager.test.js.map +0 -1
  222. package/dist/teaching/__tests__/teaching.test.d.ts +0 -1
  223. package/dist/teaching/__tests__/teaching.test.js +0 -252
  224. package/dist/teaching/__tests__/teaching.test.js.map +0 -1
  225. package/dist/techradar/__tests__/techradar-engine.test.d.ts +0 -1
  226. package/dist/techradar/__tests__/techradar-engine.test.js +0 -246
  227. package/dist/techradar/__tests__/techradar-engine.test.js.map +0 -1
  228. package/dist/tool-learning/__tests__/tool-learning.test.d.ts +0 -1
  229. package/dist/tool-learning/__tests__/tool-learning.test.js +0 -187
  230. package/dist/tool-learning/__tests__/tool-learning.test.js.map +0 -1
  231. package/dist/user-model/__tests__/user-model.test.d.ts +0 -1
  232. package/dist/user-model/__tests__/user-model.test.js +0 -142
  233. package/dist/user-model/__tests__/user-model.test.js.map +0 -1
  234. package/dist/utils/__tests__/batch-queue.test.d.ts +0 -1
  235. package/dist/utils/__tests__/batch-queue.test.js +0 -85
  236. package/dist/utils/__tests__/batch-queue.test.js.map +0 -1
  237. package/dist/utils/__tests__/events.test.d.ts +0 -1
  238. package/dist/utils/__tests__/events.test.js +0 -38
  239. package/dist/utils/__tests__/events.test.js.map +0 -1
  240. package/dist/utils/__tests__/hash.test.d.ts +0 -1
  241. package/dist/utils/__tests__/hash.test.js +0 -25
  242. package/dist/utils/__tests__/hash.test.js.map +0 -1
  243. package/dist/utils/__tests__/logger.test.d.ts +0 -1
  244. package/dist/utils/__tests__/logger.test.js +0 -55
  245. package/dist/utils/__tests__/logger.test.js.map +0 -1
  246. package/dist/utils/__tests__/paths.test.d.ts +0 -1
  247. package/dist/utils/__tests__/paths.test.js +0 -50
  248. package/dist/utils/__tests__/paths.test.js.map +0 -1
  249. package/dist/utils/__tests__/retry.test.d.ts +0 -1
  250. package/dist/utils/__tests__/retry.test.js +0 -91
  251. package/dist/utils/__tests__/retry.test.js.map +0 -1
  252. package/dist/watchdog/__tests__/watchdog-service.test.d.ts +0 -1
  253. package/dist/watchdog/__tests__/watchdog-service.test.js +0 -113
  254. package/dist/watchdog/__tests__/watchdog-service.test.js.map +0 -1
@@ -1,352 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } 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
- createLogger: () => ({
10
- info: vi.fn(),
11
- warn: vi.fn(),
12
- error: vi.fn(),
13
- debug: vi.fn(),
14
- }),
15
- resetLogger: vi.fn(),
16
- }));
17
- import { IpcServer } from '../server.js';
18
- import { IpcClient } from '../client.js';
19
- /** Generate a unique pipe name to avoid conflicts between tests. */
20
- function uniquePipe() {
21
- const id = `test-ipc-${Date.now()}-${Math.random().toString(36).slice(2)}`;
22
- if (process.platform === 'win32') {
23
- return `\\\\.\\pipe\\${id}`;
24
- }
25
- return `/tmp/${id}.sock`;
26
- }
27
- /** Small delay helper for async settling. */
28
- function delay(ms) {
29
- return new Promise((resolve) => setTimeout(resolve, ms));
30
- }
31
- /** Wait for server to be listening (poll with connect probe). */
32
- async function waitForServer(pipeName, timeout = 3000) {
33
- const start = Date.now();
34
- while (Date.now() - start < timeout) {
35
- try {
36
- const probe = new IpcClient(pipeName, 1000);
37
- await probe.connect();
38
- probe.disconnect();
39
- return;
40
- }
41
- catch {
42
- await delay(30);
43
- }
44
- }
45
- throw new Error(`Server did not become ready within ${timeout}ms`);
46
- }
47
- describe('IPC Integration', () => {
48
- let server;
49
- let client;
50
- let pipeName;
51
- const clients = [];
52
- /** Helper router for most tests. */
53
- function makeRouter(methods) {
54
- const methodMap = {
55
- 'status': () => ({ running: true }),
56
- 'echo': (params) => params,
57
- 'add': (params) => {
58
- const p = params;
59
- return p.a + p.b;
60
- },
61
- 'error-route': () => { throw new Error('Intentional error'); },
62
- 'slow': () => {
63
- // Synchronous block: spin for a while so the client times out.
64
- const until = Date.now() + 2000;
65
- while (Date.now() < until) { /* busy-wait */ }
66
- return { done: true };
67
- },
68
- ...methods,
69
- };
70
- return {
71
- handle(method, params) {
72
- const handler = methodMap[method];
73
- if (!handler)
74
- throw new Error(`Unknown method: ${method}`);
75
- return handler(params);
76
- },
77
- listMethods() {
78
- return Object.keys(methodMap);
79
- },
80
- };
81
- }
82
- beforeEach(() => {
83
- pipeName = uniquePipe();
84
- clients.length = 0;
85
- });
86
- afterEach(() => {
87
- // Disconnect any tracked clients first.
88
- for (const c of clients) {
89
- try {
90
- c.disconnect();
91
- }
92
- catch { /* ignore */ }
93
- }
94
- try {
95
- client?.disconnect();
96
- }
97
- catch { /* ignore */ }
98
- try {
99
- server?.stop();
100
- }
101
- catch { /* ignore */ }
102
- });
103
- // ─── 1. Server starts and stops without error ────────────────────────
104
- it('server starts and stops without error', async () => {
105
- server = new IpcServer(makeRouter(), pipeName);
106
- server.start();
107
- await waitForServer(pipeName);
108
- // If we got here, server started. Now stop it.
109
- server.stop();
110
- // After stop, a new client connection should fail.
111
- const probe = new IpcClient(pipeName, 500);
112
- await expect(probe.connect()).rejects.toThrow();
113
- }, 10_000);
114
- // ─── 2. Client connects to server ───────────────────────────────────
115
- it('client connects to server', async () => {
116
- server = new IpcServer(makeRouter(), pipeName);
117
- server.start();
118
- await waitForServer(pipeName);
119
- client = new IpcClient(pipeName, 3000);
120
- await client.connect();
121
- expect(client.connected).toBe(true);
122
- }, 10_000);
123
- // ─── 3. Client sends request, server responds via registered route ──
124
- it('client sends request and receives response', async () => {
125
- server = new IpcServer(makeRouter(), pipeName);
126
- server.start();
127
- await waitForServer(pipeName);
128
- client = new IpcClient(pipeName, 3000);
129
- await client.connect();
130
- const result = await client.request('status');
131
- expect(result).toEqual({ running: true });
132
- }, 10_000);
133
- // ─── 4. Multiple concurrent requests work correctly ─────────────────
134
- it('multiple concurrent requests resolve correctly', async () => {
135
- server = new IpcServer(makeRouter(), pipeName);
136
- server.start();
137
- await waitForServer(pipeName);
138
- client = new IpcClient(pipeName, 3000);
139
- await client.connect();
140
- const results = await Promise.all([
141
- client.request('echo', { msg: 'one' }),
142
- client.request('echo', { msg: 'two' }),
143
- client.request('echo', { msg: 'three' }),
144
- client.request('add', { a: 10, b: 20 }),
145
- client.request('status'),
146
- ]);
147
- expect(results[0]).toEqual({ msg: 'one' });
148
- expect(results[1]).toEqual({ msg: 'two' });
149
- expect(results[2]).toEqual({ msg: 'three' });
150
- expect(results[3]).toBe(30);
151
- expect(results[4]).toEqual({ running: true });
152
- }, 10_000);
153
- // ─── 5. Request with unknown method returns error ───────────────────
154
- it('request with unknown method returns error', async () => {
155
- server = new IpcServer(makeRouter(), pipeName);
156
- server.start();
157
- await waitForServer(pipeName);
158
- client = new IpcClient(pipeName, 3000);
159
- await client.connect();
160
- await expect(client.request('nonexistent.method')).rejects.toThrow('Unknown method: nonexistent.method');
161
- }, 10_000);
162
- // ─── 6. Client timeout on slow handler ──────────────────────────────
163
- it('client timeout on slow handler', async () => {
164
- server = new IpcServer(makeRouter(), pipeName);
165
- server.start();
166
- await waitForServer(pipeName);
167
- // Use a very short timeout so the slow handler triggers it.
168
- client = new IpcClient(pipeName, 200);
169
- await client.connect();
170
- await expect(client.request('slow')).rejects.toThrow(/timeout/i);
171
- }, 15_000);
172
- // ─── 7. Server handles multiple simultaneous clients ────────────────
173
- it('server handles multiple simultaneous clients', async () => {
174
- server = new IpcServer(makeRouter(), pipeName);
175
- server.start();
176
- await waitForServer(pipeName);
177
- const client1 = new IpcClient(pipeName, 3000);
178
- const client2 = new IpcClient(pipeName, 3000);
179
- const client3 = new IpcClient(pipeName, 3000);
180
- clients.push(client1, client2, client3);
181
- await Promise.all([
182
- client1.connect(),
183
- client2.connect(),
184
- client3.connect(),
185
- ]);
186
- expect(client1.connected).toBe(true);
187
- expect(client2.connected).toBe(true);
188
- expect(client3.connected).toBe(true);
189
- // Each client can independently make requests.
190
- const [r1, r2, r3] = await Promise.all([
191
- client1.request('echo', { from: 'client1' }),
192
- client2.request('echo', { from: 'client2' }),
193
- client3.request('add', { a: 5, b: 7 }),
194
- ]);
195
- expect(r1).toEqual({ from: 'client1' });
196
- expect(r2).toEqual({ from: 'client2' });
197
- expect(r3).toBe(12);
198
- }, 10_000);
199
- // ─── 8. Client disconnect and reconnect ─────────────────────────────
200
- it('client disconnect and reconnect', async () => {
201
- server = new IpcServer(makeRouter(), pipeName);
202
- server.start();
203
- await waitForServer(pipeName);
204
- client = new IpcClient(pipeName, 3000);
205
- await client.connect();
206
- expect(client.connected).toBe(true);
207
- const result1 = await client.request('echo', { step: 'first' });
208
- expect(result1).toEqual({ step: 'first' });
209
- // Disconnect.
210
- client.disconnect();
211
- expect(client.connected).toBe(false);
212
- // Wait a beat for the server to process the disconnect.
213
- await delay(100);
214
- // Reconnect — need a new client instance since the decoder/socket state is reset.
215
- client = new IpcClient(pipeName, 3000);
216
- await client.connect();
217
- expect(client.connected).toBe(true);
218
- const result2 = await client.request('echo', { step: 'second' });
219
- expect(result2).toEqual({ step: 'second' });
220
- }, 10_000);
221
- // ─── 9. Server notification to connected clients ────────────────────
222
- it('server notification is received by client', async () => {
223
- server = new IpcServer(makeRouter(), pipeName);
224
- server.start();
225
- await waitForServer(pipeName);
226
- client = new IpcClient(pipeName, 3000);
227
- await client.connect();
228
- // Set up a promise that resolves when a notification is received.
229
- const notificationPromise = new Promise((resolve) => {
230
- client.setNotificationHandler((msg) => {
231
- resolve(msg);
232
- });
233
- });
234
- // Allow the connection to fully settle on the server side.
235
- await delay(50);
236
- // Broadcast notification to all connected clients.
237
- server.notify(null, { method: 'event.update', params: { key: 'value' } });
238
- // Wait for the notification to arrive (with a timeout guard).
239
- const received = await Promise.race([
240
- notificationPromise,
241
- delay(3000).then(() => { throw new Error('Notification not received within 3s'); }),
242
- ]);
243
- expect(received.type).toBe('notification');
244
- expect(received.method).toBe('event.update');
245
- expect(received.params).toEqual({ key: 'value' });
246
- }, 10_000);
247
- // ─── 10. Server getClientCount reflects connected clients ───────────
248
- it('getClientCount reflects connected clients', async () => {
249
- server = new IpcServer(makeRouter(), pipeName);
250
- server.start();
251
- await waitForServer(pipeName);
252
- // Wait for probe client from waitForServer to fully disconnect
253
- await delay(200);
254
- const baseline = server.getClientCount();
255
- const client1 = new IpcClient(pipeName, 3000);
256
- const client2 = new IpcClient(pipeName, 3000);
257
- clients.push(client1, client2);
258
- await client1.connect();
259
- await delay(100);
260
- expect(server.getClientCount()).toBe(baseline + 1);
261
- await client2.connect();
262
- await delay(100);
263
- expect(server.getClientCount()).toBe(baseline + 2);
264
- client1.disconnect();
265
- await delay(200);
266
- expect(server.getClientCount()).toBe(baseline + 1);
267
- client2.disconnect();
268
- await delay(200);
269
- expect(server.getClientCount()).toBe(baseline);
270
- }, 10_000);
271
- // ─── 11. Error in route handler is returned as error response ───────
272
- it('error in route handler is returned as error response', async () => {
273
- server = new IpcServer(makeRouter(), pipeName);
274
- server.start();
275
- await waitForServer(pipeName);
276
- client = new IpcClient(pipeName, 3000);
277
- await client.connect();
278
- await expect(client.request('error-route')).rejects.toThrow('Intentional error');
279
- }, 10_000);
280
- // ─── 12. Request after client disconnect rejects ────────────────────
281
- it('request after client disconnect rejects with not-connected error', async () => {
282
- server = new IpcServer(makeRouter(), pipeName);
283
- server.start();
284
- await waitForServer(pipeName);
285
- client = new IpcClient(pipeName, 3000);
286
- await client.connect();
287
- client.disconnect();
288
- await expect(client.request('status')).rejects.toThrow('Not connected');
289
- }, 10_000);
290
- // ─── 13. Notification to specific client only reaches that client ───
291
- it('notification to specific client only reaches that client', async () => {
292
- server = new IpcServer(makeRouter(), pipeName);
293
- server.start();
294
- await waitForServer(pipeName);
295
- const client1 = new IpcClient(pipeName, 3000);
296
- const client2 = new IpcClient(pipeName, 3000);
297
- clients.push(client1, client2);
298
- await client1.connect();
299
- await delay(50);
300
- await client2.connect();
301
- await delay(50);
302
- const received1 = [];
303
- const received2 = [];
304
- client1.setNotificationHandler((msg) => received1.push(msg));
305
- client2.setNotificationHandler((msg) => received2.push(msg));
306
- // Get the first client's ID from the server's internal clients map.
307
- // We access it by sending to the first client only.
308
- // The server.clients is private, so we use the getClientCount + notify(null) approach:
309
- // Instead, we can get the client IDs via a side-channel — make a request from client1
310
- // and inspect server internals. But since clients map is private, we will test
311
- // targeted notification by sending to null (broadcast) vs targeted.
312
- // For targeted notification, we need a clientId. We cannot access it directly,
313
- // so we test broadcast isolation differently: broadcast reaches all clients.
314
- server.notify(null, { method: 'broadcast.test', params: { all: true } });
315
- await delay(200);
316
- expect(received1.length).toBe(1);
317
- expect(received1[0].method).toBe('broadcast.test');
318
- expect(received2.length).toBe(1);
319
- expect(received2[0].method).toBe('broadcast.test');
320
- }, 10_000);
321
- // ─── 14. Echo with complex nested data preserves structure ──────────
322
- it('echo with complex nested data preserves structure', async () => {
323
- server = new IpcServer(makeRouter(), pipeName);
324
- server.start();
325
- await waitForServer(pipeName);
326
- client = new IpcClient(pipeName, 3000);
327
- await client.connect();
328
- const complexData = {
329
- name: 'test',
330
- nested: { deep: { value: 42 } },
331
- array: [1, 'two', { three: 3 }],
332
- nullVal: null,
333
- boolVal: false,
334
- };
335
- const result = await client.request('echo', complexData);
336
- expect(result).toEqual(complexData);
337
- }, 10_000);
338
- // ─── 15. Rapid sequential requests are all handled ──────────────────
339
- it('rapid sequential requests are all handled', async () => {
340
- server = new IpcServer(makeRouter(), pipeName);
341
- server.start();
342
- await waitForServer(pipeName);
343
- client = new IpcClient(pipeName, 5000);
344
- await client.connect();
345
- const count = 20;
346
- for (let i = 0; i < count; i++) {
347
- const result = await client.request('add', { a: i, b: i * 2 });
348
- expect(result).toBe(i + i * 2);
349
- }
350
- }, 15_000);
351
- });
352
- //# sourceMappingURL=integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../../src/ipc/__tests__/integration.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,69 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { encodeMessage, MessageDecoder } from '../protocol.js';
3
- describe('encodeMessage', () => {
4
- it('encodes a request message', () => {
5
- const msg = { id: 'test-1', type: 'request', method: 'status', params: {} };
6
- const buffer = encodeMessage(msg);
7
- expect(buffer).toBeInstanceOf(Buffer);
8
- expect(buffer.length).toBeGreaterThan(4);
9
- });
10
- it('includes 4-byte length prefix', () => {
11
- const msg = { id: 'test-1', type: 'request', method: 'test' };
12
- const buffer = encodeMessage(msg);
13
- const payloadLength = buffer.readUInt32BE(0);
14
- expect(buffer.length).toBe(4 + payloadLength);
15
- });
16
- });
17
- describe('MessageDecoder', () => {
18
- it('decodes a single complete message', () => {
19
- const msg = { id: 'x', type: 'response', result: { ok: true } };
20
- const decoder = new MessageDecoder();
21
- const messages = decoder.feed(encodeMessage(msg));
22
- expect(messages).toHaveLength(1);
23
- expect(messages[0].id).toBe('x');
24
- expect(messages[0].result).toEqual({ ok: true });
25
- });
26
- it('handles multiple messages in one chunk', () => {
27
- const msg1 = { id: '1', type: 'request', method: 'a' };
28
- const msg2 = { id: '2', type: 'request', method: 'b' };
29
- const decoder = new MessageDecoder();
30
- const combined = Buffer.concat([encodeMessage(msg1), encodeMessage(msg2)]);
31
- const messages = decoder.feed(combined);
32
- expect(messages).toHaveLength(2);
33
- });
34
- it('handles partial messages across feeds', () => {
35
- const msg = { id: 'partial', type: 'response', result: 'data' };
36
- const buffer = encodeMessage(msg);
37
- const decoder = new MessageDecoder();
38
- const mid = Math.floor(buffer.length / 2);
39
- const part1 = buffer.subarray(0, mid);
40
- const part2 = buffer.subarray(mid);
41
- expect(decoder.feed(part1)).toHaveLength(0);
42
- const messages = decoder.feed(part2);
43
- expect(messages).toHaveLength(1);
44
- expect(messages[0].id).toBe('partial');
45
- });
46
- it('resets buffer state', () => {
47
- const decoder = new MessageDecoder();
48
- decoder.feed(Buffer.from([0, 0, 0, 10])); // incomplete
49
- decoder.reset();
50
- const msg = { id: 'after-reset', type: 'response', result: null };
51
- const messages = decoder.feed(encodeMessage(msg));
52
- expect(messages).toHaveLength(1);
53
- expect(messages[0].id).toBe('after-reset');
54
- });
55
- it('handles byte-by-byte feeding', () => {
56
- const msg = { id: 'byte', type: 'request', method: 'test' };
57
- const buffer = encodeMessage(msg);
58
- const decoder = new MessageDecoder();
59
- let messages = [];
60
- for (let i = 0; i < buffer.length; i++) {
61
- messages = decoder.feed(buffer.subarray(i, i + 1));
62
- if (messages.length > 0)
63
- break;
64
- }
65
- expect(messages).toHaveLength(1);
66
- expect(messages[0].id).toBe('byte');
67
- });
68
- });
69
- //# sourceMappingURL=protocol.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"protocol.test.js","sourceRoot":"","sources":["../../../src/ipc/__tests__/protocol.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAG/D,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,GAAG,GAAe,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACxF,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,GAAG,GAAe,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC1E,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,GAAG,GAAe,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;QAC5E,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,IAAI,GAAe,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACnE,MAAM,IAAI,GAAe,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACnE,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,GAAG,GAAe,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;QAErC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEnC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;QACvD,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhB,MAAM,GAAG,GAAe,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC9E,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,GAAG,GAAe,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACxE,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;QAErC,IAAI,QAAQ,GAAiB,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM;QACjC,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,114 +0,0 @@
1
- import { describe, it, expect, beforeEach } from 'vitest';
2
- import Database from 'better-sqlite3';
3
- import { ContradictionResolver } from '../contradiction-resolver.js';
4
- import { KnowledgeGraphEngine, runKnowledgeGraphMigration } from '../graph-engine.js';
5
- describe('ContradictionResolver', () => {
6
- let db;
7
- let resolver;
8
- let kg;
9
- beforeEach(() => {
10
- db = new Database(':memory:');
11
- db.pragma('journal_mode = WAL');
12
- runKnowledgeGraphMigration(db);
13
- resolver = new ContradictionResolver(db);
14
- kg = new KnowledgeGraphEngine(db, { brainName: 'test' });
15
- resolver.setKnowledgeGraph(kg);
16
- });
17
- describe('migration', () => {
18
- it('should create fact_resolutions table', () => {
19
- const tables = db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name = 'fact_resolutions'`).all();
20
- expect(tables).toHaveLength(1);
21
- });
22
- });
23
- describe('resolve', () => {
24
- it('should return 0 when no contradictions exist', () => {
25
- const resolved = resolver.resolve();
26
- expect(resolved).toBe(0);
27
- });
28
- it('should return 0 without knowledge graph', () => {
29
- const standalone = new ContradictionResolver(db);
30
- expect(standalone.resolve()).toBe(0);
31
- });
32
- it('should resolve confidence_gap contradictions by demoting weaker fact', () => {
33
- // Both facts must be above the highConfidenceThreshold (0.5) to be detected as contradictions
34
- // But with a >0.3 gap to classify as confidence_gap
35
- kg.addFact('TypeScript', 'is_best_for', 'large projects', 'enterprise', 0.95);
36
- kg.addFact('TypeScript', 'is_best_for', 'small scripts', 'personal', 0.55);
37
- const resolved = resolver.resolve();
38
- expect(resolved).toBe(1);
39
- const history = resolver.getHistory();
40
- expect(history).toHaveLength(1);
41
- expect(history[0].contradiction_type).toBe('confidence_gap');
42
- expect(history[0].strategy).toBe('demote');
43
- // Verify the weaker fact was demoted
44
- const facts = kg.query({ subject: 'TypeScript', predicate: 'is_best_for' });
45
- const demoted = facts.find(f => f.object === 'small scripts');
46
- expect(demoted.confidence).toBeLessThan(0.55);
47
- });
48
- it('should not re-resolve already resolved contradictions', () => {
49
- kg.addFact('Node', 'is_best_for', 'servers', undefined, 0.9);
50
- kg.addFact('Node', 'is_best_for', 'desktop apps', undefined, 0.6);
51
- resolver.resolve();
52
- const first = resolver.getHistory().length;
53
- resolver.resolve();
54
- const second = resolver.getHistory().length;
55
- expect(second).toBe(first);
56
- });
57
- it('should classify contextual contradictions when context exists', () => {
58
- // Two facts with similar confidence but different context
59
- kg.addFact('React', 'performs', 'fast', 'client-side rendering', 0.8);
60
- kg.addFact('React', 'performs', 'slow', 'server-side rendering', 0.75);
61
- const resolved = resolver.resolve();
62
- expect(resolved).toBe(1);
63
- const history = resolver.getHistory();
64
- expect(history[0].strategy).toBe('contextualize');
65
- });
66
- });
67
- describe('getStatus', () => {
68
- it('should return empty status initially', () => {
69
- const status = resolver.getStatus();
70
- expect(status.totalResolved).toBe(0);
71
- expect(status.byType.confidence_gap).toBe(0);
72
- expect(status.byType.temporal).toBe(0);
73
- expect(status.byType.contextual).toBe(0);
74
- expect(status.byType.trade_off).toBe(0);
75
- expect(status.byStrategy.demote).toBe(0);
76
- expect(status.lastResolveAt).toBeNull();
77
- });
78
- it('should track resolution stats', () => {
79
- kg.addFact('Go', 'is_best_for', 'systems', undefined, 0.9);
80
- kg.addFact('Go', 'is_best_for', 'web apps', undefined, 0.6);
81
- resolver.resolve();
82
- const status = resolver.getStatus();
83
- expect(status.totalResolved).toBe(1);
84
- expect(status.lastResolveAt).not.toBeNull();
85
- });
86
- });
87
- describe('getHistory', () => {
88
- it('should return empty array initially', () => {
89
- expect(resolver.getHistory()).toEqual([]);
90
- });
91
- it('should limit results', () => {
92
- // Create multiple contradictions
93
- for (let i = 0; i < 5; i++) {
94
- kg.addFact(`Topic${i}`, 'relates_to', 'A', undefined, 0.9);
95
- kg.addFact(`Topic${i}`, 'relates_to', 'B', undefined, 0.6);
96
- }
97
- resolver.resolve();
98
- const limited = resolver.getHistory(3);
99
- expect(limited.length).toBeLessThanOrEqual(3);
100
- });
101
- });
102
- describe('trade_off classification', () => {
103
- it('should accept trade-offs when facts have similar confidence and no context', () => {
104
- // Similar confidence, no context, not temporal
105
- kg.addFact('Architecture', 'favors', 'microservices', undefined, 0.7);
106
- kg.addFact('Architecture', 'favors', 'monolith', undefined, 0.65);
107
- resolver.resolve();
108
- const history = resolver.getHistory();
109
- expect(history).toHaveLength(1);
110
- expect(history[0].strategy).toBe('accept_tradeoff');
111
- });
112
- });
113
- });
114
- //# sourceMappingURL=contradiction-resolver.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contradiction-resolver.test.js","sourceRoot":"","sources":["../../../src/knowledge-graph/__tests__/contradiction-resolver.test.ts"],"names":[],"mappings":"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"}