Files
openchamber/AGENTS.md
T
aptdnfapt 025a9a6b80 feat: implement Undo/Redo/Timeline and Fork Features and fixed opencode.json reading issue on broken json (#99)
* feat: add /undo, /redo, /timeline slash commands and fork button

- Add /undo command to revert to previous user message
- Add /redo command to redo previously undone messages
- Add /timeline command to show conversation history
- Add fork button on user messages (hover) to create new session
- Add TimelineDialog component for navigating conversation history
- Show undo/redo/timeline in autocomplete when session exists
- Fix fork to use SDK session.fork API
- Silent no-op behavior for undo/redo when no messages (matches OpenCode CLI)

* fix: correct fork session endpoint and session switching

- Add hybrid SDK approach using v1 for existing methods and v2 for fork only
- v2 SDK has correct endpoint /session/{sessionID}/fork instead of broken /session/{id}/fork
- Fix forkFromMessage to use setCurrentSession instead of direct set
- Ensures both useSessionStore and useSessionManagementStore are consistent
- Fixes issue where forked sessions appeared empty until sending a new message

* fix: use direct fetch for fork to avoid v2 SDK build errors

- Remove v2 SDK imports and hybrid SDK approach
- Use direct fetch() call to /api/session/{sessionID}/fork endpoint
- Avoids type conflicts between v1 and v2 SDK
- Bypasses broken v1 SDK fork endpoint (wrong path parameter)
- All codebase now uses v1 SDK consistently

* fix: use jsonc-parser for config file parsing

- Replace strip-json-comments + JSON.parse with jsonc-parser
- Handles comments, trailing commas, and unquoted keys
- Matches OpenCode CLI config parsing behavior
- Fixes SyntaxError when reading global opencode.json config

* feat: improve timeline dialog with loading state and search

- Add loading spinner on fork button during operation (~30s on big sessions)
- Refresh session list after fork so new session appears in sidebar immediately
- Add search bar to filter messages by prompt text content
- Show 'No messages found' when search has no results
- Disable fork button while forking to prevent duplicate operations
2026-01-03 01:33:35 +02:00

9.0 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 @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
  • packages/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 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.

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 lint and bun run type-check before finalizing changes

  • 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

  • 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
  • opencode repo is in ../opencode dir from this pwd dir check the codebase for any api undersatning . dont change opencode dir .
  • 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