@kernel.chat/kbot 3.38.0 → 3.40.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,23 @@
1
+ import type { Server } from 'node:http';
2
+ export interface ForgeServerTool {
3
+ /** Tool name (snake_case) */
4
+ name: string;
5
+ /** Human-readable description */
6
+ description: string;
7
+ /** Tool implementation code */
8
+ code: string;
9
+ /** Author username or anonymous */
10
+ author: string;
11
+ /** Semver version */
12
+ version: string;
13
+ /** ISO timestamp of creation */
14
+ created: string;
15
+ /** ISO timestamp of last update */
16
+ updated: string;
17
+ /** Categorization tags */
18
+ tags: string[];
19
+ }
20
+ /** Start the Forge Marketplace HTTP server.
21
+ * Returns the running server instance. */
22
+ export declare function startForgeServer(port?: number): Server;
23
+ //# sourceMappingURL=forge-marketplace-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forge-marketplace-server.d.ts","sourceRoot":"","sources":["../src/forge-marketplace-server.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAYvC,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,0BAA0B;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAybD;2CAC2C;AAC3C,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CA+FtD"}
@@ -0,0 +1,457 @@
1
+ // kbot Forge Marketplace Server — Local-first HTTP server for tool sharing
2
+ //
3
+ // Run on one machine for personal use or deploy for the community.
4
+ // Other kbot instances can publish tools and download from this server.
5
+ //
6
+ // Routes:
7
+ // POST /api/forge/publish — publish a forged tool
8
+ // GET /api/forge/marketplace — list all tools sorted by downloads
9
+ // GET /api/forge/tools/:name — get a specific tool
10
+ // POST /api/forge/rate — rate a tool (1-5)
11
+ // GET /api/forge/trending — top 10 by downloads this week
12
+ // GET /api/forge/recommend — recommend tools for a project type
13
+ //
14
+ // Stores everything in ~/.kbot/forge-server/ as JSON files.
15
+ // Uses only Node built-ins. No external dependencies.
16
+ import { createServer } from 'node:http';
17
+ import { homedir } from 'node:os';
18
+ import { join } from 'node:path';
19
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, } from 'node:fs';
20
+ const KBOT_DIR = join(homedir(), '.kbot');
21
+ const SERVER_DIR = join(KBOT_DIR, 'forge-server');
22
+ const TOOLS_DIR = join(SERVER_DIR, 'tools');
23
+ const RATINGS_FILE = join(SERVER_DIR, 'ratings.json');
24
+ const DOWNLOADS_FILE = join(SERVER_DIR, 'downloads.json');
25
+ const DEFAULT_PORT = 7439;
26
+ // ── Project type to tag mapping for recommendations ──
27
+ const PROJECT_TAG_MAP = {
28
+ react: ['react', 'frontend', 'component', 'jsx', 'tsx', 'ui'],
29
+ nextjs: ['nextjs', 'react', 'ssr', 'fullstack', 'api'],
30
+ vue: ['vue', 'frontend', 'component', 'ui'],
31
+ angular: ['angular', 'frontend', 'component', 'typescript'],
32
+ svelte: ['svelte', 'frontend', 'component', 'ui'],
33
+ python: ['python', 'pip', 'backend', 'script'],
34
+ django: ['django', 'python', 'backend', 'api', 'orm'],
35
+ flask: ['flask', 'python', 'backend', 'api'],
36
+ rust: ['rust', 'cargo', 'systems', 'cli'],
37
+ go: ['go', 'golang', 'backend', 'cli', 'api'],
38
+ node: ['node', 'npm', 'typescript', 'javascript', 'backend'],
39
+ express: ['express', 'node', 'api', 'backend', 'middleware'],
40
+ docker: ['docker', 'container', 'devops', 'deploy'],
41
+ terraform: ['terraform', 'iac', 'devops', 'cloud'],
42
+ kubernetes: ['kubernetes', 'k8s', 'devops', 'container', 'deploy'],
43
+ };
44
+ // ── Helpers ──
45
+ function ensureDir(dir) {
46
+ if (!existsSync(dir))
47
+ mkdirSync(dir, { recursive: true });
48
+ }
49
+ function loadJSON(path, fallback) {
50
+ try {
51
+ if (existsSync(path)) {
52
+ return JSON.parse(readFileSync(path, 'utf-8'));
53
+ }
54
+ }
55
+ catch {
56
+ // Corrupt file
57
+ }
58
+ return fallback;
59
+ }
60
+ function saveJSON(path, data) {
61
+ const parentDir = join(path, '..');
62
+ ensureDir(parentDir);
63
+ writeFileSync(path, JSON.stringify(data, null, 2));
64
+ }
65
+ function loadRatings() {
66
+ return loadJSON(RATINGS_FILE, { tools: {} });
67
+ }
68
+ function saveRatings(store) {
69
+ saveJSON(RATINGS_FILE, store);
70
+ }
71
+ function loadDownloads() {
72
+ return loadJSON(DOWNLOADS_FILE, { tools: {} });
73
+ }
74
+ function saveDownloads(store) {
75
+ saveJSON(DOWNLOADS_FILE, store);
76
+ }
77
+ /** Get the ISO week string for a date (YYYY-Www) */
78
+ function getISOWeek(date) {
79
+ const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
80
+ const dayNum = d.getUTCDay() || 7;
81
+ d.setUTCDate(d.getUTCDate() + 4 - dayNum);
82
+ const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
83
+ const weekNo = Math.ceil((((d.getTime() - yearStart.getTime()) / 86400000) + 1) / 7);
84
+ return `${d.getUTCFullYear()}-W${String(weekNo).padStart(2, '0')}`;
85
+ }
86
+ /** Record a download event for a tool */
87
+ function recordDownload(name) {
88
+ const store = loadDownloads();
89
+ if (!store.tools[name]) {
90
+ store.tools[name] = { name, total: 0, weekly: {} };
91
+ }
92
+ store.tools[name].total++;
93
+ const week = getISOWeek(new Date());
94
+ store.tools[name].weekly[week] = (store.tools[name].weekly[week] || 0) + 1;
95
+ saveDownloads(store);
96
+ }
97
+ /** Load a tool from disk */
98
+ function loadTool(name) {
99
+ const toolPath = join(TOOLS_DIR, `${name}.json`);
100
+ return loadJSON(toolPath, null);
101
+ }
102
+ /** List all tools on disk */
103
+ function listAllTools() {
104
+ ensureDir(TOOLS_DIR);
105
+ const files = readdirSync(TOOLS_DIR).filter(f => f.endsWith('.json'));
106
+ const tools = [];
107
+ for (const file of files) {
108
+ try {
109
+ const tool = JSON.parse(readFileSync(join(TOOLS_DIR, file), 'utf-8'));
110
+ tools.push(tool);
111
+ }
112
+ catch {
113
+ // Skip corrupt files
114
+ }
115
+ }
116
+ return tools;
117
+ }
118
+ /** Parse JSON body from request */
119
+ function parseBody(req) {
120
+ return new Promise((resolve, reject) => {
121
+ const chunks = [];
122
+ let size = 0;
123
+ const MAX_BODY = 5 * 1024 * 1024; // 5MB
124
+ req.on('data', (chunk) => {
125
+ size += chunk.length;
126
+ if (size > MAX_BODY) {
127
+ reject(new Error('Body too large'));
128
+ req.destroy();
129
+ return;
130
+ }
131
+ chunks.push(chunk);
132
+ });
133
+ req.on('end', () => {
134
+ try {
135
+ const body = Buffer.concat(chunks).toString('utf-8');
136
+ resolve(body ? JSON.parse(body) : {});
137
+ }
138
+ catch {
139
+ reject(new Error('Invalid JSON'));
140
+ }
141
+ });
142
+ req.on('error', reject);
143
+ });
144
+ }
145
+ /** Send JSON response */
146
+ function sendJSON(res, status, data) {
147
+ const body = JSON.stringify(data);
148
+ res.writeHead(status, {
149
+ 'Content-Type': 'application/json',
150
+ 'Content-Length': Buffer.byteLength(body),
151
+ 'Access-Control-Allow-Origin': '*',
152
+ });
153
+ res.end(body);
154
+ }
155
+ /** Parse URL query parameters */
156
+ function parseQuery(url) {
157
+ const params = {};
158
+ const idx = url.indexOf('?');
159
+ if (idx === -1)
160
+ return params;
161
+ const query = url.slice(idx + 1);
162
+ for (const pair of query.split('&')) {
163
+ const eqIdx = pair.indexOf('=');
164
+ if (eqIdx === -1) {
165
+ params[decodeURIComponent(pair)] = '';
166
+ }
167
+ else {
168
+ params[decodeURIComponent(pair.slice(0, eqIdx))] = decodeURIComponent(pair.slice(eqIdx + 1));
169
+ }
170
+ }
171
+ return params;
172
+ }
173
+ /** Extract path without query string */
174
+ function getPath(url) {
175
+ const idx = url.indexOf('?');
176
+ return idx === -1 ? url : url.slice(0, idx);
177
+ }
178
+ // ── Route Handlers ──
179
+ /** POST /api/forge/publish — accepts a forged tool JSON, saves to disk */
180
+ async function handlePublish(req, res) {
181
+ const body = await parseBody(req);
182
+ if (!body.name || typeof body.name !== 'string') {
183
+ sendJSON(res, 400, { error: 'Missing required field: name' });
184
+ return;
185
+ }
186
+ if (!body.description || typeof body.description !== 'string') {
187
+ sendJSON(res, 400, { error: 'Missing required field: description' });
188
+ return;
189
+ }
190
+ if (!body.code || typeof body.code !== 'string') {
191
+ sendJSON(res, 400, { error: 'Missing required field: code' });
192
+ return;
193
+ }
194
+ // Sanitize name to safe filesystem characters
195
+ const safeName = body.name.replace(/[^a-z0-9_-]/gi, '_').toLowerCase();
196
+ const now = new Date().toISOString();
197
+ const existing = loadTool(safeName);
198
+ const tool = {
199
+ name: safeName,
200
+ description: body.description,
201
+ code: body.code,
202
+ author: typeof body.author === 'string' ? body.author : 'anonymous',
203
+ version: typeof body.version === 'string' ? body.version : '1.0.0',
204
+ created: existing?.created || now,
205
+ updated: now,
206
+ tags: Array.isArray(body.tags) ? body.tags.filter((t) => typeof t === 'string') : [],
207
+ };
208
+ ensureDir(TOOLS_DIR);
209
+ saveJSON(join(TOOLS_DIR, `${safeName}.json`), tool);
210
+ sendJSON(res, 200, {
211
+ success: true,
212
+ name: safeName,
213
+ message: `Tool "${safeName}" published successfully.`,
214
+ });
215
+ }
216
+ /** GET /api/forge/marketplace — returns all published tools sorted by downloads */
217
+ function handleMarketplace(_req, res) {
218
+ const tools = listAllTools();
219
+ const downloads = loadDownloads();
220
+ const ratings = loadRatings();
221
+ const enriched = tools.map(tool => ({
222
+ name: tool.name,
223
+ description: tool.description,
224
+ author: tool.author,
225
+ version: tool.version,
226
+ created: tool.created,
227
+ updated: tool.updated,
228
+ tags: tool.tags,
229
+ downloads: downloads.tools[tool.name]?.total || 0,
230
+ rating: ratings.tools[tool.name]?.average || 0,
231
+ rating_count: ratings.tools[tool.name]?.count || 0,
232
+ }));
233
+ // Sort by downloads descending
234
+ enriched.sort((a, b) => b.downloads - a.downloads);
235
+ sendJSON(res, 200, { tools: enriched, total: enriched.length });
236
+ }
237
+ /** GET /api/forge/tools/:name — returns a specific tool, records download */
238
+ function handleGetTool(name, res) {
239
+ const safeName = name.replace(/[^a-z0-9_-]/gi, '_').toLowerCase();
240
+ const tool = loadTool(safeName);
241
+ if (!tool) {
242
+ sendJSON(res, 404, { error: `Tool "${safeName}" not found.` });
243
+ return;
244
+ }
245
+ // Record download
246
+ recordDownload(safeName);
247
+ const downloads = loadDownloads();
248
+ const ratings = loadRatings();
249
+ sendJSON(res, 200, {
250
+ ...tool,
251
+ downloads: downloads.tools[safeName]?.total || 0,
252
+ rating: ratings.tools[safeName]?.average || 0,
253
+ rating_count: ratings.tools[safeName]?.count || 0,
254
+ });
255
+ }
256
+ /** POST /api/forge/rate — accepts name + rating (1-5) */
257
+ async function handleRate(req, res) {
258
+ const body = await parseBody(req);
259
+ if (!body.name || typeof body.name !== 'string') {
260
+ sendJSON(res, 400, { error: 'Missing required field: name' });
261
+ return;
262
+ }
263
+ if (typeof body.rating !== 'number' || !Number.isInteger(body.rating) || body.rating < 1 || body.rating > 5) {
264
+ sendJSON(res, 400, { error: 'Rating must be an integer between 1 and 5.' });
265
+ return;
266
+ }
267
+ const safeName = body.name.replace(/[^a-z0-9_-]/gi, '_').toLowerCase();
268
+ // Verify tool exists
269
+ const tool = loadTool(safeName);
270
+ if (!tool) {
271
+ sendJSON(res, 404, { error: `Tool "${safeName}" not found.` });
272
+ return;
273
+ }
274
+ const store = loadRatings();
275
+ if (!store.tools[safeName]) {
276
+ store.tools[safeName] = { name: safeName, ratings: [], average: 0, count: 0 };
277
+ }
278
+ const toolRating = store.tools[safeName];
279
+ toolRating.ratings.push(body.rating);
280
+ // Cap stored ratings at 1000 to avoid unbounded growth
281
+ if (toolRating.ratings.length > 1000) {
282
+ toolRating.ratings = toolRating.ratings.slice(-1000);
283
+ }
284
+ toolRating.count = toolRating.ratings.length;
285
+ toolRating.average = Math.round((toolRating.ratings.reduce((sum, r) => sum + r, 0) / toolRating.count) * 100) / 100;
286
+ saveRatings(store);
287
+ sendJSON(res, 200, {
288
+ success: true,
289
+ name: safeName,
290
+ average: toolRating.average,
291
+ count: toolRating.count,
292
+ });
293
+ }
294
+ /** GET /api/forge/trending — top 10 by downloads this week */
295
+ function handleTrending(_req, res) {
296
+ const tools = listAllTools();
297
+ const downloads = loadDownloads();
298
+ const ratings = loadRatings();
299
+ const currentWeek = getISOWeek(new Date());
300
+ const enriched = tools.map(tool => {
301
+ const dl = downloads.tools[tool.name];
302
+ return {
303
+ name: tool.name,
304
+ description: tool.description,
305
+ author: tool.author,
306
+ version: tool.version,
307
+ tags: tool.tags,
308
+ downloads_total: dl?.total || 0,
309
+ downloads_this_week: dl?.weekly[currentWeek] || 0,
310
+ rating: ratings.tools[tool.name]?.average || 0,
311
+ rating_count: ratings.tools[tool.name]?.count || 0,
312
+ };
313
+ });
314
+ // Sort by weekly downloads descending, then total as tiebreaker
315
+ enriched.sort((a, b) => {
316
+ const weekDiff = b.downloads_this_week - a.downloads_this_week;
317
+ return weekDiff !== 0 ? weekDiff : b.downloads_total - a.downloads_total;
318
+ });
319
+ sendJSON(res, 200, { tools: enriched.slice(0, 10), week: currentWeek });
320
+ }
321
+ /** GET /api/forge/recommend?type=react — recommend tools for project type */
322
+ function handleRecommend(req, res) {
323
+ const query = parseQuery(req.url || '');
324
+ const projectType = (query.type || '').toLowerCase().trim();
325
+ if (!projectType) {
326
+ sendJSON(res, 400, {
327
+ error: 'Missing query parameter: type',
328
+ supported_types: Object.keys(PROJECT_TAG_MAP),
329
+ });
330
+ return;
331
+ }
332
+ const relevantTags = PROJECT_TAG_MAP[projectType] || [projectType];
333
+ const tagSet = new Set(relevantTags);
334
+ const tools = listAllTools();
335
+ const downloads = loadDownloads();
336
+ const ratings = loadRatings();
337
+ // Score each tool by tag overlap + downloads + rating
338
+ const scored = tools.map(tool => {
339
+ const tagOverlap = tool.tags.filter(t => tagSet.has(t.toLowerCase())).length;
340
+ const dl = downloads.tools[tool.name]?.total || 0;
341
+ const rating = ratings.tools[tool.name]?.average || 0;
342
+ // Weighted relevance score
343
+ const score = (tagOverlap * 10) + (rating * 2) + Math.log2(dl + 1);
344
+ return {
345
+ name: tool.name,
346
+ description: tool.description,
347
+ author: tool.author,
348
+ version: tool.version,
349
+ tags: tool.tags,
350
+ downloads: dl,
351
+ rating,
352
+ rating_count: ratings.tools[tool.name]?.count || 0,
353
+ relevance_score: Math.round(score * 100) / 100,
354
+ };
355
+ }).filter(t => {
356
+ // Must have at least one matching tag or the project type in name/description
357
+ const hasTagMatch = t.tags.some(tag => tagSet.has(tag.toLowerCase()));
358
+ const hasNameMatch = t.name.includes(projectType);
359
+ const hasDescMatch = t.description.toLowerCase().includes(projectType);
360
+ return hasTagMatch || hasNameMatch || hasDescMatch;
361
+ });
362
+ // Sort by relevance score descending
363
+ scored.sort((a, b) => b.relevance_score - a.relevance_score);
364
+ sendJSON(res, 200, {
365
+ tools: scored.slice(0, 20),
366
+ project_type: projectType,
367
+ matched_tags: relevantTags,
368
+ });
369
+ }
370
+ // ── Server ──
371
+ /** Start the Forge Marketplace HTTP server.
372
+ * Returns the running server instance. */
373
+ export function startForgeServer(port) {
374
+ const listenPort = port ?? DEFAULT_PORT;
375
+ // Ensure storage directories exist
376
+ ensureDir(SERVER_DIR);
377
+ ensureDir(TOOLS_DIR);
378
+ const server = createServer(async (req, res) => {
379
+ // CORS preflight
380
+ if (req.method === 'OPTIONS') {
381
+ res.writeHead(204, {
382
+ 'Access-Control-Allow-Origin': '*',
383
+ 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
384
+ 'Access-Control-Allow-Headers': 'Content-Type, Authorization',
385
+ });
386
+ res.end();
387
+ return;
388
+ }
389
+ const method = req.method || 'GET';
390
+ const path = getPath(req.url || '/');
391
+ try {
392
+ // POST /api/forge/publish
393
+ if (method === 'POST' && path === '/api/forge/publish') {
394
+ await handlePublish(req, res);
395
+ return;
396
+ }
397
+ // GET /api/forge/marketplace
398
+ if (method === 'GET' && path === '/api/forge/marketplace') {
399
+ handleMarketplace(req, res);
400
+ return;
401
+ }
402
+ // GET /api/forge/tools/:name
403
+ if (method === 'GET' && path.startsWith('/api/forge/tools/')) {
404
+ const name = path.slice('/api/forge/tools/'.length);
405
+ if (!name) {
406
+ sendJSON(res, 400, { error: 'Tool name is required.' });
407
+ return;
408
+ }
409
+ handleGetTool(decodeURIComponent(name), res);
410
+ return;
411
+ }
412
+ // POST /api/forge/rate
413
+ if (method === 'POST' && path === '/api/forge/rate') {
414
+ await handleRate(req, res);
415
+ return;
416
+ }
417
+ // GET /api/forge/trending
418
+ if (method === 'GET' && path === '/api/forge/trending') {
419
+ handleTrending(req, res);
420
+ return;
421
+ }
422
+ // GET /api/forge/recommend
423
+ if (method === 'GET' && path === '/api/forge/recommend') {
424
+ handleRecommend(req, res);
425
+ return;
426
+ }
427
+ // Health check
428
+ if (method === 'GET' && (path === '/' || path === '/health')) {
429
+ const toolCount = listAllTools().length;
430
+ sendJSON(res, 200, {
431
+ status: 'ok',
432
+ service: 'kbot-forge-marketplace',
433
+ tools: toolCount,
434
+ uptime: process.uptime(),
435
+ });
436
+ return;
437
+ }
438
+ // 404
439
+ sendJSON(res, 404, { error: 'Not found', path });
440
+ }
441
+ catch (err) {
442
+ const message = err instanceof Error ? err.message : 'Internal server error';
443
+ if (process.env.KBOT_DEBUG) {
444
+ console.error(`[forge-server] ${method} ${path} error:`, message);
445
+ }
446
+ sendJSON(res, 500, { error: message });
447
+ }
448
+ });
449
+ server.listen(listenPort, () => {
450
+ if (process.env.KBOT_DEBUG || !process.env.KBOT_QUIET) {
451
+ console.log(`[forge-server] Marketplace running on http://localhost:${listenPort}`);
452
+ console.log(`[forge-server] Storage: ${SERVER_DIR}`);
453
+ }
454
+ });
455
+ return server;
456
+ }
457
+ //# sourceMappingURL=forge-marketplace-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forge-marketplace-server.js","sourceRoot":"","sources":["../src/forge-marketplace-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ export type KnowledgeSource = 'conversation' | 'forge' | 'pattern' | 'web_search' | 'user_question' | 'email' | 'manual';
2
+ export interface KnowledgeEntry {
3
+ /** Unique ID (SHA-256 hash of content + source) */
4
+ id: string;
5
+ /** Primary topic this entry belongs to */
6
+ topic: string;
7
+ /** The actual knowledge content */
8
+ content: string;
9
+ /** Where this knowledge came from */
10
+ source: KnowledgeSource;
11
+ /** Source detail (e.g., tool name, email subject, URL) */
12
+ sourceDetail: string;
13
+ /** Confidence in this knowledge (0-1) */
14
+ confidence: number;
15
+ /** Tags for cross-referencing */
16
+ tags: string[];
17
+ /** When this entry was created */
18
+ createdAt: string;
19
+ /** When this entry was last verified/updated */
20
+ updatedAt: string;
21
+ }
22
+ export interface KnowledgeIndex {
23
+ /** Total number of entries across all topics */
24
+ totalEntries: number;
25
+ /** Map of topic slug -> entry count */
26
+ topics: Record<string, number>;
27
+ /** Map of source type -> entry count */
28
+ sources: Record<string, number>;
29
+ /** Last time the index was updated */
30
+ lastUpdated: string;
31
+ }
32
+ export interface KnowledgeQueryResult {
33
+ /** The matching entry */
34
+ entry: KnowledgeEntry;
35
+ /** Relevance score (higher = more relevant) */
36
+ relevance: number;
37
+ }
38
+ export interface KnowledgeStats {
39
+ total_entries: number;
40
+ topics: string[];
41
+ sources: Record<string, number>;
42
+ last_updated: string;
43
+ }
44
+ export declare class KnowledgeBase {
45
+ private indexCache;
46
+ constructor();
47
+ /**
48
+ * Add knowledge from any source.
49
+ * Deduplicates by content hash.
50
+ * Tags with source, confidence, timestamp.
51
+ */
52
+ ingest(source: KnowledgeSource, content: string, metadata?: {
53
+ topic?: string;
54
+ sourceDetail?: string;
55
+ confidence?: number;
56
+ tags?: string[];
57
+ }): KnowledgeEntry;
58
+ /**
59
+ * Search the knowledge base for relevant entries.
60
+ * Uses keyword matching + cosine similarity on TF-IDF vectors.
61
+ * Returns ranked results with sources.
62
+ */
63
+ query(question: string): KnowledgeQueryResult[];
64
+ /**
65
+ * Get everything kbot knows about a topic, synthesized into a readable summary.
66
+ * Pulls from all sources and organizes by type.
67
+ */
68
+ getTopicSummary(topic: string): string;
69
+ /**
70
+ * Extract knowledge from an email/conversation thread.
71
+ * Pulls out facts, decisions, recommendations.
72
+ */
73
+ addFromConversation(userEmail: string, messages: Array<{
74
+ role: string;
75
+ content: string;
76
+ }>): KnowledgeEntry[];
77
+ /**
78
+ * When a tool is forged, extract what problem it solves and add to KB.
79
+ */
80
+ addFromForge(tool: {
81
+ name: string;
82
+ description: string;
83
+ tags?: string[];
84
+ code?: string;
85
+ }): KnowledgeEntry;
86
+ /**
87
+ * Get knowledge base statistics.
88
+ */
89
+ getStats(): KnowledgeStats;
90
+ /** Load or rebuild the index */
91
+ private loadIndex;
92
+ /** Rebuild the index from all topic files */
93
+ private rebuildIndex;
94
+ }
95
+ //# sourceMappingURL=knowledge-base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-base.d.ts","sourceRoot":"","sources":["../src/knowledge-base.ts"],"names":[],"mappings":"AAyBA,MAAM,MAAM,eAAe,GACvB,cAAc,GACd,OAAO,GACP,SAAS,GACT,YAAY,GACZ,eAAe,GACf,OAAO,GACP,QAAQ,CAAA;AAEZ,MAAM,WAAW,cAAc;IAC7B,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAA;IACV,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAA;IACb,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,MAAM,EAAE,eAAe,CAAA;IACvB,0DAA0D;IAC1D,YAAY,EAAE,MAAM,CAAA;IACpB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAA;IAClB,iCAAiC;IACjC,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAA;IACpB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,yBAAyB;IACzB,KAAK,EAAE,cAAc,CAAA;IACrB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,YAAY,EAAE,MAAM,CAAA;CACrB;AA+MD,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAA8B;;IAMhD;;;;OAIG;IACH,MAAM,CACJ,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAChB,GACA,cAAc;IA8CjB;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB,EAAE;IAkD/C;;;OAGG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAsFtC;;;OAGG;IACH,mBAAmB,CACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GACjD,cAAc,EAAE;IAuBnB;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE;QACjB,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,EAAE,MAAM,CAAA;QACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;QACf,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,GAAG,cAAc;IAgBlB;;OAEG;IACH,QAAQ,IAAI,cAAc;IAa1B,gCAAgC;IAChC,OAAO,CAAC,SAAS;IAWjB,6CAA6C;IAC7C,OAAO,CAAC,YAAY;CAuCrB"}