Add dock badge count feature to indicate pending permission requests:
- Add updateBadgeCount() method to PermissionManager
- Update badge when permission request is added/removed/times out
- Only applies on macOS (darwin platform)
This helps users know there are pending actions even when the app is minimized.
Closes#85
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add mergeSessionUpdates helper to deduplicate updates by sequence number
- Introduce updateCurrentSession helper to synchronously update ref before async ops
- Reload session updates after async operations complete to catch missed messages
- Add unit tests for merge behavior with sequence numbers
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add message-level time tracking with endTime - startTime calculation
- Fix state synchronization: wait for all sessionUpdate promises before completing
- Create Spinner component (3x3 grid animation) and LoadingIndicator components
- Add CompletedMessageFooter with copy button and visual feedback
- Update SessionInitializing to use Spinner instead of shimmer bar
- Add prefers-reduced-motion support for animations
- Add formatDuration (2 decimal places) and formatLocalizedDatetime utils
- Add invalid date handling and comprehensive tests
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add eye icon toggle to show/hide hidden files (dotfiles)
- Replace emoji icons with Lucide icons in context menu
- Add "Open in Multica" context menu option for directories
- Optimize file filtering with on-demand approach
- Add aria-label/aria-pressed for accessibility
- Add unit tests for uiStore and excludeHiddenFiles
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add draftStore to manage input drafts per session
- Save/restore drafts when switching between sessions
- Auto-save drafts with debounce (300ms)
- Clear drafts when session is deleted
- Add unit tests for draftStore and MessageInput draft behavior
- Update vitest config to include .tsx test files
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Resolved conflicts:
- AcpClientFactory.ts: Keep both AvailableCommand import and ISessionStore
- MessageInput.tsx: Combine slash command key handling with return type annotation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add explicit return types to functions across main, preload, and renderer
- Replace `any` types with specific types or eslint-disable comments
- Fix unused variables by removing or prefixing with underscore
- Add eslint-disable for react-refresh/only-export-components
- Fix React hooks dependency warnings
- Add test mocks for electron-log/main and @electron-toolkit/utils
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add AvailableCommand type re-export from ACP SDK
- Handle available_commands_update events in AcpClientFactory
- Store available commands in SessionAgent state
- Add IPC channel and handler for fetching session commands
- Create commandStore for renderer state management
- Update useApp hook to fetch and listen for command updates
- Create SlashCommandMenu component with keyboard navigation
- Integrate slash command detection and validation in MessageInput
- Add unit tests for slash command utilities and store
Commands are defined by ACP agents and sent as plain text for
the agent to parse and execute. The client provides autocomplete
and validation based on the available commands list.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add electron-log for production logging (writes to ~/Library/Logs/Multica/)
- Development mode logs to console only, no file writes
- Improve parseAcpError() with more specific error handling:
- Connection errors (ECONNREFUSED, ECONNRESET)
- Timeout errors (ETIMEDOUT, timeout)
- Process exit errors
- Authentication errors (401, API key)
- Rate limit errors (429)
- Fallback now shows actual error message (truncated to 150 chars)
instead of generic "Agent encountered an error"
- Add comprehensive tests for new error types
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add gitBranch field to Session type
- Create git utility to get current branch name
- Update IPC handlers to fetch git branch when loading sessions
- Display branch name in sidebar with subtle styling (main · 36m ago format)
- Add unit tests for git branch utility
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Split 773-line Conductor class into 4 modular components using dependency injection:
- SessionLifecycle: Session CRUD operations
- AgentProcessManager: Agent process lifecycle management
- PromptHandler: Prompt sending with history replay and G-3 support
- G3Workaround: AskUserQuestion answer injection mechanism
Added comprehensive unit tests for all new modules (56 new tests), bringing total test coverage to 167 tests. Maintained backward compatibility - all callers continue using identical APIs. TypeScript compilation passes with no errors.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Add directoryExists runtime check for sessions
- Show warning banner when directory not found
- Disable input and only allow session deletion
- Add withDirectoryExists helper to reduce code duplication
- Validate directory on app focus to detect deleted folders
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Change `installed` check from primary command only to all required commands
- Agents with multiple components (e.g., claude-code requiring both CLI and ACP)
are now only marked as installed when all components are present
- This fixes the issue where polling would stop prematurely when only the
primary command (e.g., `claude`) was detected but `claude-code-acp` was not
- Also includes related changes for terminal-based installation flow
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add ~/.npm-global/bin to enhanced PATH in path.ts
- Add getNpmUserPrefix() function for user-level npm directory
- Modify installClaudeCodeACP, installCodexCLI, installCodexACP to use
--prefix ~/.npm-global for installation without sudo
- Update formatInstallError to provide actionable fix for permission errors
- Add unit tests for agent-install module
This fixes EACCES permission errors when installing agents via npm install -g
by redirecting installations to the user's home directory.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implemented three-layer defense mechanism to prevent AI-generated code from breaking the codebase:
- Layer 1: AGENTS.md with universal AI agent instructions
- Layer 2: Husky pre-commit hooks with test file checking
- Layer 3: GitHub Actions CI with TypeScript, ESLint, tests, and coverage
Includes design document, test infrastructure, and coverage thresholds.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Add unit and integration tests covering core business logic:
- SessionStore: 18 tests for session persistence and management
- Conductor: 13 tests for session orchestration and agent lifecycle
- IPC Handlers: 19 tests for main-renderer communication
- Agent check: 10 tests for agent detection utilities
Tests achieve 31.74% overall coverage with focus on critical paths. Includes Vitest configuration, mock setup, and test utilities.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>