ai-cost-cli 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.
Files changed (42) hide show
  1. package/README.md +228 -0
  2. package/dist/analytics.d.ts +8 -0
  3. package/dist/analytics.d.ts.map +1 -0
  4. package/dist/analytics.js +128 -0
  5. package/dist/analytics.js.map +1 -0
  6. package/dist/api.d.ts +11 -0
  7. package/dist/api.d.ts.map +1 -0
  8. package/dist/api.js +152 -0
  9. package/dist/api.js.map +1 -0
  10. package/dist/commands/analyze.d.ts +8 -0
  11. package/dist/commands/analyze.d.ts.map +1 -0
  12. package/dist/commands/analyze.js +210 -0
  13. package/dist/commands/analyze.js.map +1 -0
  14. package/dist/commands/connect.d.ts +7 -0
  15. package/dist/commands/connect.d.ts.map +1 -0
  16. package/dist/commands/connect.js +67 -0
  17. package/dist/commands/connect.js.map +1 -0
  18. package/dist/commands/login.d.ts +7 -0
  19. package/dist/commands/login.d.ts.map +1 -0
  20. package/dist/commands/login.js +100 -0
  21. package/dist/commands/login.js.map +1 -0
  22. package/dist/commands/models.d.ts +6 -0
  23. package/dist/commands/models.d.ts.map +1 -0
  24. package/dist/commands/models.js +74 -0
  25. package/dist/commands/models.js.map +1 -0
  26. package/dist/commands/optimize.d.ts +6 -0
  27. package/dist/commands/optimize.d.ts.map +1 -0
  28. package/dist/commands/optimize.js +129 -0
  29. package/dist/commands/optimize.js.map +1 -0
  30. package/dist/commands/status.d.ts +2 -0
  31. package/dist/commands/status.d.ts.map +1 -0
  32. package/dist/commands/status.js +31 -0
  33. package/dist/commands/status.js.map +1 -0
  34. package/dist/config.d.ts +13 -0
  35. package/dist/config.d.ts.map +1 -0
  36. package/dist/config.js +71 -0
  37. package/dist/config.js.map +1 -0
  38. package/dist/index.d.ts +3 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +54 -0
  41. package/dist/index.js.map +1 -0
  42. package/package.json +68 -0
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.analyzeCommand = analyzeCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const cli_table3_1 = __importDefault(require("cli-table3"));
10
+ const config_1 = require("../config");
11
+ const api_1 = require("../api");
12
+ async function analyzeCommand(options) {
13
+ console.log(chalk_1.default.bold.cyan('\n🛡️ AI Cost Guard — Cost Analysis\n'));
14
+ const config = (0, config_1.getConfig)();
15
+ if (!config) {
16
+ console.log(chalk_1.default.red('❌ Not connected. Run `ai-cost-cli login` or `ai-cost-cli connect` first.'));
17
+ return;
18
+ }
19
+ const days = parseInt(options.days) || 30;
20
+ const spinner = (0, ora_1.default)(`Analyzing last ${days} days of AI costs...`).start();
21
+ try {
22
+ const endDate = new Date().toISOString().split('T')[0];
23
+ const startDate = new Date(Date.now() - days * 86400000).toISOString().split('T')[0];
24
+ // If user is logged in with JWT and has a project selected, fetch real analytics
25
+ if (config.token && config.projectId) {
26
+ await showRealAnalytics(config, days, startDate, endDate, options, spinner);
27
+ return;
28
+ }
29
+ // Fallback to pricing-only analysis
30
+ await showPricingAnalysis(config, days, startDate, endDate, options, spinner);
31
+ }
32
+ catch (err) {
33
+ spinner.fail(`Analysis failed: ${err.message}`);
34
+ }
35
+ }
36
+ async function showRealAnalytics(config, days, startDate, endDate, options, spinner) {
37
+ try {
38
+ // Fetch dashboard overview from the real analytics API
39
+ const overview = await (0, api_1.apiRequestAuth)(`/analytics/${config.projectId}/overview?startDate=${startDate}&endDate=${endDate}`, config.token, config.baseUrl);
40
+ // Fetch latency analytics
41
+ let latencyData = null;
42
+ try {
43
+ latencyData = await (0, api_1.apiRequestAuth)(`/analytics/${config.projectId}/latency?startDate=${startDate}&endDate=${endDate}`, config.token, config.baseUrl);
44
+ }
45
+ catch { /* latency endpoint may not exist yet */ }
46
+ spinner.succeed('Analysis complete!');
47
+ // Header
48
+ console.log(chalk_1.default.bold(`\n📊 AI COST REPORT — Real Data`));
49
+ console.log(chalk_1.default.gray(` Project: ${config.projectName || config.projectId}`));
50
+ console.log(chalk_1.default.gray(` Period: ${startDate} → ${endDate} (${days} days)\n`));
51
+ // Overview numbers
52
+ const totalCost = Number(overview.totalCost || 0);
53
+ const totalEvents = Number(overview.totalEvents || 0);
54
+ const avgCostPerEvent = totalEvents > 0 ? totalCost / totalEvents : 0;
55
+ const summaryTable = new cli_table3_1.default({
56
+ style: { head: [], border: ['gray'] },
57
+ });
58
+ summaryTable.push([chalk_1.default.white('Total Cost'), chalk_1.default.bold.green(`$${totalCost.toFixed(4)}`)], [chalk_1.default.white('Total Events'), chalk_1.default.bold.cyan(totalEvents.toLocaleString())], [chalk_1.default.white('Avg Cost/Event'), chalk_1.default.yellow(`$${avgCostPerEvent.toFixed(6)}`)], [chalk_1.default.white('Total Input Tokens'), chalk_1.default.gray(Number(overview.totalInputTokens || 0).toLocaleString())], [chalk_1.default.white('Total Output Tokens'), chalk_1.default.gray(Number(overview.totalOutputTokens || 0).toLocaleString())]);
59
+ console.log(summaryTable.toString());
60
+ // Cost by model
61
+ if (overview.costByModel && overview.costByModel.length > 0) {
62
+ console.log(chalk_1.default.bold(`\n💰 COST BY MODEL\n`));
63
+ const modelTable = new cli_table3_1.default({
64
+ head: [
65
+ chalk_1.default.white('Provider'),
66
+ chalk_1.default.white('Model'),
67
+ chalk_1.default.white('Events'),
68
+ chalk_1.default.white('Cost'),
69
+ chalk_1.default.white('% of Total'),
70
+ ],
71
+ colWidths: [14, 28, 12, 14, 14],
72
+ style: { head: [], border: ['gray'] },
73
+ });
74
+ let models = overview.costByModel;
75
+ if (options.provider) {
76
+ models = models.filter((m) => m.provider?.toLowerCase().includes(options.provider.toLowerCase()));
77
+ }
78
+ if (options.model) {
79
+ models = models.filter((m) => m.model?.toLowerCase().includes(options.model.toLowerCase()));
80
+ }
81
+ for (const m of models) {
82
+ const cost = Number(m.totalCost || m._sum?.cost || 0);
83
+ const events = Number(m.eventCount || m._count || 0);
84
+ const pct = totalCost > 0 ? ((cost / totalCost) * 100).toFixed(1) : '0.0';
85
+ modelTable.push([
86
+ chalk_1.default.cyan(m.provider || '-'),
87
+ m.model || '-',
88
+ events.toLocaleString(),
89
+ chalk_1.default.yellow(`$${cost.toFixed(4)}`),
90
+ `${pct}%`,
91
+ ]);
92
+ }
93
+ console.log(modelTable.toString());
94
+ }
95
+ // Cost over time
96
+ if (overview.costOverTime && overview.costOverTime.length > 0) {
97
+ console.log(chalk_1.default.bold(`\n📈 DAILY COST TREND\n`));
98
+ const trendTable = new cli_table3_1.default({
99
+ head: [chalk_1.default.white('Date'), chalk_1.default.white('Events'), chalk_1.default.white('Cost')],
100
+ colWidths: [14, 12, 14],
101
+ style: { head: [], border: ['gray'] },
102
+ });
103
+ // Show last 10 entries to keep it readable
104
+ const recent = overview.costOverTime.slice(-10);
105
+ for (const day of recent) {
106
+ trendTable.push([
107
+ day.date || '-',
108
+ Number(day.events || 0).toLocaleString(),
109
+ chalk_1.default.yellow(`$${Number(day.cost || 0).toFixed(4)}`),
110
+ ]);
111
+ }
112
+ console.log(trendTable.toString());
113
+ }
114
+ // Latency analytics
115
+ if (latencyData) {
116
+ console.log(chalk_1.default.bold(`\n⚡ LATENCY PERCENTILES\n`));
117
+ const latTable = new cli_table3_1.default({
118
+ style: { head: [], border: ['gray'] },
119
+ });
120
+ latTable.push([chalk_1.default.white('P50'), chalk_1.default.cyan(`${Number(latencyData.overall?.p50 || 0).toFixed(0)} ms`)], [chalk_1.default.white('P95'), chalk_1.default.yellow(`${Number(latencyData.overall?.p95 || 0).toFixed(0)} ms`)], [chalk_1.default.white('P99'), chalk_1.default.red(`${Number(latencyData.overall?.p99 || 0).toFixed(0)} ms`)]);
121
+ console.log(latTable.toString());
122
+ }
123
+ // Optimization tips
124
+ printOptimizationTips();
125
+ }
126
+ catch (err) {
127
+ spinner.warn(`Could not fetch real analytics: ${err.message}`);
128
+ spinner.start('Falling back to pricing analysis...');
129
+ await showPricingAnalysis(config, days, startDate, endDate, options, spinner);
130
+ }
131
+ }
132
+ async function showPricingAnalysis(config, days, startDate, endDate, options, spinner) {
133
+ const models = await (0, api_1.apiRequest)({ path: '/pricing/models' });
134
+ spinner.succeed('Analysis complete!');
135
+ console.log(chalk_1.default.bold(`\n📊 AI MODEL PRICING REFERENCE`));
136
+ console.log(chalk_1.default.gray(` Period: Last ${days} days`));
137
+ console.log(chalk_1.default.gray(` Date: ${startDate} → ${endDate}`));
138
+ console.log(chalk_1.default.gray(` 💡 Login with \`ai-cost-cli login\` for real usage data\n`));
139
+ const table = new cli_table3_1.default({
140
+ head: [
141
+ chalk_1.default.white('Provider'),
142
+ chalk_1.default.white('Model'),
143
+ chalk_1.default.white('Input $/1M tokens'),
144
+ chalk_1.default.white('Output $/1M tokens'),
145
+ ],
146
+ colWidths: [15, 30, 20, 20],
147
+ style: { head: [], border: ['gray'] },
148
+ });
149
+ let filteredModels = models || [];
150
+ if (options.provider) {
151
+ filteredModels = filteredModels.filter((m) => m.provider.toLowerCase().includes(options.provider.toLowerCase()));
152
+ }
153
+ if (options.model) {
154
+ filteredModels = filteredModels.filter((m) => m.model.toLowerCase().includes(options.model.toLowerCase()));
155
+ }
156
+ const grouped = {};
157
+ for (const m of filteredModels) {
158
+ if (!grouped[m.provider])
159
+ grouped[m.provider] = [];
160
+ grouped[m.provider].push(m);
161
+ }
162
+ for (const [provider, providerModels] of Object.entries(grouped)) {
163
+ for (const m of providerModels) {
164
+ table.push([
165
+ chalk_1.default.cyan(provider),
166
+ m.model,
167
+ chalk_1.default.yellow(`$${Number(m.inputPricePerMillion || 0).toFixed(2)}`),
168
+ chalk_1.default.yellow(`$${Number(m.outputPricePerMillion || 0).toFixed(2)}`),
169
+ ]);
170
+ }
171
+ }
172
+ console.log(table.toString());
173
+ printOptimizationTips();
174
+ }
175
+ function printOptimizationTips() {
176
+ console.log(chalk_1.default.bold.green('\n💡 OPTIMIZATION TIPS\n'));
177
+ const tips = [
178
+ {
179
+ title: 'Switch expensive models for simple tasks',
180
+ desc: 'GPT-4 → GPT-4o-mini saves ~90% on routine tasks',
181
+ saving: 'Up to 90%',
182
+ },
183
+ {
184
+ title: 'Enable prompt caching',
185
+ desc: 'Repeated system prompts can be cached to save tokens',
186
+ saving: 'Up to 50%',
187
+ },
188
+ {
189
+ title: 'Compress verbose prompts',
190
+ desc: 'Remove redundant instructions and examples',
191
+ saving: 'Up to 60%',
192
+ },
193
+ {
194
+ title: 'Batch similar requests',
195
+ desc: 'Group related queries to share context',
196
+ saving: 'Up to 30%',
197
+ },
198
+ ];
199
+ for (const tip of tips) {
200
+ console.log(chalk_1.default.green(` ✅ ${tip.title}`));
201
+ console.log(chalk_1.default.gray(` ${tip.desc}`));
202
+ console.log(chalk_1.default.yellow(` Potential saving: ${tip.saving}\n`));
203
+ }
204
+ console.log(chalk_1.default.bold.yellow('━'.repeat(60)));
205
+ console.log(chalk_1.default.bold.yellow('\n🚀 Want real-time monitoring, alerts & auto-optimization?'));
206
+ console.log(chalk_1.default.yellow(' Connect your project to AI Cost Guard:'));
207
+ console.log(chalk_1.default.cyan(' https://aicostguard.com\n'));
208
+ console.log(chalk_1.default.bold.yellow('━'.repeat(60)));
209
+ }
210
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":";;;;;AAYA,wCA2BC;AAvCD,kDAA0B;AAC1B,8CAAsB;AACtB,4DAA+B;AAC/B,sCAAsC;AACtC,gCAAoD;AAQ7C,KAAK,UAAU,cAAc,CAAC,OAAuB;IAC1D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;IAEvE,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;IAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC,CAAC;QACnG,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,kBAAkB,IAAI,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;IAE1E,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAErF,iFAAiF;QACjF,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrC,MAAM,iBAAiB,CAAC,MAA8D,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACpI,OAAO;QACT,CAAC;QAED,oCAAoC;QACpC,MAAM,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,oBAAoB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,MAAiF,EACjF,IAAY,EACZ,SAAiB,EACjB,OAAe,EACf,OAAuB,EACvB,OAA+B;IAE/B,IAAI,CAAC;QACH,uDAAuD;QACvD,MAAM,QAAQ,GAAG,MAAM,IAAA,oBAAc,EACnC,cAAc,MAAM,CAAC,SAAS,uBAAuB,SAAS,YAAY,OAAO,EAAE,EACnF,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,OAAO,CACf,CAAC;QAEF,0BAA0B;QAC1B,IAAI,WAAW,GAAQ,IAAI,CAAC;QAC5B,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,IAAA,oBAAc,EAChC,cAAc,MAAM,CAAC,SAAS,sBAAsB,SAAS,YAAY,OAAO,EAAE,EAClF,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,OAAO,CACf,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC,CAAC,wCAAwC,CAAC,CAAC;QAEpD,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAEtC,SAAS;QACT,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,eAAe,SAAS,MAAM,OAAO,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC;QAElF,mBAAmB;QACnB,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;QACtD,MAAM,eAAe,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtE,MAAM,YAAY,GAAG,IAAI,oBAAK,CAAC;YAC7B,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE;SACtC,CAAC,CAAC;QAEH,YAAY,CAAC,IAAI,CACf,CAAC,eAAK,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EACzE,CAAC,eAAK,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,EAC5E,CAAC,eAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,eAAK,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAC/E,CAAC,eAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,EACxG,CAAC,eAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAC3G,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QAErC,gBAAgB;QAChB,IAAI,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAEhD,MAAM,UAAU,GAAG,IAAI,oBAAK,CAAC;gBAC3B,IAAI,EAAE;oBACJ,eAAK,CAAC,KAAK,CAAC,UAAU,CAAC;oBACvB,eAAK,CAAC,KAAK,CAAC,OAAO,CAAC;oBACpB,eAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;oBACrB,eAAK,CAAC,KAAK,CAAC,MAAM,CAAC;oBACnB,eAAK,CAAC,KAAK,CAAC,YAAY,CAAC;iBAC1B;gBACD,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;gBAC/B,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE;aACtC,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC;YAClC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAChC,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAS,CAAC,WAAW,EAAE,CAAC,CACpE,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAChC,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAM,CAAC,WAAW,EAAE,CAAC,CAC9D,CAAC;YACJ,CAAC;YAED,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;gBACtD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;gBACrD,MAAM,GAAG,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC1E,UAAU,CAAC,IAAI,CAAC;oBACd,eAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC;oBAC7B,CAAC,CAAC,KAAK,IAAI,GAAG;oBACd,MAAM,CAAC,cAAc,EAAE;oBACvB,eAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;oBACnC,GAAG,GAAG,GAAG;iBACV,CAAC,CAAC;YACL,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrC,CAAC;QAED,iBAAiB;QACjB,IAAI,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;YAEnD,MAAM,UAAU,GAAG,IAAI,oBAAK,CAAC;gBAC3B,IAAI,EAAE,CAAC,eAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,eAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,eAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACvE,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;gBACvB,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE;aACtC,CAAC,CAAC;YAEH,2CAA2C;YAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAChD,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;gBACzB,UAAU,CAAC,IAAI,CAAC;oBACd,GAAG,CAAC,IAAI,IAAI,GAAG;oBACf,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE;oBACxC,eAAK,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;iBACrD,CAAC,CAAC;YACL,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrC,CAAC;QAED,oBAAoB;QACpB,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAG,IAAI,oBAAK,CAAC;gBACzB,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE;aACtC,CAAC,CAAC;YACH,QAAQ,CAAC,IAAI,CACX,CAAC,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAC1F,CAAC,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,eAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAC5F,CAAC,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,eAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAC1F,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnC,CAAC;QAED,oBAAoB;QACpB,qBAAqB,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,mCAAmC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,MAAM,mBAAmB,CACvB,MAAa,EACb,IAAI,EACJ,SAAS,EACT,OAAO,EACP,OAAO,EACP,OAAO,CACR,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,MAAgE,EAChE,IAAY,EACZ,SAAiB,EACjB,OAAe,EACf,OAAuB,EACvB,OAA+B;IAE/B,MAAM,MAAM,GAAG,MAAM,IAAA,gBAAU,EAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAEpE,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEtC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,OAAO,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,SAAS,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC,CAAC;IAExF,MAAM,KAAK,GAAG,IAAI,oBAAK,CAAC;QACtB,IAAI,EAAE;YACJ,eAAK,CAAC,KAAK,CAAC,UAAU,CAAC;YACvB,eAAK,CAAC,KAAK,CAAC,OAAO,CAAC;YACpB,eAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC;YAChC,eAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC;SAClC;QACD,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAC3B,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE;KACtC,CAAC,CAAC;IAEH,IAAI,cAAc,GAAG,MAAM,IAAI,EAAE,CAAC;IAClC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAChD,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAS,CAAC,WAAW,EAAE,CAAC,CACnE,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAChD,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAM,CAAC,WAAW,EAAE,CAAC,CAC7D,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAA0B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QACnD,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjE,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC;gBACT,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACpB,CAAC,CAAC,KAAK;gBACP,eAAK,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,oBAAoB,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,eAAK,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,qBAAqB,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;aACpE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9B,qBAAqB,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAE1D,MAAM,IAAI,GAAG;QACX;YACE,KAAK,EAAE,0CAA0C;YACjD,IAAI,EAAE,iDAAiD;YACvD,MAAM,EAAE,WAAW;SACpB;QACD;YACE,KAAK,EAAE,uBAAuB;YAC9B,IAAI,EAAE,sDAAsD;YAC5D,MAAM,EAAE,WAAW;SACpB;QACD;YACE,KAAK,EAAE,0BAA0B;YACjC,IAAI,EAAE,4CAA4C;YAClD,MAAM,EAAE,WAAW;SACpB;QACD;YACE,KAAK,EAAE,wBAAwB;YAC/B,IAAI,EAAE,wCAAwC;YAC9C,MAAM,EAAE,WAAW;SACpB;KACF,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,0BAA0B,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,6DAA6D,CAAC,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface ConnectOptions {
2
+ key?: string;
3
+ url?: string;
4
+ }
5
+ export declare function connectCommand(options: ConnectOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=connect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAMA,UAAU,cAAc;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,iBA8D3D"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.connectCommand = connectCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const inquirer_1 = __importDefault(require("inquirer"));
10
+ const config_1 = require("../config");
11
+ const api_1 = require("../api");
12
+ async function connectCommand(options) {
13
+ console.log(chalk_1.default.bold.cyan('\n🛡️ AI Cost Guard — Connect\n'));
14
+ let apiKey = options.key;
15
+ let baseUrl = options.url || 'http://localhost:4000';
16
+ if (!apiKey) {
17
+ const answers = await inquirer_1.default.prompt([
18
+ {
19
+ type: 'input',
20
+ name: 'apiKey',
21
+ message: 'Enter your project API key:',
22
+ validate: (input) => input.length > 10 || 'API key is too short',
23
+ },
24
+ {
25
+ type: 'input',
26
+ name: 'baseUrl',
27
+ message: 'API base URL:',
28
+ default: baseUrl,
29
+ },
30
+ ]);
31
+ apiKey = answers.apiKey;
32
+ baseUrl = answers.baseUrl;
33
+ }
34
+ const spinner = (0, ora_1.default)('Verifying API key...').start();
35
+ try {
36
+ // Test the connection by sending a track event (dry run)
37
+ // We'll just try to hit the pricing endpoint which is public
38
+ const models = await (0, api_1.apiRequest)({
39
+ path: '/pricing/models',
40
+ baseUrl,
41
+ });
42
+ if (!models || !Array.isArray(models)) {
43
+ spinner.fail('Could not connect to the server');
44
+ return;
45
+ }
46
+ spinner.succeed('Connected to AI Cost Guard!');
47
+ (0, config_1.saveConfig)({
48
+ apiKey: apiKey,
49
+ baseUrl,
50
+ });
51
+ console.log(chalk_1.default.green('\n✅ Configuration saved!'));
52
+ console.log(chalk_1.default.gray(` API Key: ${apiKey.substring(0, 12)}...${apiKey.slice(-4)}`));
53
+ console.log(chalk_1.default.gray(` Server: ${baseUrl}`));
54
+ console.log(chalk_1.default.cyan('\n💡 Run `ai-cost-cli analyze` to see your cost report'));
55
+ // Upsell to SaaS
56
+ console.log(chalk_1.default.yellow('\n🚀 Want real-time monitoring & alerts?'));
57
+ console.log(chalk_1.default.yellow(' Visit: https://aicostguard.com'));
58
+ }
59
+ catch (err) {
60
+ spinner.fail(`Connection failed: ${err.message}`);
61
+ console.log(chalk_1.default.red('\nPlease check:'));
62
+ console.log(chalk_1.default.gray(' 1. The AI Cost Guard server is running'));
63
+ console.log(chalk_1.default.gray(' 2. The URL is correct'));
64
+ console.log(chalk_1.default.gray(' 3. Your API key is valid'));
65
+ }
66
+ }
67
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface LoginOptions {
2
+ email?: string;
3
+ url?: string;
4
+ }
5
+ export declare function loginCommand(options: LoginOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAMA,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAkBD,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,iBAyGvD"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loginCommand = loginCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const inquirer_1 = __importDefault(require("inquirer"));
10
+ const config_1 = require("../config");
11
+ const api_1 = require("../api");
12
+ async function loginCommand(options) {
13
+ console.log(chalk_1.default.bold.cyan('\n🛡️ AI Cost Guard — Login\n'));
14
+ const existingConfig = (0, config_1.getConfig)();
15
+ const baseUrl = options.url || existingConfig?.baseUrl || 'http://localhost:4000';
16
+ // Prompt for credentials
17
+ const answers = await inquirer_1.default.prompt([
18
+ {
19
+ type: 'input',
20
+ name: 'email',
21
+ message: 'Email:',
22
+ default: options.email || existingConfig?.email,
23
+ validate: (input) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(input) || 'Enter a valid email address',
24
+ },
25
+ {
26
+ type: 'password',
27
+ name: 'password',
28
+ message: 'Password:',
29
+ mask: '*',
30
+ validate: (input) => input.length >= 6 || 'Password must be at least 6 characters',
31
+ },
32
+ ]);
33
+ const spinner = (0, ora_1.default)('Authenticating...').start();
34
+ try {
35
+ const loginResult = await (0, api_1.apiRequest)({
36
+ path: '/auth/login',
37
+ method: 'POST',
38
+ baseUrl,
39
+ body: {
40
+ email: answers.email,
41
+ password: answers.password,
42
+ },
43
+ });
44
+ if (!loginResult.accessToken) {
45
+ spinner.fail('Login failed — invalid response from server');
46
+ return;
47
+ }
48
+ spinner.succeed(`Logged in as ${chalk_1.default.cyan(loginResult.user.email)}`);
49
+ // Save token
50
+ (0, config_1.updateConfig)({
51
+ token: loginResult.accessToken,
52
+ email: loginResult.user.email,
53
+ baseUrl,
54
+ });
55
+ // Fetch user's projects
56
+ const projectSpinner = (0, ora_1.default)('Fetching your projects...').start();
57
+ try {
58
+ const projects = await (0, api_1.apiRequestAuth)('/projects', loginResult.accessToken, baseUrl);
59
+ projectSpinner.stop();
60
+ if (projects && projects.length > 0) {
61
+ console.log(chalk_1.default.bold(`\n📋 Your Projects:\n`));
62
+ const projectChoices = projects.map((p) => ({
63
+ name: `${p.name} (${p.id.substring(0, 8)}...)`,
64
+ value: p,
65
+ }));
66
+ const { selectedProject } = await inquirer_1.default.prompt([
67
+ {
68
+ type: 'list',
69
+ name: 'selectedProject',
70
+ message: 'Select a project to connect:',
71
+ choices: projectChoices,
72
+ },
73
+ ]);
74
+ (0, config_1.updateConfig)({
75
+ apiKey: selectedProject.apiKey,
76
+ projectId: selectedProject.id,
77
+ projectName: selectedProject.name,
78
+ });
79
+ console.log(chalk_1.default.green(`\n✅ Connected to project: ${selectedProject.name}`));
80
+ console.log(chalk_1.default.gray(` Project ID: ${selectedProject.id}`));
81
+ console.log(chalk_1.default.gray(` API Key: ${selectedProject.apiKey.substring(0, 12)}...`));
82
+ }
83
+ else {
84
+ console.log(chalk_1.default.yellow('\n⚠️ No projects found. Create one on the dashboard first.'));
85
+ }
86
+ }
87
+ catch {
88
+ projectSpinner.stop();
89
+ console.log(chalk_1.default.yellow('\n⚠️ Could not fetch projects. Use `ai-cost-cli connect` to set up manually.'));
90
+ }
91
+ console.log(chalk_1.default.cyan('\n💡 Run `ai-cost-cli analyze` to see your cost report'));
92
+ console.log(chalk_1.default.cyan(' Run `ai-cost-cli status` to check your connection'));
93
+ }
94
+ catch (err) {
95
+ spinner.fail(`Login failed: ${err.message}`);
96
+ console.log(chalk_1.default.red('\nPlease check your email and password.'));
97
+ console.log(chalk_1.default.gray('Forgot password? Visit https://aicostguard.com/forgot-password'));
98
+ }
99
+ }
100
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;;;;AA2BA,oCAyGC;AApID,kDAA0B;AAC1B,8CAAsB;AACtB,wDAAgC;AAChC,sCAAoD;AACpD,gCAAoD;AAuB7C,KAAK,UAAU,YAAY,CAAC,OAAqB;IACtD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAE/D,MAAM,cAAc,GAAG,IAAA,kBAAS,GAAE,CAAC;IACnC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI,cAAc,EAAE,OAAO,IAAI,uBAAuB,CAAC;IAElF,yBAAyB;IACzB,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QACpC;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,OAAO,CAAC,KAAK,IAAI,cAAc,EAAE,KAAK;YAC/C,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAC1B,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,6BAA6B;SAC5E;QACD;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,WAAW;YACpB,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,wCAAwC;SAC3F;KACF,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEjD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,IAAA,gBAAU,EAAgB;YAClD,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE;gBACJ,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,gBAAgB,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAEtE,aAAa;QACb,IAAA,qBAAY,EAAC;YACX,KAAK,EAAE,WAAW,CAAC,WAAW;YAC9B,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK;YAC7B,OAAO;SACR,CAAC,CAAC;QAEH,wBAAwB;QACxB,MAAM,cAAc,GAAG,IAAA,aAAG,EAAC,2BAA2B,CAAC,CAAC,KAAK,EAAE,CAAC;QAEhE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,oBAAc,EACnC,WAAW,EACX,WAAW,CAAC,WAAW,EACvB,OAAO,CACR,CAAC;YAEF,cAAc,CAAC,IAAI,EAAE,CAAC;YAEtB,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;gBAEjD,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC1C,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM;oBAC9C,KAAK,EAAE,CAAC;iBACT,CAAC,CAAC,CAAC;gBAEJ,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;oBAChD;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,iBAAiB;wBACvB,OAAO,EAAE,8BAA8B;wBACvC,OAAO,EAAE,cAAc;qBACxB;iBACF,CAAC,CAAC;gBAEH,IAAA,qBAAY,EAAC;oBACX,MAAM,EAAE,eAAe,CAAC,MAAM;oBAC9B,SAAS,EAAE,eAAe,CAAC,EAAE;oBAC7B,WAAW,EAAE,eAAe,CAAC,IAAI;iBAClC,CAAC,CAAC;gBAEH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,6BAA6B,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC9E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kBAAkB,eAAe,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAChE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kBAAkB,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1F,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,6DAA6D,CAAC,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,cAAc,CAAC,IAAI,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,+EAA+E,CAAC,CAAC,CAAC;QAC7G,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC,CAAC;IAClF,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ interface ModelsOptions {
2
+ provider?: string;
3
+ }
4
+ export declare function modelsCommand(options: ModelsOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"AAMA,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,iBA6EzD"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.modelsCommand = modelsCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const cli_table3_1 = __importDefault(require("cli-table3"));
10
+ const api_1 = require("../api");
11
+ const config_1 = require("../config");
12
+ async function modelsCommand(options) {
13
+ console.log(chalk_1.default.bold.cyan('\n🛡️ AI Cost Guard — Supported Models\n'));
14
+ const config = (0, config_1.getConfig)();
15
+ const baseUrl = config?.baseUrl || 'http://localhost:4000';
16
+ const spinner = (0, ora_1.default)('Fetching model pricing...').start();
17
+ try {
18
+ const models = await (0, api_1.apiRequest)({
19
+ path: '/pricing/models',
20
+ baseUrl,
21
+ });
22
+ spinner.succeed(`Found ${models.length} models\n`);
23
+ let filtered = models;
24
+ if (options.provider) {
25
+ filtered = filtered.filter((m) => m.provider.toLowerCase().includes(options.provider.toLowerCase()));
26
+ }
27
+ // Group by provider
28
+ const byProvider = {};
29
+ for (const m of filtered) {
30
+ if (!byProvider[m.provider])
31
+ byProvider[m.provider] = [];
32
+ byProvider[m.provider].push(m);
33
+ }
34
+ for (const [provider, providerModels] of Object.entries(byProvider)) {
35
+ console.log(chalk_1.default.bold.cyan(` ${provider.toUpperCase()}`));
36
+ console.log(chalk_1.default.gray(' ' + '─'.repeat(50)));
37
+ const table = new cli_table3_1.default({
38
+ head: [
39
+ chalk_1.default.white('Model'),
40
+ chalk_1.default.white('Input $/1M'),
41
+ chalk_1.default.white('Output $/1M'),
42
+ chalk_1.default.white('Cost Tier'),
43
+ ],
44
+ colWidths: [30, 14, 14, 14],
45
+ style: { head: [], border: ['gray'] },
46
+ });
47
+ const sorted = providerModels.sort((a, b) => Number(a.inputPricePerMillion) - Number(b.inputPricePerMillion));
48
+ for (const m of sorted) {
49
+ const inputPrice = Number(m.inputPricePerMillion || 0);
50
+ const tier = inputPrice > 10
51
+ ? chalk_1.default.red('$$$$')
52
+ : inputPrice > 3
53
+ ? chalk_1.default.yellow('$$$')
54
+ : inputPrice > 0.5
55
+ ? chalk_1.default.green('$$')
56
+ : chalk_1.default.bold.green('$');
57
+ table.push([
58
+ m.model,
59
+ chalk_1.default.yellow(`$${inputPrice.toFixed(2)}`),
60
+ chalk_1.default.yellow(`$${Number(m.outputPricePerMillion || 0).toFixed(2)}`),
61
+ tier,
62
+ ]);
63
+ }
64
+ console.log(table.toString());
65
+ console.log();
66
+ }
67
+ console.log(chalk_1.default.gray(' Cost Tier: $ = Budget, $$ = Standard, $$$ = Premium, $$$$ = Expensive\n'));
68
+ }
69
+ catch (err) {
70
+ spinner.fail(`Failed to fetch models: ${err.message}`);
71
+ console.log(chalk_1.default.gray('\nMake sure the AI Cost Guard server is running.'));
72
+ }
73
+ }
74
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface OptimizeOptions {
2
+ days: string;
3
+ }
4
+ export declare function optimizeCommand(options: OptimizeOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=optimize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimize.d.ts","sourceRoot":"","sources":["../../src/commands/optimize.ts"],"names":[],"mappings":"AAMA,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AASD,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,iBA2I7D"}