clodds 1.2.8 → 1.3.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/dist/skills/bundled/acp/SKILL.md +188 -0
- package/dist/skills/bundled/acp/index.d.ts +0 -3
- package/dist/skills/bundled/acp/index.js +1 -1
- package/dist/skills/bundled/acp/index.js.map +1 -1
- package/dist/skills/bundled/agentbets/SKILL.md +19 -0
- package/dist/skills/bundled/ai-strategy/SKILL.md +111 -0
- package/dist/skills/bundled/ai-strategy/index.js +1 -1
- package/dist/skills/bundled/ai-strategy/index.js.map +1 -1
- package/dist/skills/bundled/alerts/SKILL.md +87 -0
- package/dist/skills/bundled/analytics/SKILL.md +252 -0
- package/dist/skills/bundled/analytics/index.js +2 -2
- package/dist/skills/bundled/analytics/index.js.map +1 -1
- package/dist/skills/bundled/arbitrage/SKILL.md +287 -0
- package/dist/skills/bundled/auto-reply/SKILL.md +285 -0
- package/dist/skills/bundled/auto-reply/index.js +2 -2
- package/dist/skills/bundled/auto-reply/index.js.map +1 -1
- package/dist/skills/bundled/automation/SKILL.md +242 -0
- package/dist/skills/bundled/automation/index.js +2 -2
- package/dist/skills/bundled/automation/index.js.map +1 -1
- package/dist/skills/bundled/backtest/SKILL.md +225 -0
- package/dist/skills/bundled/bags/SKILL.md +131 -0
- package/dist/skills/bundled/bankr/SKILL.md +114 -0
- package/dist/skills/bundled/betfair/SKILL.md +113 -0
- package/dist/skills/bundled/binance-futures/SKILL.md +84 -0
- package/dist/skills/bundled/binance-futures/index.d.ts +0 -3
- package/dist/skills/bundled/binance-futures/index.js +1 -2
- package/dist/skills/bundled/binance-futures/index.js.map +1 -1
- package/dist/skills/bundled/botchan/SKILL.md +66 -0
- package/dist/skills/bundled/botchan/index.d.ts +0 -3
- package/dist/skills/bundled/botchan/index.js +0 -1
- package/dist/skills/bundled/botchan/index.js.map +1 -1
- package/dist/skills/bundled/bridge/SKILL.md +215 -0
- package/dist/skills/bundled/bybit-futures/SKILL.md +84 -0
- package/dist/skills/bundled/bybit-futures/index.d.ts +0 -3
- package/dist/skills/bundled/bybit-futures/index.js +0 -1
- package/dist/skills/bundled/bybit-futures/index.js.map +1 -1
- package/dist/skills/bundled/clanker/SKILL.md +125 -0
- package/dist/skills/bundled/clanker/index.d.ts +0 -3
- package/dist/skills/bundled/clanker/index.js +0 -1
- package/dist/skills/bundled/clanker/index.js.map +1 -1
- package/dist/skills/bundled/copy-trading/SKILL.md +285 -0
- package/dist/skills/bundled/copy-trading/index.js +2 -2
- package/dist/skills/bundled/copy-trading/index.js.map +1 -1
- package/dist/skills/bundled/copy-trading-solana/SKILL.md +66 -0
- package/dist/skills/bundled/credentials/SKILL.md +261 -0
- package/dist/skills/bundled/crypto-hft/SKILL.md +121 -0
- package/dist/skills/bundled/dca/SKILL.md +27 -0
- package/dist/skills/bundled/dex/SKILL.md +87 -0
- package/dist/skills/bundled/dex/index.d.ts +36 -0
- package/dist/skills/bundled/dex/index.js +537 -0
- package/dist/skills/bundled/dex/index.js.map +1 -0
- package/dist/skills/bundled/divergence/SKILL.md +83 -0
- package/dist/skills/bundled/doctor/SKILL.md +267 -0
- package/dist/skills/bundled/doctor/index.js +2 -8
- package/dist/skills/bundled/doctor/index.js.map +1 -1
- package/dist/skills/bundled/drift/SKILL.md +53 -0
- package/dist/skills/bundled/drift-sdk/SKILL.md +103 -0
- package/dist/skills/bundled/drift-sdk/index.d.ts +0 -3
- package/dist/skills/bundled/drift-sdk/index.js +0 -1
- package/dist/skills/bundled/drift-sdk/index.js.map +1 -1
- package/dist/skills/bundled/edge/SKILL.md +84 -0
- package/dist/skills/bundled/embeddings/SKILL.md +244 -0
- package/dist/skills/bundled/endaoment/SKILL.md +65 -0
- package/dist/skills/bundled/endaoment/index.d.ts +0 -3
- package/dist/skills/bundled/endaoment/index.js +0 -1
- package/dist/skills/bundled/endaoment/index.js.map +1 -1
- package/dist/skills/bundled/ens/SKILL.md +63 -0
- package/dist/skills/bundled/ens/index.d.ts +0 -3
- package/dist/skills/bundled/ens/index.js +0 -1
- package/dist/skills/bundled/ens/index.js.map +1 -1
- package/dist/skills/bundled/erc8004/SKILL.md +79 -0
- package/dist/skills/bundled/erc8004/index.d.ts +0 -3
- package/dist/skills/bundled/erc8004/index.js +0 -1
- package/dist/skills/bundled/erc8004/index.js.map +1 -1
- package/dist/skills/bundled/execution/SKILL.md +278 -0
- package/dist/skills/bundled/farcaster/SKILL.md +80 -0
- package/dist/skills/bundled/features/SKILL.md +20 -0
- package/dist/skills/bundled/feeds/SKILL.md +288 -0
- package/dist/skills/bundled/harden/SKILL.md +74 -0
- package/dist/skills/bundled/history/SKILL.md +257 -0
- package/dist/skills/bundled/hyperliquid/SKILL.md +200 -0
- package/dist/skills/bundled/hyperliquid/index.d.ts +0 -3
- package/dist/skills/bundled/hyperliquid/index.js +0 -1
- package/dist/skills/bundled/hyperliquid/index.js.map +1 -1
- package/dist/skills/bundled/identity/SKILL.md +228 -0
- package/dist/skills/bundled/identity/index.js +2 -2
- package/dist/skills/bundled/identity/index.js.map +1 -1
- package/dist/skills/bundled/integrations/SKILL.md +321 -0
- package/dist/skills/bundled/integrations/index.js +2 -2
- package/dist/skills/bundled/integrations/index.js.map +1 -1
- package/dist/skills/bundled/jupiter/SKILL.md +163 -0
- package/dist/skills/bundled/kamino/SKILL.md +69 -0
- package/dist/skills/bundled/ledger/SKILL.md +20 -0
- package/dist/skills/bundled/lighter/SKILL.md +83 -0
- package/dist/skills/bundled/lighter/index.d.ts +0 -3
- package/dist/skills/bundled/lighter/index.js +0 -1
- package/dist/skills/bundled/lighter/index.js.map +1 -1
- package/dist/skills/bundled/marginfi/SKILL.md +62 -0
- package/dist/skills/bundled/market-index/SKILL.md +242 -0
- package/dist/skills/bundled/market-index/index.js +1 -3
- package/dist/skills/bundled/market-index/index.js.map +1 -1
- package/dist/skills/bundled/markets/SKILL.md +49 -0
- package/dist/skills/bundled/mcp/SKILL.md +235 -0
- package/dist/skills/bundled/mcp/index.js +1 -3
- package/dist/skills/bundled/mcp/index.js.map +1 -1
- package/dist/skills/bundled/memory/SKILL.md +209 -0
- package/dist/skills/bundled/metaculus/SKILL.md +62 -0
- package/dist/skills/bundled/meteora/SKILL.md +28 -0
- package/dist/skills/bundled/meteora-dbc/SKILL.md +25 -0
- package/dist/skills/bundled/metrics/SKILL.md +338 -0
- package/dist/skills/bundled/mev/SKILL.md +239 -0
- package/dist/skills/bundled/mev/index.js +2 -2
- package/dist/skills/bundled/mev/index.js.map +1 -1
- package/dist/skills/bundled/mexc-futures/SKILL.md +86 -0
- package/dist/skills/bundled/mexc-futures/index.d.ts +0 -3
- package/dist/skills/bundled/mexc-futures/index.js +0 -1
- package/dist/skills/bundled/mexc-futures/index.js.map +1 -1
- package/dist/skills/bundled/mm/SKILL.md +142 -0
- package/dist/skills/bundled/monitoring/SKILL.md +249 -0
- package/dist/skills/bundled/news/SKILL.md +95 -0
- package/dist/skills/bundled/onchainkit/SKILL.md +83 -0
- package/dist/skills/bundled/opinion/SKILL.md +87 -0
- package/dist/skills/bundled/opportunity/SKILL.md +308 -0
- package/dist/skills/bundled/orca/SKILL.md +28 -0
- package/dist/skills/bundled/pairing/SKILL.md +275 -0
- package/dist/skills/bundled/pancakeswap/SKILL.md +93 -0
- package/dist/skills/bundled/pancakeswap/index.d.ts +0 -3
- package/dist/skills/bundled/pancakeswap/index.js +0 -1
- package/dist/skills/bundled/pancakeswap/index.js.map +1 -1
- package/dist/skills/bundled/percolator/SKILL.md +22 -0
- package/dist/skills/bundled/permissions/SKILL.md +269 -0
- package/dist/skills/bundled/permissions/index.js +2 -2
- package/dist/skills/bundled/permissions/index.js.map +1 -1
- package/dist/skills/bundled/plugins/SKILL.md +263 -0
- package/dist/skills/bundled/plugins/index.js +2 -2
- package/dist/skills/bundled/plugins/index.js.map +1 -1
- package/dist/skills/bundled/portfolio/SKILL.md +161 -0
- package/dist/skills/bundled/portfolio/index.js +1 -1
- package/dist/skills/bundled/portfolio/index.js.map +1 -1
- package/dist/skills/bundled/portfolio-sync/SKILL.md +466 -0
- package/dist/skills/bundled/positions/SKILL.md +262 -0
- package/dist/skills/bundled/predictfun/SKILL.md +109 -0
- package/dist/skills/bundled/predictfun/index.js +1 -1
- package/dist/skills/bundled/predictfun/index.js.map +1 -1
- package/dist/skills/bundled/predictit/SKILL.md +66 -0
- package/dist/skills/bundled/presence/SKILL.md +217 -0
- package/dist/skills/bundled/presence/index.js +2 -2
- package/dist/skills/bundled/presence/index.js.map +1 -1
- package/dist/skills/bundled/processes/SKILL.md +254 -0
- package/dist/skills/bundled/pump-swarm/SKILL.md +309 -0
- package/dist/skills/bundled/pumpfun/SKILL.md +145 -0
- package/dist/skills/bundled/pumpfun/index.d.ts +8 -1
- package/dist/skills/bundled/pumpfun/index.js +221 -11
- package/dist/skills/bundled/pumpfun/index.js.map +1 -1
- package/dist/skills/bundled/qmd/SKILL.md +129 -0
- package/dist/skills/bundled/qrcoin/SKILL.md +60 -0
- package/dist/skills/bundled/qrcoin/index.d.ts +0 -3
- package/dist/skills/bundled/qrcoin/index.js +0 -1
- package/dist/skills/bundled/qrcoin/index.js.map +1 -1
- package/dist/skills/bundled/raydium/SKILL.md +198 -0
- package/dist/skills/bundled/remote/SKILL.md +201 -0
- package/dist/skills/bundled/research/SKILL.md +83 -0
- package/dist/skills/bundled/research/index.js +2 -2
- package/dist/skills/bundled/research/index.js.map +1 -1
- package/dist/skills/bundled/risk/SKILL.md +323 -0
- package/dist/skills/bundled/router/SKILL.md +233 -0
- package/dist/skills/bundled/routing/SKILL.md +258 -0
- package/dist/skills/bundled/sandbox/SKILL.md +257 -0
- package/dist/skills/bundled/search-config/SKILL.md +257 -0
- package/dist/skills/bundled/search-config/index.js +2 -2
- package/dist/skills/bundled/search-config/index.js.map +1 -1
- package/dist/skills/bundled/sessions/SKILL.md +251 -0
- package/dist/skills/bundled/sessions/index.js +1 -1
- package/dist/skills/bundled/sessions/index.js.map +1 -1
- package/dist/skills/bundled/setup/SKILL.md +53 -0
- package/dist/skills/bundled/shield/SKILL.md +21 -0
- package/dist/skills/bundled/signals/SKILL.md +106 -0
- package/dist/skills/bundled/signals/index.d.ts +0 -3
- package/dist/skills/bundled/signals/index.js +3 -4
- package/dist/skills/bundled/signals/index.js.map +1 -1
- package/dist/skills/bundled/sizing/SKILL.md +238 -0
- package/dist/skills/bundled/slippage/SKILL.md +306 -0
- package/dist/skills/bundled/smarkets/SKILL.md +107 -0
- package/dist/skills/bundled/solend/SKILL.md +63 -0
- package/dist/skills/bundled/strategy/SKILL.md +266 -0
- package/dist/skills/bundled/streaming/SKILL.md +150 -0
- package/dist/skills/bundled/streaming/index.js +2 -2
- package/dist/skills/bundled/streaming/index.js.map +1 -1
- package/dist/skills/bundled/tailscale/SKILL.md +249 -0
- package/dist/skills/bundled/tailscale/index.js +2 -2
- package/dist/skills/bundled/tailscale/index.js.map +1 -1
- package/dist/skills/bundled/ticks/SKILL.md +61 -0
- package/dist/skills/bundled/token-security/SKILL.md +18 -0
- package/dist/skills/bundled/trading-evm/SKILL.md +329 -0
- package/dist/skills/bundled/trading-futures/SKILL.md +865 -0
- package/dist/skills/bundled/trading-kalshi/SKILL.md +629 -0
- package/dist/skills/bundled/trading-manifold/SKILL.md +387 -0
- package/dist/skills/bundled/trading-polymarket/SKILL.md +1080 -0
- package/dist/skills/bundled/trading-solana/SKILL.md +418 -0
- package/dist/skills/bundled/trading-system/SKILL.md +290 -0
- package/dist/skills/bundled/triggers/SKILL.md +433 -0
- package/dist/skills/bundled/tts/SKILL.md +220 -0
- package/dist/skills/bundled/tweet-ideas/SKILL.md +77 -0
- package/dist/skills/bundled/usage/SKILL.md +239 -0
- package/dist/skills/bundled/usage/index.js +2 -2
- package/dist/skills/bundled/usage/index.js.map +1 -1
- package/dist/skills/bundled/veil/SKILL.md +76 -0
- package/dist/skills/bundled/veil/index.d.ts +0 -3
- package/dist/skills/bundled/veil/index.js +0 -1
- package/dist/skills/bundled/veil/index.js.map +1 -1
- package/dist/skills/bundled/verify/SKILL.md +199 -0
- package/dist/skills/bundled/verify/index.d.ts +0 -3
- package/dist/skills/bundled/verify/index.js +0 -1
- package/dist/skills/bundled/verify/index.js.map +1 -1
- package/dist/skills/bundled/virtuals/SKILL.md +82 -0
- package/dist/skills/bundled/voice/SKILL.md +217 -0
- package/dist/skills/bundled/voice/index.js +2 -2
- package/dist/skills/bundled/voice/index.js.map +1 -1
- package/dist/skills/bundled/weather/SKILL.md +80 -0
- package/dist/skills/bundled/webhooks/SKILL.md +297 -0
- package/dist/skills/bundled/webhooks/index.js +2 -2
- package/dist/skills/bundled/webhooks/index.js.map +1 -1
- package/dist/skills/bundled/whale-tracking/SKILL.md +287 -0
- package/dist/skills/bundled/whale-tracking/index.js +2 -2
- package/dist/skills/bundled/whale-tracking/index.js.map +1 -1
- package/dist/skills/bundled/yoink/SKILL.md +54 -0
- package/dist/skills/bundled/yoink/index.d.ts +0 -3
- package/dist/skills/bundled/yoink/index.js +0 -1
- package/dist/skills/bundled/yoink/index.js.map +1 -1
- package/dist/skills/executor.js +5 -3
- package/dist/skills/executor.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: strategy
|
|
3
|
+
description: "Build and manage custom trading strategies with natural language"
|
|
4
|
+
emoji: "🎯"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Strategy - Complete API Reference
|
|
8
|
+
|
|
9
|
+
Create custom trading strategies using natural language or templates, then deploy to live trading.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Chat Commands
|
|
14
|
+
|
|
15
|
+
### Create Strategy
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
/strategy create "Buy when price drops 5% in 1 hour"
|
|
19
|
+
/strategy create momentum --lookback 14 --threshold 2%
|
|
20
|
+
/strategy from-template mean-reversion
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Manage Strategies
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
/strategies List all strategies
|
|
27
|
+
/strategy <name> View strategy details
|
|
28
|
+
/strategy edit <name> Modify strategy
|
|
29
|
+
/strategy delete <name> Remove strategy
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Activate/Deactivate
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
/strategy activate <name> Start running strategy
|
|
36
|
+
/strategy deactivate <name> Stop strategy
|
|
37
|
+
/strategy pause <name> Pause temporarily
|
|
38
|
+
/strategy resume <name> Resume paused strategy
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Test & Validate
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
/strategy test <name> --dry-run Test without real trades
|
|
45
|
+
/strategy backtest <name> Run backtest
|
|
46
|
+
/strategy validate <name> Check for errors
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## TypeScript API Reference
|
|
52
|
+
|
|
53
|
+
### Create Strategy Builder
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
import { createStrategyBuilder } from 'clodds/strategy';
|
|
57
|
+
|
|
58
|
+
const builder = createStrategyBuilder({
|
|
59
|
+
// Validation
|
|
60
|
+
requireDryRun: true,
|
|
61
|
+
validateParameters: true,
|
|
62
|
+
|
|
63
|
+
// Storage
|
|
64
|
+
storage: 'sqlite',
|
|
65
|
+
dbPath: './strategies.db',
|
|
66
|
+
});
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Natural Language Strategy
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
// Create from natural language
|
|
73
|
+
const strategy = await builder.fromNaturalLanguage({
|
|
74
|
+
description: `
|
|
75
|
+
Buy YES on any market when:
|
|
76
|
+
- Price drops more than 5% in the last hour
|
|
77
|
+
- Volume is above average
|
|
78
|
+
- Spread is less than 2%
|
|
79
|
+
|
|
80
|
+
Sell when:
|
|
81
|
+
- Price recovers 3% from entry
|
|
82
|
+
- Or after 24 hours (timeout)
|
|
83
|
+
|
|
84
|
+
Risk: Max 5% of portfolio per trade
|
|
85
|
+
`,
|
|
86
|
+
name: 'dip-buyer',
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
console.log(`Created: ${strategy.name}`);
|
|
90
|
+
console.log(`Conditions: ${strategy.conditions.length}`);
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Template-Based Strategy
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
// Momentum strategy
|
|
97
|
+
const momentum = await builder.fromTemplate('momentum', {
|
|
98
|
+
lookbackPeriod: 14,
|
|
99
|
+
entryThreshold: 0.02,
|
|
100
|
+
exitThreshold: 0.01,
|
|
101
|
+
stopLoss: 0.05,
|
|
102
|
+
takeProfit: 0.10,
|
|
103
|
+
maxPositionPct: 10,
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Mean reversion strategy
|
|
107
|
+
const meanReversion = await builder.fromTemplate('mean-reversion', {
|
|
108
|
+
lookbackPeriod: 20,
|
|
109
|
+
deviationThreshold: 2, // Standard deviations
|
|
110
|
+
exitOnMean: true,
|
|
111
|
+
stopLoss: 0.08,
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// Arbitrage strategy
|
|
115
|
+
const arbitrage = await builder.fromTemplate('arbitrage', {
|
|
116
|
+
minSpread: 0.02,
|
|
117
|
+
platforms: ['polymarket', 'kalshi'],
|
|
118
|
+
maxSlippage: 0.01,
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// Breakout strategy
|
|
122
|
+
const breakout = await builder.fromTemplate('breakout', {
|
|
123
|
+
rangePeriod: '7d',
|
|
124
|
+
breakoutThreshold: 0.05,
|
|
125
|
+
confirmationVolume: 1.5, // 1.5x average volume
|
|
126
|
+
});
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Custom Strategy Code
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
// Full custom strategy
|
|
133
|
+
const custom = await builder.create({
|
|
134
|
+
name: 'my-custom-strategy',
|
|
135
|
+
description: 'Buy low-priced markets with high volume',
|
|
136
|
+
|
|
137
|
+
// Entry conditions (all must be true)
|
|
138
|
+
entryConditions: [
|
|
139
|
+
{ type: 'price', operator: '<', value: 0.30 },
|
|
140
|
+
{ type: 'volume24h', operator: '>', value: 50000 },
|
|
141
|
+
{ type: 'spread', operator: '<', value: 0.02 },
|
|
142
|
+
],
|
|
143
|
+
|
|
144
|
+
// Exit conditions (any triggers exit)
|
|
145
|
+
exitConditions: [
|
|
146
|
+
{ type: 'profit', operator: '>=', value: 0.15 },
|
|
147
|
+
{ type: 'loss', operator: '>=', value: 0.10 },
|
|
148
|
+
{ type: 'holdTime', operator: '>=', value: '48h' },
|
|
149
|
+
],
|
|
150
|
+
|
|
151
|
+
// Risk management
|
|
152
|
+
risk: {
|
|
153
|
+
maxPositionPct: 5,
|
|
154
|
+
stopLoss: 0.10,
|
|
155
|
+
takeProfit: 0.20,
|
|
156
|
+
maxConcurrentPositions: 5,
|
|
157
|
+
},
|
|
158
|
+
|
|
159
|
+
// Execution
|
|
160
|
+
execution: {
|
|
161
|
+
orderType: 'limit',
|
|
162
|
+
limitBuffer: 0.005,
|
|
163
|
+
retries: 3,
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Validate Strategy
|
|
169
|
+
|
|
170
|
+
```typescript
|
|
171
|
+
const validation = await builder.validate(strategy);
|
|
172
|
+
|
|
173
|
+
if (validation.valid) {
|
|
174
|
+
console.log('✅ Strategy is valid');
|
|
175
|
+
} else {
|
|
176
|
+
console.log('❌ Validation errors:');
|
|
177
|
+
for (const error of validation.errors) {
|
|
178
|
+
console.log(` - ${error}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Warnings (not blocking)
|
|
183
|
+
for (const warning of validation.warnings) {
|
|
184
|
+
console.log(`⚠️ ${warning}`);
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Activate Strategy
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
// Start with dry-run first (required)
|
|
192
|
+
await builder.activate(strategy.name, {
|
|
193
|
+
dryRun: true,
|
|
194
|
+
notifyOnTrade: true,
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
// After validation, go live
|
|
198
|
+
await builder.activate(strategy.name, {
|
|
199
|
+
dryRun: false,
|
|
200
|
+
capital: 5000, // Allocate $5000
|
|
201
|
+
});
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Monitor Strategy
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
const status = await builder.getStatus(strategy.name);
|
|
208
|
+
|
|
209
|
+
console.log(`Status: ${status.status}`); // 'active' | 'paused' | 'stopped'
|
|
210
|
+
console.log(`Trades: ${status.trades}`);
|
|
211
|
+
console.log(`P&L: $${status.pnl}`);
|
|
212
|
+
console.log(`Win Rate: ${status.winRate}%`);
|
|
213
|
+
console.log(`Active Positions: ${status.activePositions}`);
|
|
214
|
+
console.log(`Last Signal: ${status.lastSignal}`);
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### List Strategies
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
const strategies = await builder.list();
|
|
221
|
+
|
|
222
|
+
for (const s of strategies) {
|
|
223
|
+
console.log(`${s.name}: ${s.status}`);
|
|
224
|
+
console.log(` Type: ${s.template || 'custom'}`);
|
|
225
|
+
console.log(` P&L: $${s.pnl}`);
|
|
226
|
+
console.log(` Trades: ${s.trades}`);
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## Built-in Templates
|
|
233
|
+
|
|
234
|
+
| Template | Description |
|
|
235
|
+
|----------|-------------|
|
|
236
|
+
| `momentum` | Follow price trends |
|
|
237
|
+
| `mean-reversion` | Buy dips, sell rallies |
|
|
238
|
+
| `arbitrage` | Cross-platform spreads |
|
|
239
|
+
| `breakout` | Range breakout entries |
|
|
240
|
+
| `pairs` | Correlated market pairs |
|
|
241
|
+
| `news-reactive` | React to news events |
|
|
242
|
+
| `volume-spike` | Trade on volume surges |
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## Condition Types
|
|
247
|
+
|
|
248
|
+
| Type | Description | Example |
|
|
249
|
+
|------|-------------|---------|
|
|
250
|
+
| `price` | Current price | `< 0.30` |
|
|
251
|
+
| `volume24h` | 24h volume | `> 50000` |
|
|
252
|
+
| `spread` | Bid-ask spread | `< 0.02` |
|
|
253
|
+
| `profit` | Unrealized profit | `>= 0.15` |
|
|
254
|
+
| `loss` | Unrealized loss | `>= 0.10` |
|
|
255
|
+
| `holdTime` | Time in position | `>= 48h` |
|
|
256
|
+
| `priceChange` | Price change % | `< -0.05` (5% drop) |
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## Best Practices
|
|
261
|
+
|
|
262
|
+
1. **Always dry-run first** — Test before real money
|
|
263
|
+
2. **Start small** — Low capital until proven
|
|
264
|
+
3. **Set stop-losses** — Protect against bad trades
|
|
265
|
+
4. **Monitor actively** — Check strategy performance
|
|
266
|
+
5. **Iterate** — Improve based on results
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: streaming
|
|
3
|
+
description: "Response streaming configuration and real-time output"
|
|
4
|
+
emoji: "📡"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Streaming - Complete API Reference
|
|
8
|
+
|
|
9
|
+
Configure response streaming, typing indicators, and real-time message delivery.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Chat Commands
|
|
14
|
+
|
|
15
|
+
### View Settings
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
/streaming Show current settings
|
|
19
|
+
/streaming status Streaming status
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Configure Streaming
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
/streaming enable Enable streaming
|
|
26
|
+
/streaming disable Disable streaming
|
|
27
|
+
/streaming chunk-size 50 Set chunk size (chars)
|
|
28
|
+
/streaming delay 100 Set delay between chunks (ms)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Typing Indicators
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
/streaming typing on Enable typing indicators
|
|
35
|
+
/streaming typing off Disable typing indicators
|
|
36
|
+
/streaming typing duration 3000 Typing duration (ms)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Platform Settings
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
/streaming platforms Show platform limits
|
|
43
|
+
/streaming platform telegram chunk 100 Set per-platform
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## TypeScript API Reference
|
|
49
|
+
|
|
50
|
+
### Create Streaming Config
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
import { createStreamingConfig } from 'clodds/streaming';
|
|
54
|
+
|
|
55
|
+
const streaming = createStreamingConfig({
|
|
56
|
+
// Enable streaming
|
|
57
|
+
enabled: true,
|
|
58
|
+
|
|
59
|
+
// Chunk settings
|
|
60
|
+
minChunkSize: 20, // Min chars per chunk
|
|
61
|
+
maxChunkSize: 200, // Max chars per chunk
|
|
62
|
+
chunkDelayMs: 50, // Delay between chunks
|
|
63
|
+
|
|
64
|
+
// Typing indicators
|
|
65
|
+
showTyping: true,
|
|
66
|
+
typingDurationMs: 3000,
|
|
67
|
+
|
|
68
|
+
// Platform-specific limits
|
|
69
|
+
platformLimits: {
|
|
70
|
+
telegram: { maxMessageLength: 4096, maxChunkSize: 100 },
|
|
71
|
+
discord: { maxMessageLength: 2000, maxChunkSize: 150 },
|
|
72
|
+
slack: { maxMessageLength: 40000, maxChunkSize: 200 },
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Enable/Disable
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
// Enable streaming
|
|
81
|
+
streaming.enable();
|
|
82
|
+
|
|
83
|
+
// Disable streaming
|
|
84
|
+
streaming.disable();
|
|
85
|
+
|
|
86
|
+
// Check status
|
|
87
|
+
const enabled = streaming.isEnabled();
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Configure Chunks
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
// Set chunk size
|
|
94
|
+
streaming.setChunkSize(100);
|
|
95
|
+
|
|
96
|
+
// Set delay
|
|
97
|
+
streaming.setChunkDelay(75);
|
|
98
|
+
|
|
99
|
+
// Get current settings
|
|
100
|
+
const settings = streaming.getSettings();
|
|
101
|
+
console.log(`Chunk size: ${settings.chunkSize}`);
|
|
102
|
+
console.log(`Delay: ${settings.chunkDelayMs}ms`);
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Platform Settings
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
// Set platform-specific limit
|
|
109
|
+
streaming.setPlatformLimit('telegram', {
|
|
110
|
+
maxMessageLength: 4096,
|
|
111
|
+
maxChunkSize: 80,
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// Get platform limits
|
|
115
|
+
const limits = streaming.getPlatformLimits();
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Typing Indicators
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
// Enable typing
|
|
122
|
+
streaming.enableTyping();
|
|
123
|
+
|
|
124
|
+
// Disable typing
|
|
125
|
+
streaming.disableTyping();
|
|
126
|
+
|
|
127
|
+
// Set duration
|
|
128
|
+
streaming.setTypingDuration(5000);
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Platform Limits
|
|
134
|
+
|
|
135
|
+
| Platform | Max Message | Recommended Chunk |
|
|
136
|
+
|----------|-------------|-------------------|
|
|
137
|
+
| Telegram | 4,096 chars | 80-100 |
|
|
138
|
+
| Discord | 2,000 chars | 100-150 |
|
|
139
|
+
| Slack | 40,000 chars | 150-200 |
|
|
140
|
+
| WhatsApp | 65,536 chars | 100-150 |
|
|
141
|
+
| WebChat | Unlimited | 150-200 |
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Best Practices
|
|
146
|
+
|
|
147
|
+
1. **Smaller chunks for mobile** — Better UX on slow connections
|
|
148
|
+
2. **Adjust delay for readability** — 50-100ms feels natural
|
|
149
|
+
3. **Disable for short responses** — Don't stream "OK"
|
|
150
|
+
4. **Monitor performance** — Streaming adds overhead
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/skills/bundled/streaming/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/skills/bundled/streaming/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tailscale
|
|
3
|
+
description: "Tailscale VPN sharing, Serve, and Funnel for remote access"
|
|
4
|
+
emoji: "🔗"
|
|
5
|
+
gates:
|
|
6
|
+
envs:
|
|
7
|
+
anyOf:
|
|
8
|
+
- TAILSCALE_AUTHKEY
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Tailscale - Complete API Reference
|
|
12
|
+
|
|
13
|
+
Share local services via Tailscale Serve (private) and Funnel (public internet access).
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Chat Commands
|
|
18
|
+
|
|
19
|
+
### Share Local Services (Private)
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
/tailscale serve 3000 Share port on tailnet
|
|
23
|
+
/tailscale serve 3000 --path /api Share at specific path
|
|
24
|
+
/tailscale serve stop 3000 Stop sharing port
|
|
25
|
+
/tailscale serve status View active shares
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Public Access (Funnel)
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
/tailscale funnel 3000 Expose to internet
|
|
32
|
+
/tailscale funnel 3000 --https Force HTTPS
|
|
33
|
+
/tailscale funnel stop 3000 Stop public access
|
|
34
|
+
/tailscale funnel status View funnels
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Network Status
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
/tailscale status Network status
|
|
41
|
+
/tailscale ip Show Tailscale IP
|
|
42
|
+
/tailscale peers List connected peers
|
|
43
|
+
/tailscale ping <peer> Ping a peer
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### File Transfer
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
/tailscale send <file> <peer> Send file to peer
|
|
50
|
+
/tailscale receive Receive incoming files
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## TypeScript API Reference
|
|
56
|
+
|
|
57
|
+
### Create Tailscale Client
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
import { createTailscaleClient } from 'clodds/tailscale';
|
|
61
|
+
|
|
62
|
+
const tailscale = createTailscaleClient({
|
|
63
|
+
// Auth (optional if already logged in)
|
|
64
|
+
authKey: process.env.TAILSCALE_AUTHKEY,
|
|
65
|
+
|
|
66
|
+
// Socket path
|
|
67
|
+
socketPath: '/var/run/tailscale/tailscaled.sock',
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Serve (Private Sharing)
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
// Share local port on tailnet
|
|
75
|
+
await tailscale.serve({
|
|
76
|
+
port: 3000,
|
|
77
|
+
protocol: 'https', // 'http' | 'https'
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
console.log(`Shared at: https://${tailscale.hostname}:3000`);
|
|
81
|
+
|
|
82
|
+
// Share at specific path
|
|
83
|
+
await tailscale.serve({
|
|
84
|
+
port: 8080,
|
|
85
|
+
path: '/api',
|
|
86
|
+
protocol: 'https',
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// Share with custom hostname
|
|
90
|
+
await tailscale.serve({
|
|
91
|
+
port: 3000,
|
|
92
|
+
hostname: 'clodds', // clodds.tailnet-name.ts.net
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
// Stop sharing
|
|
96
|
+
await tailscale.serveStop(3000);
|
|
97
|
+
|
|
98
|
+
// Get serve status
|
|
99
|
+
const serves = await tailscale.serveStatus();
|
|
100
|
+
for (const serve of serves) {
|
|
101
|
+
console.log(`Port ${serve.port} → ${serve.url}`);
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Funnel (Public Internet)
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
// Expose to public internet
|
|
109
|
+
await tailscale.funnel({
|
|
110
|
+
port: 3000,
|
|
111
|
+
protocol: 'https',
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
console.log(`Public URL: https://${tailscale.hostname}.ts.net`);
|
|
115
|
+
|
|
116
|
+
// With custom domain (if configured)
|
|
117
|
+
await tailscale.funnel({
|
|
118
|
+
port: 3000,
|
|
119
|
+
hostname: 'api.example.com',
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
// Stop funnel
|
|
123
|
+
await tailscale.funnelStop(3000);
|
|
124
|
+
|
|
125
|
+
// Get funnel status
|
|
126
|
+
const funnels = await tailscale.funnelStatus();
|
|
127
|
+
for (const funnel of funnels) {
|
|
128
|
+
console.log(`Port ${funnel.port} → ${funnel.publicUrl}`);
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Network Status
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
// Get status
|
|
136
|
+
const status = await tailscale.status();
|
|
137
|
+
|
|
138
|
+
console.log(`Hostname: ${status.hostname}`);
|
|
139
|
+
console.log(`IP: ${status.ip}`);
|
|
140
|
+
console.log(`Tailnet: ${status.tailnet}`);
|
|
141
|
+
console.log(`Online: ${status.online}`);
|
|
142
|
+
|
|
143
|
+
// List peers
|
|
144
|
+
const peers = await tailscale.peers();
|
|
145
|
+
for (const peer of peers) {
|
|
146
|
+
console.log(`${peer.hostname} (${peer.ip})`);
|
|
147
|
+
console.log(` OS: ${peer.os}`);
|
|
148
|
+
console.log(` Online: ${peer.online}`);
|
|
149
|
+
console.log(` Last seen: ${peer.lastSeen}`);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Ping peer
|
|
153
|
+
const ping = await tailscale.ping('other-machine');
|
|
154
|
+
console.log(`Latency: ${ping.latencyMs}ms`);
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### File Transfer
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
// Send file to peer
|
|
161
|
+
await tailscale.sendFile({
|
|
162
|
+
file: '/path/to/file.zip',
|
|
163
|
+
peer: 'other-machine',
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
// Receive files (returns when file received)
|
|
167
|
+
const received = await tailscale.receiveFile({
|
|
168
|
+
savePath: '/downloads',
|
|
169
|
+
timeout: 60000,
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
console.log(`Received: ${received.filename}`);
|
|
173
|
+
console.log(`From: ${received.sender}`);
|
|
174
|
+
console.log(`Size: ${received.size} bytes`);
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Get Tailscale IP
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
const ip = await tailscale.getIP();
|
|
181
|
+
console.log(`Tailscale IP: ${ip}`); // 100.x.x.x
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## Serve vs Funnel
|
|
187
|
+
|
|
188
|
+
| Feature | Serve | Funnel |
|
|
189
|
+
|---------|-------|--------|
|
|
190
|
+
| **Access** | Tailnet only | Public internet |
|
|
191
|
+
| **Auth** | Tailscale identity | None (public) |
|
|
192
|
+
| **URL** | machine.tailnet.ts.net | machine.ts.net |
|
|
193
|
+
| **Use case** | Internal tools | Public APIs |
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## URL Formats
|
|
198
|
+
|
|
199
|
+
| Type | Format |
|
|
200
|
+
|------|--------|
|
|
201
|
+
| **Serve** | `https://machine.tailnet-name.ts.net:port` |
|
|
202
|
+
| **Funnel** | `https://machine.ts.net` |
|
|
203
|
+
| **Custom domain** | `https://your-domain.com` |
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## Use Cases
|
|
208
|
+
|
|
209
|
+
### Share Dev Server
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
// Share local dev server with team
|
|
213
|
+
await tailscale.serve({ port: 3000 });
|
|
214
|
+
// Team can access at https://your-machine.tailnet.ts.net:3000
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Expose Webhook Endpoint
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
// Make webhook publicly accessible
|
|
221
|
+
await tailscale.funnel({ port: 3000, path: '/webhooks' });
|
|
222
|
+
// External services can POST to https://your-machine.ts.net/webhooks
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Share Bot with Phone
|
|
226
|
+
|
|
227
|
+
```typescript
|
|
228
|
+
// Access bot from phone while away from desk
|
|
229
|
+
await tailscale.serve({ port: 18789 });
|
|
230
|
+
// Open https://your-machine.tailnet.ts.net:18789/webchat on phone
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Requirements
|
|
236
|
+
|
|
237
|
+
- Tailscale installed and running
|
|
238
|
+
- Logged into a Tailnet
|
|
239
|
+
- For Funnel: Funnel enabled in Tailscale admin
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## Best Practices
|
|
244
|
+
|
|
245
|
+
1. **Use Serve for internal** — Keep private services private
|
|
246
|
+
2. **Use Funnel sparingly** — Only for truly public endpoints
|
|
247
|
+
3. **Add authentication** — Funnel bypasses Tailscale auth
|
|
248
|
+
4. **Monitor access** — Check who's connecting
|
|
249
|
+
5. **Stop when done** — Don't leave services exposed
|