The options parameter in __setCreateFnAgent's inline arrow already
uses any to match the module-level let (which has its own suppress
comment). Add the missing eslint-disable-next-line so CI passes.
Unrelated to the spinner fix — pre-existing on main.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The @keyframes spin and .animate-spin rules were incorrectly placed
inside the first :root {} block, which is invalid CSS — @keyframes
cannot be nested inside selector blocks. Browsers silently ignore
them in that position, so the spinners would still get stuck on pages
without component CSS loaded.
Moves the rules to the stylesheet top level between the two :root
blocks. Also fixes the mobile-css regression test that parses the
first :root block with a non-greedy regex.
Addresses review feedback from Greptile (P1) and CodeRabbit on PR #40.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The `.animate-spin` CSS utility class and `@keyframes spin` were only
defined in TaskCard.css but used by 25+ components (~60 instances).
On pages without a TaskCard rendered, the class didn't exist in the
stylesheet, causing all spinners to appear frozen.
Moves both the keyframes and utility class to the global styles.css
so they're available from the first paint regardless of which
components are loaded.
ClosesRunfusion/Fusion#39
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Backend
- chat.ts now routes both regular chat and QuickChat through
createResolvedAgentSession instead of branching to createFnAgent for
the no-runtime-hint case. This removes the divergent path where
pi-ai's cleanupSessionResources(sessionId) could tear down resources
the next generation depends on.
- sendMessage's finally only disposes the agent if it still owns the
activeGenerations slot. A newer generation that has pre-empted us
cleans up its own agent in its own finally — disposing here would
yank the underlying CLI process out from under it.
- __setCreateFnAgent test helper now mirrors its mock into the
createResolvedAgentSession slot so existing test setups still work
after the unification.
Frontend
- Extract createChatStreamHandlers (RAF coalescing, accumulators,
tool-call dedup, fallback handling) — useChat and useQuickChat were
duplicating ~85 LOC each. Both now compose the shared factory.
- Move shared chat types into chatTypes.ts. The hooks re-export them
for backward compatibility with existing consumers.
- Removed per-message Markdown/plain-text eye toggles. A single
thread-level toggle in the chat header now flips every assistant
bubble (including the streaming one) between rendered Markdown and
plain text.
- Model-only chats hide the per-message agent identity row entirely;
the model name is already in the thread header.
Tests
- Updated ChatView tests to reflect the new render-toggle contract
(single header toggle drives all bubbles) and the model-only avatar
suppression.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
req.on("close") was firing for healthy SSE connections in this
Node/Express setup, which cancelled the in-flight agent the client was
still listening to and made even msg #1 fail after a fresh reload.
Keep the beginGeneration (no dispose) change from the same commit —
that one's correct.
Closing the QuickChat browser tab mid-response left the backend agent
running with no listener. The `activeGenerations` slot persisted and the
next message's freshly-opened CLI SessionManager raced against the
lingering agent on the same session file, so the model produced no
output for the new prompt.
- POST /chat/sessions/:id/messages now calls cancelGeneration on
req.on("close") if the response hasn't ended yet, so disconnects stop
the agent promptly.
- beginGeneration only aborts the prior controller; it no longer
disposes the prior agent. Disposing pre-emptively could yank the CLI
process out from under the new generation's session opened on the
same file.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two related bugs left the Planning Mode modal stuck at partial height on
mobile. useModalResizePersist replayed desktop-saved pixel dimensions
that overrode the mobile 100dvh rule, and React reconciled removed CSS
custom properties to empty string rather than calling removeProperty(),
which on iOS Safari defeated the var() fallback after keyboard dismiss.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
After stopping a streaming chat reply, the next message would appear
sent but show no Stop button or "Connecting…" indicator. The cancel
broadcast from the prior generation was leaking into the new SSE
subscription and immediately marking it as errored.
Each `chatManager.sendMessage` now allocates a per-generation id;
`ChatStreamManager` only delivers tagged broadcasts to subscribers
from the matching generation. `sendMessage`'s cleanup also stops
deleting a newer generation's `activeGenerations` slot when an older
one finally unwinds.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Merges the documentation update for FN-3287, adding 2 lines to the dashboard README covering PR link visibility behavior. This completes Step 5 of the task.
Fusion-Task-Id: FN-3287
The merge adds expanded regression assertions for the org chart feature, covering agent CSS classes and mobile agents view components. The tests verify styling and layout behavior across both desktop and mobile contexts.
Fusion-Task-Id: FN-3472
This merge adds done-payload snapshot handling across the chat system (FN-3430), normalizing how final assistant messages are preserved and consumed in the dashboard hooks, plus it normalizes dashboard mailbox and user identity for inter-agent messaging (FN-3484) and introduces plugin workflow step
Fusion-Task-Id: FN-3430
This merge normalizes dashboard user identity and mailbox messaging (FN-3484, 4 steps), adds workflow step execution for plugins (FN-3490), and updates the restart integration store mock for plugin templates (FN-3096). Core changes touch the message store and store modules with identity normalizatio
Fusion-Task-Id: FN-3484
Updates the restart integration test mock to account for plugin template behavior, keeping the test in sync with recent plugin template changes.
Fusion-Task-Id: FN-3096
The merge normalizes button utility classes in AgentsView, swapping 12 lines of CSS class references for their standardized counterparts for consistency and maintainability.
Fusion-Task-Id: FN-3448
This merge introduces autosave for agent and task detail settings in the dashboard (`TaskDetailModal.tsx`, `AgentDetailView.tsx`), adds an agent self-improvement service with heartbeat evaluation logic (`agent-self-improve.ts`, `agent-heartbeat.ts`), and expands agent tools for direct-report managem
Fusion-Task-Id: FN-3382
Merged two commits completing the FN-3446 dashboard guide feature: the documentation was expanded with new view sections, and a regression test suite was added for the dashboard guide to prevent future regressions.
Fusion-Task-Id: FN-3446
Adds deterministic split-pane refresh behavior to the Agents views (AgentsView and AgentDetailView), with comprehensive test coverage for the mutation refreshes in the detail pane and the agents hook.
Fusion-Task-Id: FN-3466
Merges two features: the org chart full-view mode (layout, controls, and documentation for FN-3461) and a QMD refresh fix that synchronizes the query memory database after agent dream writes, normalizing agent memory behavior. The AgentsView UI and agent-tools were updated alongside the new memory-b
Fusion-Task-Id: FN-3461
- Adjust llama.cpp provider card markup and CSS to keep compact spacing aligned with list view and workflow styling updates
- Add regression tests for compact llama.cpp card layout behavior in dashboard component tests
- Expand merge error recovery tests in the engine to validate deduped auto-merge retry handling and related project-engine flow changes
- Update architecture/task management docs and include changeset metadata for auto-merge recovery dedup work
Fusion-Task-Id: FN-3431
- Expand architecture documentation for git route and custom provider APIs
- Revise ListView styles to use updated design-token driven spacing and sizing
- Refresh WorkflowResultsTab styling to align with workflow token revisions
Test-only merge for FN-3416: adds verification for auth route provider expectations, completing Step 2 of the task with no file changes reported.
Fusion-Task-Id: FN-3416
Added auto-claim setting UI to the Agent detail view with corresponding documentation in agents.md and test coverage for the new component behavior. The changeset marks this as a minor feature for the published `@runfusion/fusion` package.
Fusion-Task-Id: FN-3250
Merged two commits: relocated the new-task action button in ListView from the leading to trailing edge (FN-3486), and added a theme regression test for WorkflowResultsTab (FN-3462). Changes span ListView component and styles, WorkflowResultsTab CSS refactoring and tests, plus a dev-server-store upda
Fusion-Task-Id: FN-3486
Adds regression coverage for WorkflowResultsTab theme styling by moving a hardcoded box-shadow fallback into the global stylesheet and adding a test that validates the theme-specific status background renders correctly.
Fusion-Task-Id: FN-3462
Merged CSS changes that apply tokenized sizing and focus styles to InsightsView and DesktopModeChooser components, with the majority of changes in InsightsView.css.
Fusion-Task-Id: FN-3471
- Restore workspace llama-cpp extension path resolution in CLI command handling
- Add missing docs/README.md index entries and keep README/doc links aligned
- Add regression coverage for docs README index completeness and docker docs references
- Carry forward related workspace stability updates and test hardening from the branch
Fusion-Task-Id: FN-3433
This merge enables deletion of paused agents across the dashboard UI — adding delete controls to the AgentDetailView, AgentListModal, and AgentsView, with tests covering all three flows and a final typecheck compatibility fix.
Fusion-Task-Id: FN-3322
This merge lands four major features: the desktop app gains shell onboarding with remote mode support via a new `DesktopModeChooser` and `shell-settings` module (FN-3399); the dashboard gains full archived insights support with the `InsightsView` redesign and `useInsights` hook overhaul (FN-3315); C
Fusion-Task-Id: FN-3434
Adds test coverage for archived insights across the core store, `InsightsView` component, and `useInsights` hook — 156 lines of new tests covering FN-3315.
Fusion-Task-Id: FN-3315
Restores build stability in the dashboard workspace by updating `vite.config.ts` and `Board.tsx`, while updating the routes-auth test fixtures from anthropic to github-copilot models.
Fusion-Task-Id: FN-3417
Removes the standalone `DesktopShellBootstrap` component from the desktop package, routing desktop remote mode into the shell onboarding flow instead. Updates the corresponding test file to reflect the component removal and adjusts the README.
Fusion-Task-Id: FN-3399
Updates authentication route test fixtures to use "github-copilot" as the provider name instead of the previous value, ensuring tests align with the current auth provider configuration.
Fusion-Task-Id: FN-3413
Completes the commit body rendering in expanded git views within `GitManagerModal`, including updated component implementation and tests. The dashboard git routes and modal component now properly display full commit body content.
Fusion-Task-Id: FN-3301
Merges shell connection infrastructure across desktop and mobile (NativeShellConnectionManager, NativeShellOnboardingModal, connection-profiles and native-shell plugins), strengthens the research store lifecycle with expanded test coverage, enhances WorkflowStepManager with new UI, and adds document
Fusion-Task-Id: FN-3457
The merge lands Step 7 of FN-3398, adding documentation and delivery artifacts across the mobile and desktop packages with updated READMEs, mobile-specific docs, and architecture references.
Fusion-Task-Id: FN-3398
Docs(FN-3397): Documented the add-step chooser flow in the workflow steps reference, adding 9 lines to `docs/workflow-steps.md`.
Fusion-Task-Id: FN-3397
The project's ESLint flat config does not include the react-hooks plugin,
so referencing its rules in eslint-disable comments causes a "rule not found"
error. Replace with a plain comment preserving the intent.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Split the combined useEffect that handled both auto-start and
persisted-goal restoration into two separate effects:
- Goal restoration: depends only on [isOpen], runs once on modal open
- Auto-start: keeps handleStartInterview dep for initialGoalProp flow
Previously the single effect depended on handleStartInterview, which
recreates on every missionGoal change. Every keystroke re-triggered
the effect, which read the stale persisted value from localStorage
and overwrote user input — making the textarea uneditable and showing
stale data from the last planned mission.
Co-authored-by: AI <ai@runfusion.ai>
Co-authored-by: Orca <help@stably.ai>
This merge delivers three distinct features: a compact mobile header row for the dashboard with corresponding regression tests, a plugin slot registry with Docker node provisioning for the mesh network, and heartbeat agent sessions now support tool mode for expanded capability access.
Fusion-Task-Id: FN-3414