Skip to content

Split view, chat organization, chat folders, UI overhaul & refactor#41

Merged
OpenSource03 merged 13 commits intomasterfrom
feat/split-view-chat-organization-ui-overhaul
Apr 5, 2026
Merged

Split view, chat organization, chat folders, UI overhaul & refactor#41
OpenSource03 merged 13 commits intomasterfrom
feat/split-view-chat-organization-ui-overhaul

Conversation

@OpenSource03
Copy link
Copy Markdown
Owner

@OpenSource03 OpenSource03 commented Mar 23, 2026

Summary

WIP — This PR is a work in progress. Not ready for review yet.

Massive feature + refactoring branch spanning 13 commits, 352 changed files, +31,515 / −12,655 lines. Introduces a split view system, chat organization, tool docking islands, worktree management, ACP authentication, and a full codebase restructuring pass.


Split View System

  • Up to 4 concurrent chat panes side by side, opened via sidebar context menu or drag-to-split
  • Each pane hosts its own engine triple (Claude/ACP/Codex) via useSessionPane with independent tool drawers, scroll state, and permission handling
  • Independent per-pane controls for model, effort, permissions, plan mode, and agent switching (not read-only mirrors)
  • Each pane resolves its own project path, git panel, and permission/plan-mode state
  • Background event routing updated to skip sessions actively rendered in split panes

Chat Organization

  • Folders, pinning, and branch-grouped sidebar sections with drag-and-drop session management
  • Folder CRUD via IPC, fix for empty folders missing in branch-grouped sidebar

Tool Docking Islands

  • Replaced per-pane tool drawers with a full island-based docking system
  • Tool panels dock as independent islands in the top row (stacked vertically in resizable columns) or bottom row
  • Draggable between positions, remembered across open/close cycles
  • Narrow ToolPicker strip (48/44px) with visual side/bottom separation
  • New components: PanelDockControls, PanelDockPreview, SplitPaneToolStrip
  • Main workspace now uses the same tool island system as split view
  • Centralized workspace-constraints module enforcing minimum widths for chat panes and tool panels (replaces ad-hoc per-site clamping)

Worktree Bar & Inline Space Creation

  • WorktreeBar above the composer with branch chips for switching between worktrees, inline create/remove, and .harnss/worktree.json setup automation
  • Replaced modal SpaceCreator dialog with an inline sidebar draft flow and SpaceCustomizer popover for editing existing spaces

ACP Authentication & Per-Session Settings

  • Full ACP auth protocol (initialize → authenticate → newSession) with auth dialog UI, auth-required error detection, and Cursor-specific guidance
  • Per-session effort, permissionMode, and model are now persisted and restored on session switch
  • Model resolution with family-based fallback
  • ACP protocol calls wrapped with timeouts
  • Platform-aware agent store download links

Tool Icons & ANSI Rendering

  • ToolGlyph component with per-tool colored icons and colored/monochrome appearance setting
  • Full ANSI SGR escape sequence parser rendering colored terminal output in bash tool results

Mac Background Effects & Cross-Platform Polish

  • Switchable liquid glass / vibrancy / off with runtime capability detection and graceful fallback
  • Transparency toggle now independent of native material
  • Sync Electron nativeTheme with app theme for Windows Mica
  • Light-mode glass sidebar text overrides for macOS

Chat UI Polish

  • Assistant turn dividers with "Worked for Xm Ys" duration labels between agent turns based on message timestamps
  • Diff stats (+/− line count badges) on Edit/Write tool cards extracted from unified diffs and structured patches
  • TodoPanel redesign with progress bar
  • Git panel streamlining with custom InlineSelector replacing ShadCN Select
  • Browser per-tab color scheme control and DevTools state tracking
  • Extracted shared chat layout constants, softer flat-layout dividers

Unified Engine Picker

  • Merged model/config/effort dropdowns into single dropdown alongside agent switching
  • Extracted toChatSession() and buildPersistedSession() session record helpers to eliminate inline duplication

Pre-Release Version Banner

  • GitHub Releases API-based pre-release detection in the main process
  • Sidebar banner prompting users to switch to stable via settings

Terminal Resize Fix

  • scheduleTerminalResize helper that deduplicates and debounces resize calls to the PTY backend, preventing resize storms during panel drags
  • Skips no-op resizes, returns cols/rows from snapshot for correct initial dimensions, subscribes to PTY events before awaiting snapshot to avoid missed data

Codebase Restructuring

AppLayout Decomposition

Extracted ~2,350 lines from AppLayout into 5 new components (SplitChatPane, MainTopToolArea, MainBottomToolDock, RightPanel, ToolIslandContent) and 10 new hooks (useGlassTheme, usePaneController, useToolIslandContext, useMainToolWorkspace, useMainToolPaneResize, useBottomHeightResize, useToolColumnResize, useSpaceSwitchCooldown, useJiraBoard, useToolDragDrop). Added shared types (pane-controller, tool-islands) and utility modules (tool-island-utils, workspace-drag).

Massive Component & Hook Decomposition

128 new files added, 64 deleted, ~150 modified. Net: −16,233 lines from monolithic files, redistributed into focused modules.

Components decomposed:

  • InputBar (1,900 → 10-line re-export shim) → src/components/input-bar/ (11 files): orchestrator, AttachmentPreview, CommandPicker, ContextGauge, EngineControls, EnginePickerDropdown, MentionPicker, constants, utils with in-source tests
  • BrowserPanel (1,010 → ~350 lines) → src/components/browser/ (6 files): BrowserNavBar, BrowserStartPage, BrowserUrlBar (shared, eliminates duplicated URL input), WebviewInstance, typed ElectronWebviewElement interface, utils
  • JiraBoardPanel (1,098 → ~300 lines) → src/components/jira/ (3 files) + useJiraBoardData hook (530 lines)
  • McpPanel (612 → ~200 lines) → src/components/mcp/ (4 files): AddServerDialog, McpAuthStatus, McpServerRow, utils
  • AppLayout further: SplitTopRowItem, SplitBottomToolIsland, AgentContext, ThemeProvider, grouped sidebar props
  • AppSidebar: SidebarActionsContext (eliminates prop drilling), pre-grouped sessions by projectId (O(n) vs O(n*m)), event-driven settings.onChanged replacing 5s polling
  • ChatView: 6 display prefs + 2 grouping props → Zustand store selectors, agent props → useAgentContext()
  • SettingsView / WelcomeWizard: ~45 individual props removed → Zustand store direct reads
  • CodexAuthDialog: rewritten with AuthDialogShell, proper event-driven auth replacing setTimeout(500)

Hooks decomposed:

  • useAppOrchestrator (1,130 → ~400 lines) → src/hooks/app-layout/ (6 files): useAppContextualPanels, useAppEnvironmentState, useAppLayoutUIState, useAppSessionActions, useAppSpaceWorkflow, session-utils
  • useSessionLifecycle (1,586 → ~400 lines) → src/hooks/session/ (4 new files): useSessionCache (LRU payload cache with idle-time prefetch), useSessionCrud, useSessionRestart, useSessionSettings
  • 8 new standalone hooks: useBrowserWebviewEvents, useClickOutside, useContextMenuPosition, useFolderManager, useGlassOrchestrator, useInlineRename, useKeyboardShortcuts, useSettingsCompat

Library Reorganization

Flat src/lib/ → 10 domain subdirectories. All 44 old flat files deleted; all imports across ~150 files rewired.

Domain Files Contents
background/ 8 BackgroundSessionStore, per-engine handlers, BackgroundAgentStore
chat/ 7 annotation-types, assistant-turn-divider, scroll, thinking-animation, todo-utils, turn-changes, virtualization
diff/ 3 diff-stats, patch-utils, unified-diff
engine/ 10 acp-adapter, acp-agent-registry, acp-agent-updates, acp-task-adapter, acp-utils, codex-adapter, permission-queue, protocol, streaming-buffer
layout/ 3 constants, split-layout, split-view-state
session/ 3 derived-data, records, space-projects
sidebar/ 2 dnd, grouping
workspace/ 6 drag, main-tool-widths, tool-docking, tool-groups, tool-island-utils
analytics/ 2 analytics, posthog
git/ 1 discover-repos-cache

Zustand Settings Store

New src/stores/settings-store.ts (667 lines) replaces 777-line useSettings hook. Per-project settings keyed by projectId with stable frozen DEFAULT_PROJECT_SETTINGS. Legacy localStorage migration on first boot. Components subscribe to individual slices — changing theme only re-renders theme consumers. useSettingsCompat bridge preserves the old API for gradual migration.

Shared Types Extraction

  • shared/types/git.tsGitFileStatus, GitFileChange, GitBranch, GitRepoInfo, GitStatus, GitLogEntry
  • shared/types/settings.tsAppSettings, NotificationSettings, ThemeOption, MacBackgroundEffect, PreferredEditor, VoiceDictationMode, CodexBinarySource, ClaudeBinarySource (eliminates 4× MacBackgroundEffect and 3× ThemeOption duplications)
  • shared/types/registry.tsInstalledAgent, BinaryCheckResult (moved from electron)
  • src/types/ split into 9 domain files: agents, attachments, engine-hook, mcp, permissions, search, session, spaces, tools
  • src/types/window.d.tsIpcResult type alias replacing ~40 inline signatures; Jira IPC returns use | { error: string } unions

Electron Changes

  • jira.ts: ~400 lines of fetch handlers → 1-line delegates to new jira-client.ts; returns { error } unions instead of throwing
  • json-file-store.ts: generic JsonFileStore<T> with optional safeStorage encryption; jira/mcp OAuth and data stores rewritten to use it (~70 → ~30 lines each)
  • settings.ts: pushes settings:changed events to renderer (replaces 5s polling)
  • claude-sessions.ts / acp-sessions.ts: McpServerInput and buildSdkMcpConfig imported from shared; added stopAll() for graceful shutdown
  • main.ts: window-all-closed cleanup uses stopAll()

Dead Code Removed

GitPanel.tsx (2-line shim, 0 consumers), PaneToolDrawer.tsx, PaneToolTabBar.tsx, useResolvedThemeClass.ts, useTheme.ts (rewritten as ThemeProvider), events.ts, deprecated tool-island type aliases


New Dependencies

  • zustand@^5.0.12 — settings store
  • dompurify@^3.3.3 + @types/dompurify — HTML sanitization

Tests Added

New: acp-auth, codex-plan-mode-sync, agent-store-utils, assistant-turn-divider, split-layout, split-view-state, workspace-constraints, settings store, space-project resolution. Existing tests updated for new import paths.

Test plan

  • Verify split view: drag session from sidebar, drop between panes, resize handles, close pane, dismiss all
  • Verify independent pane controls: model, effort, permissions, plan mode, agent switching per pane
  • Verify folders: create, rename, delete, move sessions between folders, pin folders
  • Verify tool docking islands: dock/undock panels, drag between top/bottom rows, resize columns, persistence across open/close
  • Verify workspace constraints: minimum widths respected during resize for both chat panes and tool panels
  • Verify worktree bar: branch chips, inline create/remove, .harnss/worktree.json automation
  • Verify ACP authentication: auth dialog, auth-required detection, Cursor guidance, protocol timeouts
  • Verify per-session settings: effort/permissionMode/model persist across session switches
  • Verify mac background effects: switch between liquid glass, vibrancy, off in settings
  • Verify tool icons: toggle show/hide, colored vs monochrome in appearance settings
  • Verify ANSI rendering in bash tool output with colored CLI tools
  • Verify turn dividers appear between multi-step agent turns with correct duration
  • Verify diff stats badges on Edit/Write tool cards
  • Verify browser per-tab color scheme and DevTools state
  • Verify engine picker dropdown works for model/agent switching
  • Verify sidebar grouping by branch, pinned section, session context menus
  • Verify inline space creation flow and SpaceCustomizer popover
  • Verify pre-release banner appears for pre-release versions with link to settings
  • Verify terminal resize is smooth during panel drags (no storms)
  • Verify Zustand settings store: theme changes only re-render theme consumers, localStorage migration works
  • Cross-platform: macOS (glass/vibrancy), Windows (Mica), Linux

OpenSource03 and others added 5 commits March 21, 2026 03:31
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…rm polish

Merge model/config/effort dropdowns into a single engine picker
dropdown alongside agent switching. Extract toChatSession() and
buildPersistedSession() helpers to eliminate inline duplication.

Fix empty folders missing in branch-grouped sidebar, sync Electron
nativeTheme with app theme for Windows Mica, and add light-mode
glass sidebar text overrides for macOS.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ol drawers

Add multi-pane split view system allowing up to 4 concurrent chat
sessions side by side. Sessions can be opened in split view via
sidebar context menu or by dragging from sidebar onto the chat area.

Each pane hosts its own engine triple (Claude/ACP/Codex) via the
new useSessionPane hook, with independent tool drawers, scroll
state, and permission handling. Background event routing is updated
to skip sessions that are actively rendered in split panes.

Also adds release skill for automated version bumping and GitHub
release creation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… polish

Add tool glyph system with per-tool icons and colored/monochrome modes,
ANSI SGR color rendering for bash output, switchable mac background
effects (liquid glass / vibrancy / off), assistant turn duration
dividers, diff stats on edit/write tool cards, browser per-tab color
scheme, TodoPanel redesign with progress bar, Git panel streamlining,
and extracted shared chat layout constants. Expand appearance settings
with tool icon, background effect, and edit expansion options.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 23, 2026

Important

Review skipped

Too many files!

This PR contains 299 files, which is 149 over the limit of 150.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 4697811f-b53f-45ad-8d3a-03b8431eb908

📥 Commits

Reviewing files that changed from the base of the PR and between 8bc05ac and c778176.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (299)
  • .agents/skills/release/SKILL.md
  • .agents/skills/release/references/release-notes-template.md
  • .claude/agents/clean-code-refactor.md
  • .claude/agents/refactor-analyst.md
  • .claude/agents/refactor-validator.md
  • .harnss/worktree.json
  • CLAUDE.md
  • electron/src/ipc/acp-sessions.ts
  • electron/src/ipc/agent-registry.ts
  • electron/src/ipc/claude-sessions.ts
  • electron/src/ipc/files.ts
  • electron/src/ipc/folders.ts
  • electron/src/ipc/git.ts
  • electron/src/ipc/jira.ts
  • electron/src/ipc/projects.ts
  • electron/src/ipc/sessions.ts
  • electron/src/ipc/settings.ts
  • electron/src/ipc/spaces.ts
  • electron/src/ipc/terminal.ts
  • electron/src/lib/__tests__/acp-auth.test.ts
  • electron/src/lib/__tests__/chat-scroll.test.ts
  • electron/src/lib/__tests__/layout-constants.test.ts
  • electron/src/lib/__tests__/session-derived-data.test.ts
  • electron/src/lib/acp-auth.ts
  • electron/src/lib/agent-registry.ts
  • electron/src/lib/app-settings.ts
  • electron/src/lib/data-dir.ts
  • electron/src/lib/jira-client.ts
  • electron/src/lib/jira-oauth-store.ts
  • electron/src/lib/jira-store.ts
  • electron/src/lib/json-file-store.ts
  • electron/src/lib/mcp-oauth-store.ts
  • electron/src/lib/mcp-store.ts
  • electron/src/lib/prerelease-check.ts
  • electron/src/main.ts
  • electron/src/preload.ts
  • package.json
  • shared/lib/mcp-config.ts
  • shared/lib/session-persistence.ts
  • shared/types/acp.ts
  • shared/types/engine.ts
  • shared/types/git.ts
  • shared/types/registry.ts
  • shared/types/settings.ts
  • src/App.tsx
  • src/components/ACPAuthDialog.tsx
  • src/components/AgentContext.tsx
  • src/components/AgentTranscriptViewer.tsx
  • src/components/AppLayout.tsx
  • src/components/AppSidebar.tsx
  • src/components/AuthDialogShell.tsx
  • src/components/BackgroundAgentsPanel.tsx
  • src/components/BottomComposer.test.tsx
  • src/components/BottomComposer.tsx
  • src/components/BrowserPanel.tsx
  • src/components/ChatHeader.tsx
  • src/components/ChatView.tsx
  • src/components/CodexAuthDialog.tsx
  • src/components/DiffViewer.tsx
  • src/components/ErrorBoundary.tsx
  • src/components/FilePreviewOverlay.tsx
  • src/components/FilesPanel.tsx
  • src/components/GitPanel.tsx
  • src/components/ImageAnnotationEditor.tsx
  • src/components/ImageAnnotationToolbar.tsx
  • src/components/ImageLightbox.tsx
  • src/components/InputBar.test.ts
  • src/components/InputBar.tsx
  • src/components/JiraBoardPanel.tsx
  • src/components/JiraIssuePreviewOverlay.tsx
  • src/components/McpPanel.tsx
  • src/components/McpToolContent.tsx
  • src/components/MermaidDiagram.test.tsx
  • src/components/MermaidDiagram.tsx
  • src/components/MessageBubble.tsx
  • src/components/PanelDockControls.tsx
  • src/components/PanelDockPreview.tsx
  • src/components/PanelHeader.tsx
  • src/components/PermissionPrompt.tsx
  • src/components/PreReleaseBanner.tsx
  • src/components/ProjectFilesPanel.tsx
  • src/components/SettingsView.tsx
  • src/components/SidebarSearch.tsx
  • src/components/SpaceBar.tsx
  • src/components/SpaceCreator.tsx
  • src/components/SpaceCustomizer.tsx
  • src/components/SummaryBlock.tsx
  • src/components/TabBar.tsx
  • src/components/ThinkingBlock.tsx
  • src/components/TodoPanel.tsx
  • src/components/ToolCall.tsx
  • src/components/ToolGroupBlock.tsx
  • src/components/ToolPicker.tsx
  • src/components/ToolsPanel.tsx
  • src/components/TurnChangesSummary.tsx
  • src/components/UpdateBanner.tsx
  • src/components/WelcomeScreen.tsx
  • src/components/WorktreeBar.tsx
  • src/components/browser/BrowserNavBar.tsx
  • src/components/browser/BrowserStartPage.tsx
  • src/components/browser/BrowserUrlBar.tsx
  • src/components/browser/WebviewInstance.tsx
  • src/components/browser/browser-types.ts
  • src/components/browser/browser-utils.ts
  • src/components/git/BranchPicker.tsx
  • src/components/git/ChangesSection.tsx
  • src/components/git/CommitInput.tsx
  • src/components/git/FileItem.tsx
  • src/components/git/GitPanel.tsx
  • src/components/git/InlineSelector.tsx
  • src/components/git/RepoSection.tsx
  • src/components/input-bar/AttachmentPreview.tsx
  • src/components/input-bar/CommandPicker.tsx
  • src/components/input-bar/ContextGauge.tsx
  • src/components/input-bar/EngineControls.tsx
  • src/components/input-bar/EnginePickerDropdown.tsx
  • src/components/input-bar/InputBar.tsx
  • src/components/input-bar/MentionPicker.tsx
  • src/components/input-bar/constants.ts
  • src/components/input-bar/index.ts
  • src/components/input-bar/input-bar-utils.ts
  • src/components/input-bar/useMentionAutocomplete.ts
  • src/components/jira/JiraBoardSetup.tsx
  • src/components/jira/JiraIssueCard.tsx
  • src/components/jira/KanbanBoard.tsx
  • src/components/lib/ToolGlyph.tsx
  • src/components/lib/chat-layout.ts
  • src/components/lib/tool-formatting.ts
  • src/components/lib/tool-metadata.ts
  • src/components/mcp-renderers/atlassian.tsx
  • src/components/mcp-renderers/confluence.tsx
  • src/components/mcp-renderers/context7.tsx
  • src/components/mcp-renderers/jira.tsx
  • src/components/mcp-renderers/shared.tsx
  • src/components/mcp/AddServerDialog.tsx
  • src/components/mcp/McpAuthStatus.tsx
  • src/components/mcp/McpServerRow.tsx
  • src/components/mcp/mcp-utils.ts
  • src/components/settings/AboutSettings.tsx
  • src/components/settings/AdvancedSettings.tsx
  • src/components/settings/AgentStore.tsx
  • src/components/settings/AnalyticsSettings.tsx
  • src/components/settings/AppearanceSettings.tsx
  • src/components/settings/EngineSettings.tsx
  • src/components/settings/GeneralSettings.tsx
  • src/components/settings/NotificationsSettings.tsx
  • src/components/settings/shared.tsx
  • src/components/sidebar/BranchSection.tsx
  • src/components/sidebar/CCSessionList.tsx
  • src/components/sidebar/FolderSection.tsx
  • src/components/sidebar/PinnedSection.tsx
  • src/components/sidebar/ProjectSection.tsx
  • src/components/sidebar/SessionItem.tsx
  • src/components/sidebar/SidebarActionsContext.tsx
  • src/components/sidebar/index.ts
  • src/components/split/SplitBottomToolIsland.tsx
  • src/components/split/SplitChatPane.tsx
  • src/components/split/SplitDropZone.tsx
  • src/components/split/SplitHandle.tsx
  • src/components/split/SplitPaneHost.tsx
  • src/components/split/SplitPaneToolStrip.tsx
  • src/components/split/SplitTopRowItem.tsx
  • src/components/tool-renderers/BashContent.tsx
  • src/components/tool-renderers/EditContent.tsx
  • src/components/tool-renderers/TaskTool.tsx
  • src/components/tool-renderers/TodoWriteContent.tsx
  • src/components/tool-renderers/WriteContent.tsx
  • src/components/ui/button.tsx
  • src/components/ui/dialog.tsx
  • src/components/ui/dropdown-menu.tsx
  • src/components/ui/popover.tsx
  • src/components/ui/select.tsx
  • src/components/ui/slider.tsx
  • src/components/ui/switch.tsx
  • src/components/ui/tabs.tsx
  • src/components/ui/tooltip.tsx
  • src/components/welcome/AppearanceStep.tsx
  • src/components/welcome/ReadyStep.tsx
  • src/components/welcome/WelcomeWizard.tsx
  • src/components/welcome/shared.ts
  • src/components/workspace/MainBottomToolDock.tsx
  • src/components/workspace/MainTopToolArea.tsx
  • src/components/workspace/RightPanel.tsx
  • src/components/workspace/ToolIslandContent.tsx
  • src/hooks/app-layout/session-utils.ts
  • src/hooks/app-layout/useAppContextualPanels.ts
  • src/hooks/app-layout/useAppEnvironmentState.ts
  • src/hooks/app-layout/useAppLayoutUIState.ts
  • src/hooks/app-layout/useAppSessionActions.ts
  • src/hooks/app-layout/useAppSpaceWorkflow.ts
  • src/hooks/codex-plan-mode-sync.test.ts
  • src/hooks/session/index.ts
  • src/hooks/session/types.ts
  • src/hooks/session/useDraftMaterialization.ts
  • src/hooks/session/useExtraPaneLoader.ts
  • src/hooks/session/useMessageQueue.ts
  • src/hooks/session/useSessionCache.ts
  • src/hooks/session/useSessionCrud.ts
  • src/hooks/session/useSessionLifecycle.ts
  • src/hooks/session/useSessionPane.ts
  • src/hooks/session/useSessionPersistence.ts
  • src/hooks/session/useSessionRestart.ts
  • src/hooks/session/useSessionRevival.ts
  • src/hooks/session/useSessionSettings.ts
  • src/hooks/useACP.ts
  • src/hooks/useAcpAgentAutoUpdate.ts
  • src/hooks/useAgentStore.ts
  • src/hooks/useAnnotationHistory.ts
  • src/hooks/useAppOrchestrator.ts
  • src/hooks/useBackgroundAgents.ts
  • src/hooks/useBottomHeightResize.ts
  • src/hooks/useBrowserWebviewEvents.ts
  • src/hooks/useClaude.ts
  • src/hooks/useClickOutside.ts
  • src/hooks/useCodex.ts
  • src/hooks/useContextMenuPosition.ts
  • src/hooks/useEngineBase.ts
  • src/hooks/useFolderManager.ts
  • src/hooks/useGitStatus.ts
  • src/hooks/useGlassOrchestrator.ts
  • src/hooks/useGlassTheme.ts
  • src/hooks/useInlineRename.ts
  • src/hooks/useJiraBoard.ts
  • src/hooks/useJiraBoardData.ts
  • src/hooks/useJiraConfig.ts
  • src/hooks/useKeyboardShortcuts.ts
  • src/hooks/useMainToolAreaLayout.ts
  • src/hooks/useMainToolAreaResize.ts
  • src/hooks/useMainToolPaneResize.ts
  • src/hooks/useMainToolWorkspace.ts
  • src/hooks/useNotifications.ts
  • src/hooks/usePaneController.ts
  • src/hooks/usePaneResize.ts
  • src/hooks/usePanelResize.ts
  • src/hooks/useProjectFiles.ts
  • src/hooks/useResolvedThemeClass.ts
  • src/hooks/useSessionManager.ts
  • src/hooks/useSettings.ts
  • src/hooks/useSettingsCompat.ts
  • src/hooks/useSpaceManager.ts
  • src/hooks/useSpaceSwitchCooldown.ts
  • src/hooks/useSpaceTheme.ts
  • src/hooks/useSpeechRecognition.ts
  • src/hooks/useSplitDragDrop.ts
  • src/hooks/useSplitView.ts
  • src/hooks/useTheme.tsx
  • src/hooks/useToolColumnResize.ts
  • src/hooks/useToolDragDrop.ts
  • src/hooks/useToolIslandContext.ts
  • src/hooks/useToolIslands.ts
  • src/hooks/useWorktreeChips.ts
  • src/index.css
  • src/lib/analytics/analytics.ts
  • src/lib/analytics/posthog.ts
  • src/lib/ansi.tsx
  • src/lib/background/acp-handler.ts
  • src/lib/background/agent-store-utils.test.ts
  • src/lib/background/agent-store-utils.ts
  • src/lib/background/agent-store.ts
  • src/lib/background/claude-handler.ts
  • src/lib/background/codex-handler.ts
  • src/lib/background/codex-web-search.test.ts
  • src/lib/background/context-usage.test.ts
  • src/lib/background/session-store.ts
  • src/lib/chat/annotation-types.ts
  • src/lib/chat/assistant-turn-divider.test.ts
  • src/lib/chat/assistant-turn-divider.ts
  • src/lib/chat/scroll.ts
  • src/lib/chat/thinking-animation.test.ts
  • src/lib/chat/thinking-animation.ts
  • src/lib/chat/todo-utils.ts
  • src/lib/chat/turn-changes.ts
  • src/lib/chat/virtualization.ts
  • src/lib/clipboard.ts
  • src/lib/diff/diff-stats.ts
  • src/lib/diff/patch-utils.test.ts
  • src/lib/diff/patch-utils.ts
  • src/lib/diff/unified-diff.ts
  • src/lib/engine/acp-adapter.ts
  • src/lib/engine/acp-agent-registry.ts
  • src/lib/engine/acp-agent-updates.test.ts
  • src/lib/engine/acp-agent-updates.ts
  • src/lib/engine/acp-task-adapter.ts
  • src/lib/engine/acp-utils.ts
  • src/lib/engine/codex-adapter.ts
  • src/lib/engine/permission-queue.test.ts
  • src/lib/engine/permission-queue.ts
  • src/lib/engine/protocol.ts
  • src/lib/engine/streaming-buffer.test.ts
  • src/lib/engine/streaming-buffer.ts
  • src/lib/events.ts
  • src/lib/file-access.ts
  • src/lib/git/discover-repos-cache.ts
  • src/lib/jira-utils.ts
  • src/lib/layout-constants.ts
  • src/lib/layout/constants.ts
  • src/lib/layout/split-layout.test.ts
  • src/lib/layout/split-layout.ts
  • src/lib/layout/split-view-state.test.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/split-view-chat-organization-ui-overhaul

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@OpenSource03 OpenSource03 linked an issue Mar 23, 2026 that may be closed by this pull request
1 task
OpenSource03 and others added 2 commits March 26, 2026 00:22
… controls

Add a WorktreeBar above the composer that shows branch chips for
switching between worktrees, with inline create/remove and
.harnss/worktree.json setup automation.  Replace the modal
SpaceCreator dialog with an inline sidebar draft flow and a
SpaceCustomizer popover for editing existing spaces.

Split view panes now send, stop, and control engine settings
independently — each pane resolves its own project path, git panel,
and permission/plan-mode state.

Also: simplified macOS background effect handling (transparency toggle
is now independent of native material), fixed chat scroll bottom
padding via ResizeObserver on the composer, stopped fabricating a
200k context window when the real value is unknown, added softer
flat-layout dividers, and extracted welcome-screen logic into
testable modules.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…endent split pane controls

Implement the ACP auth protocol (initialize → authenticate → newSession)
with an auth dialog UI, auth-required error detection, and Cursor-specific
guidance. Per-session effort, permissionMode, and model are now persisted
and restored on session switch. Split panes get their own independent
controls for model, effort, permissions, plan mode, and agent switching
instead of being read-only mirrors. Also improves model resolution with
family-based fallback, adds platform-aware agent store download links,
and wraps ACP protocol calls with timeouts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
OpenSource03 and others added 6 commits April 4, 2026 04:56
…gement

Replace per-pane tool drawers with a full island-based docking system.
Tool panels can now be docked as independent islands in the top row
(stacked vertically in resizable columns) or bottom row, dragged between
positions, and remembered across open/close cycles. Narrow ToolPicker
strip (48/44px) with visual side/bottom separation. Add PanelDockControls,
PanelDockPreview, and SplitPaneToolStrip components. BrowserPanel gains
per-persistKey session persistence across instances.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Extract ~2,350 lines from AppLayout into 5 new components
(SplitChatPane, MainTopToolArea, MainBottomToolDock, RightPanel,
ToolIslandContent) and 10 new hooks (useGlassTheme, usePaneController,
useToolIslandContext, useMainToolWorkspace, useMainToolPaneResize,
useBottomHeightResize, useToolColumnResize, useSpaceSwitchCooldown,
useJiraBoard, useToolDragDrop). Add shared types (pane-controller,
tool-islands) and utility modules (tool-island-utils, workspace-drag).
Main workspace now uses the same tool island system as split view,
replacing the old side-column/bottom-row tool placement. Add
clean-code-refactor and refactor-analyst agent definitions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…reorganize lib into domains, add Zustand settings store

Complete refactoring pass that decomposes god components and hooks into
focused sub-modules, reorganizes the flat src/lib/ directory into domain
subdirectories, introduces a Zustand settings store, extracts shared
types to canonical locations, and rewires all imports across the codebase.

128 new files added, 64 old files deleted, ~150 existing files modified.
Net result: -16,233 lines from monolithic files, code redistributed into
focused, independently testable modules.

== Component decompositions ==

InputBar (1,900 → 10-line re-export shim):
  → src/components/input-bar/ (11 files): InputBar orchestrator,
    AttachmentPreview, CommandPicker + useCommandAutocomplete hook,
    ContextGauge (SVG ring + tooltip), EngineControls (per-engine
    plan/permission UI), EnginePickerDropdown (model/effort/agent/ACP
    config), MentionPicker + useMentionAutocomplete hook, constants,
    input-bar-utils with in-source vitest tests, barrel index

BrowserPanel (1,010 → ~350 lines):
  → src/components/browser/ (6 files): BrowserNavBar, BrowserStartPage,
    BrowserUrlBar (shared between start page and nav bar — eliminates
    duplicated URL input), WebviewInstance, browser-types (typed
    ElectronWebviewElement interface replacing inline casts),
    browser-utils (URL resolution, history persistence, tab reordering)

JiraBoardPanel (1,098 → ~300 lines):
  → src/components/jira/ (3 files): JiraBoardSetup wizard,
    JiraIssueCard with React.memo, KanbanBoard with column
    sub-component and drag-and-drop
  → src/hooks/useJiraBoardData (530 lines): all data fetching,
    column building from board config or inference, sort, drag-drop
    transition execution

McpPanel (612 → ~200 lines):
  → src/components/mcp/ (4 files): AddServerDialog, McpAuthStatus
    (4-state auth with shared AuthenticateButton/ReconnectButton),
    McpServerRow, mcp-utils (transport/status display config,
    parseKeyValuePairs)

AppLayout (2,316 → ~1,000 lines):
  renderSplitTopRowItem (352-line useCallback) → SplitTopRowItem
    component with module-level helpers for island rendering, stack
    entry building, and column wrapper layout
  renderSplitBottomToolIsland (113-line useCallback) →
    SplitBottomToolIsland component
  Inline tool drag state → useToolDragDrop hook
  Layout computation → useMainToolAreaLayout hook
  Resize handlers → useMainToolAreaResize hook
  Agent props → AgentContext (React context)
  Theme props → ThemeProvider (React context)
  Sidebar props restructured into grouped sub-objects

AppSidebar:
  Session callbacks → SidebarActionsContext (eliminates prop drilling)
  Sessions pre-grouped by projectId in a Map (O(n) vs O(n*m))
  Settings polling (5s setInterval) → event-driven settings.onChanged

ChatView:
  6 display prefs + 2 grouping props → Zustand store selectors
  Agent props → useAgentContext()
  Manual ref-based structural caching → primitive structKey string

SettingsView: ~30 individual setting props → Zustand store direct reads
WelcomeWizard: ~15 props removed → Zustand store + AgentContext
CodexAuthDialog: rewritten with AuthDialogShell, proper event-driven
  auth (waitForLoginCompletion) replacing setTimeout(500)
ACPAuthDialog: now uses AuthDialogShell shared component

== Hook decompositions ==

useAppOrchestrator (1,130 → ~400 lines):
  → src/hooks/app-layout/ (6 files):
    useAppContextualPanels — todo/agent panel auto-show
    useAppEnvironmentState — glass, notifications, dev settings
    useAppLayoutUIState — window focus, welcome, grabbed elements
    useAppSessionActions — send, model change, agent change, new chat
    useAppSpaceWorkflow — space CRUD, switching with session restore
    session-utils — buildSessionOptions, getSyncedPlanMode

useSessionLifecycle (1,586 → ~400 lines):
  → src/hooks/session/ (4 new files):
    useSessionCache — LRU payload cache with idle-time prefetch
    useSessionCrud — create/switch/delete/rename/deselect/import
    useSessionRestart — ACP restart with session/load fallback,
      worktree restart across all 3 engines, full revert with SDK fork
    useSessionSettings — all setActive*/setSession* mutations

New standalone hooks:
  useBrowserWebviewEvents, useClickOutside, useContextMenuPosition,
  useFolderManager, useGlassOrchestrator, useInlineRename,
  useKeyboardShortcuts, useSettingsCompat (compat bridge for
  Zustand ↔ legacy useSettings API)

== Library reorganization (src/lib/ flat → domain subdirectories) ==

src/lib/background/ (8 files): BackgroundSessionStore, per-engine
  handlers (claude, acp, codex), BackgroundAgentStore, agent-store-utils
src/lib/chat/ (7 files): annotation-types, assistant-turn-divider,
  scroll, thinking-animation, todo-utils, turn-changes, virtualization
src/lib/diff/ (3 files): diff-stats, patch-utils, unified-diff
src/lib/engine/ (10 files): acp-adapter, acp-agent-registry,
  acp-agent-updates, acp-task-adapter, acp-utils, codex-adapter,
  permission-queue, protocol, streaming-buffer
src/lib/layout/ (3 files): constants, split-layout, split-view-state
src/lib/session/ (3 files): derived-data, records, space-projects
src/lib/sidebar/ (2 files): dnd, grouping
src/lib/workspace/ (6 files): drag, main-tool-widths, tool-docking,
  tool-groups, tool-island-utils
src/lib/analytics/ (2 files): analytics, posthog
src/lib/git/ (1 file): discover-repos-cache

All 44 old flat src/lib/ files deleted; all imports across ~150 files
rewired to new paths.

== Zustand settings store ==

src/stores/settings-store.ts (667 lines): replaces 777-line useSettings
hook. Per-project settings keyed by projectId with stable frozen
DEFAULT_PROJECT_SETTINGS reference (prevents infinite re-render from
Zustand selector reference changes). Legacy localStorage migration runs
once on first boot. Components subscribe to individual slices — changing
theme only re-renders theme consumers, not the entire app.

useSettingsCompat bridge preserves the old useSettings() API shape for
files not yet migrated to direct Zustand selectors.

== Shared types extraction ==

shared/types/git.ts — GitFileStatus, GitFileChange, GitBranch,
  GitRepoInfo, GitStatus, GitLogEntry
shared/types/settings.ts — AppSettings, NotificationSettings,
  ThemeOption, MacBackgroundEffect, PreferredEditor, VoiceDictationMode,
  CodexBinarySource, ClaudeBinarySource (eliminates 4x MacBackgroundEffect
  and 3x ThemeOption duplications across electron/renderer)
shared/types/registry.ts — InstalledAgent, BinaryCheckResult (moved
  from electron/src/lib/agent-registry.ts)

src/types/ domain split (9 new files): agents, attachments,
  engine-hook (React-dependent, moved from shared/), mcp, permissions
  (added codexRpcId field), search, session (ClaudeEffort as union
  type), spaces, tools (ToolId, PanelToolId)
src/types/ui.ts gutted to pure re-exports
src/types/index.ts reorganized into categorized re-export blocks
src/types/window.d.ts — IpcResult type alias replacing ~40 inline
  signatures; Jira IPC returns now use | { error: string } unions

== Electron changes ==

jira.ts: ~400 lines of fetch handlers → 1-line delegates to new
  jira-client.ts; returns { error } unions instead of throwing
json-file-store.ts: generic JsonFileStore<T> with optional safeStorage
  encryption; jira-oauth-store, jira-store, mcp-oauth-store, mcp-store
  all rewritten to use it (each ~70 lines → ~30 lines)
settings.ts: pushes settings:changed events to renderer (replaces
  5-second polling in AppSidebar)
claude-sessions.ts / acp-sessions.ts: McpServerInput and
  buildSdkMcpConfig imported from shared instead of duplicated;
  added stopAll() exports for graceful shutdown
main.ts: cleanup in window-all-closed uses stopAll() instead of
  inline session iteration
app-settings.ts: types moved to @shared/types/settings, re-exports kept

== Build/config changes ==

package.json: added zustand@^5.0.12, dompurify@^3.3.3, @types/dompurify
vite.config.ts: added @shared path alias
shared/lib/mcp-config.ts: added onWarn callback for diagnostic logging

== Dead code removed ==

src/components/GitPanel.tsx (2-line shim, 0 consumers)
src/components/split/PaneToolDrawer.tsx + PaneToolTabBar.tsx
src/hooks/useResolvedThemeClass.ts (replaced by useTheme.tsx)
src/hooks/useTheme.ts (deleted and rewritten with ThemeProvider)
src/lib/events.ts (constant moved to layout/constants.ts)
Deprecated type aliases in tool-islands.ts (MainToolIsland, etc.)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…zing

Add workspace-constraints module that enforces minimum widths for chat
panes and tool panels during resize operations. Refactor split-layout,
tool-island, and main-tool-area hooks to use centralized constraint
logic instead of ad-hoc per-site clamping. Expand main-tool-widths with
full test coverage for edge cases.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… IPC

Add scheduleTerminalResize helper that deduplicates and debounces
resize calls to the PTY backend, preventing resize storms during panel
drags. Skip no-op resizes in the main process, return cols/rows from
snapshot so xterm initializes at the correct dimensions, and subscribe
to PTY events before awaiting snapshot to avoid missed data.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…kflow refinements

Add GitHub Releases API-based pre-release detection in the main process
with a sidebar banner prompting users to switch to stable via settings.
Migrate organize-by-branch setting to the Zustand settings store and add
test coverage for the settings store and space-project resolution logic.
Refine space switching and remembered session handling across the
orchestrator hooks.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@OpenSource03 OpenSource03 marked this pull request as ready for review April 5, 2026 03:53
@OpenSource03 OpenSource03 changed the title Split view, chat organization & UI overhaul Split view, chat organization, UI overhaul & refactor Apr 5, 2026
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c7781764cb

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@OpenSource03 OpenSource03 merged commit 20069d9 into master Apr 5, 2026
1 check passed
@OpenSource03 OpenSource03 changed the title Split view, chat organization, UI overhaul & refactor Split view, chat organization, chat folders, UI overhaul & refactor Apr 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: More chat organizational features

1 participant