@kernel.chat/kbot 3.30.0 → 3.31.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/briefing.d.ts +2 -0
- package/dist/briefing.d.ts.map +1 -0
- package/dist/briefing.js +218 -0
- package/dist/briefing.js.map +1 -0
- package/dist/cli.js +85 -0
- package/dist/cli.js.map +1 -1
- package/dist/daemon.d.ts +26 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +351 -0
- package/dist/daemon.js.map +1 -0
- package/dist/inference.d.ts.map +1 -1
- package/dist/inference.js +19 -0
- package/dist/inference.js.map +1 -1
- package/dist/notifications.d.ts +13 -0
- package/dist/notifications.d.ts.map +1 -0
- package/dist/notifications.js +133 -0
- package/dist/notifications.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"briefing.d.ts","sourceRoot":"","sources":["../src/briefing.ts"],"names":[],"mappings":"AA0BA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAuNxD"}
|
package/dist/briefing.js
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
// kbot Morning Briefing — Your daily intelligence report
|
|
2
|
+
//
|
|
3
|
+
// Synthesizes everything kbot knows into one actionable overview:
|
|
4
|
+
// - Market: prices, alerts, portfolio status
|
|
5
|
+
// - Security: memory integrity, recent incidents
|
|
6
|
+
// - Code: active project status, recent patterns
|
|
7
|
+
// - Growth: session stats, efficiency trends
|
|
8
|
+
// - Daemon: subsystem health, notifications
|
|
9
|
+
//
|
|
10
|
+
// Run: kbot briefing
|
|
11
|
+
// The daemon can auto-generate this at configurable times.
|
|
12
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { homedir } from 'node:os';
|
|
15
|
+
import chalk from 'chalk';
|
|
16
|
+
const DIM = chalk.dim;
|
|
17
|
+
const BOLD = chalk.bold;
|
|
18
|
+
const GREEN = chalk.green;
|
|
19
|
+
const RED = chalk.red;
|
|
20
|
+
const YELLOW = chalk.yellow;
|
|
21
|
+
const CYAN = chalk.cyan;
|
|
22
|
+
// ── Briefing Generation ──
|
|
23
|
+
export async function generateBriefing() {
|
|
24
|
+
const lines = [];
|
|
25
|
+
const now = new Date();
|
|
26
|
+
const hour = now.getHours();
|
|
27
|
+
const greeting = hour < 12 ? 'Good morning' : hour < 17 ? 'Good afternoon' : 'Good evening';
|
|
28
|
+
lines.push('');
|
|
29
|
+
lines.push(` ${BOLD(`${greeting}. Here's your kbot briefing.`)}`);
|
|
30
|
+
lines.push(` ${DIM(now.toISOString().split('T')[0])}`);
|
|
31
|
+
lines.push('');
|
|
32
|
+
// ── Market ──
|
|
33
|
+
try {
|
|
34
|
+
lines.push(` ${BOLD('Market')}`);
|
|
35
|
+
lines.push(` ${DIM('─'.repeat(50))}`);
|
|
36
|
+
// Fear & Greed
|
|
37
|
+
const fgRes = await fetch('https://api.alternative.me/fng/?limit=1', { signal: AbortSignal.timeout(5000) });
|
|
38
|
+
const fg = await fgRes.json();
|
|
39
|
+
if (fg.data?.[0]) {
|
|
40
|
+
const val = Number(fg.data[0].value);
|
|
41
|
+
const label = fg.data[0].value_classification;
|
|
42
|
+
const icon = val <= 25 ? '😱' : val <= 45 ? '😟' : val <= 55 ? '😐' : val <= 75 ? '😊' : '🤑';
|
|
43
|
+
lines.push(` Fear & Greed: ${val}/100 ${icon} (${label})`);
|
|
44
|
+
}
|
|
45
|
+
// BTC + ETH + SOL quick prices
|
|
46
|
+
const priceRes = await fetch('https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum,solana&vs_currencies=usd&include_24hr_change=true', { signal: AbortSignal.timeout(5000) });
|
|
47
|
+
const prices = await priceRes.json();
|
|
48
|
+
if (prices.bitcoin) {
|
|
49
|
+
const btc = prices.bitcoin;
|
|
50
|
+
const eth = prices.ethereum;
|
|
51
|
+
const sol = prices.solana;
|
|
52
|
+
const fmtPrice = (p) => p >= 1000 ? `$${Math.round(p).toLocaleString()}` : `$${p.toFixed(2)}`;
|
|
53
|
+
const fmtChange = (c) => {
|
|
54
|
+
const s = c >= 0 ? `+${c.toFixed(1)}%` : `${c.toFixed(1)}%`;
|
|
55
|
+
return c >= 0 ? GREEN(s) : RED(s);
|
|
56
|
+
};
|
|
57
|
+
lines.push(` BTC ${fmtPrice(btc.usd)} ${fmtChange(btc.usd_24h_change)} ETH ${fmtPrice(eth.usd)} ${fmtChange(eth.usd_24h_change)} SOL ${fmtPrice(sol.usd)} ${fmtChange(sol.usd_24h_change)}`);
|
|
58
|
+
}
|
|
59
|
+
// Price alerts
|
|
60
|
+
const alertPath = join(homedir(), '.kbot', 'price-alerts.json');
|
|
61
|
+
if (existsSync(alertPath)) {
|
|
62
|
+
const alerts = JSON.parse(readFileSync(alertPath, 'utf-8'));
|
|
63
|
+
if (alerts.length > 0) {
|
|
64
|
+
lines.push(` ${DIM(`${alerts.length} active price alert(s)`)}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Paper portfolio
|
|
68
|
+
const portfolioPath = join(homedir(), '.kbot', 'paper-portfolio.json');
|
|
69
|
+
if (existsSync(portfolioPath)) {
|
|
70
|
+
const portfolio = JSON.parse(readFileSync(portfolioPath, 'utf-8'));
|
|
71
|
+
if (portfolio.positions?.length > 0) {
|
|
72
|
+
const totalPnl = (portfolio.trades || []).reduce((s, t) => s + (t.pnl || 0), 0);
|
|
73
|
+
const pnlStr = totalPnl >= 0 ? GREEN(`+$${totalPnl.toFixed(2)}`) : RED(`-$${Math.abs(totalPnl).toFixed(2)}`);
|
|
74
|
+
lines.push(` Paper portfolio: ${portfolio.positions.length} position(s), ${pnlStr} realized P&L`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
lines.push('');
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
lines.push(` ${DIM('Market data unavailable')}`);
|
|
81
|
+
lines.push('');
|
|
82
|
+
}
|
|
83
|
+
// ── Security ──
|
|
84
|
+
try {
|
|
85
|
+
lines.push(` ${BOLD('Security')}`);
|
|
86
|
+
lines.push(` ${DIM('─'.repeat(50))}`);
|
|
87
|
+
const { verifyMemoryIntegrity, getIncidents } = await import('./self-defense.js');
|
|
88
|
+
const integrity = verifyMemoryIntegrity();
|
|
89
|
+
const tampered = integrity.filter(m => m.status === 'tampered');
|
|
90
|
+
const incidents = getIncidents(5);
|
|
91
|
+
const recentIncidents = incidents.filter(i => {
|
|
92
|
+
const age = Date.now() - new Date(i.timestamp).getTime();
|
|
93
|
+
return age < 24 * 60 * 60 * 1000; // last 24h
|
|
94
|
+
});
|
|
95
|
+
if (tampered.length > 0) {
|
|
96
|
+
lines.push(` ${RED(`⚠ ${tampered.length} memory file(s) tampered!`)} Run \`kbot defense audit\``);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
lines.push(` ${GREEN('✓')} Memory integrity intact (${integrity.length} files)`);
|
|
100
|
+
}
|
|
101
|
+
if (recentIncidents.length > 0) {
|
|
102
|
+
lines.push(` ${YELLOW(`${recentIncidents.length} incident(s) in last 24h`)}`);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
lines.push(` ${GREEN('✓')} No security incidents`);
|
|
106
|
+
}
|
|
107
|
+
lines.push('');
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
lines.push(` ${DIM('Security check unavailable')}`);
|
|
111
|
+
lines.push('');
|
|
112
|
+
}
|
|
113
|
+
// ── Your Stats ──
|
|
114
|
+
try {
|
|
115
|
+
lines.push(` ${BOLD('You')}`);
|
|
116
|
+
lines.push(` ${DIM('─'.repeat(50))}`);
|
|
117
|
+
const { getProfile, getStats } = await import('./learning.js');
|
|
118
|
+
const profile = getProfile();
|
|
119
|
+
const stats = getStats();
|
|
120
|
+
lines.push(` Sessions: ${profile.sessions} Messages: ${profile.totalMessages.toLocaleString()} Patterns: ${stats.patternsCount}`);
|
|
121
|
+
lines.push(` Efficiency: ${stats.efficiency} Tokens saved: ${stats.totalTokensSaved.toLocaleString()}`);
|
|
122
|
+
// Today's episodes
|
|
123
|
+
const { listEpisodes } = await import('./episodic-memory.js');
|
|
124
|
+
const todayEpisodes = listEpisodes(10).filter(e => e.startedAt.startsWith(now.toISOString().split('T')[0]));
|
|
125
|
+
if (todayEpisodes.length > 0) {
|
|
126
|
+
const totalMin = todayEpisodes.reduce((s, e) => s + e.durationMinutes, 0);
|
|
127
|
+
lines.push(` Today: ${todayEpisodes.length} session(s), ${totalMin} minutes`);
|
|
128
|
+
}
|
|
129
|
+
lines.push('');
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
lines.push(` ${DIM('Stats unavailable')}`);
|
|
133
|
+
lines.push('');
|
|
134
|
+
}
|
|
135
|
+
// ── Daemon ──
|
|
136
|
+
try {
|
|
137
|
+
const { getDaemonStatus } = await import('./daemon.js');
|
|
138
|
+
const daemon = getDaemonStatus();
|
|
139
|
+
lines.push(` ${BOLD('Daemon')}`);
|
|
140
|
+
lines.push(` ${DIM('─'.repeat(50))}`);
|
|
141
|
+
if (daemon.running) {
|
|
142
|
+
const uptime = Date.now() - new Date(daemon.startedAt).getTime();
|
|
143
|
+
const uptimeHrs = Math.floor(uptime / (1000 * 60 * 60));
|
|
144
|
+
const uptimeMin = Math.floor((uptime % (1000 * 60 * 60)) / (1000 * 60));
|
|
145
|
+
lines.push(` ${GREEN('●')} Running (${uptimeHrs}h ${uptimeMin}m, ${daemon.cycles} cycles)`);
|
|
146
|
+
const subsystems = Object.entries(daemon.subsystems);
|
|
147
|
+
const errors = subsystems.filter(([, s]) => s.status === 'error');
|
|
148
|
+
if (errors.length > 0) {
|
|
149
|
+
lines.push(` ${YELLOW(`${errors.length} subsystem(s) errored:`)} ${errors.map(([n]) => n).join(', ')}`);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
lines.push(` ${DIM('All subsystems healthy')}`);
|
|
153
|
+
}
|
|
154
|
+
if (daemon.alerts.length > 0) {
|
|
155
|
+
lines.push(` ${daemon.notifications} notification(s) sent`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
lines.push(` ${RED('●')} Not running — start with \`kbot daemon start\``);
|
|
160
|
+
}
|
|
161
|
+
lines.push('');
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
lines.push(` ${DIM('Daemon not configured')}`);
|
|
165
|
+
lines.push('');
|
|
166
|
+
}
|
|
167
|
+
// ── Hardware ──
|
|
168
|
+
try {
|
|
169
|
+
const { detectHardwareTier } = await import('./inference.js');
|
|
170
|
+
const hw = detectHardwareTier();
|
|
171
|
+
lines.push(` ${BOLD('Hardware')}`);
|
|
172
|
+
lines.push(` ${DIM('─'.repeat(50))}`);
|
|
173
|
+
lines.push(` Tier: ${hw.tier.toUpperCase()} — ${hw.description}`);
|
|
174
|
+
lines.push(` Max model: ${hw.maxModelParams}`);
|
|
175
|
+
lines.push('');
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// skip
|
|
179
|
+
}
|
|
180
|
+
// ── What to do ──
|
|
181
|
+
lines.push(` ${BOLD('Suggested Actions')}`);
|
|
182
|
+
lines.push(` ${DIM('─'.repeat(50))}`);
|
|
183
|
+
const suggestions = [];
|
|
184
|
+
// Check if daemon is running
|
|
185
|
+
try {
|
|
186
|
+
const { getDaemonStatus } = await import('./daemon.js');
|
|
187
|
+
if (!getDaemonStatus().running)
|
|
188
|
+
suggestions.push('Start the daemon: `kbot daemon start`');
|
|
189
|
+
}
|
|
190
|
+
catch { /* skip */ }
|
|
191
|
+
// Check if models are downloaded
|
|
192
|
+
try {
|
|
193
|
+
const { listLocalModels } = await import('./inference.js');
|
|
194
|
+
if (listLocalModels().length === 0)
|
|
195
|
+
suggestions.push('Download a local model: `kbot models pull qwen3-7b`');
|
|
196
|
+
}
|
|
197
|
+
catch { /* skip */ }
|
|
198
|
+
// Check memory signatures
|
|
199
|
+
try {
|
|
200
|
+
const { verifyMemoryIntegrity } = await import('./self-defense.js');
|
|
201
|
+
const results = verifyMemoryIntegrity();
|
|
202
|
+
const unsigned = results.filter(r => r.status === 'new');
|
|
203
|
+
if (unsigned.length > 0)
|
|
204
|
+
suggestions.push('Sign memory files: `kbot defense sign`');
|
|
205
|
+
}
|
|
206
|
+
catch { /* skip */ }
|
|
207
|
+
if (suggestions.length === 0) {
|
|
208
|
+
lines.push(` ${GREEN('✓')} All systems operational. You're good.`);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
for (const s of suggestions) {
|
|
212
|
+
lines.push(` → ${s}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
lines.push('');
|
|
216
|
+
return lines.join('\n');
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=briefing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"briefing.js","sourceRoot":"","sources":["../src/briefing.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -405,6 +405,91 @@ async function main() {
|
|
|
405
405
|
printInfo('Download: kbot models pull <name>');
|
|
406
406
|
printInfo('Or use any HuggingFace GGUF: kbot models pull hf:user/repo:file.gguf');
|
|
407
407
|
});
|
|
408
|
+
// ── Daemon ──
|
|
409
|
+
const daemonCmd = program
|
|
410
|
+
.command('daemon')
|
|
411
|
+
.description('Background intelligence — market watch, security patrol, synthesis, health checks');
|
|
412
|
+
daemonCmd
|
|
413
|
+
.command('start')
|
|
414
|
+
.description('Start the kbot daemon — runs all background subsystems')
|
|
415
|
+
.action(async () => {
|
|
416
|
+
const { startDaemon } = await import('./daemon.js');
|
|
417
|
+
printInfo('Starting kbot daemon...');
|
|
418
|
+
await startDaemon();
|
|
419
|
+
});
|
|
420
|
+
daemonCmd
|
|
421
|
+
.command('stop')
|
|
422
|
+
.description('Stop the running daemon')
|
|
423
|
+
.action(async () => {
|
|
424
|
+
const { stopDaemon } = await import('./daemon.js');
|
|
425
|
+
if (stopDaemon()) {
|
|
426
|
+
printSuccess('Daemon stopped.');
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
printInfo('No daemon running.');
|
|
430
|
+
}
|
|
431
|
+
});
|
|
432
|
+
daemonCmd
|
|
433
|
+
.command('status')
|
|
434
|
+
.description('Show daemon status — uptime, subsystems, alerts')
|
|
435
|
+
.action(async () => {
|
|
436
|
+
const chalk = (await import('chalk')).default;
|
|
437
|
+
const { getDaemonStatus, getDaemonLog } = await import('./daemon.js');
|
|
438
|
+
const status = getDaemonStatus();
|
|
439
|
+
console.log();
|
|
440
|
+
if (status.running) {
|
|
441
|
+
const uptime = Date.now() - new Date(status.startedAt).getTime();
|
|
442
|
+
const hrs = Math.floor(uptime / 3_600_000);
|
|
443
|
+
const min = Math.floor((uptime % 3_600_000) / 60_000);
|
|
444
|
+
console.log(` ${chalk.green('●')} Daemon running (PID ${status.pid}, ${hrs}h ${min}m, ${status.cycles} cycles)`);
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
console.log(` ${chalk.red('●')} Daemon not running`);
|
|
448
|
+
}
|
|
449
|
+
if (Object.keys(status.subsystems).length > 0) {
|
|
450
|
+
console.log();
|
|
451
|
+
console.log(` ${chalk.bold('Subsystems')}`);
|
|
452
|
+
for (const [name, sub] of Object.entries(status.subsystems)) {
|
|
453
|
+
const icon = sub.status === 'ok' ? chalk.green('✓') : sub.status === 'error' ? chalk.red('✗') : sub.status === 'running' ? chalk.yellow('⟳') : chalk.dim('○');
|
|
454
|
+
console.log(` ${icon} ${name.padEnd(18)} runs: ${sub.runCount} last: ${sub.lastRun ? sub.lastRun.split('T')[1]?.slice(0, 5) : '—'}`);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
if (status.alerts.length > 0) {
|
|
458
|
+
console.log();
|
|
459
|
+
console.log(` ${chalk.bold('Recent Alerts')} (${status.alerts.length})`);
|
|
460
|
+
for (const a of status.alerts.slice(-5)) {
|
|
461
|
+
console.log(` ${chalk.yellow('!')} ${a}`);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
// Recent log
|
|
465
|
+
const log = getDaemonLog(10);
|
|
466
|
+
if (log.length > 0) {
|
|
467
|
+
console.log();
|
|
468
|
+
console.log(` ${chalk.bold('Recent Log')}`);
|
|
469
|
+
for (const line of log) {
|
|
470
|
+
console.log(` ${chalk.dim(line)}`);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
console.log();
|
|
474
|
+
});
|
|
475
|
+
daemonCmd
|
|
476
|
+
.command('log')
|
|
477
|
+
.description('Show full daemon log')
|
|
478
|
+
.option('--lines <n>', 'Number of lines', '50')
|
|
479
|
+
.action(async (opts) => {
|
|
480
|
+
const { getDaemonLog } = await import('./daemon.js');
|
|
481
|
+
const log = getDaemonLog(Number(opts.lines) || 50);
|
|
482
|
+
for (const line of log)
|
|
483
|
+
console.log(line);
|
|
484
|
+
});
|
|
485
|
+
// ── Briefing ──
|
|
486
|
+
program
|
|
487
|
+
.command('briefing')
|
|
488
|
+
.description('Your daily intelligence report — market, security, stats, daemon health, suggested actions')
|
|
489
|
+
.action(async () => {
|
|
490
|
+
const { generateBriefing } = await import('./briefing.js');
|
|
491
|
+
process.stderr.write(await generateBriefing());
|
|
492
|
+
});
|
|
408
493
|
// ── Discovery Agent ──
|
|
409
494
|
const discoveryCmd = program
|
|
410
495
|
.command('discovery')
|