@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,153 +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: () => ({
5
- info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn(),
6
- }),
7
- }));
8
- import { SemanticCompressor, runSemanticCompressorMigration } from '../semantic-compressor.js';
9
- // ── Helpers ──────────────────────────────────────────────────
10
- function createTestDb() {
11
- return new Database(':memory:');
12
- }
13
- function createEmbedding(values) {
14
- const arr = new Float32Array(values);
15
- return Buffer.from(arr.buffer);
16
- }
17
- function createNormalizedEmbedding(seed, dims = 4) {
18
- const arr = new Float32Array(dims);
19
- for (let i = 0; i < dims; i++) {
20
- arr[i] = Math.sin(seed + i);
21
- }
22
- let norm = 0;
23
- for (let i = 0; i < dims; i++)
24
- norm += arr[i] * arr[i];
25
- norm = Math.sqrt(norm);
26
- if (norm > 0)
27
- for (let i = 0; i < dims; i++)
28
- arr[i] /= norm;
29
- return Buffer.from(arr.buffer);
30
- }
31
- function insertTestVector(db, collection, sourceId, preview, embedding) {
32
- db.prepare('INSERT INTO rag_vectors (collection, source_id, text_hash, text_preview, embedding) VALUES (?, ?, ?, ?, ?)').run(collection, sourceId, `hash-${sourceId}`, preview, embedding);
33
- }
34
- // ── Tests ───────────────────────────────────────────────────
35
- describe('SemanticCompressor', () => {
36
- let db;
37
- let compressor;
38
- beforeEach(() => {
39
- db = createTestDb();
40
- compressor = new SemanticCompressor(db, { brainName: 'test', minClusterSize: 2, similarityThreshold: 0.9 });
41
- });
42
- afterEach(() => {
43
- try {
44
- db.close();
45
- }
46
- catch { /* ignore */ }
47
- });
48
- it('creates compressed_clusters table on migration', () => {
49
- const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='compressed_clusters'").all();
50
- expect(tables).toHaveLength(1);
51
- });
52
- it('migration is idempotent', () => {
53
- runSemanticCompressorMigration(db);
54
- runSemanticCompressorMigration(db);
55
- const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='compressed_clusters'").all();
56
- expect(tables).toHaveLength(1);
57
- });
58
- it('returns empty result for empty collection', async () => {
59
- const result = await compressor.compress('empty-collection');
60
- expect(result.clustersFound).toBe(0);
61
- expect(result.itemsCompressed).toBe(0);
62
- expect(result.metaInsightsCreated).toBe(0);
63
- });
64
- it('does not cluster items below similarity threshold', async () => {
65
- // Insert items with very different embeddings
66
- insertTestVector(db, 'test-col', 1, 'item 1', createEmbedding([1, 0, 0, 0]));
67
- insertTestVector(db, 'test-col', 2, 'item 2', createEmbedding([0, 1, 0, 0]));
68
- insertTestVector(db, 'test-col', 3, 'item 3', createEmbedding([0, 0, 1, 0]));
69
- const result = await compressor.compress('test-col');
70
- expect(result.clustersFound).toBe(0);
71
- });
72
- it('clusters similar items together', async () => {
73
- // Insert items with nearly identical embeddings
74
- const base = [0.5, 0.5, 0.5, 0.5];
75
- insertTestVector(db, 'test-col', 1, 'similar item 1', createEmbedding(base));
76
- insertTestVector(db, 'test-col', 2, 'similar item 2', createEmbedding(base));
77
- insertTestVector(db, 'test-col', 3, 'similar item 3', createEmbedding(base));
78
- const result = await compressor.compress('test-col');
79
- expect(result.clustersFound).toBe(1);
80
- expect(result.itemsCompressed).toBe(3);
81
- expect(result.metaInsightsCreated).toBe(1);
82
- });
83
- it('generates meta-text from previews', async () => {
84
- const base = [0.5, 0.5, 0.5, 0.5];
85
- insertTestVector(db, 'test-col', 1, 'alpha', createEmbedding(base));
86
- insertTestVector(db, 'test-col', 2, 'beta', createEmbedding(base));
87
- insertTestVector(db, 'test-col', 3, 'gamma', createEmbedding(base));
88
- await compressor.compress('test-col');
89
- const clusters = db.prepare('SELECT * FROM compressed_clusters WHERE collection = ?').all('test-col');
90
- expect(clusters).toHaveLength(1);
91
- expect(clusters[0].summary).toContain('alpha');
92
- expect(clusters[0].summary).toContain('beta');
93
- });
94
- it('tracks stats correctly', async () => {
95
- const base = [0.5, 0.5, 0.5, 0.5];
96
- insertTestVector(db, 'col-a', 1, 'a1', createEmbedding(base));
97
- insertTestVector(db, 'col-a', 2, 'a2', createEmbedding(base));
98
- insertTestVector(db, 'col-a', 3, 'a3', createEmbedding(base));
99
- await compressor.compress('col-a');
100
- const stats = compressor.getStats();
101
- expect(stats.totalClusters).toBe(1);
102
- expect(stats.byCollection).toHaveLength(1);
103
- expect(stats.byCollection[0].collection).toBe('col-a');
104
- expect(stats.byCollection[0].clusterCount).toBe(1);
105
- expect(stats.byCollection[0].memberCount).toBe(3);
106
- });
107
- it('returns empty stats when no clusters exist', () => {
108
- const stats = compressor.getStats();
109
- expect(stats.totalClusters).toBe(0);
110
- expect(stats.byCollection).toHaveLength(0);
111
- });
112
- it('respects maxClusterSize limit', async () => {
113
- const compressorSmall = new SemanticCompressor(db, {
114
- brainName: 'test',
115
- minClusterSize: 2,
116
- maxClusterSize: 3,
117
- similarityThreshold: 0.9,
118
- });
119
- const base = [0.5, 0.5, 0.5, 0.5];
120
- for (let i = 1; i <= 6; i++) {
121
- insertTestVector(db, 'big-col', i, `item ${i}`, createEmbedding(base));
122
- }
123
- const result = await compressorSmall.compress('big-col');
124
- // With maxClusterSize=3, the 6 items should be split into 2 clusters
125
- expect(result.clustersFound).toBeGreaterThanOrEqual(2);
126
- // Each cluster should have at most 3 items
127
- const clusters = db.prepare('SELECT member_ids FROM compressed_clusters WHERE collection = ?').all('big-col');
128
- for (const cluster of clusters) {
129
- const members = JSON.parse(cluster.member_ids);
130
- expect(members.length).toBeLessThanOrEqual(3);
131
- }
132
- });
133
- it('skips compression without rag vectors', async () => {
134
- // Compress a collection that has no vectors
135
- const result = await compressor.compress('nonexistent');
136
- expect(result.clustersFound).toBe(0);
137
- });
138
- it('uses LLM for summary when available', async () => {
139
- const mockLLM = {
140
- call: vi.fn().mockResolvedValue({ text: 'LLM generated summary' }),
141
- };
142
- compressor.setLLMService(mockLLM);
143
- const base = [0.5, 0.5, 0.5, 0.5];
144
- insertTestVector(db, 'llm-col', 1, 'item 1', createEmbedding(base));
145
- insertTestVector(db, 'llm-col', 2, 'item 2', createEmbedding(base));
146
- insertTestVector(db, 'llm-col', 3, 'item 3', createEmbedding(base));
147
- await compressor.compress('llm-col');
148
- expect(mockLLM.call).toHaveBeenCalled();
149
- const clusters = db.prepare('SELECT summary FROM compressed_clusters WHERE collection = ?').all('llm-col');
150
- expect(clusters[0].summary).toBe('LLM generated summary');
151
- });
152
- });
153
- //# sourceMappingURL=semantic-compressor.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"semantic-compressor.test.js","sourceRoot":"","sources":["../../../src/research/__tests__/semantic-compressor.test.ts"],"names":[],"mappings":"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"}
@@ -1,106 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- vi.mock('../../../utils/logger.js', () => ({
3
- getLogger: () => ({
4
- info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn(),
5
- }),
6
- }));
7
- import { PlaywrightAdapter } from '../playwright-adapter.js';
8
- import { FirecrawlAdapter } from '../firecrawl-adapter.js';
9
- describe('PlaywrightAdapter', () => {
10
- it('has correct name', () => {
11
- const adapter = new PlaywrightAdapter();
12
- expect(adapter.name).toBe('playwright');
13
- });
14
- it('isEnabled returns true (optimistic)', () => {
15
- const adapter = new PlaywrightAdapter();
16
- expect(adapter.isEnabled()).toBe(true);
17
- });
18
- it('scout returns empty array', async () => {
19
- const adapter = new PlaywrightAdapter();
20
- const discoveries = await adapter.scout();
21
- expect(discoveries).toEqual([]);
22
- });
23
- it('checkAvailable returns false when playwright not installed', async () => {
24
- const adapter = new PlaywrightAdapter();
25
- // In test environment, playwright chromium is likely not installed
26
- const available = await adapter.checkAvailable();
27
- expect(typeof available).toBe('boolean');
28
- });
29
- it('extract returns null when playwright unavailable', async () => {
30
- const adapter = new PlaywrightAdapter();
31
- // Force unavailable
32
- adapter.available = false;
33
- const result = await adapter.extract('https://example.com');
34
- expect(result).toBeNull();
35
- });
36
- it('shutdown is safe when no browser', async () => {
37
- const adapter = new PlaywrightAdapter();
38
- await expect(adapter.shutdown()).resolves.not.toThrow();
39
- });
40
- });
41
- describe('FirecrawlAdapter', () => {
42
- it('has correct name', () => {
43
- const adapter = new FirecrawlAdapter();
44
- expect(adapter.name).toBe('firecrawl');
45
- });
46
- it('isEnabled returns false without API key', () => {
47
- const adapter = new FirecrawlAdapter({ apiKey: undefined });
48
- expect(adapter.isEnabled()).toBe(false);
49
- });
50
- it('isEnabled returns true with API key', () => {
51
- const adapter = new FirecrawlAdapter({ apiKey: 'fc-test' });
52
- expect(adapter.isEnabled()).toBe(true);
53
- });
54
- it('scout returns empty array', async () => {
55
- const adapter = new FirecrawlAdapter();
56
- const discoveries = await adapter.scout();
57
- expect(discoveries).toEqual([]);
58
- });
59
- it('scrape returns null when not enabled', async () => {
60
- const adapter = new FirecrawlAdapter({ apiKey: undefined });
61
- const result = await adapter.scrape('https://example.com');
62
- expect(result).toBeNull();
63
- });
64
- it('crawl returns empty when not enabled', async () => {
65
- const adapter = new FirecrawlAdapter({ apiKey: undefined });
66
- const result = await adapter.crawl('https://example.com');
67
- expect(result).toEqual([]);
68
- });
69
- it('scrape calls API with correct URL', async () => {
70
- const mockFetch = vi.fn().mockResolvedValue({
71
- ok: true,
72
- json: async () => ({
73
- success: true,
74
- data: {
75
- markdown: '# Test\n\nContent here',
76
- metadata: { title: 'Test Page', description: 'A test page' },
77
- },
78
- }),
79
- });
80
- vi.stubGlobal('fetch', mockFetch);
81
- const adapter = new FirecrawlAdapter({ apiKey: 'fc-test' });
82
- const result = await adapter.scrape('https://example.com');
83
- expect(mockFetch).toHaveBeenCalledWith('https://api.firecrawl.dev/v1/scrape', expect.objectContaining({
84
- method: 'POST',
85
- headers: expect.objectContaining({
86
- 'Authorization': 'Bearer fc-test',
87
- }),
88
- }));
89
- expect(result).not.toBeNull();
90
- expect(result.title).toBe('Test Page');
91
- expect(result.markdown).toContain('# Test');
92
- vi.unstubAllGlobals();
93
- });
94
- it('scrape handles API errors gracefully', async () => {
95
- const mockFetch = vi.fn().mockResolvedValue({
96
- ok: false,
97
- status: 500,
98
- });
99
- vi.stubGlobal('fetch', mockFetch);
100
- const adapter = new FirecrawlAdapter({ apiKey: 'fc-test' });
101
- const result = await adapter.scrape('https://example.com');
102
- expect(result).toBeNull();
103
- vi.unstubAllGlobals();
104
- });
105
- });
106
- //# sourceMappingURL=web-adapters.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"web-adapters.test.js","sourceRoot":"","sources":["../../../../src/research/adapters/__tests__/web-adapters.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,182 +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 { CodeSandbox, runSandboxMigration } from '../code-sandbox.js';
7
- describe('CodeSandbox', () => {
8
- let db;
9
- beforeEach(() => { db = new Database(':memory:'); });
10
- afterEach(() => { db.close(); });
11
- // ── Creation ──────────────────────────────────────────
12
- it('creates an instance with default config', () => {
13
- const sandbox = new CodeSandbox(db);
14
- expect(sandbox).toBeDefined();
15
- });
16
- it('creates an instance with custom config', () => {
17
- const sandbox = new CodeSandbox(db, {
18
- preferDocker: false,
19
- defaultTimeoutMs: 5000,
20
- defaultMemoryMb: 64,
21
- maxOutputSize: 50000,
22
- });
23
- expect(sandbox).toBeDefined();
24
- });
25
- // ── getStatus (initial) ───────────────────────────────
26
- it('returns empty status on fresh instance', () => {
27
- const sandbox = new CodeSandbox(db);
28
- const status = sandbox.getStatus();
29
- expect(status.totalExecutions).toBe(0);
30
- expect(status.successCount).toBe(0);
31
- expect(status.failCount).toBe(0);
32
- expect(status.timeoutCount).toBe(0);
33
- expect(status.avgDurationMs).toBe(0);
34
- expect(status.dockerAvailable).toBe(false);
35
- expect(status.languages).toEqual([]);
36
- });
37
- // ── validate ──────────────────────────────────────────
38
- it('validates valid JavaScript code', () => {
39
- const sandbox = new CodeSandbox(db);
40
- const result = sandbox.validate('console.log("hello")', 'javascript');
41
- expect(result).toBeNull();
42
- });
43
- it('validates valid TypeScript code (parsed as JS by Function constructor)', () => {
44
- const sandbox = new CodeSandbox(db);
45
- // The validate method uses `new Function(code)` for TS too,
46
- // so basic JS-compatible TS code passes.
47
- const result = sandbox.validate('const x = 42; console.log(x);', 'typescript');
48
- expect(result).toBeNull();
49
- });
50
- it('returns error for invalid JavaScript code', () => {
51
- const sandbox = new CodeSandbox(db);
52
- const result = sandbox.validate('function {{{', 'javascript');
53
- expect(result).toBeTruthy();
54
- expect(typeof result).toBe('string');
55
- });
56
- it('returns error for invalid TypeScript code', () => {
57
- const sandbox = new CodeSandbox(db);
58
- const result = sandbox.validate('if (', 'typescript');
59
- expect(result).toBeTruthy();
60
- });
61
- it('validates valid Python code', () => {
62
- const sandbox = new CodeSandbox(db);
63
- const result = sandbox.validate('print("hello")', 'python');
64
- expect(result).toBeNull();
65
- });
66
- it('returns error for Python def without colon', () => {
67
- const sandbox = new CodeSandbox(db);
68
- const result = sandbox.validate('def foo()', 'python');
69
- expect(result).toBe('Missing colon after def');
70
- });
71
- it('validates shell code (always passes)', () => {
72
- const sandbox = new CodeSandbox(db);
73
- const result = sandbox.validate('echo hello', 'shell');
74
- expect(result).toBeNull();
75
- });
76
- it('returns error for unsupported language', () => {
77
- const sandbox = new CodeSandbox(db);
78
- const result = sandbox.validate('code', 'rust');
79
- expect(result).toBe('Unsupported language: rust');
80
- });
81
- // ── execute ───────────────────────────────────────────
82
- it('executes simple JavaScript code locally', async () => {
83
- const sandbox = new CodeSandbox(db, { preferDocker: false });
84
- const result = await sandbox.execute({
85
- code: 'console.log("hello")',
86
- language: 'javascript',
87
- timeoutMs: 10000,
88
- name: 'test-exec',
89
- });
90
- expect(result.id).toMatch(/^exec-/);
91
- expect(result.language).toBe('javascript');
92
- expect(result.stdout.trim()).toBe('hello');
93
- expect(result.exitCode).toBe(0);
94
- expect(result.timedOut).toBe(false);
95
- expect(result.durationMs).toBeGreaterThanOrEqual(0);
96
- expect(result.name).toBe('test-exec');
97
- expect(result.createdAt).toBeGreaterThan(0);
98
- }, 15000);
99
- it('captures non-zero exit code on failing code', async () => {
100
- const sandbox = new CodeSandbox(db, { preferDocker: false });
101
- const result = await sandbox.execute({
102
- code: 'process.exit(42)',
103
- language: 'javascript',
104
- timeoutMs: 10000,
105
- });
106
- expect(result.exitCode).not.toBe(0);
107
- }, 15000);
108
- // ── getHistory ────────────────────────────────────────
109
- it('returns execution history after running code', async () => {
110
- const sandbox = new CodeSandbox(db, { preferDocker: false });
111
- await sandbox.execute({
112
- code: 'console.log("history-test")',
113
- language: 'javascript',
114
- timeoutMs: 10000,
115
- name: 'hist-entry',
116
- });
117
- const history = sandbox.getHistory(10);
118
- expect(history).toHaveLength(1);
119
- expect(history[0].language).toBe('javascript');
120
- expect(history[0].exitCode).toBe(0);
121
- expect(history[0].name).toBe('hist-entry');
122
- expect(history[0].timedOut).toBe(false);
123
- }, 15000);
124
- // ── getLanguageStats ──────────────────────────────────
125
- it('returns language stats after executions', async () => {
126
- const sandbox = new CodeSandbox(db, { preferDocker: false });
127
- await sandbox.execute({ code: 'console.log(1)', language: 'javascript', timeoutMs: 10000 });
128
- await sandbox.execute({ code: 'console.log(2)', language: 'javascript', timeoutMs: 10000 });
129
- const stats = sandbox.getLanguageStats();
130
- expect(stats).toHaveLength(1);
131
- expect(stats[0].language).toBe('javascript');
132
- expect(stats[0].total).toBe(2);
133
- expect(stats[0].successRate).toBe(1);
134
- expect(stats[0].avgDuration).toBeGreaterThanOrEqual(0);
135
- }, 20000);
136
- it('returns empty language stats on fresh instance', () => {
137
- const sandbox = new CodeSandbox(db);
138
- const stats = sandbox.getLanguageStats();
139
- expect(stats).toEqual([]);
140
- });
141
- // ── isDockerAvailable ─────────────────────────────────
142
- it('returns boolean from isDockerAvailable (likely false in test env)', async () => {
143
- const sandbox = new CodeSandbox(db);
144
- const available = await sandbox.isDockerAvailable();
145
- expect(typeof available).toBe('boolean');
146
- }, 10000);
147
- it('caches Docker availability on subsequent calls', async () => {
148
- const sandbox = new CodeSandbox(db);
149
- const first = await sandbox.isDockerAvailable();
150
- const second = await sandbox.isDockerAvailable();
151
- expect(first).toBe(second);
152
- }, 10000);
153
- it('resets Docker cache', async () => {
154
- const sandbox = new CodeSandbox(db);
155
- await sandbox.isDockerAvailable();
156
- sandbox.resetDockerCache();
157
- // After reset, the next call re-checks (we just verify it does not throw)
158
- const result = await sandbox.isDockerAvailable();
159
- expect(typeof result).toBe('boolean');
160
- }, 10000);
161
- // ── Status after executions ───────────────────────────
162
- it('reflects executions in status', async () => {
163
- const sandbox = new CodeSandbox(db, { preferDocker: false });
164
- await sandbox.execute({ code: 'console.log("ok")', language: 'javascript', timeoutMs: 10000 });
165
- const status = sandbox.getStatus();
166
- expect(status.totalExecutions).toBe(1);
167
- expect(status.successCount).toBe(1);
168
- expect(status.failCount).toBe(0);
169
- expect(status.timeoutCount).toBe(0);
170
- expect(status.languages).toContain('javascript');
171
- expect(status.avgDurationMs).toBeGreaterThanOrEqual(0);
172
- }, 15000);
173
- // ── Migration idempotency ─────────────────────────────
174
- it('runs migration multiple times without error', () => {
175
- runSandboxMigration(db);
176
- runSandboxMigration(db);
177
- // Table already exists from constructor, third call is fine too
178
- const sandbox = new CodeSandbox(db);
179
- expect(sandbox.getStatus().totalExecutions).toBe(0);
180
- });
181
- });
182
- //# sourceMappingURL=code-sandbox.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"code-sandbox.test.js","sourceRoot":"","sources":["../../../src/sandbox/__tests__/code-sandbox.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,142 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import Database from 'better-sqlite3';
3
- import { SignalScanner, runScannerMigration } from '../signal-scanner.js';
4
- vi.mock('../../utils/logger.js', () => ({
5
- getLogger: () => ({
6
- info: vi.fn(),
7
- warn: vi.fn(),
8
- error: vi.fn(),
9
- debug: vi.fn(),
10
- }),
11
- }));
12
- vi.mock('../github-collector.js', () => ({
13
- GitHubCollector: vi.fn().mockImplementation(() => ({
14
- abort: vi.fn(),
15
- reset: vi.fn(),
16
- collectEmerging: vi.fn().mockResolvedValue([]),
17
- collectTrending: vi.fn().mockResolvedValue([]),
18
- })),
19
- }));
20
- vi.mock('../hn-collector.js', () => ({
21
- HnCollector: vi.fn().mockImplementation(() => ({
22
- abort: vi.fn(),
23
- reset: vi.fn(),
24
- collectFrontpage: vi.fn().mockResolvedValue([]),
25
- })),
26
- }));
27
- vi.mock('../crypto-collector.js', () => ({
28
- CryptoCollector: vi.fn().mockImplementation(() => ({
29
- abort: vi.fn(),
30
- reset: vi.fn(),
31
- collectWatchlist: vi.fn().mockResolvedValue([]),
32
- collectTrending: vi.fn().mockResolvedValue(null),
33
- })),
34
- }));
35
- vi.mock('../signal-scorer.js', () => ({
36
- scoreRepo: vi.fn().mockReturnValue({ total: 0, level: 'noise', phase: 'discovery' }),
37
- classifyWithHysteresis: vi.fn().mockReturnValue({ level: 'noise', peak: null, peakSince: null }),
38
- scoreCrypto: vi.fn().mockReturnValue({ score: 0, level: 'noise' }),
39
- }));
40
- describe('SignalScanner', () => {
41
- let db;
42
- let scanner;
43
- beforeEach(() => {
44
- db = new Database(':memory:');
45
- runScannerMigration(db);
46
- scanner = new SignalScanner(db, { enabled: true, githubToken: 'fake-token' });
47
- });
48
- afterEach(() => {
49
- scanner.stop();
50
- db.close();
51
- });
52
- // ── 1. Creation ──────────────────────────────────────────────
53
- it('should create a SignalScanner instance', () => {
54
- expect(scanner).toBeInstanceOf(SignalScanner);
55
- });
56
- // ── 2. getStatus (initial) ───────────────────────────────────
57
- it('should return initial status with zero counts', () => {
58
- const status = scanner.getStatus();
59
- expect(status.running).toBe(false);
60
- expect(status.enabled).toBe(true);
61
- expect(status.last_scan).toBeNull();
62
- expect(status.total_repos).toBe(0);
63
- expect(status.total_active).toBe(0);
64
- expect(status.by_level).toEqual({ breakout: 0, signal: 0, watch: 0, noise: 0 });
65
- expect(status.next_scan_at).toBeNull();
66
- });
67
- // ── 3. getConfig ─────────────────────────────────────────────
68
- it('should return config with defaults merged', () => {
69
- const config = scanner.getConfig();
70
- expect(config.enabled).toBe(true);
71
- expect(config.githubToken).toBe('fake-token');
72
- expect(config.scanIntervalMs).toBe(21_600_000);
73
- expect(config.minStarsEmerging).toBe(15);
74
- expect(config.minStarsTrending).toBe(200);
75
- expect(config.maxReposPerScan).toBe(5000);
76
- expect(config.cryptoEnabled).toBe(true);
77
- expect(config.hnEnabled).toBe(true);
78
- });
79
- // ── 4. updateConfig ──────────────────────────────────────────
80
- it('should update config and return the merged result', () => {
81
- const updated = scanner.updateConfig({ minStarsEmerging: 50, cryptoEnabled: false });
82
- expect(updated.minStarsEmerging).toBe(50);
83
- expect(updated.cryptoEnabled).toBe(false);
84
- // Unchanged fields remain
85
- expect(updated.githubToken).toBe('fake-token');
86
- expect(updated.scanIntervalMs).toBe(21_600_000);
87
- // Verify via getConfig too
88
- const config = scanner.getConfig();
89
- expect(config.minStarsEmerging).toBe(50);
90
- expect(config.cryptoEnabled).toBe(false);
91
- });
92
- // ── 5. getSignals (empty) ────────────────────────────────────
93
- it('should return empty array for getSignals when no repos exist', () => {
94
- const breakouts = scanner.getSignals('breakout');
95
- const signals = scanner.getSignals('signal');
96
- const watches = scanner.getSignals('watch');
97
- const noise = scanner.getSignals('noise');
98
- expect(breakouts).toEqual([]);
99
- expect(signals).toEqual([]);
100
- expect(watches).toEqual([]);
101
- expect(noise).toEqual([]);
102
- });
103
- // ── 6. getTrending (empty) ───────────────────────────────────
104
- it('should return empty array for getTrending when no repos exist', () => {
105
- const trending = scanner.getTrending();
106
- expect(trending).toEqual([]);
107
- });
108
- // ── 7. searchRepos (empty) ───────────────────────────────────
109
- it('should return empty array for searchRepos when no repos exist', () => {
110
- const results = scanner.searchRepos('typescript');
111
- expect(results).toEqual([]);
112
- const withLang = scanner.searchRepos('', 'TypeScript');
113
- expect(withLang).toEqual([]);
114
- });
115
- // ── 8. getStats ──────────────────────────────────────────────
116
- it('should return initial stats with all zeroes', () => {
117
- const stats = scanner.getStats();
118
- expect(stats.total_repos).toBe(0);
119
- expect(stats.active_repos).toBe(0);
120
- expect(stats.by_language).toEqual([]);
121
- expect(stats.by_level).toEqual([]);
122
- expect(stats.hn_mentions).toBe(0);
123
- expect(stats.crypto_tokens).toBe(0);
124
- expect(stats.avg_score).toBe(0);
125
- expect(stats.last_scan).toBeNull();
126
- });
127
- // ── 9. getHnMentions (empty) ─────────────────────────────────
128
- it('should return empty array for getHnMentions when no mentions exist', () => {
129
- const mentions = scanner.getHnMentions();
130
- expect(mentions).toEqual([]);
131
- const limited = scanner.getHnMentions(10);
132
- expect(limited).toEqual([]);
133
- });
134
- // ── 10. getCryptoTokens (empty) ──────────────────────────────
135
- it('should return empty array for getCryptoTokens when no tokens exist', () => {
136
- const tokens = scanner.getCryptoTokens();
137
- expect(tokens).toEqual([]);
138
- const limited = scanner.getCryptoTokens(10);
139
- expect(limited).toEqual([]);
140
- });
141
- });
142
- //# sourceMappingURL=signal-scanner.test.js.map