From 05a908329fa400ad6f662d5018b04528ec639e10 Mon Sep 17 00:00:00 2001 From: Yash Dewasthale Date: Mon, 20 Jul 2026 18:55:58 +0530 Subject: [PATCH] feat: update supercode-cli version to 0.1.81 and enhance API key management - Bumped version in package.json to 0.1.81. - Refactored API key retrieval for MergeDev, MiniMax, Nvidia, and OpenRouter to streamline access from environment variables. - Improved error handling in token usage tracking to return 0 on database errors. --- apps/supercode-cli/server/package.json | 2 +- .../server/src/cli/ai/chat/chat.ts | 17 +++-------------- .../server/src/config/mergedev.config.ts | 9 ++++++++- .../server/src/config/minimax.config.ts | 9 ++++++++- .../server/src/config/nvidia.config.ts | 9 ++++++++- .../server/src/config/openrouter.config.ts | 9 ++++++++- .../server/src/lib/token-budget.ts | 18 +++++++++++------- .../server/src/lib/track-usage.ts | 4 ++-- 8 files changed, 49 insertions(+), 28 deletions(-) diff --git a/apps/supercode-cli/server/package.json b/apps/supercode-cli/server/package.json index b14c291..1330eac 100644 --- a/apps/supercode-cli/server/package.json +++ b/apps/supercode-cli/server/package.json @@ -1,6 +1,6 @@ { "name": "supercode-cli", - "version": "0.1.80", + "version": "0.1.81", "description": "AI-powered coding agent CLI", "main": "dist/main.js", "bin": { diff --git a/apps/supercode-cli/server/src/cli/ai/chat/chat.ts b/apps/supercode-cli/server/src/cli/ai/chat/chat.ts index 92cfad1..37eddee 100644 --- a/apps/supercode-cli/server/src/cli/ai/chat/chat.ts +++ b/apps/supercode-cli/server/src/cli/ai/chat/chat.ts @@ -720,20 +720,9 @@ async function streamAIResponse( // typing animation so the user sees content appear progressively. await md.end() - // After streaming + tools complete, render a "Result" section with the - // model's analysis text (like agent mode). The text was already streamed - // inline during tool execution, but re-rendering it under a clear header - // makes it visible even when interleaved with tool output. - if (turnTracker.hasAnyToolCalls() && fullResponse.trim().length > 0) { - const w = process.stdout.columns ?? 80 - const dim = (s: string) => chalk.hex(theme.greenDim)(s) - console.log(` ${chalk.hex(theme.green)("┃")} ${chalk.hex(theme.green).bold("Result")} ${dim("─".repeat(Math.max(0, w - 15)))}`) - const resultMd = new MarkdownStream() - resultMd.push(fullResponse) - await resultMd.end() - } else if (turnTracker.hasAnyToolCalls() && fullResponse.trim().length === 0) { - // Tools ran but model produced no text — show a minimal result marker - // so the turn doesn't end with a dangling thought block. + // If tools ran but the model produced no analysis text, show a minimal + // marker so the turn doesn't end with a dangling thought block. + if (turnTracker.hasAnyToolCalls() && fullResponse.trim().length === 0) { const w = process.stdout.columns ?? 80 const dim = (s: string) => chalk.hex(theme.greenDim)(s) console.log(` ${chalk.hex(theme.green)("┃")} ${chalk.hex(theme.green).bold("Result")} ${dim("─".repeat(Math.max(0, w - 15)))}`) diff --git a/apps/supercode-cli/server/src/config/mergedev.config.ts b/apps/supercode-cli/server/src/config/mergedev.config.ts index d2cdd3c..fd2a0ee 100644 --- a/apps/supercode-cli/server/src/config/mergedev.config.ts +++ b/apps/supercode-cli/server/src/config/mergedev.config.ts @@ -1,5 +1,12 @@ +export function getMergeDevApiKey(): string { + return process.env.MERGE_DEV_BYOK_PROD_KEY + || process.env.MERGE_DEV_BYOK_DEV_KEY + || process.env.MERGE_DEV_API_KEY + || "" +} + export const mergedevConfig = { - get apiKey() { return process.env.MERGE_DEV_API_KEY || "" }, + get apiKey() { return getMergeDevApiKey() }, get model() { return process.env.MERGE_DEV_MODEL || "anthropic/claude-opus-4-8" }, baseUrl: "https://api-gateway.merge.dev/v1/openai", get maxTokens() { return Number(process.env.MERGE_DEV_MAX_TOKENS) || 128000 }, diff --git a/apps/supercode-cli/server/src/config/minimax.config.ts b/apps/supercode-cli/server/src/config/minimax.config.ts index f1c1473..0b5f85e 100644 --- a/apps/supercode-cli/server/src/config/minimax.config.ts +++ b/apps/supercode-cli/server/src/config/minimax.config.ts @@ -1,6 +1,13 @@ +export function getMinimaxApiKey(): string { + return process.env.MINIMAX_BYOK_PROD_KEY + || process.env.MINIMAX_BYOK_DEV_KEY + || process.env.MINIMAX_API_KEY + || "" +} + export const minimaxConfig = { - get apiKey() { return process.env.MINIMAX_API_KEY || "" }, + get apiKey() { return getMinimaxApiKey() }, get model() { return process.env.MINIMAX_MODEL || "MiniMax-M2" }, } diff --git a/apps/supercode-cli/server/src/config/nvidia.config.ts b/apps/supercode-cli/server/src/config/nvidia.config.ts index 73014e3..70040d2 100644 --- a/apps/supercode-cli/server/src/config/nvidia.config.ts +++ b/apps/supercode-cli/server/src/config/nvidia.config.ts @@ -1,7 +1,14 @@ +export function getNvidiaApiKey(): string { + return process.env.NVIDIA_BYOK_PROD_KEY + || process.env.NVIDIA_BYOK_DEV_KEY + || process.env.NVIDIA_API_KEY + || "" +} + export const nvidiaConfig = { - get apiKey() { return process.env.NVIDIA_API_KEY || "" }, + get apiKey() { return getNvidiaApiKey() }, get model() { return process.env.NVIDIA_MODEL || "minimaxai/minimax-m3" }, get baseUrl() { return process.env.NVIDIA_BASE_URL || "https://integrate.api.nvidia.com/v1" }, get maxTokens() { return Number(process.env.NVIDIA_MAX_TOKENS) || 8192 }, diff --git a/apps/supercode-cli/server/src/config/openrouter.config.ts b/apps/supercode-cli/server/src/config/openrouter.config.ts index 3a9f091..c9a41a9 100644 --- a/apps/supercode-cli/server/src/config/openrouter.config.ts +++ b/apps/supercode-cli/server/src/config/openrouter.config.ts @@ -1,6 +1,13 @@ +export function getOpenRouterApiKey(): string { + return process.env.OPENROUTER_BYOK_PROD_KEY + || process.env.OPENROUTER_BYOK_DEV_KEY + || process.env.OPENROUTER_API_KEY + || "" +} + export const openRouterConfig = { - get apiKey() { return process.env.OPENROUTER_API_KEY || "" }, + get apiKey() { return getOpenRouterApiKey() }, get model() { return process.env.OPENROUTER_MODEL || "moonshotai/kimi-k2.6" }, get maxTokens() { return Number(process.env.OPENROUTER_MAX_TOKENS) || 8192 }, get siteUrl() { return process.env.OPENROUTER_SITE_URL || "" }, diff --git a/apps/supercode-cli/server/src/lib/token-budget.ts b/apps/supercode-cli/server/src/lib/token-budget.ts index 2c57580..6dc3a68 100644 --- a/apps/supercode-cli/server/src/lib/token-budget.ts +++ b/apps/supercode-cli/server/src/lib/token-budget.ts @@ -34,13 +34,17 @@ function todayStart(): Date { } export async function getDailyTokenUsage(model?: string): Promise { - const where: Record = { createdAt: { gte: todayStart() } } - if (model) where.model = model - const result = await prisma.usageEvent.aggregate({ - _sum: { totalTokens: true }, - where: where as any, - }) - return result._sum.totalTokens ?? 0 + try { + const where: Record = { createdAt: { gte: todayStart() } } + if (model) where.model = model + const result = await prisma.usageEvent.aggregate({ + _sum: { totalTokens: true }, + where: where as any, + }) + return result._sum.totalTokens ?? 0 + } catch { + return 0 + } } export async function checkDailyTokenBudget(): Promise { diff --git a/apps/supercode-cli/server/src/lib/track-usage.ts b/apps/supercode-cli/server/src/lib/track-usage.ts index dce44a2..95829ff 100644 --- a/apps/supercode-cli/server/src/lib/track-usage.ts +++ b/apps/supercode-cli/server/src/lib/track-usage.ts @@ -29,7 +29,7 @@ export async function recordUsage(record: UsageRecord): Promise { conversationId: record.conversationId, }, }) - } catch (error) { - console.error("[track-usage] Failed to record usage event:", error) + } catch { + console.error("[track-usage] Failed to record usage event (DB unavailable)") } }