@saccolabs/tars 1.36.0 → 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.
@@ -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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"}