@timqi/pier 0.0.16 → 0.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -64,30 +64,30 @@ ${this.parser.parse(e)}</blockquote>
64
64
  ${e}</tr>
65
65
  `}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?`th`:`td`;return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`</${n}>
66
66
  `}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${Pn(e,!0)}</code>`}br(e){return`<br>`}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let r=this.parser.parseInline(n),i=Fn(e);if(i===null)return r;e=i;let a=`<a href="`+e+`"`;return t&&(a+=` title="`+Pn(t)+`"`),a+=`>`+r+`</a>`,a}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=Fn(e);if(i===null)return Pn(n);e=i;let a=`<img src="${e}" alt="${Pn(n)}"`;return t&&(a+=` title="${Pn(t)}"`),a+=`>`,a}text(e){return`tokens`in e&&e.tokens?this.parser.parseInline(e.tokens):`escaped`in e&&e.escaped?e.text:Pn(e.text)}},Kn=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return``+e}image({text:e}){return``+e}br(){return``}checkbox({raw:e}){return e}},qn=class e{options;renderer;textRenderer;constructor(e){this.options=e||ht,this.options.renderer=this.options.renderer||new Gn,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new Kn}static parse(t,n){return new e(n).parse(t)}static parseInline(t,n){return new e(n).parseInline(t)}parse(e){this.renderer.parser=this;let t=``;for(let n=0;n<e.length;n++){let r=e[n];if(this.options.extensions?.renderers?.[r.type]){let e=r,n=this.options.extensions.renderers[e.type].call({parser:this},e);if(n!==!1||![`space`,`hr`,`heading`,`code`,`table`,`blockquote`,`list`,`checkbox`,`html`,`def`,`paragraph`,`text`].includes(e.type)){t+=n||``;continue}}let i=r;switch(i.type){case`space`:t+=this.renderer.space(i);break;case`hr`:t+=this.renderer.hr(i);break;case`heading`:t+=this.renderer.heading(i);break;case`code`:t+=this.renderer.code(i);break;case`table`:t+=this.renderer.table(i);break;case`blockquote`:t+=this.renderer.blockquote(i);break;case`list`:t+=this.renderer.list(i);break;case`checkbox`:t+=this.renderer.checkbox(i);break;case`html`:t+=this.renderer.html(i);break;case`def`:t+=this.renderer.def(i);break;case`paragraph`:t+=this.renderer.paragraph(i);break;case`text`:t+=this.renderer.text(i);break;default:{let e=`Token with "`+i.type+`" type was not found.`;if(this.options.silent)return console.error(e),``;throw Error(e)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let n=``;for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions?.renderers?.[i.type]){let e=this.options.extensions.renderers[i.type].call({parser:this},i);if(e!==!1||![`escape`,`html`,`link`,`image`,`checkbox`,`strong`,`em`,`codespan`,`br`,`del`,`text`].includes(i.type)){n+=e||``;continue}}let a=i;switch(a.type){case`escape`:n+=t.text(a);break;case`html`:n+=t.html(a);break;case`link`:n+=t.link(a);break;case`image`:n+=t.image(a);break;case`checkbox`:n+=t.checkbox(a);break;case`strong`:n+=t.strong(a);break;case`em`:n+=t.em(a);break;case`codespan`:n+=t.codespan(a);break;case`br`:n+=t.br(a);break;case`del`:n+=t.del(a);break;case`text`:n+=t.text(a);break;default:{let e=`Token with "`+a.type+`" type was not found.`;if(this.options.silent)return console.error(e),``;throw Error(e)}}}return n}},Jn=class{options;block;constructor(e){this.options=e||ht}static passThroughHooks=new Set([`preprocess`,`postprocess`,`processAllTokens`,`emStrongMask`]);static passThroughHooksRespectAsync=new Set([`preprocess`,`postprocess`,`processAllTokens`]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(e=this.block){return e?Wn.lex:Wn.lexInline}provideParser(e=this.block){return e?qn.parse:qn.parseInline}},Yn=new class{defaults=mt();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=qn;Renderer=Gn;TextRenderer=Kn;Lexer=Wn;Tokenizer=Un;Hooks=Jn;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case`table`:{let e=r;for(let r of e.header)n=n.concat(this.walkTokens(r.tokens,t));for(let r of e.rows)for(let e of r)n=n.concat(this.walkTokens(e.tokens,t));break}case`list`:{let e=r;n=n.concat(this.walkTokens(e.items,t));break}default:{let e=r;this.defaults.extensions?.childTokens?.[e.type]?this.defaults.extensions.childTokens[e.type].forEach(r=>{let i=e[r].flat(1/0);n=n.concat(this.walkTokens(i,t))}):e.tokens&&(n=n.concat(this.walkTokens(e.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(e=>{let n={...e};if(n.async=this.defaults.async||n.async||!1,e.extensions&&(e.extensions.forEach(e=>{if(!e.name)throw Error(`extension name required`);if(`renderer`in e){let n=t.renderers[e.name];n?t.renderers[e.name]=function(...t){let r=e.renderer.apply(this,t);return r===!1&&(r=n.apply(this,t)),r}:t.renderers[e.name]=e.renderer}if(`tokenizer`in e){if(!e.level||e.level!==`block`&&e.level!==`inline`)throw Error(`extension level must be 'block' or 'inline'`);let n=t[e.level];n?n.unshift(e.tokenizer):t[e.level]=[e.tokenizer],e.start&&(e.level===`block`?t.startBlock?t.startBlock.push(e.start):t.startBlock=[e.start]:e.level===`inline`&&(t.startInline?t.startInline.push(e.start):t.startInline=[e.start]))}`childTokens`in e&&e.childTokens&&(t.childTokens[e.name]=e.childTokens)}),n.extensions=t),e.renderer){let t=this.defaults.renderer||new Gn(this.defaults);for(let n in e.renderer){if(!(n in t))throw Error(`renderer '${n}' does not exist`);if([`options`,`parser`].includes(n))continue;let r=n,i=e.renderer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n||``}}n.renderer=t}if(e.tokenizer){let t=this.defaults.tokenizer||new Un(this.defaults);for(let n in e.tokenizer){if(!(n in t))throw Error(`tokenizer '${n}' does not exist`);if([`options`,`rules`,`lexer`].includes(n))continue;let r=n,i=e.tokenizer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.tokenizer=t}if(e.hooks){let t=this.defaults.hooks||new Jn;for(let n in e.hooks){if(!(n in t))throw Error(`hook '${n}' does not exist`);if([`options`,`block`].includes(n))continue;let r=n,i=e.hooks[r],a=t[r];t[r]=Jn.passThroughHooks.has(n)?e=>{if(this.defaults.async&&Jn.passThroughHooksRespectAsync.has(n))return(async()=>{let n=await i.call(t,e);return a.call(t,n)})();let r=i.call(t,e);return a.call(t,r)}:(...e)=>{if(this.defaults.async)return(async()=>{let n=await i.apply(t,e);return n===!1&&(n=await a.apply(t,e)),n})();let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.hooks=t}if(e.walkTokens){let t=this.defaults.walkTokens,r=e.walkTokens;n.walkTokens=function(e){let n=[];return n.push(r.call(this,e)),t&&(n=n.concat(t.call(this,e))),n}}this.defaults={...this.defaults,...n}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return Wn.lex(e,t??this.defaults)}parser(e,t){return qn.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{let r={...n},i={...this.defaults,...r},a=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&r.async===!1)return a(Error(`marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.`));if(typeof t>`u`||t===null)return a(Error(`marked(): input parameter is undefined or null`));if(typeof t!=`string`)return a(Error(`marked(): input parameter is of type `+Object.prototype.toString.call(t)+`, string expected`));if(i.hooks&&(i.hooks.options=i,i.hooks.block=e),i.async)return(async()=>{let n=i.hooks?await i.hooks.preprocess(t):t,r=await(i.hooks?await i.hooks.provideLexer(e):e?Wn.lex:Wn.lexInline)(n,i),a=i.hooks?await i.hooks.processAllTokens(r):r;i.walkTokens&&await Promise.all(this.walkTokens(a,i.walkTokens));let o=await(i.hooks?await i.hooks.provideParser(e):e?qn.parse:qn.parseInline)(a,i);return i.hooks?await i.hooks.postprocess(o):o})().catch(a);try{i.hooks&&(t=i.hooks.preprocess(t));let n=(i.hooks?i.hooks.provideLexer(e):e?Wn.lex:Wn.lexInline)(t,i);i.hooks&&(n=i.hooks.processAllTokens(n)),i.walkTokens&&this.walkTokens(n,i.walkTokens);let r=(i.hooks?i.hooks.provideParser(e):e?qn.parse:qn.parseInline)(n,i);return i.hooks&&(r=i.hooks.postprocess(r)),r}catch(e){return a(e)}}}onError(e,t){return n=>{if(n.message+=`
67
- Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error occurred:</p><pre>`+Pn(n.message+``,!0)+`</pre>`;return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}};function W(e,t){return Yn.parse(e,t)}W.options=W.setOptions=function(e){return Yn.setOptions(e),W.defaults=Yn.defaults,gt(W.defaults),W},W.getDefaults=mt,W.defaults=ht;function Xn(...e){return Yn.use(...e),W.defaults=Yn.defaults,gt(W.defaults),W}W.use=Xn,W.walkTokens=function(e,t){return Yn.walkTokens(e,t)},W.parseInline=Yn.parseInline,W.Parser=qn,W.parser=qn.parse,W.Renderer=Gn,W.TextRenderer=Kn,W.Lexer=Wn,W.lexer=Wn.lex,W.Tokenizer=Un,W.Hooks=Jn,W.parse=W,W.options,W.setOptions,W.walkTokens,W.parseInline,qn.parse,Wn.lex;var G=e=>{let t=document.querySelector(e);if(!t)throw Error(`missing element: ${e}`);return t};function Zn(e){let t=Math.round((Date.now()-e)/6e4);return t<1?`now`:t<60?`${t}m`:t<1440?`${Math.round(t/60)}h`:`${Math.round(t/1440)}d`}var Qn=e=>{let t=Zn(e);return t===`now`?`just now`:`${t} ago`};function K(e,t,...n){let r=document.createElement(e);return t&&(r.className=t),r.append(...n),r}var $n=e=>e.split(`/`).filter(Boolean).pop()??e;function er(e){let t=new Date(e),n=e=>String(e).padStart(2,`0`);return`${`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}`} ${n(t.getHours())}:${n(t.getMinutes())}:${n(t.getSeconds())}`}function tr(e){let t=Math.max(0,Math.round(e/1e3));return t<60?`${t}s`:`${Math.floor(t/60)}m ${t%60}s`}function nr(e,t,n){return{visible:!1,show(n){this.visible=!0,e.classList.remove(`hidden`),e.classList.add(`flex`),t(n)},hide(){n?.(),this.visible=!1,e.classList.add(`hidden`),e.classList.remove(`flex`)}}}function rr(e){let t=K(`span`,`help`);return t.innerHTML=V.sanitize(W.parseInline(e,{async:!1})),ir(t),t}function ir(e){for(let t of e.querySelectorAll(`a`))(t.getAttribute(`href`)??``).startsWith(`#`)||(t.target=`_blank`,t.rel=`noreferrer`)}async function ar(e){if(navigator.clipboard)return navigator.clipboard.writeText(e);let t=document.createElement(`textarea`);t.value=e,t.className=`fixed opacity-0`,document.body.append(t),t.select();let n=document.execCommand(`copy`);if(t.remove(),!n)throw Error(`clipboard unavailable`)}function or(e,t){let n=K(`button`,e,`Copy`);n.title=`Copy to clipboard`;let r;return n.onclick=async e=>{e.stopPropagation(),n.textContent=await ar(t()).then(()=>`Copied`,()=>`Failed`),clearTimeout(r),r=setTimeout(()=>n.textContent=`Copy`,1200)},n}function sr(e,t){let n=document.createElement(`details`);n.className=e;let r=K(`summary`,`flex cursor-pointer select-none items-center gap-1.5`);return r.append(K(`span`,`chev`,`▶`),...t),n.append(r),{el:n,summary:r}}var cr=`text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,q=(e,t=!1)=>lr(e,`${t?`btn btn-primary`:`btn`} text-[12.5px]`),lr=(e,t=``)=>{let n=K(`button`,t,e);return n.type=`button`,n};function ur(e,t,n){let r=q(e);return t&&r.classList.add(`bg-neutral-200`),r.onclick=n,r}function dr(e,t,n){let r=lr(e,`flex cursor-pointer items-center gap-1.5 rounded-full px-3 py-1 text-[13px] transition-colors ${t?`bg-indigo-50 font-medium text-indigo-700 ring-1 ring-indigo-200/70`:`text-neutral-600 hover:bg-neutral-100`}`);return r.onclick=n,r}function fr(e,t,...n){let r=K(`section`,`rounded-xl border border-neutral-200 bg-white shadow-xs`),i=K(`div`,`rounded-t-xl border-b border-neutral-200/70 bg-neutral-50/70 px-4 py-2.5`);return i.append(K(`h2`,`text-[13px] font-semibold text-neutral-700`,e)),t&&i.append(K(`p`,`mt-0.5 text-[11.5px] leading-snug text-neutral-500`,t)),r.append(i,K(`div`,`flex flex-col gap-4 px-4 py-3.5`,...n)),r}function J(e,t,n={}){let r=K(`div`,`flex flex-col gap-1.5`),i=K(`div`,`flex items-center gap-1.5`,K(`span`,cr,e));return n.help&&i.append(n.help),r.append(i,t),n.hint&&r.append(K(`span`,`text-[11.5px] leading-snug text-neutral-400`,n.hint)),r}var pr=`w-full rounded-lg border border-neutral-300 bg-white px-2.5 py-1.5 text-[12.5px] transition-colors placeholder:text-neutral-400 focus:border-indigo-400 focus:ring-2 focus:ring-indigo-100 focus:outline-none`,mr=(e,t,n,r=!1)=>{let i=document.createElement(`input`);return i.className=r?`${pr} font-mono`:pr,i.value=e,i.placeholder=t,i.oninput=()=>n(i.value),i},hr=(e=``,t=`text`)=>{let n=document.createElement(`input`);return n.type=t,n.className=pr,n.value=e,n},gr=(e,t)=>{let n=document.createElement(`select`);return n.className=`${pr} select`,n.append(...e.map(([e,t])=>new Option(e,t))),n.value=t,n},_r=(e=``,t=4)=>{let n=document.createElement(`textarea`);return n.className=`${pr} resize-y font-mono`,n.value=e,n.rows=t,n.spellcheck=!1,n};function vr(e,t,n,r,i){let a=document.createElement(`input`);a.type=`checkbox`,a.className=`peer sr-only`,a.checked=n,a.onchange=()=>r(a.checked);let o=K(`span`,`relative h-4 w-7 flex-none rounded-full bg-neutral-300 transition-colors after:absolute after:left-0.5 after:top-0.5 after:h-3 after:w-3 after:rounded-full after:bg-white after:shadow-sm after:transition-transform peer-checked:bg-indigo-600 peer-checked:after:translate-x-3 peer-focus-visible:ring-2 peer-focus-visible:ring-indigo-200`),s=K(`label`,`flex cursor-pointer gap-2.5 ${e?`items-start`:`items-center`}`);if(s.append(a,o),e){let n=K(`span`,`flex items-center gap-1.5`,K(`span`,`text-[13px] text-neutral-700`,e));i&&n.append(i);let r=K(`span`,`flex min-w-0 flex-col`,n);t&&r.append(K(`span`,`text-[11.5px] leading-snug text-neutral-400`,t)),s.append(r)}return s}var yr={idle:`text-neutral-400`,saving:`text-neutral-400`,saved:`text-green-700`,failed:`text-red-600`};function Y(e,t,n){e.className=`text-[11.5px] ${yr[t]}`,e.textContent=n}var br=(e,t)=>K(`span`,`flex-none rounded-full px-1.5 py-px text-[10px] font-medium uppercase tracking-wide ring-1 ${t}`,e),xr=e=>K(`p`,`rounded-lg border border-dashed border-neutral-200 px-3 py-4 text-center text-[12.5px] text-neutral-400`,e);function Sr(e,t,n=`left`){let r=K(`span`,`group relative inline-flex`),i=lr(`?`,`flex h-4 w-4 cursor-help items-center justify-center rounded-full border border-neutral-300 text-[9px] font-bold text-neutral-400 transition-colors group-hover:border-indigo-400 group-hover:text-indigo-500`),a=K(`span`,`absolute ${n===`right`?`right-0`:`left-0`} top-full z-20 hidden w-[min(27rem,calc(100vw-3rem))] pt-1.5 group-hover:block`),o=K(`span`,`flex flex-col gap-2 rounded-xl border border-neutral-200 bg-white p-3.5 text-[12px] font-normal normal-case leading-[1.55] tracking-normal text-neutral-600 shadow-xl`);o.append(K(`span`,`text-[12.5px] font-semibold text-neutral-800`,e));let s=K(`ol`,`flex list-decimal flex-col gap-1.5 pl-4`);for(let e of t){let t=K(`li`,`marker:text-neutral-400`);t.append(typeof e==`string`?rr(e):e),s.append(t)}return o.append(s),a.append(o),i.onclick=()=>{let e=a.classList.contains(`hidden`);a.classList.toggle(`hidden`,!e),a.classList.toggle(`block`,e),i.classList.toggle(`border-indigo-400`,e),i.classList.toggle(`text-indigo-500`,e)},r.append(i,a),r}var Cr=(e,t)=>K(`span`,`flex flex-col gap-1`,rr(e),t),wr=G(`#image-dialog`),Tr=G(`#image-full`),Er=G(`#image-prev`),Dr=G(`#image-next`),Or=[],kr=0;function Ar(e){Or.length<2||(kr=(kr+e+Or.length)%Or.length,Tr.src=Or[kr])}function jr(e){let t=e.closest(`[data-gallery]`);Or=t?[...t.querySelectorAll(`img.thumb`)].map(e=>e.src):[e.src],kr=Math.max(0,Or.indexOf(e.src)),Tr.src=e.src;let n=Or.length<2?`none`:`flex`;Er.style.display=n,Dr.style.display=n,wr.showModal()}wr.onclick=()=>wr.close();var Mr=(e,t)=>{e.onclick=e=>{e.stopPropagation(),Ar(t)}};Mr(Er,-1),Mr(Dr,1),wr.onkeydown=e=>{(e.key===`ArrowLeft`||e.key===`ArrowRight`)&&(e.preventDefault(),Ar(e.key===`ArrowLeft`?-1:1))};function Nr(e){let t=e.querySelector(`:scope > .thumbs`);if(t)return t;let n=K(`div`,`thumbs`);return e.append(n),n}function Pr(e){let t=document.createElement(`img`);return t.src=e,t.loading=`lazy`,t.className=`thumb`,t.onclick=()=>jr(t),t}var Fr=new Set([`png`,`jpg`,`jpeg`,`gif`,`webp`,`avif`,`bmp`]),Ir=new Set([`txt`,`md`,`log`,`json`,`csv`,`yaml`,`yml`]),Lr=524288,Rr=G(`#file-dialog`),zr=G(`#file-name`),Br=G(`#file-text`),Vr=G(`#file-download`);G(`#file-close`).onclick=()=>Rr.close();var Hr=e=>e.split(`.`).pop()?.toLowerCase()??``,Ur=(e,t,n=!1)=>`/api/sessions/${encodeURIComponent(e)}/files?path=${encodeURIComponent(t)}${n?`&download=1`:``}`;function Wr(e,t){return e.replace(/\]\(\s*<?file:\/\/(\/[^)>\s]*)>?\s*\)/g,(e,n)=>{let r=n;try{r=decodeURIComponent(n)}catch{}return`](${Ur(t,r)})`})}var Gr=e=>/^\/api\/sessions\/[^/]+\/files\?/.test(e);function Kr(e,t){let n=$n(t)||`file`,r=Ur(e,t);return Fr.has(Hr(n))?Yr(r,n):Xr(r,n)}function qr(e){return new URLSearchParams(e.slice(e.indexOf(`?`)+1)).get(`path`)??``}async function Jr(e,t){zr.textContent=t,Vr.href=`${e}&download=1`,Br.textContent=`loading…`,Rr.showModal();let n=await fetch(e),r=n.ok?await n.text():`failed to load: ${n.status}`;Br.textContent=r.length>Lr?`${r.slice(0,Lr)}\n…`:r}function Yr(e,t){let n=Pr(e);return n.alt=t,n}function Xr(e,t){let n=Hr(t),r=K(`span`,`inline-flex max-w-full items-center gap-2.5 rounded-lg border border-neutral-200 bg-neutral-50 px-2.5 py-1.5 no-underline`),i=K(`span`,`flex h-7 w-7 flex-none items-center justify-center rounded-md bg-indigo-50 text-[10px] font-semibold uppercase text-indigo-600`,n.slice(0,4)||`file`),a=K(`span`,`min-w-0 truncate text-[13px] font-medium text-neutral-800`,t),o=K(`span`,`ml-1 flex flex-none items-center gap-0.5`);if(Ir.has(n)||n===`pdf`){let r=K(`button`,`icon-btn h-6 w-6 text-[13px]`,`◉`);r.title=`Preview`,r.onclick=r=>{r.preventDefault(),n===`pdf`?window.open(e,`_blank`,`noopener`):Jr(e,t)},o.append(r)}let s=document.createElement(`a`);return s.className=`icon-btn h-6 w-6 text-[13px] no-underline`,s.href=`${e}&download=1`,s.download=t,s.title=`Download`,s.textContent=`↓`,o.append(s),r.append(i,a,o),r}function Zr(e){let t=new Set;for(let n of e)n.parentElement&&t.add(n.parentElement);for(let n of t){let t=[...n.children].filter(t=>e.includes(t));if([...n.childNodes].every(e=>e.nodeType===Node.TEXT_NODE?!e.textContent?.trim():t.includes(e))){n.classList.add(`thumbs`);continue}let r=K(`div`,`thumbs`);r.append(...t),n.after(r)}}function Qr(e){let t=[];for(let n of e.querySelectorAll(`img`)){let e=n.getAttribute(`src`)??``;if(!Gr(e))continue;let r=Yr(e,$n(qr(e)));n.replaceWith(r),t.push(r)}for(let n of e.querySelectorAll(`a`)){let e=n.getAttribute(`href`)??``;if(!Gr(e))continue;let r=$n(qr(e))||n.textContent?.trim()||`file`,i=Fr.has(Hr(r))?Yr(e,r):Xr(e,r);n.replaceWith(i),t.push(i)}t.length&&Zr(t)}var $r=e=>`[${e.split(`/`).pop()??`file`}](file://${encodeURI(e).replace(/\(/g,`%28`).replace(/\)/g,`%29`)})`,ei=/^\[[^\]\n]*\]\(\s*<?file:\/\/(\/[^)>\s]*)>?\s*\)$/;function ti(e){let t=e.split(`
68
- `),n=t.length;for(;n>0&&ei.test(t[n-1].trim());)n--;let r=t.slice(n).map(e=>{let t=ei.exec(e.trim())[1];try{return decodeURIComponent(t)}catch{return t}});return{text:t.slice(0,n).join(`
69
- `).trimEnd(),paths:r}}var ni=c(o(((e,t)=>{function n(e){return e instanceof Map?e.clear=e.delete=e.set=function(){throw Error(`map is read-only`)}:e instanceof Set&&(e.add=e.clear=e.delete=function(){throw Error(`set is read-only`)}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach(t=>{let r=e[t],i=typeof r;(i===`object`||i===`function`)&&!Object.isFrozen(r)&&n(r)}),e}var r=class{constructor(e){e.data===void 0&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}};function i(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#x27;`)}function a(e,...t){let n=Object.create(null);for(let t in e)n[t]=e[t];return t.forEach(function(e){for(let t in e)n[t]=e[t]}),n}var o=`</span>`,s=e=>!!e.scope,c=(e,{prefix:t})=>{if(e.startsWith(`language:`))return e.replace(`language:`,`language-`);if(e.includes(`.`)){let n=e.split(`.`);return[`${t}${n.shift()}`,...n.map((e,t)=>`${e}${`_`.repeat(t+1)}`)].join(` `)}return`${t}${e}`},l=class{constructor(e,t){this.buffer=``,this.classPrefix=t.classPrefix,e.walk(this)}addText(e){this.buffer+=i(e)}openNode(e){if(!s(e))return;let t=c(e.scope,{prefix:this.classPrefix});this.span(t)}closeNode(e){s(e)&&(this.buffer+=o)}value(){return this.buffer}span(e){this.buffer+=`<span class="${e}">`}},u=(e={})=>{let t={children:[]};return Object.assign(t,e),t},d=class e{constructor(){this.rootNode=u(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){let t=u({scope:e});this.add(t),this.stack.push(t)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){return typeof t==`string`?e.addText(t):t.children&&(e.openNode(t),t.children.forEach(t=>this._walk(e,t)),e.closeNode(t)),e}static _collapse(t){typeof t!=`string`&&t.children&&(t.children.every(e=>typeof e==`string`)?t.children=[t.children.join(``)]:t.children.forEach(t=>{e._collapse(t)}))}},f=class extends d{constructor(e){super(),this.options=e}addText(e){e!==``&&this.add(e)}startScope(e){this.openNode(e)}endScope(){this.closeNode()}__addSublanguage(e,t){let n=e.root;t&&(n.scope=`language:${t}`),this.add(n)}toHTML(){return new l(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}};function p(e){return e?typeof e==`string`?e:e.source:null}function m(e){return _(`(?=`,e,`)`)}function h(e){return _(`(?:`,e,`)*`)}function g(e){return _(`(?:`,e,`)?`)}function _(...e){return e.map(e=>p(e)).join(``)}function v(e){let t=e[e.length-1];return typeof t==`object`&&t.constructor===Object?(e.splice(e.length-1,1),t):{}}function y(...e){return`(`+(v(e).capture?``:`?:`)+e.map(e=>p(e)).join(`|`)+`)`}function b(e){return RegExp(e.toString()+`|`).exec(``).length-1}function x(e,t){let n=e&&e.exec(t);return n&&n.index===0}var S=new RegExp(y(/\[(?:[^\\\]]|\\.)*\]/,/\(\?<(?![=!])[^>]+>/,/\(\?'[^']+'/,/\(\??/,/\\([1-9][0-9]*)/,/\\./));function C(e,{joinWith:t}){let n=0;return e.map(e=>{n+=1;let t=n,r=p(e),i=``;for(;r.length>0;){let e=S.exec(r);if(!e){i+=r;break}i+=r.substring(0,e.index),r=r.substring(e.index+e[0].length),e[0][0]===`\\`&&e[1]?i+=`\\`+String(Number(e[1])+t):(i+=e[0],(e[0]===`(`||/^\(\?[<']/.test(e[0]))&&n++)}return i}).map(e=>`(${e})`).join(t)}var w=/\b\B/,T=`[a-zA-Z]\\w*`,E=`[a-zA-Z_]\\w*`,D=`\\b\\d+(\\.\\d+)?`,O=`(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)`,k=`\\b(0b[01]+)`,A=`!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~`,ee=(e={})=>{let t=/^#![ ]*\//;return e.binary&&(e.begin=_(t,/.*\b/,e.binary,/\b.*/)),a({scope:`meta`,begin:t,end:/$/,relevance:0,"on:begin":(e,t)=>{e.index!==0&&t.ignoreMatch()}},e)},j={begin:`\\\\[\\s\\S]`,relevance:0},M={scope:`string`,begin:`'`,end:`'`,illegal:`\\n`,contains:[j]},N={scope:`string`,begin:`"`,end:`"`,illegal:`\\n`,contains:[j]},te={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},P=function(e,t,n={}){let r=a({scope:`comment`,begin:e,end:t,contains:[]},n);r.contains.push({scope:`doctag`,begin:`[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)`,end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});let i=y(`I`,`a`,`is`,`so`,`us`,`to`,`at`,`if`,`in`,`it`,`on`,/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return r.contains.push({begin:_(/[ ]+/,`(`,i,/[.]?[:]?([.][ ]|[ ])/,`){3}`)}),r},ne=P(`//`,`$`),re=P(`/\\*`,`\\*/`),ie=P(`#`,`$`),F=Object.freeze({__proto__:null,APOS_STRING_MODE:M,BACKSLASH_ESCAPE:j,BINARY_NUMBER_MODE:{scope:`number`,begin:k,relevance:0},BINARY_NUMBER_RE:k,COMMENT:P,C_BLOCK_COMMENT_MODE:re,C_LINE_COMMENT_MODE:ne,C_NUMBER_MODE:{scope:`number`,begin:O,relevance:0},C_NUMBER_RE:O,END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{t.data._beginMatch!==e[1]&&t.ignoreMatch()}})},HASH_COMMENT_MODE:ie,IDENT_RE:T,MATCH_NOTHING_RE:w,METHOD_GUARD:{begin:`\\.\\s*[a-zA-Z_]\\w*`,relevance:0},NUMBER_MODE:{scope:`number`,begin:D,relevance:0},NUMBER_RE:D,PHRASAL_WORDS_MODE:te,QUOTE_STRING_MODE:N,REGEXP_MODE:{scope:`regexp`,begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[j,{begin:/\[/,end:/\]/,relevance:0,contains:[j]}]},RE_STARTERS_RE:A,SHEBANG:ee,TITLE_MODE:{scope:`title`,begin:T,relevance:0},UNDERSCORE_IDENT_RE:E,UNDERSCORE_TITLE_MODE:{scope:`title`,begin:E,relevance:0}});function I(e,t){e.input[e.index-1]===`.`&&t.ignoreMatch()}function ae(e,t){e.className!==void 0&&(e.scope=e.className,delete e.className)}function L(e,t){t&&e.beginKeywords&&(e.begin=`\\b(`+e.beginKeywords.split(` `).join(`|`)+`)(?!\\.)(?=\\b|\\s)`,e.__beforeBegin=I,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords,e.relevance===void 0&&(e.relevance=0))}function oe(e,t){Array.isArray(e.illegal)&&(e.illegal=y(...e.illegal))}function se(e,t){if(e.match){if(e.begin||e.end)throw Error(`begin & end are not supported with match`);e.begin=e.match,delete e.match}}function ce(e,t){e.relevance===void 0&&(e.relevance=1)}var le=(e,t)=>{if(!e.beforeMatch)return;if(e.starts)throw Error(`beforeMatch cannot be used with starts`);let n=Object.assign({},e);Object.keys(e).forEach(t=>{delete e[t]}),e.keywords=n.keywords,e.begin=_(n.beforeMatch,m(n.begin)),e.starts={relevance:0,contains:[Object.assign(n,{endsParent:!0})]},e.relevance=0,delete n.beforeMatch},ue=[`of`,`and`,`for`,`in`,`not`,`or`,`if`,`then`,`parent`,`list`,`value`],de=`keyword`;function fe(e,t,n=de){let r=Object.create(null);return typeof e==`string`?i(n,e.split(` `)):Array.isArray(e)?i(n,e):Object.keys(e).forEach(function(n){Object.assign(r,fe(e[n],t,n))}),r;function i(e,n){t&&(n=n.map(e=>e.toLowerCase())),n.forEach(function(t){let n=t.split(`|`);r[n[0]]=[e,pe(n[0],n[1])]})}}function pe(e,t){return t?Number(t):+!me(e)}function me(e){return ue.includes(e.toLowerCase())}var he={},ge=e=>{console.error(e)},_e=(e,...t)=>{console.log(`WARN: ${e}`,...t)},ve=(e,t)=>{he[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),he[`${e}/${t}`]=!0)},ye=Error();function be(e,t,{key:n}){let r=0,i=e[n],a={},o={};for(let e=1;e<=t.length;e++)o[e+r]=i[e],a[e+r]=!0,r+=b(t[e-1]);e[n]=o,e[n]._emit=a,e[n]._multi=!0}function xe(e){if(Array.isArray(e.begin)){if(e.skip||e.excludeBegin||e.returnBegin)throw ge(`skip, excludeBegin, returnBegin not compatible with beginScope: {}`),ye;if(typeof e.beginScope!=`object`||e.beginScope===null)throw ge(`beginScope must be object`),ye;be(e,e.begin,{key:`beginScope`}),e.begin=C(e.begin,{joinWith:``})}}function Se(e){if(Array.isArray(e.end)){if(e.skip||e.excludeEnd||e.returnEnd)throw ge(`skip, excludeEnd, returnEnd not compatible with endScope: {}`),ye;if(typeof e.endScope!=`object`||e.endScope===null)throw ge(`endScope must be object`),ye;be(e,e.end,{key:`endScope`}),e.end=C(e.end,{joinWith:``})}}function Ce(e){e.scope&&typeof e.scope==`object`&&e.scope!==null&&(e.beginScope=e.scope,delete e.scope)}function we(e){Ce(e),typeof e.beginScope==`string`&&(e.beginScope={_wrap:e.beginScope}),typeof e.endScope==`string`&&(e.endScope={_wrap:e.endScope}),xe(e),Se(e)}function Te(e){function t(t,n){return new RegExp(p(t),`m`+(e.case_insensitive?`i`:``)+(e.unicodeRegex?`u`:``)+(n?`g`:``))}class n{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,t){t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]),this.matchAt+=b(e)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);let e=this.regexes.map(e=>e[1]);this.matcherRe=t(C(e,{joinWith:`|`}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;let t=this.matcherRe.exec(e);if(!t)return null;let n=t.findIndex((e,t)=>t>0&&e!==void 0),r=this.matchIndexes[n];return t.splice(0,n),Object.assign(t,r)}}class r{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];let t=new n;return this.rules.slice(e).forEach(([e,n])=>t.addRule(e,n)),t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(e,t){this.rules.push([e,t]),t.type===`begin`&&this.count++}exec(e){let t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex;let n=t.exec(e);if(this.resumingScanAtSamePosition()&&!(n&&n.index===this.lastIndex)){let t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)}return n&&(this.regexIndex+=n.position+1,this.regexIndex===this.count&&this.considerAll()),n}}function i(e){let t=new r;return e.contains.forEach(e=>t.addRule(e.begin,{rule:e,type:`begin`})),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:`end`}),e.illegal&&t.addRule(e.illegal,{type:`illegal`}),t}function o(n,r){let a=n;if(n.isCompiled)return a;[ae,se,we,le].forEach(e=>e(n,r)),e.compilerExtensions.forEach(e=>e(n,r)),n.__beforeBegin=null,[L,oe,ce].forEach(e=>e(n,r)),n.isCompiled=!0;let s=null;return typeof n.keywords==`object`&&n.keywords.$pattern&&(n.keywords=Object.assign({},n.keywords),s=n.keywords.$pattern,delete n.keywords.$pattern),s||=/\w+/,n.keywords&&=fe(n.keywords,e.case_insensitive),a.keywordPatternRe=t(s,!0),r&&(n.begin||=/\B|\b/,a.beginRe=t(a.begin),!n.end&&!n.endsWithParent&&(n.end=/\B|\b/),n.end&&(a.endRe=t(a.end)),a.terminatorEnd=p(a.end)||``,n.endsWithParent&&r.terminatorEnd&&(a.terminatorEnd+=(n.end?`|`:``)+r.terminatorEnd)),n.illegal&&(a.illegalRe=t(n.illegal)),n.contains||=[],n.contains=[].concat(...n.contains.map(function(e){return De(e===`self`?n:e)})),n.contains.forEach(function(e){o(e,a)}),n.starts&&o(n.starts,r),a.matcher=i(a),a}if(e.compilerExtensions||=[],e.contains&&e.contains.includes(`self`))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return e.classNameAliases=a(e.classNameAliases||{}),o(e)}function Ee(e){return e?e.endsWithParent||Ee(e.starts):!1}function De(e){return e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map(function(t){return a(e,{variants:null},t)})),e.cachedVariants?e.cachedVariants:Ee(e)?a(e,{starts:e.starts?a(e.starts):null}):Object.isFrozen(e)?a(e):e}var R=`11.12.0`,Oe=class extends Error{constructor(e,t){super(e),this.name=`HTMLInjectionError`,this.html=t}},z=i,B=a,ke=Symbol(`nomatch`),Ae=7,je=function(e){let t=Object.create(null),i=Object.create(null),a=[],o=!0,s=`Could not find the language '{}', did you forget to load/include a language module?`,c={disableAutodetect:!0,name:`Plain text`,contains:[]},l={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:`hljs-`,cssSelector:`pre code`,languages:null,__emitter:f};function u(e){return l.noHighlightRe.test(e)}function d(e){let t=e.className+` `;t+=e.parentNode?e.parentNode.className:``;let n=l.languageDetectRe.exec(t);if(n){let t=M(n[1]);return t||(_e(s.replace(`{}`,n[1])),_e(`Falling back to no-highlight mode for this block.`,e)),t?n[1]:`no-highlight`}return t.split(/\s+/).find(e=>u(e)||M(e))}function p(e,t,n){let r=``,i=``;typeof t==`object`?(r=e,n=t.ignoreIllegals,i=t.language):(ve(`10.7.0`,`highlight(lang, code, ...args) has been deprecated.`),ve(`10.7.0`,`Please use highlight(code, options) instead.
67
+ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error occurred:</p><pre>`+Pn(n.message+``,!0)+`</pre>`;return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}};function W(e,t){return Yn.parse(e,t)}W.options=W.setOptions=function(e){return Yn.setOptions(e),W.defaults=Yn.defaults,gt(W.defaults),W},W.getDefaults=mt,W.defaults=ht;function Xn(...e){return Yn.use(...e),W.defaults=Yn.defaults,gt(W.defaults),W}W.use=Xn,W.walkTokens=function(e,t){return Yn.walkTokens(e,t)},W.parseInline=Yn.parseInline,W.Parser=qn,W.parser=qn.parse,W.Renderer=Gn,W.TextRenderer=Kn,W.Lexer=Wn,W.lexer=Wn.lex,W.Tokenizer=Un,W.Hooks=Jn,W.parse=W,W.options,W.setOptions,W.walkTokens,W.parseInline,qn.parse,Wn.lex;var G=e=>{let t=document.querySelector(e);if(!t)throw Error(`missing element: ${e}`);return t};function Zn(e){let t=Math.round((Date.now()-e)/6e4);return t<1?`now`:t<60?`${t}m`:t<1440?`${Math.round(t/60)}h`:`${Math.round(t/1440)}d`}var Qn=e=>{let t=Zn(e);return t===`now`?`just now`:`${t} ago`};function K(e,t,...n){let r=document.createElement(e);return t&&(r.className=t),r.append(...n),r}var $n=e=>e.split(`/`).filter(Boolean).pop()??e,er=e=>`New session in ${$n(e)}`;function tr(e){let t=new Date(e),n=e=>String(e).padStart(2,`0`);return`${`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}`} ${n(t.getHours())}:${n(t.getMinutes())}:${n(t.getSeconds())}`}function nr(e){let t=Math.max(0,Math.round(e/1e3));return t<60?`${t}s`:`${Math.floor(t/60)}m ${t%60}s`}function rr(e,t,n){return{visible:!1,show(n){this.visible=!0,e.classList.remove(`hidden`),e.classList.add(`flex`),t(n)},hide(){n?.(),this.visible=!1,e.classList.add(`hidden`),e.classList.remove(`flex`)}}}function ir(e){let t=K(`span`,`help`);return t.innerHTML=V.sanitize(W.parseInline(e,{async:!1})),ar(t),t}function ar(e){for(let t of e.querySelectorAll(`a`))(t.getAttribute(`href`)??``).startsWith(`#`)||(t.target=`_blank`,t.rel=`noreferrer`)}async function or(e){if(navigator.clipboard)return navigator.clipboard.writeText(e);let t=document.createElement(`textarea`);t.value=e,t.className=`fixed opacity-0`,document.body.append(t),t.select();let n=document.execCommand(`copy`);if(t.remove(),!n)throw Error(`clipboard unavailable`)}function sr(e,t){let n=K(`button`,e,`Copy`);n.title=`Copy to clipboard`;let r;return n.onclick=async e=>{e.stopPropagation(),n.textContent=await or(t()).then(()=>`Copied`,()=>`Failed`),clearTimeout(r),r=setTimeout(()=>n.textContent=`Copy`,1200)},n}function cr(e,t){let n=document.createElement(`details`);n.className=e;let r=K(`summary`,`flex cursor-pointer select-none items-center gap-1.5`);return r.append(K(`span`,`chev`,`▶`),...t),n.append(r),{el:n,summary:r}}var lr=`text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,q=(e,t=!1)=>ur(e,`${t?`btn btn-primary`:`btn`} text-[12.5px]`),ur=(e,t=``)=>{let n=K(`button`,t,e);return n.type=`button`,n};function dr(e,t,n){let r=q(e);return t&&r.classList.add(`bg-neutral-200`),r.onclick=n,r}function fr(e,t,n){let r=ur(e,`flex cursor-pointer items-center gap-1.5 rounded-full px-3 py-1 text-[13px] transition-colors ${t?`bg-indigo-50 font-medium text-indigo-700 ring-1 ring-indigo-200/70`:`text-neutral-600 hover:bg-neutral-100`}`);return r.onclick=n,r}function pr(e,t,...n){let r=K(`section`,`rounded-xl border border-neutral-200 bg-white shadow-xs`),i=K(`div`,`rounded-t-xl border-b border-neutral-200/70 bg-neutral-50/70 px-4 py-2.5`);return i.append(K(`h2`,`text-[13px] font-semibold text-neutral-700`,e)),t&&i.append(K(`p`,`mt-0.5 text-[11.5px] leading-snug text-neutral-500`,t)),r.append(i,K(`div`,`flex flex-col gap-4 px-4 py-3.5`,...n)),r}function J(e,t,n={}){let r=K(`div`,`flex flex-col gap-1.5`),i=K(`div`,`flex items-center gap-1.5`,K(`span`,lr,e));return n.help&&i.append(n.help),r.append(i,t),n.hint&&r.append(K(`span`,`text-[11.5px] leading-snug text-neutral-400`,n.hint)),r}var mr=`w-full rounded-lg border border-neutral-300 bg-white px-2.5 py-1.5 text-[12.5px] transition-colors placeholder:text-neutral-400 focus:border-indigo-400 focus:ring-2 focus:ring-indigo-100 focus:outline-none`,hr=(e,t,n,r=!1)=>{let i=document.createElement(`input`);return i.className=r?`${mr} font-mono`:mr,i.value=e,i.placeholder=t,i.oninput=()=>n(i.value),i},gr=(e=``,t=`text`)=>{let n=document.createElement(`input`);return n.type=t,n.className=mr,n.value=e,n},_r=(e,t)=>{let n=document.createElement(`select`);return n.className=`${mr} select`,n.append(...e.map(([e,t])=>new Option(e,t))),n.value=t,n},vr=(e=``,t=4)=>{let n=document.createElement(`textarea`);return n.className=`${mr} resize-y font-mono`,n.value=e,n.rows=t,n.spellcheck=!1,n};function yr(e,t,n,r,i){let a=document.createElement(`input`);a.type=`checkbox`,a.className=`peer sr-only`,a.checked=n,a.onchange=()=>r(a.checked);let o=K(`span`,`relative h-4 w-7 flex-none rounded-full bg-neutral-300 transition-colors after:absolute after:left-0.5 after:top-0.5 after:h-3 after:w-3 after:rounded-full after:bg-white after:shadow-sm after:transition-transform peer-checked:bg-indigo-600 peer-checked:after:translate-x-3 peer-focus-visible:ring-2 peer-focus-visible:ring-indigo-200`),s=K(`label`,`flex cursor-pointer gap-2.5 ${e?`items-start`:`items-center`}`);if(s.append(a,o),e){let n=K(`span`,`flex items-center gap-1.5`,K(`span`,`text-[13px] text-neutral-700`,e));i&&n.append(i);let r=K(`span`,`flex min-w-0 flex-col`,n);t&&r.append(K(`span`,`text-[11.5px] leading-snug text-neutral-400`,t)),s.append(r)}return s}var br={idle:`text-neutral-400`,saving:`text-neutral-400`,saved:`text-green-700`,failed:`text-red-600`};function Y(e,t,n){e.className=`text-[11.5px] ${br[t]}`,e.textContent=n}var xr=(e,t)=>K(`span`,`flex-none rounded-full px-1.5 py-px text-[10px] font-medium uppercase tracking-wide ring-1 ${t}`,e),Sr=e=>K(`p`,`rounded-lg border border-dashed border-neutral-200 px-3 py-4 text-center text-[12.5px] text-neutral-400`,e);function Cr(e,t,n=`left`){let r=K(`span`,`group relative inline-flex`),i=ur(`?`,`flex h-4 w-4 cursor-help items-center justify-center rounded-full border border-neutral-300 text-[9px] font-bold text-neutral-400 transition-colors group-hover:border-indigo-400 group-hover:text-indigo-500`),a=K(`span`,`absolute ${n===`right`?`right-0`:`left-0`} top-full z-20 hidden w-[min(27rem,calc(100vw-3rem))] pt-1.5 group-hover:block`),o=K(`span`,`flex flex-col gap-2 rounded-xl border border-neutral-200 bg-white p-3.5 text-[12px] font-normal normal-case leading-[1.55] tracking-normal text-neutral-600 shadow-xl`);o.append(K(`span`,`text-[12.5px] font-semibold text-neutral-800`,e));let s=K(`ol`,`flex list-decimal flex-col gap-1.5 pl-4`);for(let e of t){let t=K(`li`,`marker:text-neutral-400`);t.append(typeof e==`string`?ir(e):e),s.append(t)}return o.append(s),a.append(o),i.onclick=()=>{let e=a.classList.contains(`hidden`);a.classList.toggle(`hidden`,!e),a.classList.toggle(`block`,e),i.classList.toggle(`border-indigo-400`,e),i.classList.toggle(`text-indigo-500`,e)},r.append(i,a),r}var wr=(e,t)=>K(`span`,`flex flex-col gap-1`,ir(e),t),Tr=G(`#image-dialog`),Er=G(`#image-full`),Dr=G(`#image-prev`),Or=G(`#image-next`),kr=[],Ar=0;function jr(e){kr.length<2||(Ar=(Ar+e+kr.length)%kr.length,Er.src=kr[Ar])}function Mr(e){let t=e.closest(`[data-gallery]`);kr=t?[...t.querySelectorAll(`img.thumb`)].map(e=>e.src):[e.src],Ar=Math.max(0,kr.indexOf(e.src)),Er.src=e.src;let n=kr.length<2?`none`:`flex`;Dr.style.display=n,Or.style.display=n,Tr.showModal()}Tr.onclick=()=>Tr.close();var Nr=(e,t)=>{e.onclick=e=>{e.stopPropagation(),jr(t)}};Nr(Dr,-1),Nr(Or,1),Tr.onkeydown=e=>{(e.key===`ArrowLeft`||e.key===`ArrowRight`)&&(e.preventDefault(),jr(e.key===`ArrowLeft`?-1:1))};function Pr(e){let t=e.querySelector(`:scope > .thumbs`);if(t)return t;let n=K(`div`,`thumbs`);return e.append(n),n}function Fr(e){let t=document.createElement(`img`);return t.src=e,t.loading=`lazy`,t.className=`thumb`,t.onclick=()=>Mr(t),t}var Ir=new Set([`png`,`jpg`,`jpeg`,`gif`,`webp`,`avif`,`bmp`]),Lr=new Set([`txt`,`md`,`log`,`json`,`csv`,`yaml`,`yml`]),Rr=524288,zr=G(`#file-dialog`),Br=G(`#file-name`),Vr=G(`#file-text`),Hr=G(`#file-download`);G(`#file-close`).onclick=()=>zr.close();var Ur=e=>e.split(`.`).pop()?.toLowerCase()??``,Wr=(e,t,n=!1)=>`/api/sessions/${encodeURIComponent(e)}/files?path=${encodeURIComponent(t)}${n?`&download=1`:``}`;function Gr(e,t){return e.replace(/\]\(\s*<?file:\/\/(\/[^)>\s]*)>?\s*\)/g,(e,n)=>{let r=n;try{r=decodeURIComponent(n)}catch{}return`](${Wr(t,r)})`})}var Kr=e=>/^\/api\/sessions\/[^/]+\/files\?/.test(e);function qr(e,t){let n=$n(t)||`file`,r=Wr(e,t);return Ir.has(Ur(n))?Xr(r,n):Zr(r,n)}function Jr(e){return new URLSearchParams(e.slice(e.indexOf(`?`)+1)).get(`path`)??``}async function Yr(e,t){Br.textContent=t,Hr.href=`${e}&download=1`,Vr.textContent=`loading…`,zr.showModal();let n=await fetch(e),r=n.ok?await n.text():`failed to load: ${n.status}`;Vr.textContent=r.length>Rr?`${r.slice(0,Rr)}\n…`:r}function Xr(e,t){let n=Fr(e);return n.alt=t,n}function Zr(e,t){let n=Ur(t),r=K(`span`,`inline-flex max-w-full items-center gap-2.5 rounded-lg border border-neutral-200 bg-neutral-50 px-2.5 py-1.5 no-underline`),i=K(`span`,`flex h-7 w-7 flex-none items-center justify-center rounded-md bg-indigo-50 text-[10px] font-semibold uppercase text-indigo-600`,n.slice(0,4)||`file`),a=K(`span`,`min-w-0 truncate text-[13px] font-medium text-neutral-800`,t),o=K(`span`,`ml-1 flex flex-none items-center gap-0.5`);if(Lr.has(n)||n===`pdf`){let r=K(`button`,`icon-btn h-6 w-6 text-[13px]`,`◉`);r.title=`Preview`,r.onclick=r=>{r.preventDefault(),n===`pdf`?window.open(e,`_blank`,`noopener`):Yr(e,t)},o.append(r)}let s=document.createElement(`a`);return s.className=`icon-btn h-6 w-6 text-[13px] no-underline`,s.href=`${e}&download=1`,s.download=t,s.title=`Download`,s.textContent=`↓`,o.append(s),r.append(i,a,o),r}function Qr(e){let t=new Set;for(let n of e)n.parentElement&&t.add(n.parentElement);for(let n of t){let t=[...n.children].filter(t=>e.includes(t));if([...n.childNodes].every(e=>e.nodeType===Node.TEXT_NODE?!e.textContent?.trim():t.includes(e))){n.classList.add(`thumbs`);continue}let r=K(`div`,`thumbs`);r.append(...t),n.after(r)}}function $r(e){let t=[];for(let n of e.querySelectorAll(`img`)){let e=n.getAttribute(`src`)??``;if(!Kr(e))continue;let r=Xr(e,$n(Jr(e)));n.replaceWith(r),t.push(r)}for(let n of e.querySelectorAll(`a`)){let e=n.getAttribute(`href`)??``;if(!Kr(e))continue;let r=$n(Jr(e))||n.textContent?.trim()||`file`,i=Ir.has(Ur(r))?Xr(e,r):Zr(e,r);n.replaceWith(i),t.push(i)}t.length&&Qr(t)}var ei=e=>`[${e.split(`/`).pop()??`file`}](file://${encodeURI(e).replace(/\(/g,`%28`).replace(/\)/g,`%29`)})`,ti=/^\[[^\]\n]*\]\(\s*<?file:\/\/(\/[^)>\s]*)>?\s*\)$/;function ni(e){let t=e.split(`
68
+ `),n=t.length;for(;n>0&&ti.test(t[n-1].trim());)n--;let r=t.slice(n).map(e=>{let t=ti.exec(e.trim())[1];try{return decodeURIComponent(t)}catch{return t}});return{text:t.slice(0,n).join(`
69
+ `).trimEnd(),paths:r}}var ri=c(o(((e,t)=>{function n(e){return e instanceof Map?e.clear=e.delete=e.set=function(){throw Error(`map is read-only`)}:e instanceof Set&&(e.add=e.clear=e.delete=function(){throw Error(`set is read-only`)}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach(t=>{let r=e[t],i=typeof r;(i===`object`||i===`function`)&&!Object.isFrozen(r)&&n(r)}),e}var r=class{constructor(e){e.data===void 0&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}};function i(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#x27;`)}function a(e,...t){let n=Object.create(null);for(let t in e)n[t]=e[t];return t.forEach(function(e){for(let t in e)n[t]=e[t]}),n}var o=`</span>`,s=e=>!!e.scope,c=(e,{prefix:t})=>{if(e.startsWith(`language:`))return e.replace(`language:`,`language-`);if(e.includes(`.`)){let n=e.split(`.`);return[`${t}${n.shift()}`,...n.map((e,t)=>`${e}${`_`.repeat(t+1)}`)].join(` `)}return`${t}${e}`},l=class{constructor(e,t){this.buffer=``,this.classPrefix=t.classPrefix,e.walk(this)}addText(e){this.buffer+=i(e)}openNode(e){if(!s(e))return;let t=c(e.scope,{prefix:this.classPrefix});this.span(t)}closeNode(e){s(e)&&(this.buffer+=o)}value(){return this.buffer}span(e){this.buffer+=`<span class="${e}">`}},u=(e={})=>{let t={children:[]};return Object.assign(t,e),t},d=class e{constructor(){this.rootNode=u(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){let t=u({scope:e});this.add(t),this.stack.push(t)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){return typeof t==`string`?e.addText(t):t.children&&(e.openNode(t),t.children.forEach(t=>this._walk(e,t)),e.closeNode(t)),e}static _collapse(t){typeof t!=`string`&&t.children&&(t.children.every(e=>typeof e==`string`)?t.children=[t.children.join(``)]:t.children.forEach(t=>{e._collapse(t)}))}},f=class extends d{constructor(e){super(),this.options=e}addText(e){e!==``&&this.add(e)}startScope(e){this.openNode(e)}endScope(){this.closeNode()}__addSublanguage(e,t){let n=e.root;t&&(n.scope=`language:${t}`),this.add(n)}toHTML(){return new l(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}};function p(e){return e?typeof e==`string`?e:e.source:null}function m(e){return _(`(?=`,e,`)`)}function h(e){return _(`(?:`,e,`)*`)}function g(e){return _(`(?:`,e,`)?`)}function _(...e){return e.map(e=>p(e)).join(``)}function v(e){let t=e[e.length-1];return typeof t==`object`&&t.constructor===Object?(e.splice(e.length-1,1),t):{}}function y(...e){return`(`+(v(e).capture?``:`?:`)+e.map(e=>p(e)).join(`|`)+`)`}function b(e){return RegExp(e.toString()+`|`).exec(``).length-1}function x(e,t){let n=e&&e.exec(t);return n&&n.index===0}var S=new RegExp(y(/\[(?:[^\\\]]|\\.)*\]/,/\(\?<(?![=!])[^>]+>/,/\(\?'[^']+'/,/\(\??/,/\\([1-9][0-9]*)/,/\\./));function C(e,{joinWith:t}){let n=0;return e.map(e=>{n+=1;let t=n,r=p(e),i=``;for(;r.length>0;){let e=S.exec(r);if(!e){i+=r;break}i+=r.substring(0,e.index),r=r.substring(e.index+e[0].length),e[0][0]===`\\`&&e[1]?i+=`\\`+String(Number(e[1])+t):(i+=e[0],(e[0]===`(`||/^\(\?[<']/.test(e[0]))&&n++)}return i}).map(e=>`(${e})`).join(t)}var w=/\b\B/,T=`[a-zA-Z]\\w*`,E=`[a-zA-Z_]\\w*`,D=`\\b\\d+(\\.\\d+)?`,O=`(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)`,k=`\\b(0b[01]+)`,A=`!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~`,ee=(e={})=>{let t=/^#![ ]*\//;return e.binary&&(e.begin=_(t,/.*\b/,e.binary,/\b.*/)),a({scope:`meta`,begin:t,end:/$/,relevance:0,"on:begin":(e,t)=>{e.index!==0&&t.ignoreMatch()}},e)},j={begin:`\\\\[\\s\\S]`,relevance:0},M={scope:`string`,begin:`'`,end:`'`,illegal:`\\n`,contains:[j]},N={scope:`string`,begin:`"`,end:`"`,illegal:`\\n`,contains:[j]},te={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},P=function(e,t,n={}){let r=a({scope:`comment`,begin:e,end:t,contains:[]},n);r.contains.push({scope:`doctag`,begin:`[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)`,end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});let i=y(`I`,`a`,`is`,`so`,`us`,`to`,`at`,`if`,`in`,`it`,`on`,/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return r.contains.push({begin:_(/[ ]+/,`(`,i,/[.]?[:]?([.][ ]|[ ])/,`){3}`)}),r},ne=P(`//`,`$`),re=P(`/\\*`,`\\*/`),ie=P(`#`,`$`),F=Object.freeze({__proto__:null,APOS_STRING_MODE:M,BACKSLASH_ESCAPE:j,BINARY_NUMBER_MODE:{scope:`number`,begin:k,relevance:0},BINARY_NUMBER_RE:k,COMMENT:P,C_BLOCK_COMMENT_MODE:re,C_LINE_COMMENT_MODE:ne,C_NUMBER_MODE:{scope:`number`,begin:O,relevance:0},C_NUMBER_RE:O,END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{t.data._beginMatch!==e[1]&&t.ignoreMatch()}})},HASH_COMMENT_MODE:ie,IDENT_RE:T,MATCH_NOTHING_RE:w,METHOD_GUARD:{begin:`\\.\\s*[a-zA-Z_]\\w*`,relevance:0},NUMBER_MODE:{scope:`number`,begin:D,relevance:0},NUMBER_RE:D,PHRASAL_WORDS_MODE:te,QUOTE_STRING_MODE:N,REGEXP_MODE:{scope:`regexp`,begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[j,{begin:/\[/,end:/\]/,relevance:0,contains:[j]}]},RE_STARTERS_RE:A,SHEBANG:ee,TITLE_MODE:{scope:`title`,begin:T,relevance:0},UNDERSCORE_IDENT_RE:E,UNDERSCORE_TITLE_MODE:{scope:`title`,begin:E,relevance:0}});function I(e,t){e.input[e.index-1]===`.`&&t.ignoreMatch()}function ae(e,t){e.className!==void 0&&(e.scope=e.className,delete e.className)}function L(e,t){t&&e.beginKeywords&&(e.begin=`\\b(`+e.beginKeywords.split(` `).join(`|`)+`)(?!\\.)(?=\\b|\\s)`,e.__beforeBegin=I,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords,e.relevance===void 0&&(e.relevance=0))}function oe(e,t){Array.isArray(e.illegal)&&(e.illegal=y(...e.illegal))}function se(e,t){if(e.match){if(e.begin||e.end)throw Error(`begin & end are not supported with match`);e.begin=e.match,delete e.match}}function ce(e,t){e.relevance===void 0&&(e.relevance=1)}var le=(e,t)=>{if(!e.beforeMatch)return;if(e.starts)throw Error(`beforeMatch cannot be used with starts`);let n=Object.assign({},e);Object.keys(e).forEach(t=>{delete e[t]}),e.keywords=n.keywords,e.begin=_(n.beforeMatch,m(n.begin)),e.starts={relevance:0,contains:[Object.assign(n,{endsParent:!0})]},e.relevance=0,delete n.beforeMatch},ue=[`of`,`and`,`for`,`in`,`not`,`or`,`if`,`then`,`parent`,`list`,`value`],de=`keyword`;function fe(e,t,n=de){let r=Object.create(null);return typeof e==`string`?i(n,e.split(` `)):Array.isArray(e)?i(n,e):Object.keys(e).forEach(function(n){Object.assign(r,fe(e[n],t,n))}),r;function i(e,n){t&&(n=n.map(e=>e.toLowerCase())),n.forEach(function(t){let n=t.split(`|`);r[n[0]]=[e,pe(n[0],n[1])]})}}function pe(e,t){return t?Number(t):+!me(e)}function me(e){return ue.includes(e.toLowerCase())}var he={},ge=e=>{console.error(e)},_e=(e,...t)=>{console.log(`WARN: ${e}`,...t)},ve=(e,t)=>{he[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),he[`${e}/${t}`]=!0)},ye=Error();function be(e,t,{key:n}){let r=0,i=e[n],a={},o={};for(let e=1;e<=t.length;e++)o[e+r]=i[e],a[e+r]=!0,r+=b(t[e-1]);e[n]=o,e[n]._emit=a,e[n]._multi=!0}function xe(e){if(Array.isArray(e.begin)){if(e.skip||e.excludeBegin||e.returnBegin)throw ge(`skip, excludeBegin, returnBegin not compatible with beginScope: {}`),ye;if(typeof e.beginScope!=`object`||e.beginScope===null)throw ge(`beginScope must be object`),ye;be(e,e.begin,{key:`beginScope`}),e.begin=C(e.begin,{joinWith:``})}}function Se(e){if(Array.isArray(e.end)){if(e.skip||e.excludeEnd||e.returnEnd)throw ge(`skip, excludeEnd, returnEnd not compatible with endScope: {}`),ye;if(typeof e.endScope!=`object`||e.endScope===null)throw ge(`endScope must be object`),ye;be(e,e.end,{key:`endScope`}),e.end=C(e.end,{joinWith:``})}}function Ce(e){e.scope&&typeof e.scope==`object`&&e.scope!==null&&(e.beginScope=e.scope,delete e.scope)}function we(e){Ce(e),typeof e.beginScope==`string`&&(e.beginScope={_wrap:e.beginScope}),typeof e.endScope==`string`&&(e.endScope={_wrap:e.endScope}),xe(e),Se(e)}function Te(e){function t(t,n){return new RegExp(p(t),`m`+(e.case_insensitive?`i`:``)+(e.unicodeRegex?`u`:``)+(n?`g`:``))}class n{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,t){t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]),this.matchAt+=b(e)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);let e=this.regexes.map(e=>e[1]);this.matcherRe=t(C(e,{joinWith:`|`}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;let t=this.matcherRe.exec(e);if(!t)return null;let n=t.findIndex((e,t)=>t>0&&e!==void 0),r=this.matchIndexes[n];return t.splice(0,n),Object.assign(t,r)}}class r{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];let t=new n;return this.rules.slice(e).forEach(([e,n])=>t.addRule(e,n)),t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(e,t){this.rules.push([e,t]),t.type===`begin`&&this.count++}exec(e){let t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex;let n=t.exec(e);if(this.resumingScanAtSamePosition()&&!(n&&n.index===this.lastIndex)){let t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)}return n&&(this.regexIndex+=n.position+1,this.regexIndex===this.count&&this.considerAll()),n}}function i(e){let t=new r;return e.contains.forEach(e=>t.addRule(e.begin,{rule:e,type:`begin`})),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:`end`}),e.illegal&&t.addRule(e.illegal,{type:`illegal`}),t}function o(n,r){let a=n;if(n.isCompiled)return a;[ae,se,we,le].forEach(e=>e(n,r)),e.compilerExtensions.forEach(e=>e(n,r)),n.__beforeBegin=null,[L,oe,ce].forEach(e=>e(n,r)),n.isCompiled=!0;let s=null;return typeof n.keywords==`object`&&n.keywords.$pattern&&(n.keywords=Object.assign({},n.keywords),s=n.keywords.$pattern,delete n.keywords.$pattern),s||=/\w+/,n.keywords&&=fe(n.keywords,e.case_insensitive),a.keywordPatternRe=t(s,!0),r&&(n.begin||=/\B|\b/,a.beginRe=t(a.begin),!n.end&&!n.endsWithParent&&(n.end=/\B|\b/),n.end&&(a.endRe=t(a.end)),a.terminatorEnd=p(a.end)||``,n.endsWithParent&&r.terminatorEnd&&(a.terminatorEnd+=(n.end?`|`:``)+r.terminatorEnd)),n.illegal&&(a.illegalRe=t(n.illegal)),n.contains||=[],n.contains=[].concat(...n.contains.map(function(e){return De(e===`self`?n:e)})),n.contains.forEach(function(e){o(e,a)}),n.starts&&o(n.starts,r),a.matcher=i(a),a}if(e.compilerExtensions||=[],e.contains&&e.contains.includes(`self`))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return e.classNameAliases=a(e.classNameAliases||{}),o(e)}function Ee(e){return e?e.endsWithParent||Ee(e.starts):!1}function De(e){return e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map(function(t){return a(e,{variants:null},t)})),e.cachedVariants?e.cachedVariants:Ee(e)?a(e,{starts:e.starts?a(e.starts):null}):Object.isFrozen(e)?a(e):e}var R=`11.12.0`,Oe=class extends Error{constructor(e,t){super(e),this.name=`HTMLInjectionError`,this.html=t}},z=i,B=a,ke=Symbol(`nomatch`),Ae=7,je=function(e){let t=Object.create(null),i=Object.create(null),a=[],o=!0,s=`Could not find the language '{}', did you forget to load/include a language module?`,c={disableAutodetect:!0,name:`Plain text`,contains:[]},l={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:`hljs-`,cssSelector:`pre code`,languages:null,__emitter:f};function u(e){return l.noHighlightRe.test(e)}function d(e){let t=e.className+` `;t+=e.parentNode?e.parentNode.className:``;let n=l.languageDetectRe.exec(t);if(n){let t=M(n[1]);return t||(_e(s.replace(`{}`,n[1])),_e(`Falling back to no-highlight mode for this block.`,e)),t?n[1]:`no-highlight`}return t.split(/\s+/).find(e=>u(e)||M(e))}function p(e,t,n){let r=``,i=``;typeof t==`object`?(r=e,n=t.ignoreIllegals,i=t.language):(ve(`10.7.0`,`highlight(lang, code, ...args) has been deprecated.`),ve(`10.7.0`,`Please use highlight(code, options) instead.
70
70
  https://github.com/highlightjs/highlight.js/issues/2277`),i=e,r=t),n===void 0&&(n=!0);let a={code:r,language:i};ie(`before:highlight`,a);let o=a.result?a.result:v(a.language,a.code,n);return o.code=a.code,ie(`after:highlight`,o),o}function v(e,n,i,a){let c=Object.create(null);function u(e,t){return e.keywords[t]}function d(){if(!A.keywords){j.addText(N);return}let e=0;A.keywordPatternRe.lastIndex=0;let t=A.keywordPatternRe.exec(N),n=``;for(;t;){n+=N.substring(e,t.index);let r=D.case_insensitive?t[0].toLowerCase():t[0],i=u(A,r);if(i){let[e,a]=i;if(j.addText(n),n=``,c[r]=(c[r]||0)+1,c[r]<=Ae&&(te+=a),e.startsWith(`_`))n+=t[0];else{let n=D.classNameAliases[e]||e;m(t[0],n)}}else n+=t[0];e=A.keywordPatternRe.lastIndex,t=A.keywordPatternRe.exec(N)}n+=N.substring(e),j.addText(n)}function f(){if(N===``)return;let e=null;if(typeof A.subLanguage==`string`){if(!t[A.subLanguage]){j.addText(N);return}e=v(A.subLanguage,N,!0,ee[A.subLanguage]),ee[A.subLanguage]=e._top}else e=S(N,A.subLanguage.length?A.subLanguage:null);A.relevance>0&&(te+=e.relevance),j.__addSublanguage(e._emitter,e.language)}function p(){A.subLanguage==null?d():f(),N=``}function m(e,t){e!==``&&(j.startScope(t),j.addText(e),j.endScope())}function h(e,t){let n=1,r=t.length-1;for(;n<=r;){if(!e._emit[n]){n++;continue}let r=D.classNameAliases[e[n]]||e[n],i=t[n];r?m(i,r):(N=i,d(),N=``),n++}}function g(e,t){return e.scope&&typeof e.scope==`string`&&j.openNode(D.classNameAliases[e.scope]||e.scope),e.beginScope&&(e.beginScope._wrap?(m(N,D.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap),N=``):e.beginScope._multi&&(h(e.beginScope,t),N=``)),A=Object.create(e,{parent:{value:A}}),A}function _(e,t,n){let i=x(e.endRe,n);if(i){if(e[`on:end`]){let n=new r(e);e[`on:end`](t,n),n.isMatchIgnored&&(i=!1)}if(i){for(;e.endsParent&&e.parent;)e=e.parent;return e}}if(e.endsWithParent)return _(e.parent,t,n)}function y(e){return A.matcher.regexIndex===0?(N+=e[0],1):(re=!0,0)}function b(e){let t=e[0],n=e.rule,i=new r(n),a=[n.__beforeBegin,n[`on:begin`]];for(let n of a)if(n&&(n(e,i),i.isMatchIgnored))return y(t);return n.skip?N+=t:(n.excludeBegin&&(N+=t),p(),!n.returnBegin&&!n.excludeBegin&&(N=t)),g(n,e),n.returnBegin?0:t.length}function C(e){let t=e[0],r=n.substring(e.index),i=_(A,e,r);if(!i)return ke;let a=A;A.endScope&&A.endScope._wrap?(p(),m(t,A.endScope._wrap)):A.endScope&&A.endScope._multi?(p(),h(A.endScope,e)):a.skip?N+=t:(a.returnEnd||a.excludeEnd||(N+=t),p(),a.excludeEnd&&(N=t));do A.scope&&j.closeNode(),!A.skip&&!A.subLanguage&&(te+=A.relevance),A=A.parent;while(A!==i.parent);return i.starts&&g(i.starts,e),a.returnEnd?0:t.length}function w(){let e=[];for(let t=A;t!==D;t=t.parent)t.scope&&e.unshift(t.scope);e.forEach(e=>j.openNode(e))}let T={};function E(t,r){let a=r&&r[0];if(N+=t,a==null)return p(),0;if(T.type===`begin`&&r.type===`end`&&T.index===r.index&&a===``){if(N+=n.slice(r.index,r.index+1),!o){let t=Error(`0 width match regex (${e})`);throw t.languageName=e,t.badRule=T.rule,t}return 1}if(T=r,r.type===`begin`)return b(r);if(r.type===`illegal`&&!i){let e=Error(`Illegal lexeme "`+a+`" for mode "`+(A.scope||`<unnamed>`)+`"`);throw e.mode=A,e}if(r.type===`end`){let e=C(r);if(e!==ke)return e}if(r.type===`illegal`&&a===``)return r.index===n.length||(N+=`
71
- `),1;if(ne>1e5&&ne>r.index*3)throw Error(`potential infinite loop, way more iterations than matches`);return N+=a,a.length}let D=M(e);if(!D)throw ge(s.replace(`{}`,e)),Error(`Unknown language: "`+e+`"`);let O=Te(D),k=``,A=a||O,ee={},j=new l.__emitter(l);w();let N=``,te=0,P=0,ne=0,re=!1;try{if(D.__emitTokens)D.__emitTokens(n,j);else{for(A.matcher.considerAll();;){ne++,re?re=!1:A.matcher.considerAll(),A.matcher.lastIndex=P;let e=A.matcher.exec(n);if(!e)break;let t=E(n.substring(P,e.index),e);P=e.index+t}E(n.substring(P))}return j.finalize(),k=j.toHTML(),{language:e,value:k,relevance:te,illegal:!1,_emitter:j,_top:A}}catch(t){if(t.message&&t.message.includes(`Illegal`))return{language:e,value:z(n),illegal:!0,relevance:0,_illegalBy:{message:t.message,index:P,context:n.slice(P-100,P+100),mode:t.mode,resultSoFar:k},_emitter:j};if(o)return{language:e,value:z(n),illegal:!1,relevance:0,errorRaised:t,_emitter:j,_top:A};throw t}}function b(e){let t={value:z(e),illegal:!1,relevance:0,_top:c,_emitter:new l.__emitter(l)};return t._emitter.addText(e),t}function S(e,n){n=n||l.languages||Object.keys(t);let r=b(e),i=n.filter(M).filter(te).map(t=>v(t,e,!1));i.unshift(r);let[a,o]=i.sort((e,t)=>{if(e.relevance!==t.relevance)return t.relevance-e.relevance;if(e.language&&t.language){if(M(e.language).supersetOf===t.language)return 1;if(M(t.language).supersetOf===e.language)return-1}return 0}),s=a;return s.secondBest=o,s}function C(e,t,n){let r=t&&i[t]||n;e.classList.add(`hljs`),e.classList.add(`language-${r}`)}function w(e){let t=null,n=d(e);if(u(n))return;if(ie(`before:highlightElement`,{el:e,language:n}),e.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e);return}if(e.children.length>0&&(l.ignoreUnescapedHTML||(console.warn(`One of your code blocks includes unescaped HTML. This is a potentially serious security risk.`),console.warn(`https://github.com/highlightjs/highlight.js/wiki/security`),console.warn(`The element with unescaped HTML:`),console.warn(e)),l.throwUnescapedHTML))throw new Oe(`One of your code blocks includes unescaped HTML.`,e.innerHTML);t=e;let r=t.textContent,i=n?p(r,{language:n,ignoreIllegals:!0}):S(r);e.innerHTML=i.value,e.dataset.highlighted=`yes`,C(e,n,i.language),e.result={language:i.language,re:i.relevance,relevance:i.relevance},i.secondBest&&(e.secondBest={language:i.secondBest.language,relevance:i.secondBest.relevance}),ie(`after:highlightElement`,{el:e,result:i,text:r})}function T(e){l=B(l,e)}let E=()=>{k(),ve(`10.6.0`,`initHighlighting() deprecated. Use highlightAll() now.`)};function D(){k(),ve(`10.6.0`,`initHighlightingOnLoad() deprecated. Use highlightAll() now.`)}let O=!1;function k(){function e(){k()}if(document.readyState===`loading`){O||window.addEventListener(`DOMContentLoaded`,e,!1),O=!0;return}document.querySelectorAll(l.cssSelector).forEach(w)}function A(n,r){let i=null;try{i=r(e)}catch(e){if(ge(`Language definition for '{}' could not be registered.`.replace(`{}`,n)),o)ge(e);else throw e;i=c}i.name||(i.name=n),t[n]=i,i.rawDefinition=r.bind(null,e),i.aliases&&N(i.aliases,{languageName:n})}function ee(e){delete t[e];for(let t of Object.keys(i))i[t]===e&&delete i[t]}function j(){return Object.keys(t)}function M(e){return e=(e||``).toLowerCase(),t[e]||t[i[e]]}function N(e,{languageName:t}){typeof e==`string`&&(e=[e]),e.forEach(e=>{i[e.toLowerCase()]=t})}function te(e){let t=M(e);return t&&!t.disableAutodetect}function P(e){e[`before:highlightBlock`]&&!e[`before:highlightElement`]&&(e[`before:highlightElement`]=t=>{e[`before:highlightBlock`](Object.assign({block:t.el},t))}),e[`after:highlightBlock`]&&!e[`after:highlightElement`]&&(e[`after:highlightElement`]=t=>{e[`after:highlightBlock`](Object.assign({block:t.el},t))})}function ne(e){P(e),a.push(e)}function re(e){let t=a.indexOf(e);t!==-1&&a.splice(t,1)}function ie(e,t){let n=e;a.forEach(function(e){e[n]&&e[n](t)})}function I(e){return ve(`10.7.0`,`highlightBlock will be removed entirely in v12.0`),ve(`10.7.0`,`Please use highlightElement now.`),w(e)}Object.assign(e,{highlight:p,highlightAuto:S,highlightAll:k,highlightElement:w,highlightBlock:I,configure:T,initHighlighting:E,initHighlightingOnLoad:D,registerLanguage:A,unregisterLanguage:ee,listLanguages:j,getLanguage:M,registerAliases:N,autoDetection:te,inherit:B,addPlugin:ne,removePlugin:re}),e.debugMode=function(){o=!1},e.safeMode=function(){o=!0},e.versionString=R,e.regex={concat:_,lookahead:m,either:y,optional:g,anyNumberOfTimes:h};for(let e in F)typeof F[e]==`object`&&n(F[e]);return Object.assign(e,F),e},Me=je({});Me.newInstance=()=>je({}),t.exports=Me,Me.HighlightJS=Me,Me.default=Me}))()).default;function ri(e){let t=e.regex,n={},r={begin:/\$\{/,end:/\}/,contains:[`self`,{begin:/:-/,contains:[n]}]};Object.assign(n,{className:`variable`,variants:[{begin:t.concat(/\$[\w\d#@][\w\d_]*/,`(?![\\w\\d])(?![$])`)},r]});let i={className:`subst`,begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},a=e.inherit(e.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:`comment`}}),o={begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:`string`})]}},s={className:`string`,begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,n,i]};i.contains.push(s);let c={match:/\\"/},l={className:`string`,begin:/'/,end:/'/},u={match:/\\'/},d={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:`number`},e.NUMBER_MODE,n]},f=e.SHEBANG({binary:`(${[`fish`,`bash`,`zsh`,`sh`,`csh`,`ksh`,`tcsh`,`dash`,`scsh`].join(`|`)})`,relevance:10}),p={className:`function`,begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},m=[`if`,`then`,`else`,`elif`,`fi`,`time`,`for`,`while`,`until`,`in`,`do`,`done`,`case`,`esac`,`coproc`,`function`,`select`],h=[`true`,`false`],g={match:/(\/[a-z._-]+)+/},_=[`break`,`cd`,`continue`,`eval`,`exec`,`exit`,`export`,`getopts`,`hash`,`pwd`,`readonly`,`return`,`shift`,`test`,`times`,`trap`,`umask`,`unset`],v=[`alias`,`bind`,`builtin`,`caller`,`command`,`declare`,`echo`,`enable`,`help`,`let`,`local`,`logout`,`mapfile`,`printf`,`read`,`readarray`,`source`,`sudo`,`type`,`typeset`,`ulimit`,`unalias`],y=`autoload.bg.bindkey.bye.cap.chdir.clone.comparguments.compcall.compctl.compdescribe.compfiles.compgroups.compquote.comptags.comptry.compvalues.dirs.disable.disown.echotc.echoti.emulate.fc.fg.float.functions.getcap.getln.history.integer.jobs.kill.limit.log.noglob.popd.print.pushd.pushln.rehash.sched.setcap.setopt.stat.suspend.ttyctl.unfunction.unhash.unlimit.unsetopt.vared.wait.whence.where.which.zcompile.zformat.zftp.zle.zmodload.zparseopts.zprof.zpty.zregexparse.zsocket.zstyle.ztcp`.split(`.`),b=`chcon.chgrp.chown.chmod.cp.dd.df.dir.dircolors.ln.ls.mkdir.mkfifo.mknod.mktemp.mv.realpath.rm.rmdir.shred.sync.touch.truncate.vdir.b2sum.base32.base64.cat.cksum.comm.csplit.cut.expand.fmt.fold.head.join.md5sum.nl.numfmt.od.paste.ptx.pr.sha1sum.sha224sum.sha256sum.sha384sum.sha512sum.shuf.sort.split.sum.tac.tail.tr.tsort.unexpand.uniq.wc.arch.basename.chroot.date.dirname.du.echo.env.expr.factor.groups.hostid.id.link.logname.nice.nohup.nproc.pathchk.pinky.printenv.printf.pwd.readlink.runcon.seq.sleep.stat.stdbuf.stty.tee.test.timeout.tty.uname.unlink.uptime.users.who.whoami.yes`.split(`.`);return{name:`Bash`,aliases:[`sh`,`zsh`],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:m,literal:h,built_in:[..._,...v,`set`,`shopt`,...y,...b]},contains:[f,e.SHEBANG(),p,d,a,o,g,s,c,l,u,n]}}var ii=e=>({IMPORTANT:{scope:`meta`,begin:`!important`},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:`number`,begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},UNICODE_RANGE:{scope:`number`,begin:/\b[Uu]\+[0-9A-Fa-f][0-9A-Fa-f?]{0,5}(-[0-9A-Fa-f][0-9A-Fa-f]{0,5})?/},FUNCTION_DISPATCH:{className:`built_in`,begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:`selector-attr`,begin:/\[/,end:/\]/,illegal:`$`,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:`number`,begin:e.NUMBER_RE+`(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?`,relevance:0},CSS_VARIABLE:{className:`attr`,begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),ai=`a.abbr.address.article.aside.audio.b.blockquote.body.button.canvas.caption.cite.code.dd.del.details.dfn.div.dl.dt.em.fieldset.figcaption.figure.footer.form.h1.h2.h3.h4.h5.h6.header.hgroup.html.i.iframe.img.input.ins.kbd.label.legend.li.main.mark.menu.nav.object.ol.optgroup.option.p.picture.q.quote.samp.section.select.source.span.strong.summary.sup.table.tbody.td.textarea.tfoot.th.thead.time.tr.ul.var.video`.split(`.`),oi=`defs.g.marker.mask.pattern.svg.switch.symbol.feBlend.feColorMatrix.feComponentTransfer.feComposite.feConvolveMatrix.feDiffuseLighting.feDisplacementMap.feFlood.feGaussianBlur.feImage.feMerge.feMorphology.feOffset.feSpecularLighting.feTile.feTurbulence.linearGradient.radialGradient.stop.circle.ellipse.image.line.path.polygon.polyline.rect.text.use.textPath.tspan.foreignObject.clipPath`.split(`.`),si=[...ai,...oi],ci=`any-hover.any-pointer.aspect-ratio.color.color-gamut.color-index.device-aspect-ratio.device-height.device-width.display-mode.forced-colors.grid.height.hover.inverted-colors.monochrome.orientation.overflow-block.overflow-inline.pointer.prefers-color-scheme.prefers-contrast.prefers-reduced-motion.prefers-reduced-transparency.resolution.scan.scripting.update.width.min-width.max-width.min-height.max-height`.split(`.`).sort().reverse(),li=`active.any-link.blank.checked.current.default.defined.dir.disabled.drop.empty.enabled.first.first-child.first-of-type.fullscreen.future.focus.focus-visible.focus-within.has.host.host-context.hover.indeterminate.in-range.invalid.is.lang.last-child.last-of-type.left.link.local-link.not.nth-child.nth-col.nth-last-child.nth-last-col.nth-last-of-type.nth-of-type.only-child.only-of-type.optional.out-of-range.past.placeholder-shown.read-only.read-write.required.right.root.scope.target.target-within.user-invalid.valid.visited.where`.split(`.`).sort().reverse(),ui=[`after`,`backdrop`,`before`,`cue`,`cue-region`,`first-letter`,`first-line`,`grammar-error`,`marker`,`part`,`placeholder`,`selection`,`slotted`,`spelling-error`].sort().reverse(),di=`accent-color.align-content.align-items.align-self.alignment-baseline.all.anchor-name.animation.animation-composition.animation-delay.animation-direction.animation-duration.animation-fill-mode.animation-iteration-count.animation-name.animation-play-state.animation-range.animation-range-end.animation-range-start.animation-timeline.animation-timing-function.appearance.aspect-ratio.backdrop-filter.backface-visibility.background.background-attachment.background-blend-mode.background-clip.background-color.background-image.background-origin.background-position.background-position-x.background-position-y.background-repeat.background-size.baseline-shift.block-size.border.border-block.border-block-color.border-block-end.border-block-end-color.border-block-end-style.border-block-end-width.border-block-start.border-block-start-color.border-block-start-style.border-block-start-width.border-block-style.border-block-width.border-bottom.border-bottom-color.border-bottom-left-radius.border-bottom-right-radius.border-bottom-style.border-bottom-width.border-collapse.border-color.border-end-end-radius.border-end-start-radius.border-image.border-image-outset.border-image-repeat.border-image-slice.border-image-source.border-image-width.border-inline.border-inline-color.border-inline-end.border-inline-end-color.border-inline-end-style.border-inline-end-width.border-inline-start.border-inline-start-color.border-inline-start-style.border-inline-start-width.border-inline-style.border-inline-width.border-left.border-left-color.border-left-style.border-left-width.border-radius.border-right.border-right-color.border-right-style.border-right-width.border-spacing.border-start-end-radius.border-start-start-radius.border-style.border-top.border-top-color.border-top-left-radius.border-top-right-radius.border-top-style.border-top-width.border-width.bottom.box-align.box-decoration-break.box-direction.box-flex.box-flex-group.box-lines.box-ordinal-group.box-orient.box-pack.box-shadow.box-sizing.break-after.break-before.break-inside.caption-side.caret-color.clear.clip.clip-path.clip-rule.color.color-interpolation.color-interpolation-filters.color-profile.color-rendering.color-scheme.column-count.column-fill.column-gap.column-rule.column-rule-color.column-rule-style.column-rule-width.column-span.column-width.columns.contain.contain-intrinsic-block-size.contain-intrinsic-height.contain-intrinsic-inline-size.contain-intrinsic-size.contain-intrinsic-width.container.container-name.container-type.content.content-visibility.corner-bottom-left-shape.corner-bottom-right-shape.corner-shape.corner-top-left-shape.corner-top-right-shape.counter-increment.counter-reset.counter-set.cue.cue-after.cue-before.cursor.cx.cy.direction.display.dominant-baseline.empty-cells.enable-background.field-sizing.fill.fill-opacity.fill-rule.filter.flex.flex-basis.flex-direction.flex-flow.flex-grow.flex-shrink.flex-wrap.float.flood-color.flood-opacity.flow.font.font-display.font-family.font-feature-settings.font-kerning.font-language-override.font-optical-sizing.font-palette.font-size.font-size-adjust.font-smooth.font-smoothing.font-stretch.font-style.font-synthesis.font-synthesis-position.font-synthesis-small-caps.font-synthesis-style.font-synthesis-weight.font-variant.font-variant-alternates.font-variant-caps.font-variant-east-asian.font-variant-emoji.font-variant-ligatures.font-variant-numeric.font-variant-position.font-variation-settings.font-weight.forced-color-adjust.gap.glyph-orientation-horizontal.glyph-orientation-vertical.grid.grid-area.grid-auto-columns.grid-auto-flow.grid-auto-rows.grid-column.grid-column-end.grid-column-start.grid-gap.grid-row.grid-row-end.grid-row-start.grid-template.grid-template-areas.grid-template-columns.grid-template-rows.hanging-punctuation.height.hyphenate-character.hyphenate-limit-chars.hyphens.icon.image-orientation.image-rendering.image-resolution.ime-mode.initial-letter.initial-letter-align.inline-size.inset.inset-area.inset-block.inset-block-end.inset-block-start.inset-inline.inset-inline-end.inset-inline-start.isolation.justify-content.justify-items.justify-self.kerning.left.letter-spacing.lighting-color.line-break.line-height.line-height-step.list-style.list-style-image.list-style-position.list-style-type.margin.margin-block.margin-block-end.margin-block-start.margin-bottom.margin-inline.margin-inline-end.margin-inline-start.margin-left.margin-right.margin-top.margin-trim.marker.marker-end.marker-mid.marker-start.marks.mask.mask-border.mask-border-mode.mask-border-outset.mask-border-repeat.mask-border-slice.mask-border-source.mask-border-width.mask-clip.mask-composite.mask-image.mask-mode.mask-origin.mask-position.mask-repeat.mask-size.mask-type.masonry-auto-flow.math-depth.math-shift.math-style.max-block-size.max-height.max-inline-size.max-width.min-block-size.min-height.min-inline-size.min-width.mix-blend-mode.nav-down.nav-index.nav-left.nav-right.nav-up.none.normal.object-fit.object-position.offset.offset-anchor.offset-distance.offset-path.offset-position.offset-rotate.opacity.order.orphans.outline.outline-color.outline-offset.outline-style.outline-width.overflow.overflow-anchor.overflow-block.overflow-clip-margin.overflow-inline.overflow-wrap.overflow-x.overflow-y.overlay.overscroll-behavior.overscroll-behavior-block.overscroll-behavior-inline.overscroll-behavior-x.overscroll-behavior-y.padding.padding-block.padding-block-end.padding-block-start.padding-bottom.padding-inline.padding-inline-end.padding-inline-start.padding-left.padding-right.padding-top.page.page-break-after.page-break-before.page-break-inside.paint-order.pause.pause-after.pause-before.perspective.perspective-origin.place-content.place-items.place-self.pointer-events.position.position-anchor.position-visibility.print-color-adjust.quotes.r.resize.rest.rest-after.rest-before.right.rotate.row-gap.ruby-align.ruby-position.scale.scroll-behavior.scroll-margin.scroll-margin-block.scroll-margin-block-end.scroll-margin-block-start.scroll-margin-bottom.scroll-margin-inline.scroll-margin-inline-end.scroll-margin-inline-start.scroll-margin-left.scroll-margin-right.scroll-margin-top.scroll-padding.scroll-padding-block.scroll-padding-block-end.scroll-padding-block-start.scroll-padding-bottom.scroll-padding-inline.scroll-padding-inline-end.scroll-padding-inline-start.scroll-padding-left.scroll-padding-right.scroll-padding-top.scroll-snap-align.scroll-snap-stop.scroll-snap-type.scroll-timeline.scroll-timeline-axis.scroll-timeline-name.scrollbar-color.scrollbar-gutter.scrollbar-width.shape-image-threshold.shape-margin.shape-outside.shape-rendering.speak.speak-as.src.stop-color.stop-opacity.stroke.stroke-dasharray.stroke-dashoffset.stroke-linecap.stroke-linejoin.stroke-miterlimit.stroke-opacity.stroke-width.tab-size.table-layout.text-align.text-align-all.text-align-last.text-anchor.text-combine-upright.text-decoration.text-decoration-color.text-decoration-line.text-decoration-skip.text-decoration-skip-ink.text-decoration-style.text-decoration-thickness.text-emphasis.text-emphasis-color.text-emphasis-position.text-emphasis-style.text-indent.text-justify.text-orientation.text-overflow.text-rendering.text-shadow.text-size-adjust.text-transform.text-underline-offset.text-underline-position.text-wrap.text-wrap-mode.text-wrap-style.timeline-scope.top.touch-action.transform.transform-box.transform-origin.transform-style.transition.transition-behavior.transition-delay.transition-duration.transition-property.transition-timing-function.translate.unicode-bidi.unicode-range.user-modify.user-select.vector-effect.vertical-align.view-timeline.view-timeline-axis.view-timeline-inset.view-timeline-name.view-transition-name.visibility.voice-balance.voice-duration.voice-family.voice-pitch.voice-range.voice-rate.voice-stress.voice-volume.white-space.white-space-collapse.widows.width.will-change.word-break.word-spacing.word-wrap.writing-mode.x.y.z-index.zoom`.split(`.`).sort().reverse();function fi(e){let t=e.regex,n=ii(e),r={begin:/-(webkit|moz|ms|o)-(?=[a-z])/},i=/@-?\w[\w]*(-\w+)*/,a=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{name:`CSS`,case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:`from to`},classNameAliases:{keyframePosition:`selector-tag`},contains:[n.BLOCK_COMMENT,r,n.CSS_NUMBER_MODE,{className:`selector-id`,begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:`selector-class`,begin:`\\.[a-zA-Z-][a-zA-Z0-9_-]*`,relevance:0},n.ATTRIBUTE_SELECTOR_MODE,{className:`selector-pseudo`,variants:[{begin:`:(`+li.join(`|`)+`)`},{begin:`:(:)?(`+ui.join(`|`)+`)`}]},n.CSS_VARIABLE,{className:`attribute`,begin:`\\b(`+di.join(`|`)+`)\\b`},{begin:/:/,end:/[;}{]/,contains:[n.BLOCK_COMMENT,n.HEXCOLOR,n.IMPORTANT,n.CSS_NUMBER_MODE,n.UNICODE_RANGE,...a,{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:`url data-uri`},contains:[...a,{className:`string`,begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}]},n.FUNCTION_DISPATCH]},{begin:t.lookahead(/@/),end:`[{;]`,relevance:0,illegal:/:/,contains:[{className:`keyword`,begin:i},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:`and or not only`,attribute:ci.join(` `)},contains:[{begin:/[a-z-]+(?=:)/,className:`attribute`},...a,n.CSS_NUMBER_MODE]}]},{className:`selector-tag`,begin:`\\b(`+si.join(`|`)+`)\\b`}]}}function pi(e){let t=e.regex;return{name:`Diff`,aliases:[`patch`],contains:[{className:`meta`,relevance:10,match:t.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^@@ +-\d+ +\+\d+,\d+ +@@/,/^@@ +-\d+,\d+ +\+\d+ +@@/,/^@@ +-\d+ +\+\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/)},{className:`comment`,variants:[{begin:t.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/),end:/$/},{match:/^\*{15}$/}]},{className:`addition`,begin:/^\+/,end:/$/},{className:`deletion`,begin:/^-/,end:/$/},{className:`addition`,begin:/^!/,end:/$/}]}}function mi(e){let t={keyword:[`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`],type:[`bool`,`byte`,`complex64`,`complex128`,`error`,`float32`,`float64`,`int8`,`int16`,`int32`,`int64`,`string`,`uint8`,`uint16`,`uint32`,`uint64`,`int`,`uint`,`uintptr`,`rune`],literal:[`true`,`false`,`iota`,`nil`],built_in:[`append`,`cap`,`close`,`complex`,`copy`,`imag`,`len`,`make`,`new`,`panic`,`print`,`println`,`real`,`recover`,`delete`]};return{name:`Go`,aliases:[`golang`],keywords:t,illegal:`</`,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:`string`,variants:[e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{begin:"`",end:"`"}]},{className:`number`,variants:[{match:/-?\b0[xX]\.[a-fA-F0-9](_?[a-fA-F0-9])*[pP][+-]?\d(_?\d)*i?/,relevance:0},{match:/-?\b0[xX](_?[a-fA-F0-9])+((\.([a-fA-F0-9](_?[a-fA-F0-9])*)?)?[pP][+-]?\d(_?\d)*)?i?/,relevance:0},{match:/-?\b0[oO](_?[0-7])*i?/,relevance:0},{match:/-?\b0[bB](_?[01])*i?/,relevance:0},{match:/-?\.\d(_?\d)*([eE][+-]?\d(_?\d)*)?i?/,relevance:0},{match:/-?\b\d(_?\d)*(\.(\d(_?\d)*)?)?([eE][+-]?\d(_?\d)*)?i?/,relevance:0}]},{begin:/:=/},{className:`function`,beginKeywords:`func`,end:`\\s*(\\{|$)`,excludeEnd:!0,contains:[e.TITLE_MODE,{className:`params`,begin:/\(/,end:/\)/,endsParent:!0,keywords:t,illegal:/["']/}]}]}}var hi=`[A-Za-z$_][0-9A-Za-z$_]*`,gi=`as.in.of.if.for.while.finally.var.new.function.do.return.void.else.break.catch.instanceof.with.throw.case.default.try.switch.continue.typeof.delete.let.yield.const.class.debugger.async.await.static.import.from.export.extends.using`.split(`.`),_i=[`true`,`false`,`null`,`undefined`,`NaN`,`Infinity`],vi=`Object.Function.Boolean.Symbol.Math.Date.Number.BigInt.String.RegExp.Array.Float32Array.Float64Array.Int8Array.Uint8Array.Uint8ClampedArray.Int16Array.Int32Array.Uint16Array.Uint32Array.BigInt64Array.BigUint64Array.Set.Map.WeakSet.WeakMap.ArrayBuffer.SharedArrayBuffer.Atomics.DataView.JSON.Promise.Generator.GeneratorFunction.AsyncFunction.Reflect.Proxy.Intl.WebAssembly`.split(`.`),yi=[`Error`,`EvalError`,`InternalError`,`RangeError`,`ReferenceError`,`SyntaxError`,`TypeError`,`URIError`],bi=[`setInterval`,`setTimeout`,`clearInterval`,`clearTimeout`,`require`,`exports`,`eval`,`isFinite`,`isNaN`,`parseFloat`,`parseInt`,`decodeURI`,`decodeURIComponent`,`encodeURI`,`encodeURIComponent`,`escape`,`unescape`],xi=[`arguments`,`this`,`super`,`console`,`window`,`document`,`localStorage`,`sessionStorage`,`module`,`self`,`global`],Si=[].concat(bi,vi,yi);function Ci(e){let t=e.regex,n=(e,{after:t})=>{let n=`</`+e[0].slice(1);return e.input.indexOf(n,t)!==-1},r=hi,i={begin:`<>`,end:`</>`},a=/<[A-Za-z0-9\\._:-]+\s*\/>/,o={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,t)=>{let r=e[0].length+e.index,i=e.input[r];if(i===`<`||i===`,`){t.ignoreMatch();return}i===`>`&&(n(e,{after:r})||t.ignoreMatch());let a,o=e.input.substring(r);if(a=o.match(/^\s*=/)){t.ignoreMatch();return}if((a=o.match(/^\s+extends\s+/))&&a.index===0){t.ignoreMatch();return}}},s={$pattern:hi,keyword:gi,literal:_i,built_in:Si,"variable.language":xi},c=`[0-9](_?[0-9])*`,l=`\\.(${c})`,u=`0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`,d={className:`number`,variants:[{begin:`(\\b(${u})((${l})|\\.)?|(${l}))[eE][+-]?(${c})\\b`},{begin:`\\b(${u})\\b((${l})\\b|\\.)?|(${l})\\b`},{begin:`\\b(0|[1-9](_?[0-9])*)n\\b`},{begin:`\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b`},{begin:`\\b0[bB][0-1](_?[0-1])*n?\\b`},{begin:`\\b0[oO][0-7](_?[0-7])*n?\\b`},{begin:`\\b0[0-7]+n?\\b`}],relevance:0},f={className:`subst`,begin:`\\$\\{`,end:`\\}`,keywords:s,contains:[]},p={begin:".?html`",end:``,starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,f],subLanguage:`xml`}},m={begin:".?css`",end:``,starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,f],subLanguage:`css`}},h={begin:".?gql`",end:``,starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,f],subLanguage:`graphql`}},g={className:`string`,begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,f]},_={className:`comment`,variants:[e.COMMENT(/\/\*\*(?!\/)/,`\\*/`,{relevance:0,contains:[{begin:`(?=@[A-Za-z]+)`,relevance:0,contains:[{className:`doctag`,begin:`@[A-Za-z]+`},{className:`type`,begin:`\\{`,end:`\\}`,excludeEnd:!0,excludeBegin:!0,relevance:0},{className:`variable`,begin:r+`(?=\\s*(-)|$)`,endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},v=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,p,m,h,g,{match:/\$\d+/},d];f.contains=v.concat({begin:/\{/,end:/\}/,keywords:s,contains:[`self`].concat(v)});let y=[].concat(_,f.contains),b=y.concat([{begin:/(\s*)\(/,end:/\)/,keywords:s,contains:[`self`].concat(y)}]),x={className:`params`,begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:b},S={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,t.concat(r,`(`,t.concat(/\./,r),`)*`)],scope:{1:`keyword`,3:`title.class`,5:`keyword`,7:`title.class.inherited`}},{match:[/class/,/\s+/,r],scope:{1:`keyword`,3:`title.class`}}]},C={relevance:0,match:t.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:`title.class`,keywords:{_:[...vi,...yi]}},w={label:`use_strict`,className:`meta`,relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},T={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:`keyword`,3:`title.function`},label:`func.def`,contains:[x],illegal:/%/},E={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:`variable.constant`};function D(e){return t.concat(`(?!`,e.join(`|`),`)`)}let O={match:t.concat(/\b/,D([...bi,`super`,`import`,`await`].map(e=>`${e}\\s*\\(`)),r,t.lookahead(/\s*\(/)),className:`title.function`,relevance:0},k={begin:t.concat(/\./,t.lookahead(t.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:`prototype`,className:`property`,relevance:0},A={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:`keyword`,3:`title.function`},contains:[{begin:/\(\)/},x]},ee=`(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|`+e.UNDERSCORE_IDENT_RE+`)\\s*=>`,j={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,t.lookahead(ee)],keywords:`async`,className:{1:`keyword`,3:`title.function`},contains:[x]};return{name:`JavaScript`,aliases:[`js`,`jsx`,`mjs`,`cjs`],keywords:s,exports:{PARAMS_CONTAINS:b,CLASS_REFERENCE:C},illegal:/#(?![$_A-Za-z])/,contains:[e.SHEBANG({label:`shebang`,binary:`node`,relevance:5}),w,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,p,m,h,g,_,{match:/\$\d+/},d,C,{scope:`attr`,match:r+t.lookahead(`:`),relevance:0},j,{begin:`(`+e.RE_STARTERS_RE+`|\\b(case|return|throw)\\b)\\s*`,keywords:`return throw case`,relevance:0,contains:[_,e.REGEXP_MODE,{className:`function`,begin:ee,returnBegin:!0,end:`\\s*=>`,contains:[{className:`params`,variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:b}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:i.begin,end:i.end},{match:a},{begin:o.begin,"on:begin":o.isTrulyOpeningTag,end:o.end}],subLanguage:`xml`,contains:[{begin:o.begin,end:o.end,skip:!0,contains:[`self`]}]}]},T,{beginKeywords:`while if switch catch for`},{begin:`\\b(?!function)`+e.UNDERSCORE_IDENT_RE+`\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{`,returnBegin:!0,label:`func.def`,contains:[x,e.inherit(e.TITLE_MODE,{begin:r,className:`title.function`})]},{match:/\.\.\./,relevance:0},k,{match:`\\$`+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:`title.function`},contains:[x]},O,E,S,A,{match:/\$[(.]/}]}}var wi={scope:`number`,match:`([-+]?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)|NaN|[-+]?Infinity`,relevance:0};function Ti(e){let t={className:`attr`,begin:/(("(\\.|[^\\"\r\n])*")|('(\\.|[^\\'\r\n])*'))(?=\s*:)/,relevance:1.01},n={match:/[{}[\],:]/,className:`punctuation`,relevance:0},r=[`true`,`false`,`null`],i={scope:`literal`,beginKeywords:r.join(` `)};return{name:`JSON`,aliases:[`jsonc`,`json5`],keywords:{literal:r},contains:[t,n,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,wi,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],illegal:`\\S`}}function Ei(e){let t=e.regex,n={begin:/<\/?[A-Za-z_]/,end:`>`,subLanguage:`xml`,relevance:0},r={match:/^ {0,3}([-*_])[ \t]*(?:\1[ \t]*){2,}$/},i={className:`code`,variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:`(~{3,})[^~](.|\\n)*?\\1~*[ ]*`},{begin:"```",end:"```+[ ]*$"},{begin:`~~~`,end:`~~~+[ ]*$`},{begin:"`.+?`"},{begin:`(?=^( {4}|\\t))`,contains:[{begin:`^( {4}|\\t)`,end:`(\\n)$`}],relevance:0}]},a={className:`bullet`,begin:`^[ ]*([*+-]|(\\d+\\.))(?=\\s+)`,end:`\\s+`,excludeEnd:!0},o={begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:`symbol`,begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:`link`,begin:/:\s*/,end:/$/,excludeBegin:!0}]},s={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:t.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:`string`,relevance:0,begin:`\\[`,end:`\\]`,excludeBegin:!0,returnEnd:!0},{className:`link`,relevance:0,begin:`\\]\\(`,end:`\\)`,excludeBegin:!0,excludeEnd:!0},{className:`symbol`,relevance:0,begin:`\\]\\[`,end:`\\]`,excludeBegin:!0,excludeEnd:!0}]},c={className:`strong`,contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},l={className:`emphasis`,contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},u=e.inherit(c,{contains:[]}),d=e.inherit(l,{contains:[]});c.contains.push(d),l.contains.push(u);let f=[n,s];return[c,l,u,d].forEach(e=>{e.contains=e.contains.concat(f)}),f=f.concat(c,l),{name:`Markdown`,aliases:[`md`,`mkdown`,`mkd`],contains:[{className:`section`,variants:[{begin:`^#{1,6}`,end:`$`,contains:f},{begin:`(?=^.+?\\n[=-]{2,}$)`,contains:[{begin:`^[=-]*$`},{begin:`^`,end:`\\n`,contains:f}]}]},n,a,r,c,l,{className:`quote`,begin:`^>\\s+`,contains:f,end:`$`},i,s,o,{scope:`literal`,match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}function Di(e){let t=e.regex,n=/[\p{XID_Start}_]\p{XID_Continue}*/u,r=`and.as.assert.async.await.break.case.class.continue.def.del.elif.else.except.finally.for.from.global.if.import.in.is.lambda.lazy.match.nonlocal|10.not.or.pass.raise.return.try.while.with.yield`.split(`.`),i={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:r,built_in:`__import__.abs.aiter.all.anext.any.ascii.bin.bool.breakpoint.bytearray.bytes.callable.chr.classmethod.compile.complex.delattr.dict.dir.divmod.enumerate.eval.exec.filter.float.format.frozendict.frozenset.getattr.globals.hasattr.hash.help.hex.id.input.int.isinstance.issubclass.iter.len.list.locals.map.max.memoryview.min.next.object.oct.open.ord.pow.print.property.range.repr.reversed.round.sentinel.set.setattr.slice.sorted.staticmethod.str.sum.super.tuple.type.vars.zip`.split(`.`),literal:[`__debug__`,`Ellipsis`,`False`,`None`,`NotImplemented`,`True`],type:[`Any`,`Callable`,`Coroutine`,`Dict`,`List`,`Literal`,`Generic`,`Optional`,`Sequence`,`Set`,`Tuple`,`Type`,`Union`]},a={className:`meta`,begin:/^(>>>|\.\.\.) /},o={className:`subst`,begin:/\{/,end:/\}/,keywords:i,illegal:/#/},s={begin:/\{\{/,relevance:0},c={className:`string`,contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/([fFtT][rR]|[rR][fFtT]|[fFtT])'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,o]},{begin:/([fFtT][rR]|[rR][fFtT]|[fFtT])"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,o]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fFtT][rR]|[rR][fFtT]|[fFtT])'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,o]},{begin:/([fFtT][rR]|[rR][fFtT]|[fFtT])"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,o]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l=`[0-9](_?[0-9])*`,u=`(\\b(${l}))?\\.(${l})|\\b(${l})\\.`,d=`\\b|${r.join(`|`)}`,f={className:`number`,relevance:0,variants:[{begin:`(\\b(${l})|(${u}))[eE][+-]?(${l})[jJ]?(?=${d})`},{begin:`(${u})[jJ]?`},{begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${d})`},{begin:`\\b0[bB](_?[01])+[lL]?(?=${d})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${d})`},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${d})`},{begin:`\\b(${l})[jJ](?=${d})`}]},p={className:`comment`,begin:t.lookahead(/# type:/),end:/$/,keywords:i,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={className:`params`,variants:[{className:``,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:i,contains:[`self`,a,f,c,e.HASH_COMMENT_MODE]}]};return o.contains=[c,f,a],{name:`Python`,aliases:[`py`,`gyp`,`ipython`],unicodeRegex:!0,keywords:i,illegal:/(<\/|\?)|=>/,contains:[a,f,{scope:`variable.language`,match:/\bself\b/},{beginKeywords:`if`,relevance:0},{match:/\bor\b/,scope:`keyword`},c,p,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,n],scope:{1:`keyword`,3:`title.function`},contains:[m]},{variants:[{match:[/\bclass/,/\s+/,n,/\s*/,/\(\s*/,n,/\s*\)/]},{match:[/\bclass/,/\s+/,n]}],scope:{1:`keyword`,3:`title.class`,6:`title.class.inherited`}},{className:`meta`,begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[f,m,c]}]}}function Oi(e){let t=e.regex,n=/(r#)?/,r=t.concat(n,e.UNDERSCORE_IDENT_RE),i=t.concat(n,e.IDENT_RE),a={scope:`title.function.invoke`,relevance:0,begin:t.concat(/\b/,/(?!(?:let|for|while|if|else|match)\b)/,i,t.lookahead(/\s*\(/))},o=`([ui](8|16|32|64|128|size)|f(16|32|64|128))?`,s=`abstract.as.async.await.become.box.break.const.continue.crate.do.dyn.else.enum.extern.false.final.fn.for.if.impl.in.let.loop.macro.match.mod.move.mut.override.priv.pub.raw.ref.return.self.Self.static.struct.super.trait.true.try.type.typeof.union.unsafe.unsized.use.virtual.where.while.yield`.split(`.`),c=[`true`,`false`,`Some`,`None`,`Ok`,`Err`],l=`drop .Copy.Send.Sized.Sync.Drop.Fn.FnMut.FnOnce.ToOwned.Clone.Debug.PartialEq.PartialOrd.Eq.Ord.AsRef.AsMut.Into.From.Default.Iterator.Extend.IntoIterator.DoubleEndedIterator.ExactSizeIterator.SliceConcatExt.ToString.assert!.assert_eq!.bitflags!.bytes!.cfg!.col!.concat!.concat_idents!.debug_assert!.debug_assert_eq!.env!.eprintln!.panic!.file!.format!.format_args!.include_bytes!.include_str!.line!.local_data_key!.module_path!.option_env!.print!.println!.select!.stringify!.try!.unimplemented!.unreachable!.vec!.write!.writeln!.macro_rules!.assert_ne!.debug_assert_ne!`.split(`.`),u=[`i8`,`i16`,`i32`,`i64`,`i128`,`isize`,`u8`,`u16`,`u32`,`u64`,`u128`,`usize`,`f16`,`f32`,`f64`,`f128`,`str`,`char`,`bool`,`Box`,`Option`,`Result`,`String`,`Vec`];return{name:`Rust`,aliases:[`rs`],keywords:{$pattern:e.IDENT_RE+`!?`,type:u,keyword:s,literal:c,built_in:l},illegal:`</`,contains:[e.C_LINE_COMMENT_MODE,e.COMMENT(`/\\*`,`\\*/`,{contains:[`self`]}),e.inherit(e.QUOTE_STRING_MODE,{begin:/b?"/,illegal:null}),{scope:`symbol`,begin:/'[a-zA-Z_][a-zA-Z0-9_]*(?!')/},{scope:`string`,variants:[{begin:/b?r(#*)"(.|\n)*?"\1(?!#)/},{begin:/b?'/,end:/'/,contains:[{scope:`char.escape`,match:/\\('|"|\\|\w|x\w{2}|u\w{4}|U\w{8})/}]}]},{scope:`number`,variants:[{begin:`\\b0b([01_]+)`+o},{begin:`\\b0o([0-7_]+)`+o},{begin:`\\b0x([A-Fa-f0-9_]+)`+o},{begin:`\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)`+o}],relevance:0},{begin:[/\bsafe/,/\s+/,/extern/],scope:{1:`keyword`,3:`keyword`}},{begin:[/fn/,/\s+/,r],scope:{1:`keyword`,3:`title.function`}},{scope:`meta`,begin:`#!?\\[`,end:`\\]`,contains:[{scope:`string`,begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE]}]},{begin:[/let/,/\s+/,/(?:mut\s+)?/,r],scope:{1:`keyword`,3:`keyword`,4:`variable`}},{begin:[/for/,/\s+/,r,/\s+/,/in/],scope:{1:`keyword`,3:`variable`,5:`keyword`}},{begin:[/type/,/\s+/,r],scope:{1:`keyword`,3:`title.class`}},{begin:[/(?:trait|enum|struct|union|impl|for)/,/\s+/,r],scope:{1:`keyword`,3:`title.class`}},{begin:e.IDENT_RE+`::`,keywords:{keyword:`Self`,built_in:l,type:u}},{scope:`punctuation`,begin:`->`},a]}}function ki(e){return{name:`Shell Session`,aliases:[`console`,`shellsession`],contains:[{className:`meta.prompt`,begin:/^\s{0,3}[./~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,subLanguage:`bash`}}]}}function Ai(e){let t=e.regex,n=e.COMMENT(`--`,`$`),r={scope:`string`,variants:[{begin:/'/,end:/'/,contains:[{match:/''/}]}]},i={begin:/"/,end:/"/,contains:[{match:/""/}]},a=[`true`,`false`,`unknown`],o=[`double precision`,`large object`,`with timezone`,`without timezone`],s=`bigint.binary.blob.boolean.char.character.clob.date.dec.decfloat.decimal.float.int.integer.interval.nchar.nclob.national.numeric.real.row.smallint.time.timestamp.varchar.varying.varbinary`.split(`.`),c=[`add`,`asc`,`collation`,`desc`,`final`,`first`,`last`,`view`],l=`abs.acos.all.allocate.alter.and.any.are.array.array_agg.array_max_cardinality.as.asensitive.asin.asymmetric.at.atan.atomic.authorization.avg.begin.begin_frame.begin_partition.between.bigint.binary.blob.boolean.both.by.call.called.cardinality.cascaded.case.cast.ceil.ceiling.char.char_length.character.character_length.check.classifier.clob.close.coalesce.collate.collect.column.commit.condition.connect.constraint.contains.convert.copy.corr.corresponding.cos.cosh.count.covar_pop.covar_samp.create.cross.cube.cume_dist.current.current_catalog.current_date.current_default_transform_group.current_path.current_role.current_row.current_schema.current_time.current_timestamp.current_path.current_role.current_transform_group_for_type.current_user.cursor.cycle.date.day.deallocate.dec.decimal.decfloat.declare.default.define.delete.dense_rank.deref.describe.deterministic.disconnect.distinct.double.drop.dynamic.each.element.else.empty.end.end_frame.end_partition.end-exec.equals.escape.every.except.exec.execute.exists.exp.external.extract.false.fetch.filter.first_value.float.floor.for.foreign.frame_row.free.from.full.function.fusion.get.global.grant.group.grouping.groups.having.hold.hour.identity.in.indicator.initial.inner.inout.insensitive.insert.int.integer.intersect.intersection.interval.into.is.join.json_array.json_arrayagg.json_exists.json_object.json_objectagg.json_query.json_table.json_table_primitive.json_value.lag.language.large.last_value.lateral.lead.leading.left.like.like_regex.listagg.ln.local.localtime.localtimestamp.log.log10.lower.match.match_number.match_recognize.matches.max.member.merge.method.min.minute.mod.modifies.module.month.multiset.national.natural.nchar.nclob.new.no.none.normalize.not.nth_value.ntile.null.nullif.numeric.octet_length.occurrences_regex.of.offset.old.omit.on.one.only.open.or.order.out.outer.over.overlaps.overlay.parameter.partition.pattern.per.percent.percent_rank.percentile_cont.percentile_disc.period.portion.position.position_regex.power.precedes.precision.prepare.primary.procedure.ptf.range.rank.reads.real.recursive.ref.references.referencing.regr_avgx.regr_avgy.regr_count.regr_intercept.regr_r2.regr_slope.regr_sxx.regr_sxy.regr_syy.release.result.return.returns.revoke.right.rollback.rollup.row.row_number.rows.running.savepoint.scope.scroll.search.second.seek.select.sensitive.session_user.set.show.similar.sin.sinh.skip.smallint.some.specific.specifictype.sql.sqlexception.sqlstate.sqlwarning.sqrt.start.static.stddev_pop.stddev_samp.submultiset.subset.substring.substring_regex.succeeds.sum.symmetric.system.system_time.system_user.table.tablesample.tan.tanh.then.time.timestamp.timezone_hour.timezone_minute.to.trailing.translate.translate_regex.translation.treat.trigger.trim.trim_array.true.truncate.uescape.union.unique.unknown.unnest.update.upper.user.using.value.values.value_of.var_pop.var_samp.varbinary.varchar.varying.versioning.when.whenever.where.width_bucket.window.with.within.without.year`.split(`.`),u=`abs.acos.array_agg.asin.atan.avg.cast.ceil.ceiling.coalesce.corr.cos.cosh.count.covar_pop.covar_samp.cume_dist.dense_rank.deref.element.exp.extract.first_value.floor.json_array.json_arrayagg.json_exists.json_object.json_objectagg.json_query.json_table.json_table_primitive.json_value.lag.last_value.lead.listagg.ln.log.log10.lower.max.min.mod.nth_value.ntile.nullif.percent_rank.percentile_cont.percentile_disc.position.position_regex.power.rank.regr_avgx.regr_avgy.regr_count.regr_intercept.regr_r2.regr_slope.regr_sxx.regr_sxy.regr_syy.row_number.sin.sinh.sqrt.stddev_pop.stddev_samp.substring.substring_regex.sum.tan.tanh.translate.translate_regex.treat.trim.trim_array.unnest.upper.value_of.var_pop.var_samp.width_bucket`.split(`.`),d=[`current_catalog`,`current_date`,`current_default_transform_group`,`current_path`,`current_role`,`current_schema`,`current_transform_group_for_type`,`current_user`,`session_user`,`system_time`,`system_user`,`current_time`,`localtime`,`current_timestamp`,`localtimestamp`],f=[`create table`,`insert into`,`primary key`,`foreign key`,`not null`,`alter table`,`add constraint`,`grouping sets`,`on overflow`,`character set`,`respect nulls`,`ignore nulls`,`nulls first`,`nulls last`,`depth first`,`breadth first`],p=u,m=[...l,...c].filter(e=>!u.includes(e)),h={scope:`variable`,match:/@[a-z0-9][a-z0-9_]*/},g={scope:`operator`,match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0},_={match:t.concat(/\b/,t.either(...p),/\s*\(/),relevance:0,keywords:{built_in:p}};function v(e){return t.concat(/\b/,t.either(...e.map(e=>e.replace(/\s+/,`\\s+`))),/\b/)}let y={scope:`keyword`,match:v(f),relevance:0};function b(e,{exceptions:t,when:n}={}){let r=n;return t||=[],e.map(e=>e.match(/\|\d+$/)||t.includes(e)?e:r(e)?`${e}|0`:e)}return{name:`SQL`,case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:b(m,{when:e=>e.length<3}),literal:a,type:s,built_in:d},contains:[{scope:`type`,match:v(o)},y,_,h,r,i,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,n,g]}}var ji=`[A-Za-z$_][0-9A-Za-z$_]*`,Mi=`as.in.of.if.for.while.finally.var.new.function.do.return.void.else.break.catch.instanceof.with.throw.case.default.try.switch.continue.typeof.delete.let.yield.const.class.debugger.async.await.static.import.from.export.extends.using`.split(`.`),Ni=[`true`,`false`,`null`,`undefined`,`NaN`,`Infinity`],Pi=`Object.Function.Boolean.Symbol.Math.Date.Number.BigInt.String.RegExp.Array.Float32Array.Float64Array.Int8Array.Uint8Array.Uint8ClampedArray.Int16Array.Int32Array.Uint16Array.Uint32Array.BigInt64Array.BigUint64Array.Set.Map.WeakSet.WeakMap.ArrayBuffer.SharedArrayBuffer.Atomics.DataView.JSON.Promise.Generator.GeneratorFunction.AsyncFunction.Reflect.Proxy.Intl.WebAssembly`.split(`.`),Fi=[`Error`,`EvalError`,`InternalError`,`RangeError`,`ReferenceError`,`SyntaxError`,`TypeError`,`URIError`],Ii=[`setInterval`,`setTimeout`,`clearInterval`,`clearTimeout`,`require`,`exports`,`eval`,`isFinite`,`isNaN`,`parseFloat`,`parseInt`,`decodeURI`,`decodeURIComponent`,`encodeURI`,`encodeURIComponent`,`escape`,`unescape`],Li=[`arguments`,`this`,`super`,`console`,`window`,`document`,`localStorage`,`sessionStorage`,`module`,`self`,`global`],Ri=[].concat(Ii,Pi,Fi);function zi(e){let t=e.regex,n=(e,{after:t})=>{let n=`</`+e[0].slice(1);return e.input.indexOf(n,t)!==-1},r=ji,i={begin:`<>`,end:`</>`},a=/<[A-Za-z0-9\\._:-]+\s*\/>/,o={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,t)=>{let r=e[0].length+e.index,i=e.input[r];if(i===`<`||i===`,`){t.ignoreMatch();return}i===`>`&&(n(e,{after:r})||t.ignoreMatch());let a,o=e.input.substring(r);if(a=o.match(/^\s*=/)){t.ignoreMatch();return}if((a=o.match(/^\s+extends\s+/))&&a.index===0){t.ignoreMatch();return}}},s={$pattern:ji,keyword:Mi,literal:Ni,built_in:Ri,"variable.language":Li},c=`[0-9](_?[0-9])*`,l=`\\.(${c})`,u=`0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`,d={className:`number`,variants:[{begin:`(\\b(${u})((${l})|\\.)?|(${l}))[eE][+-]?(${c})\\b`},{begin:`\\b(${u})\\b((${l})\\b|\\.)?|(${l})\\b`},{begin:`\\b(0|[1-9](_?[0-9])*)n\\b`},{begin:`\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b`},{begin:`\\b0[bB][0-1](_?[0-1])*n?\\b`},{begin:`\\b0[oO][0-7](_?[0-7])*n?\\b`},{begin:`\\b0[0-7]+n?\\b`}],relevance:0},f={className:`subst`,begin:`\\$\\{`,end:`\\}`,keywords:s,contains:[]},p={begin:".?html`",end:``,starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,f],subLanguage:`xml`}},m={begin:".?css`",end:``,starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,f],subLanguage:`css`}},h={begin:".?gql`",end:``,starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,f],subLanguage:`graphql`}},g={className:`string`,begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,f]},_={className:`comment`,variants:[e.COMMENT(/\/\*\*(?!\/)/,`\\*/`,{relevance:0,contains:[{begin:`(?=@[A-Za-z]+)`,relevance:0,contains:[{className:`doctag`,begin:`@[A-Za-z]+`},{className:`type`,begin:`\\{`,end:`\\}`,excludeEnd:!0,excludeBegin:!0,relevance:0},{className:`variable`,begin:r+`(?=\\s*(-)|$)`,endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},v=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,p,m,h,g,{match:/\$\d+/},d];f.contains=v.concat({begin:/\{/,end:/\}/,keywords:s,contains:[`self`].concat(v)});let y=[].concat(_,f.contains),b=y.concat([{begin:/(\s*)\(/,end:/\)/,keywords:s,contains:[`self`].concat(y)}]),x={className:`params`,begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:b},S={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,t.concat(r,`(`,t.concat(/\./,r),`)*`)],scope:{1:`keyword`,3:`title.class`,5:`keyword`,7:`title.class.inherited`}},{match:[/class/,/\s+/,r],scope:{1:`keyword`,3:`title.class`}}]},C={relevance:0,match:t.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:`title.class`,keywords:{_:[...Pi,...Fi]}},w={label:`use_strict`,className:`meta`,relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},T={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:`keyword`,3:`title.function`},label:`func.def`,contains:[x],illegal:/%/},E={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:`variable.constant`};function D(e){return t.concat(`(?!`,e.join(`|`),`)`)}let O={match:t.concat(/\b/,D([...Ii,`super`,`import`,`await`].map(e=>`${e}\\s*\\(`)),r,t.lookahead(/\s*\(/)),className:`title.function`,relevance:0},k={begin:t.concat(/\./,t.lookahead(t.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:`prototype`,className:`property`,relevance:0},A={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:`keyword`,3:`title.function`},contains:[{begin:/\(\)/},x]},ee=`(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|`+e.UNDERSCORE_IDENT_RE+`)\\s*=>`,j={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,t.lookahead(ee)],keywords:`async`,className:{1:`keyword`,3:`title.function`},contains:[x]};return{name:`JavaScript`,aliases:[`js`,`jsx`,`mjs`,`cjs`],keywords:s,exports:{PARAMS_CONTAINS:b,CLASS_REFERENCE:C},illegal:/#(?![$_A-Za-z])/,contains:[e.SHEBANG({label:`shebang`,binary:`node`,relevance:5}),w,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,p,m,h,g,_,{match:/\$\d+/},d,C,{scope:`attr`,match:r+t.lookahead(`:`),relevance:0},j,{begin:`(`+e.RE_STARTERS_RE+`|\\b(case|return|throw)\\b)\\s*`,keywords:`return throw case`,relevance:0,contains:[_,e.REGEXP_MODE,{className:`function`,begin:ee,returnBegin:!0,end:`\\s*=>`,contains:[{className:`params`,variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:b}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:i.begin,end:i.end},{match:a},{begin:o.begin,"on:begin":o.isTrulyOpeningTag,end:o.end}],subLanguage:`xml`,contains:[{begin:o.begin,end:o.end,skip:!0,contains:[`self`]}]}]},T,{beginKeywords:`while if switch catch for`},{begin:`\\b(?!function)`+e.UNDERSCORE_IDENT_RE+`\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{`,returnBegin:!0,label:`func.def`,contains:[x,e.inherit(e.TITLE_MODE,{begin:r,className:`title.function`})]},{match:/\.\.\./,relevance:0},k,{match:`\\$`+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:`title.function`},contains:[x]},O,E,S,A,{match:/\$[(.]/}]}}function Bi(e){let t=e.regex,n=zi(e),r=ji,i=[`any`,`void`,`number`,`boolean`,`string`,`object`,`never`,`symbol`,`bigint`,`unknown`],a={begin:[/namespace/,/\s+/,e.IDENT_RE],beginScope:{1:`keyword`,3:`title.class`}},o={beginKeywords:`interface`,end:/\{/,excludeEnd:!0,keywords:{keyword:`interface extends`,built_in:i},contains:[n.exports.CLASS_REFERENCE]},s={className:`meta`,relevance:10,begin:/^\s*['"]use strict['"]/},c={$pattern:ji,keyword:Mi.concat([`type`,`interface`,`public`,`private`,`protected`,`implements`,`declare`,`abstract`,`readonly`,`enum`,`override`,`satisfies`]),literal:Ni,built_in:Ri.concat(i),"variable.language":Li},l={className:`meta`,begin:`@`+r},u=(e,t,n)=>{let r=e.contains.findIndex(e=>e.label===t);if(r===-1)throw Error(`can not find mode to replace`);e.contains.splice(r,1,n)};Object.assign(n.keywords,c),n.exports.PARAMS_CONTAINS.push(l);let d=n.contains.find(e=>e.scope===`attr`),f=Object.assign({},d,{match:t.concat(r,t.lookahead(/\s*\?:/))});n.exports.PARAMS_CONTAINS.push([n.exports.CLASS_REFERENCE,d,f]),n.contains=n.contains.concat([l,a,o,f]),u(n,`shebang`,e.SHEBANG()),u(n,`use_strict`,s);let p=n.contains.find(e=>e.label===`func.def`);return p.relevance=0,Object.assign(n,{name:`TypeScript`,aliases:[`ts`,`tsx`,`mts`,`cts`]}),n}function Vi(e){let t=e.regex,n=t.concat(/[\p{L}_]/u,t.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),r=/[\p{L}0-9._:-]+/u,i={className:`symbol`,begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},a={begin:/\s/,contains:[{className:`keyword`,begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},o=e.inherit(a,{begin:/\(/,end:/\)/}),s=e.inherit(e.APOS_STRING_MODE,{className:`string`}),c=e.inherit(e.QUOTE_STRING_MODE,{className:`string`}),l={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:`attr`,begin:r,relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:`string`,endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[i]},{begin:/'/,end:/'/,contains:[i]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:`HTML, XML`,aliases:[`html`,`xhtml`,`rss`,`atom`,`xjb`,`xsd`,`xsl`,`plist`,`wsf`,`svg`],case_insensitive:!0,unicodeRegex:!0,contains:[{className:`meta`,begin:/<![a-z]/,end:/>/,relevance:10,contains:[a,c,s,o,{begin:/\[/,end:/\]/,contains:[{className:`meta`,begin:/<![a-z]/,end:/>/,contains:[a,o,c,s]}]}]},e.COMMENT(/<!--/,/-->/,{relevance:10}),{begin:/<!\[CDATA\[/,end:/\]\]>/,relevance:10},i,{className:`meta`,end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[c]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:`tag`,begin:/<style(?=\s|>)/,end:/>/,keywords:{name:`style`},contains:[l],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:`css`}},{className:`tag`,begin:/<script(?=\s|>)/,end:/>/,keywords:{name:`script`},contains:[l],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:`javascript`}},{className:`tag`,begin:/<>|<\/>/},{className:`tag`,begin:t.concat(/</,t.lookahead(t.concat(n,t.either(/\/>/,/>/,/\s/)))),end:/\/?>/,contains:[{className:`name`,begin:n,relevance:0,starts:l}]},{className:`tag`,begin:t.concat(/<\//,t.lookahead(t.concat(n,/>/))),contains:[{className:`name`,begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}function Hi(e){let t=`true false yes no null`,n=`[\\w#;/?:@&=+$,.~*'()[\\]]+`,r={className:`attr`,variants:[{begin:/[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/},{begin:/"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/},{begin:/'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/}]},i={className:`template-variable`,variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]},a={className:`string`,relevance:0,begin:/'/,end:/'/,contains:[{match:/''/,scope:`char.escape`,relevance:0}]},o={className:`string`,relevance:0,variants:[{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,i]},s=e.inherit(o,{variants:[{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),c={className:`number`,begin:`\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b`},l={end:`,`,endsWithParent:!0,excludeEnd:!0,keywords:t,relevance:0},u={begin:/\{/,end:/\}/,contains:[l],illegal:`\\n`,relevance:0},d={begin:`\\[`,end:`\\]`,contains:[l],illegal:`\\n`,relevance:0},f=[r,{className:`meta`,begin:`^---\\s*$`,relevance:10},{className:`string`,begin:`[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*`},{begin:`<%[%=-]?`,end:`[%-]?%>`,subLanguage:`ruby`,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:`type`,begin:`!\\w+!`+n},{className:`type`,begin:`!<`+n+`>`},{className:`type`,begin:`!`+n},{className:`type`,begin:`!!`+n},{className:`meta`,begin:`&`+e.UNDERSCORE_IDENT_RE+`$`},{className:`meta`,begin:`\\*`+e.UNDERSCORE_IDENT_RE+`$`},{className:`bullet`,begin:`-(?=[ ]|$)`,relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:t,keywords:{literal:t}},c,{className:`number`,begin:e.C_NUMBER_RE+`\\b`,relevance:0},u,d,a,o],p=[...f];return p.pop(),p.push(s),l.contains=p,{name:`YAML`,case_insensitive:!0,aliases:[`yml`],contains:f}}for(let[e,t]of Object.entries({bash:ri,css:fi,diff:pi,go:mi,javascript:Ci,json:Ti,markdown:Ei,python:Di,rust:Oi,shell:ki,sql:Ai,typescript:Bi,xml:Vi,yaml:Hi}))ni.registerLanguage(e,t);function Ui(e){for(let t of e.querySelectorAll(`pre code[class]`)){let e=/(?:language|lang)-(\S+)/.exec(t.className)?.[1]?.toLowerCase();!e||!ni.getLanguage(e)||(t.innerHTML=ni.highlight(t.textContent??``,{language:e}).value)}}var Wi={ts:`typescript`,tsx:`typescript`,mts:`typescript`,cts:`typescript`,js:`javascript`,jsx:`javascript`,mjs:`javascript`,cjs:`javascript`,py:`python`,rs:`rust`,sh:`bash`,zsh:`bash`,md:`markdown`,yml:`yaml`,html:`xml`,htm:`xml`,svg:`xml`,patch:`diff`};function Gi(e){let t=e.split(`.`).pop()?.toLowerCase()??``,n=Wi[t]??t;return ni.getLanguage(n)?n:null}function Ki(e,t){let n=document.createElement(`span`);return t&&e.length<=500?n.innerHTML=ni.highlight(e,{language:t}).value:n.textContent=e,n}var qi=null,Ji=`max-w-full cursor-pointer break-words rounded-full border border-indigo-200 bg-indigo-50 px-2.5 py-0.5 text-left text-[12.5px] text-indigo-700 transition-colors hover:border-indigo-300 hover:bg-indigo-100`;function Yi(){qi=null}function Xi(e,t,n){if(qi?.remove(),qi=null,!t.length)return;let r=K(`div`,`mt-1.5 flex flex-wrap gap-1.5`);for(let e of t){let t=K(`button`,Ji,e);t.type=`button`,t.onclick=()=>{qi===r&&(qi=null),r.remove(),n(e)},r.append(t)}e.append(r),qi=r}var Zi=8e3,Qi=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`],$i,ea;function ta(e,t){$i=e,ea=t}var na={queued:`border-amber-200 bg-amber-50 text-amber-800`,running:`border-green-200 bg-green-50 text-green-800`,succeeded:`border-neutral-200 bg-neutral-50 text-neutral-600`,failed:`border-red-200 bg-red-50 text-red-700`,cancelled:`border-neutral-200 bg-neutral-50 text-neutral-500`,interrupted:`border-amber-200 bg-amber-50 text-amber-800`,skipped:`border-neutral-200 bg-neutral-50 text-neutral-500`},ra=new Map;async function ia(e){let t=await e;t.sent&&t.error&&ea.append(`error`,t.error)}async function aa(e,t){try{let n=await fetch(e,{method:`POST`});n.ok||ea.append(`error`,await T(n,t))}catch(e){ea.append(`error`,`${t}: ${String(e)}`)}}async function oa(e){let t=$i.sessionId();t&&await ia(O(`Reply to subagent`,`/api/task-messages/${e}/reply`,{sourceSessionId:t},`reply failed`))}function sa(e){let t=K(`button`,`flex-none text-[11px] font-semibold normal-case text-cyan-800 hover:underline`,`Reply`);return t.onclick=()=>void oa(e),t}function ca(e){for(let[e,t]of ra)t.isConnected||ra.delete(e);let t=ra.get(e.runId);t||(t=K(`div`,`mx-5 my-1.5 border px-3 py-2 text-[13px]`),t.dataset.kind=`background-run`,ea.el.append(t),ra.set(e.runId,t)),t.className=`mx-5 my-1.5 border px-3 py-2 text-[13px] ${na[e.state]}`;let n=e.state===`queued`||e.state===`running`,r=`/api/task-runs/${e.runId}`,i=n?K(`span`,`spinner`):K(`span`,`w-3 flex-none text-center`,e.state===`succeeded`?`✓`:e.state===`failed`?`✕`:`·`),a=K(`button`,`min-w-0 truncate text-left font-medium hover:underline`,e.taskName);a.onclick=()=>$i.showTasks(e.taskId);let o=K(`div`,`flex items-center gap-2`,i,K(`span`,`flex-none text-[11px] font-semibold uppercase`,e.state),a),s=K(`div`,`ml-auto flex flex-none items-center gap-2`);if(e.targetSessionId){let t=K(`button`,`font-mono text-[11px] hover:underline`,`Open`);t.title=`Open ${e.targetSessionId}`,t.onclick=()=>$i.select(e.targetSessionId),s.append(t)}if(n){let e=K(`button`,`text-[11px] font-semibold hover:underline`,`Steer`),t={mode:`steer`,sourceSessionId:$i.sessionId()};e.onclick=()=>void ia(O(`Steer subagent`,`${r}/steer`,t,`could not steer the run`));let n=K(`button`,`text-[11px] font-semibold hover:underline`,`Stop`);n.onclick=()=>void aa(`${r}/cancel`,`could not stop the run`),s.append(e,n)}else if(e.targetSessionId&&e.sessionMode!==null){let e=K(`button`,`text-[11px] font-semibold hover:underline`,`Continue`),t={sourceSessionId:$i.sessionId()};e.onclick=()=>void ia(O(`Continue subagent`,`${r}/resume`,t,`could not continue`)),s.append(e)}o.append(s);let c=Math.max(0,Math.round(((e.finishedAt??Date.now())-(e.startedAt??e.queuedAt))/1e3));t.replaceChildren(o,K(`div`,`mt-1 break-words text-[11px] opacity-70`,`${e.sessionMode??`task`} · depth ${e.depth} · ${c}s · ${e.runId}`)),ea.scroll()}var la=null,ua=new WeakMap,da=e=>{let t=ua.get(e)??[];return ua.set(e,t),t};function fa(){la&&!la.toolRows.size&&wa(`done`)}var pa=null;function ma(){la=null,pa=null,ra.clear()}function ha(){let e=pa;return!e||la?.el===e||(pa=null,e!==ea.el.lastElementChild)?null:(e.remove(),e.dataset.adopted=`1`,_a(e,e.dataset.status),e)}var ga={running:`text-green-700 open:bg-green-50`,done:`text-neutral-400 hover:text-neutral-600 open:bg-black/[0.02] open:text-neutral-500 dark:open:bg-neutral-100`,failed:`text-red-600 open:bg-red-50`,interrupted:`text-amber-700 open:bg-amber-50`};function _a(e,t){e.dataset.status=t,e.className=`${e.dataset.adopted?`float-left min-w-[6.5rem] pr-3 tabular-nums mt-[3px] open:float-none open:mt-0 open:mb-1.5 open:min-w-0 open:pr-0`:`mx-5 my-1.5`} rounded-md text-[11.5px] leading-[1.35] open:border open:border-black/[0.06] open:px-2 open:py-1.5 dark:open:border-neutral-200 ${ga[t]}`}var va={failed:`✕`,interrupted:`⏸`};function ya(e){return e===`running`?K(`span`,`spinner`):e===`done`?K(`span`,`hidden`):K(`span`,`flex-none text-[12px] font-bold`,va[e])}function ba(e){if(la)return la;let t=ya(`running`),n=K(`span`,`min-w-0 truncate`,`working…`),{el:r}=sr(``,[t,n]);r.dataset.kind=`activity`,_a(r,`running`);let i=K(`div`,`mt-1.5 flex max-h-64 flex-col gap-1 overflow-y-auto overscroll-contain border-t border-black/5 pt-1.5 dark:border-neutral-200`);return r.append(i),xa(r,i),ea.el.append(r),pa=r,ea.scroll(),la={el:r,statusIcon:t,headline:n,rowsEl:i,toolRows:new Map,thinking:null,steps:0,failedSteps:0,startTs:e,sawError:!1},la}function xa(e,t){t.dataset.follow=`1`,t.addEventListener(`scroll`,()=>{let e=t.scrollHeight-t.scrollTop-t.clientHeight<24;t.dataset.follow=e?`1`:``}),e.addEventListener(`toggle`,()=>{e.open&&(t.scrollTop=t.scrollHeight,t.dataset.follow=`1`)})}function Sa(e){ea.bulk()||!e.el.open||!e.rowsEl.dataset.follow||(e.rowsEl.scrollTop=e.rowsEl.scrollHeight)}function Ca(e,t,n){let r=Math.max(1,Math.round((Date.now()-e.startTs)/1e3)),i=`${e.steps} step${e.steps===1?``:`s`} · ${r}s`;e.headline.textContent=t===`running`&&n?`${i} · ${n}`:t===`done`?i:`${i} · ${t}`,_a(e.el,t);let a=ya(t);e.statusIcon.replaceWith(a),e.statusIcon=a}function wa(e){if(!la)return;for(let{statusEl:e}of la.toolRows.values())e.textContent===`running…`&&(e.textContent=`interrupted`);let t=la.steps>0&&la.failedSteps===la.steps;Ca(la,(la.sawError||t)&&e===`done`?`failed`:e),la=null}function Ta(){la&&(la.sawError=!0)}function Ea(e){let t=e.slice(0,400).replace(/\s+/g,` `);return t.length>100?t.slice(0,100)+`…`:t}function Da(e,t,n,r){let i=ba(e);i.steps+=1,i.thinking=null;let a=JSON.stringify(r,null,2)??``,o=K(`span`,`ml-auto flex-none text-neutral-400`,`running…`),s=K(`span`,`min-w-0 truncate text-neutral-500`,Ea(a)),{el:c}=sr(`rounded-md px-1 py-0.5 font-mono text-[12.5px] hover:bg-black/[0.03] dark:hover:bg-neutral-100`,[K(`span`,`flex-none font-semibold`,n),s,o]),l=K(`pre`,`max-h-40 overflow-y-auto whitespace-pre-wrap break-words rounded bg-black/[0.04] p-1.5 text-[12px] dark:bg-neutral-100`,a),u=K(`pre`,`hidden max-h-56 overflow-y-auto whitespace-pre-wrap break-words rounded bg-black/[0.04] p-1.5 text-[12px] dark:bg-neutral-100`);c.append(K(`div`,`mt-1 flex flex-col gap-1 pl-4`,l,u)),da(i.el).push({tool:n,call:t,preview:s,argsPre:l,outputPre:u}),i.toolRows.set(t,{el:c,statusEl:o,outputPre:u}),i.rowsEl.append(c),Sa(i),Ca(i,`running`,n),ea.scroll()}function Oa(e,t,n){let r=la;if(!r)return;let i=r.toolRows.get(e);r.toolRows.delete(e),i&&(i.statusEl.textContent=t?`failed`:`ok`,i.statusEl.className=`ml-auto flex-none ${t?`text-red-600`:`text-green-700`}`,i.el.classList.toggle(`bg-red-50`,t),i.el.classList.toggle(`text-red-700`,t),n&&(i.outputPre.textContent=n.length>8e3?n.slice(0,Zi)+`…`:n,i.outputPre.classList.remove(`hidden`)),t&&(r.failedSteps+=1)),Ca(r,`running`)}function ka(e,t){let n=ba(e);if(!n.thinking){let{el:e,summary:t}=sr(`rounded-md px-1 py-0.5 text-[12.5px] italic text-neutral-500 hover:bg-black/[0.03] dark:hover:bg-neutral-100`,[K(`span`,`min-w-0 truncate`,`thinking…`)]),r=K(`div`,`mt-1 max-h-56 overflow-y-auto whitespace-pre-wrap break-words pl-4 not-italic text-neutral-500`,``);e.append(r),n.rowsEl.append(e),n.thinking={pre:r,summary:t},Sa(n),Ca(n,`running`,`thinking…`)}let r=n.thinking;r.pre.textContent=((r.pre.textContent??``)+t).slice(-4e3);let i=(r.pre.textContent??``).split(`
72
- `).filter(Boolean).pop()??`thinking…`,a=r.summary.lastElementChild;a.textContent=i.length>90?`…`+i.slice(-90):i}var Aa=0;function ja(e,t=0,n=!1,r){let i=Date.now()-t,a=ba(i).el;for(let t of e){if(t.kind===`thinking`){ka(i,t.text??``);continue}let e=t.id??`replay-${++Aa}`;Da(i,e,t.toolName??``,t.args),t.done&&Oa(e,t.isError??!1,t.output??``)}r!==void 0&&e.some(e=>e.kind===`tool`&&e.args===void 0)&&Ma(a,r),!n&&wa(e.some(e=>e.kind===`tool`&&!e.done)?`interrupted`:`done`)}function Ma(e,t){let n=()=>{e.open&&(e.removeEventListener(`toggle`,n),Na(e,t))};e.addEventListener(`toggle`,n)}async function Na(e,t){let n=$i.sessionId(),r=da(e),i=new Set(r.filter(e=>!e.argsPre.textContent)),a=e=>{for(let t of i)t.argsPre.textContent=e};if(a(`loading…`),!n)return a(`no session`);let o=await E(`/api/sessions/${n}/turns/${t}/steps`,`could not load these steps`);if(!o.ok)return a(o.error);let s=o.value.steps.filter(e=>e.kind===`tool`);for(let[e,t]of r.entries()){if(!i.has(t))continue;let n=s[e];if(!(n&&(n.id?n.id===t.call:n.toolName===t.tool))){t.argsPre.textContent=`detail no longer available — reload the session`;continue}let r=JSON.stringify(n.args,null,2)??``;t.argsPre.textContent=r,t.preview.textContent=Ea(r),n.output&&(t.outputPre.textContent=n.output,t.outputPre.classList.remove(`hidden`))}}var Pa,X=G(`#turns`);function Fa(e){Pa=e,ta(e,{el:X,append:Z,scroll:Ha,bulk:()=>Ia})}var Ia=!1,La=()=>X.scrollHeight-X.scrollTop-X.clientHeight<80,Ra=!0;X.addEventListener(`scroll`,()=>{Ia||(Ra=La())},{passive:!0});var za=0;function Ba(){!Ra||Ia||za||(za=requestAnimationFrame(()=>{za=0,Ra&&!Ia&&(X.scrollTop=X.scrollHeight)}))}new ResizeObserver(Ba).observe(X),X.addEventListener(`load`,Ba,!0),new MutationObserver(Ba).observe(X,{childList:!0,subtree:!0,characterData:!0});function Va(){La()&&(Ra=!0)}function Ha(e=!1){Ia||(e&&(Ra=!0),Ra&&(X.scrollTop=X.scrollHeight))}var Ua=500,Wa=0,Ga=0,Ka=null;function qa(){for(;X.childElementCount>Ua;){let e=X.firstElementChild;e.remove(),e!==Ka&&(e.dataset.kind===`user`&&Wa++,Ga++)}Ga&&(Ka||(Ka=K(`div`,`px-5 py-2 text-center text-[11.5px] italic text-neutral-400`),Ka.dataset.kind=`trim`),Ka.textContent=`${Ga} earlier row${Ga===1?``:`s`} not shown — still in the transcript, not on this screen`,X.firstElementChild!==Ka&&X.prepend(Ka))}var Ja={user:{row:`border-l-indigo-500 bg-indigo-50`,body:`text-neutral-900`},assistant:{row:`border-l-transparent`,body:`text-neutral-900`},error:{row:`border-l-red-400 bg-red-50`,body:`text-red-700`},system:{row:`border-l-cyan-500 bg-cyan-50`,body:`text-neutral-800`}};function Z(e,t,n=!1,r){fa();let i=e===`assistant`?ha():null,a=Ja[e],o=K(`div`,`group relative border-l-2 px-5 ${X.lastElementChild?.dataset.kind===e?`pt-1 pb-2.5`:`mt-1.5 py-2.5`} ${a.row}`);o.dataset.kind=e;let s=e===`user`?ti(t):null,c=s?.text??t,l=e===`user`?x(c):null,u=l?.id||l?.when?l:null,d=u&&(u.id===`web`?u.when?{when:u.when}:null:u),f=K(`div`,`whitespace-pre-wrap break-words ${a.body}`,u?.text??c);(s?.paths.length||u)&&(f.dataset.raw=t),n&&fo(f,t),i&&(o.classList.add(`flow-root`),o.append(i)),d&&o.append(Ya(d)),o.append(f);let p=Pa.sessionId();if(s?.paths.length&&p){let e=Nr(o);for(let t of s.paths)e.append(Kr(p,t))}if(e===`user`){let e=K(`button`,`absolute right-2 top-1 hidden h-6 w-6 items-center justify-center rounded text-neutral-400 hover:bg-neutral-200 hover:text-neutral-700 group-hover:flex pointer-coarse:flex`);e.title=`Edit — resends from here; this message and later turns leave the context`,e.setAttribute(`aria-label`,`Edit message`),e.innerHTML=`<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="h-3.5 w-3.5"><path d="m10.7 2.3 3 3L6 13H3v-3l7.7-7.7zM9.3 3.7l3 3"/></svg>`,e.onclick=()=>Za(o,f),o.append(e)}return io(r),X.append(o),qa(),Ha(),f}function Ya(e){let t=K(`div`,`mb-1 flex items-baseline gap-2 text-[11.5px] leading-tight`),n=e.name??e.id;if(n){let r=K(`span`,`font-semibold text-indigo-700`,n);e.id&&(r.title=e.id),t.append(r)}return e.when&&t.append(K(`span`,`text-neutral-400`,e.when)),t}function Xa(e,t,n){let r=t.kind===`task-callback`?`Task callback`:t.kind===`task-message`?t.messageKind===`decision`?`Decision needed`:`Task ${t.messageKind.replace(`_`,` `)}`:`Agent task input`;fa();let i=K(`div`,`group relative mt-1.5 border-l-2 border-l-cyan-500 bg-cyan-50 px-5 py-2.5`);i.dataset.kind=`system`;let a=K(`div`,`mb-1 flex flex-wrap items-center gap-x-2 gap-y-1 text-[11px] font-semibold uppercase text-cyan-800`,K(`span`,`flex-none`,r)),o=t.source;if(o&&a.append(K(`span`,`min-w-0 truncate font-medium normal-case text-cyan-700`,o.taskName)),t.sourceSessionId&&t.sourceSessionId!==`console`){let e=K(`button`,`truncate font-mono normal-case text-cyan-700 hover:underline`,t.sourceSessionId.slice(0,12));e.title=`Open source session`,e.onclick=()=>Pa.select(t.sourceSessionId),a.append(K(`span`,`text-cyan-400`,`from`),e)}if(o?.model){let e=K(`span`,`flex-none rounded bg-cyan-100 px-1.5 py-px font-mono font-medium normal-case text-cyan-800`,o.model.id);e.title=`${o.model.provider} / ${o.model.id}`,a.append(e)}if(o?.thinking){let e=K(`span`,`flex-none font-mono font-normal normal-case text-cyan-600`,o.thinking);e.title=`Reasoning effort`,a.append(e)}let s=K(`button`,`ml-auto flex-none font-mono normal-case text-cyan-700 hover:underline`,`run ${t.runId.slice(0,8)}`);s.onclick=()=>Pa.showTasks(t.taskId),a.append(s),t.kind===`task-message`&&t.messageKind===`decision`&&a.append(sa(t.messageId));let c=[`max-h-[min(18rem,40dvh)]`,`overflow-hidden`],l=K(`div`,`whitespace-pre-wrap break-words text-[14px] text-neutral-800 ${c.join(` `)}`,e);i.append(a,l),io(n),X.append(i);let u=e.length>800||e.split(`
73
- `).length>12;if(l.clientHeight?l.scrollHeight>l.clientHeight+1:u){let e=K(`button`,`mx-auto mt-1.5 block w-fit rounded border border-cyan-200 bg-white px-2 py-1 text-[12px] font-medium text-cyan-800 shadow-sm hover:bg-cyan-100 pointer-coarse:py-3.5`,`Show full message`);e.setAttribute(`type`,`button`),e.onclick=()=>{let t=l.classList.toggle(c[0]);l.classList.toggle(c[1],t),e.textContent=t?`Show full message`:`Collapse message`,l.tabIndex=-1,l.focus({preventScroll:!0})},i.append(e)}else l.classList.remove(...c);qa(),Ha()}function Za(e,t){if(Pa.sessionState()!==`idle`){Z(`error`,`can't edit while streaming — stop the turn first`);return}if(e.querySelector(`textarea`))return;let n=document.createElement(`textarea`);n.value=t.dataset.raw??t.textContent??``,n.className=`block w-full resize-none rounded-md border border-indigo-300 bg-white px-2 py-1 focus:outline-none`;let r=()=>{n.style.height=`auto`,n.style.height=`${Math.min(n.scrollHeight,192)}px`};n.oninput=r,t.classList.add(`hidden`),t.after(n),r(),n.focus(),n.setSelectionRange(n.value.length,n.value.length);let i=()=>{n.remove(),t.classList.remove(`hidden`)};n.onkeydown=t=>{if(!(t.isComposing||t.keyCode===229)&&(t.key===`Escape`&&i(),t.key===`Enter`&&!t.shiftKey)){t.preventDefault();let r=n.value.trim();if(!r)return i();Qa(e,r)}}}async function Qa(e,t){let n=Pa.sessionId();if(!n)return;let r=Wa+[...X.querySelectorAll(`[data-kind="user"]`)].indexOf(e);for(;e.nextElementSibling;)e.nextElementSibling.remove();e.remove(),Pa.ownTurn(t),Z(`user`,t,!1,Date.now()),Ha(!0);let i=await w(`/api/sessions/${n}/turns/${r}/edit`,{text:t});if(!i.ok){let e=await T(i,`edit failed`);await Pa.reload(n),Z(`error`,e)}}var $a=e=>new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,hour12:!1}),eo=6e5,to=null,no=(e,t)=>new Date(e).toDateString()===new Date(t).toDateString();function ro(e){return no(e,Date.now())?$a(e):`${new Date(e).toLocaleDateString([],{month:`short`,day:`numeric`})} · ${$a(e)}`}function io(e){if(e===void 0)return;let t=to;if(to=e,t!==null&&e-t<eo&&no(t,e))return;let n=K(`div`,`px-5 pb-0.5 pt-3 text-center text-[11px] text-neutral-400`,ro(e));n.dataset.kind=`time`,X.append(n)}var ao=null,oo=0,so;function co(){if(!ao?.isConnected){clearInterval(so),so=void 0,ao=null;return}ao.textContent=`${er(oo)} · ${Qn(oo)}`}function lo(e,t){t&&(ao?.remove(),oo=t.completedAt,ao=K(`div`,`mt-1 font-mono text-[11px] text-neutral-400`),(e.parentElement??e).append(ao),co(),so??=setInterval(co,6e4))}function uo(e){for(let t of e.querySelectorAll(`pre`)){let e=t.querySelector(`code`);if(!e)continue;let n=K(`div`,`group/code relative`);t.replaceWith(n),n.append(t,or(`absolute right-1.5 top-1.5 cursor-pointer rounded border border-black/[0.08] bg-white/85 px-1.5 py-0.5 text-[11px] text-neutral-500 opacity-0 transition-opacity hover:bg-white hover:text-neutral-800 focus:opacity-100 group-hover/code:opacity-100 pointer-coarse:opacity-100 dark:border-neutral-200`,()=>e.textContent??``))}}function fo(e,t,n=!1){let r=Pa.sessionId(),i=r?Wr(t,r):t;e.innerHTML=V.sanitize(W.parse(i,{async:!1})),e.classList.remove(`whitespace-pre-wrap`),e.classList.add(`md`),ir(e),!n&&(Ui(e),uo(e),Qr(e))}function po(e,t,n,r=!1){let{text:i,suggestions:a}=y(t);return d({text:i,suggestions:a})?mo(e,v(t)):fo(e,i),r&&Xi(e.parentElement??e,a,e=>Pa.send(`auto`,e)),lo(e,n),e}function mo(e,t){e.classList.remove(`md`,`whitespace-pre-wrap`),e.replaceChildren(K(`span`,`text-[12.5px] italic text-neutral-400`,t?`Stayed silent — ${t}`:`Stayed silent.`))}var ho=(e,t,n=!1)=>po(Z(`assistant`,``,!1,t&&t.completedAt-t.durationMs),e,t,n),go=null,_o=null,vo=!1,yo=80;function bo(){if(_o){vo=!0;return}vo=!1,go&&(fo(go,y(go.dataset.raw??``).text,!0),Ha()),_o=setTimeout(()=>{_o=null,vo&&bo()},yo)}function xo(){_o&&clearTimeout(_o),_o=null,vo=!1}function So(e){go||=Z(`assistant`,``),go.dataset.raw=(go.dataset.raw??``)+e,bo()}function Co(e=!1,t){if(!go)return;let n=go;go=null,xo(),po(n,n.dataset.raw??``,t,e)}function wo(e,t){if(wa(`done`),go){e&&(go.dataset.raw=e),Co(!0,t);return}e&&ho(e,t,!0)}function To(){wa(`interrupted`),Co()}function Eo(){X.replaceChildren(),Wa=0,Ga=0,Ka=null,to=null,ao=null,go=null,xo(),ma(),Yi()}function Do(e){if(!e){X.querySelector(`[data-kind="loading"]`)?.remove();return}let t=K(`div`,`flex flex-col gap-3 px-5 py-4`);t.dataset.kind=`loading`;for(let e of[`w-2/5`,`w-4/5`,`w-3/5`,`w-1/3`,`w-2/3`])t.append(K(`div`,`skeleton h-3.5 ${e}`));X.append(t)}function Oo(e,t,n){Do(!1);let r=new Map(n.map(e=>[e.runId,e])),i=e=>[...r].filter(([,t])=>t.queuedAt<=e).map(([e])=>e),a=e=>{for(let t of e){let e=r.get(t);e&&(ca(e),r.delete(t))}},o=e.reduce((e,t,n)=>t.role===`assistant`?n:e,-1);Ia=!0;try{for(let[n,r]of e.entries()){let s=t===`streaming`&&n===e.length-1&&(!r.text||(r.steps?.some(e=>e.kind===`tool`&&!e.done)??!1)),c=r.steps;if(c?.length&&(ja(c,r.meta?.durationMs,s,n),r.meta&&a(i(r.meta.completedAt))),r.text){if(r.role===`system`&&r.origin){a(r.origin.kind===`task-message`?[r.origin.runId]:r.origin.runIds??[r.origin.runId]),Xa(r.text,r.origin,r.at);continue}r.role===`assistant`?ho(r.text,r.meta,t===`idle`&&n===o):Z(r.role,r.text,!1,r.at)}}for(let e of r.values())ca(e)}finally{Ia=!1}Ha(!0)}var ko=window.fetch.bind(window),Ao=20,jo=6e4,Mo=[],No=new Map,Po=e=>e instanceof Error?e.stack??`${e.name}: ${e.message}`:void 0;function Fo(e,t){let n=t===void 0?e:`${e}: ${String(t)}`,r=Date.now();return r-(No.get(n)??-6e4)<jo||(No.size>100&&No.clear(),No.set(n,r),Mo=Mo.filter(e=>r-e<6e4),Mo.length>=Ao)?null:(Mo.push(r),ko(`/api/client-log`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({message:n,stack:Po(t),view:location.hash||`/`}),keepalive:!0}).catch(()=>{}),Z(`error`,n))}function Io(){window.__pierReporting=!0,window.addEventListener(`error`,e=>{Fo(`script error: ${e.message}`,e.error)}),window.addEventListener(`unhandledrejection`,e=>{Fo(`unhandled rejection`,e.reason)})}var Lo=window.fetch.bind(window),Ro=()=>{location.assign(`/login?next=${encodeURIComponent(location.pathname+location.hash)}`)};function zo(){window.fetch=async(...e)=>{let t=await Lo(...e);return t.status===401&&Ro(),t}}function Bo(e,t){if(e.readyState!==EventSource.CLOSED)return;let n=()=>{let e=Fo(`${t} stream disconnected`);if(!e)return;let n=q(`Reload`);n.classList.add(`ml-2`,`align-middle`),n.onclick=()=>location.reload(),e.append(` `,n)};Lo(`/api/projects`).then(e=>e.status===401?Ro():n(),n)}var Vo=/Mac|iP(?:hone|ad|od)/.test(navigator.userAgent),Ho=Vo?`⌘`:`Ctrl+`,Uo=Vo?`⇧`:`Shift+`,Wo=e=>{let t=e.startsWith(`meta+`),n=t?e.slice(5):e;return n.startsWith(`shift+`)?{key:n.slice(6),shift:!0,meta:t}:{key:n,shift:!1,meta:t}};function Go(e){let{key:t,shift:n,meta:r}=Wo(e);return`${r?`⌘`:Ho}${n?Uo:``}${t.toUpperCase()}`}var Ko=`pointer-events-none fixed z-50 flex items-center gap-2 whitespace-nowrap rounded-md bg-neutral-800 px-2 py-1 text-[11.5px] text-neutral-100 shadow-lg`;function qo(e,t,n){e.removeAttribute(`title`);let r=null,i=()=>{r?.remove(),r=null,document.removeEventListener(`keydown`,i,!0)};e.addEventListener(`pointerenter`,a=>{if(a.pointerType!==`mouse`)return;i(),r=K(`div`,Ko,t,K(`kbd`,`rounded bg-white/15 px-1 py-px font-sans text-[10.5px]`,n)),document.body.append(r);let o=e.getBoundingClientRect(),s=o.bottom+6,c=s+r.offsetHeight+8<=window.innerHeight;r.style.top=`${c?s:Math.max(8,o.top-r.offsetHeight-6)}px`,r.style.left=`${Math.max(8,Math.min(o.left,window.innerWidth-r.offsetWidth-8))}px`,document.addEventListener(`keydown`,i,!0)}),e.addEventListener(`pointerleave`,i),e.addEventListener(`pointerdown`,i)}function Jo(e,t,n,r,i){qo(e,n,Go(t)),Qo(t,r,i)}function Yo(e,t,n,r){qo(e,t,`Esc`),document.addEventListener(`keydown`,e=>{e.key!==`Escape`||e.isComposing||e.defaultPrevented||document.querySelector(`dialog[open]`)||!r()||(e.preventDefault(),n())})}var Xo=`input, textarea, select, [contenteditable]`;function Zo(e,t,n,r,i){qo(e,n,t[0].toUpperCase()),document.addEventListener(`keydown`,e=>{e.metaKey||e.ctrlKey||e.altKey||e.isComposing||e.defaultPrevented||!e.key||!t.includes(e.key.toLowerCase())||e.target?.closest?.(Xo)||document.querySelector(`dialog[open]`)||!i()||(e.preventDefault(),r())})}function Qo(e,t,n){let{key:r,shift:i,meta:a}=Wo(e);document.addEventListener(`keydown`,e=>{!e.key||e.key.toLowerCase()!==r||e.altKey||e.shiftKey!==i||(a?!e.metaKey:!e.metaKey&&!e.ctrlKey)||!e.metaKey&&e.target?.closest?.(`[data-owns-keyboard]`)||n?.()||(e.preventDefault(),e.stopPropagation(),t())},!0)}var $o,es=G(`#composer`),Q=G(`#input`),ts=G(`#send`),ns=G(`#send-plane`),rs=G(`#send-queue`),is=G(`#stop`),as=G(`#queue-panel`),os=G(`#queue-rows`),ss=G(`#queue-label`),cs=G(`#image-strip`),ls=G(`#attach-input`),us=!1,ds=[],fs=[];function ps(){let e=window.visualViewport;if(!e)return;let t=()=>{let t=e.scale<=1.05&&window.innerHeight-e.height-e.offsetTop>80;t?document.body.dataset.kb=``:delete document.body.dataset.kb,document.body.style.height=t?`${String(e.height)}px`:``,t&&window.scrollY&&window.scrollTo(0,0)};e.addEventListener(`resize`,t),e.addEventListener(`scroll`,t)}function ms(){Q.focus()}function hs(e){let t=fs.indexOf(e);return t<0?!1:(fs.splice(t,1),!0)}function gs(e){fs.push(e)}function _s(){fs=[]}function vs(){let e=$o.sessionState()===`streaming`;ts.className=`flex h-7 w-7 flex-none cursor-pointer items-center justify-center rounded-lg ${e?`bg-amber-100 text-amber-700 hover:bg-amber-200 active:bg-amber-300`:`bg-indigo-600 text-white hover:bg-indigo-500 active:bg-indigo-700 dark:text-neutral-50`}`,ts.title=e?`Queue — delivered when the turn ends`:`Send`,ns.classList.toggle(`hidden`,e),rs.classList.toggle(`hidden`,!e),is.classList.toggle(`hidden`,!e),is.classList.toggle(`flex`,e)}function ys(){let e=$o.chatVisible()&&us;as.classList.toggle(`hidden`,!e),as.classList.toggle(`flex`,e)}function bs(e,t){let n=[...e.map(e=>({mode:`steer`,text:e})),...t.map(e=>({mode:`queued`,text:e}))];us=n.length>0,ss.textContent=n.length>1?`Queued · ${n.length}`:`Queued`,ys(),os.replaceChildren(...n.map(e=>{let t=K(`li`,`flex items-start gap-2 text-[13px] leading-[18px]`);return e.mode===`steer`&&t.append(K(`span`,`flex-none rounded bg-indigo-100 px-1 py-0.5 text-[10.5px] font-semibold uppercase tracking-wide text-indigo-700`,e.mode)),t.append(K(`span`,`min-w-0 whitespace-pre-wrap break-words text-neutral-700`,e.text)),t}))}var xs=8;function Ss(){cs.classList.toggle(`hidden`,ds.length===0),cs.classList.toggle(`flex`,ds.length>0),cs.replaceChildren(...ds.map((e,t)=>{let n=e.mimeType.startsWith(`image/`)?Pr(`data:${e.mimeType};base64,${e.data}`):K(`span`,`flex h-16 max-w-40 items-center truncate rounded-md border border-neutral-200 bg-neutral-50 px-2 text-[12px] text-neutral-700`,e.name??`file`),r=K(`button`,`absolute -right-1.5 -top-1.5 h-4 w-4 cursor-pointer rounded-full bg-neutral-700 text-[10px] leading-none text-white hover:bg-red-600`,`×`);return r.onclick=()=>{ds.splice(t,1),Ss()},K(`div`,`relative`,n,r)}))}function Cs(e){if(ds.length>=xs){Z(`error`,`attachment limit is ${xs} files per message`);return}if(e.size>33554432){Z(`error`,`${e.name||`file`} is too large (32MB max)`);return}let t=new FileReader;t.onload=()=>{let n=t.result;ds.push({data:n.slice(n.indexOf(`,`)+1),mimeType:e.type||`application/octet-stream`,name:e.name||void 0}),Ss()},t.readAsDataURL(e)}async function ws(e){let t=[];for(let n of e){let e=await w(`/api/inbox`,n);if(!e.ok)return null;let{path:r}=await e.json();t.push($r(r))}return t}var Ts=e=>`pier.draft.${e}`;function Es(){let e=$o.sessionId();e&&(Q.value.trim()?localStorage.setItem(Ts(e),Q.value):localStorage.removeItem(Ts(e)))}function Ds(e){Q.value=localStorage.getItem(Ts(e))??``,Os(),ds=[],Ss()}function Os(){Q.style.height=`auto`,Q.style.height=`${Math.min(Q.scrollHeight,192)}px`}var ks=!1;async function As(e,t){let n=(t??Q.value).trim(),r=t===void 0?ds:[],i=$o.sessionId();if(!(!n&&r.length===0||!i)){if(t===void 0){if(ks)return;ks=!0,Q.value=``,Os(),Es(),ds=[],Ss()}try{let t=[];if(r.length){let e=await ws(r);if(e===null){Z(`error`,`attachment upload failed`),Q.value=[n,Q.value.trim()].filter(Boolean).join(`
74
- `),Os(),Es(),ds=r,Ss();return}t=e}let a=[n,...t].filter(Boolean).join(`
75
- `),o=$o.sessionState()===`idle`&&e===`auto`;o?$o.setState(`streaming`):vs(),(o||e===`steer`)&&(gs(a),Z(`user`,a,!1,Date.now()),Ha(!0));let s=await w(`/api/sessions/${i}/messages`,{text:a,mode:e});if(!s.ok){let e=await T(s,`send failed`);await $o.reload(i),Z(`error`,e)}}finally{t===void 0&&(ks=!1)}}}async function js(e){let t=$o.sessionId();if(!t)return;bs([],[]);let n=await w(`/api/sessions/${t}/queue/deliver`,{mode:e});n.ok||Z(`error`,`queue ${e} failed: ${n.status}`)}async function Ms(){let e=$o.sessionId();if(!e)return;let t=await fetch(`/api/sessions/${e}/queue/recall`,{method:`POST`});if(!t.ok)return;let{messages:n}=await t.json();n.length&&(Q.value=[Q.value.trim(),...n].filter(Boolean).join(`
76
- `),Os(),Es(),Q.focus()),bs([],[])}function Ns(e){$o=e,ps();let t=()=>{let e=$o.sessionId();e&&fetch(`/api/sessions/${e}/abort`,{method:`POST`})};is.onclick=t,Yo(is,`Stop the running turn`,t,()=>$o.sessionState()===`streaming`&&$o.chatVisible()),G(`#queue-steer`).onclick=()=>void js(`steer`),G(`#queue-restart`).onclick=()=>void js(`restart`),G(`#queue-recall`).onclick=()=>void Ms(),es.onsubmit=e=>{e.preventDefault(),As(`auto`)},Zo(Q,[`/`],`Write a message`,ms,$o.chatVisible),Q.onfocus=Va,Q.oninput=()=>{Os(),Es()};let n=!matchMedia(`(pointer: coarse)`).matches;Q.onkeydown=e=>{e.isComposing||e.keyCode===229||n&&e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),As(`auto`))},Q.onpaste=e=>{for(let t of e.clipboardData?.items??[]){let e=t.kind===`file`?t.getAsFile():null;e&&Cs(e)}let t=e.clipboardData?.getData(`text/plain`)??``,n=t.trim();!n||n===t||(e.preventDefault(),Q.setRangeText(n,Q.selectionStart??0,Q.selectionEnd??0,`end`),Os(),Es())},X.ondragover=e=>e.preventDefault(),X.ondrop=e=>{e.preventDefault();for(let t of e.dataTransfer?.files??[])Cs(t)},G(`#attach`).onclick=()=>ls.click(),ls.onchange=()=>{for(let e of ls.files??[])Cs(e);ls.value=``},vs()}var Ps=`pier.push`,Fs=`/sw.js`,Is=()=>/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.maxTouchPoints>1&&/Macintosh/.test(navigator.userAgent),Ls=()=>matchMedia(`(display-mode: standalone)`).matches||navigator.standalone===!0;function Rs(){return window.isSecureContext?Is()&&!Ls()?`On iPhone and iPad, notifications work only from the installed app: Share → Add to Home Screen, then open Pier from that icon.`:!(`serviceWorker`in navigator)||!(`PushManager`in window)||!(`Notification`in window)?`This browser has no Web Push support.`:``:`Notifications need HTTPS. Reach this Pier through its public URL, not over plain http.`}var zs=[[/iPhone/,`iPhone`],[/iPad/,`iPad`],[/Android/,`Android`],[/Macintosh/,`Mac`],[/Windows/,`Windows`]],Bs=[[/Edg\//,`Edge`],[/Chrome\//,`Chrome`],[/Firefox\//,`Firefox`],[/Safari\//,`Safari`]];function Vs(){let e=navigator.userAgent,t=(t,n)=>t.find(([t])=>t.test(e))?.[1]??n;return`${t(zs,`Linux`)} · ${t(Bs,`browser`)}${Ls()?` (installed)`:``}`}var Hs=e=>{let t=atob(e.replace(/-/g,`+`).replace(/_/g,`/`)),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n},Us=null;async function Ws(){return!(`serviceWorker`in navigator)||!window.isSecureContext?null:(Us??=await navigator.serviceWorker.register(Fs,{scope:`/`}).catch(e=>(console.warn(`service worker registration failed`,e),null)),Us)}var Gs=(e,t)=>{let n=e?new Uint8Array(e):null;return n?.length===t.length&&n.every((e,n)=>e===t[n])};async function Ks(e){let{publicKey:t}=await D(`/api/push`,`Could not read this instance's push key`),n=Hs(t),r=await e.pushManager.getSubscription();if(r){if(Gs(r.options.applicationServerKey,n))return r;await r.unsubscribe()}return e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:n})}async function qs(e){return w(`/api/push/subscribe`,{...e.toJSON(),label:Vs()})}async function Js(){Zs();let e=await Ws();if(!(!e||localStorage.getItem(Ps)!==`on`)&&!(!(`Notification`in window)||Notification.permission!==`granted`))try{await qs(await Ks(e))}catch(e){console.warn(`re-registering this browser for notifications failed`,e)}}var Ys=null,Xs=null;function Zs(){window.addEventListener(`beforeinstallprompt`,e=>{e.preventDefault(),Ys=e,Xs?.()}),window.addEventListener(`appinstalled`,()=>{Ys=null,Xs?.()})}function Qs(e){let t=navigator;(e>0?t.setAppBadge?.(e):t.clearAppBadge?.())?.catch(()=>{})}function $s(){let e=K(`span`,`text-[11.5px]`,``),t=q(`Send a test notification`),n=K(`div`,`flex items-center gap-3`,t,e),r=K(`div`,`flex flex-col gap-4`),i=()=>localStorage.getItem(Ps)===`on`;async function a(){Y(e,`saving`,`asking this browser…`);let t=await Notification.requestPermission();if(t!==`granted`)return localStorage.setItem(Ps,`off`),c(),Y(e,`failed`,t===`denied`?`Notifications are blocked for this site — allow them in the browser's site settings, then try again.`:`No answer to the permission prompt.`);let n=await Ws();if(!n)return Y(e,`failed`,`This browser refused to register a service worker.`);try{let t=await qs(await Ks(n));if(!t.ok)return Y(e,`failed`,await T(t,`Could not register this browser`));localStorage.setItem(Ps,`on`),c(),Y(e,`saved`,`This browser will be notified when a turn finishes unseen.`)}catch(t){Y(e,`failed`,`Could not subscribe: ${String(t)}`)}}async function o(){localStorage.setItem(Ps,`off`),c();let t=await(await Ws())?.pushManager.getSubscription();t&&(await w(`/api/push/unsubscribe`,{endpoint:t.endpoint}),await t.unsubscribe()),Y(e,`idle`,`This browser will not be notified.`)}t.onclick=()=>{Y(e,`saving`,`sending…`),(async()=>{let t=await w(`/api/push/test`,{});if(!t.ok)return Y(e,`failed`,await T(t,`Could not send`));let{sent:n,failed:r}=await t.json();Y(e,r?`failed`:`saved`,`Handed ${String(n)} device(s) to their push service${r?`, ${String(r)} refused`:``}.`)})()};function s(){if(!Ys)return[];let e=q(`Install Pier`,!0);return e.onclick=()=>{let e=Ys;e&&e.prompt().then(()=>e.userChoice).finally(()=>{Ys=null,c()})},[K(`div`,`flex items-center gap-3`,e,K(`span`,`text-[11.5px] leading-snug text-neutral-500`,`Its own window and icon — and where notifications look like an app's.`))]}function c(){let e=Rs();if(e){r.replaceChildren(...s(),K(`p`,`text-[12.5px] leading-snug text-neutral-500`,e));return}let c=i()&&Notification.permission===`granted`;t.disabled=!c,r.replaceChildren(...s(),vr(`Notify this device`,`A turn that finishes while nobody is looking at it becomes a notification here. Per browser — each device is enabled on its own.`,c,e=>void(e?a():o())),n)}return Xs=c,c(),fr(`Notifications`,`Web Push, so a finished turn reaches you with the workbench closed. Installed — Chrome's address-bar icon, or Share → Add to Home Screen on iOS — Pier notifies you the way an app does.`,r)}var ec=null;function tc(e){ec&&!ec.contains(e.target)&&$()}function nc(e){e.key===`Escape`&&(e.preventDefault(),e.stopPropagation(),$())}function rc(e){ec&&!ec.contains(e.target)&&$()}function $(){ec&&=(document.removeEventListener(`pointerdown`,tc,!0),document.removeEventListener(`keydown`,nc,!0),window.removeEventListener(`scroll`,rc,!0),window.removeEventListener(`resize`,$),ec.remove(),null)}var ic=null;function ac(e){let t=e.getBoundingClientRect(),n={top:t.bottom+4,left:t.left};return t.width||t.height?n:ic?.anchor===e?{top:ic.top,left:ic.left}:n}var oc=()=>window.innerWidth<640;function sc(e,t){$();let n=oc();if(ec=K(`div`,`fixed z-50 rounded-lg border border-neutral-200 bg-white py-1 shadow-lg ${n?`inset-x-2 bottom-2 max-h-[70dvh] overflow-y-auto pb-[calc(0.25rem+env(safe-area-inset-bottom))] text-[16px]`:`min-w-52 max-w-[min(42rem,calc(100vw-1rem))] text-[13px]`}`),ec.append(t),(e.closest(`dialog[open]`)??document.body).append(ec),!n){let t=ac(e);ic={anchor:e,...t},ec.style.top=`${Math.max(8,Math.min(t.top,window.innerHeight-ec.offsetHeight-8))}px`,ec.style.left=`${Math.max(8,Math.min(t.left,window.innerWidth-ec.offsetWidth-8))}px`}document.addEventListener(`pointerdown`,tc,!0),document.addEventListener(`keydown`,nc,!0),window.addEventListener(`scroll`,rc,!0),window.addEventListener(`resize`,$)}function cc(e){let t=K(`button`,`flex w-full cursor-pointer items-center gap-2 px-3 text-left hover:bg-neutral-100 active:bg-neutral-100 ${oc()?`py-3`:`py-1.5`}`,K(`span`,`flex-none w-3 text-indigo-600`,e.checked?`✓`:``),K(`span`,`truncate`,e.label));return e.hint&&t.append(K(`span`,`ml-auto flex-none text-[11.5px] text-neutral-400`,e.hint)),t.onclick=()=>e.onSelect(),t}function lc(e,t){sc(e,K(`div`,``,...t.map(cc)))}var uc=e=>`${e.provider}/${e.id}`,dc=`pier.modelFavorites`,fc=e=>`${uc(e)}@${e.thinking}`,pc=null;async function mc(){let{modelMenu:e}=await D(`/api/settings`,`Could not read the pinned model menu`);return e}function hc(){try{let e=JSON.parse(localStorage.getItem(dc)??`[]`);return Array.isArray(e)?e.filter(e=>{let t=e;return!!t&&typeof t==`object`&&typeof t.provider==`string`&&typeof t.id==`string`&&typeof t.thinking==`string`}):[]}catch{return[]}}function gc(e){let t=K(`button`,`flex min-w-0 flex-1 cursor-pointer items-center gap-2 px-3 py-1.5 text-left`,K(`span`,`w-3 flex-none text-indigo-600`,e.checked?`✓`:``),K(`span`,`truncate`,e.label));e.hint&&t.append(K(`span`,`ml-auto flex-none text-[11.5px] text-neutral-400`,e.hint)),e.title&&(t.title=e.title),t.onclick=()=>e.onSelect();let n=K(`button`,`flex-none cursor-pointer px-2 py-1.5 leading-none ${e.starred?`text-amber-500`:`text-neutral-300 opacity-0 hover:text-amber-500 group-hover/row:opacity-100`}`,e.starred?`★`:`☆`);return n.title=e.starred?`Unstar`:`Star this model + reasoning`,n.onclick=t=>{t.stopPropagation(),e.onStar()},K(`div`,`group/row flex w-full items-center hover:bg-neutral-100`,t,n)}function _c({models:e,current:t,thinkingLevel:n,thinkingLevels:r,onPick:i,onThinkingPick:a}){let o=hc(),s=n,c=K(`div`,`flex w-72 flex-col`),l=K(`div`,`flex flex-col gap-2 border-b border-neutral-200 px-2 py-2`),u=document.createElement(`input`);if(u.type=`search`,u.placeholder=`Search models`,u.setAttribute(`aria-label`,`Search models`),u.className=`w-full rounded-md border border-neutral-300 px-2 py-1.5 text-[12.5px] focus:border-indigo-400 focus:outline-none`,l.append(u),r.length){let e=K(`label`,`flex items-center gap-2 px-1 text-[12px] text-neutral-500`),t=document.createElement(`select`);t.className=`select ml-auto rounded-md border border-neutral-300 px-2 py-1 text-[12px] text-neutral-700 focus:border-indigo-400 focus:outline-none`,t.setAttribute(`aria-label`,`Reasoning level`);for(let e of r){let n=document.createElement(`option`);n.value=e,n.textContent=f(e),t.append(n)}t.value=n,t.onchange=()=>{s=t.value,_(u.value),a(s)},e.append(K(`span`,`font-medium`,`Reasoning`),t),l.append(e)}let d=e=>{let t=fc(e);o=o.some(e=>fc(e)===t)?o.filter(e=>fc(e)!==t):[...o,e],localStorage.setItem(dc,JSON.stringify(o)),_(u.value)},p=(e,t)=>o.some(n=>fc(n)===`${uc(e)}@${t}`),m=K(`div`,`max-h-72 overflow-y-auto py-1`),h=new Map(e.map(e=>[uc(e),e])),g=(e,n,r)=>{let a=n.map(e=>({e,model:h.get(uc(e))})).filter(e=>!!e.model&&(!r||uc(e.model).toLowerCase().includes(r)));a.length&&m.append(K(`div`,`px-3 pb-0.5 pt-1 text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,e),...a.map(({e,model:n})=>{let r=e.thinking??s;return gc({label:n.id,hint:e.thinking?f(e.thinking):void 0,title:e.note,checked:!!t&&uc(t)===uc(n)&&s===r,starred:p(n,r),onSelect:()=>i(n,e.thinking),onStar:()=>d({provider:n.provider,id:n.id,thinking:r})})}),K(`div`,`my-1 border-t border-neutral-100`))},_=n=>{m.replaceChildren();let r=n.trim().toLowerCase();g(`Pinned`,pc??[],r),g(`Starred`,o,r);let a=new Map;for(let t of e){if(r&&!uc(t).toLowerCase().includes(r))continue;let e=a.get(t.provider);e?e.push(t):a.set(t.provider,[t])}if(!a.size){m.append(K(`div`,`px-3 py-2 text-[12.5px] text-neutral-400`,e.length?`No matching models.`:`No models available.`));return}for(let[e,n]of a){let a=n.some(e=>!!t&&uc(t)===uc(e)),o=document.createElement(`details`);o.open=a||r.length>0;let c=K(`summary`,`flex cursor-pointer select-none items-center gap-1.5 px-3 py-1 text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400 hover:bg-neutral-100`,K(`span`,`chev`,`▶`),K(`span`,`truncate`,e),K(`span`,`ml-auto flex-none normal-case text-neutral-300`,String(n.length)));o.append(c,...n.map(e=>gc({label:e.id,checked:!!t&&uc(t)===uc(e),starred:p(e,s),onSelect:()=>i(e),onStar:()=>d({provider:e.provider,id:e.id,thinking:s})}))),m.append(o)}};return u.oninput=()=>_(u.value),_(``),mc().then(e=>{let t=JSON.stringify(e)!==JSON.stringify(pc);pc=e,t&&_(u.value)}).catch(e=>Fo(`model menu unavailable`,e)),c.append(l,m),queueMicrotask(()=>u.focus()),c}function vc(e,t,n,r){let i=lr(t.model?`${t.model.id}${t.thinking?` · ${f(t.thinking)}`:``}`:t.thinking?`Pi default · ${f(t.thinking)}`:`Pi default`,`${pr} flex cursor-pointer items-center gap-1.5 truncate text-left hover:bg-neutral-50 ${t.model?`text-neutral-700`:`text-neutral-400`}`);return i.title=t.model?`${t.model.provider}/${t.model.id}`:`Whatever the project and Pi pick`,i.onclick=()=>{let e=_c({models:n,current:t.model,thinkingLevel:t.thinking??`medium`,thinkingLevels:[...Qi],onPick:(e,n)=>{$(),r({model:e,thinking:n??t.thinking})},onThinkingPick:e=>r({...t,thinking:e})}),a=lr(`Pi default`,`w-full cursor-pointer px-3 py-1.5 text-left text-[12.5px] text-neutral-500 hover:bg-neutral-100`);a.onclick=()=>{$(),r({model:null,thinking:null})};let o=K(`div`,`flex flex-col`);o.append(e,K(`div`,`border-t border-neutral-200`),a),sc(i,o)},J(e,i)}var yc=async e=>{let t=await E(`/api/fs/dirs${e?.startsWith(`/`)?`?path=${encodeURIComponent(e)}`:``}`,`Could not list directories`);return t.ok?t.value:null},bc=(e,t,n)=>{let r=lr(e,`flex w-full cursor-pointer items-center gap-1.5 px-3 py-1 text-left ${t}`);return r.onclick=n,r};function xc(e,t){let n=K(`div`,`flex-none border-t border-neutral-200`),r=bc(`+ New folder`,`text-[12px] text-neutral-500 hover:bg-neutral-100`,()=>{let r=document.createElement(`input`);r.className=`w-full border-0 bg-transparent px-3 py-1 font-mono text-[12.5px] focus:outline-none`,r.placeholder=`folder-name`;let i=K(`p`,`hidden px-3 pb-1 text-[11.5px] text-red-600`);r.onkeydown=async n=>{if(n.key!==`Enter`)return;n.preventDefault();let a=await w(`/api/fs/dirs`,{path:e,name:r.value});if(!a.ok){i.textContent=(await a.json()).error??`could not create`,i.classList.remove(`hidden`);return}t((await a.json()).path)},n.replaceChildren(r,i),r.focus()});return n.append(r),n}function Sc(e,t,n){let r=e=>{n(e),$()};async function i(t){let n=await yc(t);if(!n)return;let a=K(`div`,`flex max-h-80 w-80 flex-col`),o=lr(`Use`,`ml-auto flex-none cursor-pointer rounded bg-indigo-600 px-2 py-0.5 text-[11.5px] text-white dark:text-neutral-50`);o.onclick=()=>r(n.path);let s=document.createElement(`input`);s.className=`min-w-0 flex-1 border-0 bg-transparent font-mono text-[11.5px] text-neutral-500 focus:outline-none`,s.value=n.path,s.spellcheck=!1,s.title=`Type or paste a path, then Enter`,s.onfocus=()=>s.select();let c=K(`p`,`hidden flex-none px-3 pb-1 text-[11.5px] text-red-600`);s.onkeydown=async e=>{if(e.key!==`Enter`)return;e.preventDefault(),e.stopPropagation();let t=s.value.trim();if(!t)return;let n=await yc(t);if(!n){c.textContent=`${t} is not a folder this can read`,c.classList.remove(`hidden`);return}r(n.path)};let l=K(`div`,`flex flex-none items-center gap-2 border-b border-neutral-200 px-3 py-1.5`,s,o),u=K(`div`,`min-h-0 flex-1 overflow-y-auto py-0.5 text-[12.5px]`);n.parent&&u.append(bc(`../`,`font-mono text-neutral-500 hover:bg-neutral-100`,()=>void i(n.parent)));for(let e of n.entries)u.append(bc(e,`truncate hover:bg-neutral-100`,()=>void i(`${n.path}/${e}`.replace(`//`,`/`))));n.entries.length||u.append(K(`p`,`px-3 py-1.5 text-[12px] text-neutral-400`,`No sub-folders.`)),a.append(l,c,u,xc(n.path,e=>void i(e))),sc(e,a)}i(t)}function Cc(e,t,n,r){lc(e,[...t.map(e=>({label:e.path,...e.hint?{hint:e.hint}:{},checked:e.path===n,onSelect:()=>{$(),r(e.path)}})),{label:`Browse…`,onSelect:()=>Sc(e,n||void 0,r)}])}var wc=(e,t)=>n=>{e.value=n,e.dispatchEvent(new Event(`input`,{bubbles:!0})),t?.(n)};function Tc(e,t){let n=lr(`Browse…`,`flex-none cursor-pointer rounded-md border border-neutral-300 px-2 py-1 text-[12px] text-neutral-600 hover:bg-neutral-100`);return n.onclick=()=>Sc(n,e.value.trim()||void 0,wc(e,t)),n}function Ec(e,t){let n=wc(e);e.classList.add(`select`),e.title=`Pick a project folder, or type a path`,e.onclick=()=>{let r=e.value.trim()||void 0,i=t();if(i.length)return Cc(e,i,r,n);Sc(e,r,n)},e.addEventListener(`input`,()=>$())}function Dc(e,t,n){let r=document.createElement(`input`);return r.className=`min-w-0 flex-1 rounded-md border border-neutral-300 bg-white px-2 py-1 font-mono text-[12.5px] focus:border-indigo-400 focus:outline-none`,r.value=e,r.placeholder=t,r.oninput=()=>n(r.value),{el:K(`div`,`flex items-center gap-1.5`,r,Tc(r,n)),input:r}}var Oc=G(`#sidebar`),kc=G(`#drawer-scrim`),Ac=G(`#mobile-title`),jc=G(`#mobile-menu`);function Mc(){delete Oc.dataset.open,kc.classList.add(`hidden`)}function Nc(e,t){Ac.textContent=e,Ac.classList.toggle(`cursor-pointer`,t),jc.classList.toggle(`hidden`,!t)}var Pc=`pier.railClosed`;localStorage.getItem(Pc)===`1`&&(document.body.dataset.rail=`closed`);function Fc(e){document.body.dataset.rail=e?`closed`:``,localStorage.setItem(Pc,e?`1`:`0`)}function Ic(){if(Oc.dataset.open!==void 0)return Mc();Oc.dataset.open=``,kc.classList.remove(`hidden`)}var Lc=()=>window.innerWidth<768,Rc=[G(`#rail-toggle`),G(`#drawer-toggle`)],zc=`attention absolute -right-0.5 -top-0.5 rounded-full bg-amber-500`,Bc=e=>e===1?K(`span`,`${zc} h-2 w-2`):K(`span`,`${zc} flex h-3.5 min-w-3.5 items-center justify-center px-0.5 text-[9px] font-semibold text-white`,e>9?`9+`:String(e));function Vc(e){for(let t of Rc)t.querySelector(`.attention`)?.remove(),e&&t.append(Bc(e))}var Hc=20,Uc=.35,Wc=8;function Gc(){let e=-1,t=0,n=!1,r=!1,i=1,a=e=>{Oc.style.transition=`none`,Oc.style.transform=`translateX(${String(e-i)}px)`,kc.classList.remove(`hidden`),kc.style.opacity=String(e/i)},o=t=>{Oc.style.transition=``,Oc.style.transform=``,kc.style.opacity=``,t?(Oc.dataset.open=``,kc.classList.remove(`hidden`)):Mc(),e=-1,r=!1};window.addEventListener(`touchstart`,a=>{if(r||(e=-1,!Lc()||a.touches.length!==1))return;let o=a.touches[0],s=Oc.dataset.open!==void 0;if(i=Oc.offsetWidth||1,s){if(o.clientX>i)return}else{if(o.clientX>Hc||a.target?.closest(`button, a, input, textarea, select`))return;a.preventDefault()}e=o.clientX,t=o.clientY,n=!s},{passive:!1}),window.addEventListener(`touchmove`,o=>{if(e<0)return;let s=o.touches[0],c=s.clientX-e;if(!r){if(Math.abs(s.clientY-t)>Math.abs(c))return void(e=-1);if(Math.abs(c)<Wc)return;r=!0}o.preventDefault(),a(Math.max(0,Math.min(i,n?c:i+c)))},{passive:!1});let s=()=>{if(e<0)return;if(!r)return void(e=-1);let t=Oc.getBoundingClientRect().right;o(n?t>i*Uc:t>i*.65)};window.addEventListener(`touchend`,s),window.addEventListener(`touchcancel`,s)}function Kc(e){Gc(),G(`#drawer-toggle`).onclick=Ic,kc.onclick=Mc,jc.onclick=()=>e.sessionMenu(jc),Ac.onclick=()=>{jc.classList.contains(`hidden`)||e.sessionInfo(Ac)};let t=G(`#rail-toggle`);t.onclick=()=>Fc(document.body.dataset.rail!==`closed`),Jo(t,`meta+b`,`Toggle sidebar`,()=>Lc()?Ic():Fc(document.body.dataset.rail!==`closed`))}var qc,Jc=G(`#project-tree`),Yc=G(`#archive-dialog`),Xc=G(`#archive-list`),Zc=G(`#archive-search`),Qc=G(`#archive-count`),$c=G(`#new-dialog`),el=`pier.collapsedProjects`,tl=new Set(nl());function nl(){try{let e=JSON.parse(localStorage.getItem(el)??`[]`);return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}catch{return[]}}function rl(e,t){t?tl.add(e):tl.delete(e),localStorage.setItem(el,JSON.stringify([...tl]))}function il(e,t){let n=new Map;for(let r of e){let e=t(r),i=n.get(e);i?i.push(r):n.set(e,[r])}return n}var al=e=>il(e,e=>e.cwd),ol=e=>e.repo??e.cwd,sl=e=>e.endsWith(`/.git`)?e.slice(0,-5):void 0,cl=(e,t)=>$n(sl(e)??t[0]?.cwd??e);function ll(e,t){let n=sl(e),r=[...new Set(t.map(e=>e.cwd))];return n&&r.includes(n)?[n,...r.filter(e=>e!==n)]:r}function ul(e,t){return e===t?0:e===void 0?-1:t===void 0?1:e-t}function dl(e){let t=[...il(e,ol)].map(([e,t])=>[e,[...t].sort((e,t)=>(e.branch??e.cwd).localeCompare(t.branch??t.cwd)||ul(e.sort,t.sort)||t.createdAt-e.createdAt)]),n=e=>{let t=e.map(e=>e.projectSort).filter(e=>e!==void 0);return t.length?Math.min(...t):void 0},r=e=>Math.min(...e.map(e=>e.createdAt));return t.sort(([,e],[,t])=>ul(n(e),n(t))||r(t)-r(e))}function fl(e,t,n,r){let i=e.filter(e=>e!==t);return i.splice(i.indexOf(n)+ +!!r,0,t),i}var pl=()=>dl(qc.sessions().filter(e=>e.listed)),ml=()=>pl().flatMap(([e,t])=>ll(e,t).map(e=>{let n=t.find(t=>t.cwd===e)?.branch;return{path:e,...n?{hint:n}:{}}}));function hl(e,t,n,r){let i=new Map(e.map((e,t)=>[e,t]));for(let e of qc.sessions()){let r=i.get(t(e));r!==void 0&&n(e,r)}Nl();let a=()=>void qc.loadSessions();w(`/api/projects/order`,r).then(e=>{e.ok||a()},a)}function gl(e,t,n,r){let i=pl().find(([t])=>t===e);if(!i)return;let a=fl(i[1].map(e=>e.id),t,n,r);hl(a,e=>e.id,(e,t)=>e.sort=t,{sessions:a})}function _l(e,t,n){let r=pl(),i=fl(r.map(([e])=>e),e,t,n);hl(i,ol,(e,t)=>e.projectSort=t,{projects:i.flatMap(e=>{let t=r.find(([t])=>t===e);return t?ll(e,t[1]):[]})})}var vl=null;function yl(e,t){e.style.boxShadow=t===null?``:`inset 0 ${t?-2:2}px 0 0 #818cf8`}function bl(e,t,n,r){e.draggable=!0,e.ondragstart=e=>{e.stopPropagation(),vl={list:t,key:n},e.dataTransfer?.setData(`text/plain`,n)},e.ondragend=()=>{vl=null,Nl()};let i=t=>{let n=e.getBoundingClientRect();return t.clientY>n.top+n.height/2},a=e=>!vl||vl.list!==t||vl.key===n?!1:(e.preventDefault(),e.stopPropagation(),!0);e.ondragover=t=>{a(t)&&yl(e,i(t))},e.ondragleave=()=>yl(e,null),e.ondrop=t=>{let n=vl?.key;yl(e,null),a(t)&&n&&r(n,i(t))}}var xl=`hidden flex-none rounded px-1 leading-none text-neutral-400 hover:bg-neutral-200 hover:text-neutral-700 group-hover:block pointer-coarse:block`,Sl=e=>e.unread&&e.listed;function Cl(e){let[t,n]=e.state===`streaming`?[`bg-green-500 animate-pulse`,`working…`]:Sl(e)?[`bg-amber-500`,`turn finished — not viewed yet`]:e.activeRuns>0?[`bg-sky-500`,`${e.activeRuns} subagent${e.activeRuns>1?`s`:``} running`]:[`bg-neutral-300`,`idle`],r=K(`span`,`h-2 w-2 flex-none rounded-full ${t}`);return r.title=n,r}async function wl(e,t,n,r,i){let a=t=>{e(t),Nl(),qc.onPinsChanged()};a(t),(await w(r,i)).ok||a(n)}async function Tl(e){let t=window.prompt(`Session name — empty resets it to the first message`,e.title??``);t!==null&&await wl(t=>e.title=t,t.trim()||void 0,e.title,`/api/sessions/${e.id}/rename`,{name:t})}var El=(e,t)=>wl(t=>e.listed=t,t,!t,`/api/sessions/${e.id}/pin`,{pinned:t}),Dl=(e,t)=>e.find(e=>e.cwd===t)?.branch??$n(t),Ol=`flex-none truncate rounded bg-neutral-200/70 px-1 font-mono text-[10px] leading-[15px] text-neutral-500`,kl={telegram:`tg`};function Al(e){if(!e.channel||e.channel===`web`)return[];let t=K(`span`,Ol,kl[e.channel]??e.channel);return t.title=`answering ${e.channel}`,[t]}function jl(e){let t=K(`li`,`group flex cursor-pointer items-center gap-1.5 py-1.5 pl-6 pr-3 hover:bg-neutral-100 ${e.id===qc.currentId()?`bg-indigo-50 hover:bg-indigo-50`:``}`),n=K(`button`,xl,`⋯`);n.title=`Session actions`,n.onclick=t=>{t.stopPropagation(),qc.sessionMenu(n,e)};let r=K(`button`,xl,`✓`);r.title=`Done — remove from Projects (the session and its transcript stay)`,r.onclick=t=>{t.stopPropagation(),El(e,!1)},t.append(Cl(e),K(`span`,`truncate`,e.title??`untitled`),K(`div`,`ml-auto flex flex-none items-center gap-1`,...Al(e),r,n)),t.onclick=()=>qc.select(e.id),t.title=`Drag to reorder`;let i=ol(e);return bl(t,i,e.id,(t,n)=>gl(i,t,e.id,n)),t}function Ml(e,t){let n=ll(e,t),r=n[0]??e,i=K(`span`,`flex-none text-[11px] text-neutral-400 group-hover:hidden`,String(t.length)),a=K(`button`,xl,`⋯`);a.title=`Project actions`,a.onclick=e=>{e.preventDefault(),e.stopPropagation(),lc(a,[...n.map(e=>({label:n.length>1?`New session in ${Dl(t,e)}`:`New session here`,hint:$n(e),onSelect:()=>{$(),qc.createSession(e)}})),{label:`Browse files`,onSelect:()=>{$(),qc.openFiles(r)}},{label:`Terminal here`,onSelect:()=>{$(),qc.openTerminal(r)}},{label:`Remove ${t.length} session${t.length>1?`s`:``} from Projects`,onSelect:()=>{$();for(let e of t)El(e,!1)}}])};let{el:o,summary:s}=sr(`border-b border-neutral-200/70`,[K(`span`,`truncate font-mono text-[11px] font-semibold uppercase tracking-wide text-neutral-500`,cl(e,t)),K(`div`,`ml-auto flex flex-none items-center gap-1.5`,i,a)]);s.className+=` group px-3 py-1.5 hover:bg-neutral-100`,s.title=`${n.join(`
77
- `)}\nDrag to reorder`,bl(s,``,e,(t,n)=>_l(t,e,n)),o.open=!tl.has(e),o.ontoggle=()=>rl(e,!o.open);let c=K(`ul`,`pb-1`);return c.append(...t.map(jl)),o.append(c),o}function Nl(){let e=qc.sessions().filter(Sl);Vc(e.length),Qs(e.filter(e=>e.channel===`web`).length);let t=pl();Jc.replaceChildren(...t.length?t.map(([e,t])=>Ml(e,t)):[K(`p`,`px-3 py-2 text-[12.5px] leading-snug text-neutral-400`,`No projects yet — create a session, or pin one from All sessions.`)]),Yc.open&&Ul()}var Pl=[{name:`activity`,label:`Activity`,detail:`Console — runs, scheduled tasks, dependencies`},{name:`boards`,label:`Boards`,detail:`Console — the static pages Pier publishes`},{name:`settings`,label:`Settings`,detail:`Console — models and providers, agent files and extensions, channels, password, sign out, security`}],Fl=[],Il=0,Ll={ArrowDown:1,ArrowUp:-1},Rl={n:1,j:1,p:-1,k:-1};function zl(e){if(Fl.length){Il=(e+Fl.length)%Fl.length;for(let[e,{el:t}]of Fl.entries())t.classList.toggle(`bg-indigo-100`,e===Il),t.classList.toggle(`border-indigo-500`,e===Il);Fl[Il]?.el.scrollIntoView({block:`nearest`})}}function Bl(e){let t=K(`button`,`flex-none rounded px-1.5 py-0.5 text-[11.5px] ${e.listed?`bg-indigo-50 text-indigo-600`:`text-neutral-400 hover:bg-neutral-200 hover:text-neutral-700`}`,e.listed?`pinned`:`pin`);return t.title=e.listed?`Remove from Projects`:`Pin to Projects`,t.onclick=t=>{t.stopPropagation(),El(e,!e.listed)},t}function Vl(e){let t=K(`li`,`flex cursor-pointer items-center gap-2 border-l-2 border-transparent px-3 py-1.5 hover:bg-neutral-100`);return t.append(e.session?Cl(e.session):K(`span`,`h-2 w-2 flex-none`)),t.append(K(`span`,`min-w-0 flex-1 truncate`,e.label),K(`span`,`max-w-[45%] flex-none truncate text-[11.5px] text-neutral-400`,e.detail)),e.session&&t.append(K(`span`,`flex-none text-[11px] text-neutral-400`,Zn(e.session.createdAt)),Bl(e.session)),t.onclick=e.open,t}var Hl=e=>K(`li`,`px-3 pb-0.5 pt-2 text-[11px] font-semibold uppercase tracking-wide text-neutral-400`,e);function Ul(){let e=Zc.value.trim().toLowerCase(),t=t=>!e||t.toLowerCase().includes(e),n=e=>()=>{Yc.close(),e()},r=e=>e.channel&&e.channel!==`web`?e.channel:``,i=qc.sessions().filter(e=>t(`${e.title??``} ${e.cwd} ${r(e)}`)),a=(e,t)=>t.createdAt-e.createdAt,o=e=>({label:e.title??`untitled`,detail:[$n(e.cwd),r(e)].filter(Boolean).join(` · `),open:n(()=>qc.select(e.id)),session:e}),s=i.filter(e=>e.state===`streaming`),c=i.filter(e=>e.state!==`streaming`),l=[`Console`,Pl.filter(e=>t(`${e.label} ${e.detail}`)).map(({name:e,label:t,detail:r})=>({label:t,detail:r,open:n(()=>qc.openConsole(e))}))],u=[[`Running`,s.sort(a).map(o)],[`Projects`,c.filter(e=>e.listed).sort(a).map(o)],[`Other sessions`,c.filter(e=>!e.listed).sort(a).map(o)]];e?u.unshift(l):u.push(l),Fl=[];let d=[];for(let[e,t]of u)if(t.length){d.push(Hl(e));for(let e of t){let t=Vl(e);Fl.push({el:t,open:e.open}),d.push(t)}}Xc.replaceChildren(...d.length?d:[K(`li`,`px-3 py-3 text-[13px] text-neutral-400`,`Nothing matches.`)]),Qc.textContent=String(Fl.length),zl(Il)}function Wl(){if(Yc.open)return Yc.close();Zc.value=``,Il=0,Ul(),Yc.showModal(),Zc.focus(),qc.loadSessions().then(()=>{Yc.open&&Ul()})}function Gl(e){qc=e,Ec(G(`#new-cwd`),ml);let t=G(`#new-session`),n=()=>{let e=qc.sessions().find(e=>e.id===qc.currentId())?.cwd??``,t=G(`#new-cwd`);t.value=e,$c.showModal(),t.select()};t.onclick=n,Jo(t,`shift+o`,`New session`,n,()=>$c.open),G(`#new-cancel`).onclick=()=>$c.close(),G(`#new-form`).onsubmit=()=>void qc.createSession(G(`#new-cwd`).value.trim());let r=G(`#open-archive`);r.onclick=Wl,Jo(r,`k`,`Search sessions and Console`,Wl,()=>Yc.open),G(`#archive-close`).onclick=()=>Yc.close(),Zc.oninput=()=>{Il=0,Ul()},Zc.onkeydown=e=>{let t=e.altKey||e.metaKey||e.shiftKey||!e.key?void 0:e.ctrlKey?Rl[e.key.toLowerCase()]:Ll[e.key];if(t!==void 0){e.preventDefault(),zl(Il+t);return}e.key===`Enter`&&!e.ctrlKey&&(e.preventDefault(),Fl[Il]?.open())}}var Kl;function ql(e){Kl=e,Qo(Yl,()=>{let e=Kl.currentSession();e&&($(),El(e,!e.listed))},Jl),Qo(Xl,()=>{Kl.currentSession()&&($(),Kl.toggleFiles())},Jl)}var Jl=()=>document.querySelector(`dialog[open]`)!==null,Yl=`d`,Xl=`i`,Zl=G(`#chat-title`),Ql=G(`#chat-menu`),$l=G(`#session-meta`),eu=null,tu=null,nu=null,ru=null;function iu(){eu=null,tu=null,nu=null,ru=null,uu()}function au(e,t,n,r){eu=e,tu=t,nu=n,ru=r,su()}function ou(e){ru=e.completedAt,tu&&={...tu,tokens:e.tokens},uu()}function su(){let e=Kl.currentSession();Zl.textContent=e?e.title??`Untitled session`:`no session`,Zl.classList.toggle(`cursor-pointer`,!!e),Zl.title=e?`Session info`:``,Zl.onclick=e?()=>du(Zl,e):null,Ql.classList.toggle(`hidden`,!e),e&&(Ql.onclick=()=>_u(Ql,e)),uu(),Kl.syncBar()}var cu=(e,t)=>Math.min(100,Math.round(e/t.contextWindow*100)),lu=e=>e.tokens===null?`?/${p(e.contextWindow)}`:`${p(e.tokens)}/${p(e.contextWindow)} · ${100-cu(e.tokens,e)}% left`;function uu(){let e=tu,t=e?.tokens??null,n=Kl.currentId(),r=[];if(n){let e=(e,t)=>{let r=K(`button`,`flex-none cursor-pointer font-mono ${t}`,e);return r.title=`Change model or reasoning`,r.onclick=()=>void fu(r,n),r};eu&&r.push(e(eu.id,`rounded bg-indigo-50 px-1.5 py-px font-medium text-indigo-700 hover:bg-indigo-100`)),nu&&r.push(e(nu,`text-neutral-500 hover:text-indigo-700`))}if(e&&t!==null){let n=cu(t,e),i=n>=90?`text-red-700`:n>=70?`text-amber-700`:`text-neutral-500`;r.push(K(`span`,`flex-none font-mono ${i}`,p(t).toLowerCase()))}let i=r.flatMap((e,t)=>t===0?[e]:[K(`span`,`text-neutral-300`,`·`),e]);$l.replaceChildren(...i),$l.classList.toggle(`hidden`,r.length===0),$l.classList.toggle(`flex`,r.length>0)}function du(e,t){let n=[[`Title`,t.title??`untitled`],[`Directory`,t.cwd],[`Session`,t.id]];t.id===Kl.currentId()&&(n.push([`Model`,eu?.id??`—`]),n.push([`Context`,tu?lu(tu):`—`]),ru===null?n.push([`Last reply`,`—`]):n.push([`Last reply`,er(ru),Qn(ru)]));let r=K(`div`,`flex max-w-80 flex-col gap-1.5 px-3 py-2`);for(let[e,t,i]of n){let n=K(`div`,`flex items-center gap-1.5`,K(`span`,`text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,e));i&&n.append(K(`span`,`text-[10.5px] text-neutral-400`,i)),n.append(or(`cursor-pointer text-[10.5px] uppercase tracking-wide text-neutral-400 opacity-0 hover:text-neutral-700 focus:opacity-100 group-hover:opacity-100 pointer-coarse:opacity-100`,()=>t)),r.append(K(`div`,`group flex flex-col`,n,K(`span`,`break-all font-mono text-[12px] text-neutral-700`,t)))}sc(e,r)}async function fu(e,t){try{let[n,r]=await Promise.all([D(`/api/sessions/${t}/models`,`Could not load models`),D(`/api/sessions/${t}/thinking`,`Could not read the reasoning level`)]);sc(e,_c({models:n,current:t===Kl.currentId()?eu:null,thinkingLevel:r.level,thinkingLevels:r.levels,onPick:(e,n)=>{$(),pu(t,e,n)},onThinkingPick:e=>void hu(t,e)}))}catch(e){Z(`error`,`model options failed: ${String(e)}`)}}async function pu(e,t,n){await mu(e,t)&&n&&await hu(e,n)}async function mu(e,t){let n=eu;e===Kl.currentId()&&(eu=t,su());let r=await w(`/api/sessions/${e}/model`,t);if(!r.ok){let{error:t}=await r.json().catch(()=>({}));return e===Kl.currentId()&&(eu=n,su()),Z(`error`,`model change failed: ${t??r.status}`),!1}let{model:i}=await r.json();return e===Kl.currentId()&&i&&(eu=i,su()),!0}async function hu(e,t){let n=await w(`/api/sessions/${e}/thinking`,{level:t});if(!n.ok){Z(`error`,`reasoning change failed: ${n.status}`);return}let{level:r}=await n.json();e===Kl.currentId()&&(nu=r,uu())}async function gu(e){let t=await w(`/api/sessions/${e}/compact`,{});t.ok||Z(`error`,`compact failed: ${await T(t,`no reason given`)}`)}function _u(e,t){let n=t.id===Kl.currentId();lc(e,[{label:`Session info`,onSelect:()=>du(e,t)},{label:`Rename…`,onSelect:()=>{$(),Tl(t)}},{label:t.listed?`Done — remove from Projects`:`Pin to Projects`,hint:n?Go(Yl):``,onSelect:()=>{$(),El(t,!t.listed)}},{label:`Model`,hint:n?eu?.id??`…`:``,onSelect:()=>void fu(e,t.id)},{label:`Compact context`,onSelect:()=>{$(),gu(t.id)}},{label:`New session here`,hint:$n(t.cwd),onSelect:()=>{$(),Kl.createSession(t.cwd)}},{label:`Browse files`,hint:n?Go(Xl):``,onSelect:()=>{$(),Kl.openFiles(n?void 0:t.cwd)}}])}var vu=`pier.theme`,yu=[`system`,`light`,`dark`],bu=window.matchMedia(`(prefers-color-scheme: dark)`),xu={system:`<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" class="h-3.5 w-3.5"><circle cx="8" cy="8" r="5.25"/><path d="M8 2.75a5.25 5.25 0 0 0 0 10.5z" fill="currentColor" stroke="none"/></svg>`,light:`<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" class="h-3.5 w-3.5"><circle cx="8" cy="8" r="3.1"/><path d="M8 1.5v1.4M8 13.1v1.4M1.5 8h1.4M13.1 8h1.4M3.4 3.4l1 1M11.6 11.6l1 1M12.6 3.4l-1 1M4.4 11.6l-1 1"/></svg>`,dark:`<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round" class="h-3.5 w-3.5"><path d="M13 9.4A5.6 5.6 0 0 1 6.6 3a5.6 5.6 0 1 0 6.4 6.4z"/></svg>`},Su=()=>{let e=null;try{e=localStorage.getItem(vu)}catch{return`system`}return e===`light`||e===`dark`?e:`system`},Cu=()=>{let e=Su();return e===`system`?bu.matches?`dark`:`light`:e};function wu(){let e=Cu();document.documentElement.dataset.theme=e,G(`meta[name="theme-color"]`).setAttribute(`content`,e===`dark`?`#1c1c1c`:`#fafafa`),window.dispatchEvent(new Event(`pier:theme`))}function Tu(){let e=G(`#theme-toggle`),t=()=>{let t=Su();e.title=`Theme: ${t}${t===`system`?` (${Cu()})`:``}`,e.innerHTML=xu[t],wu()};e.onclick=()=>{let e=yu[(yu.indexOf(Su())+1)%yu.length];try{e===`system`?localStorage.removeItem(vu):localStorage.setItem(vu,e)}catch{}t()},bu.addEventListener(`change`,t),t()}var Eu=`https://github.com/timqi/pier`,Du=[`text-neutral-400`,`hover:text-neutral-700`],Ou=[`rounded-full`,`bg-emerald-50`,`px-1.5`,`text-emerald-700`,`ring-1`,`ring-inset`,`ring-emerald-600/20`,`hover:bg-emerald-100`],ku=18e5,Au=null,ju=G(`#version`);function Mu(e){let t=Au?.available===!0&&Au.latest!==null;ju.textContent=`v${e}`,ju.title=t?`Pier ${Au?.latest} is out`:``,ju.classList.remove(...t?Du:Ou),ju.classList.add(...t?Ou:Du)}var Nu=e=>K(`p`,`px-3 py-1 text-[12px] leading-snug text-neutral-500`,e);function Pu(){let e=K(`div`,`flex w-72 flex-col gap-1 py-1`);if(!Au)return e.append(Nu(`Checking the registry…`)),e;let{current:t,latest:n,available:r,canApply:i,problem:a}=Au;e.append(K(`p`,`px-3 py-1 text-[12.5px] font-medium text-neutral-700`,r?`Pier ${n} is out`:`Pier ${t}`)),e.append(Nu(r?`You are running ${t}.`:n===null?`The registry could not be reached, so this may not be the latest.`:`This is the latest release.`));let o=K(`span`,`px-3 text-[11.5px] text-neutral-400`,``),s=K(`div`,`flex items-center gap-2 px-3 py-1.5`);if(a&&e.append(K(`p`,`mx-3 my-1 rounded-md bg-red-50 px-2 py-1.5 text-[11.5px] leading-snug text-red-700`,a)),r&&i&&!a){let e=q(`Update now`,!0);e.onclick=()=>{e.disabled=!0,o.className=`px-3 text-[11.5px] text-neutral-400`,o.textContent=`starting the updater…`,(async()=>{let t=await w(`/api/update`,{});if(!t.ok){e.disabled=!1,o.className=`px-3 text-[11.5px] text-red-600`,o.textContent=await T(t,`Could not update`);return}let{draining:n}=await t.json();o.textContent=n?`Waiting for running work to finish — Pier then stops, installs and starts again.`:`Pier is stopping, installing and starting again — this page reconnects on its own.`})()},s.append(e)}let c=K(`a`,`btn text-[12.5px] no-underline`,`Source`);c.href=r?`${Eu}/releases`:Eu,c.target=`_blank`,c.rel=`noreferrer`,c.title=`Pier is free software (AGPL-3.0)`,s.append(c),e.append(s,o),r&&!i&&!a&&e.append(Nu(`No service manager owns this Pier, so it cannot restart itself — update it with: pier update`));let l=vr(`Update automatically`,i?`Installs a new release once nothing is running — no turn in flight, no task run.`:`Needs the systemd service (pier service install); nothing here can restart Pier.`,Au.autoUpdate,e=>{Au&&(Au.autoUpdate=e),(async()=>{let t=await w(`/api/settings`,{autoUpdate:e},`PUT`);if(t.ok)return;Au&&(Au.autoUpdate=!e);let n=l.querySelector(`input`);n&&(n.checked=!e),o.className=`px-3 text-[11.5px] text-red-600`,o.textContent=await T(t,`Could not save`)})()});if(!i){let e=l.querySelector(`input`);e&&(e.disabled=!0)}return e.append(K(`div`,`mt-1 border-t border-neutral-200 px-3 pb-1 pt-2`,l)),e}async function Fu(e){let t=await E(`/api/update`,`Update check failed`);t.ok&&(Au=t.value,Mu(Au.current||e))}function Iu(e){Mu(e),ju.onclick=e=>{e.preventDefault(),sc(ju,Pu())};let t=()=>void Fu(e).catch(()=>{});t(),setInterval(t,ku)}var Lu=(e,t={})=>{let n=document.createElementNS(`http://www.w3.org/2000/svg`,e);for(let[e,r]of Object.entries(t))n.setAttribute(e,r);return n},Ru=e=>e===null?`-`:tr(Date.now()-e),zu={light:{edge:`#a3a3a3`,callback:`#0891b2`,message:`#d97706`,scheduler:{fill:`#f5f3ff`,stroke:`#a78bfa`,text:`#5b21b6`},console:{fill:`#eff6ff`,stroke:`#93c5fd`,text:`#1d4ed8`},task:{fill:`#fffbeb`,stroke:`#fbbf24`,text:`#92400e`},process:{fill:`#f5f5f5`,stroke:`#a3a3a3`,text:`#525252`,dash:`4 3`},streaming:{fill:`#ffffff`,stroke:`#10b981`,text:`#262626`},idle:{fill:`#fafafa`,stroke:`#d4d4d4`,text:`#737373`}},dark:{edge:`#7a7a7a`,callback:`#3fc3dd`,message:`#e0a13a`,scheduler:{fill:`#2b2440`,stroke:`#7d63c9`,text:`#c9b8f5`},console:{fill:`#1f2a3d`,stroke:`#4a7fbf`,text:`#a8c8f0`},task:{fill:`#3a2f1c`,stroke:`#b8862a`,text:`#f0d49a`},process:{fill:`#262626`,stroke:`#5c5c5c`,text:`#a3a3a3`,dash:`4 3`},streaming:{fill:`#22302a`,stroke:`#10b981`,text:`#e5e5e5`},idle:{fill:`#212121`,stroke:`#4a4a4a`,text:`#9a9a9a`}}},Bu=()=>zu[document.documentElement.dataset.theme===`dark`?`dark`:`light`];function Vu(e,t,n){let r=`sessions`,i=`active`,a={sessions:[],runs:[],messages:[]},o=``,s=C(async()=>{let t=i,n=await fetch(`/api/activity?scope=${t}`);if(!n.ok){o=``,e.replaceChildren(K(`p`,`p-4 text-[13px] text-red-600`,`Failed to load activity: ${n.status}`));return}let r=await n.text();if(t!==i||r===o)return;o=r;let s=JSON.parse(r);a={...s,sessions:s.sessions.map(e=>({...e,title:S(e.title)}))},c()});function c(){let t=K(`header`,`flex h-10 flex-none items-center gap-2 border-b border-neutral-200 px-4 max-md:hidden`,K(`span`,`font-medium`,`Activity`)),a=K(`div`,`tabstrip`);a.append(ur(`Sessions`,r===`sessions`,()=>{r=`sessions`,c()}),ur(`Dependencies`,r===`dependencies`,()=>{r=`dependencies`,c()}),ur(`Tasks`,!1,()=>n()));let o=K(`div`,`ml-auto flex gap-1 max-md:ml-0 max-md:w-full`),d=e=>()=>{i=e,c(),s()};o.append(ur(`Active`,i===`active`,d(`active`)),ur(`Last 24h`,i===`recent`,d(`recent`))),a.append(o);let f=K(`div`,`min-h-0 flex-1 overflow-auto`);r===`sessions`?l(f):u(f),e.replaceChildren(t,a,f)}function l(e){let n=document.createElement(`table`);n.className=`w-full min-w-[38rem] table-fixed text-left text-[12.5px]`,n.innerHTML=`<thead class="bg-neutral-50 text-[10.5px] uppercase text-neutral-400"><tr>
71
+ `),1;if(ne>1e5&&ne>r.index*3)throw Error(`potential infinite loop, way more iterations than matches`);return N+=a,a.length}let D=M(e);if(!D)throw ge(s.replace(`{}`,e)),Error(`Unknown language: "`+e+`"`);let O=Te(D),k=``,A=a||O,ee={},j=new l.__emitter(l);w();let N=``,te=0,P=0,ne=0,re=!1;try{if(D.__emitTokens)D.__emitTokens(n,j);else{for(A.matcher.considerAll();;){ne++,re?re=!1:A.matcher.considerAll(),A.matcher.lastIndex=P;let e=A.matcher.exec(n);if(!e)break;let t=E(n.substring(P,e.index),e);P=e.index+t}E(n.substring(P))}return j.finalize(),k=j.toHTML(),{language:e,value:k,relevance:te,illegal:!1,_emitter:j,_top:A}}catch(t){if(t.message&&t.message.includes(`Illegal`))return{language:e,value:z(n),illegal:!0,relevance:0,_illegalBy:{message:t.message,index:P,context:n.slice(P-100,P+100),mode:t.mode,resultSoFar:k},_emitter:j};if(o)return{language:e,value:z(n),illegal:!1,relevance:0,errorRaised:t,_emitter:j,_top:A};throw t}}function b(e){let t={value:z(e),illegal:!1,relevance:0,_top:c,_emitter:new l.__emitter(l)};return t._emitter.addText(e),t}function S(e,n){n=n||l.languages||Object.keys(t);let r=b(e),i=n.filter(M).filter(te).map(t=>v(t,e,!1));i.unshift(r);let[a,o]=i.sort((e,t)=>{if(e.relevance!==t.relevance)return t.relevance-e.relevance;if(e.language&&t.language){if(M(e.language).supersetOf===t.language)return 1;if(M(t.language).supersetOf===e.language)return-1}return 0}),s=a;return s.secondBest=o,s}function C(e,t,n){let r=t&&i[t]||n;e.classList.add(`hljs`),e.classList.add(`language-${r}`)}function w(e){let t=null,n=d(e);if(u(n))return;if(ie(`before:highlightElement`,{el:e,language:n}),e.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e);return}if(e.children.length>0&&(l.ignoreUnescapedHTML||(console.warn(`One of your code blocks includes unescaped HTML. This is a potentially serious security risk.`),console.warn(`https://github.com/highlightjs/highlight.js/wiki/security`),console.warn(`The element with unescaped HTML:`),console.warn(e)),l.throwUnescapedHTML))throw new Oe(`One of your code blocks includes unescaped HTML.`,e.innerHTML);t=e;let r=t.textContent,i=n?p(r,{language:n,ignoreIllegals:!0}):S(r);e.innerHTML=i.value,e.dataset.highlighted=`yes`,C(e,n,i.language),e.result={language:i.language,re:i.relevance,relevance:i.relevance},i.secondBest&&(e.secondBest={language:i.secondBest.language,relevance:i.secondBest.relevance}),ie(`after:highlightElement`,{el:e,result:i,text:r})}function T(e){l=B(l,e)}let E=()=>{k(),ve(`10.6.0`,`initHighlighting() deprecated. Use highlightAll() now.`)};function D(){k(),ve(`10.6.0`,`initHighlightingOnLoad() deprecated. Use highlightAll() now.`)}let O=!1;function k(){function e(){k()}if(document.readyState===`loading`){O||window.addEventListener(`DOMContentLoaded`,e,!1),O=!0;return}document.querySelectorAll(l.cssSelector).forEach(w)}function A(n,r){let i=null;try{i=r(e)}catch(e){if(ge(`Language definition for '{}' could not be registered.`.replace(`{}`,n)),o)ge(e);else throw e;i=c}i.name||(i.name=n),t[n]=i,i.rawDefinition=r.bind(null,e),i.aliases&&N(i.aliases,{languageName:n})}function ee(e){delete t[e];for(let t of Object.keys(i))i[t]===e&&delete i[t]}function j(){return Object.keys(t)}function M(e){return e=(e||``).toLowerCase(),t[e]||t[i[e]]}function N(e,{languageName:t}){typeof e==`string`&&(e=[e]),e.forEach(e=>{i[e.toLowerCase()]=t})}function te(e){let t=M(e);return t&&!t.disableAutodetect}function P(e){e[`before:highlightBlock`]&&!e[`before:highlightElement`]&&(e[`before:highlightElement`]=t=>{e[`before:highlightBlock`](Object.assign({block:t.el},t))}),e[`after:highlightBlock`]&&!e[`after:highlightElement`]&&(e[`after:highlightElement`]=t=>{e[`after:highlightBlock`](Object.assign({block:t.el},t))})}function ne(e){P(e),a.push(e)}function re(e){let t=a.indexOf(e);t!==-1&&a.splice(t,1)}function ie(e,t){let n=e;a.forEach(function(e){e[n]&&e[n](t)})}function I(e){return ve(`10.7.0`,`highlightBlock will be removed entirely in v12.0`),ve(`10.7.0`,`Please use highlightElement now.`),w(e)}Object.assign(e,{highlight:p,highlightAuto:S,highlightAll:k,highlightElement:w,highlightBlock:I,configure:T,initHighlighting:E,initHighlightingOnLoad:D,registerLanguage:A,unregisterLanguage:ee,listLanguages:j,getLanguage:M,registerAliases:N,autoDetection:te,inherit:B,addPlugin:ne,removePlugin:re}),e.debugMode=function(){o=!1},e.safeMode=function(){o=!0},e.versionString=R,e.regex={concat:_,lookahead:m,either:y,optional:g,anyNumberOfTimes:h};for(let e in F)typeof F[e]==`object`&&n(F[e]);return Object.assign(e,F),e},Me=je({});Me.newInstance=()=>je({}),t.exports=Me,Me.HighlightJS=Me,Me.default=Me}))()).default;function ii(e){let t=e.regex,n={},r={begin:/\$\{/,end:/\}/,contains:[`self`,{begin:/:-/,contains:[n]}]};Object.assign(n,{className:`variable`,variants:[{begin:t.concat(/\$[\w\d#@][\w\d_]*/,`(?![\\w\\d])(?![$])`)},r]});let i={className:`subst`,begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},a=e.inherit(e.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:`comment`}}),o={begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:`string`})]}},s={className:`string`,begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,n,i]};i.contains.push(s);let c={match:/\\"/},l={className:`string`,begin:/'/,end:/'/},u={match:/\\'/},d={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:`number`},e.NUMBER_MODE,n]},f=e.SHEBANG({binary:`(${[`fish`,`bash`,`zsh`,`sh`,`csh`,`ksh`,`tcsh`,`dash`,`scsh`].join(`|`)})`,relevance:10}),p={className:`function`,begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},m=[`if`,`then`,`else`,`elif`,`fi`,`time`,`for`,`while`,`until`,`in`,`do`,`done`,`case`,`esac`,`coproc`,`function`,`select`],h=[`true`,`false`],g={match:/(\/[a-z._-]+)+/},_=[`break`,`cd`,`continue`,`eval`,`exec`,`exit`,`export`,`getopts`,`hash`,`pwd`,`readonly`,`return`,`shift`,`test`,`times`,`trap`,`umask`,`unset`],v=[`alias`,`bind`,`builtin`,`caller`,`command`,`declare`,`echo`,`enable`,`help`,`let`,`local`,`logout`,`mapfile`,`printf`,`read`,`readarray`,`source`,`sudo`,`type`,`typeset`,`ulimit`,`unalias`],y=`autoload.bg.bindkey.bye.cap.chdir.clone.comparguments.compcall.compctl.compdescribe.compfiles.compgroups.compquote.comptags.comptry.compvalues.dirs.disable.disown.echotc.echoti.emulate.fc.fg.float.functions.getcap.getln.history.integer.jobs.kill.limit.log.noglob.popd.print.pushd.pushln.rehash.sched.setcap.setopt.stat.suspend.ttyctl.unfunction.unhash.unlimit.unsetopt.vared.wait.whence.where.which.zcompile.zformat.zftp.zle.zmodload.zparseopts.zprof.zpty.zregexparse.zsocket.zstyle.ztcp`.split(`.`),b=`chcon.chgrp.chown.chmod.cp.dd.df.dir.dircolors.ln.ls.mkdir.mkfifo.mknod.mktemp.mv.realpath.rm.rmdir.shred.sync.touch.truncate.vdir.b2sum.base32.base64.cat.cksum.comm.csplit.cut.expand.fmt.fold.head.join.md5sum.nl.numfmt.od.paste.ptx.pr.sha1sum.sha224sum.sha256sum.sha384sum.sha512sum.shuf.sort.split.sum.tac.tail.tr.tsort.unexpand.uniq.wc.arch.basename.chroot.date.dirname.du.echo.env.expr.factor.groups.hostid.id.link.logname.nice.nohup.nproc.pathchk.pinky.printenv.printf.pwd.readlink.runcon.seq.sleep.stat.stdbuf.stty.tee.test.timeout.tty.uname.unlink.uptime.users.who.whoami.yes`.split(`.`);return{name:`Bash`,aliases:[`sh`,`zsh`],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:m,literal:h,built_in:[..._,...v,`set`,`shopt`,...y,...b]},contains:[f,e.SHEBANG(),p,d,a,o,g,s,c,l,u,n]}}var ai=e=>({IMPORTANT:{scope:`meta`,begin:`!important`},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:`number`,begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},UNICODE_RANGE:{scope:`number`,begin:/\b[Uu]\+[0-9A-Fa-f][0-9A-Fa-f?]{0,5}(-[0-9A-Fa-f][0-9A-Fa-f]{0,5})?/},FUNCTION_DISPATCH:{className:`built_in`,begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:`selector-attr`,begin:/\[/,end:/\]/,illegal:`$`,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:`number`,begin:e.NUMBER_RE+`(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?`,relevance:0},CSS_VARIABLE:{className:`attr`,begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),oi=`a.abbr.address.article.aside.audio.b.blockquote.body.button.canvas.caption.cite.code.dd.del.details.dfn.div.dl.dt.em.fieldset.figcaption.figure.footer.form.h1.h2.h3.h4.h5.h6.header.hgroup.html.i.iframe.img.input.ins.kbd.label.legend.li.main.mark.menu.nav.object.ol.optgroup.option.p.picture.q.quote.samp.section.select.source.span.strong.summary.sup.table.tbody.td.textarea.tfoot.th.thead.time.tr.ul.var.video`.split(`.`),si=`defs.g.marker.mask.pattern.svg.switch.symbol.feBlend.feColorMatrix.feComponentTransfer.feComposite.feConvolveMatrix.feDiffuseLighting.feDisplacementMap.feFlood.feGaussianBlur.feImage.feMerge.feMorphology.feOffset.feSpecularLighting.feTile.feTurbulence.linearGradient.radialGradient.stop.circle.ellipse.image.line.path.polygon.polyline.rect.text.use.textPath.tspan.foreignObject.clipPath`.split(`.`),ci=[...oi,...si],li=`any-hover.any-pointer.aspect-ratio.color.color-gamut.color-index.device-aspect-ratio.device-height.device-width.display-mode.forced-colors.grid.height.hover.inverted-colors.monochrome.orientation.overflow-block.overflow-inline.pointer.prefers-color-scheme.prefers-contrast.prefers-reduced-motion.prefers-reduced-transparency.resolution.scan.scripting.update.width.min-width.max-width.min-height.max-height`.split(`.`).sort().reverse(),ui=`active.any-link.blank.checked.current.default.defined.dir.disabled.drop.empty.enabled.first.first-child.first-of-type.fullscreen.future.focus.focus-visible.focus-within.has.host.host-context.hover.indeterminate.in-range.invalid.is.lang.last-child.last-of-type.left.link.local-link.not.nth-child.nth-col.nth-last-child.nth-last-col.nth-last-of-type.nth-of-type.only-child.only-of-type.optional.out-of-range.past.placeholder-shown.read-only.read-write.required.right.root.scope.target.target-within.user-invalid.valid.visited.where`.split(`.`).sort().reverse(),di=[`after`,`backdrop`,`before`,`cue`,`cue-region`,`first-letter`,`first-line`,`grammar-error`,`marker`,`part`,`placeholder`,`selection`,`slotted`,`spelling-error`].sort().reverse(),fi=`accent-color.align-content.align-items.align-self.alignment-baseline.all.anchor-name.animation.animation-composition.animation-delay.animation-direction.animation-duration.animation-fill-mode.animation-iteration-count.animation-name.animation-play-state.animation-range.animation-range-end.animation-range-start.animation-timeline.animation-timing-function.appearance.aspect-ratio.backdrop-filter.backface-visibility.background.background-attachment.background-blend-mode.background-clip.background-color.background-image.background-origin.background-position.background-position-x.background-position-y.background-repeat.background-size.baseline-shift.block-size.border.border-block.border-block-color.border-block-end.border-block-end-color.border-block-end-style.border-block-end-width.border-block-start.border-block-start-color.border-block-start-style.border-block-start-width.border-block-style.border-block-width.border-bottom.border-bottom-color.border-bottom-left-radius.border-bottom-right-radius.border-bottom-style.border-bottom-width.border-collapse.border-color.border-end-end-radius.border-end-start-radius.border-image.border-image-outset.border-image-repeat.border-image-slice.border-image-source.border-image-width.border-inline.border-inline-color.border-inline-end.border-inline-end-color.border-inline-end-style.border-inline-end-width.border-inline-start.border-inline-start-color.border-inline-start-style.border-inline-start-width.border-inline-style.border-inline-width.border-left.border-left-color.border-left-style.border-left-width.border-radius.border-right.border-right-color.border-right-style.border-right-width.border-spacing.border-start-end-radius.border-start-start-radius.border-style.border-top.border-top-color.border-top-left-radius.border-top-right-radius.border-top-style.border-top-width.border-width.bottom.box-align.box-decoration-break.box-direction.box-flex.box-flex-group.box-lines.box-ordinal-group.box-orient.box-pack.box-shadow.box-sizing.break-after.break-before.break-inside.caption-side.caret-color.clear.clip.clip-path.clip-rule.color.color-interpolation.color-interpolation-filters.color-profile.color-rendering.color-scheme.column-count.column-fill.column-gap.column-rule.column-rule-color.column-rule-style.column-rule-width.column-span.column-width.columns.contain.contain-intrinsic-block-size.contain-intrinsic-height.contain-intrinsic-inline-size.contain-intrinsic-size.contain-intrinsic-width.container.container-name.container-type.content.content-visibility.corner-bottom-left-shape.corner-bottom-right-shape.corner-shape.corner-top-left-shape.corner-top-right-shape.counter-increment.counter-reset.counter-set.cue.cue-after.cue-before.cursor.cx.cy.direction.display.dominant-baseline.empty-cells.enable-background.field-sizing.fill.fill-opacity.fill-rule.filter.flex.flex-basis.flex-direction.flex-flow.flex-grow.flex-shrink.flex-wrap.float.flood-color.flood-opacity.flow.font.font-display.font-family.font-feature-settings.font-kerning.font-language-override.font-optical-sizing.font-palette.font-size.font-size-adjust.font-smooth.font-smoothing.font-stretch.font-style.font-synthesis.font-synthesis-position.font-synthesis-small-caps.font-synthesis-style.font-synthesis-weight.font-variant.font-variant-alternates.font-variant-caps.font-variant-east-asian.font-variant-emoji.font-variant-ligatures.font-variant-numeric.font-variant-position.font-variation-settings.font-weight.forced-color-adjust.gap.glyph-orientation-horizontal.glyph-orientation-vertical.grid.grid-area.grid-auto-columns.grid-auto-flow.grid-auto-rows.grid-column.grid-column-end.grid-column-start.grid-gap.grid-row.grid-row-end.grid-row-start.grid-template.grid-template-areas.grid-template-columns.grid-template-rows.hanging-punctuation.height.hyphenate-character.hyphenate-limit-chars.hyphens.icon.image-orientation.image-rendering.image-resolution.ime-mode.initial-letter.initial-letter-align.inline-size.inset.inset-area.inset-block.inset-block-end.inset-block-start.inset-inline.inset-inline-end.inset-inline-start.isolation.justify-content.justify-items.justify-self.kerning.left.letter-spacing.lighting-color.line-break.line-height.line-height-step.list-style.list-style-image.list-style-position.list-style-type.margin.margin-block.margin-block-end.margin-block-start.margin-bottom.margin-inline.margin-inline-end.margin-inline-start.margin-left.margin-right.margin-top.margin-trim.marker.marker-end.marker-mid.marker-start.marks.mask.mask-border.mask-border-mode.mask-border-outset.mask-border-repeat.mask-border-slice.mask-border-source.mask-border-width.mask-clip.mask-composite.mask-image.mask-mode.mask-origin.mask-position.mask-repeat.mask-size.mask-type.masonry-auto-flow.math-depth.math-shift.math-style.max-block-size.max-height.max-inline-size.max-width.min-block-size.min-height.min-inline-size.min-width.mix-blend-mode.nav-down.nav-index.nav-left.nav-right.nav-up.none.normal.object-fit.object-position.offset.offset-anchor.offset-distance.offset-path.offset-position.offset-rotate.opacity.order.orphans.outline.outline-color.outline-offset.outline-style.outline-width.overflow.overflow-anchor.overflow-block.overflow-clip-margin.overflow-inline.overflow-wrap.overflow-x.overflow-y.overlay.overscroll-behavior.overscroll-behavior-block.overscroll-behavior-inline.overscroll-behavior-x.overscroll-behavior-y.padding.padding-block.padding-block-end.padding-block-start.padding-bottom.padding-inline.padding-inline-end.padding-inline-start.padding-left.padding-right.padding-top.page.page-break-after.page-break-before.page-break-inside.paint-order.pause.pause-after.pause-before.perspective.perspective-origin.place-content.place-items.place-self.pointer-events.position.position-anchor.position-visibility.print-color-adjust.quotes.r.resize.rest.rest-after.rest-before.right.rotate.row-gap.ruby-align.ruby-position.scale.scroll-behavior.scroll-margin.scroll-margin-block.scroll-margin-block-end.scroll-margin-block-start.scroll-margin-bottom.scroll-margin-inline.scroll-margin-inline-end.scroll-margin-inline-start.scroll-margin-left.scroll-margin-right.scroll-margin-top.scroll-padding.scroll-padding-block.scroll-padding-block-end.scroll-padding-block-start.scroll-padding-bottom.scroll-padding-inline.scroll-padding-inline-end.scroll-padding-inline-start.scroll-padding-left.scroll-padding-right.scroll-padding-top.scroll-snap-align.scroll-snap-stop.scroll-snap-type.scroll-timeline.scroll-timeline-axis.scroll-timeline-name.scrollbar-color.scrollbar-gutter.scrollbar-width.shape-image-threshold.shape-margin.shape-outside.shape-rendering.speak.speak-as.src.stop-color.stop-opacity.stroke.stroke-dasharray.stroke-dashoffset.stroke-linecap.stroke-linejoin.stroke-miterlimit.stroke-opacity.stroke-width.tab-size.table-layout.text-align.text-align-all.text-align-last.text-anchor.text-combine-upright.text-decoration.text-decoration-color.text-decoration-line.text-decoration-skip.text-decoration-skip-ink.text-decoration-style.text-decoration-thickness.text-emphasis.text-emphasis-color.text-emphasis-position.text-emphasis-style.text-indent.text-justify.text-orientation.text-overflow.text-rendering.text-shadow.text-size-adjust.text-transform.text-underline-offset.text-underline-position.text-wrap.text-wrap-mode.text-wrap-style.timeline-scope.top.touch-action.transform.transform-box.transform-origin.transform-style.transition.transition-behavior.transition-delay.transition-duration.transition-property.transition-timing-function.translate.unicode-bidi.unicode-range.user-modify.user-select.vector-effect.vertical-align.view-timeline.view-timeline-axis.view-timeline-inset.view-timeline-name.view-transition-name.visibility.voice-balance.voice-duration.voice-family.voice-pitch.voice-range.voice-rate.voice-stress.voice-volume.white-space.white-space-collapse.widows.width.will-change.word-break.word-spacing.word-wrap.writing-mode.x.y.z-index.zoom`.split(`.`).sort().reverse();function pi(e){let t=e.regex,n=ai(e),r={begin:/-(webkit|moz|ms|o)-(?=[a-z])/},i=/@-?\w[\w]*(-\w+)*/,a=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{name:`CSS`,case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:`from to`},classNameAliases:{keyframePosition:`selector-tag`},contains:[n.BLOCK_COMMENT,r,n.CSS_NUMBER_MODE,{className:`selector-id`,begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:`selector-class`,begin:`\\.[a-zA-Z-][a-zA-Z0-9_-]*`,relevance:0},n.ATTRIBUTE_SELECTOR_MODE,{className:`selector-pseudo`,variants:[{begin:`:(`+ui.join(`|`)+`)`},{begin:`:(:)?(`+di.join(`|`)+`)`}]},n.CSS_VARIABLE,{className:`attribute`,begin:`\\b(`+fi.join(`|`)+`)\\b`},{begin:/:/,end:/[;}{]/,contains:[n.BLOCK_COMMENT,n.HEXCOLOR,n.IMPORTANT,n.CSS_NUMBER_MODE,n.UNICODE_RANGE,...a,{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:`url data-uri`},contains:[...a,{className:`string`,begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}]},n.FUNCTION_DISPATCH]},{begin:t.lookahead(/@/),end:`[{;]`,relevance:0,illegal:/:/,contains:[{className:`keyword`,begin:i},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:`and or not only`,attribute:li.join(` `)},contains:[{begin:/[a-z-]+(?=:)/,className:`attribute`},...a,n.CSS_NUMBER_MODE]}]},{className:`selector-tag`,begin:`\\b(`+ci.join(`|`)+`)\\b`}]}}function mi(e){let t=e.regex;return{name:`Diff`,aliases:[`patch`],contains:[{className:`meta`,relevance:10,match:t.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^@@ +-\d+ +\+\d+,\d+ +@@/,/^@@ +-\d+,\d+ +\+\d+ +@@/,/^@@ +-\d+ +\+\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/)},{className:`comment`,variants:[{begin:t.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/),end:/$/},{match:/^\*{15}$/}]},{className:`addition`,begin:/^\+/,end:/$/},{className:`deletion`,begin:/^-/,end:/$/},{className:`addition`,begin:/^!/,end:/$/}]}}function hi(e){let t={keyword:[`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`],type:[`bool`,`byte`,`complex64`,`complex128`,`error`,`float32`,`float64`,`int8`,`int16`,`int32`,`int64`,`string`,`uint8`,`uint16`,`uint32`,`uint64`,`int`,`uint`,`uintptr`,`rune`],literal:[`true`,`false`,`iota`,`nil`],built_in:[`append`,`cap`,`close`,`complex`,`copy`,`imag`,`len`,`make`,`new`,`panic`,`print`,`println`,`real`,`recover`,`delete`]};return{name:`Go`,aliases:[`golang`],keywords:t,illegal:`</`,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:`string`,variants:[e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{begin:"`",end:"`"}]},{className:`number`,variants:[{match:/-?\b0[xX]\.[a-fA-F0-9](_?[a-fA-F0-9])*[pP][+-]?\d(_?\d)*i?/,relevance:0},{match:/-?\b0[xX](_?[a-fA-F0-9])+((\.([a-fA-F0-9](_?[a-fA-F0-9])*)?)?[pP][+-]?\d(_?\d)*)?i?/,relevance:0},{match:/-?\b0[oO](_?[0-7])*i?/,relevance:0},{match:/-?\b0[bB](_?[01])*i?/,relevance:0},{match:/-?\.\d(_?\d)*([eE][+-]?\d(_?\d)*)?i?/,relevance:0},{match:/-?\b\d(_?\d)*(\.(\d(_?\d)*)?)?([eE][+-]?\d(_?\d)*)?i?/,relevance:0}]},{begin:/:=/},{className:`function`,beginKeywords:`func`,end:`\\s*(\\{|$)`,excludeEnd:!0,contains:[e.TITLE_MODE,{className:`params`,begin:/\(/,end:/\)/,endsParent:!0,keywords:t,illegal:/["']/}]}]}}var gi=`[A-Za-z$_][0-9A-Za-z$_]*`,_i=`as.in.of.if.for.while.finally.var.new.function.do.return.void.else.break.catch.instanceof.with.throw.case.default.try.switch.continue.typeof.delete.let.yield.const.class.debugger.async.await.static.import.from.export.extends.using`.split(`.`),vi=[`true`,`false`,`null`,`undefined`,`NaN`,`Infinity`],yi=`Object.Function.Boolean.Symbol.Math.Date.Number.BigInt.String.RegExp.Array.Float32Array.Float64Array.Int8Array.Uint8Array.Uint8ClampedArray.Int16Array.Int32Array.Uint16Array.Uint32Array.BigInt64Array.BigUint64Array.Set.Map.WeakSet.WeakMap.ArrayBuffer.SharedArrayBuffer.Atomics.DataView.JSON.Promise.Generator.GeneratorFunction.AsyncFunction.Reflect.Proxy.Intl.WebAssembly`.split(`.`),bi=[`Error`,`EvalError`,`InternalError`,`RangeError`,`ReferenceError`,`SyntaxError`,`TypeError`,`URIError`],xi=[`setInterval`,`setTimeout`,`clearInterval`,`clearTimeout`,`require`,`exports`,`eval`,`isFinite`,`isNaN`,`parseFloat`,`parseInt`,`decodeURI`,`decodeURIComponent`,`encodeURI`,`encodeURIComponent`,`escape`,`unescape`],Si=[`arguments`,`this`,`super`,`console`,`window`,`document`,`localStorage`,`sessionStorage`,`module`,`self`,`global`],Ci=[].concat(xi,yi,bi);function wi(e){let t=e.regex,n=(e,{after:t})=>{let n=`</`+e[0].slice(1);return e.input.indexOf(n,t)!==-1},r=gi,i={begin:`<>`,end:`</>`},a=/<[A-Za-z0-9\\._:-]+\s*\/>/,o={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,t)=>{let r=e[0].length+e.index,i=e.input[r];if(i===`<`||i===`,`){t.ignoreMatch();return}i===`>`&&(n(e,{after:r})||t.ignoreMatch());let a,o=e.input.substring(r);if(a=o.match(/^\s*=/)){t.ignoreMatch();return}if((a=o.match(/^\s+extends\s+/))&&a.index===0){t.ignoreMatch();return}}},s={$pattern:gi,keyword:_i,literal:vi,built_in:Ci,"variable.language":Si},c=`[0-9](_?[0-9])*`,l=`\\.(${c})`,u=`0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`,d={className:`number`,variants:[{begin:`(\\b(${u})((${l})|\\.)?|(${l}))[eE][+-]?(${c})\\b`},{begin:`\\b(${u})\\b((${l})\\b|\\.)?|(${l})\\b`},{begin:`\\b(0|[1-9](_?[0-9])*)n\\b`},{begin:`\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b`},{begin:`\\b0[bB][0-1](_?[0-1])*n?\\b`},{begin:`\\b0[oO][0-7](_?[0-7])*n?\\b`},{begin:`\\b0[0-7]+n?\\b`}],relevance:0},f={className:`subst`,begin:`\\$\\{`,end:`\\}`,keywords:s,contains:[]},p={begin:".?html`",end:``,starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,f],subLanguage:`xml`}},m={begin:".?css`",end:``,starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,f],subLanguage:`css`}},h={begin:".?gql`",end:``,starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,f],subLanguage:`graphql`}},g={className:`string`,begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,f]},_={className:`comment`,variants:[e.COMMENT(/\/\*\*(?!\/)/,`\\*/`,{relevance:0,contains:[{begin:`(?=@[A-Za-z]+)`,relevance:0,contains:[{className:`doctag`,begin:`@[A-Za-z]+`},{className:`type`,begin:`\\{`,end:`\\}`,excludeEnd:!0,excludeBegin:!0,relevance:0},{className:`variable`,begin:r+`(?=\\s*(-)|$)`,endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},v=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,p,m,h,g,{match:/\$\d+/},d];f.contains=v.concat({begin:/\{/,end:/\}/,keywords:s,contains:[`self`].concat(v)});let y=[].concat(_,f.contains),b=y.concat([{begin:/(\s*)\(/,end:/\)/,keywords:s,contains:[`self`].concat(y)}]),x={className:`params`,begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:b},S={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,t.concat(r,`(`,t.concat(/\./,r),`)*`)],scope:{1:`keyword`,3:`title.class`,5:`keyword`,7:`title.class.inherited`}},{match:[/class/,/\s+/,r],scope:{1:`keyword`,3:`title.class`}}]},C={relevance:0,match:t.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:`title.class`,keywords:{_:[...yi,...bi]}},w={label:`use_strict`,className:`meta`,relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},T={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:`keyword`,3:`title.function`},label:`func.def`,contains:[x],illegal:/%/},E={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:`variable.constant`};function D(e){return t.concat(`(?!`,e.join(`|`),`)`)}let O={match:t.concat(/\b/,D([...xi,`super`,`import`,`await`].map(e=>`${e}\\s*\\(`)),r,t.lookahead(/\s*\(/)),className:`title.function`,relevance:0},k={begin:t.concat(/\./,t.lookahead(t.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:`prototype`,className:`property`,relevance:0},A={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:`keyword`,3:`title.function`},contains:[{begin:/\(\)/},x]},ee=`(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|`+e.UNDERSCORE_IDENT_RE+`)\\s*=>`,j={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,t.lookahead(ee)],keywords:`async`,className:{1:`keyword`,3:`title.function`},contains:[x]};return{name:`JavaScript`,aliases:[`js`,`jsx`,`mjs`,`cjs`],keywords:s,exports:{PARAMS_CONTAINS:b,CLASS_REFERENCE:C},illegal:/#(?![$_A-Za-z])/,contains:[e.SHEBANG({label:`shebang`,binary:`node`,relevance:5}),w,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,p,m,h,g,_,{match:/\$\d+/},d,C,{scope:`attr`,match:r+t.lookahead(`:`),relevance:0},j,{begin:`(`+e.RE_STARTERS_RE+`|\\b(case|return|throw)\\b)\\s*`,keywords:`return throw case`,relevance:0,contains:[_,e.REGEXP_MODE,{className:`function`,begin:ee,returnBegin:!0,end:`\\s*=>`,contains:[{className:`params`,variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:b}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:i.begin,end:i.end},{match:a},{begin:o.begin,"on:begin":o.isTrulyOpeningTag,end:o.end}],subLanguage:`xml`,contains:[{begin:o.begin,end:o.end,skip:!0,contains:[`self`]}]}]},T,{beginKeywords:`while if switch catch for`},{begin:`\\b(?!function)`+e.UNDERSCORE_IDENT_RE+`\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{`,returnBegin:!0,label:`func.def`,contains:[x,e.inherit(e.TITLE_MODE,{begin:r,className:`title.function`})]},{match:/\.\.\./,relevance:0},k,{match:`\\$`+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:`title.function`},contains:[x]},O,E,S,A,{match:/\$[(.]/}]}}var Ti={scope:`number`,match:`([-+]?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)|NaN|[-+]?Infinity`,relevance:0};function Ei(e){let t={className:`attr`,begin:/(("(\\.|[^\\"\r\n])*")|('(\\.|[^\\'\r\n])*'))(?=\s*:)/,relevance:1.01},n={match:/[{}[\],:]/,className:`punctuation`,relevance:0},r=[`true`,`false`,`null`],i={scope:`literal`,beginKeywords:r.join(` `)};return{name:`JSON`,aliases:[`jsonc`,`json5`],keywords:{literal:r},contains:[t,n,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,Ti,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],illegal:`\\S`}}function Di(e){let t=e.regex,n={begin:/<\/?[A-Za-z_]/,end:`>`,subLanguage:`xml`,relevance:0},r={match:/^ {0,3}([-*_])[ \t]*(?:\1[ \t]*){2,}$/},i={className:`code`,variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:`(~{3,})[^~](.|\\n)*?\\1~*[ ]*`},{begin:"```",end:"```+[ ]*$"},{begin:`~~~`,end:`~~~+[ ]*$`},{begin:"`.+?`"},{begin:`(?=^( {4}|\\t))`,contains:[{begin:`^( {4}|\\t)`,end:`(\\n)$`}],relevance:0}]},a={className:`bullet`,begin:`^[ ]*([*+-]|(\\d+\\.))(?=\\s+)`,end:`\\s+`,excludeEnd:!0},o={begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:`symbol`,begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:`link`,begin:/:\s*/,end:/$/,excludeBegin:!0}]},s={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:t.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:`string`,relevance:0,begin:`\\[`,end:`\\]`,excludeBegin:!0,returnEnd:!0},{className:`link`,relevance:0,begin:`\\]\\(`,end:`\\)`,excludeBegin:!0,excludeEnd:!0},{className:`symbol`,relevance:0,begin:`\\]\\[`,end:`\\]`,excludeBegin:!0,excludeEnd:!0}]},c={className:`strong`,contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},l={className:`emphasis`,contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},u=e.inherit(c,{contains:[]}),d=e.inherit(l,{contains:[]});c.contains.push(d),l.contains.push(u);let f=[n,s];return[c,l,u,d].forEach(e=>{e.contains=e.contains.concat(f)}),f=f.concat(c,l),{name:`Markdown`,aliases:[`md`,`mkdown`,`mkd`],contains:[{className:`section`,variants:[{begin:`^#{1,6}`,end:`$`,contains:f},{begin:`(?=^.+?\\n[=-]{2,}$)`,contains:[{begin:`^[=-]*$`},{begin:`^`,end:`\\n`,contains:f}]}]},n,a,r,c,l,{className:`quote`,begin:`^>\\s+`,contains:f,end:`$`},i,s,o,{scope:`literal`,match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}function Oi(e){let t=e.regex,n=/[\p{XID_Start}_]\p{XID_Continue}*/u,r=`and.as.assert.async.await.break.case.class.continue.def.del.elif.else.except.finally.for.from.global.if.import.in.is.lambda.lazy.match.nonlocal|10.not.or.pass.raise.return.try.while.with.yield`.split(`.`),i={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:r,built_in:`__import__.abs.aiter.all.anext.any.ascii.bin.bool.breakpoint.bytearray.bytes.callable.chr.classmethod.compile.complex.delattr.dict.dir.divmod.enumerate.eval.exec.filter.float.format.frozendict.frozenset.getattr.globals.hasattr.hash.help.hex.id.input.int.isinstance.issubclass.iter.len.list.locals.map.max.memoryview.min.next.object.oct.open.ord.pow.print.property.range.repr.reversed.round.sentinel.set.setattr.slice.sorted.staticmethod.str.sum.super.tuple.type.vars.zip`.split(`.`),literal:[`__debug__`,`Ellipsis`,`False`,`None`,`NotImplemented`,`True`],type:[`Any`,`Callable`,`Coroutine`,`Dict`,`List`,`Literal`,`Generic`,`Optional`,`Sequence`,`Set`,`Tuple`,`Type`,`Union`]},a={className:`meta`,begin:/^(>>>|\.\.\.) /},o={className:`subst`,begin:/\{/,end:/\}/,keywords:i,illegal:/#/},s={begin:/\{\{/,relevance:0},c={className:`string`,contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/([fFtT][rR]|[rR][fFtT]|[fFtT])'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,o]},{begin:/([fFtT][rR]|[rR][fFtT]|[fFtT])"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,o]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fFtT][rR]|[rR][fFtT]|[fFtT])'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,o]},{begin:/([fFtT][rR]|[rR][fFtT]|[fFtT])"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,o]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l=`[0-9](_?[0-9])*`,u=`(\\b(${l}))?\\.(${l})|\\b(${l})\\.`,d=`\\b|${r.join(`|`)}`,f={className:`number`,relevance:0,variants:[{begin:`(\\b(${l})|(${u}))[eE][+-]?(${l})[jJ]?(?=${d})`},{begin:`(${u})[jJ]?`},{begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${d})`},{begin:`\\b0[bB](_?[01])+[lL]?(?=${d})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${d})`},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${d})`},{begin:`\\b(${l})[jJ](?=${d})`}]},p={className:`comment`,begin:t.lookahead(/# type:/),end:/$/,keywords:i,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={className:`params`,variants:[{className:``,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:i,contains:[`self`,a,f,c,e.HASH_COMMENT_MODE]}]};return o.contains=[c,f,a],{name:`Python`,aliases:[`py`,`gyp`,`ipython`],unicodeRegex:!0,keywords:i,illegal:/(<\/|\?)|=>/,contains:[a,f,{scope:`variable.language`,match:/\bself\b/},{beginKeywords:`if`,relevance:0},{match:/\bor\b/,scope:`keyword`},c,p,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,n],scope:{1:`keyword`,3:`title.function`},contains:[m]},{variants:[{match:[/\bclass/,/\s+/,n,/\s*/,/\(\s*/,n,/\s*\)/]},{match:[/\bclass/,/\s+/,n]}],scope:{1:`keyword`,3:`title.class`,6:`title.class.inherited`}},{className:`meta`,begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[f,m,c]}]}}function ki(e){let t=e.regex,n=/(r#)?/,r=t.concat(n,e.UNDERSCORE_IDENT_RE),i=t.concat(n,e.IDENT_RE),a={scope:`title.function.invoke`,relevance:0,begin:t.concat(/\b/,/(?!(?:let|for|while|if|else|match)\b)/,i,t.lookahead(/\s*\(/))},o=`([ui](8|16|32|64|128|size)|f(16|32|64|128))?`,s=`abstract.as.async.await.become.box.break.const.continue.crate.do.dyn.else.enum.extern.false.final.fn.for.if.impl.in.let.loop.macro.match.mod.move.mut.override.priv.pub.raw.ref.return.self.Self.static.struct.super.trait.true.try.type.typeof.union.unsafe.unsized.use.virtual.where.while.yield`.split(`.`),c=[`true`,`false`,`Some`,`None`,`Ok`,`Err`],l=`drop .Copy.Send.Sized.Sync.Drop.Fn.FnMut.FnOnce.ToOwned.Clone.Debug.PartialEq.PartialOrd.Eq.Ord.AsRef.AsMut.Into.From.Default.Iterator.Extend.IntoIterator.DoubleEndedIterator.ExactSizeIterator.SliceConcatExt.ToString.assert!.assert_eq!.bitflags!.bytes!.cfg!.col!.concat!.concat_idents!.debug_assert!.debug_assert_eq!.env!.eprintln!.panic!.file!.format!.format_args!.include_bytes!.include_str!.line!.local_data_key!.module_path!.option_env!.print!.println!.select!.stringify!.try!.unimplemented!.unreachable!.vec!.write!.writeln!.macro_rules!.assert_ne!.debug_assert_ne!`.split(`.`),u=[`i8`,`i16`,`i32`,`i64`,`i128`,`isize`,`u8`,`u16`,`u32`,`u64`,`u128`,`usize`,`f16`,`f32`,`f64`,`f128`,`str`,`char`,`bool`,`Box`,`Option`,`Result`,`String`,`Vec`];return{name:`Rust`,aliases:[`rs`],keywords:{$pattern:e.IDENT_RE+`!?`,type:u,keyword:s,literal:c,built_in:l},illegal:`</`,contains:[e.C_LINE_COMMENT_MODE,e.COMMENT(`/\\*`,`\\*/`,{contains:[`self`]}),e.inherit(e.QUOTE_STRING_MODE,{begin:/b?"/,illegal:null}),{scope:`symbol`,begin:/'[a-zA-Z_][a-zA-Z0-9_]*(?!')/},{scope:`string`,variants:[{begin:/b?r(#*)"(.|\n)*?"\1(?!#)/},{begin:/b?'/,end:/'/,contains:[{scope:`char.escape`,match:/\\('|"|\\|\w|x\w{2}|u\w{4}|U\w{8})/}]}]},{scope:`number`,variants:[{begin:`\\b0b([01_]+)`+o},{begin:`\\b0o([0-7_]+)`+o},{begin:`\\b0x([A-Fa-f0-9_]+)`+o},{begin:`\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)`+o}],relevance:0},{begin:[/\bsafe/,/\s+/,/extern/],scope:{1:`keyword`,3:`keyword`}},{begin:[/fn/,/\s+/,r],scope:{1:`keyword`,3:`title.function`}},{scope:`meta`,begin:`#!?\\[`,end:`\\]`,contains:[{scope:`string`,begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE]}]},{begin:[/let/,/\s+/,/(?:mut\s+)?/,r],scope:{1:`keyword`,3:`keyword`,4:`variable`}},{begin:[/for/,/\s+/,r,/\s+/,/in/],scope:{1:`keyword`,3:`variable`,5:`keyword`}},{begin:[/type/,/\s+/,r],scope:{1:`keyword`,3:`title.class`}},{begin:[/(?:trait|enum|struct|union|impl|for)/,/\s+/,r],scope:{1:`keyword`,3:`title.class`}},{begin:e.IDENT_RE+`::`,keywords:{keyword:`Self`,built_in:l,type:u}},{scope:`punctuation`,begin:`->`},a]}}function Ai(e){return{name:`Shell Session`,aliases:[`console`,`shellsession`],contains:[{className:`meta.prompt`,begin:/^\s{0,3}[./~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,subLanguage:`bash`}}]}}function ji(e){let t=e.regex,n=e.COMMENT(`--`,`$`),r={scope:`string`,variants:[{begin:/'/,end:/'/,contains:[{match:/''/}]}]},i={begin:/"/,end:/"/,contains:[{match:/""/}]},a=[`true`,`false`,`unknown`],o=[`double precision`,`large object`,`with timezone`,`without timezone`],s=`bigint.binary.blob.boolean.char.character.clob.date.dec.decfloat.decimal.float.int.integer.interval.nchar.nclob.national.numeric.real.row.smallint.time.timestamp.varchar.varying.varbinary`.split(`.`),c=[`add`,`asc`,`collation`,`desc`,`final`,`first`,`last`,`view`],l=`abs.acos.all.allocate.alter.and.any.are.array.array_agg.array_max_cardinality.as.asensitive.asin.asymmetric.at.atan.atomic.authorization.avg.begin.begin_frame.begin_partition.between.bigint.binary.blob.boolean.both.by.call.called.cardinality.cascaded.case.cast.ceil.ceiling.char.char_length.character.character_length.check.classifier.clob.close.coalesce.collate.collect.column.commit.condition.connect.constraint.contains.convert.copy.corr.corresponding.cos.cosh.count.covar_pop.covar_samp.create.cross.cube.cume_dist.current.current_catalog.current_date.current_default_transform_group.current_path.current_role.current_row.current_schema.current_time.current_timestamp.current_path.current_role.current_transform_group_for_type.current_user.cursor.cycle.date.day.deallocate.dec.decimal.decfloat.declare.default.define.delete.dense_rank.deref.describe.deterministic.disconnect.distinct.double.drop.dynamic.each.element.else.empty.end.end_frame.end_partition.end-exec.equals.escape.every.except.exec.execute.exists.exp.external.extract.false.fetch.filter.first_value.float.floor.for.foreign.frame_row.free.from.full.function.fusion.get.global.grant.group.grouping.groups.having.hold.hour.identity.in.indicator.initial.inner.inout.insensitive.insert.int.integer.intersect.intersection.interval.into.is.join.json_array.json_arrayagg.json_exists.json_object.json_objectagg.json_query.json_table.json_table_primitive.json_value.lag.language.large.last_value.lateral.lead.leading.left.like.like_regex.listagg.ln.local.localtime.localtimestamp.log.log10.lower.match.match_number.match_recognize.matches.max.member.merge.method.min.minute.mod.modifies.module.month.multiset.national.natural.nchar.nclob.new.no.none.normalize.not.nth_value.ntile.null.nullif.numeric.octet_length.occurrences_regex.of.offset.old.omit.on.one.only.open.or.order.out.outer.over.overlaps.overlay.parameter.partition.pattern.per.percent.percent_rank.percentile_cont.percentile_disc.period.portion.position.position_regex.power.precedes.precision.prepare.primary.procedure.ptf.range.rank.reads.real.recursive.ref.references.referencing.regr_avgx.regr_avgy.regr_count.regr_intercept.regr_r2.regr_slope.regr_sxx.regr_sxy.regr_syy.release.result.return.returns.revoke.right.rollback.rollup.row.row_number.rows.running.savepoint.scope.scroll.search.second.seek.select.sensitive.session_user.set.show.similar.sin.sinh.skip.smallint.some.specific.specifictype.sql.sqlexception.sqlstate.sqlwarning.sqrt.start.static.stddev_pop.stddev_samp.submultiset.subset.substring.substring_regex.succeeds.sum.symmetric.system.system_time.system_user.table.tablesample.tan.tanh.then.time.timestamp.timezone_hour.timezone_minute.to.trailing.translate.translate_regex.translation.treat.trigger.trim.trim_array.true.truncate.uescape.union.unique.unknown.unnest.update.upper.user.using.value.values.value_of.var_pop.var_samp.varbinary.varchar.varying.versioning.when.whenever.where.width_bucket.window.with.within.without.year`.split(`.`),u=`abs.acos.array_agg.asin.atan.avg.cast.ceil.ceiling.coalesce.corr.cos.cosh.count.covar_pop.covar_samp.cume_dist.dense_rank.deref.element.exp.extract.first_value.floor.json_array.json_arrayagg.json_exists.json_object.json_objectagg.json_query.json_table.json_table_primitive.json_value.lag.last_value.lead.listagg.ln.log.log10.lower.max.min.mod.nth_value.ntile.nullif.percent_rank.percentile_cont.percentile_disc.position.position_regex.power.rank.regr_avgx.regr_avgy.regr_count.regr_intercept.regr_r2.regr_slope.regr_sxx.regr_sxy.regr_syy.row_number.sin.sinh.sqrt.stddev_pop.stddev_samp.substring.substring_regex.sum.tan.tanh.translate.translate_regex.treat.trim.trim_array.unnest.upper.value_of.var_pop.var_samp.width_bucket`.split(`.`),d=[`current_catalog`,`current_date`,`current_default_transform_group`,`current_path`,`current_role`,`current_schema`,`current_transform_group_for_type`,`current_user`,`session_user`,`system_time`,`system_user`,`current_time`,`localtime`,`current_timestamp`,`localtimestamp`],f=[`create table`,`insert into`,`primary key`,`foreign key`,`not null`,`alter table`,`add constraint`,`grouping sets`,`on overflow`,`character set`,`respect nulls`,`ignore nulls`,`nulls first`,`nulls last`,`depth first`,`breadth first`],p=u,m=[...l,...c].filter(e=>!u.includes(e)),h={scope:`variable`,match:/@[a-z0-9][a-z0-9_]*/},g={scope:`operator`,match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0},_={match:t.concat(/\b/,t.either(...p),/\s*\(/),relevance:0,keywords:{built_in:p}};function v(e){return t.concat(/\b/,t.either(...e.map(e=>e.replace(/\s+/,`\\s+`))),/\b/)}let y={scope:`keyword`,match:v(f),relevance:0};function b(e,{exceptions:t,when:n}={}){let r=n;return t||=[],e.map(e=>e.match(/\|\d+$/)||t.includes(e)?e:r(e)?`${e}|0`:e)}return{name:`SQL`,case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:b(m,{when:e=>e.length<3}),literal:a,type:s,built_in:d},contains:[{scope:`type`,match:v(o)},y,_,h,r,i,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,n,g]}}var Mi=`[A-Za-z$_][0-9A-Za-z$_]*`,Ni=`as.in.of.if.for.while.finally.var.new.function.do.return.void.else.break.catch.instanceof.with.throw.case.default.try.switch.continue.typeof.delete.let.yield.const.class.debugger.async.await.static.import.from.export.extends.using`.split(`.`),Pi=[`true`,`false`,`null`,`undefined`,`NaN`,`Infinity`],Fi=`Object.Function.Boolean.Symbol.Math.Date.Number.BigInt.String.RegExp.Array.Float32Array.Float64Array.Int8Array.Uint8Array.Uint8ClampedArray.Int16Array.Int32Array.Uint16Array.Uint32Array.BigInt64Array.BigUint64Array.Set.Map.WeakSet.WeakMap.ArrayBuffer.SharedArrayBuffer.Atomics.DataView.JSON.Promise.Generator.GeneratorFunction.AsyncFunction.Reflect.Proxy.Intl.WebAssembly`.split(`.`),Ii=[`Error`,`EvalError`,`InternalError`,`RangeError`,`ReferenceError`,`SyntaxError`,`TypeError`,`URIError`],Li=[`setInterval`,`setTimeout`,`clearInterval`,`clearTimeout`,`require`,`exports`,`eval`,`isFinite`,`isNaN`,`parseFloat`,`parseInt`,`decodeURI`,`decodeURIComponent`,`encodeURI`,`encodeURIComponent`,`escape`,`unescape`],Ri=[`arguments`,`this`,`super`,`console`,`window`,`document`,`localStorage`,`sessionStorage`,`module`,`self`,`global`],zi=[].concat(Li,Fi,Ii);function Bi(e){let t=e.regex,n=(e,{after:t})=>{let n=`</`+e[0].slice(1);return e.input.indexOf(n,t)!==-1},r=Mi,i={begin:`<>`,end:`</>`},a=/<[A-Za-z0-9\\._:-]+\s*\/>/,o={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,t)=>{let r=e[0].length+e.index,i=e.input[r];if(i===`<`||i===`,`){t.ignoreMatch();return}i===`>`&&(n(e,{after:r})||t.ignoreMatch());let a,o=e.input.substring(r);if(a=o.match(/^\s*=/)){t.ignoreMatch();return}if((a=o.match(/^\s+extends\s+/))&&a.index===0){t.ignoreMatch();return}}},s={$pattern:Mi,keyword:Ni,literal:Pi,built_in:zi,"variable.language":Ri},c=`[0-9](_?[0-9])*`,l=`\\.(${c})`,u=`0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`,d={className:`number`,variants:[{begin:`(\\b(${u})((${l})|\\.)?|(${l}))[eE][+-]?(${c})\\b`},{begin:`\\b(${u})\\b((${l})\\b|\\.)?|(${l})\\b`},{begin:`\\b(0|[1-9](_?[0-9])*)n\\b`},{begin:`\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b`},{begin:`\\b0[bB][0-1](_?[0-1])*n?\\b`},{begin:`\\b0[oO][0-7](_?[0-7])*n?\\b`},{begin:`\\b0[0-7]+n?\\b`}],relevance:0},f={className:`subst`,begin:`\\$\\{`,end:`\\}`,keywords:s,contains:[]},p={begin:".?html`",end:``,starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,f],subLanguage:`xml`}},m={begin:".?css`",end:``,starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,f],subLanguage:`css`}},h={begin:".?gql`",end:``,starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,f],subLanguage:`graphql`}},g={className:`string`,begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,f]},_={className:`comment`,variants:[e.COMMENT(/\/\*\*(?!\/)/,`\\*/`,{relevance:0,contains:[{begin:`(?=@[A-Za-z]+)`,relevance:0,contains:[{className:`doctag`,begin:`@[A-Za-z]+`},{className:`type`,begin:`\\{`,end:`\\}`,excludeEnd:!0,excludeBegin:!0,relevance:0},{className:`variable`,begin:r+`(?=\\s*(-)|$)`,endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},v=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,p,m,h,g,{match:/\$\d+/},d];f.contains=v.concat({begin:/\{/,end:/\}/,keywords:s,contains:[`self`].concat(v)});let y=[].concat(_,f.contains),b=y.concat([{begin:/(\s*)\(/,end:/\)/,keywords:s,contains:[`self`].concat(y)}]),x={className:`params`,begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:b},S={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,t.concat(r,`(`,t.concat(/\./,r),`)*`)],scope:{1:`keyword`,3:`title.class`,5:`keyword`,7:`title.class.inherited`}},{match:[/class/,/\s+/,r],scope:{1:`keyword`,3:`title.class`}}]},C={relevance:0,match:t.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:`title.class`,keywords:{_:[...Fi,...Ii]}},w={label:`use_strict`,className:`meta`,relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},T={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:`keyword`,3:`title.function`},label:`func.def`,contains:[x],illegal:/%/},E={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:`variable.constant`};function D(e){return t.concat(`(?!`,e.join(`|`),`)`)}let O={match:t.concat(/\b/,D([...Li,`super`,`import`,`await`].map(e=>`${e}\\s*\\(`)),r,t.lookahead(/\s*\(/)),className:`title.function`,relevance:0},k={begin:t.concat(/\./,t.lookahead(t.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:`prototype`,className:`property`,relevance:0},A={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:`keyword`,3:`title.function`},contains:[{begin:/\(\)/},x]},ee=`(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|`+e.UNDERSCORE_IDENT_RE+`)\\s*=>`,j={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,t.lookahead(ee)],keywords:`async`,className:{1:`keyword`,3:`title.function`},contains:[x]};return{name:`JavaScript`,aliases:[`js`,`jsx`,`mjs`,`cjs`],keywords:s,exports:{PARAMS_CONTAINS:b,CLASS_REFERENCE:C},illegal:/#(?![$_A-Za-z])/,contains:[e.SHEBANG({label:`shebang`,binary:`node`,relevance:5}),w,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,p,m,h,g,_,{match:/\$\d+/},d,C,{scope:`attr`,match:r+t.lookahead(`:`),relevance:0},j,{begin:`(`+e.RE_STARTERS_RE+`|\\b(case|return|throw)\\b)\\s*`,keywords:`return throw case`,relevance:0,contains:[_,e.REGEXP_MODE,{className:`function`,begin:ee,returnBegin:!0,end:`\\s*=>`,contains:[{className:`params`,variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,contains:b}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:i.begin,end:i.end},{match:a},{begin:o.begin,"on:begin":o.isTrulyOpeningTag,end:o.end}],subLanguage:`xml`,contains:[{begin:o.begin,end:o.end,skip:!0,contains:[`self`]}]}]},T,{beginKeywords:`while if switch catch for`},{begin:`\\b(?!function)`+e.UNDERSCORE_IDENT_RE+`\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{`,returnBegin:!0,label:`func.def`,contains:[x,e.inherit(e.TITLE_MODE,{begin:r,className:`title.function`})]},{match:/\.\.\./,relevance:0},k,{match:`\\$`+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:`title.function`},contains:[x]},O,E,S,A,{match:/\$[(.]/}]}}function Vi(e){let t=e.regex,n=Bi(e),r=Mi,i=[`any`,`void`,`number`,`boolean`,`string`,`object`,`never`,`symbol`,`bigint`,`unknown`],a={begin:[/namespace/,/\s+/,e.IDENT_RE],beginScope:{1:`keyword`,3:`title.class`}},o={beginKeywords:`interface`,end:/\{/,excludeEnd:!0,keywords:{keyword:`interface extends`,built_in:i},contains:[n.exports.CLASS_REFERENCE]},s={className:`meta`,relevance:10,begin:/^\s*['"]use strict['"]/},c={$pattern:Mi,keyword:Ni.concat([`type`,`interface`,`public`,`private`,`protected`,`implements`,`declare`,`abstract`,`readonly`,`enum`,`override`,`satisfies`]),literal:Pi,built_in:zi.concat(i),"variable.language":Ri},l={className:`meta`,begin:`@`+r},u=(e,t,n)=>{let r=e.contains.findIndex(e=>e.label===t);if(r===-1)throw Error(`can not find mode to replace`);e.contains.splice(r,1,n)};Object.assign(n.keywords,c),n.exports.PARAMS_CONTAINS.push(l);let d=n.contains.find(e=>e.scope===`attr`),f=Object.assign({},d,{match:t.concat(r,t.lookahead(/\s*\?:/))});n.exports.PARAMS_CONTAINS.push([n.exports.CLASS_REFERENCE,d,f]),n.contains=n.contains.concat([l,a,o,f]),u(n,`shebang`,e.SHEBANG()),u(n,`use_strict`,s);let p=n.contains.find(e=>e.label===`func.def`);return p.relevance=0,Object.assign(n,{name:`TypeScript`,aliases:[`ts`,`tsx`,`mts`,`cts`]}),n}function Hi(e){let t=e.regex,n=t.concat(/[\p{L}_]/u,t.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),r=/[\p{L}0-9._:-]+/u,i={className:`symbol`,begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},a={begin:/\s/,contains:[{className:`keyword`,begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},o=e.inherit(a,{begin:/\(/,end:/\)/}),s=e.inherit(e.APOS_STRING_MODE,{className:`string`}),c=e.inherit(e.QUOTE_STRING_MODE,{className:`string`}),l={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:`attr`,begin:r,relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:`string`,endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[i]},{begin:/'/,end:/'/,contains:[i]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:`HTML, XML`,aliases:[`html`,`xhtml`,`rss`,`atom`,`xjb`,`xsd`,`xsl`,`plist`,`wsf`,`svg`],case_insensitive:!0,unicodeRegex:!0,contains:[{className:`meta`,begin:/<![a-z]/,end:/>/,relevance:10,contains:[a,c,s,o,{begin:/\[/,end:/\]/,contains:[{className:`meta`,begin:/<![a-z]/,end:/>/,contains:[a,o,c,s]}]}]},e.COMMENT(/<!--/,/-->/,{relevance:10}),{begin:/<!\[CDATA\[/,end:/\]\]>/,relevance:10},i,{className:`meta`,end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[c]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:`tag`,begin:/<style(?=\s|>)/,end:/>/,keywords:{name:`style`},contains:[l],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:`css`}},{className:`tag`,begin:/<script(?=\s|>)/,end:/>/,keywords:{name:`script`},contains:[l],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:`javascript`}},{className:`tag`,begin:/<>|<\/>/},{className:`tag`,begin:t.concat(/</,t.lookahead(t.concat(n,t.either(/\/>/,/>/,/\s/)))),end:/\/?>/,contains:[{className:`name`,begin:n,relevance:0,starts:l}]},{className:`tag`,begin:t.concat(/<\//,t.lookahead(t.concat(n,/>/))),contains:[{className:`name`,begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}function Ui(e){let t=`true false yes no null`,n=`[\\w#;/?:@&=+$,.~*'()[\\]]+`,r={className:`attr`,variants:[{begin:/[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/},{begin:/"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/},{begin:/'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/}]},i={className:`template-variable`,variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]},a={className:`string`,relevance:0,begin:/'/,end:/'/,contains:[{match:/''/,scope:`char.escape`,relevance:0}]},o={className:`string`,relevance:0,variants:[{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,i]},s=e.inherit(o,{variants:[{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),c={className:`number`,begin:`\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b`},l={end:`,`,endsWithParent:!0,excludeEnd:!0,keywords:t,relevance:0},u={begin:/\{/,end:/\}/,contains:[l],illegal:`\\n`,relevance:0},d={begin:`\\[`,end:`\\]`,contains:[l],illegal:`\\n`,relevance:0},f=[r,{className:`meta`,begin:`^---\\s*$`,relevance:10},{className:`string`,begin:`[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*`},{begin:`<%[%=-]?`,end:`[%-]?%>`,subLanguage:`ruby`,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:`type`,begin:`!\\w+!`+n},{className:`type`,begin:`!<`+n+`>`},{className:`type`,begin:`!`+n},{className:`type`,begin:`!!`+n},{className:`meta`,begin:`&`+e.UNDERSCORE_IDENT_RE+`$`},{className:`meta`,begin:`\\*`+e.UNDERSCORE_IDENT_RE+`$`},{className:`bullet`,begin:`-(?=[ ]|$)`,relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:t,keywords:{literal:t}},c,{className:`number`,begin:e.C_NUMBER_RE+`\\b`,relevance:0},u,d,a,o],p=[...f];return p.pop(),p.push(s),l.contains=p,{name:`YAML`,case_insensitive:!0,aliases:[`yml`],contains:f}}for(let[e,t]of Object.entries({bash:ii,css:pi,diff:mi,go:hi,javascript:wi,json:Ei,markdown:Di,python:Oi,rust:ki,shell:Ai,sql:ji,typescript:Vi,xml:Hi,yaml:Ui}))ri.registerLanguage(e,t);function Wi(e){for(let t of e.querySelectorAll(`pre code[class]`)){let e=/(?:language|lang)-(\S+)/.exec(t.className)?.[1]?.toLowerCase();!e||!ri.getLanguage(e)||(t.innerHTML=ri.highlight(t.textContent??``,{language:e}).value)}}var Gi={ts:`typescript`,tsx:`typescript`,mts:`typescript`,cts:`typescript`,js:`javascript`,jsx:`javascript`,mjs:`javascript`,cjs:`javascript`,py:`python`,rs:`rust`,sh:`bash`,zsh:`bash`,md:`markdown`,yml:`yaml`,html:`xml`,htm:`xml`,svg:`xml`,patch:`diff`};function Ki(e){let t=e.split(`.`).pop()?.toLowerCase()??``,n=Gi[t]??t;return ri.getLanguage(n)?n:null}function qi(e,t){let n=document.createElement(`span`);return t&&e.length<=500?n.innerHTML=ri.highlight(e,{language:t}).value:n.textContent=e,n}var Ji=null,Yi=`max-w-full cursor-pointer break-words rounded-full border border-indigo-200 bg-indigo-50 px-2.5 py-0.5 text-left text-[12.5px] text-indigo-700 transition-colors hover:border-indigo-300 hover:bg-indigo-100`;function Xi(){Ji=null}function Zi(e,t,n){if(Ji?.remove(),Ji=null,!t.length)return;let r=K(`div`,`mt-1.5 flex flex-wrap gap-1.5`);for(let e of t){let t=K(`button`,Yi,e);t.type=`button`,t.onclick=()=>{Ji===r&&(Ji=null),r.remove(),n(e)},r.append(t)}e.append(r),Ji=r}var Qi=8e3,$i=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`],ea,ta;function na(e,t){ea=e,ta=t}var ra={queued:`border-amber-200 bg-amber-50 text-amber-800`,running:`border-green-200 bg-green-50 text-green-800`,succeeded:`border-neutral-200 bg-neutral-50 text-neutral-600`,failed:`border-red-200 bg-red-50 text-red-700`,cancelled:`border-neutral-200 bg-neutral-50 text-neutral-500`,interrupted:`border-amber-200 bg-amber-50 text-amber-800`,skipped:`border-neutral-200 bg-neutral-50 text-neutral-500`},ia=new Map;async function aa(e){let t=await e;t.sent&&t.error&&ta.append(`error`,t.error)}async function oa(e,t){try{let n=await fetch(e,{method:`POST`});n.ok||ta.append(`error`,await T(n,t))}catch(e){ta.append(`error`,`${t}: ${String(e)}`)}}async function sa(e){let t=ea.sessionId();t&&await aa(O(`Reply to subagent`,`/api/task-messages/${e}/reply`,{sourceSessionId:t},`reply failed`))}function ca(e){let t=K(`button`,`flex-none text-[11px] font-semibold normal-case text-cyan-800 hover:underline`,`Reply`);return t.onclick=()=>void sa(e),t}function la(e){for(let[e,t]of ia)t.isConnected||ia.delete(e);let t=ia.get(e.runId);t||(t=K(`div`,`mx-5 my-1.5 border px-3 py-2 text-[13px]`),t.dataset.kind=`background-run`,ta.el.append(t),ia.set(e.runId,t)),t.className=`mx-5 my-1.5 border px-3 py-2 text-[13px] ${ra[e.state]}`;let n=e.state===`queued`||e.state===`running`,r=`/api/task-runs/${e.runId}`,i=n?K(`span`,`spinner`):K(`span`,`w-3 flex-none text-center`,e.state===`succeeded`?`✓`:e.state===`failed`?`✕`:`·`),a=K(`button`,`min-w-0 truncate text-left font-medium hover:underline`,e.taskName);a.onclick=()=>ea.showTasks(e.taskId);let o=K(`div`,`flex items-center gap-2`,i,K(`span`,`flex-none text-[11px] font-semibold uppercase`,e.state),a),s=K(`div`,`ml-auto flex flex-none items-center gap-2`);if(e.targetSessionId){let t=K(`button`,`font-mono text-[11px] hover:underline`,`Open`);t.title=`Open ${e.targetSessionId}`,t.onclick=()=>ea.select(e.targetSessionId),s.append(t)}if(n){let e=K(`button`,`text-[11px] font-semibold hover:underline`,`Steer`),t={mode:`steer`,sourceSessionId:ea.sessionId()};e.onclick=()=>void aa(O(`Steer subagent`,`${r}/steer`,t,`could not steer the run`));let n=K(`button`,`text-[11px] font-semibold hover:underline`,`Stop`);n.onclick=()=>void oa(`${r}/cancel`,`could not stop the run`),s.append(e,n)}else if(e.targetSessionId&&e.sessionMode!==null){let e=K(`button`,`text-[11px] font-semibold hover:underline`,`Continue`),t={sourceSessionId:ea.sessionId()};e.onclick=()=>void aa(O(`Continue subagent`,`${r}/resume`,t,`could not continue`)),s.append(e)}o.append(s);let c=Math.max(0,Math.round(((e.finishedAt??Date.now())-(e.startedAt??e.queuedAt))/1e3));t.replaceChildren(o,K(`div`,`mt-1 break-words text-[11px] opacity-70`,`${e.sessionMode??`task`} · depth ${e.depth} · ${c}s · ${e.runId}`)),ta.scroll()}var ua=null,da=new WeakMap,fa=e=>{let t=da.get(e)??[];return da.set(e,t),t};function pa(){ua&&!ua.toolRows.size&&Ta(`done`)}var ma=null;function ha(){ua=null,ma=null,ia.clear()}function ga(){let e=ma;return!e||ua?.el===e||(ma=null,e!==ta.el.lastElementChild)?null:(e.remove(),e.dataset.adopted=`1`,va(e,e.dataset.status),e)}var _a={running:`text-green-700 open:bg-green-50`,done:`text-neutral-400 hover:text-neutral-600 open:bg-black/[0.02] open:text-neutral-500 dark:open:bg-neutral-100`,failed:`text-red-600 open:bg-red-50`,interrupted:`text-amber-700 open:bg-amber-50`};function va(e,t){e.dataset.status=t,e.className=`${e.dataset.adopted?`float-left min-w-[6.5rem] pr-3 tabular-nums mt-[3px] open:float-none open:mt-0 open:mb-1.5 open:min-w-0 open:pr-0`:`mx-5 my-1.5`} rounded-md text-[11.5px] leading-[1.35] open:border open:border-black/[0.06] open:px-2 open:py-1.5 dark:open:border-neutral-200 ${_a[t]}`}var ya={failed:`✕`,interrupted:`⏸`};function ba(e){return e===`running`?K(`span`,`spinner`):e===`done`?K(`span`,`hidden`):K(`span`,`flex-none text-[12px] font-bold`,ya[e])}function xa(e){if(ua)return ua;let t=ba(`running`),n=K(`span`,`min-w-0 truncate`,`working…`),{el:r}=cr(``,[t,n]);r.dataset.kind=`activity`,va(r,`running`);let i=K(`div`,`mt-1.5 flex max-h-64 flex-col gap-1 overflow-y-auto overscroll-contain border-t border-black/5 pt-1.5 dark:border-neutral-200`);return r.append(i),Sa(r,i),ta.el.append(r),ma=r,ta.scroll(),ua={el:r,statusIcon:t,headline:n,rowsEl:i,toolRows:new Map,thinking:null,steps:0,failedSteps:0,startTs:e,sawError:!1},ua}function Sa(e,t){t.dataset.follow=`1`,t.addEventListener(`scroll`,()=>{let e=t.scrollHeight-t.scrollTop-t.clientHeight<24;t.dataset.follow=e?`1`:``}),e.addEventListener(`toggle`,()=>{e.open&&(t.scrollTop=t.scrollHeight,t.dataset.follow=`1`)})}function Ca(e){ta.bulk()||!e.el.open||!e.rowsEl.dataset.follow||(e.rowsEl.scrollTop=e.rowsEl.scrollHeight)}function wa(e,t,n){let r=Math.max(1,Math.round((Date.now()-e.startTs)/1e3)),i=`${e.steps} step${e.steps===1?``:`s`} · ${r}s`;e.headline.textContent=t===`running`&&n?`${i} · ${n}`:t===`done`?i:`${i} · ${t}`,va(e.el,t);let a=ba(t);e.statusIcon.replaceWith(a),e.statusIcon=a}function Ta(e){if(!ua)return;for(let{statusEl:e}of ua.toolRows.values())e.textContent===`running…`&&(e.textContent=`interrupted`);let t=ua.steps>0&&ua.failedSteps===ua.steps;wa(ua,(ua.sawError||t)&&e===`done`?`failed`:e),ua=null}function Ea(){ua&&(ua.sawError=!0)}function Da(e){let t=e.slice(0,400).replace(/\s+/g,` `);return t.length>100?t.slice(0,100)+`…`:t}function Oa(e,t,n,r){let i=xa(e);i.steps+=1,i.thinking=null;let a=JSON.stringify(r,null,2)??``,o=K(`span`,`ml-auto flex-none text-neutral-400`,`running…`),s=K(`span`,`min-w-0 truncate text-neutral-500`,Da(a)),{el:c}=cr(`rounded-md px-1 py-0.5 font-mono text-[12.5px] hover:bg-black/[0.03] dark:hover:bg-neutral-100`,[K(`span`,`flex-none font-semibold`,n),s,o]),l=K(`pre`,`max-h-40 overflow-y-auto whitespace-pre-wrap break-words rounded bg-black/[0.04] p-1.5 text-[12px] dark:bg-neutral-100`,a),u=K(`pre`,`hidden max-h-56 overflow-y-auto whitespace-pre-wrap break-words rounded bg-black/[0.04] p-1.5 text-[12px] dark:bg-neutral-100`);c.append(K(`div`,`mt-1 flex flex-col gap-1 pl-4`,l,u)),fa(i.el).push({tool:n,call:t,preview:s,argsPre:l,outputPre:u}),i.toolRows.set(t,{el:c,statusEl:o,outputPre:u}),i.rowsEl.append(c),Ca(i),wa(i,`running`,n),ta.scroll()}function ka(e,t,n){let r=ua;if(!r)return;let i=r.toolRows.get(e);r.toolRows.delete(e),i&&(i.statusEl.textContent=t?`failed`:`ok`,i.statusEl.className=`ml-auto flex-none ${t?`text-red-600`:`text-green-700`}`,i.el.classList.toggle(`bg-red-50`,t),i.el.classList.toggle(`text-red-700`,t),n&&(i.outputPre.textContent=n.length>8e3?n.slice(0,Qi)+`…`:n,i.outputPre.classList.remove(`hidden`)),t&&(r.failedSteps+=1)),wa(r,`running`)}function Aa(e,t){let n=xa(e);if(!n.thinking){let{el:e,summary:t}=cr(`rounded-md px-1 py-0.5 text-[12.5px] italic text-neutral-500 hover:bg-black/[0.03] dark:hover:bg-neutral-100`,[K(`span`,`min-w-0 truncate`,`thinking…`)]),r=K(`div`,`mt-1 max-h-56 overflow-y-auto whitespace-pre-wrap break-words pl-4 not-italic text-neutral-500`,``);e.append(r),n.rowsEl.append(e),n.thinking={pre:r,summary:t},Ca(n),wa(n,`running`,`thinking…`)}let r=n.thinking;r.pre.textContent=((r.pre.textContent??``)+t).slice(-4e3);let i=(r.pre.textContent??``).split(`
72
+ `).filter(Boolean).pop()??`thinking…`,a=r.summary.lastElementChild;a.textContent=i.length>90?`…`+i.slice(-90):i}var ja=0;function Ma(e,t=0,n=!1,r){let i=Date.now()-t,a=xa(i).el;for(let t of e){if(t.kind===`thinking`){Aa(i,t.text??``);continue}let e=t.id??`replay-${++ja}`;Oa(i,e,t.toolName??``,t.args),t.done&&ka(e,t.isError??!1,t.output??``)}r!==void 0&&e.some(e=>e.kind===`tool`&&e.args===void 0)&&Na(a,r),!n&&Ta(e.some(e=>e.kind===`tool`&&!e.done)?`interrupted`:`done`)}function Na(e,t){let n=()=>{e.open&&(e.removeEventListener(`toggle`,n),Pa(e,t))};e.addEventListener(`toggle`,n)}async function Pa(e,t){let n=ea.sessionId(),r=fa(e),i=new Set(r.filter(e=>!e.argsPre.textContent)),a=e=>{for(let t of i)t.argsPre.textContent=e};if(a(`loading…`),!n)return a(`no session`);let o=await E(`/api/sessions/${n}/turns/${t}/steps`,`could not load these steps`);if(!o.ok)return a(o.error);let s=o.value.steps.filter(e=>e.kind===`tool`);for(let[e,t]of r.entries()){if(!i.has(t))continue;let n=s[e];if(!(n&&(n.id?n.id===t.call:n.toolName===t.tool))){t.argsPre.textContent=`detail no longer available — reload the session`;continue}let r=JSON.stringify(n.args,null,2)??``;t.argsPre.textContent=r,t.preview.textContent=Da(r),n.output&&(t.outputPre.textContent=n.output,t.outputPre.classList.remove(`hidden`))}}var Fa,X=G(`#turns`);function Ia(e){Fa=e,na(e,{el:X,append:Z,scroll:Ua,bulk:()=>La})}var La=!1,Ra=()=>X.scrollHeight-X.scrollTop-X.clientHeight<80,za=!0;X.addEventListener(`scroll`,()=>{La||(za=Ra())},{passive:!0});var Ba=0;function Va(){!za||La||Ba||(Ba=requestAnimationFrame(()=>{Ba=0,za&&!La&&(X.scrollTop=X.scrollHeight)}))}new ResizeObserver(Va).observe(X),X.addEventListener(`load`,Va,!0),new MutationObserver(Va).observe(X,{childList:!0,subtree:!0,characterData:!0});function Ha(){Ra()&&(za=!0)}function Ua(e=!1){La||(e&&(za=!0),za&&(X.scrollTop=X.scrollHeight))}var Wa=500,Ga=0,Ka=0,qa=null;function Ja(){for(;X.childElementCount>Wa;){let e=X.firstElementChild;e.remove(),e!==qa&&(e.dataset.kind===`user`&&Ga++,Ka++)}Ka&&(qa||(qa=K(`div`,`px-5 py-2 text-center text-[11.5px] italic text-neutral-400`),qa.dataset.kind=`trim`),qa.textContent=`${Ka} earlier row${Ka===1?``:`s`} not shown — still in the transcript, not on this screen`,X.firstElementChild!==qa&&X.prepend(qa))}var Ya={user:{row:`border-l-indigo-500 bg-indigo-50`,body:`text-neutral-900`},assistant:{row:`border-l-transparent`,body:`text-neutral-900`},error:{row:`border-l-red-400 bg-red-50`,body:`text-red-700`},system:{row:`border-l-cyan-500 bg-cyan-50`,body:`text-neutral-800`}};function Z(e,t,n=!1,r){pa();let i=e===`assistant`?ga():null,a=Ya[e],o=K(`div`,`group relative border-l-2 px-5 ${X.lastElementChild?.dataset.kind===e?`pt-1 pb-2.5`:`mt-1.5 py-2.5`} ${a.row}`);o.dataset.kind=e;let s=e===`user`?ni(t):null,c=s?.text??t,l=e===`user`?x(c):null,u=l?.id||l?.when?l:null,d=u&&(u.id===`web`?u.when?{when:u.when}:null:u),f=K(`div`,`whitespace-pre-wrap break-words ${a.body}`,u?.text??c);(s?.paths.length||u)&&(f.dataset.raw=t),n&&po(f,t),i&&(o.classList.add(`flow-root`),o.append(i)),d&&o.append(Xa(d)),o.append(f);let p=Fa.sessionId();if(s?.paths.length&&p){let e=Pr(o);for(let t of s.paths)e.append(qr(p,t))}if(e===`user`){let e=K(`button`,`absolute right-2 top-1 hidden h-6 w-6 items-center justify-center rounded text-neutral-400 hover:bg-neutral-200 hover:text-neutral-700 group-hover:flex pointer-coarse:flex`);e.title=`Edit — resends from here; this message and later turns leave the context`,e.setAttribute(`aria-label`,`Edit message`),e.innerHTML=`<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="h-3.5 w-3.5"><path d="m10.7 2.3 3 3L6 13H3v-3l7.7-7.7zM9.3 3.7l3 3"/></svg>`,e.onclick=()=>Qa(o,f),o.append(e)}return ao(r),X.append(o),Ja(),Ua(),f}function Xa(e){let t=K(`div`,`mb-1 flex items-baseline gap-2 text-[11.5px] leading-tight`),n=e.name??e.id;if(n){let r=K(`span`,`font-semibold text-indigo-700`,n);e.id&&(r.title=e.id),t.append(r)}return e.when&&t.append(K(`span`,`text-neutral-400`,e.when)),t}function Za(e,t,n){let r=t.kind===`task-callback`?`Task callback`:t.kind===`task-message`?t.messageKind===`decision`?`Decision needed`:`Task ${t.messageKind.replace(`_`,` `)}`:`Agent task input`;pa();let i=K(`div`,`group relative mt-1.5 border-l-2 border-l-cyan-500 bg-cyan-50 px-5 py-2.5`);i.dataset.kind=`system`;let a=K(`div`,`mb-1 flex flex-wrap items-center gap-x-2 gap-y-1 text-[11px] font-semibold uppercase text-cyan-800`,K(`span`,`flex-none`,r)),o=t.source;if(o&&a.append(K(`span`,`min-w-0 truncate font-medium normal-case text-cyan-700`,o.taskName)),t.sourceSessionId&&t.sourceSessionId!==`console`){let e=K(`button`,`truncate font-mono normal-case text-cyan-700 hover:underline`,t.sourceSessionId.slice(0,12));e.title=`Open source session`,e.onclick=()=>Fa.select(t.sourceSessionId),a.append(K(`span`,`text-cyan-400`,`from`),e)}if(o?.model){let e=K(`span`,`flex-none rounded bg-cyan-100 px-1.5 py-px font-mono font-medium normal-case text-cyan-800`,o.model.id);e.title=`${o.model.provider} / ${o.model.id}`,a.append(e)}if(o?.thinking){let e=K(`span`,`flex-none font-mono font-normal normal-case text-cyan-600`,o.thinking);e.title=`Reasoning effort`,a.append(e)}let s=K(`button`,`ml-auto flex-none font-mono normal-case text-cyan-700 hover:underline`,`run ${t.runId.slice(0,8)}`);s.onclick=()=>Fa.showTasks(t.taskId),a.append(s),t.kind===`task-message`&&t.messageKind===`decision`&&a.append(ca(t.messageId));let c=[`max-h-[min(18rem,40dvh)]`,`overflow-hidden`],l=K(`div`,`whitespace-pre-wrap break-words text-[14px] text-neutral-800 ${c.join(` `)}`,e);i.append(a,l),ao(n),X.append(i);let u=e.length>800||e.split(`
73
+ `).length>12;if(l.clientHeight?l.scrollHeight>l.clientHeight+1:u){let e=K(`button`,`mx-auto mt-1.5 block w-fit rounded border border-cyan-200 bg-white px-2 py-1 text-[12px] font-medium text-cyan-800 shadow-sm hover:bg-cyan-100 pointer-coarse:py-3.5`,`Show full message`);e.setAttribute(`type`,`button`),e.onclick=()=>{let t=l.classList.toggle(c[0]);l.classList.toggle(c[1],t),e.textContent=t?`Show full message`:`Collapse message`,l.tabIndex=-1,l.focus({preventScroll:!0})},i.append(e)}else l.classList.remove(...c);Ja(),Ua()}function Qa(e,t){if(Fa.sessionState()!==`idle`){Z(`error`,`can't edit while streaming — stop the turn first`);return}if(e.querySelector(`textarea`))return;let n=document.createElement(`textarea`);n.value=t.dataset.raw??t.textContent??``,n.className=`block w-full resize-none rounded-md border border-indigo-300 bg-white px-2 py-1 focus:outline-none`;let r=()=>{n.style.height=`auto`,n.style.height=`${Math.min(n.scrollHeight,192)}px`};n.oninput=r,t.classList.add(`hidden`),t.after(n),r(),n.focus(),n.setSelectionRange(n.value.length,n.value.length);let i=()=>{n.remove(),t.classList.remove(`hidden`)};n.onkeydown=t=>{if(!(t.isComposing||t.keyCode===229)&&(t.key===`Escape`&&i(),t.key===`Enter`&&!t.shiftKey)){t.preventDefault();let r=n.value.trim();if(!r)return i();$a(e,r)}}}async function $a(e,t){let n=Fa.sessionId();if(!n)return;let r=Ga+[...X.querySelectorAll(`[data-kind="user"]`)].indexOf(e);for(;e.nextElementSibling;)e.nextElementSibling.remove();e.remove(),Fa.ownTurn(t),Z(`user`,t,!1,Date.now()),Ua(!0);let i=await w(`/api/sessions/${n}/turns/${r}/edit`,{text:t});if(!i.ok){let e=await T(i,`edit failed`);await Fa.reload(n),Z(`error`,e)}}var eo=e=>new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,hour12:!1}),to=6e5,no=null,ro=(e,t)=>new Date(e).toDateString()===new Date(t).toDateString();function io(e){return ro(e,Date.now())?eo(e):`${new Date(e).toLocaleDateString([],{month:`short`,day:`numeric`})} · ${eo(e)}`}function ao(e){if(e===void 0)return;let t=no;if(no=e,t!==null&&e-t<to&&ro(t,e))return;let n=K(`div`,`px-5 pb-0.5 pt-3 text-center text-[11px] text-neutral-400`,io(e));n.dataset.kind=`time`,X.append(n)}var oo=null,so=0,co;function lo(){if(!oo?.isConnected){clearInterval(co),co=void 0,oo=null;return}oo.textContent=`${tr(so)} · ${Qn(so)}`}function uo(e,t){t&&(oo?.remove(),so=t.completedAt,oo=K(`div`,`mt-1 font-mono text-[11px] text-neutral-400`),(e.parentElement??e).append(oo),lo(),co??=setInterval(lo,6e4))}function fo(e){for(let t of e.querySelectorAll(`pre`)){let e=t.querySelector(`code`);if(!e)continue;let n=K(`div`,`group/code relative`);t.replaceWith(n),n.append(t,sr(`absolute right-1.5 top-1.5 cursor-pointer rounded border border-black/[0.08] bg-white/85 px-1.5 py-0.5 text-[11px] text-neutral-500 opacity-0 transition-opacity hover:bg-white hover:text-neutral-800 focus:opacity-100 group-hover/code:opacity-100 pointer-coarse:opacity-100 dark:border-neutral-200`,()=>e.textContent??``))}}function po(e,t,n=!1){let r=Fa.sessionId(),i=r?Gr(t,r):t;e.innerHTML=V.sanitize(W.parse(i,{async:!1})),e.classList.remove(`whitespace-pre-wrap`),e.classList.add(`md`),ar(e),!n&&(Wi(e),fo(e),$r(e))}function mo(e,t,n,r=!1){let{text:i,suggestions:a}=y(t);return d({text:i,suggestions:a})?ho(e,v(t)):po(e,i),r&&Zi(e.parentElement??e,a,e=>Fa.send(`auto`,e)),uo(e,n),e}function ho(e,t){e.classList.remove(`md`,`whitespace-pre-wrap`),e.replaceChildren(K(`span`,`text-[12.5px] italic text-neutral-400`,t?`Stayed silent — ${t}`:`Stayed silent.`))}var go=(e,t,n=!1)=>mo(Z(`assistant`,``,!1,t&&t.completedAt-t.durationMs),e,t,n),_o=null,vo=null,yo=!1,bo=80;function xo(){if(vo){yo=!0;return}yo=!1,_o&&(po(_o,y(_o.dataset.raw??``).text,!0),Ua()),vo=setTimeout(()=>{vo=null,yo&&xo()},bo)}function So(){vo&&clearTimeout(vo),vo=null,yo=!1}function Co(e){_o||=Z(`assistant`,``),_o.dataset.raw=(_o.dataset.raw??``)+e,xo()}function wo(e=!1,t){if(!_o)return;let n=_o;_o=null,So(),mo(n,n.dataset.raw??``,t,e)}function To(e,t){if(Ta(`done`),_o){e&&(_o.dataset.raw=e),wo(!0,t);return}e&&go(e,t,!0)}function Eo(){Ta(`interrupted`),wo()}function Do(){X.replaceChildren(),Ga=0,Ka=0,qa=null,no=null,oo=null,_o=null,So(),ha(),Xi()}function Oo(e){if(!e){X.querySelector(`[data-kind="loading"]`)?.remove();return}let t=K(`div`,`flex flex-col gap-3 px-5 py-4`);t.dataset.kind=`loading`;for(let e of[`w-2/5`,`w-4/5`,`w-3/5`,`w-1/3`,`w-2/3`])t.append(K(`div`,`skeleton h-3.5 ${e}`));X.append(t)}function ko(e,t,n){Oo(!1);let r=new Map(n.map(e=>[e.runId,e])),i=e=>[...r].filter(([,t])=>t.queuedAt<=e).map(([e])=>e),a=e=>{for(let t of e){let e=r.get(t);e&&(la(e),r.delete(t))}},o=e.reduce((e,t,n)=>t.role===`assistant`?n:e,-1);La=!0;try{for(let[n,r]of e.entries()){let s=t===`streaming`&&n===e.length-1&&(!r.text||(r.steps?.some(e=>e.kind===`tool`&&!e.done)??!1)),c=r.steps;if(c?.length&&(Ma(c,r.meta?.durationMs,s,n),r.meta&&a(i(r.meta.completedAt))),r.text){if(r.role===`system`&&r.origin){a(r.origin.kind===`task-message`?[r.origin.runId]:r.origin.runIds??[r.origin.runId]),Za(r.text,r.origin,r.at);continue}r.role===`assistant`?go(r.text,r.meta,t===`idle`&&n===o):Z(r.role,r.text,!1,r.at)}}for(let e of r.values())la(e)}finally{La=!1}Ua(!0)}var Ao=window.fetch.bind(window),jo=20,Mo=6e4,No=[],Po=new Map,Fo=e=>e instanceof Error?e.stack??`${e.name}: ${e.message}`:void 0;function Io(e,t){let n=t===void 0?e:`${e}: ${String(t)}`,r=Date.now();return r-(Po.get(n)??-6e4)<Mo||(Po.size>100&&Po.clear(),Po.set(n,r),No=No.filter(e=>r-e<6e4),No.length>=jo)?null:(No.push(r),Ao(`/api/client-log`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({message:n,stack:Fo(t),view:location.hash||`/`}),keepalive:!0}).catch(()=>{}),Z(`error`,n))}function Lo(){window.__pierReporting=!0,window.addEventListener(`error`,e=>{Io(`script error: ${e.message}`,e.error)}),window.addEventListener(`unhandledrejection`,e=>{Io(`unhandled rejection`,e.reason)})}var Ro=window.fetch.bind(window),zo=()=>{location.assign(`/login?next=${encodeURIComponent(location.pathname+location.hash)}`)};function Bo(){window.fetch=async(...e)=>{let t=await Ro(...e);return t.status===401&&zo(),t}}function Vo(e,t){if(e.readyState!==EventSource.CLOSED)return;let n=()=>{let e=Io(`${t} stream disconnected`);if(!e)return;let n=q(`Reload`);n.classList.add(`ml-2`,`align-middle`),n.onclick=()=>location.reload(),e.append(` `,n)};Ro(`/api/projects`).then(e=>e.status===401?zo():n(),n)}var Ho=/Mac|iP(?:hone|ad|od)/.test(navigator.userAgent),Uo=Ho?`⌘`:`Ctrl+`,Wo=Ho?`⇧`:`Shift+`,Go=e=>{let t=e.startsWith(`meta+`),n=t?e.slice(5):e;return n.startsWith(`shift+`)?{key:n.slice(6),shift:!0,meta:t}:{key:n,shift:!1,meta:t}};function Ko(e){let{key:t,shift:n,meta:r}=Go(e);return`${r?`⌘`:Uo}${n?Wo:``}${t.toUpperCase()}`}var qo=`pointer-events-none fixed z-50 flex items-center gap-2 whitespace-nowrap rounded-md bg-neutral-800 px-2 py-1 text-[11.5px] text-neutral-100 shadow-lg`;function Jo(e,t,n){e.removeAttribute(`title`);let r=null,i=()=>{r?.remove(),r=null,document.removeEventListener(`keydown`,i,!0)};e.addEventListener(`pointerenter`,a=>{if(a.pointerType!==`mouse`)return;i(),r=K(`div`,qo,t,K(`kbd`,`rounded bg-white/15 px-1 py-px font-sans text-[10.5px]`,n)),document.body.append(r);let o=e.getBoundingClientRect(),s=o.bottom+6,c=s+r.offsetHeight+8<=window.innerHeight;r.style.top=`${c?s:Math.max(8,o.top-r.offsetHeight-6)}px`,r.style.left=`${Math.max(8,Math.min(o.left,window.innerWidth-r.offsetWidth-8))}px`,document.addEventListener(`keydown`,i,!0)}),e.addEventListener(`pointerleave`,i),e.addEventListener(`pointerdown`,i)}function Yo(e,t,n,r,i){Jo(e,n,Ko(t)),$o(t,r,i)}function Xo(e,t,n,r){Jo(e,t,`Esc`),document.addEventListener(`keydown`,e=>{e.key!==`Escape`||e.isComposing||e.defaultPrevented||document.querySelector(`dialog[open]`)||!r()||(e.preventDefault(),n())})}var Zo=`input, textarea, select, [contenteditable]`;function Qo(e,t,n,r,i){Jo(e,n,t[0].toUpperCase()),document.addEventListener(`keydown`,e=>{e.metaKey||e.ctrlKey||e.altKey||e.isComposing||e.defaultPrevented||!e.key||!t.includes(e.key.toLowerCase())||e.target?.closest?.(Zo)||document.querySelector(`dialog[open]`)||!i()||(e.preventDefault(),r())})}function $o(e,t,n){let{key:r,shift:i,meta:a}=Go(e);document.addEventListener(`keydown`,e=>{!e.key||e.key.toLowerCase()!==r||e.altKey||e.shiftKey!==i||(a?!e.metaKey:!e.metaKey&&!e.ctrlKey)||!e.metaKey&&e.target?.closest?.(`[data-owns-keyboard]`)||n?.()||(e.preventDefault(),e.stopPropagation(),t())},!0)}var es,ts=G(`#composer`),Q=G(`#input`),ns=G(`#send`),rs=G(`#send-plane`),is=G(`#send-queue`),as=G(`#stop`),os=G(`#queue-panel`),ss=G(`#queue-rows`),cs=G(`#queue-label`),ls=G(`#image-strip`),us=G(`#attach-input`),ds=!1,fs=[],ps=[];function ms(){let e=window.visualViewport;if(!e)return;let t=()=>{let t=e.scale<=1.05&&window.innerHeight-e.height-e.offsetTop>80;t?document.body.dataset.kb=``:delete document.body.dataset.kb,document.body.style.height=t?`${String(e.height)}px`:``,t&&window.scrollY&&window.scrollTo(0,0)};e.addEventListener(`resize`,t),e.addEventListener(`scroll`,t)}function hs(){Q.focus()}function gs(e){let t=ps.indexOf(e);return t<0?!1:(ps.splice(t,1),!0)}function _s(e){ps.push(e)}function vs(){ps=[]}function ys(){let e=es.sessionState()===`streaming`;ns.className=`flex h-7 w-7 flex-none cursor-pointer items-center justify-center rounded-lg ${e?`bg-amber-100 text-amber-700 hover:bg-amber-200 active:bg-amber-300`:`bg-indigo-600 text-white hover:bg-indigo-500 active:bg-indigo-700 dark:text-neutral-50`}`,ns.title=e?`Queue — delivered when the turn ends`:`Send`,rs.classList.toggle(`hidden`,e),is.classList.toggle(`hidden`,!e),as.classList.toggle(`hidden`,!e),as.classList.toggle(`flex`,e)}function bs(){let e=es.chatVisible()&&ds;os.classList.toggle(`hidden`,!e),os.classList.toggle(`flex`,e)}function xs(e,t){let n=[...e.map(e=>({mode:`steer`,text:e})),...t.map(e=>({mode:`queued`,text:e}))];ds=n.length>0,cs.textContent=n.length>1?`Queued · ${n.length}`:`Queued`,bs(),ss.replaceChildren(...n.map(e=>{let t=K(`li`,`flex items-start gap-2 text-[13px] leading-[18px]`);return e.mode===`steer`&&t.append(K(`span`,`flex-none rounded bg-indigo-100 px-1 py-0.5 text-[10.5px] font-semibold uppercase tracking-wide text-indigo-700`,e.mode)),t.append(K(`span`,`min-w-0 whitespace-pre-wrap break-words text-neutral-700`,e.text)),t}))}var Ss=8;function Cs(){ls.classList.toggle(`hidden`,fs.length===0),ls.classList.toggle(`flex`,fs.length>0),ls.replaceChildren(...fs.map((e,t)=>{let n=e.mimeType.startsWith(`image/`)?Fr(`data:${e.mimeType};base64,${e.data}`):K(`span`,`flex h-16 max-w-40 items-center truncate rounded-md border border-neutral-200 bg-neutral-50 px-2 text-[12px] text-neutral-700`,e.name??`file`),r=K(`button`,`absolute -right-1.5 -top-1.5 h-4 w-4 cursor-pointer rounded-full bg-neutral-700 text-[10px] leading-none text-white hover:bg-red-600`,`×`);return r.onclick=()=>{fs.splice(t,1),Cs()},K(`div`,`relative`,n,r)}))}function ws(e){if(fs.length>=Ss){Z(`error`,`attachment limit is ${Ss} files per message`);return}if(e.size>33554432){Z(`error`,`${e.name||`file`} is too large (32MB max)`);return}let t=new FileReader;t.onload=()=>{let n=t.result;fs.push({data:n.slice(n.indexOf(`,`)+1),mimeType:e.type||`application/octet-stream`,name:e.name||void 0}),Cs()},t.readAsDataURL(e)}async function Ts(e){let t=[];for(let n of e){let e=await w(`/api/inbox`,n);if(!e.ok)return null;let{path:r}=await e.json();t.push(ei(r))}return t}var Es=e=>`pier.draft.${e}`;function Ds(){let e=es.sessionId();e&&(Q.value.trim()?localStorage.setItem(Es(e),Q.value):localStorage.removeItem(Es(e)))}function Os(e){Q.value=localStorage.getItem(Es(e))??``,ks(),fs=[],Cs()}function ks(){Q.style.height=`auto`,Q.style.height=`${Math.min(Q.scrollHeight,192)}px`}var As=!1;async function js(e,t){let n=(t??Q.value).trim(),r=t===void 0?fs:[],i=es.sessionId();if(!(!n&&r.length===0||!i)){if(t===void 0){if(As)return;As=!0,Q.value=``,ks(),Ds(),fs=[],Cs()}try{let t=[];if(r.length){let e=await Ts(r);if(e===null){Z(`error`,`attachment upload failed`),Q.value=[n,Q.value.trim()].filter(Boolean).join(`
74
+ `),ks(),Ds(),fs=r,Cs();return}t=e}let a=[n,...t].filter(Boolean).join(`
75
+ `),o=es.sessionState()===`idle`&&e===`auto`;o?es.setState(`streaming`):ys(),(o||e===`steer`)&&(_s(a),Z(`user`,a,!1,Date.now()),Ua(!0));let s=await w(`/api/sessions/${i}/messages`,{text:a,mode:e});if(!s.ok){let e=await T(s,`send failed`);await es.reload(i),Z(`error`,e)}}finally{t===void 0&&(As=!1)}}}async function Ms(e){let t=es.sessionId();if(!t)return;xs([],[]);let n=await w(`/api/sessions/${t}/queue/deliver`,{mode:e});n.ok||Z(`error`,`queue ${e} failed: ${n.status}`)}async function Ns(){let e=es.sessionId();if(!e)return;let t=await fetch(`/api/sessions/${e}/queue/recall`,{method:`POST`});if(!t.ok)return;let{messages:n}=await t.json();n.length&&(Q.value=[Q.value.trim(),...n].filter(Boolean).join(`
76
+ `),ks(),Ds(),Q.focus()),xs([],[])}function Ps(e){es=e,ms();let t=()=>{let e=es.sessionId();e&&fetch(`/api/sessions/${e}/abort`,{method:`POST`})};as.onclick=t,Xo(as,`Stop the running turn`,t,()=>es.sessionState()===`streaming`&&es.chatVisible()),G(`#queue-steer`).onclick=()=>void Ms(`steer`),G(`#queue-restart`).onclick=()=>void Ms(`restart`),G(`#queue-recall`).onclick=()=>void Ns(),ts.onsubmit=e=>{e.preventDefault(),js(`auto`)},Qo(Q,[`/`],`Write a message`,hs,es.chatVisible),Q.onfocus=Ha,Q.oninput=()=>{ks(),Ds()};let n=!matchMedia(`(pointer: coarse)`).matches;Q.onkeydown=e=>{e.isComposing||e.keyCode===229||n&&e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),js(`auto`))},Q.onpaste=e=>{for(let t of e.clipboardData?.items??[]){let e=t.kind===`file`?t.getAsFile():null;e&&ws(e)}let t=e.clipboardData?.getData(`text/plain`)??``,n=t.trim();!n||n===t||(e.preventDefault(),Q.setRangeText(n,Q.selectionStart??0,Q.selectionEnd??0,`end`),ks(),Ds())},X.ondragover=e=>e.preventDefault(),X.ondrop=e=>{e.preventDefault();for(let t of e.dataTransfer?.files??[])ws(t)},G(`#attach`).onclick=()=>us.click(),us.onchange=()=>{for(let e of us.files??[])ws(e);us.value=``},ys()}var Fs=`pier.push`,Is=`/sw.js`,Ls=()=>/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.maxTouchPoints>1&&/Macintosh/.test(navigator.userAgent),Rs=()=>matchMedia(`(display-mode: standalone)`).matches||navigator.standalone===!0;function zs(){return window.isSecureContext?Ls()&&!Rs()?`On iPhone and iPad, notifications work only from the installed app: Share → Add to Home Screen, then open Pier from that icon.`:!(`serviceWorker`in navigator)||!(`PushManager`in window)||!(`Notification`in window)?`This browser has no Web Push support.`:``:`Notifications need HTTPS. Reach this Pier through its public URL, not over plain http.`}var Bs=[[/iPhone/,`iPhone`],[/iPad/,`iPad`],[/Android/,`Android`],[/Macintosh/,`Mac`],[/Windows/,`Windows`]],Vs=[[/Edg\//,`Edge`],[/Chrome\//,`Chrome`],[/Firefox\//,`Firefox`],[/Safari\//,`Safari`]];function Hs(){let e=navigator.userAgent,t=(t,n)=>t.find(([t])=>t.test(e))?.[1]??n;return`${t(Bs,`Linux`)} · ${t(Vs,`browser`)}${Rs()?` (installed)`:``}`}var Us=e=>{let t=atob(e.replace(/-/g,`+`).replace(/_/g,`/`)),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n},Ws=null;async function Gs(){return!(`serviceWorker`in navigator)||!window.isSecureContext?null:(Ws??=await navigator.serviceWorker.register(Is,{scope:`/`}).catch(e=>(console.warn(`service worker registration failed`,e),null)),Ws)}var Ks=(e,t)=>{let n=e?new Uint8Array(e):null;return n?.length===t.length&&n.every((e,n)=>e===t[n])};async function qs(e){let{publicKey:t}=await D(`/api/push`,`Could not read this instance's push key`),n=Us(t),r=await e.pushManager.getSubscription();if(r){if(Ks(r.options.applicationServerKey,n))return r;await r.unsubscribe()}return e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:n})}async function Js(e){return w(`/api/push/subscribe`,{...e.toJSON(),label:Hs()})}async function Ys(){Qs();let e=await Gs();if(!(!e||localStorage.getItem(Fs)!==`on`)&&!(!(`Notification`in window)||Notification.permission!==`granted`))try{await Js(await qs(e))}catch(e){console.warn(`re-registering this browser for notifications failed`,e)}}var Xs=null,Zs=null;function Qs(){window.addEventListener(`beforeinstallprompt`,e=>{e.preventDefault(),Xs=e,Zs?.()}),window.addEventListener(`appinstalled`,()=>{Xs=null,Zs?.()})}function $s(e){let t=navigator;(e>0?t.setAppBadge?.(e):t.clearAppBadge?.())?.catch(()=>{})}function ec(){let e=K(`span`,`text-[11.5px]`,``),t=q(`Send a test notification`),n=K(`div`,`flex items-center gap-3`,t,e),r=K(`div`,`flex flex-col gap-4`),i=()=>localStorage.getItem(Fs)===`on`;async function a(){Y(e,`saving`,`asking this browser…`);let t=await Notification.requestPermission();if(t!==`granted`)return localStorage.setItem(Fs,`off`),c(),Y(e,`failed`,t===`denied`?`Notifications are blocked for this site — allow them in the browser's site settings, then try again.`:`No answer to the permission prompt.`);let n=await Gs();if(!n)return Y(e,`failed`,`This browser refused to register a service worker.`);try{let t=await Js(await qs(n));if(!t.ok)return Y(e,`failed`,await T(t,`Could not register this browser`));localStorage.setItem(Fs,`on`),c(),Y(e,`saved`,`This browser will be notified when a turn finishes unseen.`)}catch(t){Y(e,`failed`,`Could not subscribe: ${String(t)}`)}}async function o(){localStorage.setItem(Fs,`off`),c();let t=await(await Gs())?.pushManager.getSubscription();t&&(await w(`/api/push/unsubscribe`,{endpoint:t.endpoint}),await t.unsubscribe()),Y(e,`idle`,`This browser will not be notified.`)}t.onclick=()=>{Y(e,`saving`,`sending…`),(async()=>{let t=await w(`/api/push/test`,{});if(!t.ok)return Y(e,`failed`,await T(t,`Could not send`));let{sent:n,failed:r}=await t.json();Y(e,r?`failed`:`saved`,`Handed ${String(n)} device(s) to their push service${r?`, ${String(r)} refused`:``}.`)})()};function s(){if(!Xs)return[];let e=q(`Install Pier`,!0);return e.onclick=()=>{let e=Xs;e&&e.prompt().then(()=>e.userChoice).finally(()=>{Xs=null,c()})},[K(`div`,`flex items-center gap-3`,e,K(`span`,`text-[11.5px] leading-snug text-neutral-500`,`Its own window and icon — and where notifications look like an app's.`))]}function c(){let e=zs();if(e){r.replaceChildren(...s(),K(`p`,`text-[12.5px] leading-snug text-neutral-500`,e));return}let c=i()&&Notification.permission===`granted`;t.disabled=!c,r.replaceChildren(...s(),yr(`Notify this device`,`A turn that finishes while nobody is looking at it becomes a notification here. Per browser — each device is enabled on its own.`,c,e=>void(e?a():o())),n)}return Zs=c,c(),pr(`Notifications`,`Web Push, so a finished turn reaches you with the workbench closed. Installed — Chrome's address-bar icon, or Share → Add to Home Screen on iOS — Pier notifies you the way an app does.`,r)}var tc=null;function nc(e){tc&&!tc.contains(e.target)&&$()}function rc(e){e.key===`Escape`&&(e.preventDefault(),e.stopPropagation(),$())}function ic(e){tc&&!tc.contains(e.target)&&$()}function $(){tc&&=(document.removeEventListener(`pointerdown`,nc,!0),document.removeEventListener(`keydown`,rc,!0),window.removeEventListener(`scroll`,ic,!0),window.removeEventListener(`resize`,$),tc.remove(),null)}var ac=null;function oc(e){let t=e.getBoundingClientRect(),n={top:t.bottom+4,left:t.left};return t.width||t.height?n:ac?.anchor===e?{top:ac.top,left:ac.left}:n}var sc=()=>window.innerWidth<640;function cc(e,t){$();let n=sc();if(tc=K(`div`,`fixed z-50 rounded-lg border border-neutral-200 bg-white py-1 shadow-lg ${n?`inset-x-2 bottom-2 max-h-[70dvh] overflow-y-auto pb-[calc(0.25rem+env(safe-area-inset-bottom))] text-[16px]`:`min-w-52 max-w-[min(42rem,calc(100vw-1rem))] text-[13px]`}`),tc.append(t),(e.closest(`dialog[open]`)??document.body).append(tc),!n){let t=oc(e);ac={anchor:e,...t},tc.style.top=`${Math.max(8,Math.min(t.top,window.innerHeight-tc.offsetHeight-8))}px`,tc.style.left=`${Math.max(8,Math.min(t.left,window.innerWidth-tc.offsetWidth-8))}px`}document.addEventListener(`pointerdown`,nc,!0),document.addEventListener(`keydown`,rc,!0),window.addEventListener(`scroll`,ic,!0),window.addEventListener(`resize`,$)}function lc(e){let t=K(`button`,`flex w-full cursor-pointer items-center gap-2 px-3 text-left hover:bg-neutral-100 active:bg-neutral-100 ${sc()?`py-3`:`py-1.5`}`,K(`span`,`flex-none w-3 text-indigo-600`,e.checked?`✓`:``),K(`span`,`truncate`,e.label));return e.hint&&t.append(K(`span`,`ml-auto flex-none text-[11.5px] text-neutral-400`,e.hint)),t.onclick=()=>e.onSelect(),t}function uc(e,t){cc(e,K(`div`,``,...t.map(lc)))}var dc=e=>`${e.provider}/${e.id}`,fc=`pier.modelFavorites`,pc=e=>`${dc(e)}@${e.thinking}`,mc=null;async function hc(){let{modelMenu:e}=await D(`/api/settings`,`Could not read the pinned model menu`);return e}function gc(){try{let e=JSON.parse(localStorage.getItem(fc)??`[]`);return Array.isArray(e)?e.filter(e=>{let t=e;return!!t&&typeof t==`object`&&typeof t.provider==`string`&&typeof t.id==`string`&&typeof t.thinking==`string`}):[]}catch{return[]}}function _c(e){let t=K(`button`,`flex min-w-0 flex-1 cursor-pointer items-center gap-2 px-3 py-1.5 text-left`,K(`span`,`w-3 flex-none text-indigo-600`,e.checked?`✓`:``),K(`span`,`truncate`,e.label));e.hint&&t.append(K(`span`,`ml-auto flex-none text-[11.5px] text-neutral-400`,e.hint)),e.title&&(t.title=e.title),t.onclick=()=>e.onSelect();let n=K(`button`,`flex-none cursor-pointer px-2 py-1.5 leading-none ${e.starred?`text-amber-500`:`text-neutral-300 opacity-0 hover:text-amber-500 group-hover/row:opacity-100`}`,e.starred?`★`:`☆`);return n.title=e.starred?`Unstar`:`Star this model + reasoning`,n.onclick=t=>{t.stopPropagation(),e.onStar()},K(`div`,`group/row flex w-full items-center hover:bg-neutral-100`,t,n)}function vc({models:e,current:t,thinkingLevel:n,thinkingLevels:r,onPick:i,onThinkingPick:a}){let o=gc(),s=n,c=K(`div`,`flex w-72 flex-col`),l=K(`div`,`flex flex-col gap-2 border-b border-neutral-200 px-2 py-2`),u=document.createElement(`input`);if(u.type=`search`,u.placeholder=`Search models`,u.setAttribute(`aria-label`,`Search models`),u.className=`w-full rounded-md border border-neutral-300 px-2 py-1.5 text-[12.5px] focus:border-indigo-400 focus:outline-none`,l.append(u),r.length){let e=K(`label`,`flex items-center gap-2 px-1 text-[12px] text-neutral-500`),t=document.createElement(`select`);t.className=`select ml-auto rounded-md border border-neutral-300 px-2 py-1 text-[12px] text-neutral-700 focus:border-indigo-400 focus:outline-none`,t.setAttribute(`aria-label`,`Reasoning level`);for(let e of r){let n=document.createElement(`option`);n.value=e,n.textContent=f(e),t.append(n)}t.value=n,t.onchange=()=>{s=t.value,_(u.value),a(s)},e.append(K(`span`,`font-medium`,`Reasoning`),t),l.append(e)}let d=e=>{let t=pc(e);o=o.some(e=>pc(e)===t)?o.filter(e=>pc(e)!==t):[...o,e],localStorage.setItem(fc,JSON.stringify(o)),_(u.value)},p=(e,t)=>o.some(n=>pc(n)===`${dc(e)}@${t}`),m=K(`div`,`max-h-72 overflow-y-auto py-1`),h=new Map(e.map(e=>[dc(e),e])),g=(e,n,r)=>{let a=n.map(e=>({e,model:h.get(dc(e))})).filter(e=>!!e.model&&(!r||dc(e.model).toLowerCase().includes(r)));a.length&&m.append(K(`div`,`px-3 pb-0.5 pt-1 text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,e),...a.map(({e,model:n})=>{let r=e.thinking??s;return _c({label:n.id,hint:e.thinking?f(e.thinking):void 0,title:e.note,checked:!!t&&dc(t)===dc(n)&&s===r,starred:p(n,r),onSelect:()=>i(n,e.thinking),onStar:()=>d({provider:n.provider,id:n.id,thinking:r})})}),K(`div`,`my-1 border-t border-neutral-100`))},_=n=>{m.replaceChildren();let r=n.trim().toLowerCase();g(`Pinned`,mc??[],r),g(`Starred`,o,r);let a=new Map;for(let t of e){if(r&&!dc(t).toLowerCase().includes(r))continue;let e=a.get(t.provider);e?e.push(t):a.set(t.provider,[t])}if(!a.size){m.append(K(`div`,`px-3 py-2 text-[12.5px] text-neutral-400`,e.length?`No matching models.`:`No models available.`));return}for(let[e,n]of a){let a=n.some(e=>!!t&&dc(t)===dc(e)),o=document.createElement(`details`);o.open=a||r.length>0;let c=K(`summary`,`flex cursor-pointer select-none items-center gap-1.5 px-3 py-1 text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400 hover:bg-neutral-100`,K(`span`,`chev`,`▶`),K(`span`,`truncate`,e),K(`span`,`ml-auto flex-none normal-case text-neutral-300`,String(n.length)));o.append(c,...n.map(e=>_c({label:e.id,checked:!!t&&dc(t)===dc(e),starred:p(e,s),onSelect:()=>i(e),onStar:()=>d({provider:e.provider,id:e.id,thinking:s})}))),m.append(o)}};return u.oninput=()=>_(u.value),_(``),hc().then(e=>{let t=JSON.stringify(e)!==JSON.stringify(mc);mc=e,t&&_(u.value)}).catch(e=>Io(`model menu unavailable`,e)),c.append(l,m),queueMicrotask(()=>u.focus()),c}function yc(e,t,n,r){let i=ur(t.model?`${t.model.id}${t.thinking?` · ${f(t.thinking)}`:``}`:t.thinking?`Pi default · ${f(t.thinking)}`:`Pi default`,`${mr} flex cursor-pointer items-center gap-1.5 truncate text-left hover:bg-neutral-50 ${t.model?`text-neutral-700`:`text-neutral-400`}`);return i.title=t.model?`${t.model.provider}/${t.model.id}`:`Whatever the project and Pi pick`,i.onclick=()=>{let e=vc({models:n,current:t.model,thinkingLevel:t.thinking??`medium`,thinkingLevels:[...$i],onPick:(e,n)=>{$(),r({model:e,thinking:n??t.thinking})},onThinkingPick:e=>r({...t,thinking:e})}),a=ur(`Pi default`,`w-full cursor-pointer px-3 py-1.5 text-left text-[12.5px] text-neutral-500 hover:bg-neutral-100`);a.onclick=()=>{$(),r({model:null,thinking:null})};let o=K(`div`,`flex flex-col`);o.append(e,K(`div`,`border-t border-neutral-200`),a),cc(i,o)},J(e,i)}var bc=async e=>{let t=await E(`/api/fs/dirs${e?.startsWith(`/`)?`?path=${encodeURIComponent(e)}`:``}`,`Could not list directories`);return t.ok?t.value:null},xc=(e,t,n)=>{let r=ur(e,`flex w-full cursor-pointer items-center gap-1.5 px-3 py-1 text-left ${t}`);return r.onclick=n,r};function Sc(e,t){let n=K(`div`,`flex-none border-t border-neutral-200`),r=xc(`+ New folder`,`text-[12px] text-neutral-500 hover:bg-neutral-100`,()=>{let r=document.createElement(`input`);r.className=`w-full border-0 bg-transparent px-3 py-1 font-mono text-[12.5px] focus:outline-none`,r.placeholder=`folder-name`;let i=K(`p`,`hidden px-3 pb-1 text-[11.5px] text-red-600`);r.onkeydown=async n=>{if(n.key!==`Enter`)return;n.preventDefault();let a=await w(`/api/fs/dirs`,{path:e,name:r.value});if(!a.ok){i.textContent=(await a.json()).error??`could not create`,i.classList.remove(`hidden`);return}t((await a.json()).path)},n.replaceChildren(r,i),r.focus()});return n.append(r),n}function Cc(e,t,n){let r=e=>{n(e),$()};async function i(t){let n=await bc(t);if(!n)return;let a=K(`div`,`flex max-h-80 w-80 flex-col`),o=ur(`Use`,`ml-auto flex-none cursor-pointer rounded bg-indigo-600 px-2 py-0.5 text-[11.5px] text-white dark:text-neutral-50`);o.onclick=()=>r(n.path);let s=document.createElement(`input`);s.className=`min-w-0 flex-1 border-0 bg-transparent font-mono text-[11.5px] text-neutral-500 focus:outline-none`,s.value=n.path,s.spellcheck=!1,s.title=`Type or paste a path, then Enter`,s.onfocus=()=>s.select();let c=K(`p`,`hidden flex-none px-3 pb-1 text-[11.5px] text-red-600`);s.onkeydown=async e=>{if(e.key!==`Enter`)return;e.preventDefault(),e.stopPropagation();let t=s.value.trim();if(!t)return;let n=await bc(t);if(!n){c.textContent=`${t} is not a folder this can read`,c.classList.remove(`hidden`);return}r(n.path)};let l=K(`div`,`flex flex-none items-center gap-2 border-b border-neutral-200 px-3 py-1.5`,s,o),u=K(`div`,`min-h-0 flex-1 overflow-y-auto py-0.5 text-[12.5px]`);n.parent&&u.append(xc(`../`,`font-mono text-neutral-500 hover:bg-neutral-100`,()=>void i(n.parent)));for(let e of n.entries)u.append(xc(e,`truncate hover:bg-neutral-100`,()=>void i(`${n.path}/${e}`.replace(`//`,`/`))));n.entries.length||u.append(K(`p`,`px-3 py-1.5 text-[12px] text-neutral-400`,`No sub-folders.`)),a.append(l,c,u,Sc(n.path,e=>void i(e))),cc(e,a)}i(t)}function wc(e,t,n,r){uc(e,[...t.map(e=>({label:e.path,...e.hint?{hint:e.hint}:{},checked:e.path===n,onSelect:()=>{$(),r(e.path)}})),{label:`Browse…`,onSelect:()=>Cc(e,n||void 0,r)}])}var Tc=(e,t)=>n=>{e.value=n,e.dispatchEvent(new Event(`input`,{bubbles:!0})),t?.(n)};function Ec(e,t){let n=ur(`Browse…`,`flex-none cursor-pointer rounded-md border border-neutral-300 px-2 py-1 text-[12px] text-neutral-600 hover:bg-neutral-100`);return n.onclick=()=>Cc(n,e.value.trim()||void 0,Tc(e,t)),n}function Dc(e,t){let n=Tc(e);e.classList.add(`select`),e.title=`Pick a project folder, or type a path`,e.onclick=()=>{let r=e.value.trim()||void 0,i=t();if(i.length)return wc(e,i,r,n);Cc(e,r,n)},e.addEventListener(`input`,()=>$())}function Oc(e,t,n){let r=document.createElement(`input`);return r.className=`min-w-0 flex-1 rounded-md border border-neutral-300 bg-white px-2 py-1 font-mono text-[12.5px] focus:border-indigo-400 focus:outline-none`,r.value=e,r.placeholder=t,r.oninput=()=>n(r.value),{el:K(`div`,`flex items-center gap-1.5`,r,Ec(r,n)),input:r}}var kc=G(`#sidebar`),Ac=G(`#drawer-scrim`),jc=G(`#mobile-title`),Mc=G(`#mobile-menu`);function Nc(){delete kc.dataset.open,Ac.classList.add(`hidden`)}function Pc(e,t){jc.textContent=e,jc.classList.toggle(`cursor-pointer`,t),Mc.classList.toggle(`hidden`,!t)}var Fc=`pier.railClosed`;localStorage.getItem(Fc)===`1`&&(document.body.dataset.rail=`closed`);function Ic(e){document.body.dataset.rail=e?`closed`:``,localStorage.setItem(Fc,e?`1`:`0`)}function Lc(){if(kc.dataset.open!==void 0)return Nc();kc.dataset.open=``,Ac.classList.remove(`hidden`)}var Rc=()=>window.innerWidth<768,zc=[G(`#rail-toggle`),G(`#drawer-toggle`)],Bc=`attention absolute -right-0.5 -top-0.5 rounded-full bg-amber-500`,Vc=e=>e===1?K(`span`,`${Bc} h-2 w-2`):K(`span`,`${Bc} flex h-3.5 min-w-3.5 items-center justify-center px-0.5 text-[9px] font-semibold text-white`,e>9?`9+`:String(e));function Hc(e){for(let t of zc)t.querySelector(`.attention`)?.remove(),e&&t.append(Vc(e))}var Uc=20,Wc=.35,Gc=8;function Kc(){let e=-1,t=0,n=!1,r=!1,i=1,a=e=>{kc.style.transition=`none`,kc.style.transform=`translateX(${String(e-i)}px)`,Ac.classList.remove(`hidden`),Ac.style.opacity=String(e/i)},o=t=>{kc.style.transition=``,kc.style.transform=``,Ac.style.opacity=``,t?(kc.dataset.open=``,Ac.classList.remove(`hidden`)):Nc(),e=-1,r=!1};window.addEventListener(`touchstart`,a=>{if(r||(e=-1,!Rc()||a.touches.length!==1))return;let o=a.touches[0],s=kc.dataset.open!==void 0;if(i=kc.offsetWidth||1,s){if(o.clientX>i)return}else{if(o.clientX>Uc||a.target?.closest(`button, a, input, textarea, select`))return;a.preventDefault()}e=o.clientX,t=o.clientY,n=!s},{passive:!1}),window.addEventListener(`touchmove`,o=>{if(e<0)return;let s=o.touches[0],c=s.clientX-e;if(!r){if(Math.abs(s.clientY-t)>Math.abs(c))return void(e=-1);if(Math.abs(c)<Gc)return;r=!0}o.preventDefault(),a(Math.max(0,Math.min(i,n?c:i+c)))},{passive:!1});let s=()=>{if(e<0)return;if(!r)return void(e=-1);let t=kc.getBoundingClientRect().right;o(n?t>i*Wc:t>i*.65)};window.addEventListener(`touchend`,s),window.addEventListener(`touchcancel`,s)}function qc(e){Kc(),G(`#drawer-toggle`).onclick=Lc,Ac.onclick=Nc,Mc.onclick=()=>e.sessionMenu(Mc),jc.onclick=()=>{Mc.classList.contains(`hidden`)||e.sessionInfo(jc)};let t=G(`#rail-toggle`);t.onclick=()=>Ic(document.body.dataset.rail!==`closed`),Yo(t,`meta+b`,`Toggle sidebar`,()=>Rc()?Lc():Ic(document.body.dataset.rail!==`closed`))}var Jc,Yc=G(`#project-tree`),Xc=G(`#archive-dialog`),Zc=G(`#archive-list`),Qc=G(`#archive-search`),$c=G(`#archive-count`),el=G(`#new-dialog`),tl=`pier.collapsedProjects`,nl=new Set(rl());function rl(){try{let e=JSON.parse(localStorage.getItem(tl)??`[]`);return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}catch{return[]}}function il(e,t){t?nl.add(e):nl.delete(e),localStorage.setItem(tl,JSON.stringify([...nl]))}function al(e,t){let n=new Map;for(let r of e){let e=t(r),i=n.get(e);i?i.push(r):n.set(e,[r])}return n}var ol=e=>al(e,e=>e.cwd),sl=e=>e.repo??e.cwd,cl=e=>e.endsWith(`/.git`)?e.slice(0,-5):void 0,ll=(e,t)=>$n(cl(e)??t[0]?.cwd??e);function ul(e,t){let n=cl(e),r=[...new Set(t.map(e=>e.cwd))];return n&&r.includes(n)?[n,...r.filter(e=>e!==n)]:r}function dl(e,t){return e===t?0:e===void 0?-1:t===void 0?1:e-t}function fl(e){let t=[...al(e,sl)].map(([e,t])=>[e,[...t].sort((e,t)=>(e.branch??e.cwd).localeCompare(t.branch??t.cwd)||dl(e.sort,t.sort)||t.createdAt-e.createdAt)]),n=e=>{let t=e.map(e=>e.projectSort).filter(e=>e!==void 0);return t.length?Math.min(...t):void 0},r=e=>Math.min(...e.map(e=>e.createdAt));return t.sort(([,e],[,t])=>dl(n(e),n(t))||r(t)-r(e))}function pl(e,t,n,r){let i=e.filter(e=>e!==t);return i.splice(i.indexOf(n)+ +!!r,0,t),i}var ml=()=>fl(Jc.sessions().filter(e=>e.listed)),hl=()=>ml().flatMap(([e,t])=>ul(e,t).map(e=>{let n=t.find(t=>t.cwd===e)?.branch;return{path:e,...n?{hint:n}:{}}}));function gl(e,t,n,r){let i=new Map(e.map((e,t)=>[e,t]));for(let e of Jc.sessions()){let r=i.get(t(e));r!==void 0&&n(e,r)}Pl();let a=()=>void Jc.loadSessions();w(`/api/projects/order`,r).then(e=>{e.ok||a()},a)}function _l(e,t,n,r){let i=ml().find(([t])=>t===e);if(!i)return;let a=pl(i[1].map(e=>e.id),t,n,r);gl(a,e=>e.id,(e,t)=>e.sort=t,{sessions:a})}function vl(e,t,n){let r=ml(),i=pl(r.map(([e])=>e),e,t,n);gl(i,sl,(e,t)=>e.projectSort=t,{projects:i.flatMap(e=>{let t=r.find(([t])=>t===e);return t?ul(e,t[1]):[]})})}var yl=null;function bl(e,t){e.style.boxShadow=t===null?``:`inset 0 ${t?-2:2}px 0 0 #818cf8`}function xl(e,t,n,r){e.draggable=!0,e.ondragstart=e=>{e.stopPropagation(),yl={list:t,key:n},e.dataTransfer?.setData(`text/plain`,n)},e.ondragend=()=>{yl=null,Pl()};let i=t=>{let n=e.getBoundingClientRect();return t.clientY>n.top+n.height/2},a=e=>!yl||yl.list!==t||yl.key===n?!1:(e.preventDefault(),e.stopPropagation(),!0);e.ondragover=t=>{a(t)&&bl(e,i(t))},e.ondragleave=()=>bl(e,null),e.ondrop=t=>{let n=yl?.key;bl(e,null),a(t)&&n&&r(n,i(t))}}var Sl=`hidden flex-none rounded px-1 leading-none text-neutral-400 hover:bg-neutral-200 hover:text-neutral-700 group-hover:block pointer-coarse:block`,Cl=e=>e.unread&&e.listed;function wl(e){let[t,n]=e.state===`streaming`?[`bg-green-500 animate-pulse`,`working…`]:Cl(e)?[`bg-amber-500`,`turn finished — not viewed yet`]:e.activeRuns>0?[`bg-sky-500`,`${e.activeRuns} subagent${e.activeRuns>1?`s`:``} running`]:[`bg-neutral-300`,`idle`],r=K(`span`,`h-2 w-2 flex-none rounded-full ${t}`);return r.title=n,r}async function Tl(e,t,n,r,i){let a=t=>{e(t),Pl(),Jc.onPinsChanged()};a(t),(await w(r,i)).ok||a(n)}async function El(e){let t=window.prompt(`Session name — empty resets it to the first message`,e.title??``);t!==null&&await Tl(t=>e.title=t,t.trim()||void 0,e.title,`/api/sessions/${e.id}/rename`,{name:t})}var Dl=(e,t)=>Tl(t=>e.listed=t,t,!t,`/api/sessions/${e.id}/pin`,{pinned:t}),Ol=(e,t)=>e.find(e=>e.cwd===t)?.branch??$n(t),kl=`flex-none truncate rounded bg-neutral-200/70 px-1 font-mono text-[10px] leading-[15px] text-neutral-500`,Al={telegram:`tg`};function jl(e){if(!e.channel||e.channel===`web`)return[];let t=K(`span`,kl,Al[e.channel]??e.channel);return t.title=`answering ${e.channel}`,[t]}function Ml(e){let t=K(`li`,`group flex cursor-pointer items-center gap-1.5 py-1.5 pl-6 pr-3 hover:bg-neutral-100 ${e.id===Jc.currentId()?`bg-indigo-50 hover:bg-indigo-50`:``}`),n=K(`button`,Sl,`⋯`);n.title=`Session actions`,n.onclick=t=>{t.stopPropagation(),Jc.sessionMenu(n,e)};let r=K(`button`,Sl,`✓`);r.title=`Done — remove from Projects (the session and its transcript stay)`,r.onclick=t=>{t.stopPropagation(),Dl(e,!1)},t.append(wl(e),K(`span`,`truncate`,e.title??`untitled`),K(`div`,`ml-auto flex flex-none items-center gap-1`,...jl(e),r,n)),t.onclick=()=>Jc.select(e.id),t.title=`Drag to reorder`;let i=sl(e);return xl(t,i,e.id,(t,n)=>_l(i,t,e.id,n)),t}function Nl(e,t){let n=ul(e,t),r=n[0]??e,i=K(`span`,`flex-none text-[11px] text-neutral-400 group-hover:hidden`,String(t.length)),a=K(`button`,Sl,`⋯`);a.title=`Project actions`,a.onclick=e=>{e.preventDefault(),e.stopPropagation(),uc(a,[...n.map(e=>({label:n.length>1?`New session in ${Ol(t,e)}`:`New session here`,hint:$n(e),onSelect:()=>{$(),Jc.createSession(e)}})),{label:`Browse files`,onSelect:()=>{$(),Jc.openFiles(r)}},{label:`Terminal here`,onSelect:()=>{$(),Jc.openTerminal(r)}},{label:`Remove ${t.length} session${t.length>1?`s`:``} from Projects`,onSelect:()=>{$();for(let e of t)Dl(e,!1)}}])};let{el:o,summary:s}=cr(`border-b border-neutral-200/70`,[K(`span`,`truncate font-mono text-[11px] font-semibold uppercase tracking-wide text-neutral-500`,ll(e,t)),K(`div`,`ml-auto flex flex-none items-center gap-1.5`,i,a)]);s.className+=` group px-3 py-1.5 hover:bg-neutral-100`,s.title=`${n.join(`
77
+ `)}\nDrag to reorder`,xl(s,``,e,(t,n)=>vl(t,e,n)),o.open=!nl.has(e),o.ontoggle=()=>il(e,!o.open);let c=K(`ul`,`pb-1`);return c.append(...t.map(Ml)),o.append(c),o}function Pl(){let e=Jc.sessions().filter(Cl);Hc(e.length),$s(e.filter(e=>e.channel===`web`).length);let t=ml();Yc.replaceChildren(...t.length?t.map(([e,t])=>Nl(e,t)):[K(`p`,`px-3 py-2 text-[12.5px] leading-snug text-neutral-400`,`No projects yet — create a session, or pin one from All sessions.`)]),Xc.open&&Wl()}var Fl=[{name:`activity`,label:`Activity`,detail:`Console — runs, scheduled tasks, dependencies`},{name:`boards`,label:`Boards`,detail:`Console — the static pages Pier publishes`},{name:`settings`,label:`Settings`,detail:`Console — models and providers, agent files and extensions, channels, password, sign out, security`}],Il=[],Ll=0,Rl={ArrowDown:1,ArrowUp:-1},zl={n:1,j:1,p:-1,k:-1};function Bl(e){if(Il.length){Ll=(e+Il.length)%Il.length;for(let[e,{el:t}]of Il.entries())t.classList.toggle(`bg-indigo-100`,e===Ll),t.classList.toggle(`border-indigo-500`,e===Ll);Il[Ll]?.el.scrollIntoView({block:`nearest`})}}function Vl(e){let t=K(`button`,`flex-none rounded px-1.5 py-0.5 text-[11.5px] ${e.listed?`bg-indigo-50 text-indigo-600`:`text-neutral-400 hover:bg-neutral-200 hover:text-neutral-700`}`,e.listed?`pinned`:`pin`);return t.title=e.listed?`Remove from Projects`:`Pin to Projects`,t.onclick=t=>{t.stopPropagation(),Dl(e,!e.listed)},t}function Hl(e){let t=K(`li`,`flex cursor-pointer items-center gap-2 border-l-2 border-transparent px-3 py-1.5 hover:bg-neutral-100`);return t.append(e.session?wl(e.session):K(`span`,`h-2 w-2 flex-none`)),t.append(K(`span`,`min-w-0 flex-1 truncate`,e.label),K(`span`,`max-w-[45%] flex-none truncate text-[11.5px] text-neutral-400`,e.detail)),e.session&&t.append(K(`span`,`flex-none text-[11px] text-neutral-400`,Zn(e.session.createdAt)),Vl(e.session)),t.onclick=e.open,t}var Ul=e=>K(`li`,`px-3 pb-0.5 pt-2 text-[11px] font-semibold uppercase tracking-wide text-neutral-400`,e);function Wl(){let e=Qc.value.trim().toLowerCase(),t=t=>!e||t.toLowerCase().includes(e),n=e=>()=>{Xc.close(),e()},r=e=>e.channel&&e.channel!==`web`?e.channel:``,i=Jc.sessions().filter(e=>t(`${e.title??``} ${e.cwd} ${r(e)}`)),a=(e,t)=>t.createdAt-e.createdAt,o=e=>({label:e.title??er(e.cwd),detail:[$n(e.cwd),r(e)].filter(Boolean).join(` · `),open:n(()=>Jc.select(e.id)),session:e}),s=i.filter(e=>e.state===`streaming`),c=i.filter(e=>e.state!==`streaming`),l=[`Console`,Fl.filter(e=>t(`${e.label} ${e.detail}`)).map(({name:e,label:t,detail:r})=>({label:t,detail:r,open:n(()=>Jc.openConsole(e))}))],u=[[`Running`,s.sort(a).map(o)],[`Projects`,c.filter(e=>e.listed).sort(a).map(o)],[`Other sessions`,c.filter(e=>!e.listed).sort(a).map(o)]];e?u.unshift(l):u.push(l),Il=[];let d=[];for(let[e,t]of u)if(t.length){d.push(Ul(e));for(let e of t){let t=Hl(e);Il.push({el:t,open:e.open}),d.push(t)}}Zc.replaceChildren(...d.length?d:[K(`li`,`px-3 py-3 text-[13px] text-neutral-400`,`Nothing matches.`)]),$c.textContent=String(Il.length),Bl(Ll)}function Gl(){if(Xc.open)return Xc.close();Qc.value=``,Ll=0,Wl(),Xc.showModal(),Qc.focus(),Jc.loadSessions().then(()=>{Xc.open&&Wl()})}function Kl(e){Jc=e,Dc(G(`#new-cwd`),hl);let t=G(`#new-session`),n=()=>{let e=Jc.sessions().find(e=>e.id===Jc.currentId())?.cwd??``,t=G(`#new-cwd`);t.value=e,el.showModal(),t.select()};t.onclick=n,Yo(t,`shift+o`,`New session`,n,()=>el.open),G(`#new-cancel`).onclick=()=>el.close(),G(`#new-form`).onsubmit=()=>void Jc.createSession(G(`#new-cwd`).value.trim());let r=G(`#open-archive`);r.onclick=Gl,Yo(r,`k`,`Search sessions and Console`,Gl,()=>Xc.open),G(`#archive-close`).onclick=()=>Xc.close(),Qc.oninput=()=>{Ll=0,Wl()},Qc.onkeydown=e=>{let t=e.altKey||e.metaKey||e.shiftKey||!e.key?void 0:e.ctrlKey?zl[e.key.toLowerCase()]:Rl[e.key];if(t!==void 0){e.preventDefault(),Bl(Ll+t);return}e.key===`Enter`&&!e.ctrlKey&&(e.preventDefault(),Il[Ll]?.open())}}var ql;function Jl(e){ql=e,$o(Xl,()=>{let e=ql.currentSession();e&&($(),Dl(e,!e.listed))},Yl),$o(Zl,()=>{ql.currentSession()&&($(),ql.toggleFiles())},Yl)}var Yl=()=>document.querySelector(`dialog[open]`)!==null,Xl=`d`,Zl=`i`,Ql=G(`#chat-title`),$l=G(`#chat-menu`),eu=G(`#session-meta`),tu=null,nu=null,ru=null,iu=null;function au(){tu=null,nu=null,ru=null,iu=null,pu()}function ou(e,t,n,r){tu=e,nu=t,ru=n,iu=r,uu()}function su(e){iu=e.completedAt,nu&&={...nu,tokens:e.tokens},pu()}var cu=null;function lu(e){cu=e===null?null:er(e),uu()}function uu(){let e=ql.currentSession();e&&(cu=null),Ql.textContent=e?e.title??er(e.cwd):cu??`no session`,Ql.classList.toggle(`cursor-pointer`,!!e),Ql.title=e?`Session info`:``,Ql.onclick=e?()=>mu(Ql,e):null,$l.classList.toggle(`hidden`,!e),e&&($l.onclick=()=>bu($l,e)),pu(),ql.syncBar()}var du=(e,t)=>Math.min(100,Math.round(e/t.contextWindow*100)),fu=e=>e.tokens===null?`?/${p(e.contextWindow)}`:`${p(e.tokens)}/${p(e.contextWindow)} · ${100-du(e.tokens,e)}% left`;function pu(){let e=nu,t=e?.tokens??null,n=ql.currentId(),r=[];if(n){let e=(e,t)=>{let r=K(`button`,`flex-none cursor-pointer font-mono ${t}`,e);return r.title=`Change model or reasoning`,r.onclick=()=>void hu(r,n),r};tu&&r.push(e(tu.id,`rounded bg-indigo-50 px-1.5 py-px font-medium text-indigo-700 hover:bg-indigo-100`)),ru&&r.push(e(ru,`text-neutral-500 hover:text-indigo-700`))}if(e&&t!==null){let n=du(t,e),i=n>=90?`text-red-700`:n>=70?`text-amber-700`:`text-neutral-500`;r.push(K(`span`,`flex-none font-mono ${i}`,p(t).toLowerCase()))}let i=r.flatMap((e,t)=>t===0?[e]:[K(`span`,`text-neutral-300`,`·`),e]);eu.replaceChildren(...i),eu.classList.toggle(`hidden`,r.length===0),eu.classList.toggle(`flex`,r.length>0)}function mu(e,t){let n=[[`Title`,t.title??`untitled`],[`Directory`,t.cwd],[`Session`,t.id]],r=t.id===ql.currentId();if(r&&(n.push([`Model`,tu?.id??`—`]),n.push([`Reasoning`,ru??`—`]),n.push([`Context`,nu?fu(nu):`—`])),n.push([`Created`,tr(t.createdAt),Qn(t.createdAt)]),r){let e=iu;n.push(e===null?[`Last reply`,`—`]:[`Last reply`,tr(e),Qn(e)])}let i=K(`div`,`flex max-w-80 flex-col gap-1.5 px-3 py-2`);for(let[e,t,r]of n){let n=K(`div`,`flex items-center gap-1.5`,K(`span`,`text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,e),sr(`cursor-pointer text-[10.5px] uppercase tracking-wide text-neutral-400 opacity-0 hover:text-neutral-700 focus:opacity-100 group-hover:opacity-100 pointer-coarse:opacity-100`,()=>t)),a=K(`span`,`break-all font-mono text-[12px] text-neutral-700`,t);r&&a.append(K(`span`,`ml-1.5 font-sans text-[11px] text-neutral-400`,r)),i.append(K(`div`,`group flex flex-col`,n,a))}cc(e,i)}async function hu(e,t){try{let[n,r]=await Promise.all([D(`/api/sessions/${t}/models`,`Could not load models`),D(`/api/sessions/${t}/thinking`,`Could not read the reasoning level`)]);cc(e,vc({models:n,current:t===ql.currentId()?tu:null,thinkingLevel:r.level,thinkingLevels:r.levels,onPick:(e,n)=>{$(),gu(t,e,n)},onThinkingPick:e=>void vu(t,e)}))}catch(e){Z(`error`,`model options failed: ${String(e)}`)}}async function gu(e,t,n){await _u(e,t)&&n&&await vu(e,n)}async function _u(e,t){let n=tu;e===ql.currentId()&&(tu=t,uu());let r=await w(`/api/sessions/${e}/model`,t);if(!r.ok){let{error:t}=await r.json().catch(()=>({}));return e===ql.currentId()&&(tu=n,uu()),Z(`error`,`model change failed: ${t??r.status}`),!1}let{model:i}=await r.json();return e===ql.currentId()&&i&&(tu=i,uu()),!0}async function vu(e,t){let n=await w(`/api/sessions/${e}/thinking`,{level:t});if(!n.ok){Z(`error`,`reasoning change failed: ${n.status}`);return}let{level:r}=await n.json();e===ql.currentId()&&(ru=r,pu())}async function yu(e){let t=await w(`/api/sessions/${e}/compact`,{});t.ok||Z(`error`,`compact failed: ${await T(t,`no reason given`)}`)}function bu(e,t){let n=t.id===ql.currentId();uc(e,[{label:`Session info`,onSelect:()=>mu(e,t)},{label:`Rename…`,onSelect:()=>{$(),El(t)}},{label:t.listed?`Done — remove from Projects`:`Pin to Projects`,hint:n?Ko(Xl):``,onSelect:()=>{$(),Dl(t,!t.listed)}},{label:`Model`,hint:n?tu?.id??`…`:``,onSelect:()=>void hu(e,t.id)},{label:`Compact context`,onSelect:()=>{$(),yu(t.id)}},{label:`New session here`,hint:$n(t.cwd),onSelect:()=>{$(),ql.createSession(t.cwd)}},{label:`Browse files`,hint:n?Ko(Zl):``,onSelect:()=>{$(),ql.openFiles(n?void 0:t.cwd)}}])}var xu=`pier.theme`,Su=[`system`,`light`,`dark`],Cu=window.matchMedia(`(prefers-color-scheme: dark)`),wu={system:`<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" class="h-3.5 w-3.5"><circle cx="8" cy="8" r="5.25"/><path d="M8 2.75a5.25 5.25 0 0 0 0 10.5z" fill="currentColor" stroke="none"/></svg>`,light:`<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" class="h-3.5 w-3.5"><circle cx="8" cy="8" r="3.1"/><path d="M8 1.5v1.4M8 13.1v1.4M1.5 8h1.4M13.1 8h1.4M3.4 3.4l1 1M11.6 11.6l1 1M12.6 3.4l-1 1M4.4 11.6l-1 1"/></svg>`,dark:`<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round" class="h-3.5 w-3.5"><path d="M13 9.4A5.6 5.6 0 0 1 6.6 3a5.6 5.6 0 1 0 6.4 6.4z"/></svg>`},Tu=()=>{let e=null;try{e=localStorage.getItem(xu)}catch{return`system`}return e===`light`||e===`dark`?e:`system`},Eu=()=>{let e=Tu();return e===`system`?Cu.matches?`dark`:`light`:e};function Du(){let e=Eu();document.documentElement.dataset.theme=e,G(`meta[name="theme-color"]`).setAttribute(`content`,e===`dark`?`#1c1c1c`:`#fafafa`),window.dispatchEvent(new Event(`pier:theme`))}function Ou(){let e=G(`#theme-toggle`),t=()=>{let t=Tu();e.title=`Theme: ${t}${t===`system`?` (${Eu()})`:``}`,e.innerHTML=wu[t],Du()};e.onclick=()=>{let e=Su[(Su.indexOf(Tu())+1)%Su.length];try{e===`system`?localStorage.removeItem(xu):localStorage.setItem(xu,e)}catch{}t()},Cu.addEventListener(`change`,t),t()}var ku=`https://github.com/timqi/pier`,Au=[`text-neutral-400`,`hover:text-neutral-700`],ju=[`rounded-full`,`bg-emerald-50`,`px-1.5`,`text-emerald-700`,`ring-1`,`ring-inset`,`ring-emerald-600/20`,`hover:bg-emerald-100`],Mu=18e5,Nu=null,Pu=G(`#version`);function Fu(e){let t=Nu?.available===!0&&Nu.latest!==null;Pu.textContent=`v${e}`,Pu.title=t?`Pier ${Nu?.latest} is out`:``,Pu.classList.remove(...t?Au:ju),Pu.classList.add(...t?ju:Au)}var Iu=e=>K(`p`,`px-3 py-1 text-[12px] leading-snug text-neutral-500`,e);function Lu(){let e=K(`div`,`flex w-72 flex-col gap-1 py-1`);if(!Nu)return e.append(Iu(`Checking the registry…`)),e;let{current:t,latest:n,available:r,canApply:i,problem:a}=Nu;e.append(K(`p`,`px-3 py-1 text-[12.5px] font-medium text-neutral-700`,r?`Pier ${n} is out`:`Pier ${t}`)),e.append(Iu(r?`You are running ${t}.`:n===null?`The registry could not be reached, so this may not be the latest.`:`This is the latest release.`));let o=K(`span`,`px-3 text-[11.5px] text-neutral-400`,``),s=K(`div`,`flex items-center gap-2 px-3 py-1.5`);if(a&&e.append(K(`p`,`mx-3 my-1 rounded-md bg-red-50 px-2 py-1.5 text-[11.5px] leading-snug text-red-700`,a)),r&&i&&!a){let e=q(`Update now`,!0);e.onclick=()=>{e.disabled=!0,o.className=`px-3 text-[11.5px] text-neutral-400`,o.textContent=`starting the updater…`,(async()=>{let t=await w(`/api/update`,{});if(!t.ok){e.disabled=!1,o.className=`px-3 text-[11.5px] text-red-600`,o.textContent=await T(t,`Could not update`);return}let{draining:n}=await t.json();o.textContent=n?`Waiting for running work to finish — Pier then stops, installs and starts again.`:`Pier is stopping, installing and starting again — this page reconnects on its own.`})()},s.append(e)}let c=K(`a`,`btn text-[12.5px] no-underline`,`Source`);c.href=r?`${ku}/releases`:ku,c.target=`_blank`,c.rel=`noreferrer`,c.title=`Pier is free software (AGPL-3.0)`,s.append(c),e.append(s,o),r&&!i&&!a&&e.append(Iu(`No service manager owns this Pier, so it cannot restart itself — update it with: pier update`));let l=yr(`Update automatically`,i?`Installs a new release once nothing is running — no turn in flight, no task run.`:`Needs the systemd service (pier service install); nothing here can restart Pier.`,Nu.autoUpdate,e=>{Nu&&(Nu.autoUpdate=e),(async()=>{let t=await w(`/api/settings`,{autoUpdate:e},`PUT`);if(t.ok)return;Nu&&(Nu.autoUpdate=!e);let n=l.querySelector(`input`);n&&(n.checked=!e),o.className=`px-3 text-[11.5px] text-red-600`,o.textContent=await T(t,`Could not save`)})()});if(!i){let e=l.querySelector(`input`);e&&(e.disabled=!0)}return e.append(K(`div`,`mt-1 border-t border-neutral-200 px-3 pb-1 pt-2`,l)),e}async function Ru(e){let t=await E(`/api/update`,`Update check failed`);t.ok&&(Nu=t.value,Fu(Nu.current||e))}function zu(e){Fu(e),Pu.onclick=e=>{e.preventDefault(),cc(Pu,Lu())};let t=()=>void Ru(e).catch(()=>{});t(),setInterval(t,Mu)}var Bu=(e,t={})=>{let n=document.createElementNS(`http://www.w3.org/2000/svg`,e);for(let[e,r]of Object.entries(t))n.setAttribute(e,r);return n},Vu=e=>e===null?`-`:nr(Date.now()-e),Hu={light:{edge:`#a3a3a3`,callback:`#0891b2`,message:`#d97706`,scheduler:{fill:`#f5f3ff`,stroke:`#a78bfa`,text:`#5b21b6`},console:{fill:`#eff6ff`,stroke:`#93c5fd`,text:`#1d4ed8`},task:{fill:`#fffbeb`,stroke:`#fbbf24`,text:`#92400e`},process:{fill:`#f5f5f5`,stroke:`#a3a3a3`,text:`#525252`,dash:`4 3`},streaming:{fill:`#ffffff`,stroke:`#10b981`,text:`#262626`},idle:{fill:`#fafafa`,stroke:`#d4d4d4`,text:`#737373`}},dark:{edge:`#7a7a7a`,callback:`#3fc3dd`,message:`#e0a13a`,scheduler:{fill:`#2b2440`,stroke:`#7d63c9`,text:`#c9b8f5`},console:{fill:`#1f2a3d`,stroke:`#4a7fbf`,text:`#a8c8f0`},task:{fill:`#3a2f1c`,stroke:`#b8862a`,text:`#f0d49a`},process:{fill:`#262626`,stroke:`#5c5c5c`,text:`#a3a3a3`,dash:`4 3`},streaming:{fill:`#22302a`,stroke:`#10b981`,text:`#e5e5e5`},idle:{fill:`#212121`,stroke:`#4a4a4a`,text:`#9a9a9a`}}},Uu=()=>Hu[document.documentElement.dataset.theme===`dark`?`dark`:`light`];function Wu(e,t,n){let r=`sessions`,i=`active`,a={sessions:[],runs:[],messages:[]},o=``,s=C(async()=>{let t=i,n=await fetch(`/api/activity?scope=${t}`);if(!n.ok){o=``,e.replaceChildren(K(`p`,`p-4 text-[13px] text-red-600`,`Failed to load activity: ${n.status}`));return}let r=await n.text();if(t!==i||r===o)return;o=r;let s=JSON.parse(r);a={...s,sessions:s.sessions.map(e=>({...e,title:S(e.title)}))},c()});function c(){let t=K(`header`,`flex h-10 flex-none items-center gap-2 border-b border-neutral-200 px-4 max-md:hidden`,K(`span`,`font-medium`,`Activity`)),a=K(`div`,`tabstrip`);a.append(dr(`Sessions`,r===`sessions`,()=>{r=`sessions`,c()}),dr(`Dependencies`,r===`dependencies`,()=>{r=`dependencies`,c()}),dr(`Tasks`,!1,()=>n()));let o=K(`div`,`ml-auto flex gap-1 max-md:ml-0 max-md:w-full`),d=e=>()=>{i=e,c(),s()};o.append(dr(`Active`,i===`active`,d(`active`)),dr(`Last 24h`,i===`recent`,d(`recent`))),a.append(o);let f=K(`div`,`min-h-0 flex-1 overflow-auto`);r===`sessions`?l(f):u(f),e.replaceChildren(t,a,f)}function l(e){let n=document.createElement(`table`);n.className=`w-full min-w-[38rem] table-fixed text-left text-[12.5px]`,n.innerHTML=`<thead class="bg-neutral-50 text-[10.5px] uppercase text-neutral-400"><tr>
78
78
  <th class="w-[34%] px-4 py-2 font-semibold">Session</th>
79
79
  <th class="w-[38%] px-2 py-2 font-semibold">Project</th>
80
80
  <th class="w-[14%] px-2 py-2 font-semibold">State</th>
81
- <th class="px-2 py-2 font-semibold">Duration</th></tr></thead>`;let r=document.createElement(`tbody`);for(let e of a.sessions){let n=document.createElement(`tr`);n.className=`cursor-pointer border-b border-neutral-100 hover:bg-neutral-50`,n.onclick=()=>t(e.id),n.append(K(`td`,`px-4 py-2.5`,K(`div`,`truncate font-medium`,e.title??`Untitled session`),K(`div`,`truncate font-mono text-[11px] text-neutral-400`,e.id)),K(`td`,`truncate px-2 py-2.5 font-mono text-[11.5px]`,e.cwd||`-`),K(`td`,`px-2 py-2.5`,K(`span`,`mr-2 inline-block h-2 w-2 rounded-full ${e.state===`streaming`?`animate-pulse bg-green-500`:`bg-neutral-300`}`),e.state),K(`td`,`px-2 py-2.5 text-neutral-500`,Ru(e.stateSince))),r.append(n)}n.append(r),e.append(n),a.sessions.length||e.append(K(`p`,`p-4 text-[13px] text-neutral-400`,i===`active`?`No active sessions.`:`No sessions in the last 24 hours.`))}function u(e){let r=new Map,o=[],s=(e,t,n,i)=>{r.has(e)||r.set(e,{id:e,label:t,kind:n,state:i})};for(let e of a.sessions)s(e.id,e.title??e.id.slice(0,10),`session`,e.state);for(let e of a.runs){let t=e.invokedBySessionId??`scheduler`,n=e.targetSessionId??(e.context.definition.action.type===`bash`?`process:${e.id}`:`task:${e.id}`);s(t,t===`scheduler`?`Scheduler`:t.slice(0,10),t===`scheduler`?`scheduler`:`session`),s(n,e.targetSessionId?e.targetSessionId.slice(0,10):e.context.definition.action.type===`bash`?`Bash process`:`Task`,e.targetSessionId?`session`:e.context.definition.action.type===`bash`?`process`:`task`),o.push({from:t,to:n,run:e,kind:`invocation`}),e.callbackSessionId&&(s(e.callbackSessionId,e.callbackSessionId.slice(0,10),`session`),o.push({from:n,to:e.callbackSessionId,run:e,kind:`callback`}))}for(let e of a.messages){if(!e.fromSessionId||!e.toSessionId||e.fromSessionId===e.toSessionId)continue;let t=a.runs.find(t=>t.id===e.runId);if(t){for(let t of[e.fromSessionId,e.toSessionId])s(t,t===`console`?`Console`:t.slice(0,10),t===`console`?`console`:`session`);o.push({from:e.fromSessionId,to:e.toSessionId,run:t,kind:`message`})}}if(!r.size){e.append(K(`p`,`p-4 text-[13px] text-neutral-400`,i===`active`?`No active dependencies.`:`No dependencies in the last 24 hours.`));return}let c=[...r.values()],l=new Set(o.map(e=>e.to)),u=new Map,d=c.filter(e=>!l.has(e.id)).map(e=>e.id);d.length||d.push(c[0].id);for(let e of d)u.set(e,0);for(;d.length;){let e=d.shift();for(let t of o)t.from!==e||u.has(t.to)||(u.set(t.to,u.get(e)+1),d.push(t.to))}for(let e of c)u.has(e.id)||u.set(e.id,0);let f=new Map;for(let e of c){let t=u.get(e.id);f.set(t,[...f.get(t)??[],e])}let p=Math.max(...f.keys())+1,m=Math.max(...[...f.values()].map(e=>e.length)),h=o.some(e=>e.from!==e.to&&u.get(e.from)===u.get(e.to))?40:0,g=56+p*180+(p-1)*110+h,_=56+m*46+(m-1)*30,v=new Map;for(let[e,t]of f)t.forEach((t,n)=>v.set(t.id,{x:28+e*290+90,y:28+n*76+23}));let y=Lu(`svg`,{width:String(g),height:String(_),viewBox:`0 0 ${g} ${_}`,class:`block`}),b=Lu(`defs`),x=Bu();for(let[e,t]of[[`activity-arrow`,x.edge],[`activity-arrow-cb`,x.callback],[`activity-arrow-msg`,x.message]]){let n=Lu(`marker`,{id:e,viewBox:`0 0 10 10`,refX:`9`,refY:`5`,markerWidth:`6`,markerHeight:`6`,orient:`auto-start-reverse`});n.append(Lu(`path`,{d:`M 0 0 L 10 5 L 0 10 z`,fill:t})),b.append(n)}y.append(b);let S=new Set;for(let e of o){let t=`${e.from}→${e.to}:${e.kind}`;if(S.has(t))continue;S.add(t);let r=v.get(e.from),i=v.get(e.to),a=Lu(`path`,{d:r.x===i.x?`M ${r.x+90} ${r.y} C ${r.x+90+46} ${r.y}, ${i.x+90+46} ${i.y}, ${i.x+90} ${i.y}`:(()=>{let e=i.x>r.x,t=r.x+(e?90:-90),n=i.x+(e?-90:90),a=Math.max(36,Math.abs(n-t)*.45)*(e?1:-1);return`M ${t} ${r.y} C ${t+a} ${r.y}, ${n-a} ${i.y}, ${n} ${i.y}`})(),fill:`none`,stroke:e.kind===`callback`?x.callback:e.kind===`message`?x.message:x.edge,"stroke-width":`1.5`,"marker-end":e.kind===`callback`?`url(#activity-arrow-cb)`:e.kind===`message`?`url(#activity-arrow-msg)`:`url(#activity-arrow)`});e.kind===`callback`&&a.setAttribute(`stroke-dasharray`,`6 5`),e.kind===`message`&&a.setAttribute(`stroke-dasharray`,`2 5`),a.classList.add(`cursor-pointer`),a.onclick=()=>n(e.run.taskId),y.append(a)}let C=/[\u1100-\u11FF\u2E80-\uA4CF\uAC00-\uD7A3\uF900-\uFAFF\uFE30-\uFE4F\uFF00-\uFF60\uFFE0-\uFFE6]/,w=(e,t)=>{let n=0;for(let r=0;r<e.length;r++)if(n+=C.test(e[r])?2:1,n>t)return`${e.slice(0,r)}…`;return e};for(let e of c){let n=v.get(e.id),r=e.kind===`session`?e.state===`streaming`?x.streaming:x.idle:x[e.kind],i=Lu(`g`,{transform:`translate(${n.x},${n.y})`});e.kind===`session`&&i.classList.add(`cursor-pointer`),i.onclick=()=>{e.kind===`session`&&t(e.id)};let a=Lu(`rect`,{x:`-90`,y:`-23`,width:`180`,height:`46`,rx:`10`,fill:r.fill,stroke:r.stroke,"stroke-width":e.kind===`session`&&e.state===`streaming`?`1.5`:`1`});r.dash&&a.setAttribute(`stroke-dasharray`,r.dash),i.append(a);let o=-78;if(e.kind===`session`){let t=Lu(`circle`,{cx:`-75`,cy:`0`,r:`3.5`,fill:r.stroke});if(e.state===`streaming`){let e=Lu(`animate`,{attributeName:`opacity`,values:`1;0.3;1`,dur:`1.6s`,repeatCount:`indefinite`});t.append(e)}i.append(t),o=-64}let s=Lu(`text`,{x:String(o),"text-anchor":`start`,"dominant-baseline":`middle`,"font-size":`11.5`,"font-weight":e.kind===`session`?`500`:`400`,fill:r.text});s.textContent=w(e.label,e.kind===`session`?22:25);let c=Lu(`title`);c.textContent=e.label===e.id?e.id:`${e.label}\n${e.id}`,i.append(s,c),y.append(i)}let T=e=>K(`span`,`inline-block h-2 w-2 rounded-full ${e}`);e.append(K(`div`,`w-max p-4`,y),K(`div`,`flex flex-wrap gap-x-5 gap-y-1 border-t border-neutral-200 px-4 py-2 text-[11px] text-neutral-500`,K(`span`,``,`Solid: task invocation`),K(`span`,`text-cyan-700`,`Dashed: callback`),K(`span`,`text-amber-700`,`Dotted: supervisor/control`),K(`span`,`inline-flex items-center gap-1.5`,T(`bg-emerald-500`),`streaming`),K(`span`,`inline-flex items-center gap-1.5`,T(`bg-neutral-300`),`idle`)))}let d=nr(e,e=>{e===`dependencies`?r=`dependencies`:e===`sessions`&&(r=`sessions`),s()},()=>{e.replaceChildren(),a={sessions:[],runs:[],messages:[]},o=``});return window.addEventListener(`pier:theme`,()=>{d.visible&&c()}),Object.assign(d,{refresh(){d.visible&&s()}})}var Hu=e=>e.public&&e.token?`/p/${e.slug}-${e.token}/`:`/boards/${e.slug}/`;function Uu(e,t){let n=[],r=``,i=K(`header`,`sticky top-0 z-30 flex h-10 items-center gap-3 border-b border-neutral-200 bg-white px-4`,K(`span`,`font-medium max-md:hidden`,`Boards`)),a=K(`div`,`px-4 py-5`);e.append(K(`div`,`min-h-0 flex-1 overflow-y-auto`,i,a));async function o(e,t){let n=await w(`/api/boards/${e.slug}`,{public:t},`PATCH`);if(n.ok)return e.token=(await n.json().catch(()=>({}))).token??``,u();r=`Could not change ${e.slug}: ${n.status}`,await d()}async function s(e){let t=await fetch(`/api/boards/${e}`,{method:`DELETE`});t.ok||(r=`Could not delete ${e}: ${t.status}`),await d()}function c(e){let n=K(`div`,`group flex flex-col gap-1 border-b border-neutral-200/70 px-1 py-2.5 last:border-b-0`),r=document.createElement(`a`);r.className=`truncate font-medium text-neutral-800 hover:text-indigo-700`,r.href=Hu(e),r.target=`_blank`,r.rel=`noreferrer`,r.textContent=e.title;let i=K(`div`,`flex items-center gap-2`,r,K(`span`,`flex-none font-mono text-[11.5px] text-neutral-400`,e.slug)),a=vr(``,``,e.public,t=>{e.public=t,o(e,t)});a.className=`ml-auto flex flex-none cursor-pointer items-center gap-1.5 text-[11.5px] text-neutral-500`,a.append(K(`span`,``,`Public`));let c=lr(`Delete`,`flex-none cursor-pointer text-[11.5px] text-neutral-400 opacity-0 transition-opacity hover:text-red-600 group-hover:opacity-100`);c.title=`Renames the folder on disk; nothing is erased`,c.onclick=()=>void s(e.slug);let l=or(`flex-none cursor-pointer text-[11.5px] text-neutral-400 opacity-0 transition-opacity hover:text-indigo-600 group-hover:opacity-100`,()=>`${location.origin}${Hu(e)}`);l.title=`Copy the board's link`,i.append(a,l,c),n.append(i);let u=K(`div`,`flex flex-wrap items-center gap-x-3 gap-y-1 text-[11.5px] text-neutral-500`);e.description&&u.append(K(`span`,`min-w-0 truncate`,e.description)),u.append(K(`span`,`flex-none text-neutral-400`,Zn(Date.parse(e.updatedAt))));for(let n of e.sessions){let e=lr(n.slice(0,8),`flex-none cursor-pointer font-mono text-indigo-600 hover:underline`);e.title=`Open session ${n}`,e.onclick=()=>t(n),u.append(e)}if(e.public&&e.token){let t=K(`span`,`flex-none font-mono text-neutral-400`,Hu(e));t.title=`Public URL — anyone holding this link can read the board, no password`,u.append(t)}return n.append(u),n}let l=[{title:`Public`,hint:`Readable at /p/<slug>-<token>/ by anyone holding the link.`,wanted:!0},{title:`Private`,hint:`Reachable from the Console only.`,wanted:!1}];function u(){let e=K(`div`,`mx-auto flex max-w-3xl flex-col`);n.length===0&&e.append(K(`p`,`rounded-xl border border-dashed border-neutral-300 px-4 py-6 text-center text-[12.5px] text-neutral-500`,`No boards yet. Ask an agent to build one — it writes a folder under ~/.pier/boards.`));for(let{title:t,hint:r,wanted:i}of l){let a=n.filter(e=>e.public===i);if(a.length===0)continue;let o=K(`section`,`mb-6`);o.append(K(`h2`,`text-[13px] font-semibold text-neutral-700`,t)),o.append(K(`p`,`mb-1 text-[11.5px] leading-snug text-neutral-500`,r));let s=K(`div`,`rounded-xl border border-neutral-200 bg-white px-3`);s.append(...a.map(c)),o.append(s),e.append(o)}a.replaceChildren(...r?[K(`p`,`mb-3 text-[13px] text-red-600`,r)]:[],e)}async function d(){let e=await E(`/api/boards`,`Could not load boards`);if(!e.ok)return r=e.error,u();n=e.value,u(),r=``}let f=nr(e,()=>void d());return window.addEventListener(`focus`,()=>{f.visible&&d()}),f}var Wu=2e4,Gu=e=>e.map((e,t)=>({nums:[t+1],text:e,tone:``}));function Ku(e,t){let n=e.length<=Wu?t:null,r=Math.max(2,...e.map(e=>e.nums.reduce((e,t)=>Math.max(e,String(t).length),0))),i=K(`div`,`py-2 font-mono text-[12px] leading-[1.5]`);for(let t of e){let e=K(`div`,`flex pl-2 pr-4 ${t.tone===`add`?`bg-emerald-50`:t.tone===`del`?`bg-red-50`:``}`);for(let n of t.nums){let t=K(`span`,`flex-none select-none pr-1.5 text-right text-neutral-300`,n===``?``:String(n));t.style.width=`calc(${r}ch + 0.375rem)`,e.append(t)}e.append(qu(t,n)),i.append(e)}return i}function qu(e,t){let n=`min-w-0 flex-1 whitespace-pre-wrap [overflow-wrap:anywhere]`;if(!e.mark||e.mark[0]>=e.mark[1]){let r=Ki(e.text,t);return r.className=n,r}let[r,i]=e.mark,a=Ki(e.text.slice(r,i),t);return a.className=`rounded-xs ${e.tone===`add`?`bg-emerald-200/80`:`bg-red-200/70`}`,K(`span`,n,Ki(e.text.slice(0,r),t),a,Ki(e.text.slice(i),t))}var Ju=e=>{let t=new Date(e),n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}:${n(t.getSeconds())}`},Yu=e=>[e.subject,e.body,[[e.author,e.email?`<${e.email}>`:``].filter(Boolean).join(` `),e.at?Ju(e.at):``].filter(Boolean).join(` · `)].filter(Boolean).join(`
81
+ <th class="px-2 py-2 font-semibold">Duration</th></tr></thead>`;let r=document.createElement(`tbody`);for(let e of a.sessions){let n=document.createElement(`tr`);n.className=`cursor-pointer border-b border-neutral-100 hover:bg-neutral-50`,n.onclick=()=>t(e.id),n.append(K(`td`,`px-4 py-2.5`,K(`div`,`truncate font-medium`,e.title??er(e.cwd)),K(`div`,`truncate font-mono text-[11px] text-neutral-400`,e.id)),K(`td`,`truncate px-2 py-2.5 font-mono text-[11.5px]`,e.cwd||`-`),K(`td`,`px-2 py-2.5`,K(`span`,`mr-2 inline-block h-2 w-2 rounded-full ${e.state===`streaming`?`animate-pulse bg-green-500`:`bg-neutral-300`}`),e.state),K(`td`,`px-2 py-2.5 text-neutral-500`,Vu(e.stateSince))),r.append(n)}n.append(r),e.append(n),a.sessions.length||e.append(K(`p`,`p-4 text-[13px] text-neutral-400`,i===`active`?`No active sessions.`:`No sessions in the last 24 hours.`))}function u(e){let r=new Map,o=[],s=(e,t,n,i)=>{r.has(e)||r.set(e,{id:e,label:t,kind:n,state:i})};for(let e of a.sessions)s(e.id,e.title??e.id.slice(0,10),`session`,e.state);for(let e of a.runs){let t=e.invokedBySessionId??`scheduler`,n=e.targetSessionId??(e.context.definition.action.type===`bash`?`process:${e.id}`:`task:${e.id}`);s(t,t===`scheduler`?`Scheduler`:t.slice(0,10),t===`scheduler`?`scheduler`:`session`),s(n,e.targetSessionId?e.targetSessionId.slice(0,10):e.context.definition.action.type===`bash`?`Bash process`:`Task`,e.targetSessionId?`session`:e.context.definition.action.type===`bash`?`process`:`task`),o.push({from:t,to:n,run:e,kind:`invocation`}),e.callbackSessionId&&(s(e.callbackSessionId,e.callbackSessionId.slice(0,10),`session`),o.push({from:n,to:e.callbackSessionId,run:e,kind:`callback`}))}for(let e of a.messages){if(!e.fromSessionId||!e.toSessionId||e.fromSessionId===e.toSessionId)continue;let t=a.runs.find(t=>t.id===e.runId);if(t){for(let t of[e.fromSessionId,e.toSessionId])s(t,t===`console`?`Console`:t.slice(0,10),t===`console`?`console`:`session`);o.push({from:e.fromSessionId,to:e.toSessionId,run:t,kind:`message`})}}if(!r.size){e.append(K(`p`,`p-4 text-[13px] text-neutral-400`,i===`active`?`No active dependencies.`:`No dependencies in the last 24 hours.`));return}let c=[...r.values()],l=new Set(o.map(e=>e.to)),u=new Map,d=c.filter(e=>!l.has(e.id)).map(e=>e.id);d.length||d.push(c[0].id);for(let e of d)u.set(e,0);for(;d.length;){let e=d.shift();for(let t of o)t.from!==e||u.has(t.to)||(u.set(t.to,u.get(e)+1),d.push(t.to))}for(let e of c)u.has(e.id)||u.set(e.id,0);let f=new Map;for(let e of c){let t=u.get(e.id);f.set(t,[...f.get(t)??[],e])}let p=Math.max(...f.keys())+1,m=Math.max(...[...f.values()].map(e=>e.length)),h=o.some(e=>e.from!==e.to&&u.get(e.from)===u.get(e.to))?40:0,g=56+p*180+(p-1)*110+h,_=56+m*46+(m-1)*30,v=new Map;for(let[e,t]of f)t.forEach((t,n)=>v.set(t.id,{x:28+e*290+90,y:28+n*76+23}));let y=Bu(`svg`,{width:String(g),height:String(_),viewBox:`0 0 ${g} ${_}`,class:`block`}),b=Bu(`defs`),x=Uu();for(let[e,t]of[[`activity-arrow`,x.edge],[`activity-arrow-cb`,x.callback],[`activity-arrow-msg`,x.message]]){let n=Bu(`marker`,{id:e,viewBox:`0 0 10 10`,refX:`9`,refY:`5`,markerWidth:`6`,markerHeight:`6`,orient:`auto-start-reverse`});n.append(Bu(`path`,{d:`M 0 0 L 10 5 L 0 10 z`,fill:t})),b.append(n)}y.append(b);let S=new Set;for(let e of o){let t=`${e.from}→${e.to}:${e.kind}`;if(S.has(t))continue;S.add(t);let r=v.get(e.from),i=v.get(e.to),a=Bu(`path`,{d:r.x===i.x?`M ${r.x+90} ${r.y} C ${r.x+90+46} ${r.y}, ${i.x+90+46} ${i.y}, ${i.x+90} ${i.y}`:(()=>{let e=i.x>r.x,t=r.x+(e?90:-90),n=i.x+(e?-90:90),a=Math.max(36,Math.abs(n-t)*.45)*(e?1:-1);return`M ${t} ${r.y} C ${t+a} ${r.y}, ${n-a} ${i.y}, ${n} ${i.y}`})(),fill:`none`,stroke:e.kind===`callback`?x.callback:e.kind===`message`?x.message:x.edge,"stroke-width":`1.5`,"marker-end":e.kind===`callback`?`url(#activity-arrow-cb)`:e.kind===`message`?`url(#activity-arrow-msg)`:`url(#activity-arrow)`});e.kind===`callback`&&a.setAttribute(`stroke-dasharray`,`6 5`),e.kind===`message`&&a.setAttribute(`stroke-dasharray`,`2 5`),a.classList.add(`cursor-pointer`),a.onclick=()=>n(e.run.taskId),y.append(a)}let C=/[\u1100-\u11FF\u2E80-\uA4CF\uAC00-\uD7A3\uF900-\uFAFF\uFE30-\uFE4F\uFF00-\uFF60\uFFE0-\uFFE6]/,w=(e,t)=>{let n=0;for(let r=0;r<e.length;r++)if(n+=C.test(e[r])?2:1,n>t)return`${e.slice(0,r)}…`;return e};for(let e of c){let n=v.get(e.id),r=e.kind===`session`?e.state===`streaming`?x.streaming:x.idle:x[e.kind],i=Bu(`g`,{transform:`translate(${n.x},${n.y})`});e.kind===`session`&&i.classList.add(`cursor-pointer`),i.onclick=()=>{e.kind===`session`&&t(e.id)};let a=Bu(`rect`,{x:`-90`,y:`-23`,width:`180`,height:`46`,rx:`10`,fill:r.fill,stroke:r.stroke,"stroke-width":e.kind===`session`&&e.state===`streaming`?`1.5`:`1`});r.dash&&a.setAttribute(`stroke-dasharray`,r.dash),i.append(a);let o=-78;if(e.kind===`session`){let t=Bu(`circle`,{cx:`-75`,cy:`0`,r:`3.5`,fill:r.stroke});if(e.state===`streaming`){let e=Bu(`animate`,{attributeName:`opacity`,values:`1;0.3;1`,dur:`1.6s`,repeatCount:`indefinite`});t.append(e)}i.append(t),o=-64}let s=Bu(`text`,{x:String(o),"text-anchor":`start`,"dominant-baseline":`middle`,"font-size":`11.5`,"font-weight":e.kind===`session`?`500`:`400`,fill:r.text});s.textContent=w(e.label,e.kind===`session`?22:25);let c=Bu(`title`);c.textContent=e.label===e.id?e.id:`${e.label}\n${e.id}`,i.append(s,c),y.append(i)}let T=e=>K(`span`,`inline-block h-2 w-2 rounded-full ${e}`);e.append(K(`div`,`w-max p-4`,y),K(`div`,`flex flex-wrap gap-x-5 gap-y-1 border-t border-neutral-200 px-4 py-2 text-[11px] text-neutral-500`,K(`span`,``,`Solid: task invocation`),K(`span`,`text-cyan-700`,`Dashed: callback`),K(`span`,`text-amber-700`,`Dotted: supervisor/control`),K(`span`,`inline-flex items-center gap-1.5`,T(`bg-emerald-500`),`streaming`),K(`span`,`inline-flex items-center gap-1.5`,T(`bg-neutral-300`),`idle`)))}let d=rr(e,e=>{e===`dependencies`?r=`dependencies`:e===`sessions`&&(r=`sessions`),s()},()=>{e.replaceChildren(),a={sessions:[],runs:[],messages:[]},o=``});return window.addEventListener(`pier:theme`,()=>{d.visible&&c()}),Object.assign(d,{refresh(){d.visible&&s()}})}var Gu=e=>e.public&&e.token?`/p/${e.slug}-${e.token}/`:`/boards/${e.slug}/`;function Ku(e,t){let n=[],r=``,i=K(`header`,`sticky top-0 z-30 flex h-10 items-center gap-3 border-b border-neutral-200 bg-white px-4`,K(`span`,`font-medium max-md:hidden`,`Boards`)),a=K(`div`,`px-4 py-5`);e.append(K(`div`,`min-h-0 flex-1 overflow-y-auto`,i,a));async function o(e,t){let n=await w(`/api/boards/${e.slug}`,{public:t},`PATCH`);if(n.ok)return e.token=(await n.json().catch(()=>({}))).token??``,u();r=`Could not change ${e.slug}: ${n.status}`,await d()}async function s(e){let t=await fetch(`/api/boards/${e}`,{method:`DELETE`});t.ok||(r=`Could not delete ${e}: ${t.status}`),await d()}function c(e){let n=K(`div`,`group flex flex-col gap-1 border-b border-neutral-200/70 px-1 py-2.5 last:border-b-0`),r=document.createElement(`a`);r.className=`truncate font-medium text-neutral-800 hover:text-indigo-700`,r.href=Gu(e),r.target=`_blank`,r.rel=`noreferrer`,r.textContent=e.title;let i=K(`div`,`flex items-center gap-2`,r,K(`span`,`flex-none font-mono text-[11.5px] text-neutral-400`,e.slug)),a=yr(``,``,e.public,t=>{e.public=t,o(e,t)});a.className=`ml-auto flex flex-none cursor-pointer items-center gap-1.5 text-[11.5px] text-neutral-500`,a.append(K(`span`,``,`Public`));let c=ur(`Delete`,`flex-none cursor-pointer text-[11.5px] text-neutral-400 opacity-0 transition-opacity hover:text-red-600 group-hover:opacity-100`);c.title=`Renames the folder on disk; nothing is erased`,c.onclick=()=>void s(e.slug);let l=sr(`flex-none cursor-pointer text-[11.5px] text-neutral-400 opacity-0 transition-opacity hover:text-indigo-600 group-hover:opacity-100`,()=>`${location.origin}${Gu(e)}`);l.title=`Copy the board's link`,i.append(a,l,c),n.append(i);let u=K(`div`,`flex flex-wrap items-center gap-x-3 gap-y-1 text-[11.5px] text-neutral-500`);e.description&&u.append(K(`span`,`min-w-0 truncate`,e.description)),u.append(K(`span`,`flex-none text-neutral-400`,Zn(Date.parse(e.updatedAt))));for(let n of e.sessions){let e=ur(n.slice(0,8),`flex-none cursor-pointer font-mono text-indigo-600 hover:underline`);e.title=`Open session ${n}`,e.onclick=()=>t(n),u.append(e)}if(e.public&&e.token){let t=K(`span`,`flex-none font-mono text-neutral-400`,Gu(e));t.title=`Public URL — anyone holding this link can read the board, no password`,u.append(t)}return n.append(u),n}let l=[{title:`Public`,hint:`Readable at /p/<slug>-<token>/ by anyone holding the link.`,wanted:!0},{title:`Private`,hint:`Reachable from the Console only.`,wanted:!1}];function u(){let e=K(`div`,`mx-auto flex max-w-3xl flex-col`);n.length===0&&e.append(K(`p`,`rounded-xl border border-dashed border-neutral-300 px-4 py-6 text-center text-[12.5px] text-neutral-500`,`No boards yet. Ask an agent to build one — it writes a folder under ~/.pier/boards.`));for(let{title:t,hint:r,wanted:i}of l){let a=n.filter(e=>e.public===i);if(a.length===0)continue;let o=K(`section`,`mb-6`);o.append(K(`h2`,`text-[13px] font-semibold text-neutral-700`,t)),o.append(K(`p`,`mb-1 text-[11.5px] leading-snug text-neutral-500`,r));let s=K(`div`,`rounded-xl border border-neutral-200 bg-white px-3`);s.append(...a.map(c)),o.append(s),e.append(o)}a.replaceChildren(...r?[K(`p`,`mb-3 text-[13px] text-red-600`,r)]:[],e)}async function d(){let e=await E(`/api/boards`,`Could not load boards`);if(!e.ok)return r=e.error,u();n=e.value,u(),r=``}let f=rr(e,()=>void d());return window.addEventListener(`focus`,()=>{f.visible&&d()}),f}var qu=2e4,Ju=e=>e.map((e,t)=>({nums:[t+1],text:e,tone:``}));function Yu(e,t){let n=e.length<=qu?t:null,r=Math.max(2,...e.map(e=>e.nums.reduce((e,t)=>Math.max(e,String(t).length),0))),i=K(`div`,`py-2 font-mono text-[12px] leading-[1.5]`);for(let t of e){let e=K(`div`,`flex pl-2 pr-4 ${t.tone===`add`?`bg-emerald-50`:t.tone===`del`?`bg-red-50`:``}`);for(let n of t.nums){let t=K(`span`,`flex-none select-none pr-1.5 text-right text-neutral-300`,n===``?``:String(n));t.style.width=`calc(${r}ch + 0.375rem)`,e.append(t)}e.append(Xu(t,n)),i.append(e)}return i}function Xu(e,t){let n=`min-w-0 flex-1 whitespace-pre-wrap [overflow-wrap:anywhere]`;if(!e.mark||e.mark[0]>=e.mark[1]){let r=qi(e.text,t);return r.className=n,r}let[r,i]=e.mark,a=qi(e.text.slice(r,i),t);return a.className=`rounded-xs ${e.tone===`add`?`bg-emerald-200/80`:`bg-red-200/70`}`,K(`span`,n,qi(e.text.slice(0,r),t),a,qi(e.text.slice(i),t))}var Zu=e=>{let t=new Date(e),n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}:${n(t.getSeconds())}`},Qu=e=>[e.subject,e.body,[[e.author,e.email?`<${e.email}>`:``].filter(Boolean).join(` `),e.at?Zu(e.at):``].filter(Boolean).join(` · `)].filter(Boolean).join(`
82
82
 
83
- `),Xu=null;function Zu(){Xu&&(Xu.remove(),Xu=null,document.removeEventListener(`pointerdown`,Zu,!0),window.removeEventListener(`scroll`,Zu,!0))}function Qu(e,t){e.onmouseenter=()=>{Zu();let n=t();if(!n)return;Xu=K(`div`,`pointer-events-none fixed z-50 max-w-96 whitespace-pre-wrap rounded-lg bg-neutral-800/95 px-3 py-2 font-sans text-[11.5px] leading-snug text-neutral-100 shadow-lg`),Xu.textContent=n,document.body.append(Xu),document.addEventListener(`pointerdown`,Zu,!0),window.addEventListener(`scroll`,Zu,!0);let r=e.getBoundingClientRect();Xu.style.left=`${Math.max(8,Math.min(r.left,window.innerWidth-Xu.offsetWidth-8))}px`,Xu.style.top=r.bottom+6+Xu.offsetHeight>window.innerHeight?`${r.top-Xu.offsetHeight-6}px`:`${r.bottom+6}px`},e.onmouseleave=Zu}function $u(e,t,n){let r=K(`button`,`flex w-full cursor-pointer items-center gap-1.5 px-2 py-1 text-left hover:bg-neutral-100`,K(`span`,`w-3 flex-none text-indigo-600`,e.value===t?`✓`:``),K(`span`,`flex-none font-mono text-[11.5px] text-neutral-800`,e.label??e.value));return e.subject&&r.append(K(`span`,`min-w-0 truncate text-[11px] text-neutral-400`,e.subject)),e.author&&r.append(K(`span`,`ml-auto flex-none pl-1.5 text-[10.5px] text-neutral-400`,`${e.author} · ${e.at?Zn(e.at):``}`)),Qu(r,()=>Yu(e)),r.onclick=()=>n(e.value),r}function ed(e,t,n,r,i){let{base:a,head:o}=n,s=()=>o&&a===`${o}~1`?o:``,c=s()?`commit`:`compare`,l=t.commits[0],u=e=>[...e?[{value:``,label:`Working tree`,subject:`the files on disk, uncommitted changes included`}]:[],{...l,value:`HEAD`},...t.refs.map(e=>({value:e.name,subject:e.subject})),...t.commits.map(e=>({...e,value:e.hash}))],d=K(`div`,`flex w-[38rem] max-w-full flex-col`);function f(){let e=(e,t)=>{let n=K(`button`,`cursor-pointer rounded-full px-2.5 py-0.5 text-[11.5px] ${c===t?`bg-indigo-50 font-medium text-indigo-700`:`text-neutral-500 hover:bg-neutral-100`}`,e);return n.onclick=()=>{c=t,f()},n},n=(e,t,n,r)=>K(`div`,`flex min-w-0 flex-1 flex-col`,K(`div`,`flex-none px-2 pb-0.5 text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,e),K(`div`,`min-h-0 flex-1 overflow-y-auto`,...t.map(e=>$u(e,n,r)))),l=c===`compare`?K(`div`,`flex h-72 min-h-0 divide-x divide-neutral-200 pb-1`,n(`base`,u(!1),a,e=>{a=e,f(),r(a,o)}),n(`to`,u(!0),o,e=>{o=e,f(),r(a,o)})):K(`div`,`flex h-72 min-h-0 flex-col overflow-y-auto pb-1`,...t.commits.map(e=>$u({value:e.hash,...e},s(),e=>{a=`${e}~1`,o=e,$(),r(a,o)}))),p=K(`div`,`flex-none border-t border-neutral-200`,$u({value:i,label:`↺ ${i} ↔ Working tree`,subject:`back to the default: the main line's tip vs the files on disk`},a===i&&o===``?i:``,()=>{a=i,o=``,f(),r(a,o)}));d.replaceChildren(K(`div`,`flex flex-none items-center gap-1 border-b border-neutral-200 px-2 py-1.5`,e(`Compare two points`,`compare`),e(`One commit`,`commit`)),l,...c===`compare`?[p]:[])}f(),sc(e,d)}var td=/\.(png|jpe?g|gif|webp|avif|bmp|svg)$/i,nd={A:`text-emerald-600`,M:`text-amber-600`,D:`text-red-600`},rd=30,id=`pier.filesPrefs`,ad=50,od=()=>{try{let e=JSON.parse(localStorage.getItem(id)??`{}`);return e&&typeof e==`object`?e:{}}catch{return{}}},sd=e=>{let t=e?od()[e]:void 0;return typeof t?.cwd==`string`&&typeof t.base==`string`&&typeof t.head==`string`?{cwd:t.cwd,base:t.base,head:t.head}:null},cd=(e,t)=>{let n=od();delete n[e],n[e]=t;let r=Object.keys(n);for(let e of r.slice(0,Math.max(0,r.length-ad)))delete n[e];try{localStorage.setItem(id,JSON.stringify(n))}catch(e){console.warn(`Files: could not remember this folder`,e)}},ld=(e,t=`indigo`)=>{let n=K(`button`,`min-w-0 cursor-pointer truncate rounded-md px-2 py-0.5 text-left font-mono text-[11.5px] ${t===`indigo`?`bg-indigo-50 font-medium text-indigo-700 hover:bg-indigo-100`:`bg-neutral-100 text-neutral-600 hover:bg-neutral-200`}`,e);return n.type=`button`,n};function ud(e,t,n,r){let i=``,a=``,o={branch:null,refs:[],commits:[],worktrees:[]},s=`HEAD`,c=``,l=new Map,u=!0,d=!1,f=[],p=new Set,m=null,h=null,g=K(`header`,`flex h-10 flex-none items-center gap-2 border-b border-neutral-200 bg-white px-3`),_=K(`div`,`flex-none border-b border-neutral-200`),v=K(`div`,`min-h-0 flex-1 overflow-y-auto py-1`),y=K(`aside`,`flex w-64 flex-none flex-col border-r border-neutral-200 text-[12.5px] max-md:h-2/5 max-md:w-full max-md:border-b max-md:border-r-0`,_,v),b=K(`div`,`h-full min-w-0 overflow-auto`),x=K(`div`,`pointer-events-none absolute inset-y-0 right-0 z-20 hidden w-2`),S=K(`section`,`relative min-w-0 flex-1`,b,x);e.append(g,K(`div`,`flex min-h-0 flex-1 max-md:flex-col`,y,S));let C=(e,t)=>`/api/explorer/${e}?${new URLSearchParams({root:i,...t})}`,w=(e,t=`text-neutral-400`)=>K(`p`,`px-4 py-3 text-[12.5px] ${t}`,e),T=e=>{let t=0;for(let n of l.keys())n.startsWith(`${e}/`)&&t++;return t};function E(e,t){let n=new Set(t.map(e=>e.name)),r=e?`${e}/`:``;for(let[e,i]of l){if(i.status!==`D`||!e.startsWith(r))continue;let a=e.slice(r.length).split(`/`)[0];n.has(a)||(n.add(a),t.push({name:a,dir:e.slice(r.length).includes(`/`)}))}let i=t;return u&&o.branch&&(i=t.filter(e=>e.dir?T(`${r}${e.name}`)>0:l.has(`${r}${e.name}`))),i.sort((e,t)=>Number(t.dir)-Number(e.dir)||e.name.localeCompare(t.name)),i.map(e=>e.dir?k(`${r}${e.name}`,e.name):ee(`${r}${e.name}`,e.name))}async function O(e,t){try{let{entries:n}=await D(C(`ls`,{path:t}),`could not list this folder`);e.replaceChildren(...E(t,n)),e.childElementCount||e.append(w(u?`No changes.`:`Empty.`))}catch(n){let r=E(t,[]);r.length?e.replaceChildren(...r):e.replaceChildren(w(String(n),`text-red-600`))}}function k(e,t){let n=T(e),r=[K(`span`,`truncate`,t)];n&&r.push(K(`span`,`ml-auto flex-none rounded bg-amber-100/80 px-1 font-mono text-[10px] text-amber-700`,String(n)));let{el:i,summary:a}=sr(``,r);a.className+=` px-2 py-0.5 hover:bg-neutral-100`;let s=K(`div`,`pl-3`);i.append(s);let c=!1,l=()=>{c||(c=!0,s.append(w(`…`)),O(s,e))};return i.ontoggle=()=>{p[i.open?`add`:`delete`](e),i.open&&l()},(u&&o.branch&&!d||p.has(e))&&(i.open=!0,l()),i}function A(e){h?.classList.remove(`bg-indigo-50`,`text-indigo-700`),h=e,e.classList.add(`bg-indigo-50`,`text-indigo-700`)}function ee(e,t){let n=l.get(e)?.status,r=K(`button`,`flex w-full cursor-pointer items-center gap-1.5 px-2 py-0.5 pl-6 text-left hover:bg-neutral-100`,K(`span`,`truncate`,t));return n&&r.append(K(`span`,`ml-auto flex-none font-mono text-[10.5px] font-semibold ${nd[n]??`text-neutral-500`}`,n)),r.title=e,e===m&&A(r),r.onclick=()=>{A(r),m=e,F(e)},r}let j=()=>void O(v,``),M=(e,t)=>[...e?[K(`span`,`flex-none font-mono text-[10.5px] font-semibold text-emerald-600`,`+${e}`)]:[],...t?[K(`span`,`flex-none font-mono text-[10.5px] font-semibold text-red-600`,`−${t}`)]:[]];function N(e,t,n){let r=l.get(e),i=K(`div`,`sticky top-0 z-10 flex items-center gap-2 border-b border-neutral-200 bg-white px-4 py-1.5 font-mono text-[11.5px] text-neutral-500`,K(`span`,`truncate`,e));r&&(i.append(K(`span`,`flex-none font-semibold ${nd[r.status]??``}`,r.status)),i.append(...M(r.add,r.del)));let a=K(`div`,`ml-auto flex flex-none items-center gap-2`);if(n&&a.append(n),t){let t=document.createElement(`a`);t.className=`flex-none text-neutral-400 hover:text-indigo-700 hover:underline`,t.href=C(`file`,{path:e}),t.download=$n(e),t.textContent=`Download`,a.append(t)}return i.append(a),i}function te(e){let t=0;for(;t<e.length;){if(e[t].tone!==`del`){t++;continue}let n=t;for(;t<e.length&&e[t].tone===`del`;)t++;let r=t;for(;t<e.length&&e[t].tone===`add`;)t++;let i=Math.min(r-n,t-r);for(let t=0;t<i;t++){let i=e[n+t],a=e[r+t],o=Math.min(i.text.length,a.text.length),s=0;for(;s<o&&i.text[s]===a.text[s];)s++;let c=0;for(;c<o-s&&i.text[i.text.length-1-c]===a.text[a.text.length-1-c];)c++;s+c!==0&&(i.mark=[s,i.text.length-c],a.mark=[s,a.text.length-c])}}}let P=le();function ne(){x.classList.add(`hidden`),x.replaceChildren(),P.set([],[])}let re=0,ie=e=>e===re;function F(e){let t=++re;return l.has(e)?ue(e,t):I(e,t)}async function I(e,t){if(!ie(t))return;ne();let n=C(`file`,{path:e}),r=K(`div`,`min-w-0`);if(b.classList.remove(`flex`,`flex-col`),b.replaceChildren(N(e,!0),r),td.test(e)){let e=K(`img`,`max-w-full p-4`);e.src=n,e.onerror=()=>r.replaceChildren(w(`Could not load image.`,`text-red-600`)),r.append(e);return}if(e.toLowerCase().endsWith(`.pdf`)){let t=document.createElement(`iframe`);t.className=`h-full w-full`,t.src=n,b.replaceChildren(N(e,!0),t),b.classList.add(`flex`,`flex-col`);return}r.append(w(`…`));let i=await fetch(n);if(!ie(t))return;if(!i.ok){let{error:e}=await i.json().catch(()=>({}));r.replaceChildren(w(e??`HTTP ${i.status}`,`text-red-600`));return}if(!(i.headers.get(`content-type`)??``).startsWith(`text/plain`)){r.replaceChildren(w(`Binary file — use Download.`));return}let a=(await i.text()).split(`
84
- `);ie(t)&&(a.at(-1)===``&&a.pop(),r.replaceChildren(Ku(Gu(a),Gi(e))))}function ae(e){let t=[],n=0,r=0,i=!1,a=e.split(`
85
- `);a.at(-1)===``&&a.pop();for(let e of a){let a=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/.exec(e);if(a){i&&t.push({nums:[``,``],text:`⋯`,tone:``}),[n,r]=[Number(a[1]),Number(a[2])],i=!0;continue}!i||e.startsWith(`\\`)||(e.startsWith(`+`)?t.push({nums:[``,r++],text:e.slice(1),tone:`add`}):e.startsWith(`-`)?t.push({nums:[n++,``],text:e.slice(1),tone:`del`}):t.push({nums:[n++,r++],text:e.slice(1),tone:``}))}return t}function L(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n].tone;if(!r)continue;let i=t.at(-1);i&&i.end===n-1?(i.end=n,(r===`add`&&i.tone===`del`||r===`del`&&i.tone===`add`)&&(i.tone=`mixed`)):t.push({start:n,end:n,tone:r})}return t}let oe={add:`bg-emerald-400`,del:`bg-red-400`,mixed:`bg-amber-400`};function se(e,t,n){x.replaceChildren(...e.map(e=>{let r=K(`button`,`pointer-events-auto absolute w-full cursor-pointer ${oe[e.tone]}`);return r.style.top=`${e.start/t*100}%`,r.style.height=`${Math.max(.4,(e.end-e.start+1)/t*100)}%`,r.title=`line ${ce(n,e.start)}`,r.onclick=()=>n[e.start].scrollIntoView({block:`center`}),r})),x.classList.remove(`hidden`)}let ce=(e,t)=>e[t]?.querySelector(`span`)?.textContent?.trim()||String(t+1);function le(){let t=[],n=[],r=-1,i=K(`span`,`flex-none text-[10.5px] text-neutral-400`),a=e=>{t.length&&(r=(r+e+t.length)%t.length,n[t[r].start].scrollIntoView({block:`center`}),i.textContent=`${r+1}/${t.length}`)},o=()=>t.length>0&&!e.classList.contains(`hidden`),s=(e,t,n,r)=>{let i=K(`button`,`icon-btn flex-none`,e);return i.onclick=()=>a(t),Zo(i,r,n,()=>a(t),o),i};return{el:K(`div`,`flex flex-none items-center gap-1`,i,s(`↑`,-1,`Previous change`,[`p`,`k`]),s(`↓`,1,`Next change`,[`n`,`j`])),set(e,a){t=e,n=a,r=-1,i.textContent=`${e.length} change${e.length===1?``:`s`}`}}}async function ue(e,t){ne(),b.classList.remove(`flex`,`flex-col`);let n=l.get(e)?.status!==`D`;b.replaceChildren(N(e,n),w(`…`));try{let{diff:r}=await D(C(`diff`,{base:s,head:c,file:e,context:`99999`}),`could not read this diff`);if(!ie(t))return;if(!r||/^Binary files /m.test(r))return I(e,t);let i=ae(r);te(i);let a=Ku(i,Gi(e)),o=[...a.children],l=L(i);P.set(l,o),b.replaceChildren(N(e,n,P.el),a),se(l,i.length,o)}catch(n){ie(t)&&b.replaceChildren(N(e,!1),w(String(n),`text-red-600`))}}let de=()=>c&&s===`${c}~1`?c:``,fe=()=>o.commits.find(e=>e.hash===de())?.subject??``,pe=()=>de()?`${de()} — ${fe()||`commit`}`:`${s} ↔ ${c||`working tree`}`,me=(e,t,n,r)=>{let i=K(`button`,`flex h-6 w-6 flex-none cursor-pointer items-center justify-center rounded-md ${n?`bg-indigo-50 text-indigo-700`:`text-neutral-400 hover:bg-neutral-100 hover:text-neutral-700`}`);return i.innerHTML=e,i.title=t,i.onclick=r,i};function he(){let e=me(`<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" class="h-3.5 w-3.5"><path d="M2.5 3h11l-4.25 5v4.5l-2.5 1.25V8L2.5 3z" stroke-linejoin="round"/></svg>`,`Show only files that differ`,u,()=>{u=!u,he(),j()}),t=me(`<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" class="h-3.5 w-3.5"><path d="m4.5 2.5 3.5 3 3.5-3M4.5 13.5l3.5-3 3.5 3" stroke-linecap="round" stroke-linejoin="round"/></svg>`,d?`Restore folders`:`Collapse all folders`,d,()=>{if(d=!d,d)f=[...p],p.clear();else for(let e of f)p.add(e);he(),j()});if(!o.branch){_.replaceChildren(K(`div`,`flex items-center justify-end gap-1 p-1.5`,t));return}let n=ld(pe());if(de()){let e=o.commits.find(e=>e.hash===de());Qu(n,()=>e?Yu(e):``)}else n.title=`Choose what to diff`;n.onclick=async()=>{await xe(),ed(n,o,{base:s,head:c},(e,t)=>{s=e,c=t,ye()},Se())};let[r,i]=[0,0];for(let e of l.values())r+=e.add,i+=e.del;_.replaceChildren(K(`div`,`flex flex-col gap-1 p-2`,n,K(`div`,`flex items-center gap-1.5 pl-1`,K(`span`,`text-[11px] text-neutral-400`,`${l.size} changed file${l.size===1?``:`s`}`),...M(r,i),K(`span`,`ml-auto`),e,t)))}let ge=()=>{a&&i&&cd(a,{cwd:i,base:s,head:c})},_e=e=>{let t=e.replace(/~\d+$/,``);return!t||t===`HEAD`||o.refs.some(e=>e.name===t)||o.commits.some(e=>e.hash===t)};async function ve(){if(l=new Map,!o.branch)return;let{files:e}=await D(C(`diff`,{base:s,head:c}),`could not read what changed`);for(let t of e)l.set(t.path,{status:t.status,add:t.add,del:t.del});if(l.size<=rd)for(let e of l.keys()){let t=e.split(`/`);for(let e=1;e<t.length;e++)p.add(t.slice(0,e).join(`/`))}}async function ye(){ge();try{await ve()}catch(e){he(),v.replaceChildren(w(String(e),`text-red-600`));return}he(),j(),m&&F(m)}function be(){let e=ld(i||`Choose a folder…`,`neutral`);e.className+=` max-w-72`,e.title=`Switch folder`,e.onclick=()=>Cc(e,o.worktrees.map(e=>({path:e.path,...e.branch?{hint:e.branch}:{}})),i||void 0,n);let t=K(`button`,`icon-btn ml-auto`,`✕`);t.type=`button`,t.title=`Close Files`,t.setAttribute(`aria-label`,`Close Files`),t.onclick=r,g.replaceChildren(e,K(`span`,`truncate font-mono text-[11.5px] text-neutral-400`,o.branch?`⎇ ${o.branch}`:`no git`),t)}async function xe(){if(i)try{o=await D(C(`git`,{}),`could not read this repository`),be()}catch(e){b.replaceChildren(w(String(e),`text-red-600`))}}let Se=()=>o.refs.some(e=>e.name===`main`)?`main`:o.refs.some(e=>e.name===`master`)?`master`:`HEAD`;async function Ce(){if(be(),m=null,h=null,p.clear(),ne(),b.classList.remove(`flex`,`flex-col`),b.replaceChildren(w(`Select a file.`)),!i){_.replaceChildren(),v.replaceChildren(),b.replaceChildren(w(`No folder yet — pick one from the chip above.`));return}try{o=await D(C(`git`,{}),`could not read this repository`)}catch(e){o={branch:null,refs:[],commits:[],worktrees:[]},b.replaceChildren(w(String(e),`text-red-600`))}let e=sd(a),t=e&&e.cwd===i&&_e(e.base)&&_e(e.head)?e:null;s=t?.base??Se(),c=t?.head??``,be(),await ye()}return nr(e,e=>{let n=t(),r=n?.id??``,o=e?.startsWith(`/`)?e:(r===a?i:``)||sd(r)?.cwd||n?.cwd||``;if(o===i&&r===a&&v.childElementCount){be(),xe().then(ye);return}a=r,i=o,Ce()},()=>{ne(),b.classList.remove(`flex`,`flex-col`),b.replaceChildren(w(`Select a file.`))})}var dd={display_information:{name:`Pier`,description:`Coding agent sessions in Slack threads`,background_color:`#262626`},features:{bot_user:{display_name:`Pier`,always_online:!1},app_home:{messages_tab_enabled:!0,messages_tab_read_only_enabled:!1}},oauth_config:{scopes:{bot:[`chat:write`,`reactions:write`,`channels:history`,`channels:read`,`groups:history`,`groups:read`,`im:history`,`im:write`,`mpim:history`,`mpim:read`,`mpim:write`,`users:read`,`files:read`,`files:write`]}},settings:{event_subscriptions:{bot_events:[`message.channels`,`message.groups`,`message.im`,`message.mpim`]},interactivity:{is_enabled:!0},socket_mode_enabled:!0,token_rotation_enabled:!1}},fd=()=>`https://api.slack.com/apps?new_app=1&manifest_json=${encodeURIComponent(JSON.stringify(dd))}`,pd=()=>Sr(`Getting a bot token`,[`Open [@BotFather](https://t.me/BotFather) in Telegram.`,"Send `/newbot`, pick a display name, then a username ending in `bot`.","Copy the token it prints (`123456789:AA…`) and paste it here.","Send `/setprivacy` → `Disable` if the bot should see plain group messages. Left enabled it only ever receives mentions, replies and commands — the usual reason a bot looks dead in a group.","Send `/setjoingroups` → `Enable`, then add the bot to your group or forum."]),md=(e=`left`)=>Sr(`Enabling topics on a group`,["In Telegram open the group → `Edit` → turn on `Topics`. Owner only; group size no longer matters.","The group becomes a forum supergroup and the existing chat becomes its `General` topic.","Make the bot an admin with `Manage Topics`. That is the one right topic creation needs — without it Pier logs the failure and answers in General instead.","Send one message in the group so Pier discovers it, then enable it under `Chats` below.","After that, a message in General opens its own topic with its own session. A reply, or anything starting with `/`, stays where it was sent."],e);function hd(){let e=q(`Create Slack app ↗`,!0);e.classList.add(`mt-1`,`w-fit`),e.onclick=()=>window.open(fd(),`_blank`,`noreferrer`);let t=or(`btn w-fit text-[12.5px]`,()=>JSON.stringify(dd,null,2));return Sr(`Creating a Slack app`,[Cr(`Opens Slack with every scope, event and Socket Mode already filled in. Pick your workspace → Create.`,e),"`Install to Workspace` → allow. Then `OAuth & Permissions` → copy the bot token (`xoxb-…`) into the field above.","`Basic Information` → `App-Level Tokens` → `Generate` with scope `connections:write`. Paste that `xapp-…` token below. The manifest cannot mint this one for you.","In Slack, invite the bot where you want it: `/invite @Pier`. It answers in threads only, so it never adds noise to the channel.",Cr(`Prefer to paste it yourself? Create the app from a manifest and use this:`,t)])}var gd=()=>Sr(`What agent access allows`,["Gives agent sessions a `slack` tool: read a channel's history for a time range, read one thread, and post, edit or delete a message.",`Editing and deleting reach only what Pier's own bot posted — Slack refuses either on anyone else's message.`,`Pier performs every call itself — the bot token is never given to the agent, and Slack's own membership rules still apply, so the bot reaches only channels it was invited to.`,`Every read fetches live from Slack — Pier keeps no message archive.`,`This includes sessions started by tasks and subagents. Switch it off if an agent should never post to your workspace on its own.`,`The tool is only given to sessions opened while Slack is connected and this is on, so an unused tool costs no context. A session opened earlier keeps it, and a call made after you switch it off is refused with the reason.`]),_d=(e=`left`)=>Sr(`How Slack threads work here`,[`Pier never posts in a channel's main flow. A message in the channel is answered in *its own thread*; a message in a thread is answered in that thread.`,`Each thread is its own Pi session, so one channel hosts many parallel sessions.`,`The same applies in a DM: every new message you send there starts its own thread and its own session. Reply *inside* a thread to continue that conversation.`,"Inside a thread Pier already owns, no `@mention` is needed — continuing that thread is addressing it.","Commands are bare words after a mention: `@bot settings`, `@bot stop`, `@bot bind <code>`. Slack's client swallows an unregistered `/command` before it ever reaches an app."],e),vd=()=>Sr(`Creating a Feishu app`,["On [open.feishu.cn](https://open.feishu.cn/app) create a 企业自建应用 (custom app). `Credentials & Basic Info` shows the App ID (`cli_…`) and App Secret — paste both here.","`Add Features` → enable **Bot** (机器人).","`Permissions` (权限管理), add: `im:message` (read messages), `im:message:send_as_bot` (send), `im:resource` (attachments, both directions), `im:message.reactions:create` + `:read` + `:delete` (the 👀 receipt), `im:chat:readonly` (chat names for this page), `contact:user.base:readonly` (speaker names).","`Events & Callbacks` → set the mode to **长连接 (long connection)** — no public URL needed. Under Events subscribe `im.message.receive_v1` (接收消息); Callbacks gain `card.action.trigger` automatically once cards are sent, add it if listed.",`**Publish a version** (版本管理与发布 → 创建版本 → 申请发布). Nothing above takes effect until this is approved — the usual reason a configured bot stays silent.`,`Add the bot to a group (群设置 → 群机器人), or DM it directly.`]),yd=(e=`left`)=>Sr(`How Lark topics work here`,[`Pier never posts in a chat's main flow. A message in the chat is answered in *its own topic* (话题); a message inside a topic is answered there.`,`Each topic is its own Pi session, so one group hosts many parallel sessions.`,`The same applies in a DM: every new message starts its own topic and its own session. Reply *inside* a topic to continue that conversation.`,`Inside a topic Pier already owns, no @mention is needed — continuing that topic is addressing it.`,"Commands are slash words: `/stop`, `/settings`, `/bind <code>`. A bare @mention with nothing else also opens the settings panel."],e),bd=[[`telegram`,`Telegram`],[`slack`,`Slack`],[`lark`,`Lark`]],xd=(e,t)=>K(`span`,`flex items-center gap-1.5 text-[13px] text-neutral-400`,K(`span`,``,e),t),Sd={dm:`bg-sky-50 text-sky-700 ring-sky-200`,group:`bg-neutral-100 text-neutral-600 ring-neutral-200`,forum:`bg-violet-50 text-violet-700 ring-violet-200`},Cd=`pier.channelsPlatform`;function wd(e){let t=localStorage.getItem(Cd),n=bd.some(([e])=>e===t)?t:`telegram`,r=null,i=[],a=K(`div`,`ml-auto flex items-center gap-1.5 text-[11.5px]`),o=K(`div`,`sticky top-0 z-30 flex items-center gap-1 border-b border-neutral-200 bg-white px-4 py-2`,a),s=K(`div`,`px-4 py-5`);e.append(K(`div`,`min-h-0 flex-1 overflow-y-auto bg-neutral-50/60`,o,s));function c(){o.replaceChildren(...bd.map(([e,t])=>dr(t,e===n,()=>{l&&g(),n=e,localStorage.setItem(Cd,e),_()})),a)}let l,u=!1,d=null;function f(e){if(a.replaceChildren(),e!==`clean`){if(a.className=`ml-auto flex items-center gap-1.5 text-[11.5px] ${yr[e]}`,e===`saving`)a.append(K(`span`,`spinner`),K(`span`,``,`Saving…`));else if(e===`saved`)a.append(K(`span`,``,`✓`),K(`span`,``,`Saved`)),setTimeout(()=>{a.textContent?.includes(`Saved`)&&f(`clean`)},2e3);else{let e=lr(`Retry`,`cursor-pointer underline`);e.onclick=g,a.append(K(`span`,``,`⚠`),K(`span`,``,`Save failed`),e)}}}function p(){f(`saving`),clearTimeout(l),l=setTimeout(g,500)}let m=e=>t=>{e(t),p()};async function h(e){u=!0,f(`saving`);try{f((await w(`/api/channels/${e.platform}`,e.config,`PUT`)).ok?`saved`:`failed`)}catch{f(`failed`)}finally{u=!1;let e=d;d=null,e&&h(e)}}function g(){if(clearTimeout(l),l=void 0,!r)return;let e={platform:n,config:r};u?d=e:h(e)}async function _(){if(!i.length){let e=await E(`/api/models`,`Could not load the model catalog`);e.ok&&(i=e.value)}let e=await E(`/api/channels/${n}`,`Failed to load`);if(!e.ok){r=null,c(),s.replaceChildren(xr(e.error));return}r=e.value,f(`clean`),C()}function v(e){let t=n===`slack`,r=n===`lark`,i=mr(e.token,t?`xoxb-…`:r?`cli_…`:`123456789:AA…`,m(t=>e.token=t),!0),a=mr(e.appToken,r?``:`xapp-…`,m(t=>e.appToken=t),!0),o=Dc(e.cwd,`(pier process cwd)`,m(t=>e.cwd=t));return fr(`Connection`,t?`Pier connects over Socket Mode; no public URL or webhook needed.`:r?`Pier connects over Feishu's WebSocket long connection; no public URL or webhook needed.`:`Pier polls Telegram for updates; no public URL or webhook needed.`,vr(`Enabled`,`Start the adapter when Pier boots.`,e.enabled,m(t=>{e.enabled=t,c()})),J(r?`App ID`:`Bot token`,i,{hint:`Stored locally, shown masked once saved.`,help:n===`telegram`?pd():t?hd():vd()}),...t?[J(`App-level token`,a,{hint:`Opens the Socket Mode connection. Needs connections:write.`}),vr(`Agent access`,`Let agent sessions read channel history and post through the slack tool. Off makes the tool refuse; inbound messages are unaffected.`,e.agentTool,m(t=>e.agentTool=t),gd())]:[],...r?[J(`App Secret`,a,{hint:`From Credentials & Basic Info, beside the App ID.`})]:[],J(`Default working directory`,o.el,{hint:`Where sessions this channel opens start.`}))}function y(e){return fr(`Defaults for new chats`,`Copied into a group the first time the bot sees it; changing them here never touches a group that already exists. DMs are always bound-users-only.`,vr(`Require mention in groups`,`Ignore group messages that do not @mention or reply to the bot.`,e.requireMention,m(t=>e.requireMention=t)),vr(`Require bound user`,`Only users bound with a code below can drive the agent.`,e.requireBind,m(t=>e.requireBind=t)),...n===`slack`?[xd(`Thread mode: always on`,_d())]:n===`lark`?[xd(`Thread mode: always on`,yd())]:[vr(`Topic mode`,`In a forum group, each new request opens its own topic and its own session.`,e.topicMode,m(t=>e.topicMode=t),md())],vc(`Model & reasoning`,e,i,m(t=>{e.model=t.model,e.thinking=t.thinking,C()})))}function b(e){let t=K(`span`,`font-mono text-[15px] font-semibold tracking-widest`),r=K(`div`,`hidden items-center gap-2 rounded-lg bg-indigo-50 px-3 py-2 text-[12.5px] text-indigo-800`,t,K(`span`,`text-[11.5px] text-indigo-500`,`DM the bot /bind <code> · expires in 10 min`)),i=q(`Generate bind code`);i.onclick=async()=>{let e=await fetch(`/api/channels/${n}/bind-code`,{method:`POST`});if(!e.ok)return;let{code:i}=await e.json();t.textContent=i,r.classList.replace(`hidden`,`flex`)};let a=K(`div`,`flex flex-col`);e.users.length||a.append(xr(`No bound users yet.`));for(let t of e.users){let e=lr(`Remove`,`cursor-pointer text-[11.5px] text-neutral-400 opacity-0 transition-opacity hover:text-red-600 group-hover:opacity-100`);e.onclick=async()=>{await fetch(`/api/channels/${n}/users/${encodeURIComponent(t.id)}`,{method:`DELETE`}),await _()},a.append(K(`div`,`group flex items-center gap-2.5 border-b border-neutral-100 py-2 last:border-0`,K(`span`,`flex h-6 w-6 flex-none items-center justify-center rounded-full bg-neutral-100 text-[11px] font-semibold text-neutral-500`,(t.name[0]??`?`).toUpperCase()),K(`span`,`min-w-0 flex-1 truncate text-[13px] text-neutral-700`,t.name),K(`span`,`flex-none font-mono text-[11.5px] text-neutral-400`,t.id),e))}return fr(`Bound users`,`A code is single-use and expires; redeeming it in a DM binds that account.`,a,K(`div`,`flex flex-col gap-2`,i,r))}function x(e,t){let r=K(`div`,`rounded-xl border px-3.5 py-3 transition-colors ${t.enabled?`border-neutral-200 bg-white`:`border-neutral-200 bg-neutral-50/60`}`),a=K(`div`,`flex items-center gap-2`,K(`span`,`min-w-0 flex-1 truncate text-[13px] font-medium ${t.enabled?`text-neutral-800`:`text-neutral-400`}`,t.name||t.id),br(t.kind,Sd[t.kind]),K(`span`,`flex-none font-mono text-[11px] text-neutral-400`,t.id)),o=vr(``,``,t.enabled,m(e=>{t.enabled=e,C()}));o.classList.add(`flex-none`,`items-center`),a.append(o);let s=K(`div`,`mt-3 flex flex-wrap items-center gap-x-6 gap-y-2`);t.kind===`dm`?s.append(K(`span`,`text-[13px] text-neutral-400`,n===`telegram`?`Direct message · bound users only, mention and topics not applicable`:`Direct message · bound users only, mention not applicable`)):s.append(vr(`Require mention`,``,t.requireMention,m(e=>t.requireMention=e)),vr(`Require bind`,``,t.requireBind,m(e=>t.requireBind=e)),n===`slack`?xd(`Thread mode: always on`,_d(`right`)):n===`lark`?xd(`Thread mode: always on`,yd(`right`)):t.kind===`forum`?vr(`Topic mode`,``,t.topicMode,m(e=>t.topicMode=e),md(`right`)):xd(`Topic mode: forum groups only`,md(`right`)));let c=K(`div`,`mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2`,J(`Working directory`,Dc(t.cwd,``,m(e=>t.cwd=e)).el),vc(`Model & reasoning`,t,i,m(e=>{t.model=e.model,t.thinking=e.thinking,C()})));return r.append(a,s,c),r}function S(e){let t=K(`div`,`flex flex-col gap-2.5`);return e.chats.length?t.append(...e.chats.map(t=>x(e,t))):t.append(xr(`None yet. Chats appear here after the bot sees a message in them.`)),fr(n===`slack`?`Channels`:`Chats`,`Discovered from inbound traffic — no platform reliably lists every chat a bot is in.`,t)}function C(){if(!r)return;c();let e=K(`div`,`mx-auto flex max-w-3xl flex-col gap-4`);e.append(v(r),y(r),b(r),S(r)),s.replaceChildren(e)}return nr(e,()=>void _(),()=>{l&&g()})}async function Td(e,t){let n;try{n=await w(`/api/settings`,e,`PUT`)}catch(e){return{outcome:{state:`failed`,text:`Could not save: ${String(e)}`}}}if(!n.ok)return{outcome:{state:`failed`,text:await T(n,`could not save`)}};let r;try{r=await n.json()}catch(e){return{outcome:{state:`failed`,text:`Saved, but the answer could not be read: ${String(e)}`}}}return r.toolsSync?.state===`refused`?{outcome:{state:`failed`,text:`Saved, but nothing will install it: ${r.toolsSync.reason}`},answer:r}:r.toolsSync?.state===`waiting`?{outcome:{state:`saved`,text:`Saved — a sync is already running; this change goes in the run right after it.`},answer:r}:{outcome:{state:`saved`,text:t},answer:r}}function Ed(e,t){return e.enabled?{body:{tool:{name:e.name,on:!1}},saved:`Switched ${e.name} off — the next run uninstalls it. Remove it again once its binary is gone.`}:{body:{customTools:t.filter(t=>t.name!==e.name)},saved:`Removed ${e.name}.`}}function Dd(e,t){let n=`global`,r=null,i=0,a=0,o=``,s=null,c=[],l=``,u=null,d=[],f=()=>c.filter(e=>e.kind===`extension`),p=e=>e.source===`binary`&&e.custom===!0,m=()=>c.filter(e=>e.kind===`tool`),h=document.createElement(`select`);h.className=`select w-full rounded-md border border-neutral-300 px-2 py-1 text-[12.5px] focus:border-indigo-400 focus:outline-none`,h.onchange=()=>{n=h.value,r=null,te.clear(),k()};let g=K(`div`,`flex flex-none flex-col gap-1 border-b border-neutral-200 px-3 pb-2.5 pt-2`);g.append(K(`span`,`text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,`Scope`),h);let _=K(`div`,`min-h-0 flex-1 overflow-y-auto py-1`),v=K(`nav`,`flex w-64 flex-none flex-col border-r border-neutral-200 text-[13px]`);v.append(g,_);let y=K(`div`,`flex min-w-0 flex-1 flex-col`),b=K(`div`,`flex min-h-0 flex-1`);b.append(v,y),e.append(b);let x=(e=``)=>`?scope=${encodeURIComponent(n)}${e}`;async function S(){if(n!==`global`){c=[],l=``;return}let e=await E(`/api/settings`,`could not be loaded`,{cache:`no-store`});if(!e.ok){c=[],l=e.error;return}C(e.value),l=``}function C(e){c=e.catalog,d=e.customTools,u=e.toolsTaskId}async function D(e,t){let{outcome:n,answer:r}=await Td(e,t);return r&&(C(r),ne(s)),n}function O(e,t){let n={name:e,on:t};return c.find(t=>t.name===e)?.source===`binary`?{tool:n}:{extension:n}}async function k(){let e=++i;a++;let[t]=await Promise.all([E(`/api/config${x()}`,`failed to load config`,{cache:`no-store`}),S()]);if(e!==i)return;if(!t.ok){ne(null),ie(t.error);return}let c=t.value;n===`global`&&c.dir&&(o=c.dir,de()),s=c,ne(c),r||re()}function A(e){return K(`div`,`px-3 pb-0.5 pt-2.5 text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,e)}let ee=()=>{let e=K(`span`,`flex-none rounded bg-neutral-100 px-1 text-[10px] font-semibold uppercase tracking-wide text-neutral-500`,`link`);return e.title=`Reached through a symlink`,e},j=()=>K(`span`,`flex-none rounded bg-emerald-50 px-1 text-[10px] font-semibold uppercase tracking-wide text-emerald-700`,`on`);function M(e,t,n,r,i=0,a){let o=K(`button`,`flex w-full cursor-pointer items-center gap-1.5 py-1 pr-3 text-left hover:bg-neutral-100 ${t?`bg-indigo-50 hover:bg-indigo-50`:``} ${n?`text-neutral-400`:``}`);return o.append(K(`span`,`truncate`,e)),a&&o.append(a),o.style.paddingLeft=`${20+i*14}px`,o.title=e,o.onclick=r,o}function N(e){let t={files:[],dirs:new Map,link:!0};for(let n of e){let e=n.name.split(`/`),r=t;for(let t of e.slice(0,-1)){let e=r.dirs.get(t);e||r.dirs.set(t,e={files:[],dirs:new Map,link:!0}),e.link&&=n.link,r=e}r.files.push({name:e[e.length-1],link:n.link})}return t}let te=new Set;function P(e,t,n,r,i,a){let o=[];for(let[s,c]of t.dirs){let t=n?`${n}/${s}`:s,l=`${e}:${t}`,u=document.createElement(`details`);u.open=te.has(l),u.ontoggle=()=>u.open?te.add(l):te.delete(l);let d=K(`summary`,`flex cursor-pointer select-none items-center gap-1 truncate py-1 pr-3 hover:bg-neutral-100`);d.style.paddingLeft=`${20+r*14}px`,d.title=t,d.append(K(`span`,`chev`,`▶`),K(`span`,`truncate text-neutral-600`,s)),c.link&&d.append(ee()),u.append(d,...P(e,c,t,r+1,i,a)),o.push(u)}for(let s of t.files){let t={type:`resource`,kind:e,name:n?`${n}/${s.name}`:s.name};o.push(M(s.name,i(t),!1,()=>a(t),r,s.link?ee():void 0))}return o}function ne(e){if(!e){_.replaceChildren();return}let t=e=>JSON.stringify(e)===JSON.stringify(r),i=t=>{r=t,ne(e),t.type===`file`?I(t.name):t.type===`bundled`?se(t.name):t.type===`tools`?ce():ue(t.kind,t.name)},a=[];a.push(A(`Files`));for(let n of e.files){let e={type:`file`,name:n.name};a.push(M(n.name,t(e),!n.exists,()=>i(e)))}if(n===`global`){a.push(A(`bundled with Pier`)),l?a.push(K(`p`,`py-1 pl-5 pr-3 text-[12.5px] text-red-600`,l)):f().length||a.push(K(`p`,`py-1 pl-5 pr-3 text-[12.5px] text-neutral-400`,`none`));for(let e of f()){let n={type:`bundled`,name:e.name};a.push(M(e.name,t(n),!1,()=>i(n),0,e.enabled?j():void 0))}if(!l){let e={type:`tools`},n=m().filter(e=>e.enabled).length;a.push(M(`command-line tools`,t(e),!1,()=>i(e),0,n?j():void 0))}}for(let n of[`extensions`,`skills`]){a.push(A(`${n} (read-only)`));let r=e.resources[n];r.length||a.push(K(`p`,`py-1 pl-5 pr-3 text-[12.5px] text-neutral-400`,`none`)),a.push(...P(n,N(r),``,0,t,i))}_.replaceChildren(...a)}function re(){y.replaceChildren(K(`p`,`px-4 py-3 text-[13px] text-neutral-400`,`Select a file to edit, or browse extensions and skills.`))}function ie(e){y.replaceChildren(K(`p`,`px-4 py-3 text-[13px] text-red-600`,e))}let F=(e,...t)=>K(`div`,`flex flex-none items-center gap-3 border-b border-neutral-200 px-4 py-2`,K(`span`,`font-mono text-[12.5px] text-neutral-500`,e),...t);async function I(e){let t=++a,n=await E(`/api/config/files/${encodeURIComponent(e)}${x()}`,`failed to load ${e}`,{cache:`no-store`});if(!n.ok){t===a&&ie(n.error);return}if(t!==a)return;let{content:r}=n.value,i=r,o=K(`span`,`text-[11.5px] text-neutral-400`,``),s=K(`button`,`btn btn-primary ml-auto text-[12.5px]`,`Save`),c=document.createElement(`textarea`);c.className=`block min-h-0 flex-1 resize-none bg-white p-4 font-mono text-[13px] leading-relaxed focus:outline-none`,c.spellcheck=!1,c.value=r;let l=async()=>{if(s.disabled)return;let t=c.value;s.disabled=!0,Y(o,`saving`,`saving…`);try{let n=await w(`/api/config/files/${encodeURIComponent(e)}${x()}`,{content:t,expected:i},`PUT`);if(!n.ok)return Y(o,`failed`,await T(n,`save failed`));let r=await n.json();i=r.content,c.value===t?(c.value=r.content,Y(o,`saved`,`saved — applies to new sessions`)):Y(o,`idle`,`saved; newer changes are unsaved`)}catch(e){Y(o,`failed`,`save failed: ${String(e)}`)}finally{s.disabled=!1}};s.onclick=()=>void l(),c.onkeydown=e=>{(e.metaKey||e.ctrlKey)&&e.key===`s`&&(e.preventDefault(),l())},c.oninput=()=>{Y(o,`idle`,`unsaved changes`)},y.replaceChildren(F(e,o,s),c),c.focus()}function ae(e){if(!u)return null;let t=K(`a`,`text-indigo-600 hover:underline`,e);return t.href=`#/tasks/${encodeURIComponent(u)}`,t}let L=()=>{let e=K(`a`,`text-indigo-600 hover:underline`,`ubix`);return e.href=`https://github.com/timqi/ubix`,e.target=`_blank`,e.rel=`noreferrer`,e};function oe(e){if(e.source!==`binary`)return``;let{spec:t,error:n,installed:r,version:i,path:a}=e.binary;return n?`${t} — ${n}`:r?`${t} — ${i??`unknown version`} at ${a??`an unknown path`}`:`${t} — not installed`}function se(e,t){a++;let n=c.find(t=>t.name===e&&t.kind===`extension`);if(!n)return ie(`unknown extension: ${e}`);let r=K(`span`,`text-[11.5px] text-neutral-400`,``);t&&Y(r,t.state,t.text);let i=ae(`every run of the update task`);y.replaceChildren(F(n.name,K(`span`,`ml-auto text-[11px] uppercase tracking-wide text-neutral-400`,n.source===`binary`?`installed by Pier`:`ships with Pier`)),K(`div`,`flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto p-4`,K(`p`,`max-w-2xl text-[13px] leading-relaxed text-neutral-600`,n.summary),K(`dl`,`flex max-w-2xl flex-col gap-1.5`,...(n.source===`bundled`?n.adds:[]).flatMap(e=>[K(`dt`,`font-mono text-[12px] text-neutral-700`,e.name),K(`dd`,`text-[12px] leading-snug text-neutral-500`,`needs ${e.needs}`)]),...n.source===`binary`?[K(`dt`,`font-mono text-[12px] text-neutral-700`,`binary`),K(`dd`,`font-mono text-[12px] leading-snug ${n.binary.error?`text-red-600`:`text-neutral-500`}`,oe(n))]:[]),vr(`Enabled`,n.source===`binary`?`Installed into Pier's own bin directory, first on the PATH every session, task and terminal inherits; it registers its own Pi extension. Switching it off uninstalls both.`:`Loaded from inside Pier — nothing is installed and no update touches your own extensions. A session mid-turn keeps the tools it started with; the next message picks this up.`,n.enabled,t=>void le(n.name,t,t=>se(e,t))),K(`p`,`max-w-2xl text-[12px] leading-snug text-neutral-400`,...n.source===`binary`?i?[`A daily task installs and updates it — its history is `,i,`.`]:[`Its installs run as the daily update task.`]:[`An extension of your own that registers the same tool wins: this copy stands down and says so in the log.`]),r))}function ce(e,t={name:``,toml:``}){a++;let n=K(`span`,`text-[11.5px] text-neutral-400`,``);e&&Y(n,e.state,e.text);let r=m(),i=ae(`the update task`),o=e=>{let t=K(`div`,`flex min-w-0 flex-1 flex-col gap-0.5`,K(`span`,`flex items-center gap-2 text-[13px] text-neutral-700`,K(`span`,`font-mono`,e.name),...p(e)?[br(`yours`,`bg-neutral-50 text-neutral-500 ring-neutral-200`)]:[]),K(`span`,`text-[11.5px] leading-snug text-neutral-400`,e.summary||oe(e)),...e.summary?[K(`span`,`font-mono text-[11px] leading-snug ${e.source===`binary`&&e.binary.error?`text-red-600`:`text-neutral-400`}`,oe(e))]:[]),n=vr(``,``,e.enabled,t=>void le(e.name,t,e=>ce(e))),r=K(`button`,`btn text-[12px] text-neutral-500 hover:text-red-600`,`Remove`);return r.onclick=()=>{r.disabled=!0;let t=Ed(e,d);D(t.body,t.saved).then(e=>ce(e))},K(`div`,`flex max-w-2xl items-start gap-3 border-b border-neutral-100 py-2.5 last:border-0`,t,...p(e)?[r]:[],n)},s={...t},c=K(`span`,`font-mono text-[12px] text-neutral-500`,`[tools.<name>]`),u=mr(s.name,`claude`,e=>{s.name=e,c.textContent=`[tools.${e.trim()||`<name>`}]`},!0),f=document.createElement(`textarea`);f.className=`${pr} h-24 resize-y font-mono leading-snug`,f.spellcheck=!1,f.value=s.toml,f.placeholder=`spec = "github:owner/repo"
83
+ `),$u=null;function ed(){$u&&($u.remove(),$u=null,document.removeEventListener(`pointerdown`,ed,!0),window.removeEventListener(`scroll`,ed,!0))}function td(e,t){e.onmouseenter=()=>{ed();let n=t();if(!n)return;$u=K(`div`,`pointer-events-none fixed z-50 max-w-96 whitespace-pre-wrap rounded-lg bg-neutral-800/95 px-3 py-2 font-sans text-[11.5px] leading-snug text-neutral-100 shadow-lg`),$u.textContent=n,document.body.append($u),document.addEventListener(`pointerdown`,ed,!0),window.addEventListener(`scroll`,ed,!0);let r=e.getBoundingClientRect();$u.style.left=`${Math.max(8,Math.min(r.left,window.innerWidth-$u.offsetWidth-8))}px`,$u.style.top=r.bottom+6+$u.offsetHeight>window.innerHeight?`${r.top-$u.offsetHeight-6}px`:`${r.bottom+6}px`},e.onmouseleave=ed}function nd(e,t,n){let r=K(`button`,`flex w-full cursor-pointer items-center gap-1.5 px-2 py-1 text-left hover:bg-neutral-100`,K(`span`,`w-3 flex-none text-indigo-600`,e.value===t?`✓`:``),K(`span`,`flex-none font-mono text-[11.5px] text-neutral-800`,e.label??e.value));return e.subject&&r.append(K(`span`,`min-w-0 truncate text-[11px] text-neutral-400`,e.subject)),e.author&&r.append(K(`span`,`ml-auto flex-none pl-1.5 text-[10.5px] text-neutral-400`,`${e.author} · ${e.at?Zn(e.at):``}`)),td(r,()=>Qu(e)),r.onclick=()=>n(e.value),r}function rd(e,t,n,r,i){let{base:a,head:o}=n,s=()=>o&&a===`${o}~1`?o:``,c=s()?`commit`:`compare`,l=t.commits[0],u=e=>[...e?[{value:``,label:`Working tree`,subject:`the files on disk, uncommitted changes included`}]:[],{...l,value:`HEAD`},...t.refs.map(e=>({value:e.name,subject:e.subject})),...t.commits.map(e=>({...e,value:e.hash}))],d=K(`div`,`flex w-[38rem] max-w-full flex-col`);function f(){let e=(e,t)=>{let n=K(`button`,`cursor-pointer rounded-full px-2.5 py-0.5 text-[11.5px] ${c===t?`bg-indigo-50 font-medium text-indigo-700`:`text-neutral-500 hover:bg-neutral-100`}`,e);return n.onclick=()=>{c=t,f()},n},n=(e,t,n,r)=>K(`div`,`flex min-w-0 flex-1 flex-col`,K(`div`,`flex-none px-2 pb-0.5 text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,e),K(`div`,`min-h-0 flex-1 overflow-y-auto`,...t.map(e=>nd(e,n,r)))),l=c===`compare`?K(`div`,`flex h-72 min-h-0 divide-x divide-neutral-200 pb-1`,n(`base`,u(!1),a,e=>{a=e,f(),r(a,o)}),n(`to`,u(!0),o,e=>{o=e,f(),r(a,o)})):K(`div`,`flex h-72 min-h-0 flex-col overflow-y-auto pb-1`,...t.commits.map(e=>nd({value:e.hash,...e},s(),e=>{a=`${e}~1`,o=e,$(),r(a,o)}))),p=K(`div`,`flex-none border-t border-neutral-200`,nd({value:i,label:`↺ ${i} ↔ Working tree`,subject:`back to the default: the main line's tip vs the files on disk`},a===i&&o===``?i:``,()=>{a=i,o=``,f(),r(a,o)}));d.replaceChildren(K(`div`,`flex flex-none items-center gap-1 border-b border-neutral-200 px-2 py-1.5`,e(`Compare two points`,`compare`),e(`One commit`,`commit`)),l,...c===`compare`?[p]:[])}f(),cc(e,d)}var id=/\.(png|jpe?g|gif|webp|avif|bmp|svg)$/i,ad={A:`text-emerald-600`,M:`text-amber-600`,D:`text-red-600`},od=30,sd=`pier.filesPrefs`,cd=50,ld=()=>{try{let e=JSON.parse(localStorage.getItem(sd)??`{}`);return e&&typeof e==`object`?e:{}}catch{return{}}},ud=e=>{let t=e?ld()[e]:void 0;return typeof t?.cwd==`string`&&typeof t.base==`string`&&typeof t.head==`string`?{cwd:t.cwd,base:t.base,head:t.head}:null},dd=(e,t)=>{let n=ld();delete n[e],n[e]=t;let r=Object.keys(n);for(let e of r.slice(0,Math.max(0,r.length-cd)))delete n[e];try{localStorage.setItem(sd,JSON.stringify(n))}catch(e){console.warn(`Files: could not remember this folder`,e)}},fd=(e,t=`indigo`)=>{let n=K(`button`,`min-w-0 cursor-pointer truncate rounded-md px-2 py-0.5 text-left font-mono text-[11.5px] ${t===`indigo`?`bg-indigo-50 font-medium text-indigo-700 hover:bg-indigo-100`:`bg-neutral-100 text-neutral-600 hover:bg-neutral-200`}`,e);return n.type=`button`,n};function pd(e,t,n,r){let i=``,a=``,o={branch:null,refs:[],commits:[],worktrees:[]},s=`HEAD`,c=``,l=new Map,u=!0,d=!1,f=[],p=new Set,m=null,h=null,g=K(`header`,`flex h-10 flex-none items-center gap-2 border-b border-neutral-200 bg-white px-3`),_=K(`div`,`flex-none border-b border-neutral-200`),v=K(`div`,`min-h-0 flex-1 overflow-y-auto py-1`),y=K(`aside`,`flex w-64 flex-none flex-col border-r border-neutral-200 text-[12.5px] max-md:h-2/5 max-md:w-full max-md:border-b max-md:border-r-0`,_,v),b=K(`div`,`h-full min-w-0 overflow-auto`),x=K(`div`,`pointer-events-none absolute inset-y-0 right-0 z-20 hidden w-2`),S=K(`section`,`relative min-h-0 min-w-0 flex-1`,b,x);e.append(g,K(`div`,`flex min-h-0 flex-1 max-md:flex-col`,y,S));let C=(e,t)=>`/api/explorer/${e}?${new URLSearchParams({root:i,...t})}`,w=(e,t=`text-neutral-400`)=>K(`p`,`px-4 py-3 text-[12.5px] ${t}`,e),T=e=>{let t=0;for(let n of l.keys())n.startsWith(`${e}/`)&&t++;return t};function E(e,t){let n=new Set(t.map(e=>e.name)),r=e?`${e}/`:``;for(let[e,i]of l){if(i.status!==`D`||!e.startsWith(r))continue;let a=e.slice(r.length).split(`/`)[0];n.has(a)||(n.add(a),t.push({name:a,dir:e.slice(r.length).includes(`/`)}))}let i=t;return u&&o.branch&&(i=t.filter(e=>e.dir?T(`${r}${e.name}`)>0:l.has(`${r}${e.name}`))),i.sort((e,t)=>Number(t.dir)-Number(e.dir)||e.name.localeCompare(t.name)),i.map(e=>e.dir?k(`${r}${e.name}`,e.name):ee(`${r}${e.name}`,e.name))}async function O(e,t){try{let{entries:n}=await D(C(`ls`,{path:t}),`could not list this folder`);e.replaceChildren(...E(t,n)),e.childElementCount||e.append(w(u?`No changes.`:`Empty.`))}catch(n){let r=E(t,[]);r.length?e.replaceChildren(...r):e.replaceChildren(w(String(n),`text-red-600`))}}function k(e,t){let n=T(e),r=[K(`span`,`truncate`,t)];n&&r.push(K(`span`,`ml-auto flex-none rounded bg-amber-100/80 px-1 font-mono text-[10px] text-amber-700`,String(n)));let{el:i,summary:a}=cr(``,r);a.className+=` px-2 py-0.5 hover:bg-neutral-100`;let s=K(`div`,`pl-3`);i.append(s);let c=!1,l=()=>{c||(c=!0,s.append(w(`…`)),O(s,e))};return i.ontoggle=()=>{p[i.open?`add`:`delete`](e),i.open&&l()},(u&&o.branch&&!d||p.has(e))&&(i.open=!0,l()),i}function A(e){h?.classList.remove(`bg-indigo-50`,`text-indigo-700`),h=e,e.classList.add(`bg-indigo-50`,`text-indigo-700`)}function ee(e,t){let n=l.get(e)?.status,r=K(`button`,`flex w-full cursor-pointer items-center gap-1.5 px-2 py-0.5 pl-6 text-left hover:bg-neutral-100`,K(`span`,`truncate`,t));return n&&r.append(K(`span`,`ml-auto flex-none font-mono text-[10.5px] font-semibold ${ad[n]??`text-neutral-500`}`,n)),r.title=e,e===m&&A(r),r.onclick=()=>{A(r),m=e,F(e)},r}let j=()=>void O(v,``),M=(e,t)=>[...e?[K(`span`,`flex-none font-mono text-[10.5px] font-semibold text-emerald-600`,`+${e}`)]:[],...t?[K(`span`,`flex-none font-mono text-[10.5px] font-semibold text-red-600`,`−${t}`)]:[]];function N(e,t,n){let r=l.get(e),i=K(`div`,`sticky top-0 z-10 flex items-center gap-2 border-b border-neutral-200 bg-white px-4 py-1.5 font-mono text-[11.5px] text-neutral-500`,K(`span`,`truncate`,e));r&&(i.append(K(`span`,`flex-none font-semibold ${ad[r.status]??``}`,r.status)),i.append(...M(r.add,r.del)));let a=K(`div`,`ml-auto flex flex-none items-center gap-2`);if(n&&a.append(n),t){let t=document.createElement(`a`);t.className=`flex-none text-neutral-400 hover:text-indigo-700 hover:underline`,t.href=C(`file`,{path:e}),t.download=$n(e),t.textContent=`Download`,a.append(t)}return i.append(a),i}function te(e){let t=0;for(;t<e.length;){if(e[t].tone!==`del`){t++;continue}let n=t;for(;t<e.length&&e[t].tone===`del`;)t++;let r=t;for(;t<e.length&&e[t].tone===`add`;)t++;let i=Math.min(r-n,t-r);for(let t=0;t<i;t++){let i=e[n+t],a=e[r+t],o=Math.min(i.text.length,a.text.length),s=0;for(;s<o&&i.text[s]===a.text[s];)s++;let c=0;for(;c<o-s&&i.text[i.text.length-1-c]===a.text[a.text.length-1-c];)c++;s+c!==0&&(i.mark=[s,i.text.length-c],a.mark=[s,a.text.length-c])}}}let P=le();function ne(){x.classList.add(`hidden`),x.replaceChildren(),P.set([],[])}let re=0,ie=e=>e===re;function F(e){let t=++re;return l.has(e)?ue(e,t):I(e,t)}async function I(e,t){if(!ie(t))return;ne();let n=C(`file`,{path:e}),r=K(`div`,`min-w-0`);if(b.classList.remove(`flex`,`flex-col`),b.replaceChildren(N(e,!0),r),id.test(e)){let e=K(`img`,`max-w-full p-4`);e.src=n,e.onerror=()=>r.replaceChildren(w(`Could not load image.`,`text-red-600`)),r.append(e);return}if(e.toLowerCase().endsWith(`.pdf`)){let t=document.createElement(`iframe`);t.className=`h-full w-full`,t.src=n,b.replaceChildren(N(e,!0),t),b.classList.add(`flex`,`flex-col`);return}r.append(w(`…`));let i=await fetch(n);if(!ie(t))return;if(!i.ok){let{error:e}=await i.json().catch(()=>({}));r.replaceChildren(w(e??`HTTP ${i.status}`,`text-red-600`));return}if(!(i.headers.get(`content-type`)??``).startsWith(`text/plain`)){r.replaceChildren(w(`Binary file — use Download.`));return}let a=(await i.text()).split(`
84
+ `);ie(t)&&(a.at(-1)===``&&a.pop(),r.replaceChildren(Yu(Ju(a),Ki(e))))}function ae(e){let t=[],n=0,r=0,i=!1,a=e.split(`
85
+ `);a.at(-1)===``&&a.pop();for(let e of a){let a=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/.exec(e);if(a){i&&t.push({nums:[``,``],text:`⋯`,tone:``}),[n,r]=[Number(a[1]),Number(a[2])],i=!0;continue}!i||e.startsWith(`\\`)||(e.startsWith(`+`)?t.push({nums:[``,r++],text:e.slice(1),tone:`add`}):e.startsWith(`-`)?t.push({nums:[n++,``],text:e.slice(1),tone:`del`}):t.push({nums:[n++,r++],text:e.slice(1),tone:``}))}return t}function L(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n].tone;if(!r)continue;let i=t.at(-1);i&&i.end===n-1?(i.end=n,(r===`add`&&i.tone===`del`||r===`del`&&i.tone===`add`)&&(i.tone=`mixed`)):t.push({start:n,end:n,tone:r})}return t}let oe={add:`bg-emerald-400`,del:`bg-red-400`,mixed:`bg-amber-400`};function se(e,t,n){x.replaceChildren(...e.map(e=>{let r=K(`button`,`pointer-events-auto absolute w-full cursor-pointer ${oe[e.tone]}`);return r.style.top=`${e.start/t*100}%`,r.style.height=`${Math.max(.4,(e.end-e.start+1)/t*100)}%`,r.title=`line ${ce(n,e.start)}`,r.onclick=()=>n[e.start].scrollIntoView({block:`center`}),r})),x.classList.remove(`hidden`)}let ce=(e,t)=>e[t]?.querySelector(`span`)?.textContent?.trim()||String(t+1);function le(){let t=[],n=[],r=-1,i=K(`span`,`flex-none text-[10.5px] text-neutral-400`),a=e=>{t.length&&(r=(r+e+t.length)%t.length,n[t[r].start].scrollIntoView({block:`center`}),i.textContent=`${r+1}/${t.length}`)},o=()=>t.length>0&&!e.classList.contains(`hidden`),s=(e,t,n,r)=>{let i=K(`button`,`icon-btn flex-none`,e);return i.onclick=()=>a(t),Qo(i,r,n,()=>a(t),o),i};return{el:K(`div`,`flex flex-none items-center gap-1`,i,s(`↑`,-1,`Previous change`,[`p`,`k`]),s(`↓`,1,`Next change`,[`n`,`j`])),set(e,a){t=e,n=a,r=-1,i.textContent=`${e.length} change${e.length===1?``:`s`}`}}}async function ue(e,t){ne(),b.classList.remove(`flex`,`flex-col`);let n=l.get(e)?.status!==`D`;b.replaceChildren(N(e,n),w(`…`));try{let{diff:r}=await D(C(`diff`,{base:s,head:c,file:e,context:`99999`}),`could not read this diff`);if(!ie(t))return;if(!r||/^Binary files /m.test(r))return I(e,t);let i=ae(r);te(i);let a=Yu(i,Ki(e)),o=[...a.children],l=L(i);P.set(l,o),b.replaceChildren(N(e,n,P.el),a),se(l,i.length,o)}catch(n){ie(t)&&b.replaceChildren(N(e,!1),w(String(n),`text-red-600`))}}let de=()=>c&&s===`${c}~1`?c:``,fe=()=>o.commits.find(e=>e.hash===de())?.subject??``,pe=()=>de()?`${de()} — ${fe()||`commit`}`:`${s} ↔ ${c||`working tree`}`,me=(e,t,n,r)=>{let i=K(`button`,`flex h-6 w-6 flex-none cursor-pointer items-center justify-center rounded-md ${n?`bg-indigo-50 text-indigo-700`:`text-neutral-400 hover:bg-neutral-100 hover:text-neutral-700`}`);return i.innerHTML=e,i.title=t,i.onclick=r,i};function he(){let e=me(`<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" class="h-3.5 w-3.5"><path d="M2.5 3h11l-4.25 5v4.5l-2.5 1.25V8L2.5 3z" stroke-linejoin="round"/></svg>`,`Show only files that differ`,u,()=>{u=!u,he(),j()}),t=me(`<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" class="h-3.5 w-3.5"><path d="m4.5 2.5 3.5 3 3.5-3M4.5 13.5l3.5-3 3.5 3" stroke-linecap="round" stroke-linejoin="round"/></svg>`,d?`Restore folders`:`Collapse all folders`,d,()=>{if(d=!d,d)f=[...p],p.clear();else for(let e of f)p.add(e);he(),j()});if(!o.branch){_.replaceChildren(K(`div`,`flex items-center justify-end gap-1 p-1.5`,t));return}let n=fd(pe());if(de()){let e=o.commits.find(e=>e.hash===de());td(n,()=>e?Qu(e):``)}else n.title=`Choose what to diff`;n.onclick=async()=>{await xe(),rd(n,o,{base:s,head:c},(e,t)=>{s=e,c=t,ye()},Se())};let[r,i]=[0,0];for(let e of l.values())r+=e.add,i+=e.del;_.replaceChildren(K(`div`,`flex flex-col gap-1 p-2`,n,K(`div`,`flex items-center gap-1.5 pl-1`,K(`span`,`text-[11px] text-neutral-400`,`${l.size} changed file${l.size===1?``:`s`}`),...M(r,i),K(`span`,`ml-auto`),e,t)))}let ge=()=>{a&&i&&dd(a,{cwd:i,base:s,head:c})},_e=e=>{let t=e.replace(/~\d+$/,``);return!t||t===`HEAD`||o.refs.some(e=>e.name===t)||o.commits.some(e=>e.hash===t)};async function ve(){if(l=new Map,!o.branch)return;let{files:e}=await D(C(`diff`,{base:s,head:c}),`could not read what changed`);for(let t of e)l.set(t.path,{status:t.status,add:t.add,del:t.del});if(l.size<=od)for(let e of l.keys()){let t=e.split(`/`);for(let e=1;e<t.length;e++)p.add(t.slice(0,e).join(`/`))}}async function ye(){ge();try{await ve()}catch(e){he(),v.replaceChildren(w(String(e),`text-red-600`));return}he(),j(),m&&F(m)}function be(){let e=fd(i||`Choose a folder…`,`neutral`);e.className+=` max-w-72`,e.title=`Switch folder`,e.onclick=()=>wc(e,o.worktrees.map(e=>({path:e.path,...e.branch?{hint:e.branch}:{}})),i||void 0,n);let t=K(`button`,`icon-btn ml-auto`,`✕`);t.type=`button`,t.title=`Close Files`,t.setAttribute(`aria-label`,`Close Files`),t.onclick=r,g.replaceChildren(e,K(`span`,`truncate font-mono text-[11.5px] text-neutral-400`,o.branch?`⎇ ${o.branch}`:`no git`),t)}async function xe(){if(i)try{o=await D(C(`git`,{}),`could not read this repository`),be()}catch(e){b.replaceChildren(w(String(e),`text-red-600`))}}let Se=()=>o.refs.some(e=>e.name===`main`)?`main`:o.refs.some(e=>e.name===`master`)?`master`:`HEAD`;async function Ce(){if(be(),m=null,h=null,p.clear(),ne(),b.classList.remove(`flex`,`flex-col`),b.replaceChildren(w(`Select a file.`)),!i){_.replaceChildren(),v.replaceChildren(),b.replaceChildren(w(`No folder yet — pick one from the chip above.`));return}try{o=await D(C(`git`,{}),`could not read this repository`)}catch(e){o={branch:null,refs:[],commits:[],worktrees:[]},b.replaceChildren(w(String(e),`text-red-600`))}let e=ud(a),t=e&&e.cwd===i&&_e(e.base)&&_e(e.head)?e:null;s=t?.base??Se(),c=t?.head??``,be(),await ye()}return rr(e,e=>{let n=t(),r=n?.id??``,o=e?.startsWith(`/`)?e:(r===a?i:``)||ud(r)?.cwd||n?.cwd||``;if(o===i&&r===a&&v.childElementCount){be(),xe().then(ye);return}a=r,i=o,Ce()},()=>{ne(),b.classList.remove(`flex`,`flex-col`),b.replaceChildren(w(`Select a file.`))})}var md={display_information:{name:`Pier`,description:`Coding agent sessions in Slack threads`,background_color:`#262626`},features:{bot_user:{display_name:`Pier`,always_online:!1},app_home:{messages_tab_enabled:!0,messages_tab_read_only_enabled:!1}},oauth_config:{scopes:{bot:[`chat:write`,`reactions:write`,`channels:history`,`channels:read`,`groups:history`,`groups:read`,`im:history`,`im:write`,`mpim:history`,`mpim:read`,`mpim:write`,`users:read`,`files:read`,`files:write`]}},settings:{event_subscriptions:{bot_events:[`message.channels`,`message.groups`,`message.im`,`message.mpim`]},interactivity:{is_enabled:!0},socket_mode_enabled:!0,token_rotation_enabled:!1}},hd=()=>`https://api.slack.com/apps?new_app=1&manifest_json=${encodeURIComponent(JSON.stringify(md))}`,gd=()=>Cr(`Getting a bot token`,[`Open [@BotFather](https://t.me/BotFather) in Telegram.`,"Send `/newbot`, pick a display name, then a username ending in `bot`.","Copy the token it prints (`123456789:AA…`) and paste it here.","Send `/setprivacy` → `Disable` if the bot should see plain group messages. Left enabled it only ever receives mentions, replies and commands — the usual reason a bot looks dead in a group.","Send `/setjoingroups` → `Enable`, then add the bot to your group or forum."]),_d=(e=`left`)=>Cr(`Enabling topics on a group`,["In Telegram open the group → `Edit` → turn on `Topics`. Owner only; group size no longer matters.","The group becomes a forum supergroup and the existing chat becomes its `General` topic.","Make the bot an admin with `Manage Topics`. That is the one right topic creation needs — without it Pier logs the failure and answers in General instead.","Send one message in the group so Pier discovers it, then enable it under `Chats` below.","After that, a message in General opens its own topic with its own session. A reply, or anything starting with `/`, stays where it was sent."],e);function vd(){let e=q(`Create Slack app ↗`,!0);e.classList.add(`mt-1`,`w-fit`),e.onclick=()=>window.open(hd(),`_blank`,`noreferrer`);let t=sr(`btn w-fit text-[12.5px]`,()=>JSON.stringify(md,null,2));return Cr(`Creating a Slack app`,[wr(`Opens Slack with every scope, event and Socket Mode already filled in. Pick your workspace → Create.`,e),"`Install to Workspace` → allow. Then `OAuth & Permissions` → copy the bot token (`xoxb-…`) into the field above.","`Basic Information` → `App-Level Tokens` → `Generate` with scope `connections:write`. Paste that `xapp-…` token below. The manifest cannot mint this one for you.","In Slack, invite the bot where you want it: `/invite @Pier`. It answers in threads only, so it never adds noise to the channel.",wr(`Prefer to paste it yourself? Create the app from a manifest and use this:`,t)])}var yd=()=>Cr(`What agent access allows`,["Gives agent sessions a `slack` tool: read a channel's history for a time range, read one thread, and post, edit or delete a message.",`Editing and deleting reach only what Pier's own bot posted — Slack refuses either on anyone else's message.`,`Pier performs every call itself — the bot token is never given to the agent, and Slack's own membership rules still apply, so the bot reaches only channels it was invited to.`,`Every read fetches live from Slack — Pier keeps no message archive.`,`This includes sessions started by tasks and subagents. Switch it off if an agent should never post to your workspace on its own.`,`The tool is only given to sessions opened while Slack is connected and this is on, so an unused tool costs no context. A session opened earlier keeps it, and a call made after you switch it off is refused with the reason.`]),bd=(e=`left`)=>Cr(`How Slack threads work here`,[`Pier never posts in a channel's main flow. A message in the channel is answered in *its own thread*; a message in a thread is answered in that thread.`,`Each thread is its own Pi session, so one channel hosts many parallel sessions.`,`The same applies in a DM: every new message you send there starts its own thread and its own session. Reply *inside* a thread to continue that conversation.`,"Inside a thread Pier already owns, no `@mention` is needed — continuing that thread is addressing it.","Commands are bare words after a mention: `@bot settings`, `@bot stop`, `@bot bind <code>`. Slack's client swallows an unregistered `/command` before it ever reaches an app."],e),xd=()=>Cr(`Creating a Feishu app`,["On [open.feishu.cn](https://open.feishu.cn/app) create a 企业自建应用 (custom app). `Credentials & Basic Info` shows the App ID (`cli_…`) and App Secret — paste both here.","`Add Features` → enable **Bot** (机器人).","`Permissions` (权限管理), add: `im:message` (read messages), `im:message:send_as_bot` (send), `im:resource` (attachments, both directions), `im:message.reactions:create` + `:read` + `:delete` (the 👀 receipt), `im:chat:readonly` (chat names for this page), `contact:user.base:readonly` (speaker names).","`Events & Callbacks` → set the mode to **长连接 (long connection)** — no public URL needed. Under Events subscribe `im.message.receive_v1` (接收消息); Callbacks gain `card.action.trigger` automatically once cards are sent, add it if listed.",`**Publish a version** (版本管理与发布 → 创建版本 → 申请发布). Nothing above takes effect until this is approved — the usual reason a configured bot stays silent.`,`Add the bot to a group (群设置 → 群机器人), or DM it directly.`]),Sd=(e=`left`)=>Cr(`How Lark topics work here`,[`Pier never posts in a chat's main flow. A message in the chat is answered in *its own topic* (话题); a message inside a topic is answered there.`,`Each topic is its own Pi session, so one group hosts many parallel sessions.`,`The same applies in a DM: every new message starts its own topic and its own session. Reply *inside* a topic to continue that conversation.`,`Inside a topic Pier already owns, no @mention is needed — continuing that topic is addressing it.`,"Commands are slash words: `/stop`, `/settings`, `/bind <code>`. A bare @mention with nothing else also opens the settings panel."],e),Cd=[[`telegram`,`Telegram`],[`slack`,`Slack`],[`lark`,`Lark`]],wd=(e,t)=>K(`span`,`flex items-center gap-1.5 text-[13px] text-neutral-400`,K(`span`,``,e),t),Td={dm:`bg-sky-50 text-sky-700 ring-sky-200`,group:`bg-neutral-100 text-neutral-600 ring-neutral-200`,forum:`bg-violet-50 text-violet-700 ring-violet-200`},Ed=`pier.channelsPlatform`;function Dd(e){let t=localStorage.getItem(Ed),n=Cd.some(([e])=>e===t)?t:`telegram`,r=null,i=[],a=K(`div`,`ml-auto flex items-center gap-1.5 text-[11.5px]`),o=K(`div`,`sticky top-0 z-30 flex items-center gap-1 border-b border-neutral-200 bg-white px-4 py-2`,a),s=K(`div`,`px-4 py-5`);e.append(K(`div`,`min-h-0 flex-1 overflow-y-auto bg-neutral-50/60`,o,s));function c(){o.replaceChildren(...Cd.map(([e,t])=>fr(t,e===n,()=>{l&&g(),n=e,localStorage.setItem(Ed,e),_()})),a)}let l,u=!1,d=null;function f(e){if(a.replaceChildren(),e!==`clean`){if(a.className=`ml-auto flex items-center gap-1.5 text-[11.5px] ${br[e]}`,e===`saving`)a.append(K(`span`,`spinner`),K(`span`,``,`Saving…`));else if(e===`saved`)a.append(K(`span`,``,`✓`),K(`span`,``,`Saved`)),setTimeout(()=>{a.textContent?.includes(`Saved`)&&f(`clean`)},2e3);else{let e=ur(`Retry`,`cursor-pointer underline`);e.onclick=g,a.append(K(`span`,``,`⚠`),K(`span`,``,`Save failed`),e)}}}function p(){f(`saving`),clearTimeout(l),l=setTimeout(g,500)}let m=e=>t=>{e(t),p()};async function h(e){u=!0,f(`saving`);try{f((await w(`/api/channels/${e.platform}`,e.config,`PUT`)).ok?`saved`:`failed`)}catch{f(`failed`)}finally{u=!1;let e=d;d=null,e&&h(e)}}function g(){if(clearTimeout(l),l=void 0,!r)return;let e={platform:n,config:r};u?d=e:h(e)}async function _(){if(!i.length){let e=await E(`/api/models`,`Could not load the model catalog`);e.ok&&(i=e.value)}let e=await E(`/api/channels/${n}`,`Failed to load`);if(!e.ok){r=null,c(),s.replaceChildren(Sr(e.error));return}r=e.value,f(`clean`),C()}function v(e){let t=n===`slack`,r=n===`lark`,i=hr(e.token,t?`xoxb-…`:r?`cli_…`:`123456789:AA…`,m(t=>e.token=t),!0),a=hr(e.appToken,r?``:`xapp-…`,m(t=>e.appToken=t),!0),o=Oc(e.cwd,`(pier process cwd)`,m(t=>e.cwd=t));return pr(`Connection`,t?`Pier connects over Socket Mode; no public URL or webhook needed.`:r?`Pier connects over Feishu's WebSocket long connection; no public URL or webhook needed.`:`Pier polls Telegram for updates; no public URL or webhook needed.`,yr(`Enabled`,`Start the adapter when Pier boots.`,e.enabled,m(t=>{e.enabled=t,c()})),J(r?`App ID`:`Bot token`,i,{hint:`Stored locally, shown masked once saved.`,help:n===`telegram`?gd():t?vd():xd()}),...t?[J(`App-level token`,a,{hint:`Opens the Socket Mode connection. Needs connections:write.`}),yr(`Agent access`,`Let agent sessions read channel history and post through the slack tool. Off makes the tool refuse; inbound messages are unaffected.`,e.agentTool,m(t=>e.agentTool=t),yd())]:[],...r?[J(`App Secret`,a,{hint:`From Credentials & Basic Info, beside the App ID.`})]:[],J(`Default working directory`,o.el,{hint:`Where sessions this channel opens start.`}))}function y(e){return pr(`Defaults for new chats`,`Copied into a group the first time the bot sees it; changing them here never touches a group that already exists. DMs are always bound-users-only.`,yr(`Require mention in groups`,`Ignore group messages that do not @mention or reply to the bot.`,e.requireMention,m(t=>e.requireMention=t)),yr(`Require bound user`,`Only users bound with a code below can drive the agent.`,e.requireBind,m(t=>e.requireBind=t)),...n===`slack`?[wd(`Thread mode: always on`,bd())]:n===`lark`?[wd(`Thread mode: always on`,Sd())]:[yr(`Topic mode`,`In a forum group, each new request opens its own topic and its own session.`,e.topicMode,m(t=>e.topicMode=t),_d())],yc(`Model & reasoning`,e,i,m(t=>{e.model=t.model,e.thinking=t.thinking,C()})))}function b(e){let t=K(`span`,`font-mono text-[15px] font-semibold tracking-widest`),r=K(`div`,`hidden items-center gap-2 rounded-lg bg-indigo-50 px-3 py-2 text-[12.5px] text-indigo-800`,t,K(`span`,`text-[11.5px] text-indigo-500`,`DM the bot /bind <code> · expires in 10 min`)),i=q(`Generate bind code`);i.onclick=async()=>{let e=await fetch(`/api/channels/${n}/bind-code`,{method:`POST`});if(!e.ok)return;let{code:i}=await e.json();t.textContent=i,r.classList.replace(`hidden`,`flex`)};let a=K(`div`,`flex flex-col`);e.users.length||a.append(Sr(`No bound users yet.`));for(let t of e.users){let e=ur(`Remove`,`cursor-pointer text-[11.5px] text-neutral-400 opacity-0 transition-opacity hover:text-red-600 group-hover:opacity-100`);e.onclick=async()=>{await fetch(`/api/channels/${n}/users/${encodeURIComponent(t.id)}`,{method:`DELETE`}),await _()},a.append(K(`div`,`group flex items-center gap-2.5 border-b border-neutral-100 py-2 last:border-0`,K(`span`,`flex h-6 w-6 flex-none items-center justify-center rounded-full bg-neutral-100 text-[11px] font-semibold text-neutral-500`,(t.name[0]??`?`).toUpperCase()),K(`span`,`min-w-0 flex-1 truncate text-[13px] text-neutral-700`,t.name),K(`span`,`flex-none font-mono text-[11.5px] text-neutral-400`,t.id),e))}return pr(`Bound users`,`A code is single-use and expires; redeeming it in a DM binds that account.`,a,K(`div`,`flex flex-col gap-2`,i,r))}function x(e,t){let r=K(`div`,`rounded-xl border px-3.5 py-3 transition-colors ${t.enabled?`border-neutral-200 bg-white`:`border-neutral-200 bg-neutral-50/60`}`),a=K(`div`,`flex items-center gap-2`,K(`span`,`min-w-0 flex-1 truncate text-[13px] font-medium ${t.enabled?`text-neutral-800`:`text-neutral-400`}`,t.name||t.id),xr(t.kind,Td[t.kind]),K(`span`,`flex-none font-mono text-[11px] text-neutral-400`,t.id)),o=yr(``,``,t.enabled,m(e=>{t.enabled=e,C()}));o.classList.add(`flex-none`,`items-center`),a.append(o);let s=K(`div`,`mt-3 flex flex-wrap items-center gap-x-6 gap-y-2`);t.kind===`dm`?s.append(K(`span`,`text-[13px] text-neutral-400`,n===`telegram`?`Direct message · bound users only, mention and topics not applicable`:`Direct message · bound users only, mention not applicable`)):s.append(yr(`Require mention`,``,t.requireMention,m(e=>t.requireMention=e)),yr(`Require bind`,``,t.requireBind,m(e=>t.requireBind=e)),n===`slack`?wd(`Thread mode: always on`,bd(`right`)):n===`lark`?wd(`Thread mode: always on`,Sd(`right`)):t.kind===`forum`?yr(`Topic mode`,``,t.topicMode,m(e=>t.topicMode=e),_d(`right`)):wd(`Topic mode: forum groups only`,_d(`right`)));let c=K(`div`,`mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2`,J(`Working directory`,Oc(t.cwd,``,m(e=>t.cwd=e)).el),yc(`Model & reasoning`,t,i,m(e=>{t.model=e.model,t.thinking=e.thinking,C()})));return r.append(a,s,c),r}function S(e){let t=K(`div`,`flex flex-col gap-2.5`);return e.chats.length?t.append(...e.chats.map(t=>x(e,t))):t.append(Sr(`None yet. Chats appear here after the bot sees a message in them.`)),pr(n===`slack`?`Channels`:`Chats`,`Discovered from inbound traffic — no platform reliably lists every chat a bot is in.`,t)}function C(){if(!r)return;c();let e=K(`div`,`mx-auto flex max-w-3xl flex-col gap-4`);e.append(v(r),y(r),b(r),S(r)),s.replaceChildren(e)}return rr(e,()=>void _(),()=>{l&&g()})}async function Od(e,t){let n;try{n=await w(`/api/settings`,e,`PUT`)}catch(e){return{outcome:{state:`failed`,text:`Could not save: ${String(e)}`}}}if(!n.ok)return{outcome:{state:`failed`,text:await T(n,`could not save`)}};let r;try{r=await n.json()}catch(e){return{outcome:{state:`failed`,text:`Saved, but the answer could not be read: ${String(e)}`}}}return r.toolsSync?.state===`refused`?{outcome:{state:`failed`,text:`Saved, but nothing will install it: ${r.toolsSync.reason}`},answer:r}:r.toolsSync?.state===`waiting`?{outcome:{state:`saved`,text:`Saved — a sync is already running; this change goes in the run right after it.`},answer:r}:{outcome:{state:`saved`,text:t},answer:r}}function kd(e,t){return e.enabled?{body:{tool:{name:e.name,on:!1}},saved:`Switched ${e.name} off — the next run uninstalls it. Remove it again once its binary is gone.`}:{body:{customTools:t.filter(t=>t.name!==e.name)},saved:`Removed ${e.name}.`}}function Ad(e,t){let n=`global`,r=null,i=0,a=0,o=``,s=null,c=[],l=``,u=null,d=[],f=()=>c.filter(e=>e.kind===`extension`),p=e=>e.source===`binary`&&e.custom===!0,m=()=>c.filter(e=>e.kind===`tool`),h=document.createElement(`select`);h.className=`select w-full rounded-md border border-neutral-300 px-2 py-1 text-[12.5px] focus:border-indigo-400 focus:outline-none`,h.onchange=()=>{n=h.value,r=null,te.clear(),k()};let g=K(`div`,`flex flex-none flex-col gap-1 border-b border-neutral-200 px-3 pb-2.5 pt-2`);g.append(K(`span`,`text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,`Scope`),h);let _=K(`div`,`min-h-0 flex-1 overflow-y-auto py-1`),v=K(`nav`,`flex w-64 flex-none flex-col border-r border-neutral-200 text-[13px]`);v.append(g,_);let y=K(`div`,`flex min-w-0 flex-1 flex-col`),b=K(`div`,`flex min-h-0 flex-1`);b.append(v,y),e.append(b);let x=(e=``)=>`?scope=${encodeURIComponent(n)}${e}`;async function S(){if(n!==`global`){c=[],l=``;return}let e=await E(`/api/settings`,`could not be loaded`,{cache:`no-store`});if(!e.ok){c=[],l=e.error;return}C(e.value),l=``}function C(e){c=e.catalog,d=e.customTools,u=e.toolsTaskId}async function D(e,t){let{outcome:n,answer:r}=await Od(e,t);return r&&(C(r),ne(s)),n}function O(e,t){let n={name:e,on:t};return c.find(t=>t.name===e)?.source===`binary`?{tool:n}:{extension:n}}async function k(){let e=++i;a++;let[t]=await Promise.all([E(`/api/config${x()}`,`failed to load config`,{cache:`no-store`}),S()]);if(e!==i)return;if(!t.ok){ne(null),ie(t.error);return}let c=t.value;n===`global`&&c.dir&&(o=c.dir,de()),s=c,ne(c),r||re()}function A(e){return K(`div`,`px-3 pb-0.5 pt-2.5 text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,e)}let ee=()=>{let e=K(`span`,`flex-none rounded bg-neutral-100 px-1 text-[10px] font-semibold uppercase tracking-wide text-neutral-500`,`link`);return e.title=`Reached through a symlink`,e},j=()=>K(`span`,`flex-none rounded bg-emerald-50 px-1 text-[10px] font-semibold uppercase tracking-wide text-emerald-700`,`on`);function M(e,t,n,r,i=0,a){let o=K(`button`,`flex w-full cursor-pointer items-center gap-1.5 py-1 pr-3 text-left hover:bg-neutral-100 ${t?`bg-indigo-50 hover:bg-indigo-50`:``} ${n?`text-neutral-400`:``}`);return o.append(K(`span`,`truncate`,e)),a&&o.append(a),o.style.paddingLeft=`${20+i*14}px`,o.title=e,o.onclick=r,o}function N(e){let t={files:[],dirs:new Map,link:!0};for(let n of e){let e=n.name.split(`/`),r=t;for(let t of e.slice(0,-1)){let e=r.dirs.get(t);e||r.dirs.set(t,e={files:[],dirs:new Map,link:!0}),e.link&&=n.link,r=e}r.files.push({name:e[e.length-1],link:n.link})}return t}let te=new Set;function P(e,t,n,r,i,a){let o=[];for(let[s,c]of t.dirs){let t=n?`${n}/${s}`:s,l=`${e}:${t}`,u=document.createElement(`details`);u.open=te.has(l),u.ontoggle=()=>u.open?te.add(l):te.delete(l);let d=K(`summary`,`flex cursor-pointer select-none items-center gap-1 truncate py-1 pr-3 hover:bg-neutral-100`);d.style.paddingLeft=`${20+r*14}px`,d.title=t,d.append(K(`span`,`chev`,`▶`),K(`span`,`truncate text-neutral-600`,s)),c.link&&d.append(ee()),u.append(d,...P(e,c,t,r+1,i,a)),o.push(u)}for(let s of t.files){let t={type:`resource`,kind:e,name:n?`${n}/${s.name}`:s.name};o.push(M(s.name,i(t),!1,()=>a(t),r,s.link?ee():void 0))}return o}function ne(e){if(!e){_.replaceChildren();return}let t=e=>JSON.stringify(e)===JSON.stringify(r),i=t=>{r=t,ne(e),t.type===`file`?I(t.name):t.type===`bundled`?se(t.name):t.type===`tools`?ce():ue(t.kind,t.name)},a=[];a.push(A(`Files`));for(let n of e.files){let e={type:`file`,name:n.name};a.push(M(n.name,t(e),!n.exists,()=>i(e)))}if(n===`global`){a.push(A(`bundled with Pier`)),l?a.push(K(`p`,`py-1 pl-5 pr-3 text-[12.5px] text-red-600`,l)):f().length||a.push(K(`p`,`py-1 pl-5 pr-3 text-[12.5px] text-neutral-400`,`none`));for(let e of f()){let n={type:`bundled`,name:e.name};a.push(M(e.name,t(n),!1,()=>i(n),0,e.enabled?j():void 0))}if(!l){let e={type:`tools`},n=m().filter(e=>e.enabled).length;a.push(M(`command-line tools`,t(e),!1,()=>i(e),0,n?j():void 0))}}for(let n of[`extensions`,`skills`]){a.push(A(`${n} (read-only)`));let r=e.resources[n];r.length||a.push(K(`p`,`py-1 pl-5 pr-3 text-[12.5px] text-neutral-400`,`none`)),a.push(...P(n,N(r),``,0,t,i))}_.replaceChildren(...a)}function re(){y.replaceChildren(K(`p`,`px-4 py-3 text-[13px] text-neutral-400`,`Select a file to edit, or browse extensions and skills.`))}function ie(e){y.replaceChildren(K(`p`,`px-4 py-3 text-[13px] text-red-600`,e))}let F=(e,...t)=>K(`div`,`flex flex-none items-center gap-3 border-b border-neutral-200 px-4 py-2`,K(`span`,`font-mono text-[12.5px] text-neutral-500`,e),...t);async function I(e){let t=++a,n=await E(`/api/config/files/${encodeURIComponent(e)}${x()}`,`failed to load ${e}`,{cache:`no-store`});if(!n.ok){t===a&&ie(n.error);return}if(t!==a)return;let{content:r}=n.value,i=r,o=K(`span`,`text-[11.5px] text-neutral-400`,``),s=K(`button`,`btn btn-primary ml-auto text-[12.5px]`,`Save`),c=document.createElement(`textarea`);c.className=`block min-h-0 flex-1 resize-none bg-white p-4 font-mono text-[13px] leading-relaxed focus:outline-none`,c.spellcheck=!1,c.value=r;let l=async()=>{if(s.disabled)return;let t=c.value;s.disabled=!0,Y(o,`saving`,`saving…`);try{let n=await w(`/api/config/files/${encodeURIComponent(e)}${x()}`,{content:t,expected:i},`PUT`);if(!n.ok)return Y(o,`failed`,await T(n,`save failed`));let r=await n.json();i=r.content,c.value===t?(c.value=r.content,Y(o,`saved`,`saved — applies to new sessions`)):Y(o,`idle`,`saved; newer changes are unsaved`)}catch(e){Y(o,`failed`,`save failed: ${String(e)}`)}finally{s.disabled=!1}};s.onclick=()=>void l(),c.onkeydown=e=>{(e.metaKey||e.ctrlKey)&&e.key===`s`&&(e.preventDefault(),l())},c.oninput=()=>{Y(o,`idle`,`unsaved changes`)},y.replaceChildren(F(e,o,s),c),c.focus()}function ae(e){if(!u)return null;let t=K(`a`,`text-indigo-600 hover:underline`,e);return t.href=`#/tasks/${encodeURIComponent(u)}`,t}let L=()=>{let e=K(`a`,`text-indigo-600 hover:underline`,`ubix`);return e.href=`https://github.com/timqi/ubix`,e.target=`_blank`,e.rel=`noreferrer`,e};function oe(e){if(e.source!==`binary`)return``;let{spec:t,error:n,installed:r,version:i,path:a}=e.binary;return n?`${t} — ${n}`:r?`${t} — ${i??`unknown version`} at ${a??`an unknown path`}`:`${t} — not installed`}function se(e,t){a++;let n=c.find(t=>t.name===e&&t.kind===`extension`);if(!n)return ie(`unknown extension: ${e}`);let r=K(`span`,`text-[11.5px] text-neutral-400`,``);t&&Y(r,t.state,t.text);let i=ae(`every run of the update task`);y.replaceChildren(F(n.name,K(`span`,`ml-auto text-[11px] uppercase tracking-wide text-neutral-400`,n.source===`binary`?`installed by Pier`:`ships with Pier`)),K(`div`,`flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto p-4`,K(`p`,`max-w-2xl text-[13px] leading-relaxed text-neutral-600`,n.summary),K(`dl`,`flex max-w-2xl flex-col gap-1.5`,...(n.source===`bundled`?n.adds:[]).flatMap(e=>[K(`dt`,`font-mono text-[12px] text-neutral-700`,e.name),K(`dd`,`text-[12px] leading-snug text-neutral-500`,`needs ${e.needs}`)]),...n.source===`binary`?[K(`dt`,`font-mono text-[12px] text-neutral-700`,`binary`),K(`dd`,`font-mono text-[12px] leading-snug ${n.binary.error?`text-red-600`:`text-neutral-500`}`,oe(n))]:[]),yr(`Enabled`,n.source===`binary`?`Installed into Pier's own bin directory, first on the PATH every session, task and terminal inherits; it registers its own Pi extension. Switching it off uninstalls both.`:`Loaded from inside Pier — nothing is installed and no update touches your own extensions. A session mid-turn keeps the tools it started with; the next message picks this up.`,n.enabled,t=>void le(n.name,t,t=>se(e,t))),K(`p`,`max-w-2xl text-[12px] leading-snug text-neutral-400`,...n.source===`binary`?i?[`A daily task installs and updates it — its history is `,i,`.`]:[`Its installs run as the daily update task.`]:[`An extension of your own that registers the same tool wins: this copy stands down and says so in the log.`]),r))}function ce(e,t={name:``,toml:``}){a++;let n=K(`span`,`text-[11.5px] text-neutral-400`,``);e&&Y(n,e.state,e.text);let r=m(),i=ae(`the update task`),o=e=>{let t=K(`div`,`flex min-w-0 flex-1 flex-col gap-0.5`,K(`span`,`flex items-center gap-2 text-[13px] text-neutral-700`,K(`span`,`font-mono`,e.name),...p(e)?[xr(`yours`,`bg-neutral-50 text-neutral-500 ring-neutral-200`)]:[]),K(`span`,`text-[11.5px] leading-snug text-neutral-400`,e.summary||oe(e)),...e.summary?[K(`span`,`font-mono text-[11px] leading-snug ${e.source===`binary`&&e.binary.error?`text-red-600`:`text-neutral-400`}`,oe(e))]:[]),n=yr(``,``,e.enabled,t=>void le(e.name,t,e=>ce(e))),r=K(`button`,`btn text-[12px] text-neutral-500 hover:text-red-600`,`Remove`);return r.onclick=()=>{r.disabled=!0;let t=kd(e,d);D(t.body,t.saved).then(e=>ce(e))},K(`div`,`flex max-w-2xl items-start gap-3 border-b border-neutral-100 py-2.5 last:border-0`,t,...p(e)?[r]:[],n)},s={...t},c=K(`span`,`font-mono text-[12px] text-neutral-500`,`[tools.<name>]`),u=hr(s.name,`claude`,e=>{s.name=e,c.textContent=`[tools.${e.trim()||`<name>`}]`},!0),f=document.createElement(`textarea`);f.className=`${mr} h-24 resize-y font-mono leading-snug`,f.spellcheck=!1,f.value=s.toml,f.placeholder=`spec = "github:owner/repo"
86
86
  exe = "tool"`,f.oninput=()=>s.toml=f.value;let h=K(`button`,`btn btn-primary text-[12.5px]`,`Add`);h.onclick=()=>{let e={name:s.name.trim(),toml:s.toml.trim()};if(!e.name||!e.toml)return Y(n,`failed`,`A custom tool needs a name and a block with a spec line.`);h.disabled=!0,D({customTools:[...d,e],tool:{name:e.name,on:!0}},`Added ${e.name} — installing now.`).then(e=>ce(e,e.state===`failed`?s:void 0))},y.replaceChildren(F(`command-line tools`,K(`span`,`ml-auto text-[11px] uppercase tracking-wide text-neutral-400`,`installed by Pier`)),K(`div`,`flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto p-4`,K(`p`,`max-w-2xl text-[12.5px] leading-relaxed text-neutral-500`,`Pier writes no downloader: `,L(),` does the work — a declarative installer that resolves a spec like `,K(`span`,`font-mono text-[11.5px]`,`github:owner/repo`),` to the right release asset for this machine, verifies it, and upgrades in place. Pier bootstraps it, generates its config from the switches below, and keeps its files under Pier's own directory — your own ubix setup is untouched.`),l?K(`p`,`max-w-2xl text-[12.5px] text-red-600`,l):K(`div`,`flex max-w-2xl flex-col`,...r.map(o)),K(`div`,`flex max-w-2xl flex-col gap-2 border-t border-neutral-200 pt-4`,K(`span`,`text-[12.5px] font-medium text-neutral-600`,`Add one of your own`),J(`Name`,u),J(`The block Pier writes under the header`,f,{hint:`A line that opens a section of its own is refused, because it could rewrite the rest of the file.`}),K(`div`,`flex items-center gap-3`,c,h)),K(`p`,`max-w-2xl text-[12px] leading-snug text-neutral-400`,...i?[`Installs and daily updates run as `,i,` — output, failures and all.`]:[`Switching one on creates the daily task that installs it and keeps it current.`]),n))}async function le(e,t,n){let r=c.find(t=>t.name===e);n(await D(O(e,t),r?.source===`binary`?t?`Saved — installing now; watch the run.`:`Saved — uninstalling in the next run.`:`Saved — sessions take it on their next message.`))}async function ue(e,t){let n=++a,r=await E(`/api/config/resource${x(`&kind=${e}&name=${encodeURIComponent(t)}`)}`,`failed to load ${t}`,{cache:`no-store`});if(!r.ok){n===a&&ie(r.error);return}if(n!==a)return;let{content:i}=r.value,o=i.split(`
87
- `);o.at(-1)===``&&o.pop(),y.replaceChildren(F(t,K(`span`,`ml-auto text-[11px] uppercase tracking-wide text-neutral-400`,`read-only`)),K(`div`,`min-h-0 flex-1 overflow-auto`,Ku(Gu(o),Gi(t))))}function de(){h.replaceChildren(new Option(o?`Global (${o})`:`Global`,`global`),...t().map(e=>new Option(`${$n(e)} — ${e}`,e))),[...h.options].some(e=>e.value===n)||(n=`global`),h.value=n}return nr(e,()=>{de(),k()})}var Od=e=>`${e.provider}/${e.id}`,kd=[`hardest reasoning — architecture, gnarly debugging`,`long autonomous implementation runs`,`balanced default — implementation, review`,`cheap & fast — listings, extraction, simple checks`,`cross-vendor second opinion`];function Ad(){let e=[],t=[],n=!1,r=K(`span`,`text-[11.5px]`,``),i=q(`Save menu`,!0),a=K(`div`,`flex min-w-0 flex-col gap-2`),o=K(`div`,`flex items-center gap-2`),s=K(`div`,`mx-auto flex w-full max-w-3xl min-w-0 flex-col gap-6`);function c(){n=!0,Y(r,`idle`,`unsaved changes`)}function l(t){let n=hr(t.note??``);n.classList.remove(`w-full`),n.classList.add(`min-w-0`,`flex-1`),n.placeholder=`why this one — pick a preset or write your own`,n.setAttribute(`list`,`model-menu-notes`),n.oninput=()=>{t.note=n.value,c()};let r=gr([[`thinking: model default`,``],...Qi.map(e=>[`thinking: ${f(e)}`,e])],t.thinking??``);r.classList.replace(`w-full`,`w-44`),r.classList.add(`flex-none`),r.onchange=()=>{r.value?t.thinking=r.value:delete t.thinking,c()};let i=q(`Remove`);i.classList.add(`flex-none`),i.onclick=()=>{e=e.filter(e=>e!==t),c(),d()};let a=K(`span`,`w-52 flex-none truncate font-mono text-[12px] text-neutral-700`,Od(t));return a.title=Od(t),K(`div`,`flex min-w-0 items-center gap-2 rounded-lg border border-neutral-200 bg-white px-3 py-2 shadow-2xs max-md:flex-wrap`,a,r,n,i)}function u(){let n=t.filter(t=>!e.some(e=>Od(e)===Od(t))),r=gr(n.map(e=>[Od(e),Od(e)]),n[0]?Od(n[0]):``);r.classList.replace(`w-full`,`flex-1`),r.classList.add(`min-w-0`);let i=q(`+ Pin model`);i.classList.add(`flex-none`,`whitespace-nowrap`),i.disabled=n.length===0,i.onclick=()=>{let t=n.find(e=>Od(e)===r.value);t&&(e.push({...t}),c(),d())},o.replaceChildren(r,i)}function d(){a.replaceChildren(...e.length?e.map(l):[xr(`Nothing pinned — every picker shows the curated catalog as is.`)]),u()}async function p(){Y(r,`saving`,`saving…`);let t=await w(`/api/settings`,{modelMenu:e.map(({provider:e,id:t,thinking:n,note:r})=>({provider:e,id:t,...n?{thinking:n}:{},...r?.trim()?{note:r.trim()}:{}}))},`PUT`);if(!t.ok)return Y(r,`failed`,await T(t,`Could not save`));e=(await t.json()).modelMenu,n=!1,Y(r,`saved`,`Saved — agents see it on their next models call.`),d()}i.onclick=()=>void p();function m(){n||(async()=>{let[n,i]=await Promise.all([E(`/api/settings`,`Could not load the menu`),E(`/api/models`,`Could not load the model catalog`)]);if(!n.ok)return Y(r,`failed`,n.error);e=n.value.modelMenu,t=i.ok?i.value:[],r.textContent=``,d()})()}let h=K(`datalist`,``);return h.id=`model-menu-notes`,h.append(...kd.map(e=>new Option(e))),s.append(fr(`Model menu`,`Which few models this deployment favors, each with a usual reasoning level and one line of intent. Pinned entries lead every model picker, and agents delegating work match your notes against the task instead of guessing ids.`,J(`Pinned models`,a,{hint:`The note is what an agent matches a task against — say when to reach for it, not what it is.`}),J(`Add`,o,{hint:`The list is the live catalog — only models that exist right now can be pinned.`}),K(`div`,`flex items-center gap-3`,i,r),h)),{el:s,load:m}}var jd=(e,t)=>{let n;try{n=new URL(e)}catch{return null}if(n.protocol!==`http:`&&n.protocol!==`https:`)return null;let r=K(`a`,`text-indigo-600 hover:underline`,t);return r.href=n.href,r.target=`_blank`,r.rel=`noreferrer`,r};function Md(e,t,n,r){let i=document.createElement(`dialog`);i.className=`m-auto w-[min(32rem,92vw)] rounded-lg border border-neutral-200 bg-white p-0 shadow-xl backdrop:bg-black/30`;let a=K(`div`,`flex flex-col gap-2`),o=K(`div`,`flex flex-col gap-2`),s=K(`p`,`text-[12.5px] text-neutral-400`,`Starting…`),c=q(`Cancel`),l=(e,t)=>{s.className=`text-[12.5px] ${yr[e]}`,s.textContent=t};i.append(K(`div`,`border-b border-neutral-200 px-4 py-2.5 text-[14px] font-semibold`,t),K(`div`,`flex max-h-[65vh] flex-col gap-3 overflow-y-auto px-4 py-3`,a,o,s),K(`div`,`flex justify-end border-t border-neutral-200 px-4 py-2.5`,c)),document.body.append(i),i.showModal();let u=e.id,d=e.state,f,p,m=new Set,h=!1,g=!1,_=async e=>{if(!g){if(e&&d===`running`){g=!0,c.disabled=!0;try{let e=await w(`/api/providers/flows/${u}/cancel`,{});if(!e.ok&&e.status!==404){l(`failed`,await T(e,`Could not cancel authentication flow`));return}}catch(e){l(`failed`,`Could not cancel authentication flow: ${String(e)}`);return}finally{g=!1,c.disabled=!1}}clearTimeout(f),i.close()}};c.onclick=()=>void _(!0),i.oncancel=e=>{e.preventDefault(),_(!0)},i.onclose=()=>{h=!0,clearTimeout(f),i.remove()};let v=e=>{if(e.type===`auth_url`){let t=K(`div`,`flex flex-col gap-1 text-[12.5px] text-neutral-600`);return e.instructions&&t.append(K(`p`,``,e.instructions)),t.append(jd(e.url,`Open authorization page`)??K(`span`,`text-red-600`,`Invalid authorization URL`)),t}if(e.type===`device_code`){let t=K(`div`,`flex flex-col gap-2 text-[12.5px] text-neutral-600`);return t.append(K(`div`,`flex items-center gap-2`,K(`code`,`font-mono text-[17px] font-semibold text-neutral-800`,e.userCode),or(`btn text-[11px]`,()=>e.userCode))),t.append(jd(e.verificationUri,`Open verification page`)??K(`span`,`text-red-600`,`Invalid verification URL`)),t}let t=K(`div`,`text-[12.5px] text-neutral-600`,e.message);if(e.type===`info`)for(let n of e.links??[]){let e=jd(n.url,n.label??n.url);e&&t.append(` `,e)}return t},y=(e,t)=>{p=t.id;let n;if(t.type===`select`){let e=document.createElement(`select`);e.append(...t.options.map(e=>new Option(e.description?`${e.label} — ${e.description}`:e.label,e.id))),n=e}else{let e=hr(``,t.type===`secret`?`password`:`text`);e.placeholder=t.placeholder??``,e.autocomplete=`off`,n=e}n.className=`${n.tagName===`SELECT`?`select `:``}w-full rounded-lg border border-neutral-300 bg-white px-2.5 py-1.5 text-[12.5px] focus:border-indigo-400 focus:outline-none`;let r=q(`Continue`,!0);r.type=`submit`;let i=K(`form`,`flex flex-col gap-2`,K(`label`,`text-[12.5px] font-medium text-neutral-700`,t.message),n,K(`div`,`flex justify-end`,r));i.onsubmit=i=>{i.preventDefault(),r.disabled=!0,(async()=>{try{let r=await w(`/api/providers/flows/${e.id}/respond`,{promptId:t.id,value:n.value});if(h)return;if(!r.ok){l(`failed`,await T(r,`Could not submit response`));return}m.add(t.id),p=void 0,o.replaceChildren(),l(`saving`,`Waiting for provider…`)}catch(e){h||l(`failed`,`Could not submit response: ${String(e)}`)}finally{r.disabled=!1}})()},o.replaceChildren(i),n.focus()},b=e=>{d=e.state,a.replaceChildren(...e.events.map(v));let t=e.prompt&&!m.has(e.prompt.id)?e.prompt:void 0;if(t?.id!==p&&(t?y(e,t):(p=void 0,o.replaceChildren())),e.state===`running`){l(`saving`,t?`Waiting for your response.`:`Waiting for provider…`);return}clearTimeout(f),o.replaceChildren(),e.state===`succeeded`?l(`saved`,`${n} configured.`):l(`failed`,e.state===`cancelled`?`Cancelled.`:e.error??`Authentication failed.`),c.textContent=`Close`,c.onclick=()=>void _(!1),e.state===`succeeded`&&r()},x=async()=>{if(!(h||d!==`running`))try{let e=await fetch(`/api/providers/flows/${u}`,{cache:`no-store`});if(h)return;if(!e.ok){l(`failed`,await T(e,`Authentication status unavailable`)),e.status===404?d=`failed`:f=setTimeout(()=>void x(),1e3);return}b(await e.json()),d===`running`&&(f=setTimeout(()=>void x(),500))}catch(e){if(h)return;l(`failed`,`Authentication status unavailable: ${String(e)}`),f=setTimeout(()=>void x(),1e3)}};b(e),d===`running`&&(f=setTimeout(()=>void x(),500))}var Nd=[`anthropic`,`openai`,`openai-codex`,`google`,`openrouter`,`deepseek`],Pd=[[`OpenAI Chat Completions`,`openai-completions`],[`OpenAI Responses`,`openai-responses`],[`Anthropic Messages`,`anthropic-messages`],[`Google Generative AI`,`google-generative-ai`]],Fd=`__custom__`;async function Id(e){let t=q(`Add provider`,!0);t.classList.add(`ml-auto`);let n=K(`div`,`flex flex-none items-center gap-3 rounded-t-xl border-b border-neutral-200/70 bg-neutral-50/70 px-4 py-2`,K(`h2`,`text-[13px] font-semibold text-neutral-700`,`Providers`),t),r=K(`div`,`min-h-0 flex-1 overflow-y-auto`);e.replaceChildren(n,r);let i=[],a=``,o=async()=>{r.replaceChildren(K(`p`,`px-4 py-3 text-[13px] text-neutral-400`,`Loading…`));try{let[e,n]=await Promise.all([E(`/api/providers`,`Could not load providers`,{cache:`no-store`}),E(`/api/models`,`the model catalog could not be read`,{cache:`no-store`})]);if(i=n.ok?n.value:[],a=n.ok?``:n.error,!e.ok){r.replaceChildren(xr(e.error));return}let s=e.value;t.onclick=()=>Rd(s,void 0,o),d(s)}catch(e){r.replaceChildren(xr(`Could not load providers: ${String(e)}`))}},s=async e=>{if(window.confirm(`Remove the stored credential for ${e.name}?`))try{let t=await w(`/api/providers/${encodeURIComponent(e.id)}/logout`,{});if(!t.ok){window.alert(await T(t,`Could not remove credential`));return}await o()}catch(e){window.alert(`Could not remove credential: ${String(e)}`)}},c=e=>[...new Set([...(e.models??[]).map(e=>e.id),...i.filter(t=>t.provider===e.id).map(e=>e.id)])],l=(e,t)=>K(`div`,`flex flex-col gap-1`,K(`span`,`text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,e),K(`pre`,`max-h-56 overflow-auto whitespace-pre-wrap break-all rounded-md bg-neutral-50 p-2 font-mono text-[11.5px] leading-relaxed text-neutral-600`,t)),u=async(e,t)=>{try{let n=await w(`/api/providers/${encodeURIComponent(e)}/check`,{model:t});return n.ok?await n.json():await T(n,`Could not test`)}catch(e){return`Could not test: ${String(e)}`}},d=e=>{let t=e.filter(e=>e.configured);if(!t.length){r.replaceChildren(xr(`No providers configured.`));return}r.replaceChildren(...t.map(t=>{let n=K(`div`,`min-w-0 flex-1`,K(`div`,`truncate text-[13px] font-medium text-neutral-700`,t.name),K(`div`,`truncate font-mono text-[11px] text-neutral-400`,t.id)),r=t.stored===`api_key`?`API key`:t.stored===`oauth`?`OAuth`:t.source??`configured`,i=t.endpoint??`Default endpoint`,d=K(`div`,`flex min-w-32 flex-col items-start gap-1`,br(`configured`,`bg-emerald-50 text-emerald-700 ring-emerald-200`),K(`span`,`max-w-48 truncate text-[11px] text-neutral-500`,r),K(`span`,`max-w-48 truncate text-[11px] text-neutral-400`,i));d.title=i;let f=K(`span`,`text-[11.5px]`,``),p=K(`div`,`hidden flex-col gap-2 px-4 pb-3`,f),m=K(`div`,`flex flex-wrap justify-end gap-1.5`),h=c(t);if(!h.length)Y(f,`idle`,a||`No models to test: none are configured here.`),p.classList.replace(`hidden`,`flex`);else{let e=gr([[`Model to test…`,``],...h.map(e=>[e,e])],``);e.classList.add(`max-w-52`,`text-[12px]`);let n=q(`Test`);n.disabled=!0,e.onchange=()=>n.disabled=!e.value,n.onclick=()=>{let r=e.value;n.disabled=!0,p.replaceChildren(f),p.classList.replace(`hidden`,`flex`),Y(f,`saving`,`asking ${r}…`),u(t.id,r).then(e=>{if(n.disabled=!1,typeof e==`string`)return Y(f,`failed`,e);Y(f,e.ok?`saved`:`failed`,`${e.model} ${e.ok?`answered`:`did not answer`} in ${e.ms} ms`),p.append(l(`sent`,e.request||`(the request was never made)`),l(e.ok?`answered`:`replied`,e.response))})},m.append(e,n)}if(t.builtin||t.api&&t.models){let n=q(`Edit`);n.onclick=()=>Rd(e,t,o),m.append(n)}if(t.stored){let e=q(`Remove credential`);e.onclick=()=>void s(t),m.append(e)}return K(`div`,`border-b border-neutral-100`,K(`div`,`grid grid-cols-[minmax(8rem,1fr)_minmax(8rem,auto)_minmax(9rem,auto)] items-center gap-3 px-4 py-2.5 max-sm:grid-cols-[1fr_auto]`,n,d,m),p)}))};await o()}function Ld(e,t){let n=t.filter(e=>!e.configured&&e.methods.length&&(e.builtin||e.api!==void 0&&e.models!==void 0)),r=(t,n)=>{if(!n.length)return;let r=document.createElement(`optgroup`);r.label=t,r.append(...n.map(e=>new Option(e.name,e.id))),e.append(r)};r(`Common`,Nd.flatMap(e=>n.filter(t=>t.id===e))),r(`More providers`,n.filter(e=>e.builtin&&!Nd.includes(e.id)).sort((e,t)=>e.name.localeCompare(t.name))),r(`Custom providers`,n.filter(e=>!e.builtin).sort((e,t)=>e.name.localeCompare(t.name))),e.append(new Option(`Custom provider…`,Fd))}function Rd(e,t,n){let r=document.createElement(`dialog`);r.className=`m-auto w-[min(32rem,92vw)] rounded-lg border border-neutral-200 bg-white p-0 shadow-xl backdrop:bg-black/30`;let i=document.createElement(`select`);i.className=`${pr} select`,t||Ld(i,e);let a=hr(),o=hr(),s=hr(),c=document.createElement(`select`);c.className=`${pr} select`,c.append(...Pd.map(([e,t])=>new Option(e,t)));let l=_r(``,4);l.placeholder=`model-id
88
- another-model-id`;let u=document.createElement(`input`);u.type=`checkbox`;let d=document.createElement(`select`);d.className=`${pr} select`;let f=K(`div`,`flex flex-col gap-4`),p=K(`span`,`text-[11.5px] text-red-600`,``),m=q(`Cancel`),h=q(t?`Save`:`Add`,!0);h.type=`submit`;let g=()=>t??e.find(e=>e.id===i.value),_=()=>{let e=g(),n=e?!e.builtin:i.value===Fd;a.value=e?.id??``,a.disabled=t!==void 0,o.value=e?.name??``,s.value=e?.endpoint??``,c.value=e?.api??`openai-completions`,l.value=e?.models?.map(e=>e.id).join(`
89
- `)??``;let r=e?.models?.map(e=>e.reasoning)??[];u.checked=r.length?r.every(Boolean):!e,u.indeterminate=r.some(Boolean)&&!r.every(Boolean);let p=[];e?.configured&&p.push(new Option(`Keep current authentication`,``));let m=e?.methods??[{type:`api_key`,name:`API key`}];for(let t of m.filter(t=>e?.builtin!==!1||t.type===`api_key`))p.push(new Option(t.name,t.type));d.replaceChildren(...p);let h=[];t||h.push(J(`Provider`,i)),n?h.push(J(`Provider ID`,a),J(`Display name`,o),J(`Endpoint`,s),J(`API format`,c),J(`Models`,l),J(`Model capabilities`,K(`label`,`flex items-center gap-2 text-[12.5px] text-neutral-600`,u,K(`span`,``,`Reasoning`)))):(s.placeholder=`Provider default`,h.push(J(`Endpoint`,s))),h.push(J(`Authentication`,d)),f.replaceChildren(...h)};i.onchange=_,_();let v=K(`form`,`flex flex-col gap-4 px-4 py-3`,f,K(`div`,`flex items-center justify-end gap-2`,p,m,h)),y=!1;m.onclick=()=>{y||r.close()},r.oncancel=e=>{y&&e.preventDefault()},v.onsubmit=e=>{if(e.preventDefault(),y)return;p.textContent=``;let t=g(),f=(t?!t.builtin:i.value===Fd)?{kind:`custom`,id:a.value.trim(),...o.value.trim()?{name:o.value.trim()}:{},endpoint:s.value.trim(),api:c.value,models:[...new Set(l.value.split(`
90
- `).map(e=>e.trim()).filter(Boolean))].map(e=>({id:e,reasoning:u.indeterminate?t?.models?.find(t=>t.id===e)?.reasoning??u.checked:u.checked}))}:{kind:`builtin`,id:t.id,...s.value.trim()?{endpoint:s.value.trim()}:{}},_=d.value||null;y=!0,h.disabled=!0,m.disabled=!0,(async()=>{try{let e=await w(`/api/providers/setup`,{setup:f,authType:_});if(!e.ok){p.textContent=await T(e,`Could not configure provider`);return}if(r.close(),e.status===202){let t=d.selectedOptions[0]?.textContent??`Authentication`;Md(await e.json(),f.id,t,()=>void n())}else await n()}catch(e){p.textContent=`Could not configure provider: ${String(e)}`}finally{y=!1,h.disabled=!1,m.disabled=!1}})()},r.append(K(`div`,`border-b border-neutral-200 px-4 py-2.5 text-[14px] font-semibold`,t?`Edit ${t.name}`:`Add provider`),v),r.onclose=()=>r.remove(),document.body.append(r),r.showModal(),(t?s:i).focus()}var zd=[[`models`,`Models`],[`files`,`Agent`],[`channels`,`Channels`],[`instance`,`Instance`],[`security`,`Security`]],Bd=e=>zd.some(([t])=>t===e),Vd=`pier.settingsTopic`;function Hd(e,t,n){let r=localStorage.getItem(Vd)??void 0,i=Bd(r)?r:`models`,a=K(`header`,`flex h-10 flex-none items-center gap-3 border-b border-neutral-200 bg-white px-4 max-md:hidden`,K(`span`,`font-medium`,`Settings`)),o=K(`div`,`tabstrip bg-white`);function s(){o.replaceChildren(...zd.map(([e,t])=>dr(t,e===i,()=>n(e))))}let c=hr();c.placeholder=`https://pier.example.com`,c.autocomplete=`off`;let l=K(`span`,`text-[11.5px]`,``),u=q(`Save`,!0);async function d(){Y(l,`saving`,`saving…`);let e=await w(`/api/settings`,{publicUrl:c.value},`PUT`);if(!e.ok)return Y(l,`failed`,await T(e,`Could not save`));let{publicUrl:t}=await e.json();c.value=t,Y(l,`saved`,t?`Saved — boards link as ${t}/p/<slug>-<token>/`:`Cleared.`)}u.onclick=()=>void d(),c.onkeydown=e=>{e.key===`Enter`&&d()};let f=fr(`Public URL`,`Where this Pier is reached from outside — the proxy's address, not the port it listens on.`,J(`Base URL`,c,{hint:`Agents read it to hand you a clickable board link instead of a path. Nothing here changes what Pier serves; leave it empty if Pier is only reachable locally.`}),K(`div`,`flex items-center gap-3`,u,l)),p=hr(``,`password`),m=hr(``,`password`),h=hr(``,`password`);for(let e of[p,m,h])e.autocomplete=`off`;let g=K(`span`,`text-[11.5px]`,``),_=q(`Change password`,!0);async function v(){if(m.value!==h.value)return Y(g,`failed`,`The two new passwords differ.`);Y(g,`saving`,`changing…`);let e=await w(`/api/password`,{current:p.value,next:m.value});if(!e.ok)return Y(g,`failed`,await T(e,`Could not change the password`));for(let e of[p,m,h])e.value=``;Y(g,`saved`,`Changed. Sign in again with the new password.`),location.href=`/login`}_.onclick=()=>void v(),h.onkeydown=e=>{e.key===`Enter`&&v()};let y=fr(`Password`,`One shared password guards every page and API route. Changing it signs out every signed-in browser, this one included.`,J(`Current password`,p),J(`New password`,m,{hint:`At least 10 characters.`}),J(`Repeat new password`,h),K(`div`,`flex items-center gap-3`,_,g)),b=q(`Reload`,!0),x=K(`span`,`text-[11.5px]`,``);b.onclick=()=>{b.disabled=!0,Y(x,`saving`,`reloading…`),(async()=>{let e=await w(`/api/reload`,{});if(b.disabled=!1,!e.ok)return Y(x,`failed`,await T(e,`Could not reload`));let{recycled:t,busy:n}=await e.json(),r=t?`Recycled ${t} session(s).`:`No idle session needed it.`,i=n?` ${n} still mid-turn — they take it when the turn ends.`:``;Y(x,n?`idle`:`saved`,r+i)})()};let S=fr(`Reload configuration`,`Re-reads channel configuration and lets go of idle sessions, so the next message opens them with the current agent files, skills and credentials. Saving here does this on its own — use it after something outside the Console changed a file.`,K(`div`,`flex items-center gap-3`,b,x)),C=q(`Sign out`);C.onclick=()=>{w(`/logout`,{}).finally(()=>{location.href=`/login`})};let D=fr(`Sign out`,`Ends this browser's session. Others keep theirs — change the password to sign out everywhere.`,K(`div`,`flex items-center gap-3`,C)),O=K(`div`,`mx-auto flex max-w-2xl flex-col gap-6`,f,$s(),S,y,D),k=e=>K(`div`,`hidden min-h-0 flex-1 overflow-y-auto bg-neutral-50/60`,K(`div`,`px-4 py-5`,e)),A=Ad(),ee=K(`div`,`mx-auto flex w-full min-w-0 max-w-3xl flex-col rounded-xl border border-neutral-200 bg-white shadow-xs`),j=K(`section`,`hidden min-h-0 flex-1 flex-col`),M=wd(j),N=K(`section`,`hidden min-h-0 flex-1 flex-col`),te=Dd(N,t);function P(){g.textContent=``,(async()=>{let e=await E(`/api/settings`,`Could not load settings`);if(!e.ok)return Y(l,`failed`,e.error);c.value=e.value.publicUrl,l.textContent=``})()}let ne=K(`div`,`mx-auto flex max-w-2xl flex-col gap-6`);async function re(){let e=await E(`/api/secrets`,`Could not load key status`);if(!e.ok){ne.replaceChildren(xr(e.error));return}ie(e.value)}function ie(e,t){let n=e.state===`locked`,r=K(`span`,`text-[11.5px]`,``);t&&Y(r,`saved`,t);let i=K(`div`,`flex items-center gap-2`,br(e.state,n?`bg-red-50 text-red-700 ring-red-200`:`bg-emerald-50 text-emerald-700 ring-emerald-200`),K(`span`,`text-[12.5px] text-neutral-600`,n?`Stored credentials cannot be read until the key is unlocked.`:e.mode===`vt`?`Key mode: vt:// — unlocking takes one vt approval per process start.`:`Key mode: file — the key sits raw in master.key; switch to vt:// to require an approval.`)),a=K(`a`,`text-indigo-600 hover:underline`,`vt`);a.href=`https://github.com/timqi/vt`,a.target=`_blank`,a.rel=`noreferrer`;let o=[i,K(`p`,`text-[12px] leading-snug text-neutral-500`,a,` is a small local KMS: it keeps the key wrapped and releases it only on an explicit approval — Touch ID on a Mac, a phone passkey on a headless host. Pier only stores the vt:// record, so master.key alone unlocks nothing.`)];if(n){o.push(K(`p`,`text-[12.5px] leading-snug text-red-600`,e.reason??`No reason reported.`));let t=q(`Unlock`,!0);t.onclick=()=>{Y(r,`saving`,`unlocking… (vt mode waits on your approval)`),(async()=>{let e=await w(`/api/secrets/unlock`,{});if(!e.ok)return Y(r,`failed`,await T(e,`Could not unlock`));ie(await e.json(),`Unlocked — channels are starting.`)})()},o.push(K(`div`,`flex items-center gap-3`,t,r))}else{let t=async(e,t,n)=>{if(!window.confirm(t))return;Y(r,`saving`,e===`vt`?`rotating… (vt asks for an approval)`:`rotating…`);let i=await w(`/api/secrets/rotate`,{mode:e});if(!i.ok)return Y(r,`failed`,await T(i,`Could not rotate`));ie(await i.json(),n)},n=e.mode??`file`,i=q(`Rotate key`,!0);i.onclick=()=>void t(n,`Generate a new master key? Stored credentials stay valid; the old key stops working.`,`Rotated.`);let a=n===`vt`?`file`:`vt`,s=q(a===`vt`?`Switch to vt://`:`Switch to file`);s.onclick=()=>void t(a,a===`vt`?`Move the master key into vt? Every process start will then wait on a vt approval.`:`Store the master key raw in master.key? Anyone who can read the file can read every credential.`,a===`vt`?`Switched to vt:// mode.`:`Switched to file mode.`),o.push(K(`div`,`flex items-center gap-3`,i,s,r))}ne.replaceChildren(fr(`Master key`,`Seals every credential Pier stores (channel tokens, API keys). Rotating rewraps the key file; no stored data is rewritten.`,...o))}let F=k(O),I=k(K(`div`,`flex flex-col gap-6`,ee,A.el)),ae=k(ne),L=[[`instance`,F,P],[`models`,I,()=>{Id(ee),A.load()}],[`security`,ae,()=>void re()]];e.append(a,o,F,I,j,N,ae);function oe(e){Bd(e)&&(i=e),localStorage.setItem(Vd,i),s();for(let[e,t,n]of L){let r=e===i;t.classList.toggle(`hidden`,!r),r&&n()}i===`channels`?M.show():M.hide(),i===`files`?te.show():te.hide()}return nr(e,oe)}function Ud(e,t){let n=e.map(e=>[`${e.title??`Untitled`} · ${e.cwd}`,e.id]);return t&&!n.some(([,e])=>e===t)&&n.push([`Current session · ${t}`,t]),n}function Wd(e,t){let n=document.createElement(`dialog`);n.className=`m-auto w-[38.75rem] max-w-[94vw] rounded-lg border border-neutral-200 p-0 shadow-xl backdrop:bg-black/20`;let r=document.createElement(`form`);r.className=`flex max-h-[88vh] flex-col`;let i=K(`span`,`mr-auto text-[12px] text-red-600`),a=K(`header`,`flex h-11 flex-none items-center border-b border-neutral-200 px-4 font-medium`,t?`Edit task`:`New task`),o=K(`div`,`grid min-h-0 flex-1 grid-cols-2 gap-3 overflow-y-auto p-4`),s=hr(t?.name??``);s.required=!0;let c=hr(t?.description??``),l=hr(String(t?.timeoutSeconds??900),`number`);l.min=`1`,l.max=`86400`;let u=gr([[`Manual`,`manual`],[`Scheduled`,`cron`],[`Watch`,`watch`]],t?.trigger.type??`manual`),d=gr([[`Bash`,`bash`],[`Agent`,`agent`],[`Task`,`task`]],t?.action.type??`bash`),f=gr([[`No callback`,`none`],[`Invoking session`,`origin`],[`Specific session`,`session`]],t?.callback.type??`none`),p=t?.callback.type===`session`?t.callback.sessionId:null,m=gr(Ud(e.sessions(),p),p??``),h=J(`Callback session`,m);h.classList.toggle(`hidden`,f.value!==`session`),f.onchange=()=>h.classList.toggle(`hidden`,f.value!==`session`),o.append(J(`Name`,s),J(`Description`,c),J(`Trigger`,u),J(`Action`,d),J(`Callback`,f),h,J(`Timeout (seconds)`,l));let g=K(`div`,`col-span-2 grid grid-cols-2 gap-3 border-t border-neutral-200 pt-3`);o.append(g);let _=()=>{g.replaceChildren();let a,o,p,h,_,v;if(u.value===`cron`)a=hr(t?.trigger.type===`cron`?t.trigger.expression:`0 9 * * *`),o=hr(t?.trigger.type===`cron`?t.trigger.timezone:Intl.DateTimeFormat().resolvedOptions().timeZone),g.append(J(`Cron`,a),J(`Timezone`,o));else if(u.value===`watch`){p=_r(t?.trigger.type===`watch`?t.trigger.script:``,4),v=hr(t?.trigger.type===`watch`?t.trigger.cwd:e.sessions()[0]?.cwd??``),h=hr(String(t?.trigger.type===`watch`?t.trigger.intervalSeconds:60),`number`),_=gr([[`Continue after matches`,`repeat`],[`Stop after first match`,`once`]],t?.trigger.type===`watch`?t.trigger.mode:`repeat`);let n=J(`Probe script (0=match, 1=no match)`,p);n.classList.add(`col-span-2`),g.append(n,J(`Probe directory`,v),J(`Interval (seconds)`,h),J(`Mode`,_))}let y,b,x,S,C,w,T,E,D,O;if(d.value===`bash`){b=hr(t?.action.type===`bash`?t.action.cwd:e.sessions()[0]?.cwd??``),y=_r(t?.action.type===`bash`?t.action.script:``,6);let n=J(`Bash script`,y);n.classList.add(`col-span-2`),g.append(J(`Working directory`,b),K(`span`,``),n)}else if(d.value===`agent`){let n=e.sessions(),r=t?.action.type===`agent`?t.action:null,i=r?.session.mode===`reuse`?r.session.sessionId:``,a=Ud(n,i||null);x=gr([[`Reuse session`,`reuse`],[`Fresh child per run`,`fresh`],[`Fork caller context`,`fork`]],r?.session.mode??`fresh`),S=gr(a,i||a[0]?.[1]||``),C=hr((r?.session.mode===`fresh`||r?.session.mode===`fork`?r.session.cwd??``:``)||n[0]?.cwd||``),w=_r(r?.prompt??``,6),T=gr([[`Project default`,``],[`Off`,`off`],[`Low`,`low`],[`Medium`,`medium`],[`High`,`high`],[`Extra high`,`xhigh`]],r?.launch?.thinking??``),E=hr(r?.launch?.model?.provider??``),D=hr(r?.launch?.model?.id??``);let o=J(`Session`,S),s=J(`Child directory`,C),c=[J(`Thinking`,T),J(`Model provider (optional)`,E),J(`Model id (optional)`,D)],l=()=>{let e=x?.value===`reuse`;o.classList.toggle(`hidden`,!e),s.classList.toggle(`hidden`,e);for(let t of c)t.classList.toggle(`hidden`,e)};x.onchange=l,l();let u=J(`Prompt`,w);u.classList.add(`col-span-2`),g.append(J(`Session policy`,x),o,s,...c,u)}else O=gr(e.tasks().filter(e=>e.id!==t?.id&&!e.archived).map(e=>[e.name,e.id]),t?.action.type===`task`?t.action.taskId:``),g.append(J(`Target task`,O));r.onsubmit=r=>{r.preventDefault();let g=u.value===`manual`?{type:`manual`}:u.value===`cron`?{type:`cron`,expression:a.value,timezone:o.value}:{type:`watch`,script:p.value,cwd:v.value,intervalSeconds:Number(h.value),mode:_.value},k=d.value===`agent`&&x.value!==`reuse`?{...T.value?{thinking:T.value}:{},...E.value.trim()&&D.value.trim()?{model:{provider:E.value.trim(),id:D.value.trim()}}:{}}:void 0,A=d.value===`bash`?{type:`bash`,cwd:b.value,script:y.value}:d.value===`agent`?{type:`agent`,prompt:w.value,session:x.value===`reuse`?{mode:`reuse`,sessionId:S.value}:x.value===`fork`?{mode:`fork`,...C.value.trim()?{cwd:C.value.trim()}:{}}:{mode:`fresh`,cwd:C.value},...k?{launch:k}:{}}:{type:`task`,taskId:O.value},ee=f.value===`origin`?{type:`origin`}:f.value===`session`?{type:`session`,sessionId:m.value}:{type:`none`},j={name:s.value,description:c.value,trigger:g,action:A,callback:ee,timeoutSeconds:Number(l.value)};i.textContent=``,Gd(t?.id,j,n,i,e.onSaved)}};u.onchange=_,d.onchange=_,_();let v=q(`Cancel`);v.onclick=()=>n.close();let y=q(`Save`,!0);y.type=`submit`;let b=K(`footer`,`flex flex-none justify-end gap-2 border-t border-neutral-200 px-4 py-3`);b.append(i,v,y),r.append(a,o,b),n.append(r),n.addEventListener(`close`,()=>n.remove()),document.body.append(n),n.showModal(),s.focus()}async function Gd(e,t,n,r,i){let a=await w(e?`/api/tasks/${e}`:`/api/tasks`,t,e?`PATCH`:`POST`);if(!a.ok){r.textContent=(await a.json()).error??`Task save failed`;return}let o=await a.json(),s=`task`in o?o.task:o;n.close(),i(s.id)}var Kd=e=>e===null?`-`:new Date(e).toLocaleString(),qd=e=>e.startedAt===null?`-`:tr((e.finishedAt??Date.now())-e.startedAt);function Jd(e,t,n){let r=K(`div`,`divide-y divide-neutral-100`);for(let i of t){let t=K(`button`,`grid w-full cursor-pointer grid-cols-[7.5rem_1fr_7.5rem_6.25rem] gap-3 px-4 py-2.5 text-left text-[12.5px] hover:bg-neutral-50`);t.append(K(`span`,`font-medium`,i.state),K(`span`,`truncate text-neutral-500`,Kd(i.queuedAt)),K(`span`,`text-neutral-500`,i.triggerSource),K(`span`,`text-right text-neutral-500`,qd(i))),t.onclick=()=>void Yd(e,i.id,r,n),r.append(t)}t.length||r.append(K(`p`,`p-4 text-[13px] text-neutral-400`,`No runs yet.`)),e.replaceChildren(r)}async function Yd(e,t,n,r){let[i,a]=await Promise.all([E(`/api/task-runs/${t}`,`Could not load the run`),E(`/api/task-runs/${t}/messages`,`Could not load the run's messages`)]);if(!i.ok){e.replaceChildren(K(`p`,`p-4 text-[13px] text-red-600`,i.error));return}let o=i.value,s=a.ok?a.value:[],c=q(`Back to runs`);c.onclick=()=>e.replaceChildren(n);let l=K(`div`,`flex items-center gap-2 border-b border-neutral-200 px-4 py-2`);if(l.append(c,K(`span`,`font-mono text-[12px] text-neutral-400`,o.id)),o.targetSessionId){let e=q(`Open session`);e.classList.add(`ml-auto`),e.onclick=()=>r.openSession(o.targetSessionId),l.append(e)}if(o.state===`queued`||o.state===`running`){let e=q(`Steer`);e.onclick=()=>void Xd(O(`Steer subagent`,`/api/task-runs/${o.id}/steer`,{mode:`steer`,sourceSessionId:r.currentSessionId()},`Run control failed`),r);let t=q(`Stop`);t.onclick=()=>void r.mutate(`/api/task-runs/${o.id}/cancel`),l.append(e,t)}else if(o.targetSessionId){let e=q(`Continue`);e.onclick=()=>void Xd(O(`Continue subagent`,`/api/task-runs/${o.id}/resume`,{sourceSessionId:r.currentSessionId()},`Run control failed`),r),l.append(e)}let u=K(`div`,`min-h-0 flex-1 overflow-auto`),d=K(`pre`,`whitespace-pre-wrap break-words p-4 font-mono text-[12px]`,JSON.stringify(o,null,2));if(u.append(d),s.length){let e=K(`div`,`border-t border-neutral-200`);e.append(K(`div`,`px-4 py-2 text-[11px] font-semibold uppercase text-neutral-400`,`Messages`));for(let t of s){let n=K(`div`,`grid grid-cols-[6.25rem_6.25rem_1fr] gap-3 border-t border-neutral-100 px-4 py-2 text-[12px]`);n.append(K(`span`,`font-medium`,t.kind),K(`span`,`text-neutral-500`,t.state),K(`span`,`whitespace-pre-wrap`,t.content)),e.append(n)}u.append(e)}e.replaceChildren(l,u)}async function Xd(e,t){let n=await e;n.sent&&(n.error?t.onError(n.error):await t.reload())}var Zd=e=>e.trigger.type===`manual`?`Manual`:e.trigger.type===`cron`?`${e.trigger.expression} (${e.trigger.timezone})`:`Every ${e.trigger.intervalSeconds}s · ${e.trigger.mode}`,Qd=e=>e.action.type===`agent`?`Agent · ${e.action.session.mode}`:e.action.type===`bash`?`Bash`:`Task`;function $d(e,t,n,r,i,a){let o=[],s=[],c=null,l=`active`,u=``,d=C(async()=>{let e=l,t=await fetch(`/api/tasks?state=${e===`archived`?`archived`:`active`}${e===`subagent`?`&kind=subagent`:``}`);if(!t.ok)return u=``,f(`Failed to load tasks: ${t.status}`);let n=await t.text();e===l&&(e+n===u&&!c||(u=e+n,o=JSON.parse(n),s=e===`archived`||e===`subagent`?await p():o,e!==`active`&&e!==`archived`&&e!==`subagent`&&(o=o.filter(t=>t.trigger.type===e)),c?await x(c):y()))});function f(t){e.replaceChildren(K(`p`,`p-4 text-[13px] text-red-600`,t))}async function p(){let e=await fetch(`/api/tasks?state=active`);return e.ok?await e.json():s}let m={sessions:t,tasks:()=>s,onSaved:e=>{c=e,d()}},h={openSession:r,currentSessionId:i,mutate:D,onError:f,reload:d};function g(e,t){let n=K(`header`,`flex h-10 flex-none items-center gap-2 border-b border-neutral-200 px-4`);if(n.append(typeof e==`string`?K(`span`,`truncate font-medium max-md:hidden`,e):e),t.length){let e=K(`div`,`ml-auto flex items-center gap-2`);e.append(...t),n.append(e)}return n}function _(){return K(`div`,`tabstrip`,ur(`Sessions`,!1,()=>a(`sessions`)),ur(`Dependencies`,!1,()=>a(`dependencies`)),ur(`Tasks`,!0,v))}function v(){c=null,y()}function y(){let t=q(`New task`,!0);t.onclick=()=>void n().then(()=>Wd(m));let r=_(),i=K(`div`,`ml-auto flex flex-none items-center gap-1 pl-1 max-md:ml-0 max-md:w-full max-md:overflow-x-auto max-md:pl-0`);for(let[e,t]of[[`All`,`active`],[`Manual`,`manual`],[`Scheduled`,`cron`],[`Watching`,`watch`],[`Subagents`,`subagent`],[`Archived`,`archived`]])i.append(ur(e,l===t,()=>{l=t,c=null,d()}));r.append(i);let a=document.createElement(`table`);a.className=`w-full min-w-[52rem] table-fixed text-left text-[12.5px]`,a.innerHTML=`<thead class="sticky top-0 bg-neutral-50 text-[10.5px] uppercase text-neutral-400"><tr>
87
+ `);o.at(-1)===``&&o.pop(),y.replaceChildren(F(t,K(`span`,`ml-auto text-[11px] uppercase tracking-wide text-neutral-400`,`read-only`)),K(`div`,`min-h-0 flex-1 overflow-auto`,Yu(Ju(o),Ki(t))))}function de(){h.replaceChildren(new Option(o?`Global (${o})`:`Global`,`global`),...t().map(e=>new Option(`${$n(e)} — ${e}`,e))),[...h.options].some(e=>e.value===n)||(n=`global`),h.value=n}return rr(e,()=>{de(),k()})}var jd=e=>`${e.provider}/${e.id}`,Md=[`hardest reasoning — architecture, gnarly debugging`,`long autonomous implementation runs`,`balanced default — implementation, review`,`cheap & fast — listings, extraction, simple checks`,`cross-vendor second opinion`];function Nd(){let e=[],t=[],n=!1,r=K(`span`,`text-[11.5px]`,``),i=q(`Save menu`,!0),a=K(`div`,`flex min-w-0 flex-col gap-2`),o=K(`div`,`flex items-center gap-2`),s=K(`div`,`mx-auto flex w-full max-w-3xl min-w-0 flex-col gap-6`);function c(){n=!0,Y(r,`idle`,`unsaved changes`)}function l(t){let n=gr(t.note??``);n.classList.remove(`w-full`),n.classList.add(`min-w-0`,`flex-1`),n.placeholder=`why this one — pick a preset or write your own`,n.setAttribute(`list`,`model-menu-notes`),n.oninput=()=>{t.note=n.value,c()};let r=_r([[`thinking: model default`,``],...$i.map(e=>[`thinking: ${f(e)}`,e])],t.thinking??``);r.classList.replace(`w-full`,`w-44`),r.classList.add(`flex-none`),r.onchange=()=>{r.value?t.thinking=r.value:delete t.thinking,c()};let i=q(`Remove`);i.classList.add(`flex-none`),i.onclick=()=>{e=e.filter(e=>e!==t),c(),d()};let a=K(`span`,`w-52 flex-none truncate font-mono text-[12px] text-neutral-700`,jd(t));return a.title=jd(t),K(`div`,`flex min-w-0 items-center gap-2 rounded-lg border border-neutral-200 bg-white px-3 py-2 shadow-2xs max-md:flex-wrap`,a,r,n,i)}function u(){let n=t.filter(t=>!e.some(e=>jd(e)===jd(t))),r=_r(n.map(e=>[jd(e),jd(e)]),n[0]?jd(n[0]):``);r.classList.replace(`w-full`,`flex-1`),r.classList.add(`min-w-0`);let i=q(`+ Pin model`);i.classList.add(`flex-none`,`whitespace-nowrap`),i.disabled=n.length===0,i.onclick=()=>{let t=n.find(e=>jd(e)===r.value);t&&(e.push({...t}),c(),d())},o.replaceChildren(r,i)}function d(){a.replaceChildren(...e.length?e.map(l):[Sr(`Nothing pinned — every picker shows the curated catalog as is.`)]),u()}async function p(){Y(r,`saving`,`saving…`);let t=await w(`/api/settings`,{modelMenu:e.map(({provider:e,id:t,thinking:n,note:r})=>({provider:e,id:t,...n?{thinking:n}:{},...r?.trim()?{note:r.trim()}:{}}))},`PUT`);if(!t.ok)return Y(r,`failed`,await T(t,`Could not save`));e=(await t.json()).modelMenu,n=!1,Y(r,`saved`,`Saved — agents see it on their next models call.`),d()}i.onclick=()=>void p();function m(){n||(async()=>{let[n,i]=await Promise.all([E(`/api/settings`,`Could not load the menu`),E(`/api/models`,`Could not load the model catalog`)]);if(!n.ok)return Y(r,`failed`,n.error);e=n.value.modelMenu,t=i.ok?i.value:[],r.textContent=``,d()})()}let h=K(`datalist`,``);return h.id=`model-menu-notes`,h.append(...Md.map(e=>new Option(e))),s.append(pr(`Model menu`,`Which few models this deployment favors, each with a usual reasoning level and one line of intent. Pinned entries lead every model picker, and agents delegating work match your notes against the task instead of guessing ids.`,J(`Pinned models`,a,{hint:`The note is what an agent matches a task against — say when to reach for it, not what it is.`}),J(`Add`,o,{hint:`The list is the live catalog — only models that exist right now can be pinned.`}),K(`div`,`flex items-center gap-3`,i,r),h)),{el:s,load:m}}var Pd=(e,t)=>{let n;try{n=new URL(e)}catch{return null}if(n.protocol!==`http:`&&n.protocol!==`https:`)return null;let r=K(`a`,`text-indigo-600 hover:underline`,t);return r.href=n.href,r.target=`_blank`,r.rel=`noreferrer`,r};function Fd(e,t,n,r){let i=document.createElement(`dialog`);i.className=`m-auto w-[min(32rem,92vw)] rounded-lg border border-neutral-200 bg-white p-0 shadow-xl backdrop:bg-black/30`;let a=K(`div`,`flex flex-col gap-2`),o=K(`div`,`flex flex-col gap-2`),s=K(`p`,`text-[12.5px] text-neutral-400`,`Starting…`),c=q(`Cancel`),l=(e,t)=>{s.className=`text-[12.5px] ${br[e]}`,s.textContent=t};i.append(K(`div`,`border-b border-neutral-200 px-4 py-2.5 text-[14px] font-semibold`,t),K(`div`,`flex max-h-[65vh] flex-col gap-3 overflow-y-auto px-4 py-3`,a,o,s),K(`div`,`flex justify-end border-t border-neutral-200 px-4 py-2.5`,c)),document.body.append(i),i.showModal();let u=e.id,d=e.state,f,p,m=new Set,h=!1,g=!1,_=async e=>{if(!g){if(e&&d===`running`){g=!0,c.disabled=!0;try{let e=await w(`/api/providers/flows/${u}/cancel`,{});if(!e.ok&&e.status!==404){l(`failed`,await T(e,`Could not cancel authentication flow`));return}}catch(e){l(`failed`,`Could not cancel authentication flow: ${String(e)}`);return}finally{g=!1,c.disabled=!1}}clearTimeout(f),i.close()}};c.onclick=()=>void _(!0),i.oncancel=e=>{e.preventDefault(),_(!0)},i.onclose=()=>{h=!0,clearTimeout(f),i.remove()};let v=e=>{if(e.type===`auth_url`){let t=K(`div`,`flex flex-col gap-1 text-[12.5px] text-neutral-600`);return e.instructions&&t.append(K(`p`,``,e.instructions)),t.append(Pd(e.url,`Open authorization page`)??K(`span`,`text-red-600`,`Invalid authorization URL`)),t}if(e.type===`device_code`){let t=K(`div`,`flex flex-col gap-2 text-[12.5px] text-neutral-600`);return t.append(K(`div`,`flex items-center gap-2`,K(`code`,`font-mono text-[17px] font-semibold text-neutral-800`,e.userCode),sr(`btn text-[11px]`,()=>e.userCode))),t.append(Pd(e.verificationUri,`Open verification page`)??K(`span`,`text-red-600`,`Invalid verification URL`)),t}let t=K(`div`,`text-[12.5px] text-neutral-600`,e.message);if(e.type===`info`)for(let n of e.links??[]){let e=Pd(n.url,n.label??n.url);e&&t.append(` `,e)}return t},y=(e,t)=>{p=t.id;let n;if(t.type===`select`){let e=document.createElement(`select`);e.append(...t.options.map(e=>new Option(e.description?`${e.label} — ${e.description}`:e.label,e.id))),n=e}else{let e=gr(``,t.type===`secret`?`password`:`text`);e.placeholder=t.placeholder??``,e.autocomplete=`off`,n=e}n.className=`${n.tagName===`SELECT`?`select `:``}w-full rounded-lg border border-neutral-300 bg-white px-2.5 py-1.5 text-[12.5px] focus:border-indigo-400 focus:outline-none`;let r=q(`Continue`,!0);r.type=`submit`;let i=K(`form`,`flex flex-col gap-2`,K(`label`,`text-[12.5px] font-medium text-neutral-700`,t.message),n,K(`div`,`flex justify-end`,r));i.onsubmit=i=>{i.preventDefault(),r.disabled=!0,(async()=>{try{let r=await w(`/api/providers/flows/${e.id}/respond`,{promptId:t.id,value:n.value});if(h)return;if(!r.ok){l(`failed`,await T(r,`Could not submit response`));return}m.add(t.id),p=void 0,o.replaceChildren(),l(`saving`,`Waiting for provider…`)}catch(e){h||l(`failed`,`Could not submit response: ${String(e)}`)}finally{r.disabled=!1}})()},o.replaceChildren(i),n.focus()},b=e=>{d=e.state,a.replaceChildren(...e.events.map(v));let t=e.prompt&&!m.has(e.prompt.id)?e.prompt:void 0;if(t?.id!==p&&(t?y(e,t):(p=void 0,o.replaceChildren())),e.state===`running`){l(`saving`,t?`Waiting for your response.`:`Waiting for provider…`);return}clearTimeout(f),o.replaceChildren(),e.state===`succeeded`?l(`saved`,`${n} configured.`):l(`failed`,e.state===`cancelled`?`Cancelled.`:e.error??`Authentication failed.`),c.textContent=`Close`,c.onclick=()=>void _(!1),e.state===`succeeded`&&r()},x=async()=>{if(!(h||d!==`running`))try{let e=await fetch(`/api/providers/flows/${u}`,{cache:`no-store`});if(h)return;if(!e.ok){l(`failed`,await T(e,`Authentication status unavailable`)),e.status===404?d=`failed`:f=setTimeout(()=>void x(),1e3);return}b(await e.json()),d===`running`&&(f=setTimeout(()=>void x(),500))}catch(e){if(h)return;l(`failed`,`Authentication status unavailable: ${String(e)}`),f=setTimeout(()=>void x(),1e3)}};b(e),d===`running`&&(f=setTimeout(()=>void x(),500))}var Id=[`anthropic`,`openai`,`openai-codex`,`google`,`openrouter`,`deepseek`],Ld=[[`OpenAI Chat Completions`,`openai-completions`],[`OpenAI Responses`,`openai-responses`],[`Anthropic Messages`,`anthropic-messages`],[`Google Generative AI`,`google-generative-ai`]],Rd=`__custom__`;async function zd(e){let t=q(`Add provider`,!0);t.classList.add(`ml-auto`);let n=K(`div`,`flex flex-none items-center gap-3 rounded-t-xl border-b border-neutral-200/70 bg-neutral-50/70 px-4 py-2`,K(`h2`,`text-[13px] font-semibold text-neutral-700`,`Providers`),t),r=K(`div`,`min-h-0 flex-1 overflow-y-auto`);e.replaceChildren(n,r);let i=[],a=``,o=async()=>{r.replaceChildren(K(`p`,`px-4 py-3 text-[13px] text-neutral-400`,`Loading…`));try{let[e,n]=await Promise.all([E(`/api/providers`,`Could not load providers`,{cache:`no-store`}),E(`/api/models`,`the model catalog could not be read`,{cache:`no-store`})]);if(i=n.ok?n.value:[],a=n.ok?``:n.error,!e.ok){r.replaceChildren(Sr(e.error));return}let s=e.value;t.onclick=()=>Vd(s,void 0,o),d(s)}catch(e){r.replaceChildren(Sr(`Could not load providers: ${String(e)}`))}},s=async e=>{if(window.confirm(`Remove the stored credential for ${e.name}?`))try{let t=await w(`/api/providers/${encodeURIComponent(e.id)}/logout`,{});if(!t.ok){window.alert(await T(t,`Could not remove credential`));return}await o()}catch(e){window.alert(`Could not remove credential: ${String(e)}`)}},c=e=>[...new Set([...(e.models??[]).map(e=>e.id),...i.filter(t=>t.provider===e.id).map(e=>e.id)])],l=(e,t)=>K(`div`,`flex flex-col gap-1`,K(`span`,`text-[10.5px] font-semibold uppercase tracking-wide text-neutral-400`,e),K(`pre`,`max-h-56 overflow-auto whitespace-pre-wrap break-all rounded-md bg-neutral-50 p-2 font-mono text-[11.5px] leading-relaxed text-neutral-600`,t)),u=async(e,t)=>{try{let n=await w(`/api/providers/${encodeURIComponent(e)}/check`,{model:t});return n.ok?await n.json():await T(n,`Could not test`)}catch(e){return`Could not test: ${String(e)}`}},d=e=>{let t=e.filter(e=>e.configured);if(!t.length){r.replaceChildren(Sr(`No providers configured.`));return}r.replaceChildren(...t.map(t=>{let n=K(`div`,`min-w-0 flex-1`,K(`div`,`truncate text-[13px] font-medium text-neutral-700`,t.name),K(`div`,`truncate font-mono text-[11px] text-neutral-400`,t.id)),r=t.stored===`api_key`?`API key`:t.stored===`oauth`?`OAuth`:t.source??`configured`,i=t.endpoint??`Default endpoint`,d=K(`div`,`flex min-w-32 flex-col items-start gap-1`,xr(`configured`,`bg-emerald-50 text-emerald-700 ring-emerald-200`),K(`span`,`max-w-48 truncate text-[11px] text-neutral-500`,r),K(`span`,`max-w-48 truncate text-[11px] text-neutral-400`,i));d.title=i;let f=K(`span`,`text-[11.5px]`,``),p=K(`div`,`hidden flex-col gap-2 px-4 pb-3`,f),m=K(`div`,`flex flex-wrap justify-end gap-1.5`),h=c(t);if(!h.length)Y(f,`idle`,a||`No models to test: none are configured here.`),p.classList.replace(`hidden`,`flex`);else{let e=_r([[`Model to test…`,``],...h.map(e=>[e,e])],``);e.classList.add(`max-w-52`,`text-[12px]`);let n=q(`Test`);n.disabled=!0,e.onchange=()=>n.disabled=!e.value,n.onclick=()=>{let r=e.value;n.disabled=!0,p.replaceChildren(f),p.classList.replace(`hidden`,`flex`),Y(f,`saving`,`asking ${r}…`),u(t.id,r).then(e=>{if(n.disabled=!1,typeof e==`string`)return Y(f,`failed`,e);Y(f,e.ok?`saved`:`failed`,`${e.model} ${e.ok?`answered`:`did not answer`} in ${e.ms} ms`),p.append(l(`sent`,e.request||`(the request was never made)`),l(e.ok?`answered`:`replied`,e.response))})},m.append(e,n)}if(t.builtin||t.api&&t.models){let n=q(`Edit`);n.onclick=()=>Vd(e,t,o),m.append(n)}if(t.stored){let e=q(`Remove credential`);e.onclick=()=>void s(t),m.append(e)}return K(`div`,`border-b border-neutral-100`,K(`div`,`grid grid-cols-[minmax(8rem,1fr)_minmax(8rem,auto)_minmax(9rem,auto)] items-center gap-3 px-4 py-2.5 max-sm:grid-cols-[1fr_auto]`,n,d,m),p)}))};await o()}function Bd(e,t){let n=t.filter(e=>!e.configured&&e.methods.length&&(e.builtin||e.api!==void 0&&e.models!==void 0)),r=(t,n)=>{if(!n.length)return;let r=document.createElement(`optgroup`);r.label=t,r.append(...n.map(e=>new Option(e.name,e.id))),e.append(r)};r(`Common`,Id.flatMap(e=>n.filter(t=>t.id===e))),r(`More providers`,n.filter(e=>e.builtin&&!Id.includes(e.id)).sort((e,t)=>e.name.localeCompare(t.name))),r(`Custom providers`,n.filter(e=>!e.builtin).sort((e,t)=>e.name.localeCompare(t.name))),e.append(new Option(`Custom provider…`,Rd))}function Vd(e,t,n){let r=document.createElement(`dialog`);r.className=`m-auto w-[min(32rem,92vw)] rounded-lg border border-neutral-200 bg-white p-0 shadow-xl backdrop:bg-black/30`;let i=document.createElement(`select`);i.className=`${mr} select`,t||Bd(i,e);let a=gr(),o=gr(),s=gr(),c=document.createElement(`select`);c.className=`${mr} select`,c.append(...Ld.map(([e,t])=>new Option(e,t)));let l=vr(``,4);l.placeholder=`model-id
88
+ another-model-id`;let u=document.createElement(`input`);u.type=`checkbox`;let d=document.createElement(`select`);d.className=`${mr} select`;let f=K(`div`,`flex flex-col gap-4`),p=K(`span`,`text-[11.5px] text-red-600`,``),m=q(`Cancel`),h=q(t?`Save`:`Add`,!0);h.type=`submit`;let g=()=>t??e.find(e=>e.id===i.value),_=()=>{let e=g(),n=e?!e.builtin:i.value===Rd;a.value=e?.id??``,a.disabled=t!==void 0,o.value=e?.name??``,s.value=e?.endpoint??``,c.value=e?.api??`openai-completions`,l.value=e?.models?.map(e=>e.id).join(`
89
+ `)??``;let r=e?.models?.map(e=>e.reasoning)??[];u.checked=r.length?r.every(Boolean):!e,u.indeterminate=r.some(Boolean)&&!r.every(Boolean);let p=[];e?.configured&&p.push(new Option(`Keep current authentication`,``));let m=e?.methods??[{type:`api_key`,name:`API key`}];for(let t of m.filter(t=>e?.builtin!==!1||t.type===`api_key`))p.push(new Option(t.name,t.type));d.replaceChildren(...p);let h=[];t||h.push(J(`Provider`,i)),n?h.push(J(`Provider ID`,a),J(`Display name`,o),J(`Endpoint`,s),J(`API format`,c),J(`Models`,l),J(`Model capabilities`,K(`label`,`flex items-center gap-2 text-[12.5px] text-neutral-600`,u,K(`span`,``,`Reasoning`)))):(s.placeholder=`Provider default`,h.push(J(`Endpoint`,s))),h.push(J(`Authentication`,d)),f.replaceChildren(...h)};i.onchange=_,_();let v=K(`form`,`flex flex-col gap-4 px-4 py-3`,f,K(`div`,`flex items-center justify-end gap-2`,p,m,h)),y=!1;m.onclick=()=>{y||r.close()},r.oncancel=e=>{y&&e.preventDefault()},v.onsubmit=e=>{if(e.preventDefault(),y)return;p.textContent=``;let t=g(),f=(t?!t.builtin:i.value===Rd)?{kind:`custom`,id:a.value.trim(),...o.value.trim()?{name:o.value.trim()}:{},endpoint:s.value.trim(),api:c.value,models:[...new Set(l.value.split(`
90
+ `).map(e=>e.trim()).filter(Boolean))].map(e=>({id:e,reasoning:u.indeterminate?t?.models?.find(t=>t.id===e)?.reasoning??u.checked:u.checked}))}:{kind:`builtin`,id:t.id,...s.value.trim()?{endpoint:s.value.trim()}:{}},_=d.value||null;y=!0,h.disabled=!0,m.disabled=!0,(async()=>{try{let e=await w(`/api/providers/setup`,{setup:f,authType:_});if(!e.ok){p.textContent=await T(e,`Could not configure provider`);return}if(r.close(),e.status===202){let t=d.selectedOptions[0]?.textContent??`Authentication`;Fd(await e.json(),f.id,t,()=>void n())}else await n()}catch(e){p.textContent=`Could not configure provider: ${String(e)}`}finally{y=!1,h.disabled=!1,m.disabled=!1}})()},r.append(K(`div`,`border-b border-neutral-200 px-4 py-2.5 text-[14px] font-semibold`,t?`Edit ${t.name}`:`Add provider`),v),r.onclose=()=>r.remove(),document.body.append(r),r.showModal(),(t?s:i).focus()}var Hd=[[`models`,`Models`],[`files`,`Agent`],[`channels`,`Channels`],[`instance`,`Instance`],[`security`,`Security`]],Ud=e=>Hd.some(([t])=>t===e),Wd=`pier.settingsTopic`;function Gd(e){return[/\bEdg\//.test(e)?`Edge`:/\b(Firefox|Chrome|Safari)\/[\d.]+/.exec(e)?.[1],/\(([^;)]+)/.exec(e)?.[1]?.trim()].filter(Boolean).join(` · `)||e||`unknown client`}function Kd(e,t,n){let r=localStorage.getItem(Wd)??void 0,i=Ud(r)?r:`models`,a=K(`header`,`flex h-10 flex-none items-center gap-3 border-b border-neutral-200 bg-white px-4 max-md:hidden`,K(`span`,`font-medium`,`Settings`)),o=K(`div`,`tabstrip bg-white`);function s(){o.replaceChildren(...Hd.map(([e,t])=>fr(t,e===i,()=>n(e))))}let c=gr();c.placeholder=`https://pier.example.com`,c.autocomplete=`off`;let l=K(`span`,`text-[11.5px]`,``),u=q(`Save`,!0);async function d(){Y(l,`saving`,`saving…`);let e=await w(`/api/settings`,{publicUrl:c.value},`PUT`);if(!e.ok)return Y(l,`failed`,await T(e,`Could not save`));let{publicUrl:t}=await e.json();c.value=t,Y(l,`saved`,t?`Saved — boards link as ${t}/p/<slug>-<token>/`:`Cleared.`)}u.onclick=()=>void d(),c.onkeydown=e=>{e.key===`Enter`&&d()};let f=pr(`Public URL`,`Where this Pier is reached from outside — the proxy's address, not the port it listens on.`,J(`Base URL`,c,{hint:`Agents read it to hand you a clickable board link instead of a path. Nothing here changes what Pier serves; leave it empty if Pier is only reachable locally.`}),K(`div`,`flex items-center gap-3`,u,l)),p=gr(``,`password`),m=gr(``,`password`),h=gr(``,`password`);for(let e of[p,m,h])e.autocomplete=`off`;let g=K(`span`,`text-[11.5px]`,``),_=q(`Change password`,!0);async function v(){if(m.value!==h.value)return Y(g,`failed`,`The two new passwords differ.`);Y(g,`saving`,`changing…`);let e=await w(`/api/password`,{current:p.value,next:m.value});if(!e.ok)return Y(g,`failed`,await T(e,`Could not change the password`));for(let e of[p,m,h])e.value=``;Y(g,`saved`,`Changed. Sign in again with the new password.`),location.href=`/login`}_.onclick=()=>void v(),h.onkeydown=e=>{e.key===`Enter`&&v()};let y=pr(`Password`,`One shared password guards every page and API route. Changing it signs out every signed-in browser, this one included.`,J(`Current password`,p),J(`New password`,m,{hint:`At least 10 characters.`}),J(`Repeat new password`,h),K(`div`,`flex items-center gap-3`,_,g)),b=q(`Reload`,!0),x=K(`span`,`text-[11.5px]`,``);b.onclick=()=>{b.disabled=!0,Y(x,`saving`,`reloading…`),(async()=>{let e=await w(`/api/reload`,{});if(b.disabled=!1,!e.ok)return Y(x,`failed`,await T(e,`Could not reload`));let{recycled:t,busy:n}=await e.json(),r=t?`Recycled ${t} session(s).`:`No idle session needed it.`,i=n?` ${n} still mid-turn — they take it when the turn ends.`:``;Y(x,n?`idle`:`saved`,r+i)})()};let S=pr(`Reload configuration`,`Re-reads channel configuration and lets go of idle sessions, so the next message opens them with the current agent files, skills and credentials. Saving here does this on its own — use it after something outside the Console changed a file.`,K(`div`,`flex items-center gap-3`,b,x)),C=K(`div`,`flex flex-col gap-2`),D=K(`span`,`text-[11.5px]`,``);async function O(e,t){Y(D,`saving`,`signing out…`);try{let n=await w(e,{});if(n.ok)return!0;Y(D,`failed`,await T(n,t))}catch(e){Y(D,`failed`,`${t}: ${String(e)}`)}return!1}let k=q(`Sign out`);k.onclick=()=>{k.disabled=!0,O(`/logout`,`Could not sign out`).then(e=>{e?location.href=`/login`:k.disabled=!1})};function A(e){C.replaceChildren(...e.map(e=>{let t=q(e.current?`This browser`:`Sign out`);t.disabled=e.current,t.onclick=()=>{t.disabled=!0,O(`/api/devices/${encodeURIComponent(e.id)}/signout`,`Could not sign it out`).then(e=>{if(!e)return void(t.disabled=!1);Y(D,`saved`,`Signed out.`),ee()})};let n=K(`div`,`flex min-w-0 flex-col`,K(`span`,`truncate text-[12.5px] text-neutral-700`,Gd(e.agent)));return n.title=e.agent,n.append(K(`span`,`truncate text-[11.5px] text-neutral-400`,`${e.ip} · seen ${Qn(e.seenAt)} · signed in ${Qn(e.createdAt)}`)),K(`div`,`flex items-center justify-between gap-3 rounded-lg border border-neutral-200 px-3 py-2`,n,t)}))}async function ee(){let e=await E(`/api/devices`,`Could not load signed-in devices`);if(!e.ok){C.replaceChildren(Sr(e.error));return}A(e.value)}let j=pr(`Signed-in devices`,`One row per browser holding a session. Signing one out invalidates its cookie immediately; sessions expire on their own 7 days after last use.`,C,K(`div`,`flex items-center gap-3`,k,D)),M=K(`div`,`mx-auto flex max-w-2xl flex-col gap-6`,f,ec(),S,y,j),N=e=>K(`div`,`hidden min-h-0 flex-1 overflow-y-auto bg-neutral-50/60`,K(`div`,`px-4 py-5`,e)),te=Nd(),P=K(`div`,`mx-auto flex w-full min-w-0 max-w-3xl flex-col rounded-xl border border-neutral-200 bg-white shadow-xs`),ne=K(`section`,`hidden min-h-0 flex-1 flex-col`),re=Dd(ne),ie=K(`section`,`hidden min-h-0 flex-1 flex-col`),F=Ad(ie,t);function I(){g.textContent=``,D.textContent=``,ee(),(async()=>{let e=await E(`/api/settings`,`Could not load settings`);if(!e.ok)return Y(l,`failed`,e.error);c.value=e.value.publicUrl,l.textContent=``})()}let ae=K(`div`,`mx-auto flex max-w-2xl flex-col gap-6`);async function L(){let e=await E(`/api/secrets`,`Could not load key status`);if(!e.ok){ae.replaceChildren(Sr(e.error));return}oe(e.value)}function oe(e,t){let n=e.state===`locked`,r=K(`span`,`text-[11.5px]`,``);t&&Y(r,`saved`,t);let i=K(`div`,`flex items-center gap-2`,xr(e.state,n?`bg-red-50 text-red-700 ring-red-200`:`bg-emerald-50 text-emerald-700 ring-emerald-200`),K(`span`,`text-[12.5px] text-neutral-600`,n?`Stored credentials cannot be read until the key is unlocked.`:e.mode===`vt`?`Key mode: vt:// — unlocking takes one vt approval per process start.`:`Key mode: file — the key sits raw in master.key; switch to vt:// to require an approval.`)),a=K(`a`,`text-indigo-600 hover:underline`,`vt`);a.href=`https://github.com/timqi/vt`,a.target=`_blank`,a.rel=`noreferrer`;let o=[i,K(`p`,`text-[12px] leading-snug text-neutral-500`,a,` is a small local KMS: it keeps the key wrapped and releases it only on an explicit approval — Touch ID on a Mac, a phone passkey on a headless host. Pier only stores the vt:// record, so master.key alone unlocks nothing.`)];if(n){o.push(K(`p`,`text-[12.5px] leading-snug text-red-600`,e.reason??`No reason reported.`));let t=q(`Unlock`,!0);t.onclick=()=>{Y(r,`saving`,`unlocking… (vt mode waits on your approval)`),(async()=>{let e=await w(`/api/secrets/unlock`,{});if(!e.ok)return Y(r,`failed`,await T(e,`Could not unlock`));oe(await e.json(),`Unlocked — channels are starting.`)})()},o.push(K(`div`,`flex items-center gap-3`,t,r))}else{let t=async(e,t,n)=>{if(!window.confirm(t))return;Y(r,`saving`,e===`vt`?`rotating… (vt asks for an approval)`:`rotating…`);let i=await w(`/api/secrets/rotate`,{mode:e});if(!i.ok)return Y(r,`failed`,await T(i,`Could not rotate`));oe(await i.json(),n)},n=e.mode??`file`,i=q(`Rotate key`,!0);i.onclick=()=>void t(n,`Generate a new master key? Stored credentials stay valid; the old key stops working.`,`Rotated.`);let a=n===`vt`?`file`:`vt`,s=q(a===`vt`?`Switch to vt://`:`Switch to file`);s.onclick=()=>void t(a,a===`vt`?`Move the master key into vt? Every process start will then wait on a vt approval.`:`Store the master key raw in master.key? Anyone who can read the file can read every credential.`,a===`vt`?`Switched to vt:// mode.`:`Switched to file mode.`),o.push(K(`div`,`flex items-center gap-3`,i,s,r))}ae.replaceChildren(pr(`Master key`,`Seals every credential Pier stores (channel tokens, API keys). Rotating rewraps the key file; no stored data is rewritten.`,...o))}let se=N(M),ce=N(K(`div`,`flex flex-col gap-6`,P,te.el)),le=N(ae),ue=[[`instance`,se,I],[`models`,ce,()=>{zd(P),te.load()}],[`security`,le,()=>void L()]];e.append(a,o,se,ce,ne,ie,le);function de(e){Ud(e)&&(i=e),localStorage.setItem(Wd,i),s();for(let[e,t,n]of ue){let r=e===i;t.classList.toggle(`hidden`,!r),r&&n()}i===`channels`?re.show():re.hide(),i===`files`?F.show():F.hide()}return rr(e,de)}function qd(e,t){let n=e.map(e=>[`${e.title??`Untitled`} · ${e.cwd}`,e.id]);return t&&!n.some(([,e])=>e===t)&&n.push([`Current session · ${t}`,t]),n}function Jd(e,t){let n=document.createElement(`dialog`);n.className=`m-auto w-[38.75rem] max-w-[94vw] rounded-lg border border-neutral-200 p-0 shadow-xl backdrop:bg-black/20`;let r=document.createElement(`form`);r.className=`flex max-h-[88vh] flex-col`;let i=K(`span`,`mr-auto text-[12px] text-red-600`),a=K(`header`,`flex h-11 flex-none items-center border-b border-neutral-200 px-4 font-medium`,t?`Edit task`:`New task`),o=K(`div`,`grid min-h-0 flex-1 grid-cols-2 gap-3 overflow-y-auto p-4`),s=gr(t?.name??``);s.required=!0;let c=gr(t?.description??``),l=gr(String(t?.timeoutSeconds??900),`number`);l.min=`1`,l.max=`86400`;let u=_r([[`Manual`,`manual`],[`Scheduled`,`cron`],[`Watch`,`watch`]],t?.trigger.type??`manual`),d=_r([[`Bash`,`bash`],[`Agent`,`agent`],[`Task`,`task`]],t?.action.type??`bash`),f=_r([[`No callback`,`none`],[`Invoking session`,`origin`],[`Specific session`,`session`]],t?.callback.type??`none`),p=t?.callback.type===`session`?t.callback.sessionId:null,m=_r(qd(e.sessions(),p),p??``),h=J(`Callback session`,m);h.classList.toggle(`hidden`,f.value!==`session`),f.onchange=()=>h.classList.toggle(`hidden`,f.value!==`session`),o.append(J(`Name`,s),J(`Description`,c),J(`Trigger`,u),J(`Action`,d),J(`Callback`,f),h,J(`Timeout (seconds)`,l));let g=K(`div`,`col-span-2 grid grid-cols-2 gap-3 border-t border-neutral-200 pt-3`);o.append(g);let _=()=>{g.replaceChildren();let a,o,p,h,_,v;if(u.value===`cron`)a=gr(t?.trigger.type===`cron`?t.trigger.expression:`0 9 * * *`),o=gr(t?.trigger.type===`cron`?t.trigger.timezone:Intl.DateTimeFormat().resolvedOptions().timeZone),g.append(J(`Cron`,a),J(`Timezone`,o));else if(u.value===`watch`){p=vr(t?.trigger.type===`watch`?t.trigger.script:``,4),v=gr(t?.trigger.type===`watch`?t.trigger.cwd:e.sessions()[0]?.cwd??``),h=gr(String(t?.trigger.type===`watch`?t.trigger.intervalSeconds:60),`number`),_=_r([[`Continue after matches`,`repeat`],[`Stop after first match`,`once`]],t?.trigger.type===`watch`?t.trigger.mode:`repeat`);let n=J(`Probe script (0=match, 1=no match)`,p);n.classList.add(`col-span-2`),g.append(n,J(`Probe directory`,v),J(`Interval (seconds)`,h),J(`Mode`,_))}let y,b,x,S,C,w,T,E,D,O;if(d.value===`bash`){b=gr(t?.action.type===`bash`?t.action.cwd:e.sessions()[0]?.cwd??``),y=vr(t?.action.type===`bash`?t.action.script:``,6);let n=J(`Bash script`,y);n.classList.add(`col-span-2`),g.append(J(`Working directory`,b),K(`span`,``),n)}else if(d.value===`agent`){let n=e.sessions(),r=t?.action.type===`agent`?t.action:null,i=r?.session.mode===`reuse`?r.session.sessionId:``,a=qd(n,i||null);x=_r([[`Reuse session`,`reuse`],[`Fresh child per run`,`fresh`],[`Fork caller context`,`fork`]],r?.session.mode??`fresh`),S=_r(a,i||a[0]?.[1]||``),C=gr((r?.session.mode===`fresh`||r?.session.mode===`fork`?r.session.cwd??``:``)||n[0]?.cwd||``),w=vr(r?.prompt??``,6),T=_r([[`Project default`,``],[`Off`,`off`],[`Low`,`low`],[`Medium`,`medium`],[`High`,`high`],[`Extra high`,`xhigh`]],r?.launch?.thinking??``),E=gr(r?.launch?.model?.provider??``),D=gr(r?.launch?.model?.id??``);let o=J(`Session`,S),s=J(`Child directory`,C),c=[J(`Thinking`,T),J(`Model provider (optional)`,E),J(`Model id (optional)`,D)],l=()=>{let e=x?.value===`reuse`;o.classList.toggle(`hidden`,!e),s.classList.toggle(`hidden`,e);for(let t of c)t.classList.toggle(`hidden`,e)};x.onchange=l,l();let u=J(`Prompt`,w);u.classList.add(`col-span-2`),g.append(J(`Session policy`,x),o,s,...c,u)}else O=_r(e.tasks().filter(e=>e.id!==t?.id&&!e.archived).map(e=>[e.name,e.id]),t?.action.type===`task`?t.action.taskId:``),g.append(J(`Target task`,O));r.onsubmit=r=>{r.preventDefault();let g=u.value===`manual`?{type:`manual`}:u.value===`cron`?{type:`cron`,expression:a.value,timezone:o.value}:{type:`watch`,script:p.value,cwd:v.value,intervalSeconds:Number(h.value),mode:_.value},k=d.value===`agent`&&x.value!==`reuse`?{...T.value?{thinking:T.value}:{},...E.value.trim()&&D.value.trim()?{model:{provider:E.value.trim(),id:D.value.trim()}}:{}}:void 0,A=d.value===`bash`?{type:`bash`,cwd:b.value,script:y.value}:d.value===`agent`?{type:`agent`,prompt:w.value,session:x.value===`reuse`?{mode:`reuse`,sessionId:S.value}:x.value===`fork`?{mode:`fork`,...C.value.trim()?{cwd:C.value.trim()}:{}}:{mode:`fresh`,cwd:C.value},...k?{launch:k}:{}}:{type:`task`,taskId:O.value},ee=f.value===`origin`?{type:`origin`}:f.value===`session`?{type:`session`,sessionId:m.value}:{type:`none`},j={name:s.value,description:c.value,trigger:g,action:A,callback:ee,timeoutSeconds:Number(l.value)};i.textContent=``,Yd(t?.id,j,n,i,e.onSaved)}};u.onchange=_,d.onchange=_,_();let v=q(`Cancel`);v.onclick=()=>n.close();let y=q(`Save`,!0);y.type=`submit`;let b=K(`footer`,`flex flex-none justify-end gap-2 border-t border-neutral-200 px-4 py-3`);b.append(i,v,y),r.append(a,o,b),n.append(r),n.addEventListener(`close`,()=>n.remove()),document.body.append(n),n.showModal(),s.focus()}async function Yd(e,t,n,r,i){let a=await w(e?`/api/tasks/${e}`:`/api/tasks`,t,e?`PATCH`:`POST`);if(!a.ok){r.textContent=(await a.json()).error??`Task save failed`;return}let o=await a.json(),s=`task`in o?o.task:o;n.close(),i(s.id)}var Xd=e=>e===null?`-`:new Date(e).toLocaleString(),Zd=e=>e.startedAt===null?`-`:nr((e.finishedAt??Date.now())-e.startedAt);function Qd(e,t,n){let r=K(`div`,`divide-y divide-neutral-100`);for(let i of t){let t=K(`button`,`grid w-full cursor-pointer grid-cols-[7.5rem_1fr_7.5rem_6.25rem] gap-3 px-4 py-2.5 text-left text-[12.5px] hover:bg-neutral-50`);t.append(K(`span`,`font-medium`,i.state),K(`span`,`truncate text-neutral-500`,Xd(i.queuedAt)),K(`span`,`text-neutral-500`,i.triggerSource),K(`span`,`text-right text-neutral-500`,Zd(i))),t.onclick=()=>void $d(e,i.id,r,n),r.append(t)}t.length||r.append(K(`p`,`p-4 text-[13px] text-neutral-400`,`No runs yet.`)),e.replaceChildren(r)}async function $d(e,t,n,r){let[i,a]=await Promise.all([E(`/api/task-runs/${t}`,`Could not load the run`),E(`/api/task-runs/${t}/messages`,`Could not load the run's messages`)]);if(!i.ok){e.replaceChildren(K(`p`,`p-4 text-[13px] text-red-600`,i.error));return}let o=i.value,s=a.ok?a.value:[],c=q(`Back to runs`);c.onclick=()=>e.replaceChildren(n);let l=K(`div`,`flex items-center gap-2 border-b border-neutral-200 px-4 py-2`);if(l.append(c,K(`span`,`font-mono text-[12px] text-neutral-400`,o.id)),o.targetSessionId){let e=q(`Open session`);e.classList.add(`ml-auto`),e.onclick=()=>r.openSession(o.targetSessionId),l.append(e)}if(o.state===`queued`||o.state===`running`){let e=q(`Steer`);e.onclick=()=>void ef(O(`Steer subagent`,`/api/task-runs/${o.id}/steer`,{mode:`steer`,sourceSessionId:r.currentSessionId()},`Run control failed`),r);let t=q(`Stop`);t.onclick=()=>void r.mutate(`/api/task-runs/${o.id}/cancel`),l.append(e,t)}else if(o.targetSessionId){let e=q(`Continue`);e.onclick=()=>void ef(O(`Continue subagent`,`/api/task-runs/${o.id}/resume`,{sourceSessionId:r.currentSessionId()},`Run control failed`),r),l.append(e)}let u=K(`div`,`min-h-0 flex-1 overflow-auto`),d=K(`pre`,`whitespace-pre-wrap break-words p-4 font-mono text-[12px]`,JSON.stringify(o,null,2));if(u.append(d),s.length){let e=K(`div`,`border-t border-neutral-200`);e.append(K(`div`,`px-4 py-2 text-[11px] font-semibold uppercase text-neutral-400`,`Messages`));for(let t of s){let n=K(`div`,`grid grid-cols-[6.25rem_6.25rem_1fr] gap-3 border-t border-neutral-100 px-4 py-2 text-[12px]`);n.append(K(`span`,`font-medium`,t.kind),K(`span`,`text-neutral-500`,t.state),K(`span`,`whitespace-pre-wrap`,t.content)),e.append(n)}u.append(e)}e.replaceChildren(l,u)}async function ef(e,t){let n=await e;n.sent&&(n.error?t.onError(n.error):await t.reload())}var tf=e=>e.trigger.type===`manual`?`Manual`:e.trigger.type===`cron`?`${e.trigger.expression} (${e.trigger.timezone})`:`Every ${e.trigger.intervalSeconds}s · ${e.trigger.mode}`,nf=e=>e.action.type===`agent`?`Agent · ${e.action.session.mode}`:e.action.type===`bash`?`Bash`:`Task`;function rf(e,t,n,r,i,a){let o=[],s=[],c=null,l=`active`,u=``,d=C(async()=>{let e=l,t=await fetch(`/api/tasks?state=${e===`archived`?`archived`:`active`}${e===`subagent`?`&kind=subagent`:``}`);if(!t.ok)return u=``,f(`Failed to load tasks: ${t.status}`);let n=await t.text();e===l&&(e+n===u&&!c||(u=e+n,o=JSON.parse(n),s=e===`archived`||e===`subagent`?await p():o,e!==`active`&&e!==`archived`&&e!==`subagent`&&(o=o.filter(t=>t.trigger.type===e)),c?await x(c):y()))});function f(t){e.replaceChildren(K(`p`,`p-4 text-[13px] text-red-600`,t))}async function p(){let e=await fetch(`/api/tasks?state=active`);return e.ok?await e.json():s}let m={sessions:t,tasks:()=>s,onSaved:e=>{c=e,d()}},h={openSession:r,currentSessionId:i,mutate:D,onError:f,reload:d};function g(e,t){let n=K(`header`,`flex h-10 flex-none items-center gap-2 border-b border-neutral-200 px-4`);if(n.append(typeof e==`string`?K(`span`,`truncate font-medium max-md:hidden`,e):e),t.length){let e=K(`div`,`ml-auto flex items-center gap-2`);e.append(...t),n.append(e)}return n}function _(){return K(`div`,`tabstrip`,dr(`Sessions`,!1,()=>a(`sessions`)),dr(`Dependencies`,!1,()=>a(`dependencies`)),dr(`Tasks`,!0,v))}function v(){c=null,y()}function y(){let t=q(`New task`,!0);t.onclick=()=>void n().then(()=>Jd(m));let r=_(),i=K(`div`,`ml-auto flex flex-none items-center gap-1 pl-1 max-md:ml-0 max-md:w-full max-md:overflow-x-auto max-md:pl-0`);for(let[e,t]of[[`All`,`active`],[`Manual`,`manual`],[`Scheduled`,`cron`],[`Watching`,`watch`],[`Subagents`,`subagent`],[`Archived`,`archived`]])i.append(dr(e,l===t,()=>{l=t,c=null,d()}));r.append(i);let a=document.createElement(`table`);a.className=`w-full min-w-[52rem] table-fixed text-left text-[12.5px]`,a.innerHTML=`<thead class="sticky top-0 bg-neutral-50 text-[10.5px] uppercase text-neutral-400"><tr>
91
91
  <th class="w-[24%] px-4 py-2 font-semibold">Name</th><th class="w-[10%] px-2 py-2 font-semibold">Action</th>
92
92
  <th class="w-[23%] px-2 py-2 font-semibold">Trigger</th><th class="w-[17%] px-2 py-2 font-semibold">Next</th>
93
- <th class="w-[14%] px-2 py-2 font-semibold">Last result</th><th class="px-2 py-2 font-semibold"></th></tr></thead>`;let s=document.createElement(`tbody`);for(let e of o)s.append(b(e));a.append(s),e.replaceChildren(g(`Tasks`,[t]),r,K(`div`,`min-h-0 flex-1 overflow-auto`,a))}function b(e){let t=document.createElement(`tr`);t.className=`cursor-pointer border-b border-neutral-100 hover:bg-neutral-50`,t.onclick=()=>{c=e.id,x(e.id)};let n=e.archived?`Archived`:e.enabled?`Enabled`:`Paused`;t.append(K(`td`,`truncate py-2.5 pl-4 pr-2`,K(`div`,`truncate font-medium`,e.name),K(`div`,`text-[11px] text-neutral-400`,n)));for(let n of[Qd(e),Zd(e),Kd(e.nextRunAt),e.lastRun?`${e.lastRun.state} · ${qd(e.lastRun)}`:`-`])t.append(K(`td`,`truncate px-2 py-2.5`,n));let r=q(`Run`);return r.disabled=e.archived,r.onclick=t=>{t.stopPropagation(),T(e.id)},t.append(K(`td`,`px-2 py-1 text-right`,r)),t}async function x(t){let[r,i]=await Promise.all([E(`/api/tasks/${t}`,`Failed to load task`),E(`/api/tasks/${t}/runs`,`Failed to load the task's runs`)]);if(!r.ok)return f(r.error);if(!i.ok)return f(i.error);let a=r.value,o=i.value,s=q(`Tasks`);s.className=`cursor-pointer text-neutral-500 hover:underline`,s.onclick=v;let c=K(`span`,`flex min-w-0 items-center gap-1.5`,s,K(`span`,`text-neutral-400`,`›`),K(`span`,`truncate font-medium`,a.name)),l=q(`Run now`,!0);l.disabled=a.archived,l.onclick=()=>void T(a.id);let u=q(a.enabled?`Pause`:`Resume`);u.disabled=a.archived||a.trigger.type===`manual`,u.onclick=()=>void D(`/api/tasks/${a.id}/${a.enabled?`pause`:`resume`}`);let d=q(`Edit`);d.disabled=a.archived,d.onclick=()=>void n().then(()=>Wd(m,a));let p=q(`Archive`);p.disabled=a.archived,p.onclick=()=>void D(`/api/tasks/${a.id}/archive`);let y=K(`div`,`flex flex-none gap-1 border-b border-neutral-200 px-4 py-2`),b=q(`Definition`),x=q(`Runs (${o.length})`),C=K(`div`,`min-h-0 flex-1 overflow-auto`),w=()=>{b.classList.add(`bg-neutral-200`),x.classList.remove(`bg-neutral-200`),S(C,a)};b.onclick=w,x.onclick=()=>{x.classList.add(`bg-neutral-200`),b.classList.remove(`bg-neutral-200`),Jd(C,o,h)},y.append(b,x),e.replaceChildren(g(c,[l,u,d,p]),_(),y,C),o.length?x.click():w()}function S(e,t){let n=K(`div`,`grid max-w-4xl grid-cols-[9.375rem_minmax(0,1fr)] gap-x-5 gap-y-3 p-4 text-[13px]`),i=[[`Status`,t.archived?`Archived`:t.enabled?`Enabled`:`Paused`],[`Trigger`,Zd(t)],[`Action`,Qd(t)],[`Timeout`,`${t.timeoutSeconds}s`],[`Next run`,Kd(t.nextRunAt)],[`Revision`,String(t.revision)],[`Created by`,t.createdBySessionId??t.creator],[`Callback`,t.callback.type===`session`?t.callback.sessionId:t.callback.type],[`Description`,t.description||`-`]];t.action.type===`agent`&&(i.push([`Session policy`,t.action.session.mode]),t.action.session.mode===`reuse`&&i.push([`Session`,t.action.session.sessionId]),t.action.session.mode===`fresh`&&i.push([`Directory`,t.action.session.cwd]),t.action.session.mode===`fork`&&i.push([`Directory`,t.action.session.cwd??`Caller project`]),t.action.launch?.model&&i.push([`Model`,`${t.action.launch.model.provider}/${t.action.launch.model.id}`]),t.action.launch?.thinking&&i.push([`Thinking`,t.action.launch.thinking]),i.push([`Prompt`,t.action.prompt])),t.action.type===`bash`&&i.push([`Directory`,t.action.cwd],[`Script`,t.action.script]),t.action.type===`task`&&i.push([`Target task`,t.action.taskId]),t.trigger.type===`watch`&&i.push([`Probe`,t.trigger.script]);for(let[e,t]of i)n.append(K(`span`,`text-[11px] font-semibold uppercase text-neutral-400`,e),K(`pre`,`whitespace-pre-wrap break-words font-mono text-[12.5px]`,t));if(t.action.type===`agent`&&t.action.session.mode===`reuse`){let{sessionId:e}=t.action.session,i=q(`Open session`);i.onclick=()=>r(e),n.append(K(`span`,``,``),i)}e.replaceChildren(n)}async function T(e){let t=await w(`/api/tasks/${e}/run`,{sourceSessionId:i()});if(!t.ok)return f((await t.json()).error??`Failed to run task`);c=e,await x(e)}async function D(e){let t=await fetch(e,{method:`POST`});if(!t.ok)return f((await t.json()).error??`Task update failed`);await d()}let O=nr(e,e=>{e&&(c=e),d()});return Object.assign(O,{refresh(e){O.visible&&(!c||!e||c===e)&&d()}})}var ef=`modulepreload`,tf=function(e){return`/`+e},nf={},rf=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=tf(t,n),t=s(t),t in nf)return;nf[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:ef,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},af=`pier.terminalPrefs`,of={fontFamily:`monospace`,fontSize:14,cursorBlink:!0},sf=()=>{try{let e=JSON.parse(localStorage.getItem(af)??`null`),t=typeof e?.fontSize==`number`?e.fontSize:of.fontSize;return{fontFamily:typeof e?.fontFamily==`string`&&e.fontFamily.trim()?e.fontFamily.slice(0,200):of.fontFamily,fontSize:Math.round(Math.max(10,Math.min(24,t))),cursorBlink:typeof e?.cursorBlink==`boolean`?e.cursorBlink:of.cursorBlink}}catch{return{...of}}},cf=e=>localStorage.setItem(af,JSON.stringify(e)),lf=null,uf=()=>(lf||=rf(()=>import(`./ghostty-web-C4ivXTBE.js`).then(async e=>(await e.init(),e)),[]).catch(e=>{throw lf=null,e}),lf),df=()=>{let e=()=>void uf().catch(e=>{console.warn(`terminal: emulator warm-up failed`,e)});`requestIdleCallback`in window?requestIdleCallback(e,{timeout:1e4}):setTimeout(e,3e3)},ff={background:`#1a1b26`,foreground:`#a9b1d6`,cursor:`#c0caf5`};function pf(e){let t=e.renderer,n=document.createElement(`canvas`).getContext(`2d`);if(!n||typeof t?.remeasureFont!=`function`){console.warn(`terminal: could not correct cell metrics — rows will render tight`);return}t.measureFont=()=>{let{fontSize:t,fontFamily:r}=e.options;n.font=`${t}px ${r}`;let i=n.measureText(`M`),a=i.fontBoundingBoxAscent||i.actualBoundingBoxAscent||t*.8,o=i.fontBoundingBoxDescent||i.actualBoundingBoxDescent||t*.25;return{width:Math.ceil(i.width),height:Math.ceil(a+o),baseline:Math.ceil(a)}},t.remeasureFont()}var mf=`w-full rounded border border-neutral-300 px-2 py-1.5 font-mono text-[12px] outline-none focus:border-indigo-400`;function hf(e,t,n,r,i){df();let a=``,o=null,s=null,c=null,l=!1,u=0,d=!1,f=sf(),p=K(`div`,`ml-auto flex min-w-0 flex-none items-center gap-2`),m=K(`header`,`flex h-10 flex-none items-center gap-2 border-b border-neutral-200 bg-white px-3`),h=K(`div`,`min-h-0 flex-1 overflow-hidden p-1`);h.style.background=ff.background,h.setAttribute(`data-owns-keyboard`,``),h.addEventListener(`keydown`,e=>{e.metaKey&&!e.defaultPrevented&&e.stopImmediatePropagation()},!0),h.addEventListener(`scroll`,()=>{h.scrollTop=0,h.scrollLeft=0}),h.addEventListener(`compositionend`,()=>{for(let e=h.childNodes.length-1;e>=0;e--){let t=h.childNodes[e];t&&t.nodeName!==`CANVAS`&&t.nodeName!==`TEXTAREA`&&t.remove()}}),e.append(m,h);let g=e=>{let t=K(`button`,`min-w-0 max-w-72 cursor-pointer truncate rounded-md bg-neutral-100 px-2 py-0.5 text-left font-mono text-[11.5px] text-neutral-600 hover:bg-neutral-200`,e);return t.type=`button`,t};function _(e,t){if(p.replaceChildren(),e&&p.append(K(`span`,`min-w-0 truncate text-[11.5px] text-neutral-400`,e)),t){let e=g(t.label);e.className=e.className.replace(`bg-neutral-100`,`bg-indigo-50 font-medium text-indigo-700 hover:bg-indigo-100`),e.onclick=t.run,p.append(e)}}function v(){o&&(o.options.fontFamily=f.fontFamily,o.options.fontSize=f.fontSize,o.options.cursorBlink=f.cursorBlink,requestAnimationFrame(E))}function y(){let e=document.createElement(`input`);e.type=`text`,e.placeholder=`tmux new -As "$(basename $PWD)"`,e.spellcheck=!1,e.autocomplete=`off`,e.autocapitalize=`off`,e.disabled=!0,e.className=`${mf} disabled:bg-neutral-50`;let t=K(`span`,`block text-[11.5px] text-neutral-400`,`loading…`),n=(e,n)=>{t.isConnected?Y(t,e,n):e===`failed`&&_(n)},r=``;(async()=>{try{r=(await D(`/api/settings`,`Could not load the startup command`)).terminalInitCommand??``,e.value=r,e.disabled=!1,n(`idle`,`Runs when a shell starts — Restart applies it here.`)}catch(e){n(`failed`,String(e))}})();let i=async()=>{let t=e.value.trim();if(!(e.disabled||t===r)){n(`saving`,`saving…`);try{let i=await w(`/api/settings`,{terminalInitCommand:t},`PUT`);if(!i.ok)return n(`failed`,await T(i,`Could not save the startup command`));r=(await i.json()).terminalInitCommand,e.value=r,n(`saved`,r?`Saved — the next shell runs it.`:`Cleared.`)}catch(e){n(`failed`,`Could not save the startup command: ${String(e)}`)}}};return e.onblur=()=>void i(),e.onkeydown=e=>{e.key===`Enter`&&i()},K(`div`,`space-y-1.5 border-t border-neutral-200 pt-2.5`,K(`div`,``,K(`span`,`text-[12px] font-semibold text-neutral-700`,`Startup command`),K(`span`,`block text-[11px] text-neutral-400`,`This Pier, every shell — not only this browser.`)),e,t)}function b(e){let t=document.createElement(`input`);t.type=`text`,t.value=f.fontFamily,t.setAttribute(`list`,`terminal-font-presets`),t.className=mf;let n=document.createElement(`datalist`);n.id=`terminal-font-presets`;for(let e of[`monospace`,`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace`,`JetBrains Mono, monospace`,`Cascadia Mono, monospace`,`Fira Code, monospace`]){let t=document.createElement(`option`);t.value=e,n.append(t)}let r=document.createElement(`input`);r.type=`number`,r.min=`10`,r.max=`24`,r.step=`1`,r.value=String(f.fontSize),r.className=`w-20 rounded border border-neutral-300 px-2 py-1.5 text-[12px] outline-none focus:border-indigo-400`;let i=document.createElement(`input`);i.type=`checkbox`,i.checked=f.cursorBlink,i.className=`h-4 w-4 accent-indigo-600`;let a=()=>{let e=t.value.trim(),n=Number(r.value);!e||!Number.isFinite(n)||(f={fontFamily:e.slice(0,200),fontSize:Math.round(Math.max(10,Math.min(24,n))),cursorBlink:i.checked},r.value=String(f.fontSize),cf(f),v())};t.oninput=a,r.oninput=a,i.onchange=a;let o=K(`button`,`cursor-pointer text-[12px] text-neutral-500 hover:text-indigo-700`,`Reset`);o.type=`button`,o.onclick=()=>{f={...of},t.value=f.fontFamily,r.value=String(f.fontSize),i.checked=f.cursorBlink,cf(f),v()},sc(e,K(`div`,`w-72 space-y-3 px-3 py-2.5`,K(`div`,`flex items-center`,K(`span`,`text-[12px] font-semibold text-neutral-700`,`Terminal`),K(`span`,`ml-auto`,o)),K(`label`,`block space-y-1 text-[11.5px] text-neutral-500`,K(`span`,``,`Font family`),t,n),K(`label`,`flex items-center justify-between text-[11.5px] text-neutral-500`,K(`span`,``,`Font size`),r),K(`label`,`flex cursor-pointer items-center justify-between text-[11.5px] text-neutral-500`,K(`span`,``,`Blinking cursor`),i),y()))}function x(){let e=g(a||`Choose a folder…`);e.title=`Switch folder`,e.onclick=()=>Cc(e,t().map(e=>({path:e})),a||void 0,e=>e===a?void 0:r(e));let n=g(`Fit`);n.title=`Resize the shell to this window`,n.onclick=()=>{E(),o?.focus()};let s=g(`Restart`);s.title=`End this shell and start a new one`,s.onclick=()=>void C();let c=K(`button`,`icon-btn text-[15px]`,`⚙`);c.type=`button`,c.title=`Terminal settings`,c.setAttribute(`aria-label`,`Terminal settings`),c.onclick=()=>b(c);let l=K(`button`,`icon-btn`,`✕`);l.type=`button`,l.title=`Close Terminal`,l.setAttribute(`aria-label`,`Close Terminal`),l.onclick=i,m.replaceChildren(e,p,n,s,c,l)}let S=()=>{o&&c?.readyState===WebSocket.OPEN&&c.send(JSON.stringify({t:`resize`,cols:o.cols,rows:o.rows}))};async function C(){if(c?.readyState!==WebSocket.OPEN){await k();return}window.confirm(`Restart the shell in ${a}? Anything running in it stops.`)&&(d=!0,_(`restarting…`),c.send(JSON.stringify({t:`restart`})))}function E(){!o||h.clientHeight===0||(s?.fit(),S())}window.addEventListener(`focus`,E),document.addEventListener(`visibilitychange`,()=>{document.hidden||E()});function O(){c?.close(),c=null,s=null,o?.dispose(),o=null,h.replaceChildren()}async function k(){let e=++u;O(),l=!1,d=!1,_(`connecting…`);let t;try{t=await uf()}catch(e){_(`could not load the terminal: ${String(e)}`,{label:`Retry`,run:()=>void k()});return}if(e!==u)return;o=new t.Terminal({fontFamily:f.fontFamily,fontSize:f.fontSize,cursorBlink:f.cursorBlink,scrollback:2e3,theme:ff}),o.open(h),pf(o),s=new t.FitAddon,o.loadAddon(s),s.observeResize(),s.fit();let n=new WebSocket(`${location.protocol===`https:`?`wss`:`ws`}://${location.host}/api/terminal?cwd=${encodeURIComponent(a)}`);n.binaryType=`arraybuffer`,c=n,n.onopen=()=>{e===u&&(_(``),S(),o?.focus())},n.onmessage=t=>{if(e!==u)return;if(typeof t.data!=`string`){o?.write(new Uint8Array(t.data));return}let r;try{r=JSON.parse(t.data)}catch{l=!0,_(`invalid terminal response`,{label:`Reconnect`,run:()=>void k()}),n.close();return}if(r.t===`exit`){if(d){d=!1,k();return}l=!0,_(`shell exited (${r.code??`?`})`,{label:`Restart`,run:()=>void k()})}else r.t===`error`&&(l=!0,_(r.message??`terminal error`,{label:`Retry`,run:()=>void k()}))},n.onclose=()=>{e!==u||l||_(`disconnected`,{label:`Reconnect`,run:()=>void k()})},o.onData(e=>{n.readyState===WebSocket.OPEN&&n.send(JSON.stringify({t:`in`,d:e}))}),o.onResize(({cols:e,rows:t})=>{n.readyState===WebSocket.OPEN&&n.send(JSON.stringify({t:`resize`,cols:e,rows:t}))})}return nr(e,e=>{let r=e?.startsWith(`/`)?e:a||n()||t()[0]||``;if(r===a&&o){x(),!l&&c&&c.readyState>WebSocket.OPEN?k():(E(),o.focus());return}if(a=r,x(),!a){_(`No project yet — pick a folder from the chip.`);return}k()},$)}var gf,_f=G(`#chat-header`),vf=G(`#chat-title`),yf=[_f,X,G(`#composer`)],bf=!0,xf=()=>bf,Sf,Cf,wf=[],Tf=new Map,Ef=`activity`,Df=[`files`,`terminal`],Of=new Map,kf={tasks:`Tasks`,activity:`Activity`,boards:`Boards`,settings:`Settings`,files:`Files`,terminal:`Terminal`},Af=e=>Sf.refresh(e),jf=()=>Cf.refresh();function Mf(){let e=wf.find(e=>e.view.visible);e?Nc(kf[e.name],!1):Nc(vf.textContent??``,gf.currentSession()!==void 0)}function Nf(e,t){if((e===`tasks`||e===`activity`)&&(Ef=e),Df.includes(e)){let t=Wf();t&&(t.kind!==`console`||t.name!==e)&&Of.set(e,t)}Kf({kind:`console`,name:e,arg:t}),Mc(),bf=!1;for(let e of yf)e.classList.add(`hidden`);ys();for(let n of wf)n.name===e?n.view.show(t):n.view.hide();for(let[t,n]of Tf)n.classList.toggle(`bg-indigo-50`,t===e||t===`activity`&&e===`tasks`);Mf()}var Pf=e=>Nf(`tasks`,e),Ff=e=>Nf(`files`,e),If=e=>Nf(`terminal`,e),Lf=(e,t)=>{wf.find(t=>t.name===e)?.view.visible?Bf(e):Nf(e,t)},Rf=e=>Lf(`files`,e),zf=e=>Lf(`terminal`,e);function Bf(e){let t=gf.currentId(),n=Of.get(e)??(t?{kind:`session`,id:t}:null);Of.delete(e),n?Kf(n):(history.replaceState(null,``,`#/`),Vf())}function Vf(){if(wf.some(({view:e})=>e.visible)){for(let{view:e}of wf)e.hide();for(let e of Tf.values())e.classList.remove(`bg-indigo-50`);bf=!0;for(let e of yf)e.classList.remove(`hidden`);ys(),Mf(),gf.maybeAckRead()}}var Hf=e=>e.kind===`session`?`#/session/${encodeURIComponent(e.id)}`:`#/${e.name}${e.arg?`/${encodeURIComponent(e.arg)}`:``}`,Uf={config:`files`,channels:`channels`,providers:`models`};function Wf(){let[e=``,t]=location.hash.replace(/^#\/?/,``).split(`/`);if(Uf[e])return{kind:`console`,name:`settings`,arg:Uf[e]};let n=wf.find(t=>t.name===e)?.name;return n?{kind:`console`,name:n,arg:t?decodeURIComponent(t):void 0}:e===`session`&&t?{kind:`session`,id:decodeURIComponent(t)}:null}var Gf=!1;function Kf(e,t=!1){if(Gf)return;let n=Hf(e);location.hash!==n&&(t?history.replaceState(null,``,n):location.hash=n)}var qf=e=>Kf({kind:`session`,id:e});function Jf(){let e=Wf(),t=gf.sessions(),n=gf.currentId(),r=(e?.kind===`session`?e.id:null)??n??(t.find(e=>e.listed)??t[0])?.id??null;Gf=!0;try{r&&r!==n&&gf.select(r),e?.kind===`console`?Nf(e.name,e.arg):Vf(),r||su()}finally{Gf=!1}e?.kind!==`console`&&r&&Kf({kind:`session`,id:r},!0)}function Yf(e){gf=e,Sf=$d(G(`#tasks-view`),()=>gf.sessions().map(({id:e,cwd:t,title:n})=>({id:e,cwd:t,title:n})),e.loadSessions,e.select,()=>gf.currentId(),e=>Nf(`activity`,e)),Cf=Vu(G(`#activity-view`),e.select,Pf),wf=[{name:`tasks`,view:Sf},{name:`activity`,view:Cf},{name:`boards`,view:Uu(G(`#boards-view`),e.select)},{name:`files`,view:ud(G(`#files-view`),()=>gf.currentSession(),e=>Nf(`files`,e),()=>Bf(`files`))},{name:`terminal`,view:hf(G(`#terminal-view`),()=>[...al(gf.sessions()).keys()],()=>gf.currentSession()?.cwd,e=>Nf(`terminal`,e),()=>Bf(`terminal`))},{name:`settings`,view:Hd(G(`#settings-view`),()=>[...al(gf.sessions()).keys()],e=>Nf(`settings`,e))}];let t=G(`#open-terminal`);t.onclick=()=>zf(),Jo(t,`meta+;`,`Terminal`,()=>zf());for(let e of[`activity`,`boards`,`settings`]){let t=G(`#open-${e}`);Tf.set(e,t),t.onclick=()=>Nf(e===`activity`?Ef:e)}let n=G(`#console-section`);n.open=localStorage.getItem(`pier.consoleCollapsed`)!==`1`,n.ontoggle=()=>localStorage.setItem(`pier.consoleCollapsed`,n.open?`0`:`1`),window.onhashchange=Jf}var Xf=[],Zf=0,Qf=null,$f=`idle`,ep=null,tp=0,np=!1;async function rp(e){let t=await w(`/api/sessions`,{cwd:e});if(!t.ok){Z(`error`,`session create failed: ${t.status}`);return}let{id:n}=await t.json();await ap(),await mp(n),ms()}function ip(e,t){let n=e.map(e=>({...e,title:S(e.title)}));if(t)Xf=n;else{let e=new Map(n.map(e=>[e.id,e]));Xf=Xf.map(t=>e.get(t.id)??(t.listed?{...t,listed:!1}:t));let t=new Set(Xf.map(e=>e.id));Xf.push(...n.filter(e=>!t.has(e.id)))}Xf.sort((e,t)=>t.createdAt-e.createdAt),Nl(),sp()}var ap=C(async()=>{ip(await D(`/api/projects`,`Could not load projects`),!1)}),op=C(async()=>{ip(await D(`/api/sessions`,`Could not load sessions`),!0)});function sp(){if(document.hidden||!document.hasFocus()||!xf())return;let e=Xf.find(e=>e.id===Qf);e?.unread&&(e.unread=!1,Nl(),fetch(`/api/sessions/${e.id}/read`,{method:`POST`}))}function cp(){return Xf.find(e=>e.id===Qf)}function lp(e,t){let n=Xf.find(t=>t.id===e);!n||n.title||!t.trim()||(n.title=t.trim().slice(0,80),Nl(),su())}function up(e){$f=e;let t=Xf.find(e=>e.id===Qf);t&&(t.state=e),Nl(),su(),vs(),e===`idle`&&ap()}function dp(e){if(!(e.sessionId!==Qf||e.seq<=tp))switch(tp=e.seq,e.type){case`turn-start`:np=!0;break;case`system-input`:Co(),Xa(e.text,e.origin,e.ts);break;case`task-status`:ca(e.run);break;case`user-message`:{let t=x(e.text).text;if(lp(e.sessionId,t),hs(t))break;Co(),Z(`user`,e.text,!1,e.ts),Ha();break}case`text-delta`:So(e.text);break;case`thinking-delta`:ka(e.ts,e.text);break;case`tool-start`:Co(),Da(e.ts,e.toolCallId,e.toolName,e.args);break;case`tool-end`:Oa(e.toolCallId,e.isError,e.output);break;case`turn-end`:np=!1,wo(e.text,e.meta),e.meta&&ou(e.meta);break;case`queue-state`:bs(e.steering,e.followUp);break;case`context-compacted`:Co(),Z(`system`,`Context compacted — ${p(e.before)} → ${p(e.after)}`,!1,e.ts),Ha();break;case`error`:Ta(),Z(`error`,e.message);break;case`state`:e.state===`idle`&&np&&(np=!1,To()),e.state===`idle`&&bs([],[]),up(e.state)}}function fp(){let e=new EventSource(`/api/events`);e.onopen=()=>void ap(),e.onerror=()=>Bo(e,`Workspace`),e.onmessage=e=>{let t=JSON.parse(e.data);if(t.type===`sessions-changed`){ap();return}if(t.type===`tasks-changed`||t.type===`task-run-changed`||t.type===`task-message-changed`||t.type===`task-group-changed`){Af(t.type===`task-run-changed`?t.taskId:void 0),jf(),t.type===`task-run-changed`&&ap();return}if(jf(),t.sessionId===Qf)return;let n=Xf.find(e=>e.id===t.sessionId);n&&(n.state=t.state,Nl())}}function pp(e,t){ep?.close();let n=new EventSource(`/api/sessions/${e}/events?after=${t}`);n.onmessage=e=>dp(JSON.parse(e.data)),n.onerror=()=>Bo(n,`Session`),ep=n}async function mp(e){let t=++Zf;Vf(),Mc(),qf(e);let n=Xf.some(t=>t.id===e);if(!(e===Qf&&n)){if(Es(),Qf=e,$f=Xf.find(t=>t.id===e)?.state??`idle`,Ds(e),Nl(),su(),sp(),n)return await hp(e);ep?.close(),Eo(),Do(!0),await op(),t===Zf&&Qf===e&&await hp(e,!Xf.some(t=>t.id===e))}}async function hp(e,t=!1){if(ep?.close(),Eo(),bs([],[]),iu(),np=!1,_s(),tp=0,Do(!0),t){Do(!1),Z(`error`,`session not found: ${e}`);return}let n=await E(`/api/sessions/${e}/history`,`failed to load session`);if(Qf!==e)return;if(!n.ok){Do(!1),Z(`error`,n.error);return}let r=n.value;Oo(r.turns,r.state,r.backgroundRuns),tp=r.lastSeq,np=r.state===`streaming`,up(r.state),bs(r.queue.steering,r.queue.followUp);let i=r.turns.reduce((e,t)=>t.meta?.completedAt??e,null);au(r.model,r.context,r.thinkingLevel,i),pp(e,r.lastSeq)}Io(),zo(),Tu();var gp=async e=>{Qf===e&&await hp(e)};Fa({sessionId:()=>Qf,sessionState:()=>$f,select:e=>void mp(e),showTasks:Pf,send:(e,t)=>void As(e,t),ownTurn:e=>{gs(e),up(`streaming`)},reload:gp}),Ns({sessionId:()=>Qf,sessionState:()=>$f,chatVisible:xf,setState:up,reload:gp}),Kc({sessionMenu:e=>{let t=cp();t&&_u(e,t)},sessionInfo:e=>{let t=cp();t&&du(e,t)}}),Gl({sessions:()=>Xf,loadSessions:op,currentId:()=>Qf,select:e=>void mp(e),sessionMenu:_u,createSession:rp,openFiles:Ff,openTerminal:If,openConsole:Nf,onPinsChanged:su}),ql({currentId:()=>Qf,currentSession:cp,createSession:e=>void rp(e),syncBar:Mf,openFiles:Ff,toggleFiles:Rf}),Yf({sessions:()=>Xf,loadSessions:op,currentId:()=>Qf,currentSession:cp,select:e=>void mp(e),maybeAckRead:sp}),Iu(`0.0.16`),Js(),document.addEventListener(`visibilitychange`,sp),window.addEventListener(`focus`,sp),fp(),ap().then(Jf);export{rf as t};
93
+ <th class="w-[14%] px-2 py-2 font-semibold">Last result</th><th class="px-2 py-2 font-semibold"></th></tr></thead>`;let s=document.createElement(`tbody`);for(let e of o)s.append(b(e));a.append(s),e.replaceChildren(g(`Tasks`,[t]),r,K(`div`,`min-h-0 flex-1 overflow-auto`,a))}function b(e){let t=document.createElement(`tr`);t.className=`cursor-pointer border-b border-neutral-100 hover:bg-neutral-50`,t.onclick=()=>{c=e.id,x(e.id)};let n=e.archived?`Archived`:e.enabled?`Enabled`:`Paused`;t.append(K(`td`,`truncate py-2.5 pl-4 pr-2`,K(`div`,`truncate font-medium`,e.name),K(`div`,`text-[11px] text-neutral-400`,n)));for(let n of[nf(e),tf(e),Xd(e.nextRunAt),e.lastRun?`${e.lastRun.state} · ${Zd(e.lastRun)}`:`-`])t.append(K(`td`,`truncate px-2 py-2.5`,n));let r=q(`Run`);return r.disabled=e.archived,r.onclick=t=>{t.stopPropagation(),T(e.id)},t.append(K(`td`,`px-2 py-1 text-right`,r)),t}async function x(t){let[r,i]=await Promise.all([E(`/api/tasks/${t}`,`Failed to load task`),E(`/api/tasks/${t}/runs`,`Failed to load the task's runs`)]);if(!r.ok)return f(r.error);if(!i.ok)return f(i.error);let a=r.value,o=i.value,s=q(`Tasks`);s.className=`cursor-pointer text-neutral-500 hover:underline`,s.onclick=v;let c=K(`span`,`flex min-w-0 items-center gap-1.5`,s,K(`span`,`text-neutral-400`,`›`),K(`span`,`truncate font-medium`,a.name)),l=q(`Run now`,!0);l.disabled=a.archived,l.onclick=()=>void T(a.id);let u=q(a.enabled?`Pause`:`Resume`);u.disabled=a.archived||a.trigger.type===`manual`,u.onclick=()=>void D(`/api/tasks/${a.id}/${a.enabled?`pause`:`resume`}`);let d=q(`Edit`);d.disabled=a.archived,d.onclick=()=>void n().then(()=>Jd(m,a));let p=q(`Archive`);p.disabled=a.archived,p.onclick=()=>void D(`/api/tasks/${a.id}/archive`);let y=K(`div`,`flex flex-none gap-1 border-b border-neutral-200 px-4 py-2`),b=q(`Definition`),x=q(`Runs (${o.length})`),C=K(`div`,`min-h-0 flex-1 overflow-auto`),w=()=>{b.classList.add(`bg-neutral-200`),x.classList.remove(`bg-neutral-200`),S(C,a)};b.onclick=w,x.onclick=()=>{x.classList.add(`bg-neutral-200`),b.classList.remove(`bg-neutral-200`),Qd(C,o,h)},y.append(b,x),e.replaceChildren(g(c,[l,u,d,p]),_(),y,C),o.length?x.click():w()}function S(e,t){let n=K(`div`,`grid max-w-4xl grid-cols-[9.375rem_minmax(0,1fr)] gap-x-5 gap-y-3 p-4 text-[13px]`),i=[[`Status`,t.archived?`Archived`:t.enabled?`Enabled`:`Paused`],[`Trigger`,tf(t)],[`Action`,nf(t)],[`Timeout`,`${t.timeoutSeconds}s`],[`Next run`,Xd(t.nextRunAt)],[`Revision`,String(t.revision)],[`Created by`,t.createdBySessionId??t.creator],[`Callback`,t.callback.type===`session`?t.callback.sessionId:t.callback.type],[`Description`,t.description||`-`]];t.action.type===`agent`&&(i.push([`Session policy`,t.action.session.mode]),t.action.session.mode===`reuse`&&i.push([`Session`,t.action.session.sessionId]),t.action.session.mode===`fresh`&&i.push([`Directory`,t.action.session.cwd]),t.action.session.mode===`fork`&&i.push([`Directory`,t.action.session.cwd??`Caller project`]),t.action.launch?.model&&i.push([`Model`,`${t.action.launch.model.provider}/${t.action.launch.model.id}`]),t.action.launch?.thinking&&i.push([`Thinking`,t.action.launch.thinking]),i.push([`Prompt`,t.action.prompt])),t.action.type===`bash`&&i.push([`Directory`,t.action.cwd],[`Script`,t.action.script]),t.action.type===`task`&&i.push([`Target task`,t.action.taskId]),t.trigger.type===`watch`&&i.push([`Probe`,t.trigger.script]);for(let[e,t]of i)n.append(K(`span`,`text-[11px] font-semibold uppercase text-neutral-400`,e),K(`pre`,`whitespace-pre-wrap break-words font-mono text-[12.5px]`,t));if(t.action.type===`agent`&&t.action.session.mode===`reuse`){let{sessionId:e}=t.action.session,i=q(`Open session`);i.onclick=()=>r(e),n.append(K(`span`,``,``),i)}e.replaceChildren(n)}async function T(e){let t=await w(`/api/tasks/${e}/run`,{sourceSessionId:i()});if(!t.ok)return f((await t.json()).error??`Failed to run task`);c=e,await x(e)}async function D(e){let t=await fetch(e,{method:`POST`});if(!t.ok)return f((await t.json()).error??`Task update failed`);await d()}let O=rr(e,e=>{e&&(c=e),d()});return Object.assign(O,{refresh(e){O.visible&&(!c||!e||c===e)&&d()}})}var af=`modulepreload`,of=function(e){return`/`+e},sf={},cf=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=of(t,n),t=s(t),t in sf)return;sf[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:af,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},lf=`pier.terminalPrefs`,uf={fontFamily:`monospace`,fontSize:14,cursorBlink:!0},df=()=>{try{let e=JSON.parse(localStorage.getItem(lf)??`null`),t=typeof e?.fontSize==`number`?e.fontSize:uf.fontSize;return{fontFamily:typeof e?.fontFamily==`string`&&e.fontFamily.trim()?e.fontFamily.slice(0,200):uf.fontFamily,fontSize:Math.round(Math.max(10,Math.min(24,t))),cursorBlink:typeof e?.cursorBlink==`boolean`?e.cursorBlink:uf.cursorBlink}}catch{return{...uf}}},ff=e=>localStorage.setItem(lf,JSON.stringify(e)),pf=null,mf=()=>(pf||=cf(()=>import(`./ghostty-web-CV7F9_iW.js`).then(async e=>(await e.init(),e)),[]).catch(e=>{throw pf=null,e}),pf),hf=()=>{let e=()=>void mf().catch(e=>{console.warn(`terminal: emulator warm-up failed`,e)});`requestIdleCallback`in window?requestIdleCallback(e,{timeout:1e4}):setTimeout(e,3e3)},gf={background:`#1a1b26`,foreground:`#a9b1d6`,cursor:`#c0caf5`};function _f(e){let t=e.renderer,n=document.createElement(`canvas`).getContext(`2d`);if(!n||typeof t?.remeasureFont!=`function`){console.warn(`terminal: could not correct cell metrics — rows will render tight`);return}t.measureFont=()=>{let{fontSize:t,fontFamily:r}=e.options;n.font=`${t}px ${r}`;let i=n.measureText(`M`),a=i.fontBoundingBoxAscent||i.actualBoundingBoxAscent||t*.8,o=i.fontBoundingBoxDescent||i.actualBoundingBoxDescent||t*.25;return{width:Math.ceil(i.width),height:Math.ceil(a+o),baseline:Math.ceil(a)}},t.remeasureFont()}var vf=`w-full rounded border border-neutral-300 px-2 py-1.5 font-mono text-[12px] outline-none focus:border-indigo-400`;function yf(e,t,n,r,i){hf();let a=``,o=null,s=null,c=null,l=!1,u=0,d=!1,f=df(),p=K(`div`,`ml-auto flex min-w-0 flex-none items-center gap-2`),m=K(`header`,`flex h-10 flex-none items-center gap-2 border-b border-neutral-200 bg-white px-3`),h=K(`div`,`min-h-0 flex-1 overflow-hidden p-1`);h.style.background=gf.background,h.setAttribute(`data-owns-keyboard`,``),h.addEventListener(`keydown`,e=>{e.metaKey&&!e.defaultPrevented&&e.stopImmediatePropagation()},!0),h.addEventListener(`scroll`,()=>{h.scrollTop=0,h.scrollLeft=0}),h.addEventListener(`compositionend`,()=>{for(let e=h.childNodes.length-1;e>=0;e--){let t=h.childNodes[e];t&&t.nodeName!==`CANVAS`&&t.nodeName!==`TEXTAREA`&&t.remove()}}),e.append(m,h);let g=e=>{let t=K(`button`,`min-w-0 max-w-72 cursor-pointer truncate rounded-md bg-neutral-100 px-2 py-0.5 text-left font-mono text-[11.5px] text-neutral-600 hover:bg-neutral-200`,e);return t.type=`button`,t};function _(e,t){if(p.replaceChildren(),e&&p.append(K(`span`,`min-w-0 truncate text-[11.5px] text-neutral-400`,e)),t){let e=g(t.label);e.className=e.className.replace(`bg-neutral-100`,`bg-indigo-50 font-medium text-indigo-700 hover:bg-indigo-100`),e.onclick=t.run,p.append(e)}}function v(){o&&(o.options.fontFamily=f.fontFamily,o.options.fontSize=f.fontSize,o.options.cursorBlink=f.cursorBlink,requestAnimationFrame(E))}function y(){let e=document.createElement(`input`);e.type=`text`,e.placeholder=`tmux new -As "$(basename $PWD)"`,e.spellcheck=!1,e.autocomplete=`off`,e.autocapitalize=`off`,e.disabled=!0,e.className=`${vf} disabled:bg-neutral-50`;let t=K(`span`,`block text-[11.5px] text-neutral-400`,`loading…`),n=(e,n)=>{t.isConnected?Y(t,e,n):e===`failed`&&_(n)},r=``;(async()=>{try{r=(await D(`/api/settings`,`Could not load the startup command`)).terminalInitCommand??``,e.value=r,e.disabled=!1,n(`idle`,`Runs when a shell starts — Restart applies it here.`)}catch(e){n(`failed`,String(e))}})();let i=async()=>{let t=e.value.trim();if(!(e.disabled||t===r)){n(`saving`,`saving…`);try{let i=await w(`/api/settings`,{terminalInitCommand:t},`PUT`);if(!i.ok)return n(`failed`,await T(i,`Could not save the startup command`));r=(await i.json()).terminalInitCommand,e.value=r,n(`saved`,r?`Saved — the next shell runs it.`:`Cleared.`)}catch(e){n(`failed`,`Could not save the startup command: ${String(e)}`)}}};return e.onblur=()=>void i(),e.onkeydown=e=>{e.key===`Enter`&&i()},K(`div`,`space-y-1.5 border-t border-neutral-200 pt-2.5`,K(`div`,``,K(`span`,`text-[12px] font-semibold text-neutral-700`,`Startup command`),K(`span`,`block text-[11px] text-neutral-400`,`This Pier, every shell — not only this browser.`)),e,t)}function b(e){let t=document.createElement(`input`);t.type=`text`,t.value=f.fontFamily,t.setAttribute(`list`,`terminal-font-presets`),t.className=vf;let n=document.createElement(`datalist`);n.id=`terminal-font-presets`;for(let e of[`monospace`,`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace`,`JetBrains Mono, monospace`,`Cascadia Mono, monospace`,`Fira Code, monospace`]){let t=document.createElement(`option`);t.value=e,n.append(t)}let r=document.createElement(`input`);r.type=`number`,r.min=`10`,r.max=`24`,r.step=`1`,r.value=String(f.fontSize),r.className=`w-20 rounded border border-neutral-300 px-2 py-1.5 text-[12px] outline-none focus:border-indigo-400`;let i=document.createElement(`input`);i.type=`checkbox`,i.checked=f.cursorBlink,i.className=`h-4 w-4 accent-indigo-600`;let a=()=>{let e=t.value.trim(),n=Number(r.value);!e||!Number.isFinite(n)||(f={fontFamily:e.slice(0,200),fontSize:Math.round(Math.max(10,Math.min(24,n))),cursorBlink:i.checked},r.value=String(f.fontSize),ff(f),v())};t.oninput=a,r.oninput=a,i.onchange=a;let o=K(`button`,`cursor-pointer text-[12px] text-neutral-500 hover:text-indigo-700`,`Reset`);o.type=`button`,o.onclick=()=>{f={...uf},t.value=f.fontFamily,r.value=String(f.fontSize),i.checked=f.cursorBlink,ff(f),v()},cc(e,K(`div`,`w-72 space-y-3 px-3 py-2.5`,K(`div`,`flex items-center`,K(`span`,`text-[12px] font-semibold text-neutral-700`,`Terminal`),K(`span`,`ml-auto`,o)),K(`label`,`block space-y-1 text-[11.5px] text-neutral-500`,K(`span`,``,`Font family`),t,n),K(`label`,`flex items-center justify-between text-[11.5px] text-neutral-500`,K(`span`,``,`Font size`),r),K(`label`,`flex cursor-pointer items-center justify-between text-[11.5px] text-neutral-500`,K(`span`,``,`Blinking cursor`),i),y()))}function x(){let e=g(a||`Choose a folder…`);e.title=`Switch folder`,e.onclick=()=>wc(e,t().map(e=>({path:e})),a||void 0,e=>e===a?void 0:r(e));let n=g(`Fit`);n.title=`Resize the shell to this window`,n.onclick=()=>{E(),o?.focus()};let s=g(`Restart`);s.title=`End this shell and start a new one`,s.onclick=()=>void C();let c=K(`button`,`icon-btn text-[15px]`,`⚙`);c.type=`button`,c.title=`Terminal settings`,c.setAttribute(`aria-label`,`Terminal settings`),c.onclick=()=>b(c);let l=K(`button`,`icon-btn`,`✕`);l.type=`button`,l.title=`Close Terminal`,l.setAttribute(`aria-label`,`Close Terminal`),l.onclick=i,m.replaceChildren(e,p,n,s,c,l)}let S=()=>{o&&c?.readyState===WebSocket.OPEN&&c.send(JSON.stringify({t:`resize`,cols:o.cols,rows:o.rows}))};async function C(){if(c?.readyState!==WebSocket.OPEN){await k();return}window.confirm(`Restart the shell in ${a}? Anything running in it stops.`)&&(d=!0,_(`restarting…`),c.send(JSON.stringify({t:`restart`})))}function E(){!o||h.clientHeight===0||(s?.fit(),S())}window.addEventListener(`focus`,E),document.addEventListener(`visibilitychange`,()=>{document.hidden||E()});function O(){c?.close(),c=null,s=null,o?.dispose(),o=null,h.replaceChildren()}async function k(){let e=++u;O(),l=!1,d=!1,_(`connecting…`);let t;try{t=await mf()}catch(e){_(`could not load the terminal: ${String(e)}`,{label:`Retry`,run:()=>void k()});return}if(e!==u)return;o=new t.Terminal({fontFamily:f.fontFamily,fontSize:f.fontSize,cursorBlink:f.cursorBlink,scrollback:2e3,theme:gf}),o.open(h),_f(o),s=new t.FitAddon,o.loadAddon(s),s.observeResize(),s.fit();let n=new WebSocket(`${location.protocol===`https:`?`wss`:`ws`}://${location.host}/api/terminal?cwd=${encodeURIComponent(a)}`);n.binaryType=`arraybuffer`,c=n,n.onopen=()=>{e===u&&(_(``),S(),o?.focus())},n.onmessage=t=>{if(e!==u)return;if(typeof t.data!=`string`){o?.write(new Uint8Array(t.data));return}let r;try{r=JSON.parse(t.data)}catch{l=!0,_(`invalid terminal response`,{label:`Reconnect`,run:()=>void k()}),n.close();return}if(r.t===`exit`){if(d){d=!1,k();return}l=!0,_(`shell exited (${r.code??`?`})`,{label:`Restart`,run:()=>void k()})}else r.t===`error`&&(l=!0,_(r.message??`terminal error`,{label:`Retry`,run:()=>void k()}))},n.onclose=()=>{e!==u||l||_(`disconnected`,{label:`Reconnect`,run:()=>void k()})},o.onData(e=>{n.readyState===WebSocket.OPEN&&n.send(JSON.stringify({t:`in`,d:e}))}),o.onResize(({cols:e,rows:t})=>{n.readyState===WebSocket.OPEN&&n.send(JSON.stringify({t:`resize`,cols:e,rows:t}))})}return rr(e,e=>{let r=e?.startsWith(`/`)?e:a||n()||t()[0]||``;if(r===a&&o){x(),!l&&c&&c.readyState>WebSocket.OPEN?k():(E(),o.focus());return}if(a=r,x(),!a){_(`No project yet — pick a folder from the chip.`);return}k()},$)}var bf,xf=G(`#chat-header`),Sf=G(`#chat-title`),Cf=[xf,X,G(`#composer`)],wf=!0,Tf=()=>wf,Ef,Df,Of=[],kf=new Map,Af=`activity`,jf=[`files`,`terminal`],Mf=new Map,Nf={tasks:`Tasks`,activity:`Activity`,boards:`Boards`,settings:`Settings`,files:`Files`,terminal:`Terminal`},Pf=e=>Ef.refresh(e),Ff=()=>Df.refresh();function If(){let e=Of.find(e=>e.view.visible);e?Pc(Nf[e.name],!1):Pc(Sf.textContent??``,bf.currentSession()!==void 0)}function Lf(e,t){if((e===`tasks`||e===`activity`)&&(Af=e),jf.includes(e)){let t=Jf();t&&(t.kind!==`console`||t.name!==e)&&Mf.set(e,t)}Xf({kind:`console`,name:e,arg:t}),Nc(),wf=!1;for(let e of Cf)e.classList.add(`hidden`);bs();for(let n of Of)n.name===e?n.view.show(t):n.view.hide();for(let[t,n]of kf)n.classList.toggle(`bg-indigo-50`,t===e||t===`activity`&&e===`tasks`);If()}var Rf=e=>Lf(`tasks`,e),zf=e=>Lf(`files`,e),Bf=e=>Lf(`terminal`,e),Vf=(e,t)=>{Of.find(t=>t.name===e)?.view.visible?Wf(e):Lf(e,t)},Hf=e=>Vf(`files`,e),Uf=e=>Vf(`terminal`,e);function Wf(e){let t=bf.currentId(),n=Mf.get(e)??(t?{kind:`session`,id:t}:null);Mf.delete(e),n?Xf(n):(history.replaceState(null,``,`#/`),Gf())}function Gf(){if(Of.some(({view:e})=>e.visible)){for(let{view:e}of Of)e.hide();for(let e of kf.values())e.classList.remove(`bg-indigo-50`);wf=!0;for(let e of Cf)e.classList.remove(`hidden`);bs(),If(),bf.maybeAckRead()}}var Kf=e=>e.kind===`session`?`#/session/${encodeURIComponent(e.id)}`:`#/${e.name}${e.arg?`/${encodeURIComponent(e.arg)}`:``}`,qf={config:`files`,channels:`channels`,providers:`models`};function Jf(){let[e=``,t]=location.hash.replace(/^#\/?/,``).split(`/`);if(qf[e])return{kind:`console`,name:`settings`,arg:qf[e]};let n=Of.find(t=>t.name===e)?.name;return n?{kind:`console`,name:n,arg:t?decodeURIComponent(t):void 0}:e===`session`&&t?{kind:`session`,id:decodeURIComponent(t)}:null}var Yf=!1;function Xf(e,t=!1){if(Yf)return;let n=Kf(e);location.hash!==n&&(t?history.replaceState(null,``,n):location.hash=n)}var Zf=e=>Xf({kind:`session`,id:e});function Qf(){let e=Jf(),t=bf.sessions(),n=bf.currentId(),r=(e?.kind===`session`?e.id:null)??n??(t.find(e=>e.listed)??t[0])?.id??null;Yf=!0;try{r&&r!==n&&bf.select(r),e?.kind===`console`?Lf(e.name,e.arg):Gf(),r||uu()}finally{Yf=!1}e?.kind!==`console`&&r&&Xf({kind:`session`,id:r},!0)}function $f(e){bf=e,Ef=rf(G(`#tasks-view`),()=>bf.sessions().map(({id:e,cwd:t,title:n})=>({id:e,cwd:t,title:n})),e.loadSessions,e.select,()=>bf.currentId(),e=>Lf(`activity`,e)),Df=Wu(G(`#activity-view`),e.select,Rf),Of=[{name:`tasks`,view:Ef},{name:`activity`,view:Df},{name:`boards`,view:Ku(G(`#boards-view`),e.select)},{name:`files`,view:pd(G(`#files-view`),()=>bf.currentSession(),e=>Lf(`files`,e),()=>Wf(`files`))},{name:`terminal`,view:yf(G(`#terminal-view`),()=>[...ol(bf.sessions()).keys()],()=>bf.currentSession()?.cwd,e=>Lf(`terminal`,e),()=>Wf(`terminal`))},{name:`settings`,view:Kd(G(`#settings-view`),()=>[...ol(bf.sessions()).keys()],e=>Lf(`settings`,e))}];let t=G(`#open-terminal`);t.onclick=()=>Uf(),Yo(t,`meta+;`,`Terminal`,()=>Uf());for(let e of[`activity`,`boards`,`settings`]){let t=G(`#open-${e}`);kf.set(e,t),t.onclick=()=>Lf(e===`activity`?Af:e)}let n=G(`#console-section`);n.open=localStorage.getItem(`pier.consoleCollapsed`)!==`1`,n.ontoggle=()=>localStorage.setItem(`pier.consoleCollapsed`,n.open?`0`:`1`),window.onhashchange=Qf}var ep=[],tp=0,np=null,rp=`idle`,ip=null,ap=0,op=!1;async function sp(e){Gf(),Nc(),np=null,ip?.close(),Do(),au(),lu(e),Oo(!0);let t=await w(`/api/sessions`,{cwd:e});if(!t.ok){Oo(!1),lu(null),Z(`error`,`session create failed: ${t.status}`);return}let{id:n}=await t.json(),{repo:r,branch:i}=ep.find(t=>t.cwd===e)??{};ep.unshift({id:n,cwd:e,createdAt:Date.now(),state:`idle`,listed:!0,unread:!1,channel:`web`,activeRuns:0,repo:r,branch:i}),await vp(n),hs()}function cp(e,t){let n=e.map(e=>({...e,title:S(e.title)}));if(t)ep=n;else{let e=new Map(n.map(e=>[e.id,e]));ep=ep.map(t=>e.get(t.id)??(t.listed?{...t,listed:!1}:t));let t=new Set(ep.map(e=>e.id));ep.push(...n.filter(e=>!t.has(e.id)))}ep.sort((e,t)=>t.createdAt-e.createdAt),Pl(),dp()}var lp=C(async()=>{cp(await D(`/api/projects`,`Could not load projects`),!1)}),up=C(async()=>{cp(await D(`/api/sessions`,`Could not load sessions`),!0)});function dp(){if(document.hidden||!document.hasFocus()||!Tf())return;let e=ep.find(e=>e.id===np);e?.unread&&(e.unread=!1,Pl(),fetch(`/api/sessions/${e.id}/read`,{method:`POST`}))}function fp(){return ep.find(e=>e.id===np)}function pp(e,t){let n=ep.find(t=>t.id===e);!n||n.title||!t.trim()||(n.title=t.trim().slice(0,80),Pl(),uu())}function mp(e){rp=e;let t=ep.find(e=>e.id===np);t&&(t.state=e),Pl(),uu(),ys(),e===`idle`&&lp()}function hp(e){if(!(e.sessionId!==np||e.seq<=ap))switch(ap=e.seq,e.type){case`turn-start`:op=!0;break;case`system-input`:wo(),Za(e.text,e.origin,e.ts);break;case`task-status`:la(e.run);break;case`user-message`:{let t=x(e.text).text;if(pp(e.sessionId,t),gs(t))break;wo(),Z(`user`,e.text,!1,e.ts),Ua();break}case`text-delta`:Co(e.text);break;case`thinking-delta`:Aa(e.ts,e.text);break;case`tool-start`:wo(),Oa(e.ts,e.toolCallId,e.toolName,e.args);break;case`tool-end`:ka(e.toolCallId,e.isError,e.output);break;case`turn-end`:op=!1,To(e.text,e.meta),e.meta&&su(e.meta);break;case`queue-state`:xs(e.steering,e.followUp);break;case`context-compacted`:wo(),Z(`system`,`Context compacted — ${p(e.before)} → ${p(e.after)}`,!1,e.ts),Ua();break;case`error`:Ea(),Z(`error`,e.message);break;case`state`:e.state===`idle`&&op&&(op=!1,Eo()),e.state===`idle`&&xs([],[]),mp(e.state)}}function gp(){let e=new EventSource(`/api/events`);e.onopen=()=>void lp(),e.onerror=()=>Vo(e,`Workspace`),e.onmessage=e=>{let t=JSON.parse(e.data);if(t.type===`sessions-changed`){lp();return}if(t.type===`tasks-changed`||t.type===`task-run-changed`||t.type===`task-message-changed`||t.type===`task-group-changed`){Pf(t.type===`task-run-changed`?t.taskId:void 0),Ff(),t.type===`task-run-changed`&&lp();return}if(Ff(),t.sessionId===np)return;let n=ep.find(e=>e.id===t.sessionId);n&&(n.state=t.state,Pl())}}function _p(e,t){ip?.close();let n=new EventSource(`/api/sessions/${e}/events?after=${t}`);n.onmessage=e=>hp(JSON.parse(e.data)),n.onerror=()=>Vo(n,`Session`),ip=n}async function vp(e){let t=++tp;Gf(),Nc(),Zf(e);let n=ep.some(t=>t.id===e);if(!(e===np&&n)){if(Ds(),np=e,rp=ep.find(t=>t.id===e)?.state??`idle`,Os(e),Pl(),uu(),dp(),n)return await yp(e);ip?.close(),Do(),Oo(!0),await up(),t===tp&&np===e&&await yp(e,!ep.some(t=>t.id===e))}}async function yp(e,t=!1){if(ip?.close(),Do(),xs([],[]),au(),op=!1,vs(),ap=0,Oo(!0),t){Oo(!1),Z(`error`,`session not found: ${e}`);return}let n=await E(`/api/sessions/${e}/history`,`failed to load session`);if(np!==e)return;if(!n.ok){Oo(!1),Z(`error`,n.error);return}let r=n.value;ko(r.turns,r.state,r.backgroundRuns),ap=r.lastSeq,op=r.state===`streaming`,mp(r.state),xs(r.queue.steering,r.queue.followUp);let i=r.turns.reduce((e,t)=>t.meta?.completedAt??e,null);ou(r.model,r.context,r.thinkingLevel,i),_p(e,r.lastSeq)}Lo(),Bo(),Ou();var bp=async e=>{np===e&&await yp(e)};Ia({sessionId:()=>np,sessionState:()=>rp,select:e=>void vp(e),showTasks:Rf,send:(e,t)=>void js(e,t),ownTurn:e=>{_s(e),mp(`streaming`)},reload:bp}),Ps({sessionId:()=>np,sessionState:()=>rp,chatVisible:Tf,setState:mp,reload:bp}),qc({sessionMenu:e=>{let t=fp();t&&bu(e,t)},sessionInfo:e=>{let t=fp();t&&mu(e,t)}}),Kl({sessions:()=>ep,loadSessions:up,currentId:()=>np,select:e=>void vp(e),sessionMenu:bu,createSession:sp,openFiles:zf,openTerminal:Bf,openConsole:Lf,onPinsChanged:uu}),Jl({currentId:()=>np,currentSession:fp,createSession:e=>void sp(e),syncBar:If,openFiles:zf,toggleFiles:Hf}),$f({sessions:()=>ep,loadSessions:up,currentId:()=>np,currentSession:fp,select:e=>void vp(e),maybeAckRead:dp}),zu(`0.0.17`),Ys(),document.addEventListener(`visibilitychange`,dp),window.addEventListener(`focus`,dp),gp(),lp().then(Qf);export{cf as t};