revdeck 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ (function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=Array.isArray,t=Array.prototype.indexOf,n=Array.prototype.includes,r=Array.from,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyDescriptors,s=Object.prototype,c=Array.prototype,l=Object.getPrototypeOf,u=Object.isExtensible,d=()=>{};function f(e){for(var t=0;t<e.length;t++)e[t]()}function p(){var e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}}var m=1024,h=2048,g=4096,_=8192,v=16384,y=32768,b=1<<25,x=65536,S=1<<19,ee=1<<20,C=1<<25,w=1<<21,T=1<<22,te=1<<23,E=Symbol(`$state`),ne=Symbol(`component`),re=Symbol(`legacy props`),ie=Symbol(``),ae=Symbol(`attributes`),oe=Symbol(`class`),se=Symbol(`style`),ce=Symbol(`text`),le=Symbol(`form reset`),ue=new class extends Error{name=`StaleReactionError`;message="The reaction that called `getAbortSignal()` was re-run or destroyed"},de=!!globalThis.document?.contentType&&globalThis.document.contentType.includes(`xml`),fe={},D=Symbol(`uninitialized`),pe=`http://www.w3.org/1999/xhtml`,me=`http://www.w3.org/2000/svg`,he=`http://www.w3.org/1998/Math/MathML`;function ge(){console.warn(`https://svelte.dev/e/derived_inert`)}function _e(e){console.warn(`https://svelte.dev/e/hydration_mismatch`)}function ve(){console.warn(`https://svelte.dev/e/select_multiple_invalid_value`)}function ye(){console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`)}var O=!1;function be(e){O=e}var k;function A(e){if(e===null)throw _e(),fe;return k=e}function xe(){return A($t(k))}function j(e){if(O){if($t(k)!==null)throw _e(),fe;k=e}}function Se(e=1){if(O){for(var t=e,n=k;t--;)n=$t(n);k=n}}function Ce(e=!0){for(var t=0,n=k;;){if(n.nodeType===8){var r=n.data;if(r===`]`){if(t===0)return n;--t}else(r===`[`||r===`[!`||r[0]===`[`&&!isNaN(Number(r.slice(1))))&&(t+=1)}var i=$t(n);e&&n.remove(),n=i}}function we(e){if(!e||e.nodeType!==8)throw _e(),fe;return e.data}function Te(e){return e===this.v}function Ee(e,t){return e==e?e!==t||typeof e==`object`&&!!e||typeof e==`function`:t==t}function De(e){return!Ee(e,this.v)}function Oe(e){throw Error(`https://svelte.dev/e/lifecycle_outside_component`)}function ke(){throw Error(`https://svelte.dev/e/async_derived_orphan`)}function Ae(e,t,n){throw Error(`https://svelte.dev/e/each_key_duplicate`)}function je(e){throw Error(`https://svelte.dev/e/effect_in_teardown`)}function Me(){throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function Ne(e){throw Error(`https://svelte.dev/e/effect_orphan`)}function Pe(){throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function Fe(e){throw Error(`https://svelte.dev/e/props_invalid_value`)}function Ie(){throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function Le(){throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function Re(){throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function ze(){throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}var Be=null;function Ve(e){Be=e}function He(e,t=!1,n){Be={p:Be,i:!1,c:null,e:null,s:e,x:null,r:U,l:null}}function Ue(e){var t=Be,n=t.e;if(n!==null){t.e=null;for(var r of n)pn(r)}return e!==void 0&&(t.x=e),t.i=!0,Be=t.p,We(e)}function We(e={}){return i(e,ne,{value:!0}),e}function Ge(){return!0}var Ke=[];function qe(){var e=Ke;Ke=[],f(e)}function Je(e){if(Ke.length===0&&!yt){var t=Ke;queueMicrotask(()=>{t===Ke&&qe()})}Ke.push(e)}var Ye=~(h|g|m);function M(e,t){e.f=e.f&Ye|t}function Xe(e){e.f&512||e.deps===null?M(e,m):M(e,g)}function Ze(e,t){e.f&2048?t.set(e,h):e.f&4096&&t.get(e)!==2048&&t.set(e,g),M(e,m)}function Qe(e){O&&Qt(e)!==null&&en(e)}var $e=!1;function et(){$e||($e=!0,document.addEventListener(`reset`,e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(let t of e.target.elements)t[le]?.()})},{capture:!0}))}function tt(e){var t=H,n=U;Fn(null),In(null);try{return e()}finally{Fn(t),In(n)}}function nt(e,t,n,r){let i=Ge()?ot:lt;var a=e.filter(e=>!e.settled),o=t.map(i);if(n.length===0&&a.length===0){r(o);return}var s=U,c=rt(),l=a.length===1?a[0].promise:a.length>1?Promise.all(a.map(e=>e.promise)):null;function u(e){if(!(s.f&16384)){c();try{r([...o,...e])}catch(e){on(e,s)}it()}}var d=at();if(n.length===0){l.then(()=>u([])).finally(d);return}function f(){Promise.all(n.map(e=>ct(e))).then(u).catch(e=>on(e,s)).finally(d)}l?l.then(()=>{s.f&16384?d():(c(),f(),it())}):f()}function rt(){var e=U,t=H,n=Be,r=P;return function(i=!0){In(e),Fn(t),Ve(n),i&&!(e.f&16384)&&(r?.activate(),r?.apply())}}function it(e=!0){In(null),Fn(null),Ve(null),e&&P?.deactivate()}function at(){var e=U,t=e.b,n=P,r=!!t?.is_rendered();return t?.update_pending_count(1,n),n.increment(r,e),()=>{t?.update_pending_count(-1,n),n.decrement(r,e)}}function ot(e){var t=2|h;return U!==null&&(U.f|=S),{ctx:Be,deps:null,effects:null,equals:Te,f:t,fn:e,reactions:null,rv:0,v:D,wv:0,parent:U,ac:null}}var st=Symbol(`obsolete`);function ct(e,t,n){let r=U;r===null&&ke();var i=void 0,a=Ft(D),o=!H,s=new Set;return gn(()=>{var t=U,n=p();i=n.promise;try{Promise.resolve(e()).then(n.resolve,e=>{e!==ue&&n.reject(e)}).finally(it)}catch(e){n.reject(e),it()}var c=P;if(o){if(t.f&32768)var l=at();if(r.b?.is_rendered())c.async_deriveds.get(t)?.reject(st);else for(let e of s.values())e.reject(st);s.add(n),c.async_deriveds.set(t,n)}let u=(e,t=void 0)=>{l?.(),s.delete(n),t!==st&&(c.activate(),t?(a.f|=te,zt(a,t)):(a.f&8388608&&(a.f^=te),zt(a,e)),c.deactivate())};n.promise.then(u,e=>u(null,e||`unknown`))}),dn(()=>{for(let e of s)e.reject(st)}),new Promise(e=>{function t(n){function r(){n===i?e(a):t(i)}n.then(r,r)}t(i)})}function N(e){let t=ot(e);return Rn(t),t}function lt(e){let t=ot(e);return t.equals=De,t}function ut(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n<t.length;n+=1)Cn(t[n])}}function dt(e){var t,n=U,r=e.parent;if(!Mn&&r!==null&&e.v!==D&&r.f&24576)return ge(),e.v;In(r);try{ut(e),t=Xn(e)}finally{In(n)}return t}function ft(e){var t=dt(e);!e.equals(t)&&(e.wv=qn(),(!P?.is_fork||e.deps===null)&&(P===null?e.v=t:(P.capture(e,t,!0),gt?.capture(e,t,!0)),e.deps===null))?M(e,m):Mn||(_t===null?Xe(e):(un()||P?.is_fork)&&_t.set(e,t))}function pt(e){if(e.effects!==null)for(let t of e.effects)(t.teardown||t.ac)&&(t.teardown?.(),t.ac!==null&&tt(()=>{t.ac.abort(ue),t.ac=null}),t.fn!==null&&(t.teardown=d),$n(t,0),xn(t))}function mt(e){if(e.effects!==null)for(let t of e.effects)t.teardown&&t.fn!==null&&er(t)}var ht=null,P=null,gt=null,_t=null,vt=null,yt=!1,bt=!1,xt=null,St=null,Ct=0,wt=1,Tt=class e{id=wt++;started=!1;linked=!0;prev=null;next=null;async_deriveds=new Map;current=new Map;previous=new Map;#e=new Set;#t=new Set;#n=0;#r=new Map;#i=null;#a=[];#o=[];#s=new Map;#c=new Map;#l=new Set;is_fork=!1;#u=!1;constructor(){ht===null?ht=this:(ht.next=this,this.prev=ht),ht=this}#d(){if(this.is_fork)return!0;for(let e of this.#r.keys())if(!this.#f(e))return!0;return!1}#f(e){for(var t=e;t!==null;t=t.parent)if(this.#c.has(t))return!0;return!1}skip_effect(e){this.#c.has(e)||this.#c.set(e,{d:[],m:[]}),this.#l.delete(e)}unskip_effect(e,t=e=>this.schedule(e)){var n=this.#c.get(e);if(n){this.#c.delete(e);for(var r of n.d)M(r,h),t(r);for(r of n.m)M(r,g),t(r)}this.#l.add(e)}#p(){var e=[];for(let i of this.#a)if(!(i.f&16384||!(i.f&6144))){for(var t=i,n=!1;t.parent!==null;){t=t.parent;var r=t.f;if(r&96){if(!(r&1024)){n=!0;break}t.f^=m}}n||e.push(t)}return this.#a=[],e}#m(){this.started=!0;for(let[e,t]of this.#s)M(e,t),this.schedule(e);this.apply();for(var t=xt=[],n=[],r=St=[];this.#a.length>0;){Ct++>1e3&&(this.#b(),Et());for(let e of this.#p())try{this.#h(e,t,n)}catch(t){throw jt(e),this.#d()||this.discard(),t}}if(P=null,r.length>0){var i=e.ensure();for(let e of r)i.schedule(e)}if(xt=null,St=null,this.#d()){this.#y(n),this.#y(t);for(let[e,t]of this.#c)At(e,t);r.length>0&&P.#m();return}let a=this.#g();if(a)this.#y(n),this.#y(t),a.#v(this);else{this.#s.clear();for(let e of this.#e)e(this);this.#e.clear(),gt=this,Ot(n),Ot(t),gt=null,this.#i?.resolve();var o=P;this.#n===0&&(this.#a.length===0||o!==null)&&this.#b(),o!==null&&(Nt.clear(),o.#m())}}#h(e,t,n){e.f^=m;for(var r=e.first;r!==null;){var i=r.f,a=!!(i&96);if(!(a&&i&1024||i&8192||this.#c.has(r))&&r.fn!==null){a?r.f^=m:i&4?t.push(r):Jn(r)&&(i&16&&this.add_dirty_reaction(r,g),er(r));var o=r.first;if(o!==null){r=o;continue}}for(;r!==null;){var s=r.next;if(s!==null){r=s;break}r=r.parent}}}#g(){for(var e=this.prev;e!==null;e=e.prev)if(!e.is_fork&&this.#_(e))return e;return null}#_(e){for(let[t,[,n]]of this.current)if(!n&&e.current.has(t))return!0;return!1}#v(e){for(let[t,n]of e.current)!this.previous.has(t)&&e.previous.has(t)&&this.previous.set(t,e.previous.get(t)),this.current.set(t,n);for(let[t,n]of e.async_deriveds){let e=this.async_deriveds.get(t);e&&n.promise.then(e.resolve).catch(e.reject)}e.async_deriveds.clear(),this.transfer_reactions(e.#s);let t=e=>{var n=e.reactions;if(n!==null&&!(e.f&2&&!(e.f&6144)))for(let e of n){var r=e.f;if(r&2)t(e);else{var i=e;r&4194320&&!this.async_deriveds.has(i)&&(this.#s.delete(i),M(i,h),this.schedule(i))}}};for(let e of this.current.keys())t(e);this.oncommit(()=>e.discard()),e.#b(),P=this,this.#m()}#y(e){for(var t=0;t<e.length;t+=1)Ze(e[t],this.#s)}capture(e,t,n=!1){e.v!==D&&!this.previous.has(e)&&this.previous.set(e,e.v),e.f&8388608||(this.current.set(e,[t,n]),_t?.set(e,t)),this.is_fork||(e.v=t)}activate(){P=this}deactivate(){P=null,_t=null}flush(){try{bt=!0,P=this,this.#m()}finally{Ct=0,vt=null,xt=null,St=null,bt=!1,P=null,_t=null,Nt.clear()}}discard(){for(let e of this.#t)e(this);this.#t.clear();for(let e of this.async_deriveds.values())e.reject(st);this.#b(),this.#i?.resolve()}register_created_effect(e){this.#o.push(e)}increment(e,t){if(this.#n+=1,e){let e=this.#r.get(t)??0;this.#r.set(t,e+1)}}decrement(e,t){if(--this.#n,e){let e=this.#r.get(t)??0;e===1?this.#r.delete(t):this.#r.set(t,e-1)}this.#u||(this.#u=!0,Je(()=>{this.#u=!1,this.linked&&this.flush()}))}transfer_reactions(e){for(let[t,n]of e)this.add_dirty_reaction(t,n);e.clear()}add_dirty_reaction(e,t){(t===2048||this.#s.get(e)!==2048)&&this.#s.set(e,t)}oncommit(e){this.#e.add(e)}ondiscard(e){this.#t.add(e)}settled(){return(this.#i??=p()).promise}static ensure(){if(P===null){let t=P=new e;!bt&&Je(()=>{t.started||t.flush()})}return P}apply(){_t=null}schedule(e){vt=e,e.b?.is_pending&&e.f&16777228&&!(e.f&32768)?e.b.defer_effect(e):this.#a.push(e)}#b(){if(this.linked){var e=this.prev,t=this.next;e===null||(e.next=t),t===null?ht=e:t.prev=e,this.linked=!1}}};function Et(){try{Pe()}catch(e){on(e,vt)}}var Dt=null;function Ot(e){var t=e.length;if(t!==0){for(var n=0;n<t;){var r=e[n++];if(!(r.f&24576)&&Jn(r)&&(Dt=new Set,er(r),r.deps===null&&r.first===null&&r.nodes===null&&r.teardown===null&&r.ac===null&&Tn(r),Dt?.size>0)){Nt.clear();for(let e of Dt){if(e.f&24576)continue;let t=[e],n=e.parent;for(;n!==null;)Dt.has(n)&&(Dt.delete(n),t.push(n)),n=n.parent;for(let e=t.length-1;e>=0;e--){let n=t[e];n.f&24576||er(n)}}Dt.clear()}}Dt=null}}function kt(e){P.schedule(e)}function At(e,t){if(!(e.f&32&&e.f&1024)){e.f&2048?t.d.push(e):e.f&4096&&t.m.push(e),M(e,m);for(var n=e.first;n!==null;)At(n,t),n=n.next}}function jt(e){M(e,m);for(var t=e.first;t!==null;)jt(t),t=t.next}var Mt=new Set,Nt=new Map,Pt=!1;function Ft(e,t){return{f:0,v:e,reactions:null,equals:Te,rv:0,wv:0}}function F(e,t){let n=Ft(e,t);return Rn(n),n}function It(e,t=!1,n=!0){let r=Ft(e);return t||(r.equals=De),r}function I(e,t,n=!1){return H!==null&&(!Pn||H.f&131072)&&Ge()&&H.f&4325394&&(Ln===null||!Ln.has(e))&&Re(),zt(e,n?Ut(t):t,St)}var Lt=null,Rt=0;function zt(e,t,n=null){if(!e.equals(t)){Mn?Nt.set(e,t):Nt.has(e)||Nt.set(e,e.v);var r=Tt.ensure();if(r.capture(e,t),e.f&2){let t=e;e.f&2048&&dt(t),_t===null&&Xe(t)}e.wv=qn(),Lt=null,Rt=0,Ht(e,h,n),Lt=null,Ge()&&U!==null&&U.f&1024&&!(U.f&96)&&(Vn===null?Hn([e]):Vn.push(e)),!r.is_fork&&Mt.size>0&&!Pt&&Bt()}return t}function Bt(){Pt=!1;for(let e of Mt){e.f&1024&&M(e,g);let t;try{t=Jn(e)}catch{t=!0}t&&er(e)}Mt.clear()}function Vt(e){I(e,e.v+1)}function Ht(e,t,n){var r=e.reactions;if(r!==null){var i=Ge(),a=r.length;if(Rt+=a,Rt>1e5&&Lt===null&&(Lt=new Set),Lt!==null){if(Lt.has(e))return;Lt.add(e)}for(var o=0;o<a;o++){var s=r[o],c=s.f;if(i||s!==U){var l=(c&h)===0;if(l&&M(s,t),c&131072)Mt.add(s);else if(c&2){var u=s;_t?.delete(u),Ht(u,g,n)}else if(l){var d=s;c&16&&Dt!==null&&Dt.add(d),n===null?kt(d):n.push(d)}}}}}function Ut(t){if(typeof t!=`object`||!t||E in t||ne in t)return t;let n=l(t);if(n!==s&&n!==c)return t;var r=new Map,i=e(t),o=F(0),u=null,d=Gn,f=e=>{if(Gn===d)return e();var t=H,n=Gn;Fn(null),Kn(d);var r=e();return Fn(t),Kn(n),r};return i&&r.set(`length`,F(t.length,u)),new Proxy(t,{defineProperty(e,t,n){`value`in n&&n.configurable!==!1&&n.enumerable!==!1&&n.writable!==!1||Ie();var i=r.get(t);return i===void 0?f(()=>{var e=F(n.value,u);return r.set(t,e),e}):I(i,n.value,!0),!0},deleteProperty(e,t){var n=r.get(t);if(n===void 0){if(t in e){let e=f(()=>F(D,u));r.set(t,e),Vt(o)}}else I(n,D),Vt(o);return!0},get(e,n,i){if(n===E)return t;var o=r.get(n),s=n in e;if(o===void 0&&(!s||a(e,n)?.writable)&&(o=f(()=>F(Ut(s?e[n]:D),u)),r.set(n,o)),o!==void 0){var c=W(o);return c===D?void 0:c}return Reflect.get(e,n,i)},getOwnPropertyDescriptor(e,t){this.has?.(e,t);var n=Reflect.getOwnPropertyDescriptor(e,t),i=r.get(t);if(i!==void 0){var a=W(i);if(a===D)return;if(n&&`value`in n)n.value=a;else return{enumerable:!0,configurable:!0,value:a,writable:!0}}return n},has(e,t){if(t===E)return!0;var n=r.get(t),i=n!==void 0&&n.v!==D||Reflect.has(e,t);return(n!==void 0||(U!==null||H!==null)&&(!i||a(e,t)?.writable))&&(n===void 0&&(n=f(()=>F(i?Ut(e[t]):D,u)),r.set(t,n)),W(n)===D)?!1:i},set(e,t,n,s){var c=r.get(t),l=t in e;if(i&&t===`length`)for(var d=n;d<c.v;d+=1){var p=r.get(d+``);p===void 0?d in e&&(p=f(()=>F(D,u)),r.set(d+``,p)):I(p,D)}if(c===void 0)(!l||a(e,t)?.writable)&&(c=f(()=>F(void 0,u)),I(c,Ut(n)),r.set(t,c));else{l=c.v!==D;var m=f(()=>Ut(n));I(c,m)}var h=Reflect.getOwnPropertyDescriptor(e,t);if(h?.set&&h.set.call(s,n),!l){if(i&&typeof t==`string`){var g=r.get(`length`),_=Number(t);Number.isInteger(_)&&_>=g.v&&I(g,_+1)}Vt(o)}return!0},ownKeys(e){W(o);var t=Reflect.ownKeys(e).filter(e=>{var t=r.get(e);return t===void 0||t.v!==D});for(var[n,i]of r)i.v!==D&&!(n in e)&&t.push(n);return t},setPrototypeOf(){Le()}})}function Wt(e){try{if(typeof e==`object`&&e&&E in e)return e[E]}catch{}return e}function Gt(e,t){return Object.is(Wt(e),Wt(t))}var Kt,qt,Jt,Yt;function Xt(){if(Kt===void 0){Kt=window,qt=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;Jt=a(t,`firstChild`).get,Yt=a(t,`nextSibling`).get,u(e)&&(e[oe]=void 0,e[ae]=null,e[se]=void 0,e.__e=void 0),u(n)&&(n[ce]=void 0)}}function Zt(e=``){return document.createTextNode(e)}function Qt(e){return Jt.call(e)}function $t(e){return Yt.call(e)}function L(e,t){if(!O)return Qt(e);var n=Qt(k);if(n===null)n=k.appendChild(Zt());else if(t&&n.nodeType!==3){var r=Zt();return n?.before(r),A(r),r}return t&&rn(n),A(n),n}function R(e,t=!1){if(!O){var n=Qt(e);return n instanceof Comment&&n.data===``?$t(n):n}if(t){if(k?.nodeType!==3){var r=Zt();return k?.before(r),A(r),r}rn(k)}return k}function z(e,t=!1){if(!O)return Qt(e);var n=L(e,t);return j(e),n}function B(e,t=1,n=!1){let r=O?k:e;for(var i;t--;)i=r,r=$t(r);if(!O)return r;if(n){if(r?.nodeType!==3){var a=Zt();return r===null?i?.after(a):r.before(a),A(a),a}rn(r)}return A(r),r}function en(e){e.textContent=``}function tn(){return!1}function nn(e,t,n){return t==null||t===`http://www.w3.org/1999/xhtml`?n?document.createElement(e,{is:n}):document.createElement(e):n?document.createElementNS(t,e,{is:n}):document.createElementNS(t,e)}function rn(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===3;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function an(e){var t=U;if(t===null)return H.f|=te,e;if(!(t.f&32768)&&!(t.f&4))throw e;on(e,t)}function on(e,t){if(e===fe)throw e;if(!(t!==null&&t.f&16384)){for(;t!==null;){if(t.f&128&&!(t.f&33570816)){if(!(t.f&32768))throw e;try{t.b.error(e);return}catch(t){e=t}}t=t.parent}throw e}}function sn(e){U===null&&(H===null&&Ne(e),Me()),Mn&&je(e)}function cn(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function ln(e,t){var n=U;n!==null&&n.f&8192&&(e|=_);var r={ctx:Be,deps:null,nodes:null,f:e|h|512,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};P?.register_created_effect(r);var i=r;if(e&4)xt===null?Tt.ensure().schedule(r):xt.push(r);else if(t!==null){try{er(r)}catch(e){throw Cn(r),e}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&!(i.f&524288)&&(i=i.first,e&16&&e&65536&&i!==null&&(i.f|=x))}if(i!==null&&(i.parent=n,n!==null&&cn(i,n),H!==null&&H.f&2&&!(e&64))){var a=H;(a.effects??=[]).push(i)}return r}function un(){return H!==null&&!Pn}function dn(e){let t=ln(8,null);return M(t,m),t.teardown=e,t}function fn(e){sn(`$effect`);var t=U.f;if(!H&&t&32&&Be!==null&&!Be.i){var n=Be;(n.e??=[]).push(e)}else return pn(e)}function pn(e){return ln(4|ee,e)}function mn(e){Tt.ensure();let t=ln(64|S,e);return(e={})=>new Promise(n=>{e.outro?En(t,()=>{Cn(t),n(void 0)}):(Cn(t),n(void 0))})}function hn(e){return ln(4,e)}function gn(e){return ln(T|S,e)}function _n(e,t=0){return ln(8|t,e)}function V(e,t=[],n=[],r=[]){nt(r,t,n,t=>{ln(8,()=>{e(...t.map(W))})})}function vn(e,t=0){return ln(16|t,e)}function yn(e){return ln(32|S,e)}function bn(e){var t=e.teardown;if(t!==null){let n=Mn,r=H;Nn(!0),Fn(null);try{t.call(null)}catch(t){on(t,e.parent)}finally{Nn(n),Fn(r)}}}function xn(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){let e=n.ac;e!==null&&tt(()=>{e.abort(ue)});var r=n.next;n.f&64?n.parent=null:Cn(n,t),n=r}}function Sn(e){for(var t=e.first;t!==null;){var n=t.next;t.f&32||Cn(t),t=n}}function Cn(e,t=!0){var n=!1;(t||e.f&262144)&&e.nodes!==null&&e.nodes.end!==null&&(wn(e.nodes.start,e.nodes.end),n=!0),e.f|=b,xn(e,t&&!n),$n(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)e.stop();bn(e),e.f^=b,e.f|=v;var i=e.parent;i!==null&&i.first!==null&&Tn(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function wn(e,t){for(;e!==null;){var n=e===t?null:$t(e);e.remove(),e=n}}function Tn(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function En(e,t,n=!0){var r=[];e.f|=256,Dn(e,r,!0);var i=()=>{n&&Cn(e),t&&t()},a=r.length;if(a>0){var o=()=>--a||i();for(var s of r)s.out(o)}else i()}function Dn(e,t,n){if(!(e.f&8192)){e.f^=_;var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)(e.is_global||n)&&t.push(e);for(var i=e.first;i!==null;){var a=i.next;if(!(i.f&64)){var o=!!(i.f&65536)||!!(i.f&32)&&!!(e.f&16);Dn(i,t,o?n:!1)}i=a}}}function On(e){e.f&=-257,kn(e,!0)}function kn(e,t){if(!(e.f&256)&&e.f&8192){e.f^=_,e.f&1024||(M(e,h),Tt.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,i=!!(n.f&65536)||!!(n.f&32);kn(n,i?t:!1),n=r}var a=e.nodes&&e.nodes.t;if(a!==null)for(let e of a)(e.is_global||t)&&e.in()}}function An(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var i=n===r?null:$t(n);t.append(n),n=i}}var jn=null,Mn=!1;function Nn(e){Mn=e}var H=null,Pn=!1;function Fn(e){H=e}var U=null;function In(e){U=e}var Ln=null;function Rn(e){H!==null&&(H.f&2097152||H.f&2)&&(Ln??=new Set).add(e)}var zn=null,Bn=0,Vn=null;function Hn(e){Vn=e}var Un=1,Wn=0,Gn=Wn;function Kn(e){Gn=e}function qn(){return++Un}function Jn(e){var t=e.f;if(t&2048)return!0;if(t&4096){for(var n=e.deps,r=n.length,i=0;i<r;i++){var a=n[i];if(Jn(a)&&ft(a),a.wv>e.wv)return!0}t&512&&_t===null&&M(e,m)}return!1}function Yn(e,t,n=!0){var r=e.reactions;if(r!==null&&!(Ln!==null&&Ln.has(e)))for(var i=0;i<r.length;i++){var a=r[i];a.f&2?Yn(a,t,!1):t===a&&(n?M(a,h):a.f&1024&&M(a,g),kt(a))}}function Xn(e){var t=zn,n=Bn,r=Vn,i=H,a=Ln,o=Be,s=Pn,c=Gn,l=e.f;zn=null,Bn=0,Vn=null,H=l&96?null:e,Ln=null,Ve(e.ctx),Pn=!1,Gn=++Wn,e.ac!==null&&(tt(()=>{e.ac.abort(ue)}),e.ac=null);try{e.f|=w;var u=e.fn,d=u();e.f|=y;var f=Zn(e);if(Ge()&&Vn!==null&&!Pn&&f!==null&&!(e.f&6146))for(var p=0;p<Vn.length;p++)Yn(Vn[p],e);if(i!==null&&i!==e){if(Wn++,i.deps!==null)for(let e=0;e<n;e+=1)i.deps[e].rv=Wn;if(t!==null)for(let e of t)e.rv=Wn;Vn!==null&&(r===null?r=Vn:r.push(...Vn))}return e.f&8388608&&(e.f^=te),d}catch(t){return Zn(e),an(t)}finally{e.f^=w,zn=t,Bn=n,Vn=r,H=i,Ln=a,Ve(o),Pn=s,Gn=c}}function Zn(e){var t=e.deps,n=P?.is_fork;if(zn!==null){var r;if(n||$n(e,Bn),t!==null&&Bn>0)for(t.length=Bn+zn.length,r=0;r<zn.length;r++)t[Bn+r]=zn[r];else e.deps=t=zn;if(un()&&e.f&512)for(r=Bn;r<t.length;r++)(t[r].reactions??=[]).push(e)}else!n&&t!==null&&Bn<t.length&&($n(e,Bn),t.length=Bn);return t}function Qn(e,r){let i=r.reactions;if(i!==null){var a=t.call(i,e);if(a!==-1){var o=i.length-1;o===0?i=r.reactions=null:(i[a]=i[o],i.pop())}}if(i===null&&r.f&2&&(zn===null||!n.call(zn,r))){var s=r;s.f&512&&(s.f^=512),s.v!==D&&Xe(s),s.ac!==null&&tt(()=>{s.ac.abort(ue),s.ac=null,M(s,h)}),pt(s),$n(s,0)}}function $n(e,t){var n=e.deps;if(n!==null)for(var r=t;r<n.length;r++)Qn(e,n[r])}function er(e){var t=e.f;if(!(t&16384)){M(e,m);var n=U;U=e;try{t&16777232?Sn(e):xn(e),bn(e);var r=Xn(e);e.teardown=typeof r==`function`?r:null,e.wv=Un}finally{U=n}}}function W(e){var t=!!(e.f&2);if(jn?.add(e),H!==null&&!Pn&&!(U!==null&&U.f&16384)&&(Ln===null||!Ln.has(e))){var r=H.deps;if(H.f&2097152)e.rv<Wn&&(e.rv=Wn,zn===null&&r!==null&&r[Bn]===e?Bn++:zn===null?zn=[e]:zn.push(e));else{H.deps??=[],n.call(H.deps,e)||H.deps.push(e);var i=e.reactions;i===null?e.reactions=[H]:n.call(i,H)||i.push(H)}}if(Mn&&Nt.has(e))return Nt.get(e);if(t){var a=e;if(Mn){var o=a.v;return(!(a.f&1024)&&a.reactions!==null||nr(a))&&(o=dt(a)),Nt.set(a,o),o}var s=!(a.f&512)&&!Pn&&H!==null&&!!(H.f&512),c=(a.f&y)===0;Jn(a)&&(s&&(a.f|=512),ft(a)),s&&!c&&(mt(a),tr(a))}if(_t?.has(e))return _t.get(e);if(e.f&8388608)throw e.v;return e.v}function tr(e){if(e.f|=512,e.deps!==null)for(let r of e.deps){var t=r.reactions;t===null?r.reactions=[e]:n.call(t,e)||t.push(e),r.f&2&&!(r.f&512)&&(mt(r),tr(r))}}function nr(e){if(e.v===D)return!0;if(e.deps===null)return!1;for(let t of e.deps)if(Nt.has(t)||t.f&2&&nr(t))return!0;return!1}function rr(e){var t=Pn;try{return Pn=!0,e()}finally{Pn=t}}[...`allowfullscreen.async.autofocus.autoplay.checked.controls.default.disabled.formnovalidate.indeterminate.inert.ismap.loop.multiple.muted.nomodule.novalidate.open.playsinline.readonly.required.reversed.seamless.selected.webkitdirectory.defer.disablepictureinpicture.disableremoteplayback`.split(`.`)];var ir=[`touchstart`,`touchmove`];function ar(e){return ir.includes(e)}var or=Symbol(`events`),sr=new Set,cr=new Set;function lr(e,t,n,r={}){function i(e){if(r.capture||mr.call(t,e),!e.cancelBubble)return tt(()=>n?.call(this,e))}return e.startsWith(`pointer`)||e.startsWith(`touch`)||e===`wheel`?(i.__removed=!1,Je(()=>{i.__removed||t.addEventListener(e,i,r)})):t.addEventListener(e,i,r),i}function ur(e,t,n,r,i){var a={capture:r,passive:i},o=lr(e,t,n,a);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&dn(()=>{o.__removed=!0,t.removeEventListener(e,o,a)})}function G(e,t,n){(t[or]??={})[e]=n}function dr(e){for(var t=0;t<e.length;t++)sr.add(e[t]);for(var n of cr)n(e)}var fr=null,pr=!1;function mr(e){var t=this,n=t.ownerDocument,r=e.type,a=e.composedPath?.()||[],o=a[0]||e.target;fr=e,pr||(pr=!0,setTimeout(()=>{pr=!1,fr=null}));var s=0,c=fr===e&&e[or];if(c){var l=a.indexOf(c);if(l!==-1&&(t===document||t===window)){e[or]=t;return}var u=a.indexOf(t);if(u===-1)return;l<=u&&(s=l)}if(o=a[s]||e.target,o!==t){i(e,`currentTarget`,{configurable:!0,get(){return o||n}});var d=H,f=U;Fn(null),In(null);try{for(var p,m=[];o!==null&&o!==t;){try{var h=o[or]?.[r];h==null||o.disabled&&e.target!==o||h.call(o,e)}catch(e){p?m.push(e):p=e}if(e.cancelBubble)break;s++,o=s<a.length?a[s]:null}if(p){for(let e of m)queueMicrotask(()=>{throw e});throw p}}finally{e[or]=t,delete e.currentTarget,Fn(d),In(f)}}}var hr=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy(`svelte-trusted-html`,{createHTML:e=>e});function gr(e){return hr?.createHTML(e)??e}function _r(e){var t=nn(`template`);return t.innerHTML=gr(e.replaceAll(`<!>`,`<!---->`)),t.content}function vr(e,t){var n=U;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function K(e,t){var n=!!(t&1),r=!!(t&2),i,a=!e.startsWith(`<!>`);return()=>{if(O)return vr(k,null),k;i===void 0&&(i=_r(a?e:`<!>`+e),n||(i=Qt(i)));var t=r||qt?document.importNode(i,!0):i.cloneNode(!0);if(n){var o=Qt(t),s=t.lastChild;vr(o,s)}else vr(t,t);return t}}function yr(e=``){if(!O){var t=Zt(e+``);return vr(t,t),t}var n=k;return n.nodeType===3?rn(n):(n.before(n=Zt()),A(n)),vr(n,n),n}function br(){if(O)return vr(k,null),k;var e=document.createDocumentFragment(),t=document.createComment(``),n=Zt();return e.append(t,n),vr(t,n),e}function q(e,t){if(O){var n=U;n.f&32768&&n.nodes.end!==null||(n.nodes.end=k),xe()}else e!==null&&e.before(t)}function xr(e){let t=0,n=Ft(0),r;return()=>{un()&&(W(n),_n(()=>(t===0&&(r=rr(()=>e(()=>Vt(n)))),t+=1,()=>{Je(()=>{--t,t===0&&(r?.(),r=void 0,Vt(n))})})))}}var Sr=x|S;function Cr(e,t,n,r){new wr(e,t,n,r)}var wr=class{parent;is_pending=!1;transform_error;#e;#t=O?k:null;#n;#r;#i;#a=null;#o=null;#s=null;#c=null;#l=0;#u=0;#d=!1;#f=new Map;#p=null;#m=xr(()=>(this.#p=Ft(this.#l),()=>{this.#p=null}));constructor(e,t,n,r){this.#e=e,this.#n=t,this.#r=e=>{var t=U;t.b=this,t.f|=128,n(e)},this.parent=U.b,this.transform_error=r??this.parent?.transform_error??(e=>e),this.#i=vn(()=>{if(O){let e=we(this.#t);xe();let t=e===`[!`;if(e.startsWith(`[?`)){let t=JSON.parse(e.slice(2));this.#g(t)}else t?this.#y():this.#h()}else this.#b()},Sr),O&&(this.#e=k)}#h(){try{this.#a=yn(()=>this.#r(this.#e))}catch(e){this.error(e)}}#g(e){let t=this.#n.failed,{reset:n,invoke_onerror:r}=this.#_(e);Je(r),t&&(this.#s=yn(()=>{t(this.#e,()=>e,()=>n)}))}#_(e){var t=!1,n=!1;let r=()=>{this.#v()||(t?ye():(t=!0,n&&ze(),this.#s!==null&&En(this.#s,()=>{this.#s=null}),this.#S(()=>{this.#b()})))};return{reset:r,invoke_onerror:()=>{if(!this.#v())try{n=!0,this.#n.onerror?.(e,r),n=!1}catch(e){on(e,this.#i&&this.#i.parent)}}}}#v(){return(this.#i.f&(v|b))!==0}#y(){let e=this.#n.pending;e&&(this.is_pending=!0,this.#o=yn(()=>e(this.#e)),Je(()=>{if(!this.#v()){var e=this.#c=document.createDocumentFragment(),t=Zt(),n=!1;e.append(t),this.#a=this.#S(()=>{try{return yn(()=>this.#r(t))}catch(e){try{this.error(e),n=!0}catch(e){on(e,this.#i.parent)}return null}}),this.#a===null?(this.#c=null,n&&this.#x(P)):this.#u===0&&(this.#e.before(e),this.#c=null,En(this.#o,()=>{this.#o=null}),this.#x(P))}}))}#b(){try{if(this.is_pending=this.has_pending_snippet(),this.#u=0,this.#l=0,this.#a=yn(()=>{this.#r(this.#e)}),this.#u>0){var e=this.#c=document.createDocumentFragment();An(this.#a,e);let t=this.#n.pending;this.#o=yn(()=>t(this.#e))}else this.#x(P)}catch(e){this.error(e)}}#x(e){this.is_pending=!1,e.transfer_reactions(this.#f)}defer_effect(e){Ze(e,this.#f)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#n.pending}#S(e){var t=U,n=H,r=Be;In(this.#i),Fn(this.#i),Ve(this.#i.ctx);try{return Tt.ensure(),e()}finally{In(t),Fn(n),Ve(r)}}#C(e,t){this.has_pending_snippet()?(this.#u+=e,this.#u===0&&(this.#x(t),this.#o&&En(this.#o,()=>{this.#o=null}),this.#c&&=(this.#e.before(this.#c),null))):this.parent&&this.parent.#C(e,t)}update_pending_count(e,t){this.#C(e,t),this.#l+=e,!this.#p||this.#d||(this.#d=!0,Je(()=>{this.#d=!1,this.#p&&zt(this.#p,this.#l)}))}get_effect_pending(){return this.#m(),W(this.#p)}error(e){if(e===fe||!this.#n.onerror&&!this.#n.failed)throw e;P?.is_fork?(this.#a&&P.skip_effect(this.#a),this.#o&&P.skip_effect(this.#o),this.#s&&P.skip_effect(this.#s),P.oncommit(()=>{this.#v()||this.#w(e)})):this.#w(e)}#w(e){this.#a&&=(Cn(this.#a),null),this.#o&&=(Cn(this.#o),null),this.#s&&=(Cn(this.#s),null),O&&(A(this.#t),Se(),A(Ce()));let t=this.#n.failed,n=e=>{if(this.#v())return;let{reset:n,invoke_onerror:r}=this.#_(e);r(),t&&!this.#v()&&(this.#s=this.#S(()=>{try{return yn(()=>{var r=U;r.b=this,r.f|=128,t(this.#e,()=>e,()=>n)})}catch(e){return on(e,this.#i.parent),null}}))};Je(()=>{if(!this.#v()){var t;try{t=this.transform_error(e)}catch(e){on(e,this.#i&&this.#i.parent);return}typeof t==`object`&&t&&typeof t.then==`function`?t.then(n,e=>on(e,this.#i&&this.#i.parent)):n(t)}})}};function J(e,t){var n=t==null?``:typeof t==`object`?`${t}`:t;n!==(e[ce]??=e.nodeValue)&&(e[ce]=n,e.nodeValue=`${n}`)}function Tr(e,t){return Dr(e,t)}var Er=new Map;function Dr(e,{target:t,anchor:n,props:i={},events:a,context:o,intro:s=!0,transformError:c}){Xt();var l=void 0,u=mn(()=>{var s=n??t.appendChild(Zt());Cr(s,{pending:()=>{}},t=>{He({});var n=Be;if(o&&(n.c=o),a&&(i.$$events=a),O&&vr(t,null),l=e(t,i)||We(),O&&(U.nodes.end=k,k===null||k.nodeType!==8||k.data!==`]`))throw _e(),fe;Ue()},c);var u=new Set,d=e=>{for(var n=0;n<e.length;n++){var r=e[n];if(!u.has(r)){u.add(r);var i=ar(r);for(let e of[t,document]){var a=Er.get(e);a===void 0&&(a=new Map,Er.set(e,a));var o=a.get(r);o===void 0?(e.addEventListener(r,mr,{passive:i}),a.set(r,1)):a.set(r,o+1)}}}};return d(r(sr)),cr.add(d),()=>{for(var e of u)for(let n of[t,document]){var r=Er.get(n),i=r.get(e);--i==0?(n.removeEventListener(e,mr),r.delete(e),r.size===0&&Er.delete(n)):r.set(e,i)}cr.delete(d),s!==n&&s.parentNode?.removeChild(s)}});return Or.set(l,u),l}var Or=new WeakMap,kr=class{anchor;#e=new Map;#t=new Map;#n=new Map;#r=new Set;#i=!0;constructor(e,t=!0){this.anchor=e,this.#i=t}#a=e=>{if(this.#e.has(e)){var t=this.#e.get(e),n=this.#t.get(t);if(n)On(n),this.#r.delete(t);else{var r=this.#n.get(t);r&&(On(r.effect),this.#t.set(t,r.effect),this.#n.delete(t),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),n=r.effect)}for(let[t,n]of this.#e){if(this.#e.delete(t),t===e)break;let r=this.#n.get(n);r&&(Cn(r.effect),this.#n.delete(n))}for(let[e,r]of this.#t){if(e===t||this.#r.has(e))continue;let i=()=>{if(Array.from(this.#e.values()).includes(e)){var t=document.createDocumentFragment();An(r,t),t.append(Zt()),this.#n.set(e,{effect:r,fragment:t})}else Cn(r);this.#r.delete(e),this.#t.delete(e)};this.#i||!n?(this.#r.add(e),En(r,i,!1)):i()}}};#o=e=>{this.#e.delete(e);let t=Array.from(this.#e.values());for(let[e,n]of this.#n)t.includes(e)||(Cn(n.effect),this.#n.delete(e))};ensure(e,t){var n=P,r=tn();if(t&&!this.#t.has(e)&&!this.#n.has(e)){if(r){var i=document.createDocumentFragment(),a=Zt();i.append(a),this.#n.set(e,{effect:yn(()=>t(a)),fragment:i})}else this.#t.set(e,yn(()=>t(this.anchor)))}if(this.#e.set(n,e),r){for(let[t,r]of this.#t)t===e?n.unskip_effect(r):n.skip_effect(r);for(let[t,r]of this.#n)t===e?n.unskip_effect(r.effect):n.skip_effect(r.effect);n.oncommit(this.#a),n.ondiscard(this.#o)}else O&&(this.anchor=k),this.#a(n)}};function Y(e,t,n=!1){var r;O&&(r=k,xe());var i=new kr(e),a=n?x:0;function o(e,t){if(O){var n=we(r);if(e!==parseInt(n.substring(1))){var a=Ce();A(a),i.anchor=a,be(!1),i.ensure(e,t),be(!0);return}}i.ensure(e,t)}vn(()=>{var e=!1;t((t,n=0)=>{e=!0,o(n,t)}),e||o(-1,null)},a)}function Ar(e,t){return t}function jr(e,t,n){for(var i=[],a=t.length,o,s=t.length,c=0;c<a;c++){let n=t[c];En(n,()=>{if(o){if(o.pending.delete(n),o.done.add(n),o.pending.size===0){var t=e.outrogroups;Mr(e,r(o.done)),t.delete(o),t.size===0&&(e.outrogroups=null)}}else--s},!1)}if(s===0){var l=i.length===0&&n!==null&&e.pending.size===0;if(l){var u=n,d=u.parentNode;en(d),d.append(u),e.items.clear()}Mr(e,t,!l)}else o={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(o)}function Mr(e,t,n=!0){var r;if(e.pending.size>0){r=new Set;for(let t of e.pending.values())for(let n of t)r.add(e.items.get(n).e)}for(var i=0;i<t.length;i++){var a=t[i];r?.has(a)?(a.f|=C,An(a,document.createDocumentFragment())):Cn(t[i],n)}}var Nr;function X(t,n,i,a,o,s=null){var c=t,l=new Map;if(n&4){var u=t;c=O?A(Qt(u)):u.appendChild(Zt())}O&&xe();var d=null,f=lt(()=>{var t=i();return e(t)?t:t==null?[]:r(t)}),p=new Map,m=!0;function h(e){if(!(_.effect.f&16384)){_.pending.delete(e);var t=W(f);_.fallback=d,Fr(_,t,c,n,a),d!==null&&(t.length===0?d.f&33554432?(d.f^=C,Lr(d,null,c)):On(d):En(d,()=>{d=null}))}}function g(e){_.pending.delete(e)}var _={effect:vn(()=>{var e=W(f),t=e.length;let r=!1;O&&we(c)===`[!`!=(t===0)&&(c=Ce(),A(c),be(!1),r=!0);for(var u=new Set,_=P,v=tn(),y=0;y<t;y+=1){O&&k.nodeType===8&&k.data===`]`&&(c=k,r=!0,be(!1));var b=e[y],x=a(b,y),S=m?null:l.get(x);S?(S.v&&zt(S.v,b),S.i&&zt(S.i,y),v&&_.unskip_effect(S.e)):(S=Ir(l,m?c:Nr??=Zt(),b,x,y,o,n,i),m||(S.e.f|=C),l.set(x,S)),u.add(x)}if(t===0&&s&&!d&&(m?d=yn(()=>s(c)):(d=yn(()=>s(Nr??=Zt())),d.f|=C)),t>u.size&&Ae(``,``,``),O&&t>0&&A(Ce()),!m){if(p.set(_,u),v){for(let[e,t]of l)u.has(e)||_.skip_effect(t.e);_.oncommit(h),_.ondiscard(g)}else h(_)}r&&be(!0),W(f)}),flags:n,items:l,pending:p,outrogroups:null,fallback:d};m=!1,O&&(c=k)}function Pr(e){for(;e!==null&&!(e.f&32);)e=e.next;return e}function Fr(e,t,n,i,a){var o=!!(i&8),s=t.length,c=e.items,l=Pr(e.effect.first),u,d=null,f,p=[],m=[],h,g,_,v;if(o)for(v=0;v<s;v+=1)h=t[v],g=a(h,v),_=c.get(g).e,_.f&33554432||(_.nodes?.a?.measure(),(f??=new Set).add(_));for(v=0;v<s;v+=1){if(h=t[v],g=a(h,v),_=c.get(g).e,e.outrogroups!==null)for(let t of e.outrogroups)t.pending.delete(_),t.done.delete(_);if(_.f&8192&&(On(_),o&&(_.nodes?.a?.unfix(),(f??=new Set).delete(_))),_.f&33554432){if(_.f^=C,_===l)Lr(_,null,n);else{var y=d?d.next:l;_===e.effect.last&&(e.effect.last=_.prev),_.prev&&(_.prev.next=_.next),_.next&&(_.next.prev=_.prev),Rr(e,d,_),Rr(e,_,y),Lr(_,y,n),d=_,p=[],m=[],l=Pr(d.next);continue}}if(_!==l){if(u!==void 0&&u.has(_)){if(p.length<m.length){var b=m[0],x;d=b.prev;var S=p[0],ee=p[p.length-1];for(x=0;x<p.length;x+=1)Lr(p[x],b,n);for(x=0;x<m.length;x+=1)u.delete(m[x]);Rr(e,S.prev,ee.next),Rr(e,d,S),Rr(e,ee,b),l=b,d=ee,--v,p=[],m=[]}else u.delete(_),Lr(_,l,n),Rr(e,_.prev,_.next),Rr(e,_,d===null?e.effect.first:d.next),Rr(e,d,_),d=_;continue}for(p=[],m=[];l!==null&&l!==_;)(u??=new Set).add(l),m.push(l),l=Pr(l.next);if(l===null)continue}_.f&33554432||p.push(_),d=_,l=Pr(_.next)}if(e.outrogroups!==null){for(let t of e.outrogroups)t.pending.size===0&&(Mr(e,r(t.done)),e.outrogroups?.delete(t));e.outrogroups.size===0&&(e.outrogroups=null)}if(l!==null||u!==void 0){var w=[];if(u!==void 0)for(_ of u)_.f&8192||w.push(_);for(;l!==null;)!(l.f&8192)&&l!==e.fallback&&w.push(l),l=Pr(l.next);var T=w.length;if(T>0){var te=i&4&&s===0?n:null;if(o){for(v=0;v<T;v+=1)w[v].nodes?.a?.measure();for(v=0;v<T;v+=1)w[v].nodes?.a?.fix()}jr(e,w,te)}}o&&Je(()=>{if(f!==void 0)for(_ of f)_.nodes?.a?.apply()})}function Ir(e,t,n,r,i,a,o,s){var c=o&1?o&16?Ft(n):It(n,!1,!1):null,l=o&2?Ft(i):null;return{v:c,i:l,e:yn(()=>(a(t,c??n,l??i,s),()=>{e.delete(r)}))}}function Lr(e,t,n){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,a=t&&!(t.f&33554432)?t.nodes.start:n;r!==null;){var o=$t(r);if(a.before(r),r===i)return;r=o}}function Rr(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}function zr(e,t,n=!1,r=!1,i=!1,a=!1){var o=e,s=``;if(n){var c=e;O&&(o=A(Qt(c)))}V(()=>{var e=U;if(s===(s=t()??``))O&&xe();else if(n&&!O)e.nodes=null,c.innerHTML=s,s!==``&&vr(Qt(c),c.lastChild);else if(e.nodes!==null&&(wn(e.nodes.start,e.nodes.end),e.nodes=null),s!==``){if(O){for(var a=k.data,l=xe(),u=l;l!==null&&(l.nodeType!==8||l.data!==``);)u=l,l=$t(l);if(l===null)throw _e(),fe;vr(k,u),o=A(l)}else{var d=nn(r?`svg`:i?`math`:`template`,r?me:i?he:void 0);d.innerHTML=s;var f=r||i?d:d.content;if(vr(Qt(f),f.lastChild),r||i)for(;Qt(f);)o.before(Qt(f));else o.before(f)}}})}var Br=[...`
2
+ \r\f\xA0\v`];function Vr(e,t,n){var r=e==null?``:``+e;if(t&&(r=r?r+` `+t:t),n){for(var i of Object.keys(n))if(n[i])r=r?r+` `+i:i;else if(r.length)for(var a=i.length,o=0;(o=r.indexOf(i,o))>=0;){var s=o+a;(o===0||Br.includes(r[o-1]))&&(s===r.length||Br.includes(r[s]))?r=(o===0?``:r.substring(0,o))+r.substring(s+1):o=s}}return r===``?null:r}function Hr(e,t,n,r,i,a){var o=e[oe];if(O||o!==n||o===void 0){var s=Vr(n,r,a);O&&s===e.getAttribute(`class`)||(s==null?e.removeAttribute(`class`):t?e.className=s:e.setAttribute(`class`,s)),e[oe]=n}else if(a&&i!==a)for(var c in a){var l=!!a[c];(i==null||l!==!!i[c])&&e.classList.toggle(c,l)}return a}function Ur(e,t){t?e.hasAttribute(`selected`)||e.setAttribute(`selected`,``):e.removeAttribute(`selected`)}function Wr(t,n){var r=t.__defaultValue,i=t.multiple,a=i?r??[]:null;if(!i||e(a)){var o=t.selectedIndex,s=n&&i?new Set(t.selectedOptions):null;for(var c of t.options){var l=qr(c);Ur(c,i?a.includes(l):Gt(l,r))}if(n){if(s!==null)for(c of t.options){var u=s.has(c);c.selected!==u&&(c.selected=u)}else t.selectedIndex!==o&&(t.selectedIndex=o)}}}function Gr(t,n,r=!1){if(t.multiple){if(n==null)return;if(!e(n))return ve();for(var i of t.options)i.selected=n.includes(qr(i))}else{for(i of t.options)if(Gt(qr(i),n)){i.selected=!0;return}r&&n===void 0||(t.selectedIndex=-1)}}function Kr(e){var t=new MutationObserver(t=>{t.every(Jr)||(`__defaultValue`in e&&Wr(e,!1),`__value`in e&&Gr(e,e.__value))});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`value`]}),dn(()=>{t.disconnect()})}function qr(e){return`__value`in e?e.__value:e.value}function Jr(e){if(e.target.closest(`selectedcontent`)!==null)return!0;if(e.type===`childList`){var t=[...e.addedNodes,...e.removedNodes];return t.length>0&&t.every(e=>e.nodeName===`SELECTEDCONTENT`)}return!1}var Yr=Symbol(`is custom element`),Xr=Symbol(`is html`),Zr=de?`link`:`LINK`,Qr=de?`progress`:`PROGRESS`;function $r(e){if(O){var t=!1,n=()=>{if(!t){if(t=!0,e.hasAttribute(`value`)){var n=e.value;Z(e,`value`,null),e.value=n}if(e.hasAttribute(`checked`)){var r=e.checked;Z(e,`checked`,null),e.checked=r}}};e[le]=n,Je(n),et()}}function ei(e,t){var n=ni(e);n.value!==(n.value=t??void 0)&&(e.value!==t||t===0&&e.nodeName===Qr)&&(e.value=t??``)}function ti(e,t){var n=ni(e);n.checked!==(n.checked=t??void 0)&&(e.checked=t)}function Z(e,t,n,r){var i=ni(e);if(!(O&&(i[t]=e.getAttribute(t),t===`src`||t===`srcset`||t===`href`&&e.nodeName===Zr))){var a=i[t];a!==(i[t]=n)&&(t===`loading`&&(e[ie]=n),n==null?e.removeAttribute(t):typeof n!=`string`&&ii(e).has(t)?e[t]=n:(!O||typeof n!=`number`&&typeof n!=`boolean`||a!==String(n))&&e.setAttribute(t,n))}}function ni(e){return e[ae]??={[Yr]:e.nodeName.includes(`-`),[Xr]:e.namespaceURI===pe}}var ri=new Map;function ii(e){var t=e.getAttribute(`is`)||e.nodeName,n=ri.get(t);if(n)return n;ri.set(t,n=new Set);for(var r,i=e,a=Element.prototype;a!==i;){for(var s in r=o(i),r)r[s].set&&s!==`innerHTML`&&s!==`textContent`&&s!==`innerText`&&n.add(s);i=l(i)}return n}function ai(e,t){return e===t||e?.[E]===t}function oi(e=We(),t,n,r){var i=Be.r,a=U;return hn(()=>{var o,s;return _n(()=>{o=s,s=r?.()||[],rr(()=>{ai(n(...s),e)||(t(e,...s),o&&ai(n(...o),e)&&t(null,...o))})}),()=>{let r=a;for(;r!==i&&r.parent!==null&&r.parent.f&33554432;)r=r.parent;let o=()=>{s&&ai(n(...s),e)&&t(null,...s)},c=r.teardown;r.teardown=()=>{o(),c?.()}}}),e}var si=!1;function ci(e){var t=si;try{return si=!1,[e(),si]}finally{si=t}}function li(e,t,n,r){var i=!0,o=!!(n&8),s=!!(n&16),c=r,l=!0,u=void 0,d=()=>s&&i?(u??=ot(r),W(u)):(l&&(l=!1,c=s?rr(r):r),c);let f;if(o){var p=E in e||re in e;f=a(e,t)?.set??(p&&t in e?n=>e[t]=n:void 0)}var m,h=!1;o?[m,h]=ci(()=>e[t]):m=e[t],m===void 0&&r!==void 0&&(m=d(),f&&(i&&Fe(t),f(m)));var g=i?()=>{var n=e[t];return n===void 0?d():(l=!0,n)}:()=>{var n=e[t];return n!==void 0&&(c=void 0),n===void 0?c:n};if(i&&!(n&4))return g;if(f){var _=e.$$legacy;return(function(e,t){return arguments.length>0?((!i||!t||_||h)&&f(t?g():e),e):g()})}var v=!1,y=(n&1?ot:lt)(()=>(v=!1,g()));o&&W(y);var b=U;return(function(e,t){if(arguments.length>0){let n=t?W(y):i&&o?Ut(e):e;return I(y,n),v=!0,c!==void 0&&(c=n),e}return Mn&&v||b.f&16384?y.v:W(y)})}function ui(e){Be===null&&Oe(`onMount`),fn(()=>{let t=rr(e);if(typeof t==`function`)return t})}var di=`revdeck-locale`;function fi(){try{let e=localStorage.getItem(di);if(e===`ru`||e===`en`)return e}catch{}return(typeof navigator<`u`?navigator.language:`en`).toLowerCase().startsWith(`ru`)?`ru`:`en`}var pi=Ut({locale:fi()});function mi(e){pi.locale=e;try{localStorage.setItem(di,e)}catch{}typeof document<`u`&&(document.documentElement.lang=e)}function Q(e,t){return pi.locale===`ru`?e:t}function hi(e,t,n){if(pi.locale===`en`)return e===1?n[0]:n[1];let r=e%10,i=e%100;return r===1&&i!==11?t[0]:r>=2&&r<=4&&(i<12||i>14)?t[1]:t[2]}function gi(){return pi.locale===`ru`?`ru-RU`:`en-US`}typeof window<`u`&&((window.__svelte??={}).v??=new Set).add(`5`);var _i=class extends Error{status;constructor(e,t){super(e),this.status=t,this.name=`ApiError`}};async function vi(e,t={}){let n=await fetch(e,{method:t.method??(t.body===void 0?`GET`:`POST`),credentials:`same-origin`,headers:t.body===void 0?{}:{"content-type":`application/json`},body:t.body===void 0?void 0:JSON.stringify(t.body)}),r=await n.text(),i={};try{i=r?JSON.parse(r):{}}catch{throw new _i(r.slice(0,300)||`HTTP ${n.status}`,n.status)}if(!n.ok||i.ok===!1)throw new _i(String(i.error??`HTTP ${n.status}`),n.status);return i}var yi=e=>vi(`/api/state?review=${encodeURIComponent(e)}`),bi=()=>vi(`/api/reviews`),xi=(e,t)=>vi(`/api/diff?review=${encodeURIComponent(e)}&file=${encodeURIComponent(t)}`),Si=e=>vi(`/api/rules?review=${encodeURIComponent(e)}`),Ci=(e,t)=>vi(`/api/reactions?review=${encodeURIComponent(e)}&notes=${encodeURIComponent(t.join(`,`))}`),wi=(e,t,n)=>vi(`/api/reactions`,{body:{review:e,noteId:t,emoji:n}}),Ti=e=>vi(`/api/reviews/refresh`,{body:{review:e}}),Ei=(e,t,n)=>vi(`/api/drafts`,{body:{review:e,threadId:t,patch:n}}),Di=(e,t)=>vi(`/api/findings`,{body:{review:e,findings:t.map(e=>({id:e.id,level:e.level,file:e.file,line:e.line,title:e.title,body:e.body,comment:e.comment}))}}),Oi=(e,t)=>vi(`/api/decisions`,{body:{review:e,decisions:t}}),ki=(e,t,n,r)=>vi(`/api/notes`,{body:{review:e,action:`add`,file:t,line:n,text:r,toAgent:!0}});async function Ai(e,t){let n=await ji(t);return(await vi(`/api/attachments`,{body:{review:e,name:t.name,type:t.type,data:n}})).attachment}function ji(e){return new Promise((t,n)=>{let r=new FileReader;r.onerror=()=>n(r.error??Error(`не удалось прочитать файл`)),r.onload=()=>{let e=String(r.result??``),n=e.indexOf(`,`);t(n>=0?e.slice(n+1):e)},r.readAsDataURL(e)})}var Mi=(e,t,n)=>vi(`/api/publish/preview`,{body:{review:e,kind:t,ids:n}}),Ni=(e,t,n,r)=>vi(`/api/publish/approve`,{body:{review:e,kind:t,ids:n,hash:r}}),Pi=(e,t)=>vi(`/api/publish/commit`,{body:{review:e,approvalId:t}}),$=Ut({reviews:[],review:null,tab:`overview`,loading:!1,error:``,toast:null,diffFile:null,diffFocus:null,publishing:null,palette:!1}),Fi=null,Ii=null;function Li(e,t=`info`){$.toast={text:e,kind:t,id:Date.now()},Fi&&clearTimeout(Fi),Fi=setTimeout(()=>{$.toast=null},4500)}function Ri(e){return e instanceof Error?e.message:String(e)}function zi(e){$.tab=e,Gi()}async function Bi(){try{$.reviews=(await bi()).reviews}catch(e){$.error=Ri(e)}}async function Vi(e,t={}){t.silent||($.loading=!0),$.error=``;try{let n=t.refresh?await Ti(e):await yi(e);$.review=n.review,$.reviews=n.reviews,!$.diffFile&&n.review.files.length&&($.diffFile=n.review.files[0].path),Ki(n.review),Gi()}catch(e){$.error=Ri(e),t.silent||Li($.error,`error`)}finally{$.loading=!1}}function Hi(){Ii&&clearTimeout(Ii),Ii=setTimeout(()=>{let e=$.review?.id;e&&Vi(e,{silent:!0}),Bi()},350)}function Ui(){let e=new EventSource(`/api/events`);return e.addEventListener(`review`,()=>Hi()),e.addEventListener(`hello`,()=>void 0),()=>e.close()}function Wi(){let e=/^#\/r\/([^/]+)(?:\/([a-z]+))?$/.exec(location.hash);if(!e)return{id:null,tab:`overview`};let t=[`overview`,`threads`,`findings`,`diff`,`rules`].includes(e[2])?e[2]:`overview`;return{id:decodeURIComponent(e[1]),tab:t}}function Gi(){let e=$.review?.id;if(!e)return;let t=`#/r/${encodeURIComponent(e)}/${$.tab}`;location.hash!==t&&history.replaceState(null,``,t)}async function Ki(e){let t=e.threads.flatMap(e=>e.notes);if(t.length)try{let{reactions:n}=await Ci(e.id,t.map(e=>e.id));if($.review?.id!==e.id)return;for(let e of t)e.reactions=n[e.id]??[]}catch{}}async function qi(){await Bi();let e=Wi(),t=new URLSearchParams(location.search).get(`review`),n=e.id??t??$.reviews[0]?.id??null;$.tab=e.tab,n&&await Vi(n)}function Ji(e){return $.review?.drafts.find(t=>t.threadId===e)??null}function Yi(e,t){$.diffFile=e,$.diffFocus=t?{file:e,line:t}:null,zi(`diff`)}function Xi(e){if(!e)return``;let t=new Date(e).getTime();if(Number.isNaN(t))return e;let n=Math.round((Date.now()-t)/6e4);if(n<1)return Q(`только что`,`just now`);if(n<60)return pi.locale===`ru`?`${n} мин назад`:`${n} min ago`;let r=Math.round(n/60);return r<24?pi.locale===`ru`?`${r} ч назад`:`${r} h ago`:new Date(e).toLocaleString(gi(),{dateStyle:`short`,timeStyle:`short`})}function Zi(e,t=200){let n=e.replace(/\s+/g,` `).trim();return n.length>t?`${n.slice(0,t)}…`:n}function Qi(e){return e.replace(/```[\s\S]*?```/g,` `).replace(/`([^`]+)`/g,`$1`).replace(/\*\*([^*]+)\*\*/g,`$1`).replace(/\[([^\]]+)\]\([^)]*\)/g,`$1`).replace(/^>\s?/gm,``)}var $i={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`};function ea(e){return e.replace(/[&<>"']/g,e=>$i[e]??e)}function ta(e){return e.replace(/`([^`\n]+)`/g,`<code>$1</code>`).replace(/\*\*([^*\n]+)\*\*/g,`<strong>$1</strong>`).replace(/(^|[\s(])\*([^*\n]+)\*/g,`$1<em>$2</em>`).replace(/\[([^\]\n]+)\]\((https?:\/\/[^\s)]+)\)/g,`<a href="$2" target="_blank" rel="noreferrer noopener">$1</a>`).replace(/(^|[\s(])(https?:\/\/[^\s<)]+)/g,`$1<a href="$2" target="_blank" rel="noreferrer noopener">$2</a>`)}function na(e){let t=ea(e.replace(/\r\n/g,`
3
+ `)).split(`
4
+ `),n=[],r=!1,i=null,a=[],o=()=>{a.length&&(n.push(`<p>${ta(a.join(` `))}</p>`),a=[])},s=()=>{i&&=(n.push(`</${i}>`),null)};for(let e of t){if(/^```/.test(e.trim())){o(),s(),r?(n.push(`</code></pre>`),r=!1):(n.push(`<pre><code>`),r=!0);continue}if(r){n.push(`${e}\n`);continue}if(!e.trim()){o(),s();continue}let t=/^(#{1,4})\s+(.*)$/.exec(e);if(t){o(),s();let e=Math.min(4,t[1].length);n.push(`<h${e}>${ta(t[2])}</h${e}>`);continue}if(/^>\s?/.test(e)){o(),s(),n.push(`<blockquote>${ta(e.replace(/^>\s?/,``))}</blockquote>`);continue}let c=/^\s*[-*]\s+(.*)$/.exec(e);if(c){o(),i!==`ul`&&(s(),n.push(`<ul>`),i=`ul`),n.push(`<li>${ta(c[1])}</li>`);continue}let l=/^\s*\d+[.)]\s+(.*)$/.exec(e);l?(o(),i!==`ol`&&(s(),n.push(`<ol>`),i=`ol`),n.push(`<li>${ta(l[1])}</li>`)):a.push(e)}return o(),s(),r&&n.push(`</code></pre>`),n.join(`
5
+ `)}var ra=K(`<div class="md"></div>`);function ia(e,t){He(t,!0);let n=li(t,`source`,3,``),r=N(()=>na(n()));var i=ra();zr(i,()=>W(r),!0),j(i),q(e,i),Ue()}var aa=K(`<li> </li>`),oa=K(`<div class="alert"><strong> </strong> <ul style="margin: 6px 0 0; padding-left: 18px"></ul></div>`),sa=K(`<div class="muted small mono"> </div>`),ca=K(`<li><!></li>`),la=K(`<div class="section-title"> </div> <ul style="margin: 0; padding-left: 18px"></ul>`,1),ua=K(`<section class="card"><div class="card-head"><div class="grow"><div class="card-title"> </div> <!></div></div> <div class="md" style="margin-top: 6px"><!></div> <!> <!></section>`),da=K(`<section class="card flat"><div class="muted"> <span class="mono">revdeck_set_summary</span> <span class="mono">revdeck context</span>.</div></section>`),fa=K(`· <button class="path-link"> </button>`,1),pa=K(`<section class="card flat"><div class="card-head"><div class="grow"><div class="card-title"> </div> <div class="muted small"> <!></div></div> <button class="btn"> </button></div></section>`),ma=K(`<p class="muted small"> </p>`),ha=K(`<!> <!>`,1),ga=K(`<p class="muted"> </p>`),_a=K(`<section class="card flat"><div class="card-head"><div class="grow"><div class="card-title"> </div> <div class="muted small"><button class="path-link"> </button> </div></div></div></section>`),va=K(`<div class="section-title"> </div> <!>`,1),ya=K(`<!> <div class="stats"><div><div class="value"> </div><div class="label"> </div></div> <div><div class="value" style="color: var(--add-text)"> </div><div class="label"> </div></div> <div><div class="value" style="color: var(--del-text)"> </div><div class="label"> </div></div> <div><div class="value"> </div><div class="label"> </div></div> <div><div class="value"> </div><div class="label"> </div></div></div> <!> <div class="section-title"> </div> <div class="row"><span class="badge blocker"> </span> <span class="badge major"> </span> <span class="badge minor"> </span> <span class="badge question"> </span> <button class="btn"> </button></div> <div class="section-title"> </div> <!> <!> <div class="section-title"> </div> <p class="muted small"> </p>`,1);function ba(e,t){He(t,!0);let n=N(()=>$.review),r=N(()=>W(n).threads.filter(e=>!e.resolved)),i=N(()=>({blocker:W(n).findings.filter(e=>e.level===`blocker`&&e.status!==`stale`).length,major:W(n).findings.filter(e=>e.level===`major`&&e.status!==`stale`).length,minor:W(n).findings.filter(e=>e.level===`minor`&&e.status!==`stale`).length,question:W(n).findings.filter(e=>e.level===`question`&&e.status!==`stale`).length})),a=N(()=>W(n).notes.filter(e=>e.toAgent&&!e.agentReply));var o=ya(),s=R(o),c=e=>{var t=oa(),r=L(t),i=z(r,!0),a=B(r,2);X(a,21,()=>W(n).errors,Ar,(e,t)=>{var n=aa(),r=z(n,!0);V(()=>J(r,W(t))),q(e,n)}),j(a),j(t),V(e=>J(i,e),[()=>Q(`Предупреждения`,`Warnings`)]),q(e,t)};Y(s,e=>{W(n).errors.length&&e(c)});var l=B(s,2),u=L(l),d=L(u),f=z(d,!0),p=z(B(d),!0);j(u);var m=B(u,2),h=L(m),g=z(h),_=z(B(h),!0);j(m);var v=B(m,2),y=L(v),b=z(y),x=z(B(y),!0);j(v);var S=B(v,2),ee=L(S),C=z(ee,!0),w=z(B(ee),!0);j(S);var T=B(S,2),te=L(T),E=z(te,!0),ne=z(B(te),!0);j(T),j(l);var re=B(l,2),ie=e=>{var t=ua(),r=L(t),i=L(r),a=L(i),o=z(a,!0),s=B(a,2),c=e=>{var t=sa(),r=z(t,!0);V(()=>J(r,W(n).summary.scope)),q(e,t)};Y(s,e=>{W(n).summary.scope&&e(c)}),j(i),j(r);var l=B(r,2);ia(L(l),{get source(){return W(n).summary.summary}}),j(l);var u=B(l,2),d=e=>{var t=la(),r=R(t),i=z(r,!0),a=B(r,2);X(a,21,()=>W(n).summary.changes,Ar,(e,t)=>{var n=ca();ia(L(n),{get source(){return W(t)}}),j(n),q(e,n)}),j(a),V(e=>J(i,e),[()=>Q(`Что изменено`,`What changed`)]),q(e,t)};Y(u,e=>{W(n).summary.changes.length&&e(d)});var f=B(u,2),p=e=>{var t=la(),r=R(t),i=z(r,!0),a=B(r,2);X(a,21,()=>W(n).summary.focus,Ar,(e,t)=>{var n=ca();ia(L(n),{get source(){return W(t)}}),j(n),q(e,n)}),j(a),V(e=>J(i,e),[()=>Q(`На что смотреть`,`What to focus on`)]),q(e,t)};Y(f,e=>{W(n).summary.focus.length&&e(p)}),j(t),V(e=>J(o,e),[()=>W(n).summary.title||Q(`Выжимка`,`Summary`)]),q(e,t)},ae=e=>{var t=da(),n=L(t),r=L(n),i=B(r,2);Se(2),j(n),j(t),V((e,t)=>{J(r,`${e??``} `),J(i,` ${t??``} `)},[()=>Q(`Выжимки пока нет. Агент запишет её через`,`No summary yet. The agent writes it via`),()=>Q(`или`,`or`)]),q(e,t)};Y(re,e=>{W(n).summary?e(ie):e(ae,-1)});var oe=B(re,2),se=z(oe,!0),ce=B(oe,2),le=L(ce),ue=z(le),de=B(le,2),fe=z(de),D=B(de,2),pe=z(D),me=B(D,2),he=z(me),ge=B(me,2),_e=z(ge,!0);j(ce);var ve=B(ce,2),ye=z(ve,!0),O=B(ve,2),be=e=>{var t=ha(),n=R(t);X(n,17,()=>W(r).slice(0,6),e=>e.id,(e,t)=>{var n=pa(),r=L(n),i=L(r),a=L(i),o=z(a,!0),s=B(a,2),c=L(s),l=B(c),u=e=>{var n=fa(),r=B(R(n)),i=z(r);V(()=>J(i,`${W(t).path??``}:${W(t).line??`?`??``}`)),G(`click`,r,()=>Yi(W(t).path,W(t).line)),q(e,n)};Y(l,e=>{W(t).path&&e(u)}),j(s),j(i);var d=B(i,2),f=z(d,!0);j(r),j(n),V((e,n,r)=>{J(o,e),J(c,`${W(t).notes[0]?.author??`?`??``} · ${n??``} `),J(f,r)},[()=>Zi(Qi(W(t).notes[0]?.body??Q(`Без текста`,`No text`)),160),()=>Xi(W(t).notes[0]?.createdAt??``),()=>Q(`Ответить`,`Reply`)]),G(`click`,d,()=>zi(`threads`)),q(e,n)});var i=B(n,2),a=e=>{var t=ma(),n=z(t);V((e,t)=>J(n,`${e??``} ${W(r).length-6} ${t??``}`),[()=>Q(`И ещё`,`And`),()=>Q(`— на вкладке «Треды».`,`more on the Threads tab.`)]),q(e,t)};Y(i,e=>{W(r).length>6&&e(a)}),q(e,t)},k=e=>{var t=ga(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`Открытых тредов нет.`,`No open threads.`)]),q(e,t)};Y(O,e=>{W(r).length?e(be):e(k,-1)});var A=B(O,2),xe=e=>{var t=va(),n=R(t),r=z(n,!0);X(B(n,2),17,()=>W(a).slice(0,5),e=>e.id,(e,t)=>{var n=_a(),r=L(n),i=L(r),a=L(i),o=z(a,!0),s=B(a,2),c=L(s),l=z(c),u=B(c);j(s),j(i),j(r),j(n),V((e,n)=>{J(o,e),J(l,`${W(t).file??``}:${W(t).line??``}`),J(u,` · ${n??``}`)},[()=>Zi(Qi(W(t).text),200),()=>Xi(W(t).createdAt)]),G(`click`,c,()=>Yi(W(t).file,W(t).line)),q(e,n)}),V(e=>J(r,e),[()=>Q(`Комментарии к строкам без ответа агента`,`Line comments without an agent reply`)]),q(e,t)};Y(A,e=>{W(a).length&&e(xe)});var Ce=B(A,2),we=z(Ce,!0),Te=z(B(Ce,2));V((e,t,a,o,s,c,l,u,d,m,h)=>{J(f,W(n).stats.files),J(p,e),J(g,`+${W(n).stats.additions??``}`),J(_,t),J(b,`−${W(n).stats.deletions??``}`),J(x,a),J(C,W(r).length),J(w,o),J(E,W(n).findings.length),J(ne,s),J(se,c),J(ue,`blocker · ${W(i).blocker??``}`),J(fe,`major · ${W(i).major??``}`),J(pe,`minor · ${W(i).minor??``}`),J(he,`question · ${W(i).question??``}`),J(_e,l),J(ye,u),J(we,d),J(Te,`${m??``}
6
+ ${W(n).info.ref.platform===`gitlab`?`GitLab`:`GitHub`}.
7
+ ${h??``}`)},[()=>hi(W(n).stats.files,[`файл`,`файла`,`файлов`],[`file`,`files`]),()=>Q(`добавлено`,`added`),()=>Q(`удалено`,`removed`),()=>hi(W(r).length,[`открытый тред`,`открытых треда`,`открытых тредов`],[`open thread`,`open threads`]),()=>hi(W(n).findings.length,[`замечание`,`замечания`,`замечаний`],[`finding`,`findings`]),()=>Q(`Замечания по уровням`,`Findings by level`),()=>Q(`Разобрать`,`Triage`),()=>Q(`Открытые треды`,`Open threads`),()=>Q(`Как это работает`,`How it works`),()=>Q(`Агент пишет черновики ответов и замечаний. Публикует только человек: кнопка «Опубликовать» показывает точный план и отправляет его от вашего имени в`,`The agent writes draft replies and findings. Only a human publishes: the Publish button shows the exact plan and sends it on your behalf to`),()=>Q(`Токены платформы агенту не передаются.`,`Platform tokens are never passed to the agent.`)]),G(`click`,ge,()=>zi(`findings`)),q(e,o),Ue()}dr([`click`]);var xa=K(`<button type="button"> </button>`),Sa=K(`<span class="reaction-picker"></span>`),Ca=K(`<div class="reactions"><!> <button type="button" class="reaction add">+</button> <!></div>`);function wa(e,t){He(t,!0);let n=li(t,`note`,7),r={thumbsup:`👍`,thumbsdown:`👎`,smile:`😄`,tada:`🎉`,confused:`😕`,heart:`❤️`,rocket:`🚀`,eyes:`👀`},i={thumbsup:[`Нравится`,`Like`],thumbsdown:[`Не нравится`,`Dislike`],smile:[`Смех`,`Laugh`],tada:[`Ура`,`Hooray`],confused:[`Смущение`,`Confused`],heart:[`Сердце`,`Heart`],rocket:[`Ракета`,`Rocket`],eyes:[`Смотрю`,`Eyes`]},a=Object.keys(r),o=F(!1),s=F(null);async function c(e){if(!W(s)){I(s,e,!0);try{let r=await wi(t.reviewId,n().id,e);n().reactions=r.reactions,I(o,!1)}catch(e){Li(Ri(e),`error`)}finally{I(s,null)}}}var l=Ca(),u=L(l);X(u,17,()=>n().reactions??[],e=>e.name,(e,t)=>{var n=xa();let i;var a=z(n);V(e=>{i=Hr(n,1,`reaction`,null,i,{mine:W(t).mine,pending:W(s)===W(t).name}),Z(n,`title`,e),n.disabled=W(s)!==null,J(a,`${r[W(t).name]??W(t).name??``} ${W(t).count??``}`)},[()=>W(t).users.join(`, `)||Q(`Нет авторов`,`No users`)]),G(`click`,n,()=>void c(W(t).name)),q(e,n)});var d=B(u,2),f=B(d,2),p=e=>{var t=Sa();X(t,20,()=>a,e=>e,(e,t)=>{var a=xa();let o;var l=z(a,!0);V((e,n,i)=>{o=Hr(a,1,`reaction`,null,o,{mine:e}),Z(a,`title`,n),Z(a,`aria-label`,i),a.disabled=W(s)!==null,J(l,r[t])},[()=>n().reactions?.some(e=>e.name===t&&e.mine),()=>Q(i[t][0],i[t][1]),()=>Q(i[t][0],i[t][1])]),G(`click`,a,()=>void c(t)),q(e,a)}),j(t),q(e,t)};Y(f,e=>{W(o)&&e(p)}),j(l),V((e,t)=>{Z(d,`title`,e),Z(d,`aria-label`,t),d.disabled=W(s)!==null},[()=>Q(`Поставить реакцию`,`Add a reaction`),()=>Q(`Поставить реакцию`,`Add a reaction`)]),G(`click`,d,()=>I(o,!W(o))),q(e,l),Ue()}dr([`click`]);var Ta=K(`<button type="button" class="btn"> </button> <input type="file" accept="image/png,image/jpeg,image/gif,image/webp,image/avif,video/mp4,video/webm,video/ogg,video/quicktime" hidden=""/>`,1);function Ea(e,t){He(t,!0);let n=li(t,`disabled`,3,!1),r=N(()=>$.review?.info.ref.platform===`github`),i=F(null),a=F(!1);async function o(e){let n=e.currentTarget,r=n.files?.[0];n.value=``;let i=$.review;if(r&&i){if(r.size>26214400)Li(Q(`Файл больше 25 МБ`,`File is larger than 25 MB`),`error`);else{I(a,!0);try{let e=await Ai(i.id,r);t.oninsert(`\n${e.markdown}\n`),Li(Q(`Вложение загружено`,`Attachment uploaded`),`ok`)}catch(e){Li(Ri(e),`error`)}finally{I(a,!1)}}}}var s=Ta(),c=R(s),l=z(c,!0),u=B(c,2);oi(u,e=>I(i,e),()=>W(i)),V((e,t)=>{c.disabled=n()||W(a)||W(r)||!$.review,Z(c,`title`,e),J(l,t)},[()=>W(r)?Q(`GitHub не поддерживает загрузку вложений: вставьте абсолютную ссылку`,`GitHub does not support attachment uploads: paste an absolute URL`):Q(`Картинка или видео: ссылка появится в тексте`,`Image or video: the link is inserted into the text`),()=>W(a)?Q(`Загрузка…`,`Uploading…`):Q(`Прикрепить`,`Attach`)]),G(`click`,c,()=>W(i)?.click()),G(`change`,u,o),q(e,s),Ue()}dr([`click`,`change`]);var Da=K(`· <button class="path-link"> </button>`,1),Oa=K(`<span class="badge ok"> </span>`),ka=K(`<span class="badge err"> </span>`),Aa=K(`<span class="muted small"> </span>`),ja=K(`<div><div class="muted small"><strong style="color: var(--text)"> </strong> </div> <div class="md"><!></div> <!></div>`),Ma=K(`<div><span class="n"> </span> <span class="k"> </span> <span> </span></div>`),Na=K(`<details style="margin-top: 8px"><summary class="muted small" style="cursor: pointer"> </summary> <div class="snippet"></div></details>`),Pa=K(`<section class="card"><div class="card-head"><input type="checkbox" style="width: auto"/> <div class="grow"><div class="card-title"> <!></div> <div class="muted small"> </div></div> <!> <!> <!></div> <div class="stack" style="margin-top: 10px"></div> <!> <div class="stack" style="margin-top: 12px"><textarea rows="3"></textarea> <div class="row"><label class="switch"><input type="checkbox" style="width: auto"/> </label> <div style="flex: 1"></div> <!> <!> <button class="btn"> </button></div> <details><summary class="muted small" style="cursor: pointer"> </summary> <div class="stack" style="margin-top: 6px"><textarea class="agent" rows="2"></textarea> <select><option> </option><option> </option><option> </option><option> </option><option> </option></select> <div class="muted small"> <span class="mono"> </span>.</div></div></details></div></section>`),Fa=K(`<p class="muted"> </p>`),Ia=K(`<div class="row" style="margin-bottom: 12px"><button> </button> <button> </button> <span class="muted small"> </span> <div style="flex: 1"></div> <button class="btn"> </button> <button class="btn primary"> </button></div> <!>`,1);function La(e,t){He(t,!0);let n=F(`open`),r=F(Ut([])),i=F(Ut([])),a=F(Ut([])),o=new Map,s=N(()=>($.review?.threads??[]).filter(e=>W(n)===`all`||!e.resolved)),c=N(()=>($.review?.drafts??[]).filter(e=>{let t=$.review?.threads.find(t=>t.id===e.threadId);return e.body.trim()!==``&&!e.replied||e.resolve!==t?.resolved}));function l(e){return Ji(e)}function u(e){let t=o.get(e);t&&clearTimeout(t),o.set(e,setTimeout(()=>void d(e),650))}async function d(e){let t=$.review,n=Ji(e);if(t&&n){W(i).includes(e)||I(i,[...W(i),e],!0);try{let r=await Ei(t.id,e,{body:n.body,resolve:n.resolve,noteForAgent:n.noteForAgent,agentAction:n.agentAction});Object.assign(n,r.draft)}catch(e){Li(Ri(e),`error`)}finally{I(i,W(i).filter(t=>t!==e),!0)}}}function f(e){I(r,W(r).includes(e)?W(r).filter(t=>t!==e):[...W(r),e],!0)}function p(e,t){let n=Ji(e);n&&(n.resolve=t,d(e))}function m(){let e=W(r).length?W(r):W(c).map(e=>e.threadId);e.length?$.publishing={kind:`reply`,ids:e}:Li(Q(`Нет черновиков для публикации`,`No drafts to publish`),`info`)}function h(){I(r,W(c).map(e=>e.threadId),!0)}var g=Ia(),_=R(g),v=L(_);let y;var b=z(v,!0),x=B(v,2);let S;var ee=z(x,!0),C=B(x,2),w=z(C),T=B(C,4),te=z(T,!0),E=B(T,2),ne=z(E);j(_),X(B(_,2),17,()=>W(s),e=>e.id,(e,t)=>{let n=N(()=>l(W(t).id)),o=N(()=>W(i).includes(W(t).id));var s=Pa(),c=L(s),m=L(c);$r(m);var h=B(m,2),g=L(h),_=L(g),v=B(_),y=e=>{var n=Da(),r=B(R(n)),i=z(r);V(()=>J(i,`${W(t).path??``}:${W(t).line??`?`??``}`)),G(`click`,r,()=>Yi(W(t).path,W(t).line)),q(e,n)};Y(v,e=>{W(t).path&&e(y)}),j(g);var b=z(B(g,2));j(h);var x=B(h,2),S=e=>{var t=Oa(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`ответ опубликован`,`reply published`)]),q(e,t)};Y(x,e=>{W(n).replied&&e(S)});var ee=B(x,2),C=e=>{var t=ka(),r=z(t,!0);V(e=>{Z(t,`title`,W(n).error),J(r,e)},[()=>Q(`ошибка`,`error`)]),q(e,t)};Y(ee,e=>{W(n).error&&e(C)});var w=B(ee,2),T=e=>{var t=Aa(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`сохранение…`,`saving…`)]),q(e,t)};Y(w,e=>{W(o)&&e(T)}),j(c);var te=B(c,2);X(te,21,()=>W(t).notes,e=>e.id,(e,t)=>{var n=ja(),r=L(n),i=L(r),a=z(i,!0),o=B(i);j(r);var s=B(r,2);ia(L(s),{get source(){return W(t).body}}),j(s),wa(B(s,2),{get reviewId(){return $.review.id},get note(){return W(t)}}),j(n),V(e=>{J(a,W(t).author),J(o,` · ${e??``}`)},[()=>Xi(W(t).createdAt)]),q(e,n)}),j(te);var E=B(te,2),ne=e=>{var n=Na(),r=L(n),i=z(r,!0),a=B(r,2);X(a,21,()=>W(t).snippet,Ar,(e,t)=>{var n=Ma();let r;var i=L(n),a=z(i,!0),o=B(i,2),s=z(o,!0),c=z(B(o,2),!0);j(n),V(()=>{r=Hr(n,1,`snippet-line`,null,r,{add:W(t).kind===`+`,del:W(t).kind===`-`,target:W(t).target}),J(a,W(t).newLine??W(t).oldLine??``),J(s,W(t).kind===` `?``:W(t).kind),J(c,W(t).text)}),q(e,n)}),j(a),j(n),V(e=>J(i,e),[()=>Q(`Фрагмент кода`,`Code context`)]),q(e,n)};Y(E,e=>{W(t).snippet&&e(ne)});var re=B(E,2),ie=L(re);Qe(ie);var ae=B(ie,2),oe=L(ae),se=L(oe);$r(se);var ce=B(se);j(oe);var le=B(oe,4),ue=e=>{var t=Aa(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`сохранение…`,`saving…`)]),q(e,t)},de=e=>{var t=Aa(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`сохранено`,`saved`)]),q(e,t)};Y(le,e=>{W(o)?e(ue):e(de,-1)});var fe=B(le,2);Ea(fe,{oninsert:e=>{W(n).body+=e,u(W(t).id)}});var D=B(fe,2),pe=z(D,!0);j(ae);var me=B(ae,2),he=L(me),ge=z(he,!0),_e=B(he,2),ve=L(_e);Qe(ve);var ye=B(ve,2),O=L(ye),be=z(O,!0);O.value=O.__value=``;var k=B(O),A=z(k,!0);k.value=k.__value=`fix`;var xe=B(k),Ce=z(xe,!0);xe.value=xe.__value=`reply`;var we=B(xe),Te=z(we,!0);we.value=we.__value=`revise`;var Ee=B(we),De=z(Ee,!0);Ee.value=Ee.__value=`skip`,j(ye);var Oe;Kr(ye);var ke=B(ye,2),Ae=L(ke),je=z(B(Ae));Se(),j(ke),j(_e),j(me),j(re),j(s),V((e,r,i,a,o,s,c,l,u,d,f,p,h,g,v,y,x,S)=>{ti(m,e),Z(m,`aria-label`,r),J(_,`${i??``} `),J(b,`${W(t).notes.length??``}
8
+ ${a??``} ·
9
+ ${o??``} ${s??``}`),ei(ie,W(n).body),Z(ie,`placeholder`,c),ti(se,W(n).resolve),J(ce,` ${l??``}`),J(pe,u),me.open=d,J(ge,f),ei(ve,W(n).noteForAgent),Z(ve,`placeholder`,p),J(be,h),J(A,g),J(Ce,v),J(Te,y),J(De,x),Oe!==(Oe=W(n).agentAction)&&(ye.value=(ye.__value=Oe)??``,Gr(ye,Oe)),J(Ae,`${S??``} `),J(je,`revdeck threads ${$.review?.info.ref.number??``}`)},[()=>W(r).includes(W(t).id),()=>Q(`Выбрать тред`,`Select thread`),()=>W(t).resolved?Q(`Закрыт`,`Resolved`):Q(`Открыт`,`Open`),()=>hi(W(t).notes.length,[`комментарий`,`комментария`,`комментариев`],[`comment`,`comments`]),()=>Q(`обновлён`,`updated`),()=>Xi(W(t).updatedAt),()=>Q(`Черновик ответа. Публикуется только после подтверждения.`,`Draft reply. Published only after confirmation.`),()=>Q(`Предложить закрыть тред`,`Propose resolving the thread`),()=>Q(`Сохранить`,`Save`),()=>W(a).includes(W(t).id),()=>Q(`Заметка агенту`,`Note for the agent`),()=>Q(`Что сделать: исправить, переписать ответ, пересмотреть правку…`,`What to do: fix, rewrite the reply, revise the change…`),()=>Q(`— действие —`,`— action —`),()=>Q(`исправить`,`fix`),()=>Q(`ответить`,`reply`),()=>Q(`пересмотреть`,`revise`),()=>Q(`пропустить`,`skip`),()=>Q(`Агент прочитает заметку при следующем проходе:`,`The agent reads this note on the next pass:`)]),G(`change`,m,()=>f(W(t).id)),G(`input`,ie,e=>{W(n).body=e.currentTarget.value,u(W(t).id)}),G(`change`,se,e=>p(W(t).id,e.currentTarget.checked)),G(`click`,D,()=>void d(W(t).id)),ur(`toggle`,me,e=>{let n=e.currentTarget.open;I(a,n?[...new Set([...W(a),W(t).id])]:W(a).filter(e=>e!==W(t).id),!0)}),G(`input`,ve,e=>{W(n).noteForAgent=e.currentTarget.value,u(W(t).id)}),G(`change`,ye,e=>{W(n).agentAction=e.currentTarget.value,u(W(t).id)}),q(e,s)},e=>{var t=Fa(),r=z(t,!0);V(e=>J(r,e),[()=>W(n)===`open`?Q(`Открытых тредов нет.`,`No open threads.`):Q(`Тредов нет.`,`No threads.`)]),q(e,t)}),V((e,t,i,a,o)=>{y=Hr(v,1,`btn`,null,y,{primary:W(n)===`open`}),J(b,e),S=Hr(x,1,`btn`,null,S,{primary:W(n)===`all`}),J(ee,t),J(w,`${W(s).length??``} ${i??``} ${$.review?.threads.length??0??``}`),T.disabled=!W(c).length,J(te,a),E.disabled=!W(c).length&&!W(r).length,J(ne,`${o??``} ${W(r).length?`(${W(r).length})`:``}`)},[()=>Q(`Открытые`,`Open`),()=>Q(`Все`,`All`),()=>Q(`из`,`of`),()=>Q(`Выбрать изменённые`,`Select changed`),()=>Q(`Опубликовать`,`Publish`)]),G(`click`,v,()=>I(n,`open`)),G(`click`,x,()=>I(n,`all`)),G(`click`,T,h),G(`click`,E,m),q(e,g),Ue()}dr([`click`,`change`,`input`]);var Ra=K(`<span class="muted small"> </span>`),za=K(`<div class="md"><!></div>`),Ba=K(`<div><span class="n"> </span> <span class="k"> </span> <span> </span></div>`),Va=K(`<div class="snippet"></div>`),Ha=K(`<div class="alert error" style="margin-top: 8px"> </div>`),Ua=K(`<section class="card"><div class="card-head"><input type="checkbox" style="width: auto"/> <span> </span> <span class="badge"> </span> <!> <div class="grow"></div> <button class="path-link"> </button></div> <div class="card-title" style="margin-top: 6px"> </div> <!> <!> <!> <label class="muted small"> </label> <textarea rows="3"></textarea> <div class="row" style="margin-top: 8px"><!> <button> </button> <button class="btn"> </button> <button> </button> <div style="flex: 1"></div> <span class="muted small"> </span></div></section>`),Wa=K(`<p class="muted"> <span class="mono">revdeck_draft_findings</span>.</p>`),Ga=K(`<div class="row" style="margin-bottom: 12px"><select style="width: auto"><option> </option><option>blocker</option><option>major</option><option>minor</option><option>question</option></select> <select style="width: auto"><option> </option><option> </option><option> </option></select> <span class="muted small"> </span> <div style="flex: 1"></div> <!> <button class="btn"> </button></div> <!>`,1);function Ka(e,t){He(t,!0);let n=F(`all`),r=F(`all`),i=F(Ut([])),a=F(!1),o=null,s=N(()=>($.review?.findings??[]).filter(e=>!(W(n)!==`all`&&e.level!==W(n)||W(r)===`published`&&e.status!==`published`||W(r)===`open`&&(e.status===`published`||e.status===`rejected`)))),c=N(()=>($.review?.findings??[]).filter(e=>e.status!==`published`&&e.status!==`rejected`&&e.decision!==`reject`));function l(e){switch(e){case`draft`:return Q(`черновик`,`draft`);case`accepted`:return Q(`принято`,`accepted`);case`rejected`:return Q(`отклонено`,`rejected`);case`published`:return Q(`опубликовано`,`published`);case`fixed`:return Q(`исправлено`,`fixed`);case`stale`:return Q(`устарело`,`stale`)}}function u(){o&&clearTimeout(o),o=setTimeout(()=>void d(),700)}async function d(){let e=$.review;if(e){I(a,!0);try{let t=await Di(e.id,e.findings);for(let n of t.findings){let t=e.findings.find(e=>e.id===n.id);t&&(t.status=n.status,t.discussionId=n.discussionId,t.publishedAt=n.publishedAt,t.comment=n.comment,t.publishError=n.publishError)}}catch(e){Li(Ri(e),`error`)}finally{I(a,!1)}}}function f(e){I(i,W(i).includes(e)?W(i).filter(t=>t!==e):[...W(i),e],!0)}async function p(e,t){let n=$.review;if(n)try{await Oi(n.id,{[e.id]:{decision:t,note:e.note}}),n.decisions[e.id]={decision:t,note:e.note},Li(t===`accept`?Q(`Принято`,`Accepted`):t===`reject`?Q(`Отклонено`,`Rejected`):Q(`На обсуждение`,`For discussion`),`ok`)}catch(e){Li(Ri(e),`error`)}}function m(){let e=W(i).length?W(i):W(c).map(e=>e.id);e.length?$.publishing={kind:`finding`,ids:e}:Li(Q(`Нет замечаний для публикации`,`No findings to publish`),`info`)}var h=Ga(),g=R(h),_=L(g),v=L(_),y=z(v,!0);v.value=v.__value=`all`;var b=B(v);b.value=b.__value=`blocker`;var x=B(b);x.value=x.__value=`major`;var S=B(x);S.value=S.__value=`minor`;var ee=B(S);ee.value=ee.__value=`question`,j(_);var C;Kr(_);var w=B(_,2),T=L(w),te=z(T,!0);T.value=T.__value=`all`;var E=B(T),ne=z(E,!0);E.value=E.__value=`open`;var re=B(E),ie=z(re,!0);re.value=re.__value=`published`,j(w);var ae;Kr(w);var oe=B(w,2),se=z(oe),ce=B(oe,4),le=e=>{var t=Ra(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`сохранение…`,`saving…`)]),q(e,t)};Y(ce,e=>{W(a)&&e(le)});var ue=B(ce,2),de=z(ue);j(g),X(B(g,2),17,()=>W(s),e=>e.id,(e,t,n)=>{let r=N(()=>$.review?.decisions[W(t).id]?.decision??W(t).decision);var a=Ua(),o=L(a),s=L(o);$r(s);var c=B(s,2),d=z(c,!0),m=B(c,2),h=z(m,!0),g=B(m,2),_=e=>{var n=Ra(),r=z(n);V((e,t)=>J(r,`${e??``} ${t??``}`),[()=>Q(`опубликовано`,`published`),()=>Xi(W(t).publishedAt)]),q(e,n)};Y(g,e=>{W(t).publishedAt&&e(_)});var v=B(g,4),y=z(v);j(o);var b=B(o,2),x=z(b,!0),S=B(b,2),ee=e=>{var n=za();ia(L(n),{get source(){return W(t).body}}),j(n),q(e,n)};Y(S,e=>{W(t).body&&e(ee)});var C=B(S,2),w=e=>{var n=Va();X(n,21,()=>W(t).snippet,Ar,(e,t)=>{var n=Ba();let r;var i=L(n),a=z(i,!0),o=B(i,2),s=z(o,!0),c=z(B(o,2),!0);j(n),V(()=>{r=Hr(n,1,`snippet-line`,null,r,{add:W(t).kind===`+`,del:W(t).kind===`-`,target:W(t).target}),J(a,W(t).newLine??W(t).oldLine??``),J(s,W(t).kind===` `?``:W(t).kind),J(c,W(t).text)}),q(e,n)}),j(n),q(e,n)};Y(C,e=>{W(t).snippet&&e(w)});var T=B(C,2),te=e=>{var n=Ha(),r=z(n,!0);V(()=>J(r,W(t).publishError)),q(e,n)};Y(T,e=>{W(t).publishError&&e(te)});var E=B(T,2),ne=z(E,!0),re=B(E,2);Qe(re);var ie=B(re,2),ae=L(ie);{let e=N(()=>W(t).status===`published`);Ea(ae,{get disabled(){return W(e)},oninsert:e=>{W(t).comment+=e,u()}})}var oe=B(ae,2);let se;var ce=z(oe,!0),le=B(oe,2),ue=z(le,!0),de=B(le,2);let fe;var D=z(de,!0),pe=z(B(de,4),!0);j(ie),j(a),V((e,n,i,a,o,l,u,f)=>{ti(s,e),Z(s,`aria-label`,n),Hr(c,1,`badge ${W(t).level??``}`),J(d,W(t).level),J(h,i),J(y,`${W(t).file??``}:${W(t).line??`—`??``}`),J(x,W(t).title),Z(E,`for`,`comment-${W(t).id}`),J(ne,a),Z(re,`id`,`comment-${W(t).id}`),ei(re,W(t).comment),re.disabled=W(t).status===`published`,se=Hr(oe,1,`btn`,null,se,{primary:W(r)===`accept`}),J(ce,o),J(ue,l),fe=Hr(de,1,`btn danger`,null,fe,{primary:W(r)===`reject`}),J(D,u),J(pe,f)},[()=>W(i).includes(W(t).id),()=>Q(`Выбрать замечание`,`Select finding`),()=>l(W(t).status),()=>Q(`Текст комментария для платформы`,`Comment text for the platform`),()=>Q(`Принять`,`Accept`),()=>Q(`Обсудить`,`Discuss`),()=>Q(`Отклонить`,`Reject`),()=>Zi(W(t).fingerprint,16)]),G(`change`,s,()=>f(W(t).id)),G(`click`,v,()=>Yi(W(t).file,W(t).line)),G(`input`,re,e=>{W(t).comment=e.currentTarget.value,u()}),G(`click`,oe,()=>void p(W(t),`accept`)),G(`click`,le,()=>void p(W(t),`discuss`)),G(`click`,de,()=>void p(W(t),`reject`)),q(e,a)},e=>{var t=Wa(),n=L(t);Se(2),j(t),V(e=>J(n,`${e??``} `),[()=>Q(`Замечаний нет. Агент запишет их через`,`No findings yet. The agent writes them via`)]),q(e,t)}),V((e,t,a,o,l,u)=>{J(y,e),C!==(C=W(n))&&(_.value=(_.__value=C)??``,Gr(_,C)),J(te,t),J(ne,a),J(ie,o),ae!==(ae=W(r))&&(w.value=(w.__value=ae)??``,Gr(w,ae)),J(se,`${W(s).length??``} ${l??``} ${$.review?.findings.length??0??``}`),ue.disabled=!W(c).length,J(de,`${u??``} ${W(i).length?`(${W(i).length})`:`(${W(c).length})`}`)},[()=>Q(`Все уровни`,`All levels`),()=>Q(`Все статусы`,`All statuses`),()=>Q(`Не опубликованные`,`Unpublished`),()=>Q(`Опубликованные`,`Published`),()=>Q(`из`,`of`),()=>Q(`Опубликовать`,`Publish`)]),G(`change`,_,e=>I(n,e.currentTarget.value,!0)),G(`change`,w,e=>I(r,e.currentTarget.value,!0)),G(`click`,ue,m),q(e,h),Ue()}dr([`change`,`click`,`input`]);var qa=K(`<span class="badge ok">A</span>`),Ja=K(`<span class="badge err">D</span>`),Ya=K(`<span class="badge">R</span>`),Xa=K(`<span class="badge">M</span>`),Za=K(`<button><!> <span class="name"> </span> <span class="counts"> </span></button>`),Qa=K(`<p class="muted" style="padding: 12px"> </p>`),$a=K(`<div class="alert error" style="margin: 12px"> </div>`),eo=K(`<div class="hunk-head"> </div>`),to=K(`<span class="badge minor" style="margin-left: 8px"> </span>`),no=K(`<div role="button" tabindex="0"><span class="n"> </span> <span class="n"> </span> <span class="k"> </span> <span class="text"> <!></span></div>`),ro=K(`<div style="padding: 12px"><button class="btn"> </button></div>`),io=K(`<div class="note-composer"><div class="spread" style="margin-bottom: 6px"><strong> </strong> <button class="btn"> </button></div> <textarea rows="2"></textarea> <div class="row end" style="margin-top: 6px"><span class="muted small"> </span> <!> <button class="btn primary"> </button></div></div>`),ao=K(`<span class="badge ok"> </span>`),oo=K(`<span class="badge"> </span>`),so=K(`<div class="muted small"> </div>`),co=K(`<div class="alert error"> </div>`),lo=K(`<section class="card flat"><div class="card-head"><span class="mono small"> </span> <!> <!></div> <div class="md"><span> </span></div> <!> <!></section>`),uo=K(`<div style="padding: 12px"><div class="section-title"> </div> <!></div>`),fo=K(`<!> <!> <!> <!>`,1),po=K(`<div class="split"><div class="file-list"></div> <div class="diff-view"><!></div></div>`);function mo(e,t){He(t,!0);let n=F(null),r=F(!1),i=F(``),a=F(2600),o=F(null),s=F(``),c=F(!1),l=N(()=>$.diffFile);fn(()=>{let e=$.review?.id,t=$.diffFile;!e||!t?I(n,null):(I(r,!0),I(i,``),xi(e,t).then(e=>{I(n,e.file,!0)}).catch(e=>{I(i,Ri(e),!0),I(n,null)}).finally(()=>{I(r,!1)}))});let u=N(()=>{if(!W(n))return[];let e=[];for(let t of W(n).hunks){e.push({kind:`hunk`,header:t.header});for(let n of t.lines)e.push({kind:`line`,line:n})}return e}),d=N(()=>{let e=new Map,t=$.review;if(!t||!W(n))return e;for(let r of t.findings)r.file===W(n).path&&r.line&&e.set(r.line,[...e.get(r.line)??[],`${Q(`замечание`,`finding`)} ${r.id}`]);for(let r of t.threads)r.path===W(n).path&&r.line&&!r.resolved&&e.set(r.line,[...e.get(r.line)??[],Q(`открытый тред`,`open thread`)]);for(let r of t.notes)r.file===W(n).path&&r.line&&e.set(r.line,[...e.get(r.line)??[],Q(`комментарий к строке`,`line comment`)]);return e}),f=N(()=>($.review?.notes??[]).filter(e=>e.file===W(l)));function p(e){e&&(I(o,{line:e},!0),I(s,``))}async function m(){let e=$.review;if(e&&W(l)&&W(o)&&W(s).trim()){I(c,!0);try{let t=await ki(e.id,W(l),W(o).line,W(s).trim());e.notes=[...e.notes,t.note],Li(Q(`Комментарий сохранён: агент увидит его в контексте`,`Comment saved: the agent sees it in the review context`),`ok`),I(o,null),I(s,``)}catch(e){Li(Ri(e),`error`)}finally{I(c,!1)}}}fn(()=>{let e=$.diffFocus;e&&W(n)&&e.file===W(n).path&&requestAnimationFrame(()=>{document.getElementById(`line-${e.line}`)?.scrollIntoView({block:`center`})})});var h=po(),g=L(h);X(g,21,()=>$.review?.files??[],e=>e.path,(e,t)=>{var n=Za();let r;var i=L(n),a=e=>{q(e,qa())},o=e=>{q(e,Ja())},s=e=>{q(e,Ya())},c=e=>{q(e,Xa())};Y(i,e=>{W(t).status===`added`?e(a):W(t).status===`deleted`?e(o,1):W(t).status===`renamed`?e(s,2):e(c,-1)});var l=B(i,2),u=z(l,!0),d=z(B(l,2));j(n),V(()=>{r=Hr(n,1,`file-item`,null,r,{active:$.diffFile===W(t).path}),Z(l,`title`,W(t).path),J(u,W(t).path),J(d,`${W(t).additions??``}/${W(t).deletions??``}`)}),G(`click`,n,()=>$.diffFile=W(t).path),q(e,n)}),j(g);var _=B(g,2),v=L(_),y=e=>{var t=Qa(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`Загрузка diff…`,`Loading diff…`)]),q(e,t)},b=e=>{var t=$a(),n=z(t,!0);V(()=>J(n,W(i))),q(e,t)},x=e=>{var t=Qa(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`Выберите файл слева.`,`Pick a file on the left.`)]),q(e,t)},S=e=>{var t=Qa(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`Бинарный файл: diff не отображается.`,`Binary file: no diff to display.`)]),q(e,t)},ee=e=>{var t=fo(),r=R(t);X(r,17,()=>W(u).slice(0,W(a)),Ar,(e,t)=>{var r=br(),i=R(r),a=e=>{var n=eo(),r=z(n,!0);V(()=>J(r,W(t).header)),q(e,n)},o=e=>{let r=N(()=>W(t).line),i=N(()=>W(r).newLine??W(r).oldLine??0);var a=no();let o;var s=L(a),c=z(s,!0),l=B(s,2),u=z(l,!0),f=B(l,2),m=z(f,!0),h=B(f,2),g=L(h,!0),_=B(g),v=e=>{var t=to(),n=z(t,!0);V(e=>J(n,e),[()=>Zi(W(d).get(W(i)).join(`, `),40)]),q(e,t)},y=N(()=>W(d).has(W(i)));Y(_,e=>{W(y)&&e(v)}),j(h),j(a),V(e=>{o=Hr(a,1,`diff-line`,null,o,{add:W(r).kind===`+`,del:W(r).kind===`-`,"target-line":$.diffFocus?.line===W(i)&&$.diffFocus?.file===W(n).path}),Z(a,`id`,`line-${W(i)}`),Z(a,`title`,e),J(c,W(r).newLine??``),J(u,W(r).oldLine??``),J(m,W(r).kind===` `?``:W(r).kind),J(g,W(r).text)},[()=>W(d).get(W(i))?.join(`, `)??``]),G(`click`,a,()=>p(W(r).newLine)),G(`keydown`,a,e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),p(W(r).newLine))}),q(e,a)};Y(i,e=>{W(t).kind===`hunk`?e(a):e(o,-1)}),q(e,r)});var i=B(r,2),l=e=>{var t=ro(),n=L(t),r=z(n);j(t),V((e,t)=>J(r,`${e??``} (${W(u).length-W(a)} ${t??``})`),[()=>Q(`Показать ещё`,`Show more`),()=>Q(`строк`,`lines`)]),G(`click`,n,()=>I(a,W(a)+2600)),q(e,t)};Y(i,e=>{W(u).length>W(a)&&e(l)});var h=B(i,2),g=e=>{var t=io(),n=L(t),r=L(n),i=z(r),a=B(r,2),l=z(a,!0);j(n);var u=B(n,2);Qe(u);var d=B(u,2),f=L(d),p=z(f,!0),h=B(f,2);Ea(h,{oninsert:e=>I(s,W(s)+e)});var g=B(h,2),_=z(g,!0);j(d),j(t),V((e,t,n,r,a,c)=>{J(i,`${e??``} ${W(o).line??``}`),J(l,t),ei(u,W(s)),Z(u,`placeholder`,n),J(p,r),g.disabled=a,J(_,c)},[()=>Q(`Комментарий к строке`,`Comment on line`),()=>Q(`Отмена`,`Cancel`),()=>Q(`Комментарий уйдёт агенту`,`The comment goes to the agent`),()=>Q(`Агент увидит комментарий в контексте ревью.`,`The agent sees this comment in the review context.`),()=>W(c)||!W(s).trim(),()=>Q(`Сохранить`,`Save`)]),G(`click`,a,()=>I(o,null)),G(`input`,u,e=>I(s,e.currentTarget.value,!0)),G(`click`,g,()=>void m()),q(e,t)};Y(h,e=>{W(o)&&e(g)});var _=B(h,2),v=e=>{var t=uo(),n=L(t),r=z(n,!0);X(B(n,2),17,()=>W(f),e=>e.id,(e,t)=>{var n=lo(),r=L(n),i=L(r),a=z(i),o=B(i,2),s=e=>{var t=ao(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`опубликовано`,`published`)]),q(e,t)};Y(o,e=>{W(t).posted&&e(s)});var c=B(o,2),l=e=>{var t=oo(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`ответ агента`,`agent reply`)]),q(e,t)};Y(c,e=>{W(t).agentReply&&e(l)}),j(r);var u=B(r,2),d=z(L(u),!0);j(u);var f=B(u,2),p=e=>{var n=so(),r=z(n);V(()=>J(r,`→ ${W(t).agentReply??``}`)),q(e,n)};Y(f,e=>{W(t).agentReply&&e(p)});var m=B(f,2),h=e=>{var n=co(),r=z(n,!0);V(()=>J(r,W(t).error)),q(e,n)};Y(m,e=>{W(t).error&&e(h)}),j(n),V(()=>{J(a,`${W(t).file??``}:${W(t).line??``}`),J(d,W(t).text)}),q(e,n)}),j(t),V(e=>J(r,e),[()=>Q(`Комментарии к строкам этого файла`,`Line comments in this file`)]),q(e,t)};Y(_,e=>{W(f).length&&e(v)}),q(e,t)};Y(v,e=>{W(r)&&!W(n)?e(y):W(i)?e(b,1):W(n)?W(n).binary?e(S,3):e(ee,-1):e(x,2)}),j(_),j(h),q(e,h),Ue()}dr([`click`,`keydown`,`input`]);var ho=K(`<p class="muted"> </p>`),go=K(`<div class="alert error"> </div>`),_o=K(`<li> </li>`),vo=K(`<div class="alert"><strong> </strong> <ul style="margin: 6px 0 0; padding-left: 18px"></ul></div>`),yo=K(`<tr><td style="padding: 4px 6px" class="mono"> </td><td style="padding: 4px 6px" class="mono small"> </td><td style="padding: 4px 6px"> </td></tr>`),bo=K(`<section class="card"><div class="card-title"> </div> <table style="width: 100%; border-collapse: collapse; margin-top: 8px"><thead><tr class="muted small" style="text-align: left"><th style="padding: 4px 6px">id</th><th style="padding: 4px 6px"> </th><th style="padding: 4px 6px"> </th></tr></thead><tbody></tbody></table> <p class="muted small"> <span class="mono">revdeck checks &lt;N&gt; --run --yes</span>.</p></section>`),xo=K(`<!> <section class="card flat"><div class="spread"><div class="card-title"> </div> <span class="muted small mono"> </span></div> <p class="muted small" style="margin: 4px 0 0"> </p></section> <section class="card"><div class="md"><!></div></section> <!>`,1);function So(e,t){He(t,!0);let n=F(!0),r=F(``),i=F(null);fn(()=>{let e=$.review?.id;e&&(I(n,!0),I(r,``),Si(e).then(e=>{I(i,e.rules,!0)}).catch(e=>{I(r,Ri(e),!0)}).finally(()=>{I(n,!1)}))});var a=br(),o=R(a),s=e=>{var t=ho(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`Загрузка правил…`,`Loading rules…`)]),q(e,t)},c=e=>{var t=go(),n=z(t,!0);V(()=>J(n,W(r))),q(e,t)},l=e=>{var t=xo(),n=R(t),r=e=>{var t=vo(),n=L(t),r=z(n,!0),a=B(n,2);X(a,21,()=>W(i).warnings,Ar,(e,t)=>{var n=_o(),r=z(n,!0);V(()=>J(r,W(t))),q(e,n)}),j(a),j(t),V(e=>J(r,e),[()=>Q(`Что не нашлось`,`What was not found`)]),q(e,t)};Y(n,e=>{W(i).warnings.length&&e(r)});var a=B(n,2),o=L(a),s=L(o),c=z(s,!0),l=z(B(s,2),!0);j(o);var u=z(B(o,2),!0);j(a);var d=B(a,2),f=L(d);ia(L(f),{get source(){return W(i).markdown}}),j(f),j(d);var p=B(d,2),m=e=>{var t=bo(),n=L(t),r=z(n,!0),a=B(n,2),o=L(a),s=L(o),c=B(L(s)),l=z(c,!0),u=z(B(c),!0);j(s),j(o);var d=B(o);X(d,21,()=>W(i).checks,e=>e.id,(e,t)=>{var n=yo(),r=L(n),i=z(r,!0),a=B(r),o=z(a,!0),s=z(B(a),!0);j(n),V((e,n)=>{J(i,W(t).id),J(o,e),J(s,n)},[()=>W(t).argv.join(` `),()=>W(t).matched?Q(`да`,`yes`):Q(`нет`,`no`)]),q(e,n)}),j(d),j(a);var f=B(a,2),p=L(f);Se(2),j(f),j(t),V((e,t,n,i)=>{J(r,e),J(l,t),J(u,n),J(p,`${i??``} `)},[()=>Q(`Проверки`,`Checks`),()=>Q(`команда`,`command`),()=>Q(`относится к diff`,`matched by diff`),()=>Q(`Запуск проверок — только вручную:`,`Checks run only manually:`)]),q(e,t)};Y(p,e=>{W(i).checks.length&&e(m)}),V((e,t,n)=>{J(c,e),J(l,t),J(u,n)},[()=>Q(`Правила проекта`,`Project rules`),()=>W(i).configPath??Q(`автообнаружение`,`auto-discovery`),()=>Q(`Для каждого изменённого пути выбраны документы и конкретные секции. Это единственный источник правил: общие best practices без опоры на документ репозитория не применяются.`,`For every changed path revdeck selected documents and exact sections. This is the only source of rules: generic best practices without a repository document are not applied.`)]),q(e,t)};Y(o,e=>{W(n)?e(s):W(r)?e(c,1):W(i)&&e(l,2)}),q(e,a),Ue()}var Co=K(`<p class="muted"> </p>`),wo=K(`<div class="alert error"> </div>`),To=K(`<li> </li>`),Eo=K(`<div class="alert"><strong> </strong> <ul style="margin: 6px 0 0; padding-left: 18px"></ul></div>`),Do=K(`<span> </span>`),Oo=K(`<section class="card flat"><div class="card-head"><span class="badge"> </span> <span class="mono small muted"> </span> <!></div> <pre style="white-space: pre-wrap; margin: 8px 0 0"> </pre></section>`),ko=K(`<span class="badge ok">✔</span>`),Ao=K(`<span class="badge err">✖</span>`),jo=K(`<span class="muted small"> </span>`),Mo=K(`<span class="small" style="color: var(--danger)"> </span>`),No=K(`<div class="row" style="margin-bottom: 4px"><!> <span class="mono small"> </span> <!> <!></div>`),Po=K(`<div class="section-title"> </div> <!> <div class="row end" style="margin-top: 10px"><button class="btn primary"> </button></div>`,1),Fo=K(`<!> <div class="row end" style="margin-top: 12px"><button class="btn"> </button> <button class="btn primary"> </button></div>`,1),Io=K(`<p class="muted small"> <strong> </strong> </p> <!> <div class="stack"></div> <div class="muted small mono" style="margin: 8px 0"> </div> <!>`,1),Lo=K(`<div class="overlay"><button class="backdrop" type="button"></button> <div class="dialog" role="dialog" aria-modal="true"><div class="spread"><h2 style="margin: 0; font-size: 16px"> </h2> <button class="btn"> </button></div> <!></div></div>`);function Ro(e,t){He(t,!0);let n=F(null),r=F(!0),i=F(``),a=F(!1),o=F(null),s={reply:Q(`Ответы в треды`,`Thread replies`),finding:Q(`Замечания к строкам`,`Line findings`),note:Q(`Комментарии к строкам`,`Line comments`)};fn(()=>{let e=$.review?.id;e&&(I(r,!0),I(i,``),Mi(e,t.kind,t.ids).then(e=>{I(n,e.preview,!0)}).catch(e=>{I(i,Ri(e),!0)}).finally(()=>{I(r,!1)}))});async function c(){let e=$.review;if(e&&W(n)){I(a,!0),I(i,``);try{let r=await Ni(e.id,t.kind,t.ids,W(n).plan.hash),i=await Pi(e.id,r.approval.id);I(o,i.result.results,!0);let a=W(o).filter(e=>!e.ok);Li(a.length?`${Q(`Опубликовано с ошибками`,`Published with errors`)}: ${a.length}`:Q(`Опубликовано`,`Published`),a.length?`error`:`ok`),await Vi(e.id,{silent:!0})}catch(e){I(i,Ri(e),!0)}finally{I(a,!1)}}}var l=Lo(),u=L(l),d=B(u,2),f=L(d),p=L(f),m=z(p),h=B(p,2),g=z(h,!0);j(f);var _=B(f,2),v=e=>{var t=Co(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`Готовлю план…`,`Building the plan…`)]),q(e,t)},y=e=>{var t=wo(),n=z(t,!0);V(()=>J(n,W(i))),q(e,t)},b=e=>{var r=Io(),s=R(r),l=L(s),u=B(l),d=z(u,!0),f=B(u);j(s);var p=B(s,2),m=e=>{var t=Eo(),r=L(t),i=z(r,!0),a=B(r,2);X(a,21,()=>W(n).warnings,Ar,(e,t)=>{var n=To(),r=z(n,!0);V(()=>J(r,W(t))),q(e,n)}),j(a),j(t),V(e=>J(i,e),[()=>Q(`Пропущено`,`Skipped`)]),q(e,t)};Y(p,e=>{W(n).warnings.length&&e(m)});var h=B(p,2);X(h,21,()=>W(n).plan.items,e=>e.kind+e.id,(e,t)=>{var n=Oo(),r=L(n),i=L(r),a=z(i,!0),o=B(i,2),s=z(o,!0),c=B(o,2),l=e=>{var n=Do();let r;var i=z(n,!0);V(e=>{r=Hr(n,1,`badge`,null,r,{ok:W(t).resolve}),J(i,e)},[()=>W(t).resolve?Q(`закрыть тред`,`resolve thread`):Q(`оставить открытым`,`leave open`)]),q(e,n)};Y(c,e=>{W(t).resolve!==void 0&&e(l)}),j(r);var u=z(B(r,2),!0);j(n),V((e,n)=>{J(a,W(t).kind),J(s,e),J(u,n)},[()=>Zi(W(t).id,40),()=>W(t).body||Q(`(только закрытие треда)`,`(resolve only)`)]),q(e,n)}),j(h);var g=B(h,2),_=z(g),v=B(g,2),y=e=>{var n=Po(),r=R(n),i=z(r,!0),a=B(r,2);X(a,17,()=>W(o),e=>e.id,(e,t)=>{var n=No(),r=L(n),i=e=>{q(e,ko())},a=e=>{q(e,Ao())};Y(r,e=>{W(t).ok?e(i):e(a,-1)});var o=B(r,2),s=z(o,!0),c=B(o,2),l=e=>{var t=jo(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`уже опубликовано`,`already published`)]),q(e,t)};Y(c,e=>{W(t).skipped&&e(l)});var u=B(c,2),d=e=>{var n=Mo(),r=z(n,!0);V(()=>J(r,W(t).error)),q(e,n)};Y(u,e=>{W(t).error&&e(d)}),j(n),V(e=>J(s,e),[()=>Zi(W(t).id,40)]),q(e,n)});var s=B(a,2),c=L(s),l=z(c,!0);j(s),V((e,t)=>{J(i,e),J(l,t)},[()=>Q(`Результат`,`Result`),()=>Q(`Готово`,`Done`)]),G(`click`,c,function(...e){t.onclose?.apply(this,e)}),q(e,n)},b=e=>{var r=Fo(),o=R(r),s=e=>{var t=wo(),n=z(t,!0);V(()=>J(n,W(i))),q(e,t)};Y(o,e=>{W(i)&&e(s)});var l=B(o,2),u=L(l),d=z(u,!0),f=B(u,2),p=z(f,!0);j(l),V((e,t)=>{u.disabled=W(a),J(d,e),f.disabled=W(a)||!W(n).plan.items.length,J(p,t)},[()=>Q(`Отмена`,`Cancel`),()=>W(a)?Q(`Публикую…`,`Publishing…`):`${Q(`Опубликовать`,`Publish`)} ${W(n).plan.items.length}`]),G(`click`,u,function(...e){t.onclose?.apply(this,e)}),G(`click`,f,()=>void c()),q(e,r)};Y(v,e=>{W(o)?e(y):e(b,-1)}),V((e,t)=>{J(l,`${e??``} ${$.review?.info.ref.platform===`gitlab`?`GitLab`:`GitHub`}: `),J(d,W(n).plan.items.length),J(f,`. ${t??``}`),J(_,`hash: ${W(n).plan.hash??``}`)},[()=>Q(`Будет отправлено от вашего имени в`,`Will be sent on your behalf to`),()=>Q(`Текст ниже — ровно то, что уйдёт в платформу.`,`The text below is exactly what will be posted.`)]),q(e,r)};Y(_,e=>{W(r)?e(v):W(i)&&!W(o)?e(y,1):W(n)&&e(b,2)}),j(d),j(l),V((e,n,r,i)=>{Z(u,`aria-label`,e),Z(d,`aria-label`,n),J(m,`${s[t.kind]??``}: ${r??``}`),J(g,i)},[()=>Q(`Закрыть`,`Close`),()=>Q(`Публикация`,`Publish`),()=>Q(`подтверждение`,`confirmation`),()=>Q(`Закрыть`,`Close`)]),G(`click`,u,function(...e){t.onclose?.apply(this,e)}),G(`click`,h,function(...e){t.onclose?.apply(this,e)}),q(e,l),Ue()}dr([`click`]);var zo=K(`<button><span> </span> <span class="muted small" style="float: right"> </span></button>`),Bo=K(`<p class="muted small" style="padding: 12px"> </p>`),Vo=K(`<div class="overlay" style="padding-top: 6vh"><button class="backdrop" type="button"></button> <div class="palette" role="dialog" aria-modal="true"><input type="text"/> <div style="max-height: 50vh; overflow: auto"></div></div></div>`);function Ho(e,t){He(t,!0);let n=F(``),r=F(0),i=F(void 0);fn(()=>{W(i)?.focus()});let a=N(()=>{let e=$.review,n=[],r=[[`overview`,Q(`Обзор`,`Overview`)],[`threads`,Q(`Треды`,`Threads`)],[`findings`,Q(`Замечания`,`Findings`)],[`diff`,`Diff`],[`rules`,Q(`Правила`,`Rules`)]];for(let[e,t]of r)n.push({id:`tab-${e}`,label:`${Q(`Перейти:`,`Go to:`)} ${t}`,hint:`1–5`,run:()=>zi(e)});e&&(n.push({id:`refresh`,label:Q(`Обновить ревью`,`Refresh review`),hint:`r`,run:()=>void Vi(e.id,{refresh:!0})}),n.push({id:`publish`,label:Q(`Опубликовать изменения`,`Publish changes`),hint:`p`,run:t.onpublish}),n.push({id:`copy-context`,label:Q(`Скопировать команду контекста`,`Copy context command`),hint:`CLI`,run:()=>{navigator.clipboard?.writeText(`revdeck context ${e.info.ref.number}`).then(()=>Li(Q(`Команда скопирована`,`Command copied`),`ok`),()=>Li(Q(`Не удалось скопировать`,`Could not copy`),`error`))}}),n.push({id:`platform`,label:Q(`Открыть в платформе`,`Open in platform`),hint:`↗`,run:()=>window.open(e.info.webUrl,`_blank`,`noopener`)}));for(let t of $.reviews)t.id!==e?.id&&n.push({id:`review-${t.id}`,label:`${Q(`Открыть:`,`Open:`)} #${t.number} ${t.title}`,hint:t.project,run:()=>void Vi(t.id)});return n}),o=N(()=>W(a).filter(e=>{let t=W(n).toLowerCase().trim();return!t||e.label.toLowerCase().includes(t)||e.hint.toLowerCase().includes(t)}));function s(e){e.run(),t.onclose()}function c(e){if(e.key===`ArrowDown`)e.preventDefault(),I(r,Math.min(W(o).length-1,W(r)+1),!0);else if(e.key===`ArrowUp`)e.preventDefault(),I(r,Math.max(0,W(r)-1),!0);else if(e.key===`Enter`){e.preventDefault();let t=W(o)[W(r)];t&&s(t)}else e.key===`Escape`&&t.onclose()}fn(()=>{I(r,0)});var l=Vo(),u=L(l),d=B(u,2),f=L(d);$r(f),oi(f,e=>I(i,e),()=>W(i));var p=B(f,2);X(p,23,()=>W(o),e=>e.id,(e,t,n)=>{var i=zo();let a;var o=L(i),c=z(o,!0),l=z(B(o,2),!0);j(i),V(()=>{a=Hr(i,1,`palette-item`,null,a,{on:W(n)===W(r)}),J(c,W(t).label),J(l,W(t).hint)}),G(`click`,i,()=>s(W(t))),ur(`mouseenter`,i,()=>I(r,W(n),!0)),q(e,i)},e=>{var t=Bo(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`Ничего не найдено.`,`Nothing found.`)]),q(e,t)}),j(p),j(d),j(l),V((e,t,r)=>{Z(u,`aria-label`,e),Z(d,`aria-label`,t),ei(f,W(n)),Z(f,`placeholder`,r)},[()=>Q(`Закрыть`,`Close`),()=>Q(`Команды`,`Commands`),()=>Q(`Команда… (↑↓, Enter)`,`Command… (↑↓, Enter)`)]),G(`click`,u,function(...e){t.onclose?.apply(this,e)}),G(`input`,f,e=>I(n,e.currentTarget.value,!0)),G(`keydown`,f,c),q(e,l),Ue()}dr([`click`,`input`,`keydown`]);var Uo=K(`<button><span class="title"> </span> <span class="meta"> </span></button>`),Wo=K(`<p class="muted small" style="padding: 8px"> </p>`),Go=K(`<span class="mono">revdeck open &lt;N&gt;</span>`),Ko=K(`<span class="badge"> </span>`),qo=K(`<span class="count"> </span>`),Jo=K(`<button> <!></button>`),Yo=K(`<p class="muted"> </p>`),Xo=K(`<header class="header"><div class="title-row"><div style="min-width: 0; flex: 1"><h1> </h1> <div class="meta"><span> </span> <span> </span> <span> </span> <span> </span> <span> </span> <!></div></div> <div class="header-actions"><button class="btn"> </button> <a class="btn" target="_blank" rel="noreferrer noopener"> </a> <button class="btn primary"> </button></div></div></header> <nav class="tabs"></nav> <section class="content"><!></section>`,1),Zo=K(`<div class="alert error"> </div>`),Qo=K(`<div class="empty"><h2>revdeck</h2> <p> </p> <pre>revdeck open 42
10
+ revdeck open https://gitlab.com/group/project/-/merge_requests/42</pre> <!></div>`),$o=K(`<div> </div>`),es=K(`<div class="shell"><aside class="sidebar"><div class="brand"><span class="dot"></span> revdeck</div> <div class="sidebar-list"></div> <div class="sidebar-footer"><!> <div class="lang-switch"><button>RU</button> <button>EN</button></div></div></aside> <main class="main"><!></main></div> <!> <!> <!>`,1);function ts(e,t){He(t,!0);let n=F(!1),r=N(()=>$.review?$.review.threads.filter(e=>!e.resolved).length:0),i=N(()=>$.review?$.review.findings.filter(e=>e.status!==`published`&&e.status!==`stale`).length:0),a=N(()=>[{id:`overview`,label:Q(`Обзор`,`Overview`)},{id:`threads`,label:Q(`Треды`,`Threads`),count:W(r)},{id:`findings`,label:Q(`Замечания`,`Findings`),count:W(i)},{id:`diff`,label:`Diff`},{id:`rules`,label:Q(`Правила`,`Rules`)}]),o=N(()=>{let e=$.review;if(!e)return null;if($.tab===`threads`){let t=e.drafts.filter(t=>{let n=e.threads.find(e=>e.id===t.threadId);return t.body.trim()!==``&&!t.replied||t.resolve!==n?.resolved}).map(e=>e.threadId);return t.length?{kind:`reply`,ids:t}:null}if($.tab===`diff`){let t=e.notes.filter(e=>!e.posted).map(e=>e.id);return t.length?{kind:`note`,ids:t}:null}let t=e.findings.filter(e=>e.status!==`published`&&e.status!==`rejected`&&e.decision!==`reject`).map(e=>e.id);return t.length?{kind:`finding`,ids:t}:null});function s(e){$.review?.id!==e&&($.tab=`overview`,Vi(e))}function c(){let e=$.review?.id;e&&(Vi(e,{refresh:!0}),Li(Q(`Обновлено`,`Updated`),`info`))}function l(e){let t=e.target,r=t&&(t.tagName===`INPUT`||t.tagName===`TEXTAREA`||t.isContentEditable);if((e.metaKey||e.ctrlKey)&&e.key.toLowerCase()===`k`)e.preventDefault(),I(n,!0);else if(e.key===`Escape`)I(n,!1),$.publishing=null;else if(!r){if(e.key>=`1`&&e.key<=`5`){let t=W(a)[Number(e.key)-1];t&&zi(t.id)}else e.key===`r`?c():e.key===`?`?I(n,!0):e.key===`p`&&W(o)&&($.publishing=W(o))}}ui(()=>{qi(),Bi();let e=Ui();return window.addEventListener(`keydown`,l),()=>{e(),window.removeEventListener(`keydown`,l)}});var u=es(),d=R(u),f=L(d),p=B(L(f),2);X(p,21,()=>$.reviews,e=>e.id,(e,t)=>{var n=Uo();let r;var i=L(n),a=z(i),o=z(B(i,2));j(n),V(()=>{r=Hr(n,1,`review-row`,null,r,{active:$.review?.id===W(t).id}),J(a,`#${W(t).number??``} ${W(t).title??``}`),J(o,`${W(t).project??``} · ${W(t).author??``}`)}),G(`click`,n,()=>s(W(t).id)),q(e,n)},e=>{var t=Wo(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`Ревью ещё не открывались.`,`No reviews opened yet.`)]),q(e,t)}),j(p);var m=B(p,2),h=L(m),g=e=>{var t=yr();V((e,n)=>J(t,`${$.review.files.length??``} ${e??``} · ${$.review.threads.length??``} ${n??``}`),[()=>hi($.review.files.length,[`файл`,`файла`,`файлов`],[`file`,`files`]),()=>hi($.review.threads.length,[`тред`,`треда`,`тредов`],[`thread`,`threads`])]),q(e,t)},_=e=>{q(e,Go())};Y(h,e=>{$.review?e(g):e(_,-1)});var v=B(h,2),y=L(v);let b;var x=B(y,2);let S;j(v),j(m),j(f);var ee=B(f,2),C=L(ee),w=e=>{let t=N(()=>$.review);var n=Xo(),r=R(n),i=L(r),s=L(i),l=L(s),u=z(l,!0),d=B(l,2),f=L(d),p=z(f),m=B(f,2),h=z(m),g=B(m,2),_=z(g,!0),v=B(g,2),y=z(v),b=B(v,2),x=z(b),S=B(b,2),ee=e=>{var t=Ko(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`устарело`,`stale`)]),q(e,t)};Y(S,e=>{W(t).stale&&e(ee)}),j(d),j(s);var C=B(s,2),w=L(C),T=z(w,!0),te=B(w,2),E=z(te,!0),ne=B(te,2),re=z(ne);j(C),j(i),j(r);var ie=B(r,2);X(ie,21,()=>W(a),e=>e.id,(e,t)=>{var n=Jo();let r;var i=L(n,!0),a=B(i),o=e=>{var n=qo(),r=z(n,!0);V(()=>J(r,W(t).count)),q(e,n)};Y(a,e=>{W(t).count&&e(o)}),j(n),V(()=>{r=Hr(n,1,`tab`,null,r,{active:$.tab===W(t).id}),J(i,W(t).label)}),G(`click`,n,()=>zi(W(t).id)),q(e,n)}),j(ie);var ae=B(ie,2),oe=L(ae),se=e=>{var t=Yo(),n=z(t,!0);V(e=>J(n,e),[()=>Q(`Загрузка…`,`Loading…`)]),q(e,t)},ce=e=>{ba(e,{})},le=e=>{La(e,{})},ue=e=>{Ka(e,{})},de=e=>{mo(e,{})},fe=e=>{So(e,{})};Y(oe,e=>{$.loading&&!W(t)?e(se):$.tab===`overview`?e(ce,1):$.tab===`threads`?e(le,2):$.tab===`findings`?e(ue,3):$.tab===`diff`?e(de,4):e(fe,-1)}),j(ae),V((e,n,r,i,a,s)=>{J(u,W(t).info.title),J(p,`${W(t).info.ref.project??``}#${W(t).info.ref.number??``}`),J(h,`${W(t).info.sourceBranch??``} → ${W(t).info.targetBranch??``}`),J(_,W(t).info.author),J(y,`${W(t).info.state??``}${W(t).info.draft?` · draft`:``}`),J(x,`+${W(t).stats.additions??``} −${W(t).stats.deletions??``}`),Z(w,`title`,e),J(T,n),Z(te,`href`,W(t).info.webUrl),J(E,r),ne.disabled=!W(o),Z(ne,`title`,i),J(re,`${a??``}${W(o)?` · ${W(o).ids.length}`:``}`),Z(ie,`aria-label`,s)},[()=>Q(`Обновить (r)`,`Refresh (r)`),()=>Q(`Обновить`,`Refresh`),()=>Q(`Открыть в платформе`,`Open in platform`),()=>Q(`Опубликовать (p)`,`Publish (p)`),()=>Q(`Опубликовать`,`Publish`),()=>Q(`Разделы ревью`,`Review sections`)]),G(`click`,w,c),G(`click`,ne,()=>W(o)&&($.publishing=W(o))),q(e,n)},T=e=>{var t=Qo(),n=B(L(t),2),r=z(n,!0),i=B(n,4),a=e=>{var t=Zo(),n=z(t,!0);V(()=>J(n,$.error)),q(e,t)};Y(i,e=>{$.error&&e(a)}),j(t),V(e=>J(r,e),[()=>Q(`Откройте ревью из терминала — оно появится здесь и останется в списке.`,`Open a review from the terminal; it will appear here and stay in the list.`)]),q(e,t)};Y(C,e=>{$.review?e(w):e(T,-1)}),j(ee),j(d);var te=B(d,2),E=e=>{Ro(e,{get kind(){return $.publishing.kind},get ids(){return $.publishing.ids},onclose:()=>$.publishing=null})};Y(te,e=>{$.publishing&&e(E)});var ne=B(te,2),re=e=>{Ho(e,{onclose:()=>I(n,!1),onpublish:()=>W(o)&&($.publishing=W(o))})};Y(ne,e=>{W(n)&&e(re)});var ie=B(ne,2),ae=e=>{var t=$o();let n;var r=z(t,!0);V(()=>{n=Hr(t,1,`toast`,null,n,{error:$.toast.kind===`error`,ok:$.toast.kind===`ok`}),J(r,$.toast.text)}),q(e,t)};Y(ie,e=>{$.toast&&e(ae)}),V(e=>{Z(v,`aria-label`,e),b=Hr(y,1,``,null,b,{on:pi.locale===`ru`}),S=Hr(x,1,``,null,S,{on:pi.locale===`en`})},[()=>Q(`Язык интерфейса`,`Interface language`)]),G(`click`,y,()=>mi(`ru`)),G(`click`,x,()=>mi(`en`)),q(e,u),Ue()}dr([`click`]);var ns=document.getElementById(`app`);if(!ns)throw Error(`missing #app`);mi(pi.locale),Tr(ts,{target:ns});
@@ -1 +1 @@
1
- :root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--bg:#f6f7f9;--panel:#fff;--panel-2:#f0f2f5;--border:#dfe3e8;--text:#16191d;--muted:#68707a;--accent:#3b6ef5;--accent-soft:#e6edff;--ok:#1f8f4e;--ok-soft:#e4f6ea;--warn:#b26a00;--warn-soft:#fff2dc;--danger:#c93838;--danger-soft:#fdeaea;--add:#e6f6ec;--add-text:#116b35;--del:#fdecec;--del-text:#a12525;--code:#f1f3f6;--shadow:0 1px 2px #1018280f, 0 8px 24px #1018280f;--radius:10px;--mono:ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Helvetica Neue", sans-serif}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;--bg:#101216;--panel:#171a20;--panel-2:#1d2128;--border:#2a2f38;--text:#e6e9ee;--muted:#98a1ad;--accent:#6f95ff;--accent-soft:#1e2a4d;--ok:#4cc27d;--ok-soft:#16311f;--warn:#e0a33a;--warn-soft:#33270f;--danger:#f07a7a;--danger-soft:#361a1a;--add:#12291b;--add-text:#7ed3a1;--del:#2d1717;--del-text:#f0a0a0;--code:#1f242c;--shadow:0 1px 2px #0000004d, 0 8px 24px #00000040}}*{box-sizing:border-box}html,body{background:var(--bg);height:100%;color:var(--text);font:14px/1.5 var(--sans);margin:0}#app{height:100%}button,input,textarea,select{font:inherit;color:inherit}button{cursor:pointer}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}code,pre{font-family:var(--mono);font-size:12.5px}pre{background:var(--code);border-radius:8px;padding:10px 12px;overflow:auto}.md p{margin:.35em 0}.md ul,.md ol{margin:.35em 0;padding-left:1.4em}.md h1,.md h2,.md h3,.md h4{margin:.8em 0 .35em;font-size:1em}.md blockquote{border-left:3px solid var(--border);color:var(--muted);margin:.4em 0;padding-left:10px}.md code{background:var(--code);border-radius:5px;padding:1px 5px}.md pre code{background:0 0;padding:0}.shell{grid-template-columns:290px minmax(0,1fr);height:100%;display:grid}.sidebar{border-right:1px solid var(--border);background:var(--panel);flex-direction:column;min-height:0;display:flex}.brand{letter-spacing:-.01em;align-items:center;gap:9px;padding:16px 16px 10px;font-weight:650;display:flex}.brand .dot{background:var(--ok);border-radius:50%;width:9px;height:9px}.sidebar-list{flex:1;padding:6px;overflow:auto}.review-row{text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px;width:100%;margin-bottom:2px;padding:8px 9px;display:block}.review-row:hover{background:var(--panel-2)}.review-row.active{background:var(--accent-soft);border-color:color-mix(in srgb, var(--accent) 30%, transparent)}.review-row .title{white-space:nowrap;text-overflow:ellipsis;font-weight:550;display:block;overflow:hidden}.review-row .meta{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:12px;display:block;overflow:hidden}.sidebar-footer{border-top:1px solid var(--border);color:var(--muted);padding:10px 14px;font-size:12px}.main{flex-direction:column;min-width:0;min-height:0;display:flex}.header{border-bottom:1px solid var(--border);background:var(--panel);padding:16px 22px 10px}.header h1{letter-spacing:-.01em;margin:0;font-size:17px;line-height:1.35}.header .meta{color:var(--muted);flex-wrap:wrap;gap:6px 14px;margin-top:5px;font-size:12.5px;display:flex}.header-actions{align-items:center;gap:8px;margin-left:auto;display:flex}.title-row{align-items:flex-start;gap:14px;display:flex}.tabs{border-bottom:1px solid var(--border);background:var(--panel);gap:2px;padding:0 18px;display:flex;overflow-x:auto}.tab{color:var(--muted);white-space:nowrap;background:0 0;border:0;border-bottom:2px solid #0000;padding:10px 12px;font-weight:550}.tab.active{color:var(--text);border-bottom-color:var(--accent)}.tab .count{background:var(--panel-2);min-width:18px;color:var(--muted);text-align:center;border-radius:20px;margin-left:6px;padding:1px 5px;font-size:11px;display:inline-block}.content{flex:1;min-height:0;padding:18px 22px 60px;overflow:auto}.btn{border:1px solid var(--border);background:var(--panel);border-radius:8px;padding:6px 11px;font-weight:550}.btn:hover{background:var(--panel-2)}.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn.primary:hover{filter:brightness(1.05)}.btn.danger{color:var(--danger);border-color:color-mix(in srgb, var(--danger) 35%, var(--border))}.btn:disabled{opacity:.55;cursor:default}.card{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);margin-bottom:12px;padding:14px 16px}.card.flat{box-shadow:none}.card-head{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.card-head .grow{flex:1;min-width:0}.card-title{overflow-wrap:anywhere;font-weight:600}.muted{color:var(--muted)}.small{font-size:12px}.mono{font-family:var(--mono)}.badge{background:var(--panel-2);color:var(--muted);white-space:nowrap;border-radius:20px;align-items:center;gap:5px;padding:2px 8px;font-size:11.5px;font-weight:600;display:inline-flex}.badge.blocker{background:var(--danger-soft);color:var(--danger)}.badge.major{background:var(--warn-soft);color:var(--warn)}.badge.minor{background:var(--accent-soft);color:var(--accent)}.badge.question{background:var(--panel-2);color:var(--muted)}.badge.ok{background:var(--ok-soft);color:var(--ok)}.badge.err{background:var(--danger-soft);color:var(--danger)}.path-link{color:var(--accent);font-family:var(--mono);cursor:pointer;background:0 0;border:0;padding:0;font-size:12px}textarea,input[type=text],input[type=number],select{background:var(--panel);border:1px solid var(--border);resize:vertical;border-radius:8px;width:100%;padding:7px 9px}textarea:focus,input:focus,select:focus{outline:2px solid color-mix(in srgb, var(--accent) 35%, transparent);outline-offset:-1px;border-color:var(--accent)}textarea.agent{background:var(--panel-2)}.row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.row.end{justify-content:flex-end}.spread{justify-content:space-between;align-items:center;gap:10px;display:flex}.stack{flex-direction:column;gap:8px;display:flex}.snippet{border:1px solid var(--border);background:var(--panel);max-height:240px;font-family:var(--mono);border-radius:8px;margin:8px 0;font-size:12px;overflow:auto}.snippet-line{white-space:pre;grid-template-columns:52px 16px minmax(0,1fr);gap:0;padding-right:8px;display:grid}.snippet-line .n{color:var(--muted);text-align:right;-webkit-user-select:none;user-select:none;border-right:1px solid var(--border);padding-right:10px}.snippet-line .k{text-align:center;color:var(--muted)}.snippet-line.add{background:var(--add);color:var(--add-text)}.snippet-line.del{background:var(--del);color:var(--del-text)}.snippet-line.target{outline:1px solid var(--accent);outline-offset:-1px}.diff-line.target-line{background:var(--accent-soft)}.file-list{border-right:1px solid var(--border);flex:0 0 300px;width:300px;padding:6px;overflow:auto}.file-item{text-align:left;background:0 0;border:0;border-radius:7px;align-items:center;gap:8px;width:100%;padding:6px 8px;font-size:12.5px;display:flex}.file-item:hover{background:var(--panel-2)}.file-item.active{background:var(--accent-soft)}.file-item .name{text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;flex:1;overflow:hidden}.file-item .counts{color:var(--muted);font-family:var(--mono);font-size:11px}.split{height:100%;min-height:0;display:flex}.diff-view{background:var(--panel);flex:1;min-width:0;overflow:auto}.hunk-head{background:var(--panel-2);color:var(--muted);font-family:var(--mono);border-top:1px solid var(--border);border-bottom:1px solid var(--border);z-index:1;padding:3px 10px;font-size:11.5px;position:sticky;top:0}.diff-line{font-family:var(--mono);white-space:pre;cursor:pointer;grid-template-columns:52px 52px 16px minmax(0,1fr);font-size:12px;line-height:1.55;display:grid}.diff-line:hover{background:var(--panel-2)}.diff-line .n{color:var(--muted);text-align:right;-webkit-user-select:none;user-select:none;border-right:1px solid var(--border);padding-right:8px}.diff-line .k{text-align:center;color:var(--muted)}.diff-line.add{background:var(--add);color:var(--add-text)}.diff-line.del{background:var(--del);color:var(--del-text)}.diff-line .text{min-width:0;padding-left:8px}.note-composer{background:var(--panel);border-top:1px solid var(--border);padding:10px 12px;position:sticky;bottom:0;box-shadow:0 -6px 20px #0000000f}.empty{text-align:center;max-width:560px;color:var(--muted);margin:10vh auto}.empty h2{color:var(--text);margin-bottom:6px}.toast{background:var(--panel);border:1px solid var(--border);border-left:3px solid var(--accent);box-shadow:var(--shadow);z-index:50;border-radius:9px;max-width:420px;padding:10px 14px;position:fixed;bottom:18px;right:18px}.toast.error{border-left-color:var(--danger)}.toast.ok{border-left-color:var(--ok)}.overlay{z-index:40;background:#0006;justify-content:center;align-items:flex-start;padding-top:8vh;display:flex;position:fixed;inset:0}.backdrop{background:0 0;border:0;padding:0;position:absolute;inset:0}.dialog{background:var(--panel);border:1px solid var(--border);width:min(760px,92vw);max-height:80vh;box-shadow:var(--shadow);border-radius:12px;padding:18px;position:relative;overflow:auto}.palette{background:var(--panel);border:1px solid var(--border);width:min(560px,92vw);box-shadow:var(--shadow);border-radius:12px;position:relative;overflow:hidden}.palette input{border:0;border-bottom:1px solid var(--border);border-radius:0;padding:12px 14px}.palette-item{text-align:left;background:0 0;border:0;width:100%;padding:9px 14px;display:block}.palette-item.on{background:var(--accent-soft)}.kbd{font-family:var(--mono);border:1px solid var(--border);color:var(--muted);background:var(--panel-2);border-bottom-width:2px;border-radius:5px;padding:0 5px;font-size:11px}.switch{cursor:pointer;white-space:nowrap;align-items:center;gap:7px;display:inline-flex}.stats{flex-wrap:wrap;gap:18px;margin:10px 0 4px;display:flex}.stats .value{letter-spacing:-.02em;font-size:20px;font-weight:650}.stats .label{color:var(--muted);font-size:12px}.section-title{text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:18px 0 8px;font-size:12px;font-weight:650}.alert{border:1px solid color-mix(in srgb, var(--warn) 35%, var(--border));background:var(--warn-soft);color:var(--text);border-radius:9px;margin-bottom:12px;padding:10px 12px;font-size:13px}.alert.error{border-color:color-mix(in srgb, var(--danger) 35%, var(--border));background:var(--danger-soft)}mark{background:var(--warn-soft);color:inherit;border-radius:3px;padding:0 2px}@media (max-width:860px){.shell{grid-template-columns:1fr}.sidebar{display:none}.file-list{flex-basis:auto;width:100%;max-height:160px}.split{flex-direction:column}}.lang-switch{gap:4px;margin-top:8px;display:flex}.lang-switch button{border:1px solid var(--border);background:var(--panel);color:var(--muted);border-radius:6px;flex:1;padding:2px 0;font-size:11px;font-weight:650}.lang-switch button.on{background:var(--accent-soft);border-color:color-mix(in srgb, var(--accent) 35%, var(--border));color:var(--accent)}
1
+ :root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--bg:#f6f7f9;--panel:#fff;--panel-2:#f0f2f5;--border:#dfe3e8;--text:#16191d;--muted:#68707a;--accent:#3b6ef5;--accent-soft:#e6edff;--ok:#1f8f4e;--ok-soft:#e4f6ea;--warn:#b26a00;--warn-soft:#fff2dc;--danger:#c93838;--danger-soft:#fdeaea;--add:#e6f6ec;--add-text:#116b35;--del:#fdecec;--del-text:#a12525;--code:#f1f3f6;--shadow:0 1px 2px #1018280f, 0 8px 24px #1018280f;--radius:10px;--mono:ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Helvetica Neue", sans-serif}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;--bg:#101216;--panel:#171a20;--panel-2:#1d2128;--border:#2a2f38;--text:#e6e9ee;--muted:#98a1ad;--accent:#6f95ff;--accent-soft:#1e2a4d;--ok:#4cc27d;--ok-soft:#16311f;--warn:#e0a33a;--warn-soft:#33270f;--danger:#f07a7a;--danger-soft:#361a1a;--add:#12291b;--add-text:#7ed3a1;--del:#2d1717;--del-text:#f0a0a0;--code:#1f242c;--shadow:0 1px 2px #0000004d, 0 8px 24px #00000040}}*{box-sizing:border-box}html,body{background:var(--bg);height:100%;color:var(--text);font:14px/1.5 var(--sans);margin:0}#app{height:100%}button,input,textarea,select{font:inherit;color:inherit}button{cursor:pointer}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}code,pre{font-family:var(--mono);font-size:12.5px}pre{background:var(--code);border-radius:8px;padding:10px 12px;overflow:auto}.md p{margin:.35em 0}.md ul,.md ol{margin:.35em 0;padding-left:1.4em}.md h1,.md h2,.md h3,.md h4{margin:.8em 0 .35em;font-size:1em}.md blockquote{border-left:3px solid var(--border);color:var(--muted);margin:.4em 0;padding-left:10px}.md code{background:var(--code);border-radius:5px;padding:1px 5px}.md pre code{background:0 0;padding:0}.shell{grid-template-columns:290px minmax(0,1fr);height:100%;display:grid}.sidebar{border-right:1px solid var(--border);background:var(--panel);flex-direction:column;min-height:0;display:flex}.brand{letter-spacing:-.01em;align-items:center;gap:9px;padding:16px 16px 10px;font-weight:650;display:flex}.brand .dot{background:var(--ok);border-radius:50%;width:9px;height:9px}.sidebar-list{flex:1;padding:6px;overflow:auto}.review-row{text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px;width:100%;margin-bottom:2px;padding:8px 9px;display:block}.review-row:hover{background:var(--panel-2)}.review-row.active{background:var(--accent-soft);border-color:color-mix(in srgb, var(--accent) 30%, transparent)}.review-row .title{white-space:nowrap;text-overflow:ellipsis;font-weight:550;display:block;overflow:hidden}.review-row .meta{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:12px;display:block;overflow:hidden}.sidebar-footer{border-top:1px solid var(--border);color:var(--muted);padding:10px 14px;font-size:12px}.main{flex-direction:column;min-width:0;min-height:0;display:flex}.header{border-bottom:1px solid var(--border);background:var(--panel);padding:16px 22px 10px}.header h1{letter-spacing:-.01em;margin:0;font-size:17px;line-height:1.35}.header .meta{color:var(--muted);flex-wrap:wrap;gap:6px 14px;margin-top:5px;font-size:12.5px;display:flex}.header-actions{align-items:center;gap:8px;margin-left:auto;display:flex}.title-row{align-items:flex-start;gap:14px;display:flex}.tabs{border-bottom:1px solid var(--border);background:var(--panel);gap:2px;padding:0 18px;display:flex;overflow-x:auto}.tab{color:var(--muted);white-space:nowrap;background:0 0;border:0;border-bottom:2px solid #0000;padding:10px 12px;font-weight:550}.tab.active{color:var(--text);border-bottom-color:var(--accent)}.tab .count{background:var(--panel-2);min-width:18px;color:var(--muted);text-align:center;border-radius:20px;margin-left:6px;padding:1px 5px;font-size:11px;display:inline-block}.content{flex:1;min-height:0;padding:18px 22px 60px;overflow:auto}.btn{border:1px solid var(--border);background:var(--panel);border-radius:8px;padding:6px 11px;font-weight:550}.btn:hover{background:var(--panel-2)}.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn.primary:hover{filter:brightness(1.05)}.btn.danger{color:var(--danger);border-color:color-mix(in srgb, var(--danger) 35%, var(--border))}.btn:disabled{opacity:.55;cursor:default}.card{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);margin-bottom:12px;padding:14px 16px}.card.flat{box-shadow:none}.card-head{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.card-head .grow{flex:1;min-width:0}.card-title{overflow-wrap:anywhere;font-weight:600}.muted{color:var(--muted)}.small{font-size:12px}.mono{font-family:var(--mono)}.badge{background:var(--panel-2);color:var(--muted);white-space:nowrap;border-radius:20px;align-items:center;gap:5px;padding:2px 8px;font-size:11.5px;font-weight:600;display:inline-flex}.badge.blocker{background:var(--danger-soft);color:var(--danger)}.badge.major{background:var(--warn-soft);color:var(--warn)}.badge.minor{background:var(--accent-soft);color:var(--accent)}.badge.question{background:var(--panel-2);color:var(--muted)}.badge.ok{background:var(--ok-soft);color:var(--ok)}.badge.err{background:var(--danger-soft);color:var(--danger)}.path-link{color:var(--accent);font-family:var(--mono);cursor:pointer;background:0 0;border:0;padding:0;font-size:12px}textarea,input[type=text],input[type=number],select{background:var(--panel);border:1px solid var(--border);resize:vertical;border-radius:8px;width:100%;padding:7px 9px}textarea:focus,input:focus,select:focus{outline:2px solid color-mix(in srgb, var(--accent) 35%, transparent);outline-offset:-1px;border-color:var(--accent)}textarea.agent{background:var(--panel-2)}.row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.row.end{justify-content:flex-end}.spread{justify-content:space-between;align-items:center;gap:10px;display:flex}.stack{flex-direction:column;gap:8px;display:flex}.snippet{border:1px solid var(--border);background:var(--panel);max-height:240px;font-family:var(--mono);border-radius:8px;margin:8px 0;font-size:12px;overflow:auto}.snippet-line{white-space:pre;grid-template-columns:52px 16px minmax(0,1fr);gap:0;padding-right:8px;display:grid}.snippet-line .n{color:var(--muted);text-align:right;-webkit-user-select:none;user-select:none;border-right:1px solid var(--border);padding-right:10px}.snippet-line .k{text-align:center;color:var(--muted)}.snippet-line.add{background:var(--add);color:var(--add-text)}.snippet-line.del{background:var(--del);color:var(--del-text)}.snippet-line.target{outline:1px solid var(--accent);outline-offset:-1px}.diff-line.target-line{background:var(--accent-soft)}.file-list{border-right:1px solid var(--border);flex:0 0 300px;width:300px;padding:6px;overflow:auto}.file-item{text-align:left;background:0 0;border:0;border-radius:7px;align-items:center;gap:8px;width:100%;padding:6px 8px;font-size:12.5px;display:flex}.file-item:hover{background:var(--panel-2)}.file-item.active{background:var(--accent-soft)}.file-item .name{text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;flex:1;overflow:hidden}.file-item .counts{color:var(--muted);font-family:var(--mono);font-size:11px}.split{height:100%;min-height:0;display:flex}.diff-view{background:var(--panel);flex:1;min-width:0;overflow:auto}.hunk-head{background:var(--panel-2);color:var(--muted);font-family:var(--mono);border-top:1px solid var(--border);border-bottom:1px solid var(--border);z-index:1;padding:3px 10px;font-size:11.5px;position:sticky;top:0}.diff-line{font-family:var(--mono);white-space:pre;cursor:pointer;grid-template-columns:52px 52px 16px minmax(0,1fr);font-size:12px;line-height:1.55;display:grid}.diff-line:hover{background:var(--panel-2)}.diff-line .n{color:var(--muted);text-align:right;-webkit-user-select:none;user-select:none;border-right:1px solid var(--border);padding-right:8px}.diff-line .k{text-align:center;color:var(--muted)}.diff-line.add{background:var(--add);color:var(--add-text)}.diff-line.del{background:var(--del);color:var(--del-text)}.diff-line .text{min-width:0;padding-left:8px}.note-composer{background:var(--panel);border-top:1px solid var(--border);padding:10px 12px;position:sticky;bottom:0;box-shadow:0 -6px 20px #0000000f}.empty{text-align:center;max-width:560px;color:var(--muted);margin:10vh auto}.empty h2{color:var(--text);margin-bottom:6px}.toast{background:var(--panel);border:1px solid var(--border);border-left:3px solid var(--accent);box-shadow:var(--shadow);z-index:50;border-radius:9px;max-width:420px;padding:10px 14px;position:fixed;bottom:18px;right:18px}.toast.error{border-left-color:var(--danger)}.toast.ok{border-left-color:var(--ok)}.overlay{z-index:40;background:#0006;justify-content:center;align-items:flex-start;padding-top:8vh;display:flex;position:fixed;inset:0}.backdrop{background:0 0;border:0;padding:0;position:absolute;inset:0}.dialog{background:var(--panel);border:1px solid var(--border);width:min(760px,92vw);max-height:80vh;box-shadow:var(--shadow);border-radius:12px;padding:18px;position:relative;overflow:auto}.palette{background:var(--panel);border:1px solid var(--border);width:min(560px,92vw);box-shadow:var(--shadow);border-radius:12px;position:relative;overflow:hidden}.palette input{border:0;border-bottom:1px solid var(--border);border-radius:0;padding:12px 14px}.palette-item{text-align:left;background:0 0;border:0;width:100%;padding:9px 14px;display:block}.palette-item.on{background:var(--accent-soft)}.kbd{font-family:var(--mono);border:1px solid var(--border);color:var(--muted);background:var(--panel-2);border-bottom-width:2px;border-radius:5px;padding:0 5px;font-size:11px}.switch{cursor:pointer;white-space:nowrap;align-items:center;gap:7px;display:inline-flex}.stats{flex-wrap:wrap;gap:18px;margin:10px 0 4px;display:flex}.stats .value{letter-spacing:-.02em;font-size:20px;font-weight:650}.stats .label{color:var(--muted);font-size:12px}.section-title{text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:18px 0 8px;font-size:12px;font-weight:650}.alert{border:1px solid color-mix(in srgb, var(--warn) 35%, var(--border));background:var(--warn-soft);color:var(--text);border-radius:9px;margin-bottom:12px;padding:10px 12px;font-size:13px}.alert.error{border-color:color-mix(in srgb, var(--danger) 35%, var(--border));background:var(--danger-soft)}mark{background:var(--warn-soft);color:inherit;border-radius:3px;padding:0 2px}@media (max-width:860px){.shell{grid-template-columns:1fr}.sidebar{display:none}.file-list{flex-basis:auto;width:100%;max-height:160px}.split{flex-direction:column}}.lang-switch{gap:4px;margin-top:8px;display:flex}.lang-switch button{border:1px solid var(--border);background:var(--panel);color:var(--muted);border-radius:6px;flex:1;padding:2px 0;font-size:11px;font-weight:650}.lang-switch button.on{background:var(--accent-soft);border-color:color-mix(in srgb, var(--accent) 35%, var(--border));color:var(--accent)}.reactions{flex-wrap:wrap;align-items:center;gap:4px;margin-top:6px;display:flex}.reaction{border:1px solid var(--border);background:var(--panel);min-height:24px;color:var(--text);cursor:pointer;border-radius:999px;padding:0 8px;font-size:12px;line-height:22px}.reaction:hover:not(:disabled){border-color:var(--accent);background:var(--panel-2)}.reaction.mine{border-color:color-mix(in srgb, var(--accent) 45%, var(--border));background:var(--accent-soft);color:var(--accent)}.reaction.add{color:var(--muted);padding:0 10px}.reaction.pending{opacity:.55;cursor:progress}.reaction-picker{border:1px solid var(--border);background:var(--panel);border-radius:999px;flex-wrap:wrap;gap:2px;padding:2px;display:inline-flex}.reaction-picker .reaction{background:0 0;border:0;min-height:22px;font-size:14px;line-height:20px}
@@ -7,8 +7,8 @@
7
7
  <meta name="referrer" content="no-referrer" />
8
8
  <link rel="icon" href="/favicon.svg" type="image/svg+xml" />
9
9
  <title>revdeck</title>
10
- <script type="module" crossorigin src="/assets/index-mvPA8Avw.js"></script>
11
- <link rel="stylesheet" crossorigin href="/assets/index-ByfGHwCb.css">
10
+ <script type="module" crossorigin src="/assets/index-BAejn_X6.js"></script>
11
+ <link rel="stylesheet" crossorigin href="/assets/index-xv-zA2Sf.css">
12
12
  </head>
13
13
  <body>
14
14
  <div id="app"></div>
@@ -49,7 +49,9 @@ We build the product around a [local daemon](../architecture.md):
49
49
  socket. The client can start the daemon itself.
50
50
  - Socket permissions are part of the security model: directory 0700, socket 0600.
51
51
  - In a container, either a mounted socket or `REVDECK_URL`/`REVDECK_TOKEN` is needed; otherwise, use
52
- `export`/`import` and run on the host.
52
+ `export`/`import` and run on the host. `revdeck devcontainer --write` mounts a stable bridge socket from
53
+ `~/.local/state/revdeck/devcontainer/run` and marks the container with `REVDECK_DEV_CONTAINER=1`, so it
54
+ never starts its own daemon.
53
55
  - One daemon serves several repositories: `root` is passed on `open`, and the config is read from that
54
56
  root.
55
57
  - Client and daemon versions must match; [`PROTOCOL_VERSION`](../protocol.md) was added.
@@ -35,6 +35,7 @@ agent (MCP/CLI) ──▶ revdeck daemon ──glab/gh──▶ GitLab/GitHub
35
35
  - `src/daemon/store.ts` — SQLite (`node:sqlite`): reviews, diff/thread snapshot, drafts, findings,
36
36
  decisions, comments, approvals, audit.
37
37
  - `src/daemon/rpc.ts` — [JSON-RPC](protocol.md) over a Unix socket (0600) for the CLI and MCP.
38
+ - `src/daemon/bridge.ts` — an additional RPC socket in a stable home-based directory for devcontainers.
38
39
  - `src/daemon/http.ts` — UI and `/api/*`, SSE events, cookie session with a one-time token.
39
40
  - `src/cli` — commands, `init`, `doctor`, export/import of the old file format.
40
41
  - `src/mcp` — MCP server: tools and prompts, a thin wrapper over RPC.
@@ -77,7 +78,8 @@ agent (MCP/CLI) ──▶ revdeck daemon ──glab/gh──▶ GitLab/GitHub
77
78
  ## Extension
78
79
 
79
80
  - **New platform**: implement `Provider` and add a branch in `createProvider`; nothing else changes.
80
- - **New harness**: `revdeck init --adapters <name>` copies the skill and writes the MCP config.
81
+ - **New harness**: `revdeck init --adapters <name>` writes the MCP config or command file and links the
82
+ canonical `.agents/skills/revdeck` skill.
81
83
  Harnesses without MCP use the CLI.
82
84
  - **Rules**: `rules.map`/`rules.sources` in `.revdeck.yml`; rule packs can be distributed as a regular
83
85
  configuration file.
@@ -112,6 +112,8 @@ Running: `revdeck checks <N> --run --yes`. The MCP tool only shows the plan.
112
112
  | `REVDECK_STATE_DIR` | state directory (default `~/.local/state/revdeck`) |
113
113
  | `REVDECK_RUNTIME_DIR` | socket directory (default `$XDG_RUNTIME_DIR/revdeck`) |
114
114
  | `REVDECK_URL` + `REVDECK_TOKEN` | connect to the daemon over HTTP (container/port forwarding) |
115
+ | `REVDECK_DEV_CONTAINER=1` | do not start a local daemon; fail with a host-daemon hint instead |
116
+ | `REVDECK_UI_HOST` | host used by `revdeck ui` from a container (for example `host.docker.internal`) |
115
117
  | `REVDECK_ROOT` | project root for the MCP server |
116
118
  | `REVDECK_LANG` | CLI/MCP/daemon language: `ru` or `en` (default: system locale) |
117
119
 
@@ -15,18 +15,27 @@ skill remain: the agent calls commands through the shell.
15
15
 
16
16
  | Harness | `/` command | What `init` writes |
17
17
  |---|---|---|
18
- | Claude Code | `/revdeck` | `.claude/commands/revdeck.md`, `.claude/skills/revdeck/*`, `.mcp.json` |
18
+ | Claude Code | `/revdeck` | `.claude/commands/revdeck.md`, `.claude/skills/revdeck` → `../../.agents/skills/revdeck`, `.mcp.json` |
19
19
  | Cursor | `/revdeck` | `.cursor/commands/revdeck.md`, `.cursor/mcp.json` |
20
20
  | Codex CLI | prompt `revdeck` | `.codex/prompts/revdeck.md`; MCP in `~/.codex/config.toml` (manually) |
21
21
  | Gemini CLI | `/revdeck` | `.gemini/commands/revdeck.toml`; MCP in the Gemini settings (manually) |
22
22
  | OpenCode | `/revdeck` | `.opencode/command/revdeck.md` |
23
23
  | GitHub Copilot | prompt file | `.github/prompts/revdeck.prompt.md` |
24
- | DSH | plugin (see below) | `.agents/skills/revdeck/*` + YAML snippet in the output |
25
- | Universal | — | `.agents/skills/revdeck/*` + MCP |
24
+ | DSH | plugin (see below) | `.agents/skills/revdeck/*` (including `agents/openai.yaml`) + YAML snippet in the output |
25
+ | Universal | — | `.agents/skills/revdeck/*` (including `agents/openai.yaml`) + MCP |
26
+
27
+ Comment attachments are uploaded by the host daemon. GitLab uses project uploads and returns an
28
+ absolute URL; GitHub has no public attachment API, so the editor asks for a URL instead.
26
29
 
27
30
  `revdeck init --adapters dsh,claude` explicitly enables the adapters you need. A repeated `init`
28
31
  does not overwrite existing command files and does not clobber other keys in `.mcp.json`.
29
32
 
33
+ The skill has one canonical copy: `.agents/skills/revdeck` (including `agents/openai.yaml` for OpenAI
34
+ harnesses). Harnesses that keep skills under their own directory get a link to it — `.claude/skills/revdeck`
35
+ is a symlink to `../../.agents/skills/revdeck`, with a copy fallback on Windows and on filesystems without
36
+ symlink support. Old copies created by an earlier `init` are replaced when they still carry
37
+ `name: revdeck`.
38
+
30
39
  ## MCP
31
40
 
32
41
  ```json
@@ -65,15 +74,47 @@ The tools will appear as `mcp__revdeck__*`. DSH does not support MCP prompt temp
65
74
  requires a host command (`ctx.commands.register`) or a client action — that is a separate wrapper
66
75
  plugin. Until then, use the skill + MCP tools: the `/` slash is not required for things to work.
67
76
 
68
- ## Container
77
+ ## Container and devcontainer
78
+
79
+ The daemon, `glab` and `gh` stay on the host; the container only needs the revdeck CLI or MCP server.
80
+ Generate the devcontainer settings from the repository root:
81
+
82
+ ```bash
83
+ revdeck devcontainer # print the mounts and environment
84
+ revdeck devcontainer --write # merge them into .devcontainer/devcontainer.json
85
+ ```
86
+
87
+ `--write` mounts the stable bridge `~/.local/state/revdeck/devcontainer/run` (socket) and
88
+ `~/.local/state/revdeck/devcontainer/state` (read-only `daemon.json`) and sets:
89
+
90
+ ```json
91
+ {
92
+ "REVDECK_RUNTIME_DIR": "/run/revdeck",
93
+ "REVDECK_STATE_DIR": "/var/lib/revdeck",
94
+ "REVDECK_DEV_CONTAINER": "1",
95
+ "REVDECK_UI_HOST": "host.docker.internal"
96
+ }
97
+ ```
98
+
99
+ The mount sources in `devcontainer.json` use `${localEnv:HOME}${localEnv:USERPROFILE}`, never an
100
+ absolute home directory, so the shared repository file is valid for every developer. Existing mounts,
101
+ environment variables, `runArgs`, comments and foreign keys are preserved; only the two revdeck mounts
102
+ and the `REVDECK_*` keys are managed.
103
+
104
+ The daemon creates the bridge socket on startup. On the host run `revdeck daemon restart`, then rebuild
105
+ the container. Inside the container `revdeck` never starts its own daemon: if the socket is unreachable
106
+ it fails with a `DEVCONTAINER` error and a hint. `revdeck doctor` does not look for `glab`/`gh` in the
107
+ container.
108
+
109
+ The container user must be able to connect to the host socket (normally the same UID; the socket is
110
+ 0600). To open the UI from the container, start the host daemon with `revdeck daemon start --host
111
+ 0.0.0.0` and use `host.docker.internal`; otherwise open the UI on the host.
69
112
 
70
- The daemon runs on the host, the agent in a container. Options in decreasing order of convenience:
113
+ Fallbacks:
71
114
 
72
- 1. Mount `$XDG_RUNTIME_DIR/revdeck` into the container at the same path — the socket works as is.
73
- 2. `REVDECK_URL=http://host.docker.internal:<port>` and `REVDECK_TOKEN=<token>` — the HTTP transport.
74
- The port and token are printed by `revdeck daemon start` (or in `daemon.json` in the state
75
- directory).
76
- 3. `revdeck export <N>` on the host and `revdeck import <N>` in the container — a file bridge.
115
+ 1. `REVDECK_URL=http://host.docker.internal:<port>` and `REVDECK_TOKEN=<token>` — the HTTP transport,
116
+ with the daemon started on the host with `--host 0.0.0.0`.
117
+ 2. `revdeck export <N>` on the host and `revdeck import <N>` in the container — a file bridge.
77
118
 
78
119
  ## Verification
79
120
 
@@ -81,4 +122,5 @@ The daemon runs on the host, the agent in a container. Options in decreasing ord
81
122
  revdeck doctor
82
123
  ```
83
124
 
84
- Shows the binaries found, `glab`/`gh` authorization, daemon status and the installed adapter.
125
+ Shows the binaries found, `glab`/`gh` authorization, daemon status and the installed adapter. In a
126
+ devcontainer it checks the host daemon instead of looking for `glab`/`gh` inside.
package/docs/protocol.md CHANGED
@@ -6,9 +6,12 @@
6
6
 
7
7
  1. **Unix socket** (primary): `$XDG_RUNTIME_DIR/revdeck/daemon.sock`, directory 0700, socket 0600.
8
8
  JSON lines, one request/response per line.
9
- 2. **HTTP**: `POST /api/rpc` on loopback with a cookie session. Needed for containers where the socket
9
+ 2. **Devcontainer bridge socket**: `~/.local/state/revdeck/devcontainer/run/daemon.sock`, the same
10
+ protocol on a stable home-based path. The daemon serves it in addition to the primary socket and
11
+ writes a copy of `daemon.json` to `~/.local/state/revdeck/devcontainer/state/`.
12
+ 3. **HTTP**: `POST /api/rpc` on loopback with a cookie session. Needed for containers where the socket
10
13
  is not forwarded (`REVDECK_URL` + `REVDECK_TOKEN`).
11
- 3. **UI HTTP**: `/api/*` and SSE `/api/events` for the browser.
14
+ 4. **UI HTTP**: `/api/*` and SSE `/api/events` for the browser.
12
15
 
13
16
  ## Messages
14
17
 
@@ -51,6 +54,9 @@ authorization is enforced by the socket file's permissions.
51
54
  | `decisions.put` | `review`, `decisions` | human decisions |
52
55
  | `notes.add` | `review`, `file`, `line`, `text`, `toAgent` | line comment |
53
56
  | `notes.update` | `review`, `noteId`, `patch` | updated comment |
57
+ | `reactions.list` | `review`, `noteIds[]` | reactions grouped by comment id |
58
+ | `reactions.toggle` | `review`, `noteId`, `emoji` | `active`, fresh reactions |
59
+ | `attachments.upload` | `review`, `name`, `contentType`, `data` (base64) | `name`, absolute `url`, `markdown` |
54
60
  | `notes.delete` | `review`, `noteId` | `{ok}` |
55
61
  | `publish.preview` | `review`, `kind`, `ids[]` | plan + warnings |
56
62
  | `publish.approve` | `review`, `kind`, `ids[]`, `hash` | `approvalId`, `expiresAt` |
@@ -86,6 +92,9 @@ in the CLI with `--yes`.
86
92
  | POST | `/api/reviews/open`, `/api/reviews/refresh` | open/refresh |
87
93
  | POST | `/api/drafts`, `/api/findings`, `/api/summary`, `/api/decisions` | drafts |
88
94
  | POST | `/api/notes` | `action: add/update/delete` |
95
+ | GET | `/api/reactions?review=&notes=` | reactions for comment ids |
96
+ | POST | `/api/reactions` | toggle a reaction |
97
+ | POST | `/api/attachments` | upload an image/video and return an absolute link |
89
98
  | POST | `/api/publish/preview`, `/approve`, `/commit` | publishing |
90
99
  | POST | `/api/checks` | checks |
91
100
  | POST | `/api/rpc` | RPC proxy for the HTTP transport |
@@ -47,7 +47,9 @@ GitHub, конфигурируемые правила проекта и уста
47
47
  зависшего сокета. Клиент умеет поднять демон сам.
48
48
  - Права на сокет — часть модели безопасности: каталог 0700, сокет 0600.
49
49
  - В контейнере нужен либо смонтированный сокет, либо `REVDECK_URL`/`REVDECK_TOKEN`; иначе —
50
- `export`/`import` и запуск на хосте.
50
+ `export`/`import` и запуск на хосте. `revdeck devcontainer --write` монтирует стабильный сокет моста из
51
+ `~/.local/state/revdeck/devcontainer/run` и ставит `REVDECK_DEV_CONTAINER=1`, поэтому контейнер не
52
+ запускает свой демон.
51
53
  - Один демон обслуживает несколько репозиториев: `root` передаётся при `open`, конфиг читается из
52
54
  этого корня.
53
55
  - Версии клиента и демона должны совпадать; добавлен `PROTOCOL_VERSION`.
@@ -34,6 +34,7 @@ agent (MCP/CLI) ──▶ revdeck daemon ──glab/gh──▶ GitLab/GitHub
34
34
  - `src/daemon/store.ts` — SQLite (`node:sqlite`): ревью, снимок diff/тредов, черновики, замечания,
35
35
  решения, комментарии, approvals, аудит.
36
36
  - `src/daemon/rpc.ts` — JSON-RPC поверх unix-сокета (0600) для CLI и MCP.
37
+ - `src/daemon/bridge.ts` — дополнительный RPC-сокет в стабильном домашнем каталоге для devcontainer.
37
38
  - `src/daemon/http.ts` — UI и `/api/*`, SSE-события, cookie-сессия с одноразовым токеном.
38
39
  - `src/cli` — команды, `init`, `doctor`, экспорт/импорт старого файлового формата.
39
40
  - `src/mcp` — MCP-сервер: инструменты и промпты, тонкая обёртка над RPC.
@@ -77,7 +78,8 @@ agent (MCP/CLI) ──▶ revdeck daemon ──glab/gh──▶ GitLab/GitHub
77
78
 
78
79
  - **Новая платформа**: реализовать `Provider` и добавить ветку в `createProvider`; всё остальное не
79
80
  меняется.
80
- - **Новый харнесс**: `revdeck init --adapters <имя>` копирует skill и пишет MCP-конфиг. Для
81
+ - **Новый харнесс**: `revdeck init --adapters <имя>` пишет MCP-конфиг или файл команды и ссылается на
82
+ канонический skill `.agents/skills/revdeck`. Для
81
83
  харнессов без MCP используется CLI.
82
84
  - **Правила**: `rules.map`/`rules.sources` в `.revdeck.yml`; паки правил можно распространять как
83
85
  обычный файл конфигурации.
@@ -110,6 +110,8 @@ publish:
110
110
  | `REVDECK_STATE_DIR` | каталог состояния (по умолчанию `~/.local/state/revdeck`) |
111
111
  | `REVDECK_RUNTIME_DIR` | каталог сокета (по умолчанию `$XDG_RUNTIME_DIR/revdeck`) |
112
112
  | `REVDECK_URL` + `REVDECK_TOKEN` | подключение к демону по HTTP (контейнер/проброс порта) |
113
+ | `REVDECK_DEV_CONTAINER=1` | не запускать локальный демон, а подсказать про демон хоста |
114
+ | `REVDECK_UI_HOST` | хост для `revdeck ui` из контейнера (например, `host.docker.internal`) |
113
115
  | `REVDECK_ROOT` | корень проекта для MCP-сервера |
114
116
  | `REVDECK_LANG` | язык CLI/MCP/демона: `ru` или `en` (по умолчанию системная локаль) |
115
117