Passa al contenuto principale

Telemetria

MailCopilot raccoglie una piccola quantita di dati anonimi diagnostici e d'uso quando attivi Invia diagnostica e dati d'uso anonimi in Impostazioni -> Informazioni. Questa pagina documenta esattamente cosa viene raccolto e -- altrettanto importante -- cosa non viene mai raccolto.

Cosa non raccogliamo mai

In nessuna circostanza MailCopilot trasmette:

  • Il testo dei tuoi messaggi (oggetto, corpo, allegati, bozze)
  • I tuoi indirizzi email o quelli dei tuoi contatti
  • Nomi o percorsi delle cartelle sul tuo server IMAP
  • Nomi dei file degli allegati
  • Il testo delle tue ricerche
  • Il contenuto delle conversazioni o della memoria dell'assistente IA
  • Hostname dei server, porte o credenziali

Come vengono instradati i dati

Tutta la telemetria viene inviata a Sentry, la nostra piattaforma di monitoraggio errori e prestazioni. Quando disattivi l'interruttore in Impostazioni, la pipeline viene completamente bypassata: non viene inviato nulla. Se attivi il logging di debug, gli stessi eventi compaiono anche nel tuo main.log locale, cosi puoi ispezionare esattamente cosa verrebbe trasmesso.

Identificatore di installazione anonimo

Al primo avvio, MailCopilot genera un UUID casuale e lo memorizza nel file di configurazione locale. Questo UUID non lascia mai il tuo dispositivo. Cio che viene trasmesso al suo posto e un hash SHA-256, troncato a 16 caratteri esadecimali, che chiamiamo install_id_hash. Viene allegato a ogni evento di telemetria come Sentry user id, in modo da poter rispondere a domande come «quante installazioni distinte stanno usando la versione X» oppure «il crash Y interessa 1 utente o 100». L'hash e:

  • Anonimo: non e derivato da, ne correlato a, un'email di account, un'impronta del dispositivo, un indirizzo IP o un identificatore hardware.
  • Stabile tra le release: la stessa installazione mantiene lo stesso hash dopo un aggiornamento automatico, in modo che le metriche di retention sopravvivano ai cambi di versione.
  • Non reversibile: dal nostro lato non esiste alcuna corrispondenza che riporti dall'hash all'UUID o al tuo dispositivo.
  • Eliminato quando disattivi la telemetria: spostare l'interruttore di Impostazioni su off cancella immediatamente l'identificatore dal client Sentry e ferma ogni ulteriore trasmissione.

Usiamo questo identificatore come uno strumento di analytics web userebbe un visitor id anonimo: ci permette di contare installazioni distinte invece dei totale eventi. Questa differenza e proprio il motivo per cui la telemetria e utile: senza, una sola installazione molto attiva sembrerebbe uguale a cento installazioni tranquille.

Eventi

Ciclo di vita dell'app

EventoTipoAggregatoTagScopo
app.session_startedeventnoversion, platform, theme, lang, accounts_count, install_id_hashUna volta all'avvio dell'app. Porta install_id_hash per DAU/MAU.
app.session_endedhistogramnoreason, install_id_hashUna volta alla chiusura regolare. value_ms = durata della sessione.
app.updatedeventnofrom_version, to_versionUna volta dopo che un auto-update installa una nuova versione.
app.startup_mshistogramnoaccounts_countTempo da app.whenReady alla prima BrowserWindow visibile.

Riepilogo d'uso

EventoTipoAggregatoTagScopo
usage.session_summaryeventnosearch_used, compose_used, snooze_used, read_later_used, ai_used, rules_used, templates_used, followup_used, install_id_hashBitmap a fine sessione: quali funzionalita sono state usate almeno una volta.

Onboarding

EventoTipoAggregatoTagScopo
onboarding.wizard_openedeventnofirst_runL'utente ha aperto il flusso di aggiunta account.
onboarding.method_selectedeventnomethodL'utente ha scelto OAuth o IMAP/SMTP manuale.
onboarding.autoconfig_resulteventnosuccess, providerSondaggio di autoconfigurazione completato: i parametri IMAP/SMTP sono stati trovati?
onboarding.connection_test_resulteventnokind, success, failure_kindTest di connettivita IMAP o SMTP completato.
onboarding.google_oauth_resulteventnosuccess, failure_kindFlusso Google OAuth2 completato.
onboarding.account_savedeventnoprovider, auth_typeLe credenziali dell'account sono state scritte in keytar/electron-store.
onboarding.first_headers_sync_completedhistogramnoprovider, folder_count_bucketTempo da account_saved alla prima sincronizzazione delle intestazioni completata (value_ms).
onboarding.first_message_openedeventnotime_since_sync_bucketL'utente ha aperto il primo messaggio dopo l'accesso.

Composizione

EventoTipoAggregatoTagScopo
compose.openedeventnosource, has_draftFinestra di composizione aperta; traccia il punto di ingresso.

Coda d'invio

EventoTipoAggregatoTagScopo
send_queue.enqueuedeventnoscheduled, send_and_archive, has_attachments, body_size_bucketMessaggio in uscita aggiunto a send_queue (immediato o pianificato).
send_queue.senthistogramnoscheduledTempo dall'inserimento in coda alla consegna riuscita: SMTP per la maggior parte degli account, Microsoft Graph per Outlook (value_ms).
send_queue.failedeventnofailure_kindTentativo di invio fallito in modo permanente (la coda si arrende). Copre sia SMTP sia Microsoft Graph.
send_queue.retriedeventnoattempt_numberErrore di invio transitorio: messaggio rischedulato. Copre sia SMTP sia Microsoft Graph.

Avvisi di destinatario errato

EventoTipoAggregatoTagScopo
misdirection.promptedeventnokindLa composizione ha mostrato il dialog di avviso.
misdirection.outcomeeventnooutcome, kindL'utente ha risposto all'avviso.

Modelli

EventoTipoAggregatoTagScopo
template.appliedeventnovar_countL'utente ha inserito un modello nella composizione.

Promemoria di follow-up

EventoTipoAggregatoTagScopo
followup.createdeventnoduration_days_bucketUn promemoria di follow-up e stato collegato a un messaggio in uscita.

Ricerca

EventoTipoAggregatoTagScopo
search.duration_mshistogramnoscope, folder_role, account_count, sort, pagination, len_bucket, token_count, result_bucket, duration_bucket, zero_resultsLatenza end-to-end della ricerca FTS (lato main, prima del merge con i risultati remoti). Verra sostituito da search.completed in PR 2.
search.erroreventnoscope, kindIl gestore della ricerca ha sollevato un'eccezione: annullamento dell'utente o errore reale.

Indicizzatore dei corpi

EventoTipoAggregatoTagScopo
body_indexer.tick.duration_mshistogramnoindexed, folders_scannedUn tick completo dell'indicizzatore su tutte le cartelle.
body_indexer.coverage_pctgaugenototal_messages, indexed_messagesFrazione dei messaggi in cache con body_text indicizzato.
body_indexer.backloggaugeno--Numero assoluto di messaggi in cache ancora privi di body_text.
body_indexer.folder_erroreventnofolder_role, error_streak, backoff_msL'indicizzatore ha incontrato una serie di errori su una cartella ed e andato in backoff.

Manutenzione dell'indice full-text

EventoTipoAggregatoTagScopo
fts.optimize.duration_mshistogramnosegments_before, segments_after, reductionPassaggio FTS5 optimize: durata e numero di segmenti prima/dopo.
fts.optimize.failedeventnoreasonFTS5 optimize ha sollevato un errore.

Sincronizzazione delle intestazioni

EventoTipoAggregatoTagScopo
sync.headers.wall_mshistogramnofolder_role, upsert_ms, other_ms, batches, rows, max_batch_msEsecuzione completa di syncFolderHeaders: separa upsert dal resto per il profiling.
sync.headers.coalescedeventnofolder_roleUn tentativo duplicato di syncFolderHeaders si e attaccato a un'esecuzione in corso.

Strumentazione dell'apertura dei messaggi

EventoTipoAggregatoTagScopo
mail.openhistogramnocache_hit_level, body_size_bucket, attachments_countLatenza end-to-end dell'apertura di un messaggio, osservata lato renderer (dal clic al rendering del corpo). Il tag cache_hit_level indica quale livello di cache ha servito il corpo: memory, db, eml, imap o imap_timeout.
net.message_details.wall_mshistogramnocache_hit_levelTempo wall del gestore IPC net:messageDetails nel processo principale. Isola la latenza lato server dal rumore del round-trip renderer verso main. Un campione per ramo terminale (memory, db, eml, imap, imap_timeout).
imap.pool_queue_wait_mseventnorequester, wait_ms_bucketTempo di attesa per acquisire una connessione dal pool IMAP per account. Emesso solo quando l'attesa supera 500 ms, in modo che le dashboard catturino la coda lunga senza il rumore delle acquisizioni veloci.

Refresh dei token OAuth IMAP

EventoTipoAggregatoTagScopo
imap.auth_refresh_attempteventnoproviderRefresh del token OAuth innescato da un fallimento di autenticazione IMAP (XOAUTH2 / AUTHENTICATE).
imap.auth_refresh_successeventnoproviderRefresh riuscito: il retry IMAP usera il token aggiornato.
imap.auth_refresh_failureeventnoprovider, reasonRefresh fallito: l'errore di autenticazione originale viene propagato al chiamante.
imap.auth_refresh_suppressedeventnoreasonIl cooldown per account ha soppresso un tentativo di refresh per evitare raffiche di richieste a /token quando un refresh token e stato revocato.
imap.idle_auth_refreshedeventnoproviderIl loop IDLE si e ripreso da un fallimento di autenticazione a meta ciclo tramite un refresh in-loop: la consegna push e proseguita senza il backoff di 60 min.
imap.auth_refresh_exhaustedeventnoprovider, consecutiveIl loop IDLE ha attivato lo storm-brake: N refresh consecutivi sono andati a buon fine lato provider ma IMAP ha continuato a rifiutare i token aggiornati, quindi si torna al backoff di autenticazione ordinario.

Conservazione della cache

EventoTipoAggregatoTagScopo
cache.eml_prunedeventnocount_bucket, freed_bytes_bucketLa pulizia di conservazione ha eliminato file .eml piu vecchi del limite configurato. Conteggi e dimensioni sono trasmessi solo come intervalli — nessun percorso o numero esatto viene inviato.
cache.folder_index_disabledeventnocount, roleUna cartella e stata esclusa dalla ricerca full-text — automaticamente per Junk/Spam/Cestino alla prima registrazione, o manualmente tramite il menu contestuale della cartella. role: spam, trash o manual.

Segnali di sicurezza della cache e di perdita di dati

EventoTipoAggregatoTagScopo
db.mass_delete_messageseventnofolder_role, reason, deleted_count_bucket, watermark_preservedE stato emesso un DELETE FROM messages a livello di cartella. Ogni call site fornisce un motivo, in modo da distinguere una regressione che cancella una cache sana da un bump UIDVALIDITY legittimo.
imap.stale_wipe_guard_trippedeventnofolder_role, providerLa protezione mass-delete ha rifiutato di svuotare la cache locale della cartella perche mailbox.exists e tornato non numerico. Un picco indica un problema di provider o di connessione, non una perdita di dati utente.
db.shutdown_wal_checkpoint_mshistogramnobusy, reclaimed_kb_bucket, okDurata del PRAGMA wal_checkpoint(TRUNCATE) eseguito prima dell'uscita, in modo che le scritture committed-ma-non-checkpointed sopravvivano al riavvio.

Gate stdio MCP (protezione renderer-verso-RCE)

EventoTipoAggregatoTagScopo
mcp.stdio.connect_attemptedeventnoapproved_sourceIl trasporto stdio MCP sta per essere avviato: emesso una volta per connect riuscito dopo aver passato i gate di approvazione e allowlist.
mcp.stdio.connect_blockedeventnoreasonConnessione o salvataggio stdio rifiutato dal gate (not_approved, unapproved_command, forbidden_field, forbidden_env_key, env_disabled).
mcp.stdio.approval_grantedeventnosource, scopeL'utente ha concesso l'approvazione stdio MCP (abilitazione globale o per connessione); source distingue env vs native-confirm, scope distingue global vs per-connessione.
mcp.stdio.env_sanitized_on_loadeventnocount_bucketLa migrazione delle impostazioni ha rimosso le chiavi env loader-hook proibite dalle connessioni MCP persistite al caricamento. Al massimo una volta per avvio.

Audit delle azioni IA (barriera preview -> apply)

EventoTipoAggregatoTagScopo
ai.action.preview_createdeventnokindUno strumento MCP *_preview ha registrato un'azione mutante in attesa del clic Apply dell'utente.
ai.action.appliedeventnokindUno strumento MCP *_apply ha eseguito con successo un'azione mutante confermata in precedenza.
ai.action.rejectedeventnokind, reasonUna chiamata *_apply e stata rifiutata al gate di validazione (preview mancante/scaduto, token mancante o non corrispondente, kind mismatch, callback mancante o rate limit).
ai.action.expiredeventnokindUn'azione mutante in attesa e scaduta senza che l'utente cliccasse Apply (TTL).
ai.action.apply_duration_mshistogramnokindDurata di un apply riuscito: quanto e durata la mutazione sottostante (DB / IMAP / SMTP).

Gate di egress dell'IA

EventoTipoAggregatoTagScopo
ai.egress.blockedeventnotool_name, account_idUna chiamata a uno strumento di egress (per esempio WebSearch, WebFetch, uno strumento MCP esterno generico) e stata rifiutata mentre i dati email dell'utente erano nello scope -- filtrata dal toolset SDK o fermata al gate runtime.
ai.egress.allowed_onceeventnotool_name, account_idL'utente ha concesso un consenso una tantum per l'egress e l'IA ne ha fatto uso. Aiuta a distinguere «gli utenti aggirano abitualmente» da «il gate tiene, i tentativi sono prevalentemente da injection».

Prestazioni IPC

EventoTipoAggregatoTagScopo
ipc.slow_mshistogramsi (finestra 10 s)channel, duration_bucketIl gestore IPC ha superato la soglia «lento».

Reattivita dell'UI

EventoTipoAggregatoTagScopo
ui.freeze.renderer_mshistogramsi (finestra 10 s)duration_bucket, inflight_count, top_inflightIl loop eventi del renderer e rimasto bloccato oltre la soglia di freeze.
ui.freeze.main_mshistogramsi (finestra 10 s)duration_bucket, inflight_count, top_inflightIl loop eventi del processo main e rimasto bloccato (misurato tramite perf_hooks delay).

Contatto

Domande o dubbi su cosa raccogliamo? Apri una issue su github.com/mailcopilot/mailcopilot o contatta il team direttamente tramite il modulo di feedback in Impostazioni -> Informazioni.