2026-08-11 12:17:09 -07:00
import { a as e , i as t } from "../sxng-core.min.js" ; import { t as n } from "./DK4yUVpy.min.js" ; var r = 5 , i = 12 , a = 300 , o = 1e3 , s = class s extends e { messages = [ ] ; context = [ ] ; controller ; constructor ( ) { super ( ` ai_summary ` ) } async run ( ) { let e = document . getElementById ( ` ai_summary ` ) ; if ( e ) try { let { query : t } = e . dataset ; if ( ! t ) return ; e . dataset . grounding === ` 1 ` && ( this . context = s . collectContext ( ) ) , this . wireControls ( e ) , this . messages . push ( { role : ` user ` , content : t } ) , await this . exchange ( e ) } catch ( t ) { s . showError ( e , t ) } } async post ( ) { } static collectContext ( ) { let e = [ ] ; for ( let t of document . querySelectorAll ( ` #urls article.result ` ) ) { if ( e . length >= r ) break ; let n = t . querySelector ( ` h3 a ` ) ; n && e . push ( { title : ( n . textContent ? ? ` ` ) . trim ( ) . slice ( 0 , a ) , url : n . href , snippet : ( t . querySelector ( ` .content ` ) ? . textContent ? ? ` ` ) . trim ( ) . slice ( 0 , o ) } ) } return e } wireControls ( e ) { let t = e . querySelector ( ` .ai-summary-body ` ) , r = e . querySelector ( ` .ai-summary-more ` ) , a = e . querySelector ( ` .ai-summary-followup ` ) ; n ( t ) , n ( r ) , n ( a ) , r . addEventListener ( ` click ` , ( ) => { let e = t . classList . toggle ( ` collapsed ` ) ; r . textContent = e ? r . dataset . btnTextCollapsed ? ? ` ` : r . dataset . btnTextNotCollapsed ? ? ` ` , a . classList . toggle ( ` invisible ` , e ) } ) , a . addEventListener ( ` submit ` , t => { t . preventDefault ( ) ; let r = a . querySelector ( ` input ` ) ; n ( r ) ; let o = r . value . trim ( ) ; if ( ! o || this . controller ) return ; r . value = ` ` , this . messages . push ( { role : ` user ` , content : o } ) , this . messages . splice ( 0 , this . messages . length - ( i - 1 ) ) ; let s = Object . assign ( document . createElement ( ` p ` ) , { textContent : o , className : ` ai-summary-question ` } ) ; e . querySelector ( ` .ai-summary-answers ` ) ? . append ( s ) , this . exchange ( e ) } ) } async exchange ( e ) { let t = e . querySelector ( ` .ai-summary-answers ` ) ; n ( t ) ; let r = Object . assign ( document . createElement ( ` p ` ) , { className : ` ai-summary-content typing ` } ) ; t . append ( r ) ; let i = new AbortController ; this . controller = i ; let a = ` ` , o = t => { if ( ! t . trim ( ) ) return ; let n = JSON . parse ( t ) ; if ( n . error ) throw Error ( n . error ) ; if ( n . delta && ( a += n . delta , r . textContent = a , this . updateMoreButton ( e ) ) , n . done && n . model ) { let t = e . querySelector ( ` .ai-summary-model ` ) ; t && ( t . textContent = n . model ) } } ; try { let e = await fetch ( ` ./ai_summary ` , { method : ` POST ` , headers : { "Content-Type" : ` application/json ` } , body : JSON . stringify ( { messages : this . messages , context : this . context } ) , signal : i . signal } ) ; if ( ! e . ok ) throw Error ( ` HTTP ${ e . status } ` ) ; if ( e . body ) { let t = e . body . getReader ( ) , n = new TextDecoder , r = ` ` ; for ( ; ; ) { let { done : e , value : i } = await t . read ( ) ; if ( e ) break ; r += n . decode ( i , { stream : ! 0 } ) ; let a = r . split ( `
2026-08-11 12:17:09 -07:00
` ) ) o ( e ) } this . messages . push ( { role : ` assistant ` , content : a } ) } catch ( t ) { s . showError ( e , t ) } finally { r . classList . remove ( ` typing ` ) , this . controller = void 0 , this . updateMoreButton ( e ) } } static showError ( e , n ) { console . error ( ` Error loading AI summary: ` , n ) ; let r = t . translations ? . error _loading _ai _summary ? ? ` Error loading the AI summary ` , i = n instanceof Error && n . message ? ` ( ${ n . message } ) ` : ` ` , a = Object . assign ( document . createElement ( ` div ` ) , { textContent : ` ${ r } ${ i } ` , className : ` dialog-error ` } ) ; a . setAttribute ( ` role ` , ` alert ` ) , ( e . querySelector ( ` .ai-summary-answers ` ) ? ? e ) . append ( a ) } updateMoreButton ( e ) { let t = e . querySelector ( ` .ai-summary-body ` ) , n = e . querySelector ( ` .ai-summary-more ` ) ; t && n && ( ! t . classList . contains ( ` collapsed ` ) || t . scrollHeight > t . clientHeight + 4 ) && n . classList . remove ( ` invisible ` ) } } ; export { s as default } ;