@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,233 +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
- }));
10
- vi.mock('../../embeddings/engine.js', async (importOriginal) => {
11
- const actual = await importOriginal();
12
- return {
13
- ...actual,
14
- BaseEmbeddingEngine: actual.BaseEmbeddingEngine,
15
- };
16
- });
17
- import { BaseMemoryEngine } from '../base-memory-engine.js';
18
- import { BaseEmbeddingEngine } from '../../embeddings/engine.js';
19
- /* ------------------------------------------------------------------ */
20
- /* Helpers */
21
- /* ------------------------------------------------------------------ */
22
- const DEFAULT_CONFIG = {
23
- intervalMs: 1000,
24
- expiryCheckEnabled: true,
25
- consolidationEnabled: true,
26
- importanceDecayDays: 30,
27
- };
28
- /** Build a minimal MemoryRecord with overrides. */
29
- function makeMemory(overrides = {}) {
30
- return {
31
- id: 1,
32
- project_id: null,
33
- session_id: null,
34
- category: 'fact',
35
- key: null,
36
- content: 'test memory',
37
- importance: 5,
38
- source: 'explicit',
39
- tags: null,
40
- expires_at: null,
41
- superseded_by: null,
42
- active: 1,
43
- created_at: new Date().toISOString(),
44
- updated_at: new Date().toISOString(),
45
- embedding: null,
46
- ...overrides,
47
- };
48
- }
49
- /**
50
- * Concrete subclass of the abstract BaseMemoryEngine for testing.
51
- * Allows tests to control what getActiveMemoriesWithEmbeddings() and textSearch() return.
52
- */
53
- class TestMemoryEngine extends BaseMemoryEngine {
54
- cycleCount = 0;
55
- memoriesWithEmbeddings = [];
56
- textSearchResults = [];
57
- textSearchCalls = [];
58
- runCycle() {
59
- this.cycleCount++;
60
- }
61
- getActiveMemoriesWithEmbeddings() {
62
- return this.memoriesWithEmbeddings;
63
- }
64
- textSearch(query, limit) {
65
- this.textSearchCalls.push({ query, limit });
66
- return this.textSearchResults.slice(0, limit);
67
- }
68
- }
69
- /* ------------------------------------------------------------------ */
70
- /* Tests */
71
- /* ------------------------------------------------------------------ */
72
- describe('BaseMemoryEngine', () => {
73
- beforeEach(() => {
74
- vi.useFakeTimers();
75
- });
76
- afterEach(() => {
77
- vi.useRealTimers();
78
- });
79
- /* ---------- Timer lifecycle ---------- */
80
- it('start() runs cycles at the configured interval', () => {
81
- const engine = new TestMemoryEngine(DEFAULT_CONFIG);
82
- engine.start();
83
- expect(engine.cycleCount).toBe(0);
84
- vi.advanceTimersByTime(1000);
85
- expect(engine.cycleCount).toBe(1);
86
- vi.advanceTimersByTime(2000);
87
- expect(engine.cycleCount).toBe(3);
88
- engine.stop();
89
- });
90
- it('stop() halts the timer so no further cycles run', () => {
91
- const engine = new TestMemoryEngine({ ...DEFAULT_CONFIG, intervalMs: 500 });
92
- engine.start();
93
- vi.advanceTimersByTime(500);
94
- expect(engine.cycleCount).toBe(1);
95
- engine.stop();
96
- vi.advanceTimersByTime(5000);
97
- expect(engine.cycleCount).toBe(1);
98
- });
99
- it('stop() is safe to call multiple times', () => {
100
- const engine = new TestMemoryEngine(DEFAULT_CONFIG);
101
- engine.start();
102
- engine.stop();
103
- expect(() => engine.stop()).not.toThrow();
104
- });
105
- it('stop() is safe to call without start()', () => {
106
- const engine = new TestMemoryEngine(DEFAULT_CONFIG);
107
- expect(() => engine.stop()).not.toThrow();
108
- });
109
- it('errors in runCycle are caught and do not crash the timer', () => {
110
- class FailingEngine extends BaseMemoryEngine {
111
- getActiveMemoriesWithEmbeddings() {
112
- return [];
113
- }
114
- textSearch() {
115
- return [];
116
- }
117
- runCycle() {
118
- throw new Error('cycle explosion');
119
- }
120
- }
121
- const engine = new FailingEngine(DEFAULT_CONFIG);
122
- engine.start();
123
- // Should not throw despite runCycle throwing
124
- expect(() => vi.advanceTimersByTime(1000)).not.toThrow();
125
- engine.stop();
126
- });
127
- /* ---------- setEmbeddingEngine ---------- */
128
- it('setEmbeddingEngine attaches an embedding engine', () => {
129
- const engine = new TestMemoryEngine(DEFAULT_CONFIG);
130
- const embeddingEngine = new BaseEmbeddingEngine({ enabled: true });
131
- engine.setEmbeddingEngine(embeddingEngine);
132
- // Verify it was set (access via semanticRecall behavior below)
133
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
134
- expect(engine.embeddingEngine).toBe(embeddingEngine);
135
- });
136
- /* ---------- semanticRecall ---------- */
137
- it('semanticRecall falls back to textSearch when no embedding engine is set', async () => {
138
- vi.useRealTimers();
139
- const engine = new TestMemoryEngine(DEFAULT_CONFIG);
140
- const expected = [makeMemory({ id: 1, content: 'hello' })];
141
- engine.textSearchResults = expected;
142
- const results = await engine.semanticRecall('hello', 5);
143
- expect(results).toEqual(expected);
144
- expect(engine.textSearchCalls).toEqual([{ query: 'hello', limit: 5 }]);
145
- });
146
- it('semanticRecall falls back to textSearch when embedding engine is not ready', async () => {
147
- vi.useRealTimers();
148
- const engine = new TestMemoryEngine(DEFAULT_CONFIG);
149
- const embeddingEngine = new BaseEmbeddingEngine({ enabled: true });
150
- // isReady() returns false because we never initialized
151
- engine.setEmbeddingEngine(embeddingEngine);
152
- const expected = [makeMemory({ id: 2, content: 'fallback' })];
153
- engine.textSearchResults = expected;
154
- const results = await engine.semanticRecall('query');
155
- expect(results).toEqual(expected);
156
- expect(engine.textSearchCalls.length).toBe(1);
157
- });
158
- it('semanticRecall uses embeddings and sorts by similarity when engine is ready', async () => {
159
- vi.useRealTimers();
160
- const engine = new TestMemoryEngine(DEFAULT_CONFIG);
161
- // Create a mock embedding engine that is "ready"
162
- const mockEmbeddingEngine = {
163
- isReady: () => true,
164
- embed: vi.fn(),
165
- };
166
- // Query vector: [1, 0]
167
- const queryVec = new Float32Array([1, 0]);
168
- mockEmbeddingEngine.embed.mockResolvedValue(queryVec);
169
- engine.setEmbeddingEngine(mockEmbeddingEngine);
170
- // Memory A embedding: [0, 1] -> similarity = 0
171
- // Memory B embedding: [0.6, 0.8] -> similarity = 0.6
172
- // Memory C embedding: [1, 0] -> similarity = 1.0
173
- const memA = makeMemory({
174
- id: 1,
175
- content: 'orthogonal',
176
- embedding: BaseEmbeddingEngine.serialize(new Float32Array([0, 1])),
177
- });
178
- const memB = makeMemory({
179
- id: 2,
180
- content: 'partial',
181
- embedding: BaseEmbeddingEngine.serialize(new Float32Array([0.6, 0.8])),
182
- });
183
- const memC = makeMemory({
184
- id: 3,
185
- content: 'identical',
186
- embedding: BaseEmbeddingEngine.serialize(new Float32Array([1, 0])),
187
- });
188
- engine.memoriesWithEmbeddings = [memA, memB, memC];
189
- const results = await engine.semanticRecall('test query', 10);
190
- // Should be sorted by similarity descending: C, B, A
191
- expect(results.map(r => r.id)).toEqual([3, 2, 1]);
192
- // textSearch should NOT have been called
193
- expect(engine.textSearchCalls.length).toBe(0);
194
- });
195
- it('semanticRecall respects the limit parameter', async () => {
196
- vi.useRealTimers();
197
- const engine = new TestMemoryEngine(DEFAULT_CONFIG);
198
- const mockEmbeddingEngine = {
199
- isReady: () => true,
200
- embed: vi.fn().mockResolvedValue(new Float32Array([1, 0])),
201
- };
202
- engine.setEmbeddingEngine(mockEmbeddingEngine);
203
- engine.memoriesWithEmbeddings = [
204
- makeMemory({ id: 1, embedding: BaseEmbeddingEngine.serialize(new Float32Array([1, 0])) }),
205
- makeMemory({ id: 2, embedding: BaseEmbeddingEngine.serialize(new Float32Array([0.9, 0.1])) }),
206
- makeMemory({ id: 3, embedding: BaseEmbeddingEngine.serialize(new Float32Array([0.5, 0.5])) }),
207
- ];
208
- const results = await engine.semanticRecall('query', 2);
209
- expect(results.length).toBe(2);
210
- });
211
- it('semanticRecall falls back to textSearch when embed() throws', async () => {
212
- vi.useRealTimers();
213
- const engine = new TestMemoryEngine(DEFAULT_CONFIG);
214
- const mockEmbeddingEngine = {
215
- isReady: () => true,
216
- embed: vi.fn().mockRejectedValue(new Error('embedding failed')),
217
- };
218
- engine.setEmbeddingEngine(mockEmbeddingEngine);
219
- const expected = [makeMemory({ id: 10, content: 'text fallback' })];
220
- engine.textSearchResults = expected;
221
- const results = await engine.semanticRecall('broken query', 5);
222
- expect(results).toEqual(expected);
223
- expect(engine.textSearchCalls).toEqual([{ query: 'broken query', limit: 5 }]);
224
- });
225
- it('semanticRecall uses default limit of 10', async () => {
226
- vi.useRealTimers();
227
- const engine = new TestMemoryEngine(DEFAULT_CONFIG);
228
- engine.textSearchResults = [];
229
- await engine.semanticRecall('query');
230
- expect(engine.textSearchCalls).toEqual([{ query: 'query', limit: 10 }]);
231
- });
232
- });
233
- //# sourceMappingURL=base-memory-engine.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base-memory-engine.test.js","sourceRoot":"","sources":["../../../src/memory/__tests__/base-memory-engine.test.ts"],"names":[],"mappings":"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"}
@@ -1,218 +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 { AutoExperimentEngine } from '../auto-experiment-engine.js';
7
- import { ParameterRegistry, runParameterRegistryMigration } from '../parameter-registry.js';
8
- import { ExperimentEngine, runExperimentMigration } from '../../research/experiment-engine.js';
9
- describe('AutoExperimentEngine', () => {
10
- let db;
11
- let registry;
12
- let experimentEngine;
13
- let autoEngine;
14
- beforeEach(() => {
15
- db = new Database(':memory:');
16
- runParameterRegistryMigration(db);
17
- runExperimentMigration(db);
18
- registry = new ParameterRegistry(db);
19
- experimentEngine = new ExperimentEngine(db, { brainName: 'test' });
20
- // Register a parameter for tests
21
- registry.register({
22
- engine: 'TestEngine',
23
- name: 'learningRate',
24
- value: 0.5,
25
- min: 0.0,
26
- max: 1.0,
27
- description: 'How fast the engine learns',
28
- });
29
- autoEngine = new AutoExperimentEngine(db, registry, experimentEngine);
30
- });
31
- afterEach(() => {
32
- db.close();
33
- });
34
- // ── 1. Construction ──────────────────────────────────────
35
- it('should create instance and run migration', () => {
36
- expect(autoEngine).toBeDefined();
37
- // Verify the table exists by querying it
38
- const row = db.prepare('SELECT COUNT(*) as c FROM auto_experiments').get();
39
- expect(row.c).toBe(0);
40
- });
41
- // ── 2. getStatus (initial) ───────────────────────────────
42
- it('should return zero counts in initial status', () => {
43
- const status = autoEngine.getStatus(0);
44
- expect(status.totalExperiments).toBe(0);
45
- expect(status.running).toBe(0);
46
- expect(status.adopted).toBe(0);
47
- expect(status.rolledBack).toBe(0);
48
- expect(status.cooldownUntilCycle).toBe(0);
49
- });
50
- // ── 3. discoverCandidates (stale parameter) ──────────────
51
- it('should discover stale-parameter candidates when parameter was never changed', () => {
52
- const candidates = autoEngine.discoverCandidates(0);
53
- // "learningRate" has never been changed, so it should appear as a candidate
54
- expect(candidates.length).toBeGreaterThanOrEqual(1);
55
- const lr = candidates.find(c => c.name === 'learningRate');
56
- expect(lr).toBeDefined();
57
- expect(lr.engine).toBe('TestEngine');
58
- expect(lr.reason).toContain('never changed');
59
- expect(lr.priority).toBe(4);
60
- expect(lr.proposedValue).not.toBe(lr.currentValue);
61
- // Proposed value must stay within bounds
62
- expect(lr.proposedValue).toBeGreaterThanOrEqual(0.0);
63
- expect(lr.proposedValue).toBeLessThanOrEqual(1.0);
64
- });
65
- // ── 4. discoverCandidates respects cooldown ──────────────
66
- it('should return empty candidates when in cooldown period', () => {
67
- // Trigger a cooldown by manipulating the internal state via a full experiment lifecycle:
68
- // Simply test discoverCandidates with a cycle < cooldownUntilCycle
69
- // Start and complete an experiment to trigger cooldown
70
- const candidates = autoEngine.discoverCandidates(0);
71
- expect(candidates.length).toBeGreaterThanOrEqual(1);
72
- // Start an experiment to get something running
73
- const exp = autoEngine.startExperiment(candidates[0]);
74
- expect(exp).not.toBeNull();
75
- // Now manually complete the linked experiment with a positive conclusion
76
- // so processCompleted sets cooldown
77
- if (exp.experiment_id) {
78
- // Feed enough measurements through control and treatment phases
79
- const linkedExp = experimentEngine.get(exp.experiment_id);
80
- if (linkedExp) {
81
- const duration = linkedExp.duration_cycles;
82
- // Control phase
83
- for (let i = 0; i < duration; i++) {
84
- experimentEngine.recordMeasurement(exp.experiment_id, 1.0);
85
- }
86
- // Treatment phase
87
- for (let i = 0; i < duration; i++) {
88
- experimentEngine.recordMeasurement(exp.experiment_id, 5.0);
89
- }
90
- }
91
- }
92
- const results = autoEngine.processCompleted(10);
93
- // After processing, cooldown is set
94
- if (results.length > 0) {
95
- // Now discover should return empty because we are in cooldown
96
- const afterCooldown = autoEngine.discoverCandidates(11);
97
- expect(afterCooldown).toEqual([]);
98
- }
99
- });
100
- // ── 5. startExperiment creates a running auto-experiment ─
101
- it('should start an experiment from a candidate', () => {
102
- const candidates = autoEngine.discoverCandidates(0);
103
- expect(candidates.length).toBeGreaterThanOrEqual(1);
104
- const exp = autoEngine.startExperiment(candidates[0]);
105
- expect(exp).not.toBeNull();
106
- expect(exp.status).toBe('running');
107
- expect(exp.parameter_engine).toBe(candidates[0].engine);
108
- expect(exp.parameter_name).toBe(candidates[0].name);
109
- expect(exp.old_value).toBe(candidates[0].currentValue);
110
- expect(exp.new_value).toBe(candidates[0].proposedValue);
111
- expect(exp.hypothesis).toBe(candidates[0].hypothesis);
112
- expect(exp.id).toBeGreaterThan(0);
113
- expect(exp.result_summary).toBeNull();
114
- });
115
- // ── 6. startExperiment respects maxConcurrent limit ──────
116
- it('should return null when maxConcurrent reached', () => {
117
- // Register a second parameter so we have two candidates
118
- registry.register({
119
- engine: 'TestEngine',
120
- name: 'decayRate',
121
- value: 0.3,
122
- min: 0.0,
123
- max: 1.0,
124
- description: 'Decay rate for memory',
125
- });
126
- const candidates = autoEngine.discoverCandidates(0);
127
- expect(candidates.length).toBeGreaterThanOrEqual(2);
128
- // Start first — should succeed (maxConcurrent defaults to 1)
129
- const first = autoEngine.startExperiment(candidates[0]);
130
- expect(first).not.toBeNull();
131
- // Start second — should be blocked
132
- const second = autoEngine.startExperiment(candidates[1]);
133
- expect(second).toBeNull();
134
- });
135
- // ── 7. startExperiment changes the parameter value ───────
136
- it('should actually change the parameter value in the registry', () => {
137
- const candidates = autoEngine.discoverCandidates(0);
138
- const candidate = candidates[0];
139
- const oldValue = registry.get(candidate.engine, candidate.name);
140
- autoEngine.startExperiment(candidate);
141
- const newValue = registry.get(candidate.engine, candidate.name);
142
- expect(newValue).toBe(candidate.proposedValue);
143
- expect(newValue).not.toBe(oldValue);
144
- });
145
- // ── 8. feedMeasurement routes to ExperimentEngine ────────
146
- it('should feed measurements to linked running experiments', () => {
147
- const candidates = autoEngine.discoverCandidates(0);
148
- const exp = autoEngine.startExperiment(candidates[0]);
149
- expect(exp).not.toBeNull();
150
- expect(exp.experiment_id).not.toBeNull();
151
- // Feed a measurement — should not throw
152
- autoEngine.feedMeasurement('perf_score', 0.75);
153
- // Verify it landed in the linked experiment
154
- const linked = experimentEngine.get(exp.experiment_id);
155
- expect(linked).not.toBeNull();
156
- // The linked experiment should be in running_control and have received a measurement
157
- expect(linked.control_results.length).toBe(1);
158
- expect(linked.control_results[0]).toBe(0.75);
159
- });
160
- // ── 9. list returns empty initially ──────────────────────
161
- it('should return empty list when no experiments exist', () => {
162
- const all = autoEngine.list();
163
- expect(all).toEqual([]);
164
- });
165
- // ── 10. list returns experiments after starting one ──────
166
- it('should return experiments after creating one', () => {
167
- const candidates = autoEngine.discoverCandidates(0);
168
- autoEngine.startExperiment(candidates[0]);
169
- const all = autoEngine.list();
170
- expect(all.length).toBe(1);
171
- expect(all[0].status).toBe('running');
172
- // Filter by status
173
- const running = autoEngine.list('running');
174
- expect(running.length).toBe(1);
175
- const adopted = autoEngine.list('adopted');
176
- expect(adopted.length).toBe(0);
177
- });
178
- // ── 11. processCompleted with no running experiments ─────
179
- it('should return empty array when no experiments are running', () => {
180
- const results = autoEngine.processCompleted(0);
181
- expect(results).toEqual([]);
182
- });
183
- // ── 12. processCompleted adopts positive results ─────────
184
- it('should adopt experiment with significant positive result', () => {
185
- const candidates = autoEngine.discoverCandidates(0);
186
- const exp = autoEngine.startExperiment(candidates[0]);
187
- expect(exp).not.toBeNull();
188
- expect(exp.experiment_id).not.toBeNull();
189
- const expId = exp.experiment_id;
190
- const linked = experimentEngine.get(expId);
191
- const duration = linked.duration_cycles;
192
- // Control phase: low values
193
- for (let i = 0; i < duration; i++) {
194
- experimentEngine.recordMeasurement(expId, 1.0 + Math.random() * 0.1);
195
- }
196
- // Treatment phase: significantly higher values
197
- for (let i = 0; i < duration; i++) {
198
- experimentEngine.recordMeasurement(expId, 5.0 + Math.random() * 0.1);
199
- }
200
- // Now the linked experiment should be complete
201
- const completed = experimentEngine.get(expId);
202
- expect(completed.status).toBe('complete');
203
- expect(completed.conclusion).not.toBeNull();
204
- expect(completed.conclusion.direction).toBe('positive');
205
- // processCompleted should adopt it
206
- const results = autoEngine.processCompleted(10);
207
- expect(results.length).toBe(1);
208
- expect(results[0].action).toBe('adopted');
209
- // Verify the auto_experiment status in DB
210
- const autoExps = autoEngine.list('adopted');
211
- expect(autoExps.length).toBe(1);
212
- expect(autoExps[0].result_summary).toContain('Positive');
213
- // Verify cooldown is set (discover at cycle 11 should return empty)
214
- const afterCandidates = autoEngine.discoverCandidates(11);
215
- expect(afterCandidates).toEqual([]);
216
- });
217
- });
218
- //# sourceMappingURL=auto-experiment-engine.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-experiment-engine.test.js","sourceRoot":"","sources":["../../../src/metacognition/__tests__/auto-experiment-engine.test.ts"],"names":[],"mappings":"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"}