Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
cc34084
feat(desktop): prevent overlapping composer borders (#37490)
usrnk1 Jul 19, 2026
6bea0f4
zen: grok 4.5 adjusted price
fwang Jul 19, 2026
1221bbb
Merge branch 'dev' of github.com:anomalyco/opencode into dev
fwang Jul 19, 2026
573ac85
feat(desktop): align new session project picker (#37461)
usrnk1 Jul 19, 2026
6a28842
go: support openai route
fwang Jul 19, 2026
5a5117b
Merge branch 'dev' of github.com:anomalyco/opencode into dev
fwang Jul 19, 2026
4817228
docs(go): update Kimi K3 request estimates (#37725)
opencode-agent[bot] Jul 19, 2026
f557328
chore: generate
opencode-agent[bot] Jul 19, 2026
78587c1
fix(app): restore question pager segments (#37575)
opencode-agent[bot] Jul 19, 2026
67caf89
fix(opencode): increase OpenAI header timeout (#37770)
opencode-agent[bot] Jul 19, 2026
7985c20
fix(app): show keybind tooltips on prompt input controls (#37824)
ProdigyRahul Jul 20, 2026
ba4b8e2
feat(app): toggle debug tools from dev badge (#36689)
iamdavidhill Jul 20, 2026
2a097f3
fix(llm): expand context overflow patterns (#37840)
opencode-agent[bot] Jul 20, 2026
61653a2
sync
fwang Jul 20, 2026
cfa134f
Merge branch 'dev' of github.com:anomalyco/opencode into dev
fwang Jul 20, 2026
cd46f22
sync
fwang Jul 20, 2026
20a3a21
feat(opencode): use adaptive thinking effort for kimi family on anthr…
chouqin Jul 20, 2026
3b719ab
chore: generate
opencode-agent[bot] Jul 20, 2026
5586f96
fix(app): restore model variant accessibility (#37857)
opencode-agent[bot] Jul 20, 2026
3fc5af6
feat(app): update settings description line height (#37759)
arvsrn Jul 20, 2026
3ba3954
feat(app): review panel improvements (#36716)
arvsrn Jul 20, 2026
9105f35
chore: generate
opencode-agent[bot] Jul 20, 2026
a19b52e
fix(app): omit empty prompt text parts (#37577)
opencode-agent[bot] Jul 20, 2026
4a81e83
fix(app): gate notification server selection (#37890)
opencode-agent[bot] Jul 20, 2026
8bec40a
fix(app): align Windows upgrade drawer (#37895)
Hona Jul 20, 2026
5542415
fix(app): shrink Windows drawer close button (#37909)
Hona Jul 20, 2026
cc3615b
fix(app): tolerate missing message parents (#37918)
opencode-agent[bot] Jul 20, 2026
e2531df
chore(app): bump ghostty-web (#37923)
Hona Jul 20, 2026
b67fda1
chore: update nix node_modules hashes
opencode-agent[bot] Jul 20, 2026
43e472b
feat(app): sync embedded terminal theme (#37931)
Hona Jul 20, 2026
70535a1
chore: update nix node_modules hashes
opencode-agent[bot] Jul 20, 2026
da312b0
fix(app): preserve command menu drafts (#37942)
opencode-agent[bot] Jul 20, 2026
47fc6f2
fix(app): preserve mentions during paste (#37940)
opencode-agent[bot] Jul 20, 2026
4872c48
fix(app): complete mentions at cursor (#37941)
opencode-agent[bot] Jul 20, 2026
96ff82a
fix(console): remove desktop promo overlay
opencode-agent[bot] Jul 20, 2026
d36a2d8
sync release versions for v1.18.4
Jul 20, 2026
4cc0224
fix(opencode): display proper session import errors (#36258)
OpeOginni Jul 20, 2026
5a8ee27
fix(provider): update muse-spark reasoning default and system prompt …
mreso Jul 20, 2026
3033afb
fix(provider): normalize Mistral family tool call IDs (#37982)
rekram1-node Jul 20, 2026
849c259
docs: generalize session title model description (#37986)
rekram1-node Jul 20, 2026
6aa3a93
chore: sync upstream dev through 849c2598ab
LogicLyra Jul 21, 2026
52358e8
fix(app): thread borderUnderlay through fork prompt-input-v2
LogicLyra Jul 21, 2026
bfd0018
fix(app): narrow ChannelIndicator channel type for fork env typing
LogicLyra Jul 21, 2026
2b644dd
test(session-ui): pass cursor in input.changed event for fork machine
LogicLyra Jul 21, 2026
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
60 changes: 30 additions & 30 deletions bun.lock

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

8 changes: 4 additions & 4 deletions nix/hashes.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"nodeModules": {
"x86_64-linux": "sha256-zAftZieWR0hWQQVkhEa826iueHaRnKxtyRodhNb+Apc=",
"aarch64-linux": "sha256-cTG+gB7CuiFgaYHSFbzXaXUI1C2kiugV3B9rUDRUwlg=",
"aarch64-darwin": "sha256-ap4Xv5ZliourkI4mcD0ktbzSI88jb4oVBv5mMK3WdUs=",
"x86_64-darwin": "sha256-NGRJMMnaMNrf3FkcYwr5PcfVm5thhlNLGIeMmAK0MeE="
"x86_64-linux": "sha256-qt11SKmOjq0KU542QFbs+u7YyJicn4drCcwCdg325yk=",
"aarch64-linux": "sha256-z68doReXTrWS7HeiAjc0btIjAsvzeZZ7hXAlHr0c77Q=",
"aarch64-darwin": "sha256-PILYH1Pi8XBvSkuZ+1sNnUTao5kba+m5Z8iJKx6YXPo=",
"x86_64-darwin": "sha256-KpcJzP4m0SUavu/WaSffgzOxrHq8ljdy0GOzs9p16lo="
}
}
50 changes: 50 additions & 0 deletions packages/app/e2e/regression/prompt-input-v2-command-draft.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { expect, test } from "@playwright/test"
import { base64Encode } from "@opencode-ai/core/util/encode"
import { mockOpenCodeServer } from "../utils/mock-server"
import { expectAppVisible } from "../utils/waits"

const directory = "C:/OpenCode/PromptInputV2Editing"
const projectID = "proj_prompt_input_v2_editing"
const sessionID = "ses_prompt_input_v2_editing"

test("preserves the draft when a populated command menu triggers a built-in", async ({ page }) => {
await mockOpenCodeServer(page, {
directory,
project: {
id: projectID,
worktree: directory,
vcs: "git",
name: "prompt-input-v2-editing",
time: { created: 1700000000000, updated: 1700000000000 },
sandboxes: [],
},
provider: { all: [], connected: [], default: {} },
sessions: [
{
id: sessionID,
slug: "prompt-input-v2-editing",
projectID,
directory,
title: "Prompt input V2 editing",
version: "dev",
time: { created: 1700000000000, updated: 1700000000000 },
},
],
pageMessages: () => ({ items: [] }),
})
await page.addInitScript(() => {
localStorage.setItem("settings.v3", JSON.stringify({ general: { newLayoutDesigns: true } }))
})

await page.goto(`/${base64Encode(directory)}/session/${sessionID}`)
const composer = page.locator('[data-component="prompt-input-v2"]')
const input = composer.locator('[data-component="prompt-input"]')
await expectAppVisible(composer)

await input.fill("keep me")
await composer.getByRole("button", { name: "Add images and files" }).click()
await page.getByRole("menuitem", { name: "Commands" }).click()
await page.locator('[data-suggestion-id="model.choose"]').click()

await expect(input).toHaveText("keep me")
})
2 changes: 1 addition & 1 deletion packages/app/e2e/regression/prompt-thinking-level.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ test("shows the V2 thinking level control while relevant", async ({ page }) => {
await page.goto(`/${base64Encode(directory)}/session/${sessionID}`)
const composer = page.locator('[data-component="prompt-input-v2"]')
const input = composer.locator('[data-component="prompt-input"]')
const control = composer.locator('button[title="Choose model variant"]')
const control = composer.getByRole("button", { name: "Choose model variant" })
await expectAppVisible(composer)

await idleComposer(page)
Expand Down
4 changes: 2 additions & 2 deletions packages/app/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/app",
"version": "1.18.3",
"version": "1.18.4",
"description": "",
"type": "module",
"exports": {
Expand Down Expand Up @@ -81,7 +81,7 @@
"diff": "catalog:",
"effect": "catalog:",
"fuzzysort": "catalog:",
"ghostty-web": "github:anomalyco/ghostty-web#513463a6f1190253057e8a3f0dac8f6ee8393553",
"ghostty-web": "github:anomalyco/ghostty-web#83c0a07b8628b748aed073b232cb4b52a6ca11c1",
"luxon": "catalog:",
"marked": "catalog:",
"marked-shiki": "catalog:",
Expand Down
8 changes: 8 additions & 0 deletions packages/app/src/addons/serialize.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,14 @@ function writeAndWait(term: Terminal, data: string): Promise<void> {
}

describe("SerializeAddon", () => {
test("preserves color scheme reporting mode", async () => {
const { term, addon } = createTerminal()
await writeAndWait(term, "\x1b[?2031h")

expect(addon.serialize().startsWith("\x1b[?2031h")).toBe(true)
expect(addon.serialize({ excludeModes: true }).startsWith("\x1b[?2031h")).toBe(false)
})

describe("ANSI color preservation", () => {
test("should preserve text attributes (bold, italic, underline)", async () => {
const { term, addon } = createTerminal()
Expand Down
10 changes: 9 additions & 1 deletion packages/app/src/addons/serialize.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,13 @@ const getTerminalBuffers = (value: ITerminalCore): TerminalBuffers | undefined =
return { active, normal, alternate }
}

const getTerminalMode = (value: ITerminalCore, mode: number) => {
if (!isRecord(value)) return false
const terminal = value.wasmTerm
if (!isRecord(terminal) || typeof terminal.getMode !== "function") return false
return terminal.getMode(mode) === true
}

// ============================================================================
// Types
// ============================================================================
Expand Down Expand Up @@ -544,7 +551,8 @@ export class SerializeAddon implements ITerminalAddon {
return ""
}

let content = options?.range
let content = !options?.excludeModes && getTerminalMode(this._terminal, 2031) ? "\u001b[?2031h" : ""
content += options?.range
? this._serializeBufferByRange(normalBuffer, options.range, true)
: this._serializeBufferByScrollback(normalBuffer, options?.scrollback)

Expand Down
Loading
Loading