From 010b9ad9dfaf42b91ad95dd2cc9b614bb9c6b383 Mon Sep 17 00:00:00 2001 From: Mic Date: Thu, 2 Apr 2026 21:36:23 +0200 Subject: [PATCH 01/77] release notes updated --- CHANGELOG.md | 6 +++++- options/mzta-release-notes.html | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73d65735..5b86de51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,11 @@

Version 4.0.3 - 20/03/2026

diff --git a/options/mzta-release-notes.html b/options/mzta-release-notes.html index 7a4c2276..9887e3fd 100644 --- a/options/mzta-release-notes.html +++ b/options/mzta-release-notes.html @@ -11,7 +11,11 @@

Version 4.0.3 - 20/03/2026

From 613cbc21792cbcb36ef87ebed213f5f7c010170e Mon Sep 17 00:00:00 2001 From: Andreas Pettersson Date: Thu, 2 Apr 2026 20:02:59 +0200 Subject: [PATCH 02/77] Translated using Weblate (Swedish) Currently translated at 100.0% (556 of 556 strings) Translation: ThunderAI for Thunderbird/main Translate-URL: https://hosted.weblate.org/projects/thunderai/main/sv/ --- _locales/sv/messages.json | 127 +++++++++++++++++++++++++++++++++++++- 1 file changed, 125 insertions(+), 2 deletions(-) diff --git a/_locales/sv/messages.json b/_locales/sv/messages.json index 9e82a2c6..b2e18309 100644 --- a/_locales/sv/messages.json +++ b/_locales/sv/messages.json @@ -645,7 +645,7 @@ "message": "Sammanfatta följande e-postmeddelande i en punktlista." }, "prompt_translate_this_full_text": { - "message": "Översätt följande e-postmeddelande till" + "message": "Översätt e-postmeddelandet nedan till {%thunderai_translate_lang%}.\n\nRegler:\n\n- Översätt både ämnet och brödtexten.\n- Returnera resultatet som ett JSON-objekt med tre fält: \"subject\", \"body\" och \"status\".\n- Om översättningen har gjorts är statusen lika med 1.\n- Om e-postmeddelandet är skrivet på ett av dessa språk \"{%thunderai_translate_exclude_lang%}\" eller på språket {%thunderai_translate_lang%}, returnera en tom sträng för brödtexten och ämnet och sätt statusen till -1.\n- Lägg inte till förklaringar, anteckningar eller någon text utanför JSON.\n\nE-postämne: {%mail_subject%}\n\nE-postbrödtext: {%mail_html_body%}\n\nGenerera ett svar endast i JSON-format. Utdata ska endast vara ett JSON-objekt. Här är ett exempel på JSON-formatet som ska användas:\n{\n\"subject\": \"ämnesöversättning\",\n\"body\": \"översättning av brödtext\",\n\"status\": \"statusresultat\"\n}" }, "prompt_this_full_text": { "message": "Svara endast med den text som behövs och utan extra kommentarer eller annan text." @@ -1462,7 +1462,7 @@ "message": "Spara som sammanfattning" }, "prefs_storage_title": { - "message": "Ytterligare informationslagring" + "message": "Lagring" }, "prefs_storage_size": { "message": "Lagringsstorlek" @@ -1558,5 +1558,128 @@ }, "prefs_OptionText_action_auto_batch": { "message": "När e-postmeddelandet tas emot" + }, + "prefs_storage_info": { + "message": "Lagringen används för att spara information om skräppostpoäng, sammanfattningar och översättningar av varje meddelande." + }, + "placeholder_thunderai_translate_lang": { + "message": "Språket som ska användas i e-postöversättningarna." + }, + "placeholder_thunderai_translate_exclude_lang": { + "message": "Språkkoden ska inte översättas när den hittas." + }, + "context_menu_mzta-translate": { + "message": "Översätt" + }, + "prefs_OptionText_translate": { + "message": "Översätt e-post" + }, + "prefs_OptionText_translate_use_specific_integration_Info": { + "message": "Om markerat kommer modellen och API:et som anges nedan att användas för att översätta e-postmeddelanden, oavsett vilket som valts på ThunderAI-alternativsidan." + }, + "prefs_OptionText_translate_Info": { + "message": "Om markerad läggs en översättningsknapp till i meddelandetexten." + }, + "prefs_OptionText_btnManageTranslateInfo": { + "message": "Hantera översättningsinställningar" + }, + "Translate_PageTitle": { + "message": "Hantera översättningsinställningar" + }, + "Translate_info_default": { + "message": "På den här sidan kan du ändra standardprompten som används för att översätta e-postmeddelanden." + }, + "Translate_prompt_text_title": { + "message": "Aktuell prompttext" + }, + "Translate_prompt_prefs_title": { + "message": "Översättningsalternativ" + }, + "prefs_OptionText_translate_auto": { + "message": "Översätt meddelanden automatiskt" + }, + "prefs_OptionText_action_auto_disabled": { + "message": "Inaktiverad" + }, + "prefs_OptionText_action_auto_manual": { + "message": "Endast manuell knapp" + }, + "prefs_OptionText_action_auto_automatic": { + "message": "När e-postmeddelandet öppnas" + }, + "prefs_OptionText_translate_auto_Info": { + "message": "Välj när meddelanden ska översättas: inaktiverad, endast när du klickar på knappen eller automatiskt när du öppnar ett meddelande." + }, + "prefs_OptionText_display_mode_inline": { + "message": "Meddelandepanel (inbäddad)" + }, + "prefs_OptionText_display_mode_webchat": { + "message": "Chattfönster" + }, + "prefs_OptionText_translate_max_display_length": { + "message": "Maximal längd på visad översättning" + }, + "prefs_OptionText_translate_max_display_length_Info": { + "message": "Maximalt antal tecken som visas i den inbäddade översättningen. 0 = ingen gräns. När den är inställd avkortas längre text med en \"Visa mer\"-knapp." + }, + "translate_see_more": { + "message": "Visa mer" + }, + "translate_see_less": { + "message": "Visa mindre" + }, + "prefs_OptionText_translate_lang": { + "message": "Översättningens målspråk" + }, + "prefs_OptionText_translate_lang_Info": { + "message": "Språk att översätta e-postmeddelanden till. Om tomt används standardspråkinställningen." + }, + "prefs_OptionText_translate_exclude_lang": { + "message": "Uteslut språk" + }, + "prefs_OptionText_translate_exclude_lang_Info": { + "message": "Kommaavgränsad lista med språkkoder (t.ex. en, fr, it) som ska hoppas över för automatisk översättning. Om e-postmeddelandet är på ett av dessa språk kommer det inte att översättas automatiskt eller så visas inte den manuella knappen." + }, + "prefs_OptionText_Translate_main_prompt": { + "message": "Prompten som beskriver översättningsuppgiften:" + }, + "translate_generating": { + "message": "Översätter..." + }, + "translate_click_to_generate": { + "message": "Klicka här för att översätta detta e-postmeddelande" + }, + "get_ai_translation": { + "message": "AI-översättning" + }, + "translate_chatgpt_web_not_supported": { + "message": "Automatisk översättning kräver en API-baserad anslutning. Konfigurera en API-anslutning i ThunderAI-inställningarna." + }, + "translate_refresh": { + "message": "Uppdatera översättning" + }, + "translate_delete": { + "message": "Ta bort översättning" + }, + "translate_banner_title": { + "message": "AI-översättning" + }, + "translate_error": { + "message": "Översättning misslyckades." + }, + "translate_no_language_configured": { + "message": "Översättningsspråket är inte konfigurerat. Ange ett språk i översättningsinställningarna eller ange ett standardspråk i de allmänna inställningarna." + }, + "translate_skipped": { + "message": "Översättning hoppas över: Språk uteslutet eller identiskt med målet." + }, + "spam_badge_tooltip": { + "message": "Skräppostpoäng — Klicka för att se förklaring" + }, + "translate_by": { + "message": "Översättning av" + }, + "placeholder_string": { + "message": "Platshållare" } } From 9ac56c1fd6c45a601c990c819969bab7b572e280 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Thu, 2 Apr 2026 21:28:01 +0200 Subject: [PATCH 03/77] Update translation files Updated by "Cleanup translation files" add-on in Weblate. Translation: ThunderAI for Thunderbird/main Translate-URL: https://hosted.weblate.org/projects/thunderai/main/ --- _locales/cs/messages.json | 3 --- _locales/de/messages.json | 3 --- _locales/el/messages.json | 3 --- _locales/es/messages.json | 3 --- _locales/fr/messages.json | 3 --- _locales/hr/messages.json | 3 --- _locales/it/messages.json | 3 --- _locales/ja/messages.json | 3 --- _locales/pl/messages.json | 3 --- _locales/pt-br/messages.json | 3 --- _locales/ru/messages.json | 3 --- _locales/sv/messages.json | 3 --- _locales/zh_Hans/messages.json | 3 --- _locales/zh_Hant/messages.json | 3 --- 14 files changed, 42 deletions(-) diff --git a/_locales/cs/messages.json b/_locales/cs/messages.json index edc7e471..3d1f2beb 100644 --- a/_locales/cs/messages.json +++ b/_locales/cs/messages.json @@ -395,9 +395,6 @@ "chatgpt_btn_model": { "message": "Použít aktuální model" }, - "SendingPrompt": { - "message": "Odesílání výzvy..." - }, "AddTags_prompt_text_title": { "message": "Aktuální text výzvy" }, diff --git a/_locales/de/messages.json b/_locales/de/messages.json index fc6ba9fe..536f1801 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -486,9 +486,6 @@ "chatgpt_btn_model": { "message": "Aktuelles Modell verwenden" }, - "SendingPrompt": { - "message": "Sende Eingabe..." - }, "AllowedValues": { "message": "Erlaubte Werte" }, diff --git a/_locales/el/messages.json b/_locales/el/messages.json index d66cfbc4..9a762374 100644 --- a/_locales/el/messages.json +++ b/_locales/el/messages.json @@ -512,9 +512,6 @@ "chatgpt_btn_model": { "message": "Χρησιμοποιήστε το τρέχον μοντέλο" }, - "SendingPrompt": { - "message": "Αποστολή προτροπής..." - }, "AllowedValues": { "message": "Επιτρεπόμενες τιμές" }, diff --git a/_locales/es/messages.json b/_locales/es/messages.json index 5753820c..e0ef581e 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -518,9 +518,6 @@ "chatgpt_btn_model": { "message": "Usar el modelo actual" }, - "SendingPrompt": { - "message": "Enviando solicitud..." - }, "AllowedValues": { "message": "Valores permitidos" }, diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 976c8149..9ff26474 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -486,9 +486,6 @@ "chatgpt_btn_model": { "message": "Utiliser le modèle actuel" }, - "SendingPrompt": { - "message": "Envoi de l'invite..." - }, "AllowedValues": { "message": "Valeurs autorisées" }, diff --git a/_locales/hr/messages.json b/_locales/hr/messages.json index d7121ee5..e3fd83c7 100644 --- a/_locales/hr/messages.json +++ b/_locales/hr/messages.json @@ -486,9 +486,6 @@ "chatgpt_btn_model": { "message": "Koristi trenutni model" }, - "SendingPrompt": { - "message": "Slanje upita..." - }, "AllowedValues": { "message": "Dopuštene vrijednosti" }, diff --git a/_locales/it/messages.json b/_locales/it/messages.json index 68ea230e..6f31f4d1 100644 --- a/_locales/it/messages.json +++ b/_locales/it/messages.json @@ -486,9 +486,6 @@ "chatgpt_btn_model": { "message": "Usa il modello corrente" }, - "SendingPrompt": { - "message": "Invio del prompt..." - }, "AllowedValues": { "message": "Valori consentiti" }, diff --git a/_locales/ja/messages.json b/_locales/ja/messages.json index 3007f38b..4557e3f0 100644 --- a/_locales/ja/messages.json +++ b/_locales/ja/messages.json @@ -521,9 +521,6 @@ "chatgpt_btn_model": { "message": "現在のモデルを使用" }, - "SendingPrompt": { - "message": "プロンプトを送信中..." - }, "AllowedValues": { "message": "許可される値" }, diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json index b2af15a5..491ddfdb 100644 --- a/_locales/pl/messages.json +++ b/_locales/pl/messages.json @@ -486,9 +486,6 @@ "chatgpt_btn_model": { "message": "Użyj bieżącego modelu" }, - "SendingPrompt": { - "message": "Wysyłanie polecenia..." - }, "AllowedValues": { "message": "Dozwolone wartości" }, diff --git a/_locales/pt-br/messages.json b/_locales/pt-br/messages.json index 5fe6b00c..d28e7ad5 100644 --- a/_locales/pt-br/messages.json +++ b/_locales/pt-br/messages.json @@ -486,9 +486,6 @@ "chatgpt_btn_model": { "message": "Usar o modelo atual" }, - "SendingPrompt": { - "message": "Enviando prompt..." - }, "AllowedValues": { "message": "Valores permitidos" }, diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index d08caa6d..4cce1af6 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -512,9 +512,6 @@ "chatgpt_btn_model": { "message": "Использовать текущую модель" }, - "SendingPrompt": { - "message": "Отправка запроса..." - }, "AllowedValues": { "message": "Разрешенные значения" }, diff --git a/_locales/sv/messages.json b/_locales/sv/messages.json index b2e18309..9a6c90d0 100644 --- a/_locales/sv/messages.json +++ b/_locales/sv/messages.json @@ -593,9 +593,6 @@ "chatgpt_btn_model": { "message": "Använd den nuvarande modellen" }, - "SendingPrompt": { - "message": "Skickar prompt..." - }, "AllowedValues": { "message": "Tillåtna värden" }, diff --git a/_locales/zh_Hans/messages.json b/_locales/zh_Hans/messages.json index 9579793e..54ea5b54 100644 --- a/_locales/zh_Hans/messages.json +++ b/_locales/zh_Hans/messages.json @@ -107,9 +107,6 @@ "chatgpt_btn_model": { "message": "使用当前模型" }, - "SendingPrompt": { - "message": "正在发送提示词..." - }, "AllowedValues": { "message": "允许的值" }, diff --git a/_locales/zh_Hant/messages.json b/_locales/zh_Hant/messages.json index 819af18e..1778bf49 100644 --- a/_locales/zh_Hant/messages.json +++ b/_locales/zh_Hant/messages.json @@ -429,9 +429,6 @@ "prefs_API_Host_Info": { "message": "類似於" }, - "SendingPrompt": { - "message": "送出提示中..." - }, "context_menu_mzta-add-tags": { "message": "新增標籤" }, From 3b4426f530ae0353d7380976fc2f95c30d8f4241 Mon Sep 17 00:00:00 2001 From: bittin1ddc447d824349b2 Date: Fri, 3 Apr 2026 10:45:42 +0200 Subject: [PATCH 04/77] Translated using Weblate (Swedish) Currently translated at 100.0% (560 of 560 strings) Translation: ThunderAI for Thunderbird/main Translate-URL: https://hosted.weblate.org/projects/thunderai/main/sv/ --- _locales/sv/messages.json | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/_locales/sv/messages.json b/_locales/sv/messages.json index 9a6c90d0..7e31e7df 100644 --- a/_locales/sv/messages.json +++ b/_locales/sv/messages.json @@ -642,7 +642,7 @@ "message": "Sammanfatta följande e-postmeddelande i en punktlista." }, "prompt_translate_this_full_text": { - "message": "Översätt e-postmeddelandet nedan till {%thunderai_translate_lang%}.\n\nRegler:\n\n- Översätt både ämnet och brödtexten.\n- Returnera resultatet som ett JSON-objekt med tre fält: \"subject\", \"body\" och \"status\".\n- Om översättningen har gjorts är statusen lika med 1.\n- Om e-postmeddelandet är skrivet på ett av dessa språk \"{%thunderai_translate_exclude_lang%}\" eller på språket {%thunderai_translate_lang%}, returnera en tom sträng för brödtexten och ämnet och sätt statusen till -1.\n- Lägg inte till förklaringar, anteckningar eller någon text utanför JSON.\n\nE-postämne: {%mail_subject%}\n\nE-postbrödtext: {%mail_html_body%}\n\nGenerera ett svar endast i JSON-format. Utdata ska endast vara ett JSON-objekt. Här är ett exempel på JSON-formatet som ska användas:\n{\n\"subject\": \"ämnesöversättning\",\n\"body\": \"översättning av brödtext\",\n\"status\": \"statusresultat\"\n}" + "message": "Översätt e-postmeddelandet nedan till {%thunderai_translate_lang%}.\n\nRegler:\n- Översätt både ämnet och brödtexten.\n- Returnera resultatet som ett JSON-objekt med tre fält: \"subject\", \"body\" och \"status\".\n- Om översättningen har gjorts är statusen lika med 1.\n- Om e-postmeddelandet är skrivet på ett av dessa språk \"{%thunderai_translate_exclude_lang%}\" eller på språket {%thunderai_translate_lang%}, returnera en tom sträng för brödtexten och ämnet och sätt statusen till -1.\n- Lägg inte till förklaringar, anteckningar eller någon text utanför JSON.\n\nE-postämne: {%mail_subject%}\n\nE-postbrödtext: {%mail_html_body%}\n\nGenerera ett svar endast i JSON-format. Utdata ska endast vara ett JSON-objekt. Här är ett exempel på JSON-formatet som ska användas:\n{\n\"subject\": \"ämnesöversättning\",\n\"body\": \"översättning av brödtext\",\n\"status\": \"statusresultat\"\n}" }, "prompt_this_full_text": { "message": "Svara endast med den text som behövs och utan extra kommentarer eller annan text." @@ -1678,5 +1678,25 @@ }, "placeholder_string": { "message": "Platshållare" + }, + "prefsInfoDesc_7": { + "message": "För att använda Google Gemini API behöver du en Google Gemini API-nyckel och måste välja en modell." + }, + "prefs_ollama_format_json": { + "message": "Tvinga JSON utdata" + }, + "prefs_ollama_format_json_Info": { + "message": "Om markerat kommer Ollama att tvingas returnera ett giltigt JSON-svar. Det här alternativet fungerar bara med modeller som stöder strukturerad utdata." + }, + "prefs_specific_api_indicator": { + "message": "[Använder $1]", + "placeholders": { + "1": { + "content": "$1" + } + } + }, + "prefsInfoDesc_8": { + "message": "För att använda Claude API behöver du en Anthropic Claude API-nyckel och måste välja en modell." } } From 9366ac226d831f00c67f348c64dfc8357c5bafb1 Mon Sep 17 00:00:00 2001 From: mic Date: Sun, 5 Apr 2026 23:42:58 +0200 Subject: [PATCH 05/77] summarize prompt improved for a concise summary with no formatting. see #580 --- _locales/en/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index dfbd3656..10fb1ea7 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1109,7 +1109,7 @@ "description": "" }, "prompt_summarize_full_text": { - "message": "You are an assistant that summarizes email conversations.\n\nGiven an email thread, produce a concise, accurate summary that captures:\n\n- The main topic or purpose of the conversation\n- Key decisions, conclusions, or agreements\n- Important questions, requests, or action items\n- Who is responsible for each action item (if stated)\n\nOmit greetings, signatures, quoted text, and redundant back-and-forth.\nDo not add assumptions or information not present in the emails.\n\nWrite the summary in clear, neutral language suitable for a busy professional.", + "message": "Please provide a concise summary of the following email message(s). The summary should be 3-5 sentences maximum and capture the main points. Write in plain paragraphs without bullet points, lists, or markdown formatting:\n\n", "description": "" }, "prompt_summarize_email_template": { From bddd630bb98a49d388e6e1dea005eaacd6dbdf4f Mon Sep 17 00:00:00 2001 From: mic Date: Sun, 5 Apr 2026 23:43:26 +0200 Subject: [PATCH 06/77] "Please" removed --- _locales/en/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 10fb1ea7..35f5848f 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1109,7 +1109,7 @@ "description": "" }, "prompt_summarize_full_text": { - "message": "Please provide a concise summary of the following email message(s). The summary should be 3-5 sentences maximum and capture the main points. Write in plain paragraphs without bullet points, lists, or markdown formatting:\n\n", + "message": "Provide a concise summary of the following email message(s). The summary should be 3-5 sentences maximum and capture the main points. Write in plain paragraphs without bullet points, lists, or markdown formatting:\n\n", "description": "" }, "prompt_summarize_email_template": { From 6a87381b3cfee3766ab27a9dab47dd53ac3999e0 Mon Sep 17 00:00:00 2001 From: mic Date: Sun, 5 Apr 2026 23:54:56 +0200 Subject: [PATCH 07/77] added an option to always use a plain text summary. see #740 --- _locales/en/messages.json | 8 ++++++++ claude-spec/05-options.md | 4 +++- js/mzta-compose-script.js | 2 +- mzta-background.js | 14 ++++++++------ options/mzta-options-default.js | 1 + pages/summarize/mzta-summarize.html | 9 +++++++++ 6 files changed, 30 insertions(+), 8 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 35f5848f..ac9ba167 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -2019,6 +2019,14 @@ "message": "Maximum number of characters to display in the inline summary. Set to 0 for no limit.", "description": "" }, + "prefs_OptionText_summarize_strip_formatting": { + "message": "Strip formatting", + "description": "" + }, + "prefs_OptionText_summarize_strip_formatting_Info": { + "message": "Remove HTML and Markdown formatting from the AI-generated summary, showing plain text only.", + "description": "" + }, "summarize_see_more": { "message": "See more", "description": "" diff --git a/claude-spec/05-options.md b/claude-spec/05-options.md index d8d14ef3..0c968c88 100644 --- a/claude-spec/05-options.md +++ b/claude-spec/05-options.md @@ -98,6 +98,7 @@ These are generated programmatically at the bottom of `mzta-options-default.js` | `summarize_auto` | `1` | Auto-summarize mode: `0` = disabled, `1` = manual (show "click to generate" button), `2` = automatic (generate on message open), `3` = generate on email receive (background pre-cache via `onNewMailReceived`, no UI during generation) | | `summarize_display_mode` | `'inline'` | Where to display summaries: `'inline'` = message pane banner, `'webchat'` = AI chat window. Note: `summarize_auto = 2` and `summarize_auto = 3` always use inline regardless of this setting. | | `summarize_max_display_length` | `0` | Maximum characters shown in inline summary before truncation. `0` = no limit (show full text). When set, text is truncated at a word boundary and a "See more"/"See less" toggle link is shown. | +| `summarize_strip_formatting` | `false` | Strip HTML and Markdown formatting from AI-generated summaries, showing plain text only. | | `translate` | `true` | Enable email translation | | `translate_auto` | `0` | Auto-translate mode: `0` = disabled, `1` = manual (show button), `2` = automatic (translate on message open), `3` = generate on email receive (background pre-cache via `onNewMailReceived`, no UI during generation) | | `translate_max_display_length` | `0` | Maximum characters shown in inline translation before truncation. `0` = no limit (show full text). When set, text is truncated at a word boundary and a "See more"/"See less" toggle link is shown. | @@ -117,7 +118,8 @@ The summarize settings page provides: - `'webchat'` — opens the AI chat window - Note: `summarize_auto = 2` always generates inline regardless of this setting. Context menu summarize with multiple messages always falls back to webchat. 4. **Max display length** (`summarize_max_display_length`) — number input, limits inline summary text to N characters. `0` = no limit. When truncated, a "See more"/"See less" toggle link is appended. -5. **Three editable prompts** (used by context menu summarize and webchat mode): +5. **Strip formatting** (`summarize_strip_formatting`) — checkbox, removes HTML/Markdown formatting from AI summary responses, displaying plain text only. Default: off. +6. **Three editable prompts** (used by context menu summarize and webchat mode): - Summarize instruction prompt (`prompt_summarize`) - Email template prompt (`prompt_summarize_email_template`) - Email separator prompt (`prompt_summarize_email_separator`) diff --git a/js/mzta-compose-script.js b/js/mzta-compose-script.js index 849d514c..8d178b04 100644 --- a/js/mzta-compose-script.js +++ b/js/mzta-compose-script.js @@ -1032,7 +1032,7 @@ switch (message.command) { const summaryText = document.createElement('div'); summaryText.className = 'thunderai-summary-content'; - const hasHtml = !!summaryData.summary_html; + const hasHtml = !!summaryData.summary_html && !summaryData.stripFormatting; function setSummaryHtml(element, html) { element.textContent = ''; diff --git a/mzta-background.js b/mzta-background.js index 7a4b0a27..b4a66bc7 100644 --- a/mzta-background.js +++ b/mzta-background.js @@ -223,7 +223,7 @@ messenger.runtime.onMessage.addListener((message, sender, sendResponse) => { async function _initSummary() { try { let tabId = sender.tab.id; - let prefs = await browser.storage.sync.get({ summarize: prefs_default.summarize, summarize_auto: prefs_default.summarize_auto, summarize_display_mode: prefs_default.summarize_display_mode, summarize_max_display_length: prefs_default.summarize_max_display_length }); + let prefs = await browser.storage.sync.get({ summarize: prefs_default.summarize, summarize_auto: prefs_default.summarize_auto, summarize_display_mode: prefs_default.summarize_display_mode, summarize_max_display_length: prefs_default.summarize_max_display_length, summarize_strip_formatting: prefs_default.summarize_strip_formatting }); if (!prefs.summarize) return; @@ -233,7 +233,7 @@ messenger.runtime.onMessage.addListener((message, sender, sendResponse) => { // Always show cached summary if available, regardless of summarize_auto let cachedSummary = await summaryStore.loadSummary(message.headerMessageId); if (cachedSummary && !cachedSummary.error) { - browser.tabs.sendMessage(tabId, { command: "showSummary", data: { ...cachedSummary, maxDisplayLength: prefs.summarize_max_display_length } }); + browser.tabs.sendMessage(tabId, { command: "showSummary", data: { ...cachedSummary, maxDisplayLength: prefs.summarize_max_display_length, stripFormatting: prefs.summarize_strip_formatting } }); return; } @@ -312,12 +312,13 @@ messenger.runtime.onMessage.addListener((message, sender, sendResponse) => { }; await summaryStore.saveSummary(summaryData, msg.headerMessageId); let prefs_summary = await browser.storage.sync.get({ - summarize_max_display_length: prefs_default.summarize_max_display_length + summarize_max_display_length: prefs_default.summarize_max_display_length, + summarize_strip_formatting: prefs_default.summarize_strip_formatting }); try { browser.tabs.sendMessage(msg.tabId, { command: "showSummary", - data: { ...summaryData, maxDisplayLength: prefs_summary.summarize_max_display_length } + data: { ...summaryData, maxDisplayLength: prefs_summary.summarize_max_display_length, stripFormatting: prefs_summary.summarize_strip_formatting } }); } catch (e) { taLog.error("Error sending showSummary to tab: " + e); @@ -586,12 +587,13 @@ async function _generateSummaryForMessage(headerMessageId, tabId = null, options do_debug: prefs_default.do_debug, default_chatgpt_lang: prefs_default.default_chatgpt_lang, summarize_max_display_length: prefs_default.summarize_max_display_length, + summarize_strip_formatting: prefs_default.summarize_strip_formatting, ...getDynamicSettingsDefaults(['use_specific_integration', 'connection_type']) }); let cachedSummary = await summaryStore.loadSummary(headerMessageId); if (cachedSummary && !cachedSummary.error) { - if (tabId) browser.tabs.sendMessage(tabId, { command: "showSummary", data: { ...cachedSummary, maxDisplayLength: prefs.summarize_max_display_length } }); + if (tabId) browser.tabs.sendMessage(tabId, { command: "showSummary", data: { ...cachedSummary, maxDisplayLength: prefs.summarize_max_display_length, stripFormatting: prefs.summarize_strip_formatting } }); return; } @@ -652,7 +654,7 @@ async function _generateSummaryForMessage(headerMessageId, tabId = null, options headerMessageId: headerMessageId }; await summaryStore.saveSummary(summaryData, headerMessageId); - if (tabId) browser.tabs.sendMessage(tabId, { command: "showSummary", data: { ...summaryData, maxDisplayLength: prefs.summarize_max_display_length } }); + if (tabId) browser.tabs.sendMessage(tabId, { command: "showSummary", data: { ...summaryData, maxDisplayLength: prefs.summarize_max_display_length, stripFormatting: prefs.summarize_strip_formatting } }); taWorkingStatus.stopWorking(); } catch (error) { diff --git a/options/mzta-options-default.js b/options/mzta-options-default.js index e1f2eddb..7c176f5a 100644 --- a/options/mzta-options-default.js +++ b/options/mzta-options-default.js @@ -142,6 +142,7 @@ export const prefs_default = { summarize_auto: 1, // 0: disabled, 1: manual button, 2: automatic on message open, 3: generate on email receive summarize_display_mode: 'inline', // 'inline' or 'webchat' summarize_max_display_length: 0, // 0 = no limit, otherwise max chars shown inline + summarize_strip_formatting: false, // strip HTML/markdown formatting from AI summary translate: true, translate_auto: 0, // 0: disabled, 1: manual button, 2: automatic on message open, 3: generate on email receive translate_max_display_length: 0, // 0 = no limit, otherwise max chars shown inline diff --git a/pages/summarize/mzta-summarize.html b/pages/summarize/mzta-summarize.html index f5f369c3..6ddfce9b 100644 --- a/pages/summarize/mzta-summarize.html +++ b/pages/summarize/mzta-summarize.html @@ -61,6 +61,15 @@ + + __MSG_prefs_OptionText_summarize_strip_formatting__ + + + + From eac4f0565f8f3d471e34753782180425d0211606 Mon Sep 17 00:00:00 2001 From: mic Date: Sun, 5 Apr 2026 23:56:24 +0200 Subject: [PATCH 08/77] version set to 4.1.0pre2 --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 8bc70f4f..769e5051 100644 --- a/manifest.json +++ b/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "ThunderAI", "description": "__MSG_extensionDescription__", - "version": "4.1.0pre1", + "version": "4.1.0pre2", "author": "Mic (m@micz.it)", "homepage_url": "https://micz.it/thunderbird-addon-thunderai/", "browser_specific_settings": { From ffcb1e1b9cc5d14fb9569628cd09902c0fed5e31 Mon Sep 17 00:00:00 2001 From: mic Date: Mon, 6 Apr 2026 00:04:13 +0200 Subject: [PATCH 09/77] positioning fixed --- options/mzta-options.css | 3 ++- options/mzta-options.html | 12 ++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/options/mzta-options.css b/options/mzta-options.css index 36de23ba..1515e0a0 100644 --- a/options/mzta-options.css +++ b/options/mzta-options.css @@ -104,7 +104,8 @@ div#miczTranslate{ display: none; font-size: 0.75em; margin-left: 0.5em; - padding: 0.15em 0.5em; + margin-top: 3px; + padding: 0.35em 0.5em; border-radius: 0.8em; } diff --git a/options/mzta-options.html b/options/mzta-options.html index ba3391c7..3513bb32 100644 --- a/options/mzta-options.html +++ b/options/mzta-options.html @@ -173,7 +173,7 @@ __MSG_prefs_OptionText_add_tags__
- +