Refactors CollapsibleAssistantMessage to use shadcn Collapsible
component pattern, making the entire summary row clickable with
hover background effect - consistent with ToolCallItem styling.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
GUI apps on macOS don't inherit PATH from shell dotfiles (.zshrc, .bashrc, etc.).
This causes agent commands to fail when launched from Finder/Dock.
- Add fix-path dependency to correct PATH on app start
- Configure electron-vite to bundle ESM-only dependencies (fix-path, shell-path, strip-ansi)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Lazy agent initialization: agent now starts on first prompt instead of session creation
- Show auth errors inline in chat with structured UI (badges, steps, command button)
- Add one-click terminal command execution for authentication
- Users can enter chat immediately after selecting folder
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace Gemini CLI with Claude Code in all README files:
- Update agent list text to mention Claude Code, Codex CLI, OpenCode
- Replace Gemini CLI row with Claude Code in Supported Agents table
- Add claude-code-acp install command
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add toolCallId -> kind mapping to handle Codex and other agents
- tool_call_update events don't include kind field, so we store it
from tool_call events and look it up later
- Add 'execute' to FILE_MODIFYING_KINDS for Codex bash commands
- Clear mapping on session change to avoid stale data
- Support both 'completed' and 'failed' status for refresh trigger
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>
Change error handling in sendPrompt from throwing exceptions to emitting
session update events. This ensures errors appear inline in the chat
instead of triggering IPC failures and toast notifications.
- Emit error as agent_message_chunk instead of throwing
- Return 'error' stopReason for caller awareness
- Add parseAcpError helper for user-friendly messages
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add .env to .gitignore
- Enable macOS notarization in electron-builder
- Update dmg artifact naming to include arch
- Add zod dependency for schema validation
- Reorganize devDependencies in package.json
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>
- Move toast position from top-center to bottom-right
- Remove richColors and use neutral popover background for all toast types
- Add colored icons: green (success), red (error), amber (warning), blue (info)
- Improve switch agent success message
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Check both ACP kind and toolName from _meta.claudeCode for better compatibility
- Move file-modifying tool constants to module scope to avoid recreation on every render
- Remove debug console.log statements
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace existing icon with new minimalist design featuring a geometric star pattern on dark background. Generated in macOS (icns), Windows (ico), and PNG formats for all platforms.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Fixes two related issues when using Codex ACP agent: (1) ENOENT errors in
session persistence due to concurrent writes using identical temp file names,
and (2) ChatView content appearing out of order in real-time display due to
async ACP message delivery. Uses unique temp file names with UUID suffix and
adds sequence numbers to track update ordering across async boundaries.
Co-Authored-By: Claude Haiku 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>
Prevent auto-scroll from blocking user scroll interactions by only
scrolling when user is already near the bottom. Track scroll position
to detect if user has manually scrolled away from the bottom.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Added extractUserMessageText() helper to handle both new (MessageContent[])
and old ({ text: string }) user message formats. This fixes history replay
for resumed sessions after commit 913cccc changed the message storage format
without updating the extraction logic. Also updated integration test to use
the new MessageContent format.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Changed pendingRequest from single value to pendingRequests queue.
This prevents consecutive permission requests from overwriting each
other, which caused the first request's Promise to never resolve.
- permissionStore: pendingRequest → pendingRequests[]
- Added addPendingRequest() and getCurrentRequest()
- respondToRequest() now removes from queue head
- Updated all consumers to use queue[0]
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
After merging main branch, the permission request filtering in ChatView
was not working because PermissionManager was sending ACP session ID
instead of multica session ID. This caused AskUserQuestion UI to not
display because the session ID comparison failed.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Major changes:
- Extract permission handling into dedicated module (src/main/permission/)
- Create modular AskUserQuestion UI components with multi-select support
- Add state persistence for AskUserQuestion responses (survives app restart)
- Implement "Other" option detection with custom input replacement
- Custom input now counts as a selection in multi-select mode
- Centralize tool name constants in shared/tool-names.ts
Components added:
- AskUserQuestionUI: Main container for question flows
- QuestionOptions: Option buttons with checkbox indicators
- CustomInput: Free-form text input with conditional Send button
- CompletedAnswer: Display component for answered questions
- QuestionProgress: Progress indicator for multi-question flows
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
User input messages now display with a light beige background in light mode and a dark gray background in dark mode for better readability.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>