prreviewbuddy 0.25.13 → 0.29.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 +128 -0
- package/dist/{relative_time-vn8Ex9E8.js → delete_review-DUCSC5Bc.js} +4935 -4440
- package/dist/main.js +861 -306
- package/dist/server.js +585 -108
- package/package.json +1 -1
- package/static/reviews.js +1 -1
- package/static/shell.css +80 -3
- package/static/workspace.js +28 -28
package/static/workspace.js
CHANGED
|
@@ -2,12 +2,12 @@ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["chunk-B80S6zbH.js","ch
|
|
|
2
2
|
import{t as e}from"./chunk-CIsM3PMS.js";import{n as t,t as n}from"./chunk-gBDI1-Cy.js";function r(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}var i=`pr-helper-code-block`,a=`pr-helper-code-copy`,o=`\0`,s=``,c=/\u0000(\d+)\u0000/g,ee=/^\u0000\d+\u0000$/,l=/\u0001(\d+)\u0001/g,u=/^(?:https?:\/\/|#)/i;function te(e){let{text:t,blocks:n}=ne(e.replace(/[\u0000\u0001]/g,``));return re(ie(t),n)}function ne(e){let t=[],n=e.split(`
|
|
3
3
|
`),r=[],i=0;for(;i<n.length;){let e=n[i].match(/^\s*(`{3,}|~{3,})\s*[\w+#.-]*\s*$/);if(!e){r.push(n[i]),i+=1;continue}let a=RegExp(`^\\s*${e[1][0]}{3,}\\s*$`),s=[];for(i+=1;i<n.length&&!a.test(n[i]);)s.push(n[i]),i+=1;i+=1,r.push(`${o}${t.length}${o}`),t.push(s.join(`
|
|
4
4
|
`))}return{text:r.join(`
|
|
5
|
-
`),blocks:t}}function re(e,t){return e.replace(c,(e,n)=>`<div class="${i}"><pre><code>${r(t[Number(n)])}</code></pre><button type="button" class="${a}" aria-label="Copy code">Copy</button></div>`)}function ie(e){let t=[],n=[],r=[],i=null,a=()=>{n.length&&t.push(`<p>${
|
|
6
|
-
`)){let e=o.trim();if(!e){a();continue}if(ee.test(e)){a(),t.push(e);continue}if(/^(?:-{3,}|\*{3,}|_{3,})$/.test(e)){a(),t.push(`<hr>`);continue}let s=e.match(/^(#{1,6})\s+(.+)$/);if(s){a();let e=Math.min(s[1].length,3)+3;t.push(`<h${e}>${
|
|
5
|
+
`),blocks:t}}function re(e,t){return e.replace(c,(e,n)=>`<div class="${i}"><pre><code>${r(t[Number(n)])}</code></pre><button type="button" class="${a}" aria-label="Copy code">Copy</button></div>`)}function ie(e){let t=[],n=[],r=[],i=null,a=()=>{n.length&&t.push(`<p>${d(n.join(` `))}</p>`),r.length&&t.push(`<blockquote>${d(r.join(` `))}</blockquote>`),i&&t.push(`<${i.tag}>${i.items.map(e=>`<li>${d(e)}</li>`).join(``)}</${i.tag}>`),n=[],r=[],i=null};for(let o of e.split(`
|
|
6
|
+
`)){let e=o.trim();if(!e){a();continue}if(ee.test(e)){a(),t.push(e);continue}if(/^(?:-{3,}|\*{3,}|_{3,})$/.test(e)){a(),t.push(`<hr>`);continue}let s=e.match(/^(#{1,6})\s+(.+)$/);if(s){a();let e=Math.min(s[1].length,3)+3;t.push(`<h${e}>${d(s[2])}</h${e}>`);continue}let c=e.match(/^[-*+]\s+(.+)$/);if(c){i?.tag!==`ul`&&(a(),i={tag:`ul`,items:[]}),i.items.push(c[1]);continue}let l=e.match(/^\d{1,9}[.)]\s+(.+)$/);if(l){i?.tag!==`ol`&&(a(),i={tag:`ol`,items:[]}),i.items.push(l[1]);continue}let u=e.match(/^>\s?(.*)$/);if(u){r.length||a(),r.push(u[1]);continue}if(i&&i.items.length){i.items[i.items.length-1]+=` ${e}`;continue}if(r.length){r[r.length-1]+=` ${e}`;continue}n.push(e)}return a(),t.join(``)}function d(e){let t=[];return r(e).replace(/`([^`\n]+)`/g,(e,n)=>(t.push(n),`${s}${t.length-1}${s}`)).replace(/(?<!!)\[([^\]\n]+)\]\(([^)\s]+)\)/g,(e,t,n)=>u.test(n)?`<a href="${n}" target="_blank" rel="noopener noreferrer">${t}</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(l,(e,n)=>`<code>${t[Number(n)]}</code>`)}var ae=`pr-helper-selection-popover`,oe=`pr-helper-selection-popover-expanded`,se=`pr-helper-selection-copy-done`,ce=8,f=8,le=1e3,ue=`Copy selected text`,de=`Copy`,fe=`Copied`,pe=`pr-helper-selection-popover-flat`,p=null;function me(e){return`<button type="button" class="pr-helper-selection-menu-item" data-selection-action="${r(e.id)}">${r(e.label)}</button>`}function he(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(me).join(``)}${[...t].map(([e,t])=>`
|
|
7
7
|
<div class="pr-helper-selection-menu-group">
|
|
8
8
|
<div class="pr-helper-selection-menu-heading">${r(e)}</div>
|
|
9
|
-
<div class="pr-helper-selection-menu-group-items">${t.map(
|
|
10
|
-
</div>`).join(``)}`}function
|
|
9
|
+
<div class="pr-helper-selection-menu-group-items">${t.map(me).join(``)}</div>
|
|
10
|
+
</div>`).join(``)}`}function ge(e){if(e.layout===`flat`)return _e(e);let t=he(e.actions);return`
|
|
11
11
|
<div class="pr-helper-selection-bar">
|
|
12
12
|
<button type="button" class="pr-helper-selection-trigger" data-selection-open>
|
|
13
13
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="12" height="12" fill="currentColor" aria-hidden="true">
|
|
@@ -15,7 +15,7 @@ import{t as e}from"./chunk-CIsM3PMS.js";import{n as t,t as n}from"./chunk-gBDI1-
|
|
|
15
15
|
</svg>
|
|
16
16
|
<span>${r(e.triggerLabel??`Ask`)}</span>
|
|
17
17
|
</button>
|
|
18
|
-
<button type="button" class="pr-helper-selection-copy" data-selection-copy aria-label="${
|
|
18
|
+
<button type="button" class="pr-helper-selection-copy" data-selection-copy aria-label="${ue}" aria-describedby="pr-helper-selection-tip">
|
|
19
19
|
<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">
|
|
20
20
|
<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"/>
|
|
21
21
|
<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"/>
|
|
@@ -24,44 +24,44 @@ import{t as e}from"./chunk-CIsM3PMS.js";import{n as t,t as n}from"./chunk-gBDI1-
|
|
|
24
24
|
<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"/>
|
|
25
25
|
</svg>
|
|
26
26
|
</button>
|
|
27
|
-
<span class="pr-helper-selection-tip" id="pr-helper-selection-tip" role="tooltip">${
|
|
27
|
+
<span class="pr-helper-selection-tip" id="pr-helper-selection-tip" role="tooltip">${ue}</span>
|
|
28
28
|
</div>
|
|
29
29
|
<div class="pr-helper-selection-menu">${t}</div>
|
|
30
|
-
`}function
|
|
31
|
-
${
|
|
32
|
-
<button type="button" class="pr-helper-selection-menu-item pr-helper-selection-copy-item" data-selection-copy>${
|
|
33
|
-
</div>`}function
|
|
30
|
+
`}function _e(e){return`<div class="pr-helper-selection-menu">
|
|
31
|
+
${he(e.actions)}
|
|
32
|
+
<button type="button" class="pr-helper-selection-menu-item pr-helper-selection-copy-item" data-selection-copy>${de}</button>
|
|
33
|
+
</div>`}function ve(e,t){let{width:n,height:r}=e.getBoundingClientRect(),i=t.top-r-ce,a=i>=f?i:Math.min(t.bottom+ce,window.innerHeight-r-f),o=Math.max(f,Math.min(t.left,window.innerWidth-n-f));e.style.top=`${Math.max(f,a)}px`,e.style.left=`${o}px`}function m(){h&&=(window.clearTimeout(h),0),p?.popover.remove(),p=null}var h=0;function ye(e){let t=e.querySelector(`.pr-helper-selection-tip`),n=e.querySelector(`.pr-helper-selection-copy-item`);e.classList.add(se),t&&(t.textContent=fe),n&&(n.textContent=fe),h&&window.clearTimeout(h),h=window.setTimeout(()=>be(e),le)}function be(e){h&&=(window.clearTimeout(h),0),e.classList.remove(se);let t=e.querySelector(`.pr-helper-selection-tip`);t&&(t.textContent=ue);let n=e.querySelector(`.pr-helper-selection-copy-item`);n&&(n.textContent=de)}async function xe(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}ye(e)}function Se(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 Ce(e,t){let n={},r=()=>{let r=Se(e,t);if(!r){(!p||p.owner===n)&&m();return}if(p&&p.owner!==n&&m(),p)p.popover.classList.remove(oe),be(p.popover),p.text=r.text;else{let i=document.createElement(`div`);i.className=t.layout===`flat`?`${ae} ${pe}`:ae,i.innerHTML=ge(t),i.addEventListener(`mousedown`,e=>e.preventDefault()),i.addEventListener(`click`,n=>{let r=n.target;if(r.closest(`[data-selection-copy]`)){p?.text&&xe(i,p.text);return}if(r.closest(`[data-selection-open]`)){i.classList.add(oe);let n=Se(e,t);ve(i,n?.rect??i.getBoundingClientRect());return}let a=r.closest(`[data-selection-action]`)?.dataset.selectionAction;if(!a||!p)return;let o=p.text;m(),t.onChoose(a,o)}),document.body.appendChild(i),p={popover:i,text:r.text,owner:n}}ve(p.popover,r.rect)},i=e=>{p&&e.target instanceof Node&&p.popover.contains(e.target)||window.setTimeout(r,0)},a=e=>{(e.shiftKey||e.key===`Shift`)&&r()},o=()=>{if(!p)return;let e=window.getSelection();(!e||e.isCollapsed)&&m()},s=e=>{e.key===`Escape`&&m()},c=()=>m();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),m()}}async function we(e){try{return await navigator.clipboard.writeText(e),!0}catch(t){return console.warn(`PR Helper: clipboard write failed, falling back to execCommand`,t),Te(e)}}function Te(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 g=`pr-helper-msg-copy`,Ee=`pr-helper-chat-actions`,De=`data-message-id`,Oe=`data-copy-source`,ke={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 Ae(e){return je(`${Oe}="${r(e)}"`)}function je(e){let{icon:t,label:n,aria:r}=ke.idle;return`<div class="${Ee}"><button type="button" class="${g}" ${e} aria-label="${r}"><span class="${g}-icon" aria-hidden="true">${Ne(t)}</span><span class="${g}-label"${n?``:` hidden`}>${n}</span></button></div>`}function Me(e,t){let n=ke[t],r=e.querySelector(`.${g}-icon`),i=e.querySelector(`.${g}-label`);r&&(r.innerHTML=Ne(n.icon)),i instanceof HTMLElement&&(i.textContent=n.label,i.hidden=n.label===``),e.setAttribute(`aria-label`,n.aria),e.classList.toggle(`copied`,t===`copied`),e.classList.toggle(`failed`,t===`failed`)}function Ne(e){return`<svg viewBox="0 0 16 16" width="14" height="14" fill="currentColor">${e}</svg>`}var Pe=1400,Fe=`Copy`,Ie=`Copied`,Le=/Mac|iPhone|iPad/.test(navigator.userAgent)?`Press ⌘C`:`Press Ctrl C`,_=new WeakMap;function Re(e,t={}){let n=e=>{let n=e.target;if(!(n instanceof Element))return;let r=n.closest(`.${a}`),i=r?null:n.closest(`.${g}`);!r&&!i||(e.preventDefault(),e.stopPropagation(),r?Ve(r):i&&ze(i,t.messageSource))};return e.addEventListener(`click`,n,!0),()=>e.removeEventListener(`click`,n,!0)}async function ze(e,t){let n=Be(e,t);Ue(e,n!==null&&await we(n)?`copied`:`failed`)}function Be(e,t){let n=e.getAttribute(Oe);if(n!==null)return n;let r=e.getAttribute(De);return r&&t?t(r):null}async function Ve(e){let t=e.parentElement?.querySelector(`pre code`),n=t?await we(t.textContent??``):!1;!n&&t&&He(t),We(e,n?Ie:Le,n)}function He(e){let t=window.getSelection();if(!t)return;let n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}function Ue(e,t){let n=_.get(e);n&&window.clearTimeout(n),Me(e,t),_.set(e,window.setTimeout(()=>{Me(e,`idle`),_.delete(e)},Pe))}function We(e,t,n){let r=_.get(e);r&&window.clearTimeout(r),e.textContent=t,e.classList.toggle(`copied`,n),_.set(e,window.setTimeout(()=>{e.textContent=Fe,e.classList.remove(`copied`),_.delete(e)},Pe))}var Ge=[{id:`explain`,label:`Explain`,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:`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`}],Ke=[{id:`add-to-chat`,label:`Add to chat`}],qe=800;function Je(e){let t=e.replace(/\r\n/g,`
|
|
34
34
|
`).split(`
|
|
35
35
|
`).map(e=>e.replace(/\s+$/,``));for(;t.length&&!t[0].trim();)t.shift();for(;t.length&&!t[t.length-1].trim();)t.pop();let n=t.filter(e=>e.trim()).map(e=>e.match(/^[ \t]*/)[0].length),r=n.length?Math.min(...n):0,i=t.map(e=>e.slice(r)).join(`
|
|
36
36
|
`).replace(/\n{3,}/g,`
|
|
37
37
|
|
|
38
|
-
`);return i.trim()?(i.length>
|
|
38
|
+
`);return i.trim()?(i.length>qe?`${i.slice(0,qe).trimEnd()}…`:i).split(`
|
|
39
39
|
`).map(e=>`> ${e}`.trimEnd()).join(`
|
|
40
|
-
`):``}function
|
|
40
|
+
`):``}function Ye(e,t){let n=Je(e);if(!n)return null;let r=[...Ge,...Ke].find(e=>e.id===t);return r?r.instruction?`${n}\n\n${r.instruction}`:`${n}\n\n`:null}var Xe=`saved:`,Ze=`Your prompts`;function Qe(e){return`${Xe}${e}`}function $e(e){return e.startsWith(`saved:`)?e.slice(6):null}function et(e){return e.reviewerClosed>0?`dealt with`:`resolved`}({claude:`Claude Code`,codex:`Codex`,gemini:`Gemini CLI`}).claude;var tt=`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 nt(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 rt(e){let t=e.done-e.reviewerClosed;return e.reviewerClosed===0?`Resolved by the new commits (${e.done})`:t===0?`Dismissed by you (${e.done})`:`Dealt with (${e.done})`}function it(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 at(e,t){let n=e.trim();return n?`${n}\n\n${t}`:t}var ot=[`progress`,`overview`,`guide`,`issues`,`questions`,`files`,`prcontext`,`diagram`,`kiss`,`kissrecs`],st=`#theme-`;function ct(e){return`#${e}`}function lt(e){return`${st}${encodeURIComponent(e)}`}function ut(e){return e.kind===`view`?ct(e.view):lt(e.sectionId)}function dt(e){if(e.startsWith(st)){let t=e.slice(7);if(!t)return null;try{return{kind:`section`,sectionId:decodeURIComponent(t)}}catch{return null}}let t=e.replace(/^#/,``);return ot.includes(t)?{kind:`view`,view:t}:null}function ft(e){if(!Number.isFinite(e))return``;let t=Math.round((Date.now()-e)/6e4);if(t<1)return`just now`;if(t<60)return`${t} minute${t===1?``:`s`} ago`;let n=Math.round(t/60);if(n<24)return`${n} hour${n===1?``:`s`} ago`;let r=Math.round(n/24);return`${r} day${r===1?``:`s`} ago`}function pt(){return`<button type="button" class="prb-update-btn" data-review-update>Update review</button>`}var mt=`Updating this review checks the latest commits and refreshes the PR conversation. Your progress and Buddy AI history will be kept.`;function ht(e){return`<details class="prb-update-alt">
|
|
41
41
|
<summary>Start a new review</summary>
|
|
42
42
|
<span>A brand new review, with its own findings and its own path through the change. Run <code>${r(e)}</code> in your session.<button type="button" class="prb-fresh-quiet" data-copy-command="${r(e)}">Copy</button></span>
|
|
43
|
-
</details>`}var
|
|
43
|
+
</details>`}var gt=`prreviewbuddy review --fresh`;function _t(e){return e?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`}:{label:`Check for updates`,state:`unknown`}}function vt(e,t={}){if(!e)return``;let n=e.code.state===`changed`,i=e.code.reason===`missing-commit`,a=t.dismissedSha!==void 0&&t.dismissedSha===e.code.latestSha;if(!t.open&&(!(n||i)||a))return``;let o=Ct(e.code),s=[...o.facts,`checked ${r(ft(e.checkedAt))}`];return`<div class="prb-fresh" data-state="${n||i?`changed`:`quiet`}" role="status">
|
|
44
44
|
<div class="prb-fresh-head">
|
|
45
45
|
<span class="prb-fresh-dot" data-freshness="${o.state}" aria-hidden="true"></span>
|
|
46
46
|
<strong class="prb-fresh-title">${r(o.title)}</strong>
|
|
47
47
|
<span class="prb-fresh-facts">${s.join(` · `)}</span>
|
|
48
48
|
</div>
|
|
49
49
|
${o.consequence?`<p class="prb-fresh-say">${o.consequence}</p>`:``}
|
|
50
|
-
${
|
|
51
|
-
</div>`}function
|
|
52
|
-
${r?
|
|
50
|
+
${yt(e,t,n||i)}
|
|
51
|
+
</div>`}function yt(e,t,n){let r=t.actions&&n,i=n?``:`<button type="button" class="prb-fresh-close" data-fresh-close aria-label="Close">×</button>`;return`<div class="prb-fresh-actions">
|
|
52
|
+
${r?pt():``}
|
|
53
53
|
<button type="button" class="prb-fresh-quiet" data-fresh-recheck>Check review status</button>
|
|
54
|
-
${r?gt
|
|
54
|
+
${r?ht(gt):``}
|
|
55
55
|
${i}
|
|
56
|
-
${
|
|
57
|
-
</div>`}function
|
|
56
|
+
${bt(e,t,n,r===!0)}
|
|
57
|
+
</div>`}function bt(e,t,n,i){let a=[i?r(mt):``,wt(e.code,e.checkout.reason!==`no-pull-request`),Tt(e,t.actions===!0),n?`<button type="button" class="prb-fresh-quiet" data-fresh-dismiss="${r(e.code.latestSha??``)}">Dismiss this warning</button>`:``].filter(e=>e!==``);if(a.length===0)return``;let o=`<div class="prb-fresh-notes">${a.map(e=>`<p>${e}</p>`).join(``)}</div>`;return n?`<details class="prb-fresh-more">
|
|
58
58
|
<summary>More details</summary>
|
|
59
59
|
${o}
|
|
60
|
-
</details>`:o}function
|
|
60
|
+
</details>`:o}function xt(e,t){return e===null?[]:[`${e} file${e===1?``:`s`} ${t}`]}function St(e){return e?`<code title="${r(e)}">${r(e.slice(0,7))}</code>`:``}function v(e){return e?[`reviewed ${St(e)}`]:[]}function Ct(e){if(e.state===`current`)return{state:`current`,title:`Review up to date`,facts:v(e.reviewedSha),consequence:``};if(e.state===`changed`){if(e.rewritten)return{state:`changed`,title:`Code rewritten`,facts:[...v(e.reviewedSha),...xt(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:[...v(e.reviewedSha),...t,...xt(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:v(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:v(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:v(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 wt(e,t){if(!e.comparison)return``;let n=`<code>${r(e.comparison.ref)}</code>`;return e.state===`current`?t?`This review is based on the latest PR commit ${St(e.reviewedSha)}.`:`This review is based on ${St(e.reviewedSha)}, the latest commit on ${n}.`:e.comparison.remote?`This review is currently based on ${n}. <strong>Check review status</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 Tt(e,t){if(!e.conversation.attached)return``;let n=r(ft(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 Et(e,t){let n=e=>e.toLowerCase().replace(/\bthe\b/g,``).replace(/[^a-z]/g,``);return n(e)===n(t)}function Dt(e,t,n={}){if(!t||t.state!==`changed`||n.dismissedSha&&n.dismissedSha===t.latestSha)return``;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">
|
|
61
61
|
<p><strong>This KISS review describes commit ${r(e.slice(0,7))}.</strong> ${r(i)}</p>
|
|
62
62
|
<p class="prb-kiss-fresh-note">Running KISS again analyses the branch as it is now. The report below is kept either way.</p>
|
|
63
63
|
${n.actions&&t.latestSha?`<button type="button" class="prb-kiss-fresh-dismiss" data-kiss-freshness-dismiss="${r(t.latestSha)}">Not now</button>`:``}
|
|
64
|
-
</div>`}function
|
|
64
|
+
</div>`}function Ot(e,t=Date.now()){let n=Math.max(0,Math.round((t-e)/1e3));if(n<60)return`${n} second${n===1?``:`s`}`;let r=Math.round(n/60);return`${r} minute${r===1?``:`s`}`}function y(e){return e===`done`||e===`failed`}function kt(e,t){return y(e)?!0:(e===`conversation`||e===`analysing`)&&!t.querySelector(`[data-view="files"]`)}function At(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||Et(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 jt(e){let t=e.querySelector(`[data-started-at]`),n=Number(t?.dataset.startedAt);!t||!Number.isFinite(n)||(t.textContent=`Running for ${Ot(n)}.`)}function Mt(e,t,n){let o=e.scope===`change`?`Whole change`:t.get(e.scope)??`A theme of this change`,s=e.scope===`change`?``:e.scope;return`<article class="prb-diagram" id="prb-diagram-${r(e.scope)}" data-diagram-card="${r(e.scope)}">
|
|
65
65
|
<header class="prb-diagram-head">
|
|
66
66
|
<div class="prb-diagram-heading">
|
|
67
67
|
<h4 class="prb-diagram-title">
|
|
@@ -80,25 +80,25 @@ import{t as e}from"./chunk-CIsM3PMS.js";import{n as t,t as n}from"./chunk-gBDI1-
|
|
|
80
80
|
</div>
|
|
81
81
|
</header>
|
|
82
82
|
${e.caption?`<p class="prb-diagram-caption">${r(e.caption)}</p>`:``}
|
|
83
|
-
${
|
|
83
|
+
${Nt(e,n)}
|
|
84
84
|
<div class="prb-diagram-canvas" data-diagram-canvas></div>
|
|
85
85
|
<details class="prb-diagram-source">
|
|
86
86
|
<summary>Diagram source</summary>
|
|
87
87
|
<div class="${i}"><pre><code data-mermaid-source>${r(e.mermaid)}</code></pre><button type="button" class="${a}" aria-label="Copy code">Copy</button></div>
|
|
88
88
|
</details>
|
|
89
|
-
</article>`}function
|
|
89
|
+
</article>`}function Nt(e,t){return!e.commitSha||!t||e.commitSha===t?``:`<p class="prb-diagram-stale">Drawn from <code>${r(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 Pt={review:`<path d="M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2"/><rect x="9" y="3" width="6" height="4" rx="1"/><path d="m9 14 2 2 4-4"/>`,kiss:`<path d="M12 3v4M12 17v4M3 12h4M17 12h4"/><circle cx="12" cy="12" r="2"/>`,diagrams:`<rect x="3" y="3" width="7" height="6" rx="1"/><rect x="14" y="15" width="7" height="6" rx="1"/><path d="M6.5 9v3a2 2 0 0 0 2 2h7a2 2 0 0 1 2 2v-1"/>`,issues:`<circle cx="12" cy="12" r="9"/><path d="M12 8v4M12 16h.01"/>`,questions:`<circle cx="12" cy="12" r="9"/><path d="M9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3M12 17h.01"/>`,files:`<path d="M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z"/><path d="M14 3v5h5M9 13h6M9 17h6"/>`,prcontext:`<path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/>`,recommendations:`<path d="M9 18h6M10 22h4"/><path d="M12 2a7 7 0 0 0-4 12.7c.6.5 1 1.2 1 2V17h6v-.3c0-.8.4-1.5 1-2A7 7 0 0 0 12 2z"/>`,reviews:`<path d="M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01"/>`,settings:`<circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1.1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z"/>`,feedback:`<path d="m22 2-7 20-4-9-9-4z"/><path d="M22 2 11 13"/>`,stop:`<path d="M12 2v10"/><path d="M18.4 6.6a9 9 0 1 1-12.8 0"/>`};function Ft(e){return`<span class="prb-rail-icon" aria-hidden="true"><svg viewBox="0 0 24 24" focusable="false" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round">${Pt[e]}</svg></span>`}var It=`modulepreload`,Lt=function(e){return`/`+e},Rt={},zt=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=Lt(t,n),t=s(t),t in Rt)return;Rt[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:It,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},Bt=.5,Vt=3,Ht=1.25,Ut=null;function Wt(){return Ut??=zt(()=>import(`./chunk-B80S6zbH.js`).then(e=>(e.default.initialize({startOnLoad:!1,securityLevel:`strict`,htmlLabels:!1,flowchart:{htmlLabels:!1},theme:`neutral`,fontFamily:`inherit`}),e.default)),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17])),Ut}var Gt=new WeakSet,Kt=new WeakMap,qt=new WeakMap,b=null;function Jt(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(()=>{b?.abort()});return}let i=n.closest(`[data-diagram-toggle]`);if(i){tn(i.closest(`[data-diagram-card]`),i.getAttribute(`aria-expanded`)===`true`);return}let a=n.closest(`[data-diagram-zoom]`);if(a){an(a.closest(`[data-diagram-card]`),a.dataset.diagramZoom??`reset`);return}let o=n.closest(`[data-diagram-request]`);o&&Yt(e,o.dataset.diagramRequest||null)}),Xt(),{drawPane:nn}}async function Yt(e,t){if(b)return;let n=t??`change`,r=document.querySelector(`[data-diagram-pane]`),i=r?.querySelector(`[data-diagram-card="${S(n)}"]`)??null??Zt(r,n,t);if(!i)return;x(),e.showDiagrams();let a=Qt(i);b=new AbortController,cn(!1);try{let n=await fetch(e.endpoint(`/diagram`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({sectionId:t}),signal:b.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 $t(i,a,r?.error??`Buddy AI did not return a diagram. Check the terminal running PR Review Buddy.`);en(i,r.diagram,t)}catch(e){if(e instanceof DOMException&&e.name===`AbortError`){i.hasAttribute(`data-diagram-pending`)?(i.remove(),x()):a.remove();return}$t(i,a,`Could not reach PR Review Buddy. The workspace server may have stopped.`)}finally{b=null,cn(!0)}}function Xt(){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="${S(n)}"]`)??Zt(e,n,t);r&&(x(),Qt(r,{scroll:!1}),cn(!1))}function x(){let e=document.querySelectorAll(`[data-diagram-pane] [data-diagram-card]`).length,t=document.querySelector(`[data-view-nav="diagram"]`);if(e===0){t?.remove();return}if(!t){let e=document.querySelector(`[data-view-nav="issues"]`);if(!e)return;t=document.createElement(`button`),t.setAttribute(`type`,`button`),t.className=`prb-rail-item prb-rail-link`,t.dataset.viewNav=`diagram`,t.innerHTML=`${Ft(`diagrams`)}<span class="prb-rail-label"><span class="prb-rail-title">Diagrams</span></span><span class="prb-rail-count"></span>`,e.before(t)}let n=t.querySelector(`.prb-rail-count`);n&&(n.textContent=String(e),n.setAttribute(`aria-label`,e===1?`1 diagram`:`${e} diagrams`))}function Zt(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">
|
|
90
90
|
<div class="prb-diagram-heading">
|
|
91
91
|
<h4 class="prb-diagram-title">Drawing…</h4>
|
|
92
92
|
<p class="prb-diagram-scope">${t===`change`?`Whole change`:fn(ln(n))}</p>
|
|
93
93
|
</div>
|
|
94
|
-
</header>`,un(e,r,n),r}function Qt(e){e.querySelector(`[data-diagram-status]`)?.remove();let
|
|
94
|
+
</header>`,un(e,r,n),r}function Qt(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:pn()?`auto`:`smooth`,block:`start`}),n}function $t(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 en(e,t,n){let r=Mt(t,new Map(n?[[n,ln(n)]]:[]),t.commitSha),i=document.createElement(`div`);i.innerHTML=r;let a=i.firstElementChild;a&&(e.replaceWith(a),x(),rn(a))}function tn(e,t){e&&(e.toggleAttribute(`data-diagram-collapsed`,t),e.querySelector(`[data-diagram-toggle]`)?.setAttribute(`aria-expanded`,String(!t)),t||rn(e))}function nn(){for(let e of document.querySelectorAll(`[data-diagram-pane] [data-diagram-card]`))rn(e)}async function rn(e){let t=e.querySelector(`[data-diagram-canvas]`),n=e.querySelector(`[data-mermaid-source]`)?.textContent??``;if(!(!t||!n||Gt.has(e)||e.hasAttribute(`data-diagram-collapsed`))){Gt.add(e);try{let e=await Wt();await e.parse(n);let{svg:r}=await e.render(`prb-mermaid-${Math.random().toString(36).slice(2)}`,n);t.innerHTML=r}catch{Gt.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 an(e,t){let n=e?.querySelector(`[data-diagram-canvas] svg`),r=e?.querySelector(`[data-diagram-canvas]`);if(!e||!n||!r)return;if(t===`reset`){qt.delete(e),r.removeAttribute(`data-zoomed`),n.style.removeProperty(`width`);return}let i=on(e,n);if(i<=0)return;let a=sn((qt.get(e)??1)*(t===`in`?Ht:1/Ht));qt.set(e,a),r.setAttribute(`data-zoomed`,``),n.style.width=`${Math.round(i*a)}px`}function on(e,t){let n=Kt.get(e);if(n)return n;let r=t.getBoundingClientRect().width;if(r>0)return Kt.set(e,r),r;let i=t.getAttribute(`viewBox`)?.split(/[\s,]+/),a=Number(i?.[2]??0);return Number.isFinite(a)?a:0}function sn(e){return Math.min(Vt,Math.max(Bt,e))}function cn(e){for(let t of document.querySelectorAll(`[data-diagram-request]`))t.disabled=!e}function ln(e){return e?document.querySelector(`[data-goto-section="${S(e)}"]`)?.querySelector(`.prb-rail-title`)?.textContent?.trim()||`A theme of this change`:`Whole change`}function un(e,t,n){let r=dn(n);for(let n of e.querySelectorAll(`[data-diagram-card]`)){let e=n.dataset.diagramCard??``;if(dn(e===`change`?null:e)>r){n.before(t);return}}e.appendChild(t)}function dn(e){if(!e)return-1;let t=document.querySelector(`[data-goto-section="${S(e)}"]`);return Number(t?.dataset.themeIndex??0)}function fn(e){let t=document.createElement(`span`);return t.textContent=e,t.innerHTML}function S(e){return CSS.escape(e)}function pn(){return window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}var C=document.body,mn=C.dataset.apiBase??``,hn=C.dataset.token??``,gn=C.dataset.editorLabel??``,_n=C.dataset.editorTemplate??``,vn=C.dataset.repoPath??``,yn=C.dataset.explainPrompt??``,bn=C.dataset.sessionId??``;function w(e){return`${mn}${e}?t=${encodeURIComponent(hn)}`}function T(e){fetch(w(`/event`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),keepalive:!0}).catch(()=>{})}var xn=Jt({endpoint:w,showDiagrams:()=>wn(`diagram`)}),E=null,D=`whole change`;function Sn(e){let t=ut(e);window.location.hash!==t&&history.pushState(e,``,t),Cn(e)}function Cn(e){e.kind===`view`?En(e.view):An(e.sectionId)}function wn(e){Sn({kind:`view`,view:e})}function Tn(e){Sn({kind:`section`,sectionId:e})}function En(e){for(let t of document.querySelectorAll(`.prb-view`))t.hidden=t.dataset.view!==e;for(let t of document.querySelectorAll(`[data-view-nav]`))t.setAttribute(`aria-current`,String(t.dataset.viewNav===e));T({event:`view_opened`,view:e}),e===`diagram`&&xn.drawPane(),Dn(),document.querySelector(`.prb-doc`)?.scrollTo({top:0})}function Dn(){for(let e of document.querySelectorAll(`[data-goto-section]`))e.setAttribute(`aria-current`,`false`);E=null,D=`whole change`,Mn()}function On(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)}function kn(){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`)&&On(e,!0)}}function An(e){En(`guide`),kn();for(let t of document.querySelectorAll(`[data-goto-section]`))t.setAttribute(`aria-current`,String(t.dataset.gotoSection===e));let t=document.getElementById(`pr-helper-guide-section-${e}`);if(!t)return;t.classList.remove(`pr-helper-guide-section-collapsed`),t.scrollIntoView({behavior:jn()?`auto`:`smooth`,block:`start`});let n=document.querySelector(`[data-goto-section="${CSS.escape(e)}"]`);T({event:`theme_opened`,themeIndex:Number(n?.dataset.themeIndex??-1),attention:n?.querySelector(`.prb-attention`)?.dataset.attention??`medium`,isRecommendedStart:n?.dataset.recommendedStart===`true`}),E=e,D=t.querySelector(`.pr-helper-guide-section-title`)?.textContent?.trim()??`this theme`,Mn()}function jn(){return window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}function Mn(){let e=document.querySelector(`[data-ask-scope]`);e&&(e.textContent=D,e.title=E?`Questions are answered about "${D}"`:`Questions cover the whole change`)}function O(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}function Nn(e){return e.tagName===`LI`?{parent:e,position:`beforeend`}:{parent:e,position:`afterend`}}async function Pn(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}=Nn(e);o.insertAdjacentElement(s,a),e.setAttribute(`aria-expanded`,`true`),T({event:`file_opened`,fromFinding:i,targeted:r>0}),await Fn(a,n,r,0)}async function Fn(e,t,n,r){try{let i=`&path=${encodeURIComponent(t)}${n?`&line=${n}`:``}${r?`&expand=${r}`:``}`,a=await fetch(`${w(`/file`)}${i}`),o=await a.json();if(!a.ok){e.innerHTML=`<p class="prb-code-status">${O(o?.error??`Could not read that file.`)}</p>`;return}In(e,o,n,r)}catch{e.innerHTML=`<p class="prb-code-status">Could not reach PR Review Buddy. The workspace server may have stopped.</p>`}}function In(e,t,n,r){let i=new Set(t.addedLines),a=t.lines.map((e,r)=>{let a=t.from+r;return`<tr class="${[i.has(a)?`prb-code-added`:``,a===n?`prb-code-target`:``].filter(Boolean).join(` `)}"><td class="prb-code-num">${a}</td><td class="prb-code-line">${O(e)||` `}</td></tr>`}).join(``),o=_n&&vn?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="${O(t.path)}" data-open-line="${n||t.from}">${O(`Open in ${gn||`editor`}`)}</button>`:``,s=t.pullRequest&&t.pullRequest.precise?`<a class="prb-code-open prb-code-pr" href="${O(t.pullRequest.href)}" target="_blank" rel="noopener noreferrer">${O(t.pullRequest.label)}</a>`:``,c=t.truncated?`<button type="button" class="prb-code-more" data-expand-file="${O(t.path)}" data-expand-line="${n||0}" data-expand-step="${r+1}">Show more of this file</button>`:``,ee=t.checkout===`differs`?` · your editor will show a different version`:t.checkout===`absent`?` · not in your working folder`:``,l=t.source===`commit`?`<p class="prb-code-source">Viewing reviewed version${t.sourceSha?` <code>${O(t.sourceSha.slice(0,7))}</code>`:``}${ee}</p>`:`<p class="prb-code-source">Viewing your working folder</p>`;e.innerHTML=`<div class="prb-code-header">
|
|
95
95
|
<span class="prb-code-range">lines ${t.from}\u2013${t.to} of ${t.totalLines}</span>
|
|
96
96
|
${s}
|
|
97
97
|
${o}
|
|
98
98
|
</div>
|
|
99
99
|
${l}
|
|
100
100
|
<div class="prb-code-scroll"><table class="prb-code-table"><tbody>${a}</tbody></table></div>
|
|
101
|
-
${c}`,e.querySelector(`.prb-code-target`)?.scrollIntoView({block:`center`})}function Rn(e,t,n){let r=`${yn.replace(/\/$/,``)}/${e}`,i=vn.replace(`{path}`,r).replace(`{line}`,String(Math.max(1,t)));x({event:`editor_opened`,fromFinding:n}),window.location.href=i}var T=document.querySelector(`[data-ask-log]`);T&&T.querySelector(`.prb-msg`)&&T.scrollTo({top:T.scrollHeight});var E=document.querySelector(`[data-ask-form]`),D=E?.querySelector(`textarea`);function zn(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=te(t)+je(t)):n.textContent=t,T?.appendChild(n),T?.scrollTo({top:T.scrollHeight}),n}function Bn(){let e=document.createElement(`div`);return e.className=`prb-thinking`,e.innerHTML=`<i></i><i></i><i></i><span>Reading the change…</span>`,T?.appendChild(e),T?.scrollTo({top:T.scrollHeight}),e}var O=null;function Vn(){let e=document.createElement(`div`);e.className=`prb-stopped`,e.textContent=`Stopped.`,T?.appendChild(e),T?.scrollTo({top:T.scrollHeight})}async function Hn(e,t=`free_text`){let n=e.trim();if(!n)return;document.querySelector(`.prb-ask-empty`)?.remove(),zn(`user`,n);let r=Bn();O=new AbortController,Un(!0);try{let e=await fetch(b(`/ask`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({question:n,sectionId:S,source:t}),signal:O.signal}),i=await e.json().catch(()=>null);if(r.remove(),!e.ok||!i?.answer){zn(`error`,i?.error??`Buddy AI did not answer. Check the terminal running PR Review Buddy.`);return}zn(`assistant`,i.answer)}catch(e){r.remove(),e instanceof DOMException&&e.name===`AbortError`?(Vn(),D&&(D.value=n)):zn(`error`,`Could not reach PR Review Buddy. The workspace server may have stopped.`)}finally{O=null,Un(!1)}}function Un(e){let t=E?.querySelector(`button`);t&&(t.textContent=e?`Stop`:`Ask`,t.toggleAttribute(`data-stop`,e),t.disabled=!1),D&&(D.disabled=e),e||D?.focus()}function Wn(){let e=E?.querySelector(`button`);e&&(e.textContent=`Stopping…`,e.disabled=!0),O?.abort()}E?.addEventListener(`submit`,e=>{if(e.preventDefault(),O)return Wn();let t=D?.value??``;D&&(D.value=``),Hn(t,Kn(t))});var Gn=null;function Kn(e){return Gn&&e.includes(Gn)?`selection`:`free_text`}D?.addEventListener(`keydown`,e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),E?.requestSubmit())}),D?.addEventListener(`input`,()=>{D&&(D.style.height=`auto`,D.style.height=`${Math.min(D.scrollHeight,140)}px`)});async function qn(e){try{await fetch(b(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({answeredQuestionIds:e})})}catch{}}function Jn(){return[...document.querySelectorAll(`[data-question-answered][data-answered="true"]`)].map(e=>e.dataset.questionAnswered??``).filter(Boolean)}function Yn(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&&tr(n,t,`questions`),sr()}function Xn(){return[...document.querySelectorAll(`[data-issue-dismissed][data-dismissed="true"]`)].map(e=>({id:e.dataset.issueDismissed??``,sessionId:e.dataset.dismissedIn||xn})).filter(e=>e.id)}async function Zn(e){try{await fetch(b(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissedIssues:e})})}catch{}}function Qn(e,t){e.dataset.dismissed=String(t),e.textContent=t?`Reopen`:`Dismiss`,delete e.dataset.stale,t?e.dataset.dismissedIn=xn: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($n()),tr(n,t||e.dataset.settled===`true`,`issues`),lr())}function $n(){let e=document.createElement(`span`);return e.className=`pr-helper-finding-status pr-helper-finding-status-dismissed pr-helper-tip`,e.dataset.tip=nt,e.textContent=`Dismissed by you`,e}var er=new WeakMap;function tr(e,t,n){let r=e.closest(`.pr-helper-closed-findings-list`);if(t!==!!r){if(t){let t=e.parentElement;t&&er.set(e,{parent:t,before:e.nextElementSibling}),ar(n).append(e),t&&ir(t)}else nr(e,n),(r?.children.length===0?r.closest(`.pr-helper-closed-findings`):null)?.remove();or(n)}}function nr(e,t){let n=er.get(e);if(n?.parent.isConnected)n.parent.insertBefore(e,n.before);else{let n=rr(e)??document.querySelector(`[data-view="${t}"]`);n?.insertBefore(e,n.querySelector(`.pr-helper-closed-findings`))}e.closest(`.pr-helper-question-group`)?.removeAttribute(`hidden`)}function rr(e){let t=e.dataset.sectionId;return t?document.querySelector(`[data-question-group="${CSS.escape(t)}"]`):null}function ir(e){let t=e.closest(`.pr-helper-question-group`);t&&!t.querySelector(`[data-finding-card]`)&&(t.hidden=!0)}function ar(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 or(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;if(t.toggleAttribute(`data-nothing-open`,r===i),e===`questions`){n.textContent=`Answered (${i})`;return}n.textContent=it(cr())}function sr(){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=at(e.length,t)),ur(`questions`,e.length,t,`question`,`answered`)}function cr(){let e=[...document.querySelectorAll(`[data-issue-dismissed]`)],t=0,n=0;for(let r of e){let e=r.dataset.settled===`true`,i=r.dataset.dismissed===`true`&&r.dataset.stale!==`true`;!e&&!i?t+=1:!e&&i&&(n+=1)}return{total:e.length,open:t,done:e.length-t,reviewerClosed:n}}function lr(){let e=cr();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=rt(e.total,e.open,tt(e))),ur(`issues`,e.total,e.open,`issue`,tt(e))}function ur(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){kn(n,n.getAttribute(`aria-expanded`)!==`true`);return}let r=t.closest(`[data-view-nav]`);if(r?.dataset.viewNav){Tn(r.dataset.viewNav);return}let i=t.closest(`[data-overview-nav]`);if(i?.dataset.overviewNav){Tn(i.dataset.overviewNav===`guide`?`guide`:i.dataset.overviewNav);return}let a=t.closest(`[data-goto-section]`);if(a?.dataset.gotoSection){En(a.dataset.gotoSection);return}let o=t.closest(`[data-open-editor]`);if(o?.dataset.openEditor){Rn(o.dataset.openEditor,Number(o.dataset.openLine)||1,!0);return}let s=t.closest(`[data-expand-file]`);if(s?.dataset.expandFile){let e=s.closest(`.prb-code`);e&&In(e,s.dataset.expandFile,Number(s.dataset.expandLine)||0,Number(s.dataset.expandStep)||1);return}let c=t.closest(`[data-file]`);if(c?.dataset.file){Fn(c);return}let ee=t.closest(`[data-guide-toggle]`);if(ee?.dataset.guideToggle){document.getElementById(`pr-helper-guide-section-${ee.dataset.guideToggle}`)?.classList.toggle(`pr-helper-guide-section-collapsed`);return}let l=t.closest(`[data-question-answered]`);if(l?.dataset.questionAnswered){Yn(l,l.dataset.answered!==`true`);let e=Jn();qn(e),x({event:`question_marked_answered`,answered:e.length,total:document.querySelectorAll(`[data-question-answered]`).length});return}let u=t.closest(`[data-issue-dismissed]`);if(u?.dataset.issueDismissed){Qn(u,u.dataset.stale===`true`||u.dataset.dismissed!==`true`);let e=Xn();Zn(e),x({event:`issue_dismissed`,dismissed:e.length,total:document.querySelectorAll(`[data-issue-dismissed]`).length});return}let te=t.closest(`[data-suggestion]`);if(te){Hn(te.textContent??``,`suggestion`);return}if(t.closest(`.pr-helper-explain-simply-button`)){pr(),Hn(bn,`explain_simply`);return}let ne=t.closest(`[data-prompt-use]`);if(ne?.dataset.promptUse){Mr(ne.dataset.promptUse);return}let re=t.closest(`[data-prompt-edit]`);if(re?.dataset.promptEdit){Hr(re.dataset.promptEdit);return}if(t.closest(`[data-prompt-add]`)){Hr(``);return}t.closest(`[data-ask-toggle]`)&&fr(!dr())});var k=document.querySelector(`.prb-body`),A=document.querySelector(`.prb-ask`);function dr(){return!!A&&getComputedStyle(A).display!==`none`}function fr(e){k&&(k.dataset.ask=e?`open`:`closed`),document.querySelector(`[data-ask-toggle]`)?.setAttribute(`aria-expanded`,String(e))}function pr(){fr(!0)}function mr(){document.querySelector(`[data-ask-toggle]`)?.setAttribute(`aria-expanded`,String(dr()))}window.addEventListener(`resize`,mr);var j=document.querySelector(`[data-shutdown]`),hr=document.querySelector(`[data-shutdown-dialog]`),M=document.querySelector(`[data-shutdown-confirm]`);j?.addEventListener(`click`,()=>hr?.showModal()),document.querySelector(`[data-shutdown-cancel]`)?.addEventListener(`click`,()=>hr?.close()),M?.addEventListener(`click`,()=>{M.disabled=!0,M.textContent=`Stopping…`,fetch(b(`/shutdown`),{method:`POST`}).then(()=>{hr?.close(),gr()}).catch(()=>{M.disabled=!1,M.textContent=`Stop server`})});function gr(){document.body.dataset.serverStopped=`true`;let e=document.createElement(`div`);e.className=`prb-stopped-notice`,e.setAttribute(`role`,`status`);let t=document.body.dataset.wayBack;e.textContent=t?`Workspace server stopped. This page is no longer being served. Run ${t} to bring it back.`:`Workspace server stopped. This page is no longer being served.`,document.body.prepend(e),j&&(j.textContent=`Server stopped`,j.disabled=!0)}var N=document.querySelector(`[data-file-filter]`),_r=document.querySelector(`[data-file-count]`),vr=document.querySelector(`[data-file-none]`);function yr(){let e=(N?.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}`}vr&&(vr.hidden=n>0),_r&&(_r.textContent=e?`${t} of ${P} file${P===1?``:`s`}`:`${P} file${P===1?``:`s`}`)}var P=document.querySelectorAll(`[data-view="files"] .prb-file:not(.prb-file-referenced)`).length;N?.addEventListener(`input`,yr),N?.addEventListener(`keydown`,e=>{e.key===`Escape`&&N.value!==``&&(e.preventDefault(),N.value=``,yr())}),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(),Fn(n))});var br=320,xr=()=>Math.round(window.innerWidth/2),Sr=e=>Math.round(Math.min(xr(),Math.max(br,e)));function F(e){k&&(e===null?k.style.removeProperty(`--ask-width`):k.style.setProperty(`--ask-width`,`${e}px`))}function I(){return A?Math.round(A.getBoundingClientRect().width):br}function L(e){fetch(b(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({askWidth:e})}).catch(()=>{})}var R=document.querySelector(`[data-ask-resize]`);R?.addEventListener(`pointerdown`,e=>{if(e.button!==0||!k||!A)return;e.preventDefault(),R.setPointerCapture(e.pointerId),k.dataset.resizing=`true`;let t=e.clientX,n=I(),r=e=>{F(Sr(n+(t-e.clientX)))},i=()=>{R.removeEventListener(`pointermove`,r),R.removeEventListener(`pointerup`,i),R.removeEventListener(`pointercancel`,i),delete k.dataset.resizing,L(I())};R.addEventListener(`pointermove`,r),R.addEventListener(`pointerup`,i),R.addEventListener(`pointercancel`,i)}),R?.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=Sr(I()+n);F(r),L(r);return}(e.key===`Home`||e.key===`Escape`)&&(e.preventDefault(),F(null),L(null))}),R?.addEventListener(`dblclick`,()=>{F(null),L(null)}),window.addEventListener(`resize`,()=>{dr()&&k?.style.getPropertyValue(`--ask-width`)&&F(Sr(I()))});var Cr=3e4,z=document.visibilityState===`visible`?Date.now():null,wr=0;function Tr(){z!==null&&(wr+=Date.now()-z,z=Date.now())}function Er(){Tr();let e=Math.round(wr/1e3);return wr-=e*1e3,e}document.addEventListener(`visibilitychange`,()=>{document.visibilityState===`visible`?z=Date.now():(Tr(),z=null)}),setInterval(()=>{let e=Er();e>0&&x({event:`workspace_heartbeat`,visibleSeconds:e})},Cr),window.addEventListener(`pagehide`,()=>{let e=b(`/event`),t=JSON.stringify({event:`review_completed`,trailingSeconds:Er()});navigator.sendBeacon?.(e,new Blob([t],{type:`application/json`}))||fetch(e,{method:`POST`,headers:{"content-type":`application/json`},body:t,keepalive:!0}).catch(()=>{})});var Dr=document.querySelector(`[data-prompt-bank]`),Or=document.querySelector(`[data-prompt-list]`),B=kr();function kr(){try{let e=JSON.parse(Dr?.dataset.prompts??`[]`);return Array.isArray(e)?e:[]}catch{return[]}}function Ar(){Or&&(Or.innerHTML=B.map(e=>`<span class="prb-bank-item">
|
|
102
|
-
<button type="button" class="prb-bank-use" data-prompt-use="${
|
|
103
|
-
<button type="button" class="prb-bank-edit" data-prompt-edit="${
|
|
104
|
-
</span>`).join(``),Lr())}async function jr(e){try{let t=await(await fetch(b(`/prompts`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({prompts:e})})).json().catch(()=>null);B=Array.isArray(t?.prompts)?t.prompts:B}catch{}Ar()}function Mr(e){let t=B.find(t=>t.id===e);!t||!D||(D.value=ot(D.value,t.prompt),pr(),D.focus(),D.setSelectionRange(D.value.length,D.value.length),D.dispatchEvent(new Event(`input`)))}var Nr=document.querySelector(`.prb-doc`),Pr=null,Fr=null;function Ir(){T&&(Fr?.(),Fr=we(T,{layout:`flat`,actions:qe.map(e=>({id:e.id,label:e.label})),onChoose:(e,t)=>Rr(e,t)}))}function Lr(){Nr&&(Pr?.(),Pr=we(Nr,{triggerLabel:`Ask Buddy AI`,actions:[...Ke.map(e=>({id:e.id,label:e.label})),...B.map(e=>({id:$e(e.id),label:e.name,section:Qe}))],onChoose:(e,t)=>Rr(e,t)}))}function Rr(e,t){let n=zr(e,t);!n||!D||(Gn=n,D.value=ot(D.value,n),pr(),D.focus(),D.setSelectionRange(D.value.length,D.value.length),D.dispatchEvent(new Event(`input`)))}function zr(e,t){let n=et(e);if(n===null)return Xe(t,e);let r=B.find(e=>e.id===n);if(!r)return null;let i=Ye(t);return i?`${i}\n\n${r.prompt}`:null}Lr(),Ir(),ze(document);var V=document.querySelector(`[data-prompt-dialog]`),H=document.querySelector(`[data-prompt-name]`),U=document.querySelector(`[data-prompt-text]`),Br=document.querySelector(`[data-prompt-delete]`),Vr=document.getElementById(`prb-prompt-title`),W=``;function Hr(e){let t=B.find(t=>t.id===e);W=t?.id??``,Vr&&(Vr.textContent=t?`Edit prompt`:`Save a prompt`),H&&(H.value=t?.name??``),U&&(U.value=t?.prompt??``),Br&&(Br.hidden=!t),V?.showModal(),H?.focus()}async function Ur(){let e=H?.value.trim()??``,t=U?.value.trim()??``;if(!e||!t){(e?U:H)?.focus();return}let n=W?B.map(n=>n.id===W?{...n,name:e,prompt:t}:n):[...B,{id:crypto.randomUUID(),name:e,prompt:t}];V?.close(),await jr(n)}async function Wr(){if(!W)return;let e=B.filter(e=>e.id!==W);V?.close(),await jr(e)}document.querySelector(`[data-prompt-cancel]`)?.addEventListener(`click`,()=>V?.close()),Br?.addEventListener(`click`,()=>void Wr()),document.querySelector(`[data-prompt-save]`)?.addEventListener(`click`,()=>void Ur());var G=document.querySelector(`[data-complete]`);G?.addEventListener(`click`,()=>{let e=G.getAttribute(`aria-pressed`)!==`true`;Gr(e),fetch(b(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({complete:e})}).then(async e=>{let t=await e.json().catch(()=>null);t&&Gr(t.completedAt!==null)}).catch(()=>Gr(!e))});function Gr(e){G&&(G.setAttribute(`aria-pressed`,String(e)),G.textContent=e?`Reviewed`:`Mark reviewed`)}var K=document.querySelector(`[data-fresh-region]`),q=document.querySelector(`[data-fresh-check]`),J=Yr(K?.dataset.report),Kr=`prb-fresh-reopen`,Y=Jr(),qr=K?.dataset.dismissedSha;function Jr(){try{return sessionStorage.getItem(Kr)!==null&&(sessionStorage.removeItem(Kr),!0)}catch{return!1}}Y&&(q?.setAttribute(`aria-expanded`,`true`),Z()),q?.addEventListener(`click`,()=>{Y=!Y,q.setAttribute(`aria-expanded`,String(Y)),Y?Zr():Z()}),K?.addEventListener(`click`,e=>{let t=e.target;if(t.closest(`[data-fresh-recheck]`))return void Zr();if(t.closest(`[data-fresh-close]`))return Y=!1,q?.setAttribute(`aria-expanded`,`false`),Z();let n=t.closest(`[data-fresh-dismiss]`);n&&(qr=n.dataset.freshDismiss||void 0,Y=!1,q?.setAttribute(`aria-expanded`,`false`),Z(),fetch(b(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissFreshnessSha:qr??null})}).catch(()=>{}))});function Yr(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}var Xr=!1;async function Zr(){if(Xr)return;Xr=!0,Qr(!0);let e=$r(J),t=!1;try{let e=await(await fetch(b(`/freshness`))).json();J=e.report??null,ei=e.kiss??null,e.kissDismissedSha!==void 0&&(ti=e.kissDismissedSha??void 0),ri(),t=!0}catch{}Xr=!1,Z();let n=t?$r(J)===e?`No change`:`Updated`:`Could not check`,r=K?.querySelector(`[data-fresh-recheck]`)??q;r&&ai(r,n,2600)}function Qr(e){let t=[...K?.querySelectorAll(`[data-fresh-recheck]`)??[]];for(let n of t)n.disabled=e,e&&(n.textContent=`Checking…`);t.length===0&&q&&e&&(q.textContent=`Checking…`)}function $r(e){if(!e)return`none`;let{checkedAt:t,...n}=e;return JSON.stringify(n)}var X=document.querySelector(`[data-kiss-fresh-region]`),ei=ni(X?.dataset.freshness),ti=X?.dataset.dismissedSha;function ni(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function ri(){X&&(X.innerHTML=Ot(X.dataset.reviewedSha??``,ei,{dismissedSha:ti,actions:gn!==``}))}X?.addEventListener(`click`,e=>{let t=e.target.closest(`[data-kiss-freshness-dismiss]`);t&&(ti=t.dataset.kissFreshnessDismiss||void 0,ri(),fetch(b(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissKissFreshnessSha:ti??null})}).catch(()=>{}))});function Z(){if(K&&(K.innerHTML=yt(J,{dismissedSha:qr,open:Y,actions:gn!==``}),q&&J)){let{label:e,state:t}=vt(J);q.textContent=e,q.dataset.state=t}}document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-copy-command]`);if(n)return ii(n);let r=t.closest(`[data-pr-recheck]`);if(r)return void oi(r);let i=t.closest(`[data-review-update]`);if(i)return void li(i);t.closest(`[data-update-close]`)&&document.querySelector(`[data-update-result]`)?.remove()});function ii(e){let t=e.dataset.copyCommand??``;navigator.clipboard?.writeText(t).then(()=>ai(e,`Copied`),()=>ai(e,`Select it`))}function ai(e,t,n=1400){let r=e.textContent;e.textContent=t,setTimeout(()=>{e.textContent=r},n)}async function oi(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=si(n);t?t.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Re-checking the conversation, ${e}s. ${ui}`:n.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Checking… ${e}s`}};r();let i=window.setInterval(r,1e3),a=si(e)?null:di(e);try{await fetch(b(`/refresh`),{method:`POST`})}catch{}finally{window.clearInterval(i),a?.remove()}si(e)&&ci(),window.location.reload()}function si(e){return e.closest(`.prb-fresh-notes p`)}function ci(){try{sessionStorage.setItem(Kr,`1`)}catch{}}async function li(e){let t=[...document.querySelectorAll(`[data-review-update]`)];for(let e of t)e.disabled=!0,e.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Updating…`;let n=!1,r=()=>{n||(n=!0,window.clearInterval(i),window.location.reload())},i=window.setInterval(async()=>{try{let e=await(await fetch(b(`/job`))).json();e.update&&e.update.phase!==`none`&&!At(e.update.phase)&&r()}catch{}},500);try{await fetch(b(`/update`),{method:`POST`})}catch{}r()}var ui=`Fetching the latest threads from your pull request. This usually takes under a minute.`;function di(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=ui,t.appendChild(n),n}var fi=document.querySelector(`[data-job-phase]`),pi=document.querySelector(`[data-kiss-phase]`),Q=document.querySelector(`[data-update-phase]`),mi=null,hi=Date.now();function gi(){mi===null&&(mi=window.setTimeout(()=>{mi=null,_i()},n(Date.now()-hi)))}async function _i(){try{let e=await(await fetch(b(`/job`))).json();if(Q&&e.update){if(e.update.phase===`none`||e.update.failed||At(e.update.phase)){window.location.reload();return}Mt(Q,e.update.phase,e.update.progress),Nt(Q)}let t=[[fi,e],[pi,e.kiss]];for(let[e,n]of t){if(!e||!n)continue;if(n.failed||jt(n.phase,document)){window.location.reload();return}let t=e.matches(`[data-progress-pane]`)?e:null;t?(Mt(t,n.phase,n.progress),Nt(t)):vi(e,n.progress)}}catch{}gi()}function vi(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}`}function yi(e,t){return e!==null&&!At(t)}(yi(fi,fi?.dataset.jobPhase)||yi(pi,pi?.dataset.kissPhase)||yi(Q,Q?.dataset.updatePhase))&&(hi=Date.now(),gi());function bi(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 xi(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…`,xi(t),fetch(b(`/retry`),{method:`POST`}).then(e=>{if(!e.ok)throw Error(`refused`);hi=Date.now(),gi()}).catch(()=>{t.disabled=!1,t.textContent=`Retry`,bi(t)}))}),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;r&&(t.disabled=!0,t.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Starting…`,fetch(b(`/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=`Run KISS review`;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 Si=document.body.dataset.defaultView||`overview`;window.addEventListener(`popstate`,e=>{wn(e.state??ft(window.location.hash)??{kind:`view`,view:Si})});var Ci=ft(window.location.hash);Ci?wn(Ci):history.replaceState({kind:`view`,view:Si},``,window.location.pathname+window.location.search),mr(),Nn();var wi=e=>{for(let t of document.querySelectorAll(`[data-analysis-details][open]`))(!e||!t.contains(e))&&(t.open=!1)};document.addEventListener(`click`,e=>{wi(e.target)}),document.addEventListener(`keydown`,e=>{if(e.key!==`Escape`)return;let t=document.querySelector(`[data-analysis-details][open]`);t&&(wi(),t.querySelector(`summary`)?.focus())});var $=document.querySelector(`.prb-header [data-menu]`);if($){let e=$.querySelector(`[data-menu-trigger]`),n=$.querySelector(`[data-menu-panel]`),r=()=>{n&&(n.hidden=!0),e?.setAttribute(`aria-expanded`,`false`)};e?.addEventListener(`click`,t=>{if(t.stopPropagation(),!n)return;let r=n.hidden;n.hidden=!r,e.setAttribute(`aria-expanded`,String(r))}),$.addEventListener(`click`,e=>{let n=e.target?.closest(`[data-copy-id]`);n?.dataset.copyId&&(e.stopPropagation(),t(n,n.dataset.copyId))}),document.addEventListener(`click`,e=>{$.contains(e.target)||r()}),document.addEventListener(`keydown`,t=>{t.key===`Escape`&&n&&!n.hidden&&(r(),e?.focus())})}e(window,()=>window.location.reload());export{zt as t};
|
|
101
|
+
${c}`,e.querySelector(`.prb-code-target`)?.scrollIntoView({block:`center`})}function Ln(e,t,n){let r=`${vn.replace(/\/$/,``)}/${e}`,i=_n.replace(`{path}`,r).replace(`{line}`,String(Math.max(1,t)));T({event:`editor_opened`,fromFinding:n}),window.location.href=i}var k=document.querySelector(`[data-ask-log]`);k&&k.querySelector(`.prb-msg`)&&k.scrollTo({top:k.scrollHeight});var A=document.querySelector(`[data-ask-form]`),j=A?.querySelector(`textarea`);function Rn(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=te(t)+Ae(t)):n.textContent=t,k?.appendChild(n),k?.scrollTo({top:k.scrollHeight}),n}function zn(){let e=document.createElement(`div`);return e.className=`prb-thinking`,e.innerHTML=`<i></i><i></i><i></i><span>Reading the change…</span>`,k?.appendChild(e),k?.scrollTo({top:k.scrollHeight}),e}var M=null,N=!!k?.querySelector(`[data-ask-pending]`);function Bn(){let e=document.createElement(`div`);e.className=`prb-stopped`,e.textContent=`Stopped.`,k?.appendChild(e),k?.scrollTo({top:k.scrollHeight})}async function Vn(e,t=`free_text`){let n=e.trim();if(!n||M||N)return;document.querySelector(`.prb-ask-empty`)?.remove(),Rn(`user`,n);let r=zn();M=new AbortController,Hn(!0);try{let e=await fetch(w(`/ask`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({question:n,sectionId:E,source:t}),signal:M.signal}),i=await e.json().catch(()=>null);if(e.status===409&&i?.running){window.location.reload();return}if(r.remove(),i?.stopped){Bn();return}if(!e.ok||!i?.answer){Rn(`error`,i?.error??`Buddy AI did not answer. Check the terminal running PR Review Buddy.`);return}Rn(`assistant`,i.answer)}catch(e){r.remove(),e instanceof DOMException&&e.name===`AbortError`?(Bn(),j&&!j.value&&(j.value=n)):Rn(`error`,`Could not reach PR Review Buddy. The workspace server may have stopped.`)}finally{M=null,Hn(!1)}}function Hn(e){let t=A?.querySelector(`button`);t&&(t.textContent=e?`Stop`:`Ask`,t.toggleAttribute(`data-stop`,e),t.disabled=!1),j&&(j.disabled=e);for(let t of document.querySelectorAll(Un))t.disabled=e;e||j?.focus()}var Un=`[data-suggestion], .pr-helper-explain-simply-button`;function Wn(){let e=A?.querySelector(`button`);e&&(e.textContent=`Stopping…`,e.disabled=!0),fetch(w(`/stop`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({kind:`ask`})}).catch(()=>{}).finally(()=>{M?.abort()})}A?.addEventListener(`submit`,e=>{if(e.preventDefault(),M||N)return Wn();let t=j?.value??``;j&&(j.value=``),Vn(t,Kn(t))}),N&&Hn(!0);var Gn=null;function Kn(e){return Gn&&e.includes(Gn)?`selection`:`free_text`}j?.addEventListener(`keydown`,e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),A?.requestSubmit())}),j?.addEventListener(`input`,()=>{j&&(j.style.height=`auto`,j.style.height=`${Math.min(j.scrollHeight,140)}px`)});async function qn(e){try{await fetch(w(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({answeredQuestionIds:e})})}catch{}}function Jn(){return[...document.querySelectorAll(`[data-question-answered][data-answered="true"]`)].map(e=>e.dataset.questionAnswered??``).filter(Boolean)}function Yn(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&&tr(n,t,`questions`),sr()}function Xn(){return[...document.querySelectorAll(`[data-issue-dismissed][data-dismissed="true"]`)].map(e=>({id:e.dataset.issueDismissed??``,sessionId:e.dataset.dismissedIn||bn})).filter(e=>e.id)}async function Zn(e){try{await fetch(w(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissedIssues:e})})}catch{}}function Qn(e,t){e.dataset.dismissed=String(t),e.textContent=t?`Reopen`:`Dismiss`,delete e.dataset.stale,t?e.dataset.dismissedIn=bn: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($n()),tr(n,t||e.dataset.settled===`true`,`issues`),lr())}function $n(){let e=document.createElement(`span`);return e.className=`pr-helper-finding-status pr-helper-finding-status-dismissed pr-helper-tip`,e.dataset.tip=tt,e.textContent=`Dismissed by you`,e}var er=new WeakMap;function tr(e,t,n){let r=e.closest(`.pr-helper-closed-findings-list`);if(t!==!!r){if(t){let t=e.parentElement;t&&er.set(e,{parent:t,before:e.nextElementSibling}),ar(n).append(e),t&&ir(t)}else nr(e,n),(r?.children.length===0?r.closest(`.pr-helper-closed-findings`):null)?.remove();or(n)}}function nr(e,t){let n=er.get(e);if(n?.parent.isConnected)n.parent.insertBefore(e,n.before);else{let n=rr(e)??document.querySelector(`[data-view="${t}"]`);n?.insertBefore(e,n.querySelector(`.pr-helper-closed-findings`))}e.closest(`.pr-helper-question-group`)?.removeAttribute(`hidden`)}function rr(e){let t=e.dataset.sectionId;return t?document.querySelector(`[data-question-group="${CSS.escape(t)}"]`):null}function ir(e){let t=e.closest(`.pr-helper-question-group`);t&&!t.querySelector(`[data-finding-card]`)&&(t.hidden=!0)}function ar(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 or(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;if(t.toggleAttribute(`data-nothing-open`,r===i),e===`questions`){n.textContent=`Answered (${i})`;return}n.textContent=rt(cr())}function sr(){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=it(e.length,t)),ur(`questions`,e.length,t,`question`,`answered`)}function cr(){let e=[...document.querySelectorAll(`[data-issue-dismissed]`)],t=0,n=0;for(let r of e){let e=r.dataset.settled===`true`,i=r.dataset.dismissed===`true`&&r.dataset.stale!==`true`;!e&&!i?t+=1:!e&&i&&(n+=1)}return{total:e.length,open:t,done:e.length-t,reviewerClosed:n}}function lr(){let e=cr();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=nt(e.total,e.open,et(e))),ur(`issues`,e.total,e.open,`issue`,et(e))}function ur(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){On(n,n.getAttribute(`aria-expanded`)!==`true`);return}let r=t.closest(`[data-view-nav]`);if(r?.dataset.viewNav){wn(r.dataset.viewNav);return}let i=t.closest(`[data-overview-nav]`);if(i?.dataset.overviewNav){wn(i.dataset.overviewNav===`guide`?`guide`:i.dataset.overviewNav);return}let a=t.closest(`[data-goto-section]`);if(a?.dataset.gotoSection){Tn(a.dataset.gotoSection);return}let o=t.closest(`[data-open-editor]`);if(o?.dataset.openEditor){Ln(o.dataset.openEditor,Number(o.dataset.openLine)||1,!0);return}let s=t.closest(`[data-expand-file]`);if(s?.dataset.expandFile){let e=s.closest(`.prb-code`);e&&Fn(e,s.dataset.expandFile,Number(s.dataset.expandLine)||0,Number(s.dataset.expandStep)||1);return}let c=t.closest(`[data-file]`);if(c?.dataset.file){Pn(c);return}let ee=t.closest(`[data-guide-toggle]`);if(ee?.dataset.guideToggle){document.getElementById(`pr-helper-guide-section-${ee.dataset.guideToggle}`)?.classList.toggle(`pr-helper-guide-section-collapsed`);return}let l=t.closest(`[data-question-answered]`);if(l?.dataset.questionAnswered){Yn(l,l.dataset.answered!==`true`);let e=Jn();qn(e),T({event:`question_marked_answered`,answered:e.length,total:document.querySelectorAll(`[data-question-answered]`).length});return}let u=t.closest(`[data-issue-dismissed]`);if(u?.dataset.issueDismissed){Qn(u,u.dataset.stale===`true`||u.dataset.dismissed!==`true`);let e=Xn();Zn(e),T({event:`issue_dismissed`,dismissed:e.length,total:document.querySelectorAll(`[data-issue-dismissed]`).length});return}let te=t.closest(`[data-suggestion]`);if(te){Vn(te.textContent??``,`suggestion`);return}if(t.closest(`.pr-helper-explain-simply-button`)){pr(),Vn(yn,`explain_simply`);return}let ne=t.closest(`[data-prompt-use]`);if(ne?.dataset.promptUse){Ir(ne.dataset.promptUse);return}let re=t.closest(`[data-prompt-edit]`);if(re?.dataset.promptEdit){Jr(re.dataset.promptEdit);return}if(t.closest(`[data-prompt-add]`)){Jr(``);return}t.closest(`[data-ask-toggle]`)&&fr(!dr())});var P=document.querySelector(`.prb-body`),F=document.querySelector(`.prb-ask`);function dr(){return!!F&&getComputedStyle(F).display!==`none`}function fr(e){P&&(P.dataset.ask=e?`open`:`closed`),document.querySelector(`[data-ask-toggle]`)?.setAttribute(`aria-expanded`,String(e))}function pr(){fr(!0)}function mr(){document.querySelector(`[data-ask-toggle]`)?.setAttribute(`aria-expanded`,String(dr()))}window.addEventListener(`resize`,mr);var hr=document.querySelector(`[data-shutdown]`),gr=document.querySelector(`[data-shutdown-dialog]`),I=document.querySelector(`[data-shutdown-confirm]`);hr?.addEventListener(`click`,()=>gr?.showModal()),document.querySelector(`[data-shutdown-cancel]`)?.addEventListener(`click`,()=>gr?.close()),I?.addEventListener(`click`,()=>{I.disabled=!0,I.textContent=`Stopping…`,fetch(w(`/shutdown`),{method:`POST`}).then(()=>{gr?.close(),_r()}).catch(()=>{I.disabled=!1,I.textContent=`Stop server`})});function _r(){document.body.dataset.serverStopped=`true`;let e=document.createElement(`div`);e.className=`prb-stopped-notice`,e.setAttribute(`role`,`status`);let t=document.body.dataset.wayBack;e.textContent=t?`Workspace server stopped. This page is no longer being served. Run ${t} to bring it back.`:`Workspace server stopped. This page is no longer being served.`,document.body.prepend(e),hr&&(hr.textContent=`Server stopped`,hr.disabled=!0)}var L=document.querySelector(`[data-file-filter]`),vr=document.querySelector(`[data-file-count]`),yr=document.querySelector(`[data-file-none]`);function br(){let e=(L?.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}`}yr&&(yr.hidden=n>0),vr&&(vr.textContent=e?`${t} of ${xr} file${xr===1?``:`s`}`:`${xr} file${xr===1?``:`s`}`)}var xr=document.querySelectorAll(`[data-view="files"] .prb-file:not(.prb-file-referenced)`).length;L?.addEventListener(`input`,br),L?.addEventListener(`keydown`,e=>{e.key===`Escape`&&L.value!==``&&(e.preventDefault(),L.value=``,br())}),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(),Pn(n))});var Sr=320,Cr=()=>Math.round(window.innerWidth/2),wr=e=>Math.round(Math.min(Cr(),Math.max(Sr,e)));function R(e){P&&(e===null?P.style.removeProperty(`--ask-width`):P.style.setProperty(`--ask-width`,`${e}px`))}function Tr(){return F?Math.round(F.getBoundingClientRect().width):Sr}function Er(e){fetch(w(`/prefs`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({askWidth:e})}).catch(()=>{})}var z=document.querySelector(`[data-ask-resize]`);z?.addEventListener(`pointerdown`,e=>{if(e.button!==0||!P||!F)return;e.preventDefault(),z.setPointerCapture(e.pointerId),P.dataset.resizing=`true`;let t=e.clientX,n=Tr(),r=e=>{R(wr(n+(t-e.clientX)))},i=()=>{z.removeEventListener(`pointermove`,r),z.removeEventListener(`pointerup`,i),z.removeEventListener(`pointercancel`,i),delete P.dataset.resizing,Er(Tr())};z.addEventListener(`pointermove`,r),z.addEventListener(`pointerup`,i),z.addEventListener(`pointercancel`,i)}),z?.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=wr(Tr()+n);R(r),Er(r);return}(e.key===`Home`||e.key===`Escape`)&&(e.preventDefault(),R(null),Er(null))}),z?.addEventListener(`dblclick`,()=>{R(null),Er(null)}),window.addEventListener(`resize`,()=>{dr()&&P?.style.getPropertyValue(`--ask-width`)&&R(wr(Tr()))});var Dr=3e4,B=document.visibilityState===`visible`?Date.now():null,Or=0;function kr(){B!==null&&(Or+=Date.now()-B,B=Date.now())}function Ar(){kr();let e=Math.round(Or/1e3);return Or-=e*1e3,e}document.addEventListener(`visibilitychange`,()=>{document.visibilityState===`visible`?B=Date.now():(kr(),B=null)}),setInterval(()=>{let e=Ar();e>0&&T({event:`workspace_heartbeat`,visibleSeconds:e})},Dr),window.addEventListener(`pagehide`,()=>{let e=w(`/event`),t=JSON.stringify({event:`review_completed`,trailingSeconds:Ar()});navigator.sendBeacon?.(e,new Blob([t],{type:`application/json`}))||fetch(e,{method:`POST`,headers:{"content-type":`application/json`},body:t,keepalive:!0}).catch(()=>{})});var jr=document.querySelector(`[data-prompt-bank]`),Mr=document.querySelector(`[data-prompt-list]`),V=Nr();function Nr(){try{let e=JSON.parse(jr?.dataset.prompts??`[]`);return Array.isArray(e)?e:[]}catch{return[]}}function Pr(){Mr&&(Mr.innerHTML=V.map(e=>`<span class="prb-bank-item">
|
|
102
|
+
<button type="button" class="prb-bank-use" data-prompt-use="${O(e.id)}" title="${O(e.prompt)}">${O(e.name)}</button>
|
|
103
|
+
<button type="button" class="prb-bank-edit" data-prompt-edit="${O(e.id)}" aria-label="Edit ${O(e.name)}">✎</button>
|
|
104
|
+
</span>`).join(``),Vr())}async function Fr(e){try{let t=await(await fetch(w(`/prompts`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({prompts:e})})).json().catch(()=>null);V=Array.isArray(t?.prompts)?t.prompts:V}catch{}Pr()}function Ir(e){let t=V.find(t=>t.id===e);!t||!j||(j.value=at(j.value,t.prompt),pr(),j.focus(),j.setSelectionRange(j.value.length,j.value.length),j.dispatchEvent(new Event(`input`)))}var Lr=document.querySelector(`.prb-doc`),Rr=null,zr=null;function Br(){k&&(zr?.(),zr=Ce(k,{layout:`flat`,actions:Ke.map(e=>({id:e.id,label:e.label})),onChoose:(e,t)=>Hr(e,t)}))}function Vr(){Lr&&(Rr?.(),Rr=Ce(Lr,{triggerLabel:`Ask Buddy AI`,actions:[...Ge.map(e=>({id:e.id,label:e.label})),...V.map(e=>({id:Qe(e.id),label:e.name,section:Ze}))],onChoose:(e,t)=>Hr(e,t)}))}function Hr(e,t){let n=Ur(e,t);!n||!j||(Gn=n,j.value=at(j.value,n),pr(),j.focus(),j.setSelectionRange(j.value.length,j.value.length),j.dispatchEvent(new Event(`input`)))}function Ur(e,t){let n=$e(e);if(n===null)return Ye(t,e);let r=V.find(e=>e.id===n);if(!r)return null;let i=Je(t);return i?`${i}\n\n${r.prompt}`:null}Vr(),Br(),Re(document);var Wr=document.querySelector(`[data-prompt-dialog]`),H=document.querySelector(`[data-prompt-name]`),Gr=document.querySelector(`[data-prompt-text]`),Kr=document.querySelector(`[data-prompt-delete]`),qr=document.getElementById(`prb-prompt-title`),U=``;function Jr(e){let t=V.find(t=>t.id===e);U=t?.id??``,qr&&(qr.textContent=t?`Edit prompt`:`Save a prompt`),H&&(H.value=t?.name??``),Gr&&(Gr.value=t?.prompt??``),Kr&&(Kr.hidden=!t),Wr?.showModal(),H?.focus()}async function Yr(){let e=H?.value.trim()??``,t=Gr?.value.trim()??``;if(!e||!t){(e?Gr:H)?.focus();return}let n=U?V.map(n=>n.id===U?{...n,name:e,prompt:t}:n):[...V,{id:crypto.randomUUID(),name:e,prompt:t}];Wr?.close(),await Fr(n)}async function Xr(){if(!U)return;let e=V.filter(e=>e.id!==U);Wr?.close(),await Fr(e)}document.querySelector(`[data-prompt-cancel]`)?.addEventListener(`click`,()=>Wr?.close()),Kr?.addEventListener(`click`,()=>void Xr()),document.querySelector(`[data-prompt-save]`)?.addEventListener(`click`,()=>void Yr());var W=document.querySelector(`[data-complete]`);W?.addEventListener(`click`,()=>{let e=W.getAttribute(`aria-pressed`)!==`true`;Zr(e),fetch(w(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({complete:e})}).then(async e=>{let t=await e.json().catch(()=>null);t&&Zr(t.completedAt!==null)}).catch(()=>Zr(!e))});function Zr(e){W&&(W.setAttribute(`aria-pressed`,String(e)),W.textContent=e?`Reviewed`:`Mark reviewed`)}var G=document.querySelector(`[data-fresh-region]`),K=document.querySelector(`[data-fresh-check]`),q=ti(G?.dataset.report),Qr=`prb-fresh-reopen`,J=ei(),$r=G?.dataset.dismissedSha;function ei(){try{return sessionStorage.getItem(Qr)!==null&&(sessionStorage.removeItem(Qr),!0)}catch{return!1}}J&&(K?.setAttribute(`aria-expanded`,`true`),Z()),K?.addEventListener(`click`,()=>{J=!J,K.setAttribute(`aria-expanded`,String(J)),J?ri():Z()}),G?.addEventListener(`click`,e=>{let t=e.target;if(t.closest(`[data-fresh-recheck]`))return void ri();if(t.closest(`[data-fresh-close]`))return J=!1,K?.setAttribute(`aria-expanded`,`false`),Z();let n=t.closest(`[data-fresh-dismiss]`);n&&($r=n.dataset.freshDismiss||void 0,J=!1,K?.setAttribute(`aria-expanded`,`false`),Z(),fetch(w(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissFreshnessSha:$r??null})}).catch(()=>{}))});function ti(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}var ni=!1;async function ri(){if(ni)return;ni=!0,ii(!0);let e=ai(q),t=!1;try{let e=await(await fetch(w(`/freshness`))).json();q=e.report??null,oi=e.kiss??null,e.kissDismissedSha!==void 0&&(X=e.kissDismissedSha??void 0),ci(),t=!0}catch{}ni=!1,Z();let n=t?ai(q)===e?`No change`:`Updated`:`Could not check`,r=G?.querySelector(`[data-fresh-recheck]`)??K;r&&ui(r,n,2600)}function ii(e){let t=[...G?.querySelectorAll(`[data-fresh-recheck]`)??[]];for(let n of t)n.disabled=e,e&&(n.textContent=`Checking…`);t.length===0&&K&&e&&(K.textContent=`Checking…`)}function ai(e){if(!e)return`none`;let{checkedAt:t,...n}=e;return JSON.stringify(n)}var Y=document.querySelector(`[data-kiss-fresh-region]`),oi=si(Y?.dataset.freshness),X=Y?.dataset.dismissedSha;function si(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function ci(){Y&&(Y.innerHTML=Dt(Y.dataset.reviewedSha??``,oi,{dismissedSha:X,actions:hn!==``}))}Y?.addEventListener(`click`,e=>{let t=e.target.closest(`[data-kiss-freshness-dismiss]`);t&&(X=t.dataset.kissFreshnessDismiss||void 0,ci(),fetch(w(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissKissFreshnessSha:X??null})}).catch(()=>{}))});function Z(){if(G&&(G.innerHTML=vt(q,{dismissedSha:$r,open:J,actions:hn!==``}),K&&q)){let{label:e,state:t}=_t(q);K.textContent=e,K.dataset.state=t}}document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-copy-command]`);if(n)return li(n);let r=t.closest(`[data-pr-recheck]`);if(r)return void di(r);let i=t.closest(`[data-review-update]`);if(i)return void mi(i);t.closest(`[data-update-close]`)&&document.querySelector(`[data-update-result]`)?.remove()});function li(e){let t=e.dataset.copyCommand??``;navigator.clipboard?.writeText(t).then(()=>ui(e,`Copied`),()=>ui(e,`Select it`))}function ui(e,t,n=1400){let r=e.textContent;e.textContent=t,setTimeout(()=>{e.textContent=r},n)}async function di(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=fi(n);t?t.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Re-checking the conversation, ${e}s. ${hi}`:n.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Checking… ${e}s`}};r();let i=window.setInterval(r,1e3),a=fi(e)?null:gi(e);try{await fetch(w(`/refresh`),{method:`POST`})}catch{}finally{window.clearInterval(i),a?.remove()}fi(e)&&pi(),window.location.reload()}function fi(e){return e.closest(`.prb-fresh-notes p`)}function pi(){try{sessionStorage.setItem(Qr,`1`)}catch{}}async function mi(e){let t=[...document.querySelectorAll(`[data-review-update]`)];for(let e of t)e.disabled=!0,e.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Updating…`;let n=!1,r=()=>{n||(n=!0,window.clearInterval(i),window.location.reload())},i=window.setInterval(async()=>{try{let e=await(await fetch(w(`/job`))).json();e.update&&e.update.phase!==`none`&&!y(e.update.phase)&&r()}catch{}},500);try{await fetch(w(`/update`),{method:`POST`})}catch{}r()}var hi=`Fetching the latest threads from your pull request. This usually takes under a minute.`;function gi(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=hi,t.appendChild(n),n}var _i=document.querySelector(`[data-job-phase]`),vi=document.querySelector(`[data-kiss-phase]`),Q=document.querySelector(`[data-update-phase]`),yi=null,bi=Date.now();function xi(){yi===null&&(yi=window.setTimeout(()=>{yi=null,Si()},n(Date.now()-bi)))}async function Si(){try{let e=await(await fetch(w(`/job`))).json();if(N&&!e.ask||Ti&&!e.diagram){window.location.reload();return}if(Q&&e.update){if(e.update.phase===`none`||e.update.failed||y(e.update.phase)){window.location.reload();return}At(Q,e.update.phase,e.update.progress),jt(Q)}let t=[[_i,e],[vi,e.kiss]];for(let[e,n]of t){if(!e||!n)continue;if(n.failed||kt(n.phase,document)){window.location.reload();return}let t=e.matches(`[data-progress-pane]`)?e:null;t?(At(t,n.phase,n.progress),jt(t)):Ci(e,n.progress)}}catch{}xi()}function Ci(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}`}function wi(e,t){return e!==null&&!y(t)}var Ti=document.querySelector(`[data-diagram-running]`)!==null;(wi(_i,_i?.dataset.jobPhase)||wi(vi,vi?.dataset.kissPhase)||wi(Q,Q?.dataset.updatePhase)||N||Ti)&&(bi=Date.now(),xi());function Ei(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 Di(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…`,Di(t),fetch(w(`/retry`),{method:`POST`}).then(e=>{if(!e.ok)throw Error(`refused`);bi=Date.now(),xi()}).catch(()=>{t.disabled=!1,t.textContent=`Retry`,Ei(t)}))}),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;r&&(t.disabled=!0,t.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Starting…`,fetch(w(`/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=`Run KISS review`;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 Oi=document.body.dataset.defaultView||`overview`;window.addEventListener(`popstate`,e=>{Cn(e.state??dt(window.location.hash)??{kind:`view`,view:Oi})});var ki=dt(window.location.hash);ki?Cn(ki):history.replaceState({kind:`view`,view:Oi},``,window.location.pathname+window.location.search),mr(),Mn();var Ai=e=>{for(let t of document.querySelectorAll(`[data-analysis-details][open]`))(!e||!t.contains(e))&&(t.open=!1)};document.addEventListener(`click`,e=>{Ai(e.target)}),document.addEventListener(`keydown`,e=>{if(e.key!==`Escape`)return;let t=document.querySelector(`[data-analysis-details][open]`);t&&(Ai(),t.querySelector(`summary`)?.focus())});var $=document.querySelector(`.prb-header [data-menu]`);if($){let e=$.querySelector(`[data-menu-trigger]`),n=$.querySelector(`[data-menu-panel]`),r=$.querySelector(`[data-menu-items]`),i=$.querySelector(`[data-menu-confirm]`),a=$.querySelector(`[data-confirm-delete]`),o=()=>{r&&(r.hidden=!1),i&&(i.hidden=!0),$.querySelector(`[data-menu-error]`)?.remove()},s=()=>{n&&(n.hidden=!0),e?.setAttribute(`aria-expanded`,`false`),o()};e?.addEventListener(`click`,t=>{if(t.stopPropagation(),!n)return;let r=n.hidden;o(),n.hidden=!r,e.setAttribute(`aria-expanded`,String(r))}),$.addEventListener(`click`,e=>{let n=e.target,a=n?.closest(`[data-copy-id]`);if(a?.dataset.copyId){e.stopPropagation(),t(a,a.dataset.copyId);return}if(n?.closest(`[data-delete]`)){e.stopPropagation(),r&&(r.hidden=!0),i&&(i.hidden=!1);return}if(n?.closest(`[data-cancel-delete]`)){e.stopPropagation(),o();return}n?.closest(`[data-confirm-delete]`)&&(e.stopPropagation(),c())});let c=async()=>{a&&(a.disabled=!0,a.textContent=`Deleting`);let e;try{let t=await fetch(w(`/delete`),{method:`POST`});if(t.ok)return void window.location.replace(`/`);e=(await t.json().catch(()=>null))?.error??`That could not be deleted.`}catch{e=`The workspace server did not answer. It may have stopped.`}a&&(a.disabled=!1,a.textContent=`Delete`),o();let t=document.createElement(`p`);t.className=`prb-menu-error`,t.setAttribute(`data-menu-error`,``),t.textContent=e,n?.append(t)};document.addEventListener(`click`,e=>{$.contains(e.target)||s()}),document.addEventListener(`keydown`,t=>{t.key===`Escape`&&n&&!n.hidden&&(s(),e?.focus())})}e(window,()=>window.location.reload());export{zt as t};
|