Commit Graph

51 Commits

Author SHA1 Message Date
gsxdsm
c94e9be31c fix(dashboard): wider/resizable onboarding modal + GitHub CLI-aware messaging
- ModelOnboardingModal: native CSS resize with persisted size via
  useModalResizePersist; default ~1100px wide; modal scrolls inside
  the content area instead of clipping.
- Provider cards flex-wrap so the API-key form drops to a full-width
  row instead of being squished into a fixed side column. Connected
  badge no longer stretches the full body width.
- Step changes now reset content scrollTop so each page lands at the
  top.
- GitHub step: prominent GitHub mark via ProviderIcon; when gh CLI is
  authenticated the intro reads as 'you are all set', primary CTA
  becomes 'Continue with gh CLI auth', and a secondary
  'Connect OAuth (optional)' button is offered.
- CustomModelDropdown: highlight init runs once per open session, and
  filter changes reset highlight to top + scrollTop=0, fixing the
  scroll-fight when filtering models.
- TUI dashboard: at >=150 cols, Stats panel sits to the left of Logs;
  bottom row drops to Utilities + Settings.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 20:05:45 -07:00
gsxdsm
10034914fd feat(auth): add copy-to-clipboard for device codes in login instructions
Extract device codes from OAuth login instructions and render them with a copy button so users don't need to manually select and copy.
2026-04-26 11:44:33 -07:00
Fusion
96e02928d2 fix(FN-2572): remove dead onboarding modal exports
- Delete obsolete AppModals code that was accidentally left in ModelOnboardingModal.tsx
- Restore the Task type import used by the onboarding modal after dead code cleanup
- Drop the unused SettingsModal.css import tied to removed code paths
- Extend ModelOnboardingModal tests to guard against dead export regressions
2026-04-25 20:21:11 -07:00
gsxdsm
7b9c787690 feat(FN-2529): merge fusion/fn-2529 2026-04-25 17:44:55 -07:00
gsxdsm
9ae51273f3 refactor(dashboard): extract Settings, Memory, Auth, and Model Presets from styles.css
Sweep 3 of the styles.css split. Five settings-related blocks moved out of
the monolith into a single co-located SettingsModal.css. styles.css 3304 →
2509 (–795 lines).

Blocks moved:
- /* === Settings Layout === */          (194 lines)
- /* === Notifications Settings === */    (28 lines)
- /* === Memory Settings === */           (112 lines)
- /* === Auth Provider Cards === */ +
  /* === Provider Connection Status === */ (165 lines combined)
- /* === Settings: Model Presets === */   (93 lines)
- Settings lane badges + descriptions     (~27 lines)

Mobile @media rules whose selectors matched the moved blocks were also
migrated into SettingsModal.css's mobile block.

Kept global with documented reasons:
- .auth-status-badge (and color modifiers) — consumed outside settings by
  ModelOnboardingModal and ClaudeCliProviderCard.
- .settings-empty-state, .settings-muted, .settings-loading — broad reuse
  across BackendConnectionErrorPage, PluginManager, MemoryView etc.

Cross-component imports added: MemoryView.tsx and ModelOnboardingModal.tsx
now import SettingsModal.css to reach memory-* / auth-provider-card classes
they consume.

Test: settings-mobile.test.tsx had two assertions that incorrectly matched
literal pixel values; updated to the actual var(--space-*) token values
present in the rules. Verified live in browser (settings + memory tabs
render cleanly).

styles.css total reduction across the three sweeps: 4551 → 2509 (–45%).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 09:09:34 -07:00
Fusion
8938bdf93a feat(FN-2403): add project setup step to onboarding flow
- Introduce a new "project-setup" onboarding step between GitHub and first-task actions
- Gate first-task navigation on project selection and add contextual setup-wizard guidance
- Centralize ordered onboarding step definitions in shared state and reuse them for navigation/progress labels
- Extract ModelOnboardingModal styles into a dedicated component CSS file and update tests/mocks for the new step order
2026-04-25 07:04:50 -07:00
Fusion
937cb42dce fix(FN-2402): preserve onboarding stepper done state on completion
- Treat the completion view as an effective final step so all prior indicators/connectors remain marked done
- Mark the first-task step as completed before tracking onboarding completion and clear it from skipped state
- Replace hardcoded success colors in setup wizard stepper done styles with theme-aware done status tokens
- Add regression assertions verifying all step indicators and connectors stay in done state on the completion screen
2026-04-24 21:48:08 -07:00
Fusion
1d06305f57 fix(FN-2469): show GitHub OAuth instructions during onboarding login
- Resolve merge conflicts while preserving current provider grouping and onboarding flow
- Render GitHub login instructions in the onboarding connect CTA while auth is pending
- Add a dedicated test id for the GitHub onboarding instruction message to satisfy regression coverage
2026-04-24 20:50:46 -07:00
gsxdsm
5ba4395d4e fix(dashboard): mobile chat New Chat button placement + merged fn-2469
- ChatView mobile: hide the top sidebar header's "New Chat" button on
  <=768px and show the existing footer button as a pinned full-width
  action with safe-area padding. Both buttons existed in JSX; only
  CSS was needed.
- styles.css: comments compose/edit textareas use var(--surface) so
  they remain visible against the task detail modal's --card panel
  (in light theme --bg and --card both resolve to #ffffff).
- Includes resolved-conflict changes from fusion/fn-2469 in
  ModelOnboardingModal and SettingsModal (and the related test).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 20:43:22 -07:00
Fusion
820582b722 fix(dashboard): chat mobile single-pane, comment-box theme, ChatView FOUC
- ChatView mobile: add @media (max-width: 768px) so the session-list
  sidebar goes full-width and the thread is hidden when the sidebar
  is visible (and vice-versa). The component already had the state,
  back-button (ChevronLeft), and visibility toggling — only the CSS
  was missing.
- TaskComments compose/edit textareas now use var(--surface) for
  background. The base .spec-editor-feedback uses var(--bg), which
  in light theme resolves to #ffffff — the same as the task detail
  modal's --card panel — making the comment box invisible.
- ChatView CSS is now imported eagerly from App.tsx so it bundles
  into the main CSS file. Previously the lazy ChatView JS chunk
  loaded its CSS via an async <link> tag, producing a brief flash
  of unstyled chat UI on first render.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 20:43:21 -07:00
Fusion
f2ead692e5 feat(FN-2451): enforce connected-first AI onboarding provider order
- Rework ModelOnboardingModal provider rendering to use a single curated ordering across OAuth, API key, and Claude CLI cards while excluding GitHub
- Prioritize already-connected providers first, then apply deterministic family/alias sorting so Claude CLI appears near the top and provider controls remain intact
- Add onboarding-flow regression tests that verify provider ordering and preserved per-provider interactions after reordering
- Update dashboard styling to use token-based onboarding error text class and adjust related tests for resilient async and accessible section targeting
2026-04-24 12:35:48 -07:00
Fusion
7529d7a7ed fix(FN-2404): scope onboarding first-task creation to active project
- Guard onboarding first-task creation when no project is selected
- Pass projectId to createTask so onboarding tasks are created in the active project
- Update AppModals wiring tests to verify projectId forwarding for selected and unselected states
- Expand onboarding modal and flow regression tests to assert project-scoped task creation calls
2026-04-24 08:54:25 -07:00
gsxdsm
b478c252e2 feat(FN-2399): merge fusion/fn-2399 2026-04-24 00:43:15 -07:00
gsxdsm
200ebfcd39 refactor(dashboard,desktop,engine): remove unused imports, props, and locals
Clears the remaining no-unused-vars warnings across the dashboard app and
server, desktop main, and engine sources. Dead React state destructures are
collapsed to setter-only, unused props are underscore-prefixed to preserve
API shape, and unreferenced catch bindings are dropped. No behaviour change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 23:02:35 -07:00
gsxdsm
32da0aedac feat: add "Anthropic — via Claude CLI" as a first-class provider
Replaces the stray useClaudeCli settings checkbox + onboarding question
with a proper provider-card UX. The card lives next to OAuth + API-key
cards in onboarding and settings, with Enable/Disable + Test actions.

Backend:
 - Vendors rchern/pi-claude-cli@0.3.1 as packages/pi-claude-cli
   (MIT, attribution in UPSTREAM.md). Lets us bump peer-dep on
   pi-coding-agent in lockstep with Fusion (upstream pinned ^0.52.0
   vs ours ^0.62.0) and fix bugs without waiting on upstream.
 - Adds @fusion/pi-claude-cli as a workspace dep of @runfusion/fusion
   so users don't have to `npm install -g pi-claude-cli` manually.
 - serve/daemon/dashboard conditionally load the extension via
   discoverAndLoadExtensions() when GlobalSettings.useClaudeCli is on;
   no side-effects on user ~/.fusion/agent/settings.json.
 - New GET /api/providers/claude-cli/status: claude --version probe
   + toggle state + cached extension resolution.
 - New POST /api/auth/claude-cli: flips useClaudeCli, refuses if the
   claude binary is missing, fires the existing skill-backfill hook.
 - /api/auth/status now injects a synthetic {id:"claude-cli", type:"cli"}
   provider entry so onboarding + settings see a consistent list.

Frontend:
 - New ClaudeCliProviderCard component shared between ModelOnboardingModal
   and SettingsModal's Authentication section.
 - New AuthProvider.type = "cli" variant.
 - Removed the old "Route AI calls through the Claude CLI" checkbox from
   Global Models settings and the opt-in step from the onboarding wizard.
 - ProviderIcon gets a composite Anthropic-mark-plus-terminal glyph for
   the claude-cli provider id.

Tests:
 - 8 unit tests for extension resolution (@fusion/pi-claude-cli is
   workspace-linked so these run in-tree).
 - 2 unit tests for the binary probe.
 - Existing /auth/status tests filter out the new synthetic entry so
   they keep asserting structural OAuth/API-key behavior in isolation.
 - The vendored package's own 296 tests still pass unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 23:02:34 -07:00
Fusion
534be73bde fix: prevent nested .fusion/.fusion dir from PluginStore path bug
PluginStore's constructor treats its rootDir arg as a project root and
internally appends `.fusion` before opening the SQLite DB. Several CLI
call sites were passing the already-resolved `.fusion` directory,
producing a doubled `.fusion/.fusion/fusion.db` that the dashboard
process kept recreating on every project load.

Pass the project root instead so the DB lands in the canonical
`.fusion/fusion.db` alongside the rest of the project's state.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 23:02:33 -07:00
gsxdsm
d3c9476ce7 feat(FN-2318): merge fusion/fn-2318 2026-04-23 12:55:50 -07:00
gsxdsm
1b3d9cb90e feat(FN-2317): merge fusion/fn-2317 2026-04-23 11:00:04 -07:00
Fusion
fc43d2652c fix(FN-2313): make PR auth checks gh-first across settings UI
- Replace the server-computed settings flag with prAuthAvailable and document it in shared Settings types
- Compute PR auth availability from gh CLI auth first, with GITHUB_TOKEN as fallback in GET /api/settings
- Rename dashboard settings state/props/hooks from githubTokenConfigured to prAuthAvailable and strip server-owned auth fields on save
- Update PR section messaging to guide users to run 'gh auth login' and refresh related route/component tests
2026-04-23 10:58:36 -07:00
gsxdsm
d01fb6a01e feat(FN-2220): merge fusion/fn-2220 2026-04-22 01:31:40 -07:00
Fusion
2ec668059a feat(FN-1933): show masked API key hints in auth settings
- Add optional keyHint field to the auth provider client interface
- Return masked API key hints from /api/auth/status for API-key providers
- Render key hints in both Settings and onboarding provider cards when authenticated
- Add auth-key-hint styling using existing dashboard design tokens
2026-04-18 05:24:10 -07:00
Fusion
8a8f6bf938 feat(FN-1998): instrument onboarding funnel analytics events
- Add onboarding event tracking utility with localStorage persistence, session IDs, and ring-buffer pruning
- Emit funnel events from ModelOnboardingModal for step progress, dismissal/completion, and first-task/CTA actions
- Track resume-card and auto-trigger onboarding entry points in OnboardingResumeCard and useAuthOnboarding
- Expand dashboard tests and mocks to validate onboarding event storage behavior and new instrumentation calls
2026-04-17 08:01:38 -07:00
Fusion
4579e38bd6 fix(FN-1997): persist onboarding completion across first-task flows
- Extract a shared completeOnboarding helper to centralize settings persistence and completion tracking
- Reuse completion logic for finish, new-task, GitHub import, and post-inline-task navigation actions
- Mark onboarding complete after successful inline first-task creation so state is saved before leaving the modal
- Expand ModelOnboardingModal tests to cover completion persistence for finish, inline creation, View Task, and Go to Dashboard paths
2026-04-17 06:24:46 -07:00
Fusion
c3661c39e7 feat(FN-1942): harden onboarding first-task creation flow
- Add inline first-task description form in the onboarding final step
- Wire createTask with empty-input validation, loading state, and retry-friendly error handling
- Preserve typed task text and show inline error guidance when task creation fails
- Support success actions with either server-provided or inline-created task data
- Add comprehensive modal tests and token-based styles for new form and error states
2026-04-17 05:06:19 -07:00
Fusion
db883db162 feat(FN-1940): add onboarding first-task success handoff
- Track the first task created from onboarding in AppModals and pass it back into the onboarding modal
- Keep onboarding open after launching New Task, then switch to a task-created success state when a task is returned
- Add success actions to view the created task or return to the dashboard, while preserving the no-task completion path
- Style the task-created success panel and add comprehensive ModelOnboardingModal tests for transition, rendering, and button behavior
2026-04-17 04:23:27 -07:00
Fusion
b2c4fcafdc feat(FN-1939): add first-task onboarding readiness summary
- Add a ReadinessSummary component to ModelOnboardingModal with connected/missing/skipped states
- Derive AI provider, GitHub, and default model readiness details from auth status and onboarding skip data
- Replace first-task skip banners with a unified readiness summary plus an all-integrations-connected success state
- Add token-based dashboard styles for readiness summary rows, status variants, and mobile layout adjustments
- Expand ModelOnboardingModal tests to cover readiness scenarios and verify first-task skip banners are removed
2026-04-17 03:59:57 -07:00
Fusion
0a9fba6f81 feat(FN-1937): track skipped onboarding steps in modal progress
- Add skippedSteps persistence to onboarding state with new markStepSkipped/getSkippedSteps helpers and legacy defaults
- Update onboarding navigation so skip actions mark steps as skipped, while completed actions clear skipped state
- Render skipped progress indicators as clickable steps with a dash marker and dedicated skipped styling
- Expand onboarding state/modal tests and update App test mocks for the new onboarding-state exports
2026-04-17 02:38:29 -07:00
Fusion
7a971a3513 feat(FN-1936): clarify optional GitHub onboarding messaging
- Rewrite the GitHub onboarding step to emphasize that task creation works without GitHub
- Add a feature availability callout that contrasts capabilities with and without GitHub connection
- Update first-task CTA cards to dim GitHub import and show a connection-required note when unauthenticated
- Expand ModelOnboardingModal tests to cover optional messaging, CTA state changes, and step-specific rendering
2026-04-17 02:12:22 -07:00
Fusion
77f1133e24 feat(FN-1935): add API key validation feedback to onboarding modal
- Add provider-specific API key format rules, display names, and fallback validation hints
- Render inline format hints plus error/success feedback in the API key form
- Add styled input states for error/success and success message auto-clear timers
- Expand onboarding modal tests to cover validation, network/server errors, success lifecycle, and skip flow behavior
2026-04-17 01:54:24 -07:00
Fusion
d793b9cba1 feat(FN-1934): add GitHub onboarding status feedback states
- Derive GitHub-specific onboarding status from auth state, login outcomes, and persisted skip metadata
- Replace static GitHub auth text with status badge variants and contextual success/error/info feedback blocks
- Add retry, skip, and connect-anyway actions, including persistence and reset of skipped state on successful auth
- Style new GitHub feedback UI and badge states using dashboard tokens with mobile touch-target adjustments
- Expand ModelOnboardingModal tests to cover connected, pending, failed, skipped, and recovery flows
2026-04-17 01:09:16 -07:00
Fusion
1a10a03c26 feat(FN-1932): improve GitHub onboarding messaging and connect CTA
- Replace generic GitHub copy with a clear benefits list for issue, PR, and code-link workflows
- Promote the unauthenticated connect experience into a dedicated CTA container with primary button, icon, and inline feedback states
- Keep connected users focused on status and disconnect actions while hiding the connect CTA when already authenticated
- Expand ModelOnboardingModal tests to cover fallback guidance, benefits rendering, CTA styling, and connected-state behavior
2026-04-17 00:28:57 -07:00
Fusion
b44be2629e feat(FN-1931): add provider-specific API key onboarding form
- Add provider metadata for API key labels, setup instructions, usage text, and dashboard links with safe fallback defaults
- Extract API key entry UI into a reusable form component with connected/saved state, remove-key action, and Enter-to-save support
- Improve onboarding card rendering to use provider-specific descriptions and API key guidance for supported providers
- Update dashboard styles for the new API key form layout, key icon spacing, focus states, and mobile-friendly controls
- Expand ModelOnboardingModal tests to cover provider-specific copy, dashboard link behavior, Enter submission, connected badge text, and fallback instructions
2026-04-17 00:00:17 -07:00
gsxdsm
941acb6c66 feat(FN-1902): merge fusion/fn-1902 2026-04-16 09:53:15 -07:00
gsxdsm
44b3df562a feat(FN-1901): merge fusion/fn-1901 2026-04-16 09:38:12 -07:00
gsxdsm
3c3584d46c feat(FN-1900): merge fusion/fn-1900 2026-04-16 07:23:12 -07:00
Fusion
b5ad40aac0 feat(FN-1898): add provider descriptions and card layout to onboarding
- Add ProviderCard component displaying name, description, and model count
- Display provider descriptions during model onboarding flow
- Add card-based layout for provider selection in ModelOnboardingModal
- Add comprehensive tests for ModelOnboardingModal component
- Include CSS styles for provider cards with hover states
2026-04-16 06:53:15 -07:00
Fusion
5cf07c81fe feat(FN-1897): rewrite onboarding step copy for mixed-audience clarity
- Rewrite AI Setup step description to explain what Fusion does with AI models
- Update GitHub step text to clarify what linking enables (issue import, PR sync)
- Refresh First Task step to be more actionable and inviting
- Update completion message to guide users to the board
- Revise helper text across all steps to be warmer and less technical
- Update test assertions to match new copy
2026-04-16 01:22:37 -07:00
Fusion
b184468419 feat(FN-1899): implement login timeout, cancellation, and 409 conflict handling
- Add login outcome types (timeout, success, failed) and state tracking via stepData
- Implement login timeout after MAX_POLL_CYCLES (150 polls × 2s = 5 minutes) with warning toast
- Add 409 Conflict detection for concurrent login attempts with warning toast
- Add cancellation capability for in-progress logins with cleanup and state reset
- Update ModelOnboardingModal tests to cover timeout and concurrent login scenarios
2026-04-16 01:05:18 -07:00
Fusion
73c94d3076 feat(FN-1899): add login timeout, cancellation, and 409 conflict handling
- Add LoginOutcome type ('pending' | 'success' | 'failed' | 'timeout') with state tracking
- Implement AbortController-based cancellation for OAuth login flows
- Add timeout detection after MAX_POLL_CYCLES (150 polls, ~5 min)
- Handle 409 Conflict when concurrent login is attempted
- Persist login outcomes to onboarding stepData for session recovery
- Add getStepData mock export to App.test.tsx vi.mock
- Fix ToastType: use 'info' instead of invalid 'warning' type
2026-04-16 00:26:01 -07:00
gsxdsm
7c361a6d01 feat(FN-1768): merge fusion/fn-1768 2026-04-16 00:08:06 -07:00
Fusion
c34165ce80 feat(FN-1863): add non-blocking progression indicators to onboarding wizard
- Add 'Optional' badge to AI Setup and GitHub step headers
- Add 'Skip setup →' link on AI Setup step footer
- Add 'Skip GitHub →' link on GitHub step footer
- Add helper text on AI Setup step when no providers authenticated
- Add helper text on GitHub step when GitHub is available but not connected
- Add regression tests for all non-blocking progression behaviors
- Add CSS styles for optional badge, skip links, and helper text
2026-04-15 23:18:37 -07:00
Fusion
6a5542d1d9 feat(FN-1861): restore completed steps in onboarding resume flow
- Update getOnboardingResumeStep to include completedSteps array
- Allow backward navigation to previously completed steps in onboarding modal
- Show completed step count in the resume card UI
- Restore completed steps when reopening the onboarding modal
- Add comprehensive tests for completedSteps functionality and live auth reopen scenarios
2026-04-15 23:00:26 -07:00
Fusion
ed35b494fe feat(FN-1634): promote mailbox to first-class navigation view
- Add MailboxView as a full-page navigation view replacing the modal-based approach
- Migrate MessageStore from filesystem to SQLite backend for message persistence
- Implement conversation grouping for inbox display with unread badge state
- Remove modal plumbing (useModalManager, AppModals exports) and simplify App.tsx
- Add evictStaleProcessing() to TriageProcessor for self-healing hung triage sessions
- Add comprehensive MailboxView tests and Header mailbox tests
- Update README documentation with MailboxView features
- Add CSS styles for MailboxView component
- Fix MobileNavBar tests for mailbox tab visibility
2026-04-15 08:04:02 -07:00
Fusion
d4e90ccb9a feat(FN-1752): add relaxed ESLint rules for plugins and improve onboarding
- Relax ESLint rules for plugin templates and agent skill files to reduce false positives
- Add relaxed ruleset for TypeScript with explicit plugin overrides
- Add resume card UI for onboarding dismissal to allow users to restart setup
- Fix pre-existing test failures and TypeScript errors from experimentalFeatures merge
- Fix WebGL addon assertions in desktop package tests
- Remove unused CSS classes from dashboard styles
2026-04-15 00:28:49 -07:00
Fusion
123ec5949f feat(FN-1862): add completion state tracking for onboarding
- Add markOnboardingCompleted() to set completedAt timestamp when user finishes onboarding
- Add isOnboardingCompleted() to check if onboarding was completed (vs dismissed)
- Update ModelOnboardingModal to call markOnboardingCompleted on successful completion
- Skip onboarding auto-open when already completed locally
- Add completion state tracking tests in ModelOnboardingModal.test.tsx
- Add model-onboarding-state unit tests
- Update useAuthOnboarding to check local completion state before auto-opening
- Document localStorage completion state tracking pattern in .fusion/memory.md
2026-04-14 23:44:40 -07:00
gsxdsm
ea834b9550 feat(FN-1705): merge fusion/fn-1705 2026-04-14 22:00:56 -07:00
gsxdsm
5d18d85a8c feat(FN-1704): merge fusion/fn-1704 2026-04-14 21:00:56 -07:00
gsxdsm
e153864b5b fix: wire triage recovery into SelfHealingManager and fix duplicate imports
- Pass recoverApprovedTriageTask and getSpecifyingTaskIds callbacks from
  TriageProcessor to SelfHealingManager in InProcessRuntime. Without these,
  approved triage tasks stuck in 'specifying' status were never recovered.
- Remove duplicate imports in ModelOnboardingModal.tsx that caused TypeScript
  errors (duplicate identifiers: useEffect, useRef, ToastType, fetchAuthStatus).
- Add mock for model-onboarding-state in App.test.tsx.
2026-04-14 11:48:44 -07:00
gsxdsm
9c611cbea0 feat(FN-1727): add regression tests for saturated-slot scenarios
- Add core test for title summarization behavior under saturated task lane conditions
- Add engine test for heartbeat execution when task lanes are saturated
- Fix experimentalFeatures test to correctly expect merge semantics (not replacement)
- Ensure tests validate task selection and execution under concurrency limits
2026-04-14 11:38:14 -07:00
gsxdsm
d3e9f160b2 feat(FN-1703): merge fusion/fn-1703 2026-04-14 11:28:52 -07:00