@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,33 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface GraphNodeRecord {
3
+ id: string;
4
+ type: string;
5
+ label: string;
6
+ activation: number;
7
+ total_activations: number;
8
+ }
9
+ export interface GraphEdgeRecord {
10
+ id: string;
11
+ source: string;
12
+ target: string;
13
+ weight: number;
14
+ activations: number;
15
+ last_activated: string;
16
+ }
17
+ export declare class GraphRepository {
18
+ private db;
19
+ private stmts;
20
+ constructor(db: Database.Database);
21
+ upsertNode(node: GraphNodeRecord): void;
22
+ upsertEdge(edge: GraphEdgeRecord): void;
23
+ getAllNodes(): GraphNodeRecord[];
24
+ getAllEdges(): GraphEdgeRecord[];
25
+ getNode(id: string): GraphNodeRecord | undefined;
26
+ getEdge(id: string): GraphEdgeRecord | undefined;
27
+ getEdgesFrom(nodeId: string): GraphEdgeRecord[];
28
+ getEdgesFor(nodeId: string): GraphEdgeRecord[];
29
+ nodeCount(): number;
30
+ edgeCount(): number;
31
+ updateEdgeWeight(id: string, weight: number): void;
32
+ clearAll(): void;
33
+ }
@@ -0,0 +1,73 @@
1
+ export class GraphRepository {
2
+ db;
3
+ stmts;
4
+ constructor(db) {
5
+ this.db = db;
6
+ this.stmts = {
7
+ upsertNode: db.prepare(`
8
+ INSERT INTO graph_nodes (id, type, label, activation, total_activations)
9
+ VALUES (@id, @type, @label, @activation, @total_activations)
10
+ ON CONFLICT(id) DO UPDATE SET
11
+ activation = @activation, total_activations = @total_activations
12
+ `),
13
+ upsertEdge: db.prepare(`
14
+ INSERT INTO graph_edges (id, source, target, weight, activations, last_activated)
15
+ VALUES (@id, @source, @target, @weight, @activations, @last_activated)
16
+ ON CONFLICT(id) DO UPDATE SET
17
+ weight = @weight, activations = @activations, last_activated = @last_activated
18
+ `),
19
+ getAllNodes: db.prepare('SELECT * FROM graph_nodes'),
20
+ getAllEdges: db.prepare('SELECT * FROM graph_edges'),
21
+ getNode: db.prepare('SELECT * FROM graph_nodes WHERE id = ?'),
22
+ getEdge: db.prepare('SELECT * FROM graph_edges WHERE id = ?'),
23
+ getEdgesFrom: db.prepare('SELECT * FROM graph_edges WHERE source = ?'),
24
+ getEdgesTo: db.prepare('SELECT * FROM graph_edges WHERE target = ?'),
25
+ getEdgesFor: db.prepare('SELECT * FROM graph_edges WHERE source = ? OR target = ?'),
26
+ nodeCount: db.prepare('SELECT COUNT(*) as count FROM graph_nodes'),
27
+ edgeCount: db.prepare('SELECT COUNT(*) as count FROM graph_edges'),
28
+ updateEdgeWeight: db.prepare('UPDATE graph_edges SET weight = ?, activations = activations + 1, last_activated = datetime("now") WHERE id = ?'),
29
+ deleteAllNodes: db.prepare('DELETE FROM graph_nodes'),
30
+ deleteAllEdges: db.prepare('DELETE FROM graph_edges'),
31
+ };
32
+ }
33
+ upsertNode(node) {
34
+ this.stmts['upsertNode'].run(node);
35
+ }
36
+ upsertEdge(edge) {
37
+ this.stmts['upsertEdge'].run(edge);
38
+ }
39
+ getAllNodes() {
40
+ return this.stmts['getAllNodes'].all();
41
+ }
42
+ getAllEdges() {
43
+ return this.stmts['getAllEdges'].all();
44
+ }
45
+ getNode(id) {
46
+ return this.stmts['getNode'].get(id);
47
+ }
48
+ getEdge(id) {
49
+ return this.stmts['getEdge'].get(id);
50
+ }
51
+ getEdgesFrom(nodeId) {
52
+ return this.stmts['getEdgesFrom'].all(nodeId);
53
+ }
54
+ getEdgesFor(nodeId) {
55
+ return this.stmts['getEdgesFor'].all(nodeId, nodeId);
56
+ }
57
+ nodeCount() {
58
+ const row = this.stmts['nodeCount'].get();
59
+ return row.count;
60
+ }
61
+ edgeCount() {
62
+ const row = this.stmts['edgeCount'].get();
63
+ return row.count;
64
+ }
65
+ updateEdgeWeight(id, weight) {
66
+ this.stmts['updateEdgeWeight'].run(weight, id);
67
+ }
68
+ clearAll() {
69
+ this.stmts['deleteAllEdges'].run();
70
+ this.stmts['deleteAllNodes'].run();
71
+ }
72
+ }
73
+ //# sourceMappingURL=graph.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/graph.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface InsightRecord {
3
+ id: number;
4
+ type: string;
5
+ severity: string;
6
+ title: string;
7
+ description: string;
8
+ data_json: string | null;
9
+ created_at: string;
10
+ }
11
+ export declare class InsightRepository {
12
+ private db;
13
+ private stmts;
14
+ constructor(db: Database.Database);
15
+ create(data: {
16
+ type: string;
17
+ severity: string;
18
+ title: string;
19
+ description: string;
20
+ data?: unknown;
21
+ }): number;
22
+ getAll(): InsightRecord[];
23
+ getRecent(limit?: number): InsightRecord[];
24
+ getByType(type: string): InsightRecord[];
25
+ getBySeverity(severity: string): InsightRecord[];
26
+ count(): number;
27
+ search(query: string, limit?: number): InsightRecord[];
28
+ pruneOldest(keepCount: number): void;
29
+ deleteAll(): void;
30
+ }
@@ -0,0 +1,60 @@
1
+ export class InsightRepository {
2
+ db;
3
+ stmts;
4
+ constructor(db) {
5
+ this.db = db;
6
+ this.stmts = {
7
+ create: db.prepare(`
8
+ INSERT INTO insights (type, severity, title, description, data_json)
9
+ VALUES (@type, @severity, @title, @description, @data_json)
10
+ `),
11
+ getAll: db.prepare('SELECT * FROM insights ORDER BY created_at DESC'),
12
+ getRecent: db.prepare('SELECT * FROM insights ORDER BY created_at DESC LIMIT ?'),
13
+ getByType: db.prepare('SELECT * FROM insights WHERE type = ? ORDER BY created_at DESC'),
14
+ getBySeverity: db.prepare('SELECT * FROM insights WHERE severity = ? ORDER BY created_at DESC'),
15
+ count: db.prepare('SELECT COUNT(*) as count FROM insights'),
16
+ search: db.prepare('SELECT insights.* FROM insights_fts JOIN insights ON insights_fts.rowid = insights.id WHERE insights_fts MATCH ? LIMIT ?'),
17
+ deleteOldest: db.prepare('DELETE FROM insights WHERE id IN (SELECT id FROM insights ORDER BY created_at ASC LIMIT ?)'),
18
+ deleteAll: db.prepare('DELETE FROM insights'),
19
+ };
20
+ }
21
+ create(data) {
22
+ const result = this.stmts['create'].run({
23
+ type: data.type,
24
+ severity: data.severity,
25
+ title: data.title,
26
+ description: data.description,
27
+ data_json: data.data ? JSON.stringify(data.data) : null,
28
+ });
29
+ return result.lastInsertRowid;
30
+ }
31
+ getAll() {
32
+ return this.stmts['getAll'].all();
33
+ }
34
+ getRecent(limit = 10) {
35
+ return this.stmts['getRecent'].all(limit);
36
+ }
37
+ getByType(type) {
38
+ return this.stmts['getByType'].all(type);
39
+ }
40
+ getBySeverity(severity) {
41
+ return this.stmts['getBySeverity'].all(severity);
42
+ }
43
+ count() {
44
+ const row = this.stmts['count'].get();
45
+ return row.count;
46
+ }
47
+ search(query, limit = 20) {
48
+ return this.stmts['search'].all(query, limit);
49
+ }
50
+ pruneOldest(keepCount) {
51
+ const total = this.count();
52
+ if (total > keepCount) {
53
+ this.stmts['deleteOldest'].run(total - keepCount);
54
+ }
55
+ }
56
+ deleteAll() {
57
+ this.stmts['deleteAll'].run();
58
+ }
59
+ }
60
+ //# sourceMappingURL=insight.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insight.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/insight.repository.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,iBAAiB;IAGR;IAFZ,KAAK,CAA4B;IAEzC,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;QACvC,IAAI,CAAC,KAAK,GAAG;YACX,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC;;;OAGlB,CAAC;YACF,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC;YACrE,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,yDAAyD,CAAC;YAChF,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,gEAAgE,CAAC;YACvF,aAAa,EAAE,EAAE,CAAC,OAAO,CAAC,oEAAoE,CAAC;YAC/F,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC;YAC3D,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,0HAA0H,CAAC;YAC9I,YAAY,EAAE,EAAE,CAAC,OAAO,CAAC,4FAA4F,CAAC;YACtH,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,sBAAsB,CAAC;SAC9C,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAA4F;QACjG,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAE,CAAC,GAAG,CAAC;YACvC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;SACxD,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,eAAyB,CAAC;IAC1C,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAE,CAAC,GAAG,EAAqB,CAAC;IACxD,CAAC;IAED,SAAS,CAAC,QAAgB,EAAE;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAE,CAAC,GAAG,CAAC,KAAK,CAAoB,CAAC;IAChE,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAE,CAAC,GAAG,CAAC,IAAI,CAAoB,CAAC;IAC/D,CAAC;IAED,aAAa,CAAC,QAAgB;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAE,CAAC,GAAG,CAAC,QAAQ,CAAoB,CAAC;IACvE,CAAC;IAED,KAAK;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC,GAAG,EAAuB,CAAC;QAC5D,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,QAAgB,EAAE;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAE,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAoB,CAAC;IACpE,CAAC;IAED,WAAW,CAAC,SAAiB;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAE,CAAC,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,SAAS;QACP,IAAI,CAAC,KAAK,CAAC,WAAW,CAAE,CAAC,GAAG,EAAE,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface RuleRecord {
3
+ id: number;
4
+ pattern: string;
5
+ confidence: number;
6
+ sample_count: number;
7
+ win_rate: number;
8
+ avg_profit: number;
9
+ created_at: string;
10
+ updated_at: string;
11
+ }
12
+ export declare class RuleRepository {
13
+ private db;
14
+ private stmts;
15
+ constructor(db: Database.Database);
16
+ create(data: {
17
+ pattern: string;
18
+ confidence: number;
19
+ sample_count: number;
20
+ win_rate: number;
21
+ avg_profit: number;
22
+ }): number;
23
+ getAll(): RuleRecord[];
24
+ getById(id: number): RuleRecord | undefined;
25
+ count(): number;
26
+ deleteAll(): void;
27
+ delete(id: number): void;
28
+ replaceAll(rules: {
29
+ pattern: string;
30
+ confidence: number;
31
+ sample_count: number;
32
+ win_rate: number;
33
+ avg_profit: number;
34
+ }[]): void;
35
+ }
@@ -0,0 +1,48 @@
1
+ export class RuleRepository {
2
+ db;
3
+ stmts;
4
+ constructor(db) {
5
+ this.db = db;
6
+ this.stmts = {
7
+ create: db.prepare(`
8
+ INSERT INTO rules (pattern, confidence, sample_count, win_rate, avg_profit)
9
+ VALUES (@pattern, @confidence, @sample_count, @win_rate, @avg_profit)
10
+ `),
11
+ getAll: db.prepare('SELECT * FROM rules ORDER BY confidence DESC'),
12
+ getById: db.prepare('SELECT * FROM rules WHERE id = ?'),
13
+ count: db.prepare('SELECT COUNT(*) as count FROM rules'),
14
+ deleteAll: db.prepare('DELETE FROM rules'),
15
+ deleteById: db.prepare('DELETE FROM rules WHERE id = ?'),
16
+ };
17
+ }
18
+ create(data) {
19
+ const result = this.stmts['create'].run(data);
20
+ return result.lastInsertRowid;
21
+ }
22
+ getAll() {
23
+ return this.stmts['getAll'].all();
24
+ }
25
+ getById(id) {
26
+ return this.stmts['getById'].get(id);
27
+ }
28
+ count() {
29
+ const row = this.stmts['count'].get();
30
+ return row.count;
31
+ }
32
+ deleteAll() {
33
+ this.stmts['deleteAll'].run();
34
+ }
35
+ delete(id) {
36
+ this.stmts['deleteById'].run(id);
37
+ }
38
+ replaceAll(rules) {
39
+ const tx = this.db.transaction(() => {
40
+ this.stmts['deleteAll'].run();
41
+ for (const rule of rules) {
42
+ this.stmts['create'].run(rule);
43
+ }
44
+ });
45
+ tx();
46
+ }
47
+ }
48
+ //# sourceMappingURL=rule.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/rule.repository.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,cAAc;IAGL;IAFZ,KAAK,CAA4B;IAEzC,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;QACvC,IAAI,CAAC,KAAK,GAAG;YACX,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC;;;OAGlB,CAAC;YACF,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC;YAClE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC;YACvD,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC;YACxD,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC;YAC1C,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC;SACzD,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAAyG;QAC9G,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC,eAAyB,CAAC;IAC1C,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAE,CAAC,GAAG,EAAkB,CAAC;IACrD,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAE,CAAC,GAAG,CAAC,EAAE,CAA2B,CAAC;IAClE,CAAC;IAED,KAAK;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC,GAAG,EAAuB,CAAC;QAC5D,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,SAAS;QACP,IAAI,CAAC,KAAK,CAAC,WAAW,CAAE,CAAC,GAAG,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,EAAU;QACf,IAAI,CAAC,KAAK,CAAC,YAAY,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,UAAU,CAAC,KAA4G;QACrH,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAClC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAE,CAAC,GAAG,EAAE,CAAC;YAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,EAAE,EAAE,CAAC;IACP,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface SignalComboRecord {
3
+ id: number;
4
+ fingerprint: string;
5
+ signals_json: string;
6
+ regime: string | null;
7
+ created_at: string;
8
+ }
9
+ export declare class SignalRepository {
10
+ private db;
11
+ private stmts;
12
+ constructor(db: Database.Database);
13
+ create(fingerprint: string, signalsJson: string, regime?: string): number;
14
+ getByFingerprint(fingerprint: string): SignalComboRecord[];
15
+ getAll(): SignalComboRecord[];
16
+ count(): number;
17
+ }
@@ -0,0 +1,35 @@
1
+ export class SignalRepository {
2
+ db;
3
+ stmts;
4
+ constructor(db) {
5
+ this.db = db;
6
+ this.stmts = {
7
+ create: db.prepare(`
8
+ INSERT INTO signal_combos (fingerprint, signals_json, regime)
9
+ VALUES (@fingerprint, @signals_json, @regime)
10
+ `),
11
+ getByFingerprint: db.prepare('SELECT * FROM signal_combos WHERE fingerprint = ? ORDER BY created_at DESC'),
12
+ getAll: db.prepare('SELECT * FROM signal_combos ORDER BY created_at DESC'),
13
+ count: db.prepare('SELECT COUNT(*) as count FROM signal_combos'),
14
+ };
15
+ }
16
+ create(fingerprint, signalsJson, regime) {
17
+ const result = this.stmts['create'].run({
18
+ fingerprint,
19
+ signals_json: signalsJson,
20
+ regime: regime ?? null,
21
+ });
22
+ return result.lastInsertRowid;
23
+ }
24
+ getByFingerprint(fingerprint) {
25
+ return this.stmts['getByFingerprint'].all(fingerprint);
26
+ }
27
+ getAll() {
28
+ return this.stmts['getAll'].all();
29
+ }
30
+ count() {
31
+ const row = this.stmts['count'].get();
32
+ return row.count;
33
+ }
34
+ }
35
+ //# sourceMappingURL=signal.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/signal.repository.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,gBAAgB;IAGP;IAFZ,KAAK,CAA4B;IAEzC,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;QACvC,IAAI,CAAC,KAAK,GAAG;YACX,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC;;;OAGlB,CAAC;YACF,gBAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,4EAA4E,CAAC;YAC1G,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC;YAC1E,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC;SACjE,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,WAAmB,EAAE,WAAmB,EAAE,MAAe;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAE,CAAC,GAAG,CAAC;YACvC,WAAW;YACX,YAAY,EAAE,WAAW;YACzB,MAAM,EAAE,MAAM,IAAI,IAAI;SACvB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,eAAyB,CAAC;IAC1C,CAAC;IAED,gBAAgB,CAAC,WAAmB;QAClC,OAAO,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAE,CAAC,GAAG,CAAC,WAAW,CAAwB,CAAC;IACjF,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAE,CAAC,GAAG,EAAyB,CAAC;IAC5D,CAAC;IAED,KAAK;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC,GAAG,EAAuB,CAAC;QAC5D,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface SynapseRecord {
3
+ id: string;
4
+ fingerprint: string;
5
+ weight: number;
6
+ wins: number;
7
+ losses: number;
8
+ activations: number;
9
+ total_profit: number;
10
+ last_activated: string;
11
+ created_at: string;
12
+ }
13
+ export declare class SynapseRepository {
14
+ private db;
15
+ private stmts;
16
+ constructor(db: Database.Database);
17
+ upsert(synapse: Omit<SynapseRecord, 'created_at'>): void;
18
+ getById(id: string): SynapseRecord | undefined;
19
+ getAll(): SynapseRecord[];
20
+ count(): number;
21
+ updateWeight(id: string, weight: number): void;
22
+ delete(id: string): void;
23
+ getByMinWeight(minWeight: number): SynapseRecord[];
24
+ getStrongest(limit?: number): SynapseRecord[];
25
+ }
@@ -0,0 +1,50 @@
1
+ export class SynapseRepository {
2
+ db;
3
+ stmts;
4
+ constructor(db) {
5
+ this.db = db;
6
+ this.stmts = {
7
+ upsert: db.prepare(`
8
+ INSERT INTO synapses (id, fingerprint, weight, wins, losses, activations, total_profit, last_activated)
9
+ VALUES (@id, @fingerprint, @weight, @wins, @losses, @activations, @total_profit, @last_activated)
10
+ ON CONFLICT(id) DO UPDATE SET
11
+ weight = @weight, wins = @wins, losses = @losses,
12
+ activations = @activations, total_profit = @total_profit,
13
+ last_activated = @last_activated
14
+ `),
15
+ getById: db.prepare('SELECT * FROM synapses WHERE id = ?'),
16
+ getAll: db.prepare('SELECT * FROM synapses ORDER BY weight DESC'),
17
+ count: db.prepare('SELECT COUNT(*) as count FROM synapses'),
18
+ updateWeight: db.prepare('UPDATE synapses SET weight = ?, last_activated = datetime("now") WHERE id = ?'),
19
+ deleteById: db.prepare('DELETE FROM synapses WHERE id = ?'),
20
+ getByMinWeight: db.prepare('SELECT * FROM synapses WHERE weight >= ? ORDER BY weight DESC'),
21
+ getStrongest: db.prepare('SELECT * FROM synapses ORDER BY weight DESC LIMIT ?'),
22
+ };
23
+ }
24
+ upsert(synapse) {
25
+ this.stmts['upsert'].run(synapse);
26
+ }
27
+ getById(id) {
28
+ return this.stmts['getById'].get(id);
29
+ }
30
+ getAll() {
31
+ return this.stmts['getAll'].all();
32
+ }
33
+ count() {
34
+ const row = this.stmts['count'].get();
35
+ return row.count;
36
+ }
37
+ updateWeight(id, weight) {
38
+ this.stmts['updateWeight'].run(weight, id);
39
+ }
40
+ delete(id) {
41
+ this.stmts['deleteById'].run(id);
42
+ }
43
+ getByMinWeight(minWeight) {
44
+ return this.stmts['getByMinWeight'].all(minWeight);
45
+ }
46
+ getStrongest(limit = 20) {
47
+ return this.stmts['getStrongest'].all(limit);
48
+ }
49
+ }
50
+ //# sourceMappingURL=synapse.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synapse.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/synapse.repository.ts"],"names":[],"mappings":"AAeA,MAAM,OAAO,iBAAiB;IAGR;IAFZ,KAAK,CAA4B;IAEzC,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;QACvC,IAAI,CAAC,KAAK,GAAG;YACX,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC;;;;;;;OAOlB,CAAC;YACF,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC;YAC1D,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC;YACjE,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC;YAC3D,YAAY,EAAE,EAAE,CAAC,OAAO,CAAC,+EAA+E,CAAC;YACzG,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC;YAC3D,cAAc,EAAE,EAAE,CAAC,OAAO,CAAC,+DAA+D,CAAC;YAC3F,YAAY,EAAE,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC;SAChF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,OAA0C;QAC/C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAE,CAAC,GAAG,CAAC,EAAE,CAA8B,CAAC;IACrE,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAE,CAAC,GAAG,EAAqB,CAAC;IACxD,CAAC;IAED,KAAK;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC,GAAG,EAAuB,CAAC;QAC5D,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,YAAY,CAAC,EAAU,EAAE,MAAc;QACrC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAE,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,EAAU;QACf,IAAI,CAAC,KAAK,CAAC,YAAY,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,cAAc,CAAC,SAAiB;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAE,CAAC,GAAG,CAAC,SAAS,CAAoB,CAAC;IACzE,CAAC;IAED,YAAY,CAAC,QAAgB,EAAE;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAE,CAAC,GAAG,CAAC,KAAK,CAAoB,CAAC;IACnE,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface TradeRecord {
3
+ id: number;
4
+ fingerprint: string;
5
+ pair: string;
6
+ bot_type: string;
7
+ regime: string | null;
8
+ profit_pct: number;
9
+ win: number;
10
+ signals_json: string | null;
11
+ created_at: string;
12
+ }
13
+ export interface CreateTradeData {
14
+ fingerprint: string;
15
+ pair: string;
16
+ bot_type: string;
17
+ regime?: string;
18
+ profit_pct: number;
19
+ win: boolean;
20
+ signals_json?: string;
21
+ }
22
+ export declare class TradeRepository {
23
+ private db;
24
+ private stmts;
25
+ constructor(db: Database.Database);
26
+ create(data: CreateTradeData): number;
27
+ getById(id: number): TradeRecord | undefined;
28
+ count(): number;
29
+ getAll(): TradeRecord[];
30
+ getRecent(limit?: number): TradeRecord[];
31
+ getByPair(pair: string): TradeRecord[];
32
+ getByFingerprint(fingerprint: string): TradeRecord[];
33
+ getByBotType(botType: string): TradeRecord[];
34
+ getSince(dateStr: string): TradeRecord[];
35
+ search(query: string, limit?: number): TradeRecord[];
36
+ }
@@ -0,0 +1,64 @@
1
+ export class TradeRepository {
2
+ db;
3
+ stmts;
4
+ constructor(db) {
5
+ this.db = db;
6
+ this.stmts = {
7
+ create: db.prepare(`
8
+ INSERT INTO trades (fingerprint, pair, bot_type, regime, profit_pct, win, signals_json)
9
+ VALUES (@fingerprint, @pair, @bot_type, @regime, @profit_pct, @win, @signals_json)
10
+ `),
11
+ getById: db.prepare('SELECT * FROM trades WHERE id = ?'),
12
+ count: db.prepare('SELECT COUNT(*) as count FROM trades'),
13
+ getAll: db.prepare('SELECT * FROM trades ORDER BY created_at DESC'),
14
+ getRecent: db.prepare('SELECT * FROM trades ORDER BY created_at DESC LIMIT ?'),
15
+ getByPair: db.prepare('SELECT * FROM trades WHERE pair = ? ORDER BY created_at DESC'),
16
+ getByFingerprint: db.prepare('SELECT * FROM trades WHERE fingerprint = ? ORDER BY created_at DESC'),
17
+ getByBotType: db.prepare('SELECT * FROM trades WHERE bot_type = ? ORDER BY created_at DESC'),
18
+ getSince: db.prepare('SELECT * FROM trades WHERE created_at > ? ORDER BY created_at DESC'),
19
+ search: db.prepare(`SELECT * FROM trades WHERE fingerprint LIKE ? OR pair LIKE ? OR bot_type LIKE ? ORDER BY created_at DESC LIMIT ?`),
20
+ };
21
+ }
22
+ create(data) {
23
+ const result = this.stmts['create'].run({
24
+ fingerprint: data.fingerprint,
25
+ pair: data.pair,
26
+ bot_type: data.bot_type,
27
+ regime: data.regime ?? null,
28
+ profit_pct: data.profit_pct,
29
+ win: data.win ? 1 : 0,
30
+ signals_json: data.signals_json ?? null,
31
+ });
32
+ return result.lastInsertRowid;
33
+ }
34
+ getById(id) {
35
+ return this.stmts['getById'].get(id);
36
+ }
37
+ count() {
38
+ const row = this.stmts['count'].get();
39
+ return row.count;
40
+ }
41
+ getAll() {
42
+ return this.stmts['getAll'].all();
43
+ }
44
+ getRecent(limit = 10) {
45
+ return this.stmts['getRecent'].all(limit);
46
+ }
47
+ getByPair(pair) {
48
+ return this.stmts['getByPair'].all(pair);
49
+ }
50
+ getByFingerprint(fingerprint) {
51
+ return this.stmts['getByFingerprint'].all(fingerprint);
52
+ }
53
+ getByBotType(botType) {
54
+ return this.stmts['getByBotType'].all(botType);
55
+ }
56
+ getSince(dateStr) {
57
+ return this.stmts['getSince'].all(dateStr);
58
+ }
59
+ search(query, limit = 50) {
60
+ const like = `%${query}%`;
61
+ return this.stmts['search'].all(like, like, like, limit);
62
+ }
63
+ }
64
+ //# sourceMappingURL=trade.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trade.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/trade.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ export declare const NODE_TYPES: {
2
+ readonly SIGNAL: "signal";
3
+ readonly REGIME: "regime";
4
+ readonly OUTCOME: "outcome";
5
+ readonly PAIR: "pair";
6
+ readonly BOT_TYPE: "bot_type";
7
+ readonly TIME: "time";
8
+ readonly COMBO: "combo";
9
+ };
10
+ export type NodeType = typeof NODE_TYPES[keyof typeof NODE_TYPES];
11
+ export interface GraphNode {
12
+ id: string;
13
+ type: string;
14
+ label: string;
15
+ activation: number;
16
+ totalActivations: number;
17
+ }
18
+ export interface GraphEdge {
19
+ source: string;
20
+ target: string;
21
+ weight: number;
22
+ activations: number;
23
+ lastActivated: number;
24
+ }
25
+ export interface ActivatedNode {
26
+ id: string;
27
+ type: string;
28
+ label: string;
29
+ activation: number;
30
+ }
31
+ export declare class WeightedGraph {
32
+ nodes: Record<string, GraphNode>;
33
+ edges: Record<string, GraphEdge>;
34
+ addNode(id: string, type: string, label: string): GraphNode;
35
+ addEdge(sourceId: string, targetId: string, weight?: number): GraphEdge;
36
+ strengthenEdge(sourceId: string, targetId: string, amount?: number): void;
37
+ weakenEdge(sourceId: string, targetId: string, factor?: number): void;
38
+ /**
39
+ * Spreading Activation — BFS energy propagation through the graph.
40
+ * Returns activated nodes sorted by activation level descending.
41
+ */
42
+ spreadingActivation(startNodeId: string, initialEnergy?: number, decayFactor?: number, threshold?: number, maxDepth?: number): ActivatedNode[];
43
+ getEdgesFor(nodeId: string): GraphEdge[];
44
+ /** Apply temporal decay to all edges */
45
+ decayEdges(halfLifeMs: number): void;
46
+ /** Find shortest path between two nodes using BFS */
47
+ findPath(fromId: string, toId: string, maxDepth?: number): string[] | null;
48
+ serialize(): {
49
+ nodes: GraphNode[];
50
+ edges: GraphEdge[];
51
+ };
52
+ deserialize(data: {
53
+ nodes: GraphNode[];
54
+ edges: GraphEdge[];
55
+ }): void;
56
+ getNodeCount(): number;
57
+ getEdgeCount(): number;
58
+ }