@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.
- package/README.md +306 -0
- package/dist/api/server.d.ts +21 -0
- package/dist/api/server.js +157 -0
- package/dist/api/server.js.map +1 -0
- package/dist/cli/colors.d.ts +46 -0
- package/dist/cli/colors.js +70 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/commands/config.d.ts +2 -0
- package/dist/cli/commands/config.js +70 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.js +61 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/export.d.ts +2 -0
- package/dist/cli/commands/export.js +23 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/import.d.ts +2 -0
- package/dist/cli/commands/import.js +42 -0
- package/dist/cli/commands/import.js.map +1 -0
- package/dist/cli/commands/insights.d.ts +2 -0
- package/dist/cli/commands/insights.js +29 -0
- package/dist/cli/commands/insights.js.map +1 -0
- package/dist/cli/commands/network.d.ts +2 -0
- package/dist/cli/commands/network.js +43 -0
- package/dist/cli/commands/network.js.map +1 -0
- package/dist/cli/commands/query.d.ts +2 -0
- package/dist/cli/commands/query.js +27 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/rules.d.ts +2 -0
- package/dist/cli/commands/rules.js +26 -0
- package/dist/cli/commands/rules.js.map +1 -0
- package/dist/cli/commands/start.d.ts +2 -0
- package/dist/cli/commands/start.js +86 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.js +58 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +2 -0
- package/dist/cli/commands/stop.js +34 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/ipc-helper.d.ts +2 -0
- package/dist/cli/ipc-helper.js +26 -0
- package/dist/cli/ipc-helper.js.map +1 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.js +107 -0
- package/dist/config.js.map +1 -0
- package/dist/db/connection.d.ts +2 -0
- package/dist/db/connection.js +19 -0
- package/dist/db/connection.js.map +1 -0
- package/dist/db/migrations/001_core.d.ts +2 -0
- package/dist/db/migrations/001_core.js +42 -0
- package/dist/db/migrations/001_core.js.map +1 -0
- package/dist/db/migrations/002_synapses.d.ts +2 -0
- package/dist/db/migrations/002_synapses.js +43 -0
- package/dist/db/migrations/002_synapses.js.map +1 -0
- package/dist/db/migrations/003_learning.d.ts +2 -0
- package/dist/db/migrations/003_learning.js +48 -0
- package/dist/db/migrations/003_learning.js.map +1 -0
- package/dist/db/migrations/004_research.d.ts +2 -0
- package/dist/db/migrations/004_research.js +29 -0
- package/dist/db/migrations/004_research.js.map +1 -0
- package/dist/db/migrations/index.d.ts +2 -0
- package/dist/db/migrations/index.js +45 -0
- package/dist/db/migrations/index.js.map +1 -0
- package/dist/db/repositories/calibration.repository.d.ts +25 -0
- package/dist/db/repositories/calibration.repository.js +66 -0
- package/dist/db/repositories/calibration.repository.js.map +1 -0
- package/dist/db/repositories/chain.repository.d.ts +28 -0
- package/dist/db/repositories/chain.repository.js +52 -0
- package/dist/db/repositories/chain.repository.js.map +1 -0
- package/dist/db/repositories/graph.repository.d.ts +33 -0
- package/dist/db/repositories/graph.repository.js +73 -0
- package/dist/db/repositories/graph.repository.js.map +1 -0
- package/dist/db/repositories/insight.repository.d.ts +30 -0
- package/dist/db/repositories/insight.repository.js +60 -0
- package/dist/db/repositories/insight.repository.js.map +1 -0
- package/dist/db/repositories/rule.repository.d.ts +35 -0
- package/dist/db/repositories/rule.repository.js +48 -0
- package/dist/db/repositories/rule.repository.js.map +1 -0
- package/dist/db/repositories/signal.repository.d.ts +17 -0
- package/dist/db/repositories/signal.repository.js +35 -0
- package/dist/db/repositories/signal.repository.js.map +1 -0
- package/dist/db/repositories/synapse.repository.d.ts +25 -0
- package/dist/db/repositories/synapse.repository.js +50 -0
- package/dist/db/repositories/synapse.repository.js.map +1 -0
- package/dist/db/repositories/trade.repository.d.ts +36 -0
- package/dist/db/repositories/trade.repository.js +64 -0
- package/dist/db/repositories/trade.repository.js.map +1 -0
- package/dist/graph/weighted-graph.d.ts +58 -0
- package/dist/graph/weighted-graph.js +149 -0
- package/dist/graph/weighted-graph.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/ipc/client.d.ts +16 -0
- package/dist/ipc/client.js +95 -0
- package/dist/ipc/client.js.map +1 -0
- package/dist/ipc/protocol.d.ts +8 -0
- package/dist/ipc/protocol.js +29 -0
- package/dist/ipc/protocol.js.map +1 -0
- package/dist/ipc/router.d.ts +32 -0
- package/dist/ipc/router.js +70 -0
- package/dist/ipc/router.js.map +1 -0
- package/dist/ipc/server.d.ts +18 -0
- package/dist/ipc/server.js +142 -0
- package/dist/ipc/server.js.map +1 -0
- package/dist/learning/calibrator.d.ts +6 -0
- package/dist/learning/calibrator.js +57 -0
- package/dist/learning/calibrator.js.map +1 -0
- package/dist/learning/chain-detector.d.ts +17 -0
- package/dist/learning/chain-detector.js +29 -0
- package/dist/learning/chain-detector.js.map +1 -0
- package/dist/learning/learning-engine.d.ts +31 -0
- package/dist/learning/learning-engine.js +85 -0
- package/dist/learning/learning-engine.js.map +1 -0
- package/dist/learning/pattern-extractor.d.ts +14 -0
- package/dist/learning/pattern-extractor.js +40 -0
- package/dist/learning/pattern-extractor.js.map +1 -0
- package/dist/mcp/http-server.d.ts +14 -0
- package/dist/mcp/http-server.js +117 -0
- package/dist/mcp/http-server.js.map +1 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +67 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +7 -0
- package/dist/mcp/tools.js +158 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/research/research-engine.d.ts +21 -0
- package/dist/research/research-engine.js +204 -0
- package/dist/research/research-engine.js.map +1 -0
- package/dist/services/analytics.service.d.ts +16 -0
- package/dist/services/analytics.service.js +64 -0
- package/dist/services/analytics.service.js.map +1 -0
- package/dist/services/insight.service.d.ts +11 -0
- package/dist/services/insight.service.js +25 -0
- package/dist/services/insight.service.js.map +1 -0
- package/dist/services/signal.service.d.ts +22 -0
- package/dist/services/signal.service.js +96 -0
- package/dist/services/signal.service.js.map +1 -0
- package/dist/services/strategy.service.d.ts +29 -0
- package/dist/services/strategy.service.js +115 -0
- package/dist/services/strategy.service.js.map +1 -0
- package/dist/services/synapse.service.d.ts +20 -0
- package/dist/services/synapse.service.js +48 -0
- package/dist/services/synapse.service.js.map +1 -0
- package/dist/services/trade.service.d.ts +37 -0
- package/dist/services/trade.service.js +114 -0
- package/dist/services/trade.service.js.map +1 -0
- package/dist/signals/fingerprint.d.ts +29 -0
- package/dist/signals/fingerprint.js +98 -0
- package/dist/signals/fingerprint.js.map +1 -0
- package/dist/signals/wilson-score.d.ts +10 -0
- package/dist/signals/wilson-score.js +19 -0
- package/dist/signals/wilson-score.js.map +1 -0
- package/dist/synapses/decay.d.ts +6 -0
- package/dist/synapses/decay.js +17 -0
- package/dist/synapses/decay.js.map +1 -0
- package/dist/synapses/hebbian.d.ts +11 -0
- package/dist/synapses/hebbian.js +21 -0
- package/dist/synapses/hebbian.js.map +1 -0
- package/dist/synapses/synapse-manager.d.ts +22 -0
- package/dist/synapses/synapse-manager.js +99 -0
- package/dist/synapses/synapse-manager.js.map +1 -0
- package/dist/trading-core.d.ts +17 -0
- package/dist/trading-core.js +235 -0
- package/dist/trading-core.js.map +1 -0
- package/dist/types/config.types.d.ts +52 -0
- package/dist/types/config.types.js +2 -0
- package/dist/types/config.types.js.map +1 -0
- package/dist/types/ipc.types.d.ts +11 -0
- package/dist/types/ipc.types.js +2 -0
- package/dist/types/ipc.types.js.map +1 -0
- package/dist/utils/events.d.ts +48 -0
- package/dist/utils/events.js +23 -0
- package/dist/utils/events.js.map +1 -0
- package/dist/utils/hash.d.ts +1 -0
- package/dist/utils/hash.js +5 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/logger.d.ts +8 -0
- package/dist/utils/logger.js +39 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +3 -0
- package/dist/utils/paths.js +18 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +47 -0
- package/src/api/server.ts +160 -0
- package/src/cli/colors.ts +80 -0
- package/src/cli/commands/config.ts +76 -0
- package/src/cli/commands/doctor.ts +62 -0
- package/src/cli/commands/export.ts +24 -0
- package/src/cli/commands/import.ts +44 -0
- package/src/cli/commands/insights.ts +30 -0
- package/src/cli/commands/network.ts +43 -0
- package/src/cli/commands/query.ts +28 -0
- package/src/cli/commands/rules.ts +27 -0
- package/src/cli/commands/start.ts +93 -0
- package/src/cli/commands/status.ts +64 -0
- package/src/cli/commands/stop.ts +33 -0
- package/src/cli/ipc-helper.ts +22 -0
- package/src/config.ts +103 -0
- package/src/db/connection.ts +22 -0
- package/src/db/migrations/001_core.ts +43 -0
- package/src/db/migrations/002_synapses.ts +44 -0
- package/src/db/migrations/003_learning.ts +49 -0
- package/src/db/migrations/004_research.ts +30 -0
- package/src/db/migrations/index.ts +60 -0
- package/src/db/repositories/calibration.repository.ts +86 -0
- package/src/db/repositories/chain.repository.ts +70 -0
- package/src/db/repositories/graph.repository.ts +103 -0
- package/src/db/repositories/insight.repository.ts +80 -0
- package/src/db/repositories/rule.repository.ts +67 -0
- package/src/db/repositories/signal.repository.ts +48 -0
- package/src/db/repositories/synapse.repository.ts +71 -0
- package/src/db/repositories/trade.repository.ts +97 -0
- package/src/graph/weighted-graph.ts +194 -0
- package/src/index.ts +55 -0
- package/src/ipc/client.ts +112 -0
- package/src/ipc/protocol.ts +35 -0
- package/src/ipc/router.ts +113 -0
- package/src/ipc/server.ts +150 -0
- package/src/learning/calibrator.ts +57 -0
- package/src/learning/chain-detector.ts +43 -0
- package/src/learning/learning-engine.ts +94 -0
- package/src/learning/pattern-extractor.ts +53 -0
- package/src/mcp/http-server.ts +118 -0
- package/src/mcp/server.ts +72 -0
- package/src/mcp/tools.ts +256 -0
- package/src/research/research-engine.ts +223 -0
- package/src/services/analytics.service.ts +68 -0
- package/src/services/insight.service.ts +29 -0
- package/src/services/signal.service.ts +109 -0
- package/src/services/strategy.service.ts +130 -0
- package/src/services/synapse.service.ts +58 -0
- package/src/services/trade.service.ts +139 -0
- package/src/signals/fingerprint.ts +93 -0
- package/src/signals/wilson-score.ts +17 -0
- package/src/synapses/decay.ts +19 -0
- package/src/synapses/hebbian.ts +23 -0
- package/src/synapses/synapse-manager.ts +112 -0
- package/src/trading-core.ts +285 -0
- package/src/types/config.types.ts +60 -0
- package/src/types/ipc.types.ts +8 -0
- package/src/utils/events.ts +42 -0
- package/src/utils/hash.ts +5 -0
- package/src/utils/logger.ts +48 -0
- package/src/utils/paths.ts +19 -0
- 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
|
+
}
|