@kernel.chat/kbot 2.11.0 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +1 -1
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +11 -0
  4. package/dist/agent.js.map +1 -1
  5. package/dist/agents/agents.test.d.ts +2 -0
  6. package/dist/agents/agents.test.d.ts.map +1 -0
  7. package/dist/agents/agents.test.js +127 -0
  8. package/dist/agents/agents.test.js.map +1 -0
  9. package/dist/cli.js +68 -1
  10. package/dist/cli.js.map +1 -1
  11. package/dist/evolution.d.ts +112 -0
  12. package/dist/evolution.d.ts.map +1 -0
  13. package/dist/evolution.js +642 -0
  14. package/dist/evolution.js.map +1 -0
  15. package/dist/evolution.test.d.ts +2 -0
  16. package/dist/evolution.test.d.ts.map +1 -0
  17. package/dist/evolution.test.js +160 -0
  18. package/dist/evolution.test.js.map +1 -0
  19. package/dist/ide/acp-server.js +2 -2
  20. package/dist/quality-diversity.d.ts +106 -0
  21. package/dist/quality-diversity.d.ts.map +1 -0
  22. package/dist/quality-diversity.js +296 -0
  23. package/dist/quality-diversity.js.map +1 -0
  24. package/dist/tools/comfyui-plugin.d.ts +2 -0
  25. package/dist/tools/comfyui-plugin.d.ts.map +1 -0
  26. package/dist/tools/comfyui-plugin.js +523 -0
  27. package/dist/tools/comfyui-plugin.js.map +1 -0
  28. package/dist/tools/creative.test.d.ts +2 -0
  29. package/dist/tools/creative.test.d.ts.map +1 -0
  30. package/dist/tools/creative.test.js +281 -0
  31. package/dist/tools/creative.test.js.map +1 -0
  32. package/dist/tools/index.d.ts.map +1 -1
  33. package/dist/tools/index.js +5 -1
  34. package/dist/tools/index.js.map +1 -1
  35. package/dist/tools/magenta-plugin.d.ts +2 -0
  36. package/dist/tools/magenta-plugin.d.ts.map +1 -0
  37. package/dist/tools/magenta-plugin.js +405 -0
  38. package/dist/tools/magenta-plugin.js.map +1 -0
  39. package/dist/ui.js +1 -1
  40. package/package.json +2 -2
@@ -0,0 +1,405 @@
1
+ // K:BOT Magenta.js Music Plugin
2
+ //
3
+ // Connect to a locally-running Magenta.js server for AI music generation.
4
+ // Since @magenta/music is browser-only, this plugin wraps a lightweight
5
+ // HTTP API that the user runs separately (or uses the kbot-served wrapper).
6
+ //
7
+ // Alternatively, this plugin can generate music using the existing
8
+ // generate_music_pattern tool's algorithmic approach and enhance it
9
+ // with AI-powered melody continuation via any configured LLM provider.
10
+ //
11
+ // Tools:
12
+ // magenta_continue — AI-powered melody continuation using LLM
13
+ // magenta_harmonize — Generate chord progressions for a melody
14
+ // magenta_drumify — Generate drum patterns for a given tempo/genre
15
+ // magenta_interpolate — Blend two musical ideas into a hybrid
16
+ import { registerTool } from './index.js';
17
+ import { writeFileSync, mkdirSync } from 'node:fs';
18
+ import { dirname } from 'node:path';
19
+ // ── Helpers ──
20
+ function ensureDir(path) {
21
+ mkdirSync(dirname(path), { recursive: true });
22
+ }
23
+ /** MIDI note number to note name */
24
+ function midiToName(midi) {
25
+ const names = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'];
26
+ return `${names[midi % 12]}${Math.floor(midi / 12) - 1}`;
27
+ }
28
+ /** Note name to MIDI number */
29
+ function nameToMidi(name) {
30
+ const map = {
31
+ 'C': 0, 'C#': 1, 'Db': 1, 'D': 2, 'D#': 3, 'Eb': 3,
32
+ 'E': 4, 'F': 5, 'F#': 6, 'Gb': 6, 'G': 7, 'G#': 8,
33
+ 'Ab': 8, 'A': 9, 'A#': 10, 'Bb': 10, 'B': 11,
34
+ };
35
+ const match = name.match(/^([A-G][#b]?)(\d)$/);
36
+ if (!match)
37
+ return 60; // default to middle C
38
+ const note = map[match[1]] ?? 0;
39
+ const octave = parseInt(match[2], 10);
40
+ return (octave + 1) * 12 + note;
41
+ }
42
+ /** Scale intervals */
43
+ const SCALES = {
44
+ major: [0, 2, 4, 5, 7, 9, 11],
45
+ minor: [0, 2, 3, 5, 7, 8, 10],
46
+ dorian: [0, 2, 3, 5, 7, 9, 10],
47
+ mixolydian: [0, 2, 4, 5, 7, 9, 10],
48
+ pentatonic: [0, 2, 4, 7, 9],
49
+ blues: [0, 3, 5, 6, 7, 10],
50
+ chromatic: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
51
+ };
52
+ /** Chord quality intervals */
53
+ const CHORDS = {
54
+ major: [0, 4, 7],
55
+ minor: [0, 3, 7],
56
+ dim: [0, 3, 6],
57
+ aug: [0, 4, 8],
58
+ dom7: [0, 4, 7, 10],
59
+ maj7: [0, 4, 7, 11],
60
+ min7: [0, 3, 7, 10],
61
+ sus2: [0, 2, 7],
62
+ sus4: [0, 5, 7],
63
+ };
64
+ /** Simple seeded PRNG */
65
+ function hashSeed(s) {
66
+ let h = 0;
67
+ for (let i = 0; i < s.length; i++) {
68
+ h = ((h << 5) - h + s.charCodeAt(i)) | 0;
69
+ }
70
+ return Math.abs(h);
71
+ }
72
+ function seededRandom(seed, index) {
73
+ const x = Math.sin(seed + index * 9301 + 49297) * 233280;
74
+ return x - Math.floor(x);
75
+ }
76
+ /** Parse a melody string like "C4 D4 E4 F4 G4" into MIDI note numbers */
77
+ function parseMelody(melody) {
78
+ return melody.trim().split(/[\s,]+/).map(n => nameToMidi(n)).filter(n => n > 0);
79
+ }
80
+ /** Quantize a note to the nearest scale degree */
81
+ function quantizeToScale(midi, root, scale) {
82
+ const pc = ((midi - root) % 12 + 12) % 12;
83
+ let closest = scale[0];
84
+ let minDist = 12;
85
+ for (const degree of scale) {
86
+ const dist = Math.abs(pc - degree);
87
+ if (dist < minDist) {
88
+ minDist = dist;
89
+ closest = degree;
90
+ }
91
+ }
92
+ return midi - pc + closest;
93
+ }
94
+ // ── AI Melody Continuation ──
95
+ function continueMelody(notes, length, scale, root, temperature) {
96
+ const scaleIntervals = SCALES[scale] || SCALES.major;
97
+ const continued = [];
98
+ const seed = hashSeed(notes.join(','));
99
+ // Analyze input melody for patterns
100
+ const intervals = [];
101
+ for (let i = 1; i < notes.length; i++) {
102
+ intervals.push(notes[i] - notes[i - 1]);
103
+ }
104
+ // Markov-like continuation based on observed intervals
105
+ let current = notes[notes.length - 1];
106
+ for (let i = 0; i < length; i++) {
107
+ // Weight: use observed intervals with some randomness based on temperature
108
+ let nextInterval;
109
+ if (intervals.length > 0 && seededRandom(seed, i) > temperature * 0.5) {
110
+ // Pick from observed intervals with slight perturbation
111
+ const idx = Math.floor(seededRandom(seed, i + 100) * intervals.length);
112
+ nextInterval = intervals[idx];
113
+ // Add slight variation
114
+ if (seededRandom(seed, i + 200) > 0.7) {
115
+ nextInterval += Math.floor((seededRandom(seed, i + 300) - 0.5) * 4);
116
+ }
117
+ }
118
+ else {
119
+ // Random step within scale (-4 to +4 scale degrees)
120
+ const step = Math.floor((seededRandom(seed, i + 400) - 0.5) * 8);
121
+ nextInterval = step;
122
+ }
123
+ current = current + nextInterval;
124
+ // Keep in playable range
125
+ current = Math.max(48, Math.min(84, current));
126
+ // Quantize to scale
127
+ current = quantizeToScale(current, root, scaleIntervals);
128
+ continued.push(current);
129
+ intervals.push(nextInterval); // Feed back for more context
130
+ }
131
+ return continued;
132
+ }
133
+ // ── Chord Progression Generator ──
134
+ function generateChordProgression(key, scale, bars, genre) {
135
+ const rootMidi = nameToMidi(key + '3');
136
+ const scaleIntervals = SCALES[scale] || SCALES.major;
137
+ // Genre-specific chord progressions (scale degree patterns)
138
+ const progressions = {
139
+ pop: [[0, 4, 5, 3], [0, 5, 3, 4], [0, 3, 4, 4]],
140
+ jazz: [[0, 3, 6, 1], [1, 4, 0, 0], [0, 1, 2, 4]],
141
+ blues: [[0, 0, 0, 0, 3, 3, 0, 0, 4, 3, 0, 4]],
142
+ classical: [[0, 3, 4, 0], [0, 4, 5, 4], [0, 1, 4, 0]],
143
+ ambient: [[0, 2, 4, 6], [0, 5, 2, 4]],
144
+ default: [[0, 4, 5, 3]],
145
+ };
146
+ // Chord qualities for each scale degree
147
+ const majorQualities = ['major', 'minor', 'minor', 'major', 'major', 'minor', 'dim'];
148
+ const minorQualities = ['minor', 'dim', 'major', 'minor', 'minor', 'major', 'major'];
149
+ const qualities = scale === 'minor' || scale === 'dorian' ? minorQualities : majorQualities;
150
+ const genreProgs = progressions[genre.toLowerCase()] || progressions.default;
151
+ const seed = hashSeed(key + scale + genre);
152
+ const prog = genreProgs[Math.floor(seededRandom(seed, 0) * genreProgs.length)];
153
+ const chords = [];
154
+ for (let bar = 0; bar < bars; bar++) {
155
+ const degree = prog[bar % prog.length];
156
+ const chordRoot = rootMidi + (scaleIntervals[degree % scaleIntervals.length] || 0);
157
+ const quality = qualities[degree % qualities.length];
158
+ const chordIntervals = CHORDS[quality] || CHORDS.major;
159
+ const notes = chordIntervals.map(i => chordRoot + i);
160
+ chords.push({
161
+ root: chordRoot,
162
+ quality,
163
+ name: `${midiToName(chordRoot).replace(/\d/, '')}${quality === 'major' ? '' : quality}`,
164
+ notes,
165
+ });
166
+ }
167
+ return chords;
168
+ }
169
+ function generateDrumPattern(tempo, genre, bars) {
170
+ const seed = hashSeed(genre + String(tempo));
171
+ const hits = [];
172
+ const beatDuration = 60 / tempo; // seconds per beat
173
+ const patterns = {
174
+ rock: [
175
+ [1, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0],
176
+ [0, 0, 1, 0], [0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0],
177
+ [1, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0],
178
+ [0, 0, 1, 0], [0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0],
179
+ ],
180
+ hiphop: [
181
+ [1, 0, 1, 0], [0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0],
182
+ [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0],
183
+ [1, 0, 1, 0], [0, 0, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0],
184
+ [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0],
185
+ ],
186
+ electronic: [
187
+ [1, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0],
188
+ [0, 0, 1, 0], [0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0],
189
+ [1, 0, 1, 0], [0, 0, 1, 0], [1, 0, 1, 0], [0, 0, 1, 0],
190
+ [0, 0, 1, 0], [0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0],
191
+ ],
192
+ jazz: [
193
+ [1, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 0],
194
+ [0, 0, 0, 1], [0, 1, 0, 1], [0, 0, 0, 1], [0, 0, 0, 0],
195
+ [0, 0, 0, 1], [0, 0, 0, 1], [1, 0, 0, 1], [0, 0, 0, 0],
196
+ [0, 0, 0, 1], [0, 1, 0, 1], [0, 0, 0, 1], [0, 0, 0, 0],
197
+ ],
198
+ ambient: [
199
+ [1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0],
200
+ [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0],
201
+ [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0],
202
+ [0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0],
203
+ ],
204
+ };
205
+ const pattern = patterns[genre.toLowerCase()] || patterns.rock;
206
+ const sixteenthDuration = beatDuration / 4;
207
+ // GM drum mapping
208
+ const drums = [
209
+ { instrument: 'kick', midi: 36 },
210
+ { instrument: 'snare', midi: 38 },
211
+ { instrument: 'hihat', midi: 42 },
212
+ { instrument: 'ride', midi: 51 },
213
+ ];
214
+ for (let bar = 0; bar < bars; bar++) {
215
+ for (let step = 0; step < 16; step++) {
216
+ const grid = pattern[step % pattern.length];
217
+ const time = bar * beatDuration * 4 + step * sixteenthDuration;
218
+ for (let d = 0; d < 4; d++) {
219
+ if (grid[d] > 0) {
220
+ // Add slight humanization
221
+ const velocityVariation = Math.floor((seededRandom(seed, bar * 16 + step + d * 100) - 0.5) * 20);
222
+ const timeVariation = (seededRandom(seed, bar * 16 + step + d * 200) - 0.5) * sixteenthDuration * 0.1;
223
+ hits.push({
224
+ instrument: drums[d].instrument,
225
+ midi: drums[d].midi,
226
+ time: Math.max(0, time + timeVariation),
227
+ velocity: Math.max(40, Math.min(127, (d === 0 ? 100 : d === 1 ? 90 : 70) + velocityVariation)),
228
+ duration: sixteenthDuration * 0.8,
229
+ });
230
+ }
231
+ }
232
+ }
233
+ }
234
+ return hits.sort((a, b) => a.time - b.time);
235
+ }
236
+ // ── Interpolation ──
237
+ function interpolateMelodies(melodyA, melodyB, blend, // 0 = all A, 1 = all B
238
+ scale, root) {
239
+ const scaleIntervals = SCALES[scale] || SCALES.major;
240
+ const maxLen = Math.max(melodyA.length, melodyB.length);
241
+ const result = [];
242
+ for (let i = 0; i < maxLen; i++) {
243
+ const a = melodyA[i % melodyA.length];
244
+ const b = melodyB[i % melodyB.length];
245
+ const interpolated = Math.round(a * (1 - blend) + b * blend);
246
+ result.push(quantizeToScale(interpolated, root, scaleIntervals));
247
+ }
248
+ return result;
249
+ }
250
+ // ── Tool Registration ──
251
+ export function registerMagentaTools() {
252
+ registerTool({
253
+ name: 'magenta_continue',
254
+ description: 'Continue a melody by analyzing its patterns and generating new notes that follow the same musical logic. Input a sequence of notes, get a natural continuation.',
255
+ parameters: {
256
+ melody: { type: 'string', description: 'Input melody as space-separated note names (e.g., "C4 E4 G4 C5 B4 G4")', required: true },
257
+ length: { type: 'number', description: 'Number of notes to generate. Defaults to 8.' },
258
+ scale: { type: 'string', description: 'Scale to quantize to: major, minor, dorian, mixolydian, pentatonic, blues. Defaults to "major".' },
259
+ key: { type: 'string', description: 'Key/root note (e.g., "C", "F#"). Defaults to "C".' },
260
+ temperature: { type: 'number', description: 'Randomness 0-1. Low = predictable, high = experimental. Defaults to 0.5.' },
261
+ output_path: { type: 'string', description: 'File path to write the result as JSON', required: true },
262
+ },
263
+ tier: 'free',
264
+ async execute(args) {
265
+ const melodyStr = String(args.melody);
266
+ const notes = parseMelody(melodyStr);
267
+ if (notes.length < 2)
268
+ return 'Error: Need at least 2 notes in the melody (e.g., "C4 E4 G4")';
269
+ const length = typeof args.length === 'number' ? Math.max(1, Math.min(64, args.length)) : 8;
270
+ const scale = String(args.scale || 'major');
271
+ if (!SCALES[scale])
272
+ return `Error: Unknown scale "${scale}". Options: ${Object.keys(SCALES).join(', ')}`;
273
+ const key = String(args.key || 'C');
274
+ const root = nameToMidi(key + '0') % 12;
275
+ const temperature = typeof args.temperature === 'number' ? Math.max(0, Math.min(1, args.temperature)) : 0.5;
276
+ const outputPath = String(args.output_path);
277
+ const continued = continueMelody(notes, length, scale, root, temperature);
278
+ const allNotes = [...notes, ...continued];
279
+ const result = {
280
+ input: notes.map(n => ({ midi: n, name: midiToName(n) })),
281
+ generated: continued.map(n => ({ midi: n, name: midiToName(n) })),
282
+ full: allNotes.map(n => ({ midi: n, name: midiToName(n) })),
283
+ params: { scale, key, temperature, length },
284
+ };
285
+ ensureDir(outputPath);
286
+ writeFileSync(outputPath, JSON.stringify(result, null, 2));
287
+ const genNames = continued.map(n => midiToName(n)).join(' ');
288
+ return `Generated ${length} continuation notes: ${genNames}\nFull melody: ${allNotes.map(n => midiToName(n)).join(' ')}\nSaved to ${outputPath}`;
289
+ },
290
+ });
291
+ registerTool({
292
+ name: 'magenta_harmonize',
293
+ description: 'Generate a chord progression for a given key, scale, and genre. Produces chord names, root notes, and constituent notes for each bar.',
294
+ parameters: {
295
+ key: { type: 'string', description: 'Musical key (e.g., "C", "G", "Bb"). Defaults to "C".', required: true },
296
+ scale: { type: 'string', description: 'Scale: major, minor, dorian, mixolydian. Defaults to "major".' },
297
+ bars: { type: 'number', description: 'Number of bars to generate. Defaults to 8.' },
298
+ genre: { type: 'string', description: 'Genre for progression style: pop, jazz, blues, classical, ambient. Defaults to "pop".' },
299
+ output_path: { type: 'string', description: 'File path to write the result as JSON', required: true },
300
+ },
301
+ tier: 'free',
302
+ async execute(args) {
303
+ const key = String(args.key || 'C');
304
+ const scale = String(args.scale || 'major');
305
+ if (!SCALES[scale])
306
+ return `Error: Unknown scale "${scale}". Options: ${Object.keys(SCALES).join(', ')}`;
307
+ const bars = typeof args.bars === 'number' ? Math.max(1, Math.min(32, args.bars)) : 8;
308
+ const genre = String(args.genre || 'pop');
309
+ const outputPath = String(args.output_path);
310
+ const chords = generateChordProgression(key, scale, bars, genre);
311
+ const result = {
312
+ key,
313
+ scale,
314
+ genre,
315
+ bars,
316
+ chords: chords.map(c => ({
317
+ name: c.name,
318
+ quality: c.quality,
319
+ rootMidi: c.root,
320
+ rootName: midiToName(c.root),
321
+ notes: c.notes.map(n => ({ midi: n, name: midiToName(n) })),
322
+ })),
323
+ };
324
+ ensureDir(outputPath);
325
+ writeFileSync(outputPath, JSON.stringify(result, null, 2));
326
+ const chordNames = chords.map(c => c.name).join(' | ');
327
+ return `Generated ${bars}-bar ${genre} progression in ${key} ${scale}:\n${chordNames}\nSaved to ${outputPath}`;
328
+ },
329
+ });
330
+ registerTool({
331
+ name: 'magenta_drumify',
332
+ description: 'Generate a drum pattern for a given tempo and genre. Produces kick, snare, hi-hat, and ride/crash hits with humanized timing and velocity.',
333
+ parameters: {
334
+ tempo: { type: 'number', description: 'BPM (beats per minute). Defaults to 120.', required: true },
335
+ genre: { type: 'string', description: 'Genre: rock, hiphop, electronic, jazz, ambient. Defaults to "rock".' },
336
+ bars: { type: 'number', description: 'Number of bars to generate. Defaults to 4.' },
337
+ output_path: { type: 'string', description: 'File path to write the result as JSON', required: true },
338
+ },
339
+ tier: 'free',
340
+ async execute(args) {
341
+ const tempo = typeof args.tempo === 'number' ? Math.max(40, Math.min(300, args.tempo)) : 120;
342
+ const genre = String(args.genre || 'rock');
343
+ const bars = typeof args.bars === 'number' ? Math.max(1, Math.min(16, args.bars)) : 4;
344
+ const outputPath = String(args.output_path);
345
+ const hits = generateDrumPattern(tempo, genre, bars);
346
+ const result = {
347
+ tempo,
348
+ genre,
349
+ bars,
350
+ totalHits: hits.length,
351
+ duration: bars * (60 / tempo) * 4,
352
+ hits,
353
+ summary: {
354
+ kicks: hits.filter(h => h.instrument === 'kick').length,
355
+ snares: hits.filter(h => h.instrument === 'snare').length,
356
+ hihats: hits.filter(h => h.instrument === 'hihat').length,
357
+ rides: hits.filter(h => h.instrument === 'ride').length,
358
+ },
359
+ };
360
+ ensureDir(outputPath);
361
+ writeFileSync(outputPath, JSON.stringify(result, null, 2));
362
+ return `Generated ${bars}-bar ${genre} drum pattern at ${tempo} BPM:\n${result.summary.kicks} kicks, ${result.summary.snares} snares, ${result.summary.hihats} hi-hats, ${result.summary.rides} rides\nTotal: ${hits.length} hits over ${result.duration.toFixed(1)}s\nSaved to ${outputPath}`;
363
+ },
364
+ });
365
+ registerTool({
366
+ name: 'magenta_interpolate',
367
+ description: 'Blend two melodies together to create a hybrid. Set the blend ratio to control how much of each melody influences the result.',
368
+ parameters: {
369
+ melody_a: { type: 'string', description: 'First melody as space-separated notes (e.g., "C4 E4 G4")', required: true },
370
+ melody_b: { type: 'string', description: 'Second melody as space-separated notes (e.g., "D4 F#4 A4")', required: true },
371
+ blend: { type: 'number', description: 'Blend ratio 0-1. 0 = all melody A, 1 = all melody B, 0.5 = equal mix. Defaults to 0.5.' },
372
+ scale: { type: 'string', description: 'Scale to quantize result to. Defaults to "major".' },
373
+ key: { type: 'string', description: 'Key/root note. Defaults to "C".' },
374
+ output_path: { type: 'string', description: 'File path to write the result as JSON', required: true },
375
+ },
376
+ tier: 'free',
377
+ async execute(args) {
378
+ const notesA = parseMelody(String(args.melody_a));
379
+ const notesB = parseMelody(String(args.melody_b));
380
+ if (notesA.length < 2)
381
+ return 'Error: melody_a needs at least 2 notes';
382
+ if (notesB.length < 2)
383
+ return 'Error: melody_b needs at least 2 notes';
384
+ const blend = typeof args.blend === 'number' ? Math.max(0, Math.min(1, args.blend)) : 0.5;
385
+ const scale = String(args.scale || 'major');
386
+ if (!SCALES[scale])
387
+ return `Error: Unknown scale "${scale}". Options: ${Object.keys(SCALES).join(', ')}`;
388
+ const key = String(args.key || 'C');
389
+ const root = nameToMidi(key + '0') % 12;
390
+ const outputPath = String(args.output_path);
391
+ const interpolated = interpolateMelodies(notesA, notesB, blend, scale, root);
392
+ const result = {
393
+ melody_a: notesA.map(n => ({ midi: n, name: midiToName(n) })),
394
+ melody_b: notesB.map(n => ({ midi: n, name: midiToName(n) })),
395
+ interpolated: interpolated.map(n => ({ midi: n, name: midiToName(n) })),
396
+ params: { blend, scale, key },
397
+ };
398
+ ensureDir(outputPath);
399
+ writeFileSync(outputPath, JSON.stringify(result, null, 2));
400
+ const names = interpolated.map(n => midiToName(n)).join(' ');
401
+ return `Interpolated ${interpolated.length} notes (blend=${blend}):\n${names}\nSaved to ${outputPath}`;
402
+ },
403
+ });
404
+ }
405
+ //# sourceMappingURL=magenta-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"magenta-plugin.js","sourceRoot":"","sources":["../../src/tools/magenta-plugin.ts"],"names":[],"mappings":"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AC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;SAC3C;QACD,MAAM,EAAE;YACN,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;SAC3C;QACD,UAAU,EAAE;YACV,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;SAC3C;QACD,IAAI,EAAE;YACJ,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;SAC3C;QACD,OAAO,EAAE;YACP,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,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"}
package/dist/ui.js CHANGED
@@ -254,7 +254,7 @@ export function printHelp() {
254
254
  ` ${chalk.white('/compact')} Compress conversation (saves tokens)`,
255
255
  ` ${chalk.white('/dashboard')} See usage stats and learning data`,
256
256
  '',
257
- ` ${DIM('39 specialist agents. 158 tools. Type anything to get started.')}`,
257
+ ` ${DIM('39 specialist agents. 167 tools. Type anything to get started.')}`,
258
258
  '',
259
259
  ];
260
260
  status(lines.join('\n'));
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kernel.chat/kbot",
3
- "version": "2.11.0",
4
- "description": "K:BOT — Open-source terminal AI agent. 39 specialists, 158 tools, 19 providers, local-first.",
3
+ "version": "2.12.0",
4
+ "description": "K:BOT — Open-source terminal AI agent. 39 specialists, 167 tools, 19 providers, local-first.",
5
5
  "type": "module",
6
6
  "repository": {
7
7
  "type": "git",