From c8f67293661cfab49edf5ca9fd9c2aeeaf6ff7e4 Mon Sep 17 00:00:00 2001 From: mic Date: Sun, 2 Feb 2025 21:43:08 +0100 Subject: [PATCH 01/18] add_tags_auto and add_tags_auto_force_existing options added. see #237 --- _locales/en/messages.json | 16 ++++++++++++++++ options/mzta-options-default.js | 2 ++ pages/addtags/mzta-add-tags.css | 2 +- pages/addtags/mzta-add-tags.html | 18 ++++++++++++++++++ pages/addtags/mzta-add-tags.js | 10 ++++++++++ 5 files changed, 47 insertions(+), 1 deletion(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index c96484bd..a801908c 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1018,5 +1018,21 @@ "sparks_not_installed": { "message": "ThunderAI Sparks not installed!", "description": "" + }, + "prefs_OptionText_add_tags_auto": { + "message": "Add tags automatically", + "description": "" + }, + "prefs_OptionText_add_tags_auto_Info": { + "message": "If checked, the AI will automatically add tags to newly received emails.", + "description": "" + }, + "prefs_OptionText_add_tags_auto_force_existing": { + "message": "Force existing tags when autotagging", + "description": "" + }, + "prefs_OptionText_add_tags_auto_force_existing_Info": { + "message": "If checked, the AI will add only existing tags to newly received emails, and won't create new tags.", + "description": "" } } \ No newline at end of file diff --git a/options/mzta-options-default.js b/options/mzta-options-default.js index 10e08fe6..6c804352 100644 --- a/options/mzta-options-default.js +++ b/options/mzta-options-default.js @@ -46,5 +46,7 @@ export const prefs_default = { add_tags_hide_exclusions: false, add_tags_first_uppercase: true, add_tags_force_lang: true, + add_tags_auto: false, + add_tags_auto_force_existing: false, get_calendar_event: true, } \ No newline at end of file diff --git a/pages/addtags/mzta-add-tags.css b/pages/addtags/mzta-add-tags.css index c012a1a7..dd2f01a8 100644 --- a/pages/addtags/mzta-add-tags.css +++ b/pages/addtags/mzta-add-tags.css @@ -27,7 +27,7 @@ justify-content: space-between; } -#addtags_info_additional_statements{ +#addtags_info_additional_statements, #add_tags_auto_force_existing_tr{ display: none; } diff --git a/pages/addtags/mzta-add-tags.html b/pages/addtags/mzta-add-tags.html index f7e0f81f..b6b8c94c 100644 --- a/pages/addtags/mzta-add-tags.html +++ b/pages/addtags/mzta-add-tags.html @@ -49,6 +49,24 @@ + + __MSG_prefs_OptionText_add_tags_auto__ + + + + + + __MSG_prefs_OptionText_add_tags_auto_force_existing__ + + + +
__MSG_AddTags_prompt_text_title__ diff --git a/pages/addtags/mzta-add-tags.js b/pages/addtags/mzta-add-tags.js index b770c8dd..06d9119d 100644 --- a/pages/addtags/mzta-add-tags.js +++ b/pages/addtags/mzta-add-tags.js @@ -53,6 +53,16 @@ document.addEventListener('DOMContentLoaded', async () => { } }); + let add_tags_auto_el = document.getElementById('add_tags_auto'); + let add_tags_auto_force_existing_tr = document.getElementById('add_tags_auto_force_existing_tr'); + add_tags_auto_el.addEventListener('click', (event) => { + add_tags_auto_force_existing_tr.style.display = event.target.checked ? 'table-row' : 'none'; + if(!event.target.checked){ + document.getElementById('add_tags_auto_force_existing').checked = false; + } + }); + add_tags_auto_force_existing_tr.style.display = add_tags_auto_el.checked ? 'table-row' : 'none'; + addtags_reset_btn.addEventListener('click', () => { addtags_textarea.value = browser.i18n.getMessage('prompt_add_tags_full_text'); addtags_reset_btn.disabled = true; From eb3dbc2c73fee7cb17273fbc77ffafd74697e80f Mon Sep 17 00:00:00 2001 From: mic Date: Tue, 4 Feb 2025 21:52:10 +0100 Subject: [PATCH 02/18] add_tags_auto_only_inbox option added. see #237 --- _locales/en/messages.json | 8 ++++++++ options/mzta-options-default.js | 1 + pages/addtags/mzta-add-tags.css | 2 +- pages/addtags/mzta-add-tags.html | 9 +++++++++ pages/addtags/mzta-add-tags.js | 6 +++--- 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index a801908c..ff26dcf3 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1034,5 +1034,13 @@ "prefs_OptionText_add_tags_auto_force_existing_Info": { "message": "If checked, the AI will add only existing tags to newly received emails, and won't create new tags.", "description": "" + }, + "prefs_OptionText_add_tags_auto_only_inbox": { + "message": "Only add tags to inbox emails", + "description": "" + }, + "prefs_OptionText_add_tags_auto_only_inbox_Info": { + "message": "If checked, the AI will only add tags to emails received in the inbox folder.", + "description": "" } } \ No newline at end of file diff --git a/options/mzta-options-default.js b/options/mzta-options-default.js index 6c804352..49724479 100644 --- a/options/mzta-options-default.js +++ b/options/mzta-options-default.js @@ -48,5 +48,6 @@ export const prefs_default = { add_tags_force_lang: true, add_tags_auto: false, add_tags_auto_force_existing: false, + add_tags_auto_only_inbox: true, get_calendar_event: true, } \ No newline at end of file diff --git a/pages/addtags/mzta-add-tags.css b/pages/addtags/mzta-add-tags.css index dd2f01a8..2899916f 100644 --- a/pages/addtags/mzta-add-tags.css +++ b/pages/addtags/mzta-add-tags.css @@ -27,7 +27,7 @@ justify-content: space-between; } -#addtags_info_additional_statements, #add_tags_auto_force_existing_tr{ +#addtags_info_additional_statements, #add_tags_auto_force_existing_tr, #add_tags_auto_only_inbox_tr{ display: none; } diff --git a/pages/addtags/mzta-add-tags.html b/pages/addtags/mzta-add-tags.html index b6b8c94c..7d15a704 100644 --- a/pages/addtags/mzta-add-tags.html +++ b/pages/addtags/mzta-add-tags.html @@ -67,6 +67,15 @@ + + __MSG_prefs_OptionText_add_tags_auto_only_inbox__ + + + +
__MSG_AddTags_prompt_text_title__ diff --git a/pages/addtags/mzta-add-tags.js b/pages/addtags/mzta-add-tags.js index 06d9119d..ba24ca7d 100644 --- a/pages/addtags/mzta-add-tags.js +++ b/pages/addtags/mzta-add-tags.js @@ -55,13 +55,13 @@ document.addEventListener('DOMContentLoaded', async () => { let add_tags_auto_el = document.getElementById('add_tags_auto'); let add_tags_auto_force_existing_tr = document.getElementById('add_tags_auto_force_existing_tr'); + let add_tags_auto_only_inbox_tr = document.getElementById('add_tags_auto_only_inbox_tr'); add_tags_auto_el.addEventListener('click', (event) => { add_tags_auto_force_existing_tr.style.display = event.target.checked ? 'table-row' : 'none'; - if(!event.target.checked){ - document.getElementById('add_tags_auto_force_existing').checked = false; - } + add_tags_auto_only_inbox_tr.style.display = event.target.checked ? 'table-row' : 'none'; }); add_tags_auto_force_existing_tr.style.display = add_tags_auto_el.checked ? 'table-row' : 'none'; + add_tags_auto_only_inbox_tr.style.display = add_tags_auto_el.checked ? 'table-row' : 'none'; addtags_reset_btn.addEventListener('click', () => { addtags_textarea.value = browser.i18n.getMessage('prompt_add_tags_full_text'); From e1cba2a68fe9d2641c4c785f580e9d7c35cdf0cb Mon Sep 17 00:00:00 2001 From: mic Date: Thu, 6 Feb 2025 21:54:30 +0100 Subject: [PATCH 03/18] added missing default_sign_name --- options/mzta-options-default.js | 1 + 1 file changed, 1 insertion(+) diff --git a/options/mzta-options-default.js b/options/mzta-options-default.js index 49724479..ecde6a58 100644 --- a/options/mzta-options-default.js +++ b/options/mzta-options-default.js @@ -21,6 +21,7 @@ export const prefs_default = { chatgpt_win_height: 800, chatgpt_win_width: 700, default_chatgpt_lang: '', + default_sign_name: '', connection_type: 'chatgpt_web', //Other values: 'chatgpt_api', 'ollama_api', 'openai_comp_api', 'google_gemini_api' chatgpt_web_model: '', chatgpt_web_tempchat: false, From c4dd7a244ae43d06b2b49acb2c938d948f0122a8 Mon Sep 17 00:00:00 2001 From: mic Date: Thu, 6 Feb 2025 21:57:06 +0100 Subject: [PATCH 04/18] thunderai_def_sign and thunderai_def_lang palceholders added. fixes #248 --- _locales/en/messages.json | 8 ++++++++ js/mzta-menus.js | 8 ++++++++ js/mzta-placeholders.js | 14 ++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index ff26dcf3..acafc53d 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1042,5 +1042,13 @@ "prefs_OptionText_add_tags_auto_only_inbox_Info": { "message": "If checked, the AI will only add tags to emails received in the inbox folder.", "description": "" + }, + "placeholder_thunderai_def_sign": { + "message": "Default signature as defined in ThunderAI options.", + "description": "" + }, + "thunderai_def_lang": { + "message": "Default language as defined in ThunderAI options.", + "description": "" } } \ No newline at end of file diff --git a/js/mzta-menus.js b/js/mzta-menus.js index efdf6344..7386bf0d 100644 --- a/js/mzta-menus.js +++ b/js/mzta-menus.js @@ -188,6 +188,14 @@ export class mzta_Menus { case 'tags_full_list': finalSubs['tags_full_list'] = tags_full_list[0]; break; + case 'thunderai_def_sign': + let prefs_def_sign = await browser.storage.sync.get({default_sign_name: ''}); + finalSubs['thunderai_def_sign'] = prefs_def_sign.default_sign_name; + break; + case 'thunderai_def_lang': + let prefs_def_lang = await browser.storage.sync.get({default_chatgpt_lang: ''}); + finalSubs['thunderai_def_lang'] = prefs_def_lang.default_chatgpt_lang; + break; default: // TODO Manage custom placeholders https://github.com/micz/ThunderAI/issues/156 break; } diff --git a/js/mzta-placeholders.js b/js/mzta-placeholders.js index 11b9a51b..9cf612d5 100644 --- a/js/mzta-placeholders.js +++ b/js/mzta-placeholders.js @@ -131,6 +131,20 @@ const defaultPlaceholders = [ type: 0, is_default: "1", }, + { + id: 'thunderai_def_sign', + name: "__MSG_placeholder_thunderai_def_sign__", + default_value: "", + type: 0, + is_default: "1", + }, + { + id: 'thunderai_def_lang', + name: "__MSG_placeholder_thunderai_def_lang__", + default_value: "", + type: 0, + is_default: "1", + }, ]; From bbb823b688956e6a5ec9ffc3da88ca84ac510d6d Mon Sep 17 00:00:00 2001 From: mic Date: Thu, 6 Feb 2025 21:58:42 +0100 Subject: [PATCH 05/18] release notes updated --- CHANGELOG.md | 2 ++ options/mzta-release-notes.html | 2 ++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca2028de..1d6a00df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@

Version 3.2.0 - ??/??/2025

    +
  • Added the {%thunderai_def_sign%} placeholder to get the default signature as defined in the options [#248].
  • +
  • Added the {%thunderai_def_lang%} placeholder to get the default language as defined in the options [#248].
  • ...

Version 3.1.2 - 29/01/2025

diff --git a/options/mzta-release-notes.html b/options/mzta-release-notes.html index 4abdf6ae..1b00e6ba 100644 --- a/options/mzta-release-notes.html +++ b/options/mzta-release-notes.html @@ -9,6 +9,8 @@

ThunderAI Release Notes

Version 3.2.0 - ??/??/2025

    +
  • Added the {%thunderai_def_sign%} placeholder to get the default signature as defined in the options [#248].
  • +
  • Added the {%thunderai_def_lang%} placeholder to get the default language as defined in the options [#248].
  • ...

Version 3.1.2 - 29/01/2025

From 925f21b84bff45abc7885a9be3f78d7988b2ca27 Mon Sep 17 00:00:00 2001 From: mic Date: Thu, 6 Feb 2025 22:12:59 +0100 Subject: [PATCH 06/18] getPlaceholdersValues method added. see #237 --- js/mzta-menus.js | 59 +--------------------------------------- js/mzta-placeholders.js | 60 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 58 deletions(-) diff --git a/js/mzta-menus.js b/js/mzta-menus.js index 7386bf0d..71a24e6a 100644 --- a/js/mzta-menus.js +++ b/js/mzta-menus.js @@ -142,64 +142,7 @@ export class mzta_Menus { fullPrompt = curr_prompt.text + (String(curr_prompt.need_signature) == "1" ? " " + await this.getDefaultSignature():"") + " " + chatgpt_lang + " \"" + (selection_text=='' ? body_text : selection_text) + "\" "; }else{ // we have at least a placeholder, do the magic! - let currPHs = await placeholdersUtils.extractPlaceholders(curr_prompt.text); - // console.log(">>>>>>>>>> currPHs: " + JSON.stringify(currPHs)); - let finalSubs = {}; - for(let currPH of currPHs){ - switch(currPH.id){ - case 'mail_text_body': - finalSubs['mail_text_body'] = body_text; - break; - case 'mail_html_body': - finalSubs['mail_html_body'] = msg_text.html; - break; - case 'mail_typed_text': - finalSubs['mail_typed_text'] = only_typed_text; - break; - case 'mail_subject': - let mail_subject = await getMailSubject(tabs[0]); - finalSubs['mail_subject'] = mail_subject; - break; - case 'selected_text': - finalSubs['selected_text'] = selection_text; - break; - case 'author': - finalSubs['author'] = curr_message.author; - break; - case 'recipients': - finalSubs['recipients'] = curr_message.recipients.join(", "); - break; - case 'cc_list': - finalSubs['cc_list'] = curr_message.ccList.join(", "); - break; - case 'junk_score': - finalSubs['junk_score'] = curr_message.junkScore; - break; - case 'mail_datetime': - finalSubs['mail_datetime'] = curr_message.date; - break; - case 'current_datetime': - finalSubs['current_datetime'] = new Date().toString(); - break; - case 'tags_current_email': - let tags_current_email_array = await transformTagsLabels(curr_message.tags, tags_full_list[1]); - finalSubs['tags_current_email'] = tags_current_email_array.join(", "); - break; - case 'tags_full_list': - finalSubs['tags_full_list'] = tags_full_list[0]; - break; - case 'thunderai_def_sign': - let prefs_def_sign = await browser.storage.sync.get({default_sign_name: ''}); - finalSubs['thunderai_def_sign'] = prefs_def_sign.default_sign_name; - break; - case 'thunderai_def_lang': - let prefs_def_lang = await browser.storage.sync.get({default_chatgpt_lang: ''}); - finalSubs['thunderai_def_lang'] = prefs_def_lang.default_chatgpt_lang; - break; - default: // TODO Manage custom placeholders https://github.com/micz/ThunderAI/issues/156 - break; - } - } + let finalSubs = placeholdersUtils.getPlaceholdersValues(curr_prompt.text, curr_message, await getMailSubject(tabs[0]), body_text, msg_text, only_typed_text, selection_text, tags_full_list); // console.log(">>>>>>>>>> finalSubs: " + JSON.stringify(finalSubs)); let prefs_ph = await browser.storage.sync.get({placeholders_use_default_value: false}); fullPrompt = (placeholdersUtils.replacePlaceholders(curr_prompt.text, finalSubs, prefs_ph.placeholders_use_default_value, true) + (String(curr_prompt.need_signature) == "1" ? " " + await this.getDefaultSignature():"") + " " + chatgpt_lang).trim(); diff --git a/js/mzta-placeholders.js b/js/mzta-placeholders.js index 9cf612d5..bafc36b1 100644 --- a/js/mzta-placeholders.js +++ b/js/mzta-placeholders.js @@ -260,4 +260,64 @@ export const placeholdersUtils = { return regex.test(text); }, + async getPlaceholdersValues(prompt_text, curr_message, mail_subject, body_text, msg_text, only_typed_text, selection_text, tags_full_list) { + let currPHs = await placeholdersUtils.extractPlaceholders(prompt_text); + // console.log(">>>>>>>>>> currPHs: " + JSON.stringify(currPHs)); + let finalSubs = {}; + for(let currPH of currPHs){ + switch(currPH.id){ + case 'mail_text_body': + finalSubs['mail_text_body'] = body_text; + break; + case 'mail_html_body': + finalSubs['mail_html_body'] = msg_text.html; + break; + case 'mail_typed_text': + finalSubs['mail_typed_text'] = only_typed_text; + break; + case 'mail_subject': + finalSubs['mail_subject'] = mail_subject; + break; + case 'selected_text': + finalSubs['selected_text'] = selection_text; + break; + case 'author': + finalSubs['author'] = curr_message.author; + break; + case 'recipients': + finalSubs['recipients'] = curr_message.recipients.join(", "); + break; + case 'cc_list': + finalSubs['cc_list'] = curr_message.ccList.join(", "); + break; + case 'junk_score': + finalSubs['junk_score'] = curr_message.junkScore; + break; + case 'mail_datetime': + finalSubs['mail_datetime'] = curr_message.date; + break; + case 'current_datetime': + finalSubs['current_datetime'] = new Date().toString(); + break; + case 'tags_current_email': + let tags_current_email_array = await transformTagsLabels(curr_message.tags, tags_full_list[1]); + finalSubs['tags_current_email'] = tags_current_email_array.join(", "); + break; + case 'tags_full_list': + finalSubs['tags_full_list'] = tags_full_list[0]; + break; + case 'thunderai_def_sign': + let prefs_def_sign = await browser.storage.sync.get({default_sign_name: ''}); + finalSubs['thunderai_def_sign'] = prefs_def_sign.default_sign_name; + break; + case 'thunderai_def_lang': + let prefs_def_lang = await browser.storage.sync.get({default_chatgpt_lang: ''}); + finalSubs['thunderai_def_lang'] = prefs_def_lang.default_chatgpt_lang; + break; + default: // TODO Manage custom placeholders https://github.com/micz/ThunderAI/issues/156 + break; + } + } + } + } \ No newline at end of file From 630cee4d27c23a7ee1260a4a716feddce6fc9274 Mon Sep 17 00:00:00 2001 From: mic Date: Sat, 8 Feb 2025 16:04:18 +0100 Subject: [PATCH 07/18] added mzta-utils-core.js and added some methods. see #237 --- js/mzta-utils-core.js | 59 +++++++++++++++++++++++++++++++++++++++++++ js/mzta-utils.js | 14 ++++++++++ 2 files changed, 73 insertions(+) create mode 100644 js/mzta-utils-core.js diff --git a/js/mzta-utils-core.js b/js/mzta-utils-core.js new file mode 100644 index 00000000..173cb101 --- /dev/null +++ b/js/mzta-utils-core.js @@ -0,0 +1,59 @@ +/* + * ThunderAI [https://micz.it/thunderbird-addon-thunderai/] + * Copyright (C) 2024 - 2025 Mic (m@micz.it) + + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +import { placeholdersUtils } from './mzta-placeholders.js'; + +export const taCoreUtils = { + + async getDefaultSignature(){ + let prefs = await browser.storage.sync.get({default_sign_name: ''}); + if(prefs.default_sign_name===''){ + return ''; + }else{ + return browser.i18n.getMessage("sign_msg_as") + " " + prefs.default_sign_name + "."; + } + }, + + async preparePrompt(curr_prompt, curr_message, chatgpt_lang, selection_text, body_text, subject_text, msg_text, only_typed_text, tags_full_list){ + let fullPrompt = ''; + + if(!placeholdersUtils.hasPlaceholder(curr_prompt.text)){ + // no placeholders, do as usual + fullPrompt = curr_prompt.text + (String(curr_prompt.need_signature) == "1" ? " " + await taCoreUtils.getDefaultSignature():"") + " " + chatgpt_lang + " \"" + (selection_text=='' ? body_text : selection_text) + "\" "; + }else{ + // we have at least a placeholder, do the magic! + let finalSubs = placeholdersUtils.getPlaceholdersValues(curr_prompt.text, curr_message, subject_text, body_text, msg_text, only_typed_text, selection_text, tags_full_list); + // console.log(">>>>>>>>>> finalSubs: " + JSON.stringify(finalSubs)); + let prefs_ph = await browser.storage.sync.get({placeholders_use_default_value: false}); + fullPrompt = (placeholdersUtils.replacePlaceholders(curr_prompt.text, finalSubs, prefs_ph.placeholders_use_default_value, true) + (String(curr_prompt.need_signature) == "1" ? " " + await taCoreUtils.getDefaultSignature():"") + " " + chatgpt_lang).trim(); + } + + return fullPrompt; + }, + + finalizePrompt_add_tags(fullPrompt, add_tags_maxnum, add_tags_force_lang, default_chatgpt_lang){ + if(add_tags_maxnum > 0){ + fullPrompt += " " + browser.i18n.getMessage("prompt_add_tags_maxnum") + " " + add_tags_maxnum +"."; + } + if(add_tags_force_lang && default_chatgpt_lang !== ''){ + fullPrompt += " " + browser.i18n.getMessage("prompt_add_tags_force_lang") + " " + default_chatgpt_lang + "."; + } + + return fullPrompt; + }, +}; \ No newline at end of file diff --git a/js/mzta-utils.js b/js/mzta-utils.js index 691ec949..d9b995c7 100644 --- a/js/mzta-utils.js +++ b/js/mzta-utils.js @@ -403,3 +403,17 @@ export async function migrateDefaultPromptsPropStorage(){ await browser.storage.sync.remove("_default_prompts_properties"); // console.log("migrateDefaultPromptsPropStorage: migrated default prompts properties from storage.sync to storage.local"); } + +export async function* getMessages(list) { + let page = await list; + for (let message of page.messages) { + yield message; + } + + while (page.id) { + page = await messenger.messages.continueList(page.id); + for (let message of page.messages) { + yield message; + } + } +} \ No newline at end of file From 452fd4abf47898b11cd57e380f6472d037f09ac6 Mon Sep 17 00:00:00 2001 From: mic Date: Sat, 8 Feb 2025 16:04:33 +0100 Subject: [PATCH 08/18] using core utils. see #237 --- js/mzta-menus.js | 31 ++++--------------------------- 1 file changed, 4 insertions(+), 27 deletions(-) diff --git a/js/mzta-menus.js b/js/mzta-menus.js index 71a24e6a..3d0dcc80 100644 --- a/js/mzta-menus.js +++ b/js/mzta-menus.js @@ -19,7 +19,8 @@ // Some original methods are derived from https://github.com/ali-raheem/Aify/blob/cfadf52f576b7be3720b5b73af7c8d3129c054da/plugin/html/actions.js import { getPrompts } from './mzta-prompts.js'; -import { getLanguageDisplayName, getMenuContextCompose, getMenuContextDisplay, i18nConditionalGet, getMailSubject, getTagsList, transformTagsLabels } from './mzta-utils.js' +import { getLanguageDisplayName, getMenuContextCompose, getMenuContextDisplay, i18nConditionalGet, getMailSubject, getTagsList } from './mzta-utils.js' +import { taCoreUtils } from './mzta-utils-core.js'; import { taLogger } from './mzta-logger.js'; import { placeholdersUtils } from './mzta-placeholders.js'; import { mzta_specialCommand } from './mzta-special-commands.js'; @@ -137,16 +138,7 @@ export class mzta_Menus { break; } - if(!placeholdersUtils.hasPlaceholder(curr_prompt.text)){ - // no placeholders, do as usual - fullPrompt = curr_prompt.text + (String(curr_prompt.need_signature) == "1" ? " " + await this.getDefaultSignature():"") + " " + chatgpt_lang + " \"" + (selection_text=='' ? body_text : selection_text) + "\" "; - }else{ - // we have at least a placeholder, do the magic! - let finalSubs = placeholdersUtils.getPlaceholdersValues(curr_prompt.text, curr_message, await getMailSubject(tabs[0]), body_text, msg_text, only_typed_text, selection_text, tags_full_list); - // console.log(">>>>>>>>>> finalSubs: " + JSON.stringify(finalSubs)); - let prefs_ph = await browser.storage.sync.get({placeholders_use_default_value: false}); - fullPrompt = (placeholdersUtils.replacePlaceholders(curr_prompt.text, finalSubs, prefs_ph.placeholders_use_default_value, true) + (String(curr_prompt.need_signature) == "1" ? " " + await this.getDefaultSignature():"") + " " + chatgpt_lang).trim(); - } + fullPrompt = await taCoreUtils.preparePrompt(curr_prompt, curr_message, chatgpt_lang, selection_text, body_text, await getMailSubject(tabs[0]), msg_text, only_typed_text, tags_full_list); switch(curr_prompt.id){ case 'prompt_translate_this': @@ -176,13 +168,7 @@ export class mzta_Menus { console.error("[ThunderAI | AddTags] Invalid connection type: " + prefs_at.connection_type); return {ok:'0'}; } - let add_tags_maxnum = prefs_at.add_tags_maxnum; - if(add_tags_maxnum > 0){ - fullPrompt += " " + browser.i18n.getMessage("prompt_add_tags_maxnum") + " " + add_tags_maxnum +"."; - } - if(prefs_at.add_tags_force_lang && prefs_at.default_chatgpt_lang !== ''){ - fullPrompt += " " + browser.i18n.getMessage("prompt_add_tags_force_lang") + " " + prefs_at.default_chatgpt_lang + "."; - } + fullPrompt = taCoreUtils.finalizePrompt_add_tags(fullPrompt, prefs_at.add_tags_maxnum, prefs_at.add_tags_force_lang, prefs_at.default_chatgpt_lang); this.logger.log("fullPrompt: " + fullPrompt); // TODO: use the current API, abort if using chatgpt web // COMMENTED TO DO TESTS @@ -257,15 +243,6 @@ export class mzta_Menus { this.rootMenu.push(curr_menu_entry); }; - async getDefaultSignature(){ - let prefs = await browser.storage.sync.get({default_sign_name: ''}); - if(prefs.default_sign_name===''){ - return ''; - }else{ - return browser.i18n.getMessage("sign_msg_as") + " " + prefs.default_sign_name + "."; - } - } - loadShortcutMenu() { this.shortcutMenu = []; this.allPrompts.forEach((prompt) => { From 310f5ec6e1f0d95e1171214594869819d542ebeb Mon Sep 17 00:00:00 2001 From: mic Date: Sun, 9 Feb 2025 22:24:57 +0100 Subject: [PATCH 09/18] mzta-utils-core renamed to mzta-utils-prompt. see #237 --- js/mzta-menus.js | 6 +++--- js/{mzta-utils-core.js => mzta-utils-prompt.js} | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) rename js/{mzta-utils-core.js => mzta-utils-prompt.js} (90%) diff --git a/js/mzta-menus.js b/js/mzta-menus.js index 3d0dcc80..5699c567 100644 --- a/js/mzta-menus.js +++ b/js/mzta-menus.js @@ -20,7 +20,7 @@ import { getPrompts } from './mzta-prompts.js'; import { getLanguageDisplayName, getMenuContextCompose, getMenuContextDisplay, i18nConditionalGet, getMailSubject, getTagsList } from './mzta-utils.js' -import { taCoreUtils } from './mzta-utils-core.js'; +import { taPromptUtils } from './mzta-utils-prompt.js'; import { taLogger } from './mzta-logger.js'; import { placeholdersUtils } from './mzta-placeholders.js'; import { mzta_specialCommand } from './mzta-special-commands.js'; @@ -138,7 +138,7 @@ export class mzta_Menus { break; } - fullPrompt = await taCoreUtils.preparePrompt(curr_prompt, curr_message, chatgpt_lang, selection_text, body_text, await getMailSubject(tabs[0]), msg_text, only_typed_text, tags_full_list); + fullPrompt = await taPromptUtils.preparePrompt(curr_prompt, curr_message, chatgpt_lang, selection_text, body_text, await getMailSubject(tabs[0]), msg_text, only_typed_text, tags_full_list); switch(curr_prompt.id){ case 'prompt_translate_this': @@ -168,7 +168,7 @@ export class mzta_Menus { console.error("[ThunderAI | AddTags] Invalid connection type: " + prefs_at.connection_type); return {ok:'0'}; } - fullPrompt = taCoreUtils.finalizePrompt_add_tags(fullPrompt, prefs_at.add_tags_maxnum, prefs_at.add_tags_force_lang, prefs_at.default_chatgpt_lang); + fullPrompt = taPromptUtils.finalizePrompt_add_tags(fullPrompt, prefs_at.add_tags_maxnum, prefs_at.add_tags_force_lang, prefs_at.default_chatgpt_lang); this.logger.log("fullPrompt: " + fullPrompt); // TODO: use the current API, abort if using chatgpt web // COMMENTED TO DO TESTS diff --git a/js/mzta-utils-core.js b/js/mzta-utils-prompt.js similarity index 90% rename from js/mzta-utils-core.js rename to js/mzta-utils-prompt.js index 173cb101..7388a762 100644 --- a/js/mzta-utils-core.js +++ b/js/mzta-utils-prompt.js @@ -18,7 +18,7 @@ import { placeholdersUtils } from './mzta-placeholders.js'; -export const taCoreUtils = { +export const taPromptUtils = { async getDefaultSignature(){ let prefs = await browser.storage.sync.get({default_sign_name: ''}); @@ -34,13 +34,13 @@ export const taCoreUtils = { if(!placeholdersUtils.hasPlaceholder(curr_prompt.text)){ // no placeholders, do as usual - fullPrompt = curr_prompt.text + (String(curr_prompt.need_signature) == "1" ? " " + await taCoreUtils.getDefaultSignature():"") + " " + chatgpt_lang + " \"" + (selection_text=='' ? body_text : selection_text) + "\" "; + fullPrompt = curr_prompt.text + (String(curr_prompt.need_signature) == "1" ? " " + await taPromptUtils.getDefaultSignature():"") + " " + chatgpt_lang + " \"" + (selection_text=='' ? body_text : selection_text) + "\" "; }else{ // we have at least a placeholder, do the magic! let finalSubs = placeholdersUtils.getPlaceholdersValues(curr_prompt.text, curr_message, subject_text, body_text, msg_text, only_typed_text, selection_text, tags_full_list); // console.log(">>>>>>>>>> finalSubs: " + JSON.stringify(finalSubs)); let prefs_ph = await browser.storage.sync.get({placeholders_use_default_value: false}); - fullPrompt = (placeholdersUtils.replacePlaceholders(curr_prompt.text, finalSubs, prefs_ph.placeholders_use_default_value, true) + (String(curr_prompt.need_signature) == "1" ? " " + await taCoreUtils.getDefaultSignature():"") + " " + chatgpt_lang).trim(); + fullPrompt = (placeholdersUtils.replacePlaceholders(curr_prompt.text, finalSubs, prefs_ph.placeholders_use_default_value, true) + (String(curr_prompt.need_signature) == "1" ? " " + await taPromptUtils.getDefaultSignature():"") + " " + chatgpt_lang).trim(); } return fullPrompt; From 6bb3ad2044f19e5acf5847a5b03cfa24f233a83e Mon Sep 17 00:00:00 2001 From: mic Date: Sun, 9 Feb 2025 22:30:44 +0100 Subject: [PATCH 10/18] getDefaultLang method added. see #237 --- js/mzta-utils-prompt.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/js/mzta-utils-prompt.js b/js/mzta-utils-prompt.js index 7388a762..b8797d49 100644 --- a/js/mzta-utils-prompt.js +++ b/js/mzta-utils-prompt.js @@ -56,4 +56,19 @@ export const taPromptUtils = { return fullPrompt; }, + + async getDefaultLang(curr_prompt){ + let chatgpt_lang = ''; + if(String(curr_prompt.define_response_lang) == "1"){ + let prefs = await browser.storage.sync.get({default_chatgpt_lang: ''}); + chatgpt_lang = prefs.default_chatgpt_lang; + if(chatgpt_lang === ''){ + chatgpt_lang = browser.i18n.getMessage("reply_same_lang"); + }else{ + chatgpt_lang = browser.i18n.getMessage("prompt_lang") + " " + chatgpt_lang + "."; + } + } + + return chatgpt_lang; + }, }; \ No newline at end of file From 79e5b740f904dd620ed28289765961c460718125 Mon Sep 17 00:00:00 2001 From: mic Date: Sun, 9 Feb 2025 22:31:24 +0100 Subject: [PATCH 11/18] using getDefaultLang --- js/mzta-menus.js | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/js/mzta-menus.js b/js/mzta-menus.js index 5699c567..2f6a3625 100644 --- a/js/mzta-menus.js +++ b/js/mzta-menus.js @@ -107,18 +107,8 @@ export class mzta_Menus { only_typed_text = msg_text.only_typed_text.replace(/\s+/g, ' ').trim(); //open chatgpt window //console.log("Click menu item..."); - let chatgpt_lang = ''; - if(String(curr_prompt.define_response_lang) == "1"){ - let prefs = await browser.storage.sync.get({default_chatgpt_lang: ''}); - chatgpt_lang = prefs.default_chatgpt_lang; - //console.log(" >>>>>>>>>>>> chatgpt_lang: " + chatgpt_lang); - if(chatgpt_lang === ''){ - chatgpt_lang = browser.i18n.getMessage("reply_same_lang"); - }else{ - chatgpt_lang = browser.i18n.getMessage("prompt_lang") + " " + chatgpt_lang + "."; - } - } - + let chatgpt_lang = getDefaultLang(curr_prompt); + let fullPrompt = ''; let tags_full_list = await getTagsList(); From c39d68d859e271c35bc2d6e7ad3eb88b3a4537f2 Mon Sep 17 00:00:00 2001 From: mic Date: Sun, 9 Feb 2025 22:44:48 +0100 Subject: [PATCH 12/18] passing do_debug to mzta_specialCommand --- js/mzta-menus.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/mzta-menus.js b/js/mzta-menus.js index 2f6a3625..2d21d26e 100644 --- a/js/mzta-menus.js +++ b/js/mzta-menus.js @@ -153,7 +153,7 @@ export class mzta_Menus { switch(curr_prompt.id){ case 'prompt_add_tags': { // Add tags to the email let tags_current_email = ''; - let prefs_at = await browser.storage.sync.get({add_tags_maxnum: 3, connection_type: '', add_tags_force_lang: true, default_chatgpt_lang: ''}); + let prefs_at = await browser.storage.sync.get({add_tags_maxnum: 3, connection_type: '', add_tags_force_lang: true, default_chatgpt_lang: '', do_debug: false}); if((prefs_at.connection_type === '')||(prefs_at.connection_type === null)||(prefs_at.connection_type === undefined)||(prefs_at.connection_type === 'chatgpt_web')){ console.error("[ThunderAI | AddTags] Invalid connection type: " + prefs_at.connection_type); return {ok:'0'}; @@ -163,7 +163,7 @@ export class mzta_Menus { // TODO: use the current API, abort if using chatgpt web // COMMENTED TO DO TESTS // tags_current_email = "recipients, TEST, home, work, CAR, light"; - let cmd_addTags = new mzta_specialCommand(fullPrompt,prefs_at.connection_type,true); + let cmd_addTags = new mzta_specialCommand(fullPrompt,prefs_at.connection_type,prefs_at.do_debug); await cmd_addTags.initWorker(); try{ tags_current_email = await cmd_addTags.sendPrompt(); From 5fbead1fcc45162f52fe9ca4112d84d097d859f4 Mon Sep 17 00:00:00 2001 From: mic Date: Sun, 9 Feb 2025 22:45:09 +0100 Subject: [PATCH 13/18] getMailBody method added. see #237 --- js/mzta-utils.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/js/mzta-utils.js b/js/mzta-utils.js index d9b995c7..17b70de4 100644 --- a/js/mzta-utils.js +++ b/js/mzta-utils.js @@ -83,6 +83,29 @@ export async function getMailSubject(tab){ } } +export async function getMailBody(fullMessage){ + let text = ''; + let html = ''; + + if (fullMessage.contentType.trim().toLowerCase() === "text/plain") { + text = fullMessage.body; + } + if (fullMessage.contentType.trim().toLowerCase() === "text/html") { + html = fullMessage.body; + } + + for (let part of fullMessage.parts) { + if (part.contentType.trim().toLowerCase() === "text/plain") { + text = part.body; + } + if (part.contentType.trim().toLowerCase() === "text/html") { + html = part.body; + } + } + + return {text, html}; +} + export async function reloadBody(tabId){ let composeDetails = await messenger.compose.getComposeDetails(tabId); let originalHtmlBody = composeDetails.body + " "; From a426577f3a355cee7dedf772382be74c7c548dc4 Mon Sep 17 00:00:00 2001 From: mic Date: Sun, 9 Feb 2025 23:16:20 +0100 Subject: [PATCH 14/18] add_tags trimming the response --- js/mzta-menus.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/mzta-menus.js b/js/mzta-menus.js index 2d21d26e..a4254510 100644 --- a/js/mzta-menus.js +++ b/js/mzta-menus.js @@ -166,7 +166,7 @@ export class mzta_Menus { let cmd_addTags = new mzta_specialCommand(fullPrompt,prefs_at.connection_type,prefs_at.do_debug); await cmd_addTags.initWorker(); try{ - tags_current_email = await cmd_addTags.sendPrompt(); + tags_current_email = (await cmd_addTags.sendPrompt()).trim(); // console.log(">>>>>>>>>>> tags_current_email: " + tags_current_email); }catch(err){ console.error("[ThunderAI] Error getting tags: ", err); From 782282e8fba068bf7a6164d7539d117a197a1149 Mon Sep 17 00:00:00 2001 From: mic Date: Sun, 9 Feb 2025 23:16:58 +0100 Subject: [PATCH 15/18] release notes updated --- CHANGELOG.md | 1 + options/mzta-release-notes.html | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d6a00df..3a845a9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@
  • Added the {%thunderai_def_sign%} placeholder to get the default signature as defined in the options [#248].
  • Added the {%thunderai_def_lang%} placeholder to get the default language as defined in the options [#248].
  • +
  • Various minor improvements.
  • ...

Version 3.1.2 - 29/01/2025

diff --git a/options/mzta-release-notes.html b/options/mzta-release-notes.html index 1b00e6ba..b4538b2c 100644 --- a/options/mzta-release-notes.html +++ b/options/mzta-release-notes.html @@ -11,6 +11,7 @@
  • Added the {%thunderai_def_sign%} placeholder to get the default signature as defined in the options [#248].
  • Added the {%thunderai_def_lang%} placeholder to get the default language as defined in the options [#248].
  • +
  • Various minor improvements.
  • ...

Version 3.1.2 - 29/01/2025

From 65ee230fb258fea00f79cfa8f3e4f8bde238d6bc Mon Sep 17 00:00:00 2001 From: mic Date: Sun, 9 Feb 2025 23:23:49 +0100 Subject: [PATCH 16/18] method call fixed --- js/mzta-menus.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/mzta-menus.js b/js/mzta-menus.js index a4254510..e1938693 100644 --- a/js/mzta-menus.js +++ b/js/mzta-menus.js @@ -107,7 +107,7 @@ export class mzta_Menus { only_typed_text = msg_text.only_typed_text.replace(/\s+/g, ' ').trim(); //open chatgpt window //console.log("Click menu item..."); - let chatgpt_lang = getDefaultLang(curr_prompt); + let chatgpt_lang = taPromptUtils.getDefaultLang(curr_prompt); let fullPrompt = ''; let tags_full_list = await getTagsList(); From 9fd035764e413458129d0a0959bdf2317226d8c7 Mon Sep 17 00:00:00 2001 From: mic Date: Sun, 9 Feb 2025 23:24:08 +0100 Subject: [PATCH 17/18] autotagging implemented. see #237 --- mzta-background.js | 129 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 106 insertions(+), 23 deletions(-) diff --git a/mzta-background.js b/mzta-background.js index b837dd92..1db8a490 100644 --- a/mzta-background.js +++ b/mzta-background.js @@ -20,7 +20,9 @@ import { mzta_script } from './js/mzta-chatgpt.js'; import { prefs_default } from './options/mzta-options-default.js'; import { mzta_Menus } from './js/mzta-menus.js'; import { taLogger } from './js/mzta-logger.js'; -import { getCurrentIdentity, getOriginalBody, replaceBody, setBody, i18nConditionalGet, generateCallID, migrateCustomPromptsStorage, migrateDefaultPromptsPropStorage, getGPTWebModelString, getTagsList, createTag, assignTagsToMessage, checkIfTagExists, getActiveSpecialPromptsIDs, checkSparksPresence } from './js/mzta-utils.js'; +import { getCurrentIdentity, getOriginalBody, replaceBody, setBody, i18nConditionalGet, generateCallID, migrateCustomPromptsStorage, migrateDefaultPromptsPropStorage, getGPTWebModelString, getTagsList, createTag, assignTagsToMessage, checkIfTagExists, getActiveSpecialPromptsIDs, checkSparksPresence, getMessages, getMailBody } from './js/mzta-utils.js'; +import { taPromptUtils } from './js/mzta-utils-prompt.js'; +import { mzta_specialCommand } from './js/mzta-special-commands.js'; await migrateCustomPromptsStorage(); await migrateDefaultPromptsPropStorage(); @@ -28,7 +30,9 @@ await migrateDefaultPromptsPropStorage(); var original_html = ''; var modified_html = ''; -let prefs_init = await browser.storage.sync.get({do_debug: false, add_tags: true, get_calendar_event: true, connection_type: 'chatgpt_web'}); +let prefs_init = {}; +await reload_pref_init(); + let taLog = new taLogger("mzta-background",prefs_init.do_debug); let special_prompts_ids = getActiveSpecialPromptsIDs(prefs_init.add_tags, await doGetCalendarEvent(prefs_init.get_calendar_event), (prefs_init.connection_type === "chatgpt_web")); @@ -134,6 +138,24 @@ async function _reload_menus() { return true; } +async function _assign_tags(_data, create_new_tags = true) { + let all_tags_list = await getTagsList(); + all_tags_list = all_tags_list[1]; + // console.log(">>>>>>>>>>>>>>> all_tags_list: " + JSON.stringify(all_tags_list)); + taLog.log("assign_tags data: " + JSON.stringify(_data)); + let new_tags = []; + for (const tag of _data.tags) { + // console.log(">>>>>>>>>>>>>>> tag: " + tag); + if (create_new_tags && !checkIfTagExists(tag, all_tags_list)) { + taLog.log("Creating tag: " + tag); + await createTag(tag); + } + new_tags.push(tag); + } + await assignTagsToMessage(_data.messageId, new_tags); + taLog.log("Assigned tags: " + JSON.stringify(new_tags)); +} + messenger.runtime.onMessage.addListener((message, sender, sendResponse) => { // Check what type of message we have received and invoke the appropriate // handler function. @@ -240,24 +262,7 @@ messenger.runtime.onMessage.addListener((message, sender, sendResponse) => { return _popup_menu_ready(); break; case 'assign_tags': - async function _assign_tags() { - let all_tags_list = await getTagsList(); - all_tags_list = all_tags_list[1]; - // console.log(">>>>>>>>>>>>>>> all_tags_list: " + JSON.stringify(all_tags_list)); - taLog.log("assign_tags data: " + JSON.stringify(message)); - let new_tags = []; - for (const tag of message.tags) { - // console.log(">>>>>>>>>>>>>>> tag: " + tag); - if (!checkIfTagExists(tag, all_tags_list)) { - taLog.log("Creating tag: " + tag); - await createTag(tag); - } - new_tags.push(tag); - } - await assignTagsToMessage(message.messageId, new_tags); - taLog.log("Assigned tags: " + JSON.stringify(new_tags)); - } - return _assign_tags(); + return _assign_tags(message); break; default: break; @@ -596,7 +601,7 @@ async function doGetCalendarEvent(get_calendar_event) { } async function reload_pref_init(){ - prefs_init = await browser.storage.sync.get({do_debug: false, add_tags: true, get_calendar_event: true, connection_type: 'chatgpt_web'}); + prefs_init = await browser.storage.sync.get({do_debug: false, add_tags: true, get_calendar_event: true, connection_type: 'chatgpt_web', add_tags_auto: false, add_tags_auto_force_existing: false, add_tags_auto_only_inbox: true}); } @@ -639,7 +644,85 @@ function setupStorageChangeListener() { // Call the function to set up the listener setupStorageChangeListener(); - // Menus handling const menus = new mzta_Menus(openChatGPT, prefs_init.do_debug); -menus.loadMenus(special_prompts_ids); \ No newline at end of file +menus.loadMenus(special_prompts_ids); + + +// Listening for new received emails +const newEmailListener = (folder, messagesList) => { + taLog.log("New mail received"); + taLog.log(`Folder: ${folder.name}`); + + async function _newEmailListener(){ + let messages = getMessages(messagesList); + + for await (let message of messages) { + let fullMessage = await browser.messages.getFull(message.id); + + taLog.log(`From: ${fullMessage.headers.from}`); + taLog.log(`Subject: ${fullMessage.headers.subject}`); + taLog.log(`Name: ${fullMessage.name}`); + taLog.log(`Body: ${fullMessage.body}`); + taLog.log(`contentType: [${fullMessage.contentType}]`); + taLog.log(`fullMessage.parts.length: ${fullMessage.parts.length}`); + + if (fullMessage.parts.length > 0) { + for (let part of fullMessage.parts) { + taLog.log(`From: ${part.headers.from}`); + taLog.log(`Subject: ${part.headers.subject}`); + taLog.log(`Name: ${part.name}`); + taLog.log(`Body: ${part.body}`); + taLog.log(`contentType: [${part.contentType}]`); + taLog.log('contentType JSON: '+JSON.stringify(part.contentType)); + if (part.contentType.trim().toLowerCase() === "text/plain") { + taLog.log("Body (text/plain):" + part.body); + // return part.body; + } + if (part.contentType.trim().toLowerCase() === "text/html") { + taLog.log("Body (text/html):" + part.body); + // return part.body; + } + } + } + + let specialFullPrompt = ''; + let curr_fullMessage = null; + + // if some auto feature is active prepare some data + // this will be used when will be implemented the spam filter (https://github.com/micz/ThunderAI/issues/231) + // or the auto translator https://github.com/micz/ThunderAI/issues/247 + if(prefs_init.add_tags_auto){ + curr_fullMessage = await browser.messages.getFull(message.id); + } + + // Auto add_tags + if(prefs_init.add_tags_auto){ + let curr_prompt_add_tags = menus.allPrompts.find(p => p.id === 'prompt_add_tags'); + let chatgpt_lang = taPromptUtils.getDefaultLang(curr_prompt_add_tags); + let msg_text = await getMailBody(curr_fullMessage); + let body_text = msg_text.text.replace(/\s+/g, ' ').trim(); + let tags_full_list = await getTagsList(); + specialFullPrompt = await taPromptUtils.preparePrompt(curr_prompt_add_tags, message, chatgpt_lang, /*selection_text*/ '', body_text, curr_fullMessage.headers.subject, msg_text, /*only_typed_text*/ '', tags_full_list); + let prefs_aat = await browser.storage.sync.get({add_tags_maxnum: 3, connection_type: '', add_tags_force_lang: true, default_chatgpt_lang: '', add_tags_auto_force_existing: false}); + specialFullPrompt = taPromptUtils.finalizePrompt_add_tags(specialFullPrompt, prefs_aat.add_tags_maxnum, prefs_aat.add_tags_force_lang, prefs_aat.default_chatgpt_lang); + taLog.log("Special prompt: " + specialFullPrompt); + let cmd_addTags = new mzta_specialCommand(specialFullPrompt,prefs_aat.connection_type,prefs_init.do_debug); + await cmd_addTags.initWorker(); + let tags_current_email = ''; + try{ + tags_current_email = (await cmd_addTags.sendPrompt()).trim(); + }catch(err){ + console.error("[ThunderAI | Auto add_tags] Error getting tags: ", err); + } + taLog.log("tags_current_email: " + tags_current_email); + let _data = {messageId: message.id, tags: tags_current_email.split(/,\s*/)}; + _assign_tags(_data, !prefs_aat.add_tags_auto_force_existing); + } + } + } + + return _newEmailListener(); +} + +browser.messages.onNewMailReceived.addListener(newEmailListener, !prefs_init.add_tags_auto_only_inbox); From 0e28298df4ffc3fb524a5c42a0d37ed62e6add66 Mon Sep 17 00:00:00 2001 From: mic Date: Sun, 9 Feb 2025 23:24:56 +0100 Subject: [PATCH 18/18] release notes updated --- CHANGELOG.md | 1 + options/mzta-release-notes.html | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a845a9e..7312cf28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@

Version 3.2.0 - ??/??/2025

    +
  • Added an option to automatically tag incoming emails [#237].
  • Added the {%thunderai_def_sign%} placeholder to get the default signature as defined in the options [#248].
  • Added the {%thunderai_def_lang%} placeholder to get the default language as defined in the options [#248].
  • Various minor improvements.
  • diff --git a/options/mzta-release-notes.html b/options/mzta-release-notes.html index b4538b2c..5129956e 100644 --- a/options/mzta-release-notes.html +++ b/options/mzta-release-notes.html @@ -9,6 +9,7 @@

    ThunderAI Release Notes

    Version 3.2.0 - ??/??/2025

      +
    • Added an option to automatically tag incoming emails [#237].
    • Added the {%thunderai_def_sign%} placeholder to get the default signature as defined in the options [#248].
    • Added the {%thunderai_def_lang%} placeholder to get the default language as defined in the options [#248].
    • Various minor improvements.