Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
6288a03
bump bun to 1.3.4
rekram1-node Dec 10, 2025
03c6c3f
docs: document accept always behavior (#5340)
igordertigor Dec 10, 2025
936a6be
stuff adam needs
thdxr Dec 10, 2025
a1175bd
gen types
thdxr Dec 10, 2025
0ab3b88
chore: format code
actions-user Dec 10, 2025
59fb3ae
ignore: add bash tests
rekram1-node Dec 10, 2025
9ad828d
tui: use random free port and enable icon discovery by default
thdxr Dec 10, 2025
8d3eac2
fix type
thdxr Dec 10, 2025
67a95c3
wip(desktop): progress
adamdotdevin Dec 10, 2025
a4ec619
wip(desktop): progress
adamdotdevin Dec 10, 2025
6866a06
wip(desktop): progress
adamdotdevin Dec 10, 2025
ada40de
wip(desktop): progress
adamdotdevin Dec 10, 2025
e694d4d
wip(desktop): progress
adamdotdevin Dec 10, 2025
f20d6e8
wip(desktop): progress
adamdotdevin Dec 10, 2025
804ad58
wip(desktop): progress
adamdotdevin Dec 10, 2025
91d743e
wip(desktop): progress
adamdotdevin Dec 10, 2025
190fa4c
wip(desktop): progress
adamdotdevin Dec 10, 2025
58e66dd
wip(desktop): progress
adamdotdevin Dec 10, 2025
86f7cc1
tui: pass dynamic port to frontend
thdxr Dec 10, 2025
e060f96
Update Nix flake.lock and hashes
actions-user Dec 10, 2025
7435d94
fix(cli): obtain directory data from server (#5320)
OpeOginni Dec 10, 2025
7d82f17
tweak: small fix
rekram1-node Dec 10, 2025
e46080a
fix(auth): add plugin lookup for custom provider in 'Other' flow (#5324)
Yukaii Dec 10, 2025
72eb004
feat: add helicone docs + helicone session tracking (#5265)
H2Shami Dec 10, 2025
b274371
feat: use |- for intermediate sub-agent steps (#5336)
paralin Dec 10, 2025
e36c349
tweak: oc -> OC
rekram1-node Dec 10, 2025
cbb591e
fix: more descriptive tool or subtask execution failed error (#5337)
paralin Dec 10, 2025
85cfa22
wip(desktop): progress
adamdotdevin Dec 10, 2025
15b8c14
fix: tauri
adamdotdevin Dec 10, 2025
89d51ad
compaction: improve compaction prompt (#5348)
shantur Dec 10, 2025
56540f8
wip(desktop): progress
adamdotdevin Dec 10, 2025
1a1874d
docs: desktop
jayair Dec 10, 2025
92fa66d
core: reposition OpenCode as open source multi-platform coding agent
jayair Dec 11, 2025
1361117
fix deploy
thdxr Dec 11, 2025
fadeed1
desktop: enable zoom hotkeys in Tauri app
thdxr Dec 11, 2025
df55ad8
Add Cerebras integration header with opencode identifier (#5354)
sebastiand-cerebras Dec 11, 2025
01fd0d8
docs(bash): clarify description parameter is required (#5353)
zenyr Dec 11, 2025
499ad4f
fix: light mode visibility for filepath in /undo diff files (#5352)
koichincom Dec 11, 2025
bd1f5f8
tauri: update icons
Brendonovich Dec 11, 2025
6f5f73a
desktop: exclude ts-dist from tsconfig sources
Brendonovich Dec 11, 2025
439aebb
tweak: correct thinkingLevel
rekram1-node Dec 11, 2025
7b4f852
ignore: tmp transform exclusion
rekram1-node Dec 11, 2025
530b75a
ignore
thdxr Dec 11, 2025
13a7700
global.dispose
thdxr Dec 11, 2025
28c6320
chore: format code
actions-user Dec 11, 2025
d88912a
global bus
thdxr Dec 11, 2025
9b05217
ignore
thdxr Dec 11, 2025
f1b8707
ignore
thdxr Dec 11, 2025
7eb509d
ci: rm bash tool from opencode ci workflow, reduce risks
rekram1-node Dec 11, 2025
d93c8c7
docs: update doc sdk.mdx (#5315)
AyushWalekar Dec 11, 2025
a02223a
sync
thdxr Dec 11, 2025
d14462f
fix
thdxr Dec 11, 2025
4309c07
domain
thdxr Dec 11, 2025
5955d20
remove
thdxr Dec 11, 2025
231390c
ci
thdxr Dec 11, 2025
578072b
use new share url
thdxr Dec 11, 2025
6251231
release: v1.0.144
Dec 11, 2025
40f121c
prevent indexing of share page
thdxr Dec 11, 2025
65a6b3d
chore: format code
actions-user Dec 11, 2025
85c01e8
enterprise: add social card meta tags to share pages
thdxr Dec 11, 2025
2d9c76b
enterprise: add default social card images to HTML head
thdxr Dec 11, 2025
9e0a2bc
Update Nix flake.lock and hashes
actions-user Dec 11, 2025
a8f83cd
ignore: comment out item in project cfg
rekram1-node Dec 11, 2025
f7e29a1
downgrade bun
rekram1-node Dec 11, 2025
5d57d03
opencode config
thdxr Dec 11, 2025
c211b22
update
thdxr Dec 11, 2025
fbad378
release: v1.0.145
Dec 11, 2025
0bcb304
sync: merge upstream v1.0.145 into integration
opencode-agent[bot] Dec 11, 2025
0b1bf15
sync: record last synced tag v1.0.145
opencode-agent[bot] Dec 11, 2025
04810e8
fix: resolve type errors after v1.0.145 merge
opencode-agent[bot] Dec 11, 2025
6c2f117
chore: format code
actions-user Dec 11, 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
2 changes: 1 addition & 1 deletion .github/last-synced-tag
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v1.0.143
v1.0.145
13 changes: 0 additions & 13 deletions .opencode/opencode.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,4 @@
"options": {},
},
},
"mcp": {
"exa": {
"type": "remote",
"url": "https://mcp.exa.ai/mcp",
},
"morph": {
"type": "local",
"command": ["bunx", "@morphllm/morphmcp"],
"environment": {
"ENABLED_TOOLS": "warp_grep",
},
},
},
}
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ _Last updated: 2025-12-10_
</picture>
</a>
</p>
<p align="center">The AI coding agent built for the terminal.</p>
<p align="center">The open source AI coding agent.</p>
<p align="center">
<a href="https://opencode.ai/discord"><img alt="Discord" src="https://img.shields.io/discord/1391832426048651334?style=flat-square&label=discord" /></a>
<a href="https://www.npmjs.com/package/opencode-ai"><img alt="npm" src="https://img.shields.io/npm/v/opencode-ai?style=flat-square" /></a>
Expand Down
77 changes: 41 additions & 36 deletions bun.lock

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions infra/enterprise.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { SECRET } from "./secret"
import { domain } from "./stage"
import { domain, shortDomain } from "./stage"

const storage = new sst.cloudflare.Bucket("EnterpriseStorage")

const enterprise = new sst.cloudflare.x.SolidStart("Enterprise", {
domain: "enterprise." + domain,
const teams = new sst.cloudflare.x.SolidStart("Teams", {
domain: shortDomain,
path: "packages/enterprise",
buildCommand: "bun run build:cloudflare",
environment: {
Expand Down
6 changes: 6 additions & 0 deletions infra/stage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,9 @@ new cloudflare.RegionalHostname("RegionalHostname", {
regionKey: "us",
zoneId: zoneID,
})

export const shortDomain = (() => {
if ($app.stage === "production") return "opncd.ai"
if ($app.stage === "dev") return "dev.opncd.ai"
return `${$app.stage}.dev.opncd.ai`
})()
2 changes: 1 addition & 1 deletion nix/hashes.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"nodeModules": "sha256-JT8J+Nd2kk0x46BcyotmBbM39tuKOW7VzXfOV3R3sqQ="
"nodeModules": "sha256-WcFRAG8w1XwgZxzyAawkQ7mYfJxu5VhA3sPApEG6FdI="
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
"@tsconfig/bun": "1.0.9",
"@cloudflare/workers-types": "4.20251008.0",
"@openauthjs/openauth": "0.0.0-20250322224806",
"@pierre/precision-diffs": "0.6.0-beta.10",
"@pierre/precision-diffs": "0.6.1",
"@tailwindcss/vite": "4.1.11",
"diff": "8.0.2",
"ai": "5.0.97",
Expand Down
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.143",
"version": "1.0.145",
"type": "module",
"scripts": {
"typecheck": "tsgo --noEmit",
Expand Down
2 changes: 1 addition & 1 deletion packages/console/app/src/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export default function App() {
root={(props) => (
<MetaProvider>
<Title>opencode</Title>
<Meta name="description" content="OpenCode - The AI coding agent built for the terminal." />
<Meta name="description" content="OpenCode - The open source coding agent." />
<Favicon />
<Suspense>{props.children}</Suspense>
</MetaProvider>
Expand Down
8 changes: 4 additions & 4 deletions packages/console/app/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ export const config = {
github: {
repoUrl: "https://github.com/sst/opencode",
starsFormatted: {
compact: "35K",
full: "35,000",
compact: "38K",
full: "38,000",
},
},

Expand All @@ -22,8 +22,8 @@ export const config = {

// Static stats (used on landing page)
stats: {
contributors: "350",
commits: "5,000",
contributors: "375",
commits: "5,250",
monthlyUsers: "400,000",
},
} as const
17 changes: 5 additions & 12 deletions packages/console/app/src/routes/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -157,15 +157,9 @@ export default function Home() {
<section data-component="what">
<div data-slot="section-title">
<h3>What is OpenCode?</h3>
<p>OpenCode is an open source agent that helps you write and run code directly from the terminal.</p>
<p>OpenCode is an open source agent that helps you write code in your terminal, IDE, or desktop.</p>
</div>
<ul>
<li>
<span>[*]</span>
<div>
<strong>Native TUI</strong> A responsive, native, themeable terminal UI
</div>
</li>
<li>
<span>[*]</span>
<div>
Expand Down Expand Up @@ -199,7 +193,7 @@ export default function Home() {
<li>
<span>[*]</span>
<div>
<strong>Any editor</strong> OpenCode runs in your terminal, pair it with any IDE
<strong>Any editor</strong> Available as a terminal interface, desktop app, and IDE extension
</div>
</li>
</ul>
Expand Down Expand Up @@ -651,9 +645,8 @@ export default function Home() {
<ul>
<li>
<Faq question="What is OpenCode?">
OpenCode is an open source agent that helps you write and run code directly from the terminal. You can
pair OpenCode with any AI model, and because it’s terminal-based you can pair it with your preferred
code editor.
OpenCode is an open source agent that helps you write and run code with any AI model. It's available
as a terminal-based interface, desktop app, or IDE extension.
</Faq>
</li>
<li>
Expand All @@ -674,7 +667,7 @@ export default function Home() {
</li>
<li>
<Faq question="Can I only use OpenCode in the terminal?">
Yes, for now. We are actively working on a desktop app. Join the waitlist for early access.
Not anymore! OpenCode is now available as an app for your desktop.
</Faq>
</li>
<li>
Expand Down
20 changes: 20 additions & 0 deletions packages/console/app/src/routes/t/[...path].tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import type { APIEvent } from "@solidjs/start/server"

async function handler(evt: APIEvent) {
const req = evt.request.clone()
const url = new URL(req.url)
const targetUrl = `https://enterprise.opencode.ai/${url.pathname}${url.search}`
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

cd /tmp/repo && find . -type f -name "[...path].tsx" | head -20

Repository: Latitudes-Dev/shuvcode

Length of output: 125


🏁 Script executed:

cd /tmp/repo && cat -n packages/console/app/src/routes/t/[...path].tsx 2>/dev/null || echo "File not found"

Repository: Latitudes-Dev/shuvcode

Length of output: 157


🏁 Script executed:

cd /tmp/repo && rg -n 'enterprise\.opencode\.ai' packages/console/ --type=ts --type=tsx 2>/dev/null || echo "Pattern not found"

Repository: Latitudes-Dev/shuvcode

Length of output: 160


🏁 Script executed:

cd /tmp/repo && git ls-files | grep -E "(routes|proxy)" | head -20

Repository: Latitudes-Dev/shuvcode

Length of output: 125


🏁 Script executed:

git ls-files | grep -E "packages/console" | head -20

Repository: Latitudes-Dev/shuvcode

Length of output: 914


🏁 Script executed:

git ls-files | grep -E "\[.*\]\.tsx$"

Repository: Latitudes-Dev/shuvcode

Length of output: 304


🏁 Script executed:

git ls-files | grep -E "routes" | head -20

Repository: Latitudes-Dev/shuvcode

Length of output: 1016


🏁 Script executed:

cat -n packages/console/app/src/routes/t/[...path].tsx

Repository: Latitudes-Dev/shuvcode

Length of output: 759


🏁 Script executed:

rg -n 'enterprise\.opencode\.ai' packages/console/app/src/routes/

Repository: Latitudes-Dev/shuvcode

Length of output: 197


🏁 Script executed:

rg -n 'OPENCODE_API' packages/console/ --type=ts --type=tsx

Repository: Latitudes-Dev/shuvcode

Length of output: 93


🏁 Script executed:

rg -n '\[\.\.\.' packages/console/app/src/routes/ -A 5 -B 2

Repository: Latitudes-Dev/shuvcode

Length of output: 1371


🏁 Script executed:

cat -n packages/console/app/src/routes/t/[...path].tsx packages/console/app/src/routes/docs/[...path].ts 2>/dev/null | head -40

Repository: Latitudes-Dev/shuvcode

Length of output: 1446


🏁 Script executed:

rg -n 'params\|pathname' packages/console/app/src/routes/ --type=ts

Repository: Latitudes-Dev/shuvcode

Length of output: 48


🏁 Script executed:

rg -n 'url\.pathname|params\.' packages/console/app/src/routes/ -B 2 -A 2 --type=ts --type=tsx

Repository: Latitudes-Dev/shuvcode

Length of output: 93


🏁 Script executed:

cat -n packages/console/app/src/routes/workspace/[id].tsx

Repository: Latitudes-Dev/shuvcode

Length of output: 2905


🏁 Script executed:

rg -n 'export.*handler|export.*GET' packages/console/app/src/routes/docs/ -B 5 -A 5

Repository: Latitudes-Dev/shuvcode

Length of output: 1626


🏁 Script executed:

cat -n packages/console/app/src/routes/docs/index.ts packages/console/app/src/routes/docs/[...path].ts

Repository: Latitudes-Dev/shuvcode

Length of output: 1439


Remove the trailing slash to match the docs proxy pattern and avoid double slash in URLs.

The URL construction has an inconsistency: the /t/[...path] route includes a trailing slash after the domain (https://enterprise.opencode.ai/), while the similar /docs/[...path] route does not (https://docs.opencode.ai). This creates a double slash when url.pathname starts with /:

-const targetUrl = `https://enterprise.opencode.ai/${url.pathname}${url.search}`
+const targetUrl = `https://enterprise.opencode.ai${url.pathname}${url.search}`

This aligns with how the docs proxy route is implemented and ensures clean URLs without double slashes.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const targetUrl = `https://enterprise.opencode.ai/${url.pathname}${url.search}`
const targetUrl = `https://enterprise.opencode.ai${url.pathname}${url.search}`
🤖 Prompt for AI Agents
packages/console/app/src/routes/t/[...path].tsx around line 6: the targetUrl
includes a trailing slash after the domain which can produce double slashes when
url.pathname starts with '/', so remove the trailing slash from the domain
literal (use "https://enterprise.opencode.ai" instead of
"https://enterprise.opencode.ai/") or alternatively normalize by stripping the
leading slash from url.pathname before concatenation so the final URL matches
the docs proxy pattern and avoids double slashes.

const response = await fetch(targetUrl, {
method: req.method,
headers: req.headers,
body: req.body,
})
return response
Comment on lines +3 to +12
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add error handling and consider security implications.

The proxy lacks error handling for network failures and forwards all request headers (including cookies, authorization) to the target. Consider:

  1. Wrapping fetch in try-catch
  2. Filtering sensitive headers if not all should be forwarded
  3. Adding a timeout
 async function handler(evt: APIEvent) {
   const req = evt.request.clone()
   const url = new URL(req.url)
   const targetUrl = `https://enterprise.opencode.ai/${url.pathname}${url.search}`
-  const response = await fetch(targetUrl, {
-    method: req.method,
-    headers: req.headers,
-    body: req.body,
-  })
-  return response
+  try {
+    const response = await fetch(targetUrl, {
+      method: req.method,
+      headers: req.headers,
+      body: req.body,
+      signal: AbortSignal.timeout(30000),
+    })
+    return response
+  } catch (error) {
+    return new Response("Proxy error", { status: 502 })
+  }
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
async function handler(evt: APIEvent) {
const req = evt.request.clone()
const url = new URL(req.url)
const targetUrl = `https://enterprise.opencode.ai/${url.pathname}${url.search}`
const response = await fetch(targetUrl, {
method: req.method,
headers: req.headers,
body: req.body,
})
return response
async function handler(evt: APIEvent) {
const req = evt.request.clone()
const url = new URL(req.url)
const targetUrl = `https://enterprise.opencode.ai/${url.pathname}${url.search}`
try {
const response = await fetch(targetUrl, {
method: req.method,
headers: req.headers,
body: req.body,
signal: AbortSignal.timeout(30000),
})
return response
} catch (error) {
return new Response("Proxy error", { status: 502 })
}
}

}

export const GET = handler
export const POST = handler
export const PUT = handler
export const DELETE = handler
export const OPTIONS = handler
export const PATCH = handler
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.143",
"version": "1.0.145",
"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.143",
"version": "1.0.145",
"$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.143",
"version": "1.0.145",
"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.143",
"version": "1.0.145",
"description": "",
"type": "module",
"exports": {
Expand Down
8 changes: 7 additions & 1 deletion packages/desktop/src/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,14 @@ import { GlobalSDKProvider } from "./context/global-sdk"
import { SessionProvider } from "./context/session"
import { Show } from "solid-js"

declare global {
interface Window {
__OPENCODE__?: { updaterEnabled?: boolean; port?: number }
}
}

const host = import.meta.env.VITE_OPENCODE_SERVER_HOST ?? "127.0.0.1"
const port = import.meta.env.VITE_OPENCODE_SERVER_PORT ?? "4096"
const port = window.__OPENCODE__?.port ?? import.meta.env.VITE_OPENCODE_SERVER_PORT ?? "4096"

const url =
new URLSearchParams(document.location.search).get("url") ||
Expand Down
31 changes: 14 additions & 17 deletions packages/desktop/src/components/font-picker.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
import { createMemo, onMount } from "solid-js"
import { createSignal, onMount } from "solid-js"
import { SelectDialog } from "@opencode-ai/ui/select-dialog"
import { Button } from "@opencode-ai/ui/button"
import { Icon } from "@opencode-ai/ui/icon"
import { Tooltip } from "@opencode-ai/ui/tooltip"
import { FONTS, getFontById, type FontDefinition } from "@/fonts/font-definitions"
import { useLayout } from "@/context/layout"
import { applyFontWithLoad, ensureFontLoaded, applyFont } from "@/fonts/apply-font"

const DEFAULT_FONT_ID = "meslo"

function getDefaultFont(): FontDefinition {
return getFontById(DEFAULT_FONT_ID) ?? FONTS[0]
}

export function FontPicker() {
const layout = useLayout()
const currentFont = createMemo(() => getFontById(layout.font.current()) ?? FONTS[0])
const [currentFont, setCurrentFont] = createSignal<FontDefinition>(getDefaultFont())
const [previewFont, setPreviewFont] = createSignal<FontDefinition | undefined>()

onMount(() => applyFontWithLoad(currentFont()))

Expand All @@ -19,22 +24,15 @@ export function FontPicker() {
const loaded = await ensureFontLoaded(font)
if (!loaded) return

layout.font.set(font.id)
applyFont(font.id)
}

async function handleHighlight(font: FontDefinition | undefined) {
if (!font) return

const loaded = await ensureFontLoaded(font)
if (!loaded) return

setCurrentFont(font)
setPreviewFont(undefined)
applyFont(font.id)
}

function handleOpenChange(open: boolean) {
if (!open) {
if (!open && previewFont()) {
applyFont(currentFont().id)
setPreviewFont(undefined)
}
}

Expand All @@ -48,12 +46,11 @@ export function FontPicker() {
current={currentFont()}
filterKeys={["name", "family"]}
onSelect={handleSelect}
onHighlight={handleHighlight}
onOpenChange={handleOpenChange}
trigger={
<Tooltip class="shrink-0" value="Font">
<Button variant="ghost" class="size-6 p-0">
<Icon name="type" size="small" />
<Icon name="code-lines" size="small" />
</Button>
</Tooltip>
}
Expand Down
Loading
Loading