@kernel.chat/kbot 2.9.1 → 2.10.1
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/README.md +5 -5
- package/dist/agent.js +1 -1
- package/dist/agent.js.map +1 -1
- package/dist/cli.js +221 -24
- package/dist/cli.js.map +1 -1
- package/dist/context-manager.d.ts.map +1 -1
- package/dist/context-manager.js +31 -5
- package/dist/context-manager.js.map +1 -1
- package/dist/context-manager.test.d.ts +2 -0
- package/dist/context-manager.test.d.ts.map +1 -0
- package/dist/context-manager.test.js +121 -0
- package/dist/context-manager.test.js.map +1 -0
- package/dist/export.d.ts +20 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +301 -0
- package/dist/export.js.map +1 -0
- package/dist/ide/acp-server.js +2 -2
- package/dist/ide/acp-server.js.map +1 -1
- package/dist/marketplace.d.ts +25 -0
- package/dist/marketplace.d.ts.map +1 -0
- package/dist/marketplace.js +327 -0
- package/dist/marketplace.js.map +1 -0
- package/dist/rate-limiter.d.ts +45 -0
- package/dist/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limiter.js +200 -0
- package/dist/rate-limiter.js.map +1 -0
- package/dist/sessions.test.d.ts +2 -0
- package/dist/sessions.test.d.ts.map +1 -0
- package/dist/sessions.test.js +55 -0
- package/dist/sessions.test.js.map +1 -0
- package/dist/streaming.d.ts.map +1 -1
- package/dist/streaming.js +87 -24
- package/dist/streaming.js.map +1 -1
- package/dist/streaming.test.d.ts +2 -0
- package/dist/streaming.test.d.ts.map +1 -0
- package/dist/streaming.test.js +41 -0
- package/dist/streaming.test.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/test-runner.d.ts +2 -0
- package/dist/tools/test-runner.d.ts.map +1 -0
- package/dist/tools/test-runner.js +550 -0
- package/dist/tools/test-runner.js.map +1 -0
- package/dist/ui.js +1 -1
- package/dist/voice.d.ts +25 -0
- package/dist/voice.d.ts.map +1 -0
- package/dist/voice.js +336 -0
- package/dist/voice.js.map +1 -0
- package/dist/watch.d.ts +37 -0
- package/dist/watch.d.ts.map +1 -0
- package/dist/watch.js +369 -0
- package/dist/watch.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import { existsSync, writeFileSync, readFileSync, mkdirSync, rmSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { execSync } from 'node:child_process';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
const PLUGINS_DIR = join(homedir(), '.kbot', 'plugins');
|
|
7
|
+
const REGISTRY_URL = 'https://raw.githubusercontent.com/isaacsight/kbot-plugins/main/registry.json';
|
|
8
|
+
const INSTALLED_MANIFEST = join(homedir(), '.kbot', 'plugins', '.installed.json');
|
|
9
|
+
function ensurePluginsDir() {
|
|
10
|
+
if (!existsSync(PLUGINS_DIR)) {
|
|
11
|
+
mkdirSync(PLUGINS_DIR, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function readManifest() {
|
|
15
|
+
if (!existsSync(INSTALLED_MANIFEST)) {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const raw = readFileSync(INSTALLED_MANIFEST, 'utf-8');
|
|
20
|
+
return JSON.parse(raw);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function writeManifest(plugins) {
|
|
27
|
+
ensurePluginsDir();
|
|
28
|
+
writeFileSync(INSTALLED_MANIFEST, JSON.stringify(plugins, null, 2), 'utf-8');
|
|
29
|
+
}
|
|
30
|
+
function addToManifest(plugin) {
|
|
31
|
+
const plugins = readManifest();
|
|
32
|
+
const idx = plugins.findIndex(p => p.name === plugin.name);
|
|
33
|
+
if (idx >= 0) {
|
|
34
|
+
plugins[idx] = plugin;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
plugins.push(plugin);
|
|
38
|
+
}
|
|
39
|
+
writeManifest(plugins);
|
|
40
|
+
}
|
|
41
|
+
function removeFromManifest(name) {
|
|
42
|
+
const plugins = readManifest();
|
|
43
|
+
const idx = plugins.findIndex(p => p.name === name);
|
|
44
|
+
if (idx < 0)
|
|
45
|
+
return false;
|
|
46
|
+
plugins.splice(idx, 1);
|
|
47
|
+
writeManifest(plugins);
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
export async function searchPlugins(query) {
|
|
51
|
+
try {
|
|
52
|
+
const res = await fetch(REGISTRY_URL);
|
|
53
|
+
if (!res.ok) {
|
|
54
|
+
console.error(chalk.yellow(`Registry returned ${res.status}. The plugin registry may be temporarily unavailable.`));
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
const registry = (await res.json());
|
|
58
|
+
const q = query.toLowerCase();
|
|
59
|
+
return registry.filter(entry => {
|
|
60
|
+
const nameMatch = entry.name.toLowerCase().includes(q);
|
|
61
|
+
const descMatch = entry.description.toLowerCase().includes(q);
|
|
62
|
+
const tagMatch = entry.tags.some(tag => tag.toLowerCase().includes(q));
|
|
63
|
+
return nameMatch || descMatch || tagMatch;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
68
|
+
console.error(chalk.yellow(`Could not reach plugin registry: ${message}`));
|
|
69
|
+
console.error(chalk.dim('Check your network connection or try again later.'));
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export async function installPlugin(nameOrUrl) {
|
|
74
|
+
ensurePluginsDir();
|
|
75
|
+
const isNpm = nameOrUrl.startsWith('@') || !nameOrUrl.includes('/');
|
|
76
|
+
const isGitHub = nameOrUrl.includes('github.com') || (!isNpm && nameOrUrl.match(/^[a-zA-Z0-9_-]+\/[a-zA-Z0-9_.-]+$/));
|
|
77
|
+
if (isGitHub) {
|
|
78
|
+
return installFromGitHub(nameOrUrl);
|
|
79
|
+
}
|
|
80
|
+
return installFromNpm(nameOrUrl);
|
|
81
|
+
}
|
|
82
|
+
async function installFromNpm(packageName) {
|
|
83
|
+
console.log(chalk.dim(`Installing ${packageName} from npm...`));
|
|
84
|
+
try {
|
|
85
|
+
execSync(`npm install --prefix "${PLUGINS_DIR}" ${packageName}`, {
|
|
86
|
+
stdio: 'pipe',
|
|
87
|
+
timeout: 120_000,
|
|
88
|
+
});
|
|
89
|
+
const cleanName = packageName.replace(/@[^/]*$/, ''); // strip version specifier if any
|
|
90
|
+
const pkgDir = join(PLUGINS_DIR, 'node_modules', cleanName);
|
|
91
|
+
let version = 'unknown';
|
|
92
|
+
const pkgJsonPath = join(pkgDir, 'package.json');
|
|
93
|
+
if (existsSync(pkgJsonPath)) {
|
|
94
|
+
try {
|
|
95
|
+
const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
|
|
96
|
+
version = pkgJson.version || 'unknown';
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// version stays unknown
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const plugin = {
|
|
103
|
+
name: cleanName,
|
|
104
|
+
version,
|
|
105
|
+
source: 'npm',
|
|
106
|
+
installedAt: new Date().toISOString(),
|
|
107
|
+
path: pkgDir,
|
|
108
|
+
};
|
|
109
|
+
addToManifest(plugin);
|
|
110
|
+
console.log(chalk.green(`Installed ${cleanName}@${version} from npm`));
|
|
111
|
+
return plugin;
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
const message = err instanceof Error ? err.stderr?.toString() || err.message : String(err);
|
|
115
|
+
throw new Error(`Failed to install ${packageName} from npm:\n${message}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async function installFromGitHub(repoRef) {
|
|
119
|
+
let repo = repoRef;
|
|
120
|
+
// Extract user/repo from full URL
|
|
121
|
+
const urlMatch = repoRef.match(/github\.com\/([^/]+\/[^/]+?)(?:\.git)?(?:\/|$)/);
|
|
122
|
+
if (urlMatch) {
|
|
123
|
+
repo = urlMatch[1];
|
|
124
|
+
}
|
|
125
|
+
const repoName = repo.split('/')[1] || repo;
|
|
126
|
+
const cloneDir = join(PLUGINS_DIR, repoName);
|
|
127
|
+
console.log(chalk.dim(`Installing ${repo} from GitHub...`));
|
|
128
|
+
// Remove existing clone if present
|
|
129
|
+
if (existsSync(cloneDir)) {
|
|
130
|
+
rmSync(cloneDir, { recursive: true, force: true });
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
const cloneUrl = repoRef.includes('github.com') ? repoRef : `https://github.com/${repo}.git`;
|
|
134
|
+
execSync(`git clone --depth 1 "${cloneUrl}" "${cloneDir}"`, {
|
|
135
|
+
stdio: 'pipe',
|
|
136
|
+
timeout: 120_000,
|
|
137
|
+
});
|
|
138
|
+
let version = 'unknown';
|
|
139
|
+
const pkgJsonPath = join(cloneDir, 'package.json');
|
|
140
|
+
if (existsSync(pkgJsonPath)) {
|
|
141
|
+
try {
|
|
142
|
+
const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
|
|
143
|
+
version = pkgJson.version || 'unknown';
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// version stays unknown
|
|
147
|
+
}
|
|
148
|
+
// Install dependencies if package.json exists
|
|
149
|
+
try {
|
|
150
|
+
execSync(`npm install --prefix "${cloneDir}"`, {
|
|
151
|
+
stdio: 'pipe',
|
|
152
|
+
timeout: 120_000,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
console.warn(chalk.yellow(`Warning: npm install failed for ${repoName}. Plugin may not work correctly.`));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const plugin = {
|
|
160
|
+
name: repoName,
|
|
161
|
+
version,
|
|
162
|
+
source: 'github',
|
|
163
|
+
installedAt: new Date().toISOString(),
|
|
164
|
+
path: cloneDir,
|
|
165
|
+
};
|
|
166
|
+
addToManifest(plugin);
|
|
167
|
+
console.log(chalk.green(`Installed ${repoName}@${version} from GitHub (${repo})`));
|
|
168
|
+
return plugin;
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
172
|
+
throw new Error(`Failed to clone ${repo} from GitHub:\n${message}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
export function uninstallPlugin(name) {
|
|
176
|
+
const plugins = readManifest();
|
|
177
|
+
const plugin = plugins.find(p => p.name === name);
|
|
178
|
+
if (!plugin) {
|
|
179
|
+
console.error(chalk.yellow(`Plugin "${name}" is not installed via marketplace.`));
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
// Remove files
|
|
183
|
+
if (existsSync(plugin.path)) {
|
|
184
|
+
try {
|
|
185
|
+
if (plugin.source === 'npm') {
|
|
186
|
+
execSync(`npm uninstall --prefix "${PLUGINS_DIR}" ${plugin.name}`, {
|
|
187
|
+
stdio: 'pipe',
|
|
188
|
+
timeout: 60_000,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
rmSync(plugin.path, { recursive: true, force: true });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
197
|
+
console.warn(chalk.yellow(`Warning: Could not fully clean up files for ${name}: ${message}`));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
removeFromManifest(name);
|
|
201
|
+
console.log(chalk.green(`Uninstalled ${name}`));
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
export function listInstalled() {
|
|
205
|
+
return readManifest();
|
|
206
|
+
}
|
|
207
|
+
export async function updatePlugin(name) {
|
|
208
|
+
const plugins = readManifest();
|
|
209
|
+
const plugin = plugins.find(p => p.name === name);
|
|
210
|
+
if (!plugin) {
|
|
211
|
+
console.error(chalk.yellow(`Plugin "${name}" is not installed via marketplace.`));
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
if (plugin.source === 'npm') {
|
|
215
|
+
console.log(chalk.dim(`Updating ${name} from npm...`));
|
|
216
|
+
try {
|
|
217
|
+
execSync(`npm update --prefix "${PLUGINS_DIR}" ${plugin.name}`, {
|
|
218
|
+
stdio: 'pipe',
|
|
219
|
+
timeout: 120_000,
|
|
220
|
+
});
|
|
221
|
+
let version = plugin.version;
|
|
222
|
+
const pkgJsonPath = join(plugin.path, 'package.json');
|
|
223
|
+
if (existsSync(pkgJsonPath)) {
|
|
224
|
+
try {
|
|
225
|
+
const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
|
|
226
|
+
version = pkgJson.version || version;
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
// keep existing version
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
const updated = {
|
|
233
|
+
...plugin,
|
|
234
|
+
version,
|
|
235
|
+
installedAt: new Date().toISOString(),
|
|
236
|
+
};
|
|
237
|
+
addToManifest(updated);
|
|
238
|
+
console.log(chalk.green(`Updated ${name} to ${version}`));
|
|
239
|
+
return updated;
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
243
|
+
console.error(chalk.red(`Failed to update ${name}: ${message}`));
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (plugin.source === 'github') {
|
|
248
|
+
console.log(chalk.dim(`Updating ${name} from GitHub...`));
|
|
249
|
+
try {
|
|
250
|
+
execSync(`git -C "${plugin.path}" pull --ff-only`, {
|
|
251
|
+
stdio: 'pipe',
|
|
252
|
+
timeout: 60_000,
|
|
253
|
+
});
|
|
254
|
+
// Reinstall dependencies
|
|
255
|
+
const pkgJsonPath = join(plugin.path, 'package.json');
|
|
256
|
+
let version = plugin.version;
|
|
257
|
+
if (existsSync(pkgJsonPath)) {
|
|
258
|
+
try {
|
|
259
|
+
execSync(`npm install --prefix "${plugin.path}"`, {
|
|
260
|
+
stdio: 'pipe',
|
|
261
|
+
timeout: 120_000,
|
|
262
|
+
});
|
|
263
|
+
const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
|
|
264
|
+
version = pkgJson.version || version;
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
console.warn(chalk.yellow(`Warning: npm install failed after update for ${name}.`));
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
const updated = {
|
|
271
|
+
...plugin,
|
|
272
|
+
version,
|
|
273
|
+
installedAt: new Date().toISOString(),
|
|
274
|
+
};
|
|
275
|
+
addToManifest(updated);
|
|
276
|
+
console.log(chalk.green(`Updated ${name} to ${version}`));
|
|
277
|
+
return updated;
|
|
278
|
+
}
|
|
279
|
+
catch (err) {
|
|
280
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
281
|
+
console.error(chalk.red(`Failed to update ${name}: ${message}`));
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
console.error(chalk.yellow(`Cannot update locally-installed plugin "${name}". Remove and reinstall manually.`));
|
|
286
|
+
return null;
|
|
287
|
+
}
|
|
288
|
+
export function formatRegistryResults(entries) {
|
|
289
|
+
if (entries.length === 0) {
|
|
290
|
+
return chalk.dim('No plugins found.');
|
|
291
|
+
}
|
|
292
|
+
const lines = [
|
|
293
|
+
chalk.bold('Plugin Registry Results'),
|
|
294
|
+
chalk.dim('─'.repeat(60)),
|
|
295
|
+
];
|
|
296
|
+
for (const entry of entries) {
|
|
297
|
+
const source = entry.npm ? chalk.cyan('npm') : entry.github ? chalk.magenta('github') : chalk.dim('unknown');
|
|
298
|
+
const downloads = entry.downloads != null ? chalk.dim(` (${entry.downloads.toLocaleString()} downloads)`) : '';
|
|
299
|
+
lines.push(` ${chalk.bold(entry.name)} ${chalk.dim(`v${entry.version}`)} ${source}${downloads}`, ` ${entry.description}`, ` ${chalk.dim(`by ${entry.author}`)} ${entry.tags.map(t => chalk.dim(`#${t}`)).join(' ')}`, '');
|
|
300
|
+
}
|
|
301
|
+
lines.push(chalk.dim(`${entries.length} plugin${entries.length === 1 ? '' : 's'} found`));
|
|
302
|
+
return lines.join('\n');
|
|
303
|
+
}
|
|
304
|
+
export function formatInstalledList(plugins) {
|
|
305
|
+
if (plugins.length === 0) {
|
|
306
|
+
return chalk.dim('No plugins installed via marketplace.');
|
|
307
|
+
}
|
|
308
|
+
const lines = [
|
|
309
|
+
chalk.bold('Installed Plugins'),
|
|
310
|
+
chalk.dim('─'.repeat(60)),
|
|
311
|
+
];
|
|
312
|
+
for (const plugin of plugins) {
|
|
313
|
+
const sourceLabel = plugin.source === 'npm' ? chalk.cyan('npm') :
|
|
314
|
+
plugin.source === 'github' ? chalk.magenta('github') :
|
|
315
|
+
chalk.dim('local');
|
|
316
|
+
const installedDate = new Date(plugin.installedAt);
|
|
317
|
+
const dateStr = installedDate.toLocaleDateString('en-US', {
|
|
318
|
+
year: 'numeric',
|
|
319
|
+
month: 'short',
|
|
320
|
+
day: 'numeric',
|
|
321
|
+
});
|
|
322
|
+
lines.push(` ${chalk.bold(plugin.name)} ${chalk.dim(`v${plugin.version}`)} ${sourceLabel}`, ` ${chalk.dim(`installed ${dateStr}`)} ${chalk.dim(plugin.path)}`, '');
|
|
323
|
+
}
|
|
324
|
+
lines.push(chalk.dim(`${plugins.length} plugin${plugins.length === 1 ? '' : 's'} installed`));
|
|
325
|
+
return lines.join('\n');
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=marketplace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace.js","sourceRoot":"","sources":["../src/marketplace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAc,MAAM,EAAE,MAAM,SAAS,CAAA;AAChG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;AACvD,MAAM,YAAY,GAAG,8EAA8E,CAAA;AACnG,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAA;AAqBjF,SAAS,gBAAgB;IACvB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,CAAA;IACX,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAA;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAA;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAA0B;IAC/C,gBAAgB,EAAE,CAAA;IAClB,aAAa,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;AAC9E,CAAC;AAED,SAAS,aAAa,CAAC,MAAuB;IAC5C,MAAM,OAAO,GAAG,YAAY,EAAE,CAAA;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1D,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAA;IACvB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACtB,CAAC;IACD,aAAa,CAAC,OAAO,CAAC,CAAA;AACxB,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAA;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IACnD,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,KAAK,CAAA;IACzB,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IACtB,aAAa,CAAC,OAAO,CAAC,CAAA;IACtB,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,CAAA;QACrC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,GAAG,CAAC,MAAM,uDAAuD,CAAC,CAAC,CAAA;YACnH,OAAO,EAAE,CAAA;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoB,CAAA;QACtD,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;QAC7B,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACtD,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;YACtE,OAAO,SAAS,IAAI,SAAS,IAAI,QAAQ,CAAA;QAC3C,CAAC,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,oCAAoC,OAAO,EAAE,CAAC,CAAC,CAAA;QAC1E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAA;QAC7E,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAiB;IACnD,gBAAgB,EAAE,CAAA;IAElB,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IACnE,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAA;IAErH,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAA;IACrC,CAAC;IACD,OAAO,cAAc,CAAC,SAAS,CAAC,CAAA;AAClC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,WAAmB;IAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,WAAW,cAAc,CAAC,CAAC,CAAA;IAC/D,IAAI,CAAC;QACH,QAAQ,CAAC,yBAAyB,WAAW,KAAK,WAAW,EAAE,EAAE;YAC/D,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,OAAO;SACjB,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA,CAAC,iCAAiC;QACtF,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,SAAS,CAAC,CAAA;QAC3D,IAAI,OAAO,GAAG,SAAS,CAAA;QAEvB,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;QAChD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;gBAC9D,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,SAAS,CAAA;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAoB;YAC9B,IAAI,EAAE,SAAS;YACf,OAAO;YACP,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,IAAI,EAAE,MAAM;SACb,CAAA;QAED,aAAa,CAAC,MAAM,CAAC,CAAA;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,SAAS,IAAI,OAAO,WAAW,CAAC,CAAC,CAAA;QACtE,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAE,GAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACnG,MAAM,IAAI,KAAK,CAAC,qBAAqB,WAAW,eAAe,OAAO,EAAE,CAAC,CAAA;IAC3E,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,OAAe;IAC9C,IAAI,IAAI,GAAG,OAAO,CAAA;IAClB,kCAAkC;IAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAA;IAChF,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;IAE5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,IAAI,iBAAiB,CAAC,CAAC,CAAA;IAE3D,mCAAmC;IACnC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACpD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,IAAI,MAAM,CAAA;QAC5F,QAAQ,CAAC,wBAAwB,QAAQ,MAAM,QAAQ,GAAG,EAAE;YAC1D,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,OAAO;SACjB,CAAC,CAAA;QAEF,IAAI,OAAO,GAAG,SAAS,CAAA;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;QAClD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;gBAC9D,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,SAAS,CAAA;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;YAED,8CAA8C;YAC9C,IAAI,CAAC;gBACH,QAAQ,CAAC,yBAAyB,QAAQ,GAAG,EAAE;oBAC7C,KAAK,EAAE,MAAM;oBACb,OAAO,EAAE,OAAO;iBACjB,CAAC,CAAA;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mCAAmC,QAAQ,kCAAkC,CAAC,CAAC,CAAA;YAC3G,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAoB;YAC9B,IAAI,EAAE,QAAQ;YACd,OAAO;YACP,MAAM,EAAE,QAAQ;YAChB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,IAAI,EAAE,QAAQ;SACf,CAAA;QAED,aAAa,CAAC,MAAM,CAAC,CAAA;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,QAAQ,IAAI,OAAO,iBAAiB,IAAI,GAAG,CAAC,CAAC,CAAA;QAClF,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,kBAAkB,OAAO,EAAE,CAAC,CAAA;IACrE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,OAAO,GAAG,YAAY,EAAE,CAAA;IAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IAEjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,IAAI,qCAAqC,CAAC,CAAC,CAAA;QACjF,OAAO,KAAK,CAAA;IACd,CAAC;IAED,eAAe;IACf,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC5B,QAAQ,CAAC,2BAA2B,WAAW,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE;oBACjE,KAAK,EAAE,MAAM;oBACb,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YACvD,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAChE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,+CAA+C,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC,CAAA;QAC/F,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,IAAI,CAAC,CAAA;IACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,CAAA;IAC/C,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,YAAY,EAAE,CAAA;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,MAAM,OAAO,GAAG,YAAY,EAAE,CAAA;IAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IAEjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,IAAI,qCAAqC,CAAC,CAAC,CAAA;QACjF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,cAAc,CAAC,CAAC,CAAA;QACtD,IAAI,CAAC;YACH,QAAQ,CAAC,wBAAwB,WAAW,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE;gBAC9D,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,OAAO;aACjB,CAAC,CAAA;YAEF,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;YAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;YACrD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;oBAC9D,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAA;gBACtC,CAAC;gBAAC,MAAM,CAAC;oBACP,wBAAwB;gBAC1B,CAAC;YACH,CAAC;YAED,MAAM,OAAO,GAAoB;gBAC/B,GAAG,MAAM;gBACT,OAAO;gBACP,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAA;YACD,aAAa,CAAC,OAAO,CAAC,CAAA;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,IAAI,OAAO,OAAO,EAAE,CAAC,CAAC,CAAA;YACzD,OAAO,OAAO,CAAA;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAChE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC,CAAA;YAChE,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,iBAAiB,CAAC,CAAC,CAAA;QACzD,IAAI,CAAC;YACH,QAAQ,CAAC,WAAW,MAAM,CAAC,IAAI,kBAAkB,EAAE;gBACjD,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,MAAM;aAChB,CAAC,CAAA;YAEF,yBAAyB;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;YACrD,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;YAC5B,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACH,QAAQ,CAAC,yBAAyB,MAAM,CAAC,IAAI,GAAG,EAAE;wBAChD,KAAK,EAAE,MAAM;wBACb,OAAO,EAAE,OAAO;qBACjB,CAAC,CAAA;oBACF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;oBAC9D,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAA;gBACtC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gDAAgD,IAAI,GAAG,CAAC,CAAC,CAAA;gBACrF,CAAC;YACH,CAAC;YAED,MAAM,OAAO,GAAoB;gBAC/B,GAAG,MAAM;gBACT,OAAO;gBACP,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAA;YACD,aAAa,CAAC,OAAO,CAAC,CAAA;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,IAAI,OAAO,OAAO,EAAE,CAAC,CAAC,CAAA;YACzD,OAAO,OAAO,CAAA;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAChE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC,CAAA;YAChE,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,2CAA2C,IAAI,mCAAmC,CAAC,CAAC,CAAA;IAC/G,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAwB;IAC5D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;IACvC,CAAC;IAED,MAAM,KAAK,GAAa;QACtB,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC;QACrC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;KAC1B,CAAA;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5G,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC9G,KAAK,CAAC,IAAI,CACR,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,MAAM,GAAG,SAAS,EAAE,EACrF,KAAK,KAAK,CAAC,WAAW,EAAE,EACxB,KAAK,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAC5F,EAAE,CACH,CAAA;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,UAAU,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAA;IACzF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAA0B;IAC5D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAA;IAC3D,CAAC;IAED,MAAM,KAAK,GAAa;QACtB,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC;QAC/B,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;KAC1B,CAAA;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,WAAW,GACf,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACtD,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAEpB,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QAClD,MAAM,OAAO,GAAG,aAAa,CAAC,kBAAkB,CAAC,OAAO,EAAE;YACxD,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,OAAO;YACd,GAAG,EAAE,SAAS;SACf,CAAC,CAAA;QAEF,KAAK,CAAC,IAAI,CACR,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,WAAW,EAAE,EAChF,KAAK,KAAK,CAAC,GAAG,CAAC,aAAa,OAAO,EAAE,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EACnE,EAAE,CACH,CAAA;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,UAAU,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAA;IAC7F,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if a request is allowed for the given provider.
|
|
3
|
+
* Returns whether the request can proceed, how long to wait if not, and an optional reason.
|
|
4
|
+
*/
|
|
5
|
+
export declare function checkRateLimit(provider: string): {
|
|
6
|
+
allowed: boolean;
|
|
7
|
+
waitMs: number;
|
|
8
|
+
reason?: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Record a completed request, consuming tokens from the bucket and incrementing RPM count.
|
|
12
|
+
*/
|
|
13
|
+
export declare function recordRequest(provider: string, tokens: number): void;
|
|
14
|
+
/**
|
|
15
|
+
* Record a 429 rate limit response. Sets retry-after with exponential backoff.
|
|
16
|
+
*/
|
|
17
|
+
export declare function recordRateLimit(provider: string, retryAfterMs?: number): void;
|
|
18
|
+
/**
|
|
19
|
+
* Wait until the rate limit clears for the given provider.
|
|
20
|
+
* Prints a progress message to stderr while waiting.
|
|
21
|
+
*/
|
|
22
|
+
export declare function waitForRateLimit(provider: string): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Get the current rate limit status for a provider.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getRateLimitStatus(provider: string): {
|
|
27
|
+
rpm: {
|
|
28
|
+
used: number;
|
|
29
|
+
limit: number;
|
|
30
|
+
};
|
|
31
|
+
tpm: {
|
|
32
|
+
used: number;
|
|
33
|
+
limit: number;
|
|
34
|
+
};
|
|
35
|
+
blocked: boolean;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Format all active providers' rate limit status for display.
|
|
39
|
+
*/
|
|
40
|
+
export declare function formatRateLimitStatus(): string;
|
|
41
|
+
/**
|
|
42
|
+
* Reset all rate limit state. Useful for testing or manual recovery.
|
|
43
|
+
*/
|
|
44
|
+
export declare function resetRateLimits(): void;
|
|
45
|
+
//# sourceMappingURL=rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"AA+FA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAgCtG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAgBpE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAc7E;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CActE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACpD,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,OAAO,EAAE,OAAO,CAAA;CACjB,CAiBA;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAyB9C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAGtC"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
/** Known rate limits per provider (requests per minute) */
|
|
3
|
+
const PROVIDER_LIMITS = {
|
|
4
|
+
anthropic: { rpm: 50, tpm: 100_000 },
|
|
5
|
+
openai: { rpm: 60, tpm: 150_000 },
|
|
6
|
+
google: { rpm: 60, tpm: 120_000 },
|
|
7
|
+
groq: { rpm: 30, tpm: 30_000 },
|
|
8
|
+
xai: { rpm: 60, tpm: 100_000 },
|
|
9
|
+
deepseek: { rpm: 60, tpm: 100_000 },
|
|
10
|
+
mistral: { rpm: 30, tpm: 60_000 },
|
|
11
|
+
perplexity: { rpm: 20, tpm: 30_000 },
|
|
12
|
+
together: { rpm: 60, tpm: 100_000 },
|
|
13
|
+
fireworks: { rpm: 60, tpm: 100_000 },
|
|
14
|
+
cohere: { rpm: 40, tpm: 60_000 },
|
|
15
|
+
openrouter: { rpm: 60, tpm: 150_000 },
|
|
16
|
+
ollama: { rpm: 999, tpm: 999_999 }, // local, no real limit
|
|
17
|
+
lmstudio: { rpm: 999, tpm: 999_999 },
|
|
18
|
+
jan: { rpm: 999, tpm: 999_999 },
|
|
19
|
+
openclaw: { rpm: 999, tpm: 999_999 },
|
|
20
|
+
};
|
|
21
|
+
const WINDOW_MS = 60_000; // 1 minute sliding window
|
|
22
|
+
const MAX_BACKOFF_MS = 60_000;
|
|
23
|
+
const DEBUG = process.env.KBOT_DEBUG === '1' || process.env.KBOT_DEBUG === 'true';
|
|
24
|
+
/** In-memory rate limit state per provider */
|
|
25
|
+
const state = new Map();
|
|
26
|
+
function getProviderLimits(provider) {
|
|
27
|
+
return PROVIDER_LIMITS[provider.toLowerCase()] ?? { rpm: 60, tpm: 100_000 };
|
|
28
|
+
}
|
|
29
|
+
function getOrCreateState(provider) {
|
|
30
|
+
const key = provider.toLowerCase();
|
|
31
|
+
let s = state.get(key);
|
|
32
|
+
if (!s) {
|
|
33
|
+
const limits = getProviderLimits(key);
|
|
34
|
+
s = {
|
|
35
|
+
bucket: {
|
|
36
|
+
tokens: limits.tpm,
|
|
37
|
+
lastRefill: Date.now(),
|
|
38
|
+
maxTokens: limits.tpm,
|
|
39
|
+
refillRate: limits.tpm / 60, // tokens per second
|
|
40
|
+
},
|
|
41
|
+
requestCount: 0,
|
|
42
|
+
windowStart: Date.now(),
|
|
43
|
+
consecutiveErrors: 0,
|
|
44
|
+
};
|
|
45
|
+
state.set(key, s);
|
|
46
|
+
}
|
|
47
|
+
return s;
|
|
48
|
+
}
|
|
49
|
+
/** Refill the token bucket based on elapsed time */
|
|
50
|
+
function refillBucket(bucket) {
|
|
51
|
+
const now = Date.now();
|
|
52
|
+
const elapsed = (now - bucket.lastRefill) / 1000; // seconds
|
|
53
|
+
const refill = Math.floor(elapsed * bucket.refillRate);
|
|
54
|
+
if (refill > 0) {
|
|
55
|
+
bucket.tokens = Math.min(bucket.maxTokens, bucket.tokens + refill);
|
|
56
|
+
bucket.lastRefill = now;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Slide the RPM window forward, resetting count if window expired */
|
|
60
|
+
function slideWindow(s) {
|
|
61
|
+
const now = Date.now();
|
|
62
|
+
if (now - s.windowStart >= WINDOW_MS) {
|
|
63
|
+
s.requestCount = 0;
|
|
64
|
+
s.windowStart = now;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function debugLog(msg) {
|
|
68
|
+
if (DEBUG) {
|
|
69
|
+
process.stderr.write(chalk.dim(`[rate-limiter] ${msg}\n`));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Check if a request is allowed for the given provider.
|
|
74
|
+
* Returns whether the request can proceed, how long to wait if not, and an optional reason.
|
|
75
|
+
*/
|
|
76
|
+
export function checkRateLimit(provider) {
|
|
77
|
+
const s = getOrCreateState(provider);
|
|
78
|
+
const limits = getProviderLimits(provider);
|
|
79
|
+
const now = Date.now();
|
|
80
|
+
// Check retry-after from a previous 429
|
|
81
|
+
if (s.retryAfter && now < s.retryAfter) {
|
|
82
|
+
const waitMs = s.retryAfter - now;
|
|
83
|
+
debugLog(`${provider}: blocked by retryAfter, wait ${waitMs}ms`);
|
|
84
|
+
return { allowed: false, waitMs, reason: `Rate limited by ${provider}, retry in ${Math.ceil(waitMs / 1000)}s` };
|
|
85
|
+
}
|
|
86
|
+
// Slide the RPM window
|
|
87
|
+
slideWindow(s);
|
|
88
|
+
// Check RPM
|
|
89
|
+
if (s.requestCount >= limits.rpm) {
|
|
90
|
+
const waitMs = WINDOW_MS - (now - s.windowStart);
|
|
91
|
+
debugLog(`${provider}: RPM limit reached (${s.requestCount}/${limits.rpm}), wait ${waitMs}ms`);
|
|
92
|
+
return { allowed: false, waitMs, reason: `RPM limit reached for ${provider} (${limits.rpm}/min)` };
|
|
93
|
+
}
|
|
94
|
+
// Check TPM (token bucket)
|
|
95
|
+
refillBucket(s.bucket);
|
|
96
|
+
if (s.bucket.tokens <= 0) {
|
|
97
|
+
// Estimate time until we have at least 1 token
|
|
98
|
+
const waitMs = Math.ceil(1000 / s.bucket.refillRate);
|
|
99
|
+
debugLog(`${provider}: TPM bucket empty, wait ${waitMs}ms`);
|
|
100
|
+
return { allowed: false, waitMs, reason: `Token limit reached for ${provider}` };
|
|
101
|
+
}
|
|
102
|
+
return { allowed: true, waitMs: 0 };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Record a completed request, consuming tokens from the bucket and incrementing RPM count.
|
|
106
|
+
*/
|
|
107
|
+
export function recordRequest(provider, tokens) {
|
|
108
|
+
const s = getOrCreateState(provider);
|
|
109
|
+
// Slide the window and increment RPM
|
|
110
|
+
slideWindow(s);
|
|
111
|
+
s.requestCount++;
|
|
112
|
+
// Consume tokens from bucket
|
|
113
|
+
refillBucket(s.bucket);
|
|
114
|
+
s.bucket.tokens = Math.max(0, s.bucket.tokens - tokens);
|
|
115
|
+
// Successful request resets consecutive error count
|
|
116
|
+
s.consecutiveErrors = 0;
|
|
117
|
+
s.retryAfter = undefined;
|
|
118
|
+
debugLog(`${provider}: recorded request (${tokens} tokens, ${s.requestCount} RPM, ${Math.floor(s.bucket.tokens)} bucket remaining)`);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Record a 429 rate limit response. Sets retry-after with exponential backoff.
|
|
122
|
+
*/
|
|
123
|
+
export function recordRateLimit(provider, retryAfterMs) {
|
|
124
|
+
const s = getOrCreateState(provider);
|
|
125
|
+
s.consecutiveErrors++;
|
|
126
|
+
if (retryAfterMs && retryAfterMs > 0) {
|
|
127
|
+
// Use the server-provided retry-after
|
|
128
|
+
s.retryAfter = Date.now() + retryAfterMs;
|
|
129
|
+
debugLog(`${provider}: 429 received, server retry-after ${retryAfterMs}ms`);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// Exponential backoff: 1s, 2s, 4s, 8s, ..., max 60s
|
|
133
|
+
const backoffMs = Math.min(MAX_BACKOFF_MS, 1000 * Math.pow(2, s.consecutiveErrors - 1));
|
|
134
|
+
s.retryAfter = Date.now() + backoffMs;
|
|
135
|
+
debugLog(`${provider}: 429 received, backoff ${backoffMs}ms (attempt ${s.consecutiveErrors})`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Wait until the rate limit clears for the given provider.
|
|
140
|
+
* Prints a progress message to stderr while waiting.
|
|
141
|
+
*/
|
|
142
|
+
export async function waitForRateLimit(provider) {
|
|
143
|
+
let check = checkRateLimit(provider);
|
|
144
|
+
while (!check.allowed) {
|
|
145
|
+
const waitSec = Math.ceil(check.waitMs / 1000);
|
|
146
|
+
process.stderr.write(chalk.yellow(`⏳ Rate limited by ${provider}. Waiting ${waitSec}s...\r`));
|
|
147
|
+
await new Promise(resolve => setTimeout(resolve, check.waitMs));
|
|
148
|
+
// Clear the progress line
|
|
149
|
+
process.stderr.write('\r' + ' '.repeat(80) + '\r');
|
|
150
|
+
check = checkRateLimit(provider);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get the current rate limit status for a provider.
|
|
155
|
+
*/
|
|
156
|
+
export function getRateLimitStatus(provider) {
|
|
157
|
+
const s = getOrCreateState(provider);
|
|
158
|
+
const limits = getProviderLimits(provider);
|
|
159
|
+
const now = Date.now();
|
|
160
|
+
slideWindow(s);
|
|
161
|
+
refillBucket(s.bucket);
|
|
162
|
+
const blocked = (s.retryAfter !== undefined && now < s.retryAfter)
|
|
163
|
+
|| s.requestCount >= limits.rpm
|
|
164
|
+
|| s.bucket.tokens <= 0;
|
|
165
|
+
return {
|
|
166
|
+
rpm: { used: s.requestCount, limit: limits.rpm },
|
|
167
|
+
tpm: { used: limits.tpm - Math.floor(s.bucket.tokens), limit: limits.tpm },
|
|
168
|
+
blocked,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Format all active providers' rate limit status for display.
|
|
173
|
+
*/
|
|
174
|
+
export function formatRateLimitStatus() {
|
|
175
|
+
if (state.size === 0) {
|
|
176
|
+
return chalk.dim('No rate limit data yet.');
|
|
177
|
+
}
|
|
178
|
+
const lines = [chalk.bold('Rate Limit Status:')];
|
|
179
|
+
for (const [provider] of state) {
|
|
180
|
+
const status = getRateLimitStatus(provider);
|
|
181
|
+
const rpmPct = Math.round((status.rpm.used / status.rpm.limit) * 100);
|
|
182
|
+
const tpmPct = Math.round((status.tpm.used / status.tpm.limit) * 100);
|
|
183
|
+
const rpmColor = rpmPct >= 90 ? chalk.red : rpmPct >= 70 ? chalk.yellow : chalk.green;
|
|
184
|
+
const tpmColor = tpmPct >= 90 ? chalk.red : tpmPct >= 70 ? chalk.yellow : chalk.green;
|
|
185
|
+
const statusIcon = status.blocked ? chalk.red('BLOCKED') : chalk.green('OK');
|
|
186
|
+
lines.push(` ${chalk.cyan(provider.padEnd(12))} ` +
|
|
187
|
+
`RPM: ${rpmColor(`${status.rpm.used}/${status.rpm.limit}`)} ` +
|
|
188
|
+
`TPM: ${tpmColor(`${status.tpm.used.toLocaleString()}/${status.tpm.limit.toLocaleString()}`)} ` +
|
|
189
|
+
`[${statusIcon}]`);
|
|
190
|
+
}
|
|
191
|
+
return lines.join('\n');
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Reset all rate limit state. Useful for testing or manual recovery.
|
|
195
|
+
*/
|
|
196
|
+
export function resetRateLimits() {
|
|
197
|
+
state.clear();
|
|
198
|
+
debugLog('All rate limit state reset');
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=rate-limiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.test.d.ts","sourceRoot":"","sources":["../src/sessions.test.ts"],"names":[],"mappings":""}
|