Files
open-design/apps
SidandGitHub 63a9a08b83 fix(daemon): prefer opencode-cli over opencode binary so OpenCode Desktop installs resolve to the CLI (#814) (#818)
OpenCode Desktop ships two binaries on PATH after install:

  - `opencode`     — GUI launcher; double-clicking it opens the
                     desktop app, never reads stdin.
  - `opencode-cli` — headless CLI; speaks the
                     `run --format json --dangerously-skip-permissions -`
                     protocol the daemon expects.

The OpenCode AGENT_DEF set `bin: 'opencode'`, so
`resolveAgentExecutable` resolved the GUI launcher for every user
with the desktop install. The daemon happily spawned that binary,
but the GUI launcher discards stdin and never emits the JSON event
stream — so the agent silently produced no output for the entire
conversation. Issue #814 tracks the user-visible symptom.

Fix: declare `bin: 'opencode-cli'` and `fallbackBins: ['opencode']`
on the OpenCode adapter. `resolveAgentExecutable` walks `bin`
first, then each fallback in order, so this gives us:

  - Desktop install (both binaries on PATH) → resolves
    `opencode-cli` (the CLI), GUI is ignored. The #814 fix path.
  - Legacy CLI-only install (only `opencode` on PATH, no
    `-cli` suffix) → falls through to `opencode`, which is the
    actual CLI in that install shape, so the daemon keeps working
    unchanged.
  - Neither installed → falls through to null, same as before.

Same mechanism Claude Code uses to fall back to `openclaude`
(issue #235), so this is well-trodden ground in the codebase.

Tests:
- One declarative test asserts `opencode.bin === 'opencode-cli'`
  and `opencode.fallbackBins.includes('opencode')` — runs on every
  platform including Windows, catches anyone who accidentally
  flips `bin` back to the GUI name.
- Two filesystem-backed tests pin the resolution priority: when
  both binaries are on PATH (the desktop case) `opencode-cli`
  wins; when only the legacy `opencode` is on PATH the fallback
  takes over.
- Existing comment guarding "most agents have a single binary"
  updated to remove `opencode` from the example list.

Verified locally:
- daemon vitest: 993/993
- daemon `tsc -p tsconfig.json` and `tsc -p tsconfig.tests.json`: both clean
- i18n-check passes

Reported by @giuliastro, diagnosed by @lefarcen who also asked for
the `opencode-cli --version` output in the issue thread — happy to
narrow this further if their reply turns up subcommand differences
between the two binaries.

Fixes #814
2026-05-09 22:11:46 +08:00
..