npm omo-ai 5.1.66
v5.1.66

one hour ago

omo thread says when a broken install leaves it on this device only. A thread client sidecar that cannot be loaded no longer makes omo thread read <alias> silently answer not_found: stderr names the sidecar, the error, and the reinstall step. The CLI sign-in's own warnings (a retired trust pin, a failed device-service forget) now reach stderr too. (#12936)

A message to a busy thread now reaches the turn it is running, by default. thread_send and thread_handoff with no delivery mode (and omo thread send without --mode) steer the recipient's running turn and start a turn when it is idle, on this device and on another device alike; a message queues behind the running turn only when the caller asks for follow_up, or when the turn cannot take a steer (a waiting question, a compaction, an engine that reports no turn epoch). A send that steers a turn ending at that very moment falls back to the lane the target has then instead of failing. (#12921, part of #12879)

OmO runs on senpi 2026.11.9-2. A tool that an eval cell awaits no longer leaves the running cell blank for a moment when it finishes: its streamed lines stay until the cell's own output or its result replaces them (senpi#6257). (#12920)

omo remote send now travels the same road as a session's thread_send to another device, and every reply from another device is explained by one mapping. The person at a terminal who sends to a session on another device goes through the relay transport (the same offline check, the same steer preflight against the running turn, a receipt in this device's gateway store) while keeping their own prompt record; what the user reads when a command on another device is refused (omo remote, the attach TUI, the thread tools and the SDK) comes from a single module, so a device that did not answer, a missing grant or an uncertain result reads the same everywhere. (#12911, part of #12879, fixes #12885)

OmO runs on senpi 2026.11.9. It brings senpi's admit_external_message (a message relayed from another device's session is admitted as an ordinary delivery) and makes a relayed delivery read exactly like a same-machine one, with the device kept in its metadata only. The one-channel relay transport (#12879) needs both. (#12904)

The Install button on omo.dev's header no longer presses against or slips past the pill's right edge. The floating nav bar gives its last control the same inset as the logo on the left, and below 1000 px the section links move into the menu so nothing is pushed outside the pill in any language. (#12893)

A thread an agent creates or forks with thread_create now starts in the creator's own approval mode on this device too, not the host's default. A session created on another device already did (#6189); the two legs now run one body: a name is checked against the device the thread lands on (a name that device already lists live is name_conflict there), opening a thread that is live on another device answers that thread without opening it again, and the created thread's facts (name, working directory, timestamps) come from the engine's reply on both devices. (#12891, part of #12879)

Stopping, closing, renaming, re-modelling, changing the reasoning level of, or reading a thread works the same way whether that thread runs on this machine or on another device of your account. thread_set_reasoning now reaches a thread on another device too, and a session with no file yet that another client still holds answers the same on both. (#12890, part of #12879)

A message an agent sends to a session on another device now arrives there exactly as a message between sessions on one device. The receiving session gets a delivery entry (never a user message) with the same sender line and authority notice a same-device delivery carries, deduplicated under the same key, and it wakes on receipt the same way; a reply is just another send back. Nothing in the delivered text names the device it crossed, and omo remote send from a terminal is unchanged. A send from omo thread send to a session on another device is refused as data (the engine admits a command-line delivery only from its own machine) and points at omo remote send. (#12889, part of #12879, fixes #12882, fixes #12877, fixes #12346, fixes #12865, fixes #12857)

Sending a message to another session now goes through one delivery pipeline whether that session is on this machine or on another device. The device difference is a transport module behind one port; nothing a user sees changes in this release. (#12887, part of #12879)

A message to a session on another device now reads exactly like one from a session on the same machine. The receiving agent sees which session sent it, not which device, and replies by that session as usual. (#12878)

A subagent whose model takes more than 90 s to start answering is no longer aborted by runtime fallback. With runtime_fallback enabled, the first-prompt watchdog cut every subagent that showed no progress within a fixed 90 s and re-prompted the fallback model, so reasoning-heavy models that legitimately think longer before their first token were killed and their prompt was sent twice. The watchdog now waits 300 s, the same stream-start bound the engines use, and runtime_fallback.first_prompt_timeout_seconds sets it (0 disables it). (#11893, fixes #11887)

Fixed

  • omo thread send to a thread alias held on this device now reaches that thread when run from another workspace, the same way omo thread read does, instead of answering that no visible thread matches. (#12860)
  • Memory shutdown drain: the session-shutdown wiring no longer claims senpi puts no bound on its handler. senpi bounds one session_shutdown handler with its own warn threshold, per-handler timeout and total quit budget (shipped defaults 2 s / 10 s / 2 s, each user-tunable and 0-disableable), and the 1500 ms drain budget is sized under those defaults and pinned by a test that reads them from the installed senpi, so a host release that lowers a default below the drain fails there. No host cap was added from OmO and nothing bypasses the host abort; a journal flush skipped by the budget still raises its error-level alarm. (#12795, refs #10336)
  • The browser skill's docs and examples teach BrowserSkill 0.4 shared control for the omowright it now ships (^0.3.0): every gated page action carries the context of a fresh session.cooperate("sync"), and a cooperation_sync_required refusal waits for the person with session.cooperate("wait"), then re-syncs and replans. They also note which calls are gated, that a gated action throws a TypeError on an unknown option key (with the two calls that pass stray keys through instead), and that page.on("dialog") listeners receive a Dialog they can answer. The omowright this release ships includes running-browser discovery through DevToolsActivePort, goto on sparse and frameset pages, UTF-8 decoding across BrowserSkill IPC chunks and unique-only stale-ref recovery (thanks @ashmoonori-afk, code-yeongyu/omowright#115 to #118), and agent tabs in their own window (thanks @devxoul, code-yeongyu/omowright#120). (#12494)
  • The senpi-task cold-revive residency test is now bounded by the product's own liveness rules instead of a flat 20 s total (Part of #10993). A Windows child that blocks for a while during startup no longer fails it unless the product would also give up, and a real stall fails with the last stage it reached and the stall length. The test's child also reports senpi's startup phase timings, so the next block names its phase. (#11706)

Changed

  • Skills: ulw-research and mass research in mass-ulw now require every conclusion to rest on something a tool actually observed. Workers tag claims OBSERVED: and dead ends PROBED:, anything known only from memory is sent back as a lead, and mass-research verify nodes re-open each observed source. Both research editions state the rule in their opening contract, and every mass-ulw node prompt carries it in its VERIFY item. (#12832, fixes #12830)

  • d5ff246 Merge pull request #12921 from code-yeongyu/feat/12879-steer-default

  • 21f8f3f Merge pull request #12911 from code-yeongyu/feat/12879-same-ports-cli

  • d14722a Merge feat/12879-same-ports-cli (#12911 train head ee1f3b5) into feat/12879-steer-default

  • e2c6724 Merge feat/12879-same-ports-cli (#12911 on dev a05f240) into feat/12879-steer-default

  • 0fe5b50 Merge remote-tracking branch 'origin/dev' (#12936) into feat/12879-same-ports-cli

  • a05f240 Merge pull request #12936 from code-yeongyu/fix/12848-cli-sidecar-warnings

  • f3579e6 Merge feat/12879-same-ports-cli (#12911, train base on dev 9d08e26) into feat/12879-steer-default

  • 0ad891c Merge remote-tracking branch 'origin/dev' (#12890 session-control port) into feat/12879-same-ports-cli

  • 9d08e26 Merge pull request #12890 from code-yeongyu/feat/12879-session-control-port

  • 60cdebb Merge remote-tracking branch 'origin/dev' into feat/12879-steer-default

  • 95d1076 Merge remote-tracking branch 'origin/dev' into feat/12879-same-ports-cli

  • a1e771d Merge origin/dev (d0a6ad0, #12860) into feat/12879-session-control-port; regenerate bundles

  • d0a6ad0 Merge pull request #12860 from code-yeongyu/fix/cli-thread-send-own-alias

  • 885207e Merge remote-tracking branch 'origin/dev' into feat/12879-steer-default

  • 9d99a2b fix(thread): the gateway store takes its extension resolver from its creator instead of importing it (#12911 full RED)

  • f349dff chore(omo-native): regenerate service-auth.generated.js after the comment rewording (#12911)

  • b2adedc Merge remote-tracking branch 'origin/dev' into fix/12848-cli-sidecar-warnings

  • 5a490f2 fix(thread): drop the stale knip row for GATEWAY_STORE_WORKER_BUNDLE_NAME and name the engine generically in two comments (#12911 full RED)

  • f71b3fe Merge pull request #12494 from code-yeongyu/chore/12451-omowright-pin

  • 69fe735 Merge origin/dev (a09b243, #12920) into feat/12879-session-control-port; regenerate bundles

  • 271d1db Merge remote-tracking branch 'origin/dev' into chore/12451-omowright-pin

  • 30be881 test(omo-native): every loadThreadSdk test call passes stderr and reinstall (#12848)

  • eab37a6 Merge origin/dev (2faeda0) into fix/cli-thread-send-own-alias

  • ab157c0 Merge remote-tracking branch 'origin/dev' into feat/12879-steer-default

  • 295806c docs(changes): fragment for #12936

  • 21c87ba fix(omo-native): omo thread says when a broken sidecar leaves it on this device only, and passes the sign-in its log (#12848)

  • f1973f6 test(omo-native): omo thread reports a broken thread client sidecar and the sign-in's warnings (#12848)

  • a97783d Merge remote-tracking branch 'origin/dev' into feat/12879-same-ports-cli

  • 97d52c3 docs(thread): describe the SessionControl port; changelog fragment for #12890

  • da00328 refactor(thread): one body per control tool over the SessionControl port; the remote-only implementations are gone (#12883, part of #12879)

  • 7799d1d refactor(thread): a SessionControl port with local and relay implementations, and one close ladder on both legs (#12883, part of #12879)

  • 2faeda0 Merge pull request #12891 from code-yeongyu/feat/12879-session-host-port

  • 0fb2665 Merge remote-tracking branch 'origin/dev' into feat/12879-session-host-port

  • c16a4ff Merge remote-tracking branch 'origin/dev' into feat/12879-same-ports-cli

  • 6e95977 Merge remote-tracking branch 'origin/dev' into feat/12879-steer-default

  • c8f9ff2 Merge origin/dev (5a1db39) into fix/cli-thread-send-own-alias

  • d68f8bb test(remote): a broken staged sidecar under the named package root fails the send, proving the root is used (#12911 review LOW)

  • d4dac69 Merge remote-tracking branch 'origin/dev' into feat/12879-same-ports-cli

  • 276d891 chore(omo-native): regenerate service-auth.generated.js after the compiled runtime root (#12911)

  • 2aad141 fix(remote): the compiled omo names its runtime directory so remote send finds the gateway store worker (#12911 delta review)

  • 421e9d2 fix(thread): a held default-mode steer is re-sent as a follow-up, never lost to a turn_conflict (#12921 review)

  • 11da2a9 chore(omo-native): regenerate service-auth.generated.js after the remote send worker anchor (#12911)

  • b49cc0d docs(changes): fragment for #12921

  • fb797fe feat(thread): the default delivery mode steers the running turn (part of #12879)

  • db38bd0 fix(remote): omo remote send finds the gateway store worker in the shipped layout, disposes on every exit (#12911 review)

  • 5a1db39 Merge pull request #11706 from code-yeongyu/fix/10993-residency-progress-watchdog

  • ac3366f docs(changes): name the fragment for #12920

  • b4f73e6 docs(changes): fragment for #12891

  • 492cd2c refactor(thread): one create body over the SessionHost port; a new session starts in its creator's approval mode on both devices (#12884, part of #12879)

  • 716d84b refactor(thread): a SessionHost port with local and relay implementations (#12884, part of #12879)

  • a471e59 Merge pull request #12889 from code-yeongyu/feat/12879-relay-transport

  • 76a1ed3 docs(changes): fragment for #12911

  • 2c17e6d feat(thread): omo remote send over the transport port, one outcome mapping for every relay reply (part of #12879)

  • 8852286 Merge remote-tracking branch 'origin/dev' into feat/12879-relay-transport

  • 779cfc0 Merge pull request #12832 from code-yeongyu/docs/ulw-research-observed-conclusions

  • 084d73a Merge remote-tracking branch 'origin/dev' into fix/10993-residency-progress-watchdog

  • e237699 Merge remote-tracking branch 'origin/dev' into chore/12451-omowright-pin

  • 2ee7232 Merge pull request #11893 from code-yeongyu/fix/11887-first-prompt-watchdog-bound

  • c61b028 docs(changes): name the fragment for #12904

  • ad02852 Merge pull request #12471 from code-yeongyu/fix/10814-test-budget-wait-primitive

  • 41308e3 docs(skills): fold #12834's data-first wording into the opening contracts and the mass-ulw VERIFY item (#12830)

  • 2fc29c1 Merge remote-tracking branch 'origin/dev' into feat/12879-relay-transport

  • 27ff5de Merge pull request #12887 from code-yeongyu/feat/12879-delivery-transport-port

  • c281a16 Merge pull request #12893 from code-yeongyu/fix/web-nav-pill-inset-12892

  • d66aaa2 refactor(thread): drop the lazy promptRemote wrapper nothing imports (#12882, part of #12879)

  • 9873dc4 docs(changes): note the 1000px section-link breakpoint (#12893)

  • 1a8f847 fix(web): show the section links only from 1000px so the nav pill never clips (#12892)

  • 832dc1f fix(thread): a held or already-taken delivery on an idle receiver is queued at position 1, and the dispose test can fail (#12882, part of #12879)

  • 13c4c96 test(thread): chainCount on the serialized admit_external_message record and a turn_conflict race through the device service (#12882, part of #12879)

  • ccab345 test(web): narrow the nav inset result without a non-null assertion (#12892)

  • 0959f04 fix(thread): a delivery held behind the receiver's open draft is queued at once and re-sent in the background (#12882, part of #12879)

  • 930e94d docs(changes): name the fragment for its PR (#12893)

  • 3e6f9f1 fix(web): give the nav pill the same inset at both ends (#12892)

  • b510aca Merge feat/12879-delivery-transport-port (dd1a136) into feat/12879-relay-transport

  • d28b384 docs(changes): reword #12494's fragment for the omowright ^0.3.0 dev now ships

  • 8760fb7 Merge commit '4dd256592324269831b888f9998a48bc7a83f18d' into chore/12451-omowright-pin

  • c9c1044 docs(thread): describe the delivery transport port and the relay transport (#12882, part of #12879)

  • e8fb7da Merge origin/dev (511dc35) into feat/12879-relay-transport

  • 631654a Merge origin/dev (511dc35) into feat/12879-delivery-transport-port

  • 7e06efe docs(changes): fragment for #12889

  • 511dc35 Merge pull request #12795 from Bearmancer/fix/10336-shutdown-drain-host-cap

  • 6a852f9 fix(thread): the SDK send resolves other devices through the one pipeline and refuses a command-line sender there, typed (#12882, part of #12879, fixes #12857)

  • 568515c fix(thread): a run woken from another device continues that chain's hop on its next send, on both legs (#12882, part of #12879, fixes #12865)

  • 4f51907 feat(thread): a send to another device is admitted there as a delivery, rendered by the same function as a same-device one (#12882, part of #12879)

  • 8df11a7 test(thread): a send to another device is one admit_external_message with the same text as a same-device delivery (#12882, part of #12879)

  • 9eaa447 refactor(thread): load the relay transport from the thread client sidecar (#12881, part of #12879)

  • 8afc45e Merge remote-tracking branch 'origin/dev' into afl-rh6-11893

  • 4dd2565 Merge pull request #12878 from code-yeongyu/fix/peer-text-no-device

  • 71de498 docs(changes): fragment for #12887

  • 3a51c20 refactor(thread): thread_send and thread_handoff deliver through the one pipeline (#12881, part of #12879)

  • aa8cade refactor(thread): local and relay delivery transports behind one pipeline (#12881, part of #12879)

  • 8a1345b refactor(thread): define the delivery transport port (#12881, part of #12879)

  • a9eba04 Merge remote-tracking branch 'origin/dev' into HEAD

  • 6b4bdca Merge remote-tracking branch 'origin/dev' into HEAD

  • 0e21d1c docs(changes): fragment for #12878

  • 4af8da1 fix(thread): a cross-device thread_send names no device in the receiver's text (#12877)

  • 865fa90 Merge pull request #12874 from code-yeongyu/release/v5.1.65-source-state

  • f8454e4 Merge remote-tracking branch 'origin/dev' into afl-rh6-11893

  • 8781a7b Merge dev (ca74736) into fix/cli-thread-send-own-alias

  • 403a8a9 Merge fix/12833-cross-device-name-addressing (697d3c4) into fix/cli-thread-send-own-alias

  • 5f08eac Merge remote-tracking branch 'origin/dev' into afl-rh6-11893

  • b9e520d Merge fix/12833-cross-device-name-addressing (17b5e4c) into fix/cli-thread-send-own-alias

  • 6d01dca docs(changes): changelog fragment for #12860

  • c5c4362 Merge origin/dev into the #11893 branch

  • 6a195c3 docs(changes): add fragment for #12832

  • 14265ef docs(skills): ground every ulw-research and mass-research conclusion in a tool observation

  • dd4c7c6 Merge branch 'dev' into fix/10814-test-budget-wait-primitive

  • 9c53875 Merge branch 'dev' into fix/10814-test-budget-wait-primitive

  • fe8a208 Merge branch 'dev' into fix/10814-test-budget-wait-primitive

  • e03cde0 Merge remote-tracking branch 'origin/dev' into afl-rh6-11893

  • 2d6e29c docs(browser): note that bskSnapshot and full-page screenshot drop unknown keys

  • d8eb247 docs(browser): keep the dialog example free of an email address

  • afb6dad docs(changes): fragment for #12494

  • 05f6dd3 fix(browser): pin omowright at 305c823 and teach BrowserSkill 0.4 shared control

  • 1bbe34e Merge remote-tracking branch 'origin/dev' into afl-11893-dev-merge

  • 016c9f3 style(runtime-fallback): drop the trailing blank line in constants.ts

  • 4ac27f6 Merge remote-tracking branch 'origin/dev' into HEAD

  • 532153a docs(changes): fragment for #11893

  • 13f2a6b fix(runtime-fallback): first-prompt watchdog waits 300 s by default and is configurable (part of #11887)

  • f3f3bf0 changes: fragment for #10993 residency watchdog

bun add -g omo-ai

Don't miss a new omo-ai release

NewReleases is sending notifications on new releases.