v0.20.0
@fusion/dashboard
Patch Changes
- ba6666f: Fix Planning Mode modal getting stuck at partial height on mobile. Two issues: (1)
useModalResizePersistwas replaying a desktop-saved pixel height into the inlinestyleattribute, overriding the mobileheight: 100dvhrule and leaving the modal at half-screen even before the keyboard appeared — now skipped on touch devices ≤768px wide. (2) When the iOS keyboard was dismissed, React reconciled the removed CSS custom properties (--vv-height,--keyboard-overlap,--vv-offset-top) by setting them to empty string instead of callingremoveProperty(). On Safari that leftvar(--vv-height, 100dvh)resolving to empty (the fallback only kicks in when the variable is undefined), collapsing the modal to content height — now driven imperatively viasetProperty/removePropertyon the modal ref.- @fusion/core@0.20.0
- @fusion/engine@0.20.0
- @fusion-plugin-examples/dependency-graph@0.1.9
- @fusion-plugin-examples/droid-runtime@0.1.4
- @fusion-plugin-examples/hermes-runtime@0.2.28
- @fusion-plugin-examples/openclaw-runtime@0.2.28
- @fusion-plugin-examples/paperclip-runtime@0.2.28
@fusion/engine
Patch Changes
- @fusion/core@0.20.0
- @fusion/pi-claude-cli@0.20.0
@fusion/plugin-sdk
Patch Changes
- @fusion/core@0.20.0
@runfusion/fusion
Minor Changes
- f711019: Add agent self-improvement tools (fn_read_evaluations, fn_update_identity) and periodic self-improvement scheduling based on evaluation feedback.
- d7880c6: Add plugin dashboard view discovery and navigation integration via
GET /api/plugins/dashboard-views, plugin view ID persistence (plugin:${pluginId}:${viewId}), and static host-side plugin view registry rendering. - 995faf2: Add per-agent heartbeat auto-claim controls so identity-bearing agents can opportunistically claim relevant unowned tasks during no-task heartbeat runs.
- aab28e1: Add first-class Anthropic (Claude) OAuth login support in Settings and onboarding, including fallback detection of existing Claude credentials from local Claude installs while keeping the separate Claude CLI provider option.
Patch Changes
-
df20edb: Auto-archive sweep now skips done tasks that still have an active dependent (in triage, todo, in-progress, or in-review). Previously a stale done task could be archived while a downstream task was still pending, wiping its
.fusion/tasks/{id}/directory and breaking the downstream agent's sibling-spec read. The agent prompt also now instructs falling back tofn_task_showwhen those sibling files aren't on disk. -
Fix agent heartbeat execution in multi-project setups. On-demand heartbeat triggers from the dashboard API now correctly route to the engine of the project the agent belongs to, instead of silently creating a zombie run record that never executes. Also auto-provisions default agents (triage, executor, reviewer, merger) when the engine starts with an empty agents table.
-
9b01c0a: Self-heal orphaned
agentRunsrows left instatus='active'when the dashboard process crashes mid-heartbeat. The trigger scheduler treats any active run as "still running" and silently skips every subsequent tick, so a single crashed run could leave an agent without heartbeats for hours. SelfHealingManager now reconciles these on startup and during periodic maintenance, terminating runs whoseprocessPiddoes not match the current process or whose age exceeds 6 hours. -
b4a2e7a: Fix Quick Chat backend divergence and consolidate the chat render-mode toggle.
- Backend: Quick Chat and regular chat now go through a single agent-creation path (
createResolvedAgentSession), eliminating thecreateFnAgentbranch where pi-ai'scleanupSessionResources(sessionId)could tear down resources still in use by a newer generation. ThesendMessagefinallyonly disposes the agent if it still owns theactiveGenerationsslot, so a pre-empted generation no longer rips state out from under its successor. - Frontend: extracted the SSE streaming-handler factory shared between
useChatanduseQuickChat(RAF coalescing, accumulators, tool-call dedup, fallback handling) intocreateChatStreamHandlers. Both hooks now compose it instead of duplicating ~85 LOC each. - UX: removed per-message Markdown/plain-text eye toggles. A single thread-level toggle now lives in the chat header and flips every assistant bubble (including the streaming one) between rendered Markdown and plain text. Model-only chats also drop their per-message agent-identity row — the model is shown once in the thread header.
- Backend: Quick Chat and regular chat now go through a single agent-creation path (
-
e5fc71b: Treat pi-ai Codex WebSocket transport drops (
WebSocket error,WebSocket closed …,WebSocket stream closed before response.completed) as transient errors so the engine retries them instead of marking the task failed. Tag the model id onto the thrown error and emit a structured warn so future drops can be triaged by which provider/model is unstable. -
fdc37a3: Auto-toggle xterm mouse reporting in the dashboard TUI based on the focused panel. Default is now OFF so click-drag selection works by default (e.g. selecting the auth token straight off the System panel without needing
[c]). Mouse reporting auto-enables when the user focuses a panel that consumes wheel events:- Status mode: on while Logs is focused, off elsewhere
- Interactive views: on for Files / Git / Board (Board uses the wheel in the task-detail screen), off for Agents / Settings
[M]remains a manual override but the next focus change reapplies the auto policy. The controller'sstart()now honors the initialmouseEnabledvalue rather than unconditionally writing the SGR enable sequence at boot. -
1187ea4: Improve dashboard TUI System panel discoverability and panel navigation:
- Default the focused panel to System on launch so
Enterimmediately opens the dashboard URL in the browser. Adds an inline hint row ([Enter] open URL · [c] copy token · [M] mouse on/off) that is only visible while System is focused. - Add
[c]shortcut (when System is focused) to copy the auth token to the clipboard, with the same flash + log-line feedback used by the Logs[c]copy. Mouse mode normally blocks click-drag selection of the token, so this gives users a keyboard path. - Add
[M]global shortcut to toggle xterm mouse reporting at runtime. Off → click-drag does native text selection (the only path that works under tmux'smouse on, whereShift+dragis intercepted by tmux before reaching the terminal). On → wheel scrolling on Logs/Files/Git list panels works as before. - Fix
←/→panel cycling order:SECTION_ORDERwas[system, logs, utilities, stats, settings], which didn't match the visual layout. Changed to[system, logs, stats, utilities, settings]so left/right now matches both the on-screen left-to-right card order and the Tab/Shift+Tab cycle (PANEL_ORDER). From Logs going right now lands on Stats; from Settings going left now lands on Utilities. - Updated the help overlay with the new shortcuts.
- Default the focused panel to System on launch so
-
4137573: Fix chat: after stopping a streaming reply, the next message would appear sent but show no Stop button or "Connecting…" indicator. The cancellation broadcast from the previous generation was leaking into the new SSE subscription, immediately marking it as errored. Each
chatManager.sendMessagenow allocates a per-generation id;ChatStreamManageronly delivers tagged broadcasts to subscribers from the matching generation, andsendMessage's cleanup no longer deletes a newer generation'sactiveGenerationsslot when an older one finally unwinds. -
b85743d: Fix Quick Chat: messages would silently fail after closing the browser tab mid-response and reopening it. The backend agent kept running with no listener and left a stale
activeGenerationsslot; the next message's freshly-opened CLI session then raced against the lingering agent on the same session file. The/messagesroute now callschatManager.cancelGenerationwhen the client disconnects before the response ended, andbeginGenerationonly aborts the previous generation's controller instead of pre-emptively disposing its agent (the previous agent's ownfinallyhandles dispose, so we don't tear down the CLI process under the new agent). -
b061e2b: Fix Plan Mission With AI modal: stale goal text and unable to type in textarea. The persisted-goal restoration effect depended on
handleStartInterview, which recreates on every keystroke viamissionGoal— causing the effect to re-fire and overwrite user input with stale localStorage data on each character typed. -
2f40843: Fix QMD-backed agent memory behavior so search results normalize to readable agent-memory paths and dream-processing writes trigger agent-memory QMD refreshes for discoverability.
-
69c75fe: Fix fn_research_list status enum to include all valid ResearchRunStatus values and add wait_for_completion support to fn_research_run.
-
f2accb7: Fix Planning Mode summary refinement so "Refine Further" reliably continues completed/resumed sessions through the backend interview flow instead of showing a blank question screen.
-
576238a: Use durable assigned agents as active task execution owners when
assignedAgentIdtargets a non-ephemeral agent, instead of always creating transientexecutor-FN-*task-worker agents. -
d790854: Rename global research flat settings keys from
research*toresearchGlobal*to enforce settings-scope parity and avoid global/project key collisions. -
5fb7c77: Fix Git Manager mobile Changes layout overflow so staged/unstaged file lists no longer force horizontal page scrolling. The changes panel now wraps section actions and file rows at narrow widths while preserving readable file names and usable controls.
-
a0c1e5b: Give autonomous heartbeat agent sessions coding-capable workspace tools (read/write/edit/bash within worktree boundaries) while preserving heartbeat-specific custom tools and readonly safety for non-heartbeat readonly flows.
-
43dd048: Fix Droid CLI auth/status probing to resolve the effective binary path from plugin settings (including custom
droidBinaryPath) so Settings no longer reports false "not installed" states when Droid is configured at a non-default path. -
af0bc4b: Auto-pause unresponsive agents with
pauseReason: "heartbeat-unresponsive"and immediately auto-resume them through the shared heartbeat monitor lifecycle, including consistent assigned-task pause/unpause behavior and single on-demand restart semantics. -
8a30b6f: Deduplicate auto-merge recovery follow-up task creation so repeated verification-cap and conflict-bounce-cap failures reuse an existing active recovery task instead of spawning duplicates.
-
59f6c84: Fix dashboard user mailbox routing to use deterministic canonical identity normalization so agent replies sent to
dashboard,user:dashboard, orUser: user:dashboardall land in the dashboard inbox while preserving reply-link metadata. -
30f6381: Preserve complete GitHub source metadata for imported issues across CLI and extension import paths, and improve commit reference generation by falling back to
externalIssueIdwhenissueNumberis missing. -
2b809fc: Stop the merger from wiping concurrent dev edits in
rootDir.aiMergeTaskissues severalgit reset --hard/git reset --merge/ forced-checkout calls againstrootDirduring merge attempts. WhenrootDiris the developer's primary checkout (the common case for solo / single-host setups), those resets silently discard any unrelated unstaged or untracked changes in the working tree. We've burned developer work this way (FN-3329 retro: dashboard-tui edits were wiped mid-flight by an unrelated merge run).aiMergeTasknow snapshots dirty paths at entry and, if any are present, stashes them under a labeled autostash (fusion-merger-autostash:<taskId>:<ts>, includes untracked files viagit stash push -u). A try/finally around the merge body restores the stash on every exit path — success, error, or abort. If the pop conflicts (e.g. the merge committed an overlapping change), the stash is left intact and the operator gets a recovery hint in the merger log; we never silentlygit stash drop.Best-effort throughout: a stash failure logs and proceeds with the old behavior rather than blocking the merge — strictly worse regressions are off the table.
-
d253e01: Reduce log noise: bump
checkForChangesslow-poll warn threshold from 100ms to 750ms (the 1s poll interval + multiple SQLite queries routinely exceed 100ms without indicating a real problem), and route skill-resolverinfodiagnostics (e.g. "Requested skill: …") throughlog()instead ofwarn()so informational messages no longer surface as warnings. -
9115130: Upgrade
@mariozechner/pi-aiand@mariozechner/pi-coding-agentfrom^0.72.1to^0.73.0across cli, engine, and dashboard. pi-ai 0.73 also extracts the underlyingErrorEvent.errorcause for Codex WebSocket failures, complementing our local transient-retry classifier.
runfusion.ai
Patch Changes
- Updated dependencies [f711019]
- Updated dependencies [df20edb]
- Updated dependencies
- Updated dependencies [9b01c0a]
- Updated dependencies [b4a2e7a]
- Updated dependencies [e5fc71b]
- Updated dependencies [fdc37a3]
- Updated dependencies [1187ea4]
- Updated dependencies [4137573]
- Updated dependencies [b85743d]
- Updated dependencies [b061e2b]
- Updated dependencies [2f40843]
- Updated dependencies [69c75fe]
- Updated dependencies [d7880c6]
- Updated dependencies [f2accb7]
- Updated dependencies [576238a]
- Updated dependencies [995faf2]
- Updated dependencies [d790854]
- Updated dependencies [5fb7c77]
- Updated dependencies [aab28e1]
- Updated dependencies [a0c1e5b]
- Updated dependencies [43dd048]
- Updated dependencies [af0bc4b]
- Updated dependencies [8a30b6f]
- Updated dependencies [59f6c84]
- Updated dependencies [30f6381]
- Updated dependencies [2b809fc]
- Updated dependencies [d253e01]
- Updated dependencies [9115130]
- @runfusion/fusion@0.20.0