import { useSync } from "@tui/context/sync" import { createMemo, For, Show, Switch, Match } from "solid-js" import { useTheme } from "../../context/theme" import { Locale } from "@/util/locale" import path from "path" import type { AssistantMessage } from "@opencode-ai/sdk" export function Sidebar(props: { sessionID: string }) { const sync = useSync() const { theme } = useTheme() const session = createMemo(() => sync.session.get(props.sessionID)!) const diff = createMemo(() => sync.data.session_diff[props.sessionID] ?? []) const todo = createMemo(() => sync.data.todo[props.sessionID] ?? []) const messages = createMemo(() => sync.data.message[props.sessionID] ?? []) const cost = createMemo(() => { const total = messages().reduce((sum, x) => sum + (x.role === "assistant" ? x.cost : 0), 0) return new Intl.NumberFormat("en-US", { style: "currency", currency: "USD", }).format(total) }) const context = createMemo(() => { const last = messages().findLast((x) => x.role === "assistant" && x.tokens.output > 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 const model = sync.data.provider.find((x) => x.id === last.providerID)?.models[last.modelID] return { tokens: total.toLocaleString(), percentage: model?.limit.context ? Math.round((total / model.limit.context) * 100) : null, } }) return ( {session().title} {session().share!.url} Context {context()?.tokens ?? 0} tokens {context()?.percentage ?? 0}% used {cost()} spent 0}> MCP {([key, item]) => ( • {key}{" "} Connected {(val) => {val().error}} Disabled in configuration )} 0}> LSP {(item) => ( • {item.id} {item.root} )} 0}> Modified Files {(item) => { const file = createMemo(() => { const splits = item.file.split(path.sep).filter(Boolean) const last = splits.at(-1)! const rest = splits.slice(0, -1).join(path.sep) return Locale.truncateMiddle(rest, 30 - last.length) + "/" + last }) return ( {file()} +{item.additions} -{item.deletions} ) }} 0}> Todo {(todo) => ( [{todo.status === "completed" ? "✓" : " "}] {todo.content} )} ) }