- docs(FN-1664): add changeset for Active Agents card selection fix
- test(FN-1664): add regression tests for active agent card selection
- feat(FN-1664): wire ActiveAgentsPanel selection to open AgentDetailView
- Apply textarea width fix from QuickEntryBox to InlineCreateCard in styles.css
- Add regression tests for InlineCreateCard textarea width
- Add regression tests for QuickEntryBox textarea width
- Ensure consistent textarea styling across board and list creation surfaces
Tasks in projects other than the primary (cwd) project were never triaged
because only one ProjectEngine was started. When a project is accessed via
?projectId= API/SSE, getOrCreateProjectStore created a TaskStore but left
the Scheduler, TriageProcessor, and TaskExecutor unstarted.
Fix: introduce setOnProjectFirstCreated callback in project-store-resolver
so the dashboard server is notified when any new project is first accessed.
dashboard.ts creates a ProjectManager that lazily starts an InProcessRuntime
(Scheduler + TriageProcessor + TaskExecutor) for each project the first time
it is accessed — works for any number of registered projects.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add mobile CSS rules for .detail-actions-menu and .detail-move-menu dropdowns
- Position dropdowns above action bar with bottom: calc(100% + 4px)
- Constrain max-height to calc(100dvh - 120px) for viewport fit
- Enable overflow scrolling with -webkit-overflow-scrolling: touch
- Fix test assertion to match multi-selector CSS format
Update 4 test files to pass projectId="project-1" to hooks/components
and assert it flows through to the API layer:
- useFileBrowser: fetchFileList receives (taskId, path, projectId)
- useFileEditor: fetchFileContent/saveFileContent receive projectId
- FileBrowser: deleteFile/renameFile/copyFile/moveFile receive projectId
- GitHubImportModal: apiImportGitHubIssue/Pull receive projectId
All 6653 tests pass across 242 test files.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When importing from companies.sh, the repo may be a multi-company monorepo
(e.g. paperclipai/companies) where each company is a subdirectory. The code
was parsing the repo root which has no COMPANY.md, resulting in 'no agents
found'. Now detects this and descends into the slug-matched subdirectory.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
- Restore projectId field when rehydrating subtask sessions from SQLite via buildSubtaskSessionFromRow()
- Add regression tests for projectId forwarding in subtask start-streaming route
- Add documentation note in memory.md for durable subtask session context propagation
- Fix 30 git routes to use getScopedStore(req) instead of global store
- Fix activity GET/DELETE routes to use scoped store
- Fix POST /api/github/webhooks to use scoped store for badge updates
- Fix POST /api/ai/summarize-title to use scoped store for settings
- Fix GET /api/git/worktrees to use scoped store for task listing
- Add projectId parameter to all git and activity frontend API functions
- Update useActivityLog hook to pass projectId through
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
- Add CSS rule to override padding-right for QuickEntryBox textarea
- The .description-with-refine textarea rule was adding 70px padding that wasn't needed in QuickEntryBox (refine button is in controls panel)
- Add regression tests for textarea width contract
- Add mockDesktopViewport helper for viewport-specific tests
- Keep max-width: 800px constraint in list view (design decision)
- Handle { items: [...] } response format from companies.sh API
- Parse installs field as both string and number
- Accept owner/repo shorthand in addition to full GitHub URLs
- Replace broken Web Streams pipeTo with Node stream/promises.pipeline
- Add max-height with scroll to planning-options to prevent overflow
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
- Add compose button to Agents tab for composing messages to agents
- Compose pre-fills recipient when agent is selected, shows dropdown otherwise
- After send, user stays on Agents tab and selected agent is preserved
- Add 4 regression tests for new compose contract
- Add CSS for mailbox-agents-header layout
Apply consistent font-family, font-weight, and line-height to count,
separator, and max elements.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
- Remove Kimi provider from usage tracking module
- Clean up unused Kimi-related code in usage.ts (225 lines removed)
- Remove Kimi-specific tests from usage.test.ts (686 lines removed)
- Add tests for usage routes (routes.test.ts)
- Add new usage API routes for usage data endpoints
- Fix planning resume state mismatch in PlanningModeModal
- Add PlanningModeModal tests for state consistency
Remove min-height: 300px from .planning-loading and add overflow: hidden
to .planning-initial so the modal stays within 80vh bounds.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
- Add process lifecycle diagnostics for dashboard and serve commands
- Add SQLite database health check to diagnostics endpoint
- Add store listener count diagnostics for debugging subscription leaks
- Audit and fix SSE connection management to prevent connection leaks
- Audit and fix timer/interval cleanup in engine and CLI shutdown handlers
- Fix res.on() call guard for test mocks compatibility
- Fix variable declaration ordering in serve.ts
- Update memory with diagnostic findings for future debugging
- Add backend API routes for companies.sh catalog with pagination and search
- Wire frontend API client with browse mode endpoints (search, list agents)
- Build Agent Import modal with tabbed interface (URL input + browse mode)
- Add browse mode styling with search results grid and agent cards
- Include UI and route test coverage for browse flow
- Update in-UI help text with browse mode usage instructions
- Fix thinking level selector to default to 'off' when no global default is configured
- Add 'Using default' badge when thinking level falls back to global setting
- Show explicit thinking level badge only when a non-default value is selected
- Add comprehensive tests for thinking level selector behavior
- Add tests for resolved model display with global settings fallback
- Update BackgroundTasksIndicator to display error sessions count alongside active sessions
- Include error sessions in App filter for notification banner visibility
- Add session cancellation for mission interviews on banner dismiss
- Add comprehensive test coverage for SessionNotificationBanner component
- Update useBackgroundSessions hook to expose error session counts
The dashboard used incorrect field names (passedCount/failedCount/blockedCount/pendingCount)
that don't exist on the type. The backend returns passedAssertions/failedAssertions etc.
Fixed MissionManager.tsx to use correct field names with ?? 0 fallback for tooltip text.
1. Fix TypeError in run history: fetchValidationRuns now correctly
destructures .runs from paginated API response {runs, total, offset}
2. Fix assertions panel rendering: inline fetch calls in loadMissionDetail
and toggleMilestoneExpanded to avoid forward-reference of callback hooks.
Added Array.isArray guard to prevent .map on undefined state values.
3. Add missing UI components:
- Clickable lineage indicator for fix features (navigates to source)
- Retry budget 'Attempt X of Y' display on feature cards
- 'No fix features generated' empty state
- Milestone validation state badge in header (already existed, now
loads correctly)
- Validation rollup badge with coverage bar in milestone header
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>