@saccolabs/tars 1.0.7
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 +93 -0
- package/context/GEMINI.md +13 -0
- package/context/config/settings.json-template +36 -0
- package/context/skills/create-extension/SKILL.md +90 -0
- package/context/skills/create-skill/SKILL.md +33 -0
- package/context/skills/manage-extensions/SKILL.md +69 -0
- package/context/skills/tars-ops/SKILL.md +89 -0
- package/dist/cli/commands/discord.d.ts +4 -0
- package/dist/cli/commands/discord.js +48 -0
- package/dist/cli/commands/discord.js.map +1 -0
- package/dist/cli/commands/export.d.ts +3 -0
- package/dist/cli/commands/export.js +39 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/import.d.ts +1 -0
- package/dist/cli/commands/import.js +45 -0
- package/dist/cli/commands/import.js.map +1 -0
- package/dist/cli/commands/logs.d.ts +4 -0
- package/dist/cli/commands/logs.js +23 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/memory.d.ts +1 -0
- package/dist/cli/commands/memory.js +35 -0
- package/dist/cli/commands/memory.js.map +1 -0
- package/dist/cli/commands/secret.d.ts +6 -0
- package/dist/cli/commands/secret.js +46 -0
- package/dist/cli/commands/secret.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +4 -0
- package/dist/cli/commands/setup.js +329 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/start.d.ts +1 -0
- package/dist/cli/commands/start.js +42 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.js +56 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +1 -0
- package/dist/cli/commands/stop.js +38 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/uninstall.d.ts +1 -0
- package/dist/cli/commands/uninstall.js +91 -0
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +54 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/config.d.ts +14 -0
- package/dist/config/config.js +69 -0
- package/dist/config/config.js.map +1 -0
- package/dist/discord/discord-bot.d.ts +32 -0
- package/dist/discord/discord-bot.js +151 -0
- package/dist/discord/discord-bot.js.map +1 -0
- package/dist/discord/message-formatter.d.ts +95 -0
- package/dist/discord/message-formatter.js +448 -0
- package/dist/discord/message-formatter.js.map +1 -0
- package/dist/memory/knowledge-store.d.ts +24 -0
- package/dist/memory/knowledge-store.js +126 -0
- package/dist/memory/knowledge-store.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +24 -0
- package/dist/memory/memory-manager.js +101 -0
- package/dist/memory/memory-manager.js.map +1 -0
- package/dist/scripts/debug-cli.d.ts +1 -0
- package/dist/scripts/debug-cli.js +52 -0
- package/dist/scripts/debug-cli.js.map +1 -0
- package/dist/supervisor/gemini-cli.d.ts +28 -0
- package/dist/supervisor/gemini-cli.js +315 -0
- package/dist/supervisor/gemini-cli.js.map +1 -0
- package/dist/supervisor/heartbeat-service.d.ts +21 -0
- package/dist/supervisor/heartbeat-service.js +143 -0
- package/dist/supervisor/heartbeat-service.js.map +1 -0
- package/dist/supervisor/main.d.ts +1 -0
- package/dist/supervisor/main.js +242 -0
- package/dist/supervisor/main.js.map +1 -0
- package/dist/supervisor/session-manager.d.ts +47 -0
- package/dist/supervisor/session-manager.js +118 -0
- package/dist/supervisor/session-manager.js.map +1 -0
- package/dist/supervisor/supervisor.d.ts +32 -0
- package/dist/supervisor/supervisor.js +98 -0
- package/dist/supervisor/supervisor.js.map +1 -0
- package/dist/types/index.d.ts +42 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/attachment-processor.d.ts +22 -0
- package/dist/utils/attachment-processor.js +79 -0
- package/dist/utils/attachment-processor.js.map +1 -0
- package/dist/utils/logger.d.ts +6 -0
- package/dist/utils/logger.js +15 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/secrets-manager.d.ts +27 -0
- package/dist/utils/secrets-manager.js +79 -0
- package/dist/utils/secrets-manager.js.map +1 -0
- package/dist/utils/version.d.ts +3 -0
- package/dist/utils/version.js +23 -0
- package/dist/utils/version.js.map +1 -0
- package/extensions/tasks/gemini-extension.json +14 -0
- package/extensions/tasks/package-lock.json +1209 -0
- package/extensions/tasks/package.json +19 -0
- package/extensions/tasks/src/server.ts +265 -0
- package/extensions/tasks/src/store.ts +92 -0
- package/extensions/tasks/tsconfig.json +14 -0
- package/package.json +55 -0
- package/src/prompts/system.md +25 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { Config } from '../../config/config.js';
|
|
3
|
+
import { MemoryManager } from '../../memory/memory-manager.js';
|
|
4
|
+
export async function memory(action, ...args) {
|
|
5
|
+
const config = Config.getInstance();
|
|
6
|
+
const manager = new MemoryManager(config);
|
|
7
|
+
switch (action) {
|
|
8
|
+
case 'search':
|
|
9
|
+
const query = args.join(' ');
|
|
10
|
+
if (!query) {
|
|
11
|
+
console.error(chalk.red('ā Please provide a search query.'));
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const results = await manager.search(query);
|
|
15
|
+
if (results.length === 0) {
|
|
16
|
+
console.log(chalk.yellow('No matching memories found.'));
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
console.log(chalk.cyan(`\nš§ Search Results for: "${query}"`));
|
|
20
|
+
results.forEach((r, i) => {
|
|
21
|
+
console.log(chalk.white(`\n[${i + 1}] ${chalk.bold(r.path)} (Score: ${r.score.toFixed(2)})`));
|
|
22
|
+
console.log(chalk.gray(r.content));
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
break;
|
|
26
|
+
case 'sync':
|
|
27
|
+
console.log(chalk.cyan('š Syncing knowledge base...'));
|
|
28
|
+
await manager.fullSync();
|
|
29
|
+
console.log(chalk.green('ā
Sync complete.'));
|
|
30
|
+
break;
|
|
31
|
+
default:
|
|
32
|
+
console.error(chalk.red(`ā Unknown action: ${action}`));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/cli/commands/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,MAAc,EAAE,GAAG,IAAc;IAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAE1C,QAAQ,MAAM,EAAE,CAAC;QACb,KAAK,QAAQ;YACT,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;gBAC7D,OAAO;YACX,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC/D,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBACrB,OAAO,CAAC,GAAG,CACP,KAAK,CAAC,KAAK,CACP,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACtE,CACJ,CAAC;oBACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;gBACvC,CAAC,CAAC,CAAC;YACP,CAAC;YACD,MAAM;QAEV,KAAK,MAAM;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACxD,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC7C,MAAM;QAEV;YACI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC,CAAC;IAChE,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { SecretsManager } from '../../utils/secrets-manager.js';
|
|
3
|
+
import { Config } from '../../config/config.js';
|
|
4
|
+
/**
|
|
5
|
+
* tars secret set <KEY> <VALUE>
|
|
6
|
+
* tars secret list
|
|
7
|
+
* tars secret remove <KEY>
|
|
8
|
+
*/
|
|
9
|
+
export async function secret(action, key, value) {
|
|
10
|
+
const config = Config.getInstance();
|
|
11
|
+
const secretsManager = new SecretsManager(config.homeDir);
|
|
12
|
+
switch (action) {
|
|
13
|
+
case 'set':
|
|
14
|
+
if (!key || !value) {
|
|
15
|
+
console.log(chalk.red('ā Usage: tars secret set <KEY> <VALUE>'));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
secretsManager.set(key, value);
|
|
19
|
+
console.log(chalk.green(`ā
Secret ${chalk.bold(key)} stored securely.`));
|
|
20
|
+
console.log(chalk.dim('Tars supervisor will need to restart to pick up the change.'));
|
|
21
|
+
break;
|
|
22
|
+
case 'list':
|
|
23
|
+
const keys = secretsManager.list();
|
|
24
|
+
if (keys.length === 0) {
|
|
25
|
+
console.log(chalk.yellow('No secrets stored.'));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
console.log(chalk.cyan.bold('\nš Stored Secrets (Keys only)'));
|
|
29
|
+
console.log(chalk.cyan('āāāāāāāāāāāāāāāāāāāāāāāāāā'));
|
|
30
|
+
keys.forEach((k) => console.log(`- ${k}`));
|
|
31
|
+
console.log('');
|
|
32
|
+
break;
|
|
33
|
+
case 'remove':
|
|
34
|
+
if (!key) {
|
|
35
|
+
console.log(chalk.red('ā Usage: tars secret remove <KEY>'));
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
secretsManager.remove(key);
|
|
39
|
+
console.log(chalk.green(`ā
Secret ${chalk.bold(key)} removed.`));
|
|
40
|
+
break;
|
|
41
|
+
default:
|
|
42
|
+
console.log(chalk.red(`ā Unknown action: ${action}`));
|
|
43
|
+
console.log(chalk.dim('Try: set, list, remove'));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=secret.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret.js","sourceRoot":"","sources":["../../../src/cli/commands/secret.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,MAAc,EAAE,GAAY,EAAE,KAAc;IACrE,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE1D,QAAQ,MAAM,EAAE,CAAC;QACb,KAAK,KAAK;YACN,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;gBACjE,OAAO;YACX,CAAC;YACD,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC,CAAC;YACtF,MAAM;QAEV,KAAK,MAAM;YACP,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAChD,OAAO;YACX,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM;QAEV,KAAK,QAAQ;YACT,IAAI,CAAC,GAAG,EAAE,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;gBAC5D,OAAO;YACX,CAAC;YACD,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;YACjE,MAAM;QAEV;YACI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACzD,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { execSync, spawnSync } from 'child_process';
|
|
5
|
+
import fs from 'fs/promises';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import os from 'os';
|
|
8
|
+
import { Client, GatewayIntentBits } from 'discord.js';
|
|
9
|
+
import { existsSync } from 'fs';
|
|
10
|
+
/**
|
|
11
|
+
* Check if gemini CLI is installed and user is authenticated
|
|
12
|
+
*/
|
|
13
|
+
function checkGeminiAuth() {
|
|
14
|
+
try {
|
|
15
|
+
// First check if gemini is installed
|
|
16
|
+
execSync('which gemini', { encoding: 'utf-8' });
|
|
17
|
+
// Check for credentials file directly (faster/reliable)
|
|
18
|
+
const credsPath = path.join(os.homedir(), '.gemini', 'oauth_creds.json');
|
|
19
|
+
if (existsSync(credsPath)) {
|
|
20
|
+
return { installed: true, loggedIn: true };
|
|
21
|
+
}
|
|
22
|
+
// Fallback to CLI command if file check fails
|
|
23
|
+
const result = execSync('gemini auth print-access-token 2>&1', {
|
|
24
|
+
encoding: 'utf-8',
|
|
25
|
+
timeout: 3000
|
|
26
|
+
});
|
|
27
|
+
if (result && !result.includes('error') && !result.includes('not logged in')) {
|
|
28
|
+
return { installed: true, loggedIn: true };
|
|
29
|
+
}
|
|
30
|
+
return { installed: true, loggedIn: false };
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
return { installed: false, loggedIn: false };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* tars setup - The Onboarding Wizard
|
|
38
|
+
*/
|
|
39
|
+
export async function setup() {
|
|
40
|
+
console.log(chalk.cyan.bold('\nš¤ Welcome to Tars Setup!'));
|
|
41
|
+
console.log(chalk.cyan('āāāāāāāāāāāāāāāāāāāāāāāā\n'));
|
|
42
|
+
// āā Prerequisites āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
43
|
+
const spinner = ora('Checking prerequisites...').start();
|
|
44
|
+
// Check Node version
|
|
45
|
+
const nodeVersion = process.versions.node;
|
|
46
|
+
const nodeMajor = parseInt(nodeVersion.split('.')[0], 10);
|
|
47
|
+
if (nodeMajor < 22) {
|
|
48
|
+
spinner.fail(`Node.js ā„ 22 required (found ${nodeVersion})`);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
// Check Gemini CLI
|
|
52
|
+
const geminiStatus = checkGeminiAuth();
|
|
53
|
+
if (!geminiStatus.installed) {
|
|
54
|
+
spinner.fail('Gemini CLI not found. Install with: npm i -g @google/gemini-cli');
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
spinner.succeed(`Prerequisites met (Node ${nodeVersion}, Gemini CLI installed)`);
|
|
58
|
+
// āā Step 1: Google OAuth āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
59
|
+
console.log(chalk.bold('\nStep 1/4: Google Authentication'));
|
|
60
|
+
console.log(chalk.dim('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā'));
|
|
61
|
+
let performAuth = false;
|
|
62
|
+
if (geminiStatus.loggedIn) {
|
|
63
|
+
console.log(chalk.green(' ā Already authenticated with Google.'));
|
|
64
|
+
const { reAuth } = await inquirer.prompt([
|
|
65
|
+
{
|
|
66
|
+
type: 'confirm',
|
|
67
|
+
name: 'reAuth',
|
|
68
|
+
message: 'Do you want to re-authenticate with a different account?',
|
|
69
|
+
default: false
|
|
70
|
+
}
|
|
71
|
+
]);
|
|
72
|
+
performAuth = reAuth;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
const { authNow } = await inquirer.prompt([
|
|
76
|
+
{
|
|
77
|
+
type: 'confirm',
|
|
78
|
+
name: 'authNow',
|
|
79
|
+
message: 'Tars requires Google OAuth. Open browser to authenticate?',
|
|
80
|
+
default: true
|
|
81
|
+
}
|
|
82
|
+
]);
|
|
83
|
+
performAuth = authNow;
|
|
84
|
+
}
|
|
85
|
+
if (performAuth) {
|
|
86
|
+
console.log(chalk.cyan('\n Running Google Authentication...'));
|
|
87
|
+
console.log(chalk.dim(' 1. A browser window will open.'));
|
|
88
|
+
console.log(chalk.dim(' 2. Sign in with your Google account.'));
|
|
89
|
+
console.log(chalk.dim(' 3. Return here when done.'));
|
|
90
|
+
console.log(chalk.dim(' -----------------------------------'));
|
|
91
|
+
try {
|
|
92
|
+
// Run auth login. We use spawnSync to let it take over IO.
|
|
93
|
+
spawnSync('gemini', ['auth', 'login'], {
|
|
94
|
+
stdio: 'inherit',
|
|
95
|
+
shell: true
|
|
96
|
+
});
|
|
97
|
+
// Re-check auth after the process exits
|
|
98
|
+
const freshStatus = checkGeminiAuth();
|
|
99
|
+
if (freshStatus.loggedIn) {
|
|
100
|
+
console.log(chalk.green(' ā Authentication successful!'));
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
console.log(chalk.yellow(' ā Warning: Could not verify authentication.'));
|
|
104
|
+
console.log(chalk.yellow(' You may need to run `gemini auth login` manually after setup.'));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
console.error(chalk.red(' Failed to run auth command.'));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else if (!geminiStatus.loggedIn) {
|
|
112
|
+
console.log(chalk.yellow(' Skipped. Run `gemini auth login` manually before starting Tars.'));
|
|
113
|
+
}
|
|
114
|
+
// āā Step 2: Discord Bot āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
115
|
+
const tarsHome = path.join(os.homedir(), '.tars');
|
|
116
|
+
let existingConfig = {};
|
|
117
|
+
try {
|
|
118
|
+
const data = await fs.readFile(path.join(tarsHome, 'config.json'), 'utf-8');
|
|
119
|
+
existingConfig = JSON.parse(data);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
/* ignore */
|
|
123
|
+
}
|
|
124
|
+
let discordToken = existingConfig.discordToken || '';
|
|
125
|
+
let skipDiscord = false;
|
|
126
|
+
if (discordToken) {
|
|
127
|
+
console.log(chalk.green(' ā Discord token already configured.'));
|
|
128
|
+
const { reAuthDiscord } = await inquirer.prompt([
|
|
129
|
+
{
|
|
130
|
+
type: 'confirm',
|
|
131
|
+
name: 'reAuthDiscord',
|
|
132
|
+
message: 'Do you want to update the Discord Bot Token?',
|
|
133
|
+
default: false
|
|
134
|
+
}
|
|
135
|
+
]);
|
|
136
|
+
if (!reAuthDiscord) {
|
|
137
|
+
skipDiscord = true;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (!skipDiscord) {
|
|
141
|
+
const answers = await inquirer.prompt([
|
|
142
|
+
{
|
|
143
|
+
type: 'password',
|
|
144
|
+
name: 'discordToken',
|
|
145
|
+
message: 'Enter Discord Bot Token:',
|
|
146
|
+
validate: (input) => input.length > 50 ||
|
|
147
|
+
'Token too short ā paste the full token from the Developer Portal'
|
|
148
|
+
}
|
|
149
|
+
]);
|
|
150
|
+
discordToken = answers.discordToken;
|
|
151
|
+
const validateSpinner = ora('Validating token & intents...').start();
|
|
152
|
+
try {
|
|
153
|
+
const client = new Client({
|
|
154
|
+
intents: [
|
|
155
|
+
GatewayIntentBits.Guilds,
|
|
156
|
+
GatewayIntentBits.GuildMessages,
|
|
157
|
+
GatewayIntentBits.MessageContent,
|
|
158
|
+
GatewayIntentBits.DirectMessages
|
|
159
|
+
]
|
|
160
|
+
});
|
|
161
|
+
await client.login(discordToken);
|
|
162
|
+
const botName = client.user?.tag;
|
|
163
|
+
client.destroy();
|
|
164
|
+
validateSpinner.succeed(`Token & Intents valid! Bot: ${chalk.bold(botName)}`);
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
if (err.message.includes('disallowed intents')) {
|
|
168
|
+
validateSpinner.fail(chalk.red.bold('DISALLOWED INTENTS ERROR'));
|
|
169
|
+
console.log(chalk.red('\n The token is valid, but your bot lacks the "Message Content Intent".'));
|
|
170
|
+
console.log(chalk.red(' Please go to the Discord Developer Portal and enable it:'));
|
|
171
|
+
console.log(chalk.red(' 1. Select your Bot -> "Bot" section.'));
|
|
172
|
+
console.log(chalk.red(' 2. Scroll to "Privileged Gateway Intents".'));
|
|
173
|
+
console.log(chalk.red(' 3. Enable "Message Content Intent" and SAVE CHANGES.\n'));
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
validateSpinner.fail('Invalid Discord token. Check your token and try again.');
|
|
177
|
+
}
|
|
178
|
+
process.exit(1);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// āā Step 3: Configuration āāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
182
|
+
console.log(chalk.bold('\nStep 3/4: Configuration'));
|
|
183
|
+
console.log(chalk.dim('āāāāāāāāāāāāāāāāāāāāāāāā'));
|
|
184
|
+
const config = await inquirer.prompt([
|
|
185
|
+
{
|
|
186
|
+
type: 'list',
|
|
187
|
+
name: 'geminiModel',
|
|
188
|
+
message: 'Select Gemini Model:',
|
|
189
|
+
choices: [
|
|
190
|
+
{ name: 'Auto (Highly Recommended)', value: 'auto' },
|
|
191
|
+
{ name: 'Gemini 3 Flash (Fastest, Preview)', value: 'gemini-3-flash-preview' },
|
|
192
|
+
{ name: 'Gemini 3 Pro (Most Powerful, Preview)', value: 'gemini-3-pro-preview' },
|
|
193
|
+
{ name: 'Gemini 2.5 Flash (Balanced)', value: 'gemini-2.5-flash' },
|
|
194
|
+
{ name: 'Gemini 2.5 Pro (Deep Context)', value: 'gemini-2.5-pro' },
|
|
195
|
+
{ name: 'Gemini 2.5 Flash Lite (Ultra-fast)', value: 'gemini-2.5-flash-lite' },
|
|
196
|
+
{ name: 'Custom (Advanced)', value: 'custom' }
|
|
197
|
+
],
|
|
198
|
+
default: existingConfig.geminiModel || 'auto'
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
type: 'input',
|
|
202
|
+
name: 'customModel',
|
|
203
|
+
message: 'Enter custom model name:',
|
|
204
|
+
when: (answers) => answers.geminiModel === 'custom'
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
type: 'input',
|
|
208
|
+
name: 'heartbeatInterval',
|
|
209
|
+
message: 'Heartbeat interval (seconds):',
|
|
210
|
+
default: existingConfig.heartbeatIntervalSec
|
|
211
|
+
? String(existingConfig.heartbeatIntervalSec)
|
|
212
|
+
: '60'
|
|
213
|
+
}
|
|
214
|
+
]);
|
|
215
|
+
// āā Step 4: Installation āāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
216
|
+
console.log(chalk.bold('\nStep 4/4: Installing'));
|
|
217
|
+
console.log(chalk.dim('āāāāāāāāāāāāāāāāāāāāā'));
|
|
218
|
+
// Provision isolated environment
|
|
219
|
+
// GEMINI_CLI_HOME=~/.tars ā Gemini CLI looks for ~/.tars/.gemini/
|
|
220
|
+
const installSpinner = ora('Provisioning environment...').start();
|
|
221
|
+
const geminiDir = path.join(tarsHome, '.gemini');
|
|
222
|
+
await fs.mkdir(path.join(tarsHome, 'data'), { recursive: true });
|
|
223
|
+
await fs.mkdir(path.join(tarsHome, 'logs'), { recursive: true });
|
|
224
|
+
await fs.mkdir(path.join(geminiDir, 'extensions'), { recursive: true });
|
|
225
|
+
await fs.mkdir(path.join(geminiDir, 'tmp'), { recursive: true });
|
|
226
|
+
await fs.mkdir(path.join(geminiDir, 'history'), { recursive: true });
|
|
227
|
+
installSpinner.succeed('Directories created (~/.tars/.gemini/)');
|
|
228
|
+
// āā Copy Auth Credentials (Portability) āāāāāāāāāāāāāāāā
|
|
229
|
+
const authSpinner = ora('Migrating auth credentials...').start();
|
|
230
|
+
try {
|
|
231
|
+
const globalGemini = path.join(os.homedir(), '.gemini');
|
|
232
|
+
const filesToCopy = [
|
|
233
|
+
'oauth_creds.json',
|
|
234
|
+
'google_accounts.json',
|
|
235
|
+
'installation_id',
|
|
236
|
+
'trustedFolders.json',
|
|
237
|
+
'state.json'
|
|
238
|
+
];
|
|
239
|
+
for (const file of filesToCopy) {
|
|
240
|
+
try {
|
|
241
|
+
const src = path.join(globalGemini, file);
|
|
242
|
+
const dest = path.join(geminiDir, file);
|
|
243
|
+
const data = await fs.readFile(src);
|
|
244
|
+
await fs.writeFile(dest, data);
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
/* ignore missing files */
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
authSpinner.succeed('Auth credentials mirrored to Tars.');
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
authSpinner.warn('Could not mirror auth. You may need to run `gemini auth login` again.');
|
|
254
|
+
}
|
|
255
|
+
// āā Write Gemini CLI settings.json āāāāāāāāāāāāāāāāāāāāā
|
|
256
|
+
const settingsSpinner = ora('Configuring Gemini CLI settings...').start();
|
|
257
|
+
try {
|
|
258
|
+
const geminiSettings = {
|
|
259
|
+
model: {
|
|
260
|
+
compressionThreshold: 0.2,
|
|
261
|
+
summarizeToolOutput: {
|
|
262
|
+
run_shell_command: { tokenBudget: 2000 }
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
security: {
|
|
266
|
+
auth: {
|
|
267
|
+
selectedType: 'oauth-personal'
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
await fs.writeFile(path.join(geminiDir, 'settings.json'), JSON.stringify(geminiSettings, null, 2));
|
|
272
|
+
settingsSpinner.succeed('Gemini CLI settings configured (compression @ 20%).');
|
|
273
|
+
}
|
|
274
|
+
catch (err) {
|
|
275
|
+
settingsSpinner.warn(`Could not write settings: ${err.message}`);
|
|
276
|
+
}
|
|
277
|
+
// āā Initialize GEMINI.md (Brain) āāāāāāāāāāāāāāāāāāāāāāā
|
|
278
|
+
const brainSpinner = ora('Initializing Brain (GEMINI.md)...').start();
|
|
279
|
+
try {
|
|
280
|
+
const contextSrc = path.resolve(path.dirname(new URL(import.meta.url).pathname), '../../../context/GEMINI.md');
|
|
281
|
+
const brainDest = path.join(geminiDir, 'GEMINI.md');
|
|
282
|
+
// Only copy if not exists (preserve user memory)
|
|
283
|
+
try {
|
|
284
|
+
await fs.access(brainDest);
|
|
285
|
+
brainSpinner.info('Brain already exists (skipping overwrite).');
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
await fs.copyFile(contextSrc, brainDest);
|
|
289
|
+
brainSpinner.succeed('Brain initialized with Tars personality.');
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
brainSpinner.warn(`Could not init GEMINI.md: ${err.message}`);
|
|
294
|
+
}
|
|
295
|
+
// Save Tars configuration
|
|
296
|
+
const saveSpinner = ora('Saving configuration...').start();
|
|
297
|
+
const finalModel = config.geminiModel === 'custom' ? config.customModel : config.geminiModel;
|
|
298
|
+
const configData = {
|
|
299
|
+
discordToken,
|
|
300
|
+
geminiModel: finalModel,
|
|
301
|
+
heartbeatIntervalSec: parseInt(config.heartbeatInterval, 10)
|
|
302
|
+
};
|
|
303
|
+
await fs.writeFile(path.join(tarsHome, 'config.json'), JSON.stringify(configData, null, 2));
|
|
304
|
+
saveSpinner.succeed('Configuration saved.');
|
|
305
|
+
// Symlink built-in tasks extension (to ISOLATED env)
|
|
306
|
+
const extSpinner = ora('Installing tasks extension...').start();
|
|
307
|
+
try {
|
|
308
|
+
const linkTarget = path.join(geminiDir, 'extensions', 'tars-tasks');
|
|
309
|
+
const extensionSrc = path.resolve(path.dirname(new URL(import.meta.url).pathname), '../../../extensions/tasks');
|
|
310
|
+
try {
|
|
311
|
+
await fs.unlink(linkTarget);
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
/* ignore */
|
|
315
|
+
}
|
|
316
|
+
await fs.symlink(extensionSrc, linkTarget, 'dir');
|
|
317
|
+
extSpinner.succeed('Tasks extension installed.');
|
|
318
|
+
}
|
|
319
|
+
catch (err) {
|
|
320
|
+
extSpinner.warn(`Extension install failed: ${err.message}`);
|
|
321
|
+
}
|
|
322
|
+
// āā Done āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
323
|
+
console.log(chalk.green.bold('\nā
Tars is ready!'));
|
|
324
|
+
console.log(`\n Start Tars: ${chalk.cyan('tars start')}`);
|
|
325
|
+
console.log(` Check status: ${chalk.cyan('tars status')}`);
|
|
326
|
+
console.log(` View logs: ${chalk.cyan('tars logs')}`);
|
|
327
|
+
console.log(` Invite Bot: ${chalk.cyan('tars discord')}\n`);
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function start(): Promise<void>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import pm2 from 'pm2';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
export async function start() {
|
|
7
|
+
console.log(chalk.cyan('š Starting Tars supervisor...'));
|
|
8
|
+
// Point to the compiled JS entry point (dist/supervisor/main.js)
|
|
9
|
+
const mainPath = path.resolve(__dirname, '../../supervisor/main.js');
|
|
10
|
+
// Pre-start cleanup: Kill any stray orphans that aren't managed by PM2
|
|
11
|
+
try {
|
|
12
|
+
const { execSync } = await import('child_process');
|
|
13
|
+
execSync('pkill -9 -f "supervisor/main.js" || true');
|
|
14
|
+
}
|
|
15
|
+
catch (e) { }
|
|
16
|
+
pm2.connect((err) => {
|
|
17
|
+
if (err) {
|
|
18
|
+
console.error(chalk.red('ā Failed to connect to PM2'), err);
|
|
19
|
+
process.exit(2);
|
|
20
|
+
}
|
|
21
|
+
pm2.start({
|
|
22
|
+
script: mainPath,
|
|
23
|
+
name: 'tars-supervisor',
|
|
24
|
+
interpreter: 'node',
|
|
25
|
+
env: {
|
|
26
|
+
NODE_ENV: 'production',
|
|
27
|
+
LOG_LEVEL: 'debug',
|
|
28
|
+
TARS_SUPERVISOR_MODE: 'true'
|
|
29
|
+
}
|
|
30
|
+
}, (err, apps) => {
|
|
31
|
+
pm2.disconnect();
|
|
32
|
+
if (err) {
|
|
33
|
+
console.error(chalk.red('ā Error starting Tars:'), err);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
console.log(chalk.green('ā
Tars supervisor is now running in the background.'));
|
|
37
|
+
console.log(` Use ${chalk.cyan('tars status')} to check status and logs.`);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,KAAK;IACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAE1D,iEAAiE;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC;IAErE,uEAAuE;IACvE,IAAI,CAAC;QACD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACnD,QAAQ,CAAC,0CAA0C,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;IAEd,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAChB,IAAI,GAAG,EAAE,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,GAAG,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QAED,GAAG,CAAC,KAAK,CACL;YACI,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,iBAAiB;YACvB,WAAW,EAAE,MAAM;YACnB,GAAG,EAAE;gBACD,QAAQ,EAAE,YAAY;gBACtB,SAAS,EAAE,OAAO;gBAClB,oBAAoB,EAAE,MAAM;aAC/B;SACJ,EACD,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACV,GAAG,CAAC,UAAU,EAAE,CAAC;YACjB,IAAI,GAAG,EAAE,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,GAAG,CAAC,CAAC;YAC5D,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,GAAG,CACP,KAAK,CAAC,KAAK,CAAC,qDAAqD,CAAC,CACrE,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,4BAA4B,CAAC,CAAC;YAChF,CAAC;QACL,CAAC,CACJ,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function status(): Promise<void>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import pm2 from 'pm2';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { pkg, isDev } from '../../utils/version.js';
|
|
4
|
+
import { Config } from '../../config/config.js';
|
|
5
|
+
import { SessionManager } from '../../supervisor/session-manager.js';
|
|
6
|
+
export async function status() {
|
|
7
|
+
// Load config to find session file
|
|
8
|
+
const config = Config.getInstance();
|
|
9
|
+
const sessionManager = new SessionManager(config.sessionFilePath);
|
|
10
|
+
const stats = sessionManager.load(); // Just loads ID, but populates internal state if exists
|
|
11
|
+
// Actually we need to call load() then check internal state or re-read
|
|
12
|
+
// SessionManager.load() returns ID but populates this.sessionData.
|
|
13
|
+
// However, status.ts is a separate process from supervisor.
|
|
14
|
+
// So we just need to read the file directly or use SessionManager.
|
|
15
|
+
// Let's use SessionManager since we have it.
|
|
16
|
+
// Issue: load() returns string | null. We need getStats().
|
|
17
|
+
// We must call load() first to populate internal state from disk.
|
|
18
|
+
sessionManager.load();
|
|
19
|
+
const sessionStats = sessionManager.getStats();
|
|
20
|
+
pm2.connect((err) => {
|
|
21
|
+
if (err) {
|
|
22
|
+
console.error(chalk.red('ā Failed to connect to PM2'), err);
|
|
23
|
+
process.exit(2);
|
|
24
|
+
}
|
|
25
|
+
pm2.describe('tars-supervisor', (err, list) => {
|
|
26
|
+
pm2.disconnect();
|
|
27
|
+
if (err || !list || list.length === 0) {
|
|
28
|
+
console.log(chalk.red('š“ Tars supervisor is not running.'));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const proc = list[0];
|
|
32
|
+
const status = proc.pm2_env?.status === 'online'
|
|
33
|
+
? chalk.green('online')
|
|
34
|
+
: chalk.red(proc.pm2_env?.status);
|
|
35
|
+
console.log(chalk.cyan.bold('\nš Tars Status'));
|
|
36
|
+
console.log(chalk.cyan('āāāāāāāāāāāāāā'));
|
|
37
|
+
console.log(`Version: ${pkg.version}${isDev ? chalk.yellow(' (dev)') : ''}`);
|
|
38
|
+
console.log(`Status: ${status}`);
|
|
39
|
+
console.log(`CPU: ${proc.monit?.cpu}%`);
|
|
40
|
+
console.log(`Memory: ${(proc.monit?.memory ? proc.monit.memory / 1024 / 1024 : 0).toFixed(1)} MB`);
|
|
41
|
+
console.log(`Uptime: ${Math.floor((Date.now() - (proc.pm2_env?.pm_uptime || 0)) / 1000 / 60)} minutes`);
|
|
42
|
+
console.log(`PID: ${proc.pid}`);
|
|
43
|
+
if (sessionStats) {
|
|
44
|
+
console.log(chalk.cyan('āāāāāāāāāāāāāā'));
|
|
45
|
+
console.log(chalk.bold('š§ Session Stats'));
|
|
46
|
+
console.log(`Session ID: ${sessionStats.sessionId}`);
|
|
47
|
+
console.log(`Interactions: ${sessionStats.interactionCount}`);
|
|
48
|
+
console.log(`Context Size: ${(sessionStats.totalInputTokens / 1000).toFixed(1)}k`);
|
|
49
|
+
console.log(`Cached: ${(sessionStats.totalCachedTokens / 1000).toFixed(1)}k`);
|
|
50
|
+
console.log(`Total Usage: ${((sessionStats.totalNetTokens + sessionStats.totalOutputTokens) / 1000).toFixed(1)}k`);
|
|
51
|
+
}
|
|
52
|
+
console.log(`\nLogs: tars logs\n`);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function stop(): Promise<void>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import pm2 from 'pm2';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { execSync } from 'child_process';
|
|
4
|
+
export async function stop() {
|
|
5
|
+
console.log(chalk.cyan('š Stopping Tars supervisor...'));
|
|
6
|
+
pm2.connect((err) => {
|
|
7
|
+
if (err) {
|
|
8
|
+
console.error(chalk.red('ā Failed to connect to PM2'), err);
|
|
9
|
+
// Fallback to pkill even if PM2 fails
|
|
10
|
+
forceKill();
|
|
11
|
+
process.exit(0);
|
|
12
|
+
}
|
|
13
|
+
// Use delete instead of stop to completely remove from PM2 list
|
|
14
|
+
pm2.delete('tars-supervisor', (err) => {
|
|
15
|
+
pm2.disconnect();
|
|
16
|
+
if (err) {
|
|
17
|
+
console.log(chalk.yellow('ā ļø Tars was not managed by PM2.'));
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
console.log(chalk.green('ā
PM2 process removed.'));
|
|
21
|
+
}
|
|
22
|
+
forceKill();
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function forceKill() {
|
|
27
|
+
try {
|
|
28
|
+
console.log(chalk.dim('š Checking for orphan processes...'));
|
|
29
|
+
// Find and kill any process running our supervisor, but NOT the CLI itself
|
|
30
|
+
// Use pkill -f to match the script path
|
|
31
|
+
execSync('pkill -9 -f "supervisor/main.js" || true');
|
|
32
|
+
console.log(chalk.green('⨠All supervisor instances terminated.'));
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
// Ignore errors if no processes were found
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,IAAI;IACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAE1D,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAChB,IAAI,GAAG,EAAE,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,GAAG,CAAC,CAAC;YAC5D,sCAAsC;YACtC,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QAED,gEAAgE;QAChE,GAAG,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,GAAG,EAAE,EAAE;YAClC,GAAG,CAAC,UAAU,EAAE,CAAC;YACjB,IAAI,GAAG,EAAE,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;YACvD,CAAC;YAED,SAAS,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,SAAS;IACd,IAAI,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAC9D,2EAA2E;QAC3E,wCAAwC;QACxC,QAAQ,CAAC,0CAA0C,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,2CAA2C;IAC/C,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function uninstall(): Promise<void>;
|