Skip to content

oh-my-openagent

v4.9.0 Breaking

This release includes 4 breaking changes for platform teams planning a safe upgrade.

Published 1mo AI Coding Tools
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

ai ai-agents anthropic chatgpt claude claude-skills
+9 more
codex cursor gemini ide openai opencode orchestration tui typescript

Affected surfaces

auth breaking_upgrade

Summary

AI summary

Broad release touches Commit Summary, publish, omo-codex, and lsp-daemon.

Full changelog

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 unreachable result (it auto-starts on demand and retries next request) instead of a transparent in-process fallback.
  • multi_agent_v2 is 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 writes enabled=false and annotates your config.toml. Opt out with LAZYCODEX_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 old gpt-5.5-codex-spark didn't exist). Summaries now reproduce values verbatim and no longer mask secrets.
  • Removed: keyword-detector search/analyze modes and the anthropic-effort max-effort hook. "search"/"analyze" are no longer valid keyword_detector.disabled_keywords, and "anthropic-effort" is no longer a valid disabled_hooks value.
  • experimental.aggressive_truncation is 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

  • 8057508f3 fix(omo-codex): emit forward-slash hook target paths in assert error
  • cd10059c5 ci(publish): build vendored lsp-daemon before test and codex-compat gates
  • 200c4484a docs(agents-md): drop thinking-block-validator from the hook inventories
  • 9a16b54e4 fix(omo-opencode): remove thinking block validator hook
  • 9f426b823 fix(background-agent): stop duplicate parent-wake replies forking turns
  • 8e7bedb3e docs(agents): mandate opencode-qa + isolated codex install QA with .omo/evidence on every harness-connected change
  • 03fc47f7c fix(publish): exclude plugin node_modules from the main npm tarballs
  • 56803fd5d test(codex): register the install-hook-targets suite in test:codex
  • 8a921413a fix(script): add windows-x64-baseline to the local publish platform list
  • a18477cf6 fix(publish): keep .ulw and .claude out of the marketplace sync
  • cadd22d2b fix(doctor): print the real failure stack instead of blaming memory pressure
  • f6460844c feat(install-codex): port the node CLI fallback into the TS runtime wrapper
  • c975c30ac fix(test): inject which/spawn into getGhCliInfo instead of leaking module mocks
  • b2f6bcdba refactor(keyword-detector): remove search and analyze modes
  • 34ed496eb refactor(omo-codex): compress hephaestus bundled rule with canonical-echo emphasis
  • 06cc15d11 feat(skills): rewrite ultraresearch for ulw coexistence with a contract test
  • 6193e143e docs(agents-md): refresh knowledge base for src to packages/omo-opencode move
  • b7d8503f3 refactor(omo-codex): make librarian/explorer prompts model-neutral
  • 6bb284503 fix(runtime): guard node CLI from Bun globals
  • 96ad1974c feat(omo-codex): expose spawn_agent agent_type so installed role TOMLs are selectable
  • bfcef21fe test(omo-opencode): rename atlas prompt test to match surviving runtime-injection content
  • 5df93bf17 test(omo-codex): remove prose-pinning skill and directive tests
  • 6e47aa9b1 test(omo-opencode): remove diff-guarding prompt and byte-pinning tests
  • 3903af96e fix(runtime): bundle jsonc-parser into the node CLI instead of leaving it external
  • bae3b6863 feat(runtime): fall back to a node-target CLI when bun is unavailable
  • b4c96895c fix(publish): build Codex plugin components before any plugin-shipping package packs
  • 5dafddb9d fix(git-bash-mcp): reject WSL launchers, forward env override, expose probe trail
  • 9ef62aa72 fix(ulw-loop): dispatch direct subcommands after wrapper prefix strip
  • d28d39ce9 fix(prometheus): carve trivial intent out of fable delegated-discovery mandate
  • a4585b5d3 feat(prometheus): add per-model Claude prompt variants for opus 4.6/4.7/4.8 and fable 5
  • c34b80c32 feat(model-core): add isClaudeOpus46Model family detector
  • 40c9339a0 docs: point contributor docs at packages/omo-opencode/src
  • b631b3d30 test(publish): model the previous payload fixture without lsp references
  • 1708f7a24 fix(lsp-daemon): stamp dist/package.json so cached copies resolve the real version
  • 121d7fe1d test(lsp-daemon): pin daemon version resolution from a dist-only layout
  • 64a145086 chore(omo-opencode): declare externally-imported runtime dependencies
  • 309363235 fix(publish): regenerate bun.lock in the release version bump commit
  • 238ed7061 fix(omo-codex): resolve bundled lsp runtimes from the installed plugin cache
  • 456ac4aa8 test(publish): expect the version bump to regenerate and commit bun.lock
  • 84844fa6f test(omo-codex): pin lsp prebuild resolution across repo and installed-cache layouts
  • c90290c36 fix(lsp-daemon): retry tool calls only when the request was never written
  • 9f707f235 fix(publish): reconstruct previous LazyCodex payloads without the bundled lsp-daemon dist
  • a265101e9 fix(omo-codex): make the multi_agent_v2 guard tolerate inline TOML comments
  • 8cdec35d2 test(doctor): pin the findPackageJsonUp fallback skipping the interim workspace manifest
  • fc471e57d fix(config): allow disabling debugging/visual-qa and honor disabled_commands for skill commands
  • 1431848a5 test(lsp-daemon): pin single execution when a written request times out or drops
  • 2ff173411 test(config): pin disabling debugging/visual-qa skills and skill-backed command removal
  • 2093edd68 test(omo-codex): pin comment-tolerant multi_agent_v2 guard corruption cases
  • 99904dbe2 test(publish): expect previous-payload reconstruction to tolerate missing bundled dists
  • 02eb8b84d feat(omo-codex): notify restart after background auto-update
  • 721c45071 fix(sparkshell): default to the real gpt-5.3-codex-spark and stop redacting output
  • 290e92c50 feat(sparkshell): summarize oversized output with the spark model
  • e2e896bb5 @Eric-GoodBoy-Tech has signed the CLA in code-yeongyu/oh-my-openagent#5159
  • 50c4fb5cb @Feintt has signed the CLA in code-yeongyu/oh-my-openagent#5157
  • 2dc892059 @ShutovKS has signed the CLA in code-yeongyu/oh-my-openagent#5154
  • 1db8101eb @panudetjt has signed the CLA in code-yeongyu/oh-my-openagent#5151
  • c996c969f @vboufleur has signed the CLA in code-yeongyu/oh-my-openagent#5148
  • 4d0829e12 test(ci): pin a dedicated CI gate for the vendored lsp-daemon suite
  • 7b976513e docs(reference): document config-migration, sparkshell, and LSP-decision env switches
  • 39ad3a5d2 feat(omo-codex): annotate the managed multi_agent_v2 section in config.toml
  • eb08ea7cb test(omo-codex): pin managed-comment annotation on the multi_agent_v2 guard
  • 44a5de4d3 fix(codex-lsp): stop caching daemon outages as unavailable extensions
  • 3003e36cc test(codex-lsp): pin daemon-outage retry instead of per-session unavailable caching
  • c8ba28a0b fix(publish): ship packages/lsp-daemon in the lazycodex-ai tarball
  • e95075f7d test(publish): expect packages/lsp-daemon in the lazycodex-ai files allowlist
  • 743ebc7a0 Merge pull request #5080 from MoerAI/fix/context-limit-ga1m-opus-4-8
  • 165b534a3 Merge pull request #4412 from PeterPonyu/fix/team-tmux-rollback-pane-cleanup
  • f8709f895 Merge pull request #5032 from Nigmat-future/fix/runtime-skills-node-http-fallback
  • 6f4aa197c Merge remote-tracking branch 'origin/dev' into dev
  • 49c6b434d feat(commands): register builtin skills as opencode slash commands
  • b565be418 Merge pull request #5121 from code-yeongyu/worktree-deslop-packages
  • 6628c432f test(omo-opencode): extend cross-instance zod test timeout for slow CI runners
  • 4a2888d9c chore(omo-codex): drop stale planning clause from module comment
  • 58cffa690 refactor(ast-grep-mcp): simplify best-effort lifecycle-log catches
  • 15f80cb02 test(omo-opencode): replace any with precise types across test mocks
  • b1803e327 refactor(omo-opencode): extract cohesive units and collapse duplicated blocks
  • d12dadf3c fix(omo-opencode): type client params and session callbacks instead of any
  • 6d37a6575 feat(skills): sharpen ulw-plan interview with option-first questions
  • 92c4affb2 feat(skills): lock start-work into orchestrator-only delegation
  • 13dcb1f85 Merge remote-tracking branch 'origin/dev' into dev
  • f3cc10fc7 fix(omo-codex): gate git_bash mcp on availability
  • 409df2ca7 @regulusleow has signed the CLA in code-yeongyu/oh-my-openagent#5119
  • fcdad9fcb feat(sparkshell): condense oversized output with session-goal-aware preservation
  • 8e8e60c45 feat(prompts): scale ulw/start-work verification by fact-based tier triage
  • d4ef0fa35 @DevEstacion has signed the CLA in code-yeongyu/oh-my-openagent#5118
  • 0cf3643dc test(skills): expect lsp-setup in the synced aggregate Codex skills
  • a72e7f1ac feat(sparkshell): append codex session context to command output
  • 9339faafd Protect caller tmux windows during team rollback
  • 976be43eb fix(runtime-skills): support node http source server
  • be9494587 fix(model-core): recognize claude-opus-4-8 as GA 1M-context model (fixes #5070)
  • 5173b917c fix(codex-rules): only inject sparkshell guidance when omo is resolvable
  • 76b01e6c3 fix(install-codex): resolve bun via fallback paths in the omo runtime wrapper
  • 560d58432 feat(doctor): flag a missing omo runtime command as a Codex error
  • ff00c5883 ci(publish): smoke-test the real lazycodex-ai install and omo runtime bin
  • f8c5f05d3 fix(install-codex): warn loudly when the omo runtime wrapper target is missing
  • 2ac27100b fix(publish): ship root dist/cli in lazycodex-ai tarball
  • a6e6acf0d Merge pull request #5077 from code-yeongyu/move-src-to-omo-opencode
  • d26a29f4a fix(test): un-skip idle stdio timer test; keep event loop ref'd while awaiting
  • a0f8e7ca8 fix(test): skip idle stdio timer test on win32; cap test job at 30min
  • 01717a299 fix(test): stop leaking spawn-with-windows-hide module mocks across files
  • 3ac3a8414 fix(test): exclude vendored lsp-daemon from root bun test
  • f7e8221a9 refactor(omo-opencode): move plugin src into packages/omo-opencode
  • 9a0ac30ef refactor(test): sentinel-based repo-root discovery in audit/root tests
  • 615b4916d fix(install-codex): raise findRepoRoot ancestor cap 5→7 for deeper package nesting
  • 321309a40 Merge pull request #5115 from code-yeongyu/feature/lsp-daemon-overhaul
  • 9f9fed508 fix(skills): detect plain Dockerfile/Containerfile in lsp-setup detect script
  • daf188a84 fix(lsp): gate daemon source candidate on built engine dist, forward install-decisions env
  • 441962b32 feat(skills): add lsp-setup skill with per-language references and scripts
  • c094d5fdb feat(lsp-tools-mcp): resolve plain Dockerfile/Containerfile to the dockerfile server
  • 64b88fde7 refactor(lsp): route all MCP surfaces through the daemon, drop in-process fallback
  • dd3170b33 feat(lsp-tools-mcp): ask-user install prompt with persisted decline state
  • 48ff98fb1 Merge pull request #5114 from code-yeongyu/fix/parent-wake-noreply-liveness
  • e330f43aa feat(lsp-tools-mcp): add julials and razor builtin servers
  • 0c9e82079 fix(background-agent): preserve reply liveness after noReply parent wake admission
  • d43627403 feat(lazycodex): lcx-doctor skill + always-fresh /tmp source checkouts
  • 0f62d150e Merge pull request #5111: align LazyCodex publish workflow test with stable-release sync gate
  • 6fba05c41 test(publish): align LazyCodex workflow test with stable-release sync gate
  • 3c8eb3085 Merge pull request #5108: codex-rules post-compact read directive + per-event injection budgets
  • 0740aef97 feat(codex-rules): post-compact read directive + per-event injection budgets
  • d5909166f docs(lazycodex): cite openai/codex#26753 as basis for multi_agent_v2 force-disable
  • c8fc5edbb feat(lazycodex): force-disable multi_agent_v2 on every Codex session start
  • 97bcdb494 feat(agents): add Opus 4.8 and Fable 5 Sisyphus prompts; bound 4.7 over-exploration
  • f1ac07d58 ci(publish): always sync Codex marketplace on stable releases
  • 8cecb2ecd build(codex): derive every plugin version from a single source
  • 9e8c6362e fix(doctor): coherent Codex version reporting
  • 3538003f0 fix(lazycodex): reset OMO_INVOCATION_NAME when delegating omo commands
  • 64acd646f @jaepo01 has signed the CLA in code-yeongyu/oh-my-openagent#5066
  • 0b7915440 @Deftera186 has signed the CLA in code-yeongyu/oh-my-openagent#5085
  • 1d12c0e57 Merge pull request #5076: shared per-user LSP daemon
  • 7ba5605cf @MathiasDeWeerdt has signed the CLA in code-yeongyu/oh-my-openagent#5078
  • 37d179065 fix(lsp-daemon): never let a failed tool call crash the stdio proxy
  • 8d88f252a fix(lsp-daemon): reaper probes the daemon's recorded endpoint, not daemon.sock
  • 319dddd3f fix(lsp-tools-mcp): resolve user paths against the request-context cwd
  • 9446729f6 Merge pull request #5053 from Hungdoan565/codex/fix-4708-copilot-gpt54-variants
  • a676083d3 Merge pull request #5052 from Hungdoan565/codex/fix-4700-zwsp-atlas-continuation
  • 2aff9ab6d Merge pull request #5051 from Hungdoan565/codex/fix-5035-openai-only-mixed-providers
  • 429b1a048 Merge pull request #5064 from MoerAI/fix/session-manager-sdk-transient-retry
  • d82544aa7 Merge pull request #4641 from MoerAI/fix/aggressive-truncation-respect-experimental-flag
  • 00a39ad1e Merge pull request #4602 from MoerAI/fix/handoff-first-user-request-from-session-read
  • ba7bb1510 fix(lsp-daemon): use a named pipe for the socket on Windows
  • 4fcc7f0b8 harden(lsp-daemon): socket-confirm before reaping; tighter readiness timeout
  • 022b99aa9 ci(publish): build lsp-daemon before npm publish and lazycodex sync
  • 03c56d932 build(install): bundle and reap the lsp-daemon across distribution paths
  • ec4a6e32a build(lsp-daemon): ship a self-contained bundle; route disposal through it
  • 25935f13f feat(codex-lsp): route hook and lsp MCP through the shared daemon
  • 71c9115d5 feat(lsp-daemon): stdio proxy, daemon runner, cli, and public barrel
  • d0a59246c feat(lsp-daemon): daemon server + tool client with in-process fallback
  • 2f33a2bbf feat(lsp-daemon): connect-or-spawn with lock, stale cleanup, readiness poll
  • ad9b393f1 build(lsp-daemon): track package-lock for reproducible bundling
  • 4b6559d5e feat(lsp-daemon): scaffold package with paths, framing, and lock
  • 0481ddc18 feat(lsp-tools-mcp): add request-context ALS for per-request cwd/env
  • 2677087be refactor(hooks): remove anthropic-effort max-effort forcing hook
  • bb24fdfdf fix(codex): refresh generated skill compatibility guidance
  • cba70acce fix(lockfile): sync platform optional dependencies
  • bd7a883db refactor(omo-codex): migrate multiagent v2 tool references to v1 API
  • d984ccd5b fix(session-manager): retry transient SDK failures before file fallback (fixes #4622)
  • 8f3eeba58 test(model-core): cover Copilot GPT max variant cap
  • 73a157fb4 fix(cli): sanitize generated fallback settings
  • 18daffd9d test(cli): cover Copilot GPT fallback variants
  • 0a98967fe fix(model-core): cap Copilot GPT variants
  • 3253bbf67 test(model-core): cover Copilot GPT variant caps
  • 6febf3396 fix(todo-continuation): preserve registered Atlas alias
  • 7c58b81b5 test(todo-continuation): cover ZWSP Atlas registry alias
  • 55b806d37 fix(cli): reuse OpenAI-only provider warning predicate
  • 7ed1da7ea test(cli): cover ChatGPT-only mixed providers
  • e8e486f98 fix(cli): exclude fallback providers from OpenAI-only catalog
  • b7e18f6c4 test(cli): cover OpenAI-only mixed providers
  • d8a14816c fix(anthropic-context-window-limit-recovery): honor experimental.aggressive_truncation flag in executor (fixes #3899)
  • 6ede73356 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

Breaking Changes

  • LSP no longer runs language servers in‑process; it now proxies to a shared per‑user daemon, returning `LSP daemon unreachable` on failure.
  • `multi_agent_v2` is force‑disabled on every Codex session start and config migration writes `enabled=false`.
  • Removed keyword‑detector `search`/`analyze` modes and the `anthropic-effort` max‑effort hook.
  • `experimental.aggressive_truncation` flag now gates behavior instead of being always‑on.

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track oh-my-openagent

Get notified when new releases ship.

Sign up free

About oh-my-openagent

omo; the best agent harness - previously oh-my-opencode

All releases →

Related context

Earlier breaking changes

  • v4.19.0 Removes legacy Ralph Loop wiring; introduces Goal feature with automatic config migration.
  • v4.6.0 Removed broken direct public binary entrypoints from platform launcher packages, keeping them internal.
  • v4.6.0 Removed legacy context-window monitor hook path from active hooks and config surfaces.
  • v4.4.0 Removes top‑level `lsp` config key; migration required to `.opencode/lsp.json`.

Beta — feedback welcome: [email protected]