Commit Graph

2551 Commits

Author SHA1 Message Date
Timothy Laurent
17c9da0732 feat(insights): model selector with favorites, provider filtering, and configured-providers-only API
- Wire up CustomModelDropdown in InsightsView with favorites support:
  favoriteProviders, favoriteModels, and toggle callbacks
- Auto-promote resolved planning provider as implicit favorite when
  no explicit favorites are set
- Filter /models API to only return providers with credentials in
  Fusion's own auth stores (primary + legacy .pi + models.json),
  excluding supplemental stores (Codex CLI, Claude Code, env vars)
  that surface unconfigured providers
- Still allow enabled extension providers (Claude CLI, Droid CLI,
  llama.cpp) when their settings toggles are on

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-07 14:10:45 -07:00
Timothy Laurent
4dfffaf14c fix(insights): fetch models internally so model dropdown is populated
InsightsView accepted a models prop that was never passed from App.tsx.
Now fetches models via fetchModels() on mount (same pattern as ChatView),
falling back to the prop if provided.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-07 14:10:45 -07:00
Timothy Laurent
97b3727a3a fix(settings): prevent project-level global keys from overriding global settings
getSettingsFast() and getSettings() spread project-level settings over
global settings without filtering by scope. A stale project-level
experimentalFeatures: {} in SQLite would override the global
experimentalFeatures: { insights: true, ... }, making all experimental
features invisible in the dashboard.

Now both methods strip global-only keys from project settings before
the merge, matching the behavior of getSettingsByScopeFast().

Also adds max-height and overflow-y to the overflow dropdown menu.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-07 14:10:45 -07:00
Timothy Laurent
c2b01ffab1 test(api): add triggerInsightRun model params tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-07 14:10:44 -07:00
Timothy Laurent
d1a192aa6a fix(insights): validate localStorage model values and tighten fallback condition
- Guard against malformed localStorage values (e.g. "provider/") by
  validating both parts are non-empty before sending to the server
- Only wire settings fallback when both provider AND modelId are
  explicitly provided, preventing mismatched provider/modelId combos

Addresses ISSUE-002 and ISSUE-003 from code quality review.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-07 14:09:39 -07:00
Timothy Laurent
f7080fef6a feat(insights): add collapsible model selector to InsightsView with gear trigger
Adds a Settings gear button to the InsightsView action bar that toggles a
collapsible model configuration row. The row contains a CustomModelDropdown
allowing users to override the insight generation model. Selections persist
to localStorage under the "fusion-insight-model" key. A yellow indicator dot
appears on the gear when a non-default model is active.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-07 14:09:39 -07:00
Timothy Laurent
1f5e928d7c feat(insights): thread model selection through useInsights hook
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-07 14:09:39 -07:00
Timothy Laurent
c7963e8e29 feat(api): add optional model params to triggerInsightRun
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-07 14:09:38 -07:00
Fusion
7b6bc2e531 feat(FN-3711): consolidate graph position storage and remove scopedStorage
Consolidated graph position storage into a canonical shared helper (`projectStorage.ts`) with hardened persistence logic and removed the duplicate `scopedStorage` module. Updated integration tests and documented the canonical storage approach. A smaller fix (`FN-3628`) addressed mobile touch targets

Fusion-Task-Id: FN-3711
2026-05-07 13:29:26 -07:00
Fusion
4f495fcc77 feat(FN-3628): fix chat mobile touch targets and token consistency
The merge brings a mobile accessibility fix to ChatView, improving touch target sizing and aligning CSS token usage with the dashboard's design system conventions.

Fusion-Task-Id: FN-3628
2026-05-07 13:27:50 -07:00
Fusion
15371e6c1d feat(FN-3557): add draft-apply save/cancel confirmations and SQLite approva
Merges a substantial cross-cutting batch: approval request persistence with a SQLite store (FN-3546), branch/baseBranch fields added to the task schema (FN-3429), project-node path mapping APIs and storage layer (FN-3428/FN-3503), draft-to-form unification and interview close/confirmation boundaries

Fusion-Task-Id: FN-3557
2026-05-07 13:11:37 -07:00
Fusion
19584fcdee feat(FN-3428): add project-node path mapping APIs and agent detail review-b
Merges FN-3428's branch-field contract and merge target override/default behavior tests across core, dashboard, and engine, plus a companion fix that sweeps subsumed autostash orphans and surfaces outcomes on the task feed. Adds project-node path mapping persistence APIs and schema (FN-3503), new ag

Fusion-Task-Id: FN-3428
2026-05-07 12:47:33 -07:00
Fusion
ad5bed22f8 feat(FN-3708): add tests for TodoModal lazy props
Adds test coverage for TodoModal's lazy-loaded prop handling, completing the second step of the FN-3708 test work.

Fusion-Task-Id: FN-3708
2026-05-07 12:30:18 -07:00
Fusion
c92eebc5c3 feat(FN-3701): add agent detail mail tab and review-before-apply flow to ag
The merge adds a mail tab to the agent detail view in the dashboard (with wiring and documentation), implements a review-before-apply draft gate in the experimental agent onboarding modal, and introduces an opt-in web builtin tool for AI agents with engine and CLI reference updates.

Fusion-Task-Id: FN-3701
2026-05-07 12:24:54 -07:00
Fusion
73dd8e8923 feat(FN-3465): add review-before-apply flow to agent onboarding modal, fix
Adds a review-before-apply flow to the Experimental Agent Onboarding Modal with an explicit draft review gate, updating the modal component and its co-located CSS, plus test coverage. Also corrects the focus ring token used in the ChatView session delete action.

Fusion-Task-Id: FN-3465
2026-05-07 12:18:45 -07:00
Fusion
0cfc160bd6 feat(FN-3556): add review-before-apply flow with explicit draft review gate
This merge adds an agent permission policy model with persistence (FN-3545), an explicit draft review gate for task workflow steps (FN-3556), web builtin tool opt-in for AI agents (FN-3713), an inline fast mode toggle wired into peer execution (FN-3711), and a retry mechanism for overlapping task ID

Fusion-Task-Id: FN-3556
2026-05-07 12:12:54 -07:00
Fusion
cc02def488 feat(FN-3711): add inline fast mode toggle and wire shared state in peer ex
This merge introduces several dashboard and engine improvements: agent inbox wake controls (FN-3087, FN-3588) with immediate message triggers; separated plugin lifecycle from setup probe state (FN-3704); assigned-agent triage inheritance in the engine (FN-3703); inline fast mode toggle in the task d

Fusion-Task-Id: FN-3711
2026-05-07 11:54:41 -07:00
Fusion
24325cd3c1 feat(FN-3710): retry overlap-class cluster create failures in distributed t
Adds retry logic for distributed task ID overlap conflicts across the cluster, hardening the ID allocator with exponential-backoff recovery, wiring the retry into task workflow registration, and documenting the behavior in architecture docs. Minor CSS tokenization on the Mailbox and Plugin Manager m

Fusion-Task-Id: FN-3710
2026-05-07 11:48:25 -07:00
Fusion
a98e5aac1a feat(FN-3712): add provider response copy action to chat bubble
The merge delivers four distinct features: a copy-to-clipboard action on provider responses in the chat bubble (FN-3712, with styling and tests across ChatView), richer agent onboarding drafts documented and wired into the dashboard onboarding modal (FN-3555), assigned-agent triage inheritance so ag

Fusion-Task-Id: FN-3712
2026-05-07 11:41:01 -07:00
Fusion
e60c8c3c5a feat(FN-3555): document richer onboarding drafts in agents.md and dashboard
Documents richer onboarding drafts in agents.md and updates the dashboard README with a small addition, completing Step 4 of the onboarding feature.

Fusion-Task-Id: FN-3555
2026-05-07 11:25:01 -07:00
Fusion
a01aa31ab8 feat(FN-3704): separate plugin lifecycle from setup probe state
Fixes a bug where plugin lifecycle operations were incorrectly gated by the setup probe state, separating the two concerns across the API, PluginManager component, routes, and tests, with updated documentation.

Fusion-Task-Id: FN-3704
2026-05-07 10:48:28 -07:00
Fusion
0efba0890f feat(FN-3588): add immediate wake controls for agent inbox and message API
The merge delivers four major bodies of work. The dominant theme is FN-3588, which adds an "immediate wake" override to the message inbox API, exposes it in the MailboxModal UI, and updates `agent-heartbeat.ts` and `executor.ts` to honor the override alongside timer/signal triggers. FN-3705 gates re

Fusion-Task-Id: FN-3588
2026-05-07 10:41:11 -07:00
Fusion
1c0aef28cd feat(FN-3702): fix todo mobile layout keyboard handling and modal row heigh
This merge lands a comprehensive testing suite quality overhaul: new browser layout smoke tests, reverse-dependent test coverage, hardened local test infrastructure, and documentation of the agent test workflow, alongside a mobile keyboard-safe TodoView layout fix.

Fusion-Task-Id: FN-3702
2026-05-07 10:27:48 -07:00
gsxdsm
3948a49eea Merge pull request #51 from Runfusion/codex/testing-suite-quality-prd
test: harden and slim local test workflow
2026-05-07 10:18:35 -07:00
gsxdsm
e3f2e4c3be fix: resume distributed task ID counter past existing IDs; extract plugin view types
The dashboard task-create route now uses the distributed task ID allocator
(FN-3450). On projects whose tasks had been allocated through the legacy
config.nextId counter, the allocator's `ensureStateRow` was seeding a fresh
prefix at sequence 1, so new tasks restarted at FN-001 even when FN-3700
already existed. ensureStateRow now seeds past:

- the legacy config.nextId counter (when configured taskPrefix matches), and
- one past the highest numeric suffix on any existing tasks/archivedTasks row
  for the prefix.

A regression test seeds FN-3700 in a fresh DB and asserts the next reservation
returns FN-3701, not FN-001.

Plugin dashboard view contracts are now exposed via a slim type-only module
(`@fusion/dashboard/app/plugins/types`). External plugin tsc builds previously
imported `pluginViewRegistry`, transitively pulling in dashboard runtime
sources (React components, CSS, lucide-react). The dependency-graph plugin's
import + path mapping is updated to use the new module.

Schema housekeeping: drop unused scaffolding tables left over from an earlier
migration via a new idempotent migration (v67). Fresh DBs see no change;
existing DBs that ran the older migration get the orphan tables dropped on
next init.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 09:41:42 -07:00
Fusion
e7deab16b8 feat(FN-3087): document graph plugin in plugin authoring guide
Documentation-only finish for FN-3087, adding changeset and README updates for the dependency graph plugin and plugin authoring guide.

Fusion-Task-Id: FN-3087
2026-05-07 08:49:19 -07:00
Fusion
1f5e102312 feat(FN-3554): expand AI agent interview onboarding flow
Reuses the experimental onboarding modal for both create and edit, makes
onboarding mode-aware, and plumbs draft handling through the agent detail
view, new agent dialog, and import/export/generation routes.

Fusion-Task-Id: FN-3554
2026-05-07 08:49:18 -07:00
Fusion
760621cc8c feat(FN-3393): add eval settings with scheduled eval project settings UI
Adds a scheduled eval settings feature (FN-3393) with a new `evalSettings` contract in core, type-safe numeric validation, a project settings UI section, and an API route for persisting the payload. The bulk of the changes are in the settings modal and supporting test coverage. Two smaller, unrelate

Fusion-Task-Id: FN-3393
2026-05-07 08:49:18 -07:00
Fusion
4338b590c6 feat(FN-3091): add plugin view remount routing test coverage
Adds test coverage for plugin view remount routing behavior in the App component.

Fusion-Task-Id: FN-3091
2026-05-07 08:49:18 -07:00
Aron Prins
f85b124125 test(FN-000): resolve dashboard test noise 2026-05-07 17:27:15 +02:00
Fusion
5ffd1485c3 feat(FN-3581): honor runtime model precedence for assigned agents
This merge delivers five major feature clusters: a fully rebuilt dependency graph plugin with draggable nodes, position persistence, modular architecture, highlighting and selection states, toolbar navigation, and keyboard controls; a new roadmap plugin with domain store, ordering logic, and compreh

Fusion-Task-Id: FN-3581
2026-05-07 06:45:45 -07:00
Fusion
be54c30980 feat(FN-3636): add roadmap plugin with domain store and ordering logic
Merges the roadmap plugin scaffold (FN-3636): a new `plugins/fusion-plugin-roadmap` workspace with domain types (`roadmap-types.ts`), a store layer (`roadmap-store.ts`, `roadmap-ordering.ts`, `roadmap-handoff.ts`), and comprehensive test suites. Also lands graph position persistence for the dependen

Fusion-Task-Id: FN-3636
2026-05-07 06:28:10 -07:00
Fusion
957b8b4efe feat(FN-3463): refine ScriptsModal responsive token usage
Refines responsive CSS token usage in the ScriptsModal component by swapping hardcoded values for design token variables.

Fusion-Task-Id: FN-3463
2026-05-07 05:40:22 -07:00
Fusion
e56f60371b feat(FN-3623): add stash diff viewing UI and backend contract
Merges FN-3623 stash diff inspection system (backend contract, GitManagerModal viewing UI with new API route and tests) and FN-3088 dependency graph hover/selection highlighting. The stash diff work dominates the commit count and touches the core GitManagerModal, while the graph plugin gains new hig

Fusion-Task-Id: FN-3623
2026-05-07 05:09:57 -07:00
Fusion
3735e0565a feat(FN-3396): bundle Cursor CLI as a plugin provider with dashboard auth w
Merges FN-3396's full Cursor CLI provider integration (Steps 1–4): defines a CLI-backed provider contract, adds the `fusion-plugin-cursor-runtime` plugin package with process management and runtime probes, wires dashboard auth flows and UI (ProviderCard, onboarding modal, settings), and bundles the

Fusion-Task-Id: FN-3396
2026-05-07 04:17:52 -07:00
Fusion
f4568088e0 feat(FN-3625): test TaskCard drag override and graph drag opt-out wiring
Adds test coverage for TaskCard drag override behavior and DependencyGraph drag opt-out wiring, with a minor README clarification in the graph plugin.

Fusion-Task-Id: FN-3625
2026-05-07 03:28:43 -07:00
Fusion
2053b66784 feat(FN-3426): add plugin AI security scan gate and GraphTaskNode wrapper t
Adds a plugin AI security scan gate that enforces security scanning before plugin installation, including new `plugin-security-scan.ts` infrastructure, CLI integration (`fn plugin install`), plugin loader hooks, and a changeset. Implements branch filter persistence across sessions in the dashboard (

Fusion-Task-Id: FN-3426
2026-05-07 02:49:35 -07:00
Fusion
fce3668a83 feat(FN-3077): enforce plugin AI security scan gate across install flows
- Add core plugin AI security scan module and schema support for scan toggle/state metadata
- Enforce scan checks during CLI and dashboard plugin install flows, with preserved API error status on scan failures
- Expose plugin scan toggle and rescan actions in dashboard/plugin manager with route and UI coverage
- Update plugin authoring and CLI/dashboard docs, plus add changeset for published CLI package

Fusion-Task-Id: FN-3077
2026-05-07 02:15:14 -07:00
Fusion
ccddba4a67 feat(FN-3425): add board branch filter with no-branch semantics and respons
Restructures the dependency graph plugin into a modular architecture with separate edges, filters, layout, types, and interaction hooks, adding comprehensive tests for the new modules. Implements a board branch filter with "no-branch" semantics and responsive layout refinement, while removing legacy

Fusion-Task-Id: FN-3425
2026-05-07 01:53:48 -07:00
Fusion
fa57034c05 feat(FN-3632): remove quick-entry branch handling from dashboard and docs
Removes the `QuickEntryBox` component and its styles as part of FN-3632 cleanup, with its tests refactored accordingly. Also updates the test-changed script and fixes an isolated test home cleanup ordering issue.

Fusion-Task-Id: FN-3632
2026-05-07 01:30:34 -07:00
Fusion
16c0477e15 feat(FN-3631): replicate task creation across mesh nodes and fix modal scrolling
- Add mesh task replication plumbing in core store/types with node-aware task creation metadata
- Expose dashboard and mesh API route coverage for replicated task creation and sync behavior
- Restore independent scrolling in Git Manager changes list and prevent Scripts modal scroll regressions
- Expand tests across core, dashboard routes, API, and CLI extension insights for the new behavior

Fusion-Task-Id: FN-3631
2026-05-07 00:52:05 -07:00
Fusion
935166dbb5 feat(FN-3450): add mesh task create replication across nodes
Implements distributed mesh task creation by adding replicated create primitives to the core store, wiring new API routes (`register-mesh-routes.ts`) that replicate task creation across clustered nodes while preserving remote-targeting metadata, and updating the dashboard's task creation flow accord

Fusion-Task-Id: FN-3450
2026-05-07 00:05:34 -07:00
Fusion
967896fb16 feat(FN-3080): document graph navigation canonicalization in plugin authori
Adds documentation for graph navigation canonicalization (FN-3080) covering plugin authoring and dashboard usage, along with a changeset for the `@runfusion/fusion` package release.

Fusion-Task-Id: FN-3080
2026-05-06 22:59:51 -07:00
gsxdsm
98e8b6a134 fix(dashboard): block iOS visualViewport pan while chat keyboard is up
Previous textarea-only touchmove listener didn't catch swipes that
started elsewhere (header, composer padding) — those still panned the
iOS visualViewport over the locked document, sliding the composer up.

Replaces it with a document-level non-passive touchmove listener that
fires while keyboardOpen on mobile and preventDefaults all gestures
EXCEPT when the target is inside .chat-messages (the one container
where pan-y should still work). Stops both header-swipe and composer-
swipe from panning the page, while leaving messages-list scroll
intact.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 22:44:16 -07:00
gsxdsm
f28e75cc90 fix(dashboard): use non-passive touchmove listener on textarea
React's onTouchMove handler is registered as a passive listener by
default, so the previous JSX-handler preventDefault() was silently a
no-op — drags on the composer still scrolled the input box up.

Attaches the listener imperatively via addEventListener with
{ passive: false } so preventDefault actually cancels the drag. Tap
(touchstart + touchend without touchmove between) is still unaffected,
so first-tap focus continues to work.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 22:39:35 -07:00
gsxdsm
bb11c7102d Reapply "fix(dashboard): block composer drag-pan via onTouchMove preventDefault"
This reverts commit 60853dab02.
2026-05-06 22:37:24 -07:00
gsxdsm
60853dab02 Revert "fix(dashboard): block composer drag-pan via onTouchMove preventDefault"
This reverts commit feb1be3d14.
2026-05-06 22:36:04 -07:00
gsxdsm
9b2fc4565b fix(dashboard): parse Codex reset_at as epoch ms or seconds
Codex returns weekly window reset_at in milliseconds in some cases,
which was being multiplied by 1000 and producing nonsensical reset
countdowns and pace calculations. Route through _parseResetTimestamp
so both formats work, and add a regression test.

Also tightens comments in useMobileKeyboard / ChatView around why
visualViewport scroll events skip offsetTop updates.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 22:17:35 -07:00
Fusion
f77f691d26 feat(FN-3626): migrate plugin storage to project-scoped storage
Migrated the dependency-graph plugin's storage layer to use the project's scoped storage API (`projectStorage`) and added canonical storage-key assertions. The ChatView.tsx utility reference was updated to match the new storage path.

Fusion-Task-Id: FN-3626
2026-05-06 22:17:35 -07:00
Fusion
07b286ba7a feat(FN-3575): rebuild plugin system with catalog, settings, and CLI comman
Restores plugin management features across the CLI and dashboard, including a new `plugin available/settings` commands and a refactored PluginManager component that groups built-in plugins (agent-browser, fusion) separately from custom ones, with updated documentation on the plugin authoring guide.

Fusion-Task-Id: FN-3575
2026-05-06 22:17:35 -07:00