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
Split the dashboard quality Vitest lane into bounded heap-managed shards to avoid signal exits.
- replace the single dashboard quality test command with sequential app and API shard scripts
- add a heap wrapper plus Vitest config shard definitions for foundation, component, App, ChatView, and SettingsModal coverage
- add guard tests for the sharded dashboard test configuration and restore spinner-animation.css.test.ts to foundation-ui coverage
- update the CLI package-config test expectations for the new dashboard test script layout
Files changed:
packages/cli/src/__tests__/package-config.test.ts | 8 +-
packages/dashboard/package.json | 18 +-
packages/dashboard/scripts/run-vitest-with-heap.mjs | 41 ++++
packages/dashboard/src/__tests__/dashboard-test-config-guard.test.ts | 77 ++++++
packages/dashboard/vitest.config.ts | 273 ++++++++++++++++++++-
5 files changed, 407 insertions(+), 10 deletions(-)
Fusion-Task-Id: FN-5849
Fusion-Task-Lineage: 522f3963-4647-4a59-bb6b-a3dacfbf620e
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
Tighten the branch-conflicts recovery test to use an isolated secondary worktree root.
- create a unique temporary parent directory for the detached secondary worktree
- track the temporary root for cleanup instead of only the nested worktree path
- keep the reanchor regression focused on detached worktree recovery behavior
Files changed:
packages/engine/src/__tests__/branch-conflicts-recovery.test.ts | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-5863
Fusion-Task-Lineage: 6cfb02c0-e9fd-456d-a78b-451e3e0707b2
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
Update Fusion to the latest pi coding agent and pi AI dependency release.
- bump @earendil-works/pi-coding-agent from ^0.77.0 to ^0.78.0 in the CLI, dashboard, and engine packages
- bump @earendil-works/pi-ai from ^0.77.0 to ^0.78.0 where it is consumed
- add a patch changeset documenting the published @runfusion/fusion update and refresh the lockfile
Files changed:
.changeset/fn-5862-pi-coding-agent-0.78.md | 5 +
packages/cli/package.json | 4 +-
packages/dashboard/package.json | 2 +-
packages/engine/package.json | 4 +-
pnpm-lock.yaml | 193 +++++++++++++++++++----------
5 files changed, 138 insertions(+), 70 deletions(-)
Fusion-Task-Id: FN-5862
Fusion-Task-Lineage: abdfa987-7ba5-45f7-8bea-3db3329a760c
Resolve goal tool lookups to the canonical project store from Fusion worktree directories.
- recognize both legacy .worktrees and .fusion/worktrees paths when resolving the project root for pi extensions
- add CLI coverage proving fn_goal_list and fn_goal_show return dashboard-created goals from a Fusion worktree cwd
- extend core worktree-resolution tests and keep the branch conflict recovery test worktree path isolated in tmpdir
- add a patch changeset for the published CLI fix
Files changed:
.changeset/fn-5851-goal-store-resolution.md | 5 +
packages/cli/src/__tests__/goal-store-resolution.test.ts | 104 +++++++++++++++++++++
packages/core/src/__tests__/pi-extensions.test.ts | 14 ++-
packages/core/src/pi-extensions.ts | 12 ++-
packages/engine/src/__tests__/branch-conflicts-recovery.test.ts | 2 +-
5 files changed, 130 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-5851
Fusion-Task-Lineage: ec4c8239-b953-4df7-9f72-02e17e4b0851
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
Whether `sqlite3 .recover` can rebuild a given byte-level corruption is
build-dependent — CI's sqlite3 returned "failed" (the safe outcome: leave
the corrupt original untouched rather than swap in an unverified rebuild)
where the local build returned "recovered". Assert the contract for whichever
branch is taken instead of hard-requiring "recovered".
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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>
Clarifies test expectations around onboarding auto-launch and non-matching integration tips.
- Rename the onboarding marker test to describe central DB gating accurately.
- Assert task-list routing when onboarding is skipped after central DB creation.
- Avoid accidental matching SHA construction in the git advance pending test.
Files changed:
packages/cli/src/__tests__/bin.test.ts | 8 ++++++--
packages/dashboard/src/__tests__/routes-git.test.ts | 3 ++-
2 files changed, 8 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-5848
Fusion-Task-Lineage: c730deb9-875d-4371-9d92-f85281bcb658
CLI onboarding auto-launch now skips once the persisted completion marker is present.
- Load `cliOnboardingCompletedAt` from global settings before launching onboarding when the central DB is missing.
- Preserve existing skip precedence for non-TTY, command, flag, environment, and central DB guards.
- Add unit and backcompat coverage for completion-marker and skipped-central-DB scenarios.
- Document the updated auto-launch behavior and add a patch changeset.
Files changed:
.changeset/fn-5847-onboard-autolaunch-marker.md | 5 ++
docs/cli-reference.md | 12 +--
.../onboard-autolaunch-backcompat-e2e.test.ts | 7 ++
.../onboard-autolaunch-backcompat.test.ts | 8 ++
.../__tests__/onboard-autolaunch-bypass.test.ts | 7 ++
.../commands/__tests__/onboard-autolaunch.test.ts | 93 ++++++++++++++++++++++
packages/cli/src/commands/onboard-autolaunch.ts | 46 ++++++++++-
7 files changed, 171 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-5847
Fusion-Task-Lineage: db3e474e-e4b8-4299-8087-07b6cd1f4518
Add a release changeset to publish the new onboarding command in @runfusion/fusion.
- add a new changeset file for FN-5815
- mark `@runfusion/fusion` with a minor version bump
- summarize `fn onboard` wizard flow and persisted completion marker behavior
Files changed:
.changeset/fn-5815-onboard-command.md | 5 +++++
1 file changed, 5 insertions(+)
Fusion-Task-Id: FN-5815
Fusion-Task-Lineage: 5585bc19-b2f1-4521-a49a-e5a0b3ec8268
Align onboarding HELP text and CLI reference with current fn onboarding behavior.
- Document onboarding auto-launch conditions around missing central DB and interactive command flow.
- Add and clarify onboarding escape hatches: --skip-onboarding and FUSION_SKIP_ONBOARDING.
- Add an onboard docs parity test to keep HELP and docs aligned for key onboarding terms.
- Add a patch changeset for @runfusion/fusion describing the documentation/help update.
Files changed:
.changeset/fn-5813-onboard-docs.md | 5 ++++
docs/cli-reference.md | 21 +++++++++-----
packages/cli/src/bin.ts | 4 ++-
packages/cli/src/commands/__tests__/onboard-docs.test.ts | 33 ++++++++++++++++++++++
4 files changed, 55 insertions(+), 8 deletions(-)
Fusion-Task-Id: FN-5813
Fusion-Task-Lineage: 14a74ad9-5f09-471a-878d-aa120a28ef41
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
Expose the plugin SDK as a published CLI subpath while preserving existing workspace behavior.
- add a prepack transform helper that injects the ./plugin-sdk and ./package.json exports only in packed manifests
- split tsup config into dedicated CLI and plugin-sdk builds so dist/plugin-sdk JS and DTS are emitted with @fusion deps inlined
- add coverage for definePlugin/validatePluginManifest behavior and manifest/build export guarantees
- document the new published @runfusion/fusion/plugin-sdk surface for plugin authors
Files changed:
docs/agents.md | 2 +
packages/cli/scripts/prepare-publish-manifest.mjs | 61 +++++++++++++++-------
packages/cli/src/__tests__/plugin-sdk-export.test.ts| 50 ++++++++++++++++++
packages/cli/tsup.config.ts | 31 +++++++++--
4 files changed, 121 insertions(+), 23 deletions(-)
Fusion-Task-Id: FN-5842
Fusion-Task-Lineage: b6b481ae-aaac-46c0-a6f7-8cc1e9eed1ce
Tighten test fixture cleanup so temporary test directories are reliably removed.
- track created test project directories and install process exit/beforeExit backstop cleanup hooks
- make destroyTestProject resilient with async rm plus rmSync fallback and tracked-dir removal
- add regression tests for sqlite wal/shm sibling cleanup and tracked-directory drain behavior
- make db lock-child teardown remove children from tracking during iteration
Files changed:
packages/core/src/__tests__/db.test.ts | 10 +++--
packages/core/src/__tests__/test-project.test.ts | 34 ++++++++++++++-
packages/core/src/__tests__/test-project.ts | 54 +++++++++++++++++++++++-
3 files changed, 92 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-5840
Fusion-Task-Lineage: 0977be1d-8334-413d-a652-318584d7058b
Prevent onboarding autolaunch when invocation is non-interactive or an existing central+project setup is detected.
- Add a project initialization probe in onboard autolaunch flow and skip when both central DB and project DB already exist.
- Preserve skip behavior for serve/daemon and all non-TTY invocations so agent/headless runs never block.
- Expand CLI autolaunch coverage with backward-compat and seam tests, and add a changeset for the published package.
Files changed:
.changeset/fn-5808-onboard-backcompat-guard.md | 5 +
.../onboard-autolaunch-backcompat.test.ts | 135 +++++++++++++++++++++
.../commands/__tests__/onboard-autolaunch.test.ts | 9 ++
packages/cli/src/commands/onboard-autolaunch.ts | 16 ++-
4 files changed, 164 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-5808
Fusion-Task-Lineage: b859aa93-44d5-4d93-bc07-8149b95b4042
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