- Add LiveTimer component with event-driven updates + timeout projection
- Track lastEventTimestamp in ChatView for accurate pause detection
- Project time forward after 500ms of no events (variable 80-180ms interval)
- Immediately sync to accurate value when events resume
- Change formatDuration to 1 decimal place for cleaner display
- Remove debug console.log statements
Closes#100
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add proper overflow handling to permission UI components:
- Add flex-wrap and truncate to action buttons in StandardPermissionUI
- Add break-words to title and kind text in StandardPermissionUI
- Add break-words to question header and text in AskUserQuestionUI
- Add min-w-0, overflow-hidden, and break-words to QuestionOptions
Closes#88
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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 CSS properties to ensure text properly wraps within chat bubble boundaries:
- Add break-words and overflow-hidden to user message bubbles
- Add break-words, overflow-hidden, and [&_*]:break-words to TextContentBlock
for proper word breaking in nested markdown elements
Closes#83
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 search input when 5+ models available with filtering
- Add keyboard navigation (Arrow keys, Tab, Enter, Escape)
- Add scrollable model list with thin scrollbar styling
- Fix highlight jumping: use -1 to indicate no selection until user interacts
- Fix scroll position reset on dropdown open
- Remove dropdown animations for instant open/close
- Fix focus management: prevent Radix auto-focus return to trigger
- Add onSelectionComplete callback for textarea focus after selection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Model list: use normal text-sm font (primary content)
- Agent headers: use smaller text-xs with muted color (secondary)
- Reduce model list indentation from pl-8 to pl-6
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create AgentModelSelector component combining agent and model selection
- Add tooltips to AgentModelSelector and ModeSelector (hide when dropdown open)
- Add skeleton loading states for initialization
- Update button styles: icon-xs size, ghost variant for attachment button
- Improve accessibility: keyboard support for switch buttons, meaningful alt text
- Clean up unused AgentSelector and ModelSelector components
- Add switching state UI with loading animation and "Switching..." text
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>
- Use native fs.watch({ recursive: true }) instead of chokidar
- Fixes EMFILE "too many open files" errors on large directories
- Remove redundant tool-based file change detection (fallback mechanism)
- Add session-to-directory mapping for shared watchers
- Add 100ms debouncing for file change events
- Add directory existence check before watching (Craft Agents pattern)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
All pre-existing ESLint warnings have been fixed. Update CI to reject
any new warnings by setting --max-warnings 0.
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>
- Update build:mac script to build both arm64 and x64 architectures
- Update release skill to include all build artifacts:
- DMG files with blockmaps
- ZIP files with blockmaps
- latest-mac.yml for auto-updater
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When the command input is an array (e.g., ["/bin/zsh", "-lc", "git checkout main"]),
it was being displayed without spaces between elements. Added formatCommand helper
function to properly join array elements with spaces.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add support for dynamically switching session modes and models through
the ACP protocol. This enables users to change the AI model or operating
mode during an active session.
Changes:
- Add ModeSelector and ModelSelector dropdown components
- Extend ACP client to handle mode/model update notifications
- Add IPC channels for mode/model state management
- Update Conductor and SessionLifecycle for dynamic switching
- Add max-height constraint to dropdowns for better UX
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>