From cb8b668aea8457791abf21ecb882dc9915389e95 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Wed, 22 Apr 2026 00:35:48 -0400 Subject: [PATCH 1/2] feat: update codex plugin to support 5.5 (#23789) --- packages/opencode/src/plugin/codex.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/opencode/src/plugin/codex.ts b/packages/opencode/src/plugin/codex.ts index a0ff0002f48e..b7dc4d85ca9b 100644 --- a/packages/opencode/src/plugin/codex.ts +++ b/packages/opencode/src/plugin/codex.ts @@ -374,6 +374,7 @@ export async function CodexAuthPlugin(input: PluginInput): Promise { "gpt-5.3-codex", "gpt-5.4", "gpt-5.4-mini", + "gpt-5.5", ]) for (const [modelId, model] of Object.entries(provider.models)) { if (modelId.includes("codex")) continue From 94ddc20eea5ef556b0d94bc09ab3344b7c656438 Mon Sep 17 00:00:00 2001 From: Jacopo Binosi Date: Fri, 17 Apr 2026 09:36:16 +0200 Subject: [PATCH 2/2] feat(tui): display cached token count inline with total tokens Shows cache tokens inline when non-zero: - Sidebar context: "68,356 tokens (12.5K cached)" - Subagent footer: same format with percentage - Prompt footer: same format with percentage Implementation: - Extract cached tokens separately before summing - Show only when cached > 0 to reduce noise - Use existing Locale.number() for consistent formatting - Applied to all 3 TUI locations that display token usage --- .../src/cli/cmd/tui/component/prompt/index.tsx | 6 ++++-- .../cli/cmd/tui/feature-plugins/sidebar/context.tsx | 13 +++++++++++-- .../cli/cmd/tui/routes/session/subagent-footer.tsx | 6 ++++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx index cd47e917085b..a4242a52741a 100644 --- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx @@ -201,15 +201,17 @@ export function Prompt(props: PromptProps) { const last = msg.findLast((item): item is AssistantMessage => item.role === "assistant" && item.tokens.output > 0) if (!last) return + const cached = last.tokens.cache.read + last.tokens.cache.write const tokens = - last.tokens.input + last.tokens.output + last.tokens.reasoning + last.tokens.cache.read + last.tokens.cache.write + last.tokens.input + last.tokens.output + last.tokens.reasoning + cached if (tokens <= 0) return const model = sync.data.provider.find((item) => item.id === last.providerID)?.models[last.modelID] const pct = model?.limit.context ? `${Math.round((tokens / model.limit.context) * 100)}%` : undefined const cost = msg.reduce((sum, item) => sum + (item.role === "assistant" ? item.cost : 0), 0) + const tokenText = cached > 0 ? `${Locale.number(tokens)} (${Locale.number(cached)} cached)` : Locale.number(tokens) return { - context: pct ? `${Locale.number(tokens)} (${pct})` : Locale.number(tokens), + context: pct ? `${tokenText} (${pct})` : tokenText, cost: cost > 0 ? money.format(cost) : undefined, } }) diff --git a/packages/opencode/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx b/packages/opencode/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx index 9ffe77979150..e129985c273e 100644 --- a/packages/opencode/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +++ b/packages/opencode/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx @@ -19,25 +19,34 @@ function View(props: { api: TuiPluginApi; session_id: string }) { if (!last) { return { tokens: 0, + cached: 0, percent: null, } } + const cached = last.tokens.cache.read + last.tokens.cache.write const tokens = - last.tokens.input + last.tokens.output + last.tokens.reasoning + last.tokens.cache.read + last.tokens.cache.write + last.tokens.input + last.tokens.output + last.tokens.reasoning + cached const model = props.api.state.provider.find((item) => item.id === last.providerID)?.models[last.modelID] return { tokens, + cached, percent: model?.limit.context ? Math.round((tokens / model.limit.context) * 100) : null, } }) + const tokenText = createMemo(() => { + const cached = state().cached + if (cached === 0) return `${state().tokens.toLocaleString()} tokens` + return `${state().tokens.toLocaleString()} tokens (${cached.toLocaleString()} cached)` + }) + return ( Context - {state().tokens.toLocaleString()} tokens + {tokenText()} {state().percent ?? 0}% used {money.format(cost())} spent diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/subagent-footer.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/subagent-footer.tsx index c857937d4acb..6e22b522cb64 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/subagent-footer.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/subagent-footer.tsx @@ -36,8 +36,9 @@ export function SubagentFooter() { const last = msg.findLast((item): item is AssistantMessage => item.role === "assistant" && item.tokens.output > 0) if (!last) return + const cached = last.tokens.cache.read + last.tokens.cache.write const tokens = - last.tokens.input + last.tokens.output + last.tokens.reasoning + last.tokens.cache.read + last.tokens.cache.write + last.tokens.input + last.tokens.output + last.tokens.reasoning + cached if (tokens <= 0) return const model = sync.data.provider.find((item) => item.id === last.providerID)?.models[last.modelID] @@ -49,8 +50,9 @@ export function SubagentFooter() { currency: "USD", }) + const tokenText = cached > 0 ? `${Locale.number(tokens)} (${Locale.number(cached)} cached)` : Locale.number(tokens) return { - context: pct ? `${Locale.number(tokens)} (${pct})` : Locale.number(tokens), + context: pct ? `${tokenText} (${pct})` : tokenText, cost: cost > 0 ? money.format(cost) : undefined, } })