@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.
@@ -0,0 +1,2 @@
1
+ export declare function generateBriefing(): Promise<string>;
2
+ //# sourceMappingURL=briefing.d.ts.map
@@ -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"}
@@ -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')