diff --git a/AGENTS.md b/AGENTS.md index 2ea64ba..d066721 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -105,6 +105,19 @@ tail -f botserver.log botui.log ./restart.sh ``` +### ⚠️ NEVER Run Binary Directly +- ❌ **NEVER** run `/opt/gbo/bin/botserver` or `./target/debug/botserver` directly on any system +- ❌ **NEVER** execute the binary with `su - gbuser -c '/opt/gbo/bin/botserver'` or similar +- ✅ **ALWAYS** use `systemctl` for service management: + ```bash + systemctl status botserver + systemctl start botserver + systemctl stop botserver + systemctl restart botserver + journalctl -u botserver -f + ``` +- ✅ **For diagnostics**: Use `journalctl -u botserver --no-pager -n 50` or check `/opt/gbo/logs/stdout.log` + ### Reset Verification After reset completes, verify: - ✅ PostgreSQL running (port 5432) @@ -351,25 +364,123 @@ CARGO_BUILD_JOBS=1 cargo check -p botserver 2>&1 | tail -200 ## 🎭 Playwright Browser Testing - YOLO Mode -**When user requests to start YOLO mode with Playwright:** +### Browser Setup & Troubleshooting -1. **Start the browser** - Use `mcp__playwright__browser_navigate` to open http://localhost:3000/{botname} -2. **Take snapshot** - Use `mcp__playwright__browser_snapshot` to see current page state -3. **Test user flows** - Use click, type, fill_form, etc. -4. **Verify results** - Check for expected content, errors in console, network requests -5. **Validate backend** - Check database and services to confirm process completion -6. **Report findings** - Always include screenshot evidence with `browser_take_screenshot` +**If browser keeps closing or fails to connect:** +1. Kill all leftover browser processes: `pkill -9 -f brave; pkill -9 -f chrome; pkill -9 -f chromium; pkill -9 -f mcp-chrome` +2. Wait 3 seconds for cleanup +3. Navigate again with `mcp__playwright__browser_navigate` -**⚠️ IMPORTANT - Desktop UI Navigation:** +**Bot-Specific Testing URL Pattern:** +- Dev: `http://localhost:3000/` +- Prod chat: `https://chat..com/` + +### Complete Bot Tool Testing Workflow + +**Step 1: Navigate and Verify Initial State** +``` +1. mcp__playwright__browser_navigate → open the bot chat URL +2. mcp__playwright__browser_snapshot → see the page state +3. Verify: Welcome message appears, suggestion buttons render correctly +4. Check: Portuguese accents display correctly (ç, ã, é, õ, etc.) +``` + +**Step 2: Interact with the Bot** +``` +1. Click a suggestion button (e.g., "Fazer Inscrição") +2. Wait for bot response: mcp__playwright__browser_wait_for (3-5 seconds) +3. Take snapshot to see bot's reply +4. Fill in the requested data via textbox: + - mcp__playwright__browser_type with all required fields + - Set submit: true to send the message +5. Wait for response: mcp__playwright__browser_wait_for (5-8 seconds) +6. Take snapshot to see confirmation/next step +7. If bot asks for confirmation, type confirmation and submit +8. Wait and take final snapshot to see success message +``` + +**Step 3: Verify Data Was Saved to Database** +```bash +# Connect to the tables container and query the bot's database +ssh "sudo incus exec tables -- psql -h 127.0.0.1 -U postgres -d bot_ -c \" +SELECT * FROM ORDER BY dataCadastro DESC LIMIT 5; +\"" + +# Verify: +# - New record exists with correct data +# - All fields match what was entered in the chat +# - Timestamp is recent +# - Status is correct (e.g., AGUARDANDO_ANALISE) +``` + +**Step 4: Verify Backend Logs** +```bash +# Check botserver logs for the interaction +ssh "sudo incus exec system -- tail -50 /opt/gbo/logs/stdout.log | grep -iE '||SAVE|inscricao'" + +# Check for any errors +ssh "sudo incus exec system -- tail -20 /opt/gbo/logs/err.log | grep -iE 'panic|error|fail' | grep -v Qdrant" +``` + +**Step 5: Report Findings** +- Take screenshot with `mcp__playwright__browser_take_screenshot` (save to `.playwright-mcp/` directory) +- Show the database record that was created +- Confirm the full flow worked: UI → Bot processing → Database save + +### ⚠️ IMPORTANT - Desktop UI Navigation: - The desktop may have a maximized chat window covering other apps - To access CRM/sidebar icons, click the **middle button** (restore/down arrow) in the chat window header to minimize it - Or navigate directly via URL: http://localhost:3000/suite/crm (after login) -**Bot-Specific Testing URL Pattern:** -`http://localhost:3000/` +### WhatsApp Testing via Playwright -**Backend Validation Checks:** -After UI interactions, validate backend state via `psql` or `tail` logs. +**Important: WhatsApp webhook is GLOBAL** - a single endpoint serves all bots. Bot routing is done by typing the bot name as the first message. + +**Setup:** +1. Get WhatsApp verify token from default bot: `cat /opt/gbo/data/default.gbai/default.gbot/config.csv | grep whatsapp-verify-token` +2. The webhook endpoint is `/webhook/whatsapp/:bot_id` but routing is automatic via bot name + +**Complete WhatsApp Test Workflow:** + +**Step 1: Open WhatsApp Web** +``` +1. mcp__playwright__browser_navigate → https://web.whatsapp.com/ +2. mcp__playwright__browser_snapshot → verify WhatsApp loaded +3. Find the "General Bots" chat (the shared WhatsApp business number) +``` + +**Step 2: Activate the Bot (Critical!)** +``` +1. Click the General Bots chat +2. Type the bot name (e.g., "salesianos") and press Enter +3. Wait 5-10 seconds for the bot to respond +4. mcp__playwright__browser_snapshot → see the bot's welcome message +``` + +**Step 3: Interact with the Bot** +``` +1. Type your request (e.g., "Quero fazer inscrição") +2. Wait for bot response: mcp__playwright__browser_wait_for (5-8 seconds) +3. Take snapshot to see bot's reply +4. Fill in requested data when prompted +5. Confirm when bot asks +6. Wait for success message with protocol number +``` + +**Step 4: Verify Backend** +```bash +# Check prod logs for WhatsApp activity +ssh "sudo incus exec system -- tail -50 /opt/gbo/logs/stdout.log | grep -iE 'whatsapp|salesianos|routing|message'" + +# Check database for saved data +ssh "sudo incus exec tables -- psql -h 127.0.0.1 -U postgres -d bot_ -c \"SELECT * FROM ORDER BY dataCadastro DESC LIMIT 1;\"" +``` + +**Key differences from web chat:** +- No suggestion buttons - user must type everything +- Must type bot name FIRST to activate routing +- Single WhatsApp number serves ALL bots +- Bot routing uses `whatsapp-id` config in each bot's config.csv --- diff --git a/Cargo.lock b/Cargo.lock index faeb9bd..bccb112 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1332,7 +1332,7 @@ dependencies = [ [[package]] name = "botserver" -version = "6.3.0" +version = "6.3.1" dependencies = [ "aes-gcm", "anyhow", @@ -1414,6 +1414,7 @@ dependencies = [ "tower-http", "tracing", "umya-spreadsheet", + "ureq", "url", "urlencoding", "uuid", @@ -4234,7 +4235,7 @@ dependencies = [ "tokio", "tokio-rustls 0.26.4", "tower-service", - "webpki-roots", + "webpki-roots 1.0.6", ] [[package]] @@ -7499,7 +7500,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams 0.4.2", "web-sys", - "webpki-roots", + "webpki-roots 1.0.6", ] [[package]] @@ -10030,6 +10031,24 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "ureq" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" +dependencies = [ + "base64 0.22.1", + "flate2", + "log", + "once_cell", + "rustls 0.23.36", + "rustls-pki-types", + "serde", + "serde_json", + "url", + "webpki-roots 0.26.11", +] + [[package]] name = "url" version = "2.5.8" @@ -10384,6 +10403,15 @@ dependencies = [ "system-deps", ] +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.6", +] + [[package]] name = "webpki-roots" version = "1.0.6"