zeroclaw/CLAUDE.md
mmacedoeu c2a1eb1088 feat(channels): implement WhatsApp Web channel with wa-rs integration
- Add wa-rs dependencies with custom rusqlite storage backend
- Implement functional WhatsApp Web channel using wa-rs Bot
- Integrate TokioWebSocketTransportFactory and UreqHttpClient
- Add message handling via Bot event loop with proper shutdown
- Create WhatsApp storage trait implementations for wa-rs
- Add WhatsApp config schema and onboarding support
- Implement Meta webhook verification for WhatsApp Cloud API
- Add webhook signature verification for security
- Generate unique message keys for WhatsApp conversations
- Remove unused Node.js whatsapp-web-bridge stub

Supersedes: baileys-based bridge approach in favor of native Rust wa-rs
2026-02-19 18:03:09 +08:00

193 lines
7.5 KiB
Markdown

# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
ZeroClaw is a lightweight autonomous AI assistant infrastructure written entirely in Rust. It is optimized for high performance, efficiency, and security with a trait-based pluggable architecture.
Key stats: ~3.4MB binary, <5MB RAM, <10ms startup, 1,017 tests.
## Common Commands
### Build
```bash
cargo build --release # Optimized release build (~3.4MB)
CARGO_BUILD_JOBS=1 cargo build --release # Low-memory fallback (Raspberry Pi 3, 1GB RAM)
cargo build --release --locked # Build with locked dependencies (fixes OpenSSL errors)
```
### Test
```bash
cargo test # Run all 1,017 tests
cargo test telegram --lib # Test specific module
cargo test security # Test security module
```
### Format & Lint
```bash
cargo fmt --all -- --check # Check formatting
cargo fmt # Apply formatting
cargo clippy --all-targets -- -D clippy::correctness # Baseline (required for CI)
cargo clippy --all-targets -- -D warnings # Strict (optional)
```
### CI / Pre-push
```bash
./dev/ci.sh all # Full CI in Docker
git config core.hooksPath .githooks # Enable pre-push hook
git push --no-verify # Skip hook if needed
```
## Architecture
ZeroClaw uses a **trait-based pluggable architecture** where every subsystem is swappable via traits and factory functions.
### Core Extension Points
| Trait | Purpose | Location |
|-------|---------|----------|
| `Provider` | LLM backends (22+ providers) | `src/providers/traits.rs` |
| `Channel` | Messaging platforms | `src/channels/traits.rs` |
| `Tool` | Agent capabilities | `src/tools/traits.rs` |
| `Memory` | Persistence/backends | `src/memory/traits.rs` |
| `Observer` | Metrics/logging | `src/observability/traits.rs` |
| `RuntimeAdapter` | Platform abstraction | `src/runtime/traits.rs` |
| `Peripheral` | Hardware boards | `src/peripherals/traits.rs` |
### Key Directory Structure
```
src/
├── main.rs # CLI entrypoint, command routing
├── lib.rs # Module exports, command enums
├── agent/ # Orchestration loop
├── channels/ # Telegram, Discord, Slack, WhatsApp, etc.
├── providers/ # OpenRouter, Anthropic, OpenAI, Ollama, etc.
├── tools/ # shell, file_read, file_write, memory, browser
├── memory/ # SQLite, Markdown, Lucid, None backends
├── gateway/ # Webhook/gateway server (Axum HTTP)
├── security/ # Policy, pairing, secret store
├── runtime/ # Native, Docker runtime adapters
├── peripherals/ # STM32, RPi GPIO hardware support
├── observability/ # Noop, Log, Multi, OTel observers
├── tunnel/ # Cloudflare, Tailscale, ngrok, custom
├── config/ # Schema + config loading/merging
└── identity/ # AIEOS/OpenClaw identity formats
```
## Memory System
ZeroClaw includes a full-stack search engine with zero external dependencies (no Pinecone, Elasticsearch, or LangChain):
- **Vector DB**: Embeddings stored as BLOB in SQLite, cosine similarity search
- **Keyword Search**: FTS5 virtual tables with BM25 scoring
- **Hybrid Merge**: Custom weighted merge function
- **Embeddings**: `EmbeddingProvider` trait OpenAI, custom URL, or noop
- **Chunking**: Line-based markdown chunker with heading preservation
## Security Principles
ZeroClaw enforces security at every layer. Key patterns:
- **Gateway pairing**: 6-digit one-time code required for webhook access
- **Workspace-only execution**: Default sandbox scopes file operations
- **Path traversal blocking**: 14 system dirs + 4 sensitive dotfiles blocked
- **Command allowlisting**: No blocklists only explicit allowlists
- **Secret encryption**: ChaCha20-Poly1305 AEAD for encrypted secrets
- **No logging of secrets**: Never log tokens, keys, or sensitive payloads
Critical security paths: `src/security/`, `src/runtime/`, `src/gateway/`, `src/tools/`, `.github/workflows/`
## Code Naming Conventions
- **Rust standard**: modules/files `snake_case`, types/traits `PascalCase`, functions/variables `snake_case`, constants `SCREAMING_SNAKE_CASE`
- **Domain-first naming**: `DiscordChannel`, `SecurityPolicy`, `SqliteMemory`
- **Trait implementers**: `*Provider`, `*Channel`, `*Tool`, `*Memory`, `*Observer`, `*RuntimeAdapter`
- **Factory keys**: lowercase, stable (`"openai"`, `"discord"`, `"shell"`)
- **Tests**: behavior-oriented (`allowlist_denies_unknown_user`)
- **Identity-like labels**: Use ZeroClaw-native only (`ZeroClawAgent`, `zeroclaw_user`) never real names/personal data
## Architecture Boundary Rules
- Extend via trait implementations + factory registration first
- Keep dependency direction inward: concrete implementations depend on traits/config/util
- Avoid cross-subsystem coupling (e.g., provider importing channel internals)
- Keep modules single-purpose
- Treat config keys as public contract document migrations
## Engineering Principles
From `AGENTS.md` these are mandatory implementation constraints:
1. **KISS** Prefer straightforward control flow over clever meta-programming
2. **YAGNI** Don't add features/config/flags without a concrete use case
3. **DRY + Rule of Three** Extract shared utilities only after repeated stable patterns
4. **SRP + ISP** Keep modules focused; extend via narrow traits
5. **Fail Fast + Explicit Errors** Prefer explicit `bail!`/errors; never silently broaden permissions
6. **Secure by Default + Least Privilege** Deny-by-default for access boundaries
7. **Determinism + Reproducibility** Prefer reproducible commands and locked dependencies
8. **Reversibility + Rollback-First** Keep changes easy to revert
## Adding New Components
### New Provider
1. Create `src/providers/your_provider.rs`
2. Implement `Provider` trait
3. Register factory in `src/providers/mod.rs`
### New Channel
1. Create `src/channels/your_channel.rs`
2. Implement `Channel` trait
3. Register in `src/channels/mod.rs`
### New Tool
1. Create `src/tools/your_tool.rs`
2. Implement `Tool` trait with strict parameter schema
3. Register in `src/tools/mod.rs`
### New Peripheral
1. Create in `src/peripherals/`
2. Implement `Peripheral` trait (exposes `tools()` method)
3. See `docs/hardware-peripherals-design.md` for protocol
## Validation Matrix
Default local checks for code changes:
```bash
cargo fmt --all -- --check
cargo clippy --all-targets -- -D clippy::correctness
cargo test
```
For Docker CI parity (recommended when available):
```bash
./dev/ci.sh all
```
## Risk Tiers by Path
- **Low risk**: docs/chore/tests-only
- **Medium risk**: most `src/**` behavior changes without boundary/security impact
- **High risk**: `src/security/**`, `src/runtime/**`, `src/gateway/**`, `src/tools/**`, `.github/workflows/**`, access-control boundaries
## Important Documentation
- `AGENTS.md` Agent engineering protocol (primary guide for AI contributors)
- `CONTRIBUTING.md` Contribution guide and architecture rules
- `docs/pr-workflow.md` PR workflow and governance
- `docs/reviewer-playbook.md` Reviewer operating checklist
- `docs/ci-map.md` CI ownership and triage
- `docs/hardware-peripherals-design.md` Hardware peripherals protocol
## Pre-push Hook
The repo includes a pre-push hook that runs `fmt`, `clippy`, and `tests` before every push. Enable once with:
```bash
git config core.hooksPath .githooks
```
Skip with `git push --no-verify` during rapid iteration (CI will catch issues).