opencode-kimi-rotator 1.0.1 → 1.2.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/plugin.js CHANGED
@@ -42,7 +42,9 @@ async function flushToastQueue() {
42
42
  const toast = toastQueue.shift();
43
43
  if (toast) {
44
44
  try {
45
- await openCodeClient.tui.showToast({ body: { message: toast.message, variant: toast.variant } });
45
+ await openCodeClient.tui.showToast({
46
+ body: { message: toast.message, variant: toast.variant },
47
+ });
46
48
  }
47
49
  catch {
48
50
  return;
@@ -63,6 +65,9 @@ export const KimiRotatorPlugin = async ({ client }) => {
63
65
  globalThis.fetch = async (input, init) => {
64
66
  const url = typeof input === 'string' ? input : input.toString();
65
67
  if (url.includes('api.kimi.com')) {
68
+ if (!accountManager) {
69
+ throw new Error('Account manager not initialized');
70
+ }
66
71
  const nextAccount = await accountManager.getNextAccount();
67
72
  if (nextAccount) {
68
73
  currentAccountIndex = nextAccount.index;
@@ -70,24 +75,49 @@ export const KimiRotatorPlugin = async ({ client }) => {
70
75
  const position = nextAccount.index + 1;
71
76
  const allKeysNow = await accountManager.listKeys();
72
77
  const total = allKeysNow.length;
73
- await showToast(`🔄 Using key: ${keyLabel} (${position}/${total})`, 'info');
78
+ await showToast(`🔄 Using key: ${keyLabel} (${String(position)}/${String(total)})`, 'info');
74
79
  const headers = new Headers(init?.headers);
75
80
  headers.set('x-api-key', nextAccount.account.key);
76
81
  headers.delete('Authorization');
82
+ const requestStartTime = Date.now();
83
+ const today = new Date().toISOString().split('T')[0];
84
+ if (!originalFetch) {
85
+ throw new Error('Original fetch not available');
86
+ }
77
87
  try {
78
88
  const response = await originalFetch(input, { ...init, headers });
89
+ const responseTime = Date.now() - requestStartTime;
79
90
  if (response.status === 429) {
80
91
  const retryAfter = response.headers.get('retry-after');
81
92
  const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 60000;
82
93
  await accountManager.markAccountRateLimited(currentAccountIndex, retryAfterMs);
83
- await showToast(`⚠️ Key ${position} rate limited`, 'warning');
94
+ await showToast(`⚠️ Key ${String(position)} rate limited`, 'warning');
84
95
  }
85
96
  else if (response.ok) {
86
- await accountManager.markAccountSuccess(currentAccountIndex);
97
+ await accountManager.markAccountSuccess(currentAccountIndex, responseTime, today);
87
98
  }
88
99
  else if (response.status >= 500) {
89
100
  await accountManager.markAccountFailure(currentAccountIndex);
90
101
  }
102
+ else if (response.status === 400 || response.status === 403) {
103
+ // Check for billing limit error in response body
104
+ // We need to clone the response to read the body without consuming it
105
+ const clonedResponse = response.clone();
106
+ try {
107
+ const bodyText = await clonedResponse.text();
108
+ if (bodyText.includes("You've reached your usage limit for this billing cycle")) {
109
+ await accountManager.markAccountBillingLimited(currentAccountIndex);
110
+ const resetTime = new Date();
111
+ resetTime.setDate(resetTime.getDate() + 1);
112
+ resetTime.setHours(0, 0, 0, 0);
113
+ const hoursUntilReset = Math.ceil((resetTime.getTime() - Date.now()) / (1000 * 60 * 60));
114
+ await showToast(`🚫 Key ${String(position)} billing limit reached - cooldown for ${String(hoursUntilReset)}h`, 'warning');
115
+ }
116
+ }
117
+ catch {
118
+ // Ignore errors reading response body
119
+ }
120
+ }
91
121
  return response;
92
122
  }
93
123
  catch (error) {
@@ -96,21 +126,26 @@ export const KimiRotatorPlugin = async ({ client }) => {
96
126
  }
97
127
  }
98
128
  }
129
+ if (!originalFetch) {
130
+ throw new Error('Original fetch not available');
131
+ }
99
132
  return originalFetch(input, init);
100
133
  };
101
134
  const showInitialToast = async () => {
102
- await new Promise(resolve => setTimeout(resolve, 500));
135
+ await new Promise((resolve) => setTimeout(resolve, 500));
103
136
  await flushToastQueue();
104
- await showToast("🎉 Kimi Rotator Plugin loaded!", 'info');
137
+ await showToast('🎉 Kimi Rotator Plugin loaded!', 'info');
105
138
  };
106
- showInitialToast().catch(() => { });
139
+ showInitialToast().catch(() => undefined);
107
140
  const pluginReturn = {
108
141
  auth: {
109
142
  provider: 'kimi-rotator',
110
- methods: [{
143
+ methods: [
144
+ {
111
145
  type: 'api',
112
146
  label: 'Kimi API Key',
113
- }],
147
+ },
148
+ ],
114
149
  loader: async () => {
115
150
  const auth = await getAuth();
116
151
  if (!auth) {
@@ -122,7 +157,7 @@ export const KimiRotatorPlugin = async ({ client }) => {
122
157
  baseURL: kimiBaseUrl,
123
158
  async fetch(input, init) {
124
159
  return globalThis.fetch(input, init);
125
- }
160
+ },
126
161
  };
127
162
  },
128
163
  },
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAQnD,IAAI,cAAc,GAA8B,IAAI,CAAC;AACrD,IAAI,mBAAmB,GAAW,CAAC,CAAC;AACpC,IAAI,aAAa,GAAmC,IAAI,CAAC;AAEzD,KAAK,UAAU,iBAAiB;IAC9B,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,cAAc,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAC1C,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,OAAO;IACpB,MAAM,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;IAE9C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mBAAmB,GAAG,MAAM,CAAC,KAAK,CAAC;IAEnC,OAAO;QACL,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG;KACxB,CAAC;AACJ,CAAC;AAED,IAAI,cAAc,GAIP,IAAI,CAAC;AAEhB,IAAI,UAAU,GAAsE,EAAE,CAAC;AAEvF,KAAK,UAAU,SAAS,CAAC,OAAe,EAAE,UAAwC,MAAM;IACtF,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;QACpC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,SAAS;QAAE,OAAO;IAC5C,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACnG,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAW,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IAC5D,cAAc,GAAG,MAAM,CAAC;IAExB,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,CAAC;IAErD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,WAAW,GAAG,gCAAgC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,WAAW,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;IACrD,CAAC;IAED,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;IACjC,UAAU,CAAC,KAAK,GAAG,KAAK,EAAE,KAA6B,EAAE,IAAkB,EAAqB,EAAE;QAChG,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QAEjE,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,MAAM,cAAe,CAAC,cAAc,EAAE,CAAC;YAC3D,IAAI,WAAW,EAAE,CAAC;gBAChB,mBAAmB,GAAG,WAAW,CAAC,KAAK,CAAC;gBACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;gBAClE,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC;gBACvC,MAAM,UAAU,GAAG,MAAM,cAAe,CAAC,QAAQ,EAAE,CAAC;gBACpD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;gBAEhC,MAAM,SAAS,CAAC,iBAAiB,QAAQ,KAAK,QAAQ,IAAI,KAAK,GAAG,EAAE,MAAM,CAAC,CAAC;gBAE5E,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAClD,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBAEhC,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,aAAc,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBAEnE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;wBAC5B,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;wBACvD,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;wBAC1E,MAAM,cAAe,CAAC,sBAAsB,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;wBAChF,MAAM,SAAS,CAAC,UAAU,QAAQ,eAAe,EAAE,SAAS,CAAC,CAAC;oBAChE,CAAC;yBAAM,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;wBACvB,MAAM,cAAe,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;oBAChE,CAAC;yBAAM,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;wBAClC,MAAM,cAAe,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;oBAChE,CAAC;oBAED,OAAO,QAAQ,CAAC;gBAClB,CAAC;gBAAC,OAAO,KAAc,EAAE,CAAC;oBACxB,MAAM,cAAe,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;oBAC9D,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,aAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;QAClC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACvD,MAAM,eAAe,EAAE,CAAC;QACxB,MAAM,SAAS,CAAC,gCAAgC,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC,CAAC;IAEF,gBAAgB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAEpC,MAAM,YAAY,GAAG;QACnB,IAAI,EAAE;YACJ,QAAQ,EAAE,cAAc;YACxB,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,KAAc;oBACpB,KAAK,EAAE,cAAc;iBACtB,CAAC;YACF,MAAM,EAAE,KAAK,IAAI,EAAE;gBACjB,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;gBAC7E,CAAC;gBAED,MAAM,WAAW,GAAG,gCAAgC,CAAC;gBAErD,OAAO;oBACL,MAAM,EAAE,IAAI,CAAC,GAAG;oBAChB,OAAO,EAAE,WAAW;oBACpB,KAAK,CAAC,KAAK,CAAC,KAA6B,EAAE,IAAkB;wBAC3D,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBACvC,CAAC;iBACF,CAAC;YACJ,CAAC;SACF;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,aAAa,EAAE,CAAC;gBAClB,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;gBACjC,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;YACD,cAAc,GAAG,IAAI,CAAC;YACtB,cAAc,GAAG,IAAI,CAAC;YACtB,UAAU,GAAG,EAAE,CAAC;QAClB,CAAC;KACF,CAAC;IAEF,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,kBAAkB,EAElB,WAAW,EAGZ,MAAM,YAAY,CAAC;AAOpB,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAGjB;;IAOI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBrB,UAAU,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAkBzC,UAAU,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAcrD,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuB5D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB3C,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAKtC,gBAAgB,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAQ/C,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5C,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAWlE,WAAW;CAgB1B"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,kBAAkB,EAElB,WAAW,EAGZ,MAAM,YAAY,CAAC;AAOpB,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAGjB;;IAOI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBrB,UAAU,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAkBzC,UAAU,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrD,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuB5D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB3C,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAKtC,gBAAgB,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAQ/C,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5C,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAWlE,WAAW;CAgB1B"}
package/dist/storage.js CHANGED
@@ -68,14 +68,14 @@ export class KimiStorage {
68
68
  }
69
69
  async addAccount(key, name) {
70
70
  const config = await this.loadConfig();
71
- const existingIndex = config.accounts.findIndex(a => a.key === key);
71
+ const existingIndex = config.accounts.findIndex((a) => a.key === key);
72
72
  if (existingIndex !== -1) {
73
73
  throw new Error('This API key already exists');
74
74
  }
75
75
  const now = Date.now();
76
76
  const newAccount = {
77
77
  key,
78
- name: name || `Account ${config.accounts.length + 1}`,
78
+ name: name ?? `Account ${config.accounts.length + 1}`,
79
79
  addedAt: now,
80
80
  lastUsed: now,
81
81
  ...DEFAULT_ACCOUNT,
@@ -87,7 +87,7 @@ export class KimiStorage {
87
87
  async removeAccount(index) {
88
88
  const config = await this.loadConfig();
89
89
  if (index < 0 || index >= config.accounts.length) {
90
- throw new Error(`Invalid account index: ${index}`);
90
+ throw new Error(`Invalid account index: ${String(index)}`);
91
91
  }
92
92
  config.accounts.splice(index, 1);
93
93
  if (config.activeIndex >= config.accounts.length) {
@@ -109,7 +109,7 @@ export class KimiStorage {
109
109
  async setActiveIndex(index) {
110
110
  const config = await this.loadConfig();
111
111
  if (index < 0 || index >= config.accounts.length) {
112
- throw new Error(`Invalid account index: ${index}`);
112
+ throw new Error(`Invalid account index: ${String(index)}`);
113
113
  }
114
114
  config.activeIndex = index;
115
115
  await this.saveConfig(config);
@@ -117,7 +117,7 @@ export class KimiStorage {
117
117
  async updateAccount(index, updates) {
118
118
  const config = await this.loadConfig();
119
119
  if (index < 0 || index >= config.accounts.length) {
120
- throw new Error(`Invalid account index: ${index}`);
120
+ throw new Error(`Invalid account index: ${String(index)}`);
121
121
  }
122
122
  config.accounts[index] = { ...config.accounts[index], ...updates };
123
123
  await this.saveConfig(config);
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -5,19 +5,25 @@ export declare const KimiAccountSchema: z.ZodObject<{
5
5
  addedAt: z.ZodNumber;
6
6
  lastUsed: z.ZodNumber;
7
7
  rateLimitResetTime: z.ZodDefault<z.ZodNumber>;
8
+ billingLimitResetTime: z.ZodDefault<z.ZodNumber>;
8
9
  healthScore: z.ZodDefault<z.ZodNumber>;
9
10
  consecutiveFailures: z.ZodDefault<z.ZodNumber>;
10
11
  totalRequests: z.ZodDefault<z.ZodNumber>;
11
12
  successfulRequests: z.ZodDefault<z.ZodNumber>;
13
+ responseTimes: z.ZodDefault<z.ZodArray<z.ZodNumber, "many">>;
14
+ dailyRequests: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodNumber>>;
12
15
  }, "strip", z.ZodTypeAny, {
13
16
  key: string;
14
17
  addedAt: number;
15
18
  lastUsed: number;
16
19
  rateLimitResetTime: number;
20
+ billingLimitResetTime: number;
17
21
  healthScore: number;
18
22
  consecutiveFailures: number;
19
23
  totalRequests: number;
20
24
  successfulRequests: number;
25
+ responseTimes: number[];
26
+ dailyRequests: Record<string, number>;
21
27
  name?: string | undefined;
22
28
  }, {
23
29
  key: string;
@@ -25,10 +31,13 @@ export declare const KimiAccountSchema: z.ZodObject<{
25
31
  lastUsed: number;
26
32
  name?: string | undefined;
27
33
  rateLimitResetTime?: number | undefined;
34
+ billingLimitResetTime?: number | undefined;
28
35
  healthScore?: number | undefined;
29
36
  consecutiveFailures?: number | undefined;
30
37
  totalRequests?: number | undefined;
31
38
  successfulRequests?: number | undefined;
39
+ responseTimes?: number[] | undefined;
40
+ dailyRequests?: Record<string, number> | undefined;
32
41
  }>;
33
42
  export declare const KimiAccountsConfigSchema: z.ZodObject<{
34
43
  version: z.ZodDefault<z.ZodNumber>;
@@ -38,19 +47,25 @@ export declare const KimiAccountsConfigSchema: z.ZodObject<{
38
47
  addedAt: z.ZodNumber;
39
48
  lastUsed: z.ZodNumber;
40
49
  rateLimitResetTime: z.ZodDefault<z.ZodNumber>;
50
+ billingLimitResetTime: z.ZodDefault<z.ZodNumber>;
41
51
  healthScore: z.ZodDefault<z.ZodNumber>;
42
52
  consecutiveFailures: z.ZodDefault<z.ZodNumber>;
43
53
  totalRequests: z.ZodDefault<z.ZodNumber>;
44
54
  successfulRequests: z.ZodDefault<z.ZodNumber>;
55
+ responseTimes: z.ZodDefault<z.ZodArray<z.ZodNumber, "many">>;
56
+ dailyRequests: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodNumber>>;
45
57
  }, "strip", z.ZodTypeAny, {
46
58
  key: string;
47
59
  addedAt: number;
48
60
  lastUsed: number;
49
61
  rateLimitResetTime: number;
62
+ billingLimitResetTime: number;
50
63
  healthScore: number;
51
64
  consecutiveFailures: number;
52
65
  totalRequests: number;
53
66
  successfulRequests: number;
67
+ responseTimes: number[];
68
+ dailyRequests: Record<string, number>;
54
69
  name?: string | undefined;
55
70
  }, {
56
71
  key: string;
@@ -58,13 +73,18 @@ export declare const KimiAccountsConfigSchema: z.ZodObject<{
58
73
  lastUsed: number;
59
74
  name?: string | undefined;
60
75
  rateLimitResetTime?: number | undefined;
76
+ billingLimitResetTime?: number | undefined;
61
77
  healthScore?: number | undefined;
62
78
  consecutiveFailures?: number | undefined;
63
79
  totalRequests?: number | undefined;
64
80
  successfulRequests?: number | undefined;
81
+ responseTimes?: number[] | undefined;
82
+ dailyRequests?: Record<string, number> | undefined;
65
83
  }>, "many">;
66
84
  activeIndex: z.ZodDefault<z.ZodNumber>;
67
85
  rotationStrategy: z.ZodDefault<z.ZodEnum<["round-robin", "health-based", "sticky"]>>;
86
+ autoRefreshHealth: z.ZodDefault<z.ZodBoolean>;
87
+ healthRefreshCooldownMinutes: z.ZodDefault<z.ZodNumber>;
68
88
  }, "strip", z.ZodTypeAny, {
69
89
  version: number;
70
90
  accounts: {
@@ -72,14 +92,19 @@ export declare const KimiAccountsConfigSchema: z.ZodObject<{
72
92
  addedAt: number;
73
93
  lastUsed: number;
74
94
  rateLimitResetTime: number;
95
+ billingLimitResetTime: number;
75
96
  healthScore: number;
76
97
  consecutiveFailures: number;
77
98
  totalRequests: number;
78
99
  successfulRequests: number;
100
+ responseTimes: number[];
101
+ dailyRequests: Record<string, number>;
79
102
  name?: string | undefined;
80
103
  }[];
81
104
  activeIndex: number;
82
105
  rotationStrategy: "round-robin" | "health-based" | "sticky";
106
+ autoRefreshHealth: boolean;
107
+ healthRefreshCooldownMinutes: number;
83
108
  }, {
84
109
  accounts: {
85
110
  key: string;
@@ -87,14 +112,19 @@ export declare const KimiAccountsConfigSchema: z.ZodObject<{
87
112
  lastUsed: number;
88
113
  name?: string | undefined;
89
114
  rateLimitResetTime?: number | undefined;
115
+ billingLimitResetTime?: number | undefined;
90
116
  healthScore?: number | undefined;
91
117
  consecutiveFailures?: number | undefined;
92
118
  totalRequests?: number | undefined;
93
119
  successfulRequests?: number | undefined;
120
+ responseTimes?: number[] | undefined;
121
+ dailyRequests?: Record<string, number> | undefined;
94
122
  }[];
95
123
  version?: number | undefined;
96
124
  activeIndex?: number | undefined;
97
125
  rotationStrategy?: "round-robin" | "health-based" | "sticky" | undefined;
126
+ autoRefreshHealth?: boolean | undefined;
127
+ healthRefreshCooldownMinutes?: number | undefined;
98
128
  }>;
99
129
  export type KimiAccount = z.infer<typeof KimiAccountSchema>;
100
130
  export type KimiAccountsConfig = z.infer<typeof KimiAccountsConfigSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU5B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKnC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E,eAAO,MAAM,eAAe,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,CAM7E,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAI/D,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAa5B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOnC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E,eAAO,MAAM,eAAe,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,CAS7E,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAM/D,CAAC"}
package/dist/types.js CHANGED
@@ -5,27 +5,37 @@ export const KimiAccountSchema = z.object({
5
5
  addedAt: z.number(),
6
6
  lastUsed: z.number(),
7
7
  rateLimitResetTime: z.number().default(0),
8
+ billingLimitResetTime: z.number().default(0),
8
9
  healthScore: z.number().min(0).max(100).default(100),
9
10
  consecutiveFailures: z.number().default(0),
10
11
  totalRequests: z.number().default(0),
11
12
  successfulRequests: z.number().default(0),
13
+ responseTimes: z.array(z.number()).default([]),
14
+ dailyRequests: z.record(z.number()).default({}),
12
15
  });
13
16
  export const KimiAccountsConfigSchema = z.object({
14
17
  version: z.number().default(1),
15
18
  accounts: z.array(KimiAccountSchema),
16
19
  activeIndex: z.number().default(0),
17
20
  rotationStrategy: z.enum(['round-robin', 'health-based', 'sticky']).default('health-based'),
21
+ autoRefreshHealth: z.boolean().default(true),
22
+ healthRefreshCooldownMinutes: z.number().min(1).max(1440).default(30),
18
23
  });
19
24
  export const DEFAULT_ACCOUNT = {
20
25
  rateLimitResetTime: 0,
26
+ billingLimitResetTime: 0,
21
27
  healthScore: 100,
22
28
  consecutiveFailures: 0,
23
29
  totalRequests: 0,
24
30
  successfulRequests: 0,
31
+ responseTimes: [],
32
+ dailyRequests: {},
25
33
  };
26
34
  export const DEFAULT_CONFIG = {
27
35
  version: 1,
28
36
  activeIndex: 0,
29
37
  rotationStrategy: 'health-based',
38
+ autoRefreshHealth: true,
39
+ healthRefreshCooldownMinutes: 30,
30
40
  };
31
41
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IACpD,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;CAC1C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;CAC5F,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,eAAe,GAAsD;IAChF,kBAAkB,EAAE,CAAC;IACrB,WAAW,EAAE,GAAG;IAChB,mBAAmB,EAAE,CAAC;IACtB,aAAa,EAAE,CAAC;IAChB,kBAAkB,EAAE,CAAC;CACtB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAyC;IAClE,OAAO,EAAE,CAAC;IACV,WAAW,EAAE,CAAC;IACd,gBAAgB,EAAE,cAAc;CACjC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IACpD,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9C,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAChD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;IAC3F,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC5C,4BAA4B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACtE,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,eAAe,GAAsD;IAChF,kBAAkB,EAAE,CAAC;IACrB,qBAAqB,EAAE,CAAC;IACxB,WAAW,EAAE,GAAG;IAChB,mBAAmB,EAAE,CAAC;IACtB,aAAa,EAAE,CAAC;IAChB,kBAAkB,EAAE,CAAC;IACrB,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,EAAE;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAyC;IAClE,OAAO,EAAE,CAAC;IACV,WAAW,EAAE,CAAC;IACd,gBAAgB,EAAE,cAAc;IAChC,iBAAiB,EAAE,IAAI;IACvB,4BAA4B,EAAE,EAAE;CACjC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-kimi-rotator",
3
- "version": "1.0.1",
3
+ "version": "1.2.0",
4
4
  "description": "Kimi API Key Rotator for OpenCode - Automatically rotate between multiple Kimi API keys to handle rate limits",
5
5
  "main": "./dist/plugin.js",
6
6
  "types": "dist/index.d.ts",
@@ -14,9 +14,15 @@
14
14
  "bundle": "esbuild src/plugin.ts --bundle --platform=node --format=esm --outfile=dist/plugin.bundle.js --external:@opencode-ai/plugin --packages=bundle",
15
15
  "dev": "tsc --watch",
16
16
  "typecheck": "tsc --noEmit",
17
+ "lint": "eslint .",
18
+ "lint:fix": "eslint . --fix",
19
+ "format": "prettier --write .",
20
+ "format:check": "prettier --check .",
17
21
  "clean": "rm -rf dist",
18
22
  "install:plugin": "npm run bundle && mkdir -p ~/.config/opencode/plugins && cp dist/plugin.bundle.js ~/.config/opencode/plugins/kimi-rotator.js",
19
- "prepublishOnly": "npm run build"
23
+ "postinstall": "npm run install:plugin && echo '\n✓ Kimi Rotator Plugin installed/updated!' && echo ' Location: ~/.config/opencode/plugins/kimi-rotator.js' && echo ' Restart OpenCode if currently running.'",
24
+ "prepublishOnly": "npm run build",
25
+ "ci": "npm run lint && npm run format:check && npm run typecheck"
20
26
  },
21
27
  "keywords": [
22
28
  "opencode",
@@ -40,15 +46,20 @@
40
46
  },
41
47
  "homepage": "https://github.com/deyndev/opencode-kimi-rotator#readme",
42
48
  "dependencies": {
43
- "@opencode-ai/plugin": "^0.15.30",
49
+ "@opencode-ai/plugin": "^1.1.48",
44
50
  "proper-lockfile": "^4.1.2",
45
51
  "zod": "^3.22.4"
46
52
  },
47
53
  "devDependencies": {
54
+ "@eslint/js": "^9.19.0",
48
55
  "@types/node": "^20.10.0",
49
56
  "@types/proper-lockfile": "^4.1.4",
50
57
  "esbuild": "^0.27.2",
51
- "typescript": "^5.3.0"
58
+ "eslint": "^9.19.0",
59
+ "eslint-config-prettier": "^10.0.1",
60
+ "prettier": "^3.4.2",
61
+ "typescript": "^5.3.0",
62
+ "typescript-eslint": "^8.22.0"
52
63
  },
53
64
  "files": [
54
65
  "dist",
@@ -63,4 +74,4 @@
63
74
  "publishConfig": {
64
75
  "access": "public"
65
76
  }
66
- }
77
+ }
package/src/plugin.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 { KimiAccountManager } from './accounts.js';
3
3
  import type { KimiAccount } from './types.js';
4
4
 
@@ -8,7 +8,7 @@ interface OpenCodeAuth {
8
8
  }
9
9
 
10
10
  let accountManager: KimiAccountManager | null = null;
11
- let currentAccountIndex: number = 0;
11
+ let currentAccountIndex = 0;
12
12
  let originalFetch: typeof globalThis.fetch | null = null;
13
13
 
14
14
  async function getAccountManager(): Promise<KimiAccountManager> {
@@ -37,11 +37,13 @@ async function getAuth(): Promise<OpenCodeAuth | null> {
37
37
 
38
38
  let openCodeClient: {
39
39
  tui?: {
40
- showToast: (options: { body: { message: string; variant: 'info' | 'warning' | 'error' } }) => Promise<unknown>;
40
+ showToast: (options: {
41
+ body: { message: string; variant: 'info' | 'warning' | 'error' };
42
+ }) => Promise<unknown>;
41
43
  };
42
44
  } | null = null;
43
45
 
44
- let toastQueue: Array<{ message: string; variant: 'info' | 'warning' | 'error' }> = [];
46
+ let toastQueue: { message: string; variant: 'info' | 'warning' | 'error' }[] = [];
45
47
 
46
48
  async function showToast(message: string, variant: 'info' | 'warning' | 'error' = 'info') {
47
49
  if (!openCodeClient?.tui?.showToast) {
@@ -61,7 +63,9 @@ async function flushToastQueue() {
61
63
  const toast = toastQueue.shift();
62
64
  if (toast) {
63
65
  try {
64
- await openCodeClient.tui.showToast({ body: { message: toast.message, variant: toast.variant } });
66
+ await openCodeClient.tui.showToast({
67
+ body: { message: toast.message, variant: toast.variant },
68
+ });
65
69
  } catch {
66
70
  return;
67
71
  }
@@ -83,64 +87,103 @@ export const KimiRotatorPlugin: Plugin = async ({ client }) => {
83
87
  }
84
88
 
85
89
  originalFetch = globalThis.fetch;
86
- globalThis.fetch = async (input: string | Request | URL, init?: RequestInit): Promise<Response> => {
90
+ globalThis.fetch = async (
91
+ input: string | Request | URL,
92
+ init?: RequestInit
93
+ ): Promise<Response> => {
87
94
  const url = typeof input === 'string' ? input : input.toString();
88
95
 
89
96
  if (url.includes('api.kimi.com')) {
90
- const nextAccount = await accountManager!.getNextAccount();
97
+ if (!accountManager) {
98
+ throw new Error('Account manager not initialized');
99
+ }
100
+ const nextAccount = await accountManager.getNextAccount();
91
101
  if (nextAccount) {
92
102
  currentAccountIndex = nextAccount.index;
93
103
  const keyLabel = nextAccount.account.key.substring(0, 18) + '...';
94
104
  const position = nextAccount.index + 1;
95
- const allKeysNow = await accountManager!.listKeys();
105
+ const allKeysNow = await accountManager.listKeys();
96
106
  const total = allKeysNow.length;
97
107
 
98
- await showToast(`🔄 Using key: ${keyLabel} (${position}/${total})`, 'info');
108
+ await showToast(`🔄 Using key: ${keyLabel} (${String(position)}/${String(total)})`, 'info');
99
109
 
100
110
  const headers = new Headers(init?.headers);
101
111
  headers.set('x-api-key', nextAccount.account.key);
102
112
  headers.delete('Authorization');
103
113
 
114
+ const requestStartTime = Date.now();
115
+ const today = new Date().toISOString().split('T')[0];
116
+
117
+ if (!originalFetch) {
118
+ throw new Error('Original fetch not available');
119
+ }
120
+
104
121
  try {
105
- const response = await originalFetch!(input, { ...init, headers });
122
+ const response = await originalFetch(input, { ...init, headers });
123
+ const responseTime = Date.now() - requestStartTime;
106
124
 
107
125
  if (response.status === 429) {
108
126
  const retryAfter = response.headers.get('retry-after');
109
127
  const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 60000;
110
- await accountManager!.markAccountRateLimited(currentAccountIndex, retryAfterMs);
111
- await showToast(`⚠️ Key ${position} rate limited`, 'warning');
128
+ await accountManager.markAccountRateLimited(currentAccountIndex, retryAfterMs);
129
+ await showToast(`⚠️ Key ${String(position)} rate limited`, 'warning');
112
130
  } else if (response.ok) {
113
- await accountManager!.markAccountSuccess(currentAccountIndex);
131
+ await accountManager.markAccountSuccess(currentAccountIndex, responseTime, today);
114
132
  } else if (response.status >= 500) {
115
- await accountManager!.markAccountFailure(currentAccountIndex);
133
+ await accountManager.markAccountFailure(currentAccountIndex);
134
+ } else if (response.status === 400 || response.status === 403) {
135
+ // Check for billing limit error in response body
136
+ // We need to clone the response to read the body without consuming it
137
+ const clonedResponse = response.clone();
138
+ try {
139
+ const bodyText = await clonedResponse.text();
140
+ if (bodyText.includes("You've reached your usage limit for this billing cycle")) {
141
+ await accountManager.markAccountBillingLimited(currentAccountIndex);
142
+ const resetTime = new Date();
143
+ resetTime.setDate(resetTime.getDate() + 1);
144
+ resetTime.setHours(0, 0, 0, 0);
145
+ const hoursUntilReset = Math.ceil((resetTime.getTime() - Date.now()) / (1000 * 60 * 60));
146
+ await showToast(
147
+ `🚫 Key ${String(position)} billing limit reached - cooldown for ${String(hoursUntilReset)}h`,
148
+ 'warning'
149
+ );
150
+ }
151
+ } catch {
152
+ // Ignore errors reading response body
153
+ }
116
154
  }
117
155
 
118
156
  return response;
119
157
  } catch (error: unknown) {
120
- await accountManager!.markAccountFailure(currentAccountIndex);
158
+ await accountManager.markAccountFailure(currentAccountIndex);
121
159
  throw error;
122
160
  }
123
161
  }
124
162
  }
125
163
 
126
- return originalFetch!(input, init);
164
+ if (!originalFetch) {
165
+ throw new Error('Original fetch not available');
166
+ }
167
+ return originalFetch(input, init);
127
168
  };
128
169
 
129
170
  const showInitialToast = async () => {
130
- await new Promise(resolve => setTimeout(resolve, 500));
171
+ await new Promise((resolve) => setTimeout(resolve, 500));
131
172
  await flushToastQueue();
132
- await showToast("🎉 Kimi Rotator Plugin loaded!", 'info');
173
+ await showToast('🎉 Kimi Rotator Plugin loaded!', 'info');
133
174
  };
134
175
 
135
- showInitialToast().catch(() => { });
176
+ showInitialToast().catch(() => undefined);
136
177
 
137
178
  const pluginReturn = {
138
179
  auth: {
139
180
  provider: 'kimi-rotator',
140
- methods: [{
141
- type: 'api' as const,
142
- label: 'Kimi API Key',
143
- }],
181
+ methods: [
182
+ {
183
+ type: 'api' as const,
184
+ label: 'Kimi API Key',
185
+ },
186
+ ],
144
187
  loader: async () => {
145
188
  const auth = await getAuth();
146
189
  if (!auth) {
@@ -154,7 +197,7 @@ export const KimiRotatorPlugin: Plugin = async ({ client }) => {
154
197
  baseURL: kimiBaseUrl,
155
198
  async fetch(input: string | Request | URL, init?: RequestInit) {
156
199
  return globalThis.fetch(input, init);
157
- }
200
+ },
158
201
  };
159
202
  },
160
203
  },