oh-my-opencode v4.9.0
This release introduces a shared per-user LSP daemon, a Node CLI runtime fallback so omo runs on bun-less hosts, and a hardened Codex / LazyCodex distribution — plus sparkshell output summarization and per-model prompt variants for Claude Opus 4.6/4.7/4.8 and Fable 5.
⚠️ Read the behavior changes below before upgrading — a few defaults changed silently.
⚠️ Breaking & behavior changes
- LSP no longer runs language servers in-process. The LSP MCP server is now a thin proxy to the shared daemon. If the daemon is unreachable (after one retry) you get a structured
LSP daemon unreachableresult (it auto-starts on demand and retries next request) instead of a transparent in-process fallback. multi_agent_v2is force-disabled on every Codex session start. With it on, every Codex turn fails HTTP 400 (openai/codex#26753). The config-migration guard now always writesenabled=falseand annotates yourconfig.toml. Opt out withLAZYCODEX_CONFIG_MIGRATION_DISABLED=1.- Sparkshell spark summaries: default model fixed and secret redaction removed. The default is now the real
gpt-5.3-codex-spark(the oldgpt-5.5-codex-sparkdidn't exist). Summaries now reproduce values verbatim and no longer mask secrets. - Removed: keyword-detector
search/analyzemodes and theanthropic-effortmax-effort hook."search"/"analyze"are no longer validkeyword_detector.disabled_keywords, and"anthropic-effort"is no longer a validdisabled_hooksvalue. experimental.aggressive_truncationis now honored (previously always-on); it now gates on the flag and otherwise summarizes (#3899).
🧠 Shared per-user LSP daemon
A new vendored @code-yeongyu/lsp-daemon owns one set of language servers per directory across all sessions — a server warmed by one session is reused by the next, accessed over a unix socket (named pipe on Windows) via a thin stdio MCP proxy. Per-request cwd/env is threaded through every path resolution so multi-session use resolves diagnostics against the right directory. A failed tool call can no longer crash the long-lived proxy, retries never double-execute a request, transient outages no longer poison the per-session availability cache, and the Codex installer reaps stale daemons on update so the freshly-installed version always takes effect.
🧰 New lsp-setup skill
A guided detect → install → configure → verify flow for 20+ language servers, with per-language references (per-OS install commands, config snippets, troubleshooting), a recursive project scanner, and a real diagnostics-roundtrip verifier. New builtin servers: Julia (julials) and Razor; extensionless Dockerfile/Containerfile now resolve to the dockerfile server.
🟢 Node CLI runtime fallback
omo no longer hard-requires Bun. Hosts that can't run any Bun build (x86_64-v1 CPUs, qemu64-masked VPS guests that crash Bun with SIGILL) now fall back to a packaged Node CLI. Force it with OMO_RUNTIME=node; a SIGILL crash now explains the missing CPU instruction set before falling back; and doctor/run work under Node. The generated Codex wrapper also resolves Bun via fallback paths (~/.bun/bin, Homebrew, /usr/local/bin) for desktop-app shells with a stripped PATH.
🤖 Codex / LazyCodex distribution
Fixes a 4.8.0/4.8.1 regression that silently deleted users' omo bin on update (the root CLI dist was missing from the published payload). Installed agent role TOMLs (explorer, librarian, plan, momus, metis) are selectable again, all orchestration guidance migrated to the multi_agent_v1 API, delegated commands no longer recurse infinitely, plugin metadata is version-stamped (no more 0.1.0 leaking to the marketplace), and a new lcx-doctor skill diagnoses install health against always-fresh upstream sources.
✨ Sparkshell output summarization
Oversized command output (logs, big diffs) is now condensed before it floods an agent's context: the spark model summarizes first (reproducing kept lines verbatim, always preserving errors/warnings), with a deterministic signal-preserving fallback. Sparkshell also attaches the Codex session context (workspace, role, first/latest requests) so summaries stay goal-aware. Tunable via OMO_SPARKSHELL_CONDENSE, OMO_SPARKSHELL_CONDENSE_BUDGET, OMO_SPARKSHELL_SESSION_CONTEXT, and the OMO_SPARKSHELL_SPARK_* family.
🎛️ Per-model prompts & fixes
Sisyphus and Prometheus now ship dedicated prompt variants for Claude Opus 4.6/4.7/4.8 and the new Fable 5 tier (4.7 over-exploration is bounded; Fable gets a delegated-discovery mandate). claude-opus-4-8 is now recognized as a GA 1M-context model out of the box (#5070) — you can drop ANTHROPIC_1M_CONTEXT=true. Also: session_read retries transient SDK failures before falling back (#4622), /handoff binds the first user request from session_read output instead of memory (#4592), Copilot GPT-5 reasoning variants are capped to the supported set, and reply-required background-agent wakes survive noReply admissions so a parent is never stranded after its background work completes.
Minor Compatibility and Stability Release
This release carries compatibility-facing behavior changes and operational hardening. Read the summary below before upgrading or publishing.
- Rename transition updates across package detection, plugin/config compatibility, and install surfaces.
- Task and tool behavior updates, including delegate-task contract and runtime registration behavior.
- Task-system default behavior alignment so omitted configuration behaves consistently across runtime paths.
- Install and publish workflow hardening, including safer release sequencing and package/install fixes.
Commit Summary
- 8057508 fix(omo-codex): emit forward-slash hook target paths in assert error
- cd10059 ci(publish): build vendored lsp-daemon before test and codex-compat gates
- 200c448 docs(agents-md): drop thinking-block-validator from the hook inventories
- 9a16b54 fix(omo-opencode): remove thinking block validator hook
- 9f426b8 fix(background-agent): stop duplicate parent-wake replies forking turns
- 8e7bedb docs(agents): mandate opencode-qa + isolated codex install QA with .omo/evidence on every harness-connected change
- 03fc47f fix(publish): exclude plugin node_modules from the main npm tarballs
- 56803fd test(codex): register the install-hook-targets suite in test:codex
- 8a92141 fix(script): add windows-x64-baseline to the local publish platform list
- a18477c fix(publish): keep .ulw and .claude out of the marketplace sync
- cadd22d fix(doctor): print the real failure stack instead of blaming memory pressure
- f646084 feat(install-codex): port the node CLI fallback into the TS runtime wrapper
- c975c30 fix(test): inject which/spawn into getGhCliInfo instead of leaking module mocks
- b2f6bcd refactor(keyword-detector): remove search and analyze modes
- 34ed496 refactor(omo-codex): compress hephaestus bundled rule with canonical-echo emphasis
- 06cc15d feat(skills): rewrite ultraresearch for ulw coexistence with a contract test
- 6193e14 docs(agents-md): refresh knowledge base for src to packages/omo-opencode move
- b7d8503 refactor(omo-codex): make librarian/explorer prompts model-neutral
- 6bb2845 fix(runtime): guard node CLI from Bun globals
- 96ad197 feat(omo-codex): expose spawn_agent agent_type so installed role TOMLs are selectable
- bfcef21 test(omo-opencode): rename atlas prompt test to match surviving runtime-injection content
- 5df93bf test(omo-codex): remove prose-pinning skill and directive tests
- 6e47aa9 test(omo-opencode): remove diff-guarding prompt and byte-pinning tests
- 3903af9 fix(runtime): bundle jsonc-parser into the node CLI instead of leaving it external
- bae3b68 feat(runtime): fall back to a node-target CLI when bun is unavailable
- b4c9689 fix(publish): build Codex plugin components before any plugin-shipping package packs
- 5dafddb fix(git-bash-mcp): reject WSL launchers, forward env override, expose probe trail
- 9ef62aa fix(ulw-loop): dispatch direct subcommands after wrapper prefix strip
- d28d39c fix(prometheus): carve trivial intent out of fable delegated-discovery mandate
- a4585b5 feat(prometheus): add per-model Claude prompt variants for opus 4.6/4.7/4.8 and fable 5
- c34b80c feat(model-core): add isClaudeOpus46Model family detector
- 40c9339 docs: point contributor docs at packages/omo-opencode/src
- b631b3d test(publish): model the previous payload fixture without lsp references
- 1708f7a fix(lsp-daemon): stamp dist/package.json so cached copies resolve the real version
- 121d7fe test(lsp-daemon): pin daemon version resolution from a dist-only layout
- 64a1450 chore(omo-opencode): declare externally-imported runtime dependencies
- 3093632 fix(publish): regenerate bun.lock in the release version bump commit
- 238ed70 fix(omo-codex): resolve bundled lsp runtimes from the installed plugin cache
- 456ac4a test(publish): expect the version bump to regenerate and commit bun.lock
- 84844fa test(omo-codex): pin lsp prebuild resolution across repo and installed-cache layouts
- c90290c fix(lsp-daemon): retry tool calls only when the request was never written
- 9f707f2 fix(publish): reconstruct previous LazyCodex payloads without the bundled lsp-daemon dist
- a265101 fix(omo-codex): make the multi_agent_v2 guard tolerate inline TOML comments
- 8cdec35 test(doctor): pin the findPackageJsonUp fallback skipping the interim workspace manifest
- fc471e5 fix(config): allow disabling debugging/visual-qa and honor disabled_commands for skill commands
- 1431848 test(lsp-daemon): pin single execution when a written request times out or drops
- 2ff1734 test(config): pin disabling debugging/visual-qa skills and skill-backed command removal
- 2093edd test(omo-codex): pin comment-tolerant multi_agent_v2 guard corruption cases
- 99904db test(publish): expect previous-payload reconstruction to tolerate missing bundled dists
- 02eb8b8 feat(omo-codex): notify restart after background auto-update
- 721c450 fix(sparkshell): default to the real gpt-5.3-codex-spark and stop redacting output
- 290e92c feat(sparkshell): summarize oversized output with the spark model
- e2e896b @Eric-GoodBoy-Tech has signed the CLA in #5159
- 50c4fb5 @Feintt has signed the CLA in #5157
- 2dc8920 @ShutovKS has signed the CLA in #5154
- 1db8101 @panudetjt has signed the CLA in #5151
- c996c96 @vboufleur has signed the CLA in #5148
- 4d0829e test(ci): pin a dedicated CI gate for the vendored lsp-daemon suite
- 7b97651 docs(reference): document config-migration, sparkshell, and LSP-decision env switches
- 39ad3a5 feat(omo-codex): annotate the managed multi_agent_v2 section in config.toml
- eb08ea7 test(omo-codex): pin managed-comment annotation on the multi_agent_v2 guard
- 44a5de4 fix(codex-lsp): stop caching daemon outages as unavailable extensions
- 3003e36 test(codex-lsp): pin daemon-outage retry instead of per-session unavailable caching
- c8ba28a fix(publish): ship packages/lsp-daemon in the lazycodex-ai tarball
- e95075f test(publish): expect packages/lsp-daemon in the lazycodex-ai files allowlist
- 743ebc7 Merge pull request #5080 from MoerAI/fix/context-limit-ga1m-opus-4-8
- 165b534 Merge pull request #4412 from PeterPonyu/fix/team-tmux-rollback-pane-cleanup
- f8709f8 Merge pull request #5032 from Nigmat-future/fix/runtime-skills-node-http-fallback
- 6f4aa19 Merge remote-tracking branch 'origin/dev' into dev
- 49c6b43 feat(commands): register builtin skills as opencode slash commands
- b565be4 Merge pull request #5121 from code-yeongyu/worktree-deslop-packages
- 6628c43 test(omo-opencode): extend cross-instance zod test timeout for slow CI runners
- 4a2888d chore(omo-codex): drop stale planning clause from module comment
- 58cffa6 refactor(ast-grep-mcp): simplify best-effort lifecycle-log catches
- 15f80cb test(omo-opencode): replace any with precise types across test mocks
- b1803e3 refactor(omo-opencode): extract cohesive units and collapse duplicated blocks
- d12dadf fix(omo-opencode): type client params and session callbacks instead of any
- 6d37a65 feat(skills): sharpen ulw-plan interview with option-first questions
- 92c4aff feat(skills): lock start-work into orchestrator-only delegation
- 13dcb1f Merge remote-tracking branch 'origin/dev' into dev
- f3cc10f fix(omo-codex): gate git_bash mcp on availability
- 409df2c @regulusleow has signed the CLA in #5119
- fcdad9f feat(sparkshell): condense oversized output with session-goal-aware preservation
- 8e8e60c feat(prompts): scale ulw/start-work verification by fact-based tier triage
- d4ef0fa @DevEstacion has signed the CLA in #5118
- 0cf3643 test(skills): expect lsp-setup in the synced aggregate Codex skills
- a72e7f1 feat(sparkshell): append codex session context to command output
- 9339faa Protect caller tmux windows during team rollback
- 976be43 fix(runtime-skills): support node http source server
- be94945 fix(model-core): recognize claude-opus-4-8 as GA 1M-context model (fixes #5070)
- 5173b91 fix(codex-rules): only inject sparkshell guidance when omo is resolvable
- 76b01e6 fix(install-codex): resolve bun via fallback paths in the omo runtime wrapper
- 560d584 feat(doctor): flag a missing omo runtime command as a Codex error
- ff00c58 ci(publish): smoke-test the real lazycodex-ai install and omo runtime bin
- f8c5f05 fix(install-codex): warn loudly when the omo runtime wrapper target is missing
- 2ac2710 fix(publish): ship root dist/cli in lazycodex-ai tarball
- a6e6acf Merge pull request #5077 from code-yeongyu/move-src-to-omo-opencode
- d26a29f fix(test): un-skip idle stdio timer test; keep event loop ref'd while awaiting
- a0f8e7c fix(test): skip idle stdio timer test on win32; cap test job at 30min
- 01717a2 fix(test): stop leaking spawn-with-windows-hide module mocks across files
- 3ac3a84 fix(test): exclude vendored lsp-daemon from root bun test
- f7e8221 refactor(omo-opencode): move plugin src into packages/omo-opencode
- 9a0ac30 refactor(test): sentinel-based repo-root discovery in audit/root tests
- 615b491 fix(install-codex): raise findRepoRoot ancestor cap 5→7 for deeper package nesting
- 321309a Merge pull request #5115 from code-yeongyu/feature/lsp-daemon-overhaul
- 9f9fed5 fix(skills): detect plain Dockerfile/Containerfile in lsp-setup detect script
- daf188a fix(lsp): gate daemon source candidate on built engine dist, forward install-decisions env
- 441962b feat(skills): add lsp-setup skill with per-language references and scripts
- c094d5f feat(lsp-tools-mcp): resolve plain Dockerfile/Containerfile to the dockerfile server
- 64b88fd refactor(lsp): route all MCP surfaces through the daemon, drop in-process fallback
- dd3170b feat(lsp-tools-mcp): ask-user install prompt with persisted decline state
- 48ff98f Merge pull request #5114 from code-yeongyu/fix/parent-wake-noreply-liveness
- e330f43 feat(lsp-tools-mcp): add julials and razor builtin servers
- 0c9e820 fix(background-agent): preserve reply liveness after noReply parent wake admission
- d436274 feat(lazycodex): lcx-doctor skill + always-fresh /tmp source checkouts
- 0f62d15 Merge pull request #5111: align LazyCodex publish workflow test with stable-release sync gate
- 6fba05c test(publish): align LazyCodex workflow test with stable-release sync gate
- 3c8eb30 Merge pull request #5108: codex-rules post-compact read directive + per-event injection budgets
- 0740aef feat(codex-rules): post-compact read directive + per-event injection budgets
- d590916 docs(lazycodex): cite openai/codex#26753 as basis for multi_agent_v2 force-disable
- c8fc5ed feat(lazycodex): force-disable multi_agent_v2 on every Codex session start
- 97bcdb4 feat(agents): add Opus 4.8 and Fable 5 Sisyphus prompts; bound 4.7 over-exploration
- f1ac07d ci(publish): always sync Codex marketplace on stable releases
- 8cecb2e build(codex): derive every plugin version from a single source
- 9e8c636 fix(doctor): coherent Codex version reporting
- 3538003 fix(lazycodex): reset OMO_INVOCATION_NAME when delegating omo commands
- 64acd64 @jaepo01 has signed the CLA in #5066
- 0b79154 @Deftera186 has signed the CLA in #5085
- 1d12c0e Merge pull request #5076: shared per-user LSP daemon
- 7ba5605 @MathiasDeWeerdt has signed the CLA in #5078
- 37d1790 fix(lsp-daemon): never let a failed tool call crash the stdio proxy
- 8d88f25 fix(lsp-daemon): reaper probes the daemon's recorded endpoint, not daemon.sock
- 319dddd fix(lsp-tools-mcp): resolve user paths against the request-context cwd
- 9446729 Merge pull request #5053 from Hungdoan565/codex/fix-4708-copilot-gpt54-variants
- a676083 Merge pull request #5052 from Hungdoan565/codex/fix-4700-zwsp-atlas-continuation
- 2aff9ab Merge pull request #5051 from Hungdoan565/codex/fix-5035-openai-only-mixed-providers
- 429b1a0 Merge pull request #5064 from MoerAI/fix/session-manager-sdk-transient-retry
- d82544a Merge pull request #4641 from MoerAI/fix/aggressive-truncation-respect-experimental-flag
- 00a39ad Merge pull request #4602 from MoerAI/fix/handoff-first-user-request-from-session-read
- ba7bb15 fix(lsp-daemon): use a named pipe for the socket on Windows
- 4fcc7f0 harden(lsp-daemon): socket-confirm before reaping; tighter readiness timeout
- 022b99a ci(publish): build lsp-daemon before npm publish and lazycodex sync
- 03c56d9 build(install): bundle and reap the lsp-daemon across distribution paths
- ec4a6e3 build(lsp-daemon): ship a self-contained bundle; route disposal through it
- 25935f1 feat(codex-lsp): route hook and lsp MCP through the shared daemon
- 71c9115 feat(lsp-daemon): stdio proxy, daemon runner, cli, and public barrel
- d0a5924 feat(lsp-daemon): daemon server + tool client with in-process fallback
- 2f33a2b feat(lsp-daemon): connect-or-spawn with lock, stale cleanup, readiness poll
- ad9b393 build(lsp-daemon): track package-lock for reproducible bundling
- 4b6559d feat(lsp-daemon): scaffold package with paths, framing, and lock
- 0481ddc feat(lsp-tools-mcp): add request-context ALS for per-request cwd/env
- 2677087 refactor(hooks): remove anthropic-effort max-effort forcing hook
- bb24fdf fix(codex): refresh generated skill compatibility guidance
- cba70ac fix(lockfile): sync platform optional dependencies
- bd7a883 refactor(omo-codex): migrate multiagent v2 tool references to v1 API
- d984ccd fix(session-manager): retry transient SDK failures before file fallback (fixes #4622)
- 8f3eeba test(model-core): cover Copilot GPT max variant cap
- 73a157f fix(cli): sanitize generated fallback settings
- 18daffd test(cli): cover Copilot GPT fallback variants
- 0a98967 fix(model-core): cap Copilot GPT variants
- 3253bbf test(model-core): cover Copilot GPT variant caps
- 6febf33 fix(todo-continuation): preserve registered Atlas alias
- 7c58b81 test(todo-continuation): cover ZWSP Atlas registry alias
- 55b806d fix(cli): reuse OpenAI-only provider warning predicate
- 7ed1da7 test(cli): cover ChatGPT-only mixed providers
- e8e486f fix(cli): exclude fallback providers from OpenAI-only catalog
- b7e18f6 test(cli): cover OpenAI-only mixed providers
- d8a1481 fix(anthropic-context-window-limit-recovery): honor experimental.aggressive_truncation flag in executor (fixes #3899)
- 6ede733 fix(handoff): bind USER REQUESTS to session_read output instead of in-context memory (fixes #4592)
Thank you to 4 community contributors:
- @MoerAI:
- fix(handoff): bind USER REQUESTS to session_read output instead of in-context memory (fixes #4592)
- fix(anthropic-context-window-limit-recovery): honor experimental.aggressive_truncation flag in executor (fixes #3899)
- fix(session-manager): retry transient SDK failures before file fallback (fixes #4622)
- Merge pull request #4602 from MoerAI/fix/handoff-first-user-request-from-session-read
- Merge pull request #4641 from MoerAI/fix/aggressive-truncation-respect-experimental-flag
- Merge pull request #5064 from MoerAI/fix/session-manager-sdk-transient-retry
- Merge pull request #5051 from Hungdoan565/codex/fix-5035-openai-only-mixed-providers
- Merge pull request #5052 from Hungdoan565/codex/fix-4700-zwsp-atlas-continuation
- Merge pull request #5053 from Hungdoan565/codex/fix-4708-copilot-gpt54-variants
- fix(model-core): recognize claude-opus-4-8 as GA 1M-context model (fixes #5070)
- @Hungdoan565:
- test(cli): cover OpenAI-only mixed providers
- fix(cli): exclude fallback providers from OpenAI-only catalog
- test(cli): cover ChatGPT-only mixed providers
- fix(cli): reuse OpenAI-only provider warning predicate
- test(todo-continuation): cover ZWSP Atlas registry alias
- fix(todo-continuation): preserve registered Atlas alias
- test(model-core): cover Copilot GPT variant caps
- fix(model-core): cap Copilot GPT variants
- test(cli): cover Copilot GPT fallback variants
- fix(cli): sanitize generated fallback settings
- test(model-core): cover Copilot GPT max variant cap
- @Nigmat-future:
- fix(runtime-skills): support node http source server
- @PeterPonyu:
- Protect caller tmux windows during team rollback