* feat(terminal): replace xterm with ghostty-web Replace xterm.js terminal with ghostty-web implementation Add terminal serialization support for state restoration Apply custom patches to ghostty-web for enhancements * feat(terminal): add bun-pty backend support Switch terminal to ghostty-web with bun-pty backend for better performance Auto-detect and prefer Bun runtime when available for terminal sessions Update terminal viewport write queue handling for improved reliability * fix(terminal): prevent unnecessary resize events Only report terminal resize when dimensions actually change Simplify chunk processing state tracking Disable terminal transparency for consistent rendering * feat(terminal): increase scrollback and buffer limits Increase terminal scrollback buffer from 10k to 50k lines Increase terminal buffer limit from 256k to 1M bytes Add rate limiting and improve output handling for terminal streams
8.8 KiB
OpenChamber - AI Agent & Contributor Reference
Technical reference for AI coding agents and human contributors working on this project.
Core Purpose
Web and desktop interface for OpenCode AI coding agent. Provides cross-device continuity, remote accessibility, and a unified chat interface using the OpenCode API backend.
Tech Stack
- React 19.1.1: Modern React with concurrent features
- TypeScript 5.8.3: Full type safety
- Vite 7.1.2: Build tool with HMR and proxy
- Tailwind CSS v4.0.0: Latest
@importsyntax - Zustand 5.0.8: State management with persistence
- @opencode-ai/sdk: Official OpenCode SDK with typed endpoints and SSE
- @remixicon/react: Icon system
- @radix-ui primitives: Accessible component foundations
Architecture Overview (Monorepo)
Workspaces:
packages/ui- Shared UI components and storespackages/web- Web runtime, Express server, CLIpackages/desktop- Tauri desktop app with native APIspackages/vscode- VS Code extension with webview UI
Core Components (UI)
In packages/ui/src/components/chat/: ChatContainer, ChatEmptyState, ChatErrorBoundary, ChatInput, ChatMessage, FileAttachment, MarkdownRenderer, MessageList, ModelControls, PermissionCard, PermissionRequest, ServerFilePicker, StreamingTextDiff, AgentMentionAutocomplete, CommandAutocomplete, FileMentionAutocomplete.
In packages/ui/src/components/chat/message/: MessageBody, MessageHeader, ToolOutputDialog, DiffViewToggle, FadeInOnReveal; parts/ (AssistantTextPart, ReasoningPart, ToolPart, UserTextPart, etc.)
In packages/ui/src/components/layout/: MainLayout, Header, Sidebar, SidebarContextSummary, VSCodeLayout.
In packages/ui/src/components/views/: ChatView, GitView, DiffView, TerminalView, SettingsView.
In packages/ui/src/components/sections/: subsections agents/, commands/, git-identities/, openchamber/, providers/, shared/.
In packages/ui/src/components/session/: DirectoryTree, DirectoryExplorerDialog, SessionDialogs, SessionSidebar.
In packages/ui/src/components/ui/: CommandPalette, HelpDialog, ConfigUpdateOverlay, ContextUsageDisplay, ErrorBoundary, MemoryDebugPanel, MobileOverlayPanel, FireworksAnimation, OpenChamberLogo, OpenCodeIcon, ProviderLogo, ScrollShadow, OverlayScrollbar, plus Radix-based primitives (button, dialog, input, select, etc.)
In packages/ui/src/components/terminal/: TerminalViewport
In packages/ui/src/components/onboarding/: OnboardingScreen
In packages/ui/src/components/providers/: ThemeProvider
State Management (UI)
In packages/ui/src/stores/: contextStore, fileStore, messageStore, permissionStore, sessionStore, useAgentsStore, useCommandsStore, useConfigStore, useDirectoryStore, useFileSearchStore, useGitIdentitiesStore, useGitStore, useSessionStore, useTerminalStore, useUIStore
OpenCode SDK Integration (UI)
In packages/ui/src/lib/opencode/: client.ts wrapper around @opencode-ai/sdk with directory-aware API calls, SDK methods (session., message., agent., provider., config., project., path.*), AsyncGenerator SSE streaming (2 retry attempts, 500ms->8s backoff), automatic directory parameter injection.
In packages/ui/src/hooks/: useEventStream.ts for real-time SSE connection management.
Web Runtime (server/CLI)
Express server and CLI in packages/web: API adapters in packages/web/src/api, server in packages/web/server/index.js (git/terminal/config), UI bundle imported from @openchamber/ui.
Desktop Runtime (Tauri)
Native desktop app in packages/desktop: Tauri backend in src-tauri/ (Rust), frontend API adapters in src/api/ (settings, permissions, diagnostics, files, git, terminal, notifications, tools, updater), bridge layer in src/lib/ for Tauri IPC communication.
VS Code Extension Runtime
Extension in packages/vscode: Extension entry in src/ (ChatViewProvider, bridge, theme), webview API adapters in webview/api/ (bridge, editor, files, permissions, settings, tools), bootstrap script in webview/main.tsx that loads shared UI.
Development Commands
Code Validation
Always validate changes:
bun run type-check # TypeScript validation
bun run lint # ESLint checks
bun run build # Production build
Building
bun run build # Build all packages
bun run desktop:build # Build desktop app
bun run vscode:build # Build VS Code extension
Communication & Output Discipline (MANDATORY)
- Default to brevity. Responses must be as short as possible (until you suggesting plan) while remaining correct.
- Do not narrate internal reasoning, step-by-step thinking, or deliberation.
Key Patterns
Settings View Architecture
Full-screen settings view (SettingsView.tsx) with tabbed navigation. Desktop: sidebar + page side-by-side with resizable sidebar. Mobile: drill-down pattern (sidebar → page with back button). Tabs: OpenChamber, Agents, Commands, Providers, Git Identities.
Each settings section has a sidebar (*Sidebar.tsx) and page (*Page.tsx) in packages/ui/src/components/sections/.
Shared boilerplate components in packages/ui/src/components/sections/shared/:
SettingsSidebarLayout- wrapper with bg, scroll, header/footer slotsSettingsSidebarHeader- "Total X" + add buttonSettingsSidebarItem- list item with title, metadata, selection, optional actions dropdownSettingsPageLayout- centered max-w-3xl scrollable containerSettingsSection- section with optional title, description, divider
Use these as reference when adding new settings sections. See index.ts for usage examples.
File Attachments
Drag-and-drop upload with 10MB limit (FileAttachment.tsx), Data URL encoding, type validation with fallbacks, integrated via useFileStore.addAttachedFile().
Theme System
In packages/ui/src/lib/theme/: TypeScript-based themes (Flexoki Light and Dark), CSS variable generation, component-specific theming, Tailwind CSS v4 integration.
Typography System
In packages/ui/src/lib/: Semantic typography with 6 CSS variables, theme-independent scales. CRITICAL: Always use semantic typography classes, never hardcoded font sizes.
Streaming Architecture
SDK-managed SSE with AsyncGenerator, temp->real session ID swap (optimistic UI), pendingAssistantParts buffering, empty-response detection via window.__opencodeDebug.
Development Guidelines
Lint & Type Safety
- Never land code that introduces new ESLint or TypeScript errors
- Run
bun run lintandbun run type-checkbefore finalizing changes - Adding
eslint-disablerequires justification in a comment explaining why typing is impossible - Do not use
anyorunknowncasts as escape hatches; build narrow adapter interfaces instead - Refactors or new features must keep existing lint/type baselines green
Theme Integration
- Check theme definitions before adding colors or font sizes to new components
- Always use theme-defined typography classes, never hardcoded font sizes
- Reference existing theme colors instead of adding new ones
- Ensure new components support both light and dark themes
- Use theme-generated CSS variables for dynamic styling
Code Standards
- Functional components: Exclusive use of function components with hooks
- Custom hooks: Extract logic for reusability
- Type-first development: Comprehensive TypeScript usage
- Component composition: Prefer composition over inheritance
Feature Implementation Map
Directory & File System
packages/ui/src/components/session/: DirectoryTree, DirectoryExplorerDialog
packages/ui/src/stores/: DirectoryStore
Backend: packages/web/server/index.js with listLocalDirectory(), getFilesystemHome()
Session Switcher
SessionSwitcherDialog.tsx: Collapsible date groups, mobile parity with MobileOverlayPanel, Git worktree and shared session chips, streaming indicators.
Settings & Configuration
packages/ui/src/components/sections/: AgentsPage, CommandsPage, GitIdentitiesPage, ProvidersPage, SessionsPage, OpenChamberPage
packages/ui/src/components/sections/shared/: Boilerplate components for new sections
Related stores: useAgentsStore, useCommandsStore, useConfigStore, useGitIdentitiesStore
Git Operations
packages/ui/src/components/views/: GitView, DiffView
packages/ui/src/stores/: useGitIdentitiesStore
Backend: packages/ui/src/lib/gitApi.ts + packages/web/server/index.js (simple-git wrapper)
Terminal
packages/ui/src/components/views/: TerminalView
packages/ui/src/components/terminal/: TerminalViewport (ghostty-web with FitAddon)
packages/ui/src/stores/: useTerminalStore
Backend: packages/web/server/index.js (bun-pty wrapper with SSE)
Theme System
packages/ui/src/lib/theme/: themes (2 definitions), cssGenerator, syntaxThemeGenerator
packages/ui/src/components/providers/: ThemeProvider
Mobile & UX
packages/ui/src/components/ui/: MobileOverlayPanel
packages/ui/src/hooks/: useEdgeSwipe, useChatScrollManager