@kernel.chat/kbot 3.39.0 → 3.41.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/interactive-buttons.d.ts +90 -0
- package/dist/interactive-buttons.d.ts.map +1 -0
- package/dist/interactive-buttons.js +286 -0
- package/dist/interactive-buttons.js.map +1 -0
- package/dist/knowledge-base.d.ts +95 -0
- package/dist/knowledge-base.d.ts.map +1 -0
- package/dist/knowledge-base.js +468 -0
- package/dist/knowledge-base.js.map +1 -0
- package/dist/memory-hotswap.d.ts +58 -0
- package/dist/memory-hotswap.d.ts.map +1 -0
- package/dist/memory-hotswap.js +288 -0
- package/dist/memory-hotswap.js.map +1 -0
- package/dist/pattern-feed.d.ts +65 -0
- package/dist/pattern-feed.d.ts.map +1 -0
- package/dist/pattern-feed.js +357 -0
- package/dist/pattern-feed.js.map +1 -0
- package/dist/personal-security.d.ts +142 -0
- package/dist/personal-security.d.ts.map +1 -0
- package/dist/personal-security.js +1151 -0
- package/dist/personal-security.js.map +1 -0
- package/dist/side-conversation.d.ts +58 -0
- package/dist/side-conversation.d.ts.map +1 -0
- package/dist/side-conversation.js +224 -0
- package/dist/side-conversation.js.map +1 -0
- package/dist/user-graph.d.ts +123 -0
- package/dist/user-graph.d.ts.map +1 -0
- package/dist/user-graph.js +435 -0
- package/dist/user-graph.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
// kbot Pattern Feed — Collective Memory Surface
|
|
2
|
+
//
|
|
3
|
+
// The collective memory — surfaces what worked for people like you.
|
|
4
|
+
// Reads local patterns + collective patterns, scores by relevance,
|
|
5
|
+
// and returns a feed of top insights grouped by category.
|
|
6
|
+
//
|
|
7
|
+
// Node built-ins only. No external dependencies.
|
|
8
|
+
import { homedir } from 'node:os';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { existsSync, readFileSync, mkdirSync } from 'node:fs';
|
|
11
|
+
// ── Paths ──
|
|
12
|
+
const KBOT_DIR = join(homedir(), '.kbot');
|
|
13
|
+
const MEMORY_DIR = join(KBOT_DIR, 'memory');
|
|
14
|
+
const COLLECTIVE_DIR = join(KBOT_DIR, 'collective');
|
|
15
|
+
const PATTERNS_FILE = join(MEMORY_DIR, 'patterns.json');
|
|
16
|
+
const COLLECTIVE_PATTERNS_FILE = join(COLLECTIVE_DIR, 'learned-patterns.json');
|
|
17
|
+
// ── Helpers ──
|
|
18
|
+
function ensureDir(dir) {
|
|
19
|
+
if (!existsSync(dir))
|
|
20
|
+
mkdirSync(dir, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
function loadJSON(path, fallback) {
|
|
23
|
+
try {
|
|
24
|
+
if (existsSync(path)) {
|
|
25
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Corrupt file — return fallback
|
|
30
|
+
}
|
|
31
|
+
return fallback;
|
|
32
|
+
}
|
|
33
|
+
// ── Language/Framework Detection ──
|
|
34
|
+
const LANGUAGE_MAP = {
|
|
35
|
+
typescript: 'TypeScript', javascript: 'JavaScript', python: 'Python',
|
|
36
|
+
rust: 'Rust', go: 'Go', java: 'Java', ruby: 'Ruby', php: 'PHP',
|
|
37
|
+
swift: 'Swift', kotlin: 'Kotlin', csharp: 'C#', cpp: 'C++',
|
|
38
|
+
node: 'Node.js',
|
|
39
|
+
};
|
|
40
|
+
const FRAMEWORK_MAP = {
|
|
41
|
+
react: 'React', nextjs: 'Next.js', vue: 'Vue', angular: 'Angular',
|
|
42
|
+
svelte: 'Svelte', express: 'Express', fastify: 'Fastify', django: 'Django',
|
|
43
|
+
flask: 'Flask', rails: 'Rails', spring: 'Spring', prisma: 'Prisma',
|
|
44
|
+
drizzle: 'Drizzle', tailwind: 'Tailwind', vite: 'Vite', webpack: 'Webpack',
|
|
45
|
+
};
|
|
46
|
+
function detectLanguage(keywords) {
|
|
47
|
+
for (const kw of keywords) {
|
|
48
|
+
const lang = LANGUAGE_MAP[kw.toLowerCase()];
|
|
49
|
+
if (lang)
|
|
50
|
+
return lang;
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
function detectFramework(keywords) {
|
|
55
|
+
for (const kw of keywords) {
|
|
56
|
+
const fw = FRAMEWORK_MAP[kw.toLowerCase()];
|
|
57
|
+
if (fw)
|
|
58
|
+
return fw;
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
// ── Pattern Loading ──
|
|
63
|
+
/** Load local patterns and normalize to FeedPattern shape */
|
|
64
|
+
function loadLocalPatterns() {
|
|
65
|
+
const raw = loadJSON(PATTERNS_FILE, []);
|
|
66
|
+
if (!Array.isArray(raw))
|
|
67
|
+
return [];
|
|
68
|
+
return raw.map(p => {
|
|
69
|
+
const keywords = Array.isArray(p.keywords) ? p.keywords : [];
|
|
70
|
+
const toolsUsed = Array.isArray(p.toolSequence) ? p.toolSequence : [];
|
|
71
|
+
return {
|
|
72
|
+
type: typeof p.intent === 'string' ? 'intent_match' : 'unknown',
|
|
73
|
+
language: detectLanguage(keywords),
|
|
74
|
+
framework: detectFramework(keywords),
|
|
75
|
+
successRate: typeof p.successRate === 'number' ? p.successRate : 0,
|
|
76
|
+
toolsUsed,
|
|
77
|
+
agentUsed: typeof p.agentUsed === 'string' ? p.agentUsed : null,
|
|
78
|
+
hits: typeof p.hits === 'number' ? p.hits : 1,
|
|
79
|
+
keywords,
|
|
80
|
+
confidence: typeof p.successRate === 'number' ? p.successRate : 0.5,
|
|
81
|
+
sampleCount: 1,
|
|
82
|
+
lastUpdated: typeof p.lastUsed === 'string' ? p.lastUsed : new Date().toISOString(),
|
|
83
|
+
source: 'local',
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/** Load collective patterns and normalize to FeedPattern shape */
|
|
88
|
+
function loadCollectivePatterns() {
|
|
89
|
+
const raw = loadJSON(COLLECTIVE_PATTERNS_FILE, []);
|
|
90
|
+
if (!Array.isArray(raw))
|
|
91
|
+
return [];
|
|
92
|
+
return raw.map(p => ({
|
|
93
|
+
type: p.type || 'unknown',
|
|
94
|
+
language: p.language,
|
|
95
|
+
framework: p.framework,
|
|
96
|
+
successRate: p.successRate,
|
|
97
|
+
toolsUsed: Array.isArray(p.toolsUsed) ? p.toolsUsed : [],
|
|
98
|
+
agentUsed: p.agentUsed,
|
|
99
|
+
hits: typeof p.hits === 'number' ? p.hits : 1,
|
|
100
|
+
keywords: Array.isArray(p.keywords) ? p.keywords : [],
|
|
101
|
+
confidence: typeof p.confidence === 'number' ? p.confidence : 0.5,
|
|
102
|
+
sampleCount: typeof p.sampleCount === 'number' ? p.sampleCount : 1,
|
|
103
|
+
lastUpdated: p.lastUpdated || new Date().toISOString(),
|
|
104
|
+
source: 'collective',
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
// ── Scoring ──
|
|
108
|
+
/** Score a pattern by: relevance to project type x confidence x frequency */
|
|
109
|
+
function scorePattern(pattern, projectType) {
|
|
110
|
+
// Base score from confidence (0-1)
|
|
111
|
+
let score = pattern.confidence;
|
|
112
|
+
// Frequency weight: more observations = more reliable
|
|
113
|
+
const frequencyWeight = Math.min(Math.log2(pattern.hits + 1) / 10, 0.3);
|
|
114
|
+
score += frequencyWeight;
|
|
115
|
+
// Sample count weight (collective breadth)
|
|
116
|
+
const sampleWeight = Math.min(Math.log2(pattern.sampleCount + 1) / 10, 0.2);
|
|
117
|
+
score += sampleWeight;
|
|
118
|
+
// Success rate weight
|
|
119
|
+
score *= (0.5 + pattern.successRate * 0.5);
|
|
120
|
+
// Relevance to project type (if specified)
|
|
121
|
+
if (projectType) {
|
|
122
|
+
const normalizedProject = projectType.toLowerCase();
|
|
123
|
+
const allTerms = [
|
|
124
|
+
...pattern.keywords.map(k => k.toLowerCase()),
|
|
125
|
+
pattern.language?.toLowerCase() || '',
|
|
126
|
+
pattern.framework?.toLowerCase() || '',
|
|
127
|
+
].filter(Boolean);
|
|
128
|
+
const isRelevant = allTerms.some(term => term.includes(normalizedProject) || normalizedProject.includes(term));
|
|
129
|
+
if (isRelevant) {
|
|
130
|
+
score *= 1.5; // 50% boost for project-relevant patterns
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
score *= 0.5; // 50% penalty for unrelated patterns
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Recency boost: patterns updated recently are slightly more valuable
|
|
137
|
+
try {
|
|
138
|
+
const ageMs = Date.now() - new Date(pattern.lastUpdated).getTime();
|
|
139
|
+
const ageDays = ageMs / (1000 * 60 * 60 * 24);
|
|
140
|
+
if (ageDays < 7)
|
|
141
|
+
score *= 1.1;
|
|
142
|
+
else if (ageDays > 90)
|
|
143
|
+
score *= 0.9;
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Invalid date — no adjustment
|
|
147
|
+
}
|
|
148
|
+
return score;
|
|
149
|
+
}
|
|
150
|
+
// ── Categorization ──
|
|
151
|
+
/** Assign a pattern to its primary feed category */
|
|
152
|
+
function categorizePattern(pattern) {
|
|
153
|
+
// Forged tools: patterns with tool names that look custom (contain underscores, longer names)
|
|
154
|
+
const hasForgedTool = pattern.toolsUsed.some(t => t.includes('_') && t.length > 15);
|
|
155
|
+
if (hasForgedTool)
|
|
156
|
+
return 'forged_tools';
|
|
157
|
+
// Best agents: patterns where the agent is the key differentiator
|
|
158
|
+
if (pattern.agentUsed && pattern.successRate > 0.8 && pattern.hits > 3) {
|
|
159
|
+
return 'best_agents';
|
|
160
|
+
}
|
|
161
|
+
// Tools that worked: patterns with specific tool sequences
|
|
162
|
+
if (pattern.toolsUsed.length > 0) {
|
|
163
|
+
return 'tools_that_worked';
|
|
164
|
+
}
|
|
165
|
+
// Default: common solutions
|
|
166
|
+
return 'common_solutions';
|
|
167
|
+
}
|
|
168
|
+
// ── Feed Entry Formatting ──
|
|
169
|
+
/** Format a single pattern as a readable insight */
|
|
170
|
+
export function formatFeedEntry(pattern) {
|
|
171
|
+
const parts = [];
|
|
172
|
+
// Build the context: "React + TypeScript users" or "Python users"
|
|
173
|
+
const context = [];
|
|
174
|
+
if (pattern.framework)
|
|
175
|
+
context.push(pattern.framework);
|
|
176
|
+
if (pattern.language)
|
|
177
|
+
context.push(pattern.language);
|
|
178
|
+
const contextStr = context.length > 0
|
|
179
|
+
? `${context.join(' + ')} users`
|
|
180
|
+
: 'Users';
|
|
181
|
+
// Build the finding
|
|
182
|
+
const successPct = Math.round(pattern.successRate * 100);
|
|
183
|
+
const observationCount = pattern.source === 'collective'
|
|
184
|
+
? pattern.sampleCount
|
|
185
|
+
: pattern.hits;
|
|
186
|
+
if (pattern.agentUsed && pattern.toolsUsed.length > 0) {
|
|
187
|
+
parts.push(`${contextStr} found that the ${pattern.agentUsed} agent with ${pattern.toolsUsed.join('+')} tools`);
|
|
188
|
+
parts.push(`solves ${pattern.type === 'intent_match' ? 'matching' : pattern.type} tasks ${successPct}% of the time`);
|
|
189
|
+
}
|
|
190
|
+
else if (pattern.agentUsed) {
|
|
191
|
+
parts.push(`${contextStr} found that the ${pattern.agentUsed} agent`);
|
|
192
|
+
parts.push(`succeeds ${successPct}% of the time for ${pattern.type} tasks`);
|
|
193
|
+
}
|
|
194
|
+
else if (pattern.toolsUsed.length > 0) {
|
|
195
|
+
parts.push(`${contextStr} found that ${pattern.toolsUsed.join(' + ')} tools`);
|
|
196
|
+
parts.push(`work ${successPct}% of the time`);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
parts.push(`${contextStr} report a ${successPct}% success rate for ${pattern.type} tasks`);
|
|
200
|
+
}
|
|
201
|
+
// Add observation count
|
|
202
|
+
const observationLabel = pattern.source === 'collective' ? 'contributors' : 'observations';
|
|
203
|
+
parts.push(`(based on ${observationCount} ${observationLabel})`);
|
|
204
|
+
return parts.join(' ');
|
|
205
|
+
}
|
|
206
|
+
// ── Core API ──
|
|
207
|
+
/**
|
|
208
|
+
* Run the pattern feed. Reads local + collective patterns, scores them,
|
|
209
|
+
* groups by category, and returns the top 20 insights.
|
|
210
|
+
*
|
|
211
|
+
* @param options.projectType - Optional project type filter (react, python, etc.)
|
|
212
|
+
* @returns Feed result with entries, total patterns scanned, and project type
|
|
213
|
+
*/
|
|
214
|
+
export function runPatternFeed(options) {
|
|
215
|
+
const projectType = options?.projectType ?? null;
|
|
216
|
+
// 1. Load all patterns
|
|
217
|
+
const localPatterns = loadLocalPatterns();
|
|
218
|
+
const collectivePatterns = loadCollectivePatterns();
|
|
219
|
+
const allPatterns = [...localPatterns, ...collectivePatterns];
|
|
220
|
+
if (allPatterns.length === 0) {
|
|
221
|
+
return {
|
|
222
|
+
entries: [],
|
|
223
|
+
total_patterns_scanned: 0,
|
|
224
|
+
project_type: projectType,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
// 2. Score each pattern
|
|
228
|
+
const scored = allPatterns.map(pattern => ({
|
|
229
|
+
pattern,
|
|
230
|
+
score: scorePattern(pattern, projectType),
|
|
231
|
+
category: categorizePattern(pattern),
|
|
232
|
+
}));
|
|
233
|
+
// 3. Sort by score descending
|
|
234
|
+
scored.sort((a, b) => b.score - a.score);
|
|
235
|
+
// 4. Group by category, take top entries from each to ensure diversity
|
|
236
|
+
const categoryBuckets = new Map();
|
|
237
|
+
for (const entry of scored) {
|
|
238
|
+
const bucket = categoryBuckets.get(entry.category) || [];
|
|
239
|
+
bucket.push(entry);
|
|
240
|
+
categoryBuckets.set(entry.category, bucket);
|
|
241
|
+
}
|
|
242
|
+
// Take top entries from each category proportionally, up to 20 total
|
|
243
|
+
const maxEntries = 20;
|
|
244
|
+
const categories = ['tools_that_worked', 'best_agents', 'common_solutions', 'forged_tools'];
|
|
245
|
+
const feedEntries = [];
|
|
246
|
+
// First pass: at least 3 from each non-empty category
|
|
247
|
+
for (const cat of categories) {
|
|
248
|
+
const bucket = categoryBuckets.get(cat) || [];
|
|
249
|
+
const take = Math.min(bucket.length, 3);
|
|
250
|
+
for (let i = 0; i < take; i++) {
|
|
251
|
+
const item = bucket[i];
|
|
252
|
+
feedEntries.push({
|
|
253
|
+
insight: formatFeedEntry(item.pattern),
|
|
254
|
+
category: item.category,
|
|
255
|
+
score: item.score,
|
|
256
|
+
pattern: item.pattern,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// Second pass: fill remaining slots from overall top scored
|
|
261
|
+
if (feedEntries.length < maxEntries) {
|
|
262
|
+
const usedPatterns = new Set(feedEntries.map(e => patternFingerprint(e.pattern)));
|
|
263
|
+
for (const item of scored) {
|
|
264
|
+
if (feedEntries.length >= maxEntries)
|
|
265
|
+
break;
|
|
266
|
+
const fp = patternFingerprint(item.pattern);
|
|
267
|
+
if (usedPatterns.has(fp))
|
|
268
|
+
continue;
|
|
269
|
+
usedPatterns.add(fp);
|
|
270
|
+
feedEntries.push({
|
|
271
|
+
insight: formatFeedEntry(item.pattern),
|
|
272
|
+
category: item.category,
|
|
273
|
+
score: item.score,
|
|
274
|
+
pattern: item.pattern,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// Sort final feed by score
|
|
279
|
+
feedEntries.sort((a, b) => b.score - a.score);
|
|
280
|
+
return {
|
|
281
|
+
entries: feedEntries.slice(0, maxEntries),
|
|
282
|
+
total_patterns_scanned: allPatterns.length,
|
|
283
|
+
project_type: projectType,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get a feed filtered for a specific project type.
|
|
288
|
+
* Returns patterns that other users of the same stack found useful.
|
|
289
|
+
*/
|
|
290
|
+
export function getFeedForProject(projectType) {
|
|
291
|
+
return runPatternFeed({ projectType });
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Full-text search across all patterns.
|
|
295
|
+
* Returns matching insights with confidence scores.
|
|
296
|
+
*/
|
|
297
|
+
export function searchFeed(query) {
|
|
298
|
+
if (!query || typeof query !== 'string')
|
|
299
|
+
return [];
|
|
300
|
+
const queryTerms = query.toLowerCase()
|
|
301
|
+
.replace(/[^a-z0-9\s]/g, ' ')
|
|
302
|
+
.split(/\s+/)
|
|
303
|
+
.filter(w => w.length > 1);
|
|
304
|
+
if (queryTerms.length === 0)
|
|
305
|
+
return [];
|
|
306
|
+
// Load all patterns
|
|
307
|
+
const localPatterns = loadLocalPatterns();
|
|
308
|
+
const collectivePatterns = loadCollectivePatterns();
|
|
309
|
+
const allPatterns = [...localPatterns, ...collectivePatterns];
|
|
310
|
+
// Score each pattern by query match
|
|
311
|
+
const results = [];
|
|
312
|
+
for (const pattern of allPatterns) {
|
|
313
|
+
const searchableTerms = [
|
|
314
|
+
...pattern.keywords.map(k => k.toLowerCase()),
|
|
315
|
+
pattern.language?.toLowerCase() || '',
|
|
316
|
+
pattern.framework?.toLowerCase() || '',
|
|
317
|
+
pattern.type?.toLowerCase() || '',
|
|
318
|
+
pattern.agentUsed?.toLowerCase() || '',
|
|
319
|
+
...pattern.toolsUsed.map(t => t.toLowerCase()),
|
|
320
|
+
].filter(Boolean);
|
|
321
|
+
let matchScore = 0;
|
|
322
|
+
for (const qt of queryTerms) {
|
|
323
|
+
for (const term of searchableTerms) {
|
|
324
|
+
if (term.includes(qt) || qt.includes(term)) {
|
|
325
|
+
matchScore++;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
if (matchScore > 0) {
|
|
330
|
+
// Combine text match score with pattern confidence
|
|
331
|
+
const combinedScore = matchScore * 0.5 + pattern.confidence * 0.5;
|
|
332
|
+
results.push({
|
|
333
|
+
insight: formatFeedEntry(pattern),
|
|
334
|
+
category: categorizePattern(pattern),
|
|
335
|
+
score: combinedScore,
|
|
336
|
+
pattern,
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
// Sort by combined score descending
|
|
341
|
+
results.sort((a, b) => b.score - a.score);
|
|
342
|
+
return results.slice(0, 20);
|
|
343
|
+
}
|
|
344
|
+
// ── Internal Helpers ──
|
|
345
|
+
/** Generate a fingerprint for dedup within a feed */
|
|
346
|
+
function patternFingerprint(p) {
|
|
347
|
+
const parts = [
|
|
348
|
+
p.type,
|
|
349
|
+
p.language || '',
|
|
350
|
+
p.framework || '',
|
|
351
|
+
p.source,
|
|
352
|
+
...(p.toolsUsed || []).sort(),
|
|
353
|
+
...(p.keywords || []).sort(),
|
|
354
|
+
];
|
|
355
|
+
return parts.join(':').toLowerCase();
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=pattern-feed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-feed.js","sourceRoot":"","sources":["../src/pattern-feed.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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"}
|