@itssimplereally/opencode-kimicode-auth 0.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.
Files changed (115) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +87 -0
  3. package/dist/index.d.ts +4 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +3 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/src/constants.d.ts +69 -0
  8. package/dist/src/constants.d.ts.map +1 -0
  9. package/dist/src/constants.js +207 -0
  10. package/dist/src/constants.js.map +1 -0
  11. package/dist/src/kimi/oauth.d.ts +64 -0
  12. package/dist/src/kimi/oauth.d.ts.map +1 -0
  13. package/dist/src/kimi/oauth.js +130 -0
  14. package/dist/src/kimi/oauth.js.map +1 -0
  15. package/dist/src/plugin/accounts.d.ts +167 -0
  16. package/dist/src/plugin/accounts.d.ts.map +1 -0
  17. package/dist/src/plugin/accounts.js +843 -0
  18. package/dist/src/plugin/accounts.js.map +1 -0
  19. package/dist/src/plugin/auth.d.ts +13 -0
  20. package/dist/src/plugin/auth.d.ts.map +1 -0
  21. package/dist/src/plugin/auth.js +26 -0
  22. package/dist/src/plugin/auth.js.map +1 -0
  23. package/dist/src/plugin/cache.d.ts +14 -0
  24. package/dist/src/plugin/cache.d.ts.map +1 -0
  25. package/dist/src/plugin/cache.js +56 -0
  26. package/dist/src/plugin/cache.js.map +1 -0
  27. package/dist/src/plugin/cli.d.ts +21 -0
  28. package/dist/src/plugin/cli.d.ts.map +1 -0
  29. package/dist/src/plugin/cli.js +98 -0
  30. package/dist/src/plugin/cli.js.map +1 -0
  31. package/dist/src/plugin/config/index.d.ts +16 -0
  32. package/dist/src/plugin/config/index.d.ts.map +1 -0
  33. package/dist/src/plugin/config/index.js +16 -0
  34. package/dist/src/plugin/config/index.js.map +1 -0
  35. package/dist/src/plugin/config/loader.d.ts +36 -0
  36. package/dist/src/plugin/config/loader.d.ts.map +1 -0
  37. package/dist/src/plugin/config/loader.js +182 -0
  38. package/dist/src/plugin/config/loader.js.map +1 -0
  39. package/dist/src/plugin/config/models.d.ts +18 -0
  40. package/dist/src/plugin/config/models.d.ts.map +1 -0
  41. package/dist/src/plugin/config/models.js +26 -0
  42. package/dist/src/plugin/config/models.js.map +1 -0
  43. package/dist/src/plugin/config/schema.d.ts +107 -0
  44. package/dist/src/plugin/config/schema.d.ts.map +1 -0
  45. package/dist/src/plugin/config/schema.js +282 -0
  46. package/dist/src/plugin/config/schema.js.map +1 -0
  47. package/dist/src/plugin/config/updater.d.ts +55 -0
  48. package/dist/src/plugin/config/updater.d.ts.map +1 -0
  49. package/dist/src/plugin/config/updater.js +154 -0
  50. package/dist/src/plugin/config/updater.js.map +1 -0
  51. package/dist/src/plugin/debug.d.ts +92 -0
  52. package/dist/src/plugin/debug.d.ts.map +1 -0
  53. package/dist/src/plugin/debug.js +406 -0
  54. package/dist/src/plugin/debug.js.map +1 -0
  55. package/dist/src/plugin/errors.d.ts +28 -0
  56. package/dist/src/plugin/errors.d.ts.map +1 -0
  57. package/dist/src/plugin/errors.js +42 -0
  58. package/dist/src/plugin/errors.js.map +1 -0
  59. package/dist/src/plugin/fingerprint.d.ts +41 -0
  60. package/dist/src/plugin/fingerprint.d.ts.map +1 -0
  61. package/dist/src/plugin/fingerprint.js +94 -0
  62. package/dist/src/plugin/fingerprint.js.map +1 -0
  63. package/dist/src/plugin/logger.d.ts +54 -0
  64. package/dist/src/plugin/logger.d.ts.map +1 -0
  65. package/dist/src/plugin/logger.js +120 -0
  66. package/dist/src/plugin/logger.js.map +1 -0
  67. package/dist/src/plugin/recovery/constants.d.ts +26 -0
  68. package/dist/src/plugin/recovery/constants.d.ts.map +1 -0
  69. package/dist/src/plugin/recovery/constants.js +47 -0
  70. package/dist/src/plugin/recovery/constants.js.map +1 -0
  71. package/dist/src/plugin/recovery/index.d.ts +16 -0
  72. package/dist/src/plugin/recovery/index.d.ts.map +1 -0
  73. package/dist/src/plugin/recovery/index.js +16 -0
  74. package/dist/src/plugin/recovery/index.js.map +1 -0
  75. package/dist/src/plugin/recovery/storage.d.ts +24 -0
  76. package/dist/src/plugin/recovery/storage.d.ts.map +1 -0
  77. package/dist/src/plugin/recovery/storage.js +354 -0
  78. package/dist/src/plugin/recovery/storage.js.map +1 -0
  79. package/dist/src/plugin/recovery/types.d.ts +116 -0
  80. package/dist/src/plugin/recovery/types.d.ts.map +1 -0
  81. package/dist/src/plugin/recovery/types.js +6 -0
  82. package/dist/src/plugin/recovery/types.js.map +1 -0
  83. package/dist/src/plugin/recovery.d.ts +63 -0
  84. package/dist/src/plugin/recovery.d.ts.map +1 -0
  85. package/dist/src/plugin/recovery.js +331 -0
  86. package/dist/src/plugin/recovery.js.map +1 -0
  87. package/dist/src/plugin/refresh-queue.d.ts +101 -0
  88. package/dist/src/plugin/refresh-queue.d.ts.map +1 -0
  89. package/dist/src/plugin/refresh-queue.js +248 -0
  90. package/dist/src/plugin/refresh-queue.js.map +1 -0
  91. package/dist/src/plugin/rotation.d.ts +169 -0
  92. package/dist/src/plugin/rotation.d.ts.map +1 -0
  93. package/dist/src/plugin/rotation.js +328 -0
  94. package/dist/src/plugin/rotation.js.map +1 -0
  95. package/dist/src/plugin/storage.d.ts +90 -0
  96. package/dist/src/plugin/storage.d.ts.map +1 -0
  97. package/dist/src/plugin/storage.js +450 -0
  98. package/dist/src/plugin/storage.js.map +1 -0
  99. package/dist/src/plugin/token.d.ts +19 -0
  100. package/dist/src/plugin/token.d.ts.map +1 -0
  101. package/dist/src/plugin/token.js +112 -0
  102. package/dist/src/plugin/token.js.map +1 -0
  103. package/dist/src/plugin/types.d.ts +97 -0
  104. package/dist/src/plugin/types.d.ts.map +1 -0
  105. package/dist/src/plugin/types.js +1 -0
  106. package/dist/src/plugin/types.js.map +1 -0
  107. package/dist/src/plugin/version.d.ts +14 -0
  108. package/dist/src/plugin/version.d.ts.map +1 -0
  109. package/dist/src/plugin/version.js +20 -0
  110. package/dist/src/plugin/version.js.map +1 -0
  111. package/dist/src/plugin.d.ts +5 -0
  112. package/dist/src/plugin.d.ts.map +1 -0
  113. package/dist/src/plugin.js +1077 -0
  114. package/dist/src/plugin.js.map +1 -0
  115. package/package.json +55 -0
@@ -0,0 +1,92 @@
1
+ import type { KimicodeConfig } from "./config";
2
+ export declare const DEBUG_MESSAGE_PREFIX = "[opencode-kimicode-auth debug]";
3
+ /**
4
+ * Initialize or reinitialize debug state with the given config.
5
+ * Call this once at plugin startup after loading config.
6
+ */
7
+ export declare function initializeDebug(config: KimicodeConfig): void;
8
+ export declare function isDebugEnabled(): boolean;
9
+ export declare function isVerboseEnabled(): boolean;
10
+ export declare function getLogFilePath(): string | undefined;
11
+ export interface KimicodeDebugContext {
12
+ id: string;
13
+ streaming: boolean;
14
+ startedAt: number;
15
+ }
16
+ interface KimicodeDebugRequestMeta {
17
+ originalUrl: string;
18
+ resolvedUrl: string;
19
+ method?: string;
20
+ headers?: HeadersInit;
21
+ body?: BodyInit | null;
22
+ streaming: boolean;
23
+ projectId?: string;
24
+ }
25
+ interface KimicodeDebugResponseMeta {
26
+ body?: string;
27
+ note?: string;
28
+ error?: unknown;
29
+ headersOverride?: HeadersInit;
30
+ }
31
+ /**
32
+ * Begins a debug trace for an Kimicode request.
33
+ */
34
+ export declare function startKimicodeDebugRequest(meta: KimicodeDebugRequestMeta): KimicodeDebugContext | null;
35
+ /**
36
+ * Logs response details for a previously started debug trace.
37
+ */
38
+ export declare function logKimicodeDebugResponse(context: KimicodeDebugContext | null | undefined, response: Response, meta?: KimicodeDebugResponseMeta): void;
39
+ export interface AccountDebugInfo {
40
+ index: number;
41
+ email?: string;
42
+ family: string;
43
+ totalAccounts: number;
44
+ rateLimitState?: {
45
+ kimi?: number;
46
+ };
47
+ }
48
+ export declare function logAccountContext(label: string, info: AccountDebugInfo): void;
49
+ export declare function logRateLimitEvent(accountIndex: number, email: string | undefined, family: string, status: number, retryAfterMs: number, bodyInfo: {
50
+ message?: string;
51
+ quotaResetTime?: string;
52
+ retryDelayMs?: number | null;
53
+ reason?: string;
54
+ }): void;
55
+ export declare function logRateLimitSnapshot(family: string, accounts: Array<{
56
+ index: number;
57
+ email?: string;
58
+ rateLimitResetTimes?: {
59
+ kimi?: number;
60
+ };
61
+ }>): void;
62
+ export declare function logResponseBody(context: KimicodeDebugContext | null | undefined, response: Response, status: number): Promise<string | undefined>;
63
+ export declare function logModelFamily(url: string, extractedModel: string | null, family: string): void;
64
+ export declare function debugLogToFile(message: string): void;
65
+ /**
66
+ * Logs a toast message to the debug file.
67
+ * This helps correlate what the user saw with debug events.
68
+ */
69
+ export declare function logToast(message: string, variant: "info" | "warning" | "success" | "error"): void;
70
+ /**
71
+ * Logs retry attempt information.
72
+ * @param maxAttempts - Use -1 for unlimited retries
73
+ */
74
+ export declare function logRetryAttempt(attempt: number, maxAttempts: number, reason: string, delayMs?: number): void;
75
+ /**
76
+ * Logs cache hit/miss information from response usage metadata.
77
+ */
78
+ export declare function logCacheStats(model: string, cacheReadTokens: number, cacheWriteTokens: number, totalInputTokens: number): void;
79
+ /**
80
+ * Logs quota status for an account.
81
+ */
82
+ export declare function logQuotaStatus(accountEmail: string | undefined, accountIndex: number, quotaPercent: number, family?: string): void;
83
+ /**
84
+ * Logs background quota fetch events.
85
+ */
86
+ export declare function logQuotaFetch(event: "start" | "complete" | "error", accountCount?: number, details?: string): void;
87
+ /**
88
+ * Logs which model is being used for a request.
89
+ */
90
+ export declare function logModelUsed(requestedModel: string, actualModel: string, accountEmail?: string): void;
91
+ export {};
92
+ //# sourceMappingURL=debug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../../src/plugin/debug.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,406 @@
1
+ import { createWriteStream, mkdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { env } from "node:process";
5
+ import { ensureGitignoreSync } from "./storage";
6
+ const MAX_BODY_PREVIEW_CHARS = 12000;
7
+ const MAX_BODY_VERBOSE_CHARS = 50000;
8
+ export const DEBUG_MESSAGE_PREFIX = "[opencode-kimicode-auth debug]";
9
+ let debugState = null;
10
+ /**
11
+ * Parse debug level from a flag string.
12
+ * 0 = off, 1 = basic, 2 = verbose (full bodies)
13
+ */
14
+ function parseDebugLevel(flag) {
15
+ const trimmed = flag.trim();
16
+ if (trimmed === "2" || trimmed === "verbose")
17
+ return 2;
18
+ if (trimmed === "1" || trimmed === "true")
19
+ return 1;
20
+ return 0;
21
+ }
22
+ /**
23
+ * Get the OS-specific config directory.
24
+ */
25
+ function getConfigDir() {
26
+ const platform = process.platform;
27
+ if (platform === "win32") {
28
+ return join(env.APPDATA || join(homedir(), "AppData", "Roaming"), "opencode");
29
+ }
30
+ const xdgConfig = env.XDG_CONFIG_HOME || join(homedir(), ".config");
31
+ return join(xdgConfig, "opencode");
32
+ }
33
+ /**
34
+ * Returns the logs directory, creating it if needed.
35
+ */
36
+ function getLogsDir(customLogDir) {
37
+ const logsDir = customLogDir || join(getConfigDir(), "kimicode-logs");
38
+ try {
39
+ mkdirSync(logsDir, { recursive: true });
40
+ }
41
+ catch {
42
+ // Directory may already exist or we don't have permission
43
+ }
44
+ return logsDir;
45
+ }
46
+ /**
47
+ * Builds a timestamped log file path.
48
+ */
49
+ function createLogFilePath(customLogDir) {
50
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
51
+ return join(getLogsDir(customLogDir), `kimicode-debug-${timestamp}.log`);
52
+ }
53
+ /**
54
+ * Creates a log writer function that writes to a file.
55
+ */
56
+ function createLogWriter(filePath) {
57
+ if (!filePath) {
58
+ return () => { };
59
+ }
60
+ try {
61
+ const stream = createWriteStream(filePath, { flags: "a" });
62
+ stream.on("error", () => { });
63
+ return (line) => {
64
+ const timestamp = new Date().toISOString();
65
+ const formatted = `[${timestamp}] ${line}`;
66
+ stream.write(`${formatted}\n`);
67
+ };
68
+ }
69
+ catch {
70
+ return () => { };
71
+ }
72
+ }
73
+ /**
74
+ * Initialize or reinitialize debug state with the given config.
75
+ * Call this once at plugin startup after loading config.
76
+ */
77
+ export function initializeDebug(config) {
78
+ // Config takes precedence, but env var can force enable for debugging
79
+ const envDebugFlag = env.OPENCODE_KIMICODE_DEBUG ?? "";
80
+ const debugLevel = config.debug ? (envDebugFlag === "2" || envDebugFlag === "verbose" ? 2 : 1) : parseDebugLevel(envDebugFlag);
81
+ const debugEnabled = debugLevel >= 1;
82
+ const verboseEnabled = debugLevel >= 2;
83
+ const logFilePath = debugEnabled ? createLogFilePath(config.log_dir) : undefined;
84
+ const logWriter = createLogWriter(logFilePath);
85
+ if (debugEnabled) {
86
+ ensureGitignoreSync(getConfigDir());
87
+ }
88
+ debugState = {
89
+ debugLevel,
90
+ debugEnabled,
91
+ verboseEnabled,
92
+ logFilePath,
93
+ logWriter,
94
+ };
95
+ }
96
+ /**
97
+ * Get the current debug state, initializing with defaults if needed.
98
+ * This allows the module to work even before initializeDebug is called.
99
+ */
100
+ function getDebugState() {
101
+ if (!debugState) {
102
+ // Fallback to env-based initialization for backward compatibility
103
+ const envDebugFlag = env.OPENCODE_KIMICODE_DEBUG ?? "";
104
+ const debugLevel = parseDebugLevel(envDebugFlag);
105
+ const debugEnabled = debugLevel >= 1;
106
+ const verboseEnabled = debugLevel >= 2;
107
+ const logFilePath = debugEnabled ? createLogFilePath() : undefined;
108
+ const logWriter = createLogWriter(logFilePath);
109
+ debugState = {
110
+ debugLevel,
111
+ debugEnabled,
112
+ verboseEnabled,
113
+ logFilePath,
114
+ logWriter,
115
+ };
116
+ }
117
+ return debugState;
118
+ }
119
+ // =============================================================================
120
+ // Public API
121
+ // =============================================================================
122
+ export function isDebugEnabled() {
123
+ return getDebugState().debugEnabled;
124
+ }
125
+ export function isVerboseEnabled() {
126
+ return getDebugState().verboseEnabled;
127
+ }
128
+ export function getLogFilePath() {
129
+ return getDebugState().logFilePath;
130
+ }
131
+ let requestCounter = 0;
132
+ /**
133
+ * Begins a debug trace for an Kimicode request.
134
+ */
135
+ export function startKimicodeDebugRequest(meta) {
136
+ const state = getDebugState();
137
+ if (!state.debugEnabled) {
138
+ return null;
139
+ }
140
+ const id = `KIMICODE-${++requestCounter}`;
141
+ const method = meta.method ?? "GET";
142
+ logDebug(`[Kimicode Debug ${id}] pid=${process.pid} ${method} ${meta.resolvedUrl}`);
143
+ if (meta.originalUrl && meta.originalUrl !== meta.resolvedUrl) {
144
+ logDebug(`[Kimicode Debug ${id}] Original URL: ${meta.originalUrl}`);
145
+ }
146
+ if (meta.projectId) {
147
+ logDebug(`[Kimicode Debug ${id}] Project: ${meta.projectId}`);
148
+ }
149
+ logDebug(`[Kimicode Debug ${id}] Streaming: ${meta.streaming ? "yes" : "no"}`);
150
+ logDebug(`[Kimicode Debug ${id}] Headers: ${JSON.stringify(maskHeaders(meta.headers))}`);
151
+ const bodyPreview = formatBodyPreview(meta.body);
152
+ if (bodyPreview) {
153
+ logDebug(`[Kimicode Debug ${id}] Body Preview: ${bodyPreview}`);
154
+ }
155
+ return { id, streaming: meta.streaming, startedAt: Date.now() };
156
+ }
157
+ /**
158
+ * Logs response details for a previously started debug trace.
159
+ */
160
+ export function logKimicodeDebugResponse(context, response, meta = {}) {
161
+ const state = getDebugState();
162
+ if (!state.debugEnabled || !context) {
163
+ return;
164
+ }
165
+ const durationMs = Date.now() - context.startedAt;
166
+ logDebug(`[Kimicode Debug ${context.id}] Response ${response.status} ${response.statusText} (${durationMs}ms)`);
167
+ logDebug(`[Kimicode Debug ${context.id}] Response Headers: ${JSON.stringify(maskHeaders(meta.headersOverride ?? response.headers))}`);
168
+ if (meta.note) {
169
+ logDebug(`[Kimicode Debug ${context.id}] Note: ${meta.note}`);
170
+ }
171
+ if (meta.error) {
172
+ logDebug(`[Kimicode Debug ${context.id}] Error: ${formatError(meta.error)}`);
173
+ }
174
+ if (meta.body) {
175
+ logDebug(`[Kimicode Debug ${context.id}] Response Body Preview: ${truncateForLog(meta.body)}`);
176
+ }
177
+ }
178
+ /**
179
+ * Obscures sensitive headers and returns a plain object for logging.
180
+ */
181
+ function maskHeaders(headers) {
182
+ if (!headers) {
183
+ return {};
184
+ }
185
+ const result = {};
186
+ const parsed = headers instanceof Headers ? headers : new Headers(headers);
187
+ parsed.forEach((value, key) => {
188
+ if (key.toLowerCase() === "authorization") {
189
+ result[key] = "[redacted]";
190
+ }
191
+ else {
192
+ result[key] = value;
193
+ }
194
+ });
195
+ return result;
196
+ }
197
+ /**
198
+ * Produces a short, type-aware preview of a request/response body for logs.
199
+ */
200
+ function formatBodyPreview(body) {
201
+ if (body == null) {
202
+ return undefined;
203
+ }
204
+ if (typeof body === "string") {
205
+ return truncateForLog(body);
206
+ }
207
+ if (body instanceof URLSearchParams) {
208
+ return truncateForLog(body.toString());
209
+ }
210
+ if (typeof Blob !== "undefined" && body instanceof Blob) {
211
+ return `[Blob size=${body.size}]`;
212
+ }
213
+ if (typeof FormData !== "undefined" && body instanceof FormData) {
214
+ return "[FormData payload omitted]";
215
+ }
216
+ return `[${body.constructor?.name ?? typeof body} payload omitted]`;
217
+ }
218
+ /**
219
+ * Truncates long strings to a fixed preview length for logging.
220
+ */
221
+ function truncateForLog(text) {
222
+ if (text.length <= MAX_BODY_PREVIEW_CHARS) {
223
+ return text;
224
+ }
225
+ return `${text.slice(0, MAX_BODY_PREVIEW_CHARS)}... (truncated ${text.length - MAX_BODY_PREVIEW_CHARS} chars)`;
226
+ }
227
+ /**
228
+ * Writes a single debug line using the configured writer.
229
+ */
230
+ function logDebug(line) {
231
+ getDebugState().logWriter(line);
232
+ }
233
+ /**
234
+ * Converts unknown error-like values into printable strings.
235
+ */
236
+ function formatError(error) {
237
+ if (error instanceof Error) {
238
+ return error.stack ?? error.message;
239
+ }
240
+ try {
241
+ return JSON.stringify(error);
242
+ }
243
+ catch {
244
+ return String(error);
245
+ }
246
+ }
247
+ export function logAccountContext(label, info) {
248
+ if (!getDebugState().debugEnabled)
249
+ return;
250
+ const accountLabel = info.email
251
+ ? info.email
252
+ : info.index >= 0
253
+ ? `Account ${info.index + 1}`
254
+ : "All accounts";
255
+ const indexLabel = info.index >= 0 ? `${info.index + 1}/${info.totalAccounts}` : `-/${info.totalAccounts}`;
256
+ let rateLimitInfo = "";
257
+ if (info.rateLimitState && Object.keys(info.rateLimitState).length > 0) {
258
+ const now = Date.now();
259
+ const activeRateLimits = {};
260
+ for (const [key, resetTime] of Object.entries(info.rateLimitState)) {
261
+ if (typeof resetTime === "number" && resetTime > now) {
262
+ const remainingSec = Math.ceil((resetTime - now) / 1000);
263
+ activeRateLimits[key] = `${remainingSec}s`;
264
+ }
265
+ }
266
+ if (Object.keys(activeRateLimits).length > 0) {
267
+ rateLimitInfo = ` rateLimits=${JSON.stringify(activeRateLimits)}`;
268
+ }
269
+ }
270
+ logDebug(`[Account] ${label}: ${accountLabel} (${indexLabel}) family=${info.family}${rateLimitInfo}`);
271
+ }
272
+ export function logRateLimitEvent(accountIndex, email, family, status, retryAfterMs, bodyInfo) {
273
+ if (!getDebugState().debugEnabled)
274
+ return;
275
+ const accountLabel = email || `Account ${accountIndex + 1}`;
276
+ logDebug(`[RateLimit] ${status} on ${accountLabel} family=${family} retryAfterMs=${retryAfterMs}`);
277
+ if (bodyInfo.message) {
278
+ logDebug(`[RateLimit] message: ${bodyInfo.message}`);
279
+ }
280
+ if (bodyInfo.quotaResetTime) {
281
+ logDebug(`[RateLimit] quotaResetTime: ${bodyInfo.quotaResetTime}`);
282
+ }
283
+ if (bodyInfo.retryDelayMs !== undefined && bodyInfo.retryDelayMs !== null) {
284
+ logDebug(`[RateLimit] body retryDelayMs: ${bodyInfo.retryDelayMs}`);
285
+ }
286
+ if (bodyInfo.reason) {
287
+ logDebug(`[RateLimit] reason: ${bodyInfo.reason}`);
288
+ }
289
+ }
290
+ export function logRateLimitSnapshot(family, accounts) {
291
+ if (!getDebugState().debugEnabled)
292
+ return;
293
+ const now = Date.now();
294
+ const entries = accounts.map((account) => {
295
+ const label = account.email ? account.email : `Account ${account.index + 1}`;
296
+ const reset = account.rateLimitResetTimes?.[family];
297
+ if (typeof reset !== "number") {
298
+ return `${label}=ready`;
299
+ }
300
+ const remaining = Math.max(0, reset - now);
301
+ const seconds = Math.ceil(remaining / 1000);
302
+ return `${label}=wait ${seconds}s`;
303
+ });
304
+ logDebug(`[RateLimit] snapshot family=${family} ${entries.join(" | ")}`);
305
+ }
306
+ export async function logResponseBody(context, response, status) {
307
+ const state = getDebugState();
308
+ if (!state.debugEnabled || !context)
309
+ return undefined;
310
+ const isError = status >= 400;
311
+ const shouldLogBody = state.verboseEnabled || isError;
312
+ if (!shouldLogBody)
313
+ return undefined;
314
+ try {
315
+ const text = await response.clone().text();
316
+ const maxChars = state.verboseEnabled ? MAX_BODY_VERBOSE_CHARS : MAX_BODY_PREVIEW_CHARS;
317
+ const preview = text.length <= maxChars
318
+ ? text
319
+ : `${text.slice(0, maxChars)}... (truncated ${text.length - maxChars} chars)`;
320
+ logDebug(`[Kimicode Debug ${context.id}] Response Body (${status}): ${preview}`);
321
+ return text;
322
+ }
323
+ catch (e) {
324
+ logDebug(`[Kimicode Debug ${context.id}] Failed to read response body: ${formatError(e)}`);
325
+ return undefined;
326
+ }
327
+ }
328
+ export function logModelFamily(url, extractedModel, family) {
329
+ if (!getDebugState().debugEnabled)
330
+ return;
331
+ logDebug(`[ModelFamily] url=${url} model=${extractedModel ?? "unknown"} family=${family}`);
332
+ }
333
+ export function debugLogToFile(message) {
334
+ if (!getDebugState().debugEnabled)
335
+ return;
336
+ logDebug(message);
337
+ }
338
+ /**
339
+ * Logs a toast message to the debug file.
340
+ * This helps correlate what the user saw with debug events.
341
+ */
342
+ export function logToast(message, variant) {
343
+ if (!getDebugState().debugEnabled)
344
+ return;
345
+ const variantLabel = variant.toUpperCase();
346
+ logDebug(`[Toast/${variantLabel}] ${message}`);
347
+ }
348
+ /**
349
+ * Logs retry attempt information.
350
+ * @param maxAttempts - Use -1 for unlimited retries
351
+ */
352
+ export function logRetryAttempt(attempt, maxAttempts, reason, delayMs) {
353
+ if (!getDebugState().debugEnabled)
354
+ return;
355
+ const delayInfo = delayMs !== undefined ? ` delay=${delayMs}ms` : "";
356
+ const maxInfo = maxAttempts < 0 ? "∞" : maxAttempts.toString();
357
+ logDebug(`[Retry] Attempt ${attempt}/${maxInfo} reason=${reason}${delayInfo}`);
358
+ }
359
+ /**
360
+ * Logs cache hit/miss information from response usage metadata.
361
+ */
362
+ export function logCacheStats(model, cacheReadTokens, cacheWriteTokens, totalInputTokens) {
363
+ if (!getDebugState().debugEnabled)
364
+ return;
365
+ const cacheHitRate = totalInputTokens > 0
366
+ ? Math.round((cacheReadTokens / totalInputTokens) * 100)
367
+ : 0;
368
+ const status = cacheReadTokens > 0 ? "HIT" : (cacheWriteTokens > 0 ? "WRITE" : "MISS");
369
+ logDebug(`[Cache] ${status} model=${model} read=${cacheReadTokens} write=${cacheWriteTokens} total=${totalInputTokens} hitRate=${cacheHitRate}%`);
370
+ }
371
+ /**
372
+ * Logs quota status for an account.
373
+ */
374
+ export function logQuotaStatus(accountEmail, accountIndex, quotaPercent, family) {
375
+ if (!getDebugState().debugEnabled)
376
+ return;
377
+ const accountLabel = accountEmail || `Account ${accountIndex + 1}`;
378
+ const familyInfo = family ? ` family=${family}` : "";
379
+ const status = quotaPercent <= 0 ? "EXHAUSTED" : quotaPercent < 20 ? "LOW" : "OK";
380
+ logDebug(`[Quota] ${accountLabel} remaining=${quotaPercent.toFixed(1)}% status=${status}${familyInfo}`);
381
+ }
382
+ /**
383
+ * Logs background quota fetch events.
384
+ */
385
+ export function logQuotaFetch(event, accountCount, details) {
386
+ if (!getDebugState().debugEnabled)
387
+ return;
388
+ const countInfo = accountCount !== undefined ? ` accounts=${accountCount}` : "";
389
+ const detailsInfo = details ? ` ${details}` : "";
390
+ logDebug(`[QuotaFetch] ${event.toUpperCase()}${countInfo}${detailsInfo}`);
391
+ }
392
+ /**
393
+ * Logs which model is being used for a request.
394
+ */
395
+ export function logModelUsed(requestedModel, actualModel, accountEmail) {
396
+ if (!getDebugState().debugEnabled)
397
+ return;
398
+ const accountInfo = accountEmail ? ` account=${accountEmail}` : "";
399
+ if (requestedModel !== actualModel) {
400
+ logDebug(`[Model] requested=${requestedModel} actual=${actualModel}${accountInfo}`);
401
+ }
402
+ else {
403
+ logDebug(`[Model] ${actualModel}${accountInfo}`);
404
+ }
405
+ }
406
+ //# sourceMappingURL=debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../../src/plugin/debug.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Custom error types for opencode-kimicode-auth plugin.
3
+ *
4
+ * Ported from LLM-API-Key-Proxy for robust error handling.
5
+ */
6
+ /**
7
+ * Error thrown when the provider returns an empty response after retry attempts.
8
+ *
9
+ * Empty responses can occur when:
10
+ * - The model has no candidates/choices
11
+ * - The response body is empty or malformed
12
+ * - A temporary service issue prevents generation
13
+ */
14
+ export declare class EmptyResponseError extends Error {
15
+ readonly provider: string;
16
+ readonly model: string;
17
+ readonly attempts: number;
18
+ constructor(provider: string, model: string, attempts: number, message?: string);
19
+ }
20
+ /**
21
+ * Error thrown when tool ID matching fails and cannot be recovered.
22
+ */
23
+ export declare class ToolIdMismatchError extends Error {
24
+ readonly expectedIds: string[];
25
+ readonly foundIds: string[];
26
+ constructor(expectedIds: string[], foundIds: string[], message?: string);
27
+ }
28
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/plugin/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;GAOG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAGxB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM;CAYnB;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;gBAEhB,WAAW,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM;CASxE"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Custom error types for opencode-kimicode-auth plugin.
3
+ *
4
+ * Ported from LLM-API-Key-Proxy for robust error handling.
5
+ */
6
+ /**
7
+ * Error thrown when the provider returns an empty response after retry attempts.
8
+ *
9
+ * Empty responses can occur when:
10
+ * - The model has no candidates/choices
11
+ * - The response body is empty or malformed
12
+ * - A temporary service issue prevents generation
13
+ */
14
+ export class EmptyResponseError extends Error {
15
+ provider;
16
+ model;
17
+ attempts;
18
+ constructor(provider, model, attempts, message) {
19
+ super(message ??
20
+ `The model returned an empty response after ${attempts} attempts. ` +
21
+ `This may indicate a temporary service issue. Please try again.`);
22
+ this.name = "EmptyResponseError";
23
+ this.provider = provider;
24
+ this.model = model;
25
+ this.attempts = attempts;
26
+ }
27
+ }
28
+ /**
29
+ * Error thrown when tool ID matching fails and cannot be recovered.
30
+ */
31
+ export class ToolIdMismatchError extends Error {
32
+ expectedIds;
33
+ foundIds;
34
+ constructor(expectedIds, foundIds, message) {
35
+ super(message ??
36
+ `Tool ID mismatch: expected [${expectedIds.join(", ")}] but found [${foundIds.join(", ")}]`);
37
+ this.name = "ToolIdMismatchError";
38
+ this.expectedIds = expectedIds;
39
+ this.foundIds = foundIds;
40
+ }
41
+ }
42
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/plugin/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;GAOG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,QAAQ,CAAS;IACjB,KAAK,CAAS;IACd,QAAQ,CAAS;IAE1B,YACE,QAAgB,EAChB,KAAa,EACb,QAAgB,EAChB,OAAgB;QAEhB,KAAK,CACH,OAAO;YACL,8CAA8C,QAAQ,aAAa;gBACnE,gEAAgE,CACnE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,WAAW,CAAW;IACtB,QAAQ,CAAW;IAE5B,YAAY,WAAqB,EAAE,QAAkB,EAAE,OAAgB;QACrE,KAAK,CACH,OAAO;YACL,+BAA+B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC9F,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Device Identity Module
3
+ *
4
+ * Generates unique device identifiers for Kimi Code API requests.
5
+ * Used for device fingerprinting in X-Msh-Device-Id headers.
6
+ */
7
+ export interface Fingerprint {
8
+ deviceId: string;
9
+ createdAt: number;
10
+ }
11
+ /**
12
+ * Fingerprint version for history tracking.
13
+ * Stores a snapshot of a fingerprint with metadata about when/why it was saved.
14
+ */
15
+ export interface FingerprintVersion {
16
+ fingerprint: Fingerprint;
17
+ timestamp: number;
18
+ reason: 'initial' | 'regenerated' | 'restored';
19
+ }
20
+ /** Maximum number of fingerprint versions to keep per account */
21
+ export declare const MAX_FINGERPRINT_HISTORY = 5;
22
+ /**
23
+ * Generate a device identity with a unique device ID.
24
+ */
25
+ export declare function generateFingerprint(): Fingerprint;
26
+ /**
27
+ * Best-effort coercion of stored fingerprints.
28
+ * Keeps existing device ids when valid, normalizes legacy UUIDs, and regenerates when missing/corrupt.
29
+ */
30
+ export declare function coerceFingerprint(value: unknown): Fingerprint;
31
+ /**
32
+ * Get or create the session fingerprint.
33
+ * Returns the same fingerprint for all calls within a session.
34
+ */
35
+ export declare function getSessionFingerprint(): Fingerprint;
36
+ /**
37
+ * Regenerate the session fingerprint.
38
+ * Call this to get a fresh identity (e.g., after rate limiting).
39
+ */
40
+ export declare function regenerateSessionFingerprint(): Fingerprint;
41
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../../src/plugin/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC;CAChD;AAED,iEAAiE;AACjE,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAkCzC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,WAAW,CAMjD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAuB7D;AAQD;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,CAKnD;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,WAAW,CAG1D"}