Commit Graph

227 Commits

Author SHA1 Message Date
Mohamed Boudra
ffc6bd3ba5 Fix inline path linking for absolute cwd paths 2025-12-29 00:15:21 +07:00
Mohamed Boudra
025fd97143 Fix file explorer back loader 2025-12-29 00:10:23 +07:00
Mohamed Boudra
5120f73f49 Add host selector to import agent modal 2025-12-29 00:06:06 +07:00
Mohamed Boudra
265caaf140 Fix gallery image timeout crash 2025-12-29 00:02:00 +07:00
Mohamed Boudra
7c97dc18fb Show permissions mode in agent trigger 2025-12-28 23:38:02 +07:00
Mohamed Boudra
1269edcb6e Persist new agent form config 2025-12-28 23:36:05 +07:00
Mohamed Boudra
69b6f755fa feat: add turn_canceled event for proper interruption handling
Adds a new turn_canceled event type to distinguish intentional turn
interruption from errors. Fixes race conditions in Claude agent where
concurrent stream() calls could cause garbled output by serializing
turn handoff with turn IDs.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-28 16:29:01 +00:00
Mohamed Boudra
1e9d8bf075 Add server-side validation for working directory existence
- Validate cwd exists before creating agent in session.ts
- Show error message when directory doesn't exist
- Add client-side warning display in new.tsx
- Block form submission for non-existent directories
- Add daemon e2e test for non-existent cwd validation
- Add createAgentExpectFail helper in daemon-client.ts

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 05:10:59 +00:00
Mohamed Boudra
95c821a4c6 fix: restore input on submission error and enforce clean working tree for git operations 2025-12-27 09:35:40 +07:00
Mohamed Boudra
40835bbe9d Fix Codex history persistence after daemon restart
- Modified loadPersistedHistoryFromDisk() to use sessionId or conversationId as fallback
- Added rollout path and session dir persistence in agent metadata
- Added fallback to default Codex session root when metadata path is empty
- Cleaned up create-agent-modal.tsx (removed 800+ lines of dead code)
- Updated app routing and home-footer cleanup

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 11:39:20 +07:00
Mohamed Boudra
26da925de6 Redesign new agent page UI layout
- Move host selector to header (right side) with icon + name + status dot
- Combine provider/model/mode into single "Agent" dropdown
- Replace Git branch/worktree toggles with segmented IsolationControl (None/Branch/Worktree)
- Only show Git section for git repositories (hide for non-git directories)
- Wrap config section in ScrollView for proper scrolling
- Simplify layout: Working Directory → Agent → Git (when applicable)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 21:40:35 +07:00
Mohamed Boudra
11e7bc5fcc Fix: Clear attention when agent finishes while user is viewing
When a user is viewing an agent screen and the agent transitions from
running to idle, immediately call clearAgentAttention since the user
witnessed the completion. This prevents the "requires attention" state
from appearing when the user navigates back to the home screen.

Added a useEffect in AgentScreenContent that:
1. Tracks the previous agent status via a ref
2. Detects transitions from "running" to "idle"
3. Clears attention immediately on such transitions

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 21:22:24 +07:00
Mohamed Boudra
54f0583334 Add Git Options Section to new agent page
- Added GitOptionsSection and ToggleRow components to agent-form-dropdowns.tsx
- Added useDaemonRequest hook for git_repo_info_request in new.tsx
- Added git-related state: baseBranch, createNewBranch, branchName, createWorktree, worktreeSlug
- Added git validation logic: isNonGitDirectory, gitBlockingError, validateWorktreeName
- Updated handleCreateFromInput to include git options in createAgent call
- Git section only shows when working directory is set
- Auto-populates base branch from current branch
- Shows dirty directory warning
- Validates branch/worktree names

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 21:17:25 +07:00
Mohamed Boudra
bd7752b4f4 Add visual loading indicator to new agent page
- Add isSubmitLoading prop to AgentInputArea component to allow parent
  to control loading state externally
- When isSubmitLoading is true:
  - Show ActivityIndicator instead of ArrowUp icon in send button
  - Disable send button with reduced opacity
- Pass isLoading state from new.tsx to AgentInputArea via isSubmitLoading prop

Files changed:
- packages/app/src/components/agent-input-area.tsx:53-54, 98, 1050-1060
- packages/app/src/app/agent/new.tsx:472

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 21:07:46 +07:00
Mohamed Boudra
a398f67527 Fix new agent page bugs and add error handling
- Add errorMessage and isLoading states for proper UX feedback
- Add validation for working directory, prompt, host, and connection
- Display error messages in red container below config section
- Handle agent_create_failed status with error display
- Add loading state management during agent creation
- Log warning for image attachments (server API doesn't support yet)

Tested with Playwright MCP:
- Error message "Working directory is required" displays correctly
- Agent creation with valid config succeeds and redirects

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 20:53:31 +07:00
Mohamed Boudra
ab9c133d0e fix: allow null parentAgentId in agent schemas and projections 2025-12-25 18:51:18 +07:00
Mohamed Boudra
8261910c37 Set document title on agent screen for web
Adds a useEffect that sets the browser tab title to the agent's title
(or "Agent" as fallback) when viewing an agent. Only runs on web platform.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 12:07:29 +07:00
Mohamed Boudra
fe5e86d514 Add agent list sidebar on large screens
Show AgentList as a left sidebar (280px) when viewing an agent on
screens >= 768px wide. The current agent is highlighted with a
primary-colored border and accent background.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 11:43:14 +07:00
Mohamed Boudra
37da13a38b Fix markdown list text wrapping on Android
- Add custom list rendering rules in message.tsx for proper flex layout
- Remove flexWrap from list content styles (causes Android clipping)
- Use flex: 1 and flexShrink: 1 for natural text wrapping
- Add minWidth: 0 to content containers for proper shrinking

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-24 04:41:37 +00:00
Mohamed Boudra
09f130408b Fix agent menu spacing 2025-12-23 23:24:13 +07:00
Mohamed Boudra
8a06b378d8 Add running dot to sub-agent list 2025-12-23 23:19:26 +07:00
Mohamed Boudra
eb48ae0f6b Make Running and Finished status mutually exclusive
Running takes priority over Finished indicator.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-23 23:14:54 +07:00
Mohamed Boudra
993eed0628 Allow agent creation outside git repos 2025-12-23 23:11:48 +07:00
Mohamed Boudra
38c1f52035 Use agent directories for working dir suggestions 2025-12-23 23:11:48 +07:00
Mohamed Boudra
c4b9a68c6b Replace needs attention with finished status 2025-12-23 23:11:48 +07:00
Mohamed Boudra
f2e6a55fec Sort and scroll sub-agent list 2025-12-23 23:11:48 +07:00
Mohamed Boudra
4a4a2507dd fix(app): prevent markdown list content overflow with proper flex shrinking 2025-12-23 16:09:16 +00:00
Mohamed Boudra
6a9b57ae0c Simplify agent list UI and add bearer token auth for Codex MCP
- Replace SectionList with FlatList in agent list, sorting attention items to top
- Persist server selection preference in create agent modal
- Add bearer token authentication support for agent-control MCP endpoint
- Pass bearer token through Codex wrapper script for MCP auth

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-23 22:11:51 +07:00
Mohamed Boudra
957decc1f7 Trim dictation toasts to failures 2025-12-23 14:02:55 +07:00
Mohamed Boudra
38a4c70aec Improve markdown styling and enable text selection on mobile
- Fix agent chat bottom scroll padding by adding overflow hidden to inputAreaContainer
- Create shared markdown-styles.ts with comprehensive styling for tables, headings, code blocks, blockquotes, and horizontal rules
- Enable text selection in AssistantMessage and AgentThoughtMessage by overriding markdown render rules with selectable={true}
- Path chips remain non-selectable to preserve onPress navigation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-23 12:32:52 +07:00
Mohamed Boudra
825154f35a Tweak bottom sheet sheet styling 2025-12-22 04:21:58 +00:00
Mohamed Boudra
070314fa5f Fix bottom sheet dark theme background 2025-12-22 04:05:19 +00:00
Mohamed Boudra
56a287a85d fix: tool call bottom sheet text visibility
Replace react-native-gesture-handler ScrollView with React Native's
built-in ScrollView to fix text rendering issues inside @gorhom/bottom-sheet.
The gesture handler's ScrollView was causing text to render nearly invisible.

Also add explicit background colors to scroll containers for consistent
appearance.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-22 03:37:17 +00:00
Mohamed Boudra
7d233777db fix: back button returns to parent agent instead of homepage
When viewing a child agent (an agent with parentAgentId set), the back
button now navigates to the parent agent screen instead of always going
to the homepage. Added handleBack callback in AgentScreenContent that
checks for parentAgentId and routes accordingly.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-22 01:10:22 +00:00
Mohamed Boudra
253af9988c fix: wrap orchestrator messages view with ToolCallSheetProvider
The ToolCall component requires the ToolCallSheetProvider context to
function properly. The orchestrator messages view was rendering ToolCall
components without this provider, which would cause a crash when tapping
tool call badges.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-21 18:36:11 +00:00
Mohamed Boudra
a8053bc0b5 feat: integrate ToolCallSheetProvider in AgentStreamView
Wrapped AgentStreamView content with ToolCallSheetProvider to enable
tool call details to open in a bottom sheet on tap instead of expanding
inline. This improves mobile UX for viewing tool call information.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-21 18:24:07 +00:00
Mohamed Boudra
09b7360a7e feat: update ToolCall to open bottom sheet on tap
- Import useToolCallSheet hook from new tool-call-sheet component
- Replace inline expansion with openToolCall() to show details in bottom sheet
- Remove ~300 lines of unused code (toolCallStylesheet, formatFullValue,
  buildLineDiffFromStrings, isStructuredToolResult, and inline rendering)
- Clean up unused imports (ScrollView, DiffViewer, DiffLine)
- Badge display unchanged - still shows icon, label, loading/error state

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-21 18:22:29 +00:00
Mohamed Boudra
676125a732 feat: add ToolCallSheet component with bottom sheet and context
Create a new component for displaying tool call details in a bottom sheet
on mobile devices. Includes:
- ToolCallSheetProvider and useToolCallSheet hook for state management
- BottomSheetModal with snap points at 50% and 90%
- Header with tool icon, name, and status badge
- Content sections for args, commands, file diffs, file reads, and errors
- Reuses rendering logic from existing ToolCall component

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-21 18:18:10 +00:00
Mohamed Boudra
c7294753ec fix: resolve childAgents selector infinite loop in AgentScreenContent
The useShallow wrapper was not preventing infinite loops because the
selector created new object references on every store update. Fixed by:
1. Selecting the agents Map directly (stable reference)
2. Deriving childAgents array in useMemo with proper dependencies

The Map only changes when agents are added/removed, preventing
unnecessary re-renders that were causing the infinite loop.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-21 18:05:46 +00:00
Mohamed Boudra
99338d3b34 fix: use useShallow for childAgents selector to prevent infinite loop
The childAgents selector in the agent screen was creating a new array
on every render, causing an infinite loop when combined with zustand's
store subscription. Added useShallow wrapper to perform shallow
comparison and prevent unnecessary re-renders.

Also updated plan.md with test results:
- PARTIAL PASS: Fixed infinite loop, agent screen loads correctly
- Sub-Agents menu section displays properly
- Parent/child MCP creation works but parentAgentId not auto-injected
- Added fix task for auto-injecting parentAgentId in MCP server

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-21 17:30:34 +00:00
Mohamed Boudra
cdc17006da feat: add sub-agents section to agent info menu
Added a "Sub-Agents" section to the agent info menu dropdown that:
- Queries session store for agents where parentAgentId matches current agent
- Displays child agents as clickable menu items with chevron icons
- Shows "No sub-agents" when the agent has no children
- Navigates to child agent screen when tapped

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-21 17:25:02 +00:00
Mohamed Boudra
11afd22858 feat: filter homepage to show only root agents
Skip agents with parentAgentId when building the aggregated agents list
for the homepage. This ensures only top-level (root) agents are displayed,
while child agents are only accessible through their parent agent's menu.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-21 17:22:42 +00:00
Mohamed Boudra
cb78f29b31 feat: add parentAgentId to client types and session store
Add parentAgentId field to:
- Agent interface in session-store.ts
- AgentDirectoryEntry in agent-directory.ts
- getAgentDirectory() includes parentAgentId
- normalizeAgentSnapshot() maps from server payload

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-21 17:21:11 +00:00
Mohamed Boudra
5d5a196525 fix: prevent infinite loop in git-diff screen
Added hasRequestedRef to track if a git diff request was already made
for the current agentId. This prevents duplicate requests when the
requestGitDiff function reference changes due to store updates.

The issue was that requestGitDiff in the useEffect dependency array
caused an infinite loop: request → store update → new function ref →
effect re-runs → request again.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-21 17:08:05 +00:00
Mohamed Boudra
abe3a42478 feat: add agent runtime info tracking with model detection from rollout files 2025-12-21 23:16:49 +07:00
Mohamed Boudra
b8de55f31b Merge branch 'main' of github.com:boudra/voice-dev 2025-12-20 12:58:17 +07:00
Mohamed Boudra
fb30160cda feat: add batch clear attention and orchestrator mode instructions 2025-12-20 05:57:54 +00:00
Mohamed Boudra
5466ea1967 Merge branch 'main' of github.com:boudra/voice-dev 2025-12-20 12:57:33 +07:00
Mohamed Boudra
a6d2ea3153 fix: add input field to tool call data and simplify CLAUDE.md orchestrator docs 2025-12-20 12:56:59 +07:00
Mohamed Boudra
0f1758709d feat: add "Requires Attention" agent grouping feature
Implement a new UI section that surfaces agents requiring user attention at the top of the agent list. This includes agents that are running, have pending permissions, or have errors.

**Backend changes:**
- Add `requiresAttention` field to agent projections and SDK types
- Implement logic in AgentManager to detect attention states (running, pending permissions, errors)
- Add WebSocket message handler to notify clients of attention state changes
- Update session state to include attention tracking

**Frontend changes:**
- Add "REQUIRES ATTENTION" section in agent-list component with visual prominence
- Update useAggregatedAgents hook to expose `requiresAttention` agents
- Enhance session store to track and update attention states
- Add real-time updates via WebSocket for attention state changes
- Update type definitions across agent directory and stream types

Verified working via Playwright MCP testing on localhost:8081.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 11:27:08 +00:00