Commit Graph

617 Commits

Author SHA1 Message Date
gsxdsm
c32c4e6e83 fix(FN-915): use getFusionDir() for agent storage location
- Add getFusionDir() method to TaskStore for resolving agent database path
- Update in-process-runtime to use getFusionDir() instead of hardcoded path
- Update dashboard routes AgentStore initialization to use getFusionDir()
- Add changeset for published package patch bump
2026-04-04 12:35:15 -07:00
gsxdsm
453e533eee feat(FN-835): add script-mode workflow step execution with validation hardening
- Implement script-mode workflow steps that execute named commands from project settings with 2-minute timeout
- Harden PATCH /api/workflow-steps/:id validation to reject empty names, check resulting state validity
- Add comprehensive executor tests (420 lines) covering script mode execution, timeout, missing scripts, and prompt mode
- Add dashboard route tests for PATCH validation edge cases
- Update AGENTS.md and README.md with script-mode engine behavior documentation
2026-04-04 11:21:13 -07:00
gsxdsm
01ffffee81 fix(FN-834): fix branch prefix drift, add merger branch guard, and fix test OOM
- Fix resolveBaseBranch to use stored branch name and consistent fusion/ prefix
  for both explicit deps and blockedBy paths (was using kb/ for blockedBy)
- Add main branch checkout verification in merger before squash merge to prevent
  feature code from landing on wrong branch lineage
- Align all branch prefix references from stale kb/ to fusion/ across executor,
  merger, store, and routes
- Fix executor test OOM by mocking merger fully, adding fake timers to retry
  tests, and switching vitest pool to vmThreads
- Update all test assertions to use fusion/ branch prefix

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 11:11:59 -07:00
gsxdsm
5e18ca1b0e fix: unify diff endpoints and show changed files on done task cards
- Server /tasks/:id/diff and /tasks/:id/file-diffs now both use
  resolveDiffBase() for consistent file lists across card and modal
- Both endpoints handle done tasks via mergeDetails.commitSha,
  returning structured { files, stats } from the merge commit
- TaskChangesTab uses fetchTaskDiff for all columns (no more
  fetchCommitDiff/parsePatch client-side path for done tasks)
- useChangedFiles hook simplified — server handles done tasks
- Done task cards show "N files changed" button using mergeDetails
- Updated tests for new unified data flow

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 08:55:46 -07:00
gsxdsm
4f80480a44 feat(FN-867): add task-scoped diff base via baseCommitSha
- Introduce baseCommitSha on sessions for task-scoped file diffs independent of shared worktrees
- Add /api/sessions/:id/files and /api/sessions/:id/file-diffs routes using baseCommitSha
- Update TerminalModal to consume task-scoped file list and diff endpoints
- Add regression tests for shared worktree scenario (multiple tasks in same worktree)
- Expand route tests for file diffs and session files with edge cases
- Clean up stale TerminalModal test helpers and simplify diff display styles
- Update README and route documentation for task-scoped diffing
2026-04-04 06:43:45 -07:00
gsxdsm
e7fee33eba feat(FN-835): add workflow step execution mode and improve step editor UX
- Add executionMode field to WorkflowStep type with 'agent' | 'api' options and validation
- Extend TaskStore CRUD with execution mode support and validation for prompt/description
- Add API validation layer in dashboard routes for workflow step create/update/delete
- Enhance WorkflowStepManager component with inline editing, validation feedback, and improved UX
- Add comprehensive tests for store CRUD validation and API route validation
- Clean up dashboard styles by removing unused CSS rules and dead test assertions
2026-04-04 05:00:03 -07:00
gsxdsm
4e0077f48a feat(FN-834): add per-workflow-step model overrides for execution
- Extend WorkflowStep type with optional modelProvider, modelId, validatorModelProvider, validatorModelId fields
- Add API endpoints (PATCH /api/workflow-steps/:id) to update model overrides on workflow steps
- Update executor to use per-step model overrides when running workflow step agents
- Add AgentDetailView support for displaying workflow step model configuration
- Add store and executor tests for new model override behavior
2026-04-04 04:08:16 -07:00
gsxdsm
9b6522e836 feat(FN-841): harden planning-mode AI response parsing and recovery
- Add robust JSON extraction from AI responses (handle markdown fences, mixed content, malformed JSON)
- Add multi-strategy recovery: regex extraction, brace/bracket balancing, common-fix repairs
- Add comprehensive test suite for planning-mode parsing (101 new test cases)
- Document planning-mode robustness behavior in dashboard README
- Add changeset for patch bump to @gsxdsm/fusion
2026-04-04 02:04:31 -07:00
gsxdsm
c78f49a8db docs(FN-823): clarify agent log content is never truncated per-entry
- Clarify in dashboard README that agent log entries are never truncated
- Add maxLength safeguards in store (getAgentLog), routes, useAgentLogs, and useMultiAgentLogs hooks
- Add tests for store, AgentLogViewer component, useAgentLogs hook, useMultiAgentLogs hook, and dashboard routes
- All tests verify that log text and detail fields are preserved in full without per-entry truncation
2026-04-04 01:41:13 -07:00
gsxdsm
482492b26e feat(FN-812): add onboarding and API key auth status support
- Add modelOnboardingComplete field and auth status endpoint to dashboard API
- Support both OAuth and API-key-backed providers in /auth/status route
- Remove mission-interview module and related unused code (dashboard, engine, CLI)
- Remove sync-openrouter-models changeset (no longer needed)
- Add comprehensive tests for onboarding persistence and auth status
- Fix TypeScript type narrowing for oauth/api_key provider union type
2026-04-04 01:09:29 -07:00
gsxdsm
e46d357a6a feat: sync OpenRouter models on dashboard startup and add mission interview module
- Add openrouterModelSync setting to eagerly fetch OpenRouter model catalog at
  dashboard startup so the model picker shows all available models
- Add toggle in Settings → Models to disable the sync
- Add mission-interview session management module for AI-guided mission specs
- Include tests for the sync opt-out behavior

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 00:39:17 -07:00
gsxdsm
d2266466fd fix(FN-825): handle 204 No Content in api() and remove unused styles/tests
- Fix api() helper to properly handle 204 No Content responses from mission delete and reorder mutations
- Add regression tests for mission edit/delete 204 handling in e2e tests
- Add unit tests for api() helper covering null/empty/204 response scenarios
- Remove unused CSS styles (175 lines of dead code)
- Remove unrelated test code from ChangedFilesModal, TaskCard, and mobile-scroll-snap tests
- Clean up ChangedFilesModal and TaskCard components
2026-04-03 22:45:59 -07:00
gsxdsm
acfeea4fd3 feat(FN-803): add ahead/behind commit lists to Git Manager Remotes tab
- Add backend API routes for remote commit lists (local-ahead, remote-ahead, all commits by branch)
- Surface ahead/behind commit counts and expandable commit lists in Remotes tab UI
- Add expand/collapse rows showing commit hash, message, author, and relative date
- Style commit list rows with alternating backgrounds and monospace hashes
- Add comprehensive tests for API routes and GitManagerModal component
- Update README documentation for Git Manager Remotes tab
2026-04-03 22:02:57 -07:00
gsxdsm
2322a06a53 fix(FN-809): rebrand test ntfy notification from kb to Fusion
- Rename ntfy test notification title from 'kb' to 'Fusion' in dashboard routes
- Remove unused imports in engine triage module
- Move ntfy notification tests from engine to dashboard where the endpoint lives
- Clean up stale test file references in engine integration tests
2026-04-03 21:00:18 -07:00
gsxdsm
fb9f92a0ca feat(FN-799): align file-diffs route with session-files merge-base strategy
- Switch /api/tasks/:id/file-diffs to use merge-base (three-dot) diff instead of two-dot diff, matching session-files behavior
- Rewrite file-diffs route tests with comprehensive coverage and add count/detail consistency regression tests
- Update mission-types to export MissionSummary and fix MissionManager imports
- Remove obsolete MissionManager.test.tsx and mission-e2e.test.ts
- Update README docs to clarify board card count matches changed-files viewer
2026-04-03 19:31:13 -07:00
gsxdsm
b8ccd55e12 feat(FN-804): align mission IDs with generated format and add validation
- Update mission route ID validation to accept generated ID format (mission-types.ts, mission-routes.ts)
- Add MissionManager component tests for generated ID handling
- Add mission E2E tests covering ID generation and validation flows
- Update TaskDetailModal to work with new mission ID format
- Update documentation (README, dashboard README) with generated ID examples
2026-04-03 19:19:05 -07:00
gsxdsm
10a6443483 feat(FN-801): show hidden files in workspace file listings
- Remove dotfile filtering from file-service so hidden files appear in workspace browser
- Update FileBrowserModal and TaskDetailModal UI to display hidden file entries
- Add UI/hook tests for hidden file entries in FileBrowserModal and useWorkspaceFileBrowser
- Add file-service unit tests for listing, reading, and filtering hidden files
- Update dashboard styles for hidden file display
- Document Files feature section in README
2026-04-03 18:50:05 -07:00
gsxdsm
af41f4424c feat(FN-800): auto-generate model preset IDs and remove manual ID editing
- Add slugify and generatePresetId utilities with collision handling for unique preset IDs
- Remove manual ID input field from preset editor UI in SettingsModal
- Auto-generate preset IDs server-side from name on creation
- Simplify Header tests by removing ID-related test cases
- Deduplicate tablet header controls tests by importing from shared Header tests
- Remove unused CSS rules for removed ID input field
- Update reviewer to pass through preset ID generation logic
2026-04-03 18:33:23 -07:00
gsxdsm
6382370549 feat(FN-794): raise auto-summarization threshold from 140 to 200 characters
- Change MIN_DESCRIPTION_LENGTH threshold from 140 to 200 in ai-summarize.ts
- Update shouldAutoSummarize logic and tests for new 200-char threshold
- Update UI copy in SettingsModal and API/routes references
- Update store tests to reflect the new threshold value
- Remove obsolete dashboard activity-log mobile layout test files and unused CSS
- Add changeset for patch bump
2026-04-03 17:58:07 -07:00
gsxdsm
057bd30645 feat(FN-772): fix terminal startup and prompt delivery reliability
- Fix terminal service to ensure prompt is reliably delivered on startup and reconnect
- Add regression tests for terminal reconnect and first-paint behavior
- Remove dead code: unused global-settings tests, styles.css, Header/MissionManager tests
- Update terminal README with reliable prompt delivery guarantee documentation
- Add useTerminal hook tests and TerminalModal component tests
2026-04-03 09:16:34 -07:00
gsxdsm
651ec03698 fix(FN-756): correct task card change counts 2026-04-03 07:29:42 -07:00
gsxdsm
d8f57e0d31 fix: agent log SSE always listens on default store, not project-scoped store
The agent log SSE endpoint was calling getOrCreateProjectStore(projectId)
and attaching the listener to the returned store. But the in-process
TaskExecutor is always bound to the default store passed to createServer,
so agent:log events were emitted on that store, never reaching the
project-scoped store's EventEmitter.

Fix: remove the getOrCreateProjectStore call and always listen directly
on the default store. Also simplifies the handler by removing the
unnecessary async IIFE (the listener can now be attached synchronously)
and eliminates the detachListener indirection.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 07:20:01 -07:00
gsxdsm
a7e2ca5adb fix(FN-756): reset recycled worktree baselines 2026-04-03 07:09:27 -07:00
gsxdsm
bed9fcb378 fix: resolve race condition in project-store-resolver breaking real-time dashboard updates
Concurrent SSE and API requests for the same projectId both missed the
cache (storeCache.set ran after await store.watch()), creating independent
TaskStore instances with separate EventEmitters. SSE listeners attached
to one instance while mutations fired on the other, so no events reached
the browser.

Fix: add a pendingCreations promise map that deduplicates concurrent
calls, ensuring all callers share the same in-flight promise and thus
the same store instance. Also clear pendingCreations in evictProjectStore
and evictAllProjectStores. Adds a concurrent-call regression test.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 07:08:47 -07:00
gsxdsm
df73a82917 fix(FN-771): reset disclosure state on task creation and preserve terminal sessions across reconnects
- Reset isDisclosureExpanded in QuickEntryBox resetForm so disclosure collapses after task creation
- Remove sticky disclosure persistence from QuickEntryBox component
- Preserve terminal sessions across transient WebSocket disconnects with buffer/replay
- Buffer and replay initial terminal state for prompt visibility on reconnect
- Update tests for non-persistent disclosure, terminal reconnect, and server routes
- Remove unused UsageIndicator tests and TaskDetailModal test cleanup
2026-04-03 06:47:40 -07:00
gsxdsm
3697bd0d71 feat(FN-767): add Claude session reset time to usage modal
- Preserve Claude reset timestamps in the usage data model (usage.ts)
- Display session reset time in the UsageIndicator dashboard component
- Add component comments explaining reset-time rendering logic
- Add styles for the reset time display in the usage modal
- Add tests for usage data model and UsageIndicator component
2026-04-02 23:32:22 -07:00
gsxdsm
95374b7c3d fix(FN-758): fix project-scoped real-time dashboard updates
- Add project-store-resolver to correctly scope SSE and WebSocket connections to the active project's TaskStore
- Fix shared resolver so multi-project setups deliver task events only to the right dashboard clients
- Add regression tests for project store resolver (routing, missing project, SSE integration)
- Remove unused import and clean up stale changeset
- Add changeset for published package patch bump
2026-04-02 23:11:47 -07:00
gsxdsm
f9dd3983c0 fix(FN-745): improve fallback model recovery 2026-04-02 21:50:41 -07:00
gsxdsm
dacd074700 fix(FN-745): fall back to CLI when Claude token refresh fails
- Replace hard error returns with fetchClaudeUsageViaCli() fallback when token refresh fails
- Cover three failure paths: refresh failure, no refresh token, exhausted retry attempts
- Add comprehensive tests for all token expiry and refresh fallback scenarios
2026-04-02 20:05:49 -07:00
gsxdsm
74c0f8fdc2 fix(FN-732): fix dashboard real-time updates and SSE pipeline
- Fix SSE event relay to properly broadcast task store events to dashboard clients
- Use named heartbeat events instead of SSE comments for reliable keep-alive
- Add missing event emission in core task store for state changes
- Add comprehensive tests for SSE pipeline, event emission, and UI hooks
- Remove broken useTerminal hook and AgentLogViewer tests, fix flaky test suites
2026-04-02 19:34:35 -07:00
gsxdsm
30f6413e15 fix(FN-728): fix token refresh endpoint, content-type, and client_id
- Fix refresh token request to use correct endpoint URL
- Set proper content-type header for token refresh requests
- Include client_id in refresh token payload
- Add tests verifying correct endpoint, content-type, and client_id in refresh flow
2026-04-02 19:11:07 -07:00
gsxdsm
971c7be983 fix(FN-724): implement OAuth token refresh for expired Claude tokens
- Add token expiry detection with 60-second buffer before API calls
- Implement refresh_token grant flow against Anthropic OAuth endpoint
- Cache refreshed access tokens in-memory only (never written to disk)
- Retry token refresh on 401/403 responses before failing
- Add comprehensive tests for token refresh, expiry, and error scenarios
2026-04-02 18:54:44 -07:00
gsxdsm
bce6ca94c2 fix(FN-714): increase Claude provider timeout to 75s and improve error diagnostics
- Increase Claude fetch timeout from 10s to 75s to accommodate retries and CLI fallback
- Include response body snippet in HTTP error messages for better debugging
- Improve Claude CLI timeout error message with actionable guidance
- Export withTimeout and CLAUDE_FETCH_TIMEOUT_MS for testability
- Add comprehensive tests for withTimeout, timeout constant, and error diagnostics
2026-04-02 18:40:24 -07:00
gsxdsm
05f2114743 fix(FN-000): scope dashboard project flows 2026-04-02 17:51:04 -07:00
gsxdsm
a4896f034e fix(FN-708): remove unused multi-project UI code and usage-limit references
- Remove DirectoryPicker component and its tests (unused multi-project UI)
- Simplify SetupWizardModal by removing directory picker integration
- Remove unused multi-project API endpoints, SSE handlers, and route definitions
- Clean up usage-limit detector and related engine references (executor, scheduler, triage)
- Fix 6 merge conflicts in usage.test.ts and update tests for simplified usage tracking
2026-04-02 13:31:43 -07:00
gsxdsm
7760bcc9cd feat(FN-694): add DirectoryPicker component and redesign SetupWizardModal
- Add browse-directory API endpoint and client for native folder selection
- Create DirectoryPicker component with manual input, browse button, and validation
- Redesign SetupWizardModal to use DirectoryPicker for project path selection
- Add comprehensive tests for DirectoryPicker and SetupWizardModal
- Remove bundled fusion skill and related extension/sync code from CLI package
2026-04-02 13:30:08 -07:00
gsxdsm
2acd2cfb17 fix(FN-703): fix overly broad usage limit pattern and add transient error retry
- Narrow 'insufficient' usage-limit regex to require quota/credit/balance/fund context
- Add transient error detection in executor and triage to retry instead of failing
- Improve scheduler pause/resume logging with actionable messages and resume confirmation
- Add SSE active connection counter for observability
- Add duplicate usage-limit pause suppression logging
2026-04-02 13:29:48 -07:00
gsxdsm
192387d3ff fix(FN-704): increase Claude CLI timeout to 60 seconds
- Increase Claude CLI usage fetch timeout from 30s to 60s
- Improve timeout error message with actionable context
2026-04-02 13:24:22 -07:00
gsxdsm
b7afe8d55a fix(FN-696): compute task counts from task store in health endpoint
- Compute live activeTaskCount, inFlightAgentCount, and totalTasksCompleted from the task store when the requested project matches the current dashboard
- Fall through to cached central DB health data for remote projects
- Add project existence check before health lookup, returning proper 404s
- Remove unused CSS styles (20 lines deleted from styles.css)
2026-04-02 13:19:24 -07:00
gsxdsm
ae2cba17a9 feat(FN-684): complete Step 5 — add /api/executor/stats endpoint 2026-04-02 10:43:47 -07:00
gsxdsm
6daf95bbb3 fix(FN-679): use merge-base diff in modal changes tab
- Updated /tasks/:id/diff endpoint to use merge-base comparison
- Changed from HEAD~1..HEAD to ...HEAD syntax
- Added fallback to HEAD when merge-base fails
- Verified fix matches /tasks/:id/file-diffs endpoint pattern
2026-04-02 10:25:57 -07:00
gsxdsm
890c413b5a feat(KB-643): add Dashboard Scripts UI feature
- Add scripts field to ProjectSettings type for custom dashboard scripts
- Update ScriptsModal with improved UI for script management
- Add QuickScriptsDropdown component for quick script access
- Implement scripts API routes for CRUD operations
- Update CLI with multi-project commands (project add/remove/list/show/set-default/detect)
- Various UI improvements and bug fixes across dashboard components
- Migration support for multi-project architecture
2026-04-02 09:31:57 -07:00
gsxdsm
6fd1fa3c2f chore: resolve merge conflicts 2026-04-02 09:29:31 -07:00
gsxdsm
bd67380e3d feat(FN-675): align session-files endpoint with diff endpoint
- Add git diff for session-files using baseCommitSha with double-dot syntax
- Add merge-base fallback to find common ancestor when baseCommitSha is missing
- Add HEAD~1 fallback when merge-base fails (e.g., no remote main)
- Add 10-second in-memory cache for session-files computation
- Fix scheduler to immediately schedule tasks created via dashboard
- Add task:moved to done handler for immediate scheduling on status change
- Add comprehensive unit tests for scheduler immediate scheduling
- Add unit tests for session-files caching and base ref resolution
2026-04-02 09:22:50 -07:00
gsxdsm
c03c9602b4 feat(KB-620): complete Step 7 — Migration and first-run experience
- Add fn init command for initializing new kb projects
- Add auto-migration check at CLI startup
- Add /api/setup-state and /api/complete-setup dashboard endpoints
- Add SetupState and CompleteSetupInput types to dashboard API
- Add migration and rollback documentation to AGENTS.md
- Create changeset for multi-project migration feature
2026-04-02 09:18:45 -07:00
gsxdsm
566f531361 feat: rename data directory, add global project settings, multi-project CLI commands, and provider badge in model selector
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 09:10:42 -07:00
gsxdsm
1fa8837c6b refactor: improve mocking for GitHubClient and enhance SIGINT handling in tests 2026-04-01 22:55:16 -07:00
gsxdsm
dc442cf391 feat: refactor tests and improve mocking for file-service and GitHub polling
- Updated mocking strategy for node:fs and node:fs/promises in file-service tests.
- Removed redundant test files and improved test implementations for better clarity.
- Enhanced GitHub polling service tests with rate limiter integration.
2026-04-01 22:44:44 -07:00
gsxdsm
04b194982d feat: add per-provider timeout for usage panel to prevent blocking on slow responses
fix: update scheduler filesystem path from .kb to .fusion for task validation

style: clean up TaskDetailModal styling with reusable CSS classes

test: add comprehensive tests for file-service operations with mocked filesystem
2026-04-01 22:38:18 -07:00
gsxdsm
9cc45e2973 feat(FN-669): complete Step 2 — update /api/models endpoint to return favoriteModels 2026-04-01 22:18:38 -07:00