@kernel.chat/kbot 3.35.1 → 3.37.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/codebase-guardian.d.ts +64 -0
- package/dist/codebase-guardian.d.ts.map +1 -0
- package/dist/codebase-guardian.js +486 -0
- package/dist/codebase-guardian.js.map +1 -0
- package/dist/collective-learning.d.ts +47 -0
- package/dist/collective-learning.d.ts.map +1 -0
- package/dist/collective-learning.js +315 -0
- package/dist/collective-learning.js.map +1 -0
- package/dist/community-manager.d.ts +60 -0
- package/dist/community-manager.d.ts.map +1 -0
- package/dist/community-manager.js +400 -0
- package/dist/community-manager.js.map +1 -0
- package/dist/dream-mode.d.ts +23 -0
- package/dist/dream-mode.d.ts.map +1 -0
- package/dist/dream-mode.js +352 -0
- package/dist/dream-mode.js.map +1 -0
- package/dist/forge-marketplace.d.ts +40 -0
- package/dist/forge-marketplace.d.ts.map +1 -0
- package/dist/forge-marketplace.js +222 -0
- package/dist/forge-marketplace.js.map +1 -0
- package/dist/kbot-service.d.ts +2 -0
- package/dist/kbot-service.d.ts.map +1 -0
- package/dist/kbot-service.js +197 -0
- package/dist/kbot-service.js.map +1 -0
- package/dist/meta-agent.d.ts +62 -0
- package/dist/meta-agent.d.ts.map +1 -0
- package/dist/meta-agent.js +288 -0
- package/dist/meta-agent.js.map +1 -0
- package/dist/tools/bootstrapper.d.ts +2 -0
- package/dist/tools/bootstrapper.d.ts.map +1 -0
- package/dist/tools/bootstrapper.js +559 -0
- package/dist/tools/bootstrapper.js.map +1 -0
- package/dist/tools/content-engine.d.ts +2 -0
- package/dist/tools/content-engine.d.ts.map +1 -0
- package/dist/tools/content-engine.js +362 -0
- package/dist/tools/content-engine.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
// kbot Dream Mode — What kbot does when you're not watching
|
|
2
|
+
//
|
|
3
|
+
// Inspired by Claude Code's Auto-Dream, but goes further.
|
|
4
|
+
// While Auto-Dream cleans memory, kbot Dream Mode actively improves itself:
|
|
5
|
+
// 1. Memory consolidation (short-term → long-term patterns)
|
|
6
|
+
// 2. Meta-agent cycle (analyze performance, propose improvements)
|
|
7
|
+
// 3. Forge speculation (pre-build tools for tomorrow's tasks)
|
|
8
|
+
// 4. Collective sync (contribute + absorb from community)
|
|
9
|
+
// 5. Codebase guardian sweep (complexity analysis)
|
|
10
|
+
// 6. Self-benchmarking (compare against yesterday)
|
|
11
|
+
// 7. Content generation (draft about what was learned)
|
|
12
|
+
//
|
|
13
|
+
// "kbot doesn't sleep. It dreams."
|
|
14
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'node:fs';
|
|
15
|
+
import { homedir } from 'node:os';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
const KBOT_DIR = join(homedir(), '.kbot');
|
|
18
|
+
const DREAM_DIR = join(KBOT_DIR, 'dreams');
|
|
19
|
+
const DREAM_LOG = join(DREAM_DIR, 'dream-log.jsonl');
|
|
20
|
+
// ── Helpers ─────────────────────────────────────────────────────────────────
|
|
21
|
+
function ensureDreamDir() {
|
|
22
|
+
if (!existsSync(DREAM_DIR))
|
|
23
|
+
mkdirSync(DREAM_DIR, { recursive: true });
|
|
24
|
+
}
|
|
25
|
+
function loadJson(path, fallback) {
|
|
26
|
+
try {
|
|
27
|
+
if (existsSync(path))
|
|
28
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
29
|
+
}
|
|
30
|
+
catch { /* ignore */ }
|
|
31
|
+
return fallback;
|
|
32
|
+
}
|
|
33
|
+
function saveJson(path, data) {
|
|
34
|
+
writeFileSync(path, JSON.stringify(data, null, 2));
|
|
35
|
+
}
|
|
36
|
+
function logDream(entry) {
|
|
37
|
+
ensureDreamDir();
|
|
38
|
+
const line = JSON.stringify({ ts: new Date().toISOString(), msg: entry }) + '\n';
|
|
39
|
+
try {
|
|
40
|
+
writeFileSync(DREAM_LOG, line, { flag: 'a' });
|
|
41
|
+
}
|
|
42
|
+
catch { /* ignore */ }
|
|
43
|
+
}
|
|
44
|
+
// ── Phase 1: Memory Consolidation ───────────────────────────────────────────
|
|
45
|
+
async function consolidateMemory() {
|
|
46
|
+
const start = Date.now();
|
|
47
|
+
const findings = [];
|
|
48
|
+
const actions = [];
|
|
49
|
+
const patternsPath = join(KBOT_DIR, 'memory', 'patterns.json');
|
|
50
|
+
const patterns = loadJson(patternsPath, []);
|
|
51
|
+
// Find duplicate/near-duplicate patterns and merge them
|
|
52
|
+
const seen = new Map();
|
|
53
|
+
let mergedCount = 0;
|
|
54
|
+
for (const p of patterns) {
|
|
55
|
+
const key = `${p.type || ''}:${p.language || ''}:${p.agent || ''}`;
|
|
56
|
+
const existing = seen.get(key);
|
|
57
|
+
if (existing !== undefined) {
|
|
58
|
+
// Merge: keep higher confidence
|
|
59
|
+
const existingPattern = patterns[existing];
|
|
60
|
+
const existingConf = Number(existingPattern.confidence || existingPattern.successRate || 0);
|
|
61
|
+
const newConf = Number(p.confidence || p.successRate || 0);
|
|
62
|
+
if (newConf > existingConf) {
|
|
63
|
+
patterns[existing] = p;
|
|
64
|
+
}
|
|
65
|
+
mergedCount++;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
seen.set(key, patterns.indexOf(p));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (mergedCount > 0) {
|
|
72
|
+
findings.push(`Found ${mergedCount} duplicate patterns`);
|
|
73
|
+
// Deduplicate
|
|
74
|
+
const unique = Array.from(seen.values()).map(i => patterns[i]);
|
|
75
|
+
saveJson(patternsPath, unique);
|
|
76
|
+
actions.push(`Consolidated ${patterns.length} → ${unique.length} patterns`);
|
|
77
|
+
}
|
|
78
|
+
// Promote high-confidence patterns to long-term knowledge
|
|
79
|
+
const knowledgePath = join(KBOT_DIR, 'memory', 'knowledge.json');
|
|
80
|
+
const knowledge = loadJson(knowledgePath, []);
|
|
81
|
+
const highConf = patterns.filter(p => Number(p.confidence || p.successRate || 0) > 0.9);
|
|
82
|
+
let promoted = 0;
|
|
83
|
+
for (const p of highConf) {
|
|
84
|
+
const alreadyKnown = knowledge.some(k => k.type === p.type && k.language === p.language && k.agent === p.agent);
|
|
85
|
+
if (!alreadyKnown) {
|
|
86
|
+
knowledge.push({ ...p, promoted_at: new Date().toISOString(), source: 'dream-consolidation' });
|
|
87
|
+
promoted++;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (promoted > 0) {
|
|
91
|
+
saveJson(knowledgePath, knowledge);
|
|
92
|
+
findings.push(`${promoted} high-confidence patterns promoted to knowledge`);
|
|
93
|
+
actions.push(`Knowledge base grew: ${knowledge.length - promoted} → ${knowledge.length}`);
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
phase: 'memory-consolidation',
|
|
97
|
+
duration_ms: Date.now() - start,
|
|
98
|
+
findings,
|
|
99
|
+
actions_taken: actions,
|
|
100
|
+
improvements: mergedCount + promoted,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// ── Phase 2: Meta-Agent Cycle ───────────────────────────────────────────────
|
|
104
|
+
async function runMetaCycle() {
|
|
105
|
+
const start = Date.now();
|
|
106
|
+
const findings = [];
|
|
107
|
+
const actions = [];
|
|
108
|
+
try {
|
|
109
|
+
// Dynamic import to avoid circular deps
|
|
110
|
+
const { analyzePerformance, proposeImprovements, applyImprovement } = await import('./meta-agent.js');
|
|
111
|
+
const profiles = analyzePerformance();
|
|
112
|
+
if (profiles.length > 0) {
|
|
113
|
+
findings.push(`${profiles.length} agents analyzed`);
|
|
114
|
+
const weak = profiles.filter(p => p.improvement_potential !== 'low');
|
|
115
|
+
if (weak.length > 0) {
|
|
116
|
+
findings.push(`${weak.length} agents need improvement: ${weak.map(p => p.agent).join(', ')}`);
|
|
117
|
+
}
|
|
118
|
+
const improvements = proposeImprovements(profiles);
|
|
119
|
+
let applied = 0;
|
|
120
|
+
for (const imp of improvements) {
|
|
121
|
+
if (imp.target === 'routing' || imp.target === 'tool_selection') {
|
|
122
|
+
applyImprovement(imp);
|
|
123
|
+
applied++;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (applied > 0) {
|
|
127
|
+
actions.push(`Auto-applied ${applied} low-risk improvements`);
|
|
128
|
+
}
|
|
129
|
+
if (improvements.length > applied) {
|
|
130
|
+
findings.push(`${improvements.length - applied} improvements proposed (need review)`);
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
phase: 'meta-agent',
|
|
134
|
+
duration_ms: Date.now() - start,
|
|
135
|
+
findings,
|
|
136
|
+
actions_taken: actions,
|
|
137
|
+
improvements: applied,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
findings.push('Meta-agent not available (no observations yet)');
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
phase: 'meta-agent',
|
|
146
|
+
duration_ms: Date.now() - start,
|
|
147
|
+
findings,
|
|
148
|
+
actions_taken: actions,
|
|
149
|
+
improvements: 0,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
// ── Phase 3: Forge Speculation ──────────────────────────────────────────────
|
|
153
|
+
async function speculateForge() {
|
|
154
|
+
const start = Date.now();
|
|
155
|
+
const findings = [];
|
|
156
|
+
const actions = [];
|
|
157
|
+
// Analyze recent patterns to predict what tools might be needed
|
|
158
|
+
const patternsPath = join(KBOT_DIR, 'memory', 'patterns.json');
|
|
159
|
+
const patterns = loadJson(patternsPath, []);
|
|
160
|
+
// Find tool gaps: patterns where success rate is low but frequency is high
|
|
161
|
+
const toolGaps = patterns.filter(p => {
|
|
162
|
+
const rate = Number(p.successRate || p.confidence || 0);
|
|
163
|
+
const hits = Number(p.hits || p.frequency || 1);
|
|
164
|
+
return rate < 0.6 && hits >= 3;
|
|
165
|
+
});
|
|
166
|
+
if (toolGaps.length > 0) {
|
|
167
|
+
findings.push(`${toolGaps.length} potential tool gaps identified`);
|
|
168
|
+
for (const gap of toolGaps.slice(0, 3)) {
|
|
169
|
+
findings.push(`Gap: ${gap.type || 'unknown'} in ${gap.language || 'unknown'} (${Math.round(Number(gap.successRate || 0) * 100)}% success, ${gap.hits || 0} attempts)`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Check if forged tools are actually being used
|
|
173
|
+
const forgeDir = join(KBOT_DIR, 'forge');
|
|
174
|
+
if (existsSync(forgeDir)) {
|
|
175
|
+
const forgedTools = readdirSync(forgeDir).filter(f => f.endsWith('.json'));
|
|
176
|
+
const unused = forgedTools.filter(f => {
|
|
177
|
+
const tool = loadJson(join(forgeDir, f), {});
|
|
178
|
+
return Number(tool.uses || 0) === 0;
|
|
179
|
+
});
|
|
180
|
+
if (unused.length > 0) {
|
|
181
|
+
findings.push(`${unused.length} forged tools never used: ${unused.slice(0, 3).join(', ')}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
phase: 'forge-speculation',
|
|
186
|
+
duration_ms: Date.now() - start,
|
|
187
|
+
findings,
|
|
188
|
+
actions_taken: actions,
|
|
189
|
+
improvements: 0,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
// ── Phase 4: Collective Sync ────────────────────────────────────────────────
|
|
193
|
+
async function collectiveSync() {
|
|
194
|
+
const start = Date.now();
|
|
195
|
+
const findings = [];
|
|
196
|
+
const actions = [];
|
|
197
|
+
try {
|
|
198
|
+
const { runCollectiveSync } = await import('./collective-learning.js');
|
|
199
|
+
await runCollectiveSync();
|
|
200
|
+
actions.push('Collective sync completed');
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
findings.push('Collective sync endpoint not available (offline mode)');
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
phase: 'collective-sync',
|
|
207
|
+
duration_ms: Date.now() - start,
|
|
208
|
+
findings,
|
|
209
|
+
actions_taken: actions,
|
|
210
|
+
improvements: 0,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
// ── Phase 5: Self-Benchmark ─────────────────────────────────────────────────
|
|
214
|
+
async function selfBenchmark() {
|
|
215
|
+
const start = Date.now();
|
|
216
|
+
const findings = [];
|
|
217
|
+
const benchDir = join(KBOT_DIR, 'benchmarks');
|
|
218
|
+
if (!existsSync(benchDir))
|
|
219
|
+
mkdirSync(benchDir, { recursive: true });
|
|
220
|
+
const historyPath = join(benchDir, 'history.json');
|
|
221
|
+
const history = loadJson(historyPath, []);
|
|
222
|
+
if (history.length >= 2) {
|
|
223
|
+
const recent = history.slice(-5);
|
|
224
|
+
const older = history.slice(-10, -5);
|
|
225
|
+
if (older.length > 0) {
|
|
226
|
+
const recentAvgTime = recent.reduce((s, h) => s + Number(h.timeMs || 0), 0) / recent.length;
|
|
227
|
+
const olderAvgTime = older.reduce((s, h) => s + Number(h.timeMs || 0), 0) / older.length;
|
|
228
|
+
if (recentAvgTime < olderAvgTime) {
|
|
229
|
+
const improvement = Math.round((1 - recentAvgTime / olderAvgTime) * 100);
|
|
230
|
+
findings.push(`Performance improved ${improvement}% over last 10 benchmarks`);
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
const regression = Math.round((recentAvgTime / olderAvgTime - 1) * 100);
|
|
234
|
+
findings.push(`Performance regressed ${regression}% — meta-agent should investigate`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
findings.push('Not enough benchmark data yet. Run: kbot compete "your task"');
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
phase: 'self-benchmark',
|
|
243
|
+
duration_ms: Date.now() - start,
|
|
244
|
+
findings,
|
|
245
|
+
actions_taken: [],
|
|
246
|
+
improvements: 0,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
// ── Phase 6: Dream Summary ──────────────────────────────────────────────────
|
|
250
|
+
async function generateDreamSummary(results) {
|
|
251
|
+
const start = Date.now();
|
|
252
|
+
const findings = [];
|
|
253
|
+
const totalFindings = results.reduce((s, r) => s + r.findings.length, 0);
|
|
254
|
+
const totalActions = results.reduce((s, r) => s + r.actions_taken.length, 0);
|
|
255
|
+
const totalImprovements = results.reduce((s, r) => s + r.improvements, 0);
|
|
256
|
+
findings.push(`Dream complete: ${results.length} phases, ${totalFindings} findings, ${totalActions} actions, ${totalImprovements} improvements`);
|
|
257
|
+
// Save dream journal entry
|
|
258
|
+
const journalPath = join(DREAM_DIR, `dream-${new Date().toISOString().split('T')[0]}.json`);
|
|
259
|
+
saveJson(journalPath, {
|
|
260
|
+
timestamp: new Date().toISOString(),
|
|
261
|
+
results,
|
|
262
|
+
summary: { totalFindings, totalActions, totalImprovements },
|
|
263
|
+
});
|
|
264
|
+
return {
|
|
265
|
+
phase: 'dream-summary',
|
|
266
|
+
duration_ms: Date.now() - start,
|
|
267
|
+
findings,
|
|
268
|
+
actions_taken: [`Dream journal saved: ${journalPath}`],
|
|
269
|
+
improvements: 0,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
// ── Main: Run Dream Mode ────────────────────────────────────────────────────
|
|
273
|
+
export async function runDreamMode(verbose = true) {
|
|
274
|
+
ensureDreamDir();
|
|
275
|
+
const start = Date.now();
|
|
276
|
+
if (verbose) {
|
|
277
|
+
console.log('\n🌙 kbot Dream Mode');
|
|
278
|
+
console.log('═'.repeat(50));
|
|
279
|
+
console.log('kbot doesn\'t sleep. It dreams.\n');
|
|
280
|
+
}
|
|
281
|
+
const phases = [
|
|
282
|
+
{ name: 'Memory Consolidation', description: 'Merge duplicates, promote high-confidence patterns', execute: consolidateMemory },
|
|
283
|
+
{ name: 'Meta-Agent Cycle', description: 'Analyze agent performance, propose improvements', execute: runMetaCycle },
|
|
284
|
+
{ name: 'Forge Speculation', description: 'Predict tomorrow\'s tool needs', execute: speculateForge },
|
|
285
|
+
{ name: 'Collective Sync', description: 'Contribute and absorb community patterns', execute: collectiveSync },
|
|
286
|
+
{ name: 'Self-Benchmark', description: 'Compare against yesterday\'s performance', execute: selfBenchmark },
|
|
287
|
+
];
|
|
288
|
+
const results = [];
|
|
289
|
+
for (const phase of phases) {
|
|
290
|
+
if (verbose)
|
|
291
|
+
console.log(` 💭 ${phase.name}...`);
|
|
292
|
+
logDream(`Starting: ${phase.name}`);
|
|
293
|
+
try {
|
|
294
|
+
const result = await phase.execute();
|
|
295
|
+
results.push(result);
|
|
296
|
+
if (verbose) {
|
|
297
|
+
for (const f of result.findings)
|
|
298
|
+
console.log(` ${f}`);
|
|
299
|
+
for (const a of result.actions_taken)
|
|
300
|
+
console.log(` ✓ ${a}`);
|
|
301
|
+
if (result.findings.length === 0 && result.actions_taken.length === 0) {
|
|
302
|
+
console.log(' (nothing to report)');
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
logDream(`Completed: ${phase.name} (${result.duration_ms}ms, ${result.improvements} improvements)`);
|
|
306
|
+
}
|
|
307
|
+
catch (err) {
|
|
308
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
309
|
+
if (verbose)
|
|
310
|
+
console.log(` ✗ Error: ${msg}`);
|
|
311
|
+
logDream(`Error in ${phase.name}: ${msg}`);
|
|
312
|
+
results.push({
|
|
313
|
+
phase: phase.name.toLowerCase().replace(/\s+/g, '-'),
|
|
314
|
+
duration_ms: 0,
|
|
315
|
+
findings: [`Error: ${msg}`],
|
|
316
|
+
actions_taken: [],
|
|
317
|
+
improvements: 0,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// Generate summary
|
|
322
|
+
const summary = await generateDreamSummary(results);
|
|
323
|
+
results.push(summary);
|
|
324
|
+
const totalDuration = Date.now() - start;
|
|
325
|
+
const report = {
|
|
326
|
+
timestamp: new Date().toISOString(),
|
|
327
|
+
duration_ms: totalDuration,
|
|
328
|
+
phases_completed: results.length,
|
|
329
|
+
total_findings: results.reduce((s, r) => s + r.findings.length, 0),
|
|
330
|
+
total_actions: results.reduce((s, r) => s + r.actions_taken.length, 0),
|
|
331
|
+
total_improvements: results.reduce((s, r) => s + r.improvements, 0),
|
|
332
|
+
results,
|
|
333
|
+
};
|
|
334
|
+
if (verbose) {
|
|
335
|
+
console.log('\n' + '═'.repeat(50));
|
|
336
|
+
console.log(` 🌙 Dream complete in ${(totalDuration / 1000).toFixed(1)}s`);
|
|
337
|
+
console.log(` ${report.total_findings} findings · ${report.total_actions} actions · ${report.total_improvements} improvements`);
|
|
338
|
+
console.log(` Journal: ~/.kbot/dreams/dream-${new Date().toISOString().split('T')[0]}.json`);
|
|
339
|
+
console.log();
|
|
340
|
+
}
|
|
341
|
+
return report;
|
|
342
|
+
}
|
|
343
|
+
// ── Get dream history ───────────────────────────────────────────────────────
|
|
344
|
+
export function getDreamHistory() {
|
|
345
|
+
ensureDreamDir();
|
|
346
|
+
const files = readdirSync(DREAM_DIR).filter(f => f.startsWith('dream-') && f.endsWith('.json'));
|
|
347
|
+
return files.map(f => {
|
|
348
|
+
const data = loadJson(join(DREAM_DIR, f), {});
|
|
349
|
+
return { date: f.replace('dream-', '').replace('.json', ''), summary: data.summary || {} };
|
|
350
|
+
}).sort((a, b) => b.date.localeCompare(a.date));
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=dream-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dream-mode.js","sourceRoot":"","sources":["../src/dream-mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface MarketplaceTool {
|
|
2
|
+
/** Tool name (snake_case) */
|
|
3
|
+
name: string;
|
|
4
|
+
/** Human-readable description */
|
|
5
|
+
description: string;
|
|
6
|
+
/** Author username or anonymous */
|
|
7
|
+
author: string;
|
|
8
|
+
/** Total download/install count */
|
|
9
|
+
downloads: number;
|
|
10
|
+
/** Average rating (1-5), 0 if unrated */
|
|
11
|
+
rating: number;
|
|
12
|
+
/** Categorization tags */
|
|
13
|
+
tags: string[];
|
|
14
|
+
}
|
|
15
|
+
interface LocalRating {
|
|
16
|
+
name: string;
|
|
17
|
+
rating: number;
|
|
18
|
+
ratedAt: string;
|
|
19
|
+
}
|
|
20
|
+
/** Fetch tools from the marketplace, sorted by downloads.
|
|
21
|
+
* Falls back to empty array if the marketplace is unreachable. */
|
|
22
|
+
export declare function listMarketplaceTools(): Promise<MarketplaceTool[]>;
|
|
23
|
+
/** Rate a forged tool (1-5 stars).
|
|
24
|
+
* Stores locally at ~/.kbot/forge/forge-ratings.json and syncs to marketplace.
|
|
25
|
+
* Returns true if the rating was accepted by the server (or stored locally on network failure). */
|
|
26
|
+
export declare function rateForgedTool(name: string, rating: number): Promise<boolean>;
|
|
27
|
+
/** Get the top 10 trending forged tools this week.
|
|
28
|
+
* Falls back to empty array if marketplace is unreachable. */
|
|
29
|
+
export declare function trendingTools(): Promise<MarketplaceTool[]>;
|
|
30
|
+
/** Recommend forged tools based on detected project type.
|
|
31
|
+
* Returns tools that other users of similar projects found useful. */
|
|
32
|
+
export declare function recommendTools(projectType: string): Promise<MarketplaceTool[]>;
|
|
33
|
+
/** Format a marketplace tool list for terminal display */
|
|
34
|
+
export declare function formatToolList(tools: MarketplaceTool[], title: string): string;
|
|
35
|
+
/** Get local ratings for display */
|
|
36
|
+
export declare function getLocalRatings(): LocalRating[];
|
|
37
|
+
/** Get supported project types for recommendation */
|
|
38
|
+
export declare function getSupportedProjectTypes(): string[];
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=forge-marketplace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forge-marketplace.d.ts","sourceRoot":"","sources":["../src/forge-marketplace.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAA;IACd,0BAA0B;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB;AAqDD;mEACmE;AACnE,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CA0BvE;AAED;;oGAEoG;AACpG,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA+DnF;AAED;+DAC+D;AAC/D,wBAAsB,aAAa,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAuBhE;AAED;uEACuE;AACvE,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA8BpF;AAID,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAU9E;AAED,oCAAoC;AACpC,wBAAgB,eAAe,IAAI,WAAW,EAAE,CAE/C;AAED,qDAAqD;AACrD,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAEnD"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
// kbot Forge Marketplace — Community Tool Discovery & Rating
|
|
2
|
+
//
|
|
3
|
+
// Enhances the forge registry with marketplace features:
|
|
4
|
+
// - Browse tools sorted by downloads
|
|
5
|
+
// - Rate tools 1-5 stars
|
|
6
|
+
// - Trending tools this week
|
|
7
|
+
// - Project-type-based recommendations
|
|
8
|
+
//
|
|
9
|
+
// Uses only Node built-ins + fetch. No external dependencies.
|
|
10
|
+
import { homedir } from 'node:os';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
13
|
+
const KBOT_DIR = join(homedir(), '.kbot');
|
|
14
|
+
const FORGE_DIR = join(KBOT_DIR, 'forge');
|
|
15
|
+
const RATINGS_FILE = join(FORGE_DIR, 'forge-ratings.json');
|
|
16
|
+
const MARKETPLACE_URL = process.env.KBOT_MARKETPLACE_URL || 'https://kernel.chat/api/forge/marketplace';
|
|
17
|
+
// ── Helpers ──
|
|
18
|
+
function ensureForgeDir() {
|
|
19
|
+
if (!existsSync(FORGE_DIR))
|
|
20
|
+
mkdirSync(FORGE_DIR, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
function loadRatingsStore() {
|
|
23
|
+
ensureForgeDir();
|
|
24
|
+
try {
|
|
25
|
+
if (existsSync(RATINGS_FILE)) {
|
|
26
|
+
return JSON.parse(readFileSync(RATINGS_FILE, 'utf-8'));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Corrupt file
|
|
31
|
+
}
|
|
32
|
+
return { ratings: [], lastSynced: null };
|
|
33
|
+
}
|
|
34
|
+
function saveRatingsStore(store) {
|
|
35
|
+
ensureForgeDir();
|
|
36
|
+
writeFileSync(RATINGS_FILE, JSON.stringify(store, null, 2));
|
|
37
|
+
}
|
|
38
|
+
// ── Project Type Detection ──
|
|
39
|
+
/** Map of file patterns to project types */
|
|
40
|
+
const PROJECT_INDICATORS = {
|
|
41
|
+
React: ['package.json:react', 'tsconfig.json', 'src/App.tsx', 'src/App.jsx'],
|
|
42
|
+
'Next.js': ['next.config.js', 'next.config.mjs', 'next.config.ts', 'app/layout.tsx'],
|
|
43
|
+
Vue: ['package.json:vue', 'nuxt.config.ts', 'vite.config.ts:vue'],
|
|
44
|
+
Angular: ['angular.json', 'package.json:@angular/core'],
|
|
45
|
+
Svelte: ['svelte.config.js', 'package.json:svelte'],
|
|
46
|
+
Python: ['requirements.txt', 'pyproject.toml', 'setup.py', 'Pipfile'],
|
|
47
|
+
Django: ['manage.py', 'settings.py', 'urls.py'],
|
|
48
|
+
Flask: ['app.py:flask', 'requirements.txt:flask'],
|
|
49
|
+
Rust: ['Cargo.toml', 'src/main.rs', 'src/lib.rs'],
|
|
50
|
+
Go: ['go.mod', 'go.sum', 'main.go'],
|
|
51
|
+
Node: ['package.json', 'tsconfig.json', 'index.ts', 'index.js'],
|
|
52
|
+
Express: ['package.json:express', 'app.ts:express', 'app.js:express'],
|
|
53
|
+
Docker: ['Dockerfile', 'docker-compose.yml', 'docker-compose.yaml'],
|
|
54
|
+
Terraform: ['main.tf', 'terraform.tfvars', 'variables.tf'],
|
|
55
|
+
Kubernetes: ['k8s/', 'deployment.yaml', 'service.yaml'],
|
|
56
|
+
};
|
|
57
|
+
// ── Core API ──
|
|
58
|
+
/** Fetch tools from the marketplace, sorted by downloads.
|
|
59
|
+
* Falls back to empty array if the marketplace is unreachable. */
|
|
60
|
+
export async function listMarketplaceTools() {
|
|
61
|
+
try {
|
|
62
|
+
const res = await fetch(`${MARKETPLACE_URL}/tools?sort=downloads&order=desc`, {
|
|
63
|
+
method: 'GET',
|
|
64
|
+
headers: { 'Content-Type': 'application/json' },
|
|
65
|
+
signal: AbortSignal.timeout(10_000),
|
|
66
|
+
});
|
|
67
|
+
if (!res.ok) {
|
|
68
|
+
if (process.env.KBOT_DEBUG) {
|
|
69
|
+
console.error(`[forge-marketplace] list failed: ${res.status}`);
|
|
70
|
+
}
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
const data = await res.json();
|
|
74
|
+
if (!Array.isArray(data.tools))
|
|
75
|
+
return [];
|
|
76
|
+
// Ensure sorted by downloads descending
|
|
77
|
+
return data.tools.sort((a, b) => b.downloads - a.downloads);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
if (process.env.KBOT_DEBUG) {
|
|
81
|
+
console.error('[forge-marketplace] list error:', err.message);
|
|
82
|
+
}
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/** Rate a forged tool (1-5 stars).
|
|
87
|
+
* Stores locally at ~/.kbot/forge/forge-ratings.json and syncs to marketplace.
|
|
88
|
+
* Returns true if the rating was accepted by the server (or stored locally on network failure). */
|
|
89
|
+
export async function rateForgedTool(name, rating) {
|
|
90
|
+
// Validate rating
|
|
91
|
+
if (!Number.isInteger(rating) || rating < 1 || rating > 5) {
|
|
92
|
+
if (process.env.KBOT_DEBUG) {
|
|
93
|
+
console.error('[forge-marketplace] rating must be an integer 1-5');
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
if (!name || typeof name !== 'string') {
|
|
98
|
+
if (process.env.KBOT_DEBUG) {
|
|
99
|
+
console.error('[forge-marketplace] tool name is required');
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
// Store locally
|
|
104
|
+
const store = loadRatingsStore();
|
|
105
|
+
const existingIdx = store.ratings.findIndex(r => r.name === name);
|
|
106
|
+
const localRating = {
|
|
107
|
+
name,
|
|
108
|
+
rating,
|
|
109
|
+
ratedAt: new Date().toISOString(),
|
|
110
|
+
};
|
|
111
|
+
if (existingIdx >= 0) {
|
|
112
|
+
store.ratings[existingIdx] = localRating;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
store.ratings.push(localRating);
|
|
116
|
+
}
|
|
117
|
+
saveRatingsStore(store);
|
|
118
|
+
// Sync to marketplace (non-blocking on failure)
|
|
119
|
+
try {
|
|
120
|
+
const res = await fetch(`${MARKETPLACE_URL}/rate`, {
|
|
121
|
+
method: 'POST',
|
|
122
|
+
headers: { 'Content-Type': 'application/json' },
|
|
123
|
+
body: JSON.stringify({
|
|
124
|
+
name,
|
|
125
|
+
rating,
|
|
126
|
+
timestamp: new Date().toISOString(),
|
|
127
|
+
}),
|
|
128
|
+
signal: AbortSignal.timeout(8_000),
|
|
129
|
+
});
|
|
130
|
+
if (res.ok) {
|
|
131
|
+
store.lastSynced = new Date().toISOString();
|
|
132
|
+
saveRatingsStore(store);
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
if (process.env.KBOT_DEBUG) {
|
|
136
|
+
console.error(`[forge-marketplace] rate sync failed: ${res.status}`);
|
|
137
|
+
}
|
|
138
|
+
// Rating is stored locally even if sync fails
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
if (process.env.KBOT_DEBUG) {
|
|
143
|
+
console.error('[forge-marketplace] rate sync error:', err.message);
|
|
144
|
+
}
|
|
145
|
+
// Stored locally — will sync later
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/** Get the top 10 trending forged tools this week.
|
|
150
|
+
* Falls back to empty array if marketplace is unreachable. */
|
|
151
|
+
export async function trendingTools() {
|
|
152
|
+
try {
|
|
153
|
+
const res = await fetch(`${MARKETPLACE_URL}/trending?period=week&limit=10`, {
|
|
154
|
+
method: 'GET',
|
|
155
|
+
headers: { 'Content-Type': 'application/json' },
|
|
156
|
+
signal: AbortSignal.timeout(10_000),
|
|
157
|
+
});
|
|
158
|
+
if (!res.ok) {
|
|
159
|
+
if (process.env.KBOT_DEBUG) {
|
|
160
|
+
console.error(`[forge-marketplace] trending failed: ${res.status}`);
|
|
161
|
+
}
|
|
162
|
+
return [];
|
|
163
|
+
}
|
|
164
|
+
const data = await res.json();
|
|
165
|
+
return Array.isArray(data.tools) ? data.tools.slice(0, 10) : [];
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
if (process.env.KBOT_DEBUG) {
|
|
169
|
+
console.error('[forge-marketplace] trending error:', err.message);
|
|
170
|
+
}
|
|
171
|
+
return [];
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/** Recommend forged tools based on detected project type.
|
|
175
|
+
* Returns tools that other users of similar projects found useful. */
|
|
176
|
+
export async function recommendTools(projectType) {
|
|
177
|
+
if (!projectType || typeof projectType !== 'string')
|
|
178
|
+
return [];
|
|
179
|
+
const normalized = projectType.trim();
|
|
180
|
+
try {
|
|
181
|
+
const res = await fetch(`${MARKETPLACE_URL}/recommend?project_type=${encodeURIComponent(normalized)}`, {
|
|
182
|
+
method: 'GET',
|
|
183
|
+
headers: { 'Content-Type': 'application/json' },
|
|
184
|
+
signal: AbortSignal.timeout(10_000),
|
|
185
|
+
});
|
|
186
|
+
if (!res.ok) {
|
|
187
|
+
if (process.env.KBOT_DEBUG) {
|
|
188
|
+
console.error(`[forge-marketplace] recommend failed: ${res.status}`);
|
|
189
|
+
}
|
|
190
|
+
return [];
|
|
191
|
+
}
|
|
192
|
+
const data = await res.json();
|
|
193
|
+
return Array.isArray(data.tools) ? data.tools : [];
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
if (process.env.KBOT_DEBUG) {
|
|
197
|
+
console.error('[forge-marketplace] recommend error:', err.message);
|
|
198
|
+
}
|
|
199
|
+
return [];
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// ── Display Helpers ──
|
|
203
|
+
/** Format a marketplace tool list for terminal display */
|
|
204
|
+
export function formatToolList(tools, title) {
|
|
205
|
+
if (tools.length === 0)
|
|
206
|
+
return `${title}: No tools found.`;
|
|
207
|
+
const lines = tools.map((t, i) => {
|
|
208
|
+
const stars = t.rating > 0 ? `${'*'.repeat(Math.round(t.rating))}` : 'unrated';
|
|
209
|
+
const tagStr = t.tags.length > 0 ? t.tags.join(', ') : 'no tags';
|
|
210
|
+
return ` ${i + 1}. ${t.name} — ${t.description}\n ${t.downloads} downloads · ${stars} · by ${t.author} · ${tagStr}`;
|
|
211
|
+
});
|
|
212
|
+
return `${title} (${tools.length} tools):\n\n${lines.join('\n\n')}`;
|
|
213
|
+
}
|
|
214
|
+
/** Get local ratings for display */
|
|
215
|
+
export function getLocalRatings() {
|
|
216
|
+
return loadRatingsStore().ratings;
|
|
217
|
+
}
|
|
218
|
+
/** Get supported project types for recommendation */
|
|
219
|
+
export function getSupportedProjectTypes() {
|
|
220
|
+
return Object.keys(PROJECT_INDICATORS);
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=forge-marketplace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forge-marketplace.js","sourceRoot":"","sources":["../src/forge-marketplace.ts"],"names":[],"mappings":"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"}
|