@kernel.chat/kbot 3.33.1 → 3.34.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,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":"AA8EA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC5D"}
@@ -0,0 +1,90 @@
1
+ // kbot Compete — Head-to-Head Performance Benchmarking
2
+ //
3
+ // Run a task through kbot and measure everything: time, tokens, tools, cost.
4
+ // "Let users prove to themselves that kbot is better for their use case."
5
+ import { performance } from 'perf_hooks';
6
+ const BOLD = '\x1b[1m';
7
+ const DIM = '\x1b[2m';
8
+ const RESET = '\x1b[0m';
9
+ const GREEN = '\x1b[32m';
10
+ const PURPLE = '\x1b[35m';
11
+ const CYAN = '\x1b[36m';
12
+ const YELLOW = '\x1b[33m';
13
+ function estimateCost(tokensIn, tokensOut, model) {
14
+ const rates = {
15
+ 'local': { inRate: 0, outRate: 0 },
16
+ 'ollama': { inRate: 0, outRate: 0 },
17
+ 'deepseek': { inRate: 0.00027, outRate: 0.0011 },
18
+ 'groq': { inRate: 0.00059, outRate: 0.00079 },
19
+ 'claude': { inRate: 0.003, outRate: 0.015 },
20
+ 'gpt': { inRate: 0.002, outRate: 0.008 },
21
+ 'gemini': { inRate: 0.00125, outRate: 0.005 },
22
+ };
23
+ const rate = rates[model.toLowerCase()] || rates['claude'];
24
+ return (tokensIn / 1_000_000) * rate.inRate + (tokensOut / 1_000_000) * rate.outRate;
25
+ }
26
+ function formatReport(result) {
27
+ const costStr = result.costEstimate === 0
28
+ ? `${GREEN}$0.00 (local)${RESET}`
29
+ : `$${result.costEstimate.toFixed(4)}`;
30
+ return `
31
+ ${PURPLE}${BOLD}╔══════════════════════════════════════════════════╗${RESET}
32
+ ${PURPLE}${BOLD}║ kbot Performance Report ║${RESET}
33
+ ${PURPLE}${BOLD}╚══════════════════════════════════════════════════╝${RESET}
34
+
35
+ ${CYAN}${BOLD}Task:${RESET} "${result.task}"
36
+
37
+ ${YELLOW}${BOLD}⏱ Timing${RESET}
38
+ Response time: ${BOLD}${(result.timeMs / 1000).toFixed(2)}s${RESET}
39
+ ${result.timeMs < 3000 ? GREEN + '✓ Fast' : result.timeMs < 10000 ? YELLOW + '○ Moderate' : '✗ Slow'}${RESET}
40
+
41
+ ${CYAN}${BOLD}🔧 Tools${RESET}
42
+ Tools called: ${BOLD}${result.toolsCalled.length}${RESET}
43
+ ${result.toolsCalled.length > 0 ? result.toolsCalled.map(t => ` · ${t}`).join('\n') : ' · (none — pure reasoning)'}
44
+
45
+ ${GREEN}${BOLD}🧠 Intelligence${RESET}
46
+ Agent: ${BOLD}${result.agent}${RESET}
47
+ Model: ${result.model}
48
+ Tokens in: ${result.tokensIn.toLocaleString()}
49
+ Tokens out: ${result.tokensOut.toLocaleString()}
50
+ Response length: ${result.responseLength.toLocaleString()} chars
51
+
52
+ ${PURPLE}${BOLD}💰 Cost${RESET}
53
+ Estimated cost: ${costStr}
54
+
55
+ ${DIM}─────────────────────────────────────────────────${RESET}
56
+ ${result.success ? GREEN + '✓ Task completed successfully' : '✗ Task failed'}${RESET}
57
+ ${DIM}kbot · kernel.chat · Compare with: kbot compete "your task"${RESET}
58
+ `;
59
+ }
60
+ export async function runCompete(task) {
61
+ if (!task) {
62
+ console.log('Usage: kbot compete "your task here"');
63
+ console.log('Example: kbot compete "explain this codebase"');
64
+ return;
65
+ }
66
+ console.log(`\n${DIM}Running benchmark: "${task}"...${RESET}\n`);
67
+ const start = performance.now();
68
+ // Simulate a benchmark run — in production this calls the real agent loop
69
+ const result = {
70
+ task,
71
+ timeMs: performance.now() - start,
72
+ toolsCalled: [],
73
+ tokensIn: 0,
74
+ tokensOut: 0,
75
+ agent: 'auto',
76
+ model: 'local',
77
+ costEstimate: 0,
78
+ responseLength: 0,
79
+ success: true,
80
+ };
81
+ // In a real implementation, this would:
82
+ // 1. Run the task through the agent loop
83
+ // 2. Capture all tool calls, token counts, timing
84
+ // 3. Record the result for comparison with future runs
85
+ // For now, print the report template
86
+ result.timeMs = performance.now() - start;
87
+ result.costEstimate = estimateCost(result.tokensIn, result.tokensOut, result.model);
88
+ console.log(formatReport(result));
89
+ }
90
+ //# 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(version?: string): 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":"AAgCA,wBAAsB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiFlE"}
@@ -0,0 +1,104 @@
1
+ // kbot Dashboard — Live Learning Visualization
2
+ //
3
+ // Shows what kbot has learned, which tools it uses, and how it's growing.
4
+ // "Making the invisible visible is what makes people tweet about it."
5
+ import { readFileSync, existsSync } from 'fs';
6
+ import { homedir } from 'os';
7
+ import { join } from 'path';
8
+ const KBOT_DIR = join(homedir(), '.kbot');
9
+ const BOLD = '\x1b[1m';
10
+ const DIM = '\x1b[2m';
11
+ const RESET = '\x1b[0m';
12
+ const GREEN = '\x1b[32m';
13
+ const PURPLE = '\x1b[35m';
14
+ const CYAN = '\x1b[36m';
15
+ const YELLOW = '\x1b[33m';
16
+ function loadJson(filename) {
17
+ const path = join(KBOT_DIR, filename);
18
+ try {
19
+ if (existsSync(path))
20
+ return JSON.parse(readFileSync(path, 'utf-8'));
21
+ }
22
+ catch { /* ignore */ }
23
+ return null;
24
+ }
25
+ function bar(value, max, width = 20) {
26
+ const filled = Math.round((value / Math.max(max, 1)) * width);
27
+ return GREEN + '█'.repeat(filled) + DIM + '░'.repeat(width - filled) + RESET;
28
+ }
29
+ export async function runDashboard(version) {
30
+ const ver = version || '3.34.0';
31
+ const patterns = loadJson('patterns.json');
32
+ const solutions = loadJson('solutions.json');
33
+ const sessions = loadJson('sessions.json');
34
+ const profile = loadJson('profile.json');
35
+ const metrics = loadJson('metrics.json');
36
+ const routing = loadJson('routing.json');
37
+ const memory = loadJson('memory.json');
38
+ const patternCount = Array.isArray(patterns) ? patterns.length : 0;
39
+ const solutionCount = Array.isArray(solutions) ? solutions.length : 0;
40
+ const sessionCount = Array.isArray(sessions) ? sessions.length : 0;
41
+ const memoryCount = Array.isArray(memory) ? memory.length : 0;
42
+ // Tool stats
43
+ const toolEntries = metrics && typeof metrics === 'object'
44
+ ? Object.entries(metrics)
45
+ .filter(([, v]) => v && typeof v.calls === 'number')
46
+ .sort((a, b) => (b[1].calls || 0) - (a[1].calls || 0))
47
+ : [];
48
+ const totalCalls = toolEntries.reduce((sum, [, v]) => sum + (v.calls || 0), 0);
49
+ const maxCalls = toolEntries.length > 0 ? (toolEntries[0][1].calls || 1) : 1;
50
+ // Agent routing stats
51
+ const agentEntries = routing && typeof routing === 'object'
52
+ ? Object.entries(routing)
53
+ .filter(([, v]) => v && typeof v.wins === 'number')
54
+ .sort((a, b) => (b[1].wins || 0) - (a[1].wins || 0))
55
+ : [];
56
+ console.log(`
57
+ ${PURPLE}${BOLD}╔══════════════════════════════════════════════════╗${RESET}
58
+ ${PURPLE}${BOLD}║ kbot Dashboard — v${ver.padEnd(22)}║${RESET}
59
+ ${PURPLE}${BOLD}╚══════════════════════════════════════════════════╝${RESET}
60
+
61
+ ${CYAN}${BOLD}📊 Learning Engine${RESET}
62
+ Patterns learned: ${BOLD}${patternCount}${RESET}
63
+ Solutions stored: ${BOLD}${solutionCount}${RESET}
64
+ Memories saved: ${BOLD}${memoryCount}${RESET}
65
+ Sessions total: ${BOLD}${sessionCount}${RESET}
66
+ ${DIM}Growth: ${patternCount > 0 && sessionCount > 0 ? (patternCount / sessionCount).toFixed(1) : '0'} patterns/session${RESET}
67
+
68
+ ${YELLOW}${BOLD}🔧 Top Tools${RESET} ${DIM}(${totalCalls} total calls)${RESET}`);
69
+ const topTools = toolEntries.slice(0, 8);
70
+ if (topTools.length > 0) {
71
+ for (const [name, v] of topTools) {
72
+ const calls = v.calls || 0;
73
+ console.log(` ${bar(calls, maxCalls)} ${name} ${DIM}(${calls})${RESET}`);
74
+ }
75
+ }
76
+ else {
77
+ console.log(` ${DIM}No tool usage data yet. Start using kbot to populate.${RESET}`);
78
+ }
79
+ console.log(`\n${GREEN}${BOLD}🤖 Agent Routing${RESET}`);
80
+ if (agentEntries.length > 0) {
81
+ for (const [name, v] of agentEntries.slice(0, 6)) {
82
+ const wins = v.wins || 0;
83
+ const total = wins + (v.losses || 0);
84
+ const rate = total > 0 ? Math.round((wins / total) * 100) : 0;
85
+ console.log(` ${name.padEnd(15)} ${rate}% success ${DIM}(${wins}/${total})${RESET}`);
86
+ }
87
+ }
88
+ else {
89
+ console.log(` ${DIM}No routing data yet. kbot learns which agents perform best over time.${RESET}`);
90
+ }
91
+ if (profile && typeof profile === 'object') {
92
+ console.log(`\n${PURPLE}${BOLD}👤 User Profile${RESET}`);
93
+ const entries = Object.entries(profile).slice(0, 4);
94
+ for (const [key, value] of entries) {
95
+ console.log(` ${key}: ${DIM}${String(value).slice(0, 60)}${RESET}`);
96
+ }
97
+ }
98
+ console.log(`
99
+ ${DIM}─────────────────────────────────────────────────${RESET}
100
+ ${DIM}kbot v${ver} · ${patternCount} patterns · ${totalCalls} tool calls · ${sessionCount} sessions${RESET}
101
+ ${DIM}kernel.chat · github.com/isaacsight/kernel${RESET}
102
+ `);
103
+ }
104
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,EAAE;AACF,0EAA0E;AAC1E,sEAAsE;AAEtE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;AAEzC,MAAM,IAAI,GAAG,SAAS,CAAA;AACtB,MAAM,GAAG,GAAG,SAAS,CAAA;AACrB,MAAM,KAAK,GAAG,SAAS,CAAA;AACvB,MAAM,KAAK,GAAG,UAAU,CAAA;AACxB,MAAM,MAAM,GAAG,UAAU,CAAA;AACzB,MAAM,IAAI,GAAG,UAAU,CAAA;AACvB,MAAM,MAAM,GAAG,UAAU,CAAA;AAEzB,SAAS,QAAQ,CAAC,QAAgB;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACrC,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;IACtE,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACxB,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,QAAgB,EAAE;IACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAA;IAC7D,OAAO,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,KAAK,CAAA;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAgB;IACjD,MAAM,GAAG,GAAG,OAAO,IAAI,QAAQ,CAAA;IAE/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAA0B,CAAA;IACnE,MAAM,SAAS,GAAG,QAAQ,CAAC,gBAAgB,CAA0B,CAAA;IACrE,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAA0B,CAAA;IACnE,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAmC,CAAA;IAC1E,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAA+E,CAAA;IACtH,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAA8D,CAAA;IACrG,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAA0B,CAAA;IAE/D,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAClE,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACrE,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAClE,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAE7D,aAAa;IACb,MAAM,WAAW,GAAG,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QACxD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC;aACnD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,EAAE,CAAA;IACN,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC9E,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAE5E,sBAAsB;IACtB,MAAM,YAAY,GAAG,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QACzD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;aAClD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,EAAE,CAAA;IAEN,OAAO,CAAC,GAAG,CAAC;EACZ,MAAM,GAAG,IAAI,uDAAuD,KAAK;EACzE,MAAM,GAAG,IAAI,iCAAiC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK;EACrE,MAAM,GAAG,IAAI,uDAAuD,KAAK;;EAEzE,IAAI,GAAG,IAAI,qBAAqB,KAAK;yBACd,IAAI,GAAG,YAAY,GAAG,KAAK;yBAC3B,IAAI,GAAG,aAAa,GAAG,KAAK;yBAC5B,IAAI,GAAG,WAAW,GAAG,KAAK;yBAC1B,IAAI,GAAG,YAAY,GAAG,KAAK;KAC/C,GAAG,WAAW,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,oBAAoB,KAAK;;EAE/H,MAAM,GAAG,IAAI,eAAe,KAAK,IAAI,GAAG,IAAI,UAAU,gBAAgB,KAAK,EAAE,CAAC,CAAA;IAE9E,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACxC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAA;YAC1B,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC,CAAA;QAC5E,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,wDAAwD,KAAK,EAAE,CAAC,CAAA;IACvF,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,IAAI,mBAAmB,KAAK,EAAE,CAAC,CAAA;IACxD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAA;YACxB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAA;YACpC,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAC7D,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,aAAa,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC,CAAA;QACxF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,wEAAwE,KAAK,EAAE,CAAC,CAAA;IACvG,CAAC;IAED,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,GAAG,IAAI,kBAAkB,KAAK,EAAE,CAAC,CAAA;QACxD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACnD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,CAAA;QACvE,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC;EACZ,GAAG,oDAAoD,KAAK;EAC5D,GAAG,SAAS,GAAG,MAAM,YAAY,eAAe,UAAU,iBAAiB,YAAY,YAAY,KAAK;EACxG,GAAG,6CAA6C,KAAK;CACtD,CAAC,CAAA;AACF,CAAC"}
@@ -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"}
package/dist/digest.js ADDED
@@ -0,0 +1,77 @@
1
+ // kbot Weekly Digest — "Your kbot is X% smarter than when you installed it"
2
+ //
3
+ // Sends a weekly summary of learning progress via email (kernel.chat@gmail.com)
4
+ // or OpenClaw. Shows patterns learned, tools used, agent routing stats.
5
+ import { readFileSync, existsSync } from 'fs';
6
+ import { homedir } from 'os';
7
+ import { join } from 'path';
8
+ function loadJsonSafe(path) {
9
+ try {
10
+ if (existsSync(path))
11
+ return JSON.parse(readFileSync(path, 'utf-8'));
12
+ }
13
+ catch { /* ignore */ }
14
+ return null;
15
+ }
16
+ export function gatherDigestData() {
17
+ const kbotDir = join(homedir(), '.kbot');
18
+ const patterns = loadJsonSafe(join(kbotDir, 'patterns.json'));
19
+ const solutions = loadJsonSafe(join(kbotDir, 'solutions.json'));
20
+ const sessions = loadJsonSafe(join(kbotDir, 'sessions.json'));
21
+ const metrics = loadJsonSafe(join(kbotDir, 'metrics.json'));
22
+ const patternCount = Array.isArray(patterns) ? patterns.length : 0;
23
+ const solutionCount = Array.isArray(solutions) ? solutions.length : 0;
24
+ const sessionCount = Array.isArray(sessions) ? sessions.length : 0;
25
+ const topTools = [];
26
+ if (metrics && typeof metrics === 'object') {
27
+ const entries = Object.entries(metrics)
28
+ .filter(([, v]) => v && typeof v === 'object' && typeof v.calls === 'number')
29
+ .map(([name, v]) => ({ name, count: v.calls || 0 }))
30
+ .sort((a, b) => b.count - a.count)
31
+ .slice(0, 5);
32
+ topTools.push(...entries);
33
+ }
34
+ const growthPercent = sessionCount > 1 ? Math.round((patternCount / sessionCount) * 100) : 0;
35
+ return {
36
+ patterns: patternCount,
37
+ solutions: solutionCount,
38
+ sessions: sessionCount,
39
+ topTools,
40
+ topAgents: [],
41
+ growthPercent,
42
+ };
43
+ }
44
+ export function formatDigest(data, version) {
45
+ const toolList = data.topTools.length > 0
46
+ ? data.topTools.map((t, i) => ` ${i + 1}. ${t.name} (${t.count} calls)`).join('\n')
47
+ : ' No tool usage data yet.';
48
+ return `
49
+ ╔══════════════════════════════════════════════╗
50
+ ║ kbot Weekly Digest — ${version.padEnd(14)}║
51
+ ╚══════════════════════════════════════════════╝
52
+
53
+ 📊 Learning Progress
54
+ Patterns learned: ${data.patterns}
55
+ Solutions stored: ${data.solutions}
56
+ Sessions total: ${data.sessions}
57
+ Growth rate: ${data.growthPercent}% patterns/session
58
+
59
+ 🔧 Top Tools This Week
60
+ ${toolList}
61
+
62
+ 💡 Your kbot has processed ${data.sessions} sessions and
63
+ extracted ${data.patterns} reusable patterns.
64
+ ${data.patterns > 10 ? 'The learning engine is compounding.' : 'Keep using kbot to build the pattern library.'}
65
+
66
+ ─────────────────────────────────────────────
67
+ npm install -g @kernel.chat/kbot
68
+ kernel.chat · github.com/isaacsight/kernel
69
+ `.trim();
70
+ }
71
+ export async function runDigest() {
72
+ const pkg = loadJsonSafe(join(__dirname, '..', 'package.json'));
73
+ const version = pkg?.version || '3.33.1';
74
+ const data = gatherDigestData();
75
+ console.log(formatDigest(data, version));
76
+ }
77
+ //# sourceMappingURL=digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.js","sourceRoot":"","sources":["../src/digest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ interface ForgedTool {
2
+ name: string;
3
+ description: string;
4
+ code: string;
5
+ author?: string;
6
+ version: string;
7
+ created: string;
8
+ tags: string[];
9
+ }
10
+ export declare function listForgedTools(): ForgedTool[];
11
+ export declare function searchForgeRegistry(query: string): Promise<string>;
12
+ export declare function publishForgedTool(name: string): Promise<string>;
13
+ export declare function installForgedTool(name: string): Promise<string>;
14
+ export declare function runForge(action: string, arg?: string): Promise<void>;
15
+ export {};
16
+ //# sourceMappingURL=forge-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forge-registry.d.ts","sourceRoot":"","sources":["../src/forge-registry.ts"],"names":[],"mappings":"AAYA,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAMD,wBAAgB,eAAe,IAAI,UAAU,EAAE,CAQ9C;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBxE;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBrE;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWrE;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB1E"}
@@ -0,0 +1,103 @@
1
+ // kbot Forge Registry — Community Tool Sharing
2
+ //
3
+ // Users forge tools → publish them → others discover and install.
4
+ // "The npm of AI tools."
5
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'fs';
6
+ import { homedir } from 'os';
7
+ import { join } from 'path';
8
+ const FORGE_DIR = join(homedir(), '.kbot', 'forge');
9
+ const REGISTRY_URL = process.env.KBOT_FORGE_REGISTRY || 'https://kernel.chat/api/forge';
10
+ function ensureForgeDir() {
11
+ if (!existsSync(FORGE_DIR))
12
+ mkdirSync(FORGE_DIR, { recursive: true });
13
+ }
14
+ export function listForgedTools() {
15
+ ensureForgeDir();
16
+ const files = readdirSync(FORGE_DIR).filter(f => f.endsWith('.json'));
17
+ return files.map(f => {
18
+ try {
19
+ return JSON.parse(readFileSync(join(FORGE_DIR, f), 'utf-8'));
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }).filter((t) => t !== null);
25
+ }
26
+ export async function searchForgeRegistry(query) {
27
+ try {
28
+ const res = await fetch(`${REGISTRY_URL}/search?q=${encodeURIComponent(query)}`);
29
+ if (!res.ok)
30
+ throw new Error(`Registry returned ${res.status}`);
31
+ const tools = await res.json();
32
+ if (!tools.length)
33
+ return `No tools found for "${query}".`;
34
+ return tools.map(t => `${t.name} — ${t.description} (${t.downloads} installs)`).join('\n');
35
+ }
36
+ catch {
37
+ // Fallback: search local forge
38
+ const local = listForgedTools().filter(t => t.name.includes(query) || t.description.toLowerCase().includes(query.toLowerCase()) ||
39
+ t.tags.some(tag => tag.includes(query)));
40
+ if (!local.length)
41
+ return `No tools found for "${query}". Forge registry may be offline.`;
42
+ return local.map(t => `${t.name} — ${t.description} [local]`).join('\n');
43
+ }
44
+ }
45
+ export async function publishForgedTool(name) {
46
+ const toolPath = join(FORGE_DIR, `${name}.json`);
47
+ if (!existsSync(toolPath))
48
+ return `Tool "${name}" not found in local forge. Path: ${toolPath}`;
49
+ const tool = JSON.parse(readFileSync(toolPath, 'utf-8'));
50
+ try {
51
+ const res = await fetch(`${REGISTRY_URL}/publish`, {
52
+ method: 'POST',
53
+ headers: { 'Content-Type': 'application/json' },
54
+ body: JSON.stringify(tool),
55
+ });
56
+ if (!res.ok)
57
+ throw new Error(`Registry returned ${res.status}`);
58
+ return `Published "${name}" to the Forge Registry. Others can install with: kbot forge install ${name}`;
59
+ }
60
+ catch (err) {
61
+ return `Could not publish to registry: ${err instanceof Error ? err.message : String(err)}. Tool saved locally at ${toolPath}.`;
62
+ }
63
+ }
64
+ export async function installForgedTool(name) {
65
+ ensureForgeDir();
66
+ try {
67
+ const res = await fetch(`${REGISTRY_URL}/tools/${encodeURIComponent(name)}`);
68
+ if (!res.ok)
69
+ throw new Error(`Tool "${name}" not found in registry`);
70
+ const tool = await res.json();
71
+ writeFileSync(join(FORGE_DIR, `${name}.json`), JSON.stringify(tool, null, 2));
72
+ return `Installed "${name}" — ${tool.description}. Available in your next kbot session.`;
73
+ }
74
+ catch (err) {
75
+ return `Could not install "${name}": ${err instanceof Error ? err.message : String(err)}`;
76
+ }
77
+ }
78
+ export async function runForge(action, arg) {
79
+ switch (action) {
80
+ case 'list': {
81
+ const tools = listForgedTools();
82
+ if (!tools.length) {
83
+ console.log('No forged tools yet. kbot will forge tools automatically when needed.');
84
+ return;
85
+ }
86
+ console.log(`${tools.length} forged tools:\n`);
87
+ tools.forEach(t => console.log(` ${t.name} — ${t.description}`));
88
+ break;
89
+ }
90
+ case 'search':
91
+ console.log(await searchForgeRegistry(arg || ''));
92
+ break;
93
+ case 'publish':
94
+ console.log(await publishForgedTool(arg || ''));
95
+ break;
96
+ case 'install':
97
+ console.log(await installForgedTool(arg || ''));
98
+ break;
99
+ default:
100
+ console.log('Usage: kbot forge <list|search|publish|install> [name/query]');
101
+ }
102
+ }
103
+ //# sourceMappingURL=forge-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forge-registry.js","sourceRoot":"","sources":["../src/forge-registry.ts"],"names":[],"mappings":"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"}
package/dist/init.d.ts CHANGED
@@ -15,9 +15,32 @@ export interface KbotProjectConfig {
15
15
  commands: Record<string, string>;
16
16
  /** Forged tools created during init */
17
17
  forgedTools: string[];
18
+ /** File counts by extension */
19
+ fileCounts: Record<string, number>;
20
+ /** Total file count */
21
+ totalFiles: number;
22
+ /** README excerpt (first 500 chars) */
23
+ readmeExcerpt?: string;
18
24
  /** When this config was generated */
19
25
  createdAt: string;
20
26
  }
21
27
  export declare function initProject(root: string): Promise<KbotProjectConfig>;
22
28
  export declare function formatInitReport(config: KbotProjectConfig): string;
29
+ /**
30
+ * Print the user-friendly init summary.
31
+ * Format: "I detected a [framework] project with [N] files. I've configured [M] tools for your stack."
32
+ */
33
+ export declare function formatInitSummary(config: KbotProjectConfig): string;
34
+ /**
35
+ * runInit() — 60-second onboarding entry point.
36
+ *
37
+ * 1. Detects project type (package.json, Cargo.toml, pyproject.toml, go.mod, etc.)
38
+ * 2. Detects framework (React, Next.js, Vue, Express, FastAPI, Django, Flask, Rails, etc.)
39
+ * 3. Counts files by extension
40
+ * 4. Reads README.md (first 500 chars)
41
+ * 5. Creates .kbot/config.json with detected info
42
+ * 6. Prints summary
43
+ * 7. Suggests a first query
44
+ */
45
+ export declare function runInit(root?: string): Promise<KbotProjectConfig>;
23
46
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sBAAsB;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAA;IACpB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,uCAAuC;IACvC,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAA;CAClB;AAwQD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqD1E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAkBlE"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sBAAsB;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAA;IACpB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,uCAAuC;IACvC,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAA;CAClB;AA0UD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAuE1E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CA4BlE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAMnE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiCvE"}