github code-yeongyu/oh-my-openagent v5.0.0-beta.22

pre-release3 hours ago

OmO 5.0.0-beta.22 Release Summary

This release rides on Senpi 2026.8.26-2 and focuses on process lifecycle correctness: the launcher no longer orphans engines, omo doctor can find and clean up the orphans older versions left behind, broken installs fail fast with a real diagnosis, and DAG runs survive session restarts instead of getting stuck. It also reworks the default model fallback lanes and fixes home-directory config watching.

Launcher and engine lifecycle (omo-native)

Signal forwarding: no more orphaned engines

Previously, both launcher layers (node bin/omo.js -> engine, plus the bun re-exec in between) blocked in spawnSync, where no JavaScript handler can run. A SIGTERM killed the launcher on the spot and left the engine reparented to pid 1, still holding your terminal. Those orphans later showed up as stdin EIO crashes and engine processes lingering for days.

Both layers now spawn asynchronously and:

  • forward SIGTERM and SIGHUP to the engine
  • give it a bounded grace window to shut down cleanly (10s, tunable via OMO_SIGNAL_GRACE_MS)
  • re-raise the signal on themselves if the child ignores it, so supervisors still see the death they asked for

SIGINT (Ctrl-C) is deliberately not forwarded, since the terminal already delivers it to the whole foreground process group; the launcher just stops dying underneath the engine. Exit codes and signal-death status pass through unchanged. Windows installs no signal handlers.

omo doctor finds and reaps stale engines

omo doctor now lists interactive engine processes that earlier launcher versions orphaned (reparented to pid 1), with pid, age, and tty. Cleanup is explicit and per-pid:

omo doctor --reap <pid> [pid...]

It re-checks the live process table and refuses any pid that isn't an orphaned interactive engine at that moment (live sessions, rpc/app-server engines, or non-engine processes are never touched). There's no pattern-matching kill.

Corrupt install diagnosis at launch

A field report on Windows showed npm dying mid-install with EBUSY (a running engine locks native modules), leaving a tree with senpi's dist/cli.js intact but core modules missing. Launch then crashed with a raw ERR_MODULE_NOT_FOUND stack. The launcher preflight now verifies the brand contract module next to the CLI and, on a partial tree, fails fast with one actionable line: the missing file, the interrupted-upgrade diagnosis, and the reinstall command. On Windows it additionally explains that running omo/senpi processes cause exactly this partial state.

Senpi 2026.8.26-2 and the config-watch fix

The pinned engine moves from 2026.8.26 to 2026.8.26-2 across the root workspace, omo-ai launcher, adapter, and task engine, aligned with the config-watch compatibility work (issue #7064, tracked by this worktree).

Senpi's config-reload host rejects watch registrations that cover protected agent-dir paths (auth.json, sessions/, logs/) unless root-anchored filter globs prove each watched path avoids them. OmO previously dropped any target whose path merely contained a protected path, which silently killed home-directory config watching. The filter now inspects the target's globs: targets whose root-anchored globs provably avoid the protected paths are kept, so ~/.omo/omo.jsonc changes are picked up live again, while unsafe targets are still never emitted. The user-config creation watch also derives its glob set from the actual config directory name instead of a hardcoded /omo.

DAG: detached waits and restart recovery

  • Wait detaches by default. A model-facing dag wait used to hold the tool call open until the run settled, freezing the session turn for the whole run (38+ minutes observed in the wild). It now returns immediately with a detached envelope and a live snapshot; node completions and the terminal run wake still reach the session through the idle coordinator. Pass detach: false to restore blocking. The eval SDK and dag library keep blocking semantics internally, and an already-terminal run still returns its final result at once.
  • Orphaned runs get adopted. A paused run whose parent session id never returns (fork, compaction, restart under a new id) was skipped forever as foreign. Recovery now adopts a run when there's proof of abandonment: the lease holder is this process or a dead pid. Live foreign holders and absent-holder records stay untouched. Adopted runs are fully re-homed (parent and root) and the resume is journaled.
  • Bridge attaches after recovery. The RPC bridge used to attach before paused runs resumed, so its first omo.dag.updated snapshot showed stale paused state and downstream consumers flipped threads to Ready while children kept working. The first pushed snapshot is now the recovered one.
  • Status UI rows and formatting were updated alongside the detach work.

Model and fallback policy

  • The unspecified-high chain is rebuilt opus-first: claude-opus-5 xhigh -> glm-5.3 max -> kimi-k3 max (previously kimi-k3-led). The category default follows the new head on both harnesses.
  • The vercel provider leaves every builtin fallback lane; vercel-only registries fall through to the pinned system default, and the vercel-only minimax-m2.7-highspeed rung is dropped from explore/librarian.
  • quotio-openai is purged from chain sources; every rung listing openai now also carries openai-codex.
  • Telemetry vocabulary drops the quotio-openai key and gains glm-5.3 for zai-coding-plan/opencode-go; the bundled capabilities snapshot gains the bare glm-5.3 entry.
  • The dead-chain category alert (all providers of one builtin category unconnected) is now an info-level notice instead of a yellow warning, since every other category remains usable. Suppression config and once-per-session dedup are unchanged.

If your setup depended on the vercel or quotio-openai default lanes, configure those providers explicitly.

Skills and ulw-loop CLI

  • omo-agent-toolkit ulw-loop help (and bare help/--help/no-args) now prints real subcommand help instead of a self-referential pointer or an unknown-component error; each subcommand answers --help/-h.
  • The ulw-loop skill gets a minimal explicit 5-step run contract, drops a 40-line CLI-resolution bash blob in favor of the resolved CLI path now carried in the skill pointer, and fixes an update_plan leak (senpi exposes todo).
  • When the ulw-loop pointer accompanies the directive, bootstrap defers to the loop's run contract, ending the dual-bootstrap confusion.
  • mass-ulw, ultrawork, and dag-library skill docs are updated for the detached-wait default.

Toolchain, CI, and build

  • Bun 1.4.0 is now the pinned workspace runtime in both CI and the devcontainer (previously 1.3.12 in the container), with a test guarding against drift.
  • Root-test CI now shards every OS two ways, extending the proven Windows shape: shard 1 covers packages/omo-opencode + packages/memory-core in one serial process, and shard 2 runs a shared serial quarantine (one source of truth in script/root-test-serial-quarantine.ts) before the remainder. Job-level sharding replaced in-job bun test --parallel on Linux and macOS, which re-ran the heavy preload per file under --isolate and OOM-killed the 7 GB hosted runners; the dead bunfig.root.parallel.toml was removed. Two Windows tests that were running twice per shard now run once.
  • Parallel lsp-daemon build artifacts are isolated to avoid dist races.
  • Committed Senpi extension bundles and the generated model-capabilities snapshot are regenerated fresh for this release, so shipped runtime payloads match the source and the 2026.8.26-2 pin.

Breaking changes

No new breaking changes in beta.22 itself. Note two behavior shifts: the DAG wait action detaches by default (pass detach: false for the old blocking behavior), and default fallback chains no longer include vercel or quotio-openai lanes.

Upgrade

npm i -g omo-ai@beta

The beta channel contract is unchanged: every version is a prerelease published under --tag beta. After upgrading, run omo doctor once; if it lists stale orphaned engines from earlier launcher versions, clean them up with omo doctor --reap <pid>. Devcontainer users should rebuild the container to pick up Bun 1.4.0.

Don't miss a new oh-my-openagent release

NewReleases is sending notifications on new releases.