prreviewbuddy 0.85.0 → 0.86.1
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 +23 -0
- package/dist/{delete_review-BED4mPxB.js → delete_review-rwn_-SnJ.js} +303 -40
- package/dist/main.js +1 -1
- package/dist/server.js +916 -71
- package/package.json +1 -1
- package/static/shell.css +42 -0
- package/static/sidebar.css +15 -0
- package/static/workspace.js +66 -59
package/static/workspace.js
CHANGED
|
@@ -6,11 +6,11 @@ import{$ as e,H as t,L as n,Q as r,U as i,X as a,Y as o,Z as s,a as c,ct as l,d
|
|
|
6
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 et(e,t){return e.replace(Ve,(e,n)=>{let r=t[Number(n)];return r.diagram?rt(r.code,r.diagram.label):tt(r.code,`Copy`,`Copy code`)})}function tt(e,t,n,r=``){return`<div class="${ue}"${r}><pre><code>${w(e)}</code></pre><button type="button" class="${de}" aria-label="${n}">${t}</button></div>`}var nt=0;function rt(e,t){let n=`prb-md-mermaid-source-${++nt}`;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>`+tt(e,`Copy source`,`Copy source`,` id="${n}" data-md-mermaid-source`)+`</figure>`}function it(e,t=0){let n=t;for(let t of e)n=t===` `?n+4-n%4:n+1;return n}function at(e){return it(e.match(/^[ \t]*/)[0])}function ot(e){let t=e.match(/^([ \t]*)(?:([-*+])|(\d{1,9})[.)])([ \t]+)(\S.*)$/);if(!t)return null;let[,n,r,i,a,o]=t,s=it(n)+(r?1:i.length+1),c=it(a,s);return{tag:r?`ul`:`ol`,start:r?1:Number(i),text:o.trim(),content:c-s>4?s+1:c}}function st(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>${ct(r.join(` `),t)}</p>`),i.length&&n.push(`<blockquote>${ct(i.join(` `),t)}</blockquote>`),a){let e=e=>e.length===1?ct(e[0],t):e.map(e=>`<p>${ct(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?ct(e,t):`<p>${ct(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
7
|
`)){let e=o.trim();if(s){if(e){s.push(w(e));continue}n.push(s.join(`
|
|
8
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=at(o),l=ot(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&&Ie(e,t)){c(),s=[w(e)];continue}if(He.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}>${ct(l[2],t)}</h${e}>`);continue}let u=ot(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 ct(e,t){let n=[];return w(e).replace(/`([^`\n]+)`/g,(e,t)=>(n.push(t),`${Be}${n.length-1}${Be}`)).replace(/!\[([^\]\n]*)\]\(([^)\s]+)\)/g,(e,n,r)=>t&&!Fe(r,t)?ve(r,_e(n))??e:e).replace(/(?<!!)\[([^\]\n]+)\]\(([^)\s]+)\)/g,(e,n,r)=>pe.test(r)&&!(t&&Fe(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(Ue,(e,t)=>`<code>${n[Number(t)]}</code>`)}async function lt(e){try{return await navigator.clipboard.writeText(e),!0}catch(t){return console.warn(`PR Helper: clipboard write failed, falling back to execCommand`,t),ut(e)}}function ut(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 dt=`pr-helper-msg-copy`,ft=`pr-helper-chat-actions`,pt=`data-message-id`,mt=`data-copy-source`,ht={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
|
|
9
|
+
`)),n.join(``)}function ct(e,t){let n=[];return w(e).replace(/`([^`\n]+)`/g,(e,t)=>(n.push(t),`${Be}${n.length-1}${Be}`)).replace(/!\[([^\]\n]*)\]\(([^)\s]+)\)/g,(e,n,r)=>t&&!Fe(r,t)?ve(r,_e(n))??e:e).replace(/(?<!!)\[([^\]\n]+)\]\(([^)\s]+)\)/g,(e,n,r)=>pe.test(r)&&!(t&&Fe(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(Ue,(e,t)=>`<code>${n[Number(t)]}</code>`)}async function lt(e){try{return await navigator.clipboard.writeText(e),!0}catch(t){return console.warn(`PR Helper: clipboard write failed, falling back to execCommand`,t),ut(e)}}function ut(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 dt=`pr-helper-msg-copy`,ft=`pr-helper-chat-actions`,pt=`data-message-id`,mt=`data-copy-source`,ht=`data-feedback-source`,gt=`data-feedback-ref`,_t={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 vt(e){return Ct(`${mt}="${w(e)}"`)}var yt=`pr-helper-finding-copy`,bt=`data-copy-idle-label`,xt=`data-copy-idle-aria`,St=`data-copy-idle-tip`;function Ct(e,t){let{icon:n}=_t.idle,r=t?.label??_t.idle.label,i=t?.aria??_t.idle.aria,a=t?` ${bt}="${w(r)}" ${xt}="${w(i)}" ${St}="${w(t.tip)}"`:``,o=`<button type="button" class="${t?`${dt} ${yt}`:dt}" ${e}${a}${t?` data-tip="${w(t.tip)}"`:``} aria-label="${w(i)}"><span class="${dt}-icon" aria-hidden="true">${Tt(n)}</span><span class="${dt}-label"${r?``:` hidden`}>${w(r)}</span></button>`;return t?o:`<div class="${ft}">${o}</div>`}function wt(e,t){let n=_t[t],r=t===`idle`?{...n,label:e.getAttribute(bt)??n.label,aria:e.getAttribute(xt)??n.aria}:n,i=e.querySelector(`.${dt}-icon`),a=e.querySelector(`.${dt}-label`);i&&(i.innerHTML=Tt(r.icon));let o=(e.getAttribute(bt)??``)!==``,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(St)??``:r.label),e.setAttribute(`aria-label`,r.aria),e.classList.toggle(`copied`,t===`copied`),e.classList.toggle(`failed`,t===`failed`)}function Tt(e){return`<svg viewBox="0 0 16 16" width="14" height="14" fill="currentColor">${e}</svg>`}var Et=1400,Dt=`Copy`,Ot=`Copied`,kt=/Mac|iPhone|iPad/.test(navigator.userAgent)?`Press ⌘C`:`Press Ctrl C`,At=new WeakMap;function jt(e,t={}){let n=e=>{let n=e.target;if(!(n instanceof Element))return;let r=n.closest(`.${de}`),i=r?null:n.closest(`.${dt}`);!r&&!i||(e.preventDefault(),e.stopPropagation(),r?Pt(r):i&&Mt(i,t.messageSource))};return e.addEventListener(`click`,n,!0),()=>e.removeEventListener(`click`,n,!0)}async function Mt(e,t){let n=Nt(e,t);It(e,n!==null&&await lt(n)?`copied`:`failed`)}function Nt(e,t){let n=e.getAttribute(mt);if(n!==null)return n;let r=e.getAttribute(pt);return r&&t?t(r):null}async function Pt(e){let t=e.parentElement?.querySelector(`pre code`),n=t?await lt(t.textContent??``):!1;!n&&t&&Ft(t),Lt(e,n?Ot:kt,n)}function Ft(e){let t=window.getSelection();if(!t)return;let n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}function It(e,t){let n=At.get(e);n&&window.clearTimeout(n),wt(e,t),At.set(e,window.setTimeout(()=>{wt(e,`idle`),At.delete(e)},Et))}function Lt(e,t,n){let r=At.get(e);r&&window.clearTimeout(r);let i=e.dataset.idleLabel??=e.textContent||Dt;e.textContent=t,e.classList.toggle(`copied`,n),At.set(e,window.setTimeout(()=>{e.textContent=i,e.classList.remove(`copied`),At.delete(e)},Et))}var Rt={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`]},zt=null;function Bt(){return zt??=C(()=>import(`./chunk-D6oLtkSC.js`).then(e=>(e.default.initialize(Rt),e.default)),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])),zt}async function Vt(e,t,n,r=Bt){let i=await r();await i.parse(n);let{svg:a}=await i.render(t,n);e.innerHTML=a,Ut(e)}var Ht=`http://www.w3.org/2000/svg`;function Ut(e){for(let t of[...e.querySelectorAll(`a`)]){let n=e.ownerDocument.createElementNS(Ht,`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 Wt=0;function Gt(e,t={}){let n=t.engine??Bt,r=t.observe??Kt,i=new WeakSet;for(let t of e.querySelectorAll(`figure[data-md-mermaid]`))r(t,()=>{i.has(t)||(i.add(t),qt(t,n))});let a=e=>{let t=e.target?.closest?.(`[data-md-mermaid-toggle]`);t&&Yt(t)};return e.addEventListener(`click`,a),()=>e.removeEventListener(`click`,a)}function Kt(e,t){let n=new IntersectionObserver(e=>{e.some(e=>e.isIntersecting)&&(n.disconnect(),t())},{rootMargin:`200px`});n.observe(e)}async function qt(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 Vt(r,`prb-md-mermaid-${++Wt}`,o,t),Jt(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 Jt(e){let t=parseFloat(e?.style.maxWidth??``);!e||!Number.isFinite(t)||t<=0||(e.setAttribute(`width`,String(t)),e.style.maxWidth=`none`)}function Yt(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 Xt=`pr-helper-selection-popover`,Zt=`pr-helper-selection-popover-expanded`,Qt=`pr-helper-selection-copy-done`,$t=8,en=8,tn=1e3,nn=`Copy selected text`,rn=`Copy`,an=`Copied`,on=`pr-helper-selection-popover-flat`,E=null;function sn(e){return`<button type="button" class="pr-helper-selection-menu-item" data-selection-action="${w(e.id)}">${w(e.label)}</button>`}function cn(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(sn).join(``)}${[...t].map(([e,t])=>`
|
|
10
10
|
<div class="pr-helper-selection-menu-group">
|
|
11
11
|
<div class="pr-helper-selection-menu-heading">${w(e)}</div>
|
|
12
|
-
<div class="pr-helper-selection-menu-group-items">${t.map(
|
|
13
|
-
</div>`).join(``)}`}function
|
|
12
|
+
<div class="pr-helper-selection-menu-group-items">${t.map(sn).join(``)}</div>
|
|
13
|
+
</div>`).join(``)}`}function ln(e){if(e.layout===`flat`)return un(e);let t=cn(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">
|
|
@@ -18,7 +18,7 @@ import{$ as e,H as t,L as n,Q as r,U as i,X as a,Y as o,Z as s,a as c,ct as l,d
|
|
|
18
18
|
</svg>
|
|
19
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="${nn}" 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,63 +27,70 @@ import{$ as e,H as t,L as n,Q as r,U as i,X as a,Y as o,Z as s,a as c,ct as l,d
|
|
|
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">${nn}</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 un(e){return`<div class="pr-helper-selection-menu">
|
|
34
|
+
${cn(e.actions)}
|
|
35
|
+
<button type="button" class="pr-helper-selection-menu-item pr-helper-selection-copy-item" data-selection-copy>${rn}</button>
|
|
36
|
+
</div>`}function dn(e,t){let{width:n,height:r}=e.getBoundingClientRect(),i=t.top-r-$t,a=i>=en?i:Math.min(t.bottom+$t,window.innerHeight-r-en),o=Math.max(en,Math.min(t.left,window.innerWidth-n-en));e.style.top=`${Math.max(en,a)}px`,e.style.left=`${o}px`}function fn(){pn&&=(window.clearTimeout(pn),0),E?.popover.remove(),E=null}var pn=0;function mn(e){let t=e.querySelector(`.pr-helper-selection-tip`),n=e.querySelector(`.pr-helper-selection-copy-item`);e.classList.add(Qt),t&&(t.textContent=an),n&&(n.textContent=an),pn&&window.clearTimeout(pn),pn=window.setTimeout(()=>hn(e),tn)}function hn(e){pn&&=(window.clearTimeout(pn),0),e.classList.remove(Qt);let t=e.querySelector(`.pr-helper-selection-tip`);t&&(t.textContent=nn);let n=e.querySelector(`.pr-helper-selection-copy-item`);n&&(n.textContent=rn)}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}mn(e)}function _n(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 vn(e,t){let n={},r=()=>{let r=_n(e,t);if(!r){(!E||E.owner===n)&&fn();return}if(E&&E.owner!==n&&fn(),E)E.popover.classList.remove(Zt),hn(E.popover),E.text=r.text;else{let i=document.createElement(`div`);i.className=t.layout===`flat`?`${Xt} ${on}`:Xt,i.innerHTML=ln(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(Zt);let n=_n(e,t);dn(i,n?.rect??i.getBoundingClientRect());return}let a=r.closest(`[data-selection-action]`)?.dataset.selectionAction;if(!a||!E)return;let o=E.text;fn(),t.onChoose(a,o)}),document.body.appendChild(i),E={popover:i,text:r.text,owner:n}}dn(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)&&fn()},s=e=>{e.key===`Escape`&&fn()},c=()=>fn();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),fn()}}var yn=[{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 bn(e){return![...yn,...xn].find(t=>t.id===e)?.instruction}var xn=[{id:`add-to-chat`,label:`Add to chat`}],Sn=800;function Cn(e,t={}){let n=t.maxChars??Sn,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 wn(e,t,n={}){let r=Cn(e,n);if(!r)return null;let i=[...yn,...xn].find(e=>e.id===t);return i?i.instruction?`${r}\n\n${i.instruction}`:`${r}\n\n`:null}function Tn(e){return e.closest(`[data-finding-card]`)?.querySelector(`[data-copy-source]`)?.getAttribute(`data-copy-source`)??``}function D(e,t=``){return typeof e==`string`?e:t}var En=`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 Dn(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 On=[`explain-detail`,`explain`];function kn(e){return On.includes(e)}function An(e){return e.action??`explain`}var jn=`Ask more →`,Mn={"explain-detail":`Explanation · Technical`,explain:`Explanation · Simple`};function Nn(e){return Mn[An(e)]}function Pn(e,t={}){let n=We(e.text),r=t.askMore?`<button type="button" class="pr-helper-simple-explanation-more" data-simple-explanation-more>${jn}</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">${Nn(e)}</summary>
|
|
45
45
|
<div class="pr-helper-simple-explanation-body pr-helper-markdown">${i}</div>
|
|
46
|
-
</details>`}function Nn(e,t){return`.pr-helper-${e}-card[data-finding-card="${CSS.escape(t)}"]`}function Pn(e){return e?.classList.contains(`pr-helper-issue-card`)?`issue`:e?.classList.contains(`pr-helper-question-card`)?`question`:null}function Fn(e,t){return Dn(e)&&t?{explains:{...t,action:e}}:{}}function In(e){let t=Ln(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 Ln(e){let t=e.closest(`[data-finding-card]`),n=Pn(t),r=t?.getAttribute(`data-finding-card`);return n&&r?{kind:n,id:r}:null}function Rn(e,t){let n=e.querySelector(Nn(t.kind,t.id));if(!n)return;let r=Mn(t,{open:!0,askMore:!0}),i=n.querySelector(`:scope > [data-simple-explanation]`);if(i){i.outerHTML=r;return}zn(n,t.kind)?.insertAdjacentHTML(`afterend`,r)}function zn(e,t){if(t===`issue`)return e.querySelector(`:scope > .pr-helper-issue-desc`);let n=e.querySelector(`:scope > .pr-helper-issue-header`),r=n?.nextElementSibling?.matches(`[data-assessment-region]`)?n.nextElementSibling:n,i=r?.nextElementSibling;return i?.tagName===`H5`&&i.textContent===`Why this matters`?i.nextElementSibling:r??null}function Bn(e,t){return e?.continues&&t.includes(e.text)?e.continues:void 0}var Vn=/^pr-helper-severity-(critical|major|minor|nit)$/;function Hn(e,t){let n=e.querySelector(Nn(t.kind,t.id));if(!n)return null;if(t.kind===`issue`){for(let e of[...n.classList])Vn.test(e)&&n.classList.remove(e);t.cardClass&&n.classList.add(t.cardClass)}return n.querySelector(`[data-grade-control]`)?.replaceWith(Wn(e,t.grade)),n.querySelector(`[data-assessment-region]`)?.replaceWith(Wn(e,t.region)),n.querySelector(`[${mt}]`)?.setAttribute(mt,t.copy),Un(e),n}function Un(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=Tn(r);i&&n.append(Wn(e,i))}}function Wn(e,t){let n=e.createElement(`template`);return n.innerHTML=t.trim(),n.content}function Gn(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 Kn=`Could not reach PR Review Buddy. The workspace server may have stopped.`;async function qn(e,t,n,r,i){let a;try{a=await r.post(n)}catch{return Gn(t,Kn),!1}if(a===null)return!1;let o=a.body?.card?Hn(e,a.body.card):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):(Gn(o,typeof a.body?.error==`string`?a.body.error:`That could not be saved.`),!1)}async function Jn(e,t){let n=e.closest(`[data-grade-menu]`),r=e.closest(`[data-finding-card]`),i=Ln(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),qn(e.ownerDocument,r,{op:`set`,kind:i.kind,id:i.id,from:o,to:a,...s?{reason:s}:{}},t,`grade`)}async function Yn(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 qn(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 Xn(e,t){e.addEventListener(`click`,e=>{let n=e.target,r=n?.closest(`[data-grade-menu] [data-grade-to]`);if(r){Jn(r,t);return}let i=n?.closest(`[data-reassessment-decide]`);i&&Yn(i,t)})}function Zn(e){let t=Cn(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`${xn(t,{maxChars:1/0})}\n\n${xn(`${r}${i?`: ${i}`:``}`,{maxChars:1/0})}\n\n`}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 Qn=`saved:`,$n=`Your prompts`;function er(e){return`${Qn}${e}`}function tr(e){return e.startsWith(`saved:`)?e.slice(6):null}var nr=[`progress`,`overview`,`guide`,`issues`,`questions`,`files`,`prcontext`,`architecture`,`map`,`diagram`,`kiss`,`kissrecs`],rr=`#theme-`,ir=[`buddy`,`overview`,`guide`,`architecture`,`map`,`diagram`,`issues`,`questions`,`files`,`prcontext`,`kiss`,`kissrecs`,`progress`],ar=`&focus=`;function or(e){return`#${e}`}function sr(e){return`${rr}${encodeURIComponent(e)}`}function cr(e){let t=e.kind===`view`?or(e.view):sr(e.sectionId);return e.focus?`${t}${ar}${e.focus}`:t}var lr=[`architecture`,`map`,`diagram`];function ur(e,t){return lr.includes(e)&&lr.includes(t??``)?e:void 0}function dr(e,t){let n=gr(e),r=n?.kind===`view`&&n.view===t?n.focus:ur(t,n?.focus);return cr({kind:`view`,view:t,...r?{focus:r}:{}})}function fr(e){let{focus:t,...n}=e;return n}function pr(e,t){return e.kind!==`view`||e.view!==`guide`||!t?e:{kind:`section`,sectionId:t,...e.focus?{focus:e.focus}:{}}}function mr(e){return ir.includes(e)}function hr(e){if(!e||typeof e!=`object`)return null;let{kind:t,view:n,sectionId:r,focus:i}=e,a=typeof i==`string`&&mr(i)?{focus:i}:{};return t===`view`&&typeof n==`string`&&nr.includes(n)?{kind:t,view:n,...a}:t===`section`&&typeof r==`string`&&r!==``?{kind:t,sectionId:r,...a}:null}function gr(e){let t=e.indexOf(ar);if(t===-1)return _r(e);let n=_r(e.slice(0,t));if(!n)return null;let r=e.slice(t+7);return mr(r)?{...n,focus:r}:n}function _r(e){if(e.startsWith(rr)){let t=e.slice(7);if(!t)return null;try{return{kind:`section`,sectionId:decodeURIComponent(t)}}catch{return null}}let t=e.replace(/^#/,``);return nr.includes(t)?{kind:`view`,view:t}:null}var vr=`pushedFocus`;function yr(e){let{[vr]:t,...n}=e;return n}function br(e,t){return e.kind===`view`&&t.kind===`view`?e.view===t.view:e.kind===`section`&&t.kind===`section`&&e.sectionId===t.sectionId}function xr(e,t,n){if(e.focus===t)return;let r={...fr(yr(e)),focus:t};e.focus&&n.history.state?.[vr]?n.history.replaceState({...r,[vr]:!0},``,cr(r)):n.history.pushState({...r,[vr]:!0},``,cr(r)),n.apply(r)}function Sr(e,t){if(!e.focus)return;if(t.history.state?.[vr]){t.history.back();return}let n=fr(yr(e));t.history.replaceState(n,``,cr(n)),t.apply(n)}function Cr(e,t,n){if(!n||e.key!==`Escape`||e.defaultPrevented||t.querySelector(`dialog[open], [data-menu-panel]:not([hidden]), [data-analysis-details][open], [data-range-details][open], .pr-helper-selection-popover`))return!1;let r=e.target;return!(r?.closest?.(`[data-ask-resize]`)||r instanceof HTMLInputElement&&d(r)&&r.value!==``)}function wr(e,t,n){e&&(n?e.dataset.focus=n:delete e.dataset.focus);for(let e of t.querySelectorAll(`[data-focus-toggle]`)){let t=e.dataset.focusToggle===n,r=e.dataset.focusName??`this`,i=t?`Exit focus on ${r}`:`Expand ${r}`;e.setAttribute(`aria-pressed`,String(t)),e.setAttribute(`aria-label`,i),e.setAttribute(`title`,t?`${i} (Esc)`:i)}}var Tr=[`prb-rail-review`,`prb-rail-path`,`prb-rail-kiss`];function Er(e){return Tr.includes(e)}function Dr(e){if(!e||typeof e!=`object`)return;let t={};for(let n of Tr){let r=e[n];typeof r==`boolean`&&(t[n]=r)}return Object.keys(t).length>0?t:void 0}function Or(e){if(!e||typeof e!=`object`)return{};let{ask:t,expanded:n,rail:r}=e,i=Dr(r);return{...t===`open`||t===`closed`?{ask:t}:{},...n===`buddy`||n===`document`?{expanded:n}:{},...i?{rail:i}:{}}}function kr(e){return e?e===`buddy`?`buddy`:`document`:null}function Ar(e,t,n,r){if(!e||r&&e===`buddy`)return null;let i=e===`buddy`?`buddy`:t.kind===`section`?`guide`:t.view;return ir.includes(i)&&n(i)?i:null}function jr(e){if(!e)return{};try{return Or(JSON.parse(e))}catch{return{}}}function Mr(e,t,n){let r={...e,...e.rail?{rail:{...e.rail}}:{}};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=kr(e);(r.expanded??null)!==i&&(i?r.expanded=i:delete r.expanded,t({expanded:i}))},fold(e,i){!n()||!Er(e)||(r.rail?.[e]??!0)!==i&&(r.rail={...r.rail,[e]:i},t({rail:{[e]:i}}))}}}function Nr(e,t,n,r){let i=n===`finding`?{maxChars:1/0}:{},a=tr(e);if(a===null)return Sn(t,e,i);let o=r(a);if(!o)return null;let s=xn(t,i);return s?`${s}\n\n${o}`:null}function Pr(e,t,n){if(n.busy?.())return null;let r=Nr(e,t.text,t.context,n.savedPrompt);if(!r)return null;let i=vn(e)||tr(e)!==null;return t.context===`selection`||i?(n.stage(r),`staged`):(n.send(r),`sent`)}function Fr(e){return e.reviewerClosed>0?`dealt with`:`resolved`}var Ir=`Run review again`;function Lr(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 Rr(e){let t=e.dataset.questionAnswered;t&&Lr(e.ownerDocument,t,e.dataset.answered===`true`||e.dataset.settled===`true`)}var zr=`pr-helper-author-context-preview`,Br=`View full PR description`,Vr=`Show less`;function Hr(e){let t=e.ownerDocument,n=t.getElementById(e.getAttribute(`aria-controls`)??``),r=t.getElementById(zr);if(!n)return;let i=n.closest(`#${Kr}`),a=i?[...i.querySelectorAll(`[data-author-context-toggle]`)]:[e],o=e.getAttribute(`aria-expanded`)!==`true`,s=Ur(n);if(!o){let e=-Wr(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?Vr:Br,e.hasAttribute(`data-author-context-head`)&&(e.hidden=!o);if(o){let e=Number(n.dataset.readingOffset??0);e>0&&Gr(n,s,Wr(n,s)+e);return}i&&Wr(i,s)<0&&i.scrollIntoView({block:`start`}),e.hidden&&a.find(e=>!e.hidden)?.focus({preventScroll:!0})}function Ur(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 Wr(e,t){return e.getBoundingClientRect().top-(t?t.getBoundingClientRect().top:0)}function Gr(e,t,n){(t??e.ownerDocument.defaultView)?.scrollBy(0,n)}var Kr=`pr-helper-author-context`;function qr(e){let t=e.ownerDocument.getElementById(Kr);if(!t)return;let n=t.querySelector(`[data-author-context-toggle]`);n?.getAttribute(`aria-expanded`)===`false`&&Hr(n),t.scrollIntoView?.({block:`start`,behavior:`smooth`}),t.querySelector(`h4`)?.focus({preventScroll:!0})}({claude:`Claude Code`,codex:`Codex`,gemini:`Gemini CLI`}).claude;function Jr(e){return e?`View current PR description on GitHub ↗`:`View PR description on GitHub ↗`}function Yr(e,t,n=`resolved`){return t===0?`<span class="pr-helper-questions-progress-check" aria-hidden="true">\u2713</span><span class="pr-helper-questions-progress-count">All ${e} issues ${n}</span>`:`<span class="pr-helper-questions-progress-count">${t} of ${e} still open</span>`}function Xr(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})`}return t===0?`Dismissed by you (${e.done})`:`Dealt with (${e.done})`}function Zr(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 Qr(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 $r(e){return e instanceof Element&&e.closest(`[data-guide-jump]`)?.dataset.guideJump||null}function ei(e){for(let t of document.querySelectorAll(`[data-goto-section]`))t.setAttribute(`aria-current`,String(t.dataset.gotoSection===e))}function ti(){for(let e of document.querySelectorAll(`.prb-rail [data-goto-section]`))e.setAttribute(`aria-current`,`false`)}function ni(e,t){let n=e.trim();return n?`${n}\n\n${t}`:t}var ri=50;function ii(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 ai(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,ri),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 oi(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 si(e){let t=e.querySelector(`[data-change-navigator]`),n=e.querySelector(`.prb-code-scroll`),r=n&&n.scrollTop>0?oi(n):{top:null,offset:0};return{cited:O(e.dataset.cited),centre:O(e.dataset.centre),expand:O(e.dataset.expand,ri),position:O(t?.dataset.changePosition??e.dataset.position),tall:e.hasAttribute(`data-expanded`),...r}}function ci(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 li(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 di(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 fi(e){return[...e.querySelectorAll(`[data-file][aria-expanded="true"]`)].map(e=>{let t=ii(e);return{host:di(e),file:e.getAttribute(`data-file`)??``,line:e.getAttribute(`data-line`)??``,...t?{state:si(t)}:{}}})}function pi(e,t){return e.host===t.host&&e.file===t.file&&e.line===t.line}function mi(e,t){for(let n of e.querySelectorAll(`[data-file]`))if(n.getAttribute(`data-file`)===t.file&&(n.getAttribute(`data-line`)??``)===t.line&&di(n)===t.host)return n;return null}function hi(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 gi(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:fi(t),...h(t)}}async function _i(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(hi).map(e=>({...e,state:ai(e.state)}));for(let t of fi(r))if(!e.some(e=>pi(e,t))){let e=mi(r,t);e&&n.closePanel(e)}let i=[];for(let t of e){let e=mi(r,t);e&&i.push(n.openPanel(e,t.state).catch(()=>{}))}await Promise.all(i)}if(!n.stillCurrent())return!1;let c=b(t,`main`);i&&c!==null&&(i.scrollTop=c);let u=b(t,`rail`);a&&u!==null&&(a.scrollTop=u);let d=b(t,`log`);return o&&d!==null&&(o.scrollTop=d),l(r,t.focus,t.focusVisible),!0}var vi=`prb-ask-draft:`,yi=`prb-ask-staged:`,bi=300;function xi(e){return`${vi}${e}`}function Si(e){return`${yi}${e}`}function Ci(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 wi(e,t){let{storage:n,win:r}=t,i=xi(t.path),a=Si(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=Ci(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(),bi)},clear(){o!==null&&r.clearTimeout(o),o=null,s(``)}};return e.addEventListener(`input`,()=>l.saveSoon()),r.addEventListener(`pagehide`,()=>l.save()),l}function Ti(){return`<button type="button" class="prb-update-btn" data-review-update>Update review</button>`}var Ei=`Updating this review checks the latest commits and refreshes the PR conversation. Your progress and Buddy AI history will be kept.`;function Di(e){return`<details class="prb-update-alt">
|
|
46
|
+
</details>`}function Fn(e,t){return`.pr-helper-${e}-card[data-finding-card="${CSS.escape(t)}"]`}function In(e){return e?.classList.contains(`pr-helper-issue-card`)?`issue`:e?.classList.contains(`pr-helper-question-card`)?`question`:null}function Ln(e,t){return kn(e)&&t?{explains:{...t,action:e}}:{}}function Rn(e){let t=zn(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 zn(e){let t=e.closest(`[data-finding-card]`),n=In(t),r=t?.getAttribute(`data-finding-card`);return n&&r?{kind:n,id:r}:null}function Bn(e,t){let n=e.querySelector(Fn(t.kind,t.id));if(!n)return;let r=Pn(t,{open:!0,askMore:!0}),i=n.querySelector(`:scope > [data-simple-explanation]`);if(i){i.outerHTML=r;return}Vn(n,t.kind)?.insertAdjacentHTML(`afterend`,r)}function Vn(e,t){if(t===`issue`)return e.querySelector(`:scope > .pr-helper-issue-desc`);let n=e.querySelector(`:scope > .pr-helper-issue-header`),r=n?.nextElementSibling?.matches(`[data-assessment-region]`)?n.nextElementSibling:n,i=r?.nextElementSibling;return i?.tagName===`H5`&&i.textContent===`Why this matters`?i.nextElementSibling:r??null}function Hn(e,t){return e?.continues&&t.includes(e.text)?e.continues:void 0}var Un=/^pr-helper-severity-(critical|major|minor|nit)$/;function Wn(e,t,n){let r=e.querySelector(Fn(t.kind,t.id));if(!r)return null;if(t.kind===`issue`){for(let e of[...r.classList])Un.test(e)&&r.classList.remove(e);t.cardClass&&r.classList.add(t.cardClass)}r.querySelector(`[data-grade-control]`)?.replaceWith(Kn(e,t.grade)),r.querySelector(`[data-assessment-region]`)?.replaceWith(Kn(e,t.region)),r.querySelector(`[${mt}]`)?.setAttribute(mt,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)),Gn(e),r}function Gn(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=Dn(r);i&&n.append(Kn(e,i))}}function Kn(e,t){let n=e.createElement(`template`);return n.innerHTML=t.trim(),n.content}function qn(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 Jn=`Could not reach PR Review Buddy. The workspace server may have stopped.`;async function Yn(e,t,n,r,i){let a;try{a=await r.post(n)}catch{return qn(t,Jn),!1}if(a===null)return!1;let o=a.body?.card?Wn(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):(qn(o,typeof a.body?.error==`string`?a.body.error:`That could not be saved.`),!1)}async function Xn(e,t){let n=e.closest(`[data-grade-menu]`),r=e.closest(`[data-finding-card]`),i=zn(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),Yn(e.ownerDocument,r,{op:`set`,kind:i.kind,id:i.id,from:o,to:a,...s?{reason:s}:{}},t,`grade`)}async function Zn(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 Yn(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 Qn(e,t){e.addEventListener(`click`,e=>{let n=e.target,r=n?.closest(`[data-grade-menu] [data-grade-to]`);if(r){Xn(r,t);return}let i=n?.closest(`[data-reassessment-decide]`);i&&Zn(i,t)})}function $n(e){let t=Tn(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`${Cn(t,{maxChars:1/0})}\n\n${Cn(`${r}${i?`: ${i}`:``}`,{maxChars:1/0})}\n\n`}var er=`Reassesses existing issues and questions using only your message in this turn.`;function tr(e,t=[]){return e.reconciles?nr(t):`<div class="prb-turn-actions" data-turn-actions="${e.askedAt}">
|
|
47
|
+
<button type="button" class="prb-turn-reconcile" data-reconcile-turn="${e.askedAt}">Reconcile with findings</button>
|
|
48
|
+
<span class="prb-turn-help">${w(er)}</span>
|
|
49
|
+
</div>`}function nr(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 rr=`saved:`,ir=`Your prompts`;function ar(e){return`${rr}${e}`}function or(e){return e.startsWith(`saved:`)?e.slice(6):null}var sr=[`progress`,`overview`,`guide`,`issues`,`questions`,`files`,`prcontext`,`architecture`,`map`,`diagram`,`kiss`,`kissrecs`],cr=`#theme-`,lr=[`buddy`,`overview`,`guide`,`architecture`,`map`,`diagram`,`issues`,`questions`,`files`,`prcontext`,`kiss`,`kissrecs`,`progress`],ur=`&focus=`;function dr(e){return`#${e}`}function fr(e){return`${cr}${encodeURIComponent(e)}`}function pr(e){let t=e.kind===`view`?dr(e.view):fr(e.sectionId);return e.focus?`${t}${ur}${e.focus}`:t}var mr=[`architecture`,`map`,`diagram`];function hr(e,t){return mr.includes(e)&&mr.includes(t??``)?e:void 0}function gr(e,t){let n=xr(e),r=n?.kind===`view`&&n.view===t?n.focus:hr(t,n?.focus);return pr({kind:`view`,view:t,...r?{focus:r}:{}})}function _r(e){let{focus:t,...n}=e;return n}function vr(e,t){return e.kind!==`view`||e.view!==`guide`||!t?e:{kind:`section`,sectionId:t,...e.focus?{focus:e.focus}:{}}}function yr(e){return lr.includes(e)}function br(e){if(!e||typeof e!=`object`)return null;let{kind:t,view:n,sectionId:r,focus:i}=e,a=typeof i==`string`&&yr(i)?{focus:i}:{};return t===`view`&&typeof n==`string`&&sr.includes(n)?{kind:t,view:n,...a}:t===`section`&&typeof r==`string`&&r!==``?{kind:t,sectionId:r,...a}:null}function xr(e){let t=e.indexOf(ur);if(t===-1)return Sr(e);let n=Sr(e.slice(0,t));if(!n)return null;let r=e.slice(t+7);return yr(r)?{...n,focus:r}:n}function Sr(e){if(e.startsWith(cr)){let t=e.slice(7);if(!t)return null;try{return{kind:`section`,sectionId:decodeURIComponent(t)}}catch{return null}}let t=e.replace(/^#/,``);return sr.includes(t)?{kind:`view`,view:t}:null}var Cr=`pushedFocus`;function wr(e){let{[Cr]:t,...n}=e;return n}function Tr(e,t){return e.kind===`view`&&t.kind===`view`?e.view===t.view:e.kind===`section`&&t.kind===`section`&&e.sectionId===t.sectionId}function Er(e,t,n){if(e.focus===t)return;let r={..._r(wr(e)),focus:t};e.focus&&n.history.state?.[Cr]?n.history.replaceState({...r,[Cr]:!0},``,pr(r)):n.history.pushState({...r,[Cr]:!0},``,pr(r)),n.apply(r)}function Dr(e,t){if(!e.focus)return;if(t.history.state?.[Cr]){t.history.back();return}let n=_r(wr(e));t.history.replaceState(n,``,pr(n)),t.apply(n)}function Or(e,t,n){if(!n||e.key!==`Escape`||e.defaultPrevented||t.querySelector(`dialog[open], [data-menu-panel]:not([hidden]), [data-analysis-details][open], [data-range-details][open], .pr-helper-selection-popover`))return!1;let r=e.target;return!(r?.closest?.(`[data-ask-resize]`)||r instanceof HTMLInputElement&&d(r)&&r.value!==``)}function kr(e,t,n){e&&(n?e.dataset.focus=n:delete e.dataset.focus);for(let e of t.querySelectorAll(`[data-focus-toggle]`)){let t=e.dataset.focusToggle===n,r=e.dataset.focusName??`this`,i=t?`Exit focus on ${r}`:`Expand ${r}`;e.setAttribute(`aria-pressed`,String(t)),e.setAttribute(`aria-label`,i),e.setAttribute(`title`,t?`${i} (Esc)`:i)}}var Ar=[`prb-rail-review`,`prb-rail-path`,`prb-rail-kiss`];function jr(e){return Ar.includes(e)}function Mr(e){if(!e||typeof e!=`object`)return;let t={};for(let n of Ar){let r=e[n];typeof r==`boolean`&&(t[n]=r)}return Object.keys(t).length>0?t:void 0}function Nr(e){if(!e||typeof e!=`object`)return{};let{ask:t,expanded:n,rail:r}=e,i=Mr(r);return{...t===`open`||t===`closed`?{ask:t}:{},...n===`buddy`||n===`document`?{expanded:n}:{},...i?{rail:i}:{}}}function Pr(e){return e?e===`buddy`?`buddy`:`document`:null}function Fr(e,t,n,r){if(!e||r&&e===`buddy`)return null;let i=e===`buddy`?`buddy`:t.kind===`section`?`guide`:t.view;return lr.includes(i)&&n(i)?i:null}function Ir(e){if(!e)return{};try{return Nr(JSON.parse(e))}catch{return{}}}function Lr(e,t,n){let r={...e,...e.rail?{rail:{...e.rail}}:{}};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=Pr(e);(r.expanded??null)!==i&&(i?r.expanded=i:delete r.expanded,t({expanded:i}))},fold(e,i){!n()||!jr(e)||(r.rail?.[e]??!0)!==i&&(r.rail={...r.rail,[e]:i},t({rail:{[e]:i}}))}}}function Rr(e,t,n,r){let i=n===`finding`?{maxChars:1/0}:{},a=or(e);if(a===null)return wn(t,e,i);let o=r(a);if(!o)return null;let s=Cn(t,i);return s?`${s}\n\n${o}`:null}function zr(e,t,n){if(n.busy?.())return null;let r=Rr(e,t.text,t.context,n.savedPrompt);if(!r)return null;let i=bn(e)||or(e)!==null;return t.context===`selection`||i?(n.stage(r),`staged`):(n.send(r),`sent`)}function Br(e){return e.reviewerClosed>0?`dealt with`:`resolved`}var Vr=`Run review again`;function Hr(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 Ur(e){let t=e.dataset.questionAnswered;t&&Hr(e.ownerDocument,t,e.dataset.answered===`true`||e.dataset.settled===`true`)}var Wr=`pr-helper-author-context-preview`,Gr=`View full PR description`,Kr=`Show less`;function qr(e){let t=e.ownerDocument,n=t.getElementById(e.getAttribute(`aria-controls`)??``),r=t.getElementById(Wr);if(!n)return;let i=n.closest(`#${Zr}`),a=i?[...i.querySelectorAll(`[data-author-context-toggle]`)]:[e],o=e.getAttribute(`aria-expanded`)!==`true`,s=Jr(n);if(!o){let e=-Yr(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?Kr:Gr,e.hasAttribute(`data-author-context-head`)&&(e.hidden=!o);if(o){let e=Number(n.dataset.readingOffset??0);e>0&&Xr(n,s,Yr(n,s)+e);return}i&&Yr(i,s)<0&&i.scrollIntoView({block:`start`}),e.hidden&&a.find(e=>!e.hidden)?.focus({preventScroll:!0})}function Jr(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 Yr(e,t){return e.getBoundingClientRect().top-(t?t.getBoundingClientRect().top:0)}function Xr(e,t,n){(t??e.ownerDocument.defaultView)?.scrollBy(0,n)}var Zr=`pr-helper-author-context`;function Qr(e){let t=e.ownerDocument.getElementById(Zr);if(!t)return;let n=t.querySelector(`[data-author-context-toggle]`);n?.getAttribute(`aria-expanded`)===`false`&&qr(n),t.scrollIntoView?.({block:`start`,behavior:`smooth`}),t.querySelector(`h4`)?.focus({preventScroll:!0})}({claude:`Claude Code`,codex:`Codex`,gemini:`Gemini CLI`}).claude;function $r(e){return e?`View current PR description on GitHub ↗`:`View PR description on GitHub ↗`}function ei(e,t,n=`resolved`){return t===0?`<span class="pr-helper-questions-progress-check" aria-hidden="true">\u2713</span><span class="pr-helper-questions-progress-count">All ${e} issues ${n}</span>`:`<span class="pr-helper-questions-progress-count">${t} of ${e} still open</span>`}function ti(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 ni(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 ri(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 ii(e){return e instanceof Element&&e.closest(`[data-guide-jump]`)?.dataset.guideJump||null}function ai(e){for(let t of document.querySelectorAll(`[data-goto-section]`))t.setAttribute(`aria-current`,String(t.dataset.gotoSection===e))}function oi(){for(let e of document.querySelectorAll(`.prb-rail [data-goto-section]`))e.setAttribute(`aria-current`,`false`)}function si(e,t){let n=e.trim();return n?`${n}\n\n${t}`:t}var ci=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 ui(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,ci),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 di(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 fi(e){let t=e.querySelector(`[data-change-navigator]`),n=e.querySelector(`.prb-code-scroll`),r=n&&n.scrollTop>0?di(n):{top:null,offset:0};return{cited:O(e.dataset.cited),centre:O(e.dataset.centre),expand:O(e.dataset.expand,ci),position:O(t?.dataset.changePosition??e.dataset.position),tall:e.hasAttribute(`data-expanded`),...r}}function pi(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 mi(e,t){return e.cited===t.cited&&e.centre===t.centre&&e.expand===t.expand&&e.position===t.position}function hi(){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 gi(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 _i(e){return[...e.querySelectorAll(`[data-file][aria-expanded="true"]`)].map(e=>{let t=li(e);return{host:gi(e),file:e.getAttribute(`data-file`)??``,line:e.getAttribute(`data-line`)??``,...t?{state:fi(t)}:{}}})}function vi(e,t){return e.host===t.host&&e.file===t.file&&e.line===t.line}function yi(e,t){for(let n of e.querySelectorAll(`[data-file]`))if(n.getAttribute(`data-file`)===t.file&&(n.getAttribute(`data-line`)??``)===t.line&&gi(n)===t.host)return n;return null}function bi(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 xi(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:_i(t),...h(t)}}async function Si(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(bi).map(e=>({...e,state:ui(e.state)}));for(let t of _i(r))if(!e.some(e=>vi(e,t))){let e=yi(r,t);e&&n.closePanel(e)}let i=[];for(let t of e){let e=yi(r,t);e&&i.push(n.openPanel(e,t.state).catch(()=>{}))}await Promise.all(i)}if(!n.stillCurrent())return!1;let c=b(t,`main`);i&&c!==null&&(i.scrollTop=c);let u=b(t,`rail`);a&&u!==null&&(a.scrollTop=u);let d=b(t,`log`);return o&&d!==null&&(o.scrollTop=d),l(r,t.focus,t.focusVisible),!0}var Ci=`prb-ask-draft:`,wi=`prb-ask-staged:`,Ti=300;function Ei(e){return`${Ci}${e}`}function Di(e){return`${wi}${e}`}function Oi(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 ki(e,t){let{storage:n,win:r}=t,i=Ei(t.path),a=Di(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=Oi(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(),Ti)},clear(){o!==null&&r.clearTimeout(o),o=null,s(``)}};return e.addEventListener(`input`,()=>l.saveSoon()),r.addEventListener(`pagehide`,()=>l.save()),l}function Ai(){return`<button type="button" class="prb-update-btn" data-review-update>Update review</button>`}var ji=`Updating this review checks the latest commits and refreshes the PR conversation. Your progress and Buddy AI history will be kept.`;function Mi(e){return`<details class="prb-update-alt">
|
|
47
52
|
<summary>Start a new review</summary>
|
|
48
53
|
<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>
|
|
49
|
-
</details>`}var
|
|
54
|
+
</details>`}var Ni=`prreviewbuddy review --fresh`;function Pi(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 Fi(e,t){if(!t.actions)return!1;let n=e??(t.remote?Hi(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 Ii(e,t={}){let n=e??(t.remote?Hi(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?Ui(n.code,r):Vi(n.code,t.availability??null),u=e?[...l.facts,`checked ${w(se(n.checkedAt))}`]:l.facts;return`<div class="prb-fresh" data-state="${i||a?`changed`:`quiet`}" role="status">
|
|
50
55
|
<div class="prb-fresh-head">
|
|
51
56
|
<span class="prb-fresh-dot" data-freshness="${l.state}" aria-hidden="true"></span>
|
|
52
57
|
<strong class="prb-fresh-title">${w(l.title)}</strong>
|
|
53
58
|
<span class="prb-fresh-facts">${u.join(` · `)}</span>
|
|
54
59
|
</div>
|
|
55
60
|
${l.consequence?`<p class="prb-fresh-say">${l.consequence}</p>`:``}
|
|
56
|
-
${
|
|
57
|
-
</div>`}function
|
|
58
|
-
${r?
|
|
59
|
-
${r?
|
|
61
|
+
${Li(n,t,i||a,Fi(e,t))}
|
|
62
|
+
</div>`}function Li(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">
|
|
63
|
+
${r?Ai():``}
|
|
64
|
+
${r?Mi(Ni):``}
|
|
60
65
|
${i}
|
|
61
|
-
${
|
|
62
|
-
</div>`}function
|
|
66
|
+
${Ri(e,t,n,r===!0)}
|
|
67
|
+
</div>`}function Ri(e,t,n,r){let i=[r?w(ji):``,t.remote?Wi(e.code):Gi(e.code,e.checkout.reason!==`no-pull-request`),Ki(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">
|
|
63
68
|
<summary>More details</summary>
|
|
64
69
|
${a}
|
|
65
|
-
</details>`:a}function
|
|
70
|
+
</details>`:a}function zi(e,t){return e===null?[]:[`${e} file${e===1?``:`s`} ${t}`]}function Bi(e){return e?`<code title="${w(e)}">${w(e.slice(0,7))}</code>`:``}function k(e){return e?[`reviewed ${Bi(e)}`]:[]}function Vi(e,t){if(e.state===`fixed`)return{state:`fixed`,title:`Freshness: Fixed`,facts:k(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:k(e.reviewedSha),consequence:``};if(e.state===`changed`){if(e.rewritten)return{state:`changed`,title:`Code rewritten`,facts:[...k(e.reviewedSha),...zi(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:[...k(e.reviewedSha),...t,...zi(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:k(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:k(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:k(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 Hi(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 Ui(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:[...k(e.reviewedSha),...i,...n?zi(n.changedFiles,n.rewritten?`differ`:`changed`):[],`seen ${w(se(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 Wi(e){return`This review is based on ${Bi(e.reviewedSha)}. The pull request has newer commits. <strong>Update review</strong> fetches them first.`}function Gi(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 ${Bi(e.reviewedSha)}.`:`This review is based on ${Bi(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 Ki(e,t){if(!e.conversation.attached)return``;let n=w(se(e.conversation.importedAt));return t?`<button type="button" class="prb-fresh-quiet" data-pr-recheck>Re-check the conversation</button> to refresh comments and resolved threads without re-running the code review. Last checked ${n}.`:`The PR conversation was last checked ${n}.`}function qi(e,t){let n=$r(t===`changed`);for(let t of e.querySelectorAll(`[data-github-description]`))t.textContent!==n&&(t.textContent=n)}function Ji(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${Xi(e.draftComment.trim())}`:``].filter(e=>e!==``).join(`
|
|
66
71
|
|
|
67
|
-
`)}function
|
|
72
|
+
`)}function Yi(e){return e.length===0?``:[`## Simplification suggestions (${e.length})`,...e.map(Ji)].join(`
|
|
68
73
|
|
|
69
|
-
`)}function
|
|
74
|
+
`)}function Xi(e){return e.split(`
|
|
70
75
|
`).map(e=>e===``?`>`:`> ${e}`).join(`
|
|
71
|
-
`)}function
|
|
76
|
+
`)}function Zi(e){return e===`done`||e===`failed`}function Qi(e,t){let n=e=>e.toLowerCase().replace(/\bthe\b/g,``).replace(/[^a-z]/g,``);return n(e)===n(t)}function $i(e,t=``){return`<div class="prb-doc-head">
|
|
72
77
|
<h3 class="prb-doc-title">${w(e)}</h3>
|
|
73
78
|
${t}
|
|
74
|
-
</div>`}var
|
|
79
|
+
</div>`}var ea=`<path d="M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"/>`,ta=`<path d="M4 14h6v6M20 10h-6V4M14 10l7-7M3 21l7-7"/>`;function na(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 ra(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)}">${na(ea,`prb-focus-expand`)}${na(ta,`prb-focus-collapse`)}</button>`}ra(`kiss`,`KISS review`),$i(`Recommendations`,ra(`kissrecs`,`Recommendations`));var ia={author:{accepted:`Plan to simplify`,declined:`Keep as implemented`},reviewer:{accepted:`Raise with author`,declined:`Leave it`}};function aa(e,t){return t===`undecided`?`Open`:ia[e][t]}function oa(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 sa(e){return`Decided (${e})`}function ca(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 la(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">
|
|
75
80
|
<p><strong>This KISS review describes commit ${w(e.slice(0,7))}.</strong> The branch has moved on since. ${r}</p>
|
|
76
81
|
</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">
|
|
77
82
|
<p><strong>This KISS review describes commit ${w(e.slice(0,7))}.</strong> ${w(i)}</p>
|
|
78
83
|
<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>
|
|
79
84
|
<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>
|
|
80
|
-
</div>`}var
|
|
85
|
+
</div>`}var ua=new WeakMap;function da(e){let t=e.dataset.kissDecide;return e.getAttribute(`aria-pressed`)===`true`?`undecided`:t}function fa(e,t,n){let r=e.dataset.decision??`undecided`,i=async()=>{Sa(e);let i=e.contains(document.activeElement);pa(e,t),ba(e,!0),ha(n),i&&xa(e);let a=await n.send({runId:e.dataset.kissRunId??``,recommendationId:e.dataset.kissRec??``,decision:t}).catch(()=>!1);if(ba(e,!1),a){ha(n);return}pa(e,r),ha(n),Ca(e,t,n)},a=(ua.get(e)??Promise.resolve()).then(i,i);return ua.set(e,a),a}function pa(e,t){e.dataset.decision=t;let n=ya(e),r=e.querySelector(`[data-kiss-status]`);r&&(r.dataset.kissStatus=t,r.textContent=aa(n,t));for(let r of e.querySelectorAll(`[data-kiss-decide]`))r.setAttribute(`aria-pressed`,String(r.dataset.kissDecide===t)),r.textContent=ia[n][r.dataset.kissDecide];ma(e,t!==`undecided`)}function ma(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=oa(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=sa(r))}e.paintRail(n.length,i),ga(t)}function ga(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=va(t).filter(e=>n.has(e.id)),i=e.querySelector(`[data-kiss-rec][aria-busy]`)!==null,a=ca(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?Yi(r):``));let s=t.querySelector(`[data-kiss-handoff-note]`);s&&(s.textContent=a.note)}function _a(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),ga(t))}function va(e){try{let t=JSON.parse(e.querySelector(`script[data-kiss-handoff-source]`)?.textContent??`[]`);return Array.isArray(t)?t:[]}catch{return[]}}function ya(e){return e.dataset.audience===`author`?`author`:`reviewer`}function ba(e,t){e.toggleAttribute(`aria-busy`,t);for(let n of e.querySelectorAll(`[data-kiss-decide]`))n.disabled=t}function xa(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 Sa(e){e.querySelector(`[data-kiss-decision-error]`)?.remove()}function Ca(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 fa(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 wa(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 Ta(e,t){t.complete!==void 0&&Oa(e,t.complete),t.activity!==void 0&&Ea(e,t.activity??void 0),t.lifecycle===void 0?t.activity!==void 0&&ka(e,Da(e)):ka(e,t.lifecycle??void 0),t.queued!==void 0&&Aa(e,t.queued)}function Ea(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 Da(e){let t=e.querySelector(`[data-review-menu]`);return S(t?{state:t.dataset.lifecycleState,at:Number(t.dataset.lifecycleAt)}:void 0)}function Oa(e,t){let r=t?`complete`:`in-progress`,i=e.querySelector(`[data-page-status]`);i&&(i.dataset.status=r,i.textContent=o(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 ka(t,n){let i=t.querySelector(`[data-review-menu]`);i&&(n?(i.dataset.lifecycleState=n.state,i.dataset.lifecycleAt=String(n.at)):(delete i.dataset.lifecycleState,delete i.dataset.lifecycleAt));let a=i?ja(i):void 0,o=t.querySelector(`[data-page-lifecycle]`);if(o){let e=r(n,a);o.hidden=e===void 0,o.textContent=e?.text??``,o.toggleAttribute(`data-changed`,e?.changed===!0)}for(let r of t.querySelectorAll(`[data-review-menu] [data-lifecycle-set]`)){let t=r.dataset.lifecycleSet;r.hidden=!e(t,n,a),r.textContent=s(t,n,a)}}function Aa(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=i(t))}function ja(e){return a(e.dataset)}function Ma(e){return S(e)??null}function Na(e){if(typeof e!=`object`||!e)return null;let{complete:t,lifecycle:n,queued:r,activity:i}=e,a={lifecycle:Ma(n)};if(typeof t==`boolean`&&(a.complete=t),typeof r==`boolean`&&(a.queued=r),i===null)a.activity=null;else{let e=f(i);e&&(a.activity=e)}return a}function Pa(){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 Fa=`The workspace server did not answer. It may have stopped.`;function Ia(t){let n=()=>t.root.querySelector(`[data-review-menu]`),r=!1,i=async(e,n,i)=>{if(r)return{error:null,busy:!0};r=!0;let a=t.gate.begin();try{let r=await t.post(e,n),a=await r.json().catch(()=>null);return r.ok&&a?(Ta(t.root,i(a)),{error:null}):{error:typeof a?.error==`string`?a.error:`That could not be changed.`}}catch{return{error:Fa}}finally{r=!1,a()}},o=e=>i(`/queue`,{action:e},e=>({lifecycle:Ma(e.lifecycle),queued:e.queued===!0}));return{setComplete:e=>i(`/state`,{complete:e},e=>({complete:typeof e.completedAt==`number`,queued:e.queued===!0})),setLifecycle:e=>i(`/lifecycle`,{state:e},e=>({lifecycle:Ma(e.lifecycle),queued:e.queued===!0})),setQueued:o,toggleQueued:()=>o(n()?.hasAttribute(`data-queued`)?`remove`:`add`),checkForUpdates:async()=>{await t.checkForUpdates()},deleteReview:async()=>{try{let e=await t.post(`/delete`);return e.ok?{error:null}:{error:(await e.json().catch(()=>null))?.error??`That could not be deleted.`}}catch{return{error:Fa}}},offer:()=>{let i=n(),o=i?.hasAttribute(`data-can-write`)===!0,s=o&&i?.hasAttribute(`data-branch-actions`)===!0,c=i?S({state:i.dataset.lifecycleState,at:Number(i.dataset.lifecycleAt)}):void 0,l=i?a(i.dataset):void 0,u=t.root.querySelector(`[data-page-status]`)?.dataset.status===`complete`,d=!r;return{reviewed:d&&o&&!u,waiting:d&&s&&e(`waiting`,c,l),done:d&&s&&e(`done`,c,l),queue:d&&s,checkForUpdates:o&&i?.hasAttribute(`data-checkable`)===!0,delete:o}},busy:()=>r}}function La(e,t){return`${e} ${t}${e===1?``:`s`}`}function Ra(e,t){let n=e+t;return{total:n===0?`Nothing chosen`:`${n} chosen`,issues:e?La(e,`issue`):``,questions:t?La(t,`question`):``}}function za(e,t){let n=Ra(e,t);return[n.total,n.issues,n.questions].filter(Boolean).join(` · `)}function Ba(e){return e===0?``:`${e} chosen`}function Va(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(`
|
|
86
|
+
|
|
87
|
+
`)}`:`## ${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,`
|
|
81
88
|
|
|
82
89
|
`)}).join(`
|
|
83
90
|
|
|
84
|
-
`)}`}
|
|
91
|
+
`)}`},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(`
|
|
85
92
|
|
|
86
|
-
`)}var Ra=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>`;Ra(`<path d="m3 17 2 2 4-4M3 7l2 2 4-4M13 6h8M13 12h8M13 18h8"/>`),Ra(`<path d="M20 6 9 17l-5-5"/>`);function za(e){return La({issues:e.issues.map(e=>e.text),questions:e.questions.map(e=>e.text)})}function Ba(){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=Va(t);return n?.basis!==r&&(n={text:za(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(!Ua(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 Va(e){let t=[...e.issues.map(e=>[`issue`,e.id,e.text]),...e.questions.map(e=>[`question`,e.id,e.text])];return JSON.stringify(t.sort((e,t)=>e[0]+`\0`+e[1]<t[0]+`\0`+t[1]?-1:1))}var Ha=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`);function Ua(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.selecting!=`boolean`||!Ha(t.issues)||!Ha(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`],Wa={issue:`issues`,question:`questions`};function Ga({root:e,showView:t}){let n=Ba(),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=Pa(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=Ia(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(mt,t)}let s=()=>({issues:Ka(e,`issue`,n.ids(`issue`)),questions:Ka(e,`question`,n.ids(`question`))}),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 za(s())},prepare(){if(n.total()===0)return;o(n.draft(s));let t=e.querySelector(`[data-feedback-dialog-count]`);t&&(t.textContent=Fa(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){qa(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(mt,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=>Ya(e,t)),a(),c}function Ka(e,t,n){return[...e.querySelectorAll(`[data-view="${Wa[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})=>({id:e,text:t.querySelector(`[data-feedback-source]`)?.getAttribute(`data-feedback-source`)??``}))}function qa(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 Ja(e);let n=e.querySelector(`[data-feedback-text]`);n?.setSelectionRange(0,0),n&&(n.scrollTop=0)}function Ja(e){let t=e.querySelector(`[data-feedback-preview]`),n=e.querySelector(`[data-feedback-text]`)?.value??``;t&&(t.innerHTML=n.trim()?We(n):`<p class="prb-draft-empty">The draft is empty.</p>`,t.scrollTop=0)}function Ya(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(),qa(e,i),e.querySelector(`[data-draft-tab="${i}"]`)?.focus())}function Xa(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 Za(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&&!Xa(t),run:()=>n()?.click()}}}function Qa(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 $a(e){let t=e.getSelection();return!!(t&&!t.isCollapsed&&t.toString()!==``)}function eo(e){let{doc:t}=e,n=ce({doc:t,item:`[data-finding-card]`,walk:()=>Qa(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:()=>Qa(t).length>0,run:()=>n.move(1)},"review.findings.previous":{available:()=>Qa(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:()=>!$a(t)&&a(r())!==null,run:()=>a(r())?.click()},"review.findings.choose":{available:()=>e.selecting()&&o(r()),run:()=>{let t=r();t&&e.flip(t)}}}}}var to=`prb-rail-review`;function no(e){return(e.getElementById(to)?.closest(`.prb-rail-group`)?.querySelector(`a.prb-rail-group-title`))?.dataset.viewNav??null}$i(`progress`,`Review progress`);function ro(e,t=Date.now()){return`Running for ${io(t-e)}`}function io(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 ao={job:`data-job-phase`,kiss:`data-kiss-phase`,update:`data-update-phase`};function oo(e){let t=new Map;for(let n of Object.keys(ao)){let r=ao[n],i=e.querySelector(`[${r}]`);i&&!qi(i.getAttribute(r)??void 0)&&t.set(n,i)}return t}function so(e,t,n){return t.failed?!0:e===`update`?t.phase===`none`||qi(t.phase):co(t.phase,n)}function co(e,t){return qi(e)?!0:(e===`conversation`||e===`analysing`)&&!t.querySelector(`[data-view="files"]`)}function lo(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||Ji(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 uo(e){for(let t of e.querySelectorAll(`[data-started-at]`)){let e=Number(t.dataset.startedAt);Number.isFinite(e)&&(t.textContent=ro(e))}}function fo(e,t=1e3){let n=window.setInterval(()=>uo(e),t);return()=>window.clearInterval(n)}async function po({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`||qi(t))return a()}catch{}await new Promise(e=>setTimeout(e,r))}}function mo(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)}">
|
|
93
|
+
`)}var Ha=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>`;Ha(`<path d="m3 17 2 2 4-4M3 7l2 2 4-4M13 6h8M13 12h8M13 18h8"/>`),Ha(`<path d="M20 6 9 17l-5-5"/>`);function Ua(e){let t=e=>e.ref?{text:e.text,ref:e.ref}:e.text;return Va({issues:e.issues.map(t),questions:e.questions.map(t),...e.reviewTag?{reviewTag:e.reviewTag}:{}})}function Wa(){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=Ga(t);return n?.basis!==r&&(n={text:Ua(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(!qa(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 Ga(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 Ka=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`);function qa(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.selecting!=`boolean`||!Ka(t.issues)||!Ka(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`],Ja={issue:`issues`,question:`questions`};function Ya({root:e,showView:t}){let n=Wa(),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=Ra(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=Ba(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(mt,t)}let s=()=>{let t=e.querySelector(`[data-review-tag]`)?.dataset.reviewTag;return{issues:Xa(e,`issue`,n.ids(`issue`)),questions:Xa(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 Ua(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){Za(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(mt,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=>$a(e,t)),a(),c}function Xa(e,t,n){return[...e.querySelectorAll(`[data-view="${Ja[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(`[${ht}]`),r=n?.getAttribute(gt);return{id:e,text:n?.getAttribute(`data-feedback-source`)??``,...r?{ref:r}:{}}})}function Za(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 Qa(e);let n=e.querySelector(`[data-feedback-text]`);n?.setSelectionRange(0,0),n&&(n.scrollTop=0)}function Qa(e){let t=e.querySelector(`[data-feedback-preview]`),n=e.querySelector(`[data-feedback-text]`)?.value??``;t&&(t.innerHTML=n.trim()?We(n):`<p class="prb-draft-empty">The draft is empty.</p>`,t.scrollTop=0)}function $a(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(),Za(e,i),e.querySelector(`[data-draft-tab="${i}"]`)?.focus())}function eo(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 to(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&&!eo(t),run:()=>n()?.click()}}}function no(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 ro(e){let t=e.getSelection();return!!(t&&!t.isCollapsed&&t.toString()!==``)}function io(e){let{doc:t}=e,n=ce({doc:t,item:`[data-finding-card]`,walk:()=>no(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:()=>no(t).length>0,run:()=>n.move(1)},"review.findings.previous":{available:()=>no(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:()=>!ro(t)&&a(r())!==null,run:()=>a(r())?.click()},"review.findings.choose":{available:()=>e.selecting()&&o(r()),run:()=>{let t=r();t&&e.flip(t)}}}}}var ao=`prb-rail-review`;function oo(e){return(e.getElementById(ao)?.closest(`.prb-rail-group`)?.querySelector(`a.prb-rail-group-title`))?.dataset.viewNav??null}ra(`progress`,`Review progress`);function so(e,t=Date.now()){return`Running for ${co(t-e)}`}function co(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 lo={job:`data-job-phase`,kiss:`data-kiss-phase`,update:`data-update-phase`};function uo(e){let t=new Map;for(let n of Object.keys(lo)){let r=lo[n],i=e.querySelector(`[${r}]`);i&&!Zi(i.getAttribute(r)??void 0)&&t.set(n,i)}return t}function fo(e,t,n){return t.failed?!0:e===`update`?t.phase===`none`||Zi(t.phase):po(t.phase,n)}function po(e,t){return Zi(e)?!0:(e===`conversation`||e===`analysing`)&&!t.querySelector(`[data-view="files"]`)}function mo(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||Qi(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 ho(e){for(let t of e.querySelectorAll(`[data-started-at]`)){let e=Number(t.dataset.startedAt);Number.isFinite(e)&&(t.textContent=so(e))}}function go(e,t=1e3){let n=window.setInterval(()=>ho(e),t);return()=>window.clearInterval(n)}async function _o({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`||Zi(t))return a()}catch{}await new Promise(e=>setTimeout(e,r))}}function vo(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)}">
|
|
87
94
|
<header class="prb-diagram-head">
|
|
88
95
|
<div class="prb-diagram-heading">
|
|
89
96
|
<h4 class="prb-diagram-title">
|
|
@@ -102,70 +109,70 @@ import{$ as e,H as t,L as n,Q as r,U as i,X as a,Y as o,Z as s,a as c,ct as l,d
|
|
|
102
109
|
</div>
|
|
103
110
|
</header>
|
|
104
111
|
${e.caption?`<p class="prb-diagram-caption">${w(e.caption)}</p>`:``}
|
|
105
|
-
${
|
|
112
|
+
${yo(e,n)}
|
|
106
113
|
<div class="prb-diagram-canvas" data-diagram-canvas></div>
|
|
107
114
|
<details class="prb-diagram-source">
|
|
108
115
|
<summary>Diagram source</summary>
|
|
109
116
|
<div class="${ue}"><pre><code data-mermaid-source>${w(e.mermaid)}</code></pre><button type="button" class="${de}" aria-label="Copy code">Copy</button></div>
|
|
110
117
|
</details>
|
|
111
|
-
</article>`}function
|
|
118
|
+
</article>`}function yo(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 bo=.5,xo=3,So=1.25,Co=new WeakSet,wo=new WeakMap,To=new WeakMap,j=null;function Eo(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(()=>{j?.abort()});return}let i=n.closest(`[data-diagram-toggle]`);if(i){zo(i.closest(`[data-diagram-card]`),i.getAttribute(`aria-expanded`)===`true`);return}let a=n.closest(`[data-diagram-zoom]`);if(a){Ho(a.closest(`[data-diagram-card]`),a.dataset.diagramZoom??`reset`);return}let o=n.closest(`[data-diagram-request]`);o?.dataset.diagramKind===`map`?Oo(e):o&&Do(e,o.dataset.diagramRequest||null)}),Mo(),ko(),{drawPane:Bo}}async function Do(e,t){if(j)return;let n=t??`change`,r=document.querySelector(`[data-diagram-pane]`),i=r?.querySelector(`[data-diagram-card="${Xo(n)}"]`)??null??Fo(r,n,t);if(!i)return;No(),e.showDiagrams();let a=Io(i);j=new AbortController,Go(!1);try{let n=await fetch(e.endpoint(`/diagram`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({sectionId:t}),signal:j.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 Lo(i,a,r?.error??`Buddy AI did not return a diagram. Check the terminal running PR Review Buddy.`);Ro(i,r.diagram,t)}catch(e){if(e instanceof DOMException&&e.name===`AbortError`){i.hasAttribute(`data-diagram-pending`)?(i.remove(),No()):a.remove();return}Lo(i,a,`Could not reach PR Review Buddy. The workspace server may have stopped.`)}finally{j=null,Go(!0)}}async function Oo(e){if(j)return;let t=document.querySelector(`[data-map-body]`);if(!t)return;e.showMap();let n=Ao(t),r=t.closest(`[data-map-pane]`);r?.setAttribute(`data-map-running`,``),j=new AbortController,Go(!1);try{let t=await fetch(e.endpoint(`/diagram`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({kind:`map`}),signal:j.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){jo(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),No()}catch(e){if(e instanceof DOMException&&e.name===`AbortError`){n.remove();return}jo(n,`Could not reach PR Review Buddy. The workspace server may have stopped.`)}finally{r?.removeAttribute(`data-map-running`),j=null,Go(!0)}}function ko(){let e=document.querySelector(`[data-map-pane][data-map-running] [data-map-body]`);e&&(Ao(e),Go(!1))}function Ao(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 jo(e,t){e.className=`prb-diagram-failed`,e.textContent=t}function Mo(){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="${Xo(n)}"]`)??Fo(e,n,t);r&&(No(),Io(r,{scroll:!1}),Go(!1))}function No(){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;Po(`map`,t>0),Po(`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 Po(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 Fo(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">
|
|
112
119
|
<div class="prb-diagram-heading">
|
|
113
120
|
<h4 class="prb-diagram-title">Drawing…</h4>
|
|
114
|
-
<p class="prb-diagram-scope">${t===`change`?`Whole change`:
|
|
121
|
+
<p class="prb-diagram-scope">${t===`change`?`Whole change`:Yo(Ko(n))}</p>
|
|
115
122
|
</div>
|
|
116
|
-
</header>`,
|
|
123
|
+
</header>`,qo(e,r,n),r}function Io(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:Zo()?`auto`:`smooth`,block:`start`}),n}function Lo(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 Ro(e,t,n){let r=vo(t,new Map(n?[[n,Ko(n)]]:[]),t.commitSha),i=document.createElement(`div`);i.innerHTML=r;let a=i.firstElementChild;a&&(e.replaceWith(a),No(),Vo(a))}function zo(e,t){e&&(e.toggleAttribute(`data-diagram-collapsed`,t),e.querySelector(`[data-diagram-toggle]`)?.setAttribute(`aria-expanded`,String(!t)),t||Vo(e))}function Bo(){for(let e of document.querySelectorAll(`[data-diagram-pane] [data-diagram-card]`))Vo(e)}async function Vo(e){let t=e.querySelector(`[data-diagram-canvas]`),n=e.querySelector(`[data-mermaid-source]`)?.textContent??``;if(!(!t||!n||Co.has(e)||e.hasAttribute(`data-diagram-collapsed`))){Co.add(e);try{await Vt(t,`prb-mermaid-${Math.random().toString(36).slice(2)}`,n)}catch{Co.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 Ho(e,t){let n=e?.querySelector(`[data-diagram-canvas] svg`),r=e?.querySelector(`[data-diagram-canvas]`);if(!e||!n||!r)return;if(t===`reset`){To.delete(e),r.removeAttribute(`data-zoomed`),n.style.removeProperty(`width`);return}let i=Uo(e,n);if(i<=0)return;let a=Wo((To.get(e)??1)*(t===`in`?So:1/So));To.set(e,a),r.setAttribute(`data-zoomed`,``),n.style.width=`${Math.round(i*a)}px`}function Uo(e,t){let n=wo.get(e);if(n)return n;let r=t.getBoundingClientRect().width;if(r>0)return wo.set(e,r),r;let i=t.getAttribute(`viewBox`)?.split(/[\s,]+/),a=Number(i?.[2]??0);return Number.isFinite(a)?a:0}function Wo(e){return Math.min(xo,Math.max(bo,e))}function Go(e){for(let t of document.querySelectorAll(`[data-diagram-request]`))t.disabled=!e}function Ko(e){return e?document.querySelector(`[data-goto-section="${Xo(e)}"]`)?.querySelector(`.prb-rail-title`)?.textContent?.trim()||`A theme of this change`:`Whole change`}function qo(e,t,n){let r=Jo(n);for(let n of e.querySelectorAll(`[data-diagram-card]`)){let e=n.dataset.diagramCard??``;if(Jo(e===`change`?null:e)>r){n.before(t);return}}e.appendChild(t)}function Jo(e){if(!e)return-1;let t=document.querySelector(`[data-goto-section="${Xo(e)}"]`);return Number(t?.dataset.themeIndex??0)}function Yo(e){let t=document.createElement(`span`);return t.textContent=e,t.innerHTML}function Xo(e){return CSS.escape(e)}function Zo(){return window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}var Qo=[`intent`,`actor`,`concept`,`state`,`constraint`,`risk`,`outcome`],$o=[`Intent`,`Behaviour`,`Shared state`,`Risks & constraints`,`Outcome`],M={mapTitle:100,intent:320,title:80,body:220,why:160,anchor:80,label:48,note:200},es={intent:0,concept:1,actor:2,state:2,constraint:3,risk:3,outcome:4};function ts(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}=ns(t.nodes);return{schemaVersion:1,title:cs(D(t.title).trim(),M.mapTitle)||`Change map`,intent:is(t.intent,M.intent)??{simple:``,technical:``},nodes:n,edges:rs(t.edges,r)}}function ns(e){let t=new Map,n=new Set,r=[];for(let i of e){if(typeof i!=`object`||!i)continue;let e=i,a=is(e.title,M.title);if(!a)continue;let o=D(e.id).trim()||a.technical;if(t.has(o))continue;let s=ss(os(o)||`n${r.length+1}`,n);t.set(o,s),n.add(s);let c=Qo.includes(e.role)?e.role:`concept`,l=is(e.why,M.why),u=cs(D(e.anchor).trim(),M.anchor),d=D(e.sectionId).trim();r.push({id:s,role:c,stage:as(e.stage,c),weight:e.weight===`primary`?`primary`:`supporting`,title:a,body:is(e.body,M.body)??{simple:``,technical:``},...l?{why:l}:{},...u?{anchor:u}:{},...d?{sectionId:d}:{}})}return{nodes:r,ids:t}}function rs(e,t){if(!Array.isArray(e))return[];let n=[];for(let r of e){if(typeof r!=`object`||!r)continue;let e=r,i=is(e.label,M.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=is(e.note,M.note);n.push({from:a,to:o,label:i,...s?{note:s}:{}})}return n}function is(e,t){if(typeof e==`string`){let n=cs(e.trim(),t);return n?{simple:n,technical:n}:null}if(typeof e!=`object`||!e)return null;let n=e,r=cs(D(n.simple).trim(),t),i=cs(D(n.technical).trim(),t);return!r&&!i?null:{simple:r||i,technical:i||r}}function as(e,t){return typeof e==`number`&&Number.isInteger(e)&&e>=0&&e<=4?e:es[t]}function os(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,40)}function ss(e,t){if(!t.has(e))return e;let n=2;for(;t.has(`${e}-${n}`);)n+=1;return`${e}-${n}`}function cs(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 ls(e,t){try{return us(ts(e),t).map}catch{return null}}function us(e,t){let n={droppedNodes:0,droppedEdges:0,withdrawnSections:0,demotedPrimaries:0},r=ps(ds(e.nodes,n).map(e=>fs(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:ms(r),edges:o},audit:n}}function ds(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 fs(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 ps(e,t){let n=0;return e.map(e=>e.weight!==`primary`||(n+=1,n<=3)?e:(t.demotedPrimaries+=1,{...e,weight:`supporting`}))}function ms(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?ls(t,n.map(e=>e.id)):null,o=!!(a&&t?.commitSha&&r&&t.commitSha!==r);if(!a||!t||o)return gs(o);let s=new Map(n.map(e=>[e.id,e.title]));return`<div class="prb-map" data-change-map data-register="${i}">
|
|
117
124
|
<header class="prb-map-head">
|
|
118
125
|
<div class="prb-map-heading">
|
|
119
126
|
<h4 class="prb-map-title">${w(a.title)}</h4>
|
|
120
|
-
${a.intent.simple||a.intent.technical?`<p class="prb-map-intent">${
|
|
127
|
+
${a.intent.simple||a.intent.technical?`<p class="prb-map-intent">${N(a.intent)}</p>`:``}
|
|
121
128
|
</div>
|
|
122
129
|
<div class="prb-map-tools">
|
|
123
|
-
${
|
|
130
|
+
${_s(i)}
|
|
124
131
|
<button type="button" class="prb-diagram-redraw" data-diagram-request="" data-diagram-kind="map">Regenerate</button>
|
|
125
132
|
</div>
|
|
126
133
|
</header>
|
|
127
134
|
<p class="prb-map-hint">Read from the goal to the outcome. Select an idea to see what it connects to.</p>
|
|
128
|
-
${
|
|
129
|
-
${
|
|
130
|
-
</div>`}function
|
|
135
|
+
${vs(a,s)}
|
|
136
|
+
${Ss(a)}
|
|
137
|
+
</div>`}function gs(e){return`<div class="prb-map-empty" data-change-map-empty>
|
|
131
138
|
${e?`<p class="prb-map-stale">The review has moved on since the last map was drawn.</p>`:``}
|
|
132
139
|
<h4 class="prb-map-empty-title">See the change as a map</h4>
|
|
133
140
|
<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>
|
|
134
141
|
<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>
|
|
135
142
|
<button type="button" class="prb-map-generate" data-diagram-request="" data-diagram-kind="map">Generate change map</button>
|
|
136
|
-
</div>`}function
|
|
137
|
-
<h5 class="prb-map-stage-title">${w(
|
|
138
|
-
${e.nodes.filter(e=>e.stage===n).sort((e,t)=>Number(t.weight===`primary`)-Number(e.weight===`primary`)).map(n=>
|
|
139
|
-
</div>`).join(``),i=e.edges.map((e,t)=>
|
|
143
|
+
</div>`}function _s(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 vs(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}">
|
|
144
|
+
<h5 class="prb-map-stage-title">${w($o[n]??``)}</h5>
|
|
145
|
+
${e.nodes.filter(e=>e.stage===n).sort((e,t)=>Number(t.weight===`primary`)-Number(e.weight===`primary`)).map(n=>bs(n,t,e)).join(``)}
|
|
146
|
+
</div>`).join(``),i=e.edges.map((e,t)=>xs(e,t)).join(``);return`<div class="prb-map-board" data-map-board style="--prb-map-stages: ${n.length}">
|
|
140
147
|
<svg class="prb-map-edges" data-map-edges aria-hidden="true" focusable="false"></svg>
|
|
141
148
|
${r}
|
|
142
149
|
<div class="prb-map-labels" aria-hidden="true">${i}</div>
|
|
143
|
-
</div>`}var
|
|
144
|
-
<p class="prb-map-role">${
|
|
145
|
-
<h5 class="prb-map-node-title" id="prb-map-node-${r}">${
|
|
146
|
-
${e.body.simple||e.body.technical?`<p class="prb-map-node-body">${
|
|
147
|
-
${e.why?`<p class="prb-map-why"><span class="prb-map-why-lead">Why it matters:</span> ${
|
|
150
|
+
</div>`}var ys={intent:`Goal`,actor:`Actor`,concept:`Idea`,state:`Shared state`,constraint:`Rule`,risk:`Risk`,outcome:`Outcome`};function bs(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>${N(e.label)}</em> <span aria-hidden="true">→</span> ${N(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}">
|
|
151
|
+
<p class="prb-map-role">${ys[e.role]}${e.weight===`primary`?`<span class="prb-map-core"> · Core idea</span>`:``}</p>
|
|
152
|
+
<h5 class="prb-map-node-title" id="prb-map-node-${r}">${N(e.title)}</h5>
|
|
153
|
+
${e.body.simple||e.body.technical?`<p class="prb-map-node-body">${N(e.body)}</p>`:``}
|
|
154
|
+
${e.why?`<p class="prb-map-why"><span class="prb-map-why-lead">Why it matters:</span> ${N(e.why)}</p>`:``}
|
|
148
155
|
${e.anchor?`<code class="prb-map-anchor">${w(e.anchor)}</code>`:``}
|
|
149
156
|
${o?`<ul class="prb-map-inline" aria-hidden="true">${o}</ul>`:``}
|
|
150
157
|
${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>`:``}
|
|
151
|
-
</article>`}function
|
|
158
|
+
</article>`}function xs(e,t){return`<span class="prb-map-label" data-map-edge="${t}" data-from="${w(e.from)}" data-to="${w(e.to)}">${N(e.label)}</span>`}function Ss(e){let t=new Map(e.nodes.map(e=>[e.id,e.title]));return`<details class="prb-map-list">
|
|
152
159
|
<summary>Read as a list</summary>
|
|
153
|
-
<ol>${e.edges.map(e=>{let n=t.get(e.from),r=t.get(e.to);return!n||!r?``:`<li><strong>${
|
|
154
|
-
</details>`}function j(e){return e.simple===e.technical?le(e.simple):`<span data-reg="simple">${le(e.simple)}</span><span data-reg="technical">${le(e.technical)}</span>`}var bs=`http://www.w3.org/2000/svg`,xs=new WeakSet,Ss=new WeakMap;function Cs(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){Ls(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&&Is(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&&Is(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`)&&(Is(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:ws,show:Ts}}function ws(){for(let e of document.querySelectorAll(`[data-map-board]`))Es(e),Ds(e)}function Ts(e){let t=document.querySelector(`[data-map-body]`);t&&(t.innerHTML=fs({stored:e,sections:zs(),reviewedSha:e.commitSha,register:Rs()}),ws())}function Es(e){if(xs.has(e)||typeof ResizeObserver>`u`)return;xs.add(e);let t=!1;new ResizeObserver(()=>{t||(t=!0,requestAnimationFrame(()=>{t=!1,Ds(e)}))}).observe(e)}function Ds(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(Fs());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?Os(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=Ss.get(e),_=g&&g.width===h?g.edges:new Set;Ss.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=ks(n,i.from,d(e.dataset.from??``,i.from,a,n)),c=ks(r,i.to,d(e.dataset.to??``,i.to,a,r)),l=js(s,i.from,c,i.to),[u,h,g,ee]=l,te=m.filter(e=>e!==n&&e!==r);if(Array.from({length:19},(e,t)=>Ms(l,.05+t*.05)).some(e=>te.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 y=document.createElementNS(bs,`path`);y.setAttribute(`d`,`M${Ps(u.x)},${Ps(u.y)} C${Ps(h.x)},${Ps(h.y)} ${Ps(g.x)},${Ps(g.y)} ${Ps(ee.x)},${Ps(ee.y)}`),y.setAttribute(`class`,`prb-map-edge`),y.setAttribute(`marker-end`,`url(#prb-map-arrow)`),y.dataset.mapEdge=e.dataset.mapEdge??``,y.dataset.from=e.dataset.from??``,y.dataset.to=e.dataset.to??``,t.appendChild(y),e.hidden=!1;let b=e.offsetWidth,x=e.offsetHeight,S=[.5,.4,.6,.3,.7,.22,.78].map(e=>{let t=Ms(l,e);return{left:t.x-b/2,top:t.y-x/2,right:t.x+b/2,bottom:t.y+x/2}}).find(e=>![...m,...p,...f].some(t=>Ns(e,t,2)));if(!S){y.remove(),e.hidden=!0,v(o,!0);return}v(o,!1),f.push(S),e.style.left=`${Math.round(S.left)}px`,e.style.top=`${Math.round(S.top)}px`}),e.setAttribute(`data-laid-out`,``)}function Os(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 ks(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 As={top:{x:0,y:-1},bottom:{x:0,y:1},left:{x:-1,y:0},right:{x:1,y:0}};function js(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=As[t],s=As[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 Ms([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 Ns(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 Ps(e){return Math.round(e*10)/10}function Fs(){let e=document.createElementNS(bs,`defs`),t=document.createElementNS(bs,`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(bs,`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 Is(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 Ls(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));ws(),fetch(t.endpoint(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({changeMapRegister:e})}).catch(()=>{})}function Rs(){return document.querySelector(`[data-map-pane]`)?.dataset.mapRegister===`technical`?`technical`:`simple`}function zs(){return[...document.querySelectorAll(`[data-goto-section][data-theme-index]`)].map(e=>({id:e.dataset.gotoSection??``,title:e.querySelector(`.prb-rail-title`)?.textContent?.trim()??``}))}var Bs=`repository`,Vs={minCharacters:8,maxLines:3,maxCharacters:400},Hs=[`app`,`service`,`component`,`store`,`external`,`group`],Us=/^[a-z][a-z0-9-]*$/;function Ws(e){let t=[];if(!$s(e))return{ok:!1,errors:[`The architecture must be a JSON object.`]};tc(e,[`schema`,`title`,`summary`,`nodes`,`relationships`],`architecture`,t);let n=ec(e,[`summary`],`architecture`,t);n.schema!==2&&t.push(`architecture.schema must be 2.`);let r=nc(n.title,`architecture.title`,t),i=rc(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=Ks(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=>$s(e)&&typeof e.id==`string`&&Us.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)Gs(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=qs(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)&&(Gs(a,c).includes(d)||Gs(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 Gs(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 Ks(e,t,n){if(!$s(e))return n.push(`${t} must be an object.`),null;tc(e,[`id`,`name`,`kind`,`parent`,`description`,`owns`,`evidence`],t,n);let r=ec(e,[`parent`,`description`,`owns`],t,n),i=ic(r.id,`${t}.id`,n);i===`repository`&&n.push(`${t}.id must not be "${Bs}": that name is kept for the whole repository. Choose another id.`);let a=nc(r.name,`${t}.name`,n),o=Hs.find(e=>e===r.kind);o||n.push(`${t}.kind must be one of ${Hs.join(`, `)}.`);let s=r.parent===void 0?void 0:ic(r.parent,`${t}.parent`,n),c=rc(r.description,`${t}.description`,n),l=r.owns===void 0?void 0:Js(r.owns,`${t}.owns`,n),u=Ys(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 qs(e,t,n){if(!$s(e))return n.push(`${t} must be an object.`),null;tc(e,[`id`,`source`,`target`,`label`,`description`,`evidence`,`confidence`],t,n);let r=ec(e,[`description`,`confidence`],t,n),i=ic(r.id,`${t}.id`,n),a=ic(r.source,`${t}.source`,n),o=ic(r.target,`${t}.target`,n),s=nc(r.label,`${t}.label`,n),c=rc(r.description,`${t}.description`,n),l=Ys(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 Js(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=nc(e,`${t}[${i}]`,n);a!==null&&(!Qs(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 Ys(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(!$s(e)){n.push(`${a} must be an object.`);return}tc(e,[`path`,`quote`,`symbol`,`line`,`note`],a,n),e=ec(e,[`symbol`,`line`,`note`],a,n);let o=nc(e.path,`${a}.path`,n);o!==null&&!Qs(o)&&n.push(`${a}.path must be relative to the repository, with forward slashes and no "..".`);let s=Xs(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=ac(e.line,`${a}.line`,n),u=rc(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 Xs(e,t,n){if(typeof e!=`string`||!e.trim())return n.push(`${t} must be one to ${Vs.maxLines} lines copied from the file.`),null;let r=e.replace(/^\s*\n|\n\s*$/g,``),i=Zs(r);return r.split(`
|
|
155
|
-
`).length>
|
|
156
|
-
`),nodes:r,edges:u}}function
|
|
160
|
+
<ol>${e.edges.map(e=>{let n=t.get(e.from),r=t.get(e.to);return!n||!r?``:`<li><strong>${N(n)}</strong> <em>${N(e.label)}</em> <strong>${N(r)}</strong>${e.note?`<span class="prb-map-note"> — ${N(e.note)}</span>`:``}</li>`}).join(``)}</ol>
|
|
161
|
+
</details>`}function N(e){return e.simple===e.technical?le(e.simple):`<span data-reg="simple">${le(e.simple)}</span><span data-reg="technical">${le(e.technical)}</span>`}var Cs=`http://www.w3.org/2000/svg`,ws=new WeakSet,Ts=new WeakMap;function Es(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){Bs(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&&zs(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&&zs(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`)&&(zs(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:Ds,show:Os}}function Ds(){for(let e of document.querySelectorAll(`[data-map-board]`))ks(e),As(e)}function Os(e){let t=document.querySelector(`[data-map-body]`);t&&(t.innerHTML=hs({stored:e,sections:Hs(),reviewedSha:e.commitSha,register:Vs()}),Ds())}function ks(e){if(ws.has(e)||typeof ResizeObserver>`u`)return;ws.add(e);let t=!1;new ResizeObserver(()=>{t||(t=!0,requestAnimationFrame(()=>{t=!1,As(e)}))}).observe(e)}function As(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(Rs());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?js(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=Ts.get(e),_=g&&g.width===h?g.edges:new Set;Ts.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=Ms(n,i.from,d(e.dataset.from??``,i.from,a,n)),c=Ms(r,i.to,d(e.dataset.to??``,i.to,a,r)),l=Ps(s,i.from,c,i.to),[u,h,g,ee]=l,te=m.filter(e=>e!==n&&e!==r);if(Array.from({length:19},(e,t)=>Fs(l,.05+t*.05)).some(e=>te.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 y=document.createElementNS(Cs,`path`);y.setAttribute(`d`,`M${Ls(u.x)},${Ls(u.y)} C${Ls(h.x)},${Ls(h.y)} ${Ls(g.x)},${Ls(g.y)} ${Ls(ee.x)},${Ls(ee.y)}`),y.setAttribute(`class`,`prb-map-edge`),y.setAttribute(`marker-end`,`url(#prb-map-arrow)`),y.dataset.mapEdge=e.dataset.mapEdge??``,y.dataset.from=e.dataset.from??``,y.dataset.to=e.dataset.to??``,t.appendChild(y),e.hidden=!1;let b=e.offsetWidth,x=e.offsetHeight,S=[.5,.4,.6,.3,.7,.22,.78].map(e=>{let t=Fs(l,e);return{left:t.x-b/2,top:t.y-x/2,right:t.x+b/2,bottom:t.y+x/2}}).find(e=>![...m,...p,...f].some(t=>Is(e,t,2)));if(!S){y.remove(),e.hidden=!0,v(o,!0);return}v(o,!1),f.push(S),e.style.left=`${Math.round(S.left)}px`,e.style.top=`${Math.round(S.top)}px`}),e.setAttribute(`data-laid-out`,``)}function js(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 Ms(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 Ns={top:{x:0,y:-1},bottom:{x:0,y:1},left:{x:-1,y:0},right:{x:1,y:0}};function Ps(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=Ns[t],s=Ns[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 Fs([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 Is(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 Ls(e){return Math.round(e*10)/10}function Rs(){let e=document.createElementNS(Cs,`defs`),t=document.createElementNS(Cs,`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(Cs,`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 zs(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 Bs(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));Ds(),fetch(t.endpoint(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({changeMapRegister:e})}).catch(()=>{})}function Vs(){return document.querySelector(`[data-map-pane]`)?.dataset.mapRegister===`technical`?`technical`:`simple`}function Hs(){return[...document.querySelectorAll(`[data-goto-section][data-theme-index]`)].map(e=>({id:e.dataset.gotoSection??``,title:e.querySelector(`.prb-rail-title`)?.textContent?.trim()??``}))}var Us=`repository`,Ws={minCharacters:8,maxLines:3,maxCharacters:400},Gs=[`app`,`service`,`component`,`store`,`external`,`group`],Ks=/^[a-z][a-z0-9-]*$/;function qs(e){let t=[];if(!nc(e))return{ok:!1,errors:[`The architecture must be a JSON object.`]};ic(e,[`schema`,`title`,`summary`,`nodes`,`relationships`],`architecture`,t);let n=rc(e,[`summary`],`architecture`,t);n.schema!==2&&t.push(`architecture.schema must be 2.`);let r=ac(n.title,`architecture.title`,t),i=oc(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=Ys(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=>nc(e)&&typeof e.id==`string`&&Ks.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)Js(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=Xs(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)&&(Js(a,c).includes(d)||Js(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 Js(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 Ys(e,t,n){if(!nc(e))return n.push(`${t} must be an object.`),null;ic(e,[`id`,`name`,`kind`,`parent`,`description`,`owns`,`evidence`],t,n);let r=rc(e,[`parent`,`description`,`owns`],t,n),i=sc(r.id,`${t}.id`,n);i===`repository`&&n.push(`${t}.id must not be "${Us}": that name is kept for the whole repository. Choose another id.`);let a=ac(r.name,`${t}.name`,n),o=Gs.find(e=>e===r.kind);o||n.push(`${t}.kind must be one of ${Gs.join(`, `)}.`);let s=r.parent===void 0?void 0:sc(r.parent,`${t}.parent`,n),c=oc(r.description,`${t}.description`,n),l=r.owns===void 0?void 0:Zs(r.owns,`${t}.owns`,n),u=Qs(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 Xs(e,t,n){if(!nc(e))return n.push(`${t} must be an object.`),null;ic(e,[`id`,`source`,`target`,`label`,`description`,`evidence`,`confidence`],t,n);let r=rc(e,[`description`,`confidence`],t,n),i=sc(r.id,`${t}.id`,n),a=sc(r.source,`${t}.source`,n),o=sc(r.target,`${t}.target`,n),s=ac(r.label,`${t}.label`,n),c=oc(r.description,`${t}.description`,n),l=Qs(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 Zs(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=ac(e,`${t}[${i}]`,n);a!==null&&(!tc(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 Qs(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(!nc(e)){n.push(`${a} must be an object.`);return}ic(e,[`path`,`quote`,`symbol`,`line`,`note`],a,n),e=rc(e,[`symbol`,`line`,`note`],a,n);let o=ac(e.path,`${a}.path`,n);o!==null&&!tc(o)&&n.push(`${a}.path must be relative to the repository, with forward slashes and no "..".`);let s=$s(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=cc(e.line,`${a}.line`,n),u=oc(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 $s(e,t,n){if(typeof e!=`string`||!e.trim())return n.push(`${t} must be one to ${Ws.maxLines} lines copied from the file.`),null;let r=e.replace(/^\s*\n|\n\s*$/g,``),i=ec(r);return r.split(`
|
|
162
|
+
`).length>Ws.maxLines||r.length>Ws.maxCharacters?(n.push(`${t} must be at most ${Ws.maxLines} lines and ${Ws.maxCharacters} characters.`),null):i.length<Ws.minCharacters?(n.push(`${t} "${i}" is too short to find again; quote at least ${Ws.minCharacters} characters.`),null):r}function ec(e){return e.replace(/\s+/g,` `).trim()}function tc(e){return!e.startsWith(`/`)&&!e.includes(`\\`)&&!e.split(`/`).includes(`..`)}function nc(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function rc(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 ic(e,t,n,r){for(let i of Object.keys(e))t.includes(i)||r.push(`${n} has an unknown field "${i}".`)}function ac(e,t,n){return typeof e==`string`&&e.trim()?e.trim():(n.push(`${t} must be a non-empty string.`),null)}function oc(e,t,n){if(e!==void 0)return ac(e,t,n)??void 0}function sc(e,t,n){if(typeof e==`string`&&Ks.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 cc(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 lc(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,...Js(t,n)],i=e=>t!==null&&Js(e,n).includes(t),a=e=>{let a=[e,...Js(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 uc={app:[`(["`,`"])`],service:[`["`,`"]`],component:[`("`,`")`],store:[`[("`,`")]`],external:[`["`,`"]`],group:[`[["`,`"]]`]};function dc(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 fc(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]=uc[e.kind],r=e.detail?`${dc(e.name)}<br>${dc(e.detail)}`:dc(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["${dc(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}|"${dc(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(`
|
|
163
|
+
`),nodes:r,edges:u}}function pc(e,t=[null]){let n=new Map(e.nodes.map(e=>[e.id,e]));return`${t.map((t,r)=>{let i=lc(e,t),a=r===0&&t===null?`# ${mc(e.title)}`:`## ${mc(i.title)}`,o=t===null?e.summary:n.get(t)?.description,s=fc(i,{edgeIds:!1}).source;return[a,...o?[mc(o)]:[],["```mermaid",s,"```"].join(`
|
|
157
164
|
`)].join(`
|
|
158
165
|
|
|
159
166
|
`)}).join(`
|
|
160
167
|
|
|
161
|
-
`)}\n`}function
|
|
162
|
-
`),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
|
|
168
|
+
`)}\n`}function mc(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 gc(e){return hc[e.stage]}var _c={app:`Application`,service:`Service`,component:`Component`,store:`Store`,external:`External system`,group:`Group`},vc=5e3;function yc(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&&xc(e,n,n.dataset.architectureMap||`repository`);let r=t.target.closest(`[data-architecture-stop]`);r&&Sc(e,r,r.dataset.architectureStop||`repository`)}),wc(e,()=>{r()?bc():n=!0});async function i(){if(n)return bc();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 kc(r,`The architecture could not be read.`)}let s=qs(o.architecture);if(!s.ok)return kc(r,`The architecture could not be read.`);let c={scope:Us,architecture:s.architecture,evidence:o.evidence??{}},l=new Map;for(let[e,t]of Object.entries(o.deeper??{})){let n=qs(t.architecture);n.ok&&l.set(e,{scope:e,architecture:n.architecture,evidence:t.evidence,...t.changed?{changed:t.changed}:{}})}let u=new Ec({canvas:r,inspector:i,trail:e.querySelector(`[data-architecture-trail]`),repository:c,deeper:l,embedded:o}),d=u.draw(c);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&&Tc(r,c,l)}),d}return{show:i}}function bc(){let e=gr(window.location.hash,`architecture`);window.location.hash!==e&&window.history.replaceState(window.history.state,``,e),window.location.reload()}async function xc(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 bc();Cc(t,(await r.json().catch(()=>null))?.error??`Mapping could not start.`)}catch{Cc(t,`Could not reach PR Review Buddy. The workspace server may have stopped.`)}t.disabled=!1}}async function Sc(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 bc();Cc(t,`Mapping could not be stopped.`)}catch{Cc(t,`Could not reach PR Review Buddy. The workspace server may have stopped.`)}t.disabled=!1}}function Cc(e,t){let n=P(`p`,`prb-arch-error`,t);n.setAttribute(`data-architecture-error`,``),n.setAttribute(`role`,`alert`),e.after(n)}function wc(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}=gc(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(),vc)};window.setTimeout(()=>void r(),vc)}async function Tc(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=>pc(e.architecture,[null,...r(e.architecture)])).join(`
|
|
169
|
+
`),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 Ec=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 kc(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&&Oc(i,e.architecture,t,c,this.base()),this.hint()},affected:new Set(a.touched?.[e.scope]??[])}),t===null?i&&Oc(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),kc(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(...Dc(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;Ac(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=Dc(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 Dc(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 Oc(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?[]:[...Js(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 kc(e,t){let n=document.createElement(`p`);n.className=`prb-arch-status`,n.textContent=t,e.replaceChildren(n)}function Ac(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`,`${_c[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(jc(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(jc(e.evidence,t.evidence[e.id])),c.push(n)}e.replaceChildren(...c)}function jc(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}var Mc=5e3;function Nc(e,t=document,n=window){let r=()=>t.visibilityState===`visible`,i=async()=>{try{v(t,(await(await e.markSeen()).json()).unread)}catch{}},a=async()=>{try{if(r()){let n=await(await e.askUnread()).json();typeof n.here==`number`&&n.here>0&&r()?await i():v(t,n.unread)}}catch{}n.setTimeout(()=>void a(),Mc)};t.addEventListener(`visibilitychange`,()=>{r()&&i()}),r()&&i(),n.setTimeout(()=>void a(),Mc)}function Pc(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}var Fc=1e3,Ic=new WeakMap;function Lc(e,t){return e.length<=1e3?Pc(e)||` `:`${Pc(e.slice(0,Fc))}\u2026 <button type="button" class="prb-code-long-toggle" data-full-line="${t}">Show full line</button>`}function Rc(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">${Lc(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?Rc(c):``}<tr class="${s}" data-line="${o}"><td class="prb-code-num">${o}</td><td class="prb-code-line">${Lc(i,`new:${o}`)}</td></tr>`}),a=r.get(e.totalLines+1);return a&&e.to===e.totalLines&&i.push(Rc(a)),i.join(``)}function Bc(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 Vc(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&&Ic.set(r,o)}}function Hc(e){let t=Ic.get(e),n=e.closest(`td`);return t===void 0||!n?null:(n.textContent=t,n)}function Uc(e){return e.deletion?2*e.line-1:2*e.line}function Wc(e){return e%2==1?{line:(e+1)/2,deletion:!0}:{line:e/2,deletion:!1}}function Gc(e,t){if(e.length===0)return``;let n=e.map(Uc),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}">
|
|
163
170
|
<button type="button" class="prb-code-nav-step" data-change-step="previous"${i?``:` disabled`}>\u2191 Previous</button>
|
|
164
171
|
<span class="prb-code-nav-count" aria-live="polite">${s}</span>
|
|
165
172
|
<button type="button" class="prb-code-nav-step" data-change-step="next"${a?``:` disabled`}>Next \u2193</button>
|
|
166
|
-
</span>`}function Uc(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:Vc(i)}}function Wc(e,t){return e.querySelector(t.deletion?`tr[data-before-line="${t.line}"]`:`tr[data-line="${t.line}"]`)}function Gc(e){return(e.dataset.changeKeys??``).split(`,`).filter(Boolean).map(Number).map(Vc)}function Kc(e){if(!e)return;let t=Number(e.dataset.changePosition)||0;return(e.dataset.changeKeys??``).split(`,`).filter(Boolean).map(Number).includes(t)?Vc(t):void 0}function qc(e,t){return Math.max(e,+!t)+1}var Jc=8;function Yc(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 Xc(e){let t=e.panel-e.scroller;return Math.max(340,Math.floor(e.pane-t-16))}function Zc(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 Qc(e,t){let n=t.row.getBoundingClientRect().top-e.getBoundingClientRect().top-t.offset;e.scrollTop+=n}function $c(e){if(!e.hasAttribute(`data-expanded`))return;let t=Yc(e),n=e.querySelector(`.prb-code-scroll`);if(!t||!n)return;let r=Xc({pane:t.clientHeight,panel:e.offsetHeight,scroller:n.offsetHeight});e.style.setProperty(`--prb-code-expanded`,`${r}px`)}function el(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 tl=!1;function nl(){tl||(tl=!0,window.addEventListener(`resize`,()=>{for(let e of document.querySelectorAll(`.prb-code[data-expanded]`))$c(e)}))}function rl(e,t){let n=e.querySelector(`.prb-code-scroll`),r=n?Zc(n):null;t?(e.setAttribute(`data-expanded`,``),$c(e),nl()):(e.removeAttribute(`data-expanded`),e.style.removeProperty(`--prb-code-expanded`)),el(e),n&&r&&Qc(n,r);let i=t?Yc(e):null;i&&(i.scrollTop+=e.getBoundingClientRect().top-i.getBoundingClientRect().top-Jc)}var il={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.`]},al=[{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`}],ol=`#tour`,N=16,P=6,sl=380,cl=260;function ll(e){return e.querySelector(`.prb-rail[data-stale]`)?[]:al.filter(t=>e.querySelector(t.target.from)&&(!t.target.to||e.querySelector(t.target.to)))}function ul(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 dl(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 fl(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 pl(e,t){let n=[];if(t===`rail`){let t=e.documentElement;n.push(fl(t,[`data-sidebar-hidden`,`data-sidebar-peek`])),t.removeAttribute(`data-sidebar-hidden`),t.hasAttribute(`data-sidebar-compact`)&&t.setAttribute(`data-sidebar-peek`,``);let r=e.getElementById(`prb-rail-review`);r?.hidden&&(n.push(()=>{r.hidden=!0}),r.hidden=!1)}if(t===`ask`){let t=e.querySelector(`.prb-body`);t&&t.getAttribute(`data-ask`)!==`open`&&(n.push(fl(t,[`data-ask`])),t.setAttribute(`data-ask`,`open`))}return()=>{for(let e of n.reverse())e()}}function ml(e,t,n){let r=e.createElement(`button`);return r.type=`button`,r.className=t,r.textContent=n,r}function hl(e,t,n){let r=ll(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=ml(e,`prb-tour-skip`,`Skip tour`),h=ml(e,`prb-tour-back`,`Back`),g=ml(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,ee=()=>{},te=!1,y=()=>{let n=r[v],i=n?e.querySelector(n.target.from):null,a=i?dl(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>=cl?Math.min(sl,f):Math.min(sl,u-32)}px`;let p=l.getBoundingClientRect(),m=ul(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`},b=(t,n)=>{ee(),ee=()=>{},v=t;let i=r[v];if(s.toggleAttribute(`data-welcome`,!i),i){ee=pl(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:il.title,p.replaceChildren(...(i?i.body:il.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`,y(),g.focus({focusVisible:n})},x=r=>{if(!te){te=!0,ee(),t.removeEventListener(`resize`,y),e.removeEventListener(`scroll`,y,!0),e.removeEventListener(`transitionend`,y,!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?x(`completed`):b(v+1,e.detail===0)),h.addEventListener(`click`,e=>b(v-1,e.detail===0)),m.addEventListener(`click`,()=>x(`dismissed`)),s.addEventListener(`cancel`,()=>x(`dismissed`)),s.addEventListener(`close`,()=>x(`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`,y),e.addEventListener(`scroll`,y,!0),e.addEventListener(`transitionend`,y,!0),s.showModal(),b(-1,!1),{close:()=>x(`dismissed`)}}var gl={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 _l(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=gl[t];let o=e.createElement(`div`);o.className=`prb-dialog-actions`;let s=ml(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 vl(e,t,n){let r=e.body.hasAttribute(`data-tour-busy`)||e.querySelector(`.prb-rail[data-stale]`)!==null?`busy`:hl(e,t,{mode:`replay`,host:n})?null:`empty`;return r?(_l(e,r),r):`started`}var yl={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 bl(e){let t=e.slice(e.lastIndexOf(`/`)+1);if(t===`Dockerfile`||t.startsWith(`Dockerfile.`))return`docker`;let n=t.lastIndexOf(`.`);return n<=0?null:yl[t.slice(n+1).toLowerCase()]??null}function xl(e){let t=new Set;for(let n of e){let e=bl(n);e&&t.add(e)}return[...t]}var Sl={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`),[])},Cl=`github-light-default`,wl=null,Tl=new Map;function El(){return wl??=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),wl}function Dl(e){let t=Tl.get(e);return t||(t=El().then(async t=>t?(await t.loadLanguage(Sl[e]),!0):!1).catch(()=>!1),Tl.set(e,t)),t.then(e=>e?El():null)}var Ol={async preload(e){await Dl(e)},async tokenize(e,t){let n=await Dl(t);if(!n)return null;try{let{tokens:r,fg:i}=n.codeToTokens(e,{lang:t,theme:Cl}),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 kl(e,t=Ol){return Promise.all(e.map(e=>t.preload(e))).then(()=>void 0)}var Al=/^#[0-9a-f]{3,8}$/i;function jl(e,t){return!t||t.map(e=>e.content).join(``)!==e?null:t.map(e=>e.color&&Al.test(e.color)?`<span style="color:${e.color}">${jc(e.content)}</span>`:jc(e.content)).join(``)}function Ml(e){return e.length>1e3?e.slice(0,Mc):e}function Nl(e,t,n){if(!e||t===``)return;let r=jl(Ml(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 Pl(e,t,n=Ol){let r=bl(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(Ml).join(`
|
|
167
|
-
`),r);if(a()){o&&t.lines.forEach((e,n)=>{
|
|
168
|
-
`),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;
|
|
173
|
+
</span>`}function Kc(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:Wc(i)}}function qc(e,t){return e.querySelector(t.deletion?`tr[data-before-line="${t.line}"]`:`tr[data-line="${t.line}"]`)}function Jc(e){return(e.dataset.changeKeys??``).split(`,`).filter(Boolean).map(Number).map(Wc)}function Yc(e){if(!e)return;let t=Number(e.dataset.changePosition)||0;return(e.dataset.changeKeys??``).split(`,`).filter(Boolean).map(Number).includes(t)?Wc(t):void 0}function Xc(e,t){return Math.max(e,+!t)+1}var Zc=8;function Qc(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 $c(e){let t=e.panel-e.scroller;return Math.max(340,Math.floor(e.pane-t-16))}function el(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 tl(e,t){let n=t.row.getBoundingClientRect().top-e.getBoundingClientRect().top-t.offset;e.scrollTop+=n}function nl(e){if(!e.hasAttribute(`data-expanded`))return;let t=Qc(e),n=e.querySelector(`.prb-code-scroll`);if(!t||!n)return;let r=$c({pane:t.clientHeight,panel:e.offsetHeight,scroller:n.offsetHeight});e.style.setProperty(`--prb-code-expanded`,`${r}px`)}function rl(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 il=!1;function al(){il||(il=!0,window.addEventListener(`resize`,()=>{for(let e of document.querySelectorAll(`.prb-code[data-expanded]`))nl(e)}))}function ol(e,t){let n=e.querySelector(`.prb-code-scroll`),r=n?el(n):null;t?(e.setAttribute(`data-expanded`,``),nl(e),al()):(e.removeAttribute(`data-expanded`),e.style.removeProperty(`--prb-code-expanded`)),rl(e),n&&r&&tl(n,r);let i=t?Qc(e):null;i&&(i.scrollTop+=e.getBoundingClientRect().top-i.getBoundingClientRect().top-Zc)}var sl={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.`]},cl=[{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`}],ll=`#tour`,F=16,I=6,ul=380,dl=260;function fl(e){return e.querySelector(`.prb-rail[data-stale]`)?[]:cl.filter(t=>e.querySelector(t.target.from)&&(!t.target.to||e.querySelector(t.target.to)))}function pl(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 ml(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 hl(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 gl(e,t){let n=[];if(t===`rail`){let t=e.documentElement;n.push(hl(t,[`data-sidebar-hidden`,`data-sidebar-peek`])),t.removeAttribute(`data-sidebar-hidden`),t.hasAttribute(`data-sidebar-compact`)&&t.setAttribute(`data-sidebar-peek`,``);let r=e.getElementById(`prb-rail-review`);r?.hidden&&(n.push(()=>{r.hidden=!0}),r.hidden=!1)}if(t===`ask`){let t=e.querySelector(`.prb-body`);t&&t.getAttribute(`data-ask`)!==`open`&&(n.push(hl(t,[`data-ask`])),t.setAttribute(`data-ask`,`open`))}return()=>{for(let e of n.reverse())e()}}function _l(e,t,n){let r=e.createElement(`button`);return r.type=`button`,r.className=t,r.textContent=n,r}function vl(e,t,n){let r=fl(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=_l(e,`prb-tour-skip`,`Skip tour`),h=_l(e,`prb-tour-back`,`Back`),g=_l(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,ee=()=>{},te=!1,y=()=>{let n=r[v],i=n?e.querySelector(n.target.from):null,a=i?ml(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>=dl?Math.min(ul,f):Math.min(ul,u-32)}px`;let p=l.getBoundingClientRect(),m=pl(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`},b=(t,n)=>{ee(),ee=()=>{},v=t;let i=r[v];if(s.toggleAttribute(`data-welcome`,!i),i){ee=gl(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:sl.title,p.replaceChildren(...(i?i.body:sl.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`,y(),g.focus({focusVisible:n})},x=r=>{if(!te){te=!0,ee(),t.removeEventListener(`resize`,y),e.removeEventListener(`scroll`,y,!0),e.removeEventListener(`transitionend`,y,!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?x(`completed`):b(v+1,e.detail===0)),h.addEventListener(`click`,e=>b(v-1,e.detail===0)),m.addEventListener(`click`,()=>x(`dismissed`)),s.addEventListener(`cancel`,()=>x(`dismissed`)),s.addEventListener(`close`,()=>x(`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`,y),e.addEventListener(`scroll`,y,!0),e.addEventListener(`transitionend`,y,!0),s.showModal(),b(-1,!1),{close:()=>x(`dismissed`)}}var yl={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 bl(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=yl[t];let o=e.createElement(`div`);o.className=`prb-dialog-actions`;let s=_l(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 xl(e,t,n){let r=e.body.hasAttribute(`data-tour-busy`)||e.querySelector(`.prb-rail[data-stale]`)!==null?`busy`:vl(e,t,{mode:`replay`,host:n})?null:`empty`;return r?(bl(e,r),r):`started`}var Sl={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 Cl(e){let t=e.slice(e.lastIndexOf(`/`)+1);if(t===`Dockerfile`||t.startsWith(`Dockerfile.`))return`docker`;let n=t.lastIndexOf(`.`);return n<=0?null:Sl[t.slice(n+1).toLowerCase()]??null}function wl(e){let t=new Set;for(let n of e){let e=Cl(n);e&&t.add(e)}return[...t]}var Tl={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`),[])},El=`github-light-default`,Dl=null,Ol=new Map;function kl(){return Dl??=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),Dl}function Al(e){let t=Ol.get(e);return t||(t=kl().then(async t=>t?(await t.loadLanguage(Tl[e]),!0):!1).catch(()=>!1),Ol.set(e,t)),t.then(e=>e?kl():null)}var jl={async preload(e){await Al(e)},async tokenize(e,t){let n=await Al(t);if(!n)return null;try{let{tokens:r,fg:i}=n.codeToTokens(e,{lang:t,theme:El}),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 Ml(e,t=jl){return Promise.all(e.map(e=>t.preload(e))).then(()=>void 0)}var Nl=/^#[0-9a-f]{3,8}$/i;function Pl(e,t){return!t||t.map(e=>e.content).join(``)!==e?null:t.map(e=>e.color&&Nl.test(e.color)?`<span style="color:${e.color}">${Pc(e.content)}</span>`:Pc(e.content)).join(``)}function Fl(e){return e.length>1e3?e.slice(0,Fc):e}function Il(e,t,n){if(!e||t===``)return;let r=Pl(Fl(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 Ll(e,t,n=jl){let r=Cl(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(Fl).join(`
|
|
174
|
+
`),r);if(a()){o&&t.lines.forEach((e,n)=>{Il(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=>Fl(e.text)).join(`
|
|
175
|
+
`),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;Il(o.querySelector(`.prb-code-line`),r.text,t[n]),o=o.nextElementSibling}}}}async function Rl(e,t=jl){let n=e.closest(`.prb-code`)?.dataset.syntax,r=e.textContent??``;if(!n||!(n in Tl)||r===``)return;let i=await t.tokenize(r,n);if(!e.isConnected||e.childElementCount!==0||e.textContent!==r)return;let a=Pl(r,i?.[0]);a!==null&&i?.length===1&&(e.innerHTML=a)}var L=y({ownsRestore:!0}),zl=document.body,Bl=zl.dataset.apiBase??``,Vl=zl.dataset.token??``,Hl=zl.dataset.editorLabel??``,Ul=zl.dataset.editorTemplate??``,Wl=zl.dataset.repoPath??``,Gl=zl.dataset.explainPrompt??``,Kl=zl.dataset.sessionId??``;function R(e){return`${Bl}${e}?t=${encodeURIComponent(Vl)}`}var ql=!1,Jl=0,Yl=!1;function Xl(e){Jl++;try{e()}finally{Jl--}}var Zl=Ir(document.querySelector(`.prb-body`)?.dataset.reviewLayout),Ql=Lr(Zl,e=>{fetch(R(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({reviewLayout:e})}).catch(()=>{})},()=>ql&&Jl===0);function $l(e){fetch(R(`/event`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),keepalive:!0}).catch(()=>{})}var eu=Eo({endpoint:R,showDiagrams:()=>mu(`diagram`),showMap:()=>mu(`map`),showChangeMap:e=>tu.show(e)}),tu=Es({endpoint:R,showView:e=>mu(e)}),nu=yc({endpoint:R}),ru=null,iu=`the whole change`;function au(e){let t=vr(e,cu),n=L.push(pr(t),t);ou++,lu(t),n&&su(t)}var ou=0;function su(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&&_(document,t)}var z=null,cu=document.querySelector(`[data-guide-start]`)?.dataset.guideStart??null;function lu(e){let t=vr(e,cu);if(t!==e){let{kind:e,view:n,focus:r,...i}=g(history.state);L.replace(pr(t),{...i,...t})}let n=!z||!Tr(z,t);z=t,n&&(t.kind===`view`?gu(t.view):bu(t.sectionId)),fu(t.focus??null)}var uu={history:{get state(){return history.state},pushState:(e,t,n)=>{ou++,L.push(n,g(e))},replaceState:(e,t,n)=>L.replace(n,g(e)),back:()=>{Yl=!0,history.back()}},apply:lu},B=ae(document,{onOpen:e=>e.hasAttribute(`data-ask-buddy-menu`)?Gd(e):Kd(e),onClose:Kd}),du={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)Xu(e,t||n.dataset.answered===`true`,`questions`),nd();else{let r=n.dataset.dismissed===`true`&&n.dataset.stale!==`true`;Xu(e,t||r||n.dataset.settled===`true`,`issues`),id()}}}};Qn(document,du);function fu(e){kr(document.querySelector(`.prb-body`),document,e),Ql.focus(e),B.closeAll(),e===`buddy`&&ud()}function pu(e){z&&(z.focus===e?Dr(z,uu):Er(z,e,uu))}function mu(e,t={}){let n=t.keepFocus&&z?.focus?e:hr(e,z?.focus);au({kind:`view`,view:e,...n?{focus:n}:{}})}function hu(e){au({kind:`section`,sectionId:e,...z?.focus===`guide`?{focus:`guide`}:{}})}function gu(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`&&$l({event:`view_opened`,view:e}),e===`diagram`&&eu.drawPane(),e===`map`&&tu.layout(),e===`architecture`&&nu.show(),_u(),document.querySelector(`.prb-doc`)?.scrollTo({top:0})}function _u(){oi(),ru=null,iu=`the whole change`,xu()}function vu(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,Ql.fold(n.id,t))}function yu(){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`)&&vu(e,!0)}}function bu(e){gu(`guide`),yu(),ai(e);let t=ri(e);if(!t)return;let n=document.querySelector(`[data-goto-section="${CSS.escape(e)}"]`);$l({event:`theme_opened`,themeIndex:Number(n?.dataset.themeIndex??-1),attention:n?.querySelector(`.prb-attention`)?.dataset.attention??`medium`,isRecommendedStart:n?.dataset.recommendedStart===`true`}),ru=e,iu=t.querySelector(`.pr-helper-guide-section-title`)?.textContent?.trim()??`this theme`,xu()}function xu(){let e=document.querySelector(`[data-ask-scope]`);e&&(e.textContent=iu)}function V(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}function Su(e){return e.tagName===`LI`?{parent:e,position:`beforeend`}:{parent:e,position:`afterend`}}async function Cu(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}=Su(e);o.insertAdjacentElement(s,a),e.setAttribute(`aria-expanded`,`true`),$l({event:`file_opened`,fromFinding:i,targeted:r>0}),await Tu(a,n,{cited:r,centre:r,expand:0,position:r?2*r:0})}var wu=hi();function Tu(e,t,n){return wu.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?()=>Eu(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 Eu(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=Ul&&Wl?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 ${Hl||`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="${Xc(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>${Gc(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">
|
|
169
176
|
<span class="prb-code-range">lines ${t.from}\u2013${t.to} of ${t.totalLines}</span>
|
|
170
177
|
${c}
|
|
171
178
|
${s}
|
|
@@ -173,7 +180,7 @@ import{$ as e,H as t,L as n,Q as r,U as i,X as a,Y as o,Z as s,a as c,ct as l,d
|
|
|
173
180
|
</div>
|
|
174
181
|
${f}
|
|
175
182
|
<div class="prb-code-scroll"><table class="prb-code-table"><tbody>${o}</tbody></table></div>
|
|
176
|
-
${l}`,Rc(e,t),$c(e),el(e),(n.focus?Wc(e,n.focus):e.querySelector(`.prb-code-target`))?.scrollIntoView({block:`center`}),Pl(e,t)}async function Su(e,t,n){let r=Uc(t,n);if(!r)return;let i=Wc(e,r.anchor);if(i)t.outerHTML=Hc(Gc(t),r.key),i.scrollIntoView({block:`center`});else{let t=e.querySelector(`[data-expand-file]`);if(!t?.dataset.expandFile)return;await bu(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 Cu(e,t,n){let r=`${Vl.replace(/\/$/,``)}/${e}`,i=Bl.replace(`{path}`,r).replace(`{line}`,String(Math.max(1,t)));n!==null&&Xl({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 wu=document.querySelector(`[data-ask-form]`),H=wu?.querySelector(`textarea`);function Tu(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=We(t)+gt(t)):n.textContent=t,V?.appendChild(n),V?.scrollTo({top:V.scrollHeight}),n}function Eu(){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,Du=!!V?.querySelector(`[data-ask-pending]`);function Ou(){let e=document.createElement(`div`);e.className=`prb-stopped`,e.textContent=`Stopped.`,V?.appendChild(e),V?.scrollTo({top:V.scrollHeight})}async function ku(e,t=`free_text`,n={}){let r=e.trim();if(!r||U||Du)return;document.querySelector(`.prb-ask-empty`)?.remove(),Tu(`user`,r);let i=Eu();U=new AbortController,ju(!0);try{let e=await fetch(I(`/ask`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({question:r,sectionId:eu,source:t,...n}),signal:U.signal}),a=await e.json().catch(()=>null);if(e.status===409&&(a?.running||a?.updating)){Au(r,n.continuesExplanation),window.location.reload();return}if(i.remove(),a?.stopped){Ou();return}if(!e.ok||!a?.answer){Tu(`error`,a?.error??`Buddy AI did not answer. Check the terminal running PR Review Buddy.`);return}Tu(`assistant`,a.answer),a.explanation&&Rn(document,a.explanation),a.reassessment?.card&&Hn(document,a.reassessment.card)}catch(e){i.remove(),e instanceof DOMException&&e.name===`AbortError`?(Ou(),Au(r,n.continuesExplanation)):(Tu(`error`,`Could not reach PR Review Buddy. The workspace server may have stopped.`),Au(r,n.continuesExplanation))}finally{U=null,ju(!1)}}function Au(e,t){!H||H.value||(H.value=e,lp?.save(),t&&(W=W?.continues&&e.includes(W.text)?W:{text:e,source:`finding`,continues:t},lp?.stage(W)))}function ju(e){let t=wu?.querySelector(`button`);t&&(t.textContent=e?`Stop`:`Ask`,t.toggleAttribute(`data-stop`,e),t.disabled=!1);for(let t of document.querySelectorAll(Mu))t.disabled=e;e&&z.closeAll(),e||H?.focus()}var Mu=`[data-suggestion], .pr-helper-explain-simply-button`;function Nu(){let e=wu?.querySelector(`button`);e&&(e.textContent=`Stopping…`,e.disabled=!0),fetch(I(`/stop`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({kind:`ask`})}).catch(()=>{}).finally(()=>{U?.abort()})}wu?.addEventListener(`submit`,e=>{if(e.preventDefault(),U||Du)return Nu();let t=H?.value??``;H&&(H.value=``),lp?.clear();let n=Bn(W,t);ku(t,Pu(t),n?{continuesExplanation:n}:{})}),Du&&ju(!0);var W=null;function Pu(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||Du)return;wu?.requestSubmit()}}),H?.addEventListener(`input`,()=>{H&&(H.style.height=`auto`,H.style.height=`${Math.min(H.scrollHeight,140)}px`)});async function Fu(e){try{await fetch(I(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({answeredQuestionIds:e})})}catch{}}function Iu(){return[...document.querySelectorAll(`[data-question-answered][data-answered="true"]`)].map(e=>e.dataset.questionAnswered??``).filter(Boolean)}function Lu(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&&Uu(n,t,`questions`),Yu()}function Ru(){return[...document.querySelectorAll(`[data-issue-dismissed][data-dismissed="true"]`)].map(e=>({id:e.dataset.issueDismissed??``,sessionId:e.dataset.dismissedIn||Ul})).filter(e=>e.id)}async function zu(e){try{await fetch(I(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissedIssues:e})})}catch{}}function Bu(e,t){e.dataset.dismissed=String(t),e.textContent=t?`Reopen`:`Dismiss`,delete e.dataset.stale,t?e.dataset.dismissedIn=Ul: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(Vu()),Uu(n,t||e.dataset.settled===`true`,`issues`),Zu())}function Vu(){let e=document.createElement(`span`);return e.className=`pr-helper-finding-status pr-helper-finding-status-dismissed pr-helper-tip`,e.dataset.tip=wn,e.textContent=`Dismissed by you`,e}var Hu=new WeakMap;function Uu(e,t,n){let r=e.closest(`.pr-helper-closed-findings-list`);if(t!==!!r){if(t){let t=e.parentElement;t&&Hu.set(e,{parent:t,before:e.nextElementSibling}),qu(n).append(e),t&&Ku(t)}else Wu(e,n),(r?.children.length===0?r.closest(`.pr-helper-closed-findings`):null)?.remove();Ju(n)}}function Wu(e,t){let n=Hu.get(e);if(n?.parent.isConnected)n.parent.insertBefore(e,n.before);else{let n=Gu(e)??document.querySelector(`[data-view="${t}"]`);n?.insertBefore(e,n.querySelector(`.pr-helper-closed-findings`))}e.closest(`.pr-helper-question-group`)?.removeAttribute(`hidden`)}function Gu(e){let t=e.dataset.sectionId;return t?document.querySelector(`[data-question-group="${CSS.escape(t)}"]`):null}function Ku(e){let t=e.closest(`.pr-helper-question-group`);t&&!t.querySelector(`[data-finding-card]`)&&(t.hidden=!0)}function qu(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 Ju(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})`:Xr(Xu()),Un(document)}function Yu(){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`).length,n=document.querySelector(`.pr-helper-questions-progress`);n&&(n.innerHTML=Zr(e.length,t)),Qu(`questions`,e.length,t,`question`,`answered`)}function Xu(){let e=[...document.querySelectorAll(`[data-issue-dismissed]`)],t=0,n=0,r=0;for(let i of e){let e=i.dataset.settled===`true`,a=i.dataset.dismissed===`true`&&i.dataset.stale!==`true`;!e&&!a?t+=1:!e&&a&&(n+=1),e&&i.dataset.settledBy===`conversation`&&(r+=1)}return{total:e.length,open:t,done:e.length-t,reviewerClosed:n,...r>0?{byConversation:r}:{}}}function Zu(){let e=Xu();if(e.total===0)return;let t=document.querySelector(`[data-view="issues"]`),n=t?.querySelector(`.pr-helper-findings-progress`);!n&&t&&e.done>0&&(n=document.createElement(`div`),n.className=`pr-helper-findings-progress`,n.setAttribute(`role`,`status`),t.querySelector(`.prb-doc-title`)?.after(n)),n&&(n.innerHTML=Yr(e.total,e.open,Fr(e))),Qu(`issues`,e.total,e.open,`issue`,Fr(e))}function Qu(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}`))}document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-rail-toggle]`);if(n){pu(n,n.getAttribute(`aria-expanded`)!==`true`);return}let r=t.closest(`a[data-view-nav], a[data-goto-section]`);if(r&&!ee(e))return;r&&e.preventDefault();let i=t.closest(`[data-view-nav]`);if(i?.dataset.viewNav){lu(i.dataset.viewNav);return}let a=t.closest(`[data-author-context-toggle]`);if(a){Hr(a);return}let o=t.closest(`[data-author-context-reveal]`);if(o){qr(o);return}let s=t.closest(`[data-overview-nav]`);if(s?.dataset.overviewNav){lu(s.dataset.overviewNav===`guide`?`guide`:s.dataset.overviewNav);return}let c=t.closest(`[data-goto-section]`);if(c?.dataset.gotoSection){uu(c.dataset.gotoSection);return}let l=t.closest(`[data-open-editor]`);if(l?.dataset.openEditor){Cu(l.dataset.openEditor,Number(l.dataset.openLine)||1,!l.closest(`[data-architecture]`)||null);return}let u=t.closest(`[data-deletion-toggle]`);if(u){Lc(u);return}let d=t.closest(`[data-code-expand]`);if(d){let e=d.closest(`.prb-code`);e&&rl(e,!e.hasAttribute(`data-expanded`));return}let f=t.closest(`[data-change-step]`);if(f){let e=f.closest(`[data-change-navigator]`),t=f.closest(`.prb-code`);e&&t&&!f.disabled&&Su(t,e,f.dataset.changeStep===`previous`?`previous`:`next`);return}let p=t.closest(`[data-full-line]`);if(p){let e=zc(p);e&&Fl(e);return}let m=t.closest(`[data-expand-file]`);if(m?.dataset.expandFile){let e=m.closest(`.prb-code`);if(e){let t=e.querySelector(`[data-change-navigator]`);bu(e,m.dataset.expandFile,{cited:Number(m.dataset.expandCited)||0,centre:Number(m.dataset.expandLine)||0,expand:Number(m.dataset.expandStep)||1,position:Number(t?.dataset.changePosition)||0,focus:Kc(t)})}return}let h=t.closest(`[data-focus-toggle]`);if(h?.dataset.focusToggle){cu(h.dataset.focusToggle);return}let g=t.closest(`[data-prompt-toggle]`);if(g){Ed(g.getAttribute(`aria-expanded`)===`true`);return}if(t.closest(`[data-ask-buddy-menu], [data-grade-menu]`))return;let _=t.closest(`[data-file]`);if(_?.dataset.file){vu(_);return}let v=$r(t);if(v){uu(v);return}let te=t.closest(`[data-question-answered]`);if(te?.dataset.questionAnswered){Lu(te,te.dataset.answered!==`true`),Rr(te);let e=Iu();Fu(e),Xl({event:`question_marked_answered`,answered:e.length,total:document.querySelectorAll(`[data-question-answered]`).length});return}let y=t.closest(`[data-issue-dismissed]`);if(y?.dataset.issueDismissed){Bu(y,y.dataset.stale===`true`||y.dataset.dismissed!==`true`);let e=Ru();zu(e),Xl({event:`issue_dismissed`,dismissed:e.length,total:document.querySelectorAll(`[data-issue-dismissed]`).length});return}let b=t.closest(`[data-suggestion]`);if(b){ku(b.textContent??``,`suggestion`);return}if(t.closest(`.pr-helper-explain-simply-button`)){rd(),ku(Hl,`explain_simply`);return}let x=t.closest(`[data-prompt-use]`);if(x?.dataset.promptUse){Dd(x.dataset.promptUse);return}let S=t.closest(`[data-prompt-edit]`);if(S?.dataset.promptEdit){Jd(S.dataset.promptEdit);return}if(t.closest(`[data-prompt-add]`)){Jd(``);return}if(t.closest(`[data-ask-toggle]`)){let e=L?.focus;e?(Sr(L,ou),td(e!==`buddy`)):td(!ed())}});var G=document.querySelector(`.prb-body`),$u=document.querySelector(`.prb-ask`);function ed(){return!!$u&&getComputedStyle($u).display!==`none`}function td(e){G&&(G.dataset.ask=e?`open`:`closed`),nd(e),Yl.ask(e)}function nd(e){for(let t of document.querySelectorAll(`[data-ask-toggle]`))t.setAttribute(`aria-expanded`,String(e))}function rd(){L?.focus&&L.focus!==`buddy`&&Sr(L,ou),td(!0)}function id(){nd(ed())}window.addEventListener(`resize`,id),x(I(`/restart`));var ad=document.querySelector(`[data-file-filter]`),od=document.querySelector(`[data-file-count]`),sd=document.querySelector(`[data-file-none]`);function cd(){let e=(ad?.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}`}sd&&(sd.hidden=n>0),od&&(od.textContent=e?`${t} of ${ld} file${ld===1?``:`s`}`:`${ld} file${ld===1?``:`s`}`)}var ld=document.querySelectorAll(`[data-view="files"] .prb-file:not(.prb-file-referenced)`).length;ad?.addEventListener(`input`,cd),ad?.addEventListener(`keydown`,e=>{e.key===`Escape`&&ad.value!==``&&(e.preventDefault(),ad.value=``,cd())}),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(),vu(n))});var ud=320,dd=()=>Math.round(window.innerWidth/2),fd=e=>Math.round(Math.min(dd(),Math.max(ud,e)));function pd(e){G&&(e===null?G.style.removeProperty(`--ask-width`):G.style.setProperty(`--ask-width`,`${e}px`))}function md(){return $u?Math.round($u.getBoundingClientRect().width):ud}function hd(e){fetch(I(`/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||!$u)return;e.preventDefault(),K.setPointerCapture(e.pointerId),G.dataset.resizing=`true`;let t=e.clientX,n=md(),r=e=>{pd(fd(n+(t-e.clientX)))},i=()=>{K.removeEventListener(`pointermove`,r),K.removeEventListener(`pointerup`,i),K.removeEventListener(`pointercancel`,i),delete G.dataset.resizing,hd(md())};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=fd(md()+n);pd(r),hd(r);return}(e.key===`Home`||e.key===`Escape`)&&(e.preventDefault(),pd(null),hd(null))}),K?.addEventListener(`dblclick`,()=>{pd(null),hd(null)}),window.addEventListener(`resize`,()=>{ed()&&G?.style.getPropertyValue(`--ask-width`)&&pd(fd(md()))});var gd=3e4,_d=document.visibilityState===`visible`?Date.now():null,vd=0;function yd(){_d!==null&&(vd+=Date.now()-_d,_d=Date.now())}function bd(){yd();let e=Math.round(vd/1e3);return vd-=e*1e3,e}document.addEventListener(`visibilitychange`,()=>{document.visibilityState===`visible`?_d=Date.now():(yd(),_d=null)}),setInterval(()=>{let e=bd();e>0&&Xl({event:`workspace_heartbeat`,visibleSeconds:e})},gd),window.addEventListener(`pagehide`,()=>{let e=I(`/event`),t=JSON.stringify({event:`review_completed`,trailingSeconds:bd()});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]`),Sd=document.querySelector(`[data-prompt-list]`),q=Cd();function Cd(){try{let e=JSON.parse(xd?.dataset.prompts??`[]`);return Array.isArray(e)?e:[]}catch{return[]}}function wd(){if(!Sd)return;Sd.innerHTML=q.map(e=>`<span class="prb-bank-item">
|
|
177
|
-
<button type="button" class="prb-bank-use" data-prompt-use="${
|
|
178
|
-
<button type="button" class="prb-bank-edit" data-prompt-edit="${
|
|
179
|
-
</span>`).join(``);let e=document.querySelector(`[data-prompt-count]`);e&&(e.textContent=String(q.length)),Fd()}async function Td(e){try{let t=await(await fetch(I(`/prompts`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({prompts:e})})).json().catch(()=>null);q=Array.isArray(t?.prompts)?t.prompts:q}catch{}wd()}function Ed(e){document.querySelector(`[data-prompt-toggle]`)?.setAttribute(`aria-expanded`,String(!e)),xd?.toggleAttribute(`data-collapsed`,e),Sd&&(Sd.hidden=e),fetch(I(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({promptsCollapsed:e})}).catch(()=>{})}function Dd(e){let t=q.find(t=>t.id===e);!t||!H||(H.value=ni(H.value,t.prompt),rd(),H.focus(),H.setSelectionRange(H.value.length,H.value.length),H.dispatchEvent(new Event(`input`)))}var Od=document.querySelector(`.prb-doc`),kd=null,Ad=null;function jd(){V&&(Ad?.(),Ad=gn(V,{layout:`flat`,actions:yn.map(e=>({id:e.id,label:e.label})),onChoose:(e,t)=>Id(e,`selection`,t)}))}var Md=`reassess`;function Nd(e){let t=Pd();if(!e)return t;let n={id:Md,label:`Reassess ${e.kind===`issue`?`severity`:`importance`}`};return[...t.filter(e=>!e.section),n,...t.filter(e=>e.section)]}function Pd(){return[..._n.map(e=>({id:e.id,label:e.label})),...q.map(e=>({id:er(e.id),label:e.name,section:$n}))]}function Fd(){Od&&(kd?.(),kd=gn(Od,{triggerLabel:`Ask Buddy AI`,actions:Pd(),ignoreWithin:`[data-ask-buddy-menu]`,onChoose:(e,t)=>Id(e,`selection`,t)}))}function Id(e,t,n,r){Pr(e,{context:t,text:n},{savedPrompt:e=>q.find(t=>t.id===e)?.prompt??null,stage:e=>Ld(e,t,r?.continuesExplanation?r.ref:void 0),send:t=>{rd(),ku(t,`finding`,Fn(e,r?.ref))}})}function Ld(e,t,n){H&&(W={text:e,source:t,...n?{continues:n}:{}},lp?.stage(W),H.value=ni(H.value,e),rd(),H.focus(),H.setSelectionRange(H.value.length,H.value.length),H.dispatchEvent(new Event(`input`)))}function Rd(e){let t=e.querySelector(`[data-menu-panel]`);if(t){t.innerHTML=on(Nd(Ln(e)));for(let e of t.querySelectorAll(`[data-selection-action]`))e.setAttribute(`role`,`menuitem`);if(U||Du)for(let e of t.querySelectorAll(`button`))e.disabled=!0}}function zd(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=Cn(n),a=Ln(n);if(z.close(n),r===Md){i&&a&&Bd(a,i);return}i&&Id(r,`finding`,i,a?{ref:a}:void 0)});function Bd(e,t){if(U||Du)return;let n=e.kind===`issue`?`severity`:`importance`;rd(),ku(`${xn(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?Zn(t):null;n&&Ld(n,`finding`)}),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-simple-explanation-more]`);if(!t)return;let n=In(t),r=Cn(t);n&&r&&Id(`custom`,`finding`,r,{ref:n,continuesExplanation:!0})}),Fd(),jd();var J=Ga({root:document,showView:e=>lu(e)}),Vd=eo({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)});kt(document),Ut(document);var Hd=document.querySelector(`[data-prompt-dialog]`),Ud=document.querySelector(`[data-prompt-name]`),Wd=document.querySelector(`[data-prompt-text]`),Gd=document.querySelector(`[data-prompt-delete]`),Kd=document.getElementById(`prb-prompt-title`),qd=``;function Jd(e){let t=q.find(t=>t.id===e);qd=t?.id??``,Kd&&(Kd.textContent=t?`Edit prompt`:`Save a prompt`),Ud&&(Ud.value=t?.name??``),Wd&&(Wd.value=t?.prompt??``),Gd&&(Gd.hidden=!t),Hd?.showModal(),Ud?.focus()}async function Yd(){let e=Ud?.value.trim()??``,t=Wd?.value.trim()??``;if(!e||!t){(e?Wd:Ud)?.focus();return}let n=qd?q.map(n=>n.id===qd?{...n,name:e,prompt:t}:n):[...q,{id:crypto.randomUUID(),name:e,prompt:t}];Hd?.close(),await Td(n)}async function Xd(){if(!qd)return;let e=q.filter(e=>e.id!==qd);Hd?.close(),await Td(e)}document.querySelector(`[data-prompt-cancel]`)?.addEventListener(`click`,()=>Hd?.close()),Gd?.addEventListener(`click`,()=>void Xd()),document.querySelector(`[data-prompt-save]`)?.addEventListener(`click`,()=>void Yd());var Zd=document.querySelector(`[data-fresh-region]`),Y=document.querySelector(`[data-fresh-status]`),Qd=document.querySelector(`[data-fresh-check]`),X=uf(Zd?.dataset.report),$d=`prb-fresh-reopen`,ef=of(),tf=Zd?.dataset.dismissedSha,nf=af(Zd?.dataset.availability),Z=rf(Zd?.dataset.remote);function rf(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function af(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function of(){try{return sessionStorage.getItem($d)!==null&&(sessionStorage.removeItem($d),!0)}catch{return!1}}ef&&Df(),Qd?.addEventListener(`click`,()=>void mf());var sf=document.querySelector(`[data-fetch-remote]`);sf&&(fetch(I(`/fetch`)).then(e=>e.ok?e.json():null).then(e=>{e?.fetchable===!0&&(sf.hidden=!1)}).catch(()=>{}),sf.addEventListener(`click`,()=>void cf(sf)));async function cf(e){if(e.disabled)return;e.disabled=!0;let t=null;try{let e=await fetch(I(`/fetch`),{method:`POST`});e.ok&&(t=await e.json())}catch{}e.disabled=!1;let n=t??{repositories:1,fetched:0,failed:[],moved:0};te(c(),{kind:n.fetched<n.repositories?`failed`:`ready`,text:ne(n)}),n.fetched>0&&await mf()}Zd?.addEventListener(`click`,e=>{let t=e.target;if(t.closest(`[data-fresh-close]`))return ef=!1,Df();let n=t.closest(`[data-fresh-dismiss]`);n&&(tf=n.dataset.freshDismiss||void 0,ef=!1,Df(),lf())});function lf(){fetch(I(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissFreshnessSha:tf??null})}).catch(()=>{})}function uf(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}var df=Aa(),ff=!1,pf=null;async function mf(){if(ff)return;ff=!0,bf(!0),pf&&await pf;let e=xf(X,Z),t=await gf(!1);bf(!1),t&&Ef(),ff=!1,t&&(X?.code.state===`changed`||Z!==null)&&tf!==void 0&&(tf=void 0,lf()),Df(),hf(t?xf(X,Z)===e?`No change`:`Updated`:`Could not check`)}function hf(e){Y&&(Y.textContent=e,window.setTimeout(Of,2600))}async function gf(e){let t=df.snapshot();try{let n=await(await fetch(`${I(`/freshness`)}${e?`&quiet=1`:``}`)).json();X=n.report??null,nf=n.availability??null,Z=n.remote??null,Cf=n.kiss??null,n.kissDismissedSha!==void 0&&(wf=n.kissDismissedSha??void 0),n.prState!==void 0&&yf(n.prState);let r=ka(n.standing);return r&&df.current(t)&&xa(document,r),!0}catch{return!1}}async function _f(){if(ff||pf||!Zd)return;let e=xf(X,Z),t=JSON.stringify(Cf);pf=gf(!0);let n=await pf;pf=null,vf=Date.now(),n&&(xf(X,Z)!==e&&Df(),JSON.stringify(Cf)!==t&&Ef())}var vf=Date.now();function yf(e){let t=document.querySelector(`[data-pr-state-slot]`);if(!t)return;let n=ba(e,t.hasAttribute(`data-beside-number`));t.innerHTML!==n&&(t.innerHTML=n)}function bf(e){Qd&&(Qd.disabled=e),Y&&e&&(Y.textContent=`Checking…`,Y.dataset.state=`checking`)}function xf(e,t){if(!e)return JSON.stringify({report:`none`,remote:t});let{checkedAt:n,...r}=e;return JSON.stringify({...r,remote:t})}var Sf=document.querySelector(`[data-kiss-fresh-region]`),Cf=Tf(Sf?.dataset.freshness),wf=Sf?.dataset.dismissedSha;function Tf(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function Ef(){pa(Cf?.state===`changed`),Sf&&(Sf.innerHTML=aa(Sf.dataset.reviewedSha??``,Cf,{dismissedSha:wf,actions:Rl!==``}))}Sf?.addEventListener(`click`,e=>{let t=e.target.closest(`[data-kiss-freshness-dismiss]`);t&&(wf=t.dataset.kissFreshnessDismiss||void 0,Ef(),fetch(I(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissKissFreshnessSha:wf??null})}).catch(()=>{}))});function Df(){Zd&&(Zd.innerHTML=ji(X,{dismissedSha:tf,open:ef,actions:Rl!==``,availability:nf,remote:Z}),Of())}function Of(){if(Y&&(X||Z)){let{label:e,state:t}=ki(X,Z);Y.textContent=e,Y.dataset.state=t,Ui(document,t)}}document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-copy-command]`);if(n)return kf(n);let r=t.closest(`[data-notice-dismiss]`);if(r){r.closest(`[data-notice]`)?.remove(),fetch(I(`/prefs`),{method:`POST`,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 jf(i);if(t.closest(`[data-review-update]`))return void Ff();let a=t.closest(`[data-update-cancel]`);if(a)return void Lf(a,`update`);let o=t.closest(`[data-review-cancel]`);if(o)return void Lf(o,`review`);t.closest(`[data-update-close]`)&&document.querySelector(`[data-update-result]`)?.remove()});function kf(e){let t=e.dataset.copyCommand??``;navigator.clipboard?.writeText(t).then(()=>Af(e,`Copied`),()=>Af(e,`Select it`))}function Af(e,t,n=1400){let r=e.textContent;e.textContent=t,setTimeout(()=>{e.textContent=r},n)}async function jf(e){let t=[...document.querySelectorAll(`[data-pr-recheck]`)];for(let e of t)e.disabled=!0;let n=Date.now(),r=()=>{let e=Math.max(1,Math.round((Date.now()-n)/1e3));for(let n of t){let t=Mf(n);t?t.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Re-checking the conversation, ${e}s. ${Bf}`:n.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Checking… ${e}s`}};r();let i=window.setInterval(r,1e3),a=Mf(e)?null:Vf(e);try{await fetch(I(`/refresh`),{method:`POST`})}catch{}finally{window.clearInterval(i),a?.remove()}Mf(e)&&Nf(),window.location.reload()}function Mf(e){return e.closest(`.prb-fresh-notes p`)}function Nf(){try{sessionStorage.setItem($d,`1`)}catch{}}var Pf=!1;async function Ff(){if(Pf)return;Pf=!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(I(`/job`))).json();e.update&&e.update.phase!==`none`&&!qi(e.update.phase)&&n()}catch{}},500);try{await fetch(I(`/update`),{method:`POST`})}catch{}n()}var If={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 Lf(e,t){let n=If[t],r=(t===`review`?e.dataset.reviewCancel:e.dataset.updateCancel)??``;e.disabled=!0,e.textContent=`Cancelling…`;let i;try{let e=await fetch(I(n.path),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n.body(r))});if(!e.ok)throw Error(`refused`);i=n.took(await e.json())}catch{e.disabled=!1,e.textContent=n.label,zf(e,`The workspace server did not answer, so nothing was cancelled. Try again.`);return}i||zf(e,n.tooLate),await po({look:async()=>{let e=await fetch(I(`/job`),{signal:AbortSignal.timeout(Rf)});return n.running(await e.json())},reload:()=>window.location.reload()})}var Rf=3e3;function zf(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 Bf=`Fetching the latest threads from your pull request. This usually takes under a minute.`;function Vf(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=Bf,t.appendChild(n),n}var Hf=oo(document),Uf=null,Wf=Date.now();function Gf(){Uf===null&&(Uf=window.setTimeout(()=>{Uf=null,Kf()},oe(Date.now()-Wf)))}async function Kf(){try{let e=await(await fetch(I(`/job`))).json();if(Du&&!e.ask||Jf&&!e.diagram){window.location.reload();return}let t={job:e,kiss:e.kiss,update:e.update};for(let[e,n]of Hf){let r=t[e];if(r){if(so(e,r,document)){window.location.reload();return}e===`update`||n.matches(`[data-progress-pane]`)?lo(n,r.phase,r.progress):qf(n,r.progress)}}}catch{}Gf()}function qf(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 Jf=document.querySelector(`[data-diagram-running]`)!==null;(Hf.size>0||Du||Jf)&&(Wf=Date.now(),Gf()),document.querySelector(`[data-started-at]`)&&fo(document);function Yf(e){let t=e.parentElement;if(!t)return;let n=t.querySelector(`.prb-job-retry-status`);n||(n=document.createElement(`p`),n.className=`prb-job-retry-status`,n.setAttribute(`role`,`status`),t.insertBefore(n,e.nextSibling)),n.textContent=`The retry could not be started. You can try again.`}function Xf(e){e.parentElement?.querySelector(`.prb-job-retry-status`)?.remove()}document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-job-retry]`);t&&(t.disabled=!0,t.textContent=`Retrying…`,Xf(t),fetch(I(`/retry`),{method:`POST`}).then(e=>{if(!e.ok)throw Error(`refused`);Wf=Date.now(),Gf()}).catch(()=>{t.disabled=!1,t.textContent=`Retry`,Yf(t)}))}),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-run-review-again]`);t&&(t.disabled=!0,t.textContent=`Starting…`,fetch(I(`/reanalyse`),{method:`POST`}).then(e=>{if(!e.ok)throw Error(`refused`);location.reload()}).catch(()=>{t.disabled=!1,t.textContent=Ir,Af(t,`Could not start. Try again`,2500)}))});var Zf={send:async e=>{let t=await fetch(I(`/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)=>{Qu(`kiss`,e,t,`recommendation`,`decided`),Qu(`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){ca(r,sa(n),Zf);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(I(`/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 Qf=document.body.dataset.defaultView||`overview`;window.addEventListener(`popstate`,e=>{let t=hr(e.state)??gr(window.location.hash)??{kind:`view`,view:Qf},n=!L||!br(L,t),r=Kl;Kl=!1,r?R(t):ql(()=>R(t)),n&&iu(t),cp()});var $f=gr(window.location.hash),ep=window.location.hash===ol,tp=F.current().ui===null,np=window.matchMedia(`(max-width: 860px)`).matches,rp=tp&&!$f?.focus?Ar(Jl.expanded,pr($f??{kind:`view`,view:Qf},au),e=>document.querySelector(`[data-focus-toggle="${e}"]`)!==null,np):null;if(tp&&G?.dataset.ask===`open`&&np&&delete G.dataset.ask,rp){let e=$f??{kind:`view`,view:Qf};$f||(L=e);let t={...e,focus:rp};F.replace(cr(t),t),R(t)}else $f?R($f):(L={kind:`view`,view:Qf},F.replace(``,L));Wl=!0;var ip={enterTour(){let e=L,t=e?.kind===`view`&&e.view===`overview`&&!e.focus;return t||ql(()=>R({kind:`view`,view:`overview`})),()=>{!t&&e&&ql(()=>R(e))}},save(e){fetch(I(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({guidedTour:e})}).catch(()=>{})}};ep?vl(document,window,ip):Il.dataset.guidedTour===`offer`&&hl(document,window,{mode:`first`,host:ip});var ap={doc:document,main:document.querySelector(`main.prb-doc`),rail:document.querySelector(`.prb-rail`),log:V,panes:G};F.setCapturer(()=>gi(ap));async function op(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=ii(e),s=o?yu.pending(o):void 0;if(!o||!li(s?s.request:si(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}=_u(e);t.insertAdjacentElement(n,o),e.setAttribute(`aria-expanded`,`true`)}if(!await bu(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`)&&rl(o,a.tall),t&&ci(o,t.top,t.offset))}function sp(e){ii(e)?.remove(),e.setAttribute(`aria-expanded`,`false`)}async function cp(){let e=++ru,t=()=>ru===e;await _i(ap,F.current().ui,{setFold:(e,t)=>ql(()=>pu(e,t)),setAsk:e=>ql(()=>td(e)),clearAsk:()=>{G&&delete G.dataset.ask,nd(ed())},openPanel:(e,n)=>op(e,n,t),closePanel:sp,stillCurrent:t})}cp();var lp=H?wi(H,{storage:(()=>{try{return window.sessionStorage}catch{return null}})(),path:window.location.pathname,restore:!0,win:window}):null;W=lp?.restoredStage??null,id(),gu();var up=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=>{up(e.target)}),document.addEventListener(`keydown`,e=>{if(e.key!==`Escape`)return;let t=document.querySelector(`[data-analysis-details][open], [data-range-details][open]`);t&&(up(),t.querySelector(`summary`)?.focus())});var Q=document.querySelector(`.prb-header [data-menu]`),$=Ma({root:document,post:(e,t)=>fetch(I(e),t===void 0?{method:`POST`}:{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),gate:df,checkForUpdates:()=>mf()});function dp(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 fp(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();dp(n.error)}}function pp(e){return Q?.querySelector(`[data-menu-items] ${e}`)??null}function mp(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()}if(Q){let e=Q.querySelector(`[data-confirm-delete]`),n=()=>zd(Q);Q.addEventListener(`click`,e=>{let t=e.target,a=t?.closest(`[data-copy-id]`);if(a?.dataset.copyId){e.stopPropagation(),re(a,a.dataset.copyId);return}if(t?.closest(`[data-tour-replay]`)){e.stopPropagation(),z.closeAll(),vl(document,window,ip);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(),fp(()=>$.setComplete(s.dataset.markStatus===`complete`),s);return}let c=t?.closest(`[data-lifecycle-set]`);if(c){e.stopPropagation(),fp(()=>$.setLifecycle(c.dataset.lifecycleSet),c);return}let l=t?.closest(`[data-queue-action]`);if(l){e.stopPropagation(),fp(()=>$.setQueued(l.dataset.queueAction===`remove`?`remove`:`add`),l);return}if(t?.closest(`[data-delete]`)){e.stopPropagation(),mp();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(I(`/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(),dp(t)}}function hp(e){return{available:()=>document.querySelector(`.prb-rail a[data-view-nav="${e}"]`)!==null,run:()=>lu(e,{keepFocus:!0})}}function gp(){if(!L)return null;let e=L.focus??(L.kind===`section`?`guide`:L.view);return ir.includes(e)&&document.querySelector(`[data-focus-toggle="${e}"]`)?e:null}function _p(){return[...document.querySelectorAll(`.prb-view:not([hidden]) [data-feedback-select]`)].some(e=>e.checkVisibility())}u(`review`,{...Vd.commands,...Za(J,document),"review.section.review":{available:()=>no(document)!==null,run:()=>{let e=no(document);e&&lu(e,{keepFocus:!0})}},"review.section.kiss":hp(`kiss`),"review.section.issues":hp(`issues`),"review.section.diagrams":hp(`map`),"review.section.questions":hp(`questions`),"review.section.files":hp(`files`),"review.buddy.open":{available:()=>$u!==null,run:()=>{L?.focus?xr(L,`buddy`,ou):td(!0),document.querySelector(`[data-ask-form] textarea`)?.focus()}},"review.buddy.prompt":{available:()=>$u!==null&&H!==null,panel:ie({prompts:()=>q,choose:Dd})},"review.focus.toggle":{available:()=>gp()!==null,run:()=>{let e=gp();e&&cu(e)}},"review.leave":{available:e=>!!(e&&Cr(e,document,e.target===H||J.state().selecting||!!L?.focus)),run:e=>{H&&e?.target===H?H.blur():J.state().selecting?J.exit():L?.focus&&Sr(L,ou)}},"review.feedback.toggle":{available:()=>J.state().selecting||_p(),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 fp(()=>$.setComplete(!0),pp(`[data-mark-status]`))},"review.mark.waiting":{available:()=>$.offer().waiting,run:()=>void fp(()=>$.setLifecycle(`waiting`),pp(`[data-lifecycle-set="waiting"]`))},"review.mark.done":{available:()=>$.offer().done,run:()=>void fp(()=>$.setLifecycle(`done`),pp(`[data-lifecycle-set="done"]`))},"review.queue.toggle":{available:()=>$.offer().queue,run:()=>void fp(()=>$.toggleQueued(),pp(`[data-queue-action]`))},"review.checkUpdates":{available:()=>$.offer().checkForUpdates,run:()=>void $.checkForUpdates()},"review.update":{available:()=>Ai(X,{actions:Rl!==``&&!Hf.has(`update`)&&!Pf,remote:Z}),run:()=>void Ff()},"review.delete":{available:()=>$.offer().delete,run:()=>mp({focusCancel:!0})}},{onOpen:()=>z.closeAll()}),m(),Rl&&Ac({markSeen:()=>fetch(I(`/seen`),{method:`POST`}),askUnread:()=>fetch(I(`/unread`))}),setTimeout(()=>{kl(xl([...document.querySelectorAll(`[data-view="files"] [data-file]`)].map(e=>e.dataset.file??``)))},0),p(window,()=>window.location.reload());var vp=15e3,yp=6e4;function bp(){return Rl!==``&&document.visibilityState===`visible`&&!Hf.has(`update`)}document.addEventListener(`visibilitychange`,()=>{bp()&&Date.now()-vf>=vp&&_f()}),window.setInterval(()=>{bp()&&_f()},yp);export{oc as n,zt as r,lc as t};
|
|
183
|
+
${l}`,Vc(e,t),nl(e),rl(e),(n.focus?qc(e,n.focus):e.querySelector(`.prb-code-target`))?.scrollIntoView({block:`center`}),Ll(e,t)}async function Du(e,t,n){let r=Kc(t,n);if(!r)return;let i=qc(e,r.anchor);if(i)t.outerHTML=Gc(Jc(t),r.key),i.scrollIntoView({block:`center`});else{let t=e.querySelector(`[data-expand-file]`);if(!t?.dataset.expandFile)return;await Tu(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 Ou(e,t,n){let r=`${Wl.replace(/\/$/,``)}/${e}`,i=Ul.replace(`{path}`,r).replace(`{line}`,String(Math.max(1,t)));n!==null&&$l({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 ku=document.querySelector(`[data-ask-form]`),U=ku?.querySelector(`textarea`);function Au(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=We(t)+vt(t)):n.textContent=t,H?.appendChild(n),H?.scrollTo({top:H.scrollHeight}),n}function ju(e){if(!e||!H)return;let t=document.createElement(`template`);t.innerHTML=e.trim(),H.appendChild(t.content)}async function Mu(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 Zn(t,du)&&(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)&&Iu(`Reconcile with findings`,`reconcile`,{reconciles:{exchanges:[e]}});return}let r=t?.closest(`[data-reconcile-accept-all]`);r&&!r.disabled&&Mu(r)});function Nu(){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,Pu=!!H?.querySelector(`[data-ask-pending]`);function Fu(){let e=document.createElement(`div`);e.className=`prb-stopped`,e.textContent=`Stopped.`,H?.appendChild(e),H?.scrollTo({top:H.scrollHeight})}async function Iu(e,t=`free_text`,n={}){let r=e.trim();if(!r||W||Pu)return;document.querySelector(`.prb-ask-empty`)?.remove(),Au(`user`,r);let i=Nu();W=new AbortController,Ru(!0);try{let e=await fetch(R(`/ask`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({question:r,sectionId:ru,source:t,...n}),signal:W.signal}),a=await e.json().catch(()=>null);if(e.status===409&&(a?.running||a?.updating)){Lu(r,n.continuesExplanation),window.location.reload();return}if(i.remove(),a?.stopped){Fu();return}if(!e.ok||!a?.answer){Au(`error`,a?.error??`Buddy AI did not answer. Check the terminal running PR Review Buddy.`);return}Au(`assistant`,a.answer),typeof a.askedAt==`number`&&ju(tr({askedAt:a.askedAt,reconciles:a.reconcileTurn},a.reconciliation?.proposals??[])),a.explanation&&Bn(document,a.explanation),a.reassessment?.card&&Wn(document,a.reassessment.card);for(let e of a.reconciliation?.cards??[])Wn(document,e,du.onVerdictClosed)}catch(e){i.remove(),e instanceof DOMException&&e.name===`AbortError`?(Fu(),Lu(r,n.continuesExplanation)):(Au(`error`,`Could not reach PR Review Buddy. The workspace server may have stopped.`),Lu(r,n.continuesExplanation))}finally{W=null,Ru(!1)}}function Lu(e,t){!U||U.value||(U.value=e,_p?.save(),t&&(G=G?.continues&&e.includes(G.text)?G:{text:e,source:`finding`,continues:t},_p?.stage(G)))}function Ru(e){let t=ku?.querySelector(`button`);t&&(t.textContent=e?`Stop`:`Ask`,t.toggleAttribute(`data-stop`,e),t.disabled=!1);for(let t of document.querySelectorAll(zu))t.disabled=e;e&&B.closeAll(),e||U?.focus()}var zu=`[data-suggestion], .pr-helper-explain-simply-button, [data-reconcile-turn]`;function Bu(){let e=ku?.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()})}ku?.addEventListener(`submit`,e=>{if(e.preventDefault(),W||Pu)return Bu();let t=U?.value??``;U&&(U.value=``),_p?.clear();let n=Hn(G,t);Iu(t,Vu(t),n?{continuesExplanation:n}:{})}),Pu&&Ru(!0);var G=null;function Vu(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||Pu)return;ku?.requestSubmit()}}),U?.addEventListener(`input`,()=>{U&&(U.style.height=`auto`,U.style.height=`${Math.min(U.scrollHeight,140)}px`)});async function Hu(e){try{await fetch(R(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({answeredQuestionIds:e})})}catch{}}function Uu(){return[...document.querySelectorAll(`[data-question-answered][data-answered="true"]`)].map(e=>e.dataset.questionAnswered??``).filter(Boolean)}function Wu(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&&Xu(n,t||e.dataset.verdictClosed===`true`,`questions`),nd()}function Gu(){return[...document.querySelectorAll(`[data-issue-dismissed][data-dismissed="true"]`)].map(e=>({id:e.dataset.issueDismissed??``,sessionId:e.dataset.dismissedIn||Kl})).filter(e=>e.id)}async function Ku(e){try{await fetch(R(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissedIssues:e})})}catch{}}function qu(e,t){e.dataset.dismissed=String(t),e.textContent=t?`Reopen`:`Dismiss`,delete e.dataset.stale,t?e.dataset.dismissedIn=Kl: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(Ju()),Xu(n,t||e.dataset.settled===`true`||e.dataset.verdictClosed===`true`,`issues`),id())}function Ju(){let e=document.createElement(`span`);return e.className=`pr-helper-finding-status pr-helper-finding-status-dismissed pr-helper-tip`,e.dataset.tip=En,e.textContent=`Dismissed by you`,e}var Yu=new WeakMap;function Xu(e,t,n){let r=e.closest(`.pr-helper-closed-findings-list`);if(t!==!!r){if(t){let t=e.parentElement;t&&Yu.set(e,{parent:t,before:e.nextElementSibling}),ed(n).append(e),t&&$u(t)}else Zu(e,n),(r?.children.length===0?r.closest(`.pr-helper-closed-findings`):null)?.remove();td(n)}}function Zu(e,t){let n=Yu.get(e);if(n?.parent.isConnected)n.parent.insertBefore(e,n.before);else{let n=Qu(e)??document.querySelector(`[data-view="${t}"]`);n?.insertBefore(e,n.querySelector(`.pr-helper-closed-findings`))}e.closest(`.pr-helper-question-group`)?.removeAttribute(`hidden`)}function Qu(e){let t=e.dataset.sectionId;return t?document.querySelector(`[data-question-group="${CSS.escape(t)}"]`):null}function $u(e){let t=e.closest(`.pr-helper-question-group`);t&&!t.querySelector(`[data-finding-card]`)&&(t.hidden=!0)}function ed(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 td(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})`:ti(rd()),Gn(document)}function nd(){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=ni(e.length,t)),ad(`questions`,e.length,t,`question`,`answered`)}function rd(){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 id(){let e=rd();if(e.total===0)return;let t=document.querySelector(`[data-view="issues"]`),n=t?.querySelector(`.pr-helper-findings-progress`);!n&&t&&e.done>0&&(n=document.createElement(`div`),n.className=`pr-helper-findings-progress`,n.setAttribute(`role`,`status`),t.querySelector(`.prb-doc-title`)?.after(n)),n&&(n.innerHTML=ei(e.total,e.open,Br(e))),ad(`issues`,e.total,e.open,`issue`,Br(e))}function ad(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}`))}document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-rail-toggle]`);if(n){vu(n,n.getAttribute(`aria-expanded`)!==`true`);return}let r=t.closest(`a[data-view-nav], a[data-goto-section]`);if(r&&!ee(e))return;r&&e.preventDefault();let i=t.closest(`[data-view-nav]`);if(i?.dataset.viewNav){mu(i.dataset.viewNav);return}let a=t.closest(`[data-author-context-toggle]`);if(a){qr(a);return}let o=t.closest(`[data-author-context-reveal]`);if(o){Qr(o);return}let s=t.closest(`[data-overview-nav]`);if(s?.dataset.overviewNav){mu(s.dataset.overviewNav===`guide`?`guide`:s.dataset.overviewNav);return}let c=t.closest(`[data-goto-section]`);if(c?.dataset.gotoSection){hu(c.dataset.gotoSection);return}let l=t.closest(`[data-open-editor]`);if(l?.dataset.openEditor){Ou(l.dataset.openEditor,Number(l.dataset.openLine)||1,!l.closest(`[data-architecture]`)||null);return}let u=t.closest(`[data-deletion-toggle]`);if(u){Bc(u);return}let d=t.closest(`[data-code-expand]`);if(d){let e=d.closest(`.prb-code`);e&&ol(e,!e.hasAttribute(`data-expanded`));return}let f=t.closest(`[data-change-step]`);if(f){let e=f.closest(`[data-change-navigator]`),t=f.closest(`.prb-code`);e&&t&&!f.disabled&&Du(t,e,f.dataset.changeStep===`previous`?`previous`:`next`);return}let p=t.closest(`[data-full-line]`);if(p){let e=Hc(p);e&&Rl(e);return}let m=t.closest(`[data-expand-file]`);if(m?.dataset.expandFile){let e=m.closest(`.prb-code`);if(e){let t=e.querySelector(`[data-change-navigator]`);Tu(e,m.dataset.expandFile,{cited:Number(m.dataset.expandCited)||0,centre:Number(m.dataset.expandLine)||0,expand:Number(m.dataset.expandStep)||1,position:Number(t?.dataset.changePosition)||0,focus:Yc(t)})}return}let h=t.closest(`[data-focus-toggle]`);if(h?.dataset.focusToggle){pu(h.dataset.focusToggle);return}let g=t.closest(`[data-prompt-toggle]`);if(g){Nd(g.getAttribute(`aria-expanded`)===`true`);return}if(t.closest(`[data-ask-buddy-menu], [data-grade-menu]`))return;let _=t.closest(`[data-file]`);if(_?.dataset.file){Cu(_);return}let v=ii(t);if(v){hu(v);return}let te=t.closest(`[data-question-answered]`);if(te?.dataset.questionAnswered){Wu(te,te.dataset.answered!==`true`),Ur(te);let e=Uu();Hu(e),$l({event:`question_marked_answered`,answered:e.length,total:document.querySelectorAll(`[data-question-answered]`).length});return}let y=t.closest(`[data-issue-dismissed]`);if(y?.dataset.issueDismissed){qu(y,y.dataset.stale===`true`||y.dataset.dismissed!==`true`);let e=Gu();Ku(e),$l({event:`issue_dismissed`,dismissed:e.length,total:document.querySelectorAll(`[data-issue-dismissed]`).length});return}let b=t.closest(`[data-suggestion]`);if(b){Iu(b.textContent??``,`suggestion`);return}if(t.closest(`.pr-helper-explain-simply-button`)){ud(),Iu(Gl,`explain_simply`);return}let x=t.closest(`[data-prompt-use]`);if(x?.dataset.promptUse){Pd(x.dataset.promptUse);return}let S=t.closest(`[data-prompt-edit]`);if(S?.dataset.promptEdit){tf(S.dataset.promptEdit);return}if(t.closest(`[data-prompt-add]`)){tf(``);return}if(t.closest(`[data-ask-toggle]`)){let e=z?.focus;e?(Dr(z,uu),cd(e!==`buddy`)):cd(!sd())}});var K=document.querySelector(`.prb-body`),od=document.querySelector(`.prb-ask`);function sd(){return!!od&&getComputedStyle(od).display!==`none`}function cd(e){K&&(K.dataset.ask=e?`open`:`closed`),ld(e),Ql.ask(e)}function ld(e){for(let t of document.querySelectorAll(`[data-ask-toggle]`))t.setAttribute(`aria-expanded`,String(e))}function ud(){z?.focus&&z.focus!==`buddy`&&Dr(z,uu),cd(!0)}function dd(){ld(sd())}window.addEventListener(`resize`,dd),x(R(`/restart`));var fd=document.querySelector(`[data-file-filter]`),pd=document.querySelector(`[data-file-count]`),md=document.querySelector(`[data-file-none]`);function hd(){let e=(fd?.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}`}md&&(md.hidden=n>0),pd&&(pd.textContent=e?`${t} of ${gd} file${gd===1?``:`s`}`:`${gd} file${gd===1?``:`s`}`)}var gd=document.querySelectorAll(`[data-view="files"] .prb-file:not(.prb-file-referenced)`).length;fd?.addEventListener(`input`,hd),fd?.addEventListener(`keydown`,e=>{e.key===`Escape`&&fd.value!==``&&(e.preventDefault(),fd.value=``,hd())}),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(),Cu(n))});var _d=320,vd=()=>Math.round(window.innerWidth/2),yd=e=>Math.round(Math.min(vd(),Math.max(_d,e)));function bd(e){K&&(e===null?K.style.removeProperty(`--ask-width`):K.style.setProperty(`--ask-width`,`${e}px`))}function xd(){return od?Math.round(od.getBoundingClientRect().width):_d}function Sd(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=xd(),r=e=>{bd(yd(n+(t-e.clientX)))},i=()=>{q.removeEventListener(`pointermove`,r),q.removeEventListener(`pointerup`,i),q.removeEventListener(`pointercancel`,i),delete K.dataset.resizing,Sd(xd())};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=yd(xd()+n);bd(r),Sd(r);return}(e.key===`Home`||e.key===`Escape`)&&(e.preventDefault(),bd(null),Sd(null))}),q?.addEventListener(`dblclick`,()=>{bd(null),Sd(null)}),window.addEventListener(`resize`,()=>{sd()&&K?.style.getPropertyValue(`--ask-width`)&&bd(yd(xd()))});var Cd=3e4,wd=document.visibilityState===`visible`?Date.now():null,Td=0;function Ed(){wd!==null&&(Td+=Date.now()-wd,wd=Date.now())}function Dd(){Ed();let e=Math.round(Td/1e3);return Td-=e*1e3,e}document.addEventListener(`visibilitychange`,()=>{document.visibilityState===`visible`?wd=Date.now():(Ed(),wd=null)}),setInterval(()=>{let e=Dd();e>0&&$l({event:`workspace_heartbeat`,visibleSeconds:e})},Cd),window.addEventListener(`pagehide`,()=>{let e=R(`/event`),t=JSON.stringify({event:`review_completed`,trailingSeconds:Dd()});navigator.sendBeacon?.(e,new Blob([t],{type:`application/json`}))||fetch(e,{method:`POST`,headers:{"content-type":`application/json`},body:t,keepalive:!0}).catch(()=>{})});var Od=document.querySelector(`[data-prompt-bank]`),kd=document.querySelector(`[data-prompt-list]`),J=Ad();function Ad(){try{let e=JSON.parse(Od?.dataset.prompts??`[]`);return Array.isArray(e)?e:[]}catch{return[]}}function jd(){if(!kd)return;kd.innerHTML=J.map(e=>`<span class="prb-bank-item">
|
|
184
|
+
<button type="button" class="prb-bank-use" data-prompt-use="${V(e.id)}" title="${V(e.prompt)}">${V(e.name)}</button>
|
|
185
|
+
<button type="button" class="prb-bank-edit" data-prompt-edit="${V(e.id)}" aria-label="Edit ${V(e.name)}">✎</button>
|
|
186
|
+
</span>`).join(``);let e=document.querySelector(`[data-prompt-count]`);e&&(e.textContent=String(J.length)),Hd()}async function Md(e){try{let t=await(await fetch(R(`/prompts`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({prompts:e})})).json().catch(()=>null);J=Array.isArray(t?.prompts)?t.prompts:J}catch{}jd()}function Nd(e){document.querySelector(`[data-prompt-toggle]`)?.setAttribute(`aria-expanded`,String(!e)),Od?.toggleAttribute(`data-collapsed`,e),kd&&(kd.hidden=e),fetch(R(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({promptsCollapsed:e})}).catch(()=>{})}function Pd(e){let t=J.find(t=>t.id===e);!t||!U||(U.value=si(U.value,t.prompt),ud(),U.focus(),U.setSelectionRange(U.value.length,U.value.length),U.dispatchEvent(new Event(`input`)))}var Fd=document.querySelector(`.prb-doc`),Id=null,Ld=null;function Rd(){H&&(Ld?.(),Ld=vn(H,{layout:`flat`,actions:xn.map(e=>({id:e.id,label:e.label})),onChoose:(e,t)=>Ud(e,`selection`,t)}))}var zd=`reassess`;function Bd(e){let t=Vd();if(!e)return t;let n={id:zd,label:`Reassess ${e.kind===`issue`?`severity`:`importance`}`};return[...t.filter(e=>!e.section),n,...t.filter(e=>e.section)]}function Vd(){return[...yn.map(e=>({id:e.id,label:e.label})),...J.map(e=>({id:ar(e.id),label:e.name,section:ir}))]}function Hd(){Fd&&(Id?.(),Id=vn(Fd,{triggerLabel:`Ask Buddy AI`,actions:Vd(),ignoreWithin:`[data-ask-buddy-menu]`,onChoose:(e,t)=>Ud(e,`selection`,t)}))}function Ud(e,t,n,r){zr(e,{context:t,text:n},{savedPrompt:e=>J.find(t=>t.id===e)?.prompt??null,stage:e=>Wd(e,t,r?.continuesExplanation?r.ref:void 0),send:t=>{ud(),Iu(t,`finding`,Ln(e,r?.ref))}})}function Wd(e,t,n){U&&(G={text:e,source:t,...n?{continues:n}:{}},_p?.stage(G),U.value=si(U.value,e),ud(),U.focus(),U.setSelectionRange(U.value.length,U.value.length),U.dispatchEvent(new Event(`input`)))}function Gd(e){let t=e.querySelector(`[data-menu-panel]`);if(t){t.innerHTML=cn(Bd(zn(e)));for(let e of t.querySelectorAll(`[data-selection-action]`))e.setAttribute(`role`,`menuitem`);if(W||Pu)for(let e of t.querySelectorAll(`button`))e.disabled=!0}}function Kd(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=Tn(n),a=zn(n);if(B.close(n),r===zd){i&&a&&qd(a,i);return}i&&Ud(r,`finding`,i,a?{ref:a}:void 0)});function qd(e,t){if(W||Pu)return;let n=e.kind===`issue`?`severity`:`importance`;ud(),Iu(`${Cn(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?$n(t):null;n&&Wd(n,`finding`)}),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-simple-explanation-more]`);if(!t)return;let n=Rn(t),r=Tn(t);n&&r&&Ud(`custom`,`finding`,r,{ref:n,continuesExplanation:!0})}),Hd(),Rd();var Y=Ya({root:document,showView:e=>mu(e)}),Jd=io({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)});jt(document),Gt(document);var Yd=document.querySelector(`[data-prompt-dialog]`),Xd=document.querySelector(`[data-prompt-name]`),Zd=document.querySelector(`[data-prompt-text]`),Qd=document.querySelector(`[data-prompt-delete]`),$d=document.getElementById(`prb-prompt-title`),ef=``;function tf(e){let t=J.find(t=>t.id===e);ef=t?.id??``,$d&&($d.textContent=t?`Edit prompt`:`Save a prompt`),Xd&&(Xd.value=t?.name??``),Zd&&(Zd.value=t?.prompt??``),Qd&&(Qd.hidden=!t),Yd?.showModal(),Xd?.focus()}async function nf(){let e=Xd?.value.trim()??``,t=Zd?.value.trim()??``;if(!e||!t){(e?Zd:Xd)?.focus();return}let n=ef?J.map(n=>n.id===ef?{...n,name:e,prompt:t}:n):[...J,{id:crypto.randomUUID(),name:e,prompt:t}];Yd?.close(),await Md(n)}async function rf(){if(!ef)return;let e=J.filter(e=>e.id!==ef);Yd?.close(),await Md(e)}document.querySelector(`[data-prompt-cancel]`)?.addEventListener(`click`,()=>Yd?.close()),Qd?.addEventListener(`click`,()=>void rf()),document.querySelector(`[data-prompt-save]`)?.addEventListener(`click`,()=>void nf());var af=document.querySelector(`[data-fresh-region]`),of=document.querySelector(`[data-fresh-status]`),sf=document.querySelector(`[data-fresh-check]`),X=vf(af?.dataset.report),cf=`prb-fresh-reopen`,lf=mf(),uf=af?.dataset.dismissedSha,df=pf(af?.dataset.availability),Z=ff(af?.dataset.remote);function ff(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function pf(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function mf(){try{return sessionStorage.getItem(cf)!==null&&(sessionStorage.removeItem(cf),!0)}catch{return!1}}lf&&Ff(),sf?.addEventListener(`click`,()=>void Sf());var hf=document.querySelector(`[data-fetch-remote]`);hf&&(fetch(R(`/fetch`)).then(e=>e.ok?e.json():null).then(e=>{e?.fetchable===!0&&(hf.hidden=!1)}).catch(()=>{}),hf.addEventListener(`click`,()=>void gf(hf)));async function gf(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};te(c(),{kind:n.fetched<n.repositories?`failed`:`ready`,text:ne(n)}),n.fetched>0&&await Sf()}af?.addEventListener(`click`,e=>{let t=e.target;if(t.closest(`[data-fresh-close]`))return lf=!1,Ff();let n=t.closest(`[data-fresh-dismiss]`);n&&(uf=n.dataset.freshDismiss||void 0,lf=!1,Ff(),_f())});function _f(){fetch(R(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissFreshnessSha:uf??null})}).catch(()=>{})}function vf(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}var yf=Pa(),bf=!1,xf=null;async function Sf(){if(bf)return;bf=!0,Of(!0),xf&&await xf;let e=kf(X,Z),t=await wf(!1);Of(!1),t&&Pf(),bf=!1,t&&(X?.code.state===`changed`||Z!==null)&&uf!==void 0&&(uf=void 0,_f()),Ff(),Cf(t?kf(X,Z)===e?`No change`:`Updated`:`Could not check`)}function Cf(e){of&&(of.textContent=e,window.setTimeout(If,2600))}async function wf(e){let t=yf.snapshot();try{let n=await(await fetch(`${R(`/freshness`)}${e?`&quiet=1`:``}`)).json();X=n.report??null,df=n.availability??null,Z=n.remote??null,jf=n.kiss??null,n.kissDismissedSha!==void 0&&(Mf=n.kissDismissedSha??void 0),n.prState!==void 0&&Df(n.prState);let r=Na(n.standing);return r&&yf.current(t)&&Ta(document,r),!0}catch{return!1}}async function Tf(){if(bf||xf||!af)return;let e=kf(X,Z),t=JSON.stringify(jf);xf=wf(!0);let n=await xf;xf=null,Ef=Date.now(),n&&(kf(X,Z)!==e&&Ff(),JSON.stringify(jf)!==t&&Pf())}var Ef=Date.now();function Df(e){let t=document.querySelector(`[data-pr-state-slot]`);if(!t)return;let n=wa(e,t.hasAttribute(`data-beside-number`));t.innerHTML!==n&&(t.innerHTML=n)}function Of(e){sf&&(sf.disabled=e),of&&e&&(of.textContent=`Checking…`,of.dataset.state=`checking`)}function kf(e,t){if(!e)return JSON.stringify({report:`none`,remote:t});let{checkedAt:n,...r}=e;return JSON.stringify({...r,remote:t})}var Af=document.querySelector(`[data-kiss-fresh-region]`),jf=Nf(Af?.dataset.freshness),Mf=Af?.dataset.dismissedSha;function Nf(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function Pf(){_a(jf?.state===`changed`),Af&&(Af.innerHTML=la(Af.dataset.reviewedSha??``,jf,{dismissedSha:Mf,actions:Vl!==``}))}Af?.addEventListener(`click`,e=>{let t=e.target.closest(`[data-kiss-freshness-dismiss]`);t&&(Mf=t.dataset.kissFreshnessDismiss||void 0,Pf(),fetch(R(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissKissFreshnessSha:Mf??null})}).catch(()=>{}))});function Ff(){af&&(af.innerHTML=Ii(X,{dismissedSha:uf,open:lf,actions:Vl!==``,availability:df,remote:Z}),If())}function If(){if(of&&(X||Z)){let{label:e,state:t}=Pi(X,Z);of.textContent=e,of.dataset.state=t,qi(document,t)}}document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-copy-command]`);if(n)return Lf(n);let r=t.closest(`[data-notice-dismiss]`);if(r){r.closest(`[data-notice]`)?.remove(),fetch(R(`/prefs`),{method:`POST`,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 zf(i);if(t.closest(`[data-review-update]`))return void Uf();let a=t.closest(`[data-update-cancel]`);if(a)return void Gf(a,`update`);let o=t.closest(`[data-review-cancel]`);if(o)return void Gf(o,`review`);t.closest(`[data-update-close]`)&&document.querySelector(`[data-update-result]`)?.remove()});function Lf(e){let t=e.dataset.copyCommand??``;navigator.clipboard?.writeText(t).then(()=>Rf(e,`Copied`),()=>Rf(e,`Select it`))}function Rf(e,t,n=1400){let r=e.textContent;e.textContent=t,setTimeout(()=>{e.textContent=r},n)}async function zf(e){let t=[...document.querySelectorAll(`[data-pr-recheck]`)];for(let e of t)e.disabled=!0;let n=Date.now(),r=()=>{let e=Math.max(1,Math.round((Date.now()-n)/1e3));for(let n of t){let t=Bf(n);t?t.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Re-checking the conversation, ${e}s. ${Jf}`:n.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Checking… ${e}s`}};r();let i=window.setInterval(r,1e3),a=Bf(e)?null:Yf(e);try{await fetch(R(`/refresh`),{method:`POST`})}catch{}finally{window.clearInterval(i),a?.remove()}Bf(e)&&Vf(),window.location.reload()}function Bf(e){return e.closest(`.prb-fresh-notes p`)}function Vf(){try{sessionStorage.setItem(cf,`1`)}catch{}}var Hf=!1;async function Uf(){if(Hf)return;Hf=!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`&&!Zi(e.update.phase)&&n()}catch{}},500);try{await fetch(R(`/update`),{method:`POST`})}catch{}n()}var Wf={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 Gf(e,t){let n=Wf[t],r=(t===`review`?e.dataset.reviewCancel:e.dataset.updateCancel)??``;e.disabled=!0,e.textContent=`Cancelling…`;let i;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`);i=n.took(await e.json())}catch{e.disabled=!1,e.textContent=n.label,qf(e,`The workspace server did not answer, so nothing was cancelled. Try again.`);return}i||qf(e,n.tooLate),await _o({look:async()=>{let e=await fetch(R(`/job`),{signal:AbortSignal.timeout(Kf)});return n.running(await e.json())},reload:()=>window.location.reload()})}var Kf=3e3;function qf(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 Jf=`Fetching the latest threads from your pull request. This usually takes under a minute.`;function Yf(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=Jf,t.appendChild(n),n}var Xf=uo(document),Zf=null,Qf=Date.now();function $f(){Zf===null&&(Zf=window.setTimeout(()=>{Zf=null,ep()},oe(Date.now()-Qf)))}async function ep(){try{let e=await(await fetch(R(`/job`))).json();if(Pu&&!e.ask||np&&!e.diagram){window.location.reload();return}let t={job:e,kiss:e.kiss,update:e.update};for(let[e,n]of Xf){let r=t[e];if(r){if(fo(e,r,document)){window.location.reload();return}e===`update`||n.matches(`[data-progress-pane]`)?mo(n,r.phase,r.progress):tp(n,r.progress)}}}catch{}$f()}function tp(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 np=document.querySelector(`[data-diagram-running]`)!==null;(Xf.size>0||Pu||np)&&(Qf=Date.now(),$f()),document.querySelector(`[data-started-at]`)&&go(document);function rp(e){let t=e.parentElement;if(!t)return;let n=t.querySelector(`.prb-job-retry-status`);n||(n=document.createElement(`p`),n.className=`prb-job-retry-status`,n.setAttribute(`role`,`status`),t.insertBefore(n,e.nextSibling)),n.textContent=`The retry could not be started. You can try again.`}function ip(e){e.parentElement?.querySelector(`.prb-job-retry-status`)?.remove()}document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-job-retry]`);t&&(t.disabled=!0,t.textContent=`Retrying…`,ip(t),fetch(R(`/retry`),{method:`POST`}).then(e=>{if(!e.ok)throw Error(`refused`);Qf=Date.now(),$f()}).catch(()=>{t.disabled=!1,t.textContent=`Retry`,rp(t)}))}),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=Vr,Rf(t,`Could not start. Try again`,2500)}))});var ap={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)=>{ad(`kiss`,e,t,`recommendation`,`decided`),ad(`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){fa(r,da(n),ap);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 op=document.body.dataset.defaultView||`overview`;window.addEventListener(`popstate`,e=>{let t=br(e.state)??xr(window.location.hash)??{kind:`view`,view:op},n=!z||!Tr(z,t),r=Yl;Yl=!1,r?lu(t):Xl(()=>lu(t)),n&&su(t),gp()});var sp=xr(window.location.hash),cp=window.location.hash===ll,lp=L.current().ui===null,up=window.matchMedia(`(max-width: 860px)`).matches,dp=lp&&!sp?.focus?Fr(Zl.expanded,vr(sp??{kind:`view`,view:op},cu),e=>document.querySelector(`[data-focus-toggle="${e}"]`)!==null,up):null;if(lp&&K?.dataset.ask===`open`&&up&&delete K.dataset.ask,dp){let e=sp??{kind:`view`,view:op};sp||(z=e);let t={...e,focus:dp};L.replace(pr(t),t),lu(t)}else sp?lu(sp):(z={kind:`view`,view:op},L.replace(``,z));ql=!0;var fp={enterTour(){let e=z,t=e?.kind===`view`&&e.view===`overview`&&!e.focus;return t||Xl(()=>lu({kind:`view`,view:`overview`})),()=>{!t&&e&&Xl(()=>lu(e))}},save(e){fetch(R(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({guidedTour:e})}).catch(()=>{})}};cp?xl(document,window,fp):zl.dataset.guidedTour===`offer`&&vl(document,window,{mode:`first`,host:fp});var pp={doc:document,main:document.querySelector(`main.prb-doc`),rail:document.querySelector(`.prb-rail`),log:H,panes:K};L.setCapturer(()=>xi(pp));async function mp(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?wu.pending(o):void 0;if(!o||!mi(s?s.request:fi(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}=Su(e);t.insertAdjacentElement(n,o),e.setAttribute(`aria-expanded`,`true`)}if(!await Tu(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`)&&ol(o,a.tall),t&&pi(o,t.top,t.offset))}function hp(e){li(e)?.remove(),e.setAttribute(`aria-expanded`,`false`)}async function gp(){let e=++ou,t=()=>ou===e;await Si(pp,L.current().ui,{setFold:(e,t)=>Xl(()=>vu(e,t)),setAsk:e=>Xl(()=>cd(e)),clearAsk:()=>{K&&delete K.dataset.ask,ld(sd())},openPanel:(e,n)=>mp(e,n,t),closePanel:hp,stillCurrent:t})}gp();var _p=U?ki(U,{storage:(()=>{try{return window.sessionStorage}catch{return null}})(),path:window.location.pathname,restore:!0,win:window}):null;G=_p?.restoredStage??null,dd(),xu();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-menu]`),$=Ia({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:yf,checkForUpdates:()=>Sf()});function yp(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 bp(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();yp(n.error)}}function xp(e){return Q?.querySelector(`[data-menu-items] ${e}`)??null}function Sp(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()}if(Q){let e=Q.querySelector(`[data-confirm-delete]`),n=()=>Kd(Q);Q.addEventListener(`click`,e=>{let t=e.target,a=t?.closest(`[data-copy-id]`);if(a?.dataset.copyId){e.stopPropagation(),re(a,a.dataset.copyId);return}if(t?.closest(`[data-tour-replay]`)){e.stopPropagation(),B.closeAll(),xl(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]`)){B.closeAll();return}let s=t?.closest(`[data-mark-status]`);if(s){e.stopPropagation(),bp(()=>$.setComplete(s.dataset.markStatus===`complete`),s);return}let c=t?.closest(`[data-lifecycle-set]`);if(c){e.stopPropagation(),bp(()=>$.setLifecycle(c.dataset.lifecycleSet),c);return}let l=t?.closest(`[data-queue-action]`);if(l){e.stopPropagation(),bp(()=>$.setQueued(l.dataset.queueAction===`remove`?`remove`:`add`),l);return}if(t?.closest(`[data-delete]`)){e.stopPropagation(),Sp();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(R(`/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(),yp(t)}}function Cp(e){return{available:()=>document.querySelector(`.prb-rail a[data-view-nav="${e}"]`)!==null,run:()=>mu(e,{keepFocus:!0})}}function wp(){if(!z)return null;let e=z.focus??(z.kind===`section`?`guide`:z.view);return lr.includes(e)&&document.querySelector(`[data-focus-toggle="${e}"]`)?e:null}function Tp(){return[...document.querySelectorAll(`.prb-view:not([hidden]) [data-feedback-select]`)].some(e=>e.checkVisibility())}u(`review`,{...Jd.commands,...to(Y,document),"review.section.review":{available:()=>oo(document)!==null,run:()=>{let e=oo(document);e&&mu(e,{keepFocus:!0})}},"review.section.kiss":Cp(`kiss`),"review.section.issues":Cp(`issues`),"review.section.diagrams":Cp(`map`),"review.section.questions":Cp(`questions`),"review.section.files":Cp(`files`),"review.buddy.open":{available:()=>od!==null,run:()=>{z?.focus?Er(z,`buddy`,uu):cd(!0),document.querySelector(`[data-ask-form] textarea`)?.focus()}},"review.buddy.prompt":{available:()=>od!==null&&U!==null,panel:ie({prompts:()=>J,choose:Pd})},"review.focus.toggle":{available:()=>wp()!==null,run:()=>{let e=wp();e&&pu(e)}},"review.leave":{available:e=>!!(e&&Or(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&&Dr(z,uu)}},"review.feedback.toggle":{available:()=>Y.state().selecting||Tp(),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 bp(()=>$.setComplete(!0),xp(`[data-mark-status]`))},"review.mark.waiting":{available:()=>$.offer().waiting,run:()=>void bp(()=>$.setLifecycle(`waiting`),xp(`[data-lifecycle-set="waiting"]`))},"review.mark.done":{available:()=>$.offer().done,run:()=>void bp(()=>$.setLifecycle(`done`),xp(`[data-lifecycle-set="done"]`))},"review.queue.toggle":{available:()=>$.offer().queue,run:()=>void bp(()=>$.toggleQueued(),xp(`[data-queue-action]`))},"review.checkUpdates":{available:()=>$.offer().checkForUpdates,run:()=>void $.checkForUpdates()},"review.update":{available:()=>Fi(X,{actions:Vl!==``&&!Xf.has(`update`)&&!Hf,remote:Z}),run:()=>void Uf()},"review.delete":{available:()=>$.offer().delete,run:()=>Sp({focusCancel:!0})}},{onOpen:()=>B.closeAll()}),m(),Vl&&Nc({markSeen:()=>fetch(R(`/seen`),{method:`POST`}),askUnread:()=>fetch(R(`/unread`))}),setTimeout(()=>{Ml(wl([...document.querySelectorAll(`[data-view="files"] [data-file]`)].map(e=>e.dataset.file??``)))},0),p(window,()=>window.location.reload());var Ep=15e3,Dp=6e4;function Op(){return Vl!==``&&document.visibilityState===`visible`&&!Xf.has(`update`)}document.addEventListener(`visibilitychange`,()=>{Op()&&Date.now()-Ef>=Ep&&Tf()}),window.setInterval(()=>{Op()&&Tf()},Dp);export{lc as n,Vt as r,fc as t};
|