2025-12-07 19:32:53 +02:00
# 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 `@import` syntax
- **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 stores
- `packages/web` - Web runtime, Express server, CLI
- `packages/desktop` - Tauri desktop app with native APIs
2025-12-15 15:31:54 +02:00
- `packages/vscode` - VS Code extension with webview UI
2025-12-07 19:32:53 +02:00
### Core Components (UI)
2025-12-15 15:31:54 +02:00
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.)
2025-12-28 02:17:09 +02:00
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/.
2025-12-15 15:31:54 +02:00
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.)
2025-12-28 02:17:09 +02:00
2025-12-07 19:32:53 +02:00
In `packages/ui/src/components/terminal/` : TerminalViewport
2025-12-15 15:31:54 +02:00
In `packages/ui/src/components/onboarding/` : OnboardingScreen
In `packages/ui/src/components/providers/` : ThemeProvider
2025-12-07 19:32:53 +02:00
### State Management (UI)
2025-12-15 15:31:54 +02:00
In `packages/ui/src/stores/` : contextStore, fileStore, messageStore, permissionStore, sessionStore, useAgentsStore, useCommandsStore, useConfigStore, useDirectoryStore, useFileSearchStore, useGitIdentitiesStore, useGitStore, useSessionStore, useTerminalStore, useUIStore
2025-12-07 19:32:53 +02:00
### 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)
2025-12-15 15:31:54 +02:00
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
2025-12-30 15:24:51 +02:00
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.
2025-12-07 19:32:53 +02:00
## Development Commands
### Code Validation
2025-12-15 15:31:54 +02:00
Always validate changes:
2025-12-07 19:32:53 +02:00
```bash
2025-12-26 16:45:30 +02:00
bun run type-check # TypeScript validation
bun run lint # ESLint checks
bun run build # Production build
2025-12-07 19:32:53 +02:00
```
### Building
```bash
2025-12-26 16:45:30 +02:00
bun run build # Build all packages
bun run desktop:build # Build desktop app
bun run vscode:build # Build VS Code extension
2025-12-07 19:32:53 +02:00
```
2025-12-18 19:02:42 +02:00
## 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.
2025-12-07 19:32:53 +02:00
## Key Patterns
2025-12-28 02:17:09 +02:00
### 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 slots
- `SettingsSidebarHeader` - "Total X" + add button
- `SettingsSidebarItem` - list item with title, metadata, selection, optional actions dropdown
- `SettingsPageLayout` - centered max-w-3xl scrollable container
- `SettingsSection` - section with optional title, description, divider
Use these as reference when adding new settings sections. See `index.ts` for usage examples.
2025-12-07 19:32:53 +02:00
### 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
2025-12-15 15:31:54 +02:00
SDK-managed SSE with AsyncGenerator, temp->real session ID swap (optimistic UI), pendingAssistantParts buffering, empty-response detection via `window.__opencodeDebug` .
2025-12-07 19:32:53 +02:00
## Development Guidelines
### Lint & Type Safety
- Never land code that introduces new ESLint or TypeScript errors
2025-12-26 16:45:30 +02:00
- Run `bun run lint` and `bun run type-check` before finalizing changes
2025-12-07 19:32:53 +02:00
- Adding `eslint-disable` requires justification in a comment explaining why typing is impossible
- Do **not** use `any` or `unknown` casts as escape hatches; build narrow adapter interfaces instead
2026-01-02 18:33:35 -05:00
2025-12-07 19:32:53 +02:00
- 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
2026-01-02 18:33:35 -05:00
- opencode repo is in ../opencode dir from this pwd dir check the codebase for any api undersatning . dont change opencode dir .
2025-12-07 19:32:53 +02:00
- **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
2025-12-28 02:17:09 +02:00
`packages/ui/src/components/sections/` : AgentsPage, CommandsPage, GitIdentitiesPage, ProvidersPage, SessionsPage, OpenChamberPage
`packages/ui/src/components/sections/shared/` : Boilerplate components for new sections
2025-12-07 19:32:53 +02:00
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
2026-01-02 21:57:53 +02:00
`packages/ui/src/components/terminal/` : TerminalViewport (ghostty-web with FitAddon)
2025-12-07 19:32:53 +02:00
`packages/ui/src/stores/` : useTerminalStore
2026-01-02 21:57:53 +02:00
Backend: `packages/web/server/index.js` (bun-pty wrapper with SSE)
2025-12-07 19:32:53 +02:00
### 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