@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
package/README.md
ADDED
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
# Trading Brain
|
|
2
|
+
|
|
3
|
+
**Adaptive Trading Intelligence & Signal Learning System for Claude Code**
|
|
4
|
+
|
|
5
|
+
Trading Brain is an MCP server that gives Claude Code a persistent trading memory. It learns from every trade outcome — strengthening connections between signals, strategies, and results through a Hebbian synapse network. Over time, it develops confidence in signal combinations, adapts calibration parameters, and surfaces research insights about your trading patterns.
|
|
6
|
+
|
|
7
|
+
## Why Trading Brain?
|
|
8
|
+
|
|
9
|
+
Without Trading Brain, every trading decision starts from zero. With Trading Brain:
|
|
10
|
+
|
|
11
|
+
- **Signals are weighted by experience** — Brain tracks which signal combinations actually lead to winning trades, not just theory
|
|
12
|
+
- **Confidence is statistical** — Wilson Score intervals provide conservative confidence bounds, not just raw win rates
|
|
13
|
+
- **DCA multipliers adapt** — Brain-recommended position sizes adjust based on regime awareness and historical performance
|
|
14
|
+
- **Grid parameters tune themselves** — Volatility-aware grid spacing multipliers based on actual outcomes
|
|
15
|
+
- **Patterns emerge automatically** — The learning engine extracts rules from signal fingerprint groupings
|
|
16
|
+
- **Streaks are detected** — Chain detection identifies winning and losing streaks per pair
|
|
17
|
+
- **Knowledge compounds** — Every trade outcome makes Brain smarter through Hebbian learning
|
|
18
|
+
- **Research runs continuously** — Trend analysis, gap detection, synergy mapping, and regime shift detection
|
|
19
|
+
|
|
20
|
+
## Features
|
|
21
|
+
|
|
22
|
+
### Core Intelligence
|
|
23
|
+
- **Trade Outcome Memory** — Record and query trade outcomes with full signal context
|
|
24
|
+
- **Signal Fingerprinting** — RSI, MACD, Trend, and Volatility classification into discrete categories
|
|
25
|
+
- **Wilson Score Confidence** — Statistical confidence intervals with adaptive z-scores based on data volume
|
|
26
|
+
- **Hebbian Synapse Network** — Weighted graph connecting signals, combos, outcomes, pairs, and regimes
|
|
27
|
+
- **Spreading Activation** — Explore related knowledge by activating nodes in the synapse network
|
|
28
|
+
- **Adaptive Calibration** — Learning rate, Wilson z-score, and decay half-life auto-calibrate across 4 stages
|
|
29
|
+
|
|
30
|
+
### Learning Engine
|
|
31
|
+
- **Pattern Extraction** — Fingerprint grouping with similarity threshold → rules when confidence exceeds gate
|
|
32
|
+
- **Chain Detection** — Identifies 3+ consecutive same-result trades on the same pair
|
|
33
|
+
- **Temporal Decay** — Exponential half-life decay keeps recent trades more relevant
|
|
34
|
+
- **Recalibration** — Auto-recalibrates every 25 trades based on data volume and synapse density
|
|
35
|
+
|
|
36
|
+
### Research Engine
|
|
37
|
+
- **Trend Detection** — Identifies pairs with consistently improving or declining win rates
|
|
38
|
+
- **Gap Detection** — Finds signal combinations with few data points that need more testing
|
|
39
|
+
- **Synergy Detection** — Discovers which signal pairs frequently co-occur in winning trades
|
|
40
|
+
- **Performance Analysis** — Ranks pairs and strategies by statistical confidence
|
|
41
|
+
- **Regime Shift Detection** — Alerts when a pair's recent performance deviates from its baseline
|
|
42
|
+
|
|
43
|
+
### Strategy Recommendations
|
|
44
|
+
- **DCA Multiplier** — Brain-recommended multiplier (0.3x–2.5x) based on regime and RSI context
|
|
45
|
+
- **Grid Parameters** — Volatility-aware grid spacing with historical performance adjustment
|
|
46
|
+
|
|
47
|
+
### Universal Access
|
|
48
|
+
- **MCP Server** — Stdio transport for Claude Code integration
|
|
49
|
+
- **MCP HTTP/SSE** — Standard MCP protocol over HTTP for Cursor, Windsurf, Cline, Continue
|
|
50
|
+
- **REST API** — Full HTTP API on port 7779 with RPC endpoint
|
|
51
|
+
|
|
52
|
+
## Quick Start
|
|
53
|
+
|
|
54
|
+
### Installation
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npm install -g @timmeck/trading-brain
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Or from source:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
git clone https://github.com/timmeck/trading-brain.git
|
|
64
|
+
cd trading-brain
|
|
65
|
+
npm install
|
|
66
|
+
npm run build
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Setup with Claude Code
|
|
70
|
+
|
|
71
|
+
Add Trading Brain's MCP server to your Claude Code configuration (`~/.claude/settings.json`):
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
{
|
|
75
|
+
"mcpServers": {
|
|
76
|
+
"trading-brain": {
|
|
77
|
+
"command": "trading",
|
|
78
|
+
"args": ["mcp-server"]
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Setup with Cursor / Windsurf / Cline / Continue
|
|
85
|
+
|
|
86
|
+
Trading Brain supports MCP over HTTP with SSE transport:
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"trading-brain": {
|
|
91
|
+
"url": "http://localhost:7780/sse"
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Make sure the daemon is running (`trading start`).
|
|
97
|
+
|
|
98
|
+
### Start the Daemon
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
trading start
|
|
102
|
+
trading status
|
|
103
|
+
trading doctor # verify everything is configured correctly
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
The daemon runs background tasks: learning cycles, research analysis, synapse decay, and recalibration.
|
|
107
|
+
|
|
108
|
+
## Architecture
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
+------------------+ +------------------+ +------------------+
|
|
112
|
+
| Claude Code | | Cursor/Windsurf | | Browser/CI/CD |
|
|
113
|
+
| (MCP stdio) | | (MCP HTTP/SSE) | | (REST API) |
|
|
114
|
+
+--------+---------+ +--------+---------+ +--------+---------+
|
|
115
|
+
| | |
|
|
116
|
+
v v v
|
|
117
|
+
+--------+---------+ +--------+---------+ +--------+---------+
|
|
118
|
+
| MCP Server | | MCP HTTP/SSE | | REST API |
|
|
119
|
+
| (stdio) | | (port 7780) | | (port 7779) |
|
|
120
|
+
+--------+---------+ +--------+---------+ +--------+---------+
|
|
121
|
+
| | |
|
|
122
|
+
+----------+-------------+------------------------+
|
|
123
|
+
|
|
|
124
|
+
v
|
|
125
|
+
+----------+------------+
|
|
126
|
+
| TradingCore |
|
|
127
|
+
| (Daemon / Services) |
|
|
128
|
+
+----------+------------+
|
|
129
|
+
|
|
|
130
|
+
+-------+-------+--------+--------+
|
|
131
|
+
| | | | |
|
|
132
|
+
v v v v v
|
|
133
|
+
+---+--+ +--+---+ +-+-----+ +-+----+ +-+--------+
|
|
134
|
+
|Trade | |Signal| |Synapse | |Strat | |Research |
|
|
135
|
+
|Memory| |Brain | |Network | |Brain | |Engine |
|
|
136
|
+
+---+--+ +--+---+ +-+-----+ +-+----+ +-+--------+
|
|
137
|
+
| | | | |
|
|
138
|
+
v v v v v
|
|
139
|
+
+---+--+ +--+---+ +-+-----+ +-+----+ +-+--------+
|
|
140
|
+
|Learn | |Wilson| |Hebbian | |DCA/ | |Trend/Gap |
|
|
141
|
+
|Engine| |Score | |Learn | |Grid | |Synergy |
|
|
142
|
+
+------+ +------+ +-------+ +------+ +----------+
|
|
143
|
+
|
|
|
144
|
+
v
|
|
145
|
+
+----------+-----------+
|
|
146
|
+
| SQLite (DB) |
|
|
147
|
+
| better-sqlite3 |
|
|
148
|
+
+----------------------+
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Core Components
|
|
152
|
+
|
|
153
|
+
| Component | Purpose |
|
|
154
|
+
|-----------|---------|
|
|
155
|
+
| **Trade Memory** | Stores trade outcomes with signal fingerprints, pairs, bot types, and results |
|
|
156
|
+
| **Signal Brain** | Computes weighted signal strengths via direct synapses + spreading activation + similar combo boost |
|
|
157
|
+
| **Synapse Network** | Weighted graph connecting signals, combos, outcomes, pairs. Hebbian: "signals that win together wire together" |
|
|
158
|
+
| **Strategy Brain** | DCA multiplier and grid parameter recommendations based on regime and volatility awareness |
|
|
159
|
+
| **Learning Engine** | Pattern extraction, chain detection, temporal decay, adaptive recalibration |
|
|
160
|
+
| **Research Engine** | Automated analysis: trends, gaps, synergies, performance rankings, regime shifts |
|
|
161
|
+
| **Calibrator** | 4-stage adaptive calibration: learningRate, wilsonZ, decayHalfLife based on trade count |
|
|
162
|
+
| **REST API** | HTTP API exposing all Trading Brain methods as RPC endpoints |
|
|
163
|
+
| **MCP HTTP Server** | SSE transport enabling non-Claude MCP clients |
|
|
164
|
+
|
|
165
|
+
## CLI Commands
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
trading start Start the Trading Brain daemon
|
|
169
|
+
trading stop Stop the daemon
|
|
170
|
+
trading status Show stats (trades, rules, chains, insights, synapses)
|
|
171
|
+
trading doctor Health check: daemon, DB, IPC, ports
|
|
172
|
+
trading query <text> Search trades by fingerprint, pair, or bot type
|
|
173
|
+
trading insights Show research insights with severity
|
|
174
|
+
trading rules Show learned rules with confidence and win rate
|
|
175
|
+
trading network Explore the synapse network
|
|
176
|
+
trading config View and manage configuration
|
|
177
|
+
trading export Export all data as JSON
|
|
178
|
+
trading import <file> Import trades from JSON array
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## MCP Tools
|
|
182
|
+
|
|
183
|
+
These tools are available to Claude Code (and other MCP clients) when Trading Brain is configured:
|
|
184
|
+
|
|
185
|
+
| Tool | Description |
|
|
186
|
+
|------|-------------|
|
|
187
|
+
| `trading_record_outcome` | Record a trade outcome (main entry point for learning loop) |
|
|
188
|
+
| `trading_signal_weights` | Get Brain-weighted signal strengths for a signal combination |
|
|
189
|
+
| `trading_signal_confidence` | Wilson Score confidence interval for a signal pattern |
|
|
190
|
+
| `trading_dca_multiplier` | Brain-recommended DCA position size multiplier |
|
|
191
|
+
| `trading_grid_params` | Brain-recommended grid trading parameters |
|
|
192
|
+
| `trading_explore` | Spreading Activation network exploration from a query node |
|
|
193
|
+
| `trading_connections` | Find the shortest path between two nodes in the graph |
|
|
194
|
+
| `trading_rules` | Get all learned trading rules |
|
|
195
|
+
| `trading_insights` | Get research insights (trends, gaps, synergies) |
|
|
196
|
+
| `trading_chains` | Get detected winning/losing streaks |
|
|
197
|
+
| `trading_query` | Search trades by fingerprint, pair, or bot type |
|
|
198
|
+
| `trading_status` | Current Trading Brain stats |
|
|
199
|
+
| `trading_calibration` | Current adaptive calibration parameters |
|
|
200
|
+
| `trading_learn` | Manually trigger a learning cycle |
|
|
201
|
+
| `trading_reset` | Reset all data (use with caution) |
|
|
202
|
+
|
|
203
|
+
## REST API
|
|
204
|
+
|
|
205
|
+
Trading Brain includes a REST API on port 7779 (default).
|
|
206
|
+
|
|
207
|
+
### Generic RPC Endpoint
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
# Call any Trading Brain method
|
|
211
|
+
curl -X POST http://localhost:7779/api/v1/rpc \
|
|
212
|
+
-H "Content-Type: application/json" \
|
|
213
|
+
-d '{"method": "analytics.summary", "params": {}}'
|
|
214
|
+
|
|
215
|
+
# Batch multiple calls
|
|
216
|
+
curl -X POST http://localhost:7779/api/v1/rpc \
|
|
217
|
+
-H "Content-Type: application/json" \
|
|
218
|
+
-d '[
|
|
219
|
+
{"id": 1, "method": "analytics.summary", "params": {}},
|
|
220
|
+
{"id": 2, "method": "synapse.stats", "params": {}}
|
|
221
|
+
]'
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Authentication
|
|
225
|
+
|
|
226
|
+
Set an API key via environment variable:
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
TRADING_BRAIN_API_KEY=your-secret-key trading start
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
Then include it in requests:
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
curl -H "X-API-Key: your-secret-key" http://localhost:7779/api/v1/rpc \
|
|
236
|
+
-d '{"method": "analytics.summary", "params": {}}'
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Configuration
|
|
240
|
+
|
|
241
|
+
Trading Brain is configured via `config.json` in the data directory or environment variables:
|
|
242
|
+
|
|
243
|
+
| Env Variable | Default | Description |
|
|
244
|
+
|---|---|---|
|
|
245
|
+
| `TRADING_BRAIN_DATA_DIR` | `~/.trading-brain` | Data directory |
|
|
246
|
+
| `TRADING_BRAIN_LOG_LEVEL` | `info` | Log level |
|
|
247
|
+
| `TRADING_BRAIN_API_PORT` | `7779` | REST API port |
|
|
248
|
+
| `TRADING_BRAIN_API_KEY` | — | API authentication key |
|
|
249
|
+
| `TRADING_BRAIN_MCP_HTTP_PORT` | `7780` | MCP HTTP/SSE port |
|
|
250
|
+
| `TRADING_BRAIN_API_ENABLED` | `true` | Enable REST API |
|
|
251
|
+
| `TRADING_BRAIN_MCP_HTTP_ENABLED` | `true` | Enable MCP HTTP |
|
|
252
|
+
|
|
253
|
+
## How It Learns
|
|
254
|
+
|
|
255
|
+
1. **Trade Outcome Recorded** — A bot completes a trade and reports the result via `trading_record_outcome`
|
|
256
|
+
2. **Signal Fingerprinted** — RSI, MACD, Trend, and Volatility are classified into discrete categories
|
|
257
|
+
3. **Synapses Form** — Hebbian connections link signal → combo → outcome → pair. Winners strengthen, losers weaken
|
|
258
|
+
4. **Graph Updated** — Nodes and edges are created/strengthened in the weighted graph
|
|
259
|
+
5. **Chain Checked** — If 3+ consecutive same-result trades on a pair, a chain is recorded
|
|
260
|
+
6. **Confidence Computed** — Wilson Score provides statistical lower bound on true win rate
|
|
261
|
+
7. **Patterns Extracted** — Similar fingerprints are grouped; rules generated when confidence exceeds threshold
|
|
262
|
+
8. **Calibration Adapts** — Every 25 trades, learning rate, Wilson z, and decay half-life recalibrate
|
|
263
|
+
9. **Research Runs** — Background analysis finds trends, gaps, synergies, and regime shifts
|
|
264
|
+
10. **Next Trade** — Signal weights, DCA multiplier, and grid params incorporate all learned knowledge
|
|
265
|
+
|
|
266
|
+
## Algorithms
|
|
267
|
+
|
|
268
|
+
### Wilson Score Confidence
|
|
269
|
+
Conservative statistical confidence interval for win rates. Adaptive z-score: starts at 1.0 (few trades) → reaches 1.96 (500+ trades).
|
|
270
|
+
|
|
271
|
+
### Hebbian Learning
|
|
272
|
+
"Signals that win together wire together." Asymmetric updates:
|
|
273
|
+
- **Strengthen** (win): `weight += (1 - weight) * learningRate` (asymptotic approach to 1.0)
|
|
274
|
+
- **Weaken** (loss): `weight *= penalty` (multiplicative decay)
|
|
275
|
+
|
|
276
|
+
### Spreading Activation
|
|
277
|
+
BFS-based energy propagation through the weighted graph. Decay factor 0.6, threshold 0.05, max depth 4. Used for signal weight bonuses and network exploration.
|
|
278
|
+
|
|
279
|
+
### Adaptive Calibration
|
|
280
|
+
4 stages based on trade count:
|
|
281
|
+
| Stage | Trades | Learning Rate | Wilson Z | Decay Half-Life |
|
|
282
|
+
|-------|--------|--------------|----------|-----------------|
|
|
283
|
+
| 1 | <20 | 0.3 | 1.0 | 60 days |
|
|
284
|
+
| 2 | 20–100 | 0.15 | 1.44 | 45 days |
|
|
285
|
+
| 3 | 100–500 | 0.08 | 1.65 | 30 days |
|
|
286
|
+
| 4 | >500 | 0.05 | 1.96 | 21 days |
|
|
287
|
+
|
|
288
|
+
### Signal Fingerprinting
|
|
289
|
+
Each signal dimension is classified:
|
|
290
|
+
- **RSI**: oversold (<30), neutral (30–70), overbought (>70)
|
|
291
|
+
- **MACD**: strong_bull (>0.5), bull (>0), bear (<0), strong_bear (<-0.5)
|
|
292
|
+
- **Trend**: strong_up (>0.5), up (>0), down (<0), strong_down (<-0.5)
|
|
293
|
+
- **Volatility**: low (<0.3), medium (0.3–0.7), high (>0.7)
|
|
294
|
+
|
|
295
|
+
## Tech Stack
|
|
296
|
+
|
|
297
|
+
- **TypeScript** — Full type safety, ES2022 target, ESM modules
|
|
298
|
+
- **better-sqlite3** — Fast, embedded, synchronous database with WAL mode
|
|
299
|
+
- **MCP SDK** — Model Context Protocol integration (stdio + HTTP/SSE transports)
|
|
300
|
+
- **Commander** — CLI framework
|
|
301
|
+
- **Chalk** — Colored terminal output
|
|
302
|
+
- **Winston** — Structured logging
|
|
303
|
+
|
|
304
|
+
## License
|
|
305
|
+
|
|
306
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { IpcRouter } from '../ipc/router.js';
|
|
2
|
+
export interface ApiServerOptions {
|
|
3
|
+
port: number;
|
|
4
|
+
router: IpcRouter;
|
|
5
|
+
apiKey?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class ApiServer {
|
|
8
|
+
private options;
|
|
9
|
+
private server;
|
|
10
|
+
private logger;
|
|
11
|
+
private sseClients;
|
|
12
|
+
private statsTimer;
|
|
13
|
+
constructor(options: ApiServerOptions);
|
|
14
|
+
start(): void;
|
|
15
|
+
stop(): void;
|
|
16
|
+
private handleRequest;
|
|
17
|
+
private json;
|
|
18
|
+
private readBody;
|
|
19
|
+
private setupSSE;
|
|
20
|
+
private broadcastSSE;
|
|
21
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import { getLogger } from '../utils/logger.js';
|
|
3
|
+
import { getEventBus } from '../utils/events.js';
|
|
4
|
+
export class ApiServer {
|
|
5
|
+
options;
|
|
6
|
+
server = null;
|
|
7
|
+
logger = getLogger();
|
|
8
|
+
sseClients = new Set();
|
|
9
|
+
statsTimer = null;
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.options = options;
|
|
12
|
+
}
|
|
13
|
+
start() {
|
|
14
|
+
const { port, apiKey } = this.options;
|
|
15
|
+
this.server = http.createServer((req, res) => {
|
|
16
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
17
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
|
18
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-API-Key');
|
|
19
|
+
if (req.method === 'OPTIONS') {
|
|
20
|
+
res.writeHead(204);
|
|
21
|
+
res.end();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (apiKey) {
|
|
25
|
+
const provided = req.headers['x-api-key'] ?? req.headers.authorization?.replace('Bearer ', '');
|
|
26
|
+
if (provided !== apiKey) {
|
|
27
|
+
this.json(res, 401, { error: 'Unauthorized' });
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
this.handleRequest(req, res).catch((err) => {
|
|
32
|
+
this.logger.error('API error:', err);
|
|
33
|
+
this.json(res, 500, { error: err instanceof Error ? err.message : String(err) });
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
this.server.listen(port, () => {
|
|
37
|
+
this.logger.info(`REST API server started on http://localhost:${port}`);
|
|
38
|
+
});
|
|
39
|
+
this.setupSSE();
|
|
40
|
+
}
|
|
41
|
+
stop() {
|
|
42
|
+
if (this.statsTimer) {
|
|
43
|
+
clearInterval(this.statsTimer);
|
|
44
|
+
this.statsTimer = null;
|
|
45
|
+
}
|
|
46
|
+
for (const client of this.sseClients) {
|
|
47
|
+
try {
|
|
48
|
+
client.end();
|
|
49
|
+
}
|
|
50
|
+
catch { /* ignore */ }
|
|
51
|
+
}
|
|
52
|
+
this.sseClients.clear();
|
|
53
|
+
this.server?.close();
|
|
54
|
+
this.server = null;
|
|
55
|
+
this.logger.info('REST API server stopped');
|
|
56
|
+
}
|
|
57
|
+
async handleRequest(req, res) {
|
|
58
|
+
const url = new URL(req.url ?? '/', 'http://localhost');
|
|
59
|
+
const pathname = url.pathname;
|
|
60
|
+
const method = req.method ?? 'GET';
|
|
61
|
+
if (pathname === '/api/v1/health') {
|
|
62
|
+
this.json(res, 200, { status: 'ok', timestamp: new Date().toISOString() });
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (pathname === '/api/v1/events' && method === 'GET') {
|
|
66
|
+
res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' });
|
|
67
|
+
res.write('data: {"type":"connected"}\n\n');
|
|
68
|
+
this.sseClients.add(res);
|
|
69
|
+
req.on('close', () => this.sseClients.delete(res));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (pathname === '/api/v1/methods' && method === 'GET') {
|
|
73
|
+
const methods = this.options.router.listMethods();
|
|
74
|
+
this.json(res, 200, { methods, rpcEndpoint: '/api/v1/rpc' });
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (pathname === '/api/v1/rpc' && method === 'POST') {
|
|
78
|
+
const body = await this.readBody(req);
|
|
79
|
+
if (!body) {
|
|
80
|
+
this.json(res, 400, { error: 'Empty request body' });
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const parsed = JSON.parse(body);
|
|
84
|
+
if (Array.isArray(parsed)) {
|
|
85
|
+
const results = parsed.map((call) => {
|
|
86
|
+
try {
|
|
87
|
+
const result = this.options.router.handle(call.method, call.params ?? {});
|
|
88
|
+
return { id: call.id, result };
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
return { id: call.id, error: err instanceof Error ? err.message : String(err) };
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
this.json(res, 200, results);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (!parsed.method) {
|
|
98
|
+
this.json(res, 400, { error: 'Missing "method" field' });
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
const result = this.options.router.handle(parsed.method, parsed.params ?? {});
|
|
103
|
+
this.json(res, 200, { result });
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
this.json(res, 400, { error: err instanceof Error ? err.message : String(err) });
|
|
107
|
+
}
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
this.json(res, 404, { error: `No route for ${method} ${pathname}` });
|
|
111
|
+
}
|
|
112
|
+
json(res, status, data) {
|
|
113
|
+
res.writeHead(status, { 'Content-Type': 'application/json' });
|
|
114
|
+
res.end(JSON.stringify(data));
|
|
115
|
+
}
|
|
116
|
+
readBody(req) {
|
|
117
|
+
return new Promise((resolve, reject) => {
|
|
118
|
+
const chunks = [];
|
|
119
|
+
req.on('data', (chunk) => chunks.push(chunk));
|
|
120
|
+
req.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
|
|
121
|
+
req.on('error', reject);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
setupSSE() {
|
|
125
|
+
const bus = getEventBus();
|
|
126
|
+
const eventNames = [
|
|
127
|
+
'trade:recorded', 'synapse:updated', 'rule:learned',
|
|
128
|
+
'chain:detected', 'insight:created', 'calibration:updated',
|
|
129
|
+
];
|
|
130
|
+
for (const eventName of eventNames) {
|
|
131
|
+
bus.on(eventName, (data) => {
|
|
132
|
+
this.broadcastSSE({ type: 'event', event: eventName, data });
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
this.statsTimer = setInterval(() => {
|
|
136
|
+
if (this.sseClients.size > 0) {
|
|
137
|
+
try {
|
|
138
|
+
const summary = this.options.router.handle('analytics.summary', {});
|
|
139
|
+
this.broadcastSSE({ type: 'stats_update', stats: summary });
|
|
140
|
+
}
|
|
141
|
+
catch { /* ignore */ }
|
|
142
|
+
}
|
|
143
|
+
}, 30_000);
|
|
144
|
+
}
|
|
145
|
+
broadcastSSE(data) {
|
|
146
|
+
const msg = `data: ${JSON.stringify(data)}\n\n`;
|
|
147
|
+
for (const client of this.sseClients) {
|
|
148
|
+
try {
|
|
149
|
+
client.write(msg);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
this.sseClients.delete(client);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AASjD,MAAM,OAAO,SAAS;IAMA;IALZ,MAAM,GAAuB,IAAI,CAAC;IAClC,MAAM,GAAG,SAAS,EAAE,CAAC;IACrB,UAAU,GAA6B,IAAI,GAAG,EAAE,CAAC;IACjD,UAAU,GAA0C,IAAI,CAAC;IAEjE,YAAoB,OAAyB;QAAzB,YAAO,GAAP,OAAO,CAAkB;IAAG,CAAC;IAEjD,KAAK;QACH,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAEtC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC3C,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;YAClD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,iCAAiC,CAAC,CAAC;YACjF,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,wCAAwC,CAAC,CAAC;YAExF,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBAAC,GAAG,CAAC,GAAG,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YAExE,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,QAAQ,GAAI,GAAG,CAAC,OAAO,CAAC,WAAW,CAAY,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBAC3G,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;oBACxB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;oBAC/C,OAAO;gBACT,CAAC;YACH,CAAC;YAED,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+CAA+C,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAAC,CAAC;QAChF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAAC,IAAI,CAAC;gBAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAAC,CAAC;QACtF,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,GAAyB,EAAE,GAAwB;QAC7E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;QAEnC,IAAI,QAAQ,KAAK,gBAAgB,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,IAAI,QAAQ,KAAK,gBAAgB,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACtD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;YACrH,GAAG,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAC5C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACzB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,QAAQ,KAAK,iBAAiB,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACvD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,IAAI,QAAQ,KAAK,aAAa,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACpD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAE5E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEhC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAgE,EAAE,EAAE;oBAC9F,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;wBAC1E,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC;oBACjC,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClF,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;gBAC7B,OAAO;YACT,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAEzF,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC9E,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnF,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,gBAAgB,MAAM,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC;IACvE,CAAC;IAEO,IAAI,CAAC,GAAwB,EAAE,MAAc,EAAE,IAAa;QAClE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC9D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,CAAC;IAEO,QAAQ,CAAC,GAAyB;QACxC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACtD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACrE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ;QACd,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG;YACjB,gBAAgB,EAAE,iBAAiB,EAAE,cAAc;YACnD,gBAAgB,EAAE,iBAAiB,EAAE,qBAAqB;SAClD,CAAC;QAEX,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE;gBAClC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;oBACpE,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC9D,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,CAAC;IACb,CAAC;IAEO,YAAY,CAAC,IAAa;QAChC,MAAM,GAAG,GAAG,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;QAChD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC;gBAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAAC,CAAC;QACtE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export declare const c: {
|
|
2
|
+
blue: import("chalk").ChalkInstance;
|
|
3
|
+
purple: import("chalk").ChalkInstance;
|
|
4
|
+
cyan: import("chalk").ChalkInstance;
|
|
5
|
+
green: import("chalk").ChalkInstance;
|
|
6
|
+
red: import("chalk").ChalkInstance;
|
|
7
|
+
orange: import("chalk").ChalkInstance;
|
|
8
|
+
dim: import("chalk").ChalkInstance;
|
|
9
|
+
dimmer: import("chalk").ChalkInstance;
|
|
10
|
+
label: import("chalk").ChalkInstance;
|
|
11
|
+
value: import("chalk").ChalkInstance;
|
|
12
|
+
heading: import("chalk").ChalkInstance;
|
|
13
|
+
success: import("chalk").ChalkInstance;
|
|
14
|
+
error: import("chalk").ChalkInstance;
|
|
15
|
+
warn: import("chalk").ChalkInstance;
|
|
16
|
+
info: import("chalk").ChalkInstance;
|
|
17
|
+
};
|
|
18
|
+
export declare const icons: {
|
|
19
|
+
brain: string;
|
|
20
|
+
chart: string;
|
|
21
|
+
check: string;
|
|
22
|
+
cross: string;
|
|
23
|
+
arrow: string;
|
|
24
|
+
dot: string;
|
|
25
|
+
bar: string;
|
|
26
|
+
barLight: string;
|
|
27
|
+
dash: string;
|
|
28
|
+
pipe: string;
|
|
29
|
+
star: string;
|
|
30
|
+
bolt: string;
|
|
31
|
+
search: string;
|
|
32
|
+
gear: string;
|
|
33
|
+
synapse: string;
|
|
34
|
+
insight: string;
|
|
35
|
+
warn: string;
|
|
36
|
+
error: string;
|
|
37
|
+
ok: string;
|
|
38
|
+
clock: string;
|
|
39
|
+
trade: string;
|
|
40
|
+
rule: string;
|
|
41
|
+
chain: string;
|
|
42
|
+
};
|
|
43
|
+
export declare function header(title: string, icon?: string): string;
|
|
44
|
+
export declare function keyValue(key: string, value: string | number, indent?: number): string;
|
|
45
|
+
export declare function divider(width?: number): string;
|
|
46
|
+
export declare function table(rows: string[][], colWidths?: number[]): string;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export const c = {
|
|
3
|
+
blue: chalk.hex('#5b9cff'),
|
|
4
|
+
purple: chalk.hex('#b47aff'),
|
|
5
|
+
cyan: chalk.hex('#47e5ff'),
|
|
6
|
+
green: chalk.hex('#3dffa0'),
|
|
7
|
+
red: chalk.hex('#ff5577'),
|
|
8
|
+
orange: chalk.hex('#ffb347'),
|
|
9
|
+
dim: chalk.hex('#8b8fb0'),
|
|
10
|
+
dimmer: chalk.hex('#4a4d6e'),
|
|
11
|
+
label: chalk.hex('#8b8fb0'),
|
|
12
|
+
value: chalk.white.bold,
|
|
13
|
+
heading: chalk.hex('#5b9cff').bold,
|
|
14
|
+
success: chalk.hex('#3dffa0').bold,
|
|
15
|
+
error: chalk.hex('#ff5577').bold,
|
|
16
|
+
warn: chalk.hex('#ffb347').bold,
|
|
17
|
+
info: chalk.hex('#47e5ff'),
|
|
18
|
+
};
|
|
19
|
+
export const icons = {
|
|
20
|
+
brain: '🧠',
|
|
21
|
+
chart: '📊',
|
|
22
|
+
check: '✓',
|
|
23
|
+
cross: '✗',
|
|
24
|
+
arrow: '→',
|
|
25
|
+
dot: '●',
|
|
26
|
+
bar: '█',
|
|
27
|
+
barLight: '░',
|
|
28
|
+
dash: '─',
|
|
29
|
+
pipe: '│',
|
|
30
|
+
star: '★',
|
|
31
|
+
bolt: '⚡',
|
|
32
|
+
search: '🔍',
|
|
33
|
+
gear: '⚙',
|
|
34
|
+
synapse: '🔗',
|
|
35
|
+
insight: '💡',
|
|
36
|
+
warn: '⚠',
|
|
37
|
+
error: '❌',
|
|
38
|
+
ok: '✅',
|
|
39
|
+
clock: '⏱',
|
|
40
|
+
trade: '💹',
|
|
41
|
+
rule: '📋',
|
|
42
|
+
chain: '⛓',
|
|
43
|
+
};
|
|
44
|
+
export function header(title, icon) {
|
|
45
|
+
const prefix = icon ? `${icon} ` : '';
|
|
46
|
+
const line = c.dimmer(icons.dash.repeat(40));
|
|
47
|
+
return `\n${line}\n${prefix}${c.heading(title)}\n${line}`;
|
|
48
|
+
}
|
|
49
|
+
export function keyValue(key, value, indent = 2) {
|
|
50
|
+
const pad = ' '.repeat(indent);
|
|
51
|
+
return `${pad}${c.label(key + ':')} ${c.value(String(value))}`;
|
|
52
|
+
}
|
|
53
|
+
export function divider(width = 40) {
|
|
54
|
+
return c.dimmer(icons.dash.repeat(width));
|
|
55
|
+
}
|
|
56
|
+
function stripAnsi(str) {
|
|
57
|
+
// eslint-disable-next-line no-control-regex
|
|
58
|
+
return str.replace(/\x1b\[[0-9;]*m/g, '');
|
|
59
|
+
}
|
|
60
|
+
export function table(rows, colWidths) {
|
|
61
|
+
if (rows.length === 0)
|
|
62
|
+
return '';
|
|
63
|
+
const widths = colWidths ?? rows[0].map((_, i) => Math.max(...rows.map(r => stripAnsi(r[i] ?? '').length)));
|
|
64
|
+
return rows.map(row => row.map((cell, i) => {
|
|
65
|
+
const stripped = stripAnsi(cell);
|
|
66
|
+
const pad = Math.max(0, (widths[i] ?? stripped.length) - stripped.length);
|
|
67
|
+
return cell + ' '.repeat(pad);
|
|
68
|
+
}).join(' ')).join('\n');
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/cli/colors.ts"],"names":[],"mappings":"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"}
|