prreviewbuddy 0.25.13 → 0.27.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/static/reviews.js CHANGED
@@ -1 +1 @@
1
- import{t as e}from"./chunk-CIsM3PMS.js";import{n as t,t as n}from"./chunk-gBDI1-Cy.js";var r=[`all`,`in-progress`,`complete`];function i(e,t){let n=`${e} review${e===1?``:`s`}`;return e===t?n:`${n} · ${t} branch${t===1?``:`es`}`}function a(e,t){let n=Math.max(1,Math.ceil(e/15)),r=Math.min(Math.max(1,Math.floor(t)||1),n),i=(r-1)*15;return{page:r,pages:n,from:i,to:Math.min(i+15,e)}}function o(e){let t=new URLSearchParams(e.replace(/^#/,``)),n=t.get(`f`)??``,i=Number(t.get(`page`)??``);return{query:t.get(`q`)??``,filter:r.includes(n)?n:`all`,page:Number.isInteger(i)&&i>=1?i:1}}function s(e){let t=new URLSearchParams;e.query!==``&&t.set(`q`,e.query),e.filter!==`all`&&t.set(`f`,e.filter),e.page>1&&t.set(`page`,String(e.page));let n=t.toString();return n===``?``:`#${n}`}function c(e){return e===`complete`?`Reviewed`:e===`in-progress`?`In progress`:`New`}function l(e,t){if(e===0)return`Nothing selected`;let n=`${e} selected`;return t>0?`${n} · ${t} not shown`:n}function u(e){return e===0?`Delete`:`Delete ${e} branch${e===1?``:`es`}`}function d(e,t){let n=`${u(e)}?`;return t===e?n:`${n} This removes all ${t} reviews on ${e===1?`it`:`them`}.`}function f(e,t,n){return e===``||t===``||t===e?`wait`:n?`hold`:`reload`}var p=[...document.querySelectorAll(`[data-card]`)],m=document.querySelector(`.prb-index`),h=document.querySelector(`[data-search]`),g=document.querySelector(`[data-no-matches]`),_=document.querySelector(`[data-count]`),v=document.querySelector(`[data-pager]`),y=document.querySelector(`[data-pages]`),b=document.querySelector(`[data-bulk]`),x=document.querySelector(`[data-bulk-count]`),S=document.querySelector(`[data-bulk-delete]`),C=document.querySelector(`[data-bulk-question]`),w=document.querySelector(`[data-bulk-confirm]`),T=document.querySelector(`[data-bulk-actions]`),E=document.querySelector(`[data-bulk-error]`),D=o(window.location.hash),O=new Set,k=!1;function A(){let e=D.query.trim().toLowerCase(),t=p.filter(t=>{let n=D.filter===`all`||t.dataset.status===D.filter,r=!e||(t.dataset.searchText??``).includes(e);return n&&r}),n=a(t.length,D.page);D.page=n.page;let r=new Set(t.slice(n.from,n.to));for(let e of p)e.hidden=!r.has(e);h&&h.value!==D.query&&(h.value=D.query);for(let e of document.querySelectorAll(`[data-filter]`))e.setAttribute(`aria-pressed`,String(e.dataset.filter===D.filter));_&&(_.textContent=i(t.reduce((e,t)=>e+Number(t.dataset.reviews??1),0),t.length)),g&&(g.hidden=t.length>0||p.length===0),j(n),B(t)}function j(e){if(!(!v||!y)&&(v.hidden=e.pages<2,y.textContent=``,!v.hidden)){for(let t=1;t<=e.pages;t+=1){let n=document.createElement(`button`);n.type=`button`,n.className=`prb-index-page`,n.dataset.page=String(t),n.textContent=String(t),n.setAttribute(`aria-label`,`Page ${t}`),t===e.page&&n.setAttribute(`aria-current`,`page`),y.append(n)}for(let t of v.querySelectorAll(`[data-page-step]`)){let n=e.page+Number(t.dataset.pageStep);t.disabled=n<1||n>e.pages}}}function M(e,t){D={...D,...e},A();let n=`${window.location.pathname}${window.location.search}${s(D)}`;t===`push`?window.history.pushState(null,``,n):window.history.replaceState(null,``,n)}function N(){document.documentElement.scrollTop=0,document.body.scrollTop=0}h?.addEventListener(`input`,()=>M({query:h.value,page:1},`replace`)),h?.addEventListener(`keydown`,e=>{e.key===`Escape`&&h.value!==``&&(e.preventDefault(),M({query:``,page:1},`replace`))});for(let e of document.querySelectorAll(`[data-filter]`))e.addEventListener(`click`,()=>{M({filter:e.dataset.filter??`all`,page:1},`push`)});v?.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-page]`),r=t.closest(`[data-page-step]`);!n&&!r||(M({page:n?Number(n.dataset.page):D.page+Number(r?.dataset.pageStep??0)},`push`),N())});for(let e of[`popstate`,`hashchange`])window.addEventListener(e,()=>{D=o(window.location.hash),A()});document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-pin]`);if(!t?.dataset.pin)return;e.preventDefault(),e.stopPropagation();let n=t.getAttribute(`aria-pressed`)!==`true`;t.setAttribute(`aria-pressed`,String(n)),t.innerHTML=n?`&#9733;`:`&#9734;`,t.setAttribute(`aria-label`,`${n?`Unpin`:`Pin`} this review`),t.title=n?`Unpin`:`Pin to the top`;let r=t.closest(`[data-card]`);r&&(r.dataset.pinned=String(n)),fetch(`/pin`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:t.dataset.pin,pinned:n})}).catch(()=>{})}),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-history-toggle]`);if(!t)return;e.preventDefault(),e.stopPropagation();let n=t.parentElement?.querySelector(`[data-history-list]`);if(!n)return;let r=n.hidden;n.hidden=!r,t.setAttribute(`aria-expanded`,String(r))}),A();function P(e){for(let t of document.querySelectorAll(`[data-menu]`)){if(t===e)continue;let n=t.querySelector(`[data-menu-panel]`),r=t.querySelector(`[data-menu-trigger]`);n&&(n.hidden=!0),r?.setAttribute(`aria-expanded`,`false`),F(t)}}function F(e){let t=e.querySelector(`[data-menu-items]`),n=e.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!1),n&&(n.hidden=!0),e.querySelector(`[data-menu-error]`)?.remove(),e.querySelector(`[data-id-field]`)?.remove()}document.addEventListener(`keydown`,e=>{e.key===`Escape`&&P()}),document.addEventListener(`click`,e=>{let n=e.target,r=n.closest(`[data-menu]`);if(!r)return void P();let i=n.closest(`[data-menu-trigger]`);if(i){e.preventDefault(),e.stopPropagation();let t=r.querySelector(`[data-menu-panel]`);if(!t)return;let n=t.hidden;P(r),F(r),t.hidden=!n,i.setAttribute(`aria-expanded`,String(n));return}let a=n.closest(`[data-copy-id]`);if(a?.dataset.copyId){e.preventDefault(),e.stopPropagation(),t(a,a.dataset.copyId);return}if(n.closest(`[data-delete]`)){e.preventDefault(),e.stopPropagation();let t=r.querySelector(`[data-menu-items]`),n=r.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!0),n&&(n.hidden=!1);return}if(n.closest(`[data-cancel-delete]`)){e.preventDefault(),e.stopPropagation(),F(r);return}if(n.closest(`[data-confirm-delete]`)){e.preventDefault(),e.stopPropagation(),I(r);return}e.preventDefault(),e.stopPropagation()});async function I(e){let t=e.querySelector(`[data-delete]`),n=t?.dataset.delete;if(!n)return;let r=e.querySelector(`[data-menu-confirm]`),i=e.querySelector(`[data-confirm-delete]`);i&&(i.disabled=!0,i.textContent=`Deleting`);try{let r=await fetch(`/delete`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:n,scope:t?.dataset.scope??`review`})});if(r.ok)return void window.location.reload();L(e,(await r.json().catch(()=>null))?.error??`That could not be deleted.`)}catch{L(e,`The workspace server did not answer. It may have stopped.`)}i&&(i.disabled=!1,i.textContent=`Delete`),r&&(r.hidden=!0);let a=e.querySelector(`[data-menu-items]`);a&&(a.hidden=!1)}function L(e,t){e.querySelector(`[data-menu-error]`)?.remove();let n=document.createElement(`p`);n.className=`prb-menu-error`,n.setAttribute(`data-menu-error`,``),n.textContent=t,e.querySelector(`[data-menu-panel]`)?.append(n)}function R(e){k=e,e||O.clear(),m&&(e?m.dataset.selecting=``:delete m.dataset.selecting),document.querySelector(`[data-select-mode]`)?.setAttribute(`aria-pressed`,String(e));for(let t of document.querySelectorAll(`.prb-card-link`))e?t.setAttribute(`aria-disabled`,`true`):t.removeAttribute(`aria-disabled`);z(),A()}function z(){w&&(w.hidden=!0),T&&(T.hidden=!1),E&&(E.hidden=!0,E.textContent=``)}function B(e){for(let e of p){let t=O.has(e.dataset.id??``),n=e.querySelector(`[data-select]`);n&&(n.checked=t),t?e.dataset.selected=``:delete e.dataset.selected}if(!b||(b.hidden=!k,!k))return;let t=new Set(e.map(e=>e.dataset.id)),n=[...O].filter(e=>!t.has(e)).length;x&&(x.textContent=l(O.size,n)),S&&(S.textContent=u(O.size));for(let e of b.querySelectorAll(`[data-bulk-mark], [data-bulk-delete]`))e.disabled=O.size===0}document.querySelector(`[data-select-mode]`)?.addEventListener(`click`,()=>{R(!k)});function V(e){O.has(e)?O.delete(e):O.add(e),z(),A()}document.addEventListener(`change`,e=>{let t=e.target.closest(`[data-select]`);t?.dataset.select&&V(t.dataset.select)}),document.addEventListener(`click`,e=>{if(!k)return;let t=e.target,n=t.closest(`[data-card]`);n?.dataset.id&&(t.closest(`[data-select], [data-pin], [data-menu], [data-history-toggle]`)||(e.preventDefault(),V(n.dataset.id)))}),document.addEventListener(`keydown`,e=>{if(!k||e.key!==`Enter`)return;let t=e.target.closest(`.prb-card-link`)?.closest(`[data-card]`);t?.dataset.id&&(e.preventDefault(),V(t.dataset.id))});function H(){return p.filter(e=>O.has(e.dataset.id??``))}function U(e){E&&(E.textContent=e,E.hidden=!1)}function W(e){for(let t of b?.querySelectorAll(`button`)??[])t.disabled=e}async function G(e){let t=[...O];if(t.length===0)return;W(!0);try{if(!(await fetch(`/status`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:t,complete:e})})).ok)return W(!1),U(`That could not be saved. The workspace server refused it.`)}catch{return W(!1),U(`The workspace server did not answer. It may have stopped.`)}let n=e?`complete`:`in-progress`;for(let e of H()){e.dataset.status=n;let t=e.querySelector(`.prb-card-status`);t&&(t.dataset.status=n,t.textContent=c(n))}W(!1),R(!1)}async function K(){let e=[...O];if(e.length===0)return;W(!0);let t=null;try{let n=await fetch(`/delete`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:e})});if(t=n.ok?await n.json().catch(()=>null):null,!t)return W(!1),z(),U(`Nothing was deleted. The workspace server refused it.`)}catch{return W(!1),z(),U(`The workspace server did not answer. It may have stopped.`)}let n=t.blocked??[],r=new Set(n.map(e=>e.id));for(let e of H())r.has(e.dataset.id??``)||e.remove();p=p.filter(e=>e.isConnected),O.clear();for(let e of r)O.add(e);if(W(!1),z(),n.length===0)return R(!1);A(),U([...new Set(n.map(e=>e.error))].join(` `))}b?.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-bulk-mark]`);if(n)return void G(n.dataset.bulkMark===`complete`);if(t.closest(`[data-bulk-delete]`)){let e=H().reduce((e,t)=>e+Number(t.dataset.reviews??1),0);C&&(C.textContent=d(O.size,e)),T&&(T.hidden=!0),w&&(w.hidden=!1);return}if(t.closest(`[data-bulk-confirm-delete]`))return void K();if(t.closest(`[data-bulk-cancel-delete]`))return z();if(t.closest(`[data-bulk-cancel]`))return R(!1)}),e(window,()=>window.location.reload());var q=document.body.dataset.indexRevision??``,J=document.body.dataset.live===`true`?Date.now():0,Y=!1;function X(){return O.size>0||document.activeElement===h}function Z(){Y&&!X()&&window.location.reload()}async function Q(){try{let e=await fetch(`/revision`);if(e.ok){let t=await e.json();t.live&&J===0&&(J=Date.now()),t.live||(J=0);let n=f(q,t.revision??``,X());if(n===`reload`)return void window.location.reload();n===`hold`&&(Y=!0)}}catch{}window.setTimeout(()=>void Q(),n(J===0?2**53-1:Date.now()-J))}Q(),h?.addEventListener(`blur`,Z),document.addEventListener(`click`,()=>window.setTimeout(Z,0));
1
+ import{t as e}from"./chunk-CIsM3PMS.js";import{n as t,t as n}from"./chunk-gBDI1-Cy.js";var r=[`all`,`in-progress`,`complete`];function i(e,t){let n=`${e} review${e===1?``:`s`}`;return e===t?n:`${n} · ${t} branch${t===1?``:`es`}`}function a(e,t){let n=Math.max(1,Math.ceil(e/15)),r=Math.min(Math.max(1,Math.floor(t)||1),n),i=(r-1)*15;return{page:r,pages:n,from:i,to:Math.min(i+15,e)}}function o(e){let t=new URLSearchParams(e.replace(/^#/,``)),n=t.get(`f`)??``,i=Number(t.get(`page`)??``);return{query:t.get(`q`)??``,filter:r.includes(n)?n:`all`,page:Number.isInteger(i)&&i>=1?i:1}}function s(e){let t=new URLSearchParams;e.query!==``&&t.set(`q`,e.query),e.filter!==`all`&&t.set(`f`,e.filter),e.page>1&&t.set(`page`,String(e.page));let n=t.toString();return n===``?``:`#${n}`}function c(e){return e===`complete`?`Reviewed`:e===`in-progress`?`In progress`:`New`}function l(e,t){if(e===0)return`Nothing selected`;let n=`${e} selected`;return t>0?`${n} · ${t} not shown`:n}function u(e){return e===0?`Delete`:`Delete ${e} review${e===1?``:`s`}`}function d(e){return`${u(e)}?`}function f(e,t,n){return e===``||t===``||t===e?`wait`:n?`hold`:`reload`}var p=[...document.querySelectorAll(`[data-card]`)],m=document.querySelector(`.prb-index`),h=document.querySelector(`[data-search]`),g=document.querySelector(`[data-no-matches]`),_=document.querySelector(`[data-count]`),v=document.querySelector(`[data-pager]`),y=document.querySelector(`[data-pages]`),b=document.querySelector(`[data-bulk]`),x=document.querySelector(`[data-bulk-count]`),S=document.querySelector(`[data-bulk-delete]`),C=document.querySelector(`[data-bulk-question]`),w=document.querySelector(`[data-bulk-confirm]`),T=document.querySelector(`[data-bulk-actions]`),E=document.querySelector(`[data-bulk-error]`),D=o(window.location.hash),O=new Set,k=!1;function A(){let e=D.query.trim().toLowerCase(),t=p.filter(t=>{let n=D.filter===`all`||t.dataset.status===D.filter,r=!e||(t.dataset.searchText??``).includes(e);return n&&r}),n=a(t.length,D.page);D.page=n.page;let r=new Set(t.slice(n.from,n.to));for(let e of p)e.hidden=!r.has(e);h&&h.value!==D.query&&(h.value=D.query);for(let e of document.querySelectorAll(`[data-filter]`))e.setAttribute(`aria-pressed`,String(e.dataset.filter===D.filter));_&&(_.textContent=i(t.reduce((e,t)=>e+Number(t.dataset.reviews??1),0),t.length)),g&&(g.hidden=t.length>0||p.length===0),j(n),B(t)}function j(e){if(!(!v||!y)&&(v.hidden=e.pages<2,y.textContent=``,!v.hidden)){for(let t=1;t<=e.pages;t+=1){let n=document.createElement(`button`);n.type=`button`,n.className=`prb-index-page`,n.dataset.page=String(t),n.textContent=String(t),n.setAttribute(`aria-label`,`Page ${t}`),t===e.page&&n.setAttribute(`aria-current`,`page`),y.append(n)}for(let t of v.querySelectorAll(`[data-page-step]`)){let n=e.page+Number(t.dataset.pageStep);t.disabled=n<1||n>e.pages}}}function M(e,t){D={...D,...e},A();let n=`${window.location.pathname}${window.location.search}${s(D)}`;t===`push`?window.history.pushState(null,``,n):window.history.replaceState(null,``,n)}function N(){document.documentElement.scrollTop=0,document.body.scrollTop=0}h?.addEventListener(`input`,()=>M({query:h.value,page:1},`replace`)),h?.addEventListener(`keydown`,e=>{e.key===`Escape`&&h.value!==``&&(e.preventDefault(),M({query:``,page:1},`replace`))});for(let e of document.querySelectorAll(`[data-filter]`))e.addEventListener(`click`,()=>{M({filter:e.dataset.filter??`all`,page:1},`push`)});v?.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-page]`),r=t.closest(`[data-page-step]`);!n&&!r||(M({page:n?Number(n.dataset.page):D.page+Number(r?.dataset.pageStep??0)},`push`),N())});for(let e of[`popstate`,`hashchange`])window.addEventListener(e,()=>{D=o(window.location.hash),A()});document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-pin]`);if(!t?.dataset.pin)return;e.preventDefault(),e.stopPropagation();let n=t.getAttribute(`aria-pressed`)!==`true`;t.setAttribute(`aria-pressed`,String(n)),t.innerHTML=n?`&#9733;`:`&#9734;`,t.setAttribute(`aria-label`,`${n?`Unpin`:`Pin`} this review`),t.title=n?`Unpin`:`Pin to the top`;let r=t.closest(`[data-card]`);r&&(r.dataset.pinned=String(n)),fetch(`/pin`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:t.dataset.pin,pinned:n})}).catch(()=>{})}),document.addEventListener(`click`,e=>{let t=e.target.closest(`[data-history-toggle]`);if(!t)return;e.preventDefault(),e.stopPropagation();let n=t.parentElement?.querySelector(`[data-history-list]`);if(!n)return;let r=n.hidden;n.hidden=!r,t.setAttribute(`aria-expanded`,String(r))}),A();function P(e){for(let t of document.querySelectorAll(`[data-menu]`)){if(t===e)continue;let n=t.querySelector(`[data-menu-panel]`),r=t.querySelector(`[data-menu-trigger]`);n&&(n.hidden=!0),r?.setAttribute(`aria-expanded`,`false`),F(t)}}function F(e){let t=e.querySelector(`[data-menu-items]`),n=e.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!1),n&&(n.hidden=!0),e.querySelector(`[data-menu-error]`)?.remove(),e.querySelector(`[data-id-field]`)?.remove()}document.addEventListener(`keydown`,e=>{e.key===`Escape`&&P()}),document.addEventListener(`click`,e=>{let n=e.target,r=n.closest(`[data-menu]`);if(!r)return void P();let i=n.closest(`[data-menu-trigger]`);if(i){e.preventDefault(),e.stopPropagation();let t=r.querySelector(`[data-menu-panel]`);if(!t)return;let n=t.hidden;P(r),F(r),t.hidden=!n,i.setAttribute(`aria-expanded`,String(n));return}let a=n.closest(`[data-copy-id]`);if(a?.dataset.copyId){e.preventDefault(),e.stopPropagation(),t(a,a.dataset.copyId);return}if(n.closest(`[data-delete]`)){e.preventDefault(),e.stopPropagation();let t=r.querySelector(`[data-menu-items]`),n=r.querySelector(`[data-menu-confirm]`);t&&(t.hidden=!0),n&&(n.hidden=!1);return}if(n.closest(`[data-cancel-delete]`)){e.preventDefault(),e.stopPropagation(),F(r);return}if(n.closest(`[data-confirm-delete]`)){e.preventDefault(),e.stopPropagation(),I(r);return}e.preventDefault(),e.stopPropagation()});async function I(e){let t=e.querySelector(`[data-delete]`),n=t?.dataset.delete;if(!n)return;let r=e.querySelector(`[data-menu-confirm]`),i=e.querySelector(`[data-confirm-delete]`);i&&(i.disabled=!0,i.textContent=`Deleting`);try{let r=await fetch(`/delete`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:n,scope:t?.dataset.scope??`review`})});if(r.ok)return void window.location.reload();L(e,(await r.json().catch(()=>null))?.error??`That could not be deleted.`)}catch{L(e,`The workspace server did not answer. It may have stopped.`)}i&&(i.disabled=!1,i.textContent=`Delete`),r&&(r.hidden=!0);let a=e.querySelector(`[data-menu-items]`);a&&(a.hidden=!1)}function L(e,t){e.querySelector(`[data-menu-error]`)?.remove();let n=document.createElement(`p`);n.className=`prb-menu-error`,n.setAttribute(`data-menu-error`,``),n.textContent=t,e.querySelector(`[data-menu-panel]`)?.append(n)}function R(e){k=e,e||O.clear(),m&&(e?m.dataset.selecting=``:delete m.dataset.selecting),document.querySelector(`[data-select-mode]`)?.setAttribute(`aria-pressed`,String(e));for(let t of document.querySelectorAll(`.prb-card-link`))e?t.setAttribute(`aria-disabled`,`true`):t.removeAttribute(`aria-disabled`);z(),A()}function z(){w&&(w.hidden=!0),T&&(T.hidden=!1),E&&(E.hidden=!0,E.textContent=``)}function B(e){for(let e of p){let t=O.has(e.dataset.id??``),n=e.querySelector(`[data-select]`);n&&(n.checked=t),t?e.dataset.selected=``:delete e.dataset.selected}if(!b||(b.hidden=!k,!k))return;let t=new Set(e.map(e=>e.dataset.id)),n=[...O].filter(e=>!t.has(e)).length;x&&(x.textContent=l(O.size,n)),S&&(S.textContent=u(U()));for(let e of b.querySelectorAll(`[data-bulk-mark], [data-bulk-delete]`))e.disabled=O.size===0}document.querySelector(`[data-select-mode]`)?.addEventListener(`click`,()=>{R(!k)});function V(e){O.has(e)?O.delete(e):O.add(e),z(),A()}document.addEventListener(`change`,e=>{let t=e.target.closest(`[data-select]`);t?.dataset.select&&V(t.dataset.select)}),document.addEventListener(`click`,e=>{if(!k)return;let t=e.target,n=t.closest(`[data-card]`);n?.dataset.id&&(t.closest(`[data-select], [data-pin], [data-menu], [data-history-toggle]`)||(e.preventDefault(),V(n.dataset.id)))}),document.addEventListener(`keydown`,e=>{if(!k||e.key!==`Enter`)return;let t=e.target.closest(`.prb-card-link`)?.closest(`[data-card]`);t?.dataset.id&&(e.preventDefault(),V(t.dataset.id))});function H(){return p.filter(e=>O.has(e.dataset.id??``))}function U(){return H().reduce((e,t)=>e+Number(t.dataset.reviews??1),0)}function W(e){E&&(E.textContent=e,E.hidden=!1)}function G(e){for(let t of b?.querySelectorAll(`button`)??[])t.disabled=e}async function K(e){let t=[...O];if(t.length===0)return;G(!0);try{if(!(await fetch(`/status`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:t,complete:e})})).ok)return G(!1),W(`That could not be saved. The workspace server refused it.`)}catch{return G(!1),W(`The workspace server did not answer. It may have stopped.`)}let n=e?`complete`:`in-progress`;for(let e of H()){e.dataset.status=n;let t=e.querySelector(`.prb-card-status`);t&&(t.dataset.status=n,t.textContent=c(n))}G(!1),R(!1)}async function q(){let e=[...O];if(e.length===0)return;G(!0);let t=null;try{let n=await fetch(`/delete`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({ids:e})});if(t=n.ok?await n.json().catch(()=>null):null,!t)return G(!1),z(),W(`Nothing was deleted. The workspace server refused it.`)}catch{return G(!1),z(),W(`The workspace server did not answer. It may have stopped.`)}let n=t.blocked??[],r=new Set(n.map(e=>e.id));for(let e of H())r.has(e.dataset.id??``)||e.remove();p=p.filter(e=>e.isConnected),O.clear();for(let e of r)O.add(e);if(G(!1),z(),n.length===0)return R(!1);A(),W([...new Set(n.map(e=>e.error))].join(` `))}b?.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`[data-bulk-mark]`);if(n)return void K(n.dataset.bulkMark===`complete`);if(t.closest(`[data-bulk-delete]`)){C&&(C.textContent=d(U())),T&&(T.hidden=!0),w&&(w.hidden=!1);return}if(t.closest(`[data-bulk-confirm-delete]`))return void q();if(t.closest(`[data-bulk-cancel-delete]`))return z();if(t.closest(`[data-bulk-cancel]`))return R(!1)}),e(window,()=>window.location.reload());var J=document.body.dataset.indexRevision??``,Y=document.body.dataset.live===`true`?Date.now():0,X=!1;function Z(){return O.size>0||document.activeElement===h}function Q(){X&&!Z()&&window.location.reload()}async function $(){try{let e=await fetch(`/revision`);if(e.ok){let t=await e.json();t.live&&Y===0&&(Y=Date.now()),t.live||(Y=0);let n=f(J,t.revision??``,Z());if(n===`reload`)return void window.location.reload();n===`hold`&&(X=!0)}}catch{}window.setTimeout(()=>void $(),n(Y===0?2**53-1:Date.now()-Y))}$(),h?.addEventListener(`blur`,Q),document.addEventListener(`click`,()=>window.setTimeout(Q,0));
package/static/shell.css CHANGED
@@ -1058,8 +1058,12 @@ a.prb-rail-item { text-decoration: none; }
1058
1058
  text-align: left;
1059
1059
  cursor: pointer;
1060
1060
  }
1061
- .prb-suggestion:hover { border-color: var(--brand); color: var(--text-primary); }
1061
+ .prb-suggestion:hover:not(:disabled) { border-color: var(--brand); color: var(--text-primary); }
1062
1062
  .prb-suggestion:focus-visible { outline: 2px solid var(--brand-hover); outline-offset: 2px; }
1063
+ /* Buddy AI answers one question at a time; these wait for the one in flight. */
1064
+ .prb-suggestion:disabled,
1065
+ .pr-helper-explain-simply-button:disabled { opacity: 0.55; cursor: default; }
1066
+ .pr-helper-explain-simply-button:disabled:hover { background: transparent; }
1063
1067
 
1064
1068
  /* ── The reviewer's own prompts ──
1065
1069
  A strip between the assistant's header and its conversation: reachable without scrolling the
@@ -1996,6 +2000,7 @@ a.prb-rail-item { text-decoration: none; }
1996
2000
  .prb-progress-mark::before { content: '○'; }
1997
2001
  .prb-progress-step[data-state='complete'] .prb-progress-mark::before { content: '✓'; color: #1a7f37; }
1998
2002
  .prb-progress-step[data-state='failed'] .prb-progress-mark::before { content: '✕'; color: #cf222e; }
2003
+ .prb-progress-step[data-state='stopped'] .prb-progress-mark::before { content: '–'; color: #8c959f; }
1999
2004
  .prb-progress-step[data-state='active'] .prb-progress-mark::before { content: '●'; color: #9333ea; }
2000
2005
  .prb-progress-step[data-state='pending'] { color: #8c959f; }
2001
2006
  .prb-progress-step[data-state='pending'] .prb-progress-mark::before { color: #d0d7de; }
@@ -2685,7 +2690,8 @@ a.prb-rail-item { text-decoration: none; }
2685
2690
  background: currentColor;
2686
2691
  animation: prb-pulse 1.2s ease-in-out infinite;
2687
2692
  }
2688
- .prb-card-analysis[data-analysis='stopped'] { color: var(--text-muted); }
2693
+ .prb-card-analysis[data-analysis='stopped'],
2694
+ .prb-card-analysis[data-analysis='failed'] { color: var(--text-muted); }
2689
2695
  @media (prefers-reduced-motion: reduce) {
2690
2696
  .prb-card-analysis i { animation: none; opacity: 0.7; }
2691
2697
  }
@@ -37,7 +37,7 @@ import{t as e}from"./chunk-CIsM3PMS.js";import{n as t,t as n}from"./chunk-gBDI1-
37
37
 
38
38
  `);return i.trim()?(i.length>Je?`${i.slice(0,Je).trimEnd()}…`:i).split(`
39
39
  `).map(e=>`> ${e}`.trimEnd()).join(`
40
- `):``}function Xe(e,t){let n=Ye(e);if(!n)return null;let r=[...Ke,...qe].find(e=>e.id===t);return r?r.instruction?`${n}\n\n${r.instruction}`:`${n}\n\n`:null}var Ze=`saved:`,Qe=`Your prompts`;function $e(e){return`${Ze}${e}`}function et(e){return e.startsWith(`saved:`)?e.slice(6):null}function tt(e){return e.reviewerClosed>0?`dealt with`:`resolved`}var nt=`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 rt(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 it(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 at(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 ot(e,t){let n=e.trim();return n?`${n}\n\n${t}`:t}var st=[`progress`,`overview`,`guide`,`issues`,`questions`,`files`,`prcontext`,`diagram`,`kiss`,`kissrecs`],ct=`#theme-`;function lt(e){return`#${e}`}function ut(e){return`${ct}${encodeURIComponent(e)}`}function dt(e){return e.kind===`view`?lt(e.view):ut(e.sectionId)}function ft(e){if(e.startsWith(ct)){let t=e.slice(7);if(!t)return null;try{return{kind:`section`,sectionId:decodeURIComponent(t)}}catch{return null}}let t=e.replace(/^#/,``);return st.includes(t)?{kind:`view`,view:t}:null}function pt(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 mt(){return`<button type="button" class="prb-update-btn" data-review-update>Update review</button>`}var ht=`Updating this review checks the latest commits and refreshes the PR conversation. Your progress and Buddy AI history will be kept.`;function gt(e){return`<details class="prb-update-alt">
40
+ `):``}function Xe(e,t){let n=Ye(e);if(!n)return null;let r=[...Ke,...qe].find(e=>e.id===t);return r?r.instruction?`${n}\n\n${r.instruction}`:`${n}\n\n`:null}var Ze=`saved:`,Qe=`Your prompts`;function $e(e){return`${Ze}${e}`}function et(e){return e.startsWith(`saved:`)?e.slice(6):null}function tt(e){return e.reviewerClosed>0?`dealt with`:`resolved`}({claude:`Claude Code`,codex:`Codex`,gemini:`Gemini CLI`}).claude;var nt=`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 rt(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 it(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 at(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 ot(e,t){let n=e.trim();return n?`${n}\n\n${t}`:t}var st=[`progress`,`overview`,`guide`,`issues`,`questions`,`files`,`prcontext`,`diagram`,`kiss`,`kissrecs`],ct=`#theme-`;function lt(e){return`#${e}`}function ut(e){return`${ct}${encodeURIComponent(e)}`}function dt(e){return e.kind===`view`?lt(e.view):ut(e.sectionId)}function ft(e){if(e.startsWith(ct)){let t=e.slice(7);if(!t)return null;try{return{kind:`section`,sectionId:decodeURIComponent(t)}}catch{return null}}let t=e.replace(/^#/,``);return st.includes(t)?{kind:`view`,view:t}:null}function pt(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 mt(){return`<button type="button" class="prb-update-btn" data-review-update>Update review</button>`}var ht=`Updating this review checks the latest commits and refreshes the PR conversation. Your progress and Buddy AI history will be kept.`;function gt(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
43
  </details>`}var _t=`prreviewbuddy review --fresh`;function vt(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 yt(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=wt(e.code),s=[...o.facts,`checked ${r(pt(e.checkedAt))}`];return`<div class="prb-fresh" data-state="${n||i?`changed`:`quiet`}" role="status">
@@ -61,7 +61,7 @@ import{t as e}from"./chunk-CIsM3PMS.js";import{n as t,t as n}from"./chunk-gBDI1-
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 kt(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 At(e){return e===`done`||e===`failed`}function jt(e,t){return At(e)?!0:(e===`conversation`||e===`analysing`)&&!t.querySelector(`[data-view="files"]`)}function Mt(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||Dt(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 Nt(e){let t=e.querySelector(`[data-started-at]`),n=Number(t?.dataset.startedAt);!t||!Number.isFinite(n)||(t.textContent=`Running for ${kt(n)}.`)}function Pt(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)}">
64
+ </div>`}function kt(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 v(e){return e===`done`||e===`failed`}function At(e,t){return v(e)?!0:(e===`conversation`||e===`analysing`)&&!t.querySelector(`[data-view="files"]`)}function jt(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||Dt(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 Mt(e){let t=e.querySelector(`[data-started-at]`),n=Number(t?.dataset.startedAt);!t||!Number.isFinite(n)||(t.textContent=`Running for ${kt(n)}.`)}function Nt(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
- ${Ft(e,n)}
83
+ ${Pt(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 Ft(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 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,v=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…`,v?.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)}),{drawPane:nn}}async function Yt(e,t){if(v)return;let n=t??`change`,r=document.querySelector(`[data-diagram-pane]`),i=r?.querySelector(`[data-diagram-card="${pn(n)}"]`)??null??Zt(r,n,t);if(!i)return;Xt(),e.showDiagrams();let a=Qt(i);v=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:v.signal}),r=await n.json().catch(()=>null);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(),Xt()):a.remove();return}$t(i,a,`Could not reach PR Review Buddy. The workspace server may have stopped.`)}finally{v=null,cn(!0)}}function Xt(){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`,t.dataset.viewNav=`diagram`,t.innerHTML=`<span class="prb-rail-order"></span><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">
89
+ </article>`}function Pt(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 Ft=`modulepreload`,It=function(e){return`/`+e},Lt={},Rt=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=It(t,n),t=s(t),t in Lt)return;Lt[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`:Ft,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)})},zt=.5,Bt=3,Vt=1.25,Ht=null;function Ut(){return Ht??=Rt(()=>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])),Ht}var Wt=new WeakSet,Gt=new WeakMap,Kt=new WeakMap,y=null;function qt(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(()=>{y?.abort()});return}let i=n.closest(`[data-diagram-toggle]`);if(i){en(i.closest(`[data-diagram-card]`),i.getAttribute(`aria-expanded`)===`true`);return}let a=n.closest(`[data-diagram-zoom]`);if(a){rn(a.closest(`[data-diagram-card]`),a.dataset.diagramZoom??`reset`);return}let o=n.closest(`[data-diagram-request]`);o&&Jt(e,o.dataset.diagramRequest||null)}),Yt(),{drawPane:tn}}async function Jt(e,t){if(y)return;let n=t??`change`,r=document.querySelector(`[data-diagram-pane]`),i=r?.querySelector(`[data-diagram-card="${x(n)}"]`)??null??Xt(r,n,t);if(!i)return;b(),e.showDiagrams();let a=Zt(i);y=new AbortController,sn(!1);try{let n=await fetch(e.endpoint(`/diagram`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({sectionId:t}),signal:y.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 Qt(i,a,r?.error??`Buddy AI did not return a diagram. Check the terminal running PR Review Buddy.`);$t(i,r.diagram,t)}catch(e){if(e instanceof DOMException&&e.name===`AbortError`){i.hasAttribute(`data-diagram-pending`)?(i.remove(),b()):a.remove();return}Qt(i,a,`Could not reach PR Review Buddy. The workspace server may have stopped.`)}finally{y=null,sn(!0)}}function Yt(){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="${x(n)}"]`)??Xt(e,n,t);r&&(b(),Zt(r,{scroll:!1}),sn(!1))}function b(){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`,t.dataset.viewNav=`diagram`,t.innerHTML=`<span class="prb-rail-order"></span><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 Xt(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
- <p class="prb-diagram-scope">${t===`change`?`Whole change`:fn(ln(n))}</p>
92
+ <p class="prb-diagram-scope">${t===`change`?`Whole change`:dn(cn(n))}</p>
93
93
  </div>
94
- </header>`,un(e,r,n),r}function Qt(e){e.querySelector(`[data-diagram-status]`)?.remove();let t=document.createElement(`p`);t.className=`prb-diagram-status`,t.setAttribute(`data-diagram-status`,``),t.innerHTML=`<span class="prb-thinking"><i></i><i></i><i></i></span><span>Reading the change…</span>`;let n=document.createElement(`button`);return n.type=`button`,n.className=`prb-diagram-redraw`,n.setAttribute(`data-diagram-stop`,``),n.textContent=`Stop`,t.appendChild(n),e.querySelector(`.prb-diagram-head`)?.insertAdjacentElement(`afterend`,t),e.scrollIntoView({behavior:mn()?`auto`:`smooth`,block:`start`}),t}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=Pt(t,new Map(n?[[n,ln(n)]]:[]),t.commitSha),i=document.createElement(`div`);i.innerHTML=r;let a=i.firstElementChild;a&&(e.replaceWith(a),Xt(),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="${pn(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="${pn(e)}"]`);return Number(t?.dataset.themeIndex??0)}function fn(e){let t=document.createElement(`span`);return t.textContent=e,t.innerHTML}function pn(e){return CSS.escape(e)}function mn(){return window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}var y=document.body,hn=y.dataset.apiBase??``,gn=y.dataset.token??``,_n=y.dataset.editorLabel??``,vn=y.dataset.editorTemplate??``,yn=y.dataset.repoPath??``,bn=y.dataset.explainPrompt??``,xn=y.dataset.sessionId??``;function b(e){return`${hn}${e}?t=${encodeURIComponent(gn)}`}function x(e){fetch(b(`/event`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),keepalive:!0}).catch(()=>{})}var Sn=Jt({endpoint:b,showDiagrams:()=>Tn(`diagram`)}),S=null,C=`whole change`;function Cn(e){let t=dt(e);window.location.hash!==t&&history.pushState(e,``,t),wn(e)}function wn(e){e.kind===`view`?Dn(e.view):jn(e.sectionId)}function Tn(e){Cn({kind:`view`,view:e})}function En(e){Cn({kind:`section`,sectionId:e})}function Dn(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));x({event:`view_opened`,view:e}),e===`diagram`&&Sn.drawPane(),On(),document.querySelector(`.prb-doc`)?.scrollTo({top:0})}function On(){for(let e of document.querySelectorAll(`[data-goto-section]`))e.setAttribute(`aria-current`,`false`);S=null,C=`whole change`,Nn()}function kn(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 An(){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`)&&kn(e,!0)}}function jn(e){Dn(`guide`),An();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:Mn()?`auto`:`smooth`,block:`start`});let n=document.querySelector(`[data-goto-section="${CSS.escape(e)}"]`);x({event:`theme_opened`,themeIndex:Number(n?.dataset.themeIndex??-1),attention:n?.querySelector(`.prb-attention`)?.dataset.attention??`medium`,isRecommendedStart:n?.dataset.recommendedStart===`true`}),S=e,C=t.querySelector(`.pr-helper-guide-section-title`)?.textContent?.trim()??`this theme`,Nn()}function Mn(){return window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}function Nn(){let e=document.querySelector(`[data-ask-scope]`);e&&(e.textContent=C,e.title=S?`Questions are answered about "${C}"`:`Questions cover the whole change`)}function w(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`)}function Pn(e){return e.tagName===`LI`?{parent:e,position:`beforeend`}:{parent:e,position:`afterend`}}async function Fn(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}=Pn(e);o.insertAdjacentElement(s,a),e.setAttribute(`aria-expanded`,`true`),x({event:`file_opened`,fromFinding:i,targeted:r>0}),await In(a,n,r,0)}async function In(e,t,n,r){try{let i=`&path=${encodeURIComponent(t)}${n?`&line=${n}`:``}${r?`&expand=${r}`:``}`,a=await fetch(`${b(`/file`)}${i}`),o=await a.json();if(!a.ok){e.innerHTML=`<p class="prb-code-status">${w(o?.error??`Could not read that file.`)}</p>`;return}Ln(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 Ln(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">${w(e)||`&nbsp;`}</td></tr>`}).join(``),o=vn&&yn?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="${w(t.path)}" data-open-line="${n||t.from}">${w(`Open in ${_n||`editor`}`)}</button>`:``,s=t.pullRequest&&t.pullRequest.precise?`<a class="prb-code-open prb-code-pr" href="${w(t.pullRequest.href)}" target="_blank" rel="noopener noreferrer">${w(t.pullRequest.label)}</a>`:``,c=t.truncated?`<button type="button" class="prb-code-more" data-expand-file="${w(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>${w(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">
94
+ </header>`,ln(e,r,n),r}function Zt(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:fn()?`auto`:`smooth`,block:`start`}),n}function Qt(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 $t(e,t,n){let r=Nt(t,new Map(n?[[n,cn(n)]]:[]),t.commitSha),i=document.createElement(`div`);i.innerHTML=r;let a=i.firstElementChild;a&&(e.replaceWith(a),b(),nn(a))}function en(e,t){e&&(e.toggleAttribute(`data-diagram-collapsed`,t),e.querySelector(`[data-diagram-toggle]`)?.setAttribute(`aria-expanded`,String(!t)),t||nn(e))}function tn(){for(let e of document.querySelectorAll(`[data-diagram-pane] [data-diagram-card]`))nn(e)}async function nn(e){let t=e.querySelector(`[data-diagram-canvas]`),n=e.querySelector(`[data-mermaid-source]`)?.textContent??``;if(!(!t||!n||Wt.has(e)||e.hasAttribute(`data-diagram-collapsed`))){Wt.add(e);try{let e=await Ut();await e.parse(n);let{svg:r}=await e.render(`prb-mermaid-${Math.random().toString(36).slice(2)}`,n);t.innerHTML=r}catch{Wt.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 rn(e,t){let n=e?.querySelector(`[data-diagram-canvas] svg`),r=e?.querySelector(`[data-diagram-canvas]`);if(!e||!n||!r)return;if(t===`reset`){Kt.delete(e),r.removeAttribute(`data-zoomed`),n.style.removeProperty(`width`);return}let i=an(e,n);if(i<=0)return;let a=on((Kt.get(e)??1)*(t===`in`?Vt:1/Vt));Kt.set(e,a),r.setAttribute(`data-zoomed`,``),n.style.width=`${Math.round(i*a)}px`}function an(e,t){let n=Gt.get(e);if(n)return n;let r=t.getBoundingClientRect().width;if(r>0)return Gt.set(e,r),r;let i=t.getAttribute(`viewBox`)?.split(/[\s,]+/),a=Number(i?.[2]??0);return Number.isFinite(a)?a:0}function on(e){return Math.min(Bt,Math.max(zt,e))}function sn(e){for(let t of document.querySelectorAll(`[data-diagram-request]`))t.disabled=!e}function cn(e){return e?document.querySelector(`[data-goto-section="${x(e)}"]`)?.querySelector(`.prb-rail-title`)?.textContent?.trim()||`A theme of this change`:`Whole change`}function ln(e,t,n){let r=un(n);for(let n of e.querySelectorAll(`[data-diagram-card]`)){let e=n.dataset.diagramCard??``;if(un(e===`change`?null:e)>r){n.before(t);return}}e.appendChild(t)}function un(e){if(!e)return-1;let t=document.querySelector(`[data-goto-section="${x(e)}"]`);return Number(t?.dataset.themeIndex??0)}function dn(e){let t=document.createElement(`span`);return t.textContent=e,t.innerHTML}function x(e){return CSS.escape(e)}function fn(){return window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}var S=document.body,pn=S.dataset.apiBase??``,mn=S.dataset.token??``,hn=S.dataset.editorLabel??``,gn=S.dataset.editorTemplate??``,_n=S.dataset.repoPath??``,vn=S.dataset.explainPrompt??``,yn=S.dataset.sessionId??``;function C(e){return`${pn}${e}?t=${encodeURIComponent(mn)}`}function w(e){fetch(C(`/event`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),keepalive:!0}).catch(()=>{})}var bn=qt({endpoint:C,showDiagrams:()=>wn(`diagram`)}),T=null,xn=`whole change`;function Sn(e){let t=dt(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));w({event:`view_opened`,view:e}),e===`diagram`&&bn.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`);T=null,xn=`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)}"]`);w({event:`theme_opened`,themeIndex:Number(n?.dataset.themeIndex??-1),attention:n?.querySelector(`.prb-attention`)?.dataset.attention??`medium`,isRecommendedStart:n?.dataset.recommendedStart===`true`}),T=e,xn=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=xn,e.title=T?`Questions are answered about "${xn}"`:`Questions cover the whole change`)}function E(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`)}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`),w({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(`${C(`/file`)}${i}`),o=await a.json();if(!a.ok){e.innerHTML=`<p class="prb-code-status">${E(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">${E(e)||`&nbsp;`}</td></tr>`}).join(``),o=gn&&_n?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="${E(t.path)}" data-open-line="${n||t.from}">${E(`Open in ${hn||`editor`}`)}</button>`:``,s=t.pullRequest&&t.pullRequest.precise?`<a class="prb-code-open prb-code-pr" href="${E(t.pullRequest.href)}" target="_blank" rel="noopener noreferrer">${E(t.pullRequest.label)}</a>`:``,c=t.truncated?`<button type="button" class="prb-code-more" data-expand-file="${E(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>${E(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="${w(e.id)}" title="${w(e.prompt)}">${w(e.name)}</button>
103
- <button type="button" class="prb-bank-edit" data-prompt-edit="${w(e.id)}" aria-label="Edit ${w(e.name)}">&#9998;</button>
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=`${_n.replace(/\/$/,``)}/${e}`,i=gn.replace(`{path}`,r).replace(`{line}`,String(Math.max(1,t)));w({event:`editor_opened`,fromFinding:n}),window.location.href=i}var D=document.querySelector(`[data-ask-log]`);D&&D.querySelector(`.prb-msg`)&&D.scrollTo({top:D.scrollHeight});var O=document.querySelector(`[data-ask-form]`),k=O?.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)+je(t)):n.textContent=t,D?.appendChild(n),D?.scrollTo({top:D.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>`,D?.appendChild(e),D?.scrollTo({top:D.scrollHeight}),e}var A=null,j=!!D?.querySelector(`[data-ask-pending]`);function Bn(){let e=document.createElement(`div`);e.className=`prb-stopped`,e.textContent=`Stopped.`,D?.appendChild(e),D?.scrollTo({top:D.scrollHeight})}async function Vn(e,t=`free_text`){let n=e.trim();if(!n||A||j)return;document.querySelector(`.prb-ask-empty`)?.remove(),Rn(`user`,n);let r=zn();A=new AbortController,Hn(!0);try{let e=await fetch(C(`/ask`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({question:n,sectionId:T,source:t}),signal:A.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(),k&&!k.value&&(k.value=n)):Rn(`error`,`Could not reach PR Review Buddy. The workspace server may have stopped.`)}finally{A=null,Hn(!1)}}function Hn(e){let t=O?.querySelector(`button`);t&&(t.textContent=e?`Stop`:`Ask`,t.toggleAttribute(`data-stop`,e),t.disabled=!1),k&&(k.disabled=e);for(let t of document.querySelectorAll(Un))t.disabled=e;e||k?.focus()}var Un=`[data-suggestion], .pr-helper-explain-simply-button`;function Wn(){let e=O?.querySelector(`button`);e&&(e.textContent=`Stopping…`,e.disabled=!0),fetch(C(`/stop`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({kind:`ask`})}).catch(()=>{}).finally(()=>{A?.abort()})}O?.addEventListener(`submit`,e=>{if(e.preventDefault(),A||j)return Wn();let t=k?.value??``;k&&(k.value=``),Vn(t,Kn(t))}),j&&Hn(!0);var Gn=null;function Kn(e){return Gn&&e.includes(Gn)?`selection`:`free_text`}k?.addEventListener(`keydown`,e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),O?.requestSubmit())}),k?.addEventListener(`input`,()=>{k&&(k.style.height=`auto`,k.style.height=`${Math.min(k.scrollHeight,140)}px`)});async function qn(e){try{await fetch(C(`/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||yn})).filter(e=>e.id)}async function Zn(e){try{await fetch(C(`/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=yn: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){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),w({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),w({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(vn,`explain_simply`);return}let ne=t.closest(`[data-prompt-use]`);if(ne?.dataset.promptUse){Pr(ne.dataset.promptUse);return}let re=t.closest(`[data-prompt-edit]`);if(re?.dataset.promptEdit){Gr(re.dataset.promptEdit);return}if(t.closest(`[data-prompt-add]`)){Gr(``);return}t.closest(`[data-ask-toggle]`)&&fr(!dr())});var M=document.querySelector(`.prb-body`),N=document.querySelector(`.prb-ask`);function dr(){return!!N&&getComputedStyle(N).display!==`none`}function fr(e){M&&(M.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]`),P=document.querySelector(`[data-shutdown-confirm]`);hr?.addEventListener(`click`,()=>gr?.showModal()),document.querySelector(`[data-shutdown-cancel]`)?.addEventListener(`click`,()=>gr?.close()),P?.addEventListener(`click`,()=>{P.disabled=!0,P.textContent=`Stopping…`,fetch(C(`/shutdown`),{method:`POST`}).then(()=>{gr?.close(),_r()}).catch(()=>{P.disabled=!1,P.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 F=document.querySelector(`[data-file-filter]`),vr=document.querySelector(`[data-file-count]`),yr=document.querySelector(`[data-file-none]`);function br(){let e=(F?.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 ${I} file${I===1?``:`s`}`:`${I} file${I===1?``:`s`}`)}var I=document.querySelectorAll(`[data-view="files"] .prb-file:not(.prb-file-referenced)`).length;F?.addEventListener(`input`,br),F?.addEventListener(`keydown`,e=>{e.key===`Escape`&&F.value!==``&&(e.preventDefault(),F.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 xr=320,Sr=()=>Math.round(window.innerWidth/2),Cr=e=>Math.round(Math.min(Sr(),Math.max(xr,e)));function L(e){M&&(e===null?M.style.removeProperty(`--ask-width`):M.style.setProperty(`--ask-width`,`${e}px`))}function R(){return N?Math.round(N.getBoundingClientRect().width):xr}function wr(e){fetch(C(`/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||!M||!N)return;e.preventDefault(),z.setPointerCapture(e.pointerId),M.dataset.resizing=`true`;let t=e.clientX,n=R(),r=e=>{L(Cr(n+(t-e.clientX)))},i=()=>{z.removeEventListener(`pointermove`,r),z.removeEventListener(`pointerup`,i),z.removeEventListener(`pointercancel`,i),delete M.dataset.resizing,wr(R())};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=Cr(R()+n);L(r),wr(r);return}(e.key===`Home`||e.key===`Escape`)&&(e.preventDefault(),L(null),wr(null))}),z?.addEventListener(`dblclick`,()=>{L(null),wr(null)}),window.addEventListener(`resize`,()=>{dr()&&M?.style.getPropertyValue(`--ask-width`)&&L(Cr(R()))});var Tr=3e4,B=document.visibilityState===`visible`?Date.now():null,Er=0;function Dr(){B!==null&&(Er+=Date.now()-B,B=Date.now())}function Or(){Dr();let e=Math.round(Er/1e3);return Er-=e*1e3,e}document.addEventListener(`visibilitychange`,()=>{document.visibilityState===`visible`?B=Date.now():(Dr(),B=null)}),setInterval(()=>{let e=Or();e>0&&w({event:`workspace_heartbeat`,visibleSeconds:e})},Tr),window.addEventListener(`pagehide`,()=>{let e=C(`/event`),t=JSON.stringify({event:`review_completed`,trailingSeconds:Or()});navigator.sendBeacon?.(e,new Blob([t],{type:`application/json`}))||fetch(e,{method:`POST`,headers:{"content-type":`application/json`},body:t,keepalive:!0}).catch(()=>{})});var kr=document.querySelector(`[data-prompt-bank]`),Ar=document.querySelector(`[data-prompt-list]`),V=jr();function jr(){try{let e=JSON.parse(kr?.dataset.prompts??`[]`);return Array.isArray(e)?e:[]}catch{return[]}}function Mr(){Ar&&(Ar.innerHTML=V.map(e=>`<span class="prb-bank-item">
102
+ <button type="button" class="prb-bank-use" data-prompt-use="${E(e.id)}" title="${E(e.prompt)}">${E(e.name)}</button>
103
+ <button type="button" class="prb-bank-edit" data-prompt-edit="${E(e.id)}" aria-label="Edit ${E(e.name)}">&#9998;</button>
104
+ </span>`).join(``),zr())}async function Nr(e){try{let t=await(await fetch(C(`/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{}Mr()}function Pr(e){let t=V.find(t=>t.id===e);!t||!k||(k.value=ot(k.value,t.prompt),pr(),k.focus(),k.setSelectionRange(k.value.length,k.value.length),k.dispatchEvent(new Event(`input`)))}var Fr=document.querySelector(`.prb-doc`),Ir=null,Lr=null;function Rr(){D&&(Lr?.(),Lr=we(D,{layout:`flat`,actions:qe.map(e=>({id:e.id,label:e.label})),onChoose:(e,t)=>Br(e,t)}))}function zr(){Fr&&(Ir?.(),Ir=we(Fr,{triggerLabel:`Ask Buddy AI`,actions:[...Ke.map(e=>({id:e.id,label:e.label})),...V.map(e=>({id:$e(e.id),label:e.name,section:Qe}))],onChoose:(e,t)=>Br(e,t)}))}function Br(e,t){let n=Vr(e,t);!n||!k||(Gn=n,k.value=ot(k.value,n),pr(),k.focus(),k.setSelectionRange(k.value.length,k.value.length),k.dispatchEvent(new Event(`input`)))}function Vr(e,t){let n=et(e);if(n===null)return Xe(t,e);let r=V.find(e=>e.id===n);if(!r)return null;let i=Ye(t);return i?`${i}\n\n${r.prompt}`:null}zr(),Rr(),ze(document);var Hr=document.querySelector(`[data-prompt-dialog]`),H=document.querySelector(`[data-prompt-name]`),U=document.querySelector(`[data-prompt-text]`),Ur=document.querySelector(`[data-prompt-delete]`),Wr=document.getElementById(`prb-prompt-title`),W=``;function Gr(e){let t=V.find(t=>t.id===e);W=t?.id??``,Wr&&(Wr.textContent=t?`Edit prompt`:`Save a prompt`),H&&(H.value=t?.name??``),U&&(U.value=t?.prompt??``),Ur&&(Ur.hidden=!t),Hr?.showModal(),H?.focus()}async function Kr(){let e=H?.value.trim()??``,t=U?.value.trim()??``;if(!e||!t){(e?U:H)?.focus();return}let n=W?V.map(n=>n.id===W?{...n,name:e,prompt:t}:n):[...V,{id:crypto.randomUUID(),name:e,prompt:t}];Hr?.close(),await Nr(n)}async function qr(){if(!W)return;let e=V.filter(e=>e.id!==W);Hr?.close(),await Nr(e)}document.querySelector(`[data-prompt-cancel]`)?.addEventListener(`click`,()=>Hr?.close()),Ur?.addEventListener(`click`,()=>void qr()),document.querySelector(`[data-prompt-save]`)?.addEventListener(`click`,()=>void Kr());var G=document.querySelector(`[data-complete]`);G?.addEventListener(`click`,()=>{let e=G.getAttribute(`aria-pressed`)!==`true`;Jr(e),fetch(C(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({complete:e})}).then(async e=>{let t=await e.json().catch(()=>null);t&&Jr(t.completedAt!==null)}).catch(()=>Jr(!e))});function Jr(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=Qr(K?.dataset.report),Yr=`prb-fresh-reopen`,Y=Zr(),Xr=K?.dataset.dismissedSha;function Zr(){try{return sessionStorage.getItem(Yr)!==null&&(sessionStorage.removeItem(Yr),!0)}catch{return!1}}Y&&(q?.setAttribute(`aria-expanded`,`true`),Z()),q?.addEventListener(`click`,()=>{Y=!Y,q.setAttribute(`aria-expanded`,String(Y)),Y?ei():Z()}),K?.addEventListener(`click`,e=>{let t=e.target;if(t.closest(`[data-fresh-recheck]`))return void ei();if(t.closest(`[data-fresh-close]`))return Y=!1,q?.setAttribute(`aria-expanded`,`false`),Z();let n=t.closest(`[data-fresh-dismiss]`);n&&(Xr=n.dataset.freshDismiss||void 0,Y=!1,q?.setAttribute(`aria-expanded`,`false`),Z(),fetch(C(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissFreshnessSha:Xr??null})}).catch(()=>{}))});function Qr(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}var $r=!1;async function ei(){if($r)return;$r=!0,ti(!0);let e=ni(J),t=!1;try{let e=await(await fetch(C(`/freshness`))).json();J=e.report??null,ri=e.kiss??null,e.kissDismissedSha!==void 0&&(ii=e.kissDismissedSha??void 0),oi(),t=!0}catch{}$r=!1,Z();let n=t?ni(J)===e?`No change`:`Updated`:`Could not check`,r=K?.querySelector(`[data-fresh-recheck]`)??q;r&&ci(r,n,2600)}function ti(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 ni(e){if(!e)return`none`;let{checkedAt:t,...n}=e;return JSON.stringify(n)}var X=document.querySelector(`[data-kiss-fresh-region]`),ri=ai(X?.dataset.freshness),ii=X?.dataset.dismissedSha;function ai(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function oi(){X&&(X.innerHTML=Ot(X.dataset.reviewedSha??``,ri,{dismissedSha:ii,actions:mn!==``}))}X?.addEventListener(`click`,e=>{let t=e.target.closest(`[data-kiss-freshness-dismiss]`);t&&(ii=t.dataset.kissFreshnessDismiss||void 0,oi(),fetch(C(`/state`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({dismissKissFreshnessSha:ii??null})}).catch(()=>{}))});function Z(){if(K&&(K.innerHTML=yt(J,{dismissedSha:Xr,open:Y,actions:mn!==``}),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 si(n);let r=t.closest(`[data-pr-recheck]`);if(r)return void li(r);let i=t.closest(`[data-review-update]`);if(i)return void fi(i);t.closest(`[data-update-close]`)&&document.querySelector(`[data-update-result]`)?.remove()});function si(e){let t=e.dataset.copyCommand??``;navigator.clipboard?.writeText(t).then(()=>ci(e,`Copied`),()=>ci(e,`Select it`))}function ci(e,t,n=1400){let r=e.textContent;e.textContent=t,setTimeout(()=>{e.textContent=r},n)}async function li(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=ui(n);t?t.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Re-checking the conversation, ${e}s. ${pi}`:n.innerHTML=`<span class="prb-spinner" aria-hidden="true"></span>Checking… ${e}s`}};r();let i=window.setInterval(r,1e3),a=ui(e)?null:mi(e);try{await fetch(C(`/refresh`),{method:`POST`})}catch{}finally{window.clearInterval(i),a?.remove()}ui(e)&&di(),window.location.reload()}function ui(e){return e.closest(`.prb-fresh-notes p`)}function di(){try{sessionStorage.setItem(Yr,`1`)}catch{}}async function fi(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(C(`/job`))).json();e.update&&e.update.phase!==`none`&&!v(e.update.phase)&&r()}catch{}},500);try{await fetch(C(`/update`),{method:`POST`})}catch{}r()}var pi=`Fetching the latest threads from your pull request. This usually takes under a minute.`;function mi(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=pi,t.appendChild(n),n}var hi=document.querySelector(`[data-job-phase]`),gi=document.querySelector(`[data-kiss-phase]`),Q=document.querySelector(`[data-update-phase]`),_i=null,vi=Date.now();function yi(){_i===null&&(_i=window.setTimeout(()=>{_i=null,bi()},n(Date.now()-vi)))}async function bi(){try{let e=await(await fetch(C(`/job`))).json();if(j&&!e.ask||Ci&&!e.diagram){window.location.reload();return}if(Q&&e.update){if(e.update.phase===`none`||e.update.failed||v(e.update.phase)){window.location.reload();return}jt(Q,e.update.phase,e.update.progress),Mt(Q)}let t=[[hi,e],[gi,e.kiss]];for(let[e,n]of t){if(!e||!n)continue;if(n.failed||At(n.phase,document)){window.location.reload();return}let t=e.matches(`[data-progress-pane]`)?e:null;t?(jt(t,n.phase,n.progress),Mt(t)):xi(e,n.progress)}}catch{}yi()}function xi(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 Si(e,t){return e!==null&&!v(t)}var Ci=document.querySelector(`[data-diagram-running]`)!==null;(Si(hi,hi?.dataset.jobPhase)||Si(gi,gi?.dataset.kissPhase)||Si(Q,Q?.dataset.updatePhase)||j||Ci)&&(vi=Date.now(),yi());function wi(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 Ti(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…`,Ti(t),fetch(C(`/retry`),{method:`POST`}).then(e=>{if(!e.ok)throw Error(`refused`);vi=Date.now(),yi()}).catch(()=>{t.disabled=!1,t.textContent=`Retry`,wi(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(C(`/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 Ei=document.body.dataset.defaultView||`overview`;window.addEventListener(`popstate`,e=>{Cn(e.state??ft(window.location.hash)??{kind:`view`,view:Ei})});var Di=ft(window.location.hash);Di?Cn(Di):history.replaceState({kind:`view`,view:Ei},``,window.location.pathname+window.location.search),mr(),Mn();var Oi=e=>{for(let t of document.querySelectorAll(`[data-analysis-details][open]`))(!e||!t.contains(e))&&(t.open=!1)};document.addEventListener(`click`,e=>{Oi(e.target)}),document.addEventListener(`keydown`,e=>{if(e.key!==`Escape`)return;let t=document.querySelector(`[data-analysis-details][open]`);t&&(Oi(),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{Rt as t};