@kernel.chat/kbot 3.9.0 → 3.11.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/a2a-client.d.ts +162 -0
- package/dist/a2a-client.d.ts.map +1 -0
- package/dist/a2a-client.js +376 -0
- package/dist/a2a-client.js.map +1 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +96 -5
- package/dist/agent.js.map +1 -1
- package/dist/cli.js +295 -3
- package/dist/cli.js.map +1 -1
- package/dist/mcp-apps.d.ts +90 -0
- package/dist/mcp-apps.d.ts.map +1 -0
- package/dist/mcp-apps.js +497 -0
- package/dist/mcp-apps.js.map +1 -0
- package/dist/memory-synthesis.d.ts +67 -0
- package/dist/memory-synthesis.d.ts.map +1 -0
- package/dist/memory-synthesis.js +557 -0
- package/dist/memory-synthesis.js.map +1 -0
- package/dist/prompt-evolution.d.ts +92 -0
- package/dist/prompt-evolution.d.ts.map +1 -0
- package/dist/prompt-evolution.js +371 -0
- package/dist/prompt-evolution.js.map +1 -0
- package/dist/reflection.d.ts +33 -0
- package/dist/reflection.d.ts.map +1 -0
- package/dist/reflection.js +368 -0
- package/dist/reflection.js.map +1 -0
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +56 -6
- package/dist/serve.js.map +1 -1
- package/dist/skill-library.d.ts +60 -0
- package/dist/skill-library.d.ts.map +1 -0
- package/dist/skill-library.js +475 -0
- package/dist/skill-library.js.map +1 -0
- package/dist/spec.d.ts +23 -0
- package/dist/spec.d.ts.map +1 -0
- package/dist/spec.js +177 -0
- package/dist/spec.js.map +1 -0
- package/dist/tool-pipeline.d.ts +7 -0
- package/dist/tool-pipeline.d.ts.map +1 -1
- package/dist/tool-pipeline.js +32 -0
- package/dist/tool-pipeline.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tree-planner.d.ts +63 -0
- package/dist/tree-planner.d.ts.map +1 -0
- package/dist/tree-planner.js +818 -0
- package/dist/tree-planner.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
// kbot Multi-Agent Reflexion (MAR) — When tasks fail, all specialists
|
|
2
|
+
// critique the failure from their perspective, and a judge synthesizes
|
|
3
|
+
// a single actionable lesson for future sessions.
|
|
4
|
+
//
|
|
5
|
+
// Triggers:
|
|
6
|
+
// 1. Self-eval scores below 0.5
|
|
7
|
+
// 2. Error-correction fires (classified error with confidence > 0.7)
|
|
8
|
+
// 3. User explicitly rejects the response ("no", "wrong", "that's not right")
|
|
9
|
+
//
|
|
10
|
+
// All critiques are heuristic-based — no LLM calls. Fast and free.
|
|
11
|
+
// Lessons are stored in ~/.kbot/memory/reflections.json (max 100, ranked by recency).
|
|
12
|
+
import { homedir } from 'node:os';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
15
|
+
// ── Storage ──
|
|
16
|
+
const MEMORY_DIR = join(homedir(), '.kbot', 'memory');
|
|
17
|
+
const REFLECTIONS_FILE = join(MEMORY_DIR, 'reflections.json');
|
|
18
|
+
const MAX_REFLECTIONS = 100;
|
|
19
|
+
function ensureDir() {
|
|
20
|
+
if (!existsSync(MEMORY_DIR))
|
|
21
|
+
mkdirSync(MEMORY_DIR, { recursive: true });
|
|
22
|
+
}
|
|
23
|
+
function loadReflections() {
|
|
24
|
+
ensureDir();
|
|
25
|
+
if (!existsSync(REFLECTIONS_FILE))
|
|
26
|
+
return [];
|
|
27
|
+
try {
|
|
28
|
+
return JSON.parse(readFileSync(REFLECTIONS_FILE, 'utf-8'));
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function saveReflections(reflections) {
|
|
35
|
+
ensureDir();
|
|
36
|
+
// Keep only the most recent MAX_REFLECTIONS
|
|
37
|
+
const trimmed = reflections.slice(-MAX_REFLECTIONS);
|
|
38
|
+
writeFileSync(REFLECTIONS_FILE, JSON.stringify(trimmed, null, 2));
|
|
39
|
+
}
|
|
40
|
+
// ── Heuristic Perspective Generators ──
|
|
41
|
+
// Each specialist evaluates the failure from its own lens — no LLM calls.
|
|
42
|
+
function coderPerspective(message, response) {
|
|
43
|
+
const critiques = [];
|
|
44
|
+
// Check if code was generated
|
|
45
|
+
const hasCodeBlock = /```[\s\S]*?```/.test(response);
|
|
46
|
+
const askedForCode = /\b(code|function|class|component|script|implement|write|create|build|fix|refactor)\b/i.test(message);
|
|
47
|
+
if (askedForCode && !hasCodeBlock) {
|
|
48
|
+
critiques.push('User asked for code but no code block was generated.');
|
|
49
|
+
}
|
|
50
|
+
if (hasCodeBlock) {
|
|
51
|
+
// Check for common syntax issues in generated code
|
|
52
|
+
const codeBlocks = response.match(/```(?:\w*)\n([\s\S]*?)```/g) || [];
|
|
53
|
+
for (const block of codeBlocks) {
|
|
54
|
+
const code = block.replace(/```\w*\n?/, '').replace(/```$/, '');
|
|
55
|
+
// Unmatched brackets
|
|
56
|
+
const opens = (code.match(/[{([\[]/g) || []).length;
|
|
57
|
+
const closes = (code.match(/[})\]]/g) || []).length;
|
|
58
|
+
if (Math.abs(opens - closes) > 2) {
|
|
59
|
+
critiques.push('Code has mismatched brackets/parentheses.');
|
|
60
|
+
}
|
|
61
|
+
// Missing imports in TypeScript/JavaScript
|
|
62
|
+
if (/\b(import|require)\b/.test(message) || /\bfrom\s+['"]/.test(code)) {
|
|
63
|
+
const usedTypes = code.match(/:\s*([A-Z]\w+)/g) || [];
|
|
64
|
+
const importedTypes = code.match(/import\s+.*?{([^}]+)}/g)?.flatMap(m => m.match(/{([^}]+)}/)?.[1]?.split(',').map(t => t.trim()) || []) || [];
|
|
65
|
+
const unimported = usedTypes.filter(t => {
|
|
66
|
+
const name = t.replace(/^:\s*/, '');
|
|
67
|
+
return !importedTypes.includes(name) && !code.includes(`type ${name}`) && !code.includes(`interface ${name}`);
|
|
68
|
+
});
|
|
69
|
+
if (unimported.length > 3) {
|
|
70
|
+
critiques.push('Code references types that may not be imported.');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Check if tool sequence was efficient
|
|
75
|
+
const toolMentions = response.match(/\b(read_file|write_file|bash|grep|git_\w+)\b/g) || [];
|
|
76
|
+
if (toolMentions.length > 10) {
|
|
77
|
+
critiques.push('Excessive tool calls — could have been more efficient.');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Empty or very short response for a complex question
|
|
81
|
+
if (message.length > 100 && response.length < 100) {
|
|
82
|
+
critiques.push('Response is suspiciously short for the complexity of the request.');
|
|
83
|
+
}
|
|
84
|
+
return critiques.length > 0
|
|
85
|
+
? critiques.join(' ')
|
|
86
|
+
: 'No code-specific issues detected from the coder perspective.';
|
|
87
|
+
}
|
|
88
|
+
function guardianPerspective(message, response) {
|
|
89
|
+
const critiques = [];
|
|
90
|
+
// Check for risky operations in the response
|
|
91
|
+
const riskyPatterns = [
|
|
92
|
+
{ pattern: /rm\s+-rf/i, issue: 'Suggested rm -rf without safeguards.' },
|
|
93
|
+
{ pattern: /sudo\s+/i, issue: 'Suggested sudo without explaining risks.' },
|
|
94
|
+
{ pattern: /chmod\s+777/i, issue: 'Suggested chmod 777 (world-writable).' },
|
|
95
|
+
{ pattern: /DROP\s+TABLE|DELETE\s+FROM\s+\w+\s*;/i, issue: 'Destructive database operation without WHERE clause check.' },
|
|
96
|
+
{ pattern: /eval\s*\(|new\s+Function\s*\(/i, issue: 'Used eval() or Function() constructor — potential code injection.' },
|
|
97
|
+
{ pattern: /password\s*[:=]\s*['"][^'"]+['"]/i, issue: 'Hardcoded password or secret in response.' },
|
|
98
|
+
{ pattern: /\bAPI[_-]?KEY\s*[:=]\s*['"][^'"]+['"]/i, issue: 'Hardcoded API key in response.' },
|
|
99
|
+
{ pattern: /--force|--hard/i, issue: 'Suggested force/hard flag without warning about data loss.' },
|
|
100
|
+
];
|
|
101
|
+
for (const { pattern, issue } of riskyPatterns) {
|
|
102
|
+
if (pattern.test(response)) {
|
|
103
|
+
critiques.push(issue);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Check if the user asked about security and response lacks security considerations
|
|
107
|
+
if (/\b(security|secure|auth|encrypt|vulnerability|exploit|hack)\b/i.test(message)) {
|
|
108
|
+
if (!/\b(validate|sanitize|escape|encrypt|hash|token|csrf|xss|injection)\b/i.test(response)) {
|
|
109
|
+
critiques.push('User asked about security but response lacks security best practices.');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return critiques.length > 0
|
|
113
|
+
? critiques.join(' ')
|
|
114
|
+
: 'No security concerns detected from the guardian perspective.';
|
|
115
|
+
}
|
|
116
|
+
function analystPerspective(message, response) {
|
|
117
|
+
const critiques = [];
|
|
118
|
+
// Did the response address the actual question?
|
|
119
|
+
const questionWords = message.toLowerCase().match(/\b(what|how|why|when|where|which|should|can|is|are|does|do)\b/g) || [];
|
|
120
|
+
const isQuestion = message.includes('?') || questionWords.length > 0;
|
|
121
|
+
if (isQuestion && response.length > 200) {
|
|
122
|
+
// Check if the response starts with relevant content vs preamble
|
|
123
|
+
const firstSentence = response.split(/[.!?\n]/)[0].toLowerCase();
|
|
124
|
+
const boilerplate = /^(certainly|of course|sure|great question|i'd be happy|absolutely|let me)/;
|
|
125
|
+
if (boilerplate.test(firstSentence)) {
|
|
126
|
+
critiques.push('Response starts with boilerplate instead of directly answering the question.');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Multi-part questions: check if all parts were addressed
|
|
130
|
+
const parts = message.split(/[?;]/).filter(p => p.trim().length > 10);
|
|
131
|
+
if (parts.length >= 3 && response.length < parts.length * 50) {
|
|
132
|
+
critiques.push(`User asked ${parts.length} questions but response may not address all of them.`);
|
|
133
|
+
}
|
|
134
|
+
// Check for vague responses when specifics were asked
|
|
135
|
+
if (/\b(specific|exactly|precisely|concrete|example)\b/i.test(message)) {
|
|
136
|
+
const vagueTerms = response.match(/\b(generally|typically|usually|might|could|possibly|perhaps|maybe|it depends)\b/gi) || [];
|
|
137
|
+
if (vagueTerms.length > 3) {
|
|
138
|
+
critiques.push('User asked for specifics but response is vague and hedging.');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Check if response contradicts the question premise
|
|
142
|
+
if (/\b(why did|why does|why is)\b/i.test(message) && /\b(actually.*doesn't|that's not|this isn't)\b/i.test(response)) {
|
|
143
|
+
critiques.push('Response may be contradicting the question premise without addressing the underlying need.');
|
|
144
|
+
}
|
|
145
|
+
return critiques.length > 0
|
|
146
|
+
? critiques.join(' ')
|
|
147
|
+
: 'Response appears to address the question from the analyst perspective.';
|
|
148
|
+
}
|
|
149
|
+
function researcherPerspective(message, response) {
|
|
150
|
+
const critiques = [];
|
|
151
|
+
// Tasks that typically need external sources
|
|
152
|
+
const needsResearch = /\b(latest|current|recent|2024|2025|2026|version|release|update|best practice|comparison|benchmark|alternative)\b/i.test(message);
|
|
153
|
+
if (needsResearch) {
|
|
154
|
+
// Check if response mentions consulting sources
|
|
155
|
+
const citesSource = /\b(according to|source|documentation|docs|official|reference|based on|as of)\b/i.test(response);
|
|
156
|
+
const usedSearch = /\b(web_search|url_fetch|search)\b/i.test(response);
|
|
157
|
+
if (!citesSource && !usedSearch) {
|
|
158
|
+
critiques.push('Question likely requires current/external information but no sources were consulted or cited.');
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Check for potentially outdated information
|
|
162
|
+
if (/\b(deprecated|outdated|removed|legacy)\b/i.test(response)) {
|
|
163
|
+
critiques.push('Response mentions deprecated/outdated items — may need verification against current docs.');
|
|
164
|
+
}
|
|
165
|
+
// Technical questions about specific libraries/tools
|
|
166
|
+
const techMention = message.match(/\b(react|vue|angular|next|svelte|tailwind|prisma|docker|kubernetes|terraform|aws|gcp|azure)\s+(\d+\.?\d*)/i);
|
|
167
|
+
if (techMention) {
|
|
168
|
+
const lib = techMention[1];
|
|
169
|
+
if (!response.toLowerCase().includes(lib.toLowerCase())) {
|
|
170
|
+
critiques.push(`User asked about ${lib} but response may not address it directly.`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return critiques.length > 0
|
|
174
|
+
? critiques.join(' ')
|
|
175
|
+
: 'No research gaps detected from the researcher perspective.';
|
|
176
|
+
}
|
|
177
|
+
function writerPerspective(message, response) {
|
|
178
|
+
const critiques = [];
|
|
179
|
+
// Check structure
|
|
180
|
+
if (response.length > 500) {
|
|
181
|
+
const hasHeadings = /^#+\s/m.test(response);
|
|
182
|
+
const hasBullets = /^[-*]\s/m.test(response);
|
|
183
|
+
const hasNumbered = /^\d+\.\s/m.test(response);
|
|
184
|
+
if (!hasHeadings && !hasBullets && !hasNumbered) {
|
|
185
|
+
critiques.push('Long response lacks structure (no headings, bullets, or numbered lists).');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Check for excessive length
|
|
189
|
+
const sentenceCount = response.split(/[.!?]+/).filter(s => s.trim().length > 5).length;
|
|
190
|
+
if (sentenceCount > 30 && message.length < 100) {
|
|
191
|
+
critiques.push('Response is excessively verbose relative to the question length.');
|
|
192
|
+
}
|
|
193
|
+
// Check for repetition
|
|
194
|
+
const sentences = response.split(/[.!?]+/).map(s => s.trim().toLowerCase()).filter(s => s.length > 20);
|
|
195
|
+
const uniqueSentences = new Set(sentences);
|
|
196
|
+
if (sentences.length > 5 && uniqueSentences.size < sentences.length * 0.7) {
|
|
197
|
+
critiques.push('Response contains significant repetition.');
|
|
198
|
+
}
|
|
199
|
+
// Check clarity — very long sentences
|
|
200
|
+
const longSentences = sentences.filter(s => s.split(/\s+/).length > 40);
|
|
201
|
+
if (longSentences.length > 3) {
|
|
202
|
+
critiques.push('Multiple overly long sentences hurt readability.');
|
|
203
|
+
}
|
|
204
|
+
// User asked for brevity
|
|
205
|
+
if (/\b(brief|short|concise|tl;?dr|summary|quick)\b/i.test(message) && response.length > 1000) {
|
|
206
|
+
critiques.push('User asked for brevity but response exceeds 1000 characters.');
|
|
207
|
+
}
|
|
208
|
+
return critiques.length > 0
|
|
209
|
+
? critiques.join(' ')
|
|
210
|
+
: 'Response is well-structured from the writer perspective.';
|
|
211
|
+
}
|
|
212
|
+
// ── Core API ──
|
|
213
|
+
/**
|
|
214
|
+
* Generate reflections from 5 key specialist perspectives.
|
|
215
|
+
* All heuristic-based — no LLM calls.
|
|
216
|
+
*/
|
|
217
|
+
export function generateReflections(message, response, failureType) {
|
|
218
|
+
const perspectives = [
|
|
219
|
+
{ agent: 'coder', critique: coderPerspective(message, response) },
|
|
220
|
+
{ agent: 'guardian', critique: guardianPerspective(message, response) },
|
|
221
|
+
{ agent: 'analyst', critique: analystPerspective(message, response) },
|
|
222
|
+
{ agent: 'researcher', critique: researcherPerspective(message, response) },
|
|
223
|
+
{ agent: 'writer', critique: writerPerspective(message, response) },
|
|
224
|
+
];
|
|
225
|
+
const synthesis = synthesize(perspectives);
|
|
226
|
+
const lesson = synthesis;
|
|
227
|
+
const reflection = {
|
|
228
|
+
id: `ref_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
|
|
229
|
+
taskMessage: message.slice(0, 500),
|
|
230
|
+
failureType,
|
|
231
|
+
perspectives,
|
|
232
|
+
synthesis,
|
|
233
|
+
lesson,
|
|
234
|
+
created: new Date().toISOString(),
|
|
235
|
+
};
|
|
236
|
+
// Persist
|
|
237
|
+
const reflections = loadReflections();
|
|
238
|
+
reflections.push(reflection);
|
|
239
|
+
saveReflections(reflections);
|
|
240
|
+
return reflection;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Synthesize multiple specialist perspectives into a single actionable lesson.
|
|
244
|
+
* Strategy: pick the highest-signal critique (the one with the most specific findings).
|
|
245
|
+
* If multiple agents found issues, combine them.
|
|
246
|
+
*/
|
|
247
|
+
function synthesize(perspectives) {
|
|
248
|
+
// Filter out "no issues detected" responses — those are low signal
|
|
249
|
+
const noIssuePattern = /no .+ detected|no .+ concerns|appears to address|well-structured/i;
|
|
250
|
+
const critiques = perspectives.filter(p => !noIssuePattern.test(p.critique));
|
|
251
|
+
if (critiques.length === 0) {
|
|
252
|
+
return 'No specific issues identified by specialists. Failure may be due to subtle quality or user expectation mismatch.';
|
|
253
|
+
}
|
|
254
|
+
if (critiques.length === 1) {
|
|
255
|
+
return `[${critiques[0].agent}] ${critiques[0].critique}`;
|
|
256
|
+
}
|
|
257
|
+
// Multiple agents found issues — combine the top 2 by specificity (longer = more specific)
|
|
258
|
+
const sorted = critiques.sort((a, b) => b.critique.length - a.critique.length);
|
|
259
|
+
const top = sorted.slice(0, 2);
|
|
260
|
+
return top.map(c => `[${c.agent}] ${c.critique}`).join(' | ');
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Retrieve past reflections relevant to a given message.
|
|
264
|
+
* Uses keyword overlap to find similar past failures.
|
|
265
|
+
*/
|
|
266
|
+
export function getRelevantReflections(message, max = 3) {
|
|
267
|
+
const reflections = loadReflections();
|
|
268
|
+
if (reflections.length === 0)
|
|
269
|
+
return [];
|
|
270
|
+
const messageWords = extractWords(message);
|
|
271
|
+
if (messageWords.size === 0)
|
|
272
|
+
return reflections.slice(-max);
|
|
273
|
+
// Score each reflection by keyword overlap with the current message
|
|
274
|
+
const scored = reflections.map(r => {
|
|
275
|
+
const taskWords = extractWords(r.taskMessage);
|
|
276
|
+
let overlap = 0;
|
|
277
|
+
for (const word of messageWords) {
|
|
278
|
+
if (taskWords.has(word))
|
|
279
|
+
overlap++;
|
|
280
|
+
}
|
|
281
|
+
// Normalize by the smaller set size to get Jaccard-like similarity
|
|
282
|
+
const similarity = overlap / Math.min(messageWords.size, taskWords.size);
|
|
283
|
+
return { reflection: r, similarity };
|
|
284
|
+
});
|
|
285
|
+
// Sort by similarity (descending), then by recency
|
|
286
|
+
scored.sort((a, b) => {
|
|
287
|
+
if (Math.abs(a.similarity - b.similarity) > 0.1) {
|
|
288
|
+
return b.similarity - a.similarity;
|
|
289
|
+
}
|
|
290
|
+
return new Date(b.reflection.created).getTime() - new Date(a.reflection.created).getTime();
|
|
291
|
+
});
|
|
292
|
+
// Return top N with any overlap, or most recent if no overlap
|
|
293
|
+
const withOverlap = scored.filter(s => s.similarity > 0);
|
|
294
|
+
if (withOverlap.length > 0) {
|
|
295
|
+
return withOverlap.slice(0, max).map(s => s.reflection);
|
|
296
|
+
}
|
|
297
|
+
// Fallback: most recent reflections (still useful for general lessons)
|
|
298
|
+
return reflections.slice(-max);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Format reflections for injection into the system prompt.
|
|
302
|
+
* Returns an empty string if no reflections exist.
|
|
303
|
+
*/
|
|
304
|
+
export function formatReflectionsForPrompt(reflections) {
|
|
305
|
+
if (reflections.length === 0)
|
|
306
|
+
return '';
|
|
307
|
+
const entries = reflections.map(r => {
|
|
308
|
+
const date = r.created.split('T')[0];
|
|
309
|
+
return `- [${date}] (${r.failureType}) ${r.lesson}`;
|
|
310
|
+
});
|
|
311
|
+
return `\n[Lessons from Past Failures]\n${entries.join('\n')}\nApply these lessons to avoid repeating past mistakes.\n`;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Detect if a user message indicates rejection of the previous response.
|
|
315
|
+
*/
|
|
316
|
+
export function isUserRejection(message) {
|
|
317
|
+
const lower = message.toLowerCase().trim();
|
|
318
|
+
// Direct negation/rejection
|
|
319
|
+
const rejectionPatterns = [
|
|
320
|
+
/^no[,.]?\s/,
|
|
321
|
+
/^wrong/,
|
|
322
|
+
/^that's not right/,
|
|
323
|
+
/^that's wrong/,
|
|
324
|
+
/^that's incorrect/,
|
|
325
|
+
/^incorrect/,
|
|
326
|
+
/^nope/,
|
|
327
|
+
/^not what i/,
|
|
328
|
+
/^not correct/,
|
|
329
|
+
/^you're wrong/,
|
|
330
|
+
/^you got it wrong/,
|
|
331
|
+
/^that doesn't work/,
|
|
332
|
+
/^that didn't work/,
|
|
333
|
+
/^this doesn't work/,
|
|
334
|
+
/^this is wrong/,
|
|
335
|
+
/^this is incorrect/,
|
|
336
|
+
/^actually,?\s+(?:no|that's not|it should|the answer is)/,
|
|
337
|
+
/^try again/,
|
|
338
|
+
/^redo/,
|
|
339
|
+
/^fix this/,
|
|
340
|
+
/^that broke/,
|
|
341
|
+
/^it's broken/,
|
|
342
|
+
/^still broken/,
|
|
343
|
+
/^still wrong/,
|
|
344
|
+
/^still not working/,
|
|
345
|
+
];
|
|
346
|
+
return rejectionPatterns.some(p => p.test(lower));
|
|
347
|
+
}
|
|
348
|
+
// ── Helpers ──
|
|
349
|
+
/** Extract meaningful words from a message for similarity matching */
|
|
350
|
+
function extractWords(text) {
|
|
351
|
+
const stopWords = new Set([
|
|
352
|
+
'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
|
|
353
|
+
'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
|
|
354
|
+
'should', 'may', 'might', 'can', 'shall', 'to', 'of', 'in', 'for',
|
|
355
|
+
'on', 'with', 'at', 'by', 'from', 'as', 'into', 'through', 'during',
|
|
356
|
+
'before', 'after', 'above', 'below', 'between', 'under', 'again',
|
|
357
|
+
'further', 'then', 'once', 'here', 'there', 'when', 'where', 'why',
|
|
358
|
+
'how', 'all', 'each', 'every', 'both', 'few', 'more', 'most', 'other',
|
|
359
|
+
'some', 'such', 'no', 'not', 'only', 'own', 'same', 'so', 'than',
|
|
360
|
+
'too', 'very', 'just', 'because', 'but', 'and', 'or', 'if', 'while',
|
|
361
|
+
'that', 'this', 'it', 'its', 'my', 'your', 'his', 'her', 'our',
|
|
362
|
+
'their', 'i', 'you', 'he', 'she', 'we', 'they', 'me', 'him', 'us',
|
|
363
|
+
'what', 'which', 'who', 'whom',
|
|
364
|
+
]);
|
|
365
|
+
const words = text.toLowerCase().match(/\b[a-z][a-z0-9_.-]+\b/g) || [];
|
|
366
|
+
return new Set(words.filter(w => w.length > 2 && !stopWords.has(w)));
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=reflection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflection.js","sourceRoot":"","sources":["../src/reflection.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,uEAAuE;AACvE,kDAAkD;AAClD,EAAE;AACF,YAAY;AACZ,kCAAkC;AAClC,uEAAuE;AACvE,gFAAgF;AAChF,EAAE;AACF,mEAAmE;AACnE,sFAAsF;AAEtF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAmB5E,gBAAgB;AAEhB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;AACrD,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAA;AAC7D,MAAM,eAAe,GAAG,GAAG,CAAA;AAE3B,SAAS,SAAS;IAChB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AACzE,CAAC;AAED,SAAS,eAAe;IACtB,SAAS,EAAE,CAAA;IACX,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,EAAE,CAAA;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAA;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,WAAyB;IAChD,SAAS,EAAE,CAAA;IACX,4CAA4C;IAC5C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAA;IACnD,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AACnE,CAAC;AAED,yCAAyC;AACzC,0EAA0E;AAE1E,SAAS,gBAAgB,CAAC,OAAe,EAAE,QAAgB;IACzD,MAAM,SAAS,GAAa,EAAE,CAAA;IAE9B,8BAA8B;IAC9B,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACpD,MAAM,YAAY,GAAG,uFAAuF,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAE1H,IAAI,YAAY,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,SAAS,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAA;IACxE,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,mDAAmD;QACnD,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,4BAA4B,CAAC,IAAI,EAAE,CAAA;QACrE,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;YAE/D,qBAAqB;YACrB,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;YACnD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;YACnD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjC,SAAS,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA;YAC7D,CAAC;YAED,2CAA2C;YAC3C,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAA;gBACrD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,EAAE,OAAO,CACjE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CACpE,IAAI,EAAE,CAAA;gBACP,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;oBACtC,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;oBACnC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,IAAI,EAAE,CAAC,CAAA;gBAC/G,CAAC,CAAC,CAAA;gBACF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,SAAS,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;gBACnE,CAAC;YACH,CAAC;QACH,CAAC;QAED,uCAAuC;QACvC,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,+CAA+C,CAAC,IAAI,EAAE,CAAA;QAC1F,IAAI,YAAY,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC7B,SAAS,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAA;QAC1E,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAClD,SAAS,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAA;IACrF,CAAC;IAED,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC;QACzB,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QACrB,CAAC,CAAC,8DAA8D,CAAA;AACpE,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe,EAAE,QAAgB;IAC5D,MAAM,SAAS,GAAa,EAAE,CAAA;IAE9B,6CAA6C;IAC7C,MAAM,aAAa,GAAG;QACpB,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,sCAAsC,EAAE;QACvE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,0CAA0C,EAAE;QAC1E,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,uCAAuC,EAAE;QAC3E,EAAE,OAAO,EAAE,uCAAuC,EAAE,KAAK,EAAE,4DAA4D,EAAE;QACzH,EAAE,OAAO,EAAE,gCAAgC,EAAE,KAAK,EAAE,mEAAmE,EAAE;QACzH,EAAE,OAAO,EAAE,mCAAmC,EAAE,KAAK,EAAE,2CAA2C,EAAE;QACpG,EAAE,OAAO,EAAE,wCAAwC,EAAE,KAAK,EAAE,gCAAgC,EAAE;QAC9F,EAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,4DAA4D,EAAE;KACpG,CAAA;IAED,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,aAAa,EAAE,CAAC;QAC/C,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IAED,oFAAoF;IACpF,IAAI,gEAAgE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACnF,IAAI,CAAC,uEAAuE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5F,SAAS,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAA;QACzF,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC;QACzB,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QACrB,CAAC,CAAC,8DAA8D,CAAA;AACpE,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe,EAAE,QAAgB;IAC3D,MAAM,SAAS,GAAa,EAAE,CAAA;IAE9B,gDAAgD;IAChD,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,gEAAgE,CAAC,IAAI,EAAE,CAAA;IACzH,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,CAAA;IAEpE,IAAI,UAAU,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACxC,iEAAiE;QACjE,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;QAChE,MAAM,WAAW,GAAG,2EAA2E,CAAA;QAC/F,IAAI,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACpC,SAAS,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAA;QAChG,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;IACrE,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC7D,SAAS,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,MAAM,sDAAsD,CAAC,CAAA;IAClG,CAAC;IAED,sDAAsD;IACtD,IAAI,oDAAoD,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvE,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,mFAAmF,CAAC,IAAI,EAAE,CAAA;QAC5H,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,SAAS,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAA;QAC/E,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,IAAI,gCAAgC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,gDAAgD,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtH,SAAS,CAAC,IAAI,CAAC,4FAA4F,CAAC,CAAA;IAC9G,CAAC;IAED,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC;QACzB,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QACrB,CAAC,CAAC,wEAAwE,CAAA;AAC9E,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe,EAAE,QAAgB;IAC9D,MAAM,SAAS,GAAa,EAAE,CAAA;IAE9B,6CAA6C;IAC7C,MAAM,aAAa,GAAG,mHAAmH,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAEvJ,IAAI,aAAa,EAAE,CAAC;QAClB,gDAAgD;QAChD,MAAM,WAAW,GAAG,iFAAiF,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACpH,MAAM,UAAU,GAAG,oCAAoC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACtE,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,EAAE,CAAC;YAChC,SAAS,CAAC,IAAI,CAAC,+FAA+F,CAAC,CAAA;QACjH,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,IAAI,2CAA2C,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/D,SAAS,CAAC,IAAI,CAAC,2FAA2F,CAAC,CAAA;IAC7G,CAAC;IAED,qDAAqD;IACrD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,4GAA4G,CAAC,CAAA;IAC/I,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAC1B,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACxD,SAAS,CAAC,IAAI,CAAC,oBAAoB,GAAG,4CAA4C,CAAC,CAAA;QACrF,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC;QACzB,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QACrB,CAAC,CAAC,4DAA4D,CAAA;AAClE,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,QAAgB;IAC1D,MAAM,SAAS,GAAa,EAAE,CAAA;IAE9B,kBAAkB;IAClB,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC3C,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC5C,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAE9C,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;YAChD,SAAS,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAA;QAC5F,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAA;IACtF,IAAI,aAAa,GAAG,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC/C,SAAS,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAA;IACpF,CAAC;IAED,uBAAuB;IACvB,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;IACtG,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAA;IAC1C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,eAAe,CAAC,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC1E,SAAS,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA;IAC7D,CAAC;IAED,sCAAsC;IACtC,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;IACvE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,SAAS,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAA;IACpE,CAAC;IAED,yBAAyB;IACzB,IAAI,iDAAiD,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QAC9F,SAAS,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAA;IAChF,CAAC;IAED,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC;QACzB,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QACrB,CAAC,CAAC,0DAA0D,CAAA;AAChE,CAAC;AAED,iBAAiB;AAEjB;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,QAAgB,EAChB,WAAgE;IAEhE,MAAM,YAAY,GAAkB;QAClC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;QACjE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;QACvE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;QACrE,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;QAC3E,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;KACpE,CAAA;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC,CAAA;IAC1C,MAAM,MAAM,GAAG,SAAS,CAAA;IAExB,MAAM,UAAU,GAAe;QAC7B,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QACjE,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QAClC,WAAW;QACX,YAAY;QACZ,SAAS;QACT,MAAM;QACN,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAClC,CAAA;IAED,UAAU;IACV,MAAM,WAAW,GAAG,eAAe,EAAE,CAAA;IACrC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC5B,eAAe,CAAC,WAAW,CAAC,CAAA;IAE5B,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,YAA2B;IAC7C,mEAAmE;IACnE,MAAM,cAAc,GAAG,mEAAmE,CAAA;IAC1F,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;IAE5E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,kHAAkH,CAAA;IAC3H,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC3D,CAAC;IAED,2FAA2F;IAC3F,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC9E,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAE9B,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,MAAc,CAAC;IACrE,MAAM,WAAW,GAAG,eAAe,EAAE,CAAA;IACrC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEvC,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IAC1C,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAA;IAE3D,oEAAoE;IACpE,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACjC,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;QAC7C,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,CAAA;QACpC,CAAC;QACD,mEAAmE;QACnE,MAAM,UAAU,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;QACxE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,mDAAmD;IACnD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,GAAG,EAAE,CAAC;YAChD,OAAO,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAA;QACpC,CAAC;QACD,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAA;IAC5F,CAAC,CAAC,CAAA;IAEF,8DAA8D;IAC9D,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAA;IACxD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;IACzD,CAAC;IAED,uEAAuE;IACvE,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAA;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,WAAyB;IAClE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEvC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAClC,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACpC,OAAO,MAAM,IAAI,MAAM,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,MAAM,EAAE,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,OAAO,mCAAmC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,2DAA2D,CAAA;AACzH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAA;IAE1C,4BAA4B;IAC5B,MAAM,iBAAiB,GAAG;QACxB,YAAY;QACZ,QAAQ;QACR,mBAAmB;QACnB,eAAe;QACf,mBAAmB;QACnB,YAAY;QACZ,OAAO;QACP,aAAa;QACb,cAAc;QACd,eAAe;QACf,mBAAmB;QACnB,oBAAoB;QACpB,mBAAmB;QACnB,oBAAoB;QACpB,gBAAgB;QAChB,oBAAoB;QACpB,yDAAyD;QACzD,YAAY;QACZ,OAAO;QACP,WAAW;QACX,aAAa;QACb,cAAc;QACd,eAAe;QACf,cAAc;QACd,oBAAoB;KACrB,CAAA;IAED,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;AACnD,CAAC;AAED,gBAAgB;AAEhB,sEAAsE;AACtE,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;QACxB,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO;QACnE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;QACnE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK;QACjE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ;QACnE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO;QAChE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK;QAClE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;QACrE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;QAChE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO;QACnE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;QAC9D,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;QACjE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;KAC/B,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAAI,EAAE,CAAA;IACtE,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACtE,CAAC"}
|
package/dist/serve.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AA2BA,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAuBD,wBAAsB,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAuOrE"}
|
package/dist/serve.js
CHANGED
|
@@ -15,9 +15,11 @@
|
|
|
15
15
|
import { createServer } from 'node:http';
|
|
16
16
|
import { createRequire } from 'node:module';
|
|
17
17
|
import { registerAllTools, getAllTools, executeTool, getToolDefinitionsForApi, getToolMetrics } from './tools/index.js';
|
|
18
|
+
import { extractMcpAppFromText, renderMcpApp, listAppCapableTools } from './mcp-apps.js';
|
|
18
19
|
import { printInfo, printSuccess } from './ui.js';
|
|
19
20
|
import { ResponseStream } from './streaming.js';
|
|
20
21
|
import { runAgent } from './agent.js';
|
|
22
|
+
import { mountA2ARoutes } from './a2a.js';
|
|
21
23
|
const __require = createRequire(import.meta.url);
|
|
22
24
|
const VERSION = __require('../package.json').version;
|
|
23
25
|
function cors(res) {
|
|
@@ -121,6 +123,12 @@ export async function startServe(options) {
|
|
|
121
123
|
res.end();
|
|
122
124
|
return;
|
|
123
125
|
}
|
|
126
|
+
// GET /apps — list MCP App-capable tools
|
|
127
|
+
if (path === '/apps' && req.method === 'GET') {
|
|
128
|
+
const appTools = listAppCapableTools();
|
|
129
|
+
json(res, 200, { tools: appTools, count: appTools.length });
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
124
132
|
// POST /execute — execute a tool
|
|
125
133
|
if (path === '/execute' && req.method === 'POST') {
|
|
126
134
|
const body = JSON.parse(await readBody(req));
|
|
@@ -134,6 +142,22 @@ export async function startServe(options) {
|
|
|
134
142
|
name,
|
|
135
143
|
arguments: args || {},
|
|
136
144
|
});
|
|
145
|
+
// Check for MCP App content in the result
|
|
146
|
+
const appResult = !result.error ? extractMcpAppFromText(result.result) : null;
|
|
147
|
+
if (appResult) {
|
|
148
|
+
const rendered = await renderMcpApp(appResult, { renderMode: 'inline', maxHtmlSize: 1_048_576, sandbox: true });
|
|
149
|
+
json(res, 200, {
|
|
150
|
+
result: rendered.text,
|
|
151
|
+
html: rendered.rendered,
|
|
152
|
+
title: appResult.title,
|
|
153
|
+
width: appResult.width,
|
|
154
|
+
height: appResult.height,
|
|
155
|
+
mcp_app: true,
|
|
156
|
+
error: false,
|
|
157
|
+
duration_ms: result.duration_ms,
|
|
158
|
+
});
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
137
161
|
json(res, result.error ? 500 : 200, {
|
|
138
162
|
result: result.result,
|
|
139
163
|
error: result.error || false,
|
|
@@ -157,6 +181,22 @@ export async function startServe(options) {
|
|
|
157
181
|
name: toolName,
|
|
158
182
|
arguments: args,
|
|
159
183
|
});
|
|
184
|
+
// Check for MCP App content in the result
|
|
185
|
+
const toolAppResult = !result.error ? extractMcpAppFromText(result.result) : null;
|
|
186
|
+
if (toolAppResult) {
|
|
187
|
+
const rendered = await renderMcpApp(toolAppResult, { renderMode: 'inline', maxHtmlSize: 1_048_576, sandbox: true });
|
|
188
|
+
json(res, 200, {
|
|
189
|
+
result: rendered.text,
|
|
190
|
+
html: rendered.rendered,
|
|
191
|
+
title: toolAppResult.title,
|
|
192
|
+
width: toolAppResult.width,
|
|
193
|
+
height: toolAppResult.height,
|
|
194
|
+
mcp_app: true,
|
|
195
|
+
error: false,
|
|
196
|
+
duration_ms: result.duration_ms,
|
|
197
|
+
});
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
160
200
|
json(res, result.error ? 500 : 200, {
|
|
161
201
|
result: result.result,
|
|
162
202
|
error: result.error || false,
|
|
@@ -171,14 +211,24 @@ export async function startServe(options) {
|
|
|
171
211
|
json(res, 500, { error: err instanceof Error ? err.message : 'Internal error' });
|
|
172
212
|
}
|
|
173
213
|
});
|
|
214
|
+
// Mount A2A protocol routes (Agent Card + task endpoints)
|
|
215
|
+
mountA2ARoutes(server, {
|
|
216
|
+
port: options.port,
|
|
217
|
+
endpointUrl: `http://localhost:${options.port}`,
|
|
218
|
+
token: options.token,
|
|
219
|
+
});
|
|
174
220
|
server.listen(options.port, () => {
|
|
175
221
|
printSuccess(`kbot serve running on http://localhost:${options.port}`);
|
|
176
|
-
printInfo(` GET /health
|
|
177
|
-
printInfo(` GET /tools
|
|
178
|
-
printInfo(` POST /execute
|
|
179
|
-
printInfo(` POST /stream
|
|
180
|
-
printInfo(` POST /tools/:name
|
|
181
|
-
printInfo(` GET /metrics
|
|
222
|
+
printInfo(` GET /health — Health check`);
|
|
223
|
+
printInfo(` GET /tools — List ${tools.length} tools`);
|
|
224
|
+
printInfo(` POST /execute — Execute a tool`);
|
|
225
|
+
printInfo(` POST /stream — SSE streaming agent`);
|
|
226
|
+
printInfo(` POST /tools/:name — Execute by name`);
|
|
227
|
+
printInfo(` GET /metrics — Execution metrics`);
|
|
228
|
+
printInfo(` GET /apps — List MCP App-capable tools`);
|
|
229
|
+
printInfo(` GET /.well-known/agent.json — A2A Agent Card`);
|
|
230
|
+
printInfo(` POST /a2a/tasks — A2A submit task`);
|
|
231
|
+
printInfo(` GET /a2a/tasks/:id — A2A task status`);
|
|
182
232
|
if (options.token) {
|
|
183
233
|
printInfo(` Auth: Bearer token required`);
|
|
184
234
|
}
|
package/dist/serve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,EAAE;AACF,SAAS;AACT,+DAA+D;AAC/D,gDAAgD;AAChD,uDAAuD;AACvD,EAAE;AACF,aAAa;AACb,yCAAyC;AACzC,qEAAqE;AACrE,mDAAmD;AACnD,0DAA0D;AAC1D,0DAA0D;AAC1D,mDAAmD;AAEnD,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAA;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACvH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAc,MAAM,SAAS,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export interface SkillStep {
|
|
2
|
+
tool: string;
|
|
3
|
+
argsTemplate: Record<string, unknown>;
|
|
4
|
+
}
|
|
5
|
+
export interface Skill {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
steps: SkillStep[];
|
|
10
|
+
/** Bag-of-words embedding for fast local matching (no API needed) */
|
|
11
|
+
embedding: number[];
|
|
12
|
+
successCount: number;
|
|
13
|
+
failureCount: number;
|
|
14
|
+
lastUsed: number;
|
|
15
|
+
created: number;
|
|
16
|
+
/** IDs of sub-skills this skill composes */
|
|
17
|
+
composedOf?: string[];
|
|
18
|
+
/** Original messages that produced this skill */
|
|
19
|
+
sourceMessages: string[];
|
|
20
|
+
/** Tags extracted from messages for keyword matching */
|
|
21
|
+
tags: string[];
|
|
22
|
+
}
|
|
23
|
+
export interface SkillLibrary {
|
|
24
|
+
version: number;
|
|
25
|
+
skills: Skill[];
|
|
26
|
+
vocabulary: string[];
|
|
27
|
+
}
|
|
28
|
+
/** Force-save immediately (call on exit) */
|
|
29
|
+
export declare function flushSkillLibrary(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Distill a skill from a successful tool execution.
|
|
32
|
+
* Called after every successful agent response with 2+ tool calls.
|
|
33
|
+
*/
|
|
34
|
+
export declare function distillSkill(message: string, toolSequence: Array<{
|
|
35
|
+
name: string;
|
|
36
|
+
args: Record<string, unknown>;
|
|
37
|
+
}>, success: boolean): Skill | null;
|
|
38
|
+
/**
|
|
39
|
+
* Retrieve relevant skills for a given task message.
|
|
40
|
+
* Uses embedding similarity (Ollama if available, else bag-of-words).
|
|
41
|
+
*/
|
|
42
|
+
export declare function retrieveSkills(message: string, maxResults?: number): Promise<Skill[]>;
|
|
43
|
+
/**
|
|
44
|
+
* Format retrieved skills for injection into the system prompt.
|
|
45
|
+
*/
|
|
46
|
+
export declare function formatSkillsForPrompt(skills: Skill[]): string;
|
|
47
|
+
/**
|
|
48
|
+
* Return the full skill library.
|
|
49
|
+
*/
|
|
50
|
+
export declare function getSkillLibrary(): SkillLibrary;
|
|
51
|
+
/**
|
|
52
|
+
* Prune the skill library: remove low-success skills, keep top 500.
|
|
53
|
+
* Sorting priority: successCount desc, then lastUsed desc.
|
|
54
|
+
*/
|
|
55
|
+
export declare function pruneSkillLibrary(): void;
|
|
56
|
+
/**
|
|
57
|
+
* Record a failure for a skill (called when a retrieved skill's tool chain fails).
|
|
58
|
+
*/
|
|
59
|
+
export declare function recordSkillFailure(skillId: string): void;
|
|
60
|
+
//# sourceMappingURL=skill-library.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-library.d.ts","sourceRoot":"","sources":["../src/skill-library.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACtC;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,qEAAqE;IACrE,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,iDAAiD;IACjD,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,wDAAwD;IACxD,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB;AAuDD,4CAA4C;AAC5C,wBAAgB,iBAAiB,IAAI,IAAI,CASxC;AAwGD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,EACpE,OAAO,EAAE,OAAO,GACf,KAAK,GAAG,IAAI,CAiEd;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,MAAU,GACrB,OAAO,CAAC,KAAK,EAAE,CAAC,CA2ClB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAiB7D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CA8BxC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAOxD"}
|