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
Ensure merger AI activity is persisted to task logs before sessions are torn down.
- Flush AgentLogger output in merger AI-session finally blocks for autostash conflict resolution, autostash hard-fail recovery, and rebase conflict resolution paths
- Guard flush/dispose cleanup with safe try/catch handling to avoid teardown-time logging loss
- Add a regression test asserting logger flush occurs before session disposal during AI rebase conflict resolution
- Export the rebase conflict resolver helper for targeted test coverage
- Add a patch changeset for @runfusion/fusion documenting the agent-log visibility fix
Files changed:
.changeset/fn-5752-merger-log-flush.md | 5 ++++
packages/engine/src/__tests__/merger-conflict-resolution.test.ts | 30 ++++++++++++++++++++++
packages/engine/src/merger.ts | 22 +++++++++++++++-
3 files changed, 56 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-5752
Fusion-Task-Lineage: 3c6023f0-cc9b-47e1-bfd4-69b40e011d84
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
Reduce repeated async waits in PrCreateModal tests by centralizing initial-load synchronization.
- add a renderModalLoaded helper that waits for the AI title field once per test setup
- replace repeated findByDisplayValue calls with the shared helper in slow-path tests
- switch one post-load lookup from async findBy* to sync getBy* where loading is already guaranteed
Files changed:
.../components/__tests__/PrCreateModal.test.tsx | 22 ++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)
Fusion-Task-Id: FN-5727
Fusion-Task-Lineage: bf064b14-d625-4396-91e7-02d9eb48b9eb
Reduce runtime overhead in the GitHub Copilot authentication test by replacing slower user-event timing with deterministic timer control.
- import `act` from Testing Library to flush async state transitions explicitly
- switch the Copilot login/copy/open interactions in the target test from `userEvent.click` to `fireEvent.click`
- wrap the flow in `vi.useFakeTimers()`/`vi.useRealTimers()` and advance timers directly instead of waiting with a 5s timeout
- keep existing assertions for clipboard writes, toast feedback, GitHub link opening, and login code expiry behavior
Files changed:
.../components/__tests__/SettingsModal.test.tsx | 47 ++++++++++++++--------
1 file changed, 31 insertions(+), 16 deletions(-)
Fusion-Task-Id: FN-5726
Fusion-Task-Lineage: e9ccf2d0-d5a2-4568-abf5-7d9f7e67d643
Ensure Rooms scope reliably re-anchors to bottom on re-entry without breaking scroll preservation during refetch.
- reset stale thread anchor state when entering Rooms without an active room
- treat direct↔rooms transitions as entry events and anchor messages to bottom on entry
- keep existing scroll position when room messages are refetched in-place
- add regression tests covering room re-entry anchoring and refetch scroll preservation
Files changed:
packages/dashboard/app/components/ChatView.tsx | 14 +++-
.../app/components/__tests__/ChatView.test.tsx | 88 ++++++++++++++++++++++
2 files changed, 99 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-5720
Fusion-Task-Lineage: dde8818b-f2e5-4c55-8a4c-2c54241c2e38
macos-13 runners are too scarce — the darwin-x64 leg sat queued for hours
and blocked the release publish job (which needs all build legs). Ship the
CLI Apple-Silicon-only for macOS; desktop macOS DMG/ZIP stays universal.
Removed from release.yml + test-release.yml matrices, updated ci-workflow
assertions (5→4 targets) and RELEASING.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Switch task base-branch selection to prefer existing branches while preserving custom entry when needed.
- fetch local git branches for TaskForm and sort common integration branches (main/master/trunk/develop) first
- render base branch as a dropdown with default and Custom… options, with fallback custom input mode and toggle back to dropdown
- update TaskForm/NewTaskModal tests for branch loading, dropdown ordering, unknown-branch fallback, and fetch failure behavior
- document the new branch dropdown + custom fallback behavior in dashboard guide branch planning rules
Files changed:
docs/dashboard-guide.md | 4 +-
packages/dashboard/app/components/TaskForm.tsx | 100 +++++++++++++++++++--
.../app/components/__tests__/NewTaskModal.test.tsx | 1 +
.../app/components/__tests__/TaskForm.test.tsx | 66 +++++++++++++-
4 files changed, 156 insertions(+), 15 deletions(-)
Fusion-Task-Id: FN-5716
Fusion-Task-Lineage: 0ed72020-d8a0-4675-92d3-9476f53a173a
(b) Windows desktop build flakily failed with "Property 'ok'/'status' does
not exist on type 'Response'" because the workspace resolved multiple
@types/node versions (incl. an ancient 12.20.55 from @manypkg/find-root that
predates global fetch types). plugin-sdk compiles with lib:["ES2022"] and no
DOM lib, so Response comes solely from @types/node — nondeterministic across
runners. Pin via pnpm.overrides "@types/node": "^25.5.2"; collapses the
lockfile to one version. Verified: plugin-sdk build + desktop + full
workspace typecheck all pass.
Also: build-exe-cross tests cross-compiled all 5 platforms on every CI run
(auto-enabled via Boolean(process.env.CI)) — a release-build dependency in
the normal lane. Made them opt-in (FUSION_TEST_BUILD_EXE=1) and pointed the
root test:slow-cli at the CLI slow lane instead of test:pre-release, so
everyday CI no longer depends on release builds. test:pre-release and
test-release.yml still validate binaries deliberately.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
electron-builder's fpm target requires author 'email' in package.json;
without it the arm64/x64 .deb build failed (`Please specify author 'email'`).
Surfaced once the electron-builder --x64 --arm64 flags actually parsed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Second pass after the cache/arch fix unblocked `pnpm build` and surfaced
later-stage failures:
- Desktop packaging called `pnpm --filter @fusion/desktop dist:mac -- <args>`,
but pnpm leaks the `--` separator into the script args. electron-builder
stops parsing at `--`, so `--publish never` was ignored — it auto-published
to api.github.com/repos/gsxdsm/fusion/releases and 404'd. The same leak
dropped Linux's `--x64 --arm64`. Switch all four desktop packaging steps to
`pnpm --filter @fusion/desktop exec electron-builder ...`, which forwards
args cleanly (verified locally).
- Windows CLI signing now skips when WINDOWS_CERTIFICATE_BASE64 is absent,
mirroring the macOS guard (was hard-failing the bun-windows-x64 job).
- Desktop build spawns workspace .cmd bins with shell:true on Windows; Node
rejects .cmd/.bat spawns without a shell (EINVAL) since CVE-2024-27980,
which broke `@fusion/desktop build` on the Windows runner.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Improve the mission manager mobile stacked layout so mission rows reflow cleanly.
- make stacked mission list items switch to column layout with stretched content on mobile
- make stacked mission item actions full-width and wrapping instead of cramped inline controls
- make stacked mission run controls span full width
- add mobile CSS regression assertions for stacked-body mission cards and action controls
Files changed:
packages/dashboard/app/components/MissionManager.css | 16 ++++++++++++++++
packages/dashboard/app/components/__tests__/MissionManager.mobile-css.test.ts | 13 +++++++++++++
2 files changed, 29 insertions(+)
Fusion-Task-Id: FN-5711
Fusion-Task-Lineage: 76a20899-89fe-4aa9-8871-6b64c2521a0b
Ensure the first Quick Chat message reliably streams even when a stale sendMessage closure sees no active session.
- trigger a microtask flush for queued pre-session sends when a session is already active and no stream is running
- preserve existing streaming guards so flush only runs when safe
- add regression coverage for stale-closure first-send flow to verify stream start and completion behavior
Files changed:
.../app/hooks/__tests__/useQuickChat.test.ts | 47 ++++++++++++++++++++++
packages/dashboard/app/hooks/useQuickChat.ts | 12 ++++++
2 files changed, 59 insertions(+)
Fusion-Task-Id: FN-5710
Fusion-Task-Lineage: a4b32867-dedd-40f5-b6a8-3c71b9f7dee1
Ensure a user's first quick-chat message is preserved and sent once session initialization finishes.
- queue pre-session text sends as promise-backed pending work instead of returning early
- flush queued text after session activation and wire completion/rejection to the original send promise
- clear queued completion state on stream reset paths and add regression coverage for first-send-before-init flow
Files changed:
.../app/hooks/__tests__/useQuickChat.test.ts | 34 ++++++++++++++++++++
packages/dashboard/app/hooks/useQuickChat.ts | 37 ++++++++++++++++++++--
2 files changed, 69 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-5709
Fusion-Task-Lineage: 7598aa93-d127-4602-9571-02bc2a0cc5da
Adjust mobile keyboard bar flags so Android keeps the executor footer stacked above the nav bar while iOS retains collapse behavior.
- extract mobile bar keyboard flag computation into a dedicated utility
- keep nav keyboard pinning cross-platform while limiting footer keyboard-collapse to iOS
- add focused unit tests for Android/iOS/modal/desktop keyboard flag scenarios
- update ExecutorStatusBar keyboard-open test assertion and dashboard guide keyboard behavior notes
Files changed:
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/App.tsx | 23 ++++---
.../__tests__/ExecutorStatusBar.test.tsx | 6 +-
.../utils/__tests__/mobileBarKeyboardFlags.test.ts | 73 ++++++++++++++++++++++
.../dashboard/app/utils/mobileBarKeyboardFlags.ts | 36 +++++++++++
5 files changed, 129 insertions(+), 11 deletions(-)
Fusion-Task-Id: FN-5707
Fusion-Task-Lineage: ed01fcb0-d814-4595-9479-5baf97326ae7
Prevent the chat composer from showing a right-edge scrollbar line before it reaches the autosize cap.
- set chat textarea default overflow to hidden in ChatView CSS
- add resolveChatInputOverflowY to switch overflow to auto only past the 640px cap
- apply overflow mode during composer autosize updates
- extend chat input autosize tests and docs to cover overflow behavior
Files changed:
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/components/ChatView.css | 1 +
packages/dashboard/app/components/ChatView.tsx | 5 +++++
packages/dashboard/app/components/__tests__/ChatView.chat-input-autosize.test.tsx | 9 ++++++++-
4 files changed, 15 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-5706
Fusion-Task-Lineage: 4619aa30-c02f-453b-bdf2-f60f360e9372
Ensure task detail modal openings consistently register browser history so Android back swipe/button dismisses the modal from all entry paths.
- add a shared openDetailTaskWithNav callback in AppModals that opens task detail and pushes a modal close handler into navigation history
- route onboarding view-task, activity log open-task, and task-to-task detail navigation through the new history-aware opener
- extend AppModals tests with a navigation history wrapper and popstate assertions for onboarding/activity log/task-to-task flows
- document that these task detail entry points now participate in navigation history for consistent Android back behavior
Files changed:
docs/dashboard-guide.md | 1 +
packages/dashboard/app/components/AppModals.tsx | 21 ++++-
.../app/components/__tests__/AppModals.test.tsx | 101 ++++++++++++++++++++-
3 files changed, 115 insertions(+), 8 deletions(-)
Fusion-Task-Id: FN-5705
Fusion-Task-Lineage: fd0309ae-e0da-4489-95e4-c34699287e7c
Improve Mission Manager run-state UX by separating mission run controls from autopilot behavior.
- Group mission run settings in the detail view and add explicit Start mission / Stop mission / Resume mission buttons with contextual helper text.
- Humanize autopilot state labels (Off, Watching, Activating slice, Completing) and add explanatory autopilot description copy.
- Update Mission Manager styling to support the new run-settings layout and helper text blocks in list/detail views.
- Extend MissionManager tests to verify labeled run controls, endpoint wiring for start/stop/resume, and humanized autopilot badge labels.
- Update mission docs to clarify the distinction between mission run-state controls and the autopilot toggle.
Files changed:
docs/missions.md | 2 +-
packages/dashboard/app/components/MissionManager.css | 62 ++++-
packages/dashboard/app/components/MissionManager.tsx | 272 +++++++++++++--------
packages/dashboard/app/components/__tests__/MissionManager.test.tsx | 107 +++++++-
4 files changed, 330 insertions(+), 113 deletions(-)
Fusion-Task-Id: FN-5681
Fusion-Task-Lineage: 0dcac659-2eff-435b-a176-b66e7646b054
Prevent mission list descriptions from overflowing the stacked mobile layout and displacing adjacent controls.
- add a stacked-mobile MissionManager CSS rule that clamps mission description text to two lines
- apply the clamp to both the description container and nested markdown body content to preserve truncation behavior
- add a mobile CSS regression test that asserts the new clamp selectors and properties are present
Files changed:
packages/dashboard/app/components/MissionManager.css | 9 +++++++++
.../app/components/__tests__/MissionManager.mobile-css.test.ts | 9 +++++++++
2 files changed, 18 insertions(+)
Fusion-Task-Id: FN-5701
Fusion-Task-Lineage: b5f97fd3-7c9b-4c47-9165-0db3cf66c20f