@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.
Files changed (99) hide show
  1. package/README.md +93 -0
  2. package/context/GEMINI.md +13 -0
  3. package/context/config/settings.json-template +36 -0
  4. package/context/skills/create-extension/SKILL.md +90 -0
  5. package/context/skills/create-skill/SKILL.md +33 -0
  6. package/context/skills/manage-extensions/SKILL.md +69 -0
  7. package/context/skills/tars-ops/SKILL.md +89 -0
  8. package/dist/cli/commands/discord.d.ts +4 -0
  9. package/dist/cli/commands/discord.js +48 -0
  10. package/dist/cli/commands/discord.js.map +1 -0
  11. package/dist/cli/commands/export.d.ts +3 -0
  12. package/dist/cli/commands/export.js +39 -0
  13. package/dist/cli/commands/export.js.map +1 -0
  14. package/dist/cli/commands/import.d.ts +1 -0
  15. package/dist/cli/commands/import.js +45 -0
  16. package/dist/cli/commands/import.js.map +1 -0
  17. package/dist/cli/commands/logs.d.ts +4 -0
  18. package/dist/cli/commands/logs.js +23 -0
  19. package/dist/cli/commands/logs.js.map +1 -0
  20. package/dist/cli/commands/memory.d.ts +1 -0
  21. package/dist/cli/commands/memory.js +35 -0
  22. package/dist/cli/commands/memory.js.map +1 -0
  23. package/dist/cli/commands/secret.d.ts +6 -0
  24. package/dist/cli/commands/secret.js +46 -0
  25. package/dist/cli/commands/secret.js.map +1 -0
  26. package/dist/cli/commands/setup.d.ts +4 -0
  27. package/dist/cli/commands/setup.js +329 -0
  28. package/dist/cli/commands/setup.js.map +1 -0
  29. package/dist/cli/commands/start.d.ts +1 -0
  30. package/dist/cli/commands/start.js +42 -0
  31. package/dist/cli/commands/start.js.map +1 -0
  32. package/dist/cli/commands/status.d.ts +1 -0
  33. package/dist/cli/commands/status.js +56 -0
  34. package/dist/cli/commands/status.js.map +1 -0
  35. package/dist/cli/commands/stop.d.ts +1 -0
  36. package/dist/cli/commands/stop.js +38 -0
  37. package/dist/cli/commands/stop.js.map +1 -0
  38. package/dist/cli/commands/uninstall.d.ts +1 -0
  39. package/dist/cli/commands/uninstall.js +91 -0
  40. package/dist/cli/commands/uninstall.js.map +1 -0
  41. package/dist/cli/index.d.ts +2 -0
  42. package/dist/cli/index.js +54 -0
  43. package/dist/cli/index.js.map +1 -0
  44. package/dist/config/config.d.ts +14 -0
  45. package/dist/config/config.js +69 -0
  46. package/dist/config/config.js.map +1 -0
  47. package/dist/discord/discord-bot.d.ts +32 -0
  48. package/dist/discord/discord-bot.js +151 -0
  49. package/dist/discord/discord-bot.js.map +1 -0
  50. package/dist/discord/message-formatter.d.ts +95 -0
  51. package/dist/discord/message-formatter.js +448 -0
  52. package/dist/discord/message-formatter.js.map +1 -0
  53. package/dist/memory/knowledge-store.d.ts +24 -0
  54. package/dist/memory/knowledge-store.js +126 -0
  55. package/dist/memory/knowledge-store.js.map +1 -0
  56. package/dist/memory/memory-manager.d.ts +24 -0
  57. package/dist/memory/memory-manager.js +101 -0
  58. package/dist/memory/memory-manager.js.map +1 -0
  59. package/dist/scripts/debug-cli.d.ts +1 -0
  60. package/dist/scripts/debug-cli.js +52 -0
  61. package/dist/scripts/debug-cli.js.map +1 -0
  62. package/dist/supervisor/gemini-cli.d.ts +28 -0
  63. package/dist/supervisor/gemini-cli.js +315 -0
  64. package/dist/supervisor/gemini-cli.js.map +1 -0
  65. package/dist/supervisor/heartbeat-service.d.ts +21 -0
  66. package/dist/supervisor/heartbeat-service.js +143 -0
  67. package/dist/supervisor/heartbeat-service.js.map +1 -0
  68. package/dist/supervisor/main.d.ts +1 -0
  69. package/dist/supervisor/main.js +242 -0
  70. package/dist/supervisor/main.js.map +1 -0
  71. package/dist/supervisor/session-manager.d.ts +47 -0
  72. package/dist/supervisor/session-manager.js +118 -0
  73. package/dist/supervisor/session-manager.js.map +1 -0
  74. package/dist/supervisor/supervisor.d.ts +32 -0
  75. package/dist/supervisor/supervisor.js +98 -0
  76. package/dist/supervisor/supervisor.js.map +1 -0
  77. package/dist/types/index.d.ts +42 -0
  78. package/dist/types/index.js +5 -0
  79. package/dist/types/index.js.map +1 -0
  80. package/dist/utils/attachment-processor.d.ts +22 -0
  81. package/dist/utils/attachment-processor.js +79 -0
  82. package/dist/utils/attachment-processor.js.map +1 -0
  83. package/dist/utils/logger.d.ts +6 -0
  84. package/dist/utils/logger.js +15 -0
  85. package/dist/utils/logger.js.map +1 -0
  86. package/dist/utils/secrets-manager.d.ts +27 -0
  87. package/dist/utils/secrets-manager.js +79 -0
  88. package/dist/utils/secrets-manager.js.map +1 -0
  89. package/dist/utils/version.d.ts +3 -0
  90. package/dist/utils/version.js +23 -0
  91. package/dist/utils/version.js.map +1 -0
  92. package/extensions/tasks/gemini-extension.json +14 -0
  93. package/extensions/tasks/package-lock.json +1209 -0
  94. package/extensions/tasks/package.json +19 -0
  95. package/extensions/tasks/src/server.ts +265 -0
  96. package/extensions/tasks/src/store.ts +92 -0
  97. package/extensions/tasks/tsconfig.json +14 -0
  98. package/package.json +55 -0
  99. 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,6 @@
1
+ /**
2
+ * tars secret set <KEY> <VALUE>
3
+ * tars secret list
4
+ * tars secret remove <KEY>
5
+ */
6
+ export declare function secret(action: string, key?: string, value?: string): Promise<void>;
@@ -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,4 @@
1
+ /**
2
+ * tars setup - The Onboarding Wizard
3
+ */
4
+ export declare function setup(): Promise<void>;
@@ -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>;