minimax-status 1.0.8 → 1.0.9
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/cli/index.js +88 -116
- package/package.json +1 -1
package/cli/index.js
CHANGED
|
@@ -227,14 +227,11 @@ function calculateUsageTokens(usage) {
|
|
|
227
227
|
return 0;
|
|
228
228
|
}
|
|
229
229
|
|
|
230
|
-
// Statusline command -
|
|
230
|
+
// Statusline command - 单次输出模式
|
|
231
231
|
program
|
|
232
232
|
.command("statusline")
|
|
233
|
-
.description("Claude Code状态栏集成(从stdin
|
|
233
|
+
.description("Claude Code状态栏集成(从stdin读取数据,输出单行状态)")
|
|
234
234
|
.action(async () => {
|
|
235
|
-
let isActive = true;
|
|
236
|
-
let intervalId = null;
|
|
237
|
-
|
|
238
235
|
// 读取stdin数据(如果可用)
|
|
239
236
|
let stdinData = null;
|
|
240
237
|
if (!process.stdin.isTTY) {
|
|
@@ -273,136 +270,111 @@ program
|
|
|
273
270
|
return `${tokens}`;
|
|
274
271
|
};
|
|
275
272
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
try {
|
|
281
|
-
// 获取使用状态
|
|
282
|
-
const apiData = await api.getUsageStatus();
|
|
283
|
-
const usageData = api.parseUsageData(apiData);
|
|
284
|
-
|
|
285
|
-
// 构建状态信息
|
|
286
|
-
const { usage, modelName, remaining } = usageData;
|
|
287
|
-
const percentage = usage.percentage;
|
|
288
|
-
|
|
289
|
-
// 从stdin数据获取Claude Code信息
|
|
290
|
-
let displayModel = modelName;
|
|
291
|
-
let currentDir = null;
|
|
292
|
-
let modelId = null;
|
|
293
|
-
let contextSize = 200000; // 默认值
|
|
294
|
-
|
|
295
|
-
if (stdinData) {
|
|
296
|
-
// Claude Code传递的模型信息
|
|
297
|
-
if (stdinData.model && stdinData.model.display_name) {
|
|
298
|
-
displayModel = stdinData.model.display_name;
|
|
299
|
-
modelId = stdinData.model.id;
|
|
300
|
-
} else if (stdinData.model && stdinData.model.id) {
|
|
301
|
-
displayModel = stdinData.model.id;
|
|
302
|
-
modelId = stdinData.model.id;
|
|
303
|
-
}
|
|
273
|
+
try {
|
|
274
|
+
// 获取使用状态
|
|
275
|
+
const apiData = await api.getUsageStatus();
|
|
276
|
+
const usageData = api.parseUsageData(apiData);
|
|
304
277
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
278
|
+
// 构建状态信息
|
|
279
|
+
const { usage, modelName, remaining } = usageData;
|
|
280
|
+
const percentage = usage.percentage;
|
|
281
|
+
|
|
282
|
+
// 从stdin数据获取Claude Code信息
|
|
283
|
+
let displayModel = modelName;
|
|
284
|
+
let currentDir = null;
|
|
285
|
+
let modelId = null;
|
|
286
|
+
let contextSize = 200000; // 默认值
|
|
287
|
+
|
|
288
|
+
if (stdinData) {
|
|
289
|
+
// Claude Code传递的模型信息
|
|
290
|
+
if (stdinData.model && stdinData.model.display_name) {
|
|
291
|
+
displayModel = stdinData.model.display_name;
|
|
292
|
+
modelId = stdinData.model.id;
|
|
293
|
+
} else if (stdinData.model && stdinData.model.id) {
|
|
294
|
+
displayModel = stdinData.model.id;
|
|
295
|
+
modelId = stdinData.model.id;
|
|
312
296
|
}
|
|
313
297
|
|
|
314
|
-
//
|
|
315
|
-
if (
|
|
316
|
-
|
|
317
|
-
for (const [key, value] of Object.entries(MODEL_CONTEXT_SIZES)) {
|
|
318
|
-
if (modelKey.includes(key.toLowerCase())) {
|
|
319
|
-
contextSize = value;
|
|
320
|
-
break;
|
|
321
|
-
}
|
|
322
|
-
}
|
|
298
|
+
// 当前工作目录(从stdin获取)
|
|
299
|
+
if (stdinData.workspace && stdinData.workspace.current_directory) {
|
|
300
|
+
currentDir = stdinData.workspace.current_directory.split('/').pop();
|
|
323
301
|
}
|
|
302
|
+
} else {
|
|
303
|
+
// 如果没有stdin,使用API返回的模型名作为ID
|
|
304
|
+
modelId = modelName.toLowerCase().replace(/\s+/g, '-');
|
|
305
|
+
}
|
|
324
306
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
307
|
+
// 查找上下文窗口大小
|
|
308
|
+
if (modelId) {
|
|
309
|
+
const modelKey = modelId.toLowerCase();
|
|
310
|
+
for (const [key, value] of Object.entries(MODEL_CONTEXT_SIZES)) {
|
|
311
|
+
if (modelKey.includes(key.toLowerCase())) {
|
|
312
|
+
contextSize = value;
|
|
313
|
+
break;
|
|
332
314
|
}
|
|
333
315
|
}
|
|
316
|
+
}
|
|
334
317
|
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
318
|
+
// 尝试从转录文件获取真实token使用量(类似ccline)
|
|
319
|
+
let contextUsageTokens = null;
|
|
320
|
+
let contextUsagePercentage = null;
|
|
321
|
+
if (stdinData && stdinData.transcript_path) {
|
|
322
|
+
contextUsageTokens = await parseTranscriptUsage(stdinData.transcript_path);
|
|
323
|
+
if (contextUsageTokens) {
|
|
324
|
+
contextUsagePercentage = Math.round((contextUsageTokens / contextSize) * 100);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
340
327
|
|
|
341
|
-
|
|
342
|
-
const remainingText =
|
|
343
|
-
remaining.hours > 0
|
|
344
|
-
? `${remaining.hours}h${remaining.minutes}m`
|
|
345
|
-
: `${remaining.minutes}m`;
|
|
328
|
+
const contextSizeText = formatContextSize(contextSize);
|
|
346
329
|
|
|
347
|
-
|
|
348
|
-
|
|
330
|
+
// 状态图标(基于真实上下文使用情况,否则基于额度)
|
|
331
|
+
const displayPercentage = contextUsagePercentage || percentage;
|
|
332
|
+
const statusIcon = displayPercentage >= 85 ? "⚠" : displayPercentage >= 60 ? "⚡" : "✓";
|
|
349
333
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
334
|
+
// 剩余时间文本
|
|
335
|
+
const remainingText =
|
|
336
|
+
remaining.hours > 0
|
|
337
|
+
? `${remaining.hours}h${remaining.minutes}m`
|
|
338
|
+
: `${remaining.minutes}m`;
|
|
355
339
|
|
|
356
|
-
|
|
357
|
-
|
|
340
|
+
// 构建带图标的状态行
|
|
341
|
+
let statusLine = '';
|
|
358
342
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
343
|
+
// 显示目录(优先使用Claude Code的目录,否则显示CLI当前目录)
|
|
344
|
+
const displayDir = currentDir || cliCurrentDir || '';
|
|
345
|
+
if (displayDir) {
|
|
346
|
+
statusLine += `${chalk.blue('📁')} ${chalk.cyan(displayDir)} | `;
|
|
347
|
+
}
|
|
362
348
|
|
|
363
|
-
|
|
364
|
-
|
|
349
|
+
// 模型信息
|
|
350
|
+
statusLine += `${chalk.magenta('🤖')} ${chalk.magenta(displayModel)} | `;
|
|
365
351
|
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
statusLine += `${contextColor('⚡')} ${contextColor(displayPercentage + '%')} ${chalk.gray('·')} ${chalk.white(formatTokens(contextUsageTokens) + '/' + contextSizeText)} | `;
|
|
370
|
-
} else {
|
|
371
|
-
// 没有转录数据时,显示上下文窗口大小
|
|
372
|
-
statusLine += `${chalk.gray(contextSizeText)} | `;
|
|
373
|
-
}
|
|
352
|
+
// 账户使用额度百分比(根据使用率变色)
|
|
353
|
+
const usageColor = percentage >= 85 ? chalk.red : percentage >= 60 ? chalk.yellow : chalk.green;
|
|
354
|
+
statusLine += `${usageColor(percentage + '%')} | `;
|
|
374
355
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
statusLine += `${chalk.gray('⏱')} ${chalk.white(remainingText)} ${statusColor(statusIcon)}`;
|
|
356
|
+
// 剩余次数
|
|
357
|
+
statusLine += `${chalk.yellow('↻')} ${chalk.white(usage.remaining + '/' + usage.total)} | `;
|
|
378
358
|
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
359
|
+
// 上下文使用情况(参考ccline:⚡ 百分比 · token数/总大小)
|
|
360
|
+
if (contextUsageTokens) {
|
|
361
|
+
const contextColor = displayPercentage >= 85 ? chalk.red : displayPercentage >= 60 ? chalk.yellow : chalk.green;
|
|
362
|
+
statusLine += `${contextColor('⚡')} ${contextColor(displayPercentage + '%')} ${chalk.gray('·')} ${chalk.white(formatTokens(contextUsageTokens) + '/' + contextSizeText)} | `;
|
|
363
|
+
} else {
|
|
364
|
+
// 没有转录数据时,显示上下文窗口大小
|
|
365
|
+
statusLine += `${chalk.gray(contextSizeText)} | `;
|
|
384
366
|
}
|
|
385
|
-
};
|
|
386
367
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
console.log(chalk.yellow('\n状态栏已停止'));
|
|
398
|
-
process.exit(0);
|
|
399
|
-
});
|
|
400
|
-
|
|
401
|
-
// 处理进程退出
|
|
402
|
-
process.on('exit', () => {
|
|
403
|
-
isActive = false;
|
|
404
|
-
if (intervalId) clearInterval(intervalId);
|
|
405
|
-
});
|
|
368
|
+
// 剩余时间和状态图标
|
|
369
|
+
const statusColor = displayPercentage >= 85 ? chalk.red : displayPercentage >= 60 ? chalk.yellow : chalk.green;
|
|
370
|
+
statusLine += `${chalk.gray('⏱')} ${chalk.white(remainingText)} ${statusColor(statusIcon)}`;
|
|
371
|
+
|
|
372
|
+
// 输出单行状态(带颜色)
|
|
373
|
+
console.log(statusLine);
|
|
374
|
+
} catch (error) {
|
|
375
|
+
// 输出错误状态(纯文本)
|
|
376
|
+
console.log(`❌ MiniMax 错误: ${error.message}`);
|
|
377
|
+
}
|
|
406
378
|
});
|
|
407
379
|
|
|
408
380
|
function startWatching(api, statusBar) {
|