Greasy Fork

Greasy Fork is available in English.

AlphaXiv 超级增强器

终极工具套装。为 AlphaXiv 助手添加强大的提示词库,并提供在 arXiv 和 AlphaXiv 之间的无缝跳转链接。

当前为 2025-08-03 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         AlphaXiv Supercharger
// @name:zh-CN   AlphaXiv 超级增强器
// @name:ja      AlphaXiv スーパーチャージャー
// @namespace    http://tampermonkey.net/
// @version      12.1
// @description  The ultimate toolkit. Adds a powerful prompt palette to the AlphaXiv assistant AND provides seamless linking between arXiv and AlphaXiv.
// @description:zh-CN  终极工具套装。为 AlphaXiv 助手添加强大的提示词库,并提供在 arXiv 和 AlphaXiv 之间的无缝跳转链接。
// @description:ja     究極のツールキット。AlphaXivアシスタントに強力なプロンプトパレットを追加し、arXivとAlphaXiv間のシームレスなリンクを提供します。
// @author       YName
// @match        https://arxiv.org/abs/*
// @match        https://www.arxiv.org/abs/*
// @match        https://alphaxiv.org/abs/*
// @match        https://www.alphaxiv.org/overview/*
// @grant        GM_addStyle
// @icon         https://alphaxiv.org/icon.ico
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const currentHostname = window.location.hostname;
    const currentPathname = window.location.pathname;

    // ===================================================================
    //  SECTION 1: Code for arXiv.org pages
    //  This part adds the "Go to AlphaXiv" link.
    // ===================================================================
    if (currentHostname.includes('arxiv.org')) {
        const createLinkToAlphaXiv = (name, url) => {
            const link = document.createElement('a');
            link.style.cssText = `display: inline-block; border-left: 2px solid #fff; padding-left: 10px; margin-left: 10px;`;
            link.target = '_blank';
            link.href = url;
            link.textContent = name;
            return link;
        };

        const href = window.location.href;
        const alphaXivEntry = createLinkToAlphaXiv('AlphaXiv', href.replace('arxiv.org', 'alphaxiv.org'));

        const target = document.querySelector('.header-breadcrumbs');
        if (target) {
            target.appendChild(alphaXivEntry);
        }
    }

    // ===================================================================
    //  SECTION 2: Code for AlphaXiv.org pages
    //  This section contains two parts: one for the /abs/ page
    //  and one for the /overview/ page.
    // ===================================================================
    else if (currentHostname.includes('alphaxiv.org')) {

        // --- PART 2A: For /abs/ pages (Back to ArXiv button) ---
        if (currentPathname.startsWith('/abs/')) {
            const createLinkToArXiv = (name, url) => {
                const newButton = document.createElement('a');
                newButton.href = url;
                newButton.target = '_blank';
                newButton.className = 'group flex h-[30px] items-center justify-between rounded-lg border px-2 text-sm transition-all border-gray-600 bg-white text-gray-600 hover:bg-gray-100';
                const buttonText = document.createElement('span');
                buttonText.textContent = name;
                buttonText.className = 'font-medium text-gray-600';
                newButton.appendChild(buttonText);
                return newButton;
            };

            const observer = new MutationObserver(() => {
                const targetContainer = document.querySelector(".flex.items-center.space-x-2");
                if (targetContainer && !targetContainer.querySelector('a[href*="arxiv.org"]')) {
                    const href = window.location.href;
                    const arXivEntry = createLinkToArXiv('Back to ArXiv', href.replace('alphaxiv.org', 'arxiv.org'));
                    targetContainer.appendChild(arXivEntry);
                }
            });

            observer.observe(document.body, { childList: true, subtree: true });
        }

        // --- PART 2B: For /overview/ pages (Our Prompt Palette) ---
        if (currentPathname.startsWith('/overview/')) {
            const MODULES = [
                { title: '① 快速通读', prompts: [
                    { id: 'quick-chatgpt', type: 'ChatGPT', label: '结构化总结', value: `请帮我概括这篇论文的核心结构,包括:\n- 标题与作者单位\n- 背景与研究动机\n- 研究问题或假设\n- 方法概述(含模型/算法名称)\n- 实验与结果关键数据\n- 创新点与贡献总结(3条以内)\n- 局限与未来工作\n请使用简洁清晰的分点格式。` },
                    { id: 'quick-claude', type: 'Claude', label: '导师式讲解', value: `假设你是一位讲解论文的导师,请用通俗的语言向本科生解释这篇论文在做什么。不要逐段总结,而是围绕“这项研究想解决什么问题?用了什么办法?发现了什么?”三个问题来展开,让读者在三分钟内明白这篇论文的价值。` },
                    { id: 'gemini-1-nav', type: 'Gemini', label: '摘要重构', value: `请快速通读以下论文内容,为我输出一份结构清晰的导航摘要笔记,包括:\n\n- 研究主题与目标\n- 作者提出的主要方法或模型\n- 数据来源与实验设置(简要)\n- 论文的主要结论与贡献\n\n请使用分段 Markdown 格式输出,每段标题清晰,适合在 Notion 或 Obsidian 中作为阅读导图使用。` }
                ]},
                { title: '② 方法详解', prompts: [
                    { id: 'method-chatgpt', type: 'ChatGPT', label: '逐步解析', value: `请对论文中的方法部分进行逐步解析,要求包括:\n1. 每个模块的输入、输出和作用;\n2. 使用了哪些关键技术或机制(如 Transformer、GNN 等);\n3. 如涉及数学公式,请简要通俗化解释;\n4. 用结构图或流程图式样展示整体框架。` },
                    { id: 'method-claude', type: 'Claude', label: '故事化解读', value: `这篇论文的方法部分信息量很大,我想通过“讲故事”的方式理解:请像讲一个项目开发故事一样,把研究者是怎么一步步设计这个方法的讲出来,包括他们遇到什么挑战、为何选这个结构、每一步的逻辑联系。` },
                    { id: 'gemini-2-tech', type: 'Gemini', label: '技术框架', value: `请从本文的方法部分中,提炼核心算法或系统架构,并按以下结构展开说明:\n\n- 方法的基本动机与原理\n- 各个模块的输入、处理逻辑、输出\n- 如果可能,请用 Markdown 列表或伪代码描述整体流程\n- 尝试用生活/比喻方式解释机制,以帮助非专业者理解其工作原理\n\n输出结构清晰,并尽可能避免照抄原文。` }
                ]},
                { title: '③ 实验洞察', prompts: [
                    { id: 'exp-chatgpt', type: 'ChatGPT', label: '逻辑分析', value: `请分析论文的实验部分,重点包括:\n- 所使用的数据集及其代表性;\n- 对比实验设置是否合理;\n- 评估指标是否充分;\n- 结果是否显著优于现有方法;\n- 结果支持作者的哪些结论?\n请用逻辑清晰的分析语言表达。` },
                    { id: 'exp-claude', type: 'Claude', label: '审稿人视角', value: `请结合实验数据,为我讲清楚:这个模型到底好在哪里?是不是所有指标都更好?有没有反常的情况?作者是否过度解读结果了?如果你是审稿人,你会如何评价这些实验?` },
                    { id: 'gemini-3-insight', type: 'Gemini', label: '结果解读', value: `请帮我解读论文中的实验部分,具体包括:\n\n- 使用了哪些数据集和实验设置?\n- 作者设计了哪些对比组(baseline)与评估指标?\n- 实验结果说明了什么?作者是否充分支持其论点?\n- 如有图表,请尝试用文字重建并说明关键趋势与对比结果\n\n请以审稿人视角进行分析,指出实验设计是否有缺陷或值得商榷之处。` }
                ]},
                { title: '④ 批判思考', prompts: [
                    { id: 'crit-chatgpt', type: 'ChatGPT', label: '价值评估', value: `请帮我总结该论文的主要创新点,并评估其在已有文献中的相对价值。是否为增量性工作?是否填补了空白?是否存在方法泛化性、数据依赖性等潜在问题?` },
                    { id: 'crit-claude', type: 'Claude', label: '优劣思辨', value: `我想更深入思考这篇论文的价值与问题:请从“做得很好”和“还有待改进”的角度各列出 2-3 点,并结合你的推理说明这些优劣的判断依据。` },
                    { id: 'gemini-4-crit', type: 'Gemini', label: '价值评估', value: `请基于以下论文内容,从价值评估与方法局限的角度提出深入分析,包含:\n\n- 该论文的创新之处在哪?对学术或实际应用有何意义?\n- 作者的方法可能在哪些场景下失效?有何关键假设?\n- 是否存在样本偏差、推理链不完整、评估方式不足等问题?\n- 如果我是该论文的审稿人,我可能会提出哪些问题?\n\n请用批判性但中立的语气,输出思辨性结论。` }
                ]},
                { title: '⑤ 论文对比', prompts: [
                    { id: 'comp-chatgpt', type: 'ChatGPT', label: '表格化对比', value: `我有多篇论文,请你帮助我比较它们在以下方面的异同:\n- 研究目标与问题设定;\n- 所用方法或模型结构;\n- 数据集/评估方式;\n- 关键结果与性能差距;\n- 各自的创新点或不足之处。\n请形成一个对比表格或分类结构化总结。` },
                    { id: 'comp-claude', type: 'Claude', label: '知识演化视角', value: `这些论文之间有哪些研究思路上的“流派”?谁是改进谁的?是否可以归纳出一个共同的问题脉络或技术发展链条?请从知识演化视角帮助我看清“谁启发了谁”。` },
                    { id: 'gemini-5-comp', type: 'Gemini', label: '对照研究', value: `请将该论文与以下一篇/几篇相关论文进行对比分析:\n\n- 核心目标与方法差异\n- 模型设计或实验设置的演化轨迹\n- 各自的适用场景与扩展性\n- 是否形成互补关系,或存在范式冲突?\n\n请输出成一份表格对比 + 简要总结,用知识演化视角说明新论文的位置。` }
                ]},
                { title: '⑥ 深度精读', prompts: [
                    { id: 'deep-gemini', type: 'Gemini', label: '结构化精读', value: `你是一位训练有素的科研助手,擅长跨学科论文的结构化理解、批判性分析与工程/应用层面迁移。\n\n我将向你提供一篇论文,请你严格按照以下结构,提炼核心信息,并输出清晰的 Markdown 格式研究笔记:\n\n---\n\n### 1️⃣ 研究动机与问题陈述\n- 论文试图解决的关键问题是什么?\n- 它为何重要?在该领域中处于什么位置?\n\n---\n\n### 2️⃣ 核心贡献(用简洁点列总结)\n- 列出本文的主要贡献(不少于3条)\n- 哪些是创新点,哪些是对现有工作的拓展?\n\n---\n\n### 3️⃣ 方法与框架结构\n- 描述论文提出的方法或架构的整体框架\n- 可以列表或绘制简易流程图(建议使用 Markdown 列表或图解语言)\n\n---\n\n### 4️⃣ 数据与实验设计(如适用)\n- 数据来源和处理方式?\n- 实验如何设置?评估指标和结果如何?\n\n---\n\n### 5️⃣ 优势与局限\n- 本方法/研究的亮点有哪些?\n- 是否存在局限、盲点或待改进之处?\n\n---\n\n### 6️⃣ 应用场景与迁移价值\n- 成果可应用于哪些实际问题或领域?\n- 能否迁移到其他任务、学科或系统中?\n\n---\n\n### 7️⃣ 个人思考与后续探索\n- 你对这篇论文的最大收获或疑问是什么?\n- 如果继续这项研究,你可能采取哪些方向?\n\n---\n\n📝 输出要求:\n- 用 **Markdown** 格式组织输出(适合导入 Notion / Obsidian / Docs)\n- 尽量使用自己的语言重述,不照搬原文\n- 如果有图示建议,可使用文字/列表描述流程\n- 适用于任何学科,不要假设是 AI 论文` },
                    { id: 'deep-claude', type: 'Claude', label: '深度阅读', value: `你是一位深度思维型的科研与系统助理,擅长阅读复杂论文、理解其结构、提炼关键思想,并将研究成果转化为结构化笔记、可复现工程方案或进一步的探索路径。\n\n我将提供一篇论文的全文、摘要或片段,请严格按以下结构进行系统性解读,并用你自己的语言表达:\n\n---\n\n## 🧩 1. 研究动机与核心问题\n- 本文试图解决的核心问题是什么?\n- 这个问题在该领域的重要性体现在哪些方面?\n- 作者如何界定了问题的边界与挑战?\n\n## 🧱 2. 主要贡献总结(简洁有力,不少于3点)\n- 本文的关键贡献包括哪些方面?\n- 哪些属于方法/系统/实验创新,哪些属于理论或分析角度?\n\n## 🧠 3. 方法/系统结构图解\n- 简述作者提出的整体方法或系统架构,分模块说明每部分的功能\n- 如果是模型方法,请说明输入、处理机制与输出过程\n- 请用文字/伪代码/流程图或 Markdown 列表方式组织结构\n\n## 🧪 4. 数据、实验设计与结果(如适用)\n- 使用了哪些数据集?处理流程?\n- 实验设置如何?采用了哪些对比方法和指标?\n- 结果体现了哪些优势或特征?\n\n## 📊 5. 优势、局限与反思\n- 本文方法的亮点在哪里?是否有普适性?\n- 作者有没有回避或未充分讨论的问题?\n- 你是否发现可能存在的假设盲点、工程难点或方法局限?\n\n## 🚀 6. 迁移应用与启发\n- 本文的思路或方法可以迁移到哪些实际任务或领域?\n- 如果要落地为产品或系统,需要补充哪些模块?\n\n## 🔭 7. 延展思考或进一步研究方向\n- 如果你要继续这项研究,你会做哪些改进或拓展?\n- 有哪些你希望模型进一步挖掘或未被回答的问题?\n\n---\n\n📌 输出要求:\n- 用 Markdown 格式清晰组织内容\n- 每一部分都尽量用自己的语言重述,不照搬论文原话\n- 如需辅助说明结构,请用伪代码或有层级的 Markdown 列表\n- 如果输入的是 PDF OCR 或文本块,请自动识别结构内容并整理成以上结构\n\n🧭 角色提示(可选):\n如适用,请以“工程复现视角”/“博士申请笔记”/“系统研读讲义”/“会议报告摘要”等不同目标给出推荐改写方式。` },
                    { id: 'deep-grok', type: 'Grok', label: '高效解读', value: `你是一个严谨的科研助手与系统分析专家,擅长快速提炼科研论文的关键思想、结构框架、方法机制与实际意义。我将提供一篇论文内容(可为全文、摘要、截图OCR或主要段落),请你按以下结构系统地完成内容解读:\n\n---\n\n## 📘 1. 研究背景与核心问题\n- 本文研究了什么问题?为何重要?现实背景或理论缺口是什么?\n- 有哪些已有方法存在不足?本文打算如何突破?\n\n## 🧠 2. 核心贡献概括(不少于三点,点列式)\n- 本文的创新点、提出的新方法或系统\n- 与已有工作相比,在哪些维度有所改进?\n\n## 🧱 3. 方法原理 / 系统架构\n- 如果是理论/建模类:解释主要模型、推理机制、公式结构  \n- 如果是系统/工程类:模块组成、处理流程、信息流动  \n- 使用结构化形式:如 Markdown 层级列表、流程图(文本描述)或伪代码\n\n## 🧪 4. 数据与实验设计(如适用)\n- 使用了哪些数据集、实验设置、比较基准(baseline)?\n- 有哪些评估指标?结果说明了什么?\n\n## ✅ 5. 方法优点与不足\n- 作者在哪些地方表现出色?方法/设计是否具备可复现性与通用性?\n- 有哪些值得关注的假设、限制、风险或模糊点?\n\n## 🚀 6. 应用潜力与迁移可能\n- 本研究可以应用于哪些实际任务或行业?\n- 能否拓展到不同场景/任务?是否具有跨学科意义?\n\n## 🔍 7. 衍生问题与延展方向\n- 若继续探索,你有哪些改进想法?\n- 有哪些该论文未触及但你认为重要的研究问题?\n\n---\n\n🎯 输出要求:\n- 用 **Markdown** 或 **分段结构** 输出\n- 不照搬原文,用自己的语言总结\n- 可插入结构图(文本形式)或伪代码,说明处理流程\n- 如我输入的是截图/OCR内容,请你自动提取核心信息并按上述格式组织` }
                ]}
            ];

            GM_addStyle(`
              :root {
                --menu-bg: #fff; --menu-shadow: rgba(0, 0, 0, 0.1); --menu-border: #E2E8F0;
                --menu-text: #2D3748; --menu-group-text: #718096;
                --search-bg: #F7FAFC; --search-border-focus: #4299E1;
                --tag-bg: #EDF2F7; --tag-text: #4A5568; --tag-hover-bg: #E2E8F0;
                --tag-model-text: #718096;
                --trigger-bg: #F7FAFC; --trigger-border: #E2E8F0; --trigger-hover-bg: #EDF2F7;
              }
              html.dark {
                --menu-bg: #2D3748; --menu-shadow: rgba(0, 0, 0, 0.4); --menu-border: #4A5568;
                --menu-text: #E2E8F0; --menu-group-text: #A0AEC0;
                --search-bg: #1A202C; --search-border-focus: #63B3ED;
                --tag-bg: #4A5568; --tag-text: #CBD5E0; --tag-hover-bg: #718096;
                --tag-model-text: #A0AEC0;
                --trigger-bg: #2D3748; --trigger-border: #4A5568; --trigger-hover-bg: #1A202C;
              }
              #prompt-workbench-container-v11 {
                position: relative; margin-bottom: 12px; font-family: sans-serif;
              }
              #prompt-trigger-bar-v11 {
                width: 100%; padding: 8px 12px; font-size: 14px; font-weight: 600;
                color: var(--menu-text); background-color: var(--trigger-bg);
                border: 1px solid var(--trigger-border); border-radius: 8px; cursor: pointer;
                display: flex; justify-content: space-between; align-items: center;
                transition: background-color 0.2s, border-radius 0.2s; box-sizing: border-box;
              }
              #prompt-trigger-bar-v11.open {
                border-bottom-left-radius: 0; border-bottom-right-radius: 0;
              }
              #prompt-panel-v11 {
                display: none; position: absolute; left: 0; right: 0;
                bottom: 100%; z-index: 1000;
                background-color: var(--menu-bg); border: 1px solid var(--menu-border);
                border-bottom: none; border-top-left-radius: 8px; border-top-right-radius: 8px;
                box-shadow: 0 -4px 12px var(--menu-shadow); max-height: 50vh;
                overflow: hidden; flex-direction: column;
              }
              #prompt-panel-v11.visible { display: flex; }
              #prompt-menu-filter-container-v11 { padding: 12px; border-bottom: 1px solid var(--menu-border); flex-shrink: 0; }
              #prompt-menu-filter-v11 {
                width: 100%; padding: 10px 12px; font-size: 14px;
                border-radius: 8px; border: 1px solid var(--menu-border);
                background-color: var(--search-bg); color: var(--menu-text); box-sizing: border-box;
              }
              #prompt-menu-filter-v11:focus { outline: none; border-color: var(--search-border-focus); box-shadow: 0 0 0 1px var(--search-border-focus); }
              #prompt-menu-palette-container-v11 { padding: 8px 12px 12px 12px; overflow-y: auto; flex-grow: 1; }
              .prompt-menu-group-v11 { margin-top: 12px; }
              .prompt-menu-group-v11:first-child { margin-top: 0; }
              .prompt-menu-group-title-v11 {
                margin-bottom: 8px; padding: 0 4px; font-size: 12px; font-weight: bold;
                color: var(--menu-group-text); text-transform: uppercase; letter-spacing: 0.05em;
              }
              .prompt-menu-tag-container-v11 { display: flex; flex-wrap: wrap; gap: 8px; }
              .prompt-menu-tag-v11 {
                padding: 5px 10px; font-size: 13px;
                font-weight: 500; border-radius: 16px;
                background-color: var(--tag-bg); color: var(--tag-text);
                cursor: pointer; transition: background-color 0.2s, color 0.2s;
                display: flex; align-items: center; gap: 6px;
              }
              .prompt-menu-tag-v11 .model-name { font-size: 11px; font-weight: 700; color: var(--tag-model-text); opacity: 0.8; }
              .prompt-menu-tag-v11:hover { background-color: var(--tag-hover-bg); }
            `);

            const injectText = (value, editor) => {
                const pElement = editor.querySelector('p');
                if (pElement) {
                    pElement.textContent = value;
                    pElement.classList.remove('is-empty');
                    const trailingBreak = pElement.querySelector('.ProseMirror-trailingBreak');
                    if (trailingBreak) trailingBreak.remove();
                    editor.dispatchEvent(new Event('input', { bubbles: true, cancelable: true }));
                    editor.focus();
                }
            };

            const checkPromptInterval = setInterval(() => {
                const editor = document.querySelector('.ProseMirror[contenteditable="true"]');
                if (editor && !document.getElementById('prompt-workbench-container-v11')) {
                    const workbenchContainer = document.createElement('div');
                    workbenchContainer.id = 'prompt-workbench-container-v11';
                    const triggerBar = document.createElement('div');
                    triggerBar.id = 'prompt-trigger-bar-v11';
                    triggerBar.innerHTML = `<span>✨ Prompt Palette / 提示词库</span><span>▲</span>`;
                    const panel = document.createElement('div');
                    panel.id = 'prompt-panel-v11';
                    panel.innerHTML = `
                        <div id="prompt-menu-filter-container-v11">
                            <input type="text" id="prompt-menu-filter-v11" placeholder="🔍 搜索..." />
                        </div>
                        <div id="prompt-menu-palette-container-v11"></div>`;
                    workbenchContainer.append(triggerBar, panel);
                    editor.parentElement.before(workbenchContainer);

                    const paletteContainer = panel.querySelector('#prompt-menu-palette-container-v11');
                    const filterInput = panel.querySelector('#prompt-menu-filter-v11');

                    MODULES.forEach(module => {
                        const group = document.createElement('div');
                        group.className = 'prompt-menu-group-v11';
                        group.innerHTML = `<div class="prompt-menu-group-title-v11">${module.title}</div><div class="prompt-menu-tag-container-v11"></div>`;
                        const tagContainer = group.querySelector('.prompt-menu-tag-container-v11');

                        module.prompts.forEach(prompt => {
                            const tag = document.createElement('div');
                            tag.className = 'prompt-menu-tag-v11';
                            tag.innerHTML = `<span class="model-name">${prompt.type}</span> ${prompt.label}`;
                            tag.onclick = () => {
                                injectText(prompt.value, editor);
                                panel.classList.remove('visible');
                                triggerBar.classList.remove('open');
                            };
                            tagContainer.appendChild(tag);
                        });
                        paletteContainer.appendChild(group);
                    });

                    triggerBar.onclick = (e) => {
                        e.stopPropagation();
                        const isVisible = panel.classList.toggle('visible');
                        triggerBar.classList.toggle('open', isVisible);
                        if (isVisible) {
                            filterInput.focus();
                        }
                    };

                    filterInput.oninput = () => {
                        const query = filterInput.value.toLowerCase();
                        paletteContainer.querySelectorAll('.prompt-menu-group-v11').forEach(group => {
                            let hasVisibleTag = false;
                            group.querySelectorAll('.prompt-menu-tag-v11').forEach(tag => {
                                const text = tag.textContent.toLowerCase();
                                if (text.includes(query)) {
                                    tag.style.display = 'flex';
                                    hasVisibleTag = true;
                                } else {
                                    tag.style.display = 'none';
                                }
                            });
                            group.style.display = hasVisibleTag ? 'block' : 'none';
                        });
                    };

                    document.addEventListener('click', () => {
                        panel.classList.remove('visible');
                        triggerBar.classList.remove('open');
                    });

                    clearInterval(checkPromptInterval);
                }
            }, 500);
        }
    }
})();