miloco v2026.10.16
Since v2026.9.11: 144 commits, 23 PRs, 351 files changed (+52,087 / −2,700).
🎯 New Features
-
LAN control through the local central hub (@HCl8): home automation requests now prefer the central hub over the cloud — a short-lived mTLS channel to the hub on the LAN, with MIPS as the low-latency control path, and property push sources picked per device (local where possible) instead of always over the cloud. On macOS, the backend is launched through a signed launcher and a LaunchAgent, which lets it control the local network without tripping Local Network Privacy. Device online/offline subscriptions are kept coherent with account changes on both sides of every mips rebuild.
-
IoT property changes can drive rules (@Zirconi): a rule's condition can now subscribe to MIoT device properties — a pushed property change immediately re-judges the rule's condition instead of waiting for the next perception cycle. Sources are reconciled per device, closed rules unsubscribe, and conditions set up this way are disallowed on
durationrules.rule creategets the new condition parameters and diagnostic output. -
Rules can guard other rules (@Zirconi): a new
guarddirection turns a rule into a precondition for other rules of the same task — its condition is evaluated as background state instead of an event, and entries of sibling rules are held until the guard is satisfied, then released. Pending entries survive state flushes and restarts, and a sibling exiting no longer refreshes the guard. -
Perception runtime flow graph (@Zirconi): a live view of the perception pipeline — stages, gate pass/fail, and dropped windows with their drop reason — for debugging what the engine actually saw.
-
Action ledger entries link back to the event that caused them (@ExWang): the Web log page folds each action under its triggering event as a child row, with the strength level switchable, and events can be looked up by their parent key; actions afterwards can be fetched as a whole group per event.
-
Image-sequence mode for omni visual input (@Molly-3000, opt-in via
perception.engine.input.omni_visual_input_mode): instead of one encoded MP4, the perception engine can send a time-ordered JPEG sequence plus a separate m4a audio track. Both modes share one canonical frame pipeline, so switching modes does not change what the model sees. Video remains the default; the video-mode request and prompt are unchanged bit for bit. -
Identity recognition prompt now shows each track an appearance frame (@ExWang): when several tracks need recognition in the same window, each gets a single frame of its own appearance to disambiguate against, instead of only a shared scene view.
🧠 Perception Stability
- The roster and bounding boxes are no longer treated as "someone is present" (@ExWang): conclusions can no longer be drawn from stale member names or boxes when the current detection evidence does not back them.
- The omni fuse no longer black-holes misclassification (@lixiangnlp): the OPEN_CONFIG failure path is fixed at its root — the audio block was missing the OpenAI-required
formatfield — and a slow-cycle probe now auto-recovers classifications the fuse used to lock out forever. - Perception logs no longer print timing on every line (@Zirconi).
⚙️ Improvements: CLI / Web
- Live-stream WebSocket backpressure (@HCl8): each subscriber gets a bounded queue instead of sharing one — slow subscribers drop stale video frames instead of stalling everyone, init control messages are never evicted, and a dead connection is declared after 20 s.
- Token handling no longer puts the cart before the horse (@ExWang): a new token lands in the database before its side effects run, queries and reads are gated on the credential actually being usable, and when the cloud permanently rejects an authorization the backend stops pretending, surfaces the reason, and shows it in the UI, health check and ledger.
- Model dropdown recognizes the full Gemini family (@ExWang): models that the configured endpoint supports are shown even if they were never seen before — the picker no longer reports a bad key when the list is simply unknown.
- Default omni model switched to mimo-v2.6-flash (@idootop), with the model description updated across configurations.
- Miloco plugin install/reload no longer fails on the host's 5-second service deadline (@HCl8):
miloco-backendstarts in the background and CLIs tearing down an unready service no longer eat the caller's budget. - Hermes/OpenClaw installs keep their Miloco paths and environment (@leavingme): rerun-safe install home preservation, per-runtime capability probing, and acceptance tests that assert the environment actually works end to end.
- Hermes trace accounting fixed for persistent sessions (@Zirconi): a turn's accounting state is released when the turn ends, so a long-lived session no longer silently misses most turns; the suggestion lane moves to persistent sessions, and trace metadata is evicted by a rolling cap.
- Web activity-feed fixes (@ExWang): events no longer disappear behind action rows; reconnect backfills no longer steal the generation token or skip missed pages; failures settle into a persistent error bar with a working retry.
🔒 Security / Supply Chain
- PyAV pinned below 19 (@Zirconi): version 19 introduced a per-thread
SwsContextwhose teardown from another thread deadlocks after fork, freezing the whole process; the pin avoids the fork-time deadlock.
📚 Docs
- Third-party component license list completed (@Zirconi).
🙏 Acknowledgements
Special thanks to @HCl8 for landing the local central hub — the biggest change in this release — giving the home a control path that does not depend on the cloud.
Thanks as well to everyone else who contributed: @Zirconi, @ExWang, @Molly-3000, @lixiangnlp, @leavingme, @GOUKI9999, @idootop