Engine: senpi 2026.9.18-2
omo boots again on Bun 1.3.x. Every build since beta.69 crashed at startup there with webidl.util.markAsUncloneable is not a function, TUI and headless alike. The engine's bundled undici creates a CacheStorage at module init, and that constructor reaches for worker_threads.markAsUncloneable, which Node added in 23 and Bun 1.3 does not have. The bundle prologue now installs a no-op when the runtime lacks it; nothing in the engine ever used caches. (senpi #1806)
Devin and Cursor login work again. Both failed with Cannot find module .../dist/bundle/chunks/devin.js. The engine reaches each provider's login flow through a relative import the bundler cannot see, so it ships those flows as sibling files next to the chunk that loads them; the Devin and Cursor flows, and their two provider streams, had been left off that list while the other seven providers were on it. They ship now, and the engine's bundle smoke test starts a login for six providers under Node and Bun on every build. (senpi #1810)
One command now gets you the shared engine daemon. senpi host ensure|status|stop|handoff reads a launch spec, probes what already serves the socket, and reuses it, starts one, hands off to a newer generation, or refuses with a named reason. Every invocation prints one JSON line and reports the outcome in its exit code, so a terminal, a desktop, and a task runner all reach a daemon the same way instead of each re-implementing the decision. The launch spec is a file, not stdin or argv, because a machine-wide daemon needs an owner to check: it is refused when not owned by the current user, when group- or world-writable, when an extension path escapes the spec directory, or when it sets an environment key outside the allowed set. (senpi #1812)
Extensions can import named bindings from CommonJS packages. import { Readability } from "@mozilla/readability" (and jsdom, and anything reaching tldts through tough-cookie) failed to load with Export named 'X' not found in module 'senpi-extension:...', though the same line works in plain Bun and Node. The loader wrapped CommonJS as default-only; it now rewrites named, aliased, and namespace imports of a CommonJS target to bind off module.exports, which is the semantics CommonJS has anyway. pi-webfetch loads. (senpi #1807)
Fixed
The memory reconcile pass no longer replays a settled reflection run on every launch. A run directory whose durable completion record already existed could never be re-settled byte for byte, because the rebuilt record folds in launch-dependent values (the current failure streak, the clock when the ledger has no finalizedAt). The strict comparison threw before final.json landed, so every bind logged memory bind-time reconcile failed: Reflection completion record mismatch for reflection-run-1 and tried again next time. Settlement now adopts the existing record and finishes the terminal artifacts, so the directory turns terminal after one pass. (#8437)
- e8fdf40 Merge pull request #8441 from code-yeongyu/release/v5.0.0-beta.72-source-state
- ac1b2e5 Merge pull request #8438 from code-yeongyu/fix/reflection-settle-adopt-durable-8437
- 170e3ba fix(memory): adopt the durable completion record when settling a replayed reflection run
npm i -g omo-ai@beta