@kernel.chat/kbot 3.33.1 → 3.34.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ export declare function runCompete(task: string): Promise<void>;
2
+ //# sourceMappingURL=compete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compete.d.ts","sourceRoot":"","sources":["../src/compete.ts"],"names":[],"mappings":"AA2LA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwF5D"}
@@ -0,0 +1,233 @@
1
+ // kbot Compete — Head-to-Head Performance Benchmark
2
+ //
3
+ // Usage: kbot compete "explain this codebase"
4
+ //
5
+ // Runs a task through kbot's agent loop and measures:
6
+ // - Response time
7
+ // - Tokens used (input/output)
8
+ // - Tools called (names + count)
9
+ // - Cost estimate
10
+ // - Agent selected + confidence
11
+ //
12
+ // Saves results to ~/.kbot/benchmarks/ and compares against previous runs.
13
+ import { homedir } from 'os';
14
+ import { join } from 'path';
15
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
16
+ import { performance } from 'perf_hooks';
17
+ import { createRequire } from 'module';
18
+ const __require = createRequire(import.meta.url);
19
+ const PKG_VERSION = __require('../package.json').version;
20
+ // ── ANSI escape codes ──
21
+ const BOLD = '\x1b[1m';
22
+ const DIM_START = '\x1b[2m';
23
+ const RESET = '\x1b[0m';
24
+ const GREEN = '\x1b[32m';
25
+ const RED = '\x1b[31m';
26
+ const PURPLE = '\x1b[35m';
27
+ const CYAN = '\x1b[36m';
28
+ const YELLOW = '\x1b[33m';
29
+ function dim(s) { return `${DIM_START}${s}${RESET}`; }
30
+ function bold(s) { return `${BOLD}${s}${RESET}`; }
31
+ function purple(s) { return `${PURPLE}${s}${RESET}`; }
32
+ function green(s) { return `${GREEN}${s}${RESET}`; }
33
+ function cyan(s) { return `${CYAN}${s}${RESET}`; }
34
+ function yellow(s) { return `${YELLOW}${s}${RESET}`; }
35
+ // ── Benchmark persistence ──
36
+ const BENCH_DIR = join(homedir(), '.kbot', 'benchmarks');
37
+ const BENCH_FILE = join(BENCH_DIR, 'history.json');
38
+ const MAX_HISTORY = 100;
39
+ function ensureDir() {
40
+ if (!existsSync(BENCH_DIR))
41
+ mkdirSync(BENCH_DIR, { recursive: true });
42
+ }
43
+ function loadHistory() {
44
+ ensureDir();
45
+ if (!existsSync(BENCH_FILE))
46
+ return [];
47
+ try {
48
+ return JSON.parse(readFileSync(BENCH_FILE, 'utf-8'));
49
+ }
50
+ catch {
51
+ return [];
52
+ }
53
+ }
54
+ function saveResult(result) {
55
+ ensureDir();
56
+ const history = loadHistory();
57
+ history.unshift(result);
58
+ writeFileSync(BENCH_FILE, JSON.stringify(history.slice(0, MAX_HISTORY), null, 2));
59
+ }
60
+ function findBaseline(task, currentTimestamp) {
61
+ const history = loadHistory();
62
+ const normalized = task.toLowerCase().replace(/[^a-z0-9\s]/g, '').trim();
63
+ for (const h of history) {
64
+ if (h.timestamp === currentTimestamp)
65
+ continue;
66
+ const hNorm = h.task.toLowerCase().replace(/[^a-z0-9\s]/g, '').trim();
67
+ if (hNorm === normalized)
68
+ return h;
69
+ }
70
+ return null;
71
+ }
72
+ // ── Formatting helpers ──
73
+ function formatTime(ms) {
74
+ if (ms < 1000)
75
+ return `${Math.round(ms)}ms`;
76
+ return `${(ms / 1000).toFixed(1)}s`;
77
+ }
78
+ function formatCost(usd, isLocal) {
79
+ if (isLocal)
80
+ return '$0.00 (local)';
81
+ if (usd === 0)
82
+ return '$0.00';
83
+ if (usd < 0.001)
84
+ return `$${usd.toFixed(6)}`;
85
+ if (usd < 0.01)
86
+ return `$${usd.toFixed(4)}`;
87
+ return `$${usd.toFixed(3)}`;
88
+ }
89
+ function formatTokens(input, output) {
90
+ const fmt = (n) => n > 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);
91
+ return `${fmt(input)} in / ${fmt(output)} out`;
92
+ }
93
+ function deltaStr(current, baseline, lowerIsBetter = true) {
94
+ if (baseline === 0)
95
+ return '';
96
+ const diff = current - baseline;
97
+ const pct = Math.round((diff / baseline) * 100);
98
+ const sign = diff > 0 ? '+' : '';
99
+ const color = (lowerIsBetter ? diff <= 0 : diff >= 0) ? GREEN : RED;
100
+ return ` ${color}${sign}${pct}% vs last${RESET}`;
101
+ }
102
+ // ── Report ──
103
+ function printReport(result, baseline) {
104
+ const w = Math.min(process.stdout.columns || 80, 60);
105
+ const line = dim('\u2500'.repeat(w));
106
+ console.log();
107
+ console.log(` ${purple('\u25cf')} ${bold('kbot Performance Report')}`);
108
+ console.log(` ${line}`);
109
+ console.log();
110
+ // Task
111
+ const taskDisplay = result.task.length > w - 12
112
+ ? result.task.slice(0, w - 15) + '...'
113
+ : result.task;
114
+ console.log(` Task: ${dim('"')}${taskDisplay}${dim('"')}`);
115
+ // Time
116
+ const timeStr = formatTime(result.timeMs);
117
+ const timeDelta = baseline ? deltaStr(result.timeMs, baseline.timeMs) : '';
118
+ console.log(` Time: ${purple(timeStr)}${timeDelta}`);
119
+ // Tools
120
+ const uniqueTools = [...new Set(result.toolsCalled)];
121
+ const toolNames = uniqueTools.length > 0 ? uniqueTools.join(', ') : 'none';
122
+ const toolCount = result.toolCallCount;
123
+ const toolSuffix = toolCount > 0 ? ` (${toolCount} call${toolCount !== 1 ? 's' : ''})` : '';
124
+ console.log(` Tools: ${cyan(`${toolNames}${toolSuffix}`)}`);
125
+ // Tokens
126
+ const tokensStr = formatTokens(result.inputTokens, result.outputTokens);
127
+ const tokenTotal = result.inputTokens + result.outputTokens;
128
+ const baselineTotal = baseline ? baseline.inputTokens + baseline.outputTokens : 0;
129
+ const tokenDelta = baseline ? deltaStr(tokenTotal, baselineTotal) : '';
130
+ console.log(` Tokens: ${dim(tokensStr)}${tokenDelta}`);
131
+ // Cost
132
+ const costStr = formatCost(result.costUsd, result.isLocal);
133
+ const costDelta = baseline && !result.isLocal ? deltaStr(result.costUsd, baseline.costUsd) : '';
134
+ console.log(` Cost: ${green(costStr)}${costDelta}`);
135
+ // Agent
136
+ const confStr = result.confidence > 0 ? ` (confidence: ${result.confidence.toFixed(2)})` : '';
137
+ console.log(` Agent: ${yellow(result.agent)}${dim(confStr)}`);
138
+ // Model
139
+ console.log(` Model: ${dim(result.model)}`);
140
+ // Response
141
+ const respLen = result.responseLength;
142
+ const respStr = respLen > 1000 ? `${(respLen / 1000).toFixed(1)}k chars` : `${respLen} chars`;
143
+ console.log(` Response: ${dim(respStr)}`);
144
+ console.log();
145
+ console.log(` ${line}`);
146
+ if (baseline) {
147
+ const d = new Date(baseline.timestamp);
148
+ console.log(` ${dim(`Baseline: ${d.toLocaleDateString()} ${d.toLocaleTimeString()} (v${baseline.version})`)}`);
149
+ }
150
+ else {
151
+ console.log(` ${dim('No baseline \u2014 this run becomes the baseline for future comparisons.')}`);
152
+ }
153
+ console.log();
154
+ }
155
+ // ── Main entry ──
156
+ export async function runCompete(task) {
157
+ if (!task || task.trim().length === 0) {
158
+ console.error(`${RED}Error:${RESET} Provide a task to benchmark.`);
159
+ console.error(' Usage: kbot compete "explain this codebase"');
160
+ process.exit(1);
161
+ }
162
+ console.log();
163
+ console.log(` ${purple('\u25cf')} ${bold('kbot compete')} \u2014 benchmarking...`);
164
+ console.log(` ${dim(`"${task}"`)}`);
165
+ console.log();
166
+ // Dynamic imports to avoid side effects at module level
167
+ const { runAgent } = await import('./agent.js');
168
+ const { learnedRoute } = await import('./learned-router.js');
169
+ const { isLocalProvider, getByokProvider } = await import('./auth.js');
170
+ // Check routing confidence before running
171
+ const routeResult = learnedRoute(task);
172
+ const routedAgent = routeResult?.agent || 'kernel';
173
+ const routeConfidence = routeResult?.confidence || 0;
174
+ // Determine provider locality
175
+ const provider = getByokProvider();
176
+ const isLocal = provider ? isLocalProvider(provider) : false;
177
+ // Run the task through the real agent loop
178
+ const startTime = performance.now();
179
+ let response;
180
+ try {
181
+ response = await runAgent(task, {
182
+ agent: routeResult?.agent,
183
+ stream: false,
184
+ });
185
+ }
186
+ catch (err) {
187
+ const errMsg = err instanceof Error ? err.message : String(err);
188
+ console.error(` ${RED}Benchmark failed:${RESET} ${errMsg}`);
189
+ process.exit(1);
190
+ }
191
+ const endTime = performance.now();
192
+ const timeMs = Math.round(endTime - startTime);
193
+ // Extract metrics
194
+ const inputTokens = response.usage?.input_tokens || 0;
195
+ const outputTokens = response.usage?.output_tokens || 0;
196
+ const costUsd = response.usage?.cost_usd || 0;
197
+ const toolCallCount = response.toolCalls || 0;
198
+ // Build result
199
+ const now = new Date().toISOString();
200
+ const result = {
201
+ task: task.slice(0, 200),
202
+ timestamp: now,
203
+ version: PKG_VERSION,
204
+ timeMs,
205
+ toolsCalled: [],
206
+ toolCallCount,
207
+ inputTokens,
208
+ outputTokens,
209
+ costUsd,
210
+ agent: response.agent || routedAgent,
211
+ confidence: routeConfidence,
212
+ model: response.model || 'unknown',
213
+ isLocal,
214
+ responseLength: response.content.length,
215
+ };
216
+ // Best-effort tool name extraction from response content
217
+ const knownTools = [
218
+ 'read_file', 'write_file', 'edit_file', 'glob', 'grep', 'bash',
219
+ 'git_status', 'git_diff', 'git_log', 'git_commit', 'list_directory',
220
+ 'web_search', 'url_fetch', 'github_api', 'create_file', 'delete_file',
221
+ 'notebook_run', 'browser_navigate', 'browser_snapshot',
222
+ ];
223
+ if (toolCallCount > 0) {
224
+ const contentLower = response.content.toLowerCase();
225
+ const mentioned = knownTools.filter(t => contentLower.includes(t) || contentLower.includes(t.replace(/_/g, ' ')));
226
+ result.toolsCalled = mentioned.length > 0 ? mentioned : ['(tool names not captured)'];
227
+ }
228
+ // Save and compare
229
+ saveResult(result);
230
+ const baseline = findBaseline(task, now);
231
+ printReport(result, baseline);
232
+ }
233
+ //# sourceMappingURL=compete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compete.js","sourceRoot":"","sources":["../src/compete.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runDashboard(): Promise<void>;
2
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAwTA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAqDlD"}
@@ -0,0 +1,277 @@
1
+ // kbot Dashboard — Live Learning Dashboard TUI
2
+ //
3
+ // Usage: kbot dashboard
4
+ //
5
+ // Renders a live terminal dashboard showing learning stats, tool usage,
6
+ // agent routing, session history, and growth metrics.
7
+ // Refreshes every 5 seconds. Press 'q' to quit.
8
+ //
9
+ // Uses only Node built-ins + ANSI escape codes — no external deps.
10
+ import { readFileSync, existsSync, readdirSync } from 'fs';
11
+ import { homedir } from 'os';
12
+ import { join } from 'path';
13
+ import { createRequire } from 'module';
14
+ const __require = createRequire(import.meta.url);
15
+ const PKG_VERSION = __require('../package.json').version;
16
+ const KBOT_DIR = join(homedir(), '.kbot');
17
+ const MEMORY_DIR = join(KBOT_DIR, 'memory');
18
+ const SESSIONS_DIR = join(KBOT_DIR, 'sessions');
19
+ // ── ANSI escape codes ──
20
+ const ESC = '\x1b';
21
+ const BOLD = `${ESC}[1m`;
22
+ const DIM_START = `${ESC}[2m`;
23
+ const RESET = `${ESC}[0m`;
24
+ const GREEN = `${ESC}[32m`;
25
+ const RED = `${ESC}[31m`;
26
+ const PURPLE = `${ESC}[35m`;
27
+ const CYAN = `${ESC}[36m`;
28
+ const YELLOW = `${ESC}[33m`;
29
+ const WHITE = `${ESC}[37m`;
30
+ function dim(s) { return `${DIM_START}${s}${RESET}`; }
31
+ function bold(s) { return `${BOLD}${s}${RESET}`; }
32
+ function purple(s) { return `${PURPLE}${s}${RESET}`; }
33
+ function green(s) { return `${GREEN}${s}${RESET}`; }
34
+ function cyan(s) { return `${CYAN}${s}${RESET}`; }
35
+ function yellow(s) { return `${YELLOW}${s}${RESET}`; }
36
+ function white(s) { return `${WHITE}${s}${RESET}`; }
37
+ // ── Box drawing ──
38
+ const BOX = { tl: '\u256d', tr: '\u256e', bl: '\u2570', br: '\u256f', h: '\u2500', v: '\u2502' };
39
+ function stripAnsi(str) {
40
+ return str.replace(/\x1b\[[0-9;]*m/g, '');
41
+ }
42
+ function bar(value, max, width = 20) {
43
+ const filled = Math.round((value / Math.max(max, 1)) * width);
44
+ return GREEN + '\u2588'.repeat(filled) + DIM_START + '\u2591'.repeat(width - filled) + RESET;
45
+ }
46
+ function loadJSON(path, fallback) {
47
+ if (!existsSync(path))
48
+ return fallback;
49
+ try {
50
+ return JSON.parse(readFileSync(path, 'utf-8'));
51
+ }
52
+ catch {
53
+ return fallback;
54
+ }
55
+ }
56
+ const DEFAULT_PROFILE = {
57
+ responseStyle: 'auto',
58
+ techStack: [],
59
+ taskPatterns: {},
60
+ preferredAgents: {},
61
+ totalMessages: 0,
62
+ totalTokens: 0,
63
+ tokensSaved: 0,
64
+ avgTokensPerMessage: 0,
65
+ sessions: 0,
66
+ };
67
+ function loadDashboardData() {
68
+ const patterns = loadJSON(join(MEMORY_DIR, 'patterns.json'), []);
69
+ const solutions = loadJSON(join(MEMORY_DIR, 'solutions.json'), []);
70
+ const knowledge = loadJSON(join(MEMORY_DIR, 'knowledge.json'), []);
71
+ const profile = loadJSON(join(MEMORY_DIR, 'profile.json'), DEFAULT_PROFILE);
72
+ const routingHistory = loadJSON(join(MEMORY_DIR, 'routing-history.json'), []);
73
+ // Load sessions from directory listing
74
+ const sessions = [];
75
+ if (existsSync(SESSIONS_DIR)) {
76
+ const files = readdirSync(SESSIONS_DIR).filter(f => f.endsWith('.json'));
77
+ for (const file of files) {
78
+ try {
79
+ const raw = JSON.parse(readFileSync(join(SESSIONS_DIR, file), 'utf-8'));
80
+ sessions.push({
81
+ id: raw.id,
82
+ name: raw.name,
83
+ updated: raw.updated,
84
+ turnCount: raw.turnCount,
85
+ agent: raw.agent,
86
+ });
87
+ }
88
+ catch {
89
+ continue;
90
+ }
91
+ }
92
+ sessions.sort((a, b) => new Date(b.updated).getTime() - new Date(a.updated).getTime());
93
+ }
94
+ return { patterns, solutions, knowledge, profile, routingHistory, sessions };
95
+ }
96
+ // ── Render ──
97
+ function render(data) {
98
+ const cols = process.stdout.columns || 80;
99
+ const panelWidth = Math.min(cols - 2, 78);
100
+ const halfWidth = Math.floor((panelWidth - 1) / 2);
101
+ const barWidth = Math.max(8, halfWidth - 22);
102
+ const lines = [];
103
+ // Clear screen and move cursor to top
104
+ process.stdout.write(`${ESC}[2J${ESC}[H`);
105
+ // ── Header ──
106
+ const now = new Date().toLocaleTimeString();
107
+ lines.push('');
108
+ lines.push(` ${purple('\u25cf')} ${bold(`kbot Dashboard \u2014 v${PKG_VERSION}`)} ${dim(now)} ${dim('(q to quit)')}`);
109
+ lines.push(` ${dim(BOX.h.repeat(panelWidth))}`);
110
+ // ── Learning Stats ──
111
+ const totalPatterns = data.patterns.length;
112
+ const totalSolutions = data.solutions.length;
113
+ const totalKnowledge = data.knowledge.length;
114
+ const totalMessages = data.profile.totalMessages;
115
+ const tokensSaved = data.profile.tokensSaved;
116
+ const tokensSavedStr = tokensSaved > 1000 ? `${(tokensSaved / 1000).toFixed(1)}k` : String(tokensSaved);
117
+ // Classify patterns by tool bucket
118
+ const patternsByCategory = {};
119
+ for (const p of data.patterns) {
120
+ const cat = p.toolSequence[0] || 'general';
121
+ const bucket = cat.includes('file') || cat.includes('read') || cat.includes('write') ? 'file-ops'
122
+ : cat.includes('git') ? 'git'
123
+ : cat.includes('bash') || cat.includes('shell') ? 'shell'
124
+ : cat.includes('search') || cat.includes('grep') ? 'search'
125
+ : cat.includes('web') || cat.includes('fetch') ? 'web'
126
+ : 'other';
127
+ patternsByCategory[bucket] = (patternsByCategory[bucket] || 0) + 1;
128
+ }
129
+ lines.push('');
130
+ lines.push(` ${cyan(bold('Learning Engine'))}`);
131
+ lines.push(` Patterns: ${bold(String(totalPatterns))}`);
132
+ lines.push(` Solutions: ${bold(String(totalSolutions))}`);
133
+ lines.push(` Knowledge: ${bold(String(totalKnowledge))}`);
134
+ lines.push(` Messages: ${dim(String(totalMessages))}`);
135
+ lines.push(` Tokens saved: ${green(tokensSavedStr)}`);
136
+ const catEntries = Object.entries(patternsByCategory).sort((a, b) => b[1] - a[1]);
137
+ if (catEntries.length > 0) {
138
+ lines.push('');
139
+ lines.push(` ${dim('Patterns by category:')}`);
140
+ const maxCat = catEntries[0][1];
141
+ for (const [cat, count] of catEntries.slice(0, 5)) {
142
+ lines.push(` ${cat.padEnd(14)} ${bar(count, maxCat, barWidth)} ${dim(String(count))}`);
143
+ }
144
+ }
145
+ // ── Top Tools ──
146
+ const toolCounts = {};
147
+ for (const p of data.patterns) {
148
+ for (const t of p.toolSequence) {
149
+ toolCounts[t] = (toolCounts[t] || 0) + p.hits;
150
+ }
151
+ }
152
+ const topTools = Object.entries(toolCounts).sort((a, b) => b[1] - a[1]).slice(0, 8);
153
+ lines.push('');
154
+ lines.push(` ${dim(BOX.h.repeat(panelWidth))}`);
155
+ lines.push(` ${yellow(bold('Top Tools'))}`);
156
+ if (topTools.length > 0) {
157
+ const maxTool = topTools[0][1];
158
+ for (const [tool, count] of topTools) {
159
+ lines.push(` ${tool.padEnd(14)} ${bar(count, maxTool, barWidth)} ${dim(String(count))}`);
160
+ }
161
+ }
162
+ else {
163
+ lines.push(` ${dim('No tool usage data yet. Start using kbot to populate.')}`);
164
+ }
165
+ // ── Agent Routing ──
166
+ const agentCounts = { ...data.profile.preferredAgents };
167
+ for (const r of data.routingHistory) {
168
+ agentCounts[r.agent] = (agentCounts[r.agent] || 0) + 1;
169
+ }
170
+ const topAgents = Object.entries(agentCounts).sort((a, b) => b[1] - a[1]).slice(0, 7);
171
+ // Routing method breakdown
172
+ const methodCounts = {};
173
+ for (const r of data.routingHistory) {
174
+ methodCounts[r.method] = (methodCounts[r.method] || 0) + 1;
175
+ }
176
+ const totalRoutes = data.routingHistory.length;
177
+ const cached = totalRoutes - (methodCounts['llm'] || 0);
178
+ const cacheRate = totalRoutes > 0 ? Math.round((cached / totalRoutes) * 100) : 0;
179
+ lines.push('');
180
+ lines.push(` ${dim(BOX.h.repeat(panelWidth))}`);
181
+ lines.push(` ${green(bold('Agent Routing'))}`);
182
+ if (topAgents.length > 0) {
183
+ const maxAgent = topAgents[0][1];
184
+ for (const [agent, count] of topAgents) {
185
+ lines.push(` ${agent.padEnd(14)} ${bar(count, maxAgent, barWidth)} ${dim(String(count))}`);
186
+ }
187
+ lines.push(` ${dim(`Routes: ${totalRoutes} Cache hit: ${cacheRate}%`)}`);
188
+ }
189
+ else {
190
+ lines.push(` ${dim('No routing data yet. kbot learns which agents perform best over time.')}`);
191
+ }
192
+ // ── Sessions ──
193
+ const totalSessions = data.sessions.length;
194
+ const profileSessions = data.profile.sessions || totalSessions;
195
+ const lastSession = data.sessions[0];
196
+ lines.push('');
197
+ lines.push(` ${dim(BOX.h.repeat(panelWidth))}`);
198
+ lines.push(` ${purple(bold('Sessions'))}`);
199
+ lines.push(` Total: ${bold(String(totalSessions))} saved sessions (${dim(`${profileSessions} lifetime`)})`);
200
+ if (lastSession) {
201
+ const d = new Date(lastSession.updated);
202
+ lines.push(` Last: ${dim(d.toLocaleDateString())} ${dim(d.toLocaleTimeString())} ${dim(`\u2014 ${lastSession.name}`)}`);
203
+ }
204
+ const recentSessions = data.sessions.slice(0, 5);
205
+ if (recentSessions.length > 0) {
206
+ lines.push(` ${dim('Recent:')}`);
207
+ for (const s of recentSessions) {
208
+ const d = new Date(s.updated);
209
+ const date = `${d.getMonth() + 1}/${d.getDate()}`;
210
+ const name = s.name.length > panelWidth - 20 ? s.name.slice(0, panelWidth - 23) + '...' : s.name;
211
+ lines.push(` ${dim(date)} ${name} ${dim(`(${s.turnCount} turns)`)}`);
212
+ }
213
+ }
214
+ // ── Footer: Growth summary ──
215
+ lines.push('');
216
+ lines.push(` ${dim(BOX.h.repeat(panelWidth))}`);
217
+ const growthMsg = totalPatterns > 0
218
+ ? `kbot has learned ${bold(String(totalPatterns))} patterns across ${bold(String(profileSessions))} sessions`
219
+ : 'kbot is ready to learn \u2014 start a conversation to build patterns';
220
+ lines.push(` ${purple('\u25cf')} ${growthMsg}`);
221
+ const techStack = data.profile.techStack.slice(0, 5).join(', ');
222
+ if (techStack) {
223
+ lines.push(` ${dim(`Tech stack: ${techStack}`)}`);
224
+ }
225
+ lines.push(` ${dim('Refreshes every 5s \u00b7 Press q to quit')}`);
226
+ lines.push('');
227
+ process.stdout.write(lines.join('\n'));
228
+ }
229
+ // ── Main loop ──
230
+ export async function runDashboard() {
231
+ // Validate TTY
232
+ if (!process.stdout.isTTY) {
233
+ console.error('kbot dashboard requires an interactive terminal.');
234
+ process.exit(1);
235
+ }
236
+ // Hide cursor
237
+ process.stdout.write(`${ESC}[?25l`);
238
+ // Clean exit
239
+ const cleanup = () => {
240
+ process.stdout.write(`${ESC}[?25h`); // show cursor
241
+ process.stdout.write(`${ESC}[2J${ESC}[H`); // clear screen
242
+ process.stdout.write(`${purple('\u25cf')} Dashboard closed.\n`);
243
+ process.exit(0);
244
+ };
245
+ process.on('SIGINT', cleanup);
246
+ process.on('SIGTERM', cleanup);
247
+ // Enable raw mode for keypress detection
248
+ if (process.stdin.setRawMode) {
249
+ process.stdin.setRawMode(true);
250
+ }
251
+ process.stdin.resume();
252
+ process.stdin.setEncoding('utf-8');
253
+ process.stdin.on('data', (key) => {
254
+ // q, Q, or Ctrl+C
255
+ if (key === 'q' || key === 'Q' || key === '\x03') {
256
+ cleanup();
257
+ }
258
+ });
259
+ // Initial render
260
+ const data = loadDashboardData();
261
+ render(data);
262
+ // Refresh loop
263
+ const interval = setInterval(() => {
264
+ try {
265
+ const freshData = loadDashboardData();
266
+ render(freshData);
267
+ }
268
+ catch {
269
+ // Non-fatal — skip this render cycle
270
+ }
271
+ }, 5000);
272
+ // Keep process alive until cleanup() is called
273
+ await new Promise(() => {
274
+ process.on('exit', () => clearInterval(interval));
275
+ });
276
+ }
277
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ interface DigestData {
2
+ patterns: number;
3
+ solutions: number;
4
+ sessions: number;
5
+ topTools: Array<{
6
+ name: string;
7
+ count: number;
8
+ }>;
9
+ topAgents: Array<{
10
+ name: string;
11
+ count: number;
12
+ }>;
13
+ growthPercent: number;
14
+ }
15
+ export declare function gatherDigestData(): DigestData;
16
+ export declare function formatDigest(data: DigestData, version: string): string;
17
+ export declare function runDigest(): Promise<void>;
18
+ export {};
19
+ //# sourceMappingURL=digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../src/digest.ts"],"names":[],"mappings":"AASA,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAChD,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjD,aAAa,EAAE,MAAM,CAAA;CACtB;AASD,wBAAgB,gBAAgB,IAAI,UAAU,CAgC7C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA2BtE;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAK/C"}