# Gadget Code

A self-hosted **Agentic Engineering Platform (AEP)** — an IDE that drives autonomous AI agents to perform software engineering work on your behalf, running in your own environment.

## Quick Start

```bash
# Install dependencies
pnpm install

# Start backend (Terminal 1)
cd gadget-code
pnpm dev:backend

# Start frontend (Terminal 2)
cd gadget-code/frontend
pnpm dev

# Open browser to https://localhost:5174
```

## Projects

| Package        | Role                                                                     |
| -------------- | ------------------------------------------------------------------------ |
| `gadget-code`  | Web service — agentic IDE, browser UI, API server                        |
| `gadget-drone` | Worker process — runs the agentic workflow loop in workspace directories |
| `@gadget/ai`   | Shared AI API abstraction — Ollama and OpenAI                            |
| `@gadget/api`  | Shared TypeScript interfaces — common types across all packages          |

## Architecture

```
┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│  Browser IDE │────▶│  gadget-code │────▶│ gadget-drone │
│  (React 19)  │◀────│ (Express 5)  │◀────│  (Worker)    │
└──────────────┘     └──────────────┘     └──────────────┘
       │                    │                      │
       │ Socket.IO          │ MongoDB              │ Files
       │ JWT Auth           │ Redis                │ Git
```

### How It Works

1. **User creates a project** in the browser IDE
2. **User selects a drone** instance to work on the project
3. **User enters a prompt** in the Chat Session view
4. **Prompt flows** IDE → Web → Drone via Socket.IO
5. **Drone executes** the Agentic Workflow Loop (AWL)
6. **Streaming response** flows back: thinking → response → tool calls
7. **Results persist** in MongoDB as ChatTurn records

## AI Provider Setup

Before using AI features, add a provider via CLI:

```bash
# Add Ollama provider (no API key needed)
cd gadget-code
pnpm cli provider add "Local Ollama" ollama http://localhost:11434

# Add OpenAI provider
pnpm cli provider add "OpenAI" openai https://api.openai.com $OPENAI_API_KEY

# List providers
pnpm cli provider ls

# Probe provider for models (discovers available models)
pnpm cli provider probe <provider-id>
```

## User Management

```bash
# Add a user
pnpm cli user add user@example.com password123 "Display Name"

# Grant admin rights
pnpm cli admin grant user@example.com

# Reset password
pnpm cli user password user@example.com newpassword
```

## Development

### Prerequisites

- Node.js 22+
- pnpm 10+
- MongoDB on `localhost:27017`
- Redis on `localhost:6379`
- SSL certificates in `ssl/` directory (for dev servers)

### Build

```bash
# Build all packages
pnpm -r build

# Build specific package
pnpm --filter @gadget/ai build
pnpm --filter gadget-drone build
pnpm --filter gadget-code build
```

### Run Development Servers

```bash
# Backend (gadget-code directory)
cd gadget-code
pnpm dev:backend
# Runs on https://localhost:3443

# Frontend (gadget-code/frontend directory)
cd gadget-code/frontend
pnpm dev
# Runs on https://localhost:5174

# Drone worker (in a workspace directory)
cd ~/my-gadget-workspace
pnpm --filter @gadget/drone dev
```

### Testing

```bash
# Unit tests (gadget-code directory)
cd gadget-code
pnpm test

# E2E tests with Playwright (requires running dev servers)
npx playwright test tests/e2e/project-manager.test.ts
npx playwright test tests/e2e/chat-session.test.ts

# Seed test data for E2E tests
npx tsx scripts/seed-test-drones.ts
```

## Key Features

### Project Manager

- Create and manage projects
- Select available drones (filters out offline)
- View chat session history
- Create new chat sessions with provider/model selection

### Chat Session View

- Real-time streaming responses
- Collapsible thinking content
- Tool call summaries
- Model/mode selection per session
- Session statistics (tool calls, file ops, subagents)

### Workspace Management

- Each drone manages a workspace directory
- Projects cloned into workspace by slug
- Crash recovery via `.gadget/` directory
- Workspace persistence across restarts

## AI API Abstraction

All AI calls route through `@gadget/ai`. No consumer code imports Ollama or OpenAI SDKs directly.

```typescript
// Correct: Use the factory
import { createAiApi } from '@gadget/ai';
const ai = createAiApi(providerConfig);

// Incorrect: Don't import SDKs directly
import { Ollama } from 'ollama'; // ❌
```

See [`packages/ai/README.md`](./packages/ai/README.md) for the full API reference.

## Documentation

- [Architecture Overview](./docs/architecture-stats.md)
- [Socket Protocol](./docs/socket-protocol.md)
- [Workspace Management](./docs/gadget-workspace.md)
- [Drone Documentation](./gadget-drone/docs/gadget-drone.md)
- [UI Design Guide](./gadget-code/docs/ui-design-guide.md)

## Monorepo Structure

```
gadget/
├── packages/ai/           # @gadget/ai — AI API abstraction
├── packages/api/          # @gadget/api — Shared interfaces
├── gadget-code/           # Web service + browser IDE
│   ├── src/               # Backend (Express, Socket.IO, Mongoose)
│   ├── frontend/          # Frontend (React, Vite, Tailwind)
│   └── tests/             # Unit + E2E tests
├── gadget-drone/          # Worker process
│   ├── src/               # Drone implementation
│   └── docs/              # Drone documentation
└── docs/                  # Architecture & protocol docs
```

## License

Apache 2.0 — See [LICENSE](./LICENSE) for details.

---

**Status:** Production-ready foundation with complete Chat Session UI  
**Last Updated:** April 29, 2026
