// ==UserScript== // @name Better ChatGPT // @namespace https://github.com/thenolle/userscripts // @version 1.3.0 // @description Prompts, batch runs, code blocks, exports and usage tracking for ChatGPT. // @author Nolly // @license PolyForm-Strict-1.0.0 // @homepageURL https://github.com/thenolle/userscripts/tree/master/ai/chatgpt // @supportURL https://github.com/thenolle/userscripts/issues // @updateURL https://raw.githubusercontent.com/thenolle/userscripts/dist/better-chatgpt/better-chatgpt.meta.js // @downloadURL https://raw.githubusercontent.com/thenolle/userscripts/dist/better-chatgpt/better-chatgpt.user.js // @icon https://www.google.com/s2/favicons?sz=64&domain=chatgpt.com // @match https://chatgpt.com/* // @match https://chat.openai.com/* // @noframes // @connect raw.githubusercontent.com // @grant GM_getValue // @grant GM_setValue // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_xmlhttpRequest // @grant unsafeWindow // ==/UserScript== (()=>{var ll=Object.defineProperty;var pl=(e)=>e;function dl(e,t){this[e]=pl.bind(null,t)}var cl=(e,t)=>{for(var r in t)ll(e,r,{get:t[r],enumerable:!0,configurable:!0,set:dl.bind(t,r)})};var $r={};cl($r,{click:()=>Ht,closed:()=>Ft,escape:()=>Gd,find:()=>be,info:()=>K,inside:()=>Kd,point:()=>He,press:()=>zd,wait:()=>_t});var Jr=0,xt=()=>Jr>0,Yt=async(e)=>{Jr++;try{return await e()}finally{Jr--}};var Ze={banner:"color: #c4b5fd; font-weight: bold; font-size: 13px; line-height: 1.5",success:"color: #86efac; font-weight: bold",info:"color: #93c5fd",warning:"color: #fcd34d; font-weight: bold",error:"color: #fca5a5; font-weight: bold",muted:"color: #a1a1aa"},Zr=(e)=>{let t=Math.max(0,Math.floor((42-e.length)/2));return`│${" ".repeat(t)}${e}${" ".repeat(Math.max(0,42-e.length-t))}│`},re=(e)=>{let t=`[${e}]`,r=new Set,n={banner(o){let i=Zr(""),s=[`╭${"─".repeat(42)}╮`,i,Zr(e.toUpperCase()),i,Zr(`v${o}`),i,`╰${"─".repeat(42)}╯`];console.log(`%c${s.join(` `)}`,Ze.banner)},success:(o,...i)=>console.log(`%c${t} ✔ ${o}`,Ze.success,...i),info:(o,...i)=>console.info(`%c${t} ℹ ${o}`,Ze.info,...i),warning:(o,...i)=>console.warn(`%c${t} ⚠ ${o}`,Ze.warning,...i),error:(o,...i)=>console.error(`%c${t} ✖ ${o}`,Ze.error,...i),debug:(o,...i)=>console.debug(`%c${t} · ${o}`,Ze.muted,...i),errorOnce(o,i){let s=`${o}:${i instanceof Error?i.message:String(i)}`;if(r.has(s))return;r.add(s),n.error(o,i)}};return n};var ul=re("core"),Io=(e)=>{try{return document.evaluate(e,document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue}catch(t){return ul.errorOnce(`Invalid XPath: ${e}`,t),null}};var a=(e,t,r)=>{let n=document.createElement(e);if(t)n.className=t;if(r!==void 0)n.textContent=r;return n};var ve=(e)=>{if(e instanceof Element)return e;return e instanceof Node?e.parentElement:null},Xt=(e="data-us-root")=>({attribute:e,mark(t){return t.setAttribute(e,""),t},isOwn(t){let r=t instanceof Element?t:t?.parentElement;return Boolean(r?.closest(`[${e}]`))}});class en{listeners=new Map;on(e,t){let r=this.listeners.get(e)??new Set;return r.add(t),this.listeners.set(e,r),()=>r.delete(t)}emit(e,t,r){for(let n of this.listeners.get(e)??[])try{n(t)}catch(o){r?.(o)}}once(e,t){let r=this.on(e,(n)=>{r(),t(n)});return r}}class tn{teardowns=[];add(e){return this.teardowns.push(e),e}listen(e,t,r,n){return e.addEventListener(t,r,n),this.add(()=>e.removeEventListener(t,r,n))}interval(e,t){let r=window.setInterval(e,t);return this.add(()=>window.clearInterval(r))}timeout(e,t){let r=window.setTimeout(e,t);return this.add(()=>window.clearTimeout(r))}dispose(){let e=this.teardowns.reverse();this.teardowns=[];for(let t of e)try{t()}catch{continue}}}class A{context;defaultEnabled=!0;scope=new tn;active=!1;constructor(e){this.context=e}get enabled(){return this.context.storage.get(`module:${this.id}`,this.defaultEnabled)}set enabled(e){this.context.storage.set(`module:${this.id}`,e)}onEnable(){}onDisable(){}menuEntries(){return[]}commands(){return[]}toggle(){this.enabled=!this.enabled,this.context.logger.info(`${this.name} ${this.enabled?"enabled":"disabled"}.`),this.context.refreshMenu(),this.context.requestUpdate()}sync(){let e=this.enabled;if(e&&!this.active)this.active=!0,this.onEnable();else if(!e&&this.active)this.active=!1,this.scope.dispose(),this.onDisable()}}var ml=(e,{method:t="GET",headers:r,body:n,timeout:o=15000}={})=>{if(typeof GM_xmlhttpRequest!=="function")return fetch(e,{method:t,headers:r,body:n,cache:"no-store"}).then((i)=>{if(!i.ok)throw Error(`HTTP ${i.status}`);return i.text()});return new Promise((i,s)=>GM_xmlhttpRequest({method:t,url:e,timeout:o,...r?{headers:r}:{},...n!==void 0?{data:n}:{},onload:(l)=>l.status>=200&&l.status<300?i(l.responseText):s(Error(`HTTP ${l.status}`)),onerror:()=>s(Error("Network error")),ontimeout:()=>s(Error("Request timed out"))}))},Jt=(e,t)=>ml(e,t===void 0?{}:{timeout:t});var hl=typeof GM_registerMenuCommand==="function"&&typeof GM_unregisterMenuCommand==="function";class rn{ids=[];sync(e){if(!hl)return;for(let t of this.ids)GM_unregisterMenuCommand(t);this.ids=e.map(({label:t,action:r})=>GM_registerMenuCommand(t,r))}}var fl=(e)=>typeof e==="number"&&Number.isFinite(e),Zt=(e)=>fl(e)&&e>0;var cu=re("core"),er=()=>{if(typeof unsafeWindow<"u"&&unsafeWindow)return unsafeWindow;return window.wrappedJSObject??null};class nn{options;timer=0;running=!1;lastRun=0;constructor(e){this.options=e}get active(){return this.timer!==0}start(e){if(this.timer)return this;return this.timer=window.setInterval(()=>this.poll(),this.options.tick??5000),document.addEventListener("visibilitychange",this.onVisible),e?.add(()=>this.stop()),this}stop(){window.clearInterval(this.timer),this.timer=0,document.removeEventListener("visibilitychange",this.onVisible)}async trigger(){if(this.running)return;this.running=!0,this.lastRun=Date.now();try{await this.options.task()}catch(e){this.options.onError?.(e)}finally{this.running=!1}}interval(){return typeof this.options.interval==="function"?this.options.interval():this.options.interval}poll(){if(document.visibilityState==="hidden")return;if(Date.now()-this.lastRun>=this.interval())this.trigger()}onVisible=()=>{if(document.visibilityState!=="visible")return;if(Date.now()-this.lastRun>=(this.options.staleAfter??this.interval()))this.trigger()}}var on=({owner:e,repo:t,branch:r,slug:n,dir:o=n})=>{let i=`https://raw.githubusercontent.com/${e}/${t}`,s=`https://github.com/${e}/${t}`;return{home:`${s}/tree/${r}/${o}`,namespace:s,issues:`${s}/issues`,releases:`${s}/releases`,sponsor:`https://github.com/sponsors/${e}`,meta:`${i}/dist/${n}/${n}.meta.js`,install:`${i}/dist/${n}/${n}.user.js`,rawFile:(l)=>`${i}/${r}/${o}/${l}`}};var Ho=()=>new DOMException("Aborted","AbortError"),Te=(e)=>e instanceof DOMException&&e.name==="AbortError",X=(e,t)=>new Promise((r,n)=>{if(t?.aborted){n(Ho());return}let o=()=>{window.clearTimeout(i),n(Ho())},i=window.setTimeout(()=>{t?.removeEventListener("abort",o),r()},e);t?.addEventListener("abort",o,{once:!0})}),xe=async(e,{timeout:t=1e4,interval:r=100,signal:n}={})=>{let o=Date.now()+t;for(;;){let i=e();if(i)return i;if(Date.now()>=o)return null;await X(r,n)}};var _o=async(e,{attempts:t=3,delay:r=500,factor:n=2,maxDelay:o=30000,signal:i,shouldRetry:s}={})=>{let l=r;for(let p=1;;p++)try{return await e(p)}catch(d){if(p>=t||Te(d)||s?.(d,p)===!1)throw d;await X(l,i),l=Math.min(o,l*n)}};var tr=typeof GM_getValue==="function"&&typeof GM_setValue==="function";class Fo{options;listeners=new Map;constructor(e){this.options=e}get(e,t){if(tr)return GM_getValue(this.gmKey(e),t);try{let r=localStorage.getItem(this.localKey(e));return r===null?t:JSON.parse(r)}catch{return t}}set(e,t){if(tr)GM_setValue(this.gmKey(e),t);else try{localStorage.setItem(this.localKey(e),JSON.stringify(t))}catch{return}for(let r of this.listeners.get(e)??[])r(t)}remove(e){if(tr&&typeof GM_deleteValue==="function")GM_deleteValue(this.gmKey(e));else if(!tr)localStorage.removeItem(this.localKey(e))}subscribe(e,t){let r=this.listeners.get(e)??new Set;return r.add(t),this.listeners.set(e,r),()=>r.delete(t)}bucket(e,t){return{get:()=>this.get(e,t),set:(r)=>this.set(e,r),update:(r)=>this.set(e,r(this.get(e,t))),reset:()=>this.set(e,t),subscribe:(r)=>this.subscribe(e,r)}}gmKey(e){return`${this.options.gmPrefix??""}${e}`}localKey(e){return`${this.options.namespace}:${e}`}}var rr=(e)=>new Fo(e);var gl={childList:!0,subtree:!0},bl=(e)=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");class sn{options;logger;storage;events=new en;features=[];menu=new rn;ui;observer=new MutationObserver((e)=>this.handleMutations(e));scheduled=!1;initialized=!1;timer=null;href="";constructor(e){this.options=e;this.logger=re(e.name),this.storage=rr({namespace:e.id,...e.storage}),this.ui=e.ui??Xt()}requestUpdate=()=>{if(this.scheduled||!this.initialized)return;this.scheduled=!0,requestAnimationFrame(()=>{this.scheduled=!1,this.update()})};openSettings=()=>this.options.openSettings?.(this);refreshMenu=()=>this.menu.sync(this.collectMenuEntries());getFeatures=()=>this.features;getCommands=()=>this.features.flatMap((e)=>{let t=e.name,r={id:`${e.id}:toggle`,group:t,title:`${e.enabled?"Disable":"Enable"} ${e.name}`,run:()=>e.toggle()};if(!e.enabled)return[r];let n=e.menuEntries().map((i)=>({id:`${e.id}:${i.id??bl(i.label)}`,group:t,title:i.label,run:i.action})),o=e.commands().map((i)=>({...i,id:`${e.id}:${i.id}`,group:t}));return[r,...n,...o]});runCommand=(e)=>{let t=this.getCommands().find((r)=>r.id===e);if(!t)return!1;return t.run(),!0};register(e){return this.features.push(e(this)),this}start(){if(this.options.clearConsole)console.clear();if(!document.body){this.logger.warning("Document body not available. Waiting for DOM..."),document.addEventListener("DOMContentLoaded",()=>this.start(),{once:!0});return}this.logger.banner(this.options.version),this.logger.info("Starting userscript..."),this.observer.observe(document.body,this.options.observe??gl),window.addEventListener("popstate",this.requestUpdate),window.setInterval(this.requestUpdate,this.options.safetyInterval??2000),this.initialize()}collectMenuEntries(){return this.features.flatMap((e)=>[{label:`${e.enabled?"Disable":"Enable"} ${e.name}`,action:()=>e.toggle()},...e.menuEntries()])}isReady(){return(this.options.isReady??(()=>Boolean(document.body)))()}initialize(){if(this.initialized||this.timer!==null||!this.isReady())return;this.logger.info("Interface detected. Waiting for UI stabilization..."),this.timer=window.setTimeout(()=>{if(this.timer=null,this.initialized||!this.isReady())return;this.initialized=!0,this.href=location.href,this.update(),this.refreshMenu(),this.logger.success("Initialized successfully.");for(let e of this.features)this.logger.info(`${e.name}: ${e.enabled?"enabled":"disabled"}`);this.events.emit("ready",void 0,(e)=>this.logger.errorOnce("ready listener failed.",e))},this.options.initializationDelay??500)}update(){if(location.href!==this.href)this.href=location.href,this.events.emit("navigate",this.href,(e)=>this.logger.errorOnce("navigate listener failed.",e));for(let e of this.features)try{e.sync(),e.run()}catch(t){this.logger.errorOnce(`${e.name} failed.`,t)}}handleMutations(e){if(e.every(({target:t})=>this.ui.isOwn(t)))return;if(this.initialized)this.requestUpdate();else this.initialize()}}var yl=(e)=>/^\d+$/.test(e)?Number(e):e,No=(e)=>{let[t=""]=e.trim().replace(/^v/i,"").split("+"),r=t.indexOf("-"),n=r===-1?t:t.slice(0,r),o=r===-1?"":t.slice(r+1);return{numbers:n.split(".").map((i)=>Number.parseInt(i,10)||0),pre:o?o.split(".").map(yl):[]}},vl=(e,t)=>{if(typeof e==="number"&&typeof t==="number")return Math.sign(e-t);if(typeof e==="number")return-1;if(typeof t==="number")return 1;return et?1:0},xl=(e,t)=>{let r=No(e),n=No(t);for(let o=0;o0?1:-1}if(!r.pre.length&&!n.pre.length)return 0;if(!r.pre.length)return 1;if(!n.pre.length)return-1;for(let o=0;o0?1:-1}return 0},Bo=(e,t)=>xl(e,t)>0;var P=(e,t)=>{let r=document.getElementById(e),n=r??a("style");if(n.id=e,n.textContent=t,!r)document.head.appendChild(n)};var an={interval:300000,startupDelay:1500,startupMinGap:20000};class ln{options;latest;error=null;inflight=null;announced=new Set;constructor(e){this.options=e;this.latest=e.storage.get(this.key("latest"),null)}get checkedAt(){return this.options.storage.get(this.key("last-check"),0)}get skipped(){return this.options.storage.get(this.key("dismissed"),null)}get available(){return this.latest&&Bo(this.latest,this.options.current)?this.latest:null}get pending(){let e=this.available;return e&&e!==this.skipped?e:null}start(e){let t=this.options.interval??an.interval;this.evaluate(!1),e.timeout(()=>void this.check(!1,this.options.startupMinGap??an.startupMinGap),this.options.startupDelay??an.startupDelay),new nn({task:async()=>{if(Date.now()-this.checkedAt>=t)await this.check(!1)},interval:t,tick:Math.min(30000,Math.max(1000,t/4)),staleAfter:t,onError:(r)=>this.options.logger?.warning("Update poll failed.",r)}).start(e)}skip(e=this.latest){if(!e)return;this.options.storage.set(this.key("dismissed"),e),this.options.onChange?.()}unskip(){this.options.storage.remove(this.key("dismissed")),this.options.onChange?.()}check(e=!1,t=0){return this.inflight??=this.run(e,t).finally(()=>{this.inflight=null}),this.inflight}async run(e,t){if(!e&&this.latest!==null&&Date.now()-this.checkedAtJt(i,1e4)),n=await _o(()=>r(`${this.options.metaUrl}?t=${Date.now()}`),{attempts:2,delay:800}),o=/@version\s+(\S+)/.exec(n)?.[1];if(!o)throw Error("No version found in the published metadata.");this.latest=o,this.error=null,this.options.storage.set(this.key("latest"),o),this.options.storage.set(this.key("last-check"),Date.now())}catch(r){return this.error=r instanceof Error?r:Error(String(r)),this.options.logger?.warning("Update check failed.",r),this.options.onChange?.(),"failed"}return this.options.onChange?.(),this.evaluate(e)}evaluate(e){let t=this.available;if(!t)return"current";if(!e&&this.skipped===t)return"skipped";if(e||!this.announced.has(t))this.announced.add(t),this.options.onAvailable({version:t,current:this.options.current});return"available"}key(e){return`${this.options.namespace??"updater"}:${e}`}}var wl={total:null,source:null},Uo=({reported:e,remaining:t,observedPeak:r,fallback:n})=>{let o=Zt(t)?t:0,i=Math.max(o,r);if(Zt(e)&&e>=o)return{total:e,source:"api"};if(Zt(n)&&i<=n)return{total:n,source:"default"};if(i>0)return{total:i,source:"observed"};return wl};var z=async(e)=>{try{return await navigator.clipboard.writeText(e),!0}catch{let t=document.createElement("textarea");t.value=e,t.style.cssText="position:fixed;opacity:0;pointer-events:none",document.body.appendChild(t),t.select();let r=document.execCommand("copy");return t.remove(),r}};var qo=new WeakSet,jo=(e)=>qo.has(e),wt=(e,t)=>{let r=new KeyboardEvent("keydown",{key:"Enter",code:"Enter",keyCode:13,which:13,shiftKey:t,bubbles:!0,cancelable:!0,composed:!0});return qo.add(r),e.dispatchEvent(r)},nr=(e)=>{let t=e;for(let r=0;t&&r<8;r++){let n=t.querySelector('button[type="submit"], button[aria-label*="submit" i], button[aria-label*="send" i]');if(n&&!n.disabled)return n;t=t.parentElement}return null};var pn=["textarea","input:not([type])",'input[type="text"]','input[type="search"]','input[type="email"]','input[type="url"]','input[type="tel"]','[contenteditable="true"]','[contenteditable="plaintext-only"]','[role="textbox"]'].join(", "),Sl=(e)=>{let t=e.getBoundingClientRect(),r=getComputedStyle(e);return t.width>0&&t.height>0&&r.visibility!=="hidden"&&r.display!=="none"},Ko=(e)=>e.replace(/\s+/g," ").trim(),Go=(e)=>e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement,_=(e)=>{if(Go(e))return e.value;return e.innerText??e.textContent??""},zo=(e)=>!e.isConnected||_(e).trim()==="",et=(e)=>{let t=[e.getAttribute("aria-label")??"",e.title,e.textContent??""].join(" ").toLowerCase();return e.type==="submit"||/\b(send|submit|ask)\b/.test(t)},cn=(e,t)=>Ko(_(e))===Ko(t),Wo=(e,t,r)=>{e.dispatchEvent(new InputEvent("input",{bubbles:!0,composed:!0,inputType:t,data:r}))},El=(e,t)=>{let r=new DataTransfer;r.setData("text/plain",t);let n=new ClipboardEvent("paste",{clipboardData:r,bubbles:!0,cancelable:!0,composed:!0});return e.dispatchEvent(n),n.defaultPrevented},kl=(e)=>{let t=e instanceof HTMLTextAreaElement?HTMLTextAreaElement.prototype:HTMLInputElement.prototype,r=Object.getOwnPropertyDescriptor(t,"value")?.set;return r?(n)=>r.call(e,n):null},Cl=(e,t)=>{e.focus();let r=kl(e);if(r)r(t);else e.value=t;try{e.setSelectionRange(t.length,t.length)}catch{}return Wo(e,t?"insertText":"deleteContent",t||null),e.value===t},Tl=(e)=>{let t=document.createRange();t.selectNodeContents(e);let r=window.getSelection();return r?.removeAllRanges(),r?.addRange(t),t},Ll=(e,t)=>{let r=window.getSelection();if(!r)return!1;let n=Tl(e);if(n.deleteContents(),t){let o=document.createTextNode(t);n.insertNode(o),n.setStartAfter(o)}else n.selectNodeContents(e);return n.collapse(!0),r.removeAllRanges(),r.addRange(n),Wo(e,t?"insertText":"deleteContent",t||null),cn(e,t)},dn=async(e,t,r=300)=>{let o=Math.ceil(r/30);for(let i=0;i{let{isOwnUi:t}=e,r=(c)=>e.rejectEditable?.(c)??!1,n=(c)=>!t(c)&&!r(c)&&Sl(c),o=(c)=>{let u=ve(c)?.closest(pn)??null;return u&&!r(u)?u:null},i=()=>{let c=e.locateComposer?.();if(c&&n(c))return c;let u=document.activeElement;if(u instanceof HTMLElement&&u.matches(pn)&&n(u))return u;return[...document.querySelectorAll(pn)].filter((f)=>n(f)&&!f.hasAttribute("disabled")&&!f.hasAttribute("readonly")).at(-1)??null},s=(c)=>e.findSendButton?e.findSendButton(c):nr(c),l=async(c,u)=>{if(!c.isConnected)return!1;if(c.hasAttribute("disabled")||c.hasAttribute("readonly")||c.getAttribute("aria-disabled")==="true")return!1;if(c.focus(),Go(c))return Cl(c,u),dn(c,u);if(!c.isContentEditable&&c.getAttribute("role")!=="textbox")return!1;if(u){if(El(c,u),await dn(c,u,150))return!0}if(!Ll(c,u))return!1;return dn(c,u)},p=async(c)=>{for(let u=0;u<12;u++){let h=s(c);if(h)return h;await X(100)}return null};return{editableFrom:o,findComposer:i,writeComposer:l,sendComposer:async(c)=>{if(!c.isConnected)return!1;if(e.sendWith!=="button"){let h=!wt(c,!1);if(await X(h?500:150),zo(c))return!0}return(e.sendWith==="button"?await p(c):s(c))?.click(),await X(500),zo(c)},attachFile:(c,u)=>{let h=new DataTransfer;h.items.add(u);let f=[...document.querySelectorAll('input[type="file"]')].find((S)=>!t(S)&&!S.disabled);if(f)return f.files=h.files,f.dispatchEvent(new Event("change",{bubbles:!0,composed:!0})),f.files?.length===1;let v=new ClipboardEvent("paste",{clipboardData:h,bubbles:!0,cancelable:!0,composed:!0});return c.dispatchEvent(v),v.defaultPrevented}}};var we=(e,t,r="text/plain")=>{let n=URL.createObjectURL(new Blob([t],{type:r})),o=document.createElement("a");o.href=n,o.download=e,o.hidden=!0,document.body.appendChild(o);try{o.click()}finally{o.remove(),window.setTimeout(()=>URL.revokeObjectURL(n),60000)}};var un=null,mn=(e)=>{un=e},k=()=>{if(!un)throw Error("configurePlatform() must run before platform features are used.");return un},Ke=(e)=>{let t=null,r=()=>t??=e();return new Proxy({},{get:(n,o)=>{let i=r(),s=Reflect.get(i,o,i);return typeof s==="function"?s.bind(i):s},set:(n,o,i)=>Reflect.set(r(),o,i),has:(n,o)=>Reflect.has(r(),o)})},x=Ke(()=>k().storage),de=Ke(()=>k().logger),N=()=>k().composer.findComposer(),W=(e,t)=>k().composer.writeComposer(e,t),tt=(e)=>k().composer.sendComposer(e),Vo=(e)=>k().composer.editableFrom(e);var ze=()=>k().generation.isGenerating(),or=(e)=>k().generation.waitForResponse(e),rt=(e,t)=>k().sendPrompt(e,t);var Ml={limit:7500,autoIntercept:!0,balanced:!0,mode:"parts"},nt=(e,t={})=>({...Ml,...t,...e.get("message-splitter:settings",{})}),Yo=(e,t)=>e.set("message-splitter:settings",t);var Al=/```[\s\S]*?(?:```|$)/g,Pl=/[\u3040-\u30ff\u3400-\u9fff\uac00-\ud7af]/g,B=(e,t=!1)=>{if(!e)return 0;let r=t?e.length:0,n=t?"":e.replace(Al,(i)=>(r+=i.length,"")),o=n.match(Pl)?.length??0;return Math.ceil((n.length-o)/4+o+r/3.2)};var hn=null,Xo=(e)=>{hn=e},b=()=>{if(!hn)throw Error("configureUi() must run before any UI is created.");return hn},D=(e)=>b().marker.mark(e),Pe=(e)=>b().marker.isOwn(e);var Jo=` .bp-themed { --bp-bg: hsl(0 0% 100%); --bp-fg: hsl(240 10% 3.9%); --bp-muted: hsl(240 3.8% 46.1%); --bp-border: hsl(240 5.9% 90%); --bp-accent: hsl(240 4.8% 95.9%); --bp-track: hsl(240 5% 78%); --bp-ring: hsl(240 5% 64.9%); --bp-green: hsl(142 71% 40%); --bp-yellow: hsl(38 92% 45%); --bp-red: hsl(0 84% 55%); } @media (prefers-color-scheme: dark) { .bp-themed { --bp-bg: hsl(240 10% 5%); --bp-fg: hsl(0 0% 98%); --bp-muted: hsl(240 5% 64.9%); --bp-border: hsl(240 3.7% 17%); --bp-accent: hsl(240 3.7% 13%); --bp-track: hsl(240 3.7% 28%); --bp-green: hsl(142 71% 45%); --bp-yellow: hsl(38 92% 50%); --bp-red: hsl(0 84% 60%); } } `,Zo=` .bp-dialog { position: fixed; inset: 0; margin: auto; height: fit-content; width: min(var(--bp-width, 560px), calc(100vw - 32px)); max-width: none; max-height: min(86vh, 820px); padding: 0; overflow: hidden; border: 1px solid var(--bp-border); border-radius: 14px; background: var(--bp-bg); color: var(--bp-fg); box-shadow: 0 24px 60px -12px rgb(0 0 0 / 35%); font-family: inherit; font-size: 13px; line-height: 1.5; } .bp-dialog[open] { display: flex; flex-direction: column; animation: bp-dialog-in 160ms ease-out; } .bp-dialog::backdrop { background: rgb(0 0 0 / 55%); backdrop-filter: blur(6px); animation: bp-fade-in 160ms ease-out; } .bp-dialog *, .bp-dialog *::before, .bp-dialog *::after { box-sizing: border-box; } @keyframes bp-dialog-in { from { opacity: 0; transform: translateY(8px) scale(.98); } to { opacity: 1; transform: none; } } @keyframes bp-fade-in { from { opacity: 0; } to { opacity: 1; } } @media (prefers-reduced-motion: reduce) { .bp-dialog[open], .bp-dialog::backdrop { animation: none; } } .bp-dialog-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; padding: 18px 20px 14px; border-bottom: 1px solid var(--bp-border); } .bp-dialog-title { margin: 0; font-size: 16px; font-weight: 600; letter-spacing: -.02em; } .bp-dialog-description { margin: 3px 0 0; color: var(--bp-muted); font-size: 12px; } .bp-dialog-body { flex: 1; min-height: 0; padding: 16px 20px; overflow-y: auto; overscroll-behavior: contain; } .bp-dialog-footer { display: flex; align-items: center; justify-content: flex-end; gap: 8px; padding: 12px 20px; border-top: 1px solid var(--bp-border); } .bp-dialog-footer:empty { display: none; } .bp-icon-button { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 28px; height: 28px; border: 0; border-radius: 7px; background: transparent; color: var(--bp-muted); font: inherit; font-size: 18px; line-height: 1; cursor: pointer; } .bp-icon-button:hover { background: var(--bp-accent); color: var(--bp-fg); } @media (max-width: 520px) { .bp-dialog-header, .bp-dialog-body, .bp-dialog-footer { padding-right: 14px; padding-left: 14px; } } `,ei=` .bp-button { display: inline-flex; align-items: center; justify-content: center; min-height: 32px; padding: 0 12px; border: 1px solid var(--bp-border); border-radius: 8px; background: transparent; color: var(--bp-fg); font: inherit; font-size: 12px; font-weight: 500; cursor: pointer; transition: background 120ms ease, opacity 120ms ease; } .bp-button:hover:not(:disabled) { background: var(--bp-accent); } .bp-button:disabled { opacity: .55; cursor: progress; } .bp-button-primary { border-color: var(--bp-fg); background: var(--bp-fg); color: var(--bp-bg); } .bp-button-primary:hover:not(:disabled) { background: var(--bp-fg); opacity: .88; } .bp-dialog button:focus-visible, .bp-dialog summary:focus-visible { outline: 2px solid var(--bp-ring); outline-offset: 2px; } .bp-stack { display: flex; flex-direction: column; gap: 8px; } .bp-section { margin-bottom: 20px; } .bp-section:last-child { margin-bottom: 0; } .bp-section-heading { display: flex; align-items: center; justify-content: space-between; margin: 0 0 10px; color: var(--bp-muted); font-size: 10px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; } .bp-hint { margin: 12px 0 0; color: var(--bp-muted); font-size: 12px; } .bp-actions { display: flex; flex-wrap: wrap; gap: 6px; margin: 6px 0 2px; } .bp-switch { position: relative; display: flex; align-items: center; justify-content: space-between; gap: 14px; padding: 10px 12px; border: 1px solid var(--bp-border); border-radius: 10px; cursor: pointer; transition: background 120ms ease; } .bp-switch:hover { background: var(--bp-accent); } .bp-switch-text { display: flex; flex-direction: column; min-width: 0; } .bp-switch input { position: absolute; opacity: 0; pointer-events: none; } .bp-switch-track { position: relative; flex-shrink: 0; width: 34px; height: 20px; border-radius: 999px; background: var(--bp-track); transition: background 140ms ease; } .bp-switch-track::after { content: ''; position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; border-radius: 50%; background: var(--bp-bg); box-shadow: 0 1px 3px rgb(0 0 0 / 30%); transition: transform 140ms ease; } .bp-switch input:checked + .bp-switch-track { background: var(--bp-fg); } .bp-switch input:checked + .bp-switch-track::after { transform: translateX(14px); } .bp-switch input:focus-visible + .bp-switch-track { outline: 2px solid var(--bp-ring); outline-offset: 2px; } .bp-data-list { overflow: hidden; border: 1px solid var(--bp-border); border-radius: 10px; } .bp-data-row { display: flex; align-items: center; justify-content: space-between; gap: 16px; min-height: 34px; padding: 7px 12px; border-bottom: 1px solid var(--bp-border); } .bp-data-row:last-child { border-bottom: 0; } .bp-data-label { color: var(--bp-muted); } .bp-data-value { overflow-wrap: anywhere; font-weight: 500; text-align: right; } .bp-data-value.positive { color: var(--bp-green); } .bp-data-value.negative { color: var(--bp-red); } .bp-empty { padding: 14px; border: 1px dashed var(--bp-border); border-radius: 10px; color: var(--bp-muted); text-align: center; } .bp-error { padding: 11px 12px; border: 1px solid hsl(0 84% 60% / 30%); border-radius: 10px; background: hsl(0 84% 60% / 8%); color: var(--bp-red); } .bp-badge { display: inline-flex; align-items: center; padding: 2px 9px; border-radius: 999px; background: var(--bp-accent); color: var(--bp-muted); font-size: 10px; font-weight: 600; letter-spacing: .02em; white-space: nowrap; } .bp-badge.healthy { background: hsl(142 71% 45% / 14%); color: var(--bp-green); } .bp-badge.low { background: hsl(38 92% 50% / 16%); color: var(--bp-yellow); } .bp-badge.critical, .bp-badge.empty { background: hsl(0 84% 60% / 14%); color: var(--bp-red); } .bp-progress { height: 5px; overflow: hidden; border-radius: 99px; background: var(--bp-accent); } .bp-progress-fill { width: 0; height: 100%; border-radius: inherit; background: var(--bp-green); transition: width 400ms ease; } .bp-progress-fill.low { background: var(--bp-yellow); } .bp-progress-fill.critical, .bp-progress-fill.empty { background: var(--bp-red); } .bp-progress-fill.timer { background: var(--bp-muted); transition: width 900ms linear; } .bp-field { display: flex; align-items: center; justify-content: space-between; gap: 14px; padding: 10px 12px; border: 1px solid var(--bp-border); border-radius: 10px; } .bp-input { min-width: 0; padding: 6px 8px; border: 1px solid var(--bp-border); border-radius: 8px; background: var(--bp-bg); color: var(--bp-fg); font: inherit; font-size: 12px; } .bp-input:focus-visible { outline: 2px solid var(--bp-ring); outline-offset: 1px; } input.bp-input[type='number'] { width: 96px; text-align: right; } textarea.bp-input { width: 100%; min-height: 64px; resize: vertical; font-family: ui-monospace, monospace; } .bp-header-btn { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 30px; height: 30px; border: 1px solid var(--bp-border); border-radius: 999px; background: var(--bp-bg); color: var(--bp-fg); cursor: pointer; transition: background 120ms ease; } .bp-header-btn:hover { background: var(--bp-accent); } .bp-header-btn:focus-visible { outline: 2px solid var(--bp-fg); outline-offset: 2px; } .bp-dialog .bp-button { min-height: 34px; border-radius: 6px; box-shadow: 0 1px 2px rgb(0 0 0 / 4%); } .bp-dialog .bp-input { min-height: 36px; border-radius: 6px; } .bp-dialog .bp-input::placeholder { color: var(--bp-muted); } .bp-dialog .bp-section-heading { color: var(--bp-fg); font-size: 12px; font-weight: 600; letter-spacing: 0; text-transform: none; } .bp-dialog .bp-data-row { align-items: flex-start; padding: 10px 12px; } .bp-dialog .bp-data-label { flex: 0 1 42%; } .bp-dialog .bp-data-value { flex: 1; font-variant-numeric: tabular-nums; } .bp-dialog .bp-actions { gap: 8px; margin-top: 10px; } .bp-dialog .bp-switch { border-radius: 8px; } `,ti=` .bp-tooltip { position: fixed; inset: auto; width: max-content; max-width: min(300px, calc(100vw - 16px)); margin: 0; padding: 0; overflow: visible; border: 1px solid var(--bp-border); border-radius: 12px; background: var(--bp-bg); color: var(--bp-fg); box-shadow: 0 12px 32px rgb(0 0 0 / 22%); font: inherit; font-size: 12px; line-height: 1.5; pointer-events: none; } .bp-tooltip:popover-open { animation: bp-tooltip-in 120ms ease-out; } .bp-tooltip *, .bp-tooltip *::before, .bp-tooltip *::after { box-sizing: border-box; } .bp-tooltip-body { padding: 12px 14px; } @keyframes bp-tooltip-in { from { opacity: 0; transform: translateY(3px); } to { opacity: 1; transform: none; } } @media (prefers-reduced-motion: reduce) { .bp-tooltip:popover-open { animation: none; } } `;var O=()=>{P(`${b().id}-ui-base`,[Jo,Zo,ei,ti].join(` `))};var Rl=` .bp-draft-meter, .bp-draft-banner { position: fixed; z-index: 99990; display: none; align-items: center; gap: 8px; padding: 4px 10px; border: 1px solid var(--bp-border); border-radius: 999px; background: var(--bp-bg); color: var(--bp-fg); box-shadow: 0 4px 14px rgb(0 0 0 / 14%); font: 11px/1.4 ui-sans-serif, system-ui, sans-serif; white-space: nowrap; } .bp-draft-meter[data-visible='true'], .bp-draft-banner[data-visible='true'] { display: inline-flex; } .bp-draft-meter[data-level='warn'] { border-color: var(--bp-yellow); color: var(--bp-yellow); } .bp-draft-meter[data-level='danger'] { border-color: var(--bp-red); color: var(--bp-red); } .bp-draft-meter button, .bp-draft-banner button { padding: 1px 8px; border: 1px solid var(--bp-border); border-radius: 999px; background: transparent; color: inherit; font: inherit; cursor: pointer; } .bp-draft-meter button:hover, .bp-draft-banner button:hover { background: var(--bp-accent); } .bp-draft-meter button[hidden] { display: none; } `,ri=()=>P(`${b().id}-draft-styles`,Rl);var $l=0.7,Dl=0.9,ir=8,Ol=(e)=>{let t=Math.floor(e/60000);if(t<1)return"just now";if(t<60)return`${t}m ago`;let r=Math.floor(t/60);return r<24?`${r}h ago`:`${Math.floor(r/24)}d ago`};class fn{meter=D(a("div","bp-draft-meter bp-themed"));meterText=a("span");splitButton=a("button",void 0,"Split");banner=D(a("div","bp-draft-banner bp-themed"));bannerText=a("span");restoreButton=a("button",void 0,"Restore");discardButton=a("button",void 0,"Discard");constructor(){O(),ri(),this.splitButton.type="button",this.splitButton.hidden=!0,this.restoreButton.type="button",this.discardButton.type="button",this.meter.append(this.meterText,this.splitButton),this.banner.append(this.bannerText,this.restoreButton,this.discardButton)}onSplit(e){this.splitButton.onclick=e}showMeter(e,t,r){let n=B(t),o=n/r,i=Math.round(r*4);this.meterText.textContent=`${t.length.toLocaleString()} / ~${i.toLocaleString()} chars · ~${n.toLocaleString()} / ${r.toLocaleString()} tokens`,this.meter.dataset.level=o>=Dl?"danger":o>=$l?"warn":"ok",this.splitButton.hidden=o<1,this.mount(this.meter),this.meter.dataset.visible="true",this.position(e)}hideMeter(){this.meter.dataset.visible="false"}showBanner(e,t,r,n){this.bannerText.textContent=`Draft from ${Ol(Date.now()-t.at)}`,this.restoreButton.onclick=r,this.discardButton.onclick=n,this.mount(this.banner),this.banner.dataset.visible="true",this.position(e)}hideBanner(){this.banner.dataset.visible="false"}position(e){let t=e.getBoundingClientRect(),r=Math.max(ir,t.top-this.meter.offsetHeight-ir);this.meter.style.top=`${r}px`,this.meter.style.left=`${Math.max(ir,t.right-this.meter.offsetWidth)}px`,this.banner.style.top=`${r}px`,this.banner.style.left=`${Math.max(ir,t.left)}px`}hideAll(){this.hideMeter(),this.hideBanner()}mount(e){if(!e.isConnected)document.body.appendChild(e)}}class gn{storage;constructor(e){this.storage=e}get(e){let t=this.read()[e];return t&&Date.now()-t.at<2592000000?t:null}set(e,t){if(!t.replace(/[\s\u200b]/g,""))return;let r=this.read();r[e]={text:t.slice(0,200000),at:Date.now()},this.write(this.prune(r))}remove(e){let t=this.read();if(!(e in t))return;delete t[e],this.write(t)}read(){return this.storage.get("draft-guard:drafts",{})}write(e){this.storage.set("draft-guard:drafts",e)}prune(e){let t=Object.entries(e).filter(([,r])=>Date.now()-r.at<2592000000);return t.sort((r,n)=>n[1].at-r[1].at),Object.fromEntries(t.slice(0,50))}}var Il=400,Hl=3000,ni="draft-guard:warn-on-close",_l="message-splitter:split",Fl=()=>location.pathname||"/",ot=(e)=>e.replace(/[\s\u200b]/g,"")!=="";class St extends A{id="draft-guard";name="Draft Guard";description="Autosaves drafts, shows a size meter and warns about unsent text.";store;overlay=new fn;wired=new WeakSet;dismissed=new Set;typed=new Set;offered=new Map;key;lastText="";saveTimer=0;sendIntentAt=0;guardAttached=!1;composer=null;constructor(e){super(e);this.store=new gn(x),this.key=this.threadKey(),this.overlay.onSplit(()=>this.context.runCommand(_l)),k().onSend(()=>{if(this.enabled&&ot(this.lastText))this.discard(this.key)}),document.addEventListener("click",this.handleClick,!0),document.addEventListener("keydown",this.handleKeydown,!0),window.addEventListener("scroll",this.reposition,!0),window.addEventListener("resize",this.reposition)}get warnOnClose(){return x.get(ni,!0)}set warnOnClose(e){x.set(ni,e)}run(){if(!this.enabled){this.teardown();return}this.syncGuard();let e=N();if(this.composer=e,!e){this.overlay.hideAll();return}this.wire(e),this.syncThread();let t=_(e);if(t!==this.lastText)this.handleChange(t);this.refreshOverlay(e,t)}menuEntries(){return[{id:"guard",label:`${this.warnOnClose?"Disable":"Enable"} Unsent-Text Warning`,action:()=>this.toggleGuard()}]}threadKey(){return Fl()}wire(e){if(this.wired.has(e))return;this.wired.add(e),e.addEventListener("input",(t)=>{if(t.isTrusted)this.typed.add(this.key);this.run()})}syncThread(){let e=this.threadKey();if(e===this.key)return;window.clearTimeout(this.saveTimer),this.key=e,this.lastText=""}handleChange(e){let t=this.lastText;if(this.lastText=e,window.clearTimeout(this.saveTimer),!ot(e)){if(ot(t)&&Date.now()-this.sendIntentAtthis.store.set(r,e),Il)}discard(e){window.clearTimeout(this.saveTimer),this.store.remove(e),this.offered.delete(e),this.dismissed.add(e),this.overlay.hideBanner()}refreshOverlay(e,t){if(ot(t))this.overlay.showMeter(e,t,nt(x,k().splitterDefaults).limit);else this.overlay.hideMeter();let r=this.key;if(this.dismissed.has(r)||this.typed.has(r)){this.offered.delete(r),this.overlay.hideBanner();return}let n=this.offered.get(r)??this.store.get(r);if(!n){this.overlay.hideBanner();return}this.offered.set(r,n),this.overlay.showBanner(e,n,()=>{this.offered.delete(r),this.dismissed.add(r),this.overlay.hideBanner(),W(e,n.text)},()=>this.discard(r))}isComposerControl(e){let t=this.composer;if(!t)return!1;let r=t.closest("form");if(r)return r.contains(e);let n=t;for(let o=0;n&&o<4;o++){if(n.contains(e))return!0;n=n.parentElement}return!1}handleClick=(e)=>{let t=ve(e.target)?.closest("button");if(!this.enabled||!t||!et(t)||!this.isComposerControl(t))return;this.sendIntentAt=Date.now(),this.dismissed.add(this.key),this.offered.delete(this.key),this.overlay.hideBanner()};handleKeydown=(e)=>{if(e.key==="Enter"&&!e.shiftKey&&!e.isComposing&&ot(this.lastText))this.sendIntentAt=Date.now()};reposition=()=>{if(this.composer?.isConnected)this.overlay.position(this.composer)};handleBeforeUnload=(e)=>{let t=this.composer??N();if(!t||!ot(_(t)))return;e.preventDefault(),e.returnValue=""};syncGuard(){if(this.warnOnClose&&!this.guardAttached)window.addEventListener("beforeunload",this.handleBeforeUnload),this.guardAttached=!0;else if(!this.warnOnClose&&this.guardAttached)window.removeEventListener("beforeunload",this.handleBeforeUnload),this.guardAttached=!1}toggleGuard(){this.warnOnClose=!this.warnOnClose,this.context.refreshMenu(),this.context.requestUpdate()}teardown(){if(this.overlay.hideAll(),this.guardAttached)window.removeEventListener("beforeunload",this.handleBeforeUnload);this.guardAttached=!1}}var Et=8,oi=10,Nl=0;class Z{anchor;renderer;options;element=D(a("div","bp-tooltip bp-themed"));showTimer=0;hideTimer=0;liveTimer=0;visible=!1;constructor(e,t,r={}){this.anchor=e;this.renderer=t;this.options=r;O(),this.element.id=`bp-tooltip-${++Nl}`,this.element.setAttribute("role","tooltip"),this.element.popover="manual",e.setAttribute("aria-describedby",this.element.id),e.addEventListener("pointerenter",this.handleEnter),e.addEventListener("pointerleave",this.handleLeave),e.addEventListener("focus",this.handleFocus),e.addEventListener("blur",this.handleLeave),e.addEventListener("keydown",this.handleKeydown),e.addEventListener("click",this.handleLeave)}show(){if(window.clearTimeout(this.hideTimer),!this.anchor.isConnected)return;if(this.renderContent(),!this.element.isConnected)document.body.appendChild(this.element);if(!this.visible)this.element.showPopover(),this.visible=!0,this.liveTimer=window.setInterval(()=>this.refresh(),1000);this.position()}hide(){if(window.clearTimeout(this.showTimer),!this.visible)return;if(this.visible=!1,window.clearInterval(this.liveTimer),this.element.matches(":popover-open"))this.element.hidePopover()}destroy(){this.hide(),this.anchor.removeEventListener("pointerenter",this.handleEnter),this.anchor.removeEventListener("pointerleave",this.handleLeave),this.anchor.removeEventListener("focus",this.handleFocus),this.anchor.removeEventListener("blur",this.handleLeave),this.anchor.removeEventListener("keydown",this.handleKeydown),this.anchor.removeEventListener("click",this.handleLeave),this.element.remove()}refresh(){if(!this.visible)return;if(!this.anchor.isConnected){this.hide();return}this.renderContent(),this.position()}handleEnter=(e)=>{if(e.pointerType==="touch")return;window.clearTimeout(this.hideTimer),window.clearTimeout(this.showTimer),this.showTimer=window.setTimeout(()=>this.show(),this.options.showDelay??120)};handleLeave=()=>{window.clearTimeout(this.showTimer),window.clearTimeout(this.hideTimer),this.hideTimer=window.setTimeout(()=>this.hide(),this.options.hideDelay??80)};handleFocus=()=>{if(this.anchor.matches(":focus-visible"))this.show()};handleKeydown=(e)=>{if(e.key==="Escape")this.hide()};renderContent(){let e=a("div","bp-tooltip-body");this.renderer(e),this.element.replaceChildren(e)}position(){let e=this.anchor.getBoundingClientRect(),t=this.element.getBoundingClientRect(),r=this.options.align==="end"?e.right-t.width:e.left,n=Math.min(Math.max(r,Et),Math.max(Et,window.innerWidth-t.width-Et)),o=e.bottom+oi,i=e.top-oi-t.height,s=o+t.height>window.innerHeight-Et&&i>=Et?i:o;this.element.style.left=`${Math.round(n)}px`,this.element.style.top=`${Math.round(s)}px`}}var ii=["config","big","prompts","batch","queue","ready","recall","context","diff"],Bl=/^(?:switch to |select |use )?(?:pro search|pro|search|deep research|research|labs?|computer|agentic(?: research)?|think|thinking)(?: mode)?$/i,bn='header, aside, dialog, [role="dialog"], [data-code-block], .cm-editor',kt=new Map,ne=null,Ul=` .bp-composer-tools { display: inline-flex; align-items: center; flex-wrap: wrap; gap: 3px; min-width: 0; max-width: 100%; margin-inline-start: 6px; pointer-events: auto; vertical-align: middle; } .bp-composer-tools > button { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; width: 30px; height: 30px; padding: 0; border: 1px solid transparent; border-radius: 6px; background: transparent; color: var(--bp-muted); cursor: pointer; pointer-events: auto; } .bp-composer-tools > button:hover { border-color: var(--bp-border); background: var(--bp-accent); color: var(--bp-fg); } .bp-composer-tools > button:focus-visible { outline: 2px solid var(--bp-ring); outline-offset: 1px; } .bp-composer-tools svg { pointer-events: none; } `,ql=(e)=>(e.getAttribute("aria-label")||e.textContent||"").replace(/\s+/g," ").trim(),jl=()=>{let e=k().composer.findComposer();if(!e?.isConnected||e.closest(bn))return null;let t=b().composerActions?.(),r=t?.submit;if(!r?.isConnected||r.closest(bn))return null;let n=e.parentElement,o=null;for(let p=0;n&&p<8;p++,n=n.parentElement){if(n===document.body||n.tagName==="MAIN")break;if(n.contains(r)){o=n;break}}if(!o)return null;let i=[...o.querySelectorAll('button, [role="tab"], [role="radio"]')].filter((p)=>{let d=p.getBoundingClientRect();return!b().marker.isOwn(p)&&!p.closest(bn)&&Bl.test(ql(p))&&d.width>0&&d.height>0}),s=i.at(-1);if(s){let p=s.parentElement;while(p&&o.contains(p)){let d=i.every((u)=>p.contains(u)),m=getComputedStyle(p).display;if(d&&(m==="flex"||m==="inline-flex")){let u=s;while(u.parentElement&&u.parentElement!==p)u=u.parentElement;return{parent:p,after:u}}if(p===o)break;p=p.parentElement}}let l=t?.first;if(l?.isConnected&&o.contains(l)&&l.parentElement)return{parent:l.parentElement,after:l};return r.parentElement?{parent:r.parentElement,after:null}:null},Kl=()=>{let e=jl();if(!e)return ne?.remove(),!1;if(!ne)ne=D(a("div","bp-composer-tools bp-themed")),ne.setAttribute("role","group"),ne.setAttribute("aria-label","Better AI composer tools"),P(`${b().id}-composer-tools`,Ul);if(e.after){if(e.after.nextElementSibling!==ne)e.after.insertAdjacentElement("afterend",ne)}else{let r=b().composerActions?.().submit;if(!r||r.parentElement!==e.parent)return!1;if(r.previousElementSibling!==ne)e.parent.insertBefore(ne,r)}return[...kt.entries()].sort(([r],[n])=>{let o=ii.indexOf(r),i=ii.indexOf(n);return(o<0?100:o)-(i<0?100:i)||r.localeCompare(n)}).forEach(([,r],n)=>{let o=ne.children[n]??null;if(o!==r)ne.insertBefore(r,o)}),!0},sr=(e,t)=>(kt.set(t,e),Kl()),ar=(e,t)=>{if(kt.get(t)===e)kt.delete(t);if(e.remove(),!kt.size)ne?.remove()};var yn="http://www.w3.org/2000/svg",zl=` .bp-config-button { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; cursor: pointer; } .bp-config-button svg { pointer-events: none; } `,Gl=()=>{let e=document.createElementNS(yn,"svg");for(let[n,o]of Object.entries({width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"}))e.setAttribute(n,o);let t=document.createElementNS(yn,"polyline");t.setAttribute("points","9 10 4 15 9 20");let r=document.createElementNS(yn,"path");return r.setAttribute("d","M20 4v7a4 4 0 0 1-4 4H4"),e.append(t,r),e};class vn{element=D(a("button","bp-config-button"));tooltip;constructor(e,t){O(),P(`${b().id}-enter-styles`,zl),this.element.type="button",this.element.setAttribute("aria-label","Configure Enter as Newline"),this.element.appendChild(Gl()),this.element.addEventListener("click",(r)=>{r.preventDefault(),r.stopPropagation(),e()}),this.tooltip=new Z(this.element,(r)=>{r.append(a("div","bp-tip-mode","Enter as Newline"),a("div","bp-tip-sub",t()),a("div","bp-tip-foot","Click to configure"))})}mount(){if(!sr(this.element,"config"))this.tooltip.hide()}unmount(){this.tooltip.hide(),ar(this.element,"config")}}var y=(e,{primary:t=!1,onClick:r}={})=>{let n=a("button",t?"bp-button bp-button-primary":"bp-button",e);if(n.type="button",r)n.addEventListener("click",r);return n},J=({label:e,hint:t,checked:r,onChange:n})=>{let o=a("label","bp-switch"),i=a("span","bp-switch-text");if(i.appendChild(a("span",void 0,e)),t)i.appendChild(a("span","bp-data-label",t));let s=a("input");return s.type="checkbox",s.checked=r,s.addEventListener("change",()=>n(s.checked)),o.append(i,s,a("span","bp-switch-track")),{wrapper:o,input:s}};var ce=(e,t,r="")=>{let n=a("div","bp-data-row");return n.append(a("span","bp-data-label",e),a("span",`bp-data-value ${r}`.trim(),t)),n},Re=({label:e,hint:t,value:r,min:n,max:o,step:i=1,onChange:s})=>{let l=a("label","bp-field"),p=a("span","bp-switch-text");if(p.appendChild(a("span",void 0,e)),t)p.appendChild(a("span","bp-data-label",t));let d=a("input","bp-input");if(d.type="number",d.value=String(r),d.step=String(i),n!==void 0)d.min=String(n);if(o!==void 0)d.max=String(o);return d.addEventListener("change",()=>{let m=Number(d.value);if(!Number.isFinite(m))return;let c=Math.min(o??1/0,Math.max(n??-1/0,m));d.value=String(c),s(c)}),l.append(p,d),{wrapper:l,input:d}},Le=(e,t,r,n)=>{let o=a("label","bp-field");o.appendChild(a("span",void 0,e));let i=a("select","bp-input");for(let s of t){let l=a("option",void 0,s.label);l.value=s.value,i.appendChild(l)}return i.value=r,i.addEventListener("change",()=>n(i.value)),o.appendChild(i),o},oe=(e,t,r)=>{let n=a("textarea","bp-input");return n.placeholder=e,n.value=t,n.rows=3,n.addEventListener("input",()=>r(n.value)),n};var R=({id:e,title:t,description:r,width:n=560})=>{O();let o=D(a("dialog","bp-dialog bp-themed"));o.id=e,o.style.setProperty("--bp-width",`${n}px`);let i={position:"fixed",inset:"0",margin:"auto",width:`min(${n}px, calc(100vw - 32px))`,height:"fit-content","min-width":"0","min-height":"0","max-width":"calc(100vw - 32px)","max-height":"min(86dvh, 820px)","box-sizing":"border-box",transform:"none",translate:"none",animation:"none"};for(let[f,v]of Object.entries(i))o.style.setProperty(f,v,"important");let s=a("header","bp-dialog-header"),l=a("div"),p=a("h2","bp-dialog-title",t);if(p.id=`${e}-title`,o.setAttribute("aria-labelledby",p.id),l.appendChild(p),r){let f=a("p","bp-dialog-description",r);f.id=`${e}-description`,o.setAttribute("aria-describedby",f.id),l.appendChild(f)}let d=a("button","bp-icon-button","×");d.type="button",d.setAttribute("aria-label","Close"),s.append(l,d);let m=a("div","bp-dialog-body"),c=a("footer","bp-dialog-footer");o.append(s,m,c);let u=()=>{if(o.open)o.close();else o.remove()};return d.addEventListener("click",u),o.addEventListener("click",(f)=>{if(f.target!==o)return;let v=o.getBoundingClientRect();if(f.clientXv.right||f.clientYv.bottom)u()}),o.addEventListener("close",()=>o.remove()),{dialog:o,body:m,footer:c,close:u,show:()=>{if(!o.isConnected)document.body.appendChild(o);if(o.open)return;o.style.setProperty("display","flex","important"),o.style.setProperty("flex-direction","column","important"),o.showModal()}}};var it=[{key:"ctrl",label:"Ctrl + Enter",flag:"ctrlKey"},{key:"alt",label:"Alt + Enter",flag:"altKey"},{key:"meta",label:"Meta / Cmd + Enter",flag:"metaKey"},{key:"shift",label:"Shift + Enter",flag:"shiftKey"}],Ct={ctrl:!0,alt:!1,meta:!0,shift:!1},si=(e)=>{let t=e.get("enter-as-newline:shortcuts",Ct),r=it.map(({key:n})=>[n,typeof t?.[n]==="boolean"?t[n]:Ct[n]]);return Object.fromEntries(r)},ai=(e,t)=>e.set("enter-as-newline:shortcuts",t),li=(e,t)=>{let r=it.filter(({flag:n})=>e[n]);return r.length===1&&t[r[0].key]},pi=(e)=>it.some(({flag:t})=>e[t]),st=(e)=>{let t=it.filter(({key:r})=>e[r]).map(({label:r})=>r);return t.length?`Sends with: ${t.join(", ")}. Plain Enter inserts a newline.`:"No send shortcut selected: messages can only be sent with the button."};var di=(e,t,r)=>{let n=`${b().id}-enter-dialog`,o=document.getElementById(n);if(o instanceof HTMLDialogElement){o.close();return}let i=R({id:n,title:"Enter as Newline",description:"Choose which keyboard shortcuts send your message.",width:440}),s={...e},l=a("p","bp-hint",st(s)),p=a("div","bp-stack"),d=new Map;for(let{key:u,label:h}of it){let{wrapper:f,input:v}=J({label:h,checked:s[u],onChange:(S)=>{s[u]=S,l.textContent=st(s)}});d.set(u,v),p.appendChild(f)}i.body.append(p,l);let m=()=>{for(let[u,h]of d)s[u]=Ct[u],h.checked=Ct[u];l.textContent=st(s)},c=()=>{t({...s}),r.success("Send shortcuts saved.",s),i.close()};i.footer.append(y("Cancel",{onClick:i.close}),y("Reset",{onClick:m}),y("Save",{primary:!0,onClick:c})),i.show()};var Wl='textarea, [contenteditable="true"], [contenteditable="plaintext-only"]',ci=(e,t=()=>!1)=>{let r=e.composedPath()[0]??e.target,n=ve(r)?.closest(Wl);if(!n?.isConnected||t(n))return null;return n instanceof HTMLTextAreaElement||n.isContentEditable?n:null},ui=(e)=>e.isComposing||e.keyCode===229,Ql=(e)=>{if(e instanceof HTMLTextAreaElement){e.setRangeText(` `,e.selectionStart,e.selectionEnd,"end"),e.dispatchEvent(new InputEvent("input",{bubbles:!0,composed:!0,inputType:"insertLineBreak",data:` `}));return}let t=window.getSelection();if(!t)return;let r=t.rangeCount>0?t.getRangeAt(0):document.createRange();if(!e.contains(r.commonAncestorContainer))r.selectNodeContents(e),r.collapse(!1);r.deleteContents();let n=document.createElement("br");r.insertNode(n),r.setStartAfter(n),r.collapse(!0),t.removeAllRanges(),t.addRange(r),e.dispatchEvent(new InputEvent("input",{bubbles:!0,composed:!0,inputType:"insertLineBreak",data:null}))},mi=(e)=>{if(wt(e,!0))Ql(e)},hi=(e)=>{if(wt(e,!1))nr(e)?.click()};class Tt extends A{id="enter-as-newline";name="Enter as Newline";description="Use Enter for newlines and configurable shortcuts to send messages.";shortcuts;attached=!1;configButton;constructor(e){super(e);this.shortcuts=si(x),this.configButton=new vn(()=>this.configure(),()=>st(this.shortcuts))}run(){if(this.enabled)this.configButton.mount();else this.configButton.unmount();if(this.enabled&&!this.attached){window.addEventListener("keydown",this.handleKeydown,!0),this.attached=!0,this.context.logger.success("Enter as Newline listener registered.");return}if(!this.enabled&&this.attached)window.removeEventListener("keydown",this.handleKeydown,!0),this.attached=!1,this.context.logger.info("Enter as Newline listener removed.")}menuEntries(){return[{label:"Configure Enter as Newline",action:()=>this.configure()}]}configure(){di(this.shortcuts,(e)=>{this.shortcuts=e,ai(x,e)},this.context.logger)}handleKeydown=(e)=>{if(!this.enabled||e.key!=="Enter"||ui(e)||jo(e))return;let t=ci(e,k().rejectEditable);if(!t)return;if(li(e,this.shortcuts)){e.preventDefault(),e.stopImmediatePropagation(),(k().send??hi)(t);return}if(pi(e))return;e.preventDefault(),e.stopImmediatePropagation(),mi(t)}}var Vl={copy:[["rect",{x:"9",y:"9",width:"13",height:"13",rx:"2"}],["path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"}]],check:[["polyline",{points:"20 6 9 17 4 12"}]],download:[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}],["polyline",{points:"7 10 12 15 17 10"}],["line",{x1:"12",y1:"15",x2:"12",y2:"3"}]],wrap:[["line",{x1:"3",y1:"6",x2:"21",y2:"6"}],["path",{d:"M3 12h15a3 3 0 1 1 0 6h-4"}],["polyline",{points:"16 16 14 18 16 20"}],["line",{x1:"3",y1:"18",x2:"10",y2:"18"}]],lines:[["line",{x1:"10",y1:"6",x2:"21",y2:"6"}],["line",{x1:"10",y1:"12",x2:"21",y2:"12"}],["line",{x1:"10",y1:"18",x2:"21",y2:"18"}],["path",{d:"M4 6h1v4"}],["path",{d:"M4 10h2"}],["path",{d:"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1"}]],fold:[["polyline",{points:"7 20 12 15 17 20"}],["polyline",{points:"7 4 12 9 17 4"}]],file:[["path",{d:"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z"}],["polyline",{points:"14 2 14 8 20 8"}],["line",{x1:"16",y1:"13",x2:"8",y2:"13"}],["line",{x1:"16",y1:"17",x2:"8",y2:"17"}]],sliders:[["line",{x1:"21",y1:"4",x2:"14",y2:"4"}],["line",{x1:"10",y1:"4",x2:"3",y2:"4"}],["line",{x1:"21",y1:"12",x2:"12",y2:"12"}],["line",{x1:"8",y1:"12",x2:"3",y2:"12"}],["line",{x1:"21",y1:"20",x2:"16",y2:"20"}],["line",{x1:"12",y1:"20",x2:"3",y2:"20"}],["line",{x1:"14",y1:"2",x2:"14",y2:"6"}],["line",{x1:"8",y1:"10",x2:"8",y2:"14"}],["line",{x1:"16",y1:"18",x2:"16",y2:"22"}]],book:[["path",{d:"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1 0-5H20"}]],layers:[["polygon",{points:"12 2 2 7 12 12 22 7 12 2"}],["polyline",{points:"2 17 12 22 22 17"}],["polyline",{points:"2 12 12 17 22 12"}]],help:[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"}],["line",{x1:"12",y1:"17",x2:"12.01",y2:"17"}]],clock:[["circle",{cx:"12",cy:"12",r:"10"}],["polyline",{points:"12 6 12 12 16 14"}]],queue:[["line",{x1:"11",y1:"12",x2:"3",y2:"12"}],["line",{x1:"16",y1:"6",x2:"3",y2:"6"}],["line",{x1:"16",y1:"18",x2:"3",y2:"18"}],["line",{x1:"18",y1:"9",x2:"18",y2:"15"}],["line",{x1:"21",y1:"12",x2:"15",y2:"12"}]]};var V=(e,t=16)=>{let r=document.createElementNS("http://www.w3.org/2000/svg","svg"),n={width:String(t),height:String(t),viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"};for(let[o,i]of Object.entries(n))r.setAttribute(o,i);for(let[o,i]of Vl[e]){let s=document.createElementNS("http://www.w3.org/2000/svg",o);for(let[l,p]of Object.entries(i))s.setAttribute(l,p);r.appendChild(s)}return r};class Q{options;element=D(a("button"));tooltip;constructor(e,t,r,n,o){this.options=o;O(),this.element.className=`bp-composer-button bp-cb-${o.id}`,this.element.type="button",this.element.setAttribute("aria-label",e),this.element.appendChild(V(t,16)),this.element.addEventListener("click",(i)=>{i.preventDefault(),i.stopPropagation(),n()}),this.tooltip=new Z(this.element,(i)=>i.append(a("div","bp-tip-mode",e),a("div","bp-tip-sub",r)))}mount(){if(!sr(this.element,this.options.id))this.tooltip.hide()}unmount(){this.tooltip.hide(),ar(this.element,this.options.id)}}var Yl=/^\s*(`{3,}|~{3,})/,Xl=/(?<=[.!?])\s+/,Jl=3,bi=(e)=>e.kind==="code"?[e.open,...e.body,e.close].join(` `):e.lines.join(` `),fi=(e)=>B(bi(e)),Zl=(e)=>{let t=[],r=[],n=null,o=()=>{if(r.length)t.push({kind:"text",lines:r});r=[]};for(let i of e.replace(/\r\n?/g,` `).split(` `)){if(n){let l=i.trim();if(l.startsWith(n.marker)&&/^[`~]+$/.test(l))t.push({kind:"code",open:n.open,close:l,body:n.body}),n=null;else n.body.push(i);continue}let s=Yl.exec(i);if(s){o(),n={open:i.trim(),marker:s[1],body:[]};continue}if(i.trim()==="")o();else r.push(i)}if(o(),n)t.push({kind:"code",open:n.open,close:n.marker,body:n.body});return t},ep=(e,t)=>{let r=Math.max(40,Math.floor(t*Jl)),n=[];for(let o=0;o{let o=[],i=[],s=0,l=()=>{if(i.length)o.push(i.join(r));i=[],s=0};for(let p of e.flatMap((d)=>B(d,n)>t?ep(d,t):[d])){let d=B(p,n)+1;if(i.length&&s+d>t)l();i.push(p),s+=d}return l(),o},tp=(e,t)=>{if(e.kind==="code"){let o=Math.max(40,t-B(`${e.open} ${e.close}`,!0));return gi(e.body,o,` `,!0).map((i)=>({kind:"code",open:e.open,close:e.close,body:i.split(` `)}))}let r=e.lines.length===1,n=r?(e.lines[0]??"").split(Xl):e.lines;return gi(n,t,r?" ":` `,!1).map((o)=>({kind:"text",lines:[o]}))},yi=(e,{budget:t,balanced:r})=>{let n=Zl(e).flatMap((c)=>fi(c)>t?tp(c,t):[c]);if(!n.length)return[];let o=n.map((c)=>fi(c)+2),i=o.reduce((c,u)=>c+u,0),s=Math.max(1,Math.ceil(i/t)),l=r?Math.min(t,Math.ceil(i/s*1.15)):t,p=[],d=[],m=0;if(n.forEach((c,u)=>{let h=o[u];if(d.length&&m+h>l)p.push(d),d=[],m=0;d.push(bi(c)),m+=h}),d.length)p.push(d);return p.map((c)=>c.join(` `))};var rp={header:'[Part {{index}}/{{total}}] I am sending one long message in {{total}} parts. Do not answer yet. Reply only with "OK" until the final part.',final:"[Part {{index}}/{{total}} - final] This is the last part. The full message is now complete; respond to all parts now."},vi=(e,t,r)=>e.replace(/\{\{index\}\}/g,String(t)).replace(/\{\{total\}\}/g,String(r)),at=(e,t,r,n,o=rp)=>{let i=B(e),s=t.trim()?` ${t.trim()}`:"";if(i+B(s)<=r){let c=`${e}${s}`;return{parts:[c],tokens:[B(c)],total:i}}let l=B(o.header)+B(o.final)+B(s)+24,p=yi(e,{budget:Math.max(200,r-l),balanced:n}),d=p.length,m=p.map((c,u)=>u===d-1?`${vi(o.final,u+1,d)} ${c}${s}`:`${vi(o.header,u+1,d)} ${c}`);return{parts:m,tokens:m.map((c)=>B(c)),total:i}};var np=` .bp-split-summary { margin-bottom: 12px; color: var(--bp-muted); font-size: 12px; } .bp-split-part { border: 1px solid var(--bp-border); border-radius: 10px; } .bp-split-part summary { display: flex; justify-content: space-between; gap: 12px; padding: 8px 12px; cursor: pointer; } .bp-split-part pre { max-height: 220px; margin: 0 12px 12px; padding: 10px; overflow: auto; border-radius: 8px; background: var(--bp-accent); font: 11px/1.5 ui-monospace, monospace; white-space: pre-wrap; word-break: break-word; } .bp-split-panel { position: fixed; right: 20px; bottom: 20px; z-index: 100000; display: flex; flex-direction: column; gap: 8px; width: 280px; padding: 12px 14px; border: 1px solid var(--bp-border); border-radius: 12px; background: var(--bp-bg); color: var(--bp-fg); box-shadow: 0 12px 32px rgb(0 0 0 / 22%); font-size: 12px; } `,lr=()=>P(`${b().id}-splitter-styles`,np);var xi=6000,Ge=(e)=>e.toLocaleString(),xn=(e)=>e.parts.map((t,r)=>{let n=a("details","bp-split-part"),o=a("summary");return o.append(a("span",void 0,`Part ${r+1}`),a("span","bp-data-label",`${Ge(e.tokens[r]??0)} tokens`)),n.append(o,a("pre",void 0,t.length>xi?`${t.slice(0,xi)} …`:t)),n}),wi=({text:e,settings:t,onSettings:r,onConfirm:n})=>{let o=`${b().id}-splitter-dialog`;if(document.getElementById(o))return;let i=R({id:o,title:"Message splitter",description:`This message is about ${Ge(B(e))} tokens.`,width:640}),s={...t},l="",p=at(e,l,s.limit,s.balanced),d=a("div","bp-split-summary"),m=a("div","bp-stack"),c=y("",{primary:!0}),u=()=>{p=at(e,l,s.limit,s.balanced);let C=p.parts.length;d.textContent=`${C} ${C===1?"part":"parts"} · limit ${Ge(s.limit)} tokens each. Every part sent uses one query.`,m.replaceChildren(...xn(p)),c.textContent=s.mode==="file"?"Attach as file":C>1?`Send ${C} parts`:"Send"},h=(C)=>{Object.assign(s,C),r({...s}),u()},f=Re({label:"Tokens per part",hint:"Estimate, with a safety margin built in",value:s.limit,min:500,max:1e5,step:100,onChange:(C)=>h({limit:C})}),v=Le("Mode",[{value:"parts",label:"Send in parts"},{value:"file",label:"Attach as file (no extra queries)"}],s.mode,(C)=>h({mode:C})),S=J({label:"Offer to split when sending an oversized message",checked:s.autoIntercept,onChange:(C)=>h({autoIntercept:C})}),E=oe("Instruction appended to the last part (optional)","",(C)=>{l=C,u()}),g=a("div","bp-stack");g.append(f.wrapper,v,S.wrapper,E),i.body.append(g,a("div","bp-hint"),d,m),c.addEventListener("click",()=>{i.close(),n({mode:s.mode,plan:p,instruction:l})}),i.footer.append(y("Cancel",{onClick:i.close}),c),u(),i.show()},op={sending:"sending",waiting:"waiting for the reply",done:"done"};class wn{element=D(a("div","bp-split-panel bp-themed"));label=a("div");fill=a("div","bp-progress-fill");cancel=y("Cancel");timer=0;constructor(){O(),lr();let e=a("div","bp-progress");e.appendChild(this.fill),this.element.append(this.label,e,this.cancel)}show(e,t){this.cancel.hidden=!1,this.cancel.onclick=t,this.fill.style.width="0%",this.label.textContent=`Preparing ${e} parts…`,this.mount()}update(e,t,r){this.label.textContent=`Part ${e+1}/${t}: ${op[r]}`,this.fill.style.width=`${((e+(r==="done"?1:0.5))/t*100).toFixed(0)}%`}finish(e){this.label.textContent=e,this.cancel.hidden=!0,this.autoHide(4000)}notify(e){this.label.textContent=e,this.fill.style.width="0%",this.cancel.hidden=!0,this.mount(),this.autoHide(3500)}mount(){if(window.clearTimeout(this.timer),!this.element.isConnected)document.body.appendChild(this.element)}autoHide(e){window.clearTimeout(this.timer),this.timer=window.setTimeout(()=>this.element.remove(),e)}}var Si=({settings:e,onSettings:t,onInsert:r,onSend:n})=>{let o=`${b().id}-bigtext-dialog`;if(document.getElementById(o))return;lr();let i=R({id:o,title:"Compose a big message",description:"Paste any amount of text. It is split only if it is too big for one message.",width:760}),s={...e},l="",p="",d=at("","",s.limit,s.balanced),m=oe("Paste your message here…","",(L)=>{l=L,g()});m.rows=14;let c=a("div","bp-split-summary"),u=a("div","bp-stack"),h=y("Insert into composer"),f=y("",{primary:!0}),v=(L)=>{Object.assign(s,L),t({...s}),g()},S=Re({label:"Tokens per message",hint:"Estimate, with a safety margin built in",value:s.limit,min:500,max:1e5,step:100,onChange:(L)=>v({limit:L})}),E=a("div","bp-stack");E.append(Le("When too big",[{value:"parts",label:"Send in parts"},{value:"file",label:"Attach as file (no extra queries)"}],s.mode,(L)=>v({mode:L})),oe("Instruction appended to the last part (optional)","",(L)=>{p=L,g()}),u);let g=()=>{let L=B(l),w=L>s.limit;d=at(l,p,s.limit,s.balanced);let T=d.parts.length,M=!l.trim();if(E.hidden=!w,h.hidden=w,h.disabled=M,f.disabled=M,u.replaceChildren(...w?xn(d):[]),M)c.textContent="Waiting for text…";else if(!w)c.textContent=`~${Ge(L)} tokens: fits in one message (limit ${Ge(s.limit)}).`;else c.textContent=`~${Ge(L)} tokens: too big for one message. ${s.mode==="file"?"It will be attached as a file.":`It will be sent as ${T} parts, and each part uses one query.`}`;f.textContent=w?s.mode==="file"?"Attach as file":`Send ${T} parts`:"Send"};h.addEventListener("click",()=>{i.close(),r(l)}),f.addEventListener("click",()=>{let L=B(l)>s.limit;i.close(),n(l,{mode:L?s.mode:"parts",plan:d,instruction:p})});let C=a("div","bp-stack");C.append(m,c,S.wrapper,E),i.body.appendChild(C),i.footer.append(y("Cancel",{onClick:i.close}),h,f),g(),i.show(),m.focus()};class Sn{deps;controller=null;constructor(e){this.deps=e}get active(){return this.controller!==null}cancel(){this.controller?.abort()}async run(e,t){if(this.controller)return"failed";let r=new AbortController;this.controller=r;let{signal:n}=r,{composer:o,waitForResponse:i,logger:s}=this.deps;try{for(let l=0;lthis.openBig(),{id:"big"});constructor(e){super(e);this.settings=nt(x,k().splitterDefaults),this.runner=new Sn({composer:k().composer,waitForResponse:k().generation.waitForResponse,logger:e.logger})}run(){if(this.enabled)this.bigButton.mount();else this.bigButton.unmount();if(this.enabled&&!this.attached){document.addEventListener("keydown",this.handleKeydown,!0),document.addEventListener("click",this.handleClick,!0),this.attached=!0;return}if(!this.enabled&&this.attached)document.removeEventListener("keydown",this.handleKeydown,!0),document.removeEventListener("click",this.handleClick,!0),this.attached=!1}menuEntries(){return[{id:"big",label:"Compose Big Message…",action:()=>this.openBig()},{id:"split",label:"Split Composer Text…",action:()=>this.open()},{label:`${this.settings.autoIntercept?"Disable":"Enable"} Auto-Split on Send`,action:()=>this.saveSettings({...this.settings,autoIntercept:!this.settings.autoIntercept})}]}saveSettings(e){this.settings=e,Yo(x,e),this.context.refreshMenu()}isOwn(e){return b().marker.isOwn(e)}isOversized(e){return this.settings.autoIntercept&&B(_(e))>this.settings.limit}handleKeydown=(e)=>{if(this.runner.active||xt()||e.key!=="Enter"||e.shiftKey||e.isComposing)return;let t=k().composer.editableFrom(e.target);if(!t||this.isOwn(t)||!this.isOversized(t))return;e.preventDefault(),e.stopImmediatePropagation(),this.open()};handleClick=(e)=>{if(this.runner.active||xt()||!this.settings.autoIntercept)return;let t=ve(e.target)?.closest("button");if(!t||this.isOwn(t)||!et(t))return;let r=k().composer.findComposer();if(!r||!this.isOversized(r))return;e.preventDefault(),e.stopImmediatePropagation(),this.open()};open(){let e=k().composer.findComposer(),t=e?_(e):"";if(!t.trim()){this.panel.notify("The composer is empty.");return}wi({text:t,settings:this.settings,onSettings:(r)=>this.saveSettings(r),onConfirm:(r)=>void this.execute(t,r)})}async execute(e,{mode:t,plan:r,instruction:n}){if(t==="file"){await this.attachAsFile(e,n);return}let o=r.parts.length;this.panel.show(o,()=>this.runner.cancel());let i=await this.runner.run(r.parts,(s,l)=>this.panel.update(s,o,l));this.panel.finish(i==="done"?"All parts sent.":i==="cancelled"?"Cancelled.":"Stopped: a part could not be written or sent.")}async attachAsFile(e,t){let r=k().attachBlocked?.();if(r){this.panel.notify(r);return}let n=k().composer.findComposer();if(!n){this.panel.notify("No composer found.");return}let o=k().composer.attachFile(n,new File([e],"message.txt",{type:"text/plain"}));await k().composer.writeComposer(n,t.trim()),this.panel.notify(o?"File attached. Add your question and send.":"Could not attach the file automatically.")}openBig(){Si({settings:this.settings,onSettings:(e)=>this.saveSettings(e),onInsert:(e)=>void this.insert(e),onSend:(e,t)=>void this.execute(e,t)})}async insert(e){let t=await xe(k().composer.findComposer,{timeout:5000});if(!t){this.panel.notify("No composer found.");return}this.panel.notify(await k().composer.writeComposer(t,e)?"Inserted into the composer.":"Could not insert the text.")}}var Ei="command-palette:shortcut",ip=/^(Control|Alt|Shift|Meta|OS)(Left|Right)?$/,En={ctrl:!1,alt:!0,shift:!0,meta:!1,code:"KeyP"},lt=()=>({...En,...x.get(Ei,{})}),ki=(e)=>x.set(Ei,e),ue=(e,t)=>e.code===t.code&&e.ctrlKey===t.ctrl&&e.altKey===t.alt&&e.shiftKey===t.shift&&e.metaKey===t.meta,pt=(e)=>[...[e.ctrl&&"Ctrl",e.alt&&"Alt",e.shift&&"Shift",e.meta&&"Meta"].filter(Boolean),e.code.replace(/^(Key|Digit)/,"")].join(" + "),Ci=(e)=>{if(ip.test(e.code)||!(e.ctrlKey||e.altKey||e.metaKey))return null;return{ctrl:e.ctrlKey,alt:e.altKey,shift:e.shiftKey,meta:e.metaKey,code:e.code}};var sp=` .bp-palette { max-height: min(70vh, 480px); } .bp-palette .bp-dialog-header, .bp-palette .bp-dialog-footer { display: none; } .bp-palette .bp-dialog-body { padding: 0; } .bp-palette-input { width: 100%; padding: 16px 18px; border: 0; border-bottom: 1px solid var(--bp-border); outline: 0; background: transparent; color: var(--bp-fg); font: inherit; font-size: 15px; } .bp-palette-list { max-height: 360px; overflow-y: auto; padding: 6px; } .bp-palette-item { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 8px 12px; border-radius: 8px; cursor: pointer; } .bp-palette-item[aria-selected='true'] { background: var(--bp-accent); } .bp-palette-group { color: var(--bp-muted); font-size: 11px; } .bp-palette-empty { padding: 18px; color: var(--bp-muted); text-align: center; } .bp-shortcut-box { padding: 14px; border: 1px dashed var(--bp-border); border-radius: 10px; font-size: 15px; font-weight: 600; text-align: center; } `,$e=()=>P(`${b().id}-palette-styles`,sp);var Ti=()=>`${b().id}-shortcut-dialog`,De=(e,t,r="Palette shortcut",n=En)=>{let o=document.getElementById(Ti());if(o instanceof HTMLDialogElement){o.close();return}$e();let i=R({id:Ti(),title:r,description:"Use at least one of Ctrl, Alt or Meta.",width:420}),s={...e},l=!1,p=a("div","bp-shortcut-box",pt(s)),d=y("Record new shortcut"),m=()=>{l=!1,d.textContent="Record new shortcut",p.textContent=pt(s)};d.addEventListener("click",()=>{l=!0,d.textContent="Press the shortcut…",p.textContent="…"}),i.dialog.addEventListener("keydown",(c)=>{if(!l)return;if(c.preventDefault(),c.stopPropagation(),c.key==="Escape"){m();return}let u=Ci(c);if(!u)return;s=u,m()},!0),i.body.append(p),i.footer.append(d,y("Reset",{onClick:()=>{s={...n},m()}}),y("Save",{primary:!0,onClick:()=>{t(s),i.close()}})),i.show()};var We=(e,t)=>{if(!e)return 1;let r=e.toLowerCase(),n=t.toLowerCase(),o=0,i=0,s=0;for(let l of r){let p=n.indexOf(l,i);if(p===-1)return 0;s=p===i?s+1:0;let d=p===0||/[\s\-_:.]/.test(n[p-1]??"");o+=1+s*2+(d?3:0)-Math.min(p-i,5)*0.2,i=p+1}return Math.max(o,0.01)};var Li=()=>`${b().id}-palette`,kn="command-palette:recent",ap=6,Mi=60,lp=(e,t,r)=>{if(!t){let n=(o)=>{let i=r.indexOf(o.id);return i===-1?r.length:i};return[...e].sort((o,i)=>n(o)-n(i)||o.group.localeCompare(i.group)||o.title.localeCompare(i.title)).slice(0,Mi)}return e.map((n)=>({command:n,score:Math.max(We(t,n.title)*2,We(t,`${n.group} ${n.title} ${n.keywords??""}`))})).filter(({score:n})=>n>0).sort((n,o)=>o.score-n.score).slice(0,Mi).map(({command:n})=>n)},Ai=(e)=>{let t=document.getElementById(Li());if(t instanceof HTMLDialogElement){t.close();return}$e();let r=R({id:Li(),title:"Command palette",width:560});r.dialog.classList.add("bp-palette");let n=e(),o=a("input","bp-palette-input");o.placeholder="Type a command…",o.setAttribute("aria-label","Command");let i=a("div","bp-palette-list");i.setAttribute("role","listbox"),r.body.append(o,i);let s=[],l=0,p=(m)=>{let c=[m.id,...x.get(kn,[]).filter((u)=>u!==m.id)].slice(0,ap);x.set(kn,c),r.close(),window.setTimeout(()=>void m.run(),0)},d=()=>{if(s=lp(n,o.value.trim(),x.get(kn,[])),l=Math.min(l,Math.max(0,s.length-1)),!s.length){i.replaceChildren(a("div","bp-palette-empty","No matching commands"));return}i.replaceChildren(...s.map((m,c)=>{let u=a("div","bp-palette-item");return u.setAttribute("role","option"),u.setAttribute("aria-selected",String(c===l)),u.append(a("span",void 0,m.title),a("span","bp-palette-group",m.group)),u.addEventListener("click",()=>p(m)),u.addEventListener("pointermove",()=>{if(l===c)return;l=c,d()}),u})),i.children[l]?.scrollIntoView({block:"nearest"})};o.addEventListener("input",()=>{l=0,d()}),o.addEventListener("keydown",(m)=>{if(m.key==="ArrowDown"||m.key==="ArrowUp"){m.preventDefault();let c=m.key==="ArrowDown"?1:-1;l=(l+c+s.length)%Math.max(1,s.length),d()}else if(m.key==="Enter"){m.preventDefault();let c=s[l];if(c)p(c)}}),d(),r.show(),o.focus()};var Pi=(e)=>{let t=k().scroller?.()??window,r=t instanceof Window?document.documentElement.scrollHeight:t.scrollHeight;t.scrollTo({top:e==="end"?r:e,behavior:"smooth"})};class pr extends A{id="command-palette";name="Command Palette";description="Search and run any action with a keyboard shortcut.";shortcut=lt();attached=!1;run(){if(this.enabled&&!this.attached){window.addEventListener("keydown",this.handleKeydown,!0),this.attached=!0;return}if(!this.enabled&&this.attached)window.removeEventListener("keydown",this.handleKeydown,!0),this.attached=!1}menuEntries(){return[{id:"open",label:"Open Command Palette",action:()=>this.open()},{id:"shortcut",label:"Configure Palette Shortcut",action:()=>this.configure()}]}commands(){return[{id:"focus-input",title:"Focus message input",run:()=>N()?.focus()},{id:"clear-input",title:"Clear message input",run:()=>void this.clearInput()},{id:"scroll-top",title:"Scroll to top",keywords:"beginning start",run:()=>Pi(0)},{id:"scroll-bottom",title:"Scroll to bottom",keywords:"end latest",run:()=>Pi("end")},{id:"home",title:"Go to home",keywords:"new thread",run:()=>location.assign("/")},{id:"copy-url",title:"Copy page URL",keywords:"link share",run:()=>void z(location.href)}]}open(){Ai(this.context.getCommands)}configure(){De(this.shortcut,(e)=>{this.shortcut=e,ki(e)})}async clearInput(){let e=N();if(e)await W(e,"")}handleKeydown=(e)=>{if(e.repeat||!ue(e,this.shortcut))return;e.preventDefault(),e.stopImmediatePropagation(),this.open()}}var pp=` .bp-toast { position: fixed; right: 20px; bottom: 20px; z-index: 100001; display: flex; flex-direction: column; gap: 10px; width: 320px; padding: 14px 16px; border: 1px solid var(--bp-border); border-radius: 12px; background: var(--bp-bg); color: var(--bp-fg); box-shadow: 0 12px 32px rgb(0 0 0 / 22%); font: 13px/1.45 ui-sans-serif, system-ui, sans-serif; } .bp-toast-actions { display: flex; flex-wrap: wrap; gap: 6px; } `,H=(e,t=[],r=8000)=>{O(),P(`${b().id}-toast-styles`,pp);let n=D(a("div","bp-toast bp-themed")),o=()=>n.remove();if(n.appendChild(a("div",void 0,e)),t.length){let i=a("div","bp-toast-actions");for(let s of t)i.appendChild(y(s.label,{primary:s.primary,onClick:()=>{if(!s.keepOpen)o();s.onClick()}}));n.appendChild(i)}if(document.body.appendChild(n),r>0)window.setTimeout(o,r);return o};var Ri="prompt-queue:items",dr=50,dp=86400000,ie=(e)=>k().threadOf(e);class $i{store;now;items;listeners=new Set;counter=0;constructor(e=x,t=Date.now){this.store=e;this.now=t;this.items=this.store.get(Ri,[]).filter((r)=>this.now()-r.addedAt=dr)return null;let n={id:`q${this.now().toString(36)}${(this.counter++).toString(36)}`,text:r,addedAt:this.now(),thread:t};return this.items=[...this.items,n],this.commit(),n}update(e,t){let r=t.trim();if(!r){this.remove(e);return}this.items=this.items.map((n)=>n.id===e?{...n,text:r}:n),this.commit()}move(e,t){let r=this.items.findIndex((s)=>s.id===e),n=Math.max(0,Math.min(this.items.length-1,r+t));if(r<0||r===n)return;let o=[...this.items],[i]=o.splice(r,1);o.splice(n,0,i),this.items=o,this.commit()}retarget(e){if(!this.items.length)return;this.items=this.items.map((t)=>({...t,thread:e})),this.commit()}remove(e){let t=this.items.filter((r)=>r.id!==e);if(t.length===this.items.length)return;this.items=t,this.commit()}clear(){if(!this.items.length)return;this.items=[],this.commit()}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}commit(){this.store.set(Ri,this.items);for(let e of this.listeners)e()}}var ee=Ke(()=>new $i);var Di="recall:settings",Cn="recall:shortcut",cp={paused:!1,retentionDays:180,arrowHistory:!0},Tn={ctrl:!1,alt:!0,shift:!0,meta:!1,code:"KeyH"},Oe=()=>({...cp,...x.get(Di,{})}),Oi=(e)=>x.set(Di,e),Ii=()=>({...Tn,...x.get(Cn,{})});var Hi=2000,Bi=20000,Ui=2,cr=5,_i="recall:entries",Fi=86400000,up=(e)=>e.replace(/\s+/g," ").trim().toLowerCase(),qi=(e)=>{let t=up(e),r=2166136261;for(let n of t)r^=n.codePointAt(0),r=Math.imul(r,16777619)>>>0;return`${r.toString(16).padStart(8,"0")}${t.length.toString(36)}`},mp=(e,t)=>{let r=e.toLowerCase().split(/\s+/).filter(Boolean);if(!r.length)return 1;let n=t.toLowerCase(),o=0;for(let i of r){let s=n.indexOf(i);if(s===-1)return Math.min(We(e,t.slice(0,300)),9)*0.1;let l=s===0||/[\s\-_:.,;()[\]"']/.test(n[s-1]??"");o+=10+(l?5:0)-Math.min(s,200)/100}return o},Ni=(e)=>{if(!e||typeof e!=="object")return null;let t=e,r=typeof t.text==="string"?t.text.trim().slice(0,Bi):"";if(r.lengthtypeof s==="number"&&Number.isFinite(s)?s:l,o=n(t.last,Date.now()),i=Array.isArray(t.threads)?t.threads.flatMap((s)=>{let l=s;return l&&typeof l.path==="string"?[{path:l.path,at:n(l.at,o)}]:[]}):[];return{id:qi(r),text:r,first:n(t.first,o),last:o,count:Math.max(1,Math.round(n(t.count,1))),pinned:t.pinned===!0,threads:i.slice(0,cr)}};class Ln{store;now;entries;listeners=new Set;constructor(e=x,t=Date.now){this.store=e;this.now=t;this.entries=new Map;for(let r of this.store.get(_i,[])){let n=Ni(r);if(n)this.entries.set(n.id,n)}}get size(){return this.entries.size}get(e){return this.entries.get(e)}record(e,t){let r=e.trim().slice(0,Bi);if(r.lengthp.path!==t)].slice(0,cr):i?.threads??[],l=i?{...i,last:o,count:i.count+1,threads:s}:{id:n,text:r,first:o,last:o,count:1,pinned:!1,threads:s};return this.entries.set(n,l),this.trim(),this.commit(),l}attach(e,t){let r=this.entries.get(e);if(!r||r.threads.some((n)=>n.path===t))return;this.entries.set(e,{...r,threads:[{path:t,at:this.now()},...r.threads].slice(0,cr)}),this.commit()}recent(e=100){return[...this.entries.values()].sort((t,r)=>r.last-t.last).slice(0,e)}search(e,t,{path:r,now:n}){let o=new Date(n).setHours(0,0,0,0),i=[...this.entries.values()].filter((l)=>{if(t==="pinned")return l.pinned;if(t==="today")return l.last>=o;if(t==="here")return l.threads.some((p)=>p.path===r);return!0}),s=e.trim();if(!s)return i.sort((l,p)=>Number(p.pinned)-Number(l.pinned)||p.last-l.last);return i.map((l)=>({entry:l,base:mp(s,l.text)})).filter(({base:l})=>l>0).map(({entry:l,base:p})=>({entry:l,score:p+(l.pinned?5:0)+2*Math.log10(l.count+1)+3/(1+(n-l.last)/(3*Fi))})).sort((l,p)=>p.score-l.score).map(({entry:l})=>l)}togglePin(e){let t=this.entries.get(e);if(!t)return null;return this.entries.set(e,{...t,pinned:!t.pinned}),this.commit(),!t.pinned}remove(e){if(this.entries.delete(e))this.commit()}clear(e=!0){for(let[t,r]of this.entries)if(!e||!r.pinned)this.entries.delete(t);this.commit()}prune(e){if(e<=0)return 0;let t=this.now()-e*Fi,r=0;for(let[n,o]of this.entries)if(!o.pinned&&o.lastm.path));this.entries.set(l.id,{...p,first:Math.min(p.first,l.first),last:Math.max(p.last,l.last),count:Math.max(p.count,l.count),pinned:p.pinned||l.pinned,threads:[...p.threads,...l.threads.filter((m)=>!d.has(m.path))].slice(0,cr)}),o++}return this.trim(),this.commit(),{added:n,merged:o,skipped:i}}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}trim(){if(this.entries.size<=Hi)return;let e=[...this.entries.values()].filter((t)=>!t.pinned).sort((t,r)=>t.last-r.last);for(let t of e.slice(0,this.entries.size-Hi))this.entries.delete(t.id)}commit(){this.store.set(_i,[...this.entries.values()]);for(let e of this.listeners)e()}}var me=Ke(()=>new Ln),ur=(e)=>{if(!x.get("module:recall",!0)||Oe().paused)return;let t=me.record(e,ie(location.pathname));if(!t||ie(location.pathname)!==null)return;window.setTimeout(()=>{let r=ie(location.pathname);if(r)me.attach(t.id,r)},3000)};var hp=` .bp-queue { position: fixed; right: 20px; bottom: 112px; z-index: 100000; display: flex; flex-direction: column; width: 340px; max-width: calc(100vw - 40px); border: 1px solid var(--bp-border); border-radius: 12px; background: var(--bp-bg); color: var(--bp-fg); box-shadow: 0 12px 32px rgb(0 0 0 / 22%); font: 12px/1.45 ui-sans-serif, system-ui, sans-serif; } .bp-queue-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 8px 10px; } .bp-queue-toggle { display: inline-flex; align-items: center; gap: 8px; padding: 4px 6px; border: 0; border-radius: 6px; background: transparent; color: inherit; font: inherit; font-weight: 600; cursor: pointer; } .bp-queue-toggle:hover { background: var(--bp-accent); } .bp-queue-count { min-width: 20px; padding: 0 6px; border-radius: 999px; background: var(--bp-accent); font-size: 11px; font-weight: 600; text-align: center; } .bp-queue-status { color: var(--bp-muted); font-size: 11px; text-align: right; } .bp-queue[data-phase='moved'] .bp-queue-status, .bp-queue[data-phase='draft'] .bp-queue-status { color: var(--bp-yellow); } .bp-queue[data-phase='error'] .bp-queue-status { color: var(--bp-red); } .bp-queue-list { display: flex; flex-direction: column; gap: 4px; max-height: 220px; margin: 0; padding: 0 8px 4px; overflow-y: auto; list-style: none; } .bp-queue-item { display: flex; align-items: flex-start; gap: 8px; padding: 6px 8px; border: 1px solid var(--bp-border); border-radius: 8px; } .bp-queue-index { flex-shrink: 0; width: 18px; color: var(--bp-muted); font-variant-numeric: tabular-nums; } .bp-queue-text { display: -webkit-box; flex: 1; min-width: 0; overflow: hidden; word-break: break-word; white-space: pre-wrap; cursor: text; -webkit-box-orient: vertical; -webkit-line-clamp: 2; } .bp-queue-edit { display: flex; flex: 1; flex-direction: column; gap: 6px; min-width: 0; } .bp-queue-edit-actions { display: flex; gap: 6px; } .bp-queue-actions { display: flex; flex-shrink: 0; gap: 2px; } .bp-queue-actions .bp-icon-button:disabled { opacity: 0.3; cursor: default; } .bp-queue-footer { display: flex; flex-wrap: wrap; gap: 6px; padding: 8px 10px 10px; } .bp-queue[data-collapsed='true'] .bp-queue-head { padding-bottom: 8px; } `,ji=()=>P(`${b().id}-queue-styles`,hp);var Ki="prompt-queue:collapsed",zi={idle:"Ready",waiting:"Waiting for the answer to finish…",sending:"Sending…",paused:"Paused",moved:"You left the thread these messages were queued for.",draft:"Waiting for the message box to be empty.",error:"Could not send. Check the message box, then retry."};class Mn{queue;runner;element=D(a("aside","bp-queue bp-themed"));editing=null;collapsed=x.get(Ki,!1);constructor(e,t){this.queue=e;this.runner=t;O(),ji(),this.element.setAttribute("aria-label","Message queue")}render(){let e=this.queue.list();if(!e.length){this.editing=null,this.element.remove();return}if(this.editing&&this.element.contains(document.activeElement))return;if(!this.element.isConnected)document.body.appendChild(this.element);this.element.dataset.collapsed=String(this.collapsed),this.element.dataset.phase=this.runner.paused?"paused":this.runner.phase,this.element.replaceChildren(this.header(e.length),...this.collapsed?[]:[this.list(e),this.footer()])}detach(){this.editing=null,this.element.remove()}header(e){let t=a("div","bp-queue-head"),r=a("button","bp-queue-toggle");return r.type="button",r.setAttribute("aria-expanded",String(!this.collapsed)),r.append(V("queue",14),a("span",void 0,"Queue"),a("span","bp-queue-count",String(e))),r.addEventListener("click",()=>{this.collapsed=!this.collapsed,x.set(Ki,this.collapsed),this.render()}),t.append(r,a("span","bp-queue-status",this.runner.paused?zi.paused:zi[this.runner.phase])),t}list(e){let t=a("ol","bp-queue-list");return e.forEach((r,n)=>t.appendChild(this.row(r,n,e.length))),t}row(e,t,r){let n=a("li","bp-queue-item"),o=a("div","bp-queue-actions");return o.append(this.iconButton("↑","Move up",t===0,()=>this.queue.move(e.id,-1)),this.iconButton("↓","Move down",t===r-1,()=>this.queue.move(e.id,1)),this.iconButton("×","Remove",!1,()=>this.queue.remove(e.id))),n.append(a("span","bp-queue-index",String(t+1)),this.editing===e.id?this.editor(e):this.text(e),o),n}text(e){let t=a("div","bp-queue-text",e.text);return t.title="Click to edit",t.addEventListener("click",()=>{this.editing=e.id,this.render()}),t}editor(e){let t=a("div","bp-queue-edit"),r=a("textarea","bp-input");r.value=e.text,r.rows=3;let n=()=>{this.editing=null,this.render()},o=()=>{this.editing=null,this.queue.update(e.id,r.value),this.render()};r.addEventListener("keydown",(s)=>{if(s.stopPropagation(),s.key==="Escape")s.preventDefault(),n();else if(s.key==="Enter"&&(s.ctrlKey||s.metaKey))s.preventDefault(),o()});let i=a("div","bp-queue-edit-actions");return i.append(y("Save",{primary:!0,onClick:o}),y("Cancel",{onClick:n})),t.append(r,i),queueMicrotask(()=>r.focus()),t}footer(){let{runner:e}=this,t=a("div","bp-queue-footer");if(t.appendChild(y(e.paused?"Resume":"Pause",{primary:e.paused,onClick:()=>e.paused?e.resume():e.pause()})),!e.paused&&e.phase==="waiting")t.appendChild(y("Send next now",{onClick:()=>e.sendNow()}));if(!e.paused&&e.phase==="moved")t.appendChild(y("Send here instead",{primary:!0,onClick:()=>e.moveHere()}));if(e.phase==="error")t.appendChild(y("Retry",{primary:!0,onClick:()=>e.retry()}));return t.appendChild(y("Clear",{onClick:()=>this.queue.clear()})),t}iconButton(e,t,r,n){let o=a("button","bp-icon-button",e);return o.type="button",o.disabled=r,o.setAttribute("aria-label",t),o.addEventListener("click",n),o}}var An=2;class Pn{queue;deps;phase="idle";paused;lock=null;busy=!1;force=!1;failures=0;controller=null;skipWait=null;listeners=new Set;constructor(e,t,r){this.queue=e;this.deps=t;this.paused=r&&e.size>0}get running(){return this.busy}onChange(e){return this.listeners.add(e),()=>this.listeners.delete(e)}pause(){this.paused=!0,this.kick(),this.emit()}resume(){this.paused=!1,this.failures=0,this.kick(),this.emit()}retry(){this.failures=0,this.kick()}moveHere(){this.lock=null,this.queue.retarget(ie(this.deps.path())),this.kick()}sendNow(){this.force=!0,this.skipWait?.(),this.kick()}stop(){this.controller?.abort()}kick(){if(this.busy)return;if(!this.queue.peek()){this.lock=null,this.failures=0,this.set("idle");return}let e=this.blocker();if(e){this.set(e);return}this.cycle()}blocker(){if(this.paused)return"paused";if(this.failures>=An)return"error";let e=this.queue.peek();if(!e)return null;let t=this.deps.path(),r=e.thread??this.lock;if(r!==null?t!==r:ie(t)!==null)return"moved";let n=this.deps.composerText();if(n===null||n.trim()!=="")return"draft";return null}async cycle(){this.busy=!0;let e=new AbortController;this.controller=e;try{if(this.set("waiting"),!this.force&&this.deps.isGenerating())await this.interruptible(e,(o)=>this.deps.waitForResponse(o,0));let t=this.blocker();if(t){this.set(t);return}let r=this.queue.peek();if(!r)return;this.set("sending");let n=this.deps.path();if(!await this.deps.send(r.text,e.signal)){this.failures++,this.set(this.failures>=An?"error":"waiting");return}if(this.failures=0,this.force=!1,this.queue.remove(r.id),this.deps.onSent?.(r.text),r.thread===null&&this.lock===null){let o=await this.deps.settlePath(n,e.signal);if(ie(o)!==null)this.lock=o}this.set("waiting"),await this.interruptible(e,(o)=>this.deps.waitForResponse(o,15000))}catch(t){if(Te(t)){this.set("idle");return}this.failures=An,this.set("error")}finally{if(this.busy=!1,this.controller=null,!e.signal.aborted)setTimeout(()=>this.kick(),0)}}async interruptible(e,t){let r=new AbortController,n=()=>r.abort();e.signal.addEventListener("abort",n,{once:!0}),this.skipWait=()=>r.abort();try{await t(r.signal)}catch(o){if(!Te(o)||e.signal.aborted)throw o}finally{this.skipWait=null,e.signal.removeEventListener("abort",n)}}set(e){if(this.phase===e)return;this.phase=e,this.emit()}emit(){for(let e of this.listeners)e()}}var Rn="prompt-queue:shortcut",$n={ctrl:!1,alt:!0,shift:!0,meta:!1,code:"KeyQ"},Gi=()=>({...$n,...x.get(Rn,{})});var fp={path:()=>location.pathname,isGenerating:ze,waitForResponse:(e,t)=>or({signal:e,startTimeout:t}),composerText:()=>{let e=N();return e?_(e):null},send:(e,t)=>rt(e,t),settlePath:async(e,t)=>(await xe(()=>location.pathname!==e||null,{timeout:6000,interval:100,signal:t}),location.pathname),onSent:(e)=>ur(e)};class mr extends A{id="prompt-queue";name="Message Queue";description="Queue follow-up messages while an answer is generating; they send one by one when it finishes.";runner=new Pn(ee,fp,!0);panel=new Mn(ee,this.runner);button=new Q("Message queue","queue","Queue this message to send when the answer finishes",()=>void this.enqueueFromComposer(),{id:"queue",after:["batch","prompts","big"]});shortcut=Gi();restored=this.runner.paused;constructor(e){super(e)}onEnable(){this.scope.listen(window,"keydown",this.onKeydown,{capture:!0}),this.scope.add(ee.subscribe(()=>this.refresh())),this.scope.add(this.runner.onChange(()=>this.refresh())),this.scope.interval(()=>this.runner.kick(),1000),this.scope.add(()=>{this.runner.stop(),this.panel.detach()}),this.panel.render()}run(){if(this.enabled)this.button.mount();else this.button.unmount()}menuEntries(){let e=[{id:"add",label:"Queue Current Message",action:()=>void this.enqueueFromComposer()}];if(ee.size>0)e.push({id:"pause",label:this.runner.paused?"Resume Queue":"Pause Queue",action:()=>this.runner.paused?this.runner.resume():this.runner.pause()},{id:"clear",label:"Clear Queue",action:()=>ee.clear()});return e.push({id:"shortcut",label:"Configure Queue Shortcut",action:()=>this.configure()}),e}async enqueueFromComposer(){let e=N(),t=e?_(e).trim():"";if(!e||!t){H("Type a message first, then queue it.",[],3000);return}if(ee.size===0&&!this.runner.running&&!ze()){await tt(e);return}let n=ee.add(t,ie(location.pathname));if(!n){H(`The queue is full (${dr} messages).`);return}if(await W(e,""),this.restored)this.restored=!1,this.runner.resume();H(`Queued as #${ee.size}. It sends when the answer finishes.`,[{label:"Undo",onClick:()=>void this.undo(n.id,t)}],4000),this.runner.kick()}async undo(e,t){ee.remove(e);let r=N();if(r&&_(r).trim()==="")await W(r,t)}refresh(){this.panel.render(),this.context.refreshMenu()}configure(){De(this.shortcut,(e)=>{this.shortcut=e,x.set(Rn,e)},"Queue shortcut",$n)}onKeydown=(e)=>{if(!this.enabled||e.repeat||!ue(e,this.shortcut))return;e.preventDefault(),e.stopImmediatePropagation(),this.enqueueFromComposer()}}var gp=` .bp-prompt-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 8px 12px; border: 1px solid var(--bp-border); border-radius: 10px; } .bp-prompt-main { min-width: 0; } .bp-prompt-actions { display: flex; flex-shrink: 0; gap: 6px; } `,Wi=()=>P(`${b().id}-slash-styles`,gp);var Qi=()=>`${b().id}-prompts-dialog`,Vi=(e,t)=>{let r=document.getElementById(Qi());if(r instanceof HTMLDialogElement){r.close();return}Wi();let n=R({id:Qi(),title:"Prompt library",description:"Type / in an empty message box to insert a prompt.",width:620}),o=a("span","bp-updated"),i=(l)=>{let p={...l},d=a("input","bp-input");d.placeholder="Title",d.value=p.title,d.addEventListener("input",()=>p.title=d.value);let m=oe("Prompt text. Variables: {{clipboard}} {{selection}} {{date}} {{url}} {{ask:Label}}",p.body,(u)=>p.body=u);m.rows=12;let c=a("div","bp-stack");c.append(d,m),n.body.replaceChildren(c),n.footer.replaceChildren(y("Cancel",{onClick:s}),y("Save",{primary:!0,onClick:()=>{if(p.title.trim()&&p.body.trim())e.upsert({...p,title:p.title.trim()});s()}}))},s=()=>{let p=e.list().map((m)=>{let c=a("div","bp-prompt-row"),u=a("div","bp-prompt-main");u.append(a("div",void 0,m.title),a("div","bp-data-label",m.body.replace(/\s+/g," ").slice(0,70)));let h=a("div","bp-prompt-actions");return h.append(y("Insert",{onClick:()=>{n.close(),window.setTimeout(()=>t(m),0)}}),y("Edit",{onClick:()=>i(m)}),y("Delete",{onClick:()=>{e.remove(m.id),s()}})),c.append(u,h),c}),d=a("div","bp-stack");d.append(...p.length?p:[a("div","bp-empty","No prompts yet.")]),n.body.replaceChildren(d),n.footer.replaceChildren(o,y("Export",{onClick:()=>void z(e.exportJson()).then((m)=>o.textContent=m?"Copied JSON to the clipboard.":"Copy failed.")}),y("Import",{onClick:()=>{let m=window.prompt("Paste prompts JSON","");if(!m)return;try{o.textContent=`Imported ${e.importJson(m)} prompts.`,s()}catch(c){o.textContent=c instanceof Error?c.message:"Import failed."}}}),y("New prompt",{primary:!0,onClick:()=>i(e.create())}))};s(),n.show()};var Yi=()=>`${b().id}-prompt-picker`,Xi=({store:e,community:t,onPick:r,onSave:n,onManage:o})=>{let i=document.getElementById(Yi());if(i instanceof HTMLDialogElement){i.close();return}$e();let s=R({id:Yi(),title:"Prompts",width:600});s.dialog.classList.add("bp-palette");let l=e.list(),p=[],d=a("input","bp-palette-input");d.placeholder="Search your prompts and community prompts…";let m=a("div","bp-palette-list");s.body.append(d,m);let c=[],u=0,h=(S)=>{s.close(),window.setTimeout(S.run,0)},f=(S,E)=>S.map((g)=>({prompt:g,score:E?We(E,`${g.title} ${g.body}`):1})).filter(({score:g})=>g>0).sort((g,C)=>C.score-g.score).map(({prompt:g})=>g),v=()=>{let S=d.value.trim(),E=new Set(l.map((g)=>g.title));c=[...f(l,S).map((g)=>({title:g.title,hint:g.body.replace(/\s+/g," ").slice(0,70),run:()=>r(g)})),...f(p,S).filter((g)=>!E.has(g.title)).map((g)=>({title:g.title,hint:`Community · ${g.body.replace(/\s+/g," ").slice(0,56)}`,run:()=>r(g),save:()=>n(g)})),{title:"Manage prompts…",hint:"",run:o}],u=Math.min(u,c.length-1),m.replaceChildren(...c.map((g,C)=>{let L=a("div","bp-palette-item");if(L.setAttribute("aria-selected",String(C===u)),L.append(a("span",void 0,g.title),a("span","bp-palette-group",g.hint)),g.save){let w=a("button","bp-button","Save");w.type="button",w.addEventListener("click",(T)=>{T.stopPropagation(),g.save?.(),w.textContent="Saved",w.disabled=!0}),L.appendChild(w)}return L.addEventListener("click",()=>h(g)),L})),m.children[u]?.scrollIntoView({block:"nearest"})};d.addEventListener("input",()=>{u=0,v()}),d.addEventListener("keydown",(S)=>{if(S.key==="ArrowDown"||S.key==="ArrowUp")S.preventDefault(),u=(u+(S.key==="ArrowDown"?1:-1)+c.length)%c.length,v();else if(S.key==="Enter"){S.preventDefault();let E=c[u];if(E)h(E)}}),t().then((S)=>{p=S,v()}),v(),s.show(),d.focus()};var Ji="prompt-library:community",bp=86400000,yp=(e)=>{let t=e;return typeof t?.id==="string"&&typeof t.title==="string"&&typeof t.body==="string"},Dn=async(e=!1)=>{let t=x.get(Ji,null);if(t&&!e&&Date.now()-t.at({...In,...x.get(On,{})});var hr="prompt-library:prompts",vp=[{id:"summarize",title:"Summarize selection",body:`Summarize the following in 5 bullet points: {{selection}}`},{id:"explain",title:"Explain simply",body:`Explain this simply, with one example: {{clipboard}}`},{id:"review",title:"Code review",body:`Review this code for bugs, security and readability. Be specific and concise: {{clipboard}}`}],Hn=()=>`p${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`;class _n{list(){return x.get(hr,null)??vp.map((e)=>({...e}))}upsert(e){let t=this.list(),r=t.findIndex((n)=>n.id===e.id);if(r>=0)t[r]=e;else t.push(e);x.set(hr,t)}remove(e){x.set(hr,this.list().filter((t)=>t.id!==e))}create(){return{id:Hn(),title:"",body:""}}saveCopy(e){this.upsert({id:Hn(),title:e.title,body:e.body})}exportJson(){return JSON.stringify(this.list().map(({title:e,body:t})=>({title:e,body:t})),null,2)}importJson(e){let t=JSON.parse(e);if(!Array.isArray(t))throw Error("Expected a JSON array.");let r=t.filter((n)=>typeof n?.title==="string"&&typeof n?.body==="string");return x.set(hr,[...this.list(),...r.map(({title:n,body:o})=>({id:Hn(),title:n,body:o}))]),r.length}}var xp=/text|body|content|list|items?|description|code|paste|notes|context|article/i,wp=(e)=>{let t=e.startsWith("ask:")?e.slice(4).trim():e.replace(/[_-]+/g," ");return t.charAt(0).toUpperCase()+t.slice(1)},Zi=(e,t)=>{let r=-1;for(let n=0;n0&&e[n-1]==="{"?n-1:-1;continue}if(o!=="}")continue;if(r>=0&&e[n+1]==="}"){let i=e.slice(r+2,n).trim();if(i)t({start:r,end:n+2,key:i});r=-1,n++}else r=-1}},At=(e,t)=>{let r=[],n=new Set;return Zi(e,({key:o})=>{if(n.has(o))return;if(n.add(o),!t(o))r.push({key:o,label:wp(o),long:xp.test(o)})}),r},fr=(e,t)=>{let r=[],n=0;return Zi(e,({start:o,end:i,key:s})=>{r.push(e.slice(n,o)),r.push(Object.prototype.hasOwnProperty.call(t,s)?t[s]??"":e.slice(o,i)),n=i}),r.push(e.slice(n)),r.join("")};var es="",ts=(e)=>{if(e.trim())es=e},rs=()=>window.getSelection()?.toString().trim()||es;var dt=(e,{title:t,description:r,confirm:n="Continue"})=>new Promise((o)=>{let i=`${b().id}-fields-dialog`;document.getElementById(i)?.remove();let s=R({id:i,title:t,description:r,width:540}),l=Object.fromEntries(e.map((h)=>[h.key,h.value??""])),p=!1,d=(h)=>{if(p)return;p=!0,o(h)},m=()=>{d({...l}),s.close()},c=a("div","bp-stack"),u=null;for(let h of e){let f=a("label","bp-stack");f.appendChild(a("span","bp-data-label",h.label));let v=h.long?a("textarea","bp-input"):a("input","bp-input");if(v.value=l[h.key]??"",v.placeholder=h.long?"Type or paste here…":"Type here…",v instanceof HTMLTextAreaElement)v.rows=5;v.addEventListener("input",()=>l[h.key]=v.value),v.addEventListener("keydown",(S)=>{let E=S;if(E.key==="Enter"&&(!h.long||E.ctrlKey||E.metaKey))E.preventDefault(),m()}),f.appendChild(v),c.appendChild(f),u??=v}s.body.appendChild(c),s.dialog.addEventListener("close",()=>d(null)),s.footer.append(y("Cancel",{onClick:s.close}),y(n,{primary:!0,onClick:m})),s.show(),u?.focus()});var Fn=new Set(["clipboard","selection","date","time","url","title"]),Sp=()=>navigator.clipboard.readText().catch(()=>""),ns=async(e,t)=>{let r=new Date,n={clipboard:e.includes("{{clipboard")?await Sp():"",selection:rs(),date:r.toLocaleDateString(),time:r.toLocaleTimeString(),url:location.href,title:document.title},o=(d)=>Fn.has(d)&&!n[d],i=At(e,(d)=>Fn.has(d)&&!o(d)),s=At(e,(d)=>!Fn.has(d)||!o(d)).filter((d)=>!i.some((m)=>m.key===d.key)),l=[...i,...s],p=Object.fromEntries(Object.entries(n).filter(([d])=>!o(d)));if(l.length){let d=await dt(l,{title:t||"Fill in the blanks",description:"This prompt has placeholders. Type what should replace each one.",confirm:"Insert prompt"});if(!d)return null;Object.assign(p,d)}return fr(e,p)};class gr extends A{id="prompt-library";name="Prompt Library";description="Insert saved and community prompts from a button or shortcut.";store=new _n;shortcut=Mt();button=new Q("Prompt library","book","Insert a saved or community prompt",()=>this.pick(),{id:"prompts",after:["big"]});constructor(e){super(e);window.addEventListener("keydown",this.handleKeydown,!0)}run(){if(this.enabled)this.button.mount();else this.button.unmount()}menuEntries(){return[{id:"pick",label:"Open Prompt Picker",action:()=>this.pick()},{id:"manage",label:"Manage Prompts…",action:()=>this.manage()},{id:"refresh",label:"Refresh Community Prompts",action:()=>void Dn(!0)},{id:"shortcut",label:"Configure Prompt Shortcut",action:()=>this.configure()}]}pick(){Xi({store:this.store,community:()=>Dn(),onPick:(e)=>void this.insert(e),onSave:(e)=>this.store.saveCopy(e),onManage:()=>this.manage()})}manage(){Vi(this.store,(e)=>void this.insert(e))}configure(){De(this.shortcut,(e)=>{this.shortcut=e,x.set(On,e)},"Prompt shortcut",In)}async insert(e){let t=await ns(e.body,e.title),r=N();if(t===null||!r)return;await W(r,t)}handleKeydown=(e)=>{if(!this.enabled||e.repeat||!ue(e,this.shortcut))return;e.preventDefault(),e.stopImmediatePropagation(),this.pick()}}var os=(e)=>e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement,is=(e)=>e.replace(/\u200b/g,"")==="",ss=(e)=>{if(os(e))return e.selectionStart===0&&e.selectionEnd===0;let t=window.getSelection();if(!t?.rangeCount||!t.isCollapsed||!t.anchorNode||!e.contains(t.anchorNode))return!1;let r=document.createRange();return r.selectNodeContents(e),r.setEnd(t.anchorNode,t.anchorOffset),is(r.toString())},as=(e)=>{if(os(e))return e.selectionStart===e.value.length&&e.selectionEnd===e.value.length;let t=window.getSelection();if(!t?.rangeCount||!t.isCollapsed||!t.anchorNode||!e.contains(t.anchorNode))return!1;let r=document.createRange();return r.selectNodeContents(e),r.setStart(t.anchorNode,t.anchorOffset),is(r.toString())};class Nn{source;index=-1;shown=null;constructor(e){this.source=e}previous(e,t){if(e.trim()!==""){if(this.shown===null||e!==this.shown)return this.reset(),null;if(e.includes(` `)&&!t)return null}let r=this.source(),n=this.index+1;if(n>=r.length)return null;return this.index=n,this.shown=r[n],this.shown}next(e,t){if(this.shown===null||e!==this.shown)return this.reset(),null;if(e.includes(` `)&&!t)return null;if(this.index<=0)return this.reset(),"";return this.index-=1,this.shown=this.source()[this.index]??"",this.shown}reset(){this.index=-1,this.shown=null}}var ls=(e,t)=>{let r=Math.max(0,t-e);if(r<60000)return"just now";if(r<3600000)return`${Math.floor(r/60000)}m ago`;if(r<86400000)return`${Math.floor(r/3600000)}h ago`;if(r<2592000000)return`${Math.floor(r/86400000)}d ago`;return new Date(e).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})},ps=(e)=>{let r=decodeURIComponent(e.split("/").filter(Boolean).pop()??"").replace(/[-_]+/g," ").replace(/\s+[A-Za-z0-9]{16,}$/,"").trim();if(!r||/^[A-Za-z0-9]{12,}$/.test(r))return"Thread";return r.length>48?`${r.slice(0,47)}…`:r};var Ep=` .bp-recall .bp-palette-list { max-height: 340px; } .bp-recall-chips { display: flex; flex-wrap: wrap; gap: 6px; padding: 8px 12px 2px; } .bp-recall-chip { padding: 3px 10px; border: 1px solid var(--bp-border); border-radius: 999px; background: transparent; color: var(--bp-muted); font: inherit; font-size: 11px; cursor: pointer; } .bp-recall-chip:hover { background: var(--bp-accent); } .bp-recall-chip[aria-pressed='true'] { background: var(--bp-accent); color: var(--bp-fg); font-weight: 600; } .bp-recall-row { align-items: flex-start; } .bp-recall-main { display: flex; flex: 1; flex-direction: column; gap: 2px; min-width: 0; } .bp-recall-text { display: -webkit-box; overflow: hidden; word-break: break-word; white-space: pre-wrap; -webkit-box-orient: vertical; -webkit-line-clamp: 2; } .bp-recall-actions { display: none; flex-shrink: 0; flex-wrap: wrap; gap: 4px; justify-content: flex-end; max-width: 210px; } .bp-recall-row:hover .bp-recall-actions, .bp-recall-row[aria-selected='true'] .bp-recall-actions { display: flex; } .bp-recall-action { padding: 2px 8px; border: 1px solid var(--bp-border); border-radius: 6px; background: var(--bp-bg); color: var(--bp-fg); font: inherit; font-size: 11px; cursor: pointer; } .bp-recall-action:hover { background: var(--bp-accent); } .bp-recall-hint { padding: 8px 14px; border-top: 1px solid var(--bp-border); color: var(--bp-muted); font-size: 11px; } `,ds=()=>P(`${b().id}-recall-styles`,Ep);var cs=()=>`${b().id}-recall`,kp=100,Cp=[{id:"all",label:"All"},{id:"pinned",label:"Pinned"},{id:"today",label:"Today"},{id:"here",label:"This thread"}],Tp=(e,t)=>{let r=[`${e.pinned?"★ ":""}${ls(e.last,t)}`];if(e.count>1)r.push(`×${e.count}`);let n=e.threads[0];if(n)r.push(ps(n.path));return r.join(" · ")},us=({store:e,insert:t,send:r,queue:n})=>{let o=document.getElementById(cs());if(o instanceof HTMLDialogElement){o.close();return}$e(),ds();let i=R({id:cs(),title:"Recall",width:680});i.dialog.classList.add("bp-palette","bp-recall");let s=a("input","bp-palette-input");s.placeholder="Search the messages you sent…",s.setAttribute("aria-label","Search your message history");let l=a("div","bp-recall-chips"),p=a("div","bp-palette-list");p.setAttribute("role","listbox");let d=a("div","bp-recall-hint",`Enter insert · Shift+Enter send${n?" · Ctrl+Enter queue":""} · Alt+P pin · Alt+Delete remove`);i.body.append(s,l,p,d);let m="all",c=0,u=[],h=(E)=>{i.close(),window.setTimeout(E,0)},f=(E,g)=>{let C=a("button","bp-recall-action",E);return C.type="button",C.addEventListener("click",(L)=>{L.stopPropagation(),g()}),C},v=()=>{l.replaceChildren(...Cp.map(({id:E,label:g})=>{let C=a("button","bp-recall-chip",g);return C.type="button",C.setAttribute("aria-pressed",String(E===m)),C.addEventListener("click",()=>{m=E,c=0,S(),s.focus()}),C}))},S=()=>{let E=Date.now();if(u=e.search(s.value,m,{path:location.pathname,now:E}).slice(0,kp),c=Math.max(0,Math.min(c,u.length-1)),v(),!u.length){p.replaceChildren(a("div","bp-palette-empty",e.size===0?"Nothing here yet. Messages you send will appear here.":"No matching messages."));return}p.replaceChildren(...u.map((g,C)=>{let L=a("div","bp-palette-item bp-recall-row");L.setAttribute("role","option"),L.setAttribute("aria-selected",String(C===c));let w=a("div","bp-recall-main");w.append(a("div","bp-recall-text",g.text),a("div","bp-palette-group",Tp(g,E)));let T=a("div","bp-recall-actions");return T.append(f("Insert",()=>h(()=>t(g.text))),f("Send",()=>h(()=>r(g.text))),...n?[f("Queue",()=>h(()=>n(g.text)))]:[],f("Copy",()=>void z(g.text).then((M)=>H(M?"Copied.":"Could not copy.",[],2000))),f(g.pinned?"Unpin":"Pin",()=>{e.togglePin(g.id),S()}),f("Delete",()=>{e.remove(g.id),S()})),L.append(w,T),L.addEventListener("click",()=>h(()=>t(g.text))),L})),p.children[c]?.scrollIntoView({block:"nearest"})};s.addEventListener("input",()=>{c=0,S()}),s.addEventListener("keydown",(E)=>{let g=u[c];if(E.key==="ArrowDown"||E.key==="ArrowUp"){if(E.preventDefault(),u.length)c=(c+(E.key==="ArrowDown"?1:-1)+u.length)%u.length;S()}else if(E.key==="Enter"&&g)if(E.preventDefault(),E.shiftKey)h(()=>r(g.text));else if((E.ctrlKey||E.metaKey)&&n)h(()=>n(g.text));else h(()=>t(g.text));else if(E.altKey&&E.code==="KeyP"&&g)E.preventDefault(),e.togglePin(g.id),S();else if(E.altKey&&E.key==="Delete"&&g)E.preventDefault(),e.remove(g.id),S()}),S(),i.show(),s.focus()};class Bn{deps;pending=null;constructor(e){this.deps=e}intent(e){let t=e.trim();if(!t||this.deps.isAutomating())return;this.pending={text:t,at:this.deps.now()}}request(){let e=this.pending;if(!e)return;this.pending=null,this.deps.commit(e.text)}tick(){let e=this.pending;if(!e)return;let t=this.deps.now()-e.at;if(t>1e4){this.pending=null;return}if(t<1200)return;let r=this.deps.composerText();if(r!==null&&r.trim()==="")this.pending=null,this.deps.commit(e.text)}}class br extends A{id="recall";name="Recall";description="Searchable history of the messages you send, with one-key reuse and arrow-key recall.";shortcut=Ii();cursor=new Nn(()=>me.recent(100).map((e)=>e.text));recorder=new Bn({now:Date.now,composerText:()=>{let e=N();return e?_(e):null},isAutomating:xt,commit:(e)=>ur(e)});button=new Q("Recall","clock","Search the messages you sent before",()=>this.open(),{id:"recall",after:["queue","batch","prompts","big"]});constructor(e){super(e)}onEnable(){me.prune(Oe().retentionDays),this.scope.listen(window,"keydown",this.onKeydown,{capture:!0}),this.scope.listen(document,"click",this.onClick,{capture:!0}),this.scope.add(k().onSend(()=>this.recorder.request())),this.scope.interval(()=>this.recorder.tick(),250)}run(){if(this.enabled)this.button.mount();else this.button.unmount()}menuEntries(){let e=Oe();return[{id:"open",label:"Open Recall…",action:()=>this.open()},{id:"pause",label:e.paused?"Resume Recording":"Pause Recording",action:()=>this.update({paused:!e.paused})},{id:"arrows",label:`Turn Arrow-Key History ${e.arrowHistory?"Off":"On"}`,action:()=>this.update({arrowHistory:!e.arrowHistory})},{id:"retention",label:"Set History Retention…",action:()=>this.setRetention()},{id:"export",label:"Export History…",action:()=>we(`${b().id}-history.json`,me.exportJson(),"application/json")},{id:"import",label:"Import History…",action:()=>this.importFile()},{id:"clear",label:"Clear History…",action:()=>this.clear()},{id:"shortcut",label:"Configure Recall Shortcut",action:()=>this.configure()}]}open(){us({store:me,insert:(e)=>void this.insert(e),send:(e)=>void this.send(e),queue:x.get("module:prompt-queue",!0)?(e)=>this.enqueue(e):null})}async insert(e){let t=N();if(t&&await W(t,e)){t.focus();return}await z(e),H("There is no message box on this page, so the message was copied instead.")}async send(e){let t=N();if(t&&await W(t,e)){await tt(t);return}await z(e),H("There is no message box on this page, so the message was copied instead.")}enqueue(e){let t=ee.add(e,ie(location.pathname));H(t?`Queued as #${ee.size}.`:"The queue is full.",[],3000)}update(e){Oi({...Oe(),...e}),this.context.refreshMenu()}setRetention(){let e=Oe().retentionDays,t=window.prompt("Keep history for how many days? Use 0 to keep it forever. Pinned messages are always kept.",String(e));if(t===null)return;let r=Math.max(0,Math.min(3650,Math.round(Number(t))));if(!Number.isFinite(r))return;this.update({retentionDays:r});let n=me.prune(r);H(r===0?"History is kept forever.":`History is kept for ${r} days${n?` (${n} older messages removed)`:""}.`)}importFile(){let e=document.createElement("input");e.type="file",e.accept="application/json,.json",e.addEventListener("change",()=>{let t=e.files?.[0];if(!t)return;t.text().then((r)=>{let n=me.importJson(r);H(`Imported ${n.added} new and ${n.merged} existing messages${n.skipped?`, skipped ${n.skipped}`:""}.`)})}),e.click()}clear(){if(!window.confirm(`Delete ${me.size} remembered messages? Pinned messages are kept.`))return;me.clear(!0),H("History cleared.",[],3000)}configure(){De(this.shortcut,(e)=>{this.shortcut=e,x.set(Cn,e)},"Recall shortcut",Tn)}onKeydown=(e)=>{if(!this.enabled)return;if(!e.repeat&&ue(e,this.shortcut)){e.preventDefault(),e.stopImmediatePropagation(),this.open();return}if(e.isComposing)return;let t=N();if(!t||Vo(e.target)!==t)return;if(e.key==="Enter"&&!e.shiftKey){this.recorder.intent(_(t));return}if(!e.shiftKey&&!e.altKey&&!e.ctrlKey&&!e.metaKey&&Oe().arrowHistory&&(e.key==="ArrowUp"||e.key==="ArrowDown"))this.navigate(e,t)};navigate(e,t){let r=_(t),n=e.key==="ArrowUp"?this.cursor.previous(r,ss(t)):this.cursor.next(r,as(t));if(n===null)return;e.preventDefault(),e.stopImmediatePropagation(),W(t,n)}onClick=(e)=>{if(!this.enabled)return;let t=ve(e.target)?.closest("button");if(!t||Pe(t)||!et(t))return;let r=N();if(r)this.recorder.intent(_(r))}}var Lp=/\{\{\s*(item|index|total|date|\d+)\s*\}\}/g,Un=(e)=>e.split(` `).map((t)=>t.trim()).filter(Boolean),yr=(e,t,r,n)=>{let o=t.includes("\t")?t.split("\t"):t.split(",");return e.replace(Lp,(i,s)=>{if(s==="item")return t;if(s==="index")return String(r+1);if(s==="total")return String(n);if(s==="date")return new Date().toLocaleDateString();return(o[Number(s)-1]??"").trim()})};var ms=()=>`${b().id}-batch-dialog`,hs=200,qn=3,Mp=[{label:"Research companies",template:"Give me a short profile of {{item}}: what they do, funding, main competitors.",items:`Stripe Notion Linear`},{label:"Translate sentences",template:'Translate to French and explain any tricky words: "{{item}}"',items:`Good morning, how are you? The meeting was moved to Friday.`},{label:"Summarize pages",template:"Summarize this page in 3 bullet points: {{item}}",items:`https://example.com/a https://example.com/b`}],jn=(e,t,r,n)=>{let o=a("section","bp-stack");o.dataset.tour=n;let i=a("div");i.append(a("div","bp-dialog-title",`${e}. ${t}`),a("div","bp-dialog-description",r));let s=a("div","bp-stack");return o.append(i,s),{root:o,body:s}},fs=(e)=>{if(document.getElementById(ms()))return;let t=R({id:ms(),title:"Batch Runner",description:"Send the same kind of message many times, one after another, in this conversation.",width:700}),r="",n="",o=2,i=!1,s=y("Start",{primary:!0}),l=a("div","bp-split-summary"),p=a("div","bp-stack"),d=a("div","bp-hint"),m=jn(1,"Write your message","Put {{item}} where each list entry should go. Example: Give me a short profile of {{item}}.","batch-template"),c=oe("Give me a short profile of {{item}}.","",(g)=>{r=g,S()});c.rows=3;let u=a("div","bp-actions");u.style.cssText="display:flex;flex-wrap:wrap;gap:6px;align-items:center",u.appendChild(a("span","bp-data-label","Not sure? Try an example:"));for(let g of Mp)u.appendChild(y(g.label,{onClick:()=>{r=g.template,n=g.items,c.value=r,f.value=n,S()}}));m.body.append(c,u);let h=jn(2,"Paste your list","One entry per line. Each line becomes one message. For several columns, separate them with commas and use {{1}}, {{2}}…","batch-items"),f=oe(`Stripe Notion Linear`,"",(g)=>{n=g,S()});f.rows=6,h.body.append(f,l);let v=jn(3,"Review and run","Check the first messages below. The runner sends them one by one and waits for each answer before sending the next.","batch-review");v.body.append(p,Re({label:"Pause between messages",hint:"Seconds. A short pause is kinder to your limits.",value:o,min:0,max:300,onChange:(g)=>o=g}).wrapper,d,J({label:"I understand every message uses one query",checked:!1,onChange:(g)=>{i=g,S()}}).wrapper);let S=()=>{let g=Un(n),C=g.length>hs,L=/\{\{\s*(item|\d+)\s*\}\}/.test(r);if(l.textContent=g.length?`${g.length} ${g.length===1?"entry":"entries"} found.`:"No entries yet.",p.replaceChildren(...g.slice(0,qn).map((w,T)=>{let M=a("div","bp-split-part");return M.style.cssText="padding:10px 12px;white-space:pre-wrap;font-size:12px",M.textContent=`${T+1}. ${yr(r,w,T,g.length)}`,M})),g.length>qn)p.appendChild(a("div","bp-data-label",`…and ${g.length-qn} more.`));d.textContent=C?`Too many entries (${g.length}). The maximum is ${hs}.`:!r.trim()?"Write your message in step 1.":!L?"Tip: add {{item}} to your message so each entry is included. Without it, every message is identical.":`This will send ${g.length} messages and use ${g.length} queries. Other {{blanks}} in your message are asked once before starting.`,s.disabled=!g.length||C||!r.trim()||!i};s.addEventListener("click",()=>{let g=Un(n);t.close(),e({template:r,items:g,delay:o})});let E=a("div","bp-stack");E.style.gap="20px",E.append(m.root,h.root,v.root),t.body.appendChild(E),t.footer.append(y("Cancel",{onClick:t.close}),s),S(),t.show()};var gs=()=>`${b().id}-batch-styles`,Ap={sending:"sending",waiting:"waiting for the answer",paused:"paused",resting:"resting"};class Kn{element=D(a("div","bp-batch-panel bp-themed"));label=a("div");fill=a("div","bp-progress-fill");actions=a("div","bp-batch-actions");constructor(){if(O(),!document.getElementById(gs())){let t=a("style");t.id=gs(),t.textContent=` .bp-batch-panel { position: fixed; right: 20px; bottom: 20px; z-index: 100000; display: flex; flex-direction: column; gap: 8px; width: 300px; padding: 12px 14px; border: 1px solid var(--bp-border); border-radius: 12px; background: var(--bp-bg); color: var(--bp-fg); box-shadow: 0 12px 32px rgb(0 0 0 / 22%); font-size: 12px; } .bp-batch-actions { display: flex; gap: 6px; flex-wrap: wrap; } `,document.head.appendChild(t)}let e=a("div","bp-progress");e.appendChild(this.fill),this.element.append(this.label,e,this.actions)}mount(){if(!this.element.isConnected)document.body.appendChild(this.element)}setActions(...e){this.actions.replaceChildren(...e)}running(e){let t=y("Pause",{onClick:()=>{if(e.isPaused())e.onResume(),t.textContent="Pause";else e.onPause(),t.textContent="Resume"}});this.setActions(t,y("Cancel",{onClick:e.onCancel})),this.mount()}update(e,t,r){this.label.textContent=`Item ${e+1}/${t}: ${Ap[r]}`,this.fill.style.width=`${((e+(r==="waiting"?0.6:0.2))/t*100).toFixed(0)}%`}finish(e,t){this.label.textContent=e==="finished"?"Batch finished.":e==="cancelled"?"Batch cancelled.":"Batch stopped: a message could not be sent.",this.fill.style.width=e==="finished"?"100%":this.fill.style.width,this.setActions(y("Export thread",{primary:!0,onClick:t}),y("Close",{onClick:()=>this.element.remove()})),this.mount()}offerResume(e,t,r){this.label.textContent=`An interrupted batch has ${e} items left.`,this.fill.style.width="0%",this.setActions(y("Resume",{primary:!0,onClick:t}),y("Discard",{onClick:()=>{r(),this.element.remove()}})),this.mount()}}var zn="batch-runner:state",Pp=21600000,bs=()=>{let e=x.get(zn,null);return e&&e.nextx.set(zn,null);class Gn{controller=null;paused=!1;release=null;get active(){return this.controller!==null}get isPaused(){return this.paused}pause(){this.paused=!0}resume(){this.paused=!1,this.release?.()}cancel(){this.controller?.abort(),this.resume()}async run(e,t){if(this.controller)return"failed";let r=new AbortController;this.controller=r;let{signal:n}=r,o=e.prompts.length;try{return await Yt(async()=>{for(let i=e.next;i{this.release=s,n.addEventListener("abort",()=>s(),{once:!0})});if(n.throwIfAborted(),t(i,o,"sending"),!await rt(e.prompts[i],n))return"failed";if(t(i,o,"waiting"),await or({signal:n}),x.set(zn,{...e,next:i+1,at:Date.now()}),e.delay>0&&ithis.open(),{id:"batch",after:["prompts","big"]});offered=!1;constructor(e){super(e)}run(){if(!this.enabled){this.button.unmount();return}if(this.button.mount(),this.offered||this.runner.active)return;let e=bs();if(!e)return;this.offered=!0,this.panel.offerResume(e.prompts.length-e.next,()=>void this.start(e),vr)}menuEntries(){return[{id:"open",label:"Batch Runner…",action:()=>this.open()}]}open(){if(this.runner.active)return;fs((e)=>void this.prepare(e))}async start(e){this.panel.running({onPause:()=>this.runner.pause(),onResume:()=>this.runner.resume(),onCancel:()=>this.runner.cancel(),isPaused:()=>this.runner.isPaused});let t=await this.runner.run(e,(r,n,o)=>this.panel.update(r,n,o));if(t==="cancelled")vr();this.panel.finish(t,()=>this.context.runCommand("exporter:export"))}async prepare({template:e,items:t,delay:r}){let n=At(e,(s)=>/^(item|index|total|date|\d+)$/.test(s)),o=e;if(n.length){let s=await dt(n,{title:"Fill in the blanks",description:"These are the same for every message in the batch.",confirm:"Start batch"});if(!s)return;o=fr(e,s)}let i=t.map((s,l)=>yr(o,s,l,t.length));await this.start({prompts:i,next:0,delay:r,at:Date.now()})}}var Rp=` .bp-sel { position: fixed; z-index: 99996; display: none; gap: 2px; padding: 4px; border: 1px solid var(--bp-border); border-radius: 10px; background: var(--bp-bg); box-shadow: 0 8px 24px rgb(0 0 0 / 22%); } .bp-sel[data-visible='true'] { display: flex; } .bp-sel button { padding: 5px 10px; border: 0; border-radius: 6px; background: transparent; color: var(--bp-fg); font: 12.5px ui-sans-serif, system-ui, sans-serif; cursor: pointer; } .bp-sel button:hover { background: var(--bp-accent); } `,$p=2,Pt=(e)=>e.split(` `).map((t)=>`> ${t}`).join(` `),Dp=[{id:"ask",label:"Ask",title:"Ask a question about this",compose:async(e)=>{let t=await dt([{key:"question",label:"Your question about the selected text",long:!0}],{title:"Ask about this",description:e.slice(0,160),confirm:"Insert"});return t?.question?.trim()?`${Pt(e)} ${t.question.trim()}`:null}},{id:"explain",label:"Explain",title:"Explain this simply",compose:async(e)=>`Explain this simply, with one example: ${Pt(e)}`},{id:"summarize",label:"Summarize",title:"Summarize this",compose:async(e)=>`Summarize this in a few bullet points: ${Pt(e)}`},{id:"check",label:"Fact-check",title:"Fact-check this",compose:async(e)=>`Fact-check this claim. Cite sources and say what is right, wrong or uncertain: ${Pt(e)}`},{id:"quote",label:"Quote",title:"Quote in the message box",compose:async(e)=>`${Pt(e)} `}];class wr extends A{id="selection-toolbar";name="Selection Toolbar";description="Ask, explain, summarize or quote any selected text.";bar=D(a("div","bp-sel bp-themed"));selected="";timer=0;constructor(e){super(e);O(),P(`${b().id}-selection-styles`,Rp);for(let t of Dp){let r=a("button",void 0,t.label);r.type="button",r.title=`${t.title} (Shift-click sends)`,r.addEventListener("mousedown",(n)=>n.preventDefault()),r.addEventListener("click",(n)=>void this.apply(t,n.shiftKey)),this.bar.appendChild(r)}document.addEventListener("mouseup",this.schedule),document.addEventListener("keyup",this.schedule),document.addEventListener("scroll",this.hide,!0),document.addEventListener("mousedown",this.handleMouseDown,!0)}run(){if(!this.enabled)this.hide()}menuEntries(){return[]}schedule=()=>{window.clearTimeout(this.timer),this.timer=window.setTimeout(()=>this.update(),30)};hide=()=>{this.bar.dataset.visible="false"};handleMouseDown=(e)=>{if(!(e.target instanceof Node&&this.bar.contains(e.target)))this.hide()};update(){let e=window.getSelection(),t=e?.toString().trim()??"",r=e?.anchorNode,n=r instanceof Element?r:r?.parentElement;if(!this.enabled||!e||e.isCollapsed||t.length<$p||!n||Pe(n)||n.closest("textarea, input, [contenteditable], dialog")){this.hide();return}this.selected=t,ts(t);let o=e.getRangeAt(0).getBoundingClientRect();if(!this.bar.isConnected)document.body.appendChild(this.bar);this.bar.dataset.visible="true";let i=Math.min(Math.max(8,o.left+o.width/2-this.bar.offsetWidth/2),window.innerWidth-this.bar.offsetWidth-8);this.bar.style.left=`${i}px`,this.bar.style.top=`${Math.max(8,o.top-this.bar.offsetHeight-8)}px`}async apply(e,t){let r=this.selected;this.hide();let n=await e.compose(r),o=N();if(n===null||!o)return;let i=_(o).trim();if(await W(o,i?`${i} ${n}`:n),t)await tt(o)}}class Wn{originals=new WeakMap;hidden=new WeakSet;apply(e,t){let r=this.originals.get(e)??new Map;this.originals.set(e,r);for(let[n,o]of Object.entries(t)){if(!r.has(n))r.set(n,{value:e.style.getPropertyValue(n),priority:e.style.getPropertyPriority(n)});if(e.style.getPropertyValue(n)!==o||e.style.getPropertyPriority(n)!=="important")e.style.setProperty(n,o,"important")}}restore(e,t){let r=this.originals.get(e);if(!r)return;for(let n of t){let o=r.get(n);if(!o)continue;if(o.value)e.style.setProperty(n,o.value,o.priority);else e.style.removeProperty(n);r.delete(n)}}setHidden(e,t,r){if(t)this.apply(e,{display:"none"}),this.hidden.add(e);else if(this.hidden.has(e))this.restore(e,["display"]),this.hidden.delete(e)}}var ys="max-width:remove-sidebar",Op='main [class*="max-w-"], main [style*="max-width"]',Ip=["header","pre","code","[data-code-block]",'[role="dialog"]','[role="menu"]','[role="listbox"]','[role="tooltip"]',"dialog","[data-radix-popper-content-wrapper]"].join(", "),Hp=1200,vs="12px",xs=({xpath:e,selector:t})=>{if(e)return Io(e);return t?document.querySelector(t):null},ws=(e)=>e.isConnected&&!Pe(e)&&!e.closest(Ip)&&e.closest("main")!==null;class Rt extends A{options;id="max-width";name="Max Width";description="Use the available content width without overflowing the page or removing its side padding.";styles=new Wn;touched=new Map;scannedAt=0;constructor(e,t){super(e);this.options=t}get removeSidebar(){return this.options.storage.get(ys,this.options.sidebar?.defaultRemoved??!1)}set removeSidebar(e){this.options.storage.set(ys,e)}run(){let e=this.enabled;for(let t of this.options.hidden??[])this.syncHidden(t,e);if(this.options.sidebar)this.syncHidden(this.options.sidebar.rule,e&&this.removeSidebar);if(!e){this.restore();return}for(let t of this.options.layout??[]){let r=xs(t);if(!r||!ws(r))continue;this.apply(r,{...t.styles,"box-sizing":"border-box","min-width":"0","max-width":"100%"})}this.expand()}onDisable(){this.restore();for(let e of this.options.hidden??[])this.syncHidden(e,!1);if(this.options.sidebar)this.syncHidden(this.options.sidebar.rule,!1)}menuEntries(){let e=this.options.sidebar;return e?[{label:`${this.removeSidebar?"Show":"Remove"} ${e.label}`,action:()=>{this.removeSidebar=!this.removeSidebar,this.context.refreshMenu(),this.context.requestUpdate()}}]:[]}apply(e,t){let r=this.touched.get(e)??new Set;for(let n of Object.keys(t))r.add(n);this.touched.set(e,r),this.styles.apply(e,t)}expand(){let e=Date.now();if(e-this.scannedAt{if(!ws(n))return!1;if(n.getBoundingClientRect().width<320)return!1;let i=Number.parseFloat(getComputedStyle(n).maxWidth);return this.touched.has(n)||Number.isFinite(i)&&i>=480}),r=t.filter((n)=>!t.some((o)=>o!==n&&o.contains(n)));for(let n of t)this.apply(n,{"box-sizing":"border-box","min-width":"0","max-width":"100%"});for(let[n,o]of this.touched)if(!r.includes(n)&&o.has("padding-inline-start"))this.styles.restore(n,["padding-inline-start","padding-inline-end"]),o.delete("padding-inline-start"),o.delete("padding-inline-end");for(let n of r)this.apply(n,{"padding-inline-start":vs,"padding-inline-end":vs})}syncHidden(e,t){let r=xs(e);if(r)this.styles.setHidden(r,t,e.xpath??e.selector??e.id)}restore(){for(let[e,t]of this.touched)this.styles.restore(e,[...t]);this.touched.clear(),this.scannedAt=0}}var _p={javascript:["JS","#f7df1e","#000"],typescript:["TS","#3178c6","#fff"],python:["PY","#3776ab","#ffd43b"],bash:[">_","#3b8f2b","#fff"],powershell:["PS","#012456","#fff"],batch:["BAT","#4d4d4d","#fff"],json:["{}","#e9a620","#000"],yaml:["YML","#cb171e","#fff"],toml:["TOML","#9c4221","#fff"],html:["","#e34f26","#fff"],xml:["XML","#0060ac","#fff"],css:["CSS","#1572b6","#fff"],sql:["SQL","#e48e00","#000"],graphql:["GQL","#e10098","#fff"],protobuf:["PB","#4a7fb0","#fff"],go:["GO","#00add8","#fff"],rust:["RS","#ce422b","#fff"],zig:["ZIG","#f7a41d","#000"],nim:["NIM","#ffe953","#000"],java:["JV","#e76f00","#fff"],kotlin:["KT","#7f52ff","#fff"],scala:["SC","#dc322f","#fff"],groovy:["GRV","#4298b8","#fff"],swift:["SW","#f05138","#fff"],objectivec:["OBJ","#438eff","#fff"],dart:["DRT","#0175c2","#fff"],c:["C","#00599c","#fff"],cpp:["C++","#00599c","#fff"],csharp:["C#","#68217a","#fff"],php:["PHP","#777bb4","#fff"],ruby:["RB","#cc342d","#fff"],perl:["PL","#39457e","#fff"],lua:["LUA","#000080","#fff"],r:["R","#276dc3","#fff"],julia:["JL","#9558b2","#fff"],matlab:["M","#e16737","#fff"],haskell:["HS","#5d4f85","#fff"],elixir:["EX","#6e4a7e","#fff"],clojure:["CLJ","#5881d8","#fff"],solidity:["SOL","#363636","#fff"],assembly:["ASM","#6e4c13","#fff"],vim:["VIM","#019733","#fff"],nginx:["NGX","#009639","#fff"],makefile:["MK","#6d8086","#fff"],dockerfile:["DK","#2496ed","#fff"],latex:["TEX","#008080","#fff"],markdown:["M↓","#083fa1","#fff"],diff:["±","#6f42c1","#fff"],regex:[".*","#6f42c1","#fff"],http:["HTTP","#1f6feb","#fff"],log:["LOG","#6e7681","#fff"],csv:["CSV","#217346","#fff"],jsx:["JSX","#149eca","#ffffff"],tsx:["TSX","#3178c6","#ffffff"],vue:["V","#42b883","#172554"],svelte:["S","#ff3e00","#ffffff"],scss:["Sass","#cc6699","#ffffff"],fsharp:["F#","#378bba","#ffffff"],erlang:["ERL","#a90533","#ffffff"],ocaml:["ML","#ec6813","#ffffff"],nix:["NIX","#5277c3","#ffffff"],terraform:["TF","#7b42bc","#ffffff"],hcl:["HCL","#7b42bc","#ffffff"],prisma:["P","#2d3748","#ffffff"],astro:["A","#bc52ee","#ffffff"],fish:[">_","#4aa3df","#ffffff"],glsl:["GL","#5586a4","#ffffff"],hlsl:["HL","#5586a4","#ffffff"],wgsl:["WG","#005a9c","#ffffff"],jupyter:["J","#f37626","#ffffff"],mermaid:["MM","#ff3670","#ffffff"],plantuml:["UML","#d9b34c","#18181b"],cobol:["COB","#005ca9","#ffffff"],fortran:["F","#734f96","#ffffff"]},Ss=(e)=>{let t=_p[e];if(!t){let s=a("span","bp-lang-icon bp-lang-plain");return s.title="Plain text",s.appendChild(V("file",16)),s}let[r,n,o]=t,i=a("span","bp-lang-icon bp-lang-badge",r);return i.style.setProperty("--c",n),i.style.setProperty("--badge-fg",o),i.dataset.size=String(r.length),i};var $t=(e="")=>{let t=a("span",e?`bp-line ${e}`:"bp-line"),r=a("span","bp-text");return t.append(a("span","bp-num"),r),{line:t,text:r}},Fp=(e)=>{if(e.startsWith("@@"))return"hunk";if(e.startsWith("+")&&!e.startsWith("+++"))return"add";if(e.startsWith("-")&&!e.startsWith("---"))return"del";return""},ks=(e,t)=>e.split(` `).map((r)=>{let{line:n,text:o}=$t(t?Fp(r):"");return o.textContent=r,n}),Es=(e)=>{let{line:t,text:r}=$t(),n=r;for(let o of e){let i=o.cloneNode(!1);n.appendChild(i),n=i}return{line:t,tip:n}},Cs=(e,t)=>{let r=[],n=[],o=Es(r);n.push(o.line);let i=(s)=>{if(s.nodeType===Node.TEXT_NODE){(s.textContent??"").split(` `).forEach((d,m)=>{if(m>0)o=Es(r),n.push(o.line);if(d)o.tip.appendChild(document.createTextNode(d))});return}if(!(s instanceof Element))return;r.push(s);let l=s.cloneNode(!1);o.tip.appendChild(l),o.tip=l,s.childNodes.forEach(i),r.pop(),o.tip=o.tip.parentElement??o.line};e.childNodes.forEach(i);while(n.length>t&&!n.at(-1)?.textContent)n.pop();return n};var Dt=String.raw`(?![\s\S])`,se=String.raw`"(?:\\.|[^"\\\n])*"?`,he=String.raw`'(?:\\.|[^'\\\n])*'?`,Np=String.raw`\x60(?:\\[\s\S]|[^\x60\\])*\x60?`,Qe=String.raw`\b(?:0[xX][\da-fA-F_]+|\d[\d_]*(?:\.\d+)?(?:[eE][+-]?\d+)?)\b`,Sr=String.raw`\/\*[\s\S]*?(?:\*\/|${Dt})`,Ls=String.raw`\/\/[^\n]*`,ct=String.raw`#[^\n]*`,Qn=String.raw`\b[A-Za-z_$][\w$]*(?=\s*\()`,Ms=String.raw`\b[A-Z][A-Za-z0-9_]*\b`,Bp=String.raw`"""[\s\S]*?(?:"""|${Dt})|'''[\s\S]*?(?:'''|${Dt})`,Ie=(e)=>String.raw`\b(?:${e.trim().split(/\s+/).join("|")})\b`,ut={javascript:"break case catch class const continue debugger default delete do else export extends finally for function if import in instanceof let new of return static super switch this throw try typeof var void while with yield async await true false null undefined from as",typescript:"interface type enum implements namespace declare readonly abstract public private protected keyof infer is satisfies string number boolean any unknown never object",go:"break case chan const continue default defer else fallthrough for func go goto if import interface map package range return select struct switch type var true false nil",rust:"as async await break const continue crate dyn else enum extern false fn for if impl in let loop match mod move mut pub ref return self Self static struct super trait true type unsafe use where while",java:"abstract assert boolean break byte case catch char class const continue default do double else enum extends final finally float for if implements import instanceof int interface long native new null package private protected public return short static super switch synchronized this throw throws transient true false try void volatile while var record",c:"auto break case char const continue default do double else enum extern float for goto if inline int long register return short signed sizeof static struct switch typedef union unsigned void volatile while class namespace template typename using new delete public private protected virtual nullptr true false bool this operator",csharp:"using namespace string object bool decimal foreach in is as async await var readonly override virtual interface struct enum delegate event get set public private protected internal static class new return if else for while switch case break continue try catch finally throw null true false void int",kotlin:"fun val var class object interface when if else for while return break continue is in as import package null true false this super override open data sealed suspend companion init",swift:"func let var class struct enum protocol extension import return if else guard switch case default for in while break continue nil true false self super init deinit throws try catch defer public private internal static",php:"function class public private protected static return if else elseif foreach for while switch case break continue new try catch throw namespace use echo null true false array isset empty",ruby:"def end class module if elsif else unless while until for in do begin rescue ensure return yield self nil true false and or not puts require include",python:"False None True and as assert async await break class continue def del elif else except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield self",shell:"if then else elif fi for while do done case esac function in return exit export local echo cd sudo",powershell:"if else elseif foreach for while switch function param return try catch finally throw true false null",sql:"select from where and or not in is null insert into values update set delete create table alter drop index view join left right inner outer on group by order having limit offset as distinct union all case when then else end primary key foreign references default unique exists between like asc desc count sum avg min max"},Se=(e,t="")=>[["comment",`${Ls}|${Sr}`],["string",`${se}|${he}|${Np}`],["number",Qe],["keyword",Ie(`${ut[e]??""} ${t}`)],["fn",Qn],["type",Ms]],Ts=(e,t=`${se}|${he}`)=>[["comment",ct],["string",t],["number",Qe],["keyword",Ie(ut[e]??"")],["fn",Qn],["type",Ms]],j=(e,t="g")=>({rules:e,regex:new RegExp(e.map(([,r],n)=>`(?${r})`).join("|"),t)}),Up={javascript:j(Se("javascript")),typescript:j(Se("javascript",ut.typescript)),go:j(Se("go")),rust:j(Se("rust")),java:j(Se("java")),c:j(Se("c")),csharp:j(Se("csharp")),kotlin:j(Se("kotlin")),swift:j(Se("swift")),php:j([["comment",`${Ls}|${ct}|${Sr}`],...Se("php").slice(1)]),python:j([["attr",String.raw`^[ \t]*@[\w.]+`],...Ts("python",`${Bp}|${se}|${he}`)],"gm"),ruby:j(Ts("ruby")),bash:j([["comment",String.raw`(?:^|(?<=\s))#[^\n]*`],["string",`${se}|${he}`],["attr",String.raw`\$\{?[\w@#?*-]+\}?`],["key",String.raw`(?<=\s)--?[A-Za-z][\w-]*`],["keyword",Ie(ut.shell??"")],["number",Qe]],"gm"),powershell:j([["comment",ct],["string",`${se}|${he}`],["attr",String.raw`\$[\w:]+`],["keyword",Ie(ut.powershell??"")],["fn",String.raw`\b[A-Z][a-z]+-[A-Za-z]+\b`]]),json:j([["key",String.raw`"(?:\\.|[^"\\\n])*"(?=\s*:)`],["string",se],["number",Qe],["keyword",Ie("true false null")]]),yaml:j([["comment",ct],["key",String.raw`^[ \t-]*[\w.\-/"']+(?=\s*:(?:\s|${Dt}))`],["string",`${se}|${he}`],["number",Qe],["keyword",Ie("true false null yes no on off")]],"gm"),toml:j([["comment",ct],["tag",String.raw`^\[[^\]\n]+\]`],["key",String.raw`^[\w.\-]+(?=\s*=)`],["string",`${se}|${he}`],["number",Qe],["keyword",Ie("true false")]],"gm"),html:j([["comment",String.raw`|${Dt})`],["keyword",String.raw`]*>`],["tag",String.raw`<\/?[A-Za-z][\w:.-]*|\/?>`],["attr",String.raw`[\w:@.-]+(?==)`],["string",`${se}|${he}`]],"gi"),css:j([["comment",Sr],["string",`${se}|${he}`],["keyword",String.raw`@[\w-]+`],["key",String.raw`[\w-]+(?=\s*:)`],["number",String.raw`#[0-9a-fA-F]{3,8}\b|-?\d*\.?\d+(?:px|r?em|%|vh|vw|ms|s|deg|fr)?`],["type",String.raw`[.#][\w-]+`]]),sql:j([["comment",String.raw`--[^\n]*|${Sr}`],["string",`${he}|${se}`],["number",Qe],["keyword",Ie(ut.sql??"")],["fn",Qn]],"gi"),dockerfile:j([["comment",ct],["string",`${se}|${he}`],["keyword",String.raw`^(?:FROM|RUN|CMD|COPY|ADD|ENTRYPOINT|ENV|EXPOSE|WORKDIR|USER|ARG|LABEL|VOLUME|AS)\b`]],"gm")},qp={cpp:"c",xml:"html",objectivec:"c",dart:"java",scala:"java",groovy:"java",solidity:"javascript",perl:"ruby",zig:"rust",nim:"python",julia:"python",jsx:"javascript",tsx:"typescript",scss:"css",vue:"html",svelte:"html",astro:"html",hlsl:"c",glsl:"c",wgsl:"rust",fish:"bash"},jp=(e,{rules:t,regex:r})=>{let n=[],o=0;for(let i of e.matchAll(r)){let s=i.index??0;if(s>o)n.push({type:"plain",text:e.slice(o,s)});let l=t.findIndex((p,d)=>i.groups?.[`r${d}`]!==void 0);n.push({type:t[l]?.[0]??"plain",text:i[0]}),o=s+i[0].length}if(o{let r=Up[qp[t]??t];if(!r)return null;let n=[],o=$t();n.push(o.line);for(let i of jp(e,r))i.text.split(` `).forEach((s,l)=>{if(l>0)o=$t(),n.push(o.line);if(!s)return;if(i.type==="plain")o.text.appendChild(document.createTextNode(s));else o.text.appendChild(a("span",`bp-tok bp-tok-${i.type}`,s))});return n};var Kp=[["tsx","TSX",211,"tsx","tsx typescriptreact"],["jsx","JSX",190,"jsx","jsx javascriptreact"],["vue","Vue",153,"vue","vue"],["svelte","Svelte",15,"svelte","svelte"],["scss","SCSS",330,"scss","scss sass"],["fsharp","F#",200,"fs","fsharp f# fs fsx"],["erlang","Erlang",340,"erl","erlang erl"],["ocaml","OCaml",25,"ml","ocaml ml mli"],["nix","Nix",210,"nix","nix"],["terraform","Terraform",260,"tf","terraform tf hcl"],["hcl","HCL",260,"hcl","hcl"],["prisma","Prisma",220,"prisma","prisma"],["astro","Astro",280,"astro","astro"],["fish","Fish",100,"fish","fish"],["hlsl","HLSL",175,"hlsl","hlsl fx"],["glsl","GLSL",175,"glsl","glsl vert frag"],["wgsl","WGSL",175,"wgsl","wgsl"],["jupyter","Jupyter",25,"ipynb","jupyter ipynb"],["mermaid","Mermaid",330,"mmd","mermaid mmd"],["plantuml","PlantUML",40,"puml","plantuml puml"],["cobol","COBOL",205,"cob","cobol cob cbl"],["fortran","Fortran",280,"f90","fortran f90 f95 f03"],["javascript","JavaScript",50,"js","js mjs cjs node nodejs"],["typescript","TypeScript",211,"ts","ts"],["python","Python",207,"py","py python3 py3 ipython"],["bash","Shell",140,"sh","sh shell zsh bash console terminal shellscript"],["powershell","PowerShell",215,"ps1","ps1 pwsh"],["json","JSON",90,"json","json jsonc json5"],["yaml","YAML",0,"yml","yml yaml"],["toml","TOML",25,"toml","toml ini cfg"],["html","HTML",15,"html","html htm xhtml svg"],["xml","XML",165,"xml","xml xsl plist"],["css","CSS",265,"css","css less"],["sql","SQL",200,"sql","sql mysql postgres postgresql sqlite plsql tsql"],["go","Go",190,"go","go golang"],["rust","Rust",20,"rs","rs rust"],["java","Java",10,"java","java"],["kotlin","Kotlin",280,"kt","kt kotlin kts"],["swift","Swift",15,"swift","swift"],["c","C",220,"c","c h"],["cpp","C++",215,"cpp","cpp c++ cc cxx hpp"],["csharp","C#",280,"cs","cs csharp c#"],["php","PHP",240,"php","php"],["ruby","Ruby",0,"rb","rb ruby"],["markdown","Markdown",200,"md","md markdown mdx"],["diff","Diff",130,"diff","diff patch"],["dockerfile","Dockerfile",205,"Dockerfile","dockerfile docker"],["text","Text",0,"txt","text txt plain plaintext none"],["lua","Lua",240,"lua","lua"],["r","R",210,"r","r rscript"],["dart","Dart",200,"dart","dart"],["scala","Scala",5,"scala","scala sc"],["perl","Perl",230,"pl","pl perl"],["haskell","Haskell",270,"hs","hs haskell"],["elixir","Elixir",280,"ex","ex exs elixir"],["clojure","Clojure",220,"clj","clj cljs clojure"],["matlab","MATLAB",15,"m","matlab octave"],["vim","Vim script",140,"vim","vim vimscript"],["nginx","Nginx",145,"conf","nginx"],["graphql","GraphQL",320,"graphql","graphql gql"],["protobuf","Protobuf",210,"proto","proto protobuf"],["makefile","Makefile",200,"mk","make makefile mk"],["latex","LaTeX",180,"tex","tex latex"],["groovy","Groovy",200,"groovy","groovy gradle"],["solidity","Solidity",0,"sol","sol solidity"],["zig","Zig",35,"zig","zig"],["nim","Nim",55,"nim","nim"],["julia","Julia",285,"jl","jl julia"],["assembly","Assembly",40,"asm","asm assembly nasm"],["objectivec","Objective-C",215,"m","objc objectivec objective-c"],["regex","Regex",260,"txt","regex regexp"],["http","HTTP",215,"http","http"],["log","Log",0,"log","log logs"],["csv","CSV",150,"csv","csv tsv"],["batch","Batch",0,"bat","bat batch cmd"]],Vn=new Map,Er=new Map;for(let[e,t,r,n,o]of Kp){Vn.set(e,{id:e,name:t,hue:r,ext:n}),Er.set(e,e);for(let i of o.split(" "))Er.set(i,e)}var Ps=(e)=>{let t=e.trim().toLowerCase().replace(/^\./,"");return Er.get(t)??t},Rs=(e)=>Vn.has(e)&&e!=="text",kr=(e)=>Vn.get(e)??{id:e,name:e.charAt(0).toUpperCase()+e.slice(1),hue:0,ext:"txt"},$s=(e)=>{let t=e.split(/[\\/]/).pop()?.toLowerCase()??"";if(t==="dockerfile"||t.startsWith("dockerfile."))return"dockerfile";if(t==="makefile"||t==="gnumakefile")return"makefile";if(t==="cmakelists.txt")return"text";if(t===".bashrc"||t===".zshrc"||t===".profile")return"bash";if(t===".gitignore"||t===".env"||t.startsWith(".env."))return"text";let r=t.split(".").pop(),n=r?Er.get(r):void 0;return n&&n!=="text"?n:null};var Ds=!1,zp=` html[data-bp-code-theme='light'] .bp-code-v2 { --bp-bg: #ffffff; --bp-fg: #1f2328; --bp-muted: #59636e; --bp-border: #d1d9e0; --bp-accent: #f6f8fa; --bp-ring: #0969da; --bp-code-keyword: #cf222e; --bp-code-string: #0a3069; --bp-code-number: #0550ae; --bp-code-function: #8250df; --bp-code-type: #953800; --bp-code-tag: #116329; --bp-code-attribute: #0550ae; color-scheme: light; } html[data-bp-code-theme='dark'] .bp-code-v2 { --bp-bg: #0d1117; --bp-fg: #e6edf3; --bp-muted: #9198a1; --bp-border: #30363d; --bp-accent: #161b22; --bp-ring: #58a6ff; --bp-code-keyword: #ff7b72; --bp-code-string: #a5d6ff; --bp-code-number: #79c0ff; --bp-code-function: #d2a8ff; --bp-code-type: #ffa657; --bp-code-tag: #7ee787; --bp-code-attribute: #79c0ff; color-scheme: dark; } .bp-code-v2 .bp-tok-comment { color: var(--bp-muted); } .bp-code-v2 .bp-tok-keyword { color: var(--bp-code-keyword); } .bp-code-v2 .bp-tok-string { color: var(--bp-code-string); } .bp-code-v2 .bp-tok-number { color: var(--bp-code-number); } .bp-code-v2 .bp-tok-fn { color: var(--bp-code-function); } .bp-code-v2 .bp-tok-type { color: var(--bp-code-type); } .bp-code-v2 .bp-tok-tag { color: var(--bp-code-tag); } .bp-code-v2 .bp-tok-attr, .bp-code-v2 .bp-tok-key { color: var(--bp-code-attribute); } .bp-code-v2 .bp-lang-badge { background: var(--c); color: var(--badge-fg); border-color: transparent; font-weight: 700; } .bp-code-v2 .bp-code-head { box-shadow: none; } .bp-code-v2 .bp-code-btn { transition: background 120ms ease, color 120ms ease; } `,Os=(e)=>{if(e.classList.contains("dark"))return"dark";if(e.classList.contains("light"))return"light";for(let r of["data-theme","data-color-mode","data-color-scheme"]){let n=e.getAttribute(r)?.toLowerCase();if(n==="dark"||n==="light")return n}let t=getComputedStyle(e).colorScheme.trim();return t==="dark"||t==="light"?t:null},Is=()=>{if(P(`${b().id}-code-v2-theme`,zp),Ds)return;Ds=!0;let e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{let o=Os(document.documentElement)??(document.body?Os(document.body):null)??(e.matches?"dark":"light");if(document.documentElement.dataset.bpCodeTheme!==o)document.documentElement.dataset.bpCodeTheme=o},r=new MutationObserver(t),n={attributes:!0,attributeFilter:["class","data-theme","data-color-mode","data-color-scheme","style"]};if(r.observe(document.documentElement,n),document.body)r.observe(document.body,n);e.addEventListener("change",t),t()};var Gp=` .bp-code-v2 { position: relative; margin: 16px 0; overflow: hidden; border: 1px solid var(--bp-border); border-radius: 10px; background: var(--bp-bg); color: var(--bp-fg); } .bp-code-v2 * { box-sizing: border-box; } .bp-code-v2 .bp-code-head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px; min-height: 44px; padding: 8px 12px; border-bottom: 1px solid var(--bp-border); background: var(--bp-accent); } .bp-code-v2 .bp-code-meta { display: flex; align-items: center; gap: 8px; min-width: 0; } .bp-code-v2 .bp-code-lang { font: 600 12px system-ui, sans-serif; } .bp-code-v2 .bp-code-file { max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .bp-code-v2 .bp-code-count, .bp-code-v2 .bp-code-file { color: var(--bp-muted); font-size: 11px; } .bp-code-v2 .bp-code-actions { display: flex; flex-wrap: wrap; gap: 3px; } .bp-code-v2 .bp-code-btn { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; border: 1px solid transparent; border-radius: 6px; background: transparent; color: var(--bp-muted); cursor: pointer; } .bp-code-v2 .bp-code-btn:hover, .bp-code-v2 .bp-code-btn[aria-pressed='true'] { border-color: var(--bp-border); background: var(--bp-bg); color: var(--bp-fg); } .bp-code-v2 button:focus-visible, .bp-code-v2 pre:focus-visible { outline: 2px solid var(--bp-ring); outline-offset: -2px; } .bp-code-v2 .bp-code-body { overflow: auto; } .bp-code-v2 .bp-code-scroll { display: flex; align-items: stretch; width: max-content; min-width: 100%; font: 13px/21px ui-monospace, "Cascadia Code", Consolas, monospace; } .bp-code-v2 .bp-code-gutter { flex: none; padding: 14px 12px; border-right: 1px solid var(--bp-border); color: var(--bp-muted); background: var(--bp-accent); white-space: pre; text-align: right; user-select: none; font: inherit; } .bp-code-v2 .bp-code-native-pre { flex: 1; min-width: 0; margin: 0 !important; padding: 14px 16px !important; border: 0 !important; background: transparent !important; color: inherit !important; font: inherit !important; white-space: pre !important; tab-size: 4; overflow: visible !important; } .bp-code-v2 .bp-code-source { display: block; padding: 0 !important; background: transparent !important; color: inherit; font: inherit !important; white-space: inherit !important; } .bp-code-v2[data-lines='false'] .bp-code-gutter { display: none; } .bp-code-v2[data-wrap='true'] .bp-code-scroll { width: 100%; } .bp-code-v2[data-wrap='true'] .bp-code-native-pre { white-space: pre-wrap !important; overflow-wrap: anywhere; } .bp-code-v2[data-collapsed='true'] .bp-code-body { max-height: calc(var(--bp-code-collapse, 30) * 21px + 28px); overflow: hidden; } .bp-code-v2 .bp-code-more { display: none; width: 100%; padding: 9px; border: 0; border-top: 1px solid var(--bp-border); background: var(--bp-accent); color: var(--bp-fg); cursor: pointer; } .bp-code-v2[data-collapsed='true'] .bp-code-more { display: block; } .bp-code-v2 ::selection { background: rgb(59 130 246 / 25%); } .bp-code-v2 .bp-tok-comment { color: var(--bp-muted); font-style: italic; } .bp-code-v2 .bp-tok-keyword { color: #a855f7; } .bp-code-v2 .bp-tok-string { color: #b45309; } .bp-code-v2 .bp-tok-number { color: #059669; } .bp-code-v2 .bp-tok-fn { color: #2563eb; } .bp-code-v2 .bp-tok-type { color: #0891b2; } .bp-code-v2 .bp-tok-tag { color: #e11d48; } .bp-code-v2 .bp-tok-attr, .bp-code-v2 .bp-tok-key { color: #2563eb; } .bp-code-v2 .bp-lang-icon { display: inline-flex; align-items: center; justify-content: center; min-width: 22px; height: 22px; padding: 2px; border: 1px solid var(--bp-border); border-radius: 5px; color: var(--bp-fg); font: 600 10px system-ui, sans-serif; } .bp-code-v2 .bp-code-gutter { width: calc(var(--bp-code-digits, 2) * 1ch + 25px); white-space: normal; padding: 14px 10px; } .bp-code-v2 .bp-code-gutter-line { height: 21px; line-height: 21px; font: inherit; text-align: right; } .bp-code-v2 .bp-code-logical-line { display: inline; } .bp-code-v2[data-wrap='true'] .bp-code-native-pre { flex: 1 1 0; width: 0; min-width: 0; } `,Hs=()=>{P(`${b().id}-code-v2-styles`,Gp),Is()};class Yn{source;root;info;settings;element=D(a("div","bp-code bp-code-v2 bp-themed"));code=a("code","bp-code-source");gutter=a("div","bp-code-gutter");pre=a("pre","bp-code-native-pre");sourceLines=[];gutterLines=[];toggles=new Map;lineCount;originalDisplay;originalPriority;resizeObserver;frame=0;destroyed=!1;constructor(e,t,r,n){this.source=e;this.root=t;this.info=r;this.settings=n;Hs(),this.lineCount=r.text.split(` `).length,this.originalDisplay=t.style.getPropertyValue("display"),this.originalPriority=t.style.getPropertyPriority("display"),this.resizeObserver=new ResizeObserver(()=>this.scheduleGutter()),this.build()}get text(){return this.info.text}get fenced(){let e=0,t=0;for(let o of this.text)t=o==="`"?t+1:0,e=Math.max(e,t);let r="`".repeat(Math.max(3,e+1)),n=this.info.language==="text"?"":this.info.language;return`${r}${n} ${this.text} ${r}`}mount(){this.root.insertAdjacentElement("beforebegin",this.element),this.ensureHidden(),this.resizeObserver.observe(this.pre),this.scheduleGutter(),document.fonts.ready.then(()=>this.scheduleGutter())}ensureHidden(){if(this.root.style.getPropertyValue("display")!=="none"||this.root.style.getPropertyPriority("display")!=="important")this.root.style.setProperty("display","none","important")}destroy(){if(this.destroyed=!0,cancelAnimationFrame(this.frame),this.resizeObserver.disconnect(),this.element.remove(),this.originalDisplay)this.root.style.setProperty("display",this.originalDisplay,this.originalPriority);else this.root.style.removeProperty("display")}setFlag(e,t){if(this.element.dataset[e]=String(t),this.toggles.get(e)?.setAttribute("aria-pressed",String(t)),e==="wrap"||e==="lines")this.scheduleGutter()}button(e,t,r){let n=a("button","bp-code-btn");return n.type="button",n.title=t,n.setAttribute("aria-label",t),n.appendChild(V(e,16)),n.addEventListener("click",r),n}toggle(e,t,r,n){let o=this.button(t,r,()=>{this.setFlag(e,this.element.dataset[e]!=="true")});return this.toggles.set(e,o),this.setFlag(e,n),o}renderSource(){let e=this.text.split(` `),t=null;if(this.settings.highlight==="builtin")t=As(this.text,this.info.language);else if(this.settings.highlight==="site")t=Cs(this.source.querySelector("code")??this.source,this.lineCount);t??=ks(this.text,this.info.language==="diff"),e.forEach((r,n)=>{if(n>0)this.code.appendChild(document.createTextNode(` `));let o=a("span","bp-code-logical-line"),i=t[n]?.querySelector(".bp-text");if(i&&i.textContent===r)for(let l of i.childNodes)o.appendChild(l.cloneNode(!0));else o.textContent=r;this.sourceLines.push(o),this.code.appendChild(o);let s=a("div","bp-code-gutter-line",String(n+1));this.gutterLines.push(s),this.gutter.appendChild(s)})}build(){let e=a("div","bp-code-meta");if(e.append(Ss(this.info.language),a("span","bp-code-lang",kr(this.info.language).name)),this.info.filename)e.appendChild(a("span","bp-code-file",this.info.filename));e.appendChild(a("span","bp-code-count",`${this.lineCount} ${this.lineCount===1?"line":"lines"}`));let t=a("div","bp-code-actions");t.append(this.toggle("wrap","wrap","Wrap lines",this.settings.wrap),this.toggle("lines","lines","Line numbers",this.settings.lineNumbers));let r=this.settings.collapseAfter>0&&this.lineCount>this.settings.collapseAfter;if(r)t.appendChild(this.toggle("collapsed","fold","Fold code",!0));let n=this.button("copy","Copy code",()=>{z(this.text).then((l)=>{if(!l||this.destroyed)return;n.replaceChildren(V("check",16)),window.setTimeout(()=>{if(!this.destroyed)n.replaceChildren(V("copy",16))},1200)})});t.append(n,this.button("download","Download code",()=>{let l=(this.info.filename??`snippet.${kr(this.info.language).ext}`).split(/[\\/]/).pop()||"snippet.txt";we(l,this.text)}));let o=a("div","bp-code-head");o.append(e,t),this.gutter.setAttribute("aria-hidden","true"),this.pre.tabIndex=0,this.pre.setAttribute("aria-label",`${kr(this.info.language).name} source code`),this.renderSource(),this.pre.appendChild(this.code);let i=a("div","bp-code-scroll");i.append(this.gutter,this.pre);let s=a("div","bp-code-body");if(s.appendChild(i),this.element.style.setProperty("--bp-code-collapse",String(this.settings.collapseAfter)),this.element.style.setProperty("--bp-code-digits",String(String(this.lineCount).length)),this.element.append(o,s),r){let l=a("button","bp-code-more",`Expand all ${this.lineCount.toLocaleString()} lines`);l.type="button",l.addEventListener("click",()=>this.setFlag("collapsed",!1)),this.element.appendChild(l)}this.element.addEventListener("copy",this.handleCopy,!0)}scheduleGutter(){if(this.destroyed||this.frame)return;this.frame=requestAnimationFrame(()=>{this.frame=0,this.syncGutter()})}syncGutter(){if(!this.element.isConnected||this.destroyed)return;if(this.element.dataset.lines==="false")return;let e=Number.parseFloat(getComputedStyle(this.pre).lineHeight)||21,t=this.element.dataset.wrap==="true";this.sourceLines.map((n)=>{if(!t||!n.textContent)return e;let o=n.getBoundingClientRect();return Math.max(e,Math.ceil(Math.max(0,o.height-0.5)/e)*e)}).forEach((n,o)=>{let i=this.gutterLines[o],s=`${n}px`;if(i.style.height!==s)i.style.height=s})}handleCopy=(e)=>{let t=window.getSelection();if(!t||t.isCollapsed||!t.rangeCount||!e.clipboardData)return;let r=t.getRangeAt(0);if(!this.code.contains(r.startContainer)||!this.code.contains(r.endContainer))return;e.clipboardData.setData("text/plain",r.toString()),e.preventDefault(),e.stopImmediatePropagation()}}var _s="code-blocks:settings",Xn={collapseAfter:30,wrap:!1,lineNumbers:!0,hideSiteChrome:!0,highlight:"builtin"},Fs=()=>({...Xn,...x.get(_s,{})}),Ns=(e)=>x.set(_s,e);var Bs=()=>`${b().id}-code-dialog`,Jn=(e,t)=>{let r=document.getElementById(Bs());if(r instanceof HTMLDialogElement){r.close();return}let n=R({id:Bs(),title:"Code Blocks V2",description:"Applies to code blocks as soon as an answer finishes.",width:460}),o={...e},i=a("div","bp-stack");i.append(J({label:"Wrap long lines",checked:o.wrap,onChange:(p)=>o.wrap=p}).wrapper,J({label:"Show line numbers",checked:o.lineNumbers,onChange:(p)=>o.lineNumbers=p}).wrapper,J({label:"Hide the site’s own block header",checked:o.hideSiteChrome,onChange:(p)=>o.hideSiteChrome=p}).wrapper,Le("Syntax colours",[{value:"builtin",label:"Built-in (recommended)"},{value:"site",label:"Site’s own"},{value:"plain",label:"None"}],o.highlight,(p)=>o.highlight=p),Re({label:"Fold after N lines",hint:"0 never folds",value:o.collapseAfter,min:0,max:1000,onChange:(p)=>o.collapseAfter=p}).wrapper),n.body.appendChild(i);let s=()=>{t({...o}),n.close()},l=()=>{n.close(),Jn({...Xn},t)};n.footer.append(y("Cancel",{onClick:n.close}),y("Reset",{onClick:l}),y("Save",{primary:!0,onClick:s})),n.show()};var Wp=[["prisma","generator client {"],["prisma","datasource db {"],["terraform","terraform {"],["terraform",'resource "'],["terraform",'provider "'],["vue","