Chatgpt лесно управлява чатовете

Чат за търсене, чат за филтриране, бърз/партиден изтриване чат.

От 03.06.2025. Виж последната версия.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name                   ChatGPT Easy Chat Management
// @name:aa                ChatGPT sahlin walalih walal
// @name:ab                ЧатГПТ Имарианы ацәажәарақәа рнапхгара
// @name:af                Chatgpt bestuur maklik geselsies
// @name:ak                ChatGPT yɛ mmerɛw sɛ wobɛhwɛ nkɔmmɔbɔ so .
// @name:am                ውይይት በቀላሉ ቻትዎችን ያስተዳድራል
// @name:ar                ChatGPT بسهولة إدارة الدردشات
// @name:as                Chatgpt সহজে চ্যাট পৰিচালনা কৰে
// @name:av                ChatGPT Бигьаго нухмалъи гьабизе чат
// @name:ay                Chatgpt ukax jasakiw chats ukar apnaqañama .
// @name:az                ChatGept asanlıqla söhbətləri idarə edin
// @name:ba                ChatGPT еңел идара итеү чат
// @name:be                Chatgpt лёгка кіраваць чатамі
// @name:bg                Chatgpt лесно управлява чатовете
// @name:bh                चैटजीपीटी आसानी से चैट के प्रबंधन करीं
// @name:bm                ChatGPT bɛ se ka barow ɲɛnabɔ nɔgɔya la .
// @name:bn                চ্যাটজিপ্ট সহজেই চ্যাট পরিচালনা করুন
// @name:bo                ChatGPT ཁ་བརྡ་བདེ་བླག་ངང་འཛིན་སྐྱོང་བྱེད་པ།
// @name:br                ChatGPT Aes merañ ar c’hrogadoù
// @name:bs                Chaggpt Lako upravljati chatovima
// @name:ca                Chatgpt gestiona fàcilment els xats
// @name:ce                ChatGPT Easily-н урхалла до чаташна
// @name:ceb               Ang chatgpt dali nga magdumala sa mga chat
// @name:ch                Gaigue-ña si ChatGPT Gi i lina’la’
// @name:ckb               Chatgpt بە ئاسانی بەڕێوەبردنی چاتەکان
// @name:co                Chatgpt fabricà facilmente i chats
// @name:cs                Chatgpt Snadno spravuje chaty
// @name:cv                ЧатГПТ йĕркеллĕ чатсене йĕркелеме пулать
// @name:cy                Chatgpt yn rheoli sgyrsiau yn hawdd
// @name:da                Chatgpt Administrer let chats
// @name:de                ChatGPT verwalten einfach Chats
// @name:dv                ޗެޓްޖީޕީޓީ އިން ފަސޭހައިން ޗެޓް މެނޭޖް ކުރަނީ
// @name:dz                ChatGPT འཇམ་ཏོང་ཏོ་སྦེ་ཁ་སླབ་ཚུ་འཛིན་སྐྱོང་འཐབ་ནི།
// @name:ee                Chatgpt kpɔa dzeɖoɖowo dzi bɔbɔe .
// @name:el                Το Chatgpt διαχειρίζεται εύκολα τις συνομιλίες
// @name:en                ChatGPT Easily manage chats
// @name:en-GB             ChatGPT Easily manage chats
// @name:eo                Chatgpt facile administras babiladojn
// @name:es                Chatgpt administrar fácilmente los chats
// @name:et                Chatgpt hallake vestlusi hõlpsalt
// @name:eu                Chatgpt erraz kudeatu txatak
// @name:fa                Chatgpt به راحتی چت ها را مدیریت می کند
// @name:ff                ChatGPT Ko yaawi ina jogori waɗde yeewtereeji
// @name:fi                ChatgPT hallitsee helposti keskusteluja
// @name:fil               Ang chatgpt ay madaling pamahalaan ang mga chat
// @name:fj                Vakarautaki ni Eusily ni lewa .
// @name:fo                ChatGPT umsitur Lætt
// @name:fr                Chatgpt Gérez facilement les chats
// @name:fr-CA             Chatgpt Gérez facilement les chats
// @name:fy                Chatgpt maklik beheare petearen
// @name:ga                Chatgpt comhrá a bhainistiú go héasca
// @name:gd                Bidh Chatgpt furasta a ’comharrachadh chait
// @name:gl                Chatgpt xestionar facilmente os chats
// @name:gn                CHATGPT Ojesareko pya’e umi ñe’ẽjoaju rehe .
// @name:gsw-berne         ChatGPT Easily manage chats
// @name:gu                ચેટગપ્ટ સરળતાથી ચેટ્સનું સંચાલન કરો
// @name:gv                ChatGPT Easily.
// @name:ha                CYGTP sauƙin sarrafawa
// @name:he                צ’אט
// @name:hi                CHATGPT आसानी से चैट का प्रबंधन करें
// @name:hmn               Chatgpt yooj yim tswj chats
// @name:hr                Chatgpt lako upravljati chatovima
// @name:ht                Chatgpt fasil jere cha
// @name:hu                A chatgpt könnyen kezelheti a csevegést
// @name:hy                Chatgpt- ը հեշտությամբ կառավարում է զրույցները
// @name:id                Chatgpt dengan mudah mengelola obrolan
// @name:ig                Nkata dị mfe jikwaa nkata
// @name:is                Chatgpt stjórna auðveldlega spjalli
// @name:it                Chatgpt gestisce facilmente le chat
// @name:iu                ChatGPT-ᑯᑦ ᐊᐅᓚᑦᑎᖏᓐᓇᐅᔭᖅᑐᑦ ᐅᖃᖃᑎᒌᒍᑎᓂᒃ
// @name:ja                ChatGptはチャットを簡単に管理します
// @name:jv                ChatGPT Gampang Ngatur Chats
// @name:ka                Chatgpt ადვილად მართავს ჩეთებს
// @name:kg                ChatGPT ke sadilaka masolo kukonda mpasi
// @name:kk                Чатшпта чаттарды оңай басқаруда
// @name:kl                ChatGPT chats-inik ajornanngitsumik aqutsisinnaavutit
// @name:km                Chatgpt គ្រប់គ្រងការជជែក
// @name:kn                ಚಾಟ್ಜಿಪಿಟಿ ಸುಲಭವಾಗಿ ಚಾಟ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ
// @name:ko                Chatgpt는 채팅을 쉽게 관리합니다
// @name:kr                ChatGPT kəskelan zandewa cistǝgǝ
// @name:ku                Chatgpt bi hêsanî chat
// @name:kv                ЧатГПТ Кокниӧн веськӧдлӧны чатъясӧн .
// @name:ky                Чатгптай
// @name:la                Chatgpt facile Curo Chats
// @name:lb                ChatGPT einfach managen Chats
// @name:lg                ChatGpt enyangu okuddukanya emboozi .
// @name:ln                Chatgpt e gérer na pete ba chats .
// @name:lo                ChatGPT ຄຸ້ມຄອງການສົນທະນາໄດ້ຢ່າງງ່າຍດາຍ
// @name:lt                „ChatGpt“ lengvai valdo pokalbius
// @name:lv                Chatgpt viegli pārvaldīt tērzēšanu
// @name:mg                Mora mitantana ny chatgpt mora
// @name:mh                ChatGPT Ej kōṃṃan bwe en pidodo aer kōnono .
// @name:mi                He ngawari te whakahaere i nga whakawhitinga
// @name:mk                Chatgpt лесно управува со разговори
// @name:ml                ചാറ്റ്ഗേറ്റ് ചാറ്റുകൾ എളുപ്പത്തിൽ മാനേജുചെയ്യുക
// @name:mn                Chatgpt амархан чатыг хялбархан удирддаг
// @name:mo                Chatgpt gestionează cu ușurință chaturile
// @name:mr                Chatgpt सहजपणे गप्पा व्यवस्थापित करा
// @name:ms                Chatgpt dengan mudah menguruskan sembang
// @name:mt                Chatgpt faċilment jimmaniġġja chats
// @name:my                chatgpt အလွယ်တကူ chats ကိုစီမံခန့်ခွဲ
// @name:nb                Chatgpt klarer enkelt chatter
// @name:ne                च्याट गर्न सजीलो CHTST CHEST
// @name:nl                Chatgpt beheren eenvoudig chats
// @name:nr                Fala /Suma Susa .
// @name:ny                ChatGTT SART TRAMISH
// @name:oc                ChatGPT gestionar facilmente los chats .
// @name:om                Chatgpt Chaat salphaatti bulchuu .
// @name:or                ଚାଟ୍ ଟୁଟି ସହଜରେ ଚଟାଣ ପରିଚାଳନା କରନ୍ତୁ |
// @name:os                ChatGPT æнцонæй къухдариуæг кæны чатæн
// @name:pa                ਚੱਟਾਨਾਂ ਨੂੰ ਆਸਾਨੀ ਨਾਲ ਪ੍ਰਬੰਧਿਤ ਕਰੋ
// @name:pl                Chatgpt łatwo zarządzaj czatami
// @name:ps                د چیټکوټ په اسانۍ سره چاټونه اداره کوي
// @name:pt                Chatgpt gerencia facilmente bate -papos
// @name:pt-BR             Chatgpt gerencia facilmente bate -papos
// @name:pt-PT             Chatgpt gerencia facilmente bate -papos
// @name:qu                chatgpt fácilmente manejar chats .
// @name:rn                ChatGPT Gucungera neza ubutumwa
// @name:ro                Chatgpt gestionează cu ușurință chaturile
// @name:ru                Chatgpt легко управлять чатами
// @name:rw                Ikiganiro Byoroshye Gucunga Ibiganiro
// @name:sa                चॅट्जीपीटी सहजतया गपशपं प्रबन्धयन्तु।
// @name:sd                چٽپٽ آسانيء سان چٽ کي منظم ڪري ٿو
// @name:se                ChatGPT álkit hálddašit ságastallamiid
// @name:sg                ChatGPT Esily ti sara lisoro na azo .
// @name:sh                ЦхатГпт Лако управљајте четовима
// @name:si                චැට් පහසුවෙන් සංදර්ශන කළමනාකරණය කරන්න
// @name:sk                Chatgpt ľahko spravovať rozhovory
// @name:sl                Chatgpt enostavno upravljati klepete
// @name:sm                Talatalanoaga faigofie ona puleaina talatalanoaga
// @name:sn                Chatgpt inogadzirisa nyore chats
// @name:so                CHATGPTPTPTPTPTPTPTPT SITE waxay maamushaa sheekaysiga
// @name:sq                Chatgpt menaxhoni me lehtësi bisedat
// @name:sr                ЦхатГпт Лако управљајте четовима
// @name:ss                I-ChatGPT ilawula kahle tingcoco
// @name:st                Chatgpt Hantle habonolo
// @name:su                ChatGPS gampang ngatur chats
// @name:sv                Chatgpt hanterar enkelt chattar
// @name:sw                Chatgpt kusimamia kwa urahisi mazungumzo
// @name:ta                அரட்டைகளை எளிதில் நிர்வகிக்கவும்
// @name:te                చాట్‌గ్ప్ట్ చాట్‌లను సులభంగా నిర్వహించండి
// @name:tg                Чатчпппппппппсро идора кунед
// @name:th                CHATGPT จัดการแชทได้อย่างง่ายดาย
// @name:ti                CHATGPT ንታት ብቐሊሉ የመሓድር
// @name:tk                ChatGPton sygyrlary aňsatlyk bilen dolandyryň
// @name:tl                Ang chatgpt ay madaling pamahalaan ang mga chat
// @name:tn                ChatGPT Go laola dipuisano tse di bonolo
// @name:to                ChatGPT Pule’i Faingofua ’a e ngaahi talanoa .
// @name:tr                Chatgpt sohbetleri kolayca yönetin
// @name:ts                Chatgpt hi ku olova lawula ti-chat .
// @name:tt                Чатгипт чатлар белән идарә итә
// @name:tw                ChatGPT yɛ mmerɛw sɛ wobɛhwɛ nkɔmmɔbɔ so .
// @name:ty                Te faatere nei o ChatGPT i te mau aparauraa
// @name:ug                Chatgpt ئاسانلا چاتاقنى باشقۇرىدۇ
// @name:uk                Чатгпт легко керувати чатами
// @name:ur                چیٹ آسانی سے چیٹس کا انتظام کرتے ہیں
// @name:uz                Chatgpt Kamchiliklarni osongina boshqaradi
// @name:ve                ChatGPT ni lavhelese nga hu leluwaho nyambedzano
// @name:vi                Chatgpt dễ dàng quản lý các cuộc trò chuyện
// @name:wo                ChatGPT
// @name:xh                I-CHATGPPT ilawula ngokulula iincoko
// @name:yi                טשאַטגפּט לייכט פירן טשאַץ
// @name:yo                Lightig wa ni rọọrun ṣakoso awọn ibaraẹnisọrọ
// @name:zh                ChatGPT 轻松管理聊天
// @name:zh-CN             ChatGPT 轻松管理聊天
// @name:zh-HK             ChatGPT 輕鬆管理聊天
// @name:zh-MO             ChatGPT 輕鬆管理聊天
// @name:zh-MY             ChatGPT 轻松管理聊天
// @name:zh-SG             ChatGPT 轻松管理聊天
// @name:zh-TW             ChatGPT 輕鬆管理聊天
// @name:zu                I-Chatgpt ukuphatha izingxoxo kalula
// @name:es-419            Chatgpt administrar fácilmente los chats
// @description            Search for chats, filter them, quickly/bulk delete them.
// @description:aa         walal, maydaddaarat walala, sissik/batch baysiyyih walala.
// @description:ab         Аԥшааратә чат, афильтр аицәажәара, аццакыра/абатч аныхратә чат.
// @description:af         Soek chat, filter chat, vinnige/groep delete chat.
// @description:ak         Hwehwɛ nkɔmmɔbɔ, filter nkɔmmɔbɔ, fast/batch Popa nkɔmmɔbɔ.
// @description:am         ፍለጋ ውይይት, ማጣሪያ ውይይት, ፈጣን / የቡድን ሰርዝ
// @description:ar         بحث الدردشة ، دردشة التصفية ، الدردشة السريعة/الدُفعة.
// @description:as         Search Chat, ফিল্টাৰ চেট, দ্ৰুত/বেচ মচি পেলাওক চেট।
// @description:av         Поиск чат, фильтр чат, быстро/парти делеат чат.
// @description:ay         Chat, Filtrar Chat, Fast/Batch Chat chat.
// @description:az         Axtarış sohbeti, filtr chat, sürətli / toplu silmək söhbət.
// @description:ba         Эҙләү чат, фильтр чат, тиҙ/партия юйыу чат.
// @description:be         Шукайце чат, фільтр -чат, хуткі/партыйны выдаленне чата.
// @description:bg         Чат за търсене, чат за филтриране, бърз/партиден изтриване чат.
// @description:bh         खोज चैट, फिल्टर चैट, फास्ट/बैच हटाईं चैट।
// @description:bm         Search chat, filter chat, teliya/batch delete chat.
// @description:bn         চ্যাট অনুসন্ধান করুন, ফিল্টার চ্যাট, দ্রুত/ব্যাচ মুছুন চ্যাট।
// @description:bo         འཚོལ་ཞིབ་ཁ་བརྡ་དང་། ཚགས་རླུང་ཁ་བརྡ། མགྱོགས་པོ། བསུབ་པའི་ཁ་བརྡ།
// @description:br         Klask flapañ, flapañ silañ, flapañ buan/batch dilemel.
// @description:bs         Pretražite chat, filter chat, brza / serija Delete Chat.
// @description:ca         Cerqueu xat, xat de filtres, xat de suprimir ràpid/lot.
// @description:ce         Лехамаш чат, фильтр чат, сиха/батч делете чат.
// @description:ceb        Pagpangita Chat, Filter Chat, Fast / Batch Delete Chat.
// @description:ch         Manma’å’ñao i chat, ya filter, båba/batch.
// @description:ckb        گەڕان بەدوای چات، چاتی فلتەر، خێرا/وەجبەیی بسڕەوە چات.
// @description:co         A ricerca di u chat, filtru chat, veloce / batch eliminate u chat.
// @description:cs         Hledejte chat, chat filtru, rychlý/dávkový chat.
// @description:cv         Шырав чат, фильтр чат, хăвăрт/пайчĕн делете чат.
// @description:cy         Chwilio sgwrs, sgwrs hidlo, sgwrsio cyflym/swp Dileu sgwrs.
// @description:da         Søgchat, filterchat, hurtig/batch slet chat.
// @description:de         Suchen Sie Chat, Filter -Chat, Schnell/Stapel -Chat löschen.
// @description:dv         ޗެޓް، ފިލްޓަރ ޗެޓް، ފަސްޓް/ބެޗް ޑިލީޓް ޗެޓް.
// @description:dz         འཚོལ་ཞིབ་ཁ་སླབ་ ཚགས་མ་ཁ་སླབ་ མགྱོགས་དྲགས་/བེཆ་ བཏོན་གཏང་བའི་ཁ་སླབ་།
// @description:ee         Search chat, filter chat, fast/batch delete chat.
// @description:el         Αναζήτηση συνομιλίας, συνομιλία φίλτρου, συνομιλία γρήγορης/παρτίδας.
// @description:en         Search chat, filter chat, fast/batch delete chat.
// @description:en-GB      Search chat, filter chat, fast/batch delete chat.
// @description:eo         Serĉu babilejon, filtran babilejon, Rapida/Batch Forigi Babilejon.
// @description:es         Buscar chat, filtrar chat, fast/lotes eliminar chat.
// @description:es-419     Buscar chat, filtrar chat, fast/lotes eliminar chat.
// @description:et         Otsige vestlust, filtreerige vestlus, kiire/partii kustuta vestlus.
// @description:eu         Bilatu txat, iragazi txat, azkarra / sorta berriketan.
// @description:fa         چت را جستجو کنید ، گپ فیلتر ، چت سریع/دسته ای را حذف کنید.
// @description:ff         Yiylo yeewtere, yeewtere filtirde, yeewtere momtunde yaawnde/batch.
// @description:fi         Hakukeskustelu, suodatin chat, nopea/eräpoisto chat.
// @description:fil        Paghahanap chat, filter chat, mabilis/batch tanggalin ang chat.
// @description:fj         Vakasaqarai veisau, totolo, totolo/bati deleti.
// @description:fo         Leita kjatt, filtur prát, fast/bólkur strika kjak.
// @description:fr         Chat de recherche, chat filtre, chat de suppression rapide / lot.
// @description:fr-CA      Chat de recherche, chat filtre, chat de suppression rapide / lot.
// @description:fy         Sykje Chat, Filter Chat, Fast / Batch / Batch wiskje Chat.
// @description:ga         Cuardaigh comhrá, comhrá scagaire, tapa/baisc scrios comhrá.
// @description:gd         Rannsaich cat, bruidheach cabadaich, luath / baidse Cuir às do chat.
// @description:gl         Buscar chat, chat de filtro, chat de eliminación rápida/lote.
// @description:gn         Eheka chat, filtro chat, pya’e/batch Embogue chat.
// @description:gsw-berne  Search chat, filter chat, fast/batch delete chat.
// @description:gu         ચેટ, ફિલ્ટર ચેટ, ફાસ્ટ/બેચ કા delete ી નાખો ચેટ.
// @description:gv         Ct chat, filter chat, s’fast/batch chat.
// @description:ha         Tattaunawa, tace taɗi, Fast / Batch Share Chat.
// @description:he         חיפוש בצ’אט, סנן צ’אט, מהיר/אצווה מחק צ’אט.
// @description:hi         खोज चैट, फ़िल्टर चैट, फास्ट/बैच डिलीट चैट।
// @description:hmn        Tshawb Tham, Lim Sib Tham, ceev / Batch Delete kev sib tham.
// @description:hr         Pretražite chat, filter chat, brz/batch brisanje chata.
// @description:ht         Search chat, filtre chat, vit/pakèt efase chat.
// @description:hu         Keressen csevegést, szűrő csevegést, gyors/tétel törlés csevegést.
// @description:hy         Որոնում Զրուցարան, Զրուցարան, Fast / Batch Delete նջել Զրուցարան.
// @description:id         Cari Obrolan, Obrolan Filter, Obrolan Hapus Batch/Batch.
// @description:ig         Nchọta nkata, Nyocha Nkata, ngwa ngwa / bch Hichapụ nkata.
// @description:is         Leitaðu að spjalli, síu spjalli, hratt/lotu Eyða spjalli.
// @description:it         Cerca chat, chat filtrante, elimina veloce/batch.
// @description:iu         ᕿᓂᕐᓗᑎᑦ ᐅᖃᖃᑎᒌᒍᑎᒥᒃ, ᓴᓗᒻᒪᖅᓴᐃᔾᔪᑎᒥᒃ ᐅᖃᖃᑎᒌᒍᑎᒥᒃ, ᓱᒃᑲᔪᒥᒃ/ᑲᑎᙵᔪᒥᒃ ᐲᖅᓯᓗᑎᑦ ᐅᖃᖃᑎᒌᒍᑎᒥᒃ.
// @description:ja         チャット、フィルターチャット、高速/バッチ削除チャットを検索します。
// @description:jv         Nggoleki Goleki, ngobrol Filter, cepet / batch mbusak.
// @description:ka         მოძებნეთ ჩეთი, ფილტრის ჩეთი, სწრაფი/სურათების წაშლა ჩეთი.
// @description:kg         Sosa masolo, chat ya filtre, chat ya nswalu/ya batch.
// @description:kk         Чат, чат, Сүзгі, жылдам / буманы іздеу Чатты жою.
// @description:kl         Ujaasineq, filter-chat, sukkasuumik/batch-imik delete-mik chat-imik ujarlerneq.
// @description:km         ស្វែងរកការស្វែងរកតម្រងជជែកកំសាន្តរហ័ស / បាច់ជជែកជជែកជជែកកំសាន្ត។
// @description:kn         ಚಾಟ್ ಹುಡುಕಿ, ಫಿಲ್ಟರ್ ಚಾಟ್, ಫಾಸ್ಟ್/ಬ್ಯಾಚ್ ಅಳಿಸು ಚಾಟ್.
// @description:ko         검색 채팅, 필터 채팅, 빠른/배치 삭제 채팅.
// @description:kr         Zande kulashiye, zande filterbe, duwaro/batch delete.
// @description:ku         Chat lêgerîn, chat filter, Fast / Batch Chat.
// @description:kv         Корсьны чат, фильтр чат, пост/партия удалить чат.
// @description:ky         Чат издөө, чыпкалоочу чат, тез / партиялык чат.
// @description:la         Search Chat, filter Chat, Fast / Batch Delete Chat.
// @description:lb         Sich Chat, Filter Chat, Fast / Batch läschen Chat.
// @description:lg         Noonya emboozi, sengejja emboozi, okusangula okusazaamu mu bwangu/okusangula.
// @description:ln         Boluka chat, filtrer chat, Fast/batch effacer chat.
// @description:lo         ຄົ້ນຫາສົນທະນາ, ການສົນທະນາການກັ່ນຕອງ, Delete Fast / Batch Delete Chat.
// @description:lt         Paieškos pokalbis, filtrų pokalbis, greitas/partijos ištrynimo pokalbis.
// @description:lv         Meklējiet tērzēšanu, filtru tērzēšanu, ātru/partijas dzēšanas tērzēšanu.
// @description:mg         Fikarohana Chat, Filter Chat, Fast / Batch Delete Chat.
// @description:mh         Chat in pukōt, kōnono in filter, kōnono eo em̧ōkaj an m̧ōkaj.
// @description:mi         Rapua te korero, tātari, tere / tere te korero korero korero.
// @description:mk         Разговор за пребарување, разговор за филтрирање, брз/разделување на серија.
// @description:ml         തിരയൽ, ചാറ്റ് ഫിൽട്ടർ ചെയ്യുക, വേഗത്തിൽ / ബാച്ച് ഇല്ലാതാക്കുക ചാറ്റ് ചെയ്യുക.
// @description:mn         Чат, шүүлтүүр чат, хурдан / багц устгах чатыг устгах.
// @description:mo         Chat de căutare, chat de filtrare, chat de ștergere rapidă/lot.
// @description:mr         चॅट, फिल्टर चॅट, वेगवान/बॅच चॅट हटवा.
// @description:ms         CHAT Chat, sembang penapis, cepat/batch padam sembang.
// @description:mt         Fittex chat, chat tal-filtru, fast / lott tħassar chat.
// @description:my         Search Chat, Filter Chat, Filter Chat, Fast / Batch Delete Chat ။
// @description:nb         Søk chat, filter chat, rask/batch slett chat.
// @description:ne         खोजी च्याट, फिल्टर च्याट, द्रुत / ब्याच च्याट लगाउनुहोस्।
// @description:nl         Zoek chat, filterchat, snel/batch verwijderen chat.
// @description:nr         I-in ts, iso, i-orss, i-or.
// @description:ny         Kusaka macheza, zosefera, mwachangu / batch chochotsa macheza.
// @description:oc         Cerca chat, filtre chat, chat de supression rapida/lots.
// @description:om         Chaat barbaadi, filter chat, fast/batch delete chat.
// @description:or         ଚାଟ୍, ଫିଲ୍ଟର ଚାଟ୍, ଫାଷ୍ଟ / ବ୍ୟାଚ୍ ଡିଲିଟ୍ ଚାଟ୍ ଡିଲିଟ୍ କରନ୍ତୁ |
// @description:os         Агурæн чат, фильтр чат, тагъд/партион удалить чат.
// @description:pa         ਖੋਜ ਚੈਟ, ਫਿਲਟਰ ਚੈਟ, ਤੇਜ਼ / ਬੈਚ ਮਿਟਾਓ ਗੱਲਬਾਤ.
// @description:pl         Wyszukaj czat, czat filtrujący, szybki/partii usuń czat.
// @description:ps         د چیټ چیټ، فلټر چیټ، ګړندي / بیچ حذف کول.
// @description:pt         Pesquise bate -papo, bate -papo de filtro, bate -papo de exclusão rápida/lote.
// @description:pt-BR      Pesquise bate -papo, bate -papo de filtro, bate -papo de exclusão rápida/lote.
// @description:pt-PT      Pesquise bate -papo, bate -papo de filtro, bate -papo de exclusão rápida/lote.
// @description:qu         Buscar chat, filtro chat, rápido/lote borrar chat.
// @description:rn         Rondera ibiganiro, ucungure, wihute/ushireho ubutumwa.
// @description:ro         Chat de căutare, chat de filtrare, chat de ștergere rapidă/lot.
// @description:ru         Поиск чата, фильтр чат, быстрый/партия удалить чат.
// @description:rw         Shakisha Ikiganiro, Guyunguruzi Ikiganiro, Byihuta / Bitch Gusiba Ikiganiro.
// @description:sa         सर्च गपशप, फ़िल्टर चैट, फास्ट/बैच विलोप करें गपशप।
// @description:sd         ڳولا چيٽ، فلٽر چيٽ، فاسٽ / بيچ خارج ڪريو چيٽ.
// @description:se         Ohcat chat, filterchat, fast/batch slette chat.
// @description:sg         Recherche chat, filtre chat, fast/batch chat.
// @description:sh         Тражи Цхат, Филтер Цхат, Фаст / Батцх Делете Цхат.
// @description:si         සෙවුම් චැට්, පෙරහන් චැට්, වේගවත් / කණ්ඩායම මකන්න කතාබස්.
// @description:sk         Vyhľadajte chat, chat filtra, rýchly/dávkový odstránený chat.
// @description:sl         Poiščite klepet, filtrirajte klepet, hitri/serija brisanje klepeta.
// @description:sm         Saili talatalanoaga, faʻamama talanoaga, vave / botch tape le talatalanoaga.
// @description:sn         Tsvaga Chat, Firita Chat, Fast / Batch Delete Chat.
// @description:so         Raadinta Wadahadalka, Xirfadlaha Fund, Soonka / Dufcaddii tirtir sheekada.
// @description:sq         Biseda në kërkim, biseda filtri, Fast/Batch Fshi bisedën.
// @description:sr         Тражи Цхат, Филтер Цхат, Фаст / Батцх Делете Цхат.
// @description:ss         Sesha ingcoco, chat yekuhlunga, kushesha/ batch desice chat.
// @description:st         Batla Chat, Chatter Chat, Faces / Batch Delet Chat.
// @description:su         Milarian chat, nyaring panipuan, gancang / tumpak cup.
// @description:sv         Sökchatt, filterchatt, snabb/batch radera chatt.
// @description:sw         Tafuta gumzo, gumzo la kichujio, mazungumzo ya haraka/batch.
// @description:ta         தேடு அரட்டை, வடிகட்டி அரட்டை, வேகமான/தொகுதி நீக்கு அரட்டை.
// @description:te         శోధన చాట్, ఫిల్టర్ చాట్, ఫాస్ట్/బ్యాచ్ తొలగించు చాట్.
// @description:tg         Чат, филтри филтр, чат зуд / Bitche нест кунед.
// @description:th         ค้นหาแชทตัวกรองแชท Fast/Batch ลบแชท
// @description:ti         ዕላል፡ ፍልተር ቻት፡ ቅልጡፍ/ባች ምድምሳስ ቻት ድለ።
// @description:tk         Söhbet söhbetdeşligi, süzgüç söhbet, çalt / partiýa söhbetdeşligi pozuň.
// @description:tl         Paghahanap chat, filter chat, mabilis/batch tanggalin ang chat.
// @description:tn         Batla motlotlo, sefa puisano, ka potlako / batch hlakola puisano.
// @description:to         Fekumi ki he talanoa, talanoa filter, talanoa delete vave/batch.
// @description:tr         Sohbet, filtre sohbeti, hızlı/toplu Sil sohbet arayın.
// @description:ts         Ku lavisisa chat, filter chat, ku hatlisa/ku batch Susa chat.
// @description:tt         Чат, фильтр чат, тиз / партия чатны бетерегез.
// @description:tw         Hwehwɛ nkɔmmɔbɔ, filter nkɔmmɔbɔ, fast/batch Popa nkɔmmɔbɔ.
// @description:ty         A imi i te chat, te chat, te chat vitiviti/batch.
// @description:ug         ئىزدەش پاراڭ, سۈزگۈچ پاراڭ, تېز / تۈركۈملەش پاراڭ.
// @description:uk         Шукайте чат, чат фільтр, швидкий/пакетний вилучення чату.
// @description:ur         سرچ چیٹ ، فلٹر چیٹ ، فاسٹ/بیچ کو حذف کریں چیٹ۔
// @description:uz         Chatni qidirish, Filtr chat, tez / partiya chatni o’chirib tashlang.
// @description:ve         U ṱoḓa nyambedzano, nyambedzano ya u sefa, nyambedzano ya u ṱavhanya/batch ya u phumula.
// @description:vi         Chat tìm kiếm, trò chuyện lọc, trò chuyện xóa nhanh/hàng loạt.
// @description:wo         Seetlu chat, segg, chat de filtre, gaaw/batch chat.
// @description:xh         Incoko yokukhangela, incoko yecebo lokucoca, ngokukhawuleza / ibhetch cima incoko.
// @description:yi         זוכן טשאַט, פילטער שמועסן, שנעל / פּעקל ויסמעקן שמועסן.
// @description:yo         Wiwọle Wiwa, Iyipada àlẹmọ, Yara / Itọsọna Paare Paare Ret.
// @description:zh         搜索聊天、过滤聊天、快速/批量删除聊天。
// @description:zh-CN      搜索聊天、过滤聊天、快速/批量删除聊天。
// @description:zh-HK      搜索聊天、過濾聊天、快速/批量刪除聊天。
// @description:zh-MO      搜索聊天、過濾聊天、快速/批量刪除聊天。
// @description:zh-MY      搜索聊天、过滤聊天、快速/批量删除聊天。
// @description:zh-SG      搜索聊天、过滤聊天、快速/批量删除聊天。
// @description:zh-TW      搜索聊天、過濾聊天、快速/批量刪除聊天。
// @description:zu         Ukucinga Chat, Chat Chat Chat, Fast / Batch Delete Chat.
// @author                 mysy00
// @namespace              https://github.com/mysy00/userscripts
// @supportURL             https://github.com/mysy00/userscripts/issues
// @homepageURL            https://github.com/mysy00/userscripts
// @homepage               https://github.com/mysy00/userscripts
// @license                MIT
// @match                  https://chatgpt.com/*
// @icon                   https://raw.githubusercontent.com/ChinaGodMan/UserScriptsHistory/main/scriptsIcon/chatgpt-plus.png
// @compatible             chrome
// @compatible             firefox
// @compatible             edge
// @compatible             opera
// @compatible             safari
// @compatible             kiwi
// @compatible             qq
// @compatible             via
// @compatible             brave
// @version                2025.6.3.1
// @created                2025-06-03 11:26:11
// ==/UserScript==

/**
 * File: chatgpt-easy-management.user.js
 * Project: UserScripts
 * File Created: 2025/06/03,Tuesday 11:26:11
 * Author: mysy00
 * -----
 * Last Modified: 2025/06/03,Tuesday 11:34:19
 * Modified By: 人民的勤务员@ChinaGodMan ([email protected])
 * -----
 * License: MIT License
 * Copyright © 2024 - 2025 ChinaGodMan,Inc
 */

(function () {
    'use strict'

    const API = 'https://chatgpt.com/backend-api'
    const MAX_MSG_LEN = 100
    const RETRIES = 3
    const RETRY_DELAY = 300
    const PAGE_SIZE = 50

    const wait = ms => new Promise(r => setTimeout(r, ms))
    const fmt = ts => {
        const d = new Date(ts * 1000)
        const date = d.toLocaleDateString(undefined, { year: 'numeric', month: 'long', day: 'numeric' })
        const time = d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })
        return `${date} ${time}`
    }
    const trimStr = s =>
        typeof s === 'string' && s.length > MAX_MSG_LEN ? s.slice(0, MAX_MSG_LEN) + '…' : s
    const extractText = part => {
        // If it’s a plain string, return it
        if (typeof part === 'string') {
            return part
        }
        // If it’s an object with an explicit type
        if (part && typeof part === 'object') {
            // ChatGPT image attachments often come as { type: 'image_url', url: '…' }
            if (part.content_type === 'image_asset_pointer') {
                return '🖼️'
            }
            // Some variants may include a url/src field even without type
            if (part.url || part.src) {
                return '[image]'
            }
        }
        // Otherwise we don’t know how to render it
        return '[unknown]'
    }

    async function getToken() {
        const res = await fetch('https://chatgpt.com/api/auth/session', { credentials: 'include' })
        const j = await res.json()
        if (!j.accessToken) throw new Error('No auth token')
        return j.accessToken
    }

    async function fetchPage(offset = 0, limit = PAGE_SIZE) {
        const t = await getToken()
        const res = await fetch(`${API}/conversations?offset=${offset}&limit=${limit}`, {
            headers: { Authorization: `Bearer ${t}` }
        })
        if (!res.ok) throw new Error(`Summaries fetch failed ${res.status}`)
        return res.json()
    }

    async function fetchDetailsWithRetry(id) {
        for (let i = 0; i < RETRIES; i++) {
            try {
                const t = await getToken()
                const res = await fetch(`${API}/conversation/${id}`, {
                    headers: { Authorization: `Bearer ${t}` }
                })
                if (!res.ok) throw new Error()
                return await res.json()
            } catch {
                await wait(RETRY_DELAY)
            }
        }
        throw new Error(`Failed to load details for ${id}`)
    }

    async function deleteChat(id) {
        const t = await getToken()
        const res = await fetch(`${API}/conversation/${id}`, {
            method: 'PATCH',
            headers: {
                Authorization: `Bearer ${t}`,
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({ is_visible: false })
        })
        if (!res.ok) throw new Error(`Delete failed ${res.status}`)
        await wait(200)
    }

    function injectStyles() {
        if (document.getElementById('bd-styles')) return
        const st = document.createElement('style')
        st.id = 'bd-styles'
        st.textContent = `
        /* Overlay & modal shell */
        #bd-overlay { background: rgba(0,0,0,0.5) !important; }
        #bd-overlay.hidden { display: none !important; }
        #bd-modal {
          background: var(--sidebar-surface-primary);
          color: var(--token-text-primary);
          border-radius: 16px;
          box-shadow: 0 20px 60px rgba(0,0,0,0.45);
          display: flex; flex-direction: column;
          max-width: 800px; width: 90%; max-height: 85vh; overflow: hidden;
          transform: translateY(20px); opacity: 0;
          animation: fadeInUp 0.3s ease-out forwards;
          font-family: inherit;
        }
        @keyframes fadeInUp { to { transform: translateY(0); opacity: 1; } }
        /* Header */
        #bd-modal > .header {
          background: var(--sidebar-surface-tertiary);
          padding: 16px 24px;
          display: flex; align-items: center;
          border-bottom: 1px solid var(--border-light);
          gap: 12px;
        }
        #bd-modal .header h2 { margin: 0; flex: 1; font-size: 18px; }
        #bd-modal .header button {
          background: var(--sidebar-surface-secondary);
          color: var(--token-text-primary);
          border: none; border-radius: 6px;
          font-size: 14px; font-weight: 500;
          padding: 6px 14px; cursor: pointer;
        }
        #bd-modal .header button:hover { background: var(--sidebar-surface-hover); }
        #bd-modal .header input[type="number"] {
          width: 60px; padding: 6px 8px; margin-left: 8px;
          border: 1px solid var(--border-light);
          border-radius: 6px;
          background: var(--sidebar-surface-secondary);
          color: var(--token-text-primary);
        }
        /* Status */
        #bd-status {
          padding: 8px 24px; font-size: 14px; color: var(--token-text-secondary);
        }
        /* Chat rows */
        #bd-modal .chat-row {
          padding: 16px 20px; border-bottom: 1px solid var(--border-light);
          display: flex; flex-direction: column; gap: 6px;
        }
        #bd-modal .chat-row:hover { background: var(--menu-item-active); }
        #bd-modal .chat-row.selected { background: var(--interactive-bg-secondary-press) !important; }
        .chat-row .top { display: flex; align-items: center; }
        .chat-row .title { margin-left: 8px; font-weight: 600; font-size: 15px; }
        .chat-row .meta  { font-size: 13px; }
        .chat-row .msg   { font-size: 14px; line-height: 1.4; word-break: break-word; }
        /* Footer */
        #bd-modal > .footer {
          background: var(--sidebar-surface-tertiary);
          padding: 16px 24px;
          display: flex; align-items: center;
          border-top: 1px solid var(--border-light);
          justify-content: flex-end; gap: 12px;
        }
        #bd-modal .footer button {
          background: var(--sidebar-surface-secondary);
          color: var(--token-text-primary);
          border: none; border-radius: 6px;
          font-size: 14px; font-weight: 500;
          padding: 6px 14px; cursor: pointer;
        }
        #bd-modal .footer button:first-child {
          background: var(--sidebar-surface-tertiary);
          border: 1px solid var(--border-light);
        }
        #bd-modal .footer button:last-child {
          background: var(--danger-action);
          color: var(--button-text);
        }
        #bd-modal .footer button:hover { background: var(--sidebar-surface-hover); }
      `
        document.head.appendChild(st)
    }

    function renderChatCard(convo, updateCount) {
        const row = document.createElement('div')
        row.className = 'chat-row'
        row.dataset.id = convo.id

        const top = document.createElement('div'); top.className = 'top'
        const cb = document.createElement('input'); cb.type = 'checkbox'; cb.dataset.id = convo.id
        const tit = document.createElement('div'); tit.className = 'title'; tit.textContent = convo.title || '(no title)'
        top.append(cb, tit)
        row.append(top)

        const meta = document.createElement('div'); meta.className = 'meta'; row.append(meta)
        const m1 = document.createElement('div'); m1.className = 'msg'; row.append(m1)
        const m2 = document.createElement('div'); m2.className = 'msg'; row.append(m2)

        function updateSelection() {
            row.classList.toggle('selected', cb.checked)
            updateCount()
        }

        row.addEventListener('click', e => {
            if (e.target.tagName !== 'INPUT') cb.checked = !cb.checked
            updateSelection()
        })
        cb.addEventListener('change', e => { updateSelection(); e.stopPropagation() })

        row.update = ({ create_time, update_time, first, last }) => {
            row.dataset.updateTs = update_time
            meta.innerHTML = `<strong>Created:</strong> ${fmt(create_time)} — <strong>Updated:</strong> ${fmt(update_time)}`
            m1.innerHTML = `<strong>First:</strong> ${first}`
            m2.innerHTML = `<strong>Last:</strong> ${last}`
        }

        return row
    }

    function openModal() {
        // If there's already an overlay, remove it entirely so state resets
        const existing = document.getElementById('bd-overlay')
        if (existing) existing.remove()

        injectStyles()

        const overlay = document.createElement('div')
        overlay.id = 'bd-overlay'
        Object.assign(overlay.style, { position: 'fixed', top: 0, left: 0, right: 0, bottom: 0, display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: 9999 })

        function hideAndRemove() { overlay.remove() }

        overlay.addEventListener('click', e => { if (e.target === overlay) hideAndRemove() })
        window.addEventListener('keydown', function esc(e) { if (e.key === 'Escape') { hideAndRemove(); window.removeEventListener('keydown', esc) } })

        const modal = document.createElement('div'); modal.id = 'bd-modal'
        const statusEl = document.createElement('div'); statusEl.id = 'bd-status'
        const list = document.createElement('div'); Object.assign(list.style, { flex: '1 1 auto', overflowY: 'auto' })

        // Header
        const header = document.createElement('div'); header.className = 'header'
        const h2 = document.createElement('h2'); h2.textContent = 'Bulk Delete Chats'
        const sortBtn = document.createElement('button'); sortBtn.textContent = 'Sort by Updated'
        const ageInput = document.createElement('input'); ageInput.type = 'number'; ageInput.min = '0'; ageInput.placeholder = 'Days'
        const listOldBtn = document.createElement('button'); listOldBtn.textContent = 'List older'
        const refreshBtn = document.createElement('button'); refreshBtn.textContent = 'Reload'
        const closeBtn = document.createElement('button'); closeBtn.textContent = '✕'
        header.append(h2, sortBtn, ageInput, listOldBtn, refreshBtn, closeBtn)

        // Footer
        const footer = document.createElement('div'); footer.className = 'footer'
        const cancelBtn = document.createElement('button'); cancelBtn.textContent = 'Cancel'
        const delBtn = document.createElement('button'); delBtn.textContent = 'Delete Selected'
        footer.append(cancelBtn, delBtn)

        modal.append(header, statusEl, list, footer)
        overlay.append(modal)
        document.body.append(overlay)

        let totalChats = 0, offset = 0, loadingMore = false
        const rows = []

        function updateCount() {
            const shown = rows.length
            const sel = list.querySelectorAll('input:checked').length
            statusEl.textContent = `Showing ${shown} of ${totalChats} chats — ${sel} selected`
        }

        const obs = new IntersectionObserver((ents) => {
            ents.forEach(ent => {
                if (!ent.isIntersecting) return
                obs.unobserve(ent.target)
                fetchDetailsWithRetry(ent.target.dataset.id)
                    .then(dt => {
                        const userMsgs = Object.values(dt.mapping || {})
                            .filter(n => n.message?.author?.role === 'user')
                            .map(n => extractText(n.message?.content?.parts?.[0]))
                        let first = trimStr(userMsgs[0] || '—')
                        let last = trimStr(userMsgs.at(-1) || '—')
                        if (first === last) {
                            const asst = Object.values(dt.mapping || {})
                                .filter(n => n.message?.author?.role === 'assistant')
                            if (asst.length) {
                                last = 'Chat: ' + trimStr(extractText(asst.at(-1).message.content.parts?.[0] || ''))
                            }
                        }
                        ent.target.update({ create_time: dt.create_time, update_time: dt.update_time, first, last })
                    })
                    .catch(() => ent.target.update({ create_time: 0, update_time: 0, first: '✖️', last: '✖️' }))
            })
        }, { root: list, threshold: 0.1 })

        async function loadChats() {
            list.innerHTML = ''
            rows.length = 0
            offset = 0
            const page = await fetchPage(0, PAGE_SIZE)
            totalChats = page.total ?? page.total_count ?? page.pagination?.total_count ?? page.pagination?.total ?? page.items.length
            page.items.forEach(c => {
                const row = renderChatCard(c, updateCount)
                list.append(row)
                rows.push(row)
            })
            offset = page.items.length
            updateCount()
            rows.forEach(r => obs.observe(r))
        }

        // initial load
        loadChats().catch(() => statusEl.textContent = 'Failed to load chats.')

        // Refresh handler
        refreshBtn.addEventListener('click', async () => {
            statusEl.textContent = 'Reloading…'
            obs.disconnect()
            try {
                await loadChats()
                statusEl.textContent = 'Reloaded.'
            } catch (err) {
                statusEl.textContent = 'Reload failed.'
                console.error(err)
            }
        })

        // Infinite scroll
        list.addEventListener('scroll', async () => {
            if (loadingMore) return
            if (offset < totalChats && list.scrollTop + list.clientHeight >= list.scrollHeight - 50) {
                loadingMore = true
                const page = await fetchPage(offset, PAGE_SIZE)
                page.items.forEach(c => {
                    const row = renderChatCard(c, updateCount)
                    list.append(row)
                    rows.push(row)
                    obs.observe(row)
                })
                offset += page.items.length
                updateCount()
                loadingMore = false
            }
        })

        // Sort
        sortBtn.addEventListener('click', () => {
            rows
                .sort((a, b) => Number(b.dataset.updateTs) - Number(a.dataset.updateTs))
                .forEach(r => list.append(r))
            updateCount()
        })

        // Filter older
        listOldBtn.addEventListener('click', () => {
            const days = parseInt(ageInput.value, 10)
            if (isNaN(days) || days < 0) {
                statusEl.textContent = 'Enter a valid number of days'
                return
            }
            const threshold = Math.floor(Date.now() / 1000) - days * 86400
            statusEl.textContent = `Filtering chats older than ${days} days…`
            obs.disconnect()
            const filtered = rows.filter(r => Number(r.dataset.updateTs) < threshold)
            list.innerHTML = ''
            filtered.forEach(r => { r.querySelector('input').checked = true; r.classList.add('selected'); list.append(r); obs.observe(r) })
            updateCount()
        })

        // Cancel & close
        cancelBtn.addEventListener('click', hideAndRemove)
        closeBtn.addEventListener('click', hideAndRemove)

        // Delete flow
        delBtn.addEventListener('click', () => {
            const selected = [...list.querySelectorAll('.chat-row.selected')]
            if (!selected.length) {
                statusEl.textContent = 'No chats selected.'
                return
            }

            const confirmPane = document.createElement('div')
            confirmPane.id = 'bd-confirm-pane'
            confirmPane.style = 'flex:1 1 auto;overflow-y:auto;padding:16px'

            const info = document.createElement('div')
            info.textContent = `Confirm deletion of ${selected.length} chat(s). Uncheck any you’d like to keep:`
            info.style = 'margin-bottom:12px;font-weight:500'
            confirmPane.appendChild(info)

            selected.forEach((row, idx) => {
                const id = row.dataset.id
                const title = row.querySelector('.title').textContent
                const label = document.createElement('label')
                label.style = 'display:flex;align-items:center;margin-bottom:8px'
                const cb = document.createElement('input')
                cb.type = 'checkbox'; cb.checked = true; cb.dataset.id = id; cb.style = 'margin-right:8px'
                label.append(cb, document.createTextNode(`${idx + 1}. ${title}`))
                confirmPane.appendChild(label)
            })

            footer.innerHTML = ''
            const backBtn = document.createElement('button'); backBtn.textContent = 'Back'
            const confirmBtn = document.createElement('button')
            confirmBtn.textContent = 'Confirm Delete'
            confirmBtn.style = 'background:var(--danger-action);color:var(--button-text)'
            footer.append(backBtn, confirmBtn)

            list.replaceWith(confirmPane)

            backBtn.addEventListener('click', () => {
                confirmPane.replaceWith(list)
                footer.innerHTML = ''
                footer.append(cancelBtn, delBtn)
                updateCount()
            })

            confirmBtn.addEventListener('click', async () => {
                const toDelete = [...confirmPane.querySelectorAll('input:checked')]
                if (!toDelete.length) {
                    statusEl.textContent = 'Nothing to delete.'
                    return
                }
                let done = 0, failed = 0
                for (const cb of toDelete) {
                    done++
                    statusEl.textContent = `Deleting (${done}/${toDelete.length})…`
                    try { await deleteChat(cb.dataset.id) } catch { failed++ }
                }
                statusEl.textContent = `Deleted ${toDelete.length - failed}, ${failed} failed.`
                // close & remove after a short pause
                setTimeout(hideAndRemove, 1000)
            })
        })
    }

    // Inject main icon & quick-delete buttons
    function injectIcon() {
        const target = document.querySelector('#sidebar-header')
        if (!target || target.querySelector('[data-bulk-delete]')) return

        const link = document.createElement('a')
        link.className = document.querySelectorAll('#sidebar-header > a')[0].className
        link.dataset.bulkDelete = 'true'; link.href = '#'
        link.setAttribute('aria-label', 'Bulk Delete Chats')
        link.setAttribute('role', 'button')
        link.innerHTML = `
        <svg width="24" height="24" fill="currentColor">
          <path d="M9 3v1H4v2h16V4h-5V3H9zm-1 5v12h2V8H8zm4 0v12h2V8h-2z"/>
        </svg>`
        link.addEventListener('click', e => { e.preventDefault(); openModal() })
        target.append(link)
    }

    function injectQuickDeleteButtons() {
        document.querySelectorAll('a[data-discover][href^="/c/"]').forEach(link => {
            if (link.querySelector('.quick-delete-btn')) return
            const convoId = link.getAttribute('href').split('/').pop()
            if (!convoId) return
            const btn = document.createElement('button')
            btn.className = 'quick-delete-btn'
            btn.setAttribute('aria-label', 'Delete conversation')
            btn.style.cssText = 'margin-left:8px;background:transparent;border:none;cursor:pointer;color:var(--token-text-secondary);'
            btn.innerHTML = `<svg width="16" height="16" viewBox="0 0 24 24" fill="none"><path d="M9 3v1H4v2h16V4h-5V3H9zm-1 5v12h2V8H8zm4 0v12h2V8h-2z" fill="currentColor"/></svg>`
            btn.addEventListener('click', async e => {
                e.preventDefault(); e.stopPropagation()
                try { await deleteChat(convoId); link.remove() } catch (err) { console.error('Quick delete failed', err) }
            })
            const trailing = link.querySelector('.text-token-text-tertiary');
            (trailing || link).appendChild(btn)
        })
    }

    const observer = new MutationObserver(() => {
        injectIcon()
        injectQuickDeleteButtons()
    })
    observer.observe(document.body, { childList: true, subtree: true })

    window.addEventListener('load', () => {
        injectIcon()
        injectQuickDeleteButtons()
    })
})()