* refactor(quota): migrate server quota providers to modular registry architecture
* docs: add quota module documentation
Explain the quota module purpose and runtime signals.
List entrypoints, provider registry, and response shape.
Outline steps to add a new provider and testing commands.
* feat: add NanoGPT quota provider and usage fetch
Detect NanoGPT as a configured quota provider.
Expose daily and monthly usage windows with reset times.
Return configured and ok state based on API key presence.
* feat: fetch NanoGPT quota and detect config
Detect NanoGPT in configured providers from auth.
Fetch and expose daily and monthly usage windows for NanoGPT.
* feat: add NanoGPT quota provider option
* feat: add compact price display and capability slides in ModelControls
Show compact price text on desktop in ModelControls.
Render slides for price and capability icons in a rotating metadata section.
Rotate metadata only on non-VSCode runtimes.
* feat: prefer capabilities over price in static runtimes for ModelControls
Improve panel and search UI colors to match theme
Improve focus and hover states for search input and buttons
Highlight search matches with distinct info and selection styling
* 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
* refactor: adapt BlockWidget to use shared container map
Enable BlockWidget to reuse DOM containers via a shared map
Pass container map into widget decorations to preserve portals across updates
* feat: enable drag-to-select and guard new comments in FilesView
Guard new comment input from opening during drag-to-select actions
Enable drag-based line selection with initial drag state and mobile support
Reset dragging state on mouseup to end the selection
* fix(PlanView): gate new comment input during dragging
Add drag state to disable new comment input during selection drag
Indicate drag mode during mobile tap-extend to avoid unintended actions
Pass drag state to child UI to reflect ongoing drag
* feat: enable search panel in CodeMirrorEditor
Add enableSearch and searchOpen props to toggle search UI
Wire CodeMirror search extension and keybindings into the editor
Automatically open or close the search panel based on searchOpen
* feat(files): add breadcrumb navigation and inline comments
Add breadcrumb trail derived from file path and root to navigate directories
Introduce inline comment UI with draft storage for per-file discussions
Enable long-press gestures on items to reveal quick actions
* feat: add useLongPress hook for long-press gestures
Provide a reusable long-press hook with onLongPress and onTap callbacks.
Support pointer and touch events with movement threshold to cancel.
Optionally vibrate on long press for haptic feedback.
* feat: add expandedPaths state and expand actions for file tabs
Introduce expandedPaths per root to remember expanded folders
Add actions to toggle, expand a path, and expand multiple paths
Initialize expandedPaths for new roots and clamp state to valid roots
* feat: add onSearchOpenChange prop to CodeMirrorEditor
Expose onSearchOpenChange callback prop for search state
Notify parent when search panel visibility toggles
* chore: add PWA icons
Add PWA icons in public assets at 192px and 512px
Include maskable variants to improve home screen installation
* feat: update webmanifest icons for PWA
Add new PWA icons and maskable variants to the manifest
Include Apple touch icons and standard favicons for broader support
Migrate to maskable icons for better home screen availability
* feat: update PWA icons and manifest assets
Update web icons to include new PWA icons (192x192, 512x512) and maskable variants
Add Apple touch icons and standard favicons to manifest for better platform support
* fix(web): redirect manifest.webmanifest to site.webmanifest
Add 301 redirect for /manifest.webmanifest to /site.webmanifest
Ensure SPA fallback serves index.html for non-asset routes
* 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(ui): show per-model quota groups in header with collapsible families
Add per-model quota groups under each provider in the header
Introduce collapsible sections for model families to reveal models
Show all models when none are explicitly selected or respect explicit selections
* feat: add toggle to UsageCard for dropdown visibility
Introduce a switch in UsageCard to control inclusion in the dropdown
Hide the percent label when the toggle is visible
* feat(usage): enhance UsagePage with model grouping and collapsibles
Add model lists grouped by family for the selected provider
Enable collapsible sections per family to toggle visibility
Apply and persist default model selections on provider change
* feat(quota): add model family helpers
Add utilities to categorize models into families by provider
Enable grouping of models by family for header and usage pages
Define default models for Gemini 3.x and Claude families
* feat(desktop): extend settings with model grouping and selection
Track per-provider selected models for usage
Allow collapsing and expanding families in the usage page
Support per-provider custom model groups with labels and assignments
* feat: persist usage preferences in persistence
Persist usageSelectedModels per provider
Persist usageCollapsedFamilies and usageExpandedFamilies states
Support custom usageModelGroups with groups and assignments
* feat: track selected quota models and expanded families per provider
Initialize selectedModels and expandedFamilies state for quota providers
Add actions to set, toggle, and apply default model selections and expanded families
Persist selections to desktop settings and apply defaults on load
* feat(server): sanitize usage model configuration in settings update
Validate and sanitize usage selections per provider
Persist only valid usageCollapsedFamilies and usageExpandedFamilies in settings
Enforce limits on custom model groups and model assignments
* feat: add collapsible model families in header
Add collapsible sections for model families within each provider in the header
Show per-model usage with percent display and a progress bar
Toggle expansion via arrow icons and preserve expanded state per provider
* fix(ui): treat explicit per-provider model selections correctly in header
Enable showing all models by default when a provider has no explicit selection
Recognize an explicit per-provider selection when a provider key exists in selectedModels
Filter to selected models only if an explicit selection is present for the provider
* refactor(chat): adjust mobile controls layout
Improve alignment of mobile model and agent buttons with action buttons
Constrain mobile controls to a max width to prevent overflow on small screens
* fix: improve MobileAgentButton mobile interaction
Replace touch-none with touch-pan-x to enable horizontal swipe
Wrap the agent label in a scrollable container to prevent truncation
* fix(ui): allow horizontal scroll for model label
Enable horizontal scrolling for long model labels on mobile
Prevent truncation by letting the label overflow horizontally
Improve visibility by keeping the full label accessible without clipping
* 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
Enable horizontal scrolling for main navigation tabs in header
Prevent back button from shrinking on mobile by fixing flex behavior
Show badges and activity dots on tab buttons
* refactor(assets): rename logo svg files to include dimensions
* feat(assets): add 192x192 png versions of logos for PWA support
* fix(pwa): update static webmanifest with new logo paths and sizes
* fix(pwa): update dynamic manifest generation to use new 512px and 192px icons
* 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
* types: add optional context parameter to generatePullRequestDescription signature
* api: update gitApi to pass optional context to PR description generation
* http: include trimmed context in PR description API request body
* ui: add additional context input for PR generation with desktop disclosure and mobile sheet
* desktop: pass optional context to Tauri generate_pr_description command
* tauri: add optional context parameter and inject into PR description prompt
* server: read optional context from request and inject into PR description prompt
* vscode: update type signature for context parameter (compatibility only)
* fix(vscode): drop context from pr-description payload
Remove context field from PR description payload
Send only base and head to the bridge API for PR descriptions
Clarify payload compatibility across web/desktop environments
* feat(openchamber): persist usage auto-refresh settings
Enable a switch to toggle automatic usage refresh
Provide input to configure refresh interval in milliseconds
Persist changes to desktop settings and server API when changed
* feat: add UsageCard component
Add a new UsageCard component to display a usage window with title, optional subtitle, and a progress bar
Show current usage percentage and a reset time label for the window
Render a formatted window label and a compact subtitle for concise UI
* feat(usage): add UsagePage UI for quota usage
Add a dedicated UsagePage with provider-based usage details
Show last updated time and auto-refresh status
Handle empty, not configured, and error states with informative banners
* feat(usage): add UsageProgressBar component
Introduce a new UsageProgressBar component to visualize quota usage
Display a gradient fill that changes with critical, warn, or normal tones
Expose accessible progress attributes for screen readers
* feat(usage): add UsageSidebar component
Display quotas for all providers in a scrollable sidebar
Refresh quotas with a button and loading indicator
Colorize provider rows based on usage status and runtime context
* feat: add usage section to Settings
Add a new Usage item to the Settings sidebar for desktop and mobile
Render UsagePage when the Usage tab is selected in Settings
Wire up new UsageSidebar and UsagePage components under usage
* feat: add Usage section to sidebar
Add new Usage section in the sidebar for API quota monitoring.
Display a bar chart icon and description for the Usage item.
Monitor and display API quota usage across providers.
* feat(desktop): add usage auto-refresh settings
Enable automatic refresh for usage data with new settings
Store refresh interval in milliseconds for usage updates
* feat(persistence): support usageAutoRefresh and usageRefreshIntervalMs
Persist usageAutoRefresh in desktop settings
Persist usageRefreshIntervalMs in desktop settings
Validate types for new fields during sanitizeWebSettings
* feat(quota): export providers and utilities
Expose QUOTA_PROVIDERS and QUOTA_PROVIDER_MAP for consumers
Export QuotaProviderMeta type for user code
Make formatting and usage resolution utilities available from quota module
* feat(quota): define base quota provider interface
Define QuotaProvider interface with id, name, isConfigured, and fetchQuota
Expose ProviderResult type in fetchQuota contract
* feat: add quota providers index and map
Expose QUOTA_PROVIDERS with OpenAI, Google and z.ai
Provide QUOTA_PROVIDER_MAP for quick provider lookup by id
* feat: add quota utils for percent formatting and tone
Add clampPercent to sanitize and clamp numbers to 0-100
Add formatPercent to render '-' for null and 'x%' for values
Add resolveUsageTone to categorize percent as safe, warn, or critical
* feat: add useQuotaStore for quota data
Load usage settings from desktop, VSCode, or API at startup
Fetch quotas for all providers in parallel and update loading state
Expose lastUpdated timestamp and error state for UI feedback
* feat: export quota types from quota module
Expose quota-related types in UI type definitions
Allow downstream code to import QuotaProviderId and related types
Aggregate quota exports under the quota module in index
* feat: add quota types for usage providers
Add QuotaProviderId and UsageWindow shapes to model quota data
Add ProviderUsage, ProviderResult, and related usage mapping for providers
* feat: add quota provider endpoints API
List available quota providers via GET /api/quota/providers
Retrieve quota details for a specific provider with GET /api/quota/:providerId
Log errors and return 500 with error message on quota fetch failures
* feat: add quota providers discovery and formatting
Detect configured quota providers from auth and account files
Normalize auth entries to tokens or objects for API usage
Expose formatted reset times and remaining window metrics
* feat: persist usage settings in UsageSidebar and remove from defaults
Load usage settings on mount for the sidebar
Persist changes to auto-refresh and refresh interval to server
Remove usage settings state and effects from DefaultsSettings
* fix(usage): guard auto-select in UsagePage when results empty
Guard auto-select in UsagePage when results are empty
Prevent unexpected provider selection on initial render
* fix(quota): set error state during quota updates
Reset error to null when a new quota result is added
Set error to the error message on fetch failure or fallback
Keep error state alongside results in all update paths
* feat: track and prune open files in FilesView
Add openFiles state to manage currently opened file tabs
Prune open files when a file is renamed or deleted to keep in sync
Reset openFiles on refresh and clear file content when selection changes
* style: improve file dropdown layout and truncation
Adjust button layout to allow long file names to truncate correctly
Keep dropdown arrow visible while resizing by preventing shrink
* chore: upgrade @opencode-ai/sdk to 1.1.40
* chore(ui): bump @opencode-ai/sdk to 1.1.40
* feat(chat): add mobile controls drawer and panel switching
Add mobile-only controls drawer with open/close and panel switching
Introduce state and handlers for mobile controls and panels
Reset mobile UI state when switching to non-mobile or returning to unified controls
* feat: add mobile chat controls utilities
Add utilities to compute and display the selected agent and model names in mobile chat controls.
Add effort variant formatting, serialization, parsing, and ranking helpers for quick options.
Expose helpers to build quick effort option lists for the UI
* feat(ModelControls): allow external mobile panel control
Initialize mobile panel state from external props when provided
Fall back to internal mobile panel state when external control is absent
Notify parent on panel changes via onMobilePanelChange callback
* feat(chat): add StatusChip component
Add StatusChip button that displays agent, model, and effort
Show marquee animation when the label is truncated
Bind to config and session stores to reflect current context
* feat: add UnifiedControlsDrawer chat controls
Add a side panel to switch agent, model, and effort quickly
Show recent agents and models for faster reselect
Persist agent/model/variant selections in session
* fix(openchamber): correct base64 to Uint8Array typing
* feat: add reduced-motion support for marquee animations
Add marquee-text--auto to enable continuous scrolling
Introduce prefers-reduced-motion media query to disable animations
Apply reduced-motion rules to active marquee and hover states
* feat[worktrees]: enhance sdk worktree removal with fallbacks
Add dynamic resolution of remove/delete/archive methods for worktrees
Fallback to delete or archive when remove is not available
Throw clear error when SDK version does not support worktree removal
* feat(ui): track recent agents and efforts in UI store
Add recentAgents array to UI state for quick access
Track up to 5 variants per provider/model in recentEfforts
Expose addRecentAgent and addRecentEffort actions to update history
* fix(deps): upgrade @opencode-ai/sdk to 1.1.42
Upgrade the OpenCode AI SDK to 1.1.42 across packages
Refresh lockfile entries to reflect the new SDK version and integrity hash
Ensure downstream packages consume the latest SDK and remain compatible
* refactor: simplify agent overflow logic in UnifiedControlsDrawer
* types: add commitMessageModel to DesktopSettings
* store: add commitMessageModel state and fetch logic
* lib: implement persistence for commitMessageModel setting
* ui: create GitSettings component for model selection
* ui: add Git section to OpenChamber settings sidebar
* ui: register GitSectionContent in OpenChamberPage
* server: use commitMessageModel setting for AI generation
* tauri: sanitize commitMessageModel in settings commands
* tauri: use commitMessageModel for desktop message generation
* build: update lockfile and package configuration
* refactor(openchamber): improve default model parsing with fallback logic
* feat(openchamber): improve model selection fallback logic
* refactor: move worktree settings into git section
* refactor(openchamber): merge worktree into git section
* refactor[worktree]: simplify empty state layout
* revert: rollback bun.lock and package.json to main
* feat(git): restrict model selection to OpenCode provider