import { Match, Show, Switch, createMemo } from "solid-js" import { Tooltip } from "@opencode-ai/ui/tooltip" import { ProgressCircle } from "@opencode-ai/ui/progress-circle" import { Button } from "@opencode-ai/ui/button" import { useParams } from "@solidjs/router" import { useLayout } from "@/context/layout" import { useSync } from "@/context/sync" import { useLanguage } from "@/context/language" import { getSessionContextMetrics } from "@/components/session/session-context-metrics" interface SessionContextUsageProps { variant?: "button" | "indicator" } function openSessionContext(args: { view: ReturnType["view"]> tabs: ReturnType["tabs"]> }) { if (!args.view.reviewPanel.opened()) args.view.reviewPanel.open() args.tabs.open("context") args.tabs.setActive("context") } export function SessionContextUsage(props: SessionContextUsageProps) { const sync = useSync() const params = useParams() const layout = useLayout() const language = useLanguage() const variant = createMemo(() => props.variant ?? "button") const sessionKey = createMemo(() => `${params.dir}${params.id ? "/" + params.id : ""}`) const tabs = createMemo(() => layout.tabs(sessionKey)) const view = createMemo(() => layout.view(sessionKey)) const messages = createMemo(() => (params.id ? (sync.data.message[params.id] ?? []) : [])) const usd = createMemo( () => new Intl.NumberFormat(language.locale(), { style: "currency", currency: "USD", }), ) const metrics = createMemo(() => getSessionContextMetrics(messages(), sync.data.provider.all)) const context = createMemo(() => metrics().context) const cost = createMemo(() => { return usd().format(metrics().totalCost) }) const openContext = () => { if (!params.id) return openSessionContext({ view: view(), tabs: tabs(), }) } const circle = () => (
) const tooltipValue = () => (
{(ctx) => ( <>
{ctx().total.toLocaleString(language.locale())} {language.t("context.usage.tokens")}
{ctx().usage ?? 0}% {language.t("context.usage.usage")}
)}
{cost()} {language.t("context.usage.cost")}
) return ( {circle()} ) }