botserver/PROMPT.md
Rodrigo Rodriguez (Pragmatismo) 9f3af41566 Remove obsolete CAPS.md documentation files
Deleted planning/tracking documents that are no longer needed:
- MISSING_IMPLEMENTATIONS.md (all 5 apps now implemented)
- GAP_ANALYSIS.md (analysis complete, implemented)
- IMPLEMENTATION_SUMMARY.md (implementations done)
- LIBRARY_MIGRATION.md (migration guide)
- ROADMAP.md (feature planning)
- START_CODING_PROMPT.md (coding guide)
- CHANGELOG.md (version history)
- templates/TEMPLATE_PLAN.md (template planning)
- templates/integration/public-apis.gbai/KEYWORDS_CHECKLIST.md
- templates/integration/public-apis.gbai/QUICKSTART.md
- botlib/VERSION.md (version history)

Kept: README.md, PROMPT.md, and SUMMARY.md (mdbook structure)
2025-12-04 12:28:05 -03:00

373 lines
No EOL
9 KiB
Markdown

# BotServer Development Prompt Guide
**Version:** 6.1.0
**Purpose:** Consolidated LLM context for BotServer development
---
## Project Overview
BotServer is the core backend for General Bots - an open-source conversational AI platform built in Rust. It provides:
- **Bootstrap System**: Auto-installs PostgreSQL, MinIO, Redis, LLM servers
- **Package Manager**: Manages bot deployments and service lifecycle
- **BASIC Interpreter**: Executes conversation scripts via Rhai
- **Multi-Channel Support**: Web, WhatsApp, Teams, Email
- **Knowledge Base**: Document ingestion with vector search
### Workspace Structure
```
botserver/ # Main server (this project)
botlib/ # Shared library - types, utilities, HTTP client
botui/ # Web/Desktop UI (Axum + Tauri)
botapp/ # Desktop app wrapper (Tauri)
botbook/ # Documentation (mdBook)
botmodels/ # Data models visualization
botplugin/ # Browser extension
```
---
## Code Generation Rules
### CRITICAL REQUIREMENTS
```
- KISS, NO TALK, SECURED ENTERPRISE GRADE THREAD SAFE CODE ONLY
- Use rustc 1.90.0 (1159e78c4 2025-09-14)
- No placeholders, never comment/uncomment code, no explanations
- All code must be complete, professional, production-ready
- REMOVE ALL COMMENTS FROM GENERATED CODE
- Always include full updated code files - never partial
- Only return files that have actual changes
- DO NOT WRITE ERROR HANDLING CODE - LET IT CRASH
- Return 0 warnings - review unused imports!
```
### Rust Patterns
```rust
// Use rand::rng() instead of rand::thread_rng()
let mut rng = rand::rng();
// Use diesel for database (NOT sqlx)
use diesel::prelude::*;
// All config from AppConfig - no hardcoded values
let url = config.drive.endpoint.clone(); // NOT "api.openai.com"
// Logging (all-in-one-line, unique messages)
info!("Processing request id={} user={}", req_id, user_id);
debug!("Cache hit for key={}", key);
trace!("Raw response bytes={}", bytes.len());
```
### BotServer Specifics
```
- Sessions MUST be retrieved by id when session_id is present
- Never suggest installing software - bootstrap/package_manager handles it
- Configuration stored in .gbot/config and database bot_configuration table
- Pay attention to shared::utils and shared::models for reuse
```
---
## Adding New Features
### Adding a Rhai Keyword
```rust
// 1. Define enum (Rust-only, NOT in database)
#[repr(i32)]
pub enum TriggerKind {
Scheduled = 0,
TableUpdate = 1,
TableInsert = 2,
}
// 2. Register keyword with engine
pub fn my_keyword(state: &AppState, engine: &mut Engine) {
let db = state.db_custom.clone();
engine.register_custom_syntax(
["MY", "KEYWORD", "$expr$"],
true,
{
let db = db.clone();
move |context, inputs| {
let value = context.eval_expression_tree(&inputs[0])?;
let binding = db.as_ref().unwrap();
let fut = execute_my_keyword(binding, value);
let result = tokio::task::block_in_place(||
tokio::runtime::Handle::current().block_on(fut))
.map_err(|e| format!("DB error: {}", e))?;
Ok(Dynamic::from(result))
}
}
).unwrap();
}
// 3. Async execution with diesel
pub async fn execute_my_keyword(
pool: &PgPool,
value: String,
) -> Result<Value, Box<dyn std::error::Error>> {
info!("Executing my_keyword value={}", value);
use diesel::prelude::*;
let result = diesel::insert_into(my_table::table)
.values(&NewRecord { value })
.execute(pool)?;
Ok(json!({ "rows_affected": result }))
}
```
### Adding a Data Model
```rust
use chrono::{DateTime, Utc};
use diesel::prelude::*;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Queryable, Selectable, Insertable, Serialize, Deserialize)]
#[diesel(table_name = crate::schema::users)]
#[diesel(check_for_backend(diesel::pg::Pg))]
pub struct User {
pub id: Uuid,
pub status: i16, // Use i16 for enum storage
pub email: String,
pub age: Option<i16>, // Nullable fields
pub metadata: Vec<u8>, // Binary data
pub created_at: DateTime<Utc>,
}
```
### Adding a Service/Endpoint
```rust
use axum::{routing::{get, post}, Router, Json, extract::State};
pub fn configure() -> Router<AppState> {
Router::new()
.route("/api/resource", get(list_handler))
.route("/api/resource", post(create_handler))
}
async fn list_handler(
State(state): State<Arc<AppState>>,
) -> Json<Vec<Resource>> {
let conn = state.conn.get().unwrap();
let items = resources::table.load::<Resource>(&conn).unwrap();
Json(items)
}
async fn create_handler(
State(state): State<Arc<AppState>>,
Json(payload): Json<CreateRequest>,
) -> Json<Resource> {
let conn = state.conn.get().unwrap();
let item = diesel::insert_into(resources::table)
.values(&payload)
.get_result(&conn)
.unwrap();
Json(item)
}
```
---
## LLM Workflow Strategy
### Development Process
1. **One requirement at a time** with sequential commits
2. **Start with docs** - explain user behavior before coding
3. **Design first** - spend time on architecture
4. **On unresolved error** - stop and consult with web search enabled
### LLM Fallback Strategy (After 3 attempts / 10 minutes)
1. DeepSeek-V3-0324 (good architect, reliable)
2. gpt-5-chat (slower but thorough)
3. gpt-oss-120b (final validation)
4. Claude Web (for complex debugging, unit tests, UI)
### Final Steps Before Commit
```bash
# Remove warnings
cargo check 2>&1 | grep warning
# If many warnings, add #[allow(dead_code)] temporarily
# Then fix properly in dedicated pass
# Final validation
cargo build --release
cargo test
```
---
## Output Format
### Shell Script Format
When returning code changes, use this exact format:
```sh
#!/bin/bash
cat > src/module/file.rs << 'EOF'
use std::io;
pub fn my_function() -> Result<(), io::Error> {
Ok(())
}
EOF
cat > src/another_file.rs << 'EOF'
pub fn another() {
println!("Hello");
}
EOF
```
### Rules
- Only return MODIFIED files
- Never return unchanged files
- Use `cat > path << 'EOF'` format
- Include complete file content
- No partial snippets
---
## Error Fixing Guide
When fixing Rust compiler errors:
1. **Respect Cargo.toml** - check dependencies, editions, features
2. **Type safety** - ensure all types match, trait bounds satisfied
3. **Ownership rules** - fix borrowing, ownership, lifetime issues
4. **Only return input files** - other files already exist
Common errors to check:
- Borrow of moved value
- Unused variable
- Use of moved value
- Missing trait implementations
---
## Documentation Style
When writing documentation:
- Be pragmatic and concise with examples
- Create both guide-like and API-like sections
- Use clear and consistent terminology
- Ensure consistency in formatting
- Follow logical flow
- Relate to BASIC keyword list where applicable
---
## SVG Diagram Guidelines
For technical diagrams:
```
- Transparent background
- Width: 1040-1400px, Height: appropriate for content
- Simple colored borders (no fill, stroke-width="2.6")
- Font: Arial, sans-serif
- Dual-theme support with CSS classes
- Colors: Blue #4A90E2, Orange #F5A623, Purple #BD10E0, Green #7ED321
- Rounded rectangles (rx="6.5")
- Font sizes: 29-32px titles, 22-24px labels, 18-21px descriptions
```
---
## IDE Integration Rules
```
- Return identifiers/characters in English language only
- Do not emit any comments, remove existing ones
- Compact code emission where possible
- Ensure cargo check cycle removes warnings
- Never use defaults or magic values
- Check borrow, clone, types - return 0 warning code!
```
---
## Key Files Reference
```
src/main.rs # Entry point, bootstrap, Axum server
src/lib.rs # Module exports, feature gates
src/core/
bootstrap/mod.rs # Auto-install services
session/mod.rs # Session management
bot/mod.rs # Bot orchestration
config/mod.rs # Configuration management
package_manager/ # Service lifecycle
src/basic/ # BASIC/Rhai interpreter
src/shared/
state.rs # AppState definition
utils.rs # Utility functions
models.rs # Database models
```
---
## Dependencies (Key Libraries)
| Library | Version | Purpose |
|---------|---------|---------|
| axum | 0.7.5 | Web framework |
| diesel | 2.1 | PostgreSQL ORM |
| tokio | 1.41 | Async runtime |
| rhai | git | BASIC scripting |
| reqwest | 0.12 | HTTP client |
| serde | 1.0 | Serialization |
| askama | 0.12 | Templates |
---
## Testing Commands
```bash
# Build
cargo build
# Check warnings
cargo check
# Run tests
cargo test
# Run with features
cargo run --features "console,llm,drive"
# Audit dependencies
cargo audit
```
---
## Remember
- **Sessions**: Always retrieve by ID when present
- **Config**: Never hardcode values, use AppConfig
- **Bootstrap**: Never suggest manual installation
- **Database**: Use diesel, not sqlx
- **Logging**: Unique messages, appropriate levels
- **Warnings**: Target zero warnings before commit