@saccolabs/tars 1.0.52 → 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.
- package/README.md +10 -7
- package/context/skills/tars-ops/SKILL.md +24 -12
- package/dist/channels/channel-manager.d.ts +35 -0
- package/dist/channels/channel-manager.js +100 -0
- package/dist/channels/channel-manager.js.map +1 -0
- package/dist/channels/discord/discord-channel.d.ts +41 -0
- package/dist/channels/discord/discord-channel.js +199 -0
- package/dist/channels/discord/discord-channel.js.map +1 -0
- package/dist/channels/discord/message-formatter.js.map +1 -0
- package/dist/channels/types.d.ts +35 -0
- package/dist/channels/types.js +2 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/channels/whatsapp/whatsapp-channel.d.ts +39 -0
- package/dist/channels/whatsapp/whatsapp-channel.js +198 -0
- package/dist/channels/whatsapp/whatsapp-channel.js.map +1 -0
- package/dist/cli/commands/discord.js +20 -5
- package/dist/cli/commands/discord.js.map +1 -1
- package/dist/cli/commands/export.js +5 -4
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/import.js +5 -4
- package/dist/cli/commands/import.js.map +1 -1
- package/dist/cli/commands/quota.d.ts +1 -0
- package/dist/cli/commands/quota.js +62 -0
- package/dist/cli/commands/quota.js.map +1 -0
- package/dist/cli/commands/setup.js +120 -137
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/start.d.ts +4 -1
- package/dist/cli/commands/start.js +49 -38
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/uninstall.js +9 -10
- package/dist/cli/commands/uninstall.js.map +1 -1
- package/dist/cli/index.js +30 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/config/config.d.ts +14 -2
- package/dist/config/config.js +38 -18
- package/dist/config/config.js.map +1 -1
- package/dist/scripts/debug-cli.js +1 -1
- package/dist/scripts/debug-cli.js.map +1 -1
- package/dist/supervisor/cron-service.d.ts +3 -3
- package/dist/supervisor/cron-service.js +4 -4
- package/dist/supervisor/cron-service.js.map +1 -1
- package/dist/supervisor/gemini-engine.d.ts +4 -4
- package/dist/supervisor/gemini-engine.js +15 -10
- package/dist/supervisor/gemini-engine.js.map +1 -1
- package/dist/supervisor/heartbeat-service.js +1 -1
- package/dist/supervisor/heartbeat-service.js.map +1 -1
- package/dist/supervisor/main.js +39 -61
- package/dist/supervisor/main.js.map +1 -1
- package/dist/tools/get-quota.d.ts +11 -0
- package/dist/tools/get-quota.js +84 -0
- package/dist/tools/get-quota.js.map +1 -0
- package/dist/tools/send-discord-message.d.ts +9 -6
- package/dist/tools/send-discord-message.js +14 -17
- package/dist/tools/send-discord-message.js.map +1 -1
- package/dist/tools/send-notification.d.ts +15 -0
- package/dist/tools/send-notification.js +51 -0
- package/dist/tools/send-notification.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/utils/brain-audit.js +2 -2
- package/dist/utils/brain-audit.js.map +1 -1
- package/dist/utils/paths.d.ts +9 -0
- package/dist/utils/paths.js +18 -0
- package/dist/utils/paths.js.map +1 -0
- package/extensions/memory/gemini-extension.json +2 -4
- package/extensions/tasks/gemini-extension.json +2 -4
- package/package.json +12 -8
- package/src/prompts/system.md +7 -2
- package/dist/discord/discord-bot.d.ts +0 -37
- package/dist/discord/discord-bot.js +0 -205
- package/dist/discord/discord-bot.js.map +0 -1
- package/dist/discord/message-formatter.js.map +0 -1
- /package/dist/{discord → channels/discord}/message-formatter.d.ts +0 -0
- /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":"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"}
|
|
@@ -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
|
-
|
|
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(
|
|
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(
|
|
41
|
-
console.log(chalk.white(
|
|
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(
|
|
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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
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
|
|
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 =
|
|
13
|
-
const
|
|
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',
|
|
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;
|
|
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
|
|
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',
|
|
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;
|
|
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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"}
|