Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/supercode-cli/server/package.json
Original file line number Diff line number Diff line change
@@ -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": {
Expand Down
17 changes: 3 additions & 14 deletions apps/supercode-cli/server/src/cli/ai/chat/chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)))}`)
Expand Down
9 changes: 8 additions & 1 deletion apps/supercode-cli/server/src/config/mergedev.config.ts
Original file line number Diff line number Diff line change
@@ -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 },
Expand Down
9 changes: 8 additions & 1 deletion apps/supercode-cli/server/src/config/minimax.config.ts
Original file line number Diff line number Diff line change
@@ -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" },
}
9 changes: 8 additions & 1 deletion apps/supercode-cli/server/src/config/nvidia.config.ts
Original file line number Diff line number Diff line change
@@ -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 },
Expand Down
9 changes: 8 additions & 1 deletion apps/supercode-cli/server/src/config/openrouter.config.ts
Original file line number Diff line number Diff line change
@@ -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 || "" },
Expand Down
18 changes: 11 additions & 7 deletions apps/supercode-cli/server/src/lib/token-budget.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,17 @@ function todayStart(): Date {
}

export async function getDailyTokenUsage(model?: string): Promise<number> {
const where: Record<string, unknown> = { 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<string, unknown> = { 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<void> {
Expand Down
4 changes: 2 additions & 2 deletions apps/supercode-cli/server/src/lib/track-usage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export async function recordUsage(record: UsageRecord): Promise<void> {
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)")
}
}
Loading