@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.
Files changed (54) hide show
  1. package/README.md +5 -5
  2. package/dist/agent.js +1 -1
  3. package/dist/agent.js.map +1 -1
  4. package/dist/cli.js +221 -24
  5. package/dist/cli.js.map +1 -1
  6. package/dist/context-manager.d.ts.map +1 -1
  7. package/dist/context-manager.js +31 -5
  8. package/dist/context-manager.js.map +1 -1
  9. package/dist/context-manager.test.d.ts +2 -0
  10. package/dist/context-manager.test.d.ts.map +1 -0
  11. package/dist/context-manager.test.js +121 -0
  12. package/dist/context-manager.test.js.map +1 -0
  13. package/dist/export.d.ts +20 -0
  14. package/dist/export.d.ts.map +1 -0
  15. package/dist/export.js +301 -0
  16. package/dist/export.js.map +1 -0
  17. package/dist/ide/acp-server.js +2 -2
  18. package/dist/ide/acp-server.js.map +1 -1
  19. package/dist/marketplace.d.ts +25 -0
  20. package/dist/marketplace.d.ts.map +1 -0
  21. package/dist/marketplace.js +327 -0
  22. package/dist/marketplace.js.map +1 -0
  23. package/dist/rate-limiter.d.ts +45 -0
  24. package/dist/rate-limiter.d.ts.map +1 -0
  25. package/dist/rate-limiter.js +200 -0
  26. package/dist/rate-limiter.js.map +1 -0
  27. package/dist/sessions.test.d.ts +2 -0
  28. package/dist/sessions.test.d.ts.map +1 -0
  29. package/dist/sessions.test.js +55 -0
  30. package/dist/sessions.test.js.map +1 -0
  31. package/dist/streaming.d.ts.map +1 -1
  32. package/dist/streaming.js +87 -24
  33. package/dist/streaming.js.map +1 -1
  34. package/dist/streaming.test.d.ts +2 -0
  35. package/dist/streaming.test.d.ts.map +1 -0
  36. package/dist/streaming.test.js +41 -0
  37. package/dist/streaming.test.js.map +1 -0
  38. package/dist/tools/index.d.ts.map +1 -1
  39. package/dist/tools/index.js +3 -1
  40. package/dist/tools/index.js.map +1 -1
  41. package/dist/tools/test-runner.d.ts +2 -0
  42. package/dist/tools/test-runner.d.ts.map +1 -0
  43. package/dist/tools/test-runner.js +550 -0
  44. package/dist/tools/test-runner.js.map +1 -0
  45. package/dist/ui.js +1 -1
  46. package/dist/voice.d.ts +25 -0
  47. package/dist/voice.d.ts.map +1 -0
  48. package/dist/voice.js +336 -0
  49. package/dist/voice.js.map +1 -0
  50. package/dist/watch.d.ts +37 -0
  51. package/dist/watch.d.ts.map +1 -0
  52. package/dist/watch.js +369 -0
  53. package/dist/watch.js.map +1 -0
  54. 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":"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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sessions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.test.d.ts","sourceRoot":"","sources":["../src/sessions.test.ts"],"names":[],"mappings":""}