v0.9.6 — MCP broker `handlePermission not found` family fix + mobile QR
Highlights
MCP broker handlePermission not found — full family fix (#2058)
The sandbox MCP broker could fail to come up, dropping every mcp__mulmoclaude__* tool at once — so the CLI reported the missing permission-prompt tool instead of the real cause. Fixed across two layers, each with regression tests (mapped in plans/mcp-broker-availability-matrix.md):
- Windows junction fallback now covers every workspace scope (#2052) — the
/app/pkg_modulesfallback covered only@mulmoclaude/*, so@mulmobridge/*dangled inside the Linux container and the broker died at load. Verified on real Windows CI (WSL2 + nativedockerd, real NTFS junctions). - npx nested
node_modulesmounted (#2056) — deps npm nests in the launcher's ownnode_modules(instead of hoisting them) are now bind-mounted into the container. - Scheduler startup race (#2057) — a spawned chat's broker can lose the startup race to the CLI's first tool call. Now same-minute firings are staggered (capped to half a tick), a lost race is auto-recovered by replaying the turn once (guarded against double-execution and aborts), and a spawned-but-failed run records its real error instead of a false
"success".
Remote host: mobile PWA QR code (#2054)
The remote-host popover now shows a QR code for the mobile PWA — pair a phone without typing the URL.
Fixed
isTestEnvno longer misdetects any path containing "test" (which causedyarn dev401s) — exact argv match now (#2064).- npm
file:specifiers emit POSIX separators, fixing Windows CI installs (#2048). - Whisper absorbs a late partial-file open error during model download instead of crashing the stream (#2046, #2047).
Also
- Internal refactors clearing the
max-lines-per-functionlint ratchet (whisper, relay, composables) and a dependency refresh.
📦 npm: mulmoclaude@0.9.6
Full Changelog
See CHANGELOG.md.