@mdrv/opencode-quota 262.0.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/LICENSE +21 -0
- package/README.md +189 -0
- package/bin/copilot-quota.ts +374 -0
- package/bin/glm-quota.ts +467 -0
- package/bin/install.js +439 -0
- package/bin/kimi-quota.ts +314 -0
- package/dist/bin/copilot-quota.d.ts +8 -0
- package/dist/bin/copilot-quota.d.ts.map +1 -0
- package/dist/bin/copilot-quota.js +298 -0
- package/dist/bin/copilot-quota.js.map +1 -0
- package/dist/bin/glm-quota.d.ts +8 -0
- package/dist/bin/glm-quota.d.ts.map +1 -0
- package/dist/bin/glm-quota.js +367 -0
- package/dist/bin/glm-quota.js.map +1 -0
- package/dist/bin/kimi-quota.d.ts +3 -0
- package/dist/bin/kimi-quota.d.ts.map +1 -0
- package/dist/bin/kimi-quota.js +241 -0
- package/dist/bin/kimi-quota.js.map +1 -0
- package/dist/src/api/client.d.ts +76 -0
- package/dist/src/api/client.d.ts.map +1 -0
- package/dist/src/api/client.js +203 -0
- package/dist/src/api/client.js.map +1 -0
- package/dist/src/api/endpoints.d.ts +22 -0
- package/dist/src/api/endpoints.d.ts.map +1 -0
- package/dist/src/api/endpoints.js +41 -0
- package/dist/src/api/endpoints.js.map +1 -0
- package/dist/src/api/platforms.d.ts +20 -0
- package/dist/src/api/platforms.d.ts.map +1 -0
- package/dist/src/api/platforms.js +38 -0
- package/dist/src/api/platforms.js.map +1 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +723 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/shared/logging.d.ts +7 -0
- package/dist/src/shared/logging.d.ts.map +1 -0
- package/dist/src/shared/logging.js +29 -0
- package/dist/src/shared/logging.js.map +1 -0
- package/dist/src/utils/box-constants.d.ts +43 -0
- package/dist/src/utils/box-constants.d.ts.map +1 -0
- package/dist/src/utils/box-constants.js +43 -0
- package/dist/src/utils/box-constants.js.map +1 -0
- package/dist/src/utils/date-formatter.d.ts +17 -0
- package/dist/src/utils/date-formatter.d.ts.map +1 -0
- package/dist/src/utils/date-formatter.js +33 -0
- package/dist/src/utils/date-formatter.js.map +1 -0
- package/dist/src/utils/error-formatter.d.ts +17 -0
- package/dist/src/utils/error-formatter.d.ts.map +1 -0
- package/dist/src/utils/error-formatter.js +60 -0
- package/dist/src/utils/error-formatter.js.map +1 -0
- package/dist/src/utils/progress-bar.d.ts +35 -0
- package/dist/src/utils/progress-bar.d.ts.map +1 -0
- package/dist/src/utils/progress-bar.js +43 -0
- package/dist/src/utils/progress-bar.js.map +1 -0
- package/dist/src/utils/reset-timer.d.ts +11 -0
- package/dist/src/utils/reset-timer.d.ts.map +1 -0
- package/dist/src/utils/reset-timer.js +32 -0
- package/dist/src/utils/reset-timer.js.map +1 -0
- package/dist/src/utils/time-window.d.ts +30 -0
- package/dist/src/utils/time-window.d.ts.map +1 -0
- package/dist/src/utils/time-window.js +34 -0
- package/dist/src/utils/time-window.js.map +1 -0
- package/dist/tests/error-handling/api-errors.test.d.ts +7 -0
- package/dist/tests/error-handling/api-errors.test.d.ts.map +1 -0
- package/dist/tests/error-handling/api-errors.test.js +110 -0
- package/dist/tests/error-handling/api-errors.test.js.map +1 -0
- package/dist/tests/error-handling/auth-errors.test.d.ts +7 -0
- package/dist/tests/error-handling/auth-errors.test.d.ts.map +1 -0
- package/dist/tests/error-handling/auth-errors.test.js +110 -0
- package/dist/tests/error-handling/auth-errors.test.js.map +1 -0
- package/dist/tests/error-handling/network-errors.test.d.ts +7 -0
- package/dist/tests/error-handling/network-errors.test.d.ts.map +1 -0
- package/dist/tests/error-handling/network-errors.test.js +94 -0
- package/dist/tests/error-handling/network-errors.test.js.map +1 -0
- package/dist/tests/error-handling/parse-errors.test.d.ts +7 -0
- package/dist/tests/error-handling/parse-errors.test.d.ts.map +1 -0
- package/dist/tests/error-handling/parse-errors.test.js +87 -0
- package/dist/tests/error-handling/parse-errors.test.js.map +1 -0
- package/dist/tests/error-handling/token-sanitization.test.d.ts +2 -0
- package/dist/tests/error-handling/token-sanitization.test.d.ts.map +1 -0
- package/dist/tests/error-handling/token-sanitization.test.js +59 -0
- package/dist/tests/error-handling/token-sanitization.test.js.map +1 -0
- package/dist/tests/functional/date-formatter.test.d.ts +5 -0
- package/dist/tests/functional/date-formatter.test.d.ts.map +1 -0
- package/dist/tests/functional/date-formatter.test.js +46 -0
- package/dist/tests/functional/date-formatter.test.js.map +1 -0
- package/dist/tests/functional/progress-bar.test.d.ts +5 -0
- package/dist/tests/functional/progress-bar.test.d.ts.map +1 -0
- package/dist/tests/functional/progress-bar.test.js +82 -0
- package/dist/tests/functional/progress-bar.test.js.map +1 -0
- package/dist/tests/functional/reset-timer.test.d.ts +6 -0
- package/dist/tests/functional/reset-timer.test.d.ts.map +1 -0
- package/dist/tests/functional/reset-timer.test.js +67 -0
- package/dist/tests/functional/reset-timer.test.js.map +1 -0
- package/dist/tests/functional/time-window.test.d.ts +5 -0
- package/dist/tests/functional/time-window.test.d.ts.map +1 -0
- package/dist/tests/functional/time-window.test.js +46 -0
- package/dist/tests/functional/time-window.test.js.map +1 -0
- package/dist/tests/integration/box-alignment.test.d.ts +8 -0
- package/dist/tests/integration/box-alignment.test.d.ts.map +1 -0
- package/dist/tests/integration/box-alignment.test.js +238 -0
- package/dist/tests/integration/box-alignment.test.js.map +1 -0
- package/dist/tests/integration/error-handling.test.d.ts +2 -0
- package/dist/tests/integration/error-handling.test.d.ts.map +1 -0
- package/dist/tests/integration/error-handling.test.js +36 -0
- package/dist/tests/integration/error-handling.test.js.map +1 -0
- package/dist/tests/integration/installer-config.test.d.ts +2 -0
- package/dist/tests/integration/installer-config.test.d.ts.map +1 -0
- package/dist/tests/integration/installer-config.test.js +65 -0
- package/dist/tests/integration/installer-config.test.js.map +1 -0
- package/dist/tests/integration/plugin-catch-block.test.d.ts +2 -0
- package/dist/tests/integration/plugin-catch-block.test.d.ts.map +1 -0
- package/dist/tests/integration/plugin-catch-block.test.js +134 -0
- package/dist/tests/integration/plugin-catch-block.test.js.map +1 -0
- package/dist/tests/integration/reset-time-display.test.d.ts +6 -0
- package/dist/tests/integration/reset-time-display.test.d.ts.map +1 -0
- package/dist/tests/integration/reset-time-display.test.js +138 -0
- package/dist/tests/integration/reset-time-display.test.js.map +1 -0
- package/dist/tests/module/http-client.test.d.ts +2 -0
- package/dist/tests/module/http-client.test.d.ts.map +1 -0
- package/dist/tests/module/http-client.test.js +49 -0
- package/dist/tests/module/http-client.test.js.map +1 -0
- package/dist/tests/module/platform-detection.test.d.ts +5 -0
- package/dist/tests/module/platform-detection.test.d.ts.map +1 -0
- package/dist/tests/module/platform-detection.test.js +48 -0
- package/dist/tests/module/platform-detection.test.js.map +1 -0
- package/integration/agents/copilot-quota-exec.md +20 -0
- package/integration/agents/glm-quota-exec.md +20 -0
- package/integration/command/copilot_quota.md +6 -0
- package/integration/command/glm_quota.md +6 -0
- package/integration/skills/copilot-quota/SKILL.md +11 -0
- package/integration/skills/glm-quota/SKILL.md +11 -0
- package/package.json +69 -0
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
#!/usr/bin/env -S bun
|
|
2
|
+
/**
|
|
3
|
+
* GLM quota CLI tool
|
|
4
|
+
* Fetches and displays Z.AI GLM Coding Plan usage statistics from command line
|
|
5
|
+
* Credentials are fetched from OpenCode's auth.json
|
|
6
|
+
*/
|
|
7
|
+
import * as https from 'https';
|
|
8
|
+
import * as os from 'os';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import { configureLogging, getLogger } from '../src/shared/logging.js';
|
|
11
|
+
const COMMAND_NAME = 'opencode-glm-quota';
|
|
12
|
+
const AUTH_JSON_PATH = path.join(os.homedir(), '.local', 'share', 'opencode', 'auth.json');
|
|
13
|
+
// Global logger, assigned after configureLogging()
|
|
14
|
+
let logger;
|
|
15
|
+
/**
|
|
16
|
+
* Format Unix timestamp to readable date
|
|
17
|
+
*/
|
|
18
|
+
function formatTimestamp(timestamp) {
|
|
19
|
+
const date = new Date(timestamp);
|
|
20
|
+
return date.toLocaleString('en-US', {
|
|
21
|
+
month: 'short',
|
|
22
|
+
day: 'numeric',
|
|
23
|
+
hour: '2-digit',
|
|
24
|
+
minute: '2-digit',
|
|
25
|
+
hour12: true,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Calculate duration from now to a timestamp
|
|
30
|
+
* @param timestamp - Unix timestamp in milliseconds
|
|
31
|
+
* @returns Human-readable duration (e.g., "7d 4h 32m 15s", "2h 57m 31s", "5m")
|
|
32
|
+
*/
|
|
33
|
+
function calculateDuration(timestamp) {
|
|
34
|
+
const now = new Date().getTime();
|
|
35
|
+
const diffMs = timestamp - now;
|
|
36
|
+
// If timestamp is in the past, show "0d 0h 0m 0s"
|
|
37
|
+
if (diffMs <= 0) {
|
|
38
|
+
return '0d 0h 0m 0s';
|
|
39
|
+
}
|
|
40
|
+
const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
|
|
41
|
+
const diffHours = Math.floor((diffMs % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
|
|
42
|
+
const diffMinutes = Math.floor((diffMs % (1000 * 60 * 60)) / (1000 * 60));
|
|
43
|
+
const diffSeconds = Math.floor((diffMs % (1000 * 60)) / 1000);
|
|
44
|
+
// Build duration string, hiding zero values
|
|
45
|
+
const parts = [];
|
|
46
|
+
if (diffDays > 0)
|
|
47
|
+
parts.push(`${diffDays}d`);
|
|
48
|
+
if (diffHours > 0)
|
|
49
|
+
parts.push(`${diffHours}h`);
|
|
50
|
+
if (diffMinutes > 0)
|
|
51
|
+
parts.push(`${diffMinutes}m`);
|
|
52
|
+
if (diffSeconds > 0)
|
|
53
|
+
parts.push(`${diffSeconds}s`);
|
|
54
|
+
return parts.length > 0 ? parts.join(' ') : '0s';
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Parse and format quota limit data
|
|
58
|
+
*/
|
|
59
|
+
function parseQuotaLimit(response) {
|
|
60
|
+
logger.debug('Parsing quota limit response');
|
|
61
|
+
const parsed = JSON.parse(response);
|
|
62
|
+
logger.debug(`API response code: ${parsed.code}, msg: ${parsed.msg}`);
|
|
63
|
+
if (!parsed.success || parsed.code !== 200) {
|
|
64
|
+
throw new Error(`API error: ${parsed.msg}`);
|
|
65
|
+
}
|
|
66
|
+
const { limits, level } = parsed.data;
|
|
67
|
+
logger.debug(`Plan level: ${level}, limits: ${limits.length}`);
|
|
68
|
+
let output = `Plan Level: ${level}\n`;
|
|
69
|
+
for (const limit of limits) {
|
|
70
|
+
logger.debug(`Processing limit type: ${limit.type}`);
|
|
71
|
+
const timeWindow = limit.type === 'TIME_LIMIT' ? '1-month window' : '5-hour rolling';
|
|
72
|
+
output += `\n${limit.type} (${timeWindow}):\n`;
|
|
73
|
+
output += ` Used: ${limit.percentage}%\n`;
|
|
74
|
+
if (limit.type === 'TIME_LIMIT' && limit.usageDetails) {
|
|
75
|
+
output += ` Tool Usage:\n`;
|
|
76
|
+
for (const detail of limit.usageDetails) {
|
|
77
|
+
logger.debug(`Tool ${detail.modelCode}: ${detail.usage}`);
|
|
78
|
+
output += ` ${detail.modelCode}: ${detail.usage}\n`;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (limit.type === 'TOKENS_LIMIT' && limit.usage !== undefined && limit.remaining !== undefined) {
|
|
82
|
+
output += ` Tokens: ${limit.usage} / ${limit.usage + limit.remaining}\n`;
|
|
83
|
+
}
|
|
84
|
+
const resetTime = formatTimestamp(limit.nextResetTime);
|
|
85
|
+
const duration = calculateDuration(limit.nextResetTime);
|
|
86
|
+
logger.debug(`Next reset: ${resetTime} (${duration})`);
|
|
87
|
+
output += ` Next Reset: ${resetTime} (${duration})\n`;
|
|
88
|
+
}
|
|
89
|
+
logger.info('Quota limit data parsed successfully');
|
|
90
|
+
return { parsed, formatted: output };
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Parse generic API response
|
|
94
|
+
*/
|
|
95
|
+
function parseResponse(response, endpointName) {
|
|
96
|
+
logger.debug(`Parsing ${endpointName} response`);
|
|
97
|
+
const parsed = JSON.parse(response);
|
|
98
|
+
if (!parsed.success || parsed.code !== 200) {
|
|
99
|
+
throw new Error(`API error from ${endpointName}: ${parsed.msg}`);
|
|
100
|
+
}
|
|
101
|
+
logger.debug(`${endpointName} parsed successfully`);
|
|
102
|
+
return parsed.data;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Make HTTPS request with timeout
|
|
106
|
+
*/
|
|
107
|
+
function makeRequest(url, token) {
|
|
108
|
+
logger.debug(`Making request to ${url}`);
|
|
109
|
+
logger.debug(`Using token: ${token.slice(0, 8)}...${token.slice(-4)}`);
|
|
110
|
+
return new Promise((resolve, reject) => {
|
|
111
|
+
const timeout = 10000; // 10 seconds
|
|
112
|
+
const timer = setTimeout(() => {
|
|
113
|
+
req.destroy();
|
|
114
|
+
logger.error(`Request timeout for ${url}`);
|
|
115
|
+
reject(new Error('Request timeout'));
|
|
116
|
+
}, timeout);
|
|
117
|
+
const urlObj = new URL(url);
|
|
118
|
+
const options = {
|
|
119
|
+
hostname: urlObj.hostname,
|
|
120
|
+
port: urlObj.port || 443,
|
|
121
|
+
path: urlObj.pathname + urlObj.search,
|
|
122
|
+
method: 'GET',
|
|
123
|
+
headers: {
|
|
124
|
+
'Authorization': token,
|
|
125
|
+
'Accept-Language': 'en-US,en',
|
|
126
|
+
'Content-Type': 'application/json',
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
logger.debug(`Request options: ${JSON.stringify({
|
|
130
|
+
hostname: options.hostname,
|
|
131
|
+
path: options.path,
|
|
132
|
+
method: options.method,
|
|
133
|
+
})}`);
|
|
134
|
+
const req = https.request(options, (res) => {
|
|
135
|
+
let data = '';
|
|
136
|
+
logger.debug(`Response status: ${res.statusCode} ${res.statusMessage}`);
|
|
137
|
+
res.on('data', chunk => {
|
|
138
|
+
data += chunk;
|
|
139
|
+
});
|
|
140
|
+
res.on('end', () => {
|
|
141
|
+
clearTimeout(timer);
|
|
142
|
+
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
|
|
143
|
+
logger.debug(`Response received: ${data.slice(0, 100)}... (${data.length} bytes)`);
|
|
144
|
+
resolve(data);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
logger.error(`HTTP error: ${res.statusCode} ${res.statusMessage}`);
|
|
148
|
+
logger.debug(`Error response: ${data}`);
|
|
149
|
+
reject(new Error(`HTTP ${res.statusCode}: ${res.statusMessage}`));
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
req.on('error', (err) => {
|
|
154
|
+
clearTimeout(timer);
|
|
155
|
+
logger.error(`Request error: ${err.message}`);
|
|
156
|
+
reject(err);
|
|
157
|
+
});
|
|
158
|
+
req.end();
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get credentials from OpenCode auth.json
|
|
163
|
+
*/
|
|
164
|
+
function getCredentials() {
|
|
165
|
+
logger.debug(`Looking for credentials at ${AUTH_JSON_PATH}`);
|
|
166
|
+
try {
|
|
167
|
+
const fs = require('fs');
|
|
168
|
+
if (!fs.existsSync(AUTH_JSON_PATH)) {
|
|
169
|
+
logger.debug('auth.json does not exist');
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
const content = fs.readFileSync(AUTH_JSON_PATH, 'utf-8');
|
|
173
|
+
const auth = JSON.parse(content);
|
|
174
|
+
logger.debug(`auth.json loaded with ${Object.keys(auth).length} providers`);
|
|
175
|
+
const providers = {
|
|
176
|
+
'zai-coding-plan': 'zai',
|
|
177
|
+
'zai': 'zai',
|
|
178
|
+
'zhipu': 'zhipu',
|
|
179
|
+
};
|
|
180
|
+
for (const [providerId, platform] of Object.entries(providers)) {
|
|
181
|
+
const provider = auth[providerId];
|
|
182
|
+
const token = provider?.key ?? provider?.token;
|
|
183
|
+
if (token) {
|
|
184
|
+
const credentials = {
|
|
185
|
+
token,
|
|
186
|
+
platform: platform === 'zhipu' ? 'ZHIPU' : 'ZAI',
|
|
187
|
+
};
|
|
188
|
+
logger.info(`Found credentials for provider: ${providerId}`);
|
|
189
|
+
logger.debug(`Platform: ${credentials.platform}`);
|
|
190
|
+
return credentials;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
logger.debug('No credentials found for any provider');
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
logger.error(`Error reading auth.json: ${error}`);
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Display help message
|
|
203
|
+
*/
|
|
204
|
+
function showHelp() {
|
|
205
|
+
console.log(`
|
|
206
|
+
${COMMAND_NAME} - Check Z.AI GLM Coding Plan quota from terminal
|
|
207
|
+
|
|
208
|
+
USAGE:
|
|
209
|
+
bun run bin/glm-quota.ts [--raw|--pretty] [--debug]
|
|
210
|
+
|
|
211
|
+
OPTIONS:
|
|
212
|
+
--raw Output raw JSON (default: pretty output)
|
|
213
|
+
--pretty Explicit pretty output (same as default)
|
|
214
|
+
--debug, -d Enable debug logging (logs hidden by default)
|
|
215
|
+
--help, -h Display this help message
|
|
216
|
+
|
|
217
|
+
AUTHENTICATION:
|
|
218
|
+
Reads credentials from ~/.local/share/opencode/auth.json
|
|
219
|
+
Provider: zai-coding-plan, zai, or zhipu
|
|
220
|
+
|
|
221
|
+
EXAMPLES:
|
|
222
|
+
bun run bin/glm-quota.ts
|
|
223
|
+
bun run bin/glm-quota.ts --debug
|
|
224
|
+
bun run bin/glm-quota.ts --raw
|
|
225
|
+
`);
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Main CLI entry point
|
|
229
|
+
*/
|
|
230
|
+
async function main() {
|
|
231
|
+
const args = process.argv.slice(2);
|
|
232
|
+
// Check for help flag first (before logging config)
|
|
233
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
234
|
+
showHelp();
|
|
235
|
+
process.exit(0);
|
|
236
|
+
}
|
|
237
|
+
// Check for debug flag before configuring logging
|
|
238
|
+
const debugMode = args.includes('--debug') || args.includes('-d');
|
|
239
|
+
// Only configure logging when --debug is present
|
|
240
|
+
if (debugMode) {
|
|
241
|
+
await configureLogging('debug');
|
|
242
|
+
}
|
|
243
|
+
// Create logger after configureLogging (or with no-op if not configured)
|
|
244
|
+
if (debugMode) {
|
|
245
|
+
logger = getLogger(['opencode-quota', 'cli', 'glm']);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
// No-op logger when debug mode is off
|
|
249
|
+
logger = {
|
|
250
|
+
debug: () => { },
|
|
251
|
+
info: () => { },
|
|
252
|
+
warn: () => { },
|
|
253
|
+
error: () => { },
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
logger.info(`${COMMAND_NAME} starting...`);
|
|
257
|
+
const rawOutput = args.includes('--raw');
|
|
258
|
+
// --pretty is accepted but same as default (explicitly allow it for completeness)
|
|
259
|
+
logger.debug(`Arguments: ${args.join(' ')}`);
|
|
260
|
+
logger.debug(`Raw output: ${rawOutput}`);
|
|
261
|
+
try {
|
|
262
|
+
// Get credentials from OpenCode auth.json
|
|
263
|
+
const credentials = getCredentials();
|
|
264
|
+
if (!credentials) {
|
|
265
|
+
logger.error('No credentials found');
|
|
266
|
+
console.error(`\n${COMMAND_NAME}: Not configured.\nPlease connect to Z.AI in OpenCode first.\n`);
|
|
267
|
+
process.exit(1);
|
|
268
|
+
}
|
|
269
|
+
// Query API
|
|
270
|
+
const endpoints = {
|
|
271
|
+
ZAI: {
|
|
272
|
+
modelUsage: 'https://api.z.ai/api/monitor/usage/model-usage',
|
|
273
|
+
toolUsage: 'https://api.z.ai/api/monitor/usage/tool-usage',
|
|
274
|
+
quotaLimit: 'https://api.z.ai/api/monitor/usage/quota/limit',
|
|
275
|
+
},
|
|
276
|
+
ZHIPU: {
|
|
277
|
+
modelUsage: 'https://open.bigmodel.cn/api/monitor/usage/model-usage',
|
|
278
|
+
toolUsage: 'https://open.bigmodel.cn/api/monitor/usage/tool-usage',
|
|
279
|
+
quotaLimit: 'https://open.bigmodel.cn/api/monitor/usage/quota/limit',
|
|
280
|
+
},
|
|
281
|
+
};
|
|
282
|
+
const urls = endpoints[credentials.platform];
|
|
283
|
+
logger.info(`Querying ${credentials.platform} endpoints...`);
|
|
284
|
+
// Make requests
|
|
285
|
+
const responses = await Promise.all([
|
|
286
|
+
makeRequest(urls.quotaLimit, credentials.token),
|
|
287
|
+
makeRequest(urls.modelUsage, credentials.token),
|
|
288
|
+
makeRequest(urls.toolUsage, credentials.token),
|
|
289
|
+
]);
|
|
290
|
+
logger.info(`Received ${responses.length} responses`);
|
|
291
|
+
if (!rawOutput) {
|
|
292
|
+
// Parse and display formatted output
|
|
293
|
+
const [quotaLimitRaw, modelUsageRaw, toolUsageRaw] = responses;
|
|
294
|
+
if (quotaLimitRaw.length === 0) {
|
|
295
|
+
logger.error('Quota limit endpoint returned empty response');
|
|
296
|
+
console.error(`\n${COMMAND_NAME}: No quota data received.\n`);
|
|
297
|
+
process.exit(1);
|
|
298
|
+
}
|
|
299
|
+
// Parse and display quota limit
|
|
300
|
+
try {
|
|
301
|
+
const { formatted } = parseQuotaLimit(quotaLimitRaw);
|
|
302
|
+
console.log(formatted);
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
logger.error(`Failed to parse quota limit: ${error}`);
|
|
306
|
+
throw error;
|
|
307
|
+
}
|
|
308
|
+
// Parse model usage if available
|
|
309
|
+
if (modelUsageRaw.length > 0) {
|
|
310
|
+
try {
|
|
311
|
+
const modelUsage = parseResponse(modelUsageRaw, 'model-usage');
|
|
312
|
+
logger.info('Model usage data received');
|
|
313
|
+
console.log('\nModel Usage:');
|
|
314
|
+
console.log(JSON.stringify(modelUsage, null, 2));
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
logger.warn(`Failed to parse model usage: ${error}`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// Parse tool usage if available
|
|
321
|
+
if (toolUsageRaw.length > 0) {
|
|
322
|
+
try {
|
|
323
|
+
const toolUsage = parseResponse(toolUsageRaw, 'tool-usage');
|
|
324
|
+
logger.info('Tool usage data received');
|
|
325
|
+
console.log('\nTool Usage:');
|
|
326
|
+
console.log(JSON.stringify(toolUsage, null, 2));
|
|
327
|
+
}
|
|
328
|
+
catch (error) {
|
|
329
|
+
logger.warn(`Failed to parse tool usage: ${error}`);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
// Print raw responses (one per line), skip empty ones
|
|
335
|
+
const endpointNames = ['quota/limit', 'model-usage', 'tool-usage'];
|
|
336
|
+
let hasOutput = false;
|
|
337
|
+
responses.forEach((response, index) => {
|
|
338
|
+
if (response.length > 0) {
|
|
339
|
+
console.log(response);
|
|
340
|
+
hasOutput = true;
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
logger.warn(`Endpoint ${endpointNames[index]} returned empty response (0 bytes)`);
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
if (!hasOutput) {
|
|
347
|
+
console.error(`\n${COMMAND_NAME}: No data received from any endpoint.\n`);
|
|
348
|
+
process.exit(1);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
logger.info('Completed successfully');
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
if (error instanceof Error) {
|
|
355
|
+
logger.error(`${error.name}: ${error.message}`);
|
|
356
|
+
console.error(`\n${COMMAND_NAME}: ${error.message}\n`);
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
logger.error(`Unknown error: ${String(error)}`);
|
|
360
|
+
console.error(`\n${COMMAND_NAME}: Unknown error occurred\n`);
|
|
361
|
+
}
|
|
362
|
+
process.exit(1);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// Run CLI
|
|
366
|
+
main();
|
|
367
|
+
//# sourceMappingURL=glm-quota.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glm-quota.js","sourceRoot":"","sources":["../../bin/glm-quota.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi-quota.d.ts","sourceRoot":"","sources":["../../bin/kimi-quota.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { configureLogging, getLogger } from '../src/shared/logging.js';
|
|
3
|
+
const logger = getLogger('opencode-quota.cli.kimi');
|
|
4
|
+
const AUTH_JSON_PATH = `${process.env.HOME}/.local/share/opencode/auth.json`;
|
|
5
|
+
async function getCredentials() {
|
|
6
|
+
try {
|
|
7
|
+
const authResp = await fetch(`file://${AUTH_JSON_PATH}`);
|
|
8
|
+
if (!authResp.ok) {
|
|
9
|
+
throw new Error('Failed to read auth.json');
|
|
10
|
+
}
|
|
11
|
+
const auth = await authResp.text();
|
|
12
|
+
const authJson = JSON.parse(auth);
|
|
13
|
+
const kimiData = authJson['kimi-for-coding'] || authJson.kimi || authJson.moonshot;
|
|
14
|
+
if (!kimiData) {
|
|
15
|
+
logger.error('opencode-kimi-quota: Not configured. Run: opencode connect kimi-for-coding');
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
const kimiKey = typeof kimiData === 'string' ? kimiData : kimiData.key || kimiData.token;
|
|
19
|
+
if (!kimiKey) {
|
|
20
|
+
logger.error('opencode-kimi-quota: Not configured. Run: opencode connect kimi-for-coding');
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return kimiKey;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
logger.error('opencode-kimi-quota: Not configured. Run: opencode connect kimi');
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async function queryBalance(apiKey) {
|
|
31
|
+
const url = 'https://api.kimi.com/coding/v1/usages';
|
|
32
|
+
logger.debug(`Making request to: ${url}`);
|
|
33
|
+
logger.debug(`Method: GET`);
|
|
34
|
+
logger.debug(`Authorization: ${apiKey.substring(0, 20)}***`);
|
|
35
|
+
const response = await fetch(url, {
|
|
36
|
+
method: 'GET',
|
|
37
|
+
headers: {
|
|
38
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
39
|
+
'Accept': 'application/json',
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
const statusCode = response.status;
|
|
43
|
+
const body = await response.text();
|
|
44
|
+
logger.debug(`← Response: ${statusCode}, body: ${body.length} bytes`);
|
|
45
|
+
if (statusCode === 200) {
|
|
46
|
+
try {
|
|
47
|
+
const result = JSON.parse(body);
|
|
48
|
+
return {
|
|
49
|
+
usage: result.usage || null,
|
|
50
|
+
limits: result.limits || [],
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
logger.debug(`Failed to parse response: ${error}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (statusCode !== 200 && statusCode !== 401 && statusCode !== 403 && statusCode !== 404) {
|
|
58
|
+
throw new Error(`HTTP ${statusCode}: ${body.substring(0, 200)}`);
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
usage: null,
|
|
62
|
+
limits: [],
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function formatDurationCompact(ms) {
|
|
66
|
+
if (!ms)
|
|
67
|
+
return '';
|
|
68
|
+
let timestamp;
|
|
69
|
+
if (typeof ms === 'string') {
|
|
70
|
+
timestamp = new Date(ms).getTime();
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
timestamp = ms;
|
|
74
|
+
}
|
|
75
|
+
const now = Date.now();
|
|
76
|
+
const diffMs = timestamp - now;
|
|
77
|
+
if (diffMs < 0) {
|
|
78
|
+
return 'now';
|
|
79
|
+
}
|
|
80
|
+
const days = Math.floor(diffMs / (1000 * 60 * 60 * 24));
|
|
81
|
+
const hours = Math.floor((diffMs % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
|
|
82
|
+
const minutes = Math.floor((diffMs % (1000 * 60 * 60)) / (1000 * 60));
|
|
83
|
+
const seconds = Math.floor((diffMs % (1000 * 60)) / 1000);
|
|
84
|
+
const parts = [];
|
|
85
|
+
if (days > 0)
|
|
86
|
+
parts.push(`${days}d`);
|
|
87
|
+
if (hours > 0)
|
|
88
|
+
parts.push(`${hours}h`);
|
|
89
|
+
if (minutes > 0)
|
|
90
|
+
parts.push(`${minutes}m`);
|
|
91
|
+
if (seconds > 0 || parts.length === 0)
|
|
92
|
+
parts.push(`${seconds}s`);
|
|
93
|
+
return parts.join(' ');
|
|
94
|
+
}
|
|
95
|
+
function formatLimitLabel(item) {
|
|
96
|
+
const window = item.window || {};
|
|
97
|
+
const duration = window.duration;
|
|
98
|
+
let timeUnit = window.timeUnit;
|
|
99
|
+
// Handle "TIME_UNIT_" prefix
|
|
100
|
+
if (timeUnit && timeUnit.startsWith('TIME_UNIT_')) {
|
|
101
|
+
timeUnit = timeUnit.replace('TIME_UNIT_', '');
|
|
102
|
+
}
|
|
103
|
+
if (duration == null) {
|
|
104
|
+
return item.name || item.title || item.scope || 'Unknown';
|
|
105
|
+
}
|
|
106
|
+
if (timeUnit === 'MINUTE') {
|
|
107
|
+
if (duration >= 60 && duration % 60 === 0) {
|
|
108
|
+
return `${duration / 60}h limit`;
|
|
109
|
+
}
|
|
110
|
+
return `${duration}m limit`;
|
|
111
|
+
}
|
|
112
|
+
if (timeUnit === 'HOUR') {
|
|
113
|
+
return `${duration}h limit`;
|
|
114
|
+
}
|
|
115
|
+
if (timeUnit === 'DAY') {
|
|
116
|
+
return `${duration}d limit`;
|
|
117
|
+
}
|
|
118
|
+
return `${duration} ${timeUnit} limit`;
|
|
119
|
+
}
|
|
120
|
+
function formatUsage(balance) {
|
|
121
|
+
console.log('');
|
|
122
|
+
console.log('Kimi Coding Plan Usage Statistics');
|
|
123
|
+
console.log('');
|
|
124
|
+
if (!balance.usage && (!balance.limits || balance.limits.length === 0)) {
|
|
125
|
+
console.log('No usage data available.');
|
|
126
|
+
console.log('');
|
|
127
|
+
console.log('Possible reasons:');
|
|
128
|
+
console.log(' - Not configured: Run `opencode connect kimi-for-coding`');
|
|
129
|
+
console.log(' - API key format mismatch');
|
|
130
|
+
console.log(' - No quota usage data available yet');
|
|
131
|
+
console.log('');
|
|
132
|
+
console.log('Please check your usage at:');
|
|
133
|
+
console.log(' https://platform.moonshot.ai/console');
|
|
134
|
+
console.log(' https://kimi-ai.chat/code/console');
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
// Display main usage summary
|
|
138
|
+
if (balance.usage) {
|
|
139
|
+
const { limit, used, remaining, reset_at, resetTime } = balance.usage;
|
|
140
|
+
if (limit != null && used != null) {
|
|
141
|
+
const percentage = (used / limit) * 100;
|
|
142
|
+
console.log(`Total Usage: ${used} / ${limit} (${percentage.toFixed(1)}% used)`);
|
|
143
|
+
console.log(`Remaining: ${remaining ?? (limit - used).toFixed(0)}`);
|
|
144
|
+
const resetTimeField = reset_at || resetTime;
|
|
145
|
+
if (resetTimeField) {
|
|
146
|
+
const resetDate = new Date(resetTimeField);
|
|
147
|
+
console.log(`Next Reset: ${resetDate.toLocaleString()} (${formatDurationCompact(resetTimeField)})`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
console.log('');
|
|
151
|
+
}
|
|
152
|
+
// Display detailed limits
|
|
153
|
+
if (balance.limits && balance.limits.length > 0) {
|
|
154
|
+
console.log('Usage Details:');
|
|
155
|
+
console.log('');
|
|
156
|
+
for (const item of balance.limits) {
|
|
157
|
+
const detail = (item.detail || item);
|
|
158
|
+
const limit = detail.limit;
|
|
159
|
+
const used = detail.used;
|
|
160
|
+
const remaining = detail.remaining;
|
|
161
|
+
const resetAt = detail.reset_at || detail.resetTime;
|
|
162
|
+
if (limit != null) {
|
|
163
|
+
const label = formatLimitLabel(item);
|
|
164
|
+
console.log(` ${label}:`);
|
|
165
|
+
// Calculate used if not provided
|
|
166
|
+
const usedValue = used != null ? used : (remaining != null && limit != null ? limit - remaining : null);
|
|
167
|
+
if (usedValue != null) {
|
|
168
|
+
const percentage = (usedValue / limit) * 100;
|
|
169
|
+
console.log(` Used: ${usedValue} / ${limit} (${percentage.toFixed(1)}% used)`);
|
|
170
|
+
}
|
|
171
|
+
if (remaining != null) {
|
|
172
|
+
console.log(` Remaining: ${remaining}`);
|
|
173
|
+
}
|
|
174
|
+
if (resetAt) {
|
|
175
|
+
const resetDate = new Date(resetAt);
|
|
176
|
+
console.log(` Next Reset: ${resetDate.toLocaleString()} (${formatDurationCompact(resetAt)})`);
|
|
177
|
+
}
|
|
178
|
+
console.log('');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function showHelp() {
|
|
184
|
+
console.log('opencode-kimi-quota: Check Kimi Coding Plan quota from terminal');
|
|
185
|
+
console.log('');
|
|
186
|
+
console.log('Usage:');
|
|
187
|
+
console.log(' bun run bin/kimi-quota.ts [--debug|--raw]');
|
|
188
|
+
console.log('');
|
|
189
|
+
console.log('Options:');
|
|
190
|
+
console.log(' --debug, -d Enable debug logging');
|
|
191
|
+
console.log(' --raw Output raw JSON (default: formatted text)');
|
|
192
|
+
console.log('');
|
|
193
|
+
console.log('Environment:');
|
|
194
|
+
console.log(' LOG_LEVEL=debug Enable debug logging');
|
|
195
|
+
console.log('');
|
|
196
|
+
console.log('Authentication:');
|
|
197
|
+
console.log(' Reads from ~/.local/share/opencode/auth.json (kimi-for-coding, kimi, or moonshot provider)');
|
|
198
|
+
}
|
|
199
|
+
async function main() {
|
|
200
|
+
const args = process.argv.slice(2);
|
|
201
|
+
const debugIndex = args.findIndex(a => a === '--debug' || a === '-d');
|
|
202
|
+
const rawIndex = args.findIndex(a => a === '--raw');
|
|
203
|
+
const helpIndex = args.findIndex(a => a === '--help' || a === '-h');
|
|
204
|
+
if (helpIndex !== -1) {
|
|
205
|
+
showHelp();
|
|
206
|
+
process.exit(0);
|
|
207
|
+
}
|
|
208
|
+
const rawOutput = rawIndex !== -1;
|
|
209
|
+
if (debugIndex !== -1) {
|
|
210
|
+
configureLogging('debug');
|
|
211
|
+
}
|
|
212
|
+
logger.info('Starting opencode-kimi-quota CLI');
|
|
213
|
+
logger.debug(`Arguments: ${JSON.stringify({ debug: debugIndex !== -1, rawOutput, _: args })}`);
|
|
214
|
+
const apiKey = await getCredentials();
|
|
215
|
+
if (!apiKey) {
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
218
|
+
try {
|
|
219
|
+
const balance = await queryBalance(apiKey);
|
|
220
|
+
if (rawOutput) {
|
|
221
|
+
console.log(JSON.stringify(balance, null, 2));
|
|
222
|
+
process.exit(0);
|
|
223
|
+
}
|
|
224
|
+
formatUsage(balance);
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
228
|
+
logger.error(`Error: ${errorMessage}`);
|
|
229
|
+
if (error instanceof Error && error.stack) {
|
|
230
|
+
logger.debug(`Stack: ${error.stack}`);
|
|
231
|
+
}
|
|
232
|
+
if (!rawOutput) {
|
|
233
|
+
console.log('');
|
|
234
|
+
console.log('Kimi Usage Check Failed');
|
|
235
|
+
console.log(`Error: ${errorMessage}`);
|
|
236
|
+
}
|
|
237
|
+
process.exit(1);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
main();
|
|
241
|
+
//# sourceMappingURL=kimi-quota.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi-quota.js","sourceRoot":"","sources":["../../bin/kimi-quota.ts"],"names":[],"mappings":"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"}
|