opencode-kimi-rotator 1.0.0 → 1.1.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/bin/cli.js CHANGED
@@ -1,10 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { KimiAccountManager } from '../dist/accounts.js';
4
+ import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'crypto';
5
+ import { promises as fs } from 'fs';
6
+ import { Buffer } from 'buffer';
4
7
 
5
8
  const args = process.argv.slice(2);
6
9
  const command = args[0];
7
10
 
11
+ const ENCRYPTION_ALGORITHM = 'aes-256-gcm';
12
+ const SALT_LENGTH = 32;
13
+ const IV_LENGTH = 16;
14
+ const AUTH_TAG_LENGTH = 16;
15
+ const KEY_LENGTH = 32;
16
+
8
17
  async function main() {
9
18
  const manager = new KimiAccountManager();
10
19
  await manager.init();
@@ -29,6 +38,24 @@ async function main() {
29
38
  case 'set-strategy':
30
39
  await setStrategy(manager, args.slice(1));
31
40
  break;
41
+ case 'stats':
42
+ await showStats(manager);
43
+ break;
44
+ case 'refresh-health':
45
+ await refreshHealth(manager);
46
+ break;
47
+ case 'set-auto-refresh':
48
+ await setAutoRefresh(manager, args.slice(1));
49
+ break;
50
+ case 'set-cooldown':
51
+ await setCooldown(manager, args.slice(1));
52
+ break;
53
+ case 'export-keys':
54
+ await exportKeys(manager, args.slice(1));
55
+ break;
56
+ case 'import-keys':
57
+ await importKeys(manager, args.slice(1));
58
+ break;
32
59
  case 'help':
33
60
  default:
34
61
  showHelp();
@@ -132,7 +159,9 @@ async function listKeys(manager) {
132
159
  const fullConfig = await storage.loadConfig();
133
160
  const activeIndex = fullConfig.activeIndex;
134
161
 
135
- console.log(`\nKimi API Keys (${accounts.length} total, strategy: ${fullConfig.rotationStrategy}):\n`);
162
+ console.log(
163
+ `\nKimi API Keys (${accounts.length} total, strategy: ${fullConfig.rotationStrategy}):\n`
164
+ );
136
165
 
137
166
  accounts.forEach((account, index) => {
138
167
  const isActive = index === activeIndex;
@@ -223,19 +252,318 @@ async function setStrategy(manager, args) {
223
252
  console.log(`āœ“ Rotation strategy set to: ${strategy}`);
224
253
  }
225
254
 
255
+ async function showStats(manager) {
256
+ const accounts = await manager.listKeys();
257
+
258
+ if (accounts.length === 0) {
259
+ console.log('No Kimi API keys configured.');
260
+ console.log('Run: opencode-kimi add-key <your-api-key>');
261
+ return;
262
+ }
263
+
264
+ console.log('\nšŸ“Š Usage Statistics\n');
265
+
266
+ let totalRequests = 0;
267
+ let totalSuccessful = 0;
268
+ let totalResponseTimes = [];
269
+ const today = new Date().toISOString().split('T')[0];
270
+ const last7Days = getLast7Days();
271
+
272
+ accounts.forEach((account, index) => {
273
+ console.log(`[${index}] ${account.name}`);
274
+ console.log(` Total Requests: ${account.totalRequests}`);
275
+ console.log(` Successful: ${account.successfulRequests}`);
276
+ console.log(` Failed: ${account.totalRequests - account.successfulRequests}`);
277
+
278
+ if (account.totalRequests > 0) {
279
+ const successRate = ((account.successfulRequests / account.totalRequests) * 100).toFixed(1);
280
+ console.log(` Success Rate: ${successRate}%`);
281
+ }
282
+
283
+ if (account.responseTimes && account.responseTimes.length > 0) {
284
+ const avg = average(account.responseTimes);
285
+ const min = Math.min(...account.responseTimes);
286
+ const max = Math.max(...account.responseTimes);
287
+ console.log(` Avg Response Time: ${avg}ms`);
288
+ console.log(` Response Time Range: ${min}ms - ${max}ms`);
289
+ totalResponseTimes.push(...account.responseTimes);
290
+ } else {
291
+ console.log(` Avg Response Time: N/A`);
292
+ }
293
+
294
+ const todayCount = account.dailyRequests?.[today] || 0;
295
+ console.log(` Requests Today: ${todayCount}`);
296
+
297
+ const weeklyTotal = last7Days.reduce(
298
+ (sum, day) => sum + (account.dailyRequests?.[day] || 0),
299
+ 0
300
+ );
301
+ console.log(` Requests Last 7 Days: ${weeklyTotal}`);
302
+
303
+ console.log();
304
+
305
+ totalRequests += account.totalRequests;
306
+ totalSuccessful += account.successfulRequests;
307
+ });
308
+
309
+ console.log('─'.repeat(50));
310
+ console.log('šŸ“ˆ Aggregate Statistics');
311
+ console.log(` Total Requests (All Keys): ${totalRequests}`);
312
+ console.log(` Total Successful: ${totalSuccessful}`);
313
+ if (totalRequests > 0) {
314
+ const overallRate = ((totalSuccessful / totalRequests) * 100).toFixed(1);
315
+ console.log(` Overall Success Rate: ${overallRate}%`);
316
+ }
317
+ if (totalResponseTimes.length > 0) {
318
+ const overallAvg = average(totalResponseTimes);
319
+ console.log(` Overall Avg Response Time: ${overallAvg}ms`);
320
+ }
321
+ console.log();
322
+ }
323
+
324
+ function getLast7Days() {
325
+ const days = [];
326
+ for (let i = 0; i < 7; i++) {
327
+ const d = new Date();
328
+ d.setDate(d.getDate() - i);
329
+ days.push(d.toISOString().split('T')[0]);
330
+ }
331
+ return days;
332
+ }
333
+
334
+ function average(arr) {
335
+ if (arr.length === 0) return 0;
336
+ return Math.round(arr.reduce((a, b) => a + b, 0) / arr.length);
337
+ }
338
+
339
+ async function refreshHealth(manager) {
340
+ const result = await manager.refreshHealthScores();
341
+
342
+ if (result.refreshed === 0) {
343
+ console.log('No keys needed health refresh.');
344
+ console.log('Keys must be below 100% health and past the cooldown period.');
345
+ return;
346
+ }
347
+
348
+ console.log(`āœ“ Refreshed health for ${result.refreshed} key(s):`);
349
+ result.details.forEach((detail) => {
350
+ console.log(` ${detail}`);
351
+ });
352
+ }
353
+
354
+ async function setAutoRefresh(manager, args) {
355
+ const enabled = args[0];
356
+
357
+ if (enabled !== 'true' && enabled !== 'false') {
358
+ console.error('Usage: opencode-kimi set-auto-refresh <true|false>');
359
+ console.error('');
360
+ console.error('When enabled, health scores will automatically refresh');
361
+ console.error('after the cooldown period when keys are rate limited.');
362
+ process.exit(1);
363
+ }
364
+
365
+ await manager.setAutoRefreshHealth(enabled === 'true');
366
+ console.log(`āœ“ Auto-refresh health: ${enabled}`);
367
+ }
368
+
369
+ async function setCooldown(manager, args) {
370
+ const minutes = parseInt(args[0], 10);
371
+
372
+ if (isNaN(minutes) || minutes < 1 || minutes > 1440) {
373
+ console.error('Usage: opencode-kimi set-cooldown <minutes>');
374
+ console.error('');
375
+ console.error('Set the cooldown period (in minutes) before health scores');
376
+ console.error('can be refreshed after a rate limit. Range: 1-1440');
377
+ console.error('');
378
+ console.error('Examples:');
379
+ console.error(' opencode-kimi set-cooldown 30 # 30 minutes (default)');
380
+ console.error(' opencode-kimi set-cooldown 60 # 1 hour');
381
+ console.error(' opencode-kimi set-cooldown 180 # 3 hours');
382
+ process.exit(1);
383
+ }
384
+
385
+ await manager.setHealthRefreshCooldown(minutes);
386
+ console.log(`āœ“ Health refresh cooldown: ${minutes} minutes`);
387
+ }
388
+
389
+ async function exportKeys(manager, args) {
390
+ const filePath = args[0] || 'kimi-keys-backup.json.enc';
391
+
392
+ const accounts = await manager.listKeys();
393
+ if (accounts.length === 0) {
394
+ console.log('No keys to export.');
395
+ return;
396
+ }
397
+
398
+ const { KimiStorage } = await import('../dist/storage.js');
399
+ const storage = new KimiStorage();
400
+ const config = await storage.loadConfig();
401
+
402
+ const exportData = {
403
+ version: 1,
404
+ exportedAt: new Date().toISOString(),
405
+ accounts: config.accounts,
406
+ rotationStrategy: config.rotationStrategy,
407
+ autoRefreshHealth: config.autoRefreshHealth,
408
+ healthRefreshCooldownMinutes: config.healthRefreshCooldownMinutes,
409
+ };
410
+
411
+ const password = await promptPassword('Enter encryption password: ');
412
+ const confirmPassword = await promptPassword('Confirm encryption password: ');
413
+
414
+ if (password !== confirmPassword) {
415
+ console.error('Error: Passwords do not match');
416
+ process.exit(1);
417
+ }
418
+
419
+ if (password.length < 8) {
420
+ console.error('Error: Password must be at least 8 characters');
421
+ process.exit(1);
422
+ }
423
+
424
+ const encrypted = encryptData(JSON.stringify(exportData), password);
425
+ await fs.writeFile(filePath, encrypted, 'utf-8');
426
+
427
+ console.log(`āœ“ Exported ${accounts.length} key(s) to: ${filePath}`);
428
+ console.log(' Keep this file and your password safe!');
429
+ }
430
+
431
+ async function importKeys(manager, args) {
432
+ const filePath = args[0];
433
+
434
+ if (!filePath) {
435
+ console.error('Usage: opencode-kimi import-keys <file>');
436
+ console.error('');
437
+ console.error('Import keys from an encrypted backup file.');
438
+ console.error('Keys will be merged with existing keys (duplicates skipped).');
439
+ process.exit(1);
440
+ }
441
+
442
+ let encryptedData;
443
+ try {
444
+ encryptedData = await fs.readFile(filePath, 'utf-8');
445
+ } catch {
446
+ console.error(`Error: Cannot read file: ${filePath}`);
447
+ process.exit(1);
448
+ }
449
+
450
+ const password = await promptPassword('Enter decryption password: ');
451
+
452
+ let decrypted;
453
+ try {
454
+ decrypted = decryptData(encryptedData, password);
455
+ } catch {
456
+ console.error('Error: Failed to decrypt file. Wrong password?');
457
+ process.exit(1);
458
+ }
459
+
460
+ let importData;
461
+ try {
462
+ importData = JSON.parse(decrypted);
463
+ } catch {
464
+ console.error('Error: Invalid backup file format');
465
+ process.exit(1);
466
+ }
467
+
468
+ if (!importData.accounts || !Array.isArray(importData.accounts)) {
469
+ console.error('Error: Invalid backup file format');
470
+ process.exit(1);
471
+ }
472
+
473
+ const existingKeys = await manager.listKeys();
474
+ const existingKeySet = new Set(existingKeys.map((a) => a.key));
475
+
476
+ let imported = 0;
477
+ let skipped = 0;
478
+
479
+ for (const account of importData.accounts) {
480
+ if (existingKeySet.has(account.key)) {
481
+ skipped++;
482
+ continue;
483
+ }
484
+
485
+ try {
486
+ await manager.addKey(account.key, account.name);
487
+ imported++;
488
+ } catch (error) {
489
+ console.error(`Error importing key "${account.name}": ${error.message}`);
490
+ }
491
+ }
492
+
493
+ console.log(`āœ“ Import complete:`);
494
+ console.log(` Imported: ${imported} key(s)`);
495
+ console.log(` Skipped (duplicates): ${skipped} key(s)`);
496
+
497
+ if (imported > 0 && importData.rotationStrategy) {
498
+ await manager.setRotationStrategy(importData.rotationStrategy);
499
+ console.log(` Restored rotation strategy: ${importData.rotationStrategy}`);
500
+ }
501
+ }
502
+
503
+ function encryptData(data, password) {
504
+ const salt = randomBytes(SALT_LENGTH);
505
+ const iv = randomBytes(IV_LENGTH);
506
+ const key = scryptSync(password, salt, KEY_LENGTH);
507
+
508
+ const cipher = createCipheriv(ENCRYPTION_ALGORITHM, key, iv);
509
+ const encrypted = Buffer.concat([cipher.update(data, 'utf-8'), cipher.final()]);
510
+ const authTag = cipher.getAuthTag();
511
+
512
+ const result = Buffer.concat([salt, iv, authTag, encrypted]);
513
+ return result.toString('base64');
514
+ }
515
+
516
+ function decryptData(encryptedData, password) {
517
+ const data = Buffer.from(encryptedData, 'base64');
518
+
519
+ const salt = data.subarray(0, SALT_LENGTH);
520
+ const iv = data.subarray(SALT_LENGTH, SALT_LENGTH + IV_LENGTH);
521
+ const authTag = data.subarray(SALT_LENGTH + IV_LENGTH, SALT_LENGTH + IV_LENGTH + AUTH_TAG_LENGTH);
522
+ const encrypted = data.subarray(SALT_LENGTH + IV_LENGTH + AUTH_TAG_LENGTH);
523
+
524
+ const key = scryptSync(password, salt, KEY_LENGTH);
525
+
526
+ const decipher = createDecipheriv(ENCRYPTION_ALGORITHM, key, iv);
527
+ decipher.setAuthTag(authTag);
528
+
529
+ const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
530
+ return decrypted.toString('utf-8');
531
+ }
532
+
533
+ async function promptPassword(prompt) {
534
+ const { createInterface } = await import('readline');
535
+ const rl = createInterface({
536
+ input: process.stdin,
537
+ output: process.stdout,
538
+ });
539
+
540
+ return new Promise((resolve) => {
541
+ rl.question(prompt, (answer) => {
542
+ rl.close();
543
+ resolve(answer);
544
+ });
545
+ });
546
+ }
547
+
226
548
  function showHelp() {
227
549
  console.log('Kimi API Key Rotator for OpenCode');
228
550
  console.log('');
229
551
  console.log('Usage: opencode-kimi <command> [options]');
230
552
  console.log('');
231
553
  console.log('Commands:');
232
- console.log(' add-key <key> [name] Add a new Kimi API key');
233
- console.log(' list-keys List all configured keys');
234
- console.log(' remove-key <index> Remove a key by index');
235
- console.log(' rotate Manually rotate to next key');
236
- console.log(' use-key <index> Switch to a specific key');
237
- console.log(' set-strategy <strategy> Set rotation strategy');
238
- console.log(' help Show this help message');
554
+ console.log(' add-key <key> [name] Add a new Kimi API key');
555
+ console.log(' list-keys List all configured keys');
556
+ console.log(' remove-key <index> Remove a key by index');
557
+ console.log(' rotate Manually rotate to next key');
558
+ console.log(' use-key <index> Switch to a specific key');
559
+ console.log(' set-strategy <strategy> Set rotation strategy');
560
+ console.log(' stats Show usage statistics');
561
+ console.log(' refresh-health Manually refresh health scores');
562
+ console.log(' set-auto-refresh <true|false> Enable/disable auto-refresh');
563
+ console.log(' set-cooldown <minutes> Set health refresh cooldown');
564
+ console.log(' export-keys [file] Export keys to encrypted file');
565
+ console.log(' import-keys <file> Import keys from encrypted file');
566
+ console.log(' help Show this help message');
239
567
  console.log('');
240
568
  console.log('Strategies:');
241
569
  console.log(' round-robin - Cycle through keys sequentially');
@@ -247,6 +575,10 @@ function showHelp() {
247
575
  console.log(' opencode-kimi list-keys');
248
576
  console.log(' opencode-kimi rotate');
249
577
  console.log(' opencode-kimi use-key 1');
578
+ console.log(' opencode-kimi stats');
579
+ console.log(' opencode-kimi refresh-health');
580
+ console.log(' opencode-kimi export-keys backup.json.enc');
581
+ console.log(' opencode-kimi import-keys backup.json.enc');
250
582
  }
251
583
 
252
584
  function maskKey(key) {
@@ -13,7 +13,7 @@ export declare class KimiAccountManager {
13
13
  init(): Promise<void>;
14
14
  getNextAccount(forceRotation?: boolean): Promise<RotationResult | null>;
15
15
  markAccountUsed(index: number): Promise<void>;
16
- markAccountSuccess(index: number): Promise<void>;
16
+ markAccountSuccess(index: number, responseTime?: number, date?: string): Promise<void>;
17
17
  markAccountRateLimited(index: number, retryAfterMs: number): Promise<void>;
18
18
  markAccountFailure(index: number): Promise<void>;
19
19
  getActiveKey(): Promise<string | null>;
@@ -23,6 +23,12 @@ export declare class KimiAccountManager {
23
23
  listKeys(): Promise<KimiAccount[]>;
24
24
  rotateToNext(): Promise<RotationResult | null>;
25
25
  setActiveIndex(index: number): Promise<void>;
26
+ setAutoRefreshHealth(enabled: boolean): Promise<void>;
27
+ setHealthRefreshCooldown(minutes: number): Promise<void>;
28
+ refreshHealthScores(): Promise<{
29
+ refreshed: number;
30
+ details: string[];
31
+ }>;
26
32
  private roundRobinRotation;
27
33
  private stickyRotation;
28
34
  private healthBasedRotation;
@@ -1 +1 @@
1
- {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAsB,MAAM,YAAY,CAAC;AAE7D,KAAK,gBAAgB,GAAG,aAAa,GAAG,cAAc,GAAG,QAAQ,CAAC;AAElE,UAAU,cAAc;IACtB,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,WAAW,CAAM;;IAMnB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,cAAc,CAAC,aAAa,UAAQ,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAwBrE,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7C,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhD,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1E,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUhD,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKtC,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9D,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIxD,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAIlC,YAAY,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAI9C,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAIpC,kBAAkB;YAsBlB,cAAc;YAoCd,mBAAmB;IAgDjC,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,wBAAwB;IAchC,OAAO,CAAC,aAAa;YAIP,UAAU;CAOzB"}
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAsB,MAAM,YAAY,CAAC;AAE7D,KAAK,gBAAgB,GAAG,aAAa,GAAG,cAAc,GAAG,QAAQ,CAAC;AAElE,UAAU,cAAc;IACtB,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,WAAW,CAAM;;IAMnB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,cAAc,CAAC,aAAa,UAAQ,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAwBrE,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7C,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BtF,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1E,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUhD,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKtC,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9D,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIxD,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAIlC,YAAY,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAI9C,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrD,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxD,mBAAmB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;YAgChE,kBAAkB;YAsBlB,cAAc;YAoCd,mBAAmB;IAuDjC,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,wBAAwB;IAchC,OAAO,CAAC,aAAa;YAIP,UAAU;CAOzB"}
package/dist/accounts.js CHANGED
@@ -35,14 +35,27 @@ export class KimiAccountManager {
35
35
  totalRequests: (await this.getAccount(index)).totalRequests + 1,
36
36
  });
37
37
  }
38
- async markAccountSuccess(index) {
38
+ async markAccountSuccess(index, responseTime, date) {
39
39
  const account = await this.getAccount(index);
40
40
  const newHealthScore = Math.min(100, account.healthScore + 2);
41
- await this.storage.updateAccount(index, {
41
+ const updates = {
42
42
  healthScore: newHealthScore,
43
43
  successfulRequests: account.successfulRequests + 1,
44
44
  consecutiveFailures: 0,
45
- });
45
+ };
46
+ if (responseTime !== undefined) {
47
+ const responseTimes = [...account.responseTimes, responseTime];
48
+ if (responseTimes.length > 100) {
49
+ responseTimes.shift();
50
+ }
51
+ updates.responseTimes = responseTimes;
52
+ }
53
+ if (date) {
54
+ const dailyRequests = { ...account.dailyRequests };
55
+ dailyRequests[date] = (dailyRequests[date] || 0) + 1;
56
+ updates.dailyRequests = dailyRequests;
57
+ }
58
+ await this.storage.updateAccount(index, updates);
46
59
  }
47
60
  async markAccountRateLimited(index, retryAfterMs) {
48
61
  const account = await this.getAccount(index);
@@ -85,6 +98,45 @@ export class KimiAccountManager {
85
98
  async setActiveIndex(index) {
86
99
  return this.storage.setActiveIndex(index);
87
100
  }
101
+ async setAutoRefreshHealth(enabled) {
102
+ const config = await this.storage.loadConfig();
103
+ config.autoRefreshHealth = enabled;
104
+ await this.storage.saveConfig(config);
105
+ }
106
+ async setHealthRefreshCooldown(minutes) {
107
+ if (minutes < 1 || minutes > 1440) {
108
+ throw new Error('Cooldown must be between 1 and 1440 minutes (24 hours)');
109
+ }
110
+ const config = await this.storage.loadConfig();
111
+ config.healthRefreshCooldownMinutes = minutes;
112
+ await this.storage.saveConfig(config);
113
+ }
114
+ async refreshHealthScores() {
115
+ const config = await this.storage.loadConfig();
116
+ const now = Date.now();
117
+ const cooldownMs = config.healthRefreshCooldownMinutes * 60 * 1000;
118
+ let refreshed = 0;
119
+ const details = [];
120
+ for (let i = 0; i < config.accounts.length; i++) {
121
+ const account = config.accounts[i];
122
+ const timeSinceRateLimit = now - account.rateLimitResetTime;
123
+ const shouldRefresh = config.autoRefreshHealth &&
124
+ account.healthScore < 100 &&
125
+ timeSinceRateLimit >= cooldownMs &&
126
+ account.rateLimitResetTime <= now;
127
+ if (shouldRefresh) {
128
+ const oldScore = account.healthScore;
129
+ const newScore = Math.min(100, oldScore + 10);
130
+ await this.storage.updateAccount(i, {
131
+ healthScore: newScore,
132
+ consecutiveFailures: 0,
133
+ });
134
+ refreshed++;
135
+ details.push(`${account.name}: ${oldScore}% → ${newScore}%`);
136
+ }
137
+ }
138
+ return { refreshed, details };
139
+ }
88
140
  async roundRobinRotation(config) {
89
141
  const availableIndices = this.getAvailableIndices(config);
90
142
  if (availableIndices.length === 0) {
@@ -93,7 +145,7 @@ export class KimiAccountManager {
93
145
  return { account, index: soonestIndex, reason: 'all-rate-limited' };
94
146
  }
95
147
  const currentIndex = config.activeIndex;
96
- let nextIndex = availableIndices.find(idx => idx > currentIndex) ?? availableIndices[0];
148
+ const nextIndex = availableIndices.find((idx) => idx > currentIndex) ?? availableIndices[0];
97
149
  await this.storage.setActiveIndex(nextIndex);
98
150
  await this.markAccountUsed(nextIndex);
99
151
  return {
@@ -113,7 +165,7 @@ export class KimiAccountManager {
113
165
  reason: 'sticky',
114
166
  };
115
167
  }
116
- const availableIndices = this.getAvailableIndices(config).filter(idx => idx !== currentIndex);
168
+ const availableIndices = this.getAvailableIndices(config).filter((idx) => idx !== currentIndex);
117
169
  if (availableIndices.length === 0) {
118
170
  const soonestIndex = this.getSoonestAvailableIndex(config);
119
171
  const account = config.accounts[soonestIndex];
@@ -132,7 +184,9 @@ export class KimiAccountManager {
132
184
  async healthBasedRotation(config, forceRotation) {
133
185
  const currentIndex = config.activeIndex;
134
186
  const currentAccount = config.accounts[currentIndex];
135
- if (!forceRotation && !this.isRateLimited(currentAccount) && currentAccount.healthScore > this.minHealthScore) {
187
+ if (!forceRotation &&
188
+ !this.isRateLimited(currentAccount) &&
189
+ currentAccount.healthScore > this.minHealthScore) {
136
190
  await this.markAccountUsed(currentIndex);
137
191
  return {
138
192
  account: currentAccount,
@@ -197,7 +251,7 @@ export class KimiAccountManager {
197
251
  async getAccount(index) {
198
252
  const accounts = await this.storage.listAccounts();
199
253
  if (index < 0 || index >= accounts.length) {
200
- throw new Error(`Invalid account index: ${index}`);
254
+ throw new Error(`Invalid account index: ${String(index)}`);
201
255
  }
202
256
  return accounts[index];
203
257
  }
@@ -1 +1 @@
1
- {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"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"}
package/dist/plugin.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Plugin } from "@opencode-ai/plugin";
1
+ import type { Plugin } from '@opencode-ai/plugin';
2
2
  import type { KimiAccount } from './types.js';
3
3
  export declare const KimiRotatorPlugin: Plugin;
4
4
  export default KimiRotatorPlugin;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAqE9C,eAAO,MAAM,iBAAiB,EAAE,MAqG/B,CAAC;AAEF,eAAe,iBAAiB,CAAC;AACjC,YAAY,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAyE9C,eAAO,MAAM,iBAAiB,EAAE,MAwH/B,CAAC;AAEF,eAAe,iBAAiB,CAAC;AACjC,YAAY,EAAE,WAAW,EAAE,CAAC"}