- Add displayedUnifiedTabs computed value with unread filter support
- Update render loop to conditionally render from unified tabs when provided
- Check unified tab type to render either Tab (AI) or FileTab (file)
- Update handleDrop, handleMoveToFirst, handleMoveToLast for unified tabs
- Update overflow check and empty state to consider unified tabs
- Maintain backwards compatibility with legacy AI-only tab rendering
- Create FileTabProps interface with file tab specific props
- Implement FileTab memoized component with:
- Filename without extension as label
- Color-coded extension badge (blue for TS/JS, green for MD, etc.)
- Unsaved edits indicator (pencil icon)
- Middle-click to close support
- Drag and drop handlers
- Same active/inactive styling as AI tabs
- Add getExtensionColor() helper for extension badge coloring
- Add UnifiedTab discriminated union type to types/index.ts
- Add new props to TabBarProps: unifiedTabs, activeFileTabId,
onFileTabSelect, onFileTabClose
- Props are optional for backwards compatibility during transition
- Phase 3 of file preview tabs implementation
Implements unified tab reorder functionality that operates on the
unifiedTabOrder array, allowing both AI and file preview tabs to be
reordered relative to each other. This supplements the existing
handleTabReorder (AI-only) for the unified tab system.
Changes:
- Added handleUnifiedTabReorder in App.tsx with index validation
- Propagated through useMainPanelProps.ts, MainPanel.tsx, TabBar.tsx
- Add isGeneratingName property to AITab interface
- Show Loader2 spinner in tab while name generation is in progress
- Set isGeneratingName true before API call, false on completion/error
- Spinner only shows when automatic tab naming is enabled
- Added performance best-practices guide for React and main process tuning 📘
- Introduced `buildFileTreeIndices` for fast, reusable markdown file lookups ⚡
- Updated `remarkFileLinks` to accept prebuilt indices with backward compatibility 🧩
- Memoized file-tree indices in AutoRun, FilePreview, and MarkdownRenderer for speed 🚀
- Expanded test suite to cover indices building and indexed link resolution 🧪
- Made temp-file cleanup asynchronous to keep the main thread snappy 🧹
- Cached shell path resolution to avoid repeated synchronous filesystem checks 🗄️
- Precompiled leading-emoji regex to speed up session name sorting 🔤
- Consolidated SessionList filtering/grouping/sorting into one efficient memo pass 🧠
- Memoized TabBar tabs, computed labels, and style objects to cut rerenders 🎛️
- OpenCode CLI now uses `run` batch subcommand with positional prompts 🚀
- Dropped `-p` prompt flag for OpenCode JSON mode compatibility 🧩
- Added `noPromptSeparator` for OpenCode positional prompt handling 🧠
- Implemented “Close All Tabs” action for faster session cleanup 🧹
- Implemented “Close Other Tabs” to focus instantly on one tab 🎯
- Implemented “Close Tabs to Left” for browser-style tab management ⬅️
- Implemented “Close Tabs to Right” to prune clutter in one click ➡️
- Wired bulk tab-close handlers through App, Modals, MainPanel, TabBar 🔌
- Enhanced tab context menu with bulk close options and smart disabling 📋
- Updated tests to reflect OpenCode batch mode and UI copy tooltip 🧪
- Launch the in-tab Wizard straight from Auto Run with one click! 🪄
- Wizard “show thinking” now displays live tool executions, not just text! 🧰
- Prevent confusing JSON flashes in wizard thinking stream for cleaner UX! 🧼
- Auto-complete wizard after document generation with a helpful summary log! ✅
- Redesigned document generation view: progress, elapsed time, and drafted files list! 📄
- Auto Run batch processing now fully supports SSH remotes end-to-end! 🔐
- Tab hover menu upgrades: instantly move tabs to first/last position! 🧭
- Keyboard safety: disable Cmd+J mode toggling while an active wizard tab runs! ⌨️
- Session persistence now drops incomplete wizard tabs to avoid broken restores! 💾
- Improved debugging for thinking-chunk streaming with richer ProcessManager logs! 🔎
- Marketplace playbook imports now prefix document paths with target folder 📁
- Added “Publish tab context as GitHub Gist” action in TabBar overlay 🚀
- Gist publish modal now supports both file previews and tab context 🧩
- Tab-to-gist publishing generates safe, descriptive markdown filenames 🏷️
- Gist publish button only appears when GitHub CLI is available 🔐
- Tab gist publishing auto-hides when no logs exist for that tab 🧾
- Auto Run queuing now avoids deadlocks by processing immediately when idle ⚡
- Added detailed queue decision debug logging for input processing 🔎
- Usage stats now track peak values only, never decreasing over time 📈
- Expanded test coverage for gist publishing, queuing, and playbook paths 🧪
- Added `dev:prod-data` to develop against real production sessions safely 🧪
- Dev mode now defaults to an isolated `maestro-dev` data directory 🗂️
- App can explicitly opt into production userData via `USE_PROD_DATA=1` 🔀
- Contributor docs now clearly map dev commands to their data directories 📚
- Reduced dev/production database lock conflicts when running side-by-side 🔒
- Tab hover overlay redesigned to look like a clean “open folder” panel 🗃️
- Removed tab title tooltip to streamline the tab interaction feel ✂️
- Toast logging now captures whether audio/TTS notifications were enabled 🎙️
- Toast logs include the exact audio command used for notifications 🧾
- TTS playback now reuses captured audio state for consistent behavior 🔊
• Updated tab closing functions to operate on visible tabs when unread filter is active
• Adjusted position calculations for tab close actions to use visible tabs only
• Replaced context menu with a tab hover overlay menu for AI conversation tabs
• Added tab management and context operations to the overlay menu
• Implemented hover delay and fixed positioning for the overlay
• Removed ContextMenu component and related tests
• Updated TabBar and Tab components to handle new overlay menu actions
Enhanced the tab context menu with full accessibility support and improved visual feedback:
Accessibility Enhancements:
- Added ARIA attributes (role="menu", role="menuitem", aria-disabled, aria-label)
- Implemented full keyboard navigation (Arrow keys, Enter/Space, Escape, Tab)
- Arrow keys navigate between enabled items with wrap-around behavior
- Tab key closes menu to prevent focus traps
- Mouse hover updates keyboard focus for hybrid interaction
- First enabled item receives focus on mount
Visual Polish:
- Enhanced disabled item feedback (opacity-40, cursor-default, dimmed colors)
- Stronger hover effects for enabled items (white/10 background)
- Keyboard focus indication matches hover state
- Added dividers between menu item groups using dividerAfter property
- All styling is theme-aware using theme.colors
Code Quality:
- Comprehensive JSDoc documentation on ContextMenu component
- Detailed inline comments explaining keyboard navigation logic
- Documented menu structure, disable logic, and active tab selection rules in TabBar
- All disable conditions clearly commented (single tab, first tab, last tab)
Implementation Details:
- ContextMenu.tsx: Added keyboard navigation state and handlers
- ContextMenu.tsx: Enhanced button styling with focus and disabled states
- TabBar.tsx: Added dividerAfter flags to menu items for visual grouping
- TabBar.tsx: Added comprehensive JSDoc block documenting menu behavior
Testing:
- TypeScript compilation passed with no new errors
- ESLint validation passed with no new warnings
- Manual testing recommended for keyboard navigation and screen readers
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implemented foundational context menu system for AI conversation tabs:
Created:
- ContextMenu.tsx: Reusable context menu component with viewport-aware
positioning, theme support, and accessible interactions
Modified:
- TabBar.tsx: Added right-click handler, context menu state management,
and placeholder menu items (Close Tab, Close Others, Close Right)
- modalPriorities.ts: Added TAB_CONTEXT_MENU priority (708)
Features:
- Right-click tabs to open context menu at cursor position
- Escape key and click-outside-to-close behavior
- Automatic viewport boundary adjustment
- Full theme color support for all UI states
- Placeholder actions ready for Phase 2 implementation
Pattern: Follows existing SessionContextMenu architecture from SessionList
Portal: Renders to document.body to escape stacking context
Ready: Infrastructure complete for Phase 2 tab close functionality
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Found expired OAuth token, attempting refresh...
Token refresh successful
## CHANGES
- Share achievements as images with exclusive peak stats captured 🏆
- Track keyboard shortcut usage and level up mastery in status bar ⌨️
- Edit Auto Run docs fullscreen with expanded editor and progress footer 🖥️
- Right-click tabs for new context management menu actions 🧭
- Merge contexts via new modal, with token estimates and cleaning 🔀
- Send context to other agents with searchable modal and cleaning options 🛰️
- Export any tab conversation as self-contained themed HTML file 📄
- Added dedicated History panel with search, filters, graph view, resume 🕒
- Validate Auto Run completions in History with review workflow toggles ✅
- Support fixed remote-access ports with clear security guidance 🔒
- Added “Copy Context” to export conversations as clean XML clipboard text 📋
- Achievement share image now includes persistent peak usage stats tracking 🏆
- New docs access from About modal and Quick Actions menu 🔗
- Auto Run now drains queued messages after completion or stop 🧵
- Logger types centralized in new shared module for consistency 🧩
- Preload logger API is now strongly typed with richer log entries 🔒
- Token compact formatter now supports billions with “B” display 📈
- Tab context menu expanded to show context actions sooner (≥1 log) 🗂️
- Terminal output memoization fixed by including markdown edit mode dependency 🧠
- Codex reasoning text formatting updated for clearer section readability ✍️
- Fix erroneous 100% context detection by removing artificial +5% increment
on each message send (useInputProcessing.ts)
- Move context warning sash below input box with reduced height/font size
- Add wand icon (Wand2) to center of spinner in progress modals
- Restyle Settings panel context warnings to use standard checkbox pattern
with ghosted sliders when disabled
- Unify context management menu labels across TabBar and Command+K:
- "Summarize Context" (was "Summarize & Continue")
- "Merge Contexts" (was "Merge With...")
- "Send Context to Agent" (was "Send to Agent...")
- Add dividing line in tab context menu before context management options
- Move "Mark as Unread" above context management section
- Add onSendToAgent prop to TabBarProps and TabProps interfaces
- Add handleSendToAgentClick handler in Tab component
- Add "Send to Agent..." button after "Merge With..." in overlay menu
- Use ArrowRightCircle icon from lucide-react
- Only show button for tabs with established agentSessionId
- Add 6 new tests for Send to Agent functionality
- Add ArrowRightCircle and GitMerge icon mocks to test file
- TabBar: Added tooltip showing full session ID on hover over "Copy Session ID" button
- SessionItem: Added clickable session ID badge showing first 8 chars of active tab's session ID
- Click to copy full session ID to clipboard
- Visual feedback with accent color and "Copied" text on click
- Tooltip shows full ID on hover
- Copy icon appears on hover for discoverability
Add "Merge With..." button to the tab hover overlay menu in TabBar.tsx:
- Import GitMerge icon from lucide-react
- Add onMergeWith prop to TabBarProps and TabProps interfaces
- Add handleMergeWithClick handler in Tab component
- Render "Merge With..." button after "Rename Tab" (only for tabs with agentSessionId)
- Pass onMergeWith callback through from TabBar to each Tab component
This enables the tab context menu UX entry point for the context merge feature.
Major type fixes:
- useSettings.ts: Add type assertions for settings.get() return values
- global.d.ts: Fix playbooks API types (maxLoops, branchNameTemplate, etc.)
- global.d.ts: Fix logger API to use proper log level union type
- useAgentExecution.ts: Simplify ref type definitions
- useExpandedSet.ts: Fix Set iteration type issues
- useTemplateAutocomplete.ts: Cast refs array properly
Component fixes:
- Fix ringColor CSS property -> use --tw-ring-color CSS variable (11 files)
- Fix Lucide icon title prop -> wrap icons in span with title
- Fix confetti shapes type in FirstRunCelebration and StandingOvation
- Fix nullable costUsd checks in AgentSessionsBrowser, SessionListItem
- Fix isDuplicate boolean coercion in AutoRunDocumentSelector
- Add lastAcknowledgedBadgeLevel to PlaygroundPanel mock stats
- Make GitLogEntry additions/deletions optional to match IPC
- Fix listDocuments -> listDocs API call in DirectorySelectionScreen
Reduces lint errors from 102 to 29.
- TabBar.tsx: removed unused props onTabRename and onCloseOthers
(onTabRename is handled by RenameTabModal, onCloseOthers was never implemented)
- MainPanel.tsx: removed corresponding dead props and usages
- App.tsx: removed dead callback implementations (44 lines)
- ExecutionQueueIndicator.tsx: removed unused React and QueuedItem imports
- Exported hasDraft() function from tabHelpers.ts (was internal-only)
- Updated TabBar.tsx to import hasDraft from tabHelpers instead of duplicating
- Added JSDoc documentation to hasDraft explaining its purpose
- All 12 tab helper functions are now properly exported and used
Add a new menu item in the tab hover overlay that allows users to
manually mark a tab as unread. This is useful for using the unread
indicator as a todo/reminder system.
Changes:
- Add onTabMarkUnread callback prop to TabBar and MainPanel
- Add "Mark as Unread" menu item with Mail icon in tab overlay
- Implement handler in App.tsx that sets hasUnread: true on the tab
- Add test case for the new functionality
Claude ID: 4884b984-82ed-4c6d-a2ac-834040680db0
Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
When the unread filter was toggled off, the tab list expanded but the
scroll position wasn't adjusted to keep the active tab visible. This
fix adds showUnreadOnly to the useEffect dependency array so the
scroll-to-active-tab logic runs when the filter changes.
Claude ID: a64eea9f-c7e7-40ae-ae35-1c13f6e9b118
Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
- Remove LOOP history entry type, consolidate to AUTO and USER only
- Add custom agent path support in NewInstanceModal for non-PATH installations
- Fix context usage calculation to count only input-related tokens (input + cache)
- Add demo mode (npm run dev:demo) for isolated testing environment
- Remove unused tab context menu from TabBar component
- Fix badge acknowledgment variable reference in useSettings
Claude ID: dbbd387e-ae3c-49a6-9961-d8317774f0a4
Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
Could you please share:
- The commit history, pull requests, or changelog since the last release
- Any release notes or development updates
- Or any other information about what has changed in your project
Once you provide that information, I'll create an exciting CHANGES section with clean 10-word bullets and relevant emojis, formatted in Markdown with HTML links as requested.
- Add Enter key support for queued message removal confirmation dialog
- Add kill process capability to System Process Monitor with confirmation
- Add toggle markdown rendering option to Cmd+K Quick Actions menu
Claude ID: d504ac29-93b3-46e9-8929-9be234bbcf07
Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
- Fix cloudflared not being found when running from /Applications by using
expanded PATH (includes /opt/homebrew/bin, /usr/local/bin, etc.) in
cliDetection.ts, matching how agent-detector.ts handles binary detection
- Cache and use full cloudflared path in tunnel-manager.ts to ensure the
binary is found when spawning the tunnel process
- Add debugging logs for process exit events to help diagnose thinking pill
issues (App.tsx)
- Add hint about Cmd+/ shortcut in settings modal shortcuts section
- Add Cmd+U shortcut hint to tab filter tooltip
Claude ID: 110ec97f-d876-4fb9-b577-ee7a7cd4f9e5
Maestro ID: b9bc0d08-5be2-4fdf-93cd-5618a8d53b35
Use manual scroll calculation instead of scrollIntoView for more
predictable centering. Active tab is now centered on every tab change
using offsetLeft calculation relative to container width.