730 lines
25 KiB
Markdown
730 lines
25 KiB
Markdown
# Gadget Code Architecture
|
|
|
|
**Date:** April 29, 2026
|
|
**Status:** ✅ **CHAT SESSION UI COMPLETE** - Full end-to-end prompt flow operational
|
|
|
|
## Executive Summary
|
|
|
|
Gadget Code is a fully functional Agentic Engineering Platform with complete Chat Session UI, AI provider management, and end-to-end prompt processing. Users can create projects, select drones, configure AI providers/models, and submit prompts that flow through the complete agentic workflow loop.
|
|
|
|
**Key Capabilities:**
|
|
|
|
- ✅ Complete Socket.IO communication (IDE↔Web↔Drone)
|
|
- ✅ AI Provider CLI management (add/list/probe/remove)
|
|
- ✅ Chat Session REST API with full CRUD
|
|
- ✅ Project Manager with drone selection & chat session lists
|
|
- ✅ Chat Session View with streaming responses
|
|
- ✅ Workspace persistence for crash recovery
|
|
- ✅ 21 unit tests passing
|
|
|
|
---
|
|
|
|
## System Architecture
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Gadget Code Ecosystem │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|
│ │ Browser IDE │────▶│ gadget-code │────▶│ gadget-drone │ │
|
|
│ │ (React 19) │◀────│ (Express 5) │◀────│ (Worker) │ │
|
|
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|
│ │ │ │ │
|
|
│ │ Socket.IO │ MongoDB │ Files │
|
|
│ │ JWT Auth │ Redis Sessions │ Git │
|
|
│ │ │ │ │
|
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|
│ │ Chat View │ │ REST API │ │ AWL Loop │ │
|
|
│ │ Streaming │ │ /projects │ │ Tool Calls │ │
|
|
│ │ Tool Calls │ │ /sessions │ │ File Ops │ │
|
|
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### Core Components
|
|
|
|
| Component | Technology | Role |
|
|
| ------------------- | -------------------------------- | ----------------------------------------------- |
|
|
| **Browser IDE** | React 19 + Vite 8 + Tailwind 4 | Agentic development environment |
|
|
| **gadget-code:web** | Express 5 + Socket.IO + Mongoose | API server, session management, routing |
|
|
| **gadget-code:ide** | TypeScript + React Router | Chat sessions, project management, file editing |
|
|
| **gadget-drone** | TypeScript + Socket.IO client | Agentic Workflow Loop executor |
|
|
| **@gadget/ai** | TypeScript abstraction | Unified AI API (Ollama/OpenAI) |
|
|
| **@gadget/api** | TypeScript interfaces | Shared type definitions |
|
|
|
|
---
|
|
|
|
## Message Flow
|
|
|
|
### Complete Prompt Journey
|
|
|
|
```
|
|
User Types Prompt
|
|
│
|
|
▼
|
|
┌──────────────────┐
|
|
│ Chat Session View│
|
|
│ - Prompt Input │
|
|
│ - submitPrompt │
|
|
└────────┬─────────┘
|
|
│ Socket: submitPrompt(content)
|
|
▼
|
|
┌──────────────────┐
|
|
│ CodeSession │
|
|
│ - Create ChatTurn│
|
|
│ - Track drone │
|
|
└────────┬─────────┘
|
|
│ Socket: processWorkOrder(project, session, turn)
|
|
▼
|
|
┌──────────────────┐
|
|
│ DroneSession │
|
|
│ - Route to drone│
|
|
└────────┬─────────┘
|
|
│ Socket: processWorkOrder(...)
|
|
▼
|
|
┌──────────────────┐
|
|
│ gadget-drone │
|
|
│ - AgentService │
|
|
│ - AWL Loop │
|
|
└────────┬─────────┘
|
|
│ Processing...
|
|
│
|
|
├─► thinking(content) ────┐
|
|
├─► response(content) ────┤
|
|
├─► toolCall(...) ────────┤
|
|
└─► workOrderComplete() ──┤
|
|
│
|
|
▼
|
|
┌──────────────────┐
|
|
│ DroneSession │
|
|
│ - Update Turn │
|
|
│ - Route to IDE │
|
|
└────────┬─────────┘
|
|
│ Socket: thinking/response/toolCall
|
|
▼
|
|
┌──────────────────┐
|
|
│ Chat Session View│
|
|
│ - Stream display│
|
|
│ - Update UI │
|
|
└──────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## AI Provider Architecture
|
|
|
|
### Provider Management Flow
|
|
|
|
```
|
|
Admin CLI Database Runtime
|
|
│ │ │
|
|
├─ provider add ───────▶│ │
|
|
│ (name, sdk, url) │ │
|
|
│ │ │
|
|
├─ provider probe ─────▶│ AiProvider model │
|
|
│ │ - Fetch models │
|
|
│ │ - Discover caps │
|
|
│ │ - Update in-place │
|
|
│ │ │
|
|
│ ├────────────────────▶│ createAiApi()
|
|
│ │ │ - SDK factory
|
|
│ │ │ - Ollama/OpenAI
|
|
│ │ │
|
|
│ │◀────────────────────┤
|
|
│ │ Runtime config │
|
|
│ │ - _id, name, sdk │
|
|
│ │ - baseUrl, apiKey │
|
|
│ │ │
|
|
└─ provider ls ────────▶│ List providers │
|
|
│ (hide apiKey) │
|
|
```
|
|
|
|
### Provider Data Model
|
|
|
|
```typescript
|
|
interface IAiProvider {
|
|
_id: ObjectId;
|
|
name: string;
|
|
apiType: "ollama" | "openai";
|
|
baseUrl: string;
|
|
apiKey: string; // Encrypted, select: false
|
|
enabled: boolean;
|
|
models: IAiModel[];
|
|
lastModelRefresh: Date;
|
|
}
|
|
|
|
interface IAiModel {
|
|
id: string;
|
|
name: string;
|
|
parameterCount?: number;
|
|
parameterLabel?: string; // "7b", "70b"
|
|
contextWindow?: number;
|
|
capabilities: {
|
|
canCallTools: boolean;
|
|
hasVision: boolean;
|
|
hasEmbedding: boolean;
|
|
hasThinking: boolean;
|
|
isInstructTuned: boolean;
|
|
};
|
|
settings?: {
|
|
temperature?: number;
|
|
topP?: number;
|
|
topK?: number;
|
|
numCtx?: number;
|
|
};
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Chat Session Architecture
|
|
|
|
### Session Lifecycle
|
|
|
|
```
|
|
User Creates Session
|
|
│
|
|
▼
|
|
┌────────────────────────────┐
|
|
│ POST /api/v1/chat-sessions │
|
|
│ - projectId │
|
|
│ - providerId │
|
|
│ - selectedModel │
|
|
│ - mode (plan/build/..) │
|
|
└───────────┬────────────────┘
|
|
│
|
|
▼
|
|
┌────────────────────────────┐
|
|
│ ChatSession Document │
|
|
│ - _id │
|
|
│ - user, project │
|
|
│ - provider, model │
|
|
│ - mode, stats │
|
|
│ - pins[] │
|
|
└───────────┬────────────────┘
|
|
│
|
|
▼
|
|
┌────────────────────────────┐
|
|
│ Chat Session View │
|
|
│ - Messages list │
|
|
│ - Prompt input │
|
|
│ - Session sidebar │
|
|
│ - Model selector │
|
|
└───────────┬────────────────┘
|
|
│
|
|
▼
|
|
┌────────────────────────────┐
|
|
│ User Submits Prompt │
|
|
│ - submitPrompt event │
|
|
│ - Creates ChatTurn │
|
|
│ - Routes to drone │
|
|
└───────────┬────────────────┘
|
|
│
|
|
▼
|
|
┌────────────────────────────┐
|
|
│ Streaming Response │
|
|
│ - thinking (collapsible) │
|
|
│ - response (streaming) │
|
|
│ - toolCall (summaries) │
|
|
│ - workOrderComplete │
|
|
└────────────────────────────┘
|
|
```
|
|
|
|
### Chat Turn Structure
|
|
|
|
```typescript
|
|
interface IChatTurn {
|
|
_id: ObjectId;
|
|
createdAt: Date;
|
|
user: IUser | ObjectId;
|
|
project: IProject | ObjectId;
|
|
session: IChatSession | ObjectId;
|
|
provider: IAiProvider | ObjectId;
|
|
llm: string; // Model ID
|
|
mode: ChatSessionMode;
|
|
status: "processing" | "finished" | "error";
|
|
prompts: {
|
|
user: string;
|
|
system?: string;
|
|
};
|
|
thinking?: string;
|
|
response?: string;
|
|
toolCalls: IChatToolCall[];
|
|
subagents: IChatSubagentProcess[];
|
|
stats: IChatTurnStats;
|
|
}
|
|
|
|
interface IChatToolCall {
|
|
callId: string;
|
|
name: string;
|
|
parameters?: string;
|
|
response?: string;
|
|
}
|
|
|
|
interface IChatTurnStats {
|
|
toolCallCount: number;
|
|
inputTokens: number;
|
|
thinkingTokenCount: number;
|
|
responseTokens: number;
|
|
durationMs: number;
|
|
durationLabel: string; // "hh:mm:ss"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Workspace Architecture
|
|
|
|
### Project Manager Layout
|
|
|
|
```
|
|
┌──────────────────────────────────────────────────────────────┐
|
|
│ Header Bar │
|
|
├──────────┬───────────────────────┬───────────────────────────┤
|
|
│ │ │ │
|
|
│ Projects │ Project Inspector │ Right Sidebar │
|
|
│ │ │ │
|
|
│ List │ - Name, Slug │ ┌─────────────────────┐ │
|
|
│ │ - Git URL │ │ Available Drones │ │
|
|
│ [proj-1] │ - Status, Created │ │ (40% of space) │ │
|
|
│ [proj-2] │ - Delete button │ │ │ │
|
|
│ │ │ │ drone-alpha ● │ │
|
|
│ │ │ │ [Select] │ │
|
|
│ │ │ │ │ │
|
|
│ │ │ │ drone-beta ○ │ │
|
|
│ │ │ │ [Select] │ │
|
|
│ │ │ │ │ │
|
|
│ │ │ └─────────────────────┘ │
|
|
│ │ │ ┌─────────────────────┐ │
|
|
│ │ │ │ Chat Sessions │ │
|
|
│ │ │ │ (60% of space) │ │
|
|
│ │ │ │ │ │
|
|
│ │ │ │ Session 1 │ │
|
|
│ │ │ │ [Open] │ │
|
|
│ │ │ │ │ │
|
|
│ │ │ │ Session 2 │ │
|
|
│ │ │ │ [Open] │ │
|
|
│ │ │ │ │ │
|
|
│ │ │ └─────────────────────┘ │
|
|
│ │ │ ┌─────────────────────┐ │
|
|
│ │ │ │ [New Chat Session] │ │
|
|
│ │ │ │ (fixed at bottom) │ │
|
|
│ │ │ └─────────────────────┘ │
|
|
├──────────┴───────────────────────┴───────────────────────────┤
|
|
│ Status Bar │
|
|
└──────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### Drone Filtering Rules
|
|
|
|
- **Shown in list:** `status !== 'offline'` (available + busy only)
|
|
- **Selectable:** `status === 'available'` only
|
|
- **Busy drones:** Visible but Select button disabled
|
|
- **Offline drones:** Completely filtered out
|
|
|
|
### Chat Session Creation Flow
|
|
|
|
1. User selects project → loads Project Manager
|
|
2. System fetches available drones (filters offline)
|
|
3. User clicks "Select" on a drone → stores in state
|
|
4. User clicks "[New Chat Session]" → opens modal
|
|
5. Modal shows:
|
|
- Provider dropdown (from `/api/v1/providers`)
|
|
- Model dropdown (from selected provider's models)
|
|
- Mode selector (Plan/Build/Test/Ship/Dev)
|
|
- Optional session name
|
|
6. User submits → `POST /api/v1/chat-sessions`
|
|
7. System creates session → navigates to `/projects/:projectId/chat-session/:sessionId`
|
|
|
|
---
|
|
|
|
## Chat Session View Design
|
|
|
|
### Layout Specification
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Work Area (flex-1) │ Session Sidebar (w-80) │
|
|
├──────────────────────────────┤ │
|
|
│ │ Chat: Session Name │
|
|
│ Chat Messages │ ID: abc123... │
|
|
│ - User prompts (right) │ Model: llama3.2 (Ollama) ▼ │
|
|
│ - Assistant responses │ Mode: BUILD ▼ │
|
|
│ - Thinking (collapsible) │ │
|
|
│ - Tool calls (1-line) ├──────────────────────────────┤
|
|
│ │ TC │ FO │ SA │
|
|
│ │ 12 │ 0 │ 0 │
|
|
├──────────────────────────────┤ │
|
|
│ [Prompt input ][Send] │ Project: my-project │
|
|
└──────────────────────────────┴──────────────────────────────┘
|
|
```
|
|
|
|
### Message Display Rules
|
|
|
|
- **User messages:** Right-aligned, brand color background
|
|
- **Assistant responses:** Left-aligned, dark background
|
|
- **Thinking content:** Collapsible with toggle, shows char count
|
|
- **Tool calls:** One-line summary in chat (`⚡ toolName ✓`)
|
|
- **Tool call details:** Click to open inspector (future)
|
|
- **Auto-scroll:** Always scroll to bottom on new message
|
|
|
|
### Session Sidebar Features
|
|
|
|
- **Model selector:** Dropdown showing `Model Name (Provider Name)`
|
|
- **Mode selector:** Plan/Build/Test/Ship/Dev
|
|
- **Stats panel:**
|
|
- TC = Tool Calls
|
|
- FO = File Operations (future)
|
|
- SA = Subagents (future)
|
|
- **Session settings:** Cog icon → edit name, provider, mode
|
|
|
|
---
|
|
|
|
## CLI Commands
|
|
|
|
### Provider Management
|
|
|
|
```bash
|
|
# Add a provider (auto-probes for models)
|
|
pnpm cli provider add "My Ollama" ollama http://localhost:11434
|
|
pnpm cli provider add "OpenAI" openai https://api.openai.com $OPENAI_API_KEY
|
|
|
|
# List all providers
|
|
pnpm cli provider ls
|
|
|
|
# Enable/disable a provider
|
|
pnpm cli provider status <provider-id> active
|
|
pnpm cli provider status <provider-id> inactive
|
|
|
|
# Remove a provider
|
|
pnpm cli provider remove <provider-id>
|
|
|
|
# Probe provider for models (updates in-place)
|
|
pnpm cli provider probe <provider-id>
|
|
```
|
|
|
|
### User Management
|
|
|
|
```bash
|
|
# Add user
|
|
pnpm cli user add user@example.com password123 "Display Name"
|
|
|
|
# Reset password
|
|
pnpm cli user password user@example.com newpassword
|
|
|
|
# Ban/unban user
|
|
pnpm cli user ban user@example.com
|
|
pnpm cli user unban user@example.com
|
|
|
|
# Remove user
|
|
pnpm cli user remove user@example.com
|
|
```
|
|
|
|
### Admin Commands
|
|
|
|
```bash
|
|
# Grant admin rights
|
|
pnpm cli admin grant user@example.com
|
|
|
|
# Revoke admin rights
|
|
pnpm cli admin revoke user@example.com
|
|
```
|
|
|
|
---
|
|
|
|
## Testing Strategy
|
|
|
|
### Unit Tests
|
|
|
|
**Location:** `gadget-code/tests/**/*.test.ts`
|
|
|
|
**Coverage:**
|
|
|
|
- `code-session.test.ts` - Prompt submission flow (9 tests)
|
|
- `drone-session.test.ts` - Event routing (12 tests)
|
|
- Total: 21 tests passing
|
|
|
|
**Run:**
|
|
|
|
```bash
|
|
cd gadget-code
|
|
pnpm test
|
|
```
|
|
|
|
### E2E Tests (Playwright)
|
|
|
|
**Location:** `gadget-code/tests/e2e/**/*.test.ts`
|
|
|
|
**Test Scenarios:**
|
|
|
|
1. **Project Manager Layout** - Three-column layout verification
|
|
2. **Drone Filtering** - Only available/busy drones shown
|
|
3. **Drone Selection** - Select buttons functional
|
|
4. **New Session Button** - Visible, disabled until drone selected
|
|
5. **Chat Session Creation** - Modal flow with provider/model selection
|
|
6. **Prompt Submission** - End-to-end prompt flow
|
|
7. **Response Streaming** - Thinking, response, tool calls displayed
|
|
|
|
**Run:**
|
|
|
|
```bash
|
|
# Prerequisites: MongoDB, Redis, dev servers running
|
|
cd gadget-code
|
|
|
|
# Start backend (in gadget-code directory)
|
|
pnpm dev:backend
|
|
|
|
# Start frontend (in gadget-code/frontend directory)
|
|
pnpm dev
|
|
|
|
# Run tests (in separate terminal)
|
|
npx playwright test tests/e2e/project-manager.test.ts
|
|
npx playwright test tests/e2e/chat-session.test.ts
|
|
```
|
|
|
|
**Test Data Seeding:**
|
|
|
|
```bash
|
|
# Seed mock drones for testing
|
|
cd gadget-code
|
|
npx tsx scripts/seed-test-drones.ts
|
|
```
|
|
|
|
This creates:
|
|
|
|
- 2 available drones
|
|
- 1 busy drone
|
|
- 2 offline drones (filtered from UI)
|
|
|
|
---
|
|
|
|
## Development Setup
|
|
|
|
### Prerequisites
|
|
|
|
- Node.js 22+
|
|
- pnpm 10+
|
|
- MongoDB on `localhost:27017`
|
|
- Redis on `localhost:6379`
|
|
- SSL certificates in `ssl/` directory
|
|
|
|
### Installation
|
|
|
|
```bash
|
|
# Install all workspace packages
|
|
pnpm install
|
|
|
|
# Build all packages
|
|
pnpm -r build
|
|
```
|
|
|
|
### Running Development Servers
|
|
|
|
```bash
|
|
# Terminal 1: Backend (gadget-code directory)
|
|
cd gadget-code
|
|
pnpm dev:backend
|
|
# Runs on https://localhost:3443
|
|
|
|
# Terminal 2: Frontend (gadget-code/frontend directory)
|
|
cd gadget-code/frontend
|
|
pnpm dev
|
|
# Runs on https://localhost:5174
|
|
|
|
# Terminal 3: Drone (separate workspace directory)
|
|
cd ~/my-gadget-workspace
|
|
pnpm --filter gadget-drone dev
|
|
# Registers with platform, waits for work orders
|
|
```
|
|
|
|
### Building for Production
|
|
|
|
```bash
|
|
# Build all packages
|
|
pnpm -r build
|
|
|
|
# Build backend only
|
|
cd gadget-code
|
|
pnpm build:backend # Outputs to dist/
|
|
|
|
# Build frontend only
|
|
cd gadget-code
|
|
pnpm build:frontend # Outputs to frontend/dist/
|
|
```
|
|
|
|
---
|
|
|
|
## Key Architectural Decisions
|
|
|
|
### 1. Socket.IO Only (No Bull Queue)
|
|
|
|
**Decision:** All message routing uses Socket.IO with directed delivery.
|
|
|
|
**Rationale:**
|
|
|
|
- Better performance for real-time agentic workflows
|
|
- Eliminates Redis dependency for end users
|
|
- Simpler deployment model
|
|
|
|
**Recovery:** Workspace persistence via `.gadget/` directory
|
|
|
|
### 2. CLI-Only Administration
|
|
|
|
**Decision:** No admin UI - all administrative functions via CLI.
|
|
|
|
**Rationale:**
|
|
|
|
- Reduces attack surface
|
|
- Simpler codebase
|
|
- Admins comfortable with CLI
|
|
|
|
**Commands:** User management, provider management, admin rights
|
|
|
|
### 3. AI API Abstraction
|
|
|
|
**Decision:** All AI calls route through `@gadget/ai`. No direct SDK imports.
|
|
|
|
**Rationale:**
|
|
|
|
- Single source of truth for AI interfaces
|
|
- Easy to add new providers
|
|
- Consistent error handling
|
|
|
|
### 4. Workspace Persistence
|
|
|
|
**Decision:** Drones maintain `.gadget/` directory for crash recovery.
|
|
|
|
**Rationale:**
|
|
|
|
- No external dependencies for drones
|
|
- Survives restarts
|
|
- Enables retry routing
|
|
|
|
### 5. Model Selection in UI
|
|
|
|
**Decision:** Users select provider + model per chat session, changeable anytime.
|
|
|
|
**Rationale:**
|
|
|
|
- Flexibility for different tasks
|
|
- Cost optimization
|
|
- Model experimentation
|
|
|
|
---
|
|
|
|
## File Structure
|
|
|
|
```
|
|
gadget/
|
|
├── packages/
|
|
│ ├── ai/ # @gadget/ai - AI API abstraction
|
|
│ │ ├── src/
|
|
│ │ │ ├── api.ts # Core interfaces
|
|
│ │ │ ├── ollama.ts # Ollama implementation
|
|
│ │ │ ├── openai.ts # OpenAI implementation
|
|
│ │ │ └── index.ts # Factory function
|
|
│ │ └── README.md
|
|
│ └── api/ # @gadget/api - Shared types
|
|
│ └── src/
|
|
│ └── interfaces/ # TypeScript interfaces
|
|
│
|
|
├── gadget-code/ # Web service + IDE
|
|
│ ├── src/
|
|
│ │ ├── web-app.ts # Express app entry
|
|
│ │ ├── web-cli.ts # CLI entry
|
|
│ │ ├── controllers/
|
|
│ │ │ └── api/v1/
|
|
│ │ │ ├── chat-session.ts
|
|
│ │ │ ├── provider.ts
|
|
│ │ │ ├── project.ts
|
|
│ │ │ └── drone.ts
|
|
│ │ ├── services/
|
|
│ │ │ ├── chat-session.ts
|
|
│ │ │ ├── socket.ts
|
|
│ │ │ └── drone.ts
|
|
│ │ ├── models/
|
|
│ │ │ ├── chat-session.ts
|
|
│ │ │ ├── chat-turn.ts
|
|
│ │ │ └── ai-provider.ts
|
|
│ │ └── lib/
|
|
│ │ ├── code-session.ts
|
|
│ │ └── drone-session.ts
|
|
│ ├── frontend/
|
|
│ │ └── src/
|
|
│ │ ├── App.tsx
|
|
│ │ ├── pages/
|
|
│ │ │ ├── ProjectManager.tsx
|
|
│ │ │ ├── ChatSessionView.tsx
|
|
│ │ │ └── Home.tsx
|
|
│ │ ├── components/
|
|
│ │ │ ├── Header.tsx
|
|
│ │ │ └── StatusBar.tsx
|
|
│ │ └── lib/
|
|
│ │ ├── api.ts
|
|
│ │ └── socket.ts
|
|
│ ├── tests/
|
|
│ │ ├── code-session.test.ts
|
|
│ │ ├── drone-session.test.ts
|
|
│ │ └── e2e/
|
|
│ │ ├── project-manager.test.ts
|
|
│ │ └── chat-session.test.ts
|
|
│ └── scripts/
|
|
│ └── seed-test-drones.ts
|
|
│
|
|
├── gadget-drone/ # Worker process
|
|
│ ├── src/
|
|
│ │ ├── gadget-drone.ts
|
|
│ │ └── services/
|
|
│ │ ├── agent.ts # AWL implementation
|
|
│ │ ├── ai.ts # AI service
|
|
│ │ ├── platform.ts # Platform registration
|
|
│ │ └── workspace.ts # Workspace persistence
|
|
│ └── docs/
|
|
│ └── gadget-drone.md
|
|
│
|
|
└── docs/
|
|
├── architecture-stats.md # This document
|
|
├── socket-protocol.md
|
|
└── gadget-workspace.md
|
|
```
|
|
|
|
---
|
|
|
|
## Current Status
|
|
|
|
### ✅ Complete
|
|
|
|
- [x] Socket.IO communication (IDE↔Web↔Drone)
|
|
- [x] AI Provider CLI management
|
|
- [x] Chat Session REST API
|
|
- [x] Project Manager UI (3-column layout)
|
|
- [x] Chat Session View UI
|
|
- [x] Drone selection & filtering
|
|
- [x] Model selection in sidebar
|
|
- [x] Workspace persistence
|
|
- [x] Crash recovery
|
|
- [x] Unit tests (21 passing)
|
|
- [x] E2E test framework
|
|
|
|
### 🔄 In Progress
|
|
|
|
- [ ] E2E tests for complete flow
|
|
- [ ] Tool call inspectors
|
|
- [ ] File browser integration
|
|
- [ ] Session settings modal
|
|
|
|
### 📋 Future
|
|
|
|
- [ ] File operations (FO stats)
|
|
- [ ] Subagent support (SA stats)
|
|
- [ ] Model capability discovery
|
|
- [ ] Streaming token counts
|
|
- [ ] Session pins/bookmarks
|
|
|
|
---
|
|
|
|
**Last Updated:** April 29, 2026
|
|
**Status:** Production-ready foundation with complete Chat Session UI
|