Commit Graph

1565 Commits

Author SHA1 Message Date
gsxdsm
5efaefbe1b feat(FN-1377): register 6 new themes in ThemeSelector and flash-prevention 2026-04-10 00:58:52 -07:00
gsxdsm
01d9fba122 feat(FN-1377): add swatch classes for 6 new themes 2026-04-10 00:58:12 -07:00
gsxdsm
1909851bba feat(FN-1377): add CSS theme blocks for 6 new themes 2026-04-10 00:57:29 -07:00
gsxdsm
e5479d9692 feat(FN-1377): add sandstone, lagoon, frost, lavender, neon-bloom, sepia theme IDs to core types 2026-04-10 00:56:12 -07:00
gsxdsm
4ea294b8be feat(FN-1360): add chat API with AI agent and SSE streaming
- Add ChatManager class for managing chat sessions with AI agent integration
- Implement SSE streaming for real-time chat responses
- Add chat API routes for creating sessions, sending messages, and streaming responses
- Wire ChatStore and ChatManager into server initialization
- Add comprehensive test suite for all chat routes
2026-04-10 00:48:47 -07:00
gsxdsm
9575350432 feat(FN-1265): add agent budget settings UI and API
- Add Budget Settings section to ConfigTab with token limit, usage threshold, budget period, and reset day inputs
- Add budget usage badge to DashboardTab showing token consumption and threshold warning
- Add budget API functions to api.ts (getBudgetSummary, updateBudgetConfig, deleteBudgetUsage)
- Add budget routes to routes.ts for GET/PATCH/DELETE agent budget endpoints
- Add CSS styles for budget progress bar, warning indicators, and section layout
- Add comprehensive tests for budget UI components and API routes
2026-04-10 00:25:17 -07:00
gsxdsm
db14d9e077 feat(FN-1409): extract color-theme CSS to separate theme-data.css
- Extract all color-theme CSS variable blocks from styles.css into a dedicated theme-data.css file
- Add dynamic loading of theme-data.css for non-default color themes via useTheme hook
- Preload theme-data.css for the default theme in index.html to avoid flash
- Update status-colors-theme tests for dynamic theme loading behavior
- Update memory and README with theme-data.css file location
2026-04-10 00:07:35 -07:00
gsxdsm
dfaf768601 feat(FN-1430): add worktree execution boundaries to prevent out-of-scope modifications
- Add worktree-aware path boundaries in agent factory to prevent cross-task contamination
- Sync core agent prompts with worktree boundary guidance for consistent enforcement
- Add boundary guidance to executor prompts so agents understand their scope
- Fix TypeScript types for worktree boundary wrapping
- Add comprehensive tests for boundary wrapping behavior
- Create changeset for @gsxdsm/fusion (minor)
2026-04-09 23:59:45 -07:00
gsxdsm
cba41e68d6 feat(FN-1408): add node provider and remote node status integration
- Add NodeProvider and useNodeContext to App shell for centralized node state
- Add node selector dropdown and status indicator to Header component
- Wire remote node data and event hooks into task-facing views
- Update App.test.tsx mocks for new node context providers
- Add project memory learnings for node context wiring patterns
- Update dashboard guide documentation for node selection
2026-04-09 23:42:25 -07:00
gsxdsm
5063e24057 feat(FN-1408): complete Step 1 - Add node context plumbing at App shell
- Wrap AppInner with NodeProvider in App.tsx
- Read node context state (currentNode, currentNodeId, isRemote, setters)
- Add useRemoteNodeData and useRemoteNodeEvents hooks
- Sync selected node with useNodes() results
- Update Board/ListView/ExecutorStatusBar to use remote tasks when in remote mode
- Add mocks for NodeContext, useRemoteNodeData, useRemoteNodeEvents, useNodes in App.test.tsx
- Clear fusion-dashboard-current-node in test setup to avoid cross-test leakage
2026-04-09 23:28:25 -07:00
gsxdsm
b1fc0369e6 feat(FN-1387): add fullscreen expand toggle to agent log viewer
- Add expand/collapse fullscreen button to AgentLogViewer header
- Implement fullscreen mode with fixed overlay positioning
- Add CSS styles for fullscreen container and header visibility
- Add comprehensive tests for fullscreen toggle functionality
2026-04-09 23:22:28 -07:00
gsxdsm
bba1e45de7 feat(FN-1504): add non-mobile search toggle for board/list views
- Add search toggle button to header controls for non-mobile viewports
- Toggle persists search visibility state across board and list views
- Implement responsive visibility rules (show on non-mobile, hide on mobile)
- Add comprehensive tests for tablet header controls and Header component
- Update Header component with search toggle functionality
2026-04-09 23:03:05 -07:00
gsxdsm
7b4b54cec3 feat(FN-1376): update settings-scope-icon CSS for SVG theme awareness
- Replace font-size/line-height with inline-flex layout for SVG compatibility
- Add explicit color: var(--text-muted) for consistent theming across light/dark modes
- Improve alignment with vertical-align: middle for scope indicator icons
2026-04-09 23:02:29 -07:00
gsxdsm
1d42066f86 feat(FN-1491): add centralized agent health status utility
- Create agentHealth.tsx utility with consistent health status logic
- Update AgentDetailView, AgentListModal, and AgentsView to use centralized utility
- Add comprehensive tests for health status edge cases
- Update agents.md documentation with health status reference
- Add changeset for @gsxdsm/fusion patch release
2026-04-09 22:58:47 -07:00
gsxdsm
607a103ee9 feat(FN-1517): harden Kimi 404 handling to retry on any 404
- Add comprehensive tests for Kimi API 404 retry behavior
- Expand retry logic to handle any 404 response from Kimi API
- Add test cases for various 404 scenarios including context errors and quota exhaustion
- Improve error handling resilience for Kimi model calls
2026-04-09 22:58:08 -07:00
gsxdsm
a54b0fa27f fix(FN-1374): truncate mission labels on task cards
- Add truncation logic for mission labels exceeding max length in TaskCard component
- Add CSS text-overflow styles for mission label ellipsis display
- Add unit tests for mission label truncation behavior
2026-04-09 22:55:24 -07:00
gsxdsm
f4c861e192 feat(FN-1372): reduce mobile nav bar height from 56px to 48px
- Reduce MobileNavBar height from 56px to 48px for a more compact mobile experience
- Update footer safe area padding to accommodate the new nav height
- Update board mobile layout tests to reflect the reduced height
- Update mobile nav bar CSS tests for the new height value
2026-04-09 22:50:43 -07:00
gsxdsm
9411721d83 feat(FN-1474): swap Kimi endpoint order to put Codexbar-validated underscore endpoint first
- Reorder Kimi API endpoint list to prioritize the underscore-variant endpoint
- Add tests to verify endpoint priority selection
- Ensure Codexbar-validated endpoint is tried first in the fallback chain
2026-04-09 22:31:31 -07:00
gsxdsm
094db24992 fix(engine): recover stuck in-review merges 2026-04-09 22:30:41 -07:00
gsxdsm
b93c418356 fix: recover tasks stuck in review after pause 2026-04-09 22:14:44 -07:00
gsxdsm
0d2a989f07 feat(FN-1496): harden semaphore lane-vs-utility boundary
- Add explicit boundary comments to serve.ts and dashboard.ts clarifying semaphore lane usage
- Add regression tests for semaphore lane-vs-utility boundary in serve.test.ts and dashboard.test.ts
- Add changeset for @gsxdsm/fusion patch release
2026-04-09 21:52:07 -07:00
gsxdsm
5883dffc74 feat(FN-1484): fix agent picker stale cache on project switch
- Clear agent cache when projectId changes in QuickEntryBox and InlineCreateCard
- Add regression tests for agent picker cache invalidation behavior
- Add changeset for @gsxdsm/fusion patch release
2026-04-09 21:39:09 -07:00
gsxdsm
b7005001d2 feat(FN-1474): add Kimi endpoint fallback for 404 url.not_found 2026-04-09 21:36:53 -07:00
gsxdsm
2ef27cf749 feat(FN-1472): add responsive terminal layout for TUI
- Add ResponsiveLayout component with dynamic row/column splitting based on terminal size
- Create terminal utility for detecting terminal dimensions and layout preferences
- Add truncate utility for smart text truncation with min/max bounds
- Implement comprehensive responsive layout tests with all breakpoints
- Update TUI exports to expose new layout and utility components
- Enhance README documentation with responsive layout guide and examples
2026-04-09 21:32:19 -07:00
gsxdsm
b738019ddb feat(FN-1500): suppress per-tool triage stdout spam
- Add tool-specific toolOutput handler in triage agent to filter per-tool output
- Add test coverage for tool output suppression behavior
- Suppress console spam from read_file, Read, glob, Grep tools during triage runs
- Update memory documentation with Vitest expect.any(Number) pitfall
2026-04-09 21:28:30 -07:00
gsxdsm
51a57045e1 feat(FN-1503): refine Kimi logo with official crescent moon brand mark
- Update ProviderIcon with Kimi's official crescent moon brand mark
- Add comprehensive tests for ProviderIcon component with Kimi logo variants
- Include changeset for @gsxdsm/fusion package
2026-04-09 21:28:00 -07:00
gsxdsm
cf5a979929 feat(FN-1483): add agent assignment to New Task modal
- Add agent picker dropdown to New Task modal for task assignment at creation time
- Include assignedAgentId in task creation payload when an agent is selected
- Add comprehensive regression tests for agent assignment functionality
- Update AGENTS.md documentation with New Task modal agent assignment details
2026-04-09 21:24:07 -07:00
gsxdsm
375f431f69 feat(FN-1468): wire plugin backend into dashboard and serve startup
- Add plugin backend wiring to fn dashboard startup
- Add plugin backend wiring to fn serve (headless node) startup
- Document plugin wiring pattern in project memory
- Add comprehensive tests for plugin initialization in dashboard and serve commands
- Include changeset for @gsxdsm/fusion package
2026-04-09 21:22:46 -07:00
gsxdsm
a8f4c3d447 feat(FN-1471): add global keyboard shortcuts hook to TUI
- Create useGlobalShortcuts hook for centralized keyboard shortcut handling at app root
- Add FocusGuardRef module-level ref for tracking text input focus state
- Implement HelpOverlay component displaying available keyboard shortcuts
- Add Ctrl+C (emergency exit), q (quit), ?/h (help toggle), 1-5 (screen switch) shortcuts
- Focus guard prevents shortcuts when text input is focused (except Ctrl+C)
- Update ScreenRouter with controlled/uncontrolled mode support
- Wire global shortcuts into demo app with help overlay integration
- Add comprehensive tests for useGlobalShortcuts and HelpOverlay
- Update README with global shortcuts documentation and usage examples
2026-04-09 21:19:20 -07:00
gsxdsm
591e9d8b01 feat(FN-1481): add regression tests for subtask modal send-to-background vs cancel semantics
- Add regression tests for SubtaskBreakdownModal
- Test send-to-background behavior preserves session state
- Test cancel behavior properly closes modal and cleans up
- Verify correct callback invocation for each action
2026-04-09 21:09:16 -07:00
gsxdsm
402b1db123 fix(FN-1475): replace Kimi logo with correct Moonshot AI brand mark
- Update ProviderIcon.tsx to use Moonshot AI logo instead of Kimi branding
- Fix logo display in UsageIndicator component
- Add ProviderIcon unit tests covering all provider icons
- Add UsageIndicator tests for provider icon rendering
- Add CustomModelDropdown integration tests for model selection flow
2026-04-09 21:08:16 -07:00
gsxdsm
3ab16f6ad4 feat(FN-1477): add memory pruning to daily insight extraction
- Add pruneStaleMemoryEntities() function to memory-insights.ts
- Integrate memory pruning into dailyInsightExtraction() workflow
- Add maxMemoryAgeDays setting (default: 30 days) for configurable pruning threshold
- Include pruned count in daily insight report summary
- Add comprehensive unit tests for memory pruning logic
- Update docs: architecture, memory-plugin-contract, settings-reference, contributing
2026-04-09 21:07:48 -07:00
gsxdsm
6f1183b8b1 feat(FN-1259): add review handoff feature for user task assignment
- Add assigneeUserId field to Task and TaskDetail types
- Add reviewHandoffPolicy project setting (manual/auto/delegated modes)
- Implement handoff detection policy in executor with session state tracking
- Add dashboard API routes for user assignment and handoff endpoints
- Add frontend API functions for review handoff UI integration
- Add tests for review handoff feature endpoints
- Fix test duplicates and finalize documentation
2026-04-09 21:07:08 -07:00
gsxdsm
34c11a7078 feat(FN-1259): add review handoff mechanism for user assignment
- Add assigneeUserId field to Task type and SQLite schema for human assignment
- Add reviewHandoffPolicy setting to control automatic handoff behavior
- Implement handoff detection in executor: detect user assignment during review and auto-transition task
- Add dashboard API routes for user assignment, handoff queries, and completion
- Add frontend API functions: getHandoffTask, assignTaskToUser, completeHandoff
- Add comprehensive tests for store methods, API routes, and executor handoff logic
- Update memory documentation with review handoff pattern
2026-04-09 21:06:19 -07:00
gsxdsm
00e04c2d05 feat(FN-1470): implement ScreenRouter with tab bar and keyboard navigation
- Add ScreenRouter component for multi-screen navigation in TUI
- Implement tab bar with icon labels and active state indicators
- Support keyboard navigation with arrow keys and Tab/Shift+Tab
- Add mouse click support for tab selection
- Export new screen router components from package index
- Add comprehensive unit tests for navigation behavior
- Update documentation with architecture and gap analysis
- Update TUI README with ScreenRouter usage examples
2026-04-09 20:59:00 -07:00
gsxdsm
0c845b97bc fix: force-requeue stuck task when hung subprocess blocks executor unwind
When a stuck task's session is disposed but an in-flight bash subprocess
keeps running, the executor's Promise never resolves, so the requeue
finally block never fires and the task stays stranded in-progress
indefinitely (observed with FN-1269).

Add a 60s safety-net timer in markStuckAborted: if the task is still in
executing after the grace period, force-requeue it directly by clearing
the worktree, setting status=stuck-killed, moving to todo, and removing
it from the executing set so the scheduler can re-dispatch normally.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 20:12:09 -07:00
gsxdsm
e015fc8a54 feat(FN-1456): add explicit abandon flow for planning and subtask AI sessions
- Add abandon action to useBackgroundSessions hook for deterministic session cleanup
- Make background dismissal deterministic instead of relying on 7-day TTL expiration
- Update PlanningModeModal to include abandon button in header actions
- Add comprehensive tests for abandon behavior and session lifecycle
- Update dashboard guide with session lifecycle documentation
2026-04-09 19:35:17 -07:00
gsxdsm
7bd98d888c feat(FN-1429): enforce always-green test-suite instructions for executor agents
- Add explicit always-green test suite instructions to executor agent prompts
- Update executor to enforce test-suite validation before task completion
- Add tests for agent prompt generation and executor behavior
- Ensure test failures block merge-ready state rather than allowing broken builds
2026-04-09 19:33:44 -07:00
gsxdsm
e1cd7e0876 feat(FN-1440): promote Authentication in Settings sidebar with globe icon
- Add Authentication section to Settings sidebar with globe icon
- Update SettingsModal to display Authentication link in sidebar
- Add corresponding tests for Authentication section visibility
- Update mobile settings tests to reflect new sidebar structure
2026-04-09 19:16:22 -07:00
gsxdsm
db0d5c8dc9 feat(FN-1133): add plugin hot-reload support
- Add PluginLoader hot-load/unload with watch mode, auto-recovery, and staged loading
- Add PluginRunner reactive integration with executor dynamic tools registration
- Add dashboard reload endpoint (POST /api/plugins/reload) and PluginManager UI
- Add comprehensive tests for plugin-hot-reload (core) and plugin-runner (engine)
- Update plugin authoring docs and add memory notes
- Add changeset for @gsxdsm/fusion minor release
2026-04-09 19:15:53 -07:00
gsxdsm
a3163f9935 feat(FN-1114): merge fusion/fn-1114 (auto-resolved)
- feat(FN-1114): complete all steps — plugin examples, docs, and scaffold command
2026-04-09 19:04:12 -07:00
gsxdsm
8357a65588 feat(FN-1113): complete Step 6 — SSE plugin state events 2026-04-09 18:43:55 -07:00
gsxdsm
2c272e2152 feat(FN-1113): complete Step 5 — CLI plugin commands 2026-04-09 18:42:48 -07:00
gsxdsm
af15eabbef feat(FN-1113): complete Step 4 — plugin UI integration 2026-04-09 18:41:19 -07:00
gsxdsm
c712a8e9a3 feat(FN-1113): complete Step 3 — plugin API routes 2026-04-09 18:38:51 -07:00
gsxdsm
1c4a3f4e4d feat(FN-1452): make structured run records the source of truth for agent run state
- Update AGENTS.md with authoritative run lifecycle semantics documentation
- Add API-level regression test for repeated manual run prevention
- Update run lifecycle tests to match corrected behavior
- Refactor AgentStore to use structured run records as the authoritative source for run state
- Improve run status queries with better filtering and ordering
2026-04-09 18:37:48 -07:00
gsxdsm
ecb5baeea5 feat(FN-1113): complete Step 2 — executor integration with PluginRunner 2026-04-09 18:33:46 -07:00
gsxdsm
c9eacbfdf4 test: fix assertions broken by runContext propagation
store.logEntry, assignTask, and checkoutTask now receive an extra
runContext argument. Updated test assertions in executor.test.ts,
agent-heartbeat.test.ts, and restart.integration.test.ts to match
the current call signatures using expect.objectContaining where
appropriate.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 18:31:54 -07:00
gsxdsm
411a2c26ad feat(FN-1423): add promptOverrides to project settings
- Add promptOverrides configuration to project settings with null-as-delete semantics
- Add core prompt-key catalog with resolver primitives in packages/core/src/prompt-overrides.ts
- Export prompt key catalog, resolution functions, and settings merge helpers from @fusion/core
- Add parity tests for promptOverrides settings handling
- Add settings export/import coverage for promptOverrides
- Add settings export tests verifying promptOverrides round-trip
- Update settings reference documentation with promptOverrides section
- Add store methods for loading/exporting project settings with prompt overrides
2026-04-09 18:21:29 -07:00
gsxdsm
c36b6d1f53 fix: use canonical task ID in stuck-task-detector for step-session mode
In step-session mode each step is registered with StuckTaskDetector
under a compound key (e.g. "FN-1452-step-1") rather than the bare
task ID. When stuck detection fired, event.taskId was that compound
key, breaking three things simultaneously:

1. beforeRequeue("FN-1452-step-1") → store.getTask() threw (no such
   task) → stuckKillCount never incremented on the real task.

2. markStuckAborted("FN-1452-step-1") → activeStepExecutors.get()
   returned undefined (keyed by "FN-1452") → terminateAllSessions()
   never called, other step sessions kept running.

3. stuckAborted.set("FN-1452-step-1") → executor checks
   stuckAborted.has("FN-1452") → miss → stuckRequeue never set
   → task never moved to todo.

Fix: add a canonicalTaskId field to TrackedTask (defaults to the
tracking key for single-session mode where they are identical).
StepSessionExecutor now passes taskDetail.id as the third arg to
trackTask(). killAndRetry() uses entry.canonicalTaskId for all
external callbacks so they always resolve to the real task ID.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 18:16:55 -07:00