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 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) {
@@ -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
- this.usage.promptTokens += chunk.usage_metadata.input_tokens || 0;
104
- this.usage.completionTokens += chunk.usage_metadata.output_tokens || 0;
105
- this.usage.totalTokens += chunk.usage_metadata.total_tokens || 0;
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\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);
@@ -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; } });