Closed
Conversation
…dedup
Accessibility:
- AITab, FileTab: add tabIndex={0}, role="tab", aria-selected, outline-none,
and Enter/Space onKeyDown handler to match TerminalTabItem
- NewTabPopover: auto-focus popover on open, restore focus to + button on
close, add Escape key handler
Timeout cleanup (prevent state updates after unmount):
- AITab: store copy feedback timeouts in copyTimeoutRef, clear on unmount
- FileTab: same copyTimeoutRef pattern for file path/name copy
- useTabHoverOverlay: clear pending hover timeouts on unmount via useEffect
Stability:
- useTabHoverOverlay: stabilize setTabRef by capturing registerRef in a ref
instead of depending on options?.registerRef directly
- TerminalTabItem: memoize displayName with useMemo (was raw call)
- AITab: add comment explaining displayName useMemo deps coupling
Navigation:
- getRepairedUnifiedTabOrder: deduplicate live refs via seen set so navigation
indices match buildUnifiedTabs (which deduplicates via Map.delete)
- 2 new regression tests (stale pruning + duplicate dedup)
Shell cleanup:
- TabBar: replace magic 48 with STICKY_RIGHT_WIDTH constant
- TabBar: inline canClose=true (remove dead local)
- TabBar: add dev-time console.warn when unifiedTabs provided without
file/terminal select/close handlers
- Unread filter now always shows file and terminal tabs (they have no unread state; hiding them caused navigation/display mismatch) - handleMouseEnter clears any pending close timer before scheduling the open timer (prevents flicker on rapid leave→enter) - closeTab and closeFileTab use getRepairedUnifiedTabOrder instead of raw session.unifiedTabOrder for neighbor lookup (stale refs could cause fallback to wrong tab when closing the active tab) - Regression test: close active tab with stale refs in unifiedTabOrder
refactor(tabbar): decompose TabBar + fix tab navigation skipping
handleOpenFileTab set activeFileTabId but never switched inputMode to 'ai' or cleared activeTerminalTabId, so MainPanel kept rendering the terminal view. Added the missing state transitions to match handleSelectFileTab behavior.
# Conflicts: # docs/releases.md # src/__tests__/renderer/components/SessionList.test.tsx # src/renderer/components/AboutModal.tsx # src/renderer/components/AppModals.tsx # src/renderer/components/SessionList/SessionList.tsx
…n xterm Cmd+K was hijacked in terminal mode to clear the xterm buffer instead of opening Quick Actions. Now Cmd+K universally opens the command palette; clear terminal moves to Cmd+Shift+K. The Escape key handler manually wrote \x1b to the PTY and blocked xterm on keydown, but allowed xterm to process keyup — this inconsistency corrupted xterm.js v6 internal key state, breaking all input in interactive apps (vim, vi, nano). Escape is now handled by xterm normally through its standard onData pipeline.
Update test to expect Cmd+K opens command palette in terminal mode. Add test for Cmd+Shift+K clearing the xterm buffer in terminal mode.
When xterm.js's hidden textarea loses focus (e.g., during vim's alternate screen buffer initialization), keyboard events bubble to the window handler instead of being captured by xterm. This adds a fallback that detects this condition (key events reaching window handler while in terminal mode), re-focuses the terminal textarea, and forwards the missed keystroke directly to the PTY. Covers regular characters, Enter, Backspace, Escape, Tab, and Ctrl+A-Z control sequences.
…e vanishing
Problem 1 — Silent Cue enable failure (Linux):
CueEngine.start() caught better-sqlite3 DB init errors and returned
silently. The IPC call appeared to succeed, refresh() saw enabled=false,
and the toggle flipped back with zero feedback. Users on Linux where the
native binding was missing saw the toggle just snap back to "Disabled"
with no explanation.
Fix:
- src/main/cue/cue-engine.ts: change `return` → `throw error` in the
DB init catch block. Keeps existing Sentry capture and logging, but
now propagates to the IPC layer so the renderer gets a rejected promise.
- src/renderer/components/CueModal/CueModal.tsx: add catch block in
handleToggle that calls notifyToast with the error message. Users now
see exactly why enabling failed (e.g. "Could not locate the bindings
file").
Problem 2 — Pipeline nodes vanish during drag (Linux):
onNodesChange called setPipelineState on every mousemove during drag.
Each update triggered a full convertToReactFlowNodes recomputation via
useMemo, creating a tight render loop. On Linux with slower compositing,
this caused nodes to flicker or disappear entirely.
Fix:
- src/renderer/components/CuePipelineEditor/CuePipelineEditor.tsx:
buffer drag position updates in a ref and flush once per animation
frame via requestAnimationFrame. Non-drag position changes (drop,
programmatic moves) still commit immediately. Cleanup cancels any
pending frame on unmount.
Tests updated:
- src/__tests__/main/cue/cue-engine.test.ts: 5 tests that called
engine.start() expecting silent failure now use expect().toThrow()
- src/__tests__/main/cue/cue-sleep-wake.test.ts: 1 test updated
from .not.toThrow() to .toThrow('DB init failed')
Affected surfaces:
- Cue enable/disable toggle in CueModal (all platforms)
- Pipeline canvas drag-and-drop (primarily Linux, no regression on macOS)
- IPC handler cue:enable now returns rejected promise on DB failure
- No changes to stats-db, build pipeline, or other features
Add `app.startup` as the 8th Cue event type, firing once per application launch to run initialization workflows (workspace setup, dep installs, health checks). System startup semantics: - Fires only on app launch (isSystemBoot=true), not when toggling Cue on/off - Deduplicates across YAML hot-reloads via startupFiredKeys Set - Keys persist across engine stop/start cycles (feature toggling) - Resets on session removal + next app restart - Full interop with fan-out, filters, output_prompt, chaining Pipeline numbering fix: - createPipeline now derives next number from highest existing pipeline name instead of array length, preventing duplicate names after deletion - Remove unused agentCmd variable in agentStore (lint warning) 22 files changed, 19 new startup tests, 5 yaml validation tests, 1 pipeline numbering test. 23,883 tests passing.
Adds `/// <reference types="@testing-library/jest-dom/vitest" />` to resolve TS errors for toBeInTheDocument, toHaveStyle, toHaveAttribute matchers that were missing type augmentation.
Merge latest upstream/rc (39fd85d) with web UX parity feature branch. Resolved import conflict in App.tsx and fixed unused variable warnings introduced by the merge across 7 files. Upstream changes include: TabBar decomposition, CueModal/CueYamlEditor refactoring, BMAD integration, rich file explorer icons, terminal fixes, and various Cue pipeline improvements. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…H loading Show file tree immediately without waiting for directorySize stats to resolve. Stats now update asynchronously after tree is already rendered. For SSH sessions, fire a shallow load (depth=1, single round-trip) first to render root-level structure instantly while the full recursive walk continues in background.
Engine: - Replace persistent isSystemBoot with scoped isBootScan that is set true only during the start() session scan and cleared immediately after, preventing later refreshSession/auto-discovery from firing app.startup subs - DB init failure now returns gracefully instead of throwing, so the Electron main process is never blocked at startup - Wrap cueEngine.start(true) in try-catch at index.ts boot site UI: - CueModal toggle error toast is now context-aware (enable vs disable) - CueHelpModal startup quick-reference example includes prompt field - CuePipelineEditor cancels pending RAF and merges drag buffer before applying non-drag position updates to prevent stale flush Docs: - Fix inconsistent event count in configuration validation section - Clarify prompt_file as alternative to prompt in events doc
…57-mm82lf08 feat: wire feedback modal and IPC wiring
- mergePipelinesWithSavedLayout now restores saved color and name from the layout file when pipeline IDs match, preventing colors/names from being re-derived by parse order on every reload - Add fitView effect on selectedPipelineId change so switching from All Pipelines to a single pipeline (or vice versa) auto-centers the viewport on the visible nodes instead of leaving it at the stacked Y-offset position
…port Add hasHydratedSelectionRef guard so the fitView effect skips the initial selectedPipelineId change from layout restoration, preventing it from overwriting the saved viewport restored by usePipelineLayout. Subsequent user-initiated pipeline switches still trigger fitView.
feat(cue): app.startup trigger, pipeline numbering fix, DB error surfacing
Remove the redundant stats collection toggle from the encore panel. Enabling the Usage & Stats feature now implicitly enables stats collection; disabling it turns collection off. The only remaining configuration is the default lookback window dropdown.
FilePreview.tsx (2,607 lines) → 10-file directory module: - FilePreview.tsx (1,309) — shell: state, effects, keyboard, content routing - FilePreviewHeader.tsx (412) — header row, stats bar, back/forward nav popups - useFilePreviewSearch.ts (422) — search state, 3 highlight effects (code DOM marks, markdown CSS Highlight API, edit textarea), match navigation - filePreviewUtils.ts (220) — 9 pure functions + image cache singleton - MarkdownImage.tsx (200) — memo'd image loader with cache + SSH support - FilePreviewToc.tsx (172) — floating TOC button + overlay - types.ts (85) — FilePreviewProps, FilePreviewHandle, FileStats, TocEntry - remarkHighlight.ts (54) — ==highlight== remark plugin Also regenerated src/generated/prompts.ts (was stale — missing feedbackPrompt export that caused pre-existing npm run lint failure). 45 new filePreviewUtils tests. Existing FilePreview.test.tsx (69 tests) passes unchanged via barrel import resolution.
Seven independent review findings across the four prior commits, all verified against current code before fixing. Inline: - cue-completion-chains.test: the "produces empty sourceOutput when completionData is omitted" regression test was leaking engine state by never calling engine.stop(), and only checked sourceOutput without also pinning outputTruncated. Both fixed. - session-parser: stop stripping "-recovery" in the UUID branch. Production never combines UUID suffix with -recovery (recovery sessions are always minted with timestamp suffix in group-chat-router.respawnParticipantWithRecovery), so the strip was dead code that would silently truncate a legitimate participant name ending in "-recovery". The timestamp branch still handles recovery correctly. Test fixture updated to assert the corrected behavior. - index.css: --scrollbar-track was injected by useThemeStyles but never consumed (track was hardcoded to transparent in three places). Wired it through *::-webkit-scrollbar-track, *::-webkit-scrollbar-corner, the .scrollbar-thin track, and the Firefox scrollbar-color fallback, with a `transparent` default so initial paint is preserved. Outside diff: - GeneralTab: the sync-settings load .catch() only console.error'd. Now also reports to Sentry via captureException with a context tag per the project's error-handling policy in CLAUDE.md. - useThemeStyles handleScroll: e.target was force-cast to Element, which would crash on Document/Window scroll events. Added an `instanceof Element` guard before classList access. Nits: - cue-fan-in-tracker: timeout logs (continue + break modes) referenced raw sources.length instead of the deduped resolvedSourceIds.size. With duplicate references in YAML this would print misleading "1/2 completed" when fan-in is actually waiting for 0 more. Hoisted totalSources once and used it in both log strings. - exit-listener: the group-chat containment guard returned silently; added a logger.warn so production drops surface in logs with sessionId + exitCode context. Validated: - npm run lint (3x tsc) clean - npm run lint:eslint clean - 204 tests across the 8 impacted suites pass
GC_ID_2 (6ba7b810-9dad-11d1-80b4-00c04fd430c8) is the RFC 4122 namespace UUID — a v1, not v4. The regex in constants.ts accepts the canonical 8-4-4-4-12 hex shape regardless of version, so the test still works correctly, but the comment was inaccurate. Updated to "Real UUIDs" and documented that the regex is version-agnostic. No fixture or behavior changes.
…teEventListeners hook
Move 15 useEventListener('maestro:...') CustomEvent handlers (494 lines)
from App.tsx into a dedicated hook at hooks/remote/useAppRemoteEventListeners.ts.
Reduces App.tsx from ~3,934 to 3,450 lines. No behavior changes.
Replace removed updateSessionWith with setSessions pattern and add explicit type annotations to fix implicit any errors.
…ines of inline modal rendering Replace 18 inline standalone modal renderings in App.tsx with the AppStandaloneModals component. The component self-sources modal open/close state from stores, so App.tsx only passes handler callbacks. Fixed 7 type mismatches in props interface and replaced broken updateSessionWith import. App.tsx reduced from 3,470 to 3,137 lines (-333 lines).
cue-hardening: leak fix, panel layout, themed scrollbars + GeneralTab cleanup
…onSwitchCallbacks hook Move 5 session navigation callbacks and the deep link effect from App.tsx into a new useSessionSwitchCallbacks hook (229 lines). Extracts handleProcessMonitorNavigateToSession, handleToastSessionClick, handleNamedSessionSelect, handleUtilityTabSelect, handleUtilityFileTabSelect, and the maestro:// deep link useEffect. App.tsx reduced from 3,137 to 3,038 lines (-99 lines). Zero new lint errors or test failures.
…ests Task 8 final verification: 19 pre-existing lint errors (zero new), 24,537 tests passed (42 pre-existing failures, 107 pending). All 6 extracted hooks and 2 modal components verified in App.tsx.
…al input) The "Terminal Mode" input send behavior setting was unreachable — InputArea doesn't render when inputMode is 'terminal' since xterm.js handles all terminal input directly. Removed from settings UI, store, metadata, web server, mobile, and all related tests.
…ments - Replace direct tab search button with SearchPopover offering tab search and message history search - Add search functionality to FileExplorerPanel and HistoryPanel with filter inputs - Separate path display from action buttons in FileExplorerPanel - Make buttons uniform across panels with text labels that collapse to icons - Simplify AIOverviewTab by removing inline agent overview generation - Fix backgroundSecondary type error in NudgeMessageField - Update TabBar tests for new search popover behavior
…sition Remove orphaned stats/wakatime state and imports from GeneralTab after sections moved to dedicated tabs. Fix backgroundSecondary → bgSidebar theme property. Remove unused AITab/ToolType imports and stale modal setter destructuring from App.tsx. Add updateSessionWith/updateAiTab helpers to sessionStore for hooks extracted during decomposition. Clean up auto-scroll, TerminalOutput, and test files.
Focus ring tests updated for boxShadow-based implementation (was Tailwind
ring classes). DirectorNotes tests updated for correct loading text
("Generating" not "Starting") and tab enabled/disabled state behavior.
…hook modules Remove dead audioFeedback/TTS code block and unused useSettingsStore import from useAgentListeners (already removed upstream, missed in rebase). Add useActiveSession and useFocusAfterRender hooks referenced by AppStandaloneModals and App.tsx decomposition.
# Conflicts: # src/prompts/maestro-system-prompt.md
Add source-level and behavioral regression tests to useAgentListeners preventing stale TTS/audioFeedback code from being reintroduced. Add unit tests for useActiveSession and useFocusAfterRender hooks.
The badge was using totalFileCount from fileTreeStats which includes all files (binaries, etc.), but the search list only contains previewable files. Removed the totalFileCount prop from the entire component chain.
Adds findNextUnreadSession utility, keyboard shortcut, QuickActionsModal entry, and tests for cycling through agents with unread tabs.
Tabs now always display an ID marker from creation by using tab.id (a UUID assigned at creation) as fallback when agentSessionId is not yet available. Consolidated four duplicate getTabDisplayName implementations into a single canonical function in tabHelpers.ts. Also relaxed the rename hotkey gate to work without agentSessionId.
ctx.setSessions was called in 11 places in useMainKeyboardHandler.ts but was never included in the keyboardHandlerRef.current context object, causing a TypeError on Cmd+T and other session-mutating shortcuts.
…anup - Show "New Session" instead of tab UUID marker when no agent session ID exists yet, matching user expectation for pre-first-message state - Add Search button to Auto Run editor bar and make all three buttons (Expand, Search, Edit/Preview) flex-grow to fill horizontal space - Replace toast notifications with success flash for "no unread tabs" - Remove orphaned JSDoc comments in MergeSessionModal, SendToAgentModal, and TabSwitcherModal - Update tests to reflect new "New Session" fallback behavior
…ni CLI buildAgentArgs skips batchModeArgs in readOnly mode, which dropped flags needed for non-interactive execution (tab naming, context grooming). Codex's --dangerously-bypass-approvals-and-sandbox and --skip-git-repo-check, and Gemini CLI's -y, are now included in readOnlyArgs so headless subprocesses don't hang waiting for approval.
Position search bar between content and button bar instead of above content, keeping it visually adjacent to the editor area.
- Added terminal icon mock to keep TabBar tests rock-solid ✅ - Enabled “Move to First/Last” actions for terminal tabs reordering 🧭 - Fixed terminal tab overlay staying open during button interactions 🛡️ - Model picker now treats manual clearing as a real committed value 🧹 - Introduced a one-click “Clear” button for selected agent model 🎛️ - Added full test coverage for model clear and blur commit flow 🧪
- Add ExternalLink icon import and session ID badge in RightPanel progress display - Resolve live agent session ID from batch state, busy tab, or active tab - Capture live agent session ID during Auto Run via onSessionId IPC handler (previously skipped for batch sessions entirely) - Add currentAgentSessionId field to BatchRunState type - Opened session tab gets (snapshot) title suffix to indicate point-in-time view - Pass sessionName through onOpenSessionAsTab via useRightPanelProps wrapper Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Important Review skippedToo many files! This PR contains 281 files, which is 131 over the limit of 150. ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (19)
📒 Files selected for processing (281)
You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Author
|
Wrong branch 😱 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
I have a feature proposal for the people like me that need to see something sometimes, it adds the live session id to the auto run status box, but since everything is a snapshot and not updated live it opens the session with (snapshot) but you can see the last message when something is slow or you're just curious.