@kernel.chat/kbot 3.9.0 → 3.10.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,475 @@
1
+ // kbot Skill Library — Voyager-style auto-distilled, composable tool-chain skills
2
+ //
3
+ // Every successful multi-tool agent execution auto-distills into a named, reusable
4
+ // skill indexed by embedding for fast retrieval. Skills compound over time — the more
5
+ // kbot is used, the better it gets at recurring task patterns.
6
+ //
7
+ // Design:
8
+ // - A "skill" is a named, reusable tool chain with an embedding vector for retrieval
9
+ // - After every successful agent response with 2+ tool calls, distillSkill() extracts a skill
10
+ // - Skills stored in ~/.kbot/memory/skills.json (max 500, ranked by successCount)
11
+ // - Retrieval: given a new task, compute embedding similarity, return top-3 matches
12
+ // - Skills inject into system prompt as "Proven tool sequences for similar tasks"
13
+ // - Skills can compose: a complex skill can reference simpler sub-skills
14
+ import { homedir } from 'node:os';
15
+ import { join } from 'node:path';
16
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
17
+ import { rankBySimilarity } from './embeddings.js';
18
+ // ── Constants ──
19
+ const MEMORY_DIR = join(homedir(), '.kbot', 'memory');
20
+ const SKILLS_FILE = join(MEMORY_DIR, 'skills.json');
21
+ const MAX_SKILLS = 500;
22
+ const MIN_TOOLS_FOR_SKILL = 2;
23
+ const SIMILARITY_MERGE_THRESHOLD = 0.85;
24
+ const MAX_SOURCE_MESSAGES = 5;
25
+ // ── State ──
26
+ let library = null;
27
+ let dirty = false;
28
+ let saveTimer = null;
29
+ // ── Persistence ──
30
+ function ensureDir() {
31
+ if (!existsSync(MEMORY_DIR))
32
+ mkdirSync(MEMORY_DIR, { recursive: true });
33
+ }
34
+ function loadLibrary() {
35
+ if (library)
36
+ return library;
37
+ ensureDir();
38
+ if (existsSync(SKILLS_FILE)) {
39
+ try {
40
+ const data = JSON.parse(readFileSync(SKILLS_FILE, 'utf-8'));
41
+ if (data && Array.isArray(data.skills)) {
42
+ library = data;
43
+ // Ensure vocabulary exists (migration)
44
+ if (!library.vocabulary)
45
+ library.vocabulary = [];
46
+ return library;
47
+ }
48
+ }
49
+ catch { /* corrupted — start fresh */ }
50
+ }
51
+ library = { version: 1, skills: [], vocabulary: [] };
52
+ return library;
53
+ }
54
+ function scheduleSave() {
55
+ dirty = true;
56
+ if (saveTimer)
57
+ clearTimeout(saveTimer);
58
+ saveTimer = setTimeout(() => {
59
+ if (dirty && library) {
60
+ ensureDir();
61
+ try {
62
+ writeFileSync(SKILLS_FILE, JSON.stringify(library, null, 2));
63
+ }
64
+ catch { /* non-critical */ }
65
+ dirty = false;
66
+ }
67
+ }, 1000);
68
+ }
69
+ /** Force-save immediately (call on exit) */
70
+ export function flushSkillLibrary() {
71
+ if (saveTimer)
72
+ clearTimeout(saveTimer);
73
+ if (dirty && library) {
74
+ ensureDir();
75
+ try {
76
+ writeFileSync(SKILLS_FILE, JSON.stringify(library, null, 2));
77
+ }
78
+ catch { /* non-critical */ }
79
+ dirty = false;
80
+ }
81
+ }
82
+ // ── Bag-of-Words Embedding (local, no API) ──
83
+ /** Stopwords to exclude from embeddings */
84
+ const STOPWORDS = new Set([
85
+ 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
86
+ 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
87
+ 'should', 'may', 'might', 'shall', 'can', 'need', 'dare', 'ought',
88
+ 'used', 'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from',
89
+ 'as', 'into', 'through', 'during', 'before', 'after', 'above', 'below',
90
+ 'between', 'out', 'off', 'over', 'under', 'again', 'further', 'then',
91
+ 'once', 'here', 'there', 'when', 'where', 'why', 'how', 'all', 'each',
92
+ 'every', 'both', 'few', 'more', 'most', 'other', 'some', 'such', 'no',
93
+ 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very',
94
+ 'just', 'because', 'but', 'and', 'or', 'if', 'while', 'although',
95
+ 'this', 'that', 'these', 'those', 'i', 'me', 'my', 'we', 'our', 'you',
96
+ 'your', 'he', 'him', 'his', 'she', 'her', 'it', 'its', 'they', 'them',
97
+ 'what', 'which', 'who', 'whom', 'this', 'that', 'am', 'about', 'up',
98
+ ]);
99
+ /** Tokenize text into meaningful words */
100
+ function tokenize(text) {
101
+ return text
102
+ .toLowerCase()
103
+ .replace(/[^a-z0-9_\-./]/g, ' ')
104
+ .split(/\s+/)
105
+ .filter(w => w.length > 1 && !STOPWORDS.has(w));
106
+ }
107
+ /** Build/update vocabulary and return bag-of-words vector for text */
108
+ function computeEmbedding(text, toolNames) {
109
+ const lib = loadLibrary();
110
+ const tokens = tokenize(text);
111
+ // Include tool names as high-signal tokens
112
+ const allTokens = [...tokens, ...toolNames.map(t => t.toLowerCase())];
113
+ // Expand vocabulary with new tokens
114
+ const vocabSet = new Set(lib.vocabulary);
115
+ for (const token of allTokens) {
116
+ if (!vocabSet.has(token)) {
117
+ vocabSet.add(token);
118
+ lib.vocabulary.push(token);
119
+ }
120
+ }
121
+ // Build vector (TF — term frequency normalized)
122
+ const vector = new Array(lib.vocabulary.length).fill(0);
123
+ const tokenFreq = new Map();
124
+ for (const t of allTokens) {
125
+ tokenFreq.set(t, (tokenFreq.get(t) || 0) + 1);
126
+ }
127
+ for (const [token, freq] of tokenFreq) {
128
+ const idx = lib.vocabulary.indexOf(token);
129
+ if (idx >= 0) {
130
+ vector[idx] = freq / allTokens.length;
131
+ }
132
+ }
133
+ return vector;
134
+ }
135
+ /** Cosine similarity between two vectors (handles different lengths by zero-padding) */
136
+ function cosineSim(a, b) {
137
+ const len = Math.max(a.length, b.length);
138
+ if (len === 0)
139
+ return 0;
140
+ let dotProduct = 0;
141
+ let normA = 0;
142
+ let normB = 0;
143
+ for (let i = 0; i < len; i++) {
144
+ const va = i < a.length ? a[i] : 0;
145
+ const vb = i < b.length ? b[i] : 0;
146
+ dotProduct += va * vb;
147
+ normA += va * va;
148
+ normB += vb * vb;
149
+ }
150
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
151
+ return denom === 0 ? 0 : dotProduct / denom;
152
+ }
153
+ // ── Skill Name Generation ──
154
+ /** Generate a readable skill name from message + tools */
155
+ function generateSkillName(message, toolNames) {
156
+ // Extract key action words from the message
157
+ const actionWords = tokenize(message)
158
+ .filter(w => w.length > 2)
159
+ .slice(0, 3);
160
+ // Combine with main tool names
161
+ const mainTools = toolNames.slice(0, 2).map(t => t.replace(/_/g, '-'));
162
+ const parts = [...actionWords, ...mainTools].slice(0, 4);
163
+ return parts.join('-') || `skill-${Date.now().toString(36)}`;
164
+ }
165
+ /** Generate a description from message + tool sequence */
166
+ function generateDescription(message, toolNames) {
167
+ const truncMsg = message.length > 120 ? message.slice(0, 120) + '...' : message;
168
+ return `${truncMsg} [tools: ${toolNames.join(' → ')}]`;
169
+ }
170
+ // ── Core API ──
171
+ /**
172
+ * Distill a skill from a successful tool execution.
173
+ * Called after every successful agent response with 2+ tool calls.
174
+ */
175
+ export function distillSkill(message, toolSequence, success) {
176
+ if (!success)
177
+ return null;
178
+ if (toolSequence.length < MIN_TOOLS_FOR_SKILL)
179
+ return null;
180
+ const lib = loadLibrary();
181
+ const toolNames = toolSequence.map(t => t.name);
182
+ const embedding = computeEmbedding(message, toolNames);
183
+ // Check if a similar skill already exists (merge instead of duplicate)
184
+ const existing = findSimilarSkill(embedding, toolNames);
185
+ if (existing) {
186
+ // Merge: increment success count, update timestamp, add source message
187
+ existing.successCount++;
188
+ existing.lastUsed = Date.now();
189
+ if (existing.sourceMessages.length < MAX_SOURCE_MESSAGES) {
190
+ const truncMsg = message.slice(0, 200);
191
+ if (!existing.sourceMessages.includes(truncMsg)) {
192
+ existing.sourceMessages.push(truncMsg);
193
+ }
194
+ }
195
+ // Merge any new tags
196
+ const newTags = tokenize(message).filter(t => !existing.tags.includes(t)).slice(0, 10);
197
+ existing.tags.push(...newTags);
198
+ existing.tags = existing.tags.slice(0, 30);
199
+ // Update embedding (moving average to incorporate new context)
200
+ existing.embedding = blendEmbeddings(existing.embedding, embedding, 0.8);
201
+ scheduleSave();
202
+ return existing;
203
+ }
204
+ // Create new skill
205
+ const steps = toolSequence.map(t => ({
206
+ tool: t.name,
207
+ argsTemplate: sanitizeArgs(t.args),
208
+ }));
209
+ const skill = {
210
+ id: `sk_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`,
211
+ name: generateSkillName(message, toolNames),
212
+ description: generateDescription(message, toolNames),
213
+ steps,
214
+ embedding,
215
+ successCount: 1,
216
+ failureCount: 0,
217
+ lastUsed: Date.now(),
218
+ created: Date.now(),
219
+ sourceMessages: [message.slice(0, 200)],
220
+ tags: tokenize(message).slice(0, 20),
221
+ };
222
+ // Check if this skill composes existing simpler skills
223
+ const subSkills = findComposableSubSkills(toolNames);
224
+ if (subSkills.length > 0) {
225
+ skill.composedOf = subSkills.map(s => s.id);
226
+ }
227
+ lib.skills.push(skill);
228
+ // Enforce max size
229
+ if (lib.skills.length > MAX_SKILLS) {
230
+ pruneSkillLibrary();
231
+ }
232
+ scheduleSave();
233
+ return skill;
234
+ }
235
+ /**
236
+ * Retrieve relevant skills for a given task message.
237
+ * Uses embedding similarity (Ollama if available, else bag-of-words).
238
+ */
239
+ export async function retrieveSkills(message, maxResults = 3) {
240
+ const lib = loadLibrary();
241
+ if (lib.skills.length === 0)
242
+ return [];
243
+ // Strategy 1: Try Ollama embeddings via the existing embeddings.ts infrastructure
244
+ const candidates = lib.skills.map(s => ({
245
+ text: s.description,
246
+ id: s.id,
247
+ }));
248
+ const ranked = await rankBySimilarity(message, candidates, maxResults * 2);
249
+ if (ranked.length > 0 && ranked[0].score > 0.3) {
250
+ return ranked
251
+ .filter(r => r.score > 0.3)
252
+ .slice(0, maxResults)
253
+ .map(r => lib.skills.find(s => s.id === r.id))
254
+ .filter(Boolean);
255
+ }
256
+ // Strategy 2: Fall back to local bag-of-words embedding
257
+ const toolNames = extractToolHints(message);
258
+ const queryEmbedding = computeEmbedding(message, toolNames);
259
+ const scored = lib.skills.map(skill => ({
260
+ skill,
261
+ score: cosineSim(queryEmbedding, skill.embedding),
262
+ }));
263
+ // Boost by success count (more proven = better)
264
+ for (const item of scored) {
265
+ const successBoost = Math.min(item.skill.successCount * 0.02, 0.2);
266
+ // Recency boost — skills used recently are more relevant
267
+ const daysSinceUse = (Date.now() - item.skill.lastUsed) / (1000 * 60 * 60 * 24);
268
+ const recencyBoost = daysSinceUse < 7 ? 0.05 : 0;
269
+ item.score += successBoost + recencyBoost;
270
+ }
271
+ return scored
272
+ .filter(s => s.score > 0.15)
273
+ .sort((a, b) => b.score - a.score)
274
+ .slice(0, maxResults)
275
+ .map(s => s.skill);
276
+ }
277
+ /**
278
+ * Format retrieved skills for injection into the system prompt.
279
+ */
280
+ export function formatSkillsForPrompt(skills) {
281
+ if (skills.length === 0)
282
+ return '';
283
+ const formatted = skills.map((skill, i) => {
284
+ const steps = skill.steps
285
+ .map((s, j) => ` ${j + 1}. ${s.tool}(${summarizeArgs(s.argsTemplate)})`)
286
+ .join('\n');
287
+ const reliability = skill.successCount > 0
288
+ ? `${skill.successCount}x proven`
289
+ : 'new';
290
+ const composed = skill.composedOf && skill.composedOf.length > 0
291
+ ? ` (composes ${skill.composedOf.length} sub-skills)`
292
+ : '';
293
+ return `${i + 1}. **${skill.name}** — ${reliability}${composed}\n${steps}`;
294
+ }).join('\n\n');
295
+ return `\n\n[Proven Skill Library — tool sequences that worked for similar tasks]\n${formatted}\n\nUse these proven sequences as starting points. Adapt arguments to the current task.`;
296
+ }
297
+ /**
298
+ * Return the full skill library.
299
+ */
300
+ export function getSkillLibrary() {
301
+ return loadLibrary();
302
+ }
303
+ /**
304
+ * Prune the skill library: remove low-success skills, keep top 500.
305
+ * Sorting priority: successCount desc, then lastUsed desc.
306
+ */
307
+ export function pruneSkillLibrary() {
308
+ const lib = loadLibrary();
309
+ // Remove skills that have never succeeded and are old
310
+ const now = Date.now();
311
+ const oneWeekMs = 7 * 24 * 60 * 60 * 1000;
312
+ lib.skills = lib.skills.filter(s => {
313
+ // Keep skills that have at least 1 success
314
+ if (s.successCount > 0)
315
+ return true;
316
+ // Keep recent skills (less than a week old) even if untested
317
+ if (now - s.created < oneWeekMs)
318
+ return true;
319
+ return false;
320
+ });
321
+ // Sort: success count * recency weight
322
+ lib.skills.sort((a, b) => {
323
+ const scoreA = a.successCount * (1 + 1 / (1 + (now - a.lastUsed) / oneWeekMs));
324
+ const scoreB = b.successCount * (1 + 1 / (1 + (now - b.lastUsed) / oneWeekMs));
325
+ return scoreB - scoreA;
326
+ });
327
+ // Trim to MAX_SKILLS
328
+ if (lib.skills.length > MAX_SKILLS) {
329
+ lib.skills = lib.skills.slice(0, MAX_SKILLS);
330
+ }
331
+ // Compact vocabulary — remove words not referenced by any skill
332
+ compactVocabulary();
333
+ scheduleSave();
334
+ }
335
+ /**
336
+ * Record a failure for a skill (called when a retrieved skill's tool chain fails).
337
+ */
338
+ export function recordSkillFailure(skillId) {
339
+ const lib = loadLibrary();
340
+ const skill = lib.skills.find(s => s.id === skillId);
341
+ if (skill) {
342
+ skill.failureCount++;
343
+ scheduleSave();
344
+ }
345
+ }
346
+ // ── Internal Helpers ──
347
+ /** Find an existing skill similar enough to merge with */
348
+ function findSimilarSkill(embedding, toolNames) {
349
+ const lib = loadLibrary();
350
+ for (const skill of lib.skills) {
351
+ // First check: same tool sequence (fast path)
352
+ const existingTools = skill.steps.map(s => s.tool);
353
+ if (existingTools.length === toolNames.length &&
354
+ existingTools.every((t, i) => t === toolNames[i])) {
355
+ return skill;
356
+ }
357
+ // Second check: embedding similarity
358
+ const sim = cosineSim(embedding, skill.embedding);
359
+ if (sim >= SIMILARITY_MERGE_THRESHOLD) {
360
+ return skill;
361
+ }
362
+ }
363
+ return null;
364
+ }
365
+ /** Find sub-skills whose tool sequence is a subsequence of the given tools */
366
+ function findComposableSubSkills(toolNames) {
367
+ const lib = loadLibrary();
368
+ const subSkills = [];
369
+ for (const skill of lib.skills) {
370
+ const skillTools = skill.steps.map(s => s.tool);
371
+ if (skillTools.length >= toolNames.length)
372
+ continue;
373
+ if (skillTools.length < 2)
374
+ continue;
375
+ // Check if skillTools is a contiguous subsequence of toolNames
376
+ const joined = toolNames.join(',');
377
+ const subJoined = skillTools.join(',');
378
+ if (joined.includes(subJoined)) {
379
+ subSkills.push(skill);
380
+ }
381
+ }
382
+ return subSkills;
383
+ }
384
+ /** Blend two embeddings with a weight towards the existing one */
385
+ function blendEmbeddings(existing, newVec, existingWeight) {
386
+ const len = Math.max(existing.length, newVec.length);
387
+ const blended = new Array(len).fill(0);
388
+ const newWeight = 1 - existingWeight;
389
+ for (let i = 0; i < len; i++) {
390
+ const e = i < existing.length ? existing[i] : 0;
391
+ const n = i < newVec.length ? newVec[i] : 0;
392
+ blended[i] = e * existingWeight + n * newWeight;
393
+ }
394
+ return blended;
395
+ }
396
+ /** Sanitize tool args for template storage — remove large values, keep structure */
397
+ function sanitizeArgs(args) {
398
+ const clean = {};
399
+ for (const [key, value] of Object.entries(args)) {
400
+ if (typeof value === 'string' && value.length > 200) {
401
+ clean[key] = '<content>';
402
+ }
403
+ else if (typeof value === 'object' && value !== null) {
404
+ clean[key] = '<object>';
405
+ }
406
+ else {
407
+ clean[key] = value;
408
+ }
409
+ }
410
+ return clean;
411
+ }
412
+ /** Summarize args for display */
413
+ function summarizeArgs(args) {
414
+ const parts = Object.entries(args)
415
+ .map(([k, v]) => {
416
+ const val = typeof v === 'string' && v.length > 30 ? v.slice(0, 30) + '...' : String(v);
417
+ return `${k}: ${val}`;
418
+ })
419
+ .slice(0, 3);
420
+ return parts.join(', ');
421
+ }
422
+ /** Extract tool name hints from a message (for better embedding) */
423
+ function extractToolHints(message) {
424
+ const lower = message.toLowerCase();
425
+ const hints = [];
426
+ const toolKeywords = {
427
+ 'read': 'read_file', 'write': 'write_file', 'create file': 'write_file',
428
+ 'search': 'grep', 'find': 'grep', 'grep': 'grep',
429
+ 'git': 'git_status', 'commit': 'git_commit', 'diff': 'git_diff',
430
+ 'run': 'bash', 'execute': 'bash', 'command': 'bash', 'shell': 'bash',
431
+ 'build': 'bash', 'test': 'bash', 'install': 'bash',
432
+ 'web': 'web_search', 'fetch': 'url_fetch', 'download': 'url_fetch',
433
+ 'list': 'list_directory', 'ls': 'list_directory', 'dir': 'list_directory',
434
+ };
435
+ for (const [keyword, tool] of Object.entries(toolKeywords)) {
436
+ if (lower.includes(keyword))
437
+ hints.push(tool);
438
+ }
439
+ return [...new Set(hints)];
440
+ }
441
+ /** Compact vocabulary by removing words not used by any skill */
442
+ function compactVocabulary() {
443
+ const lib = loadLibrary();
444
+ if (lib.vocabulary.length < 1000)
445
+ return; // only compact when it's large
446
+ // Find all vocabulary indices actually used
447
+ const usedIndices = new Set();
448
+ for (const skill of lib.skills) {
449
+ for (let i = 0; i < skill.embedding.length; i++) {
450
+ if (skill.embedding[i] > 0)
451
+ usedIndices.add(i);
452
+ }
453
+ }
454
+ // Build new compact vocabulary + remap embeddings
455
+ const oldToNew = new Map();
456
+ const newVocab = [];
457
+ for (const oldIdx of [...usedIndices].sort((a, b) => a - b)) {
458
+ if (oldIdx < lib.vocabulary.length) {
459
+ oldToNew.set(oldIdx, newVocab.length);
460
+ newVocab.push(lib.vocabulary[oldIdx]);
461
+ }
462
+ }
463
+ // Remap all skill embeddings
464
+ for (const skill of lib.skills) {
465
+ const newEmb = new Array(newVocab.length).fill(0);
466
+ for (let i = 0; i < skill.embedding.length; i++) {
467
+ if (skill.embedding[i] > 0 && oldToNew.has(i)) {
468
+ newEmb[oldToNew.get(i)] = skill.embedding[i];
469
+ }
470
+ }
471
+ skill.embedding = newEmb;
472
+ }
473
+ lib.vocabulary = newVocab;
474
+ }
475
+ //# sourceMappingURL=skill-library.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-library.js","sourceRoot":"","sources":["../src/skill-library.ts"],"names":[],"mappings":"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"}
package/dist/spec.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import { type AgentOptions, type AgentResponse } from './agent.js';
2
+ export interface SpecOptions {
3
+ /** Override the default architect agent */
4
+ agent?: string;
5
+ /** Custom output path for the spec file */
6
+ output?: string;
7
+ /** After generating the spec, pass it to the coder agent for implementation */
8
+ implement?: boolean;
9
+ /** Base agent options (model, stream, etc.) */
10
+ agentOpts?: AgentOptions;
11
+ }
12
+ export interface SpecResult {
13
+ /** The generated spec markdown content */
14
+ spec: string;
15
+ /** Path where the spec was saved */
16
+ path: string;
17
+ /** The agent that generated the spec */
18
+ agent: string;
19
+ /** If --implement was used, the implementation response */
20
+ implementation?: AgentResponse;
21
+ }
22
+ export declare function generateSpec(description: string, options?: SpecOptions): Promise<SpecResult>;
23
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../src/spec.ts"],"names":[],"mappings":"AAWA,OAAO,EAAY,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAwE5E,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+EAA+E;IAC/E,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,YAAY,CAAA;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,2DAA2D;IAC3D,cAAc,CAAC,EAAE,aAAa,CAAA;CAC/B;AAED,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CAqHrB"}