prab-cli 1.2.4 → 1.2.5
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/index.js +84 -0
- package/dist/lib/chat-handler.js +39 -5
- package/dist/lib/crypto/index.js +11 -1
- package/dist/lib/crypto/market-scanner.js +569 -0
- package/dist/lib/crypto/news-fetcher.js +394 -0
- package/dist/lib/crypto/signal-generator.js +76 -10
- package/dist/lib/crypto/smc-analyzer.js +39 -7
- package/dist/lib/crypto/whale-tracker.js +508 -0
- package/dist/lib/slash-commands.js +18 -0
- package/dist/lib/ui.js +45 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -144,6 +144,34 @@ program
|
|
|
144
144
|
console.log("\nYou can also use any Binance trading pair (e.g., BTCUSDT, ETHBTC)");
|
|
145
145
|
console.log("");
|
|
146
146
|
});
|
|
147
|
+
// Whale activity tracker
|
|
148
|
+
program
|
|
149
|
+
.command("whale")
|
|
150
|
+
.description("Track whale activity (large BTC/ETH transactions)")
|
|
151
|
+
.option("-c, --coins <coins>", "Coins to track (comma-separated)", "BTC,ETH")
|
|
152
|
+
.action(async (options) => {
|
|
153
|
+
const coins = options.coins.split(",").map((c) => c.trim().toUpperCase());
|
|
154
|
+
await (0, crypto_1.runWhaleTracker)(coins);
|
|
155
|
+
});
|
|
156
|
+
// Market scanner for opportunities
|
|
157
|
+
program
|
|
158
|
+
.command("scan")
|
|
159
|
+
.description("Scan market for best trading opportunities")
|
|
160
|
+
.option("-l, --limit <number>", "Number of cryptos to scan (max 100)", "50")
|
|
161
|
+
.option("-m, --min-score <number>", "Minimum score to display", "50")
|
|
162
|
+
.action(async (options) => {
|
|
163
|
+
const limit = Math.min(parseInt(options.limit) || 50, 100);
|
|
164
|
+
const minScore = parseInt(options.minScore) || 50;
|
|
165
|
+
await (0, crypto_1.runMarketScanner)(limit, minScore);
|
|
166
|
+
});
|
|
167
|
+
// Crypto news fetcher
|
|
168
|
+
program
|
|
169
|
+
.command("news")
|
|
170
|
+
.description("Get latest cryptocurrency news and updates")
|
|
171
|
+
.option("-c, --coin <coin>", "Filter news by specific coin (e.g., btc, eth)")
|
|
172
|
+
.action(async (options) => {
|
|
173
|
+
await (0, crypto_1.runCryptoNews)(options.coin);
|
|
174
|
+
});
|
|
147
175
|
// Model management commands
|
|
148
176
|
program
|
|
149
177
|
.command("model")
|
|
@@ -334,6 +362,62 @@ program.action(async () => {
|
|
|
334
362
|
await (0, crypto_1.fullSignal)(cryptoSymbol, intervalChoice);
|
|
335
363
|
break;
|
|
336
364
|
}
|
|
365
|
+
case "whale": {
|
|
366
|
+
// Prompt for coins to track
|
|
367
|
+
const { coins } = await inquirer_1.default.prompt([
|
|
368
|
+
{
|
|
369
|
+
type: "input",
|
|
370
|
+
name: "coins",
|
|
371
|
+
message: "Enter coins to track (comma-separated):",
|
|
372
|
+
default: "BTC,ETH",
|
|
373
|
+
},
|
|
374
|
+
]);
|
|
375
|
+
const coinList = coins.split(",").map((c) => c.trim().toUpperCase());
|
|
376
|
+
await (0, crypto_1.runWhaleTracker)(coinList);
|
|
377
|
+
break;
|
|
378
|
+
}
|
|
379
|
+
case "scan": {
|
|
380
|
+
// Prompt for scan options
|
|
381
|
+
const scanLimit = await (0, select_1.default)({
|
|
382
|
+
message: "How many cryptocurrencies to scan?",
|
|
383
|
+
choices: [
|
|
384
|
+
{ name: "Top 20 (Quick)", value: 20 },
|
|
385
|
+
{ name: "Top 50 (Recommended)", value: 50 },
|
|
386
|
+
{ name: "Top 100 (Comprehensive)", value: 100 },
|
|
387
|
+
],
|
|
388
|
+
});
|
|
389
|
+
await (0, crypto_1.runMarketScanner)(scanLimit, 50);
|
|
390
|
+
break;
|
|
391
|
+
}
|
|
392
|
+
case "news": {
|
|
393
|
+
// Prompt for optional coin filter
|
|
394
|
+
const newsFilterChoice = await (0, select_1.default)({
|
|
395
|
+
message: "Filter news by coin?",
|
|
396
|
+
choices: [
|
|
397
|
+
{ name: "All Crypto News", value: "" },
|
|
398
|
+
{ name: "Bitcoin (BTC)", value: "BTC" },
|
|
399
|
+
{ name: "Ethereum (ETH)", value: "ETH" },
|
|
400
|
+
{ name: "Solana (SOL)", value: "SOL" },
|
|
401
|
+
{ name: "Other (specify)", value: "__other__" },
|
|
402
|
+
],
|
|
403
|
+
});
|
|
404
|
+
let coinFilter;
|
|
405
|
+
if (newsFilterChoice === "__other__") {
|
|
406
|
+
const { customCoin } = await inquirer_1.default.prompt([
|
|
407
|
+
{
|
|
408
|
+
type: "input",
|
|
409
|
+
name: "customCoin",
|
|
410
|
+
message: "Enter coin symbol (e.g., XRP, ADA, DOGE):",
|
|
411
|
+
},
|
|
412
|
+
]);
|
|
413
|
+
coinFilter = customCoin.trim().toUpperCase() || undefined;
|
|
414
|
+
}
|
|
415
|
+
else if (newsFilterChoice) {
|
|
416
|
+
coinFilter = newsFilterChoice;
|
|
417
|
+
}
|
|
418
|
+
await (0, crypto_1.runCryptoNews)(coinFilter);
|
|
419
|
+
break;
|
|
420
|
+
}
|
|
337
421
|
case "model": {
|
|
338
422
|
// Fetch models from Groq API if not cached
|
|
339
423
|
if (cachedModels.length === 0) {
|
package/dist/lib/chat-handler.js
CHANGED
|
@@ -82,6 +82,10 @@ When you need to perform file operations, use the appropriate tools rather than
|
|
|
82
82
|
let fullResponse = "";
|
|
83
83
|
let toolCalls = [];
|
|
84
84
|
const formatter = new ui_1.StreamFormatter();
|
|
85
|
+
// Track tokens for this specific request
|
|
86
|
+
let requestPromptTokens = 0;
|
|
87
|
+
let requestCompletionTokens = 0;
|
|
88
|
+
let requestTotalTokens = 0;
|
|
85
89
|
process.stdout.write("\n");
|
|
86
90
|
try {
|
|
87
91
|
for await (const chunk of stream) {
|
|
@@ -98,11 +102,26 @@ When you need to perform file operations, use the appropriate tools rather than
|
|
|
98
102
|
if (chunk.tool_calls && chunk.tool_calls.length > 0) {
|
|
99
103
|
toolCalls = chunk.tool_calls;
|
|
100
104
|
}
|
|
101
|
-
// Capture usage metadata from the chunk
|
|
105
|
+
// Capture usage metadata from the chunk (LangChain uses different field names)
|
|
102
106
|
if (chunk.usage_metadata) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
107
|
+
requestPromptTokens =
|
|
108
|
+
chunk.usage_metadata.input_tokens || chunk.usage_metadata.prompt_tokens || 0;
|
|
109
|
+
requestCompletionTokens =
|
|
110
|
+
chunk.usage_metadata.output_tokens || chunk.usage_metadata.completion_tokens || 0;
|
|
111
|
+
requestTotalTokens =
|
|
112
|
+
chunk.usage_metadata.total_tokens || requestPromptTokens + requestCompletionTokens;
|
|
113
|
+
// Also update cumulative stats
|
|
114
|
+
this.usage.promptTokens += requestPromptTokens;
|
|
115
|
+
this.usage.completionTokens += requestCompletionTokens;
|
|
116
|
+
this.usage.totalTokens += requestTotalTokens;
|
|
117
|
+
}
|
|
118
|
+
// Also check response_metadata (alternative LangChain format)
|
|
119
|
+
if (chunk.response_metadata?.usage) {
|
|
120
|
+
const usage = chunk.response_metadata.usage;
|
|
121
|
+
requestPromptTokens = usage.prompt_tokens || usage.input_tokens || 0;
|
|
122
|
+
requestCompletionTokens = usage.completion_tokens || usage.output_tokens || 0;
|
|
123
|
+
requestTotalTokens =
|
|
124
|
+
usage.total_tokens || requestPromptTokens + requestCompletionTokens;
|
|
106
125
|
}
|
|
107
126
|
}
|
|
108
127
|
// Increment request count
|
|
@@ -120,7 +139,22 @@ When you need to perform file operations, use the appropriate tools rather than
|
|
|
120
139
|
tracker_1.tracker.apiError(apiError.message, { stack: apiError.stack });
|
|
121
140
|
throw apiError;
|
|
122
141
|
}
|
|
123
|
-
process.stdout.write("\n
|
|
142
|
+
process.stdout.write("\n");
|
|
143
|
+
// Estimate tokens if not provided by API (rough estimate: ~4 chars per token)
|
|
144
|
+
if (requestTotalTokens === 0 && fullResponse.length > 0) {
|
|
145
|
+
// Estimate based on message content length
|
|
146
|
+
const inputText = this.messages
|
|
147
|
+
.map((m) => (typeof m.content === "string" ? m.content : ""))
|
|
148
|
+
.join(" ");
|
|
149
|
+
requestPromptTokens = Math.ceil(inputText.length / 4);
|
|
150
|
+
requestCompletionTokens = Math.ceil(fullResponse.length / 4);
|
|
151
|
+
requestTotalTokens = requestPromptTokens + requestCompletionTokens;
|
|
152
|
+
}
|
|
153
|
+
// Show token usage for this request
|
|
154
|
+
if (requestTotalTokens > 0) {
|
|
155
|
+
(0, ui_1.showTokenUsageCompact)(requestPromptTokens, requestCompletionTokens, requestTotalTokens);
|
|
156
|
+
}
|
|
157
|
+
process.stdout.write("\n");
|
|
124
158
|
// Log AI response if there's content
|
|
125
159
|
if (fullResponse.length > 0) {
|
|
126
160
|
tracker_1.tracker.aiResponse(fullResponse);
|
package/dist/lib/crypto/index.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Exports all crypto-related functionality
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.displaySMCAnalysis = exports.runSMCAnalysis = exports.calculatePremiumDiscount = exports.findLiquidityZones = exports.findFairValueGaps = exports.findOrderBlocks = exports.findSwingPoints = exports.analyzeSMC = exports.analyzeTrend = exports.calculateSupportResistance = exports.analyzeVolume = exports.calculateATR = exports.calculateBollingerBands = exports.calculateMACD = exports.calculateRSI = exports.analyzeMarket = exports.displayComprehensiveAnalysis = exports.comprehensiveAnalysis = exports.fullSignal = exports.quickSignal = exports.displaySignal = exports.generateTradingSignal = exports.formatSignalSummary = exports.generateSignal = exports.calculateIndicators = exports.calculateAllEMAs = exports.calculateEMA = exports.isValidSymbol = exports.getSupportedSymbols = exports.normalizeSymbol = exports.fetch24hTicker = exports.fetchOHLCV = exports.fetchCryptoData = void 0;
|
|
7
|
+
exports.displayNews = exports.fetchCryptoNews = exports.runCryptoNews = exports.displayScanResults = exports.runMarketScanner = exports.displayWhaleActivity = exports.runWhaleTracker = exports.displaySMCAnalysis = exports.runSMCAnalysis = exports.calculatePremiumDiscount = exports.findLiquidityZones = exports.findFairValueGaps = exports.findOrderBlocks = exports.findSwingPoints = exports.analyzeSMC = exports.analyzeTrend = exports.calculateSupportResistance = exports.analyzeVolume = exports.calculateATR = exports.calculateBollingerBands = exports.calculateMACD = exports.calculateRSI = exports.analyzeMarket = exports.displayComprehensiveAnalysis = exports.comprehensiveAnalysis = exports.fullSignal = exports.quickSignal = exports.displaySignal = exports.generateTradingSignal = exports.formatSignalSummary = exports.generateSignal = exports.calculateIndicators = exports.calculateAllEMAs = exports.calculateEMA = exports.isValidSymbol = exports.getSupportedSymbols = exports.normalizeSymbol = exports.fetch24hTicker = exports.fetchOHLCV = exports.fetchCryptoData = void 0;
|
|
8
8
|
var data_fetcher_1 = require("./data-fetcher");
|
|
9
9
|
Object.defineProperty(exports, "fetchCryptoData", { enumerable: true, get: function () { return data_fetcher_1.fetchCryptoData; } });
|
|
10
10
|
Object.defineProperty(exports, "fetchOHLCV", { enumerable: true, get: function () { return data_fetcher_1.fetchOHLCV; } });
|
|
@@ -45,3 +45,13 @@ Object.defineProperty(exports, "calculatePremiumDiscount", { enumerable: true, g
|
|
|
45
45
|
var smc_analyzer_1 = require("./smc-analyzer");
|
|
46
46
|
Object.defineProperty(exports, "runSMCAnalysis", { enumerable: true, get: function () { return smc_analyzer_1.runSMCAnalysis; } });
|
|
47
47
|
Object.defineProperty(exports, "displaySMCAnalysis", { enumerable: true, get: function () { return smc_analyzer_1.displaySMCAnalysis; } });
|
|
48
|
+
var whale_tracker_1 = require("./whale-tracker");
|
|
49
|
+
Object.defineProperty(exports, "runWhaleTracker", { enumerable: true, get: function () { return whale_tracker_1.runWhaleTracker; } });
|
|
50
|
+
Object.defineProperty(exports, "displayWhaleActivity", { enumerable: true, get: function () { return whale_tracker_1.displayWhaleActivity; } });
|
|
51
|
+
var market_scanner_1 = require("./market-scanner");
|
|
52
|
+
Object.defineProperty(exports, "runMarketScanner", { enumerable: true, get: function () { return market_scanner_1.runMarketScanner; } });
|
|
53
|
+
Object.defineProperty(exports, "displayScanResults", { enumerable: true, get: function () { return market_scanner_1.displayScanResults; } });
|
|
54
|
+
var news_fetcher_1 = require("./news-fetcher");
|
|
55
|
+
Object.defineProperty(exports, "runCryptoNews", { enumerable: true, get: function () { return news_fetcher_1.runCryptoNews; } });
|
|
56
|
+
Object.defineProperty(exports, "fetchCryptoNews", { enumerable: true, get: function () { return news_fetcher_1.fetchCryptoNews; } });
|
|
57
|
+
Object.defineProperty(exports, "displayNews", { enumerable: true, get: function () { return news_fetcher_1.displayNews; } });
|