Ensures a fresh build by removing the dist directory before starting,
preventing stale artifacts from previous builds.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The @dnd-kit KeyboardSensor intercepts the Space key globally to
activate drag-and-drop, preventing spaces from being typed in the
session rename input field. Use a custom KeyboardSensor that skips
activation when the event target is an input, textarea, or
contenteditable element.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add a convenience script to build unsigned, unnotarized macOS .app
for local development and personal use.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The optimistic user_message update was missing `_internal: false`,
causing mergeSessionUpdates to fail deduplication when the DB version
(which includes `_internal: false`) arrived via focus sync or session
reload. Both copies survived the merge, showing two identical messages.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: resolve AI response not rendering after long idle/sleep
- Add backgroundThrottling: false to prevent Chromium from throttling
the renderer process when the window is in the background
- Add powerMonitor.on('resume') to send APP_FOCUS event after system
wake, triggering DB sync to recover any missed IPC messages
- Re-sync session updates from DB on app focus to capture messages
lost during sleep/wake or background throttling
- Guard async DB sync with currentSessionIdRef check to prevent
race condition when user switches sessions during the async call
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: dedupe focus resync logs
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
When a user already has @openai/codex installed but not @zed-industries/codex-acp,
npm install fails with EEXIST error because the codex binary already exists.
Adding --force flag allows npm to overwrite existing files and continue
installing the missing packages.
Fixes MUL-76
* fix(#121): Phase 1 - Deprecate SessionStore.ts and add tests for AgentProcess/AcpClientFactory
Phase 1 of Karpathy Guidelines refactor (Issue #121):
1. Deprecated SessionStore.ts (legacy file-based storage)
- Added deprecation notices to class and module
- Documented that DatabaseStore.ts is the replacement
- Updated exports in index.ts with deprecation warning
2. Added comprehensive tests for AgentProcess.ts
- Tests for start/stop lifecycle
- Tests for stdin/stdout web stream conversion
- Tests for exit callbacks and PID tracking
- Coverage: 98.03%
3. Added comprehensive tests for AcpClientFactory.ts
- Tests for sessionUpdate handling (all update types)
- Tests for mode/commands update callbacks
- Tests for permission request handling
- Tests for error handling and null sessionStore
- Coverage: 100%
Test coverage increased from 49.3% to 53.15%, now above CI threshold.
* fix: add return type to createMockProcess to satisfy ESLint
AgentModelSelector:
- Move state reset from useEffect to event handler (React best practice)
- Reset highlight index when search query changes
ModeSelector:
- Don't capture Shift+Tab in input/textarea/contenteditable elements
- Preserves accessibility for reverse tab navigation
Settings:
- Use Promise.allSettled for version checks before clearing loading state
- Use queueMicrotask to defer async operations in useEffect
- Consolidate cleanup logic in handleOpenChange
agentStore:
- Fix isAgentInstalled to return false for unknown agents
- Add error logging for loadAgents failures
- Add comprehensive unit tests
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When defaultModes[agentId] is undefined (user hasn't explicitly set),
use getDefaultModeForAgent() as fallback to ensure the agent's semantic
default mode is applied.
Also add debug logging for defaultAgentId persistence to help diagnose
any future issues.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add agentStore for centralized agent state management
- Refresh agent state on app focus (detect external install/uninstall)
- Validate agent installation before switching
- Show warning UI when current agent is not installed
- Add default mode selection per agent in Settings
- Apply user's preferred mode when creating new sessions
- Extend MODE_CONFIG with agentIds, isDefault, and displayName
- Use parallel Promise.all for better performance
- Fix React Compiler warnings in useCallback/useMemo dependencies
Closes#119
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Closes#110
- Add mode-semantic.ts for unified mode handling across agents
- Filter dangerous/internal modes (bypassPermissions, dontAsk, full-access)
- Add semantic icons and colors (plan, readonly, auto, default)
- Show mode descriptions in dropdown and tooltip
- Add global Shift+Tab shortcut to cycle modes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Remove the local keyboard shortcut handler from the sidebar component. This functionality can be managed at a higher level through a centralized shortcut system.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Add TitleGenerator module to generate session titles using Agent CLI
- Support claude-code, opencode, and codex agents
- Fire-and-forget async generation on first user message
- Prevent concurrent generation with in-flight tracking
- Re-check before update to avoid overwriting manual titles
- Add double-click to edit session title in sidebar
- Inline editing with Enter to save, Escape to cancel
- Blur saves by default, but respects Escape cancellation
- Persist title changes to database
- Add SESSION_UPDATE IPC channel for title updates
- Add SESSION_META_UPDATED event for real-time UI sync
- Add comprehensive unit tests for new functionality
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Add isPlanApprovalTool() detection function in tool-names.ts
- Create PlanApprovalUI component with markdown rendering
- Smart option categorization (approve/deny buttons)
- Defensive error handling for missing plan content
- Route ExitPlanMode requests to new UI in PermissionRequestItem
- Replace Circle icons with appropriate icons (Wrench, ClipboardCheck)
Closes#113
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The slash command menu only detected `/` at the start of the entire
input text. Now it detects `/` at the start of the current line where
the cursor is positioned, enabling slash commands to work in multiline
input.
Changes:
- Track cursor position in MessageInput to extract current line
- Parse slash command from current line at cursor instead of full input
- Update handleCommandSelect to replace only the current line's command
- Add onSelect handler to track cursor movement
- Update regex in parseSlashCommand to support multiline arguments
- Add unit tests for multiline slash command scenarios
Closes#109
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Two fixes for ACP error handling:
1. Fix error serialization in parseAcpError(): Plain object errors (e.g.,
{ code: -32603, message: '...' }) were converted via String() which
returns "[object Object]". Now properly extracts message property or
uses JSON.stringify() as fallback.
2. Stop broken agent process on error: When an ACP protocol error occurs
(e.g., "only prompt commands are supported in streaming mode"), the
agent connection enters a stuck state. Now calls agentProcessManager.stop()
so the next request starts a fresh agent process instead of repeating
the same error.
Closes#105
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Add React import back in FileTreeComponent.test.tsx (required for JSX)
- Fix isValidPath to recognize Windows paths on non-Windows platforms
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Add dev branch to the pull_request trigger so that CI runs on PRs to dev, matching the configuration for main branch.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Rename README files from region codes (zh-CN, zh-TW) to standard script codes (zh-Hans for simplified Chinese, zh-Hant for traditional Chinese) following BCP 47 standards. Update all navigation links across all language-specific README files.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Replace session delete with archive (soft delete):
- Add isArchived field to MulticaSession type
- Add archive/unarchive/listArchived methods to DatabaseStore
- Add IPC channels and handlers for archive operations
- Update Conductor with archive methods
UI changes:
- Change session delete button to archive icon
- Add "..." menu on project row with dropdown menu
- Add "View Archived Sessions" option in dropdown
- Add ArchiveSessionModal for confirming archive
- Add ArchivedSessionsModal for viewing/restoring archived sessions
- Users can restore archived sessions from the modal
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 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>
- Integrate Shiki for VS Code-quality syntax highlighting
- Add dark mode support with MutationObserver
- Implement LRU cache (200 entries) for performance
- Add streaming optimization with block-level memoization
- Auto-detect and linkify URLs and file paths
- Update CSP to allow WebAssembly for Shiki
Closes#98
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Correct the comment to accurately reflect that the database is stored
in ~/Library/Application Support/Multica/ (Electron userData), not
~/.multica/ which is only used as a fallback for tests.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add SQLite storage using sql.js for Project and Session data
- Implement Project -> Session hierarchical structure in sidebar
- Add drag-and-drop reordering for projects
- Reduce sidebar padding for better space utilization
- Show session title in top bar, remove folder name/path/status
- Add delete confirmation modals for projects and sessions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>