- Live-mode tab broadcasts now run on a 500ms interval ⚡
- Disabled live mode fully stops all tab-change broadcasting 📴
- Fixed remote integration effect rerunning on every keystroke 🛠️
- Remote command handling gained detailed tracing and safety warnings 🔍
- TerminalOutput wrapped with `React.memo` to cut heavy rerenders 🚀
- Input @mention detection optimized via `lastIndexOf` fast-path 🧠
- Textarea auto-grow moved to `requestAnimationFrame` for smoother typing 🎯
- Stop button now ignores clicks while stopping, preventing double-stop 🛑
- Stopping state UI now switches to warning styling for clarity 🎨
- Batch processor adds richer progress debug logs for diagnosis 🧾
- Keystroke-fast typing by keeping input values in local App state ⚡
- InputContext slimmed to completions/history only, cutting noisy re-renders 🧠
- MainPanel wrapped in `React.memo` to stay stable during parent updates 🛡️
- Memoized new agent session handler to prevent prop-churn redraws 🧬
- Memoized tab select/close/new callbacks for snappier tab interactions 🗂️
- Queue item removal and queue browser open now memoized for stability 🧹
- Removed inline prop lambdas, reducing renders from changing function identities 🔧
- SessionContext memo deps clarified for correct reactive updates without over-tracking 🧾
Extracts core session state from App.tsx to a dedicated SessionContext,
completing Phase 6 of the App.tsx decomposition plan.
States extracted:
- sessions and setSessions
- groups and setGroups
- activeSessionId and setActiveSessionId
- sessionsLoaded and setSessionsLoaded
- sessionsRef, groupsRef, activeSessionIdRef
- batchedUpdater (via useBatchedSessionUpdates)
- activeSession (computed)
- cyclePositionRef
- removedWorktreePaths (worktree tracking)
This context provides the foundational session state that other
contexts and components can now consume without prop drilling.
App.tsx continues to handle session operations like restore, create,
and delete, but the core state is now centralized in the context.
This commit extracts the Auto Run document management states from App.tsx
into a dedicated AutoRunContext, continuing the App.tsx decomposition effort.
States moved to AutoRunContext:
- documentList (autoRunDocumentList) - List of document filenames
- documentTree (autoRunDocumentTree) - Hierarchical tree view of documents
- isLoadingDocuments (autoRunIsLoadingDocuments) - Loading state
- documentTaskCounts (autoRunDocumentTaskCounts) - Per-document task counts
The context also provides convenience methods:
- clearDocumentList() - Clear all document state
- updateTaskCount() - Update task count for a specific document
The useBatchProcessor hook continues to manage batch processing state,
while this context focuses on document list/tree management. This follows
the pattern established by ModalContext, UILayoutContext, InputContext,
and GroupChatContext in previous phases.
See refactor-details-2.md for the full decomposition plan.
Extracts all group chat state from App.tsx into a dedicated context provider:
- Group chats list and active group chat ID
- Messages, state, and participant tracking (per-chat and active)
- Moderator usage stats, staged images, read-only mode
- Execution queue, right panel tab, participant colors
- Error state and refs for focus management
- Convenience methods: clearGroupChatError, resetGroupChatState
This is Phase 4 of the App.tsx decomposition plan (refactor-details-2.md).
Reduces coupling and improves maintainability of group chat feature.
Extracted input and completion states from App.tsx into a new InputContext
as part of the ongoing App.tsx decomposition effort (Phase 3 of 6).
States extracted to InputContext:
- Terminal and AI input values (terminalInputValue, aiInputValue)
- Slash command completion (slashCommandOpen, selectedSlashCommandIndex)
- Tab completion for terminal (tabCompletionOpen, selectedTabCompletionIndex, tabCompletionFilter)
- @ mention completion for AI mode (atMentionOpen, atMentionFilter, atMentionStartIndex, selectedAtMentionIndex)
- Command history browser (commandHistoryOpen, commandHistoryFilter, commandHistorySelectedIndex)
Key changes:
- Created src/renderer/contexts/InputContext.tsx with InputProvider and useInputContext
- Renamed MaestroConsole to MaestroConsoleInner and wrapped with InputProvider
- Removed duplicate useState declarations from App.tsx
- Added reset methods for each completion type (resetSlashCommand, resetTabCompletion, resetAtMention, resetCommandHistory)
- Added closeAllCompletions convenience method
Types use React.Dispatch<React.SetStateAction<T>> to support callback patterns
(e.g., setIndex(prev => prev + 1)).
Added null check for activeSession in handleFileClick useCallback to prevent
runtime error when activeSession is null. Updated dependency array to use
activeSession instead of activeSession.fullPath for proper hook compliance.
Copy thinkingChunkBufferRef.current to local variable at the start
of the useEffect, then use that variable in the cleanup function.
This follows React's ESLint rule for refs in cleanup functions, which
warns that the ref value may have changed by the time cleanup runs.
- handleFileClick wrapped with dependencies: activeSession.fullPath, filePreviewHistory,
filePreviewHistoryIndex, and related setters
- toggleFolder wrapped with empty dependency array (all deps passed as parameters)
- Fixes ESLint react-hooks/exhaustive-deps warnings about functions changing on every render
- Add addLogToActiveTab to remoteCommand useEffect dependency array
(function is wrapped in useCallback, so it's stable)
- Add setViewingSession to submitRename useCallback dependency array
(state setter is stable)
- Add eslint-disable with comment for previewFile intentional omission
(clearing preview should only happen on session change, not when preview changes)
- Remove unused imports from App.tsx: createMergedSession, TAB_SHORTCUTS, DEFAULT_CONTEXT_WINDOWS
- Remove unused import RotateCcw from AICommandsPanel.tsx
- Remove unused import useCallback from AgentPromptComposerModal.tsx
- Remove unused import Image from AutoRunExpandedModal.tsx
- Remove unused local function countUncheckedTasks from BatchRunnerModal.tsx
- Remove unused import X from DebugPackageModal.tsx
- Remove unused imports Copy and FileText from FilePreview.tsx
Found expired OAuth token, attempting refresh...
Token refresh successful
## CHANGES
- Pops unacknowledged badge celebrations when you return, focus, or move mouse 🎖️
- Stops the correct Auto Run session by passing explicit session IDs 🛑
- Auto Run Stop button now targets its own session reliably, everywhere 🧭
- Elapsed Auto Run time now shows true cumulative task work duration ⏱️
- Tracks cumulativeTaskTimeMs in batch state for accurate reporting 📊
- Resets interrupted “reset-on-completion” docs safely, even without backups 🧹
- External links now open in the system browser across the app 🌐
- Markdown/Chat links in Wizard screens open externally for safer navigation 🗺️
- Toast action links launch externally without hijacking in-app clicks 🔔
- Main Auto button got tighter sizing and clearer progress microcopy 🧩
- Added smart quit confirmation flow when AI agents are still thinking 🛑
- Introduced new QuitConfirmModal listing active agents before exiting ⚠️
- Wired main↔renderer IPC lifecycle API for confirm/cancel quit actions 🔌
- Fixed Electron quit interception by making `before-quit` handler synchronous ⏱️
- Improved shutdown reliability with fire-and-forget cleanup and error logging 🧹
- Prioritized quit confirmation above other modals via layer stack ordering 🧗
- Made quit dialog safer by defaulting focus to Cancel and supporting Esc ⌨️
- Polished “thinking” terminal output styling with clearer accent emphasis 🎨
- Add sourceSessionName, targetSessionName, estimatedTokens to MergeResult
- Show source→target with token counts in merge/transfer toasts
- Include tokens saved info when grooming reduces context size
- Add MergeSessionCreatedInfo interface for richer callback data
- Make toasts clickable by including sessionId/tabId
- Replace generic 'Source'/'Target' fallbacks with descriptive names
- Replaced blocking merge modal with per-tab, non-blocking overlay progress 🧩
- Added new `MergeProgressOverlay` with stages, timer, and cancel-confirm UI ⏱️
- Implemented per-tab merge state tracking in `useMergeSession` for parallel work 🧠
- Enabled canceling merges per-tab, plus global cancel and state cleanup 🛑
- Added click-to-navigate merge success toasts with session/tab metadata 🔔
- Automatically clears completed merge state after short delay for tidy UI 🧹
- Fixed “merge into existing tab” to inject source-only context correctly 🎯
- Eliminated stale closure bugs by switching slash-command lookup to refs 🧷
- Expanded keyboard mastery tracking by recording shortcut use in File Preview 📋
- Session-jump numbering now excludes worktree children to preserve slots 🧭
- Keyboard mastery celebration now shows your “Help” shortcut hint 🎹
- Celebration modal supports custom shortcut mappings with smart defaults 🧩
- Shortcut keys render as platform-friendly glyphs (⌘, ⌥, ⇧) 🧠
- Maestro celebration swaps iconography from music note to keyboard ⌨️
- Help shortcut display is memoized for smoother modal performance ⚡
- Celebration copy now nudges you to view shortcuts and progress 🧭
- Replaced blocking summarize modal with inline per-tab progress overlay 🚀
- Keep other tabs fully interactive while context compaction runs 🧠
- Added click-to-navigate success toast linking directly to new tab 🧭
- Write a system log entry into source tab after compaction 📝
- Track summarization state per tab with start time and elapsed timer ⏱️
- Added per-tab cancel support with confirmation prompt and cleanup 🛑
- MainPanel/InputArea now receive summarization progress props end-to-end 🔌
- Context summarizer now uses single-call `groomContext` API for compaction 🧹
- Removed temporary grooming session creation/sending/cleanup IPC plumbing 🧨
- Improved progress staging UI with steps, percent bar, and completion stats 📊
- Add leaderboard registration modal with Supabase backend integration
- Wire celebration modal into App.tsx with proper state management
- Add clipboard API and shell.openExternal to preload for leaderboard features
- Track mastery level milestones to prevent duplicate celebrations
- Add celebratedMasteryLevel to settings persistence
Added import for KeyboardMasteryCelebration component, created the close
handler that acknowledges the level when dismissed, and added the modal
rendering between FirstRunCelebration and StandingOvationOverlay.
- Pass keyboardMasteryStats prop from App.tsx to ShortcutsHelpModal
- Display mastery progress bar with current level name and percentage
- Show checkmark indicators for shortcuts that have been used
- Style used shortcuts with brighter text, unused with dim text
- Add comprehensive test coverage for mastery display functionality
Implements the core gamification system for tracking keyboard shortcut usage:
- Add KeyboardMasteryStats interface and KeyboardMasteryLevel type to types
- Create keyboardMastery.ts constants with 5 mastery levels (Beginner to Maestro)
- Add settings persistence with recordShortcutUsage, acknowledgeKeyboardMasteryLevel
- Track all shortcut executions in useMainKeyboardHandler.ts via trackShortcut helper
- Wire up in App.tsx with pendingKeyboardMasteryLevel state and startup check
- Total of 56 trackable shortcuts (35 DEFAULT + 21 TAB_SHORTCUTS)
All 11,655 tests pass. UI components (progress bar, celebration modal) coming in next phase.
Found expired OAuth token, attempting refresh...
Token refresh successful
## CHANGES
- Prompts now compile from Markdown into TypeScript at build-time 🔧
- New `build:prompts` step runs automatically for dev and release builds 🏗️
- Main process stops runtime prompt file I/O for faster, safer startups ⚡
- Group chat prompt access refactored into getter functions for flexibility 🧩
- Added IPC to reset a participant context with session summarization 🔄
- Participant cards now copy agent session IDs with one click 📋
- UI shows context-reset button when participant usage hits 40%+ ⏱️
- History markdown now supports raw HTML rendering via `rehype-raw` 🧪
- History detail supports clickable file links and in-app file previews 🗂️
- Document copy-drag enables reset-on-completion across duplicate filenames 🧷
When agents don't provide context window size, estimate context usage
percentage using agent-specific default context windows:
- claude-code/claude: 200k tokens
- codex: 200k tokens
- opencode: 128k tokens
- aider: 128k tokens
- terminal: 0 (no context window)
Added:
- src/renderer/utils/contextUsage.ts with estimateContextUsage()
- src/main/parsers/usage-aggregator.ts updated with matching function
- Comprehensive test suites for both renderer and main process
Add ContextWarningSash component that displays a warning banner when
context window usage reaches configurable thresholds:
- Yellow warning at 60% (default)
- Red warning at 80% (default)
Features implemented:
- ContextWarningSash component with warning level detection
- Dismissal tracking per-tab with reappearance rules
- Integration with InputArea for AI mode display
- Settings wiring from App.tsx through MainPanel to InputArea
- Visual polish with slideDown and pulse animations
- Full accessibility support (ARIA attributes, keyboard navigation)
- Comprehensive test suite with 26 passing tests
Files created:
- src/renderer/components/ContextWarningSash.tsx
- src/__tests__/renderer/components/ContextWarningSash.test.tsx
Files modified:
- src/renderer/App.tsx (added contextManagementSettings destructuring)
- src/renderer/components/MainPanel.tsx (added context warning props)
- src/renderer/components/InputArea.tsx (integrated sash component)
- Add sendToAgent keyboard shortcut (Cmd+Shift+A) to shortcuts.ts
- Add "Send to another agent" command to QuickActionsModal.tsx
- Wire up SendToAgentModal in App.tsx with state and agent detection
- Add onOpenSendToAgent prop to QuickActionsModal component
- Add 4 new tests for Send to Agent command in QuickActionsModal
The command appears when supportsContextMerge capability is available
and opens the SendToAgentModal for cross-agent context transfer.
Transfer execution logic placeholder added pending Task 7 implementation.
- Extended onSessionCreated callback to include sessionName parameter
- Added OS-level desktop notification via window.maestro.notification.show()
- Updated toast notification to include merged session name
- Auto-navigation to new session was already implemented
- Create useMergeSession.ts with full merge workflow orchestration
- Add MergeState type (idle | merging | complete | error)
- Add MergeSessionRequest interface for merge parameters
- Implement useMergeSessionWithSessions hook for App.tsx integration
- Export hook and types from hooks index
- Integrate with App.tsx: hook call with setSessions/onSessionCreated
- Update MergeSessionModal.onMerge to use executeMerge function
- Add MergeProgressModal rendering during merge operations
- Support for grooming toggle, cancellation, and auto-navigation
- Add mergeSession keyboard shortcut (Cmd+Shift+M) to shortcuts.ts
- Add "Merge with another session" command to QuickActionsModal
- Add supportsContextMerge/supportsContextExport capabilities to frontend AgentCapabilities interface
- Add keyboard shortcut handler in useMainKeyboardHandler.ts
- Integrate MergeSessionModal into App.tsx with modal state and rendering
- Wire up onOpenMergeSession prop for Command K activation
- Add createMergedSession() to tabHelpers.ts for creating sessions
pre-populated with merged context logs
- Add initializeMergedSession() to App.tsx for integrating merged
sessions into app state with git repo detection and notifications
- Add 11 unit tests for createMergedSession covering all options
- All 139 context-related tests pass
- Jump straight from group chat participants into their live sessions instantly! 🚀
- Participant session pill now navigates instead of copying IDs automatically! 🔗
- Session ID pill got an external-link icon for clearer intent! 🧭
- Session ID preview now displays uppercase for faster visual scanning! 🔠
- History Help now fetches actual storage path dynamically via Maestro APIs! 🗂️
- Home directory paths shorten to ~ for super clean file hints! 🏠
- Windows history paths render with backslashes correctly when detected! 🪟
- History path shows a Loading state while resolving asynchronously! ⏳
- Graceful fallback history path appears when storage APIs fail! 🛡️
- History Detail now renders responses as Markdown for richer readability! 📝
- Added per-tab Thinking toggle to stream AI reasoning live! 🧠
- Introduced capability gating for Thinking display, only when supported! ✅
- Prevented Thinking controls during group chats for cleaner UX! 👥
- Clearing Thinking now removes reasoning logs when toggled off! 🧹
- Prompt Composer shows new Brain icon toggle for Thinking mode! 🧠
- Thinking toggle styling reflects active state with accent highlights! 🎨
- Added new modal props for Thinking state and handlers! 🧩
- Defaulted Thinking visibility safely when sessions or tabs missing! 🛡️
- Wired App session state updates to persist Thinking per tab! 💾
- Added helpful tooltip explaining real-time reasoning stream behavior! 💡
- Share credential definitions, plugins, templates, and workflows across organizations now! 🔗
- Expanded credential management: create, import, export, and move seamlessly! 🚀
- Faster, clearer organization switching with improved UX and navigation flow! 🧭
- New API endpoints for org-shared credentials, templates, and workflows added! 🧩
- Enhanced permissions and access controls for shared resources across orgs! 🔒
- Improved audit logging and traceability for credential and workflow operations! 🧾
- UI updates for managing shared assets: cleaner tables and actions! ✨
- Better error handling and validation for imports and credential operations! 🛠️
- Performance improvements in list views, searches, and organization loading! ⚡
- Documentation refreshed with new sharing features and updated integration guides! 📚
- Add clickable action links to toast notifications (for PR URLs)
- Add history entry when PR is created with branch info and description
- Show uncommitted changes warning in CreatePRModal before creating PR
- Add DeleteWorktreeModal with three options: Cancel, Confirm (keep files), Confirm and Delete on Disk
- Add git:removeWorktree IPC handler to delete worktree directories from disk