Keep the usage indicator's hidden-row toggle in sync with rendered duplicate windows.
- count hidden usage rows from the currently rendered provider windows instead of persisted label entries
- preserve the Show hidden button when duplicate live windows share a stored hidden label
- add a regression test covering duplicate Daily windows with persisted hidden state
Files changed:
.../dashboard/app/components/UsageIndicator.tsx | 12 ++++++-
.../components/__tests__/UsageIndicator.test.tsx | 42 ++++++++++++++++++++++
2 files changed, 53 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-5875
Fusion-Task-Lineage: 648f9cb9-ea0a-4573-b08f-b1a412a46ae4
The lineage commit associations panel surfaced low-value provenance
metadata. Remove the UI section, its dead state/fetch wiring in
TaskChangesTab, the orphaned .task-lineage-* CSS, and the obsolete
tests. The fetchTaskCommitAssociations API helper is retained.
Preselect the resolved default model when creating a new model-based chat.
- pass the resolved default model into the new chat dialog
- preserve and restore the default model selection when switching into model mode
- add ChatView coverage for default-model preselection, create enablement, and unresolved-default fallback
Files changed:
packages/dashboard/app/components/ChatView.tsx | 18 +++++-
packages/dashboard/app/components/__tests__/ChatView.test.tsx | 65 ++++++++++++++++++++--
2 files changed, 75 insertions(+), 8 deletions(-)
Fusion-Task-Id: FN-5854
Fusion-Task-Lineage: d1ace008-0354-44b4-90c8-e0370f38b6bf
Make the ChatView skill-menu keyboard navigation test wait for async UI updates.
- wrap the highlighted-option assertion after ArrowUp in waitFor to avoid synchronous timing races
- wait for the textarea value update after Enter selection before asserting the chosen skill command
Files changed:
packages/dashboard/app/components/__tests__/ChatView.test.tsx | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-5864
Fusion-Task-Lineage: 9f1b3988-7022-415f-8d4b-83b0b3b25dfb
Keep the memory/file editor stable while controlled content updates flow through CodeMirror.
- stop recreating the editor view when content and editor options change
- reconfigure line numbers, word wrap, read-only state, and language in place via compartments
- add regression tests for editor instance preservation and caret stability during controlled edits
Files changed:
packages/dashboard/app/components/FileEditor.tsx | 34 +++++++++++++++-
packages/dashboard/app/components/__tests__/FileEditor.test.tsx | 47 +++++++++++++++++++++-
2 files changed, 79 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-5861
Fusion-Task-Lineage: a8c5c4b0-ff5f-4f25-9e65-ed3f31c2b893
Ensure quick entry keeps Shift+Enter newline behavior even before expansion.
- allow Shift+Enter to bypass submit handling in any quick-entry state
- expand the quick entry when Shift+Enter inserts a newline from the collapsed state
- update QuickEntryBox coverage to verify newline behavior without submission while collapsed
Files changed:
packages/dashboard/app/components/QuickEntryBox.tsx | 5 +++--
packages/dashboard/app/components/__tests__/QuickEntryBox.test.tsx | 13 ++++++++-----
2 files changed, 11 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-5860
Fusion-Task-Lineage: 58a65cb7-2d5b-45bb-bce9-8ffdbebbe586
Resolve task card agent badges to show assigned and source agent names without fetch delay.
- use the agents map cache to resolve assigned agent names before falling back to fetches or raw ids
- prefer cached source agent names for agent-created provenance badges while preserving the generic fallback when no name is available
- add TaskCard coverage for cached agent badge rendering, provenance label resolution, and fallback behavior
Files changed:
packages/dashboard/app/components/TaskCard.tsx | 51 ++++++++++++---
.../app/components/__tests__/TaskCard.test.tsx | 76 ++++++++++++++++++++--
2 files changed, 114 insertions(+), 13 deletions(-)
Fusion-Task-Id: FN-5859
Fusion-Task-Lineage: ac15f69a-50ca-48c5-a7a8-fb6c5e48af70
Prevent closed quick chat FAB drags from overwriting the saved desktop panel size.
- gate desktop panel resize clamping and persistence behind the panel open state
- pass the quick chat open state into the resize hook so closed FAB moves leave saved dimensions untouched
- add a regression test covering closed-FAB dragging and reopened panel dimensions
- add a patch changeset for the published CLI package
Files changed:
.changeset/fn-5856-quick-chat-resize.md | 5 +++++
packages/dashboard/app/components/QuickChatFAB.tsx | 12 +++++------
.../app/components/__tests__/QuickChatFAB.test.tsx | 23 ++++++++++++++++++++++
3 files changed, 34 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-5856
Fusion-Task-Lineage: 3358f2b0-ae8d-468c-8e9e-71a1b5365061
Root cause: node:sqlite SIGSEGVs inside pager_write leave the B-tree
malformed in a way that still opens but fails integrity checks; large
operational-log tables widen the write window where the crash strikes.
- backup: verify every copy with PRAGMA quick_check, quarantine corrupt
copies as *.corrupt, and never rotate out the last verified-good backup
- db: add Database.recoverIfCorrupt() startup guard (wired into
TaskStore.init, disk-backed only, opt out via FUSION_DISABLE_DB_AUTORECOVER)
that rebuilds a malformed db via sqlite3 .recover, preserving the corrupt
original; also fixes the latent `.recover main` invalid-option bug that made
recoverDatabase() always fail
- db: drop lost_and_found* scratch tables on init; add pruneOperationalLogs()
- settings: add operationalLogRetentionDays (default 30, 0 = off) and prune
activityLog/agentLogEntries/runAuditEvents/agentHeartbeats during maintenance
- dashboard: expose retention in Settings -> Backups -> Database Maintenance
Tests: backup 59/59, db 135/135 (incl. real corrupt->recover->reopen),
self-healing cleanup/corruption 10/10, settings 77/77, SettingsModal 460/460.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Improve dashboard mobile log usability and make branch group cards collapsible for cleaner review workflows.
- preserve/restore AgentLogViewer scroll position when toggling mobile drawer and lock body scroll while open
- add collapse/expand state to BranchGroupCard with a summary header and hidden details when collapsed
- add regression tests for AgentLogViewer mobile scroll behavior and BranchGroupCard collapse interactions
- add a changeset and dashboard guide note for the new branch group card behavior
Files changed:
.changeset/fn-5845-branch-group-collapse.md | 5 ++
docs/dashboard-guide.md | 1 +
.../dashboard/app/components/AgentLogViewer.tsx | 21 ++++++++
.../dashboard/app/components/BranchGroupCard.css | 23 ++++++++
.../dashboard/app/components/BranchGroupCard.tsx | 63 +++++++++++++++++-----
.../components/__tests__/AgentLogViewer.test.tsx | 48 +++++++++++++++++
.../components/__tests__/BranchGroupCard.test.tsx | 18 +++++++
7 files changed, 166 insertions(+), 13 deletions(-)
Fusion-Task-Id: FN-5845
Fusion-Task-Lineage: 6a0f2967-5df8-4761-ae6c-50991f01ab78
Treat rewritten integration-branch advances as handled when the working tree is already aligned.
- Add a new `superseded` resolution for unreachable advance SHAs that remain after history rewrites while HEAD matches the local integration tip.
- Update Git status collection logic and route/API status typings to propagate the new resolution state.
- Update Git Manager modal messaging and dismiss behavior so handled `superseded` entries do not show a sync CTA.
- Extend dashboard route and modal tests, and refresh dashboard guide docs for the new classification behavior.
Files changed:
docs/dashboard-guide.md | 5 +--
packages/dashboard/app/api/legacy.ts | 2 +-
.../dashboard/app/components/GitManagerModal.tsx | 6 ++--
.../components/__tests__/GitManagerModal.test.tsx | 5 ++-
.../dashboard/src/__tests__/routes-git.test.ts | 36 ++++++++++++++++++++--
.../dashboard/src/routes/register-git-github.ts | 13 ++++++--
6 files changed, 55 insertions(+), 12 deletions(-)
Fusion-Task-Id: FN-5839
Fusion-Task-Lineage: 6b4afb73-587d-4319-8ad8-f1d5d54bc7bf
Refine merge-advance status handling so Git Manager only requests action when the checkout is truly behind.
- classify recent integration advances as reachable, orphaned, subsumed, or pending before marking them actionable
- detect subsumed advances by comparing commit patch fingerprints from recent HEAD history
- expose advance resolution metadata in API status payloads and route exports
- update Git Manager UI to count only pending actionable advances, gate Sync Working Tree visibility, and allow dismissing handled orphaned/subsumed rows
- expand dashboard tests and docs to cover stale false-positive scenarios and new resolution behavior
Files changed:
docs/dashboard-guide.md | 6 ++
packages/dashboard/app/api/legacy.ts | 1 +
.../dashboard/app/components/GitManagerModal.tsx | 45 ++++++----
.../components/__tests__/GitManagerModal.test.tsx | 63 ++++++++++++++
.../dashboard/src/__tests__/routes-git.test.ts | 97 +++++++++++++++++++++-
.../dashboard/src/routes/register-git-github.ts | 94 ++++++++++++++-------
6 files changed, 259 insertions(+), 47 deletions(-)
Fusion-Task-Id: FN-5838
Fusion-Task-Lineage: 65d1317a-7618-4fff-9875-c845474888ed
Ensure mailbox content can scroll to the latest agent-to-agent email on mobile layouts.
- Add `min-height: 0` to `.mailbox-view .mailbox-content` to keep the flex child bounded and scrollable.
- Strengthen mobile mailbox scrolling with `overflow-y: auto`, `overscroll-behavior: contain`, and `-webkit-overflow-scrolling: touch`.
- Extend MailboxView CSS tests to assert the new bounded flex and mobile scrolling rules.
Files changed:
packages/dashboard/app/components/MailboxModal.css | 4 ++++
.../app/components/__tests__/MailboxView.test.tsx | 15 +++++++++++++++
2 files changed, 19 insertions(+)
Fusion-Task-Id: FN-5836
Fusion-Task-Lineage: 41ce03bf-d788-4de9-9dc1-db8ad443048e
Ensure the message composer textarea scrolls into view during mobile keyboard interactions.
- extract a reusable textarea scroll helper guarded for missing scrollIntoView support
- subscribe to visualViewport resize for all compose modes (not only replies) and clean up listener with stable callback
- trigger textarea scrolling on focus to proactively keep the composer visible when soft keyboards open
- add tests covering visualViewport resize for new compose, existing reply flow, and focus-triggered scroll behavior
Files changed:
.../dashboard/app/components/MessageComposer.tsx | 20 ++++----
.../components/__tests__/MessageComposer.test.tsx | 56 ++++++++++++++++++++++
2 files changed, 68 insertions(+), 8 deletions(-)
Fusion-Task-Id: FN-5837
Fusion-Task-Lineage: c9fb76a2-6c5a-4d5c-b8ad-8250ed470825
Add a markdown/plain toggle to the planning summary description so users can preview formatted content before creating a task.
- add a Description header toggle that switches between editable plain textarea and rendered markdown preview
- render description preview with react-markdown and remark-gfm while preserving expand/collapse layout behavior
- add preview container styles and spacing adjustments for summary form
- add UI interaction test coverage for markdown toggle behavior and rendered heading/bold content
- document the new markdown/plain description toggle in dashboard guide
Files changed:
docs/dashboard-guide.md | 1 +
packages/dashboard/app/components/PlanningModeModal.css | 18 +++++++-
packages/dashboard/app/components/PlanningModeModal.tsx | 32 ++++++++++---
packages/dashboard/app/components/__tests__/PlanningModeModal.ui-interactions.test.tsx | 54 ++++++++++++++++++++++
4 files changed, 98 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-5801
Fusion-Task-Lineage: 34972830-7d51-4fcd-bf00-3de8f5aff028
Swap the Settings modal Discord link icon to the official Discord mark and cover it with a focused regression test.
- add an inline Discord SVG icon component and use it in the Discord footer link
- remove the previous lucide MessageCircle icon import and usage
- extend SettingsModal tests to assert the Discord SVG renders and the old icon is absent
Files changed:
packages/dashboard/app/components/SettingsModal.tsx | 20 ++++++++++++++++++--
packages/dashboard/app/components/__tests__/SettingsModal.test.tsx | 3 +++
2 files changed, 21 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-5793
Fusion-Task-Lineage: eebbad06-311b-4770-b739-19b33fc29e6a
Refuse AI merge landing on a checked-out dirty integration worktree by default. This prevents Fusion from stashing/restoring unrelated project-root edits into main and then marking tasks done against contaminated state.
Fusion-Task-Id: FN-5780
Relocate the Settings Help/discussions action from the header controls to the footer version area for clearer placement.
- Remove the Help button from the settings header action group and keep Star/Discord there.
- Add the Help link beside the footer version/update-check section with the same hardened external-link attributes.
- Update Settings modal styling for the new footer help placement and spacing behavior.
- Adjust Settings modal and mobile CSS tests to assert the new Help location and height contract selectors.
Files changed:
.../dashboard/app/components/SettingsModal.css | 12 ++++++++----
.../dashboard/app/components/SettingsModal.tsx | 22 +++++++++++-----------
.../components/__tests__/SettingsModal.test.tsx | 12 +++++++++++-
.../components/__tests__/settings-mobile.test.tsx | 4 ++--
4 files changed, 32 insertions(+), 18 deletions(-)
Fusion-Task-Id: FN-5781
Fusion-Task-Lineage: 90fe2f30-c2fe-438b-b486-3b6ef14e21a6
Restore the Settings header GitHub star CTA while removing its configurability.
- keep the Star on GitHub link in Settings header with refreshed split-pill styling and alignment
- reintroduce GitHub star count fetching/caching and click-tracking helpers used by the header control
- update Settings modal header-action test expectations to include the GitHub star link
- revise the changeset note to reflect removing only the showGitHubStarButton setting/toggle
Files changed:
.changeset/FN-5777-removal.md | 4 +-
packages/dashboard/app/components/SettingsModal.css | 51 ++++++++-
packages/dashboard/app/components/SettingsModal.tsx | 118 ++++++++++++++++++++-
packages/dashboard/app/components/__tests__/SettingsModal.test.tsx | 4 +-
4 files changed, 170 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-5779
Fusion-Task-Lineage: f485a062-6110-4a79-b42d-70710e3ce5da
Remove the dashboard setting and UI entry points for the GitHub star prompt.
- Remove the Star on GitHub option from settings state types and schema definitions.
- Delete SettingsModal UI, handlers, and styles tied to the star button and related layout.
- Update SettingsModal tests and add a changeset documenting the patch release impact.
Files changed:
.changeset/FN-5777-removal.md | 7 ++
packages/core/src/settings-schema.ts | 1 -
packages/core/src/types.ts | 4 -
.../dashboard/app/components/SettingsModal.css | 51 +-------
.../dashboard/app/components/SettingsModal.tsx | 137 +--------------------
.../components/__tests__/SettingsModal.test.tsx | 5 +-
6 files changed, 13 insertions(+), 192 deletions(-)
Fusion-Task-Id: FN-5777
Fusion-Task-Lineage: 16367ba6-ad22-4ba0-a033-005ccc420c19
Relocate Settings version/update UI into the modal footer to reduce header crowding.
- Remove the version/update-check control block from the Settings modal header.
- Add a dedicated footer version container and keep the update-check action/result rendering there.
- Update Settings modal CSS for the new footer layout and mobile wrapping behavior.
- Extend mobile tests to verify footer placement and update-check button clickability.
Files changed:
packages/dashboard/app/components/SettingsModal.css | 25 +++++++--
packages/dashboard/app/components/SettingsModal.tsx | 64 +++++++++++-----------
packages/dashboard/app/components/__tests__/settings-mobile.test.tsx | 27 ++++++++-
3 files changed, 77 insertions(+), 39 deletions(-)
Fusion-Task-Id: FN-5765
Fusion-Task-Lineage: 97923f08-e787-4274-a4ce-8b615b909468
Add a Discord CTA in the Settings header alongside the existing GitHub star action.
- Add a Discord header action/link in SettingsModal next to the GitHub star button
- Update SettingsModal styles to support the additional header action
- Extend SettingsModal tests to cover rendering and behavior of the new Discord link
Files changed:
packages/dashboard/app/components/SettingsModal.css | 2 ++
packages/dashboard/app/components/SettingsModal.tsx | 13 ++++++++++++-
.../app/components/__tests__/SettingsModal.test.tsx | 14 +++++++++++++-
3 files changed, 27 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-5763
Fusion-Task-Lineage: 758eddf8-246c-41be-9742-a9d5b4b0eb17
Keep chat scroll position stable when stale top snapshots are captured during mobile message updates.
- Capture scroll anchors from the first visible message instead of always sampling the first DOM node
- Ignore stale or likely-invalid zero-position snapshots before attempting scroll restoration
- Guard bottom anchoring from interrupting user scroll unless explicitly forced and add regression coverage for stale snapshot behavior
Files changed:
packages/dashboard/app/components/ChatView.css | 11 +++++-
packages/dashboard/app/components/ChatView.tsx | 33 +++++++++++++----
packages/dashboard/app/components/__tests__/ChatView.scroll-to-top.test.tsx | 41 ++++++++++++++++++++++
3 files changed, 78 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-5757
Fusion-Task-Lineage: 4e4f6843-ba70-40da-8d16-358bdfcc7b09
Fixes typecheck failure — the new task:near-duplicate-flagged
ActivityEventType was missing from the exhaustive Record maps in
ActivityFeed and ActivityLogModal.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Stabilize the connectivity recovery first-run App test by controlling timer-driven state transitions.
- switch the retry/recovery test to `vi.useFakeTimers()` with `try/finally` cleanup
- advance timers explicitly around initial render, retry click, and post-rerender recovery window
- preserve existing assertions while removing `waitFor` timing dependence in this flow
Files changed:
packages/dashboard/app/components/__tests__/App.test.tsx | 41 ++++++++++++++--------
1 file changed, 26 insertions(+), 15 deletions(-)
Fusion-Task-Id: FN-5724
Fusion-Task-Lineage: 0dfad0d8-ccf9-4f83-af2e-1057180fe191
Reduce interaction overhead in the ChatView agent-mentions test while preserving coverage.
- Switch the test to a local instance for faster click/type interactions.
- Reuse that configured user instance for both room-scope selection and mention trigger typing.
- Replace async DOM lookup with immediate assertion once the mention header is expected to be present.
Files changed:
packages/dashboard/app/components/__tests__/ChatView.test.tsx | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-5745
Fusion-Task-Lineage: f65364d0-951e-4945-bc8b-42bf99e8a5e6
Prevent rapid auto-merge toggles from desynchronizing dashboard settings state.
- Track auto-merge state in a ref so each toggle reads and writes the latest value
- Apply optimistic updates from the ref and roll back correctly on failed setting updates
- Add regression coverage for rapid double-toggle behavior in useAppSettings
- Add a patch changeset for @runfusion/fusion describing the dashboard blank-state fix
Files changed:
.changeset/fn-5751-auto-merge-toggle.md | 5 ++++
.../app/hooks/__tests__/useAppSettings.test.ts | 27 ++++++++++++++++++++++
packages/dashboard/app/hooks/useAppSettings.ts | 20 +++++++++++-----
3 files changed, 46 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-5751
Fusion-Task-Lineage: 1a0090ff-4015-46b8-a974-3accbbdce919