diff --git a/packages/app/src/components/session/session-context-tab.tsx b/packages/app/src/components/session/session-context-tab.tsx index 1ea97c395c4..e1efeac71ab 100644 --- a/packages/app/src/components/session/session-context-tab.tsx +++ b/packages/app/src/components/session/session-context-tab.tsx @@ -1,17 +1,20 @@ -import { createMemo, createEffect, on, onCleanup, For, Show } from "solid-js" +import { createMemo, createEffect, createSignal, on, onCleanup, For, Show } from "solid-js" import type { JSX } from "solid-js" import { useParams } from "@solidjs/router" import { useSync } from "@/context/sync" +import { useSDK } from "@/context/sdk" import { useLayout } from "@/context/layout" import { checksum } from "@opencode-ai/util/encode" import { findLast } from "@opencode-ai/util/array" import { same } from "@/utils/same" import { Icon } from "@opencode-ai/ui/icon" +import { Button } from "@opencode-ai/ui/button" import { Accordion } from "@opencode-ai/ui/accordion" import { StickyAccordionHeader } from "@opencode-ai/ui/sticky-accordion-header" import { Code } from "@opencode-ai/ui/code" import { Markdown } from "@opencode-ai/ui/markdown" import { ScrollView } from "@opencode-ai/ui/scroll-view" +import { ProgressCircle } from "@opencode-ai/ui/progress-circle" import type { Message, Part, UserMessage } from "@opencode-ai/sdk/v2/client" import { useLanguage } from "@/context/language" import { getSessionContextMetrics } from "./session-context-metrics" @@ -278,6 +281,66 @@ export function SessionContextTab() { onScroll={handleScroll} >
+ + {(c) => { + const sdk = useSDK() + const [compacting, setCompacting] = createSignal(false) + const usage = () => c().usage ?? 0 + const color = () => usage() > 80 ? "var(--syntax-error)" : usage() > 60 ? "var(--syntax-warning)" : "var(--syntax-success)" + + const compact = async () => { + if (!params.id || compacting()) return + setCompacting(true) + try { + const last = visibleUserMessages().at(-1) + await sdk.client.session.summarize({ + sessionID: params.id, + directory: sdk.directory, + providerID: last?.model?.providerID, + modelID: last?.model?.modelID, + }) + } finally { + setCompacting(false) + } + } + + return ( +
+
+
+ +
+ + {formatter().number(c().total)} / {formatter().number(c().limit)} + + + {usage()}% {language.t("context.usage.usage")} + +
+
+ +
+
+
+
+
+ ) + }} + +
{(stat) => [0])} value={stat.value()} />}