Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
d75d90c
ci: fix action
rekram1-node Nov 23, 2025
7d11986
feature: optional selectedListItemText element in themes and luminanc…
ariane-emory Nov 23, 2025
55df80b
ignore: update download stats 2025-11-23
actions-user Nov 23, 2025
af96ec5
ignore: update @solidjs/start dependency and fix console redirect han…
thdxr Nov 23, 2025
a256df9
Update Nix flake.lock and hashes
actions-user Nov 23, 2025
2509d03
tweak: fix bool
rekram1-node Nov 23, 2025
5814df7
sync
thdxr Nov 23, 2025
604891e
ci: stuff
thdxr Nov 23, 2025
76b5870
Update Nix flake.lock and hashes
actions-user Nov 23, 2025
8e2f9f6
ci: stuff
thdxr Nov 23, 2025
25b3846
Update Nix flake.lock and hashes
actions-user Nov 23, 2025
27ae341
fix bash tool wsl
rekram1-node Nov 23, 2025
de4660a
ci: ignore
thdxr Nov 23, 2025
488d33c
release: v1.0.106
Nov 23, 2025
2c93f06
Update Nix flake.lock and hashes
actions-user Nov 23, 2025
59a3e7e
ci: ignore
thdxr Nov 23, 2025
5e112a1
token
thdxr Nov 23, 2025
38b70f7
ci: secret
thdxr Nov 23, 2025
8f2a808
chore: format code
actions-user Nov 23, 2025
5ade904
ci: ignore
thdxr Nov 23, 2025
bf81e31
ci: ignore
thdxr Nov 23, 2025
2468305
ci: ignore
thdxr Nov 23, 2025
7579c3b
ci: remove log
thdxr Nov 23, 2025
7413c27
tweak: slight improvements to title gen
rekram1-node Nov 23, 2025
bbc9142
wip: zen
Nov 23, 2025
4a81bd0
wip: zen
Nov 23, 2025
eb009d5
chore: format code
actions-user Nov 23, 2025
b4fd4bb
fix: add explicit fallback model and prevent direct opencode provide…
no1wudi Nov 24, 2025
a3a2399
nix: bundle js dist with bun and patch tree-sitter wasm paths (#4644)
Alb-O Nov 24, 2025
83186b6
chore: format code
actions-user Nov 24, 2025
b9b071c
fix: fatal: undefined is not an object (evaluating 'color.buffer')
rekram1-node Nov 24, 2025
ac1e2bf
bump copilot plugin, give better error message for copilot (#4678)
rekram1-node Nov 24, 2025
502e85b
release: v1.0.107
Nov 24, 2025
d4f6deb
tweak: modified files sidebar
rekram1-node Nov 24, 2025
abdc7b2
fix: persist light vs dark mode
rekram1-node Nov 24, 2025
840d269
chore: format code
actions-user Nov 24, 2025
75c0c0a
tweak: display MCPs in alphabetic order in the sidebar. (#4680)
ariane-emory Nov 24, 2025
bcb494d
TUI: fix: add null check for user.time in duration calculation (#4679)
WohthaN Nov 24, 2025
e6bf175
ignore: update download stats 2025-11-24
actions-user Nov 24, 2025
883ed4d
docs: add Ollama Cloud provider setup to providers.mdx (#4693)
fifthfrankie Nov 24, 2025
82ebf66
non-corpo loading spinner
kommander Nov 24, 2025
8167e90
chore: format code
actions-user Nov 24, 2025
125af82
release: v1.0.108
Nov 24, 2025
b6c1df4
textarea highlight cursor color
kommander Nov 24, 2025
80b9cd1
chore: format code
actions-user Nov 24, 2025
0ed7fac
wip: zen
Nov 24, 2025
ccde319
ci: nix hash
rekram1-node Nov 24, 2025
a9a2c23
add autoupdate: notify
rekram1-node Nov 24, 2025
46a76a7
zen: add opus 4.5
Nov 24, 2025
3fb5704
wip(share): more styling
adamdotdevin Nov 24, 2025
acf1dd8
wip(share): more styling
adamdotdevin Nov 24, 2025
c60cb6c
wip(share): more styling
adamdotdevin Nov 24, 2025
8e1c7cf
wip(share): enterprise favicon
adamdotdevin Nov 24, 2025
337590c
fix(console): favicon issues
adamdotdevin Nov 24, 2025
493b3d7
chore: format code
actions-user Nov 24, 2025
5230b91
fix(console): remove extra favicon
adamdotdevin Nov 24, 2025
9e44085
adjust bundled provider logic, fix tree shaking stuff (#4708)
rekram1-node Nov 24, 2025
7fff191
wip: zen
Nov 24, 2025
823d7da
zen: display reasoning tokens
Nov 24, 2025
d39bcd9
fix(desktop): layout
adamdotdevin Nov 24, 2025
dd6113c
Add --refresh flag to models command (#4707)
ahosker Nov 24, 2025
9bd6be5
zen: byok for gemini
Nov 24, 2025
23a721f
remove hardcoded openrouter provider
rekram1-node Nov 24, 2025
2458e75
release: v1.0.109
Nov 24, 2025
7990520
chore: format code
actions-user Nov 24, 2025
d43386f
Update Nix flake.lock and hashes
actions-user Nov 24, 2025
f853469
Merge dev into integration: resolve conflicts, keep State.register pa…
shuv1337 Nov 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .opencode/opencode.jsonc
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{
"$schema": "https://opencode.ai/config.json",
"plugin": ["opencode-openai-codex-auth"],
// "enterprise": {
// "url": "http://localhost:3000",
// },
"enterprise": {
"url": "http://localhost:3000",
},
"provider": {
"opencode": {
"options": {
Expand Down
30 changes: 15 additions & 15 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion packages/console/app/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-app",
"version": "1.0.108",
"version": "1.0.109",
"type": "module",
"scripts": {
"typecheck": "tsgo --noEmit",
Expand Down
4 changes: 0 additions & 4 deletions packages/console/app/public/favicon.svg

This file was deleted.

1 change: 1 addition & 0 deletions packages/console/app/public/favicon.svg
2 changes: 1 addition & 1 deletion packages/console/app/src/component/icon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ export function IconZai(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
)
}

export function IconGoogle(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
export function IconGemini(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} viewBox="0 0 50 50" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path d="M49.04,24.001l-1.082-0.043h-0.001C36.134,23.492,26.508,13.866,26.042,2.043L25.999,0.96C25.978,0.424,25.537,0,25,0 s-0.978,0.424-0.999,0.96l-0.043,1.083C23.492,13.866,13.866,23.492,2.042,23.958L0.96,24.001C0.424,24.022,0,24.463,0,25 c0,0.537,0.424,0.978,0.961,0.999l1.082,0.042c11.823,0.467,21.449,10.093,21.915,21.916l0.043,1.083C24.022,49.576,24.463,50,25,50 s0.978-0.424,0.999-0.96l0.043-1.083c0.466-11.823,10.092-21.449,21.915-21.916l1.082-0.042C49.576,25.978,50,25.537,50,25 C50,24.463,49.576,24.022,49.04,24.001z"></path>
Expand Down
2 changes: 1 addition & 1 deletion packages/console/app/src/entry-server.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export default createHandler(
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="/favicon.svg" />
<link rel="shortcut icon" type="image/svg+xml" href="/favicon.svg" />
<meta property="og:image" content="/social-share.png" />
<meta property="twitter:image" content="/social-share.png" />
{assets}
Expand Down
1 change: 0 additions & 1 deletion packages/console/app/src/routes/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ export default function Home() {
{/*<HttpHeader name="Cache-Control" value="public, max-age=1, s-maxage=3600, stale-while-revalidate=86400" />*/}
<Title>OpenCode | The AI coding agent built for the terminal</Title>
<Link rel="canonical" href={config.baseUrl} />
<Link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<Meta property="og:image" content="/social-share.png" />
<Meta name="twitter:image" content="/social-share.png" />
<div data-component="container">
Expand Down
2 changes: 1 addition & 1 deletion packages/console/app/src/routes/workspace.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export default function WorkspaceLayout(props: RouteSectionProps) {
const userEmail = createAsync(() => getUserEmail(params.id!))
return (
<main data-page="workspace">
<Link rel="icon" type="image/svg+xml" href="/favicon-zen.svg" />
<Link rel="shortcut icon" type="image/svg+xml" href="/favicon-zen.svg" />
<header data-component="workspace-header">
<div data-slot="header-brand">
<A href="/" data-component="site-title">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { querySessionInfo } from "../common"
import {
IconAlibaba,
IconAnthropic,
IconGoogle,
IconGemini,
IconMoonshotAI,
IconOpenAI,
IconStealth,
Expand Down Expand Up @@ -117,7 +117,7 @@ export function ModelSection() {
case "Anthropic":
return <IconAnthropic width={16} height={16} />
case "Google":
return <IconGoogle width={16} height={16} />
return <IconGemini width={16} height={16} />
case "Moonshot AI":
return <IconMoonshotAI width={16} height={16} />
case "Z.ai":
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import styles from "./provider-section.module.css"
const PROVIDERS = [
{ name: "OpenAI", key: "openai", prefix: "sk-" },
{ name: "Anthropic", key: "anthropic", prefix: "sk-ant-" },
{ name: "Google Gemini", key: "google", prefix: "AI" },
] as const

type Provider = (typeof PROVIDERS)[number]
Expand Down
42 changes: 37 additions & 5 deletions packages/console/app/src/routes/workspace/[id]/usage-section.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ export function UsageSection() {
return u.inputTokens + (u.cacheReadTokens ?? 0) + (u.cacheWrite5mTokens ?? 0) + (u.cacheWrite1hTokens ?? 0)
}

const calculateTotalOutputTokens = (u: Awaited<ReturnType<typeof getUsageInfo>>[0]) => {
return u.outputTokens + (u.reasoningTokens ?? 0)
}

const goPrev = async () => {
const usage = await getUsageInfo(params.id!, store.page - 1)
setStore({
Expand Down Expand Up @@ -95,8 +99,11 @@ export function UsageSection() {
{(usage, index) => {
const date = createMemo(() => new Date(usage.timeCreated))
const totalInputTokens = createMemo(() => calculateTotalInputTokens(usage))
const breakdownId = `breakdown-${index()}`
const isOpen = createMemo(() => openBreakdownId() === breakdownId)
const totalOutputTokens = createMemo(() => calculateTotalOutputTokens(usage))
const inputBreakdownId = `input-breakdown-${index()}`
const outputBreakdownId = `output-breakdown-${index()}`
const isInputOpen = createMemo(() => openBreakdownId() === inputBreakdownId)
const isOutputOpen = createMemo(() => openBreakdownId() === outputBreakdownId)
const isClaude = usage.model.toLowerCase().includes("claude")
return (
<tr>
Expand All @@ -110,13 +117,13 @@ export function UsageSection() {
data-slot="breakdown-button"
onClick={(e) => {
e.stopPropagation()
setOpenBreakdownId(isOpen() ? null : breakdownId)
setOpenBreakdownId(isInputOpen() ? null : inputBreakdownId)
}}
>
<IconBreakdown />
</button>
<span onClick={() => setOpenBreakdownId(null)}>{totalInputTokens()}</span>
<Show when={isOpen()}>
<Show when={isInputOpen()}>
<div data-slot="breakdown-popup" onClick={(e) => e.stopPropagation()}>
<div data-slot="breakdown-row">
<span data-slot="breakdown-label">Input</span>
Expand All @@ -136,7 +143,32 @@ export function UsageSection() {
</Show>
</div>
</td>
<td data-slot="usage-tokens">{usage.outputTokens}</td>
<td data-slot="usage-tokens">
<div data-slot="tokens-with-breakdown" onClick={(e) => e.stopPropagation()}>
<button
data-slot="breakdown-button"
onClick={(e) => {
e.stopPropagation()
setOpenBreakdownId(isOutputOpen() ? null : outputBreakdownId)
}}
>
<IconBreakdown />
</button>
<span onClick={() => setOpenBreakdownId(null)}>{totalOutputTokens()}</span>
<Show when={isOutputOpen()}>
<div data-slot="breakdown-popup" onClick={(e) => e.stopPropagation()}>
<div data-slot="breakdown-row">
<span data-slot="breakdown-label">Output</span>
<span data-slot="breakdown-value">{usage.outputTokens}</span>
</div>
<div data-slot="breakdown-row">
<span data-slot="breakdown-label">Reasoning</span>
<span data-slot="breakdown-value">{usage.reasoningTokens ?? 0}</span>
</div>
</div>
</Show>
</div>
</td>
<td data-slot="usage-cost">${((usage.cost ?? 0) / 100000000).toFixed(4)}</td>
</tr>
)
Expand Down
6 changes: 5 additions & 1 deletion packages/console/app/src/routes/zen/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import { Legal } from "~/component/legal"
import { Footer } from "~/component/footer"
import { Header } from "~/component/header"
import { getLastSeenWorkspaceID } from "../workspace/common"
import { IconGemini } from "~/component/icon"

const checkLoggedIn = query(async () => {
"use server"
Expand All @@ -32,7 +33,7 @@ export default function Home() {
{/*<HttpHeader name="Cache-Control" value="public, max-age=1, s-maxage=3600, stale-while-revalidate=86400" />*/}
<Title>OpenCode Zen | A curated set of reliable optimized models for coding agents</Title>
<Link rel="canonical" href={`${config.baseUrl}/zen`} />
<Link rel="icon" type="image/svg+xml" href="/favicon-zen.svg" />
<Link rel="shortcut icon" type="image/svg+xml" href="/favicon-zen.svg" />
<Meta property="og:image" content="/social-share-zen.png" />
<Meta name="twitter:image" content="/social-share-zen.png" />
<Meta name="opencode:auth" content={loggedin() ? "true" : "false"} />
Expand Down Expand Up @@ -82,6 +83,9 @@ export default function Home() {
/>
</svg>
</div>
<div>
<IconGemini width="24" height="24" />
</div>
<div>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
Expand Down
2 changes: 1 addition & 1 deletion packages/console/core/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/console-core",
"version": "1.0.108",
"version": "1.0.109",
"private": true,
"type": "module",
"dependencies": {
Expand Down
2 changes: 1 addition & 1 deletion packages/console/function/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-function",
"version": "1.0.108",
"version": "1.0.109",
"$schema": "https://json.schemastore.org/package.json",
"private": true,
"type": "module",
Expand Down
2 changes: 1 addition & 1 deletion packages/console/mail/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/console-mail",
"version": "1.0.108",
"version": "1.0.109",
"dependencies": {
"@jsx-email/all": "2.2.3",
"@jsx-email/cli": "1.4.3",
Expand Down
2 changes: 1 addition & 1 deletion packages/desktop/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/desktop",
"version": "1.0.108",
"version": "1.0.109",
"description": "",
"type": "module",
"scripts": {
Expand Down
30 changes: 22 additions & 8 deletions packages/desktop/src/pages/session.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -338,14 +338,28 @@ export default function Page() {
<Match when={session.id}>
<div class="flex items-start justify-start h-full min-h-0">
<Show when={session.messages.user().length > 1}>
<MessageNav
classList={{ "mt-1.5 mr-3": wide(), "mt-3 mr-8": !wide() }}
messages={session.messages.user()}
current={session.messages.active()}
onMessageSelect={session.messages.setActive}
size={wide() ? "normal" : "compact"}
working={session.working()}
/>
<>
<MessageNav
class="@6xl:hidden mt-3 mr-8"
messages={session.messages.user()}
current={session.messages.active()}
onMessageSelect={session.messages.setActive}
size="compact"
working={session.working()}
/>
<MessageNav
classList={{
"hidden @6xl:block": true,
"mt-0.5 mr-3 absolute right-full": wide(),
"mt-3 mr-8": !wide(),
}}
messages={session.messages.user()}
current={session.messages.active()}
onMessageSelect={session.messages.setActive}
size={wide() ? "normal" : "compact"}
working={session.working()}
/>
</>
</Show>
<SessionTurn
sessionID={session.id!}
Expand Down
Loading