- Detect context-window-limit errors from AI sessions and automatically compact
the session conversation history before retrying (one attempt per session)
- Centralize auto-compaction in promptWithFallback (pi.ts) so executor, merger,
and step-session-executor all benefit from the same mechanism
- Remove scattered context-limit error handling from executor.ts, merger.ts, and
step-session-executor.ts in favor of the centralized approach
- Add comprehensive tests for auto-compaction retry behavior in pi.test.ts
- Remove unused compactSessionContext import from step-session-executor.ts
- Add memory note documenting the centralized auto-compaction design
- Add Model System section to README.md with five-lane dual-scope overview
- Add new global fields to docs/storage.md (8 *GlobalProvider/*GlobalModelId keys)
- Add new project fields to docs/storage.md (defaultProviderOverride, defaultModelIdOverride, executionProvider, executionModelId)
- Add scope isolation note clarifying *Global* keys are project-settings-exclusive
- Note: docs/settings-reference.md already had complete Model Selection Hierarchy with all five lanes
- All model lane hierarchy engine and dashboard changes already merged via fusion/fn-1678
- Merge mobile Board and List tabs into unified Tasks tab in MobileNavBar
- Add Board/List toggle to Header component for switching views within Tasks tab
- Add comprehensive Header tests covering toggle functionality and keyboard navigation
- Update mobile feature access tests to reflect new tab structure
- Add mobile task view toggle CSS styles
- Add type toggle buttons (Command/AI Prompt) in simple schedule mode
- Show command input or AI prompt textarea based on selected type
- Add model provider/model ID fields for AI Prompt mode
- Restore simple type when editing existing schedules with single step
- Add comprehensive tests for type toggle behavior and validation
- Fix missing mocks in ScheduledTasksModal test
- Replace manual provider/modelId text inputs in schedule step forms with the standard CustomModelDropdown component
- Add model loading state (loading, error) in StepEditor with graceful error handling
- Fetch available models via fetchModels() API on mount for model selection dropdown
- Add comprehensive tests for model selector integration in schedule steps editor
- Add ScheduleForm tests covering multi-step mode with model selector validation
- Add sendTaskBackForFix() method that encapsulates the 'verification failed
— send back to in-progress' pattern
- Replace all 4 hard failure locations with sendTaskBackForFix() calls
- Update failure feedback template to mention 'sent back to in-progress'
- Update test assertions for workflow step failure cases
- Rename test that verifies passing workflow step behavior
- Add new test for verification failure send-back flow
- Add addTaskComment mock to store factories for testing
The task executor now sends tasks back to in-progress (instead of 'in-review'
with 'failed' status) when workflow step verification fails and retries are
exhausted. This allows the executor to attempt to fix the issues on the
next pass, mirroring the existing deterministic verification failure behavior
in project-engine.ts.
- 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
- Always compute live task counts from the project-scoped store via getOrCreateProjectStore()
- Remove broken path-comparison logic that only worked for the default project
- Endpoint /api/projects/:id/health now returns accurate stats for all projects
- Add tests covering multi-project health endpoint scenarios
- Replace filesystem-based message storage with SQLite backend
- Add MessageStore class using better-sqlite3 with WAL mode
- Update message.ts CLI command to use new MessageStore API
- Update dashboard routes and engine runtime for SQLite integration
- Update all related tests for new storage implementation
- Implement RoadmapsView component with drag-and-drop support for milestones and features
- Add milestone reorder via drag-and-drop with optimistic UI updates and API persistence
- Add feature reorder within milestones and cross-milestone move support
- Add useRoadmaps hook with full CRUD API for roadmaps, milestones, and features
- Add /roadmaps route with sidebar navigation to roadmap views
- Add comprehensive tests for API, useRoadmaps hook, and RoadmapsView component
- Update dashboard guide with roadmap management documentation
- Harden API with race-condition safety and proper error handling
- Clarify git show --format usage in getCommitDiff function
- Document difference between --format= (empty) and --format="" (quoted empty)
- No functional changes - actual git command was already correct
- Add missing onClose prop to SkillsView component in App.tsx for proper close navigation
- Anchor node selector dropdown to left edge to prevent off-screen rendering
- Convert git helper functions to async with runGitCommand wrapper
- Remove blocking execSync from task retry and git management endpoints
- Await async helpers in all route handlers
- Use --format= for git show commands (not --format= with quotes)
- Include all branch changes from fusion/fn-1614
- Convert git helper functions to async with runGitCommand wrapper
- Remove blocking execSync from task retry and git management endpoints
- Add await calls for async helpers in all affected route handlers
- Fix git format flag to use --format= without quotes (execFile passes args directly unlike shell)
- Add fetchDiscoveredSkills() to fetch all discovered skills with enabled state
- Add toggleExecutionSkill() to toggle skill enabled/disabled state
- Add fetchSkillsCatalog() to search the skills.sh catalog with query and limit
- Export skills types (DiscoveredSkill, CatalogEntry, CatalogFetchResult, ToggleSkillResult) for use by hooks/components
- Add comprehensive test coverage for all three API functions
- Add SignalListener type definition to child-process-worker.test.ts
- Update mockImplementation callbacks to use unknown type instead of any
- Add proper TypeScript types to createAgentWithTaskDone opts parameter
- Use optional chaining for safer customTools access
- Use () => void | undefined type for resolvePrompt variables
Updated all route handlers to use await for async git helper functions:
- GET /git/remotes
- GET /git/remotes/detailed
- GET /git/status
- GET /git/commits
- GET /git/commits/:hash/diff
- GET /git/commits/ahead
- GET /git/branches
- GET /git/branches/:name/commits
- GET /git/worktrees
- GET /git/stashes
- POST /git/remotes
- DELETE /git/remotes/:name
- PATCH /git/remotes/:name
- PUT /git/remotes/:name/url
- GET /git/remotes/:name/commits
- POST /git/branches
- POST /git/branches/:name/checkout
- DELETE /git/branches/:name
- POST /git/fetch
- POST /git/pull
- POST /git/push
- POST /git/stashes
- POST /git/stashes/:index/apply
- DELETE /git/stashes/:index
- GET /git/diff
- GET /git/changes
- restart.integration.test.ts: add eslint-disable for Function/any types in mocks
- child-process-worker.test.ts: add eslint-disable for Function[] in baseline arrays
- Restore build to passing by avoiding overly strict type changes
- All tests pass
- child-process-worker.test.ts: replace Function[] with SignalListener type
- remote-node-runtime.test.ts: add yield statement to idleStream generator
- All 57 test files pass with 0 errors
- executor.test.ts: remove unused imports (Column, StuckTaskDetector),
replace Function type with EventListener, add MockTaskStore interface
- restart.integration.test.ts: replace require() with ESM import,
replace Function types with proper function signatures
- All tests pass
- Add pagination support to TaskStore.getAgentLogs() with limit/offset parameters
- Add GET /tasks/:id/logs API route with pagination support
- Add fetchAgentLogs API client with pagination parameters
- Refactor useAgentLogs hook for incremental loading with loadMore callback
- Update useMultiAgentLogs for pagination consistency across multiple task IDs
- Add Load More UI to AgentLogViewer component
- Wire up Load More in TaskDetailModal agent log section
- Fix offset slice direction bug in getAgentLogs
- Remove incorrect reverse() call in getAgentLogs offset logic
- Add comprehensive tests for useAgentLogs and useMultiAgentLogs pagination
- Remove unused imports across 25 files in engine package
- Remove unused variable declarations in ipc-worker.ts, child-process-runtime.ts, and mission-autopilot.ts
- Clean up unnecessary imports in agent-instructions.ts, agent-tools.ts, cron-runner.ts, executor.ts, and other modules
- Minor cleanup in notifier.ts, peer-exchange-service.ts, pi.ts, plugin-runner.ts, and other files
- Improves code quality and reduces potential confusion from unused code
- Add new model settings lane fields to support dual-scope configuration (global + per-project)
- Add dual-scope provider/model override fields for executor, validator, and planning models
- Add schema entries in settings-schema.ts with validation constraints
- Add backward-compat regression tests for legacy settings shapes
- Add mixed-shape tests covering global/project scopes in same config
- Update settings-reference.md documentation with new fields