- Attempt squash merge of fusion/fn-3095 onto current main and resolve SettingsModal.css conflict
- Preserve main-authoritative hover fallback value to avoid reintroducing stale branch content
- Confirm no net code changes remained after reconciliation against current main
- Verify repository passes required gates with pnpm test and pnpm build
This release (v0.15.0) brings significant plugin system enhancements including a new dependency graph plugin with dashboard view, plugin skills in session selection, and extended plugin UI slot metadata. Database improvements add SQLite WAL tuning, integrity checks, and batch writes for agent logs.
Fusion-Task-Id: FN-3117
This release (v0.15.0) introduces plugin dashboard views and a new dependency graph plugin, extends the plugin slot system with richer metadata surfaces and UX improvements, adds SQLite WAL tuning with integrity checks, and stabilizes agent run log streaming with enriched session labels. It also fix
Fusion-Task-Id: FN-3066
- Add plugin dashboard view registration and hosting across core, dashboard routes, and plugin SDK exports
- Integrate plugin-provided views into app navigation, mobile/header UI, and view state hooks with coverage
- Add fusion-plugin-dependency-graph example plugin with persisted storage, dashboard view UI, and manifest wiring
- Update plugin authoring and architecture docs for dashboard view extension points
- Add a changeset for @runfusion/fusion covering plugin dashboard view support
Fusion-Task-Id: FN-3079
This merge brings FN-3173's SQLite stability improvements: WAL tuning pragmas for better concurrency, periodic integrity checks with self-healing recovery, and batched agent log writes to reduce I/O overhead. It also includes a new cron-runner for scheduled maintenance tasks, TUI mouse wheel scrolli
Fusion-Task-Id: FN-3173
Enable xterm SGR mouse reporting in the dashboard TUI and dispatch
wheel events to the focused pane: task detail logs, Git lists
(commits/branches/worktrees), and Files view (tree or preview).
Mouse mode is enabled after Ink mounts so the leading ESC of wheel
reports never arrives alone — avoiding spurious Esc keypresses. We
omit motion-tracking modes so terminals still own drag gestures and
Shift+drag native text selection keeps working.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two follow-ups to the in-process backup interception:
- Previously the matcher only allowed a bare `npx` prefix, so the
canonical zero-install form `npx -y runfusion.ai backup --create`
(and any `npx --yes` / `-p <pkg>` / `--package=<pkg>` variant) fell
through to the legacy shell-out path. The matcher now consumes any
number of npx flags before the binary token so all canonical
invocations route through the in-process executor.
- Previously the matcher accepted arbitrary text after `--create` and
the runner silently dropped it. Authors writing
`fn backup --create && notify-send done` or
`fn backup --create | tee log` reasonably expected the trailing
side effect to fire. The matcher now refuses any command containing
shell continuations / redirections / substitutions
(`&&`, `||`, `|`, `;`, `>`, `<`, backticks, `$()`), and rejects
trailing positional arguments. Such commands shell out as the user
wrote them.
The matcher is now a small tokenizer rather than a regex collection,
so the contract is easier to read and the unit-test grid covers each
permitted prefix combination plus all the previously-unhandled shell
forms.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Demote the refresh message from console.error to debugMcp so it no
longer appears as an error in normal output.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Defaults to true so existing behaviour (dashboard probes PATH for `fn` /
`fusion` and surfaces install / version-mismatch states) is unchanged.
When the user toggles it off in Settings → General → CLI Binary:
- `GET /system/fn-binary/status` short-circuits before `detectFnBinary()`
and returns `state: "skipped"`. No `<bin> --version` subprocess is
spawned at all, so an outdated globally-installed CLI cannot run as a
side effect of opening the dashboard.
- The install banner is hidden when `state` is `"skipped"`.
- `POST /system/fn-binary/install` rejects with HTTP 409 since install
is the user action that the status check informs.
- The Settings UI gains a checkbox under the existing CLI binary panel.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two follow-up corrections to the in-process auto-backup interception:
- The matcher previously hijacked any `fn backup …` / `fusion backup …` /
`runfusion.ai backup …` form. The in-process replacement only knows how
to do `--create` + cleanup, so scheduling `--list`, `--cleanup`, or
`--restore <file>` would have silently executed a create instead of the
requested operation. The matcher is now anchored to `backup --create`
(with optional trailing flags), with positive/negative unit tests.
- Step-based automations (`AutomationStep` with `type: "command"`) also
shell out — the legacy-command interception alone left that path
vulnerable. `executeCommandStep` now applies the same in-process backup
detour, factored through a shared `runBackupActionInProcess` helper.
Independently, `runProbe` in fn-binary now spawns with `cwd: tmpdir()`.
The dashboard's `/system/fn-binary/status` route runs `<bin> --version`
on whatever fusion binary happens to be on PATH — older releases (e.g.
v0.13.0) initialise an engine and create a fresh `.fusion/<project>/
.fusion/` tree as a side effect. Pinning the probe's cwd to the OS temp
directory keeps any such artefacts off the developer's project.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The backup automation was scheduled with `npx runfusion.ai backup --create`, which spawns whatever fusion binary is on PATH. On developer machines that's usually an older globally-installed runfusion.ai (v0.13.0 at time of writing) which still carries the pluginStore-rootDir bug — every backup tick recreated `<project>/.fusion/.fusion/` with a fresh empty TaskStore.
Cron-runner and routine-runner now intercept any command matching `fn backup`, `fusion backup`, or `npx runfusion.ai backup` and call `runBackupCommand` directly via the engine's open TaskStore. The interception also handles existing schedules persisted with the old npx command, so users do not need to manually update their automation rows.
The default command for newly created backup schedules is also simplified to `fn backup --create` — both forms route through the same in-process executor.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Throws if a caller passes a path whose last two segments are both `.fusion` — that pattern only happens when a Store class joins `.fusion` onto a path that already ends in `.fusion`. Surfaces the bug at the call site instead of silently creating a stray nested directory under the project. Complements the recent in-process-runtime PluginStore fix by catching any other call paths still passing the wrong rootDir.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PluginStore expects a project-root path and appends `.fusion` itself, but the in-process runtime was handing it the already-resolved `.fusion` directory — producing a spurious `.fusion/.fusion/fusion.db` on every engine startup.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This merge lands v0.14.2, a release focused on plugin system improvements and UI refinements. The plugin SDK gains a new `plugin-loader` and `plugin-runner` module with cached contribution accessors, plus an event bridge overhaul in the Claude CLI integration. On the dashboard side, the agent log vi
Fusion-Task-Id: FN-3187
This merge adds a collapsible tool detail panel to the AgentLogViewer, introduces a plugin-runner module with cached contribution accessors in the core package, refactors the heartbeat and agent-tools engine modules, improves QuickChatFAB mobile alignment and chat streaming feedback, adds provider v
Fusion-Task-Id: FN-3184
Merged feat(FN-3059) which aligns provider metadata and documentation across the codebase, updating README and getting-started docs plus refinements to the CustomProviderForm and ProviderIcon dashboard components.
Fusion-Task-Id: FN-3059
This merge adds readonly custom tool preservation (FN-3140) with new plugin SDK types and documentation, fixes PluginManager responsive overflow (FN-3093), and integrates the fn-3065 branch with enhanced plugin authoring capabilities. The core plugin-types module was significantly expanded with 230+
Fusion-Task-Id: FN-3140
This merge lands v0.14.0, bringing task ingest contract documentation and todo creation wiring (FN-3065), a new Global → General settings pane with `fn --version` integration, and a fix for persisting priority changes from PATCH /tasks/:id. All changeset artifacts were consumed by the release; 53 fi
Fusion-Task-Id: FN-3065
Move the Star-on-GitHub toggle, CLI Binary panel, and update-check
controls out of project General into a new Global → General pane (with
an inline Updates subsection), matching their actual scope. Drop the
CLI Binary panel's outlined card background and apply the standard
horizontal indent so it doesn't bleed to the pane edges.
Wire --version / -v in the fn/fusion bin so the dashboard's CLI Binary
probe gets a real version string instead of booting the dashboard and
reporting "unknown".
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The dashboard task-edit route destructured every editable body field
except priority, so changing priority via the task-detail modal was
silently dropped before reaching store.updateTask. Wire priority
through with isTaskPriority validation (null resets to default).
Without this fix the priority-aware triage/scheduler/merge ordering
shipped previously had no effect for tasks edited in the dashboard.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Triage and the todo→in-progress scheduler already sorted by priority
(urgent→low, then createdAt ASC, then id ASC); the auto-merge queue
was strictly FIFO, so a backlogged low-priority task could merge
ahead of an urgent one. drainMergeQueue now picks the highest-
priority eligible task each iteration, and the four in-review sweeps
(startup, periodic, global unpause, engine unpause) sort by priority
before enqueueing so the single-item fast path also picks priority-
first. Picker is hardened against concurrent queue mutation by stop()
and pause-handler removal: it re-locates the chosen entry by id and
re-checks shuttingDown after awaiting getTask.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This merge introduces a standalone CLI binary mode ("droid") with a new dashboard panel for binary management, adds a todo planning entrypoint with peer exchange shutdown, and includes documentation updates for the CLI reference and standalone deployment. Key additions span the core database layer,
Fusion-Task-Id: FN-3046
This merge introduces a new Todo Planning mode for task creation, wiring the entrypoint through the dashboard and CLI, accompanied by a new `PlanningModeModal` component and associated tests. It also makes peer exchange shutdown deterministic in the engine, improves rate limiting for the planning fl
Fusion-Task-Id: FN-3064
This merge lands four features: a `/clear` command for Chat and Quick Chat with session banner fixes (FN-3062), a todo view redesign with restructured rows and improved styling (FN-3063), deterministic peer exchange shutdown with dashboard improvements (FN-3040), and a summary Q&A disclosure feature
Fusion-Task-Id: FN-3078
This merge lands seven features and fixes across the dashboard and engine. Notable changes: restructured TodoView rows with improved action row styling, added `/clear` command to Chat and QuickChat, persisted session banner dismissals with a hide-banner setting, made peer exchange shutdown determini
Fusion-Task-Id: FN-3040
This merge brings three major changes: a `/clear` command for Chat and QuickChat with a fixed session notification banner, a complete overhaul of the Todo item row structure and styling with mobile-responsive CSS tests and documentation of the action row pattern, and a significant expansion of droid
Fusion-Task-Id: FN-3063
The merge adds a `/clear` command to both the Chat view and Quick Chat that clears transient chat state on session resets, with tests for all new hooks and components. It also persists session banner dismissals via a new `useSessionBannerPref` hook, adds a hide-banner setting, and preserves planning
Fusion-Task-Id: FN-3062
The merge adds agent task auto-summarization with droid CLI path reconciliation, aligns agent asset directory naming with heartbeat path compatibility, and updates icon sizing across dashboard components. Session banner dismissals are now persisted with a new hide-banner setting in the preferences.
Fusion-Task-Id: FN-2986
- Replace the minimal droid provider test with comprehensive coverage across registration and streaming paths
- Add child_process and pi-ai mocks to exercise CLI process lifecycle, tool wiring, and message handling logic
- Cover success, error, abort, and edge-case behaviors for provider execution and event emission
- Increase regression protection for droid model discovery, deduplication, and provider integration flows
Fusion-Task-Id: FN-2986
Document the unconditional reload of the selected planning session into
the right pane on show, which shipped alongside 5398bc7 without an
explicit changeset entry.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Stop overwriting AI session titles with the "Planning session" fallback
during cross-tab broadcasts before initialPlan has hydrated on resume.
- Persist SessionNotificationBanner dismissals to localStorage keyed by
updatedAt so they survive refresh and auto-re-show on the next event.
- Add Settings → Appearance toggle to hide the banner entirely.
- Drop the inner scrollbar on the planning question list; let the outer
pane handle all scrolling.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The merge delivers three major features: a droid CLI path reconciliation extension that resolves workspace path mismatches for spawned agents, session-first quick chat with improved heartbeat prompts and a dramatically simplified QuickChatFAB component, and canonical agent asset directory naming wit
Fusion-Task-Id: FN-3033
This merge adds droid CLI path reconciliation as a new pi extension, wires agent task auto-summarization for the agent tools layer, makes the UsageIndicator component resizable with improved styling, and updates related tests and documentation. The core changes include a new `reconcile-droid-cli-pat
Fusion-Task-Id: FN-3060
Adds a new pi extension that reconciles droid CLI paths, with corresponding staging support in the tsup build config for bundling the droid-cli. The extension is wired into the engine and exported from core, with tests covering the path reconciliation logic.
Fusion-Task-Id: FN-2985
The merge introduces a new droid CLI extension with path reconciliation across daemon, dashboard, and serve commands, along with supporting core and engine utilities. It also removes stale lint suppression comments (FN-2983). Tests cover the new CLI extension and path reconciliation logic.
Fusion-Task-Id: FN-2984