Fusion
19cdf7f448
feat(FN-2959): merge fusion/fn-2959-2
...
- Add custom provider CRUD routes (`POST/GET/PUT/DELETE /api/custom-providers`) with auth validation and storage in `~/.fusion/settings.json`; registers via `register-custom-provider-routes.ts`
- Add `CustomProviderForm` component for user-defined provider configuration (endpoint URL, API key, model ID); includes dedicated CSS
- Add custom provider section to `SettingsModal` under the "Models" tab with provider list and add/disable controls
- Add custom provider selection to `ModelOnboardingModal` onboarding flow so new users can use their own endpoints
- Add changeset (`custom-openai-anthropic-providers.md`) for `@runfusion/fusion` minor release
- Add unit tests for `CustomProviderForm`, `ModelOnboardingModal`, `SettingsModal`, custom-provider routes, and `useTasks` hook; update existing mocks
Commits merged:
- feat(FN-2959): complete Step 6 — add changeset and docs
- test(FN-2959): update settings modal mocks for custom provider API
- feat(FN-2959): complete Step 4 — add onboarding custom provider flow
- feat(FN-2959): complete Step 3 — add settings custom provider disclosure
- feat(FN-2959): complete Step 2 — add custom provider form component
- feat(FN-2959): complete Step 1 — add custom provider CRUD routes
- feat(FN-2975): merge fusion/fn-2975
Files changed:
.changeset/custom-openai-anthropic-providers.md | 5 +
packages/dashboard/app/api/legacy.ts | 41 ++++
.../app/components/CustomProviderForm.css | 45 ++++
.../app/components/CustomProviderForm.tsx | 203 ++++++++++++++++
.../app/components/ModelOnboardingModal.css | 14 ++
.../app/components/ModelOnboardingModal.tsx | 62 ++++-
.../dashboard/app/components/SettingsModal.css | 38 +++
.../dashboard/app/components/SettingsModal.tsx | 91 +++++++-
.../__tests__/CustomProviderForm.test.tsx | 60 +++++
.../__tests__/ModelOnboardingModal.test.tsx | 23 ++
.../components/__tests__/SettingsModal.test.tsx | 13 ++
.../__tests__/SettingsModalNodeRouting.test.tsx | 4 +
.../components/__tests__/settings-mobile.test.tsx | 4 +
.../dashboard/app/hooks/__tests__/useTasks.test.ts | 48 ++++
packages/dashboard/app/hooks/useTasks.ts | 4 +-
packages/dashboard/src/auth-paths.ts | 4 +
packages/dashboard/src/routes.ts | 2 +
.../__tests__/custom-provider-routes.test.ts | 118 ++++++++++
.../src/routes/register-custom-provider-routes.ts | 254 +++++++++++++++++++++
19 files changed, 1027 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-2959
2026-04-29 20:15:05 -07:00
Fusion
991a631738
feat(FN-2972): merge fusion/fn-2972
...
- `FileBrowserModal`: adds full file browser to modal view with multi-select, row/grid/list view toggle, sorting, path breadcrumb navigation, and inline path editing; wires it into `TaskDetailModal` attachment panel
- `TaskDetailModal`: adds attachment management tab with drag-and-drop file picker backed by the new FileBrowserModal; includes responsive CSS reflow for attachment list
- `QuickChatFAB`: restyles the FAB toggle and collapse animation; adds compact header control variant with consistent icon/button sizing
- `TaskDetailModal.css`, `QuickChatFAB.css`, `FileBrowser.css`: sizing and alignment refinements across header controls and FAB transitions
- `task.ts`: adds `getFilesDiff()` helper exported for use by the dashboard attachment panel
- Tests added for `FileBrowserModal`, `QuickChatFAB`, and `TaskDetailModal` attachment flow; `task.test.ts` covers the new `getFilesDiff()` function
- Minor `docs/cli-reference.md` update
Commits merged:
- feat(FN-2972): complete Step 3 — align header control sizing
- fix(FN-2972): complete Step 2 — align header toggle control sizing
- test(FN-2972): complete Step 3 — cover compact header controls
- feat(FN-2972): complete Step 2 — compact quick chat header controls
- feat(FN-2972): complete Step 1 — move mode toggle into header actions
- feat(FN-2973): merge fusion/fn-2973
- feat(FN-2924): merge fusion/fn-2924
Files changed:
docs/cli-reference.md | 3 +-
packages/cli/src/commands/__tests__/task.test.ts | 44 ++++-
packages/cli/src/commands/task.ts | 55 ++++++
packages/dashboard/app/components/FileBrowser.css | 65 +++++--
.../dashboard/app/components/FileBrowserModal.tsx | 106 ++++++++++-
packages/dashboard/app/components/QuickChatFAB.css | 60 +++++--
packages/dashboard/app/components/QuickChatFAB.tsx | 65 +++----
.../dashboard/app/components/TaskDetailModal.css | 40 +++++
.../dashboard/app/components/TaskDetailModal.tsx | 82 ++++++++-
.../components/__tests__/FileBrowserModal.test.tsx | 195 +++++++++++++++++++++
.../app/components/__tests__/QuickChatFAB.test.tsx | 32 ++++
.../components/__tests__/TaskDetailModal.test.tsx | 81 ++++++++-
12 files changed, 761 insertions(+), 67 deletions(-)
Fusion-Task-Id: FN-2972
2026-04-29 19:15:23 -07:00
Fusion
fd8005e99b
feat(FN-2973): merge fusion/fn-2973
...
- Add resizable split pane to desktop sidebar with drag handle and resize state management
- Style the desktop sidebar resize handle using CSS design tokens
- Add keyboard resize support to both desktop sidebar and file browser modal (arrow keys, Page Up/Down)
- Tokenize FileBrowser styles following the dashboard CSS architecture; replace hardcoded values with CSS variables
- Add accessibility handling for resize handles including focus states and keyboard interactions
- Add FileBrowserModal tests covering keyboard resize behavior and accessibility patterns
Commits merged:
- test(FN-2973): complete Step 3 — cover keyboard resize and handle accessibility
- feat(FN-2973): complete Step 2 — tokenized file browser styles and handle focus state
- feat(FN-2973): complete Step 1 — add keyboard resize support
- test(FN-2973): complete Step 3 — add resizable split coverage
- feat(FN-2973): complete Step 2 — style desktop sidebar resize handle
- feat(FN-2973): complete Step 1 — add desktop sidebar resize state and handle
Files changed:
packages/dashboard/app/components/FileBrowser.css | 65 +++++--
.../dashboard/app/components/FileBrowserModal.tsx | 106 ++++++++++-
.../components/__tests__/FileBrowserModal.test.tsx | 195 +++++++++++++++++++++
3 files changed, 352 insertions(+), 14 deletions(-)
Fusion-Task-Id: FN-2973
2026-04-29 19:09:55 -07:00
Fusion
7885f16066
feat(FN-2924): merge fusion/fn-2924
...
- Add task provenance display to TaskDetailModal, surfacing AI-generated merge commit summaries so users understand when and why tasks landed
- New `ai-summarize` module in core with structured commit summarization logic and tests
- Extend CLI `fn task show` with provenance output
- Refactor merger to produce cleaner merge commit messages with task context
- Update SettingsModal to expose AI summarization toggle (hidden behind feature flag)
- Adjust QuickChatFAB styling for theme compatibility
- Update scheduler and node-routing policy tests to match new behavior
- Add changeset for `@runfusion/fusion` minor release
Commits merged:
- feat(FN-2924): display task provenance in dashboard and cli
- feat(FN-2971): merge fusion/fn-2971
- feat(FN-2947): merge fusion/fn-2947
- feat(FN-2970): merge fusion/fn-2970
- feat(FN-2956): merge fusion/fn-2956
Files changed:
.changeset/add-ai-merge-commit-summary.md | 5 +
docs/cli-reference.md | 3 +-
docs/settings-reference.md | 3 +
packages/cli/src/commands/__tests__/task.test.ts | 44 ++++-
packages/cli/src/commands/task.ts | 55 +++++++
packages/core/src/__tests__/ai-summarize.test.ts | 64 ++++++++
packages/core/src/ai-summarize.ts | 114 +++++++++++++
packages/core/src/index.ts | 3 +
packages/core/src/settings-schema.ts | 1 +
packages/core/src/types.ts | 4 +
packages/dashboard/app/components/QuickChatFAB.css | 17 +-
packages/dashboard/app/components/QuickChatFAB.tsx | 2 +-
.../dashboard/app/components/SettingsModal.css | 11 +-
.../dashboard/app/components/SettingsModal.tsx | 22 ++-
.../dashboard/app/components/TaskDetailModal.css | 40 +++++
.../dashboard/app/components/TaskDetailModal.tsx | 82 +++++++++-
.../__tests__/SettingsModalNodeRouting.test.tsx | 12 +-
.../components/__tests__/TaskDetailModal.test.tsx | 81 ++++++++-
packages/engine/src/__tests__/merger.test.ts | 75 +++++++++
.../src/__tests__/node-routing-policy.test.ts | 25 ++-
.../src/__tests__/scheduler-node-routing.test.ts | 18 +-
packages/engine/src/merger.ts | 181 +++++++++------------
packages/engine/src/scheduler.ts | 8 +-
23 files changed, 723 insertions(+), 147 deletions(-)
Fusion-Task-Id: FN-2924
2026-04-29 18:01:59 -07:00
Fusion
42276db737
feat(FN-2970): merge fusion/fn-2970
...
- CSS: fix margin on the node routing description in SettingsModal (`SettingsModal.css`)
- Dashboard: add CSS regression test for node routing description alignment (`SettingsModalNodeRouting.test.tsx`)
- Engine: update node routing policy and scheduler logic for improved routing behavior (`scheduler.ts`)
- Engine: update node routing policy tests and scheduler routing tests to cover new behavior
Commits merged:
- test(FN-2970): add CSS regression test for node routing description
- fix(FN-2970): fix settings node routing description margin
- feat(FN-2956): merge fusion/fn-2956
Files changed:
.../dashboard/app/components/SettingsModal.css | 11 +++++++++-
.../__tests__/SettingsModalNodeRouting.test.tsx | 12 +++++++++--
.../src/__tests__/node-routing-policy.test.ts | 25 +++++++++++++++++++---
.../src/__tests__/scheduler-node-routing.test.ts | 18 ++++++++--------
packages/engine/src/scheduler.ts | 8 ++++---
5 files changed, 56 insertions(+), 18 deletions(-)
Fusion-Task-Id: FN-2970
2026-04-29 17:34:26 -07:00
Fusion
a285c2988b
feat(FN-2923): merge fusion/fn-2923
...
- Add task `source` provenance field tracking how tasks enter the system (e.g. `"manual"`, `"heartbeat"`, `"executor"`, `"triage"`, `"cron"`, `"routine"`)
- Wire `source` into shared create-task tools, executor agent, triage agent, cron runner, and routine runner
- Add `source` to heartbeat task creation in `agent-heartbeat.ts` and mission execution loop in `mission-execution-loop.ts`
- Wire `source` field into dashboard routes (`register-planning-subtask-routes.ts`, `register-task-workflow-routes.ts`) and GitHub integration (`register-git-github.ts`)
- Add `source` to the API layer and task store handlers in the dashboard
- Expose `source` in the `fn` CLI task command and `task-plan` extension tool
- Add integration tests for provenance across engine (agent-tools, agent-heartbeat, cron-runner, triage, pr-comment-handler) and dashboard routes
- Update existing tests to assert the correct source values
- Bulk-revert stale changeset files that were superseded by the v0.9.1 release commit
Commits merged:
- test(FN-2923): complete Step 14 — align tests with task source provenance
- test(FN-2923): complete Steps 12-13 — update and add provenance tests
- feat(FN-2923): complete Step 10 — wire CLI task provenance
- feat(FN-2923): complete Step 9 — wire dashboard UI and API source fields
- feat(FN-2923): complete Step 8 — wire dashboard route provenance
- feat(FN-2923): complete Step 7 — wire remaining engine provenance
- feat(FN-2923): complete Step 6 — add routine create-task provenance
- feat(FN-2923): complete Step 5 — add cron create-task provenance
- feat(FN-2923): complete Step 4 — add triage subtask source
- feat(FN-2923): complete Step 3 — add executor create-task source
- feat(FN-2923): complete Step 2 — add heartbeat task provenance
- feat(FN-2923): complete Step 1 — add provenance to shared create-task tools
- feat(FN-2945): merge fusion/fn-2945
- chore(release): v0.9.1
Files changed:
.changeset/active-agents-no-stuck-connecting.md | 13 ---
.changeset/active-agents-panel-hoist-heartbeat.md | 13 ---
.changeset/fix-agent-heartbeat-terminal-links.md | 5 --
.changeset/fix-experimental-defaults.md | 5 --
.changeset/improve-git-manager-diff-pane.md | 5 --
.changeset/insights-two-pane-layout.md | 5 --
.changeset/show-planning-tasks-immediately.md | 5 --
CHANGELOG.md | 92 ++++++++++++++++++++++
package.json | 2 +-
packages/cli-alias/CHANGELOG.md | 15 ++++
packages/cli-alias/package.json | 2 +-
packages/cli/CHANGELOG.md | 12 +++
packages/cli/package.json | 2 +-
packages/cli/src/__tests__/task-plan.test.ts | 1 +
packages/cli/src/commands/__tests__/task.test.ts | 15 +++-
packages/cli/src/commands/task.ts | 15 +++-
packages/cli/src/extension.ts | 9 +++
packages/core/CHANGELOG.md | 7 ++
packages/core/package.json | 2 +-
packages/dashboard/CHANGELOG.md | 14 ++++
.../app/__tests__/agent-css-classes.test.ts | 3 +-
packages/dashboard/app/__tests__/api.test.ts | 13 +++
packages/dashboard/app/api/legacy.ts | 2 +
packages/dashboard/app/components/AgentsView.css | 22 +++---
.../app/components/ModelOnboardingModal.tsx | 5 +-
packages/dashboard/app/components/TodoView.tsx | 2 +
.../__tests__/ModelOnboardingModal.test.tsx | 4 +-
.../app/components/__tests__/QuickChatFAB.test.tsx | 14 +---
.../app/components/__tests__/TodoView.test.tsx | 4 +-
.../__tests__/agents-view-mobile.test.tsx | 5 +-
.../components/__tests__/onboarding-flow.test.tsx | 2 +-
.../app/hooks/__tests__/useTaskHandlers.test.ts | 4 +-
packages/dashboard/app/hooks/useTaskHandlers.ts | 4 +-
packages/dashboard/package.json | 2 +-
packages/dashboard/src/__tests__/routes.test.ts | 14 ++++
packages/dashboard/src/routes.ts | 4 +
.../dashboard/src/routes/register-git-github.ts | 12 +++
.../src/routes/register-planning-subtask-routes.ts | 3 +
.../src/routes/register-task-workflow-routes.ts | 7 ++
packages/desktop/CHANGELOG.md | 7 ++
packages/desktop/package.json | 2 +-
packages/engine/CHANGELOG.md | 11 +++
packages/engine/package.json | 2 +-
.../engine/src/__tests__/agent-heartbeat.test.ts | 10 +++
.../src/__tests__/agent-tools-delegation.test.ts | 2 +
packages/engine/src/__tests__/agent-tools.test.ts | 37 +++++++++
packages/engine/src/__tests__/cron-runner.test.ts | 4 +
.../src/__tests__/pr-comment-handler.test.ts | 8 ++
packages/engine/src/__tests__/triage.test.ts | 2 +
packages/engine/src/agent-heartbeat.ts | 13 ++-
packages/engine/src/agent-tools.ts | 13 ++-
packages/engine/src/cron-runner.ts | 7 +-
packages/engine/src/executor.ts | 2 +-
packages/engine/src/mission-execution-loop.ts | 8 ++
packages/engine/src/pr-comment-handler.ts | 5 ++
packages/engine/src/project-engine.ts | 8 ++
packages/engine/src/routine-runner.ts | 4 +
packages/engine/src/triage.ts | 4 +
packages/mobile/CHANGELOG.md | 7 ++
packages/mobile/package.json | 2 +-
packages/pi-claude-cli/CHANGELOG.md | 7 ++
packages/pi-claude-cli/package.json | 2 +-
packages/plugin-sdk/CHANGELOG.md | 10 +++
packages/plugin-sdk/package.json | 2 +-
.../examples/fusion-plugin-auto-label/CHANGELOG.md | 8 ++
.../examples/fusion-plugin-auto-label/package.json | 2 +-
.../examples/fusion-plugin-ci-status/CHANGELOG.md | 8 ++
.../examples/fusion-plugin-ci-status/package.json | 2 +-
.../fusion-plugin-notification/CHANGELOG.md | 8 ++
.../fusion-plugin-notification/package.json | 2 +-
.../fusion-plugin-settings-demo/CHANGELOG.md | 8 ++
.../fusion-plugin-settings-demo/package.json | 2 +-
plugins/fusion-plugin-hermes-runtime/CHANGELOG.md | 8 ++
plugins/fusion-plugin-hermes-runtime/package.json | 2 +-
.../fusion-plugin-openclaw-runtime/CHANGELOG.md | 8 ++
.../fusion-plugin-openclaw-runtime/package.json | 2 +-
.../fusion-plugin-paperclip-runtime/CHANGELOG.md | 8 ++
.../fusion-plugin-paperclip-runtime/package.json | 2 +-
78 files changed, 499 insertions(+), 115 deletions(-)
Fusion-Task-Id: FN-2923
2026-04-29 17:23:22 -07:00
Fusion
8d559fb079
feat(FN-2945): merge fusion/fn-2945
...
- Fix org chart connector alignment in `AgentsView.css` — connectors now properly align with their target nodes
- Update `agent-css-classes.test.ts` and `agents-view-mobile.test.tsx` to reflect CSS class changes
Commits merged:
- fix(FN-2945): complete Step 2 — pass lint test typecheck build gates
- fix(FN-2945): complete Step 1 — align org chart connector geometry
- fix(FN-2945): complete Step 1 — align org chart connectors
Files changed:
.../app/__tests__/agent-css-classes.test.ts | 3 ++-
packages/dashboard/app/components/AgentsView.css | 22 +++++++++++-----------
.../__tests__/agents-view-mobile.test.tsx | 5 ++---
3 files changed, 15 insertions(+), 15 deletions(-)
Fusion-Task-Id: FN-2945
2026-04-29 16:55:20 -07:00
gsxdsm
c6d67b9e1c
fix(dashboard): rework Insights view with two-pane layout
...
- Categories list in a left sidebar; insights for the selected category
render in a scrollable right pane (mobile collapses sidebar to a
horizontal chip rail and keeps the header on a single row).
- Removed -webkit-line-clamp on insight content so full text shows.
- Fixed scroll: added min-height: 0 to flex containers.
- Larger icons (20px) inside per-insight action buttons; close button
switched off the invisible btn-icon styling.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 16:25:30 -07:00
gsxdsm
118a03a34d
fix(FN-XXX): keep experimental views off by default
2026-04-29 16:11:59 -07:00
Fusion
fb31f37b99
feat(FN-2943): improve auth UX, agent panel status, and task lifecycle handling
...
- Add settings content scroll refs and trigger scroll-to-top after successful sign-in and sign-up flows with regression coverage
- Keep task card merge timers live during active merges and add SSE support for task timing refresh
- Hoist Active Agents panel above the main list, add next-heartbeat visibility, and fix stale "Connecting..." card states
- Enforce unavailable-node scheduling guards and reset task steps when reopening tasks to triage or todo
Fusion-Task-Id: FN-2943
2026-04-29 14:41:28 -07:00
gsxdsm
e946ce9a89
feat(dashboard): hoist Active Agents panel above main list, show next heartbeat
...
Move ActiveAgentsPanel between AgentMetricsBar and the main agent
collection so live work is visible without scrolling past the whole
agent directory. Add a "Next heartbeat in Xs" line to each card
footer (or "Heartbeat overdue" when negative), driven by
runtimeConfig.heartbeatIntervalMs with the dashboard default fallback.
Give cards a pointer cursor + hover/focus styling so the existing
click-to-select behavior is discoverable.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 14:26:58 -07:00
gsxdsm
76deb488ed
fix(dashboard): unstick Active Agents panel cards from "Connecting..."
...
Agents in `active` state without a current taskId had no SSE to attach
to, but the card still rendered "Connecting..." — implying a network
state that never resolves. Branch on taskId first: idle agents show
"Idle — no task assigned"; running-without-task shows "Starting...".
Also fix a related SSE multiplexer race: subscribers joining a channel
that had already opened never got an onOpen callback (EventSource only
fires `open` once), so they sat at isConnected=false forever whenever
another component was already streaming the same URL. Fire onOpen on a
microtask for late-joiners.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 14:23:58 -07:00
gsxdsm
5542684370
fix(dashboard): keep card timer live while task is actively merging
...
The in-review timer chip was driven by per-step instrumented duration,
which is frozen during a merge (the merge phase isn't tracked as a
workflow step). A stuck merge could read "3m" indefinitely. While
status is "merging"/"merging-pr", show live elapsed since updatedAt
(set by the merger at status flip) with a "Merging Nm" tooltip.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 14:02:24 -07:00
Fusion
17a072c924
feat(FN-2920): improve remote tunnel setup and heartbeat scheduling
...
- Add cloudflared install/detection support in remote settings API, UI, and route tests
- Surface Cloudflare tunnel prerequisites in Settings modal with remote access docs updates
- Harden heartbeat runtime scheduling by avoiding stale timeout state and simplifying runtime timeout handling
- Expand CLI/core/dashboard/engine coverage for task lifecycle, agent health, and runtime heartbeat behavior
- Add changesets for heartbeat scheduling fixes and PR approval setting updates
Fusion-Task-Id: FN-2920
2026-04-29 13:49:35 -07:00
gsxdsm
79e4ce4617
feat(dashboard): auto-detect tailscale target port; clearer scan block
...
* Drop the Target port field from Settings — the dashboard already knows
what port it's serving on, so use window.location.port (falling back
to 80/443 by protocol). A user-overridable port adds no value and a
stale stored value silently misroutes the funnel.
* Restructure the running-tunnel scan block to show three rows: the
raw tailnet URL, the remote access code (rt= token, separate), and
the QR image. Previously the auth URL was rendered as one long string
that read as "the bare hostname" when truncated.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 13:33:13 -07:00
Fusion
23e2c2514e
feat(FN-2932): improve active agent visibility and grouped tool-call UX
...
- Preserve and emphasize active agent card highlights across hover and modal states, with dedicated CSS updates and regression tests
- Expand dashboard and TUI activity surfaces for grouped tool-call and live agent status/log visibility, including Quick Chat and chat view refinements
- Add route and runtime updates for agent/settings flows plus self-healing coverage for merge recovery behavior
- Include accompanying changesets and test stabilizations for mission activity assertions and active highlight hooks
Fusion-Task-Id: FN-2932
2026-04-29 13:29:00 -07:00
Fusion
ddd6b90777
feat(FN-2926): enhance grouped tool-call UX across dashboard and TUI
...
- Inline grouped tool-call rendering in chat surfaces and update summary logic for clearer aggregation
- Refine chat, quick FAB, settings, and agents UI styles/behavior with matching test coverage updates
- Extend dashboard TUI state/controller flow with status and shortcut improvements
- Update engine and dashboard route handling related to agent runs, settings memory sync, and remote access adapters
Fusion-Task-Id: FN-2926
2026-04-29 13:23:31 -07:00
gsxdsm
256e54dfef
feat(remote): real QR codes, live tailscale URL, TUI status & shortcut
...
* Replace placeholder /remote/qr SVG (URL drawn as text) with real QR
rendered via the qrcode package; add format=terminal returning ASCII
QR for the TUI.
* Resolve the public tailscale funnel URL from captured CLI output
instead of constructing http://<hostname>:<port> from a configured
hostname label — that label was never used by `tailscale funnel` and
produced a non-public URL in the auth/QR link.
* Drop hostname requirement from engine + UI; only target port matters.
* Tighten tailscale parseReadiness to require a URL on the matched line
so the tunnel manager doesn't lock in `running` before the URL line.
* TUI: poll remote status, show ● tunnel indicator + URL in MainHeader,
bind Ctrl+Q to a global QR overlay (terminal ASCII), and switch the
in-Settings K shortcut to render the same ASCII QR.
* Auto-poll remote status in the dashboard while in `starting`/`stopping`
so the UI flips to running without reopening the modal.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 13:20:03 -07:00
Fusion
a45a2268a6
feat(FN-2925): merge fusion/fn-2925
...
- Mobile header row polish: finalize QuickChatFAB CSS for mobile viewport handling, apply visual viewport height to quick chat panel, remove duplicate keyboard overlap subtraction
- Add `node-routing-policy.ts` with routing logic for mesh network nodes; expand scheduler node-routing tests with new policy coverage
- Improve reviewer decision logic and add reviewer test cases for changed behavior
- Refactor triage module (48 lines changed) with updated agent selection logic
- Update `AgentsView` component and styles; add `AgentsView.test.tsx` integration test
- Simplify `QuickChatFAB.test.tsx` test by removing CSS class permutation coverage
- Update architecture docs and settings reference to reflect new routing capabilities
Commits merged:
- fix(FN-2925): remove duplicate keyboard overlap subtraction
- feat(FN-2925): complete Step 5 — finalize mobile header row polish
- fix(FN-2925): apply visual viewport height to mobile quick chat panel
- feat(FN-2903): merge fusion/fn-2903
- feat(FN-2950): merge fusion/fn-2950
Files changed:
docs/architecture.md | 19 +--
docs/settings-reference.md | 2 +-
packages/dashboard/app/components/AgentsView.css | 20 +++-
packages/dashboard/app/components/AgentsView.tsx | 11 +-
packages/dashboard/app/components/QuickChatFAB.css | 32 ++++-
.../dashboard/app/components/SettingsModal.tsx | 4 +-
.../app/components/__tests__/AgentsView.test.tsx | 37 ++++++
.../app/components/__tests__/QuickChatFAB.test.tsx | 18 +--
.../src/__tests__/node-routing-policy.test.ts | 78 ++++++++++++
packages/engine/src/__tests__/reviewer.test.ts | 19 ++-
.../src/__tests__/scheduler-node-routing.test.ts | 131 ++++++++++++++++++++-
packages/engine/src/__tests__/triage.test.ts | 16 +--
packages/engine/src/node-routing-policy.ts | 45 +++++++
packages/engine/src/reviewer.ts | 33 ++++--
packages/engine/src/scheduler.ts | 44 ++++++-
packages/engine/src/triage.ts | 48 ++++----
16 files changed, 473 insertions(+), 84 deletions(-)
Fusion-Task-Id: FN-2925
2026-04-29 12:53:10 -07:00
gsxdsm
40e36f00ec
feat(FN-2903): merge fusion/fn-2903
2026-04-29 12:31:09 -07:00
Fusion
5c82bd65f9
feat(FN-2953): merge fusion/fn-2953
...
Commits merged:
- merge fusion/fn-2953
Fusion-Task-Id: FN-2953
2026-04-29 12:12:05 -07:00
gsxdsm
03b406676a
fix(FN-2877): restore task card timing and changes fallbacks
2026-04-29 11:42:37 -07:00
Fusion
171466e860
feat(FN-2910): merge fusion/fn-2910
...
Commits merged:
- merge fusion/fn-2910
Fusion-Task-Id: FN-2910
2026-04-29 10:20:34 -07:00
Fusion
9ed8402d63
feat(FN-2957): merge fusion/fn-2957
...
- test(FN-2957): complete Step 3 — cover bdo path rendering and CSS truncation
Fusion-Task-Id: FN-2957
2026-04-29 09:46:16 -07:00
Fusion
2865002e85
feat(FN-2853): merge fusion/fn-2853
...
- test(FN-2853): complete Step 1 — expand RoutingTab coverage
Fusion-Task-Id: FN-2853
2026-04-29 09:29:26 -07:00
Fusion
2c160a7f78
feat(FN-2958): merge fusion/fn-2958
...
- test(FN-2958): complete Step 2 — cover merging pinning sort behavior
Fusion-Task-Id: FN-2958
2026-04-29 09:21:30 -07:00
Fusion
91f9f208ad
feat(FN-2731): merge fusion/fn-2731
...
- feat(FN-2731): add changeset for multi-node routing feature
- feat(FN-2730): merge fusion/fn-2730
- feat(FN-2729): merge fusion/fn-2729
- chore(release): v0.8.4
- chore(dashboard): tidy stray workspace artifacts
- refactor(core,merger): consolidate AI commit-body summarization into ai-summarize.ts
- feat(merger,dashboard): use title-summarization model for commit body AI + reword settings
- fix(engine): guarantee non-empty merge commit body via AI fallback cascade
- fix(FN-XXX): sync workspace version on release
- feat(FN-2729): unify node status indicator with NodeHealthDot
- fix(FN-0000): harden sqlite startup validation
- fix(FN-XXX): align tui startup update check
- fix(FN-XXX): harden windows path handling
- fix(engine): tighten Layer 3 — pass safety constraint into AI prompt + harden Layer 2 restore
- feat(FN-2944): merge fusion/fn-2944
- fix(engine): auto-recover from squash-merge orphan rebase failures
- feat(FN-2948): merge fusion/fn-2948
- feat(FN-2939): merge fusion/fn-2939
- feat(FN-2946): merge fusion/fn-2946
- feat(FN-2941): merge fusion/fn-2941
- feat(FN-2938): merge fusion/fn-2938
- feat(FN-2929): merge fusion/fn-2929
- feat(FN-2934): merge fusion/fn-2934
- feat(FN-2930): merge fusion/fn-2930
- feat(FN-2928): merge fusion/fn-2928
- feat(FN-2927): merge fusion/fn-2927
- feat(FN-2916): streamline Cloudflare quick tunnel settings UX
- feat(FN-2913): merge fusion/fn-2913
- feat(FN-2911): merge fusion/fn-2911
- feat(FN-2901): merge fusion/fn-2901
- feat(FN-2729): merge fusion/fn-2729
Fusion-Task-Id: FN-2731
2026-04-29 09:16:23 -07:00
Fusion
4e8fb92bab
feat(FN-2730): merge fusion/fn-2730
...
- fix(FN-2729): silence ansi strip lint warning
- test(FN-2729): complete Step 10 — cover node health indicators
- feat(FN-2729): complete Step 9 — colorize CLI node status output
- feat(FN-2729): complete Step 8 — use NodeHealthDot in settings routing status
- test(FN-2729): align ListView node override option expectations
- feat(FN-2729): complete Step 7 — add bulk node status indicators
Fusion-Task-Id: FN-2730
2026-04-29 09:11:44 -07:00
Fusion
910d5e9a9d
feat(FN-2729): merge fusion/fn-2729
...
- feat(FN-2729): align routing lock and bulk node status indicator
- feat(FN-2729): complete Step 4 — remove duplicated node status CSS
- feat(FN-2729): complete Step 3 — add routing summary health dot
- feat(FN-2729): complete Step 2 — adopt NodeHealthDot in InlineCreateCard
- feat(FN-2729): complete Step 1 — adopt NodeHealthDot in TaskForm
Fusion-Task-Id: FN-2729
2026-04-29 09:05:04 -07:00
gsxdsm
0576b10658
chore(dashboard): tidy stray workspace artifacts
...
Two pre-existing local modifications that had been sitting in the
working tree across this session, neither produced by the recovery /
fallback work in adjacent commits. Committing them so the tree is clean.
- packages/dashboard/app/components/SettingsModal.css
Removes one trailing blank line at end-of-file. No semantic change.
- packages/dashboard/app/components/__tests__/ListView.test.tsx
Drops one test case ("shows NodeHealthDot for selected bulk node
override", 15 lines) from the "ListView - Bulk Selection" describe
block. The test asserted that selecting a bulk node override
rendered a `.status-dot--online` indicator in the DOM. Sibling tests
(option labels, batchUpdateTaskModels invocation) are preserved.
Likely debris from the FN-2729 NodeHealthDot work that didn't survive
one of the in-flight squash merges; the underlying behavior is still
exercised by the kept tests.
Verified: pnpm --filter @fusion/dashboard test ListView passes
(125/125), so the removed assertion isn't load-bearing.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 08:57:44 -07:00
Fusion
d149f45c93
feat(FN-2729): unify node status indicator with NodeHealthDot
...
- Resolve merge conflicts in InlineCreateCard and QuickEntryBox using the existing node picker UX
- Replace ad-hoc node status rendering with NodeHealthDot in task creation surfaces
- Keep advanced quick-create controls and portal-based dropdown behavior intact
- Preserve related dashboard styling and tests included in the staged squash
Fusion-Task-Id: FN-2729
2026-04-29 08:15:01 -07:00
Fusion
f577b4a4f7
feat(FN-2948): merge fusion/fn-2948
...
- feat(FN-2948): complete Step 5 — apply review feedback and finalize delivery
- test(FN-2948): complete Step 3 — update insights section visibility coverage
- feat(FN-2948): complete Step 2 — enhance insight item readability
- feat(FN-2948): complete Step 1 — hide empty insight sections
- feat(FN-2939): merge fusion/fn-2939
- feat(FN-2946): merge fusion/fn-2946
Fusion-Task-Id: FN-2948
2026-04-29 02:42:57 -07:00
Fusion
6ec0b23cb5
feat(FN-2941): merge fusion/fn-2941
...
- feat(FN-2941): complete Step 6 — apply review feedback
Fusion-Task-Id: FN-2941
2026-04-29 02:10:51 -07:00
Fusion
ba09646c2d
feat(FN-2934): merge fusion/fn-2934
...
- test(FN-2934): complete Step 2 — cover paused triage actions visibility
- feat(FN-2934): complete Step 1 — show actions for paused triage tasks
- feat(FN-2930): merge fusion/fn-2930
Fusion-Task-Id: FN-2934
2026-04-29 01:11:05 -07:00
Fusion
43c5d91c0a
feat(FN-2928): merge fusion/fn-2928
...
- test(FN-2928): complete Step 2 — assert hidden usage rows use display none
- fix(FN-2928): complete Step 1 — collapse hidden usage window layout
- feat(FN-2927): merge fusion/fn-2927
Fusion-Task-Id: FN-2928
2026-04-29 00:31:46 -07:00
Fusion
3d277afb90
feat(FN-2927): merge fusion/fn-2927
...
- test(FN-2927): complete Step 3 — cover keyboardOpen mobile nav behavior
- feat(FN-2927): complete Step 2 — wire keyboard state into mobile nav
- feat(FN-2927): complete Step 1 — add keyboardOpen hide behavior
- feat(FN-2916): streamline Cloudflare quick tunnel settings UX
- feat(FN-2913): merge fusion/fn-2913
Fusion-Task-Id: FN-2927
2026-04-29 00:23:29 -07:00
Fusion
3ca287851e
feat(FN-2916): streamline Cloudflare quick tunnel settings UX
...
- Default Cloudflare remote access to Quick Tunnel mode in settings documentation
- Replace the Quick Tunnel checkbox with an Advanced (Named Tunnel) details disclosure in SettingsModal
- Auto-sync quick tunnel state from the details open/close state while preserving named tunnel field editing
- Update SettingsModal tests to cover the new advanced-toggle behavior and persisted quick tunnel payload
Fusion-Task-Id: FN-2916
2026-04-29 00:12:35 -07:00
Fusion
d44b688260
feat(FN-2913): merge fusion/fn-2913
...
- feat(FN-2913): complete Step 7 — align InlineCreateCard node picker UX
Fusion-Task-Id: FN-2913
2026-04-29 00:09:39 -07:00
Fusion
898bbcb20c
feat(FN-2901): merge fusion/fn-2901
...
- fix(FN-2901): reset source issue collapse state on task change
- fix(FN-2901): use issue number in collapsed source issue summary
- feat(FN-2901): complete Step 5 — finalize source issue toggle UX
- test(FN-2901): complete Step 4 — verify collapsible source issue behavior
- feat(FN-2901): complete Step 3 — style collapsible source issue header
- feat(FN-2901): complete Step 2 — add collapsible source issue section
- feat(FN-2901): complete Step 1 — update lucide imports
- feat(FN-2729): merge fusion/fn-2729
- fix(engine): prevent auto-merge cooldown loop on unresolvable conflicts
- feat(FN-2911): improve chat attachment compose and preview UX
Fusion-Task-Id: FN-2901
2026-04-28 23:31:23 -07:00
Fusion
19d787d74d
feat(FN-2729): merge fusion/fn-2729
...
- fix(FN-2729): silence ansi strip lint warning
- test(FN-2729): complete Step 10 — cover node health indicators
- feat(FN-2729): complete Step 9 — colorize CLI node status output
- feat(FN-2729): complete Step 8 — use NodeHealthDot in settings routing status
- test(FN-2729): align ListView node override option expectations
- feat(FN-2729): complete Step 7 — add bulk node status indicators
- fix(engine): prevent auto-merge cooldown loop on unresolvable conflicts
- feat(FN-2911): improve chat attachment compose and preview UX
- feat(FN-2921): merge fusion/fn-2921
- feat(FN-2909): merge fusion/fn-2909
- feat(FN-2914): merge fusion/fn-2914
- feat(FN-2902): merge fusion/fn-2902
- chore(release): v0.8.3
- Update changeset
- fix(tui): swap 3/4 panel hotkeys so they match the help text
- fix(tui): always show auth token and report accurate macOS memory usage
Fusion-Task-Id: FN-2729
2026-04-28 23:23:34 -07:00
Fusion
d155b8964a
feat(FN-2911): improve chat attachment compose and preview UX
...
- Add attachment-first chat compose flow with paperclip picker, drag-and-drop, and paste support in ChatView input
- Render pending attachment preview chips with per-file remove actions and drag-over visual affordance
- Display sent message attachments with image/file presentation and accessible focus/interaction styling
- Update ChatView tests and icon mocks to cover attachment-only sends, file selection, and preview behavior
Fusion-Task-Id: FN-2911
2026-04-28 23:11:22 -07:00
Fusion
7e8b39353c
feat(FN-2902): merge fusion/fn-2902
...
- feat(FN-2902): complete Step 6 — address review feedback
- test(FN-2902): stabilize bundle-output assertions for pi-claude-cli
- test(FN-2902): complete Step 4 — cover grouped tool-call rendering
- feat(FN-2902): complete Step 3 — add grouped tool-call styles
- feat(FN-2902): complete Step 2 — group multiple tool calls in QuickChatFAB
- feat(FN-2902): complete Step 1 — group multiple tool calls in ChatView
- chore(release): v0.8.3
- Update changeset
- fix(tui): swap 3/4 panel hotkeys so they match the help text
- fix(tui): always show auth token and report accurate macOS memory usage
- chore(release): v0.8.2
- feat(FN-2895): merge fusion/fn-2895
- fix(cli): validate agentId in fn_task_create/update and unblock bundle tests
Fusion-Task-Id: FN-2902
2026-04-28 22:14:07 -07:00
Fusion
a8dbdbc017
feat(FN-2915): merge fusion/fn-2915
...
- feat(FN-2915): include github issue refs in commit workflows
- refactor(dashboard): simplify setup wizard manual step
- fix(engine): prevent phantom merges when verification fix runs without a commit
Fusion-Task-Id: FN-2915
2026-04-28 21:13:30 -07:00
Fusion
0cd31c0182
fix(FN-2904): preserve quick chat streaming state on resume
...
- Keep active streaming responses alive when resuming an existing quick chat session instead of resetting stream state
- Update useQuickChat session-resume logic to only restart waiting indicators when appropriate
- Adjust QuickChatFAB waiting indicator behavior so it reflects real in-flight assistant activity
- Add focused hook and component tests covering same-session resume and waiting-indicator regressions
Fusion-Task-Id: FN-2904
2026-04-28 19:43:29 -07:00
Fusion
b48cc71b94
fix(FN-2711): keep dashboard timing stats live
2026-04-28 19:20:10 -07:00
gsxdsm
f3d7eef2fe
fix(FN-2662): clarify project default model setting
2026-04-28 18:29:39 -07:00
gsxdsm
2029968d23
fix(FN-2662): honor project model overrides and stabilize tests
2026-04-28 18:21:17 -07:00
Fusion
0e2480980b
feat(FN-2893): add merge-description disclosures in settings
...
- Render merge strategy descriptions behind expandable disclosure sections in Settings modal
- Add dedicated disclosure styling and update task form expectations for the new copy structure
- Extend Settings modal tests to cover disclosure toggling and merge-description visibility
- Improve model onboarding API key action layout on mobile by stretching form width and aligning button placement
2026-04-28 16:24:22 -07:00
Fusion
afa804ae17
feat(FN-2896): keep GitHub import modal open after successful import
...
- Keep the GitHub import modal open after successful issue or PR import instead of auto-closing
- Reset selected issue/PR after import so the Import action disables until a new selection is made
- On mobile, return from preview to list view after a successful import for faster repeated imports
- Expand GitHubImportModal tests to cover stay-open behavior, selection reset, mobile view reset, and stabilized auto-load button assertions
2026-04-28 16:20:24 -07:00
gsxdsm
cd03c6af2f
fix(FN-2837): correct infusion.ai → runfusion.ai in update notices
...
Inadvertent infusion.ai links slipped into the dashboard update-available
banner and settings modal (plus matching tests and changeset). Point them
at the actual marketing domain, runfusion.ai.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-28 15:20:49 -07:00