@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.
- package/dist/agents/replit.js +1 -1
- package/dist/behaviour.d.ts +30 -0
- package/dist/behaviour.d.ts.map +1 -0
- package/dist/behaviour.js +191 -0
- package/dist/behaviour.js.map +1 -0
- package/dist/bootstrap.js +1 -1
- package/dist/bootstrap.js.map +1 -1
- package/dist/integrations/ableton-m4l.d.ts +124 -0
- package/dist/integrations/ableton-m4l.d.ts.map +1 -0
- package/dist/integrations/ableton-m4l.js +338 -0
- package/dist/integrations/ableton-m4l.js.map +1 -0
- package/dist/integrations/ableton-osc.d.ts.map +1 -1
- package/dist/integrations/ableton-osc.js +6 -2
- package/dist/integrations/ableton-osc.js.map +1 -1
- package/dist/music-learning.d.ts +181 -0
- package/dist/music-learning.d.ts.map +1 -0
- package/dist/music-learning.js +340 -0
- package/dist/music-learning.js.map +1 -0
- package/dist/skill-system.d.ts +68 -0
- package/dist/skill-system.d.ts.map +1 -0
- package/dist/skill-system.js +386 -0
- package/dist/skill-system.js.map +1 -0
- package/dist/tools/ableton.d.ts.map +1 -1
- package/dist/tools/ableton.js +24 -8
- package/dist/tools/ableton.js.map +1 -1
- package/dist/tools/arrangement-engine.d.ts +2 -0
- package/dist/tools/arrangement-engine.d.ts.map +1 -0
- package/dist/tools/arrangement-engine.js +644 -0
- package/dist/tools/arrangement-engine.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +5 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/producer-engine.d.ts +71 -0
- package/dist/tools/producer-engine.d.ts.map +1 -0
- package/dist/tools/producer-engine.js +1859 -0
- package/dist/tools/producer-engine.js.map +1 -0
- package/dist/tools/sound-designer.d.ts +2 -0
- package/dist/tools/sound-designer.d.ts.map +1 -0
- package/dist/tools/sound-designer.js +896 -0
- package/dist/tools/sound-designer.js.map +1 -0
- 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,
|
|
1
|
+
{"version":3,"file":"ableton.d.ts","sourceRoot":"","sources":["../../src/tools/ableton.ts"],"names":[],"mappings":"AAuDA,wBAAgB,oBAAoB,IAAI,IAAI,CAwjC3C"}
|
package/dist/tools/ableton.js
CHANGED
|
@@ -228,7 +228,8 @@ export function registerAbletonTools() {
|
|
|
228
228
|
switch (action) {
|
|
229
229
|
case 'fire':
|
|
230
230
|
case 'launch':
|
|
231
|
-
osc.send('/live/
|
|
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
|
|
794
|
-
|
|
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
|
-
//
|
|
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/
|
|
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
|
-
|
|
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})`;
|