Agent Zero
cf75680583
Unified contacts model: Rentman-style type field (company/person), inline addresses, ContactPerson 1:N, all Rentman fields except rental-specific
2026-07-19 21:12:49 +02:00
Agent Zero
dc24c37c19
feat: use OpenRouter for embeddings with text-embedding-3-small (768 dims)
...
- Ollama Cloud has no embedding endpoint, OpenRouter does
- text-embedding-3-small with dimensions=768 matches DB vector(768) column
- API_KEY_OPENROUTER env var is primary, DB provider is fallback
- Added dimensions parameter for text-embedding-3 models
2026-07-19 19:21:49 +02:00
Agent Zero
5db7364071
fix: increase max_tokens for LLM suggestions to prevent truncated JSON
2026-07-19 02:32:39 +02:00
Agent Zero
5c3fc027bc
fix: strip markdown code fences from LLM responses before json.loads
...
- glm-5.2 returns JSON wrapped in ```json ... ``` code fences
- Added fence stripping in services.py, query_understanding.py, jobs.py
2026-07-19 02:30:07 +02:00
Agent Zero
4a43745b50
fix: unified_search + ai_proactive get API key from DB, fix model names for Ollama Cloud
...
- query_understanding.py: get API key/base_url/provider_type from ai_providers DB
- embedding.py: get API key from DB, pass db+tenant_id through call chain
- routes.py: pass db+tenant_id to llm_analyze_query and llm_aggregate_results
- search_engine.py: pass db+tenant_id to generate_embedding
- unified_search/jobs.py: pass db+tenant_id to generate_embedding
- Fix all default model names: ollama/deepseek-v4 -> ollama/deepseek-v4-flash
- Ollama Cloud has no embedding endpoint; embedding calls fail gracefully
2026-07-19 02:22:25 +02:00
Agent Zero
ef4f0cc494
fix: use provider_type for model prefix and base_url for Ollama Cloud
...
- _get_llm_api_key now returns provider_type
- Model string built with provider_type prefix (openai/deepseek-v4 instead of ollama/deepseek-v4)
- api_base set from provider.base_url (https://ollama.com/v1 )
- Fixes: litellm tried localhost:11434 instead of Ollama Cloud
2026-07-19 01:51:14 +02:00
Agent Zero
7f8344bc24
fix: get LLM API key from DB instead of env var
...
- ai_proactive now reads API key from ai_providers table (like ai_assistant)
- Falls back to API_KEY_OLLAMA_CLOUD env var if no provider found
- Fixes: proactive engine could not generate suggestions because API key was empty
2026-07-19 01:36:16 +02:00
Agent Zero
b1153e0c54
fix: add updated_at columns to ai_proactive migration
...
- ai_proactive_suggestions: add updated_at TIMESTAMPTZ
- ai_proactive_context_log: add updated_at TIMESTAMPTZ
TenantMixin inherits TimestampMixin which expects both created_at and updated_at.
Missing updated_at caused 500 errors on /ai-proactive/context POST.
2026-07-18 18:22:16 +02:00
Agent Zero
df82796023
fix: add deleted_at columns to ai_proactive migration
...
- ai_proactive_suggestions: add deleted_at TIMESTAMPTZ
- ai_proactive_context_log: add deleted_at TIMESTAMPTZ
- ai_proactive_settings: add deleted_at TIMESTAMPTZ
ORM models expect deleted_at for soft-delete support.
2026-07-18 16:18:45 +02:00
Agent Zero
8cebb4f4e9
feat: unified_search + ai_proactive plugins with Ollama Cloud DeepSeek V4
...
- unified_search: Hybride Suche (PostgreSQL FTS + pgvector + RRF Fusion)
- 5 Search Providers (Contact, Company, Mail, File, Event)
- KI Query Understanding (Fuzzy, Facetten via LiteLLM)
- DMS Text-Extraction (PDF, DOCX, XLSX, PPTX)
- Embedding Pipeline (ollama/nomic-embed-text, 768 Dim)
- Background Jobs für Indexierung
- Plugin-basierte Provider Registry
- ai_proactive: Proaktiver KI-Agent
- Context-Tracking (Frontend → Backend → Event Bus)
- Proactive Engine mit LLM Suggestion-Generierung
- SSE Real-time Push an Frontend
- 6 AI Tools für Tool Registry
- Rate-Limiting + User Settings
- Deep Analysis Background Jobs
- Frontend Integration:
- useAIContext Hook, SuggestionSidebar, SuggestionBadge
- ProactiveAISettings Page, Search API Client
- Globale Suche auf neue API umgestellt
- Tests: test_unified_search.py + test_ai_proactive.py (alle bestanden)
- Config: Ollama Cloud DeepSeek V4 als Default, konfigurierbar
- Dependencies: PyMuPDF, python-docx, python-pptx, pgvector
- Bugfixes: notification type_key length, migration IF NOT EXISTS
2026-07-18 11:21:51 +02:00
Agent Zero
db433e81f1
feat: mail UI improvements - folder mapping, display name, resize perf, list header
...
- Add configurable folder mapping (sent/drafts/spam/trash) per account
- Migration 0005_folder_mapping.sql with 4 new columns on mail_accounts
- Backend: send_mail uses account.sent_folder_imap_name if set
- Backend: _build_folder_hierarchy respects folder_mapping for is_standard
- Frontend: MailSettings shows folder mapping editor per account
- Frontend: MailSettings allows editing display_name for existing accounts
- Frontend: MailFolderTree shows display_name || email, removes MailIcon
- Frontend: ResizablePanel isDragging state with contain:strict + pointer-events:none
- Frontend: MailList merges select-all and sort controls into one line
2026-07-17 23:17:52 +02:00
Agent Zero
04c419402b
fix: increase MAX_EMAILS_PER_FOLDER to 2000 for complete sync
2026-07-17 23:02:53 +02:00
Agent Zero
153e7f0d23
fix: increase MAX_EMAILS_PER_FOLDER from 50 to 500 for full sync
2026-07-17 23:00:22 +02:00
Agent Zero
c6364d40e6
fix: mail sync duplicates, sent folder, delimiter detection, folder move tracking
...
- Add imap_uid column + unique index for proper deduplication
- Use deterministic message_id for emails without Message-ID header
- Dedup by (account_id, folder_id, imap_uid) first, message_id fallback
- Track folder moves: update folder_id when email appears in different folder
- Fix Sent folder lookup: check Sent/INBOX.Sent/Sent Items/Sent Mail + ILIKE
- Detect IMAP delimiter from LIST response instead of hardcoding dot
- Use detected delimiter in stale folder name migration
- Migration 0004_imap_uid.sql with imap_uid column and unique index
2026-07-17 22:50:02 +02:00
Agent Zero
3fc4dcdb96
fix: add folder_id and sort_order to AIChatSession model, fix UUID conversion in routes, add migration 0003
2026-07-17 21:20:49 +02:00
Agent Zero
70b8a66fd4
feat: attachment context for LLM, markdown rendering, mobile layout with back arrow
2026-07-17 13:45:21 +02:00
Agent Zero
9a29206190
feat: chat folders, attachments, treeview backend - migration, models, routes
2026-07-17 09:15:39 +02:00
Agent Zero
50650f5b17
fix: always add provider prefix to litellm model string
2026-07-17 01:48:08 +02:00
Agent Zero
561d1919f5
fix: add deleted_at columns to AI Assistant migration SQL
2026-07-17 01:08:13 +02:00
Agent Zero
8255704ff9
fix: add missing AIPreset import in routes.py
2026-07-17 01:06:08 +02:00
Agent Zero
26feadf179
AI Assistant plugin: backend with LiteLLM, agents, tools, streaming chat
2026-07-17 00:45:24 +02:00
Agent Zero
2278ec2722
fix(mail): robust MIME filename decoding with fallback for attachments
...
- Add _decode_mime_filename() helper with Q-encoding fallback decoder
- Use helper for both new and existing email attachment saving
- Handles edge cases where email.header.decode_header fails on partially processed filenames
2026-07-16 23:30:13 +02:00
Agent Zero
0c310c5028
fix(mail): decode MIME-encoded attachment filenames during sync
...
- Decode =?utf-8?q?...?= filenames before sanitizing for both new and existing emails
- Prevents filenames like __utf-8_q_Wire_236095209372_2Epdf_2Ehtml__
- Uses email.header.decode_header + make_header for proper decoding
2026-07-16 23:23:27 +02:00
Agent Zero
881f4817be
fix(mail): save attachments for existing emails during sync
...
- IMAP sync now saves attachments for existing emails that have has_attachments=true
but no attachment records in the database (retroactive attachment saving)
- Replace silent exception catching with logger.warning for attachment save failures
- Add logging module import and logger instance
- This fixes the issue where 62 emails had has_attachments=true but 0 attachment records
2026-07-16 23:08:37 +02:00
Agent Zero
2a80aeb0af
fix(mail): sync Object error, MIME subject decoding, sticky compact pagination
...
- Fix sync error: backend returns {synced, error?} not {success, synced_count}; frontend now checks error field
- Decode MIME encoded-words (=?UTF-8?Q?...?=) in backend during IMAP sync for subject/from/to/cc headers
- Add frontend decodeMimeHeader() utility for already-stored encoded subjects (MailList + MailDetail)
- Make pagination sticky at bottom of mail list (flex-col h-full, ul scrolls, pagination flex-shrink-0)
- Make pagination compact: smaller padding (px-1.5 py-0.5), text-xs, smaller icons, tighter spacing
2026-07-16 09:40:59 +02:00
Agent Zero
a4560344c9
feat: phase 5 - mail plugin RBAC integration with delegate access levels (read/write/delete/full)
2026-07-16 00:34:36 +02:00
Agent Zero
b0e987f790
feat: notification preferences system with plugin registry
...
- Add NotificationType and NotificationPreference models
- Add get_notification_types() to BasePlugin for plugin registration
- Add sync_notification_types() to PluginRegistry
- Update create_notification() to check user preferences (returns Notification|None)
- Add API endpoints: GET /types, GET /preferences, PATCH /preferences/{type_key}
- Add NotificationPreferenceUpdate schema
- Mail plugin registers 10 notification types with metadata
- Add Alembic migration 0017 for new tables + seed data
- Frontend: SettingsNotifications page with toggle switches
- Frontend: Settings tab, route, hooks for notification preferences
- i18n: notification settings keys (de/en)
2026-07-15 21:00:32 +02:00
Agent Zero
c4d0ec6f7f
feat: mail notification integration - 10 notification types
...
- mail_new: new mails during sync (max 10, then summary)
- mail_error: IMAP connection failure
- mail_auth: IMAP login failure
- mail_quota: mailbox quota >80% / >95% critical
- mail_sync_error: general sync failure per account
- mail_sent: mail sent confirmation
- mail_send_error: SMTP send failure
- mail_draft: draft saved confirmation
- mail_account: account inactive warning
- mail_folder: folder created/deleted confirmation
- All notifications non-critical (try/except wrapped)
- Import create_notification from app.core.notifications
2026-07-15 20:41:57 +02:00
Agent Zero
f1a12092a0
feat: mail phase 4 - IMAP folder create/delete + auto-sync
...
- Add imap_create_folder() and imap_delete_folder() service functions
- Call IMAP CREATE/DELETE in folder create/delete endpoints
- Add auto_sync_all_accounts() background task (every 5 min)
- Start auto-sync loop on plugin activation via asyncio.create_task
- Frontend: working sync button with isSyncing state and toast feedback
- i18n: syncSuccess, syncFailed, syncing, autoSyncEnabled keys (de/en)
2026-07-15 20:28:11 +02:00
Agent Zero
4e100e9d33
feat: mail phase 3 - sorting (date/from/subject, asc/desc)
...
- Add sort_by and sort_order query params to list_mails endpoint
- Add deleted_at IS NULL filter to exclude soft-deleted mails
- Frontend: sort state in Mail.tsx, sort header bar in MailList
- Sort dropdown (Datum/Absender/Betreff) + asc/desc toggle
- fetchMails API accepts optional sortBy/sortOrder params
- i18n: 6 new sort keys (de/en)
2026-07-15 20:17:27 +02:00
Agent Zero
ed1eec87dc
feat: mail phase 2 - delete, move, drafts
...
- Add deleted_at field to Mail/MailAccount/MailFolder models
- Add DELETE /{mail_id} endpoint (soft-delete + IMAP EXPUNGE)
- Add POST /{mail_id}/move endpoint (IMAP UID MOVE + folder_id update)
- Add POST /drafts and PUT /drafts/{id} endpoints (save/edit drafts)
- Add imap_delete_mail() and imap_move_mail() service functions
- Add save_draft() and update_draft() service functions
- Frontend: deleteMail, moveMail, saveDraft, updateDraft API functions
- ComposeModal: draft mode with Save Draft button
- MailDetail: delete/move buttons, edit-draft for drafts
- Mail.tsx: bulk delete/move, move dropdown, draft handlers
- i18n: 13 new keys (de/en)
2026-07-15 19:44:46 +02:00
Agent Zero
df83cee10c
feat: mail phase 1 - HTML iframe display, bulk read/unread, IMAP flag sync
...
- Fix FlagUpdatePayload field names to match backend schema (is_seen/is_flagged)
- Replace dangerouslySetInnerHTML with sandboxed iframe (srcDoc, sandbox="")
- Add bulk mark read/unread with checkbox selection in MailList
- Add floating bulk action bar in Mail.tsx
- Add imap_sync_mail_flags() to push Seen/Flagged flags to IMAP server
- Call IMAP flag sync in PATCH /flags endpoint
- Add i18n keys for bulk actions (de/en)
2026-07-15 19:26:37 +02:00
Agent Zero
2108bdb9c2
feat: mail attachment support — sync, display, download, upload
2026-07-15 18:43:38 +02:00
Agent Zero
57b6df5357
fix: IMAP hierarchical folder sync, deduplication, folder tree display, resizable panel
2026-07-15 15:59:04 +02:00
Agent Zero
e0975f4044
fix: mail UI German labels, multi-folder sync, account management, resizable panel fix
2026-07-15 14:36:45 +02:00
Agent Zero
6b6408fd25
fix: mail response fields - arrays for addresses, add from_name/body_html/sanitized_html/date
...
- to_addresses/cc_addresses/bcc_addresses now returned as arrays
- Added from_name, body_html, sanitized_html, date fields for frontend compatibility
2026-07-15 08:42:37 +02:00
Agent Zero
be8a95995b
fix: IMAP sync response parsing - extract bytearray from response lines
...
- aioimaplib returns bytes/bytearray lines, not tuples
- Find bytearray line containing the raw email data
2026-07-15 02:20:02 +02:00
Agent Zero
78478db625
fix: IMAP sync uid_fetch and response parsing
...
- Replace client.uid_fetch() with client.uid("fetch", ...) (aioimaplib API)
- Fix response parsing for aioimaplib Response object structure
2026-07-15 02:14:01 +02:00
leocrm-bot
6710480527
feat: report_generator core plugin — Jinja2 templates, CSV/Excel/JSON output, 8 API endpoints
2026-07-08 23:50:59 +02:00
leocrm-bot
bb4b0ce514
feat: Core Plugin system — is_core flag, topological sort dependency resolution, deactivation protection
2026-07-07 07:44:02 +02:00
Leopoldadmin
18a0861a96
fix(plugin): discover MailPlugin in builtins __init__
...
Bug 1: MailPlugin was missing from imports and __all__, preventing
the plugin registry from discovering the mail plugin at startup.
2026-07-03 16:19:04 +00:00
leocrm-bot
f646c597dc
T06: Mail plugin backend — IMAP/SMTP, threading, templates, rules, PGP, vacation, delegates — 46 tests, 74.56% coverage
...
- 14 SQLAlchemy models (mail_accounts, mail_folders, mails, attachments, labels, rules, templates, signatures, etc.)
- AES-256 encrypted credential storage
- IMAP sync service (ARQ-ready, sync trigger endpoint)
- SMTP send/reply/forward service
- Mail rule engine (condition matching → move/label/flag/forward)
- Vacation auto-reply with dedup (vacation_sent_log)
- PGP integration (key import, encrypt/decrypt, contact public keys)
- Shared mailboxes with delegate access + send permissions
- HTML sanitization (nh3)
- Full-text search (ILIKE fallback, tsvector-ready)
- Thread grouping via References/In-Reply-To headers
- Template variable substitution
- Contact/company auto-linking from email addresses
- Calendar event creation from mail
- 46 tests covering all 40 acceptance criteria
- Ruff lint clean, format clean
- Full regression: 527 tests pass (0 failures)
2026-07-01 15:41:27 +02:00
leocrm-bot
7fbeeda678
T05: Calendar plugin backend — appointments + tasks + kanban + ICS + resources + recurrence — 69 tests, 86.87% coverage
2026-06-30 01:12:33 +02:00
leocrm-bot
fdb41dade1
T04: DMS plugin backend — folders + files + preview + OnlyOffice + shares + search + bulk — 106 tests, 97.90% coverage
2026-06-29 20:48:58 +02:00
leocrm-bot
a2452cc04b
chore: fix all ruff lint errors + format — 0 errors, 306 tests pass
2026-06-29 17:43:56 +02:00
leocrm-bot
5d1850768a
T11: tags plugin + permissions plugin + entity links backend — 68 tests, 66.61% coverage
2026-06-29 14:01:24 +02:00
leocrm-bot
9678344f0e
T03: plugin system framework + lifecycle + migrations + event bus + DI
...
- Plugin registry with discover/install/activate/deactivate/uninstall lifecycle
- PluginManifest Pydantic v2 schema (name, version, dependencies, routes, events, migrations)
- BasePlugin abstract class with lifecycle hooks (on_install/activate/deactivate/uninstall)
- Migration runner with tenant_id validator (rejects tables without tenant_id)
- Event bus integration: register/unregister listeners on activate/deactivate
- Service container DI: plugins receive db, cache, event_bus, storage, notifications
- Idempotent operations (activate active=200, deactivate inactive=200)
- UI registry for frontend component registration
- 47 new tests (14 ACs + 33 unit tests), 103 total tests pass
- Migration 0003: plugins + plugin_migrations tables
- Coverage: 85.92% for plugin modules
2026-06-29 08:02:15 +02:00