@saccolabs/tars 1.0.53 → 1.3.1

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 (70) hide show
  1. package/README.md +10 -7
  2. package/dist/channels/channel-manager.d.ts +35 -0
  3. package/dist/channels/channel-manager.js +100 -0
  4. package/dist/channels/channel-manager.js.map +1 -0
  5. package/dist/channels/discord/discord-channel.d.ts +41 -0
  6. package/dist/channels/discord/discord-channel.js +199 -0
  7. package/dist/channels/discord/discord-channel.js.map +1 -0
  8. package/dist/channels/discord/message-formatter.js.map +1 -0
  9. package/dist/channels/types.d.ts +35 -0
  10. package/dist/channels/types.js +2 -0
  11. package/dist/channels/types.js.map +1 -0
  12. package/dist/channels/whatsapp/whatsapp-channel.d.ts +39 -0
  13. package/dist/channels/whatsapp/whatsapp-channel.js +198 -0
  14. package/dist/channels/whatsapp/whatsapp-channel.js.map +1 -0
  15. package/dist/cli/commands/discord.js +20 -5
  16. package/dist/cli/commands/discord.js.map +1 -1
  17. package/dist/cli/commands/export.js +5 -4
  18. package/dist/cli/commands/export.js.map +1 -1
  19. package/dist/cli/commands/import.js +5 -4
  20. package/dist/cli/commands/import.js.map +1 -1
  21. package/dist/cli/commands/quota.d.ts +1 -0
  22. package/dist/cli/commands/quota.js +62 -0
  23. package/dist/cli/commands/quota.js.map +1 -0
  24. package/dist/cli/commands/setup.js +120 -137
  25. package/dist/cli/commands/setup.js.map +1 -1
  26. package/dist/cli/commands/start.d.ts +4 -1
  27. package/dist/cli/commands/start.js +49 -38
  28. package/dist/cli/commands/start.js.map +1 -1
  29. package/dist/cli/commands/uninstall.js +9 -10
  30. package/dist/cli/commands/uninstall.js.map +1 -1
  31. package/dist/cli/index.js +30 -8
  32. package/dist/cli/index.js.map +1 -1
  33. package/dist/config/config.d.ts +14 -2
  34. package/dist/config/config.js +38 -18
  35. package/dist/config/config.js.map +1 -1
  36. package/dist/scripts/debug-cli.js +1 -1
  37. package/dist/scripts/debug-cli.js.map +1 -1
  38. package/dist/supervisor/cron-service.d.ts +3 -3
  39. package/dist/supervisor/cron-service.js +4 -4
  40. package/dist/supervisor/cron-service.js.map +1 -1
  41. package/dist/supervisor/gemini-engine.d.ts +4 -4
  42. package/dist/supervisor/gemini-engine.js +15 -10
  43. package/dist/supervisor/gemini-engine.js.map +1 -1
  44. package/dist/supervisor/heartbeat-service.js +1 -1
  45. package/dist/supervisor/heartbeat-service.js.map +1 -1
  46. package/dist/supervisor/main.js +39 -61
  47. package/dist/supervisor/main.js.map +1 -1
  48. package/dist/tools/get-quota.d.ts +11 -0
  49. package/dist/tools/get-quota.js +84 -0
  50. package/dist/tools/get-quota.js.map +1 -0
  51. package/dist/tools/send-discord-message.d.ts +9 -6
  52. package/dist/tools/send-discord-message.js +14 -21
  53. package/dist/tools/send-discord-message.js.map +1 -1
  54. package/dist/tools/send-notification.d.ts +15 -0
  55. package/dist/tools/send-notification.js +51 -0
  56. package/dist/tools/send-notification.js.map +1 -0
  57. package/dist/types/index.d.ts +1 -0
  58. package/dist/utils/brain-audit.js +2 -2
  59. package/dist/utils/brain-audit.js.map +1 -1
  60. package/dist/utils/paths.d.ts +9 -0
  61. package/dist/utils/paths.js +18 -0
  62. package/dist/utils/paths.js.map +1 -0
  63. package/package.json +11 -7
  64. package/src/prompts/system.md +6 -2
  65. package/dist/discord/discord-bot.d.ts +0 -37
  66. package/dist/discord/discord-bot.js +0 -205
  67. package/dist/discord/discord-bot.js.map +0 -1
  68. package/dist/discord/message-formatter.js.map +0 -1
  69. /package/dist/{discord → channels/discord}/message-formatter.d.ts +0 -0
  70. /package/dist/{discord → channels/discord}/message-formatter.js +0 -0
@@ -0,0 +1,198 @@
1
+ import makeWASocket, { useMultiFileAuthState, DisconnectReason, downloadMediaMessage } from '@whiskeysockets/baileys';
2
+ import qrcode from 'qrcode-terminal';
3
+ import path from 'path';
4
+ import fs from 'fs';
5
+ import { Config } from '../../config/config.js';
6
+ import logger from '../../utils/logger.js';
7
+ import { AttachmentProcessor } from '../../utils/attachment-processor.js';
8
+ /**
9
+ * WhatsApp Channel Implementation using Baileys
10
+ */
11
+ export class WhatsAppChannel {
12
+ id = 'whatsapp';
13
+ config;
14
+ processor;
15
+ sock;
16
+ messageHandler;
17
+ isConnected = false;
18
+ constructor() {
19
+ this.config = Config.getInstance();
20
+ this.processor = new AttachmentProcessor(this.config);
21
+ }
22
+ get isEnabled() {
23
+ const whatsappConfig = this.config.channels.whatsapp;
24
+ return !!(whatsappConfig && whatsappConfig.enabled);
25
+ }
26
+ /**
27
+ * Start the WhatsApp connection
28
+ */
29
+ async start() {
30
+ if (!this.isEnabled) {
31
+ logger.info('WhatsApp channel is disabled.');
32
+ return;
33
+ }
34
+ const sessionDir = path.join(this.config.homeDir, 'data', 'whatsapp-session');
35
+ if (!fs.existsSync(sessionDir)) {
36
+ fs.mkdirSync(sessionDir, { recursive: true });
37
+ }
38
+ const { state, saveCreds } = await useMultiFileAuthState(sessionDir);
39
+ this.sock = makeWASocket({
40
+ auth: state,
41
+ printQRInTerminal: true,
42
+ browser: ['Tars', 'Chrome', '1.0.0']
43
+ });
44
+ this.sock.ev.on('creds.update', saveCreds);
45
+ this.sock.ev.on('connection.update', (update) => {
46
+ const { connection, lastDisconnect, qr } = update;
47
+ if (qr) {
48
+ logger.info('📱 Scan the QR code below to link WhatsApp:');
49
+ if (process.env.name === 'tars-supervisor') {
50
+ logger.warn('⚠️ Tars is running in the background. Please use "tars logs" to view the full QR code in your terminal.');
51
+ }
52
+ qrcode.generate(qr, { small: true });
53
+ }
54
+ if (connection === 'close') {
55
+ const shouldReconnect = lastDisconnect?.error?.output?.statusCode !==
56
+ DisconnectReason.loggedOut;
57
+ logger.warn(`WhatsApp connection closed. Reconnecting: ${shouldReconnect}`);
58
+ this.isConnected = false;
59
+ if (shouldReconnect) {
60
+ this.start();
61
+ }
62
+ }
63
+ else if (connection === 'open') {
64
+ logger.info('✅ WhatsApp channel connected and ready.');
65
+ this.isConnected = true;
66
+ }
67
+ });
68
+ this.sock.ev.on('messages.upsert', async (m) => {
69
+ if (m.type === 'notify') {
70
+ for (const msg of m.messages) {
71
+ if (!msg.key.fromMe && msg.message) {
72
+ await this.handleIncomingMessage(msg);
73
+ }
74
+ }
75
+ }
76
+ });
77
+ }
78
+ /**
79
+ * Stop the WhatsApp connection
80
+ */
81
+ async stop() {
82
+ if (this.sock) {
83
+ await this.sock.logout();
84
+ this.sock = null;
85
+ this.isConnected = false;
86
+ }
87
+ }
88
+ /**
89
+ * Send a proactive notification
90
+ */
91
+ async notify(content, attachments) {
92
+ const ownerNumber = this.config.channels.whatsapp?.ownerNumber;
93
+ if (!ownerNumber || !this.isConnected)
94
+ return;
95
+ const jid = `${ownerNumber}@s.whatsapp.net`;
96
+ await this.sendMessageWithAttachments(jid, content, attachments);
97
+ }
98
+ /**
99
+ * Register message handler
100
+ */
101
+ onMessage(handler) {
102
+ this.messageHandler = handler;
103
+ }
104
+ /**
105
+ * Internal handler for incoming WhatsApp messages
106
+ */
107
+ async handleIncomingMessage(msg) {
108
+ if (!this.messageHandler)
109
+ return;
110
+ const jid = msg.key.remoteJid;
111
+ const ownerNumber = this.config.channels.whatsapp?.ownerNumber;
112
+ // Security: Only respond to the owner if configured
113
+ if (ownerNumber && !jid.startsWith(ownerNumber)) {
114
+ logger.warn(`WhatsApp: Ignored message from unauthorized sender: ${jid}`);
115
+ return;
116
+ }
117
+ const text = msg.message?.conversation ||
118
+ msg.message?.extendedTextMessage?.text ||
119
+ msg.message?.imageMessage?.caption ||
120
+ msg.message?.videoMessage?.caption ||
121
+ '';
122
+ const attachments = [];
123
+ const messageType = Object.keys(msg.message)[0];
124
+ // Handle Media Attachments
125
+ if (['imageMessage', 'videoMessage', 'documentMessage', 'audioMessage'].includes(messageType)) {
126
+ try {
127
+ const buffer = await downloadMediaMessage(msg, 'buffer', {});
128
+ const mimeType = msg.message[messageType].mimetype;
129
+ const fileName = msg.message[messageType].fileName || `wa_media_${Date.now()}`;
130
+ // Save to temporary file
131
+ const filePath = path.join(this.config.homeDir, 'data', 'uploads', fileName);
132
+ fs.writeFileSync(filePath, buffer);
133
+ attachments.push({
134
+ path: filePath,
135
+ mimeType: mimeType
136
+ });
137
+ }
138
+ catch (err) {
139
+ logger.error(`Failed to download WhatsApp media: ${err.message}`);
140
+ }
141
+ }
142
+ if (!text && attachments.length === 0)
143
+ return;
144
+ const channelMessage = {
145
+ content: text,
146
+ senderId: jid,
147
+ senderName: msg.pushName || 'WhatsApp User',
148
+ channelId: jid,
149
+ attachments,
150
+ reply: async (response, outAttachments) => {
151
+ await this.sendMessageWithAttachments(jid, response, outAttachments);
152
+ }
153
+ };
154
+ await this.messageHandler(channelMessage);
155
+ }
156
+ /**
157
+ * Helper to send message with optional attachments
158
+ */
159
+ async sendMessageWithAttachments(jid, content, attachments) {
160
+ if (!this.sock)
161
+ return;
162
+ // Send text message first
163
+ await this.sock.sendMessage(jid, { text: content });
164
+ // Send attachments if any
165
+ if (attachments && attachments.length > 0) {
166
+ for (const filePath of attachments) {
167
+ const mimeType = this.getMimeType(filePath);
168
+ if (mimeType.startsWith('image/')) {
169
+ await this.sock.sendMessage(jid, { image: { url: filePath } });
170
+ }
171
+ else if (mimeType.startsWith('video/')) {
172
+ await this.sock.sendMessage(jid, { video: { url: filePath } });
173
+ }
174
+ else {
175
+ await this.sock.sendMessage(jid, {
176
+ document: { url: filePath },
177
+ fileName: path.basename(filePath),
178
+ mimetype: mimeType
179
+ });
180
+ }
181
+ }
182
+ }
183
+ }
184
+ getMimeType(filePath) {
185
+ const ext = path.extname(filePath).toLowerCase();
186
+ const map = {
187
+ '.png': 'image/png',
188
+ '.jpg': 'image/jpeg',
189
+ '.jpeg': 'image/jpeg',
190
+ '.gif': 'image/gif',
191
+ '.mp4': 'video/mp4',
192
+ '.pdf': 'application/pdf',
193
+ '.txt': 'text/plain'
194
+ };
195
+ return map[ext] || 'application/octet-stream';
196
+ }
197
+ }
198
+ //# sourceMappingURL=whatsapp-channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp-channel.js","sourceRoot":"","sources":["../../../src/channels/whatsapp/whatsapp-channel.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,EAAE,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EAGvB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAG3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E;;GAEG;AACH,MAAM,OAAO,eAAe;IACR,EAAE,GAAG,UAAU,CAAC;IACf,MAAM,CAAS;IACf,SAAS,CAAsB;IACxC,IAAI,CAAM;IACV,cAAc,CAA8C;IAC5D,WAAW,GAAG,KAAK,CAAC;IAE5B;QACI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,CAAC,SAAS,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,SAAS;QACT,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACrD,OAAO,CAAC,CAAC,CAAC,cAAc,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACP,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC7C,OAAO;QACX,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;QAC9E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAErE,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;YACrB,IAAI,EAAE,KAAK;YACX,iBAAiB,EAAE,IAAI;YACvB,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC;SACvC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QAE3C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,MAAW,EAAE,EAAE;YACjD,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;YAElD,IAAI,EAAE,EAAE,CAAC;gBACL,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;gBAC3D,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;oBACzC,MAAM,CAAC,IAAI,CACP,yGAAyG,CAC5G,CAAC;gBACN,CAAC;gBACD,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,CAAC;YAED,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;gBACzB,MAAM,eAAe,GAChB,cAAc,EAAE,KAAc,EAAE,MAAM,EAAE,UAAU;oBACnD,gBAAgB,CAAC,SAAS,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,6CAA6C,eAAe,EAAE,CAAC,CAAC;gBAC5E,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,IAAI,eAAe,EAAE,CAAC;oBAClB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACjB,CAAC;YACL,CAAC;iBAAM,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;gBACvD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YAC5B,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAA0C,EAAE,EAAE;YACpF,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;oBAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;wBACjC,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;oBAC1C,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACN,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC7B,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,WAAsB;QAChD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;QAC/D,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAE9C,MAAM,GAAG,GAAG,GAAG,WAAW,iBAAiB,CAAC;QAC5C,MAAM,IAAI,CAAC,0BAA0B,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,OAAmD;QACzD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;IAClC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,qBAAqB,CAAC,GAAc;QAC9C,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QAEjC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,SAAU,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;QAE/D,oDAAoD;QACpD,IAAI,WAAW,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,uDAAuD,GAAG,EAAE,CAAC,CAAC;YAC1E,OAAO;QACX,CAAC;QAED,MAAM,IAAI,GACN,GAAG,CAAC,OAAO,EAAE,YAAY;YACzB,GAAG,CAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI;YACtC,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO;YAClC,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO;YAClC,EAAE,CAAC;QAEP,MAAM,WAAW,GAAwB,EAAE,CAAC;QAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjD,2BAA2B;QAC3B,IACI,CAAC,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,cAAc,CAAC,CAAC,QAAQ,CACxE,WAAW,CACd,EACH,CAAC;YACC,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAC7D,MAAM,QAAQ,GAAI,GAAG,CAAC,OAAe,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC;gBAC5D,MAAM,QAAQ,GACT,GAAG,CAAC,OAAe,CAAC,WAAW,CAAC,CAAC,QAAQ,IAAI,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBAE3E,yBAAyB;gBACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAC7E,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAEnC,WAAW,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,QAAQ;iBACrB,CAAC,CAAC;YACP,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,MAAM,CAAC,KAAK,CAAC,sCAAsC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACtE,CAAC;QACL,CAAC;QAED,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE9C,MAAM,cAAc,GAAmB;YACnC,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,GAAG;YACb,UAAU,EAAE,GAAG,CAAC,QAAQ,IAAI,eAAe;YAC3C,SAAS,EAAE,GAAG;YACd,WAAW;YACX,KAAK,EAAE,KAAK,EAAE,QAAgB,EAAE,cAAyB,EAAE,EAAE;gBACzD,MAAM,IAAI,CAAC,0BAA0B,CAAC,GAAG,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;YACzE,CAAC;SACJ,CAAC;QAEF,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,0BAA0B,CACpC,GAAW,EACX,OAAe,EACf,WAAsB;QAEtB,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO;QAEvB,0BAA0B;QAC1B,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAEpD,0BAA0B;QAC1B,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;gBACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAC5C,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAChC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACnE,CAAC;qBAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACvC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACnE,CAAC;qBAAM,CAAC;oBACJ,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE;wBAC7B,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE;wBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;wBACjC,QAAQ,EAAE,QAAQ;qBACrB,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAEO,WAAW,CAAC,QAAgB;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACjD,MAAM,GAAG,GAA2B;YAChC,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,YAAY;YACpB,OAAO,EAAE,YAAY;YACrB,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,iBAAiB;YACzB,MAAM,EAAE,YAAY;SACvB,CAAC;QACF,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;IAClD,CAAC;CACJ"}
@@ -1,13 +1,28 @@
1
1
  import chalk from 'chalk';
2
+ import path from 'path';
3
+ import fs from 'fs';
4
+ import { getTarsHome } from '../../utils/paths.js';
2
5
  /**
3
6
  * tars discord - Display Discord setup and invitation instructions
4
7
  */
5
8
  export async function discord() {
6
- console.log(chalk.bold.cyan('\n💬 Discord Setup & Invitation Guide'));
9
+ const tarsHome = getTarsHome();
10
+ let assistantName = 'Tars';
11
+ try {
12
+ const configPath = path.join(tarsHome, 'config.json');
13
+ if (fs.existsSync(configPath)) {
14
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
15
+ if (config.assistantName) {
16
+ assistantName = config.assistantName;
17
+ }
18
+ }
19
+ }
20
+ catch (e) { }
21
+ console.log(chalk.bold.cyan(`\n💬 Discord Setup & Invitation Guide (${assistantName})`));
7
22
  console.log(chalk.cyan('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
8
23
  console.log(chalk.bold('\n1. 🛠️ Configure your Bot Application'));
9
24
  console.log(chalk.white(' • Go to: ') + chalk.blue('https://discord.com/developers/applications'));
10
- console.log(chalk.white(' • Select your Tars application.'));
25
+ console.log(chalk.white(` • Select your ${assistantName} application.`));
11
26
  console.log(chalk.white(' • Click ') + chalk.bold('Bot') + chalk.white(' in the sidebar.'));
12
27
  console.log(chalk.white(' • Toggle ') +
13
28
  chalk.bold.red('Message Content Intent') +
@@ -37,11 +52,11 @@ export async function discord() {
37
52
  chalk.italic("(Don't have a server? Create one in Discord first by clicking the [+] icon in your server list)"));
38
53
  console.log(chalk.white(' • Click ') + chalk.bold('Authorize') + chalk.white('.'));
39
54
  console.log(chalk.bold('\n4. ✅ Verify Installation'));
40
- console.log(chalk.white('Tars should appear in your member list.'));
41
- console.log(chalk.white(' • Once Tars is running (via ') +
55
+ console.log(chalk.white(`${assistantName} should appear in your member list.`));
56
+ console.log(chalk.white(` • Once ${assistantName} is running (via `) +
42
57
  chalk.cyan('tars start') +
43
58
  chalk.white('), type ') +
44
- chalk.bold('!tars hello') +
59
+ chalk.bold(`!${assistantName.toLowerCase()} hello`) +
45
60
  chalk.white(' to test.'));
46
61
  console.log('\n');
47
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"discord.js","sourceRoot":"","sources":["../../../src/cli/commands/discord.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discord.js","sourceRoot":"","sources":["../../../src/cli/commands/discord.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { spawn } from 'child_process';
2
2
  import chalk from 'chalk';
3
3
  import path from 'path';
4
- import os from 'os';
4
+ import { getTarsHome } from '../../utils/paths.js';
5
5
  export async function exportBrain(options) {
6
6
  const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
7
7
  const defaultName = `tars-brain-${timestamp}.tar.gz`;
@@ -9,8 +9,9 @@ export async function exportBrain(options) {
9
9
  ? path.resolve(options.output)
10
10
  : path.join(process.cwd(), defaultName);
11
11
  console.log(chalk.cyan(`📦 Exporting Tars brain to ${outputPath}...`));
12
- const tarsHome = path.join(os.homedir(), '.tars');
13
- const geminiHome = path.join(os.homedir(), '.gemini');
12
+ const tarsHome = getTarsHome();
13
+ const parentDir = path.dirname(tarsHome);
14
+ const baseName = path.basename(tarsHome);
14
15
  // Exclude heavy directories to keep the brain lean
15
16
  const excludes = [
16
17
  '--exclude=node_modules',
@@ -24,7 +25,7 @@ export async function exportBrain(options) {
24
25
  '--exclude=vendor', // PHP/Go
25
26
  '--exclude=.sass-cache'
26
27
  ];
27
- const tar = spawn('tar', ['-czf', outputPath, ...excludes, '-C', os.homedir(), '.tars']);
28
+ const tar = spawn('tar', ['-czf', outputPath, ...excludes, '-C', parentDir, baseName]);
28
29
  tar.stderr.on('data', (data) => console.warn(chalk.yellow(data.toString())));
29
30
  tar.on('close', (code) => {
30
31
  if (code === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA4B;IAC1D,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9E,MAAM,WAAW,GAAG,cAAc,SAAS,SAAS,CAAC;IACrD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM;QAC7B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,UAAU,KAAK,CAAC,CAAC,CAAC;IAEvE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IAEtD,mDAAmD;IACnD,MAAM,QAAQ,GAAG;QACb,wBAAwB;QACxB,iBAAiB;QACjB,gBAAgB;QAChB,iBAAiB;QACjB,kBAAkB;QAClB,gBAAgB;QAChB,iBAAiB;QACjB,kBAAkB,EAAE,OAAO;QAC3B,kBAAkB,EAAE,SAAS;QAC7B,uBAAuB;KAC1B,CAAC;IAEF,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAEzF,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAE7E,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QACrB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACnD,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA4B;IAC1D,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9E,MAAM,WAAW,GAAG,cAAc,SAAS,SAAS,CAAC;IACrD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM;QAC7B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,UAAU,KAAK,CAAC,CAAC,CAAC;IAEvE,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEzC,mDAAmD;IACnD,MAAM,QAAQ,GAAG;QACb,wBAAwB;QACxB,iBAAiB;QACjB,gBAAgB;QAChB,iBAAiB;QACjB,kBAAkB;QAClB,gBAAgB;QAChB,iBAAiB;QACjB,kBAAkB,EAAE,OAAO;QAC3B,kBAAkB,EAAE,SAAS;QAC7B,uBAAuB;KAC1B,CAAC;IAEF,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEvF,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAE7E,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QACrB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACnD,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,14 +1,15 @@
1
1
  import { spawn } from 'child_process';
2
2
  import chalk from 'chalk';
3
- import os from 'os';
4
3
  import path from 'path';
5
4
  import { BrainAuditor } from '../../utils/brain-audit.js';
5
+ import { getTarsHome } from '../../utils/paths.js';
6
6
  export async function importBrain(archivePath) {
7
7
  const fullPath = path.resolve(archivePath);
8
- const homeDir = os.homedir();
8
+ const tarsHome = getTarsHome();
9
+ const parentDir = path.dirname(tarsHome);
9
10
  console.log(chalk.cyan(`📥 Importing Tars brain from ${fullPath}...`));
10
- // 1. Extract the archive
11
- const tar = spawn('tar', ['-xzf', fullPath, '-C', homeDir]);
11
+ // 1. Extract the archive into the parent directory
12
+ const tar = spawn('tar', ['-xzf', fullPath, '-C', parentDir]);
12
13
  tar.stderr.on('data', (data) => console.warn(chalk.yellow(data.toString())));
13
14
  return new Promise((resolve) => {
14
15
  tar.on('close', async (code) => {
@@ -1 +1 @@
1
- {"version":3,"file":"import.js","sourceRoot":"","sources":["../../../src/cli/commands/import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAE7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,QAAQ,KAAK,CAAC,CAAC,CAAC;IAEvE,yBAAyB;IACzB,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAE5D,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAE7E,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACjC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC3B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CACT,KAAK,CAAC,GAAG,CAAC,2DAA2D,CAAC,CACzE,CAAC;gBACF,OAAO,EAAE,CAAC;gBACV,OAAO;YACX,CAAC;YAED,mCAAmC;YACnC,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;YACnC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YACjF,OAAO,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../../src/cli/commands/import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,QAAQ,KAAK,CAAC,CAAC,CAAC;IAEvE,mDAAmD;IACnD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAE9D,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAE7E,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACjC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC3B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CACT,KAAK,CAAC,GAAG,CAAC,2DAA2D,CAAC,CACzE,CAAC;gBACF,OAAO,EAAE,CAAC;gBACV,OAAO;YACX,CAAC;YAED,mCAAmC;YACnC,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;YACnC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YACjF,OAAO,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function quota(): Promise<void>;
@@ -0,0 +1,62 @@
1
+ import chalk from 'chalk';
2
+ import { Config } from '../../config/config.js';
3
+ import { GeminiEngine } from '../../supervisor/gemini-engine.js';
4
+ import ora from 'ora';
5
+ export async function quota() {
6
+ const config = Config.getInstance();
7
+ const engine = new GeminiEngine(config);
8
+ const spinner = ora('Retrieving model quotas...').start();
9
+ try {
10
+ await engine.initialize();
11
+ // @ts-ignore - access private coreConfig
12
+ const coreConfig = engine.coreConfig;
13
+ if (!coreConfig) {
14
+ spinner.fail(chalk.red('Failed to initialize Gemini Core configuration.'));
15
+ return;
16
+ }
17
+ const quotaResult = await coreConfig.refreshUserQuota();
18
+ if (!quotaResult || !quotaResult.buckets) {
19
+ spinner.info(chalk.yellow('No quota information available.'));
20
+ console.log(chalk.dim('\nPossible reasons:'));
21
+ console.log(chalk.dim('1. Current auth method does not support quota tracking (e.g. legacy auth).'));
22
+ console.log(chalk.dim('2. Code Assist server is not reachable.'));
23
+ console.log(chalk.dim('3. You are not using a Google Cloud project for authentication.\n'));
24
+ return;
25
+ }
26
+ spinner.stop();
27
+ const activeModel = coreConfig.getActiveModel();
28
+ console.log(chalk.cyan.bold('\n📊 Gemini Model Quotas'));
29
+ console.log(chalk.cyan('──────────────────────'));
30
+ const buckets = quotaResult.buckets;
31
+ const relevantBuckets = buckets.filter((b) => b.modelId && b.modelId.includes('gemini'));
32
+ for (const bucket of relevantBuckets) {
33
+ const isActive = bucket.modelId === activeModel;
34
+ const modelLabel = isActive
35
+ ? chalk.green.bold(bucket.modelId + ' (Active)')
36
+ : chalk.white(bucket.modelId);
37
+ console.log(`${chalk.green('•')} ${modelLabel}`);
38
+ if (bucket.remainingFraction != null) {
39
+ const fraction = bucket.remainingFraction;
40
+ const percent = (fraction * 100).toFixed(1);
41
+ let color = chalk.green;
42
+ if (fraction < 0.2)
43
+ color = chalk.red;
44
+ else if (fraction < 0.5)
45
+ color = chalk.yellow;
46
+ console.log(` ${chalk.dim('Remaining:')} ${color(percent + '%')}`);
47
+ }
48
+ if (bucket.remainingAmount) {
49
+ console.log(` ${chalk.dim('Amount:')} ${bucket.remainingAmount}`);
50
+ }
51
+ if (bucket.resetTime) {
52
+ const reset = new Date(bucket.resetTime);
53
+ console.log(` ${chalk.dim('Resets:')} ${reset.toLocaleString()}`);
54
+ }
55
+ console.log('');
56
+ }
57
+ }
58
+ catch (error) {
59
+ spinner.fail(chalk.red(`Error retrieving quota: ${error.message}`));
60
+ }
61
+ }
62
+ //# sourceMappingURL=quota.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota.js","sourceRoot":"","sources":["../../../src/cli/commands/quota.ts"],"names":[],"mappings":"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"}