[{"data":1,"prerenderedAt":2038},["ShallowReactive",2],{"docs-pages-it":3,"doc-it-changelog-sdk-javascript":310},[4,9,15,20,25,30,35,41,52,60,69,77,85,93,97,106,110,118,123,128,133,139,144,149,154,159,164,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,255,261,266,270,275,280,285,290,295,300,305],{"path":5,"title":6,"description":7,"order":8,"group":8,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fpermissions","Chi può fare cosa","[object Object]",null,{"path":10,"title":11,"description":12,"order":13,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Finstallation","Installazione","Installa CloseYourIt sul tuo server con un solo comando.",1,"start",{"path":16,"title":17,"description":18,"order":19,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fsettings","Impostazioni","Ogni impostazione del file .env, a cosa serve e quali non vanno mai cambiate.",2,{"path":21,"title":22,"description":23,"order":24,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fdatabase","Database","Cos'è il database, cosa contiene, quanto restano i dati e quanto spazio occupa.",3,{"path":26,"title":27,"description":28,"order":29,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fupdates-and-backups","Aggiornamenti e backup","Aggiorna a una versione nuova, fai e ripristina il backup del database, controlla l'installazione.",4,{"path":31,"title":32,"description":33,"order":34,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Ftroubleshooting","Risolvere i problemi","Cosa controllare quando installazione, certificato, email o dati in arrivo non funzionano.",5,{"path":36,"title":37,"description":38,"order":39,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fconnect-your-apps","Collega le tue app","Tutti gli strumenti che mandano dati a CloseYourIt, e cosa raccoglie ognuno.",6,"connect",{"path":42,"title":43,"description":44,"order":45,"group":8,"parent":46,"package":47,"note":48,"collects":49,"status":8},"\u002Fdocs\u002Fsdk-ruby","Ruby \u002F Rails","La gemma closeyourit-ruby manda errori, log, query lente e metriche dei job da un'app Rails.",7,"connect-your-apps","closeyourit-ruby","Errori, log, query e metodi lenti, job in background.",{"errors":50,"logs":50,"performance":50,"visits":51,"servers":51},"full","none",{"path":53,"title":54,"description":55,"order":56,"group":8,"parent":46,"package":57,"note":58,"collects":59,"status":8},"\u002Fdocs\u002Fsdk-javascript","JavaScript","Il pacchetto @bussolabs\u002Fcloseyourit-js funziona nel browser e su Node 20.16 o più recente.",8,"@bussolabs\u002Fcloseyourit-js","Browser e Node, adattatori framework e query database dalla 0.13.0.",{"errors":50,"logs":50,"performance":50,"visits":50,"servers":51},{"path":61,"title":62,"description":63,"order":64,"group":8,"parent":46,"package":65,"note":66,"collects":67,"status":8},"\u002Fdocs\u002Fsdk-dart","Dart \u002F Flutter","Il pacchetto closeyourit cattura gli errori delle app Flutter, anche quando il telefono è senza rete.",9,"closeyourit","Errori, log e metriche pubblici dalla 0.9.3.",{"errors":50,"logs":68,"performance":68,"visits":51,"servers":51},"partial",{"path":70,"title":71,"description":72,"order":73,"group":8,"parent":46,"package":65,"note":74,"collects":75,"status":76},"\u002Fdocs\u002Fsdk-python","Python","Il pacchetto closeyourit manda errori, log e metriche da applicazioni Python lato server.",10,"Lato server. SQLAlchemy; query Django e FastAPI\u002FStarlette dalla 0.4.0.",{"errors":50,"logs":50,"performance":68,"visits":51,"servers":51},"pre_alpha",{"path":78,"title":79,"description":80,"order":81,"group":8,"parent":46,"package":82,"note":83,"collects":84,"status":8},"\u002Fdocs\u002Fsdk-sentry","SDK Sentry","Invia errori con un SDK Sentry compatibile; sessioni e crash hanno profili separati.",11,"Sentry SDK","Errori compatibili; sessioni e crash richiedono il profilo verificato.",{"errors":50,"logs":51,"performance":51,"visits":51,"servers":51},{"path":86,"title":87,"description":88,"order":89,"group":8,"parent":46,"package":90,"note":91,"collects":92,"status":8},"\u002Fdocs\u002Fagent-server","Agent per server","Un piccolo programma sul server che manda lo stato della macchina ogni 60 secondi.",12,"closeyourit-agent","CPU, memoria, dischi, rete, container e servizi.",{"errors":51,"logs":68,"performance":51,"visits":51,"servers":50},{"path":94,"title":95,"description":96,"order":89,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fnuxt","Vue e Nuxt","Collega gli errori del browser Nuxt e del server Nitro senza esporre un token segreto.",{"path":98,"title":99,"description":100,"order":101,"group":8,"parent":46,"package":102,"note":103,"collects":104,"status":105},"\u002Fdocs\u002Fagent-kubernetes","Kubernetes","Un osservatore in sola lettura del cluster: una copia sola per cluster.",13,"closeyourit-kube","Macchine, app ed eventi di errore del cluster.",{"errors":51,"logs":51,"performance":51,"visits":51,"servers":50},"coming",{"path":107,"title":108,"description":109,"order":101,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fopentelemetry","OpenTelemetry","Invia tracce, metriche e log dei server attraverso il ricevitore OTLP facoltativo.",{"path":111,"title":112,"description":113,"order":114,"group":8,"parent":46,"package":115,"note":116,"collects":117,"status":8},"\u002Fdocs\u002Fcli","CLI cyi","Il comando closeyourit, in breve cyi: gestisci progetti, errori e ticket dal terminale.",14,"@bussolabs\u002Fcloseyourit-cli","Non raccoglie dati: comanda CloseYourIt dal terminale.",{"errors":51,"logs":51,"performance":51,"visits":51,"servers":51},{"path":119,"title":120,"description":121,"order":122,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fhttp-api","API HTTP","Manda errori, log, metriche e visite con semplici richieste HTTP, senza un SDK.",15,{"path":124,"title":125,"description":126,"order":127,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fgithub-app","GitHub","Collega i repository GitHub a ticket e rilasci con una GitHub App tua.",16,{"path":129,"title":130,"description":131,"order":132,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fingest-gateway","Gateway di ingest","Tieni al sicuro errori, log e metriche in arrivo quando l'app è lenta o sta ripartendo.",17,{"path":134,"title":135,"description":136,"order":137,"group":138,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fai","AI","Accendi assistente, analisi, dettatura e ricerca intelligente con una chiave CloseYourIt AI o con il tuo provider.",18,"automation",{"path":140,"title":141,"description":142,"order":143,"group":138,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fautomator","Automator","Fai lavorare i ticket in automatico su una tua macchina Linux, con Claude Code, Codex o tutti e due.",19,{"path":145,"title":146,"description":147,"order":148,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fstack-coverage","Framework e copertura degli stack","Scegli un SDK pubblicato o verifica i limiti di un’integrazione provata localmente.",20,{"path":150,"title":151,"description":152,"order":153,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fmonitoring","Tracce, misure e sessioni","Esplora i nuovi segnali, confronta le versioni e ricostruisci le posizioni originali degli errori.",21,{"path":155,"title":156,"description":157,"order":158,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fnode-database","Database Node","Monitora query lente e ripetute con pg, mysql2, Drizzle e Prisma PostgreSQL.",22,{"path":160,"title":161,"description":162,"order":163,"group":138,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fclaude-code","Claude Code","CloseYourIt dentro Claude Code, in una colonna accanto alla conversazione con produzione e i tuoi ticket aperti.",23,{"path":165,"title":166,"description":167,"order":168,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Ftickets","Ticket e idee","Apri e segui i ticket sulla bacheca, raccoglili in milestone, fai domande e trasforma le idee votate in lavoro.",30,"use",{"path":171,"title":172,"description":173,"order":174,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Ferrors","Errori","Come gli errori delle tue app diventano righe uniche, e come risolverli, ignorarli, fonderli o trasformarli in ticket.",31,{"path":176,"title":177,"description":178,"order":179,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fperformance","Performance","Trova le query e i metodi lenti, leggi i problemi riconosciuti da soli e ricevi un avviso quando ne compare uno.",32,{"path":181,"title":182,"description":183,"order":184,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Flogs","Log","Cerca i messaggi delle tue app, segui una richiesta dall'inizio alla fine e collega un messaggio a un errore o a un ticket.",33,{"path":186,"title":187,"description":188,"order":189,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fsecrets","Segreti","Password, chiavi e file riservati in un posto solo, per progetto e ambiente, letti dall'app senza un .env sul disco.",34,{"path":191,"title":192,"description":193,"order":194,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fservers","Server","Lo stato delle tue macchine in una pagina, con lo storico e gli avvisi quando qualcosa si rompe o si sta riempiendo.",35,{"path":196,"title":197,"description":198,"order":199,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fuptime","Uptime","Controlla che i tuoi siti rispondano, tiene il conto dei guasti e li mostra ai clienti su una pagina di stato.",36,{"path":201,"title":202,"description":203,"order":204,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fcrons","Lavori programmati","Accorgersi quando un lavoro che deve partire da solo smette di partire, o parte e finisce male.",37,{"path":206,"title":207,"description":208,"order":209,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Falerts","Avvisi","Le regole che fanno nascere un avviso, il centro notifiche e dove ognuno sceglie di riceverli.",38,{"path":211,"title":212,"description":213,"order":214,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fhelpdesk","Assistenza","Chi visita il sito di un progetto scrive al team con il bottone «Serve aiuto?», e la richiesta arriva nel progetto giusto.",39,{"path":216,"title":217,"description":218,"order":219,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fanalytics","Statistiche del sito","Quante persone visitano il sito, cosa guardano e da dove arrivano, senza cookie.",40,{"path":221,"title":222,"description":223,"order":224,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Freplays","Session replay","Registra la navigazione di chi usa il sito e la riguardi come un video, anche accanto a un errore.",41,{"path":226,"title":227,"description":228,"order":229,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Freleases","Release","Le versioni che girano in ogni ambiente, legate ai tag di GitHub, e gli errori che tornano dopo una correzione.",42,{"path":231,"title":232,"description":233,"order":234,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fvulnerabilities","Vulnerabilità","I problemi di sicurezza noti nelle librerie dei tuoi progetti e i linguaggi che non ricevono più correzioni.",43,{"path":236,"title":237,"description":238,"order":239,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fseo","SEO","CloseYourIt visita i tuoi siti come un motore di ricerca e ti dice cosa impedisce alle pagine di essere trovate.",44,{"path":241,"title":242,"description":243,"order":244,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fknowledge","Knowledge base","Scrivi note, decisioni e guide dei progetti, ritrovale per significato e fai domande con le fonti.",45,{"path":246,"title":247,"description":248,"order":249,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fagents","Agenti AI","Quali ticket prendono gli agenti, cosa ti consegnano, dove decidi tu e come si misura ogni macchina.",46,{"path":251,"title":252,"description":253,"order":254,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog","Versioni","Ogni sistema di CloseYourIt con la sua ultima versione, e le note di ogni rilascio.",50,{"path":256,"title":257,"description":258,"order":259,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-app","App","Tutte le versioni stabili di App, dalla più recente.",51,"changelog",{"path":262,"title":263,"description":264,"order":265,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-cli","Riga di comando (cyi)","Tutte le versioni stabili di Riga di comando (cyi), dalla più recente.",52,{"path":267,"title":141,"description":268,"order":269,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-automator","Tutte le versioni stabili di Automator, dalla più recente.",53,{"path":271,"title":272,"description":273,"order":274,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-agent-server","Agente per server","Tutte le versioni stabili di Agente per server, dalla più recente.",54,{"path":276,"title":277,"description":278,"order":279,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-agent-kubernetes","Agente Kubernetes","Tutte le versioni stabili di Agente Kubernetes, dalla più recente.",55,{"path":281,"title":282,"description":283,"order":284,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-sdk-javascript","SDK JavaScript","Tutte le versioni stabili di SDK JavaScript, dalla più recente.",56,{"path":286,"title":287,"description":288,"order":289,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-sdk-ruby","SDK Ruby","Tutte le versioni stabili di SDK Ruby, dalla più recente.",57,{"path":291,"title":292,"description":293,"order":294,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-sdk-python","SDK Python","Tutte le versioni stabili di SDK Python, dalla più recente.",58,{"path":296,"title":297,"description":298,"order":299,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-sdk-dart","SDK Dart","Tutte le versioni stabili di SDK Dart, dalla più recente.",59,{"path":301,"title":302,"description":303,"order":304,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-skills","Skill per assistenti AI","Tutte le versioni stabili di Skill per assistenti AI, dalla più recente.",60,{"path":306,"title":307,"description":308,"order":309,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-site","Sito e documentazione","Tutte le versioni stabili di Sito e documentazione, dalla più recente.",61,{"id":311,"title":282,"body":312,"collects":8,"description":283,"extension":2032,"group":8,"meta":2033,"navigation":2034,"note":8,"order":284,"package":8,"parent":260,"path":281,"seo":2035,"status":8,"stem":2036,"__hash__":2037},"docs_it\u002Fdocs\u002Fchangelog-sdk-javascript.md",{"type":313,"value":314,"toc":2007},"minimark",[315,320,327,346,350,354,362,366,371,391,395,407,411,416,424,428,432,450,454,462,466,470,478,482,486,494,498,503,517,521,525,533,537,541,553,557,565,569,581,585,593,597,601,690,695,706,710,714,804,809,865,869,873,993,997,1001,1029,1033,1037,1076,1080,1121,1125,1143,1147,1151,1203,1207,1211,1251,1255,1285,1290,1307,1311,1376,1380,1384,1412,1416,1420,1530,1534,1553,1557,1561,1599,1603,1607,1700,1704,1720,1724,1728],[316,317,319],"h2",{"id":318},"_0142-2026-10-07","0.14.2 · 2026-10-07",[321,322,323],"p",{},[324,325,326],"strong",{},"Corretto",[328,329,330],"ul",{},[331,332,333,336,337,341,342,345],"li",{},[324,334,335],{},"La 0.14.1 non è stata pubblicata."," Le destinazioni con schema (",[338,339,340],"code",{},"http:\u002F\u002Fhost",", ",[338,343,344],{},"location.origin",") tornano a essere riconosciute: confronto su schema, host e porta quando indicata.",[316,347,349],{"id":348},"_0141-2026-10-07","0.14.1 · 2026-10-07",[321,351,352],{},[324,353,326],{},[328,355,356],{},[331,357,358,361],{},[324,359,360],{},"La 0.14.0 non è stata pubblicata."," Questa versione la sostituisce con lo stesso contenuto; il tetto del bundle è stato alzato di 0,5 KB per il nuovo mascheramento.",[316,363,365],{"id":364},"_0140-2026-10-07","0.14.0 · 2026-10-07",[321,367,368],{},[324,369,370],{},"Modificato",[328,372,373],{},[331,374,375,378,379,382,383,386,387,390],{},[324,376,377],{},"Host fidati del trace confrontati per nome host."," Una stringa in ",[338,380,381],{},"tracePropagationTargets"," vale solo per quell'host o i suoi sottodomini (",[338,384,385],{},"example.com"," copre ",[338,388,389],{},"api.example.com","): prima bastava che l'indirizzo la contenesse. Le espressioni regolari non cambiano. (CYJS-63)",[321,392,393],{},[324,394,326],{},[328,396,397],{},[331,398,399,402,403,406],{},[324,400,401],{},"Token fuori da widget di aiuto e breadcrumb."," Il pulsante «Serve aiuto?» invia solo origine e percorso della pagina, il testo dei breadcrumb è mascherato come i messaggi d'errore e il cookie del replay è marcato ",[338,404,405],{},"Secure",". (CYJS-63)",[316,408,410],{"id":409},"_0130-2026-10-05","0.13.0 · 2026-10-05",[321,412,413],{},[324,414,415],{},"Aggiunto",[328,417,418],{},[331,419,420,423],{},[324,421,422],{},"Query lente e ripetute su Node."," Puoi osservare PostgreSQL e MySQL, anche tramite Drizzle e l'adapter PostgreSQL di Prisma. La raccolta è facoltativa, oscura i dati delle query e si disattiva senza chiudere le connessioni dell'applicazione.",[316,425,427],{"id":426},"_0120-2026-10-04","0.12.0 · 2026-10-04",[321,429,430],{},[324,431,415],{},[328,433,434,440],{},[331,435,436,439],{},[324,437,438],{},"Integrazioni per i framework web."," Adapter opzionali per React, Next.js, Vue, Nuxt, Angular, Svelte e SvelteKit collegano errori e richieste al contesto applicativo. Le guide indicano versioni collaudate e limiti.",[331,441,442,445,446,449],{},[324,443,444],{},"Pulsante «Serve aiuto?»"," — una riga di ",[338,447,448],{},"\u003Cscript>"," aggiunge al sito un pulsante con il modulo per scrivere al team. È un file a parte: chi non lo usa non scarica niente in più. (CYRA-942)",[321,451,452],{},[324,453,326],{},[328,455,456],{},[331,457,458,461],{},[324,459,460],{},"Cause degli errori conservate."," Gli eventi includono fino a dieci eccezioni concatenate, con dati sensibili oscurati e protezioni contro cicli e proprietà illeggibili.",[316,463,465],{"id":464},"_0114-2026-10-01","0.11.4 · 2026-10-01",[321,467,468],{},[324,469,326],{},[328,471,472],{},[331,473,474,477],{},[324,475,476],{},"Pubblicazione riparata."," La 0.11.3 non è arrivata su npm: questa versione contiene le stesse modifiche.",[316,479,481],{"id":480},"_0113-2026-10-01","0.11.3 · 2026-10-01",[321,483,484],{},[324,485,370],{},[328,487,488],{},[331,489,490,493],{},[324,491,492],{},"Manutenzione interna."," La pubblicazione su npm non usa più un token salvato e le dipendenze di sviluppo sono aggiornate. Per chi usa la libreria non cambia niente. (CYJS-39)",[316,495,497],{"id":496},"_0112-2026-09-07","0.11.2 · 2026-09-07",[321,499,500],{},[324,501,502],{},"Sicurezza",[328,504,505,511],{},[331,506,507,510],{},[324,508,509],{},"Una chiave d'accesso finita dentro a un messaggio ora sparisce per intero"," — se un errore\nriportava la riga di accesso, la libreria ne nascondeva solo l'inizio e lasciava visibile la parte\nche conta. Ora di quella riga resta il solo nome, e il resto del messaggio si legge come prima\n(CYJS-38).",[331,512,513,516],{},[324,514,515],{},"Un rimbalzo del server non può più far viaggiare in chiaro la chiave d'accesso"," — se l'indirizzo\ndi raccolta rispondeva «vai qui», la libreria lo seguiva anche verso una connessione non protetta.\nOra rimbalzi e catene di rimbalzi si accettano solo entro l'indirizzo di partenza (CYJS-37).",[316,518,520],{"id":519},"_0111-2026-09-03","0.11.1 · 2026-09-03",[321,522,523],{},[324,524,502],{},[328,526,527],{},[331,528,529,532],{},[324,530,531],{},"Chiusa una falla in una libreria usata solo per le prove"," — il componente che controlla i\nformati durante lo sviluppo si appoggiava a una versione che poteva essere ingannata su quale\nindirizzo stesse leggendo. Non finiva nel pacchetto che si installa, ma ora è aggiornato lo stesso.",[316,534,536],{"id":535},"_0110-2026-09-03","0.11.0 · 2026-09-03",[321,538,539],{},[324,540,415],{},[328,542,543],{},[331,544,545,548,549,552],{},[324,546,547],{},"Le applicazioni JavaScript dicono quali funzioni vengono davvero usate"," — con ",[338,550,551],{},"usageEnabled"," la\nlibreria manda ogni 5 minuti l'elenco di route, job e chiavi eseguite, e il progetto compare nella\npagina d'uso e nella riga di comando. Solo lato server: nel browser resta spenta e lo dice.",[321,554,555],{},[324,556,370],{},[328,558,559],{},[331,560,561,564],{},[324,562,563],{},"La presentazione della libreria non promette più di fare le stesse cose delle altre"," — si\ndiceva identica alle librerie Ruby e Dart, ma alcune funzioni esistono solo in una o due. Ora\nrimanda alla tabella unica che dice quale libreria sa fare cosa, e da quale versione.",[321,566,567],{},[324,568,502],{},[328,570,571],{},[331,572,573,576,577,580],{},[324,574,575],{},"Solo versioni definitive arrivano a chi installa la libreria"," — chi la installa senza chiedere\nun numero preciso riceve quella che il magazzino pubblico segna come «l'ultima buona». Finora\nbastava un'etichetta di prova per far partire la pubblicazione vera: il commento sopra al lavoro\ndiceva «solo versioni definitive», la regola scritta accettava qualunque etichetta che cominciasse\nper ",[338,578,579],{},"v",". Roba non ancora verificata sarebbe finita in casa di chi usa la libreria, marcata come\nl'ultima buona — non è mai successo solo perché i rilasci li ha sempre fatti una persona a mano.\nAdesso la pubblicazione si ferma prima di partire quando l'etichetta non è definitiva.",[321,582,583],{},[324,584,326],{},[328,586,587],{},[331,588,589,592],{},[324,590,591],{},"Il numero del rilascio e quello dentro il pacchetto non possono più divergere"," — erano tre\nnumeri diversi che nessuno metteva a confronto: quello dell'etichetta, quello scritto nel\npacchetto, e quello che la libreria dichiara di essere quando ci manda un errore. Un rilascio\npoteva chiamarsi 0.12.0 e pubblicare 0.11.0 senza che nulla diventasse rosso; e se 0.11.0 era già\nuscita, il magazzino rifiutava il rilascio buono lasciando il lavoro a metà. Il terzo numero, se\nrestava indietro, faceva comparire nel pannello gli errori dei siti sotto una versione che non era\nquella vera. Adesso il rilascio si ferma prima di pubblicare quando i tre numeri non coincidono, e\ndice quale non torna.",[316,594,596],{"id":595},"_0100-2026-08-16","0.10.0 · 2026-08-16",[321,598,599],{},[324,600,415],{},[328,602,603,665],{},[331,604,605,548,608,611,612,615,616,619,620,623,624,626,627,630,631,634,635,637,640,641,644,645,648,649,651,654,655,657,660,661,664],{},[324,606,607],{},"Velocità percepita dai visitatori veri (CYJS-12, CYJS-28)",[338,609,610],{},"trackWebVitals: true"," l'SDK\nmisura sul browser di chi visita il sito le tre cose con cui Google giudica la velocità: quanto ci\nmette a comparire il contenuto principale (LCP), quanto la pagina si sposta sotto gli occhi mentre\ncarica (CLS) e quanto tarda a rispondere quando la si tocca (INP). Insieme arrivano le due misure\nche spiegano un caricamento lento: quanto ci mette il server a rispondere (TTFB) e quando compare\nil primo pezzo di pagina (FCP). Finora quei numeri si potevano solo stimare in laboratorio: adesso\narrivano dalle visite vere, pagina per pagina.",[613,614],"br",{},"A misurarli è ",[324,617,618],{},"la libreria di Google",", la stessa che sta dietro ai dati che Google pubblica sui\nsiti: così i numeri di CloseYourIt e quelli che si leggono altrove parlano della stessa cosa e si\npossono mettere una accanto all'altra. È l'",[324,621,622],{},"unica"," libreria esterna che l'SDK si porta dietro, ed\nè dentro il pacchetto: chi lo installa non deve aggiungere nulla.",[613,625],{},"Le misure partono ",[324,628,629],{},"tutte insieme, in un invio solo",", quando la pagina esce di scena: prima di\nallora sono provvisorie — il contenuto principale può ancora essere superato da uno più grande, gli\nspostamenti possono ancora aumentare. Un valore per metrica a caricamento: una seconda uscita non\nproduce un doppione. Quello che arriva in ritardo, dopo che l'invio è già partito, viene mandato\nentro cinque secondi invece di restare fermo in attesa di un'uscita di pagina che potrebbe non\narrivare mai. Nel corpo viaggiano il nome del sito, il percorso della pagina (",[324,632,633],{},"mai"," la query, che\npuò contenere dati riservati), il tipo di navigazione, l'ambiente e la versione: nessun dato che\nidentifichi il visitatore. Il giudizio buono\u002Fda migliorare\u002Fscarso non viene mandato — lo calcola\nCloseYourIt, così un SDK vecchio non può dipingere di verde ciò che oggi è rosso.",[613,636],{},[338,638,639],{},"webVitalsSampleRate"," (default ",[338,642,643],{},"1.0",", indipendente dal campionamento degli errori) permette di\nraccoglierne solo una parte, e decide sul ",[324,646,647],{},"caricamento intero",": le misure di una pagina partono\ntutte o nessuna, altrimenti i percentili di metriche diverse verrebbero da insiemi di pagine\ndiversi e non sarebbero più confrontabili tra loro.",[613,650],{},[324,652,653],{},"Dove il browser non sa misurare, non succede nulla",": la metrica che manca semplicemente non\narriva, le altre partono lo stesso e il resto dell'SDK non cambia comportamento.",[613,656],{},[324,658,659],{},"Nota per chi pubblica questa versione."," Lo snippet che i siti caricano da CDN non è fissato a\nuna versione: appena questa esce, entro pochi giorni arriva da sola su tutti i siti che hanno\ninstallato CloseYourIt. Le misure hanno quindi bisogno che la parte che le riceve sia ",[324,662,663],{},"già\nattiva"," in produzione (CYRA-538), altrimenti i browser dei visitatori manderebbero dati verso una\nporta chiusa. Prima quello, poi la pubblicazione.",[331,666,667,670,671,674,675,677,678,681,682,685,686,689],{},[324,668,669],{},"Risorse che non caricano e policy del browser che bloccano (CYJS-12)"," — con\n",[338,672,673],{},"captureResourceErrors: true"," l'SDK segnala i guasti che nessun errore JavaScript racconta: uno\nscript o un foglio di stile che non arriva, un'immagine che non carica, una regola di sicurezza\ndella pagina (CSP) che blocca qualcosa che serviva. Prima quei fallimenti erano invisibili: il\nbrowser li segnalava e basta, e la pagina restava rotta senza che nessuno lo sapesse.",[613,676],{},"Arrivano insieme agli altri errori, ma come ",[324,679,680],{},"avvisi"," e non come errori dell'applicazione: una\nrisorsa bloccata è quasi sempre ambiente o terze parti — un blocco pubblicità, una CDN\nirraggiungibile — e trattarla da guasto riempirebbe gli avvisi di rumore che nessuno può\ncorreggere. Gli indirizzi viaggiano ",[324,683,684],{},"sempre senza query string",", che nelle CDN porta le firme di\naccesso. Il tetto è di ",[324,687,688],{},"dieci segnalazioni per pagina"," e la stessa risorsa che continua a fallire\nne vale una sola: una CDN giù fa fallire ogni immagine del catalogo, e le prime dicono già tutto.",[321,691,692],{},[324,693,694],{},"Cambiato",[328,696,697],{},[331,698,699,702,703,705],{},[324,700,701],{},"Il peso dello snippet ha un tetto, e la CI lo fa rispettare (CYJS-28)"," — lo ",[338,704,448],{}," che i\nsiti caricano da CDN lo scarica ogni visitatore di ogni sito che ha installato CloseYourIt, anche\nchi delle novità non usa niente. Da ora la sua dimensione massima è scritta nel progetto e viene\nverificata a ogni modifica: se una nuova funzione lo fa crescere oltre il tetto, il controllo si\nferma e la crescita va discussa invece di passare inosservata. Con le misure di velocità dentro,\nlo snippet pesa circa 18 KB compressi.",[316,707,709],{"id":708},"_090-2026-08-15","0.9.0 · 2026-08-15",[321,711,712],{},[324,713,694],{},[328,715,716,777],{},[331,717,718,721,722,725,726,729,730,733,734,736,737,740,741,744,745,748,749,752,753,755,756,758,761,762,765,766,769,770,773,774,776],{},[324,719,720],{},"L'ultima misura parte anche quando la scheda si chiude (CYJS-29)"," — chiudendo la pagina l'invio in\ncorso poteva non arrivare mai, soprattutto su iPhone: la richiesta veniva abbandonata a metà e quel\ndato spariva senza lasciare traccia. Da ",[338,723,724],{},"pagehide","\u002F",[338,727,728],{},"visibilitychange(hidden)"," in poi gli invii del\nbrowser passano dal canale che i browser tengono in vita apposta per questo momento\n(",[338,731,732],{},"navigator.sendBeacon","), quindi l'ultima misura, l'ultimo log e l'ultimo errore arrivano lo stesso.",[613,735],{},"Vale solo per il browser autenticato con la ",[324,738,739],{},"DSN public key",": quel canale non può portare header, e\ncon il bearer l'invio partirebbe senza credenziale — lì resta il ",[338,742,743],{},"fetch"," di prima. Il body viaggia\ncome ",[338,746,747],{},"text\u002Fplain"," (lo stesso JSON di sempre): con ",[338,750,751],{},"application\u002Fjson"," il browser anteporrebbe una\nrichiesta di permesso che, a pagina in chiusura, non fa in tempo a completarsi. Dove il canale non\nc'è o rifiuta il payload perché la sua quota è esaurita, si ripiega sul ",[338,754,743],{}," di prima: un invio\nsenza garanzie è meglio di un invio perso.",[613,757],{},[324,759,760],{},"Nota per chi legge i contatori",": il browser non restituisce una risposta per questi invii. Contano\ncome ",[338,763,764],{},"sent"," nel senso di \"presi in carico dal browser\" e il loro evento diagnostico ",[338,767,768],{},"send"," non porta\nuno ",[338,771,772],{},"status",". Al ritorno in primo piano (ripristino da bfcache) si torna al ",[338,775,743],{},", che la risposta\nla dà.",[331,778,779,782,783,786,787,790,791,793,796,797,800,801,803],{},[324,780,781],{},"Le registrazioni delle sessioni mascherano anche il testo mostrato dalla pagina (CYJS-15)"," — prima\nil masking di default copriva solo quello che l'utente digitava nei campi. In un gestionale i dati\nsensibili sono soprattutto testo che la pagina mostra — nomi di clienti, pratiche, importi — e finiva\nregistrato in chiaro. Ora ",[338,784,785],{},"replayMaskTextSelector"," vale ",[338,788,789],{},"'*'"," per default, il selettore che in rrweb fa\nmatchare ogni elemento: tutto il testo risulta coperto.",[613,792],{},[324,794,795],{},"Cambio di comportamento."," Chi vuole vedere in chiaro una parte della pagina deve dichiararlo,\npassando un selettore più stretto (",[338,798,799],{},"replayMaskTextSelector: '.riservato'"," maschera solo quella parte).\nChi già passava un selettore proprio non è toccato: il valore esplicito vince sul default.",[613,802],{},"Il motivo per cui il default va dalla parte stretta: una registrazione non si corregge a posteriori,\nun dato finito in chiaro si toglie solo cancellando l'intera registrazione.",[321,805,806],{},[324,807,808],{},"Infrastruttura",[328,810,811,829,835],{},[331,812,813,816,817,820,821,824,825,828],{},[324,814,815],{},"Toolchain aggiornata e catena di build irrobustita (CYJS-14)"," — le action della CI non girano più su\nun tag mobile (",[338,818,819],{},"@v6",") ma sullo SHA del commit, con la versione nel commento: un tag può essere spostato\nsu codice mai revisionato, e qui accanto gira il job che pubblica su npm. Il ",[338,822,823],{},"GITHUB_TOKEN"," parte in\nsola lettura per tutti i job e solo la pubblicazione alza i permessi, per il solo OIDC. A ogni run un\naudit verifica le dipendenze che finiscono davvero nel pacchetto pubblicato (",[338,826,827],{},"pnpm run audit:prod",").",[331,830,831,834],{},[324,832,833],{},"Aggiornamenti separati e verificabili (CYJS-14)"," — Dependabot sorveglia sia le action della CI sia i\npacchetti npm: minor e patch arrivano raggruppate, ogni salto maggiore resta una richiesta a sé, da\nvalutare con i suoi gate verdi. Un contratto in test blinda la regola, così un bump collettivo non può\nrientrare di nascosto.",[331,836,837,840,841,844,845,848,849,852,853,856,857,860,861,864],{},[324,838,839],{},"Strumenti di sviluppo aggiornati un salto per volta (CYJS-14)"," — ",[338,842,843],{},"@types\u002Fnode"," alla 24 (la major del\nNode in uso, non l'ultima pubblicata: i tipi devono descrivere il runtime che gira davvero), ",[338,846,847],{},"jsdom","\nalla 29 e ",[338,850,851],{},"vitest"," con ",[338,854,855],{},"@vitest\u002Fcoverage-v8"," alla 4. Nessun effetto sul pacchetto pubblicato: sono gli\nstrumenti con cui viene costruito e verificato. ",[338,858,859],{},"typescript"," resta sulla 5 perché la 7 rompe la\ngenerazione dei tipi dentro ",[338,862,863],{},"tsup","; il motivo è annotato dove serve, così chi ci riprova non riparte da\nzero. Un test in più rifiuta gli aggiornamenti che chiedono un Node più nuovo di quello della\ntoolchain: prima quel disallineamento si scopriva solo a CI rotta.",[316,866,868],{"id":867},"_080-2026-08-06","0.8.0 · 2026-08-06",[321,870,871],{},[324,872,415],{},[328,874,875,953],{},[331,876,877,880,881,884,885,725,888,725,891,894,895,898,899,725,902,725,904,725,907,725,910,913,914,917,918,921,922,725,925,725,927,725,930,725,932,935,936,939,940,943,944,947,948,950,951,828],{},[324,878,879],{},"Visibilità degli eventi scartati dallo SDK (CYJS-9)"," — quando un evento non parte (coda piena,\n",[338,882,883],{},"beforeSend"," che lo scarta o solleva, campionamento, timeout, ",[338,886,887],{},"4xx",[338,889,890],{},"429",[338,892,893],{},"5xx",", rete assente)\nl'applicazione può ora diagnosticarlo senza generare nuova telemetria. ",[338,896,897],{},"getStats()"," espone, oltre agli\naggregati (",[338,900,901],{},"enqueued",[338,903,764],{},[338,905,906],{},"dropped",[338,908,909],{},"failed",[338,911,912],{},"timeout","), la ripartizione ",[338,915,916],{},"reasons"," per motivo; la\nnuova opzione ",[338,919,920],{},"onDiagnostic(event, details)"," notifica in tempo reale ogni tappa\n(",[338,923,924],{},"enqueue",[338,926,768],{},[338,928,929],{},"drop",[338,931,912],{},[338,933,934],{},"shutdown",") con il motivo. L'hook è process-local e ",[324,937,938],{},"non ricorsivo","\n(mentre gira, le API di cattura sono no-op e i diagnostici annidati soppressi), i ",[338,941,942],{},"details"," non\ncontengono mai payload né segreti (",[338,945,946],{},"error"," è il solo nome della classe). Inoltre un ",[338,949,883],{}," che\nsolleva non propaga più: l'errore è assorbito e contabilizzato come scarto (motivo ",[338,952,946],{},[331,954,955,958,959,725,962,965,966,969,970,973,974,977,978,981,982,985,986,988,989,992],{},[324,956,957],{},"Propagazione del contesto di tracing W3C (CYJS-13)"," — lo SDK legge e propaga gli header standard\n",[338,960,961],{},"traceparent",[338,963,964],{},"tracestate"," (W3C Trace Context), così servizi e browser che usano il tracing distribuito\nmantengono la correlazione senza un protocollo proprietario. ",[338,967,968],{},"continueTrace(carrier)"," adotta un trace\ncontext in ingresso (header di richiesta server\u002FSSR, un ",[338,971,972],{},"Headers"," o un getter): il suo trace-id diventa\nil ",[338,975,976],{},"trace_id"," di correlazione — errori, log e metriche si agganciano al trace distribuito — e\nparent\u002Fsampling\u002Ftracestate\u002Fbaggage sono conservati per la ri-propagazione. ",[338,979,980],{},"getTraceHeaders(target?)","\nrestituisce gli header da iniettare in una richiesta in uscita, ma ",[324,983,984],{},"solo verso destinazioni fidate",":\nla nuova opzione ",[338,987,381],{}," (allowlist di stringhe o RegExp) più il same-origin nel\nbrowser. Verso ogni altra destinazione ritorna ",[338,990,991],{},"{}"," — nessun header — così il trace interno e il\nbaggage (potenziale PII) non raggiungono host non fidati. Header assente o malformato: no-op, si\nmantiene il trace corrente. Isomorfo browser\u002FNode, zero dipendenze.",[316,994,996],{"id":995},"_071-2026-08-06","0.7.1 · 2026-08-06",[321,998,999],{},[324,1000,326],{},[328,1002,1003],{},[331,1004,1005,1008,1009,1012,1013,1015,1016,725,1019,1022,1023,1025,1026,1028],{},[324,1006,1007],{},"Riconfigurazione dell'SDK a caldo senza riavviare Node (CYJS-8)"," — richiamare ",[338,1010,1011],{},"init"," con opzioni\ndiverse (endpoint, token, release, …) veniva ignorato finché l'SDK era attivo: la nuova configurazione\nnon entrava mai in uso. Ora ",[338,1014,1011],{}," riconfigura a caldo: smonta gli handler del client precedente e ne\navvia flush+close in background (gli eventi già in coda partono verso la vecchia configurazione;\n",[338,1017,1018],{},"flush()",[338,1020,1021],{},"close()"," attendono anche quella chiusura, così non si perde nulla all'uscita del processo),\ntrasferisce lo scope corrente (trace_id, utente, tag, breadcrumb) al nuovo client e mette in uso la\nnuova config — senza ",[338,1024,1021],{}," manuale e senza lasciare handler duplicati. Con opzioni equivalenti\nresta un no-op idempotente, anche a client disabilitato (confronto sulle opzioni risolte, ",[338,1027,883],{},"\nper reference).",[316,1030,1032],{"id":1031},"_070-2026-08-01","0.7.0 · 2026-08-01",[321,1034,1035],{},[324,1036,415],{},[328,1038,1039],{},[331,1040,1041,1044,1045,1048,1049,1052,1053,1056,1057,1060,1061,1064,1065,1068,1069,1072,1073,1075],{},[324,1042,1043],{},"Budget in byte e troncamento per canale prima dell'invio (CYJS-10)"," — ogni canale ha ora un tetto di\nbyte e una strategia di troncamento propria, applicata prima della spedizione. Il budget di ",[338,1046,1047],{},"message"," e\n",[338,1050,1051],{},"value"," conta i byte ",[324,1054,1055],{},"dopo"," l'escaping JSON (",[338,1058,1059],{},"\"","→",[338,1062,1063],{},"\\\"",", newline→",[338,1066,1067],{},"\\n",", control→",[338,1070,1071],{},"\\u00XX","), non quelli\ndella stringa grezza: prima log ed eventi pieni di virgolette potevano restare sopra soglia. Una rete di\nsicurezza comune a tutti i canali tronca le stringhe non identitarie e rimuove i valori custom residui —\nanche quelli iniettati da ",[338,1074,883],{}," — garantendo che il payload rientri sempre nel budget.",[321,1077,1078],{},[324,1079,326],{},[328,1081,1082,1108],{},[331,1083,1084,1087,1088,1090,1091,1094,1095,725,1098,1101,1102,1104,1105,1107],{},[324,1085,1086],{},"Il contesto non si mescola più fra richieste concorrenti su Node (CYJS-7)"," — su Node più richieste\ncondividevano un solo holder di scope: utente, tag, request, ",[338,1089,976],{}," e breadcrumb di una richiesta\nfinivano negli eventi di un'altra. Ora c'è un ",[338,1092,1093],{},"AsyncLocalStorage"," lato server (import browser-safe) con\nle API ",[338,1096,1097],{},"runWithScope",[338,1099,1100],{},"withScope",". La guida Node e l'esempio Nitro non mostrano più l'anti-pattern sullo\nscope condiviso: si avvolge l'handler con ",[338,1103,1097],{}," e si cattura negli hook globali con ",[338,1106,1100],{},".",[331,1109,1110,1113,1114,1117,1118,1107],{},[324,1111,1112],{},"Versione dell'SDK allineata al pacchetto"," — la costante interna era rimasta a ",[338,1115,1116],{},"0.6.0"," mentre il\npacchetto era alla ",[338,1119,1120],{},"0.6.1",[321,1122,1123],{},[324,1124,808],{},[328,1126,1127,1137],{},[331,1128,1129,1132,1133,1136],{},[324,1130,1131],{},"Smoke test del pacchetto npm come consumatore reale (CYJS-11)"," — la CI ora costruisce, impacchetta e\nconsuma davvero il pacchetto (require CJS, import ESM, load del bundle IIFE) con il Node della matrice,\ntenendo separata la toolchain dal consumatore: ",[338,1134,1135],{},"pnpm"," gira sul Node pinnato, il consumo sul Node minimo\nsupportato. Senza questa separazione il job sarebbe fallito sempre, bloccando ogni release.",[331,1138,1139,1142],{},[324,1140,1141],{},"E2E non mockato di tutti i canali browser (CYJS-6)"," — con la DSN public key vengono inviati per\ndavvero errori, messaggi, log, metriche, pageview e replay verso un backend di prova, i cui status attesi\nsono derivati dalle fixture del contratto invece che ricopiati a mano: se il contratto documentato cambia,\nil test diventa rosso.",[316,1144,1146],{"id":1145},"_061-2026-07-11","0.6.1 · 2026-07-11",[321,1148,1149],{},[324,1150,415],{},[328,1152,1153],{},[331,1154,1155,1158,1159,1162,1163,1166,1167,1170,1171,1174,1175,1170,1178,1181,1182,1184,1185,1188,1189,1192,1193,1196,1197,1199,1200,1202],{},[324,1156,1157],{},"Auto-detect della release Node-side (CYJS-5)"," — su runtime Node reale (SSR\u002Fbackend) l'SDK\nrileva ora da solo la ",[338,1160,1161],{},"release"," dal deploy, in ",[324,1164,1165],{},"parità tag-first con la gem Ruby",": prima il tag\nsemver (",[338,1168,1169],{},"APP_GIT_TAG"," poi ",[338,1172,1173],{},"GIT_TAG",", accettati solo se semver validi), poi lo SHA del deploy\n(",[338,1176,1177],{},"KAMAL_VERSION",[338,1179,1180],{},"GIT_SHA",") come fallback. Una ",[338,1183,1161],{}," passata nelle options ha ",[324,1186,1187],{},"sempre"," la\nprecedenza. Il rilevamento è gated su Node reale (",[338,1190,1191],{},"process.versions.node",", esclude window\u002Fjsdom):\nnel ",[324,1194,1195],{},"browser"," non c'è alcun accesso alle variabili di processo — la ",[338,1198,1161],{}," va passata\nesplicita (build-time inject). SDK isomorfo: solo lettura di ENV, ",[324,1201,633],{}," un subprocess git.",[316,1204,1206],{"id":1205},"_060-2026-07-10","0.6.0 · 2026-07-10",[321,1208,1209],{},[324,1210,502],{},[328,1212,1213],{},[331,1214,1215,840,1222,1225,1226,1229,1230,1235,1236,1239,1240,1243,1244,1246,1247,1250],{},[324,1216,1217,1218,1221],{},"Il bearer segreto ",[338,1219,1220],{},"cyi_"," non finisce mai più nel browser (CYJS-1)",[338,1223,1224],{},"token"," è ora una\ncredenziale ",[324,1227,1228],{},"SERVER-ONLY"," (piena potenza ingest + read). Nel browser l'SDK autentica con la nuova\nopzione ",[324,1231,1232],{},[338,1233,1234],{},"publicKey"," (DSN public key, non segreta) via ",[338,1237,1238],{},"?sentry_key="," sul drop-in Sentry\n",[338,1241,1242],{},"POST \u002Fapi\u002F{projectId}\u002Fstore"," per gli errori\u002Fmessaggi; il bearer non viene ",[324,1245,633],{}," inviato dal\nbrowser. Passando nel browser solo il bearer segreto, l'SDK resta no-op (con ",[338,1248,1249],{},"console.warn",") invece\ndi esporlo nel bundle\u002Ftab Network. README riconciliati (rimossa l'indicazione \"può stare nel bundle\").",[321,1252,1253],{},[324,1254,415],{},[328,1256,1257],{},[331,1258,1259,1264,1265,1268,1269,1271,1272,1275,1276,1278,1279,1282,1283,828],{},[324,1260,1261,1262],{},"Opzione ",[338,1263,1234],{}," (DSN public key) — credenziale ",[324,1266,1267],{},"browser-safe",". Node\u002FSSR continua a usare\n",[338,1270,1224],{}," (bearer) sui path ",[338,1273,1274],{},"\u002Fapi\u002Fv1\u002Fprojects\u002F*","; il browser usa ",[338,1277,1234],{}," (eventi al drop-in\n",[338,1280,1281],{},"\u002Fstore",", gli altri canali sui path v1 con ",[338,1284,1238],{},[321,1286,1287],{},[324,1288,1289],{},"Modifiche che rompono la compatibilità",[328,1291,1292],{},[331,1293,1294,1297,1298,1300,1301,1303,1304,1306],{},[324,1295,1296],{},"Browser",": la sola ",[338,1299,1224],{}," (bearer ",[338,1302,1220],{},") non abilita più l'SDK nel browser — serve ",[338,1305,1234],{},".\nAggiornare i progetti browser per fornire la DSN public key. Node\u002FSSR invariato.",[321,1308,1309],{},[324,1310,326],{},[328,1312,1313,1346,1362],{},[331,1314,1315,1321,1322,1324,1325,1330,1331,1334,1335,1338,1339,1342,1343,1345],{},[324,1316,1317,1320],{},[338,1318,1319],{},"repeated_http",": conteggio visibile in UI (CYJS-2)"," — il verdetto ",[338,1323,1319],{}," emette\nora il campo wire ",[324,1326,1327],{},[338,1328,1329],{},"query_count"," invece di ",[338,1332,1333],{},"count_in_request",". Prima il conteggio delle richieste\nripetute dal browser era invisibile nel Monitor (colonna ",[338,1336,1337],{},"—","), perché il reader Rails\n(",[338,1340,1341],{},"occurrence_query_count",") e l'SDK dart leggono ",[338,1344,1329],{},": un solo nome di campo wire cross-SDK.",[331,1347,1348,1351,1352,1355,1356,1358,1359,828],{},[324,1349,1350],{},"DX misconfig",": ",[338,1353,1354],{},"init()"," con una config incompleta (token\u002FprojectId mancante) ora emette un\n",[338,1357,1249],{}," esplicito (\"SDK disabilitato: … — nessun evento verrà inviato\") invece di restare un\nno-op totalmente silenzioso. Non avvisa quando la disabilitazione è voluta (",[338,1360,1361],{},"enabled: false",[331,1363,1364,1367,1368,1371,1372,1375],{},[324,1365,1366],{},"DX diagnostica",": su risposta non-2xx il log di debug include ora il codice d'errore ",[338,1369,1370],{},"R…"," e il\nmessaggio dall'envelope del backend (es. ",[338,1373,1374],{},"R422-INGEST-001: Evento malformato","), non solo lo status.",[316,1377,1379],{"id":1378},"_050-2026-07-08","0.5.0 · 2026-07-08",[321,1381,1382],{},[324,1383,415],{},[328,1385,1386],{},[331,1387,1388,1391,1392,1395,1396,1399,1400,1403,1404,725,1406,1408,1409,1107],{},[324,1389,1390],{},"Metadata comportamentale nel session replay"," — ogni chunk porta ora ",[338,1393,1394],{},"path"," (pathname corrente al\nflush, senza query string) e ",[338,1397,1398],{},"user"," (id da ",[338,1401,1402],{},"setUser",", opzionale). Alimentano la galleria \"come si\ncomportano gli utenti\" nel Monitor (pagine visitate, sessioni per utente). Additivo e retro-compatibile:\ni chunk senza ",[338,1405,1394],{},[338,1407,1398],{}," restano validi. Nuovo getter ",[338,1410,1411],{},"Scope#userId",[316,1413,1415],{"id":1414},"_040-2026-07-07","0.4.0 · 2026-07-07",[321,1417,1418],{},[324,1419,415],{},[328,1421,1422,1463,1483,1506],{},[331,1423,1424,1435,1436,1439,1440,1443,1444,1447,1448,1451,1452,725,1454,1456,1457,1459,1460,1462],{},[324,1425,1426,1427,1430,1431,1434],{},"Session replay (opt-in ",[338,1428,1429],{},"replay",", default ",[338,1432,1433],{},"false",")"," — registra la sessione con rrweb e invia i\nchunk a ",[338,1437,1438],{},"POST \u002Fapi\u002Fv1\u002Fprojects\u002F{projectId}\u002Freplays",". Recorder in\n",[338,1441,1442],{},"integrations\u002Fbrowser\u002Freplay.ts"," (twin di ",[338,1445,1446],{},"installPageviews","): buffer degli eventi rrweb, flush\nperiodico (",[338,1449,1450],{},"replayFlushIntervalMs",", default 5000) + su ",[338,1453,724],{},[338,1455,728],{}," + a\nsoglia di buffer. Passa da ",[338,1458,924],{}," → soggetto a ",[338,1461,883],{}," e ai contatori come gli altri invii.",[331,1464,1465,1468,1469,1472,1473,1468,1476,1479,1480,1482],{},[324,1466,1467],{},"Sessione di replay longeva"," (",[338,1470,1471],{},"session.ts",") — id opaco (no PII) stabile per l'intera\nsessione-browser via ",[338,1474,1475],{},"sessionStorage",[338,1477,1478],{},"cyi_replay","), più longevo del ",[338,1481,976],{}," per-pagina;\nfallback in-memory se lo storage non è disponibile.",[331,1484,1485,1488,1489,1492,1493,1496,1497,1468,1499,1502,1503,1107],{},[324,1486,1487],{},"Correlazione errore ↔ replay"," — gli errori\u002Fmessaggi JS portano l'id in\n",[338,1490,1491],{},"contexts.replay.replay_id"," (nuovo ",[338,1494,1495],{},"Scope.replaySessionId","); per gli errori server il recorder\nscrive un cookie di sessione ",[338,1498,1478],{},[338,1500,1501],{},"SameSite=Lax",") che le richieste same-origin trasportano\nal backend. Facade ",[338,1504,1505],{},"getReplaySessionId()",[331,1507,1508,1511,1512,640,1515,1518,1519,1522,1523,1525,1526,1529],{},[324,1509,1510],{},"Privacy"," — masking di default: ",[338,1513,1514],{},"replayMaskAllInputs",[338,1516,1517],{},"true","), più ",[338,1520,1521],{},"replayBlockSelector","\ne ",[338,1524,785],{}," (rrweb) per bloccare\u002Fmascherare elementi sensibili. rrweb NON è una\ndipendenza: il recorder usa il globale ",[338,1527,1528],{},"window.rrweb"," (build UMD caricata dalla pagina), il core\nresta zero-dep.",[321,1531,1532],{},[324,1533,370],{},[328,1535,1536],{},[331,1537,1538,1539,1468,1542,1545,1546,1549,1550,828],{},"Allineata ",[338,1540,1541],{},"SDK_VERSION",[338,1543,1544],{},"version.ts",") a ",[338,1547,1548],{},"package.json"," (era ferma a ",[338,1551,1552],{},"0.2.0",[316,1554,1556],{"id":1555},"_030-2026-07-03","0.3.0 · 2026-07-03",[321,1558,1559],{},[324,1560,415],{},[328,1562,1563,1575],{},[331,1564,1565,1570,1571,1574],{},[324,1566,1567],{},[338,1568,1569],{},"captureEvent(name, overrides?)"," — invia un custom event (goal\u002Fconversione analytics) con il campo\n",[338,1572,1573],{},"name"," valorizzato; no-op fuori dal browser, pre-init o senza nome.",[331,1576,1577,840,1580,1583,1584,725,1587,1590,1591,1594,1595,1598],{},[324,1578,1579],{},"Payload pageview esteso",[338,1581,1582],{},"buildPageview"," estrae le 5 chiavi UTM (aggiunte ",[338,1585,1586],{},"utm_term",[338,1588,1589],{},"utm_content",")\ne include ",[338,1592,1593],{},"screen_width"," dalla viewport (il server la classifica in ",[338,1596,1597],{},"screen_class",", mai il valore raw).\nAdditivo: gli SDK a 3 chiavi restano compatibili.",[316,1600,1602],{"id":1601},"_020-2026-07-02","0.2.0 · 2026-07-02",[321,1604,1605],{},[324,1606,415],{},[328,1608,1609,1645,1663],{},[331,1610,1611,1614,1615,640,1618,1620,1621,1623,1624,725,1627,1630,1631,1634,1635,1638,1639,1641,1642,1107],{},[324,1612,1613],{},"Pageview tracking (web analytics)"," — opzione ",[338,1616,1617],{},"trackPageviews",[338,1619,1433],{},", opt-in):\npageview all'",[338,1622,1354],{}," e a ogni navigazione SPA (patch ",[338,1625,1626],{},"history.pushState",[338,1628,1629],{},"replaceState"," +\n",[338,1632,1633],{},"popstate",") con ",[324,1636,1637],{},"dedup sul pathname"," (hash change e ",[338,1640,1629],{}," ripetuti sullo stesso path\nnon emettono, semantica Plausible). Endpoint ",[338,1643,1644],{},"POST \u002Fapi\u002Fv1\u002Fprojects\u002F{projectId}\u002Fpageviews",[331,1646,1647,1650,1651,1654,1655,1658,1659,1662],{},[338,1648,1649],{},"capturePageview(overrides?)"," sulla facade (anche ",[338,1652,1653],{},"window.CloseYourIt.capturePageview"," via IIFE)\nper pageview manuali; i pageview ",[324,1656,1657],{},"non"," sono soggetti a ",[338,1660,1661],{},"sampleRate"," (sono il dato, non un campione).",[331,1664,1665,1666,1669,1670,1673,1674,1677,1678,1681,1682,725,1685,725,1688,1691,1692,1695,1696,1699],{},"Payload privacy-first: ",[338,1667,1668],{},"hostname"," + ",[338,1671,1672],{},"pathname"," (mai la query string), ",[338,1675,1676],{},"document.referrer","\n(omesso se vuoto), ",[324,1679,1680],{},"UTM estratti client-side"," (solo ",[338,1683,1684],{},"utm_source",[338,1686,1687],{},"utm_medium",[338,1689,1690],{},"utm_campaign","),\n",[338,1693,1694],{},"event_id"," UUID per idempotenza, ",[338,1697,1698],{},"occurred_at"," ISO. Nessun dato identificante nel body: IP e\nUser-Agent li consuma il server dalla richiesta (visitor hash cookieless a salt giornaliero).",[321,1701,1702],{},[324,1703,370],{},[328,1705,1706],{},[331,1707,1708,1709,1468,1712,1715,1716,1719],{},"Refactor interno ",[338,1710,1711],{},"subscribeNavigation",[338,1713,1714],{},"integrations\u002Fbrowser\u002Fnavigation.ts","): un solo\nmonkey-patch di ",[338,1717,1718],{},"history"," condiviso tra breadcrumb di navigazione e pageview (patch installato\nal primo subscriber, ripristinato all'ultimo unsubscribe).",[316,1721,1723],{"id":1722},"_010-2026-07-02","0.1.0 · 2026-07-02",[321,1725,1726],{},[324,1727,415],{},[328,1729,1730,1757,1794,1842,1867,1897,1928,1956,1978,1994],{},[331,1731,1732,1733,1735,1736,1739,1740,1742,1743,1746,1747,341,1750,1753,1754,828],{},"SDK ",[338,1734,57],{}," ",[324,1737,1738],{},"isomorfo browser + Node 20+"," (TypeScript, zero dipendenze\nruntime). Contratto wire identico a ",[338,1741,47],{}," e ",[338,1744,1745],{},"closeyourit-dart"," (formato Sentry,\ncampi ",[338,1748,1749],{},"snake_case",[338,1751,1752],{},"POST \u002Fapi\u002Fv1\u002Fprojects\u002F{projectId}\u002F{events,metrics,logs}"," con\n",[338,1755,1756],{},"Authorization: Bearer cyi_…",[331,1758,1759,1351,1762,1742,1765,1768,1769,1669,1771,1774,1775,1778,1779,725,1782,1785,1786,1789,1790,1793],{},[324,1760,1761],{},"Cattura errori",[338,1763,1764],{},"captureException",[338,1766,1767],{},"captureMessage","; nel browser gestori globali\n",[338,1770,946],{},[338,1772,1773],{},"unhandledrejection"," (via ",[338,1776,1777],{},"addEventListener",", non clobberano handler esistenti); su\nNode ",[338,1780,1781],{},"uncaughtException",[338,1783,1784],{},"unhandledRejection"," con flush (timeout 2s) e uscita col codice 1 se\nnon ci sono handler utente (semantica crash di default preservata). ",[338,1787,1788],{},"excludedExceptions"," per\nnome; dedup a identità d'oggetto (",[338,1791,1792],{},"WeakSet",", mark-before-sampling) + finestra temporale.",[331,1795,1796,1351,1799,1742,1802,1805,1806,341,1809,1060,1812,1815,1816,725,1818,1820,1821,1824,1825,725,1828,1831,1832,725,1835,1838,1839,1107],{},[324,1797,1798],{},"Log strutturati",[338,1800,1801],{},"log(level, message, attributes, logger)",[338,1803,1804],{},"logger"," nominato\n(",[338,1807,1808],{},"debug\u002Finfo\u002Fwarn\u002Ferror\u002Ffatal",[338,1810,1811],{},"warn",[338,1813,1814],{},"warning","), buffer batch (50\u002F5s, chunk ≤ 1000) con flush\nautomatico su timer, ",[338,1817,724],{},[338,1819,728],{}," (browser, ",[338,1822,1823],{},"fetch(keepalive)"," sotto\nla quota 64 KB) e ",[338,1826,1827],{},"beforeExit",[338,1829,1830],{},"SIGTERM"," (Node). Gating ",[338,1833,1834],{},"logsEnabled",[338,1836,1837],{},"logsMinLevel","\u002F\n",[338,1840,1841],{},"logsSampleRate",[331,1843,1844,1351,1847,1850,1851,1854,1855,1858,1859,1862,1863,1866],{},[324,1845,1846],{},"Metriche",[338,1848,1849],{},"measure(label, body)"," (sync\u002Fasync, ritorna il valore, metrica anche su throw) →\n",[338,1852,1853],{},"slow_method"," oltre ",[338,1856,1857],{},"slowMethodThresholdMs","; ",[338,1860,1861],{},"arguments"," opt-in con\n",[338,1864,1865],{},"captureMethodArguments"," (scrubati, troncati). Mai campionate.",[331,1868,1869,1351,1875,1878,1879,725,1882,1885,1886,1888,1889,1892,1893,1896],{},[324,1870,1871,1872,1434],{},"Performance issues (opt-in ",[338,1873,1874],{},"detectPerformanceIssues",[338,1876,1877],{},"slow_external_http"," (fetch\u002FXHR\nesterna oltre soglia, path templatizzato ",[338,1880,1881],{},"\u003Cuuid>",[338,1883,1884],{},"\u003Cn>","), ",[338,1887,1319],{}," (stessa richiesta ≥ N\nvolte in finestra — l'N+1 del client), ",[338,1890,1891],{},"jank"," (long task via ",[338,1894,1895],{},"PerformanceObserver",", di fatto\nChromium-only).",[331,1898,1899,1351,1902,725,1904,725,1907,725,1910,725,1913,725,1916,725,1919,1630,1922,1858,1925,1927],{},[324,1900,1901],{},"Scope",[338,1903,1402],{},[338,1905,1906],{},"setTag",[338,1908,1909],{},"setTags",[338,1911,1912],{},"setExtra",[338,1914,1915],{},"setContext",[338,1917,1918],{},"setTraceId",[338,1920,1921],{},"setRequest",[338,1923,1924],{},"clearScope",[338,1926,976],{}," di pagina generato all'init per correlare errori, log e metriche;\nrequest context automatico nel browser (URL senza query, User-Agent, referrer).",[331,1929,1930,1933,1934,1937,1938,725,1941,725,1943,1885,1945,725,1947,341,1950,1952,1953,1955],{},[324,1931,1932],{},"Breadcrumb"," automatici con interruttori granulari (",[338,1935,1936],{},"autoBreadcrumbs","): click, navigazione\n(",[338,1939,1940],{},"pushState",[338,1942,1629],{},[338,1944,1633],{},[338,1946,1249],{},[338,1948,1949],{},"console.error",[338,1951,743],{},"\u002FXHR (marcatura\n",[338,1954,1877],{}," sulle esterne lente). URL privati di query e hash.",[331,1957,1958,1960,1961,1964,1965,1060,1967,1970,1971,1974,1975,1977],{},[324,1959,1510],{},": policy ",[338,1962,1963],{},"sendPii"," (default off: ",[338,1966,1398],{},[338,1968,1969],{},"{id}",", URL senza query, referrer\nstrippato), scrubber PII ricorsivo (denylist superset del backend, include ",[338,1972,1973],{},"email","), hook\n",[338,1976,883],{}," su ogni payload.",[331,1979,1980,1983,1984,1987,1988,1990,1991,1107],{},[324,1981,1982],{},"Affidabilità",": transport fire-and-forget che non solleva mai, coda bounded (",[338,1985,1986],{},"maxQueue",") con\ndrop e contatori ",[338,1989,897],{},"; su Node redirect POST seguiti a mano (max 2, solo same-host o\nwww-swap: il Bearer non esce mai verso host terzi) e ",[338,1992,1993],{},"User-Agent: closeyourit-js\u002F{versione}",[331,1995,1996,1999,2000,2003,2004,2006],{},[324,1997,1998],{},"Distribuzione",": build ESM + CJS + tipi per bundler\u002Fnpm, e IIFE minificato\n(",[338,2001,2002],{},"window.CloseYourIt",") per ",[338,2005,448],{}," — ~7 KB gzip.",{"title":2008,"searchDepth":19,"depth":19,"links":2009},"",[2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031],{"id":318,"depth":19,"text":319},{"id":348,"depth":19,"text":349},{"id":364,"depth":19,"text":365},{"id":409,"depth":19,"text":410},{"id":426,"depth":19,"text":427},{"id":464,"depth":19,"text":465},{"id":480,"depth":19,"text":481},{"id":496,"depth":19,"text":497},{"id":519,"depth":19,"text":520},{"id":535,"depth":19,"text":536},{"id":595,"depth":19,"text":596},{"id":708,"depth":19,"text":709},{"id":867,"depth":19,"text":868},{"id":995,"depth":19,"text":996},{"id":1031,"depth":19,"text":1032},{"id":1145,"depth":19,"text":1146},{"id":1205,"depth":19,"text":1206},{"id":1378,"depth":19,"text":1379},{"id":1414,"depth":19,"text":1415},{"id":1555,"depth":19,"text":1556},{"id":1601,"depth":19,"text":1602},{"id":1722,"depth":19,"text":1723},"md",{},true,{"title":282,"description":283},"docs\u002Fchangelog-sdk-javascript","t4aVLGfO4qZS_VH5CItLBWY_jrD9VXhANVWToGyS2ZQ",1791469655208]