← Back to docs

Mail Support Assistant

Language: SV | EN | SV

Mail Support Assistant

Mail Support Assistant är ett adminkonfigurerat supportmailflöde för Tools och den fristående PHP-klienten som ligger under public/tornevall-tools-mail-assistant.

Vad den gör

  • lagrar IMAP-mailboxar i Tools admin
  • lagrar regelstyrd matchning på From, To, Subject och valfri body-text
  • tillåter per regel statiska autosvar eller Tools/OpenAI-stödda svar
  • stöder per regel egen avsändare, BCC, footer, responder/persona/mood/custom instruction, vald AI-modell och reasoning effort
  • stöder mailboxnivåns AI-triage för omatchade mail med sorterade add-row If... + Instructions...-regler plus en strikt mailboxägd sista fallback
  • låter den fristående klienten avgöra om ett hanterat mail ska flyttas till en folder eller raderas efter svar
  • kan nu synka behandlade mailtrådar tillbaka till Tools som spårade supportärenden, med både trådad Tools-adminvy och publik ärendelänk som kan delas med mottagaren
  • centraliserade Tools-ärenden kan nu också lagra additiva fullständiga inbound-/outbound-bodyfält samt metadata om vilken runner/server som hanterade mailet, så admin kan läsa själva innehållet även när cronjobbet kördes på en annan host
  • kan valfritt skicka ett operatörsmejl efter en körning med en sammanfattning av de mail som inte besvarades
  • lämnar orörda mail helt orörda om ingen regel matchar
  • håller standalone-runtime helt framework-fri (vanlig PHP, inget Laravel-runtimekrav)

Förutsättningar

Innan Mail Support Assistant faktiskt kan fungera i drift behöver följande vara på plats:

Tools / konto

  • ett riktigt Tools- / ToolsAPI-konto på samma Tools-host som ska leverera config/API-anropen
  • åtkomst till admin-UI:t på /admin/mail-support-assistant
  • minst en konfigurerad mailbox i Tools admin
  • en personlig klienttoken från Tools admin:
    • provider_mail_support_assistant
    • aktiv
    • AI-kapabel (is_ai=1)
  • godkänd provider_openai-access för tokenägaren om någon regel eller omatchad fallback använder AI och ägaren inte är admin

Valfria Tools-krav

  • en dedikerad relay-token provider_mail_support_assistant_mailer om utgående mail ska skickas via POST /api/mail-support-assistant/send-reply
  • rättigheten mail-support-assistant.relay för relay-tokenets ägare när Tools-relay ska tillåtas för icke-admin-användare

Mail / runtime

  • fungerande IMAP-uppgifter lagrade i Tools admin för varje mailbox som runnern ska polla
  • en nåbar Tools base URL från standalone-runtime
  • en vald strategi för utgående transport:
    • lokal SMTP
    • PHP mail()
    • eget MTA-kommando
    • eller Tools relay
  • PHP-runtime med nödvändiga extensioner och skrivbar lokal storage/ för loggar, sammanfattningar och valfri lokal state

Praktisk driftnot

  • den fristående klienten hittar inte på mailboxkonfiguration lokalt; mailboxar, regler, responder-defaults, omatchade fallback-rader och större delen av beteendet styrs först i Tools
  • om det saknas Tools-konto, giltig klienttoken eller mailboxkonfiguration i Tools admin så har supportassistenten inte tillräckligt underlag för att köra

Support / ändringar / issue tracking

Om du behöver hjälp, vill beställa en ändring eller rapportera problem i den fristående klienten ska du använda GitHub tickets här:

Det repot är rätt plats för runtime-/klientproblem, installationsfrågor och feature requests för den fristående Mail Support Assistant-klienten.

Tools admin-UI

Admin-only-konfiguration finns på:

  • /admin/mail-support-assistant

Därifrån kan du:

  1. skapa/uppdatera mailboxar
  2. lägga till sorterade svarregler per mailbox
  3. rotera den dedikerade tokenen för standalone-klienten (provider_mail_support_assistant)
  4. rotera en dedikerad relay-token (provider_mail_support_assistant_mailer) för utgående mailskick via Tools
  5. granska nyligen synkade supportärenden som standalone-assistenten skickat tillbaka in i Tools

Mailboxinställningarna har nu också en sektion för generiskt AI-svar på omatchade mail. Där kan admin styra mailboxnivå-fallback för mail som inte träffar någon explicit regel, inklusive:

  • aktivera/inaktivera AI-fallback för omatchade mail
  • valfri modellöverskrivning för just den mailboxen
  • valfri reasoning-överskrivning för just den mailboxen
  • valfri mailboxnivå-tröskel för spam score som stoppar svar och lämnar mailet oläst när score är för hög
  • en strikt mailboxnivå-fallback med egen kryssruta, allow-condition och sista instruktionstext
  • mailboxspecifika add-row If...-regler som beskriver vilka annars omatchade mail som får besvaras före denna sista fallback
  • per-rad instruktionstext för dessa avancerade omatchade svar
  • valfri per-rad override för footer/modell/reasoning

Tools admin-sidan stöder nu också lättviktig AJAX-sparning för create/update/delete av mailboxar och regler, så vanliga ändringar inte längre måste gå genom en full sidomladdning. Omatchade fallback-IF-rader sparas nu också direkt via AJAX med lokal busy-/success-status under radens knapp, och radering tar bort raden direkt samt återställer tomläget när sista raden tas bort.

Viktig prioritetsregel:

  • mailboxnivåns generiska AI-inställningar används bara när ingen regel matchade mailet
  • fallbacken för omatchade mail aktiveras nu bara av mailboxens checkbox i Tools-konfigurationen; miljöflaggor räcker inte längre för att slå på den
  • om den checkboxen är avstängd får standalone-klienten inte utvärdera några avancerade no-match-rader eller mailboxens sista fallback alls, även om äldre IF-/instruktionstexter fortfarande råkar vara ifyllda
  • AI för omatchade mail körs nu först som ett strikt JSON-beslut: standalone-klienten skickar bara svar när AI uttryckligen returnerar ett strukturerat tillåt-beslut med hög säkerhet
  • om det varken finns aktiva no-match-rader eller mailboxens egen sista allow-condition/instruktion räknas no-match-AI som ofullständigt konfigurerad och inget fallbacksvar skickas
  • no-match-rader körs i sort_order-ordning och kan falla vidare till senare rader om en tidigare rad avvisas
  • efter dessa avancerade rader kan mailboxens egen sista fallback fortfarande köras som sista omatchade väg när checkboxen är aktiv och båda textfälten är ifyllda
  • samma fall-through gäller nu också när en enskild no-match-rad träffar ett radlokalt AI-/API-fel; standalone-runnern loggar den felande raden men fortsätter ändå med senare aktiva rader innan den ger upp
  • om flera regler matchar samma inkommande mail utvärderar standalone-klienten nu alla matchande regler och väljer först den mest specifika regeln (flest aktiva matchfält, sedan längst sammanlagd matchtext, därefter sort_order)
  • den valda regeln och övriga matchande kandidater sparas nu i standalone-diagnostiken så regelkrockar kan granskas i efterhand
  • om en matchad regel har ai_enabled=true skickar standalone-klienten nu regelns responder/persona/custom instruction/modell/reasoning till Tools som explicita AI-override-fält för just det svaret
  • den statiska templaten används bara som fallback om AI-anropet misslyckas eller returnerar ett tomt/icke-användbart svar
  • skippade eller obesvarade olästa mail trycks nu också uttryckligen tillbaka till oläst när IMAP-servern stöder att \\Seen rensas, vilket minskar att fetches råkar lämna fel read-state efter sig
  • lokal message-state kan nu också spara lätta tråd-/konversationsutdrag så senare AI-svar kan fortsätta en konversation mer naturligt utan att den historiken används som dedupe-gate
  • när In-Reply-To / References länkar ett uppföljningsmail till en tidigare hanterad konversation kan standalone-runnern nu också återanvända den tidigare matchade regeln eller prioritera den tidigare använda no-match-raden så tråden hålls kvar på samma supportspår
  • standalone-genererade svar sparar nu också ett genererat utgående reply_message_id i lokal state, vilket gör att senare Gmail-/Outlook-följdmail lättare kan kopplas tillbaka till samma konversation även när användaren svarar på assistentens skickade mail i stället för originalmailet
  • standalone-genererade svar kan nu också stämpla in ett stabilt ärende-/case-id i ämnesraden (standardformat ungefär [Ärende MSA-ABC12345]), och senare svar i samma tråd återanvänder samma tagg i stället för att appenda ett nytt ärende-id varje gång konversationen besvaras
  • standalone-genererade HTML-svar konverterar nu också vanlig markdown från AI-/operatörstext till riktig HTML-struktur (till exempel rubriker, listor, länkar, betoning och inline-kod) i stället för att visa råa markdown-markörer i det stylade svaret
  • om ett uppföljningsmail kommer i ett äldre/trasigare format där användbara In-Reply-To / References saknas kan standalone-runnern nu ändå prova en fallback via normaliserat subject + samma deltagare innan mailet behandlas som en helt ny no-match-konversation
  • om den länkade tidigare konversationen redan godkänts via no-match-AI kan standalone-runnern nu fortsätta direkt på samma tidigare använda no-match-rad för uttryckligt länkade följdmail i stället för att köra om det första allow-condition-steget från början på samma tråd
  • rate-limitade AI-fel (429 / Too Many Attempts) försöks nu om automatiskt innan standalone-klienten ger upp AI-svaret för regeln
  • om en AI-aktiverad regel saknar explicit template_text-fallback skickar standalone-klienten inte längre den gamla generiska meningen Thank you for your message. We have reviewed it. när AI fallerar; svaret avbryts i stället och felet loggas
  • klartextmail från kontaktformulär som innehåller body-labels som From:, Subject:, Sender IP: och Message Body: bevarar nu också själva problemtexten i standalone-sammanfattningar/AI-kontext i stället för att falla ner till bara den första headerliknande raden
  • HTML-baserade inkommande mail dekodas nu också till läsbar plain text innan regelmatchning, AI-triage för omatchade mail, bifogade request-sammanfattningar och sparade lokala message copies byggs, så standalone-klienten inte längre beter sig som om bara subject fanns när body kom som HTML
  • MIME-bodydekodningen är nu charset-medveten, vilket gör att icke-UTF8 eller på annat sätt trasiga inkommande mail oftare ger användbar body-text i stället för förvanskad AI-/regelmatchningskontext
  • när den strikta omatchade fallbacken faktiskt skickar ett svar markerar standalone-runnern mailet som läst direkt så att det inte plockas upp igen av pollningen av olästa mail

Den genererade tokenen sparas som en personlig api_keys-rad och markeras automatiskt som AI-kapabel (is_ai=1).

Relay-token (provider_mail_support_assistant_mailer) är personliga icke-globala nycklar och är avsedda endast för POST /api/mail-support-assistant/send-reply. De är inte AI-mottagartokens.

Webbgränssnittet använder nu också mer generiska exempelvärden för vanliga supportflöden, till exempel orderstatus, referensnummer och allmän kundsupport, i stället för specialfallsliknande juridik- eller copyrightexempel.

Trådad ärendespårning

  • Tools lagrar nu synkade Mail Support Assistant-konversationer som trådade supportärenden.
  • Adminoperatörer kan granska dem direkt från /admin/mail-support-assistant och därifrån öppna en separat trådad ärendesida.
  • Den trådade ärendesidan kan nu också visa centralt lagrad full body-text/HTML samt vilken runner/server som synkade respektive meddelande.
  • Standalone-dashboarden kan också länka varje meddelandekort tillbaka till motsvarande Tools-ärende när tråden redan hunnit synkas.
  • Utgående assistentsvar kan nu också bifoga en publik ärendelänk till mottagaren när standalone-runtime först lyckas skapa den länken i Tools.

Synlighet i standalone-inkorgen

  • Standalone-dashboarden är fortfarande inte tänkt att ersätta full mailboxadministration, men den kan nu också blanda in en live-preview av olästa IMAP-mail i aktivitetspanelen.
  • Det betyder att olästa mail nu kan dyka upp i assistentens webbgränssnitt även innan en ny sparad latest-run-sammanfattning har skrivits.
  • Tools admin visar den synkade/trådade ärendevyn; standalone-dashboarden visar den lokala live-previewen av olästa mail plus latest-run/manualhantering.

Valfri rapport över obesvarade mail

  • Standalone kan nu skicka ett sammanfattningsmail efter en körning med vilka meddelanden som inte besvarades.
  • Aktivera det med:
    • MAIL_ASSISTANT_UNANSWERED_REPORT_ENABLED=true
    • MAIL_ASSISTANT_UNANSWERED_REPORT_TO=user@example.com[,second@example.com]
  • Rapporten är avsedd för operatörsuppföljning och stoppar inte körningen även om själva rapportmailet misslyckas.

Nya API-endpoints som standalone-klienten använder

  • GET /api/mail-support-assistant/cases
    • Auth: samma personliga AI-kapabla tokenmodell som GET /api/mail-support-assistant/config
    • Syfte: hämta nyligen lagrade Tools-ärenden som är synliga för tokenägaren
  • POST /api/mail-support-assistant/cases/sync
    • Auth: samma personliga AI-kapabla tokenmodell som GET /api/mail-support-assistant/config
    • Syfte: låta standalone-klienten uppdatera ett inkommande/utgående supporttrådssnapshot tillbaka till Tools
    • Vanliga payloadfält: mailbox_id, message_id, message_key, reply_issue_id, thread_key, subject, from, to, status, reason, additiva body_text, additiva body_text_reply_aware, additiva body_html, body_excerpt, valfritt reply_message_id, additiva reply_body_text, additiva reply_body_html och valfritt reply_excerpt

Eftersom den fristående klienten hämtar mailbox- och regelkonfiguration direkt från Tools med bearer-token räcker det i många installationer med CLI-runner eller cronjobb. Den lilla PHP-dashboarden är valfri och behöver normalt inte exponeras publikt.

Samma CLI-/dashboard-runner är nu också overlapsäker: varje körning tar en lokal icke-blockerande låsfil under storage/state/run.lock, så om cron eller dashboarden försöker starta en ny körning medan en annan redan arbetar hoppar det andra försöket över direkt med runner_already_active i stället för att samma olästa mailbox pollas dubbelt.

Shell-wrappern cron-run.sh håller nu dessutom en egen PID-medveten låskatalog (standard storage/state/cron-run.lock.d) med städning av stale-lås, så överlappande cronkörningar kan stoppas redan innan PHP-runnern startar. Den shell-låsvägen kan överskrivas via MAIL_ASSISTANT_CRON_LOCK_DIR när flera installationer delar samma filsystem.

Den fristående dashboarden är nu också mer operatörsvänlig än tidigare:

  • senaste körningen visas som mailbox-/meddelandekort i stället för bara råa JSON-block
  • konfigurerade mailboxkort visas nu där även innan någon dry-run eller riktig körning hunnit spara meddelandeaktivitet, med en tydlig not om att detta är en operatörsvy för senaste körningen och inte någon full live-IMAP-klient
  • varje meddelande kan expandera tråddiagnostik, vald regel/no-match-resonemang och valfri lokal header-/body-preview när en cachad message copy finns
  • runnern uppdaterar nu också en stabil lokal message copy för varje skannat mail, så dashboarden/manualhanteringen behåller läsbar body-text mer tillförlitligt i stället för att vara beroende av kortare latest-run-utdrag
  • operatören kan nu också agera direkt på senaste körningens meddelanden i dashboarden: välja lokal regelkontext, skicka manuellt svar eller markera meddelandet som manuellt hanterat/läst utan att vänta på nästa cronpass
  • manuella svar använder samma multipart plain-text + stylade HTML-svarspipeline som automatiska svar, så operatörens manuella svar får samma synliga format och samma request-summary-beteende
  • Tools-konfigurationen sammanfattas nu i en mer läsbar mailbox-/regelöversikt, och dashboarden visar nu även läsbara matchade regelrader samt omatchade AI/IF-rader (inklusive footer/modell/reasoning) samtidigt som rå JSON fortfarande finns kvar i kollapsbara advanced-sektioner
  • tydliga alertkort visar nu både Tools-sidans dagliga AI-budgettryck (när den metadata finns i config) och standalone-upptäckta quota-/billingfel från senaste körningen

Dashboarden ska fortfarande ses som en lightweight operatörsyta, inte som en full ersättning för det riktiga admin-UI:t i Tools.

Token för standalone-klienten

Den fristående PHP-klienten ska använda en personlig bearer-token, till exempel:

  • provider_mail_support_assistant

Viktiga regler:

  • mottagar-/klienttoken som pratar till Tools för OpenAI:s räkning ska sparas med is_ai=1
  • den uppströms provider_openai-secret som Tools använder mot OpenAI är inte en mottagartoken och utesluts automatiskt från is_ai
  • om en regel har AI aktiverat måste tokenägaren fortfarande ha godkänd provider_openai-access, om användaren inte är admin

API-endpoint för standalone-klienten

GET /api/mail-support-assistant/config

Auth:

  • Authorization: Bearer <personlig AI-kapabel token>
  • X-Api-Key: <personlig AI-kapabel token>
  • apikey=<personlig AI-kapabel token>

Förväntad tokenmodell:

  • personlig icke-global nyckel
  • aktiv
  • AI-kapabel (is_ai=1) eller äldre tools_ai_bearer

Lyckat svar:

{
  "ok": true,
  "message": "Mail Support Assistant config loaded.",
  "user": {
    "id": 1,
    "name": "Admin User",
    "email": "admin@example.com",
    "has_openai_access": true,
    "ai_daily_budget": {
      "feature": "social_media_extension",
      "default_model": "gpt-4o-mini",
      "max_output_tokens_default": 800,
      "cap": 60000,
      "used": 4200,
      "remaining": 55800,
      "is_unlimited": false,
      "source": "user_override"
    }
  },
  "token": {
    "provider": "provider_mail_support_assistant",
    "user_id": 1,
    "is_personal": true,
    "is_ai": true
  },
  "mailboxes": [
    {
      "defaults": {
        "spam_score_reply_threshold": 6.5,
        "generic_no_match_ai_enabled": true,
        "generic_no_match_ai_model": "gpt-4o-mini",
        "generic_no_match_ai_reasoning_effort": "medium",
        "generic_no_match_if": "Om det omatchade mailet är en normal supportfråga och tydligt inte är spam, bedrägeri, phishing eller vag säljkontakt får sista fallbacken svara.",
        "generic_no_match_instruction": "Svara kort, be om den saknade kontodetaljen och håll dig till avsändarens ursprungliga språk.",
        "generic_no_match_footer": "Med vänliga hälsningar",
        "generic_no_match_rules": [
          {
            "id": 41,
            "sort_order": 0,
            "is_active": true,
            "if": "Om det omatchade mailet är ett oombett säljerbjudande ska vi tacka nej.",
            "instruction": "Avböj vänligt och bjud inte in till fortsatt kontakt.",
            "footer": "Med vänliga hälsningar",
            "ai_model": "gpt-4o-mini",
            "ai_reasoning_effort": "medium"
          }
        ]
      }
    }
  ]
}

Fel:

  • 401 om bearer-token saknas eller nekas

POST /api/mail-support-assistant/send-reply

Syfte:

  • relay:a ett utgående svar via Tools mailtransport när standalone-klienten inte kan eller ska använda lokal mail()/MTA.

Auth:

  • dedikerad personlig token med provider provider_mail_support_assistant_mailer
  • tokenägaren måste ha permission mail-support-assistant.relay (admin bypass gäller)

Body (exempel):

{
  "mailbox_id": 5,
  "rule_id": 11,
  "mode": "fallback_after_php_mail",
  "to": "customer@example.com",
  "cc": [],
  "bcc": ["audit@example.com"],
  "from": "Support Team <support@example.com>",
  "subject": "Re: Order status",
  "body": "Tack för ditt meddelande.",
  "body_html": "<html><body><p>Tack för ditt meddelande.</p></body></html>",
  "message_meta": {
    "message_id": "<abc@example.com>",
    "uid": 12345
  }
}

Lyckat svar:

{
  "ok": true,
  "message": "Reply relayed via Tools mail transport.",
  "relay": {
    "provider": "provider_mail_support_assistant_mailer",
    "user_id": 1,
    "mailbox_id": 5,
    "rule_id": 11,
    "mode": "fallback_after_php_mail"
  }
}

Fel:

  • 401 om relay-token saknas/är ogiltig/inaktiv
  • 403 om tokenägaren saknar mail-support-assistant.relay
  • 422 vid ogiltiga payloadfält

Additivt relay-fält:

  • body_html är valfritt.
  • När det skickas med relay:ar Tools svaret som multipart/alternative med både den ursprungliga plain-text-delen i body och HTML-delen i body_html.
  • Om fältet utelämnas behålls det tidigare plain-text-beteendet i relayläget.
  • Relay stämplar nu också utgående svar med X-Tornevall-Mail-Assistant: sent för anti-loop-detektering i standalone-pollning.

Driftnoteringar

  • Mailboxar/regler konfigureras i Tools, men själva IMAP-pollningen och reply-körningen är tänkt att köras från den fristående klienten/cronjobbet.
  • Mailboxuppgifter ligger i Tools admin; den fristående klienten är fortfarande databaslös lokalt och sparar bara env/session/logg/sammanfattningsdata plus valfria lokala meddelandekopior under storage/.
  • Standalone-svarstransporten är nu SMTP-först som standard (MAIL_ASSISTANT_MAIL_TRANSPORT=smtp) och kan styras med MAIL_ASSISTANT_SMTP_*-nycklar, så lokal Postfix/sendmail inte längre krävs i normalfallet.
  • För WSL-/self-signed-/lokal-CA-miljöer kan standalone nu också slå av eller styra om TLS-verifiering separat för Tools API-anrop (MAIL_ASSISTANT_TOOLS_SSL_VERIFY, MAIL_ASSISTANT_TOOLS_CA_BUNDLE) och SMTP (MAIL_ASSISTANT_SMTP_SSL_VERIFY, MAIL_ASSISTANT_SMTP_CA_FILE).
  • Om varken den matchade regeln eller mailboxens defaults anger någon BCC-mottagare kan standalone nu också falla tillbaka till MAIL_ASSISTANT_DEFAULT_BCC i sin lokala .env.
  • Standalone-svarstransporten stöder nu också en explicit ordnad fallbackkedja via MAIL_ASSISTANT_MAIL_FALLBACK_TRANSPORTS.
  • Om primär transport är tools_api men den dedikerade relay-token saknas hoppar runnern nu över relayläget och fortsätter med SMTP/lokala fallbacktransporter i stället för att avbryta hela svaret.
  • Om SMTP/lokal transport fallerar och fallback är aktiverad kan runnern försöka igen via POST /api/mail-support-assistant/send-reply.
  • Utgående svar från standalone-runtime genereras nu som multipart/alternative: en plain-text-del finns alltid kvar för kompatibilitet, och en stylad HTML-version läggs till för mailklienter som föredrar rikare formatering.
  • Den stylade HTML-delen renderar nu också vanlig markdown från AI-/operatörstext till riktig HTML i stället för att visa markdown-syntax direkt i det synliga mailet.
  • I statiskt footerläge rensar standalone nu bort trailing AI-genererade signoff-block innan den konfigurerade footern läggs till, vilket förhindrar dubbla avslut som både Best regards och Regards i samma svar.
  • Standalone behandlar nu inkommande olästa mail med X-Tornevall-Mail-Assistant: sent som assistant-originerade loopkandidater: de hoppas över före regelmatchning/svar och markeras lästa för att undvika återkommande självsvarsloopar.
  • Om ingen regel matchar ett mail ska klienten lämna det helt orört.
  • När mailboxnivåns AI-fallback för omatchade mail är aktiverad i Tools admin kan standalone-klienten i stället köra en strikt AI-triage via de additiva defaults.generic_no_match_*-fälten från /api/mail-support-assistant/config.
  • Mailboxens generic_no_match_if / generic_no_match_instruction beskriver nu mailboxens egen sista fallback och är inte längre alias för den första avancerade omatchade raden.
  • Avancerade omatchade rader ligger fortsatt i defaults.generic_no_match_rules[] och kontrolleras fortfarande före den sista mailboxfallbacken.
  • Dessa additiva mailboxdefaults kan nu också innehålla defaults.generic_no_match_ai_reasoning_effort.
  • Dessa additiva mailboxdefaults kan nu också innehålla defaults.generic_no_match_if.
  • AI instrueras nu att bortse från yttre SpamAssassin-wrappertext när den bara kapslar in originalmailet, samtidigt som SpamAssassin-score/tester fortfarande används som risksignaler.
  • Svar på omatchade mail skickas nu bara när AI returnerar giltig JSON, can_reply=true, certainty="high" och en icke-tom reply-payload. Allt annat lämnar mailet orört.
  • Standalone-parsern för omatchade mail tolererar nu också några vanliga mindre JSON-formatfel från provider/modell (till exempel smart quotes eller trailing commas) innan svaret slutligen klassas som ogiltig JSON.
  • Om denna strikta omatchade fallback verkligen skickar ett svar finaliserar runnern mailet genom att markera det som läst direkt (förutom vid dry-run).
  • Standalone-diagnostiken för den no-match-vägen innehåller nu också generic_ai_decision.evaluated_no_match_rules[], så operatören kan se vilka fallback-rader som faktiskt provades, i ordning, innan ett svar skickades eller mailet lämnades oläst.
  • Per-message-diagnostik i körresultatet visar nu också thread_key, in_reply_to och references[], vilket gör det lättare att se om ett skippat mail faktiskt bar med sig användbar reply-chain-metadata.
  • Matchade AI-aktiverade regler använder nu reply.responder_name, reply.persona_profile, reply.custom_instruction, reply.ai_model och additiva reply.ai_reasoning_effort som auktoritativa AI-override-värden för just det svaret i stället för att se ut som ett vanligt statiskt autosvar.
  • Standalone-klienten försöker nu också igen när tillfälliga AI-rate-limitfel inträffar innan den överger AI-spåret.
  • Standalone-AI-svar försöker nu också uttryckligen svara på samma språk som det inkommande mailet (response_language=auto) om inte avsändaren tydligt ber om ett annat språk.
  • Standalone-fallbackmodellen är nu o4 som standard; den fallbackkörningen skickar medvetet inte reasoning_effort, så o4 används här som en vanlig icke-reasoning fallback.
  • GET /api/mail-support-assistant/config kan nu också exponera additiv metadata i user.ai_daily_budget så standalone-klienten/operatören kan se effektiv daglig AI-tokenlimit, återstående budget, defaultmodell och standardgräns för output-tokens som Mail Support Assistants SocialGPT-baserade svar använder.
  • Om en AI-aktiverad matchad regel fortfarande fallerar efter retries och ingen explicit reply.template_text-fallback finns konfigurerad lämnas svaret nu oskickat och felet loggas, i stället för att en missvisande generisk standardsvarstext skickas.
  • Mailbox-/runnerfel från dessa misslyckade AI-svar innehåller nu också vilken modellkedja som faktiskt provades, vilket gör tomma svar/fallbackproblem lättare att felsöka.
  • Om ett mail hoppas över därför att ingen regel matchar, eller därför att den generiska fallbacken för omatchade mail är avstängd, ofullständigt konfigurerad, underkänd som osäker, ogiltig, tom eller i övrigt fallerar, lämnas mailet nu oläst även om mark_seen_on_skip är aktiverat.
  • Undantag: när den strikta AI-/slutfallbacken för omatchade mail faktiskt har utvärderats men landar i ett terminalt reject-/error-utfall markerar standalone-runnern nu mailet som läst för manuell uppföljning, så samma olästa mail inte fortsätter att bränna AI-försök i all evighet.
  • Quota-/billingfel från AI-mailflöden lyfts nu också upp som tydliga runtime-alerts och kan valfritt skicka cooldown-begränsad operatörsnotis via MAIL_ASSISTANT_QUOTA_ALERT_EMAIL i standalone-miljön.
  • mark_seen_on_skip ska därför främst ses som en bekvämlighetsinställning för medvetna heuristiska skippar, till exempel högscorat SpamAssassin-skräp, och inte som ett sätt att tysta konfigurationsdrivna no-match-mail.
  • Den fristående runnern pollar bara olästa mail. Mail som redan är markerade lästa vid inläsning hoppas över direkt.
  • Den lokala filen storage/state/message-state.json är nu bara diagnostikhistorik. Ett oläst mail kan alltså fortfarande omprövas i en senare körning även om samma Message-Id redan finns i filen, vilket gör att nya regler kan börja gälla utan att lokal state först rensas.
  • Samma lokala state kan ändå användas som kontinuitetshjälp för reply-kedjor: den kan återhämta tidigare vald regel eller tidigare matchad no-match-rad för ett länkat uppföljningsmail, men den får aldrig i sig själv blockera omprövning av oläst mail.
  • Den kontinuitetsuppslagningen förstår nu också sparade utgående reply_message_id-värden och kan falla tillbaka till normaliserat subject + samma deltagare när explicita reply-headers gått förlorade i ett äldre mailformat eller vid någon mellanliggande omskrivning.
  • AI ska bara aktiveras per regel när du uttryckligen vill att Tools/OpenAI ska blandas in.
  • Den fristående klienten tittar nu också på SpamAssassin-headers så att mycket högscorat skräppost kan hoppas över försiktigare, medan wrapper-liknande SpamAssassin-omskrivningar fortfarande kan kopieras lokalt och rensas bort innan regelmatchning eller AI-svar.
  • Mailbox-defaults kan nu också innehålla spam_score_reply_threshold; när ett mail har score över den nivån undertrycker standalone svarshantering för mailet och lämnar det oläst.
  • Score-tolkningen läser nu också X-Spam-Score direkt när X-Spam-Status saknar en parsebar score=-token.
  • Utgående svar lägger nu också till ett kompakt utdrag av den ursprungliga förfrågan, och wrapper-liknande felmail rensas nu hårdare först så vidarebefordrade .eml-headerdumpningar eller SpamAssassin-wrappers inte blir den synliga citerade sammanfattningen.