* 🐛 Fix UI crash when subagent is active Remove sessions dependency from hooks to prevent cascading re-renders. Use getState() instead and switch to getGlobalSessionStatus(). * ✨ Add support for connecting to external OpenCode server Add OPENCODE_SKIP_START env var to skip starting embedded server. Use OPENCODE_PORT to connect to existing OpenCode instance. Update help text to document the new environment variables. * 📝 Document external OpenCode server support Add OPENCODE_PORT and OPENCODE_SKIP_START to READMEs. Update AGENTS.md with external server integration notes. * ✨ Add URL-based routing for shareable session links - Add react-router-dom dependency - Create URL store for bi-directional sync with Zustand - Add WebRouter/DesktopRouter context for runtime-aware routing - Add useURLSync hook to sync URL with session/tab state - Add useNavigation hook with copySessionLink utility - Add share button in Header for copying session links - Update App.tsx to use router wrappers URL structure: /session/:sessionId?tab={chat|git|diff|terminal|files}&directory=/path /settings This enables shareable links and deep-linking to specific sessions. * Revert "✨ Add URL-based routing for shareable session links" This reverts commit b53ee304950a789538fa3d4a236d6361e634ea61.
78 lines
4.0 KiB
Markdown
78 lines
4.0 KiB
Markdown
# OpenChamber - AI Agent Reference (verified)
|
|
|
|
## Core purpose
|
|
OpenChamber provides UI runtimes (web/desktop/VS Code) for interacting with an OpenCode server (local auto-start or remote URL). UI uses HTTP + SSE via `@opencode-ai/sdk`.
|
|
|
|
## Tech stack (source of truth: `package.json`, resolved: `bun.lock`)
|
|
- Runtime/tooling: Bun (`package.json` `packageManager`), Node >=20 (`package.json` `engines`)
|
|
- UI: React, TypeScript, Vite, Tailwind v4
|
|
- State: Zustand (`packages/ui/src/stores/`)
|
|
- UI primitives: Radix UI (`package.json` deps), HeroUI (`package.json` deps), Remixicon (`package.json` deps)
|
|
- Server: Express (`packages/web/server/index.js`)
|
|
- Desktop: Tauri v2 (`packages/desktop/src-tauri/`)
|
|
- VS Code: extension + webview (`packages/vscode/`)
|
|
|
|
## Monorepo layout
|
|
Workspaces are `packages/*` (see `package.json`).
|
|
- Shared UI: `packages/ui`
|
|
- Web app + server + CLI: `packages/web`
|
|
- Desktop app (Tauri): `packages/desktop`
|
|
- VS Code extension: `packages/vscode`
|
|
|
|
## Build / dev commands (verified)
|
|
All scripts are in `package.json`.
|
|
- Validate: `bun run type-check`, `bun run lint`
|
|
- Build all: `bun run build`
|
|
- Desktop build: `bun run desktop:build`
|
|
- VS Code build: `bun run vscode:build`
|
|
- Release smoke build: `bun run release:test` (shell script: `scripts/test-release-build.sh`)
|
|
|
|
## Runtime entry points
|
|
- Web bootstrap: `packages/web/src/main.tsx`
|
|
- Web server: `packages/web/server/index.js`
|
|
- Web CLI: `packages/web/bin/cli.js` (package bin: `packages/web/package.json`)
|
|
- Desktop bootstrap: `packages/desktop/src/main.tsx`
|
|
- Tauri backend: `packages/desktop/src-tauri/src/main.rs`
|
|
- VS Code extension host: `packages/vscode/src/extension.ts`
|
|
- VS Code webview bootstrap: `packages/vscode/webview/main.tsx`
|
|
|
|
## OpenCode integration
|
|
- UI client wrapper: `packages/ui/src/lib/opencode/client.ts` (imports `@opencode-ai/sdk/v2`)
|
|
- SSE hookup: `packages/ui/src/hooks/useEventStream.ts`
|
|
- Web server embeds/starts OpenCode server: `packages/web/server/index.js` (`createOpencodeServer`)
|
|
- Web runtime filesystem endpoints: search `packages/web/server/index.js` for `/api/fs/`
|
|
- External server support: Set `OPENCODE_PORT` and `OPENCODE_SKIP_START=true` to connect to existing OpenCode instance
|
|
|
|
## Key UI patterns (reference files)
|
|
- Settings shell: `packages/ui/src/components/views/SettingsView.tsx`
|
|
- Settings shared primitives: `packages/ui/src/components/sections/shared/`
|
|
- Settings sections: `packages/ui/src/components/sections/` (incl `skills/`)
|
|
- Chat UI: `packages/ui/src/components/chat/` and `packages/ui/src/components/chat/message/`
|
|
- Theme + typography: `packages/ui/src/lib/theme/`, `packages/ui/src/lib/typography.ts`
|
|
- Terminal UI: `packages/ui/src/components/terminal/` (uses `ghostty-web`)
|
|
|
|
## External / system integrations (active)
|
|
- Git: `packages/ui/src/lib/gitApi.ts`, `packages/web/server/index.js` (`simple-git`)
|
|
- Terminal PTY: `packages/web/server/index.js` (`bun-pty`/`node-pty`)
|
|
- Skills catalog: `packages/web/server/lib/skills-catalog/`, UI: `packages/ui/src/components/sections/skills/`
|
|
|
|
## Agent constraints
|
|
- Do not modify `../opencode` (separate repo).
|
|
- Do not run git/GitHub commands unless explicitly asked.
|
|
- Keep baseline green (run `bun run type-check`, `bun run lint`, `bun run build` before finalizing changes).
|
|
|
|
## Development rules
|
|
- Keep diffs tight; avoid drive-by refactors.
|
|
- Backend changes: keep web/desktop/vscode runtimes consistent (if relevant).
|
|
- Follow local precedent; search nearby code first.
|
|
- TypeScript: avoid `any`/blind casts; keep ESLint/TS green.
|
|
- React: prefer function components + hooks; class only when needed (e.g. error boundaries).
|
|
- Control flow: avoid nested ternaries; prefer early returns + `if/else`/`switch`.
|
|
- Styling: Tailwind v4; typography via `packages/ui/src/lib/typography.ts`; theme vars via `packages/ui/src/lib/theme/`.
|
|
- No new deps unless asked.
|
|
- Never add secrets (`.env`, keys) or log sensitive data.
|
|
|
|
## Recent changes
|
|
- Releases + high-level changes: `CHANGELOG.md`
|
|
- Recent commits: `git log --oneline` (latest tags: `v1.4.6`, `v1.4.5`)
|