From f8ce4003b7da807a54b372664f4e056db7b83389 Mon Sep 17 00:00:00 2001 From: oratis Date: Sat, 30 May 2026 01:35:51 +0800 Subject: [PATCH] refactor(core): centralize context-window constant (contextWindowFor) The 128_000 context-window literal was hardcoded in four places (desktop Repl.tsx ctx bar, CLI repl.ts + headless.ts autoCompact, CLI /context command) while the authoritative per-model value already lived in DEEPSEEK_MODELS[m].ctx. Add contextWindowFor(model) (+ DEFAULT_CONTEXT_WINDOW) to the provider and use it everywhere, so the value can't drift and a non-128k model would be reflected correctly. Co-Authored-By: Claude Opus 4.8 (1M context) --- apps/cli/src/commands.ts | 4 ++-- apps/cli/src/headless.ts | 3 ++- apps/cli/src/repl.ts | 3 ++- apps/desktop/src/screens/Repl.tsx | 3 ++- packages/core/src/index.ts | 2 ++ packages/core/src/providers/deepseek.ts | 13 +++++++++++++ packages/core/src/providers/index.ts | 8 +++++++- 7 files changed, 30 insertions(+), 6 deletions(-) diff --git a/apps/cli/src/commands.ts b/apps/cli/src/commands.ts index 319a80a..cf7c45b 100644 --- a/apps/cli/src/commands.ts +++ b/apps/cli/src/commands.ts @@ -9,7 +9,7 @@ import type { SessionMeta, StoredMessage, } from '@deepcode/core'; -import { redact, type Credentials } from '@deepcode/core'; +import { contextWindowFor, redact, type Credentials } from '@deepcode/core'; export interface SessionContext { cwd: string; @@ -220,7 +220,7 @@ export const ContextCommand: SlashCommand = { description: 'Show context window usage.', run(_args, ctx) { const used = ctx.usage.inputTokens + ctx.usage.outputTokens; - const ctxMax = 128_000; + const ctxMax = contextWindowFor(ctx.model); const pct = ((used / ctxMax) * 100).toFixed(1); return [ `Context: ${used.toLocaleString()} / ${ctxMax.toLocaleString()} (${pct}%)`, diff --git a/apps/cli/src/headless.ts b/apps/cli/src/headless.ts index f1bdd53..0aef566 100644 --- a/apps/cli/src/headless.ts +++ b/apps/cli/src/headless.ts @@ -29,6 +29,7 @@ import { buildSkillsDescriptionBlock, closeAllMcpServers, connectAllMcpServers, + contextWindowFor, findStyle, loadMemory, loadOutputStyles, @@ -239,7 +240,7 @@ export async function runHeadless(opts: HeadlessOpts): Promise { mode, permissions: settings.permissions, hooks, - autoCompact: { contextWindow: 128_000, threshold: 0.8 }, + autoCompact: { contextWindow: contextWindowFor(model), threshold: 0.8 }, autoMode: settings.autoMode, sandboxConfig: settings.sandbox, // In headless mode there's no human to ask: auto-deny anything that diff --git a/apps/cli/src/repl.ts b/apps/cli/src/repl.ts index f202c70..dea742d 100644 --- a/apps/cli/src/repl.ts +++ b/apps/cli/src/repl.ts @@ -22,6 +22,7 @@ import { loadOutputStyles, loadSettings, loadSkills, + contextWindowFor, makeSkillTool, resolveCredentials, runAgent, @@ -308,7 +309,7 @@ export async function startRepl(opts: ReplOpts): Promise { mode: ctx.mode as Mode, permissions: settings.permissions, hooks, - autoCompact: { contextWindow: 128_000, threshold: 0.8 }, + autoCompact: { contextWindow: contextWindowFor(ctx.model), threshold: 0.8 }, autoMode: settings.autoMode, sandboxConfig: settings.sandbox, approval: async (toolName, _input, verdict) => { diff --git a/apps/desktop/src/screens/Repl.tsx b/apps/desktop/src/screens/Repl.tsx index 29e0279..a3ed9c0 100644 --- a/apps/desktop/src/screens/Repl.tsx +++ b/apps/desktop/src/screens/Repl.tsx @@ -24,6 +24,7 @@ import { type KeyBinding, type VimMode, } from '@deepcode/core/dist/keybindings/vim.js'; +import { contextWindowFor } from '@deepcode/core/dist/providers/deepseek.js'; import { Dropdown, type DropdownOption } from '../components/Dropdown.js'; import { Pill } from '../components/Pill.js'; import { PlusMenu } from '../components/PlusMenu.js'; @@ -476,7 +477,7 @@ export function ReplScreen({ projectPath, onTurnComplete }: ReplScreenProps): JS const activeAssistantIdx = lastAssistantIndex(messages); // ── Context bar fill ── - const contextWindow = 128_000; + const contextWindow = contextWindowFor(model); const usedTokens = usage.inputTokens + usage.outputTokens; const fillPct = Math.min(100, (usedTokens / contextWindow) * 100); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 47f68d6..82ab2a1 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -12,7 +12,9 @@ export type * from './types.js'; export { DeepSeekProvider, DEEPSEEK_MODELS, + DEFAULT_CONTEXT_WINDOW, EFFORT_PARAMS, + contextWindowFor, type DeepSeekProviderOpts, type Provider, type ProviderResult, diff --git a/packages/core/src/providers/deepseek.ts b/packages/core/src/providers/deepseek.ts index f0e3612..a0290a8 100644 --- a/packages/core/src/providers/deepseek.ts +++ b/packages/core/src/providers/deepseek.ts @@ -25,6 +25,19 @@ export const DEEPSEEK_MODELS: Record