diff --git a/src/components/chat/Composer.test.tsx b/src/components/chat/Composer.test.tsx index 24a2f20..ca23e93 100644 --- a/src/components/chat/Composer.test.tsx +++ b/src/components/chat/Composer.test.tsx @@ -1134,7 +1134,7 @@ describe("Composer", () => { it("shows compact warning when context is >= 90% full", () => { useChatStore.setState({ sessionStats: { - "ws-1": { totalInputTokens: 190_000, totalOutputTokens: 0, totalCostUsd: 1.5, numTurns: 10 }, + "ws-1": { totalInputTokens: 950_000, totalOutputTokens: 0, totalCostUsd: 1.5, numTurns: 10 }, }, }); render(); @@ -1145,7 +1145,7 @@ describe("Composer", () => { const onSend = vi.fn(); useChatStore.setState({ sessionStats: { - "ws-1": { totalInputTokens: 195_000, totalOutputTokens: 0, totalCostUsd: 2.0, numTurns: 15 }, + "ws-1": { totalInputTokens: 950_000, totalOutputTokens: 0, totalCostUsd: 2.0, numTurns: 15 }, }, }); const user = userEvent.setup(); @@ -1157,7 +1157,7 @@ describe("Composer", () => { it("does not show compact warning when context < 90%", () => { useChatStore.setState({ sessionStats: { - "ws-1": { totalInputTokens: 100_000, totalOutputTokens: 0, totalCostUsd: 0.5, numTurns: 5 }, + "ws-1": { totalInputTokens: 500_000, totalOutputTokens: 0, totalCostUsd: 0.5, numTurns: 5 }, }, }); render(); @@ -1167,7 +1167,7 @@ describe("Composer", () => { it("does not show compact warning when agent is running", () => { useChatStore.setState({ sessionStats: { - "ws-1": { totalInputTokens: 195_000, totalOutputTokens: 0, totalCostUsd: 2.0, numTurns: 15 }, + "ws-1": { totalInputTokens: 950_000, totalOutputTokens: 0, totalCostUsd: 2.0, numTurns: 15 }, }, }); render(); @@ -1177,7 +1177,7 @@ describe("Composer", () => { it("shows context usage ring when tokens > 0", () => { useChatStore.setState({ sessionStats: { - "ws-1": { totalInputTokens: 50_000, totalOutputTokens: 1000, totalCostUsd: 0.25, numTurns: 3 }, + "ws-1": { totalInputTokens: 250_000, totalOutputTokens: 1000, totalCostUsd: 0.25, numTurns: 3 }, }, }); render(); @@ -1187,7 +1187,7 @@ describe("Composer", () => { it("applies warning color to ring when context is 75-89% full", () => { useChatStore.setState({ sessionStats: { - "ws-1": { totalInputTokens: 160_000, totalOutputTokens: 0, totalCostUsd: 1.0, numTurns: 8 }, + "ws-1": { totalInputTokens: 800_000, totalOutputTokens: 0, totalCostUsd: 1.0, numTurns: 8 }, }, }); render(); @@ -1201,7 +1201,7 @@ describe("Composer", () => { it("shows tooltip with context details on hover", async () => { useChatStore.setState({ sessionStats: { - "ws-1": { totalInputTokens: 50_000, totalOutputTokens: 2000, totalCostUsd: 0.25, numTurns: 3 }, + "ws-1": { totalInputTokens: 250_000, totalOutputTokens: 2000, totalCostUsd: 0.25, numTurns: 3 }, }, }); const user = userEvent.setup(); @@ -1216,7 +1216,7 @@ describe("Composer", () => { it("shows cache read row in tooltip when cache tokens > 0", async () => { useChatStore.setState({ sessionStats: { - "ws-1": { totalInputTokens: 50_000, totalOutputTokens: 2000, totalCostUsd: 0.25, numTurns: 3, totalCacheReadTokens: 10_000 }, + "ws-1": { totalInputTokens: 250_000, totalOutputTokens: 2000, totalCostUsd: 0.25, numTurns: 3, totalCacheReadTokens: 10_000 }, }, }); const user = userEvent.setup(); @@ -1762,7 +1762,7 @@ describe("Composer", () => { it("hides context tooltip on mouse leave", async () => { useChatStore.setState({ sessionStats: { - "ws-1": { totalInputTokens: 50_000, totalOutputTokens: 1000, totalCostUsd: 0.25, numTurns: 3 }, + "ws-1": { totalInputTokens: 250_000, totalOutputTokens: 1000, totalCostUsd: 0.25, numTurns: 3 }, }, }); const user = userEvent.setup(); diff --git a/src/components/chat/Composer.tsx b/src/components/chat/Composer.tsx index 03b0510..46b88ff 100644 --- a/src/components/chat/Composer.tsx +++ b/src/components/chat/Composer.tsx @@ -12,7 +12,8 @@ import { useVoiceInput } from "../../hooks/useVoiceInput"; import { useToastStore } from "../../stores/toastStore"; import { ActionBar, ActionBarButton } from "./ActionBar"; import { QuestionCard } from "./QuestionCard"; -import { ContextUsageIndicator, CONTEXT_WINDOW_TOKENS } from "./ContextUsageIndicator"; +import { ContextUsageIndicator } from "./ContextUsageIndicator"; +import { getContextWindow } from "../../lib/models"; import { FileChipIcon } from "./FileChipIcon"; import { useFileDropHandler } from "../../hooks/useFileDropHandler"; import { useSlashCommandAutocomplete } from "../../hooks/useSlashCommandAutocomplete"; @@ -469,10 +470,10 @@ export function Composer({ contextId, contextType, agentStatus, onSend, onStop, )} {/* Context near-full warning with compact button */} - {sessionStats && sessionStats.totalInputTokens > 0 && (sessionStats.totalInputTokens / CONTEXT_WINDOW_TOKENS) >= 0.9 && agentStatus === "Idle" && ( + {sessionStats && sessionStats.totalInputTokens > 0 && (sessionStats.totalInputTokens / getContextWindow(selectedModel)) >= 0.9 && agentStatus === "Idle" && ( } - description={Context window is {Math.round((sessionStats.totalInputTokens / CONTEXT_WINDOW_TOKENS) * 100)}% full. Compact to free space.} + description={Context window is {Math.round((sessionStats.totalInputTokens / getContextWindow(selectedModel)) * 100)}% full. Compact to free space.} bgStyle={{ backgroundColor: "color-mix(in srgb, var(--error) 10%, transparent)" }} primaryAction={