@timmeck/trading-brain 1.0.0

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 (247) hide show
  1. package/README.md +306 -0
  2. package/dist/api/server.d.ts +21 -0
  3. package/dist/api/server.js +157 -0
  4. package/dist/api/server.js.map +1 -0
  5. package/dist/cli/colors.d.ts +46 -0
  6. package/dist/cli/colors.js +70 -0
  7. package/dist/cli/colors.js.map +1 -0
  8. package/dist/cli/commands/config.d.ts +2 -0
  9. package/dist/cli/commands/config.js +70 -0
  10. package/dist/cli/commands/config.js.map +1 -0
  11. package/dist/cli/commands/doctor.d.ts +2 -0
  12. package/dist/cli/commands/doctor.js +61 -0
  13. package/dist/cli/commands/doctor.js.map +1 -0
  14. package/dist/cli/commands/export.d.ts +2 -0
  15. package/dist/cli/commands/export.js +23 -0
  16. package/dist/cli/commands/export.js.map +1 -0
  17. package/dist/cli/commands/import.d.ts +2 -0
  18. package/dist/cli/commands/import.js +42 -0
  19. package/dist/cli/commands/import.js.map +1 -0
  20. package/dist/cli/commands/insights.d.ts +2 -0
  21. package/dist/cli/commands/insights.js +29 -0
  22. package/dist/cli/commands/insights.js.map +1 -0
  23. package/dist/cli/commands/network.d.ts +2 -0
  24. package/dist/cli/commands/network.js +43 -0
  25. package/dist/cli/commands/network.js.map +1 -0
  26. package/dist/cli/commands/query.d.ts +2 -0
  27. package/dist/cli/commands/query.js +27 -0
  28. package/dist/cli/commands/query.js.map +1 -0
  29. package/dist/cli/commands/rules.d.ts +2 -0
  30. package/dist/cli/commands/rules.js +26 -0
  31. package/dist/cli/commands/rules.js.map +1 -0
  32. package/dist/cli/commands/start.d.ts +2 -0
  33. package/dist/cli/commands/start.js +86 -0
  34. package/dist/cli/commands/start.js.map +1 -0
  35. package/dist/cli/commands/status.d.ts +2 -0
  36. package/dist/cli/commands/status.js +58 -0
  37. package/dist/cli/commands/status.js.map +1 -0
  38. package/dist/cli/commands/stop.d.ts +2 -0
  39. package/dist/cli/commands/stop.js +34 -0
  40. package/dist/cli/commands/stop.js.map +1 -0
  41. package/dist/cli/ipc-helper.d.ts +2 -0
  42. package/dist/cli/ipc-helper.js +26 -0
  43. package/dist/cli/ipc-helper.js.map +1 -0
  44. package/dist/config.d.ts +2 -0
  45. package/dist/config.js +107 -0
  46. package/dist/config.js.map +1 -0
  47. package/dist/db/connection.d.ts +2 -0
  48. package/dist/db/connection.js +19 -0
  49. package/dist/db/connection.js.map +1 -0
  50. package/dist/db/migrations/001_core.d.ts +2 -0
  51. package/dist/db/migrations/001_core.js +42 -0
  52. package/dist/db/migrations/001_core.js.map +1 -0
  53. package/dist/db/migrations/002_synapses.d.ts +2 -0
  54. package/dist/db/migrations/002_synapses.js +43 -0
  55. package/dist/db/migrations/002_synapses.js.map +1 -0
  56. package/dist/db/migrations/003_learning.d.ts +2 -0
  57. package/dist/db/migrations/003_learning.js +48 -0
  58. package/dist/db/migrations/003_learning.js.map +1 -0
  59. package/dist/db/migrations/004_research.d.ts +2 -0
  60. package/dist/db/migrations/004_research.js +29 -0
  61. package/dist/db/migrations/004_research.js.map +1 -0
  62. package/dist/db/migrations/index.d.ts +2 -0
  63. package/dist/db/migrations/index.js +45 -0
  64. package/dist/db/migrations/index.js.map +1 -0
  65. package/dist/db/repositories/calibration.repository.d.ts +25 -0
  66. package/dist/db/repositories/calibration.repository.js +66 -0
  67. package/dist/db/repositories/calibration.repository.js.map +1 -0
  68. package/dist/db/repositories/chain.repository.d.ts +28 -0
  69. package/dist/db/repositories/chain.repository.js +52 -0
  70. package/dist/db/repositories/chain.repository.js.map +1 -0
  71. package/dist/db/repositories/graph.repository.d.ts +33 -0
  72. package/dist/db/repositories/graph.repository.js +73 -0
  73. package/dist/db/repositories/graph.repository.js.map +1 -0
  74. package/dist/db/repositories/insight.repository.d.ts +30 -0
  75. package/dist/db/repositories/insight.repository.js +60 -0
  76. package/dist/db/repositories/insight.repository.js.map +1 -0
  77. package/dist/db/repositories/rule.repository.d.ts +35 -0
  78. package/dist/db/repositories/rule.repository.js +48 -0
  79. package/dist/db/repositories/rule.repository.js.map +1 -0
  80. package/dist/db/repositories/signal.repository.d.ts +17 -0
  81. package/dist/db/repositories/signal.repository.js +35 -0
  82. package/dist/db/repositories/signal.repository.js.map +1 -0
  83. package/dist/db/repositories/synapse.repository.d.ts +25 -0
  84. package/dist/db/repositories/synapse.repository.js +50 -0
  85. package/dist/db/repositories/synapse.repository.js.map +1 -0
  86. package/dist/db/repositories/trade.repository.d.ts +36 -0
  87. package/dist/db/repositories/trade.repository.js +64 -0
  88. package/dist/db/repositories/trade.repository.js.map +1 -0
  89. package/dist/graph/weighted-graph.d.ts +58 -0
  90. package/dist/graph/weighted-graph.js +149 -0
  91. package/dist/graph/weighted-graph.js.map +1 -0
  92. package/dist/index.d.ts +2 -0
  93. package/dist/index.js +49 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/ipc/client.d.ts +16 -0
  96. package/dist/ipc/client.js +95 -0
  97. package/dist/ipc/client.js.map +1 -0
  98. package/dist/ipc/protocol.d.ts +8 -0
  99. package/dist/ipc/protocol.js +29 -0
  100. package/dist/ipc/protocol.js.map +1 -0
  101. package/dist/ipc/router.d.ts +32 -0
  102. package/dist/ipc/router.js +70 -0
  103. package/dist/ipc/router.js.map +1 -0
  104. package/dist/ipc/server.d.ts +18 -0
  105. package/dist/ipc/server.js +142 -0
  106. package/dist/ipc/server.js.map +1 -0
  107. package/dist/learning/calibrator.d.ts +6 -0
  108. package/dist/learning/calibrator.js +57 -0
  109. package/dist/learning/calibrator.js.map +1 -0
  110. package/dist/learning/chain-detector.d.ts +17 -0
  111. package/dist/learning/chain-detector.js +29 -0
  112. package/dist/learning/chain-detector.js.map +1 -0
  113. package/dist/learning/learning-engine.d.ts +31 -0
  114. package/dist/learning/learning-engine.js +85 -0
  115. package/dist/learning/learning-engine.js.map +1 -0
  116. package/dist/learning/pattern-extractor.d.ts +14 -0
  117. package/dist/learning/pattern-extractor.js +40 -0
  118. package/dist/learning/pattern-extractor.js.map +1 -0
  119. package/dist/mcp/http-server.d.ts +14 -0
  120. package/dist/mcp/http-server.js +117 -0
  121. package/dist/mcp/http-server.js.map +1 -0
  122. package/dist/mcp/server.d.ts +1 -0
  123. package/dist/mcp/server.js +67 -0
  124. package/dist/mcp/server.js.map +1 -0
  125. package/dist/mcp/tools.d.ts +7 -0
  126. package/dist/mcp/tools.js +158 -0
  127. package/dist/mcp/tools.js.map +1 -0
  128. package/dist/research/research-engine.d.ts +21 -0
  129. package/dist/research/research-engine.js +204 -0
  130. package/dist/research/research-engine.js.map +1 -0
  131. package/dist/services/analytics.service.d.ts +16 -0
  132. package/dist/services/analytics.service.js +64 -0
  133. package/dist/services/analytics.service.js.map +1 -0
  134. package/dist/services/insight.service.d.ts +11 -0
  135. package/dist/services/insight.service.js +25 -0
  136. package/dist/services/insight.service.js.map +1 -0
  137. package/dist/services/signal.service.d.ts +22 -0
  138. package/dist/services/signal.service.js +96 -0
  139. package/dist/services/signal.service.js.map +1 -0
  140. package/dist/services/strategy.service.d.ts +29 -0
  141. package/dist/services/strategy.service.js +115 -0
  142. package/dist/services/strategy.service.js.map +1 -0
  143. package/dist/services/synapse.service.d.ts +20 -0
  144. package/dist/services/synapse.service.js +48 -0
  145. package/dist/services/synapse.service.js.map +1 -0
  146. package/dist/services/trade.service.d.ts +37 -0
  147. package/dist/services/trade.service.js +114 -0
  148. package/dist/services/trade.service.js.map +1 -0
  149. package/dist/signals/fingerprint.d.ts +29 -0
  150. package/dist/signals/fingerprint.js +98 -0
  151. package/dist/signals/fingerprint.js.map +1 -0
  152. package/dist/signals/wilson-score.d.ts +10 -0
  153. package/dist/signals/wilson-score.js +19 -0
  154. package/dist/signals/wilson-score.js.map +1 -0
  155. package/dist/synapses/decay.d.ts +6 -0
  156. package/dist/synapses/decay.js +17 -0
  157. package/dist/synapses/decay.js.map +1 -0
  158. package/dist/synapses/hebbian.d.ts +11 -0
  159. package/dist/synapses/hebbian.js +21 -0
  160. package/dist/synapses/hebbian.js.map +1 -0
  161. package/dist/synapses/synapse-manager.d.ts +22 -0
  162. package/dist/synapses/synapse-manager.js +99 -0
  163. package/dist/synapses/synapse-manager.js.map +1 -0
  164. package/dist/trading-core.d.ts +17 -0
  165. package/dist/trading-core.js +235 -0
  166. package/dist/trading-core.js.map +1 -0
  167. package/dist/types/config.types.d.ts +52 -0
  168. package/dist/types/config.types.js +2 -0
  169. package/dist/types/config.types.js.map +1 -0
  170. package/dist/types/ipc.types.d.ts +11 -0
  171. package/dist/types/ipc.types.js +2 -0
  172. package/dist/types/ipc.types.js.map +1 -0
  173. package/dist/utils/events.d.ts +48 -0
  174. package/dist/utils/events.js +23 -0
  175. package/dist/utils/events.js.map +1 -0
  176. package/dist/utils/hash.d.ts +1 -0
  177. package/dist/utils/hash.js +5 -0
  178. package/dist/utils/hash.js.map +1 -0
  179. package/dist/utils/logger.d.ts +8 -0
  180. package/dist/utils/logger.js +39 -0
  181. package/dist/utils/logger.js.map +1 -0
  182. package/dist/utils/paths.d.ts +3 -0
  183. package/dist/utils/paths.js +18 -0
  184. package/dist/utils/paths.js.map +1 -0
  185. package/package.json +47 -0
  186. package/src/api/server.ts +160 -0
  187. package/src/cli/colors.ts +80 -0
  188. package/src/cli/commands/config.ts +76 -0
  189. package/src/cli/commands/doctor.ts +62 -0
  190. package/src/cli/commands/export.ts +24 -0
  191. package/src/cli/commands/import.ts +44 -0
  192. package/src/cli/commands/insights.ts +30 -0
  193. package/src/cli/commands/network.ts +43 -0
  194. package/src/cli/commands/query.ts +28 -0
  195. package/src/cli/commands/rules.ts +27 -0
  196. package/src/cli/commands/start.ts +93 -0
  197. package/src/cli/commands/status.ts +64 -0
  198. package/src/cli/commands/stop.ts +33 -0
  199. package/src/cli/ipc-helper.ts +22 -0
  200. package/src/config.ts +103 -0
  201. package/src/db/connection.ts +22 -0
  202. package/src/db/migrations/001_core.ts +43 -0
  203. package/src/db/migrations/002_synapses.ts +44 -0
  204. package/src/db/migrations/003_learning.ts +49 -0
  205. package/src/db/migrations/004_research.ts +30 -0
  206. package/src/db/migrations/index.ts +60 -0
  207. package/src/db/repositories/calibration.repository.ts +86 -0
  208. package/src/db/repositories/chain.repository.ts +70 -0
  209. package/src/db/repositories/graph.repository.ts +103 -0
  210. package/src/db/repositories/insight.repository.ts +80 -0
  211. package/src/db/repositories/rule.repository.ts +67 -0
  212. package/src/db/repositories/signal.repository.ts +48 -0
  213. package/src/db/repositories/synapse.repository.ts +71 -0
  214. package/src/db/repositories/trade.repository.ts +97 -0
  215. package/src/graph/weighted-graph.ts +194 -0
  216. package/src/index.ts +55 -0
  217. package/src/ipc/client.ts +112 -0
  218. package/src/ipc/protocol.ts +35 -0
  219. package/src/ipc/router.ts +113 -0
  220. package/src/ipc/server.ts +150 -0
  221. package/src/learning/calibrator.ts +57 -0
  222. package/src/learning/chain-detector.ts +43 -0
  223. package/src/learning/learning-engine.ts +94 -0
  224. package/src/learning/pattern-extractor.ts +53 -0
  225. package/src/mcp/http-server.ts +118 -0
  226. package/src/mcp/server.ts +72 -0
  227. package/src/mcp/tools.ts +256 -0
  228. package/src/research/research-engine.ts +223 -0
  229. package/src/services/analytics.service.ts +68 -0
  230. package/src/services/insight.service.ts +29 -0
  231. package/src/services/signal.service.ts +109 -0
  232. package/src/services/strategy.service.ts +130 -0
  233. package/src/services/synapse.service.ts +58 -0
  234. package/src/services/trade.service.ts +139 -0
  235. package/src/signals/fingerprint.ts +93 -0
  236. package/src/signals/wilson-score.ts +17 -0
  237. package/src/synapses/decay.ts +19 -0
  238. package/src/synapses/hebbian.ts +23 -0
  239. package/src/synapses/synapse-manager.ts +112 -0
  240. package/src/trading-core.ts +285 -0
  241. package/src/types/config.types.ts +60 -0
  242. package/src/types/ipc.types.ts +8 -0
  243. package/src/utils/events.ts +42 -0
  244. package/src/utils/hash.ts +5 -0
  245. package/src/utils/logger.ts +48 -0
  246. package/src/utils/paths.ts +19 -0
  247. package/tsconfig.json +18 -0
@@ -0,0 +1,67 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { spawn } from 'node:child_process';
4
+ import path from 'node:path';
5
+ import { IpcClient } from '../ipc/client.js';
6
+ import { getPipeName } from '../utils/paths.js';
7
+ import { registerTools } from './tools.js';
8
+ function spawnDaemon() {
9
+ const entryPoint = path.resolve(import.meta.dirname, '../index.js');
10
+ const child = spawn(process.execPath, [
11
+ '--import', 'tsx',
12
+ entryPoint, 'daemon',
13
+ ], {
14
+ detached: true,
15
+ stdio: 'ignore',
16
+ cwd: path.resolve(import.meta.dirname, '../..'),
17
+ });
18
+ child.unref();
19
+ process.stderr.write(`Trading Brain: Auto-started daemon (PID: ${child.pid})\n`);
20
+ }
21
+ async function connectWithRetry(ipc, retries, delayMs) {
22
+ for (let i = 0; i < retries; i++) {
23
+ try {
24
+ await ipc.connect();
25
+ return;
26
+ }
27
+ catch {
28
+ if (i < retries - 1) {
29
+ await new Promise(r => setTimeout(r, delayMs));
30
+ }
31
+ }
32
+ }
33
+ throw new Error('Could not connect to daemon after retries');
34
+ }
35
+ export async function startMcpServer() {
36
+ const server = new McpServer({
37
+ name: 'trading-brain',
38
+ version: '1.0.0',
39
+ });
40
+ const ipc = new IpcClient(getPipeName());
41
+ try {
42
+ await ipc.connect();
43
+ }
44
+ catch {
45
+ process.stderr.write('Trading Brain: Daemon not running, starting automatically...\n');
46
+ spawnDaemon();
47
+ try {
48
+ await connectWithRetry(ipc, 10, 500);
49
+ }
50
+ catch {
51
+ process.stderr.write('Trading Brain: Could not connect to daemon after auto-start. Check logs.\n');
52
+ process.exit(1);
53
+ }
54
+ }
55
+ registerTools(server, ipc);
56
+ const transport = new StdioServerTransport();
57
+ await server.connect(transport);
58
+ process.on('SIGINT', () => {
59
+ ipc.disconnect();
60
+ process.exit(0);
61
+ });
62
+ process.on('SIGTERM', () => {
63
+ ipc.disconnect();
64
+ process.exit(0);
65
+ });
66
+ }
67
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { IpcClient } from '../ipc/client.js';
3
+ import type { IpcRouter } from '../ipc/router.js';
4
+ /** Register tools using IPC client (for stdio MCP transport) */
5
+ export declare function registerTools(server: McpServer, ipc: IpcClient): void;
6
+ /** Register tools using router directly (for HTTP MCP transport inside daemon) */
7
+ export declare function registerToolsDirect(server: McpServer, router: IpcRouter): void;
@@ -0,0 +1,158 @@
1
+ import { z } from 'zod';
2
+ function textResult(data) {
3
+ const text = typeof data === 'string' ? data : JSON.stringify(data, null, 2);
4
+ return { content: [{ type: 'text', text }] };
5
+ }
6
+ /** Register tools using IPC client (for stdio MCP transport) */
7
+ export function registerTools(server, ipc) {
8
+ registerToolsWithCaller(server, (method, params) => ipc.request(method, params));
9
+ }
10
+ /** Register tools using router directly (for HTTP MCP transport inside daemon) */
11
+ export function registerToolsDirect(server, router) {
12
+ registerToolsWithCaller(server, (method, params) => router.handle(method, params));
13
+ }
14
+ function registerToolsWithCaller(server, call) {
15
+ // 1. trading_record_outcome
16
+ server.tool('trading_record_outcome', 'Record a trade outcome. Main entry point for the learning loop — updates synapses, graph, chains, and triggers pattern extraction.', {
17
+ pair: z.string().describe('Trading pair (e.g. BTC/USDT)'),
18
+ bot_type: z.string().describe('Bot type (e.g. DCA, Grid, SmartTrader)'),
19
+ profit_pct: z.number().describe('Profit percentage of the trade'),
20
+ win: z.boolean().describe('Whether the trade was profitable'),
21
+ rsi14: z.number().optional().describe('RSI-14 value at entry'),
22
+ macd: z.number().optional().describe('MACD value at entry'),
23
+ trend_score: z.number().optional().describe('Trend score at entry'),
24
+ volatility: z.number().optional().describe('Volatility at entry'),
25
+ regime: z.string().optional().describe('Market regime (e.g. bullish_trend, ranging)'),
26
+ }, async (params) => {
27
+ const result = await call('trade.recordOutcome', {
28
+ signals: { rsi14: params.rsi14, macd: params.macd, trendScore: params.trend_score, volatility: params.volatility },
29
+ regime: params.regime,
30
+ profitPct: params.profit_pct,
31
+ win: params.win,
32
+ botType: params.bot_type,
33
+ pair: params.pair,
34
+ });
35
+ return textResult(`Trade #${result.tradeId} recorded (${params.win ? 'WIN' : 'LOSS'}, ${params.profit_pct.toFixed(2)}%). Fingerprint: ${result.fingerprint}. Synapse weight: ${result.synapseWeight.toFixed(3)}`);
36
+ });
37
+ // 2. trading_signal_weights
38
+ server.tool('trading_signal_weights', 'Get brain-weighted signal strengths based on learned experience. Returns adjusted weights for each signal type.', {
39
+ rsi14: z.number().optional().describe('RSI-14 value'),
40
+ macd: z.number().optional().describe('MACD value'),
41
+ trend_score: z.number().optional().describe('Trend score'),
42
+ volatility: z.number().optional().describe('Volatility'),
43
+ regime: z.string().optional().describe('Market regime'),
44
+ }, async (params) => {
45
+ const result = await call('signal.weights', {
46
+ signals: { rsi14: params.rsi14, macd: params.macd, trendScore: params.trend_score, volatility: params.volatility },
47
+ regime: params.regime,
48
+ });
49
+ return textResult(result);
50
+ });
51
+ // 3. trading_signal_confidence
52
+ server.tool('trading_signal_confidence', 'Get Wilson Score confidence for a signal pattern. Returns 0-1 confidence based on historical win rate.', {
53
+ rsi14: z.number().optional().describe('RSI-14 value'),
54
+ macd: z.number().optional().describe('MACD value'),
55
+ trend_score: z.number().optional().describe('Trend score'),
56
+ volatility: z.number().optional().describe('Volatility'),
57
+ regime: z.string().optional().describe('Market regime'),
58
+ }, async (params) => {
59
+ const confidence = await call('signal.confidence', {
60
+ signals: { rsi14: params.rsi14, macd: params.macd, trendScore: params.trend_score, volatility: params.volatility },
61
+ regime: params.regime,
62
+ });
63
+ return textResult(`Confidence: ${(confidence * 100).toFixed(1)}%`);
64
+ });
65
+ // 4. trading_dca_multiplier
66
+ server.tool('trading_dca_multiplier', 'Get brain-recommended DCA position size multiplier based on regime success history.', {
67
+ regime: z.string().describe('Market regime'),
68
+ rsi: z.number().describe('Current RSI value'),
69
+ volatility: z.number().describe('Current volatility'),
70
+ }, async (params) => {
71
+ const result = await call('strategy.dcaMultiplier', params);
72
+ return textResult(result);
73
+ });
74
+ // 5. trading_grid_params
75
+ server.tool('trading_grid_params', 'Get brain-recommended grid spacing parameters based on volatility history.', {
76
+ regime: z.string().describe('Market regime'),
77
+ volatility: z.number().describe('Current volatility'),
78
+ pair: z.string().describe('Trading pair'),
79
+ }, async (params) => {
80
+ const result = await call('strategy.gridParams', params);
81
+ return textResult(result);
82
+ });
83
+ // 6. trading_explore
84
+ server.tool('trading_explore', 'Explore the brain network using spreading activation. Find related nodes from a starting concept.', {
85
+ query: z.string().describe('Node ID, label, or partial match to start exploration from'),
86
+ }, async (params) => {
87
+ const result = await call('synapse.explore', params);
88
+ return textResult(result);
89
+ });
90
+ // 7. trading_connections
91
+ server.tool('trading_connections', 'Find the shortest path between two nodes in the brain network.', {
92
+ from: z.string().describe('Source node ID'),
93
+ to: z.string().describe('Target node ID'),
94
+ }, async (params) => {
95
+ const path = await call('synapse.findPath', params);
96
+ if (!path)
97
+ return textResult('No path found between these nodes.');
98
+ return textResult(`Path: ${path.join(' → ')}`);
99
+ });
100
+ // 8. trading_rules
101
+ server.tool('trading_rules', 'Get all learned trading rules with confidence scores and win rates.', {}, async () => {
102
+ const rules = await call('rule.list', {});
103
+ return textResult(rules);
104
+ });
105
+ // 9. trading_insights
106
+ server.tool('trading_insights', 'Get research insights (trends, gaps, synergies, performance, regime shifts).', {
107
+ type: z.string().optional().describe('Filter by type: trend, gap, synergy, performance, regime_shift'),
108
+ limit: z.number().optional().describe('Max results (default 20)'),
109
+ }, async (params) => {
110
+ const result = params.type
111
+ ? await call('insight.byType', params)
112
+ : await call('insight.list', params);
113
+ return textResult(result);
114
+ });
115
+ // 10. trading_chains
116
+ server.tool('trading_chains', 'Get detected trade chains (winning/losing streaks).', {
117
+ pair: z.string().optional().describe('Filter by trading pair'),
118
+ limit: z.number().optional().describe('Max results (default 20)'),
119
+ }, async (params) => {
120
+ const result = params.pair
121
+ ? await call('chain.byPair', params)
122
+ : await call('chain.list', params);
123
+ return textResult(result);
124
+ });
125
+ // 11. trading_query
126
+ server.tool('trading_query', 'Search trades and signals by fingerprint, pair, or bot type.', {
127
+ search: z.string().describe('Search query'),
128
+ limit: z.number().optional().describe('Max results (default 50)'),
129
+ }, async (params) => {
130
+ const result = await call('trade.query', params);
131
+ return textResult(result);
132
+ });
133
+ // 12. trading_status
134
+ server.tool('trading_status', 'Get brain stats: trades, synapses, graph size, rules, insights, calibration.', {}, async () => {
135
+ const result = await call('analytics.summary', {});
136
+ return textResult(result);
137
+ });
138
+ // 13. trading_calibration
139
+ server.tool('trading_calibration', 'Get current adaptive calibration parameters (learning rate, Wilson Z, decay half-life, etc.).', {}, async () => {
140
+ const result = await call('calibration.get', {});
141
+ return textResult(result);
142
+ });
143
+ // 14. trading_learn
144
+ server.tool('trading_learn', 'Manually trigger a learning cycle (pattern extraction, calibration, decay).', {}, async () => {
145
+ const result = await call('learning.run', {});
146
+ return textResult(result);
147
+ });
148
+ // 15. trading_reset
149
+ server.tool('trading_reset', 'Reset all trading brain data (trades, synapses, graph, rules, insights, chains, calibration).', {
150
+ confirm: z.boolean().describe('Must be true to confirm reset'),
151
+ }, async (params) => {
152
+ if (!params.confirm)
153
+ return textResult('Reset cancelled. Pass confirm: true to proceed.');
154
+ const result = await call('reset', {});
155
+ return textResult(result);
156
+ });
157
+ }
158
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,SAAS,UAAU,CAAC,IAAa;IAC/B,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,GAAc;IAC7D,uBAAuB,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAiB;IACtE,uBAAuB,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAiB,EAAE,IAAe;IAEjE,4BAA4B;IAC5B,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,oIAAoI,EACpI;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACzD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;QACvE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QACjE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC7D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC9D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAC3D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACnE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACjE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;KACtF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAc,MAAM,IAAI,CAAC,qBAAqB,EAAE;YAC1D,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE;YAClH,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,UAAU;YAC5B,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,OAAO,EAAE,MAAM,CAAC,QAAQ;YACxB,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,UAAU,MAAM,CAAC,OAAO,cAAc,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,MAAM,CAAC,WAAW,qBAAqB,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpN,CAAC,CACF,CAAC;IAEF,4BAA4B;IAC5B,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,iHAAiH,EACjH;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QACrD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QAClD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC1D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACxD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;KACxD,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE;YAC1C,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE;YAClH,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,+BAA+B;IAC/B,MAAM,CAAC,IAAI,CACT,2BAA2B,EAC3B,wGAAwG,EACxG;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QACrD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QAClD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC1D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QACxD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;KACxD,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE;YACjD,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE;YAClH,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,eAAe,CAAE,UAAqB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACjF,CAAC,CACF,CAAC;IAEF,4BAA4B;IAC5B,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,qFAAqF,EACrF;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC5C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC7C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;KACtD,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;QAC5D,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,yBAAyB;IACzB,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,4EAA4E,EAC5E;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC5C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QACrD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;KAC1C,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QACzD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,qBAAqB;IACrB,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,mGAAmG,EACnG;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;KACzF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QACrD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,yBAAyB;IACzB,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,gEAAgE,EAChE;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC3C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;KAC1C,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI;YAAE,OAAO,UAAU,CAAC,oCAAoC,CAAC,CAAC;QACnE,OAAO,UAAU,CAAC,SAAU,IAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC,CACF,CAAC;IAEF,mBAAmB;IACnB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,qEAAqE,EACrE,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC1C,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC,CACF,CAAC;IAEF,sBAAsB;IACtB,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,8EAA8E,EAC9E;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;QACtG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KAClE,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI;YACxB,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC;YACtC,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QACvC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,qBAAqB;IACrB,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,qDAAqD,EACrD;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC9D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KAClE,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI;YACxB,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC;YACpC,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACrC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,oBAAoB;IACpB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,8DAA8D,EAC9D;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC3C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KAClE,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,qBAAqB;IACrB,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,8EAA8E,EAC9E,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,0BAA0B;IAC1B,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,+FAA+F,EAC/F,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QACjD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,oBAAoB;IACpB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,6EAA6E,EAC7E,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC9C,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,oBAAoB;IACpB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,+FAA+F,EAC/F;QACE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;KAC/D,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,UAAU,CAAC,iDAAiD,CAAC,CAAC;QAC1F,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACvC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { TradeRepository } from '../db/repositories/trade.repository.js';
2
+ import type { InsightRepository } from '../db/repositories/insight.repository.js';
3
+ import type { ResearchConfig } from '../types/config.types.js';
4
+ export declare class ResearchEngine {
5
+ private config;
6
+ private tradeRepo;
7
+ private insightRepo;
8
+ private timer;
9
+ private logger;
10
+ constructor(config: ResearchConfig, tradeRepo: TradeRepository, insightRepo: InsightRepository);
11
+ start(): void;
12
+ stop(): void;
13
+ runCycle(): void;
14
+ private detectTrends;
15
+ private detectGaps;
16
+ private detectSynergies;
17
+ private detectPerformance;
18
+ private detectRegimeShifts;
19
+ /** Manual trigger */
20
+ runManual(): number;
21
+ }
@@ -0,0 +1,204 @@
1
+ import { getLogger } from '../utils/logger.js';
2
+ import { getEventBus } from '../utils/events.js';
3
+ function mode(arr) {
4
+ if (arr.length === 0)
5
+ return null;
6
+ const freq = {};
7
+ arr.forEach(v => { freq[v] = (freq[v] || 0) + 1; });
8
+ let maxCount = 0, maxVal = null;
9
+ for (const [val, count] of Object.entries(freq)) {
10
+ if (count > maxCount) {
11
+ maxCount = count;
12
+ maxVal = val;
13
+ }
14
+ }
15
+ return maxVal;
16
+ }
17
+ export class ResearchEngine {
18
+ config;
19
+ tradeRepo;
20
+ insightRepo;
21
+ timer = null;
22
+ logger = getLogger();
23
+ constructor(config, tradeRepo, insightRepo) {
24
+ this.config = config;
25
+ this.tradeRepo = tradeRepo;
26
+ this.insightRepo = insightRepo;
27
+ }
28
+ start() {
29
+ // Initial delay before first run
30
+ setTimeout(() => {
31
+ this.runCycle();
32
+ this.timer = setInterval(() => this.runCycle(), this.config.intervalMs);
33
+ }, this.config.initialDelayMs);
34
+ this.logger.info(`Research engine started (interval: ${this.config.intervalMs}ms)`);
35
+ }
36
+ stop() {
37
+ if (this.timer) {
38
+ clearInterval(this.timer);
39
+ this.timer = null;
40
+ }
41
+ }
42
+ runCycle() {
43
+ const bus = getEventBus();
44
+ const trades = this.tradeRepo.getAll();
45
+ if (trades.length < this.config.minTrades)
46
+ return;
47
+ const now = Date.now();
48
+ const insights = [];
49
+ this.detectTrends(trades, now, insights);
50
+ this.detectGaps(trades, insights);
51
+ this.detectSynergies(trades, insights);
52
+ this.detectPerformance(trades, insights);
53
+ this.detectRegimeShifts(trades, now, insights);
54
+ // Save insights
55
+ for (const ins of insights) {
56
+ const id = this.insightRepo.create(ins);
57
+ bus.emit('insight:created', { insightId: id, type: ins.type });
58
+ }
59
+ // Prune old insights
60
+ this.insightRepo.pruneOldest(this.config.maxInsights);
61
+ if (insights.length > 0) {
62
+ this.logger.info(`Research: ${insights.length} new insights`);
63
+ }
64
+ }
65
+ detectTrends(trades, now, insights) {
66
+ const recentCutoff = new Date(now - this.config.trendWindowDays * 86400000).toISOString();
67
+ const olderCutoff = new Date(now - 30 * 86400000).toISOString();
68
+ const recent = trades.filter(o => o.created_at > recentCutoff);
69
+ const older = trades.filter(o => o.created_at > olderCutoff && o.created_at <= recentCutoff);
70
+ if (recent.length >= 5 && older.length >= 5) {
71
+ const recentWinRate = recent.filter(o => o.win === 1).length / recent.length;
72
+ const olderWinRate = older.filter(o => o.win === 1).length / older.length;
73
+ const delta = recentWinRate - olderWinRate;
74
+ if (Math.abs(delta) > 0.1) {
75
+ insights.push({
76
+ type: 'trend',
77
+ severity: Math.abs(delta) > 0.2 ? 'high' : 'medium',
78
+ title: delta > 0 ? 'Win-Rate steigt' : 'Win-Rate sinkt',
79
+ description: `Win-Rate ${delta > 0 ? 'gestiegen' : 'gesunken'}: ${(olderWinRate * 100).toFixed(0)}% → ${(recentWinRate * 100).toFixed(0)}% (letzte ${this.config.trendWindowDays} Tage vs. vorher)`,
80
+ data: { recentWinRate, olderWinRate, delta },
81
+ });
82
+ }
83
+ }
84
+ }
85
+ detectGaps(trades, insights) {
86
+ const regimeGroups = {};
87
+ trades.forEach(o => {
88
+ const parts = o.fingerprint.split('|');
89
+ const regime = parts[4] || 'unknown';
90
+ if (!regimeGroups[regime])
91
+ regimeGroups[regime] = [];
92
+ regimeGroups[regime].push(o);
93
+ });
94
+ for (const [regime, group] of Object.entries(regimeGroups)) {
95
+ if (group.length < 5 && group.length > 0) {
96
+ insights.push({
97
+ type: 'gap',
98
+ severity: 'low',
99
+ title: `Datenlücke: ${regime}`,
100
+ description: `Nur ${group.length} Trades im Regime "${regime}" — Brain braucht mehr Daten für zuverlässige Gewichtung`,
101
+ data: { regime, count: group.length },
102
+ });
103
+ }
104
+ }
105
+ }
106
+ detectSynergies(trades, insights) {
107
+ const botTypeGroups = {};
108
+ trades.forEach(o => {
109
+ if (!botTypeGroups[o.bot_type])
110
+ botTypeGroups[o.bot_type] = [];
111
+ botTypeGroups[o.bot_type].push(o);
112
+ });
113
+ const botTypes = Object.keys(botTypeGroups);
114
+ if (botTypes.length < 2)
115
+ return;
116
+ for (let i = 0; i < botTypes.length; i++) {
117
+ for (let j = i + 1; j < botTypes.length; j++) {
118
+ const a = botTypeGroups[botTypes[i]];
119
+ const b = botTypeGroups[botTypes[j]];
120
+ const aFps = new Set(a.map(o => o.fingerprint));
121
+ const bFps = new Set(b.map(o => o.fingerprint));
122
+ let shared = 0;
123
+ aFps.forEach(fp => { if (bFps.has(fp))
124
+ shared++; });
125
+ if (shared > 0) {
126
+ insights.push({
127
+ type: 'synergy',
128
+ severity: shared > 3 ? 'high' : 'medium',
129
+ title: `Synergie: ${botTypes[i]} ↔ ${botTypes[j]}`,
130
+ description: `${shared} gemeinsame Signal-Muster — Erfahrungen von ${botTypes[i]} helfen ${botTypes[j]}`,
131
+ data: { botA: botTypes[i], botB: botTypes[j], sharedPatterns: shared },
132
+ });
133
+ }
134
+ }
135
+ }
136
+ }
137
+ detectPerformance(trades, insights) {
138
+ const fpGroups = {};
139
+ trades.forEach(o => {
140
+ if (!fpGroups[o.fingerprint])
141
+ fpGroups[o.fingerprint] = [];
142
+ fpGroups[o.fingerprint].push(o);
143
+ });
144
+ let bestFp = null, worstFp = null;
145
+ let bestWR = 0, worstWR = 1;
146
+ for (const [fp, group] of Object.entries(fpGroups)) {
147
+ if (group.length < 5)
148
+ continue;
149
+ const wr = group.filter(o => o.win === 1).length / group.length;
150
+ if (wr > bestWR) {
151
+ bestWR = wr;
152
+ bestFp = fp;
153
+ }
154
+ if (wr < worstWR) {
155
+ worstWR = wr;
156
+ worstFp = fp;
157
+ }
158
+ }
159
+ if (bestFp && bestWR > 0.6) {
160
+ insights.push({
161
+ type: 'performance',
162
+ severity: 'high',
163
+ title: 'Stärkstes Signal-Muster',
164
+ description: `"${bestFp.split('|').join(' + ')}" hat ${(bestWR * 100).toFixed(0)}% Win-Rate (n=${fpGroups[bestFp].length})`,
165
+ data: { fingerprint: bestFp, winRate: bestWR, count: fpGroups[bestFp].length },
166
+ });
167
+ }
168
+ if (worstFp && worstWR < 0.35) {
169
+ insights.push({
170
+ type: 'performance',
171
+ severity: 'high',
172
+ title: 'Schwächstes Signal-Muster',
173
+ description: `"${worstFp.split('|').join(' + ')}" hat nur ${(worstWR * 100).toFixed(0)}% Win-Rate (n=${fpGroups[worstFp].length}) — Brain reduziert Gewichtung`,
174
+ data: { fingerprint: worstFp, winRate: worstWR, count: fpGroups[worstFp].length },
175
+ });
176
+ }
177
+ }
178
+ detectRegimeShifts(trades, now, insights) {
179
+ const recentCutoff = new Date(now - this.config.trendWindowDays * 86400000).toISOString();
180
+ const recent = trades.filter(o => o.created_at > recentCutoff);
181
+ const older = trades.filter(o => o.created_at <= recentCutoff).slice(-10);
182
+ if (recent.length < 3)
183
+ return;
184
+ const recentRegimes = recent.map(o => o.fingerprint.split('|')[4] || 'unknown');
185
+ const prevRegimes = older.map(o => o.fingerprint.split('|')[4] || 'unknown');
186
+ const recentMode = mode(recentRegimes);
187
+ const prevMode = mode(prevRegimes);
188
+ if (recentMode && prevMode && recentMode !== prevMode) {
189
+ insights.push({
190
+ type: 'regime_shift',
191
+ severity: 'high',
192
+ title: 'Regime-Wechsel erkannt',
193
+ description: `Marktregime hat sich verschoben: "${prevMode}" → "${recentMode}"`,
194
+ data: { from: prevMode, to: recentMode },
195
+ });
196
+ }
197
+ }
198
+ /** Manual trigger */
199
+ runManual() {
200
+ this.runCycle();
201
+ return this.insightRepo.count();
202
+ }
203
+ }
204
+ //# sourceMappingURL=research-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research-engine.js","sourceRoot":"","sources":["../../src/research/research-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { TradeRepository } from '../db/repositories/trade.repository.js';
2
+ import type { RuleRepository } from '../db/repositories/rule.repository.js';
3
+ import type { ChainRepository } from '../db/repositories/chain.repository.js';
4
+ import type { InsightRepository } from '../db/repositories/insight.repository.js';
5
+ import type { SynapseManager } from '../synapses/synapse-manager.js';
6
+ import type { WeightedGraph } from '../graph/weighted-graph.js';
7
+ export declare class AnalyticsService {
8
+ private tradeRepo;
9
+ private ruleRepo;
10
+ private chainRepo;
11
+ private insightRepo;
12
+ private synapseManager;
13
+ private graph;
14
+ constructor(tradeRepo: TradeRepository, ruleRepo: RuleRepository, chainRepo: ChainRepository, insightRepo: InsightRepository, synapseManager: SynapseManager, graph: WeightedGraph);
15
+ getSummary(): Record<string, unknown>;
16
+ }
@@ -0,0 +1,64 @@
1
+ export class AnalyticsService {
2
+ tradeRepo;
3
+ ruleRepo;
4
+ chainRepo;
5
+ insightRepo;
6
+ synapseManager;
7
+ graph;
8
+ constructor(tradeRepo, ruleRepo, chainRepo, insightRepo, synapseManager, graph) {
9
+ this.tradeRepo = tradeRepo;
10
+ this.ruleRepo = ruleRepo;
11
+ this.chainRepo = chainRepo;
12
+ this.insightRepo = insightRepo;
13
+ this.synapseManager = synapseManager;
14
+ this.graph = graph;
15
+ }
16
+ getSummary() {
17
+ const tradeCount = this.tradeRepo.count();
18
+ const recentTrades = this.tradeRepo.getRecent(10);
19
+ const rules = this.ruleRepo.getAll();
20
+ const chains = this.chainRepo.getRecent(5);
21
+ const insights = this.insightRepo.getRecent(5);
22
+ const wins = recentTrades.filter(t => t.win === 1).length;
23
+ const recentWinRate = recentTrades.length > 0 ? wins / recentTrades.length : 0;
24
+ const topRule = rules.length > 0 ? {
25
+ pattern: rules[0].pattern,
26
+ winRate: Math.round(rules[0].win_rate * 100),
27
+ confidence: Math.round(rules[0].confidence * 100),
28
+ sampleCount: rules[0].sample_count,
29
+ } : null;
30
+ return {
31
+ trades: {
32
+ total: tradeCount,
33
+ recentWinRate: Math.round(recentWinRate * 100),
34
+ },
35
+ rules: {
36
+ total: rules.length,
37
+ topRule,
38
+ },
39
+ chains: {
40
+ total: this.chainRepo.count(),
41
+ recent: chains.map(c => ({
42
+ pair: c.pair,
43
+ type: c.type,
44
+ length: c.length,
45
+ })),
46
+ },
47
+ insights: {
48
+ total: this.insightRepo.count(),
49
+ recent: insights.map(i => ({
50
+ type: i.type,
51
+ severity: i.severity,
52
+ title: i.title,
53
+ })),
54
+ },
55
+ network: {
56
+ synapses: this.synapseManager.count(),
57
+ avgWeight: Number(this.synapseManager.getAvgWeight().toFixed(3)),
58
+ graphNodes: this.graph.getNodeCount(),
59
+ graphEdges: this.graph.getEdgeCount(),
60
+ },
61
+ };
62
+ }
63
+ }
64
+ //# sourceMappingURL=analytics.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.service.js","sourceRoot":"","sources":["../../src/services/analytics.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { InsightRepository, InsightRecord } from '../db/repositories/insight.repository.js';
2
+ export declare class InsightService {
3
+ private insightRepo;
4
+ constructor(insightRepo: InsightRepository);
5
+ getAll(): InsightRecord[];
6
+ getRecent(limit?: number): InsightRecord[];
7
+ getByType(type: string): InsightRecord[];
8
+ getBySeverity(severity: string): InsightRecord[];
9
+ search(query: string, limit?: number): InsightRecord[];
10
+ count(): number;
11
+ }
@@ -0,0 +1,25 @@
1
+ export class InsightService {
2
+ insightRepo;
3
+ constructor(insightRepo) {
4
+ this.insightRepo = insightRepo;
5
+ }
6
+ getAll() {
7
+ return this.insightRepo.getAll();
8
+ }
9
+ getRecent(limit = 10) {
10
+ return this.insightRepo.getRecent(limit);
11
+ }
12
+ getByType(type) {
13
+ return this.insightRepo.getByType(type);
14
+ }
15
+ getBySeverity(severity) {
16
+ return this.insightRepo.getBySeverity(severity);
17
+ }
18
+ search(query, limit = 20) {
19
+ return this.insightRepo.search(query, limit);
20
+ }
21
+ count() {
22
+ return this.insightRepo.count();
23
+ }
24
+ }
25
+ //# sourceMappingURL=insight.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insight.service.js","sourceRoot":"","sources":["../../src/services/insight.service.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAc;IACL;IAApB,YAAoB,WAA8B;QAA9B,gBAAW,GAAX,WAAW,CAAmB;IAAG,CAAC;IAEtD,MAAM;QACJ,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;IACnC,CAAC;IAED,SAAS,CAAC,QAAgB,EAAE;QAC1B,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,aAAa,CAAC,QAAgB;QAC5B,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,QAAgB,EAAE;QACtC,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;CACF"}