@kernel.chat/kbot 3.40.0 → 3.42.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.
Files changed (73) hide show
  1. package/README.md +5 -5
  2. package/dist/agent-teams.d.ts +1 -1
  3. package/dist/agent-teams.d.ts.map +1 -1
  4. package/dist/agent-teams.js +36 -3
  5. package/dist/agent-teams.js.map +1 -1
  6. package/dist/agents/specialists.d.ts.map +1 -1
  7. package/dist/agents/specialists.js +20 -0
  8. package/dist/agents/specialists.js.map +1 -1
  9. package/dist/channels/kbot-channel.js +8 -31
  10. package/dist/channels/kbot-channel.js.map +1 -1
  11. package/dist/cli.js +8 -8
  12. package/dist/digest.js +1 -1
  13. package/dist/digest.js.map +1 -1
  14. package/dist/email-service.d.ts.map +1 -1
  15. package/dist/email-service.js +1 -2
  16. package/dist/email-service.js.map +1 -1
  17. package/dist/episodic-memory.d.ts.map +1 -1
  18. package/dist/episodic-memory.js +14 -0
  19. package/dist/episodic-memory.js.map +1 -1
  20. package/dist/interactive-buttons.d.ts +90 -0
  21. package/dist/interactive-buttons.d.ts.map +1 -0
  22. package/dist/interactive-buttons.js +286 -0
  23. package/dist/interactive-buttons.js.map +1 -0
  24. package/dist/learned-router.d.ts.map +1 -1
  25. package/dist/learned-router.js +29 -0
  26. package/dist/learned-router.js.map +1 -1
  27. package/dist/memory-hotswap.d.ts +58 -0
  28. package/dist/memory-hotswap.d.ts.map +1 -0
  29. package/dist/memory-hotswap.js +288 -0
  30. package/dist/memory-hotswap.js.map +1 -0
  31. package/dist/personal-security.d.ts +142 -0
  32. package/dist/personal-security.d.ts.map +1 -0
  33. package/dist/personal-security.js +1151 -0
  34. package/dist/personal-security.js.map +1 -0
  35. package/dist/side-conversation.d.ts +58 -0
  36. package/dist/side-conversation.d.ts.map +1 -0
  37. package/dist/side-conversation.js +224 -0
  38. package/dist/side-conversation.js.map +1 -0
  39. package/dist/tools/email.d.ts.map +1 -1
  40. package/dist/tools/email.js +2 -3
  41. package/dist/tools/email.js.map +1 -1
  42. package/dist/tools/index.d.ts.map +1 -1
  43. package/dist/tools/index.js +7 -1
  44. package/dist/tools/index.js.map +1 -1
  45. package/dist/tools/lab-bio.d.ts +2 -0
  46. package/dist/tools/lab-bio.d.ts.map +1 -0
  47. package/dist/tools/lab-bio.js +1392 -0
  48. package/dist/tools/lab-bio.js.map +1 -0
  49. package/dist/tools/lab-chem.d.ts +2 -0
  50. package/dist/tools/lab-chem.d.ts.map +1 -0
  51. package/dist/tools/lab-chem.js +1257 -0
  52. package/dist/tools/lab-chem.js.map +1 -0
  53. package/dist/tools/lab-core.d.ts +2 -0
  54. package/dist/tools/lab-core.d.ts.map +1 -0
  55. package/dist/tools/lab-core.js +2452 -0
  56. package/dist/tools/lab-core.js.map +1 -0
  57. package/dist/tools/lab-data.d.ts +2 -0
  58. package/dist/tools/lab-data.d.ts.map +1 -0
  59. package/dist/tools/lab-data.js +2464 -0
  60. package/dist/tools/lab-data.js.map +1 -0
  61. package/dist/tools/lab-earth.d.ts +2 -0
  62. package/dist/tools/lab-earth.d.ts.map +1 -0
  63. package/dist/tools/lab-earth.js +1124 -0
  64. package/dist/tools/lab-earth.js.map +1 -0
  65. package/dist/tools/lab-math.d.ts +2 -0
  66. package/dist/tools/lab-math.d.ts.map +1 -0
  67. package/dist/tools/lab-math.js +3021 -0
  68. package/dist/tools/lab-math.js.map +1 -0
  69. package/dist/tools/lab-physics.d.ts +2 -0
  70. package/dist/tools/lab-physics.d.ts.map +1 -0
  71. package/dist/tools/lab-physics.js +2423 -0
  72. package/dist/tools/lab-physics.js.map +1 -0
  73. package/package.json +2 -3
@@ -0,0 +1,288 @@
1
+ // kbot Memory Hot-Swap — Swap learning modules at runtime
2
+ //
3
+ // Load different expertise profiles for different projects
4
+ // without restarting kbot. Profiles contain patterns, solutions,
5
+ // user profile, and routing data.
6
+ //
7
+ // Stored at ~/.kbot/memory-profiles/{name}/
8
+ import { homedir } from 'node:os';
9
+ import { join } from 'node:path';
10
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, cpSync, rmSync, statSync, } from 'node:fs';
11
+ const KBOT_DIR = join(homedir(), '.kbot');
12
+ const MEMORY_DIR = join(KBOT_DIR, 'memory');
13
+ const PROFILES_DIR = join(KBOT_DIR, 'memory-profiles');
14
+ const ACTIVE_PROFILE_FILE = join(MEMORY_DIR, 'active-profile.json');
15
+ const BACKUP_NAME = '_backup';
16
+ /** Files that constitute a memory profile */
17
+ const PROFILE_FILES = [
18
+ 'patterns.json',
19
+ 'solutions.json',
20
+ 'profile.json',
21
+ 'routing-history.json',
22
+ 'knowledge.json',
23
+ 'corrections.json',
24
+ 'context.md',
25
+ ];
26
+ function ensureDir(dir) {
27
+ if (!existsSync(dir))
28
+ mkdirSync(dir, { recursive: true });
29
+ }
30
+ function ensureProfilesDir() {
31
+ ensureDir(PROFILES_DIR);
32
+ }
33
+ function ensureMemoryDir() {
34
+ ensureDir(MEMORY_DIR);
35
+ }
36
+ function profileDir(name) {
37
+ return join(PROFILES_DIR, name);
38
+ }
39
+ function loadJSON(path, fallback) {
40
+ if (!existsSync(path))
41
+ return fallback;
42
+ try {
43
+ return JSON.parse(readFileSync(path, 'utf-8'));
44
+ }
45
+ catch {
46
+ return fallback;
47
+ }
48
+ }
49
+ function countPatterns(dir) {
50
+ const patternsPath = join(dir, 'patterns.json');
51
+ const patterns = loadJSON(patternsPath, []);
52
+ return Array.isArray(patterns) ? patterns.length : 0;
53
+ }
54
+ /** Copy memory files from source directory to target directory */
55
+ function copyMemoryFiles(sourceDir, targetDir) {
56
+ ensureDir(targetDir);
57
+ let copied = 0;
58
+ for (const file of PROFILE_FILES) {
59
+ const src = join(sourceDir, file);
60
+ if (existsSync(src)) {
61
+ cpSync(src, join(targetDir, file));
62
+ copied++;
63
+ }
64
+ }
65
+ return copied;
66
+ }
67
+ /**
68
+ * Scan ~/.kbot/memory-profiles/ for saved profiles.
69
+ * Returns array of profile metadata.
70
+ */
71
+ export function listMemoryProfiles() {
72
+ ensureProfilesDir();
73
+ const entries = readdirSync(PROFILES_DIR, { withFileTypes: true });
74
+ const profiles = [];
75
+ for (const entry of entries) {
76
+ if (!entry.isDirectory())
77
+ continue;
78
+ // Skip the internal backup directory
79
+ if (entry.name === BACKUP_NAME)
80
+ continue;
81
+ const dir = profileDir(entry.name);
82
+ const metaPath = join(dir, 'metadata.json');
83
+ const meta = loadJSON(metaPath, {
84
+ name: entry.name,
85
+ description: '',
86
+ expertise: '',
87
+ created_at: '',
88
+ updated_at: '',
89
+ });
90
+ // If no created_at in metadata, use directory stat
91
+ let createdAt = meta.created_at;
92
+ if (!createdAt) {
93
+ try {
94
+ const stat = statSync(dir);
95
+ createdAt = stat.birthtime.toISOString();
96
+ }
97
+ catch {
98
+ createdAt = new Date().toISOString();
99
+ }
100
+ }
101
+ profiles.push({
102
+ name: meta.name || entry.name,
103
+ description: meta.description || '',
104
+ patterns_count: countPatterns(dir),
105
+ created_at: createdAt,
106
+ });
107
+ }
108
+ return profiles.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
109
+ }
110
+ /**
111
+ * Snapshot current ~/.kbot/memory/ into a named profile.
112
+ * Saves all learning data (patterns, solutions, profile, routing).
113
+ */
114
+ export function saveCurrentAsProfile(name, description) {
115
+ ensureMemoryDir();
116
+ ensureProfilesDir();
117
+ const sanitized = name.toLowerCase().replace(/[^a-z0-9_-]/g, '-').slice(0, 60);
118
+ const targetDir = profileDir(sanitized);
119
+ // Copy current memory files into the profile directory
120
+ copyMemoryFiles(MEMORY_DIR, targetDir);
121
+ // Count patterns in the snapshot
122
+ const patternsCount = countPatterns(targetDir);
123
+ // Write metadata
124
+ const meta = {
125
+ name: sanitized,
126
+ description: description || `Profile snapshot of ${name}`,
127
+ expertise: '',
128
+ created_at: new Date().toISOString(),
129
+ updated_at: new Date().toISOString(),
130
+ };
131
+ writeFileSync(join(targetDir, 'metadata.json'), JSON.stringify(meta, null, 2));
132
+ return { name: sanitized, patterns_saved: patternsCount };
133
+ }
134
+ /**
135
+ * Load a named profile into ~/.kbot/memory/.
136
+ * Backs up current memory to _backup first.
137
+ */
138
+ export function loadProfile(name) {
139
+ ensureProfilesDir();
140
+ ensureMemoryDir();
141
+ const sanitized = name.toLowerCase().replace(/[^a-z0-9_-]/g, '-').slice(0, 60);
142
+ const sourceDir = profileDir(sanitized);
143
+ if (!existsSync(sourceDir)) {
144
+ throw new Error(`Profile "${sanitized}" not found in ${PROFILES_DIR}`);
145
+ }
146
+ // Backup current memory
147
+ const backupDir = profileDir(BACKUP_NAME);
148
+ copyMemoryFiles(MEMORY_DIR, backupDir);
149
+ // Write backup metadata
150
+ const backupMeta = {
151
+ name: BACKUP_NAME,
152
+ description: 'Auto-backup before profile load',
153
+ expertise: '',
154
+ created_at: new Date().toISOString(),
155
+ updated_at: new Date().toISOString(),
156
+ };
157
+ writeFileSync(join(backupDir, 'metadata.json'), JSON.stringify(backupMeta, null, 2));
158
+ // Copy profile files into memory directory
159
+ copyMemoryFiles(sourceDir, MEMORY_DIR);
160
+ const patternsLoaded = countPatterns(MEMORY_DIR);
161
+ // Mark the active profile
162
+ const marker = {
163
+ name: sanitized,
164
+ loaded_at: new Date().toISOString(),
165
+ previous_backup: BACKUP_NAME,
166
+ };
167
+ writeFileSync(ACTIVE_PROFILE_FILE, JSON.stringify(marker, null, 2));
168
+ return {
169
+ name: sanitized,
170
+ patterns_loaded: patternsLoaded,
171
+ previous_backup: BACKUP_NAME,
172
+ };
173
+ }
174
+ /**
175
+ * Unload the current profile, restoring from _backup.
176
+ * Returns to the previous state before loadProfile was called.
177
+ */
178
+ export function unloadProfile() {
179
+ ensureMemoryDir();
180
+ ensureProfilesDir();
181
+ const active = getActiveProfile();
182
+ if (!active) {
183
+ return { restored: false, previous_profile: null };
184
+ }
185
+ const backupDir = profileDir(BACKUP_NAME);
186
+ if (!existsSync(backupDir)) {
187
+ throw new Error('No backup found. Cannot unload profile without a previous backup.');
188
+ }
189
+ const previousName = active.name;
190
+ // Restore backup into memory
191
+ copyMemoryFiles(backupDir, MEMORY_DIR);
192
+ // Remove the active profile marker
193
+ if (existsSync(ACTIVE_PROFILE_FILE)) {
194
+ rmSync(ACTIVE_PROFILE_FILE);
195
+ }
196
+ // Clean up backup
197
+ rmSync(backupDir, { recursive: true, force: true });
198
+ return { restored: true, previous_profile: previousName };
199
+ }
200
+ /**
201
+ * Create a new empty profile with metadata.
202
+ * Seeds initial routing preferences based on expertise string.
203
+ */
204
+ export function createProfile(name, description, expertise) {
205
+ ensureProfilesDir();
206
+ const sanitized = name.toLowerCase().replace(/[^a-z0-9_-]/g, '-').slice(0, 60);
207
+ const targetDir = profileDir(sanitized);
208
+ if (existsSync(targetDir)) {
209
+ throw new Error(`Profile "${sanitized}" already exists`);
210
+ }
211
+ ensureDir(targetDir);
212
+ // Write metadata
213
+ const meta = {
214
+ name: sanitized,
215
+ description,
216
+ expertise,
217
+ created_at: new Date().toISOString(),
218
+ updated_at: new Date().toISOString(),
219
+ };
220
+ writeFileSync(join(targetDir, 'metadata.json'), JSON.stringify(meta, null, 2));
221
+ // Seed empty patterns and solutions
222
+ writeFileSync(join(targetDir, 'patterns.json'), JSON.stringify([], null, 2));
223
+ writeFileSync(join(targetDir, 'solutions.json'), JSON.stringify([], null, 2));
224
+ // Seed routing preferences based on expertise
225
+ const routingPrefs = buildRoutingPreferences(expertise);
226
+ writeFileSync(join(targetDir, 'routing-history.json'), JSON.stringify(routingPrefs, null, 2));
227
+ // Seed profile with expertise info
228
+ const userProfile = {
229
+ expertise,
230
+ preferred_languages: [expertise],
231
+ created_at: new Date().toISOString(),
232
+ };
233
+ writeFileSync(join(targetDir, 'profile.json'), JSON.stringify(userProfile, null, 2));
234
+ return { name: sanitized, created: true };
235
+ }
236
+ /**
237
+ * Returns which profile is currently loaded.
238
+ * Reads ~/.kbot/memory/active-profile.json.
239
+ */
240
+ export function getActiveProfile() {
241
+ ensureMemoryDir();
242
+ if (!existsSync(ACTIVE_PROFILE_FILE))
243
+ return null;
244
+ try {
245
+ return JSON.parse(readFileSync(ACTIVE_PROFILE_FILE, 'utf-8'));
246
+ }
247
+ catch {
248
+ return null;
249
+ }
250
+ }
251
+ /** Build initial routing preferences from an expertise keyword */
252
+ function buildRoutingPreferences(expertise) {
253
+ const agentMap = {
254
+ python: 'coder',
255
+ react: 'coder',
256
+ typescript: 'coder',
257
+ rust: 'coder',
258
+ go: 'coder',
259
+ java: 'coder',
260
+ swift: 'coder',
261
+ ruby: 'coder',
262
+ devops: 'infrastructure',
263
+ docker: 'infrastructure',
264
+ terraform: 'infrastructure',
265
+ kubernetes: 'infrastructure',
266
+ security: 'guardian',
267
+ design: 'aesthete',
268
+ writing: 'writer',
269
+ research: 'researcher',
270
+ data: 'quant',
271
+ trading: 'quant',
272
+ strategy: 'strategist',
273
+ };
274
+ const agent = agentMap[expertise.toLowerCase()] || 'coder';
275
+ const now = new Date().toISOString();
276
+ return [
277
+ {
278
+ intent: expertise.toLowerCase(),
279
+ keywords: [expertise.toLowerCase()],
280
+ agent,
281
+ method: 'category',
282
+ success: true,
283
+ count: 1,
284
+ lastUsed: now,
285
+ },
286
+ ];
287
+ }
288
+ //# sourceMappingURL=memory-hotswap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-hotswap.js","sourceRoot":"","sources":["../src/memory-hotswap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ export type Severity = 'critical' | 'high' | 'medium' | 'low';
2
+ export interface SecurityFinding {
3
+ category: string;
4
+ title: string;
5
+ severity: Severity;
6
+ description: string;
7
+ remediation: string;
8
+ location?: string;
9
+ }
10
+ export interface SecurityReport {
11
+ timestamp: string;
12
+ score: number;
13
+ findings: SecurityFinding[];
14
+ criticalCount: number;
15
+ highCount: number;
16
+ mediumCount: number;
17
+ lowCount: number;
18
+ goodPractices: string[];
19
+ summary: string;
20
+ }
21
+ export interface BreachResult {
22
+ email: string;
23
+ breached: boolean;
24
+ breachCount: number;
25
+ breaches: Array<{
26
+ name: string;
27
+ domain: string;
28
+ breachDate: string;
29
+ dataClasses: string[];
30
+ }>;
31
+ }
32
+ export interface MonitorEvent {
33
+ timestamp: string;
34
+ path: string;
35
+ eventType: string;
36
+ filename: string | null;
37
+ }
38
+ export interface ScanHistoryEntry {
39
+ timestamp: string;
40
+ score: number;
41
+ criticalCount: number;
42
+ highCount: number;
43
+ mediumCount: number;
44
+ lowCount: number;
45
+ totalFindings: number;
46
+ }
47
+ export interface SecretFinding {
48
+ file: string;
49
+ line: number;
50
+ type: string;
51
+ preview: string;
52
+ }
53
+ /**
54
+ * Recursively scan a directory for leaked secrets (API keys, tokens, passwords).
55
+ * NEVER reads or displays actual secret values.
56
+ */
57
+ export declare function scanForSecrets(scanPath?: string): SecretFinding[];
58
+ export interface SSHAudit {
59
+ findings: SecurityFinding[];
60
+ keysFound: Array<{
61
+ name: string;
62
+ type: string;
63
+ hasPassphrase: boolean | null;
64
+ }>;
65
+ authorizedKeysCount: number;
66
+ configIssues: string[];
67
+ }
68
+ /**
69
+ * Audit SSH configuration and keys.
70
+ * Checks for password-protected keys, authorized_keys cleanliness, and config issues.
71
+ */
72
+ export declare function checkSSHSecurity(): SSHAudit;
73
+ export interface PortResult {
74
+ port: number;
75
+ service: string;
76
+ open: boolean;
77
+ }
78
+ /**
79
+ * Scan common ports on localhost to check for exposed services.
80
+ * Uses TCP connect probes via the net module.
81
+ */
82
+ export declare function checkPortExposure(): Promise<{
83
+ ports: PortResult[];
84
+ findings: SecurityFinding[];
85
+ }>;
86
+ export interface PermissionCheck {
87
+ path: string;
88
+ exists: boolean;
89
+ mode: string | null;
90
+ isWorldReadable: boolean;
91
+ isWorldWritable: boolean;
92
+ finding: SecurityFinding | null;
93
+ }
94
+ /**
95
+ * Verify that sensitive files and directories are not world-readable or world-writable.
96
+ */
97
+ export declare function checkFilePermissions(paths?: string[]): PermissionCheck[];
98
+ export interface ScanOptions {
99
+ /** Directory to scan for secrets (default: cwd) */
100
+ secretsScanPath?: string;
101
+ /** Skip port scanning */
102
+ skipPorts?: boolean;
103
+ /** Skip npm global check */
104
+ skipNpm?: boolean;
105
+ /** Skip browser data check */
106
+ skipBrowser?: boolean;
107
+ }
108
+ /**
109
+ * Full personal security audit.
110
+ * Checks: secrets, SSH, permissions, ports, firewall, git, browser, npm globals.
111
+ */
112
+ export declare function runSecurityScan(options?: ScanOptions): Promise<SecurityReport>;
113
+ /**
114
+ * Watch sensitive directories for unexpected changes.
115
+ * Logs all change events to ~/.kbot/security/monitor-log.jsonl.
116
+ * Returns a dispose function to stop watching.
117
+ */
118
+ export declare function monitorFileChanges(paths?: string[]): {
119
+ dispose: () => void;
120
+ };
121
+ /**
122
+ * Check if email addresses appear in known data breaches using the Have I Been Pwned API.
123
+ * Uses the free, public, unauthenticated breach search endpoint.
124
+ */
125
+ export declare function checkBreachedEmails(emails: string[]): Promise<BreachResult[]>;
126
+ /**
127
+ * Run a full scan and format it into a human-readable report.
128
+ */
129
+ export declare function generateSecurityReport(options?: ScanOptions): Promise<string>;
130
+ /**
131
+ * Set up recurring security scans.
132
+ * Results saved to ~/.kbot/security/scan-history.json.
133
+ * Sends Discord webhook alert if critical findings detected.
134
+ */
135
+ export declare function scheduleSecurityScan(intervalHours: number, discordWebhookUrl?: string): {
136
+ stop: () => void;
137
+ };
138
+ /**
139
+ * Get the scan history for trend analysis.
140
+ */
141
+ export declare function getScanHistory(limit?: number): ScanHistoryEntry[];
142
+ //# sourceMappingURL=personal-security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personal-security.d.ts","sourceRoot":"","sources":["../src/personal-security.ts"],"names":[],"mappings":"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"}