Commit Graph

2310 Commits

Author SHA1 Message Date
Fusion
8e969bd72e feat(FN-3026): use Nerd Font terminal stack with font fallback migration
Adds Nerd Font as the terminal font stack default with a migration to update existing user settings, updates the terminal and settings modals to reflect the new font choice, and includes corresponding tests plus a patch changeset for `@runfusion/fusion`.

Fusion-Task-Id: FN-3026
2026-04-30 14:49:10 -07:00
gsxdsm
f740bf29e9 fix(engine): preserve step progress + worktree across internal task bounces
Workflow-step REVISE retries, pause→todo handoffs, and the
context-overflow fresh-session requeue were all routing tasks back to
`todo` before returning to `in-progress`. The default reopen-to-todo
path reset every step to pending and rewrote PROMPT.md checkboxes, so
each retry restarted from step 0 even when earlier steps had already
been done — the symptom seen on FN-2978, where every workflow REVISE
or pause cycle wiped the task's progress.

- Add `preserveResumeState` to `TaskStore.moveTask`. When set, skip
  `resetAllStepsToPending` + `resetPromptCheckboxes` and keep
  `worktree` and `executionStartedAt` so the resumed run reattaches to
  the same checkout. `status`, `error`, and `blockedBy` still clear.
- Use it on the workflow-rerun bounce, the three pause-graceful
  handoffs, and the context-overflow requeue. The agent-terminated
  pause path still discards (it nukes worktree+branch by design).
- Context-overflow requeue clears `sessionFile` synchronously in the
  awaited `updateTask` immediately before `moveTask`, so the next
  dispatch cannot reopen the saturated session via a stale pointer.
- `fn_task_update` no longer silently regresses `done`/`skipped` steps
  to `in-progress`, no longer captures a stale rewind checkpoint when
  it does, and tells the agent honestly when a regression is ignored.
- Mobile chat keyboard: ChatView/QuickChatFAB gate layout on the new
  `keyboardOpen` flag so focused-input + viewport-shrink iOS cases
  still adjust when the computed overlap is zero.

Tests:
- New `preserveResumeState` coverage in store.test.ts; updated
  workflow-rerun + pause-graceful assertions in executor.test.ts.
- Restructured the previously-flaky "routes exhausted prompt-mode
  workflow hard failures" test to drive the bounce inline; passes in
  isolation and in the wider workflow/pause/context sweep (59/59).
- Added regression tests in ChatView.test.tsx and QuickChatFAB.test.tsx
  for the iOS last-resort `keyboardOpen=true, keyboardOverlap=0` case.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 14:12:03 -07:00
gsxdsm
400be4487f feat(engine): preserve branches on auto-requeue + add fn_run_verification
Three coordinated fixes for the FN-2978 incident class — auto-requeues
that orphaned committed work and watchdog kills on long verification runs.

**Auto-requeue branch reuse** (executor.ts, worktree-pool.ts)
- executor.ts:1782 now uses `task.branch || fusion/<id>` so persisted
  branches are honored on requeue. Previously the hardcoded fallback
  always tried to re-create the original branch, hit a conflict with
  the prior run's ref, and got suffix -2/-3. Other call sites already
  honor task.branch — this aligns the worktree-acquisition path.
- worktree-pool.ts:181 prepareForTask now probes existing branches with
  `git rev-parse --verify` and checks them out as-is. Falls through to
  suffixed creation only when the branch is genuinely in use by another
  live worktree. Previously force-reset with `checkout -B`, destroying
  prior commits.
- New private reconcileStepsFromGitHistory walks `git log
  baseCommitSha..HEAD` for `feat(FN-X): complete Step N` commits and
  marks matching steps[] as done so resumes don't redo committed work.

**Manual reset endpoint + UI** (dashboard)
- POST /api/tasks/:id/reset (requires `confirm: true`) — clears worktree,
  branch, all retry counters, resets steps[] to pending, moves to todo.
  Distinct from /retry which is the soft-resume path.
- Reset button alongside Retry in TaskDetailModal with confirm dialog,
  wired through useTasks → AppModals → API.

**fn_run_verification tool** (run-verification-tool.ts, executor.ts)
- New custom tool wrapping test/lint/build commands with a heartbeat
  callback (per-line + 60s synthetic), 200KB head+tail output cap, hard
  timeout with SIGTERM→SIGKILL escalation, and auto-bootstrap detection
  for missing node_modules. Prevents the inactivity watchdog from
  killing sessions during long compiles.
- Cross-platform via `shell: true` (Node picks /bin/sh on POSIX,
  cmd.exe on Windows). Prompt section in EXECUTOR_SYSTEM_PROMPT and
  EXECUTOR_PROMPT_TEXT instructs agents to prefer package-scoped
  verification first and reserve workspace-scoped runs for final
  integration.

**Tests** (64 passing)
- detect-pseudo-pause.test.ts (27 tests) — covers all 7 regex patterns,
  structural fallback, FN-2978 regression text.
- reconcile-step-regex.test.ts (25 tests) — pins the commit-message
  regex against a wide variant set.
- run-verification-command.test.ts (12 tests) — basic execution, output
  capture, heartbeat callbacks, timeout, error handling. POSIX-specific
  cases (multi-cmd `;`, `>&2`, `\$USER`) gated behind itPosix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 10:19:54 -07:00
gsxdsm
442238196e chore: remove changeset negation rules from .gitignore
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-30 08:36:32 -07:00
Fusion
d9490bcab4 feat(FN-2977): harden cloudflared install with fallbacks and arch detection
The merge hardens the cloudflared installation backend with fallback logic and architecture detection, updates the SettingsModal UI with clearer manual installation guidance, and adds comprehensive test coverage for the remote access routes including the new memory-based settings registration flow.

Fusion-Task-Id: FN-2977
2026-04-30 06:01:18 -07:00
Fusion
48f2dd0de2 feat(FN-2976): detect and display external Tailscale funnel tunnels in remo
Merges external Tailscale funnel detection (FN-2976) — adds types, detection logic, status inclusion, kill flow, and a dedicated UI panel for funnel processes started outside Fusion — alongside custom AI providers API routes and a new settings UI section (FN-2965).

Fusion-Task-Id: FN-2976
2026-04-30 05:43:13 -07:00
Fusion
1b3e68740e feat(FN-2965): add custom providers API routes and settings UI
Merged v0.9.4 bringing custom AI providers to the dashboard — SettingsModal now surfaces provider configuration with an onboarding disclosure flow, backed by new API routes (`/custom-providers`) and comprehensive test coverage. The engine adds self-healing with a ghost-review fallback recovery path,

Fusion-Task-Id: FN-2965
2026-04-30 05:14:03 -07:00
Fusion
21c78cae2d feat(FN-2974): style inline version update control and improve touch target
The merge adds an inline version refresh control to the Settings modal with improved touch targets for better mobile usability, replacing a separate duplicate-updates check button. Changes span the SettingsModal component, its CSS styling, and new test coverage for the control behavior.

Fusion-Task-Id: FN-2974
2026-04-30 05:10:23 -07:00
gsxdsm
620049cf15 chore(release): v0.9.4
Version bump via changesets.
2026-04-30 04:45:06 -07:00
gsxdsm
0e36e1bafc test(dashboard): close agentStore in saturated-slot heartbeat test
Hoist agentStore to outer scope so the finally block can close it
before removing the temp dir, preventing leaked SQLite handles when
the test errors mid-try.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 04:42:55 -07:00
gsxdsm
fc16ab08a3 docs: add changeset for nested .fusion dir fix
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 04:24:39 -07:00
Fusion
c5f35ab349 feat(FN-2994): merge fusion/fn-2994
Commits merged:
- fix(FN-2994): gate unavailable research workflow and humanize provider labels
- fix(FN-2994): polish research view form and history interactions
- feat(FN-2994): complete Step 5 — document research view architecture
- fix(FN-2994): align status-dot variant and hook/test conventions
- fix(FN-2994): address lint and typecheck issues
- test(FN-2994): cover research lifecycle actions and pending status
- fix(FN-2994): polish research actions and cited reader behavior
- feat(FN-2994): complete Step 3 — add lifecycle actions and task flows
- fix(FN-2994): ensure research enables header overflow gate
- feat(FN-2994): complete Step 2 — implement research view shell layout
- feat(FN-2994): complete Step 2 — gate research navigation and view
- feat(FN-2994): complete Step 1 — add research api surface and hook

Files changed:
docs/architecture.md                               |   7 +-
 docs/dashboard-guide.md                            |  21 ++
 packages/dashboard/app/App.tsx                     |  11 +-
 packages/dashboard/app/api/legacy.ts               | 143 ++++-----
 packages/dashboard/app/components/Header.tsx       |  29 +-
 packages/dashboard/app/components/MobileNavBar.tsx |  22 +-
 packages/dashboard/app/components/ResearchView.css | 247 +++++++++------
 packages/dashboard/app/components/ResearchView.tsx | 347 ++++++++++++++-------
 .../app/components/__tests__/ResearchView.test.tsx | 183 ++++++-----
 .../app/hooks/__tests__/useResearch.test.ts        |  66 ++++
 packages/dashboard/app/hooks/useResearch.ts        | 162 ++++++++++
 packages/dashboard/app/research-types.ts           |  43 +++
 packages/dashboard/app/styles.css                  |   4 +
 .../src/__tests__/research-routes.test.ts          |  65 ++++
 packages/dashboard/src/research-routes.ts          | 195 ++++++++++--
 15 files changed, 1111 insertions(+), 434 deletions(-)

Fusion-Task-Id: FN-2994
2026-04-30 03:43:21 -07:00
Fusion
9bea0a1367 feat(FN-2993): merge fusion/fn-2993
Commits merged:
- fix(FN-2993): resolve lint and build verification issues
- fix(FN-2993): address provider registry review feedback
- feat(FN-2993): complete Step 7 — add provider registry
- feat(FN-2993): complete Step 6 — add LLM synthesis provider
- feat(FN-2993): complete Step 5 — add local docs provider
- feat(FN-2993): complete Step 4 — add GitHub provider
- fix(FN-2993): align provider config types with step runner contract
- fix(FN-2993): resolve page fetch test module ordering
- test(FN-2993): expand page fetch coverage for timeout and truncation
- feat(FN-2993): complete Step 3 — add page fetch provider
- fix(FN-2993): align web search provider interface and abort assertions
- feat(FN-2993): complete Step 2 — add web search provider
- feat(FN-2993): complete Step 1 — define provider types and settings fields

Files changed:
packages/core/src/index.ts                         |   2 +-
 packages/core/src/settings-schema.ts               |  11 +
 packages/core/src/types.ts                         |  25 ++
 .../app/components/CustomProvidersSection.tsx      |   1 -
 packages/engine/src/index.ts                       |  19 ++
 .../research/__tests__/provider-registry.test.ts   |  49 +++
 packages/engine/src/research/provider-registry.ts  | 110 +++++++
 .../providers/__tests__/github-provider.test.ts    | 143 +++++++++
 .../__tests__/llm-synthesis-provider.test.ts       | 107 +++++++
 .../__tests__/local-docs-provider.test.ts          |  79 +++++
 .../__tests__/page-fetch-provider.test.ts          |  92 ++++++
 .../__tests__/web-search-provider.test.ts          | 101 +++++++
 .../src/research/providers/github-provider.ts      | 327 +++++++++++++++++++++
 packages/engine/src/research/providers/index.ts    |   5 +
 .../research/providers/llm-synthesis-provider.ts   | 216 ++++++++++++++
 .../src/research/providers/local-docs-provider.ts  | 238 +++++++++++++++
 .../src/research/providers/page-fetch-provider.ts  | 123 ++++++++
 .../src/research/providers/web-search-provider.ts  | 269 +++++++++++++++++
 packages/engine/src/research/types.ts              |  50 ++++
 19 files changed, 1965 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-2993
2026-04-30 02:21:19 -07:00
Fusion
a227d5b305 feat(FN-2992): merge fusion/fn-2992
Commits merged:
- fix(FN-2992): align ResearchView styles with design tokens
- fix(FN-2992): align Research view with standalone layout conventions
- test(FN-2992): complete Step 6 — expand orchestration verification
- feat(FN-2992): complete Step 5 — wire research settings and engine exports
- test(FN-2992): cover provider error classification in step runner
- feat(FN-2992): complete Step 4 — implement research step runner
- test(FN-2992): add orchestrator lifecycle regression coverage
- feat(FN-2992): complete Step 3 — add research orchestrator lifecycle
- feat(FN-2992): complete Step 2 — align research store API events
- feat(FN-2992): complete Step 1 — define orchestration domain types
- feat(FN-2992): complete Step 1 — define orchestration domain types

Files changed:
packages/core/src/index.ts                         |  15 +
 packages/core/src/research-store.ts                |   8 +-
 packages/core/src/research-types.ts                | 109 +++++
 packages/core/src/settings-schema.ts               |  10 +
 packages/core/src/types.ts                         |  31 ++
 packages/dashboard/app/components/ResearchView.css |  87 +++-
 packages/dashboard/app/components/ResearchView.tsx | 144 +++---
 .../app/components/__tests__/ResearchView.test.tsx |   3 +-
 .../src/__tests__/research-orchestrator.test.ts    | 256 ++++++++++
 .../src/__tests__/research-step-runner.test.ts     | 102 ++++
 packages/engine/src/index.ts                       |  11 +
 packages/engine/src/project-engine.ts              |  17 +
 packages/engine/src/research-orchestrator.ts       | 517 +++++++++++++++++++++
 packages/engine/src/research-step-runner.ts        | 235 ++++++++++
 14 files changed, 1464 insertions(+), 81 deletions(-)

Fusion-Task-Id: FN-2992
2026-04-30 00:48:37 -07:00
Fusion
b359cb8672 feat(FN-3022): merge fusion/fn-3022
Commits merged:
- feat(FN-3022): complete Step 4 — document mobile quick chat autofocus behavior
- test(FN-3022): complete Step 2 — cover mobile autofocus and delayed enable path
- feat(FN-3022): complete Step 1 — reliable mobile autofocus when composer becomes ready

Files changed:
docs/dashboard-guide.md                            |  1 +
 packages/dashboard/app/components/QuickChatFAB.tsx | 42 +++++++++++++++---
 .../app/components/__tests__/QuickChatFAB.test.tsx | 51 ++++++++++++++++++++++
 3 files changed, 89 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-3022
2026-04-30 00:30:02 -07:00
Fusion
dc96d572cb feat(FN-3021): merge fusion/fn-3021
Commits merged:
- test(FN-3021): complete Step 2 — assert quick-chat scoped mobile tool-call rules
- feat(FN-3021): complete Step 1 — scope mobile quick-chat tool-call row override
- feat(FN-3021): complete Step 4 — document compact mobile quick-chat tool-call summaries
- fix(FN-3021): complete Step 3 — restore dashboard typecheck in custom providers
- test(FN-3021): complete Step 2 — add mobile quick-chat tool-call regression coverage
- feat(FN-3021): complete Step 1 — keep quick-chat tool-call summary single-line on mobile

Files changed:
docs/dashboard-guide.md                                      | 1 +
 packages/dashboard/app/components/CustomProvidersSection.tsx | 1 +
 packages/dashboard/app/components/QuickChatFAB.css           | 1 +
 3 files changed, 3 insertions(+)

Fusion-Task-Id: FN-3021
2026-04-30 00:26:07 -07:00
Fusion
42e8e462fc feat(FN-3019): merge fusion/fn-3019
Commits merged:
- feat(FN-3019): complete Step 4 — document gridlock cooldown semantics
- fix(FN-3019): normalize legacy custom provider payloads for typecheck
- test(FN-3019): complete Step 2 — add gridlock cooldown regression coverage
- fix(FN-3019): repair notifier class structure after cooldown refactor
- feat(FN-3019): complete Step 1 — add gridlock notification cooldown

Files changed:
docs/architecture.md                               |  3 +-
 docs/settings-reference.md                         |  4 +-
 .../app/components/CustomProvidersSection.tsx      | 25 ++++++----
 .../engine/src/__tests__/gridlock-detector.test.ts |  5 +-
 packages/engine/src/__tests__/notifier.test.ts     | 47 ++++++++++++++++--
 packages/engine/src/gridlock-detector.ts           | 16 +++++--
 packages/engine/src/notifier.ts                    | 55 ++++++++++++----------
 packages/engine/src/project-engine.ts              |  1 +
 8 files changed, 109 insertions(+), 47 deletions(-)

Fusion-Task-Id: FN-3019
2026-04-30 00:20:51 -07:00
Fusion
493ca91d63 feat(FN-3020): merge fusion/fn-3020
Commits merged:
- test(FN-3020): complete Step 2 — lock quick-chat mobile tool-call scoping
- feat(FN-3020): complete Step 1 — scope quick-chat mobile tool-call row styles
- feat(FN-3020): complete Step 4 — document compact quick-chat tool-call rows
- fix(FN-3020): restore custom provider type compatibility for typecheck
- test(FN-3020): complete Step 2 — add quick-chat mobile tool-call regressions
- feat(FN-3020): complete Step 1 — keep compact tool-call rows single-line

Files changed:
docs/dashboard-guide.md                            |  1 +
 .../quick-chat-tool-calls-mobile-layout.test.ts    | 46 ++++++++++++++++++++++
 .../app/components/CustomProvidersSection.tsx      | 25 +++++++++++-
 packages/dashboard/app/components/QuickChatFAB.css | 37 +++++++++++++----
 packages/dashboard/app/components/QuickChatFAB.tsx |  7 ++--
 .../app/components/__tests__/QuickChatFAB.test.tsx | 18 +++++++--
 6 files changed, 119 insertions(+), 15 deletions(-)

Fusion-Task-Id: FN-3020
2026-04-30 00:10:42 -07:00
Fusion
18d97ca028 feat(FN-3007): merge fusion/fn-3007
Commits merged:
- feat(FN-3007): complete Step 4 — document system memory usage bar
- fix(FN-3007): restore custom provider mapper type compatibility
- test(FN-3007): complete Step 2 — cover memory bar semantics and severity
- feat(FN-3007): complete Step 1 — add semantic memory usage progressbar
- test(FN-3007): complete Step 2 — cover memory usage progress semantics
- feat(FN-3007): complete Step 1 — add system memory usage bar

Files changed:
docs/architecture.md                               |  2 +-
 .../app/components/ModelOnboardingModal.tsx        | 27 ++++++------
 .../dashboard/app/components/SettingsModal.tsx     | 27 ++++++------
 .../dashboard/app/components/SystemStatsModal.css  | 48 ++++++++++++++++++++++
 .../dashboard/app/components/SystemStatsModal.tsx  | 29 +++++++++++--
 .../components/__tests__/SystemStatsModal.test.tsx | 33 +++++++++++++++
 6 files changed, 133 insertions(+), 33 deletions(-)

Fusion-Task-Id: FN-3007
2026-04-29 23:54:29 -07:00
Fusion
8c641a8291 feat(FN-3006): merge fusion/fn-3006
Commits merged:
- fix(FN-3006): complete Step 3 — repair dashboard typecheck mapper signatures
- test(FN-3006): complete Step 2 — cover Use default reselection flow
- feat(FN-3006): complete Step 1 — resolve default model selection target

Files changed:
.../app/components/ModelOnboardingModal.tsx        | 24 ++++++---
 packages/dashboard/app/components/QuickChatFAB.tsx | 13 +++--
 .../dashboard/app/components/SettingsModal.tsx     | 24 ++++++---
 .../app/components/__tests__/QuickChatFAB.test.tsx | 61 ++++++++++++++++++++++
 4 files changed, 103 insertions(+), 19 deletions(-)

Fusion-Task-Id: FN-3006
2026-04-29 23:43:41 -07:00
Fusion
74989993a3 feat(FN-2964): merge fusion/fn-2964
Commits merged:
- test(FN-2964): complete Step 2 — cover custom providers disclosure behavior
- feat(FN-2964): complete Step 1 — embed custom providers disclosure in onboarding
- fix(FN-2963): reuse shared onboarding disclosure for custom providers
- fix(FN-2963): address disclosure focus ring and mobile touch target
- fix(FN-2963): align custom providers disclosure with shared pattern
- feat(FN-2963): apply inline edit UX and tokenized custom provider styles
- fix(FN-2963): align custom providers UI with auth patterns
- fix(FN-2963): complete Step 5 — resolve lint gate in providers section
- test(FN-2963): complete Step 4 — add custom providers section tests
- feat(FN-2963): complete Step 3 — integrate custom providers section
- feat(FN-2963): complete Step 2 — add custom providers section styles
- feat(FN-2963): complete Step 1 — create custom providers section component
- feat(FN-2961): complete Step 6 — document custom provider settings
- test(FN-2961): complete Step 4 — cover custom provider routes
- feat(FN-2961): complete Step 3 — add custom provider API client
- feat(FN-2961): complete Step 2 — add custom provider CRUD routes
- feat(FN-2961): complete Step 1 — add custom provider core types

Files changed:
.../app/components/CustomProvidersSection.css      | 138 +++++++
 .../app/components/CustomProvidersSection.tsx      | 425 +++++++++++++++++++++
 .../app/components/ModelOnboardingModal.css        |  60 ---
 .../app/components/OnboardingDisclosure.css        |  67 ++++
 .../app/components/OnboardingDisclosure.tsx        |  38 ++
 .../__tests__/CustomProvidersSection.test.tsx      | 237 ++++++++++++
 .../__tests__/ModelOnboardingModal.test.tsx        |  67 +++-
 7 files changed, 967 insertions(+), 65 deletions(-)

Fusion-Task-Id: FN-2964
2026-04-29 23:39:18 -07:00
gsxdsm
c1c5ba6f43 chore(release): v0.9.3
Version bump via changesets.
2026-04-29 23:20:40 -07:00
gsxdsm
2e949895e2 fix(FN-3005): restore unrelated heartbeat files 2026-04-29 23:14:51 -07:00
gsxdsm
ffa116a238 fix(FN-3005): preserve card timer across reruns 2026-04-29 23:13:38 -07:00
gsxdsm
a3617850f5 fix(heartbeat): per-agent HEARTBEAT.md and phase-aligned scheduler
Each agent now gets its own .fusion/agents/<id>/HEARTBEAT.md procedure
file instead of sharing a single project-wide file. A one-shot
migration in AgentStore.init() re-points existing agents off the legacy
shared path and copies the legacy file's contents into each agent's
new per-agent location so operator edits are preserved.

The HeartbeatTriggerScheduler now phase-aligns the first tick to
lastHeartbeatAt + intervalMs so a process restart resumes each agent's
existing schedule rather than waiting up to a full interval before
firing again. Overdue ticks fire promptly within a small jitter window
to avoid a thundering herd at boot.

Also fixes three pre-existing QuickChatFAB test failures introduced by
739e899b5: auto-select default model now switches to model mode whether
or not agents are present, the model tag only renders in model mode,
and one test scopes its option lookup to role="option" to disambiguate
the in-header tag from the dropdown entry.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 23:08:21 -07:00
gsxdsm
739e899b59 fix(quick-chat): auto-select default model, fix new-chat button contrast, autofocus input
- Pre-select the global default (or first available) model on first open so
  users can chat without manually picking from the dropdown.
- Bump specificity of the new-chat (+) button styles so the CTA bg/text
  applies instead of being overridden by the header's .btn-icon rule.
- Focus the message input on panel open via rAF.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 22:45:17 -07:00
gsxdsm
c7ff1b68d4 fix: unify CLI version resolver across TUI and dashboard
The TUI splash/footer and the dashboard /api/health + /api/updates/check
each had their own walk-up resolver with different rules, so they could
report different versions and trigger spurious update-available banners.
Dashboard now uses a direct ancestor walk (matching the TUI's old logic)
and only falls back to the sibling-cli probe for dashboard-source dev
mode; logo.ts delegates to it so there is one source of truth.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 22:37:52 -07:00
gsxdsm
ab1afdc940 chore(release): v0.9.2
Version bump via changesets.
2026-04-29 22:27:14 -07:00
Fusion
e3c99ef290 feat(FN-3005): merge fusion/fn-3005
Commits merged:
- fix(FN-3005): restore dashboard typecheck for custom providers
- feat(FN-3005): complete Step 1 — use explicit mode labels
- test(FN-3005): complete Step 3 — assert explicit mode toggle labels
- feat(FN-3005): complete Step 2 — fit explicit mode labels in header

Files changed:
packages/dashboard/app/components/ModelOnboardingModal.tsx        | 2 +-
 packages/dashboard/app/components/QuickChatFAB.css                | 4 ++--
 packages/dashboard/app/components/QuickChatFAB.tsx                | 4 ++--
 packages/dashboard/app/components/SettingsModal.tsx               | 6 +++---
 packages/dashboard/app/components/__tests__/QuickChatFAB.test.tsx | 4 ++--
 5 files changed, 10 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-3005
2026-04-29 22:25:20 -07:00
Fusion
c5de7e183b feat(FN-2991): merge fusion/fn-2991
Commits merged:
- fix(FN-2991): align failed research status badge semantics
- feat(FN-2991): add research dashboard view and navigation entry
- fix(FN-2991): complete Step 8 — resolve lint and typecheck gates
- test(FN-2991): address review feedback for Step 7
- test(FN-2991): complete Step 7 — add research store and route tests
- feat(FN-2991): complete Step 6 — add research client API helpers
- feat(FN-2991): complete Step 5 — add research REST routes
- feat(FN-2991): complete Step 4 — wire research store into core exports
- feat(FN-2991): complete Step 3 — implement research store
- feat(FN-2991): complete Step 2 — add research schema and migration
- feat(FN-2991): complete Step 1 — add research domain types

Files changed:
packages/core/src/__tests__/db.test.ts             |  26 +-
 packages/core/src/__tests__/insight-store.test.ts  |   8 +-
 packages/core/src/__tests__/mission-store.test.ts  |   2 +-
 packages/core/src/__tests__/research-store.test.ts | 118 +++++++
 packages/core/src/__tests__/roadmap-store.test.ts  |   2 +-
 packages/core/src/__tests__/run-audit.test.ts      |   2 +-
 packages/core/src/__tests__/task-documents.test.ts |   2 +-
 packages/core/src/db.ts                            |  82 ++++-
 packages/core/src/index.ts                         |  30 ++
 packages/core/src/research-store.ts                | 377 +++++++++++++++++++++
 packages/core/src/research-types.ts                | 162 +++++++++
 packages/core/src/store.ts                         |  14 +
 packages/dashboard/app/App.tsx                     |  12 +
 .../app/api/__tests__/research-api.test.ts         | 120 +++++++
 packages/dashboard/app/api/legacy.ts               | 132 +++++++-
 packages/dashboard/app/components/Header.tsx       |  23 +-
 packages/dashboard/app/components/MobileNavBar.tsx |  16 +-
 packages/dashboard/app/components/ResearchView.css | 110 ++++++
 packages/dashboard/app/components/ResearchView.tsx | 145 ++++++++
 .../app/components/__tests__/Header.test.tsx       |   4 +-
 .../app/components/__tests__/ResearchView.test.tsx | 170 ++++++++++
 packages/dashboard/app/hooks/useViewState.ts       |   3 +-
 packages/dashboard/src/research-routes.ts          | 223 ++++++++++++
 .../src/routes/register-integrated-routers.ts      |   2 +
 24 files changed, 1751 insertions(+), 34 deletions(-)

Fusion-Task-Id: FN-2991
2026-04-29 22:21:27 -07:00
Fusion
b78dd3e055 feat(FN-3011): merge fusion/fn-3011
Commits merged:
- test(FN-3011): complete Step 2 — harden light-theme source assertions
- feat(FN-3011): complete Step 1 — restore global token scope
- fix(FN-3011): complete Step 3 — satisfy lint/test/typecheck/build gates
- test(FN-3011): complete Step 2 — harden light-theme source assertions
- feat(FN-3011): complete Step 1 — restore default light token ownership

Files changed:
.../app/__tests__/status-colors-theme.test.ts      | 100 +++++--
 .../app/components/CustomModelDropdown.css         |   6 -
 .../__tests__/ModelOnboardingModal.test.tsx        |   4 +-
 packages/dashboard/app/styles.css                  | 299 +++++++++++----------
 packages/dashboard/app/test/cssFixture.ts          |  11 +-
 5 files changed, 242 insertions(+), 178 deletions(-)

Fusion-Task-Id: FN-3011
2026-04-29 22:18:18 -07:00
Fusion
e571e701c9 fix(FN-3010): widen quick entry model menu on desktop
- Increase desktop nested model menu width baseline for better model-name readability
- Raise desktop width floor from 240px to 320px while preserving viewport clamping
- Replace hardcoded QuickEntryBox menu spacing/shadow/radius values with design tokens
- Update QuickEntryBox nested menu tests to assert the new desktop width behavior

Fusion-Task-Id: FN-3010
2026-04-29 21:57:46 -07:00
Fusion
c3d2e98f81 feat(FN-3004): merge fusion/fn-3004
- **New `fn custom-provider` CLI commands** (`register`, `unregister`, `list`) for managing custom AI providers; `dashboard.ts` and `serve.ts` now initialize the registry, and `packages/engine/src/custom-providers.ts` exposes the engine integration
- **Custom provider registration API** in `packages/dashboard/src/routes/register-agent-core-routes.ts` with `POST /api/agent-core/register-custom-provider`; providers are persisted in `store.ts` and exposed via `GET /api/agent-core/custom-providers`
- **Agent heartbeat improvements** (`packages/engine/src/agent-heartbeat.ts`): clearer conflict semantics when task is checked out by another agent, refactored `WakeContext` handling, and budget enforcement at heartbeat time
- **Inline quick chat composer** (FN-3004): `QuickChatFAB` reworked with inline attachment row, improved prompt template logic, and full TypeScript coverage in `QuickChatFAB.test.tsx`
- **Settings and onboarding**: `SettingsModal.tsx` surfaces custom provider management; `ModelOnboardingModal.tsx` updated to use the new registry
- **Agent instructions expanded** (`packages/engine/src/agent-instructions.ts`): richer system prompt injection for spawned agents including agent personality/soul, ratings context, and parent assignment details
- **`agent-store.ts`** now tracks `reportsTo` for spawned agent hierarchy and exposes `list_agents` and `delegate_task` tools via the pi extension
- **Database layer**: `db.ts` uses `prepareSelect()` helpers for query consistency; WAL mode enforced; foreign-key checks enabled in test suite
- **New tests**: `custom-provider-registry.test.ts`, `pi-create-fn-agent.test.ts`, `agent-heartbeat.test.ts`, `notifier.test.ts`, `routes.test.ts` for dashboard core routes, plus coverage for `QuickChatFAB`, `TaskCard`, and `UpdateAvailableBanner`
- **TaskCard**: status badge now uses `--card-status-badge--{status}` CSS classes instead of inline style helpers; `TaskCard.test.tsx` updated to match

Commits merged:
- fix(FN-3004): restore dashboard typecheck for custom provider state
- test(FN-3004): complete Step 2 — cover inline composer attachment row
- feat(FN-3004): complete Step 1 — inline quick chat composer row
- feat(FN-3003): merge fusion/fn-3003
- feat(FN-2962): merge fusion/fn-2962
- fix(FN-XXX): update release notes link in update notification

Files changed:
.changeset/fix-update-release-notes-link.md        |   5 +
 .changeset/register-custom-providers.md            |   5 +
 docs/architecture.md                               |   2 +
 .../__tests__/custom-provider-registry.test.ts     | 167 +++++++++++++++++++++
 .../cli/src/commands/__tests__/dashboard.test.ts   |   4 +
 packages/cli/src/commands/__tests__/serve.test.ts  |   3 +
 .../cli/src/commands/custom-provider-registry.ts   |  96 ++++++++++++
 packages/cli/src/commands/dashboard.ts             |  28 ++++
 packages/cli/src/commands/serve.ts                 |  28 ++++
 packages/core/src/__tests__/db.test.ts             |  26 ++--
 packages/core/src/__tests__/insight-store.test.ts  |   8 +-
 packages/core/src/__tests__/mission-store.test.ts  |   2 +-
 packages/core/src/__tests__/roadmap-store.test.ts  |   2 +-
 packages/core/src/__tests__/run-audit.test.ts      |   2 +-
 packages/core/src/__tests__/task-documents.test.ts |   2 +-
 packages/core/src/agent-store.ts                   |  16 +-
 packages/core/src/db.ts                            |  13 +-
 packages/core/src/index.ts                         |   2 +-
 packages/core/src/store.ts                         |  35 ++++-
 packages/core/src/types.ts                         |  33 ++++
 packages/dashboard/app/api/legacy.ts               |  11 ++
 .../dashboard/app/components/AgentDetailView.tsx   |  92 +++++++++++-
 .../app/components/ModelOnboardingModal.tsx        |  15 +-
 packages/dashboard/app/components/QuickChatFAB.css |  19 ++-
 packages/dashboard/app/components/QuickChatFAB.tsx |  95 ++++++------
 .../dashboard/app/components/SettingsModal.tsx     |  39 ++++-
 packages/dashboard/app/components/TaskCard.tsx     |  46 ++++--
 .../app/components/UpdateAvailableBanner.tsx       |   2 +-
 .../app/components/__tests__/QuickChatFAB.test.tsx |  23 +++
 .../app/components/__tests__/TaskCard.test.tsx     |   2 +-
 .../__tests__/UpdateAvailableBanner.test.tsx       |   2 +-
 .../src/__tests__/routes-agent-skills.test.ts      |   1 +
 packages/dashboard/src/__tests__/routes.test.ts    |  34 +++++
 .../src/routes/register-agent-core-routes.ts       |  78 ++++++++++
 .../dashboard/src/routes/register-git-github.ts    |  16 +-
 .../engine/src/__tests__/agent-heartbeat.test.ts   |  59 ++++++++
 packages/engine/src/__tests__/notifier.test.ts     |  33 ++++
 .../src/__tests__/pi-create-fn-agent.test.ts       |  36 +++++
 .../engine/src/__tests__/project-engine.test.ts    |  53 ++++++-
 packages/engine/src/agent-heartbeat.ts             |  86 ++++++++++-
 packages/engine/src/agent-instructions.ts          | 103 ++++++++++++-
 packages/engine/src/custom-providers.ts            |  15 ++
 packages/engine/src/index.ts                       |   3 +
 packages/engine/src/notifier.ts                    |   3 +-
 packages/engine/src/pi.ts                          |  30 ++++
 packages/engine/src/project-engine.ts              |  12 +-
 46 files changed, 1254 insertions(+), 133 deletions(-)

Fusion-Task-Id: FN-3004
2026-04-29 21:53:55 -07:00
Fusion
7211363845 feat(FN-3003): merge fusion/fn-3003
- Unify notification service ownership across the engine: `Notifier` now operates on `ProjectEngine` rather than its own `Core` reference, resolving stale-closure issues during engine lifecycle
- Add regression tests in `notifier.test.ts` covering merge dedupe wiring and ownership initialization
- Expand `project-engine.test.ts` to cover ownership state transitions and `ProjectEngine`-notifier integration
- Fix TypeScript regressions in `ModelOnboardingModal.tsx` and `SettingsModal.tsx` introduced by custom provider types
- Document the notification ownership model in `docs/architecture.md`

Commits merged:
- feat(FN-3003): complete Step 4 — document notification ownership model
- fix(FN-3003): resolve dashboard custom provider typecheck regressions
- test(FN-3003): complete Step 2 — add merge dedupe wiring regressions
- feat(FN-3003): complete Step 1 — unify notification service ownership

Files changed:
docs/architecture.md                               |  2 +
 .../app/components/ModelOnboardingModal.tsx        | 13 +++++-
 .../dashboard/app/components/SettingsModal.tsx     | 17 +++++--
 packages/engine/src/__tests__/notifier.test.ts     | 33 ++++++++++++++
 .../engine/src/__tests__/project-engine.test.ts    | 53 +++++++++++++++++++---
 packages/engine/src/notifier.ts                    |  3 +-
 packages/engine/src/project-engine.ts              | 12 +++--
 7 files changed, 116 insertions(+), 17 deletions(-)

Fusion-Task-Id: FN-3003
2026-04-29 21:48:13 -07:00
Fusion
38f5159719 feat(FN-2962): merge fusion/fn-2962
- Add changeset for `@runfusion/fusion` minor release introducing custom provider registration support

Commits merged:
- feat(FN-2962): complete Step 8 — add changeset and documentation

Files changed:
.changeset/register-custom-providers.md | 5 +++++
 1 file changed, 5 insertions(+)

Fusion-Task-Id: FN-2962
2026-04-29 21:42:44 -07:00
gsxdsm
476d17e2ca fix(FN-XXX): update release notes link in update notification 2026-04-29 21:33:18 -07:00
Fusion
fec6cd82ec feat(FN-2990): merge fusion/fn-2990
- Finalize the downstream porting plan in `docs/research/pi-autoresearch-analysis.md` with updated guidance and recommendations

Commits merged:
- docs(FN-2990): complete Step 6 — finalize downstream porting plan

Files changed:
docs/research/pi-autoresearch-analysis.md | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-2990
2026-04-29 20:58:34 -07:00
Fusion
56fd8712c5 feat(FN-2961): merge fusion/fn-2961
- Add documentation for custom provider settings in the settings reference (`docs/settings-reference.md`)

Commits merged:
- feat(FN-2961): complete Step 6 — document custom provider settings

Files changed:
docs/settings-reference.md | 1 +
 1 file changed, 1 insertion(+)

Fusion-Task-Id: FN-2961
2026-04-29 20:41:41 -07:00
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
9b53fa46e8 feat(FN-2975): merge fusion/fn-2975
- Stabilize QuickChatFAB search refresh lifecycle to prevent redundant or stale queries (`useTasks.ts`, `QuickChatFAB.tsx`)
- Add unit tests for QuickChatFAB component and `useTasks` hook
- Refactor QuickChatFAB styles and component structure

Commits merged:
- feat(FN-2975): complete Step 2 — stabilize search refresh lifecycle
- feat(FN-2972): merge fusion/fn-2972

Files changed:
packages/dashboard/app/components/QuickChatFAB.css | 60 ++++++++++++++++----
 packages/dashboard/app/components/QuickChatFAB.tsx | 65 +++++++++++-----------
 .../app/components/__tests__/QuickChatFAB.test.tsx | 32 +++++++++++
 .../dashboard/app/hooks/__tests__/useTasks.test.ts | 48 ++++++++++++++++
 packages/dashboard/app/hooks/useTasks.ts           |  4 +-
 5 files changed, 165 insertions(+), 44 deletions(-)

Fusion-Task-Id: FN-2975
2026-04-29 19:43:50 -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
ab80d5f022 feat(FN-2971): merge fusion/fn-2971
- Add AI-generated merge commit summaries to the CLI via a new `ai-summarize.ts` module with configurable summarization settings
- Add node routing policy routes for task workflow automation and planning subtasks in the dashboard API
- Add SettingsModal improvements: tab-based navigation, node routing policy settings, and a new AI summarization section
- Update SettingsModal CSS with scoped styles and update QuickChatFAB and ModelOnboardingModal CSS
- Add `AgentHeartbeatMonitor` budget override and improve agent heartbeat handling; update scheduler with new node routing checks
- Improve merger logic with new merge policy helpers, PR comment handlers, and routine runner integration
- Add extensive test coverage across engine (agent-tools, scheduler-node-routing, node-routing-policy, merger, cron-runner), core (ai-summarize), and dashboard (routes, api)
- Minor improvements to agent delegation tools, triage, executor, project-engine, and various dashboard components (TodoView, useTaskHandlers, onboarding-flow)

Commits merged:
- fix(FN-2971): complete Step 1 — scope attach button sizing
- feat(FN-2947): merge fusion/fn-2947
- feat(FN-2970): merge fusion/fn-2970
- feat(FN-2956): merge fusion/fn-2956
- feat(FN-2923): merge fusion/fn-2923
- feat(FN-2945): merge fusion/fn-2945

Files changed:
.changeset/add-ai-merge-commit-summary.md          |   5 +
 docs/settings-reference.md                         |   3 +
 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/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 +
 .../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/QuickChatFAB.css |  17 +-
 packages/dashboard/app/components/QuickChatFAB.tsx |   2 +-
 .../dashboard/app/components/SettingsModal.css     |  11 +-
 .../dashboard/app/components/SettingsModal.tsx     |  22 ++-
 packages/dashboard/app/components/TodoView.tsx     |   2 +
 .../__tests__/ModelOnboardingModal.test.tsx        |   4 +-
 .../app/components/__tests__/QuickChatFAB.test.tsx |  14 +-
 .../__tests__/SettingsModalNodeRouting.test.tsx    |  12 +-
 .../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/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 +
 .../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 +
 packages/engine/src/__tests__/merger.test.ts       |  75 +++++++++
 .../src/__tests__/node-routing-policy.test.ts      |  25 ++-
 .../src/__tests__/pr-comment-handler.test.ts       |   8 +
 .../src/__tests__/scheduler-node-routing.test.ts   |  18 +-
 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/merger.ts                      | 181 +++++++++------------
 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/scheduler.ts                   |   8 +-
 packages/engine/src/triage.ts                      |   4 +
 54 files changed, 673 insertions(+), 183 deletions(-)

Fusion-Task-Id: FN-2971
2026-04-29 17:49:08 -07:00
Fusion
5c82c3f34a feat(FN-2947): merge fusion/fn-2947
- Add AI-powered merge commit summarization with toggle in Settings (`packages/core/src/ai-summarize.ts`, `packages/dashboard/app/components/SettingsModal.tsx`, `packages/engine/src/merger.ts`)
- Introduce `generateMergeCommitSummary` utility in `@fusion/core` that calls the configured model with a diff prompt; results appear in the commit log for merge commits
- Add `aiMergeSummaryEnabled` project setting and `useAiMergeSummaryEnabled` hook in dashboard
- Update `@runfusion/fusion` CLI extension to surface the new setting
- Add `POST /api/tasks/:id/workflow/pre-merge` and `POST /api/tasks/:id/planning-subtask` routes (`packages/dashboard/src/routes/`)
- Rework InsightsView with two-pane layout for better readability (`packages/dashboard/app/components/InsightsView.tsx`, `packages/dashboard/app/components/InsightsView.css`)
- Fix `task plan` command to surface errors when planning fails (`packages/cli/src/commands/task.ts`)
- Add tests for `ai-summarize`, `agent-heartbeat`, `agent-tools`, and dashboard API routes; refresh onboarding and agents-view mobile tests
- Minor CSS polish: reduce AgentsView panel hover gap, improve CommitDiffTab layout, add ScriptsModal styles
- Changelog and version bumps for `@runfusion/fusion` v0.9.1, CLI alias, and all workspace packages

Commits merged:
- feat(FN-2947): complete Step 7 — add changeset and docs deliverables
- fix(FN-2947): clean unused aiSummary path
- test(FN-2947): complete Step 5 — cover AI merge summary flow
- feat(FN-2947): complete Step 4 — add merge summary settings toggle
- feat(FN-2947): complete Step 3 — wire AI merge summaries into merger
- feat(FN-2947): complete Step 2 — add merge summary setting
- feat(FN-2947): complete Step 1 — add merge commit summarizer
- feat(FN-2970): merge fusion/fn-2970
- feat(FN-2956): merge fusion/fn-2956
- feat(FN-2923): merge fusion/fn-2923
- feat(FN-2945): merge fusion/fn-2945
- chore(release): v0.9.1
- fix(FN-XXX): improve git manager diff layout
- fix(dashboard): rework Insights view with two-pane layout
- fix(FN-XXX): keep experimental views off by default

Files changed:
.changeset/active-agents-no-stuck-connecting.md    |  13 --
 .changeset/active-agents-panel-hoist-heartbeat.md  |  13 --
 .changeset/add-ai-merge-commit-summary.md          |   5 +
 .changeset/fix-agent-heartbeat-terminal-links.md   |   5 -
 .changeset/show-planning-tasks-immediately.md      |   5 -
 CHANGELOG.md                                       |  92 ++++++++++
 docs/settings-reference.md                         |   3 +
 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/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/CHANGELOG.md                    |  14 ++
 packages/dashboard/app/App.tsx                     |  28 ++-
 .../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 +--
 .../dashboard/app/components/CommitDiffTab.tsx     |   2 +-
 .../dashboard/app/components/GitManagerModal.tsx   |  71 ++++----
 packages/dashboard/app/components/InsightsView.css | 200 ++++++++++++++++++---
 packages/dashboard/app/components/InsightsView.tsx | 111 ++++++++----
 .../app/components/ModelOnboardingModal.tsx        |   5 +-
 packages/dashboard/app/components/ScriptsModal.css |  89 +++++++++
 .../dashboard/app/components/SettingsModal.css     |  11 +-
 .../dashboard/app/components/SettingsModal.tsx     |  22 ++-
 .../dashboard/app/components/TaskDetailModal.css   |   5 +
 packages/dashboard/app/components/TodoView.tsx     |   2 +
 .../app/components/__tests__/App.test.tsx          |  33 ++++
 .../app/components/__tests__/InsightsView.test.tsx |  25 ++-
 .../__tests__/ModelOnboardingModal.test.tsx        |   4 +-
 .../app/components/__tests__/QuickChatFAB.test.tsx |  14 +-
 .../__tests__/SettingsModalNodeRouting.test.tsx    |  12 +-
 .../app/components/__tests__/TodoView.test.tsx     |   4 +-
 .../__tests__/agents-view-mobile.test.tsx          |   5 +-
 .../components/__tests__/onboarding-flow.test.tsx  |   2 +-
 .../app/hooks/__tests__/useAppSettings.test.ts     |   1 +
 .../app/hooks/__tests__/useTaskHandlers.test.ts    |   4 +-
 packages/dashboard/app/hooks/useAppSettings.ts     |  12 ++
 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 +
 packages/engine/src/__tests__/merger.test.ts       |  75 ++++++++
 .../src/__tests__/node-routing-policy.test.ts      |  25 ++-
 .../src/__tests__/pr-comment-handler.test.ts       |   8 +
 .../src/__tests__/scheduler-node-routing.test.ts   |  18 +-
 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/merger.ts                      | 181 ++++++++-----------
 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/scheduler.ts                   |   8 +-
 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 +-
 101 files changed, 1388 insertions(+), 334 deletions(-)

Fusion-Task-Id: FN-2947
2026-04-29 17:38:25 -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
93b639f6a5 chore(release): v0.9.1
Version bump via changesets.
2026-04-29 16:29:16 -07:00
gsxdsm
94edc2176c fix(FN-XXX): improve git manager diff layout 2026-04-29 16:26:53 -07:00