* refactor: add canonical turn projection pipeline for chat
Centralizes turn/activity/summary derivation, migrates render consumers to shared projection sources, and adds projector regression coverage for retries, malformed parent fallbacks, and activity segmentation.
* refactor: stream assistant text live in turn-first render path
* refactor: complete phase-3 turn timeline history/navigation
* refactor: complete phase-4 turn pipeline cutover
Remove legacy grouping adapters and lock key edge cases with executable regression tests so turn-centric rendering stays stable across retry/history/navigation flows.
* fix: align chat history loading path with opencode parity
* fix: stabilize chat streaming and reduce render churn
* feat: add blurIn streaming text animation and smooth lerp-based auto-scroll
Streaming markdown now uses Streamdown blurIn animation (150ms, ease-out) for per-word reveal
Auto-scroll during streaming uses continuous exponential smoothing (lerp) instead of restarting spring animations
One-shot scroll-to-bottom (button click) uses motion spring for natural deceleration
* fix: respect user scroll-up during streaming and re-pin on scroll back to bottom
* fix: stabilize activity stream and tool progress rendering
Activity now stays chronologically consistent and avoids duplicate reasoning/justification.
Tool rows show running state and duration earlier with smoother pending behavior.
Removed legacy trim/timestamp paths to prevent message drops and simplify Activity UI.
* fix: reverted regression of revert functionality
* fix: stabilize chat activity layout and tool progress behavior
Stopped user messages from re-animating when new user messages appear.
Made Activity and aggregated tool rows wrap inline consistently without misaligned headers/icons.
Fixed tool part matching so duration and shine no longer reset across pending/in-progress status updates.
* fix: restore activity mode behavior and stabilize tool rendering
Re-enabled Collapsed/Summary/Detailed/Changes defaults for Activity and tool expansion.
Fixed tool row wrapping/alignment, removed user fade re-animations, and disabled FadeInOnReveal animations.
Improved tool status handling to reduce timer/shine resets and made reasoning bold render as normal text.
* refactor: simplify chat tool and message rendering
Replace activity-group rendering with flat inline part rendering
Remove obsolete tool output and justification activity settings
Keep user message animation and improve edit/apply-patch file path headers
* style: narrow chat and composer columns equally
* fix: Tool status checks and abort flow regression
* fix: improve multi-file apply patch header rendering
* fix: make timeline message jump scroll to selected chat entry
Conversation Timeline clicks now reliably scroll to the selected message in chat
Timeline dialog waits for navigation result before closing to avoid silent failures
Chat message scrolling now resolves the active chat scroller consistently
* chore: remove branch-added chat tests and clean lint leftovers
Removes newly added chat and message test files from this branch
Fixes lint blockers in ProgressiveGroup, ToolPart, and messageStore
Keeps type-check, lint, and build passing after cleanup
* fix: keep composer status row closest to the input
Status/todo row now renders below queued messages and attachments.
Linked GitHub issue/PR chips stay above status so input context order is consistent.
Improves chat composer readability while assistant is working.
* fix: disable assistant header animations and polish chat status behavior
Assistant message header now renders without transition effects
Removed a lint issue from the working placeholder props
Chat status and message flow updates improve consistency during active turns
* feat: increase bottom spacer in mobile chat for better scrolling
* feat: add sorted chat mode with progressive activity rendering
Adds global chat render mode settings for sorted and live behavior
Renders non-stop assistant output in Activity as messages complete
Disables streaming text animation in sorted mode and restores classic reasoning/justification blocks
* fix: stabilize chat timeline navigation and older history loading
Prevents auto-loading older history from scroll and keeps loading behind the button
Fixes timeline jump-to-message behavior that snapped back to the bottom
Reduces chat list flicker and empty-state glitches on large session pagination
* fix: stabilize sorted activity text and hide reasoning timers
Prevented sorted justification from appearing before message completion by requiring explicit non-stop finish.
Removed duration values for sorted Thinking and Justification blocks.
Kept smooth sorted auto-follow behavior tuned to reduce bottom-jump jitter.
* refactor: simplify chat tool rendering paths and add parts docs
Centralized tool icon mapping into a shared presentation helper used by grouped and expandable rows.
Removed static-tool-specific branches from ToolPart to keep it focused on expandable tools.
Added a new DOCUMENTATION.md explaining where to change tool descriptions and rendering behavior.
* feat: enhance event stream handling for message parts
- Refactor event key building functions to improve clarity and reduce redundancy.
- Introduce `applyPartDelta` method in message store for handling delta updates to message parts.
- Update `useEventStream` to utilize the new `applyPartDelta` method for processing incoming deltas.
- Enhance text extraction logic to accommodate new part types and improve merging behavior.
- Implement logic to skip delta-driven updates for ongoing text/reasoning parts to prevent overwriting.
- Adjust server-side text merging logic to handle trimmed text comparisons and improve consistency.
* feat: enhance OpencodeService with delta handling and stale delta management
- Introduced globalSseStaleDeltas to track stale deltas.
- Added methods to generate keys for delta and updated part events.
- Updated global SSE loop to skip processing stale deltas.
- Refactored global SSE event handling to improve performance and reliability.
refactor: remove unused streaming part handling in messageStore
- Eliminated streaming part queue and associated logic.
- Simplified message merging logic by removing redundant checks.
- Streamlined message handling to improve clarity and maintainability.
chore: clean up unused streaming text normalization functions
- Removed deprecated functions related to streaming text identity and merging.
- Simplified normalizeStreamingTextPayload to focus on current functionality.
* refactor: simplify streaming event passthrough
Use SDK-native global event streaming in the UI client
Remove dead server-side SSE normalization helpers
Keep streaming payloads closer to upstream behavior
* revert: remove message memory settings UI
Drop the restored message memory settings screen
Keep session settings focused on current defaults
Preserve chat history limits as internal behavior
* feat: add compact collapsed Activity preview in sorted mode
Collapsed Activity now shows a live preview of the latest 7 entries
Older activity rows roll up behind a +N more indicator
The +N more indicator is clickable to expand the full Activity
* fix: adjusted activity changed files text prominence
* fix: make sorted mode snap to bottom when not streaming
* perf: show chat scrollbar only on user-driven scrolling
Chat scrollbar now stays hidden during automatic follow-to-bottom
Scrollbar visibility is gated by real user scroll intent
Reduced scroll overhead by removing timer-based intent tracking
* refactor: align web and vscode session activity streaming
Route VS Code SSE through SDK-based proxy flow
Restore controlled web session activity tracking and cooldowns
Keep chat activity behavior consistent across runtimes
* fix: adjusted muted foreground themes color
* fix: stabilize session activity and attention updates
Keep streamed chat state in sync as sessions complete
Restore reliable attention indicators for inactive sessions
Tighten server and UI event handling for chat updates
* feat: add chat render previews and file icon visibility setting
Added animated chat render mode previews in Chat settings.
Added a new toggle to show or hide file icons across tool rows.
Persisted chat render, activity, and mermaid modes to shared settings file.
* fix: update default GitHub OAuth client ID
Use the new OpenChamber org GitHub OAuth app ID by default.
Keep web server and VS Code auth defaults in sync.
* fix: sync chat settings across VS Code chat views
Broadcast settings changes to both sidebar and editor chat webviews.
Apply synced settings in each webview via shared settings refresh.
Ensures chat render mode updates appear immediately in editor tabs.
* fix: stop writing session folders file in VS Code workspaces
Disable disk persistence for session folders in VS Code webview runtime
Keep session folder state in VS Code/webview storage instead of project files
Preserve existing behavior for non-VS Code runtimes
* style: polish expanded tool panels and bash output readability
Removed extra borders/labels in expanded tool cards for a cleaner UI
Added softer scroll shadows and full-height decorative activity line
Switched bash command/output to code-style typography with tighter spacing
* feat: add default-open tool controls for chat activity
Added Chat settings toggles to open Bash and Edit tools by default
Default-open behavior now applies across both sorted and live activity rendering
Users can still manually collapse default-open tools, plus bash output height was reduced
* fix: align chat loading skeleton with message layout
Match skeleton width and horizontal alignment to chat message column
Add one-line tool-style skeleton rows with subtle circular placeholders
Increase top spacing so loading state no longer touches chat header
* fix: prevent blank screen when adding inline diff comments
Sanitize persisted inline comment drafts to ignore invalid data
Harden diff annotations against malformed line numbers
Fail safely when annotation updates error instead of crashing the view
* fix: streamline VS Code archived sessions sidebar
Show archived sessions in VS Code only for the active workspace directory.
Render archived sessions as a flat list in VS Code without project-root subfolders.
Hide the "Open in Side Panel" session action in VS Code.
* fix(plan-comments): restore embedded inline comment widgets in Plan view
Reinstate CodeMirror block-widget comments so plan annotations stay anchored to selected lines and preserve drag/selection behavior without floating overlays.
* fix(file-comments): return Files editor comments to embedded widgets
Use inline block widgets for file drafts while keeping full-path draft scoping, so similarly named files no longer risk comment collisions.
* fix(diff-comments): render inline comments through annotation portals
Replace absolute floating positioning with annotation-target portals to keep diff comments attached to their lines across shadow DOM updates.
* chore(comments): remove deprecated floating comment hook
Drop the unused floating-comment implementation now that plan, file, and diff views all use embedded comment rendering paths.
* fix(codemirror): expose gutter width as CSS variable
Measure the current CodeMirror gutter and publish --oc-editor-gutter-width on the editor host so inline widgets can size to the visible code area without hardcoded dimensions.
* fix(context-panel): publish panel width for embedded widgets
Set --oc-context-panel-width on the context panel in both docked and expanded modes so comment widgets can follow the active panel width dynamically.
* fix(file-comments): constrain inline input to editor content width
Use context-panel and editor-gutter CSS variables to cap comment input width to the visible editor content area, keeping action buttons fully visible in no-wrap mode.
* fix(file-comments): constrain inline comment cards to content area
Apply the same variable-based width cap to saved comment cards so card actions stay visible when long lines force horizontal scrolling.
* fix(diff-comments): stabilize new comment annotation identity
Derive new-comment annotation ids from selection side and line range, and reuse that id for portal target lookup and keys to avoid remount glitches.
* feat: tabbed right sidebar, context panel, floating diff comments
* fix: auto-close left sidebar when context panel opens
- Increase default context panel width from 520 to 600 pixels
- Increase sidebar minimum width from 200 to 300 pixels
- Replace collapsible component with custom button in diff view
* refactoring: rework sidebars, tabs, and file tree layout
- Rewrite AnimatedTabs as segment-style with sliding indicator
- Upgrade SidebarFilesTree to match FilesView features (context menus,
git status, file icons, CRUD dialogs, fuzzy search ranking)
- Restructure FilesView header: tabs row + actions row, remove breadcrumbs
- Show relative path in context panel header, track active tab
- Allow left sidebar to stay open alongside context panel
- Hide diff/files tabs from header on desktop (mobile-only)
- Move chevron after group name in session sidebar
- Compact tab heights in right sidebar and git view
- Size PreviewToggleButton to match other action buttons
- Remove directory loading spinner from folder icons
* feat: add project icon and color customization
- Enable users to assign custom icons to projects
- Allow users to choose accent colors for projects
- Stabilize repo status UI during project switching
* feat: add scroll fade indicators to editor tabs
* style: reduce spacing and icon sizes in header
* style: adjust tab component padding from uniform to vertical-horizontal
* feat: Add session state indicators to project tabs
* feat: Enhance session status handling and improve UI responsiveness
* fix: preserve upstream tracking on branch rename
* fix: improve initial remote selection for pull requests
- Uses saved remote name from previous session when available
- Selects remote based on tracking branch when possible
- Falls back to origin or first available remote
* perf(diff): faster highlight, stable stacked scroll
- split/unified Pierre worker pools; prefer shiki-wasm
- align diff CSS line-height; disable scroll anchoring; drop WebKit compositing hacks
- harden stacked pin/align (cancel on user scroll/input); prevent overscroll
- make overlay scrollbar MutationObserver optional; disable for diff container
* feat: handle binary files in diff view
* fix: adjust project tabs layout and drag regions
* style: update drag overlay visual styling
* feat: enable number keys to switch projects in the sidebar
* fix: recognize octet-stream as text-based MIME type
* feat: add keyboard navigation to context panel
* feat: add session pinning to sidebar
- Pin important sessions to keep them at the top
- Pinned sessions persist across browser sessions
* refactor: move context usage display from chat input to header
* perf: implement virtualized rendering for diff viewer
- Enables efficient rendering of large diffs by only rendering visible content
- Uses shared virtualizer cache to optimize memory across multiple diff viewers
- Configures virtual scrolling with 24px line height for consistent layout
* fix: improve diff viewer line selection and annotation rendering
* fix: normalize line ranges to prevent selection bugs
* chore: upgrade @opencode-ai/sdk to v1.1.65
* fix: remove comment toast notifications
Remove success toasts after updating a comment
Remove success toasts after saving a comment draft
Keep saving logic and line reset intact without toast feedback
* fix(ui): remove success toast on draft save
Remove success toast after saving a draft
Suppress toast when updating an existing draft
* fix(planview): suppress toast on save and reset state
Remove toast notification after saving or updating a draft
Clear comment input and line selection after commit
Preserve draft save/update logic without triggering toast
* fix(FilesView): use file path for drafts labeling
Use file path for draft labels instead of file name for precise grouping
Filter and associate drafts by file path to ensure correct per-file draft retrieval
Improve handling of files with identical names across directories
* fix(PierreDiffViewer): use fileName as label for drafts
Use fileName as the draft label when editing or adding diffs
Fallback to 'unknown' if fileName is missing for draft labels
Align draft filtering to the provided fileName rather than basename
* refactor(ui): remove unused fileLabel computation
* feat: export inline comment components
Expose InlineCommentCard and InlineCommentInput from the comments index
Enable importing both components from a single module path
* feat: add InlineCommentCard for inline comments with collapse
Enable collapsing for long comments with Show more and Show less
Provide dropdown menu with edit and delete actions
Show file label and line range in the header
* feat: add InlineCommentInput component
Add InlineCommentInput component for per-line comments
Enable Cmd/Ctrl+Enter to save and Escape to cancel
Show file label and line range when provided and focus input on mount
* feat: render block widgets in CodeMirrorEditor
Add blockWidgets prop to configure widgets after lines
Render React portals into per-widget containers within the editor
Introduce BlockWidget and DOM container mapping to host widgets
* feat(PierreDiffViewer): enable inline comment drafting and theming
Add inline comment draft management for diff lines
Render InlineCommentInput and InlineCommentCard for comments in diff
Integrate theme system to support dark and light modes
* feat: improve inline comment editing in PlanView
Enable auto-scroll for mobile when editing inline comments
Cancel edits when clicking outside comment widgets or code gutter
Extend save handler to accept explicit range and guard against empty text
* feat(pierre-diff-viewer): enable mobile tap-to-extend selection
Extend selection on mobile when tapping the same side to include range
Show saved annotation cards on all devices
* fix(plan): show saved cards on all devices
Render saved cards on all devices
Ensure saved cards appear for mobile layouts as well
* refactor: simplify state usage and remove focus hacks
Remove pending focus state and related effects in PlanView and PierreDiffViewer
Initialize UI store usage via useUIStore() without destructuring values in PlanView and PierreDiffViewer
Align annotation handling to DiffLineAnnotation metadata and include side in lineRange for inline comments
* feat: add view ready and destroy callbacks to CodeMirrorEditor
Provide onViewReady callback that receives the EditorView once created
Provide onViewDestroy callback invoked when the editor is destroyed
* feat: render inline drafts in PlanView with portal
Add editorView state to track the active CodeMirror instance
Render inline drafts through a portal anchored to the editor scroll container
Position drafts relative to the corresponding start line in the editor
* feat(PierreDiffViewer): enable editing inline diff drafts
Enable editing of existing inline diff drafts with draftID handling
Auto-focus comment input when opening editor and place cursor at end
* feat: enable editing inline drafts and auto focus
Enable editing of existing inline drafts via new editingDraftId state and updateDraft
Auto focus the comment input and place cursor at end when a line is selected
Add edit action button in the inline actions bar to start editing
* feat: add updateDraft to inline comment drafts store
Add updateDraft action to modify a specific draft by session and id
Merge updates into the target draft without altering other fields
Retains existing draft management actions like remove and clear
* feat(chat): support inline comment drafts in chat input
Add per-session inline comment draft tracking
Append inline drafts to outgoing messages when queuing
Consume drafts after sending to clear state
* feat: add actions menu to PierreDiffViewer
Add a dropdown actions menu in the diff viewer with More and Delete options
Enable inline comment drafting support and selection synchronization to prevent loops
Replace previous action icon with contextual actions in the header
* feat(plan): enable inline comment drafting in PlanView
Add inline comment draft support with addDraft, removeDraft and drafts state
Compute session key for drafts based on currentSessionId and draft state
Prepare dropdown and toast utilities for draft actions in PlanView
* feat: add inline comment formatting utilities
Introduce formatInlineCommentDraft to render inline comments for diff and plan views
Add appendInlineComments to attach comments to existing messages with proper separation
Provide hasInlineComments to detect inline comment blocks in text
* feat: add inline comment draft store
Persist drafts per session key for inline comments
Add, remove, and clear drafts with unique IDs per session
Consume drafts to move them out of store after submission
- stop button replaces send button in footer instead of overlay
- floating queue button above stop when input has content
- buttons same size, stop icon larger for emphasis
- Compute default expanded count for stacked view to reduce DOM load
- Move diff processing to worker pool to improve UI responsiveness
- Add content cache key to avoid recomputing large diffs on render
* feat: added themes system
* feat: smart sidebar auto-hide for files/diff tabs + lower files sidebar threshold
* feat: added Checkbox component and update theming
- Add reusable Checkbox component for toggles across UI
- Replace several inputs with Checkbox in settings and commands panels
- Add DiffIcon and apply surface/border theming to key UI areas
* feat: Add convert-vscode-theme.cjs to convert VS Code themes to OpenChamber format
* refactor: remove unused permission logic from ChatInput
- Remove unused permission rules parsing logic from ChatInput
- Memoize renderTheme in DiffWorkerProvider to avoid unnecessary recalculations
- Remove forceOpaque helper in vscode theme adapter
* fix: guard VSCode theme loading in MarkdownRenderer
* feat: add custom user themes loading and reload
- Load user themes from ~/.config/openchamber/themes at runtime
- Expose /api/config/themes to fetch custom themes
- Allow theme reloading from Settings → Theme → Reload themes in the UI
Replace nested ScrollableOverlay with simple div in inline diff to fix vertical scroll blocking in Chrome. Add explicit h-full to stacked view flex container and disableHorizontal to main ScrollableOverlay for proper scroll behavior.
Add file management API and UI components
Implement directory listing, search and CRUD operations in desktop backend
Expose new Files API on frontend to list, search, and modify files
When diff content exceeds 1500 lines or 150KB, show a placeholder with
"Load Diff" button instead of parsing immediately. This prevents the page
from freezing when viewing large diffs.
Co-authored-by: Jovines <jovines@qq.com>
* feat: add Files tab for browsing workspace files
- Add Files tab between Diff and Terminal in header
- Implement hierarchical file tree with expand/collapse
- Add fuzzy search with debouncing and relevance ranking
- Support gitignore filtering via `git check-ignore` (web + desktop)
- Add syntax highlighting for 150+ file types
- Add image preview (SVG, PNG, JPG, etc.)
- Add line numbers, wrap toggle, and copy button
- Desktop: split-pane layout matching DiffView
- Mobile: drill-in navigation with full-width sidebar
- Update help dialog with Cmd+3 shortcut
- Increase header breakpoint to 940px for new tab
* feat: enhance context and session stores to track agent/model/variant choices for historical sessions
* feat: implement line selection and commenting functionality in FilesView