prreviewbuddy 0.95.2 → 0.96.2
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.
- package/CHANGELOG.md +69 -0
- package/dist/main.js +1 -1
- package/dist/{mcp_tools-DDbcXys2.js → mcp_tools-DmQKsAkC.js} +378 -11
- package/dist/server.js +10641 -8611
- package/package.json +1 -1
- package/static/chunk-C0JUspm9.js +1 -0
- package/static/{chunk-Cum6sHaC.js → chunk-CZ1YsjDz.js} +1 -1
- package/static/{chunk-D1LBeOJc.js → chunk-DLCpB0qV.js} +1 -1
- package/static/chunk-SPHga_7I.js +5 -0
- package/static/help.js +1 -1
- package/static/notifications.js +1 -1
- package/static/reviews.js +1 -1
- package/static/runs.js +1 -1
- package/static/settings.js +1 -1
- package/static/shell.css +292 -0
- package/static/workspace.js +85 -89
- package/static/chunk-CQIPqX7U.js +0 -1
- package/static/chunk-Cs33-tV3.js +0 -1
package/static/workspace.js
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["chunk-D6oLtkSC.js","chunk-CvSN2dS5.js","chunk-DsF7k-Jl.js","chunk-BWjKdrB5.js","chunk-hePW80VL.js","chunk-DIEkEPeW.js","chunk-D7hFEgee.js","chunk-B2kMZj3m.js","chunk-BXful7fw.js","chunk-9OYdRhXM.js","chunk-DyBGMc4d.js","chunk-D71XVZIg.js","chunk-Dy-Kn_BL.js","chunk-B-Up-Dum.js","chunk-CCkeMk9N.js","chunk-DwHSAwhM.js","chunk-fybaL0A-.js","chunk-BifhSqXX.js","chunk-DS17s2tU.js","chunk-Baon_ihZ.js","chunk-CAnKkQXq.js","chunk-LbU1hoFO.js","chunk-BzbQS41l.js","chunk-BsjqnLg3.js","chunk-BtIQNnN0.js","chunk-D3KKoC5L.js","chunk-CP0rg-5b.js","chunk-j_1H8WHN.js","chunk-BOvsFOI6.js","chunk-CqHdAlCp.js","chunk-DijMHRDA.js","chunk-D2pwppYQ.js","chunk-Cjc271yU.js","chunk-B2PgDgse.js","chunk-D95j_xjm.js","chunk-Cv3JjNkX.js","chunk-EIJEcyW-.js","chunk-C3nvJp0N.js","chunk-D2NZorQR.js","chunk-NzFayA7r.js","chunk-AdYjtsZU.js","chunk-pNSm1SyV.js","chunk-c-cg1wCO.js","chunk-CBrdyqSx.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{
|
|
3
|
-
`)){let c=o;if(o+=s.length+1,r){let e=
|
|
4
|
-
`);n.push(a===void 0?{code:e}:{code:e,diagram:{label:`Mermaid diagram: ${a??
|
|
5
|
-
`),blocks:n}}function
|
|
6
|
-
`).map(e=>e.trim()),n=0;if(t.find(e=>e)===`---`){let e=t.indexOf(`---`),r=t.indexOf(`---`,e+1);n=r===-1?t.length:r+1}return t.slice(n).find(e=>e&&!e.startsWith(`%%`))?.split(/\s+/)[0]||`diagram`}function
|
|
7
|
-
`)){let e=o.trim();if(s){if(e){s.push(
|
|
8
|
-
`)),s=null}if(!e){a&&!r.length&&!i.length?a.gap=!0:c();continue}if(a?.items.length){let t=a.items[a.items.length-1],n=t.blocks[t.blocks.length-1],r=typeof n==`string`?null:n,i=r?.items[r.items.length-1]??null,s=
|
|
9
|
-
`)),n.join(``)}function
|
|
2
|
+
import{Ct as e,J as t,U as n,Y as r,_t as i,a,at as o,bt as s,c,dt as l,ft as u,ht as d,it as f,l as p,m,mt as h,o as g,ot as _,pt as v,s as y,t as ee,ut as b,vt as x,yt as S}from"./chunk-C0JUspm9.js";import{A as te,C as ne,D as re,E as ie,F as ae,I as oe,L as se,M as ce,N as le,O as ue,P as de,S as fe,T as pe,a as me,c as he,d as ge,f as _e,g as ve,i as ye,j as be,k as xe,l as Se,n as Ce,o as we,r as Te,s as Ee,t as De,u as Oe,v as ke,w as Ae,x as je}from"./chunk-SPHga_7I.js";import{t as C}from"./chunk-CvSN2dS5.js";import{i as Me,n as Ne,r as Pe,t as Fe}from"./chunk-DLCpB0qV.js";import{t as Ie}from"./chunk-Dv0Wowan.js";import{t as Le}from"./chunk-C8kkSv38.js";function w(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function Re(e){return w(e).replace(/`([^`\n]+)`/g,`<code>$1</code>`)}var ze=`pr-helper-code-block`,Be=`pr-helper-code-copy`,Ve=/^\u0002(\d+)\u0002/,He=/^(?:https?:\/\/|#)/i,Ue=/^https:\/\//i,We=/^(?:image|img|screenshot|screen ?shot|picture|photo|pic)$/i,Ge=/\.(?:png|jpe?g|gif|webp|svg|bmp|heic|avif|tiff?)$/i;function Ke(e){let t=(e??``).trim();return!t||We.test(t)||Ge.test(t)?`View attached image`:`View image: ${t}`}function qe(e,t){return Ue.test(e)?`<a href="${e}" target="_blank" rel="noopener noreferrer">${t}</a>`:null}function Je(e,t){return qe(w((e??``).trim()),w(t))}var T=e=>/^(?:left|right|center|justify)$/i.test(e)?e.toLowerCase():null,Ye=e=>/^[1-9]\d{0,2}$/.test(e)?e:null,Xe=e=>/^\d{1,9}$/.test(e)?e:null,Ze=e=>e.slice(0,300),Qe=new Map(Object.entries({a:{href:e=>{let t=e.trim();return He.test(t)?t:null},title:Ze},abbr:{title:Ze},b:{},blockquote:{},br:{},caption:{align:T},cite:{},code:{},dd:{},del:{},details:{},div:{align:T},dl:{},dt:{},em:{},hr:{},i:{},ins:{},kbd:{},li:{},mark:{},ol:{start:Xe},p:{align:T},q:{},s:{},samp:{},small:{},span:{},strike:{},strong:{},sub:{},summary:{},sup:{},table:{align:T},tbody:{},td:{align:T,colspan:Ye,rowspan:Ye},tfoot:{},th:{align:T,colspan:Ye,rowspan:Ye},thead:{},tr:{align:T},u:{},ul:{},var:{},h1:{align:T},h2:{align:T},h3:{align:T},h4:{align:T},h5:{align:T},h6:{align:T}}).map(([e,t])=>[e,new Map(Object.entries({title:Ze,...t}))])),$e=new Set([`br`,`hr`,`img`,`input`,`source`,`meta`,`link`,`base`,`wbr`,`col`,`area`,`track`,`param`,`embed`]),et=new Set([`script`,`style`,`iframe`,`object`,`embed`,`svg`,`math`,`template`,`noscript`,`textarea`,`frame`,`frameset`,`applet`,`head`,`title`,`select`]),tt=new Set(`picture.pre.source.track.input.form.label.button.option.optgroup.font.center.section.article.header.footer.nav.figure.figcaption.main.aside.html.body.meta.link.base.wbr.col.colgroup.area.map.param.fieldset.legend.dialog`.split(`.`)),nt=new Set(`address.article.aside.blockquote.caption.center.dd.details.dialog.div.dl.dt.fieldset.figcaption.figure.footer.form.h1.h2.h3.h4.h5.h6.header.hr.li.main.nav.ol.p.pre.section.summary.table.tbody.td.tfoot.th.thead.tr.ul`.split(`.`)),rt=new RegExp(["`[^`\\n]+`",`<(\\/?)([A-Za-z][A-Za-z0-9-]*)((?:\\s+[^\\s"'<>\\/=]+(?:\\s*=\\s*(?:"[^"]*"|'[^']*'|[^\\s"'=<>\`]+))?)*)\\s*(\\/?)>`,`&(?:#\\d{1,7}|#[xX][0-9a-fA-F]{1,6}|[A-Za-z][A-Za-z0-9]{1,31});`].join(`|`),`g`),it=/([^\s"'<>/=]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'=<>`]+)))?/g;function at(e){return e.replace(/&(#\d{1,7}|#[xX][0-9a-fA-F]{1,6}|amp|lt|gt|quot|apos|nbsp);/g,(e,t)=>{if(t[0]===`#`){let e=t[1]===`x`||t[1]===`X`?parseInt(t.slice(2),16):parseInt(t.slice(1),10);return e>0&&e<=1114111?String.fromCodePoint(e):``}return{amp:`&`,lt:`<`,gt:`>`,quot:`"`,apos:`'`,nbsp:`\xA0`}[t]??``})}function ot(e){let t=new Map;for(let n of e.matchAll(it)){let e=n[1].toLowerCase();t.has(e)||t.set(e,at(n[2]??n[3]??n[4]??``))}return t}function st(e){let t=e.match(/^h([1-6])$/);return t?`h${Math.min(Number(t[1]),3)+3}`:e}function ct(e,t){let n=st(e),r=Qe.get(e),i=[];for(let[e,n]of ot(t)){let t=r.get(e),a=t?t(n):null;a!==null&&i.push(` ${e}="${w(a)}"`)}return e===`a`&&i.some(e=>e.startsWith(` href=`))&&i.push(` target="_blank" rel="noopener noreferrer"`),`<${n}${i.join(``)}>`}function lt(e){let t=[],n=e=>`${t.push(e)-1}`,r=``,i=0;rt.lastIndex=0;for(let t;t=rt.exec(e);){let[a,o,s,c,l]=t,u=null;if(a[0]===`&`)u=n({kind:`entity`,name:``,tag:``,markup:a});else if(s){let t=s.toLowerCase();if(t===`img`){let e=ot(c),r=e.get(`alt`);u=n({kind:`text`,name:t,tag:``,markup:o?``:Je(e.get(`src`),Ke(r))??w(r??``)})}else if(t===`video`||t===`audio`){let r=o?void 0:ot(c).get(`src`);if(!o&&!l){let n=e.slice(rt.lastIndex),i=n.match(RegExp(`</${t}\\s*>`,`i`)),a=i?n.slice(0,i.index):``;r??=ot(a.match(/<source\b([^<>]*)>/i)?.[1]??``).get(`src`),i&&(rt.lastIndex+=i.index+i[0].length)}u=n({kind:`text`,name:t,tag:``,markup:(o?null:Je(r,t===`video`?`Open attached video`:`Open attached audio`))??``})}else if(et.has(t)){if(!o&&!l&&!$e.has(t)){let n=RegExp(`</${t}\\s*>`,`i`),r=e.slice(rt.lastIndex),i=r.search(n);i!==-1&&(rt.lastIndex+=i+r.slice(i).match(n)[0].length)}u=``}else if(tt.has(t))u=n({kind:`text`,name:t,tag:``,markup:``});else if(Qe.has(t)){let e=st(t);u=o?n({kind:`close`,name:t,tag:e,markup:``}):$e.has(t)?n({kind:`void`,name:t,tag:e,markup:ct(t,c)}):n({kind:`open`,name:t,tag:e,markup:ct(t,c)})}}u!==null&&(r+=e.slice(i,t.index)+u,i=rt.lastIndex)}return{text:r+e.slice(i),tokens:t}}function ut(e,t){for(let n of e.matchAll(/\u0002(\d+)\u0002/g))if(t.tokens[Number(n[1])].kind!==`entity`)return!0;return!1}function dt(e,t){let n=e.match(Ve);return!!(n&&nt.has(t.tokens[Number(n[1])].name))}function ft(e){let t=[];return e.replace(/<a\b[^>]*>|<\/a>/g,e=>{if(e===`</a>`)return t.pop()?``:e;let n=t.length>0;return t.push(n),n?``:e})}function pt(e,t){let n=[],r=e=>{let r=t.tokens[e];if(r.kind===`open`)return n.push(r.tag),r.markup;if(r.kind===`close`){let e=n.lastIndexOf(r.tag);return e===-1?``:n.splice(e).reverse().map(e=>`</${e}>`).join(``)}return r.markup},i=``,a=0,o=!1;for(let n=0;n<e.length;n++){let s=e[n];if(s===`<`)o=!0;else if(s===`>`)o=!1;else if(s===``){let s=e.indexOf(``,n+1);if(s===-1)break;let c=Number(e.slice(n+1,s));i+=e.slice(a,n)+(o&&t.tokens[c].kind!==`entity`?``:r(c)),n=s,a=s+1}}return i+e.slice(a)+n.reverse().map(e=>`</${e}>`).join(``)}var mt=`\0`,ht=``,gt=/\u0000(\d+)\u0000/g,_t=/^\u0000\d+\u0000$/,vt=/\u0001(\d+)\u0001/g;function yt(e,t={}){let{text:n,blocks:r}=Tt(wt(e.replace(/[\u0000\u0001\u0002]/g,``),t),t);if(!t.safeHtml)return kt(It(n),r);let i=lt(n);return ft(pt(kt(It(i.text,i),r),i))}function bt(e){return e.match(/^\s*(`{3,}|~{3,})\s*[\w+#.-]*\s*$/)?.[1][0]??null}function xt(e,t){return RegExp(`^\\s*${t}{3,}\\s*$`).test(e)}var St=/`[^`\n]+`|<!--/g;function Ct(e,t){St.lastIndex=t;for(let t;t=St.exec(e);)if(t[0]===`<!--`)return t.index;return-1}function wt(e,t={}){let n=[],r=null,i=!1,a=null,o=0;for(let s of e.split(`
|
|
3
|
+
`)){let c=o;if(o+=s.length+1,r){let e=xt(s,r);e&&(r=null),n.push({raw:s,visible:s,code:e?`close`:`body`});continue}if(!i&&(r=bt(s),r)){n.push({raw:s,visible:s,code:`open`});continue}if(!t.hideHtmlComments){n.push({raw:s,visible:s});continue}let l=i?a:null,u=``,d=0;for(;d<s.length;){if(i){let e=s.indexOf(`-->`,d);if(e===-1)break;d=e+3,i=!1;continue}let t=Ct(s,d);if(t===-1||e.indexOf(`-->`,c+t+4)===-1){u+=s.slice(d);break}u+=s.slice(d,t),d=t+4,i=!0}if(l){l.visible+=u,n.push({raw:s,visible:``,absent:!0});continue}let f={raw:s,visible:u};i&&(a=u.trim()===``?null:f),n.push(f)}return n}function Tt(e,t={}){let n=[],r=[],i=null,a,o=()=>{r.push(`${mt}${n.length}${mt}`);let e=i.join(`
|
|
4
|
+
`);n.push(a===void 0?{code:e}:{code:e,diagram:{label:`Mermaid diagram: ${a??Ot(e)}`}}),i=null};for(let n of e)n.absent||(n.code===`open`?(i=[],a=t.mermaid&&Et(n.raw).toLowerCase()===`mermaid`?Dt(r):void 0):n.code===`body`?i.push(n.raw):n.code===`close`?o():r.push(n.visible));return i&&o(),{text:r.join(`
|
|
5
|
+
`),blocks:n}}function Et(e){return e.match(/^\s*(?:`{3,}|~{3,})\s*([\w+#.-]*)/)?.[1]??``}function Dt(e){for(let t=e.length-1;t>=0;t--){let n=e[t].trim();if(!n)continue;let r=n.match(/^#{1,6}\s+(.+?)\s*#*$/)?.[1]??n.match(/^(\*\*|__)(.+)\1$/)?.[2];return r&&r.replace(/[`*_]/g,``).trim()||null}return null}function Ot(e){let t=e.split(`
|
|
6
|
+
`).map(e=>e.trim()),n=0;if(t.find(e=>e)===`---`){let e=t.indexOf(`---`),r=t.indexOf(`---`,e+1);n=r===-1?t.length:r+1}return t.slice(n).find(e=>e&&!e.startsWith(`%%`))?.split(/\s+/)[0]||`diagram`}function kt(e,t){return e.replace(gt,(e,n)=>{let r=t[Number(n)];return r.diagram?Mt(r.code,r.diagram.label):At(r.code,`Copy`,`Copy code`)})}function At(e,t,n,r=``){return`<div class="${ze}"${r}><pre><code>${w(e)}</code></pre><button type="button" class="${Be}" aria-label="${n}">${t}</button></div>`}var jt=0;function Mt(e,t){let n=`prb-md-mermaid-source-${++jt}`;return`<figure class="prb-md-mermaid" data-md-mermaid data-state="source"><div class="prb-md-mermaid-canvas" data-md-mermaid-canvas role="img" aria-label="${w(t)}" hidden></div><p class="prb-md-mermaid-error" data-md-mermaid-error hidden>This diagram couldn\u2019t be displayed.</p><button type="button" class="prb-md-mermaid-toggle" data-md-mermaid-toggle aria-expanded="true" aria-controls="${n}" hidden>Hide source</button>`+At(e,`Copy source`,`Copy source`,` id="${n}" data-md-mermaid-source`)+`</figure>`}function Nt(e,t=0){let n=t;for(let t of e)n=t===` `?n+4-n%4:n+1;return n}function Pt(e){return Nt(e.match(/^[ \t]*/)[0])}function Ft(e){let t=e.match(/^([ \t]*)(?:([-*+])|(\d{1,9})[.)])([ \t]+)(\S.*)$/);if(!t)return null;let[,n,r,i,a,o]=t,s=Nt(n)+(r?1:i.length+1),c=Nt(a,s);return{tag:r?`ul`:`ol`,start:r?1:Number(i),text:o.trim(),content:c-s>4?s+1:c}}function It(e,t){let n=[],r=[],i=[],a=null,o=e=>e.tag===`ol`&&e.start!==1?` start="${e.start}"`:``,s=null,c=()=>{if(r.length&&n.push(`<p>${Lt(r.join(` `),t)}</p>`),i.length&&n.push(`<blockquote>${Lt(i.join(` `),t)}</blockquote>`),a){let e=e=>e.length===1?Lt(e[0],t):e.map(e=>`<p>${Lt(e,t)}</p>`).join(``),r=t=>`<${t.tag}${o(t)}>${t.items.map(t=>`<li>${e(t.paras)}</li>`).join(``)}</${t.tag}>`,i=({blocks:e})=>{let n=e.filter(e=>typeof e==`string`).length===1;return e.map(e=>typeof e==`string`?n?Lt(e,t):`<p>${Lt(e,t)}</p>`:r(e)).join(``)};n.push(`<${a.tag}${o(a)}>${a.items.map(e=>`<li>${i(e)}</li>`).join(``)}</${a.tag}>`)}r=[],i=[],a=null};for(let o of e.split(`
|
|
7
|
+
`)){let e=o.trim();if(s){if(e){s.push(w(e));continue}n.push(s.join(`
|
|
8
|
+
`)),s=null}if(!e){a&&!r.length&&!i.length?a.gap=!0:c();continue}if(a?.items.length){let t=a.items[a.items.length-1],n=t.blocks[t.blocks.length-1],r=typeof n==`string`?null:n,i=r?.items[r.items.length-1]??null,s=Pt(o),l=Ft(o),u=a.gap;if(a.gap=!1,l&&s>=t.content){let e=r&&i&&(s>=i.content||r.tag===l.tag),n={paras:[l.text],content:l.content};e?r.items.push(n):t.blocks.push({tag:l.tag,start:l.start,items:[n]});continue}if(!l&&u){if(i&&s>=i.content){i.paras.push(e);continue}if(s>=t.content){t.blocks.push(e);continue}c()}else l&&u&&l.tag!==a.tag&&c()}if(t&&dt(e,t)){c(),s=[w(e)];continue}if(_t.test(e)){c(),n.push(e);continue}if(/^(?:-{3,}|\*{3,}|_{3,})$/.test(e)){c(),n.push(`<hr>`);continue}let l=e.match(/^(#{1,6})\s+(.+)$/);if(l){c();let e=Math.min(l[1].length,3)+3;n.push(`<h${e}>${Lt(l[2],t)}</h${e}>`);continue}let u=Ft(o);if(u){let e=a;e?.tag!==u.tag&&(c(),e=a={tag:u.tag,start:u.start,items:[],gap:!1}),e.items.push({blocks:[u.text],content:u.content});continue}let d=e.match(/^>\s?(.*)$/);if(d){i.length||c(),i.push(d[1]);continue}if(a&&a.items.length){let{blocks:t}=a.items[a.items.length-1],n=t[t.length-1];if(typeof n==`string`)t[t.length-1]=`${n} ${e}`;else{let t=n.items[n.items.length-1].paras;t[t.length-1]+=` ${e}`}continue}if(i.length){i[i.length-1]+=` ${e}`;continue}r.push(e)}return c(),s&&n.push(s.join(`
|
|
9
|
+
`)),n.join(``)}function Lt(e,t){let n=[];return w(e).replace(/`([^`\n]+)`/g,(e,t)=>(n.push(t),`${ht}${n.length-1}${ht}`)).replace(/!\[([^\]\n]*)\]\(([^)\s]+)\)/g,(e,n,r)=>t&&!ut(r,t)?qe(r,Ke(n))??e:e).replace(/(?<!!)\[([^\]\n]+)\]\(([^)\s]+)\)/g,(e,n,r)=>He.test(r)&&!(t&&ut(r,t))?`<a href="${r}" target="_blank" rel="noopener noreferrer">${n}</a>`:e).replace(/\*\*([^*\n]+)\*\*/g,`<strong>$1</strong>`).replace(/__([^_\n]+)__/g,`<strong>$1</strong>`).replace(/(^|[^*\w])\*([^*\n]+)\*/g,`$1<em>$2</em>`).replace(/(^|[^_\w])_([^_\n]+)_(?![\w_])/g,`$1<em>$2</em>`).replace(vt,(e,t)=>`<code>${n[Number(t)]}</code>`)}async function Rt(e){try{return await navigator.clipboard.writeText(e),!0}catch(t){return console.warn(`PR Helper: clipboard write failed, falling back to execCommand`,t),zt(e)}}function zt(e){let t=document.createElement(`textarea`);t.value=e,t.setAttribute(`aria-hidden`,`true`),t.style.cssText=`position:fixed;top:-9999px;left:-9999px;opacity:0;`,document.body.appendChild(t);try{return t.select(),document.execCommand(`copy`)}catch(e){return console.warn(`PR Helper: clipboard fallback failed`,e),!1}finally{t.remove()}}var Bt=`pr-helper-msg-copy`,Vt=`pr-helper-chat-actions`,Ht=`data-message-id`,Ut=`data-copy-source`,Wt=`data-feedback-source`,Gt=`data-feedback-ref`,Kt={idle:{icon:`<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>`,label:``,aria:`Copy message`},copied:{icon:`<path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>`,label:`Copied`,aria:`Copied`},failed:{icon:`<path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>`,label:`Copy failed`,aria:`Copy failed`}};function qt(e){return Qt(`${Ut}="${w(e)}"`)}var Jt=`pr-helper-finding-copy`,Yt=`data-copy-idle-label`,Xt=`data-copy-idle-aria`,Zt=`data-copy-idle-tip`;function Qt(e,t){let{icon:n}=Kt.idle,r=t?.label??Kt.idle.label,i=t?.aria??Kt.idle.aria,a=t?` ${Yt}="${w(r)}" ${Xt}="${w(i)}" ${Zt}="${w(t.tip)}"`:``,o=`<button type="button" class="${t?`${Bt} ${Jt}`:Bt}" ${e}${a}${t?` data-tip="${w(t.tip)}"`:``} aria-label="${w(i)}"><span class="${Bt}-icon" aria-hidden="true">${en(n)}</span><span class="${Bt}-label"${r?``:` hidden`}>${w(r)}</span></button>`;return t?o:`<div class="${Vt}">${o}</div>`}function $t(e,t){let n=Kt[t],r=t===`idle`?{...n,label:e.getAttribute(Yt)??n.label,aria:e.getAttribute(Xt)??n.aria}:n,i=e.querySelector(`.${Bt}-icon`),a=e.querySelector(`.${Bt}-label`);i&&(i.innerHTML=en(r.icon));let o=(e.getAttribute(Yt)??``)!==``,s=e.classList.contains(`pr-helper-finding-copy`)&&!o;a instanceof HTMLElement&&(a.textContent=s?``:r.label,a.hidden=s||r.label===``),s&&e.setAttribute(`data-tip`,t===`idle`?e.getAttribute(Zt)??``:r.label),e.setAttribute(`aria-label`,r.aria),e.classList.toggle(`copied`,t===`copied`),e.classList.toggle(`failed`,t===`failed`)}function en(e){return`<svg viewBox="0 0 16 16" width="14" height="14" fill="currentColor">${e}</svg>`}var tn=1400,nn=`Copy`,rn=`Copied`,an=/Mac|iPhone|iPad/.test(navigator.userAgent)?`Press ⌘C`:`Press Ctrl C`,on=new WeakMap;function sn(e,t={}){let n=e=>{let n=e.target;if(!(n instanceof Element))return;let r=n.closest(`.${Be}`),i=r?null:n.closest(`.${Bt}`);!r&&!i||(e.preventDefault(),e.stopPropagation(),r?un(r):i&&cn(i,t.messageSource))};return e.addEventListener(`click`,n,!0),()=>e.removeEventListener(`click`,n,!0)}async function cn(e,t){let n=ln(e,t);fn(e,n!==null&&await Rt(n)?`copied`:`failed`)}function ln(e,t){let n=e.getAttribute(Ut);if(n!==null)return n;let r=e.getAttribute(Ht);return r&&t?t(r):null}async function un(e){let t=e.parentElement?.querySelector(`pre code`),n=t?await Rt(t.textContent??``):!1;!n&&t&&dn(t),pn(e,n?rn:an,n)}function dn(e){let t=window.getSelection();if(!t)return;let n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}function fn(e,t){let n=on.get(e);n&&window.clearTimeout(n),$t(e,t),on.set(e,window.setTimeout(()=>{$t(e,`idle`),on.delete(e)},tn))}function pn(e,t,n){let r=on.get(e);r&&window.clearTimeout(r);let i=e.dataset.idleLabel??=e.textContent||nn;e.textContent=t,e.classList.toggle(`copied`,n),on.set(e,window.setTimeout(()=>{e.textContent=i,e.classList.remove(`copied`),on.delete(e)},tn))}var mn={startOnLoad:!1,securityLevel:`strict`,htmlLabels:!1,flowchart:{htmlLabels:!1},theme:`neutral`,fontFamily:`inherit`,suppressErrorRendering:!0,secure:[`secure`,`securityLevel`,`startOnLoad`,`maxTextSize`,`suppressErrorRendering`,`maxEdges`,`htmlLabels`,`flowchart`,`themeCSS`,`themeVariables`,`theme`,`darkMode`,`fontFamily`,`dompurifyConfig`,`arrowMarkerAbsolute`,`deterministicIds`,`deterministicIDSeed`]},hn=null;function gn(){return hn??=C(()=>import(`./chunk-D6oLtkSC.js`).then(e=>(e.default.initialize(mn),e.default)),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])),hn}async function _n(e,t,n,r=gn){let i=await r();await i.parse(n);let{svg:a}=await i.render(t,n);e.innerHTML=a,yn(e)}var vn=`http://www.w3.org/2000/svg`;function yn(e){for(let t of[...e.querySelectorAll(`a`)]){let n=e.ownerDocument.createElementNS(vn,`g`);for(let e of[...t.attributes])/^(?:xlink:)?href$|^target$|^rel$/i.test(e.name)||n.setAttribute(e.name,e.value);n.append(...t.childNodes),t.replaceWith(n)}for(let t of e.querySelectorAll(`.clickable`))t.classList.remove(`clickable`)}var bn=0;function xn(e,t={}){let n=t.engine??gn,r=t.observe??Sn,i=new WeakSet;for(let t of e.querySelectorAll(`figure[data-md-mermaid]`))r(t,()=>{i.has(t)||(i.add(t),Cn(t,n))});let a=e=>{let t=e.target?.closest?.(`[data-md-mermaid-toggle]`);t&&Tn(t)};return e.addEventListener(`click`,a),()=>e.removeEventListener(`click`,a)}function Sn(e,t){let n=new IntersectionObserver(e=>{e.some(e=>e.isIntersecting)&&(n.disconnect(),t())},{rootMargin:`200px`});n.observe(e)}async function Cn(e,t){let n=t=>e.querySelector(`[data-md-mermaid-${t}]`),r=n(`canvas`),i=n(`source`),a=n(`toggle`),o=i?.querySelector(`pre code`)?.textContent??``;if(!(!r||!i||!a))try{await _n(r,`prb-md-mermaid-${++bn}`,o,t),wn(r.querySelector(`svg`)),r.hidden=!1,i.hidden=!0,a.hidden=!1,a.textContent=`View source`,a.setAttribute(`aria-expanded`,`false`),e.dataset.state=`diagram`}catch{e.dataset.state=`failed`;let t=n(`error`);t&&(t.hidden=!1)}}function wn(e){let t=parseFloat(e?.style.maxWidth??``);!e||!Number.isFinite(t)||t<=0||(e.setAttribute(`width`,String(t)),e.style.maxWidth=`none`)}function Tn(e){let t=e.closest(`figure`)?.querySelector(`[data-md-mermaid-source]`);if(!t)return;let n=t.hidden;t.hidden=!n,e.textContent=n?`Hide source`:`View source`,e.setAttribute(`aria-expanded`,String(n))}var En=`pr-helper-selection-popover`,Dn=`pr-helper-selection-popover-expanded`,On=`pr-helper-selection-copy-done`,kn=8,An=8,jn=1e3,Mn=`Copy selected text`,Nn=`Copy`,Pn=`Copied`,Fn=`pr-helper-selection-popover-flat`,E=null;function In(e){return`<button type="button" class="pr-helper-selection-menu-item" data-selection-action="${w(e.id)}">${w(e.label)}</button>`}function Ln(e){let t=new Map;for(let n of e){if(!n.section)continue;let e=t.get(n.section);e?e.push(n):t.set(n.section,[n])}return`${e.filter(e=>!e.section).map(In).join(``)}${[...t].map(([e,t])=>`
|
|
10
10
|
<div class="pr-helper-selection-menu-group">
|
|
11
|
-
<div class="pr-helper-selection-menu-heading">${
|
|
12
|
-
<div class="pr-helper-selection-menu-group-items">${t.map(
|
|
13
|
-
</div>`).join(``)}`}function
|
|
11
|
+
<div class="pr-helper-selection-menu-heading">${w(e)}</div>
|
|
12
|
+
<div class="pr-helper-selection-menu-group-items">${t.map(In).join(``)}</div>
|
|
13
|
+
</div>`).join(``)}`}function Rn(e){if(e.layout===`flat`)return zn(e);let t=Ln(e.actions);return`
|
|
14
14
|
<div class="pr-helper-selection-bar">
|
|
15
15
|
<button type="button" class="pr-helper-selection-trigger" data-selection-open>
|
|
16
16
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="12" height="12" fill="currentColor" aria-hidden="true">
|
|
17
17
|
<path d="M1.75 1h12.5A1.75 1.75 0 0 1 16 2.75v8.5A1.75 1.75 0 0 1 14.25 13H8.06l-3.5 2.63A.75.75 0 0 1 3.36 15v-2H1.75A1.75 1.75 0 0 1 0 11.25v-8.5A1.75 1.75 0 0 1 1.75 1Z"/>
|
|
18
18
|
</svg>
|
|
19
|
-
<span>${
|
|
19
|
+
<span>${w(e.triggerLabel??`Ask`)}</span>
|
|
20
20
|
</button>
|
|
21
|
-
<button type="button" class="pr-helper-selection-copy" data-selection-copy aria-label="${
|
|
21
|
+
<button type="button" class="pr-helper-selection-copy" data-selection-copy aria-label="${Mn}" aria-describedby="pr-helper-selection-tip">
|
|
22
22
|
<svg class="pr-helper-selection-copy-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" aria-hidden="true">
|
|
23
23
|
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"/>
|
|
24
24
|
<path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"/>
|
|
@@ -27,28 +27,28 @@ import{K as e,V as t,_t as n,a as r,c as i,ct as a,dt as o,ft as s,gt as c,ht as
|
|
|
27
27
|
<path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L1.22 8.28a.75.75 0 0 1 1.06-1.06L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"/>
|
|
28
28
|
</svg>
|
|
29
29
|
</button>
|
|
30
|
-
<span class="pr-helper-selection-tip" id="pr-helper-selection-tip" role="tooltip">${
|
|
30
|
+
<span class="pr-helper-selection-tip" id="pr-helper-selection-tip" role="tooltip">${Mn}</span>
|
|
31
31
|
</div>
|
|
32
32
|
<div class="pr-helper-selection-menu">${t}</div>
|
|
33
|
-
`}function
|
|
34
|
-
${
|
|
35
|
-
<button type="button" class="pr-helper-selection-menu-item pr-helper-selection-copy-item" data-selection-copy>${
|
|
36
|
-
</div>`}function
|
|
33
|
+
`}function zn(e){return`<div class="pr-helper-selection-menu">
|
|
34
|
+
${Ln(e.actions)}
|
|
35
|
+
<button type="button" class="pr-helper-selection-menu-item pr-helper-selection-copy-item" data-selection-copy>${Nn}</button>
|
|
36
|
+
</div>`}function Bn(e,t){let{width:n,height:r}=e.getBoundingClientRect(),i=t.top-r-kn,a=i>=An?i:Math.min(t.bottom+kn,window.innerHeight-r-An),o=Math.max(An,Math.min(t.left,window.innerWidth-n-An));e.style.top=`${Math.max(An,a)}px`,e.style.left=`${o}px`}function Vn(){Hn&&=(window.clearTimeout(Hn),0),E?.popover.remove(),E=null}var Hn=0;function Un(e){let t=e.querySelector(`.pr-helper-selection-tip`),n=e.querySelector(`.pr-helper-selection-copy-item`);e.classList.add(On),t&&(t.textContent=Pn),n&&(n.textContent=Pn),Hn&&window.clearTimeout(Hn),Hn=window.setTimeout(()=>Wn(e),jn)}function Wn(e){Hn&&=(window.clearTimeout(Hn),0),e.classList.remove(On);let t=e.querySelector(`.pr-helper-selection-tip`);t&&(t.textContent=Mn);let n=e.querySelector(`.pr-helper-selection-copy-item`);n&&(n.textContent=Nn)}async function Gn(e,t){try{await navigator.clipboard.writeText(t)}catch(e){console.warn(`PR Helper: clipboard write failed, falling back to execCommand`,e);let t=!1;try{t=document.execCommand(`copy`)}catch(e){console.warn(`PR Helper: clipboard fallback failed`,e)}if(!t)return}Un(e)}function Kn(e,t){let n=window.getSelection();if(!n||n.isCollapsed||n.rangeCount===0)return null;let r=n.toString().trim();if(!r)return null;let i=n.getRangeAt(0);if(!e.contains(i.commonAncestorContainer))return null;if(t.onlyWithin||t.ignoreWithin){let e=i.commonAncestorContainer,n=e instanceof HTMLElement?e:e.parentElement;if(t.onlyWithin&&!n?.closest(t.onlyWithin)||t.ignoreWithin&&n?.closest(t.ignoreWithin))return null}let a=i.getBoundingClientRect();return a.width===0&&a.height===0?null:{text:r,rect:a}}function qn(e,t){let n={},r=()=>{let r=Kn(e,t);if(!r){(!E||E.owner===n)&&Vn();return}if(E&&E.owner!==n&&Vn(),E)E.popover.classList.remove(Dn),Wn(E.popover),E.text=r.text;else{let i=document.createElement(`div`);i.className=t.layout===`flat`?`${En} ${Fn}`:En,i.innerHTML=Rn(t),i.addEventListener(`mousedown`,e=>e.preventDefault()),i.addEventListener(`click`,n=>{let r=n.target;if(r.closest(`[data-selection-copy]`)){E?.text&&Gn(i,E.text);return}if(r.closest(`[data-selection-open]`)){i.classList.add(Dn);let n=Kn(e,t);Bn(i,n?.rect??i.getBoundingClientRect());return}let a=r.closest(`[data-selection-action]`)?.dataset.selectionAction;if(!a||!E)return;let o=E.text;Vn(),t.onChoose(a,o)}),document.body.appendChild(i),E={popover:i,text:r.text,owner:n}}Bn(E.popover,r.rect)},i=e=>{E&&e.target instanceof Node&&E.popover.contains(e.target)||window.setTimeout(r,0)},a=e=>{(e.shiftKey||e.key===`Shift`)&&r()},o=()=>{if(!E)return;let e=window.getSelection();(!e||e.isCollapsed)&&Vn()},s=e=>{e.key===`Escape`&&Vn()},c=()=>Vn();return document.addEventListener(`mouseup`,i,!0),document.addEventListener(`keyup`,a,!0),e.addEventListener(`scroll`,c,!0),document.addEventListener(`selectionchange`,o),document.addEventListener(`keydown`,s),window.addEventListener(`scroll`,c,!0),()=>{document.removeEventListener(`mouseup`,i,!0),document.removeEventListener(`keyup`,a,!0),e.removeEventListener(`scroll`,c,!0),document.removeEventListener(`selectionchange`,o),document.removeEventListener(`keydown`,s),window.removeEventListener(`scroll`,c,!0),Vn()}}var Jn=[{id:`explain-detail`,label:`Explain (technical)`,instruction:`Explain this, keeping the technical detail.`},{id:`explain`,label:`Explain (simple)`,instruction:`Explain this in simpler terms.`},{id:`is-problem`,label:`Is this actually a problem?`,instruction:`Is this actually a problem? Be specific about when it would and would not matter.`},{id:`why-matters`,label:`Why does this matter?`,instruction:`Why does this matter? Say who or what it affects, and when.`},{id:`better-implementation`,label:`Suggest a better implementation`,instruction:`Suggest a better implementation for this.`},{id:`author-question`,label:`Generate a question for the author`,instruction:`Generate a question I could ask the author about this.`},{id:`custom`,label:`Ask a question`}];function Yn(e){return![...Jn,...Xn].find(t=>t.id===e)?.instruction}var Xn=[{id:`add-to-chat`,label:`Add to chat`}],Zn=800;function Qn(e,t={}){let n=t.maxChars??Zn,r=e.replace(/\r\n/g,`
|
|
37
37
|
`).split(`
|
|
38
38
|
`).map(e=>e.replace(/\s+$/,``));for(;r.length&&!r[0].trim();)r.shift();for(;r.length&&!r[r.length-1].trim();)r.pop();let i=r.filter(e=>e.trim()).map(e=>e.match(/^[ \t]*/)[0].length),a=i.length?Math.min(...i):0,o=r.map(e=>e.slice(a)).join(`
|
|
39
39
|
`).replace(/\n{3,}/g,`
|
|
40
40
|
|
|
41
41
|
`);return o.trim()?(o.length>n?`${o.slice(0,n).trimEnd()}…`:o).split(`
|
|
42
42
|
`).map(e=>`> ${e}`.trimEnd()).join(`
|
|
43
|
-
`):``}function
|
|
44
|
-
<summary class="pr-helper-simple-explanation-summary">${
|
|
43
|
+
`):``}function $n(e,t,n={}){let r=Qn(e,n);if(!r)return null;let i=[...Jn,...Xn].find(e=>e.id===t);return i?i.instruction?`${r}\n\n${i.instruction}`:`${r}\n\n`:null}function er(e){return e.closest(`[data-finding-card]`)?.querySelector(`[data-copy-source]`)?.getAttribute(`data-copy-source`)??``}var tr=[`verify`,`decide`,`fix`];function D(e,t=``){return typeof e==`string`?e:t}var nr=`Dismissed by you — you decided this finding needs no action. It stops counting towards what is left, and stays here so the decision is visible rather than lost.`;function rr(e){return e===0?``:`<span class="pr-helper-closed-findings-waiting" data-closed-findings-waiting> ${e===1?`1 suggestion waiting`:`${e} suggestions waiting`}</span>`}var ir=[`explain-detail`,`explain`];function ar(e){return ir.includes(e)}function or(e){return e.action??`explain`}var sr=`Ask more →`,cr={"explain-detail":`Explanation · Technical`,explain:`Explanation · Simple`};function lr(e){return cr[or(e)]}function ur(e,t={}){let n=yt(e.text),r=t.askMore?`<button type="button" class="pr-helper-simple-explanation-more" data-simple-explanation-more>${sr}</button>`:``,i=r&&n.endsWith(`</p>`)?`${n.slice(0,-4)} ${r}</p>`:n+r;return`<details class="pr-helper-simple-explanation" data-simple-explanation${Number.isFinite(e.writtenAt)?` data-explanation-written-at="${e.writtenAt}"`:``}${t.open?` open`:``}>
|
|
44
|
+
<summary class="pr-helper-simple-explanation-summary">${lr(e)}</summary>
|
|
45
45
|
<div class="pr-helper-simple-explanation-body pr-helper-markdown">${i}</div>
|
|
46
|
-
</details>`}function
|
|
46
|
+
</details>`}function dr(e,t){return`.pr-helper-${e}-card[data-finding-card="${CSS.escape(t)}"]`}function fr(e){return e?.classList.contains(`pr-helper-issue-card`)?`issue`:e?.classList.contains(`pr-helper-question-card`)?`question`:null}function pr(e,t){return ar(e)&&t?{explains:{...t,action:e}}:{}}function mr(e){let t=hr(e),n=e.closest(`[data-simple-explanation]`);if(!t||!n)return null;let r=Number(n.getAttribute(`data-explanation-written-at`)??NaN);return Number.isFinite(r)?{...t,writtenAt:r}:t}function hr(e){let t=e.closest(`[data-finding-card]`),n=fr(t),r=t?.getAttribute(`data-finding-card`);return n&&r?{kind:n,id:r}:null}function gr(e,t){let n=e.querySelector(dr(t.kind,t.id));if(!n)return;let r=ur(t,{open:!0,askMore:!0}),i=n.querySelector(`:scope > [data-simple-explanation]`);if(i){i.outerHTML=r;return}_r(n,t.kind)?.insertAdjacentHTML(`afterend`,r)}function _r(e,t){let n=e.querySelector(`:scope > .pr-helper-issue-header`),r=n?.nextElementSibling?.matches(`[data-assessment-region]`)?n.nextElementSibling:n;if(t===`issue`)return e.querySelector(`:scope > .pr-helper-issue-impact, :scope > .pr-helper-issue-desc`)??e.querySelector(`:scope > [data-assessment-region]`)??e.querySelector(`:scope > .pr-helper-dismissal-stale`)??n;let i=r?.nextElementSibling;return i?.tagName===`H5`&&i.textContent===`Why this matters`?i.nextElementSibling:r??null}function vr(e,t){return e?.continues&&t.includes(e.text)?e.continues:void 0}var yr=/^pr-helper-severity-(critical|major|minor|nit)$/;function br(e,t,n){let r=e.querySelector(dr(t.kind,t.id));if(!r)return null;if(t.kind===`issue`){for(let e of[...r.classList])yr.test(e)&&r.classList.remove(e);t.cardClass&&r.classList.add(t.cardClass)}r.querySelector(`[data-grade-control]`)?.replaceWith(Sr(e,t.grade)),r.querySelector(`[data-assessment-region]`)?.replaceWith(Sr(e,t.region)),r.querySelector(`[${Ut}]`)?.setAttribute(Ut,t.copy);let i=r.querySelector(`[data-question-answered], [data-issue-dismissed]`),a=t.verdictClosed===!0;return i&&i.dataset.verdictClosed===`true`!==a&&(a?i.dataset.verdictClosed=`true`:delete i.dataset.verdictClosed,n?.(r,a)),xr(e),r}function xr(e){for(let t of e.querySelectorAll(`[data-closed-findings]`)){let n=t.querySelector(`[data-closed-findings-summary]`);if(!n)continue;let r=t.querySelectorAll(`.pr-helper-closed-findings-list [data-reassessment-proposal]`).length;n.querySelector(`[data-closed-findings-waiting]`)?.remove();let i=rr(r);i&&n.append(Sr(e,i))}}function Sr(e,t){let n=e.createElement(`template`);return n.innerHTML=t.trim(),n.content}function Cr(e,t){let n=e?.querySelector(`[data-assessment-region]`);if(!n)return;n.querySelector(`.pr-helper-reassessment-error`)?.remove();let r=n.ownerDocument.createElement(`p`);r.className=`pr-helper-reassessment-error`,r.setAttribute(`role`,`alert`),r.textContent=t,n.append(r)}var wr=`Could not reach PR Review Buddy. The workspace server may have stopped.`;async function Tr(e,t,n,r,i){let a;try{a=await r.post(n)}catch{return Cr(t,wr),!1}if(a===null)return!1;let o=a.body?.card?br(e,a.body.card,r.onVerdictClosed):t;return a.status===200?((i===`grade`?o?.querySelector(`[data-grade-control] button`):o?.querySelector(`[data-assessment-region] summary, [data-grade-control] button`))?.focus(),!0):(Cr(o,typeof a.body?.error==`string`?a.body.error:`That could not be saved.`),!1)}async function Er(e,t){let n=e.closest(`[data-grade-menu]`),r=e.closest(`[data-finding-card]`),i=hr(e),a=e.dataset.gradeTo;if(!n||!r||!i||!a)return!1;let o=n.dataset.gradeFrom||null,s=n.querySelector(`[data-grade-reason]`)?.value.trim()??``;return t.closeMenu?.(n),Tr(e.ownerDocument,r,{op:`set`,kind:i.kind,id:i.id,from:o,to:a,...s?{reason:s}:{}},t,`grade`)}async function Dr(e,t){let n=e.closest(`[data-reassessment-proposal]`),r=e.closest(`[data-finding-card]`),i=e.dataset.reassessmentDecide,a=n?.dataset.reassessmentProposal;if(!r||!a||i!==`accepted`&&i!==`declined`)return!1;for(let e of n.querySelectorAll(`button`))e.disabled=!0;let o=await Tr(e.ownerDocument,r,{op:`decide`,proposalId:a,decision:i},t,`region`);if(!o)for(let e of n.querySelectorAll(`button`))e.disabled=!1;return o}function Or(e,t){e.addEventListener(`click`,e=>{let n=e.target,r=n?.closest(`[data-grade-menu] [data-grade-to]`);if(r){Er(r,t);return}let i=n?.closest(`[data-reassessment-decide]`);i&&Dr(i,t)})}function kr(e){let t=er(e);if(!t)return null;let n=e.closest(`[data-reassessment-proposal]`),r=n?.querySelector(`.pr-helper-reassessment-proposal-title`)?.textContent?.trim()??``,i=n?.querySelector(`.pr-helper-reassessment-reason`)?.textContent?.trim()??``;return`${Qn(t,{maxChars:1/0})}\n\n${Qn(`${r}${i?`: ${i}`:``}`,{maxChars:1/0})}\n\n`}var Ar=`Reassesses existing issues and questions using only your message in this turn.`;function jr(e,t=[]){return e.reconciles?Mr(t):`<div class="prb-turn-actions" data-turn-actions="${e.askedAt}">
|
|
47
47
|
<button type="button" class="prb-turn-reconcile" data-reconcile-turn="${e.askedAt}">Reconcile with findings</button>
|
|
48
|
-
<span class="prb-turn-help">${
|
|
49
|
-
</div>`}function
|
|
50
|
-
<button type="button" class="prb-turn-accept-all" data-reconcile-accept-all="${
|
|
51
|
-
</div>`}Object.freeze([{id:`default-assumptions`,name:`What does it assume?`,prompt:`What assumptions does this change make? Say which are stated, which are implied, and what happens if one turns out to be wrong.`},{id:`default-explain-educational`,name:`Teach me this`,prompt:`Explain this in an educational way: the concepts it relies on, why it is built this way, and what I should take away from it.`},{id:`default-what-could-go-wrong`,name:`What could go wrong?`,prompt:`What could go wrong here? Think about edge cases, failure modes and the existing callers this could break.`},{id:`default-walkthrough`,name:`Walk me through it`,prompt:`Walk me through the implementation step by step, in the order the code runs.`},{id:`default-verify-manually`,name:`What should I verify?`,prompt:`What should I verify manually before approving this, and how would I check each one?`}].map(e=>Object.freeze(e)));var
|
|
48
|
+
<span class="prb-turn-help">${w(Ar)}</span>
|
|
49
|
+
</div>`}function Mr(e){if(!e.length)return``;let t=e.length===1?`Accept the suggestion`:`Accept all ${e.length} suggestions`;return`<div class="prb-turn-actions">
|
|
50
|
+
<button type="button" class="prb-turn-accept-all" data-reconcile-accept-all="${w(e.join(` `))}">${w(t)}</button>
|
|
51
|
+
</div>`}Object.freeze([{id:`default-assumptions`,name:`What does it assume?`,prompt:`What assumptions does this change make? Say which are stated, which are implied, and what happens if one turns out to be wrong.`},{id:`default-explain-educational`,name:`Teach me this`,prompt:`Explain this in an educational way: the concepts it relies on, why it is built this way, and what I should take away from it.`},{id:`default-what-could-go-wrong`,name:`What could go wrong?`,prompt:`What could go wrong here? Think about edge cases, failure modes and the existing callers this could break.`},{id:`default-walkthrough`,name:`Walk me through it`,prompt:`Walk me through the implementation step by step, in the order the code runs.`},{id:`default-verify-manually`,name:`What should I verify?`,prompt:`What should I verify manually before approving this, and how would I check each one?`}].map(e=>Object.freeze(e)));var Nr=`saved:`,Pr=`Your prompts`;function Fr(e){return`${Nr}${e}`}function Ir(e){return e.startsWith(`saved:`)?e.slice(6):null}var Lr=[`failure`,`risk`,`intent`,`maintenance`,`other`,`closed`];function Rr(e){return Lr.includes(e)}var zr=[`failure`,`risk`,`intent`,`maintenance`,`other`],Br={failure:`Failures`,risk:`Possible risks`,intent:`Intent to confirm`,maintenance:`Maintenance`,other:`Other issues`};function Vr(e){let t={bySection:{},verify:0,decide:0,fix:0,step:0};for(let n of e)t.bySection[n.section]=(t.bySection[n.section]??0)+1,n.next&&(t[n.next]+=1);return t}var Hr=(e,t,n)=>`${e} ${e===1?t:n}`;function Ur(e){let t=Object.values(e.bySection).reduce((e,t)=>e+(t??0),0);if(t===0)return`No issues are outstanding from this analysis.`;let n=[e.verify?Hr(e.verify,`verification step`,`verification steps`):``,e.decide?Hr(e.decide,`decision`,`decisions`):``,e.fix?Hr(e.fix,`fix`,`fixes`):``,e.step?Hr(e.step,`next step`,`next steps`):``].filter(Boolean);return[Hr(t,`outstanding issue`,`outstanding issues`),...n].join(` · `)}function Wr(e){let t=zr.filter(t=>(e.bySection[t]??0)>0);return t.length<2?``:t.map(t=>`<button type="button" class="pr-helper-issue-nav-item" data-issue-nav="${t}">${w(Br[t])}<span class="pr-helper-issue-nav-count">${e.bySection[t]}</span></button>`).join(``)}function Gr(e,t){e.addEventListener(`click`,t=>{let n=t.target?.closest(`[data-issue-nav]`);if(!n||!e.contains(n))return;let r=e.querySelector(`[data-impact-group="${n.dataset.issueNav}"]`);r&&(r.open||=!0,r.scrollIntoView({block:`start`,behavior:`smooth`}),r.querySelector(`summary`)?.focus({preventScroll:!0}))}),t&&e.addEventListener(`toggle`,e=>{let n=e.target,r=n.dataset?.impactGroup??(n.dataset?.closedFindings===`issues`?`closed`:void 0);r&&Rr(r)&&t(r,n.open)},!0)}function Kr(e){let t=Vr([...e.querySelectorAll(`[data-issue-section]`)].filter(e=>!e.closest(`.pr-helper-closed-findings`)).map(e=>{let t=e.dataset.issueSection,n=e.dataset.issueNext;return{section:zr.includes(t)?t:`other`,...n===`step`||tr.includes(n)?{next:n}:{}}}));for(let n of e.querySelectorAll(`[data-impact-group]`)){let e=t.bySection[n.dataset.impactGroup]??0;n.hidden=e===0;let r=n.querySelector(`[data-issue-group-count]`);r&&(r.textContent=String(e))}let n=e.querySelector(`[data-issues-attention]`);n&&(n.textContent=Ur(t));let r=e.querySelector(`[data-issue-nav-list]`);if(r){let e=Wr(t);r.innerHTML=e,r.hidden=!e}}function qr(e,t){let n=t.dataset.issueSection;return!n||!zr.includes(n)?null:e.querySelector(`[data-impact-group="${n}"] .pr-helper-issue-group-list`)}var Jr=[`prb-rail-review`,`prb-rail-path`,`prb-rail-kiss`];function Yr(e){return Jr.includes(e)}function Xr(e,t){if(!e||typeof e!=`object`)return;let n={};for(let r of t){let t=e[r];typeof t==`boolean`&&(n[r]=t)}return Object.keys(n).length>0?n:void 0}var Zr=e=>Xr(e,Jr),Qr=e=>Xr(e,Lr);function $r(e){if(!e||typeof e!=`object`)return{};let{ask:t,expanded:n,rail:r,issueGroups:i}=e,a=Zr(r),o=Qr(i);return{...t===`open`||t===`closed`?{ask:t}:{},...n===`buddy`||n===`document`?{expanded:n}:{},...a?{rail:a}:{},...o?{issueGroups:o}:{}}}function ei(e){return e?e===`buddy`?`buddy`:`document`:null}function ti(e,t,n,r){if(!e||r&&e===`buddy`)return null;let i=e===`buddy`?`buddy`:t.kind===`section`?`guide`:t.view;return te.includes(i)&&n(i)?i:null}function ni(e){if(!e)return{};try{return $r(JSON.parse(e))}catch{return{}}}function ri(e,t,n){let r={...e,...e.rail?{rail:{...e.rail}}:{},...e.issueGroups?{issueGroups:{...e.issueGroups}}:{}};return{ask(e){if(!n())return;let i=e?`open`:`closed`;r.ask!==i&&(r.ask=i,t({ask:i}))},focus(e){if(!n())return;let i=ei(e);(r.expanded??null)!==i&&(i?r.expanded=i:delete r.expanded,t({expanded:i}))},fold(e,i){!n()||!Yr(e)||(r.rail?.[e]??!0)!==i&&(r.rail={...r.rail,[e]:i},t({rail:{[e]:i}}))},issueFold(e,i){n()&&(r.issueGroups?.[e]??e!==`closed`)!==i&&(r.issueGroups={...r.issueGroups,[e]:i},t({issueGroups:{[e]:i}}))}}}function ii(e,t,n,r){let i=n===`finding`?{maxChars:1/0}:{},a=Ir(e);if(a===null)return $n(t,e,i);let o=r(a);if(!o)return null;let s=Qn(t,i);return s?`${s}\n\n${o}`:null}function ai(e,t,n){if(n.busy?.())return null;let r=ii(e,t.text,t.context,n.savedPrompt);if(!r)return null;let i=Yn(e)||Ir(e)!==null;return t.context===`selection`||i?(n.stage(r),`staged`):(n.send(r),`sent`)}function oi(e){return e.reviewerClosed>0?`dealt with`:`resolved`}var si=`Run review again`;function ci(e,t,n){for(let r of e.querySelectorAll(`[data-intent-question]`))if(r.dataset.intentQuestion===t){for(let e of r.querySelectorAll(`[data-intent-open]`))e.hidden=n;for(let e of r.querySelectorAll(`[data-intent-answered]`))e.hidden=!n}}function li(e){let t=e.dataset.questionAnswered;t&&ci(e.ownerDocument,t,e.dataset.answered===`true`||e.dataset.settled===`true`)}var ui=`pr-helper-author-context-preview`,di=`View full PR description`,fi=`Show less`;function pi(e){let t=e.ownerDocument,n=t.getElementById(e.getAttribute(`aria-controls`)??``),r=t.getElementById(ui);if(!n)return;let i=n.closest(`#${_i}`),a=i?[...i.querySelectorAll(`[data-author-context-toggle]`)]:[e],o=e.getAttribute(`aria-expanded`)!==`true`,s=mi(n);if(!o){let e=-hi(n,s);e>0?n.dataset.readingOffset=String(e):delete n.dataset.readingOffset}n.hidden=!o,r&&(r.hidden=o),i?.toggleAttribute(`data-expanded`,o);for(let e of a)e.setAttribute(`aria-expanded`,String(o)),e.textContent=o?fi:di,e.hasAttribute(`data-author-context-head`)&&(e.hidden=!o);if(o){let e=Number(n.dataset.readingOffset??0);e>0&&gi(n,s,hi(n,s)+e);return}i&&hi(i,s)<0&&i.scrollIntoView({block:`start`}),e.hidden&&a.find(e=>!e.hidden)?.focus({preventScroll:!0})}function mi(e){let t=e.ownerDocument.defaultView;for(let n=e.parentElement;n;n=n.parentElement)if(/^(?:auto|scroll|overlay)$/.test(t?.getComputedStyle(n).overflowY??``))return n;return null}function hi(e,t){return e.getBoundingClientRect().top-(t?t.getBoundingClientRect().top:0)}function gi(e,t,n){(t??e.ownerDocument.defaultView)?.scrollBy(0,n)}var _i=`pr-helper-author-context`;function vi(e){let t=e.ownerDocument.getElementById(_i);if(!t)return;let n=t.querySelector(`[data-author-context-toggle]`);n?.getAttribute(`aria-expanded`)===`false`&&pi(n),t.scrollIntoView?.({block:`start`,behavior:`smooth`}),t.querySelector(`h4`)?.focus({preventScroll:!0})}({claude:`Claude Code`,codex:`Codex`,gemini:`Gemini CLI`}).claude;var yi=`"summary": WHAT the change does, for a reviewer about to read it. Roughly 80-120 words, and fewer for a small change. Name the parts that change and what each now does. Do not explain why the change exists, and do not judge whether it is correct or safe: other fields carry both.`,bi=`"consequence": { "title": string, "scenario": string, "group": "failure" | "risk" | "intent" | "maintenance", "next"?: { "kind": "verify" | "decide" | "fix", "text": string } }`,xi=`${bi.replace(`"consequence": `,`"consequence"?: `)} | null`,Si=`"consequence" on an issue: the same issue told as what it means, for someone who knows the product but may not know its implementation. It is shown first; "title" and "description" stay the technical account behind it. Reframe around the consequence, do not just simplify the technical wording.
|
|
52
52
|
- "title": the observable consequence or the meaningful development constraint, as a short sentence (e.g. "Creating a meal can fail halfway, leaving it outside the planner").
|
|
53
53
|
- "scenario": one or two sentences: the triggering condition and what happens (e.g. "If adding it to the day fails after saving, the user sees an error but the meal still exists. Retrying may then be blocked by its name.").
|
|
54
54
|
- "next": the one specific step this issue calls for, when there is one. "kind" is "verify" for a test or evidence-gathering step that would settle whether it happens (e.g. "Try a receipt with an unreadable amount."), "decide" for an acceptance, requirement or intent call only the reviewer can make (e.g. "Confirm this broader change is intended."), and "fix" for a concrete corrective action the finding itself supports (e.g. "Update the recovery runbook to name the new restore command."). A fix is not a verification: do not label a remedy "verify". Omit "next" rather than write a generic step or invent a remedy the evidence does not support.
|
|
@@ -61,41 +61,41 @@ import{K as e,V as t,_t as n,a as r,c as i,ct as a,dt as o,ft as s,gt as c,ht as
|
|
|
61
61
|
- "confidence" is reported separately and does not decide the group. A well-evidenced failure stays a failure at medium confidence; a high severity does not make an unverified risk a failure; a low confidence does not by itself turn a failure into a risk.
|
|
62
62
|
- Keep every condition and qualification that affects the decision. Avoid code identifiers unless the consequence cannot be understood without one. Do not state severity.
|
|
63
63
|
- Never claim user harm, a measured performance effect, a reproduction or a certainty the evidence does not give. A performance concern nobody measured says so (e.g. "Opening a meal may do unnecessary work for nested meals... The effect has not been measured."). A maintenance or intent issue is described as one, not as a user-facing failure.
|
|
64
|
-
- An issue names a concrete consequence. A request for missing requirements with no concrete consequence is a question for the author, not an issue, and is never raised as both.`,
|
|
64
|
+
- An issue names a concrete consequence. A request for missing requirements with no concrete consequence is a question for the author, not an issue, and is never raised as both.`,Ci=`"orientation": one sentence, at most about 25 words, naming the behaviour or product area this change touches, for a reviewer about to decide on its issues (e.g. "This change affects receipt extraction and how duplicate receipt details are combined."). Say what it touches, not whether it is safe, and do not summarise the issues.`,wi=`"behaviourChange"?: { "before": string, "after": string }`,Ti=`"behaviourChange": how the behaviour this pull request touches works today and how it works with the whole pull request applied, for a reviewer who knows the product. "before" is the behaviour at the base the pull request targets; "after" is the behaviour at the head you analysed. One to three plain sentences each, leading with what a user or the system experiences, not with the implementation (e.g. before: "A failed payment is shown as an error and the order is cancelled.", after: "A failed payment is retried twice before the order is cancelled, and the customer is emailed after the last attempt."). Describe the whole pull request, not one commit. Omit the field entirely when the code you read does not establish how it works today: never guess "before".`,Ei=`"framing": { "question": string, "why": string, "needed"?: string }`,Di=`${Ei.replace(`"framing": `,`"framing"?: `)} | null`;`${wi}${bi}${Ei}${yi}${Si}${Ci}${Ti}`;function Oi(e){return e?`View current PR description on GitHub ↗`:`View PR description on GitHub ↗`}function ki(e){let t=e.done-e.reviewerClosed;if(e.reviewerClosed===0){let t=e.byConversation??0;return t===0?`Resolved by the new commits (${e.done})`:t===e.done?`Resolved by the conversation (${e.done})`:`Resolved (${e.done})`}let n=e.byVerdict??0;return t===0&&n===0?`Dismissed by you (${e.done})`:t===0&&n===e.done?`Accepted as resolved (${e.done})`:`Dealt with (${e.done})`}function Ai(e,t){return t===0?`<span class="pr-helper-questions-progress-check" aria-hidden="true">✓</span><span class="pr-helper-questions-progress-count">All ${e} questions answered</span>`:`<span class="pr-helper-questions-progress-count">${t} of ${e} unanswered</span>`}function ji(e){let t=[...document.querySelectorAll(`[data-guide-detail]`)],n=t.find(t=>t.dataset.guideDetail===e);if(!n)return null;for(let e of t)e.hidden=e!==n;return n}function Mi(e){return e instanceof Element&&e.closest(`[data-guide-jump]`)?.dataset.guideJump||null}function Ni(e){for(let t of document.querySelectorAll(`[data-goto-section]`))t.setAttribute(`aria-current`,String(t.dataset.gotoSection===e))}function Pi(){for(let e of document.querySelectorAll(`.prb-rail [data-goto-section]`))e.setAttribute(`aria-current`,`false`)}function Fi(e,t){let n=e.trim();return n?`${n}\n\n${t}`:t}var Ii=50;function Li(e){let t=e.tagName===`LI`?e.querySelector(`:scope > .prb-code`):e.nextElementSibling;return t?.classList.contains(`prb-code`)?t:null}function O(e,t=2**53-1){let n=Number(e);return Number.isFinite(n)&&n>=0?Math.min(Math.floor(n),t):0}function Ri(e){if(!e||typeof e!=`object`)return;let t=e,n=O(t.top);return{cited:O(t.cited),centre:O(t.centre),expand:O(t.expand,Ii),position:O(t.position),tall:t.tall===!0,top:n>0?n:null,offset:Number.isFinite(Number(t.offset))?Math.round(Number(t.offset)):0}}function zi(e){let t=e.getBoundingClientRect().top;for(let n of e.querySelectorAll(`tr[data-line]`)){let e=n.getBoundingClientRect();if(e.bottom>t)return{top:Number(n.dataset.line)||null,offset:Math.round(e.top-t)}}return{top:null,offset:0}}function Bi(e){let t=e.querySelector(`[data-change-navigator]`),n=e.querySelector(`.prb-code-scroll`),r=n&&n.scrollTop>0?zi(n):{top:null,offset:0};return{cited:O(e.dataset.cited),centre:O(e.dataset.centre),expand:O(e.dataset.expand,Ii),position:O(t?.dataset.changePosition??e.dataset.position),tall:e.hasAttribute(`data-expanded`),...r}}function Vi(e,t,n){let r=e.querySelector(`.prb-code-scroll`);if(!r)return;if(t===null){r.scrollTop=0;return}let i=null,a=1/0;for(let e of r.querySelectorAll(`tr[data-line]`)){let n=Math.abs((Number(e.dataset.line)||0)-t);n<a&&(i=e,a=n)}i&&(r.scrollTop+=i.getBoundingClientRect().top-r.getBoundingClientRect().top-n)}function Hi(e,t){return e.cited===t.cited&&e.centre===t.centre&&e.expand===t.expand&&e.position===t.position}function Ui(){let e=new WeakMap,t=0;return{run(n,r,i){let a=++t,o=i().then(t=>e.get(n)?.ticket===a&&(e.delete(n),t(),!0),()=>(e.get(n)?.ticket===a&&e.delete(n),!1));return e.set(n,{ticket:a,request:r,done:o}),o},pending(t){return e.get(t)}}}function Wi(e){let t=e.closest(`[data-finding-card]`);if(t)return`card:${t.getAttribute(`data-finding-card`)??``}`;let n=e.closest(`[data-guide-section]`);return n?`theme:${n.getAttribute(`data-guide-section`)??``}`:`view:${e.closest(`[data-view]`)?.getAttribute(`data-view`)??``}`}function Gi(e){return[...e.querySelectorAll(`[data-file][aria-expanded="true"]`)].map(e=>{let t=Li(e);return{host:Wi(e),file:e.getAttribute(`data-file`)??``,line:e.getAttribute(`data-line`)??``,...t?{state:Bi(t)}:{}}})}function Ki(e,t){return e.host===t.host&&e.file===t.file&&e.line===t.line}function qi(e,t){for(let n of e.querySelectorAll(`[data-file]`))if(n.getAttribute(`data-file`)===t.file&&(n.getAttribute(`data-line`)??``)===t.line&&Wi(n)===t.host)return n;return null}function Ji(e){if(!e||typeof e!=`object`)return!1;let{host:t,file:n,line:r}=e;return typeof t==`string`&&typeof n==`string`&&n!==``&&typeof r==`string`}function Yi(e){let{doc:t,main:n,rail:r,log:i,panes:a}=e,o={};for(let e of t.querySelectorAll(`[data-rail-toggle][aria-controls]`))o[e.getAttribute(`aria-controls`)]=e.getAttribute(`aria-expanded`)===`true`;let s=a?.dataset.ask;return{main:n?.scrollTop??0,rail:r?.scrollTop??0,ask:s===`open`||s===`closed`?s:null,log:i?.scrollTop??0,folds:o,panels:Gi(t),...d(t)}}async function Xi(e,t,n){if(!t)return!1;let{doc:r,main:i,rail:a,log:o}=e,s=t.folds&&typeof t.folds==`object`?t.folds:{};for(let e of r.querySelectorAll(`[data-rail-toggle][aria-controls]`)){let t=s[e.getAttribute(`aria-controls`)];typeof t==`boolean`&&n.setFold(e,t)}if(t.ask===`open`||t.ask===`closed`?n.setAsk(t.ask===`open`):t.ask===null&&n.clearAsk(),Array.isArray(t.panels)){let e=t.panels.filter(Ji).map(e=>({...e,state:Ri(e.state)}));for(let t of Gi(r))if(!e.some(e=>Ki(e,t))){let e=qi(r,t);e&&n.closePanel(e)}let i=[];for(let t of e){let e=qi(r,t);e&&i.push(n.openPanel(e,t.state).catch(()=>{}))}await Promise.all(i)}if(!n.stillCurrent())return!1;let c=x(t,`main`);i&&c!==null&&(i.scrollTop=c);let l=x(t,`rail`);a&&l!==null&&(a.scrollTop=l);let u=x(t,`log`);return o&&u!==null&&(o.scrollTop=u),S(r,t.focus,t.focusVisible),!0}var Zi=`prb-ask-draft:`,Qi=`prb-ask-staged:`,$i=300;function ea(e){return`${Zi}${e}`}function ta(e){return`${Qi}${e}`}function na(e){if(!e)return null;try{let t=JSON.parse(e);if(typeof t?.text!=`string`||t.source!==`selection`&&t.source!==`finding`)return null;let n=t.continues,r=n&&typeof n.id==`string`&&(n.kind===`issue`||n.kind===`question`)?{kind:n.kind,id:n.id,...Number.isFinite(n.writtenAt)?{writtenAt:n.writtenAt}:{}}:void 0;return{text:t.text,source:t.source,...r?{continues:r}:{}}}catch{return null}}function ra(e,t){let{storage:n,win:r}=t,i=ea(t.path),a=ta(t.path),o=null,s=e=>{try{e.trim()===``?(n?.removeItem(i),n?.removeItem(a)):n?.setItem(i,e)}catch{}},c=null;if(t.restore&&e.value===``)try{let t=n?.getItem(i);if(t){e.value=t;let r=na(n?.getItem(a));c=r&&t.includes(r.text)?r:null}}catch{}let l={restoredStage:c,stage(e){try{n?.setItem(a,JSON.stringify(e))}catch{}},save(){o!==null&&r.clearTimeout(o),o=null,s(e.value)},saveSoon(){o!==null&&r.clearTimeout(o),o=r.setTimeout(()=>l.save(),$i)},clear(){o!==null&&r.clearTimeout(o),o=null,s(``)}};return e.addEventListener(`input`,()=>l.saveSoon()),r.addEventListener(`pagehide`,()=>l.save()),l}`${Di}`,`${xi}${bi}${wi}`;function ia(){return`<button type="button" class="prb-update-btn" data-review-update>Update review</button>`}var aa=`Updating this review checks the latest commits and refreshes the PR conversation. Your progress and Buddy AI history will be kept.`;function oa(e){return`<details class="prb-update-alt">
|
|
65
65
|
<summary>Start a new review</summary>
|
|
66
|
-
<span>A brand new review, with its own findings and its own path through the change. Run <code>${
|
|
67
|
-
</details>`}var
|
|
66
|
+
<span>A brand new review, with its own findings and its own path through the change. Run <code>${w(e)}</code> in your session.<button type="button" class="prb-fresh-quiet" data-copy-command="${w(e)}">Copy</button></span>
|
|
67
|
+
</details>`}var sa=`prreviewbuddy review --fresh`;function ca(e,t){return e?e.code.state===`fixed`?{label:`Freshness: Fixed`,state:`fixed`}:t?{label:`PR updated`,state:`changed`}:e.code.state===`changed`?{label:e.code.rewritten?`Code rewritten`:`Code changed`,state:`changed`}:e.code.state===`current`?{label:`Review up to date`,state:`current`}:{label:`Freshness unknown`,state:`unknown`}:t?{label:`PR updated`,state:`changed`}:{label:`Check for updates`,state:`unknown`}}function la(e,t){if(!t.actions)return!1;let n=e??(t.remote?_a(t.remote):null);if(!n)return!1;let r=n.code.state===`fixed`?null:t.remote??null;return n.code.state===`changed`||r!==null||n.code.reason===`missing-commit`}function ua(e,t={}){let n=e??(t.remote?_a(t.remote):null);if(!n)return``;let r=n.code.state===`fixed`?null:t.remote??null,i=n.code.state===`changed`||r!==null,a=n.code.reason===`missing-commit`,o=t.availability?.state===`missing`,s=r?.sha??n.code.latestSha,c=t.dismissedSha!==void 0&&t.dismissedSha===s;if(!t.open&&!o&&(!(i||a)||c))return``;let l=r?va(n.code,r):ga(n.code,t.availability??null),u=e?[...l.facts,`checked ${w(Ie(n.checkedAt))}`]:l.facts;return`<div class="prb-fresh" data-state="${i||a?`changed`:`quiet`}" role="status">
|
|
68
68
|
<div class="prb-fresh-head">
|
|
69
69
|
<span class="prb-fresh-dot" data-freshness="${l.state}" aria-hidden="true"></span>
|
|
70
|
-
<strong class="prb-fresh-title">${
|
|
70
|
+
<strong class="prb-fresh-title">${w(l.title)}</strong>
|
|
71
71
|
<span class="prb-fresh-facts">${u.join(` · `)}</span>
|
|
72
72
|
</div>
|
|
73
73
|
${l.consequence?`<p class="prb-fresh-say">${l.consequence}</p>`:``}
|
|
74
|
-
${
|
|
75
|
-
</div>`}function
|
|
76
|
-
${r?
|
|
77
|
-
${r?
|
|
74
|
+
${da(n,t,i||a,la(e,t))}
|
|
75
|
+
</div>`}function da(e,t,n,r){let i=n?``:`<button type="button" class="prb-fresh-close" data-fresh-close aria-label="Close">×</button>`;return`<div class="prb-fresh-actions">
|
|
76
|
+
${r?ia():``}
|
|
77
|
+
${r?oa(sa):``}
|
|
78
78
|
${i}
|
|
79
|
-
${
|
|
80
|
-
</div>`}function
|
|
79
|
+
${fa(e,t,n,r===!0)}
|
|
80
|
+
</div>`}function fa(e,t,n,r){let i=[r?w(aa):``,t.remote?ya(e.code):ba(e.code,e.checkout.reason!==`no-pull-request`),xa(e,t.actions===!0),n?`<button type="button" class="prb-fresh-quiet" data-fresh-dismiss="${w(t.remote?.sha??e.code.latestSha??``)}">Dismiss this warning</button>`:``].filter(e=>e!==``);if(i.length===0)return``;let a=`<div class="prb-fresh-notes">${i.map(e=>`<p>${e}</p>`).join(``)}</div>`;return n?`<details class="prb-fresh-more">
|
|
81
81
|
<summary>More details</summary>
|
|
82
82
|
${a}
|
|
83
|
-
</details>`:a}function
|
|
83
|
+
</details>`:a}function pa(e,t){return e===null?[]:[`${e} file${e===1?``:`s`} ${t}`]}function ma(e){return e?`<code title="${w(e)}">${w(e.slice(0,7))}</code>`:``}function ha(e){return e?[`reviewed ${ma(e)}`]:[]}function ga(e,t){if(e.state===`fixed`)return{state:`fixed`,title:`Freshness: Fixed`,facts:ha(e.reviewedSha),consequence:t?.state===`missing`?`That commit is no longer in this repository. The review still reads in full, but it cannot be analysed again until the commit is back.`:`This review is of one commit, and a commit does not change, so these findings keep describing it.`};if(e.state===`current`)return{state:`current`,title:`Review up to date`,facts:ha(e.reviewedSha),consequence:``};if(e.state===`changed`){if(e.rewritten)return{state:`changed`,title:`Code rewritten`,facts:[...ha(e.reviewedSha),...pa(e.changedFiles,`differ`)],consequence:`The branch was rebased or amended, so this review describes older code.`};let t=e.newCommits===null?[]:[`${e.newCommits} new commit${e.newCommits===1?``:`s`}`];return{state:`changed`,title:`Code changed`,facts:[...ha(e.reviewedSha),...t,...pa(e.changedFiles,`changed`)],consequence:`New commits landed, so the lines these findings cite may have moved.`}}switch(e.reason){case`uncommitted`:return{state:`unknown`,title:`Cannot be compared`,facts:ha(e.reviewedSha),consequence:`This review read uncommitted work and nothing recorded what the working tree held, so whether the files still match cannot be told from here.`};case`missing-commit`:return{state:`unknown`,title:`Reviewed commit is gone`,facts:ha(e.reviewedSha),consequence:`It is not in this repository any more, after a force-push or a branch rebuilt from scratch, so nothing can be measured against it.`};case`no-branch`:return{state:`unknown`,title:`Cannot be compared`,facts:ha(e.reviewedSha),consequence:`This review’s branch is not in this repository, which is what a pull request from a fork or a branch deleted after merging looks like, so whether the findings still describe it cannot be told from here.`};default:return{state:`unknown`,title:`Cannot be compared`,facts:[],consequence:`Git could not be read in this checkout.`}}}function _a(e){return{checkedAt:0,code:{state:`unknown`,reviewedSha:e.reviewedSha,latestSha:null,comparison:null,newCommits:null,changedFiles:null,rewritten:!1,reason:null},checkout:{state:`unknown`,relation:`unknown`,prHeadSha:null,presentLocally:!1,reason:null},conversation:{attached:!1}}}function va(e,t){let n=e.state===`changed`&&e.latestSha===t.sha?e:null,r=t.newCommits??n?.newCommits??null,i=n?.rewritten?[]:[r===null?`new commits on the pull request`:`${r} new commit${r===1?``:`s`}`];return{state:`changed`,title:`PR updated`,facts:[...ha(e.reviewedSha),...i,...n?pa(n.changedFiles,n.rewritten?`differ`:`changed`):[],`seen ${w(Ie(t.observedAt))}`],consequence:n?.rewritten?`The branch was rebased or amended, so this review describes older code.`:`New commits landed, so the lines these findings cite may have moved.`}}function ya(e){return`This review is based on ${ma(e.reviewedSha)}. The pull request has newer commits. <strong>Update review</strong> fetches them first.`}function ba(e,t){if(!e.comparison)return``;let n=`<code>${w(e.comparison.ref)}</code>`;return e.state===`current`?t?`This review is based on the latest PR commit ${ma(e.reviewedSha)}.`:`This review is based on ${ma(e.reviewedSha)}, the latest commit on ${n}.`:e.comparison.remote?`This review is currently based on ${n}. <strong>Check for updates</strong> compares against the latest version you already have locally. <strong>Update review</strong> fetches the newest version first.`:`This review is currently based on ${n}, the branch it is of.`}function xa(e,t){if(!e.conversation.attached)return``;let n=w(Ie(e.conversation.importedAt));return t?`<button type="button" class="prb-fresh-quiet" data-pr-recheck>Re-check the conversation</button> to fetch new comments and reassess issues and questions against them, at the reviewed commit. Last checked ${n}.`:`The PR conversation was last checked ${n}.`}function Sa(e,t){let n=Oi(t===`changed`);for(let t of e.querySelectorAll(`[data-github-description]`))t.textContent!==n&&(t.textContent=n)}function Ca(e){let t=e.gist||e.whyNotJustified,n=e.locations.find(e=>e.primary)??e.locations[0];return[`### ${e.title.trim()}`,t?`**Why it matters:** ${t.trim()}`:``,`**Simpler approach:** ${e.simplerDirection.trim()}`,n?`**Start here:** \`${n.line?`${n.path}:${n.line}`:n.path}\``:``,e.draftComment?.trim()?`**Draft comment:**\n\n${Ta(e.draftComment.trim())}`:``].filter(e=>e!==``).join(`
|
|
84
84
|
|
|
85
|
-
`)}function
|
|
85
|
+
`)}function wa(e){return e.length===0?``:[`## Simplification suggestions (${e.length})`,...e.map(Ca)].join(`
|
|
86
86
|
|
|
87
|
-
`)}function
|
|
87
|
+
`)}function Ta(e){return e.split(`
|
|
88
88
|
`).map(e=>e===``?`>`:`> ${e}`).join(`
|
|
89
|
-
`)}function
|
|
90
|
-
<h3 class="prb-doc-title">${
|
|
89
|
+
`)}function Ea(e,t=``){return`<div class="prb-doc-head">
|
|
90
|
+
<h3 class="prb-doc-title">${w(e)}</h3>
|
|
91
91
|
${t}
|
|
92
|
-
</div>`}var
|
|
93
|
-
<p><strong>This KISS review describes commit ${
|
|
92
|
+
</div>`}var Da=`<path d="M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"/>`,Oa=`<path d="M4 14h6v6M20 10h-6V4M14 10l7-7M3 21l7-7"/>`;function ka(e,t){return`<svg class="${t}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${e}</svg>`}function Aa(e,t){let n=`Expand ${t}`;return`<button type="button" class="prb-focus-toggle" data-focus-toggle="${e}" data-focus-name="${w(t)}" aria-pressed="false" aria-label="${w(n)}" title="${w(n)}">${ka(Da,`prb-focus-expand`)}${ka(Oa,`prb-focus-collapse`)}</button>`}Aa(`kiss`,`KISS review`),Ea(`Recommendations`,Aa(`kissrecs`,`Recommendations`));var ja={author:{accepted:`Plan to simplify`,declined:`Keep as implemented`},reviewer:{accepted:`Raise with author`,declined:`Leave it`}};function Ma(e,t){return t===`undecided`?`Open`:ja[e][t]}function Na(e,t){return t===0?`<span class="pr-helper-questions-progress-check" aria-hidden="true">\u2713</span><span class="pr-helper-questions-progress-count">All ${e} decided</span>`:`<span class="pr-helper-questions-progress-count">${t} of ${e} undecided</span>`}function Pa(e){return`Decided (${e})`}function Fa(e,t,n=!1){return n?{enabled:!1,note:`Saving your decision. You can copy once it is saved.`}:t?{enabled:!1,note:`Run KISS again before handing these recommendations off.`}:e===0?{enabled:!1,note:`Choose Raise with author on the recommendations you want to hand off.`}:{enabled:!0,note:`${e===1?`1 recommendation`:`${e} recommendations`} to raise with the author.`}}function Ia(e,t,n={}){if(!t||t.state!==`changed`)return``;let r=n.actions?`<button type="button" class="prb-kiss-fresh-run" data-kiss-run-open>Run again</button>`:``;if(n.dismissedSha&&n.dismissedSha===t.latestSha)return`<div class="prb-kiss-fresh" data-kiss-freshness="changed" data-collapsed role="status">
|
|
93
|
+
<p><strong>This KISS review describes commit ${w(e.slice(0,7))}.</strong> The branch has moved on since. ${r}</p>
|
|
94
94
|
</div>`;let i=t.rewritten?`The branch has been rewritten since, so this report describes commits that are no longer on it.`:t.newCommits===null?`The branch has moved on since.`:`There ${t.newCommits===1?`has been 1 commit`:`have been ${t.newCommits} commits`} on the branch since.`;return`<div class="prb-kiss-fresh" data-kiss-freshness="changed" role="status">
|
|
95
|
-
<p><strong>This KISS review describes commit ${
|
|
95
|
+
<p><strong>This KISS review describes commit ${w(e.slice(0,7))}.</strong> ${w(i)}</p>
|
|
96
96
|
<p class="prb-kiss-fresh-note">Running KISS again analyses the branch as it is now. The report below and your decisions about it are kept either way.</p>
|
|
97
|
-
<p class="prb-kiss-fresh-actions">${r}${n.actions&&t.latestSha?`<button type="button" class="prb-kiss-fresh-dismiss" data-kiss-freshness-dismiss="${
|
|
98
|
-
</div>`}var
|
|
97
|
+
<p class="prb-kiss-fresh-actions">${r}${n.actions&&t.latestSha?`<button type="button" class="prb-kiss-fresh-dismiss" data-kiss-freshness-dismiss="${w(t.latestSha)}">Not now</button>`:``}</p>
|
|
98
|
+
</div>`}var La=new WeakMap;function Ra(e){let t=e.dataset.kissDecide;return e.getAttribute(`aria-pressed`)===`true`?`undecided`:t}function za(e,t,n){let r=e.dataset.decision??`undecided`,i=async()=>{Ya(e);let i=e.contains(document.activeElement);Ba(e,t),qa(e,!0),Ha(n),i&&Ja(e);let a=await n.send({runId:e.dataset.kissRunId??``,recommendationId:e.dataset.kissRec??``,decision:t}).catch(()=>!1);if(qa(e,!1),a){Ha(n);return}Ba(e,r),Ha(n),Xa(e,t,n)},a=(La.get(e)??Promise.resolve()).then(i,i);return La.set(e,a),a}function Ba(e,t){e.dataset.decision=t;let n=Ka(e),r=e.querySelector(`[data-kiss-status]`);r&&(r.dataset.kissStatus=t,r.textContent=Ma(n,t));for(let r of e.querySelectorAll(`[data-kiss-decide]`))r.setAttribute(`aria-pressed`,String(r.dataset.kissDecide===t)),r.textContent=ja[n][r.dataset.kissDecide];Va(e,t!==`undecided`)}function Va(e,t){let n=(e.closest(`[data-view="kissrecs"]`)??document).querySelector(t?`[data-kiss-decided-list]`:`[data-kiss-open-list]`);if(!n||e.parentElement===n)return;let r=Number(e.dataset.rank),i=[...n.querySelectorAll(`:scope > [data-kiss-rec]`)].find(e=>Number(e.dataset.rank)>r);n.insertBefore(e,i??null)}function Ha(e,t=document){let n=[...t.querySelectorAll(`[data-kiss-rec]`)];if(n.length===0)return;let r=n.filter(e=>e.dataset.decision&&e.dataset.decision!==`undecided`).length,i=n.length-r,a=t.querySelector(`[data-kiss-progress]`);a&&(a.innerHTML=Na(n.length,i));let o=t.querySelector(`[data-kiss-decided]`);if(o){o.hidden=r===0,o.toggleAttribute(`data-nothing-open`,i===0);let e=o.querySelector(`[data-kiss-decided-summary]`);e&&(e.textContent=Pa(r))}e.paintRail(n.length,i),Ua(t)}function Ua(e=document){let t=e.querySelector(`[data-kiss-handoff]`);if(!t)return;let n=new Set([...e.querySelectorAll(`[data-kiss-rec][data-decision="accepted"]`)].map(e=>e.dataset.kissRec)),r=Ga(t).filter(e=>n.has(e.id)),i=e.querySelector(`[data-kiss-rec][aria-busy]`)!==null,a=Fa(r.length,t.hasAttribute(`data-stale`),i),o=t.querySelector(`[data-kiss-handoff-copy]`);o&&(o.disabled=!a.enabled,o.setAttribute(`data-copy-source`,a.enabled?wa(r):``));let s=t.querySelector(`[data-kiss-handoff-note]`);s&&(s.textContent=a.note)}function Wa(e,t=document){for(let n of t.querySelectorAll(`[data-kiss-stale]`))n.hidden=!e;let n=t.querySelector(`[data-kiss-handoff]`);n&&(n.toggleAttribute(`data-stale`,e),Ua(t))}function Ga(e){try{let t=JSON.parse(e.querySelector(`script[data-kiss-handoff-source]`)?.textContent??`[]`);return Array.isArray(t)?t:[]}catch{return[]}}function Ka(e){return e.dataset.audience===`author`?`author`:`reviewer`}function qa(e,t){e.toggleAttribute(`aria-busy`,t);for(let n of e.querySelectorAll(`[data-kiss-decide]`))n.disabled=t}function Ja(e){if(!e.closest(`[data-kiss-decided-list]`)){e.querySelector(`[data-kiss-decide][aria-pressed="true"], [data-kiss-decide]`)?.focus();return}let t=e.closest(`[data-view="kissrecs"]`)??document;(t.querySelector(`[data-kiss-open-list] > [data-kiss-rec] .prb-kiss-rec-title`)??t.querySelector(`[data-kiss-decided-summary]`))?.focus()}function Ya(e){e.querySelector(`[data-kiss-decision-error]`)?.remove()}function Xa(e,t,n){let r=document.createElement(`p`);r.className=`prb-kiss-decision-error`,r.dataset.kissDecisionError=``,r.setAttribute(`role`,`alert`),r.append(`Couldn't save that decision. `);let i=document.createElement(`button`);i.type=`button`,i.className=`prb-kiss-decision-retry`,i.textContent=`Try again`,i.addEventListener(`click`,()=>void za(e,t,n)),r.append(i),(e.querySelector(`[data-kiss-actions]`)??e).append(r);let a=e.closest(`[data-kiss-decided]`);a&&(a.open=!0),i.focus()}function Za(e,t=!1){return e!==`merged`&&e!==`closed`?``:`<span class="prb-card-pr-state" data-pr-state="${e}">${e===`merged`?`Merged`:t?`Closed`:`PR closed`}</span>`}function Qa(e,t){t.complete!==void 0&&to(e,t.complete),t.activity!==void 0&&$a(e,t.activity??void 0),t.lifecycle===void 0?t.activity!==void 0&&no(e,eo(e)):no(e,t.lifecycle??void 0),t.queued!==void 0&&ro(e,t.queued)}function $a(e,t){let n=e.querySelector(`[data-review-menu]`);n&&(delete n.dataset.activityAt,delete n.dataset.activityKind,delete n.dataset.activityMovedAt,t&&(n.dataset.activityAt=String(t.at),n.dataset.activityKind=t.kind,t.movedAt!==void 0&&(n.dataset.activityMovedAt=String(t.movedAt))))}function eo(e){let t=e.querySelector(`[data-review-menu]`);return u(t?{state:t.dataset.lifecycleState,at:Number(t.dataset.lifecycleAt)}:void 0)}function to(e,t){let r=t?`complete`:`in-progress`,i=e.querySelector(`[data-page-status]`);i&&fe(i,r);let a=e.querySelector(`[data-review-menu] [data-mark-status]`);if(a){let e=t?`in-progress`:`complete`;a.dataset.markStatus=e,a.textContent=n(e)}}function no(e,t){let n=e.querySelector(`[data-review-menu]`);n&&(t?(n.dataset.lifecycleState=t.state,n.dataset.lifecycleAt=String(t.at)):(delete n.dataset.lifecycleState,delete n.dataset.lifecycleAt));let r=n?io(n):void 0,i=e.querySelector(`[data-page-lifecycle]`);i&&je(i,t,r);let a=e.querySelector(`[data-page-lifecycle-chip]`);if(a){let e=o(t,r);a.hidden=e===void 0,a.textContent=e??``}for(let n of e.querySelectorAll(`[data-review-menu] [data-lifecycle-set]`)){let e=n.dataset.lifecycleSet;n.hidden=!b(e,t,r),n.textContent=_(e,t,r)}}function ro(e,t){e.querySelector(`[data-review-menu]`)?.toggleAttribute(`data-queued`,t);let n=e.querySelector(`[data-review-menu] [data-queue-action]`);n&&(n.dataset.queueAction=t?`remove`:`add`,n.textContent=r(t))}function io(e){return f(e.dataset)}function ao(e){return u(e)??null}function oo(e){if(typeof e!=`object`||!e)return null;let{complete:t,lifecycle:n,queued:r,activity:i}=e,a={lifecycle:ao(n)};if(typeof t==`boolean`&&(a.complete=t),typeof r==`boolean`&&(a.queued=r),i===null)a.activity=null;else{let e=l(i);e&&(a.activity=e)}return a}function so(){let e=0,t=0;return{snapshot:()=>e,current:n=>t===0&&n===e,begin:()=>{e+=1,t+=1;let n=!1;return()=>{n||(n=!0,e+=1,--t)}}}}var co=`The workspace server did not answer. It may have stopped.`;function lo(e){let t=()=>e.root.querySelector(`[data-review-menu]`),n=!1,r=async(t,r,i)=>{if(n)return{error:null,busy:!0};n=!0;let a=e.gate.begin();try{let n=await e.post(t,r),a=await n.json().catch(()=>null);return n.ok&&a?(Qa(e.root,i(a)),{error:null}):{error:typeof a?.error==`string`?a.error:`That could not be changed.`}}catch{return{error:co}}finally{n=!1,a()}},i=e=>r(`/queue`,{action:e},e=>({lifecycle:ao(e.lifecycle),queued:e.queued===!0}));return{setComplete:e=>r(`/state`,{complete:e},e=>({complete:typeof e.completedAt==`number`,queued:e.queued===!0})),setLifecycle:e=>r(`/lifecycle`,{state:e},e=>({lifecycle:ao(e.lifecycle),queued:e.queued===!0})),setQueued:i,toggleQueued:()=>i(t()?.hasAttribute(`data-queued`)?`remove`:`add`),checkForUpdates:async()=>{await e.checkForUpdates()},deleteReview:async()=>{try{let t=await e.post(`/delete`);return t.ok?{error:null}:{error:(await t.json().catch(()=>null))?.error??`That could not be deleted.`}}catch{return{error:co}}},offer:()=>{let r=t(),i=r?.hasAttribute(`data-can-write`)===!0,a=i&&r?.hasAttribute(`data-branch-actions`)===!0,o=r?u({state:r.dataset.lifecycleState,at:Number(r.dataset.lifecycleAt)}):void 0,s=r?f(r.dataset):void 0,c=e.root.querySelector(`[data-page-status]`)?.dataset.status===`complete`,l=!n;return{reviewed:l&&i&&!c,waiting:l&&a&&b(`waiting`,o,s),done:l&&a&&b(`done`,o,s),queue:l&&a,checkForUpdates:i&&r?.hasAttribute(`data-checkable`)===!0,delete:i}},busy:()=>n}}function uo(e,t){return`${e} ${t}${e===1?``:`s`}`}function fo(e,t){let n=e+t;return{total:n===0?`Nothing chosen`:`${n} chosen`,issues:e?uo(e,`issue`):``,questions:t?uo(t,`question`):``}}function po(e,t){let n=fo(e,t);return[n.total,n.issues,n.questions].filter(Boolean).join(` · `)}function mo(e){return e===0?``:`${e} chosen`}function ho(e){let t=(e,t)=>{let n=t.map(e=>typeof e==`string`?{text:e.trim()}:{text:e.text.trim(),ref:e.ref}).filter(e=>e.text);return n.length===0?null:n.every(e=>e.ref)?`## ${e}\n\n${n.map(e=>`**${e.ref}.** ${e.text}`).join(`
|
|
99
99
|
|
|
100
100
|
`)}`:`## ${e}\n\n${n.map(({text:e},t)=>{let n=`${t+1}. `;return n+e.replace(/\n/g,`\n${` `.repeat(n.length)}`).replace(/\n +\n/g,`
|
|
101
101
|
|
|
@@ -103,89 +103,85 @@ import{K as e,V as t,_t as n,a as r,c as i,ct as a,dt as o,ft as s,gt as c,ht as
|
|
|
103
103
|
|
|
104
104
|
`)}`},n=[t(`Issues`,e.issues),t(`Questions`,e.questions)].filter(Boolean),r=e.reviewTag&&n.length&&[...e.issues,...e.questions].some(e=>typeof e!=`string`&&e.ref)?[`_References from review ${e.reviewTag}. Please keep them, and this line, in your reply._`]:[];return[...n,...r].join(`
|
|
105
105
|
|
|
106
|
-
`)}var eo=e=>`<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${e}</svg>`;eo(`<path d="m3 17 2 2 4-4M3 7l2 2 4-4M13 6h8M13 12h8M13 18h8"/>`),eo(`<path d="M20 6 9 17l-5-5"/>`);function to(e){let t=e=>e.ref?{text:e.text,ref:e.ref}:e.text;return $a({issues:e.issues.map(t),questions:e.questions.map(t),...e.reviewTag?{reviewTag:e.reviewTag}:{}})}function no(){let e=!1,t={issue:new Set,question:new Set},n=null,r=()=>{t.issue.clear(),t.question.clear()};return{selecting:()=>e,enter(){e=!0},exit(){e=!1,r()},clear:r,toggle(e,r,i){return!r||t[e].has(r)===i?!1:(i?t[e].add(r):t[e].delete(r),n=null,!0)},has:(e,n)=>t[e].has(n),ids:e=>t[e],total:()=>t.issue.size+t.question.size,reconcile(e){let r=!1;for(let n of[`issue`,`question`])for(let i of[...t[n]])e(n,i)||(t[n].delete(i),r=!0);return r&&(n=null),r},draft(e){if(n?.edited)return n.text;let t=e(),r=ro(t);return n?.basis!==r&&(n={text:to(t),edited:!1,basis:r}),n.text},edit(e){n!==null&&(n={...n,text:e,edited:!0})},edited:()=>n?.edited??!1,snapshot:()=>({selecting:e,issues:[...t.issue],questions:[...t.question],draft:n?{...n}:null}),restore(i){if(!ao(i))return!1;e=i.selecting,r();for(let e of i.issues)e&&t.issue.add(e);for(let e of i.questions)e&&t.question.add(e);return n=i.draft?{...i.draft}:null,!0}}}function ro(e){let t=[...e.issues.map(e=>[`issue`,e.id,e.text]),...e.questions.map(e=>[`question`,e.id,e.text])];return JSON.stringify([e.reviewTag??``,...t.sort((e,t)=>e[0]+`\0`+e[1]<t[0]+`\0`+t[1]?-1:1)])}var io=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`);function ao(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.selecting!=`boolean`||!io(t.issues)||!io(t.questions))return!1;if(t.draft===null)return!0;if(!t.draft||typeof t.draft!=`object`)return!1;let n=t.draft;return typeof n.text==`string`&&typeof n.edited==`boolean`&&typeof n.basis==`string`}var A=[`preview`,`markdown`],oo={issue:`issues`,question:`questions`};function so({root:e,showView:t}){let n=no(),r=e=>e.closest(`[data-finding-card]`)?.getAttribute(`data-finding-card`)??``,i=e=>e.dataset.feedbackPick===`issue`||e.dataset.feedbackPick===`question`?e.dataset.feedbackPick:null;function a(){let t=n.selecting(),a=n.ids(`issue`).size,o=n.ids(`question`).size;e.querySelector(`.prb-body`)?.toggleAttribute(`data-feedback-selecting`,t);for(let n of e.querySelectorAll(`[data-feedback-select]`))n.setAttribute(`aria-pressed`,String(t));for(let t of e.querySelectorAll(`[data-feedback-pick]`)){let e=i(t);t.checked=e!==null&&n.has(e,r(t))}let s=e.querySelector(`[data-feedback-tray]`);if(s){s.hidden=!t;let e=Xa(a,o),n=s.querySelector(`[data-feedback-total]`);n&&(n.textContent=e.total);for(let t of[`issues`,`questions`]){let n=s.querySelector(`[data-feedback-goto="${t}"]`);if(!n)continue;let r=n.querySelector(`[data-feedback-goto-label]`);r&&(r.textContent=e[t]),n.hidden=e[t]===``}let r=s.querySelector(`[data-feedback-prepare]`);r&&(r.disabled=a+o===0)}for(let[n,r]of[[`issues`,a],[`questions`,o]]){let i=e.querySelector(`[data-rail-selected="${n}"]`);i&&(i.textContent=Qa(r),i.hidden=!t||r===0)}}function o(t){let n=e.querySelector(`[data-feedback-text]`);n&&(n.value=t),e.querySelector(`[data-feedback-copy]`)?.setAttribute(At,t)}let s=()=>{let t=e.querySelector(`[data-review-tag]`)?.dataset.reviewTag;return{issues:co(e,`issue`,n.ids(`issue`)),questions:co(e,`question`,n.ids(`question`)),...t?{reviewTag:t}:{}}},c={enter(){n.enter(),a()},exit(){n.exit(),a()},clear(){n.clear(),a()},toggle(e,t,r){n.toggle(e,t,r)&&a()},flip(e){let t=e.querySelector(`[data-feedback-pick]`),r=t?i(t):null,a=e.getAttribute(`data-finding-card`)??``;return!n.selecting()||!r||!a?!1:(c.toggle(r,a,!n.has(r,a)),!0)},compose(){return to(s())},prepare(){if(n.total()===0)return;o(n.draft(s));let t=e.querySelector(`[data-feedback-dialog-count]`);t&&(t.textContent=Za(n.ids(`issue`).size,n.ids(`question`).size));let r=e.querySelector(`[data-feedback-dialog]`);r&&!r.open&&r.showModal(),c.showDraftTab(`preview`),e.querySelector(`[data-draft-tab="preview"]`)?.focus()},showDraftTab(t){lo(e,t)},state(){return{selecting:n.selecting(),issues:[...n.ids(`issue`)],questions:[...n.ids(`question`)]}}};return e.addEventListener(`change`,e=>{let t=e.target.closest(`[data-feedback-pick]`),n=t?i(t):null;t&&n&&c.toggle(n,r(t),t.checked)}),e.addEventListener(`input`,t=>{let r=t.target.closest(`[data-feedback-text]`);r&&(n.edit(r.value),e.querySelector(`[data-feedback-copy]`)?.setAttribute(At,r.value))}),e.addEventListener(`click`,r=>{let i=r.target;if(i.closest(`[data-feedback-select]`))return n.selecting()?c.exit():c.enter();if(i.closest(`[data-feedback-clear]`))return c.clear();if(i.closest(`[data-feedback-done]`))return c.exit();if(i.closest(`[data-feedback-prepare]`))return c.prepare();if(i.closest(`[data-feedback-close]`))return e.querySelector(`[data-feedback-dialog]`)?.close();let a=i.closest(`[data-draft-tab]`)?.dataset.draftTab;if(a===`preview`||a===`markdown`)return c.showDraftTab(a);let o=i.closest(`[data-feedback-goto]`)?.dataset.feedbackGoto;if(o===`issues`||o===`questions`)return t(o);let s=i.closest(`[data-finding-card]`);!s||i.closest(`a, button, input, select, textarea, label, summary, [data-menu], [role="button"], [contenteditable], [data-file], .prb-code`)||(e.getSelection()?.isCollapsed??!0)&&c.flip(s)}),e.addEventListener(`keydown`,t=>fo(e,t)),a(),c}function co(e,t,n){return[...e.querySelectorAll(`[data-view="${oo[t]}"] [data-finding-card]`)].map(e=>({id:e.getAttribute(`data-finding-card`)??``,card:e})).filter(({id:e})=>n.has(e)).map(({id:e,card:t})=>{let n=t.querySelector(`[${jt}]`),r=n?.getAttribute(Mt);return{id:e,text:n?.getAttribute(`data-feedback-source`)??``,...r?{ref:r}:{}}})}function lo(e,t){for(let n of A){let r=e.querySelector(`[data-draft-tab="${n}"]`);r?.setAttribute(`aria-selected`,String(n===t)),r?.setAttribute(`tabindex`,n===t?`0`:`-1`);let i=e.querySelector(`#prb-draft-${n}`);i&&(i.hidden=n!==t)}if(t===`preview`)return uo(e);let n=e.querySelector(`[data-feedback-text]`);n?.setSelectionRange(0,0),n&&(n.scrollTop=0)}function uo(e){let t=e.querySelector(`[data-feedback-preview]`),n=e.querySelector(`[data-feedback-text]`)?.value??``;t&&(t.innerHTML=n.trim()?ot(n):`<p class="prb-draft-empty">The draft is empty.</p>`,t.scrollTop=0)}function fo(e,t){let n=t.target.closest(`[data-draft-tab]`)?.dataset.draftTab;if(!n)return;let r=A.indexOf(n),i=t.key===`ArrowRight`?A[(r+1)%A.length]:t.key===`ArrowLeft`?A[(r+A.length-1)%A.length]:t.key===`Home`?A[0]:t.key===`End`?A[A.length-1]:null;i&&(t.preventDefault(),lo(e,i),e.querySelector(`[data-draft-tab="${i}"]`)?.focus())}function po(e){let t=e.querySelector(`[data-feedback-text]`);if(t&&e.activeElement===t&&t.selectionStart!==t.selectionEnd)return!0;let n=e.getSelection();return!!(n&&!n.isCollapsed&&n.toString()!==``)}function mo(e,t){let n=()=>t.querySelector(`[data-feedback-dialog] [data-feedback-copy]`);return{"review.feedback.prepare":{available:()=>{let{issues:t,questions:n}=e.state();return t.length+n.length>0},run:()=>e.prepare()},"review.feedback.copyDraft":{available:()=>n()!==null&&!po(t),run:()=>n()?.click()}}}function ho(e){let t=e.querySelector(`.prb-view:is([data-view="issues"], [data-view="questions"]):not([hidden])`);return t?[...t.querySelectorAll(`[data-finding-card]`)].filter(e=>e.checkVisibility()&&!e.parentElement?.closest(`details:not([open])`)):[]}function go(e){let t=e.getSelection();return!!(t&&!t.isCollapsed&&t.toString()!==``)}function _o(e){let{doc:t}=e,n=we({doc:t,item:`[data-finding-card]`,walk:()=>ho(t),background:e.pane}),r=()=>n.holdsKeys()?n.current():null,i=e=>e?.querySelector(`[data-ask-buddy-menu]`)??null,a=e=>e?.querySelector(`[data-copy-source]`)??null,o=e=>e?.querySelector(`[data-feedback-pick]`)!=null;return{cursor:n,commands:{"review.findings.next":{available:()=>ho(t).length>0,run:()=>n.move(1)},"review.findings.previous":{available:()=>ho(t).length>0,run:()=>n.move(-1)},"review.findings.askBuddy":{available:()=>i(r())!==null,run:()=>{let t=i(r());t&&e.openMenu(t,()=>n.refocus())}},"review.findings.copy":{available:()=>!go(t)&&a(r())!==null,run:()=>a(r())?.click()},"review.findings.choose":{available:()=>e.selecting()&&o(r()),run:()=>{let t=r();t&&e.flip(t)}}}}}function vo(e){return e.querySelector(`[data-review-home]`)?.dataset.viewNav??null}ha(`progress`,`Review progress`);function yo(e,t=Date.now()){return`Running for ${bo(t-e)}`}function bo(e){let t=Math.max(0,Math.round(e/1e3)),n=e=>String(e).padStart(2,`0`);return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m ${n(t%60)}s`:`${Math.floor(t/3600)}h ${n(Math.floor(t/60)%60)}m ${n(t%60)}s`}var xo={job:`data-job-phase`,kiss:`data-kiss-phase`,update:`data-update-phase`};function So(e){let t=new Map;for(let n of Object.keys(xo)){let r=xo[n],i=e.querySelector(`[${r}]`);i&&!be(i.getAttribute(r)??void 0)&&t.set(n,i)}return t}function Co(e,t,n){return t.failed?!0:e===`update`?t.phase===`none`||be(t.phase):wo(t.phase,n)}function wo(e,t){return be(e)?!0:(e===`conversation`||e===`analysing`)&&!t.querySelector(`[data-view="files"]`)}function To(e,t,n){let r=[...e.querySelectorAll(`.prb-progress-step`)],i=r.findIndex(e=>e.dataset.phase===t);if(i===-1)return;r.forEach((e,t)=>{let n=t<i?`complete`:t===i?`active`:`pending`;e.dataset.state=n;let r=e.querySelector(`.prb-progress-label`),a=n===`complete`?e.dataset.labelDone:e.dataset.labelDoing;r&&a&&(r.textContent=a),t!==i&&e.querySelector(`[data-step-note]`)?.remove()});let a=r[i];if(!n||xe(n,a.querySelector(`.prb-progress-label`)?.textContent??``))return;let o=a.querySelector(`[data-step-note]`);o||(o=document.createElement(`p`),o.className=`prb-progress-note`,o.setAttribute(`data-step-note`,``),a.appendChild(o)),o.textContent=n}function Eo(e){for(let t of e.querySelectorAll(`[data-started-at]`)){let e=Number(t.dataset.startedAt);Number.isFinite(e)&&(t.textContent=yo(e))}}function Do(e,t=1e3){let n=window.setInterval(()=>Eo(e),t);return()=>window.clearInterval(n)}async function Oo({look:e,reload:t,giveUpMs:n=2e4,pauseMs:r=400}){let i=!1,a=()=>{i||(i=!0,t())};for(setTimeout(a,n);!i;){try{let t=await e();if(!t||t===`none`||be(t))return a()}catch{}await new Promise(e=>setTimeout(e,r))}}function ko(e,t,n){let r=e.scope===`change`?`Whole change`:t.get(e.scope)??`A theme of this change`,i=e.scope===`change`?``:e.scope;return`<article class="prb-diagram" id="prb-diagram-${T(e.scope)}" data-diagram-card="${T(e.scope)}">
|
|
106
|
+
`)}var go=e=>`<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${e}</svg>`;go(`<path d="m3 17 2 2 4-4M3 7l2 2 4-4M13 6h8M13 12h8M13 18h8"/>`),go(`<path d="M20 6 9 17l-5-5"/>`);function _o(e){let t=e=>e.ref?{text:e.text,ref:e.ref}:e.text;return ho({issues:e.issues.map(t),questions:e.questions.map(t),...e.reviewTag?{reviewTag:e.reviewTag}:{}})}function vo(){let e=!1,t={issue:new Set,question:new Set},n=null,r=()=>{t.issue.clear(),t.question.clear()};return{selecting:()=>e,enter(){e=!0},exit(){e=!1,r()},clear:r,toggle(e,r,i){return!r||t[e].has(r)===i?!1:(i?t[e].add(r):t[e].delete(r),n=null,!0)},has:(e,n)=>t[e].has(n),ids:e=>t[e],total:()=>t.issue.size+t.question.size,reconcile(e){let r=!1;for(let n of[`issue`,`question`])for(let i of[...t[n]])e(n,i)||(t[n].delete(i),r=!0);return r&&(n=null),r},draft(e){if(n?.edited)return n.text;let t=e(),r=yo(t);return n?.basis!==r&&(n={text:_o(t),edited:!1,basis:r}),n.text},edit(e){n!==null&&(n={...n,text:e,edited:!0})},edited:()=>n?.edited??!1,snapshot:()=>({selecting:e,issues:[...t.issue],questions:[...t.question],draft:n?{...n}:null}),restore(i){if(!xo(i))return!1;e=i.selecting,r();for(let e of i.issues)e&&t.issue.add(e);for(let e of i.questions)e&&t.question.add(e);return n=i.draft?{...i.draft}:null,!0}}}function yo(e){let t=[...e.issues.map(e=>[`issue`,e.id,e.text]),...e.questions.map(e=>[`question`,e.id,e.text])];return JSON.stringify([e.reviewTag??``,...t.sort((e,t)=>e[0]+`\0`+e[1]<t[0]+`\0`+t[1]?-1:1)])}var bo=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`);function xo(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.selecting!=`boolean`||!bo(t.issues)||!bo(t.questions))return!1;if(t.draft===null)return!0;if(!t.draft||typeof t.draft!=`object`)return!1;let n=t.draft;return typeof n.text==`string`&&typeof n.edited==`boolean`&&typeof n.basis==`string`}var k=[`preview`,`markdown`],So={issue:`issues`,question:`questions`};function Co({root:e,showView:t}){let n=vo(),r=e=>e.closest(`[data-finding-card]`)?.getAttribute(`data-finding-card`)??``,i=e=>e.dataset.feedbackPick===`issue`||e.dataset.feedbackPick===`question`?e.dataset.feedbackPick:null;function a(){let t=n.selecting(),a=n.ids(`issue`).size,o=n.ids(`question`).size;e.querySelector(`.prb-body`)?.toggleAttribute(`data-feedback-selecting`,t);for(let n of e.querySelectorAll(`[data-feedback-select]`))n.setAttribute(`aria-pressed`,String(t));for(let t of e.querySelectorAll(`[data-feedback-pick]`)){let e=i(t);t.checked=e!==null&&n.has(e,r(t))}let s=e.querySelector(`[data-feedback-tray]`);if(s){s.hidden=!t;let e=fo(a,o),n=s.querySelector(`[data-feedback-total]`);n&&(n.textContent=e.total);for(let t of[`issues`,`questions`]){let n=s.querySelector(`[data-feedback-goto="${t}"]`);if(!n)continue;let r=n.querySelector(`[data-feedback-goto-label]`);r&&(r.textContent=e[t]),n.hidden=e[t]===``}let r=s.querySelector(`[data-feedback-prepare]`);r&&(r.disabled=a+o===0)}for(let[n,r]of[[`issues`,a],[`questions`,o]]){let i=e.querySelector(`[data-rail-selected="${n}"]`);i&&(i.textContent=mo(r),i.hidden=!t||r===0)}}function o(t){let n=e.querySelector(`[data-feedback-text]`);n&&(n.value=t),e.querySelector(`[data-feedback-copy]`)?.setAttribute(Ut,t)}let s=()=>{let t=e.querySelector(`[data-review-tag]`)?.dataset.reviewTag;return{issues:wo(e,`issue`,n.ids(`issue`)),questions:wo(e,`question`,n.ids(`question`)),...t?{reviewTag:t}:{}}},c={enter(){n.enter(),a()},exit(){n.exit(),a()},clear(){n.clear(),a()},toggle(e,t,r){n.toggle(e,t,r)&&a()},flip(e){let t=e.querySelector(`[data-feedback-pick]`),r=t?i(t):null,a=e.getAttribute(`data-finding-card`)??``;return!n.selecting()||!r||!a?!1:(c.toggle(r,a,!n.has(r,a)),!0)},compose(){return _o(s())},prepare(){if(n.total()===0)return;o(n.draft(s));let t=e.querySelector(`[data-feedback-dialog-count]`);t&&(t.textContent=po(n.ids(`issue`).size,n.ids(`question`).size));let r=e.querySelector(`[data-feedback-dialog]`);r&&!r.open&&r.showModal(),c.showDraftTab(`preview`),e.querySelector(`[data-draft-tab="preview"]`)?.focus()},showDraftTab(t){To(e,t)},state(){return{selecting:n.selecting(),issues:[...n.ids(`issue`)],questions:[...n.ids(`question`)]}}};return e.addEventListener(`change`,e=>{let t=e.target.closest(`[data-feedback-pick]`),n=t?i(t):null;t&&n&&c.toggle(n,r(t),t.checked)}),e.addEventListener(`input`,t=>{let r=t.target.closest(`[data-feedback-text]`);r&&(n.edit(r.value),e.querySelector(`[data-feedback-copy]`)?.setAttribute(Ut,r.value))}),e.addEventListener(`click`,r=>{let i=r.target;if(i.closest(`[data-feedback-select]`))return n.selecting()?c.exit():c.enter();if(i.closest(`[data-feedback-clear]`))return c.clear();if(i.closest(`[data-feedback-done]`))return c.exit();if(i.closest(`[data-feedback-prepare]`))return c.prepare();if(i.closest(`[data-feedback-close]`))return e.querySelector(`[data-feedback-dialog]`)?.close();let a=i.closest(`[data-draft-tab]`)?.dataset.draftTab;if(a===`preview`||a===`markdown`)return c.showDraftTab(a);let o=i.closest(`[data-feedback-goto]`)?.dataset.feedbackGoto;if(o===`issues`||o===`questions`)return t(o);let s=i.closest(`[data-finding-card]`);!s||i.closest(`a, button, input, select, textarea, label, summary, [data-menu], [role="button"], [contenteditable], [data-file], .prb-code`)||(e.getSelection()?.isCollapsed??!0)&&c.flip(s)}),e.addEventListener(`keydown`,t=>Do(e,t)),a(),c}function wo(e,t,n){return[...e.querySelectorAll(`[data-view="${So[t]}"] [data-finding-card]`)].map(e=>({id:e.getAttribute(`data-finding-card`)??``,card:e})).filter(({id:e})=>n.has(e)).map(({id:e,card:t})=>{let n=t.querySelector(`[${Wt}]`),r=n?.getAttribute(Gt);return{id:e,text:n?.getAttribute(`data-feedback-source`)??``,...r?{ref:r}:{}}})}function To(e,t){for(let n of k){let r=e.querySelector(`[data-draft-tab="${n}"]`);r?.setAttribute(`aria-selected`,String(n===t)),r?.setAttribute(`tabindex`,n===t?`0`:`-1`);let i=e.querySelector(`#prb-draft-${n}`);i&&(i.hidden=n!==t)}if(t===`preview`)return Eo(e);let n=e.querySelector(`[data-feedback-text]`);n?.setSelectionRange(0,0),n&&(n.scrollTop=0)}function Eo(e){let t=e.querySelector(`[data-feedback-preview]`),n=e.querySelector(`[data-feedback-text]`)?.value??``;t&&(t.innerHTML=n.trim()?yt(n):`<p class="prb-draft-empty">The draft is empty.</p>`,t.scrollTop=0)}function Do(e,t){let n=t.target.closest(`[data-draft-tab]`)?.dataset.draftTab;if(!n)return;let r=k.indexOf(n),i=t.key===`ArrowRight`?k[(r+1)%k.length]:t.key===`ArrowLeft`?k[(r+k.length-1)%k.length]:t.key===`Home`?k[0]:t.key===`End`?k[k.length-1]:null;i&&(t.preventDefault(),To(e,i),e.querySelector(`[data-draft-tab="${i}"]`)?.focus())}function Oo(e){let t=e.querySelector(`[data-feedback-text]`);if(t&&e.activeElement===t&&t.selectionStart!==t.selectionEnd)return!0;let n=e.getSelection();return!!(n&&!n.isCollapsed&&n.toString()!==``)}function ko(e,t){let n=()=>t.querySelector(`[data-feedback-dialog] [data-feedback-copy]`);return{"review.feedback.prepare":{available:()=>{let{issues:t,questions:n}=e.state();return t.length+n.length>0},run:()=>e.prepare()},"review.feedback.copyDraft":{available:()=>n()!==null&&!Oo(t),run:()=>n()?.click()}}}function Ao(e){let t=e.querySelector(`.prb-view:is([data-view="issues"], [data-view="questions"]):not([hidden])`);return t?[...t.querySelectorAll(`[data-finding-card]`)].filter(e=>e.checkVisibility()&&!e.parentElement?.closest(`details:not([open])`)):[]}function jo(e){let t=e.getSelection();return!!(t&&!t.isCollapsed&&t.toString()!==``)}function Mo(e){let{doc:t}=e,n=Le({doc:t,item:`[data-finding-card]`,walk:()=>Ao(t),background:e.pane}),r=()=>n.holdsKeys()?n.current():null,i=e=>e?.querySelector(`[data-ask-buddy-menu]`)??null,a=e=>e?.querySelector(`[data-copy-source]`)??null,o=e=>e?.querySelector(`[data-feedback-pick]`)!=null;return{cursor:n,commands:{"review.findings.next":{available:()=>Ao(t).length>0,run:()=>n.move(1)},"review.findings.previous":{available:()=>Ao(t).length>0,run:()=>n.move(-1)},"review.findings.askBuddy":{available:()=>i(r())!==null,run:()=>{let t=i(r());t&&e.openMenu(t,()=>n.refocus())}},"review.findings.copy":{available:()=>!jo(t)&&a(r())!==null,run:()=>a(r())?.click()},"review.findings.choose":{available:()=>e.selecting()&&o(r()),run:()=>{let t=r();t&&e.flip(t)}}}}}function No(e){return e.querySelector(`[data-review-home]`)?.dataset.viewNav??null}Aa(`progress`,`Review progress`);function Po(e,t=Date.now()){return`Running for ${Fo(t-e)}`}function Fo(e){let t=Math.max(0,Math.round(e/1e3)),n=e=>String(e).padStart(2,`0`);return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m ${n(t%60)}s`:`${Math.floor(t/3600)}h ${n(Math.floor(t/60)%60)}m ${n(t%60)}s`}var Io={job:`data-job-phase`,kiss:`data-kiss-phase`,update:`data-update-phase`};function Lo(e){let t=new Map;for(let n of Object.keys(Io)){let r=Io[n],i=e.querySelector(`[${r}]`);i&&!Ne(i.getAttribute(r)??void 0)&&t.set(n,i)}return t}function Ro(e,t,n){return t.failed?!0:e===`update`?t.phase===`none`||Ne(t.phase):zo(t.phase,n)}function zo(e,t){return Ne(e)?!0:(e===`conversation`||e===`analysing`)&&!t.querySelector(`[data-view="files"]`)}function Bo(e,t,n){let r=[...e.querySelectorAll(`.prb-progress-step`)],i=r.findIndex(e=>e.dataset.phase===t);if(i===-1)return;r.forEach((e,t)=>{let n=t<i?`complete`:t===i?`active`:`pending`;e.dataset.state=n;let r=e.querySelector(`.prb-progress-label`),a=n===`complete`?e.dataset.labelDone:e.dataset.labelDoing;r&&a&&(r.textContent=a),t!==i&&e.querySelector(`[data-step-note]`)?.remove()});let a=r[i];if(!n||Pe(n,a.querySelector(`.prb-progress-label`)?.textContent??``))return;let o=a.querySelector(`[data-step-note]`);o||(o=document.createElement(`p`),o.className=`prb-progress-note`,o.setAttribute(`data-step-note`,``),a.appendChild(o)),o.textContent=n}function Vo(e){for(let t of e.querySelectorAll(`[data-started-at]`)){let e=Number(t.dataset.startedAt);Number.isFinite(e)&&(t.textContent=Po(e))}}function Ho(e,t=1e3){let n=window.setInterval(()=>Vo(e),t);return()=>window.clearInterval(n)}async function Uo({look:e,reload:t,giveUpMs:n=2e4,pauseMs:r=400}){let i=!1,a=()=>{i||(i=!0,t())};for(setTimeout(a,n);!i;){try{let t=await e();if(!t||t===`none`||Ne(t))return a()}catch{}await new Promise(e=>setTimeout(e,r))}}function Wo(e,t,n){let r=e.scope===`change`?`Whole change`:t.get(e.scope)??`A theme of this change`,i=e.scope===`change`?``:e.scope;return`<article class="prb-diagram" id="prb-diagram-${w(e.scope)}" data-diagram-card="${w(e.scope)}">
|
|
107
107
|
<header class="prb-diagram-head">
|
|
108
108
|
<div class="prb-diagram-heading">
|
|
109
109
|
<h4 class="prb-diagram-title">
|
|
110
110
|
<button type="button" class="prb-diagram-toggle" data-diagram-toggle aria-expanded="true">
|
|
111
111
|
<span class="prb-diagram-disclosure" aria-hidden="true">▼</span>
|
|
112
|
-
<span>${
|
|
112
|
+
<span>${w(e.title)}</span>
|
|
113
113
|
</button>
|
|
114
114
|
</h4>
|
|
115
|
-
<p class="prb-diagram-scope">${
|
|
115
|
+
<p class="prb-diagram-scope">${w(r)}</p>
|
|
116
116
|
</div>
|
|
117
117
|
<div class="prb-diagram-tools">
|
|
118
118
|
<button type="button" class="prb-diagram-zoom" data-diagram-zoom="out" aria-label="Zoom out">−</button>
|
|
119
119
|
<button type="button" class="prb-diagram-zoom" data-diagram-zoom="reset">Fit</button>
|
|
120
120
|
<button type="button" class="prb-diagram-zoom" data-diagram-zoom="in" aria-label="Zoom in">+</button>
|
|
121
|
-
<button type="button" class="prb-diagram-redraw" data-diagram-request="${
|
|
121
|
+
<button type="button" class="prb-diagram-redraw" data-diagram-request="${w(i)}">Regenerate</button>
|
|
122
122
|
</div>
|
|
123
123
|
</header>
|
|
124
|
-
${e.caption?`<p class="prb-diagram-caption">${
|
|
125
|
-
${
|
|
124
|
+
${e.caption?`<p class="prb-diagram-caption">${w(e.caption)}</p>`:``}
|
|
125
|
+
${Go(e,n)}
|
|
126
126
|
<div class="prb-diagram-canvas" data-diagram-canvas></div>
|
|
127
127
|
<details class="prb-diagram-source">
|
|
128
128
|
<summary>Diagram source</summary>
|
|
129
|
-
<div class="${
|
|
129
|
+
<div class="${ze}"><pre><code data-mermaid-source>${w(e.mermaid)}</code></pre><button type="button" class="${Be}" aria-label="Copy code">Copy</button></div>
|
|
130
130
|
</details>
|
|
131
|
-
</article>`}function
|
|
131
|
+
</article>`}function Go(e,t){return!e.commitSha||!t||e.commitSha===t?``:`<p class="prb-diagram-stale">Drawn from <code>${w(e.commitSha.slice(0,7))}</code>, before this review was brought up to date. Regenerate to draw it from the commit the review now describes.</p>`}var Ko=.5,qo=3,Jo=1.25,Yo=new WeakSet,Xo=new WeakMap,Zo=new WeakMap,A=null;function Qo(e){return document.addEventListener(`click`,t=>{let n=t.target;if(!(n instanceof Element))return;let r=n.closest(`[data-diagram-stop]`);if(r){r.setAttribute(`disabled`,``),r.textContent=`Stopping…`,fetch(e.endpoint(`/stop`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({kind:`diagram`})}).catch(()=>{}).finally(()=>{A?.abort()});return}let i=n.closest(`[data-diagram-toggle]`);if(i){ds(i.closest(`[data-diagram-card]`),i.getAttribute(`aria-expanded`)===`true`);return}let a=n.closest(`[data-diagram-zoom]`);if(a){ms(a.closest(`[data-diagram-card]`),a.dataset.diagramZoom??`reset`);return}let o=n.closest(`[data-diagram-request]`);o?.dataset.diagramKind===`map`?es(e):o&&$o(e,o.dataset.diagramRequest||null)}),is(),ts(),{drawPane:fs}}async function $o(e,t){if(A)return;let n=t??`change`,r=document.querySelector(`[data-diagram-pane]`),i=r?.querySelector(`[data-diagram-card="${Ss(n)}"]`)??null??ss(r,n,t);if(!i)return;as(),e.showDiagrams();let a=cs(i);A=new AbortController,_s(!1);try{let n=await fetch(e.endpoint(`/diagram`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({sectionId:t}),signal:A.signal}),r=await n.json().catch(()=>null);if(n.status===409&&r?.running){window.location.reload();return}if(r?.stopped)throw new DOMException(`Stopped`,`AbortError`);if(!n.ok||!r?.diagram)return ls(i,a,r?.error??`Buddy AI did not return a diagram. Check the terminal running PR Review Buddy.`);us(i,r.diagram,t)}catch(e){if(e instanceof DOMException&&e.name===`AbortError`){i.hasAttribute(`data-diagram-pending`)?(i.remove(),as()):a.remove();return}ls(i,a,`Could not reach PR Review Buddy. The workspace server may have stopped.`)}finally{A=null,_s(!0)}}async function es(e){if(A)return;let t=document.querySelector(`[data-map-body]`);if(!t)return;e.showMap();let n=ns(t),r=t.closest(`[data-map-pane]`);r?.setAttribute(`data-map-running`,``),A=new AbortController,_s(!1);try{let t=await fetch(e.endpoint(`/diagram`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({kind:`map`}),signal:A.signal}),r=await t.json().catch(()=>null);if(t.status===409&&r?.running){window.location.reload();return}if(r?.stopped)throw new DOMException(`Stopped`,`AbortError`);if(!t.ok||!r?.changeMap){rs(n,r?.error??`Buddy AI did not return a change map. Check the terminal running PR Review Buddy.`);return}n.remove(),e.showChangeMap(r.changeMap),as()}catch(e){if(e instanceof DOMException&&e.name===`AbortError`){n.remove();return}rs(n,`Could not reach PR Review Buddy. The workspace server may have stopped.`)}finally{r?.removeAttribute(`data-map-running`),A=null,_s(!0)}}function ts(){let e=document.querySelector(`[data-map-pane][data-map-running] [data-map-body]`);e&&(ns(e),_s(!1))}function ns(e){e.parentElement?.querySelector(`[data-map-status]`)?.remove();let t=document.createElement(`p`);t.className=`prb-diagram-status`,t.setAttribute(`data-map-status`,``),t.innerHTML=`<span class="prb-thinking"><i></i><i></i><i></i></span><span>Reading the review and the change…</span>`;let n=document.createElement(`button`);return n.type=`button`,n.className=`prb-diagram-redraw`,n.setAttribute(`data-diagram-stop`,``),n.textContent=`Stop`,t.appendChild(n),e.before(t),t}function rs(e,t){e.className=`prb-diagram-failed`,e.textContent=t}function is(){let e=document.querySelector(`[data-diagram-pane][data-diagram-running]`);if(!e)return;let t=e.dataset.diagramRunning||null,n=t??`change`,r=e.querySelector(`[data-diagram-card="${Ss(n)}"]`)??ss(e,n,t);r&&(as(),cs(r,{scroll:!1}),_s(!1))}function as(){let e=document.querySelectorAll(`[data-diagram-pane] [data-diagram-card]:not([data-diagram-pending])`).length,t=document.querySelectorAll(`[data-map-body] [data-change-map]`).length;os(`map`,t>0),os(`diagram`,e>0);let n=e+t,r=document.querySelector(`.prb-rail [data-view-nav="map"]`);if(!r)return;let i=r.querySelector(`.prb-rail-count`);if(n===0){i?.remove();return}i||(i=document.createElement(`span`),i.className=`prb-rail-count`,r.appendChild(i)),i.textContent=String(n),i.setAttribute(`aria-label`,n===1?`1 diagram`:`${n} diagrams`)}function os(e,t){for(let n of document.querySelectorAll(`[data-diagram-mode="${e}"]`)){n.toggleAttribute(`data-ready`,t);let e=n.querySelector(`[data-mode-ready]`);e&&(e.hidden=!t)}}function ss(e,t,n){if(!e)return null;let r=document.createElement(`article`);return r.className=`prb-diagram`,r.dataset.diagramCard=t,r.setAttribute(`data-diagram-pending`,``),r.innerHTML=`<header class="prb-diagram-head">
|
|
132
132
|
<div class="prb-diagram-heading">
|
|
133
133
|
<h4 class="prb-diagram-title">Drawing…</h4>
|
|
134
|
-
<p class="prb-diagram-scope">${t===`change`?`Whole change`:
|
|
134
|
+
<p class="prb-diagram-scope">${t===`change`?`Whole change`:xs(vs(n))}</p>
|
|
135
135
|
</div>
|
|
136
|
-
</header>`,
|
|
136
|
+
</header>`,ys(e,r,n),r}function cs(e,{scroll:t=!0}={}){e.querySelector(`[data-diagram-status]`)?.remove();let n=document.createElement(`p`);n.className=`prb-diagram-status`,n.setAttribute(`data-diagram-status`,``),n.innerHTML=`<span class="prb-thinking"><i></i><i></i><i></i></span><span>Reading the change…</span>`;let r=document.createElement(`button`);return r.type=`button`,r.className=`prb-diagram-redraw`,r.setAttribute(`data-diagram-stop`,``),r.textContent=`Stop`,n.appendChild(r),e.querySelector(`.prb-diagram-head`)?.insertAdjacentElement(`afterend`,n),t&&e.scrollIntoView({behavior:Cs()?`auto`:`smooth`,block:`start`}),n}function ls(e,t,n){if(t.className=`prb-diagram-failed`,t.textContent=n,e.hasAttribute(`data-diagram-pending`)){let n=document.createElement(`button`);n.type=`button`,n.className=`prb-diagram-redraw`,n.dataset.diagramRequest=e.dataset.diagramCard===`change`?``:e.dataset.diagramCard??``,n.textContent=`Try again`,t.appendChild(document.createTextNode(` `)),t.appendChild(n)}}function us(e,t,n){let r=Wo(t,new Map(n?[[n,vs(n)]]:[]),t.commitSha),i=document.createElement(`div`);i.innerHTML=r;let a=i.firstElementChild;a&&(e.replaceWith(a),as(),ps(a))}function ds(e,t){e&&(e.toggleAttribute(`data-diagram-collapsed`,t),e.querySelector(`[data-diagram-toggle]`)?.setAttribute(`aria-expanded`,String(!t)),t||ps(e))}function fs(){for(let e of document.querySelectorAll(`[data-diagram-pane] [data-diagram-card]`))ps(e)}async function ps(e){let t=e.querySelector(`[data-diagram-canvas]`),n=e.querySelector(`[data-mermaid-source]`)?.textContent??``;if(!(!t||!n||Yo.has(e)||e.hasAttribute(`data-diagram-collapsed`))){Yo.add(e);try{await _n(t,`prb-mermaid-${Math.random().toString(36).slice(2)}`,n)}catch{Yo.delete(e),t.innerHTML=``;let n=document.createElement(`p`);n.className=`prb-diagram-failed`,n.textContent=`This diagram could not be drawn. Its source is below, and Regenerate will ask for another.`,t.replaceWith(n),e.querySelector(`details`)?.setAttribute(`open`,``)}}}function ms(e,t){let n=e?.querySelector(`[data-diagram-canvas] svg`),r=e?.querySelector(`[data-diagram-canvas]`);if(!e||!n||!r)return;if(t===`reset`){Zo.delete(e),r.removeAttribute(`data-zoomed`),n.style.removeProperty(`width`);return}let i=hs(e,n);if(i<=0)return;let a=gs((Zo.get(e)??1)*(t===`in`?Jo:1/Jo));Zo.set(e,a),r.setAttribute(`data-zoomed`,``),n.style.width=`${Math.round(i*a)}px`}function hs(e,t){let n=Xo.get(e);if(n)return n;let r=t.getBoundingClientRect().width;if(r>0)return Xo.set(e,r),r;let i=t.getAttribute(`viewBox`)?.split(/[\s,]+/),a=Number(i?.[2]??0);return Number.isFinite(a)?a:0}function gs(e){return Math.min(qo,Math.max(Ko,e))}function _s(e){for(let t of document.querySelectorAll(`[data-diagram-request]`))t.disabled=!e}function vs(e){return e?document.querySelector(`[data-goto-section="${Ss(e)}"]`)?.querySelector(`.prb-rail-title`)?.textContent?.trim()||`A theme of this change`:`Whole change`}function ys(e,t,n){let r=bs(n);for(let n of e.querySelectorAll(`[data-diagram-card]`)){let e=n.dataset.diagramCard??``;if(bs(e===`change`?null:e)>r){n.before(t);return}}e.appendChild(t)}function bs(e){if(!e)return-1;let t=document.querySelector(`[data-goto-section="${Ss(e)}"]`);return Number(t?.dataset.themeIndex??0)}function xs(e){let t=document.createElement(`span`);return t.textContent=e,t.innerHTML}function Ss(e){return CSS.escape(e)}function Cs(){return window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}var ws=[`intent`,`actor`,`concept`,`state`,`constraint`,`risk`,`outcome`],Ts=[`Intent`,`Behaviour`,`Shared state`,`Risks & constraints`,`Outcome`],Es={mapTitle:100,intent:320,title:80,body:220,why:160,anchor:80,label:48,note:200},Ds={intent:0,concept:1,actor:2,state:2,constraint:3,risk:3,outcome:4};function Os(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`The change map was not a JSON object.`);let t=e;if(!Array.isArray(t.nodes)||t.nodes.length===0)throw Error(`The change map had no nodes. This usually means the model ignored the requested shape.`);let{nodes:n,ids:r}=ks(t.nodes);return{schemaVersion:1,title:Fs(D(t.title).trim(),Es.mapTitle)||`Change map`,intent:js(t.intent,Es.intent)??{simple:``,technical:``},nodes:n,edges:As(t.edges,r)}}function ks(e){let t=new Map,n=new Set,r=[];for(let i of e){if(typeof i!=`object`||!i)continue;let e=i,a=js(e.title,Es.title);if(!a)continue;let o=D(e.id).trim()||a.technical;if(t.has(o))continue;let s=Ps(Ns(o)||`n${r.length+1}`,n);t.set(o,s),n.add(s);let c=ws.includes(e.role)?e.role:`concept`,l=js(e.why,Es.why),u=Fs(D(e.anchor).trim(),Es.anchor),d=D(e.sectionId).trim();r.push({id:s,role:c,stage:Ms(e.stage,c),weight:e.weight===`primary`?`primary`:`supporting`,title:a,body:js(e.body,Es.body)??{simple:``,technical:``},...l?{why:l}:{},...u?{anchor:u}:{},...d?{sectionId:d}:{}})}return{nodes:r,ids:t}}function As(e,t){if(!Array.isArray(e))return[];let n=[];for(let r of e){if(typeof r!=`object`||!r)continue;let e=r,i=js(e.label,Es.label),a=t.get(D(e.from).trim())??D(e.from).trim(),o=t.get(D(e.to).trim())??D(e.to).trim();if(!i||!a||!o)continue;let s=js(e.note,Es.note);n.push({from:a,to:o,label:i,...s?{note:s}:{}})}return n}function js(e,t){if(typeof e==`string`){let n=Fs(e.trim(),t);return n?{simple:n,technical:n}:null}if(typeof e!=`object`||!e)return null;let n=e,r=Fs(D(n.simple).trim(),t),i=Fs(D(n.technical).trim(),t);return!r&&!i?null:{simple:r||i,technical:i||r}}function Ms(e,t){return typeof e==`number`&&Number.isInteger(e)&&e>=0&&e<=4?e:Ds[t]}function Ns(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,40)}function Ps(e,t){if(!t.has(e))return e;let n=2;for(;t.has(`${e}-${n}`);)n+=1;return`${e}-${n}`}function Fs(e,t){if(e.length<=t)return e;let n=e.slice(0,t-1),r=n.lastIndexOf(` `);return`${(r>t/2?n.slice(0,r):n).trimEnd()}…`}function Is(e,t){try{return Ls(Os(e),t).map}catch{return null}}function Ls(e,t){let n={droppedNodes:0,droppedEdges:0,withdrawnSections:0,demotedPrimaries:0},r=Bs(Rs(e.nodes,n).map(e=>zs(e,t,n)),n),i=new Set(r.map(e=>e.id)),a=new Set,o=[];for(let t of e.edges){let e=`${t.from}\u0000${t.to}`;if(!i.has(t.from)||!i.has(t.to)||t.from===t.to||a.has(e)||o.length>=16){n.droppedEdges+=1;continue}a.add(e),o.push(t)}if(r.length<2||o.length===0)throw Error(`The change map had too little in it to draw: it needs at least two ideas and one relationship.`);return{map:{...e,nodes:Vs(r),edges:o},audit:n}}function Rs(e,t){if(e.length<=12)return e;let n=e.filter(e=>e.weight===`primary`).slice(0,3),r=e.filter(e=>!n.includes(e)).slice(0,12-n.length),i=new Set([...n,...r]);return t.droppedNodes+=e.length-i.size,e.filter(e=>i.has(e))}function zs(e,t,n){if(e.sectionId===void 0||t.includes(e.sectionId))return e;n.withdrawnSections+=1;let{sectionId:r,...i}=e;return i}function Bs(e,t){let n=0;return e.map(e=>e.weight!==`primary`||(n+=1,n<=3)?e:(t.demotedPrimaries+=1,{...e,weight:`supporting`}))}function Vs(e){return[...e].sort((e,t)=>e.stage-t.stage)}function Hs(e){let{stored:t,sections:n,reviewedSha:r,register:i}=e,a=t?Is(t,n.map(e=>e.id)):null,o=!!(a&&t?.commitSha&&r&&t.commitSha!==r);if(!a||!t||o)return Us(o);let s=new Map(n.map(e=>[e.id,e.title]));return`<div class="prb-map" data-change-map data-register="${i}">
|
|
137
137
|
<header class="prb-map-head">
|
|
138
138
|
<div class="prb-map-heading">
|
|
139
|
-
<h4 class="prb-map-title">${
|
|
140
|
-
${a.intent.simple||a.intent.technical?`<p class="prb-map-intent">${
|
|
139
|
+
<h4 class="prb-map-title">${w(a.title)}</h4>
|
|
140
|
+
${a.intent.simple||a.intent.technical?`<p class="prb-map-intent">${j(a.intent)}</p>`:``}
|
|
141
141
|
</div>
|
|
142
142
|
<div class="prb-map-tools">
|
|
143
|
-
${
|
|
143
|
+
${Ws(i)}
|
|
144
144
|
<button type="button" class="prb-diagram-redraw" data-diagram-request="" data-diagram-kind="map">Regenerate</button>
|
|
145
145
|
</div>
|
|
146
146
|
</header>
|
|
147
147
|
<p class="prb-map-hint">Read from the goal to the outcome. Select an idea to see what it connects to.</p>
|
|
148
|
-
${
|
|
149
|
-
${
|
|
150
|
-
</div>`}function
|
|
148
|
+
${Gs(a,s)}
|
|
149
|
+
${Ys(a)}
|
|
150
|
+
</div>`}function Us(e){return`<div class="prb-map-empty" data-change-map-empty>
|
|
151
151
|
${e?`<p class="prb-map-stale">The review has moved on since the last map was drawn.</p>`:``}
|
|
152
152
|
<h4 class="prb-map-empty-title">See the change as a map</h4>
|
|
153
153
|
<p>See how the main ideas in this change connect, what depends on what, and where the important risks are. Each idea links back to its theme in the Review Path.</p>
|
|
154
154
|
<p class="prb-map-empty-note">Buddy AI builds it from this review, in plain words and technical ones. It takes a minute or two.</p>
|
|
155
155
|
<button type="button" class="prb-map-generate" data-diagram-request="" data-diagram-kind="map">Generate change map</button>
|
|
156
|
-
</div>`}function
|
|
157
|
-
<h5 class="prb-map-stage-title">${
|
|
158
|
-
${e.nodes.filter(e=>e.stage===n).sort((e,t)=>Number(t.weight===`primary`)-Number(e.weight===`primary`)).map(n=>
|
|
159
|
-
</div>`).join(``),i=e.edges.map((e,t)=>
|
|
156
|
+
</div>`}function Ws(e){let t=(t,n)=>`<button type="button" class="prb-map-register" data-map-register-option="${t}" aria-pressed="${e===t}">${n}</button>`;return`<div class="prb-map-registers" role="group" aria-label="Wording">${t(`simple`,`Simple`)}${t(`technical`,`Technical`)}</div>`}function Gs(e,t){let n=[...new Set(e.nodes.map(e=>e.stage))].sort((e,t)=>e-t),r=n.map(n=>`<div class="prb-map-stage" data-map-stage="${n}">
|
|
157
|
+
<h5 class="prb-map-stage-title">${w(Ts[n]??``)}</h5>
|
|
158
|
+
${e.nodes.filter(e=>e.stage===n).sort((e,t)=>Number(t.weight===`primary`)-Number(e.weight===`primary`)).map(n=>qs(n,t,e)).join(``)}
|
|
159
|
+
</div>`).join(``),i=e.edges.map((e,t)=>Js(e,t)).join(``);return`<div class="prb-map-board" data-map-board style="--prb-map-stages: ${n.length}">
|
|
160
160
|
<svg class="prb-map-edges" data-map-edges aria-hidden="true" focusable="false"></svg>
|
|
161
161
|
${r}
|
|
162
162
|
<div class="prb-map-labels" aria-hidden="true">${i}</div>
|
|
163
|
-
</div>`}var
|
|
164
|
-
<p class="prb-map-role">${
|
|
165
|
-
<h5 class="prb-map-node-title" id="prb-map-node-${r}">${
|
|
166
|
-
${e.body.simple||e.body.technical?`<p class="prb-map-node-body">${
|
|
167
|
-
${e.why?`<p class="prb-map-why"><span class="prb-map-why-lead">Why it matters:</span> ${
|
|
168
|
-
${e.anchor?`<code class="prb-map-anchor">${
|
|
163
|
+
</div>`}var Ks={intent:`Goal`,actor:`Actor`,concept:`Idea`,state:`Shared state`,constraint:`Rule`,risk:`Risk`,outcome:`Outcome`};function qs(e,t,n){let r=w(e.id),i=e.sectionId?t.get(e.sectionId):void 0,a=new Map(n.nodes.map(e=>[e.id,e.title])),o=n.edges.map((e,t)=>({edge:e,index:t})).filter(({edge:t})=>t.from===e.id&&a.has(t.to)).map(({edge:e,index:t})=>`<li data-inline-edge="${t}" hidden><em>${j(e.label)}</em> <span aria-hidden="true">→</span> ${j(a.get(e.to))}</li>`).join(``);return`<article class="prb-map-node" data-map-node="${r}" data-role="${e.role}" data-weight="${e.weight}" tabindex="0" aria-labelledby="prb-map-node-${r}">
|
|
164
|
+
<p class="prb-map-role">${Ks[e.role]}${e.weight===`primary`?`<span class="prb-map-core"> · Core idea</span>`:``}</p>
|
|
165
|
+
<h5 class="prb-map-node-title" id="prb-map-node-${r}">${j(e.title)}</h5>
|
|
166
|
+
${e.body.simple||e.body.technical?`<p class="prb-map-node-body">${j(e.body)}</p>`:``}
|
|
167
|
+
${e.why?`<p class="prb-map-why"><span class="prb-map-why-lead">Why it matters:</span> ${j(e.why)}</p>`:``}
|
|
168
|
+
${e.anchor?`<code class="prb-map-anchor">${w(e.anchor)}</code>`:``}
|
|
169
169
|
${o?`<ul class="prb-map-inline" aria-hidden="true">${o}</ul>`:``}
|
|
170
|
-
${e.sectionId&&i?`<button type="button" class="prb-map-goto" data-goto-section="${
|
|
171
|
-
</article>`}function
|
|
170
|
+
${e.sectionId&&i?`<button type="button" class="prb-map-goto" data-goto-section="${w(e.sectionId)}" aria-label="Open ${w(i)} in the Review Path">Review Path: ${w(i)} <span aria-hidden="true">→</span></button>`:``}
|
|
171
|
+
</article>`}function Js(e,t){return`<span class="prb-map-label" data-map-edge="${t}" data-from="${w(e.from)}" data-to="${w(e.to)}">${j(e.label)}</span>`}function Ys(e){let t=new Map(e.nodes.map(e=>[e.id,e.title]));return`<details class="prb-map-list">
|
|
172
172
|
<summary>Read as a list</summary>
|
|
173
|
-
<ol>${e.edges.map(e=>{let n=t.get(e.from),r=t.get(e.to);return!n||!r?``:`<li><strong>${
|
|
174
|
-
</details>`}function M(e){return e.simple===e.technical?Te(e.simple):`<span data-reg="simple">${Te(e.simple)}</span><span data-reg="technical">${Te(e.technical)}</span>`}var Fs=`http://www.w3.org/2000/svg`,Is=new WeakSet,Ls=new WeakMap;function Rs(e){return document.addEventListener(`click`,t=>{let n=t.target;if(!(n instanceof Element))return;let r=n.closest(`[data-map-register-option]`);if(r){Zs(r.dataset.mapRegisterOption===`technical`?`technical`:`simple`,e);return}if(n.closest(`[data-goto-section]`))return;let i=n.closest(`[data-map-node]`),a=n.closest(`[data-map-board]`);a&&Xs(a,i&&i.classList.contains(`prb-map-node`)?i.dataset.mapNode??null:null)}),document.addEventListener(`focusin`,e=>{let t=e.target instanceof Element?e.target.closest(`.prb-map-node`):null,n=t?.closest(`[data-map-board]`);t&&n&&Xs(n,t.dataset.mapNode??null)}),document.addEventListener(`keydown`,t=>{let n=t.target;if(n instanceof HTMLElement){if(t.key===`Escape`&&n.closest(`[data-map-board]`)){let e=n.closest(`[data-map-board]`);e?.hasAttribute(`data-selecting`)&&(Xs(e,null),t.stopPropagation());return}if((t.key===`ArrowLeft`||t.key===`ArrowRight`)&&n.matches(`[role="tab"][data-diagram-mode]`)){t.preventDefault();let r=[...n.closest(`[role="tablist"]`)?.querySelectorAll(`[data-diagram-mode]`)??[]].map(e=>e.dataset.diagramMode??``),i=t.key===`ArrowRight`?1:-1,a=r[(r.indexOf(n.dataset.diagramMode??``)+i+r.length)%r.length];e.showView(a),document.querySelector(`.prb-view[data-view="${a}"] [data-diagram-mode="${a}"]`)?.focus()}}}),{layout:zs,show:Bs}}function zs(){for(let e of document.querySelectorAll(`[data-map-board]`))Vs(e),Hs(e)}function Bs(e){let t=document.querySelector(`[data-map-body]`);t&&(t.innerHTML=Ds({stored:e,sections:$s(),reviewedSha:e.commitSha,register:Qs()}),zs())}function Vs(e){if(Is.has(e)||typeof ResizeObserver>`u`)return;Is.add(e);let t=!1;new ResizeObserver(()=>{t||(t=!0,requestAnimationFrame(()=>{t=!1,Hs(e)}))}).observe(e)}function Hs(e){let t=e.querySelector(`[data-map-edges]`);if(!t||e.offsetWidth===0)return;let n=e.getBoundingClientRect(),r=t=>{let r=t.getBoundingClientRect(),i=r.left-n.left+e.scrollLeft,a=r.top-n.top+e.scrollTop;return{left:i,top:a,right:i+r.width,bottom:a+r.height,cx:i+r.width/2,cy:a+r.height/2}},i=e.scrollWidth,a=e.scrollHeight;t.setAttribute(`width`,String(i)),t.setAttribute(`height`,String(a)),t.setAttribute(`viewBox`,`0 0 ${i} ${a}`),t.replaceChildren(Ys());let o=new Map;for(let t of e.querySelectorAll(`.prb-map-node`))o.set(t.dataset.mapNode??``,r(t));let s=getComputedStyle(e).gridTemplateColumns.trim().split(/\s+/).length>1,c=[...e.querySelectorAll(`.prb-map-label[data-map-edge]`)].map(e=>{let t=o.get(e.dataset.from??``),n=o.get(e.dataset.to??``);return{label:e,from:t,to:n,ends:t&&n?Us(t,n,s):null}}),l=new Map,u=(e,t,n,r)=>{let i=`${e}\u0000${t}`;l.set(i,[...l.get(i)??[],{edge:n,other:r}])};c.forEach(({label:e,from:t,to:n,ends:r},i)=>{!t||!n||!r||(u(e.dataset.from??``,r.from,i,n),u(e.dataset.to??``,r.to,i,t))});let d=(e,t,n,r)=>{let i=[...l.get(`${e}\u0000${t}`)??[]],a=t===`top`||t===`bottom`;i.sort((e,t)=>a?e.other.cx-t.other.cx:e.other.cy-t.other.cy);let o=i.findIndex(e=>e.edge===n),s=a?r.right-r.left:r.bottom-r.top,c=Math.min(18,s*.6/Math.max(1,i.length));return(o-(i.length-1)/2)*c},f=[],p=[...e.querySelectorAll(`.prb-map-stage-title`)].map(r),m=[...o.values()],h=e.clientWidth,g=Ls.get(e),_=g&&g.width===h?g.edges:new Set;Ls.set(e,{width:h,edges:_});let v=(t,n)=>{n&&_.add(t);let r=e.querySelector(`[data-inline-edge="${t}"]`);r&&(r.hidden=!n)};c.forEach(({label:e,from:n,to:r,ends:i},a)=>{let o=Number(e.dataset.mapEdge);if(!n||!r||!i){e.hidden=!0;return}if(_.has(o)){e.hidden=!0,v(o,!0);return}let s=Ws(n,i.from,d(e.dataset.from??``,i.from,a,n)),c=Ws(r,i.to,d(e.dataset.to??``,i.to,a,r)),l=Ks(s,i.from,c,i.to),[u,h,g,y]=l,ee=m.filter(e=>e!==n&&e!==r);if(Array.from({length:19},(e,t)=>qs(l,.05+t*.05)).some(e=>ee.some(t=>e.x>t.left&&e.x<t.right&&e.y>t.top&&e.y<t.bottom))){e.hidden=!0,v(o,!0);return}let b=document.createElementNS(Fs,`path`);b.setAttribute(`d`,`M${N(u.x)},${N(u.y)} C${N(h.x)},${N(h.y)} ${N(g.x)},${N(g.y)} ${N(y.x)},${N(y.y)}`),b.setAttribute(`class`,`prb-map-edge`),b.setAttribute(`marker-end`,`url(#prb-map-arrow)`),b.dataset.mapEdge=e.dataset.mapEdge??``,b.dataset.from=e.dataset.from??``,b.dataset.to=e.dataset.to??``,t.appendChild(b),e.hidden=!1;let x=e.offsetWidth,S=e.offsetHeight,C=[.5,.4,.6,.3,.7,.22,.78].map(e=>{let t=qs(l,e);return{left:t.x-x/2,top:t.y-S/2,right:t.x+x/2,bottom:t.y+S/2}}).find(e=>![...m,...p,...f].some(t=>Js(e,t,2)));if(!C){b.remove(),e.hidden=!0,v(o,!0);return}v(o,!1),f.push(C),e.style.left=`${Math.round(C.left)}px`,e.style.top=`${Math.round(C.top)}px`}),e.setAttribute(`data-laid-out`,``)}function Us(e,t,n){let r=t.left-e.right,i=e.left-t.right,a=t.top-e.bottom,o=e.top-t.bottom,s=Math.max(r,i),c=Math.max(a,o);return s>0&&(n||c<=0)?r>=i?{from:`right`,to:`left`}:{from:`left`,to:`right`}:c>0?a>=o?{from:`bottom`,to:`top`}:{from:`top`,to:`bottom`}:{from:`right`,to:`right`}}function Ws(e,t,n){switch(t){case`top`:return{x:e.cx+n,y:e.top};case`bottom`:return{x:e.cx+n,y:e.bottom};case`left`:return{x:e.left,y:e.cy+n};case`right`:return{x:e.right,y:e.cy+n}}}var Gs={top:{x:0,y:-1},bottom:{x:0,y:1},left:{x:-1,y:0},right:{x:1,y:0}};function Ks(e,t,n,r){let i=Math.abs(t===`left`||t===`right`?n.x-e.x:n.y-e.y),a=Math.max(24,i/2),o=Gs[t],s=Gs[r];return[e,{x:e.x+o.x*a,y:e.y+o.y*a},{x:n.x+s.x*a,y:n.y+s.y*a},n]}function qs([e,t,n,r],i){let a=1-i;return{x:a*a*a*e.x+3*a*a*i*t.x+3*a*i*i*n.x+i*i*i*r.x,y:a*a*a*e.y+3*a*a*i*t.y+3*a*i*i*n.y+i*i*i*r.y}}function Js(e,t,n){return e.left<t.right+n&&e.right>t.left-n&&e.top<t.bottom+n&&e.bottom>t.top-n}function N(e){return Math.round(e*10)/10}function Ys(){let e=document.createElementNS(Fs,`defs`),t=document.createElementNS(Fs,`marker`);t.setAttribute(`id`,`prb-map-arrow`),t.setAttribute(`viewBox`,`0 0 10 10`),t.setAttribute(`refX`,`9`),t.setAttribute(`refY`,`5`),t.setAttribute(`markerWidth`,`7`),t.setAttribute(`markerHeight`,`7`),t.setAttribute(`orient`,`auto-start-reverse`);let n=document.createElementNS(Fs,`path`);return n.setAttribute(`d`,`M0,0 L10,5 L0,10 z`),n.setAttribute(`class`,`prb-map-arrow`),t.appendChild(n),e.appendChild(t),e}function Xs(e,t){for(let t of e.querySelectorAll(`[data-active], [data-near]`))t.removeAttribute(`data-active`),t.removeAttribute(`data-near`);if(e.toggleAttribute(`data-selecting`,t!==null),t!==null){e.querySelector(`.prb-map-node[data-map-node="${CSS.escape(t)}"]`)?.setAttribute(`data-active`,``);for(let n of e.querySelectorAll(`[data-map-edge]`)){let r=n.getAttribute(`data-from`),i=n.getAttribute(`data-to`);if(r!==t&&i!==t)continue;n.setAttribute(`data-active`,``);let a=r===t?i:r;a&&e.querySelector(`.prb-map-node[data-map-node="${CSS.escape(a)}"]`)?.setAttribute(`data-near`,``)}}}function Zs(e,t){document.querySelector(`[data-map-pane]`)?.setAttribute(`data-map-register`,e);for(let t of document.querySelectorAll(`[data-change-map]`))t.dataset.register=e;for(let t of document.querySelectorAll(`[data-map-register-option]`))t.setAttribute(`aria-pressed`,String(t.dataset.mapRegisterOption===e));zs(),fetch(t.endpoint(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({changeMapRegister:e})}).catch(()=>{})}function Qs(){return document.querySelector(`[data-map-pane]`)?.dataset.mapRegister===`technical`?`technical`:`simple`}function $s(){return[...document.querySelectorAll(`[data-goto-section][data-theme-index]`)].map(e=>({id:e.dataset.gotoSection??``,title:e.querySelector(`.prb-rail-title`)?.textContent?.trim()??``}))}var ec=`repository`,tc={minCharacters:8,maxLines:3,maxCharacters:400},nc=[`app`,`service`,`component`,`store`,`external`,`group`],rc=/^[a-z][a-z0-9-]*$/;function ic(e){let t=[];if(!pc(e))return{ok:!1,errors:[`The architecture must be a JSON object.`]};hc(e,[`schema`,`title`,`summary`,`nodes`,`relationships`],`architecture`,t);let n=mc(e,[`summary`],`architecture`,t);n.schema!==2&&t.push(`architecture.schema must be 2.`);let r=gc(n.title,`architecture.title`,t),i=_c(n.summary,`architecture.summary`,t),a=[],o=new Set;!Array.isArray(n.nodes)||n.nodes.length===0?t.push(`architecture.nodes must be a non-empty array.`):n.nodes.forEach((e,n)=>{let r=oc(e,`nodes[${n}]`,t);r&&(o.has(r.id)&&t.push(`nodes[${n}].id "${r.id}" is used twice.`),o.add(r.id),a.push(r))});let s=new Set(Array.isArray(n.nodes)?n.nodes.flatMap(e=>pc(e)&&typeof e.id==`string`&&rc.test(e.id)?[e.id]:[]):[]),c=new Map(a.map(e=>[e.id,e]));for(let e of a){if(e.parent===void 0)continue;let n=c.get(e.parent);n?n.kind!==`group`&&t.push(`Node "${e.id}" names parent "${e.parent}", which is not a group.`):s.has(e.parent)||t.push(`Node "${e.id}" names parent "${e.parent}", which is not a node.`)}for(let e of a)ac(e.id,c).includes(e.id)&&t.push(`Node "${e.id}" is its own ancestor.`),e.kind===`external`&&e.owns&&t.push(`Node "${e.id}" is external, so it cannot own files in this repository.`);let l=[],u=new Set;return Array.isArray(n.relationships)?n.relationships.forEach((e,n)=>{let r=`relationships[${n}]`,i=sc(e,r,t);if(!i)return;(u.has(i.id)||o.has(i.id))&&t.push(`${r}.id "${i.id}" is already used.`),u.add(i.id);let{source:a,target:d}=i;for(let[e,n]of[[`source`,a],[`target`,d]])s.has(n)||t.push(`${r}.${e} "${n}" is not a node.`);a===d?t.push(`${r} relates "${a}" to itself.`):c.has(a)&&c.has(d)&&(ac(a,c).includes(d)||ac(d,c).includes(a))&&t.push(`${r} relates "${a}" and "${d}", and one contains the other.`),l.push(i)}):t.push(`architecture.relationships must be an array.`),t.length>0||r===null?{ok:!1,errors:t}:{ok:!0,architecture:{schema:2,title:r,...i===void 0?{}:{summary:i},nodes:a,relationships:l}}}function ac(e,t){let n=[],r=t.get(e)?.parent;for(;r!==void 0&&!n.includes(r);)n.push(r),r=t.get(r)?.parent;return r!==void 0&&n.push(r),n}function oc(e,t,n){if(!pc(e))return n.push(`${t} must be an object.`),null;hc(e,[`id`,`name`,`kind`,`parent`,`description`,`owns`,`evidence`],t,n);let r=mc(e,[`parent`,`description`,`owns`],t,n),i=vc(r.id,`${t}.id`,n);i===`repository`&&n.push(`${t}.id must not be "${ec}": that name is kept for the whole repository. Choose another id.`);let a=gc(r.name,`${t}.name`,n),o=nc.find(e=>e===r.kind);o||n.push(`${t}.kind must be one of ${nc.join(`, `)}.`);let s=r.parent===void 0?void 0:vc(r.parent,`${t}.parent`,n),c=_c(r.description,`${t}.description`,n),l=r.owns===void 0?void 0:cc(r.owns,`${t}.owns`,n),u=lc(r.evidence,`${t}.evidence`,n);return i===null||a===null||!o||s===null||l===null||u===null?null:{id:i,name:a,kind:o,...s===void 0?{}:{parent:s},...c===void 0?{}:{description:c},...l===void 0?{}:{owns:l},evidence:u}}function sc(e,t,n){if(!pc(e))return n.push(`${t} must be an object.`),null;hc(e,[`id`,`source`,`target`,`label`,`description`,`evidence`,`confidence`],t,n);let r=mc(e,[`description`,`confidence`],t,n),i=vc(r.id,`${t}.id`,n),a=vc(r.source,`${t}.source`,n),o=vc(r.target,`${t}.target`,n),s=gc(r.label,`${t}.label`,n),c=_c(r.description,`${t}.description`,n),l=lc(r.evidence,`${t}.evidence`,n),u;return r.confidence!==void 0&&(typeof r.confidence==`number`&&r.confidence>=0&&r.confidence<=1?u=r.confidence:n.push(`${t}.confidence must be a number from 0 to 1.`)),i===null||a===null||o===null||s===null||l===null?null:{id:i,source:a,target:o,label:s,...c===void 0?{}:{description:c},evidence:l,...u===void 0?{}:{confidence:u}}}function cc(e,t,n){if(!Array.isArray(e)||e.length===0)return n.push(`${t} must be a non-empty array of globs, or left out.`),null;let r=[];return e.forEach((e,i)=>{let a=gc(e,`${t}[${i}]`,n);a!==null&&(!fc(a)||a.startsWith(`./`)||a.startsWith(`!`)?n.push(`${t}[${i}] must be a glob relative to the repository, with forward slashes, no "..", no "./" and no "!".`):r.includes(a)?n.push(`${t}[${i}] "${a}" is listed twice.`):r.push(a))}),r.length===e.length?r:null}function lc(e,t,n){if(!Array.isArray(e)||e.length===0)return n.push(`${t} must list at least one location in the repository.`),null;let r=[];return e.forEach((e,i)=>{let a=`${t}[${i}]`;if(!pc(e)){n.push(`${a} must be an object.`);return}hc(e,[`path`,`quote`,`symbol`,`line`,`note`],a,n),e=mc(e,[`symbol`,`line`,`note`],a,n);let o=gc(e.path,`${a}.path`,n);o!==null&&!fc(o)&&n.push(`${a}.path must be relative to the repository, with forward slashes and no "..".`);let s=uc(e.quote,`${a}.quote`,n),c;e.symbol!==void 0&&(typeof e.symbol==`string`&&/^\S{1,120}$/.test(e.symbol)?c=e.symbol:n.push(`${a}.symbol must be a name with no spaces, at most 120 characters.`));let l=yc(e.line,`${a}.line`,n),u=_c(e.note,`${a}.note`,n);o!==null&&s!==null&&r.push({path:o,quote:s,...c===void 0?{}:{symbol:c},...l===void 0?{}:{line:l},...u===void 0?{}:{note:u}})}),r.length===e.length?r:null}function uc(e,t,n){if(typeof e!=`string`||!e.trim())return n.push(`${t} must be one to ${tc.maxLines} lines copied from the file.`),null;let r=e.replace(/^\s*\n|\n\s*$/g,``),i=dc(r);return r.split(`
|
|
175
|
-
`).length>
|
|
176
|
-
`),nodes:r,edges:u}}function
|
|
173
|
+
<ol>${e.edges.map(e=>{let n=t.get(e.from),r=t.get(e.to);return!n||!r?``:`<li><strong>${j(n)}</strong> <em>${j(e.label)}</em> <strong>${j(r)}</strong>${e.note?`<span class="prb-map-note"> — ${j(e.note)}</span>`:``}</li>`}).join(``)}</ol>
|
|
174
|
+
</details>`}function j(e){return e.simple===e.technical?Re(e.simple):`<span data-reg="simple">${Re(e.simple)}</span><span data-reg="technical">${Re(e.technical)}</span>`}var Xs=`http://www.w3.org/2000/svg`,Zs=new WeakSet,Qs=new WeakMap;function $s(e){return document.addEventListener(`click`,t=>{let n=t.target;if(!(n instanceof Element))return;let r=n.closest(`[data-map-register-option]`);if(r){pc(r.dataset.mapRegisterOption===`technical`?`technical`:`simple`,e);return}if(n.closest(`[data-goto-section]`))return;let i=n.closest(`[data-map-node]`),a=n.closest(`[data-map-board]`);a&&fc(a,i&&i.classList.contains(`prb-map-node`)?i.dataset.mapNode??null:null)}),document.addEventListener(`focusin`,e=>{let t=e.target instanceof Element?e.target.closest(`.prb-map-node`):null,n=t?.closest(`[data-map-board]`);t&&n&&fc(n,t.dataset.mapNode??null)}),document.addEventListener(`keydown`,t=>{let n=t.target;if(n instanceof HTMLElement){if(t.key===`Escape`&&n.closest(`[data-map-board]`)){let e=n.closest(`[data-map-board]`);e?.hasAttribute(`data-selecting`)&&(fc(e,null),t.stopPropagation());return}if((t.key===`ArrowLeft`||t.key===`ArrowRight`)&&n.matches(`[role="tab"][data-diagram-mode]`)){t.preventDefault();let r=[...n.closest(`[role="tablist"]`)?.querySelectorAll(`[data-diagram-mode]`)??[]].map(e=>e.dataset.diagramMode??``),i=t.key===`ArrowRight`?1:-1,a=r[(r.indexOf(n.dataset.diagramMode??``)+i+r.length)%r.length];e.showView(a),document.querySelector(`.prb-view[data-view="${a}"] [data-diagram-mode="${a}"]`)?.focus()}}}),{layout:ec,show:tc}}function ec(){for(let e of document.querySelectorAll(`[data-map-board]`))nc(e),rc(e)}function tc(e){let t=document.querySelector(`[data-map-body]`);t&&(t.innerHTML=Hs({stored:e,sections:hc(),reviewedSha:e.commitSha,register:mc()}),ec())}function nc(e){if(Zs.has(e)||typeof ResizeObserver>`u`)return;Zs.add(e);let t=!1;new ResizeObserver(()=>{t||(t=!0,requestAnimationFrame(()=>{t=!1,rc(e)}))}).observe(e)}function rc(e){let t=e.querySelector(`[data-map-edges]`);if(!t||e.offsetWidth===0)return;let n=e.getBoundingClientRect(),r=t=>{let r=t.getBoundingClientRect(),i=r.left-n.left+e.scrollLeft,a=r.top-n.top+e.scrollTop;return{left:i,top:a,right:i+r.width,bottom:a+r.height,cx:i+r.width/2,cy:a+r.height/2}},i=e.scrollWidth,a=e.scrollHeight;t.setAttribute(`width`,String(i)),t.setAttribute(`height`,String(a)),t.setAttribute(`viewBox`,`0 0 ${i} ${a}`),t.replaceChildren(dc());let o=new Map;for(let t of e.querySelectorAll(`.prb-map-node`))o.set(t.dataset.mapNode??``,r(t));let s=getComputedStyle(e).gridTemplateColumns.trim().split(/\s+/).length>1,c=[...e.querySelectorAll(`.prb-map-label[data-map-edge]`)].map(e=>{let t=o.get(e.dataset.from??``),n=o.get(e.dataset.to??``);return{label:e,from:t,to:n,ends:t&&n?ic(t,n,s):null}}),l=new Map,u=(e,t,n,r)=>{let i=`${e}\u0000${t}`;l.set(i,[...l.get(i)??[],{edge:n,other:r}])};c.forEach(({label:e,from:t,to:n,ends:r},i)=>{!t||!n||!r||(u(e.dataset.from??``,r.from,i,n),u(e.dataset.to??``,r.to,i,t))});let d=(e,t,n,r)=>{let i=[...l.get(`${e}\u0000${t}`)??[]],a=t===`top`||t===`bottom`;i.sort((e,t)=>a?e.other.cx-t.other.cx:e.other.cy-t.other.cy);let o=i.findIndex(e=>e.edge===n),s=a?r.right-r.left:r.bottom-r.top,c=Math.min(18,s*.6/Math.max(1,i.length));return(o-(i.length-1)/2)*c},f=[],p=[...e.querySelectorAll(`.prb-map-stage-title`)].map(r),m=[...o.values()],h=e.clientWidth,g=Qs.get(e),_=g&&g.width===h?g.edges:new Set;Qs.set(e,{width:h,edges:_});let v=(t,n)=>{n&&_.add(t);let r=e.querySelector(`[data-inline-edge="${t}"]`);r&&(r.hidden=!n)};c.forEach(({label:e,from:n,to:r,ends:i},a)=>{let o=Number(e.dataset.mapEdge);if(!n||!r||!i){e.hidden=!0;return}if(_.has(o)){e.hidden=!0,v(o,!0);return}let s=ac(n,i.from,d(e.dataset.from??``,i.from,a,n)),c=ac(r,i.to,d(e.dataset.to??``,i.to,a,r)),l=sc(s,i.from,c,i.to),[u,h,g,y]=l,ee=m.filter(e=>e!==n&&e!==r);if(Array.from({length:19},(e,t)=>cc(l,.05+t*.05)).some(e=>ee.some(t=>e.x>t.left&&e.x<t.right&&e.y>t.top&&e.y<t.bottom))){e.hidden=!0,v(o,!0);return}let b=document.createElementNS(Xs,`path`);b.setAttribute(`d`,`M${uc(u.x)},${uc(u.y)} C${uc(h.x)},${uc(h.y)} ${uc(g.x)},${uc(g.y)} ${uc(y.x)},${uc(y.y)}`),b.setAttribute(`class`,`prb-map-edge`),b.setAttribute(`marker-end`,`url(#prb-map-arrow)`),b.dataset.mapEdge=e.dataset.mapEdge??``,b.dataset.from=e.dataset.from??``,b.dataset.to=e.dataset.to??``,t.appendChild(b),e.hidden=!1;let x=e.offsetWidth,S=e.offsetHeight,te=[.5,.4,.6,.3,.7,.22,.78].map(e=>{let t=cc(l,e);return{left:t.x-x/2,top:t.y-S/2,right:t.x+x/2,bottom:t.y+S/2}}).find(e=>![...m,...p,...f].some(t=>lc(e,t,2)));if(!te){b.remove(),e.hidden=!0,v(o,!0);return}v(o,!1),f.push(te),e.style.left=`${Math.round(te.left)}px`,e.style.top=`${Math.round(te.top)}px`}),e.setAttribute(`data-laid-out`,``)}function ic(e,t,n){let r=t.left-e.right,i=e.left-t.right,a=t.top-e.bottom,o=e.top-t.bottom,s=Math.max(r,i),c=Math.max(a,o);return s>0&&(n||c<=0)?r>=i?{from:`right`,to:`left`}:{from:`left`,to:`right`}:c>0?a>=o?{from:`bottom`,to:`top`}:{from:`top`,to:`bottom`}:{from:`right`,to:`right`}}function ac(e,t,n){switch(t){case`top`:return{x:e.cx+n,y:e.top};case`bottom`:return{x:e.cx+n,y:e.bottom};case`left`:return{x:e.left,y:e.cy+n};case`right`:return{x:e.right,y:e.cy+n}}}var oc={top:{x:0,y:-1},bottom:{x:0,y:1},left:{x:-1,y:0},right:{x:1,y:0}};function sc(e,t,n,r){let i=Math.abs(t===`left`||t===`right`?n.x-e.x:n.y-e.y),a=Math.max(24,i/2),o=oc[t],s=oc[r];return[e,{x:e.x+o.x*a,y:e.y+o.y*a},{x:n.x+s.x*a,y:n.y+s.y*a},n]}function cc([e,t,n,r],i){let a=1-i;return{x:a*a*a*e.x+3*a*a*i*t.x+3*a*i*i*n.x+i*i*i*r.x,y:a*a*a*e.y+3*a*a*i*t.y+3*a*i*i*n.y+i*i*i*r.y}}function lc(e,t,n){return e.left<t.right+n&&e.right>t.left-n&&e.top<t.bottom+n&&e.bottom>t.top-n}function uc(e){return Math.round(e*10)/10}function dc(){let e=document.createElementNS(Xs,`defs`),t=document.createElementNS(Xs,`marker`);t.setAttribute(`id`,`prb-map-arrow`),t.setAttribute(`viewBox`,`0 0 10 10`),t.setAttribute(`refX`,`9`),t.setAttribute(`refY`,`5`),t.setAttribute(`markerWidth`,`7`),t.setAttribute(`markerHeight`,`7`),t.setAttribute(`orient`,`auto-start-reverse`);let n=document.createElementNS(Xs,`path`);return n.setAttribute(`d`,`M0,0 L10,5 L0,10 z`),n.setAttribute(`class`,`prb-map-arrow`),t.appendChild(n),e.appendChild(t),e}function fc(e,t){for(let t of e.querySelectorAll(`[data-active], [data-near]`))t.removeAttribute(`data-active`),t.removeAttribute(`data-near`);if(e.toggleAttribute(`data-selecting`,t!==null),t!==null){e.querySelector(`.prb-map-node[data-map-node="${CSS.escape(t)}"]`)?.setAttribute(`data-active`,``);for(let n of e.querySelectorAll(`[data-map-edge]`)){let r=n.getAttribute(`data-from`),i=n.getAttribute(`data-to`);if(r!==t&&i!==t)continue;n.setAttribute(`data-active`,``);let a=r===t?i:r;a&&e.querySelector(`.prb-map-node[data-map-node="${CSS.escape(a)}"]`)?.setAttribute(`data-near`,``)}}}function pc(e,t){document.querySelector(`[data-map-pane]`)?.setAttribute(`data-map-register`,e);for(let t of document.querySelectorAll(`[data-change-map]`))t.dataset.register=e;for(let t of document.querySelectorAll(`[data-map-register-option]`))t.setAttribute(`aria-pressed`,String(t.dataset.mapRegisterOption===e));ec(),fetch(t.endpoint(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({changeMapRegister:e})}).catch(()=>{})}function mc(){return document.querySelector(`[data-map-pane]`)?.dataset.mapRegister===`technical`?`technical`:`simple`}function hc(){return[...document.querySelectorAll(`[data-goto-section][data-theme-index]`)].map(e=>({id:e.dataset.gotoSection??``,title:e.querySelector(`.prb-rail-title`)?.textContent?.trim()??``}))}var gc=`repository`,_c={minCharacters:8,maxLines:3,maxCharacters:400},vc=[`app`,`service`,`component`,`store`,`external`,`group`],yc=/^[a-z][a-z0-9-]*$/;function bc(e){let t=[];if(!kc(e))return{ok:!1,errors:[`The architecture must be a JSON object.`]};jc(e,[`schema`,`title`,`summary`,`nodes`,`relationships`],`architecture`,t);let n=Ac(e,[`summary`],`architecture`,t);n.schema!==2&&t.push(`architecture.schema must be 2.`);let r=Mc(n.title,`architecture.title`,t),i=Nc(n.summary,`architecture.summary`,t),a=[],o=new Set;!Array.isArray(n.nodes)||n.nodes.length===0?t.push(`architecture.nodes must be a non-empty array.`):n.nodes.forEach((e,n)=>{let r=Sc(e,`nodes[${n}]`,t);r&&(o.has(r.id)&&t.push(`nodes[${n}].id "${r.id}" is used twice.`),o.add(r.id),a.push(r))});let s=new Set(Array.isArray(n.nodes)?n.nodes.flatMap(e=>kc(e)&&typeof e.id==`string`&&yc.test(e.id)?[e.id]:[]):[]),c=new Map(a.map(e=>[e.id,e]));for(let e of a){if(e.parent===void 0)continue;let n=c.get(e.parent);n?n.kind!==`group`&&t.push(`Node "${e.id}" names parent "${e.parent}", which is not a group.`):s.has(e.parent)||t.push(`Node "${e.id}" names parent "${e.parent}", which is not a node.`)}for(let e of a)xc(e.id,c).includes(e.id)&&t.push(`Node "${e.id}" is its own ancestor.`),e.kind===`external`&&e.owns&&t.push(`Node "${e.id}" is external, so it cannot own files in this repository.`);let l=[],u=new Set;return Array.isArray(n.relationships)?n.relationships.forEach((e,n)=>{let r=`relationships[${n}]`,i=Cc(e,r,t);if(!i)return;(u.has(i.id)||o.has(i.id))&&t.push(`${r}.id "${i.id}" is already used.`),u.add(i.id);let{source:a,target:d}=i;for(let[e,n]of[[`source`,a],[`target`,d]])s.has(n)||t.push(`${r}.${e} "${n}" is not a node.`);a===d?t.push(`${r} relates "${a}" to itself.`):c.has(a)&&c.has(d)&&(xc(a,c).includes(d)||xc(d,c).includes(a))&&t.push(`${r} relates "${a}" and "${d}", and one contains the other.`),l.push(i)}):t.push(`architecture.relationships must be an array.`),t.length>0||r===null?{ok:!1,errors:t}:{ok:!0,architecture:{schema:2,title:r,...i===void 0?{}:{summary:i},nodes:a,relationships:l}}}function xc(e,t){let n=[],r=t.get(e)?.parent;for(;r!==void 0&&!n.includes(r);)n.push(r),r=t.get(r)?.parent;return r!==void 0&&n.push(r),n}function Sc(e,t,n){if(!kc(e))return n.push(`${t} must be an object.`),null;jc(e,[`id`,`name`,`kind`,`parent`,`description`,`owns`,`evidence`],t,n);let r=Ac(e,[`parent`,`description`,`owns`],t,n),i=Pc(r.id,`${t}.id`,n);i===`repository`&&n.push(`${t}.id must not be "${gc}": that name is kept for the whole repository. Choose another id.`);let a=Mc(r.name,`${t}.name`,n),o=vc.find(e=>e===r.kind);o||n.push(`${t}.kind must be one of ${vc.join(`, `)}.`);let s=r.parent===void 0?void 0:Pc(r.parent,`${t}.parent`,n),c=Nc(r.description,`${t}.description`,n),l=r.owns===void 0?void 0:wc(r.owns,`${t}.owns`,n),u=Tc(r.evidence,`${t}.evidence`,n);return i===null||a===null||!o||s===null||l===null||u===null?null:{id:i,name:a,kind:o,...s===void 0?{}:{parent:s},...c===void 0?{}:{description:c},...l===void 0?{}:{owns:l},evidence:u}}function Cc(e,t,n){if(!kc(e))return n.push(`${t} must be an object.`),null;jc(e,[`id`,`source`,`target`,`label`,`description`,`evidence`,`confidence`],t,n);let r=Ac(e,[`description`,`confidence`],t,n),i=Pc(r.id,`${t}.id`,n),a=Pc(r.source,`${t}.source`,n),o=Pc(r.target,`${t}.target`,n),s=Mc(r.label,`${t}.label`,n),c=Nc(r.description,`${t}.description`,n),l=Tc(r.evidence,`${t}.evidence`,n),u;return r.confidence!==void 0&&(typeof r.confidence==`number`&&r.confidence>=0&&r.confidence<=1?u=r.confidence:n.push(`${t}.confidence must be a number from 0 to 1.`)),i===null||a===null||o===null||s===null||l===null?null:{id:i,source:a,target:o,label:s,...c===void 0?{}:{description:c},evidence:l,...u===void 0?{}:{confidence:u}}}function wc(e,t,n){if(!Array.isArray(e)||e.length===0)return n.push(`${t} must be a non-empty array of globs, or left out.`),null;let r=[];return e.forEach((e,i)=>{let a=Mc(e,`${t}[${i}]`,n);a!==null&&(!Oc(a)||a.startsWith(`./`)||a.startsWith(`!`)?n.push(`${t}[${i}] must be a glob relative to the repository, with forward slashes, no "..", no "./" and no "!".`):r.includes(a)?n.push(`${t}[${i}] "${a}" is listed twice.`):r.push(a))}),r.length===e.length?r:null}function Tc(e,t,n){if(!Array.isArray(e)||e.length===0)return n.push(`${t} must list at least one location in the repository.`),null;let r=[];return e.forEach((e,i)=>{let a=`${t}[${i}]`;if(!kc(e)){n.push(`${a} must be an object.`);return}jc(e,[`path`,`quote`,`symbol`,`line`,`note`],a,n),e=Ac(e,[`symbol`,`line`,`note`],a,n);let o=Mc(e.path,`${a}.path`,n);o!==null&&!Oc(o)&&n.push(`${a}.path must be relative to the repository, with forward slashes and no "..".`);let s=Ec(e.quote,`${a}.quote`,n),c;e.symbol!==void 0&&(typeof e.symbol==`string`&&/^\S{1,120}$/.test(e.symbol)?c=e.symbol:n.push(`${a}.symbol must be a name with no spaces, at most 120 characters.`));let l=Fc(e.line,`${a}.line`,n),u=Nc(e.note,`${a}.note`,n);o!==null&&s!==null&&r.push({path:o,quote:s,...c===void 0?{}:{symbol:c},...l===void 0?{}:{line:l},...u===void 0?{}:{note:u}})}),r.length===e.length?r:null}function Ec(e,t,n){if(typeof e!=`string`||!e.trim())return n.push(`${t} must be one to ${_c.maxLines} lines copied from the file.`),null;let r=e.replace(/^\s*\n|\n\s*$/g,``),i=Dc(r);return r.split(`
|
|
175
|
+
`).length>_c.maxLines||r.length>_c.maxCharacters?(n.push(`${t} must be at most ${_c.maxLines} lines and ${_c.maxCharacters} characters.`),null):i.length<_c.minCharacters?(n.push(`${t} "${i}" is too short to find again; quote at least ${_c.minCharacters} characters.`),null):r}function Dc(e){return e.replace(/\s+/g,` `).trim()}function Oc(e){return!e.startsWith(`/`)&&!e.includes(`\\`)&&!e.split(`/`).includes(`..`)}function kc(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ac(e,t,n,r){let i=t.filter(t=>e[t]===null);if(i.length===0)return e;let a={...e};for(let e of i)r.push(e===`parent`?`${n}.parent must be omitted when the node has no parent; null is not allowed.`:`${n}.${e} must be omitted when there is nothing to give; null is not allowed.`),delete a[e];return a}function jc(e,t,n,r){for(let i of Object.keys(e))t.includes(i)||r.push(`${n} has an unknown field "${i}".`)}function Mc(e,t,n){return typeof e==`string`&&e.trim()?e.trim():(n.push(`${t} must be a non-empty string.`),null)}function Nc(e,t,n){if(e!==void 0)return Mc(e,t,n)??void 0}function Pc(e,t,n){if(typeof e==`string`&&yc.test(e))return e;let r=typeof e==`string`?[...new Set([...e].filter(e=>e>``))]:[],i=r.map(e=>`"${e}" (U+${e.codePointAt(0).toString(16).toUpperCase().padStart(4,`0`)})`).join(`, `);return n.push(`${t} must be lowercase ASCII letters, digits and hyphens, starting with a letter${r.length>0?`; "${e}" contains ${i}, which ${r.length===1?`is`:`are`} not ASCII`:``}.`),null}function Fc(e,t,n){if(e!==void 0){if(Number.isInteger(e)&&e>=1)return e;n.push(`${t} must be a whole number from 1.`)}}function Ic(e,t){let n=new Map(e.nodes.map(e=>[e.id,e]));if(t!==null&&!e.nodes.some(e=>e.parent===t))throw Error(`"${t}" is not a group with members.`);let r=t===null?[]:[t,...xc(t,n)],i=e=>t!==null&&xc(e,n).includes(t),a=e=>{let a=[e,...xc(e,n)];if(t===null)return a[a.length-1];if(i(e))return a[a.indexOf(t)-1];let o=e,s=n.get(o)?.parent;for(;s!==void 0&&!r.includes(s);)o=s,s=n.get(o)?.parent;return o},o=e.nodes.filter(e=>t===null?e.parent===void 0:e.parent===t),s=new Set(o.map(e=>e.id)),c=new Map;for(let n of e.relationships){let e=a(n.source),r=a(n.target);if(e===r)continue;let i=e=>s.has(e)||e===t;if(!i(e)&&!i(r))continue;let o=`${e}>${r}`,l=c.get(o)??{id:o,source:e,target:r,relationships:[],label:``};l.relationships.push(n.id),c.set(o,l)}let l=new Set;for(let e of c.values())for(let n of[e.source,e.target])!s.has(n)&&n!==t&&l.add(n);let u=new Map(e.relationships.map(e=>[e.id,e.label]));for(let e of c.values())e.label=e.relationships.length===1?u.get(e.relationships[0]):`${e.relationships.length} relationships`;let d=t=>e.nodes.filter(e=>e.parent===t.id).length,f=(e,t)=>{let n=e.kind===`group`?d(e):0;return{id:e.id,name:e.name,kind:e.kind,member:t,opens:n,...n>0?{detail:n===1?`1 part`:`${n} parts`}:{}}};return{scope:t,title:t===null?e.title:n.get(t).name,nodes:[...o.map(e=>f(e,!0)),...e.nodes.filter(e=>l.has(e.id)).map(e=>f(e,!1))],edges:[...c.values()]}}var Lc={app:[`(["`,`"])`],service:[`["`,`"]`],component:[`("`,`")`],store:[`[("`,`")]`],external:[`["`,`"]`],group:[`[["`,`"]]`]};function Rc(e){return e.replace(/\s+/g,` `).replace(/#/g,`#35;`).replace(/"/g,`#quot;`).replace(/</g,`#lt;`).replace(/>/g,`#gt;`).replace(/%/g,`#37;`).replace(/`/g,`#96;`).trim()}function zc(e,t={}){let n=t.edgeIds??!0,r=new Map,i=new Map;e.nodes.forEach((e,t)=>{r.set(`n${t}`,e.id),i.set(e.id,`n${t}`)});let a=e=>{let[t,n]=Lc[e.kind],r=e.detail?`${Rc(e.name)}<br>${Rc(e.detail)}`:Rc(e.name),a=e.opens>0?`group`:e.member?e.kind===`external`?`external`:e.kind===`store`?`store`:`part`:`context`;return` ${i.get(e.id)}${t}${r}${n}:::${a}`},o=[`flowchart LR`],s=e.nodes.filter(e=>e.member),c=e.nodes.filter(e=>!e.member);e.scope===null?o.push(...s.map(a)):o.push(` subgraph scope["${Rc(e.title)}"]`,...s.map(a),` end`),o.push(...c.map(a));let l=t=>t===e.scope?`scope`:i.get(t),u=new Map;return e.edges.forEach((e,t)=>{let r=`e${t}`;u.set(r,e);let i=e.relationships.length>1?`==>`:`-->`;o.push(` ${l(e.source)} ${n?`${r}@`:``}${i}|"${Rc(e.label)}"| ${l(e.target)}`)}),o.push(` classDef part fill:#ffffff,stroke:#8c959f,color:#1f2328`,` classDef store fill:#fff8e6,stroke:#b08800,color:#1f2328`,` classDef external fill:#f6f8fa,stroke:#8c959f,stroke-dasharray:4 3,color:#424a53`,` classDef context fill:#f6f8fa,stroke:#d0d7de,stroke-dasharray:4 3,color:#57606a`,` classDef group fill:#f3e8ff,stroke:#9333ea,stroke-width:2px,color:#3b0764`),e.scope!==null&&o.push(` style scope fill:#faf5ff,stroke:#c4a5f5,color:#6b21a8`),{source:o.join(`
|
|
176
|
+
`),nodes:r,edges:u}}function Bc(e,t=[null]){let n=new Map(e.nodes.map(e=>[e.id,e]));return`${t.map((t,r)=>{let i=Ic(e,t),a=r===0&&t===null?`# ${Vc(e.title)}`:`## ${Vc(i.title)}`,o=t===null?e.summary:n.get(t)?.description,s=zc(i,{edgeIds:!1}).source;return[a,...o?[Vc(o)]:[],["```mermaid",s,"```"].join(`
|
|
177
177
|
`)].join(`
|
|
178
178
|
|
|
179
179
|
`)}).join(`
|
|
180
180
|
|
|
181
|
-
`)}\n`}function
|
|
182
|
-
`),a=e.textContent;try{await navigator.clipboard.writeText(i),e.textContent=`Copied`}catch{e.textContent=`Couldn't copy`}window.setTimeout(()=>e.textContent=a,2e3)}var Lc=class{parts;drawing=null;shown;constructor(e){this.parts=e,this.shown=e.repository}async draw(e,t=null){let{canvas:n,inspector:r,trail:i,embedded:a}=this.parts,o;try{o=await w(()=>import(`./chunk-CMZKCXl2.js`),[])}catch{return Bc(n,`The architecture drawing could not be loaded. Reload the page to try again.`)}this.drawing?.dispose(),this.shown=e;let s=document.createElement(`div`);s.className=`prb-arch-host`,n.replaceChildren(s);let c=e=>void this.drawing?.showScope(e);try{this.drawing=await o.renderArchitectureWithMermaid(s,e.architecture,{onSelect:e=>this.inspect(e),onScopeChange:t=>{i&&zc(i,e.architecture,t,c,this.base()),this.hint()},affected:new Set(a.touched?.[e.scope]??[])}),t===null?i&&zc(i,e.architecture,null,c,this.base()):await this.drawing.showScope(t),e!==this.parts.repository&&this.hint()}catch(e){console.error(`[prb architecture]`,e),Bc(n,`The architecture could not be drawn.`)}}async reveal(e){let t=this.parts.repository.architecture.nodes.find(t=>t.id===e);t&&(this.shown!==this.parts.repository&&await this.draw(this.parts.repository),await this.drawing?.showScope(t.parent??null),this.drawing?.select(e),this.parts.canvas.scrollIntoView({block:`nearest`,behavior:`smooth`}))}base(){if(this.shown===this.parts.repository)return[];let{repository:e}=this.parts,t=e.architecture.nodes.find(e=>e.id===this.shown.scope);return[{label:e.architecture.title,go:()=>void this.draw(e,t?.parent??null)},{label:`${t?.name??this.shown.scope} in depth`,go:()=>void this.drawing?.showScope(null)}]}hint(){let{inspector:e}=this.parts,t=[];this.shown!==this.parts.repository&&t.push(...Rc(this.shown.scope,this.shown.changed,this.parts.embedded)),t.push(P(`p`,`prb-arch-hint`,`Select a part or an arrow to see what it is and the code it rests on.`)),e.replaceChildren(...t)}inspect(e){let{inspector:t,embedded:n,deeper:r}=this.parts,i=this.shown===this.parts.repository;Vc(t,this.shown,e,e=>void this.drawing?.showScope(e),e=>{let t=[];if(n.touched?.[this.shown.scope]?.includes(e.id)&&t.push(P(`p`,`prb-arch-meta prb-arch-touched`,`This change touches files in this part.`)),!i)return t;let a=r.get(e.id);if(a){let r=P(`button`,`prb-arch-open`,`Open ${e.name} in depth`);r.type=`button`,r.addEventListener(`click`,()=>void this.draw(a));let i=Rc(e.id,a.changed,n),o=i.at(-1)?.tagName===`BUTTON`?i.pop():void 0;t.push(...i,r,...o?[o]:[])}else if(n.running?.includes(e.id))t.push(P(`p`,`prb-arch-meta`,`Mapping this part in depth…`));else if(n.mappable?.includes(e.id)){let r=n.failures?.[e.id];r&&t.push(P(`p`,`prb-arch-error`,`Mapping this part in depth failed. ${r.message}`));let i=P(`button`,`prb-diagram-redraw`,r?`Retry mapping this part in depth`:`Map this part in depth`);if(i.type=`button`,i.dataset.architectureMap=e.id,t.push(i),r&&r.errors.length>0){let e=P(`details`,`prb-arch-failure-details`,``),n=P(`ul`,``,``);for(let e of r.errors)n.append(P(`li`,``,e));e.append(P(`summary`,``,`What the checks found`),n),t.push(e)}}return t})}};function Rc(e,t,n){let r=t?[P(`p`,`prb-arch-meta prb-arch-changed`,t)]:[];if(n.running?.includes(e))return[...r,P(`p`,`prb-arch-meta`,`Mapping this part in depth again…`)];let i=n.failures?.[e],a=P(`button`,`prb-diagram-redraw`,`Remap this part`);return a.type=`button`,a.dataset.architectureMap=e,[...r,...i?[P(`p`,`prb-arch-error`,`Remapping this part failed. ${i.message}`)]:[],a]}function zc(e,t,n,r,i=[]){let a=new Map(t.nodes.map(e=>[e.id,e])),o=[...i.length>0?i:[{label:t.title,go:()=>r(null)}],...(n===null?[]:[...ac(n,a).reverse(),n]).map(e=>({label:a.get(e)?.name??e,go:()=>r(e)}))];e.replaceChildren(...o.flatMap((e,t)=>{let n=t===o.length-1,r=P(n?`span`:`button`,`prb-arch-crumb`,e.label);return n?r.setAttribute(`aria-current`,`location`):(r.type=`button`,r.addEventListener(`click`,e.go)),t===0?[r]:[P(`span`,`prb-arch-crumb-sep`,`›`),r]}))}function Bc(e,t){let n=document.createElement(`p`);n.className=`prb-arch-status`,n.textContent=t,e.replaceChildren(n)}function Vc(e,t,n,r,i){let{architecture:a}=t,o=new Map(a.nodes.map(e=>[e.id,e])),s=e=>o.get(e)?.name??e;if(n.kind===`none`){let t=P(`p`,`prb-arch-hint`,`Select a part or an arrow to see what it is and the code it rests on.`);e.replaceChildren(t);return}if(n.kind===`node`){let c=o.get(n.id);if(!c)return;let l=[P(`p`,`prb-arch-kind`,`${Oc[c.kind]??c.kind}${c.parent?` in ${s(c.parent)}`:``}`),P(`h4`,`prb-arch-title`,c.name)];c.description&&l.push(P(`p`,`prb-arch-text`,c.description));let u=a.nodes.filter(e=>e.parent===c.id).length;if(u>0&&r){let e=P(`button`,`prb-arch-open`,`Show the ${u} parts inside ${c.name}`);e.type=`button`,e.addEventListener(`click`,()=>r(c.id)),l.push(e)}i&&l.push(...i(c)),l.push(Hc(c.evidence,t.evidence[c.id]));let d=a.relationships.filter(e=>e.source===c.id||e.target===c.id);if(d.length>0){l.push(P(`h5`,`prb-arch-subhead`,`Relationships`));let e=P(`ul`,`prb-arch-related`,``);for(let t of d)e.append(P(`li`,``,`${s(t.source)} ${t.label} ${s(t.target)}`));l.push(e)}e.replaceChildren(...l);return}let c=[],l=n.ids.flatMap(e=>a.relationships.find(t=>t.id===e)??[]);l.length>1&&c.push(P(`p`,`prb-arch-kind`,`${l.length} relationships behind this arrow`));for(let e of l){let n=P(`section`,`prb-arch-relationship`,``);n.append(P(`p`,`prb-arch-kind`,`Relationship`),P(`h4`,`prb-arch-title`,`${s(e.source)} ${e.label} ${s(e.target)}`)),e.description&&n.append(P(`p`,`prb-arch-text`,e.description)),e.confidence!==void 0&&n.append(P(`p`,`prb-arch-meta`,`Inferred, with ${Math.round(e.confidence*100)}% confidence`)),n.append(Hc(e.evidence,t.evidence[e.id])),c.push(n)}e.replaceChildren(...c)}function Hc(e,t=[]){let n=P(`div`,`prb-arch-evidence`,``);n.append(P(`h5`,`prb-arch-subhead`,`Evidence`));let r=P(`ul`,`prb-arch-evidence-list`,``);return e.forEach((e,n)=>{let i=P(`li`,``,``),a=t[n];if(a&&a.state!==`missing`){let t=P(`button`,`prb-arch-location`,`${e.path}:${a.line}${a.endLine===a.line?``:`–${a.endLine}`}`);t.type=`button`,t.dataset.openEditor=e.path,t.dataset.openLine=String(a.line),i.append(t),a.via===`symbol`&&i.append(P(`span`,`prb-arch-gone`,`The quoted code has changed; this opens ${e.symbol}`))}else i.append(P(`span`,`prb-arch-location`,e.path),P(`span`,`prb-arch-gone`,`No longer found in this checkout`));i.append(P(`code`,`prb-arch-quote`,e.quote)),e.note&&i.append(P(`span`,`prb-arch-note`,e.note)),r.append(i)}),n.append(r),n}function P(e,t,n){let r=document.createElement(e);return t&&(r.className=t),n&&(r.textContent=n),r}function Uc(e,t){let n=t,r=null,i=!1,a=async()=>{let t=null;do{i=!1;let r=e.current(),a=await e.send(r);a===null&&(n=r),t=a}while(i);if(t===null)return;let r=await e.read();if(r!==null&&(n=r),i)return a();e.paint(n),e.fail(t)};return{changed:()=>{if(r){i=!0;return}r=a().finally(()=>{r=null})},idle:async()=>{for(;r;)await r}}}var Wc=5e3;function Gc(e,t=document,n=window){let r=()=>t.visibilityState===`visible`,a=async()=>{try{let n=await(await e.markSeen()).json();d(t,n.unread),i(t,n.running)}catch{}},o=async()=>{try{if(r()){let n=await(await e.askUnread()).json();i(t,n.running),typeof n.here==`number`&&n.here>0&&r()?await a():d(t,n.unread)}}catch{}n.setTimeout(()=>void o(),Wc)};t.addEventListener(`visibilitychange`,()=>{r()&&a()}),r()&&a(),n.setTimeout(()=>void o(),Wc)}function Kc(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}var qc=1e3,Jc=new WeakMap;function Yc(e,t){return e.length<=1e3?Kc(e)||` `:`${Kc(e.slice(0,qc))}\u2026 <button type="button" class="prb-code-long-toggle" data-full-line="${t}">Show full line</button>`}function Xc(e){let t=e.lines.length;return`<tr class="prb-code-deletion" data-before-line="${e.beforeLine}"><td class="prb-code-num"></td><td class="prb-code-line"><button type="button" class="prb-code-deletion-toggle" data-deletion-toggle aria-expanded="false">− ${t} deleted ${t===1?`line`:`lines`}</button></td></tr>`+e.lines.map(e=>`<tr class="prb-code-deleted" hidden><td class="prb-code-num">− ${e.oldLine}</td><td class="prb-code-line">${Yc(e.text,`old:${e.oldLine}`)}</td></tr>`).join(``)}function Zc(e,t){let n=new Set(e.addedLines),r=new Map;for(let t of e.deletions??[])r.set(t.beforeLine,t);let i=e.lines.map((i,a)=>{let o=e.from+a,s=[n.has(o)?`prb-code-added`:``,o===t?`prb-code-target`:``].filter(Boolean).join(` `),c=r.get(o);return`${c?Xc(c):``}<tr class="${s}" data-line="${o}"><td class="prb-code-num">${o}</td><td class="prb-code-line">${Yc(i,`new:${o}`)}</td></tr>`}),a=r.get(e.totalLines+1);return a&&e.to===e.totalLines&&i.push(Xc(a)),i.join(``)}function Qc(e){let t=e.getAttribute(`aria-expanded`)!==`true`;e.setAttribute(`aria-expanded`,String(t));let n=e.closest(`tr`)?.nextElementSibling;for(;n?.classList.contains(`prb-code-deleted`);)n.hidden=!t,n=n.nextElementSibling}function $c(e,t){let n=new Map;for(let e of t.deletions??[])for(let t of e.lines)n.set(t.oldLine,t.text);for(let r of e.querySelectorAll(`[data-full-line]`)){let[e,i]=(r.dataset.fullLine??``).split(`:`),a=Number(i),o=e===`old`?n.get(a):t.lines[a-t.from];o!==void 0&&Jc.set(r,o)}}function el(e){let t=Jc.get(e),n=e.closest(`td`);return t===void 0||!n?null:(n.textContent=t,n)}function tl(e){return e.deletion?2*e.line-1:2*e.line}function nl(e){return e%2==1?{line:(e+1)/2,deletion:!0}:{line:e/2,deletion:!1}}function rl(e,t){if(e.length===0)return``;let n=e.map(tl),r=n.indexOf(t),i=n.some(e=>e<t),a=n.some(e=>e>t),o=e.length,s=r===-1?`${o} ${o===1?`change`:`changes`}`:`${r+1} of ${o}`;return`<span class="prb-code-nav" data-change-navigator data-change-keys="${n.join(`,`)}" data-change-position="${t}">
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
<button type="button" class="prb-code-nav-step" data-change-step="next"${a?``:` disabled`}>Next \u2193</button>
|
|
186
|
-
</span>`}function il(e,t){let n=(e.dataset.changeKeys??``).split(`,`).filter(Boolean).map(Number),r=Number(e.dataset.changePosition)||0,i=t===`next`?n.find(e=>e>r):[...n].reverse().find(e=>e<r);return i===void 0?null:{key:i,anchor:nl(i)}}function al(e,t){return e.querySelector(t.deletion?`tr[data-before-line="${t.line}"]`:`tr[data-line="${t.line}"]`)}function ol(e){return(e.dataset.changeKeys??``).split(`,`).filter(Boolean).map(Number).map(nl)}function sl(e){if(!e)return;let t=Number(e.dataset.changePosition)||0;return(e.dataset.changeKeys??``).split(`,`).filter(Boolean).map(Number).includes(t)?nl(t):void 0}function cl(e,t){return Math.max(e,+!t)+1}var ll=8;function ul(e){for(let t=e.parentElement;t;t=t.parentElement){let e=getComputedStyle(t).overflowY;if(e===`auto`||e===`scroll`)return t}return null}function dl(e){let t=e.panel-e.scroller;return Math.max(340,Math.floor(e.pane-t-16))}function fl(e){let t=e.getBoundingClientRect().top;for(let n of e.querySelectorAll(`tr`)){let e=n.getBoundingClientRect();if(e.bottom>t)return{row:n,offset:e.top-t}}return null}function pl(e,t){let n=t.row.getBoundingClientRect().top-e.getBoundingClientRect().top-t.offset;e.scrollTop+=n}function ml(e){if(!e.hasAttribute(`data-expanded`))return;let t=ul(e),n=e.querySelector(`.prb-code-scroll`);if(!t||!n)return;let r=dl({pane:t.clientHeight,panel:e.offsetHeight,scroller:n.offsetHeight});e.style.setProperty(`--prb-code-expanded`,`${r}px`)}function hl(e){let t=e.querySelector(`[data-code-expand]`),n=e.querySelector(`.prb-code-scroll`);if(!t||!n)return;let r=e.hasAttribute(`data-expanded`);t.hidden=!r&&n.scrollHeight<=n.clientHeight,t.textContent=r?`Collapse`:`Expand`,t.setAttribute(`aria-expanded`,String(r))}var gl=!1;function _l(){gl||(gl=!0,window.addEventListener(`resize`,()=>{for(let e of document.querySelectorAll(`.prb-code[data-expanded]`))ml(e)}))}function vl(e,t){let n=e.querySelector(`.prb-code-scroll`),r=n?fl(n):null;t?(e.setAttribute(`data-expanded`,``),ml(e),_l()):(e.removeAttribute(`data-expanded`),e.style.removeProperty(`--prb-code-expanded`)),hl(e),n&&r&&pl(n,r);let i=t?ul(e):null;i&&(i.scrollTop+=e.getBoundingClientRect().top-i.getBoundingClientRect().top-ll)}var yl={title:`Start with understanding`,body:[`Welcome to PR Review Buddy.`,`Code review isn't just about finding bugs. It's about understanding what changed, why it changed, and whether it makes sense.`,`Let's walk through your first review.`]},bl=[{id:`story`,title:`The story behind the change`,body:[`Start here to understand why this change may have been made, what's changing, and the evidence behind the analysis.`,`It's your starting point, not the final verdict.`],target:{from:`.prb-view[data-view="overview"]`,to:`[data-tour="whats-changing"]`},reveal:`overview`},{id:`focus`,title:`Know where to focus`,body:[`Get a quick picture of the review's risk, issues, questions and affected files.`,`Use these signals to decide where to spend your attention, not as a substitute for reading the code.`],target:{from:`[data-tour="risk"]`,to:`[data-tour="stats"]`},reveal:`overview`},{id:`path`,title:`A path through the change`,body:[`Not sure where to begin? Follow the suggested review path.`,`It breaks the change into themes so you can explore the important parts in a more useful order.`],target:{from:`[data-tour="suggested-path"]`},reveal:`overview`},{id:`diagrams`,title:`See how the pieces fit`,body:[`Diagrams help you visualise the architecture and relationships involved in a change.`,`Use them to build context before diving into individual files.`],target:{from:`.prb-rail [data-view-nav="map"]`},reveal:`rail`},{id:`issues`,title:`Investigate, don't just accept`,body:[`Potential issues are starting points for investigation.`,`Examine the evidence, challenge the reasoning and decide whether each finding genuinely matters.`],target:{from:`.prb-rail [data-view-nav="issues"]`},reveal:`rail`},{id:`questions`,title:`Look beyond obvious problems`,body:[`Some changes need clarification rather than a fix.`,`Questions help you identify assumptions, missing context and decisions worth discussing with the author.`],target:{from:`.prb-rail [data-view-nav="questions"]`},reveal:`rail`},{id:`files`,title:`Get back to the code`,body:[`Explore the changed files and inspect the implementation yourself.`,`AI analysis helps direct your attention, but the code remains the source of truth.`],target:{from:`.prb-rail [data-view-nav="files"]`},reveal:`rail`},{id:`ask`,title:`Keep asking why`,body:[`Need a deeper explanation? Ask Buddy AI about the change, a finding or something you don't understand.`,`You can challenge its conclusions or ask it to explain things more simply.`],target:{from:`#prb-ask`},reveal:`ask`},{id:`judgement`,title:`Your judgement matters`,body:[`When you've investigated the change, use the review status to track your progress.`,`PR Review Buddy supports your judgement. It doesn't make the approval decision for you.`],target:{from:`[data-page-status]`},reveal:`none`}],xl=`#tour`,F=16,I=6,Sl=380,Cl=260;function wl(e){return e.querySelector(`.prb-rail[data-stale]`)?[]:bl.filter(t=>e.querySelector(t.target.from)&&(!t.target.to||e.querySelector(t.target.to)))}function Tl(e,t,n,r,i){let a=(e,t,n)=>Math.max(t,Math.min(e,Math.max(t,n))),o={top:a((i-n)/2,F,i-n-F),left:a((r-t)/2,F,r-t-F)};if(!e)return o;let s=a(e.top,F,i-n-F);if(e.right+F+t<=r-F)return{top:s,left:e.right+F};if(e.left-F-t>=F)return{top:s,left:e.left-F-t};let c=a(e.left,F,r-t-F);return e.bottom+F+n<=i-F?{top:e.bottom+F,left:c}:e.top-F-n>=F?{top:e.top-F-n,left:c}:{top:a(i-n-F,F,i-n-F),left:o.left}}function El(e,t){let n=e.getBoundingClientRect(),r=(t??e).getBoundingClientRect();return{top:n.top,bottom:Math.max(n.top,r.bottom),left:Math.min(n.left,r.left),right:Math.max(n.right,r.right)}}function Dl(e,t){let n=t.map(t=>[t,e.getAttribute(t)]);return()=>{for(let[t,r]of n)r===null?e.removeAttribute(t):e.setAttribute(t,r)}}function Ol(e,t){let n=[];if(t===`rail`){let t=e.documentElement;n.push(Dl(t,[`data-sidebar-hidden`,`data-sidebar-peek`])),t.removeAttribute(`data-sidebar-hidden`),t.hasAttribute(`data-sidebar-compact`)&&t.setAttribute(`data-sidebar-peek`,``)}if(t===`ask`){let t=e.querySelector(`.prb-body`);t&&t.getAttribute(`data-ask`)!==`open`&&(n.push(Dl(t,[`data-ask`])),t.setAttribute(`data-ask`,`open`))}return()=>{for(let e of n.reverse())e()}}function kl(e,t,n){let r=e.createElement(`button`);return r.type=`button`,r.className=t,r.textContent=n,r}function Al(e,t,n){let r=wl(e);if(r.length===0||e.querySelector(`dialog.prb-tour`))return null;let i=e.activeElement,a=[e.querySelector(`.prb-doc`),e.querySelector(`.prb-rail`)].map(e=>[e,e?.scrollTop??0]),o=n.host.enterTour(),s=e.createElement(`dialog`);s.className=`prb-tour`,s.setAttribute(`aria-labelledby`,`prb-tour-title`),s.setAttribute(`aria-describedby`,`prb-tour-text`);let c=e.createElement(`div`);c.className=`prb-tour-spot`,c.setAttribute(`aria-hidden`,`true`);let l=e.createElement(`div`);l.className=`prb-tour-card`;let u=e.createElement(`div`);u.className=`prb-tour-words`,u.setAttribute(`aria-live`,`polite`);let d=e.createElement(`p`);d.className=`prb-tour-count`;let f=e.createElement(`h2`);f.className=`prb-tour-title`,f.id=`prb-tour-title`;let p=e.createElement(`div`);p.className=`prb-tour-text`,p.id=`prb-tour-text`,u.append(d,f,p);let m=kl(e,`prb-tour-skip`,`Skip tour`),h=kl(e,`prb-tour-back`,`Back`),g=kl(e,`prb-tour-next`,`Next`),_=e.createElement(`div`);_.className=`prb-tour-actions`,_.append(m,h,g),l.append(u,_),s.append(c,l),e.body.append(s);let v=-1,y=()=>{},ee=!1,b=()=>{let n=r[v],i=n?e.querySelector(n.target.from):null,a=i?El(i,n?.target.to?e.querySelector(n.target.to):null):null,o=a&&a.bottom>a.top&&a.right>a.left?a:null,u=t.innerWidth,d=t.innerHeight;if(s.toggleAttribute(`data-spotless`,!o),o){let e=Math.max(o.top-I,0),t=Math.max(o.left-I,0);c.hidden=!1,c.style.top=`${e}px`,c.style.left=`${t}px`,c.style.width=`${Math.min(o.right+I,u)-t}px`,c.style.height=`${Math.min(o.bottom+I,d)-e}px`}else c.hidden=!0;let f=o?Math.max(o.left-I-32,u-o.right-I-32):0;l.style.width=`${f>=Cl?Math.min(Sl,f):Math.min(Sl,u-32)}px`;let p=l.getBoundingClientRect(),m=Tl(o&&{top:o.top-I,left:o.left-I,bottom:o.bottom+I,right:o.right+I},p.width,p.height,u,d);l.style.top=`${m.top}px`,l.style.left=`${m.left}px`},x=(t,n)=>{y(),y=()=>{},v=t;let i=r[v];if(s.toggleAttribute(`data-welcome`,!i),i){y=Ol(e,i.reveal);let t=e.querySelector(i.target.from);(i.target.to?e.querySelector(i.target.to):null)?.scrollIntoView({block:`nearest`}),t?.scrollIntoView({block:`nearest`})}d.textContent=i?`Step ${v+1} of ${r.length}`:`Welcome`,f.textContent=i?i.title:yl.title,p.replaceChildren(...(i?i.body:yl.body).map(t=>{let n=e.createElement(`p`);return n.textContent=t,n})),h.hidden=!i,g.textContent=i?v===r.length-1?`Finish`:`Next`:`Start tour`,b(),g.focus({focusVisible:n})},S=r=>{if(!ee){ee=!0,y(),t.removeEventListener(`resize`,b),e.removeEventListener(`scroll`,b,!0),e.removeEventListener(`transitionend`,b,!0),s.open&&s.close(),s.remove(),o();for(let[e,t]of a)e&&(e.scrollTop=t);n.mode===`first`&&n.host.save(r),i?.isConnected&&i.focus({focusVisible:!1})}};return g.addEventListener(`click`,e=>v===r.length-1?S(`completed`):x(v+1,e.detail===0)),h.addEventListener(`click`,e=>x(v-1,e.detail===0)),m.addEventListener(`click`,()=>S(`dismissed`)),s.addEventListener(`cancel`,()=>S(`dismissed`)),s.addEventListener(`close`,()=>S(`dismissed`)),s.addEventListener(`keydown`,t=>{if(t.key!==`Tab`)return;let n=[m,h,g].filter(e=>!e.hidden),r=n.indexOf(e.activeElement);t.preventDefault(),n[(r+(t.shiftKey?n.length-1:1))%n.length]?.focus()}),t.addEventListener(`resize`,b),e.addEventListener(`scroll`,b,!0),e.addEventListener(`transitionend`,b,!0),s.showModal(),x(-1,!1),{close:()=>S(`dismissed`)}}var jl={busy:`This review is being analysed or updated right now, so what the tour would point at is about to change. Replay it once that finishes, or from Help, which opens a review the tour can start on.`,empty:`This review has no completed analysis for the tour to walk through. Replay it from Help, which opens a review the tour can start on.`};function Ml(e,t){let n=e.activeElement,r=e.createElement(`dialog`);r.className=`prb-dialog`,r.setAttribute(`data-tour-unavailable`,t),r.setAttribute(`aria-labelledby`,`prb-tour-unavailable-title`);let i=e.createElement(`h2`);i.id=`prb-tour-unavailable-title`,i.textContent=`The guided tour can't start here`;let a=e.createElement(`p`);a.textContent=jl[t];let o=e.createElement(`div`);o.className=`prb-dialog-actions`;let s=kl(e,`prb-dialog-primary`,`OK`);return s.addEventListener(`click`,()=>r.close()),o.append(s),r.append(i,a,o),r.addEventListener(`close`,()=>{r.remove(),n?.isConnected&&n.focus({focusVisible:!1})}),e.body.append(r),r.showModal(),s.focus(),r}function Nl(e,t,n){let r=e.body.hasAttribute(`data-tour-busy`)||e.querySelector(`.prb-rail[data-stale]`)!==null?`busy`:Al(e,t,{mode:`replay`,host:n})?null:`empty`;return r?(Ml(e,r),r):`started`}var Pl={rb:`ruby`,js:`javascript`,mjs:`javascript`,cjs:`javascript`,ts:`typescript`,mts:`typescript`,cts:`typescript`,jsx:`jsx`,tsx:`tsx`,json:`json`,yml:`yaml`,yaml:`yaml`,md:`markdown`,html:`html`,css:`css`,scss:`scss`,sql:`sql`,py:`python`,java:`java`,kt:`kotlin`,kts:`kotlin`,go:`go`,rs:`rust`,sh:`shellscript`,bash:`shellscript`,zsh:`shellscript`,tf:`terraform`,tfvars:`terraform`};function Fl(e){let t=e.slice(e.lastIndexOf(`/`)+1);if(t===`Dockerfile`||t.startsWith(`Dockerfile.`))return`docker`;let n=t.lastIndexOf(`.`);return n<=0?null:Pl[t.slice(n+1).toLowerCase()]??null}function Il(e){let t=new Set;for(let n of e){let e=Fl(n);e&&t.add(e)}return[...t]}var Ll={ruby:()=>w(()=>import(`./chunk-CAnKkQXq.js`),__vite__mapDeps([20,21,22,23,24,25,26,27,28,29,30])),javascript:()=>w(()=>import(`./chunk-D2pwppYQ.js`),__vite__mapDeps([31,22])),typescript:()=>w(()=>import(`./chunk-Cjc271yU.js`),__vite__mapDeps([32,27])),jsx:()=>w(()=>import(`./chunk-B2PgDgse.js`),__vite__mapDeps([33,25])),tsx:()=>w(()=>import(`./chunk-D95j_xjm.js`),__vite__mapDeps([34,28])),json:()=>w(()=>import(`./chunk-qhed-kSA.js`),[]),yaml:()=>w(()=>import(`./chunk-Cv3JjNkX.js`),__vite__mapDeps([35,30])),markdown:()=>w(()=>import(`./chunk-BYOwaDjH.js`),[]),html:()=>w(()=>import(`./chunk-EIJEcyW-.js`),__vite__mapDeps([36,23,21,22])),css:()=>w(()=>import(`./chunk-C3nvJp0N.js`),__vite__mapDeps([37,21])),scss:()=>w(()=>import(`./chunk-D2NZorQR.js`),__vite__mapDeps([38,21])),sql:()=>w(()=>import(`./chunk-NzFayA7r.js`),__vite__mapDeps([39,26])),python:()=>w(()=>import(`./chunk-gzcpVVnB.js`),[]),java:()=>w(()=>import(`./chunk-AdYjtsZU.js`),__vite__mapDeps([40,24])),kotlin:()=>w(()=>import(`./chunk-DhhofPvG.js`),[]),go:()=>w(()=>import(`./chunk-rLFTqkRN.js`),[]),rust:()=>w(()=>import(`./chunk-Cfkwpbl8.js`),[]),shellscript:()=>w(()=>import(`./chunk-pNSm1SyV.js`),__vite__mapDeps([41,29])),docker:()=>w(()=>import(`./chunk-IyjqRm3v.js`),[]),terraform:()=>w(()=>import(`./chunk-DswuEJGm.js`),[])},Rl=`github-light-default`,zl=null,Bl=new Map;function Vl(){return zl??=Promise.all([w(()=>import(`./chunk-c-cg1wCO.js`),__vite__mapDeps([42,4])),w(()=>import(`./chunk-CBrdyqSx.js`),__vite__mapDeps([43,4])),w(()=>import(`./chunk-BXViO-2h.js`),[])]).then(([{createHighlighterCore:e},{createOnigurumaEngine:t},n])=>e({themes:[n.default],langs:[],engine:t(w(()=>import(`./chunk-BnjxR4X6.js`),[]))})).catch(()=>null),zl}function Hl(e){let t=Bl.get(e);return t||(t=Vl().then(async t=>t?(await t.loadLanguage(Ll[e]),!0):!1).catch(()=>!1),Bl.set(e,t)),t.then(e=>e?Vl():null)}var Ul={async preload(e){await Hl(e)},async tokenize(e,t){let n=await Hl(t);if(!n)return null;try{let{tokens:r,fg:i}=n.codeToTokens(e,{lang:t,theme:Rl}),a=i?.toLowerCase();return r.map(e=>e.map(e=>({content:e.content,...e.color&&e.color.toLowerCase()!==a?{color:e.color}:{}})))}catch{return null}}};function Wl(e,t=Ul){return Promise.all(e.map(e=>t.preload(e))).then(()=>void 0)}var Gl=/^#[0-9a-f]{3,8}$/i;function Kl(e,t){return!t||t.map(e=>e.content).join(``)!==e?null:t.map(e=>e.color&&Gl.test(e.color)?`<span style="color:${e.color}">${Kc(e.content)}</span>`:Kc(e.content)).join(``)}function ql(e){return e.length>1e3?e.slice(0,qc):e}function Jl(e,t,n){if(!e||t===``)return;let r=Kl(ql(t),n);if(r===null)return;if(t.length<=1e3){if(e.childElementCount!==0||e.textContent!==t)return;e.innerHTML=r;return}let i=e.querySelector(`[data-full-line]`);i&&(e.innerHTML=`${r}… `,e.append(i))}async function Yl(e,t,n=Ul){let r=Fl(t.path);if(!r){delete e.dataset.syntax;return}e.dataset.syntax=r;let i=e.querySelector(`tbody`);if(!i)return;let a=()=>i.isConnected&&e.querySelector(`tbody`)===i,o=await n.tokenize(t.lines.map(ql).join(`
|
|
187
|
-
`),r);if(a()){o&&t.lines.forEach((e,n)=>{Jl(i.querySelector(`tr[data-line="${t.from+n}"] .prb-code-line`),e,o[n])});for(let e of t.deletions??[]){if(!i.querySelector(`tr[data-before-line="${e.beforeLine}"]`))continue;let t=await n.tokenize(e.lines.map(e=>ql(e.text)).join(`
|
|
188
|
-
`),r);if(!a())return;if(!t)continue;let o=i.querySelector(`tr[data-before-line="${e.beforeLine}"]`)?.nextElementSibling;for(let[n,r]of e.lines.entries()){if(!o?.classList.contains(`prb-code-deleted`))break;Jl(o.querySelector(`.prb-code-line`),r.text,t[n]),o=o.nextElementSibling}}}}async function Xl(e,t=Ul){let n=e.closest(`.prb-code`)?.dataset.syntax,r=e.textContent??``;if(!n||!(n in Ll)||r===``)return;let i=await t.tokenize(r,n);if(!e.isConnected||e.childElementCount!==0||e.textContent!==r)return;let a=Kl(r,i?.[0]);a!==null&&i?.length===1&&(e.innerHTML=a)}var L=s({ownsRestore:!0}),Zl=document.body,Ql=Zl.dataset.apiBase??``,$l=Zl.dataset.token??``,eu=Zl.dataset.editorLabel??``,tu=Zl.dataset.editorTemplate??``,nu=Zl.dataset.repoPath??``,ru=Zl.dataset.explainPrompt??``,iu=Zl.dataset.sessionId??``;function R(e){return`${Ql}${e}?t=${encodeURIComponent($l)}`}var au=!1,ou=0,su=!1;function cu(e){ou++;try{e()}finally{ou--}}var lu=Ur(document.querySelector(`.prb-body`)?.dataset.reviewLayout),uu=Wr(lu,e=>{fetch(R(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({reviewLayout:e})}).catch(()=>{})},()=>au&&ou===0);function du(e){fetch(R(`/event`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),keepalive:!0}).catch(()=>{})}var fu=Lo({endpoint:R,showDiagrams:()=>Du(`diagram`),showMap:()=>Du(`map`),showChangeMap:e=>pu.show(e)}),pu=Rs({endpoint:R,showView:e=>Du(e)}),mu=Ac({endpoint:R}),hu=null,gu=`the whole change`;function _u(e){let t=C(e,bu),n=L.push(ie(t),t);vu++,xu(t),n&&yu(t)}var vu=0;function yu(e){let t=(e.kind===`section`?document.querySelector(`.prb-rail [data-goto-section="${CSS.escape(e.sectionId)}"] .prb-rail-title`):document.querySelector(`.prb-rail [data-view-nav="${CSS.escape(e.view)}"] .prb-rail-title`))?.textContent?.trim();t&&o(document,t)}var z=null,bu=document.querySelector(`[data-guide-start]`)?.dataset.guideStart??null;function xu(e){let t=C(e,bu);if(t!==e){let{kind:e,view:n,focus:r,...i}=x(history.state);L.replace(ie(t),{...i,...t})}let n=!z||!re(z,t);z=t,n&&(t.kind===`view`?ku(t.view):Nu(t.sectionId)),Tu(t.focus??null)}var Su={history:{get state(){return history.state},pushState:(e,t,n)=>{vu++,L.push(n,x(e))},replaceState:(e,t,n)=>L.replace(n,x(e)),back:()=>{su=!0,history.back()}},apply:xu},B=ye(document,{onOpen:e=>e.hasAttribute(`data-ask-buddy-menu`)?mf(e):hf(e),onClose:hf}),Cu={post:async e=>{let t=await fetch(R(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({reassessment:e})});return{status:t.status,body:await t.json().catch(()=>null)}},closeMenu:e=>B.close(e),onVerdictClosed:(e,t)=>{let n=e.querySelector(`[data-question-answered], [data-issue-dismissed]`);if(n){if(n.dataset.questionAnswered!==void 0)pd(e,t||n.dataset.answered===`true`,`questions`),yd();else{let r=n.dataset.dismissed===`true`&&n.dataset.stale!==`true`;pd(e,t||r||n.dataset.settled===`true`,`issues`),xd()}}}};hr(document,Cu);var wu=document.querySelector(`[data-view="issues"]`);wu&&Mr(wu,(e,t)=>uu.issueFold(e,t));function Tu(e){se(document.querySelector(`.prb-body`),document,e),uu.focus(e),B.closeAll(),e===`buddy`&&Md()}function Eu(e){z&&(z.focus===e?ce(z,Su):pe(z,e,Su))}function Du(e,t={}){let n=t.keepFocus&&z?.focus?e:ve(e,z?.focus);_u({kind:`view`,view:e,...n?{focus:n}:{}})}function Ou(e){_u({kind:`section`,sectionId:e,...z?.focus===`guide`?{focus:`guide`}:{}})}function ku(e){for(let t of document.querySelectorAll(`.prb-view`))t.hidden=t.dataset.view!==e;for(let t of document.querySelectorAll(`[data-view-nav]:not([role="tab"])`))t.setAttribute(`aria-current`,String(t.dataset.viewNav===e||(t.dataset.viewAlso??``).split(` `).includes(e)));e!==`architecture`&&du({event:`view_opened`,view:e}),e===`diagram`&&fu.drawPane(),e===`map`&&pu.layout(),e===`architecture`&&mu.show(),Au(),document.querySelector(`.prb-doc`)?.scrollTo({top:0})}function Au(){yi(),hu=null,gu=`the whole change`,Pu()}function ju(e,t){let n=document.getElementById(e.getAttribute(`aria-controls`)??``);n&&(e.setAttribute(`aria-expanded`,String(t)),e.setAttribute(`aria-label`,`${t?`Collapse`:`Expand`} ${e.dataset.railToggle??`this section`}`),n.hidden=!t,uu.fold(n.id,t))}function Mu(){for(let e of document.querySelectorAll(`[data-rail-toggle]`)){let t=document.getElementById(e.getAttribute(`aria-controls`)??``);(t?.contains(document.getElementById(`prb-rail-path`))||t?.id===`prb-rail-path`)&&ju(e,!0)}}function Nu(e){ku(`guide`),Mu(),vi(e);let t=gi(e);if(!t)return;let n=document.querySelector(`[data-goto-section="${CSS.escape(e)}"]`);du({event:`theme_opened`,themeIndex:Number(n?.dataset.themeIndex??-1),attention:n?.querySelector(`.prb-attention`)?.dataset.attention??`medium`,isRecommendedStart:n?.dataset.recommendedStart===`true`}),hu=e,gu=t.querySelector(`.pr-helper-guide-section-title`)?.textContent?.trim()??`this theme`,Pu()}function Pu(){let e=document.querySelector(`[data-ask-scope]`);e&&(e.textContent=gu)}function V(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}function Fu(e){return e.tagName===`LI`?{parent:e,position:`beforeend`}:{parent:e,position:`afterend`}}async function Iu(e){let t=e.tagName===`LI`?e.querySelector(`:scope > .prb-code`):e.nextElementSibling;if(t?.classList.contains(`prb-code`)){t.remove(),e.setAttribute(`aria-expanded`,`false`);return}let n=e.dataset.file;if(!n)return;let r=Number(e.dataset.line)||0,i=e.tagName!==`LI`,a=document.createElement(`div`);a.className=`prb-code`,a.innerHTML=`<p class="prb-code-status">Reading…</p>`;let{parent:o,position:s}=Fu(e);o.insertAdjacentElement(s,a),e.setAttribute(`aria-expanded`,`true`),du({event:`file_opened`,fromFinding:i,targeted:r>0}),await Ru(a,n,{cited:r,centre:r,expand:0,position:r?2*r:0})}var Lu=Oi();function Ru(e,t,n){return Lu.run(e,n,async()=>{try{let{centre:r,expand:i}=n,a=`&path=${encodeURIComponent(t)}${r?`&line=${r}`:``}${i?`&expand=${i}`:``}`,o=await fetch(`${R(`/file`)}${a}`),s=await o.json();return o.ok?()=>zu(e,s,n):()=>{e.innerHTML=`<p class="prb-code-status">${V(s?.error??`Could not read that file.`)}</p>`}}catch{return()=>{e.innerHTML=`<p class="prb-code-status">Could not reach PR Review Buddy. The workspace server may have stopped.</p>`}}})}function zu(e,t,n){let{cited:r,centre:i,expand:a}=n;e.dataset.cited=String(r),e.dataset.centre=String(i),e.dataset.expand=String(a),e.dataset.position=String(n.position);let o=Zc(t,r),s=tu&&nu?t.checkout===`absent`?`<button type="button" class="prb-code-open" disabled>Not in your working folder</button>`:`<button type="button" class="prb-code-open" data-open-editor="${V(t.path)}" data-open-line="${r||t.from}">${V(`Open in ${eu||`editor`}`)}</button>`:``,c=t.pullRequest&&t.pullRequest.precise?`<a class="prb-code-open prb-code-pr" href="${V(t.pullRequest.href)}" target="_blank" rel="noopener noreferrer">${V(t.pullRequest.label)}</a>`:``,l=t.truncated?`<button type="button" class="prb-code-more" data-expand-file="${V(t.path)}" data-expand-line="${i||0}" data-expand-cited="${r||0}" data-expand-step="${cl(a,i)}">Show more of this file</button>`:``,u=t.checkout===`differs`?` · your editor will show a different version`:t.checkout===`absent`?` · not in your working folder`:``,d=t.changes===`unavailable`?` · change details unavailable`:``,f=`<div class="prb-code-source"><span>${t.source===`commit`?`Viewing reviewed version${t.sourceSha?` <code>${V(t.sourceSha.slice(0,7))}</code>`:``}${u}${d}`:`Viewing your working folder${d}`}</span>${rl(t.changeAnchors??[],n.position)}</div>`,p=e.hasAttribute(`data-expanded`),m=`<button type="button" class="prb-code-open" data-code-expand aria-expanded="${p}">${p?`Collapse`:`Expand`}</button>`;e.innerHTML=`<div class="prb-code-header">
|
|
181
|
+
`)}\n`}function Vc(e){return e.replace(/\s+/g,` `).trim().replace(/[\\`*_[\]<>#|]/g,`\\$&`)}var Hc={exploring:{title:`Exploring the code…`,detail:`Reading the repository and identifying its main parts.`},checking:{title:`Checking the evidence…`,detail:`Making sure every piece of code the map cites is really there.`},correcting:{title:`Correcting the map…`,detail:`Fixing what the checks found.`}};function Uc(e){return Hc[e.stage]}var Wc={app:`Application`,service:`Service`,component:`Component`,store:`Store`,external:`External system`,group:`Group`},Gc=5e3;function Kc(e){let t=!1,n=!1,r=()=>document.querySelector(`[data-architecture-pane]`)?.hidden===!1;document.addEventListener(`click`,t=>{let n=t.target.closest(`[data-architecture-map]`);n&&Jc(e,n,n.dataset.architectureMap||`repository`);let r=t.target.closest(`[data-architecture-stop]`);r&&Yc(e,r,r.dataset.architectureStop||`repository`)}),Zc(e,()=>{r()?qc():n=!0});async function i(){if(n)return qc();if(t)return;let e=document.querySelector(`[data-architecture]`),r=e?.querySelector(`[data-architecture-canvas]`),i=e?.querySelector(`[data-architecture-inspector]`),a=e?.querySelector(`[data-architecture-model]`)?.textContent;if(!e||!r||!i||!a)return;t=!0;let o;try{o=JSON.parse(a)}catch{return nl(r,`The architecture could not be read.`)}let s=bc(o.architecture);if(!s.ok)return nl(r,`The architecture could not be read.`);let c={scope:gc,architecture:s.architecture,evidence:o.evidence??{}},l=new Map;for(let[e,t]of Object.entries(o.deeper??{})){let n=bc(t.architecture);n.ok&&l.set(e,{scope:e,architecture:n.architecture,evidence:t.evidence,...t.changed?{changed:t.changed}:{}})}let u=new $c({canvas:r,inspector:i,trail:e.querySelector(`[data-architecture-trail]`),repository:c,deeper:l,embedded:o}),d=new URLSearchParams(window.location.search).get(`part`),f=u.draw(c).then(()=>d?u.reveal(d):void 0);return e.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-architecture-select]`);n?.dataset.architectureSelect&&u.reveal(n.dataset.architectureSelect);let r=t.closest(`[data-architecture-copy]`);r&&Qc(r,c,l)}),f}return{show:i}}function qc(){let e=oe(window.location.hash,`architecture`);window.location.hash!==e&&window.history.replaceState(window.history.state,``,e),window.location.reload()}async function Jc(e,t,n){if(!t.disabled){t.disabled=!0,t.parentElement?.querySelector(`[data-architecture-error]`)?.remove();try{let r=await fetch(e.endpoint(`/architecture`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({scope:n})});if(r.status===202||r.status===409)return qc();Xc(t,(await r.json().catch(()=>null))?.error??`Mapping could not start.`)}catch{Xc(t,`Could not reach PR Review Buddy. The workspace server may have stopped.`)}t.disabled=!1}}async function Yc(e,t,n){if(!t.disabled){t.disabled=!0,t.parentElement?.querySelector(`[data-architecture-error]`)?.remove();try{if((await fetch(e.endpoint(`/architecture`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({scope:n,stop:!0})})).ok)return qc();Xc(t,`Mapping could not be stopped.`)}catch{Xc(t,`Could not reach PR Review Buddy. The workspace server may have stopped.`)}t.disabled=!1}}function Xc(e,t){let n=M(`p`,`prb-arch-error`,t);n.setAttribute(`data-architecture-error`,``),n.setAttribute(`role`,`alert`),e.after(n)}function Zc(e,t){let n=[];try{n=JSON.parse(document.querySelector(`[data-architecture-runs]`)?.textContent??`[]`)}catch{return}if(n.length===0)return;let r=async()=>{try{let r=(await(await fetch(e.endpoint(`/job`))).json()).architecture??[];for(let e of r){let t=document.querySelector(`[data-architecture-running="${CSS.escape(e.scope)}"]`),{title:n,detail:r}=Uc(e),i=t?.querySelector(`[data-architecture-stage]`),a=t?.querySelector(`[data-architecture-stage-detail]`);i&&(i.textContent=n),a&&(a.textContent=r)}if(n.some(e=>!r.some(t=>t.scope===e)))return t()}catch{}window.setTimeout(()=>void r(),Gc)};window.setTimeout(()=>void r(),Gc)}async function Qc(e,t,n){let r=e=>e.nodes.filter(t=>e.nodes.some(e=>e.parent===t.id)).map(e=>e.id),i=[t,...n.values()].map(e=>Bc(e.architecture,[null,...r(e.architecture)])).join(`
|
|
182
|
+
`),a=e.textContent;try{await navigator.clipboard.writeText(i),e.textContent=`Copied`}catch{e.textContent=`Couldn't copy`}window.setTimeout(()=>e.textContent=a,2e3)}var $c=class{parts;drawing=null;shown;constructor(e){this.parts=e,this.shown=e.repository}async draw(e,t=null){let{canvas:n,inspector:r,trail:i,embedded:a}=this.parts,o;try{o=await C(()=>import(`./chunk-CMZKCXl2.js`),[])}catch{return nl(n,`The architecture drawing could not be loaded. Reload the page to try again.`)}this.drawing?.dispose(),this.shown=e;let s=document.createElement(`div`);s.className=`prb-arch-host`,n.replaceChildren(s);let c=e=>void this.drawing?.showScope(e);try{this.drawing=await o.renderArchitectureWithMermaid(s,e.architecture,{onSelect:e=>this.inspect(e),onScopeChange:t=>{i&&tl(i,e.architecture,t,c,this.base()),this.hint()},affected:new Set(a.touched?.[e.scope]??[])}),t===null?i&&tl(i,e.architecture,null,c,this.base()):await this.drawing.showScope(t),e!==this.parts.repository&&this.hint()}catch(e){console.error(`[prb architecture]`,e),nl(n,`The architecture could not be drawn.`)}}async reveal(e){let t=this.parts.repository.architecture.nodes.find(t=>t.id===e);t&&(this.shown!==this.parts.repository&&await this.draw(this.parts.repository),await this.drawing?.showScope(t.parent??null),this.drawing?.select(e),this.parts.canvas.scrollIntoView({block:`nearest`,behavior:`smooth`}))}base(){if(this.shown===this.parts.repository)return[];let{repository:e}=this.parts,t=e.architecture.nodes.find(e=>e.id===this.shown.scope);return[{label:e.architecture.title,go:()=>void this.draw(e,t?.parent??null)},{label:`${t?.name??this.shown.scope} in depth`,go:()=>void this.drawing?.showScope(null)}]}hint(){let{inspector:e}=this.parts,t=[];this.shown!==this.parts.repository&&t.push(...el(this.shown.scope,this.shown.changed,this.parts.embedded)),t.push(M(`p`,`prb-arch-hint`,`Select a part or an arrow to see what it is and the code it rests on.`)),e.replaceChildren(...t)}inspect(e){let{inspector:t,embedded:n,deeper:r}=this.parts,i=this.shown===this.parts.repository;rl(t,this.shown,e,e=>void this.drawing?.showScope(e),e=>{let t=[];if(n.touched?.[this.shown.scope]?.includes(e.id)&&t.push(M(`p`,`prb-arch-meta prb-arch-touched`,`This change touches files in this part.`)),!i)return t;let a=r.get(e.id);if(a){let r=M(`button`,`prb-arch-open`,`Open ${e.name} in depth`);r.type=`button`,r.addEventListener(`click`,()=>void this.draw(a));let i=el(e.id,a.changed,n),o=i.at(-1)?.tagName===`BUTTON`?i.pop():void 0;t.push(...i,r,...o?[o]:[])}else if(n.running?.includes(e.id))t.push(M(`p`,`prb-arch-meta`,`Mapping this part in depth…`));else if(n.mappable?.includes(e.id)){let r=n.failures?.[e.id];r&&t.push(M(`p`,`prb-arch-error`,`Mapping this part in depth failed. ${r.message}`));let i=M(`button`,`prb-diagram-redraw`,r?`Retry mapping this part in depth`:`Map this part in depth`);if(i.type=`button`,i.dataset.architectureMap=e.id,t.push(i),r&&r.errors.length>0){let e=M(`details`,`prb-arch-failure-details`,``),n=M(`ul`,``,``);for(let e of r.errors)n.append(M(`li`,``,e));e.append(M(`summary`,``,`What the checks found`),n),t.push(e)}}return t})}};function el(e,t,n){let r=t?[M(`p`,`prb-arch-meta prb-arch-changed`,t)]:[];if(n.running?.includes(e))return[...r,M(`p`,`prb-arch-meta`,`Mapping this part in depth again…`)];let i=n.failures?.[e],a=M(`button`,`prb-diagram-redraw`,`Remap this part`);return a.type=`button`,a.dataset.architectureMap=e,[...r,...i?[M(`p`,`prb-arch-error`,`Remapping this part failed. ${i.message}`)]:[],a]}function tl(e,t,n,r,i=[]){let a=new Map(t.nodes.map(e=>[e.id,e])),o=[...i.length>0?i:[{label:t.title,go:()=>r(null)}],...(n===null?[]:[...xc(n,a).reverse(),n]).map(e=>({label:a.get(e)?.name??e,go:()=>r(e)}))];e.replaceChildren(...o.flatMap((e,t)=>{let n=t===o.length-1,r=M(n?`span`:`button`,`prb-arch-crumb`,e.label);return n?r.setAttribute(`aria-current`,`location`):(r.type=`button`,r.addEventListener(`click`,e.go)),t===0?[r]:[M(`span`,`prb-arch-crumb-sep`,`›`),r]}))}function nl(e,t){let n=document.createElement(`p`);n.className=`prb-arch-status`,n.textContent=t,e.replaceChildren(n)}function rl(e,t,n,r,i){let{architecture:a}=t,o=new Map(a.nodes.map(e=>[e.id,e])),s=e=>o.get(e)?.name??e;if(n.kind===`none`){let t=M(`p`,`prb-arch-hint`,`Select a part or an arrow to see what it is and the code it rests on.`);e.replaceChildren(t);return}if(n.kind===`node`){let c=o.get(n.id);if(!c)return;let l=[M(`p`,`prb-arch-kind`,`${Wc[c.kind]??c.kind}${c.parent?` in ${s(c.parent)}`:``}`),M(`h4`,`prb-arch-title`,c.name)];c.description&&l.push(M(`p`,`prb-arch-text`,c.description));let u=a.nodes.filter(e=>e.parent===c.id).length;if(u>0&&r){let e=M(`button`,`prb-arch-open`,`Show the ${u} parts inside ${c.name}`);e.type=`button`,e.addEventListener(`click`,()=>r(c.id)),l.push(e)}i&&l.push(...i(c)),l.push(il(c.evidence,t.evidence[c.id]));let d=a.relationships.filter(e=>e.source===c.id||e.target===c.id);if(d.length>0){l.push(M(`h5`,`prb-arch-subhead`,`Relationships`));let e=M(`ul`,`prb-arch-related`,``);for(let t of d)e.append(M(`li`,``,`${s(t.source)} ${t.label} ${s(t.target)}`));l.push(e)}e.replaceChildren(...l);return}let c=[],l=n.ids.flatMap(e=>a.relationships.find(t=>t.id===e)??[]);l.length>1&&c.push(M(`p`,`prb-arch-kind`,`${l.length} relationships behind this arrow`));for(let e of l){let n=M(`section`,`prb-arch-relationship`,``);n.append(M(`p`,`prb-arch-kind`,`Relationship`),M(`h4`,`prb-arch-title`,`${s(e.source)} ${e.label} ${s(e.target)}`)),e.description&&n.append(M(`p`,`prb-arch-text`,e.description)),e.confidence!==void 0&&n.append(M(`p`,`prb-arch-meta`,`Inferred, with ${Math.round(e.confidence*100)}% confidence`)),n.append(il(e.evidence,t.evidence[e.id])),c.push(n)}e.replaceChildren(...c)}function il(e,t=[]){let n=M(`div`,`prb-arch-evidence`,``);n.append(M(`h5`,`prb-arch-subhead`,`Evidence`));let r=M(`ul`,`prb-arch-evidence-list`,``);return e.forEach((e,n)=>{let i=M(`li`,``,``),a=t[n];if(a&&a.state!==`missing`){let t=M(`button`,`prb-arch-location`,`${e.path}:${a.line}${a.endLine===a.line?``:`–${a.endLine}`}`);t.type=`button`,t.dataset.openEditor=e.path,t.dataset.openLine=String(a.line),i.append(t),a.via===`symbol`&&i.append(M(`span`,`prb-arch-gone`,`The quoted code has changed; this opens ${e.symbol}`))}else i.append(M(`span`,`prb-arch-location`,e.path),M(`span`,`prb-arch-gone`,`No longer found in this checkout`));i.append(M(`code`,`prb-arch-quote`,e.quote)),e.note&&i.append(M(`span`,`prb-arch-note`,e.note)),r.append(i)}),n.append(r),n}function M(e,t,n){let r=document.createElement(e);return t&&(r.className=t),n&&(r.textContent=n),r}function al(e,t){let n=t,r=null,i=!1,a=async()=>{let t=null;do{i=!1;let r=e.current(),a=await e.send(r);a===null&&(n=r),t=a}while(i);if(t===null)return;let r=await e.read();if(r!==null&&(n=r),i)return a();e.paint(n),e.fail(t)};return{changed:()=>{if(r){i=!0;return}r=a().finally(()=>{r=null})},idle:async()=>{for(;r;)await r}}}var ol=5e3;function sl(e,t=document,n=window){let r=()=>t.visibilityState===`visible`,i=async()=>{try{let n=await(await e.markSeen()).json();p(t,n.unread),c(t,n.running)}catch{}},a=async()=>{try{if(r()){let n=await(await e.askUnread()).json();c(t,n.running),typeof n.here==`number`&&n.here>0&&r()?await i():p(t,n.unread)}}catch{}n.setTimeout(()=>void a(),ol)};t.addEventListener(`visibilitychange`,()=>{r()&&i()}),r()&&i(),n.setTimeout(()=>void a(),ol)}var cl=8;function ll(e){for(let t=e.parentElement;t;t=t.parentElement){let e=getComputedStyle(t).overflowY;if(e===`auto`||e===`scroll`)return t}return null}function ul(e){let t=e.panel-e.scroller;return Math.max(340,Math.floor(e.pane-t-16))}function dl(e){let t=e.getBoundingClientRect().top;for(let n of e.querySelectorAll(`tr`)){let e=n.getBoundingClientRect();if(e.bottom>t)return{row:n,offset:e.top-t}}return null}function fl(e,t){let n=t.row.getBoundingClientRect().top-e.getBoundingClientRect().top-t.offset;e.scrollTop+=n}function pl(e){if(!e.hasAttribute(`data-expanded`))return;let t=ll(e),n=e.querySelector(`.prb-code-scroll`);if(!t||!n)return;let r=ul({pane:t.clientHeight,panel:e.offsetHeight,scroller:n.offsetHeight});e.style.setProperty(`--prb-code-expanded`,`${r}px`)}function ml(e){let t=e.querySelector(`[data-code-expand]`),n=e.querySelector(`.prb-code-scroll`);if(!t||!n)return;let r=e.hasAttribute(`data-expanded`);t.hidden=!r&&n.scrollHeight<=n.clientHeight,t.textContent=r?`Collapse`:`Expand`,t.setAttribute(`aria-expanded`,String(r))}var hl=!1;function gl(){hl||(hl=!0,window.addEventListener(`resize`,()=>{for(let e of document.querySelectorAll(`.prb-code[data-expanded]`))pl(e)}))}function _l(e,t){let n=e.querySelector(`.prb-code-scroll`),r=n?dl(n):null;t?(e.setAttribute(`data-expanded`,``),pl(e),gl()):(e.removeAttribute(`data-expanded`),e.style.removeProperty(`--prb-code-expanded`)),ml(e),n&&r&&fl(n,r);let i=t?ll(e):null;i&&(i.scrollTop+=e.getBoundingClientRect().top-i.getBoundingClientRect().top-cl)}var vl={title:`Start with understanding`,body:[`Welcome to PR Review Buddy.`,`Code review isn't just about finding bugs. It's about understanding what changed, why it changed, and whether it makes sense.`,`Let's walk through your first review.`]},yl=[{id:`story`,title:`The story behind the change`,body:[`Start here to understand why this change may have been made, what's changing, and the evidence behind the analysis.`,`It's your starting point, not the final verdict.`],target:{from:`.prb-view[data-view="overview"]`,to:`[data-tour="whats-changing"]`},reveal:`overview`},{id:`focus`,title:`Know where to focus`,body:[`Get a quick picture of the review's risk, issues, questions and affected files.`,`Use these signals to decide where to spend your attention, not as a substitute for reading the code.`],target:{from:`[data-tour="risk"]`,to:`[data-tour="stats"]`},reveal:`overview`},{id:`path`,title:`A path through the change`,body:[`Not sure where to begin? Follow the suggested review path.`,`It breaks the change into themes so you can explore the important parts in a more useful order.`],target:{from:`[data-tour="suggested-path"]`},reveal:`overview`},{id:`diagrams`,title:`See how the pieces fit`,body:[`Diagrams help you visualise the architecture and relationships involved in a change.`,`Use them to build context before diving into individual files.`],target:{from:`.prb-rail [data-view-nav="map"]`},reveal:`rail`},{id:`issues`,title:`Investigate, don't just accept`,body:[`Potential issues are starting points for investigation.`,`Examine the evidence, challenge the reasoning and decide whether each finding genuinely matters.`],target:{from:`.prb-rail [data-view-nav="issues"]`},reveal:`rail`},{id:`questions`,title:`Look beyond obvious problems`,body:[`Some changes need clarification rather than a fix.`,`Questions help you identify assumptions, missing context and decisions worth discussing with the author.`],target:{from:`.prb-rail [data-view-nav="questions"]`},reveal:`rail`},{id:`files`,title:`Get back to the code`,body:[`Explore the changed files and inspect the implementation yourself.`,`AI analysis helps direct your attention, but the code remains the source of truth.`],target:{from:`.prb-rail [data-view-nav="files"]`},reveal:`rail`},{id:`ask`,title:`Keep asking why`,body:[`Need a deeper explanation? Ask Buddy AI about the change, a finding or something you don't understand.`,`You can challenge its conclusions or ask it to explain things more simply.`],target:{from:`#prb-ask`},reveal:`ask`},{id:`judgement`,title:`Your judgement matters`,body:[`When you've investigated the change, use the review status to track your progress.`,`PR Review Buddy supports your judgement. It doesn't make the approval decision for you.`],target:{from:`[data-page-status]`},reveal:`none`}],bl=`#tour`,N=16,P=6,xl=380,Sl=260;function Cl(e){return e.querySelector(`.prb-rail[data-stale]`)?[]:yl.filter(t=>e.querySelector(t.target.from)&&(!t.target.to||e.querySelector(t.target.to)))}function wl(e,t,n,r,i){let a=(e,t,n)=>Math.max(t,Math.min(e,Math.max(t,n))),o={top:a((i-n)/2,N,i-n-N),left:a((r-t)/2,N,r-t-N)};if(!e)return o;let s=a(e.top,N,i-n-N);if(e.right+N+t<=r-N)return{top:s,left:e.right+N};if(e.left-N-t>=N)return{top:s,left:e.left-N-t};let c=a(e.left,N,r-t-N);return e.bottom+N+n<=i-N?{top:e.bottom+N,left:c}:e.top-N-n>=N?{top:e.top-N-n,left:c}:{top:a(i-n-N,N,i-n-N),left:o.left}}function Tl(e,t){let n=e.getBoundingClientRect(),r=(t??e).getBoundingClientRect();return{top:n.top,bottom:Math.max(n.top,r.bottom),left:Math.min(n.left,r.left),right:Math.max(n.right,r.right)}}function El(e,t){let n=t.map(t=>[t,e.getAttribute(t)]);return()=>{for(let[t,r]of n)r===null?e.removeAttribute(t):e.setAttribute(t,r)}}function Dl(e,t){let n=[];if(t===`rail`){let t=e.documentElement;n.push(El(t,[`data-sidebar-hidden`,`data-sidebar-peek`])),t.removeAttribute(`data-sidebar-hidden`),t.hasAttribute(`data-sidebar-compact`)&&t.setAttribute(`data-sidebar-peek`,``)}if(t===`ask`){let t=e.querySelector(`.prb-body`);t&&t.getAttribute(`data-ask`)!==`open`&&(n.push(El(t,[`data-ask`])),t.setAttribute(`data-ask`,`open`))}return()=>{for(let e of n.reverse())e()}}function Ol(e,t,n){let r=e.createElement(`button`);return r.type=`button`,r.className=t,r.textContent=n,r}function kl(e,t,n){let r=Cl(e);if(r.length===0||e.querySelector(`dialog.prb-tour`))return null;let i=e.activeElement,a=[e.querySelector(`.prb-doc`),e.querySelector(`.prb-rail`)].map(e=>[e,e?.scrollTop??0]),o=n.host.enterTour(),s=e.createElement(`dialog`);s.className=`prb-tour`,s.setAttribute(`aria-labelledby`,`prb-tour-title`),s.setAttribute(`aria-describedby`,`prb-tour-text`);let c=e.createElement(`div`);c.className=`prb-tour-spot`,c.setAttribute(`aria-hidden`,`true`);let l=e.createElement(`div`);l.className=`prb-tour-card`;let u=e.createElement(`div`);u.className=`prb-tour-words`,u.setAttribute(`aria-live`,`polite`);let d=e.createElement(`p`);d.className=`prb-tour-count`;let f=e.createElement(`h2`);f.className=`prb-tour-title`,f.id=`prb-tour-title`;let p=e.createElement(`div`);p.className=`prb-tour-text`,p.id=`prb-tour-text`,u.append(d,f,p);let m=Ol(e,`prb-tour-skip`,`Skip tour`),h=Ol(e,`prb-tour-back`,`Back`),g=Ol(e,`prb-tour-next`,`Next`),_=e.createElement(`div`);_.className=`prb-tour-actions`,_.append(m,h,g),l.append(u,_),s.append(c,l),e.body.append(s);let v=-1,y=()=>{},ee=!1,b=()=>{let n=r[v],i=n?e.querySelector(n.target.from):null,a=i?Tl(i,n?.target.to?e.querySelector(n.target.to):null):null,o=a&&a.bottom>a.top&&a.right>a.left?a:null,u=t.innerWidth,d=t.innerHeight;if(s.toggleAttribute(`data-spotless`,!o),o){let e=Math.max(o.top-P,0),t=Math.max(o.left-P,0);c.hidden=!1,c.style.top=`${e}px`,c.style.left=`${t}px`,c.style.width=`${Math.min(o.right+P,u)-t}px`,c.style.height=`${Math.min(o.bottom+P,d)-e}px`}else c.hidden=!0;let f=o?Math.max(o.left-P-32,u-o.right-P-32):0;l.style.width=`${f>=Sl?Math.min(xl,f):Math.min(xl,u-32)}px`;let p=l.getBoundingClientRect(),m=wl(o&&{top:o.top-P,left:o.left-P,bottom:o.bottom+P,right:o.right+P},p.width,p.height,u,d);l.style.top=`${m.top}px`,l.style.left=`${m.left}px`},x=(t,n)=>{y(),y=()=>{},v=t;let i=r[v];if(s.toggleAttribute(`data-welcome`,!i),i){y=Dl(e,i.reveal);let t=e.querySelector(i.target.from);(i.target.to?e.querySelector(i.target.to):null)?.scrollIntoView({block:`nearest`}),t?.scrollIntoView({block:`nearest`})}d.textContent=i?`Step ${v+1} of ${r.length}`:`Welcome`,f.textContent=i?i.title:vl.title,p.replaceChildren(...(i?i.body:vl.body).map(t=>{let n=e.createElement(`p`);return n.textContent=t,n})),h.hidden=!i,g.textContent=i?v===r.length-1?`Finish`:`Next`:`Start tour`,b(),g.focus({focusVisible:n})},S=r=>{if(!ee){ee=!0,y(),t.removeEventListener(`resize`,b),e.removeEventListener(`scroll`,b,!0),e.removeEventListener(`transitionend`,b,!0),s.open&&s.close(),s.remove(),o();for(let[e,t]of a)e&&(e.scrollTop=t);n.mode===`first`&&n.host.save(r),i?.isConnected&&i.focus({focusVisible:!1})}};return g.addEventListener(`click`,e=>v===r.length-1?S(`completed`):x(v+1,e.detail===0)),h.addEventListener(`click`,e=>x(v-1,e.detail===0)),m.addEventListener(`click`,()=>S(`dismissed`)),s.addEventListener(`cancel`,()=>S(`dismissed`)),s.addEventListener(`close`,()=>S(`dismissed`)),s.addEventListener(`keydown`,t=>{if(t.key!==`Tab`)return;let n=[m,h,g].filter(e=>!e.hidden),r=n.indexOf(e.activeElement);t.preventDefault(),n[(r+(t.shiftKey?n.length-1:1))%n.length]?.focus()}),t.addEventListener(`resize`,b),e.addEventListener(`scroll`,b,!0),e.addEventListener(`transitionend`,b,!0),s.showModal(),x(-1,!1),{close:()=>S(`dismissed`)}}var Al={busy:`This review is being analysed or updated right now, so what the tour would point at is about to change. Replay it once that finishes, or from Help, which opens a review the tour can start on.`,empty:`This review has no completed analysis for the tour to walk through. Replay it from Help, which opens a review the tour can start on.`};function jl(e,t){let n=e.activeElement,r=e.createElement(`dialog`);r.className=`prb-dialog`,r.setAttribute(`data-tour-unavailable`,t),r.setAttribute(`aria-labelledby`,`prb-tour-unavailable-title`);let i=e.createElement(`h2`);i.id=`prb-tour-unavailable-title`,i.textContent=`The guided tour can't start here`;let a=e.createElement(`p`);a.textContent=Al[t];let o=e.createElement(`div`);o.className=`prb-dialog-actions`;let s=Ol(e,`prb-dialog-primary`,`OK`);return s.addEventListener(`click`,()=>r.close()),o.append(s),r.append(i,a,o),r.addEventListener(`close`,()=>{r.remove(),n?.isConnected&&n.focus({focusVisible:!1})}),e.body.append(r),r.showModal(),s.focus(),r}function Ml(e,t,n){let r=e.body.hasAttribute(`data-tour-busy`)||e.querySelector(`.prb-rail[data-stale]`)!==null?`busy`:kl(e,t,{mode:`replay`,host:n})?null:`empty`;return r?(jl(e,r),r):`started`}var Nl={rb:`ruby`,js:`javascript`,mjs:`javascript`,cjs:`javascript`,ts:`typescript`,mts:`typescript`,cts:`typescript`,jsx:`jsx`,tsx:`tsx`,json:`json`,yml:`yaml`,yaml:`yaml`,md:`markdown`,html:`html`,css:`css`,scss:`scss`,sql:`sql`,py:`python`,java:`java`,kt:`kotlin`,kts:`kotlin`,go:`go`,rs:`rust`,sh:`shellscript`,bash:`shellscript`,zsh:`shellscript`,tf:`terraform`,tfvars:`terraform`};function Pl(e){let t=e.slice(e.lastIndexOf(`/`)+1);if(t===`Dockerfile`||t.startsWith(`Dockerfile.`))return`docker`;let n=t.lastIndexOf(`.`);return n<=0?null:Nl[t.slice(n+1).toLowerCase()]??null}function Fl(e){let t=new Set;for(let n of e){let e=Pl(n);e&&t.add(e)}return[...t]}var Il={ruby:()=>C(()=>import(`./chunk-CAnKkQXq.js`),__vite__mapDeps([20,21,22,23,24,25,26,27,28,29,30])),javascript:()=>C(()=>import(`./chunk-D2pwppYQ.js`),__vite__mapDeps([31,22])),typescript:()=>C(()=>import(`./chunk-Cjc271yU.js`),__vite__mapDeps([32,27])),jsx:()=>C(()=>import(`./chunk-B2PgDgse.js`),__vite__mapDeps([33,25])),tsx:()=>C(()=>import(`./chunk-D95j_xjm.js`),__vite__mapDeps([34,28])),json:()=>C(()=>import(`./chunk-qhed-kSA.js`),[]),yaml:()=>C(()=>import(`./chunk-Cv3JjNkX.js`),__vite__mapDeps([35,30])),markdown:()=>C(()=>import(`./chunk-BYOwaDjH.js`),[]),html:()=>C(()=>import(`./chunk-EIJEcyW-.js`),__vite__mapDeps([36,23,21,22])),css:()=>C(()=>import(`./chunk-C3nvJp0N.js`),__vite__mapDeps([37,21])),scss:()=>C(()=>import(`./chunk-D2NZorQR.js`),__vite__mapDeps([38,21])),sql:()=>C(()=>import(`./chunk-NzFayA7r.js`),__vite__mapDeps([39,26])),python:()=>C(()=>import(`./chunk-gzcpVVnB.js`),[]),java:()=>C(()=>import(`./chunk-AdYjtsZU.js`),__vite__mapDeps([40,24])),kotlin:()=>C(()=>import(`./chunk-DhhofPvG.js`),[]),go:()=>C(()=>import(`./chunk-rLFTqkRN.js`),[]),rust:()=>C(()=>import(`./chunk-Cfkwpbl8.js`),[]),shellscript:()=>C(()=>import(`./chunk-pNSm1SyV.js`),__vite__mapDeps([41,29])),docker:()=>C(()=>import(`./chunk-IyjqRm3v.js`),[]),terraform:()=>C(()=>import(`./chunk-DswuEJGm.js`),[])},Ll=`github-light-default`,Rl=null,zl=new Map;function Bl(){return Rl??=Promise.all([C(()=>import(`./chunk-c-cg1wCO.js`),__vite__mapDeps([42,4])),C(()=>import(`./chunk-CBrdyqSx.js`),__vite__mapDeps([43,4])),C(()=>import(`./chunk-BXViO-2h.js`),[])]).then(([{createHighlighterCore:e},{createOnigurumaEngine:t},n])=>e({themes:[n.default],langs:[],engine:t(C(()=>import(`./chunk-BnjxR4X6.js`),[]))})).catch(()=>null),Rl}function Vl(e){let t=zl.get(e);return t||(t=Bl().then(async t=>t?(await t.loadLanguage(Il[e]),!0):!1).catch(()=>!1),zl.set(e,t)),t.then(e=>e?Bl():null)}var Hl={async preload(e){await Vl(e)},async tokenize(e,t){let n=await Vl(t);if(!n)return null;try{let{tokens:r,fg:i}=n.codeToTokens(e,{lang:t,theme:Ll}),a=i?.toLowerCase();return r.map(e=>e.map(e=>({content:e.content,...e.color&&e.color.toLowerCase()!==a?{color:e.color}:{}})))}catch{return null}}};function Ul(e,t=Hl){return Promise.all(e.map(e=>t.preload(e))).then(()=>void 0)}var Wl=/^#[0-9a-f]{3,8}$/i;function Gl(e,t){return!t||t.map(e=>e.content).join(``)!==e?null:t.map(e=>e.color&&Wl.test(e.color)?`<span style="color:${e.color}">${me(e.content)}</span>`:me(e.content)).join(``)}function Kl(e){return e.length>1e3?e.slice(0,De):e}function ql(e,t,n){if(!e||t===``)return;let r=Gl(Kl(t),n);if(r===null)return;if(t.length<=1e3){if(e.childElementCount!==0||e.textContent!==t)return;e.innerHTML=r;return}let i=e.querySelector(`[data-full-line]`);i&&(e.innerHTML=`${r}… `,e.append(i))}async function Jl(e,t,n=Hl){let r=Pl(t.path);if(!r){delete e.dataset.syntax;return}e.dataset.syntax=r;let i=e.querySelector(`tbody`);if(!i)return;let a=()=>i.isConnected&&e.querySelector(`tbody`)===i,o=await n.tokenize(t.lines.map(Kl).join(`
|
|
183
|
+
`),r);if(a()){o&&t.lines.forEach((e,n)=>{ql(i.querySelector(`tr[data-line="${t.from+n}"] .prb-code-line`),e,o[n])});for(let e of t.deletions??[]){if(!i.querySelector(`tr[data-before-line="${e.beforeLine}"]`))continue;let t=await n.tokenize(e.lines.map(e=>Kl(e.text)).join(`
|
|
184
|
+
`),r);if(!a())return;if(!t)continue;let o=i.querySelector(`tr[data-before-line="${e.beforeLine}"]`)?.nextElementSibling;for(let[n,r]of e.lines.entries()){if(!o?.classList.contains(`prb-code-deleted`))break;ql(o.querySelector(`.prb-code-line`),r.text,t[n]),o=o.nextElementSibling}}}}async function Yl(e,t=Hl){let n=e.closest(`.prb-code`)?.dataset.syntax,r=e.textContent??``;if(!n||!(n in Il)||r===``)return;let i=await t.tokenize(r,n);if(!e.isConnected||e.childElementCount!==0||e.textContent!==r)return;let a=Gl(r,i?.[0]);a!==null&&i?.length===1&&(e.innerHTML=a)}var F=h({ownsRestore:!0}),I=document.body,Xl=I.dataset.apiBase??``,Zl=I.dataset.token??``,Ql=I.dataset.editorLabel??``,$l=I.dataset.editorTemplate??``,eu=I.dataset.repoPath??``,tu=I.dataset.explainPrompt??``,nu=I.dataset.sessionId??``;function L(e){return`${Xl}${e}?t=${encodeURIComponent(Zl)}`}var ru=!1,iu=0,au=!1;function ou(e){iu++;try{e()}finally{iu--}}var su=ni(document.querySelector(`.prb-body`)?.dataset.reviewLayout),cu=ri(su,e=>{fetch(L(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({reviewLayout:e})}).catch(()=>{})},()=>ru&&iu===0);function lu(e){fetch(L(`/event`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),keepalive:!0}).catch(()=>{})}var uu=Qo({endpoint:L,showDiagrams:()=>Tu(`diagram`),showMap:()=>Tu(`map`),showChangeMap:e=>du.show(e)}),du=$s({endpoint:L,showView:e=>Tu(e)}),fu=Kc({endpoint:L}),pu=null,mu=`the whole change`;function hu(e){let t=ae(e,vu),n=F.push(ce(t),t);gu++,yu(t),n&&_u(t)}var gu=0;function _u(e){let t=(e.kind===`section`?document.querySelector(`.prb-rail [data-goto-section="${CSS.escape(e.sectionId)}"] .prb-rail-title`):document.querySelector(`.prb-rail [data-view-nav="${CSS.escape(e.view)}"] .prb-rail-title`))?.textContent?.trim();t&&v(document,t)}var R=null,vu=document.querySelector(`[data-guide-start]`)?.dataset.guideStart??null;function yu(e){let t=ae(e,vu);if(t!==e){let{kind:e,view:n,focus:r,...i}=s(history.state);F.replace(ce(t),{...i,...t})}let n=!R||!xe(R,t);R=t,n&&(t.kind===`view`?Du(t.view):ju(t.sectionId)),Cu(t.focus??null)}var bu={history:{get state(){return history.state},pushState:(e,t,n)=>{gu++,F.push(n,s(e))},replaceState:(e,t,n)=>F.replace(n,s(e)),back:()=>{au=!0,history.back()}},apply:yu},z=Me(document,{onOpen:e=>e.hasAttribute(`data-ask-buddy-menu`)?ff(e):pf(e),onClose:pf}),xu={post:async e=>{let t=await fetch(L(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({reassessment:e})});return{status:t.status,body:await t.json().catch(()=>null)}},closeMenu:e=>z.close(e),onVerdictClosed:(e,t)=>{let n=e.querySelector(`[data-question-answered], [data-issue-dismissed]`);if(n){if(n.dataset.questionAnswered!==void 0)dd(e,t||n.dataset.answered===`true`,`questions`),_d();else{let r=n.dataset.dismissed===`true`&&n.dataset.stale!==`true`;dd(e,t||r||n.dataset.settled===`true`,`issues`),yd()}}}};Or(document,xu);var Su=document.querySelector(`[data-view="issues"]`);Su&&Gr(Su,(e,t)=>cu.issueFold(e,t));function Cu(e){ue(document.querySelector(`.prb-body`),document,e),cu.focus(e),z.closeAll(),e===`buddy`&&Ad()}function wu(e){R&&(R.focus===e?re(R,bu):pe(R,e,bu))}function Tu(e,t={}){let n=t.keepFocus&&R?.focus?e:be(e,R?.focus);hu({kind:`view`,view:e,...n?{focus:n}:{}})}function Eu(e){hu({kind:`section`,sectionId:e,...R?.focus===`guide`?{focus:`guide`}:{}})}function Du(e){for(let t of document.querySelectorAll(`.prb-view`))t.hidden=t.dataset.view!==e;for(let t of document.querySelectorAll(`[data-view-nav]:not([role="tab"])`))t.setAttribute(`aria-current`,String(t.dataset.viewNav===e||(t.dataset.viewAlso??``).split(` `).includes(e)));e!==`architecture`&&lu({event:`view_opened`,view:e}),e===`diagram`&&uu.drawPane(),e===`map`&&du.layout(),e===`architecture`&&fu.show(),Ou(),document.querySelector(`.prb-doc`)?.scrollTo({top:0})}function Ou(){Pi(),pu=null,mu=`the whole change`,Mu()}function ku(e,t){let n=document.getElementById(e.getAttribute(`aria-controls`)??``);n&&(e.setAttribute(`aria-expanded`,String(t)),e.setAttribute(`aria-label`,`${t?`Collapse`:`Expand`} ${e.dataset.railToggle??`this section`}`),n.hidden=!t,cu.fold(n.id,t))}function Au(){for(let e of document.querySelectorAll(`[data-rail-toggle]`)){let t=document.getElementById(e.getAttribute(`aria-controls`)??``);(t?.contains(document.getElementById(`prb-rail-path`))||t?.id===`prb-rail-path`)&&ku(e,!0)}}function ju(e){Du(`guide`),Au(),Ni(e);let t=ji(e);if(!t)return;let n=document.querySelector(`[data-goto-section="${CSS.escape(e)}"]`);lu({event:`theme_opened`,themeIndex:Number(n?.dataset.themeIndex??-1),attention:n?.querySelector(`.prb-attention`)?.dataset.attention??`medium`,isRecommendedStart:n?.dataset.recommendedStart===`true`}),pu=e,mu=t.querySelector(`.pr-helper-guide-section-title`)?.textContent?.trim()??`this theme`,Mu()}function Mu(){let e=document.querySelector(`[data-ask-scope]`);e&&(e.textContent=mu)}function B(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}function Nu(e){return e.tagName===`LI`?{parent:e,position:`beforeend`}:{parent:e,position:`afterend`}}async function Pu(e){let t=e.tagName===`LI`?e.querySelector(`:scope > .prb-code`):e.nextElementSibling;if(t?.classList.contains(`prb-code`)){t.remove(),e.setAttribute(`aria-expanded`,`false`);return}let n=e.dataset.file;if(!n)return;let r=Number(e.dataset.line)||0,i=e.tagName!==`LI`,a=document.createElement(`div`);a.className=`prb-code`,a.innerHTML=`<p class="prb-code-status">Reading…</p>`;let{parent:o,position:s}=Nu(e);o.insertAdjacentElement(s,a),e.setAttribute(`aria-expanded`,`true`),lu({event:`file_opened`,fromFinding:i,targeted:r>0}),await Iu(a,n,{cited:r,centre:r,expand:0,position:r?2*r:0})}var Fu=Ui();function Iu(e,t,n){return Fu.run(e,n,async()=>{try{let{centre:r,expand:i}=n,a=`&path=${encodeURIComponent(t)}${r?`&line=${r}`:``}${i?`&expand=${i}`:``}`,o=await fetch(`${L(`/file`)}${a}`),s=await o.json();return o.ok?()=>Lu(e,s,n):()=>{e.innerHTML=`<p class="prb-code-status">${B(s?.error??`Could not read that file.`)}</p>`}}catch{return()=>{e.innerHTML=`<p class="prb-code-status">Could not reach PR Review Buddy. The workspace server may have stopped.</p>`}}})}function Lu(e,t,n){let{cited:r,centre:i,expand:a}=n;e.dataset.cited=String(r),e.dataset.centre=String(i),e.dataset.expand=String(a),e.dataset.position=String(n.position);let o=Se(t,r),s=$l&&eu?t.checkout===`absent`?`<button type="button" class="prb-code-open" disabled>Not in your working folder</button>`:`<button type="button" class="prb-code-open" data-open-editor="${B(t.path)}" data-open-line="${r||t.from}">${B(`Open in ${Ql||`editor`}`)}</button>`:``,c=t.pullRequest&&t.pullRequest.precise?`<a class="prb-code-open prb-code-pr" href="${B(t.pullRequest.href)}" target="_blank" rel="noopener noreferrer">${B(t.pullRequest.label)}</a>`:``,l=t.truncated?`<button type="button" class="prb-code-more" data-expand-file="${B(t.path)}" data-expand-line="${i||0}" data-expand-cited="${r||0}" data-expand-step="${Ee(a,i)}">Show more of this file</button>`:``,u=t.checkout===`differs`?` · your editor will show a different version`:t.checkout===`absent`?` · not in your working folder`:``,d=t.changes===`unavailable`?` · change details unavailable`:``,f=`<div class="prb-code-source"><span>${t.source===`commit`?`Viewing reviewed version${t.sourceSha?` <code>${B(t.sourceSha.slice(0,7))}</code>`:``}${u}${d}`:`Viewing your working folder${d}`}</span>${he(t.changeAnchors??[],n.position)}</div>`,p=e.hasAttribute(`data-expanded`),m=`<button type="button" class="prb-code-open" data-code-expand aria-expanded="${p}">${p?`Collapse`:`Expand`}</button>`;e.innerHTML=`<div class="prb-code-header">
|
|
189
185
|
<span class="prb-code-range">lines ${t.from}\u2013${t.to} of ${t.totalLines}</span>
|
|
190
186
|
${c}
|
|
191
187
|
${s}
|
|
@@ -193,7 +189,7 @@ import{K as e,V as t,_t as n,a as r,c as i,ct as a,dt as o,ft as s,gt as c,ht as
|
|
|
193
189
|
</div>
|
|
194
190
|
${f}
|
|
195
191
|
<div class="prb-code-scroll"><table class="prb-code-table"><tbody>${o}</tbody></table></div>
|
|
196
|
-
${l}`,$c(e,t),ml(e),hl(e),(n.focus?al(e,n.focus):e.querySelector(`.prb-code-target`))?.scrollIntoView({block:`center`}),Yl(e,t)}async function Bu(e,t,n){let r=il(t,n);if(!r)return;let i=al(e,r.anchor);if(i)t.outerHTML=rl(ol(t),r.key),i.scrollIntoView({block:`center`});else{let t=e.querySelector(`[data-expand-file]`);if(!t?.dataset.expandFile)return;await Ru(e,t.dataset.expandFile,{cited:Number(t.dataset.expandCited)||0,centre:r.anchor.line,expand:Math.max(1,(Number(t.dataset.expandStep)||1)-1),position:r.key,focus:r.anchor})}let a=e.querySelector(`[data-change-step="${n}"]`),o=e.querySelector(`[data-change-step="${n===`next`?`previous`:`next`}"]`);(a&&!a.disabled?a:o)?.focus({preventScroll:!0})}function Vu(e,t,n){let r=`${nu.replace(/\/$/,``)}/${e}`,i=tu.replace(`{path}`,r).replace(`{line}`,String(Math.max(1,t)));n!==null&&du({event:`editor_opened`,fromFinding:n}),window.location.href=i}var H=document.querySelector(`[data-ask-log]`);H&&H.querySelector(`.prb-msg`)&&H.scrollTo({top:H.scrollHeight});var Hu=document.querySelector(`[data-ask-form]`),U=Hu?.querySelector(`textarea`);function Uu(e,t){let n=document.createElement(`div`);return n.className=e===`user`?`prb-msg prb-msg-user`:`prb-msg prb-msg-${e===`error`?`error`:`assistant`}`,e===`assistant`?(n.classList.add(`prb-md`),n.innerHTML=ot(t)+Pt(t)):n.textContent=t,H?.appendChild(n),H?.scrollTo({top:H.scrollHeight}),n}function Wu(e){if(!e||!H)return;let t=document.createElement(`template`);t.innerHTML=e.trim(),H.appendChild(t.content)}async function Gu(e){let t=(e.dataset.reconcileAcceptAll??``).split(` `).filter(Boolean);e.disabled=!0;let n=0;for(let e of t){let t=document.querySelector(`[data-reassessment-proposal="${CSS.escape(e)}"] [data-reassessment-decide="accepted"]`);t&&await mr(t,Cu)&&(n+=1)}let r=document.createElement(`p`);r.className=`prb-turn-help`,r.setAttribute(`role`,`status`),r.textContent=n===t.length?`Accepted ${n===1?`the suggestion`:`all ${n} suggestions`}.`:`Accepted ${n} of ${t.length}. The others had changed or were answered already; their cards show them as they stand.`,e.replaceWith(r)}document.addEventListener(`click`,e=>{let t=e.target,n=t?.closest(`[data-reconcile-turn]`);if(n){let e=Number(n.dataset.reconcileTurn);Number.isFinite(e)&&Yu(`Reconcile with findings`,`reconcile`,{reconciles:{exchanges:[e]}});return}let r=t?.closest(`[data-reconcile-accept-all]`);r&&!r.disabled&&Gu(r)});function Ku(){let e=document.createElement(`div`);return e.className=`prb-thinking`,e.innerHTML=`<i></i><i></i><i></i><span>Reading the change…</span>`,H?.appendChild(e),H?.scrollTo({top:H.scrollHeight}),e}var W=null,qu=!!H?.querySelector(`[data-ask-pending]`);function Ju(){let e=document.createElement(`div`);e.className=`prb-stopped`,e.textContent=`Stopped.`,H?.appendChild(e),H?.scrollTo({top:H.scrollHeight})}async function Yu(e,t=`free_text`,n={}){let r=e.trim();if(!r||W||qu)return;document.querySelector(`.prb-ask-empty`)?.remove(),Uu(`user`,r);let i=Ku();W=new AbortController,Zu(!0);try{let e=await fetch(R(`/ask`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({question:r,sectionId:hu,source:t,...n}),signal:W.signal}),a=await e.json().catch(()=>null);if(e.status===409&&(a?.running||a?.updating)){Xu(r,n.continuesExplanation),window.location.reload();return}if(i.remove(),a?.stopped){Ju();return}if(!e.ok||!a?.answer){Uu(`error`,a?.error??`Buddy AI did not answer. Check the terminal running PR Review Buddy.`);return}Uu(`assistant`,a.answer),typeof a.askedAt==`number`&&Wu(vr({askedAt:a.askedAt,reconciles:a.reconcileTurn},a.reconciliation?.proposals??[])),a.explanation&&rr(document,a.explanation),a.reassessment?.card&&sr(document,a.reassessment.card);for(let e of a.reconciliation?.cards??[])sr(document,e,Cu.onVerdictClosed)}catch(e){i.remove(),e instanceof DOMException&&e.name===`AbortError`?(Ju(),Xu(r,n.continuesExplanation)):(Uu(`error`,`Could not reach PR Review Buddy. The workspace server may have stopped.`),Xu(r,n.continuesExplanation))}finally{W=null,Zu(!1)}}function Xu(e,t){!U||U.value||(U.value=e,Up?.save(),t&&(G=G?.continues&&e.includes(G.text)?G:{text:e,source:`finding`,continues:t},Up?.stage(G)))}function Zu(e){let t=Hu?.querySelector(`button`);t&&(t.textContent=e?`Stop`:`Ask`,t.toggleAttribute(`data-stop`,e),t.disabled=!1);for(let t of document.querySelectorAll(Qu))t.disabled=e;e&&B.closeAll(),e||U?.focus()}var Qu=`[data-suggestion], .pr-helper-explain-simply-button, [data-reconcile-turn]`;function $u(){let e=Hu?.querySelector(`button`);e&&(e.textContent=`Stopping…`,e.disabled=!0),fetch(R(`/stop`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({kind:`ask`})}).catch(()=>{}).finally(()=>{W?.abort()})}Hu?.addEventListener(`submit`,e=>{if(e.preventDefault(),W||qu)return $u();let t=U?.value??``;U&&(U.value=``),Up?.clear();let n=ar(G,t);Yu(t,ed(t),n?{continuesExplanation:n}:{})}),qu&&Zu(!0);var G=null;function ed(e){return G&&e.includes(G.text)?G.source:`free_text`}U?.addEventListener(`keydown`,e=>{if(e.key===`Enter`&&!e.shiftKey){if(e.preventDefault(),W||qu)return;Hu?.requestSubmit()}}),U?.addEventListener(`input`,()=>{U&&(U.style.height=`auto`,U.style.height=`${Math.min(U.scrollHeight,140)}px`)});async function td(e){try{let t=await fetch(R(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e)});if(t.ok)return null;let n=await t.json().catch(()=>null);return typeof n?.error==`string`?n.error:`That could not be saved. The workspace server refused it.`}catch{return`The workspace server did not answer. It may have stopped.`}}function nd(e){return td({answeredQuestionIds:e})}async function rd(){try{let e=await fetch(R(`/state`)),t=await e.json().catch(()=>null);return!e.ok||!Array.isArray(t?.answeredQuestionIds)||!Array.isArray(t?.dismissedIssues)?null:{answered:t.answeredQuestionIds.filter(e=>typeof e==`string`),dismissed:t.dismissedIssues.filter(e=>typeof e?.id==`string`&&typeof e?.sessionId==`string`)}}catch{return null}}function id(e){let t=new Set(e);for(let e of document.querySelectorAll(`[data-question-answered]`)){let n=t.has(e.dataset.questionAnswered??``);e.dataset.answered===`true`!==n&&(od(e,n),Xr(e))}}function ad(){return[...document.querySelectorAll(`[data-question-answered][data-answered="true"]`)].map(e=>e.dataset.questionAnswered??``).filter(Boolean)}function od(e,t){e.dataset.answered=String(t),e.textContent=t?`Mark as unanswered`:`Mark answered`;let n=e.closest(`[data-finding-card]`);n?.classList.toggle(`pr-helper-question-card-answered`,t),n&&pd(n,t||e.dataset.verdictClosed===`true`,`questions`),yd()}function sd(){return[...document.querySelectorAll(`[data-issue-dismissed][data-dismissed="true"]`)].map(e=>({id:e.dataset.issueDismissed??``,sessionId:e.dataset.dismissedIn||iu})).filter(e=>e.id)}function cd(e){return td({dismissedIssues:e})}function ld(e){let t=e.closest(`[data-finding-card]`),{dismissed:n,stale:r,dismissedIn:i}=e.dataset,a=e.textContent,o=t?.classList.contains(`pr-helper-issue-card-dismissed`)??!1,s=e=>e?{element:e,parent:e.parentElement,before:e.nextSibling}:null,c=s(t?.querySelector(`.pr-helper-dismissal-stale`)),l=s(t?.querySelector(`.pr-helper-finding-status-dismissed`));return()=>{if(e.dataset.dismissed=n??`false`,r===void 0?delete e.dataset.stale:e.dataset.stale=r,i===void 0?delete e.dataset.dismissedIn:e.dataset.dismissedIn=i,e.textContent=a,!t)return;t.classList.toggle(`pr-helper-issue-card-dismissed`,o),t.querySelector(`.pr-helper-finding-status-dismissed`)?.remove();for(let e of[l,c])e?.parent&&e.parent.insertBefore(e.element,e.before?.parentNode===e.parent?e.before:null);let s=n===`true`&&r!==`true`||e.dataset.settled===`true`||e.dataset.verdictClosed===`true`;pd(t,s,`issues`),xd()}}function ud(e,t){e.dataset.dismissed=String(t),e.textContent=t?`Reopen`:`Dismiss`,delete e.dataset.stale,t?e.dataset.dismissedIn=iu:delete e.dataset.dismissedIn;let n=e.closest(`[data-finding-card]`);n&&(n.classList.toggle(`pr-helper-issue-card-dismissed`,t),n.querySelector(`.pr-helper-dismissal-stale`)?.remove(),n.querySelector(`.pr-helper-finding-status-dismissed`)?.remove(),t&&n.querySelector(`.pr-helper-issue-badges`)?.prepend(dd()),pd(n,t||e.dataset.settled===`true`||e.dataset.verdictClosed===`true`,`issues`),xd())}function dd(){let e=document.createElement(`span`);return e.className=`pr-helper-finding-status pr-helper-finding-status-dismissed pr-helper-tip`,e.dataset.tip=Un,e.textContent=`Dismissed by you`,e}var fd=new WeakMap;function pd(e,t,n){let r=e.closest(`.pr-helper-closed-findings-list`);if(t!==!!r){if(t){let t=e.parentElement;t&&fd.set(e,{parent:t,before:e.nextElementSibling}),_d(n).append(e),t&&gd(t)}else md(e,n),(r?.children.length===0?r.closest(`.pr-helper-closed-findings`):null)?.remove();vd(n)}}function md(e,t){let n=fd.get(e);if(n?.parent.isConnected){let t=n.before;for(;t&&t.parentNode!==n.parent;)t=fd.get(t)?.before??null;n.parent.insertBefore(e,t)}else{let n=hd(e)??Pr(document,e)??document.querySelector(`[data-view="${t}"]`);n?.insertBefore(e,n.querySelector(`.pr-helper-closed-findings`))}e.closest(`.pr-helper-question-group`)?.removeAttribute(`hidden`)}function hd(e){let t=e.dataset.sectionId;return t?document.querySelector(`[data-question-group="${CSS.escape(t)}"]`):null}function gd(e){let t=e.closest(`.pr-helper-question-group`);t&&!t.querySelector(`[data-finding-card]`)&&(t.hidden=!0)}function _d(e){let t=document.querySelector(`[data-view="${e}"]`),n=t?.querySelector(`[data-closed-findings="${e}"] .pr-helper-closed-findings-list`);if(n)return n;let r=document.createElement(`details`);r.className=`pr-helper-closed-findings`,r.dataset.closedFindings=e;let i=document.createElement(`summary`);i.className=`pr-helper-closed-findings-summary`,i.setAttribute(`data-closed-findings-summary`,``);let a=document.createElement(`div`);return a.className=`pr-helper-closed-findings-list`,r.append(i,a),t?.append(r),a}function vd(e){let t=document.querySelector(`[data-closed-findings="${e}"]`),n=t?.querySelector(`[data-closed-findings-summary]`);if(!t||!n)return;let r=document.querySelectorAll(`[data-view="${e}"] [data-finding-card]`).length,i=t.querySelectorAll(`[data-finding-card]`).length;t.toggleAttribute(`data-nothing-open`,r===i),n.textContent=e===`questions`?`Answered (${i})`:mi(bd()),cr(document)}function yd(){let e=[...document.querySelectorAll(`[data-question-answered]`)];if(e.length===0)return;let t=e.filter(e=>e.dataset.answered!==`true`&&e.dataset.settled!==`true`&&e.dataset.verdictClosed!==`true`).length,n=document.querySelector(`.pr-helper-questions-progress`);n&&(n.innerHTML=hi(e.length,t)),Sd(`questions`,e.length,t,`question`,`answered`)}function bd(){let e=[...document.querySelectorAll(`[data-issue-dismissed]`)],t=0,n=0,r=0,i=0;for(let a of e){let e=a.dataset.settled===`true`,o=a.dataset.verdictClosed===`true`,s=a.dataset.dismissed===`true`&&a.dataset.stale!==`true`;!e&&!o&&!s?t+=1:e||(n+=1),!e&&o&&(i+=1),e&&a.dataset.settledBy===`conversation`&&(r+=1)}return{total:e.length,open:t,done:e.length-t,reviewerClosed:n,...r>0?{byConversation:r}:{},...i>0?{byVerdict:i}:{}}}function xd(){let e=bd();if(e.total===0)return;let t=document.querySelector(`[data-view="issues"]`);t&&Nr(t),Sd(`issues`,e.total,e.open,`issue`,qr(e))}function Sd(e,t,n,r,i){let a=document.querySelector(`[data-view-nav="${e}"] .prb-rail-count`);if(!a)return;let o=e=>`${e} ${r}${e===1?``:`s`}`,s=t-n;a.classList.toggle(`prb-rail-count-done`,t>0&&n===0),t===0?(a.textContent=`0`,a.setAttribute(`aria-label`,`No ${r}s`)):n===0?(a.textContent=`✓`,a.setAttribute(`aria-label`,`All ${o(t)} ${i}`)):(a.textContent=String(n),a.setAttribute(`aria-label`,s===0?o(t):`${n} of ${o(t)} left, ${s} ${i}`))}var Cd=new Map([...document.querySelectorAll(`[data-issue-dismissed]`)].map(e=>[e,{dismissed:e.dataset.dismissed===`true`,dismissedIn:e.dataset.dismissedIn,putBack:ld(e)}]));function wd(e){let t=new Map(e.map(e=>[e.id,e.sessionId]));for(let[e,n]of Cd){let r=t.get(e.dataset.issueDismissed??``);r===void 0?e.dataset.dismissed===`true`&&ud(e,!1):n.dismissed&&r===n.dismissedIn?n.putBack():(e.dataset.dismissed!==`true`||e.dataset.stale===`true`||(e.dataset.dismissedIn??iu)!==r)&&(ud(e,!0),e.dataset.dismissedIn=r)}}var Td=e=>void r(y(),{kind:`failed`,text:e}),Ed=Uc({current:ad,send:nd,read:async()=>(await rd())?.answered??null,paint:id,fail:Td},ad()),Dd=Uc({current:sd,send:cd,read:async()=>(await rd())?.dismissed??null,paint:wd,fail:Td},sd());document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-rail-toggle]`);if(n){ju(n,n.getAttribute(`aria-expanded`)!==`true`);return}let r=t.closest(`a[data-view-nav], a[data-goto-section]`);if(r&&!l(e))return;r&&e.preventDefault();let i=t.closest(`[data-view-nav]`);if(i?.dataset.viewNav){Du(i.dataset.viewNav);return}let a=t.closest(`[data-author-context-toggle]`);if(a){ei(a);return}let o=t.closest(`[data-author-context-reveal]`);if(o){ai(o);return}let s=t.closest(`[data-overview-nav]`);if(s?.dataset.overviewNav){Du(s.dataset.overviewNav===`guide`?`guide`:s.dataset.overviewNav);return}let c=t.closest(`[data-goto-section]`);if(c?.dataset.gotoSection){Ou(c.dataset.gotoSection);return}let u=t.closest(`[data-open-editor]`);if(u?.dataset.openEditor){Vu(u.dataset.openEditor,Number(u.dataset.openLine)||1,!u.closest(`[data-architecture]`)||null);return}let d=t.closest(`[data-deletion-toggle]`);if(d){Qc(d);return}let f=t.closest(`[data-code-expand]`);if(f){let e=f.closest(`.prb-code`);e&&vl(e,!e.hasAttribute(`data-expanded`));return}let p=t.closest(`[data-change-step]`);if(p){let e=p.closest(`[data-change-navigator]`),t=p.closest(`.prb-code`);e&&t&&!p.disabled&&Bu(t,e,p.dataset.changeStep===`previous`?`previous`:`next`);return}let m=t.closest(`[data-full-line]`);if(m){let e=el(m);e&&Xl(e);return}let h=t.closest(`[data-expand-file]`);if(h?.dataset.expandFile){let e=h.closest(`.prb-code`);if(e){let t=e.querySelector(`[data-change-navigator]`);Ru(e,h.dataset.expandFile,{cited:Number(h.dataset.expandCited)||0,centre:Number(h.dataset.expandLine)||0,expand:Number(h.dataset.expandStep)||1,position:Number(t?.dataset.changePosition)||0,focus:sl(t)})}return}let g=t.closest(`[data-focus-toggle]`);if(g?.dataset.focusToggle){Eu(g.dataset.focusToggle);return}let _=t.closest(`[data-prompt-toggle]`);if(_){tf(_.getAttribute(`aria-expanded`)===`true`);return}if(t.closest(`[data-ask-buddy-menu], [data-grade-menu]`))return;let v=t.closest(`[data-file]`);if(v?.dataset.file){Iu(v);return}let y=_i(t);if(y){Ou(y);return}let ee=t.closest(`[data-question-answered]`);if(ee?.dataset.questionAnswered){od(ee,ee.dataset.answered!==`true`),Xr(ee);let e=ad();Ed.changed(),du({event:`question_marked_answered`,answered:e.length,total:document.querySelectorAll(`[data-question-answered]`).length});return}let b=t.closest(`[data-issue-dismissed]`);if(b?.dataset.issueDismissed){ud(b,b.dataset.stale===`true`||b.dataset.dismissed!==`true`);let e=sd();Dd.changed(),du({event:`issue_dismissed`,dismissed:e.length,total:document.querySelectorAll(`[data-issue-dismissed]`).length});return}let x=t.closest(`[data-suggestion]`);if(x){Yu(x.textContent??``,`suggestion`);return}if(t.closest(`.pr-helper-explain-simply-button`)){Md(),Yu(ru,`explain_simply`);return}let S=t.closest(`[data-prompt-use]`);if(S?.dataset.promptUse){nf(S.dataset.promptUse);return}let C=t.closest(`[data-prompt-edit]`);if(C?.dataset.promptEdit){Df(C.dataset.promptEdit);return}if(t.closest(`[data-prompt-add]`)){Df(``);return}if(t.closest(`[data-ask-toggle]`)){let e=z?.focus;e?(ce(z,Su),Ad(e!==`buddy`)):Ad(!kd())}});var K=document.querySelector(`.prb-body`),Od=document.querySelector(`.prb-ask`);function kd(){return!!Od&&getComputedStyle(Od).display!==`none`}function Ad(e){K&&(K.dataset.ask=e?`open`:`closed`),jd(e),uu.ask(e)}function jd(e){for(let t of document.querySelectorAll(`[data-ask-toggle]`))t.setAttribute(`aria-expanded`,String(e))}function Md(){z?.focus&&z.focus!==`buddy`&&ce(z,Su),Ad(!0)}function Nd(){jd(kd())}window.addEventListener(`resize`,Nd),ee(R(`/restart`));var Pd=document.querySelector(`[data-file-filter]`),Fd=document.querySelector(`[data-file-count]`),Id=document.querySelector(`[data-file-none]`);function Ld(){let e=(Pd?.value??``).trim().toLowerCase(),t=0,n=0;for(let r of document.querySelectorAll(`[data-view="files"] .prb-file`)){let i=e===``||(r.dataset.search??``).includes(e);r.hidden=!i,i&&(n+=1,r.classList.contains(`prb-file-referenced`)||(t+=1));let a=r.nextElementSibling;a?.classList.contains(`prb-code`)&&(a.hidden=!i)}for(let t of document.querySelectorAll(`[data-file-group]`)){let n=t.querySelectorAll(`.prb-file:not([hidden])`).length;t.hidden=n===0;let r=t.querySelector(`[data-group-heading]`);if(!r)continue;let i=Number(r.dataset.groupTotal)||0;r.textContent=e&&n!==i?`${r.dataset.groupHeading} · ${n} of ${i}`:`${r.dataset.groupHeading} · ${i}`}Id&&(Id.hidden=n>0),Fd&&(Fd.textContent=e?`${t} of ${Rd} file${Rd===1?``:`s`}`:`${Rd} file${Rd===1?``:`s`}`)}var Rd=document.querySelectorAll(`[data-view="files"] .prb-file:not(.prb-file-referenced)`).length;Pd?.addEventListener(`input`,Ld),Pd?.addEventListener(`keydown`,e=>{e.key===`Escape`&&Pd.value!==``&&(e.preventDefault(),Pd.value=``,Ld())}),document.addEventListener(`keydown`,e=>{if(e.key!==`Enter`&&e.key!==` `)return;let t=e.target,n=t.closest(`.prb-file[data-file][role="button"]`);!n||n!==t||(e.preventDefault(),Iu(n))});var zd=320,Bd=()=>Math.round(window.innerWidth/2),Vd=e=>Math.round(Math.min(Bd(),Math.max(zd,e)));function Hd(e){K&&(e===null?K.style.removeProperty(`--ask-width`):K.style.setProperty(`--ask-width`,`${e}px`))}function Ud(){return Od?Math.round(Od.getBoundingClientRect().width):zd}function Wd(e){fetch(R(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({askWidth:e})}).catch(()=>{})}var q=document.querySelector(`[data-ask-resize]`);q?.addEventListener(`pointerdown`,e=>{if(e.button!==0||!K||!Od)return;e.preventDefault(),q.setPointerCapture(e.pointerId),K.dataset.resizing=`true`;let t=e.clientX,n=Ud(),r=e=>{Hd(Vd(n+(t-e.clientX)))},i=()=>{q.removeEventListener(`pointermove`,r),q.removeEventListener(`pointerup`,i),q.removeEventListener(`pointercancel`,i),delete K.dataset.resizing,Wd(Ud())};q.addEventListener(`pointermove`,r),q.addEventListener(`pointerup`,i),q.addEventListener(`pointercancel`,i)}),q?.addEventListener(`keydown`,e=>{let t=e.shiftKey?64:16;if(e.key===`ArrowLeft`||e.key===`ArrowRight`){e.preventDefault();let n=e.key===`ArrowLeft`?t:-t,r=Vd(Ud()+n);Hd(r),Wd(r);return}(e.key===`Home`||e.key===`Escape`)&&(e.preventDefault(),Hd(null),Wd(null))}),q?.addEventListener(`dblclick`,()=>{Hd(null),Wd(null)}),window.addEventListener(`resize`,()=>{kd()&&K?.style.getPropertyValue(`--ask-width`)&&Hd(Vd(Ud()))});var Gd=3e4,Kd=document.visibilityState===`visible`?Date.now():null,qd=0;function Jd(){Kd!==null&&(qd+=Date.now()-Kd,Kd=Date.now())}function Yd(){Jd();let e=Math.round(qd/1e3);return qd-=e*1e3,e}document.addEventListener(`visibilitychange`,()=>{document.visibilityState===`visible`?Kd=Date.now():(Jd(),Kd=null)}),setInterval(()=>{let e=Yd();e>0&&du({event:`workspace_heartbeat`,visibleSeconds:e})},Gd),window.addEventListener(`pagehide`,()=>{let e=R(`/event`),t=JSON.stringify({event:`review_completed`,trailingSeconds:Yd()});navigator.sendBeacon?.(e,new Blob([t],{type:`application/json`}))||fetch(e,{method:`POST`,headers:{"content-type":`application/json`},body:t,keepalive:!0}).catch(()=>{})});var Xd=document.querySelector(`[data-prompt-bank]`),Zd=document.querySelector(`[data-prompt-list]`),J=Qd();function Qd(){try{let e=JSON.parse(Xd?.dataset.prompts??`[]`);return Array.isArray(e)?e:[]}catch{return[]}}function $d(){if(!Zd)return;Zd.innerHTML=J.map(e=>`<span class="prb-bank-item">
|
|
197
|
-
<button type="button" class="prb-bank-use" data-prompt-use="${
|
|
198
|
-
<button type="button" class="prb-bank-edit" data-prompt-edit="${
|
|
199
|
-
</span>`).join(``);let e=document.querySelector(`[data-prompt-count]`);e&&(e.textContent=String(J.length)),df()}async function ef(e){let t=null;try{let n=await fetch(R(`/prompts`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({prompts:e})}),r=await n.json().catch(()=>null);J=Array.isArray(r?.prompts)?r.prompts:J,(!n.ok||!Array.isArray(r?.prompts))&&(t=typeof r?.error==`string`?r.error:`Your prompts were not saved. The workspace server refused the change.`)}catch{t=`Your prompts were not saved. The workspace server did not answer. It may have stopped.`}return $d(),t}function tf(e){document.querySelector(`[data-prompt-toggle]`)?.setAttribute(`aria-expanded`,String(!e)),Xd?.toggleAttribute(`data-collapsed`,e),Zd&&(Zd.hidden=e),fetch(R(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({promptsCollapsed:e})}).catch(()=>{})}function nf(e){let t=J.find(t=>t.id===e);!t||!U||(U.value=bi(U.value,t.prompt),Md(),U.focus(),U.setSelectionRange(U.value.length,U.value.length),U.dispatchEvent(new Event(`input`)))}var rf=document.querySelector(`.prb-doc`),af=null,of=null;function sf(){H&&(of?.(),of=Pn(H,{layout:`flat`,actions:Ln.map(e=>({id:e.id,label:e.label})),onChoose:(e,t)=>ff(e,`selection`,t)}))}var cf=`reassess`;function lf(e){let t=uf();if(!e)return t;let n={id:cf,label:`Reassess ${e.kind===`issue`?`severity`:`importance`}`};return[...t.filter(e=>!e.section),n,...t.filter(e=>e.section)]}function uf(){return[...Fn.map(e=>({id:e.id,label:e.label})),...J.map(e=>({id:Sr(e.id),label:e.name,section:xr}))]}function df(){rf&&(af?.(),af=Pn(rf,{triggerLabel:`Ask Buddy AI`,actions:uf(),ignoreWithin:`[data-ask-buddy-menu]`,onChoose:(e,t)=>ff(e,`selection`,t)}))}function ff(e,t,n,r){Kr(e,{context:t,text:n},{savedPrompt:e=>J.find(t=>t.id===e)?.prompt??null,stage:e=>pf(e,t,r?.continuesExplanation?r.ref:void 0),send:t=>{Md(),Yu(t,`finding`,er(e,r?.ref))}})}function pf(e,t,n){U&&(G={text:e,source:t,...n?{continues:n}:{}},Up?.stage(G),U.value=bi(U.value,e),Md(),U.focus(),U.setSelectionRange(U.value.length,U.value.length),U.dispatchEvent(new Event(`input`)))}function mf(e){let t=e.querySelector(`[data-menu-panel]`);if(t){t.innerHTML=wn(lf(nr(e)));for(let e of t.querySelectorAll(`[data-selection-action]`))e.setAttribute(`role`,`menuitem`);if(W||qu)for(let e of t.querySelectorAll(`button`))e.disabled=!0}}function hf(e){let t=e.querySelector(`[data-menu-items]`),n=e.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!1),n&&(n.hidden=!0),e.querySelector(`[data-menu-error]`)?.remove()}document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-ask-buddy-menu] [data-selection-action]`),n=t?.closest(`[data-ask-buddy-menu]`),r=t?.dataset.selectionAction;if(!n||!r)return;let i=Vn(n),a=nr(n);if(B.close(n),r===cf){i&&a&&gf(a,i);return}i&&ff(r,`finding`,i,a?{ref:a}:void 0)});function gf(e,t){if(W||qu)return;let n=e.kind===`issue`?`severity`:`importance`;Md(),Yu(`${zn(t,{maxChars:1/0})}\n\nReassess its ${n} in light of what we know now.`,`finding`,{reassesses:e})}document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-reassessment-ask-more]`),n=t?gr(t):null;n&&pf(n,`finding`)}),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-simple-explanation-more]`);if(!t)return;let n=tr(t),r=Vn(t);n&&r&&ff(`custom`,`finding`,r,{ref:n,continuesExplanation:!0})}),df(),sf();var Y=so({root:document,showView:e=>Du(e)}),_f=_o({doc:document,pane:()=>document.querySelector(`.prb-doc`),openMenu:(e,t)=>B.open(e,{focusFirst:!0,returnFocus:t}),selecting:()=>Y.state().selecting,flip:e=>void Y.flip(e)});qt(document),cn(document);var vf=document.querySelector(`[data-prompt-dialog]`),yf=document.querySelector(`[data-prompt-name]`),bf=document.querySelector(`[data-prompt-text]`),xf=document.querySelector(`[data-prompt-delete]`),Sf=document.getElementById(`prb-prompt-title`),Cf=document.querySelector(`[data-prompt-error]`),wf=document.querySelector(`[data-prompt-save]`);function Tf(e){Cf&&(Cf.textContent=e??``,Cf.hidden=e===null)}var Ef=``;function Df(e){let t=J.find(t=>t.id===e);Ef=t?.id??``,Sf&&(Sf.textContent=t?`Edit prompt`:`Save a prompt`),yf&&(yf.value=t?.name??``),bf&&(bf.value=t?.prompt??``),xf&&(xf.hidden=!t),Tf(null),vf?.showModal(),yf?.focus()}async function Of(){let e=yf?.value.trim()??``,t=bf?.value.trim()??``;if(!e||!t){(e?bf:yf)?.focus();return}await Af(Ef?J.map(n=>n.id===Ef?{...n,name:e,prompt:t}:n):[...J,{id:crypto.randomUUID(),name:e,prompt:t}])}async function kf(){Ef&&await Af(J.filter(e=>e.id!==Ef))}async function Af(e){Tf(null);let t=[wf,xf].filter(e=>e!==null);for(let e of t)e.disabled=!0;let n=await ef(e);for(let e of t)e.disabled=!1;if(n)return Tf(n);vf?.close()}document.querySelector(`[data-prompt-cancel]`)?.addEventListener(`click`,()=>vf?.close()),xf?.addEventListener(`click`,()=>void kf()),wf?.addEventListener(`click`,()=>void Of());var jf=document.querySelector(`[data-fresh-region]`),Mf=document.querySelector(`[data-fresh-status]`),Nf=document.querySelector(`[data-fresh-check]`),X=Wf(jf?.dataset.report),Pf=`prb-fresh-reopen`,Ff=Bf(),If=jf?.dataset.dismissedSha,Lf=zf(jf?.dataset.availability),Z=Rf(jf?.dataset.remote);function Rf(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function zf(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function Bf(){try{return sessionStorage.getItem(Pf)!==null&&(sessionStorage.removeItem(Pf),!0)}catch{return!1}}Ff&&sp(),Nf?.addEventListener(`click`,()=>void Jf());var Vf=document.querySelector(`[data-fetch-remote]`);Vf&&(fetch(R(`/fetch`)).then(e=>e.ok?e.json():null).then(e=>{e?.fetchable===!0&&(Vf.hidden=!1)}).catch(()=>{}),Vf.addEventListener(`click`,()=>void Hf(Vf)));async function Hf(e){if(e.disabled)return;e.disabled=!0;let t=null;try{let e=await fetch(R(`/fetch`),{method:`POST`});e.ok&&(t=await e.json())}catch{}e.disabled=!1;let n=t??{repositories:1,fetched:0,failed:[],moved:0};r(y(),{kind:n.fetched<n.repositories?`failed`:`ready`,text:le(n)}),n.fetched>0&&await Jf()}jf?.addEventListener(`click`,e=>{let t=e.target;if(t.closest(`[data-fresh-close]`))return Ff=!1,sp();let n=t.closest(`[data-fresh-dismiss]`);n&&(If=n.dataset.freshDismiss||void 0,Ff=!1,sp(),Uf())});function Uf(){fetch(R(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissFreshnessSha:If??null})}).catch(()=>{})}function Wf(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}var Gf=Ka(),Kf=!1,qf=null;async function Jf(){if(Kf)return;Kf=!0,ep(!0),qf&&await qf;let e=tp(X,Z),t=await Xf(!1);ep(!1),t&&op(),Kf=!1,t&&(X?.code.state===`changed`||Z!==null)&&If!==void 0&&(If=void 0,Uf()),sp(),Yf(t?tp(X,Z)===e?`No change`:`Updated`:`Could not check`)}function Yf(e){Mf&&(Mf.textContent=e,window.setTimeout(cp,2600))}async function Xf(e){let t=Gf.snapshot();try{let n=await(await fetch(`${R(`/freshness`)}${e?`&quiet=1`:``}`)).json();X=n.report??null,Lf=n.availability??null,Z=n.remote??null,rp=n.kiss??null,n.kissDismissedSha!==void 0&&(ip=n.kissDismissedSha??void 0),n.prState!==void 0&&$f(n.prState);let r=Ga(n.standing);return r&&Gf.current(t)&&La(document,r),!0}catch{return!1}}async function Zf(){if(Kf||qf||!jf)return;let e=tp(X,Z),t=JSON.stringify(rp);qf=Xf(!0);let n=await qf;qf=null,Qf=Date.now(),n&&(tp(X,Z)!==e&&sp(),JSON.stringify(rp)!==t&&op())}var Qf=Date.now();function $f(e){let t=document.querySelector(`[data-pr-state-slot]`);if(!t)return;let n=Ia(e,t.hasAttribute(`data-beside-number`));t.innerHTML!==n&&(t.innerHTML=n)}function ep(e){Nf&&(Nf.disabled=e),Mf&&e&&(Mf.textContent=`Checking…`,Mf.dataset.state=`checking`)}function tp(e,t){if(!e)return JSON.stringify({report:`none`,remote:t});let{checkedAt:n,...r}=e;return JSON.stringify({...r,remote:t})}var np=document.querySelector(`[data-kiss-fresh-region]`),rp=ap(np?.dataset.freshness),ip=np?.dataset.dismissedSha;function ap(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function op(){ka(rp?.state===`changed`),np&&(np.innerHTML=xa(np.dataset.reviewedSha??``,rp,{dismissedSha:ip,actions:$l!==``}))}np?.addEventListener(`click`,e=>{let t=e.target.closest(`[data-kiss-freshness-dismiss]`);t&&(ip=t.dataset.kissFreshnessDismiss||void 0,op(),fetch(R(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissKissFreshnessSha:ip??null})}).catch(()=>{}))});function sp(){jf&&(jf.innerHTML=Yi(X,{dismissedSha:If,open:Ff,actions:$l!==``,availability:Lf,remote:Z}),cp())}function cp(){if(Mf&&(X||Z)){let{label:e,state:t}=qi(X,Z);Mf.textContent=e,Mf.dataset.state=t,sa(document,t)}}document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-copy-command]`);if(n)return lp(n);let r=t.closest(`[data-notice-dismiss]`);if(r){let e=r instanceof HTMLAnchorElement;e||r.closest(`[data-notice]`)?.remove(),fetch(R(`/prefs`),{method:`POST`,keepalive:e,headers:{"content-type":`application/json`},body:JSON.stringify({dismissNotice:r.dataset.noticeDismiss})}).catch(()=>{});return}let i=t.closest(`[data-pr-recheck]`);if(i)return void dp(i);if(t.closest(`[data-review-update]`))return void hp();let a=t.closest(`[data-update-cancel]`);if(a)return void _p(a,`update`);let o=t.closest(`[data-review-cancel]`);if(o)return void _p(o,`review`);t.closest(`[data-update-close]`)&&document.querySelector(`[data-update-result]`)?.remove()});function lp(e){let t=e.dataset.copyCommand??``;navigator.clipboard?.writeText(t).then(()=>up(e,`Copied`),()=>up(e,`Select it`))}function up(e,t,n=1400){let r=e.textContent;e.textContent=t,setTimeout(()=>{e.textContent=r},n)}async function dp(e){if(mp)return;mp=!0;let t=[...document.querySelectorAll(`[data-pr-recheck]`)];for(let e of t){e.disabled=!0;let t=fp(e);t?t.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Re-checking the PR discussion. ${bp}`:e.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Re-checking…`}fp(e)||xp(e);let n=!1,r=()=>{n||(n=!0,window.clearInterval(i),fp(e)&&pp(),window.location.reload())},i=window.setInterval(async()=>{try{let e=await(await fetch(R(`/job`))).json();e.update&&e.update.phase!==`none`&&!be(e.update.phase)&&r()}catch{}},500);try{await fetch(R(`/refresh`),{method:`POST`})}catch{}r()}function fp(e){return e.closest(`.prb-fresh-notes p`)}function pp(){try{sessionStorage.setItem(Pf,`1`)}catch{}}var mp=!1;async function hp(){if(mp)return;mp=!0;let e=[...document.querySelectorAll(`[data-review-update]`)];for(let t of e)t.disabled=!0,t.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Updating…`;let t=!1,n=()=>{t||(t=!0,window.clearInterval(r),window.location.reload())},r=window.setInterval(async()=>{try{let e=await(await fetch(R(`/job`))).json();e.update&&e.update.phase!==`none`&&!be(e.update.phase)&&n()}catch{}},500);try{await fetch(R(`/update`),{method:`POST`})}catch{}n()}var gp={review:{path:`/job`,body:e=>({stop:e}),took:e=>e.stopped===!0,label:`Cancel review`,tooLate:`Too late to cancel: the review had already finished and was being saved.`,running:e=>e.phase},update:{path:`/update`,body:e=>({cancel:e}),took:e=>e.cancelled===!0,label:`Cancel update`,tooLate:`Too late to cancel: the update had already started saving its result.`,running:e=>e.update?.phase}};async function _p(e,t){let n=gp[t],r=(t===`review`?e.dataset.reviewCancel:e.dataset.updateCancel)??``,i=e.textContent??n.label;e.disabled=!0,e.textContent=`Cancelling…`;let a;try{let e=await fetch(R(n.path),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n.body(r))});if(!e.ok)throw Error(`refused`);a=n.took(await e.json())}catch{e.disabled=!1,e.textContent=i,yp(e,`The workspace server did not answer, so nothing was cancelled. Try again.`);return}a||yp(e,n.tooLate),await Oo({look:async()=>{let e=await fetch(R(`/job`),{signal:AbortSignal.timeout(vp)});return n.running(await e.json())},reload:()=>window.location.reload()})}var vp=3e3;function yp(e,t){let n=e.parentElement;if(!n)return;let r=n.querySelector(`.prb-progress-cancel-status`);r||(r=document.createElement(`p`),r.className=`prb-progress-cancel-status`,r.setAttribute(`role`,`status`),n.appendChild(r)),r.textContent=t}var bp=`Fetching the latest comments, then reassessing issues and questions against anything new.`;function xp(e){let t=e.parentElement;if(!t)return null;let n=document.createElement(`span`);return n.className=`prb-recheck-status`,n.setAttribute(`role`,`status`),n.textContent=bp,t.appendChild(n),n}var Sp=So(document),Cp=null,wp=Date.now();function Tp(){Cp===null&&(Cp=window.setTimeout(()=>{Cp=null,Ep()},Se(Date.now()-wp)))}async function Ep(){try{let e=await(await fetch(R(`/job`))).json();if(qu&&!e.ask||Op&&!e.diagram){window.location.reload();return}let t={job:e,kiss:e.kiss,update:e.update};for(let[e,n]of Sp){let r=t[e];if(r){if(Co(e,r,document)){window.location.reload();return}e===`update`||n.matches(`[data-progress-pane]`)?To(n,r.phase,r.progress):Dp(n,r.progress)}}}catch{}Tp()}function Dp(e,t){if(!t)return;let n=e.querySelector(`.prb-job-progress`);n||(n=document.createElement(`span`),n.className=`prb-job-progress`,e.querySelector(`p`)?.appendChild(n)),n.textContent=` ${t}`}var Op=document.querySelector(`[data-diagram-running]`)!==null;(Sp.size>0||qu||Op)&&(wp=Date.now(),Tp()),document.querySelector(`[data-started-at]`)&&Do(document);function kp(e,t=`The retry could not be started. You can try again.`){let n=e.parentElement;if(!n)return;let r=n.querySelector(`.prb-job-retry-status`);r||(r=document.createElement(`p`),r.className=`prb-job-retry-status`,r.setAttribute(`role`,`status`),n.insertBefore(r,e.nextSibling)),r.textContent=t}function Ap(e){e.parentElement?.querySelector(`.prb-job-retry-status`)?.remove()}document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-job-retry]`);if(!t)return;let n=t.textContent??`Retry`;t.disabled=!0,t.textContent=`Retrying…`,Ap(t);let r=e=>{t.disabled=!1,t.textContent=n,kp(t,e)};fetch(R(`/retry`),{method:`POST`}).then(async e=>{if(e.ok)return void window.location.reload();let t=await e.json().catch(()=>null);r(typeof t?.error==`string`?t.error:void 0)}).catch(()=>r(`The workspace server did not answer. It may have stopped.`))}),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-run-review-again]`);t&&(t.disabled=!0,t.textContent=`Starting…`,fetch(R(`/reanalyse`),{method:`POST`}).then(e=>{if(!e.ok)throw Error(`refused`);location.reload()}).catch(()=>{t.disabled=!1,t.textContent=Jr,up(t,`Could not start. Try again`,2500)}))});var jp={send:async e=>{let t=await fetch(R(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({kissDecision:e})});return t.ok?(await t.json().catch(()=>null))?.decision===e.decision:!1},paintRail:(e,t)=>{Sd(`kiss`,e,t,`recommendation`,`decided`),Sd(`kissrecs`,e,t,`recommendation`,`decided`)}};document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-kiss-decide]`),r=n?.closest(`[data-kiss-rec]`);if(n&&r&&!n.disabled){wa(r,Ca(n),jp);return}let i=t.closest(`[data-kiss-open-primary]`);i&&i.closest(`[data-kiss-rec]`)?.querySelector(`.prb-kiss-locations [data-primary]`)?.click()}),document.addEventListener(`click`,e=>{let t=e.target;if(t.closest(`[data-kiss-run-open]`)){let e=document.querySelector(`[data-kiss-run-dialog]`);e&&!e.open&&e.showModal();return}t.closest(`[data-kiss-run-cancel]`)&&t.closest(`dialog`)?.close()}),document.addEventListener(`change`,e=>{let t=e.target.closest(`[data-kiss-audience]`);if(!t)return;let n=t.closest(`[data-kiss-run-control]`)?.querySelector(`[data-kiss-run]`);n&&(n.disabled=!1)}),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-kiss-run]`);if(!t||t.disabled)return;let n=t.closest(`[data-kiss-run-control]`),r=n?.querySelector(`[data-kiss-audience]:checked`)?.value;if(!r)return;let i=t.textContent??`Run KISS review`;t.disabled=!0,t.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Starting…`,fetch(R(`/kiss`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({audience:r})}).then(e=>{if(e.ok)window.location.reload();else throw Error(`refused`)}).catch(()=>{t.disabled=!1,t.textContent=i;let e=document.createElement(`p`);e.className=`prb-kiss-refused`,e.setAttribute(`role`,`status`),e.textContent=`The KISS review could not be started. You can try again.`,n?.querySelector(`.prb-kiss-refused`)?.remove(),n?.appendChild(e)})});var Mp=document.body.dataset.defaultView||`overview`;window.addEventListener(`popstate`,e=>{let t=_e(e.state)??te(window.location.hash)??{kind:`view`,view:Mp},n=!z||!re(z,t),r=su;su=!1,r?xu(t):cu(()=>xu(t)),n&&yu(t),Hp()});var Np=te(window.location.hash),Pp=window.location.hash===xl,Fp=L.current().ui===null,Ip=window.matchMedia(`(max-width: 860px)`).matches,Lp=Fp&&!Np?.focus?Hr(lu.expanded,C(Np??{kind:`view`,view:Mp},bu),e=>document.querySelector(`[data-focus-toggle="${e}"]`)!==null,Ip):null;if(Fp&&K?.dataset.ask===`open`&&Ip&&delete K.dataset.ask,Lp){let e=Np??{kind:`view`,view:Mp};Np||(z=e);let t={...e,focus:Lp};L.replace(ie(t),t),xu(t)}else Np?xu(Np):(z={kind:`view`,view:Mp},L.replace(``,z));au=!0;var Rp={enterTour(){let e=z,t=e?.kind===`view`&&e.view===`overview`&&!e.focus;return t||cu(()=>xu({kind:`view`,view:`overview`})),()=>{!t&&e&&cu(()=>xu(e))}},save(e){fetch(R(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({guidedTour:e})}).catch(()=>{})}};Pp?Nl(document,window,Rp):Zl.dataset.guidedTour===`offer`&&Al(document,window,{mode:`first`,host:Rp});var zp={doc:document,main:document.querySelector(`main.prb-doc`),rail:document.querySelector(`.prb-rail`),log:H,panes:K};L.setCapturer(()=>Pi(zp));async function Bp(e,t,n){let r=e.dataset.file;if(!r)return;let i=Number(e.dataset.line)||0,a=t??{cited:i,centre:i,expand:0,position:i?2*i:0,tall:!1,top:null,offset:0},o=Si(e),s=o?Lu.pending(o):void 0;if(!o||!Di(s?s.request:Ti(o),a)){if(!o){o=document.createElement(`div`),o.className=`prb-code`,o.innerHTML=`<p class="prb-code-status">Reading…</p>`;let{parent:t,position:n}=Fu(e);t.insertAdjacentElement(n,o),e.setAttribute(`aria-expanded`,`true`)}if(!await Ru(o,r,{cited:a.cited,centre:a.centre,expand:a.expand,position:a.position}))return}else if(s&&!await s.done)return;n()&&(a.tall!==o.hasAttribute(`data-expanded`)&&vl(o,a.tall),t&&Ei(o,t.top,t.offset))}function Vp(e){Si(e)?.remove(),e.setAttribute(`aria-expanded`,`false`)}async function Hp(){let e=++vu,t=()=>vu===e;await Fi(zp,L.current().ui,{setFold:(e,t)=>cu(()=>ju(e,t)),setAsk:e=>cu(()=>Ad(e)),clearAsk:()=>{K&&delete K.dataset.ask,jd(kd())},openPanel:(e,n)=>Bp(e,n,t),closePanel:Vp,stillCurrent:t})}Hp();var Up=U?Hi(U,{storage:(()=>{try{return window.sessionStorage}catch{return null}})(),path:window.location.pathname,restore:!0,win:window}):null;G=Up?.restoredStage??null,Nd(),Pu();var Wp=e=>{for(let t of document.querySelectorAll(`[data-analysis-details][open], [data-range-details][open]`))(!e||!t.contains(e))&&(t.open=!1)};document.addEventListener(`click`,e=>{Wp(e.target)}),document.addEventListener(`keydown`,e=>{if(e.key!==`Escape`)return;let t=document.querySelector(`[data-analysis-details][open], [data-range-details][open]`);t&&(Wp(),t.querySelector(`summary`)?.focus())});var Q=document.querySelector(`.prb-header [data-review-menu]`),$=Ja({root:document,post:(e,t)=>fetch(R(e),t===void 0?{method:`POST`}:{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),gate:Gf,checkForUpdates:()=>Jf()});function Gp(e){if(!Q)return;let t=Q.querySelector(`[data-menu-panel]`);t?.hidden&&B.open(Q),Q.querySelector(`[data-menu-error]`)?.remove();let n=document.createElement(`p`);n.className=`prb-menu-error`,n.setAttribute(`data-menu-error`,``),n.textContent=e,t?.append(n)}async function Kp(e,t){if($.busy())return;Q?.querySelector(`[data-menu-error]`)?.remove(),t&&(t.disabled=!0);let n=await e();if(t&&(t.disabled=!1),!n.busy){if(n.error===null)return void B.closeAll();Gp(n.error)}}function qp(e){return Q?.querySelector(`[data-menu-items] ${e}`)??null}function Jp(e={}){if(!Q)return;Q.querySelector(`[data-menu-panel]`)?.hidden&&B.open(Q);let t=Q.querySelector(`[data-menu-items]`),n=Q.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!0),n&&(n.hidden=!1),e.focusCancel&&Q.querySelector(`[data-cancel-delete]`)?.focus()}async function Yp(e,t){if($.busy()||ae(t))return;oe(t,!0);let n;try{n=await e()}finally{oe(t,!1)}n.busy||n.error===null||r(y(),{kind:`failed`,text:n.error})}if(document.querySelector(`.prb-header-stats`)?.addEventListener(`click`,e=>{let t=e.target,n=t?.closest(`button[data-page-status]`);if(n){Yp(()=>$.setComplete(n.dataset.status!==`complete`),n);return}let r=t?.closest(`[data-lifecycle-control]`),i=r?.querySelector(`button[data-page-lifecycle]`);if(!r||!i)return;let a=t?.closest(`[data-lifecycle-set]`);if(a){B.close(r,{returnFocus:!0}),Yp(()=>$.setLifecycle(a.dataset.lifecycleSet),i);return}let o=i.dataset.lifecyclePress;t?.closest(`[data-lifecycle-pill]`)&&o&&o!==`menu`&&Yp(()=>$.setLifecycle(o),i)}),Q){let t=Q.querySelector(`[data-confirm-delete]`),n=()=>hf(Q);Q.addEventListener(`click`,e=>{let t=e.target,a=t?.closest(`[data-copy-id]`);if(a?.dataset.copyId){e.stopPropagation(),ne(a,a.dataset.copyId);return}if(t?.closest(`[data-tour-replay]`)){e.stopPropagation(),B.closeAll(),Nl(document,window,Rp);return}let o=t?.closest(`[data-pin-toggle]`);if(o){e.stopPropagation(),r(o);return}if(t?.closest(`[data-fresh-check], [data-fetch-remote]`)){B.closeAll();return}let s=t?.closest(`[data-mark-status]`);if(s){e.stopPropagation(),Kp(()=>$.setComplete(s.dataset.markStatus===`complete`),s);return}let c=t?.closest(`[data-lifecycle-set]`);if(c){e.stopPropagation(),Kp(()=>$.setLifecycle(c.dataset.lifecycleSet),c);return}let l=t?.closest(`[data-queue-action]`);if(l){e.stopPropagation(),Kp(()=>$.setQueued(l.dataset.queueAction===`remove`?`remove`:`add`),l);return}if(t?.closest(`[data-delete]`)){e.stopPropagation(),Jp();return}if(t?.closest(`[data-cancel-delete]`)){e.stopPropagation(),n();return}t?.closest(`[data-confirm-delete]`)&&(e.stopPropagation(),i())});let r=async t=>{let n=t.getAttribute(`aria-pressed`)!==`true`;t.disabled=!0;let r=null;try{let e=await fetch(R(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({pinned:n})});e.ok&&(r=(await e.json()).pinned===!0)}catch{}if(t.disabled=!1,r===null){t.textContent=n?`Could not pin`:`Could not unpin`,window.setTimeout(()=>{t.textContent=e(t.getAttribute(`aria-pressed`)===`true`)},1600);return}t.setAttribute(`aria-pressed`,String(r)),t.textContent=e(r)},i=async()=>{t&&(t.disabled=!0,t.textContent=`Deleting`);let{error:e}=await $.deleteReview();if(e===null)return void window.location.replace(`/`);t&&(t.disabled=!1,t.textContent=`Delete`),n(),Gp(e)}}function Xp(e){return{available:()=>document.querySelector(`.prb-rail a[data-view-nav="${e}"]`)!==null,run:()=>Du(e,{keepFocus:!0})}}function Zp(){if(!z)return null;let e=z.focus??(z.kind===`section`?`guide`:z.view);return he.includes(e)&&document.querySelector(`[data-focus-toggle="${e}"]`)?e:null}function Qp(){return[...document.querySelectorAll(`.prb-view:not([hidden]) [data-feedback-select]`)].some(e=>e.checkVisibility())}p(`review`,{..._f.commands,...mo(Y,document),"review.section.review":{available:()=>vo(document)!==null,run:()=>{let e=vo(document);e&&Du(e,{keepFocus:!0})}},"review.section.kiss":Xp(`kiss`),"review.section.issues":Xp(`issues`),"review.section.diagrams":Xp(`map`),"review.section.questions":Xp(`questions`),"review.section.files":Xp(`files`),"review.buddy.open":{available:()=>Od!==null,run:()=>{z?.focus?pe(z,`buddy`,Su):Ad(!0),document.querySelector(`[data-ask-form] textarea`)?.focus()}},"review.buddy.prompt":{available:()=>Od!==null&&U!==null,panel:fe({prompts:()=>J,choose:nf})},"review.focus.toggle":{available:()=>Zp()!==null,run:()=>{let e=Zp();e&&Eu(e)}},"review.leave":{available:e=>!!(e&&de(e,document,e.target===U||Y.state().selecting||!!z?.focus)),run:e=>{U&&e?.target===U?U.blur():Y.state().selecting?Y.exit():z?.focus&&ce(z,Su)}},"review.feedback.toggle":{available:()=>Y.state().selecting||Qp(),label:()=>Y.state().selecting?`Exit Prepare feedback`:`Start Prepare feedback`,run:()=>Y.state().selecting?Y.exit():Y.enter()},"review.mark.reviewed":{available:()=>$.offer().reviewed,run:()=>void Kp(()=>$.setComplete(!0),qp(`[data-mark-status]`))},"review.mark.waiting":{available:()=>$.offer().waiting,run:()=>void Kp(()=>$.setLifecycle(`waiting`),qp(`[data-lifecycle-set="waiting"]`))},"review.mark.done":{available:()=>$.offer().done,run:()=>void Kp(()=>$.setLifecycle(`done`),qp(`[data-lifecycle-set="done"]`))},"review.queue.toggle":{available:()=>$.offer().queue,run:()=>void Kp(()=>$.toggleQueued(),qp(`[data-queue-action]`))},"review.checkUpdates":{available:()=>$.offer().checkForUpdates,run:()=>void $.checkForUpdates()},"review.update":{available:()=>Ji(X,{actions:$l!==``&&!Sp.has(`update`)&&!mp,remote:Z}),run:()=>void hp()},"review.delete":{available:()=>$.offer().delete,run:()=>Jp({focusCancel:!0})}},{onOpen:()=>B.closeAll()}),h(),$l&&Gc({markSeen:()=>fetch(R(`/seen`),{method:`POST`}),askUnread:()=>fetch(R(`/unread`))}),setTimeout(()=>{Wl(Il([...document.querySelectorAll(`[data-view="files"] [data-file]`)].map(e=>e.dataset.file??``)))},0),S(window,()=>window.location.reload());var $p=15e3,em=6e4;function tm(){return $l!==``&&document.visibilityState===`visible`&&!Sp.has(`update`)}document.addEventListener(`visibilitychange`,()=>{tm()&&Date.now()-Qf>=$p&&Zf()}),window.setInterval(()=>{tm()&&Zf()},em);export{bc as n,rn as r,Cc as t};
|
|
192
|
+
${l}`,Ce(e,t),pl(e),ml(e),(n.focus?Te(e,n.focus):e.querySelector(`.prb-code-target`))?.scrollIntoView({block:`center`}),Jl(e,t)}async function Ru(e,t,n){let r=ge(t,n);if(!r)return;let i=Te(e,r.anchor);if(i)t.outerHTML=he(we(t),r.key),i.scrollIntoView({block:`center`});else{let t=e.querySelector(`[data-expand-file]`);if(!t?.dataset.expandFile)return;await Iu(e,t.dataset.expandFile,{cited:Number(t.dataset.expandCited)||0,centre:r.anchor.line,expand:Math.max(1,(Number(t.dataset.expandStep)||1)-1),position:r.key,focus:r.anchor})}let a=e.querySelector(`[data-change-step="${n}"]`),o=e.querySelector(`[data-change-step="${n===`next`?`previous`:`next`}"]`);(a&&!a.disabled?a:o)?.focus({preventScroll:!0})}function zu(e,t,n){let r=`${eu.replace(/\/$/,``)}/${e}`,i=$l.replace(`{path}`,r).replace(`{line}`,String(Math.max(1,t)));n!==null&&lu({event:`editor_opened`,fromFinding:n}),window.location.href=i}var V=document.querySelector(`[data-ask-log]`);V&&V.querySelector(`.prb-msg`)&&V.scrollTo({top:V.scrollHeight});var Bu=document.querySelector(`[data-ask-form]`),H=Bu?.querySelector(`textarea`);function Vu(e,t){let n=document.createElement(`div`);return n.className=e===`user`?`prb-msg prb-msg-user`:`prb-msg prb-msg-${e===`error`?`error`:`assistant`}`,e===`assistant`?(n.classList.add(`prb-md`),n.innerHTML=yt(t)+qt(t)):n.textContent=t,V?.appendChild(n),V?.scrollTo({top:V.scrollHeight}),n}function Hu(e){if(!e||!V)return;let t=document.createElement(`template`);t.innerHTML=e.trim(),V.appendChild(t.content)}async function Uu(e){let t=(e.dataset.reconcileAcceptAll??``).split(` `).filter(Boolean);e.disabled=!0;let n=0;for(let e of t){let t=document.querySelector(`[data-reassessment-proposal="${CSS.escape(e)}"] [data-reassessment-decide="accepted"]`);t&&await Dr(t,xu)&&(n+=1)}let r=document.createElement(`p`);r.className=`prb-turn-help`,r.setAttribute(`role`,`status`),r.textContent=n===t.length?`Accepted ${n===1?`the suggestion`:`all ${n} suggestions`}.`:`Accepted ${n} of ${t.length}. The others had changed or were answered already; their cards show them as they stand.`,e.replaceWith(r)}document.addEventListener(`click`,e=>{let t=e.target,n=t?.closest(`[data-reconcile-turn]`);if(n){let e=Number(n.dataset.reconcileTurn);Number.isFinite(e)&&qu(`Reconcile with findings`,`reconcile`,{reconciles:{exchanges:[e]}});return}let r=t?.closest(`[data-reconcile-accept-all]`);r&&!r.disabled&&Uu(r)});function Wu(){let e=document.createElement(`div`);return e.className=`prb-thinking`,e.innerHTML=`<i></i><i></i><i></i><span>Reading the change…</span>`,V?.appendChild(e),V?.scrollTo({top:V.scrollHeight}),e}var U=null,Gu=!!V?.querySelector(`[data-ask-pending]`);function Ku(){let e=document.createElement(`div`);e.className=`prb-stopped`,e.textContent=`Stopped.`,V?.appendChild(e),V?.scrollTo({top:V.scrollHeight})}async function qu(e,t=`free_text`,n={}){let r=e.trim();if(!r||U||Gu)return;document.querySelector(`.prb-ask-empty`)?.remove(),Vu(`user`,r);let i=Wu();U=new AbortController,Yu(!0);try{let e=await fetch(L(`/ask`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({question:r,sectionId:pu,source:t,...n}),signal:U.signal}),a=await e.json().catch(()=>null);if(e.status===409&&(a?.running||a?.updating)){Ju(r,n.continuesExplanation),window.location.reload();return}if(i.remove(),a?.stopped){Ku();return}if(!e.ok||!a?.answer){Vu(`error`,a?.error??`Buddy AI did not answer. Check the terminal running PR Review Buddy.`);return}Vu(`assistant`,a.answer),typeof a.askedAt==`number`&&Hu(jr({askedAt:a.askedAt,reconciles:a.reconcileTurn},a.reconciliation?.proposals??[])),a.explanation&&gr(document,a.explanation),a.reassessment?.card&&br(document,a.reassessment.card);for(let e of a.reconciliation?.cards??[])br(document,e,xu.onVerdictClosed)}catch(e){i.remove(),e instanceof DOMException&&e.name===`AbortError`?(Ku(),Ju(r,n.continuesExplanation)):(Vu(`error`,`Could not reach PR Review Buddy. The workspace server may have stopped.`),Ju(r,n.continuesExplanation))}finally{U=null,Yu(!1)}}function Ju(e,t){!H||H.value||(H.value=e,Bp?.save(),t&&(W=W?.continues&&e.includes(W.text)?W:{text:e,source:`finding`,continues:t},Bp?.stage(W)))}function Yu(e){let t=Bu?.querySelector(`button`);t&&(t.textContent=e?`Stop`:`Ask`,t.toggleAttribute(`data-stop`,e),t.disabled=!1);for(let t of document.querySelectorAll(Xu))t.disabled=e;e&&z.closeAll(),e||H?.focus()}var Xu=`[data-suggestion], .pr-helper-explain-simply-button, [data-reconcile-turn]`;function Zu(){let e=Bu?.querySelector(`button`);e&&(e.textContent=`Stopping…`,e.disabled=!0),fetch(L(`/stop`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({kind:`ask`})}).catch(()=>{}).finally(()=>{U?.abort()})}Bu?.addEventListener(`submit`,e=>{if(e.preventDefault(),U||Gu)return Zu();let t=H?.value??``;H&&(H.value=``),Bp?.clear();let n=vr(W,t);qu(t,Qu(t),n?{continuesExplanation:n}:{})}),Gu&&Yu(!0);var W=null;function Qu(e){return W&&e.includes(W.text)?W.source:`free_text`}H?.addEventListener(`keydown`,e=>{if(e.key===`Enter`&&!e.shiftKey){if(e.preventDefault(),U||Gu)return;Bu?.requestSubmit()}}),H?.addEventListener(`input`,()=>{H&&(H.style.height=`auto`,H.style.height=`${Math.min(H.scrollHeight,140)}px`)});async function $u(e){try{let t=await fetch(L(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e)});if(t.ok)return null;let n=await t.json().catch(()=>null);return typeof n?.error==`string`?n.error:`That could not be saved. The workspace server refused it.`}catch{return`The workspace server did not answer. It may have stopped.`}}function ed(e){return $u({answeredQuestionIds:e})}async function td(){try{let e=await fetch(L(`/state`)),t=await e.json().catch(()=>null);return!e.ok||!Array.isArray(t?.answeredQuestionIds)||!Array.isArray(t?.dismissedIssues)?null:{answered:t.answeredQuestionIds.filter(e=>typeof e==`string`),dismissed:t.dismissedIssues.filter(e=>typeof e?.id==`string`&&typeof e?.sessionId==`string`)}}catch{return null}}function nd(e){let t=new Set(e);for(let e of document.querySelectorAll(`[data-question-answered]`)){let n=t.has(e.dataset.questionAnswered??``);e.dataset.answered===`true`!==n&&(id(e,n),li(e))}}function rd(){return[...document.querySelectorAll(`[data-question-answered][data-answered="true"]`)].map(e=>e.dataset.questionAnswered??``).filter(Boolean)}function id(e,t){e.dataset.answered=String(t),e.textContent=t?`Mark as unanswered`:`Mark answered`;let n=e.closest(`[data-finding-card]`);n?.classList.toggle(`pr-helper-question-card-answered`,t),n&&dd(n,t||e.dataset.verdictClosed===`true`,`questions`),_d()}function ad(){return[...document.querySelectorAll(`[data-issue-dismissed][data-dismissed="true"]`)].map(e=>({id:e.dataset.issueDismissed??``,sessionId:e.dataset.dismissedIn||nu})).filter(e=>e.id)}function od(e){return $u({dismissedIssues:e})}function sd(e){let t=e.closest(`[data-finding-card]`),{dismissed:n,stale:r,dismissedIn:i}=e.dataset,a=e.textContent,o=t?.classList.contains(`pr-helper-issue-card-dismissed`)??!1,s=e=>e?{element:e,parent:e.parentElement,before:e.nextSibling}:null,c=s(t?.querySelector(`.pr-helper-dismissal-stale`)),l=s(t?.querySelector(`.pr-helper-finding-status-dismissed`));return()=>{if(e.dataset.dismissed=n??`false`,r===void 0?delete e.dataset.stale:e.dataset.stale=r,i===void 0?delete e.dataset.dismissedIn:e.dataset.dismissedIn=i,e.textContent=a,!t)return;t.classList.toggle(`pr-helper-issue-card-dismissed`,o),t.querySelector(`.pr-helper-finding-status-dismissed`)?.remove();for(let e of[l,c])e?.parent&&e.parent.insertBefore(e.element,e.before?.parentNode===e.parent?e.before:null);let s=n===`true`&&r!==`true`||e.dataset.settled===`true`||e.dataset.verdictClosed===`true`;dd(t,s,`issues`),yd()}}function cd(e,t){e.dataset.dismissed=String(t),e.textContent=t?`Reopen`:`Dismiss`,delete e.dataset.stale,t?e.dataset.dismissedIn=nu:delete e.dataset.dismissedIn;let n=e.closest(`[data-finding-card]`);n&&(n.classList.toggle(`pr-helper-issue-card-dismissed`,t),n.querySelector(`.pr-helper-dismissal-stale`)?.remove(),n.querySelector(`.pr-helper-finding-status-dismissed`)?.remove(),t&&n.querySelector(`.pr-helper-issue-badges`)?.prepend(ld()),dd(n,t||e.dataset.settled===`true`||e.dataset.verdictClosed===`true`,`issues`),yd())}function ld(){let e=document.createElement(`span`);return e.className=`pr-helper-finding-status pr-helper-finding-status-dismissed pr-helper-tip`,e.dataset.tip=nr,e.textContent=`Dismissed by you`,e}var ud=new WeakMap;function dd(e,t,n){let r=e.closest(`.pr-helper-closed-findings-list`);if(t!==!!r){if(t){let t=e.parentElement;t&&ud.set(e,{parent:t,before:e.nextElementSibling}),hd(n).append(e),t&&md(t)}else fd(e,n),(r?.children.length===0?r.closest(`.pr-helper-closed-findings`):null)?.remove();gd(n)}}function fd(e,t){let n=ud.get(e);if(n?.parent.isConnected){let t=n.before;for(;t&&t.parentNode!==n.parent;)t=ud.get(t)?.before??null;n.parent.insertBefore(e,t)}else{let n=pd(e)??qr(document,e)??document.querySelector(`[data-view="${t}"]`);n?.insertBefore(e,n.querySelector(`.pr-helper-closed-findings`))}e.closest(`.pr-helper-question-group`)?.removeAttribute(`hidden`)}function pd(e){let t=e.dataset.sectionId;return t?document.querySelector(`[data-question-group="${CSS.escape(t)}"]`):null}function md(e){let t=e.closest(`.pr-helper-question-group`);t&&!t.querySelector(`[data-finding-card]`)&&(t.hidden=!0)}function hd(e){let t=document.querySelector(`[data-view="${e}"]`),n=t?.querySelector(`[data-closed-findings="${e}"] .pr-helper-closed-findings-list`);if(n)return n;let r=document.createElement(`details`);r.className=`pr-helper-closed-findings`,r.dataset.closedFindings=e;let i=document.createElement(`summary`);i.className=`pr-helper-closed-findings-summary`,i.setAttribute(`data-closed-findings-summary`,``);let a=document.createElement(`div`);return a.className=`pr-helper-closed-findings-list`,r.append(i,a),t?.append(r),a}function gd(e){let t=document.querySelector(`[data-closed-findings="${e}"]`),n=t?.querySelector(`[data-closed-findings-summary]`);if(!t||!n)return;let r=document.querySelectorAll(`[data-view="${e}"] [data-finding-card]`).length,i=t.querySelectorAll(`[data-finding-card]`).length;t.toggleAttribute(`data-nothing-open`,r===i),n.textContent=e===`questions`?`Answered (${i})`:ki(vd()),xr(document)}function _d(){let e=[...document.querySelectorAll(`[data-question-answered]`)];if(e.length===0)return;let t=e.filter(e=>e.dataset.answered!==`true`&&e.dataset.settled!==`true`&&e.dataset.verdictClosed!==`true`).length,n=document.querySelector(`.pr-helper-questions-progress`);n&&(n.innerHTML=Ai(e.length,t)),bd(`questions`,e.length,t,`question`,`answered`)}function vd(){let e=[...document.querySelectorAll(`[data-issue-dismissed]`)],t=0,n=0,r=0,i=0;for(let a of e){let e=a.dataset.settled===`true`,o=a.dataset.verdictClosed===`true`,s=a.dataset.dismissed===`true`&&a.dataset.stale!==`true`;!e&&!o&&!s?t+=1:e||(n+=1),!e&&o&&(i+=1),e&&a.dataset.settledBy===`conversation`&&(r+=1)}return{total:e.length,open:t,done:e.length-t,reviewerClosed:n,...r>0?{byConversation:r}:{},...i>0?{byVerdict:i}:{}}}function yd(){let e=vd();if(e.total===0)return;let t=document.querySelector(`[data-view="issues"]`);t&&Kr(t),bd(`issues`,e.total,e.open,`issue`,oi(e))}function bd(e,t,n,r,i){let a=document.querySelector(`[data-view-nav="${e}"] .prb-rail-count`);if(!a)return;let o=e=>`${e} ${r}${e===1?``:`s`}`,s=t-n;a.classList.toggle(`prb-rail-count-done`,t>0&&n===0),t===0?(a.textContent=`0`,a.setAttribute(`aria-label`,`No ${r}s`)):n===0?(a.textContent=`✓`,a.setAttribute(`aria-label`,`All ${o(t)} ${i}`)):(a.textContent=String(n),a.setAttribute(`aria-label`,s===0?o(t):`${n} of ${o(t)} left, ${s} ${i}`))}var xd=new Map([...document.querySelectorAll(`[data-issue-dismissed]`)].map(e=>[e,{dismissed:e.dataset.dismissed===`true`,dismissedIn:e.dataset.dismissedIn,putBack:sd(e)}]));function Sd(e){let t=new Map(e.map(e=>[e.id,e.sessionId]));for(let[e,n]of xd){let r=t.get(e.dataset.issueDismissed??``);r===void 0?e.dataset.dismissed===`true`&&cd(e,!1):n.dismissed&&r===n.dismissedIn?n.putBack():(e.dataset.dismissed!==`true`||e.dataset.stale===`true`||(e.dataset.dismissedIn??nu)!==r)&&(cd(e,!0),e.dataset.dismissedIn=r)}}var Cd=e=>void a(y(),{kind:`failed`,text:e}),wd=al({current:rd,send:ed,read:async()=>(await td())?.answered??null,paint:nd,fail:Cd},rd()),Td=al({current:ad,send:od,read:async()=>(await td())?.dismissed??null,paint:Sd,fail:Cd},ad());document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-rail-toggle]`);if(n){ku(n,n.getAttribute(`aria-expanded`)!==`true`);return}let r=t.closest(`a[data-view-nav], a[data-goto-section]`);if(r&&!i(e))return;r&&e.preventDefault();let a=t.closest(`[data-view-nav]`);if(a?.dataset.viewNav){Tu(a.dataset.viewNav);return}let o=t.closest(`[data-author-context-toggle]`);if(o){pi(o);return}let s=t.closest(`[data-author-context-reveal]`);if(s){vi(s);return}let c=t.closest(`[data-overview-nav]`);if(c?.dataset.overviewNav){Tu(c.dataset.overviewNav===`guide`?`guide`:c.dataset.overviewNav);return}let l=t.closest(`[data-goto-section]`);if(l?.dataset.gotoSection){Eu(l.dataset.gotoSection);return}let u=t.closest(`[data-open-editor]`);if(u?.dataset.openEditor){zu(u.dataset.openEditor,Number(u.dataset.openLine)||1,!u.closest(`[data-architecture]`)||null);return}let d=t.closest(`[data-deletion-toggle]`);if(d){_e(d);return}let f=t.closest(`[data-code-expand]`);if(f){let e=f.closest(`.prb-code`);e&&_l(e,!e.hasAttribute(`data-expanded`));return}let p=t.closest(`[data-change-step]`);if(p){let e=p.closest(`[data-change-navigator]`),t=p.closest(`.prb-code`);e&&t&&!p.disabled&&Ru(t,e,p.dataset.changeStep===`previous`?`previous`:`next`);return}let m=t.closest(`[data-full-line]`);if(m){let e=Oe(m);e&&Yl(e);return}let h=t.closest(`[data-expand-file]`);if(h?.dataset.expandFile){let e=h.closest(`.prb-code`);if(e){let t=e.querySelector(`[data-change-navigator]`);Iu(e,h.dataset.expandFile,{cited:Number(h.dataset.expandCited)||0,centre:Number(h.dataset.expandLine)||0,expand:Number(h.dataset.expandStep)||1,position:Number(t?.dataset.changePosition)||0,focus:ye(t)})}return}let g=t.closest(`[data-focus-toggle]`);if(g?.dataset.focusToggle){wu(g.dataset.focusToggle);return}let _=t.closest(`[data-prompt-toggle]`);if(_){$d(_.getAttribute(`aria-expanded`)===`true`);return}if(t.closest(`[data-ask-buddy-menu], [data-grade-menu]`))return;let v=t.closest(`[data-file]`);if(v?.dataset.file){Pu(v);return}let y=Mi(t);if(y){Eu(y);return}let ee=t.closest(`[data-question-answered]`);if(ee?.dataset.questionAnswered){id(ee,ee.dataset.answered!==`true`),li(ee);let e=rd();wd.changed(),lu({event:`question_marked_answered`,answered:e.length,total:document.querySelectorAll(`[data-question-answered]`).length});return}let b=t.closest(`[data-issue-dismissed]`);if(b?.dataset.issueDismissed){cd(b,b.dataset.stale===`true`||b.dataset.dismissed!==`true`);let e=ad();Td.changed(),lu({event:`issue_dismissed`,dismissed:e.length,total:document.querySelectorAll(`[data-issue-dismissed]`).length});return}let x=t.closest(`[data-suggestion]`);if(x){qu(x.textContent??``,`suggestion`);return}if(t.closest(`.pr-helper-explain-simply-button`)){Ad(),qu(tu,`explain_simply`);return}let S=t.closest(`[data-prompt-use]`);if(S?.dataset.promptUse){ef(S.dataset.promptUse);return}let te=t.closest(`[data-prompt-edit]`);if(te?.dataset.promptEdit){Tf(te.dataset.promptEdit);return}if(t.closest(`[data-prompt-add]`)){Tf(``);return}if(t.closest(`[data-ask-toggle]`)){let e=R?.focus;e?(re(R,bu),Od(e!==`buddy`)):Od(!Dd())}});var G=document.querySelector(`.prb-body`),Ed=document.querySelector(`.prb-ask`);function Dd(){return!!Ed&&getComputedStyle(Ed).display!==`none`}function Od(e){G&&(G.dataset.ask=e?`open`:`closed`),kd(e),cu.ask(e)}function kd(e){for(let t of document.querySelectorAll(`[data-ask-toggle]`))t.setAttribute(`aria-expanded`,String(e))}function Ad(){R?.focus&&R.focus!==`buddy`&&re(R,bu),Od(!0)}function jd(){kd(Dd())}window.addEventListener(`resize`,jd),ee(L(`/restart`));var Md=document.querySelector(`[data-file-filter]`),Nd=document.querySelector(`[data-file-count]`),Pd=document.querySelector(`[data-file-none]`);function Fd(){let e=(Md?.value??``).trim().toLowerCase(),t=0,n=0;for(let r of document.querySelectorAll(`[data-view="files"] .prb-file`)){let i=e===``||(r.dataset.search??``).includes(e);r.hidden=!i,i&&(n+=1,r.classList.contains(`prb-file-referenced`)||(t+=1));let a=r.nextElementSibling;a?.classList.contains(`prb-code`)&&(a.hidden=!i)}for(let t of document.querySelectorAll(`[data-file-group]`)){let n=t.querySelectorAll(`.prb-file:not([hidden])`).length;t.hidden=n===0;let r=t.querySelector(`[data-group-heading]`);if(!r)continue;let i=Number(r.dataset.groupTotal)||0;r.textContent=e&&n!==i?`${r.dataset.groupHeading} · ${n} of ${i}`:`${r.dataset.groupHeading} · ${i}`}Pd&&(Pd.hidden=n>0),Nd&&(Nd.textContent=e?`${t} of ${Id} file${Id===1?``:`s`}`:`${Id} file${Id===1?``:`s`}`)}var Id=document.querySelectorAll(`[data-view="files"] .prb-file:not(.prb-file-referenced)`).length;Md?.addEventListener(`input`,Fd),Md?.addEventListener(`keydown`,e=>{e.key===`Escape`&&Md.value!==``&&(e.preventDefault(),Md.value=``,Fd())}),document.addEventListener(`keydown`,e=>{if(e.key!==`Enter`&&e.key!==` `)return;let t=e.target,n=t.closest(`.prb-file[data-file][role="button"]`);!n||n!==t||(e.preventDefault(),Pu(n))});var Ld=320,Rd=()=>Math.round(window.innerWidth/2),zd=e=>Math.round(Math.min(Rd(),Math.max(Ld,e)));function Bd(e){G&&(e===null?G.style.removeProperty(`--ask-width`):G.style.setProperty(`--ask-width`,`${e}px`))}function Vd(){return Ed?Math.round(Ed.getBoundingClientRect().width):Ld}function Hd(e){fetch(L(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({askWidth:e})}).catch(()=>{})}var K=document.querySelector(`[data-ask-resize]`);K?.addEventListener(`pointerdown`,e=>{if(e.button!==0||!G||!Ed)return;e.preventDefault(),K.setPointerCapture(e.pointerId),G.dataset.resizing=`true`;let t=e.clientX,n=Vd(),r=e=>{Bd(zd(n+(t-e.clientX)))},i=()=>{K.removeEventListener(`pointermove`,r),K.removeEventListener(`pointerup`,i),K.removeEventListener(`pointercancel`,i),delete G.dataset.resizing,Hd(Vd())};K.addEventListener(`pointermove`,r),K.addEventListener(`pointerup`,i),K.addEventListener(`pointercancel`,i)}),K?.addEventListener(`keydown`,e=>{let t=e.shiftKey?64:16;if(e.key===`ArrowLeft`||e.key===`ArrowRight`){e.preventDefault();let n=e.key===`ArrowLeft`?t:-t,r=zd(Vd()+n);Bd(r),Hd(r);return}(e.key===`Home`||e.key===`Escape`)&&(e.preventDefault(),Bd(null),Hd(null))}),K?.addEventListener(`dblclick`,()=>{Bd(null),Hd(null)}),window.addEventListener(`resize`,()=>{Dd()&&G?.style.getPropertyValue(`--ask-width`)&&Bd(zd(Vd()))});var Ud=3e4,Wd=document.visibilityState===`visible`?Date.now():null,Gd=0;function Kd(){Wd!==null&&(Gd+=Date.now()-Wd,Wd=Date.now())}function qd(){Kd();let e=Math.round(Gd/1e3);return Gd-=e*1e3,e}document.addEventListener(`visibilitychange`,()=>{document.visibilityState===`visible`?Wd=Date.now():(Kd(),Wd=null)}),setInterval(()=>{let e=qd();e>0&&lu({event:`workspace_heartbeat`,visibleSeconds:e})},Ud),window.addEventListener(`pagehide`,()=>{let e=L(`/event`),t=JSON.stringify({event:`review_completed`,trailingSeconds:qd()});navigator.sendBeacon?.(e,new Blob([t],{type:`application/json`}))||fetch(e,{method:`POST`,headers:{"content-type":`application/json`},body:t,keepalive:!0}).catch(()=>{})});var Jd=document.querySelector(`[data-prompt-bank]`),Yd=document.querySelector(`[data-prompt-list]`),q=Xd();function Xd(){try{let e=JSON.parse(Jd?.dataset.prompts??`[]`);return Array.isArray(e)?e:[]}catch{return[]}}function Zd(){if(!Yd)return;Yd.innerHTML=q.map(e=>`<span class="prb-bank-item">
|
|
193
|
+
<button type="button" class="prb-bank-use" data-prompt-use="${B(e.id)}" title="${B(e.prompt)}">${B(e.name)}</button>
|
|
194
|
+
<button type="button" class="prb-bank-edit" data-prompt-edit="${B(e.id)}" aria-label="Edit ${B(e.name)}">✎</button>
|
|
195
|
+
</span>`).join(``);let e=document.querySelector(`[data-prompt-count]`);e&&(e.textContent=String(q.length)),lf()}async function Qd(e){let t=null;try{let n=await fetch(L(`/prompts`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({prompts:e})}),r=await n.json().catch(()=>null);q=Array.isArray(r?.prompts)?r.prompts:q,(!n.ok||!Array.isArray(r?.prompts))&&(t=typeof r?.error==`string`?r.error:`Your prompts were not saved. The workspace server refused the change.`)}catch{t=`Your prompts were not saved. The workspace server did not answer. It may have stopped.`}return Zd(),t}function $d(e){document.querySelector(`[data-prompt-toggle]`)?.setAttribute(`aria-expanded`,String(!e)),Jd?.toggleAttribute(`data-collapsed`,e),Yd&&(Yd.hidden=e),fetch(L(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({promptsCollapsed:e})}).catch(()=>{})}function ef(e){let t=q.find(t=>t.id===e);!t||!H||(H.value=Fi(H.value,t.prompt),Ad(),H.focus(),H.setSelectionRange(H.value.length,H.value.length),H.dispatchEvent(new Event(`input`)))}var tf=document.querySelector(`.prb-doc`),nf=null,rf=null;function af(){V&&(rf?.(),rf=qn(V,{layout:`flat`,actions:Xn.map(e=>({id:e.id,label:e.label})),onChoose:(e,t)=>uf(e,`selection`,t)}))}var of=`reassess`;function sf(e){let t=cf();if(!e)return t;let n={id:of,label:`Reassess ${e.kind===`issue`?`severity`:`importance`}`};return[...t.filter(e=>!e.section),n,...t.filter(e=>e.section)]}function cf(){return[...Jn.map(e=>({id:e.id,label:e.label})),...q.map(e=>({id:Fr(e.id),label:e.name,section:Pr}))]}function lf(){tf&&(nf?.(),nf=qn(tf,{triggerLabel:`Ask Buddy AI`,actions:cf(),ignoreWithin:`[data-ask-buddy-menu]`,onChoose:(e,t)=>uf(e,`selection`,t)}))}function uf(e,t,n,r){ai(e,{context:t,text:n},{savedPrompt:e=>q.find(t=>t.id===e)?.prompt??null,stage:e=>df(e,t,r?.continuesExplanation?r.ref:void 0),send:t=>{Ad(),qu(t,`finding`,pr(e,r?.ref))}})}function df(e,t,n){H&&(W={text:e,source:t,...n?{continues:n}:{}},Bp?.stage(W),H.value=Fi(H.value,e),Ad(),H.focus(),H.setSelectionRange(H.value.length,H.value.length),H.dispatchEvent(new Event(`input`)))}function ff(e){let t=e.querySelector(`[data-menu-panel]`);if(t){t.innerHTML=Ln(sf(hr(e)));for(let e of t.querySelectorAll(`[data-selection-action]`))e.setAttribute(`role`,`menuitem`);if(U||Gu)for(let e of t.querySelectorAll(`button`))e.disabled=!0}}function pf(e){let t=e.querySelector(`[data-menu-items]`),n=e.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!1),n&&(n.hidden=!0),e.querySelector(`[data-menu-error]`)?.remove()}document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-ask-buddy-menu] [data-selection-action]`),n=t?.closest(`[data-ask-buddy-menu]`),r=t?.dataset.selectionAction;if(!n||!r)return;let i=er(n),a=hr(n);if(z.close(n),r===of){i&&a&&mf(a,i);return}i&&uf(r,`finding`,i,a?{ref:a}:void 0)});function mf(e,t){if(U||Gu)return;let n=e.kind===`issue`?`severity`:`importance`;Ad(),qu(`${Qn(t,{maxChars:1/0})}\n\nReassess its ${n} in light of what we know now.`,`finding`,{reassesses:e})}document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-reassessment-ask-more]`),n=t?kr(t):null;n&&df(n,`finding`)}),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-simple-explanation-more]`);if(!t)return;let n=mr(t),r=er(t);n&&r&&uf(`custom`,`finding`,r,{ref:n,continuesExplanation:!0})}),lf(),af();var J=Co({root:document,showView:e=>Tu(e)}),hf=Mo({doc:document,pane:()=>document.querySelector(`.prb-doc`),openMenu:(e,t)=>z.open(e,{focusFirst:!0,returnFocus:t}),selecting:()=>J.state().selecting,flip:e=>void J.flip(e)});sn(document),xn(document);var gf=document.querySelector(`[data-prompt-dialog]`),_f=document.querySelector(`[data-prompt-name]`),vf=document.querySelector(`[data-prompt-text]`),yf=document.querySelector(`[data-prompt-delete]`),bf=document.getElementById(`prb-prompt-title`),xf=document.querySelector(`[data-prompt-error]`),Sf=document.querySelector(`[data-prompt-save]`);function Cf(e){xf&&(xf.textContent=e??``,xf.hidden=e===null)}var wf=``;function Tf(e){let t=q.find(t=>t.id===e);wf=t?.id??``,bf&&(bf.textContent=t?`Edit prompt`:`Save a prompt`),_f&&(_f.value=t?.name??``),vf&&(vf.value=t?.prompt??``),yf&&(yf.hidden=!t),Cf(null),gf?.showModal(),_f?.focus()}async function Ef(){let e=_f?.value.trim()??``,t=vf?.value.trim()??``;if(!e||!t){(e?vf:_f)?.focus();return}await Of(wf?q.map(n=>n.id===wf?{...n,name:e,prompt:t}:n):[...q,{id:crypto.randomUUID(),name:e,prompt:t}])}async function Df(){wf&&await Of(q.filter(e=>e.id!==wf))}async function Of(e){Cf(null);let t=[Sf,yf].filter(e=>e!==null);for(let e of t)e.disabled=!0;let n=await Qd(e);for(let e of t)e.disabled=!1;if(n)return Cf(n);gf?.close()}document.querySelector(`[data-prompt-cancel]`)?.addEventListener(`click`,()=>gf?.close()),yf?.addEventListener(`click`,()=>void Df()),Sf?.addEventListener(`click`,()=>void Ef());var Y=document.querySelector(`[data-fresh-region]`),kf=document.querySelector(`[data-fresh-status]`),Af=document.querySelector(`[data-fresh-check]`),X=Vf(Y?.dataset.report),jf=`prb-fresh-reopen`,Mf=Lf(),Nf=Y?.dataset.dismissedSha,Pf=If(Y?.dataset.availability),Z=Ff(Y?.dataset.remote);function Ff(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function If(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function Lf(){try{return sessionStorage.getItem(jf)!==null&&(sessionStorage.removeItem(jf),!0)}catch{return!1}}Mf&&ip(),Af?.addEventListener(`click`,()=>void Gf());var Rf=document.querySelector(`[data-fetch-remote]`);Rf&&(fetch(L(`/fetch`)).then(e=>e.ok?e.json():null).then(e=>{e?.fetchable===!0&&(Rf.hidden=!1)}).catch(()=>{}),Rf.addEventListener(`click`,()=>void zf(Rf)));async function zf(e){if(e.disabled)return;e.disabled=!0;let t=null;try{let e=await fetch(L(`/fetch`),{method:`POST`});e.ok&&(t=await e.json())}catch{}e.disabled=!1;let n=t??{repositories:1,fetched:0,failed:[],moved:0};a(y(),{kind:n.fetched<n.repositories?`failed`:`ready`,text:ve(n)}),n.fetched>0&&await Gf()}Y?.addEventListener(`click`,e=>{let t=e.target;if(t.closest(`[data-fresh-close]`))return Mf=!1,ip();let n=t.closest(`[data-fresh-dismiss]`);n&&(Nf=n.dataset.freshDismiss||void 0,Mf=!1,ip(),Bf())});function Bf(){fetch(L(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissFreshnessSha:Nf??null})}).catch(()=>{})}function Vf(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}var Hf=so(),Uf=!1,Wf=null;async function Gf(){if(Uf)return;Uf=!0,Zf(!0),Wf&&await Wf;let e=Qf(X,Z),t=await qf(!1);Zf(!1),t&&rp(),Uf=!1,t&&(X?.code.state===`changed`||Z!==null)&&Nf!==void 0&&(Nf=void 0,Bf()),ip(),Kf(t?Qf(X,Z)===e?`No change`:`Updated`:`Could not check`)}function Kf(e){kf&&(kf.textContent=e,window.setTimeout(ap,2600))}async function qf(e){let t=Hf.snapshot();try{let n=await(await fetch(`${L(`/freshness`)}${e?`&quiet=1`:``}`)).json();X=n.report??null,Pf=n.availability??null,Z=n.remote??null,ep=n.kiss??null,n.kissDismissedSha!==void 0&&(tp=n.kissDismissedSha??void 0),n.prState!==void 0&&Xf(n.prState);let r=oo(n.standing);return r&&Hf.current(t)&&Qa(document,r),!0}catch{return!1}}async function Jf(){if(Uf||Wf||!Y)return;let e=Qf(X,Z),t=JSON.stringify(ep);Wf=qf(!0);let n=await Wf;Wf=null,Yf=Date.now(),n&&(Qf(X,Z)!==e&&ip(),JSON.stringify(ep)!==t&&rp())}var Yf=Date.now();function Xf(e){let t=document.querySelector(`[data-pr-state-slot]`);if(!t)return;let n=Za(e,t.hasAttribute(`data-beside-number`));t.innerHTML!==n&&(t.innerHTML=n)}function Zf(e){Af&&(Af.disabled=e),kf&&e&&(kf.textContent=`Checking…`,kf.dataset.state=`checking`)}function Qf(e,t){if(!e)return JSON.stringify({report:`none`,remote:t});let{checkedAt:n,...r}=e;return JSON.stringify({...r,remote:t})}var $f=document.querySelector(`[data-kiss-fresh-region]`),ep=np($f?.dataset.freshness),tp=$f?.dataset.dismissedSha;function np(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function rp(){Wa(ep?.state===`changed`),$f&&($f.innerHTML=Ia($f.dataset.reviewedSha??``,ep,{dismissedSha:tp,actions:Zl!==``}))}$f?.addEventListener(`click`,e=>{let t=e.target.closest(`[data-kiss-freshness-dismiss]`);t&&(tp=t.dataset.kissFreshnessDismiss||void 0,rp(),fetch(L(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissKissFreshnessSha:tp??null})}).catch(()=>{}))});function ip(){Y&&(Y.innerHTML=ua(X,{dismissedSha:Nf,open:Mf,actions:Zl!==``,availability:Pf,remote:Z}),ap())}function ap(){if(kf&&(X||Z)){let{label:e,state:t}=ca(X,Z);kf.textContent=e,kf.dataset.state=t,Sa(document,t)}}document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-copy-command]`);if(n)return op(n);let r=t.closest(`[data-notice-dismiss]`);if(r){let e=r instanceof HTMLAnchorElement;e||r.closest(`[data-notice]`)?.remove(),fetch(L(`/prefs`),{method:`POST`,keepalive:e,headers:{"content-type":`application/json`},body:JSON.stringify({dismissNotice:r.dataset.noticeDismiss})}).catch(()=>{});return}let i=t.closest(`[data-pr-recheck]`);if(i)return void cp(i);if(t.closest(`[data-review-update]`))return void fp();let a=t.closest(`[data-update-cancel]`);if(a)return void mp(a,`update`);let o=t.closest(`[data-review-cancel]`);if(o)return void mp(o,`review`);t.closest(`[data-update-close]`)&&document.querySelector(`[data-update-result]`)?.remove()});function op(e){let t=e.dataset.copyCommand??``;navigator.clipboard?.writeText(t).then(()=>sp(e,`Copied`),()=>sp(e,`Select it`))}function sp(e,t,n=1400){let r=e.textContent;e.textContent=t,setTimeout(()=>{e.textContent=r},n)}async function cp(e){if(dp)return;dp=!0;let t=[...document.querySelectorAll(`[data-pr-recheck]`)];for(let e of t){e.disabled=!0;let t=lp(e);t?t.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Re-checking the PR discussion. ${_p}`:e.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Re-checking…`}lp(e)||vp(e);let n=!1,r=()=>{n||(n=!0,window.clearInterval(i),lp(e)&&up(),window.location.reload())},i=window.setInterval(async()=>{try{let e=await(await fetch(L(`/job`))).json();e.update&&e.update.phase!==`none`&&!Ne(e.update.phase)&&r()}catch{}},500);try{await fetch(L(`/refresh`),{method:`POST`})}catch{}r()}function lp(e){return e.closest(`.prb-fresh-notes p`)}function up(){try{sessionStorage.setItem(jf,`1`)}catch{}}var dp=!1;async function fp(){if(dp)return;dp=!0;let e=[...document.querySelectorAll(`[data-review-update]`)];for(let t of e)t.disabled=!0,t.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Updating…`;let t=!1,n=()=>{t||(t=!0,window.clearInterval(r),window.location.reload())},r=window.setInterval(async()=>{try{let e=await(await fetch(L(`/job`))).json();e.update&&e.update.phase!==`none`&&!Ne(e.update.phase)&&n()}catch{}},500);try{await fetch(L(`/update`),{method:`POST`})}catch{}n()}var pp={review:{path:`/job`,body:e=>({stop:e}),took:e=>e.stopped===!0,label:`Cancel review`,tooLate:`Too late to cancel: the review had already finished and was being saved.`,running:e=>e.phase},update:{path:`/update`,body:e=>({cancel:e}),took:e=>e.cancelled===!0,label:`Cancel update`,tooLate:`Too late to cancel: the update had already started saving its result.`,running:e=>e.update?.phase}};async function mp(e,t){let n=pp[t],r=(t===`review`?e.dataset.reviewCancel:e.dataset.updateCancel)??``,i=e.textContent??n.label;e.disabled=!0,e.textContent=`Cancelling…`;let a;try{let e=await fetch(L(n.path),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n.body(r))});if(!e.ok)throw Error(`refused`);a=n.took(await e.json())}catch{e.disabled=!1,e.textContent=i,gp(e,`The workspace server did not answer, so nothing was cancelled. Try again.`);return}a||gp(e,n.tooLate),await Uo({look:async()=>{let e=await fetch(L(`/job`),{signal:AbortSignal.timeout(hp)});return n.running(await e.json())},reload:()=>window.location.reload()})}var hp=3e3;function gp(e,t){let n=e.parentElement;if(!n)return;let r=n.querySelector(`.prb-progress-cancel-status`);r||(r=document.createElement(`p`),r.className=`prb-progress-cancel-status`,r.setAttribute(`role`,`status`),n.appendChild(r)),r.textContent=t}var _p=`Fetching the latest comments, then reassessing issues and questions against anything new.`;function vp(e){let t=e.parentElement;if(!t)return null;let n=document.createElement(`span`);return n.className=`prb-recheck-status`,n.setAttribute(`role`,`status`),n.textContent=_p,t.appendChild(n),n}var yp=Lo(document),bp=null,xp=Date.now();function Sp(){bp===null&&(bp=window.setTimeout(()=>{bp=null,Cp()},Fe(Date.now()-xp)))}async function Cp(){try{let e=await(await fetch(L(`/job`))).json();if(Gu&&!e.ask||Tp&&!e.diagram){window.location.reload();return}let t={job:e,kiss:e.kiss,update:e.update};for(let[e,n]of yp){let r=t[e];if(r){if(Ro(e,r,document)){window.location.reload();return}e===`update`||n.matches(`[data-progress-pane]`)?Bo(n,r.phase,r.progress):wp(n,r.progress)}}}catch{}Sp()}function wp(e,t){if(!t)return;let n=e.querySelector(`.prb-job-progress`);n||(n=document.createElement(`span`),n.className=`prb-job-progress`,e.querySelector(`p`)?.appendChild(n)),n.textContent=` ${t}`}var Tp=document.querySelector(`[data-diagram-running]`)!==null;(yp.size>0||Gu||Tp)&&(xp=Date.now(),Sp()),document.querySelector(`[data-started-at]`)&&Ho(document);function Ep(e,t=`The retry could not be started. You can try again.`){let n=e.parentElement;if(!n)return;let r=n.querySelector(`.prb-job-retry-status`);r||(r=document.createElement(`p`),r.className=`prb-job-retry-status`,r.setAttribute(`role`,`status`),n.insertBefore(r,e.nextSibling)),r.textContent=t}function Dp(e){e.parentElement?.querySelector(`.prb-job-retry-status`)?.remove()}document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-job-retry]`);if(!t)return;let n=t.textContent??`Retry`;t.disabled=!0,t.textContent=`Retrying…`,Dp(t);let r=e=>{t.disabled=!1,t.textContent=n,Ep(t,e)};fetch(L(`/retry`),{method:`POST`}).then(async e=>{if(e.ok)return void window.location.reload();let t=await e.json().catch(()=>null);r(typeof t?.error==`string`?t.error:void 0)}).catch(()=>r(`The workspace server did not answer. It may have stopped.`))}),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-run-review-again]`);t&&(t.disabled=!0,t.textContent=`Starting…`,fetch(L(`/reanalyse`),{method:`POST`}).then(e=>{if(!e.ok)throw Error(`refused`);location.reload()}).catch(()=>{t.disabled=!1,t.textContent=si,sp(t,`Could not start. Try again`,2500)}))});var Op={send:async e=>{let t=await fetch(L(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({kissDecision:e})});return t.ok?(await t.json().catch(()=>null))?.decision===e.decision:!1},paintRail:(e,t)=>{bd(`kiss`,e,t,`recommendation`,`decided`),bd(`kissrecs`,e,t,`recommendation`,`decided`)}};document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-kiss-decide]`),r=n?.closest(`[data-kiss-rec]`);if(n&&r&&!n.disabled){za(r,Ra(n),Op);return}let i=t.closest(`[data-kiss-open-primary]`);i&&i.closest(`[data-kiss-rec]`)?.querySelector(`.prb-kiss-locations [data-primary]`)?.click()}),document.addEventListener(`click`,e=>{let t=e.target;if(t.closest(`[data-kiss-run-open]`)){let e=document.querySelector(`[data-kiss-run-dialog]`);e&&!e.open&&e.showModal();return}t.closest(`[data-kiss-run-cancel]`)&&t.closest(`dialog`)?.close()}),document.addEventListener(`change`,e=>{let t=e.target.closest(`[data-kiss-audience]`);if(!t)return;let n=t.closest(`[data-kiss-run-control]`)?.querySelector(`[data-kiss-run]`);n&&(n.disabled=!1)}),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-kiss-run]`);if(!t||t.disabled)return;let n=t.closest(`[data-kiss-run-control]`),r=n?.querySelector(`[data-kiss-audience]:checked`)?.value;if(!r)return;let i=t.textContent??`Run KISS review`;t.disabled=!0,t.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Starting…`,fetch(L(`/kiss`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({audience:r})}).then(e=>{if(e.ok)window.location.reload();else throw Error(`refused`)}).catch(()=>{t.disabled=!1,t.textContent=i;let e=document.createElement(`p`);e.className=`prb-kiss-refused`,e.setAttribute(`role`,`status`),e.textContent=`The KISS review could not be started. You can try again.`,n?.querySelector(`.prb-kiss-refused`)?.remove(),n?.appendChild(e)})});var kp=document.body.dataset.defaultView||`overview`;window.addEventListener(`popstate`,e=>{let t=le(e.state)??de(window.location.hash)??{kind:`view`,view:kp},n=!R||!xe(R,t),r=au;au=!1,r?yu(t):ou(()=>yu(t)),n&&_u(t),zp()});var Ap=de(window.location.hash),jp=window.location.hash===bl,Mp=F.current().ui===null,Np=window.matchMedia(`(max-width: 860px)`).matches,Pp=Mp&&!Ap?.focus?ti(su.expanded,ae(Ap??{kind:`view`,view:kp},vu),e=>document.querySelector(`[data-focus-toggle="${e}"]`)!==null,Np):null;if(Mp&&G?.dataset.ask===`open`&&Np&&delete G.dataset.ask,Pp){let e=Ap??{kind:`view`,view:kp};Ap||(R=e);let t={...e,focus:Pp};F.replace(ce(t),t),yu(t)}else Ap?yu(Ap):(R={kind:`view`,view:kp},F.replace(``,R));ru=!0;var Fp={enterTour(){let e=R,t=e?.kind===`view`&&e.view===`overview`&&!e.focus;return t||ou(()=>yu({kind:`view`,view:`overview`})),()=>{!t&&e&&ou(()=>yu(e))}},save(e){fetch(L(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({guidedTour:e})}).catch(()=>{})}};jp?Ml(document,window,Fp):I.dataset.guidedTour===`offer`&&kl(document,window,{mode:`first`,host:Fp});var Ip={doc:document,main:document.querySelector(`main.prb-doc`),rail:document.querySelector(`.prb-rail`),log:V,panes:G};F.setCapturer(()=>Yi(Ip));async function Lp(e,t,n){let r=e.dataset.file;if(!r)return;let i=Number(e.dataset.line)||0,a=t??{cited:i,centre:i,expand:0,position:i?2*i:0,tall:!1,top:null,offset:0},o=Li(e),s=o?Fu.pending(o):void 0;if(!o||!Hi(s?s.request:Bi(o),a)){if(!o){o=document.createElement(`div`),o.className=`prb-code`,o.innerHTML=`<p class="prb-code-status">Reading…</p>`;let{parent:t,position:n}=Nu(e);t.insertAdjacentElement(n,o),e.setAttribute(`aria-expanded`,`true`)}if(!await Iu(o,r,{cited:a.cited,centre:a.centre,expand:a.expand,position:a.position}))return}else if(s&&!await s.done)return;n()&&(a.tall!==o.hasAttribute(`data-expanded`)&&_l(o,a.tall),t&&Vi(o,t.top,t.offset))}function Rp(e){Li(e)?.remove(),e.setAttribute(`aria-expanded`,`false`)}async function zp(){let e=++gu,t=()=>gu===e;await Xi(Ip,F.current().ui,{setFold:(e,t)=>ou(()=>ku(e,t)),setAsk:e=>ou(()=>Od(e)),clearAsk:()=>{G&&delete G.dataset.ask,kd(Dd())},openPanel:(e,n)=>Lp(e,n,t),closePanel:Rp,stillCurrent:t})}zp();var Bp=H?ra(H,{storage:(()=>{try{return window.sessionStorage}catch{return null}})(),path:window.location.pathname,restore:!0,win:window}):null;W=Bp?.restoredStage??null,jd(),Mu();var Vp=e=>{for(let t of document.querySelectorAll(`[data-analysis-details][open], [data-range-details][open]`))(!e||!t.contains(e))&&(t.open=!1)};document.addEventListener(`click`,e=>{Vp(e.target)}),document.addEventListener(`keydown`,e=>{if(e.key!==`Escape`)return;let t=document.querySelector(`[data-analysis-details][open], [data-range-details][open]`);t&&(Vp(),t.querySelector(`summary`)?.focus())});var Q=document.querySelector(`.prb-header [data-review-menu]`),$=lo({root:document,post:(e,t)=>fetch(L(e),t===void 0?{method:`POST`}:{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),gate:Hf,checkForUpdates:()=>Gf()});function Hp(e){if(!Q)return;let t=Q.querySelector(`[data-menu-panel]`);t?.hidden&&z.open(Q),Q.querySelector(`[data-menu-error]`)?.remove();let n=document.createElement(`p`);n.className=`prb-menu-error`,n.setAttribute(`data-menu-error`,``),n.textContent=e,t?.append(n)}async function Up(e,t){if($.busy())return;Q?.querySelector(`[data-menu-error]`)?.remove(),t&&(t.disabled=!0);let n=await e();if(t&&(t.disabled=!1),!n.busy){if(n.error===null)return void z.closeAll();Hp(n.error)}}function Wp(e){return Q?.querySelector(`[data-menu-items] ${e}`)??null}function Gp(e={}){if(!Q)return;Q.querySelector(`[data-menu-panel]`)?.hidden&&z.open(Q);let t=Q.querySelector(`[data-menu-items]`),n=Q.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!0),n&&(n.hidden=!1),e.focusCancel&&Q.querySelector(`[data-cancel-delete]`)?.focus()}async function Kp(e,t){if($.busy()||ne(t))return;Ae(t,!0);let n;try{n=await e()}finally{Ae(t,!1)}n.busy||n.error===null||a(y(),{kind:`failed`,text:n.error})}if(document.querySelector(`.prb-header-stats`)?.addEventListener(`click`,e=>{let t=e.target,n=t?.closest(`button[data-page-status]`);if(n){Kp(()=>$.setComplete(n.dataset.status!==`complete`),n);return}let r=t?.closest(`[data-lifecycle-control]`),i=r?.querySelector(`button[data-page-lifecycle]`);if(!r||!i)return;let a=t?.closest(`[data-lifecycle-set]`);if(a){z.close(r,{returnFocus:!0}),Kp(()=>$.setLifecycle(a.dataset.lifecycleSet),i);return}let o=i.dataset.lifecyclePress;t?.closest(`[data-lifecycle-pill]`)&&o&&o!==`menu`&&Kp(()=>$.setLifecycle(o),i)}),Q){let e=Q.querySelector(`[data-confirm-delete]`),n=()=>pf(Q);Q.addEventListener(`click`,e=>{let t=e.target,a=t?.closest(`[data-copy-id]`);if(a?.dataset.copyId){e.stopPropagation(),se(a,a.dataset.copyId);return}if(t?.closest(`[data-tour-replay]`)){e.stopPropagation(),z.closeAll(),Ml(document,window,Fp);return}let o=t?.closest(`[data-pin-toggle]`);if(o){e.stopPropagation(),r(o);return}if(t?.closest(`[data-fresh-check], [data-fetch-remote]`)){z.closeAll();return}let s=t?.closest(`[data-mark-status]`);if(s){e.stopPropagation(),Up(()=>$.setComplete(s.dataset.markStatus===`complete`),s);return}let c=t?.closest(`[data-lifecycle-set]`);if(c){e.stopPropagation(),Up(()=>$.setLifecycle(c.dataset.lifecycleSet),c);return}let l=t?.closest(`[data-queue-action]`);if(l){e.stopPropagation(),Up(()=>$.setQueued(l.dataset.queueAction===`remove`?`remove`:`add`),l);return}if(t?.closest(`[data-delete]`)){e.stopPropagation(),Gp();return}if(t?.closest(`[data-cancel-delete]`)){e.stopPropagation(),n();return}t?.closest(`[data-confirm-delete]`)&&(e.stopPropagation(),i())});let r=async e=>{let n=e.getAttribute(`aria-pressed`)!==`true`;e.disabled=!0;let r=null;try{let e=await fetch(L(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({pinned:n})});e.ok&&(r=(await e.json()).pinned===!0)}catch{}if(e.disabled=!1,r===null){e.textContent=n?`Could not pin`:`Could not unpin`,window.setTimeout(()=>{e.textContent=t(e.getAttribute(`aria-pressed`)===`true`)},1600);return}e.setAttribute(`aria-pressed`,String(r)),e.textContent=t(r)},i=async()=>{e&&(e.disabled=!0,e.textContent=`Deleting`);let{error:t}=await $.deleteReview();if(t===null)return void window.location.replace(`/`);e&&(e.disabled=!1,e.textContent=`Delete`),n(),Hp(t)}}function qp(e){return{available:()=>document.querySelector(`.prb-rail a[data-view-nav="${e}"]`)!==null,run:()=>Tu(e,{keepFocus:!0})}}function Jp(){if(!R)return null;let e=R.focus??(R.kind===`section`?`guide`:R.view);return te.includes(e)&&document.querySelector(`[data-focus-toggle="${e}"]`)?e:null}function Yp(){return[...document.querySelectorAll(`.prb-view:not([hidden]) [data-feedback-select]`)].some(e=>e.checkVisibility())}m(`review`,{...hf.commands,...ko(J,document),"review.section.review":{available:()=>No(document)!==null,run:()=>{let e=No(document);e&&Tu(e,{keepFocus:!0})}},"review.section.kiss":qp(`kiss`),"review.section.issues":qp(`issues`),"review.section.diagrams":qp(`map`),"review.section.questions":qp(`questions`),"review.section.files":qp(`files`),"review.buddy.open":{available:()=>Ed!==null,run:()=>{R?.focus?pe(R,`buddy`,bu):Od(!0),document.querySelector(`[data-ask-form] textarea`)?.focus()}},"review.buddy.prompt":{available:()=>Ed!==null&&H!==null,panel:ke({prompts:()=>q,choose:ef})},"review.focus.toggle":{available:()=>Jp()!==null,run:()=>{let e=Jp();e&&wu(e)}},"review.leave":{available:e=>!!(e&&ie(e,document,e.target===H||J.state().selecting||!!R?.focus)),run:e=>{H&&e?.target===H?H.blur():J.state().selecting?J.exit():R?.focus&&re(R,bu)}},"review.feedback.toggle":{available:()=>J.state().selecting||Yp(),label:()=>J.state().selecting?`Exit Prepare feedback`:`Start Prepare feedback`,run:()=>J.state().selecting?J.exit():J.enter()},"review.mark.reviewed":{available:()=>$.offer().reviewed,run:()=>void Up(()=>$.setComplete(!0),Wp(`[data-mark-status]`))},"review.mark.waiting":{available:()=>$.offer().waiting,run:()=>void Up(()=>$.setLifecycle(`waiting`),Wp(`[data-lifecycle-set="waiting"]`))},"review.mark.done":{available:()=>$.offer().done,run:()=>void Up(()=>$.setLifecycle(`done`),Wp(`[data-lifecycle-set="done"]`))},"review.queue.toggle":{available:()=>$.offer().queue,run:()=>void Up(()=>$.toggleQueued(),Wp(`[data-queue-action]`))},"review.checkUpdates":{available:()=>$.offer().checkForUpdates,run:()=>void $.checkForUpdates()},"review.update":{available:()=>la(X,{actions:Zl!==``&&!yp.has(`update`)&&!dp,remote:Z}),run:()=>void fp()},"review.delete":{available:()=>$.offer().delete,run:()=>Gp({focusCancel:!0})}},{onOpen:()=>z.closeAll()}),g(),Zl&&sl({markSeen:()=>fetch(L(`/seen`),{method:`POST`}),askUnread:()=>fetch(L(`/unread`))}),setTimeout(()=>{Ul(Fl([...document.querySelectorAll(`[data-view="files"] [data-file]`)].map(e=>e.dataset.file??``)))},0),e(window,()=>window.location.reload());var Xp=15e3,Zp=6e4;function Qp(){return Zl!==``&&document.visibilityState===`visible`&&!yp.has(`update`)}document.addEventListener(`visibilitychange`,()=>{Qp()&&Date.now()-Yf>=Xp&&Jf()}),window.setInterval(()=>{Qp()&&Jf()},Zp);export{Ic as n,_n as r,zc as t};
|