Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
earthjasonlin pushed to main at earthjasonlin/mailova 2026-07-28 07:37:57 +08:00
7da337cc4d feat(profiles): add pending count to profile card stats
c23de38b21 fix(dashboard): convert UTC times to Beijing time before today/yesterday delta calculation
Compare 2 commits »
earthjasonlin pushed to main at earthjasonlin/ai-mail-bot 2026-07-23 11:49:15 +08:00
c28825ec87 fix: use find_user_by_chat_id for expand_promo_detail AI config
earthjasonlin pushed to main at earthjasonlin/ai-mail-bot 2026-07-22 13:32:41 +08:00
a517768083 feat: AI hint supports multi-turn conversation with context - hint_history list stored in conversation, accumulates across rounds - Each new hint appended, full history passed to AI as combined prompt - Format: 'hint1 → hint2 → hint3' so AI understands the conversation flow
e0c2110c09 fix: use original email subject for reply, not AI-extracted title Reply emails should use the original subject from IMAP header (e.g. 'Re: [original]'), not the AI-generated Chinese summary title.
Compare 2 commits »
earthjasonlin pushed to main at earthjasonlin/ai-mail-bot 2026-07-19 05:54:58 +08:00
b18dcb0527 fix: wrap original text in code block to avoid MarkdownV2 parse errors Email bodies contain *, _, etc. that break MarkdownV2 entity parsing. Wrapping in backtick code block prevents Telegram from parsing internals.
earthjasonlin pushed to main at earthjasonlin/ai-mail-bot 2026-07-19 01:46:49 +08:00
9adb32cb0c feat: cleanup reply flow messages + AI comparison explanation - Track extra_msg_ids in conversation for code block messages - _cleanup_conv_messages: delete all intermediate messages on cancel/send - Cancel/send/edit all clean up extra messages before restoring summary view - AI prompts now return 'comparison' field with Chinese explanation of differences - _show_ai_suggestions displays comparison text above button list - generate_more_replies returns {suggestions, comparison}
earthjasonlin pushed to main at earthjasonlin/mailova 2026-07-18 21:07:35 +08:00
ae1a23143e feat(ui): optimize landing page and showcase for mobile (hamburger nav, 2-col grid, compact lightbox)
earthjasonlin pushed to main at earthjasonlin/ai-mail-bot 2026-07-18 21:07:28 +08:00
beaa3f146e feat: show full recipient and CC in email summary - Email class: add cc field - fetch_unseen_emails: parse Cc header - _format_normal: display full recipient, add CC line if present - send_summary/ai_process: pass cc through to email_context - save_email_context: store cc for callback use
earthjasonlin pushed to main at earthjasonlin/mailova 2026-07-18 09:22:33 +08:00
64dfa71bd0 chore(ui): update favicon icon
earthjasonlin pushed to main at earthjasonlin/mailova 2026-07-18 09:22:27 +08:00
6624985014 chore: remove stray favicon.ico from project root
earthjasonlin pushed to main at earthjasonlin/mailova 2026-07-18 09:21:14 +08:00
e7396de1a4 feat(ui): add favicon.ico route and link tag in base template
earthjasonlin pushed to main at earthjasonlin/mailova 2026-07-18 09:17:22 +08:00
b0e69fc123 fix(cache): move Cache-Control middleware before mounts using @app.middleware decorator
8771d105bb chore(deps): add boto3 to requirements.txt
Compare 2 commits »
earthjasonlin pushed to main at earthjasonlin/mailova 2026-07-18 09:10:17 +08:00
1c53209acf fix(templates): replace all TemplateResponse with _render to bypass Jinja2 unhashable dict cache bug
earthjasonlin pushed to main at earthjasonlin/mailova 2026-07-18 08:57:45 +08:00
b80a1859a0 fix(templates): fix unhashable dict in Jinja2 cache by converting available_languages global to function
earthjasonlin pushed to main at earthjasonlin/mailova 2026-07-18 08:26:40 +08:00
f27c263dd4 fix(storage): reduce presigned URL expiry from 7 days to 1 day
d30fd59ade fix(storage): use presigned URLs for private S3 buckets (7-day expiry)
2dc68ff408 feat(cache): add 30-day browser cache for uploaded images (middleware + S3 CacheControl)
54d778971d fix(storage): allow S3 without public_url, auto-construct path-style URL from endpoint
4787fdbf22 refactor(config): consolidate into single config.json, storage backend selectable
Compare 12 commits »
earthjasonlin pushed to main at earthjasonlin/ai-mail-bot 2026-07-17 22:19:43 +08:00
7a01b29655 fix: update email_client and smtp_client for new config structure - email_client: use account.imap.server/port/ssl/starttls instead of flat fields - smtp_client: use s.ssl/starttls instead of s.use_ssl/use_starttls - tg_bot: fix _do_send_reply to use find_user_by_chat_id for email_accounts
earthjasonlin pushed to main at earthjasonlin/ai-mail-bot 2026-07-17 22:09:06 +08:00
c6180834bc chore: remove old YAML config files, keep config.example.json
earthjasonlin pushed to main at earthjasonlin/ai-mail-bot 2026-07-17 22:06:57 +08:00
f2b3793d4c feat: multi-user support - Config format: JSON with bot_token (global), users array - Each user has chat_id, AI config, email_accounts - Each email account has separate IMAP/SMTP with ssl/starttls - Config module: new dataclasses (UserConfig, ImapConfig, SmtpConfig) - find_user_by_chat_id() for callback dispatch - Main: email poller iterates all users, queues carry user object - Summarizer: accepts UserConfig, uses user-specific AI and chat_id - TG bot: all functions use bot_token string instead of TelegramConfig - Callback/message handlers look up user by chat_id - AI regen/hint threads use find_user_by_chat_id for AI config - Config example: config.example.json - Tests: 3/3 passing
earthjasonlin pushed to main at earthjasonlin/ai-mail-bot 2026-07-17 21:05:06 +08:00
9906f1675f chore: remove reply_suggestions from email summarization prompt AI reply suggestions are now generated on-demand when user clicks full/short reply buttons, using style-specific prompts.
8386ab3c89 fix: always regenerate AI replies when selecting style, ignore summary cache The cached reply_suggestions from summarization use a generic prompt, not matching full/short style. Now always triggers fresh generation.
1d70fe2491 fix: pass links/is_promotion to _summary_keyboard in cancel and send_reply handlers
Compare 3 commits »
earthjasonlin pushed to main at earthjasonlin/ai-mail-bot 2026-07-17 20:49:51 +08:00
bedf5b887c feat: 2-col reply buttons, direct send, language-matched prompts - Buttons: [回复N 直接发送] [回复N 编辑] in 2-column layout - CALLBACK_SEND_REPLY: send immediately without editing - Prompts enforce matching email language (no Chinese forced on English) - Full mode: greeting + comma only, no [Your Name] placeholder - Tests: 5/5 passing
earthjasonlin pushed to main at earthjasonlin/ai-mail-bot 2026-07-17 20:36:15 +08:00
6ce9a806ea fix: clear reply suggestions cache on cancel, regenerate when switching styles - Cancel now clears reply_suggestions from email_context - Selecting style with empty cache triggers fresh AI generation - Selecting style with cache uses cached suggestions - Tests: 3/3 passing
84f2428aeb fix: send AI suggestion as MarkdownV2 code block for copy-on-tap
Compare 2 commits »