import { Match, Show, Switch, createMemo, type ComponentProps, type JSX } from "solid-js" import { ProgressCircle } from "@opencode-ai/ui/progress-circle" import { ProgressCircleV2 } from "@opencode-ai/ui/v2/progress-circle-v2" import { Button } from "@opencode-ai/ui/button" import { IconButtonV2 } from "@opencode-ai/ui/v2/icon-button-v2" import { TooltipV2 } from "@opencode-ai/ui/v2/tooltip-v2" import { useFile } from "@/context/file" import { useLayout } from "@/context/layout" import { useSync } from "@/context/sync" import { useLanguage } from "@/context/language" import { useProviders } from "@/hooks/use-providers" import { useSDK } from "@/context/sdk" import { getSessionContext, getSessionTokenTotal } from "@/components/session/session-context-metrics" import { useSessionLayout } from "@/pages/session/session-layout" import { createSessionTabs } from "@/pages/session/helpers" interface SessionContextUsageProps { variant?: "button" | "indicator" buttonAppearance?: "default" | "v2" placement?: ComponentProps["placement"] } function ContextTooltipRow(props: { name: JSX.Element; value: JSX.Element }) { return (
{props.name} {props.value}
) } function openSessionContext(args: { view: ReturnType["view"]> layout: ReturnType tabs: ReturnType["tabs"]> }) { args.view.reviewPanel.open(args.view.reviewPanel.opened() ? "other" : "context-button") if (args.layout.fileTree.opened() && args.layout.fileTree.tab() !== "all") args.layout.fileTree.setTab("all") void args.tabs.open("context") args.tabs.setActive("context") } export function SessionContextUsage(props: SessionContextUsageProps) { const sync = useSync() const file = useFile() const layout = useLayout() const language = useLanguage() const sdk = useSDK() const providers = useProviders(() => sdk().directory) const { params, tabs, view } = useSessionLayout() const variant = createMemo(() => props.variant ?? "button") const buttonAppearance = createMemo(() => props.buttonAppearance ?? "default") const tabState = createSessionTabs({ tabs, pathFromTab: file.pathFromTab, normalizeTab: (tab) => (tab.startsWith("file://") ? file.tab(tab) : tab), }) const messages = createMemo(() => (params.id ? (sync().data.message[params.id] ?? []) : [])) const info = createMemo(() => (params.id ? sync().session.get(params.id) : undefined)) const usd = createMemo( () => new Intl.NumberFormat(language.intl(), { style: "currency", currency: "USD", }), ) const context = createMemo(() => getSessionContext(messages(), [...providers.all().values()])) const tokens = createMemo(() => info()?.tokens) const cost = createMemo(() => { return usd().format(info()?.cost ?? 0) }) const contextVisible = createMemo(() => view().reviewPanel.opened() && tabState.activeTab() === "context") const hasOtherTabs = createMemo(() => tabs() .all() .some((tab) => tab !== "context" && tab !== "review"), ) const openContext = () => { if (!params.id) return const sessionView = view() if (contextVisible()) { tabs().close("context") if (sessionView.reviewPanel.source() === "context-button" && !hasOtherTabs()) sessionView.reviewPanel.close() return } openSessionContext({ view: sessionView, layout, tabs: tabs(), }) } const circle = () => (
) const circleV2 = () => (
) const tooltipValue = () => (
) return ( {circle()} ) }