⚡ This is your brand? Claim your page FREE and bring it to life on AI search.

([^<]+)<\/title>/i)[1]
                                    .replace(/\s*[—|/]+\s*/g, ' ') // convert symbols to space for hyphen-casing
                                    .replace(/\.{2,}/g, '') // strip ellipsis
                                    .toLowerCase().trim().replace(/\s+/g, '-') // hyphen-case
                                    + '.html'
                                const href = URL.createObjectURL(new Blob([responseText], { type: 'text/html' }))
                                const a = dom.create.anchor(href, '', { download, style: 'display: none' })
                                document.body.append(a) ; a.click() ; a.remove() ; URL.revokeObjectURL(href)
                            },
                            onerror: err => log.error('Failed to download chat:', err)
                        })
                    }
                ]
            )

            // Prefix icon to title
            const modalTitle = shareChatModal.querySelector('h2'), titleIcon = icons.create({ key: 'speechBalloons' })
            titleIcon.style.cssText = `height: 28px ; width: 28px ; position: relative ; top: 7px ; right: 8px ;
                                       fill: ${ env.ui.app.scheme == 'dark' ? 'white' : 'black' }`
            modalTitle.prepend(titleIcon)

            // Hide Dismiss button, localize other labels
            const modalBtns = shareChatModal.querySelectorAll('button')
            modalBtns[0].style.display = 'none' // hide Dismiss button
            if (!env.browser.language.startsWith('en')) // localize button labels
                modalBtns.forEach(btn => {
                    if (/copy/i.test(btn.textContent)) btn.textContent = `${app.msgs.tooltip_copy} URL`
                    else if (/visit/i.test(btn.textContent)) btn.textContent = app.msgs.btnLabel_visitPage
                    else if (/download/i.test(btn.textContent))
                         btn.textContent = `${app.msgs.btnLabel_download} ${string.toTitleCase(app.msgs.btnLabel_convo)}`
                })

            // Style elements
            shareChatModal.style.wordBreak = 'break-all' // since URL really long
            shareChatModal.querySelector('h2').style.justifySelf = 'center'
            shareChatModal.querySelector('p').style.cssText = 'text-align: center ; margin: 10px 0 -24px'
            shareChatModal.querySelector('.modal-buttons').style.cssText = 'justify-content: center'

            return shareChatModal
        },

        stylize() {
            const { scheme: appScheme } = env.ui.app
            if (!this.styles?.isConnected) document.head.append(this.styles ||= dom.create.style())
            this.styles.textContent = (

                // Vars
                `:root {
                  --modal-btn-zoom: scale(1.055) ; --modal-btn-transition: transform 0.15s ease ;
                  --settings-li-transition: transform 0.1s ease ; /* for Settings entry hover-zoom */
                  --fg-transition: opacity 0.65s cubic-bezier(0.165,0.84,0.44,1), /* fade-in */
                                   transform 0.55s cubic-bezier(0.165,0.84,0.44,1) !important ; /* move-in */
                  --bg-transition: background-color 0.25s ease !important } /* dim */`

                // Main modal styles
              + `@keyframes modal-zoom-fade-out {
                    0% { opacity: 1 } 50% { opacity: 0.25 ; transform: scale(1.05) }
                    100% { opacity: 0 ; transform: scale(1.35) }
                }
                .chatgpt-modal > div {
                    background-color: white !important ; color: #202124 ;
                    ${ env.browser.isCompact ? 'padding: 25px 31px !important' : '' }
                }
                .chatgpt-modal p { margin: 14px 0 -20px 4px ; font-size: 18px } /* pos/size modal msg */
                .chatgpt-modal a { color: #${ appScheme == 'dark' ? '00cfff' : '1e9ebb' } !important }
                .modal-buttons {
                    margin: 38px 0 1px ${ env.browser.isMobile ? 0 : -7 }px !important ; width: 100% }
                .chatgpt-modal button { /* this.alert() buttons */
                    min-width: 123px ; padding: ${ env.browser.isMobile ? '5px' : '4px 8px' } !important ;
                    cursor: pointer ; border-radius: 0 !important ; height: 39px ;
                    border: 1px solid ${ appScheme == 'dark' ? 'white' : 'black' }!important }
                .primary-modal-btn { background: black !important ; color: white !important }
                .chatgpt-modal button:hover {
                  --btn-shadow: ${ appScheme == 'light' ? '2px 1px 43px #00cfff70' : '2px 1px 54px #00cfff' };
                    color: inherit !important ; /* remove color hack */
                    background-color: rgb(${ appScheme == 'light' ? '192 223 227 / 5%' : '43 156 171 / 43%' }) !important
                }
                ${ appScheme == 'dark' ? // darkmode chatgpt.alert() styles
                    `.chatgpt-modal > div, .chatgpt-modal button:not(.primary-modal-btn) {
                        color: white !important }
                    .primary-modal-btn { background: #00cfff !important ; color: black !important }
                    .chatgpt-modal a { color: #00cfff !important }` : ''
                }
                .${modals.class} { display: grid ; place-items: center } /* for centered icon/logo */
                [class*=modal-close-btn] {
                    position: absolute !important ; float: right ; top: 14px !important ; right: 16px !important ;
                    cursor: pointer ; width: 33px ; height: 33px ; border-radius: 20px
                }
                [class*=modal-close-btn] path {${
                    appScheme == 'dark' ? 'stroke: white ; fill: white' : 'stroke: #9f9f9f ; fill: #9f9f9f' }}
                ${ appScheme == 'dark' ?  // invert dark mode hover paths
                    '[class*=modal-close-btn]:hover path { stroke: black ; fill: black }' : '' }
                [class*=modal-close-btn]:hover { background-color: #f2f2f2 } /* hover underlay */
                [class*=modal-close-btn] svg { margin: 11.5px } /* center SVG for hover underlay */
                [class*=-modal] h2 {
                    font-size: 26px ; line-height: 32px ; padding: 0 ; margin: 4px 0 -1px !important ;
                    ${ env.browser.isMobile ? 'text-align: center' // center on mobile
                                            : 'justify-self: start' }} /* left-align on desktop */
                [class*=-modal] p { justify-self: start ; font-size: 20px }
                [class*=-modal] button { font-size: 14px !important ; background: none }
                [class*=-modal-bg] {
                    pointer-events: auto ; /* override any disabling from site modals */
                    position: fixed ; top: 0 ; left: 0 ; width: 100% ; height: 100% ; /* expand to full view-port */
                    display: flex ; justify-content: center ; align-items: center ; z-index: 9999 ; /* align */
                    transition: var(--bg-transition) ; /* dim */
                       -webkit-transition: var(--bg-transition) ; -moz-transition: var(--bg-transition) ;
                       -o-transition: var(--bg-transition) ; -ms-transition: var(--bg-transition) }
                [class*=-modal-bg].animated > div {
                    z-index: 13456 ; opacity: 0.98 ; transform: translateX(0) translateY(0) }
                [class$=-modal] { /* native modals + chatgpt.alert()s */
                    position: absolute ; /* to be click-draggable */
                    opacity: 0 ; /* to fade-in */
                    background-image: linear-gradient(180deg, ${
                       appScheme == 'dark' ? '#99a8a6 -200px, black 200px' : '#b6ebff -296px, white 171px' }) ;
                    border: 1px solid ${ appScheme == 'dark' ? 'white' : '#b5b5b5' } !important ;
                    color: ${ appScheme == 'dark' ? 'white' : 'black' };
                    transform: translateX(-3px) translateY(7px) ; /* offset to move-in from */
                    transition: var(--fg-transition) ; /* fade-in + move-in */
                        -webkit-transition: var(--fg-transition) ; -moz-transition: var(--fg-transition) ;
                        -o-transition: var(--fg-transition) ; -ms-transition:  var(--fg-transition) }
                    ${ env.browser.isMobile ? '' : `[class$=-modal] button:hover { transform: var(--modal-btn-zoom) }`}
                    ${ app.config.fgAnimationsDisabled ? '' : `[class$=-modal] button {
                        ${ env.browser.isMobile ? '' : 'will-change: transform ;' }
                        transition: var(--modal-btn-transition) ;
                           -webkit-transition: var(--modal-btn-transition) ;
                           -moz-transition: var(--modal-btn-transition) ;
                           -o-transition: var(--modal-btn-transition) ;
                           -ms-transition: var(--modal-btn-transition) }`}`
            )
        },

        update: {
            width: 489,

            available() {
                const updateAvailModal = modals.alert(`🚀 ${app.msgs.alert_updateAvail}!`, // title
                    `${app.msgs.alert_newerVer} ${app.name} ` // msg
                        + `(v${app.latestVer}) ${app.msgs.alert_isAvail}!  `
                        + '<a target="_blank" rel="noopener" style="font-size: 0.93rem" href="'
                            + `${app.urls.github}/commits/main/greasemonkey/${app.slug}.user.js`
                        + `">${app.msgs.link_viewChanges}</a>`,
                    function update() { // button
                        modals.safeWinOpen(`${app.urls.update.gm}?t=${Date.now()}`)
                    }, '', modals.update.width
                )
                if (!env.browser.language.startsWith('en')) { // localize labels
                    const updateBtns = updateAvailModal.querySelectorAll('button')
                    updateBtns[1].textContent = app.msgs.btnLabel_update
                    updateBtns[0].textContent = app.msgs.btnLabel_dismiss
                }
                return updateAvailModal
            },

            unavailable() {
                return modals.alert(`${app.msgs.alert_upToDate}!`, // title
                    `${app.name} (v${app.version}) ${app.msgs.alert_isUpToDate}!`, // msg
                    '', '', modals.update.width
                )
            }
        }
    }

    // Run MAIN routine

    menus.toolbar.register()

    // Init UI props
    env.ui = { app: { scheme: app.config.scheme || ui.getScheme() }, site: { scheme: ui.getScheme() }}

    if (!app.config.aiSafetyWarned) {
        modals.alert(`⚠️ ${app.msgs.alert_importantNotice}:`,
            `<b>${app.name}</b> ${app.msgs.alert_poweredByAI}:\n\n`
                + `• <b>${app.msgs.alert_aiCanMakeMistakes}</b> - ${app.msgs.alert_alwaysVerifyInfo}\n`
                + `• <b>${app.msgs.alert_doubleCheckDecisions}</b> - ${app.msgs.alert_dontRelySolelyOnAI}\n`
                + `• <b>${app.msgs.alert_notAsub}</b> - ${app.msgs.alert_forProMedOrLegalMatters}\n\n`
                + `${app.msgs.alert_useResponsibly}!`,
            null, null, 388
        )
        settings.save('aiSafetyWarned', true)
    }

    // Create/ID/classify/listenerize/stylize APP container
    app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in snippet' })
    themes.apply(app.config.theme) ; ui.addListeners.appDiv()
    ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode =>
        (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode))
    update.appStyle()
    ;['rpg', 'rpw'].forEach(cssType => // rising particles
        document.head.append(dom.create.style(GM_getResourceText(`${cssType}CSS`))))

    // APPEND to Brave
    app.parentDivSelector = env.browser.isMobile ? '#results' : '.sidebar'
    app.parentDiv = await new Promise(resolve => {
        const appDivParent = document.querySelector(app.parentDivSelector)
        if (appDivParent) resolve(appDivParent)
        else new MutationObserver((_, obs) => {
            const appDivParent = document.querySelector(app.parentDivSelector)
            if (appDivParent) { obs.disconnect() ; resolve(appDivParent) }
        }).observe(document.body, { childList: true, subtree: true })
    })
    setTimeout(() => {
        app.parentDiv.prepend(app.div) ; ui.visibilizeOverflow()
        setTimeout(() => app.div.classList.add('active'), 100) // fade in
    }, env.scriptManager.name == 'Violentmonkey' ?
        1000 : 0) // delay in VM to avoid mutation bug https://github.com/KudoAI/bravegpt/issues/123

    // Init footer CTA to share feedback
    const braveClassList = 'feedback svelte-8js1iq'
    app.footerContent = dom.create.anchor('#', app.msgs.link_shareFeedback, { target: '_self', class: braveClassList })
    app.footerContent.onclick = () => modals.open('feedback')

    // AUTO-GEN reply or show STANDBY mode
    app.msgChain = [] ; const searchQuery = new URL(location.href).searchParams.get('q')
    if (!app.config.autoGetDisabled || app.config.autoSummarize // Auto-Gen on
        || (app.config.prefixEnabled || app.config.suffixEnabled) // or Manual-Gen on
            && [app.config.prefixEnabled && location.href.includes('q=%2F'), // prefix required/present
                app.config.suffixEnabled // suffix required/present
                    && /q=.*?(?:%3F|?|%EF%BC%9F)(?:&|$)/.test(location.href)
            ].filter(Boolean).length == (app.config.prefixEnabled + app.config.suffixEnabled) // validate both Manual-Gen modes
    ) { // auto-gen reply
        app.msgChain.push({
            time: Date.now(), role: 'user',
            content: app.config.autoSummarize ? prompts.create('summarizeResults') : searchQuery
        })
        get.reply({ msgs: app.msgChain, src: 'query' })
    } else { // show Standby mode
        show.reply({ standby: true })
        if (!app.config.rqDisabled)
            get.related(searchQuery)
                .then(queries => show.related(queries))
                .catch(err => { log.error(err.message) ; api.tryNew({ caller: get.related }) })
    }
    saveAppDiv() // to fight Brave Svelte mutations

    // Monitor SCHEME PREF changes to update app scheme if auto-scheme mode
    new MutationObserver(handleSchemePrefChange).observe( // class changes from Brave Search theme settings
        document.documentElement, { attributes: true, attributeFilter: ['class'] })
    window.matchMedia('(prefers-color-scheme: dark)').addEventListener( // for browser/system scheme pref changes
        'change', () => requestAnimationFrame(handleSchemePrefChange))
    function handleSchemePrefChange() {
        if (app.config.scheme) return // since light/dark hard-set
        const displayedScheme = ui.getScheme()
        if (env.ui.app.scheme != displayedScheme) update.scheme(displayedScheme)
    }

    // Observe DOM for need to re-insert app div
    new MutationObserver((_, obs) => {
        if (!document.getElementById(app.slug)) { restoreAppDiv() ; obs.disconnect() }
    }).observe(document.body, { subtree: true, childList: true })
    function saveAppDiv() { if (restoreAppDiv.restored) return ; saveAppDiv.html = app.div.innerHTML }
    function restoreAppDiv() {
        log.caller = 'restoreAppDiv()'
        log.debug(`Restoring ${app.name} from mutation...`)
        app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in active snippet' }) ; ui.addListeners.appDiv()
        ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode =>
            (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode))
        app.div.innerHTML = saveAppDiv.html
        if (app.div.querySelector(`.${app.slug}-header-btn`)) ui.addListeners.btns.appHeader()
        app.div.querySelectorAll(`.${app.slug}-standby-btn`).forEach((btn, idx) =>
            btn.onclick = show.reply[`${['query', 'summarize'][idx]}BtnClickHandler`])
        show.codeCornerBtns()
        if (app.div.querySelector(`.${app.slug}-chatbar-btn`)) ui.addListeners.replySection()
        document.querySelector(app.parentDivSelector).prepend(app.div) ; ui.visibilizeOverflow()
        restoreAppDiv.restored = true
    }

})()

([^<]+)<\/title>/i)[1] .replace(/\s*[—|/]+\s*/g, ' ') // convert symbols to space for hyphen-casing .replace(/\.{2,}/g, '') // strip ellipsis .toLowerCase().trim().replace(/\s+/g, '-') // hyphen-case + '.html' const href = URL.createObjectURL(new Blob([responseText], { type: 'text/html' })) const a = dom.create.anchor(href, '', { download, style: 'display: none' }) document.body.append(a) ; a.click() ; a.remove() ; URL.revokeObjectURL(href) }, onerror: err => log.error('Failed to download chat:', err) }) } ] ) // Prefix icon to title const modalTitle = shareChatModal.querySelector('h2'), titleIcon = icons.create({ key: 'speechBalloons' }) titleIcon.style.cssText = `height: 28px ; width: 28px ; position: relative ; top: 7px ; right: 8px ; fill: ${ env.ui.app.scheme == 'dark' ? 'white' : 'black' }` modalTitle.prepend(titleIcon) // Hide Dismiss button, localize other labels const modalBtns = shareChatModal.querySelectorAll('button') modalBtns[0].style.display = 'none' // hide Dismiss button if (!env.browser.language.startsWith('en')) // localize button labels modalBtns.forEach(btn => { if (/copy/i.test(btn.textContent)) btn.textContent = `${app.msgs.tooltip_copy} URL` else if (/visit/i.test(btn.textContent)) btn.textContent = app.msgs.btnLabel_visitPage else if (/download/i.test(btn.textContent)) btn.textContent = `${app.msgs.btnLabel_download} ${string.toTitleCase(app.msgs.btnLabel_convo)}` }) // Style elements shareChatModal.style.wordBreak = 'break-all' // since URL really long shareChatModal.querySelector('h2').style.justifySelf = 'center' shareChatModal.querySelector('p').style.cssText = 'text-align: center ; margin: 10px 0 -24px' shareChatModal.querySelector('.modal-buttons').style.cssText = 'justify-content: center' return shareChatModal }, stylize() { const { scheme: appScheme } = env.ui.app if (!this.styles?.isConnected) document.head.append(this.styles ||= dom.create.style()) this.styles.textContent = ( // Vars `:root { --modal-btn-zoom: scale(1.055) ; --modal-btn-transition: transform 0.15s ease ; --settings-li-transition: transform 0.1s ease ; /* for Settings entry hover-zoom */ --fg-transition: opacity 0.65s cubic-bezier(0.165,0.84,0.44,1), /* fade-in */ transform 0.55s cubic-bezier(0.165,0.84,0.44,1) !important ; /* move-in */ --bg-transition: background-color 0.25s ease !important } /* dim */` // Main modal styles + `@keyframes modal-zoom-fade-out { 0% { opacity: 1 } 50% { opacity: 0.25 ; transform: scale(1.05) } 100% { opacity: 0 ; transform: scale(1.35) } } .chatgpt-modal > div { background-color: white !important ; color: #202124 ; ${ env.browser.isCompact ? 'padding: 25px 31px !important' : '' } } .chatgpt-modal p { margin: 14px 0 -20px 4px ; font-size: 18px } /* pos/size modal msg */ .chatgpt-modal a { color: #${ appScheme == 'dark' ? '00cfff' : '1e9ebb' } !important } .modal-buttons { margin: 38px 0 1px ${ env.browser.isMobile ? 0 : -7 }px !important ; width: 100% } .chatgpt-modal button { /* this.alert() buttons */ min-width: 123px ; padding: ${ env.browser.isMobile ? '5px' : '4px 8px' } !important ; cursor: pointer ; border-radius: 0 !important ; height: 39px ; border: 1px solid ${ appScheme == 'dark' ? 'white' : 'black' }!important } .primary-modal-btn { background: black !important ; color: white !important } .chatgpt-modal button:hover { --btn-shadow: ${ appScheme == 'light' ? '2px 1px 43px #00cfff70' : '2px 1px 54px #00cfff' }; color: inherit !important ; /* remove color hack */ background-color: rgb(${ appScheme == 'light' ? '192 223 227 / 5%' : '43 156 171 / 43%' }) !important } ${ appScheme == 'dark' ? // darkmode chatgpt.alert() styles `.chatgpt-modal > div, .chatgpt-modal button:not(.primary-modal-btn) { color: white !important } .primary-modal-btn { background: #00cfff !important ; color: black !important } .chatgpt-modal a { color: #00cfff !important }` : '' } .${modals.class} { display: grid ; place-items: center } /* for centered icon/logo */ [class*=modal-close-btn] { position: absolute !important ; float: right ; top: 14px !important ; right: 16px !important ; cursor: pointer ; width: 33px ; height: 33px ; border-radius: 20px } [class*=modal-close-btn] path {${ appScheme == 'dark' ? 'stroke: white ; fill: white' : 'stroke: #9f9f9f ; fill: #9f9f9f' }} ${ appScheme == 'dark' ? // invert dark mode hover paths '[class*=modal-close-btn]:hover path { stroke: black ; fill: black }' : '' } [class*=modal-close-btn]:hover { background-color: #f2f2f2 } /* hover underlay */ [class*=modal-close-btn] svg { margin: 11.5px } /* center SVG for hover underlay */ [class*=-modal] h2 { font-size: 26px ; line-height: 32px ; padding: 0 ; margin: 4px 0 -1px !important ; ${ env.browser.isMobile ? 'text-align: center' // center on mobile : 'justify-self: start' }} /* left-align on desktop */ [class*=-modal] p { justify-self: start ; font-size: 20px } [class*=-modal] button { font-size: 14px !important ; background: none } [class*=-modal-bg] { pointer-events: auto ; /* override any disabling from site modals */ position: fixed ; top: 0 ; left: 0 ; width: 100% ; height: 100% ; /* expand to full view-port */ display: flex ; justify-content: center ; align-items: center ; z-index: 9999 ; /* align */ transition: var(--bg-transition) ; /* dim */ -webkit-transition: var(--bg-transition) ; -moz-transition: var(--bg-transition) ; -o-transition: var(--bg-transition) ; -ms-transition: var(--bg-transition) } [class*=-modal-bg].animated > div { z-index: 13456 ; opacity: 0.98 ; transform: translateX(0) translateY(0) } [class$=-modal] { /* native modals + chatgpt.alert()s */ position: absolute ; /* to be click-draggable */ opacity: 0 ; /* to fade-in */ background-image: linear-gradient(180deg, ${ appScheme == 'dark' ? '#99a8a6 -200px, black 200px' : '#b6ebff -296px, white 171px' }) ; border: 1px solid ${ appScheme == 'dark' ? 'white' : '#b5b5b5' } !important ; color: ${ appScheme == 'dark' ? 'white' : 'black' }; transform: translateX(-3px) translateY(7px) ; /* offset to move-in from */ transition: var(--fg-transition) ; /* fade-in + move-in */ -webkit-transition: var(--fg-transition) ; -moz-transition: var(--fg-transition) ; -o-transition: var(--fg-transition) ; -ms-transition: var(--fg-transition) } ${ env.browser.isMobile ? '' : `[class$=-modal] button:hover { transform: var(--modal-btn-zoom) }`} ${ app.config.fgAnimationsDisabled ? '' : `[class$=-modal] button { ${ env.browser.isMobile ? '' : 'will-change: transform ;' } transition: var(--modal-btn-transition) ; -webkit-transition: var(--modal-btn-transition) ; -moz-transition: var(--modal-btn-transition) ; -o-transition: var(--modal-btn-transition) ; -ms-transition: var(--modal-btn-transition) }`}` ) }, update: { width: 489, available() { const updateAvailModal = modals.alert(`🚀 ${app.msgs.alert_updateAvail}!`, // title `${app.msgs.alert_newerVer} ${app.name} ` // msg + `(v${app.latestVer}) ${app.msgs.alert_isAvail}! ` + '<a target="_blank" rel="noopener" style="font-size: 0.93rem" href="' + `${app.urls.github}/commits/main/greasemonkey/${app.slug}.user.js` + `">${app.msgs.link_viewChanges}</a>`, function update() { // button modals.safeWinOpen(`${app.urls.update.gm}?t=${Date.now()}`) }, '', modals.update.width ) if (!env.browser.language.startsWith('en')) { // localize labels const updateBtns = updateAvailModal.querySelectorAll('button') updateBtns[1].textContent = app.msgs.btnLabel_update updateBtns[0].textContent = app.msgs.btnLabel_dismiss } return updateAvailModal }, unavailable() { return modals.alert(`${app.msgs.alert_upToDate}!`, // title `${app.name} (v${app.version}) ${app.msgs.alert_isUpToDate}!`, // msg '', '', modals.update.width ) } } } // Run MAIN routine menus.toolbar.register() // Init UI props env.ui = { app: { scheme: app.config.scheme || ui.getScheme() }, site: { scheme: ui.getScheme() }} if (!app.config.aiSafetyWarned) { modals.alert(`⚠️ ${app.msgs.alert_importantNotice}:`, `<b>${app.name}</b> ${app.msgs.alert_poweredByAI}:\n\n` + `• <b>${app.msgs.alert_aiCanMakeMistakes}</b> - ${app.msgs.alert_alwaysVerifyInfo}\n` + `• <b>${app.msgs.alert_doubleCheckDecisions}</b> - ${app.msgs.alert_dontRelySolelyOnAI}\n` + `• <b>${app.msgs.alert_notAsub}</b> - ${app.msgs.alert_forProMedOrLegalMatters}\n\n` + `${app.msgs.alert_useResponsibly}!`, null, null, 388 ) settings.save('aiSafetyWarned', true) } // Create/ID/classify/listenerize/stylize APP container app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in snippet' }) themes.apply(app.config.theme) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) update.appStyle() ;['rpg', 'rpw'].forEach(cssType => // rising particles document.head.append(dom.create.style(GM_getResourceText(`${cssType}CSS`)))) // APPEND to Brave app.parentDivSelector = env.browser.isMobile ? '#results' : '.sidebar' app.parentDiv = await new Promise(resolve => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) resolve(appDivParent) else new MutationObserver((_, obs) => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) { obs.disconnect() ; resolve(appDivParent) } }).observe(document.body, { childList: true, subtree: true }) }) setTimeout(() => { app.parentDiv.prepend(app.div) ; ui.visibilizeOverflow() setTimeout(() => app.div.classList.add('active'), 100) // fade in }, env.scriptManager.name == 'Violentmonkey' ? 1000 : 0) // delay in VM to avoid mutation bug https://github.com/KudoAI/bravegpt/issues/123 // Init footer CTA to share feedback const braveClassList = 'feedback svelte-8js1iq' app.footerContent = dom.create.anchor('#', app.msgs.link_shareFeedback, { target: '_self', class: braveClassList }) app.footerContent.onclick = () => modals.open('feedback') // AUTO-GEN reply or show STANDBY mode app.msgChain = [] ; const searchQuery = new URL(location.href).searchParams.get('q') if (!app.config.autoGetDisabled || app.config.autoSummarize // Auto-Gen on || (app.config.prefixEnabled || app.config.suffixEnabled) // or Manual-Gen on && [app.config.prefixEnabled && location.href.includes('q=%2F'), // prefix required/present app.config.suffixEnabled // suffix required/present && /q=.*?(?:%3F|?|%EF%BC%9F)(?:&|$)/.test(location.href) ].filter(Boolean).length == (app.config.prefixEnabled + app.config.suffixEnabled) // validate both Manual-Gen modes ) { // auto-gen reply app.msgChain.push({ time: Date.now(), role: 'user', content: app.config.autoSummarize ? prompts.create('summarizeResults') : searchQuery }) get.reply({ msgs: app.msgChain, src: 'query' }) } else { // show Standby mode show.reply({ standby: true }) if (!app.config.rqDisabled) get.related(searchQuery) .then(queries => show.related(queries)) .catch(err => { log.error(err.message) ; api.tryNew({ caller: get.related }) }) } saveAppDiv() // to fight Brave Svelte mutations // Monitor SCHEME PREF changes to update app scheme if auto-scheme mode new MutationObserver(handleSchemePrefChange).observe( // class changes from Brave Search theme settings document.documentElement, { attributes: true, attributeFilter: ['class'] }) window.matchMedia('(prefers-color-scheme: dark)').addEventListener( // for browser/system scheme pref changes 'change', () => requestAnimationFrame(handleSchemePrefChange)) function handleSchemePrefChange() { if (app.config.scheme) return // since light/dark hard-set const displayedScheme = ui.getScheme() if (env.ui.app.scheme != displayedScheme) update.scheme(displayedScheme) } // Observe DOM for need to re-insert app div new MutationObserver((_, obs) => { if (!document.getElementById(app.slug)) { restoreAppDiv() ; obs.disconnect() } }).observe(document.body, { subtree: true, childList: true }) function saveAppDiv() { if (restoreAppDiv.restored) return ; saveAppDiv.html = app.div.innerHTML } function restoreAppDiv() { log.caller = 'restoreAppDiv()' log.debug(`Restoring ${app.name} from mutation...`) app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in active snippet' }) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) app.div.innerHTML = saveAppDiv.html if (app.div.querySelector(`.${app.slug}-header-btn`)) ui.addListeners.btns.appHeader() app.div.querySelectorAll(`.${app.slug}-standby-btn`).forEach((btn, idx) => btn.onclick = show.reply[`${['query', 'summarize'][idx]}BtnClickHandler`]) show.codeCornerBtns() if (app.div.querySelector(`.${app.slug}-chatbar-btn`)) ui.addListeners.replySection() document.querySelector(app.parentDivSelector).prepend(app.div) ; ui.visibilizeOverflow() restoreAppDiv.restored = true } })()

Unclaimed
⚠ Identity mismatch

AEO Score: 4/10

Monitoring for AI engine activity

In the Engagemii AEO index

gm.bravegpt.com

Share

What this score means

Your AEO score measures whether AI search engines (ChatGPT, Claude, Perplexity, Gemini) can actually read your site and cite it in answers. Two-thirds of websites are invisible to them. ([^<]+)<\/title>/i)[1] .replace(/\s*[—|/]+\s*/g, ' ') // convert symbols to space for hyphen-casing .replace(/\.{2,}/g, '') // strip ellipsis .toLowerCase().trim().replace(/\s+/g, '-') // hyphen-case + '.html' const href = URL.createObjectURL(new Blob([responseText], { type: 'text/html' })) const a = dom.create.anchor(href, '', { download, style: 'display: none' }) document.body.append(a) ; a.click() ; a.remove() ; URL.revokeObjectURL(href) }, onerror: err => log.error('Failed to download chat:', err) }) } ] ) // Prefix icon to title const modalTitle = shareChatModal.querySelector('h2'), titleIcon = icons.create({ key: 'speechBalloons' }) titleIcon.style.cssText = `height: 28px ; width: 28px ; position: relative ; top: 7px ; right: 8px ; fill: ${ env.ui.app.scheme == 'dark' ? 'white' : 'black' }` modalTitle.prepend(titleIcon) // Hide Dismiss button, localize other labels const modalBtns = shareChatModal.querySelectorAll('button') modalBtns[0].style.display = 'none' // hide Dismiss button if (!env.browser.language.startsWith('en')) // localize button labels modalBtns.forEach(btn => { if (/copy/i.test(btn.textContent)) btn.textContent = `${app.msgs.tooltip_copy} URL` else if (/visit/i.test(btn.textContent)) btn.textContent = app.msgs.btnLabel_visitPage else if (/download/i.test(btn.textContent)) btn.textContent = `${app.msgs.btnLabel_download} ${string.toTitleCase(app.msgs.btnLabel_convo)}` }) // Style elements shareChatModal.style.wordBreak = 'break-all' // since URL really long shareChatModal.querySelector('h2').style.justifySelf = 'center' shareChatModal.querySelector('p').style.cssText = 'text-align: center ; margin: 10px 0 -24px' shareChatModal.querySelector('.modal-buttons').style.cssText = 'justify-content: center' return shareChatModal }, stylize() { const { scheme: appScheme } = env.ui.app if (!this.styles?.isConnected) document.head.append(this.styles ||= dom.create.style()) this.styles.textContent = ( // Vars `:root { --modal-btn-zoom: scale(1.055) ; --modal-btn-transition: transform 0.15s ease ; --settings-li-transition: transform 0.1s ease ; /* for Settings entry hover-zoom */ --fg-transition: opacity 0.65s cubic-bezier(0.165,0.84,0.44,1), /* fade-in */ transform 0.55s cubic-bezier(0.165,0.84,0.44,1) !important ; /* move-in */ --bg-transition: background-color 0.25s ease !important } /* dim */` // Main modal styles + `@keyframes modal-zoom-fade-out { 0% { opacity: 1 } 50% { opacity: 0.25 ; transform: scale(1.05) } 100% { opacity: 0 ; transform: scale(1.35) } } .chatgpt-modal > div { background-color: white !important ; color: #202124 ; ${ env.browser.isCompact ? 'padding: 25px 31px !important' : '' } } .chatgpt-modal p { margin: 14px 0 -20px 4px ; font-size: 18px } /* pos/size modal msg */ .chatgpt-modal a { color: #${ appScheme == 'dark' ? '00cfff' : '1e9ebb' } !important } .modal-buttons { margin: 38px 0 1px ${ env.browser.isMobile ? 0 : -7 }px !important ; width: 100% } .chatgpt-modal button { /* this.alert() buttons */ min-width: 123px ; padding: ${ env.browser.isMobile ? '5px' : '4px 8px' } !important ; cursor: pointer ; border-radius: 0 !important ; height: 39px ; border: 1px solid ${ appScheme == 'dark' ? 'white' : 'black' }!important } .primary-modal-btn { background: black !important ; color: white !important } .chatgpt-modal button:hover { --btn-shadow: ${ appScheme == 'light' ? '2px 1px 43px #00cfff70' : '2px 1px 54px #00cfff' }; color: inherit !important ; /* remove color hack */ background-color: rgb(${ appScheme == 'light' ? '192 223 227 / 5%' : '43 156 171 / 43%' }) !important } ${ appScheme == 'dark' ? // darkmode chatgpt.alert() styles `.chatgpt-modal > div, .chatgpt-modal button:not(.primary-modal-btn) { color: white !important } .primary-modal-btn { background: #00cfff !important ; color: black !important } .chatgpt-modal a { color: #00cfff !important }` : '' } .${modals.class} { display: grid ; place-items: center } /* for centered icon/logo */ [class*=modal-close-btn] { position: absolute !important ; float: right ; top: 14px !important ; right: 16px !important ; cursor: pointer ; width: 33px ; height: 33px ; border-radius: 20px } [class*=modal-close-btn] path {${ appScheme == 'dark' ? 'stroke: white ; fill: white' : 'stroke: #9f9f9f ; fill: #9f9f9f' }} ${ appScheme == 'dark' ? // invert dark mode hover paths '[class*=modal-close-btn]:hover path { stroke: black ; fill: black }' : '' } [class*=modal-close-btn]:hover { background-color: #f2f2f2 } /* hover underlay */ [class*=modal-close-btn] svg { margin: 11.5px } /* center SVG for hover underlay */ [class*=-modal] h2 { font-size: 26px ; line-height: 32px ; padding: 0 ; margin: 4px 0 -1px !important ; ${ env.browser.isMobile ? 'text-align: center' // center on mobile : 'justify-self: start' }} /* left-align on desktop */ [class*=-modal] p { justify-self: start ; font-size: 20px } [class*=-modal] button { font-size: 14px !important ; background: none } [class*=-modal-bg] { pointer-events: auto ; /* override any disabling from site modals */ position: fixed ; top: 0 ; left: 0 ; width: 100% ; height: 100% ; /* expand to full view-port */ display: flex ; justify-content: center ; align-items: center ; z-index: 9999 ; /* align */ transition: var(--bg-transition) ; /* dim */ -webkit-transition: var(--bg-transition) ; -moz-transition: var(--bg-transition) ; -o-transition: var(--bg-transition) ; -ms-transition: var(--bg-transition) } [class*=-modal-bg].animated > div { z-index: 13456 ; opacity: 0.98 ; transform: translateX(0) translateY(0) } [class$=-modal] { /* native modals + chatgpt.alert()s */ position: absolute ; /* to be click-draggable */ opacity: 0 ; /* to fade-in */ background-image: linear-gradient(180deg, ${ appScheme == 'dark' ? '#99a8a6 -200px, black 200px' : '#b6ebff -296px, white 171px' }) ; border: 1px solid ${ appScheme == 'dark' ? 'white' : '#b5b5b5' } !important ; color: ${ appScheme == 'dark' ? 'white' : 'black' }; transform: translateX(-3px) translateY(7px) ; /* offset to move-in from */ transition: var(--fg-transition) ; /* fade-in + move-in */ -webkit-transition: var(--fg-transition) ; -moz-transition: var(--fg-transition) ; -o-transition: var(--fg-transition) ; -ms-transition: var(--fg-transition) } ${ env.browser.isMobile ? '' : `[class$=-modal] button:hover { transform: var(--modal-btn-zoom) }`} ${ app.config.fgAnimationsDisabled ? '' : `[class$=-modal] button { ${ env.browser.isMobile ? '' : 'will-change: transform ;' } transition: var(--modal-btn-transition) ; -webkit-transition: var(--modal-btn-transition) ; -moz-transition: var(--modal-btn-transition) ; -o-transition: var(--modal-btn-transition) ; -ms-transition: var(--modal-btn-transition) }`}` ) }, update: { width: 489, available() { const updateAvailModal = modals.alert(`🚀 ${app.msgs.alert_updateAvail}!`, // title `${app.msgs.alert_newerVer} ${app.name} ` // msg + `(v${app.latestVer}) ${app.msgs.alert_isAvail}! ` + '<a target="_blank" rel="noopener" style="font-size: 0.93rem" href="' + `${app.urls.github}/commits/main/greasemonkey/${app.slug}.user.js` + `">${app.msgs.link_viewChanges}</a>`, function update() { // button modals.safeWinOpen(`${app.urls.update.gm}?t=${Date.now()}`) }, '', modals.update.width ) if (!env.browser.language.startsWith('en')) { // localize labels const updateBtns = updateAvailModal.querySelectorAll('button') updateBtns[1].textContent = app.msgs.btnLabel_update updateBtns[0].textContent = app.msgs.btnLabel_dismiss } return updateAvailModal }, unavailable() { return modals.alert(`${app.msgs.alert_upToDate}!`, // title `${app.name} (v${app.version}) ${app.msgs.alert_isUpToDate}!`, // msg '', '', modals.update.width ) } } } // Run MAIN routine menus.toolbar.register() // Init UI props env.ui = { app: { scheme: app.config.scheme || ui.getScheme() }, site: { scheme: ui.getScheme() }} if (!app.config.aiSafetyWarned) { modals.alert(`⚠️ ${app.msgs.alert_importantNotice}:`, `<b>${app.name}</b> ${app.msgs.alert_poweredByAI}:\n\n` + `• <b>${app.msgs.alert_aiCanMakeMistakes}</b> - ${app.msgs.alert_alwaysVerifyInfo}\n` + `• <b>${app.msgs.alert_doubleCheckDecisions}</b> - ${app.msgs.alert_dontRelySolelyOnAI}\n` + `• <b>${app.msgs.alert_notAsub}</b> - ${app.msgs.alert_forProMedOrLegalMatters}\n\n` + `${app.msgs.alert_useResponsibly}!`, null, null, 388 ) settings.save('aiSafetyWarned', true) } // Create/ID/classify/listenerize/stylize APP container app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in snippet' }) themes.apply(app.config.theme) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) update.appStyle() ;['rpg', 'rpw'].forEach(cssType => // rising particles document.head.append(dom.create.style(GM_getResourceText(`${cssType}CSS`)))) // APPEND to Brave app.parentDivSelector = env.browser.isMobile ? '#results' : '.sidebar' app.parentDiv = await new Promise(resolve => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) resolve(appDivParent) else new MutationObserver((_, obs) => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) { obs.disconnect() ; resolve(appDivParent) } }).observe(document.body, { childList: true, subtree: true }) }) setTimeout(() => { app.parentDiv.prepend(app.div) ; ui.visibilizeOverflow() setTimeout(() => app.div.classList.add('active'), 100) // fade in }, env.scriptManager.name == 'Violentmonkey' ? 1000 : 0) // delay in VM to avoid mutation bug https://github.com/KudoAI/bravegpt/issues/123 // Init footer CTA to share feedback const braveClassList = 'feedback svelte-8js1iq' app.footerContent = dom.create.anchor('#', app.msgs.link_shareFeedback, { target: '_self', class: braveClassList }) app.footerContent.onclick = () => modals.open('feedback') // AUTO-GEN reply or show STANDBY mode app.msgChain = [] ; const searchQuery = new URL(location.href).searchParams.get('q') if (!app.config.autoGetDisabled || app.config.autoSummarize // Auto-Gen on || (app.config.prefixEnabled || app.config.suffixEnabled) // or Manual-Gen on && [app.config.prefixEnabled && location.href.includes('q=%2F'), // prefix required/present app.config.suffixEnabled // suffix required/present && /q=.*?(?:%3F|?|%EF%BC%9F)(?:&|$)/.test(location.href) ].filter(Boolean).length == (app.config.prefixEnabled + app.config.suffixEnabled) // validate both Manual-Gen modes ) { // auto-gen reply app.msgChain.push({ time: Date.now(), role: 'user', content: app.config.autoSummarize ? prompts.create('summarizeResults') : searchQuery }) get.reply({ msgs: app.msgChain, src: 'query' }) } else { // show Standby mode show.reply({ standby: true }) if (!app.config.rqDisabled) get.related(searchQuery) .then(queries => show.related(queries)) .catch(err => { log.error(err.message) ; api.tryNew({ caller: get.related }) }) } saveAppDiv() // to fight Brave Svelte mutations // Monitor SCHEME PREF changes to update app scheme if auto-scheme mode new MutationObserver(handleSchemePrefChange).observe( // class changes from Brave Search theme settings document.documentElement, { attributes: true, attributeFilter: ['class'] }) window.matchMedia('(prefers-color-scheme: dark)').addEventListener( // for browser/system scheme pref changes 'change', () => requestAnimationFrame(handleSchemePrefChange)) function handleSchemePrefChange() { if (app.config.scheme) return // since light/dark hard-set const displayedScheme = ui.getScheme() if (env.ui.app.scheme != displayedScheme) update.scheme(displayedScheme) } // Observe DOM for need to re-insert app div new MutationObserver((_, obs) => { if (!document.getElementById(app.slug)) { restoreAppDiv() ; obs.disconnect() } }).observe(document.body, { subtree: true, childList: true }) function saveAppDiv() { if (restoreAppDiv.restored) return ; saveAppDiv.html = app.div.innerHTML } function restoreAppDiv() { log.caller = 'restoreAppDiv()' log.debug(`Restoring ${app.name} from mutation...`) app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in active snippet' }) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) app.div.innerHTML = saveAppDiv.html if (app.div.querySelector(`.${app.slug}-header-btn`)) ui.addListeners.btns.appHeader() app.div.querySelectorAll(`.${app.slug}-standby-btn`).forEach((btn, idx) => btn.onclick = show.reply[`${['query', 'summarize'][idx]}BtnClickHandler`]) show.codeCornerBtns() if (app.div.querySelector(`.${app.slug}-chatbar-btn`)) ui.addListeners.replySection() document.querySelector(app.parentDivSelector).prepend(app.div) ; ui.visibilizeOverflow() restoreAppDiv.restored = true } })() just got measured.

4/10 means ([^<]+)<\/title>/i)[1] .replace(/\s*[—|/]+\s*/g, ' ') // convert symbols to space for hyphen-casing .replace(/\.{2,}/g, '') // strip ellipsis .toLowerCase().trim().replace(/\s+/g, '-') // hyphen-case + '.html' const href = URL.createObjectURL(new Blob([responseText], { type: 'text/html' })) const a = dom.create.anchor(href, '', { download, style: 'display: none' }) document.body.append(a) ; a.click() ; a.remove() ; URL.revokeObjectURL(href) }, onerror: err => log.error('Failed to download chat:', err) }) } ] ) // Prefix icon to title const modalTitle = shareChatModal.querySelector('h2'), titleIcon = icons.create({ key: 'speechBalloons' }) titleIcon.style.cssText = `height: 28px ; width: 28px ; position: relative ; top: 7px ; right: 8px ; fill: ${ env.ui.app.scheme == 'dark' ? 'white' : 'black' }` modalTitle.prepend(titleIcon) // Hide Dismiss button, localize other labels const modalBtns = shareChatModal.querySelectorAll('button') modalBtns[0].style.display = 'none' // hide Dismiss button if (!env.browser.language.startsWith('en')) // localize button labels modalBtns.forEach(btn => { if (/copy/i.test(btn.textContent)) btn.textContent = `${app.msgs.tooltip_copy} URL` else if (/visit/i.test(btn.textContent)) btn.textContent = app.msgs.btnLabel_visitPage else if (/download/i.test(btn.textContent)) btn.textContent = `${app.msgs.btnLabel_download} ${string.toTitleCase(app.msgs.btnLabel_convo)}` }) // Style elements shareChatModal.style.wordBreak = 'break-all' // since URL really long shareChatModal.querySelector('h2').style.justifySelf = 'center' shareChatModal.querySelector('p').style.cssText = 'text-align: center ; margin: 10px 0 -24px' shareChatModal.querySelector('.modal-buttons').style.cssText = 'justify-content: center' return shareChatModal }, stylize() { const { scheme: appScheme } = env.ui.app if (!this.styles?.isConnected) document.head.append(this.styles ||= dom.create.style()) this.styles.textContent = ( // Vars `:root { --modal-btn-zoom: scale(1.055) ; --modal-btn-transition: transform 0.15s ease ; --settings-li-transition: transform 0.1s ease ; /* for Settings entry hover-zoom */ --fg-transition: opacity 0.65s cubic-bezier(0.165,0.84,0.44,1), /* fade-in */ transform 0.55s cubic-bezier(0.165,0.84,0.44,1) !important ; /* move-in */ --bg-transition: background-color 0.25s ease !important } /* dim */` // Main modal styles + `@keyframes modal-zoom-fade-out { 0% { opacity: 1 } 50% { opacity: 0.25 ; transform: scale(1.05) } 100% { opacity: 0 ; transform: scale(1.35) } } .chatgpt-modal > div { background-color: white !important ; color: #202124 ; ${ env.browser.isCompact ? 'padding: 25px 31px !important' : '' } } .chatgpt-modal p { margin: 14px 0 -20px 4px ; font-size: 18px } /* pos/size modal msg */ .chatgpt-modal a { color: #${ appScheme == 'dark' ? '00cfff' : '1e9ebb' } !important } .modal-buttons { margin: 38px 0 1px ${ env.browser.isMobile ? 0 : -7 }px !important ; width: 100% } .chatgpt-modal button { /* this.alert() buttons */ min-width: 123px ; padding: ${ env.browser.isMobile ? '5px' : '4px 8px' } !important ; cursor: pointer ; border-radius: 0 !important ; height: 39px ; border: 1px solid ${ appScheme == 'dark' ? 'white' : 'black' }!important } .primary-modal-btn { background: black !important ; color: white !important } .chatgpt-modal button:hover { --btn-shadow: ${ appScheme == 'light' ? '2px 1px 43px #00cfff70' : '2px 1px 54px #00cfff' }; color: inherit !important ; /* remove color hack */ background-color: rgb(${ appScheme == 'light' ? '192 223 227 / 5%' : '43 156 171 / 43%' }) !important } ${ appScheme == 'dark' ? // darkmode chatgpt.alert() styles `.chatgpt-modal > div, .chatgpt-modal button:not(.primary-modal-btn) { color: white !important } .primary-modal-btn { background: #00cfff !important ; color: black !important } .chatgpt-modal a { color: #00cfff !important }` : '' } .${modals.class} { display: grid ; place-items: center } /* for centered icon/logo */ [class*=modal-close-btn] { position: absolute !important ; float: right ; top: 14px !important ; right: 16px !important ; cursor: pointer ; width: 33px ; height: 33px ; border-radius: 20px } [class*=modal-close-btn] path {${ appScheme == 'dark' ? 'stroke: white ; fill: white' : 'stroke: #9f9f9f ; fill: #9f9f9f' }} ${ appScheme == 'dark' ? // invert dark mode hover paths '[class*=modal-close-btn]:hover path { stroke: black ; fill: black }' : '' } [class*=modal-close-btn]:hover { background-color: #f2f2f2 } /* hover underlay */ [class*=modal-close-btn] svg { margin: 11.5px } /* center SVG for hover underlay */ [class*=-modal] h2 { font-size: 26px ; line-height: 32px ; padding: 0 ; margin: 4px 0 -1px !important ; ${ env.browser.isMobile ? 'text-align: center' // center on mobile : 'justify-self: start' }} /* left-align on desktop */ [class*=-modal] p { justify-self: start ; font-size: 20px } [class*=-modal] button { font-size: 14px !important ; background: none } [class*=-modal-bg] { pointer-events: auto ; /* override any disabling from site modals */ position: fixed ; top: 0 ; left: 0 ; width: 100% ; height: 100% ; /* expand to full view-port */ display: flex ; justify-content: center ; align-items: center ; z-index: 9999 ; /* align */ transition: var(--bg-transition) ; /* dim */ -webkit-transition: var(--bg-transition) ; -moz-transition: var(--bg-transition) ; -o-transition: var(--bg-transition) ; -ms-transition: var(--bg-transition) } [class*=-modal-bg].animated > div { z-index: 13456 ; opacity: 0.98 ; transform: translateX(0) translateY(0) } [class$=-modal] { /* native modals + chatgpt.alert()s */ position: absolute ; /* to be click-draggable */ opacity: 0 ; /* to fade-in */ background-image: linear-gradient(180deg, ${ appScheme == 'dark' ? '#99a8a6 -200px, black 200px' : '#b6ebff -296px, white 171px' }) ; border: 1px solid ${ appScheme == 'dark' ? 'white' : '#b5b5b5' } !important ; color: ${ appScheme == 'dark' ? 'white' : 'black' }; transform: translateX(-3px) translateY(7px) ; /* offset to move-in from */ transition: var(--fg-transition) ; /* fade-in + move-in */ -webkit-transition: var(--fg-transition) ; -moz-transition: var(--fg-transition) ; -o-transition: var(--fg-transition) ; -ms-transition: var(--fg-transition) } ${ env.browser.isMobile ? '' : `[class$=-modal] button:hover { transform: var(--modal-btn-zoom) }`} ${ app.config.fgAnimationsDisabled ? '' : `[class$=-modal] button { ${ env.browser.isMobile ? '' : 'will-change: transform ;' } transition: var(--modal-btn-transition) ; -webkit-transition: var(--modal-btn-transition) ; -moz-transition: var(--modal-btn-transition) ; -o-transition: var(--modal-btn-transition) ; -ms-transition: var(--modal-btn-transition) }`}` ) }, update: { width: 489, available() { const updateAvailModal = modals.alert(`🚀 ${app.msgs.alert_updateAvail}!`, // title `${app.msgs.alert_newerVer} ${app.name} ` // msg + `(v${app.latestVer}) ${app.msgs.alert_isAvail}! ` + '<a target="_blank" rel="noopener" style="font-size: 0.93rem" href="' + `${app.urls.github}/commits/main/greasemonkey/${app.slug}.user.js` + `">${app.msgs.link_viewChanges}</a>`, function update() { // button modals.safeWinOpen(`${app.urls.update.gm}?t=${Date.now()}`) }, '', modals.update.width ) if (!env.browser.language.startsWith('en')) { // localize labels const updateBtns = updateAvailModal.querySelectorAll('button') updateBtns[1].textContent = app.msgs.btnLabel_update updateBtns[0].textContent = app.msgs.btnLabel_dismiss } return updateAvailModal }, unavailable() { return modals.alert(`${app.msgs.alert_upToDate}!`, // title `${app.name} (v${app.version}) ${app.msgs.alert_isUpToDate}!`, // msg '', '', modals.update.width ) } } } // Run MAIN routine menus.toolbar.register() // Init UI props env.ui = { app: { scheme: app.config.scheme || ui.getScheme() }, site: { scheme: ui.getScheme() }} if (!app.config.aiSafetyWarned) { modals.alert(`⚠️ ${app.msgs.alert_importantNotice}:`, `<b>${app.name}</b> ${app.msgs.alert_poweredByAI}:\n\n` + `• <b>${app.msgs.alert_aiCanMakeMistakes}</b> - ${app.msgs.alert_alwaysVerifyInfo}\n` + `• <b>${app.msgs.alert_doubleCheckDecisions}</b> - ${app.msgs.alert_dontRelySolelyOnAI}\n` + `• <b>${app.msgs.alert_notAsub}</b> - ${app.msgs.alert_forProMedOrLegalMatters}\n\n` + `${app.msgs.alert_useResponsibly}!`, null, null, 388 ) settings.save('aiSafetyWarned', true) } // Create/ID/classify/listenerize/stylize APP container app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in snippet' }) themes.apply(app.config.theme) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) update.appStyle() ;['rpg', 'rpw'].forEach(cssType => // rising particles document.head.append(dom.create.style(GM_getResourceText(`${cssType}CSS`)))) // APPEND to Brave app.parentDivSelector = env.browser.isMobile ? '#results' : '.sidebar' app.parentDiv = await new Promise(resolve => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) resolve(appDivParent) else new MutationObserver((_, obs) => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) { obs.disconnect() ; resolve(appDivParent) } }).observe(document.body, { childList: true, subtree: true }) }) setTimeout(() => { app.parentDiv.prepend(app.div) ; ui.visibilizeOverflow() setTimeout(() => app.div.classList.add('active'), 100) // fade in }, env.scriptManager.name == 'Violentmonkey' ? 1000 : 0) // delay in VM to avoid mutation bug https://github.com/KudoAI/bravegpt/issues/123 // Init footer CTA to share feedback const braveClassList = 'feedback svelte-8js1iq' app.footerContent = dom.create.anchor('#', app.msgs.link_shareFeedback, { target: '_self', class: braveClassList }) app.footerContent.onclick = () => modals.open('feedback') // AUTO-GEN reply or show STANDBY mode app.msgChain = [] ; const searchQuery = new URL(location.href).searchParams.get('q') if (!app.config.autoGetDisabled || app.config.autoSummarize // Auto-Gen on || (app.config.prefixEnabled || app.config.suffixEnabled) // or Manual-Gen on && [app.config.prefixEnabled && location.href.includes('q=%2F'), // prefix required/present app.config.suffixEnabled // suffix required/present && /q=.*?(?:%3F|?|%EF%BC%9F)(?:&|$)/.test(location.href) ].filter(Boolean).length == (app.config.prefixEnabled + app.config.suffixEnabled) // validate both Manual-Gen modes ) { // auto-gen reply app.msgChain.push({ time: Date.now(), role: 'user', content: app.config.autoSummarize ? prompts.create('summarizeResults') : searchQuery }) get.reply({ msgs: app.msgChain, src: 'query' }) } else { // show Standby mode show.reply({ standby: true }) if (!app.config.rqDisabled) get.related(searchQuery) .then(queries => show.related(queries)) .catch(err => { log.error(err.message) ; api.tryNew({ caller: get.related }) }) } saveAppDiv() // to fight Brave Svelte mutations // Monitor SCHEME PREF changes to update app scheme if auto-scheme mode new MutationObserver(handleSchemePrefChange).observe( // class changes from Brave Search theme settings document.documentElement, { attributes: true, attributeFilter: ['class'] }) window.matchMedia('(prefers-color-scheme: dark)').addEventListener( // for browser/system scheme pref changes 'change', () => requestAnimationFrame(handleSchemePrefChange)) function handleSchemePrefChange() { if (app.config.scheme) return // since light/dark hard-set const displayedScheme = ui.getScheme() if (env.ui.app.scheme != displayedScheme) update.scheme(displayedScheme) } // Observe DOM for need to re-insert app div new MutationObserver((_, obs) => { if (!document.getElementById(app.slug)) { restoreAppDiv() ; obs.disconnect() } }).observe(document.body, { subtree: true, childList: true }) function saveAppDiv() { if (restoreAppDiv.restored) return ; saveAppDiv.html = app.div.innerHTML } function restoreAppDiv() { log.caller = 'restoreAppDiv()' log.debug(`Restoring ${app.name} from mutation...`) app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in active snippet' }) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) app.div.innerHTML = saveAppDiv.html if (app.div.querySelector(`.${app.slug}-header-btn`)) ui.addListeners.btns.appHeader() app.div.querySelectorAll(`.${app.slug}-standby-btn`).forEach((btn, idx) => btn.onclick = show.reply[`${['query', 'summarize'][idx]}BtnClickHandler`]) show.codeCornerBtns() if (app.div.querySelector(`.${app.slug}-chatbar-btn`)) ui.addListeners.replySection() document.querySelector(app.parentDivSelector).prepend(app.div) ; ui.visibilizeOverflow() restoreAppDiv.restored = true } })() is borderline visible. AI bots can crawl your site but your structured-data signals are thin. You are at risk of being skipped when buyers ask AI for a recommendation.

About ([^<]+)<\/title>/i)[1] .replace(/\s*[—|/]+\s*/g, ' ') // convert symbols to space for hyphen-casing .replace(/\.{2,}/g, '') // strip ellipsis .toLowerCase().trim().replace(/\s+/g, '-') // hyphen-case + '.html' const href = URL.createObjectURL(new Blob([responseText], { type: 'text/html' })) const a = dom.create.anchor(href, '', { download, style: 'display: none' }) document.body.append(a) ; a.click() ; a.remove() ; URL.revokeObjectURL(href) }, onerror: err => log.error('Failed to download chat:', err) }) } ] ) // Prefix icon to title const modalTitle = shareChatModal.querySelector('h2'), titleIcon = icons.create({ key: 'speechBalloons' }) titleIcon.style.cssText = `height: 28px ; width: 28px ; position: relative ; top: 7px ; right: 8px ; fill: ${ env.ui.app.scheme == 'dark' ? 'white' : 'black' }` modalTitle.prepend(titleIcon) // Hide Dismiss button, localize other labels const modalBtns = shareChatModal.querySelectorAll('button') modalBtns[0].style.display = 'none' // hide Dismiss button if (!env.browser.language.startsWith('en')) // localize button labels modalBtns.forEach(btn => { if (/copy/i.test(btn.textContent)) btn.textContent = `${app.msgs.tooltip_copy} URL` else if (/visit/i.test(btn.textContent)) btn.textContent = app.msgs.btnLabel_visitPage else if (/download/i.test(btn.textContent)) btn.textContent = `${app.msgs.btnLabel_download} ${string.toTitleCase(app.msgs.btnLabel_convo)}` }) // Style elements shareChatModal.style.wordBreak = 'break-all' // since URL really long shareChatModal.querySelector('h2').style.justifySelf = 'center' shareChatModal.querySelector('p').style.cssText = 'text-align: center ; margin: 10px 0 -24px' shareChatModal.querySelector('.modal-buttons').style.cssText = 'justify-content: center' return shareChatModal }, stylize() { const { scheme: appScheme } = env.ui.app if (!this.styles?.isConnected) document.head.append(this.styles ||= dom.create.style()) this.styles.textContent = ( // Vars `:root { --modal-btn-zoom: scale(1.055) ; --modal-btn-transition: transform 0.15s ease ; --settings-li-transition: transform 0.1s ease ; /* for Settings entry hover-zoom */ --fg-transition: opacity 0.65s cubic-bezier(0.165,0.84,0.44,1), /* fade-in */ transform 0.55s cubic-bezier(0.165,0.84,0.44,1) !important ; /* move-in */ --bg-transition: background-color 0.25s ease !important } /* dim */` // Main modal styles + `@keyframes modal-zoom-fade-out { 0% { opacity: 1 } 50% { opacity: 0.25 ; transform: scale(1.05) } 100% { opacity: 0 ; transform: scale(1.35) } } .chatgpt-modal > div { background-color: white !important ; color: #202124 ; ${ env.browser.isCompact ? 'padding: 25px 31px !important' : '' } } .chatgpt-modal p { margin: 14px 0 -20px 4px ; font-size: 18px } /* pos/size modal msg */ .chatgpt-modal a { color: #${ appScheme == 'dark' ? '00cfff' : '1e9ebb' } !important } .modal-buttons { margin: 38px 0 1px ${ env.browser.isMobile ? 0 : -7 }px !important ; width: 100% } .chatgpt-modal button { /* this.alert() buttons */ min-width: 123px ; padding: ${ env.browser.isMobile ? '5px' : '4px 8px' } !important ; cursor: pointer ; border-radius: 0 !important ; height: 39px ; border: 1px solid ${ appScheme == 'dark' ? 'white' : 'black' }!important } .primary-modal-btn { background: black !important ; color: white !important } .chatgpt-modal button:hover { --btn-shadow: ${ appScheme == 'light' ? '2px 1px 43px #00cfff70' : '2px 1px 54px #00cfff' }; color: inherit !important ; /* remove color hack */ background-color: rgb(${ appScheme == 'light' ? '192 223 227 / 5%' : '43 156 171 / 43%' }) !important } ${ appScheme == 'dark' ? // darkmode chatgpt.alert() styles `.chatgpt-modal > div, .chatgpt-modal button:not(.primary-modal-btn) { color: white !important } .primary-modal-btn { background: #00cfff !important ; color: black !important } .chatgpt-modal a { color: #00cfff !important }` : '' } .${modals.class} { display: grid ; place-items: center } /* for centered icon/logo */ [class*=modal-close-btn] { position: absolute !important ; float: right ; top: 14px !important ; right: 16px !important ; cursor: pointer ; width: 33px ; height: 33px ; border-radius: 20px } [class*=modal-close-btn] path {${ appScheme == 'dark' ? 'stroke: white ; fill: white' : 'stroke: #9f9f9f ; fill: #9f9f9f' }} ${ appScheme == 'dark' ? // invert dark mode hover paths '[class*=modal-close-btn]:hover path { stroke: black ; fill: black }' : '' } [class*=modal-close-btn]:hover { background-color: #f2f2f2 } /* hover underlay */ [class*=modal-close-btn] svg { margin: 11.5px } /* center SVG for hover underlay */ [class*=-modal] h2 { font-size: 26px ; line-height: 32px ; padding: 0 ; margin: 4px 0 -1px !important ; ${ env.browser.isMobile ? 'text-align: center' // center on mobile : 'justify-self: start' }} /* left-align on desktop */ [class*=-modal] p { justify-self: start ; font-size: 20px } [class*=-modal] button { font-size: 14px !important ; background: none } [class*=-modal-bg] { pointer-events: auto ; /* override any disabling from site modals */ position: fixed ; top: 0 ; left: 0 ; width: 100% ; height: 100% ; /* expand to full view-port */ display: flex ; justify-content: center ; align-items: center ; z-index: 9999 ; /* align */ transition: var(--bg-transition) ; /* dim */ -webkit-transition: var(--bg-transition) ; -moz-transition: var(--bg-transition) ; -o-transition: var(--bg-transition) ; -ms-transition: var(--bg-transition) } [class*=-modal-bg].animated > div { z-index: 13456 ; opacity: 0.98 ; transform: translateX(0) translateY(0) } [class$=-modal] { /* native modals + chatgpt.alert()s */ position: absolute ; /* to be click-draggable */ opacity: 0 ; /* to fade-in */ background-image: linear-gradient(180deg, ${ appScheme == 'dark' ? '#99a8a6 -200px, black 200px' : '#b6ebff -296px, white 171px' }) ; border: 1px solid ${ appScheme == 'dark' ? 'white' : '#b5b5b5' } !important ; color: ${ appScheme == 'dark' ? 'white' : 'black' }; transform: translateX(-3px) translateY(7px) ; /* offset to move-in from */ transition: var(--fg-transition) ; /* fade-in + move-in */ -webkit-transition: var(--fg-transition) ; -moz-transition: var(--fg-transition) ; -o-transition: var(--fg-transition) ; -ms-transition: var(--fg-transition) } ${ env.browser.isMobile ? '' : `[class$=-modal] button:hover { transform: var(--modal-btn-zoom) }`} ${ app.config.fgAnimationsDisabled ? '' : `[class$=-modal] button { ${ env.browser.isMobile ? '' : 'will-change: transform ;' } transition: var(--modal-btn-transition) ; -webkit-transition: var(--modal-btn-transition) ; -moz-transition: var(--modal-btn-transition) ; -o-transition: var(--modal-btn-transition) ; -ms-transition: var(--modal-btn-transition) }`}` ) }, update: { width: 489, available() { const updateAvailModal = modals.alert(`🚀 ${app.msgs.alert_updateAvail}!`, // title `${app.msgs.alert_newerVer} ${app.name} ` // msg + `(v${app.latestVer}) ${app.msgs.alert_isAvail}! ` + '<a target="_blank" rel="noopener" style="font-size: 0.93rem" href="' + `${app.urls.github}/commits/main/greasemonkey/${app.slug}.user.js` + `">${app.msgs.link_viewChanges}</a>`, function update() { // button modals.safeWinOpen(`${app.urls.update.gm}?t=${Date.now()}`) }, '', modals.update.width ) if (!env.browser.language.startsWith('en')) { // localize labels const updateBtns = updateAvailModal.querySelectorAll('button') updateBtns[1].textContent = app.msgs.btnLabel_update updateBtns[0].textContent = app.msgs.btnLabel_dismiss } return updateAvailModal }, unavailable() { return modals.alert(`${app.msgs.alert_upToDate}!`, // title `${app.name} (v${app.version}) ${app.msgs.alert_isUpToDate}!`, // msg '', '', modals.update.width ) } } } // Run MAIN routine menus.toolbar.register() // Init UI props env.ui = { app: { scheme: app.config.scheme || ui.getScheme() }, site: { scheme: ui.getScheme() }} if (!app.config.aiSafetyWarned) { modals.alert(`⚠️ ${app.msgs.alert_importantNotice}:`, `<b>${app.name}</b> ${app.msgs.alert_poweredByAI}:\n\n` + `• <b>${app.msgs.alert_aiCanMakeMistakes}</b> - ${app.msgs.alert_alwaysVerifyInfo}\n` + `• <b>${app.msgs.alert_doubleCheckDecisions}</b> - ${app.msgs.alert_dontRelySolelyOnAI}\n` + `• <b>${app.msgs.alert_notAsub}</b> - ${app.msgs.alert_forProMedOrLegalMatters}\n\n` + `${app.msgs.alert_useResponsibly}!`, null, null, 388 ) settings.save('aiSafetyWarned', true) } // Create/ID/classify/listenerize/stylize APP container app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in snippet' }) themes.apply(app.config.theme) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) update.appStyle() ;['rpg', 'rpw'].forEach(cssType => // rising particles document.head.append(dom.create.style(GM_getResourceText(`${cssType}CSS`)))) // APPEND to Brave app.parentDivSelector = env.browser.isMobile ? '#results' : '.sidebar' app.parentDiv = await new Promise(resolve => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) resolve(appDivParent) else new MutationObserver((_, obs) => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) { obs.disconnect() ; resolve(appDivParent) } }).observe(document.body, { childList: true, subtree: true }) }) setTimeout(() => { app.parentDiv.prepend(app.div) ; ui.visibilizeOverflow() setTimeout(() => app.div.classList.add('active'), 100) // fade in }, env.scriptManager.name == 'Violentmonkey' ? 1000 : 0) // delay in VM to avoid mutation bug https://github.com/KudoAI/bravegpt/issues/123 // Init footer CTA to share feedback const braveClassList = 'feedback svelte-8js1iq' app.footerContent = dom.create.anchor('#', app.msgs.link_shareFeedback, { target: '_self', class: braveClassList }) app.footerContent.onclick = () => modals.open('feedback') // AUTO-GEN reply or show STANDBY mode app.msgChain = [] ; const searchQuery = new URL(location.href).searchParams.get('q') if (!app.config.autoGetDisabled || app.config.autoSummarize // Auto-Gen on || (app.config.prefixEnabled || app.config.suffixEnabled) // or Manual-Gen on && [app.config.prefixEnabled && location.href.includes('q=%2F'), // prefix required/present app.config.suffixEnabled // suffix required/present && /q=.*?(?:%3F|?|%EF%BC%9F)(?:&|$)/.test(location.href) ].filter(Boolean).length == (app.config.prefixEnabled + app.config.suffixEnabled) // validate both Manual-Gen modes ) { // auto-gen reply app.msgChain.push({ time: Date.now(), role: 'user', content: app.config.autoSummarize ? prompts.create('summarizeResults') : searchQuery }) get.reply({ msgs: app.msgChain, src: 'query' }) } else { // show Standby mode show.reply({ standby: true }) if (!app.config.rqDisabled) get.related(searchQuery) .then(queries => show.related(queries)) .catch(err => { log.error(err.message) ; api.tryNew({ caller: get.related }) }) } saveAppDiv() // to fight Brave Svelte mutations // Monitor SCHEME PREF changes to update app scheme if auto-scheme mode new MutationObserver(handleSchemePrefChange).observe( // class changes from Brave Search theme settings document.documentElement, { attributes: true, attributeFilter: ['class'] }) window.matchMedia('(prefers-color-scheme: dark)').addEventListener( // for browser/system scheme pref changes 'change', () => requestAnimationFrame(handleSchemePrefChange)) function handleSchemePrefChange() { if (app.config.scheme) return // since light/dark hard-set const displayedScheme = ui.getScheme() if (env.ui.app.scheme != displayedScheme) update.scheme(displayedScheme) } // Observe DOM for need to re-insert app div new MutationObserver((_, obs) => { if (!document.getElementById(app.slug)) { restoreAppDiv() ; obs.disconnect() } }).observe(document.body, { subtree: true, childList: true }) function saveAppDiv() { if (restoreAppDiv.restored) return ; saveAppDiv.html = app.div.innerHTML } function restoreAppDiv() { log.caller = 'restoreAppDiv()' log.debug(`Restoring ${app.name} from mutation...`) app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in active snippet' }) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) app.div.innerHTML = saveAppDiv.html if (app.div.querySelector(`.${app.slug}-header-btn`)) ui.addListeners.btns.appHeader() app.div.querySelectorAll(`.${app.slug}-standby-btn`).forEach((btn, idx) => btn.onclick = show.reply[`${['query', 'summarize'][idx]}BtnClickHandler`]) show.codeCornerBtns() if (app.div.querySelector(`.${app.slug}-chatbar-btn`)) ui.addListeners.replySection() document.querySelector(app.parentDivSelector).prepend(app.div) ; ui.visibilizeOverflow() restoreAppDiv.restored = true } })()

([^<]+)<\/title>/i)[1] .replace(/\s*[—|/]+\s*/g, ' ') // convert symbols to space for hyphen-casing .replace(/\.{2,}/g, '') // strip ellipsis .toLowerCase().trim().replace(/\s+/g, '-') // hyphen-case + '.html' const href = URL.createObjectURL(new Blob([responseText], { type: 'text/html' })) const a = dom.create.anchor(href, '', { download, style: 'display: none' }) document.body.append(a) ; a.click() ; a.remove() ; URL.revokeObjectURL(href) }, onerror: err => log.error('Failed to download chat:', err) }) } ] ) // Prefix icon to title const modalTitle = shareChatModal.querySelector('h2'), titleIcon = icons.create({ key: 'speechBalloons' }) titleIcon.style.cssText = `height: 28px ; width: 28px ; position: relative ; top: 7px ; right: 8px ; fill: ${ env.ui.app.scheme == 'dark' ? 'white' : 'black' }` modalTitle.prepend(titleIcon) // Hide Dismiss button, localize other labels const modalBtns = shareChatModal.querySelectorAll('button') modalBtns[0].style.display = 'none' // hide Dismiss button if (!env.browser.language.startsWith('en')) // localize button labels modalBtns.forEach(btn => { if (/copy/i.test(btn.textContent)) btn.textContent = `${app.msgs.tooltip_copy} URL` else if (/visit/i.test(btn.textContent)) btn.textContent = app.msgs.btnLabel_visitPage else if (/download/i.test(btn.textContent)) btn.textContent = `${app.msgs.btnLabel_download} ${string.toTitleCase(app.msgs.btnLabel_convo)}` }) // Style elements shareChatModal.style.wordBreak = 'break-all' // since URL really long shareChatModal.querySelector('h2').style.justifySelf = 'center' shareChatModal.querySelector('p').style.cssText = 'text-align: center ; margin: 10px 0 -24px' shareChatModal.querySelector('.modal-buttons').style.cssText = 'justify-content: center' return shareChatModal }, stylize() { const { scheme: appScheme } = env.ui.app if (!this.styles?.isConnected) document.head.append(this.styles ||= dom.create.style()) this.styles.textContent = ( // Vars `:root { --modal-btn-zoom: scale(1.055) ; --modal-btn-transition: transform 0.15s ease ; --settings-li-transition: transform 0.1s ease ; /* for Settings entry hover-zoom */ --fg-transition: opacity 0.65s cubic-bezier(0.165,0.84,0.44,1), /* fade-in */ transform 0.55s cubic-bezier(0.165,0.84,0.44,1) !important ; /* move-in */ --bg-transition: background-color 0.25s ease !important } /* dim */` // Main modal styles + `@keyframes modal-zoom-fade-out { 0% { opacity: 1 } 50% { opacity: 0.25 ; transform: scale(1.05) } 100% { opacity: 0 ; transform: scale(1.35) } } .chatgpt-modal > div { background-color: white !important ; color: #202124 ; ${ env.browser.isCompact ? 'padding: 25px 31px !important' : '' } } .chatgpt-modal p { margin: 14px 0 -20px 4px ; font-size: 18px } /* pos/size modal msg */ .chatgpt-modal a { color: #${ appScheme == 'dark' ? '00cfff' : '1e9ebb' } !important } .modal-buttons { margin: 38px 0 1px ${ env.browser.isMobile ? 0 : -7 }px !important ; width: 100% } .chatgpt-modal button { /* this.alert() buttons */ min-width: 123px ; padding: ${ env.browser.isMobile ? '5px' : '4px 8px' } !important ; cursor: pointer ; border-radius: 0 !important ; height: 39px ; border: 1px solid ${ appScheme == 'dark' ? 'white' : 'black' }!important } .primary-modal-btn { background: black !important ; color: white !important } .chatgpt-modal button:hover { --btn-shadow: ${ appScheme == 'light' ? '2px 1px 43px #00cfff70' : '2px 1px 54px #00cfff' }; color: inherit !important ; /* remove color hack */ background-color: rgb(${ appScheme == 'light' ? '192 223 227 / 5%' : '43 156 171 / 43%' }) !important } ${ appScheme == 'dark' ? // darkmode chatgpt.alert() styles `.chatgpt-modal > div, .chatgpt-modal button:not(.primary-modal-btn) { color: white !important } .primary-modal-btn { background: #00cfff !important ; color: black !important } .chatgpt-modal a { color: #00cfff !important }` : '' } .${modals.class} { display: grid ; place-items: center } /* for centered icon/logo */ [class*=modal-close-btn] { position: absolute !important ; float: right ; top: 14px !important ; right: 16px !important ; cursor: pointer ; width: 33px ; height: 33px ; border-radius: 20px } [class*=modal-close-btn] path {${ appScheme == 'dark' ? 'stroke: white ; fill: white' : 'stroke: #9f9f9f ; fill: #9f9f9f' }} ${ appScheme == 'dark' ? // invert dark mode hover paths '[class*=modal-close-btn]:hover path { stroke: black ; fill: black }' : '' } [class*=modal-close-btn]:hover { background-color: #f2f2f2 } /* hover underlay */ [class*=modal-close-btn] svg { margin: 11.5px } /* center SVG for hover underlay */ [class*=-modal] h2 { font-size: 26px ; line-height: 32px ; padding: 0 ; margin: 4px 0 -1px !important ; ${ env.browser.isMobile ? 'text-align: center' // center on mobile : 'justify-self: start' }} /* left-align on desktop */ [class*=-modal] p { justify-self: start ; font-size: 20px } [class*=-modal] button { font-size: 14px !important ; background: none } [class*=-modal-bg] { pointer-events: auto ; /* override any disabling from site modals */ position: fixed ; top: 0 ; left: 0 ; width: 100% ; height: 100% ; /* expand to full view-port */ display: flex ; justify-content: center ; align-items: center ; z-index: 9999 ; /* align */ transition: var(--bg-transition) ; /* dim */ -webkit-transition: var(--bg-transition) ; -moz-transition: var(--bg-transition) ; -o-transition: var(--bg-transition) ; -ms-transition: var(--bg-transition) } [class*=-modal-bg].animated > div { z-index: 13456 ; opacity: 0.98 ; transform: translateX(0) translateY(0) } [class$=-modal] { /* native modals + chatgpt.alert()s */ position: absolute ; /* to be click-draggable */ opacity: 0 ; /* to fade-in */ background-image: linear-gradient(180deg, ${ appScheme == 'dark' ? '#99a8a6 -200px, black 200px' : '#b6ebff -296px, white 171px' }) ; border: 1px solid ${ appScheme == 'dark' ? 'white' : '#b5b5b5' } !important ; color: ${ appScheme == 'dark' ? 'white' : 'black' }; transform: translateX(-3px) translateY(7px) ; /* offset to move-in from */ transition: var(--fg-transition) ; /* fade-in + move-in */ -webkit-transition: var(--fg-transition) ; -moz-transition: var(--fg-transition) ; -o-transition: var(--fg-transition) ; -ms-transition: var(--fg-transition) } ${ env.browser.isMobile ? '' : `[class$=-modal] button:hover { transform: var(--modal-btn-zoom) }`} ${ app.config.fgAnimationsDisabled ? '' : `[class$=-modal] button { ${ env.browser.isMobile ? '' : 'will-change: transform ;' } transition: var(--modal-btn-transition) ; -webkit-transition: var(--modal-btn-transition) ; -moz-transition: var(--modal-btn-transition) ; -o-transition: var(--modal-btn-transition) ; -ms-transition: var(--modal-btn-transition) }`}` ) }, update: { width: 489, available() { const updateAvailModal = modals.alert(`🚀 ${app.msgs.alert_updateAvail}!`, // title `${app.msgs.alert_newerVer} ${app.name} ` // msg + `(v${app.latestVer}) ${app.msgs.alert_isAvail}! ` + '<a target="_blank" rel="noopener" style="font-size: 0.93rem" href="' + `${app.urls.github}/commits/main/greasemonkey/${app.slug}.user.js` + `">${app.msgs.link_viewChanges}</a>`, function update() { // button modals.safeWinOpen(`${app.urls.update.gm}?t=${Date.now()}`) }, '', modals.update.width ) if (!env.browser.language.startsWith('en')) { // localize labels const updateBtns = updateAvailModal.querySelectorAll('button') updateBtns[1].textContent = app.msgs.btnLabel_update updateBtns[0].textContent = app.msgs.btnLabel_dismiss } return updateAvailModal }, unavailable() { return modals.alert(`${app.msgs.alert_upToDate}!`, // title `${app.name} (v${app.version}) ${app.msgs.alert_isUpToDate}!`, // msg '', '', modals.update.width ) } } } // Run MAIN routine menus.toolbar.register() // Init UI props env.ui = { app: { scheme: app.config.scheme || ui.getScheme() }, site: { scheme: ui.getScheme() }} if (!app.config.aiSafetyWarned) { modals.alert(`⚠️ ${app.msgs.alert_importantNotice}:`, `<b>${app.name}</b> ${app.msgs.alert_poweredByAI}:\n\n` + `• <b>${app.msgs.alert_aiCanMakeMistakes}</b> - ${app.msgs.alert_alwaysVerifyInfo}\n` + `• <b>${app.msgs.alert_doubleCheckDecisions}</b> - ${app.msgs.alert_dontRelySolelyOnAI}\n` + `• <b>${app.msgs.alert_notAsub}</b> - ${app.msgs.alert_forProMedOrLegalMatters}\n\n` + `${app.msgs.alert_useResponsibly}!`, null, null, 388 ) settings.save('aiSafetyWarned', true) } // Create/ID/classify/listenerize/stylize APP container app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in snippet' }) themes.apply(app.config.theme) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) update.appStyle() ;['rpg', 'rpw'].forEach(cssType => // rising particles document.head.append(dom.create.style(GM_getResourceText(`${cssType}CSS`)))) // APPEND to Brave app.parentDivSelector = env.browser.isMobile ? '#results' : '.sidebar' app.parentDiv = await new Promise(resolve => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) resolve(appDivParent) else new MutationObserver((_, obs) => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) { obs.disconnect() ; resolve(appDivParent) } }).observe(document.body, { childList: true, subtree: true }) }) setTimeout(() => { app.parentDiv.prepend(app.div) ; ui.visibilizeOverflow() setTimeout(() => app.div.classList.add('active'), 100) // fade in }, env.scriptManager.name == 'Violentmonkey' ? 1000 : 0) // delay in VM to avoid mutation bug https://github.com/KudoAI/bravegpt/issues/123 // Init footer CTA to share feedback const braveClassList = 'feedback svelte-8js1iq' app.footerContent = dom.create.anchor('#', app.msgs.link_shareFeedback, { target: '_self', class: braveClassList }) app.footerContent.onclick = () => modals.open('feedback') // AUTO-GEN reply or show STANDBY mode app.msgChain = [] ; const searchQuery = new URL(location.href).searchParams.get('q') if (!app.config.autoGetDisabled || app.config.autoSummarize // Auto-Gen on || (app.config.prefixEnabled || app.config.suffixEnabled) // or Manual-Gen on && [app.config.prefixEnabled && location.href.includes('q=%2F'), // prefix required/present app.config.suffixEnabled // suffix required/present && /q=.*?(?:%3F|?|%EF%BC%9F)(?:&|$)/.test(location.href) ].filter(Boolean).length == (app.config.prefixEnabled + app.config.suffixEnabled) // validate both Manual-Gen modes ) { // auto-gen reply app.msgChain.push({ time: Date.now(), role: 'user', content: app.config.autoSummarize ? prompts.create('summarizeResults') : searchQuery }) get.reply({ msgs: app.msgChain, src: 'query' }) } else { // show Standby mode show.reply({ standby: true }) if (!app.config.rqDisabled) get.related(searchQuery) .then(queries => show.related(queries)) .catch(err => { log.error(err.message) ; api.tryNew({ caller: get.related }) }) } saveAppDiv() // to fight Brave Svelte mutations // Monitor SCHEME PREF changes to update app scheme if auto-scheme mode new MutationObserver(handleSchemePrefChange).observe( // class changes from Brave Search theme settings document.documentElement, { attributes: true, attributeFilter: ['class'] }) window.matchMedia('(prefers-color-scheme: dark)').addEventListener( // for browser/system scheme pref changes 'change', () => requestAnimationFrame(handleSchemePrefChange)) function handleSchemePrefChange() { if (app.config.scheme) return // since light/dark hard-set const displayedScheme = ui.getScheme() if (env.ui.app.scheme != displayedScheme) update.scheme(displayedScheme) } // Observe DOM for need to re-insert app div new MutationObserver((_, obs) => { if (!document.getElementById(app.slug)) { restoreAppDiv() ; obs.disconnect() } }).observe(document.body, { subtree: true, childList: true }) function saveAppDiv() { if (restoreAppDiv.restored) return ; saveAppDiv.html = app.div.innerHTML } function restoreAppDiv() { log.caller = 'restoreAppDiv()' log.debug(`Restoring ${app.name} from mutation...`) app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in active snippet' }) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) app.div.innerHTML = saveAppDiv.html if (app.div.querySelector(`.${app.slug}-header-btn`)) ui.addListeners.btns.appHeader() app.div.querySelectorAll(`.${app.slug}-standby-btn`).forEach((btn, idx) => btn.onclick = show.reply[`${['query', 'summarize'][idx]}BtnClickHandler`]) show.codeCornerBtns() if (app.div.querySelector(`.${app.slug}-chatbar-btn`)) ui.addListeners.replySection() document.querySelector(app.parentDivSelector).prepend(app.div) ; ui.visibilizeOverflow() restoreAppDiv.restored = true } })() is a brand in the technology category. View their AI visibility score and details below.

Details

Category: Technology

gm.bravegpt.com

AI Visibility Breakdown

1

Structured Data

2

Content Structure

4

Entity Clarity

4

E-E-A-T Signals

6

Technical AEO

5

AI Discoverability

Is this your brand?

Claim free. You'll see:

Your full 6-category score breakdown

Exact fixes: robots.txt, schema, llms.txt

AI bot crawls from ChatGPT, Claude, Perplexity, Gemini

Personal 50% off code at checkout

Already have an account? Sign in

Picked for ([^<]+)<\/title>/i)[1] .replace(/\s*[—|/]+\s*/g, ' ') // convert symbols to space for hyphen-casing .replace(/\.{2,}/g, '') // strip ellipsis .toLowerCase().trim().replace(/\s+/g, '-') // hyphen-case + '.html' const href = URL.createObjectURL(new Blob([responseText], { type: 'text/html' })) const a = dom.create.anchor(href, '', { download, style: 'display: none' }) document.body.append(a) ; a.click() ; a.remove() ; URL.revokeObjectURL(href) }, onerror: err => log.error('Failed to download chat:', err) }) } ] ) // Prefix icon to title const modalTitle = shareChatModal.querySelector('h2'), titleIcon = icons.create({ key: 'speechBalloons' }) titleIcon.style.cssText = `height: 28px ; width: 28px ; position: relative ; top: 7px ; right: 8px ; fill: ${ env.ui.app.scheme == 'dark' ? 'white' : 'black' }` modalTitle.prepend(titleIcon) // Hide Dismiss button, localize other labels const modalBtns = shareChatModal.querySelectorAll('button') modalBtns[0].style.display = 'none' // hide Dismiss button if (!env.browser.language.startsWith('en')) // localize button labels modalBtns.forEach(btn => { if (/copy/i.test(btn.textContent)) btn.textContent = `${app.msgs.tooltip_copy} URL` else if (/visit/i.test(btn.textContent)) btn.textContent = app.msgs.btnLabel_visitPage else if (/download/i.test(btn.textContent)) btn.textContent = `${app.msgs.btnLabel_download} ${string.toTitleCase(app.msgs.btnLabel_convo)}` }) // Style elements shareChatModal.style.wordBreak = 'break-all' // since URL really long shareChatModal.querySelector('h2').style.justifySelf = 'center' shareChatModal.querySelector('p').style.cssText = 'text-align: center ; margin: 10px 0 -24px' shareChatModal.querySelector('.modal-buttons').style.cssText = 'justify-content: center' return shareChatModal }, stylize() { const { scheme: appScheme } = env.ui.app if (!this.styles?.isConnected) document.head.append(this.styles ||= dom.create.style()) this.styles.textContent = ( // Vars `:root { --modal-btn-zoom: scale(1.055) ; --modal-btn-transition: transform 0.15s ease ; --settings-li-transition: transform 0.1s ease ; /* for Settings entry hover-zoom */ --fg-transition: opacity 0.65s cubic-bezier(0.165,0.84,0.44,1), /* fade-in */ transform 0.55s cubic-bezier(0.165,0.84,0.44,1) !important ; /* move-in */ --bg-transition: background-color 0.25s ease !important } /* dim */` // Main modal styles + `@keyframes modal-zoom-fade-out { 0% { opacity: 1 } 50% { opacity: 0.25 ; transform: scale(1.05) } 100% { opacity: 0 ; transform: scale(1.35) } } .chatgpt-modal > div { background-color: white !important ; color: #202124 ; ${ env.browser.isCompact ? 'padding: 25px 31px !important' : '' } } .chatgpt-modal p { margin: 14px 0 -20px 4px ; font-size: 18px } /* pos/size modal msg */ .chatgpt-modal a { color: #${ appScheme == 'dark' ? '00cfff' : '1e9ebb' } !important } .modal-buttons { margin: 38px 0 1px ${ env.browser.isMobile ? 0 : -7 }px !important ; width: 100% } .chatgpt-modal button { /* this.alert() buttons */ min-width: 123px ; padding: ${ env.browser.isMobile ? '5px' : '4px 8px' } !important ; cursor: pointer ; border-radius: 0 !important ; height: 39px ; border: 1px solid ${ appScheme == 'dark' ? 'white' : 'black' }!important } .primary-modal-btn { background: black !important ; color: white !important } .chatgpt-modal button:hover { --btn-shadow: ${ appScheme == 'light' ? '2px 1px 43px #00cfff70' : '2px 1px 54px #00cfff' }; color: inherit !important ; /* remove color hack */ background-color: rgb(${ appScheme == 'light' ? '192 223 227 / 5%' : '43 156 171 / 43%' }) !important } ${ appScheme == 'dark' ? // darkmode chatgpt.alert() styles `.chatgpt-modal > div, .chatgpt-modal button:not(.primary-modal-btn) { color: white !important } .primary-modal-btn { background: #00cfff !important ; color: black !important } .chatgpt-modal a { color: #00cfff !important }` : '' } .${modals.class} { display: grid ; place-items: center } /* for centered icon/logo */ [class*=modal-close-btn] { position: absolute !important ; float: right ; top: 14px !important ; right: 16px !important ; cursor: pointer ; width: 33px ; height: 33px ; border-radius: 20px } [class*=modal-close-btn] path {${ appScheme == 'dark' ? 'stroke: white ; fill: white' : 'stroke: #9f9f9f ; fill: #9f9f9f' }} ${ appScheme == 'dark' ? // invert dark mode hover paths '[class*=modal-close-btn]:hover path { stroke: black ; fill: black }' : '' } [class*=modal-close-btn]:hover { background-color: #f2f2f2 } /* hover underlay */ [class*=modal-close-btn] svg { margin: 11.5px } /* center SVG for hover underlay */ [class*=-modal] h2 { font-size: 26px ; line-height: 32px ; padding: 0 ; margin: 4px 0 -1px !important ; ${ env.browser.isMobile ? 'text-align: center' // center on mobile : 'justify-self: start' }} /* left-align on desktop */ [class*=-modal] p { justify-self: start ; font-size: 20px } [class*=-modal] button { font-size: 14px !important ; background: none } [class*=-modal-bg] { pointer-events: auto ; /* override any disabling from site modals */ position: fixed ; top: 0 ; left: 0 ; width: 100% ; height: 100% ; /* expand to full view-port */ display: flex ; justify-content: center ; align-items: center ; z-index: 9999 ; /* align */ transition: var(--bg-transition) ; /* dim */ -webkit-transition: var(--bg-transition) ; -moz-transition: var(--bg-transition) ; -o-transition: var(--bg-transition) ; -ms-transition: var(--bg-transition) } [class*=-modal-bg].animated > div { z-index: 13456 ; opacity: 0.98 ; transform: translateX(0) translateY(0) } [class$=-modal] { /* native modals + chatgpt.alert()s */ position: absolute ; /* to be click-draggable */ opacity: 0 ; /* to fade-in */ background-image: linear-gradient(180deg, ${ appScheme == 'dark' ? '#99a8a6 -200px, black 200px' : '#b6ebff -296px, white 171px' }) ; border: 1px solid ${ appScheme == 'dark' ? 'white' : '#b5b5b5' } !important ; color: ${ appScheme == 'dark' ? 'white' : 'black' }; transform: translateX(-3px) translateY(7px) ; /* offset to move-in from */ transition: var(--fg-transition) ; /* fade-in + move-in */ -webkit-transition: var(--fg-transition) ; -moz-transition: var(--fg-transition) ; -o-transition: var(--fg-transition) ; -ms-transition: var(--fg-transition) } ${ env.browser.isMobile ? '' : `[class$=-modal] button:hover { transform: var(--modal-btn-zoom) }`} ${ app.config.fgAnimationsDisabled ? '' : `[class$=-modal] button { ${ env.browser.isMobile ? '' : 'will-change: transform ;' } transition: var(--modal-btn-transition) ; -webkit-transition: var(--modal-btn-transition) ; -moz-transition: var(--modal-btn-transition) ; -o-transition: var(--modal-btn-transition) ; -ms-transition: var(--modal-btn-transition) }`}` ) }, update: { width: 489, available() { const updateAvailModal = modals.alert(`🚀 ${app.msgs.alert_updateAvail}!`, // title `${app.msgs.alert_newerVer} ${app.name} ` // msg + `(v${app.latestVer}) ${app.msgs.alert_isAvail}! ` + '<a target="_blank" rel="noopener" style="font-size: 0.93rem" href="' + `${app.urls.github}/commits/main/greasemonkey/${app.slug}.user.js` + `">${app.msgs.link_viewChanges}</a>`, function update() { // button modals.safeWinOpen(`${app.urls.update.gm}?t=${Date.now()}`) }, '', modals.update.width ) if (!env.browser.language.startsWith('en')) { // localize labels const updateBtns = updateAvailModal.querySelectorAll('button') updateBtns[1].textContent = app.msgs.btnLabel_update updateBtns[0].textContent = app.msgs.btnLabel_dismiss } return updateAvailModal }, unavailable() { return modals.alert(`${app.msgs.alert_upToDate}!`, // title `${app.name} (v${app.version}) ${app.msgs.alert_isUpToDate}!`, // msg '', '', modals.update.width ) } } } // Run MAIN routine menus.toolbar.register() // Init UI props env.ui = { app: { scheme: app.config.scheme || ui.getScheme() }, site: { scheme: ui.getScheme() }} if (!app.config.aiSafetyWarned) { modals.alert(`⚠️ ${app.msgs.alert_importantNotice}:`, `<b>${app.name}</b> ${app.msgs.alert_poweredByAI}:\n\n` + `• <b>${app.msgs.alert_aiCanMakeMistakes}</b> - ${app.msgs.alert_alwaysVerifyInfo}\n` + `• <b>${app.msgs.alert_doubleCheckDecisions}</b> - ${app.msgs.alert_dontRelySolelyOnAI}\n` + `• <b>${app.msgs.alert_notAsub}</b> - ${app.msgs.alert_forProMedOrLegalMatters}\n\n` + `${app.msgs.alert_useResponsibly}!`, null, null, 388 ) settings.save('aiSafetyWarned', true) } // Create/ID/classify/listenerize/stylize APP container app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in snippet' }) themes.apply(app.config.theme) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) update.appStyle() ;['rpg', 'rpw'].forEach(cssType => // rising particles document.head.append(dom.create.style(GM_getResourceText(`${cssType}CSS`)))) // APPEND to Brave app.parentDivSelector = env.browser.isMobile ? '#results' : '.sidebar' app.parentDiv = await new Promise(resolve => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) resolve(appDivParent) else new MutationObserver((_, obs) => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) { obs.disconnect() ; resolve(appDivParent) } }).observe(document.body, { childList: true, subtree: true }) }) setTimeout(() => { app.parentDiv.prepend(app.div) ; ui.visibilizeOverflow() setTimeout(() => app.div.classList.add('active'), 100) // fade in }, env.scriptManager.name == 'Violentmonkey' ? 1000 : 0) // delay in VM to avoid mutation bug https://github.com/KudoAI/bravegpt/issues/123 // Init footer CTA to share feedback const braveClassList = 'feedback svelte-8js1iq' app.footerContent = dom.create.anchor('#', app.msgs.link_shareFeedback, { target: '_self', class: braveClassList }) app.footerContent.onclick = () => modals.open('feedback') // AUTO-GEN reply or show STANDBY mode app.msgChain = [] ; const searchQuery = new URL(location.href).searchParams.get('q') if (!app.config.autoGetDisabled || app.config.autoSummarize // Auto-Gen on || (app.config.prefixEnabled || app.config.suffixEnabled) // or Manual-Gen on && [app.config.prefixEnabled && location.href.includes('q=%2F'), // prefix required/present app.config.suffixEnabled // suffix required/present && /q=.*?(?:%3F|?|%EF%BC%9F)(?:&|$)/.test(location.href) ].filter(Boolean).length == (app.config.prefixEnabled + app.config.suffixEnabled) // validate both Manual-Gen modes ) { // auto-gen reply app.msgChain.push({ time: Date.now(), role: 'user', content: app.config.autoSummarize ? prompts.create('summarizeResults') : searchQuery }) get.reply({ msgs: app.msgChain, src: 'query' }) } else { // show Standby mode show.reply({ standby: true }) if (!app.config.rqDisabled) get.related(searchQuery) .then(queries => show.related(queries)) .catch(err => { log.error(err.message) ; api.tryNew({ caller: get.related }) }) } saveAppDiv() // to fight Brave Svelte mutations // Monitor SCHEME PREF changes to update app scheme if auto-scheme mode new MutationObserver(handleSchemePrefChange).observe( // class changes from Brave Search theme settings document.documentElement, { attributes: true, attributeFilter: ['class'] }) window.matchMedia('(prefers-color-scheme: dark)').addEventListener( // for browser/system scheme pref changes 'change', () => requestAnimationFrame(handleSchemePrefChange)) function handleSchemePrefChange() { if (app.config.scheme) return // since light/dark hard-set const displayedScheme = ui.getScheme() if (env.ui.app.scheme != displayedScheme) update.scheme(displayedScheme) } // Observe DOM for need to re-insert app div new MutationObserver((_, obs) => { if (!document.getElementById(app.slug)) { restoreAppDiv() ; obs.disconnect() } }).observe(document.body, { subtree: true, childList: true }) function saveAppDiv() { if (restoreAppDiv.restored) return ; saveAppDiv.html = app.div.innerHTML } function restoreAppDiv() { log.caller = 'restoreAppDiv()' log.debug(`Restoring ${app.name} from mutation...`) app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in active snippet' }) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) app.div.innerHTML = saveAppDiv.html if (app.div.querySelector(`.${app.slug}-header-btn`)) ui.addListeners.btns.appHeader() app.div.querySelectorAll(`.${app.slug}-standby-btn`).forEach((btn, idx) => btn.onclick = show.reply[`${['query', 'summarize'][idx]}BtnClickHandler`]) show.codeCornerBtns() if (app.div.querySelector(`.${app.slug}-chatbar-btn`)) ui.addListeners.replySection() document.querySelector(app.parentDivSelector).prepend(app.div) ; ui.visibilizeOverflow() restoreAppDiv.restored = true } })(): Tech & Electronics

Tech Shoppers Do More Research Than Anyone. Are You There When They're Looking?

Tech buyers are the most research-intensive shoppers on the internet.

Continue reading in your free Engagemii portal

Free signup unlocks the full article plus your personalized AEO fix list for ([^<]+)<\/title>/i)[1] .replace(/\s*[—|/]+\s*/g, ' ') // convert symbols to space for hyphen-casing .replace(/\.{2,}/g, '') // strip ellipsis .toLowerCase().trim().replace(/\s+/g, '-') // hyphen-case + '.html' const href = URL.createObjectURL(new Blob([responseText], { type: 'text/html' })) const a = dom.create.anchor(href, '', { download, style: 'display: none' }) document.body.append(a) ; a.click() ; a.remove() ; URL.revokeObjectURL(href) }, onerror: err => log.error('Failed to download chat:', err) }) } ] ) // Prefix icon to title const modalTitle = shareChatModal.querySelector('h2'), titleIcon = icons.create({ key: 'speechBalloons' }) titleIcon.style.cssText = `height: 28px ; width: 28px ; position: relative ; top: 7px ; right: 8px ; fill: ${ env.ui.app.scheme == 'dark' ? 'white' : 'black' }` modalTitle.prepend(titleIcon) // Hide Dismiss button, localize other labels const modalBtns = shareChatModal.querySelectorAll('button') modalBtns[0].style.display = 'none' // hide Dismiss button if (!env.browser.language.startsWith('en')) // localize button labels modalBtns.forEach(btn => { if (/copy/i.test(btn.textContent)) btn.textContent = `${app.msgs.tooltip_copy} URL` else if (/visit/i.test(btn.textContent)) btn.textContent = app.msgs.btnLabel_visitPage else if (/download/i.test(btn.textContent)) btn.textContent = `${app.msgs.btnLabel_download} ${string.toTitleCase(app.msgs.btnLabel_convo)}` }) // Style elements shareChatModal.style.wordBreak = 'break-all' // since URL really long shareChatModal.querySelector('h2').style.justifySelf = 'center' shareChatModal.querySelector('p').style.cssText = 'text-align: center ; margin: 10px 0 -24px' shareChatModal.querySelector('.modal-buttons').style.cssText = 'justify-content: center' return shareChatModal }, stylize() { const { scheme: appScheme } = env.ui.app if (!this.styles?.isConnected) document.head.append(this.styles ||= dom.create.style()) this.styles.textContent = ( // Vars `:root { --modal-btn-zoom: scale(1.055) ; --modal-btn-transition: transform 0.15s ease ; --settings-li-transition: transform 0.1s ease ; /* for Settings entry hover-zoom */ --fg-transition: opacity 0.65s cubic-bezier(0.165,0.84,0.44,1), /* fade-in */ transform 0.55s cubic-bezier(0.165,0.84,0.44,1) !important ; /* move-in */ --bg-transition: background-color 0.25s ease !important } /* dim */` // Main modal styles + `@keyframes modal-zoom-fade-out { 0% { opacity: 1 } 50% { opacity: 0.25 ; transform: scale(1.05) } 100% { opacity: 0 ; transform: scale(1.35) } } .chatgpt-modal > div { background-color: white !important ; color: #202124 ; ${ env.browser.isCompact ? 'padding: 25px 31px !important' : '' } } .chatgpt-modal p { margin: 14px 0 -20px 4px ; font-size: 18px } /* pos/size modal msg */ .chatgpt-modal a { color: #${ appScheme == 'dark' ? '00cfff' : '1e9ebb' } !important } .modal-buttons { margin: 38px 0 1px ${ env.browser.isMobile ? 0 : -7 }px !important ; width: 100% } .chatgpt-modal button { /* this.alert() buttons */ min-width: 123px ; padding: ${ env.browser.isMobile ? '5px' : '4px 8px' } !important ; cursor: pointer ; border-radius: 0 !important ; height: 39px ; border: 1px solid ${ appScheme == 'dark' ? 'white' : 'black' }!important } .primary-modal-btn { background: black !important ; color: white !important } .chatgpt-modal button:hover { --btn-shadow: ${ appScheme == 'light' ? '2px 1px 43px #00cfff70' : '2px 1px 54px #00cfff' }; color: inherit !important ; /* remove color hack */ background-color: rgb(${ appScheme == 'light' ? '192 223 227 / 5%' : '43 156 171 / 43%' }) !important } ${ appScheme == 'dark' ? // darkmode chatgpt.alert() styles `.chatgpt-modal > div, .chatgpt-modal button:not(.primary-modal-btn) { color: white !important } .primary-modal-btn { background: #00cfff !important ; color: black !important } .chatgpt-modal a { color: #00cfff !important }` : '' } .${modals.class} { display: grid ; place-items: center } /* for centered icon/logo */ [class*=modal-close-btn] { position: absolute !important ; float: right ; top: 14px !important ; right: 16px !important ; cursor: pointer ; width: 33px ; height: 33px ; border-radius: 20px } [class*=modal-close-btn] path {${ appScheme == 'dark' ? 'stroke: white ; fill: white' : 'stroke: #9f9f9f ; fill: #9f9f9f' }} ${ appScheme == 'dark' ? // invert dark mode hover paths '[class*=modal-close-btn]:hover path { stroke: black ; fill: black }' : '' } [class*=modal-close-btn]:hover { background-color: #f2f2f2 } /* hover underlay */ [class*=modal-close-btn] svg { margin: 11.5px } /* center SVG for hover underlay */ [class*=-modal] h2 { font-size: 26px ; line-height: 32px ; padding: 0 ; margin: 4px 0 -1px !important ; ${ env.browser.isMobile ? 'text-align: center' // center on mobile : 'justify-self: start' }} /* left-align on desktop */ [class*=-modal] p { justify-self: start ; font-size: 20px } [class*=-modal] button { font-size: 14px !important ; background: none } [class*=-modal-bg] { pointer-events: auto ; /* override any disabling from site modals */ position: fixed ; top: 0 ; left: 0 ; width: 100% ; height: 100% ; /* expand to full view-port */ display: flex ; justify-content: center ; align-items: center ; z-index: 9999 ; /* align */ transition: var(--bg-transition) ; /* dim */ -webkit-transition: var(--bg-transition) ; -moz-transition: var(--bg-transition) ; -o-transition: var(--bg-transition) ; -ms-transition: var(--bg-transition) } [class*=-modal-bg].animated > div { z-index: 13456 ; opacity: 0.98 ; transform: translateX(0) translateY(0) } [class$=-modal] { /* native modals + chatgpt.alert()s */ position: absolute ; /* to be click-draggable */ opacity: 0 ; /* to fade-in */ background-image: linear-gradient(180deg, ${ appScheme == 'dark' ? '#99a8a6 -200px, black 200px' : '#b6ebff -296px, white 171px' }) ; border: 1px solid ${ appScheme == 'dark' ? 'white' : '#b5b5b5' } !important ; color: ${ appScheme == 'dark' ? 'white' : 'black' }; transform: translateX(-3px) translateY(7px) ; /* offset to move-in from */ transition: var(--fg-transition) ; /* fade-in + move-in */ -webkit-transition: var(--fg-transition) ; -moz-transition: var(--fg-transition) ; -o-transition: var(--fg-transition) ; -ms-transition: var(--fg-transition) } ${ env.browser.isMobile ? '' : `[class$=-modal] button:hover { transform: var(--modal-btn-zoom) }`} ${ app.config.fgAnimationsDisabled ? '' : `[class$=-modal] button { ${ env.browser.isMobile ? '' : 'will-change: transform ;' } transition: var(--modal-btn-transition) ; -webkit-transition: var(--modal-btn-transition) ; -moz-transition: var(--modal-btn-transition) ; -o-transition: var(--modal-btn-transition) ; -ms-transition: var(--modal-btn-transition) }`}` ) }, update: { width: 489, available() { const updateAvailModal = modals.alert(`🚀 ${app.msgs.alert_updateAvail}!`, // title `${app.msgs.alert_newerVer} ${app.name} ` // msg + `(v${app.latestVer}) ${app.msgs.alert_isAvail}! ` + '<a target="_blank" rel="noopener" style="font-size: 0.93rem" href="' + `${app.urls.github}/commits/main/greasemonkey/${app.slug}.user.js` + `">${app.msgs.link_viewChanges}</a>`, function update() { // button modals.safeWinOpen(`${app.urls.update.gm}?t=${Date.now()}`) }, '', modals.update.width ) if (!env.browser.language.startsWith('en')) { // localize labels const updateBtns = updateAvailModal.querySelectorAll('button') updateBtns[1].textContent = app.msgs.btnLabel_update updateBtns[0].textContent = app.msgs.btnLabel_dismiss } return updateAvailModal }, unavailable() { return modals.alert(`${app.msgs.alert_upToDate}!`, // title `${app.name} (v${app.version}) ${app.msgs.alert_isUpToDate}!`, // msg '', '', modals.update.width ) } } } // Run MAIN routine menus.toolbar.register() // Init UI props env.ui = { app: { scheme: app.config.scheme || ui.getScheme() }, site: { scheme: ui.getScheme() }} if (!app.config.aiSafetyWarned) { modals.alert(`⚠️ ${app.msgs.alert_importantNotice}:`, `<b>${app.name}</b> ${app.msgs.alert_poweredByAI}:\n\n` + `• <b>${app.msgs.alert_aiCanMakeMistakes}</b> - ${app.msgs.alert_alwaysVerifyInfo}\n` + `• <b>${app.msgs.alert_doubleCheckDecisions}</b> - ${app.msgs.alert_dontRelySolelyOnAI}\n` + `• <b>${app.msgs.alert_notAsub}</b> - ${app.msgs.alert_forProMedOrLegalMatters}\n\n` + `${app.msgs.alert_useResponsibly}!`, null, null, 388 ) settings.save('aiSafetyWarned', true) } // Create/ID/classify/listenerize/stylize APP container app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in snippet' }) themes.apply(app.config.theme) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) update.appStyle() ;['rpg', 'rpw'].forEach(cssType => // rising particles document.head.append(dom.create.style(GM_getResourceText(`${cssType}CSS`)))) // APPEND to Brave app.parentDivSelector = env.browser.isMobile ? '#results' : '.sidebar' app.parentDiv = await new Promise(resolve => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) resolve(appDivParent) else new MutationObserver((_, obs) => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) { obs.disconnect() ; resolve(appDivParent) } }).observe(document.body, { childList: true, subtree: true }) }) setTimeout(() => { app.parentDiv.prepend(app.div) ; ui.visibilizeOverflow() setTimeout(() => app.div.classList.add('active'), 100) // fade in }, env.scriptManager.name == 'Violentmonkey' ? 1000 : 0) // delay in VM to avoid mutation bug https://github.com/KudoAI/bravegpt/issues/123 // Init footer CTA to share feedback const braveClassList = 'feedback svelte-8js1iq' app.footerContent = dom.create.anchor('#', app.msgs.link_shareFeedback, { target: '_self', class: braveClassList }) app.footerContent.onclick = () => modals.open('feedback') // AUTO-GEN reply or show STANDBY mode app.msgChain = [] ; const searchQuery = new URL(location.href).searchParams.get('q') if (!app.config.autoGetDisabled || app.config.autoSummarize // Auto-Gen on || (app.config.prefixEnabled || app.config.suffixEnabled) // or Manual-Gen on && [app.config.prefixEnabled && location.href.includes('q=%2F'), // prefix required/present app.config.suffixEnabled // suffix required/present && /q=.*?(?:%3F|?|%EF%BC%9F)(?:&|$)/.test(location.href) ].filter(Boolean).length == (app.config.prefixEnabled + app.config.suffixEnabled) // validate both Manual-Gen modes ) { // auto-gen reply app.msgChain.push({ time: Date.now(), role: 'user', content: app.config.autoSummarize ? prompts.create('summarizeResults') : searchQuery }) get.reply({ msgs: app.msgChain, src: 'query' }) } else { // show Standby mode show.reply({ standby: true }) if (!app.config.rqDisabled) get.related(searchQuery) .then(queries => show.related(queries)) .catch(err => { log.error(err.message) ; api.tryNew({ caller: get.related }) }) } saveAppDiv() // to fight Brave Svelte mutations // Monitor SCHEME PREF changes to update app scheme if auto-scheme mode new MutationObserver(handleSchemePrefChange).observe( // class changes from Brave Search theme settings document.documentElement, { attributes: true, attributeFilter: ['class'] }) window.matchMedia('(prefers-color-scheme: dark)').addEventListener( // for browser/system scheme pref changes 'change', () => requestAnimationFrame(handleSchemePrefChange)) function handleSchemePrefChange() { if (app.config.scheme) return // since light/dark hard-set const displayedScheme = ui.getScheme() if (env.ui.app.scheme != displayedScheme) update.scheme(displayedScheme) } // Observe DOM for need to re-insert app div new MutationObserver((_, obs) => { if (!document.getElementById(app.slug)) { restoreAppDiv() ; obs.disconnect() } }).observe(document.body, { subtree: true, childList: true }) function saveAppDiv() { if (restoreAppDiv.restored) return ; saveAppDiv.html = app.div.innerHTML } function restoreAppDiv() { log.caller = 'restoreAppDiv()' log.debug(`Restoring ${app.name} from mutation...`) app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in active snippet' }) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) app.div.innerHTML = saveAppDiv.html if (app.div.querySelector(`.${app.slug}-header-btn`)) ui.addListeners.btns.appHeader() app.div.querySelectorAll(`.${app.slug}-standby-btn`).forEach((btn, idx) => btn.onclick = show.reply[`${['query', 'summarize'][idx]}BtnClickHandler`]) show.codeCornerBtns() if (app.div.querySelector(`.${app.slug}-chatbar-btn`)) ui.addListeners.replySection() document.querySelector(app.parentDivSelector).prepend(app.div) ; ui.visibilizeOverflow() restoreAppDiv.restored = true } })().

Source & Attribution

Scored by Engagemii on June 7, 2026. Methodology: engagemii.com/aeo/methodology

Source URL: https://engagemii.com/aeo/brands/gm-bravegpt

Cite this score: Engagemii (2026). "AEO Score for ([^<]+)<\/title>/i)[1] .replace(/\s*[—|/]+\s*/g, ' ') // convert symbols to space for hyphen-casing .replace(/\.{2,}/g, '') // strip ellipsis .toLowerCase().trim().replace(/\s+/g, '-') // hyphen-case + '.html' const href = URL.createObjectURL(new Blob([responseText], { type: 'text/html' })) const a = dom.create.anchor(href, '', { download, style: 'display: none' }) document.body.append(a) ; a.click() ; a.remove() ; URL.revokeObjectURL(href) }, onerror: err => log.error('Failed to download chat:', err) }) } ] ) // Prefix icon to title const modalTitle = shareChatModal.querySelector('h2'), titleIcon = icons.create({ key: 'speechBalloons' }) titleIcon.style.cssText = `height: 28px ; width: 28px ; position: relative ; top: 7px ; right: 8px ; fill: ${ env.ui.app.scheme == 'dark' ? 'white' : 'black' }` modalTitle.prepend(titleIcon) // Hide Dismiss button, localize other labels const modalBtns = shareChatModal.querySelectorAll('button') modalBtns[0].style.display = 'none' // hide Dismiss button if (!env.browser.language.startsWith('en')) // localize button labels modalBtns.forEach(btn => { if (/copy/i.test(btn.textContent)) btn.textContent = `${app.msgs.tooltip_copy} URL` else if (/visit/i.test(btn.textContent)) btn.textContent = app.msgs.btnLabel_visitPage else if (/download/i.test(btn.textContent)) btn.textContent = `${app.msgs.btnLabel_download} ${string.toTitleCase(app.msgs.btnLabel_convo)}` }) // Style elements shareChatModal.style.wordBreak = 'break-all' // since URL really long shareChatModal.querySelector('h2').style.justifySelf = 'center' shareChatModal.querySelector('p').style.cssText = 'text-align: center ; margin: 10px 0 -24px' shareChatModal.querySelector('.modal-buttons').style.cssText = 'justify-content: center' return shareChatModal }, stylize() { const { scheme: appScheme } = env.ui.app if (!this.styles?.isConnected) document.head.append(this.styles ||= dom.create.style()) this.styles.textContent = ( // Vars `:root { --modal-btn-zoom: scale(1.055) ; --modal-btn-transition: transform 0.15s ease ; --settings-li-transition: transform 0.1s ease ; /* for Settings entry hover-zoom */ --fg-transition: opacity 0.65s cubic-bezier(0.165,0.84,0.44,1), /* fade-in */ transform 0.55s cubic-bezier(0.165,0.84,0.44,1) !important ; /* move-in */ --bg-transition: background-color 0.25s ease !important } /* dim */` // Main modal styles + `@keyframes modal-zoom-fade-out { 0% { opacity: 1 } 50% { opacity: 0.25 ; transform: scale(1.05) } 100% { opacity: 0 ; transform: scale(1.35) } } .chatgpt-modal > div { background-color: white !important ; color: #202124 ; ${ env.browser.isCompact ? 'padding: 25px 31px !important' : '' } } .chatgpt-modal p { margin: 14px 0 -20px 4px ; font-size: 18px } /* pos/size modal msg */ .chatgpt-modal a { color: #${ appScheme == 'dark' ? '00cfff' : '1e9ebb' } !important } .modal-buttons { margin: 38px 0 1px ${ env.browser.isMobile ? 0 : -7 }px !important ; width: 100% } .chatgpt-modal button { /* this.alert() buttons */ min-width: 123px ; padding: ${ env.browser.isMobile ? '5px' : '4px 8px' } !important ; cursor: pointer ; border-radius: 0 !important ; height: 39px ; border: 1px solid ${ appScheme == 'dark' ? 'white' : 'black' }!important } .primary-modal-btn { background: black !important ; color: white !important } .chatgpt-modal button:hover { --btn-shadow: ${ appScheme == 'light' ? '2px 1px 43px #00cfff70' : '2px 1px 54px #00cfff' }; color: inherit !important ; /* remove color hack */ background-color: rgb(${ appScheme == 'light' ? '192 223 227 / 5%' : '43 156 171 / 43%' }) !important } ${ appScheme == 'dark' ? // darkmode chatgpt.alert() styles `.chatgpt-modal > div, .chatgpt-modal button:not(.primary-modal-btn) { color: white !important } .primary-modal-btn { background: #00cfff !important ; color: black !important } .chatgpt-modal a { color: #00cfff !important }` : '' } .${modals.class} { display: grid ; place-items: center } /* for centered icon/logo */ [class*=modal-close-btn] { position: absolute !important ; float: right ; top: 14px !important ; right: 16px !important ; cursor: pointer ; width: 33px ; height: 33px ; border-radius: 20px } [class*=modal-close-btn] path {${ appScheme == 'dark' ? 'stroke: white ; fill: white' : 'stroke: #9f9f9f ; fill: #9f9f9f' }} ${ appScheme == 'dark' ? // invert dark mode hover paths '[class*=modal-close-btn]:hover path { stroke: black ; fill: black }' : '' } [class*=modal-close-btn]:hover { background-color: #f2f2f2 } /* hover underlay */ [class*=modal-close-btn] svg { margin: 11.5px } /* center SVG for hover underlay */ [class*=-modal] h2 { font-size: 26px ; line-height: 32px ; padding: 0 ; margin: 4px 0 -1px !important ; ${ env.browser.isMobile ? 'text-align: center' // center on mobile : 'justify-self: start' }} /* left-align on desktop */ [class*=-modal] p { justify-self: start ; font-size: 20px } [class*=-modal] button { font-size: 14px !important ; background: none } [class*=-modal-bg] { pointer-events: auto ; /* override any disabling from site modals */ position: fixed ; top: 0 ; left: 0 ; width: 100% ; height: 100% ; /* expand to full view-port */ display: flex ; justify-content: center ; align-items: center ; z-index: 9999 ; /* align */ transition: var(--bg-transition) ; /* dim */ -webkit-transition: var(--bg-transition) ; -moz-transition: var(--bg-transition) ; -o-transition: var(--bg-transition) ; -ms-transition: var(--bg-transition) } [class*=-modal-bg].animated > div { z-index: 13456 ; opacity: 0.98 ; transform: translateX(0) translateY(0) } [class$=-modal] { /* native modals + chatgpt.alert()s */ position: absolute ; /* to be click-draggable */ opacity: 0 ; /* to fade-in */ background-image: linear-gradient(180deg, ${ appScheme == 'dark' ? '#99a8a6 -200px, black 200px' : '#b6ebff -296px, white 171px' }) ; border: 1px solid ${ appScheme == 'dark' ? 'white' : '#b5b5b5' } !important ; color: ${ appScheme == 'dark' ? 'white' : 'black' }; transform: translateX(-3px) translateY(7px) ; /* offset to move-in from */ transition: var(--fg-transition) ; /* fade-in + move-in */ -webkit-transition: var(--fg-transition) ; -moz-transition: var(--fg-transition) ; -o-transition: var(--fg-transition) ; -ms-transition: var(--fg-transition) } ${ env.browser.isMobile ? '' : `[class$=-modal] button:hover { transform: var(--modal-btn-zoom) }`} ${ app.config.fgAnimationsDisabled ? '' : `[class$=-modal] button { ${ env.browser.isMobile ? '' : 'will-change: transform ;' } transition: var(--modal-btn-transition) ; -webkit-transition: var(--modal-btn-transition) ; -moz-transition: var(--modal-btn-transition) ; -o-transition: var(--modal-btn-transition) ; -ms-transition: var(--modal-btn-transition) }`}` ) }, update: { width: 489, available() { const updateAvailModal = modals.alert(`🚀 ${app.msgs.alert_updateAvail}!`, // title `${app.msgs.alert_newerVer} ${app.name} ` // msg + `(v${app.latestVer}) ${app.msgs.alert_isAvail}! ` + '<a target="_blank" rel="noopener" style="font-size: 0.93rem" href="' + `${app.urls.github}/commits/main/greasemonkey/${app.slug}.user.js` + `">${app.msgs.link_viewChanges}</a>`, function update() { // button modals.safeWinOpen(`${app.urls.update.gm}?t=${Date.now()}`) }, '', modals.update.width ) if (!env.browser.language.startsWith('en')) { // localize labels const updateBtns = updateAvailModal.querySelectorAll('button') updateBtns[1].textContent = app.msgs.btnLabel_update updateBtns[0].textContent = app.msgs.btnLabel_dismiss } return updateAvailModal }, unavailable() { return modals.alert(`${app.msgs.alert_upToDate}!`, // title `${app.name} (v${app.version}) ${app.msgs.alert_isUpToDate}!`, // msg '', '', modals.update.width ) } } } // Run MAIN routine menus.toolbar.register() // Init UI props env.ui = { app: { scheme: app.config.scheme || ui.getScheme() }, site: { scheme: ui.getScheme() }} if (!app.config.aiSafetyWarned) { modals.alert(`⚠️ ${app.msgs.alert_importantNotice}:`, `<b>${app.name}</b> ${app.msgs.alert_poweredByAI}:\n\n` + `• <b>${app.msgs.alert_aiCanMakeMistakes}</b> - ${app.msgs.alert_alwaysVerifyInfo}\n` + `• <b>${app.msgs.alert_doubleCheckDecisions}</b> - ${app.msgs.alert_dontRelySolelyOnAI}\n` + `• <b>${app.msgs.alert_notAsub}</b> - ${app.msgs.alert_forProMedOrLegalMatters}\n\n` + `${app.msgs.alert_useResponsibly}!`, null, null, 388 ) settings.save('aiSafetyWarned', true) } // Create/ID/classify/listenerize/stylize APP container app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in snippet' }) themes.apply(app.config.theme) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) update.appStyle() ;['rpg', 'rpw'].forEach(cssType => // rising particles document.head.append(dom.create.style(GM_getResourceText(`${cssType}CSS`)))) // APPEND to Brave app.parentDivSelector = env.browser.isMobile ? '#results' : '.sidebar' app.parentDiv = await new Promise(resolve => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) resolve(appDivParent) else new MutationObserver((_, obs) => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) { obs.disconnect() ; resolve(appDivParent) } }).observe(document.body, { childList: true, subtree: true }) }) setTimeout(() => { app.parentDiv.prepend(app.div) ; ui.visibilizeOverflow() setTimeout(() => app.div.classList.add('active'), 100) // fade in }, env.scriptManager.name == 'Violentmonkey' ? 1000 : 0) // delay in VM to avoid mutation bug https://github.com/KudoAI/bravegpt/issues/123 // Init footer CTA to share feedback const braveClassList = 'feedback svelte-8js1iq' app.footerContent = dom.create.anchor('#', app.msgs.link_shareFeedback, { target: '_self', class: braveClassList }) app.footerContent.onclick = () => modals.open('feedback') // AUTO-GEN reply or show STANDBY mode app.msgChain = [] ; const searchQuery = new URL(location.href).searchParams.get('q') if (!app.config.autoGetDisabled || app.config.autoSummarize // Auto-Gen on || (app.config.prefixEnabled || app.config.suffixEnabled) // or Manual-Gen on && [app.config.prefixEnabled && location.href.includes('q=%2F'), // prefix required/present app.config.suffixEnabled // suffix required/present && /q=.*?(?:%3F|?|%EF%BC%9F)(?:&|$)/.test(location.href) ].filter(Boolean).length == (app.config.prefixEnabled + app.config.suffixEnabled) // validate both Manual-Gen modes ) { // auto-gen reply app.msgChain.push({ time: Date.now(), role: 'user', content: app.config.autoSummarize ? prompts.create('summarizeResults') : searchQuery }) get.reply({ msgs: app.msgChain, src: 'query' }) } else { // show Standby mode show.reply({ standby: true }) if (!app.config.rqDisabled) get.related(searchQuery) .then(queries => show.related(queries)) .catch(err => { log.error(err.message) ; api.tryNew({ caller: get.related }) }) } saveAppDiv() // to fight Brave Svelte mutations // Monitor SCHEME PREF changes to update app scheme if auto-scheme mode new MutationObserver(handleSchemePrefChange).observe( // class changes from Brave Search theme settings document.documentElement, { attributes: true, attributeFilter: ['class'] }) window.matchMedia('(prefers-color-scheme: dark)').addEventListener( // for browser/system scheme pref changes 'change', () => requestAnimationFrame(handleSchemePrefChange)) function handleSchemePrefChange() { if (app.config.scheme) return // since light/dark hard-set const displayedScheme = ui.getScheme() if (env.ui.app.scheme != displayedScheme) update.scheme(displayedScheme) } // Observe DOM for need to re-insert app div new MutationObserver((_, obs) => { if (!document.getElementById(app.slug)) { restoreAppDiv() ; obs.disconnect() } }).observe(document.body, { subtree: true, childList: true }) function saveAppDiv() { if (restoreAppDiv.restored) return ; saveAppDiv.html = app.div.innerHTML } function restoreAppDiv() { log.caller = 'restoreAppDiv()' log.debug(`Restoring ${app.name} from mutation...`) app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in active snippet' }) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) app.div.innerHTML = saveAppDiv.html if (app.div.querySelector(`.${app.slug}-header-btn`)) ui.addListeners.btns.appHeader() app.div.querySelectorAll(`.${app.slug}-standby-btn`).forEach((btn, idx) => btn.onclick = show.reply[`${['query', 'summarize'][idx]}BtnClickHandler`]) show.codeCornerBtns() if (app.div.querySelector(`.${app.slug}-chatbar-btn`)) ui.addListeners.replySection() document.querySelector(app.parentDivSelector).prepend(app.div) ; ui.visibilizeOverflow() restoreAppDiv.restored = true } })()." Retrieved from https://engagemii.com/aeo/brands/gm-bravegpt

Licensed under CC BY 4.0. You may reuse this data with attribution: a visible link to engagemii.com.

Powered by Engagemii - AI Brand Discovery and AEO Platform