From 6e7fc30f9407f48074852415e2c35958b82b78ed Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 1 Jan 2026 05:23:00 -0600 Subject: feat(app): context window window --- .../app/src/components/session-context-usage.tsx | 100 ++++++++++++++------- 1 file changed, 70 insertions(+), 30 deletions(-) (limited to 'packages/app/src/components') diff --git a/packages/app/src/components/session-context-usage.tsx b/packages/app/src/components/session-context-usage.tsx index ece1f8695..53e578214 100644 --- a/packages/app/src/components/session-context-usage.tsx +++ b/packages/app/src/components/session-context-usage.tsx @@ -1,13 +1,25 @@ -import { createMemo, Show } from "solid-js" +import { Match, Show, Switch, createMemo } from "solid-js" import { Tooltip } from "@opencode-ai/ui/tooltip" import { ProgressCircle } from "@opencode-ai/ui/progress-circle" -import { useSync } from "@/context/sync" +import { Button } from "@opencode-ai/ui/button" import { useParams } from "@solidjs/router" import { AssistantMessage } from "@opencode-ai/sdk/v2/client" -export function SessionContextUsage() { +import { useLayout } from "@/context/layout" +import { useSync } from "@/context/sync" + +interface SessionContextUsageProps { + variant?: "button" | "indicator" +} + +export function SessionContextUsage(props: SessionContextUsageProps) { const sync = useSync() const params = useParams() + const layout = useLayout() + + const variant = createMemo(() => props.variant ?? "button") + const sessionKey = createMemo(() => `${params.dir}${params.id ? "/" + params.id : ""}`) + const tabs = createMemo(() => layout.tabs(sessionKey())) const messages = createMemo(() => (params.id ? (sync.data.message[params.id] ?? []) : [])) const cost = createMemo(() => { @@ -19,7 +31,11 @@ export function SessionContextUsage() { }) const context = createMemo(() => { - const last = messages().findLast((x) => x.role === "assistant" && x.tokens.output > 0) as AssistantMessage + const last = messages().findLast((x) => { + if (x.role !== "assistant") return false + const total = x.tokens.input + x.tokens.output + x.tokens.reasoning + x.tokens.cache.read + x.tokens.cache.write + return total > 0 + }) as AssistantMessage if (!last) return const total = last.tokens.input + last.tokens.output + last.tokens.reasoning + last.tokens.cache.read + last.tokens.cache.write @@ -30,33 +46,57 @@ export function SessionContextUsage() { } }) - return ( - - {(ctx) => ( - -
- {ctx().tokens} - Tokens -
-
- {ctx().percentage ?? 0}% - Usage -
-
- {cost()} - Cost -
+ const openContext = () => { + if (!params.id) return + layout.review.open() + tabs().open("context") + tabs().setActive("context") + } + + const circle = () => ( +
+ +
+ ) + + const tooltipValue = () => ( +
+ + {(ctx) => ( + <> +
+ {ctx().tokens} + Tokens +
+
+ {ctx().percentage ?? 0}% + Usage
- } - placement="top" - > -
- -
- - )} + + )} +
+
+ {cost()} + Cost +
+ +
Click to view context
+
+
+ ) + + return ( + + + + {circle()} + + + + + ) } -- cgit v1.2.3