Commit Graph

1302 Commits

Author SHA1 Message Date
Fusion
567873bc02 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
e5157a96f8 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
182f0a4db3 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
2fb18eac1f 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
883560776d 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
b0cda2398b 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
8a1dabb81e 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
64d0f258ae 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
4c5173410b fix(FN-XXX): keep experimental views off by default 2026-04-29 16:11:59 -07:00
Fusion
8f057a75d0 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
71a069e3d3 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
c31090efb5 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
7c59d9b7e0 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
01cf62b002 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
f9260f2c65 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
c9cdef720d 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
f50c2ce46f 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
8bbd956fa5 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
87d9c1c380 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
ad58a1d445 feat(FN-2903): merge fusion/fn-2903 2026-04-29 12:31:09 -07:00
Fusion
8dd4999f11 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
601e206f74 fix(FN-2877): restore task card timing and changes fallbacks 2026-04-29 11:42:37 -07:00
Fusion
50d194e27b 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
a41e058be5 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
067d7f3048 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
f8dae88e12 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
b42eac3891 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
4a9345301a 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
9bdc80fa06 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
d945947a05 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
d250f866d6 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
09cf8ccdb7 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
85623f45a2 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
2bd552b52a 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
1f807755aa 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
f69ef64b48 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
4ba05c52d8 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
d212ee12b3 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
ebd3201153 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
3263babe1b 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
bdfb08f380 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
67226f47c2 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
9286205f4b 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
b248ffc6e6 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
4a819cf961 fix(FN-2711): keep dashboard timing stats live 2026-04-28 19:20:10 -07:00
gsxdsm
fc2b391c32 fix(FN-2662): clarify project default model setting 2026-04-28 18:29:39 -07:00
gsxdsm
3f061460b9 fix(FN-2662): honor project model overrides and stabilize tests 2026-04-28 18:21:17 -07:00
Fusion
64f662624b 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
c799f9ba44 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
181007b91d 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