@kernel.chat/kbot 3.52.0 → 3.54.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 (41) hide show
  1. package/dist/agents/replit.js +1 -1
  2. package/dist/behaviour.d.ts +30 -0
  3. package/dist/behaviour.d.ts.map +1 -0
  4. package/dist/behaviour.js +191 -0
  5. package/dist/behaviour.js.map +1 -0
  6. package/dist/bootstrap.js +1 -1
  7. package/dist/bootstrap.js.map +1 -1
  8. package/dist/integrations/ableton-m4l.d.ts +124 -0
  9. package/dist/integrations/ableton-m4l.d.ts.map +1 -0
  10. package/dist/integrations/ableton-m4l.js +338 -0
  11. package/dist/integrations/ableton-m4l.js.map +1 -0
  12. package/dist/integrations/ableton-osc.d.ts.map +1 -1
  13. package/dist/integrations/ableton-osc.js +6 -2
  14. package/dist/integrations/ableton-osc.js.map +1 -1
  15. package/dist/music-learning.d.ts +181 -0
  16. package/dist/music-learning.d.ts.map +1 -0
  17. package/dist/music-learning.js +340 -0
  18. package/dist/music-learning.js.map +1 -0
  19. package/dist/skill-system.d.ts +68 -0
  20. package/dist/skill-system.d.ts.map +1 -0
  21. package/dist/skill-system.js +386 -0
  22. package/dist/skill-system.js.map +1 -0
  23. package/dist/tools/ableton.d.ts.map +1 -1
  24. package/dist/tools/ableton.js +24 -8
  25. package/dist/tools/ableton.js.map +1 -1
  26. package/dist/tools/arrangement-engine.d.ts +2 -0
  27. package/dist/tools/arrangement-engine.d.ts.map +1 -0
  28. package/dist/tools/arrangement-engine.js +644 -0
  29. package/dist/tools/arrangement-engine.js.map +1 -0
  30. package/dist/tools/index.d.ts.map +1 -1
  31. package/dist/tools/index.js +5 -0
  32. package/dist/tools/index.js.map +1 -1
  33. package/dist/tools/producer-engine.d.ts +71 -0
  34. package/dist/tools/producer-engine.d.ts.map +1 -0
  35. package/dist/tools/producer-engine.js +1859 -0
  36. package/dist/tools/producer-engine.js.map +1 -0
  37. package/dist/tools/sound-designer.d.ts +2 -0
  38. package/dist/tools/sound-designer.d.ts.map +1 -0
  39. package/dist/tools/sound-designer.js +896 -0
  40. package/dist/tools/sound-designer.js.map +1 -0
  41. package/package.json +3 -3
@@ -0,0 +1,386 @@
1
+ // kbot Skill System — Auto-write reusable procedures after complex tasks
2
+ //
3
+ // Inspired by Hermes Agent's skill documents (agentskills.io standard)
4
+ //
5
+ // After a complex interaction (5+ tool calls), kbot writes a skill file:
6
+ // ~/.kbot/skills/deploy-supabase-edge-function.md
7
+ //
8
+ // Next time a similar task comes up, the skill is found via keyword search
9
+ // and injected into the context — skipping re-derivation entirely.
10
+ //
11
+ // Skills are:
12
+ // - Markdown files with structured metadata
13
+ // - Self-patching (updated when execution reveals issues)
14
+ // - Scored (success rate tracked)
15
+ // - Searchable via FTS and keyword matching
16
+ // - Compatible with agentskills.io standard
17
+ import { homedir } from 'node:os';
18
+ import { join } from 'node:path';
19
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, unlinkSync, } from 'node:fs';
20
+ import { registerTool } from './tools/index.js';
21
+ const SKILLS_DIR = join(homedir(), '.kbot', 'skills');
22
+ function ensureDir() {
23
+ if (!existsSync(SKILLS_DIR))
24
+ mkdirSync(SKILLS_DIR, { recursive: true });
25
+ }
26
+ // ── Skill I/O ───────────────────────────────────────────────────────
27
+ function skillPath(id) {
28
+ return join(SKILLS_DIR, `${id}.md`);
29
+ }
30
+ function slugify(title) {
31
+ return title
32
+ .toLowerCase()
33
+ .replace(/[^a-z0-9\s-]/g, '')
34
+ .replace(/\s+/g, '-')
35
+ .replace(/-+/g, '-')
36
+ .slice(0, 60);
37
+ }
38
+ /** Parse a skill markdown file into a Skill object */
39
+ function parseSkill(content, id) {
40
+ try {
41
+ // Extract frontmatter (between --- markers)
42
+ const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
43
+ if (!fmMatch)
44
+ return null;
45
+ const fm = {};
46
+ for (const line of fmMatch[1].split('\n')) {
47
+ const [key, ...vals] = line.split(':');
48
+ if (key && vals.length)
49
+ fm[key.trim()] = vals.join(':').trim();
50
+ }
51
+ // Extract sections
52
+ const sections = {};
53
+ let currentSection = '';
54
+ const body = content.slice(fmMatch[0].length).trim();
55
+ for (const line of body.split('\n')) {
56
+ if (line.startsWith('## ')) {
57
+ currentSection = line.slice(3).trim().toLowerCase();
58
+ sections[currentSection] = [];
59
+ }
60
+ else if (currentSection && line.startsWith('- ')) {
61
+ sections[currentSection].push(line.slice(2).trim());
62
+ }
63
+ else if (currentSection && line.match(/^\d+\./)) {
64
+ sections[currentSection].push(line.replace(/^\d+\.\s*/, '').trim());
65
+ }
66
+ }
67
+ return {
68
+ id,
69
+ title: fm.title || id,
70
+ description: fm.description || '',
71
+ keywords: (fm.keywords || '').split(',').map(k => k.trim()).filter(Boolean),
72
+ domain: fm.domain || 'general',
73
+ steps: sections.steps || sections.procedure || [],
74
+ issues: sections.issues || sections['common issues'] || [],
75
+ tools: (fm.tools || '').split(',').map(t => t.trim()).filter(Boolean),
76
+ successRate: parseFloat(fm.success_rate || '0.5'),
77
+ executions: parseInt(fm.executions || '0'),
78
+ version: parseInt(fm.version || '1'),
79
+ created: fm.created || new Date().toISOString(),
80
+ lastUsed: fm.last_used || '',
81
+ lastPatched: fm.last_patched || '',
82
+ };
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ }
88
+ /** Serialize a Skill to markdown */
89
+ function serializeSkill(skill) {
90
+ const lines = [
91
+ '---',
92
+ `title: ${skill.title}`,
93
+ `description: ${skill.description}`,
94
+ `keywords: ${skill.keywords.join(', ')}`,
95
+ `domain: ${skill.domain}`,
96
+ `tools: ${skill.tools.join(', ')}`,
97
+ `success_rate: ${skill.successRate.toFixed(2)}`,
98
+ `executions: ${skill.executions}`,
99
+ `version: ${skill.version}`,
100
+ `created: ${skill.created}`,
101
+ `last_used: ${skill.lastUsed}`,
102
+ `last_patched: ${skill.lastPatched}`,
103
+ '---',
104
+ '',
105
+ `# ${skill.title}`,
106
+ '',
107
+ `${skill.description}`,
108
+ '',
109
+ '## Steps',
110
+ '',
111
+ ];
112
+ skill.steps.forEach((step, i) => {
113
+ lines.push(`${i + 1}. ${step}`);
114
+ });
115
+ if (skill.issues.length > 0) {
116
+ lines.push('', '## Common Issues', '');
117
+ for (const issue of skill.issues) {
118
+ lines.push(`- ${issue}`);
119
+ }
120
+ }
121
+ lines.push('');
122
+ return lines.join('\n');
123
+ }
124
+ // ── Core API ────────────────────────────────────────────────────────
125
+ /** List all skills */
126
+ export function listSkills(domain) {
127
+ ensureDir();
128
+ const files = readdirSync(SKILLS_DIR).filter(f => f.endsWith('.md'));
129
+ const skills = [];
130
+ for (const file of files) {
131
+ const id = file.replace('.md', '');
132
+ const content = readFileSync(join(SKILLS_DIR, file), 'utf-8');
133
+ const skill = parseSkill(content, id);
134
+ if (skill && (!domain || skill.domain === domain)) {
135
+ skills.push(skill);
136
+ }
137
+ }
138
+ return skills.sort((a, b) => b.successRate - a.successRate);
139
+ }
140
+ /** Find skills matching a query */
141
+ export function findSkills(query, domain) {
142
+ const words = query.toLowerCase().split(/\s+/).filter(w => w.length > 2);
143
+ const all = listSkills(domain);
144
+ return all
145
+ .map(skill => {
146
+ // Score based on keyword overlap + title/description match
147
+ const titleWords = skill.title.toLowerCase().split(/\s+/);
148
+ const descWords = skill.description.toLowerCase().split(/\s+/);
149
+ const allSkillWords = [...skill.keywords, ...titleWords, ...descWords];
150
+ const matchCount = words.filter(w => allSkillWords.some(sw => sw.includes(w) || w.includes(sw))).length;
151
+ const score = words.length > 0 ? matchCount / words.length : 0;
152
+ return { skill, score };
153
+ })
154
+ .filter(s => s.score > 0.3)
155
+ .sort((a, b) => b.score - a.score)
156
+ .map(s => s.skill);
157
+ }
158
+ /** Get a specific skill by ID */
159
+ export function getSkill(id) {
160
+ const path = skillPath(id);
161
+ if (!existsSync(path))
162
+ return null;
163
+ const content = readFileSync(path, 'utf-8');
164
+ return parseSkill(content, id);
165
+ }
166
+ /** Create a new skill from a completed task */
167
+ export function createSkill(input) {
168
+ ensureDir();
169
+ const id = slugify(input.title);
170
+ const skill = {
171
+ id,
172
+ title: input.title,
173
+ description: input.description,
174
+ keywords: input.keywords,
175
+ domain: input.domain,
176
+ steps: input.steps,
177
+ issues: input.issues || [],
178
+ tools: input.tools,
179
+ successRate: 0.5,
180
+ executions: 0,
181
+ version: 1,
182
+ created: new Date().toISOString(),
183
+ lastUsed: '',
184
+ lastPatched: '',
185
+ };
186
+ writeFileSync(skillPath(id), serializeSkill(skill));
187
+ return skill;
188
+ }
189
+ /** Record a skill execution (success or failure) */
190
+ export function recordSkillExecution(id, success) {
191
+ const skill = getSkill(id);
192
+ if (!skill)
193
+ return;
194
+ skill.executions++;
195
+ skill.lastUsed = new Date().toISOString();
196
+ // Update success rate (exponential moving average)
197
+ const alpha = 0.2;
198
+ skill.successRate = skill.successRate * (1 - alpha) + (success ? 1 : 0) * alpha;
199
+ writeFileSync(skillPath(id), serializeSkill(skill));
200
+ }
201
+ /** Patch a skill (update steps, add issues) */
202
+ export function patchSkill(id, patches) {
203
+ const skill = getSkill(id);
204
+ if (!skill)
205
+ return;
206
+ if (patches.replaceSteps) {
207
+ skill.steps = patches.replaceSteps;
208
+ }
209
+ if (patches.addSteps) {
210
+ skill.steps.push(...patches.addSteps);
211
+ }
212
+ if (patches.removeSteps) {
213
+ skill.steps = skill.steps.filter(s => !patches.removeSteps.some(r => s.toLowerCase().includes(r.toLowerCase())));
214
+ }
215
+ if (patches.addIssues) {
216
+ skill.issues.push(...patches.addIssues);
217
+ }
218
+ skill.version++;
219
+ skill.lastPatched = new Date().toISOString();
220
+ writeFileSync(skillPath(id), serializeSkill(skill));
221
+ }
222
+ /** Delete a skill */
223
+ export function deleteSkill(id) {
224
+ const path = skillPath(id);
225
+ if (!existsSync(path))
226
+ return false;
227
+ unlinkSync(path);
228
+ return true;
229
+ }
230
+ // ── Auto-Skill Extraction ───────────────────────────────────────────
231
+ /**
232
+ * Analyze a tool call sequence and create a skill if it's complex enough.
233
+ * Call this at the end of a conversation with the tool history.
234
+ */
235
+ export function maybeCreateSkill(toolCalls, userMessage, domain = 'general') {
236
+ // Only create skills for complex tasks (5+ tool calls)
237
+ if (toolCalls.length < 5)
238
+ return null;
239
+ // Don't create duplicate skills
240
+ const existing = findSkills(userMessage, domain);
241
+ if (existing.length > 0 && existing[0])
242
+ return null;
243
+ // Extract steps from tool calls
244
+ const steps = toolCalls.map(tc => {
245
+ const argsStr = Object.entries(tc.args)
246
+ .filter(([, v]) => v !== undefined && v !== '')
247
+ .map(([k, v]) => `${k}="${v}"`)
248
+ .join(', ');
249
+ return `${tc.name}(${argsStr})`;
250
+ });
251
+ // Extract tools used
252
+ const tools = [...new Set(toolCalls.map(tc => tc.name))];
253
+ // Extract keywords from the user message
254
+ const keywords = userMessage
255
+ .toLowerCase()
256
+ .replace(/[^a-z0-9\s]/g, ' ')
257
+ .split(/\s+/)
258
+ .filter(w => w.length > 3)
259
+ .slice(0, 10);
260
+ // Generate title from user message
261
+ const title = userMessage.slice(0, 80).replace(/[^a-zA-Z0-9\s-]/g, '').trim();
262
+ return createSkill({
263
+ title,
264
+ description: `Auto-generated skill from: "${userMessage.slice(0, 120)}"`,
265
+ keywords,
266
+ domain,
267
+ steps,
268
+ tools,
269
+ });
270
+ }
271
+ // ── Tool Registration ───────────────────────────────────────────────
272
+ export function registerSkillTools() {
273
+ registerTool({
274
+ name: 'skill_manage',
275
+ description: 'Manage kbot\'s reusable skills — learned procedures that persist across sessions. Skills are auto-created after complex tasks and self-patch when issues are found.',
276
+ parameters: {
277
+ action: { type: 'string', description: '"list", "find", "get", "create", "patch", "delete", "report"', required: true },
278
+ query: { type: 'string', description: 'Search query (for find), skill ID (for get/patch/delete)' },
279
+ domain: { type: 'string', description: 'Filter by domain: general, music, code, research, devops, security' },
280
+ title: { type: 'string', description: 'Skill title (for create)' },
281
+ steps: { type: 'string', description: 'JSON array of step strings (for create/patch)' },
282
+ keywords: { type: 'string', description: 'Comma-separated keywords (for create)' },
283
+ issue: { type: 'string', description: 'Issue to add (for patch)' },
284
+ },
285
+ tier: 'free',
286
+ timeout: 5_000,
287
+ async execute(args) {
288
+ const action = String(args.action).toLowerCase();
289
+ switch (action) {
290
+ case 'list': {
291
+ const skills = listSkills(args.domain ? String(args.domain) : undefined);
292
+ if (skills.length === 0)
293
+ return 'No skills found. Skills are auto-created after complex tasks (5+ tool calls).';
294
+ return `## Skills (${skills.length})\n\n` +
295
+ skills.map(s => `**${s.id}** (v${s.version}) — ${s.description}\n ` +
296
+ `Success: ${(s.successRate * 100).toFixed(0)}% | Used: ${s.executions}x | Domain: ${s.domain}`).join('\n\n');
297
+ }
298
+ case 'find':
299
+ case 'search': {
300
+ const query = String(args.query || '');
301
+ if (!query)
302
+ return 'Provide a search query.';
303
+ const results = findSkills(query, args.domain ? String(args.domain) : undefined);
304
+ if (results.length === 0)
305
+ return `No skills matching "${query}".`;
306
+ return results.map(s => `**${s.id}** — ${s.description}\n` +
307
+ s.steps.map((step, i) => ` ${i + 1}. ${step}`).join('\n')).join('\n\n');
308
+ }
309
+ case 'get': {
310
+ const id = String(args.query || '');
311
+ const skill = getSkill(id);
312
+ if (!skill)
313
+ return `Skill "${id}" not found.`;
314
+ return serializeSkill(skill);
315
+ }
316
+ case 'create': {
317
+ const title = String(args.title || '');
318
+ if (!title)
319
+ return 'Provide a title.';
320
+ let steps = [];
321
+ try {
322
+ steps = JSON.parse(String(args.steps || '[]'));
323
+ }
324
+ catch {
325
+ return 'Invalid steps JSON.';
326
+ }
327
+ const keywords = (args.keywords ? String(args.keywords) : '').split(',').map(k => k.trim()).filter(Boolean);
328
+ const skill = createSkill({
329
+ title,
330
+ description: title,
331
+ keywords,
332
+ domain: String(args.domain || 'general'),
333
+ steps,
334
+ tools: [],
335
+ });
336
+ return `Created skill: **${skill.id}** (v${skill.version})`;
337
+ }
338
+ case 'patch': {
339
+ const id = String(args.query || '');
340
+ if (!id)
341
+ return 'Provide skill ID.';
342
+ const patches = {};
343
+ if (args.steps) {
344
+ try {
345
+ patches.replaceSteps = JSON.parse(String(args.steps));
346
+ }
347
+ catch { }
348
+ }
349
+ if (args.issue) {
350
+ patches.addIssues = [String(args.issue)];
351
+ }
352
+ patchSkill(id, patches);
353
+ return `Patched skill: **${id}**`;
354
+ }
355
+ case 'delete': {
356
+ const id = String(args.query || '');
357
+ return deleteSkill(id) ? `Deleted: ${id}` : `Not found: ${id}`;
358
+ }
359
+ case 'report': {
360
+ const skills = listSkills();
361
+ const total = skills.length;
362
+ const byDomain = {};
363
+ let totalExec = 0;
364
+ let avgSuccess = 0;
365
+ for (const s of skills) {
366
+ byDomain[s.domain] = (byDomain[s.domain] || 0) + 1;
367
+ totalExec += s.executions;
368
+ avgSuccess += s.successRate;
369
+ }
370
+ if (total > 0)
371
+ avgSuccess /= total;
372
+ return [
373
+ `## Skill Report`,
374
+ `Total: ${total} skills | ${totalExec} executions | Avg success: ${(avgSuccess * 100).toFixed(0)}%`,
375
+ '',
376
+ 'By domain:',
377
+ ...Object.entries(byDomain).map(([d, c]) => ` ${d}: ${c}`),
378
+ ].join('\n');
379
+ }
380
+ default:
381
+ return 'Unknown action. Use: list, find, get, create, patch, delete, report.';
382
+ }
383
+ },
384
+ });
385
+ }
386
+ //# sourceMappingURL=skill-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-system.js","sourceRoot":"","sources":["../src/skill-system.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,uEAAuE;AACvE,EAAE;AACF,yEAAyE;AACzE,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,EAAE;AACF,cAAc;AACd,8CAA8C;AAC9C,4DAA4D;AAC5D,oCAAoC;AACpC,8CAA8C;AAC9C,8CAA8C;AAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EACL,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAClD,WAAW,EAAE,UAAU,GACxB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAE/C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;AAErD,SAAS,SAAS;IAChB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AACzE,CAAC;AAmCD,uEAAuE;AAEvE,SAAS,SAAS,CAAC,EAAU;IAC3B,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;AACrC,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AACjB,CAAC;AAED,sDAAsD;AACtD,SAAS,UAAU,CAAC,OAAe,EAAE,EAAU;IAC7C,IAAI,CAAC;QACH,4CAA4C;QAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;QACtD,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QAEzB,MAAM,EAAE,GAA2B,EAAE,CAAA;QACrC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACtC,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM;gBAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;QAChE,CAAC;QAED,mBAAmB;QACnB,MAAM,QAAQ,GAA6B,EAAE,CAAA;QAC7C,IAAI,cAAc,GAAG,EAAE,CAAA;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;QACpD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;gBACnD,QAAQ,CAAC,cAAc,CAAC,GAAG,EAAE,CAAA;YAC/B,CAAC;iBAAM,IAAI,cAAc,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnD,QAAQ,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;YACrD,CAAC;iBAAM,IAAI,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClD,QAAQ,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;YACrE,CAAC;QACH,CAAC;QAED,OAAO;YACL,EAAE;YACF,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE;YACrB,WAAW,EAAE,EAAE,CAAC,WAAW,IAAI,EAAE;YACjC,QAAQ,EAAE,CAAC,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YAC3E,MAAM,EAAE,EAAE,CAAC,MAAM,IAAI,SAAS;YAC9B,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,SAAS,IAAI,EAAE;YACjD,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE;YAC1D,KAAK,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YACrE,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC,YAAY,IAAI,KAAK,CAAC;YACjD,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,UAAU,IAAI,GAAG,CAAC;YAC1C,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,OAAO,IAAI,GAAG,CAAC;YACpC,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC/C,QAAQ,EAAE,EAAE,CAAC,SAAS,IAAI,EAAE;YAC5B,WAAW,EAAE,EAAE,CAAC,YAAY,IAAI,EAAE;SACnC,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,oCAAoC;AACpC,SAAS,cAAc,CAAC,KAAY;IAClC,MAAM,KAAK,GAAa;QACtB,KAAK;QACL,UAAU,KAAK,CAAC,KAAK,EAAE;QACvB,gBAAgB,KAAK,CAAC,WAAW,EAAE;QACnC,aAAa,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACxC,WAAW,KAAK,CAAC,MAAM,EAAE;QACzB,UAAU,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAClC,iBAAiB,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAC/C,eAAe,KAAK,CAAC,UAAU,EAAE;QACjC,YAAY,KAAK,CAAC,OAAO,EAAE;QAC3B,YAAY,KAAK,CAAC,OAAO,EAAE;QAC3B,cAAc,KAAK,CAAC,QAAQ,EAAE;QAC9B,iBAAiB,KAAK,CAAC,WAAW,EAAE;QACpC,KAAK;QACL,EAAE;QACF,KAAK,KAAK,CAAC,KAAK,EAAE;QAClB,EAAE;QACF,GAAG,KAAK,CAAC,WAAW,EAAE;QACtB,EAAE;QACF,UAAU;QACV,EAAE;KACH,CAAA;IAED,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAA;QACtC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,uEAAuE;AAEvE,sBAAsB;AACtB,MAAM,UAAU,UAAU,CAAC,MAAe;IACxC,SAAS,EAAE,CAAA;IACX,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;IACpE,MAAM,MAAM,GAAY,EAAE,CAAA;IAE1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QAClC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;QAC7D,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QACrC,IAAI,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAA;AAC7D,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,MAAe;IACvD,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACxE,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;IAE9B,OAAO,GAAG;SACP,GAAG,CAAC,KAAK,CAAC,EAAE;QACX,2DAA2D;QAC3D,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACzD,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC9D,MAAM,aAAa,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,UAAU,EAAE,GAAG,SAAS,CAAC,CAAA;QAEtE,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAClC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAC3D,CAAC,MAAM,CAAA;QAER,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACzB,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC;SAC1B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;AACtB,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,QAAQ,CAAC,EAAU;IACjC,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAA;IAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAClC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC3C,OAAO,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;AAChC,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,WAAW,CAAC,KAQ3B;IACC,SAAS,EAAE,CAAA;IACX,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC/B,MAAM,KAAK,GAAU;QACnB,EAAE;QACF,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;QAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,WAAW,EAAE,GAAG;QAChB,UAAU,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACjC,QAAQ,EAAE,EAAE;QACZ,WAAW,EAAE,EAAE;KAChB,CAAA;IAED,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;IACnD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,oBAAoB,CAAC,EAAU,EAAE,OAAgB;IAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC1B,IAAI,CAAC,KAAK;QAAE,OAAM;IAElB,KAAK,CAAC,UAAU,EAAE,CAAA;IAClB,KAAK,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAEzC,mDAAmD;IACnD,MAAM,KAAK,GAAG,GAAG,CAAA;IACjB,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;IAE/E,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;AACrD,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,OAKtC;IACC,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC1B,IAAI,CAAC,KAAK;QAAE,OAAM;IAElB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,YAAY,CAAA;IACpC,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACvC,CAAC;IACD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACnC,CAAC,OAAO,CAAC,WAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAC3E,CAAA;IACH,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IACzC,CAAC;IAED,KAAK,CAAC,OAAO,EAAE,CAAA;IACf,KAAK,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC5C,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;AACrD,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAA;IAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IACnC,UAAU,CAAC,IAAI,CAAC,CAAA;IAChB,OAAO,IAAI,CAAA;AACb,CAAC;AAED,uEAAuE;AAEvE;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAiF,EACjF,WAAmB,EACnB,SAAiB,SAAS;IAE1B,uDAAuD;IACvD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IAErC,gCAAgC;IAChC,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IAChD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IAEnD,gCAAgC;IAChC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC;aACpC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;aAC9C,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;aAC9B,IAAI,CAAC,IAAI,CAAC,CAAA;QACb,OAAO,GAAG,EAAE,CAAC,IAAI,IAAI,OAAO,GAAG,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,qBAAqB;IACrB,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAExD,yCAAyC;IACzC,MAAM,QAAQ,GAAG,WAAW;SACzB,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SACzB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEf,mCAAmC;IACnC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAE7E,OAAO,WAAW,CAAC;QACjB,KAAK;QACL,WAAW,EAAE,+BAA+B,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;QACxE,QAAQ;QACR,MAAM;QACN,KAAK;QACL,KAAK;KACN,CAAC,CAAA;AACJ,CAAC;AAED,uEAAuE;AAEvE,MAAM,UAAU,kBAAkB;IAEhC,YAAY,CAAC;QACX,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,qKAAqK;QAClL,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE,QAAQ,EAAE,IAAI,EAAE;YACvH,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0DAA0D,EAAE;YAClG,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oEAAoE,EAAE;YAC7G,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0BAA0B,EAAE;YAClE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+CAA+C,EAAE;YACvF,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE;YAClF,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0BAA0B,EAAE;SACnE;QACD,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,KAAK;QACd,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;YAEhD,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;oBACxE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAO,+EAA+E,CAAA;oBAC/G,OAAO,cAAc,MAAM,CAAC,MAAM,OAAO;wBACvC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACb,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,WAAW,MAAM;4BACpD,YAAY,CAAC,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,UAAU,eAAe,CAAC,CAAC,MAAM,EAAE,CAC/F,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBAClB,CAAC;gBAED,KAAK,MAAM,CAAC;gBACZ,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;oBACtC,IAAI,CAAC,KAAK;wBAAE,OAAO,yBAAyB,CAAA;oBAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;oBAChF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAO,uBAAuB,KAAK,IAAI,CAAA;oBACjE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACrB,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,WAAW,IAAI;wBAClC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC3D,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBAChB,CAAC;gBAED,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;oBACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;oBAC1B,IAAI,CAAC,KAAK;wBAAE,OAAO,UAAU,EAAE,cAAc,CAAA;oBAC7C,OAAO,cAAc,CAAC,KAAK,CAAC,CAAA;gBAC9B,CAAC;gBAED,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;oBACtC,IAAI,CAAC,KAAK;wBAAE,OAAO,kBAAkB,CAAA;oBACrC,IAAI,KAAK,GAAa,EAAE,CAAA;oBACxB,IAAI,CAAC;wBAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAA;oBAAC,CAAC;oBAAC,MAAM,CAAC;wBAAC,OAAO,qBAAqB,CAAA;oBAAC,CAAC;oBAC7F,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;oBAC3G,MAAM,KAAK,GAAG,WAAW,CAAC;wBACxB,KAAK;wBACL,WAAW,EAAE,KAAK;wBAClB,QAAQ;wBACR,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;wBACxC,KAAK;wBACL,KAAK,EAAE,EAAE;qBACV,CAAC,CAAA;oBACF,OAAO,oBAAoB,KAAK,CAAC,EAAE,QAAQ,KAAK,CAAC,OAAO,GAAG,CAAA;gBAC7D,CAAC;gBAED,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;oBACnC,IAAI,CAAC,EAAE;wBAAE,OAAO,mBAAmB,CAAA;oBACnC,MAAM,OAAO,GAAqC,EAAE,CAAA;oBACpD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBACf,IAAI,CAAC;4BAAC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;wBAAC,CAAC;wBAAC,MAAM,CAAC,CAAA,CAAC;oBACxE,CAAC;oBACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;oBAC1C,CAAC;oBACD,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;oBACvB,OAAO,oBAAoB,EAAE,IAAI,CAAA;gBACnC,CAAC;gBAED,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;oBACnC,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,CAAA;gBAChE,CAAC;gBAED,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;oBAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAA;oBAC3B,MAAM,QAAQ,GAA2B,EAAE,CAAA;oBAC3C,IAAI,SAAS,GAAG,CAAC,CAAA;oBACjB,IAAI,UAAU,GAAG,CAAC,CAAA;oBAClB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;wBACvB,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;wBAClD,SAAS,IAAI,CAAC,CAAC,UAAU,CAAA;wBACzB,UAAU,IAAI,CAAC,CAAC,WAAW,CAAA;oBAC7B,CAAC;oBACD,IAAI,KAAK,GAAG,CAAC;wBAAE,UAAU,IAAI,KAAK,CAAA;oBAElC,OAAO;wBACL,iBAAiB;wBACjB,UAAU,KAAK,aAAa,SAAS,8BAA8B,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;wBACnG,EAAE;wBACF,YAAY;wBACZ,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;qBAC5D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACd,CAAC;gBAED;oBACE,OAAO,sEAAsE,CAAA;YACjF,CAAC;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ableton.d.ts","sourceRoot":"","sources":["../../src/tools/ableton.ts"],"names":[],"mappings":"AAuDA,wBAAgB,oBAAoB,IAAI,IAAI,CAuiC3C"}
1
+ {"version":3,"file":"ableton.d.ts","sourceRoot":"","sources":["../../src/tools/ableton.ts"],"names":[],"mappings":"AAuDA,wBAAgB,oBAAoB,IAAI,IAAI,CAwjC3C"}
@@ -228,7 +228,8 @@ export function registerAbletonTools() {
228
228
  switch (action) {
229
229
  case 'fire':
230
230
  case 'launch':
231
- osc.send('/live/clip_slot/fire', t, c);
231
+ osc.send('/live/song/set/clip_trigger_quantization', 0); // immediate launch
232
+ osc.send('/live/clip/fire', t, c); // auto-starts transport
232
233
  return `Fired clip ${args.clip || 1} on track ${args.track} ▶`;
233
234
  case 'stop':
234
235
  osc.send('/live/clip_slot/stop', t, c);
@@ -790,13 +791,21 @@ export function registerAbletonTools() {
790
791
  }
791
792
  return `Could not find "${manufacturer} ${plugin}": ${status.join(', ')}`;
792
793
  }
793
- // Try native device first
794
- let result = await osc.query('/live/kbot/load_device', t, plugin);
794
+ // Try load_plugin first — _deep_plugin_search correctly handles native
795
+ // instruments by returning the first loadable child of matching browser folders.
796
+ // This works for both native (Drum Rack, Operator, Wavetable) and third-party plugins.
797
+ let result = await osc.query('/live/kbot/load_plugin', t, plugin, '');
795
798
  let status = extractArgs(result);
796
799
  if (status[0] === 'ok') {
797
800
  return `Loaded **${status[1]}** on track ${args.track}`;
798
801
  }
799
- // Try plugins category
802
+ // Fallback: try load_device (uses _search_tree, less reliable for native instruments)
803
+ result = await osc.query('/live/kbot/load_device', t, plugin);
804
+ status = extractArgs(result);
805
+ if (status[0] === 'ok') {
806
+ return `Loaded **${status[1]}** on track ${args.track}`;
807
+ }
808
+ // Final fallback: try plugins category with name as both manufacturer and plugin
800
809
  result = await osc.query('/live/kbot/load_plugin', t, plugin, plugin);
801
810
  status = extractArgs(result);
802
811
  if (status[0] === 'ok') {
@@ -912,8 +921,9 @@ export function registerAbletonTools() {
912
921
  lines.push(`**Pattern**: ${pattern} (${bars} bars)`);
913
922
  lines.push(`**BPM range**: ${bpmRange[0]}-${bpmRange[1]}`);
914
923
  }
915
- // Fire the clip
916
- osc.send('/live/clip_slot/fire', t, 0);
924
+ // Fire the clip — set immediate quantization and use clip/fire (auto-starts transport)
925
+ osc.send('/live/song/set/clip_trigger_quantization', 0);
926
+ osc.send('/live/clip/fire', t, 0);
917
927
  lines.push('');
918
928
  lines.push('▶ Drum Rack built and playing');
919
929
  return lines.join('\n');
@@ -954,14 +964,20 @@ export function registerAbletonTools() {
954
964
  if (args.name) {
955
965
  osc.send('/live/track/set/name', newTrackIdx, String(args.name));
956
966
  }
957
- // Load instrument if specified
967
+ // Load instrument if specified — use load_plugin first (handles native + third-party)
958
968
  if (args.instrument) {
959
969
  const manufacturer = args.manufacturer ? String(args.manufacturer) : '';
960
970
  if (manufacturer) {
961
971
  await osc.query('/live/kbot/load_plugin', newTrackIdx, manufacturer, String(args.instrument));
962
972
  }
963
973
  else {
964
- await osc.query('/live/kbot/load_device', newTrackIdx, String(args.instrument));
974
+ // Try load_plugin first (works for native instruments via _deep_plugin_search fallback)
975
+ const result = await osc.query('/live/kbot/load_plugin', newTrackIdx, String(args.instrument), '');
976
+ const status = extractArgs(result);
977
+ if (status[0] !== 'ok') {
978
+ // Fallback to load_device
979
+ await osc.query('/live/kbot/load_device', newTrackIdx, String(args.instrument));
980
+ }
965
981
  }
966
982
  }
967
983
  return `Created ${trackType} track **${args.name || 'Track ' + (newTrackIdx + 1)}**${args.instrument ? ' with ' + args.instrument : ''} (track ${newTrackIdx + 1})`;