@saccolabs/tars 1.35.1 → 1.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/channels/channel-manager.d.ts +5 -0
- package/dist/channels/channel-manager.js +7 -0
- package/dist/channels/channel-manager.js.map +1 -1
- package/dist/channels/tui/tui-channel.d.ts +98 -0
- package/dist/channels/tui/tui-channel.js +362 -0
- package/dist/channels/tui/tui-channel.js.map +1 -0
- package/dist/channels/tui/tui-renderer.d.ts +49 -0
- package/dist/channels/tui/tui-renderer.js +112 -0
- package/dist/channels/tui/tui-renderer.js.map +1 -0
- package/dist/cli/commands/chat.d.ts +9 -0
- package/dist/cli/commands/chat.js +51 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.js +9 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/suppress-warnings.d.ts +1 -0
- package/dist/cli/suppress-warnings.js +9 -0
- package/dist/cli/suppress-warnings.js.map +1 -0
- package/dist/supervisor/bootstrap.d.ts +48 -0
- package/dist/supervisor/bootstrap.js +596 -0
- package/dist/supervisor/bootstrap.js.map +1 -0
- package/dist/supervisor/main.js +5 -529
- package/dist/supervisor/main.js.map +1 -1
- package/dist/supervisor/mcp-bridge.js +10 -1
- package/dist/supervisor/mcp-bridge.js.map +1 -1
- package/dist/supervisor/supervisor.js +3 -3
- package/dist/supervisor/supervisor.js.map +1 -1
- package/dist/supervisor/tars-engine.js +1 -1
- package/dist/supervisor/tars-engine.js.map +1 -1
- package/dist/utils/logger.d.ts +5 -0
- package/dist/utils/logger.js +23 -0
- package/dist/utils/logger.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,596 @@
|
|
|
1
|
+
import { Config } from '../config/config.js';
|
|
2
|
+
import { TarsEngine } from './tars-engine.js';
|
|
3
|
+
import { SessionManager } from './session-manager.js';
|
|
4
|
+
import { GetQuotaTool } from '../tools/get-quota.js';
|
|
5
|
+
import { Supervisor } from './supervisor.js';
|
|
6
|
+
import { HeartbeatService } from './heartbeat-service.js';
|
|
7
|
+
import { CronService } from './cron-service.js';
|
|
8
|
+
import { DashboardService } from './dashboard-service.js';
|
|
9
|
+
import { ChannelManager } from '../channels/channel-manager.js';
|
|
10
|
+
import logger from '../utils/logger.js';
|
|
11
|
+
import fs from 'fs';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import { execSync } from 'child_process';
|
|
14
|
+
import { fileURLToPath } from 'url';
|
|
15
|
+
import { BrainAuditor } from '../utils/brain-audit.js';
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = path.dirname(__filename);
|
|
18
|
+
/**
|
|
19
|
+
* Install the fixed system prompt into the Tars home directory.
|
|
20
|
+
*/
|
|
21
|
+
function installSystemPrompt(config) {
|
|
22
|
+
let searchDir = __dirname;
|
|
23
|
+
let srcPrompt = '';
|
|
24
|
+
for (let i = 0; i < 5; i++) {
|
|
25
|
+
const candidate = path.join(searchDir, 'prompts', 'system.md');
|
|
26
|
+
const srcCandidate = path.join(searchDir, 'src', 'prompts', 'system.md');
|
|
27
|
+
if (fs.existsSync(candidate)) {
|
|
28
|
+
srcPrompt = candidate;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
else if (fs.existsSync(srcCandidate)) {
|
|
32
|
+
srcPrompt = srcCandidate;
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
searchDir = path.dirname(searchDir);
|
|
36
|
+
}
|
|
37
|
+
if (!srcPrompt) {
|
|
38
|
+
logger.warn('⚠️ Could not locate system.md prompt file');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const targetDir = path.dirname(config.systemPromptPath);
|
|
42
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
43
|
+
let promptContent = fs.readFileSync(srcPrompt, 'utf-8');
|
|
44
|
+
promptContent = promptContent.replace(/{{ASSISTANT_NAME}}/g, config.assistantName);
|
|
45
|
+
promptContent = promptContent.replace(/{{INSTANCE_NAME}}/g, config.instanceName);
|
|
46
|
+
promptContent = promptContent.replace(/{{PROVIDER}}/g, config.piProvider);
|
|
47
|
+
promptContent = promptContent.replace(/{{MODEL_NAME}}/g, config.piModel);
|
|
48
|
+
promptContent = promptContent.replace(/{{CONTEXT_WINDOW}}/g, config.contextWindowTokens.toLocaleString());
|
|
49
|
+
fs.writeFileSync(config.systemPromptPath, promptContent);
|
|
50
|
+
logger.info(`📝 System prompt installed: ${config.systemPromptPath}`);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Install and sync built-in skills into the Tars runtime directory.
|
|
54
|
+
*/
|
|
55
|
+
function installSkills(config) {
|
|
56
|
+
let searchDir = __dirname;
|
|
57
|
+
let skillsSrc = '';
|
|
58
|
+
for (let i = 0; i < 5; i++) {
|
|
59
|
+
const candidate = path.join(searchDir, 'context', 'skills');
|
|
60
|
+
const srcCandidate = path.join(searchDir, '..', 'context', 'skills');
|
|
61
|
+
if (fs.existsSync(candidate)) {
|
|
62
|
+
skillsSrc = candidate;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
else if (fs.existsSync(srcCandidate)) {
|
|
66
|
+
skillsSrc = srcCandidate;
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
const rootCandidate = path.join(searchDir, '..', '..', 'context', 'skills');
|
|
70
|
+
if (fs.existsSync(rootCandidate)) {
|
|
71
|
+
skillsSrc = rootCandidate;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
searchDir = path.dirname(searchDir);
|
|
75
|
+
}
|
|
76
|
+
if (!skillsSrc) {
|
|
77
|
+
logger.warn('⚠️ Could not locate built-in skills directory');
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const skillsDest = path.join(config.homeDir, 'skills');
|
|
81
|
+
try {
|
|
82
|
+
if (!fs.existsSync(skillsDest)) {
|
|
83
|
+
fs.mkdirSync(skillsDest, { recursive: true });
|
|
84
|
+
}
|
|
85
|
+
const builtInSkills = fs.readdirSync(skillsSrc);
|
|
86
|
+
for (const skillName of builtInSkills) {
|
|
87
|
+
const srcSkillPath = path.join(skillsSrc, skillName);
|
|
88
|
+
const destSkillPath = path.join(skillsDest, skillName);
|
|
89
|
+
if (!fs.statSync(srcSkillPath).isDirectory())
|
|
90
|
+
continue;
|
|
91
|
+
if (fs.existsSync(destSkillPath)) {
|
|
92
|
+
fs.rmSync(destSkillPath, { recursive: true, force: true });
|
|
93
|
+
}
|
|
94
|
+
fs.cpSync(srcSkillPath, destSkillPath, { recursive: true });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
logger.error(`❌ Failed to sync skills: ${error}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Automatically install/link extensions and enable them.
|
|
103
|
+
*/
|
|
104
|
+
function installExtensions(config) {
|
|
105
|
+
const repoExtensionsDir = path.join(__dirname, '..', '..', 'extensions');
|
|
106
|
+
const targetExtensionsDir = path.join(config.homeDir, 'extensions');
|
|
107
|
+
const enablementFile = path.join(targetExtensionsDir, 'extension-enablement.json');
|
|
108
|
+
if (!fs.existsSync(repoExtensionsDir)) {
|
|
109
|
+
logger.warn('⚠️ Could not locate extensions directory');
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (!fs.existsSync(targetExtensionsDir)) {
|
|
113
|
+
fs.mkdirSync(targetExtensionsDir, { recursive: true });
|
|
114
|
+
}
|
|
115
|
+
let enablement = {};
|
|
116
|
+
if (fs.existsSync(enablementFile)) {
|
|
117
|
+
try {
|
|
118
|
+
enablement = JSON.parse(fs.readFileSync(enablementFile, 'utf-8'));
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
logger.warn('⚠️ Could not parse extension-enablement.json, starting fresh');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const builtInExtensions = fs.readdirSync(repoExtensionsDir);
|
|
125
|
+
for (const extName of builtInExtensions) {
|
|
126
|
+
const srcPath = path.resolve(repoExtensionsDir, extName);
|
|
127
|
+
if (!fs.statSync(srcPath).isDirectory())
|
|
128
|
+
continue;
|
|
129
|
+
const finalExtName = extName === 'tasks' ? 'tars-tasks' : extName === 'memory' ? 'tars-memory' : extName;
|
|
130
|
+
const finalDestPath = path.join(targetExtensionsDir, finalExtName);
|
|
131
|
+
let needsLink = true;
|
|
132
|
+
try {
|
|
133
|
+
if (fs.existsSync(finalDestPath)) {
|
|
134
|
+
const stats = fs.lstatSync(finalDestPath);
|
|
135
|
+
if (stats.isSymbolicLink()) {
|
|
136
|
+
const realPath = fs.realpathSync(finalDestPath);
|
|
137
|
+
if (realPath === srcPath) {
|
|
138
|
+
needsLink = false;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (e) { }
|
|
144
|
+
if (needsLink) {
|
|
145
|
+
try {
|
|
146
|
+
if (fs.existsSync(finalDestPath) ||
|
|
147
|
+
(fs.existsSync(finalDestPath) && fs.lstatSync(finalDestPath).isSymbolicLink())) {
|
|
148
|
+
fs.rmSync(finalDestPath, { recursive: true, force: true });
|
|
149
|
+
}
|
|
150
|
+
fs.symlinkSync(srcPath, finalDestPath);
|
|
151
|
+
logger.info(`🔌 Integrated extension: ${finalExtName}`);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
logger.error(`❌ Failed to integrate extension ${finalExtName}: ${error}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const nmPath = path.join(finalDestPath, 'node_modules');
|
|
158
|
+
if (!fs.existsSync(nmPath)) {
|
|
159
|
+
logger.info(`💧 Hydrating extension: ${finalExtName}...`);
|
|
160
|
+
try {
|
|
161
|
+
execSync('npm install --production', {
|
|
162
|
+
cwd: finalDestPath,
|
|
163
|
+
stdio: 'pipe'
|
|
164
|
+
});
|
|
165
|
+
const pkgPath = path.join(finalDestPath, 'package.json');
|
|
166
|
+
if (fs.existsSync(pkgPath)) {
|
|
167
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
168
|
+
if (pkg.scripts?.build) {
|
|
169
|
+
logger.info(`🏗️ Building extension: ${finalExtName}...`);
|
|
170
|
+
execSync('npm run build', {
|
|
171
|
+
cwd: finalDestPath,
|
|
172
|
+
stdio: 'pipe'
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
logger.info(`✅ Extension ${finalExtName} hydrated successfully.`);
|
|
177
|
+
}
|
|
178
|
+
catch (e) {
|
|
179
|
+
const stdout = e.stdout?.toString();
|
|
180
|
+
const stderr = e.stderr?.toString();
|
|
181
|
+
const out = stderr || stdout || e.message;
|
|
182
|
+
logger.error(`❌ Failed to hydrate extension ${finalExtName}: ${out}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const allInstalledExtensions = fs.readdirSync(targetExtensionsDir);
|
|
187
|
+
for (const extName of allInstalledExtensions) {
|
|
188
|
+
const extPath = path.join(targetExtensionsDir, extName);
|
|
189
|
+
if (extName === 'extension-enablement.json')
|
|
190
|
+
continue;
|
|
191
|
+
if (!fs.statSync(extPath).isDirectory())
|
|
192
|
+
continue;
|
|
193
|
+
const realPath = fs.realpathSync(extPath);
|
|
194
|
+
if (!enablement[extName]) {
|
|
195
|
+
enablement[extName] = { overrides: [] };
|
|
196
|
+
}
|
|
197
|
+
const overrides = new Set(enablement[extName].overrides || []);
|
|
198
|
+
overrides.add(path.join(config.homeDir, '*'));
|
|
199
|
+
overrides.add(path.join(realPath, '*'));
|
|
200
|
+
enablement[extName].overrides = Array.from(overrides);
|
|
201
|
+
}
|
|
202
|
+
fs.writeFileSync(enablementFile, JSON.stringify(enablement, null, 2));
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Install default settings if none exist.
|
|
206
|
+
*/
|
|
207
|
+
function installDefaultSettings(config) {
|
|
208
|
+
const settingsTemplate = path.join(__dirname, '..', '..', 'context', 'config', 'settings.json-template');
|
|
209
|
+
const targetSettings = path.join(config.homeDir, 'settings.json');
|
|
210
|
+
if (fs.existsSync(targetSettings))
|
|
211
|
+
return;
|
|
212
|
+
if (fs.existsSync(settingsTemplate)) {
|
|
213
|
+
fs.mkdirSync(path.dirname(targetSettings), { recursive: true });
|
|
214
|
+
fs.copyFileSync(settingsTemplate, targetSettings);
|
|
215
|
+
logger.info(`⚙️ Default settings installed: ${targetSettings}`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Ensure existing settings.json has required settings
|
|
220
|
+
*/
|
|
221
|
+
function patchSettings(config) {
|
|
222
|
+
const targetSettings = path.join(config.homeDir, 'settings.json');
|
|
223
|
+
if (!fs.existsSync(targetSettings))
|
|
224
|
+
return;
|
|
225
|
+
const settingsTemplate = path.join(__dirname, '..', '..', 'context', 'config', 'settings.json-template');
|
|
226
|
+
try {
|
|
227
|
+
const raw = fs.readFileSync(targetSettings, 'utf-8');
|
|
228
|
+
const settings = JSON.parse(raw);
|
|
229
|
+
let modified = false;
|
|
230
|
+
if (fs.existsSync(settingsTemplate)) {
|
|
231
|
+
const template = JSON.parse(fs.readFileSync(settingsTemplate, 'utf-8'));
|
|
232
|
+
const sections = ['experimental', 'agents', 'model', 'general'];
|
|
233
|
+
for (const section of sections) {
|
|
234
|
+
if (template[section] && !settings[section]) {
|
|
235
|
+
settings[section] = template[section];
|
|
236
|
+
modified = true;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (modified) {
|
|
241
|
+
fs.writeFileSync(targetSettings, JSON.stringify(settings, null, 2));
|
|
242
|
+
logger.info('⚙️ Patched settings.json from template.');
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch (e) {
|
|
246
|
+
logger.warn(`⚠️ Failed to patch settings.json: ${e.message}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Install the built-in dashboard into the Tars home directory.
|
|
251
|
+
*/
|
|
252
|
+
function installDashboard(config) {
|
|
253
|
+
const repoDashSrc = path.join(__dirname, '..', '..', 'dash');
|
|
254
|
+
const targetDashDir = path.join(config.homeDir, 'apps', 'dashboard');
|
|
255
|
+
if (!fs.existsSync(repoDashSrc)) {
|
|
256
|
+
logger.warn('⚠️ Could not locate stock dashboard directory');
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
if (!fs.existsSync(targetDashDir)) {
|
|
260
|
+
try {
|
|
261
|
+
fs.mkdirSync(path.dirname(targetDashDir), { recursive: true });
|
|
262
|
+
fs.cpSync(repoDashSrc, targetDashDir, { recursive: true });
|
|
263
|
+
logger.info(`🚚 Installed stock dashboard to ${targetDashDir}`);
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
logger.error(`❌ Failed to install stock dashboard: ${error}`);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
const targetEnv = path.join(targetDashDir, '.env');
|
|
271
|
+
const templateEnv = path.join(targetDashDir, '.env.template');
|
|
272
|
+
if (!fs.existsSync(targetEnv) && fs.existsSync(templateEnv)) {
|
|
273
|
+
try {
|
|
274
|
+
fs.copyFileSync(templateEnv, targetEnv);
|
|
275
|
+
logger.info('⚙️ Created default dashboard .env');
|
|
276
|
+
}
|
|
277
|
+
catch (e) { }
|
|
278
|
+
}
|
|
279
|
+
const nmPath = path.join(targetDashDir, 'node_modules');
|
|
280
|
+
const nextPath = path.join(targetDashDir, '.next');
|
|
281
|
+
if (!fs.existsSync(nmPath) || !fs.existsSync(nextPath)) {
|
|
282
|
+
logger.info('💧 Hydrating dashboard (this may take a minute)...');
|
|
283
|
+
try {
|
|
284
|
+
const env = { ...process.env };
|
|
285
|
+
delete env.NODE_ENV;
|
|
286
|
+
execSync('npm install', {
|
|
287
|
+
cwd: targetDashDir,
|
|
288
|
+
stdio: 'pipe',
|
|
289
|
+
env
|
|
290
|
+
});
|
|
291
|
+
logger.info('🏗️ Building dashboard...');
|
|
292
|
+
execSync('npm run build', {
|
|
293
|
+
cwd: targetDashDir,
|
|
294
|
+
stdio: 'pipe',
|
|
295
|
+
env
|
|
296
|
+
});
|
|
297
|
+
logger.info('✅ Dashboard hydrated successfully.');
|
|
298
|
+
}
|
|
299
|
+
catch (e) {
|
|
300
|
+
const out = e.stdout?.toString() || e.stderr?.toString() || e.message;
|
|
301
|
+
logger.error(`❌ Failed to hydrate dashboard: ${out}`);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Format byte size to human-readable string.
|
|
307
|
+
*/
|
|
308
|
+
function formatSize(chars) {
|
|
309
|
+
if (chars < 1024)
|
|
310
|
+
return `${chars}B`;
|
|
311
|
+
if (chars < 1024 * 1024)
|
|
312
|
+
return `${(chars / 1024).toFixed(1)}KB`;
|
|
313
|
+
return `${(chars / (1024 * 1024)).toFixed(1)}MB`;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Build the status content string for live tool execution updates.
|
|
317
|
+
*/
|
|
318
|
+
function formatStatusContent(turnCount, recentTools, sessionManager, config) {
|
|
319
|
+
const lines = [];
|
|
320
|
+
// Get current context window stats
|
|
321
|
+
const stats = sessionManager.getStats();
|
|
322
|
+
let contextStr = '';
|
|
323
|
+
if (stats && stats.lastInputTokens > 0) {
|
|
324
|
+
const limit = config.contextWindowTokens;
|
|
325
|
+
const active = stats.lastInputTokens;
|
|
326
|
+
const pct = ((active / limit) * 100).toFixed(1);
|
|
327
|
+
contextStr = ` | ${active.toLocaleString()}/${limit.toLocaleString()} (${pct}%)`;
|
|
328
|
+
}
|
|
329
|
+
const executedCount = recentTools.filter((t) => t.status === 'completed').length;
|
|
330
|
+
const timeStr = new Date().toLocaleTimeString([], {
|
|
331
|
+
hour: '2-digit',
|
|
332
|
+
minute: '2-digit',
|
|
333
|
+
second: '2-digit'
|
|
334
|
+
});
|
|
335
|
+
lines.push(`⏳ **Working...** | Turn ${turnCount} (${executedCount} tools)${contextStr} | ${timeStr}`);
|
|
336
|
+
// Show last 5 tool calls (moving window)
|
|
337
|
+
const toolsToShow = recentTools.slice(-5);
|
|
338
|
+
if (toolsToShow.length > 0) {
|
|
339
|
+
lines.push('');
|
|
340
|
+
for (const tool of toolsToShow) {
|
|
341
|
+
if (tool.status === 'running') {
|
|
342
|
+
lines.push(`⚙️ **${tool.name}** — *Executing...*`);
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
let preview = (tool.responsePreview || '')
|
|
346
|
+
.replace(/\s+/g, ' ')
|
|
347
|
+
.replace(/[`*#_\[\]]/g, '')
|
|
348
|
+
.trim();
|
|
349
|
+
if (preview.length > 80) {
|
|
350
|
+
preview = preview.substring(0, 77) + '...';
|
|
351
|
+
}
|
|
352
|
+
const size = formatSize(tool.responseSize || 0);
|
|
353
|
+
lines.push(`🛠️ **${tool.name}** — "${preview}" (${size})`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return lines.join('\n');
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Shared supervisor bootstrap logic.
|
|
361
|
+
* Used by both main.ts (PM2 background) and chat.ts (foreground TUI).
|
|
362
|
+
*
|
|
363
|
+
* Returns all initialized services but does NOT start them.
|
|
364
|
+
* The caller is responsible for starting channels, heartbeat, cron, etc.
|
|
365
|
+
*/
|
|
366
|
+
export async function bootstrap(options = {}) {
|
|
367
|
+
// 1. Load Configuration & Audit Brain
|
|
368
|
+
const config = Config.getInstance();
|
|
369
|
+
if (process.env.TARS_CHAT_MODE === 'true') {
|
|
370
|
+
const { configureChatLogging } = await import('../utils/logger.js');
|
|
371
|
+
configureChatLogging(config.homeDir);
|
|
372
|
+
}
|
|
373
|
+
logger.info('🚀 Tars Starting...');
|
|
374
|
+
const auditor = new BrainAuditor(config.homeDir);
|
|
375
|
+
await auditor.audit({ silent: true });
|
|
376
|
+
// 2. Install components
|
|
377
|
+
installSystemPrompt(config);
|
|
378
|
+
installSkills(config);
|
|
379
|
+
installExtensions(config);
|
|
380
|
+
if (!options.skipDashboard) {
|
|
381
|
+
installDashboard(config);
|
|
382
|
+
}
|
|
383
|
+
installDefaultSettings(config);
|
|
384
|
+
patchSettings(config);
|
|
385
|
+
// 3. Initialize Core Services
|
|
386
|
+
const tarsEngine = new TarsEngine(config);
|
|
387
|
+
const sessionManager = new SessionManager(config.sessionFilePath);
|
|
388
|
+
const supervisor = new Supervisor(tarsEngine, sessionManager);
|
|
389
|
+
// 4. Initialize Multi-Channel Interface
|
|
390
|
+
const channelManager = new ChannelManager();
|
|
391
|
+
// 5. Inject Interface into Engine
|
|
392
|
+
tarsEngine.setChannelManager(channelManager);
|
|
393
|
+
supervisor.setChannelManager(channelManager);
|
|
394
|
+
tarsEngine.setSessionManager(sessionManager);
|
|
395
|
+
await tarsEngine.initialize();
|
|
396
|
+
// 6. Initialize Background Services
|
|
397
|
+
const heartbeat = new HeartbeatService(supervisor, config, sessionManager);
|
|
398
|
+
const cron = new CronService(supervisor, config, channelManager);
|
|
399
|
+
const dashboard = new DashboardService(config);
|
|
400
|
+
return {
|
|
401
|
+
config,
|
|
402
|
+
tarsEngine,
|
|
403
|
+
sessionManager,
|
|
404
|
+
supervisor,
|
|
405
|
+
channelManager,
|
|
406
|
+
heartbeat,
|
|
407
|
+
cron,
|
|
408
|
+
dashboard
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Wire the shared message routing logic onto a channel manager.
|
|
413
|
+
* Handles slash commands (/reset, /clear, /quota, /stats, /help) and
|
|
414
|
+
* forwards all other messages to the supervisor for AI processing.
|
|
415
|
+
*
|
|
416
|
+
* The optional `tuiChannel` parameter enables real-time token streaming
|
|
417
|
+
* when the active channel is a TUI (instead of Discord-style buffering).
|
|
418
|
+
*/
|
|
419
|
+
export function wireMessageRouting(channelManager, supervisor, sessionManager, tarsEngine, config, tuiChannel) {
|
|
420
|
+
channelManager.onMessage(async (message) => {
|
|
421
|
+
const rawPrompt = message.content.trim();
|
|
422
|
+
if (rawPrompt.startsWith('/')) {
|
|
423
|
+
const parts = rawPrompt.split(' ');
|
|
424
|
+
const command = parts[0].toLowerCase();
|
|
425
|
+
if (command === '/reset' || command === '/clear') {
|
|
426
|
+
try {
|
|
427
|
+
const stats = sessionManager.getStats();
|
|
428
|
+
if (stats) {
|
|
429
|
+
const chatFile = path.join(config.homeDir, 'chats', `${stats.sessionId}.json`);
|
|
430
|
+
if (fs.existsSync(chatFile)) {
|
|
431
|
+
await fs.promises.unlink(chatFile).catch(() => { });
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
await sessionManager.clear();
|
|
435
|
+
tarsEngine.resetSession();
|
|
436
|
+
await message.reply('✨ **Session Reset:** I have cleared the current session context and started a new, clean conversation.');
|
|
437
|
+
}
|
|
438
|
+
catch (e) {
|
|
439
|
+
await message.reply(`❌ **Error resetting session:** ${e.message}`);
|
|
440
|
+
}
|
|
441
|
+
message.stopTyping();
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
if (command === '/quota' || command === '/stats') {
|
|
445
|
+
const stats = sessionManager.getStats();
|
|
446
|
+
if (!stats) {
|
|
447
|
+
await message.reply('📊 **No active session stats found.**');
|
|
448
|
+
message.stopTyping();
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
const quotaTool = new GetQuotaTool(sessionManager, {
|
|
452
|
+
piProvider: config.piProvider,
|
|
453
|
+
contextWindowTokens: config.contextWindowTokens,
|
|
454
|
+
piModel: config.piModel,
|
|
455
|
+
piBaseUrl: config.piBaseUrl
|
|
456
|
+
});
|
|
457
|
+
const usageText = quotaTool.getLocalUsage();
|
|
458
|
+
await message.reply(usageText);
|
|
459
|
+
message.stopTyping();
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
if (command === '/help') {
|
|
463
|
+
const helpText = [
|
|
464
|
+
`🤖 **Tars Deterministic Commands**`,
|
|
465
|
+
`• \`/reset\` or \`/clear\` - Reset active session and start a new clean conversation.`,
|
|
466
|
+
`• \`/quota\` or \`/stats\` - View token consumption, active context size, and session statistics.`,
|
|
467
|
+
`• \`/help\` - Show this help menu.`
|
|
468
|
+
].join('\n');
|
|
469
|
+
await message.reply(helpText);
|
|
470
|
+
message.stopTyping();
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
// Determine if the message came from the TUI channel
|
|
475
|
+
const isTui = message.channelId === 'tui' && tuiChannel;
|
|
476
|
+
let responseBuffer = '';
|
|
477
|
+
let replyCount = 0;
|
|
478
|
+
// --- Live status tracking for in-place message editing ---
|
|
479
|
+
let statusInitialized = false;
|
|
480
|
+
const updateStatus = async (turnCount, recentTools, isMilestone) => {
|
|
481
|
+
const content = formatStatusContent(turnCount, recentTools, sessionManager, config);
|
|
482
|
+
if (!statusInitialized) {
|
|
483
|
+
await channelManager.notify(content);
|
|
484
|
+
statusInitialized = true;
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
const edited = await channelManager.editStatus(content);
|
|
488
|
+
if (!edited) {
|
|
489
|
+
logger.warn('[Main] Status edit failed, sending new notification.');
|
|
490
|
+
statusInitialized = false;
|
|
491
|
+
await channelManager.notify(content);
|
|
492
|
+
statusInitialized = true;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
};
|
|
496
|
+
const flush = async (isDone = false) => {
|
|
497
|
+
const text = responseBuffer.trim();
|
|
498
|
+
if (!text)
|
|
499
|
+
return;
|
|
500
|
+
let finalContent = text;
|
|
501
|
+
// Prepend the binding alert to the first message if we just auto-bound
|
|
502
|
+
if (replyCount === 0 && message.metadata?.wasAutoBound) {
|
|
503
|
+
finalContent = `🔒 **System Alert:** I have permanently bound my background notification channel to your Discord account.\n\n${finalContent}`;
|
|
504
|
+
}
|
|
505
|
+
if (isDone) {
|
|
506
|
+
const stats = sessionManager.getStats();
|
|
507
|
+
if (stats && stats.lastInputTokens > 0) {
|
|
508
|
+
const limit = config.contextWindowTokens;
|
|
509
|
+
const active = stats.lastInputTokens;
|
|
510
|
+
const pct = ((active / limit) * 100).toFixed(1);
|
|
511
|
+
const thresholdPct = (config.compressionThreshold * 100).toFixed(1);
|
|
512
|
+
finalContent += `\n\n*${active.toLocaleString()}/${limit.toLocaleString()} (${pct}%, compaction at ${thresholdPct}%)*`;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
await message.reply(finalContent);
|
|
516
|
+
responseBuffer = '';
|
|
517
|
+
replyCount++;
|
|
518
|
+
};
|
|
519
|
+
// Clear any previous status message for a fresh start
|
|
520
|
+
channelManager.clearStatus();
|
|
521
|
+
statusInitialized = false;
|
|
522
|
+
// Feature flag: status updates are per-backend
|
|
523
|
+
const statusEnabled = config.isStatusUpdatesEnabled();
|
|
524
|
+
if (!statusEnabled) {
|
|
525
|
+
logger.debug(`[Main] Status updates disabled for backend "${config.inferenceBackend}".`);
|
|
526
|
+
}
|
|
527
|
+
try {
|
|
528
|
+
message.startTyping();
|
|
529
|
+
await supervisor.run(message.content, async (event) => {
|
|
530
|
+
if (event.type === 'text' && event.content && event.role !== 'user') {
|
|
531
|
+
if (isTui) {
|
|
532
|
+
// TUI: stream tokens directly to terminal
|
|
533
|
+
// Clear status lines before first streamed text
|
|
534
|
+
if (!responseBuffer) {
|
|
535
|
+
channelManager.clearStatus();
|
|
536
|
+
statusInitialized = false;
|
|
537
|
+
}
|
|
538
|
+
tuiChannel.streamText(event.content);
|
|
539
|
+
responseBuffer += event.content; // Track for length, not for flushing
|
|
540
|
+
}
|
|
541
|
+
else {
|
|
542
|
+
// Discord: buffer text for batch reply
|
|
543
|
+
responseBuffer += event.content;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
else if (event.type === 'tool_call') {
|
|
547
|
+
// Local models emit reasoning before a tool call. By clearing the buffer, we suppress it.
|
|
548
|
+
if (isTui && responseBuffer) {
|
|
549
|
+
// If we streamed partial text, add a newline before status
|
|
550
|
+
tuiChannel.streamText('\n');
|
|
551
|
+
}
|
|
552
|
+
responseBuffer = '';
|
|
553
|
+
}
|
|
554
|
+
else if (event.type === 'error') {
|
|
555
|
+
if (isTui) {
|
|
556
|
+
channelManager.clearStatus();
|
|
557
|
+
statusInitialized = false;
|
|
558
|
+
}
|
|
559
|
+
await flush();
|
|
560
|
+
await message.reply(`❌ **Error:** ${event.error}`);
|
|
561
|
+
}
|
|
562
|
+
else if (event.type === 'done') {
|
|
563
|
+
if (isTui) {
|
|
564
|
+
// TUI: text was already streamed, just print footer
|
|
565
|
+
channelManager.clearStatus();
|
|
566
|
+
statusInitialized = false;
|
|
567
|
+
const stats = sessionManager.getStats();
|
|
568
|
+
if (stats && stats.lastInputTokens > 0) {
|
|
569
|
+
const { TuiRenderer } = await import('../channels/tui/tui-renderer.js');
|
|
570
|
+
const footer = TuiRenderer.renderFooter(stats.lastInputTokens, config.contextWindowTokens, config.compressionThreshold);
|
|
571
|
+
tuiChannel.streamText('\n\n' + footer + '\n');
|
|
572
|
+
}
|
|
573
|
+
else {
|
|
574
|
+
tuiChannel.streamText('\n\n');
|
|
575
|
+
}
|
|
576
|
+
responseBuffer = '';
|
|
577
|
+
replyCount++;
|
|
578
|
+
}
|
|
579
|
+
else {
|
|
580
|
+
await flush(true);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
}, undefined, message.attachments, statusEnabled ? updateStatus : undefined);
|
|
584
|
+
}
|
|
585
|
+
catch (error) {
|
|
586
|
+
const errorMsg = error.message ||
|
|
587
|
+
(typeof error === 'object' ? JSON.stringify(error) : String(error));
|
|
588
|
+
logger.error(`Routing error: ${errorMsg}`);
|
|
589
|
+
await message.reply(`❌ **Supervisor Error:** ${errorMsg}`);
|
|
590
|
+
}
|
|
591
|
+
finally {
|
|
592
|
+
message.stopTyping();
|
|
593
|
+
}
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/supervisor/bootstrap.ts"],"names":[],"mappings":"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"}
|