Files
mortimer/.github/copilot-instructions.md

265 lines
8.9 KiB
Markdown

# GitHub Copilot Instructions - Mortimer Telegram Assistant
## Project Overview
This is a Telegram bot assistant ("@mortimer_assi_bot") built on n8n that provides AI-powered task management, email search, and conversational AI capabilities. The bot is hosted at https://flow.egonetix.de/ and integrates with Nextcloud Deck, IMAP email, and OpenAI.
## Architecture
### n8n Environment
- **Version**: 1.123.5
- **Container**: n8n-new (Docker)
- **Database**: PostgreSQL 15 (container: postgres-n8n)
- **External URL**: https://flow.egonetix.de/
- **API Endpoint**: https://flow.egonetix.de/api/v1/
- **API Key**: n8n_api_42f1838c1e2de90cadcb669f78083de92697a85322c0b6009ad2e55760db992ab0bf61515a3cf0e1
### Telegram Bot
- **Bot Name**: @mortimer_assi_bot
- **Token**: 8506559707:AAGn9dYm2PEuSGMbJ7jtiuIfGbl1ScaCxQk
- **Webhook URL**: https://flow.egonetix.de/webhook/8f3f59db-aaa5-4762-9416-94be04131fd2
- **Credential ID**: 6Rim8odDFpQoHxCM (name: "mortimer")
### Credentials in n8n
- **Telegram API**: 6Rim8odDFpQoHxCM (mortimer) - Used for all Telegram operations
- **OpenAI API**: GPzxHwwXxeZg07o5 - Used for AI classification and chat
## Workflow Structure
### Current Active Workflows (Simplified Architecture)
1. **Telegram Assistant - Receiver** (ID: gDao7SBRyJiIBF7c)
- Purpose: Entry point for all Telegram messages via webhook
- Webhook Path: `/webhook/8f3f59db-aaa5-4762-9416-94be04131fd2`
- Data Flow:
- Receives webhook POST from Telegram
- Checks if message starts with `/` (command vs natural language)
- For commands: Parses command and arguments
- For natural language: Uses OpenAI to classify intent
- Calls Router workflow via webhook
2. **Telegram Router - Direct** (ID: Ys9shWiWlbvxRFh4)
- Purpose: Simplified router that directly sends Telegram responses
- Webhook Path: `/telegram-router-direct`
- Data Flow:
- Receives data from Receiver
- Sends response directly via Telegram API
- No complex respondToWebhook structure
### Planned Workflows (Not Yet Implemented)
3. **telegram-deck.json** - Nextcloud Deck integration
- Purpose: Create tasks in Nextcloud Deck from Telegram commands
- Command: `/deck <task description>`
- Uses: `/home/node/create_card_from_ai.sh` script
4. **telegram-email.json** - IMAP email search
- Purpose: Search emails and return summaries
- Command: `/email <search query>`
5. **telegram-ai.json** - AI chat
- Purpose: General AI conversations
- Command: `/ask <question>`
## Critical Code Patterns
### Webhook Data Structure
**IMPORTANT**: Telegram webhook delivers data directly in `$json`, NOT in `$json.body`:
```javascript
// ✅ CORRECT
const text = $json.message?.text || '';
const chatId = $json.message.chat.id;
const userId = $json.message.from.id;
// ❌ WRONG (common mistake)
const text = $json.body.message.text;
```
### Optional Chaining is Essential
Always use optional chaining (`?.`) when accessing nested webhook properties:
```javascript
// ✅ CORRECT - Won't crash on null/undefined
const text = $input.item.json.message?.text || '';
const username = $input.item.json.message?.from?.username || 'unknown';
// ❌ WRONG - Will crash with "Cannot read properties of undefined"
const text = $input.item.json.message.text;
```
### Credential References
Always use the credential ID `6Rim8odDFpQoHxCM` for Telegram operations:
```json
{
"credentials": {
"telegramApi": {
"id": "6Rim8odDFpQoHxCM",
"name": "mortimer"
}
}
}
```
### Router Architecture Lessons
The simplified Router workflow that works:
- Receives data via webhook (simple HTTP request)
- Directly sends Telegram message using Telegram node
- Does NOT use `respondToWebhook` nodes (they cause "Invalid JSON" errors)
Previous complex Router with `respondToWebhook` structure failed consistently. Keep it simple.
## Testing Patterns
### Direct Telegram API Testing
Test bot responses without manually sending Telegram messages:
```bash
curl -X POST "https://api.telegram.org/bot8506559707:AAGn9dYm2PEuSGMbJ7jtiuIfGbl1ScaCxQk/sendMessage" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "YOUR_CHAT_ID",
"text": "Test message"
}'
```
### Webhook Testing
Test webhook receiver directly:
```bash
curl -X POST "https://flow.egonetix.de/webhook/8f3f59db-aaa5-4762-9416-94be04131fd2" \
-H "Content-Type: application/json" \
-d '{
"message": {
"message_id": 123,
"from": {"id": 123456789, "username": "test"},
"chat": {"id": 123456789},
"text": "/test command"
}
}'
```
### n8n Workflow Import
Import workflows via API (when manual import fails):
```bash
curl -X POST "https://flow.egonetix.de/api/v1/workflows" \
-H "X-N8N-API-KEY: n8n_api_42f1838c1e2de90cadcb669f78083de92697a85322c0b6009ad2e55760db992ab0bf61515a3cf0e1" \
-H "Content-Type: application/json" \
-d @workflow.json
```
## Common Pitfalls and Solutions
### Problem: n8n API Doesn't Apply Changes Exactly
**Symptom**: File edits don't reflect in workflow execution
**Solution**: Delete and recreate the workflow via API, don't just update
### Problem: "Invalid JSON in response body"
**Symptom**: Router workflow fails with JSON parse error
**Solution**: Remove `respondToWebhook` nodes, use direct Telegram send instead
### Problem: JavaScript Errors - "Cannot read properties of undefined"
**Symptom**: Workflow crashes on webhook data access
**Solution**: Add optional chaining (`?.`) to all nested property access
### Problem: Polling Trigger Interferes with Webhook
**Symptom**: Multiple workflows respond to same message
**Solution**: Delete all workflows with Telegram polling triggers, use only webhook
### Problem: Wrong Credential ID
**Symptom**: "Credentials not found" errors
**Solution**: Always use `6Rim8odDFpQoHxCM`, update all references in workflow JSON
### Problem: Workflow Not Found After Import
**Symptom**: Workflow shows in UI but API can't find it
**Solution**: Activate the workflow, check if it's in correct project/folder
## Database Direct Access
For emergency fixes or debugging:
```bash
# Connect to PostgreSQL
docker exec -it postgres-n8n psql -U n8n -d n8n
# List all workflows
SELECT id, name, active FROM workflow_entity;
# Find credential ID by name
SELECT id, name FROM credentials_entity WHERE name = 'mortimer';
# Delete workflow by ID (permanent)
DELETE FROM workflow_entity WHERE id = 'OLD_WORKFLOW_ID';
```
## Development Workflow
1. **Make Changes**: Edit workflow JSON files in `/home/icke/assistant/workflows/`
2. **Test Locally**: Validate JSON syntax, check credential IDs
3. **Import to n8n**: Use API to import or update workflow
4. **Activate**: Ensure workflow is activated in n8n UI
5. **Test Webhook**: Use curl to send test payload
6. **Verify**: Check execution logs in n8n UI
7. **Commit**: Git commit and push to Gitea
## File Structure
```
/home/icke/assistant/
├── .github/
│ └── copilot-instructions.md (this file)
├── workflows/
│ ├── telegram-receiver.json (active)
│ ├── telegram-router.json (deprecated)
│ ├── telegram-deck.json (planned)
│ ├── telegram-email.json (planned)
│ └── telegram-ai.json (planned)
├── README.md
├── SETUP_COMPLETE.md
├── N8N_UPGRADE_LESSONS_2025-12-03.md
├── NATURAL_LANGUAGE_UPDATE.md
└── import_workflows.sh
```
## Quick Reference
### Import All Workflows
```bash
cd /home/icke/assistant
./import_workflows.sh
```
### Configure Telegram Webhook
```bash
curl -X POST "https://api.telegram.org/bot8506559707:AAGn9dYm2PEuSGMbJ7jtiuIfGbl1ScaCxQk/setWebhook" \
-H "Content-Type: application/json" \
-d '{"url": "https://flow.egonetix.de/webhook/8f3f59db-aaa5-4762-9416-94be04131fd2"}'
```
### Check Webhook Status
```bash
curl "https://api.telegram.org/bot8506559707:AAGn9dYm2PEuSGMbJ7jtiuIfGbl1ScaCxQk/getWebhookInfo"
```
## AI Agent Guidelines
When working on this project:
1. **Always test autonomously** - Use curl for testing, don't rely on manual Telegram messages
2. **Trust the architecture** - Simplified 2-workflow system is working, don't overcomplicate
3. **Use optional chaining everywhere** - Webhook data can be null at any level
4. **Verify credentials first** - Wrong credential ID is the most common issue
5. **Check execution logs** - n8n UI shows detailed execution data
6. **Delete when stuck** - If API won't update workflow, delete and recreate
7. **Document changes** - Update README.md with any architectural changes
## Current Status (as of 2025-12-19)
**Working**: Receiver → Router → Telegram response flow
**Working**: Command parsing and natural language detection
**Working**: Telegram webhook integration
⚠️ **Pending**: Deck, Email, and AI command implementations
⚠️ **Pending**: Full error handling and logging
⚠️ **Pending**: User authentication/authorization
## External Resources
- n8n Documentation: https://docs.n8n.io/
- Telegram Bot API: https://core.telegram.org/bots/api
- n8n Community: https://community.n8n.io/
- Project Gitea: http://gitea.egonetix.de:3000/root/mortimer